Reformatted the source code using the 'Black' utility. eric7

Wed, 13 Jul 2022 14:55:47 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 13 Jul 2022 14:55:47 +0200
branch
eric7
changeset 9221
bf71ee032bb4
parent 9220
e9e7eca7efee
child 9222
e384c0e986be

Reformatted the source code using the 'Black' utility.

eric7.epj file | annotate | diff | comparison | revisions
scripts/cleanupSource.py file | annotate | diff | comparison | revisions
scripts/compileUiFiles.py file | annotate | diff | comparison | revisions
scripts/create_windows_links.py file | annotate | diff | comparison | revisions
scripts/install-debugclients.py file | annotate | diff | comparison | revisions
scripts/install-dependencies.py file | annotate | diff | comparison | revisions
scripts/install-i18n.py file | annotate | diff | comparison | revisions
scripts/install.py file | annotate | diff | comparison | revisions
scripts/uninstall-debugclients.py file | annotate | diff | comparison | revisions
scripts/uninstall.py file | annotate | diff | comparison | revisions
src/eric7/CodeFormatting/BlackConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/CodeFormatting/BlackDiffWidget.py file | annotate | diff | comparison | revisions
src/eric7/CodeFormatting/BlackFormattingAction.py file | annotate | diff | comparison | revisions
src/eric7/CodeFormatting/BlackFormattingDialog.py file | annotate | diff | comparison | revisions
src/eric7/CodeFormatting/BlackUtilities.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/Conda.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaExecDialog.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaExportDialog.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaNewEnvironmentDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaPackageDetailsWidget.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/CondaPackagesWidget.py file | annotate | diff | comparison | revisions
src/eric7/CondaInterface/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Cooperation/ChatWidget.py file | annotate | diff | comparison | revisions
src/eric7/Cooperation/Connection.py file | annotate | diff | comparison | revisions
src/eric7/Cooperation/CooperationClient.py file | annotate | diff | comparison | revisions
src/eric7/Cooperation/CooperationServer.py file | annotate | diff | comparison | revisions
src/eric7/CycloneDXInterface/CycloneDXConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/CycloneDXInterface/CycloneDXMetaDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/CycloneDXInterface/CycloneDXUtilities.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/CodeMetrics.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/CodeMetricsDialog.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/PyCoverageDialog.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/PyCoverageHtmlReportDialog.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/PyCoverageJsonReportDialog.py file | annotate | diff | comparison | revisions
src/eric7/DataViews/PyProfileDialog.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/AsyncFile.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/BreakpointWatch.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugBase.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugClient.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugClientBase.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugClientCapabilities.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugConfig.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugUtilities.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/DebugVariables.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/FlexCompleter.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/ModuleLoader.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/MultiProcessDebugExtension.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/MultiprocessingExtension.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/PyProfile.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/QProcessExtension.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/SubprocessExtension.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/ThreadExtension.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/eric7dbgstub.py file | annotate | diff | comparison | revisions
src/eric7/DebugClients/Python/getpass.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/BreakPointModel.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/BreakPointViewer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/CallStackViewer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/CallTraceViewer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/Config.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebugClientCapabilities.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebugServer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebugUI.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebugViewer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebuggerInterfaceNone.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/DebuggerInterfacePython.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/EditBreakpointDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/EditWatchpointDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/ExceptionLogger.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/ExceptionsFilterDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/StartDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/StartHistoryEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/VariableDetailDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/VariablesFilterDialog.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/VariablesViewer.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/WatchPointModel.py file | annotate | diff | comparison | revisions
src/eric7/Debugger/WatchPointViewer.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/APIGenerator.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/Config.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/IndexGenerator.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/ModuleDocumentor.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/QtHelpGenerator.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/TemplatesListsStyleCSS.py file | annotate | diff | comparison | revisions
src/eric7/DocumentationTools/__init__.py file | annotate | diff | comparison | revisions
src/eric7/EricCore/EricTreeSortFilterProxyModel.py file | annotate | diff | comparison | revisions
src/eric7/EricGraphics/EricArrowItem.py file | annotate | diff | comparison | revisions
src/eric7/EricGraphics/EricGraphicsView.py file | annotate | diff | comparison | revisions
src/eric7/EricGui/EricAction.py file | annotate | diff | comparison | revisions
src/eric7/EricGui/EricGenericDiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/EricGui/EricOverrideCursor.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricFtp.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricGoogleMail.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricGoogleMailHelpers.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricJsonClient.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricJsonServer.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricJsonStreamReader.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricJsonStreamWriter.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricNetworkIcon.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricNetworkProxyFactory.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricNetworkUtilities.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslCertificateSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslCertificatesDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslCertificatesInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslCertificatesInfoWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslErrorHandler.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslInfoWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricSslUtilities.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricTldExtractor.py file | annotate | diff | comparison | revisions
src/eric7/EricNetwork/EricUrlInfo.py file | annotate | diff | comparison | revisions
src/eric7/EricUtilities/EricCache.py file | annotate | diff | comparison | revisions
src/eric7/EricUtilities/EricMutexLocker.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricAnimatedLabel.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricAnimatedWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricApplication.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricClickableLabel.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricComboSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricCompleters.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricDirFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricErrorMessage.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricErrorMessageFilterDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricFileSaveConfirmDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricIconBar.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricLed.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricLineEdit.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricLineEditButton.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricListSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricListView.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricMainWindow.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricMapWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricMessageBox.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricModelMenu.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricModelToolBar.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricPassivePopup.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricPasswordMeter.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricPathPicker.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricPathPickerDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricPlainTextDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricProcessDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricProgressDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricSideBar.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricSimpleHelpDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricSingleApplication.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricSpellCheckedTextEdit.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricSqueezeLabels.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricStringListEditWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTabWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTableView.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTextEditSearchWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTextInputDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTextSpinBox.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricToolBarDialog.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricToolBarManager.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricToolBox.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricToolButton.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTreeView.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricTreeWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricWidgets/EricZoomWidget.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/DebuggerPropertiesReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/HighlightingStylesReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/MultiProjectReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/PluginRepositoryReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/ProjectReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/SessionReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/ShortcutsReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/SpellCheckDictionariesReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/TasksReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/TemplatesReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/UserProjectReader.py file | annotate | diff | comparison | revisions
src/eric7/EricXML/XMLStreamReaderBase.py file | annotate | diff | comparison | revisions
src/eric7/Globals/AppInfo.py file | annotate | diff | comparison | revisions
src/eric7/Globals/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/ApplicationDiagramBuilder.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/AssociationItem.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/ClassItem.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/GraphicsUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/ImportsDiagramBuilder.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/ModuleItem.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/PackageDiagramBuilder.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/PackageItem.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/PixmapDiagram.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/SvgDiagram.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLClassDiagramBuilder.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLDiagramBuilder.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLDialog.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLGraphicsView.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLItem.py file | annotate | diff | comparison | revisions
src/eric7/Graphics/UMLSceneSizeDialog.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpBookmarkPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpBookmarksImportDialog.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpBookmarksWidget.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpViewerImpl.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpViewerImplQTB.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpViewerImplQWE.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/HelpViewerWidget.py file | annotate | diff | comparison | revisions
src/eric7/HelpViewer/OpenPagesWidget.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditChunks.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditGotoWidget.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditMainWindow.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditSearchReplaceWidget.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditUndoStack.py file | annotate | diff | comparison | revisions
src/eric7/HexEdit/HexEditWidget.py file | annotate | diff | comparison | revisions
src/eric7/IconEditor/IconEditorGrid.py file | annotate | diff | comparison | revisions
src/eric7/IconEditor/IconEditorPalette.py file | annotate | diff | comparison | revisions
src/eric7/IconEditor/IconEditorWindow.py file | annotate | diff | comparison | revisions
src/eric7/IconEditor/IconSizeDialog.py file | annotate | diff | comparison | revisions
src/eric7/JediInterface/AssistantJedi.py file | annotate | diff | comparison | revisions
src/eric7/JediInterface/JediClient.py file | annotate | diff | comparison | revisions
src/eric7/JediInterface/JediServer.py file | annotate | diff | comparison | revisions
src/eric7/JediInterface/RefactoringPreviewDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/AddEditDevicesDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/BoardDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/CircuitPythonDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/ConnectionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/EspBackupRestoreFirmwareDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/EspDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/EspFirmwareSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/GenericMicroPythonDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/IgnoredDevicesDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonCommandsInterface.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonFileManager.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonFileManagerWidget.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonFileSystemUtilities.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonGraphWidget.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonProgressInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonSerialPort.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonWidget.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicrobitDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/PyBoardDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/RP2040Devices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/UF2FlashDialog.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/UnknownDevicesDialog.py file | annotate | diff | comparison | revisions
src/eric7/MultiProject/AddProjectDialog.py file | annotate | diff | comparison | revisions
src/eric7/MultiProject/MultiProject.py file | annotate | diff | comparison | revisions
src/eric7/MultiProject/MultiProjectBrowser.py file | annotate | diff | comparison | revisions
src/eric7/MultiProject/MultiProjectFile.py file | annotate | diff | comparison | revisions
src/eric7/MultiProject/PropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcChannelEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcChannelWidget.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcIdentitiesEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcMessageEdit.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcNetworkEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcNetworkListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcNetworkManager.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcNetworkWidget.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcServerEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Network/IRC/IrcWidget.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/Pip.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipFileSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipFreezeDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipLicensesDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipPackageDetailsDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipPackagesInputDialog.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipPackagesWidget.py file | annotate | diff | comparison | revisions
src/eric7/PipInterface/PipVulnerabilityChecker.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginDetailsDialog.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginExceptions.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginInstallDialog.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginManager.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginRepositoryDialog.py file | annotate | diff | comparison | revisions
src/eric7/PluginManager/PluginUninstallDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/AboutPlugin/AboutDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsCheckerDefaults.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsEnums.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFunctionVisitor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFutureVisitor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCodeSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleStatisticsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/ComplexityChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/DocStyleChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportNode.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsEnums.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/LocalImportVisitor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousDefaults.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/NamingStyleChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/PathlibChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/assert.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListImports.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/certificateValidation.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoSqlInjection.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/flaskDebug.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalFilePermissions.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedTmp.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionParamiko.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionSql.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionWildcard.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureHashlibNew.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureSslTls.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/jinja2Templates.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/makoTemplates.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/sshNoHostKeyVerification.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/tryExcept.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/yamlLoad.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityNodeVisitor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyNodeVisitor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsCheckSyntax.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsonCheckSyntax.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/tomlCheckSyntax.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/CheckerPlugins/SyntaxChecker/yamlCheckSyntax.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginAbout.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginCodeStyleChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginEricapi.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginEricdoc.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginSyntaxChecker.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginTranslator.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVcsGit.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVcsMercurial.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVcsPySvn.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVcsSubversion.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVmListspace.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginVmTabview.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardDotDesktop.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardEricMessageBox.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardEricPlugin.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardPyRegExp.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQColorDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQFontDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQInputDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQMessageBox.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardQRegularExpression.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/PluginWizardSetup.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/Translator.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorLanguagesDb.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/UiExtensionPlugins/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/Config.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitAddRemoteDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitApplyBundleDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitArchiveDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectLogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectStartDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBlameDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchPushDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitBundleDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitChangeRemoteUrlDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitCherryPickDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitCommandDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitCommitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitCopyDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDescribeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffParser.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitFetchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitLogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitMergeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitNewProjectOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchStatisticsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitPullDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitPushDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitReflogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteCredentialsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteRepositoriesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionsSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitStashBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitStashDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesDeinitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesStatusDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSummaryOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSyncDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesUpdateOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitTagBranchListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitTagDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitUserConfigDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/GitUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsGit/git.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/Config.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignaturesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/gpg.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAddSubrepositoryDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAnnotateDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgArchiveDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBackoutDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkRenameDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksInOutDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBranchInputDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBundleDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClient.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClientPromptDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommandDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgConflictsListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCopyDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffGenerator.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExportDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtension.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgGraftDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgImportDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgMergeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgNewProjectOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgPhaseDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRemoveSubrepositoriesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRepoConfigDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionsSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgServeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgSummaryDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostFingerprintDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostMinimumProtocolDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditCommitEditor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditEditor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditPlanEditor.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfConvertDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfRevisionsInputDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/HgPurgeListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/purge.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesDefineGuardsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesFoldDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesGuardsSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesHeaderDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListAllGuardsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListGuardsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesNewPatchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesRenamePatchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/HgRebaseDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/rebase.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelvesSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgUnshelveDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/HgStripDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/strip.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsMercurial/hg.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/Config.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/SubversionPage.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommandDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnConst.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCopyDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialogMixin.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLoginDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnMergeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnNewProjectOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropDelDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropSetDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRelocateDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRevisionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnSwitchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUrlSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsPySvn/subversion.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/Config.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/SubversionPage.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnBlameDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnChangeListsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommandDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCopyDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnLogBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnMergeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnNewProjectOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropSetDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRelocateDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRepoBrowserDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRevisionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnSwitchDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagBranchListDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUrlSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/VcsPlugins/vcsSubversion/subversion.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/ViewManagerPlugins/Listspace/Listspace.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/ViewManagerPlugins/Listspace/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/ViewManagerPlugins/Tabview/Tabview.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/ViewManagerPlugins/Tabview/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/ViewManagerPlugins/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopListSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/EricMessageBoxWizard/EricMessageBoxWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/EricPluginWizard/PluginWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/EricPluginWizard/Templates.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/MessageBoxWizard/MessageBoxWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardRepeatDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardRepeatDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardServer.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/SetupWizard/AddEntryPointDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/SetupWizard/AddProjectUrlDialog.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/SetupWizard/SetupCfgUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ApplicationPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/CondaPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ConfigurationPageBase.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/CooperationPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/CorbaPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/DebuggerGeneralPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/DebuggerPython3Page.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/DiffColoursPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorAPIsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorAutoCompletionJediPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorAutocompletionPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorAutocompletionQScintillaPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorCallTipsJediPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorCalltipsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorCalltipsQScintillaPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorDocViewerPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorExportersPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorFilePage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorGeneralPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorHighlightersPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerJediPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorPropertiesPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorSearchPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorSpellCheckingPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorStylesPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorSyntaxPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/EmailPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/GraphicsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/HelpDocumentationPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/HelpViewersPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/HexEditorPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/IconsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/IconsPreviewDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/InterfaceLightPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/InterfacePage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/IrcPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/LogViewerPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/MasterPasswordEntryDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/MicroPythonPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/MimeTypesPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/MultiProjectPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/NetworkPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/NotificationsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/PipPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/PluginManagerPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/PrinterPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ProjectPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ProtobufPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/PythonPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/QtPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/SecurityPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ShellPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/TasksPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/TemplatesPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/TrayStarterPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/VcsPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/ViewmanagerPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/WebBrowserAppearancePage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/WebBrowserPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/HighlightingStylesFile.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/MouseClickDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/PreferencesLexer.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ProgramsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ShortcutDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/Shortcuts.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ShortcutsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ShortcutsFile.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/SubstyleDefinitionDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ThemeManager.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ToolConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ToolGroupConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/ViewProfileDialog.py file | annotate | diff | comparison | revisions
src/eric7/Preferences/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Project/AddDirectoryDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/AddFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/AddFoundFilesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/AddLanguageDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/CreateDialogCodeDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/DebuggerPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/DebuggerPropertiesFile.py file | annotate | diff | comparison | revisions
src/eric7/Project/FiletypeAssociationDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/IdlCompilerDefineNameDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/IdlCompilerOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/LexerAssociationDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/MakePropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/NewDialogClassDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/NewPythonPackageDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/Project.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBaseBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowserFlags.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowserModel.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectBrowserSortFilterProxyModel.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectFile.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectFormsBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectInterfacesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectOthersBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectProtocolsBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectResourcesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectSourcesBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/ProjectTranslationsBrowser.py file | annotate | diff | comparison | revisions
src/eric7/Project/PropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/QuickFindFileDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/RccCompilerOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/SpellingPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/TranslationPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/UicCompilerOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/Project/UicLoadUi5.py file | annotate | diff | comparison | revisions
src/eric7/Project/UicLoadUi6.py file | annotate | diff | comparison | revisions
src/eric7/Project/UserProjectFile.py file | annotate | diff | comparison | revisions
src/eric7/Project/UserPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/APIsManager.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/BaseDocstringGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/EricdocGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/GoogledocGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/NumpydocGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/PyDocstringGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/SphinxdocGenerator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/DocstringGenerator/__init__.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Editor.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorAssembly.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorButtonsWidget.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorMarkerMap.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorOutline.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorOutlineModel.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/EditorOutlineSizesDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterBase.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterHTML.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterODT.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterPDF.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterRTF.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/ExporterTEX.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Exporters/__init__.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/GotoDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/KeySequenceTranslator.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/Lexer.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerBash.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerBatch.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerCMake.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerCPP.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerCSS.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerCSharp.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerCoffeeScript.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerContainer.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerD.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerDiff.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerFortran.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerFortran77.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerHTML.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerIDL.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerJSON.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerJava.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerJavaScript.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerLua.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerMakefile.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerMarkdown.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerMatlab.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerOctave.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPO.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPOV.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPascal.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPerl.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPostScript.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerProperties.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPygments.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerPython.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerQSS.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerRuby.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerSQL.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerTCL.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerTeX.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerVHDL.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerXML.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/LexerYAML.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/SubstyledLexer.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Lexers/__init__.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/HtmlProvider.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/HyperlinkMarkupDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/ImageMarkupDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/MarkdownProvider.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/MarkupBase.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/RestructuredTextProvider.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MarkupProviders/__init__.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/MiniEditor.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Printer.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/QsciScintillaCompat.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/SearchReplaceWidget.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/Shell.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/ShellHistoryDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/ShellWindow.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/SortOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/SpellChecker.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/SpellCheckingDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/SpellingDictionaryEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/CompleterBase.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/CompleterPython.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/CompleterRuby.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/CompleterYaml.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/TypingCompleters/__init__.py file | annotate | diff | comparison | revisions
src/eric7/QScintilla/ZoomDialog.py file | annotate | diff | comparison | revisions
src/eric7/Sessions/SessionFile.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapWidget.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotDefaultGrabber.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotFreehandGrabber.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotModes.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotPreview.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotRegionGrabber.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotTimer.py file | annotate | diff | comparison | revisions
src/eric7/Snapshot/SnapshotWaylandGrabber.py file | annotate | diff | comparison | revisions
src/eric7/SqlBrowser/SqlBrowser.py file | annotate | diff | comparison | revisions
src/eric7/SqlBrowser/SqlBrowserWidget.py file | annotate | diff | comparison | revisions
src/eric7/SqlBrowser/SqlConnectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/SqlBrowser/SqlConnectionWidget.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/Task.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/TaskFilter.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/TaskFilterConfigDialog.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/TaskPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/TaskViewer.py file | annotate | diff | comparison | revisions
src/eric7/Tasks/TasksFile.py file | annotate | diff | comparison | revisions
src/eric7/Templates/TemplateMultipleVariablesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Templates/TemplatePropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/Templates/TemplateSingleVariableDialog.py file | annotate | diff | comparison | revisions
src/eric7/Templates/TemplateViewer.py file | annotate | diff | comparison | revisions
src/eric7/Templates/TemplatesFile.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/PytestExecutor.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/PytestRunner.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/TestExecutorBase.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/TestFrameworkRegistry.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/UnittestExecutor.py file | annotate | diff | comparison | revisions
src/eric7/Testing/Interfaces/UnittestRunner.py file | annotate | diff | comparison | revisions
src/eric7/Testing/TestResultsTree.py file | annotate | diff | comparison | revisions
src/eric7/Testing/TestingWidget.py file | annotate | diff | comparison | revisions
src/eric7/Testing/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Toolbox/SingleApplication.py file | annotate | diff | comparison | revisions
src/eric7/Toolbox/Startup.py file | annotate | diff | comparison | revisions
src/eric7/Tools/TRPreviewer.py file | annotate | diff | comparison | revisions
src/eric7/Tools/TRSingleApplication.py file | annotate | diff | comparison | revisions
src/eric7/Tools/TrayStarter.py file | annotate | diff | comparison | revisions
src/eric7/Tools/UIPreviewer.py file | annotate | diff | comparison | revisions
src/eric7/Tools/webBrowserSupport.py file | annotate | diff | comparison | revisions
src/eric7/UI/AuthenticationDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/Browser.py file | annotate | diff | comparison | revisions
src/eric7/UI/BrowserModel.py file | annotate | diff | comparison | revisions
src/eric7/UI/BrowserSortFilterProxyModel.py file | annotate | diff | comparison | revisions
src/eric7/UI/ClearPrivateDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/CodeDocumentationViewer.py file | annotate | diff | comparison | revisions
src/eric7/UI/CodeDocumentationViewerTemplate.py file | annotate | diff | comparison | revisions
src/eric7/UI/CompareDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/DeleteFilesConfirmationDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/DiffDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/DiffHighlighter.py file | annotate | diff | comparison | revisions
src/eric7/UI/EmailDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/ErrorLogDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/FindFileWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/FindLocationWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/Info.py file | annotate | diff | comparison | revisions
src/eric7/UI/InstallInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/LogView.py file | annotate | diff | comparison | revisions
src/eric7/UI/NotificationWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/NumbersWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/PixmapCache.py file | annotate | diff | comparison | revisions
src/eric7/UI/Previewer.py file | annotate | diff | comparison | revisions
src/eric7/UI/Previewers/MarkdownExtensions.py file | annotate | diff | comparison | revisions
src/eric7/UI/Previewers/PreviewerHTML.py file | annotate | diff | comparison | revisions
src/eric7/UI/Previewers/PreviewerQSS.py file | annotate | diff | comparison | revisions
src/eric7/UI/PythonAstViewer.py file | annotate | diff | comparison | revisions
src/eric7/UI/PythonDisViewer.py file | annotate | diff | comparison | revisions
src/eric7/UI/SearchWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/SplashScreen.py file | annotate | diff | comparison | revisions
src/eric7/UI/SymbolsWidget.py file | annotate | diff | comparison | revisions
src/eric7/UI/UserInterface.py file | annotate | diff | comparison | revisions
src/eric7/UI/VersionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/UI/upgrader.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/AutoSaver.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/BackgroundClient.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/BackgroundService.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/ClbrBaseClasses.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/idlclbr.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/jsclbr.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/protoclbr.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/pyclbr.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ClassBrowsers/rbclbr.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/FtpUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/GetSysPath.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/MimeTypes.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/ModuleParser.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/MouseUtilities.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/PasswordChecker.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/PySideImporter.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/crypto/__init__.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/crypto/py3AES.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/crypto/py3PBKDF2.py file | annotate | diff | comparison | revisions
src/eric7/Utilities/uic.py file | annotate | diff | comparison | revisions
src/eric7/VCS/CommandOptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/VCS/ProjectBrowserHelper.py file | annotate | diff | comparison | revisions
src/eric7/VCS/ProjectHelper.py file | annotate | diff | comparison | revisions
src/eric7/VCS/RepositoryInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/VCS/StatusMonitorLed.py file | annotate | diff | comparison | revisions
src/eric7/VCS/StatusMonitorThread.py file | annotate | diff | comparison | revisions
src/eric7/VCS/StatusWidget.py file | annotate | diff | comparison | revisions
src/eric7/VCS/VersionControl.py file | annotate | diff | comparison | revisions
src/eric7/VCS/__init__.py file | annotate | diff | comparison | revisions
src/eric7/ViewManager/BookmarkedFilesDialog.py file | annotate | diff | comparison | revisions
src/eric7/ViewManager/ViewManager.py file | annotate | diff | comparison | revisions
src/eric7/ViewManager/__init__.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvAddEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvExecDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvManager.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvManagerWidgets.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvNameDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvUpgradeConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/VirtualEnv/VirtualenvUpgradeExecDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockExceptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockIcon.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockRule.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockSearchTree.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockSubscription.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockTreeWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AdBlock/AdBlockUrlInterceptor.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AutoScroll/AutoScroller.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/AutoScroll/FrameScroller.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/AddBookmarkDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarkNode.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarkPropertiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImportDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/BookmarksImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/ChromeImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/FirefoxImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/HtmlImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/IExplorerImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/OperaImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/SafariImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/XbelImporter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksImporters/__init__.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksMenu.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/BookmarksToolBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/NsHtmlReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/NsHtmlWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/XbelReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Bookmarks/XbelWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/ClosedTabsManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/CookieJar/CookieExceptionsModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/CookieJar/CookieJar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/CookieJar/CookiesConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/CookieJar/CookiesDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/CookieJar/CookiesExceptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadAskActionDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadItem.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadManagerButton.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Download/DownloadUtilities.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Feeds/FeedEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Feeds/FeedsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Feeds/FeedsManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyAddScriptDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationScriptInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyJsObject.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryCompleter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryFilterModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryMenu.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/History/HistoryTreeModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/ImageSearch/ImageSearchEngine.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/JavaScript/ExternalJsObject.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/JavaScript/PasswordManagerJsObject.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/JavaScript/StartPageJsObject.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Navigation/NavigationBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Navigation/NavigationContainer.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Navigation/ReloadStopButton.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/EricSchemeHandler.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/NetworkManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/ProtocolHandlerManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/ProtocolHandlerManagerDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/QtHelpSchemeHandler.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/SendRefererWhitelistDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/SslErrorExceptionsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Network/UrlInterceptor.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchEditDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchEngine.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchEngineAction.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchEngineModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/OpenSearch/OpenSearchWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/PageScreenDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/LoginForm.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/PasswordManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/PasswordModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/PasswordReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/PasswordWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Passwords/PasswordsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/PersonalInformationManager/PersonalDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/PersonalInformationManager/PersonalInformationManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/HelpDocsInstaller.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/HelpIndexWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/HelpSearchWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/HelpTocWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/HelpTopicDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/QtHelpDocumentationConfigurationDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettings.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettingsWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingAPIClient.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingCache.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingInfoWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingLabel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingThreatList.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingUrl.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SafeBrowsing/__init__.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SearchWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Session/SessionManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Session/SessionManagerDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SiteInfo/SiteInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SiteInfo/SiteInfoWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpeedDial/Page.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpeedDial/PageThumbnailer.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpeedDial/SpeedDial.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpeedDial/SpeedDialReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpeedDial/SpeedDialWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/SpellCheck/ManageDictionariesDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/StatusBar/ImagesIcon.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/StatusBar/JavaScriptIcon.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/StatusBar/JavaScriptSettingsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/StatusBar/StatusBarIcon.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/DirectorySyncHandler.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/FtpSyncHandler.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncAssistantDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncCheckPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncDataPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncDirectorySettingsPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncEncryptionPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncFtpSettingsPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncHandler.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncHostTypePage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Sync/SyncManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/TabManager/TabManagerWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/DelayedFileWatcher.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/PrintToPdfDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/Scripts.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/WebBrowserTools.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/WebHitTestResult.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/WebIconDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/WebIconLoader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/Tools/WebIconProvider.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/BookmarkActionSelectionDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/BookmarkInfoDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/FavIconLabel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/SslLabel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/StackedUrlBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UrlBar/UrlBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentMenu.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentModel.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentReader.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentWriter.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/UserAgent/UserAgentsDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/VirusTotal/VirusTotalApi.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/VirusTotal/VirusTotalDomainReportDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/VirusTotal/VirusTotalIpReportDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/VirusTotal/VirusTotalWhoisDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserClearPrivateDataDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserJavaScriptConsole.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserLanguagesDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserSingleApplication.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserSnap.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserTabBar.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserTabWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserWebSearchWidget.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/WebInspector.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/ZoomManager/ZoomManager.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/ZoomManager/ZoomValuesDialog.py file | annotate | diff | comparison | revisions
src/eric7/WebBrowser/ZoomManager/ZoomValuesModel.py file | annotate | diff | comparison | revisions
src/eric7/__main__.py file | annotate | diff | comparison | revisions
src/eric7/eric7.py file | annotate | diff | comparison | revisions
src/eric7/eric7_api.py file | annotate | diff | comparison | revisions
src/eric7/eric7_browser.py file | annotate | diff | comparison | revisions
src/eric7/eric7_compare.py file | annotate | diff | comparison | revisions
src/eric7/eric7_configure.py file | annotate | diff | comparison | revisions
src/eric7/eric7_diff.py file | annotate | diff | comparison | revisions
src/eric7/eric7_doc.py file | annotate | diff | comparison | revisions
src/eric7/eric7_editor.py file | annotate | diff | comparison | revisions
src/eric7/eric7_hexeditor.py file | annotate | diff | comparison | revisions
src/eric7/eric7_iconeditor.py file | annotate | diff | comparison | revisions
src/eric7/eric7_plugininstall.py file | annotate | diff | comparison | revisions
src/eric7/eric7_pluginrepository.py file | annotate | diff | comparison | revisions
src/eric7/eric7_pluginuninstall.py file | annotate | diff | comparison | revisions
src/eric7/eric7_post_install.py file | annotate | diff | comparison | revisions
src/eric7/eric7_qregularexpression.py file | annotate | diff | comparison | revisions
src/eric7/eric7_re.py file | annotate | diff | comparison | revisions
src/eric7/eric7_shell.py file | annotate | diff | comparison | revisions
src/eric7/eric7_snap.py file | annotate | diff | comparison | revisions
src/eric7/eric7_sqlbrowser.py file | annotate | diff | comparison | revisions
src/eric7/eric7_testing.py file | annotate | diff | comparison | revisions
src/eric7/eric7_tray.py file | annotate | diff | comparison | revisions
src/eric7/eric7_trpreviewer.py file | annotate | diff | comparison | revisions
src/eric7/eric7_uipreviewer.py file | annotate | diff | comparison | revisions
src/eric7/eric7_virtualenv.py file | annotate | diff | comparison | revisions
src/eric7/eric7config.py file | annotate | diff | comparison | revisions
--- a/eric7.epj	Wed Jul 13 11:16:20 2022 +0200
+++ b/eric7.epj	Wed Jul 13 14:55:47 2022 +0200
@@ -59,7 +59,7 @@
         },
         "CopyrightAuthor": "",
         "CopyrightMinFileSize": 0,
-        "DocstringType": "eric",
+        "DocstringType": "eric_black",
         "EnabledCheckerCategories": "C, D, E, M, N, Y, W",
         "ExcludeFiles": "*/ThirdParty/*, */coverage/*, */Ui_*.py, */Examples/*, */pycodestyle.py,*/pyflakes/checker.py,*/mccabe.py,*/eradicate.py,*/ast_unparse.py,*/piplicenses.py,*/pipdeptree.py",
         "ExcludeMessages": "C101,E203,E265,E266,E305,E402,M201,M301,M302,M303,M304,M305,M306,M307,M308,M311,M312,M313,M314,M315,M321,M701,M702,M811,M834,N802,N803,N807,N808,N821,W293,W503,Y119,Y401,Y402",
@@ -970,7 +970,7 @@
         "line-length": 88,
         "skip-magic-trailing-comma": false,
         "skip-string-normalization": false,
-        "source": "dialog",
+        "source": "project",
         "target-version": [
           "py37",
           "py38",
--- a/scripts/cleanupSource.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/cleanupSource.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,27 +18,28 @@
     """
     Cleanup the sources directory to get rid of leftover files
     and directories.
-    
+
     @param dirName name of the directory to prune (string)
     """
     # step 1: delete all Ui_*.py files without a corresponding
     #         *.ui file
     dirListing = os.listdir(dirName)
     for formName, sourceName in [
-        (f.replace('Ui_', "").replace(".py", ".ui"), f)
-            for f in dirListing if fnmatch.fnmatch(f, "Ui_*.py")]:
+        (f.replace("Ui_", "").replace(".py", ".ui"), f)
+        for f in dirListing
+        if fnmatch.fnmatch(f, "Ui_*.py")
+    ]:
         if not os.path.exists(os.path.join(dirName, formName)):
             os.remove(os.path.join(dirName, sourceName))
             if os.path.exists(os.path.join(dirName, sourceName + "c")):
                 os.remove(os.path.join(dirName, sourceName + "c"))
-    
+
     # step 2: delete the __pycache__ directory and all remaining *.pyc files
     if os.path.exists(os.path.join(dirName, "__pycache__")):
         shutil.rmtree(os.path.join(dirName, "__pycache__"))
-    for name in [f for f in os.listdir(dirName)
-                 if fnmatch.fnmatch(f, "*.pyc")]:
+    for name in [f for f in os.listdir(dirName) if fnmatch.fnmatch(f, "*.pyc")]:
         os.remove(os.path.join(dirName, name))
-    
+
     # step 3: descent into subdirectories and delete them if empty
     for name in os.listdir(dirName):
         name = os.path.join(dirName, name)
@@ -57,8 +58,8 @@
     print("Cleaning up source ...")
     sourceDir = os.path.dirname(os.path.dirname(__file__)) or "."
     cleanupSource(sourceDir)
-    
-    
+
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
@@ -68,7 +69,8 @@
         print(
             "\nAn internal error occured.  Please report all the output of the"
             " program, \nincluding the following traceback, to"
-            " eric-bugs@eric-ide.python-projects.org.\n")
+            " eric-bugs@eric-ide.python-projects.org.\n"
+        )
         raise
 
 #
--- a/scripts/compileUiFiles.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/compileUiFiles.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,7 @@
     """
     Local function to create the Python source file name for the compiled
     .ui file.
-    
+
     @param py_dir suggested name of the directory (string)
     @param py_file suggested name for the compile source file (string)
     @return tuple of directory name (string) and source file name (string)
@@ -49,8 +49,8 @@
     # Compile .ui files
     print("Compiling user interface files...")
     compileUiFiles()
-    
-    
+
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
@@ -60,7 +60,8 @@
         print(
             "\nAn internal error occured.  Please report all the output of the"
             " program, \nincluding the following traceback, to"
-            " eric-bugs@eric-ide.python-projects.org.\n")
+            " eric-bugs@eric-ide.python-projects.org.\n"
+        )
         raise
 
 #
--- a/scripts/create_windows_links.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/create_windows_links.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,24 +19,25 @@
 def main(argv):
     """
     Create Desktop and Start Menu links.
-    
+
     @param argv list of command line arguments
     @type list of str
     """
     if sys.platform.startswith(("win", "cygwin")):
         regPath = (
-            "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" +
-            "\\User Shell Folders"
+            "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+            + "\\User Shell Folders"
         )
-        
+
         # 1. create desktop shortcuts
         regName = "Desktop"
         desktopFolder = os.path.normpath(
-            os.path.expandvars(getWinregEntry(regName, regPath)))
+            os.path.expandvars(getWinregEntry(regName, regPath))
+        )
         for linkName, targetPath, iconPath in windowsDesktopEntries():
             linkPath = os.path.join(desktopFolder, linkName)
             createWindowsShortcut(linkPath, targetPath, iconPath)
-        
+
         # 2. create start menu entry and shortcuts
         regName = "Programs"
         programsEntry = getWinregEntry(regName, regPath)
@@ -49,7 +50,7 @@
                 except OSError:
                     # maybe restrictions prohibited link creation
                     return
-            
+
             for linkName, targetPath, iconPath in windowsDesktopEntries():
                 linkPath = os.path.join(eric7EntryPath, linkName)
                 createWindowsShortcut(linkPath, targetPath, iconPath)
@@ -60,7 +61,7 @@
 def getWinregEntry(name, path):
     """
     Function to get an entry from the Windows Registry.
-    
+
     @param name variable name
     @type str
     @param path registry path of the variable
@@ -72,10 +73,9 @@
         import winreg
     except ImportError:
         return None
-    
+
     try:
-        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0,
-                                     winreg.KEY_READ)
+        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, winreg.KEY_READ)
         value, _ = winreg.QueryValueEx(registryKey, name)
         winreg.CloseKey(registryKey)
         return value
@@ -86,7 +86,7 @@
 def createWindowsShortcut(linkPath, targetPath, iconPath):
     """
     Create Windows shortcut.
-    
+
     @param linkPath path of the shortcut file
     @type str
     @param targetPath path the shortcut shall point to
@@ -96,9 +96,9 @@
     """
     from win32com.client import Dispatch
     from pywintypes import com_error
-    
+
     with contextlib.suppress(com_error):
-        shell = Dispatch('WScript.Shell')
+        shell = Dispatch("WScript.Shell")
         shortcut = shell.CreateShortCut(linkPath)
         shortcut.Targetpath = targetPath
         shortcut.WorkingDirectory = os.path.dirname(targetPath)
@@ -109,7 +109,7 @@
 def windowsDesktopNames():
     """
     Function to generate the link names for the Windows Desktop.
-    
+
     @return list of desktop link names
     @rtype list of str
     """
@@ -119,47 +119,52 @@
 def windowsDesktopEntries():
     """
     Function to generate data for the Windows Desktop links.
-    
+
     @return list of tuples containing the desktop link name,
         the link target and the icon target
     @rtype list of tuples of (str, str, str)
     """
     majorVersion, minorVersion = sys.version_info[:2]
     entriesTemplates = [
-        ("eric7 (Python {0}.{1}).lnk",
-         os.path.join(getConfig("bindir"), "eric7.cmd"),
-         os.path.join(getConfig("ericPixDir"), "eric7.ico")),
-        ("eric7 Browser (Python {0}.{1}).lnk",
-         os.path.join(getConfig("bindir"), "eric7_browser.cmd"),
-         os.path.join(getConfig("ericPixDir"), "ericWeb48.ico")),
+        (
+            "eric7 (Python {0}.{1}).lnk",
+            os.path.join(getConfig("bindir"), "eric7.cmd"),
+            os.path.join(getConfig("ericPixDir"), "eric7.ico"),
+        ),
+        (
+            "eric7 Browser (Python {0}.{1}).lnk",
+            os.path.join(getConfig("bindir"), "eric7_browser.cmd"),
+            os.path.join(getConfig("ericPixDir"), "ericWeb48.ico"),
+        ),
     ]
-    
+
     return [
-        (e[0].format(majorVersion, minorVersion), e[1], e[2])
-        for e in entriesTemplates
+        (e[0].format(majorVersion, minorVersion), e[1], e[2]) for e in entriesTemplates
     ]
 
 
 def windowsProgramsEntry():
     """
     Function to generate the name of the Start Menu top entry.
-    
+
     @return name of the Start Menu top entry
     @rtype str
     """
     majorVersion, minorVersion = sys.version_info[:2]
     return "eric7 (Python {0}.{1})".format(majorVersion, minorVersion)
-    
-    
+
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output"""
-              """ of the program,\nincluding the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output"""
+            """ of the program,\nincluding the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/scripts/install-debugclients.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/install-debugclients.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,17 +36,17 @@
 def exit(rcode=0):
     """
     Exit the install script.
-    
+
     @param rcode result code to report back (integer)
     """
     global currDir
-    
+
     if sys.platform.startswith("win"):
         with contextlib.suppress():
-            input("Press enter to continue...")         # secok
-    
+            input("Press enter to continue...")  # secok
+
     os.chdir(currDir)
-    
+
     sys.exit(rcode)
 
 
@@ -85,17 +85,17 @@
     simple assignment.
     """
     global modDir, pyModDir
-    
+
     import sysconfig
 
-    modDir = sysconfig.get_path('platlib')
+    modDir = sysconfig.get_path("platlib")
     pyModDir = modDir
 
 
 def copyTree(src, dst, filters, excludeDirs=None, excludePatterns=None):
     """
     Copy files of a directory tree.
-    
+
     @param src name of the source directory
     @param dst name of the destination directory
     @param filters list of filter pattern determining the files to be copied
@@ -112,7 +112,7 @@
     except OSError:
         # ignore missing directories
         return
-    
+
     for name in names:
         skipIt = False
         for excludePattern in excludePatterns:
@@ -131,24 +131,22 @@
                     break
             else:
                 if os.path.isdir(srcname) and srcname not in excludeDirs:
-                    copyTree(srcname, dstname, filters,
-                             excludePatterns=excludePatterns)
+                    copyTree(srcname, dstname, filters, excludePatterns=excludePatterns)
 
 
 def cleanupSource(dirName):
     """
     Cleanup the sources directory to get rid of leftover files
     and directories.
-    
+
     @param dirName name of the directory to prune (string)
     """
     # step 1: delete the __pycache__ directory and all *.pyc files
     if os.path.exists(os.path.join(dirName, "__pycache__")):
         shutil.rmtree(os.path.join(dirName, "__pycache__"))
-    for name in [f for f in os.listdir(dirName)
-                 if fnmatch.fnmatch(f, "*.pyc")]:
+    for name in [f for f in os.listdir(dirName) if fnmatch.fnmatch(f, "*.pyc")]:
         os.remove(os.path.join(dirName, name))
-    
+
     # step 2: descent into subdirectories and delete them if empty
     for name in os.listdir(dirName):
         name = os.path.join(dirName, name)
@@ -163,22 +161,21 @@
     Uninstall the old eric debug client files.
     """
     global pyModDir, installPackage
-    
+
     try:
         # Cleanup the install directories
         dirname = os.path.join(pyModDir, installPackage)
         if os.path.exists(dirname):
             shutil.rmtree(dirname, True)
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry install with admin rights.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry install with admin rights.\n".format(msg))
         exit(7)
 
 
 def shutilCopy(src, dst, perm=0o644):
     """
     Wrapper function around shutil.copy() to ensure the permissions.
-    
+
     @param src source file name (string)
     @param dst destination file name or directory name (string)
     @param perm permissions to be set (integer)
@@ -192,35 +189,35 @@
 def installEricDebugClients():
     """
     Actually perform the installation steps.
-    
+
     @return result code (integer)
     """
     global distDir, doCleanup, sourceDir, modDir
-    
+
     # set install prefix, if not None
     targetDir = (
         os.path.normpath(os.path.join(distDir, installPackage))
-        if distDir else
-        os.path.join(modDir, installPackage)
+        if distDir
+        else os.path.join(modDir, installPackage)
     )
-    
+
     try:
         # Install the files
         # copy the various parts of eric debug clients
         copyTree(
             os.path.join(eric7SourceDir, "DebugClients"),
             targetDir,
-            ['*.py', '*.pyc', '*.pyo', '*.pyw'],
-            excludePatterns=["eric7config.py*"])
-        
+            ["*.py", "*.pyc", "*.pyo", "*.pyw"],
+            excludePatterns=["eric7config.py*"],
+        )
+
         # copy the license file
         shutilCopy(os.path.join(sourceDir, "docs", "LICENSE.GPL3"), targetDir)
-        
+
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry install with admin rights.\n'.format(msg))
-        return(7)
-    
+        sys.stderr.write("Error: {0}\nTry install with admin rights.\n".format(msg))
+        return 7
+
     return 0
 
 
@@ -235,29 +232,25 @@
     # Parse the command line.
     global progName, modDir, doCleanup, doCompile, distDir
     global sourceDir, eric7SourceDir
-    
+
     if sys.version_info < (3, 7, 0) or sys.version_info >= (4, 0, 0):
-        print('Sorry, the eric debugger requires Python 3.7 or better'
-              ' for running.')
+        print("Sorry, the eric debugger requires Python 3.7 or better" " for running.")
         exit(5)
-    
+
     progName = os.path.basename(argv[0])
-    
+
     if os.path.dirname(argv[0]):
         os.chdir(os.path.dirname(argv[0]))
-    
+
     initGlobals()
 
     try:
         if sys.platform.startswith("win"):
-            optlist, args = getopt.getopt(
-                argv[1:], "chzd:", ["help"])
+            optlist, args = getopt.getopt(argv[1:], "chzd:", ["help"])
         elif sys.platform == "darwin":
-            optlist, args = getopt.getopt(
-                argv[1:], "chzd:i:", ["help"])
+            optlist, args = getopt.getopt(argv[1:], "chzd:i:", ["help"])
         else:
-            optlist, args = getopt.getopt(
-                argv[1:], "chzd:i:", ["help"])
+            optlist, args = getopt.getopt(argv[1:], "chzd:i:", ["help"])
     except getopt.GetoptError as err:
         print(err)
         usage()
@@ -273,23 +266,23 @@
             doCleanup = False
         elif opt == "-z":
             doCompile = False
-    
+
     installFromSource = not os.path.isdir(sourceDir)
     if installFromSource:
         sourceDir = os.path.abspath("..")
-    
+
     eric7SourceDir = (
         os.path.join(sourceDir, "eric7")
-        if os.path.exists(os.path.join(sourceDir, "eric7")) else
-        os.path.join(sourceDir, "src", "eric7")
+        if os.path.exists(os.path.join(sourceDir, "eric7"))
+        else os.path.join(sourceDir, "src", "eric7")
     )
-    
+
     # cleanup source if installing from source
     if installFromSource:
         print("Cleaning up source ...")
         cleanupSource(os.path.join(eric7SourceDir, "DebugClients"))
         print()
-    
+
     # cleanup old installation
     try:
         if doCleanup:
@@ -299,7 +292,7 @@
             else:
                 cleanUp()
     except OSError as msg:
-        sys.stderr.write('Error: {0}\nTry install as root.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry install as root.\n".format(msg))
         exit(7)
 
     if doCompile:
@@ -311,32 +304,36 @@
                 os.path.join(eric7SourceDir, "DebugClients"),
                 ddir=os.path.join(distDir, modDir, installPackage),
                 rx=skipRe,
-                quiet=True)
+                quiet=True,
+            )
         else:
             compileall.compile_dir(
                 os.path.join(eric7SourceDir, "DebugClients"),
                 ddir=os.path.join(modDir, installPackage),
                 rx=skipRe,
-                quiet=True)
+                quiet=True,
+            )
         sys.stdout = sys.__stdout__
     print("\nInstalling eric debug clients ...")
     res = installEricDebugClients()
-    
+
     print("\nInstallation complete.")
     print()
-    
+
     exit(res)
-    
-    
+
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output"""
-              """ of the program,\nincluding the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output"""
+            """ of the program,\nincluding the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/scripts/install-dependencies.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/install-dependencies.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,19 +16,26 @@
 def pipInstall(packageName):
     """
     Install the given package via pip.
-    
+
     @param packageName name of the package to be installed
     @type str
     @return flag indicating a successful installation
     @rtype bool
     """
     ok = False
-    exitCode = subprocess.run(                  # secok
-        [sys.executable, "-m", "pip", "install", "--prefer-binary",
-         "--upgrade", packageName]
+    exitCode = subprocess.run(  # secok
+        [
+            sys.executable,
+            "-m",
+            "pip",
+            "install",
+            "--prefer-binary",
+            "--upgrade",
+            packageName,
+        ]
     ).returncode
-    ok = (exitCode == 0)
-    
+    ok = exitCode == 0
+
     return ok
 
 
@@ -38,12 +45,10 @@
     """
     packages = (
         "wheel",
-        
         "PyQt6>=6.2.0",
         "PyQt6-Charts>=6.2.0",
         "PyQt6-WebEngine>=6.2.0",
         "PyQt6-QScintilla>=2.13.0",
-        
         "docutils",
         "Markdown",
         "pyyaml",
@@ -61,13 +66,13 @@
         "cyclonedx-bom",
         "trove-classifiers",
     )
-    
+
     failedPackages = []
     for package in packages:
         ok = pipInstall(package)
         if not ok:
             failedPackages.append(package)
-    
+
     print()
     print("Installation Summary")
     print("--------------------")
@@ -78,6 +83,7 @@
     else:
         print("All packages installed successfully.")
 
+
 if __name__ == "__main__":
     main()
 
--- a/scripts/install-i18n.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/install-i18n.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,21 +23,22 @@
     # an incomplete or old config file was found
     print("The eric IDE seems to be installed incompletely. Aborting.")
     sys.exit(1)
-    
+
 
 def getConfigDir():
     """
     Global function to get the name of the directory storing the config data.
-    
+
     @return directory name of the config dir (string)
     """
     cdn = ".eric7"
-    
+
     hp = os.path.join(os.path.expanduser("~"), cdn)
     if not os.path.exists(hp):
         os.mkdir(hp)
     return hp
-    
+
+
 # Define the globals.
 progName = None
 configDir = getConfigDir()
@@ -57,8 +58,7 @@
     print("    {0} [-hp]".format(progName))
     print("where:")
     print("    -h        display this help message")
-    print("    -p        install into the private area ({0})".format(
-        configDir))
+    print("    -p        install into the private area ({0})".format(configDir))
 
     sys.exit(rcode)
 
@@ -68,21 +68,20 @@
     Install the translation files into the right place.
     """
     global privateInstall, configDir
-    
-    targetDir = (configDir if privateInstall
-                 else getConfig('ericTranslationsDir'))
-    
+
+    targetDir = configDir if privateInstall else getConfig("ericTranslationsDir")
+
     try:
-        for fn in glob.glob(os.path.join('eric', 'src', 'eric7', 'i18n', '*.qm')):
+        for fn in glob.glob(os.path.join("eric", "src", "eric7", "i18n", "*.qm")):
             shutil.copy2(fn, targetDir)
             os.chmod(os.path.join(targetDir, os.path.basename(fn)), 0o644)
     except OSError as msg:
-        sys.stderr.write(
-            'OSError: {0}\nTry install-i18n as root.\n'.format(msg))
+        sys.stderr.write("OSError: {0}\nTry install-i18n as root.\n".format(msg))
     except OSError as msg:
         sys.stderr.write(
-            'OSError: {0}\nTry install-i18n with admin rights.\n'.format(msg))
-    
+            "OSError: {0}\nTry install-i18n with admin rights.\n".format(msg)
+        )
+
 
 def main(argv):
     """
@@ -102,24 +101,27 @@
         usage()
 
     global platBinDir
-    
+
     for opt, _arg in optlist:
         if opt == "-h":
             usage(0)
         elif opt == "-p":
             privateInstall = 1
-        
+
     installTranslations()
 
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output of"""
-              """ the program,\nincluding the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output of"""
+            """ the program,\nincluding the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/scripts/install.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/install.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,7 @@
 import re
 import shlex
 import shutil
-import subprocess               # secok
+import subprocess  # secok
 import time
 import sys
 
@@ -47,11 +47,12 @@
 progLanguages = ["Python", "Ruby", "QSS"]
 sourceDir = "eric"
 eric7SourceDir = ""
-configName = 'eric7config.py'
+configName = "eric7config.py"
 defaultMacAppBundleName = "eric7.app"
 defaultMacAppBundlePath = "/Applications"
 defaultMacPythonExe = "{0}/Resources/Python.app/Contents/MacOS/Python".format(
-    sys.exec_prefix)
+    sys.exec_prefix
+)
 if not os.path.exists(defaultMacPythonExe):
     defaultMacPythonExe = ""
 macAppBundleName = defaultMacAppBundleName
@@ -75,13 +76,11 @@
         "PyQt6": [],
         "QScintilla2": [],
     },
-    
     "linux": {
         "sip": [],
         "PyQt6": [],
         "QScintilla2": [],
     },
-    
     "mac": {
         "sip": [],
         "PyQt6": [],
@@ -93,19 +92,19 @@
 def exit(rcode=0):
     """
     Exit the install script.
-    
+
     @param rcode result code to report back (integer)
     """
     global currDir
-    
+
     print()
-    
+
     if sys.platform.startswith(("win", "cygwin")):
         with contextlib.suppress():
-            input("Press enter to continue...")             # secok
-    
+            input("Press enter to continue...")  # secok
+
     os.chdir(currDir)
-    
+
     sys.exit(rcode)
 
 
@@ -121,20 +120,23 @@
     print()
     print("Usage:")
     if sys.platform == "darwin":
-        print("    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file] [-i dir]"
-              " [-m name] [-n path] [-p python] [--help] [--no-apis]"
-              " [--no-info] [--no-tools] [--verbose] [--yes]"
-              .format(progName))
+        print(
+            "    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file] [-i dir]"
+            " [-m name] [-n path] [-p python] [--help] [--no-apis]"
+            " [--no-info] [--no-tools] [--verbose] [--yes]".format(progName)
+        )
     elif sys.platform.startswith(("win", "cygwin")):
-        print("    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file]"
-              " [--clean-desktop] [--help] [--no-apis] [--no-info]"
-              " [--no-tools] [--verbose] [--yes]"
-              .format(progName))
+        print(
+            "    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file]"
+            " [--clean-desktop] [--help] [--no-apis] [--no-info]"
+            " [--no-tools] [--verbose] [--yes]".format(progName)
+        )
     else:
-        print("    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file] [-i dir]"
-              " [--help] [--no-apis] [--no-info] [--no-tools] [--verbose]"
-              " [--yes]"
-              .format(progName))
+        print(
+            "    {0} [-chvxz] [-a dir] [-b dir] [-d dir] [-f file] [-i dir]"
+            " [--help] [--no-apis] [--no-info] [--no-tools] [--verbose]"
+            " [--yes]".format(progName)
+        )
     print("where:")
     print("    -h, --help display this help message")
     print("    -a dir     where the API files will be installed")
@@ -147,8 +149,7 @@
     print("               (default: {0})".format(platBinDir))
     print("    -d dir     where eric python files will be installed")
     print("               (default: {0})".format(modDir))
-    print("    -f file    configuration file naming the various installation"
-          " paths")
+    print("    -f file    configuration file naming the various installation" " paths")
     if not sys.platform.startswith(("win", "cygwin")):
         print("    -i dir     temporary install prefix")
         print("               (default: {0})".format(distDir))
@@ -166,21 +167,23 @@
     print("    --no-info  don't create the install info file")
     print("    --no-tools don't install qt6-applications")
     print("    -v, --verbose print some more information")
-    print("    -x         don't perform dependency checks (use on your own"
-          " risk)")
+    print("    -x         don't perform dependency checks (use on your own" " risk)")
     print("    -z         don't compile the installed python files")
     print("    --yes      answer 'yes' to all questions")
     print()
-    print("The file given to the -f option must be valid Python code"
-          " defining a")
-    print("dictionary called 'cfg' with the keys 'ericDir', 'ericPixDir',"
-          " 'ericIconDir',")
+    print("The file given to the -f option must be valid Python code" " defining a")
+    print(
+        "dictionary called 'cfg' with the keys 'ericDir', 'ericPixDir',"
+        " 'ericIconDir',"
+    )
     print("'ericDTDDir', 'ericCSSDir', 'ericStylesDir', 'ericThemesDir',")
     print(" 'ericDocDir', ericExamplesDir',")
     print("'ericTranslationsDir', 'ericTemplatesDir', 'ericCodeTemplatesDir',")
     print("'ericOthersDir','bindir', 'mdir' and 'apidir.")
-    print("These define the directories for the installation of the various"
-          " parts of eric.")
+    print(
+        "These define the directories for the installation of the various"
+        " parts of eric."
+    )
 
     exit(rcode)
 
@@ -191,9 +194,9 @@
     simple assignment.
     """
     global platBinDir, modDir, pyModDir, apisDir, platBinDirOld
-    
+
     import sysconfig
-    
+
     if sys.platform.startswith(("win", "cygwin")):
         platBinDir = sys.exec_prefix
         if platBinDir.endswith("\\"):
@@ -210,15 +213,12 @@
         else:
             # install them in the user's bin directory
             platBinDir = os.path.expanduser("~/bin")
-        if (
-            platBinDir != "/usr/local/bin" and
-            os.access("/usr/local/bin", os.W_OK)
-        ):
+        if platBinDir != "/usr/local/bin" and os.access("/usr/local/bin", os.W_OK):
             platBinDirOld = "/usr/local/bin"
 
-    modDir = sysconfig.get_path('platlib')
+    modDir = sysconfig.get_path("platlib")
     pyModDir = modDir
-    
+
     pyqtDataDir = os.path.join(modDir, "PyQt6")
     if os.path.exists(os.path.join(pyqtDataDir, "qsci")):
         # it's the installer
@@ -230,6 +230,7 @@
         # determine dynamically
         try:
             from PyQt6.QtCore import QLibraryInfo
+
             qtDataDir = QLibraryInfo.path(QLibraryInfo.LibraryPath.DataPath)
         except ImportError:
             qtDataDir = None
@@ -250,19 +251,19 @@
 def copyDesktopFile(src, dst):
     """
     Modify a desktop file and write it to its destination.
-    
+
     @param src source file name (string)
     @param dst destination file name (string)
     """
     global cfg, platBinDir
-    
+
     with open(src, "r", encoding="utf-8") as f:
         text = f.read()
-    
+
     text = text.replace("@BINDIR@", platBinDir)
     text = text.replace("@MARKER@", "")
     text = text.replace("@PY_MARKER@", "")
-    
+
     with open(dst, "w", encoding="utf-8") as f:
         f.write(text)
     os.chmod(dst, 0o644)
@@ -271,7 +272,7 @@
 def copyAppStreamFile(src, dst):
     """
     Modify an appstream file and write it to its destination.
-    
+
     @param src source file name (string)
     @param dst destination file name (string)
     """
@@ -283,16 +284,16 @@
         from src.eric7.UI.Info import Version
     else:
         Version = "Unknown"
-    
+
     with open(src, "r", encoding="utf-8") as f:
         text = f.read()
-    
+
     text = (
         text.replace("@MARKER@", "")
         .replace("@VERSION@", Version.split(None, 1)[0])
         .replace("@DATE@", time.strftime("%Y-%m-%d"))
     )
-    
+
     with open(dst, "w", encoding="utf-8") as f:
         f.write(text)
     os.chmod(dst, 0o644)
@@ -301,15 +302,15 @@
 def wrapperNames(dname, wfile):
     """
     Create the platform specific names for the wrapper script.
-    
+
     @param dname name of the directory to place the wrapper into
     @param wfile basename (without extension) of the wrapper script
     @return the names of the wrapper scripts
     """
     wnames = (
         (dname + "\\" + wfile + ".cmd", dname + "\\" + wfile + ".bat")
-        if sys.platform.startswith(("win", "cygwin")) else
-        (dname + "/" + wfile, )
+        if sys.platform.startswith(("win", "cygwin"))
+        else (dname + "/" + wfile,)
     )
 
     return wnames
@@ -332,17 +333,17 @@
         wname = wfile + ".cmd"
         if isGuiScript:
             wrapper = (
-                '''@echo off\n'''
+                """@echo off\n"""
                 '''start "" "{2}\\pythonw.exe"'''
                 ''' "{0}\\{1}.pyw"'''
-                ''' %1 %2 %3 %4 %5 %6 %7 %8 %9\n'''.format(
-                    pydir, wfile, os.path.dirname(sys.executable))
+                """ %1 %2 %3 %4 %5 %6 %7 %8 %9\n""".format(
+                    pydir, wfile, os.path.dirname(sys.executable)
+                )
             )
         else:
             wrapper = (
                 '''@"{0}" "{1}\\{2}.py"'''
-                ''' %1 %2 %3 %4 %5 %6 %7 %8 %9\n'''.format(
-                    sys.executable, pydir, wfile)
+                """ %1 %2 %3 %4 %5 %6 %7 %8 %9\n""".format(sys.executable, pydir, wfile)
             )
 
     # Mac OS X
@@ -352,22 +353,24 @@
         if not os.path.exists(pyexec):
             pyexec = "{0}/bin/python{1}".format(sys.exec_prefix, major)
         wname = wfile
-        wrapper = ('''#!/bin/sh\n'''
-                   '''\n'''
-                   '''exec "{0}" "{1}/{2}.py" "$@"\n'''
-                   .format(pyexec, pydir, wfile))
+        wrapper = (
+            """#!/bin/sh\n"""
+            """\n"""
+            """exec "{0}" "{1}/{2}.py" "$@"\n""".format(pyexec, pydir, wfile)
+        )
 
     # *nix systems
     else:
         wname = wfile
-        wrapper = ('''#!/bin/sh\n'''
-                   '''\n'''
-                   '''exec "{0}" "{1}/{2}.py" "$@"\n'''
-                   .format(sys.executable, pydir, wfile))
-    
+        wrapper = (
+            """#!/bin/sh\n"""
+            """\n"""
+            """exec "{0}" "{1}/{2}.py" "$@"\n""".format(sys.executable, pydir, wfile)
+        )
+
     wname = os.path.join(saveDir, wname)
     copyToFile(wname, wrapper)
-    os.chmod(wname, 0o755)                  # secok
+    os.chmod(wname, 0o755)  # secok
 
     return wname
 
@@ -376,7 +379,7 @@
     """
     Copy Python, translation, documentation, wizards configuration,
     designer template files and DTDs of a directory tree.
-    
+
     @param src name of the source directory
     @param dst name of the destination directory
     @param filters list of filter pattern determining the files to be copied
@@ -393,7 +396,7 @@
     except OSError:
         # ignore missing directories (most probably the i18n directory)
         return
-    
+
     for name in names:
         skipIt = False
         for excludePattern in excludePatterns:
@@ -412,8 +415,7 @@
                     break
             else:
                 if os.path.isdir(srcname) and srcname not in excludeDirs:
-                    copyTree(srcname, dstname, filters,
-                             excludePatterns=excludePatterns)
+                    copyTree(srcname, dstname, filters, excludePatterns=excludePatterns)
 
 
 def createGlobalPluginsDir():
@@ -421,8 +423,8 @@
     Create the global plugins directory, if it doesn't exist.
     """
     global cfg, distDir
-    
-    pdir = os.path.join(cfg['mdir'], "eric7plugins")
+
+    pdir = os.path.join(cfg["mdir"], "eric7plugins")
     fname = os.path.join(pdir, "__init__.py")
     if not os.path.exists(fname):
         if not os.path.exists(pdir):
@@ -443,32 +445,32 @@
     """
     Cleanup the sources directory to get rid of leftover files
     and directories.
-    
+
     @param dirName name of the directory to prune (string)
     """
     # step 1: delete all Ui_*.py files without a corresponding
     #         *.ui file
     dirListing = os.listdir(dirName)
     for formName, sourceName in [
-        (f.replace('Ui_', "").replace(".py", ".ui"), f)
-            for f in dirListing if fnmatch.fnmatch(f, "Ui_*.py")]:
+        (f.replace("Ui_", "").replace(".py", ".ui"), f)
+        for f in dirListing
+        if fnmatch.fnmatch(f, "Ui_*.py")
+    ]:
         if not os.path.exists(os.path.join(dirName, formName)):
             os.remove(os.path.join(dirName, sourceName))
             if os.path.exists(os.path.join(dirName, sourceName + "c")):
                 os.remove(os.path.join(dirName, sourceName + "c"))
-    
+
     # step 2: delete the __pycache__ directory and all remaining *.pyc files
     if os.path.exists(os.path.join(dirName, "__pycache__")):
         shutil.rmtree(os.path.join(dirName, "__pycache__"))
-    for name in [f for f in os.listdir(dirName)
-                 if fnmatch.fnmatch(f, "*.pyc")]:
+    for name in [f for f in os.listdir(dirName) if fnmatch.fnmatch(f, "*.pyc")]:
         os.remove(os.path.join(dirName, name))
-    
+
     # step 3: delete *.orig files
-    for name in [f for f in os.listdir(dirName)
-                 if fnmatch.fnmatch(f, "*.orig")]:
+    for name in [f for f in os.listdir(dirName) if fnmatch.fnmatch(f, "*.orig")]:
         os.remove(os.path.join(dirName, name))
-    
+
     # step 4: descent into subdirectories and delete them if empty
     for name in os.listdir(dirName):
         name = os.path.join(dirName, name)
@@ -483,7 +485,7 @@
     Uninstall the old eric files.
     """
     global platBinDir, platBinDirOld
-    
+
     try:
         from eric7config import getConfig
     except ImportError:
@@ -492,31 +494,47 @@
     except SyntaxError:
         # an incomplete or old config file was found
         return
-    
+
     global pyModDir, progLanguages
-    
+
     # Remove the menu entry for Linux systems
     if sys.platform.startswith("linux"):
         cleanUpLinuxSpecifics()
     # Remove the Desktop and Start Menu entries for Windows systems
     elif sys.platform.startswith(("win", "cygwin")):
         cleanUpWindowsLinks()
-    
+
     # Remove the wrapper scripts
     rem_wnames = [
-        "eric7_api", "eric7_browser", "eric7_compare", "eric7_configure",
-        "eric7_diff", "eric7_doc", "eric7_editor", "eric7_hexeditor",
-        "eric7_iconeditor", "eric7_plugininstall", "eric7_pluginrepository",
-        "eric7_pluginuninstall", "eric7_qregularexpression", "eric7_re",
-        "eric7_shell", "eric7_snap", "eric7_sqlbrowser", "eric7_testing",
-        "eric7_tray", "eric7_trpreviewer", "eric7_uipreviewer",
-        "eric7_virtualenv", "eric7",
+        "eric7_api",
+        "eric7_browser",
+        "eric7_compare",
+        "eric7_configure",
+        "eric7_diff",
+        "eric7_doc",
+        "eric7_editor",
+        "eric7_hexeditor",
+        "eric7_iconeditor",
+        "eric7_plugininstall",
+        "eric7_pluginrepository",
+        "eric7_pluginuninstall",
+        "eric7_qregularexpression",
+        "eric7_re",
+        "eric7_shell",
+        "eric7_snap",
+        "eric7_sqlbrowser",
+        "eric7_testing",
+        "eric7_tray",
+        "eric7_trpreviewer",
+        "eric7_uipreviewer",
+        "eric7_virtualenv",
+        "eric7",
         # obsolete scripts below
         "eric7_unittest",
     ]
-    
+
     try:
-        dirs = [platBinDir, getConfig('bindir')]
+        dirs = [platBinDir, getConfig("bindir")]
         if platBinDirOld:
             dirs.append(platBinDirOld)
         for rem_wname in rem_wnames:
@@ -524,9 +542,9 @@
                 for rwname in wrapperNames(d, rem_wname):
                     if os.path.exists(rwname):
                         os.remove(rwname)
-        
+
         # Cleanup our config file(s)
-        for name in ['eric7config.py', 'eric7config.pyc', 'eric7.pth']:
+        for name in ["eric7config.py", "eric7config.pyc", "eric7.pth"]:
             e6cfile = os.path.join(pyModDir, name)
             if os.path.exists(e6cfile):
                 os.remove(e6cfile)
@@ -534,42 +552,52 @@
             path, ext = os.path.splitext(e6cfile)
             for f in glob.glob("{0}.*{1}".format(path, ext)):
                 os.remove(f)
-            
+
         # Cleanup the install directories
-        for name in ['ericExamplesDir', 'ericDocDir', 'ericDTDDir',
-                     'ericCSSDir', 'ericIconDir', 'ericPixDir',
-                     'ericTemplatesDir', 'ericCodeTemplatesDir',
-                     'ericOthersDir', 'ericStylesDir', 'ericThemesDir',
-                     'ericDir']:
+        for name in [
+            "ericExamplesDir",
+            "ericDocDir",
+            "ericDTDDir",
+            "ericCSSDir",
+            "ericIconDir",
+            "ericPixDir",
+            "ericTemplatesDir",
+            "ericCodeTemplatesDir",
+            "ericOthersDir",
+            "ericStylesDir",
+            "ericThemesDir",
+            "ericDir",
+        ]:
             with contextlib.suppress(AttributeError):
                 if os.path.exists(getConfig(name)):
                     shutil.rmtree(getConfig(name), True)
-        
+
         # Cleanup translations
         for name in glob.glob(
-                os.path.join(getConfig('ericTranslationsDir'), 'eric7_*.qm')):
+            os.path.join(getConfig("ericTranslationsDir"), "eric7_*.qm")
+        ):
             if os.path.exists(name):
                 os.remove(name)
-        
+
         # Cleanup API files
         with contextlib.suppress(AttributeError):
-            apidir = getConfig('apidir')
+            apidir = getConfig("apidir")
             for progLanguage in progLanguages:
-                for name in getConfig('apis'):
+                for name in getConfig("apis"):
                     apiname = os.path.join(apidir, progLanguage.lower(), name)
                     if os.path.exists(apiname):
                         os.remove(apiname)
                 for apiname in glob.glob(
-                        os.path.join(apidir, progLanguage.lower(), "*.bas")):
+                    os.path.join(apidir, progLanguage.lower(), "*.bas")
+                ):
                     if os.path.basename(apiname) != "eric7.bas":
                         os.remove(apiname)
-        
+
         if sys.platform == "darwin":
             # delete the Mac app bundle
             cleanUpMacAppBundle()
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry install with admin rights.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry install with admin rights.\n".format(msg))
         exit(7)
 
 
@@ -584,7 +612,6 @@
             "/usr/share/metainfo/eric7.appdata.xml",
             "/usr/share/pixmaps/eric.png",
             "/usr/share/icons/eric.png",
-            
             "/usr/share/applications/eric7_browser.desktop",
             "/usr/share/pixmaps/ericWeb.png",
             "/usr/share/icons/ericWeb.png",
@@ -599,7 +626,6 @@
             "~/.local/share/metainfo/eric7.appdata.xml",
             "~/.local/share/pixmaps/eric.png",
             "~/.local/share/icons/eric.png",
-            
             "~/.local/share/applications/eric7_browser.desktop",
             "~/.local/share/pixmaps/ericWeb.png",
             "~/.local/share/icons/ericWeb.png",
@@ -614,17 +640,17 @@
     Uninstall the macOS application bundle.
     """
     from eric7config import getConfig
+
     try:
         macAppBundlePath = getConfig("macAppBundlePath")
         macAppBundleName = getConfig("macAppBundleName")
     except AttributeError:
         macAppBundlePath = defaultMacAppBundlePath
         macAppBundleName = defaultMacAppBundleName
-    for bundlePath in [os.path.join(defaultMacAppBundlePath,
-                                    macAppBundleName),
-                       os.path.join(macAppBundlePath,
-                                    macAppBundleName),
-                       ]:
+    for bundlePath in [
+        os.path.join(defaultMacAppBundlePath, macAppBundleName),
+        os.path.join(macAppBundlePath, macAppBundleName),
+    ]:
         if os.path.exists(bundlePath):
             shutil.rmtree(bundlePath)
 
@@ -634,18 +660,18 @@
     Clean up the Desktop and Start Menu entries for Windows.
     """
     global doCleanDesktopLinks, forceCleanDesktopLinks
-    
+
     try:
-        from pywintypes import com_error        # __IGNORE_WARNING__
+        from pywintypes import com_error  # __IGNORE_WARNING__
     except ImportError:
         # links were not created by install.py
         return
-    
+
     regPath = (
-        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" +
-        "\\User Shell Folders"
+        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+        + "\\User Shell Folders"
     )
-    
+
     if doCleanDesktopLinks or forceCleanDesktopLinks:
         # 1. cleanup desktop links
         regName = "Desktop"
@@ -660,7 +686,7 @@
                     except OSError:
                         # maybe restrictions prohibited link removal
                         print("Could not remove '{0}'.".format(linkPath))
-    
+
     # 2. cleanup start menu entry
     regName = "Programs"
     programsEntry = getWinregEntry(regName, regPath)
@@ -678,7 +704,7 @@
 def shutilCopy(src, dst, perm=0o644):
     """
     Wrapper function around shutil.copy() to ensure the permissions.
-    
+
     @param src source file name (string)
     @param dst destination file name or directory name (string)
     @param perm permissions to be set (integer)
@@ -692,240 +718,277 @@
 def installEric():
     """
     Actually perform the installation steps.
-    
+
     @return result code (integer)
     """
     global distDir, doCleanup, cfg, progLanguages, sourceDir, configName
     global installApis
-    
+
     # Create the platform specific wrappers.
     scriptsDir = "install_scripts"
     if not os.path.isdir(scriptsDir):
         os.mkdir(scriptsDir)
     wnames = []
     for name in ["eric7_api", "eric7_doc"]:
-        wnames.append(createPyWrapper(cfg['ericDir'], name, scriptsDir, False))
-    for name in ["eric7_browser", "eric7_compare", "eric7_configure",
-                 "eric7_diff", "eric7_editor", "eric7_hexeditor",
-                 "eric7_iconeditor", "eric7_plugininstall",
-                 "eric7_pluginrepository", "eric7_pluginuninstall",
-                 "eric7_qregularexpression", "eric7_re", "eric7_shell",
-                 "eric7_snap", "eric7_sqlbrowser", "eric7_tray",
-                 "eric7_trpreviewer", "eric7_uipreviewer", "eric7_testing",
-                 "eric7_virtualenv", "eric7"]:
-        wnames.append(createPyWrapper(cfg['ericDir'], name, scriptsDir))
-    
+        wnames.append(createPyWrapper(cfg["ericDir"], name, scriptsDir, False))
+    for name in [
+        "eric7_browser",
+        "eric7_compare",
+        "eric7_configure",
+        "eric7_diff",
+        "eric7_editor",
+        "eric7_hexeditor",
+        "eric7_iconeditor",
+        "eric7_plugininstall",
+        "eric7_pluginrepository",
+        "eric7_pluginuninstall",
+        "eric7_qregularexpression",
+        "eric7_re",
+        "eric7_shell",
+        "eric7_snap",
+        "eric7_sqlbrowser",
+        "eric7_tray",
+        "eric7_trpreviewer",
+        "eric7_uipreviewer",
+        "eric7_testing",
+        "eric7_virtualenv",
+        "eric7",
+    ]:
+        wnames.append(createPyWrapper(cfg["ericDir"], name, scriptsDir))
+
     # set install prefix, if not None
     if distDir:
         for key in list(cfg.keys()):
-            cfg[key] = os.path.normpath(
-                os.path.join(distDir, cfg[key].lstrip(os.sep)))
-    
+            cfg[key] = os.path.normpath(os.path.join(distDir, cfg[key].lstrip(os.sep)))
+
     try:
         # Install the files
         # make the install directories
         for key in cfg:
             if cfg[key] and not os.path.isdir(cfg[key]):
                 os.makedirs(cfg[key])
-        
+
         # copy the eric config file
         if distDir:
-            shutilCopy(configName, cfg['mdir'])
-            if os.path.exists(configName + 'c'):
-                shutilCopy(configName + 'c', cfg['mdir'])
+            shutilCopy(configName, cfg["mdir"])
+            if os.path.exists(configName + "c"):
+                shutilCopy(configName + "c", cfg["mdir"])
         else:
             shutilCopy(configName, modDir)
-            if os.path.exists(configName + 'c'):
-                shutilCopy(configName + 'c', modDir)
-        
+            if os.path.exists(configName + "c"):
+                shutilCopy(configName + "c", modDir)
+
         # copy the various parts of eric
         copyTree(
             eric7SourceDir,
-            cfg['ericDir'],
-            ['*.py', '*.pyc', '*.pyo', '*.pyw'],
-            excludePatterns=["eric7config.py*"])
+            cfg["ericDir"],
+            ["*.py", "*.pyc", "*.pyo", "*.pyw"],
+            excludePatterns=["eric7config.py*"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "Plugins"),
-            os.path.join(cfg['ericDir'], "Plugins"),
-            ['*.svgz', '*.svg', '*.png', '*.style', '*.tmpl', '*.txt'])
+            os.path.join(cfg["ericDir"], "Plugins"),
+            ["*.svgz", "*.svg", "*.png", "*.style", "*.tmpl", "*.txt"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "Documentation"),
-            cfg['ericDocDir'],
-            ['*.html', '*.qch'])
-        copyTree(
-            os.path.join(eric7SourceDir, "CSSs"),
-            cfg['ericCSSDir'],
-            ['*.css'])
+            cfg["ericDocDir"],
+            ["*.html", "*.qch"],
+        )
+        copyTree(os.path.join(eric7SourceDir, "CSSs"), cfg["ericCSSDir"], ["*.css"])
         copyTree(
             os.path.join(eric7SourceDir, "Styles"),
-            cfg['ericStylesDir'],
-            ['*.qss', '*.ehj'])
+            cfg["ericStylesDir"],
+            ["*.qss", "*.ehj"],
+        )
         copyTree(
-            os.path.join(eric7SourceDir, "Themes"),
-            cfg['ericThemesDir'],
-            ['*.ethj'])
+            os.path.join(eric7SourceDir, "Themes"), cfg["ericThemesDir"], ["*.ethj"]
+        )
         copyTree(
-            os.path.join(eric7SourceDir, "i18n"),
-            cfg['ericTranslationsDir'],
-            ['*.qm'])
+            os.path.join(eric7SourceDir, "i18n"), cfg["ericTranslationsDir"], ["*.qm"]
+        )
         copyTree(
             os.path.join(eric7SourceDir, "icons"),
-            cfg['ericIconDir'],
-            ['*.svgz', '*.svg', '*.png', 'LICENSE*.*', 'readme.txt'])
+            cfg["ericIconDir"],
+            ["*.svgz", "*.svg", "*.png", "LICENSE*.*", "readme.txt"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "pixmaps"),
-            cfg['ericPixDir'],
-            ['*.svgz', '*.svg', '*.png', '*.xpm', '*.ico', '*.gif'])
+            cfg["ericPixDir"],
+            ["*.svgz", "*.svg", "*.png", "*.xpm", "*.ico", "*.gif"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "DesignerTemplates"),
-            cfg['ericTemplatesDir'],
-            ['*.tmpl'])
+            cfg["ericTemplatesDir"],
+            ["*.tmpl"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "CodeTemplates"),
-            cfg['ericCodeTemplatesDir'],
-            ['*.tmpl'])
+            cfg["ericCodeTemplatesDir"],
+            ["*.tmpl"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "DebugClients", "Python", "coverage"),
-            os.path.join(cfg['ericDir'], "DebugClients", "Python", "coverage"),
-            ['*.js', '*.html', '*.png', '*.css', '*.scss', '*.txt', '*.rst'])
-        
+            os.path.join(cfg["ericDir"], "DebugClients", "Python", "coverage"),
+            ["*.js", "*.html", "*.png", "*.css", "*.scss", "*.txt", "*.rst"],
+        )
+
         # copy some data files needed at various places
         copyTree(
             os.path.join(eric7SourceDir, "data"),
-            os.path.join(cfg['ericDir'], "data"),
-            ['*.txt'])
+            os.path.join(cfg["ericDir"], "data"),
+            ["*.txt"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "EricNetwork", "data"),
-            os.path.join(cfg['ericDir'], "EricNetwork", "data"),
-            ['*.dat', '*.txt'])
+            os.path.join(cfg["ericDir"], "EricNetwork", "data"),
+            ["*.dat", "*.txt"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "IconEditor", "cursors"),
-            os.path.join(cfg['ericDir'], "IconEditor", "cursors"),
-            ['*.xpm'])
+            os.path.join(cfg["ericDir"], "IconEditor", "cursors"),
+            ["*.xpm"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "UI", "data"),
-            os.path.join(cfg['ericDir'], "UI", "data"),
-            ['*.css'])
+            os.path.join(cfg["ericDir"], "UI", "data"),
+            ["*.css"],
+        )
         copyTree(
             os.path.join(eric7SourceDir, "WebBrowser"),
-            os.path.join(cfg['ericDir'], "WebBrowser"),
-            ['*.xbel', '*.xml', '*.html', '*.png', '*.gif', '*.js'])
-        
+            os.path.join(cfg["ericDir"], "WebBrowser"),
+            ["*.xbel", "*.xml", "*.html", "*.png", "*.gif", "*.js"],
+        )
+
         # copy the wrappers
         for wname in wnames:
-            shutilCopy(wname, cfg['bindir'], perm=0o755)
+            shutilCopy(wname, cfg["bindir"], perm=0o755)
             os.remove(wname)
         shutil.rmtree(scriptsDir)
-        
+
         # copy the license file
-        shutilCopy(os.path.join(sourceDir, "docs", "LICENSE.GPL3"),
-                   cfg['ericDir'])
-        
+        shutilCopy(os.path.join(sourceDir, "docs", "LICENSE.GPL3"), cfg["ericDir"])
+
         # create the global plugins directory
         createGlobalPluginsDir()
-        
+
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry install with admin rights.\n'.format(msg))
-        return(7)
-    
+        sys.stderr.write("Error: {0}\nTry install with admin rights.\n".format(msg))
+        return 7
+
     # copy some text files to the doc area
     for name in ["LICENSE.GPL3", "THANKS", "changelog"]:
         try:
-            shutilCopy(os.path.join(sourceDir, "docs", name),
-                       cfg['ericDocDir'])
+            shutilCopy(os.path.join(sourceDir, "docs", name), cfg["ericDocDir"])
         except OSError:
-            print("Could not install '{0}'.".format(
-                os.path.join(sourceDir, "docs", name)))
-    for name in glob.glob(os.path.join(sourceDir, 'docs', 'README*.*')):
+            print(
+                "Could not install '{0}'.".format(os.path.join(sourceDir, "docs", name))
+            )
+    for name in glob.glob(os.path.join(sourceDir, "docs", "README*.*")):
         try:
-            shutilCopy(name, cfg['ericDocDir'])
+            shutilCopy(name, cfg["ericDocDir"])
         except OSError:
             print("Could not install '{0}'.".format(name))
-   
+
     # copy some more stuff
-    for name in ('default.ekj', 'default_Mac.ekj',
-                 'default.e4k', 'default_Mac.e4k'):
+    for name in ("default.ekj", "default_Mac.ekj", "default.e4k", "default_Mac.e4k"):
         try:
-            shutilCopy(os.path.join(sourceDir, "others", name),
-                       cfg['ericOthersDir'])
+            shutilCopy(os.path.join(sourceDir, "others", name), cfg["ericOthersDir"])
         except OSError:
-            print("Could not install '{0}'.".format(
-                os.path.join(sourceDir, "others", name)))
-    
+            print(
+                "Could not install '{0}'.".format(
+                    os.path.join(sourceDir, "others", name)
+                )
+            )
+
     # install the API file
     if installApis:
         for progLanguage in progLanguages:
-            apidir = os.path.join(cfg['apidir'], progLanguage.lower())
-            print("Installing {0} API files to '{1}'.".format(
-                progLanguage, apidir))
+            apidir = os.path.join(cfg["apidir"], progLanguage.lower())
+            print("Installing {0} API files to '{1}'.".format(progLanguage, apidir))
             if not os.path.exists(apidir):
                 os.makedirs(apidir)
-            for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                  progLanguage, "*.api")):
+            for apiName in glob.glob(
+                os.path.join(eric7SourceDir, "APIs", progLanguage, "*.api")
+            ):
                 try:
                     shutilCopy(apiName, apidir)
                 except OSError:
-                    print("Could not install '{0}' (no permission)."
-                          .format(apiName))
-            for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                  progLanguage, "*.bas")):
+                    print("Could not install '{0}' (no permission).".format(apiName))
+            for apiName in glob.glob(
+                os.path.join(eric7SourceDir, "APIs", progLanguage, "*.bas")
+            ):
                 try:
                     shutilCopy(apiName, apidir)
                 except OSError:
-                    print("Could not install '{0}' (no permission)."
-                          .format(apiName))
+                    print("Could not install '{0}' (no permission).".format(apiName))
             if progLanguage == "Python":
                 # copy Python3 API files to the same destination
-                for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                      "Python3", "*.api")):
+                for apiName in glob.glob(
+                    os.path.join(eric7SourceDir, "APIs", "Python3", "*.api")
+                ):
                     try:
                         shutilCopy(apiName, apidir)
                     except OSError:
-                        print("Could not install '{0}' (no permission)."
-                              .format(apiName))
-                for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                      "Python3", "*.bas")):
-                    if os.path.exists(os.path.join(
-                        apidir, os.path.basename(
-                            apiName.replace(".bas", ".api")))):
+                        print(
+                            "Could not install '{0}' (no permission).".format(apiName)
+                        )
+                for apiName in glob.glob(
+                    os.path.join(eric7SourceDir, "APIs", "Python3", "*.bas")
+                ):
+                    if os.path.exists(
+                        os.path.join(
+                            apidir, os.path.basename(apiName.replace(".bas", ".api"))
+                        )
+                    ):
                         try:
                             shutilCopy(apiName, apidir)
                         except OSError:
-                            print("Could not install '{0}' (no permission)."
-                                  .format(apiName))
-                
+                            print(
+                                "Could not install '{0}' (no permission).".format(
+                                    apiName
+                                )
+                            )
+
                 # copy MicroPython API files to the same destination
-                for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                      "MicroPython", "*.api")):
+                for apiName in glob.glob(
+                    os.path.join(eric7SourceDir, "APIs", "MicroPython", "*.api")
+                ):
                     try:
                         shutilCopy(apiName, apidir)
                     except OSError:
-                        print("Could not install '{0}' (no permission)."
-                              .format(apiName))
-                for apiName in glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                                      "MicroPython", "*.bas")):
-                    if os.path.exists(os.path.join(
-                        apidir, os.path.basename(
-                            apiName.replace(".bas", ".api")))):
+                        print(
+                            "Could not install '{0}' (no permission).".format(apiName)
+                        )
+                for apiName in glob.glob(
+                    os.path.join(eric7SourceDir, "APIs", "MicroPython", "*.bas")
+                ):
+                    if os.path.exists(
+                        os.path.join(
+                            apidir, os.path.basename(apiName.replace(".bas", ".api"))
+                        )
+                    ):
                         try:
                             shutilCopy(apiName, apidir)
                         except OSError:
-                            print("Could not install '{0}' (no permission)."
-                                  .format(apiName))
-    
+                            print(
+                                "Could not install '{0}' (no permission).".format(
+                                    apiName
+                                )
+                            )
+
     # Create menu entry for Linux systems
     if sys.platform.startswith("linux"):
         createLinuxSpecifics()
-    
+
     # Create Desktop and Start Menu entries for Windows systems
     elif sys.platform.startswith(("win", "cygwin")):
         createWindowsLinks()
-    
+
     # Create a Mac application bundle
     elif sys.platform == "darwin":
-        createMacAppBundle(cfg['ericDir'])
-    
+        createMacAppBundle(cfg["ericDir"])
+
     return 0
 
 
@@ -934,111 +997,139 @@
     Install Linux specific files.
     """
     global distDir, sourceDir
-    
+
     dataSourceDir = os.path.join(eric7SourceDir, "data", "linux")
-    
+
     if distDir:
         dst = os.path.normpath(os.path.join(distDir, "usr/share/icons"))
         if not os.path.exists(dst):
             os.makedirs(dst)
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric_icon.png"),
-            os.path.join(dst, "eric.png"))
+            os.path.join(dst, "eric.png"),
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            os.path.join(dst, "ericWeb.png"))
-        
+            os.path.join(dst, "ericWeb.png"),
+        )
+
         dst = os.path.normpath(
-            os.path.join(distDir, "usr/share/icons/hicolor/48x48/apps"))
+            os.path.join(distDir, "usr/share/icons/hicolor/48x48/apps")
+        )
         if not os.path.exists(dst):
             os.makedirs(dst)
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric48_icon.png"),
-            os.path.join(dst, "eric.png"))
+            os.path.join(dst, "eric.png"),
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            os.path.join(dst, "ericWeb.png"))
-        
-        dst = os.path.normpath(
-            os.path.join(distDir, "usr/share/applications"))
+            os.path.join(dst, "ericWeb.png"),
+        )
+
+        dst = os.path.normpath(os.path.join(distDir, "usr/share/applications"))
         if not os.path.exists(dst):
             os.makedirs(dst)
-        copyDesktopFile(os.path.join(dataSourceDir, "eric7.desktop.in"),
-                        os.path.join(dst, "eric7.desktop"))
+        copyDesktopFile(
+            os.path.join(dataSourceDir, "eric7.desktop.in"),
+            os.path.join(dst, "eric7.desktop"),
+        )
         copyDesktopFile(
             os.path.join(dataSourceDir, "eric7_browser.desktop.in"),
-            os.path.join(dst, "eric7_browser.desktop"))
-        
-        dst = os.path.normpath(
-            os.path.join(distDir, "usr/share/metainfo"))
+            os.path.join(dst, "eric7_browser.desktop"),
+        )
+
+        dst = os.path.normpath(os.path.join(distDir, "usr/share/metainfo"))
         if not os.path.exists(dst):
             os.makedirs(dst)
         copyAppStreamFile(
             os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
-            os.path.join(dst, "eric7.appdata.xml"))
+            os.path.join(dst, "eric7.appdata.xml"),
+        )
     elif os.getuid() == 0:
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric_icon.png"),
-            "/usr/share/icons/eric.png")
+            "/usr/share/icons/eric.png",
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric48_icon.png"),
-            "/usr/share/icons/hicolor/48x48/apps/eric.png")
+            "/usr/share/icons/hicolor/48x48/apps/eric.png",
+        )
         copyDesktopFile(
             os.path.join(dataSourceDir, "eric7.desktop.in"),
-            "/usr/share/applications/eric7.desktop")
+            "/usr/share/applications/eric7.desktop",
+        )
         if os.path.exists("/usr/share/metainfo"):
             copyAppStreamFile(
                 os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
-                "/usr/share/metainfo/eric7.appdata.xml")
+                "/usr/share/metainfo/eric7.appdata.xml",
+            )
         elif os.path.exists("/usr/share/appdata"):
             copyAppStreamFile(
                 os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
-                "/usr/share/appdata/eric7.appdata.xml")
+                "/usr/share/appdata/eric7.appdata.xml",
+            )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            "/usr/share/icons/ericWeb.png")
+            "/usr/share/icons/ericWeb.png",
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            "/usr/share/icons/hicolor/48x48/apps/ericWeb.png")
+            "/usr/share/icons/hicolor/48x48/apps/ericWeb.png",
+        )
         copyDesktopFile(
             os.path.join(dataSourceDir, "eric7_browser.desktop.in"),
-            "/usr/share/applications/eric7_browser.desktop")
+            "/usr/share/applications/eric7_browser.desktop",
+        )
     elif os.getuid() >= 1000:
         # it is assumed, that user ids start at 1000
-        localPath = os.path.join(os.path.expanduser("~"),
-                                 ".local", "share")
+        localPath = os.path.join(os.path.expanduser("~"), ".local", "share")
         # create directories first
-        for directory in [os.path.join(localPath, name)
-                          for name in ("icons", "icons/hicolor/48x48/apps",
-                                       "applications", "metainfo", "appdata")]:
+        for directory in [
+            os.path.join(localPath, name)
+            for name in (
+                "icons",
+                "icons/hicolor/48x48/apps",
+                "applications",
+                "metainfo",
+                "appdata",
+            )
+        ]:
             if not os.path.isdir(directory):
                 os.makedirs(directory)
         # now copy the files
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric_icon.png"),
-            os.path.join(localPath, "icons", "eric.png"))
+            os.path.join(localPath, "icons", "eric.png"),
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "eric48_icon.png"),
-            os.path.join(localPath, "icons/hicolor/48x48/apps", "eric.png"))
+            os.path.join(localPath, "icons/hicolor/48x48/apps", "eric.png"),
+        )
         copyDesktopFile(
             os.path.join(dataSourceDir, "eric7.desktop.in"),
-            os.path.join(localPath, "applications", "eric7.desktop"))
-        copyAppStreamFile(
-            os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
-            os.path.join(localPath, "metainfo", "eric7.appdata.xml"))
+            os.path.join(localPath, "applications", "eric7.desktop"),
+        )
         copyAppStreamFile(
             os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
-            os.path.join(localPath, "appdata", "eric7.appdata.xml"))
-        shutilCopy(
-            os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            os.path.join(localPath, "icons", "ericWeb.png"))
+            os.path.join(localPath, "metainfo", "eric7.appdata.xml"),
+        )
+        copyAppStreamFile(
+            os.path.join(dataSourceDir, "eric7.appdata.xml.in"),
+            os.path.join(localPath, "appdata", "eric7.appdata.xml"),
+        )
         shutilCopy(
             os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
-            os.path.join(localPath, "icons/hicolor/48x48/apps", "ericWeb.png"))
+            os.path.join(localPath, "icons", "ericWeb.png"),
+        )
+        shutilCopy(
+            os.path.join(eric7SourceDir, "pixmaps", "ericWeb48_icon.png"),
+            os.path.join(localPath, "icons/hicolor/48x48/apps", "ericWeb.png"),
+        )
         copyDesktopFile(
             os.path.join(dataSourceDir, "eric7_browser.desktop.in"),
-            os.path.join(localPath, "applications",
-                         "eric7_browser.desktop"))
+            os.path.join(localPath, "applications", "eric7_browser.desktop"),
+        )
 
 
 def createWindowsLinks():
@@ -1047,34 +1138,33 @@
     """
     try:
         # check, if pywin32 is available
-        from win32com.client import Dispatch    # __IGNORE_WARNING__
+        from win32com.client import Dispatch  # __IGNORE_WARNING__
     except ImportError:
         installed = pipInstall(
             "pywin32",
             "\nThe Python package 'pywin32' could not be imported.",
-            force=False
+            force=False,
         )
         if installed:
             # create the links via an external script to get around some
             # startup magic done by pywin32.pth
             args = [
                 sys.executable,
-                os.path.join(os.path.dirname(__file__),
-                             "create_windows_links.py"),
+                os.path.join(os.path.dirname(__file__), "create_windows_links.py"),
             ]
-            subprocess.run(args)                # secok
+            subprocess.run(args)  # secok
         else:
             print(
                 "\nThe Python package 'pywin32' is not installed. Desktop and"
                 " Start Menu entries will not be created."
             )
         return
-    
+
     regPath = (
-        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" +
-        "\\User Shell Folders"
+        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+        + "\\User Shell Folders"
     )
-    
+
     # 1. create desktop shortcuts
     regName = "Desktop"
     desktopEntry = getWinregEntry(regName, regPath)
@@ -1083,7 +1173,7 @@
         for linkName, targetPath, iconPath in windowsDesktopEntries():
             linkPath = os.path.join(desktopFolder, linkName)
             createWindowsShortcut(linkPath, targetPath, iconPath)
-    
+
     # 2. create start menu entry and shortcuts
     regName = "Programs"
     programsEntry = getWinregEntry(regName, regPath)
@@ -1096,7 +1186,7 @@
             except OSError:
                 # maybe restrictions prohibited link creation
                 return
-        
+
         for linkName, targetPath, iconPath in windowsDesktopEntries():
             linkPath = os.path.join(eric7EntryPath, linkName)
             createWindowsShortcut(linkPath, targetPath, iconPath)
@@ -1111,38 +1201,35 @@
     @type str
     """
     global cfg, macAppBundleName, macPythonExe, macAppBundlePath
-    
+
     directories = {
-        "contents": "{0}/{1}/Contents/".format(
-            macAppBundlePath, macAppBundleName),
-        "exe": "{0}/{1}/Contents/MacOS".format(
-            macAppBundlePath, macAppBundleName),
-        "icns": "{0}/{1}/Contents/Resources".format(
-            macAppBundlePath, macAppBundleName)
+        "contents": "{0}/{1}/Contents/".format(macAppBundlePath, macAppBundleName),
+        "exe": "{0}/{1}/Contents/MacOS".format(macAppBundlePath, macAppBundleName),
+        "icns": "{0}/{1}/Contents/Resources".format(macAppBundlePath, macAppBundleName),
     }
     for directory in directories.values():
         if not os.path.exists(directory):
             os.makedirs(directory)
-    
+
     if macPythonExe == defaultMacPythonExe and macPythonExe:
         starter = os.path.join(directories["exe"], "eric")
         os.symlink(macPythonExe, starter)
     else:
         starter = "python{0}".format(sys.version_info.major)
-    
+
     wname = os.path.join(directories["exe"], "eric7")
-    
+
     # determine entry for DYLD_FRAMEWORK_PATH
     dyldLine = ""
     try:
         from PyQt6.QtCore import QLibraryInfo
-        qtLibraryDir = QLibraryInfo.path(
-            QLibraryInfo.LibraryPath.LibrariesPath)
+
+        qtLibraryDir = QLibraryInfo.path(QLibraryInfo.LibraryPath.LibrariesPath)
     except ImportError:
         qtLibraryDir = ""
     if qtLibraryDir:
         dyldLine = "DYLD_FRAMEWORK_PATH={0}\n".format(qtLibraryDir)
-    
+
     # determine entry for PATH
     pathLine = ""
     path = os.getenv("PATH", "")
@@ -1154,20 +1241,25 @@
             if path_ and path_ not in pathlist_n:
                 pathlist_n.append(path_)
         pathLine = "PATH={0}\n".format(os.pathsep.join(pathlist_n))
-    
+
     # create the wrapper script
-    wrapper = ('''#!/bin/sh\n'''
-               '''\n'''
-               '''{0}'''
-               '''{1}'''
-               '''exec "{2}" "{3}/{4}.py" "$@"\n'''
-               .format(pathLine, dyldLine, starter, pydir, "eric7"))
+    wrapper = (
+        """#!/bin/sh\n"""
+        """\n"""
+        """{0}"""
+        """{1}"""
+        """exec "{2}" "{3}/{4}.py" "$@"\n""".format(
+            pathLine, dyldLine, starter, pydir, "eric7"
+        )
+    )
     copyToFile(wname, wrapper)
-    os.chmod(wname, 0o755)                  # secok
-    
-    shutilCopy(os.path.join(eric7SourceDir, "pixmaps", "eric_2.icns"),
-               os.path.join(directories["icns"], "eric.icns"))
-    
+    os.chmod(wname, 0o755)  # secok
+
+    shutilCopy(
+        os.path.join(eric7SourceDir, "pixmaps", "eric_2.icns"),
+        os.path.join(directories["icns"], "eric.icns"),
+    )
+
     if os.path.exists(os.path.join("eric", "eric7", "UI", "Info.py")):
         # Installing from archive
         from eric.eric7.UI.Info import Version, CopyrightShort
@@ -1177,50 +1269,52 @@
     else:
         Version = "Unknown"
         CopyrightShort = "(c) 2002 - 2022 Detlev Offenbach"
-    
+
     copyToFile(
         os.path.join(directories["contents"], "Info.plist"),
-        '''<?xml version="1.0" encoding="UTF-8"?>\n'''
-        '''<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n'''
-        '''          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n'''
-        '''<plist version="1.0">\n'''
-        '''<dict>\n'''
-        '''    <key>CFBundleExecutable</key>\n'''
-        '''    <string>eric7</string>\n'''
-        '''    <key>CFBundleIconFile</key>\n'''
-        '''    <string>eric.icns</string>\n'''
-        '''    <key>CFBundleInfoDictionaryVersion</key>\n'''
-        '''    <string>{1}</string>\n'''
-        '''    <key>CFBundleName</key>\n'''
-        '''    <string>{0}</string>\n'''
-        '''    <key>CFBundleDisplayName</key>\n'''
-        '''    <string>{0}</string>\n'''
-        '''    <key>CFBundlePackageType</key>\n'''
-        '''    <string>APPL</string>\n'''
-        '''    <key>CFBundleSignature</key>\n'''
-        '''    <string>ERIC-IDE</string>\n'''
-        '''    <key>CFBundleVersion</key>\n'''
-        '''    <string>{1}</string>\n'''
-        '''    <key>CFBundleGetInfoString</key>\n'''
-        '''    <string>{1}, {2}</string>\n'''
-        '''    <key>CFBundleIdentifier</key>\n'''
-        '''    <string>org.python-projects.eric-ide</string>\n'''
-        '''    <key>NSRequiresAquaSystemAppearance</key>\n'''
-        '''    <string>false</string>\n'''
-        '''    <key>LSEnvironment</key>\n'''
-        '''    <dict>\n'''
-        '''        <key>LANG</key>\n'''
-        '''        <string>en_US.UTF-8</string>\n'''
-        '''        <key>LC_ALL</key>\n'''
-        '''        <string>en_US.UTF-8</string>\n'''
-        '''        <key>LC_CTYPE</key>\n'''
-        '''        <string>en_US.UTF-8</string>\n'''
-        '''    </dict>\n'''
-        '''</dict>\n'''
-        '''</plist>\n'''.format(
+        """<?xml version="1.0" encoding="UTF-8"?>\n"""
+        """<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n"""
+        """          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n"""
+        """<plist version="1.0">\n"""
+        """<dict>\n"""
+        """    <key>CFBundleExecutable</key>\n"""
+        """    <string>eric7</string>\n"""
+        """    <key>CFBundleIconFile</key>\n"""
+        """    <string>eric.icns</string>\n"""
+        """    <key>CFBundleInfoDictionaryVersion</key>\n"""
+        """    <string>{1}</string>\n"""
+        """    <key>CFBundleName</key>\n"""
+        """    <string>{0}</string>\n"""
+        """    <key>CFBundleDisplayName</key>\n"""
+        """    <string>{0}</string>\n"""
+        """    <key>CFBundlePackageType</key>\n"""
+        """    <string>APPL</string>\n"""
+        """    <key>CFBundleSignature</key>\n"""
+        """    <string>ERIC-IDE</string>\n"""
+        """    <key>CFBundleVersion</key>\n"""
+        """    <string>{1}</string>\n"""
+        """    <key>CFBundleGetInfoString</key>\n"""
+        """    <string>{1}, {2}</string>\n"""
+        """    <key>CFBundleIdentifier</key>\n"""
+        """    <string>org.python-projects.eric-ide</string>\n"""
+        """    <key>NSRequiresAquaSystemAppearance</key>\n"""
+        """    <string>false</string>\n"""
+        """    <key>LSEnvironment</key>\n"""
+        """    <dict>\n"""
+        """        <key>LANG</key>\n"""
+        """        <string>en_US.UTF-8</string>\n"""
+        """        <key>LC_ALL</key>\n"""
+        """        <string>en_US.UTF-8</string>\n"""
+        """        <key>LC_CTYPE</key>\n"""
+        """        <string>en_US.UTF-8</string>\n"""
+        """    </dict>\n"""
+        """</dict>\n"""
+        """</plist>\n""".format(
             macAppBundleName.replace(".app", ""),
             Version.split(None, 1)[0],
-            CopyrightShort))
+            CopyrightShort,
+        ),
+    )
 
 
 def createInstallConfig():
@@ -1228,67 +1322,72 @@
     Create the installation config dictionary.
     """
     global modDir, platBinDir, cfg, apisDir, installApis
-        
+
     ericdir = os.path.join(modDir, "eric7")
     cfg = {
-        'ericDir': ericdir,
-        'ericPixDir': os.path.join(ericdir, "pixmaps"),
-        'ericIconDir': os.path.join(ericdir, "icons"),
-        'ericDTDDir': os.path.join(ericdir, "DTDs"),
-        'ericCSSDir': os.path.join(ericdir, "CSSs"),
-        'ericStylesDir': os.path.join(ericdir, "Styles"),
-        'ericThemesDir': os.path.join(ericdir, "Themes"),
-        'ericDocDir': os.path.join(ericdir, "Documentation"),
-        'ericExamplesDir': os.path.join(ericdir, "Examples"),
-        'ericTranslationsDir': os.path.join(ericdir, "i18n"),
-        'ericTemplatesDir': os.path.join(ericdir, "DesignerTemplates"),
-        'ericCodeTemplatesDir': os.path.join(ericdir, 'CodeTemplates'),
-        'ericOthersDir': ericdir,
-        'bindir': platBinDir,
-        'mdir': modDir,
+        "ericDir": ericdir,
+        "ericPixDir": os.path.join(ericdir, "pixmaps"),
+        "ericIconDir": os.path.join(ericdir, "icons"),
+        "ericDTDDir": os.path.join(ericdir, "DTDs"),
+        "ericCSSDir": os.path.join(ericdir, "CSSs"),
+        "ericStylesDir": os.path.join(ericdir, "Styles"),
+        "ericThemesDir": os.path.join(ericdir, "Themes"),
+        "ericDocDir": os.path.join(ericdir, "Documentation"),
+        "ericExamplesDir": os.path.join(ericdir, "Examples"),
+        "ericTranslationsDir": os.path.join(ericdir, "i18n"),
+        "ericTemplatesDir": os.path.join(ericdir, "DesignerTemplates"),
+        "ericCodeTemplatesDir": os.path.join(ericdir, "CodeTemplates"),
+        "ericOthersDir": ericdir,
+        "bindir": platBinDir,
+        "mdir": modDir,
     }
     if installApis:
         if apisDir:
-            cfg['apidir'] = apisDir
+            cfg["apidir"] = apisDir
         else:
-            cfg['apidir'] = os.path.join(ericdir, "api")
+            cfg["apidir"] = os.path.join(ericdir, "api")
     else:
-        cfg['apidir'] = ""
+        cfg["apidir"] = ""
+
+
 configLength = 16
-    
+
 
 def createConfig():
     """
     Create a config file with the respective config entries.
     """
     global cfg, macAppBundlePath, configName
-    
+
     apis = []
     if installApis:
         for progLanguage in progLanguages:
             for apiName in sorted(
-                glob.glob(os.path.join(eric7SourceDir, "APIs", progLanguage,
-                                       "*.api"))):
+                glob.glob(os.path.join(eric7SourceDir, "APIs", progLanguage, "*.api"))
+            ):
                 apis.append(os.path.basename(apiName))
             if progLanguage == "Python":
                 # treat Python3 API files the same as Python API files
                 for apiName in sorted(
-                    glob.glob(os.path.join(eric7SourceDir, "APIs", "Python3",
-                                           "*.api"))):
+                    glob.glob(os.path.join(eric7SourceDir, "APIs", "Python3", "*.api"))
+                ):
                     apis.append(os.path.basename(apiName))
-                
+
                 # treat MicroPython API files the same as Python API files
                 for apiName in sorted(
-                    glob.glob(os.path.join(eric7SourceDir, "APIs",
-                                           "MicroPython", "*.api"))):
+                    glob.glob(
+                        os.path.join(eric7SourceDir, "APIs", "MicroPython", "*.api")
+                    )
+                ):
                     apis.append(os.path.basename(apiName))
-    
+
     macConfig = (
-        ("""    'macAppBundlePath': r'{0}',\n"""
-         """    'macAppBundleName': r'{1}',\n""").format(macAppBundlePath,
-                                                         macAppBundleName)
-        if sys.platform == "darwin" else
-        ""
+        (
+            """    'macAppBundlePath': r'{0}',\n"""
+            """    'macAppBundleName': r'{1}',\n"""
+        ).format(macAppBundlePath, macAppBundleName)
+        if sys.platform == "darwin"
+        else ""
     )
     config = (
         """# -*- coding: utf-8 -*-\n"""
@@ -1336,14 +1435,23 @@
         """        '"{{0}}" is not a valid configuration value'"""
         """.format(name))\n"""
     ).format(
-        cfg['ericDir'], cfg['ericPixDir'], cfg['ericIconDir'],
-        cfg['ericDTDDir'], cfg['ericCSSDir'],
-        cfg['ericStylesDir'], cfg['ericThemesDir'], cfg['ericDocDir'],
-        cfg['ericExamplesDir'], cfg['ericTranslationsDir'],
-        cfg['ericTemplatesDir'],
-        cfg['ericCodeTemplatesDir'], cfg['ericOthersDir'],
-        cfg['bindir'], cfg['mdir'],
-        cfg['apidir'], sorted(apis),
+        cfg["ericDir"],
+        cfg["ericPixDir"],
+        cfg["ericIconDir"],
+        cfg["ericDTDDir"],
+        cfg["ericCSSDir"],
+        cfg["ericStylesDir"],
+        cfg["ericThemesDir"],
+        cfg["ericDocDir"],
+        cfg["ericExamplesDir"],
+        cfg["ericTranslationsDir"],
+        cfg["ericTemplatesDir"],
+        cfg["ericCodeTemplatesDir"],
+        cfg["ericOthersDir"],
+        cfg["bindir"],
+        cfg["mdir"],
+        cfg["apidir"],
+        sorted(apis),
         macConfig,
     )
     copyToFile(configName, config)
@@ -1354,7 +1462,7 @@
     Record information about the way eric was installed.
     """
     global createInstallInfoFile, installInfo, installCwd, cfg
-    
+
     if createInstallInfoFile:
         installDateTime = datetime.datetime.now(tz=None)
         try:
@@ -1367,10 +1475,10 @@
         installInfo["install_cwd"] = installCwd
         installInfo["eric"] = cfg["ericDir"]
         installInfo["virtualenv"] = installInfo["eric"].startswith(
-            os.path.expanduser("~"))
+            os.path.expanduser("~")
+        )
         installInfo["installed"] = True
-        installInfo["installed_on"] = installDateTime.strftime(
-            "%Y-%m-%d %H:%M:%S")
+        installInfo["installed_on"] = installDateTime.strftime("%Y-%m-%d %H:%M:%S")
         installInfo["guessed"] = False
         installInfo["edited"] = False
         installInfo["pip"] = False
@@ -1384,7 +1492,7 @@
 def pipInstall(packageName, message, force=True):
     """
     Install the given package via pip.
-    
+
     @param packageName name of the package to be installed
     @type str
     @param message message to be shown to the user
@@ -1396,50 +1504,64 @@
     @rtype bool
     """
     global yes2All
-    
+
     ok = False
     if yes2All or force:
         answer = "y"
     else:
-        print("{0}\nShall '{1}' be installed using pip? (Y/n)"
-              .format(message, packageName), end=" ")
-        answer = input()                            # secok
+        print(
+            "{0}\nShall '{1}' be installed using pip? (Y/n)".format(
+                message, packageName
+            ),
+            end=" ",
+        )
+        answer = input()  # secok
     if answer in ("", "Y", "y"):
-        exitCode = subprocess.run(                  # secok
-            [sys.executable, "-m", "pip", "install", "--prefer-binary",
-             "--upgrade", packageName]
+        exitCode = subprocess.run(  # secok
+            [
+                sys.executable,
+                "-m",
+                "pip",
+                "install",
+                "--prefer-binary",
+                "--upgrade",
+                packageName,
+            ]
         ).returncode
-        ok = (exitCode == 0)
-    
+        ok = exitCode == 0
+
     return ok
 
 
 def isPipOutdated():
     """
     Check, if pip is outdated.
-    
+
     @return flag indicating an outdated pip
     @rtype bool
     """
     try:
-        pipOut = subprocess.run(          # secok
-            [sys.executable, "-m", "pip", "list", "--outdated",
-             "--format=json"],
-            check=True, capture_output=True, text=True
+        pipOut = subprocess.run(  # secok
+            [sys.executable, "-m", "pip", "list", "--outdated", "--format=json"],
+            check=True,
+            capture_output=True,
+            text=True,
         ).stdout
     except (OSError, subprocess.CalledProcessError):
-        pipOut = "[]"       # default empty list
+        pipOut = "[]"  # default empty list
     try:
         jsonList = json.loads(pipOut)
     except Exception:
         jsonList = []
     for package in jsonList:
         if isinstance(package, dict) and package["name"] == "pip":
-            print("'pip' is outdated (installed {0}, available {1})".format(
-                package["version"], package["latest_version"]
-            ))
+            print(
+                "'pip' is outdated (installed {0}, available {1})".format(
+                    package["version"], package["latest_version"]
+                )
+            )
             return True
-    
+
     return False
 
 
@@ -1448,21 +1570,22 @@
     Update the installed pip package.
     """
     global yes2All
-    
+
     if yes2All:
         answer = "y"
     else:
         print("Shall 'pip' be updated (recommended)? (Y/n)", end=" ")
-        answer = input()            # secok
+        answer = input()  # secok
     if answer in ("", "Y", "y"):
-        subprocess.run(             # secok
-            [sys.executable, "-m", "pip", "install", "--upgrade", "pip"])
+        subprocess.run(  # secok
+            [sys.executable, "-m", "pip", "install", "--upgrade", "pip"]
+        )
 
 
 def versionToStr(version):
     """
     Function to convert a version number into a version string.
-    
+
     @param version version number to convert
     @type int
     @return version string
@@ -1470,9 +1593,9 @@
     """
     parts = []
     while version:
-        parts.append(version & 0xff)
+        parts.append(version & 0xFF)
         version >>= 8
-    return '.'.join(str(p) for p in reversed(parts))
+    return ".".join(str(p) for p in reversed(parts))
 
 
 def doDependancyChecks():
@@ -1480,121 +1603,124 @@
     Perform some dependency checks.
     """
     global verbose
-    
+
     requiredVersions = {
-        "pyqt6": 0x60200,               # v6.2.0
-        "pyqt6-charts": 0x60200,        # v6.2.0
-        "pyqt6-webengine": 0x60200,     # v6.2.0
-        "pyqt6-qscintilla": 0x20d00,    # v2.13.0
-        "sip": 0x60100,                 # v6.1.0
+        "pyqt6": 0x60200,  # v6.2.0
+        "pyqt6-charts": 0x60200,  # v6.2.0
+        "pyqt6-webengine": 0x60200,  # v6.2.0
+        "pyqt6-qscintilla": 0x20D00,  # v2.13.0
+        "sip": 0x60100,  # v6.1.0
     }
-    
+
     try:
         isSudo = os.getuid() == 0 and sys.platform != "darwin"
         # disregard sudo installs on macOS
     except AttributeError:
         isSudo = False
-    
-    print('Checking dependencies')
-    
+
+    print("Checking dependencies")
+
     # update pip first even if we don't need to install anything
     if not isSudo and isPipOutdated():
         updatePip()
         print("\n")
-    
+
     # perform dependency checks
     if sys.version_info < (3, 7, 0) or sys.version_info >= (3, 12, 0):
-        print('Sorry, you must have Python 3.7.0 or higher, but less 3.12.0.')
-        print("Yours is {0}.".format(
-            ".".join(str(v) for v in sys.version_info[:3])
-        ))
+        print("Sorry, you must have Python 3.7.0 or higher, but less 3.12.0.")
+        print("Yours is {0}.".format(".".join(str(v) for v in sys.version_info[:3])))
         exit(5)
-    
+
     try:
-        import xml.etree            # __IGNORE_WARNING__
+        import xml.etree  # __IGNORE_WARNING__
     except ImportError:
-        print('Your Python installation is missing the XML module.')
-        print('Please install it and try again.')
+        print("Your Python installation is missing the XML module.")
+        print("Please install it and try again.")
         exit(5)
-    
+
     try:
         from PyQt6.QtCore import qVersion
     except ImportError as err:
         msg = "'PyQt6' could not be detected.{0}".format(
-            "\nError: {0}".format(err) if verbose else "")
+            "\nError: {0}".format(err) if verbose else ""
+        )
         installed = not isSudo and pipInstall(
-            "PyQt6>={0}".format(versionToStr(requiredVersions["pyqt6"])),
-            msg
+            "PyQt6>={0}".format(versionToStr(requiredVersions["pyqt6"])), msg
         )
         if installed:
             # try to import it again
             try:
                 from PyQt6.QtCore import qVersion
             except ImportError as msg:
-                print('Sorry, please install PyQt6.')
-                print('Error: {0}'.format(msg))
+                print("Sorry, please install PyQt6.")
+                print("Error: {0}".format(msg))
                 exit(1)
         else:
-            print('Sorry, please install PyQt6.')
-            print('Error: {0}'.format(msg))
+            print("Sorry, please install PyQt6.")
+            print("Error: {0}".format(msg))
             exit(1)
     print("Found PyQt6")
-    
+
     try:
         pyuic = "pyuic6"
-        from PyQt6 import uic      # __IGNORE_WARNING__
+        from PyQt6 import uic  # __IGNORE_WARNING__
     except ImportError as err:
         print("Sorry, {0} is not installed.".format(pyuic))
         if verbose:
-            print('Error: {0}'.format(err))
+            print("Error: {0}".format(err))
         exit(1)
     print("Found {0}".format(pyuic))
-    
+
     try:
-        from PyQt6 import QtWebEngineWidgets    # __IGNORE_WARNING__
+        from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__
     except ImportError as err:
         if isSudo:
             print("Optional 'PyQt6-WebEngine' could not be detected.")
         else:
-            msg = (
-                "Optional 'PyQt6-WebEngine' could not be detected.{0}"
-                .format("\nError: {0}".format(err) if verbose else "")
+            msg = "Optional 'PyQt6-WebEngine' could not be detected.{0}".format(
+                "\nError: {0}".format(err) if verbose else ""
             )
             pipInstall(
                 "PyQt6-WebEngine>={0}".format(
-                    versionToStr(requiredVersions["pyqt6-webengine"])),
-                msg
+                    versionToStr(requiredVersions["pyqt6-webengine"])
+                ),
+                msg,
             )
-    
+
     try:
-        from PyQt6 import QtCharts    # __IGNORE_WARNING__
+        from PyQt6 import QtCharts  # __IGNORE_WARNING__
     except ImportError as err:
         if isSudo:
             print("Optional 'PyQt6-Charts' could not be detected.")
         else:
             msg = "Optional 'PyQt6-Charts' could not be detected.{0}".format(
-                "\nError: {0}".format(err) if verbose else "")
+                "\nError: {0}".format(err) if verbose else ""
+            )
             pipInstall(
                 "PyQt6-Charts>={0}".format(
-                    versionToStr(requiredVersions["pyqt6-charts"])),
-                msg
+                    versionToStr(requiredVersions["pyqt6-charts"])
+                ),
+                msg,
             )
     print("Found PyQt6-Charts")
-    
+
     try:
-        from PyQt6 import Qsci      # __IGNORE_WARNING__
+        from PyQt6 import Qsci  # __IGNORE_WARNING__
     except ImportError as err:
         msg = "'PyQt6-QScintilla' could not be detected.{0}".format(
-            "\nError: {0}".format(err) if verbose else "")
+            "\nError: {0}".format(err) if verbose else ""
+        )
         installed = not isSudo and pipInstall(
             "PyQt6-QScintilla>={0}".format(
-                versionToStr(requiredVersions["pyqt6-qscintilla"])),
-            msg
+                versionToStr(requiredVersions["pyqt6-qscintilla"])
+            ),
+            msg,
         )
         if installed:
             # try to import it again
             try:
-                from PyQt6 import Qsci      # __IGNORE_WARNING__
+                from PyQt6 import Qsci  # __IGNORE_WARNING__
+
                 message = None
             except ImportError as msg:
                 message = str(msg)
@@ -1603,13 +1729,18 @@
         if message:
             print("Sorry, please install QScintilla2 and")
             print("its PyQt6 wrapper.")
-            print('Error: {0}'.format(message))
+            print("Error: {0}".format(message))
             exit(1)
     print("Found PyQt6-QScintilla")
-    
+
     impModulesList = [
-        "PyQt6.QtGui", "PyQt6.QtNetwork", "PyQt6.QtPrintSupport",
-        "PyQt6.QtSql", "PyQt6.QtSvg", "PyQt6.QtSvgWidgets", "PyQt6.QtWidgets",
+        "PyQt6.QtGui",
+        "PyQt6.QtNetwork",
+        "PyQt6.QtPrintSupport",
+        "PyQt6.QtSql",
+        "PyQt6.QtSvg",
+        "PyQt6.QtSvgWidgets",
+        "PyQt6.QtWidgets",
     ]
     optionalModulesList = {
         # key is pip project name
@@ -1635,7 +1766,7 @@
     }
     if not ignorePyqt6Tools:
         optionalModulesList["qt6-applications"] = ("qt6_applications", "")
-    
+
     # check mandatory modules
     modulesOK = True
     for impModule in impModulesList:
@@ -1644,13 +1775,13 @@
             __import__(impModule)
             print("Found", name)
         except ImportError as err:
-            print('Sorry, please install {0}.'.format(name))
+            print("Sorry, please install {0}.".format(name))
             if verbose:
-                print('Error: {0}'.format(err))
+                print("Error: {0}".format(err))
             modulesOK = False
     if not modulesOK:
         exit(1)
-    
+
     # check optional modules
     for optPackage in optionalModulesList:
         try:
@@ -1658,18 +1789,13 @@
             print("Found", optPackage)
         except ImportError as err:
             if isSudo:
-                print("Optional '{0}' could not be detected."
-                      .format(optPackage))
+                print("Optional '{0}' could not be detected.".format(optPackage))
             else:
                 msg = "Optional '{0}' could not be detected.{1}".format(
-                    optPackage,
-                    "\nError: {0}".format(err) if verbose else ""
+                    optPackage, "\nError: {0}".format(err) if verbose else ""
                 )
-                pipInstall(
-                    optPackage + optionalModulesList[optPackage][1],
-                    msg
-                )
-    
+                pipInstall(optPackage + optionalModulesList[optPackage][1], msg)
+
     # determine the platform dependent black list
     if sys.platform.startswith(("win", "cygwin")):
         PlatformBlackLists = PlatformsBlackLists["windows"]
@@ -1677,21 +1803,21 @@
         PlatformBlackLists = PlatformsBlackLists["linux"]
     else:
         PlatformBlackLists = PlatformsBlackLists["mac"]
-    
+
     print("\nVersion Information")
     print("-------------------")
-    
+
     print("Python: {0:d}.{1:d}.{2:d}".format(*sys.version_info[:3]))
-    
+
     # check version of Qt
     # ===================
-    qtMajor = int(qVersion().split('.')[0])
-    qtMinor = int(qVersion().split('.')[1])
+    qtMajor = int(qVersion().split(".")[0])
+    qtMinor = int(qVersion().split(".")[1])
     print("Qt6: {0}".format(qVersion().strip()))
     if qtMajor == 6 and qtMinor < 1:
-        print('Sorry, you must have Qt version 6.1.0 or better.')
+        print("Sorry, you must have Qt version 6.1.0 or better.")
         exit(2)
-    
+
     # check version of sip
     # ====================
     with contextlib.suppress(ImportError, AttributeError):
@@ -1701,83 +1827,86 @@
             import sip
         print("sip:", sip.SIP_VERSION_STR.strip())
         # always assume, that snapshots or dev versions are new enough
-        if (
-            "snapshot" not in sip.SIP_VERSION_STR and
-            "dev" not in sip.SIP_VERSION_STR
-        ):
+        if "snapshot" not in sip.SIP_VERSION_STR and "dev" not in sip.SIP_VERSION_STR:
             if sip.SIP_VERSION < requiredVersions["sip"]:
                 print(
-                    'Sorry, you must have sip {0} or higher or'
-                    ' a recent development release.'
-                    .format(versionToStr(requiredVersions["sip"]))
+                    "Sorry, you must have sip {0} or higher or"
+                    " a recent development release.".format(
+                        versionToStr(requiredVersions["sip"])
+                    )
                 )
                 exit(3)
             # check for blacklisted versions
             for vers in BlackLists["sip"] + PlatformBlackLists["sip"]:
                 if vers == sip.SIP_VERSION:
                     print(
-                        'Sorry, sip version {0} is not compatible with eric.'
-                        .format(versionToStr(vers)))
-                    print('Please install another version.')
+                        "Sorry, sip version {0} is not compatible with eric.".format(
+                            versionToStr(vers)
+                        )
+                    )
+                    print("Please install another version.")
                     exit(3)
-    
+
     # check version of PyQt6
     # ======================
     from PyQt6.QtCore import PYQT_VERSION, PYQT_VERSION_STR
+
     print("PyQt6:", PYQT_VERSION_STR.strip())
     # always assume, that snapshots or dev versions are new enough
     if "snapshot" not in PYQT_VERSION_STR and "dev" not in PYQT_VERSION_STR:
         if PYQT_VERSION < requiredVersions["pyqt6"]:
             print(
-                'Sorry, you must have PyQt {0} or better or'
-                ' a recent development release.'
-                .format(versionToStr(requiredVersions["pyqt6"]))
+                "Sorry, you must have PyQt {0} or better or"
+                " a recent development release.".format(
+                    versionToStr(requiredVersions["pyqt6"])
+                )
             )
             exit(4)
         # check for blacklisted versions
         for vers in BlackLists["PyQt6"] + PlatformBlackLists["PyQt6"]:
             if vers == PYQT_VERSION:
-                print('Sorry, PyQt version {0} is not compatible with eric.'
-                      .format(versionToStr(vers)))
-                print('Please install another version.')
+                print(
+                    "Sorry, PyQt version {0} is not compatible with eric.".format(
+                        versionToStr(vers)
+                    )
+                )
+                print("Please install another version.")
                 exit(4)
-    
+
     # check version of QScintilla
     # ===========================
     from PyQt6.Qsci import QSCINTILLA_VERSION, QSCINTILLA_VERSION_STR
+
     print("PyQt6-QScintilla:", QSCINTILLA_VERSION_STR.strip())
     # always assume, that snapshots or dev versions are new enough
-    if (
-        "snapshot" not in QSCINTILLA_VERSION_STR and
-        "dev" not in QSCINTILLA_VERSION_STR
-    ):
+    if "snapshot" not in QSCINTILLA_VERSION_STR and "dev" not in QSCINTILLA_VERSION_STR:
         if QSCINTILLA_VERSION < requiredVersions["pyqt6-qscintilla"]:
             print(
-                'Sorry, you must have PyQt6-QScintilla {0} or higher or'
-                ' a recent development release.'
-                .format(versionToStr(requiredVersions["pyqt6-qscintilla"]))
+                "Sorry, you must have PyQt6-QScintilla {0} or higher or"
+                " a recent development release.".format(
+                    versionToStr(requiredVersions["pyqt6-qscintilla"])
+                )
             )
             exit(5)
         # check for blacklisted versions
-        for vers in (
-            BlackLists["QScintilla2"] +
-            PlatformBlackLists["QScintilla2"]
-        ):
+        for vers in BlackLists["QScintilla2"] + PlatformBlackLists["QScintilla2"]:
             if vers == QSCINTILLA_VERSION:
                 print(
-                    'Sorry, QScintilla2 version {0} is not compatible with'
-                    ' eric.'.format(versionToStr(vers)))
-                print('Please install another version.')
+                    "Sorry, QScintilla2 version {0} is not compatible with"
+                    " eric.".format(versionToStr(vers))
+                )
+                print("Please install another version.")
                 exit(5)
-    
+
     # print version info for additional modules
     with contextlib.suppress(NameError, AttributeError):
         print("PyQt6-Charts:", QtCharts.PYQT_CHART_VERSION_STR)
-    
+
     with contextlib.suppress(ImportError, AttributeError):
         from PyQt6 import QtWebEngineCore
+
         print("PyQt6-WebEngine:", QtWebEngineCore.PYQT_WEBENGINE_VERSION_STR)
-    
+
     print()
     print("All dependencies ok.")
     print()
@@ -1787,7 +1916,7 @@
     """
     Local function to create the Python source file name for the compiled
     .ui file.
-    
+
     @param py_dir suggested name of the directory (string)
     @param py_file suggested name for the compile source file (string)
     @return tuple of directory name (string) and source file name (string)
@@ -1800,30 +1929,30 @@
     Compile the .ui files to Python sources.
     """
     from PyQt6.uic import compileUiDir
+
     compileUiDir(eric7SourceDir, True, __pyName)
 
 
 def prepareInfoFile(fileName):
     """
     Function to prepare an Info.py file when installing from source.
-    
+
     @param fileName name of the Python file containing the info (string)
     """
     if not fileName:
         return
-    
+
     with contextlib.suppress(OSError):
         os.rename(fileName, fileName + ".orig")
     localHg = (
         os.path.join(sys.exec_prefix, "Scripts", "hg.exe")
-        if sys.platform.startswith(("win", "cygwin")) else
-        os.path.join(sys.exec_prefix, "bin", "hg")
+        if sys.platform.startswith(("win", "cygwin"))
+        else os.path.join(sys.exec_prefix, "bin", "hg")
     )
     for hg in (localHg, "hg"):
         with contextlib.suppress(OSError, subprocess.CalledProcessError):
-            hgOut = subprocess.run(                     # secok
-                [hg, "identify", "-i"], check=True,
-                capture_output=True, text=True
+            hgOut = subprocess.run(  # secok
+                [hg, "identify", "-i"], check=True, capture_output=True, text=True
             ).stdout
             if hgOut:
                 break
@@ -1835,9 +1964,8 @@
             hgOut = hgOut[:-1]
         with open(fileName + ".orig", "r", encoding="utf-8") as f:
             text = f.read()
-        text = (
-            text.replace("@@REVISION@@", hgOut)
-            .replace("@@VERSION@@", "rev_" + hgOut)
+        text = text.replace("@@REVISION@@", hgOut).replace(
+            "@@VERSION@@", "rev_" + hgOut
         )
         copyToFile(fileName, text)
     else:
@@ -1847,7 +1975,7 @@
 def getWinregEntry(name, path):
     """
     Function to get an entry from the Windows Registry.
-    
+
     @param name variable name
     @type str
     @param path registry path of the variable
@@ -1859,10 +1987,9 @@
         import winreg
     except ImportError:
         return None
-    
+
     try:
-        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0,
-                                     winreg.KEY_READ)
+        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, winreg.KEY_READ)
         value, _ = winreg.QueryValueEx(registryKey, name)
         winreg.CloseKey(registryKey)
         return value
@@ -1873,7 +2000,7 @@
 def createWindowsShortcut(linkPath, targetPath, iconPath):
     """
     Create Windows shortcut.
-    
+
     @param linkPath path of the shortcut file
     @type str
     @param targetPath path the shortcut shall point to
@@ -1883,9 +2010,9 @@
     """
     from win32com.client import Dispatch
     from pywintypes import com_error
-    
+
     with contextlib.suppress(com_error):
-        shell = Dispatch('WScript.Shell')
+        shell = Dispatch("WScript.Shell")
         shortcut = shell.CreateShortCut(linkPath)
         shortcut.Targetpath = targetPath
         shortcut.WorkingDirectory = os.path.dirname(targetPath)
@@ -1896,7 +2023,7 @@
 def windowsDesktopNames():
     """
     Function to generate the link names for the Windows Desktop.
-    
+
     @return list of desktop link names
     @rtype list of str
     """
@@ -1906,33 +2033,36 @@
 def windowsDesktopEntries():
     """
     Function to generate data for the Windows Desktop links.
-    
+
     @return list of tuples containing the desktop link name,
         the link target and the icon target
     @rtype list of tuples of (str, str, str)
     """
     global cfg
-    
+
     majorVersion, minorVersion = sys.version_info[:2]
     entriesTemplates = [
-        ("eric7 (Python {0}.{1}).lnk",
-         os.path.join(cfg["bindir"], "eric7.cmd"),
-         os.path.join(cfg["ericPixDir"], "eric7.ico")),
-        ("eric7 Browser (Python {0}.{1}).lnk",
-         os.path.join(cfg["bindir"], "eric7_browser.cmd"),
-         os.path.join(cfg["ericPixDir"], "ericWeb48.ico")),
+        (
+            "eric7 (Python {0}.{1}).lnk",
+            os.path.join(cfg["bindir"], "eric7.cmd"),
+            os.path.join(cfg["ericPixDir"], "eric7.ico"),
+        ),
+        (
+            "eric7 Browser (Python {0}.{1}).lnk",
+            os.path.join(cfg["bindir"], "eric7_browser.cmd"),
+            os.path.join(cfg["ericPixDir"], "ericWeb48.ico"),
+        ),
     ]
-    
+
     return [
-        (e[0].format(majorVersion, minorVersion), e[1], e[2])
-        for e in entriesTemplates
+        (e[0].format(majorVersion, minorVersion), e[1], e[2]) for e in entriesTemplates
     ]
 
 
 def windowsProgramsEntry():
     """
     Function to generate the name of the Start Menu top entry.
-    
+
     @return name of the Start Menu top entry
     @rtype str
     """
@@ -1957,39 +2087,45 @@
     global createInstallInfoFile, installCwd
     global ignorePyqt6Tools
     global verbose
-    
+
     if sys.version_info < (3, 7, 0) or sys.version_info > (3, 99, 99):
-        print('Sorry, eric requires at least Python 3.7 for running.')
+        print("Sorry, eric requires at least Python 3.7 for running.")
         exit(5)
-    
+
     progName = os.path.basename(argv[0])
-    
+
     installCwd = os.getcwd()
-    
+
     if os.path.dirname(argv[0]):
         os.chdir(os.path.dirname(argv[0]))
-    
+
     initGlobals()
 
     try:
         if sys.platform.startswith(("win", "cygwin")):
             optlist, args = getopt.getopt(
-                argv[1:], "chvxza:b:d:f:",
-                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"])
+                argv[1:],
+                "chvxza:b:d:f:",
+                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"],
+            )
         elif sys.platform == "darwin":
             optlist, args = getopt.getopt(
-                argv[1:], "chvxza:b:d:f:i:m:n:p:",
-                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"])
+                argv[1:],
+                "chvxza:b:d:f:i:m:n:p:",
+                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"],
+            )
         else:
             optlist, args = getopt.getopt(
-                argv[1:], "chvxza:b:d:f:i:",
-                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"])
+                argv[1:],
+                "chvxza:b:d:f:i:",
+                ["help", "no-apis", "no-info", "no-tools", "verbose", "yes"],
+            )
     except getopt.GetoptError as err:
         print(err)
         usage()
 
     global platBinDir
-    
+
     depChecks = True
 
     for opt, arg in optlist:
@@ -2012,11 +2148,13 @@
         elif opt == "-f":
             with open(arg) as f:
                 try:
-                    exec(compile(f.read(), arg, 'exec'), globals())
+                    exec(compile(f.read(), arg, "exec"), globals())
                     # secok
                     if len(cfg) != configLength:
-                        print("The configuration dictionary in '{0}' is"
-                              " incorrect. Aborting".format(arg))
+                        print(
+                            "The configuration dictionary in '{0}' is"
+                            " incorrect. Aborting".format(arg)
+                        )
                         exit(6)
                 except Exception:
                     cfg = {}
@@ -2038,47 +2176,47 @@
             createInstallInfoFile = False
         elif opt in ["-v", "--verbose"]:
             verbose = True
-    
+
     infoName = ""
     installFromSource = not os.path.isdir(sourceDir)
-    
+
     # check dependencies
     if depChecks:
         doDependancyChecks()
-    
+
     if installFromSource:
         sourceDir = os.path.abspath("..")
-    
+
     eric7SourceDir = (
         os.path.join(sourceDir, "eric7")
-        if os.path.exists(os.path.join(sourceDir, "eric7")) else
-        os.path.join(sourceDir, "src", "eric7")
+        if os.path.exists(os.path.join(sourceDir, "eric7"))
+        else os.path.join(sourceDir, "src", "eric7")
     )
-    
+
     # cleanup source if installing from source
     if installFromSource:
         print("Cleaning up source ...")
         cleanupSource(eric7SourceDir)
         print()
-        
+
         configName = os.path.join(eric7SourceDir, "eric7config.py")
         if os.path.exists(os.path.join(sourceDir, ".hg")):
             # we are installing from source with repo
             infoName = os.path.join(eric7SourceDir, "UI", "Info.py")
             prepareInfoFile(infoName)
-    
+
     if len(cfg) == 0:
         createInstallConfig()
-    
+
     # get rid of development config file, if it exists
     with contextlib.suppress(OSError):
         if installFromSource:
             os.rename(configName, configName + ".orig")
-            configNameC = configName + 'c'
+            configNameC = configName + "c"
             if os.path.exists(configNameC):
                 os.remove(configNameC)
         os.remove(configName)
-    
+
     # cleanup old installation
     print("Cleaning up old installation ...")
     try:
@@ -2088,7 +2226,7 @@
             else:
                 cleanUp()
     except OSError as msg:
-        sys.stderr.write('Error: {0}\nTry install as root.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry install as root.\n".format(msg))
         exit(7)
 
     # Create a config file and delete the default one
@@ -2096,16 +2234,16 @@
     createConfig()
 
     createInstallInfo()
-    
+
     # Compile .ui files
     print("\nCompiling user interface files ...")
     # step 1: remove old Ui_*.py files
     for root, _, files in os.walk(sourceDir):
-        for file in [f for f in files if fnmatch.fnmatch(f, 'Ui_*.py')]:
+        for file in [f for f in files if fnmatch.fnmatch(f, "Ui_*.py")]:
             os.remove(os.path.join(root, file))
     # step 2: compile the forms
     compileUiFiles()
-    
+
     if doCompile:
         print("\nCompiling source files ...")
         skipRe = re.compile(r"DebugClients[\\/]Python[\\/]")
@@ -2113,48 +2251,50 @@
         if distDir:
             compileall.compile_dir(
                 eric7SourceDir,
-                ddir=os.path.join(distDir, modDir, cfg['ericDir']),
+                ddir=os.path.join(distDir, modDir, cfg["ericDir"]),
                 rx=skipRe,
-                quiet=True)
+                quiet=True,
+            )
             py_compile.compile(
-                configName,
-                dfile=os.path.join(distDir, modDir, "eric7config.py"))
+                configName, dfile=os.path.join(distDir, modDir, "eric7config.py")
+            )
         else:
             compileall.compile_dir(
                 eric7SourceDir,
-                ddir=os.path.join(modDir, cfg['ericDir']),
+                ddir=os.path.join(modDir, cfg["ericDir"]),
                 rx=skipRe,
-                quiet=True)
-            py_compile.compile(configName,
-                               dfile=os.path.join(modDir, "eric7config.py"))
+                quiet=True,
+            )
+            py_compile.compile(configName, dfile=os.path.join(modDir, "eric7config.py"))
         sys.stdout = sys.__stdout__
     print("\nInstalling eric ...")
     res = installEric()
-    
+
     if createInstallInfoFile:
-        with open(os.path.join(cfg["ericDir"],
-                               installInfoName), "w") as installInfoFile:
+        with open(
+            os.path.join(cfg["ericDir"], installInfoName), "w"
+        ) as installInfoFile:
             json.dump(installInfo, installInfoFile, indent=2)
-    
+
     # do some cleanup
     with contextlib.suppress(OSError):
         if installFromSource:
             os.remove(configName)
-            configNameC = configName + 'c'
+            configNameC = configName + "c"
             if os.path.exists(configNameC):
                 os.remove(configNameC)
             os.rename(configName + ".orig", configName)
     with contextlib.suppress(OSError):
         if installFromSource and infoName:
             os.remove(infoName)
-            infoNameC = infoName + 'c'
+            infoNameC = infoName + "c"
             if os.path.exists(infoNameC):
                 os.remove(infoNameC)
             os.rename(infoName + ".orig", infoName)
-    
+
     print("\nInstallation complete.")
     print()
-    
+
     exit(res)
 
 
@@ -2164,9 +2304,11 @@
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output"""
-              """ of the program,\nincluding the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output"""
+            """ of the program,\nincluding the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/scripts/uninstall-debugclients.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/uninstall-debugclients.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,17 +27,17 @@
 def exit(rcode=0):
     """
     Exit the install script.
-    
+
     @param rcode result code to report back (integer)
     """
     global currDir
-    
+
     if sys.platform.startswith("win"):
         with contextlib.suppress():
-            input("Press enter to continue...")             # secok
-    
+            input("Press enter to continue...")  # secok
+
     os.chdir(currDir)
-    
+
     sys.exit(rcode)
 
 
@@ -64,7 +64,7 @@
     """
     global modDir, pyModDir
 
-    modDir = sysconfig.get_path('platlib')
+    modDir = sysconfig.get_path("platlib")
     pyModDir = modDir
 
 
@@ -73,15 +73,14 @@
     Uninstall the old eric debug client files.
     """
     global pyModDir
-    
+
     try:
         # Cleanup the install directories
         dirname = os.path.join(pyModDir, installPackage)
         if os.path.exists(dirname):
             shutil.rmtree(dirname, True)
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry uninstall with admin rights.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry uninstall with admin rights.\n".format(msg))
         exit(7)
 
 
@@ -98,7 +97,7 @@
     # Parse the command line.
     global progName
     progName = os.path.basename(argv[0])
-    
+
     try:
         optlist, args = getopt.getopt(argv[1:], "hy")
     except getopt.GetoptError:
@@ -107,24 +106,26 @@
     for opt, _arg in optlist:
         if opt in ["-h", "--help"]:
             usage(0)
-    
+
     print("\nUninstalling eric debug clients ...")
     uninstallEricDebugClients()
     print("\nUninstallation complete.")
     print()
-    
+
     exit(0)
-    
-    
+
+
 if __name__ == "__main__":
     try:
         main(sys.argv)
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output"""
-              """ of the program,\nincluding the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output"""
+            """ of the program,\nincluding the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/scripts/uninstall.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/scripts/uninstall.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,25 +31,26 @@
 def exit(rcode=0):
     """
     Exit the uninstall script.
-    
+
     @param rcode result code to report back (integer)
     """
     global currDir
-    
+
     # restore the local eric7config.py
     if os.path.exists("eric7config.py.orig"):
         if os.path.exists("eric7config.py"):
             os.remove("eric7config.py")
         os.rename("eric7config.py.orig", "eric7config.py")
-    
+
     if sys.platform.startswith(("win", "cygwin")):
         with contextlib.suppress():
-            input("Press enter to continue...")         # secok
-    
+            input("Press enter to continue...")  # secok
+
     os.chdir(currDir)
-    
+
     sys.exit(rcode)
 
+
 # get a local eric7config.py out of the way
 if os.path.exists("eric7config.py"):
     os.rename("eric7config.py", "eric7config.py.orig")
@@ -86,21 +87,21 @@
     """
     global pyModDir
 
-    pyModDir = sysconfig.get_path('platlib')
+    pyModDir = sysconfig.get_path("platlib")
 
 
 def wrapperNames(dname, wfile):
     """
     Create the platform specific names for the wrapper script.
-    
+
     @param dname name of the directory to place the wrapper into
     @param wfile basename (without extension) of the wrapper script
     @return the names of the wrapper scripts
     """
     wnames = (
         (dname + "\\" + wfile + ".cmd", dname + "\\" + wfile + ".bat")
-        if sys.platform.startswith(("win", "cygwin")) else
-        (dname + "/" + wfile, )
+        if sys.platform.startswith(("win", "cygwin"))
+        else (dname + "/" + wfile,)
     )
 
     return wnames
@@ -111,35 +112,51 @@
     Uninstall the eric files.
     """
     global pyModDir
-    
+
     # Remove the menu entry for Linux systems
     if sys.platform.startswith("linux"):
         uninstallLinuxSpecifics()
     # Remove the Desktop and Start Menu entries for Windows systems
     elif sys.platform.startswith(("win", "cygwin")):
         uninstallWindowsLinks()
-    
+
     # Remove the wrapper scripts
     rem_wnames = [
-        "eric7_api", "eric7_browser", "eric7_compare", "eric7_configure",
-        "eric7_diff", "eric7_doc", "eric7_editor", "eric7_hexeditor",
-        "eric7_iconeditor", "eric7_plugininstall", "eric7_pluginrepository",
-        "eric7_pluginuninstall", "eric7_qregularexpression", "eric7_re",
-        "eric7_shell", "eric7_snap", "eric7_sqlbrowser", "eric7_testing",
-        "eric7_tray", "eric7_trpreviewer", "eric7_uipreviewer",
-        "eric7_virtualenv", "eric7",
+        "eric7_api",
+        "eric7_browser",
+        "eric7_compare",
+        "eric7_configure",
+        "eric7_diff",
+        "eric7_doc",
+        "eric7_editor",
+        "eric7_hexeditor",
+        "eric7_iconeditor",
+        "eric7_plugininstall",
+        "eric7_pluginrepository",
+        "eric7_pluginuninstall",
+        "eric7_qregularexpression",
+        "eric7_re",
+        "eric7_shell",
+        "eric7_snap",
+        "eric7_sqlbrowser",
+        "eric7_testing",
+        "eric7_tray",
+        "eric7_trpreviewer",
+        "eric7_uipreviewer",
+        "eric7_virtualenv",
+        "eric7",
         # obsolete scripts below
         "eric7_unittest",
     ]
-    
+
     try:
         for rem_wname in rem_wnames:
-            for rwname in wrapperNames(getConfig('bindir'), rem_wname):
+            for rwname in wrapperNames(getConfig("bindir"), rem_wname):
                 if os.path.exists(rwname):
                     os.remove(rwname)
-        
+
         # Cleanup our config file(s)
-        for name in ['eric7config.py', 'eric7config.pyc', 'eric7.pth']:
+        for name in ["eric7config.py", "eric7config.pyc", "eric7.pth"]:
             e5cfile = os.path.join(pyModDir, name)
             if os.path.exists(e5cfile):
                 os.remove(e5cfile)
@@ -147,54 +164,64 @@
             path, ext = os.path.splitext(e5cfile)
             for f in glob.glob("{0}.*{1}".format(path, ext)):
                 os.remove(f)
-        
+
         # Cleanup the install directories
-        for name in ['ericExamplesDir', 'ericDocDir', 'ericDTDDir',
-                     'ericCSSDir', 'ericIconDir', 'ericPixDir',
-                     'ericTemplatesDir', 'ericCodeTemplatesDir',
-                     'ericOthersDir', 'ericStylesDir', 'ericThemesDir',
-                     'ericDir']:
+        for name in [
+            "ericExamplesDir",
+            "ericDocDir",
+            "ericDTDDir",
+            "ericCSSDir",
+            "ericIconDir",
+            "ericPixDir",
+            "ericTemplatesDir",
+            "ericCodeTemplatesDir",
+            "ericOthersDir",
+            "ericStylesDir",
+            "ericThemesDir",
+            "ericDir",
+        ]:
             with contextlib.suppress(AttributeError):
                 dirpath = getConfig(name)
                 if os.path.exists(dirpath):
                     shutil.rmtree(dirpath, True)
-        
+
         # Cleanup translations
         for name in glob.glob(
-                os.path.join(getConfig('ericTranslationsDir'), 'eric7_*.qm')):
+            os.path.join(getConfig("ericTranslationsDir"), "eric7_*.qm")
+        ):
             if os.path.exists(name):
                 os.remove(name)
-        
+
         # Cleanup API files
-        apidir = getConfig('apidir')
+        apidir = getConfig("apidir")
         if apidir:
             for progLanguage in progLanguages:
-                for name in getConfig('apis'):
+                for name in getConfig("apis"):
                     apiname = os.path.join(apidir, progLanguage.lower(), name)
                     if os.path.exists(apiname):
                         os.remove(apiname)
                 for apiname in glob.glob(
-                        os.path.join(apidir, progLanguage.lower(), "*.bas")):
+                    os.path.join(apidir, progLanguage.lower(), "*.bas")
+                ):
                     if os.path.basename(apiname) != "eric7.bas":
                         os.remove(apiname)
-        
+
         if sys.platform == "darwin":
             # delete the Mac app bundle
             uninstallMacAppBundle()
-        
+
         # remove plug-in directories
         removePluginDirectories()
-        
+
         # remove the eric data directory
         removeDataDirectory()
-        
+
         # remove the eric configuration directory
         removeConfigurationData()
-        
+
         print("\nUninstallation completed")
     except OSError as msg:
-        sys.stderr.write(
-            'Error: {0}\nTry uninstall with admin rights.\n'.format(msg))
+        sys.stderr.write("Error: {0}\nTry uninstall with admin rights.\n".format(msg))
         exit(7)
 
 
@@ -203,16 +230,16 @@
     Clean up the Desktop and Start Menu entries for Windows.
     """
     try:
-        from pywintypes import com_error        # __IGNORE_WARNING__
+        from pywintypes import com_error  # __IGNORE_WARNING__
     except ImportError:
         # links were not created by install.py
         return
-    
+
     regPath = (
-        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" +
-        "\\User Shell Folders"
+        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+        + "\\User Shell Folders"
     )
-    
+
     # 1. cleanup desktop links
     regName = "Desktop"
     desktopEntry = getWinregEntry(regName, regPath)
@@ -226,7 +253,7 @@
                 except OSError:
                     # maybe restrictions prohibited link removal
                     print("Could not remove '{0}'.".format(linkPath))
-    
+
     # 2. cleanup start menu entry
     regName = "Programs"
     programsEntry = getWinregEntry(regName, regPath)
@@ -287,11 +314,10 @@
     except AttributeError:
         macAppBundlePath = defaultMacAppBundlePath
         macAppBundleName = defaultMacAppBundleName
-    for bundlePath in [os.path.join(defaultMacAppBundlePath,
-                                    macAppBundleName),
-                       os.path.join(macAppBundlePath,
-                                    macAppBundleName),
-                       ]:
+    for bundlePath in [
+        os.path.join(defaultMacAppBundlePath, macAppBundleName),
+        os.path.join(macAppBundlePath, macAppBundleName),
+    ]:
         if os.path.exists(bundlePath):
             shutil.rmtree(bundlePath)
 
@@ -301,15 +327,15 @@
     Remove the plug-in directories.
     """
     pathsToRemove = []
-    
-    globalPluginsDir = os.path.join(getConfig('mdir'), "eric7plugins")
+
+    globalPluginsDir = os.path.join(getConfig("mdir"), "eric7plugins")
     if os.path.exists(globalPluginsDir):
         pathsToRemove.append(globalPluginsDir)
-    
+
     localPluginsDir = os.path.join(getConfigDir(), "eric7plugins")
     if os.path.exists(localPluginsDir):
         pathsToRemove.append(localPluginsDir)
-    
+
     if pathsToRemove:
         print("Found these plug-in directories")
         for path in pathsToRemove:
@@ -349,9 +375,13 @@
         print("No PyQt variant installed. The configuration directory")
         print("cannot be determined. You have to remove it manually.\n")
         return
-    
-    settings = QSettings(QSettings.Format.IniFormat, QSettings.Scope.UserScope,
-                         settingsNameOrganization, settingsNameGlobal)
+
+    settings = QSettings(
+        QSettings.Format.IniFormat,
+        QSettings.Scope.UserScope,
+        settingsNameOrganization,
+        settingsNameGlobal,
+    )
     settingsDir = os.path.dirname(settings.fileName())
     if os.path.exists(settingsDir):
         print("Found the eric configuration directory")
@@ -367,7 +397,7 @@
 def getConfigDir():
     """
     Module function to get the name of the directory storing the config data.
-    
+
     @return directory name of the config dir (string)
     """
     cdn = ".eric7"
@@ -377,7 +407,7 @@
 def getWinregEntry(name, path):
     """
     Function to get an entry from the Windows Registry.
-    
+
     @param name variable name
     @type str
     @param path registry path of the variable
@@ -387,9 +417,9 @@
     """
     # From http://stackoverflow.com/a/35286642
     import winreg
+
     try:
-        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0,
-                                     winreg.KEY_READ)
+        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, winreg.KEY_READ)
         value, _ = winreg.QueryValueEx(registryKey, name)
         winreg.CloseKey(registryKey)
         return value
@@ -400,7 +430,7 @@
 def windowsDesktopNames():
     """
     Function to generate the link names for the Windows Desktop.
-    
+
     @return list of desktop link names
     @rtype list of str
     """
@@ -409,14 +439,14 @@
         "eric7 (Python {0}.{1}).lnk",
         "eric7 Browser (Python {0}.{1}).lnk",
     ]
-    
+
     return [ll.format(majorVersion, minorVersion) for ll in linkTemplates]
 
 
 def windowsProgramsEntry():
     """
     Function to generate the name of the Start Menu top entry.
-    
+
     @return name of the Start Menu top entry
     @rtype str
     """
@@ -448,12 +478,12 @@
     for opt, _arg in optlist:
         if opt == "-h":
             usage(0)
-    
+
     print("\nUninstalling eric ...")
     uninstallEric()
     print("\nUninstallation complete.")
     print()
-    
+
     exit(0)
 
 
@@ -463,10 +493,12 @@
     except SystemExit:
         raise
     except Exception:
-        print("""An internal error occured.  Please report all the output of"""
-              """ the program,\n"""
-              """including the following traceback, to"""
-              """ eric-bugs@eric-ide.python-projects.org.\n""")
+        print(
+            """An internal error occured.  Please report all the output of"""
+            """ the program,\n"""
+            """including the following traceback, to"""
+            """ eric-bugs@eric-ide.python-projects.org.\n"""
+        )
         raise
 
 #
--- a/src/eric7/CodeFormatting/BlackConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CodeFormatting/BlackConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,10 +30,11 @@
     """
     Class implementing a dialog to enter the parameters for a Black formatting run.
     """
+
     def __init__(self, withProject=True, parent=None):
         """
         Constructor
-        
+
         @param withProject flag indicating to look for project configurations
             (defaults to True)
         @type bool
@@ -42,33 +43,32 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__project = ericApp().getObject("Project") if withProject else None
-        
+
         indentTabWidth = (
             QFontMetricsF(self.excludeEdit.font()).horizontalAdvance(" ") * 2
         )
         self.excludeEdit.document().setIndentWidth(indentTabWidth)
         self.excludeEdit.setTabStopDistance(indentTabWidth)
-        
+
         self.__pyprojectData = {}
         self.__projectData = {}
-        
+
         self.__tomlButton = self.buttonBox.addButton(
-            self.tr("Generate TOML"),
-            QDialogButtonBox.ButtonRole.ActionRole
+            self.tr("Generate TOML"), QDialogButtonBox.ButtonRole.ActionRole
         )
-        self.__tomlButton.setToolTip(self.tr(
-            "Place a code snippet for 'pyproject.toml' into the clipboard."
-        ))
+        self.__tomlButton.setToolTip(
+            self.tr("Place a code snippet for 'pyproject.toml' into the clipboard.")
+        )
         self.__tomlButton.clicked.connect(self.__createTomlSnippet)
-        
+
         # setup the source combobox
         self.sourceComboBox.addItem("", "")
         if self.__project:
-            pyprojectPath = pathlib.Path(
-                self.__project.getProjectPath()
-            ) / "pyproject.toml"
+            pyprojectPath = (
+                pathlib.Path(self.__project.getProjectPath()) / "pyproject.toml"
+            )
             if pyprojectPath.exists():
                 with contextlib.suppress(tomlkit.exceptions.ParseError, OSError):
                     with pyprojectPath.open("r", encoding="utf-8") as f:
@@ -87,13 +87,13 @@
                 self.sourceComboBox.addItem(self.tr("Project File"), "project")
         self.sourceComboBox.addItem(self.tr("Defaults"), "default")
         self.sourceComboBox.addItem(self.tr("Configuration Below"), "dialog")
-        
+
         self.__populateTargetVersionsList()
-        
+
         if self.__projectData:
             source = self.__projectData.get("source", "")
             self.sourceComboBox.setCurrentIndex(self.sourceComboBox.findData(source))
-    
+
     def __populateTargetVersionsList(self):
         """
         Private method to populate the target versions list widget with checkable
@@ -111,18 +111,18 @@
             itm.setData(Qt.ItemDataRole.UserRole, target[2])
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     def __loadConfiguration(self, configurationDict):
         """
         Private method to load the configuration section with data of the given
         dictionary.
-        
+
         @param configurationDict reference to the data to be loaded
         @type dict
         """
         confDict = copy.deepcopy(BlackUtilities.getDefaultConfiguration())
         confDict.update(configurationDict)
-        
+
         self.lineLengthSpinBox.setValue(int(confDict["line-length"]))
         self.skipStringNormalCheckBox.setChecked(confDict["skip-string-normalization"])
         self.skipMagicCommaCheckBox.setChecked(confDict["skip-magic-trailing-comma"])
@@ -132,22 +132,22 @@
             itm.setCheckState(
                 Qt.CheckState.Checked
                 if itm.data(Qt.ItemDataRole.UserRole).lower()
-                in confDict["target-version"] else
-                Qt.CheckState.Unchecked
+                in confDict["target-version"]
+                else Qt.CheckState.Unchecked
             )
-    
+
     @pyqtSlot(str)
     def on_sourceComboBox_currentTextChanged(self, selection):
         """
         Private slot to handle the selection of a configuration source.
-        
+
         @param selection text of the currently selected item
         @type str
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
             bool(selection)
         )
-        
+
         source = self.sourceComboBox.currentData()
         if source == "pyproject":
             self.__loadConfiguration(self.__pyprojectData)
@@ -158,14 +158,14 @@
         elif source == "dialog":
             # just leave the current entries
             pass
-    
+
     @pyqtSlot()
     def on_excludeEdit_textChanged(self):
         """
         Private slot to enable the validate button depending on the exclude text.
         """
         self.validateButton.setEnabled(bool(self.excludeEdit.toPlainText()))
-    
+
     @pyqtSlot()
     def on_validateButton_clicked(self):
         """
@@ -177,19 +177,15 @@
             EricMessageBox.information(
                 self,
                 self.tr("Validation"),
-                self.tr("""The exclusion expression is valid.""")
+                self.tr("""The exclusion expression is valid."""),
             )
         else:
-            EricMessageBox.critical(
-                self,
-                self.tr("Validation Error"),
-                error
-            )
-    
+            EricMessageBox.critical(self, self.tr("Validation Error"), error)
+
     def __getTargetList(self):
         """
         Private method to get the list of checked target versions.
-        
+
         @return list of target versions
         @rtype list of str
         """
@@ -198,21 +194,21 @@
             itm = self.targetVersionsList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
                 targets.append(itm.data(Qt.ItemDataRole.UserRole).lower())
-        
+
         return targets
-    
+
     @pyqtSlot()
     def __createTomlSnippet(self):
         """
         Private slot to generate a TOML snippet of the current configuration.
-        
+
         Note: Only non-default values are included in this snippet.
-        
+
         The code snippet is copied to the clipboard and may be placed inside the
         'pyproject.toml' file.
         """
         doc = tomlkit.document()
-        
+
         black = tomlkit.table()
         targetList = self.__getTargetList()
         if targetList:
@@ -222,48 +218,48 @@
             black["skip-string-normalization"] = True
         if self.skipMagicCommaCheckBox.isChecked():
             black["skip-magic-trailing-comma"] = True
-        
+
         excludeRegexp = self.excludeEdit.toPlainText()
         if excludeRegexp and BlackUtilities.validateRegExp(excludeRegexp)[0]:
             black["extend-exclude"] = tomlkit.string(
-                "\n{0}\n".format(excludeRegexp.strip()),
-                literal=True,
-                multiline=True
+                "\n{0}\n".format(excludeRegexp.strip()), literal=True, multiline=True
             )
-        
+
         doc["tool"] = tomlkit.table(is_super_table=True)
         doc["tool"]["black"] = black
-        
+
         QGuiApplication.clipboard().setText(tomlkit.dumps(doc))
-        
+
         EricMessageBox.information(
             self,
             self.tr("Create TOML snippet"),
-            self.tr("""The 'pyproject.toml' snippet was copied to the clipboard"""
-                    """ successfully.""")
+            self.tr(
+                """The 'pyproject.toml' snippet was copied to the clipboard"""
+                """ successfully."""
+            ),
         )
-    
+
     def getConfiguration(self):
         """
         Public method to get the current configuration parameters.
-        
+
         @return dictionary containing the configuration parameters
         @rtype dict
         """
         configuration = BlackUtilities.getDefaultConfiguration()
-        
+
         configuration["source"] = self.sourceComboBox.currentData()
         configuration["target-version"] = self.__getTargetList()
         configuration["line-length"] = self.lineLengthSpinBox.value()
-        configuration["skip-string-normalization"] = (
-            self.skipStringNormalCheckBox.isChecked()
-        )
-        configuration["skip-magic-trailing-comma"] = (
-            self.skipMagicCommaCheckBox.isChecked()
-        )
+        configuration[
+            "skip-string-normalization"
+        ] = self.skipStringNormalCheckBox.isChecked()
+        configuration[
+            "skip-magic-trailing-comma"
+        ] = self.skipMagicCommaCheckBox.isChecked()
         configuration["extend-exclude"] = self.excludeEdit.toPlainText().strip()
-        
+
         if self.__project:
             self.__project.setData("OTHERTOOLSPARMS", "Black", configuration)
-        
+
         return configuration
--- a/src/eric7/CodeFormatting/BlackDiffWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CodeFormatting/BlackDiffWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,46 +20,47 @@
     """
     Class implementing a window to show a unified diff..
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.document().setDefaultFont(font)
-        
+
         self.__highlighter = DiffHighlighter(self.diffEdit.document())
         self.__savedGeometry = None
-    
+
     def showDiff(self, diff):
         """
         Public method to show the given diff.
-        
+
         @param diff text containing the unified diff
         @type str
         """
         self.diffEdit.clear()
         self.__highlighter.regenerateRules()
-        
+
         if diff:
             self.diffEdit.setPlainText(diff)
         else:
-            self.diffEdit.setPlainText(self.tr('There is no difference.'))
-        
+            self.diffEdit.setPlainText(self.tr("There is no difference."))
+
         if self.__savedGeometry is not None:
             self.restoreGeometry(self.__savedGeometry)
-        
+
         self.show()
-    
+
     def closeEvent(self, evt):
         """
         Protected slot implementing a close event handler.
-        
+
         @param evt reference to the close event
         @type QCloseEvent
         """
--- a/src/eric7/CodeFormatting/BlackFormattingAction.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CodeFormatting/BlackFormattingAction.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,6 +14,7 @@
     """
     Class defining the various code formatting actions.
     """
+
     Format = 0
     Check = 1
     Diff = 2
--- a/src/eric7/CodeFormatting/BlackFormattingDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CodeFormatting/BlackFormattingDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
     QDialog,
     QDialogButtonBox,
     QHeaderView,
-    QTreeWidgetItem
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -37,17 +37,24 @@
     """
     Class implementing a dialog showing the code formatting progress and the result.
     """
+
     DataTypeRole = Qt.ItemDataRole.UserRole
     DataRole = Qt.ItemDataRole.UserRole + 1
-    
+
     StatusColumn = 0
     FileNameColumn = 1
-    
-    def __init__(self, configuration, filesList, project=None,
-                 action=BlackFormattingAction.Format, parent=None):
+
+    def __init__(
+        self,
+        configuration,
+        filesList,
+        project=None,
+        action=BlackFormattingAction.Format,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param configuration dictionary containing the configuration parameters
         @type dict
         @param filesList list of absolute file paths to be processed
@@ -61,42 +68,42 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.progressBar.setMaximum(len(filesList))
         self.progressBar.setValue(0)
-        
+
         self.resultsList.header().setSortIndicator(1, Qt.SortOrder.AscendingOrder)
-        
+
         self.statisticsGroup.setVisible(False)
-        
+
         self.__report = BlackReport(self)
         self.__report.check = action is BlackFormattingAction.Check
         self.__report.diff = action is BlackFormattingAction.Diff
-        
+
         self.__config = copy.deepcopy(configuration)
         self.__project = project
         self.__action = action
-        
+
         self.__cancelled = False
         self.__diffDialog = None
-        
+
         self.__allFilter = self.tr("<all>")
-        
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
         self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
         self.show()
         QCoreApplication.processEvents()
-        
+
         self.__files = self.__filterFiles(filesList)
         self.__formatFiles()
-    
+
     def __filterFiles(self, filesList):
         """
         Private method to filter the given list of files according the
         configuration parameters.
-        
+
         @param filesList list of files
         @type list of str
         @return list of filtered files
@@ -105,10 +112,11 @@
         filterRegExps = [
             BlackUtilities.compileRegExp(self.__config[k])
             for k in ["force-exclude", "extend-exclude", "exclude"]
-            if k in self.__config and bool(self.__config[k])
+            if k in self.__config
+            and bool(self.__config[k])
             and BlackUtilities.validateRegExp(self.__config[k])[0]
         ]
-        
+
         files = []
         for file in filesList:
             file = Utilities.fromNativeSeparators(file)
@@ -119,25 +127,27 @@
                     break
             else:
                 files.append(file)
-        
+
         return files
-    
+
     def __resort(self):
         """
         Private method to resort the result list.
         """
         self.resultsList.sortItems(
             self.resultsList.sortColumn(),
-            self.resultsList.header().sortIndicatorOrder())
-    
+            self.resultsList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the columns of the result list.
         """
         self.resultsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.resultsList.header().setStretchLastSection(True)
-    
+
     def __populateStatusFilterCombo(self):
         """
         Private method to populate the status filter combo box with allowed selections.
@@ -149,26 +159,26 @@
                     BlackFormattingDialog.StatusColumn
                 )
             )
-        
+
         self.statusFilterComboBox.addItem(self.__allFilter)
         self.statusFilterComboBox.addItems(sorted(allowedSelections))
-    
+
     def __finish(self):
         """
         Private method to perform some actions after the run was performed or canceled.
         """
         self.__resort()
         self.__resizeColumns()
-        
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
         self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
         self.progressBar.setVisible(False)
-        
+
         self.__updateStatistics()
         self.__populateStatusFilterCombo()
-    
+
     def __updateStatistics(self):
         """
         Private method to update the statistics about the recent formatting run and
@@ -176,27 +186,27 @@
         """
         self.reformattedLabel.setText(
             self.tr("reformatted")
-            if self.__action is BlackFormattingAction.Format else
-            self.tr("would reformat")
+            if self.__action is BlackFormattingAction.Format
+            else self.tr("would reformat")
         )
-        
+
         total = self.progressBar.maximum()
         processed = total - self.__report.ignored_count
-        
+
         self.totalCountLabel.setText("{0:n}".format(total))
         self.excludedCountLabel.setText("{0:n}".format(self.__report.ignored_count))
         self.failuresCountLabel.setText("{0:n}".format(self.__report.failure_count))
         self.processedCountLabel.setText("{0:n}".format(processed))
         self.reformattedCountLabel.setText("{0:n}".format(self.__report.change_count))
         self.unchangedCountLabel.setText("{0:n}".format(self.__report.same_count))
-        
+
         self.statisticsGroup.setVisible(True)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle button presses of the dialog buttons.
-        
+
         @param button reference to the pressed button
         @type QAbstractButton
         """
@@ -204,12 +214,12 @@
             self.__cancelled = True
         elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_resultsList_itemDoubleClicked(self, item, column):
         """
         Private slot handling a double click of a result item.
-        
+
         @param item reference to the double clicked item
         @type QTreeWidgetItem
         @param column column number that was double clicked
@@ -220,19 +230,19 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Formatting Failure"),
-                self.tr(
-                    "<p>Formatting failed due to this error.</p><p>{0}</p>"
-                ).format(item.data(0, BlackFormattingDialog.DataRole))
+                self.tr("<p>Formatting failed due to this error.</p><p>{0}</p>").format(
+                    item.data(0, BlackFormattingDialog.DataRole)
+                ),
             )
         elif dataType == "diff":
             if self.__diffDialog is None:
                 self.__diffDialog = BlackDiffWidget()
             self.__diffDialog.showDiff(item.data(0, BlackFormattingDialog.DataRole))
-    
+
     def addResultEntry(self, status, fileName, isError=False, data=None):
         """
         Public method to add an entry to the result list.
-        
+
         @param status status of the operation
         @type str
         @param fileName name of the processed file
@@ -245,52 +255,47 @@
         """
         if self.__project:
             fileName = self.__project.getRelativePath(fileName)
-        
+
         itm = QTreeWidgetItem(self.resultsList, [status, fileName])
         if data:
             itm.setData(
-                0,
-                BlackFormattingDialog.DataTypeRole,
-                "error" if isError else "diff"
+                0, BlackFormattingDialog.DataTypeRole, "error" if isError else "diff"
             )
             itm.setData(0, BlackFormattingDialog.DataRole, data)
-        
+
         self.progressBar.setValue(self.progressBar.value() + 1)
-        
+
         QCoreApplication.processEvents()
-    
+
     def __formatFiles(self):
         """
         Private method to format the list of files according the configuration.
         """
         writeBack = black.WriteBack.from_configuration(
             check=self.__action is BlackFormattingAction.Check,
-            diff=self.__action is BlackFormattingAction.Diff
+            diff=self.__action is BlackFormattingAction.Diff,
         )
-        
+
         versions = (
             {
                 black.TargetVersion[target.upper()]
                 for target in self.__config["target-version"]
             }
-            if self.__config["target-version"] else
-            set()
+            if self.__config["target-version"]
+            else set()
         )
-        
+
         mode = black.Mode(
             target_versions=versions,
             line_length=int(self.__config["line-length"]),
             string_normalization=not self.__config["skip-string-normalization"],
-            magic_trailing_comma=not self.__config["skip-magic-trailing-comma"]
+            magic_trailing_comma=not self.__config["skip-magic-trailing-comma"],
         )
-        
+
         for file in self.__files:
             if self.__action is BlackFormattingAction.Diff:
                 self.__diffFormatFile(
-                    pathlib.Path(file),
-                    fast=False,
-                    mode=mode,
-                    report=self.__report
+                    pathlib.Path(file), fast=False, mode=mode, report=self.__report
                 )
             else:
                 black.reformat_one(
@@ -298,19 +303,19 @@
                     fast=False,
                     write_back=writeBack,
                     mode=mode,
-                    report=self.__report
+                    report=self.__report,
                 )
-            
+
             if self.__cancelled:
                 break
-        
+
         self.__finish()
-    
+
     def __diffFormatFile(self, src, fast, mode, report):
         """
         Private method to check, if the given files need to be reformatted, and generate
         a unified diff.
-        
+
         @param src path of file to be checked
         @type pathlib.Path
         @param fast flag indicating fast operation
@@ -328,33 +333,33 @@
         except black.NothingChanged:
             report.done(src, black.Changed.NO)
             return
-        
+
         fileName = str(src)
         if self.__project:
             fileName = self.__project.getRelativePath(fileName)
-        
+
         now = datetime.datetime.utcnow()
         srcName = f"{fileName}\t{then} +0000"
         dstName = f"{fileName}\t{now} +0000"
         diffContents = black.diff(srcContents, dstContents, srcName, dstName)
         report.done(src, black.Changed.YES, diff=diffContents)
-    
+
     def closeEvent(self, evt):
         """
         Protected slot implementing a close event handler.
-        
+
         @param evt reference to the close event
         @type QCloseEvent
         """
         if self.__diffDialog is not None:
             self.__diffDialog.close()
         evt.accept()
-    
+
     @pyqtSlot(str)
     def on_statusFilterComboBox_currentTextChanged(self, status):
         """
         Private slot handling the selection of a status for items to be shown.
-        
+
         @param status selected status
         @type str
         """
@@ -370,23 +375,24 @@
     """
     Class extending the black Report to work with our dialog.
     """
+
     def __init__(self, dialog):
         """
         Constructor
-        
+
         @param dialog reference to the result dialog
         @type QDialog
         """
         super().__init__()
-        
+
         self.ignored_count = 0
-        
+
         self.__dialog = dialog
-    
+
     def done(self, src, changed, diff=""):
         """
         Public method to handle the end of a reformat.
-        
+
         @param src name of the processed file
         @type pathlib.Path
         @param changed change status
@@ -397,28 +403,28 @@
         if changed is black.Changed.YES:
             status = (
                 QCoreApplication.translate("BlackFormattingDialog", "would reformat")
-                if self.check or self.diff else
-                QCoreApplication.translate("BlackFormattingDialog", "reformatted")
+                if self.check or self.diff
+                else QCoreApplication.translate("BlackFormattingDialog", "reformatted")
             )
             self.change_count += 1
-        
+
         elif changed is black.Changed.NO:
             status = QCoreApplication.translate("BlackFormattingDialog", "unchanged")
             self.same_count += 1
-        
+
         elif changed is black.Changed.CACHED:
             status = QCoreApplication.translate("BlackFormattingDialog", "unmodified")
             self.same_count += 1
-        
+
         if self.diff:
             self.__dialog.addResultEntry(status, str(src), data=diff)
         else:
             self.__dialog.addResultEntry(status, str(src))
-    
+
     def failed(self, src, message):
         """
         Public method to handle a reformat failure.
-        
+
         @param src name of the processed file
         @type pathlib.Path
         @param message error message
@@ -426,13 +432,13 @@
         """
         status = QCoreApplication.translate("BlackFormattingDialog", "failed")
         self.failure_count += 1
-        
+
         self.__dialog.addResultEntry(status, str(src), isError=True, data=message)
-    
+
     def path_ignored(self, src, message=""):
         """
         Public method handling an ignored path.
-        
+
         @param src name of the processed file
         @type pathlib.Path or str
         @param message ignore message (default to "")
@@ -440,5 +446,5 @@
         """
         status = QCoreApplication.translate("BlackFormattingDialog", "ignored")
         self.ignored_count += 1
-        
+
         self.__dialog.addResultEntry(status, str(src))
--- a/src/eric7/CodeFormatting/BlackUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CodeFormatting/BlackUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,7 @@
 def getDefaultConfiguration():
     """
     Function to generate a default set of configuration parameters.
-    
+
     @return dictionary containing the default parameters
     @rtype dict
     """
@@ -35,7 +35,7 @@
 def compileRegExp(regexp):
     """
     Function to compile a given regular expression.
-    
+
     @param regexp regular expression to be compiled
     @type str
     @return compiled regular expression object
@@ -51,7 +51,7 @@
 def validateRegExp(regexp):
     """
     Function to validate a given regular expression.
-    
+
     @param regexp regular expression to be validated
     @type str
     @return tuple containing a flag indicating validity and an error message
@@ -65,23 +65,20 @@
             return (
                 False,
                 QCoreApplication.translate(
-                    "BlackUtilities",
-                    "Invalid regular expression: {0}"
-                ).format(str(e))
+                    "BlackUtilities", "Invalid regular expression: {0}"
+                ).format(str(e)),
             )
         except IndexError:
             return (
                 False,
                 QCoreApplication.translate(
-                    "BlackUtilities",
-                    "Invalid regular expression: missing group name"
-                )
+                    "BlackUtilities", "Invalid regular expression: missing group name"
+                ),
             )
     else:
         return (
             False,
             QCoreApplication.translate(
-                "BlackUtilities",
-                "A regular expression must be given."
-            )
+                "BlackUtilities", "A regular expression must be given."
+            ),
         )
--- a/src/eric7/CondaInterface/Conda.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/Conda.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,36 +26,37 @@
 class Conda(QObject):
     """
     Class implementing the conda GUI logic.
-    
+
     @signal condaEnvironmentCreated() emitted to indicate the creation of
         a new environment
     @signal condaEnvironmentRemoved() emitted to indicate the removal of
         an environment
     """
+
     condaEnvironmentCreated = pyqtSignal()
     condaEnvironmentRemoved = pyqtSignal()
-    
+
     RootName = QCoreApplication.translate("Conda", "<root>")
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__ui = parent
-    
+
     #######################################################################
     ## environment related methods below
     #######################################################################
-    
+
     def createCondaEnvironment(self, arguments):
         """
         Public method to create a conda environment.
-        
+
         @param arguments list of command line arguments
         @type list of str
         @return tuple containing a flag indicating success, the directory of
@@ -64,15 +65,14 @@
         @rtype tuple of (bool, str, str)
         """
         args = ["create", "--json", "--yes"] + arguments
-        
+
         dlg = CondaExecDialog("create", self.__ui)
         dlg.start(args)
         dlg.exec()
         ok, resultDict = dlg.getResult()
-        
+
         if ok:
-            if ("actions" in resultDict and
-                    "PREFIX" in resultDict["actions"]):
+            if "actions" in resultDict and "PREFIX" in resultDict["actions"]:
                 prefix = resultDict["actions"]["PREFIX"]
             elif "prefix" in resultDict:
                 prefix = resultDict["prefix"]
@@ -80,37 +80,32 @@
                 prefix = resultDict["dst_prefix"]
             else:
                 prefix = ""
-            
+
             # determine Python executable
             if prefix:
-                pathPrefixes = [
-                    prefix,
-                    rootPrefix()
-                ]
+                pathPrefixes = [prefix, rootPrefix()]
             else:
-                pathPrefixes = [
-                    rootPrefix()
-                ]
+                pathPrefixes = [rootPrefix()]
             for pathPrefix in pathPrefixes:
                 python = (
                     os.path.join(pathPrefix, "python.exe")
-                    if Globals.isWindowsPlatform() else
-                    os.path.join(pathPrefix, "bin", "python")
+                    if Globals.isWindowsPlatform()
+                    else os.path.join(pathPrefix, "bin", "python")
                 )
                 if os.path.exists(python):
                     break
             else:
                 python = ""
-            
+
             self.condaEnvironmentCreated.emit()
             return True, prefix, python
         else:
             return False, "", ""
-    
+
     def removeCondaEnvironment(self, name="", prefix=""):
         """
         Public method to remove a conda environment.
-        
+
         @param name name of the environment
         @type str
         @param prefix prefix of the environment
@@ -118,15 +113,15 @@
         @return flag indicating success
         @rtype bool
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         args = [
             "remove",
             "--json",
@@ -137,72 +132,80 @@
             args.extend(["--name", name])
         elif prefix:
             args.extend(["--prefix", prefix])
-        
+
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         proc = QProcess()
         proc.start(exe, args)
         if not proc.waitForStarted(15000):
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("conda remove"),
-                self.tr("""The conda executable could not be started."""))
+                self.tr("""The conda executable could not be started."""),
+            )
             return False
         else:
             proc.waitForFinished(15000)
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 jsonDict = json.loads(output)
             except Exception:
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("conda remove"),
-                    self.tr("""The conda executable returned invalid data."""))
+                    self.tr("""The conda executable returned invalid data."""),
+                )
                 return False
-            
+
             if "error" in jsonDict:
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("conda remove"),
-                    self.tr("<p>The conda executable returned an error.</p>"
-                            "<p>{0}</p>").format(jsonDict["message"]))
+                    self.tr(
+                        "<p>The conda executable returned an error.</p>" "<p>{0}</p>"
+                    ).format(jsonDict["message"]),
+                )
                 return False
-            
+
             if jsonDict["success"]:
                 self.condaEnvironmentRemoved.emit()
-            
+
             return jsonDict["success"]
-        
+
         return False
-    
+
     def getCondaEnvironmentsList(self):
         """
         Public method to get a list of all Conda environments.
-        
+
         @return list of tuples containing the environment name and prefix
         @rtype list of tuples of (str, str)
         """
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         environmentsList = []
-        
+
         proc = QProcess()
         proc.start(exe, ["info", "--json"])
         if proc.waitForStarted(15000) and proc.waitForFinished(15000):
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 jsonDict = json.loads(output)
             except Exception:
                 jsonDict = {}
-            
+
             if "envs" in jsonDict:
                 for prefix in jsonDict["envs"][:]:
                     if prefix == jsonDict["root_prefix"]:
@@ -212,20 +215,20 @@
                         name = self.RootName
                     else:
                         name = os.path.basename(prefix)
-                    
+
                     environmentsList.append((name, prefix))
-        
+
         return environmentsList
-    
+
     #######################################################################
     ## package related methods below
     #######################################################################
-    
+
     def getInstalledPackages(self, name="", prefix=""):
         """
         Public method to get a list of installed packages of a conda
         environment.
-        
+
         @param name name of the environment
         @type str
         @param prefix prefix of the environment
@@ -234,15 +237,15 @@
             the package name, version and build.
         @rtype list of tuples of (str, str, str)
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         args = [
             "list",
             "--json",
@@ -251,44 +254,44 @@
             args.extend(["--name", name])
         elif prefix:
             args.extend(["--prefix", prefix])
-        
+
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         packages = []
-        
+
         proc = QProcess()
         proc.start(exe, args)
         if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 jsonList = json.loads(output)
             except Exception:
                 jsonList = []
-            
+
             for package in jsonList:
                 if isinstance(package, dict):
-                    packages.append((
-                        package["name"],
-                        package["version"],
-                        package["build_string"]
-                    ))
+                    packages.append(
+                        (package["name"], package["version"], package["build_string"])
+                    )
                 else:
                     parts = package.rsplit("-", 2)
                     while len(parts) < 3:
                         parts.append("")
                     packages.append(tuple(parts))
-        
+
         return packages
-    
+
     def getUpdateablePackages(self, name="", prefix=""):
         """
         Public method to get a list of updateable packages of a conda
         environment.
-        
+
         @param name name of the environment
         @type str
         @param prefix prefix of the environment
@@ -297,15 +300,15 @@
             the package name, version and build.
         @rtype list of tuples of (str, str, str)
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         args = [
             "update",
             "--json",
@@ -317,45 +320,49 @@
             args.extend(["--name", name])
         elif prefix:
             args.extend(["--prefix", prefix])
-        
+
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         packages = []
-        
+
         proc = QProcess()
         proc.start(exe, args)
         if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 jsonDict = json.loads(output)
             except Exception:
                 jsonDict = {}
-            
+
             if "actions" in jsonDict and "LINK" in jsonDict["actions"]:
                 for linkEntry in jsonDict["actions"]["LINK"]:
                     if isinstance(linkEntry, dict):
-                        packages.append((
-                            linkEntry["name"],
-                            linkEntry["version"],
-                            linkEntry["build_string"]
-                        ))
+                        packages.append(
+                            (
+                                linkEntry["name"],
+                                linkEntry["version"],
+                                linkEntry["build_string"],
+                            )
+                        )
                     else:
                         package = linkEntry.split()[0]
                         parts = package.rsplit("-", 2)
                         while len(parts) < 3:
                             parts.append("")
                         packages.append(tuple(parts))
-        
+
         return packages
-    
+
     def updatePackages(self, packages, name="", prefix=""):
         """
         Public method to update packages of a conda environment.
-        
+
         @param packages list of package names to be updated
         @type list of str
         @param name name of the environment
@@ -365,15 +372,15 @@
         @return flag indicating success
         @rtype bool
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         if packages:
             args = [
                 "update",
@@ -385,20 +392,20 @@
             elif prefix:
                 args.extend(["--prefix", prefix])
             args.extend(packages)
-            
+
             dlg = CondaExecDialog("update", self.__ui)
             dlg.start(args)
             dlg.exec()
             ok, _ = dlg.getResult()
         else:
             ok = False
-        
+
         return ok
-    
+
     def updateAllPackages(self, name="", prefix=""):
         """
         Public method to update all packages of a conda environment.
-        
+
         @param name name of the environment
         @type str
         @param prefix prefix of the environment
@@ -406,37 +413,32 @@
         @return flag indicating success
         @rtype bool
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
-        args = [
-            "update",
-            "--json",
-            "--yes",
-            "--all"
-        ]
+
+        args = ["update", "--json", "--yes", "--all"]
         if name:
             args.extend(["--name", name])
         elif prefix:
             args.extend(["--prefix", prefix])
-        
+
         dlg = CondaExecDialog("update", self.__ui)
         dlg.start(args)
         dlg.exec()
         ok, _ = dlg.getResult()
-        
+
         return ok
-    
+
     def installPackages(self, packages, name="", prefix=""):
         """
         Public method to install packages into a conda environment.
-        
+
         @param packages list of package names to be installed
         @type list of str
         @param name name of the environment
@@ -446,15 +448,15 @@
         @return flag indicating success
         @rtype bool
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         if packages:
             args = [
                 "install",
@@ -466,21 +468,21 @@
             elif prefix:
                 args.extend(["--prefix", prefix])
             args.extend(packages)
-            
+
             dlg = CondaExecDialog("install", self.__ui)
             dlg.start(args)
             dlg.exec()
             ok, _ = dlg.getResult()
         else:
             ok = False
-        
+
         return ok
-    
+
     def uninstallPackages(self, packages, name="", prefix=""):
         """
         Public method to uninstall packages of a conda environment (including
         all no longer needed dependencies).
-        
+
         @param packages list of package names to be uninstalled
         @type list of str
         @param name name of the environment
@@ -490,25 +492,27 @@
         @return flag indicating success
         @rtype bool
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         if not name and not prefix:
             raise RuntimeError("One of 'name' or 'prefix' must be given.")
-        
+
         if packages:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog)
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Uninstall Packages"),
                 self.tr(
                     "Do you really want to uninstall these packages and"
-                    " their dependencies?"),
-                packages)
+                    " their dependencies?"
+                ),
+                packages,
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 args = [
                     "remove",
@@ -516,13 +520,15 @@
                     "--yes",
                 ]
                 if condaVersion() >= (4, 4, 0):
-                    args.append("--prune",)
+                    args.append(
+                        "--prune",
+                    )
                 if name:
                     args.extend(["--name", name])
                 elif prefix:
                     args.extend(["--prefix", prefix])
                 args.extend(packages)
-                
+
                 dlg = CondaExecDialog("remove", self.__ui)
                 dlg.start(args)
                 dlg.exec()
@@ -531,14 +537,21 @@
                 ok = False
         else:
             ok = False
-        
+
         return ok
-    
-    def searchPackages(self, pattern, fullNameOnly=False, packageSpec=False,
-                       platform="", name="", prefix=""):
+
+    def searchPackages(
+        self,
+        pattern,
+        fullNameOnly=False,
+        packageSpec=False,
+        platform="",
+        name="",
+        prefix="",
+    ):
         """
         Public method to search for a package pattern of a conda environment.
-        
+
         @param pattern package search pattern
         @type str
         @param fullNameOnly flag indicating to search for full names only
@@ -556,12 +569,12 @@
             packages as values
         @rtype tuple of (bool, dict of list of dict)
         @exception RuntimeError raised to indicate an error in parameters
-        
+
         Note: only one of name or prefix must be given.
         """
         if name and prefix:
             raise RuntimeError("Only one of 'name' or 'prefix' must be given.")
-        
+
         args = [
             "search",
             "--json",
@@ -577,103 +590,98 @@
         elif prefix:
             args.extend(["--prefix", prefix])
         args.append(pattern)
-        
+
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         packages = {}
         ok = False
-        
+
         proc = QProcess()
         proc.start(exe, args)
         if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             with contextlib.suppress(Exception):
                 packages = json.loads(output)
                 ok = "error" not in packages
-        
+
         return ok, packages
-    
+
     #######################################################################
     ## special methods below
     #######################################################################
-    
+
     def updateConda(self):
         """
         Public method to update conda itself.
-        
+
         @return flag indicating success
         @rtype bool
         """
-        args = [
-            "update",
-            "--json",
-            "--yes",
-            "conda"
-        ]
-        
+        args = ["update", "--json", "--yes", "conda"]
+
         dlg = CondaExecDialog("update", self.__ui)
         dlg.start(args)
         dlg.exec()
         ok, _ = dlg.getResult()
-        
+
         return ok
-    
+
     def writeDefaultConfiguration(self):
         """
         Public method to create a conda configuration with default values.
         """
-        args = [
-            "config",
-            "--write-default",
-            "--quiet"
-        ]
-        
+        args = ["config", "--write-default", "--quiet"]
+
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         proc = QProcess()
         proc.start(exe, args)
         proc.waitForStarted(15000)
         proc.waitForFinished(30000)
-    
+
     def getCondaInformation(self):
         """
         Public method to get a dictionary containing information about conda.
-        
+
         @return dictionary containing information about conda
         @rtype dict
         """
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         infoDict = {}
-        
+
         proc = QProcess()
         proc.start(exe, ["info", "--json"])
         if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 infoDict = json.loads(output)
             except Exception:
                 infoDict = {}
-        
+
         return infoDict
-    
+
     def runProcess(self, args):
         """
         Public method to execute the conda with the given arguments.
-        
+
         The conda executable is called with the given arguments and
         waited for its end.
-        
+
         @param args list of command line arguments
         @type list of str
         @return tuple containing a flag indicating success and the output
@@ -683,7 +691,7 @@
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         process = QProcess()
         process.start(exe, args)
         procStarted = process.waitForStarted(15000)
@@ -691,28 +699,32 @@
             finished = process.waitForFinished(30000)
             if finished:
                 if process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace').strip()
+                    output = str(
+                        process.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    ).strip()
                     return True, output
                 else:
-                    return (False,
-                            self.tr("conda exited with an error ({0}).")
-                            .format(process.exitCode()))
+                    return (
+                        False,
+                        self.tr("conda exited with an error ({0}).").format(
+                            process.exitCode()
+                        ),
+                    )
             else:
                 process.terminate()
                 process.waitForFinished(2000)
                 process.kill()
                 process.waitForFinished(3000)
-                return False, self.tr("conda did not finish within"
-                                      " 3 seconds.")
-        
+                return False, self.tr("conda did not finish within" " 3 seconds.")
+
         return False, self.tr("conda could not be started.")
-    
+
     def cleanConda(self, cleanAction):
         """
         Public method to update conda itself.
-        
+
         @param cleanAction cleaning action to be performed (must be one of
             the command line parameters without '--')
         @type str
@@ -722,7 +734,7 @@
             "--yes",
             "--{0}".format(cleanAction),
         ]
-        
+
         dlg = CondaExecDialog("clean", self.__ui)
         dlg.start(args)
         dlg.exec()
--- a/src/eric7/CondaInterface/CondaExecDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaExecDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog to show the output of a conda execution.
     """
+
     def __init__(self, command, parent=None):
         """
         Constructor
-        
+
         @param command conda command executed
         @type str
         @param parent reference to the parent widget
@@ -35,86 +36,83 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__condaCommand = command
-        
+
         self.__process = None
         self.__condaExe = Preferences.getConda("CondaExecutable")
         if not self.__condaExe:
             self.__condaExe = "conda"
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish(1, 0)
-    
+
     def start(self, arguments):
         """
         Public slot to start the conda command.
-        
+
         @param arguments commandline arguments for conda program
         @type list of str
         """
         self.errorGroup.hide()
         self.progressLabel.hide()
         self.progressBar.hide()
-        
+
         self.contents.clear()
         self.errors.clear()
         self.progressLabel.clear()
         self.progressBar.setValue(0)
-        
+
         self.__bufferedStdout = None
         self.__json = "--json" in arguments
         self.__firstProgress = True
         self.__lastFetchFile = ""
-        
+
         self.__statusOk = False
         self.__result = None
-        
+
         self.__logOutput(self.__condaExe + " " + " ".join(arguments) + "\n\n")
-        
+
         self.__process = QProcess()
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
         self.__process.finished.connect(self.__finish)
-        
+
         self.__process.start(self.__condaExe, arguments)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             EricMessageBox.critical(
                 self,
                 self.tr("Conda Execution"),
-                self.tr("""The conda executable could not be started. Is it"""
-                        """ configured correctly?"""))
+                self.tr(
+                    """The conda executable could not be started. Is it"""
+                    """ configured correctly?"""
+                ),
+            )
             self.__finish(1, 0)
         else:
             self.__logOutput(self.tr("Operation started.\n"))
-    
+
     def __finish(self, exitCode, exitStatus, giveUp=False):
         """
         Private slot called when the process finished.
-        
+
         It is called when the process finished or
         the user pressed the button.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
@@ -122,71 +120,71 @@
         @param giveUp flag indicating to not start another attempt
         @type bool
         """
-        if (self.__process is not None and
-           self.__process.state() != QProcess.ProcessState.NotRunning):
+        if (
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
+        ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.progressLabel.hide()
         self.progressBar.hide()
-        
+
         self.__statusOk = exitCode == 0
-        
+
         self.__logOutput(self.tr("Operation finished.\n"))
         if not self.__json and self.__bufferedStdout:
             self.__logOutput(self.__bufferedStdout)
-        
+
         if self.__json and self.__bufferedStdout:
             index = self.__bufferedStdout.find("{")
             rindex = self.__bufferedStdout.rfind("}")
-            self.__bufferedStdout = self.__bufferedStdout[index:rindex + 1]
+            self.__bufferedStdout = self.__bufferedStdout[index : rindex + 1]
             try:
                 self.__result = json.loads(self.__bufferedStdout)
             except Exception as error:
                 self.__result = {}
                 self.__logError(str(error))
                 return
-            
+
             if "error" in self.__result:
                 self.__logError(self.__result["error"])
                 self.__statusOk = False
-            elif ("success" in self.__result and
-                    not self.__result["success"]):
+            elif "success" in self.__result and not self.__result["success"]:
                 self.__logError(
-                    self.tr("Conda command '{0}' did not return success.")
-                    .format(self.__condaCommand))
+                    self.tr("Conda command '{0}' did not return success.").format(
+                        self.__condaCommand
+                    )
+                )
                 if "message" in self.__result:
                     self.__logError("\n")
                     self.__logError(
-                        self.tr("\nConda Message: {0}").format(
-                            self.__result["message"]))
+                        self.tr("\nConda Message: {0}").format(self.__result["message"])
+                    )
                 self.__statusOk = False
             elif "message" in self.__result:
                 self.__logOutput(
-                    self.tr("\nConda Message: {0}").format(
-                        self.__result["message"]))
-    
+                    self.tr("\nConda Message: {0}").format(self.__result["message"])
+                )
+
     def getResult(self):
         """
         Public method to the result of the command execution.
-        
+
         @return tuple containing a flag indicating success and the result data.
         @rtype tuple of (bool, dict)
         """
         return self.__statusOk, self.__result
-    
+
     def __setProgressValues(self, jsonDict, progressType):
         """
         Private method to set the value of the progress bar.
-        
+
         @param jsonDict dictionary containing the progress info
         @type dict
         @param progressType action type to check for
@@ -198,8 +196,7 @@
             if jsonDict["maxval"] == 1:
                 self.progressBar.setMaximum(100)
                 # percent values
-                self.progressBar.setValue(
-                    int(jsonDict["progress"] * 100))
+                self.progressBar.setValue(int(jsonDict["progress"] * 100))
                 parts = jsonDict["fetch"].split("|")
                 filename = parts[0].strip()
                 filesize = parts[1].strip()
@@ -208,37 +205,39 @@
                 self.progressBar.setValue(jsonDict["progress"])
                 filename = jsonDict["fetch"].strip()
                 filesize = Globals.dataString(int(jsonDict["maxval"]))
-            
+
             self.progressLabel.setText(
-                self.tr("{0} (Size: {1})").format(filename, filesize))
-            
+                self.tr("{0} (Size: {1})").format(filename, filesize)
+            )
+
             if progressType == "fetch":
                 if filename != self.__lastFetchFile:
-                    self.__logOutput(
-                        self.tr("Fetching {0} ...").format(filename))
+                    self.__logOutput(self.tr("Fetching {0} ...").format(filename))
                     self.__lastFetchFile = filename
                 elif jsonDict["finished"]:
                     self.__logOutput(self.tr(" Done.\n"))
-            
+
             if self.__firstProgress:
                 self.progressLabel.show()
                 self.progressBar.show()
                 self.__firstProgress = False
-            
+
             return True
-        
+
         return False
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
-        all_stdout = str(self.__process.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace')
+        all_stdout = str(
+            self.__process.readAllStandardOutput(),
+            Preferences.getSystem("IOEncoding"),
+            "replace",
+        )
         all_stdout = all_stdout.replace("\x00", "")
         if self.__json:
             for stdout in all_stdout.splitlines():
@@ -259,36 +258,38 @@
                         self.__bufferedStdout += stdout
         else:
             self.__logOutput(all_stdout)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardError)
-        
+
         while self.__process.canReadLine():
-            stderr = str(self.__process.readLine(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace')
+            stderr = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__logError(stderr)
-    
+
     def __logOutput(self, stdout):
         """
         Private method to log some output.
-        
+
         @param stdout output string to log
         @type str
         """
         self.contents.insertPlainText(stdout)
         self.contents.ensureCursorVisible()
-    
+
     def __logError(self, stderr):
         """
         Private method to log an error.
-        
+
         @param stderr error string to log
         @type str
         """
--- a/src/eric7/CondaInterface/CondaExportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaExportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton, QApplication
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, QApplication
 
 from EricWidgets import EricMessageBox, EricFileDialog
 from EricWidgets.EricPathPicker import EricPathPickerModes
@@ -26,10 +24,11 @@
     """
     Class implementing a dialog to generate a requirements file for conda.
     """
+
     def __init__(self, conda, envName, envPrefix, parent=None):
         """
         Constructor
-        
+
         @param conda reference to the master object
         @type Conda
         @param envName name of the environment to create the requirements
@@ -44,65 +43,65 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.requirementsFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.requirementsFilePicker.setFilters(
-            self.tr("Text Files (*.txt);;All Files (*)"))
-        
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+
         self.__conda = conda
         self.__prefix = envPrefix
-        
+
         self.environmentLabel.setText("<b>{0}</b>".format(envName))
-        
+
         self.__requirementsEdited = False
         self.__requirementsAvailable = False
-        
+
         self.__updateButtons()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event
         @type QCloseEvent
         """
         e.accept()
-    
+
     @pyqtSlot(str)
     def on_requirementsFilePicker_textChanged(self, txt):
         """
         Private slot handling a change of the requirements file name.
-        
+
         @param txt name of the requirements file
         @type str
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_requirementsEdit_textChanged(self):
         """
         Private slot handling changes of the requirements text.
         """
         self.__requirementsEdited = True
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
         elif button == self.__refreshButton:
             self.__refresh()
-    
+
     def __refresh(self):
         """
         Private slot to refresh the displayed list.
@@ -111,68 +110,70 @@
             EricMessageBox.yesNo(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""The requirements were changed. Do you want"""
-                        """ to overwrite these changes?"""))
-            if self.__requirementsEdited else
-            True
+                self.tr(
+                    """The requirements were changed. Do you want"""
+                    """ to overwrite these changes?"""
+                ),
+            )
+            if self.__requirementsEdited
+            else True
         )
         if ok:
             self.start()
-    
+
     def start(self):
         """
         Public method to start the command.
         """
         self.requirementsEdit.clear()
         self.__requirementsAvailable = False
-        
+
         args = [
             "list",
             "--export",
             "--prefix",
             self.__prefix,
         ]
-        
+
         with EricOverrideCursor():
             success, output = self.__conda.runProcess(args)
-            
+
             if success:
                 self.requirementsEdit.setPlainText(output)
                 self.__requirementsAvailable = True
             else:
                 self.requirementsEdit.setPlainText(
-                    self.tr("No output generated by conda."))
-        
+                    self.tr("No output generated by conda.")
+                )
+
         self.__updateButtons()
-        
+
         self.__requirementsEdited = False
-    
+
     def __updateButtons(self):
         """
         Private method to set the state of the various buttons.
         """
         self.saveButton.setEnabled(
-            self.__requirementsAvailable and
-            bool(self.requirementsFilePicker.text())
+            self.__requirementsAvailable and bool(self.requirementsFilePicker.text())
         )
         self.saveToButton.setEnabled(self.__requirementsAvailable)
         self.copyButton.setEnabled(self.__requirementsAvailable)
-        
+
         aw = ericApp().getObject("ViewManager").activeWindow()
         if aw and self.__requirementsAvailable:
             self.insertButton.setEnabled(True)
             self.replaceAllButton.setEnabled(True)
-            self.replaceSelectionButton.setEnabled(
-                aw.hasSelectedText())
+            self.replaceSelectionButton.setEnabled(aw.hasSelectedText())
         else:
             self.insertButton.setEnabled(False)
             self.replaceAllButton.setEnabled(False)
             self.replaceSelectionButton.setEnabled(False)
-    
+
     def __writeToFile(self, fileName):
         """
         Private method to write the requirements text to a file.
-        
+
         @param fileName name of the file to write to
         @type str
         """
@@ -180,11 +181,14 @@
             ok = EricMessageBox.warning(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""The file <b>{0}</b> already exists. Do you want"""
-                        """ to overwrite it?""").format(fileName))
+                self.tr(
+                    """The file <b>{0}</b> already exists. Do you want"""
+                    """ to overwrite it?"""
+                ).format(fileName),
+            )
             if not ok:
                 return
-        
+
         try:
             with open(fileName, "w") as f:
                 f.write(self.requirementsEdit.toPlainText())
@@ -192,10 +196,12 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""<p>The requirements could not be written"""
-                        """ to <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                .format(fileName, str(err)))
-    
+                self.tr(
+                    """<p>The requirements could not be written"""
+                    """ to <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                ).format(fileName, str(err)),
+            )
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -203,7 +209,7 @@
         """
         fileName = self.requirementsFilePicker.text()
         self.__writeToFile(fileName)
-    
+
     @pyqtSlot()
     def on_saveToButton_clicked(self):
         """
@@ -215,7 +221,7 @@
             os.path.expanduser("~"),
             self.tr("Text Files (*.txt);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite
+            EricFileDialog.DontConfirmOverwrite,
         )
         if fileName:
             ext = os.path.splitext(fileName)[1]
@@ -224,7 +230,7 @@
                 if ex:
                     fileName += ex
             self.__writeToFile(fileName)
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -233,7 +239,7 @@
         txt = self.requirementsEdit.toPlainText()
         cb = QApplication.clipboard()
         cb.setText(txt)
-    
+
     @pyqtSlot()
     def on_insertButton_clicked(self):
         """
@@ -246,7 +252,7 @@
             cline, cindex = aw.getCursorPosition()
             aw.insertAt(self.requirementsEdit.toPlainText(), cline, cindex)
             aw.endUndoAction()
-    
+
     @pyqtSlot()
     def on_replaceSelectionButton_clicked(self):
         """
@@ -258,7 +264,7 @@
             aw.beginUndoAction()
             aw.replaceSelectedText(self.requirementsEdit.toPlainText())
             aw.endUndoAction()
-    
+
     @pyqtSlot()
     def on_replaceAllButton_clicked(self):
         """
--- a/src/eric7/CondaInterface/CondaInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the conda information dialog.
     """
+
     def __init__(self, infoDict, parent=None):
         """
         Constructor
-        
+
         @param infoDict dictionary containing the information to be shown
         @type dict
         @param parent reference to the parent widget
@@ -31,105 +32,88 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("miniconda48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("miniconda48"))
+
         # version information
         if "conda_version" in infoDict:
-            self.condaVersionLabel.setText(
-                infoDict["conda_version"])
+            self.condaVersionLabel.setText(infoDict["conda_version"])
         if "conda_build_version" in infoDict:
-            self.condaBuildVersionLabel.setText(
-                infoDict["conda_build_version"])
+            self.condaBuildVersionLabel.setText(infoDict["conda_build_version"])
         if "conda_env_version" in infoDict:
-            self.condaEnvVersionLabel.setText(
-                infoDict["conda_env_version"])
+            self.condaEnvVersionLabel.setText(infoDict["conda_env_version"])
         if "python_version" in infoDict:
-            self.pythonVersionLabel.setText(
-                infoDict["python_version"])
-        
+            self.pythonVersionLabel.setText(infoDict["python_version"])
+
         # prefixes
         if "active_prefix" in infoDict or "active_prefix_name" in infoDict:
             if infoDict["active_prefix_name"] and infoDict["active_prefix"]:
                 self.activeEnvironmentEdit.setText(
-                    "{0} ({1})".format(infoDict["active_prefix_name"],
-                                       infoDict["active_prefix"]))
+                    "{0} ({1})".format(
+                        infoDict["active_prefix_name"], infoDict["active_prefix"]
+                    )
+                )
             elif infoDict["active_prefix"]:
-                self.activeEnvironmentEdit.setText(
-                    infoDict["active_prefix"])
+                self.activeEnvironmentEdit.setText(infoDict["active_prefix"])
             elif infoDict["active_prefix_name"]:
-                self.activeEnvironmentEdit.setText(
-                    infoDict["active_prefix_name"])
+                self.activeEnvironmentEdit.setText(infoDict["active_prefix_name"])
             else:
-                self.activeEnvironmentEdit.setText(
-                    self.tr("None"))
+                self.activeEnvironmentEdit.setText(self.tr("None"))
         else:
             self.activeEnvironmentLabel.hide()
             self.activeEnvironmentEdit.hide()
         if "root_prefix" in infoDict:
             if "root_writable" in infoDict and infoDict["root_writable"]:
                 self.baseEnvironmentEdit.setText(
-                    self.tr("{0} (writable)").format(infoDict["root_prefix"]))
+                    self.tr("{0} (writable)").format(infoDict["root_prefix"])
+                )
             else:
-                self.baseEnvironmentEdit.setText(
-                    infoDict["root_prefix"])
+                self.baseEnvironmentEdit.setText(infoDict["root_prefix"])
         if "envs_dirs" in infoDict:
-            self.envDirsEdit.setPlainText(
-                "\n".join(infoDict["envs_dirs"]))
-        
+            self.envDirsEdit.setPlainText("\n".join(infoDict["envs_dirs"]))
+
         # configurations
         if "rc_path" in infoDict:
-            self.userConfigEdit.setText(
-                infoDict["rc_path"])
+            self.userConfigEdit.setText(infoDict["rc_path"])
         if "user_rc_path" in infoDict:
             # overwrite with more specific info
-            self.userConfigEdit.setText(
-                infoDict["user_rc_path"])
+            self.userConfigEdit.setText(infoDict["user_rc_path"])
         if "sys_rc_path" in infoDict:
-            self.systemConfigEdit.setText(
-                infoDict["sys_rc_path"])
+            self.systemConfigEdit.setText(infoDict["sys_rc_path"])
         if "config_files" in infoDict:
-            self.configurationsEdit.setPlainText(
-                "\n".join(infoDict["config_files"]))
+            self.configurationsEdit.setPlainText("\n".join(infoDict["config_files"]))
         else:
             self.configurationsLabel.hide()
             self.configurationsEdit.hide()
-        
+
         # channels
         if "channels" in infoDict:
-            self.channelsEdit.setPlainText(
-                "\n".join(infoDict["channels"]))
-        
+            self.channelsEdit.setPlainText("\n".join(infoDict["channels"]))
+
         # various
         if "pkgs_dirs" in infoDict:
-            self.cachesEdit.setPlainText(
-                "\n".join(infoDict["pkgs_dirs"]))
+            self.cachesEdit.setPlainText("\n".join(infoDict["pkgs_dirs"]))
         if "platform" in infoDict:
-            self.platformLabel.setText(
-                infoDict["platform"])
+            self.platformLabel.setText(infoDict["platform"])
         if "user_agent" in infoDict:
-            self.useragentEdit.setText(
-                infoDict["user_agent"])
+            self.useragentEdit.setText(infoDict["user_agent"])
         else:
             self.useragentLabel.hide()
             self.useragentEdit.hide()
         if "UID" in infoDict and "GID" in infoDict:
             self.uidGidDataLabel.setText(
-                "{0}:{1}".format(infoDict["UID"], infoDict["GID"]))
+                "{0}:{1}".format(infoDict["UID"], infoDict["GID"])
+            )
         else:
             self.uidGidLabel.hide()
             self.uidGidDataLabel.hide()
         if "netrc_file" in infoDict:
             if infoDict["netrc_file"]:
-                self.netrcEdit.setText(
-                    infoDict["netrc_file"])
+                self.netrcEdit.setText(infoDict["netrc_file"])
             else:
-                self.netrcEdit.setText(
-                    self.tr("None"))
+                self.netrcEdit.setText(self.tr("None"))
         else:
             self.netrcLabel.hide()
             self.netrcEdit.hide()
         if "offline" in infoDict:
-            self.offlineCheckBox.setChecked(
-                infoDict["offline"])
+            self.offlineCheckBox.setChecked(infoDict["offline"])
--- a/src/eric7/CondaInterface/CondaNewEnvironmentDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaNewEnvironmentDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to enter data for a new conda environment.
     """
+
     def __init__(self, title, showRequirements, parent=None):
         """
         Constructor
-        
+
         @param title tirle of the dialog
         @type str
         @param showRequirements flag indicating to show the requirements
@@ -33,23 +34,24 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowTitle(title)
-        
+
         self.__requirementsMode = showRequirements
-        
+
         self.requirementsFilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.requirementsFilePicker.setFilters(
-            self.tr("Text Files (*.txt);;All Files (*)"))
-        
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+
         self.requirementsLabel.setVisible(showRequirements)
         self.requirementsFilePicker.setVisible(showRequirements)
-        
+
         self.__updateOK()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-   
+
     def __updateOK(self):
         """
         Private method to update the enabled state of the OK button.
@@ -57,56 +59,49 @@
         enable = bool(self.nameEdit.text()) and bool(self.condaNameEdit.text())
         if self.__requirementsMode:
             enable &= bool(self.requirementsFilePicker.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the logical name.
-        
+
         @param txt current text of the logical name entry
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_condaNameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the conda name.
-        
+
         @param txt current text of the conda name entry
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_requirementsFilePicker_textChanged(self, txt):
         """
         Private slot to handle changes of the requirements file name.
-        
+
         @param txt current text of the requirements file name entry
         @type str
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with the logical name of the new environment, the conda
             name and the requirements file name
         @rtype tuple of (str, str, str)
         """
         requirementsFile = (
-            self.requirementsFilePicker.text()
-            if self.__requirementsMode else
-            ""
+            self.requirementsFilePicker.text() if self.__requirementsMode else ""
         )
-        
-        return (
-            self.nameEdit.text(),
-            self.condaNameEdit.text(),
-            requirementsFile
-        )
+
+        return (self.nameEdit.text(), self.condaNameEdit.text(), requirementsFile)
--- a/src/eric7/CondaInterface/CondaPackageDetailsWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaPackageDetailsWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a widget to show package details.
     """
+
     def __init__(self, details, parent=None):
         """
         Constructor
-        
+
         @param details dictionary containing the package details
         @type dict
         @param parent reference to the parent widget
@@ -30,9 +31,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.headerLabel.setText(self.tr("<b>{0} / {1} / {2}</b>").format(
-            details["name"], details["version"], details["build"]))
+
+        self.headerLabel.setText(
+            self.tr("<b>{0} / {1} / {2}</b>").format(
+                details["name"], details["version"], details["build"]
+            )
+        )
         if "fn" in details:
             self.filenameLabel.setText(details["fn"])
         if "size" in details:
@@ -53,12 +57,11 @@
             self.platformLabel.setText(self.tr("unknown"))
         if "depends" in details:
             self.dependenciesEdit.setPlainText("\n".join(details["depends"]))
-        
+
         if "timestamp" in details:
-            dt = QDateTime.fromMSecsSinceEpoch(details["timestamp"],
-                                               Qt.TimeSpec.UTC)
+            dt = QDateTime.fromMSecsSinceEpoch(details["timestamp"], Qt.TimeSpec.UTC)
             self.timestampLabel.setText(dt.toString("yyyy-MM-dd hh:mm:ss t"))
-        
+
         self.resize(600, 450)
 
 
@@ -66,10 +69,11 @@
     """
     Class implementing a dialog to show package details.
     """
+
     def __init__(self, details, parent=None):
         """
         Constructor
-        
+
         @param details dictionary containing the package details
         @type dict
         @param parent reference to the parent widget
@@ -77,20 +81,19 @@
         """
         super().__init__(parent)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.setLayout(self.__layout)
-        
+
         self.__cw = CondaPackageDetailsWidget(details, self)
         size = self.__cw.size()
         self.__layout.addWidget(self.__cw)
         self.__buttonBox = QDialogButtonBox(self)
-        self.__buttonBox.setStandardButtons(
-            QDialogButtonBox.StandardButton.Close)
+        self.__buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close)
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.resize(size)
         self.setWindowTitle(self.tr("Package Details"))
-        
+
         self.__buttonBox.accepted.connect(self.accept)
         self.__buttonBox.rejected.connect(self.reject)
--- a/src/eric7/CondaInterface/CondaPackagesWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/CondaPackagesWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QWidget, QToolButton, QMenu, QTreeWidgetItem, QApplication, QLineEdit,
-    QDialog
+    QWidget,
+    QToolButton,
+    QMenu,
+    QTreeWidgetItem,
+    QApplication,
+    QLineEdit,
+    QDialog,
 )
 
 from EricWidgets import EricFileDialog, EricMessageBox, EricTextInputDialog
@@ -30,17 +35,18 @@
     """
     Class implementing the conda packages management widget.
     """
+
     # Role definition of packages list
     PackageVersionRole = Qt.ItemDataRole.UserRole + 1
     PackageBuildRole = Qt.ItemDataRole.UserRole + 2
-    
+
     # Role definitions of search results list
     PackageDetailedDataRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, conda, parent=None):
         """
         Constructor
-        
+
         @param conda reference to the conda interface
         @type Conda
         @param parent reference to the parent widget
@@ -48,38 +54,35 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         self.__conda = conda
-        
+
         if not CondaInterface.isCondaAvailable():
             self.baseWidget.hide()
             self.searchWidget.hide()
-        
+
         else:
             self.notAvailableWidget.hide()
-            
+
             self.__initCondaInterface()
-    
+
     def __initCondaInterface(self):
         """
         Private method to initialize the conda interface elements.
         """
         self.statusLabel.hide()
-        
-        self.condaMenuButton.setObjectName(
-            "conda_supermenu_button")
+
+        self.condaMenuButton.setObjectName("conda_supermenu_button")
         self.condaMenuButton.setIcon(UI.PixmapCache.getIcon("superMenu"))
         self.condaMenuButton.setToolTip(self.tr("Conda Menu"))
-        self.condaMenuButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
-        self.condaMenuButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.condaMenuButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.condaMenuButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.condaMenuButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.condaMenuButton.setAutoRaise(True)
         self.condaMenuButton.setShowMenuInside(True)
-        
+
         self.refreshButton.setIcon(UI.PixmapCache.getIcon("reload"))
         self.upgradeButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.upgradeAllButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
@@ -88,34 +91,40 @@
         self.searchButton.setIcon(UI.PixmapCache.getIcon("findNext"))
         self.installButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.showDetailsButton.setIcon(UI.PixmapCache.getIcon("info"))
-        
+
         if CondaInterface.condaVersion() >= (4, 4, 0):
             self.searchOptionsWidget.hide()
         else:
-            self.platformComboBox.addItems(sorted([
-                "", "win-32", "win-64", "osx-64", "linux-32", "linux-64",
-            ]))
-        
+            self.platformComboBox.addItems(
+                sorted(
+                    [
+                        "",
+                        "win-32",
+                        "win-64",
+                        "osx-64",
+                        "linux-32",
+                        "linux-64",
+                    ]
+                )
+            )
+
         self.__initCondaMenu()
         self.__populateEnvironments()
         self.__updateActionButtons()
-        
+
         self.searchWidget.hide()
-        
-        self.__conda.condaEnvironmentCreated.connect(
-            self.on_refreshButton_clicked)
-        self.__conda.condaEnvironmentRemoved.connect(
-            self.on_refreshButton_clicked)
-    
+
+        self.__conda.condaEnvironmentCreated.connect(self.on_refreshButton_clicked)
+        self.__conda.condaEnvironmentRemoved.connect(self.on_refreshButton_clicked)
+
     def __populateEnvironments(self):
         """
         Private method to get a list of environments and populate the selector.
         """
-        environments = [("", "")] + sorted(
-            self.__conda.getCondaEnvironmentsList())
+        environments = [("", "")] + sorted(self.__conda.getCondaEnvironmentsList())
         for environment in environments:
             self.environmentsComboBox.addItem(environment[0], environment[1])
-    
+
     def __initCondaMenu(self):
         """
         Private method to create the super menu and attach it to the super
@@ -123,71 +132,82 @@
         """
         self.__condaMenu = QMenu(self)
         self.__envActs = []
-        
+
         self.__cleanMenu = QMenu(self.tr("Clean"), self)
         self.__cleanMenu.addAction(
-            self.tr("All"), lambda: self.__conda.cleanConda("all"))
+            self.tr("All"), lambda: self.__conda.cleanConda("all")
+        )
+        self.__cleanMenu.addAction(
+            self.tr("Cache"), lambda: self.__conda.cleanConda("index-cache")
+        )
         self.__cleanMenu.addAction(
-            self.tr("Cache"), lambda: self.__conda.cleanConda("index-cache"))
+            self.tr("Lock Files"), lambda: self.__conda.cleanConda("lock")
+        )
         self.__cleanMenu.addAction(
-            self.tr("Lock Files"),
-            lambda: self.__conda.cleanConda("lock"))
+            self.tr("Packages"), lambda: self.__conda.cleanConda("packages")
+        )
         self.__cleanMenu.addAction(
-            self.tr("Packages"), lambda: self.__conda.cleanConda("packages"))
-        self.__cleanMenu.addAction(
-            self.tr("Tarballs"), lambda: self.__conda.cleanConda("tarballs"))
-        
-        self.__condaMenu.addAction(
-            self.tr("About Conda..."), self.__aboutConda)
+            self.tr("Tarballs"), lambda: self.__conda.cleanConda("tarballs")
+        )
+
+        self.__condaMenu.addAction(self.tr("About Conda..."), self.__aboutConda)
+        self.__condaMenu.addSeparator()
+        self.__condaMenu.addAction(self.tr("Update Conda"), self.__conda.updateConda)
+        self.__condaMenu.addSeparator()
+        self.__envActs.append(
+            self.__condaMenu.addAction(
+                self.tr("Install Packages"), self.__installPackages
+            )
+        )
+        self.__envActs.append(
+            self.__condaMenu.addAction(
+                self.tr("Install Requirements"), self.__installRequirements
+            )
+        )
+        self.__condaMenu.addSeparator()
+        self.__envActs.append(
+            self.__condaMenu.addAction(
+                self.tr("Generate Requirements"), self.__generateRequirements
+            )
+        )
         self.__condaMenu.addSeparator()
         self.__condaMenu.addAction(
-            self.tr("Update Conda"), self.__conda.updateConda)
-        self.__condaMenu.addSeparator()
-        self.__envActs.append(self.__condaMenu.addAction(
-            self.tr("Install Packages"), self.__installPackages))
-        self.__envActs.append(self.__condaMenu.addAction(
-            self.tr("Install Requirements"), self.__installRequirements))
-        self.__condaMenu.addSeparator()
-        self.__envActs.append(self.__condaMenu.addAction(
-            self.tr("Generate Requirements"), self.__generateRequirements))
-        self.__condaMenu.addSeparator()
-        self.__condaMenu.addAction(
-            self.tr("Create Environment from Requirements"),
-            self.__createEnvironment)
-        self.__envActs.append(self.__condaMenu.addAction(
-            self.tr("Clone Environment"), self.__cloneEnvironment))
+            self.tr("Create Environment from Requirements"), self.__createEnvironment
+        )
+        self.__envActs.append(
+            self.__condaMenu.addAction(
+                self.tr("Clone Environment"), self.__cloneEnvironment
+            )
+        )
         self.__deleteEnvAct = self.__condaMenu.addAction(
-            self.tr("Delete Environment"), self.__deleteEnvironment)
+            self.tr("Delete Environment"), self.__deleteEnvironment
+        )
         self.__condaMenu.addSeparator()
         self.__condaMenu.addMenu(self.__cleanMenu)
         self.__condaMenu.addSeparator()
         self.__condaMenu.addAction(
-            self.tr("Edit User Configuration..."),
-            self.__editUserConfiguration)
+            self.tr("Edit User Configuration..."), self.__editUserConfiguration
+        )
         self.__condaMenu.addSeparator()
-        self.__condaMenu.addAction(
-            self.tr("Configure..."), self.__condaConfigure)
-        
+        self.__condaMenu.addAction(self.tr("Configure..."), self.__condaConfigure)
+
         self.condaMenuButton.setMenu(self.__condaMenu)
-        
+
         self.__condaMenu.aboutToShow.connect(self.__aboutToShowCondaMenu)
-    
+
     def __selectedUpdateableItems(self):
         """
         Private method to get a list of selected items that can be updated.
-        
+
         @return list of selected items that can be updated
         @rtype list of QTreeWidgetItem
         """
-        return [
-            itm for itm in self.packagesList.selectedItems()
-            if bool(itm.text(2))
-        ]
-    
+        return [itm for itm in self.packagesList.selectedItems() if bool(itm.text(2))]
+
     def __allUpdateableItems(self):
         """
         Private method to get a list of all items that can be updated.
-        
+
         @return list of all items that can be updated
         @rtype list of QTreeWidgetItem
         """
@@ -196,25 +216,22 @@
             itm = self.packagesList.topLevelItem(index)
             if itm.text(2):
                 updateableItems.append(itm)
-        
+
         return updateableItems
-    
+
     def __updateActionButtons(self):
         """
         Private method to set the state of the action buttons.
         """
-        self.upgradeButton.setEnabled(
-            bool(self.__selectedUpdateableItems()))
-        self.uninstallButton.setEnabled(
-            bool(self.packagesList.selectedItems()))
-        self.upgradeAllButton.setEnabled(
-            bool(self.__allUpdateableItems()))
-    
+        self.upgradeButton.setEnabled(bool(self.__selectedUpdateableItems()))
+        self.uninstallButton.setEnabled(bool(self.packagesList.selectedItems()))
+        self.upgradeAllButton.setEnabled(bool(self.__allUpdateableItems()))
+
     @pyqtSlot(int)
     def on_environmentsComboBox_currentIndexChanged(self, index):
         """
         Private slot handling the selection of a conda environment.
-        
+
         @param index index of the selected conda environment
         @type int
         """
@@ -223,31 +240,27 @@
         if prefix:
             self.statusLabel.show()
             self.statusLabel.setText(self.tr("Getting installed packages..."))
-            
+
             with EricOverrideCursor():
                 # 1. populate with installed packages
                 self.packagesList.setUpdatesEnabled(False)
-                installedPackages = self.__conda.getInstalledPackages(
-                    prefix=prefix)
+                installedPackages = self.__conda.getInstalledPackages(prefix=prefix)
                 for package, version, build in installedPackages:
-                    itm = QTreeWidgetItem(self.packagesList,
-                                          [package, version])
+                    itm = QTreeWidgetItem(self.packagesList, [package, version])
                     itm.setData(1, self.PackageVersionRole, version)
                     itm.setData(1, self.PackageBuildRole, build)
                 self.packagesList.setUpdatesEnabled(True)
-                self.statusLabel.setText(
-                    self.tr("Getting outdated packages..."))
+                self.statusLabel.setText(self.tr("Getting outdated packages..."))
                 QApplication.processEvents()
-                
+
                 # 2. update with update information
                 self.packagesList.setUpdatesEnabled(False)
-                updateablePackages = self.__conda.getUpdateablePackages(
-                    prefix=prefix)
+                updateablePackages = self.__conda.getUpdateablePackages(prefix=prefix)
                 for package, version, build in updateablePackages:
                     items = self.packagesList.findItems(
                         package,
-                        Qt.MatchFlag.MatchExactly |
-                        Qt.MatchFlag.MatchCaseSensitive)
+                        Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
+                    )
                     if items:
                         itm = items[0]
                         itm.setText(2, version)
@@ -255,31 +268,37 @@
                         itm.setData(2, self.PackageBuildRole, build)
                         if itm.data(1, self.PackageVersionRole) == version:
                             # build must be different, show in version display
-                            itm.setText(1, self.tr("{0} (Build: {1})").format(
-                                itm.data(1, self.PackageVersionRole),
-                                itm.data(1, self.PackageBuildRole),
-                            ))
-                            itm.setText(2, self.tr("{0} (Build: {1})").format(
-                                itm.data(2, self.PackageVersionRole),
-                                itm.data(2, self.PackageBuildRole),
-                            ))
-                
+                            itm.setText(
+                                1,
+                                self.tr("{0} (Build: {1})").format(
+                                    itm.data(1, self.PackageVersionRole),
+                                    itm.data(1, self.PackageBuildRole),
+                                ),
+                            )
+                            itm.setText(
+                                2,
+                                self.tr("{0} (Build: {1})").format(
+                                    itm.data(2, self.PackageVersionRole),
+                                    itm.data(2, self.PackageBuildRole),
+                                ),
+                            )
+
                 self.packagesList.sortItems(0, Qt.SortOrder.AscendingOrder)
                 for col in range(self.packagesList.columnCount()):
                     self.packagesList.resizeColumnToContents(col)
                 self.packagesList.setUpdatesEnabled(True)
             self.statusLabel.hide()
-        
+
         self.__updateActionButtons()
         self.__updateSearchActionButtons()
-    
+
     @pyqtSlot()
     def on_packagesList_itemSelectionChanged(self):
         """
         Private slot to handle the selection of some items..
         """
         self.__updateActionButtons()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -288,18 +307,19 @@
         currentEnvironment = self.environmentsComboBox.currentText()
         self.environmentsComboBox.clear()
         self.packagesList.clear()
-        
+
         with EricOverrideCursor():
             self.__populateEnvironments()
-            
+
             index = self.environmentsComboBox.findText(
                 currentEnvironment,
-                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive)
+                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
+            )
             if index != -1:
                 self.environmentsComboBox.setCurrentIndex(index)
-        
+
         self.__updateActionButtons()
-    
+
     @pyqtSlot()
     def on_upgradeButton_clicked(self):
         """
@@ -308,22 +328,24 @@
         packages = [itm.text(0) for itm in self.__selectedUpdateableItems()]
         if packages:
             prefix = self.environmentsComboBox.itemData(
-                self.environmentsComboBox.currentIndex())
+                self.environmentsComboBox.currentIndex()
+            )
             ok = self.__conda.updatePackages(packages, prefix=prefix)
             if ok:
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_upgradeAllButton_clicked(self):
         """
         Private slot to upgrade all packages of the selected environment.
         """
         prefix = self.environmentsComboBox.itemData(
-            self.environmentsComboBox.currentIndex())
+            self.environmentsComboBox.currentIndex()
+        )
         ok = self.__conda.updateAllPackages(prefix=prefix)
         if ok:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_uninstallButton_clicked(self):
         """
@@ -332,25 +354,28 @@
         packages = [itm.text(0) for itm in self.packagesList.selectedItems()]
         if packages:
             prefix = self.environmentsComboBox.itemData(
-                self.environmentsComboBox.currentIndex())
+                self.environmentsComboBox.currentIndex()
+            )
             ok = self.__conda.uninstallPackages(packages, prefix=prefix)
             if ok:
                 self.on_refreshButton_clicked()
-    
+
     #######################################################################
     ## Search widget related methods below
     #######################################################################
-    
+
     def __updateSearchActionButtons(self):
         """
         Private method to update the action button states of the search widget.
         """
         enable = len(self.searchResultList.selectedItems()) == 1
         self.installButton.setEnabled(
-            enable and self.environmentsComboBox.currentIndex() > 0)
+            enable and self.environmentsComboBox.currentIndex() > 0
+        )
         self.showDetailsButton.setEnabled(
-            enable and bool(self.searchResultList.selectedItems()[0].parent()))
-    
+            enable and bool(self.searchResultList.selectedItems()[0].parent())
+        )
+
     def __doSearch(self):
         """
         Private method to search for packages.
@@ -361,9 +386,10 @@
             with EricOverrideCursor():
                 prefix = (
                     ""
-                    if CondaInterface.condaVersion() >= (4, 4, 0) else
-                    self.environmentsComboBox.itemData(
-                        self.environmentsComboBox.currentIndex())
+                    if CondaInterface.condaVersion() >= (4, 4, 0)
+                    else self.environmentsComboBox.itemData(
+                        self.environmentsComboBox.currentIndex()
+                    )
                 )
                 ok, result = self.__conda.searchPackages(
                     pattern,
@@ -372,12 +398,11 @@
                     platform=self.platformComboBox.currentText(),
                     prefix=prefix,
                 )
-                
+
                 if ok and result:
                     self.searchResultList.setUpdatesEnabled(False)
                     for package in result:
-                        itm = QTreeWidgetItem(self.searchResultList,
-                                              [package])
+                        itm = QTreeWidgetItem(self.searchResultList, [package])
                         itm.setExpanded(False)
                         for detail in result[package]:
                             version = detail["version"]
@@ -388,13 +413,10 @@
                                 platform = detail["platform"]
                             else:
                                 platform = ""
-                            citm = QTreeWidgetItem(
-                                itm, ["", version, build, platform])
-                            citm.setData(0, self.PackageDetailedDataRole,
-                                         detail)
-                
-                    self.searchResultList.sortItems(
-                        0, Qt.SortOrder.AscendingOrder)
+                            citm = QTreeWidgetItem(itm, ["", version, build, platform])
+                            citm.setData(0, self.PackageDetailedDataRole, detail)
+
+                    self.searchResultList.sortItems(0, Qt.SortOrder.AscendingOrder)
                     self.searchResultList.resizeColumnToContents(0)
                     self.searchResultList.setUpdatesEnabled(True)
             if not ok:
@@ -403,33 +425,33 @@
                 except KeyError:
                     message = result["error"]
                 EricMessageBox.warning(
-                    self,
-                    self.tr("Conda Search Package Error"),
-                    message)
-    
+                    self, self.tr("Conda Search Package Error"), message
+                )
+
     def __showDetails(self, item):
         """
         Private method to show a dialog with details about a package item.
-        
+
         @param item reference to the package item
         @type QTreeWidgetItem
         """
         details = item.data(0, self.PackageDetailedDataRole)
         if details:
             from .CondaPackageDetailsWidget import CondaPackageDetailsDialog
+
             dlg = CondaPackageDetailsDialog(details, self)
             dlg.exec()
-    
+
     @pyqtSlot(str)
     def on_searchEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered search specification.
-        
+
         @param txt current search entry
         @type str
         """
         self.searchButton.setEnabled(bool(txt))
-    
+
     @pyqtSlot()
     def on_searchEdit_returnPressed(self):
         """
@@ -437,14 +459,14 @@
         search edit.
         """
         self.__doSearch()
-    
+
     @pyqtSlot()
     def on_searchButton_clicked(self):
         """
         Private slot handling the press of the search button.
         """
         self.__doSearch()
-    
+
     @pyqtSlot()
     def on_installButton_clicked(self):
         """
@@ -462,13 +484,14 @@
                     item.text(1),
                     item.text(2),
                 )
-            
+
             prefix = self.environmentsComboBox.itemData(
-                self.environmentsComboBox.currentIndex())
+                self.environmentsComboBox.currentIndex()
+            )
             ok = self.__conda.installPackages([package], prefix=prefix)
             if ok:
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_showDetailsButton_clicked(self):
         """
@@ -476,30 +499,30 @@
         """
         item = self.searchResultList.selectedItems()[0]
         self.__showDetails(item)
-    
+
     @pyqtSlot()
     def on_searchResultList_itemSelectionChanged(self):
         """
         Private slot handling a change of selected search results.
         """
         self.__updateSearchActionButtons()
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_searchResultList_itemExpanded(self, item):
         """
         Private slot handling the expansion of an item.
-        
+
         @param item reference to the expanded item
         @type QTreeWidgetItem
         """
         for col in range(1, self.searchResultList.columnCount()):
             self.searchResultList.resizeColumnToContents(col)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_searchResultList_itemDoubleClicked(self, item, column):
         """
         Private slot handling a double click of an item.
-        
+
         @param item reference to the item that was double clicked
         @type QTreeWidgetItem
         @param column column of the double click
@@ -507,27 +530,27 @@
         """
         if item.parent() is not None:
             self.__showDetails(item)
-    
+
     @pyqtSlot(bool)
     def on_searchToggleButton_toggled(self, checked):
         """
         Private slot to togle the search widget.
-        
+
         @param checked state of the search widget button
         @type bool
         """
         self.searchWidget.setVisible(checked)
-        
+
         if checked:
             self.searchEdit.setFocus(Qt.FocusReason.OtherFocusReason)
             self.searchEdit.selectAll()
-            
+
             self.__updateSearchActionButtons()
-    
+
     #######################################################################
     ## Menu related methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def __aboutToShowCondaMenu(self):
         """
@@ -537,54 +560,60 @@
         enable = selectedEnvironment not in [""]
         for act in self.__envActs:
             act.setEnabled(enable)
-        
+
         self.__deleteEnvAct.setEnabled(
-            selectedEnvironment not in ["", self.__conda.RootName])
-    
+            selectedEnvironment not in ["", self.__conda.RootName]
+        )
+
     @pyqtSlot()
     def __aboutConda(self):
         """
         Private slot to show some information about the conda installation.
         """
         infoDict = self.__conda.getCondaInformation()
-        
+
         from .CondaInfoDialog import CondaInfoDialog
+
         dlg = CondaInfoDialog(infoDict, self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __installPackages(self):
         """
         Private slot to install packages.
         """
         prefix = self.environmentsComboBox.itemData(
-            self.environmentsComboBox.currentIndex())
+            self.environmentsComboBox.currentIndex()
+        )
         if prefix:
             ok, packageSpecs = EricTextInputDialog.getText(
                 self,
                 self.tr("Install Packages"),
                 self.tr("Package Specifications (separated by whitespace):"),
                 QLineEdit.EchoMode.Normal,
-                minimumWidth=600)
+                minimumWidth=600,
+            )
             if ok and packageSpecs.strip():
                 packages = [p.strip() for p in packageSpecs.split()]
                 ok = self.__conda.installPackages(packages, prefix=prefix)
                 if ok:
                     self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __installRequirements(self):
         """
         Private slot to install packages from requirements files.
         """
         prefix = self.environmentsComboBox.itemData(
-            self.environmentsComboBox.currentIndex())
+            self.environmentsComboBox.currentIndex()
+        )
         if prefix:
             requirements = EricFileDialog.getOpenFileNames(
                 self,
                 self.tr("Install Packages"),
                 "",
-                self.tr("Text Files (*.txt);;All Files (*)"))
+                self.tr("Text Files (*.txt);;All Files (*)"),
+            )
             if requirements:
                 args = []
                 for requirement in requirements:
@@ -592,38 +621,39 @@
                 ok = self.__conda.installPackages(args, prefix=prefix)
                 if ok:
                     self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __generateRequirements(self):
         """
         Private slot to generate a requirements file.
         """
         prefix = self.environmentsComboBox.itemData(
-            self.environmentsComboBox.currentIndex())
+            self.environmentsComboBox.currentIndex()
+        )
         if prefix:
             env = self.environmentsComboBox.currentText()
-            
+
             from .CondaExportDialog import CondaExportDialog
-            
-            self.__requirementsDialog = CondaExportDialog(
-                self.__conda, env, prefix)
+
+            self.__requirementsDialog = CondaExportDialog(self.__conda, env, prefix)
             self.__requirementsDialog.show()
             QApplication.processEvents()
             self.__requirementsDialog.start()
-    
+
     @pyqtSlot()
     def __cloneEnvironment(self):
         """
         Private slot to clone a conda environment.
         """
-        from .CondaNewEnvironmentDataDialog import (
-            CondaNewEnvironmentDataDialog)
-        
+        from .CondaNewEnvironmentDataDialog import CondaNewEnvironmentDataDialog
+
         prefix = self.environmentsComboBox.itemData(
-            self.environmentsComboBox.currentIndex())
+            self.environmentsComboBox.currentIndex()
+        )
         if prefix:
-            dlg = CondaNewEnvironmentDataDialog(self.tr("Clone Environment"),
-                                                False, self)
+            dlg = CondaNewEnvironmentDataDialog(
+                self.tr("Clone Environment"), False, self
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 virtEnvName, envName, _ = dlg.getData()
                 args = [
@@ -632,22 +662,20 @@
                     "--clone",
                     prefix,
                 ]
-                ok, prefix, interpreter = self.__conda.createCondaEnvironment(
-                    args)
+                ok, prefix, interpreter = self.__conda.createCondaEnvironment(args)
                 if ok:
                     ericApp().getObject("VirtualEnvManager").addVirtualEnv(
-                        virtEnvName, prefix, interpreter, isConda=True)
-    
+                        virtEnvName, prefix, interpreter, isConda=True
+                    )
+
     @pyqtSlot()
     def __createEnvironment(self):
         """
         Private slot to create a conda environment from a requirements file.
         """
-        from .CondaNewEnvironmentDataDialog import (
-            CondaNewEnvironmentDataDialog)
-        
-        dlg = CondaNewEnvironmentDataDialog(self.tr("Create Environment"),
-                                            True, self)
+        from .CondaNewEnvironmentDataDialog import CondaNewEnvironmentDataDialog
+
+        dlg = CondaNewEnvironmentDataDialog(self.tr("Create Environment"), True, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             virtEnvName, envName, requirements = dlg.getData()
             args = [
@@ -659,8 +687,9 @@
             ok, prefix, interpreter = self.__conda.createCondaEnvironment(args)
             if ok:
                 ericApp().getObject("VirtualEnvManager").addVirtualEnv(
-                    virtEnvName, prefix, interpreter, isConda=True)
-    
+                    virtEnvName, prefix, interpreter, isConda=True
+                )
+
     @pyqtSlot()
     def __deleteEnvironment(self):
         """
@@ -670,45 +699,49 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Delete Environment"),
-            self.tr("""<p>Shall the environment <b>{0}</b> really be"""
-                    """ deleted?</p>""").format(envName)
+            self.tr(
+                """<p>Shall the environment <b>{0}</b> really be""" """ deleted?</p>"""
+            ).format(envName),
         )
         if ok:
             self.__conda.removeCondaEnvironment(name=envName)
-    
+
     @pyqtSlot()
     def __editUserConfiguration(self):
         """
         Private slot to edit the user configuration.
         """
         from QScintilla.MiniEditor import MiniEditor
-        
+
         cfgFile = CondaInterface.userConfiguration()
         if not cfgFile:
             return
-        
+
         if not os.path.exists(cfgFile):
             self.__conda.writeDefaultConfiguration()
-        
+
         # check, if the destination is writeable
         if not os.access(cfgFile, os.W_OK):
             EricMessageBox.critical(
                 None,
                 self.tr("Edit Configuration"),
-                self.tr("""The configuration file "{0}" does not exist"""
-                        """ or is not writable.""").format(cfgFile))
+                self.tr(
+                    """The configuration file "{0}" does not exist"""
+                    """ or is not writable."""
+                ).format(cfgFile),
+            )
             return
-        
+
         self.__editor = MiniEditor(cfgFile, "YAML")
         self.__editor.show()
-    
+
     @pyqtSlot()
     def __condaConfigure(self):
         """
         Private slot to open the configuration page.
         """
         ericApp().getObject("UserInterface").showPreferences("condaPage")
-    
+
     @pyqtSlot()
     def on_recheckButton_clicked(self):
         """
@@ -717,6 +750,6 @@
         """
         if CondaInterface.isCondaAvailable():
             self.__initCondaInterface()
-            
+
             self.notAvailableWidget.hide()
             self.baseWidget.show()
--- a/src/eric7/CondaInterface/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CondaInterface/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,53 +27,52 @@
     """
     global __CondaVersionStr, __CondaVersion, __CondaRootPrefix
     global __CondaUserConfig, __initialized
-    
+
     if not __initialized:
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
-        
+
         proc = QProcess()
         proc.start(exe, ["info", "--json"])
         if not proc.waitForStarted(msecs=15000):
             __CondaVersionStr = QCoreApplication.translate(
-                "CondaInterface",
-                '<conda not found or not configured.>')
+                "CondaInterface", "<conda not found or not configured.>"
+            )
         else:
             proc.waitForFinished(msecs=15000)
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             try:
                 jsonDict = json.loads(output)
             except Exception:
                 __CondaVersionStr = QCoreApplication.translate(
-                    "CondaInterface",
-                    '<conda returned invalid data.>')
+                    "CondaInterface", "<conda returned invalid data.>"
+                )
                 return
-            
+
             if "error" in jsonDict:
                 __CondaVersionStr = QCoreApplication.translate(
-                    "CondaInterface",
-                    '<conda returned an error: {0}.>').format(
-                    jsonDict["error"])
+                    "CondaInterface", "<conda returned an error: {0}.>"
+                ).format(jsonDict["error"])
             else:
                 __CondaVersionStr = jsonDict["conda_version"]
-                __CondaVersion = tuple(
-                    int(i) for i in __CondaVersionStr.split(".")
-                )
+                __CondaVersion = tuple(int(i) for i in __CondaVersionStr.split("."))
                 __CondaRootPrefix = jsonDict["root_prefix"]
                 __CondaUserConfig = jsonDict.get("user_rc_path")
                 if __CondaUserConfig is None:
                     __CondaUserConfig = jsonDict.get("rc_path")
-                
+
                 __initialized = True
 
 
 def condaVersion():
     """
     Module function to get the conda version.
-    
+
     @return tuple containing the conda version
     @rtype tuple of (int, int, int)
     """
@@ -84,7 +83,7 @@
 def condaVersionStr():
     """
     Module function to get the conda version as a string.
-    
+
     @return conda version as a string
     @rtype str
     """
@@ -95,7 +94,7 @@
 def rootPrefix():
     """
     Module function to get the root prefix.
-    
+
     @return root prefix
     @rtype str
     """
@@ -106,7 +105,7 @@
 def userConfiguration():
     """
     Module function to get the path of the user configuration file.
-    
+
     @return path of the user configuration file
     @rtype str
     """
@@ -117,7 +116,7 @@
 def isCondaAvailable():
     """
     Module function to check the availability of conda.
-    
+
     @return flag indicating conda availability
     @rtype bool
     """
@@ -130,5 +129,5 @@
     Module function to reset the conda interface.
     """
     global __initialized
-    
+
     __initialized = False
--- a/src/eric7/Cooperation/ChatWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Cooperation/ChatWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -29,7 +29,7 @@
 class ChatWidget(QWidget, Ui_ChatWidget):
     """
     Class implementing the chat dialog.
-    
+
     @signal connected(connected) emitted to signal a change of the connected
             state (bool)
     @signal editorCommand(hashStr, filename, message) emitted when an editor
@@ -39,43 +39,40 @@
     @signal sendEdit() emitted to send a shared edit session
     @signal cancelEdit() emitted to cancel a shared edit session
     """
+
     connected = pyqtSignal(bool)
     editorCommand = pyqtSignal(str, str, str)
-    
+
     shareEditor = pyqtSignal(bool)
     startEdit = pyqtSignal()
     sendEdit = pyqtSignal()
     cancelEdit = pyqtSignal()
-    
+
     def __init__(self, ui, port=-1, parent=None):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UserInterface)
         @param port port to be used for the cooperation server (integer)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.shareButton.setIcon(
-            UI.PixmapCache.getIcon("sharedEditDisconnected"))
-        self.startEditButton.setIcon(
-            UI.PixmapCache.getIcon("sharedEditStart"))
-        self.sendEditButton.setIcon(
-            UI.PixmapCache.getIcon("sharedEditSend"))
-        self.cancelEditButton.setIcon(
-            UI.PixmapCache.getIcon("sharedEditCancel"))
-        
+
+        self.shareButton.setIcon(UI.PixmapCache.getIcon("sharedEditDisconnected"))
+        self.startEditButton.setIcon(UI.PixmapCache.getIcon("sharedEditStart"))
+        self.sendEditButton.setIcon(UI.PixmapCache.getIcon("sharedEditSend"))
+        self.cancelEditButton.setIcon(UI.PixmapCache.getIcon("sharedEditCancel"))
+
         self.hostEdit.lineEdit().setClearButtonEnabled(True)
-        
+
         self.__ui = ui
         self.__client = CooperationClient(self)
         self.__myNickName = self.__client.nickName()
-        
+
         self.__initChatMenu()
         self.__initUsersMenu()
-        
+
         self.messageEdit.returnPressed.connect(self.__handleMessage)
         self.sendButton.clicked.connect(self.__handleMessage)
         self.__client.newMessage.connect(self.appendMessage)
@@ -84,22 +81,22 @@
         self.__client.connectionError.connect(self.__showErrorMessage)
         self.__client.cannotConnect.connect(self.__initialConnectionRefused)
         self.__client.editorCommand.connect(self.__editorCommandMessage)
-        
+
         self.serverButton.setText(self.tr("Start Server"))
         self.serverLed.setColor(QColor(Qt.GlobalColor.red))
         if port == -1:
             port = Preferences.getCooperation("ServerPort")
-        
+
         self.serverPortSpin.setValue(port)
-        
+
         self.__setConnected(False)
-        
+
         if Preferences.getCooperation("AutoStartServer"):
             self.on_serverButton_clicked()
-        
+
         self.recent = []
         self.__loadHostsHistory()
-    
+
     def __loadHostsHistory(self):
         """
         Private method to load the recently connected hosts.
@@ -112,18 +109,18 @@
             self.hostEdit.clear()
             self.hostEdit.addItems(self.__recent)
             self.hostEdit.clearEditText()
-    
+
     def __saveHostsHistory(self):
         """
         Private method to save the list of recently connected hosts.
         """
         Preferences.Prefs.rsettings.setValue(recentNameHosts, self.__recent)
         Preferences.Prefs.rsettings.sync()
-    
+
     def __setHostsHistory(self, host):
         """
         Private method to remember the given host as the most recent entry.
-        
+
         @param host host entry to remember (string)
         """
         if host in self.__recent:
@@ -132,7 +129,7 @@
         self.__saveHostsHistory()
         self.hostEdit.clear()
         self.hostEdit.addItems(self.__recent)
-    
+
     def __clearHostsHistory(self):
         """
         Private slot to clear the hosts history.
@@ -141,7 +138,7 @@
         self.__saveHostsHistory()
         self.hostEdit.clear()
         self.hostEdit.addItems(self.__recent)
-    
+
     def __handleMessage(self):
         """
         Private slot handling the Return key pressed in the message edit.
@@ -149,115 +146,127 @@
         text = self.messageEdit.text()
         if text == "":
             return
-        
+
         if text.startswith("/"):
             self.__showErrorMessage(
-                self.tr("! Unknown command: {0}\n")
-                    .format(text.split()[0]))
+                self.tr("! Unknown command: {0}\n").format(text.split()[0])
+            )
         else:
             self.__client.sendMessage(text)
             self.appendMessage(self.__myNickName, text)
-        
+
         self.messageEdit.clear()
-    
+
     def __newParticipant(self, nick):
         """
         Private slot handling a new participant joining.
-        
+
         @param nick nick name of the new participant (string)
         """
         if nick == "":
             return
-        
+
         color = self.chatEdit.textColor()
         self.chatEdit.setTextColor(Qt.GlobalColor.gray)
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + ":")
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + ":"
+        )
         self.chatEdit.append(self.tr("* {0} has joined.\n").format(nick))
         self.chatEdit.setTextColor(color)
-        
+
         QListWidgetItem(
             UI.PixmapCache.getIcon(
-                "chatUser{0}".format(1 + self.usersList.count() % 6)),
-            nick, self.usersList)
-        
+                "chatUser{0}".format(1 + self.usersList.count() % 6)
+            ),
+            nick,
+            self.usersList,
+        )
+
         if not self.__connected:
             self.__setConnected(True)
-        
+
         if not self.isVisible():
             self.__ui.showNotification(
                 UI.PixmapCache.getPixmap("cooperation48"),
-                self.tr("New User"), self.tr("{0} has joined.")
-                    .format(nick))
+                self.tr("New User"),
+                self.tr("{0} has joined.").format(nick),
+            )
 
     def __participantLeft(self, nick):
         """
         Private slot handling a participant leaving the session.
-        
+
         @param nick nick name of the participant (string)
         """
         if nick == "":
             return
-        
+
         items = self.usersList.findItems(nick, Qt.MatchFlag.MatchExactly)
         for item in items:
             self.usersList.takeItem(self.usersList.row(item))
             del item
-            
+
             color = self.chatEdit.textColor()
             self.chatEdit.setTextColor(Qt.GlobalColor.gray)
             self.chatEdit.append(
-                QDateTime.currentDateTime().toString(
-                    Qt.DateFormat.SystemLocaleLongDate) + ":")
+                QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+                + ":"
+            )
             self.chatEdit.append(self.tr("* {0} has left.\n").format(nick))
             self.chatEdit.setTextColor(color)
-        
+
         if not self.__client.hasConnections():
             self.__setConnected(False)
-        
+
         if not self.isVisible():
             self.__ui.showNotification(
                 UI.PixmapCache.getPixmap("cooperation48"),
-                self.tr("User Left"), self.tr("{0} has left.")
-                    .format(nick))
-    
+                self.tr("User Left"),
+                self.tr("{0} has left.").format(nick),
+            )
+
     def appendMessage(self, from_, message):
         """
         Public slot to append a message to the display.
-        
+
         @param from_ originator of the message (string)
         @param message message to be appended (string)
         """
         if from_ == "" or message == "":
             return
-        
+
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + " <" + from_ + ">:")
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + " <"
+            + from_
+            + ">:"
+        )
         self.chatEdit.append(message + "\n")
         bar = self.chatEdit.verticalScrollBar()
         bar.setValue(bar.maximum())
-        
+
         if not self.isVisible():
             self.__ui.showNotification(
                 UI.PixmapCache.getPixmap("cooperation48"),
-                self.tr("Message from <{0}>").format(from_), message)
-    
+                self.tr("Message from <{0}>").format(from_),
+                message,
+            )
+
     @pyqtSlot(str)
     def on_hostEdit_editTextChanged(self, host):
         """
         Private slot handling the entry of a host to connect to.
-        
+
         @param host host to connect to (string)
         """
         if not self.__connected:
             self.connectButton.setEnabled(host != "")
-    
+
     def __getConnectionParameters(self):
         """
         Private method to determine the connection parameters.
-        
+
         @return tuple with hostname and port (string, integer)
         """
         hostEntry = self.hostEdit.currentText()
@@ -273,7 +282,7 @@
             port = Preferences.getCooperation("ServerPort")
             self.hostEdit.setEditText("{0}@{1}".format(host, port))
         return host, port
-    
+
     @pyqtSlot()
     def on_connectButton_clicked(self):
         """
@@ -290,14 +299,14 @@
         else:
             self.__client.disconnectConnections()
             self.__setConnected(False)
-    
+
     @pyqtSlot()
     def on_clearHostsButton_clicked(self):
         """
         Private slot to clear the hosts list.
         """
         self.__clearHostsHistory()
-    
+
     @pyqtSlot()
     def on_serverButton_clicked(self):
         """
@@ -307,14 +316,11 @@
             self.__client.close()
             self.serverButton.setText(self.tr("Start Server"))
             self.serverPortSpin.setEnabled(True)
-            if (self.serverPortSpin.value() !=
-                    Preferences.getCooperation("ServerPort")):
-                self.serverPortSpin.setValue(
-                    Preferences.getCooperation("ServerPort"))
+            if self.serverPortSpin.value() != Preferences.getCooperation("ServerPort"):
+                self.serverPortSpin.setValue(Preferences.getCooperation("ServerPort"))
             self.serverLed.setColor(QColor(Qt.GlobalColor.red))
         else:
-            res, port = self.__client.startListening(
-                self.serverPortSpin.value())
+            res, port = self.__client.startListening(self.serverPortSpin.value())
             if res:
                 self.serverButton.setText(self.tr("Stop Server"))
                 self.serverPortSpin.setValue(port)
@@ -322,14 +328,13 @@
                 self.serverLed.setColor(QColor(Qt.GlobalColor.green))
             else:
                 self.__showErrorMessage(
-                    self.tr("! Server Error: {0}\n").format(
-                        self.__client.errorString())
+                    self.tr("! Server Error: {0}\n").format(self.__client.errorString())
                 )
-    
+
     def __setConnected(self, connected):
         """
         Private slot to set the connected state.
-        
+
         @param connected new connected state (boolean)
         """
         if connected:
@@ -347,91 +352,91 @@
         self.hostEdit.setEnabled(not connected)
         self.serverButton.setEnabled(not connected)
         self.sharingGroup.setEnabled(connected)
-        
+
         if connected:
             vm = ericApp().getObject("ViewManager")
             aw = vm.activeWindow()
             if aw:
                 self.checkEditorActions(aw)
-    
+
     def __showErrorMessage(self, message):
         """
         Private slot to show an error message.
-        
+
         @param message error message to show (string)
         """
         color = self.chatEdit.textColor()
         self.chatEdit.setTextColor(Qt.GlobalColor.red)
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + ":")
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + ":"
+        )
         self.chatEdit.append(message + "\n")
         self.chatEdit.setTextColor(color)
-    
+
     def __initialConnectionRefused(self):
         """
         Private slot to handle the refusal of the initial connection.
         """
         self.__setConnected(False)
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         if not self.__client.isListening():
-            self.serverPortSpin.setValue(
-                Preferences.getCooperation("ServerPort"))
+            self.serverPortSpin.setValue(Preferences.getCooperation("ServerPort"))
             if Preferences.getCooperation("AutoStartServer"):
                 self.on_serverButton_clicked()
-    
+
     def getClient(self):
         """
         Public method to get a reference to the cooperation client.
-        
+
         @return reference to the cooperation client (CooperationClient)
         """
         return self.__client
-    
+
     def __editorCommandMessage(self, hashStr, fileName, message):
         """
         Private slot to handle editor command messages from the client.
-        
+
         @param hashStr hash of the project (string)
         @param fileName project relative file name of the editor (string)
         @param message command message (string)
         """
         self.editorCommand.emit(hashStr, fileName, message)
-        
+
         from QScintilla.Editor import Editor
-        if (message.startswith(Editor.StartEditToken + Editor.Separator) or
-                message.startswith(Editor.EndEditToken + Editor.Separator)):
+
+        if message.startswith(
+            Editor.StartEditToken + Editor.Separator
+        ) or message.startswith(Editor.EndEditToken + Editor.Separator):
             vm = ericApp().getObject("ViewManager")
             aw = vm.activeWindow()
             if aw:
                 self.checkEditorActions(aw)
-    
+
     @pyqtSlot(bool)
     def on_shareButton_clicked(self, checked):
         """
         Private slot to share the current editor.
-        
+
         @param checked flag indicating the button state (boolean)
         """
         if checked:
-            self.shareButton.setIcon(
-                UI.PixmapCache.getIcon("sharedEditConnected"))
+            self.shareButton.setIcon(UI.PixmapCache.getIcon("sharedEditConnected"))
         else:
-            self.shareButton.setIcon(
-                UI.PixmapCache.getIcon("sharedEditDisconnected"))
+            self.shareButton.setIcon(UI.PixmapCache.getIcon("sharedEditDisconnected"))
         self.startEditButton.setEnabled(checked)
-        
+
         self.shareEditor.emit(checked)
-    
+
     @pyqtSlot(bool)
     def on_startEditButton_clicked(self, checked):
         """
         Private slot to start a shared edit session.
-        
+
         @param checked flag indicating the button state (boolean)
         """
         if checked:
@@ -439,9 +444,9 @@
             self.cancelEditButton.setEnabled(True)
             self.shareButton.setEnabled(False)
             self.startEditButton.setEnabled(False)
-            
+
             self.startEdit.emit()
-    
+
     @pyqtSlot()
     def on_sendEditButton_clicked(self):
         """
@@ -452,9 +457,9 @@
         self.shareButton.setEnabled(True)
         self.startEditButton.setEnabled(True)
         self.startEditButton.setChecked(False)
-        
+
         self.sendEdit.emit()
-    
+
     @pyqtSlot()
     def on_cancelEditButton_clicked(self):
         """
@@ -465,72 +470,69 @@
         self.shareButton.setEnabled(True)
         self.startEditButton.setEnabled(True)
         self.startEditButton.setChecked(False)
-        
+
         self.cancelEdit.emit()
-    
+
     def checkEditorActions(self, editor):
         """
         Public slot to set action according to an editor's state.
-        
+
         @param editor reference to the editor (Editor)
         """
         shareable, sharing, editing, remoteEditing = editor.getSharingStatus()
-        
+
         self.shareButton.setChecked(sharing)
         if sharing:
-            self.shareButton.setIcon(
-                UI.PixmapCache.getIcon("sharedEditConnected"))
+            self.shareButton.setIcon(UI.PixmapCache.getIcon("sharedEditConnected"))
         else:
-            self.shareButton.setIcon(
-                UI.PixmapCache.getIcon("sharedEditDisconnected"))
+            self.shareButton.setIcon(UI.PixmapCache.getIcon("sharedEditDisconnected"))
         self.startEditButton.setChecked(editing)
-        
+
         self.shareButton.setEnabled(shareable and not editing)
-        self.startEditButton.setEnabled(
-            sharing and not editing and not remoteEditing)
+        self.startEditButton.setEnabled(sharing and not editing and not remoteEditing)
         self.sendEditButton.setEnabled(editing)
         self.cancelEditButton.setEnabled(editing)
-    
+
     def __initChatMenu(self):
         """
         Private slot to initialize the chat edit context menu.
         """
         self.__chatMenu = QMenu(self)
         self.__copyChatAct = self.__chatMenu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy"), self.__copyChat)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyChat
+        )
         self.__chatMenu.addSeparator()
         self.__cutAllChatAct = self.__chatMenu.addAction(
-            UI.PixmapCache.getIcon("editCut"),
-            self.tr("Cut all"), self.__cutAllChat)
+            UI.PixmapCache.getIcon("editCut"), self.tr("Cut all"), self.__cutAllChat
+        )
         self.__copyAllChatAct = self.__chatMenu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy all"), self.__copyAllChat)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy all"), self.__copyAllChat
+        )
         self.__chatMenu.addSeparator()
         self.__clearChatAct = self.__chatMenu.addAction(
-            UI.PixmapCache.getIcon("editDelete"),
-            self.tr("Clear"), self.__clearChat)
+            UI.PixmapCache.getIcon("editDelete"), self.tr("Clear"), self.__clearChat
+        )
         self.__chatMenu.addSeparator()
         self.__saveChatAct = self.__chatMenu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr("Save"), self.__saveChat)
-        
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__saveChat
+        )
+
         self.on_chatEdit_copyAvailable(False)
-    
+
     @pyqtSlot(bool)
     def on_chatEdit_copyAvailable(self, yes):
         """
         Private slot to react to text selection/deselection of the chat edit.
-        
+
         @param yes flag signaling the availability of selected text (boolean)
         """
         self.__copyChatAct.setEnabled(yes)
-    
+
     @pyqtSlot(QPoint)
     def on_chatEdit_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu for the chat.
-        
+
         @param pos the position of the mouse pointer (QPoint)
         """
         enable = self.chatEdit.toPlainText() != ""
@@ -538,13 +540,13 @@
         self.__copyAllChatAct.setEnabled(enable)
         self.__cutAllChatAct.setEnabled(enable)
         self.__chatMenu.popup(self.chatEdit.mapToGlobal(pos))
-    
+
     def __clearChat(self):
         """
         Private slot to clear the contents of the chat display.
         """
         self.chatEdit.clear()
-    
+
     def __saveChat(self):
         """
         Private slot to save the contents of the chat display.
@@ -557,7 +559,8 @@
                 "",
                 self.tr("Text Files (*.txt);;All Files (*)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -568,12 +571,15 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Chat"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 try:
                     with fpath.open("w", encoding="utf-8") as f:
                         f.write(txt)
@@ -581,17 +587,19 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Error saving Chat"),
-                        self.tr("""<p>The chat contents could not be"""
-                                """ written to <b>{0}</b></p>"""
-                                """<p>Reason: {1}</p>""")
-                        .format(fpath, str(err)))
-    
+                        self.tr(
+                            """<p>The chat contents could not be"""
+                            """ written to <b>{0}</b></p>"""
+                            """<p>Reason: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
+
     def __copyChat(self):
         """
         Private slot to copy the contents of the chat display to the clipboard.
         """
         self.chatEdit.copy()
-    
+
     def __copyAllChat(self):
         """
         Private slot to copy the contents of the chat display to the clipboard.
@@ -600,7 +608,7 @@
         if txt:
             cb = QApplication.clipboard()
             cb.setText(txt)
-    
+
     def __cutAllChat(self):
         """
         Private slot to cut the contents of the chat display to the clipboard.
@@ -610,7 +618,7 @@
             cb = QApplication.clipboard()
             cb.setText(txt)
         self.chatEdit.clear()
-    
+
     def __initUsersMenu(self):
         """
         Private slot to initialize the users list context menu.
@@ -618,19 +626,23 @@
         self.__usersMenu = QMenu(self)
         self.__kickUserAct = self.__usersMenu.addAction(
             UI.PixmapCache.getIcon("chatKickUser"),
-            self.tr("Kick User"), self.__kickUser)
+            self.tr("Kick User"),
+            self.__kickUser,
+        )
         self.__banUserAct = self.__usersMenu.addAction(
-            UI.PixmapCache.getIcon("chatBanUser"),
-            self.tr("Ban User"), self.__banUser)
+            UI.PixmapCache.getIcon("chatBanUser"), self.tr("Ban User"), self.__banUser
+        )
         self.__banKickUserAct = self.__usersMenu.addAction(
             UI.PixmapCache.getIcon("chatBanKickUser"),
-            self.tr("Ban and Kick User"), self.__banKickUser)
-    
+            self.tr("Ban and Kick User"),
+            self.__banKickUser,
+        )
+
     @pyqtSlot(QPoint)
     def on_usersList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu for the users list.
-        
+
         @param pos the position of the mouse pointer (QPoint)
         """
         itm = self.usersList.itemAt(pos)
@@ -638,56 +650,63 @@
         self.__banUserAct.setEnabled(itm is not None)
         self.__banKickUserAct.setEnabled(itm is not None)
         self.__usersMenu.popup(self.usersList.mapToGlobal(pos))
-    
+
     def __kickUser(self):
         """
         Private slot to disconnect a user.
         """
         itm = self.usersList.currentItem()
         self.__client.kickUser(itm.text())
-        
+
         color = self.chatEdit.textColor()
         self.chatEdit.setTextColor(Qt.GlobalColor.darkYellow)
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + ":")
-        self.chatEdit.append(self.tr("* {0} has been kicked.\n").format(
-            itm.text().split("@")[0]))
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + ":"
+        )
+        self.chatEdit.append(
+            self.tr("* {0} has been kicked.\n").format(itm.text().split("@")[0])
+        )
         self.chatEdit.setTextColor(color)
-    
+
     def __banUser(self):
         """
         Private slot to ban a user.
         """
         itm = self.usersList.currentItem()
         self.__client.banUser(itm.text())
-        
+
         color = self.chatEdit.textColor()
         self.chatEdit.setTextColor(Qt.GlobalColor.darkYellow)
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + ":")
-        self.chatEdit.append(self.tr("* {0} has been banned.\n").format(
-            itm.text().split("@")[0]))
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + ":"
+        )
+        self.chatEdit.append(
+            self.tr("* {0} has been banned.\n").format(itm.text().split("@")[0])
+        )
         self.chatEdit.setTextColor(color)
-    
+
     def __banKickUser(self):
         """
         Private slot to ban and kick a user.
         """
         itm = self.usersList.currentItem()
         self.__client.banKickUser(itm.text())
-        
+
         color = self.chatEdit.textColor()
         self.chatEdit.setTextColor(Qt.GlobalColor.darkYellow)
         self.chatEdit.append(
-            QDateTime.currentDateTime().toString(
-                Qt.DateFormat.SystemLocaleLongDate) + ":")
+            QDateTime.currentDateTime().toString(Qt.DateFormat.SystemLocaleLongDate)
+            + ":"
+        )
         self.chatEdit.append(
-            self.tr("* {0} has been banned and kicked.\n")
-                .format(itm.text().split("@")[0]))
+            self.tr("* {0} has been banned and kicked.\n").format(
+                itm.text().split("@")[0]
+            )
+        )
         self.chatEdit.setTextColor(color)
-    
+
     def shutdown(self):
         """
         Public method to shut down the cooperation system.
--- a/src/eric7/Cooperation/Connection.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Cooperation/Connection.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,14 +19,14 @@
 TransferTimeout = 30 * 1000
 PongTimeout = 60 * 1000
 PingInterval = 5 * 1000
-SeparatorToken = '|||'
-SeparatorToken_b = b'|||'
+SeparatorToken = "|||"
+SeparatorToken_b = b"|||"
 
 
 class Connection(QTcpSocket):
     """
     Class representing a peer connection.
-    
+
     @signal readyForUse() emitted when the connection is ready for use
     @signal newMessage(user, message) emitted after a new message has
         arrived (string, string)
@@ -39,10 +39,11 @@
     @signal rejected(message) emitted after a connection has been rejected
         (string)
     """
+
     WaitingForGreeting = 0
     ReadingGreeting = 1
     ReadyForUse = 2
-    
+
     PlainText = 0
     Ping = 1
     Pong = 2
@@ -51,7 +52,7 @@
     Participants = 5
     Editor = 6
     Undefined = 99
-    
+
     ProtocolMessage = "MESSAGE"
     ProtocolPing = "PING"
     ProtocolPong = "PONG"
@@ -59,22 +60,22 @@
     ProtocolGetParticipants = "GET_PARTICIPANTS"
     ProtocolParticipants = "PARTICIPANTS"
     ProtocolEditor = "EDITOR"
-    
+
     readyForUse = pyqtSignal()
     newMessage = pyqtSignal(str, str)
     getParticipants = pyqtSignal()
     participants = pyqtSignal(list)
     editorCommand = pyqtSignal(str, str, str)
     rejected = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent referenec to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__greetingMessage = self.tr("undefined")
         self.__username = self.tr("unknown")
         self.__serverPort = 0
@@ -88,72 +89,77 @@
         self.__pongTime = QTime()
         self.__buffer = QByteArray()
         self.__client = None
-        
+
         self.readyRead.connect(self.__processReadyRead)
         self.disconnected.connect(self.__disconnected)
         self.__pingTimer.timeout.connect(self.__sendPing)
         self.connected.connect(self.__sendGreetingMessage)
-    
+
     def name(self):
         """
         Public method to get the connection name.
-        
+
         @return connection name (string)
         """
         return self.__username
-    
+
     def serverPort(self):
         """
         Public method to get the server port.
-        
+
         @return server port (integer)
         """
         return self.__serverPort
-    
+
     def setClient(self, client):
         """
         Public method to set the reference to the cooperation client.
-        
+
         @param client reference to the cooperation client (CooperationClient)
         """
         self.__client = client
-    
+
     def setGreetingMessage(self, message, serverPort):
         """
         Public method to set the greeting message.
-        
+
         @param message greeting message (string)
         @param serverPort port number to include in the message (integer)
         """
         self.__greetingMessage = "{0}:{1}".format(message, serverPort)
-    
+
     def sendMessage(self, message):
         """
         Public method to send a message.
-        
+
         @param message message to be sent (string)
         @return flag indicating a successful send (boolean)
         """
         if message == "":
             return False
-        
+
         msg = QByteArray(message.encode("utf-8"))
-        data = QByteArray("{0}{1}{2}{1}".format(
-            Connection.ProtocolMessage, SeparatorToken, msg.size())
-            .encode("utf-8")) + msg
+        data = (
+            QByteArray(
+                "{0}{1}{2}{1}".format(
+                    Connection.ProtocolMessage, SeparatorToken, msg.size()
+                ).encode("utf-8")
+            )
+            + msg
+        )
         return self.write(data) == data.size()
-    
+
     def timerEvent(self, evt):
         """
         Protected method to handle timer events.
-        
+
         @param evt reference to the timer event (QTimerEvent)
         """
         if evt.timerId() == self.__transferTimerId:
             self.abort()
             self.killTimer(self.__transferTimerId)
             self.__transferTimerId = 0
-    
+
     def __processReadyRead(self):
         """
         Private slot to handle the readyRead signal.
@@ -165,62 +171,63 @@
                 self.abort()
                 return
             self.__state = Connection.ReadingGreeting
-        
+
         if self.__state == Connection.ReadingGreeting:
             if not self.__hasEnoughData():
                 return
-            
-            self.__buffer = QByteArray(
-                self.read(self.__numBytesForCurrentDataType))
+
+            self.__buffer = QByteArray(self.read(self.__numBytesForCurrentDataType))
             if self.__buffer.size() != self.__numBytesForCurrentDataType:
                 self.abort()
                 return
-            
+
             try:
-                user, serverPort = (
-                    str(self.__buffer, encoding="utf-8").split(":"))
+                user, serverPort = str(self.__buffer, encoding="utf-8").split(":")
             except ValueError:
                 self.abort()
                 return
             self.__serverPort = int(serverPort)
-            
+
             hostInfo = QHostInfo.fromName(self.peerAddress().toString())
             self.__username = "{0}@{1}@{2}".format(
-                user,
-                hostInfo.hostName(),
-                self.peerPort()
+                user, hostInfo.hostName(), self.peerPort()
             )
             self.__currentDataType = Connection.Undefined
             self.__numBytesForCurrentDataType = 0
             self.__buffer.clear()
-            
+
             if not self.isValid():
                 self.abort()
                 return
-            
+
             bannedName = "{0}@{1}".format(
                 user,
                 hostInfo.hostName(),
             )
             Preferences.syncPreferences()
             if bannedName in Preferences.getCooperation("BannedUsers"):
-                self.rejected.emit(self.tr(
-                    "* Connection attempted by banned user '{0}'.")
-                    .format(bannedName))
+                self.rejected.emit(
+                    self.tr("* Connection attempted by banned user '{0}'.").format(
+                        bannedName
+                    )
+                )
                 self.abort()
                 return
-            
-            if (self.__serverPort != self.peerPort() and
-                    not Preferences.getCooperation("AutoAcceptConnections")):
+
+            if self.__serverPort != self.peerPort() and not Preferences.getCooperation(
+                "AutoAcceptConnections"
+            ):
                 # don't ask for reverse connections or
                 # if we shall accept automatically
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("New Connection"),
-                    self.tr("""<p>Accept connection from """
-                            """<strong>{0}@{1}</strong>?</p>""").format(
-                        user, hostInfo.hostName()),
-                    yesDefault=True)
+                    self.tr(
+                        """<p>Accept connection from """
+                        """<strong>{0}@{1}</strong>?</p>"""
+                    ).format(user, hostInfo.hostName()),
+                    yesDefault=True,
+                )
                 if not res:
                     self.abort()
                     return
@@ -228,29 +235,28 @@
             if self.__client is not None:
                 chatWidget = self.__client.chatWidget()
                 if chatWidget is not None and not chatWidget.isVisible():
-                    ericApp().getObject(
-                        "UserInterface").activateCooperationViewer()
-            
+                    ericApp().getObject("UserInterface").activateCooperationViewer()
+
             if not self.__isGreetingMessageSent:
                 self.__sendGreetingMessage()
-            
+
             self.__pingTimer.start()
             self.__pongTime = QTime.currentTime()
             self.__state = Connection.ReadyForUse
             self.readyForUse.emit()
-        
+
         while self.bytesAvailable():
             if (
-                self.__currentDataType == Connection.Undefined and
-                not self.__readProtocolHeader()
+                self.__currentDataType == Connection.Undefined
+                and not self.__readProtocolHeader()
             ):
                 return
-            
+
             if not self.__hasEnoughData():
                 return
-            
+
             self.__processData()
-    
+
     def __sendPing(self):
         """
         Private slot to send a ping message.
@@ -258,73 +264,85 @@
         if self.__pongTime.msecsTo(QTime.currentTime()) > PongTimeout:
             self.abort()
             return
-        
-        self.write(QByteArray("{0}{1}1{1}p".format(
-            Connection.ProtocolPing, SeparatorToken).encode("utf-8")))
-    
+
+        self.write(
+            QByteArray(
+                "{0}{1}1{1}p".format(Connection.ProtocolPing, SeparatorToken).encode(
+                    "utf-8"
+                )
+            )
+        )
+
     def __sendGreetingMessage(self):
         """
         Private slot to send a greeting message.
         """
         greeting = QByteArray(self.__greetingMessage.encode("utf-8"))
-        data = QByteArray("{0}{1}{2}{1}".format(
-            Connection.ProtocolGreeting, SeparatorToken, greeting.size())
-            .encode("utf-8")) + greeting
+        data = (
+            QByteArray(
+                "{0}{1}{2}{1}".format(
+                    Connection.ProtocolGreeting, SeparatorToken, greeting.size()
+                ).encode("utf-8")
+            )
+            + greeting
+        )
         if self.write(data) == data.size():
             self.__isGreetingMessageSent = True
-    
+
     def __readDataIntoBuffer(self, maxSize=MaxBufferSize):
         """
         Private method to read some data into the buffer.
-        
+
         @param maxSize maximum size of data to read (integer)
         @return size of data read (integer)
         """
         if maxSize > MaxBufferSize:
             return 0
-        
+
         numBytesBeforeRead = self.__buffer.size()
         if numBytesBeforeRead == MaxBufferSize:
             self.abort()
             return 0
-        
+
         while self.bytesAvailable() and self.__buffer.size() < maxSize:
             self.__buffer.append(self.read(1))
             if self.__buffer.endsWith(SeparatorToken_b):
                 break
-        
+
         return self.__buffer.size() - numBytesBeforeRead
-    
+
     def __dataLengthForCurrentDataType(self):
         """
         Private method to get the data length for the current data type.
-        
+
         @return data length (integer)
         """
-        if (self.bytesAvailable() <= 0 or
-            self.__readDataIntoBuffer() <= 0 or
-                not self.__buffer.endsWith(SeparatorToken_b)):
+        if (
+            self.bytesAvailable() <= 0
+            or self.__readDataIntoBuffer() <= 0
+            or not self.__buffer.endsWith(SeparatorToken_b)
+        ):
             return 0
-        
+
         self.__buffer.chop(len(SeparatorToken_b))
         number = self.__buffer.toInt()[0]
         self.__buffer.clear()
         return number
-    
+
     def __readProtocolHeader(self):
         """
         Private method to read the protocol header.
-        
+
         @return flag indicating a successful read (boolean)
         """
         if self.__transferTimerId:
             self.killTimer(self.__transferTimerId)
             self.__transferTimerId = 0
-        
+
         if self.__readDataIntoBuffer() <= 0:
             self.__transferTimerId = self.startTimer(TransferTimeout)
             return False
-        
+
         self.__buffer.chop(len(SeparatorToken))
         protocolHeader = str(self.__buffer, encoding="utf-8")
         if protocolHeader == Connection.ProtocolPing:
@@ -345,49 +363,52 @@
             self.__currentDataType = Connection.Undefined
             self.abort()
             return False
-        
+
         self.__buffer.clear()
-        self.__numBytesForCurrentDataType = (
-            self.__dataLengthForCurrentDataType())
+        self.__numBytesForCurrentDataType = self.__dataLengthForCurrentDataType()
         return True
-    
+
     def __hasEnoughData(self):
         """
         Private method to check, if enough data is available.
-        
+
         @return flag indicating availability of enough data (boolean)
         """
         if self.__transferTimerId:
             self.killTimer(self.__transferTimerId)
             self.__transferTimerId = 0
-        
+
         if self.__numBytesForCurrentDataType <= 0:
-            self.__numBytesForCurrentDataType = (
-                self.__dataLengthForCurrentDataType())
-        
-        if (self.bytesAvailable() < self.__numBytesForCurrentDataType or
-                self.__numBytesForCurrentDataType <= 0):
+            self.__numBytesForCurrentDataType = self.__dataLengthForCurrentDataType()
+
+        if (
+            self.bytesAvailable() < self.__numBytesForCurrentDataType
+            or self.__numBytesForCurrentDataType <= 0
+        ):
             self.__transferTimerId = self.startTimer(TransferTimeout)
             return False
-        
+
         return True
-    
+
     def __processData(self):
         """
         Private method to process the received data.
         """
-        self.__buffer = QByteArray(
-            self.read(self.__numBytesForCurrentDataType))
+        self.__buffer = QByteArray(self.read(self.__numBytesForCurrentDataType))
         if self.__buffer.size() != self.__numBytesForCurrentDataType:
             self.abort()
             return
-        
+
         if self.__currentDataType == Connection.PlainText:
-            self.newMessage.emit(
-                self.__username, str(self.__buffer, encoding="utf-8"))
+            self.newMessage.emit(self.__username, str(self.__buffer, encoding="utf-8"))
         elif self.__currentDataType == Connection.Ping:
-            self.write(QByteArray("{0}{1}1{1}p".format(
-                Connection.ProtocolPong, SeparatorToken).encode("utf-8")))
+            self.write(
+                QByteArray(
+                    "{0}{1}1{1}p".format(
+                        Connection.ProtocolPong, SeparatorToken
+                    ).encode("utf-8")
+                )
+            )
         elif self.__currentDataType == Connection.Pong:
             self.__pongTime = QTime.currentTime()
         elif self.__currentDataType == Connection.GetParticipants:
@@ -400,61 +421,78 @@
                 participantsList = msg.split(SeparatorToken)
             self.participants.emit(participantsList[:])
         elif self.__currentDataType == Connection.Editor:
-            hashStr, fn, msg = (
-                str(self.__buffer, encoding="utf-8").split(SeparatorToken))
+            hashStr, fn, msg = str(self.__buffer, encoding="utf-8").split(
+                SeparatorToken
+            )
             self.editorCommand.emit(hashStr, fn, msg)
-        
+
         self.__currentDataType = Connection.Undefined
         self.__numBytesForCurrentDataType = 0
         self.__buffer.clear()
-    
+
     def sendGetParticipants(self):
         """
         Public method to request a list of participants.
         """
-        self.write(QByteArray(
-            "{0}{1}1{1}l".format(
-                Connection.ProtocolGetParticipants, SeparatorToken
-            ).encode("utf-8")
-        ))
-    
+        self.write(
+            QByteArray(
+                "{0}{1}1{1}l".format(
+                    Connection.ProtocolGetParticipants, SeparatorToken
+                ).encode("utf-8")
+            )
+        )
+
     def sendParticipants(self, participants):
         """
         Public method to send the list of participants.
-        
+
         @param participants list of participants (list of strings of
             "host:port")
         """
-        message = (SeparatorToken.join(participants) if participants
-                   else "<empty>")
+        message = SeparatorToken.join(participants) if participants else "<empty>"
         msg = QByteArray(message.encode("utf-8"))
-        data = QByteArray("{0}{1}{2}{1}".format(
-            Connection.ProtocolParticipants, SeparatorToken, msg.size())
-            .encode("utf-8")) + msg
+        data = (
+            QByteArray(
+                "{0}{1}{2}{1}".format(
+                    Connection.ProtocolParticipants, SeparatorToken, msg.size()
+                ).encode("utf-8")
+            )
+            + msg
+        )
         self.write(data)
-    
+
     def sendEditorCommand(self, projectHash, filename, message):
         """
         Public method to send an editor command.
-        
+
         @param projectHash hash of the project (string)
         @param filename project relative universal file name of
             the sending editor (string)
         @param message editor command to be sent (string)
         """
-        msg = QByteArray("{0}{1}{2}{1}{3}".format(
-            projectHash, SeparatorToken, filename, message).encode("utf-8"))
-        data = QByteArray("{0}{1}{2}{1}".format(
-            Connection.ProtocolEditor, SeparatorToken, msg.size())
-            .encode("utf-8")) + msg
+        msg = QByteArray(
+            "{0}{1}{2}{1}{3}".format(
+                projectHash, SeparatorToken, filename, message
+            ).encode("utf-8")
+        )
+        data = (
+            QByteArray(
+                "{0}{1}{2}{1}".format(
+                    Connection.ProtocolEditor, SeparatorToken, msg.size()
+                ).encode("utf-8")
+            )
+            + msg
+        )
         self.write(data)
-    
+
     def __disconnected(self):
         """
         Private slot to handle the connection being dropped.
         """
         self.__pingTimer.stop()
         if self.__state == Connection.WaitingForGreeting:
-            self.rejected.emit(self.tr(
-                "* Connection to {0}:{1} refused.").format(
-                self.peerName(), self.peerPort()))
+            self.rejected.emit(
+                self.tr("* Connection to {0}:{1} refused.").format(
+                    self.peerName(), self.peerPort()
+                )
+            )
--- a/src/eric7/Cooperation/CooperationClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Cooperation/CooperationClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import collections
 
 from PyQt6.QtCore import QObject, pyqtSignal, QProcess
-from PyQt6.QtNetwork import (
-    QHostInfo, QHostAddress, QAbstractSocket, QNetworkInterface
-)
+from PyQt6.QtNetwork import QHostInfo, QHostAddress, QAbstractSocket, QNetworkInterface
 
 from .CooperationServer import CooperationServer
 from .Connection import Connection
@@ -23,7 +21,7 @@
 class CooperationClient(QObject):
     """
     Class implementing the client of the cooperation package.
-    
+
     @signal newMessage(user, message) emitted after a new message has
         arrived (string, string)
     @signal newParticipant(nickname) emitted after a new participant joined
@@ -35,23 +33,24 @@
     @signal editorCommand(hash, filename, message) emitted when an editor
         command has been received (string, string, string)
     """
+
     newMessage = pyqtSignal(str, str)
     newParticipant = pyqtSignal(str)
     participantLeft = pyqtSignal(str)
     connectionError = pyqtSignal(str)
     cannotConnect = pyqtSignal()
     editorCommand = pyqtSignal(str, str, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__chatWidget = parent
-        
+
         self.__servers = []
         for networkInterface in QNetworkInterface.allInterfaces():
             for addressEntry in networkInterface.addressEntries():
@@ -62,13 +61,12 @@
                 server = CooperationServer(address, self)
                 server.newConnection.connect(self.__newConnection)
                 self.__servers.append(server)
-        
+
         self.__peers = collections.defaultdict(list)
-        
+
         self.__initialConnection = None
-        
-        envVariables = ["USERNAME", "USERDOMAIN", "USER",
-                        "HOSTNAME", "DOMAINNAME"]
+
+        envVariables = ["USERNAME", "USERDOMAIN", "USER", "HOSTNAME", "DOMAINNAME"]
         environment = QProcess.systemEnvironment()
         found = False
         for envVariable in envVariables:
@@ -79,92 +77,92 @@
                         self.__username = envList[1].strip()
                         found = True
                         break
-            
+
             if found:
                 break
-        
+
         if self.__username == "":
             self.__username = self.tr("unknown")
-        
+
         self.__listening = False
         self.__serversErrorString = ""
-    
+
     def chatWidget(self):
         """
         Public method to get a reference to the chat widget.
-        
+
         @return reference to the chat widget (ChatWidget)
         """
         return self.__chatWidget
-    
+
     def sendMessage(self, message):
         """
         Public method to send a message.
-        
+
         @param message message to be sent (string)
         """
         if message == "":
             return
-        
+
         for connectionList in self.__peers.values():
             for connection in connectionList:
                 connection.sendMessage(message)
-    
+
     def nickName(self):
         """
         Public method to get the nick name.
-        
+
         @return nick name (string)
         """
         return "{0}@{1}@{2}".format(
-            self.__username,
-            QHostInfo.localHostName(),
-            self.__servers[0].serverPort()
+            self.__username, QHostInfo.localHostName(), self.__servers[0].serverPort()
         )
-    
+
     def hasConnection(self, senderIp, senderPort=-1):
         """
         Public method to check for an existing connection.
-        
+
         @param senderIp address of the sender (QHostAddress)
         @param senderPort port of the sender (integer)
         @return flag indicating an existing connection (boolean)
         """
         if senderPort == -1:
             return senderIp in self.__peers
-        
+
         if senderIp not in self.__peers:
             return False
-        
-        return any(connection.peerPort() == senderPort
-                   for connection in self.__peers[senderIp])
-    
+
+        return any(
+            connection.peerPort() == senderPort for connection in self.__peers[senderIp]
+        )
+
     def hasConnections(self):
         """
         Public method to check, if there are any connections established.
-        
+
         @return flag indicating the presence of connections (boolean)
         """
-        return any(bool(connectionList)
-                   for connectionList in self.__peers.values())
-    
+        return any(bool(connectionList) for connectionList in self.__peers.values())
+
     def removeConnection(self, connection):
         """
         Public method to remove a connection.
-        
+
         @param connection reference to the connection to be removed
             (Connection)
         """
-        if (connection.peerAddress() in self.__peers and
-                connection in self.__peers[connection.peerAddress()]):
+        if (
+            connection.peerAddress() in self.__peers
+            and connection in self.__peers[connection.peerAddress()]
+        ):
             self.__peers[connection.peerAddress()].remove(connection)
             nick = connection.name()
             if nick != "":
                 self.participantLeft.emit(nick)
-        
+
         if connection.isValid():
             connection.abort()
-    
+
     def disconnectConnections(self):
         """
         Public slot to disconnect from the chat network.
@@ -172,38 +170,34 @@
         for connectionList in self.__peers.values():
             while connectionList:
                 self.removeConnection(connectionList[0])
-    
+
     def __newConnection(self, connection):
         """
         Private slot to handle a new connection.
-        
+
         @param connection reference to the new connection (Connection)
         """
         connection.setParent(self)
         connection.setClient(self)
-        connection.setGreetingMessage(self.__username,
-                                      self.__servers[0].serverPort())
-        
-        connection.error.connect(
-            lambda err: self.__connectionError(err, connection))
-        connection.disconnected.connect(
-            lambda: self.__disconnected(connection))
-        connection.readyForUse.connect(
-            lambda: self.__readyForUse(connection))
+        connection.setGreetingMessage(self.__username, self.__servers[0].serverPort())
+
+        connection.error.connect(lambda err: self.__connectionError(err, connection))
+        connection.disconnected.connect(lambda: self.__disconnected(connection))
+        connection.readyForUse.connect(lambda: self.__readyForUse(connection))
         connection.rejected.connect(self.__connectionRejected)
-    
+
     def __connectionRejected(self, msg):
         """
         Private slot to handle the rejection of a connection.
-        
+
         @param msg error message (string)
         """
         self.connectionError.emit(msg)
-    
+
     def __connectionError(self, socketError, connection):
         """
         Private slot to handle a connection error.
-        
+
         @param socketError reference to the error object
         @type QAbstractSocket.SocketError
         @param connection connection that caused the error
@@ -214,7 +208,7 @@
                 msg = "* {0}:{1}\n{2}\n".format(
                     connection.peerAddress().toString(),
                     connection.peerPort(),
-                    connection.errorString()
+                    connection.errorString(),
                 )
             else:
                 msg = "* {0}\n".format(connection.errorString())
@@ -222,57 +216,55 @@
         if connection == self.__initialConnection:
             self.cannotConnect.emit()
         self.removeConnection(connection)
-    
+
     def __disconnected(self, connection):
         """
         Private slot to handle the disconnection of a chat client.
-        
+
         @param connection connection that was disconnected
         @type Connection
         """
         self.removeConnection(connection)
-    
+
     def __readyForUse(self, connection):
         """
         Private slot to handle a connection getting ready for use.
-        
+
         @param connection connection that got ready for use
         @type Connection
         """
         if self.hasConnection(connection.peerAddress(), connection.peerPort()):
             return
-        
+
         connection.newMessage.connect(self.newMessage)
-        connection.getParticipants.connect(
-            lambda: self.__getParticipants(connection))
+        connection.getParticipants.connect(lambda: self.__getParticipants(connection))
         connection.editorCommand.connect(self.editorCommand)
-        
+
         self.__peers[connection.peerAddress()].append(connection)
         nick = connection.name()
         if nick != "":
             self.newParticipant.emit(nick)
-        
+
         if connection == self.__initialConnection:
             connection.sendGetParticipants()
             self.__initialConnection = None
-    
+
     def connectToHost(self, host, port):
         """
         Public method to connect to a host.
-        
+
         @param host host to connect to (string)
         @param port port to connect to (integer)
         """
         self.__initialConnection = Connection(self)
         self.__newConnection(self.__initialConnection)
-        self.__initialConnection.participants.connect(
-            self.__processParticipants)
+        self.__initialConnection.participants.connect(self.__processParticipants)
         self.__initialConnection.connectToHost(host, port)
-    
+
     def __getParticipants(self, reqConnection):
         """
         Private slot to handle the request for a list of participants.
-        
+
         @param reqConnection reference to the connection to get
             participants for
         @type Connection
@@ -281,36 +273,37 @@
         for connectionList in self.__peers.values():
             for connection in connectionList:
                 if connection != reqConnection:
-                    participants.append("{0}@{1}".format(
-                        connection.peerAddress().toString(),
-                        connection.serverPort()))
+                    participants.append(
+                        "{0}@{1}".format(
+                            connection.peerAddress().toString(), connection.serverPort()
+                        )
+                    )
         reqConnection.sendParticipants(participants)
-    
+
     def __processParticipants(self, participants):
         """
         Private slot to handle the receipt of a list of participants.
-        
+
         @param participants list of participants (list of strings of
             "host:port")
         """
         for participant in participants:
             host, port = participant.split("@")
             port = int(port)
-            
+
             if port == 0:
-                msg = self.tr("Illegal address: {0}@{1}\n").format(
-                    host, port)
+                msg = self.tr("Illegal address: {0}@{1}\n").format(host, port)
                 self.connectionError.emit(msg)
             else:
                 if not self.hasConnection(QHostAddress(host), port):
                     connection = Connection(self)
                     self.__newConnection(connection)
                     connection.connectToHost(host, port)
-    
+
     def sendEditorCommand(self, projectHash, filename, message):
         """
         Public method to send an editor command.
-        
+
         @param projectHash hash of the project (string)
         @param filename project relative universal file name of
             the sending editor (string)
@@ -319,11 +312,11 @@
         for connectionList in self.__peers.values():
             for connection in connectionList:
                 connection.sendEditorCommand(projectHash, filename, message)
-    
+
     def __findConnections(self, nick):
         """
         Private method to get a list of connection given a nick name.
-        
+
         @param nick nick name in the format of self.nickName() (string)
         @return list of references to the connection objects (list of
             Connection)
@@ -331,28 +324,28 @@
         if "@" not in nick:
             # nick given in wrong format
             return []
-        
+
         user, host, port = nick.split("@")
         senderIp = QHostAddress(host)
-        
+
         if senderIp not in self.__peers:
             return []
-        
+
         return self.__peers[senderIp][:]
-    
+
     def kickUser(self, nick):
         """
         Public method to kick a user by its nick name.
-        
+
         @param nick nick name in the format of self.nickName() (string)
         """
         for connection in self.__findConnections(nick):
             connection.abort()
-    
+
     def banUser(self, nick):
         """
         Public method to ban a user by its nick name.
-        
+
         @param nick nick name in the format of self.nickName() (string)
         """
         Preferences.syncPreferences()
@@ -361,20 +354,20 @@
         if user not in bannedUsers:
             bannedUsers.append(user)
             Preferences.setCooperation("BannedUsers", bannedUsers)
-    
+
     def banKickUser(self, nick):
         """
         Public method to ban and kick a user by its nick name.
-        
+
         @param nick nick name in the format of self.nickName() (string)
         """
         self.banUser(nick)
         self.kickUser(nick)
-    
+
     def startListening(self, port=-1):
         """
         Public method to start listening for new connections.
-        
+
         @param port port to listen on (integer)
         @return tuple giving a flag indicating success (boolean) and
             the port the server listens on
@@ -392,20 +385,20 @@
         else:
             res = False
             self.__serversErrorString = self.tr("No servers present.")
-        
+
         if res:
             self.__serversErrorString = ""
         self.__listening = res
         return res, port
-    
+
     def isListening(self):
         """
         Public method to check, if the client is listening for connections.
-        
+
         @return flag indicating the listening state (boolean)
         """
         return self.__listening
-    
+
     def close(self):
         """
         Public method to close all connections and stop listening.
@@ -413,12 +406,12 @@
         for server in self.__servers:
             server.close()
         self.__listening = False
-    
+
     def errorString(self):
         """
         Public method to get a human readable error message about the last
         server error.
-        
+
         @return human readable error message about the last server error
             (string)
         """
--- a/src/eric7/Cooperation/CooperationServer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Cooperation/CooperationServer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,37 +18,38 @@
 class CooperationServer(QTcpServer):
     """
     Class implementing the cooperation server.
-    
+
     @signal newConnection(connection) emitted after a new connection was
         received (Connection)
     """
+
     newConnection = pyqtSignal(Connection)
-    
+
     def __init__(self, address, parent=None):
         """
         Constructor
-        
+
         @param address address the server should listen on (QHostAddress)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__address = address
-    
+
     def incomingConnection(self, socketDescriptor):
         """
         Public method handling an incoming connection.
-        
+
         @param socketDescriptor native socket descriptor (integer)
         """
         connection = Connection(self)
         connection.setSocketDescriptor(socketDescriptor)
         self.newConnection.emit(connection)
-    
+
     def startListening(self, port=-1, findFreePort=False):
         """
         Public method to start listening for new connections.
-        
+
         @param port port to listen on (integer)
         @param findFreePort flag indicating to search for a free port
             depending on the configuration (boolean)
--- a/src/eric7/CycloneDXInterface/CycloneDXConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CycloneDXInterface/CycloneDXConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,6 +22,7 @@
     """
     Class implementing a dialog to configure the CycloneDX SBOM generation.
     """
+
     SupportedSchemas = {
         "JSON": [
             (1, 4),
@@ -46,11 +47,11 @@
         "JSON": "cyclonedx.json",
         "XML": "cyclonedx.xml",
     }
-    
+
     def __init__(self, environment, parent=None):
         """
         Constructor
-        
+
         @param environment name of the virtual environment
         @type str
         @param parent reference to the parent widget (defaults to None)
@@ -58,97 +59,101 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if environment == "<project>":
             self.__project = ericApp().getObject("Project")
             self.__defaultDirectory = self.__project.getProjectPath()
         else:
             self.__project = None
             venvManager = ericApp().getObject("VirtualEnvManager")
-            self.__defaultDirectory = venvManager.getVirtualenvDirectory(
-                environment)
-        
+            self.__defaultDirectory = venvManager.getVirtualenvDirectory(environment)
+
         self.environmentLabel.setText(environment)
-        
-        self.pipenvButton.setEnabled(os.path.isfile(os.path.join(
-            self.__defaultDirectory,
-            CycloneDXConfigDialog.Sources["pipenv"]
-        )))
-        self.poetryButton.setEnabled(os.path.isfile(os.path.join(
-            self.__defaultDirectory,
-            CycloneDXConfigDialog.Sources["poetry"]
-        )))
-        self.requirementsButton.setEnabled(os.path.isfile(os.path.join(
-            self.__defaultDirectory,
-            CycloneDXConfigDialog.Sources["requirements"]
-        )))
-        
+
+        self.pipenvButton.setEnabled(
+            os.path.isfile(
+                os.path.join(
+                    self.__defaultDirectory, CycloneDXConfigDialog.Sources["pipenv"]
+                )
+            )
+        )
+        self.poetryButton.setEnabled(
+            os.path.isfile(
+                os.path.join(
+                    self.__defaultDirectory, CycloneDXConfigDialog.Sources["poetry"]
+                )
+            )
+        )
+        self.requirementsButton.setEnabled(
+            os.path.isfile(
+                os.path.join(
+                    self.__defaultDirectory,
+                    CycloneDXConfigDialog.Sources["requirements"],
+                )
+            )
+        )
+
         self.vulnerabilityCheckBox.toggled.connect(
-            self.__repopulateSchemaVersionComboBox)
-        
+            self.__repopulateSchemaVersionComboBox
+        )
+
         self.filePicker.setMode(EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE)
         self.filePicker.setDefaultDirectory(self.__defaultDirectory)
-        
-        self.fileFormatComboBox.setCurrentText(
-            CycloneDXConfigDialog.DefaultFileFormat)
+
+        self.fileFormatComboBox.setCurrentText(CycloneDXConfigDialog.DefaultFileFormat)
         self.on_fileFormatComboBox_currentTextChanged(
-            CycloneDXConfigDialog.DefaultFileFormat)
-        
+            CycloneDXConfigDialog.DefaultFileFormat
+        )
+
         self.__metadata = None
         self.__metadataButton = self.buttonBox.addButton(
-            self.tr("Edit Metadata..."),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Edit Metadata..."), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__metadataButton.clicked.connect(self.__editMetaData)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __repopulateSchemaVersionComboBox(self):
         """
         Private slot to repopulate the schema version selector.
         """
         fileFormat = self.fileFormatComboBox.currentText()
-        minSchemaVersion = (
-            (1, 4)
-            if self.vulnerabilityCheckBox.isChecked() else
-            (1, 0)
-        )
+        minSchemaVersion = (1, 4) if self.vulnerabilityCheckBox.isChecked() else (1, 0)
         self.schemaVersionComboBox.clear()
         self.schemaVersionComboBox.addItems(
             "{0}.{1}".format(*f)
             for f in CycloneDXConfigDialog.SupportedSchemas[fileFormat]
             if f >= minSchemaVersion
         )
-    
+
     @pyqtSlot(str)
     def on_fileFormatComboBox_currentTextChanged(self, fileFormat):
         """
         Private slot to handle the selection of a SBOM file format.
-        
+
         @param fileFormat selected format
         @type str
         """
         # re-populate the file schema combo box
         self.__repopulateSchemaVersionComboBox()
-        
+
         # set the file filter
         if fileFormat == "JSON":
-            self.filePicker.setFilters(
-                self.tr("JSON Files (*.json);;All Files (*)"))
+            self.filePicker.setFilters(self.tr("JSON Files (*.json);;All Files (*)"))
         elif fileFormat == "XML":
-            self.filePicker.setFilters(
-                self.tr("XML Files (*.xml);;All Files (*)"))
+            self.filePicker.setFilters(self.tr("XML Files (*.xml);;All Files (*)"))
         else:
             self.filePicker.setFilters(self.tr("All Files (*)"))
-    
+
     @pyqtSlot()
     def __editMetaData(self):
         """
         Private slot to open a dialog for editing the SBOM metadata.
         """
         from .CycloneDXMetaDataDialog import CycloneDXMetaDataDialog
-        
+
         # populate a metadata dictionary from project data
         metadata = (
             {
@@ -162,18 +167,18 @@
                 "Manufacturer": "",
                 "Supplier": "",
             }
-            if self.__metadata is None and self.__project is not None else
-            self.__metadata
+            if self.__metadata is None and self.__project is not None
+            else self.__metadata
         )
-        
+
         dlg = CycloneDXMetaDataDialog(metadata=metadata, parent=self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__metadata = dlg.getMetaData()
-    
+
     def getData(self):
         """
         Public method to get the SBOM configuration data.
-        
+
         @return tuple containing the input source, the input file name, the
             file format, the schema version, the path of the SBOM file to be
             written, a flag indicating to include vulnerability information,
@@ -187,26 +192,23 @@
         elif self.pipenvButton.isChecked():
             inputSource = "pipenv"
             inputFile = os.path.join(
-                self.__defaultDirectory,
-                CycloneDXConfigDialog.Sources["pipenv"]
+                self.__defaultDirectory, CycloneDXConfigDialog.Sources["pipenv"]
             )
         elif self.poetryButton.isChecked():
             inputSource = "poetry"
             inputFile = os.path.join(
-                self.__defaultDirectory,
-                CycloneDXConfigDialog.Sources["poetry"]
+                self.__defaultDirectory, CycloneDXConfigDialog.Sources["poetry"]
             )
         elif self.requirementsButton.isChecked():
             inputSource = "requirements"
             inputFile = os.path.join(
-                self.__defaultDirectory,
-                CycloneDXConfigDialog.Sources["requirements"]
+                self.__defaultDirectory, CycloneDXConfigDialog.Sources["requirements"]
             )
         else:
             # should not happen
             inputSource = None
             inputFile = None
-        
+
         fileFormat = self.fileFormatComboBox.currentText()
         schemaVersion = self.schemaVersionComboBox.currentText()
         sbomFile = self.filePicker.text()
@@ -214,15 +216,19 @@
             try:
                 sbomFile = os.path.join(
                     self.__defaultDirectory,
-                    CycloneDXConfigDialog.DefaultFileNames[fileFormat]
+                    CycloneDXConfigDialog.DefaultFileNames[fileFormat],
                 )
             except KeyError:
                 # should not happen
                 sbomFile = None
-        
+
         return (
-            inputSource, inputFile, fileFormat, schemaVersion, sbomFile,
+            inputSource,
+            inputFile,
+            fileFormat,
+            schemaVersion,
+            sbomFile,
             self.vulnerabilityCheckBox.isChecked(),
             self.dependenciesCheckBox.isChecked(),
-            self.__metadata
+            self.__metadata,
         )
--- a/src/eric7/CycloneDXInterface/CycloneDXMetaDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CycloneDXInterface/CycloneDXMetaDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,29 +20,38 @@
     """
     Class implementing a dialog to edit the metadata of the CycloneDX SBOM.
     """
+
     ComponentTypeMapping = {
         ComponentType.APPLICATION: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Application"),
+            "CycloneDXMetaDataDialog", "Application"
+        ),
         ComponentType.CONTAINER: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Container"),
+            "CycloneDXMetaDataDialog", "Container"
+        ),
         ComponentType.DEVICE: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Device"),
+            "CycloneDXMetaDataDialog", "Device"
+        ),
         ComponentType.FILE: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "File"),
+            "CycloneDXMetaDataDialog", "File"
+        ),
         ComponentType.FIRMWARE: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Firmware"),
+            "CycloneDXMetaDataDialog", "Firmware"
+        ),
         ComponentType.FRAMEWORK: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Framework"),
+            "CycloneDXMetaDataDialog", "Framework"
+        ),
         ComponentType.LIBRARY: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Library"),
+            "CycloneDXMetaDataDialog", "Library"
+        ),
         ComponentType.OPERATING_SYSTEM: QCoreApplication.translate(
-            "CycloneDXMetaDataDialog", "Operating System"),
+            "CycloneDXMetaDataDialog", "Operating System"
+        ),
     }
-    
+
     def __init__(self, metadata=None, parent=None):
         """
         Constructor
-        
+
         @param metadata dictionary containing metadata to populate the dialog
             (defaults to None)
         @type dict (optional)
@@ -51,10 +60,10 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__populateComponentTypeSelector()
         self.__populateLicenseSelector()
-        
+
         if metadata:
             # populate the dialog from given metadata dictionary
             self.nameEdit.setText(metadata["Name"])
@@ -67,51 +76,52 @@
             self.supplierEdit.setText(metadata["Supplier"])
             index = self.typeComboBox.findData(metadata["Type"])
             self.typeComboBox.setCurrentIndex(index)
-        
+
         self.nameEdit.textChanged.connect(self.__updateOkButton)
         self.typeComboBox.currentTextChanged.connect(self.__updateOkButton)
         self.licenseComboBox.currentTextChanged.connect(self.__updateOkButton)
-        
+
         self.__updateOkButton()
-    
+
     def __populateComponentTypeSelector(self):
         """
         Private method to populate the component type selector.
         """
         self.typeComboBox.addItem("", "")
         for componentType, displayStr in sorted(
-            CycloneDXMetaDataDialog.ComponentTypeMapping.items(),
-            key=lambda x: x[1]
+            CycloneDXMetaDataDialog.ComponentTypeMapping.items(), key=lambda x: x[1]
         ):
             self.typeComboBox.addItem(displayStr, componentType)
-    
+
     def __populateLicenseSelector(self):
         """
         Private method to populate the license selector with the list of trove
         license types.
         """
         self.licenseComboBox.addItem("")
-        self.licenseComboBox.addItems(sorted(
-            classifier.split("::")[-1].strip()
-            for classifier in trove_classifiers.classifiers
-            if classifier.startswith("License ::")
-        ))
-    
+        self.licenseComboBox.addItems(
+            sorted(
+                classifier.split("::")[-1].strip()
+                for classifier in trove_classifiers.classifiers
+                if classifier.startswith("License ::")
+            )
+        )
+
     @pyqtSlot()
     def __updateOkButton(self):
         """
         Private slot to update the enabled state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.nameEdit.text()) and
-            bool(self.typeComboBox.currentText()) and
-            bool(self.licenseComboBox.currentText())
+            bool(self.nameEdit.text())
+            and bool(self.typeComboBox.currentText())
+            and bool(self.licenseComboBox.currentText())
         )
-    
+
     def getMetaData(self):
         """
         Public method to get the entered data.
-        
+
         @return dictionary containing the metadata.
         @rtype dict
         """
--- a/src/eric7/CycloneDXInterface/CycloneDXUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/CycloneDXInterface/CycloneDXUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,14 +18,21 @@
 from packageurl import PackageURL
 
 from cyclonedx.model import (
-    ExternalReference, ExternalReferenceType, LicenseChoice,
-    OrganizationalContact, OrganizationalEntity, Tool, XsUri
+    ExternalReference,
+    ExternalReferenceType,
+    LicenseChoice,
+    OrganizationalContact,
+    OrganizationalEntity,
+    Tool,
+    XsUri,
 )
 from cyclonedx.model.bom import Bom
 from cyclonedx.model.component import Component
 from cyclonedx.model.vulnerability import Vulnerability, VulnerabilitySource
 from cyclonedx.output import (
-    OutputFormat, SchemaVersion, get_instance as get_output_instance
+    OutputFormat,
+    SchemaVersion,
+    get_instance as get_output_instance,
 )
 from cyclonedx.parser import BaseParser
 
@@ -33,24 +40,23 @@
 from cyclonedx_py.parser.poetry import PoetryFileParser
 from cyclonedx_py.parser.requirements import RequirementsFileParser
 
-from PipInterface.PipVulnerabilityChecker import (
-    Package, VulnerabilityCheckError
-)
+from PipInterface.PipVulnerabilityChecker import Package, VulnerabilityCheckError
 
 
 class CycloneDXEnvironmentParser(BaseParser):
     """
     Class implementing a parser to get package data for a named environment.
     """
+
     def __init__(self, venvName):
         """
         Constructor
-        
+
         @param venvName name of the virtual environment
         @type str
         """
         super().__init__()
-        
+
         pip = ericApp().getObject("Pip")
         packages = pip.getLicenses(venvName)
         for package in packages:
@@ -60,40 +66,44 @@
                 author=package["Author"],
                 description=package["Description"],
                 purl=PackageURL(
-                    type='pypi',
-                    name=package["Name"],
-                    version=package["Version"]
-                )
+                    type="pypi", name=package["Name"], version=package["Version"]
+                ),
             )
             for lic in package["License"].split(";"):
-                comp.licenses.add(
-                    LicenseChoice(license_expression=lic.strip())
-                )
-            
+                comp.licenses.add(LicenseChoice(license_expression=lic.strip()))
+
             self._components.append(comp)
 
 
 def createCycloneDXFile(venvName):
     """
     Function to create a CyccloneDX SBOM file.
-    
+
     @param venvName name of the virtual environment
     @type str
     @exception RuntimeError raised to indicate illegal creation parameters
     """
     from .CycloneDXConfigDialog import CycloneDXConfigDialog
+
     dlg = CycloneDXConfigDialog(venvName)
     if dlg.exec() == QDialog.DialogCode.Accepted:
-        (inputSource, inputFile, fileFormat, schemaVersion, sbomFile,
-         withVulnerabilities, withDependencies, metadataDict) = dlg.getData()
-        
+        (
+            inputSource,
+            inputFile,
+            fileFormat,
+            schemaVersion,
+            sbomFile,
+            withVulnerabilities,
+            withDependencies,
+            metadataDict,
+        ) = dlg.getData()
+
         # check error conditions first
-        if inputSource not in ("environment", "pipenv", "poetry",
-                               "requirements"):
+        if inputSource not in ("environment", "pipenv", "poetry", "requirements"):
             raise RuntimeError("Unsupported input source given.")
         if fileFormat not in ("XML", "JSON"):
             raise RuntimeError("Unsupported SBOM file format given.")
-        
+
         if inputSource == "environment":
             parser = CycloneDXEnvironmentParser(venvName)
         else:
@@ -102,106 +112,108 @@
                 EricMessageBox.warning(
                     None,
                     QCoreApplication.translate(
-                        "CycloneDX", "CycloneDX - SBOM Creation"),
+                        "CycloneDX", "CycloneDX - SBOM Creation"
+                    ),
                     QCoreApplication.translate(
                         "CycloneDX",
                         "<p>The configured input file <b>{0}</b> does not"
-                        " exist. Aborting...</p>"
-                    ).format(inputFile)
+                        " exist. Aborting...</p>",
+                    ).format(inputFile),
                 )
                 return
-            
+
             if inputSource == "pipenv":
                 parser = PipEnvFileParser(pipenv_lock_filename=inputFile)
             elif inputSource == "poetry":
                 parser = PoetryFileParser(poetry_lock_filename=inputFile)
             elif inputSource == "requirements":
                 parser = RequirementsFileParser(requirements_file=inputFile)
-        
+
         if withVulnerabilities:
             addCycloneDXVulnerabilities(parser)
-        
+
         if withDependencies:
             addCycloneDXDependencies(parser, venvName)
-        
+
         if fileFormat == "XML":
             outputFormat = OutputFormat.XML
         elif fileFormat == "JSON":
             outputFormat = OutputFormat.JSON
-        
+
         if parser.has_warnings():
-            excludedList = ["<li>{0}</li>".format(warning.get_item())
-                            for warning in parser.get_warnings()]
+            excludedList = [
+                "<li>{0}</li>".format(warning.get_item())
+                for warning in parser.get_warnings()
+            ]
             EricMessageBox.warning(
                 None,
-                QCoreApplication.translate(
-                    "CycloneDX", "CycloneDX - SBOM Creation"),
+                QCoreApplication.translate("CycloneDX", "CycloneDX - SBOM Creation"),
                 QCoreApplication.translate(
                     "CycloneDX",
                     "<p>Some of the dependencies do not have pinned version"
                     " numbers.<ul>{0}</ul>The above listed packages will NOT"
                     " be included in the generated CycloneDX SBOM file as"
-                    " version is a mandatory field.</p>"
-                ).format("".join(excludedList))
+                    " version is a mandatory field.</p>",
+                ).format("".join(excludedList)),
             )
-        
+
         bom = Bom.from_parser(parser=parser)
         _amendMetaData(bom.metadata, metadataDict)
         output = get_output_instance(
             bom=bom,
             output_format=outputFormat,
-            schema_version=SchemaVersion['V{0}'.format(
-                schemaVersion.replace('.', '_')
-            )]
+            schema_version=SchemaVersion[
+                "V{0}".format(schemaVersion.replace(".", "_"))
+            ],
         )
         output.output_to_file(filename=sbomFile, allow_overwrite=True)
-        
+
         EricMessageBox.information(
             None,
-            QCoreApplication.translate(
-                "CycloneDX", "CycloneDX - SBOM Creation"),
+            QCoreApplication.translate("CycloneDX", "CycloneDX - SBOM Creation"),
             QCoreApplication.translate(
-                "CycloneDX",
-                "<p>The SBOM data was written to file <b>{0}</b>.</p>"
-            ).format(sbomFile)
+                "CycloneDX", "<p>The SBOM data was written to file <b>{0}</b>.</p>"
+            ).format(sbomFile),
         )
 
 
 def addCycloneDXVulnerabilities(parser):
     """
     Function to add vulnerability data to the list of created components.
-    
+
     @param parser reference to the parser object containing the list of
         components
     @type BaseParser
     """
     components = parser.get_components()
-    
+
     packages = [
         Package(name=component.name, version=component.version)
         for component in components
     ]
-    
+
     pip = ericApp().getObject("Pip")
     error, vulnerabilities = pip.getVulnerabilityChecker().check(packages)
-    
+
     if error == VulnerabilityCheckError.OK:
         for package in vulnerabilities:
             component = findCyccloneDXComponent(components, package)
             if component:
                 for vuln in vulnerabilities[package]:
-                    component.add_vulnerability(Vulnerability(
-                        id=vuln.cve,
-                        description=vuln.advisory,
-                        recommendation="upgrade required",
-                        source=VulnerabilitySource(name="pyup.io")
-                    ))
+                    component.add_vulnerability(
+                        Vulnerability(
+                            id=vuln.cve,
+                            description=vuln.advisory,
+                            recommendation="upgrade required",
+                            source=VulnerabilitySource(name="pyup.io"),
+                        )
+                    )
 
 
 def addCycloneDXDependencies(parser, venvName):
     """
     Function to add dependency data to the list of created components.
-    
+
     @param parser reference to the parser object containing the list of
         components
     @type BaseParser
@@ -209,7 +221,7 @@
     @type str
     """
     components = parser.get_components()
-    
+
     pip = ericApp().getObject("Pip")
     dependencies = pip.getDependencyTree(venvName)
     for dependency in dependencies:
@@ -219,7 +231,7 @@
 def _addCycloneDXDependency(dependency, components):
     """
     Function to add a dependency to the given list of components.
-    
+
     @param dependency dependency to be added
     @type dict
     @param components list of components
@@ -229,8 +241,7 @@
     if component is not None:
         bomRefs = component.dependencies
         for dep in dependency["dependencies"]:
-            depComponent = findCyccloneDXComponent(
-                components, dep["package_name"])
+            depComponent = findCyccloneDXComponent(components, dep["package_name"])
             if depComponent is not None:
                 bomRefs.add(depComponent.bom_ref)
                 # recursively add sub-dependencies
@@ -241,7 +252,7 @@
 def findCyccloneDXComponent(components, name):
     """
     Function to find a component in a given list of components.
-    
+
     @param components list of components to scan
     @type list of Component
     @param name name of the component to search for
@@ -252,19 +263,19 @@
     for component in components:
         if component.name == name:
             return component
-    
+
     return None
 
 
 def _amendMetaData(bomMetaData, metadataDict):
     """
     Function to amend the SBOM meta data according the given data.
-    
+
     The modifications done are:
     <ul>
     <li>add eric7 to the tools</li>
     </ul>
-    
+
     @param bomMetaData reference to the SBOM meta data object
     @type BomMetaData
     @param metadataDict dictionary containing additional meta data
@@ -275,80 +286,74 @@
     # add a Tool entry for eric7
     try:
         from importlib.metadata import version as meta_version
-        __EricToolVersion = str(meta_version('eric-ide'))
+
+        __EricToolVersion = str(meta_version("eric-ide"))
     except Exception:
         from UI.Info import Version
+
         __EricToolVersion = Version
-    
-    EricTool = Tool(vendor='python-projects.org',
-                    name='eric-ide',
-                    version=__EricToolVersion)
-    EricTool.external_references.update([
-        ExternalReference(
-            reference_type=ExternalReferenceType.DISTRIBUTION,
-            url=XsUri(
-                "https://pypi.org/project/eric-ide/"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.DOCUMENTATION,
-            url=XsUri(
-                "https://pypi.org/project/eric-ide/"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.ISSUE_TRACKER,
-            url=XsUri(
-                "https://tracker.die-offenbachs.homelinux.org"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.LICENSE,
-            url=XsUri(
-                "https://hg.die-offenbachs.homelinux.org/eric/file/tip/docs/"
-                "LICENSE.GPL3"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.RELEASE_NOTES,
-            url=XsUri(
-                "https://hg.die-offenbachs.homelinux.org/eric/file/tip/docs/"
-                "changelog"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.VCS,
-            url=XsUri(
-                "https://hg.die-offenbachs.homelinux.org/eric"
-            )
-        ),
-        ExternalReference(
-            reference_type=ExternalReferenceType.WEBSITE,
-            url=XsUri(
-                "https://eric-ide.python-projects.org"
-            )
-        )
-    ])
+
+    EricTool = Tool(
+        vendor="python-projects.org", name="eric-ide", version=__EricToolVersion
+    )
+    EricTool.external_references.update(
+        [
+            ExternalReference(
+                reference_type=ExternalReferenceType.DISTRIBUTION,
+                url=XsUri("https://pypi.org/project/eric-ide/"),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.DOCUMENTATION,
+                url=XsUri("https://pypi.org/project/eric-ide/"),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.ISSUE_TRACKER,
+                url=XsUri("https://tracker.die-offenbachs.homelinux.org"),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.LICENSE,
+                url=XsUri(
+                    "https://hg.die-offenbachs.homelinux.org/eric/file/tip/docs/"
+                    "LICENSE.GPL3"
+                ),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.RELEASE_NOTES,
+                url=XsUri(
+                    "https://hg.die-offenbachs.homelinux.org/eric/file/tip/docs/"
+                    "changelog"
+                ),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.VCS,
+                url=XsUri("https://hg.die-offenbachs.homelinux.org/eric"),
+            ),
+            ExternalReference(
+                reference_type=ExternalReferenceType.WEBSITE,
+                url=XsUri("https://eric-ide.python-projects.org"),
+            ),
+        ]
+    )
     bomMetaData.tools.add(EricTool)
-    
+
     # add the meta data info entered by the user (if any)
     if metadataDict is not None:
         if metadataDict["AuthorName"]:
-            bomMetaData.authors = [OrganizationalContact(
-                name=metadataDict["AuthorName"],
-                email=metadataDict["AuthorEmail"]
-            )]
+            bomMetaData.authors = [
+                OrganizationalContact(
+                    name=metadataDict["AuthorName"], email=metadataDict["AuthorEmail"]
+                )
+            ]
         if metadataDict["Manufacturer"]:
             bomMetaData.manufacture = OrganizationalEntity(
                 name=metadataDict["Manufacturer"]
             )
         if metadataDict["Supplier"]:
-            bomMetaData.supplier = OrganizationalEntity(
-                name=metadataDict["Supplier"])
+            bomMetaData.supplier = OrganizationalEntity(name=metadataDict["Supplier"])
         if metadataDict["License"]:
-            bomMetaData.licenses = [LicenseChoice(
-                license_expression=metadataDict["License"]
-            )]
+            bomMetaData.licenses = [
+                LicenseChoice(license_expression=metadataDict["License"])
+            ]
         if metadataDict["Name"]:
             bomMetaData.component = Component(
                 name=metadataDict["Name"],
@@ -356,9 +361,7 @@
                 version=metadataDict["Version"],
                 description=metadataDict["Description"],
                 author=metadataDict["AuthorName"],
-                licenses=[LicenseChoice(
-                    license_expression=metadataDict["License"]
-                )],
+                licenses=[LicenseChoice(license_expression=metadataDict["License"])],
             )
-    
+
     return bomMetaData
--- a/src/eric7/DataViews/CodeMetrics.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/CodeMetrics.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 import keyword
 import token
 import tokenize
-    
+
 import Utilities
 
 KEYWORD = token.NT_OFFSET + 1
@@ -35,10 +35,11 @@
     """
     Class to store the token related infos.
     """
+
     def __init__(self, **kw):
         """
         Constructor
-        
+
         @keyparam **kw list of key, value pairs
         """
         self.__dict__.update(kw)
@@ -48,22 +49,23 @@
     """
     Class used to parse the source code of a Python file.
     """
+
     def parse(self, text):
         """
         Public method used to parse the source code.
-        
+
         @param text the source code as read from a Python source file
         """
         self.tokenlist = []
-        
+
         # convert eols
         text = Utilities.convertLineEnds(text, os.linesep)
-        
+
         if not text.endswith(os.linesep):
             text = "{0}{1}".format(text, os.linesep)
-            
+
         self.lines = text.count(os.linesep)
-        
+
         source = io.BytesIO(text.encode("utf-8"))
         try:
             gen = tokenize.tokenize(source.readline)
@@ -73,7 +75,7 @@
                 if toktype in [token.NEWLINE, tokenize.NL]:
                     self.__addToken(toktype, os.linesep, srow, scol, line)
                 elif toktype in [token.INDENT, token.DEDENT]:
-                    self.__addToken(toktype, '', srow, scol, line)
+                    self.__addToken(toktype, "", srow, scol, line)
                 elif toktype == token.NAME and keyword.iskeyword(toktext):
                     toktype = KEYWORD
                     self.__addToken(toktype, toktext, srow, scol, line)
@@ -83,36 +85,39 @@
             print("Token Error: {0}".format(str(msg)))
             # __IGNORE_WARNING_M801__
             return
-        
+
         return
-    
+
     def __addToken(self, toktype, toktext, srow, scol, line):
         """
         Private method used to add a token to our list of tokens.
-        
+
         @param toktype the type of the token (int)
         @param toktext the text of the token (string)
         @param srow starting row of the token (int)
         @param scol starting column of the token (int)
         @param line logical line the token was found (string)
         """
-        self.tokenlist.append(Token(type=toktype, text=toktext, row=srow,
-                                    col=scol, line=line))
+        self.tokenlist.append(
+            Token(type=toktype, text=toktext, row=srow, col=scol, line=line)
+        )
 
-spacer = ' '
+
+spacer = " "
 
 
 class SourceStat:
     """
     Class used to calculate and store the source code statistics.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.identifiers = []
         # list of identifiers in order of appearance
-        self.active = [('TOTAL ', -1, 0)]
+        self.active = [("TOTAL ", -1, 0)]
         # stack of active identifiers and indent levels
         self.counters = {}
         # counters per identifier
@@ -121,7 +126,7 @@
     def indent(self, tok):
         """
         Public method used to increment the indentation level.
-        
+
         @param tok a token (Token, ignored)
         """
         self.indent_level += 1
@@ -129,7 +134,7 @@
     def dedent(self, tok):
         """
         Public method used to decrement the indentation level.
-        
+
         @param tok the token to be processed (Token)
         @exception ValueError raised to indicate an invalid indentation level
         """
@@ -140,21 +145,21 @@
         # remove identifiers of a higher indentation
         while self.active and self.active[-1][1] >= self.indent_level:
             counters = self.counters.setdefault(self.active[-1][0], {})
-            counters['start'] = self.active[-1][2]
-            counters['end'] = tok.row - 1
-            counters['lines'] = tok.row - self.active[-1][2]
+            counters["start"] = self.active[-1][2]
+            counters["end"] = tok.row - 1
+            counters["lines"] = tok.row - self.active[-1][2]
             del self.active[-1]
 
     def push(self, identifier, row):
         """
         Public method used to store an identifier.
-        
+
         @param identifier the identifier to be remembered (string)
         @param row the row, the identifier is defined in (int)
         """
         if len(self.active) > 1 and self.indent_level > self.active[-1][1]:
             # __IGNORE_WARNING_Y108__
-            qualified = self.active[-1][0] + '.' + identifier
+            qualified = self.active[-1][0] + "." + identifier
         else:
             qualified = identifier
         self.active.append((qualified, self.indent_level, row))
@@ -163,7 +168,7 @@
     def inc(self, key, value=1):
         """
         Public method used to increment the value of a key.
-        
+
         @param key the key to be incremented
         @param value the increment (int)
         """
@@ -174,7 +179,7 @@
     def getCounter(self, counterId, key):
         """
         Public method used to get a specific counter value.
-        
+
         @param counterId id of the counter (string)
         @param key key of the value to be retrieved (string)
         @return the value of the requested counter (int)
@@ -185,7 +190,7 @@
 def summarize(total, key, value):
     """
     Module function used to collect overall statistics.
-    
+
     @param total the dictionary for the overall statistics
     @param key the key to be summarize
     @param value the value to be added to the overall statistics
@@ -198,7 +203,7 @@
 def analyze(filename, total):
     """
     Module function used analyze the source of a Python file.
-    
+
     @param filename name of the Python file to be analyzed (string)
     @param total dictionary receiving the overall code statistics
     @return a statistics object with the collected code statistics (SourceStat)
@@ -212,42 +217,37 @@
     parser.parse(text)
 
     stats = SourceStat()
-    stats.inc('lines', parser.lines)
+    stats.inc("lines", parser.lines)
     for idx in range(len(parser.tokenlist)):
         tok = parser.tokenlist[idx]
-        
+
         # counting
         if tok.type == NEWLINE:
-            stats.inc('nloc')
+            stats.inc("nloc")
         elif tok.type == COMMENT:
-            stats.inc('comments')
+            stats.inc("comments")
             if tok.line.strip() == tok.text:
-                stats.inc('commentlines')
+                stats.inc("commentlines")
         elif tok.type == EMPTY:
             if parser.tokenlist[idx - 1].type == token.OP:
-                stats.inc('nloc')
+                stats.inc("nloc")
             elif parser.tokenlist[idx - 1].type == COMMENT:
                 continue
             else:
-                stats.inc('empty')
+                stats.inc("empty")
         elif tok.type == INDENT:
             stats.indent(tok)
         elif tok.type == DEDENT:
             stats.dedent(tok)
-        elif (
-            tok.type == KEYWORD and
-            tok.text in ("class", "def")
-        ):
+        elif tok.type == KEYWORD and tok.text in ("class", "def"):
             stats.push(parser.tokenlist[idx + 1].text, tok.row)
 
     # collect overall statistics
-    summarize(total, 'lines', parser.lines)
-    summarize(total, 'bytes', len(text))
-    summarize(total, 'comments', stats.getCounter('TOTAL ', 'comments'))
-    summarize(total, 'commentlines',
-              stats.getCounter('TOTAL ', 'commentlines'))
-    summarize(total, 'empty lines', stats.getCounter('TOTAL ', 'empty'))
-    summarize(total, 'non-commentary lines',
-              stats.getCounter('TOTAL ', 'nloc'))
+    summarize(total, "lines", parser.lines)
+    summarize(total, "bytes", len(text))
+    summarize(total, "comments", stats.getCounter("TOTAL ", "comments"))
+    summarize(total, "commentlines", stats.getCounter("TOTAL ", "commentlines"))
+    summarize(total, "empty lines", stats.getCounter("TOTAL ", "empty"))
+    summarize(total, "non-commentary lines", stats.getCounter("TOTAL ", "nloc"))
 
     return stats
--- a/src/eric7/DataViews/CodeMetricsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/CodeMetricsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,8 +14,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QLocale
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem,
-    QApplication
+    QDialog,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -30,55 +34,49 @@
     """
     Class implementing a dialog to display the code metrics.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
-        self.summaryList.headerItem().setText(
-            self.summaryList.columnCount(), "")
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.summaryList.headerItem().setText(self.summaryList.columnCount(), "")
         self.summaryList.header().resizeSection(0, 200)
         self.summaryList.header().resizeSection(1, 100)
-        
+
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
-        
+
         self.cancelled = False
-        
+
         self.__menu = QMenu(self)
-        self.__menu.addAction(self.tr("Collapse All"),
-                              self.__resultCollapse)
+        self.__menu.addAction(self.tr("Collapse All"), self.__resultCollapse)
         self.__menu.addAction(self.tr("Expand All"), self.__resultExpand)
-        self.resultList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.resultList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+        self.resultList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.resultList.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.__fileList = []
         self.__project = ericApp().getObject("Project")
         self.filterFrame.setVisible(False)
-        
+
     def __resizeResultColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.resultList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.resultList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.resultList.header().setStretchLastSection(True)
-        
+
     def __createResultItem(self, parent, values):
         """
         Private slot to create a new item in the result list.
-        
+
         @param parent parent of the new item (QTreeWidget or QTreeWidgetItem)
         @param values values to be displayed (list)
         @return the generated item
@@ -91,72 +89,66 @@
                 data.append(value)
         itm = QTreeWidgetItem(parent, data)
         for col in range(1, 7):
-            itm.setTextAlignment(
-                col, Qt.AlignmentFlag.AlignRight)
+            itm.setTextAlignment(col, Qt.AlignmentFlag.AlignRight)
         return itm
-        
+
     def __resizeSummaryColumns(self):
         """
         Private method to resize the list columns.
         """
         self.summaryList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.summaryList.header().setStretchLastSection(True)
-        
+
     def __createSummaryItem(self, col0, col1):
         """
         Private slot to create a new item in the summary list.
-        
+
         @param col0 string for column 0 (string)
         @param col1 string for column 1 (string)
         """
         itm = QTreeWidgetItem(self.summaryList, [col0, col1])
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
-        
+
     def prepare(self, fileList):
         """
         Public method to prepare the dialog with a list of filenames.
-        
+
         @param fileList list of filenames
         @type list of str
         """
         self.__fileList = fileList[:]
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.filterFrame.setVisible(True)
-        
+
         self.__data = self.__project.getData("OTHERTOOLSPARMS", "CodeMetrics")
         if self.__data is None or "ExcludeFiles" not in self.__data:
             self.__data = {"ExcludeFiles": ""}
         self.excludeFilesEdit.setText(self.__data["ExcludeFiles"])
-        
+
     def start(self, fn):
         """
         Public slot to start the code metrics determination.
-        
+
         @param fn file or list of files or directory to show
                 the code metrics for (string or list of strings)
         """
         self.cancelled = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         loc = QLocale()
         if isinstance(fn, list):
             files = fn
         elif os.path.isdir(fn):
-            files = Utilities.direntries(fn, True, '*.py', False)
+            files = Utilities.direntries(fn, True, "*.py", False)
         else:
             files = [fn]
         files.sort()
@@ -164,40 +156,39 @@
         for f in files[:]:
             if not os.path.exists(f):
                 files.remove(f)
-        
+
         self.checkProgress.setMaximum(len(files))
         QApplication.processEvents()
-        
+
         total = collections.defaultdict(int)
-        CodeMetrics.summarize(total, 'files', len(files))
-        
+        CodeMetrics.summarize(total, "files", len(files))
+
         try:
             # disable updates of the list for speed
             self.resultList.setUpdatesEnabled(False)
             self.resultList.setSortingEnabled(False)
-            
+
             # now go through all the files
             now = time.monotonic()
             for progress, file in enumerate(files, start=1):
                 if self.cancelled:
                     return
-                
+
                 stats = CodeMetrics.analyze(file, total)
-                
-                v = self.__getValues(loc, stats, 'TOTAL ')
+
+                v = self.__getValues(loc, stats, "TOTAL ")
                 # make the file name project relative
                 fitm = self.__createResultItem(
-                    self.resultList,
-                    [self.__project.getRelativePath(file)] + v
+                    self.resultList, [self.__project.getRelativePath(file)] + v
                 )
-                
+
                 identifiers = stats.identifiers
                 for identifier in identifiers:
                     v = self.__getValues(loc, stats, identifier)
-                    
+
                     self.__createResultItem(fitm, [identifier] + v)
                 self.resultList.expandItem(fitm)
-                
+
                 self.checkProgress.setValue(progress)
                 if time.monotonic() - now > 0.01:
                     QApplication.processEvents()
@@ -207,29 +198,28 @@
             self.resultList.setSortingEnabled(True)
             self.resultList.setUpdatesEnabled(True)
         self.__resizeResultColumns()
-        
+
         # now do the summary stuff
-        self.__createSummaryItem(self.tr("files"),
-                                 loc.toString(total['files']))
-        self.__createSummaryItem(self.tr("lines"),
-                                 loc.toString(total['lines']))
-        self.__createSummaryItem(self.tr("bytes"),
-                                 loc.toString(total['bytes']))
-        self.__createSummaryItem(self.tr("comments"),
-                                 loc.toString(total['comments']))
-        self.__createSummaryItem(self.tr("comment lines"),
-                                 loc.toString(total['commentlines']))
-        self.__createSummaryItem(self.tr("empty lines"),
-                                 loc.toString(total['empty lines']))
-        self.__createSummaryItem(self.tr("non-commentary lines"),
-                                 loc.toString(total['non-commentary lines']))
+        self.__createSummaryItem(self.tr("files"), loc.toString(total["files"]))
+        self.__createSummaryItem(self.tr("lines"), loc.toString(total["lines"]))
+        self.__createSummaryItem(self.tr("bytes"), loc.toString(total["bytes"]))
+        self.__createSummaryItem(self.tr("comments"), loc.toString(total["comments"]))
+        self.__createSummaryItem(
+            self.tr("comment lines"), loc.toString(total["commentlines"])
+        )
+        self.__createSummaryItem(
+            self.tr("empty lines"), loc.toString(total["empty lines"])
+        )
+        self.__createSummaryItem(
+            self.tr("non-commentary lines"), loc.toString(total["non-commentary lines"])
+        )
         self.__resizeSummaryColumns()
         self.__finish()
-        
+
     def __getValues(self, loc, stats, identifier):
         """
         Private method to extract the code metric values.
-        
+
         @param loc reference to the locale object (QLocale)
         @param stats reference to the code metric statistics object
         @param identifier identifier to get values for
@@ -237,85 +227,82 @@
         """
         counters = stats.counters.get(identifier, {})
         v = []
-        for key in ('start', 'end', 'lines', 'nloc', 'commentlines', 'empty'):
+        for key in ("start", "end", "lines", "nloc", "commentlines", "empty"):
             if counters.get(key, 0):
                 v.append(loc.toString(counters[key]))
             else:
-                v.append('')
+                v.append("")
         return v
-        
+
     def __finish(self):
         """
         Private slot called when the action finished or the user pressed the
         button.
         """
         self.cancelled = True
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.resultList.header().setSectionResizeMode(
-            QHeaderView.ResizeMode.Interactive)
+            QHeaderView.ResizeMode.Interactive
+        )
         self.summaryList.header().setSectionResizeMode(
-            QHeaderView.ResizeMode.Interactive)
-        
+            QHeaderView.ResizeMode.Interactive
+        )
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     @pyqtSlot()
     def on_startButton_clicked(self):
         """
         Private slot to start a code metrics run.
         """
         fileList = self.__fileList[:]
-        
+
         filterString = self.excludeFilesEdit.text()
-        if ("ExcludeFiles" not in self.__data or
-                filterString != self.__data["ExcludeFiles"]):
+        if (
+            "ExcludeFiles" not in self.__data
+            or filterString != self.__data["ExcludeFiles"]
+        ):
             self.__data["ExcludeFiles"] = filterString
-            self.__project.setData("OTHERTOOLSPARMS", "CodeMetrics",
-                                   self.__data)
+            self.__project.setData("OTHERTOOLSPARMS", "CodeMetrics", self.__data)
         filterList = filterString.split(",")
         if filterList:
             for filterString in filterList:
-                fileList = [f for f in fileList
-                            if not fnmatch.fnmatch(f, filterString.strip())]
-        
+                fileList = [
+                    f for f in fileList if not fnmatch.fnmatch(f, filterString.strip())
+                ]
+
         self.resultList.clear()
         self.summaryList.clear()
         self.start(fileList)
-        
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if self.resultList.topLevelItemCount() > 0:
             self.__menu.popup(self.mapToGlobal(coord))
-        
+
     def __resultCollapse(self):
         """
         Private slot to collapse all entries of the resultlist.
         """
         for index in range(self.resultList.topLevelItemCount()):
             self.resultList.topLevelItem(index).setExpanded(False)
-        
+
     def __resultExpand(self):
         """
         Private slot to expand all entries of the resultlist.
--- a/src/eric7/DataViews/PyCoverageDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/PyCoverageDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,12 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl
 from PyQt6.QtGui import QDesktopServices
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem,
-    QApplication
+    QDialog,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
 )
 
 from EricWidgets import EricMessageBox
@@ -30,61 +34,56 @@
 class PyCoverageDialog(QDialog, Ui_PyCoverageDialog):
     """
     Class implementing a dialog to display the collected code coverage data.
-    
+
     @signal openFile(str) emitted to open the given file in an editor
     """
+
     openFile = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
-        self.summaryList.headerItem().setText(
-            self.summaryList.columnCount(), "")
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.summaryList.headerItem().setText(self.summaryList.columnCount(), "")
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
-        
+
         self.cancelled = False
-        self.path = '.'
+        self.path = "."
         self.reload = False
-        
-        self.excludeList = ['# *pragma[: ]*[nN][oO] *[cC][oO][vV][eE][rR]']
-        
+
+        self.excludeList = ["# *pragma[: ]*[nN][oO] *[cC][oO][vV][eE][rR]"]
+
         self.__reportsMenu = QMenu(self.tr("Create Report"), self)
         self.__reportsMenu.addAction(self.tr("HTML Report"), self.__htmlReport)
         self.__reportsMenu.addSeparator()
         self.__reportsMenu.addAction(self.tr("JSON Report"), self.__jsonReport)
         self.__reportsMenu.addAction(self.tr("LCOV Report"), self.__lcovReport)
-        
+
         self.__menu = QMenu(self)
         self.__menu.addSeparator()
-        self.openAct = self.__menu.addAction(
-            self.tr("Open"), self.__openFile)
+        self.openAct = self.__menu.addAction(self.tr("Open"), self.__openFile)
         self.__menu.addSeparator()
         self.__menu.addMenu(self.__reportsMenu)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr('Erase Coverage Info'), self.__erase)
-        self.resultList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.resultList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-    
+        self.__menu.addAction(self.tr("Erase Coverage Info"), self.__erase)
+        self.resultList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.resultList.customContextMenuRequested.connect(self.__showContextMenu)
+
     def __format_lines(self, lines):
         """
         Private method to format a list of integers into string by coalescing
         groups.
-        
+
         @param lines list of integers
         @type list of int
         @return string representing the list
@@ -94,7 +93,7 @@
         lines.sort()
         maxValue = lines[-1]
         start = None
-        
+
         i = lines[0]
         while i <= maxValue:
             try:
@@ -111,12 +110,12 @@
                 i = lines[ind + 1]
         if start:
             pairs.append((start, end))
-        
+
         def stringify(pair):
             """
             Private helper function to generate a string representation of a
             pair.
-            
+
             @param pair pair of integers
             @type tuple of (int, int
             @return representation of the pair
@@ -127,14 +126,15 @@
                 return "{0:d}".format(start)
             else:
                 return "{0:d}-{1:d}".format(start, end)
-        
+
         return ", ".join(map(stringify, pairs))
-    
-    def __createResultItem(self, file, statements, executed, coverage,
-                           excluded, missing):
+
+    def __createResultItem(
+        self, file, statements, executed, coverage, excluded, missing
+    ):
         """
         Private method to create an entry in the result list.
-        
+
         @param file filename of file
         @type str
         @param statements number of statements
@@ -148,14 +148,17 @@
         @param missing list of lines without coverage
         @type str
         """
-        itm = QTreeWidgetItem(self.resultList, [
-            file,
-            str(statements),
-            str(executed),
-            "{0:.0f}%".format(coverage),
-            excluded,
-            missing
-        ])
+        itm = QTreeWidgetItem(
+            self.resultList,
+            [
+                file,
+                str(statements),
+                str(executed),
+                "{0:.0f}%".format(coverage),
+                excluded,
+                missing,
+            ],
+        )
         for col in range(1, 4):
             itm.setTextAlignment(col, Qt.AlignmentFlag.AlignRight)
         if statements != executed:
@@ -163,11 +166,11 @@
             font.setBold(True)
             for col in range(itm.columnCount()):
                 itm.setFont(col, font)
-    
+
     def start(self, cfn, fn):
         """
         Public slot to start the coverage data evaluation.
-        
+
         @param cfn basename of the coverage file
         @type str
         @param fn file or list of files or directory to be checked
@@ -177,76 +180,72 @@
         self.resultList.clear()
         self.summaryList.clear()
         self.cancelled = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__cfn = cfn
         self.__fn = fn
-        
+
         self.cfn = (
             cfn
-            if cfn.endswith(".coverage") else
-            "{0}.coverage".format(os.path.splitext(cfn)[0])
+            if cfn.endswith(".coverage")
+            else "{0}.coverage".format(os.path.splitext(cfn)[0])
         )
-        
+
         if isinstance(fn, list):
             files = fn
             self.path = os.path.dirname(cfn)
         elif os.path.isdir(fn):
-            files = Utilities.direntries(fn, True, '*.py', False)
+            files = Utilities.direntries(fn, True, "*.py", False)
             self.path = fn
         else:
             files = [fn]
             self.path = os.path.dirname(cfn)
         files.sort()
-        
+
         cover = Coverage(data_file=self.cfn)
         cover.load()
-        
+
         # set the exclude pattern
         self.excludeCombo.clear()
         self.excludeCombo.addItems(self.excludeList)
-        
+
         self.checkProgress.setMaximum(len(files))
         QApplication.processEvents()
-        
+
         total_statements = 0
         total_executed = 0
         total_exceptions = 0
-        
+
         cover.exclude(self.excludeList[0])
-        
+
         try:
             # disable updates of the list for speed
             self.resultList.setUpdatesEnabled(False)
             self.resultList.setSortingEnabled(False)
-            
+
             # now go through all the files
             now = time.monotonic()
             for progress, file in enumerate(files, start=1):
                 if self.cancelled:
                     return
-                
+
                 try:
-                    statements, excluded, missing, readable = (
-                        cover.analysis2(file)[1:])
-                    readableEx = (excluded and self.__format_lines(excluded) or
-                                  '')
+                    statements, excluded, missing, readable = cover.analysis2(file)[1:]
+                    readableEx = excluded and self.__format_lines(excluded) or ""
                     n = len(statements)
                     m = n - len(missing)
                     pc = 100.0 * m / n if n > 0 else 100.0
                     self.__createResultItem(
-                        file, str(n), str(m), pc, readableEx, readable)
-                    
+                        file, str(n), str(m), pc, readableEx, readable
+                    )
+
                     total_statements += n
                     total_executed += m
                 except CoverageException:
                     total_exceptions += 1
-                
+
                 self.checkProgress.setValue(progress)
                 if time.monotonic() - now > 0.01:
                     QApplication.processEvents()
@@ -256,73 +255,69 @@
             self.resultList.setSortingEnabled(True)
             self.resultList.setUpdatesEnabled(True)
             self.checkProgress.reset()
-        
+
         # show summary info
         if len(files) > 1:
             if total_statements > 0:
                 pc = 100.0 * total_executed / total_statements
             else:
                 pc = 100.0
-            itm = QTreeWidgetItem(self.summaryList, [
-                str(total_statements),
-                str(total_executed),
-                "{0:.0f}%".format(pc)
-            ])
+            itm = QTreeWidgetItem(
+                self.summaryList,
+                [str(total_statements), str(total_executed), "{0:.0f}%".format(pc)],
+            )
             for col in range(0, 3):
                 itm.setTextAlignment(col, Qt.AlignmentFlag.AlignRight)
         else:
             self.summaryGroup.hide()
-        
+
         if total_exceptions:
             EricMessageBox.warning(
                 self,
                 self.tr("Parse Error"),
-                self.tr("""%n file(s) could not be parsed. Coverage"""
-                        """ info for these is not available.""", "",
-                        total_exceptions))
-        
+                self.tr(
+                    """%n file(s) could not be parsed. Coverage"""
+                    """ info for these is not available.""",
+                    "",
+                    total_exceptions,
+                ),
+            )
+
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the action finished or the user pressed the
         button.
         """
         self.cancelled = True
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
         QApplication.processEvents()
-        self.resultList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.resultList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.resultList.header().setStretchLastSection(True)
         self.summaryList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.summaryList.header().setStretchLastSection(True)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord position of the mouse pointer
         @type QPoint
         """
@@ -331,21 +326,20 @@
             self.openAct.setEnabled(True)
         else:
             self.openAct.setEnabled(False)
-        self.__reportsMenu.setEnabled(
-            bool(self.resultList.topLevelItemCount()))
+        self.__reportsMenu.setEnabled(bool(self.resultList.topLevelItemCount()))
         self.__menu.popup(self.mapToGlobal(coord))
-    
+
     def __openFile(self, itm=None):
         """
         Private slot to open the selected file.
-        
+
         @param itm reference to the item to be opened
         @type QTreeWidgetItem
         """
         if itm is None:
             itm = self.resultList.currentItem()
         fn = itm.text(0)
-        
+
         try:
             vm = ericApp().getObject("ViewManager")
             vm.openSourceFile(fn)
@@ -353,11 +347,11 @@
             editor.codeCoverageShowAnnotations(coverageFile=self.cfn)
         except KeyError:
             self.openFile.emit(fn)
-    
+
     def __prepareReportGeneration(self):
         """
         Private method to prepare a report generation.
-        
+
         @return tuple containing a reference to the Coverage object and the
             list of files to report
         @rtype tuple of (Coverage, list of str)
@@ -365,53 +359,59 @@
         count = self.resultList.topLevelItemCount()
         if count == 0:
             return None, []
-        
+
         # get list of all filenames
-        files = [
-            self.resultList.topLevelItem(index).text(0)
-            for index in range(count)
-        ]
-        
+        files = [self.resultList.topLevelItem(index).text(0) for index in range(count)]
+
         cover = Coverage(data_file=self.cfn)
         cover.exclude(self.excludeList[0])
         cover.load()
-        
+
         return cover, files
-    
+
     @pyqtSlot()
     def __htmlReport(self):
         """
         Private slot to generate a HTML report of the shown data.
         """
         from .PyCoverageHtmlReportDialog import PyCoverageHtmlReportDialog
-        
+
         dlg = PyCoverageHtmlReportDialog(os.path.dirname(self.cfn), self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             title, outputDirectory, extraCSS, openReport = dlg.getData()
-            
+
             cover, files = self.__prepareReportGeneration()
-            cover.html_report(morfs=files, directory=outputDirectory,
-                              ignore_errors=True, extra_css=extraCSS,
-                              title=title)
-            
+            cover.html_report(
+                morfs=files,
+                directory=outputDirectory,
+                ignore_errors=True,
+                extra_css=extraCSS,
+                title=title,
+            )
+
             if openReport:
-                QDesktopServices.openUrl(QUrl.fromLocalFile(os.path.join(
-                    outputDirectory, "index.html")))
-    
+                QDesktopServices.openUrl(
+                    QUrl.fromLocalFile(os.path.join(outputDirectory, "index.html"))
+                )
+
     @pyqtSlot()
     def __jsonReport(self):
         """
         Private slot to generate a JSON report of the shown data.
         """
         from .PyCoverageJsonReportDialog import PyCoverageJsonReportDialog
-        
+
         dlg = PyCoverageJsonReportDialog(os.path.dirname(self.cfn), self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             filename, compact = dlg.getData()
             cover, files = self.__prepareReportGeneration()
-            cover.json_report(morfs=files, outfile=filename,
-                              ignore_errors=True, pretty_print=not compact)
-    
+            cover.json_report(
+                morfs=files,
+                outfile=filename,
+                ignore_errors=True,
+                pretty_print=not compact,
+            )
+
     @pyqtSlot()
     def __lcovReport(self):
         """
@@ -419,7 +419,7 @@
         """
         from EricWidgets import EricPathPickerDialog
         from EricWidgets.EricPathPicker import EricPathPickerModes
-        
+
         filename, ok = EricPathPickerDialog.getPath(
             self,
             self.tr("LCOV Report"),
@@ -427,28 +427,27 @@
             mode=EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE,
             path=os.path.join(os.path.dirname(self.cfn), "coverage.lcov"),
             defaultDirectory=os.path.dirname(self.cfn),
-            filters=self.tr("LCOV Files (*.lcov);;All Files (*)")
+            filters=self.tr("LCOV Files (*.lcov);;All Files (*)"),
         )
         if ok:
             cover, files = self.__prepareReportGeneration()
-            cover.lcov_report(morfs=files, outfile=filename,
-                              ignore_errors=True)
-    
+            cover.lcov_report(morfs=files, outfile=filename, ignore_errors=True)
+
     def __erase(self):
         """
         Private slot to handle the erase context menu action.
-        
+
         This method erases the collected coverage data that is
         stored in the .coverage file.
         """
         cover = Coverage(data_file=self.cfn)
         cover.load()
         cover.erase()
-        
+
         self.reloadButton.setEnabled(False)
         self.resultList.clear()
         self.summaryList.clear()
-    
+
     @pyqtSlot()
     def on_reloadButton_clicked(self):
         """
@@ -460,12 +459,12 @@
             self.excludeList.remove(excludePattern)
         self.excludeList.insert(0, excludePattern)
         self.start(self.__cfn, self.__fn)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_resultList_itemActivated(self, item, column):
         """
         Private slot to handle the activation of an item.
-        
+
         @param item reference to the activated item (QTreeWidgetItem)
         @param column column the item was activated in (integer)
         """
--- a/src/eric7/DataViews/PyCoverageHtmlReportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/PyCoverageHtmlReportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     Class implementing a dialog to enter the parameters for a coverage HTML
     report.
     """
+
     def __init__(self, defaultDirectory, parent=None):
         """
         Constructor
-        
+
         @param defaultDirectory default directory for selecting the output
             directory
         @type str
@@ -33,39 +34,39 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.outputDirectoryPicker.setMode(
-            EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
+            EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE
+        )
         self.outputDirectoryPicker.setDefaultDirectory(defaultDirectory)
-        
-        self.extraCssPicker.setMode(
-            EricPathPickerModes.OPEN_FILE_MODE)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.extraCssPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_outputDirectoryPicker_textChanged(self, directory):
         """
         Private slot handling a change of the output directory.
-        
+
         @param directory current text of the directory picker
         @type str
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(directory))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(directory)
+        )
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the report title, the output directory, the
             path of a file containing extra CSS and a flag indicating to open
             the generated report in a browser
-        
+
         @rtype tuple of (str, str, str, bool)
         """
         title = self.titleEdit.text()
--- a/src/eric7/DataViews/PyCoverageJsonReportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/PyCoverageJsonReportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     Class implementing a dialog to enter the parameters for a coverage JSON
     report.
     """
+
     def __init__(self, defaultDirectory, parent=None):
         """
         Constructor
-        
+
         @param defaultDirectory default directory for selecting the output
             directory
         @type str
@@ -35,36 +36,36 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.outputFilePicker.setMode(
-            EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE)
+            EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE
+        )
         self.outputFilePicker.setDefaultDirectory(defaultDirectory)
-        self.outputFilePicker.setFilters(
-            self.tr("JSON Files (*.json);;All Files (*)"))
-        self.outputFilePicker.setText(
-            os.path.join(defaultDirectory, "coverage.json"))
-        
+        self.outputFilePicker.setFilters(self.tr("JSON Files (*.json);;All Files (*)"))
+        self.outputFilePicker.setText(os.path.join(defaultDirectory, "coverage.json"))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_outputFilePicker_textChanged(self, filename):
         """
         Private slot handling a change of the output file.
-        
+
         @param filename current text of the file picker
         @type str
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(filename))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(filename)
+        )
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the output file and a flag indicating the
             creation of a compact JSON file
-        
+
         @rtype tuple of (str, bool)
         """
         return (
--- a/src/eric7/DataViews/PyProfileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DataViews/PyProfileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,13 +8,17 @@
 """
 
 import os
-import pickle       # secok
+import pickle  # secok
 import time
 
 from PyQt6.QtCore import Qt
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem,
-    QApplication
+    QDialog,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,20 +32,21 @@
     Class implementing a custom QTreeWidgetItem to allow sorting on numeric
     values.
     """
+
     def __getNC(self, itm):
         """
         Private method to get the value to compare on for the first column.
-        
+
         @param itm item to operate on (ProfileTreeWidgetItem)
         @return comparison value for the first column (integer)
         """
         s = itm.text(0)
-        return int(s.split('/')[0])
-        
+        return int(s.split("/")[0])
+
     def __lt__(self, other):
         """
         Special method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against
             (ProfileTreeWidgetItem)
         @return true, if this item is less than other (boolean)
@@ -52,65 +57,63 @@
         if column == 6:
             return int(self.text(column)) < int(other.text(column))
         return self.text(column) < other.text(column)
-        
+
 
 class PyProfileDialog(QDialog, Ui_PyProfileDialog):
     """
     Class implementing a dialog to display the results of a profiling run.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.cancelled = False
         self.exclude = True
-        self.ericpath = os.path.dirname(
-            os.path.dirname(os.path.abspath(__file__)))
+        self.ericpath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
         self.pyLibPath = Utilities.getPythonLibPath()
-        
-        self.summaryList.headerItem().setText(
-            self.summaryList.columnCount(), "")
+
+        self.summaryList.headerItem().setText(self.summaryList.columnCount(), "")
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
-        self.resultList.header().setSortIndicator(
-            0, Qt.SortOrder.DescendingOrder)
-        
+        self.resultList.header().setSortIndicator(0, Qt.SortOrder.DescendingOrder)
+
         self.__menu = QMenu(self)
         self.filterItm = self.__menu.addAction(
-            self.tr('Exclude Python Library'),
-            self.__filter)
+            self.tr("Exclude Python Library"), self.__filter
+        )
         self.__menu.addSeparator()
-        self.__menu.addAction(
-            self.tr('Erase Profiling Info'), self.__eraseProfile)
-        self.__menu.addAction(
-            self.tr('Erase Timing Info'), self.__eraseTiming)
+        self.__menu.addAction(self.tr("Erase Profiling Info"), self.__eraseProfile)
+        self.__menu.addAction(self.tr("Erase Timing Info"), self.__eraseTiming)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr('Erase All Infos'), self.__eraseAll)
-        self.resultList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.resultList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        self.summaryList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.summaryList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
-    def __createResultItem(self, calls, totalTime, totalTimePerCall,
-                           cumulativeTime, cumulativeTimePerCall, file, line,
-                           functionName):
+        self.__menu.addAction(self.tr("Erase All Infos"), self.__eraseAll)
+        self.resultList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.resultList.customContextMenuRequested.connect(self.__showContextMenu)
+        self.summaryList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.summaryList.customContextMenuRequested.connect(self.__showContextMenu)
+
+    def __createResultItem(
+        self,
+        calls,
+        totalTime,
+        totalTimePerCall,
+        cumulativeTime,
+        cumulativeTimePerCall,
+        file,
+        line,
+        functionName,
+    ):
         """
         Private method to create an entry in the result list.
-        
+
         @param calls number of calls (integer)
         @param totalTime total time (double)
         @param totalTimePerCall total time per call (double)
@@ -120,59 +123,62 @@
         @param line linenumber (integer)
         @param functionName function name (string)
         """
-        itm = ProfileTreeWidgetItem(self.resultList, [
-            calls,
-            "{0: 8.3f}".format(totalTime),
-            totalTimePerCall,
-            "{0: 8.3f}".format(cumulativeTime),
-            cumulativeTimePerCall,
-            file,
-            str(line),
-            functionName
-        ])
+        itm = ProfileTreeWidgetItem(
+            self.resultList,
+            [
+                calls,
+                "{0: 8.3f}".format(totalTime),
+                totalTimePerCall,
+                "{0: 8.3f}".format(cumulativeTime),
+                cumulativeTimePerCall,
+                file,
+                str(line),
+                functionName,
+            ],
+        )
         for col in [0, 1, 2, 3, 4, 6]:
             itm.setTextAlignment(col, Qt.AlignmentFlag.AlignRight)
-        
+
     def __createSummaryItem(self, label, contents):
         """
         Private method to create an entry in the summary list.
-        
+
         @param label text of the first column (string)
         @param contents text of the second column (string)
         """
         itm = QTreeWidgetItem(self.summaryList, [label, contents])
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
-        
+
     def __resortResultList(self):
         """
         Private method to resort the tree.
         """
-        self.resultList.sortItems(self.resultList.sortColumn(),
-                                  self.resultList.header()
-                                  .sortIndicatorOrder())
-        
+        self.resultList.sortItems(
+            self.resultList.sortColumn(), self.resultList.header().sortIndicatorOrder()
+        )
+
     def __populateLists(self, exclude=False):
         """
         Private method used to populate the listviews.
-        
+
         @param exclude flag indicating whether files residing in the
                 Python library should be excluded
         """
         self.resultList.clear()
         self.summaryList.clear()
-        
+
         self.checkProgress.setMaximum(len(self.stats))
         QApplication.processEvents()
-        
+
         total_calls = 0
         prim_calls = 0
         total_tt = 0
-        
+
         try:
             # disable updates of the list for speed
             self.resultList.setUpdatesEnabled(False)
             self.resultList.setSortingEnabled(False)
-            
+
             # now go through all the files
             now = time.monotonic()
             for progress, (func, (cc, nc, tt, ct, _callers)) in enumerate(
@@ -180,24 +186,26 @@
             ):
                 if self.cancelled:
                     return
-                
+
                 if (
-                    not (self.ericpath and
-                         func[0].startswith(self.ericpath)) and
-                    not func[0].startswith("DebugClients") and
-                    func[0] != "profile" and
-                    not (exclude and (func[0].startswith(self.pyLibPath) or
-                                      func[0] == "")
-                         ) and
-                    (self.file is None or
-                     func[0].startswith(self.file) or
-                     func[0].startswith(self.pyLibPath))
+                    not (self.ericpath and func[0].startswith(self.ericpath))
+                    and not func[0].startswith("DebugClients")
+                    and func[0] != "profile"
+                    and not (
+                        exclude
+                        and (func[0].startswith(self.pyLibPath) or func[0] == "")
+                    )
+                    and (
+                        self.file is None
+                        or func[0].startswith(self.file)
+                        or func[0].startswith(self.pyLibPath)
+                    )
                 ):
                     # calculate the totals
                     total_calls += nc
                     prim_calls += cc
                     total_tt += tt
-                    
+
                     if nc != cc:
                         c = "{0:d}/{1:d}".format(nc, cc)
                     else:
@@ -210,9 +218,10 @@
                         cpc = "{0: 8.3f}".format(0.0)
                     else:
                         cpc = "{0: 8.3f}".format(ct / cc)
-                    self.__createResultItem(c, tt, tpc, ct, cpc, func[0],
-                                            func[1], func[2])
-                    
+                    self.__createResultItem(
+                        c, tt, tpc, ct, cpc, func[0], func[1], func[2]
+                    )
+
                 self.checkProgress.setValue(progress)
                 if time.monotonic() - now > 0.01:
                     QApplication.processEvents()
@@ -222,107 +231,98 @@
             self.resultList.setSortingEnabled(True)
             self.resultList.setUpdatesEnabled(True)
         self.__resortResultList()
-        
+
         # now do the summary stuff
-        self.__createSummaryItem(self.tr("function calls"),
-                                 str(total_calls))
+        self.__createSummaryItem(self.tr("function calls"), str(total_calls))
         if total_calls != prim_calls:
-            self.__createSummaryItem(self.tr("primitive calls"),
-                                     str(prim_calls))
-        self.__createSummaryItem(self.tr("CPU seconds"),
-                                 "{0:.3f}".format(total_tt))
-        
+            self.__createSummaryItem(self.tr("primitive calls"), str(prim_calls))
+        self.__createSummaryItem(self.tr("CPU seconds"), "{0:.3f}".format(total_tt))
+
     def start(self, pfn, fn=None):
         """
         Public slot to start the calculation of the profile data.
-        
+
         @param pfn basename of the profiling file (string)
         @param fn file to display the profiling data for (string)
         """
         self.basename = os.path.splitext(pfn)[0]
-        
+
         fname = "{0}.profile".format(self.basename)
         if not os.path.exists(fname):
             EricMessageBox.warning(
                 self,
                 self.tr("Profile Results"),
-                self.tr("""<p>There is no profiling data"""
-                        """ available for <b>{0}</b>.</p>""")
-                .format(pfn))
+                self.tr(
+                    """<p>There is no profiling data"""
+                    """ available for <b>{0}</b>.</p>"""
+                ).format(pfn),
+            )
             self.close()
             return
         try:
-            with open(fname, 'rb') as f:
-                self.stats = pickle.load(f)     # secok
+            with open(fname, "rb") as f:
+                self.stats = pickle.load(f)  # secok
         except (OSError, pickle.PickleError, EOFError):
             EricMessageBox.critical(
                 self,
                 self.tr("Loading Profiling Data"),
-                self.tr("""<p>The profiling data could not be"""
-                        """ read from file <b>{0}</b>.</p>""")
-                .format(fname))
+                self.tr(
+                    """<p>The profiling data could not be"""
+                    """ read from file <b>{0}</b>.</p>"""
+                ).format(fname),
+            )
             self.close()
             return
-        
+
         self.file = fn
         self.__populateLists()
         self.__finish()
-        
+
     def __finish(self):
         """
         Private slot called when the action finished or the user pressed the
         button.
         """
         self.cancelled = True
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
         QApplication.processEvents()
-        self.resultList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.resultList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.resultList.header().setStretchLastSection(True)
         self.summaryList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.summaryList.header().setStretchLastSection(True)
-        
+
     def __unfinish(self):
         """
         Private slot called to revert the effects of the __finish slot.
         """
         self.cancelled = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         self.__menu.popup(self.mapToGlobal(coord))
-        
+
     def __eraseProfile(self):
         """
         Private slot to handle the Erase Profile context menu action.
@@ -330,7 +330,7 @@
         fname = "{0}.profile".format(self.basename)
         if os.path.exists(fname):
             os.remove(fname)
-        
+
     def __eraseTiming(self):
         """
         Private slot to handle the Erase Timing context menu action.
@@ -338,14 +338,14 @@
         fname = "{0}.timings".format(self.basename)
         if os.path.exists(fname):
             os.remove(fname)
-        
+
     def __eraseAll(self):
         """
         Private slot to handle the Erase All context menu action.
         """
         self.__eraseProfile()
         self.__eraseTiming()
-        
+
     def __filter(self):
         """
         Private slot to handle the Exclude/Include Python Library context menu
@@ -354,10 +354,10 @@
         self.__unfinish()
         if self.exclude:
             self.exclude = False
-            self.filterItm.setText(self.tr('Include Python Library'))
+            self.filterItm.setText(self.tr("Include Python Library"))
             self.__populateLists(True)
         else:
             self.exclude = True
-            self.filterItm.setText(self.tr('Exclude Python Library'))
+            self.filterItm.setText(self.tr("Exclude Python Library"))
             self.__populateLists(False)
         self.__finish()
--- a/src/eric7/DebugClients/Python/AsyncFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/AsyncFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,7 @@
 def AsyncPendingWrite(file):
     """
     Module function to check for data to be written.
-    
+
     @param file The file object to be checked
     @type file
     @return Flag indicating if there is data waiting
@@ -36,15 +36,16 @@
     """
     Class wrapping a socket object with a file interface.
     """
+
     MAX_TRIES = 10
-    
-    BUFSIZE = 2 ** 14           # 16 kBytes
-    CMD_BUFSIZE = 2 ** 12       # 4 kBytes
-    
+
+    BUFSIZE = 2**14  # 16 kBytes
+    CMD_BUFSIZE = 2**12  # 4 kBytes
+
     def __init__(self, sock, mode, name):
         """
         Constructor
-        
+
         @param sock the socket object being wrapped
         @type socket
         @param mode mode of this file
@@ -62,28 +63,28 @@
         self.errors = None
         self.newlines = None
         self.line_buffering = False
-        
+
         self.writeLock = threading.RLock()
         self.wpending = []
 
     def __checkMode(self, mode):
         """
         Private method to check the mode.
-        
+
         This method checks, if an operation is permitted according to
         the mode of the file. If it is not, an OSError is raised.
-        
+
         @param mode the mode to be checked
         @type string
         @exception OSError raised to indicate a bad file descriptor
         """
         if mode != self.mode:
-            raise OSError((9, '[Errno 9] Bad file descriptor'))
+            raise OSError((9, "[Errno 9] Bad file descriptor"))
 
     def pendingWrite(self):
         """
         Public method that returns the number of strings waiting to be written.
-        
+
         @return the number of strings to be written
         @rtype int
         """
@@ -92,7 +93,7 @@
     def close(self, closeit=False):
         """
         Public method to close the file.
-        
+
         @param closeit flag to indicate a close ordered by the debugger code
         @type bool
         """
@@ -111,23 +112,22 @@
                 buf = self.wpending.pop(0)
             except IndexError:
                 break
-            
+
             try:
-                with contextlib.suppress(UnicodeEncodeError,
-                                         UnicodeDecodeError):
-                    buf = buf.encode('utf-8', 'backslashreplace')
+                with contextlib.suppress(UnicodeEncodeError, UnicodeDecodeError):
+                    buf = buf.encode("utf-8", "backslashreplace")
                 self.sock.sendall(buf)
                 self.nWriteErrors = 0
             except OSError:
                 self.nWriteErrors += 1
                 if self.nWriteErrors > AsyncFile.MAX_TRIES:
-                    self.wpending = []    # delete all output
+                    self.wpending = []  # delete all output
         self.writeLock.release()
 
     def isatty(self):
         """
         Public method to indicate whether a tty interface is supported.
-        
+
         @return always false
         @rtype bool
         """
@@ -136,7 +136,7 @@
     def fileno(self):
         """
         Public method returning the file number.
-        
+
         @return file number
         @rtype int
         """
@@ -148,78 +148,78 @@
     def readable(self):
         """
         Public method to check, if the stream is readable.
-        
+
         @return flag indicating a readable stream
         @rtype bool
         """
         return self.mode == "r"
-    
+
     def read_p(self, size=-1):
         """
         Public method to read bytes from this file.
-        
+
         @param size maximum number of bytes to be read
         @type int
         @return the bytes read
         @rtype str
         """
-        self.__checkMode('r')
+        self.__checkMode("r")
 
         if size < 0:
             size = AsyncFile.BUFSIZE
 
-        return self.sock.recv(size).decode('utf8', 'backslashreplace')
+        return self.sock.recv(size).decode("utf8", "backslashreplace")
 
     def read(self, size=-1):
         """
         Public method to read bytes from this file.
-        
+
         @param size maximum number of bytes to be read
         @type int
         @return the bytes read
         @rtype str
         """
-        self.__checkMode('r')
+        self.__checkMode("r")
 
-        buf = input()       # secok
+        buf = input()  # secok
         if size >= 0:
             buf = buf[:size]
         return buf
-    
+
     def readCommand(self):
         """
         Public method to read a length prefixed command string.
-        
+
         @return command string
         @rtype str
         """
         # The command string is prefixed by a 9 character long length field.
         length = self.sock.recv(9)
         length = int(length)
-        data = b''
+        data = b""
         while len(data) < length:
             remaining = length - len(data)
             newBytes = self.sock.recv(min(remaining, AsyncFile.CMD_BUFSIZE))
             data += newBytes
-            if newBytes[-1] == b'\n':
+            if newBytes[-1] == b"\n":
                 break
-        
+
         # step 2: convert the data
-        return data.decode('utf8', 'backslashreplace')
-    
+        return data.decode("utf8", "backslashreplace")
+
     def readline_p(self, size=-1):
         """
         Public method to read a line from this file.
-        
+
         <b>Note</b>: This method will not block and may return
         only a part of a line if that is all that is available.
-        
+
         @param size maximum number of bytes to be read
         @type int
         @return one line of text up to size bytes
         @rtype str
         """
-        self.__checkMode('r')
+        self.__checkMode("r")
 
         if size < 0:
             size = AsyncFile.BUFSIZE
@@ -230,22 +230,22 @@
         # read a line at a time.
         line = self.sock.recv(size, socket.MSG_PEEK)
 
-        eol = line.find(b'\n')
+        eol = line.find(b"\n")
         size = eol + 1 if eol >= 0 else len(line)
 
         # Now we know how big the line is, read it for real.
-        return self.sock.recv(size).decode('utf8', 'backslashreplace')
+        return self.sock.recv(size).decode("utf8", "backslashreplace")
 
     def readlines(self, sizehint=-1):
         """
         Public method to read all lines from this file.
-        
+
         @param sizehint hint of the numbers of bytes to be read
         @type int
         @return list of lines read
         @rtype list of str
         """
-        self.__checkMode('r')
+        self.__checkMode("r")
 
         lines = []
         room = sizehint
@@ -270,32 +270,32 @@
     def readline(self, sizehint=-1):
         """
         Public method to read one line from this file.
-        
+
         @param sizehint hint of the numbers of bytes to be read
         @type int
         @return one line read
         @rtype str
         """
-        self.__checkMode('r')
+        self.__checkMode("r")
 
-        line = input() + '\n'           # secok
+        line = input() + "\n"  # secok
         if sizehint >= 0:
             line = line[:sizehint]
         return line
-    
+
     def seekable(self):
         """
         Public method to check, if the stream is seekable.
-        
+
         @return flag indicating a seekable stream
         @rtype bool
         """
         return False
-    
+
     def seek(self, offset, whence=0):
         """
         Public method to move the filepointer.
-        
+
         @param offset offset to move the filepointer to
         @type int
         @param whence position the offset relates to
@@ -303,67 +303,70 @@
         @exception OSError This method is not supported and always raises an
         OSError.
         """
-        raise OSError((29, '[Errno 29] Illegal seek'))
+        raise OSError((29, "[Errno 29] Illegal seek"))
 
     def tell(self):
         """
         Public method to get the filepointer position.
-        
+
         @exception OSError This method is not supported and always raises an
         OSError.
         """
-        raise OSError((29, '[Errno 29] Illegal seek'))
+        raise OSError((29, "[Errno 29] Illegal seek"))
 
     def truncate(self, size=-1):
         """
         Public method to truncate the file.
-        
+
         @param size size to truncate to
         @type int
         @exception OSError This method is not supported and always raises an
         OSError.
         """
-        raise OSError((29, '[Errno 29] Illegal seek'))
+        raise OSError((29, "[Errno 29] Illegal seek"))
 
     def writable(self):
         """
         Public method to check, if a stream is writable.
-        
+
         @return flag indicating a writable stream
         @rtype bool
         """
         return self.mode == "w"
-    
+
     def write(self, s):
         """
         Public method to write a string to the file.
-        
+
         @param s text to be written
         @type str, bytes or bytearray
         """
-        self.__checkMode('w')
-        
+        self.__checkMode("w")
+
         self.writeLock.acquire()
         if isinstance(s, (bytes, bytearray)):
             # convert to string to send it
             s = repr(s)
-        
-        cmd = prepareJsonCommand("ClientOutput", {
-            "text": s,
-            "debuggerId": "",
-        })
+
+        cmd = prepareJsonCommand(
+            "ClientOutput",
+            {
+                "text": s,
+                "debuggerId": "",
+            },
+        )
         self.wpending.append(cmd)
         self.flush()
         self.writeLock.release()
-    
+
     def write_p(self, s):
         """
         Public method to write a json-rpc 2.0 coded string to the file.
-        
+
         @param s text to be written
         @type str
         """
-        self.__checkMode('w')
+        self.__checkMode("w")
 
         self.wpending.append(s)
         self.flush()
@@ -371,7 +374,7 @@
     def writelines(self, lines):
         """
         Public method to write a list of strings to the file.
-        
+
         @param lines list of texts to be written
         @type list of str
         """
--- a/src/eric7/DebugClients/Python/BreakpointWatch.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/BreakpointWatch.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,19 +21,20 @@
     Breakpoints are indexed by the file,line tuple using breaks. It
     points to a single Breakpoint instance. This is rather different to
     the original bdb, since there may be more than one breakpoint per line.
-    
+
     To test for a specific line in a file there is another dict breakInFile,
     which is indexed only by filename and holds all line numbers where
     breakpoints are.
     """
-    breaks = {}     # indexed by (filename, lineno) tuple: Breakpoint
+
+    breaks = {}  # indexed by (filename, lineno) tuple: Breakpoint
     breakInFile = {}  # indexed by filename: [lineno]
     breakInFrameCache = {}
-    
+
     def __init__(self, filename, lineno, temporary=False, cond=None):
         """
         Constructor
-        
+
         @param filename file name where a breakpoint is set
         @type str
         @param lineno line number of the breakpoint
@@ -83,7 +84,7 @@
     def clear_break(filename, lineno):
         """
         Static method reimplemented from bdb.py to clear a breakpoint.
-        
+
         @param filename file name of the bp to retrieve
         @type str
         @param lineno line number of the bp to retrieve
@@ -93,7 +94,7 @@
         if bp:
             bp.deleteMe()
         Breakpoint.breakInFrameCache.clear()
-    
+
     @staticmethod
     def clear_all_breaks():
         """
@@ -107,10 +108,10 @@
     def get_break(filename, lineno):
         """
         Static method to get the breakpoint of a particular line.
-        
+
         Because eric supports only one breakpoint per line, this
         method will return only one breakpoint.
-        
+
         @param filename file name of the bp to retrieve
         @type str
         @param lineno line number of the bp to retrieve
@@ -119,7 +120,7 @@
         @rtype Breakpoint object or None
         """
         return Breakpoint.breaks.get((filename, lineno))
-    
+
     @staticmethod
     def effectiveBreak(filename, lineno, frame):
         """
@@ -129,7 +130,7 @@
         Called only if we know there is a bpt at this
         location.  Returns breakpoint that was triggered and a flag
         that indicates if it is ok to delete a temporary bp.
-        
+
         @param filename file name of the bp to retrieve
         @type str
         @param lineno line number of the bp to retrieve
@@ -143,7 +144,7 @@
         b = Breakpoint.breaks[filename, lineno]
         if not b.enabled:
             return (None, False)
-        
+
         # Count every hit when bp is enabled
         b.hits += 1
         if not b.cond:
@@ -161,7 +162,7 @@
             # Ignore count applies only to those bpt hits where the
             # condition evaluates to true.
             try:
-                val = eval(b.cond, frame.f_globals, frame.f_locals)     # secok
+                val = eval(b.cond, frame.f_globals, frame.f_locals)  # secok
                 if val:
                     if b.ignore > 0:
                         b.ignore -= 1
@@ -185,12 +186,13 @@
     Implements temporary watches, ignore counts, disabling and
     (re)-enabling, and conditionals.
     """
+
     watches = []
 
     def __init__(self, cond, compiledCond, flag, temporary=False):
         """
         Constructor
-        
+
         @param cond condition as string with flag
         @type str
         @param compiledCond precompiled condition
@@ -203,21 +205,21 @@
         # Should not occur
         if not cond:
             return
-        
+
         self.cond = cond
         self.compiledCond = compiledCond
         self.temporary = temporary
-        
+
         self.enabled = True
         self.ignore = 0
-        
+
         self.created = False
         self.changed = False
-        if flag == '??created??':
+        if flag == "??created??":
             self.created = True
-        elif flag == '??changed??':
+        elif flag == "??changed??":
             self.changed = True
-        
+
         self.values = {}
         Watch.watches.append(self)
 
@@ -244,7 +246,7 @@
     def clear_watch(cond):
         """
         Static method to clear a watch expression.
-        
+
         @param cond expression of the watch expression to be cleared
         @type str
         """
@@ -262,7 +264,7 @@
     def get_watch(cond):
         """
         Static method to get a watch expression.
-        
+
         @param cond expression of the watch expression to be cleared
         @type str
         @return reference to the watch point
@@ -271,14 +273,14 @@
         for b in Watch.watches:
             if b.cond == cond:
                 return b
-        
+
         return None
 
     @staticmethod
     def effectiveWatch(frame):
         """
         Static method to determine, if a watch expression is effective.
-        
+
         @param frame the current execution frame
         @type frame object
         @return tuple of watch expression and a flag to indicate, that a
@@ -297,7 +299,7 @@
                     else:
                         b.values[frame] = [1, val, b.ignore]
                         return (b, True)
-                    
+
                 elif b.changed:
                     try:
                         if b.values[frame][1] != val:
@@ -306,19 +308,19 @@
                             continue
                     except KeyError:
                         b.values[frame] = [1, val, b.ignore]
-                    
+
                     if b.values[frame][2] > 0:
                         b.values[frame][2] -= 1
                         continue
                     else:
                         return (b, True)
-                    
+
                 elif val:
                     if b.ignore > 0:
                         b.ignore -= 1
                         continue
                     else:
                         return (b, True)
-            except Exception:       # secok
+            except Exception:  # secok
                 continue
         return (None, False)
--- a/src/eric7/DebugClients/Python/DebugBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,8 +26,7 @@
 
 try:
     GENERATOR_AND_COROUTINE_FLAGS = (
-        inspect.CO_GENERATOR | inspect.CO_COROUTINE |
-        inspect.CO_ASYNC_GENERATOR
+        inspect.CO_GENERATOR | inspect.CO_COROUTINE | inspect.CO_ASYNC_GENERATOR
     )
 except AttributeError:
     # Python < 3.7
@@ -37,17 +36,17 @@
 def printerr(s):
     """
     Module function used for debugging the debug client.
-    
+
     @param s data to be printed
     """
-    sys.__stderr__.write('{0!s}\n'.format(s))
+    sys.__stderr__.write("{0!s}\n".format(s))
     sys.__stderr__.flush()
 
 
 def setRecursionLimit(limit):
     """
     Module function to set the recursion limit.
-    
+
     @param limit recursion limit (integer)
     """
     global gRecursionLimit
@@ -60,55 +59,56 @@
 
     Provides methods for the 'owning' client to call to step etc.
     """
+
     lib = os.path.dirname(inspect.__file__)
     # tuple required because it's accessed a lot of times by startswith method
-    pathsToSkip = ('<', os.path.dirname(__file__), inspect.__file__[:-1])
+    pathsToSkip = ("<", os.path.dirname(__file__), inspect.__file__[:-1])
     filesToSkip = {}
 
     # cache for fixed file names
     _fnCache = {}
-    
+
     # Stop all timers, when greenlets are used
     pollTimerEnabled = True
 
     def __init__(self, dbgClient):
         """
         Constructor
-        
+
         @param dbgClient the owning client
         """
         self._dbgClient = dbgClient
-        
+
         # Some informations about the thread
         self.isMainThread = False
         self.quitting = False
         self.id = -1
-        self.name = ''
-        
+        self.name = ""
+
         self.tracePythonLibs(False)
-        
+
         # Special handling of a recursion error
         self.skipFrames = 0
-        
+
         self.isBroken = False
         self.isException = False
         self.cFrame = None
-        
+
         # current frame we are at
         self.currentFrame = None
-        
+
         # frames, where we want to stop or release debugger
         self.stopframe = None
         self.returnframe = None
         self.stop_everywhere = False
-        
+
         self.__recursionDepth = -1
         self.setRecursionDepth(inspect.currentframe())
-        
+
         # background task to periodicaly check for client interactions
         self.eventPollFlag = False
         self.timer = _thread.start_new_thread(self.__eventPollTimer, ())
-        
+
         # provide a hook to perform a hard breakpoint
         # Use it like this:
         # if hasattr(sys, 'breakpoint): sys.breakpoint()
@@ -123,27 +123,27 @@
         while DebugBase.pollTimerEnabled:
             time.sleep(0.5)
             self.eventPollFlag = True
-        
+
         self.eventPollFlag = False
-    
+
     def getCurrentFrame(self):
         """
         Public method to return the current frame.
-        
+
         @return the current frame
         @rtype frame object
         """
         # Don't show any local frames after the program was stopped
         if self.quitting:
             return None
-        
+
         return self.currentFrame
-    
+
     def getFrameLocals(self, frmnr=0):
         """
         Public method to return the locals dictionary of the current frame
         or a frame below.
-        
+
         @param frmnr distance of frame to get locals dictionary of. 0 is
             the current frame (int)
         @return locals dictionary of the frame
@@ -153,12 +153,12 @@
             f = f.f_back
             frmnr -= 1
         return f.f_locals
-    
+
     def storeFrameLocals(self, frmnr=0):
         """
         Public method to store the locals into the frame, so an access to
         frame.f_locals returns the last data.
-        
+
         @param frmnr distance of frame to store locals dictionary to. 0 is
             the current frame (int)
         """
@@ -166,21 +166,20 @@
         while cf is not None and frmnr > 0:
             cf = cf.f_back
             frmnr -= 1
-        
+
         with contextlib.suppress(Exception):
             if "__pypy__" in sys.builtin_module_names:
                 import __pypy__
+
                 __pypy__.locals_to_fast(cf)
                 return
-        
-        ctypes.pythonapi.PyFrame_LocalsToFast(
-            ctypes.py_object(cf),
-            ctypes.c_int(0))
-    
+
+        ctypes.pythonapi.PyFrame_LocalsToFast(ctypes.py_object(cf), ctypes.c_int(0))
+
     def step(self, traceMode):
         """
         Public method to perform a step operation in this thread.
-        
+
         @param traceMode If it is True, then the step is a step into,
               otherwise it is a step over.
         """
@@ -188,39 +187,39 @@
             self.set_step()
         else:
             self.set_next(self.currentFrame)
-    
+
     def stepOut(self):
         """
         Public method to perform a step out of the current call.
         """
         self.set_return(self.currentFrame)
-    
+
     def go(self, special):
         """
         Public method to resume the thread.
 
         It resumes the thread stopping only at breakpoints or exceptions.
-        
+
         @param special flag indicating a special continue operation
         """
         self.set_continue(special)
-    
+
     def setRecursionDepth(self, frame):
         """
         Public method to determine the current recursion depth.
-        
+
         @param frame The current stack frame.
         """
         self.__recursionDepth = 0
         while frame is not None:
             self.__recursionDepth += 1
             frame = frame.f_back
-    
+
     def profileWithRecursion(self, frame, event, arg):
         """
         Public method used to trace some stuff independent of the debugger
         trace function.
-        
+
         @param frame current stack frame
         @type frame object
         @param event trace event
@@ -229,26 +228,27 @@
         @type depends on the previous event parameter
         @exception RuntimeError raised to indicate too many recursions
         """
-        if event == 'return':
+        if event == "return":
             self.cFrame = frame.f_back
             self.__recursionDepth -= 1
             if self._dbgClient.callTraceEnabled:
                 self.__sendCallTrace(event, frame, self.cFrame)
-        elif event == 'call':
+        elif event == "call":
             if self._dbgClient.callTraceEnabled:
                 self.__sendCallTrace(event, self.cFrame, frame)
             self.cFrame = frame
             self.__recursionDepth += 1
             if self.__recursionDepth > gRecursionLimit:
                 raise RuntimeError(
-                    'maximum recursion depth exceeded\n'
-                    '(offending frame is two down the stack)')
-    
+                    "maximum recursion depth exceeded\n"
+                    "(offending frame is two down the stack)"
+                )
+
     def profile(self, frame, event, arg):
         """
         Public method used to trace some stuff independent of the debugger
         trace function.
-        
+
         @param frame current stack frame
         @type frame object
         @param event trace event
@@ -256,15 +256,15 @@
         @param arg arguments
         @type depends on the previous event parameter
         """
-        if event == 'return':
+        if event == "return":
             self.__sendCallTrace(event, frame, frame.f_back)
-        elif event == 'call':
+        elif event == "call":
             self.__sendCallTrace(event, frame.f_back, frame)
-    
+
     def __sendCallTrace(self, event, fromFrame, toFrame):
         """
         Private method to send a call/return trace.
-        
+
         @param event trace event
         @type str
         @param fromFrame originating frame
@@ -274,27 +274,25 @@
         """
         if not self.__skipFrame(fromFrame) and not self.__skipFrame(toFrame):
             fromInfo = {
-                "filename": self._dbgClient.absPath(
-                    self.fix_frame_filename(fromFrame)),
+                "filename": self._dbgClient.absPath(self.fix_frame_filename(fromFrame)),
                 "linenumber": fromFrame.f_lineno,
                 "codename": fromFrame.f_code.co_name,
             }
             toInfo = {
-                "filename": self._dbgClient.absPath(
-                    self.fix_frame_filename(toFrame)),
+                "filename": self._dbgClient.absPath(self.fix_frame_filename(toFrame)),
                 "linenumber": toFrame.f_lineno,
                 "codename": toFrame.f_code.co_name,
             }
             self._dbgClient.sendCallTrace(event, fromInfo, toInfo)
-    
+
     def trace_dispatch(self, frame, event, arg):
         """
         Public method reimplemented from bdb.py to do some special things.
-        
+
         This specialty is to check the connection to the debug server
         for new events (i.e. new breakpoints) while we are going through
         the code.
-        
+
         @param frame The current stack frame
         @type frame object
         @param event The trace event
@@ -309,43 +307,42 @@
         if self.eventPollFlag:
             self._dbgClient.eventPoll()
             self.eventPollFlag = False
-            
+
             if self.quitting:
                 raise SystemExit
-        
-        if event == 'line':
+
+        if event == "line":
             if self.stop_here(frame) or self.break_here(frame):
                 if (
-                    self.stop_everywhere and
-                    frame.f_back and
-                    frame.f_back.f_code.co_name == "prepareJsonCommand"
+                    self.stop_everywhere
+                    and frame.f_back
+                    and frame.f_back.f_code.co_name == "prepareJsonCommand"
                 ):
                     # Just stepped into print statement, so skip these frames
                     self._set_stopinfo(None, frame.f_back)
                 else:
                     self.user_line(frame)
             return self.trace_dispatch
-        
-        if event == 'call':
+
+        if event == "call":
             if (
-                self.stop_here(frame) or
-                self.__checkBreakInFrame(frame) or
-                Watch.watches != []
+                self.stop_here(frame)
+                or self.__checkBreakInFrame(frame)
+                or Watch.watches != []
             ) or (
-                self.stopframe and
-                frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
+                self.stopframe and frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
             ):
                 return self.trace_dispatch
             else:
                 # No need to trace this function
                 return None
-        
-        if event == 'return':
+
+        if event == "return":
             if self.stop_here(frame) or frame == self.returnframe:
                 # Ignore return events in generator except when stepping.
                 if (
-                    self.stopframe and
-                    frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
+                    self.stopframe
+                    and frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
                 ):
                     return self.trace_dispatch
                 # Only true if we didn't stop in this frame, because it's
@@ -353,17 +350,17 @@
                 if self.stopframe is frame and self.stoplineno != -1:
                     self._set_stopinfo(None, frame.f_back)
             return None
-        
-        if event == 'exception':
+
+        if event == "exception":
             if not self.__skipFrame(frame):
                 # When stepping with next/until/return in a generator frame,
                 # skip the internal StopIteration exception (with no traceback)
                 # triggered by a subiterator run with the 'yield from'
                 # statement.
                 if not (
-                    frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS and
-                    arg[0] is StopIteration and
-                    arg[2] is None
+                    frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
+                    and arg[0] is StopIteration
+                    and arg[2] is None
                 ):
                     self.user_exception(arg)
             # Stop at the StopIteration or GeneratorExit exception when the
@@ -371,26 +368,26 @@
             # command, or a next/until command at the last statement in the
             # generator before the exception.
             elif (
-                self.stopframe and
-                frame is not self.stopframe and
-                (self.stopframe.f_code.co_flags &
-                 GENERATOR_AND_COROUTINE_FLAGS) and
-                arg[0] in (StopIteration, GeneratorExit)
+                self.stopframe
+                and frame is not self.stopframe
+                and (self.stopframe.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS)
+                and arg[0] in (StopIteration, GeneratorExit)
             ):
                 self.user_exception(arg)
             return None
 
-        if event == 'c_call':
+        if event == "c_call":
             return None
-        if event == 'c_exception':
+        if event == "c_exception":
             return None
-        if event == 'c_return':
+        if event == "c_return":
             return None
-        
-        print('DebugBase.trace_dispatch:'       # __IGNORE_WARNING_M801__
-              ' unknown debugging event: ',
-              repr(event))
-        
+
+        print(  # __IGNORE_WARNING_M801__
+            "DebugBase.trace_dispatch:" " unknown debugging event: ",
+            repr(event),
+        )
+
         return self.trace_dispatch
 
     def set_trace(self, frame=None):
@@ -400,35 +397,35 @@
         If frame is not specified, debugging starts from caller's frame.
         Because of jump optimizations it's not possible to use sys.breakpoint()
         as last instruction in a function or method.
-        
+
         @param frame frame to start debugging from
         @type frame object
         """
         if frame is None:
             frame = sys._getframe().f_back  # Skip set_trace method
-        
+
         stopOnHandleCommand = self._dbgClient.handleJsonCommand.__code__
-        
+
         frame.f_trace = self.trace_dispatch
         while frame.f_back is not None:
             # stop at eric's debugger frame or a threading bootstrap
             if frame.f_back.f_code == stopOnHandleCommand:
                 frame.f_trace = self.trace_dispatch
                 break
-            
+
             frame = frame.f_back
-        
+
         self.stop_everywhere = True
         sys.settrace(self.trace_dispatch)
         sys.setprofile(self._dbgClient.callTraceEnabled)
-    
+
     def bootstrap(self, target, args, kwargs):
         """
         Public method to bootstrap a thread.
-        
+
         It wraps the call to the user function to enable tracing
         before hand.
-        
+
         @param target function which is called in the new created thread
         @type function pointer
         @param args arguments to pass to target
@@ -440,7 +437,7 @@
             # Because in the initial run method the "base debug" function is
             # set up, it's also valid for the threads afterwards.
             sys.settrace(self.trace_dispatch)
-            
+
             target(*args, **kwargs)
         except Exception:
             excinfo = sys.exc_info()
@@ -448,12 +445,13 @@
         finally:
             sys.settrace(None)
             sys.setprofile(None)
-    
-    def run(self, cmd, globalsDict=None, localsDict=None, debug=True,
-            closeSession=True):
+
+    def run(
+        self, cmd, globalsDict=None, localsDict=None, debug=True, closeSession=True
+    ):
         """
         Public method to start a given command under debugger control.
-        
+
         @param cmd command / code to execute under debugger control
         @type str or CodeType
         @param globalsDict dictionary of global variables for cmd
@@ -470,23 +468,24 @@
         """
         if globalsDict is None:
             import __main__
+
             globalsDict = __main__.__dict__
-        
+
         if localsDict is None:
             localsDict = globalsDict
-        
+
         if not isinstance(cmd, types.CodeType):
             cmd = compile(cmd, "<string>", "exec")
-        
+
         if debug:
             # First time the trace_dispatch function is called, a "base debug"
             # function has to be returned, which is called at every user code
             # function call. This is ensured by setting stop_everywhere.
             self.stop_everywhere = True
             sys.settrace(self.trace_dispatch)
-        
+
         try:
-            exec(cmd, globalsDict, localsDict)      # secok
+            exec(cmd, globalsDict, localsDict)  # secok
             atexit._run_exitfuncs()
             self._dbgClient.progTerminated(0, closeSession=closeSession)
             exitcode = 0
@@ -494,8 +493,9 @@
             atexit._run_exitfuncs()
             excinfo = sys.exc_info()
             exitcode, message = self.__extractSystemExitMessage(excinfo)
-            self._dbgClient.progTerminated(exitcode, message=message,
-                                           closeSession=closeSession)
+            self._dbgClient.progTerminated(
+                exitcode, message=message, closeSession=closeSession
+            )
         except Exception:
             excinfo = sys.exc_info()
             self.user_exception(excinfo, True)
@@ -508,7 +508,7 @@
     def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
         """
         Protected method to update the frame pointers.
-        
+
         @param stopframe the frame object where to stop
         @type frame object
         @param returnframe the frame object where to stop on a function return
@@ -523,7 +523,7 @@
         # stoplineno >= 0 means: stop at line >= the stoplineno
         # stoplineno -1 means: don't stop at all
         self.stoplineno = stoplineno
-        
+
         if returnframe is not None:
             # Ensure to be able to stop on the return frame
             returnframe.f_trace = self.trace_dispatch
@@ -532,14 +532,14 @@
     def set_continue(self, special):
         """
         Public method to stop only on next breakpoint.
-        
+
         @param special flag indicating a special continue operation
         @type bool
         """
         # Here we only set a new stop frame if it is a normal continue.
         if not special:
             self._set_stopinfo(None, None, -1)
-        
+
         # Disable tracing if not started in debug mode
         if not self._dbgClient.debugging:
             sys.settrace(None)
@@ -549,7 +549,7 @@
         """
         Public method to stop when the line with the lineno greater than the
         current one is reached or when returning from current frame.
-        
+
         @param frame reference to the frame object
         @type frame object
         @param lineno line number to continue to
@@ -572,7 +572,7 @@
     def set_next(self, frame):
         """
         Public method to stop on the next line in or below the given frame.
-        
+
         @param frame the frame object
         @type frame object
         """
@@ -582,16 +582,16 @@
     def set_return(self, frame):
         """
         Public method to stop when returning from the given frame.
-        
+
         @param frame the frame object
         @type frame object
         """
         self._set_stopinfo(None, frame.f_back)
-    
+
     def move_instruction_pointer(self, lineno):
         """
         Public method to move the instruction pointer to another line.
-        
+
         @param lineno new line number
         @type int
         """
@@ -605,7 +605,7 @@
     def set_quit(self):
         """
         Public method to quit.
-        
+
         Disables the trace functions and resets all frame pointer.
         """
         sys.setprofile(None)
@@ -613,11 +613,11 @@
         self.returnframe = None
         for debugThread in self._dbgClient.threads.values():
             debugThread.quitting = True
-    
+
     def fix_frame_filename(self, frame):
         """
         Public method used to fixup the filename for a given frame.
-        
+
         The logic employed here is that if a module was loaded
         from a .pyc file, then the correct .py to operate with
         should be in the same path as the .pyc. The reason this
@@ -628,22 +628,22 @@
         this can break debugging as the .pyc will refer to the .py
         on the original machine. Another case might be sharing
         code over a network... This logic deals with that.
-        
+
         @param frame the frame object
         @type frame object
         @return fixed up file name
         @rtype str
         """
         # get module name from __file__
-        fn = frame.f_globals.get('__file__')
+        fn = frame.f_globals.get("__file__")
         try:
             return self._fnCache[fn]
         except KeyError:
             if fn is None:
                 return frame.f_code.co_filename
-            
+
             absFilename = os.path.abspath(fn)
-            if absFilename.endswith(('.pyc', '.pyo', '.pyd')):
+            if absFilename.endswith((".pyc", ".pyo", ".pyd")):
                 fixedName = absFilename[:-1]
                 if not os.path.exists(fixedName):
                     fixedName = absFilename
@@ -657,7 +657,7 @@
         """
         Private method to check if the function / method has a line number
         which is a breakpoint.
-        
+
         @param frame the frame object
         @type frame object
         @return Flag indicating a function / method with breakpoint
@@ -665,20 +665,20 @@
         """
         try:
             return Breakpoint.breakInFrameCache[
-                frame.f_globals.get('__file__'),
-                frame.f_code.co_firstlineno]
+                frame.f_globals.get("__file__"), frame.f_code.co_firstlineno
+            ]
         except KeyError:
             filename = self.fix_frame_filename(frame)
             if filename not in Breakpoint.breakInFile:
                 Breakpoint.breakInFrameCache[
-                    frame.f_globals.get('__file__'),
-                    frame.f_code.co_firstlineno] = False
+                    frame.f_globals.get("__file__"), frame.f_code.co_firstlineno
+                ] = False
                 return False
             lineNo = frame.f_code.co_firstlineno
             lineNumbers = [lineNo]
-            
+
             co_lnotab = frame.f_code.co_lnotab[1::2]
-            
+
             # No need to handle special case if a lot of lines between
             # (e.g. closure), because the additional lines won't cause a bp
             for co_lno in co_lnotab:
@@ -686,25 +686,25 @@
                     lineNo -= 0x100
                 lineNo += co_lno
                 lineNumbers.append(lineNo)
-            
+
             for bp in Breakpoint.breakInFile[filename]:
                 if bp in lineNumbers:
                     Breakpoint.breakInFrameCache[
-                        frame.f_globals.get('__file__'),
-                        frame.f_code.co_firstlineno] = True
+                        frame.f_globals.get("__file__"), frame.f_code.co_firstlineno
+                    ] = True
                     return True
             Breakpoint.breakInFrameCache[
-                frame.f_globals.get('__file__'),
-                frame.f_code.co_firstlineno] = False
+                frame.f_globals.get("__file__"), frame.f_code.co_firstlineno
+            ] = False
             return False
-    
+
     def break_here(self, frame):
         """
         Public method reimplemented from bdb.py to fix the filename from the
         frame.
-        
+
         See fix_frame_filename for more info.
-        
+
         @param frame the frame object
         @type frame object
         @return flag indicating the break status
@@ -712,14 +712,13 @@
         """
         filename = self.fix_frame_filename(frame)
         if (filename, frame.f_lineno) in Breakpoint.breaks:
-            bp, flag = Breakpoint.effectiveBreak(
-                filename, frame.f_lineno, frame)
+            bp, flag = Breakpoint.effectiveBreak(filename, frame.f_lineno, frame)
             if bp:
                 # flag says ok to delete temp. bp
                 if flag and bp.temporary:
                     self.__do_clearBreak(filename, frame.f_lineno)
                 return True
-        
+
         if Watch.watches != []:
             bp, flag = Watch.effectiveWatch(frame)
             if bp:
@@ -727,13 +726,13 @@
                 if flag and bp.temporary:
                     self.__do_clearWatch(bp.cond)
                 return True
-        
+
         return False
 
     def __do_clearBreak(self, filename, lineno):
         """
         Private method called to clear a temporary breakpoint.
-        
+
         @param filename name of the file the bp belongs to
         @type str
         @param lineno linenumber of the bp
@@ -745,7 +744,7 @@
     def __do_clearWatch(self, cond):
         """
         Private method called to clear a temporary watch expression.
-        
+
         @param cond expression of the watch expression to be cleared
         @type str
         """
@@ -755,7 +754,7 @@
     def getStack(self, frame=None, applyTrace=False):
         """
         Public method to get the stack.
-        
+
         @param frame frame object to inspect
         @type frame object or list
         @param applyTrace flag to assign trace function to fr.f_trace
@@ -770,7 +769,7 @@
             fr, tb_lineno = frame.pop(0)
         else:
             fr = frame
-        
+
         stack = []
         while fr is not None:
             if applyTrace:
@@ -780,34 +779,38 @@
                 # but we had disabled tracing along the way via a None
                 # return from dispatch_call
                 fr.f_trace = self.trace_dispatch
-            
+
             fname = self._dbgClient.absPath(self.fix_frame_filename(fr))
             # Always show at least one stack frame, even if it's from eric.
             if stack and os.path.basename(fname).startswith(
-                ("DebugBase.py", "DebugClientBase.py",
-                 "ThreadExtension.py", "threading.py")
+                (
+                    "DebugBase.py",
+                    "DebugClientBase.py",
+                    "ThreadExtension.py",
+                    "threading.py",
+                )
             ):
                 break
-            
+
             fline = tb_lineno or fr.f_lineno
             ffunc = fr.f_code.co_name
-            
-            if ffunc == '?':
-                ffunc = ''
-            
+
+            if ffunc == "?":
+                ffunc = ""
+
             if ffunc and not ffunc.startswith("<"):
                 argInfo = getargvalues(fr)
                 try:
                     fargs = formatargvalues(
-                        argInfo.args, argInfo.varargs,
-                        argInfo.keywords, argInfo.locals)
+                        argInfo.args, argInfo.varargs, argInfo.keywords, argInfo.locals
+                    )
                 except Exception:
                     fargs = ""
             else:
                 fargs = ""
-            
+
             stack.append([fname, fline, ffunc, fargs])
-            
+
             # is it a stack frame or exception list?
             if type(frame) == list:
                 if frame != []:
@@ -816,53 +819,53 @@
                     fr = None
             else:
                 fr = fr.f_back
-        
+
         return stack
-    
+
     def user_line(self, frame):
         """
         Public method reimplemented to handle the program about to execute a
         particular line.
-        
+
         @param frame the frame object
         """
         # We never stop on line 0.
         if frame.f_lineno == 0:
             return
-        
+
         self.isBroken = True
         self.currentFrame = frame
         stack = self.getStack(frame, applyTrace=True)
-        
+
         self._dbgClient.lockClient()
         self._dbgClient.currentThread = self
         self._dbgClient.currentThreadExec = self
-        
+
         self._dbgClient.sendResponseLine(stack, self.name)
         self._dbgClient.eventLoop()
-        
+
         self.isBroken = False
         self._dbgClient.unlockClient()
-        
+
         self._dbgClient.dumpThreadList()
-    
+
     def user_exception(self, excinfo, unhandled=False):
         """
         Public method reimplemented to report an exception to the debug server.
-        
+
         @param excinfo details about the exception
         @type tuple(Exception, excval object, traceback frame object)
         @param unhandled flag indicating an uncaught exception
         @type bool
         """
         exctype, excval, exctb = excinfo
-        
-        if ((exctype in [GeneratorExit, StopIteration] and
-             unhandled is False) or
-                exctype == SystemExit):
+
+        if (
+            exctype in [GeneratorExit, StopIteration] and unhandled is False
+        ) or exctype == SystemExit:
             # ignore these
             return
-        
+
         if exctype in [SyntaxError, IndentationError]:
             try:
                 if type(excval) == tuple:
@@ -873,90 +876,94 @@
                     filename = excval.filename
                     lineno = excval.lineno
                     charno = excval.offset
-                
+
                 if filename is None:
                     realSyntaxError = False
                 else:
                     if charno is None:
                         charno = 0
-                    
+
                     filename = os.path.abspath(filename)
                     realSyntaxError = os.path.exists(filename)
-                
+
             except (AttributeError, ValueError):
                 message = ""
                 filename = ""
                 lineno = 0
                 charno = 0
                 realSyntaxError = True
-            
+
             if realSyntaxError:
                 self._dbgClient.sendSyntaxError(
-                    message, filename, lineno, charno, self.name)
+                    message, filename, lineno, charno, self.name
+                )
                 self._dbgClient.eventLoop()
                 return
-        
+
         self.skipFrames = 0
-        if (exctype == RuntimeError and
-                str(excval).startswith('maximum recursion depth exceeded') or
-                exctype == RecursionError):  # __IGNORE_WARNING__
-            excval = 'maximum recursion depth exceeded'
+        if (
+            exctype == RuntimeError
+            and str(excval).startswith("maximum recursion depth exceeded")
+            or exctype == RecursionError
+        ):  # __IGNORE_WARNING__
+            excval = "maximum recursion depth exceeded"
             depth = 0
             tb = exctb
             while tb:
                 tb = tb.tb_next
-                
-                if (tb and tb.tb_frame.f_code.co_name == 'trace_dispatch' and
-                        __file__.startswith(tb.tb_frame.f_code.co_filename)):
+
+                if (
+                    tb
+                    and tb.tb_frame.f_code.co_name == "trace_dispatch"
+                    and __file__.startswith(tb.tb_frame.f_code.co_filename)
+                ):
                     depth = 1
                 self.skipFrames += depth
-            
+
             # always 1 if running without debugger
             self.skipFrames = max(1, self.skipFrames)
-        
+
         exctype = self.__extractExceptionName(exctype)
-        
+
         if excval is None:
-            excval = ''
-        
+            excval = ""
+
         exctypetxt = (
-            "unhandled {0!s}".format(str(exctype))
-            if unhandled else
-            str(exctype)
+            "unhandled {0!s}".format(str(exctype)) if unhandled else str(exctype)
         )
         excvaltxt = str(excval)
-        
+
         # Don't step into libraries, which are used by our debugger methods
         if exctb is not None:
             self.stop_everywhere = False
-        
+
         self.isBroken = True
         self.isException = True
-        
+
         disassembly = None
         stack = []
         if exctb:
             frlist = self.__extract_stack(exctb)
             frlist.reverse()
             disassembly = self.__disassemble(frlist[0][0])
-            
+
             self.currentFrame = frlist[0][0]
-            stack = self.getStack(frlist[self.skipFrames:])
-        
+            stack = self.getStack(frlist[self.skipFrames :])
+
         self._dbgClient.lockClient()
         self._dbgClient.currentThread = self
         self._dbgClient.currentThreadExec = self
         self._dbgClient.sendException(exctypetxt, excvaltxt, stack, self.name)
         self._dbgClient.setDisassembly(disassembly)
         self._dbgClient.dumpThreadList()
-        
+
         if exctb is not None:
             # When polling kept enabled, it isn't possible to resume after an
             # unhandled exception without further user interaction.
             self._dbgClient.eventLoop(True)
-        
+
         self.skipFrames = 0
-        
+
         self.isBroken = False
         self.isException = False
         stop_everywhere = self.stop_everywhere
@@ -964,23 +971,23 @@
         self.eventPollFlag = False
         self._dbgClient.unlockClient()
         self.stop_everywhere = stop_everywhere
-        
+
         self._dbgClient.dumpThreadList()
-    
+
     def __extractExceptionName(self, exctype):
         """
         Private method to extract the exception name given the exception
         type object.
-        
+
         @param exctype type of the exception
         @return exception name (string)
         """
         return str(exctype).replace("<class '", "").replace("'>", "")
-    
+
     def __extract_stack(self, exctb):
         """
         Private member to return a list of stack frames.
-        
+
         @param exctb exception traceback
         @return list of stack frames
         """
@@ -995,7 +1002,7 @@
     def __disassemble(self, frame):
         """
         Private method to generate a disassembly of the given code object.
-        
+
         @param frame frame object to be disassembled
         @type code
         @return dictionary containing the disassembly information
@@ -1007,12 +1014,11 @@
             "firstlineno": co.co_firstlineno,
             "instructions": [],
         }
-        
+
         # 1. disassembly info
         for instr in dis.get_instructions(co):
             instrDict = {
-                "lineno":
-                    0 if instr.starts_line is None else instr.starts_line,
+                "lineno": 0 if instr.starts_line is None else instr.starts_line,
                 "isJumpTarget": instr.is_jump_target,
                 "offset": instr.offset,
                 "opname": instr.opname,
@@ -1020,7 +1026,7 @@
                 "argrepr": instr.argrepr,
             }
             disDict["instructions"].append(instrDict)
-        
+
         # 2. code info
         # Note: keep in sync with PythonDisViewer.__createCodeInfo()
         disDict["codeinfo"] = {
@@ -1043,13 +1049,13 @@
         except AttributeError:
             # does not exist prior to 3.8.0
             disDict["codeinfo"]["posonlyargcount"] = 0
-        
+
         return disDict
-    
+
     def __extractSystemExitMessage(self, excinfo):
         """
         Private method to get the SystemExit code and message.
-        
+
         @param excinfo details about the SystemExit exception
         @type tuple(Exception, excval object, traceback frame object)
         @return SystemExit code and message
@@ -1088,16 +1094,16 @@
         else:
             exitcode = 1
             message = str(excval)
-        
+
         return exitcode, message
-    
+
     def stop_here(self, frame):
         """
         Public method reimplemented to filter out debugger files.
-        
+
         Tracing is turned off for files that are part of the
         debugger that are called from the application being debugged.
-        
+
         @param frame the frame object
         @type frame object
         @return flag indicating whether the debugger should stop here
@@ -1105,7 +1111,7 @@
         """
         if self.__skipFrame(frame):
             return False
-        
+
         if frame is self.stopframe:
             if self.stoplineno == -1:
                 return False
@@ -1115,30 +1121,37 @@
     def tracePythonLibs(self, enable):
         """
         Public method to update the settings to trace into Python libraries.
-        
+
         @param enable flag to debug into Python libraries
         @type bool
         """
         pathsToSkip = list(self.pathsToSkip)
         # don't trace into Python library?
         if enable:
-            pathsToSkip = [x for x in pathsToSkip if not x.endswith(
-                ("site-packages", "dist-packages", self.lib))]
+            pathsToSkip = [
+                x
+                for x in pathsToSkip
+                if not x.endswith(("site-packages", "dist-packages", self.lib))
+            ]
         else:
             pathsToSkip.append(self.lib)
-            localLib = [x for x in sys.path if x.endswith(("site-packages",
-                        "dist-packages")) and not x.startswith(self.lib)]
+            localLib = [
+                x
+                for x in sys.path
+                if x.endswith(("site-packages", "dist-packages"))
+                and not x.startswith(self.lib)
+            ]
             pathsToSkip.extend(localLib)
-        
+
         self.pathsToSkip = tuple(set(pathsToSkip))
 
     def __skipFrame(self, frame):
         """
         Private method to filter out debugger files.
-        
+
         Tracing is turned off for files that are part of the
         debugger that are called from the application being debugged.
-        
+
         @param frame the frame object
         @type frame object
         @return flag indicating whether the debugger should skip this frame
--- a/src/eric7/DebugClients/Python/DebugClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,20 +17,22 @@
     """
     Class implementing the client side of the debugger.
     """
+
     def __init__(self):
         """
         Constructor
         """
         DebugClientBase.__init__(self)
-        
+
         DebugBase.__init__(self, self)
-        
+
         ThreadExtension.__init__(self)
-        
+
         self.__moduleLoader = ModuleLoader(self)
 
+
 # We are normally called by the debugger to execute directly.
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     debugClient = DebugClient()
     debugClient.main()
--- a/src/eric7/DebugClients/Python/DebugClientBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugClientBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,7 +24,7 @@
 
 import DebugClientCapabilities
 import DebugVariables
-from DebugBase import setRecursionLimit, printerr   # __IGNORE_WARNING__
+from DebugBase import setRecursionLimit, printerr  # __IGNORE_WARNING__
 from AsyncFile import AsyncFile, AsyncPendingWrite
 from DebugConfig import SpecialAttributes, NonExpandableTypes
 from FlexCompleter import Completer
@@ -42,9 +42,9 @@
 def DebugClientInput(prompt="", echo=True):
     """
     Replacement for the standard input() builtin.
-    
+
     This function works with the split debugger.
-    
+
     @param prompt prompt to be shown
     @type str
     @param echo flag indicating echoing of the input
@@ -57,14 +57,16 @@
     else:
         return DebugClientInstance.input(prompt, echo=echo)
 
+
 # Use our own input().
 try:
-    DebugClientOrigInput = __builtins__.__dict__['input']
-    __builtins__.__dict__['input'] = DebugClientInput
+    DebugClientOrigInput = __builtins__.__dict__["input"]
+    __builtins__.__dict__["input"] = DebugClientInput
 except (AttributeError, KeyError):
     import __main__
-    DebugClientOrigInput = __main__.__builtins__.__dict__['input']
-    __main__.__builtins__.__dict__['input'] = DebugClientInput
+
+    DebugClientOrigInput = __main__.__builtins__.__dict__["input"]
+    __main__.__builtins__.__dict__["input"] = DebugClientInput
 
 ###############################################################################
 
@@ -72,7 +74,7 @@
 def DebugClientClose(fd):
     """
     Replacement for the standard os.close(fd).
-    
+
     @param fd open file descriptor to be closed (integer)
     """
     if DebugClientInstance is None:
@@ -80,8 +82,9 @@
     else:
         DebugClientInstance.close(fd)
 
+
 # use our own close().
-if 'close' in dir(os):
+if "close" in dir(os):
     DebugClientOrigClose = os.close
     os.close = DebugClientClose
 
@@ -91,15 +94,16 @@
 def DebugClientSetRecursionLimit(limit):
     """
     Replacement for the standard sys.setrecursionlimit(limit).
-    
+
     @param limit recursion limit (integer)
     """
     rl = max(limit, 64)
     setRecursionLimit(rl)
     DebugClientOrigSetRecursionLimit(rl + 64)
 
+
 # use our own setrecursionlimit().
-if 'setrecursionlimit' in dir(sys):
+if "setrecursionlimit" in dir(sys):
     DebugClientOrigSetRecursionLimit = sys.setrecursionlimit
     sys.setrecursionlimit = DebugClientSetRecursionLimit
     DebugClientSetRecursionLimit(sys.getrecursionlimit())
@@ -113,7 +117,7 @@
 
     It provides access to the Python interpeter from a debugger running in
     another process.
-    
+
     The protocol between the debugger and the client is based on JSONRPC 2.0
     PDUs. Each one is sent on a single line, i.e. commands or responses are
     separated by a linefeed character.
@@ -121,50 +125,51 @@
     If the debugger closes the session there is no response from the client.
     The client may close the session at any time as a result of the script
     being debugged closing or crashing.
-    
+
     <b>Note</b>: This class is meant to be subclassed by individual
     DebugClient classes. Do not instantiate it directly.
     """
+
     clientCapabilities = DebugClientCapabilities.HasAll
-    
+
     Type2Indicators = {
         # Python types
-        'list': '[]',
-        'tuple': '()',
-        'dict': '{:}',                          # __IGNORE_WARNING_M613__
-        'set': '{}',                            # __IGNORE_WARNING_M613__
-        'frozenset': '{}',                      # __IGNORE_WARNING_M613__
-        'numpy.ndarray': '[ndarray]',           # __IGNORE_WARNING_M613__
-        'collections.abc.ItemsView': '[]',
-        'collections.abc.KeysView': '[]',
-        'collections.abc.ValuesView': '[]',
+        "list": "[]",
+        "tuple": "()",
+        "dict": "{:}",  # __IGNORE_WARNING_M613__
+        "set": "{}",  # __IGNORE_WARNING_M613__
+        "frozenset": "{}",  # __IGNORE_WARNING_M613__
+        "numpy.ndarray": "[ndarray]",  # __IGNORE_WARNING_M613__
+        "collections.abc.ItemsView": "[]",
+        "collections.abc.KeysView": "[]",
+        "collections.abc.ValuesView": "[]",
     }
-    
+
     def __init__(self):
         """
         Constructor
         """
         self.breakpoints = {}
         self.redirect = True
-        
+
         # special objects representing the main scripts thread and frame
         self.mainThread = self
         self.framenr = 0
-        
+
         # The context to run the debugged program in.
-        self.debugMod = types.ModuleType('__main__')
-        self.debugMod.__dict__['__builtins__'] = __builtins__
+        self.debugMod = types.ModuleType("__main__")
+        self.debugMod.__dict__["__builtins__"] = __builtins__
 
         # The list of complete lines to execute.
-        self.buffer = ''
-        
+        self.buffer = ""
+
         # The precompiled regexp to filter variables against
         self.globalsFilterObjects = None
         self.localsFilterObjects = None
 
         self._fncache = {}
         self.dircache = []
-        self.passive = False        # used to indicate the passive mode
+        self.passive = False  # used to indicate the passive mode
         self.running = None
         self.test = None
         self.debugging = False
@@ -175,58 +180,58 @@
         self.writestream = None
         self.errorstream = None
         self.pollingDisabled = False
-        
+
         self.__debuggerId = ""
-        
+
         self.callTraceEnabled = None
-        
+
         self.compile_command = codeop.CommandCompiler()
-        
+
         self.coding_re = re.compile(r"coding[:=]\s*([-\w_.]+)")
-        self.defaultCoding = 'utf-8'
+        self.defaultCoding = "utf-8"
         self.__coding = self.defaultCoding
         self.noencoding = False
-        
+
         self.startOptions = None
-    
+
     def getCoding(self):
         """
         Public method to return the current coding.
-        
+
         @return codec name (string)
         """
         return self.__coding
-    
+
     def __setCoding(self, filename):
         """
         Private method to set the coding used by a python file.
-        
+
         @param filename name of the file to inspect (string)
         """
         if self.noencoding:
             self.__coding = sys.getdefaultencoding()
         else:
-            default = 'utf-8'
+            default = "utf-8"
             try:
-                with open(filename, 'rb') as f:
+                with open(filename, "rb") as f:
                     # read the first and second line
                     text = f.readline()
                     text = "{0}{1}".format(text, f.readline())
             except OSError:
                 self.__coding = default
                 return
-            
+
             for line in text.splitlines():
                 m = self.coding_re.search(line)
                 if m:
                     self.__coding = m.group(1)
                     return
             self.__coding = default
-        
+
     def input(self, prompt, echo=True):
         """
         Public method to implement input() using the event loop.
-        
+
         @param prompt prompt to be shown
         @type str
         @param echo flag indicating echoing of the input
@@ -234,10 +239,13 @@
         @return the entered string
         @rtype str
         """
-        self.sendJsonCommand("RequestRaw", {
-            "prompt": prompt,
-            "echo": echo,
-        })
+        self.sendJsonCommand(
+            "RequestRaw",
+            {
+                "prompt": prompt,
+                "echo": echo,
+            },
+        )
         self.eventLoop(True)
         return self.rawLine
 
@@ -245,7 +253,7 @@
         """
         Public method to close the session with the debugger and optionally
         terminate.
-        
+
         @param terminate flag indicating to terminate (boolean)
         """
         with contextlib.suppress(Exception):
@@ -254,7 +262,7 @@
         self.debugging = False
         self.multiprocessSupport = False
         self.noDebugList = []
-        
+
         # make sure we close down our end of the socket
         # might be overkill as normally stdin, stdout and stderr
         # SHOULD be closed on exit, but it does not hurt to do it here
@@ -266,10 +274,10 @@
             # Ok, go away.
             sys.exit()
 
-    def __compileFileSource(self, filename, mode='exec'):
+    def __compileFileSource(self, filename, mode="exec"):
         """
         Private method to compile source code read from a file.
-        
+
         @param filename name of the source file
         @type str
         @param mode kind of code to be generated (exec or eval)
@@ -278,13 +286,13 @@
         """
         with codecs.open(filename, encoding=self.__coding) as fp:
             statement = fp.read()
-        
+
         return self.__compileCommand(statement, filename=filename, mode=mode)
-    
+
     def __compileCommand(self, statement, filename="<string>", mode="exec"):
         """
         Private method to compile source code.
-        
+
         @param statement source code string to be compiled
         @type str
         @param filename name of the source file
@@ -294,7 +302,7 @@
         @return compiled code object (None in case of errors)
         """
         try:
-            code = compile(statement + '\n', filename, mode)
+            code = compile(statement + "\n", filename, mode)
         except SyntaxError:
             exctype, excval, exctb = sys.exc_info()
             try:
@@ -304,53 +312,57 @@
                 charno = excval.offset
                 if charno is None:
                     charno = 0
-                
+
             except (AttributeError, ValueError):
                 message = ""
                 filename = ""
                 lineno = 0
                 charno = 0
-            
+
             self.sendSyntaxError(message, filename, lineno, charno, self.name)
             return None
-        
+
         return code
-    
+
     def handleJsonCommand(self, jsonStr):
         """
         Public method to handle a command serialized as a JSON string.
-        
+
         @param jsonStr string containing the command received from the IDE
         @type str
         """
-##        printerr(jsonStr)          ## debug       # __IGNORE_WARNING_M891__
-        
+        ##        printerr(jsonStr)          ## debug       # __IGNORE_WARNING_M891__
+
         try:
             commandDict = json.loads(jsonStr.strip())
         except (TypeError, ValueError) as err:
             printerr("Error handling command: " + jsonStr)
             printerr(str(err))
             return
-        
+
         method = commandDict["method"]
         params = commandDict["params"]
-        
+
         if method == "RequestVariables":
             self.__dumpVariables(
-                params["frameNumber"], params["scope"], params["filters"])
-        
+                params["frameNumber"], params["scope"], params["filters"]
+            )
+
         elif method == "RequestVariable":
             self.__dumpVariable(
-                params["variable"], params["frameNumber"],
-                params["scope"], params["filters"])
-        
+                params["variable"],
+                params["frameNumber"],
+                params["scope"],
+                params["filters"],
+            )
+
         elif method == "RequestStack":
             stack = self.mainThread.getStack()
             self.sendResponseLine(stack, self.mainThread.name)
-        
+
         elif method == "RequestThreadList":
             self.dumpThreadList()
-        
+
         elif method == "RequestThreadSet":
             if params["threadID"] == -1:
                 # -1 is indication for the main thread
@@ -364,49 +376,53 @@
                 self.setCurrentThread(threadId)
                 self.sendJsonCommand("ResponseThreadSet", {})
                 stack = self.currentThread.getStack()
-                self.sendJsonCommand("ResponseStack", {
-                    "stack": stack,
-                    "threadName": self.currentThread.name,
-                })
-        
+                self.sendJsonCommand(
+                    "ResponseStack",
+                    {
+                        "stack": stack,
+                        "threadName": self.currentThread.name,
+                    },
+                )
+
         elif method == "RequestDisassembly":
             if self.disassembly is not None:
-                self.sendJsonCommand("ResponseDisassembly", {
-                    "disassembly": self.disassembly
-                })
+                self.sendJsonCommand(
+                    "ResponseDisassembly", {"disassembly": self.disassembly}
+                )
             else:
-                self.sendJsonCommand("ResponseDisassembly", {
-                    "disassembly": {}
-                })
-        
+                self.sendJsonCommand("ResponseDisassembly", {"disassembly": {}})
+
         elif method == "RequestCapabilities":
             clientType = "Python3"
-            self.sendJsonCommand("ResponseCapabilities", {
-                "capabilities": self.__clientCapabilities(),
-                "clientType": clientType
-            })
-        
+            self.sendJsonCommand(
+                "ResponseCapabilities",
+                {"capabilities": self.__clientCapabilities(), "clientType": clientType},
+            )
+
         elif method == "RequestBanner":
-            self.sendJsonCommand("ResponseBanner", {
-                "version": "Python {0}".format(sys.version),
-                "platform": socket.gethostname(),
-            })
-        
+            self.sendJsonCommand(
+                "ResponseBanner",
+                {
+                    "version": "Python {0}".format(sys.version),
+                    "platform": socket.gethostname(),
+                },
+            )
+
         elif method == "RequestSetFilter":
             self.__generateFilterObjects(params["scope"], params["filter"])
-        
+
         elif method == "RequestCallTrace":
             if params["enable"]:
                 callTraceEnabled = self.profile
             else:
                 callTraceEnabled = None
-            
+
             if self.debugging:
                 sys.setprofile(callTraceEnabled)
             else:
                 # remember for later
                 self.callTraceEnabled = callTraceEnabled
-        
+
         elif method == "RequestEnvironment":
             for key, value in params["environment"].items():
                 if key.endswith("+"):
@@ -423,7 +439,7 @@
                         del os.environ[key]
                 else:
                     os.environ[key] = value
-        
+
         elif method == "RequestLoad":
             self._fncache = {}
             self.dircache = []
@@ -433,38 +449,39 @@
             sys.argv.append(params["filename"])
             sys.argv.extend(params["argv"])
             sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-            if params["workdir"] == '':
+            if params["workdir"] == "":
                 os.chdir(sys.path[1])
             else:
                 os.chdir(params["workdir"])
-            
+
             self.running = sys.argv[0]
             self.debugging = True
             self.multiprocessSupport = params["multiprocess"]
-            
+
             self.threads.clear()
             self.attachThread(mainThread=True)
-            
+
             # set the system exception handling function to ensure, that
             # we report on all unhandled exceptions
             sys.excepthook = self.__unhandled_exception
             self.__interceptSignals()
-            
+
             # clear all old breakpoints, they'll get set after we have
             # started
             Breakpoint.clear_all_breaks()
             Watch.clear_all_watches()
-            
+
             self.mainThread.tracePythonLibs(params["traceInterpreter"])
-            
+
             # This will eventually enter a local event loop.
-            self.debugMod.__dict__['__file__'] = self.running
-            sys.modules['__main__'] = self.debugMod
+            self.debugMod.__dict__["__file__"] = self.running
+            sys.modules["__main__"] = self.debugMod
             code = self.__compileFileSource(self.running)
             if code:
                 sys.setprofile(self.callTraceEnabled)
-                self.mainThread.run(code, self.debugMod.__dict__, debug=True,
-                                    closeSession=False)
+                self.mainThread.run(
+                    code, self.debugMod.__dict__, debug=True, closeSession=False
+                )
 
         elif method == "RequestRun":
             self.disassembly = None
@@ -473,79 +490,43 @@
             sys.argv.append(params["filename"])
             sys.argv.extend(params["argv"])
             sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-            if params["workdir"] == '':
+            if params["workdir"] == "":
                 os.chdir(sys.path[1])
             else:
                 os.chdir(params["workdir"])
 
             self.running = sys.argv[0]
             self.botframe = None
-            
+
             self.threads.clear()
             self.attachThread(mainThread=True)
-            
+
             # set the system exception handling function to ensure, that
             # we report on all unhandled exceptions
             sys.excepthook = self.__unhandled_exception
             self.__interceptSignals()
-            
+
             self.mainThread.tracePythonLibs(False)
-            
-            self.debugMod.__dict__['__file__'] = sys.argv[0]
-            sys.modules['__main__'] = self.debugMod
+
+            self.debugMod.__dict__["__file__"] = sys.argv[0]
+            sys.modules["__main__"] = self.debugMod
             res = 0
             code = self.__compileFileSource(self.running)
             if code:
-                self.mainThread.run(code, self.debugMod.__dict__, debug=False,
-                                    closeSession=False)
+                self.mainThread.run(
+                    code, self.debugMod.__dict__, debug=False, closeSession=False
+                )
 
         elif method == "RequestCoverage":
             from coverage import Coverage
+
             self.disassembly = None
             sys.argv = []
             self.__setCoding(params["filename"])
             sys.argv.append(params["filename"])
             sys.argv.extend(params["argv"])
             sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-            if params["workdir"] == '':
-                os.chdir(sys.path[1])
-            else:
-                os.chdir(params["workdir"])
-            
-            # set the system exception handling function to ensure, that
-            # we report on all unhandled exceptions
-            sys.excepthook = self.__unhandled_exception
-            self.__interceptSignals()
-            
-            # generate a coverage object
-            self.cover = Coverage(
-                auto_data=True,
-                data_file="{0}.coverage".format(
-                    os.path.splitext(sys.argv[0])[0]))
-            
-            if params["erase"]:
-                self.cover.erase()
-            sys.modules['__main__'] = self.debugMod
-            self.debugMod.__dict__['__file__'] = sys.argv[0]
-            code = self.__compileFileSource(sys.argv[0])
-            if code:
-                self.running = sys.argv[0]
-                self.cover.start()
-                self.mainThread.run(code, self.debugMod.__dict__, debug=False,
-                                    closeSession=False)
-                self.cover.stop()
-                self.cover.save()
-        
-        elif method == "RequestProfile":
-            sys.setprofile(None)
-            import PyProfile
-            self.disassembly = None
-            sys.argv = []
-            self.__setCoding(params["filename"])
-            sys.argv.append(params["filename"])
-            sys.argv.extend(params["argv"])
-            sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-            if params["workdir"] == '':
+            if params["workdir"] == "":
                 os.chdir(sys.path[1])
             else:
                 os.chdir(params["workdir"])
@@ -554,20 +535,60 @@
             # we report on all unhandled exceptions
             sys.excepthook = self.__unhandled_exception
             self.__interceptSignals()
-            
+
+            # generate a coverage object
+            self.cover = Coverage(
+                auto_data=True,
+                data_file="{0}.coverage".format(os.path.splitext(sys.argv[0])[0]),
+            )
+
+            if params["erase"]:
+                self.cover.erase()
+            sys.modules["__main__"] = self.debugMod
+            self.debugMod.__dict__["__file__"] = sys.argv[0]
+            code = self.__compileFileSource(sys.argv[0])
+            if code:
+                self.running = sys.argv[0]
+                self.cover.start()
+                self.mainThread.run(
+                    code, self.debugMod.__dict__, debug=False, closeSession=False
+                )
+                self.cover.stop()
+                self.cover.save()
+
+        elif method == "RequestProfile":
+            sys.setprofile(None)
+            import PyProfile
+
+            self.disassembly = None
+            sys.argv = []
+            self.__setCoding(params["filename"])
+            sys.argv.append(params["filename"])
+            sys.argv.extend(params["argv"])
+            sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
+            if params["workdir"] == "":
+                os.chdir(sys.path[1])
+            else:
+                os.chdir(params["workdir"])
+
+            # set the system exception handling function to ensure, that
+            # we report on all unhandled exceptions
+            sys.excepthook = self.__unhandled_exception
+            self.__interceptSignals()
+
             # generate a profile object
             self.prof = PyProfile.PyProfile(sys.argv[0])
-            
+
             if params["erase"]:
                 self.prof.erase()
-            self.debugMod.__dict__['__file__'] = sys.argv[0]
-            sys.modules['__main__'] = self.debugMod
-            script = ''
+            self.debugMod.__dict__["__file__"] = sys.argv[0]
+            sys.modules["__main__"] = self.debugMod
+            script = ""
             with codecs.open(sys.argv[0], encoding=self.__coding) as fp:
                 script = fp.read()
-            if script and not script.endswith('\n'):
-                script += '\n'
-            
+            if script and not script.endswith("\n"):
+                script += "\n"
+
             if script:
                 self.running = sys.argv[0]
                 res = 0
@@ -580,13 +601,13 @@
                 except Exception:
                     excinfo = sys.exc_info()
                     self.__unhandled_exception(*excinfo)
-                
+
                 self.prof.save()
                 self.progTerminated(res, closeSession=False)
-        
+
         elif method == "ExecuteStatement":
             if self.buffer:
-                self.buffer = self.buffer + '\n' + params["statement"]
+                self.buffer = self.buffer + "\n" + params["statement"]
             else:
                 self.buffer = params["statement"]
 
@@ -594,23 +615,28 @@
                 code = self.compile_command(self.buffer, self.readstream.name)
             except (OverflowError, SyntaxError, ValueError):
                 # Report the exception
-                sys.last_type, sys.last_value, sys.last_traceback = (
-                    sys.exc_info())
-                self.sendJsonCommand("ClientOutput", {
-                    "text": "".join(traceback.format_exception_only(
-                        sys.last_type, sys.last_value))
-                })
-                self.buffer = ''
+                sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info()
+                self.sendJsonCommand(
+                    "ClientOutput",
+                    {
+                        "text": "".join(
+                            traceback.format_exception_only(
+                                sys.last_type, sys.last_value
+                            )
+                        )
+                    },
+                )
+                self.buffer = ""
             else:
                 if code is None:
                     self.sendJsonCommand("ResponseContinue", {})
                     return
                 else:
-                    self.buffer = ''
+                    self.buffer = ""
 
                     try:
                         if self.running is None:
-                            exec(code, self.debugMod.__dict__)      # secok
+                            exec(code, self.debugMod.__dict__)  # secok
                         else:
                             if self.currentThread is None:
                                 # program has terminated
@@ -630,31 +656,29 @@
                                         cf = cf.f_back
                                         frmnr -= 1
                                     _globals = cf.f_globals
-                                    _locals = (
-                                        self.currentThread.getFrameLocals(
-                                            self.framenr))
+                                    _locals = self.currentThread.getFrameLocals(
+                                        self.framenr
+                                    )
                             # transfer all locals into a new globals
                             # to emulate Python scoping rules
                             _updatedGlobals = {}
                             _updatedGlobals.update(_globals)
                             _updatedGlobals.update(_locals)
-                            #- reset sys.stdout to our redirector
-                            #- (unconditionally)
+                            # - reset sys.stdout to our redirector
+                            # - (unconditionally)
                             if "sys" in _globals:
                                 __stdout = _updatedGlobals["sys"].stdout
-                                _updatedGlobals["sys"].stdout = (
-                                    self.writestream
-                                )
-                                exec(code, _updatedGlobals, _locals)    # secok
+                                _updatedGlobals["sys"].stdout = self.writestream
+                                exec(code, _updatedGlobals, _locals)  # secok
                                 _updatedGlobals["sys"].stdout = __stdout
                             elif "sys" in _locals:
                                 __stdout = _locals["sys"].stdout
                                 _locals["sys"].stdout = self.writestream
-                                exec(code, _updatedGlobals, _locals)    # secok
+                                exec(code, _updatedGlobals, _locals)  # secok
                                 _locals["sys"].stdout = __stdout
                             else:
-                                exec(code, _updatedGlobals, _locals)    # secok
-                            
+                                exec(code, _updatedGlobals, _locals)  # secok
+
                             self.currentThread.storeFrameLocals(self.framenr)
                     except SystemExit as exc:
                         self.progTerminated(exc.code)
@@ -670,19 +694,17 @@
                             del tblist[:1]
                             tlist = traceback.format_list(tblist)
                             if tlist:
-                                tlist.insert(
-                                    0, "Traceback (innermost last):\n")
-                                tlist.extend(traceback.format_exception_only(
-                                    exc_type, exc_value))
+                                tlist.insert(0, "Traceback (innermost last):\n")
+                                tlist.extend(
+                                    traceback.format_exception_only(exc_type, exc_value)
+                                )
                         finally:
                             tblist = exc_tb = None
 
-                        self.sendJsonCommand("ClientOutput", {
-                            "text": "".join(tlist)
-                        })
-            
+                        self.sendJsonCommand("ClientOutput", {"text": "".join(tlist)})
+
             self.sendJsonCommand("ResponseOK", {})
-        
+
         elif method == "RequestStep":
             self.currentThreadExec.step(True)
             self.eventExit = True
@@ -690,59 +712,62 @@
         elif method == "RequestStepOver":
             self.currentThreadExec.step(False)
             self.eventExit = True
-        
+
         elif method == "RequestStepOut":
             self.currentThreadExec.stepOut()
             self.eventExit = True
-        
+
         elif method == "RequestStepQuit":
             if self.passive:
                 self.progTerminated(42)
             else:
                 self.set_quit()
                 self.eventExit = True
-        
+
         elif method == "RequestMoveIP":
             newLine = params["newLine"]
             self.currentThreadExec.move_instruction_pointer(newLine)
-        
+
         elif method == "RequestContinue":
             self.currentThreadExec.go(params["special"])
             self.eventExit = True
-        
+
         elif method == "RequestContinueUntil":
             newLine = params["newLine"]
             self.currentThreadExec.set_until(lineno=newLine)
             self.eventExit = True
-        
+
         elif method == "RawInput":
             # If we are handling raw mode input then break out of the current
             # event loop.
             self.rawLine = params["input"]
             self.eventExit = True
-        
+
         elif method == "RequestBreakpoint":
             if params["setBreakpoint"]:
-                if params["condition"] in ['None', '']:
+                if params["condition"] in ["None", ""]:
                     cond = None
                 elif params["condition"] is not None:
                     try:
-                        cond = compile(params["condition"], '<string>', 'eval')
+                        cond = compile(params["condition"], "<string>", "eval")
                     except SyntaxError:
-                        self.sendJsonCommand("ResponseBPConditionError", {
-                            "filename": params["filename"],
-                            "line": params["line"],
-                        })
+                        self.sendJsonCommand(
+                            "ResponseBPConditionError",
+                            {
+                                "filename": params["filename"],
+                                "line": params["line"],
+                            },
+                        )
                         return
                 else:
                     cond = None
-                
+
                 Breakpoint(
-                    params["filename"], params["line"], params["temporary"],
-                    cond)
+                    params["filename"], params["line"], params["temporary"], cond
+                )
             else:
                 Breakpoint.clear_break(params["filename"], params["line"])
-        
+
         elif method == "RequestBreakpointEnable":
             bp = Breakpoint.get_break(params["filename"], params["line"])
             if bp is not None:
@@ -750,34 +775,34 @@
                     bp.enable()
                 else:
                     bp.disable()
-        
+
         elif method == "RequestBreakpointIgnore":
             bp = Breakpoint.get_break(params["filename"], params["line"])
             if bp is not None:
                 bp.ignore = params["count"]
-        
+
         elif method == "RequestWatch":
             if params["setWatch"]:
-                if params["condition"].endswith(
-                        ('??created??', '??changed??')):
+                if params["condition"].endswith(("??created??", "??changed??")):
                     compiledCond, flag = params["condition"].split()
                 else:
                     compiledCond = params["condition"]
-                    flag = ''
-                
+                    flag = ""
+
                 try:
-                    compiledCond = compile(compiledCond, '<string>', 'eval')
+                    compiledCond = compile(compiledCond, "<string>", "eval")
                 except SyntaxError:
-                    self.sendJsonCommand("ResponseWatchConditionError", {
-                        "condition": params["condition"],
-                    })
+                    self.sendJsonCommand(
+                        "ResponseWatchConditionError",
+                        {
+                            "condition": params["condition"],
+                        },
+                    )
                     return
-                Watch(
-                    params["condition"], compiledCond, flag,
-                    params["temporary"])
+                Watch(params["condition"], compiledCond, flag, params["temporary"])
             else:
                 Watch.clear_watch(params["condition"])
-        
+
         elif method == "RequestWatchEnable":
             wp = Watch.get_watch(params["condition"])
             if wp is not None:
@@ -785,35 +810,35 @@
                     wp.enable()
                 else:
                     wp.disable()
-        
+
         elif method == "RequestWatchIgnore":
             wp = Watch.get_watch(params["condition"])
             if wp is not None:
                 wp.ignore = params["count"]
-        
+
         elif method == "RequestShutdown":
             self.sessionClose()
-        
+
         elif method == "RequestSetNoDebugList":
             self.noDebugList = params["noDebug"][:]
-        
+
         elif method == "RequestCompletion":
             self.__completionList(params["text"])
-    
+
     def setDisassembly(self, disassembly):
         """
         Public method to store a disassembly of the code object raising an
         exception.
-        
+
         @param disassembly dictionary containing the disassembly information
         @type dict
         """
         self.disassembly = disassembly
-    
+
     def sendJsonCommand(self, method, params):
         """
         Public method to send a single command or response to the IDE.
-        
+
         @param method command or response command name to be sent
         @type str
         @param params dictionary of named parameters for the command or
@@ -823,55 +848,60 @@
         # send debugger ID with all responses
         if "debuggerId" not in params:
             params["debuggerId"] = self.__debuggerId
-        
+
         cmd = prepareJsonCommand(method, params)
-        
+
         self.writestream.write_p(cmd)
         self.writestream.flush()
-    
+
     def sendClearTemporaryBreakpoint(self, filename, lineno):
         """
         Public method to signal the deletion of a temporary breakpoint.
-        
+
         @param filename name of the file the bp belongs to
         @type str
         @param lineno linenumber of the bp
         @type int
         """
-        self.sendJsonCommand("ResponseClearBreakpoint", {
-            "filename": filename,
-            "line": lineno
-        })
-    
+        self.sendJsonCommand(
+            "ResponseClearBreakpoint", {"filename": filename, "line": lineno}
+        )
+
     def sendClearTemporaryWatch(self, condition):
         """
         Public method to signal the deletion of a temporary watch expression.
-        
+
         @param condition condition of the watch expression to be cleared
         @type str
         """
-        self.sendJsonCommand("ResponseClearWatch", {
-            "condition": condition,
-        })
-    
+        self.sendJsonCommand(
+            "ResponseClearWatch",
+            {
+                "condition": condition,
+            },
+        )
+
     def sendResponseLine(self, stack, threadName):
         """
         Public method to send the current call stack.
-        
+
         @param stack call stack
         @type list
         @param threadName name of the thread sending the event
         @type str
         """
-        self.sendJsonCommand("ResponseLine", {
-            "stack": stack,
-            "threadName": threadName,
-        })
-    
+        self.sendJsonCommand(
+            "ResponseLine",
+            {
+                "stack": stack,
+                "threadName": threadName,
+            },
+        )
+
     def sendCallTrace(self, event, fromInfo, toInfo):
         """
         Public method to send a call trace entry.
-        
+
         @param event trace event (call or return)
         @type str
         @param fromInfo dictionary containing the origin info
@@ -881,17 +911,19 @@
         @type dict with 'filename', 'linenumber' and 'codename'
             as keys
         """
-        self.sendJsonCommand("CallTrace", {
-            "event": event[0],
-            "from": fromInfo,
-            "to": toInfo,
-        })
-    
-    def sendException(self, exceptionType, exceptionMessage, stack,
-                      threadName):
+        self.sendJsonCommand(
+            "CallTrace",
+            {
+                "event": event[0],
+                "from": fromInfo,
+                "to": toInfo,
+            },
+        )
+
+    def sendException(self, exceptionType, exceptionMessage, stack, threadName):
         """
         Public method to send information for an exception.
-        
+
         @param exceptionType type of exception raised
         @type str
         @param exceptionMessage message of the exception
@@ -901,17 +933,20 @@
         @param threadName name of the thread sending the event
         @type str
         """
-        self.sendJsonCommand("ResponseException", {
-            "type": exceptionType,
-            "message": exceptionMessage,
-            "stack": stack,
-            "threadName": threadName,
-        })
-    
+        self.sendJsonCommand(
+            "ResponseException",
+            {
+                "type": exceptionType,
+                "message": exceptionMessage,
+                "stack": stack,
+                "threadName": threadName,
+            },
+        )
+
     def sendSyntaxError(self, message, filename, lineno, charno, threadName):
         """
         Public method to send information for a syntax error.
-        
+
         @param message syntax error message
         @type str
         @param filename name of the faulty file
@@ -923,64 +958,70 @@
         @param threadName name of the thread sending the event
         @type str
         """
-        self.sendJsonCommand("ResponseSyntax", {
-            "message": message,
-            "filename": filename,
-            "linenumber": lineno,
-            "characternumber": charno,
-            "threadName": threadName,
-        })
-    
+        self.sendJsonCommand(
+            "ResponseSyntax",
+            {
+                "message": message,
+                "filename": filename,
+                "linenumber": lineno,
+                "characternumber": charno,
+                "threadName": threadName,
+            },
+        )
+
     def sendPassiveStartup(self, filename, exceptions):
         """
         Public method to send the passive start information.
-        
+
         @param filename name of the script
         @type str
         @param exceptions flag to enable exception reporting of the IDE
         @type bool
         """
-        self.sendJsonCommand("PassiveStartup", {
-            "filename": filename,
-            "exceptions": exceptions,
-        })
-    
+        self.sendJsonCommand(
+            "PassiveStartup",
+            {
+                "filename": filename,
+                "exceptions": exceptions,
+            },
+        )
+
     def sendDebuggerId(self, debuggerId):
         """
         Public method to send the debug client id.
-        
+
         @param debuggerId id of this debug client instance (made up of
             hostname and process ID)
         @type str
         """
         # debugger ID is added automatically by sendJsonCommand
         self.sendJsonCommand("DebuggerId", {})
-    
+
     def __clientCapabilities(self):
         """
         Private method to determine the clients capabilities.
-        
+
         @return client capabilities (integer)
         """
         try:
-            import PyProfile    # __IGNORE_WARNING__
+            import PyProfile  # __IGNORE_WARNING__
+
             with contextlib.suppress(KeyError):
-                del sys.modules['PyProfile']
+                del sys.modules["PyProfile"]
             return self.clientCapabilities
         except ImportError:
-            return (
-                self.clientCapabilities & ~DebugClientCapabilities.HasProfiler)
-    
+            return self.clientCapabilities & ~DebugClientCapabilities.HasProfiler
+
     def readReady(self, stream):
         """
         Public method called when there is data ready to be read.
-        
+
         @param stream file like object that has data to be read
         @return flag indicating an error condition
         @rtype bool
         """
         error = False
-        
+
         self.lockClient()
         try:
             command = stream.readCommand()
@@ -993,18 +1034,18 @@
             self.sessionClose()
         else:
             self.handleJsonCommand(command)
-        
+
         return error
 
     def writeReady(self, stream):
         """
         Public method called when we are ready to write data.
-        
+
         @param stream file like object that has data to be written
         """
         stream.write_p("")
         stream.flush()
-    
+
     def __interact(self):
         """
         Private method to interact with the debugger.
@@ -1021,7 +1062,7 @@
     def eventLoop(self, disablePolling=False):
         """
         Public method implementing our event loop.
-        
+
         @param disablePolling flag indicating to enter an event loop with
             polling disabled (boolean)
         """
@@ -1034,18 +1075,18 @@
 
             if self.writestream.nWriteErrors > self.writestream.MAX_TRIES:
                 break
-            
+
             if AsyncPendingWrite(self.writestream):
                 wrdy.append(self.writestream)
 
             if AsyncPendingWrite(self.errorstream):
                 wrdy.append(self.errorstream)
-            
+
             try:
                 rrdy, wrdy, xrdy = select.select([self.readstream], wrdy, [])
             except (KeyboardInterrupt, OSError):
                 selectErrors += 1
-                if selectErrors <= 10:      # arbitrarily selected
+                if selectErrors <= 10:  # arbitrarily selected
                     # just carry on
                     continue
                 else:
@@ -1054,10 +1095,10 @@
             except ValueError:
                 # the client socket might already be closed, i.e. its fd is -1
                 break
-            
+
             # reset the select error counter
             selectErrors = 0
-            
+
             if self.readstream in rrdy:
                 error = self.readReady(self.readstream)
                 if error:
@@ -1078,14 +1119,14 @@
         """
         if self.pollingDisabled:
             return
-        
+
         wrdy = []
         if AsyncPendingWrite(self.writestream):
             wrdy.append(self.writestream)
 
         if AsyncPendingWrite(self.errorstream):
             wrdy.append(self.errorstream)
-        
+
         # immediate return if nothing is ready.
         try:
             rrdy, wrdy, xrdy = select.select([self.readstream], wrdy, [], 0)
@@ -1100,16 +1141,15 @@
 
         if self.errorstream in wrdy:
             self.writeReady(self.errorstream)
-    
-    def connectDebugger(self, port, remoteAddress=None, redirect=True,
-                        name=""):
+
+    def connectDebugger(self, port, remoteAddress=None, redirect=True, name=""):
         """
         Public method to establish a session with the debugger.
-        
+
         It opens a network connection to the debugger, connects it to stdin,
         stdout and stderr and saves these file objects in case the application
         being debugged redirects them itself.
-        
+
         @param port the port number to connect to
         @type int
         @param remoteAddress the network address of the debug server host
@@ -1125,59 +1165,59 @@
         elif "@@i" in remoteAddress:
             remoteAddress = remoteAddress.split("@@i")[0]
         sock = socket.create_connection((remoteAddress, port))
-        
+
         stdinName = sys.stdin.name
         # Special case if in a multiprocessing.Process
         if isinstance(stdinName, int):
-            stdinName = '<stdin>'
-        
+            stdinName = "<stdin>"
+
         self.readstream = AsyncFile(sock, sys.stdin.mode, stdinName)
         self.writestream = AsyncFile(sock, sys.stdout.mode, sys.stdout.name)
         self.errorstream = AsyncFile(sock, sys.stderr.mode, sys.stderr.name)
-        
+
         if redirect:
             sys.stdin = self.readstream
             sys.stdout = self.writestream
             sys.stderr = self.errorstream
         self.redirect = redirect
-        
+
         # attach to the main thread here
         self.attachThread(mainThread=True)
-        
+
         if not name:
             name = "main"
         self.__debuggerId = "{0}/{1}/{2}".format(
             socket.gethostname(), os.getpid(), name
         )
-        
+
         self.sendDebuggerId(self.__debuggerId)
 
     def __unhandled_exception(self, exctype, excval, exctb):
         """
         Private method called to report an uncaught exception.
-        
+
         @param exctype the type of the exception
         @param excval data about the exception
         @param exctb traceback for the exception
         """
         self.mainThread.user_exception((exctype, excval, exctb), True)
-    
+
     def __interceptSignals(self):
         """
         Private method to intercept common signals.
         """
         for signum in [
-            signal.SIGABRT,                 # abnormal termination
-            signal.SIGFPE,                  # floating point exception
-            signal.SIGILL,                  # illegal instruction
-            signal.SIGSEGV,                 # segmentation violation
+            signal.SIGABRT,  # abnormal termination
+            signal.SIGFPE,  # floating point exception
+            signal.SIGILL,  # illegal instruction
+            signal.SIGSEGV,  # segmentation violation
         ]:
             signal.signal(signum, self.__signalHandler)
-    
+
     def __signalHandler(self, signalNumber, stackFrame):
         """
         Private method to handle signals.
-        
+
         @param signalNumber number of the signal to be handled
         @type int
         @param stackFrame current stack frame
@@ -1193,41 +1233,44 @@
             message = "Segmentation Violation"
         else:
             message = "Unknown Signal '{0}'".format(signalNumber)
-        
+
         filename = self.absPath(stackFrame)
-        
+
         linenr = stackFrame.f_lineno
         ffunc = stackFrame.f_code.co_name
-        
-        if ffunc == '?':
-            ffunc = ''
-        
+
+        if ffunc == "?":
+            ffunc = ""
+
         if ffunc and not ffunc.startswith("<"):
             argInfo = getargvalues(stackFrame)
             try:
                 fargs = formatargvalues(
-                    argInfo.args, argInfo.varargs,
-                    argInfo.keywords, argInfo.locals)
+                    argInfo.args, argInfo.varargs, argInfo.keywords, argInfo.locals
+                )
             except Exception:
                 fargs = ""
         else:
             fargs = ""
-        
-        self.sendJsonCommand("ResponseSignal", {
-            "message": message,
-            "filename": filename,
-            "linenumber": linenr,
-            "function": ffunc,
-            "arguments": fargs,
-        })
-    
+
+        self.sendJsonCommand(
+            "ResponseSignal",
+            {
+                "message": message,
+                "filename": filename,
+                "linenumber": linenr,
+                "function": ffunc,
+                "arguments": fargs,
+            },
+        )
+
     def absPath(self, fn):
         """
         Public method to convert a filename to an absolute name.
 
         sys.path is used as a set of possible prefixes. The name stays
         relative if a file could not be found.
-        
+
         @param fn filename (string)
         @return the converted filename (string)
         """
@@ -1254,18 +1297,18 @@
         for p in self.dircache:
             afn = os.path.abspath(os.path.join(p, fn))
             nafn = os.path.normcase(afn)
-            
+
             if os.path.exists(nafn):
                 self._fncache[fn] = afn
                 return afn
-        
+
         # Nothing found.
         return fn
 
     def getRunning(self):
         """
         Public method to return the main script we are currently running.
-        
+
         @return flag indicating a running debug session (boolean)
         """
         return self.running
@@ -1273,7 +1316,7 @@
     def progTerminated(self, status, message="", closeSession=True):
         """
         Public method to tell the debugger that the program has terminated.
-        
+
         @param status return status
         @type int
         @param message status message
@@ -1288,27 +1331,30 @@
             status = 1
         if message is None:
             message = ""
-        
+
         if self.running:
             self.set_quit()
             program = self.running
             self.running = None
-            self.sendJsonCommand("ResponseExit", {
-                "status": status,
-                "message": message,
-                "program": program,
-            })
-        
+            self.sendJsonCommand(
+                "ResponseExit",
+                {
+                    "status": status,
+                    "message": message,
+                    "program": program,
+                },
+            )
+
         # reset coding
         self.__coding = self.defaultCoding
-        
+
         if closeSession:
             self.sessionClose(False)
 
     def __dumpVariables(self, frmnr, scope, filterList):
         """
         Private method to return the variables of a frame to the debug server.
-        
+
         @param frmnr distance of frame reported on. 0 is the current frame
         @type int
         @param scope 1 to report global variables, 0 for local variables
@@ -1318,18 +1364,18 @@
         """
         if self.currentThread is None:
             return
-        
+
         self.resolverCache = [{}, {}]
         frmnr += self.currentThread.skipFrames
         if scope == 0:
             self.framenr = frmnr
-        
+
         f = self.currentThread.getCurrentFrame()
-        
+
         while f is not None and frmnr > 0:
             f = f.f_back
             frmnr -= 1
-        
+
         if f is None:
             if scope:
                 varDict = self.debugMod.__dict__
@@ -1341,22 +1387,28 @@
             scope = -1
         else:
             varDict = f.f_locals
-        
+
         # Update known types list
         DebugVariables.updateTypeMap()
-        
-        varlist = [] if scope < 0 else self.__formatVariablesList(
-            varDict.items(), scope, filterList)
-        
-        self.sendJsonCommand("ResponseVariables", {
-            "scope": scope,
-            "variables": varlist,
-        })
-    
+
+        varlist = (
+            []
+            if scope < 0
+            else self.__formatVariablesList(varDict.items(), scope, filterList)
+        )
+
+        self.sendJsonCommand(
+            "ResponseVariables",
+            {
+                "scope": scope,
+                "variables": varlist,
+            },
+        )
+
     def __dumpVariable(self, var, frmnr, scope, filterList):
         """
         Private method to return the variables of a frame to the debug server.
-        
+
         @param var list encoded name of the requested variable
         @type list of str
         @param frmnr distance of frame reported on. 0 is the current frame
@@ -1368,14 +1420,14 @@
         """
         if self.currentThread is None:
             return
-        
+
         frmnr += self.currentThread.skipFrames
         f = self.currentThread.getCurrentFrame()
-        
+
         while f is not None and frmnr > 0:
             f = f.f_back
             frmnr -= 1
-        
+
         if f is None:
             if scope:
                 varDict = self.debugMod.__dict__
@@ -1387,17 +1439,16 @@
             scope = -1
         else:
             varDict = f.f_locals
-        
+
         varlist = []
-        
+
         # fast path if variable was looked up before (see elif)
         if scope != -1 and str(var) in self.resolverCache[scope]:
             varGen = self.resolverCache[scope][str(var)]
             idx, varDict = next(varGen)
             if idx != -2:  # more elements available
                 var.insert(0, idx)
-                varlist = self.__formatVariablesList(
-                    varDict, scope, filterList)
+                varlist = self.__formatVariablesList(varDict, scope, filterList)
         elif scope != -1:
             variable = varDict
             # Lookup the wanted attribute
@@ -1407,10 +1458,10 @@
                     variable = resolver.resolve(variable, attribute)
                     if variable is None:
                         break
-                    
+
                 else:
                     break
-            
+
             idx = -3  # Requested variable doesn't exist anymore
             # If found, get the details of attribute
             if variable is not None:
@@ -1419,30 +1470,32 @@
                     varGen = resolver.getVariableList(variable)
                     # cache for next lookup
                     self.resolverCache[scope][str(var)] = varGen
-                    
+
                     idx, varDict = next(varGen)
                     if idx != -2:  # more elements available
-                        varlist = self.__formatVariablesList(
-                            varDict, scope, filterList)
-            
+                        varlist = self.__formatVariablesList(varDict, scope, filterList)
+
             var.insert(0, idx)
-        
-        self.sendJsonCommand("ResponseVariable", {
-            "scope": scope,
-            "variable": var,
-            "variables": varlist,
-        })
-    
+
+        self.sendJsonCommand(
+            "ResponseVariable",
+            {
+                "scope": scope,
+                "variable": var,
+                "variables": varlist,
+            },
+        )
+
     def __formatVariablesList(self, variables, scope, filterList=None):
         """
         Private method to produce a formated variables list.
-        
+
         The dictionary passed in to it is scanned. Variables are
         only added to the list, if their type is not contained
         in the filter list and their name doesn't match any of the filter
         expressions. The formated variables list (a list of tuples of 3
         values) is returned.
-        
+
         @param variables variables list to be processed
         @type list of tuple of (str, Any) or (str, str, Any)
         @param scope 1 to filter using the globals filter, 0 using the locals
@@ -1460,14 +1513,12 @@
         @rtype list of tuple of (str, str, str)
         """
         filterList = set(filterList or [])
-        
+
         varlist = []
         patternFilterObjects = (
-            self.globalsFilterObjects
-            if scope else
-            self.localsFilterObjects
+            self.globalsFilterObjects if scope else self.localsFilterObjects
         )
-        
+
         for variabel in variables:
             valtype = None
             rvalue = None
@@ -1477,33 +1528,30 @@
                 # Special case for some Qt variables, where the real type is
                 # overwritten
                 key, valtype, rvalue = variabel
-            
+
             # filter based on the filter pattern
             if patternFilterObjects and patternFilterObjects.match(str(key)):
                 continue
-            
+
             # filter hidden attributes (filter #0)
-            if '__' in filterList and str(key)[:2] == '__':
+            if "__" in filterList and str(key)[:2] == "__":
                 continue
-            
+
             hasChildren = False
             # special handling for '__builtins__' (it's way too big)
-            if key == '__builtins__':
-                rvalue = '<module builtins (built-in)>'
-                valtype = 'module'
+            if key == "__builtins__":
+                rvalue = "<module builtins (built-in)>"
+                valtype = "module"
                 if valtype in filterList:
                     continue
-            elif (
-                (key in SpecialAttributes and
-                 "special_attributes" in filterList) or
-                (key == "__hash__" and
-                 "builtin_function_or_method" in filterList)
+            elif (key in SpecialAttributes and "special_attributes" in filterList) or (
+                key == "__hash__" and "builtin_function_or_method" in filterList
             ):
                 continue
             elif valtype is None:
                 # valtypestr, e.g. class 'PyQt6.QtCore.QPoint'
                 valtypestr = str(type(value))
-                _, valtype = valtypestr.split(' ', 1)
+                _, valtype = valtypestr.split(" ", 1)
                 # valtype is the real type, e.g. PyQt6.QtCore.QPoint
                 # valtype_filter is used for filtering, where the base class is
                 # also important
@@ -1517,38 +1565,43 @@
                         valtype = "class"
                 elif valtype == "method-wrapper":
                     valtype = valtype_filter = "builtin_function_or_method"
-                
+
                 # Don't process variables which types are on filter list
                 if (
-                    valtype_filter in filterList or
-                    (valtype_filter in ("sip.enumtype", "sip.wrappertype") and
-                     'class' in filterList) or
-                    (valtype_filter in (
-                        "sip.methoddescriptor", "method_descriptor") and
-                     'method' in filterList) or
-                    (valtype_filter in ("numpy.ndarray", "array.array") and
-                     'list' in filterList) or
-                    (valtype_filter == "django.MultiValueDict" and
-                     'dict' in filterList) or
-                    'instance' in filterList
+                    valtype_filter in filterList
+                    or (
+                        valtype_filter in ("sip.enumtype", "sip.wrappertype")
+                        and "class" in filterList
+                    )
+                    or (
+                        valtype_filter in ("sip.methoddescriptor", "method_descriptor")
+                        and "method" in filterList
+                    )
+                    or (
+                        valtype_filter in ("numpy.ndarray", "array.array")
+                        and "list" in filterList
+                    )
+                    or (
+                        valtype_filter == "django.MultiValueDict"
+                        and "dict" in filterList
+                    )
+                    or "instance" in filterList
                 ):
                     continue
-            
+
             length = -2
-            indicator = ''
-            
-            if valtype == 'str':
+            indicator = ""
+
+            if valtype == "str":
                 rvalue = repr(value)
                 length = len(rvalue)
             elif valtype in NonExpandableTypes:
                 rvalue = repr(value)
-            
+
             if rvalue is not None:
-                varlist.append(
-                    (key, indicator, valtype, hasChildren, length, rvalue)
-                )
+                varlist.append((key, indicator, valtype, hasChildren, length, rvalue))
                 continue
-            
+
             try:
                 for dtype in DebugVariables._ArrayTypes:
                     if isinstance(value, dtype):
@@ -1556,104 +1609,105 @@
                             length = len(value)
                         except TypeError:
                             length = -1  # Uninitialized array
-                        
+
                         dtype = str(dtype)[8:-2]
                         # Standard array type indicators
-                        indicator = self.Type2Indicators.get(dtype, '')
-                        
+                        indicator = self.Type2Indicators.get(dtype, "")
+
                         # Special handling of some array types
-                        if valtype == 'array.array':
-                            indicator = '[<{0}>]'.format(value.typecode)
-                        elif valtype == 'collections.defaultdict':
+                        if valtype == "array.array":
+                            indicator = "[<{0}>]".format(value.typecode)
+                        elif valtype == "collections.defaultdict":
                             if value.default_factory is None:
                                 def_factory = "None"
                             else:
                                 def_factory = value.default_factory.__name__
-                            indicator = '{{:<{0}>}}'.format(def_factory)
+                            indicator = "{{:<{0}>}}".format(def_factory)
                         elif valtype == "numpy.ndarray" and length > -1:
                             length = "x".join(str(x) for x in value.shape)
                         elif valtype.endswith(".MultiValueDict"):
-                            indicator = "{:}"   # __IGNORE_WARNING__
+                            indicator = "{:}"  # __IGNORE_WARNING__
                             valtype = "django.MultiValueDict"  # shortened type
                         break
                 else:
                     rvalue = repr(value)
-                
+
                 hasChildren = True
             except Exception:
-                rvalue = ''
-        
-            varlist.append(
-                (key, indicator, valtype, hasChildren, length, rvalue)
-            )
-        
+                rvalue = ""
+
+            varlist.append((key, indicator, valtype, hasChildren, length, rvalue))
+
         return varlist
-    
+
     def __generateFilterObjects(self, scope, filterString):
         """
         Private slot to convert a filter string to a list of filter objects.
-        
+
         @param scope 1 to generate filter for global variables, 0 for local
             variables (int)
         @param filterString string of filter patterns separated by ';'
         """
         patternFilterObjects = None
         if filterString.strip():
-            pattern = filterString.replace(';', '|')
+            pattern = filterString.replace(";", "|")
             with contextlib.suppress(re.error):
                 patternFilterObjects = re.compile(pattern)
-        
+
         if scope:
             self.globalsFilterObjects = patternFilterObjects
         else:
             self.localsFilterObjects = patternFilterObjects
-    
+
     def __completionList(self, text):
         """
         Private slot to handle the request for a commandline completion list.
-        
+
         @param text the text to be completed (string)
         """
-        completerDelims = ' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>/?'
-        
+        completerDelims = " \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"
+
         completions = set()
         # find position of last delim character
         pos = -1
         while pos >= -len(text):
             if text[pos] in completerDelims:
                 if pos == -1:
-                    text = ''
+                    text = ""
                 else:
-                    text = text[pos + 1:]
+                    text = text[pos + 1 :]
                 break
             pos -= 1
-        
+
         # Get local and global completions
         with contextlib.suppress(AttributeError):
             localdict = self.currentThread.getFrameLocals(self.framenr)
             localCompleter = Completer(localdict).complete
             self.__getCompletionList(text, localCompleter, completions)
-        
+
         cf = self.currentThread.getCurrentFrame()
         frmnr = self.framenr
         while cf is not None and frmnr > 0:
             cf = cf.f_back
             frmnr -= 1
-        
+
         globaldict = self.debugMod.__dict__ if cf is None else cf.f_globals
-        
+
         globalCompleter = Completer(globaldict).complete
         self.__getCompletionList(text, globalCompleter, completions)
-        
-        self.sendJsonCommand("ResponseCompletion", {
-            "completions": list(completions),
-            "text": text,
-        })
+
+        self.sendJsonCommand(
+            "ResponseCompletion",
+            {
+                "completions": list(completions),
+                "text": text,
+            },
+        )
 
     def __getCompletionList(self, text, completer, completions):
         """
         Private method to create a completions list.
-        
+
         @param text text to complete (string)
         @param completer completer method
         @param completions set where to add new completions strings (set)
@@ -1670,13 +1724,22 @@
                 comp = completer(text, state)
             except Exception:
                 comp = None
-    
-    def startDebugger(self, filename=None, host=None, port=None,
-                      enableTrace=True, exceptions=True, tracePython=False,
-                      redirect=True, passive=True, multiprocessSupport=False):
+
+    def startDebugger(
+        self,
+        filename=None,
+        host=None,
+        port=None,
+        enableTrace=True,
+        exceptions=True,
+        tracePython=False,
+        redirect=True,
+        passive=True,
+        multiprocessSupport=False,
+    ):
         """
         Public method used to start the remote debugger.
-        
+
         @param filename the program to be debugged
         @type str
         @param host hostname of the debug server
@@ -1699,10 +1762,10 @@
         @type bool
         """
         if host is None:
-            host = os.getenv('ERICHOST', 'localhost')
+            host = os.getenv("ERICHOST", "localhost")
         if port is None:
-            port = os.getenv('ERICPORT', 42424)
-        
+            port = os.getenv("ERICPORT", 42424)
+
         remoteAddress = self.__resolveHost(host)
         name = os.path.basename(filename) if filename is not None else ""
         self.connectDebugger(port, remoteAddress, redirect, name=name)
@@ -1717,32 +1780,41 @@
             self.__setCoding(self.running)
         self.passive = passive
         self.__interact()
-        
+
         # setup the debugger variables
         self._fncache = {}
         self.dircache = []
         self.debugging = True
-        
+
         self.attachThread(mainThread=True)
         self.mainThread.tracePythonLibs(tracePython)
-        
+
         # set the system exception handling function to ensure, that
         # we report on all unhandled exceptions
         sys.excepthook = self.__unhandled_exception
         self.__interceptSignals()
-        
+
         # now start debugging
         if enableTrace:
             self.mainThread.set_trace()
-    
-    def startProgInDebugger(self, progargs, wd='', host=None,
-                            port=None, exceptions=True, tracePython=False,
-                            redirect=True, passive=True,
-                            multiprocessSupport=False, codeStr="",
-                            scriptModule=""):
+
+    def startProgInDebugger(
+        self,
+        progargs,
+        wd="",
+        host=None,
+        port=None,
+        exceptions=True,
+        tracePython=False,
+        redirect=True,
+        passive=True,
+        multiprocessSupport=False,
+        codeStr="",
+        scriptModule="",
+    ):
         """
         Public method used to start the remote debugger.
-        
+
         @param progargs commandline for the program to be debugged
             (list of strings)
         @param wd working directory for the program execution (string)
@@ -1767,10 +1839,10 @@
         @rtype int
         """
         if host is None:
-            host = os.getenv('ERICHOST', 'localhost')
+            host = os.getenv("ERICHOST", "localhost")
         if port is None:
-            port = os.getenv('ERICPORT', 42424)
-        
+            port = os.getenv("ERICPORT", 42424)
+
         remoteAddress = self.__resolveHost(host)
         if progargs:
             if not progargs[0].startswith("-"):
@@ -1782,7 +1854,7 @@
         else:
             name = "debug_client_code"
         self.connectDebugger(port, remoteAddress, redirect, name=name)
-        
+
         self._fncache = {}
         self.dircache = []
         if codeStr:
@@ -1792,7 +1864,7 @@
             sys.argv = progargs[:]
             sys.argv[0] = os.path.abspath(sys.argv[0])
             sys.path = self.__getSysPath(os.path.dirname(sys.argv[0]))
-            if wd == '':
+            if wd == "":
                 os.chdir(sys.path[1])
             else:
                 os.chdir(wd)
@@ -1800,50 +1872,53 @@
             self.__setCoding(self.running)
         self.debugging = True
         self.multiprocessSupport = multiprocessSupport
-        
+
         self.passive = passive
         if passive:
             self.sendPassiveStartup(self.running, exceptions)
-        
+
         self.attachThread(mainThread=True)
         self.mainThread.tracePythonLibs(tracePython)
-        
+
         # set the system exception handling function to ensure, that
         # we report on all unhandled exceptions
         sys.excepthook = self.__unhandled_exception
         self.__interceptSignals()
-        
+
         # This will eventually enter a local event loop.
-        self.debugMod.__dict__['__file__'] = self.running
-        sys.modules['__main__'] = self.debugMod
+        self.debugMod.__dict__["__file__"] = self.running
+        sys.modules["__main__"] = self.debugMod
         if codeStr:
             code = self.__compileCommand(codeStr)
         elif scriptModule:
             import runpy
+
             modName, modSpec, code = runpy._get_module_details(scriptModule)
             self.running = code.co_filename
             self.debugMod.__dict__.clear()
-            self.debugMod.__dict__.update({
-                "__name__": "__main__",
-                "__file__": self.running,
-                "__package__": modSpec.parent,
-                "__loader__": modSpec.loader,
-                "__spec__": modSpec,
-                "__builtins__": __builtins__,
-            })
+            self.debugMod.__dict__.update(
+                {
+                    "__name__": "__main__",
+                    "__file__": self.running,
+                    "__package__": modSpec.parent,
+                    "__loader__": modSpec.loader,
+                    "__spec__": modSpec,
+                    "__builtins__": __builtins__,
+                }
+            )
         else:
             code = self.__compileFileSource(self.running)
         res = (
             self.mainThread.run(code, self.debugMod.__dict__, debug=True)
-            if code else
-            42        # should not happen
+            if code
+            else 42  # should not happen
         )
         return res
 
     def run_call(self, scriptname, func, *args):
         """
         Public method used to start the remote debugger and call a function.
-        
+
         @param scriptname name of the script to be debugged (string)
         @param func function to be called
         @param *args arguments being passed to func
@@ -1853,41 +1928,40 @@
         res = self.mainThread.runcall(func, *args)
         self.progTerminated(res, closeSession=False)
         return res
-    
+
     def __resolveHost(self, host):
         """
         Private method to resolve a hostname to an IP address.
-        
+
         @param host hostname of the debug server (string)
         @return IP address (string)
         """
         try:
             host, version = host.split("@@")
         except ValueError:
-            version = 'v4'
-        
+            version = "v4"
+
         family = (
             0
-            if version.startswith("i") else
-            (socket.AF_INET if version == 'v4' else socket.AF_INET6)
+            if version.startswith("i")
+            else (socket.AF_INET if version == "v4" else socket.AF_INET6)
         )
-        
+
         with contextlib.suppress(OSError):
-            addrinfo = socket.getaddrinfo(
-                host, None, family, socket.SOCK_STREAM)
+            addrinfo = socket.getaddrinfo(host, None, family, socket.SOCK_STREAM)
             return addrinfo[0][4][0]
-        
+
         return None
-    
+
     def main(self):
         """
         Public method implementing the main method.
         """
-        if '--' in sys.argv:
+        if "--" in sys.argv:
             args = sys.argv[1:]
             host = None
             port = None
-            wd = ''
+            wd = ""
             tracePython = False
             exceptions = True
             redirect = True
@@ -1896,48 +1970,48 @@
             codeStr = ""
             scriptModule = ""
             while args[0]:
-                if args[0] == '-h':
+                if args[0] == "-h":
                     host = args[1]
                     del args[0]
                     del args[0]
-                elif args[0] == '-p':
+                elif args[0] == "-p":
                     port = int(args[1])
                     del args[0]
                     del args[0]
-                elif args[0] == '-w':
+                elif args[0] == "-w":
                     wd = args[1]
                     del args[0]
                     del args[0]
-                elif args[0] == '-t':
+                elif args[0] == "-t":
                     tracePython = True
                     del args[0]
-                elif args[0] == '-e':
+                elif args[0] == "-e":
                     exceptions = False
                     del args[0]
-                elif args[0] == '-n':
+                elif args[0] == "-n":
                     redirect = False
                     del args[0]
-                elif args[0] == '--no-encoding':
+                elif args[0] == "--no-encoding":
                     self.noencoding = True
                     del args[0]
-                elif args[0] == '--no-passive':
+                elif args[0] == "--no-passive":
                     passive = False
                     del args[0]
-                elif args[0] == '--multiprocess':
+                elif args[0] == "--multiprocess":
                     multiprocess = True
                     del args[0]
-                elif args[0] in ('-c', '--code'):
+                elif args[0] in ("-c", "--code"):
                     codeStr = args[1]
                     del args[0]
                     del args[0]
-                elif args[0] in ('-m', '--module'):
+                elif args[0] in ("-m", "--module"):
                     scriptModule = args[1]
                     del args[0]
                     del args[0]
-                elif args[0] == '--':
+                elif args[0] == "--":
                     del args[0]
                     break
-                else:   # unknown option
+                else:  # unknown option
                     del args[0]
             if not args:
                 print("No program given. Aborting!")
@@ -1948,36 +2022,48 @@
             else:
                 # Store options in case a new Python process is created
                 self.startOptions = (
-                    wd, host, port, exceptions, tracePython, redirect,
+                    wd,
+                    host,
+                    port,
+                    exceptions,
+                    tracePython,
+                    redirect,
                     self.noencoding,
                 )
                 if not self.noencoding:
                     self.__coding = self.defaultCoding
                 patchNewProcessFunctions(multiprocess, self)
                 res = self.startProgInDebugger(
-                    args, wd, host, port, exceptions=exceptions,
-                    tracePython=tracePython, redirect=redirect,
-                    passive=passive, multiprocessSupport=multiprocess,
-                    codeStr=codeStr, scriptModule=scriptModule,
+                    args,
+                    wd,
+                    host,
+                    port,
+                    exceptions=exceptions,
+                    tracePython=tracePython,
+                    redirect=redirect,
+                    passive=passive,
+                    multiprocessSupport=multiprocess,
+                    codeStr=codeStr,
+                    scriptModule=scriptModule,
                 )
                 sys.exit(res)
         else:
-            if sys.argv[1] == '--no-encoding':
+            if sys.argv[1] == "--no-encoding":
                 self.noencoding = True
                 del sys.argv[1]
-            
-            if sys.argv[1] == '--multiprocess':
+
+            if sys.argv[1] == "--multiprocess":
                 self.multiprocessSupport = True
                 del sys.argv[1]
-            
-            if sys.argv[1] == '':
+
+            if sys.argv[1] == "":
                 del sys.argv[1]
-            
+
             try:
                 port = int(sys.argv[1])
             except (ValueError, IndexError):
                 port = -1
-            
+
             if sys.argv[2] == "True":
                 redirect = True
             elif sys.argv[2] == "False":
@@ -1987,22 +2073,27 @@
                     redirect = int(sys.argv[2])
                 except (ValueError, IndexError):
                     redirect = True
-            
+
             ipOrHost = sys.argv[3]
-            if ':' in ipOrHost or ipOrHost[0] in '0123456789':
+            if ":" in ipOrHost or ipOrHost[0] in "0123456789":
                 # IPv6 address or IPv4 address
                 remoteAddress = ipOrHost
             else:
                 remoteAddress = self.__resolveHost(ipOrHost)
-            
-            sys.argv = ['']
-            if '' not in sys.path:
-                sys.path.insert(0, '')
-            
+
+            sys.argv = [""]
+            if "" not in sys.path:
+                sys.path.insert(0, "")
+
             if port >= 0:
                 # Store options in case a new Python process is created
                 self.startOptions = (
-                    '', remoteAddress, port, True, False, redirect,
+                    "",
+                    remoteAddress,
+                    port,
+                    True,
+                    False,
+                    redirect,
                     self.noencoding,
                 )
                 if not self.noencoding:
@@ -2013,47 +2104,51 @@
             else:
                 print("No network port given. Aborting...")
                 # __IGNORE_WARNING_M801__
-    
+
     def close(self, fd):
         """
         Public method implementing a close method as a replacement for
         os.close().
-        
+
         It prevents the debugger connections from being closed.
-        
+
         @param fd file descriptor to be closed (integer)
         """
-        if fd in [self.readstream.fileno(), self.writestream.fileno(),
-                  self.errorstream.fileno()]:
+        if fd in [
+            self.readstream.fileno(),
+            self.writestream.fileno(),
+            self.errorstream.fileno(),
+        ]:
             return
-        
+
         DebugClientOrigClose(fd)
-    
+
     def __getSysPath(self, firstEntry):
         """
         Private slot to calculate a path list including the PYTHONPATH
         environment variable.
-        
+
         @param firstEntry entry to be put first in sys.path (string)
         @return path list for use as sys.path (list of strings)
         """
-        sysPath = [path for path in os.environ.get("PYTHONPATH", "")
-                   .split(os.pathsep)
-                   if path not in sys.path] + sys.path[:]
+        sysPath = [
+            path
+            for path in os.environ.get("PYTHONPATH", "").split(os.pathsep)
+            if path not in sys.path
+        ] + sys.path[:]
         if "" in sysPath:
             sysPath.remove("")
         sysPath.insert(0, firstEntry)
-        sysPath.insert(0, '')
+        sysPath.insert(0, "")
         return sysPath
-    
+
     def skipMultiProcessDebugging(self, scriptName):
         """
         Public method to check, if the given script is eligible for debugging.
-        
+
         @param scriptName name of the script to check
         @type str
         @return flag indicating eligibility
         @rtype bool
         """
-        return any(fnmatch.fnmatch(scriptName, pattern)
-                   for pattern in self.noDebugList)
+        return any(fnmatch.fnmatch(scriptName, pattern) for pattern in self.noDebugList)
--- a/src/eric7/DebugClients/Python/DebugClientCapabilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugClientCapabilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,5 +14,6 @@
 HasCompleter = 0x0010
 HasShell = 0x0020
 
-HasAll = (HasDebugger | HasInterpreter | HasProfiler | HasCoverage |
-          HasCompleter | HasShell)
+HasAll = (
+    HasDebugger | HasInterpreter | HasProfiler | HasCoverage | HasCompleter | HasShell
+)
--- a/src/eric7/DebugClients/Python/DebugConfig.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugConfig.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,27 +9,66 @@
 
 
 SpecialAttributes = (
-    "__bases__", "__class__", "__dict__", "__doc__", "__mro__", "__name__",
+    "__bases__",
+    "__class__",
+    "__dict__",
+    "__doc__",
+    "__mro__",
+    "__name__",
     "__qualname__",
 )
 
 BatchSize = 200
-ConfigQtNames = (
-    'PyQt5.', 'PyQt6.', 'PySide2.', 'PySide6.', 'Shiboken.EnumType'
-)
+ConfigQtNames = ("PyQt5.", "PyQt6.", "PySide2.", "PySide6.", "Shiboken.EnumType")
 
 ConfigKnownQtTypes = (
-    '.QByteArray', '.QPoint', '.QPointF', '.QLabel', '.QPushButton',
-    '.QRect', '.QRectF', '.QSize', '.QSizeF', '.QColor', '.QDate', '.QTime',
-    '.QDateTime', '.QDir', '.QFile', '.QFont', '.QUrl', '.QModelIndex',
-    '.QRegExp', '.QRegularExpression', '.QAction', '.QKeySequence',
-    '.QDomAttr', '.QDomCharacterData', '.QDomComment', '.QDomDocument',
-    '.QDomElement', '.QDomText', '.QHostAddress', '.EnumType',
+    ".QByteArray",
+    ".QPoint",
+    ".QPointF",
+    ".QLabel",
+    ".QPushButton",
+    ".QRect",
+    ".QRectF",
+    ".QSize",
+    ".QSizeF",
+    ".QColor",
+    ".QDate",
+    ".QTime",
+    ".QDateTime",
+    ".QDir",
+    ".QFile",
+    ".QFont",
+    ".QUrl",
+    ".QModelIndex",
+    ".QRegExp",
+    ".QRegularExpression",
+    ".QAction",
+    ".QKeySequence",
+    ".QDomAttr",
+    ".QDomCharacterData",
+    ".QDomComment",
+    ".QDomDocument",
+    ".QDomElement",
+    ".QDomText",
+    ".QHostAddress",
+    ".EnumType",
 )
 
 NonExpandableTypes = (
-    'int', 'float', 'bool', 'NoneType', 'bytes', 'function', 'object',
-    'builtin_function_or_method', 'classmethod_descriptor', 'weakref',
-    'wrapper_descriptor', 'method_descriptor', 'property', 'method',
-    'getset_descriptor', 'member_descriptor',
+    "int",
+    "float",
+    "bool",
+    "NoneType",
+    "bytes",
+    "function",
+    "object",
+    "builtin_function_or_method",
+    "classmethod_descriptor",
+    "weakref",
+    "wrapper_descriptor",
+    "method_descriptor",
+    "property",
+    "method",
+    "getset_descriptor",
+    "member_descriptor",
 )
--- a/src/eric7/DebugClients/Python/DebugUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,14 +33,14 @@
     for k, v in COMPILER_FLAG_NAMES.items():
         mod_dict["CO_" + v] = k
 
-ArgInfo = namedtuple('ArgInfo', 'args varargs keywords locals')
+ArgInfo = namedtuple("ArgInfo", "args varargs keywords locals")
 
 
 def getargvalues(frame):
     """
     Function to get information about arguments passed into a
     particular frame.
-    
+
     @param frame reference to a frame object to be processed
     @type frame
     @return tuple of four things, where 'args' is a list of the argument names,
@@ -49,7 +49,7 @@
     @exception TypeError raised if the input parameter is not a frame object
     """
     if not isframe(frame):
-        raise TypeError('{0!r} is not a frame object'.format(frame))
+        raise TypeError("{0!r} is not a frame object".format(frame))
 
     args, varargs, kwonlyargs, varkw = _getfullargs(frame.f_code)
     return ArgInfo(args + kwonlyargs, varargs, varkw, frame.f_locals)
@@ -59,7 +59,7 @@
     """
     Protected function to get information about the arguments accepted
     by a code object.
-    
+
     @param co reference to a code object to be processed
     @type code
     @return tuple of four things, where 'args' and 'kwonlyargs' are lists of
@@ -68,13 +68,13 @@
     @exception TypeError raised if the input parameter is not a code object
     """
     if not iscode(co):
-        raise TypeError('{0!r} is not a code object'.format(co))
+        raise TypeError("{0!r} is not a code object".format(co))
 
     nargs = co.co_argcount
     names = co.co_varnames
     nkwargs = co.co_kwonlyargcount
     args = list(names[:nargs])
-    kwonlyargs = list(names[nargs:nargs + nkwargs])
+    kwonlyargs = list(names[nargs : nargs + nkwargs])
 
     nargs += nkwargs
     varargs = None
@@ -87,15 +87,20 @@
     return args, varargs, kwonlyargs, varkw
 
 
-def formatargvalues(args, varargs, varkw, localsDict,
-                    formatarg=str,
-                    formatvarargs=lambda name: '*' + name,
-                    formatvarkw=lambda name: '**' + name,
-                    formatvalue=lambda value: '=' + repr(value)):
+def formatargvalues(
+    args,
+    varargs,
+    varkw,
+    localsDict,
+    formatarg=str,
+    formatvarargs=lambda name: "*" + name,
+    formatvarkw=lambda name: "**" + name,
+    formatvalue=lambda value: "=" + repr(value),
+):
     """
     Function to format an argument spec from the 4 values returned
     by getargvalues.
-    
+
     @param args list of argument names
     @type list of str
     @param varargs name of the variable arguments
@@ -123,9 +128,9 @@
         specs.append(formatvarargs(varargs) + formatvalue(localsDict[varargs]))
     if varkw:
         specs.append(formatvarkw(varkw) + formatvalue(localsDict[varkw]))
-    argvalues = '(' + ', '.join(specs) + ')'
-    if '__return__' in localsDict:
-        argvalues += " -> " + formatvalue(localsDict['__return__'])
+    argvalues = "(" + ", ".join(specs) + ")"
+    if "__return__" in localsDict:
+        argvalues += " -> " + formatvalue(localsDict["__return__"])
     return argvalues
 
 
@@ -133,7 +138,7 @@
     """
     Function to prepare a single command or response for transmission to
     the IDE.
-    
+
     @param method command or response name to be sent
     @type str
     @param params dictionary of named parameters for the command or response
@@ -146,7 +151,8 @@
         "method": method,
         "params": params,
     }
-    return json.dumps(commandDict) + '\n'
+    return json.dumps(commandDict) + "\n"
+
 
 ###########################################################################
 ## Things related to monkey patching below
@@ -159,7 +165,7 @@
 def isWindowsPlatform():
     """
     Function to check, if this is a Windows platform.
-    
+
     @return flag indicating Windows platform
     @rtype bool
     """
@@ -169,7 +175,7 @@
 def isExecutable(program):
     """
     Function to check, if the given program is executable.
-    
+
     @param program program path to be checked
     @type str
     @return flag indicating an executable program
@@ -181,7 +187,7 @@
 def startsWithShebang(program):
     """
     Function to check, if the given program start with a Shebang line.
-    
+
     @param program program path to be checked
     @type str
     @return flag indicating an existing and valid shebang line
@@ -193,11 +199,9 @@
                 for line in f:
                     line = line.strip()
                     if line:
-                        for name in PYTHON_NAMES:   # __IGNORE_WARNING_Y110__
-                            if (
-                                line.startswith(
-                                    '#!/usr/bin/env {0}'.format(name)) or
-                                (line.startswith('#!') and name in line)
+                        for name in PYTHON_NAMES:  # __IGNORE_WARNING_Y110__
+                            if line.startswith("#!/usr/bin/env {0}".format(name)) or (
+                                line.startswith("#!") and name in line
                             ):
                                 return True
                         return False
@@ -214,7 +218,7 @@
     """
     Function to check, if the given program is a Python interpreter or
     program.
-    
+
     @param program program to be checked
     @type str
     @return flag indicating a Python interpreter or program
@@ -222,22 +226,20 @@
     """
     if not program:
         return False
-    
+
     prog = os.path.basename(program).lower()
     if any(pyname in prog for pyname in PYTHON_NAMES):
         return True
-    
+
     return (
-        not isWindowsPlatform() and
-        isExecutable(program) and
-        startsWithShebang(program)
+        not isWindowsPlatform() and isExecutable(program) and startsWithShebang(program)
     )
 
 
 def removeQuotesFromArgs(args):
     """
     Function to remove quotes from the arguments list.
-    
+
     @param args list of arguments
     @type list of str
     @return list of unquoted strings
@@ -257,7 +259,7 @@
 def quoteArgs(args):
     """
     Function to quote the given list of arguments.
-    
+
     @param args list of arguments to be quoted
     @type list of str
     @return list of quoted arguments
@@ -269,7 +271,7 @@
             if x.startswith('"') and x.endswith('"'):
                 quotedArgs.append(x)
             else:
-                if ' ' in x:
+                if " " in x:
                     x = x.replace('"', '\\"')
                     quotedArgs.append('"{0}"'.format(x))
                 else:
@@ -283,7 +285,7 @@
     """
     Function to patch the arguments given to start a program in order to
     execute it in our debugger.
-    
+
     @param debugClient reference to the debug client object
     @type DebugClient
     @param arguments list of program arguments
@@ -293,30 +295,28 @@
     @return modified argument list
     @rtype list of str
     """
-    debugClientScript = os.path.join(
-        os.path.dirname(__file__), "DebugClient.py")
+    debugClientScript = os.path.join(os.path.dirname(__file__), "DebugClient.py")
     if debugClientScript in arguments:
         # it is already patched
         return arguments
-    
-    args = list(arguments[:])    # create a copy of the arguments list
+
+    args = list(arguments[:])  # create a copy of the arguments list
     args = removeQuotesFromArgs(args)
-    
+
     # support for shebang line
     program = os.path.basename(args[0]).lower()
     for pyname in PYTHON_NAMES:
         if pyname in program:
             break
     else:
-        if (
-            (not isWindowsPlatform() and startsWithShebang(args[0])) or
-            (isWindowsPlatform() and args[0].lower().endswith(".py"))
+        if (not isWindowsPlatform() and startsWithShebang(args[0])) or (
+            isWindowsPlatform() and args[0].lower().endswith(".py")
         ):
             # 1. insert our interpreter as first argument if not Windows
             # 2. insert our interpreter as first argument if on Windows and
             #    it is a Python script
             args.insert(0, sys.executable)
-    
+
     # extract list of interpreter arguments, i.e. all arguments before the
     # first one not starting with '-'.
     interpreter = args.pop(0)
@@ -345,19 +345,30 @@
                 interpreterArgs.append(args.pop(0))
         else:
             break
-    
-    (wd, host, port, exceptions, tracePython, redirect, noencoding
-     ) = debugClient.startOptions[:7]
-    
+
+    (
+        wd,
+        host,
+        port,
+        exceptions,
+        tracePython,
+        redirect,
+        noencoding,
+    ) = debugClient.startOptions[:7]
+
     modifiedArguments = [interpreter]
     modifiedArguments.extend(interpreterArgs)
-    modifiedArguments.extend([
-        debugClientScript,
-        "-h", host,
-        "-p", str(port),
-        "--no-passive",
-    ])
-    
+    modifiedArguments.extend(
+        [
+            debugClientScript,
+            "-h",
+            host,
+            "-p",
+            str(port),
+            "--no-passive",
+        ]
+    )
+
     if wd:
         modifiedArguments.extend(["-w", wd])
     if not exceptions:
@@ -378,18 +389,18 @@
         modifiedArguments.append(args.pop(0))
     modifiedArguments.append("--")
     # end the arguments for DebugClient
-    
+
     # append the arguments for the program to be debugged
     modifiedArguments.extend(args)
     modifiedArguments = quoteArgs(modifiedArguments)
-    
+
     return modifiedArguments
 
 
 def stringToArgumentsWindows(args):
     """
     Function to prepare a string of arguments for Windows platform.
-    
+
     @param args list of command arguments
     @type str
     @return list of command arguments
@@ -399,20 +410,20 @@
     """
     # see http://msdn.microsoft.com/en-us/library/a1y7w461.aspx
     result = []
-    
+
     DEFAULT = 0
     ARG = 1
     IN_DOUBLE_QUOTE = 2
-    
+
     state = DEFAULT
     backslashes = 0
-    buf = ''
-    
+    buf = ""
+
     argsLen = len(args)
     i = 0
     while i < argsLen:
         ch = args[i]
-        if ch == '\\':
+        if ch == "\\":
             backslashes += 1
             i += 1
             continue
@@ -420,11 +431,11 @@
             if ch == '"':
                 while backslashes >= 2:
                     backslashes -= 2
-                    buf += '\\'
+                    buf += "\\"
                 if backslashes == 1:
                     if state == DEFAULT:
                         state = ARG
-                    
+
                     buf += '"'
                     backslashes = 0
                     i += 1
@@ -433,12 +444,12 @@
                 # false alarm, treat passed backslashes literally...
                 if state == DEFAULT:
                     state = ARG
-                
+
                 while backslashes > 0:
                     backslashes -= 1
-                    buf += '\\'
-        
-        if ch in (' ', '\t'):
+                    buf += "\\"
+
+        if ch in (" ", "\t"):
             if state == DEFAULT:
                 # skip
                 i += 1
@@ -446,13 +457,13 @@
             elif state == ARG:
                 state = DEFAULT
                 result.append(buf)
-                buf = ''
+                buf = ""
                 i += 1
                 continue
-        
+
         if state not in (DEFAULT, ARG, IN_DOUBLE_QUOTE):
-            raise RuntimeError('Illegal condition')
-        
+            raise RuntimeError("Illegal condition")
+
         if state == IN_DOUBLE_QUOTE:
             if ch == '"':
                 if i + 1 < argsLen and args[i + 1] == '"':
@@ -462,32 +473,32 @@
                     buf += '"'
                     i += 1
                 elif len(buf) == 0:
-                    result.append("\"\"")
+                    result.append('""')
                     state = DEFAULT
                 else:
                     state = ARG
             else:
                 buf += ch
-        
+
         else:
             if ch == '"':
                 state = IN_DOUBLE_QUOTE
             else:
                 state = ARG
                 buf += ch
-        
+
         i += 1
-    
+
     if len(buf) > 0 or state != DEFAULT:
         result.append(buf)
-    
+
     return result
 
 
 def patchArgumentStringWindows(debugClient, argStr):
     """
     Function to patch an argument string for Windows.
-    
+
     @param debugClient reference to the debug client object
     @type DebugClient
     @param argStr argument string
@@ -498,6 +509,6 @@
     args = stringToArgumentsWindows(argStr)
     if not args or not isPythonProgram(args[0]):
         return argStr
-    
-    argStr = ' '.join(patchArguments(debugClient, args))
+
+    argStr = " ".join(patchArguments(debugClient, args))
     return argStr
--- a/src/eric7/DebugClients/Python/DebugVariables.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/DebugVariables.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,10 +27,11 @@
     """
     Base class of the resolver class tree.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type any
         @param attribute name of the attribute to extract
@@ -39,11 +40,11 @@
         @rtype any
         """
         return getattr(var, attribute, None)
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @return list containing the variable attributes
@@ -54,7 +55,7 @@
             with contextlib.suppress(Exception):
                 attribute = getattr(var, name)
                 d.append((name, attribute))
-        
+
         return d
 
 
@@ -67,10 +68,11 @@
     """
     Class used to resolve the default way.
     """
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -82,7 +84,7 @@
             with contextlib.suppress(Exception):
                 attribute = getattr(var, name)
                 d.append((name, attribute))
-        
+
         yield -1, d
         while True:
             yield -2, []
@@ -97,10 +99,11 @@
     """
     Class used to resolve from a dictionary.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type dict
         @param attribute name of the attribute to extract
@@ -113,18 +116,18 @@
                 return var[attribute]
             except Exception:
                 return getattr(var, attribute, None)
-        
+
         expectedID = int(attribute.split(" (ID:")[-1][:-1])
         for key, value in var.items():
             if id(key) == expectedID:
                 return value
-        
+
         return None
-    
+
     def keyToStr(self, key):
         """
         Public method to get a string representation for a key.
-        
+
         @param key key to be converted
         @type any
         @return string representation of the given key
@@ -134,15 +137,15 @@
             key = repr(key)
             # Special handling for bytes object
             # Raw and f-Strings are always converted to str
-            if key[0] == 'b':
+            if key[0] == "b":
                 key = key[1:]
 
         return key  # __IGNORE_WARNING_M834__
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -158,7 +161,7 @@
         except TypeError:
             # Slow path: only sort items with same type (Py3 only)
             allItems.sort(key=lambda x: (str(x[0]), x[0]))
-        
+
         for key, value in allItems:
             key = "{0} (ID:{1})".format(self.keyToStr(key), id(key))
             d.append((key, value))
@@ -168,14 +171,14 @@
                 start += count
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super().getVariableList(var)
         yield -1, d
-        
+
         while True:
             yield -2, []
 
@@ -189,10 +192,11 @@
     """
     Class used to resolve from a tuple or list.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type tuple or list
         @param attribute name of the attribute to extract
@@ -204,11 +208,11 @@
             return var[int(attribute)]
         except Exception:
             return getattr(var, str(attribute), None)
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -225,17 +229,17 @@
                 start = idx + 1
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super().getVariableList(var)
         yield -1, d
-        
+
         while True:
             yield -2, []
-    
+
 
 ############################################################
 ## Resolver for dict_items, dict_keys and dict_values
@@ -246,10 +250,11 @@
     """
     Class used to resolve from dict views.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type dict_items, dict_keys or dict_values
         @param attribute id of the value to extract
@@ -258,11 +263,11 @@
         @rtype any
         """
         return super().resolve(list(var), attribute)
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -281,10 +286,11 @@
     """
     Class used to resolve from a set or frozenset.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type tuple or list
         @param attribute id of the value to extract
@@ -302,13 +308,13 @@
         for v in var:
             if id(v) == attribute:
                 return v
-        
+
         return None
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -325,17 +331,17 @@
                 start += count
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super().getVariableList(var)
         yield -1, d
-        
+
         while True:
             yield -2, []
-    
+
 
 ############################################################
 ## Resolver for Numpy Arrays
@@ -346,24 +352,25 @@
     """
     Class used to resolve from numpy ndarray including some meta data.
     """
+
     def __isNumeric(self, arr):
         """
         Private method to check, if an array is of a numeric type.
-        
+
         @param arr array to check
         @type ndarray
         @return flag indicating a numeric array
         @rtype bool
         """
         try:
-            return arr.dtype.kind in 'biufc'
+            return arr.dtype.kind in "biufc"
         except AttributeError:
             return False
-    
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type ndarray
         @param attribute id of the value to extract
@@ -371,35 +378,35 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute == 'min':
+        if attribute == "min":
             if self.__isNumeric(var):
                 return var.min()
             else:
                 return None
-        
-        if attribute == 'max':
+
+        if attribute == "max":
             if self.__isNumeric(var):
                 return var.max()
             else:
                 return None
-        
-        if attribute == 'mean':
+
+        if attribute == "mean":
             if self.__isNumeric(var):
                 return var.mean()
             else:
                 return None
-        
+
         try:
             return var[int(attribute)]
         except Exception:
             return getattr(var, attribute, None)
-        
+
         return None
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -413,7 +420,7 @@
             allItems = var.tolist()
         except TypeError:  # TypeError: len() of unsized object
             allItems = []
-        
+
         for idx, value in enumerate(allItems):
             d.append((str(idx), value))
             count += 1
@@ -422,42 +429,39 @@
                 start += count
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super().getVariableList(var)
-        
+
         if var.size > 1024 * 1024:
             d.append(
-                ('min',
-                 'ndarray too big, calculating min would slow down debugging')
+                ("min", "ndarray too big, calculating min would slow down debugging")
             )
             d.append(
-                ('max',
-                 'ndarray too big, calculating max would slow down debugging')
+                ("max", "ndarray too big, calculating max would slow down debugging")
             )
             d.append(
-                ('mean',
-                 'ndarray too big, calculating mean would slow down debugging')
+                ("mean", "ndarray too big, calculating mean would slow down debugging")
             )
         elif self.__isNumeric(var):
             if var.size == 0:
-                d.append(('min', 'empty array'))
-                d.append(('max', 'empty array'))
-                d.append(('mean', 'empty array'))
+                d.append(("min", "empty array"))
+                d.append(("max", "empty array"))
+                d.append(("mean", "empty array"))
             else:
-                d.append(('min', var.min()))
-                d.append(('max', var.max()))
-                d.append(('mean', var.mean()))
+                d.append(("min", var.min()))
+                d.append(("max", var.max()))
+                d.append(("mean", var.mean()))
         else:
-            d.append(('min', 'not a numeric object'))
-            d.append(('max', 'not a numeric object'))
-            d.append(('mean', 'not a numeric object'))
-        
+            d.append(("min", "not a numeric object"))
+            d.append(("max", "not a numeric object"))
+            d.append(("mean", "not a numeric object"))
+
         yield -1, d
-        
+
         while True:
             yield -2, []
 
@@ -471,10 +475,11 @@
     """
     Class used to resolve from Django multi value dictionaries.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type MultiValueDict
         @param attribute name of the attribute to extract
@@ -487,18 +492,18 @@
                 return var[attribute]
             except Exception:
                 return getattr(var, attribute, None)
-        
+
         expectedID = int(attribute.split(" (ID:")[-1][:-1])
         for key in var:
             if id(key) == expectedID:
                 return var.getlist(key)
-        
+
         return None
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -514,7 +519,7 @@
         except TypeError:
             # Slow path: only sort items with same type (Py3 only)
             allKeys.sort(key=lambda x: (str(x), x))
-        
+
         for key in allKeys:
             dkey = "{0} (ID:{1})".format(self.keyToStr(key), id(key))
             d.append((dkey, var.getlist(key)))
@@ -524,17 +529,17 @@
                 start += count
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super(DictResolver, self).getVariableList(var)
         yield -1, d
-        
+
         while True:
             yield -2, []
-    
+
 
 ############################################################
 ## Resolver for array.array
@@ -545,6 +550,7 @@
     """
     Class used to resolve from array.array including some meta data.
     """
+
     TypeCodeMap = {
         "b": "int (signed char)",
         "B": "int (unsigned char)",
@@ -560,11 +566,11 @@
         "f": "float (float)",
         "d": "float (double)",
     }
-    
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type array.array
         @param attribute id of the value to extract
@@ -576,13 +582,13 @@
             return var[int(attribute)]
         except Exception:
             return getattr(var, attribute, None)
-        
+
         return None
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -592,7 +598,7 @@
         d = []
         start = count = 0
         allItems = var.tolist()
-        
+
         for idx, value in enumerate(allItems):
             d.append((str(idx), value))
             count += 1
@@ -601,18 +607,18 @@
                 start += count
                 count = 0
                 d = []
-        
+
         if d:
             yield start, d
-        
+
         # in case it has additional fields
         d = super().getVariableList(var)
-        
+
         # Special data for array type: convert typecode to readable text
-        d.append(('type', self.TypeCodeMap.get(var.typecode, 'illegal type')))
-        
+        d.append(("type", self.TypeCodeMap.get(var.typecode, "illegal type")))
+
         yield -1, d
-        
+
         while True:
             yield -2, []
 
@@ -626,10 +632,11 @@
     """
     Class used to resolve the Qt implementations.
     """
+
     def resolve(self, var, attribute):
         """
         Public method to get an attribute from a variable.
-        
+
         @param var variable to extract an attribute or value from
         @type Qt objects
         @param attribute name of the attribute to extract
@@ -637,15 +644,15 @@
         @return value of the attribute
         @rtype any
         """
-        if attribute == 'internalPointer':
+        if attribute == "internalPointer":
             return var.internalPointer()
-        
+
         return getattr(var, attribute, None)
-    
+
     def getVariableList(self, var):
         """
         Public method to get the attributes of a variable as a list.
-        
+
         @param var variable to be converted
         @type any
         @yield tuple containing the batch start index and a list
@@ -658,99 +665,90 @@
         # cases, e.g. already deleted C++ objects, str conversion..
         with contextlib.suppress(Exception):
             qttype = type(var).__name__
-            
-            if qttype in ('QLabel', 'QPushButton'):
-                attributes = ('text', )
-            elif qttype == 'QByteArray':
-                d.append(('bytes', bytes(var)))
-                d.append(('hex', "QByteArray", "{0}".format(var.toHex())))
+
+            if qttype in ("QLabel", "QPushButton"):
+                attributes = ("text",)
+            elif qttype == "QByteArray":
+                d.append(("bytes", bytes(var)))
+                d.append(("hex", "QByteArray", "{0}".format(var.toHex())))
+                d.append(("base64", "QByteArray", "{0}".format(var.toBase64())))
                 d.append(
-                    ('base64', "QByteArray",
-                     "{0}".format(var.toBase64()))
-                )
-                d.append(
-                    ('percent encoding', "QByteArray",
-                     "{0}".format(var.toPercentEncoding()))
+                    (
+                        "percent encoding",
+                        "QByteArray",
+                        "{0}".format(var.toPercentEncoding()),
+                    )
                 )
-            elif qttype in ('QPoint', 'QPointF'):
-                attributes = ('x', 'y')
-            elif qttype in ('QRect', 'QRectF'):
-                attributes = ('x', 'y', 'width', 'height')
-            elif qttype in ('QSize', 'QSizeF'):
-                attributes = ('width', 'height')
-            elif qttype == 'QColor':
-                attributes = ('name', )
+            elif qttype in ("QPoint", "QPointF"):
+                attributes = ("x", "y")
+            elif qttype in ("QRect", "QRectF"):
+                attributes = ("x", "y", "width", "height")
+            elif qttype in ("QSize", "QSizeF"):
+                attributes = ("width", "height")
+            elif qttype == "QColor":
+                attributes = ("name",)
                 r, g, b, a = var.getRgb()
-                d.append(
-                    ('rgba', "{0:d}, {1:d}, {2:d}, {3:d}".format(r, g, b, a))
-                )
+                d.append(("rgba", "{0:d}, {1:d}, {2:d}, {3:d}".format(r, g, b, a)))
                 h, s, v, a = var.getHsv()
-                d.append(
-                    ('hsva', "{0:d}, {1:d}, {2:d}, {3:d}".format(h, s, v, a))
-                )
+                d.append(("hsva", "{0:d}, {1:d}, {2:d}, {3:d}".format(h, s, v, a)))
                 c, m, y, k, a = var.getCmyk()
                 d.append(
-                    ('cmyka',
-                     "{0:d}, {1:d}, {2:d}, {3:d}, {4:d}".format(c, m, y, k, a))
+                    ("cmyka", "{0:d}, {1:d}, {2:d}, {3:d}, {4:d}".format(c, m, y, k, a))
                 )
-            elif qttype in ('QDate', 'QTime', 'QDateTime'):
+            elif qttype in ("QDate", "QTime", "QDateTime"):
                 d.append((qttype[1:].lower(), var.toString()))
-            elif qttype == 'QDir':
-                attributes = ('path', 'absolutePath', 'canonicalPath')
-            elif qttype == 'QFile':
-                attributes = ('fileName', )
-            elif qttype == 'QFont':
-                attributes = (
-                    'family', 'pointSize', 'weight', 'bold', 'italic'
-                )
-            elif qttype == 'QUrl':
-                d.append(('url', var.toString()))
-                attributes = ('scheme', 'userName', 'password', 'host', 'port',
-                              'path')
-            elif qttype == 'QModelIndex':
+            elif qttype == "QDir":
+                attributes = ("path", "absolutePath", "canonicalPath")
+            elif qttype == "QFile":
+                attributes = ("fileName",)
+            elif qttype == "QFont":
+                attributes = ("family", "pointSize", "weight", "bold", "italic")
+            elif qttype == "QUrl":
+                d.append(("url", var.toString()))
+                attributes = ("scheme", "userName", "password", "host", "port", "path")
+            elif qttype == "QModelIndex":
                 valid = var.isValid()
-                d.append(('valid', valid))
+                d.append(("valid", valid))
                 if valid:
                     d.append(("internalPointer", var.internalPointer()))
-                    attributes = ('row', 'column', 'internalId')
-            elif qttype in ('QRegExp', "QRegularExpression"):
-                attributes = ('pattern', )
-                
+                    attributes = ("row", "column", "internalId")
+            elif qttype in ("QRegExp", "QRegularExpression"):
+                attributes = ("pattern",)
+
             # GUI stuff
-            elif qttype == 'QAction':
-                d.append(('shortcut', var.shortcut().toString()))
-                attributes = ('objectName', 'text', 'iconText', 'toolTip',
-                              'whatsThis')
-                
-            elif qttype == 'QKeySequence':
-                d.append(('keySequence', var.toString()))
-                
+            elif qttype == "QAction":
+                d.append(("shortcut", var.shortcut().toString()))
+                attributes = ("objectName", "text", "iconText", "toolTip", "whatsThis")
+
+            elif qttype == "QKeySequence":
+                d.append(("keySequence", var.toString()))
+
             # XML stuff
-            elif qttype == 'QDomAttr':
-                attributes = ('name', 'var')
-            elif qttype in ('QDomCharacterData', 'QDomComment', 'QDomText'):
-                attributes = ('data', )
-            elif qttype == 'QDomDocument':
-                d.append(('text', var.toString()))
-            elif qttype == 'QDomElement':
-                attributes = ('tagName', 'text')
-                
+            elif qttype == "QDomAttr":
+                attributes = ("name", "var")
+            elif qttype in ("QDomCharacterData", "QDomComment", "QDomText"):
+                attributes = ("data",)
+            elif qttype == "QDomDocument":
+                d.append(("text", var.toString()))
+            elif qttype == "QDomElement":
+                attributes = ("tagName", "text")
+
             # Networking stuff
-            elif qttype == 'QHostAddress':
-                d.append(('address', var.toString()))
-                
+            elif qttype == "QHostAddress":
+                d.append(("address", var.toString()))
+
             # PySide specific
-            elif qttype == 'EnumType':  # Not in PyQt possible
+            elif qttype == "EnumType":  # Not in PyQt possible
                 for key, value in var.values.items():
                     d.append((key, int(value)))
-        
+
         for attribute in attributes:
             d.append((attribute, getattr(var, attribute)()))
-        
+
         # add additional fields
-        if qttype != 'EnumType':
+        if qttype != "EnumType":
             d.extend(super().getVariableList(var))
-        
+
         yield -1, d
         while True:
             yield -2, []
@@ -782,7 +780,7 @@
     Protected function to initialize the type map.
     """
     global _TypeMap
-    
+
     # Type map for special handling of array types.
     # All other types not listed here use the default resolver.
     _TypeMap = [
@@ -806,26 +804,29 @@
     Public function to update the type map based on module imports.
     """
     global _TypeMap, _ArrayTypes, _TryArray, _TryNumpy, _TryDjango, _MapCount
-    
+
     # array.array may not be imported (yet)
-    if _TryArray and 'array' in sys.modules:
+    if _TryArray and "array" in sys.modules:
         import array
+
         _TypeMap.append((array.array, arrayResolver))
         _TryArray = False
-    
+
     # numpy may not be imported (yet)
-    if _TryNumpy and 'numpy' in sys.modules:
+    if _TryNumpy and "numpy" in sys.modules:
         import numpy
+
         _TypeMap.append((numpy.ndarray, ndarrayResolver))
         _TryNumpy = False
-    
+
     # django may not be imported (yet)
-    if _TryDjango and 'django' in sys.modules:
+    if _TryDjango and "django" in sys.modules:
         from django.utils.datastructures import MultiValueDict
+
         # it should go before dict
         _TypeMap.insert(0, (MultiValueDict, multiValueDictResolver))
         _TryDjango = False
-    
+
     # If _TypeMap changed, rebuild the _ArrayTypes tuple
     if _MapCount != len(_TypeMap):
         _ArrayTypes = tuple(typ for typ, _resolver in _TypeMap)
@@ -835,27 +836,25 @@
 def getResolver(obj):
     """
     Public method to get the resolver based on the type info of an object.
-    
+
     @param obj object to get resolver for
     @type any
     @return resolver
     @rtype BaseResolver
     """
     # Between PyQt and PySide the returned type is different (class vs. type)
-    typeStr = str(type(obj)).split(' ', 1)[-1]
+    typeStr = str(type(obj)).split(" ", 1)[-1]
     typeStr = typeStr[1:-2]
-    
-    if (
-        typeStr.startswith(ConfigQtNames) and
-        typeStr.endswith(ConfigKnownQtTypes)
-    ):
+
+    if typeStr.startswith(ConfigQtNames) and typeStr.endswith(ConfigKnownQtTypes):
         return qtResolver
-    
+
     for typeData, resolver in _TypeMap:  # __IGNORE_WARNING_M507__
         if isinstance(obj, typeData):
             return resolver
-    
+
     return defaultResolver
 
+
 #
 # eflag: noqa = Y113
--- a/src/eric7/DebugClients/Python/FlexCompleter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/FlexCompleter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -58,6 +58,7 @@
     """
     Class implementing the command line completer object.
     """
+
     def __init__(self, namespace=None):
         """
         Constructor
@@ -72,13 +73,13 @@
         readline via the set_completer() call:
 
         readline.set_completer(Completer(my_namespace).complete)
-        
+
         @param namespace The namespace for the completer.
         @exception TypeError raised to indicate a wrong data structure of
             the namespace object
         """
         if namespace and not isinstance(namespace, dict):
-            raise TypeError('namespace must be a dictionary')
+            raise TypeError("namespace must be a dictionary")
 
         # Don't bind to namespace quite yet, but flag whether the user wants a
         # specific namespace or to use __main__.__dict__. This will allow us
@@ -95,14 +96,14 @@
 
         This is called successively with state == 0, 1, 2, ... until it
         returns None.  The completion should begin with 'text'.
-        
+
         @param text The text to be completed. (string)
         @param state The state of the completion. (integer)
         @return The possible completions as a list of strings.
         """
         if self.use_main_ns:
             self.namespace = __main__.__dict__
-        
+
         if state == 0:
             if "." in text:
                 self.matches = self.attr_matches(text)
@@ -116,7 +117,7 @@
     def _callable_postfix(self, val, word):
         """
         Protected method to check for a callable.
-        
+
         @param val value to check (object)
         @param word word to ammend (string)
         @return ammended word (string)
@@ -134,18 +135,25 @@
         defined in self.namespace that match.
         """
         import keyword
+
         matches = []
         seen = {"__builtins__"}
         n = len(text)
         for word in keyword.kwlist:
             if word[:n] == text:
                 seen.add(word)
-                if word in {'finally', 'try'}:
-                    word += ':'
-                elif word not in {'False', 'None', 'True',
-                                  'break', 'continue', 'pass',
-                                  'else'}:
-                    word += ' '
+                if word in {"finally", "try"}:
+                    word += ":"
+                elif word not in {
+                    "False",
+                    "None",
+                    "True",
+                    "break",
+                    "continue",
+                    "pass",
+                    "else",
+                }:
+                    word += " "
                 matches.append(word)
         for nspace in [self.namespace, builtins.__dict__]:
             for word, val in nspace.items():
@@ -165,7 +173,7 @@
 
         <b>WARNING</b>: this can still invoke arbitrary C code, if an object
         with a __getattr__ hook is evaluated.
-        
+
         @param text The text to be completed. (string)
         @return A list of all matches.
         """
@@ -176,7 +184,7 @@
             return []
         expr, attr = m.group(1, 3)
         try:
-            thisobject = eval(expr, self.namespace)     # secok
+            thisobject = eval(expr, self.namespace)  # secok
         except Exception:
             return []
 
@@ -184,32 +192,31 @@
         words = set(dir(thisobject))
         words.discard("__builtins__")
 
-        if hasattr(object, '__class__'):
-            words.add('__class__')
+        if hasattr(object, "__class__"):
+            words.add("__class__")
             words.update(get_class_members(thisobject.__class__))
         matches = []
         n = len(attr)
-        if attr == '':
-            noprefix = '_'
-        elif attr == '_':
-            noprefix = '__'
+        if attr == "":
+            noprefix = "_"
+        elif attr == "_":
+            noprefix = "__"
         else:
             noprefix = None
         while True:
             for word in words:
-                if (word[:n] == attr and
-                        not (noprefix and word[:n + 1] == noprefix)):
+                if word[:n] == attr and not (noprefix and word[: n + 1] == noprefix):
                     match = "{0}.{1}".format(expr, word)
                     try:
                         val = getattr(thisobject, word)
-                    except Exception:       # secok
+                    except Exception:  # secok
                         pass  # Include even if attribute not set
                     else:
                         match = self._callable_postfix(val, match)
                     matches.append(match)
             if matches or not noprefix:
                 break
-            noprefix = '__' if noprefix == '_' else None
+            noprefix = "__" if noprefix == "_" else None
         matches.sort()
         return matches
 
@@ -217,15 +224,16 @@
 def get_class_members(klass):
     """
     Module function to retrieve the class members.
-    
+
     @param klass The class object to be analysed.
     @return A list of all names defined in the class.
     """
     ret = dir(klass)
-    if hasattr(klass, '__bases__'):
+    if hasattr(klass, "__bases__"):
         for base in klass.__bases__:
             ret += get_class_members(base)
     return ret
 
+
 #
 # eflag: noqa = M111
--- a/src/eric7/DebugClients/Python/ModuleLoader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/ModuleLoader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,39 +19,41 @@
     """
     Class implementing an import hook patching modules to support debugging.
     """
+
     def __init__(self, debugClient):
         """
         Constructor
-        
+
         @param debugClient reference to the debug client object
         @type DebugClient
         """
         self.__dbgClient = debugClient
-        
+
         self.__enableImportHooks = set()
-        
+
         # reset already imported thread module to apply hooks at next import
         for moduleName in ("thread", "_thread", "threading"):
             if moduleName in sys.modules:
                 del sys.modules[moduleName]
-        
+
         self.__modulesToPatch = (
-            '_thread', 'threading',
-            'greenlet',
-            'subprocess',
-            'multiprocessing',
-            'PyQt5.QtCore',
-            'PyQt6.QtCore',
-            'PySide2.QtCore',
-            'PySide6.QtCore',
+            "_thread",
+            "threading",
+            "greenlet",
+            "subprocess",
+            "multiprocessing",
+            "PyQt5.QtCore",
+            "PyQt6.QtCore",
+            "PySide2.QtCore",
+            "PySide6.QtCore",
         )
-        
+
         sys.meta_path.insert(0, self)
-    
+
     def __loadModule(self, fullname):
         """
         Private method to load a module.
-        
+
         @param fullname name of the module to be loaded
         @type str
         @return reference to the loaded module
@@ -61,61 +63,47 @@
         sys.modules[fullname] = module
         self.__enableImportHooks.remove(fullname)
         ## Add hook for _thread.start_new_thread
-        if (
-            fullname == '_thread' and
-            not hasattr(module, 'eric7_patched')
-        ):
+        if fullname == "_thread" and not hasattr(module, "eric7_patched"):
             module.eric7_patched = True
             self.__dbgClient.patchPyThread(module)
-        
+
         ## Add hook for threading.run()
-        elif (
-            fullname == "threading" and
-            not hasattr(module, 'eric7_patched')
-        ):
+        elif fullname == "threading" and not hasattr(module, "eric7_patched"):
             module.eric7_patched = True
             self.__dbgClient.patchPyThreading(module)
-        
+
         ## greenlet support
-        elif (
-            fullname == 'greenlet' and
-            not hasattr(module, 'eric7_patched')
-        ):
+        elif fullname == "greenlet" and not hasattr(module, "eric7_patched"):
             if self.__dbgClient.patchGreenlet(module):
                 module.eric7_patched = True
-        
+
         ## Add hook for subprocess.Popen()
-        elif (
-            fullname == 'subprocess' and
-            not hasattr(module, 'eric7_patched')
-        ):
+        elif fullname == "subprocess" and not hasattr(module, "eric7_patched"):
             module.eric7_patched = True
             patchSubprocess(module, self.__dbgClient)
-        
+
         ## Add hook for multiprocessing.Process
-        elif (
-            fullname == 'multiprocessing' and
-            not hasattr(module, 'eric7_patched')
-        ):
+        elif fullname == "multiprocessing" and not hasattr(module, "eric7_patched"):
             module.eric7_patched = True
             patchMultiprocessing(module, self.__dbgClient)
-        
+
         ## Add hook for *.QThread and *.QProcess
-        elif (
-            fullname in ('PyQt5.QtCore', 'PyQt6.QtCore',
-                         'PySide2.QtCore', 'PySide6.QtCore') and
-            not hasattr(module, 'eric7_patched')
-        ):
+        elif fullname in (
+            "PyQt5.QtCore",
+            "PyQt6.QtCore",
+            "PySide2.QtCore",
+            "PySide6.QtCore",
+        ) and not hasattr(module, "eric7_patched"):
             module.eric7_patched = True
             self.__dbgClient.patchQThread(module)
             patchQProcess(module, self.__dbgClient)
-        
+
         return module
-    
+
     def find_spec(self, fullname, path, target=None):
         """
         Public method returning the module spec.
-        
+
         @param fullname name of the module to be loaded
         @type str
         @param path path to resolve the module name
@@ -128,32 +116,32 @@
         """
         if fullname in sys.modules or self.__dbgClient.debugging is False:
             return None
-        
+
         if (
-            fullname in self.__modulesToPatch and
-            fullname not in self.__enableImportHooks
+            fullname in self.__modulesToPatch
+            and fullname not in self.__enableImportHooks
         ):
             # Disable hook to be able to import original module
             self.__enableImportHooks.add(fullname)
             return importlib.machinery.ModuleSpec(fullname, self)
-        
+
         return None
-    
+
     def create_module(self, spec):
         """
         Public method to create a module based on the passed in spec.
-        
+
         @param spec module spec object for loading the module
         @type ModuleSpec
         @return created and patched module
         @rtype module
         """
         return self.__loadModule(spec.name)
-    
+
     def exec_module(self, module):
         """
         Public method to execute the created module.
-        
+
         @param module module to be executed
         @type module
         """
--- a/src/eric7/DebugClients/Python/MultiProcessDebugExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/MultiProcessDebugExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,10 @@
 import contextlib
 
 from DebugUtilities import (
-    patchArguments, patchArgumentStringWindows, isPythonProgram,
-    isWindowsPlatform
+    patchArguments,
+    patchArgumentStringWindows,
+    isPythonProgram,
+    isWindowsPlatform,
 )
 
 _debugClient = None
@@ -21,7 +23,7 @@
 def _shallPatch():
     """
     Function to determine, if the multiprocessing patches should be done.
-    
+
     @return flag indicating patching should be performed
     @rtype bool
     """
@@ -31,7 +33,7 @@
 def patchModule(module, functionName, createFunction):
     """
     Function to replace a function of a module with a modified one.
-    
+
     @param module reference to the module
     @type types.ModuleType
     @param functionName name of the function to be replaced
@@ -40,7 +42,7 @@
     @type types.FunctionType
     """
     if hasattr(module, functionName):
-        originalName = 'original_' + functionName
+        originalName = "original_" + functionName
         if not hasattr(module, originalName):
             setattr(module, originalName, getattr(module, functionName))
             setattr(module, functionName, createFunction(originalName))
@@ -49,236 +51,261 @@
 def createExecl(originalName):
     """
     Function to patch the 'execl' process creation functions.
-    
+
     <ul>
         <li>os.execl(path, arg0, arg1, ...)</li>
         <li>os.execle(path, arg0, arg1, ..., env)</li>
         <li>os.execlp(file, arg0, arg1, ...)</li>
         <li>os.execlpe(file, arg0, arg1, ..., env)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newExecl(path, *args):
         """
         Function replacing the 'execl' functions of the os module.
         """
         import os
+
         if _shallPatch():
             args = patchArguments(_debugClient, args)
             if isPythonProgram(args[0]):
                 path = args[0]
         return getattr(os, originalName)(path, *args)
+
     return newExecl
 
 
 def createExecv(originalName):
     """
     Function to patch the 'execv' process creation functions.
-    
+
     <ul>
         <li>os.execv(path, args)</li>
         <li>os.execvp(file, args)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newExecv(path, args):
         """
         Function replacing the 'execv' functions of the os module.
         """
         import os
+
         if _shallPatch():
             args = patchArguments(_debugClient, args)
             if isPythonProgram(args[0]):
                 path = args[0]
         return getattr(os, originalName)(path, args)
+
     return newExecv
 
 
 def createExecve(originalName):
     """
     Function to patch the 'execve' process creation functions.
-    
+
     <ul>
         <li>os.execve(path, args, env)</li>
         <li>os.execvpe(file, args, env)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newExecve(path, args, env):
         """
         Function replacing the 'execve' functions of the os module.
         """
         import os
+
         if _shallPatch():
             args = patchArguments(_debugClient, args)
             if isPythonProgram(args[0]):
                 path = args[0]
         return getattr(os, originalName)(path, args, env)
+
     return newExecve
 
 
 def createSpawnl(originalName):
     """
     Function to patch the 'spawnl' process creation functions.
-    
+
     <ul>
         <li>os.spawnl(mode, path, arg0, arg1, ...)</li>
         <li>os.spawnlp(mode, file, arg0, arg1, ...)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newSpawnl(mode, path, *args):
         """
         Function replacing the 'spawnl' functions of the os module.
         """
         import os
+
         args = patchArguments(_debugClient, args)
         return getattr(os, originalName)(mode, path, *args)
+
     return newSpawnl
 
 
 def createSpawnv(originalName):
     """
     Function to patch the 'spawnv' process creation functions.
-    
+
     <ul>
         <li>os.spawnv(mode, path, args)</li>
         <li>os.spawnvp(mode, file, args)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newSpawnv(mode, path, args):
         """
         Function replacing the 'spawnv' functions of the os module.
         """
         import os
+
         args = patchArguments(_debugClient, args)
         return getattr(os, originalName)(mode, path, args)
+
     return newSpawnv
 
 
 def createSpawnve(originalName):
     """
     Function to patch the 'spawnve' process creation functions.
-    
+
     <ul>
         <li>os.spawnve(mode, path, args, env)</li>
         <li>os.spawnvpe(mode, file, args, env)</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newSpawnve(mode, path, args, env):
         """
         Function replacing the 'spawnve' functions of the os module.
         """
         import os
+
         args = patchArguments(_debugClient, args)
         return getattr(os, originalName)(mode, path, args, env)
+
     return newSpawnve
 
 
 def createPosixSpawn(originalName):
     """
     Function to patch the 'posix_spawn' process creation functions.
-    
+
     <ul>
         <li>os.posix_spawn(path, argv, env, *, file_actions=None, ...
             (6 more))</li>
         <li>os.posix_spawnp(path, argv, env, *, file_actions=None, ...
             (6 more))</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newPosixSpawn(path, argv, env, **kwargs):
         """
         Function replacing the 'posix_spawn' functions of the os module.
         """
         import os
+
         argv = patchArguments(_debugClient, argv)
         return getattr(os, originalName)(path, argv, env, **kwargs)
+
     return newPosixSpawn
 
 
 def createForkExec(originalName):
     """
     Function to patch the 'fork_exec' process creation functions.
-    
+
     <ul>
         <li>_posixsubprocess.fork_exec(args, executable_list, close_fds,
             ... (13 more))</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newForkExec(args, *other_args):
         """
         Function replacing the 'fork_exec' functions of the _posixsubprocess
         module.
         """
         import _posixsubprocess
+
         if _shallPatch():
             args = patchArguments(_debugClient, args)
         return getattr(_posixsubprocess, originalName)(args, *other_args)
+
     return newForkExec
 
 
 def createFork(originalName):
     """
     Function to patch the 'fork' process creation functions.
-    
+
     <ul>
         <li>os.fork()</li>
     </ul>
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newFork():
         """
         Function replacing the 'fork' function of the os module.
         """
         import os
         import sys
-        
+
         # A simple fork will result in a new python process
         isNewPythonProcess = True
         frame = sys._getframe()
-        
+
         multiprocess = _shallPatch()
-        
+
         isSubprocessFork = False
         isMultiprocessingPopen = False
         while frame is not None:
@@ -287,33 +314,36 @@
                 # because it is handled in 'MultiprocessingExtension.py'.
                 isMultiprocessingPopen = True
                 break
-            
+
             elif (
-                frame.f_code.co_name == '_execute_child' and
-                'subprocess' in frame.f_code.co_filename
+                frame.f_code.co_name == "_execute_child"
+                and "subprocess" in frame.f_code.co_filename
             ):
                 isSubprocessFork = True
                 # If we're actually in subprocess.Popen creating a child, it
                 # may result in something which is not a Python process, (so,
                 # we don't want to connect with it in the forked version).
-                executable = frame.f_locals.get('executable')
+                executable = frame.f_locals.get("executable")
                 if executable is not None:
                     isNewPythonProcess = False
                     if isPythonProgram(executable):
                         isNewPythonProcess = True
                 break
-            
+
             frame = frame.f_back
-        frame = None    # Just make sure we don't hold on to it.
-        
-        childProcess = getattr(os, originalName)()     # fork
-        if (
-            not childProcess and
-            not isMultiprocessingPopen and
-            isNewPythonProcess
-        ):
-            (wd, host, port, exceptions, tracePython, redirect,
-             noencoding) = _debugClient.startOptions
+        frame = None  # Just make sure we don't hold on to it.
+
+        childProcess = getattr(os, originalName)()  # fork
+        if not childProcess and not isMultiprocessingPopen and isNewPythonProcess:
+            (
+                wd,
+                host,
+                port,
+                exceptions,
+                tracePython,
+                redirect,
+                noencoding,
+            ) = _debugClient.startOptions
             _debugClient.startDebugger(
                 filename=sys.argv[0],
                 host=host,
@@ -323,9 +353,10 @@
                 tracePython=tracePython,
                 redirect=redirect,
                 passive=False,
-                multiprocessSupport=multiprocess)
+                multiprocessSupport=multiprocess,
+            )
         return childProcess
-    
+
     return newFork
 
 
@@ -333,12 +364,13 @@
     """
     Function to patch the 'CreateProcess' process creation function of
     Windows.
-    
+
     @param originalName original name of the function to be patched
     @type str
     @return function replacing the original one
     @rtype function
     """
+
     def newCreateProcess(appName, cmdline, *args):
         """
         Function replacing the 'CreateProcess' function of the _subprocess
@@ -349,7 +381,9 @@
         except ImportError:
             import _winapi as _subprocess
         return getattr(_subprocess, originalName)(
-            appName, patchArgumentStringWindows(_debugClient, cmdline), *args)
+            appName, patchArgumentStringWindows(_debugClient, cmdline), *args
+        )
+
     return newCreateProcess
 
 
@@ -357,31 +391,31 @@
     """
     Function to patch the process creation functions to support multiprocess
     debugging.
-    
+
     @param multiprocessEnabled flag indicating multiprocess support
     @type bool
     @param debugClient reference to the debug client object
     @type DebugClient
     """
     global _debugClient
-    
+
     if not multiprocessEnabled:
         # return without patching
         return
-    
+
     import os
     import sys
-    
+
     # patch 'os.exec...()' functions
-#-    patchModule(os, "execl", createExecl)
-#-    patchModule(os, "execle", createExecl)
-#-    patchModule(os, "execlp", createExecl)
-#-    patchModule(os, "execlpe", createExecl)
-#-    patchModule(os, "execv", createExecv)
-#-    patchModule(os, "execve", createExecve)
-#-    patchModule(os, "execvp", createExecv)
-#-    patchModule(os, "execvpe", createExecve)
-    
+    # -    patchModule(os, "execl", createExecl)
+    # -    patchModule(os, "execle", createExecl)
+    # -    patchModule(os, "execlp", createExecl)
+    # -    patchModule(os, "execlpe", createExecl)
+    # -    patchModule(os, "execv", createExecv)
+    # -    patchModule(os, "execve", createExecve)
+    # -    patchModule(os, "execvp", createExecv)
+    # -    patchModule(os, "execvpe", createExecve)
+
     # patch 'os.spawn...()' functions
     patchModule(os, "spawnl", createSpawnl)
     patchModule(os, "spawnle", createSpawnl)
@@ -391,22 +425,23 @@
     patchModule(os, "spawnve", createSpawnve)
     patchModule(os, "spawnvp", createSpawnv)
     patchModule(os, "spawnvpe", createSpawnve)
-    
+
     # patch 'os.posix_spawn...()' functions
     if sys.version_info >= (3, 8) and not isWindowsPlatform():
         patchModule(os, "posix_spawn", createPosixSpawn)
         patchModule(os, "posix_spawnp", createPosixSpawn)
-    
+
     if isWindowsPlatform():
         try:
             import _subprocess
         except ImportError:
             import _winapi as _subprocess
-        patchModule(_subprocess, 'CreateProcess', createCreateProcess)
+        patchModule(_subprocess, "CreateProcess", createCreateProcess)
     else:
         patchModule(os, "fork", createFork)
         with contextlib.suppress(ImportError):
             import _posixsubprocess
+
             patchModule(_posixsubprocess, "fork_exec", createForkExec)
-    
+
     _debugClient = debugClient
--- a/src/eric7/DebugClients/Python/MultiprocessingExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/MultiprocessingExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,27 +19,28 @@
 def patchMultiprocessing(module, debugClient):
     """
     Function to patch the multiprocessing module.
-    
+
     @param module reference to the imported module to be patched
     @type module
     @param debugClient reference to the debug client object
     @type DebugClient
-    """     # __IGNORE_WARNING_D234__
+    """  # __IGNORE_WARNING_D234__
     global _debugClient, _originalProcess, _originalBootstrap
-    
+
     _debugClient = debugClient
-    
+
     _originalProcess = module.process.BaseProcess
     _originalBootstrap = _originalProcess._bootstrap
-    
+
     class ProcessWrapper(_originalProcess):
         """
         Wrapper class for multiprocessing.Process.
         """
+
         def _bootstrap(self, *args, **kwargs):
             """
             Wrapper around _bootstrap to start debugger.
-            
+
             @param args function arguments
             @type list
             @param kwargs keyword only arguments
@@ -48,21 +49,29 @@
             @rtype int
             """
             _debugging = False
-            if (
-                _debugClient.debugging and
-                _debugClient.multiprocessSupport
-            ):
+            if _debugClient.debugging and _debugClient.multiprocessSupport:
                 scriptName = sys.argv[0]
                 if not _debugClient.skipMultiProcessDebugging(scriptName):
                     _debugging = True
                     try:
-                        (wd, host, port, exceptions, tracePython, redirect,
-                         noencoding) = _debugClient.startOptions[:7]
+                        (
+                            wd,
+                            host,
+                            port,
+                            exceptions,
+                            tracePython,
+                            redirect,
+                            noencoding,
+                        ) = _debugClient.startOptions[:7]
                         _debugClient.startDebugger(
-                            sys.argv[0], host=host, port=port,
-                            exceptions=exceptions, tracePython=tracePython,
-                            redirect=redirect, passive=False,
-                            multiprocessSupport=True
+                            sys.argv[0],
+                            host=host,
+                            port=port,
+                            exceptions=exceptions,
+                            tracePython=tracePython,
+                            redirect=redirect,
+                            passive=False,
+                            multiprocessSupport=True,
                         )
                     except Exception:
                         print(
@@ -72,12 +81,12 @@
                         traceback.print_exc(file=sys.stdout)
                         sys.stdout.flush()
                         raise
-            
+
             exitcode = _originalBootstrap(self, *args, **kwargs)
-            
+
             if _debugging:
                 _debugClient.progTerminated(exitcode, "process finished")
-            
+
             return exitcode
-    
+
     _originalProcess._bootstrap = ProcessWrapper._bootstrap
--- a/src/eric7/DebugClients/Python/PyProfile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/PyProfile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,23 +10,24 @@
 import marshal
 import profile
 import atexit
-import pickle           # secok
+import pickle  # secok
 import contextlib
 
 
 class PyProfile(profile.Profile):
     """
     Class extending the standard Python profiler with additional methods.
-    
+
     This class extends the standard Python profiler by the functionality to
     save the collected timing data in a timing cache, to restore these data
     on subsequent calls, to store a profile dump to a standard filename and
     to erase these caches.
     """
+
     def __init__(self, basename, timer=None, bias=None):
         """
         Constructor
-        
+
         @param basename name of the script to be profiled (string)
         @param timer function defining the timing calculation
         @param bias calibration value (float)
@@ -35,50 +36,49 @@
             profile.Profile.__init__(self, timer, bias)
         except TypeError:
             profile.Profile.__init__(self, timer)
-        
+
         self.dispatch = self.__class__.dispatch
-        
+
         basename = os.path.splitext(basename)[0]
         self.profileCache = "{0}.profile".format(basename)
         self.timingCache = "{0}.timings".format(basename)
-        
+
         self.__restore()
         atexit.register(self.save)
-    
+
     def __restore(self):
         """
         Private method to restore the timing data from the timing cache.
         """
         if not os.path.exists(self.timingCache):
             return
-        
-        with contextlib.suppress(OSError, EOFError, ValueError, TypeError), \
-                open(self.timingCache, 'rb') as cache:
-            timings = marshal.load(cache)       # secok
+
+        with contextlib.suppress(OSError, EOFError, ValueError, TypeError), open(
+            self.timingCache, "rb"
+        ) as cache:
+            timings = marshal.load(cache)  # secok
             if isinstance(timings, dict):
                 self.timings = timings
-    
+
     def save(self):
         """
         Public method to store the collected profile data.
         """
         # dump the raw timing data
-        with contextlib.suppress(OSError), \
-                open(self.timingCache, 'wb') as cache:
+        with contextlib.suppress(OSError), open(self.timingCache, "wb") as cache:
             marshal.dump(self.timings, cache)
-        
+
         # dump the profile data
         self.dump_stats(self.profileCache)
-    
+
     def dump_stats(self, file):
         """
         Public method to dump the statistics data.
-        
+
         @param file name of the file to write to (string)
         """
         self.create_stats()
-        with contextlib.suppress(OSError, pickle.PickleError), \
-                open(file, 'wb') as f:
+        with contextlib.suppress(OSError, pickle.PickleError), open(file, "wb") as f:
             pickle.dump(self.stats, f, 4)
 
     def erase(self):
@@ -92,7 +92,7 @@
     def fix_frame_filename(self, frame):
         """
         Public method used to fixup the filename for a given frame.
-        
+
         The logic employed here is that if a module was loaded
         from a .pyc file, then the correct .py to operate with
         should be in the same path as the .pyc. The reason this
@@ -103,21 +103,23 @@
         this can break debugging as the .pyc will refer to the .py
         on the original machine. Another case might be sharing
         code over a network... This logic deals with that.
-        
+
         @param frame the frame object
         @return fixed up file name (string)
         """
-        versionExt = '.py3'
-        
+        versionExt = ".py3"
+
         # get module name from __file__
-        if (not isinstance(frame, profile.Profile.fake_frame) and
-                '__file__' in frame.f_globals):
-            root, ext = os.path.splitext(frame.f_globals['__file__'])
-            if ext in ['.pyc', '.py', versionExt, '.pyo']:
-                fixedName = root + '.py'
+        if (
+            not isinstance(frame, profile.Profile.fake_frame)
+            and "__file__" in frame.f_globals
+        ):
+            root, ext = os.path.splitext(frame.f_globals["__file__"])
+            if ext in [".pyc", ".py", versionExt, ".pyo"]:
+                fixedName = root + ".py"
                 if os.path.exists(fixedName):
                     return fixedName
-                
+
                 fixedName = root + versionExt
                 if os.path.exists(fixedName):
                     return fixedName
@@ -127,10 +129,10 @@
     def trace_dispatch_call(self, frame, t):
         """
         Public method used to trace functions calls.
-        
+
         This is a variant of the one found in the standard Python
         profile.py calling fix_frame_filename above.
-        
+
         @param frame reference to the call frame
         @param t arguments
         @return flag indicating a successful handling (boolean)
@@ -138,16 +140,21 @@
         if self.cur and frame.f_back is not self.cur[-2]:
             rpt, rit, ret, rfn, rframe, rcur = self.cur
             if not isinstance(rframe, profile.Profile.fake_frame):
-                assert rframe.f_back is frame.f_back, (             # secok
-                    "Bad call", rfn, rframe, rframe.f_back,
-                    frame, frame.f_back)
+                assert rframe.f_back is frame.f_back, (  # secok
+                    "Bad call",
+                    rfn,
+                    rframe,
+                    rframe.f_back,
+                    frame,
+                    frame.f_back,
+                )
                 self.trace_dispatch_return(rframe, 0)
-                assert (self.cur is None or                         # secok
-                        frame.f_back is self.cur[-2]), ("Bad call",
-                                                        self.cur[-3])
+                assert self.cur is None or frame.f_back is self.cur[-2], (  # secok
+                    "Bad call",
+                    self.cur[-3],
+                )
         fcode = frame.f_code
-        fn = (self.fix_frame_filename(frame),
-              fcode.co_firstlineno, fcode.co_name)
+        fn = (self.fix_frame_filename(frame), fcode.co_firstlineno, fcode.co_name)
         self.cur = (t, 0, 0, fn, frame, self.cur)
         timings = self.timings
         if fn in timings:
@@ -156,7 +163,7 @@
         else:
             timings[fn] = 0, 0, 0, 0, {}
         return 1
-    
+
     dispatch = {
         "call": trace_dispatch_call,
         "exception": profile.Profile.trace_dispatch_exception,
--- a/src/eric7/DebugClients/Python/QProcessExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/QProcessExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,49 +18,52 @@
 def patchQProcess(module, debugClient):
     """
     Function to patch the QtCore module's QProcess.
-    
+
     @param module reference to the imported module to be patched
     @type module
     @param debugClient reference to the debug client object
     @type DebugClient
-    """     # __IGNORE_WARNING_D234__
+    """  # __IGNORE_WARNING_D234__
     global _debugClient
-    
+
     class QProcessWrapper(module.QProcess):
         """
         Wrapper class for *.QProcess.
         """
+
         _origQProcessStartDetached = module.QProcess.startDetached
-        
+
         def __init__(self, parent=None):
             """
             Constructor
             """
             super().__init__(parent)
-        
+
         ###################################################################
         ## Handling of 'start(...)' below
         ###################################################################
-        
+
         def start(self, *args, **kwargs):
             """
             Public method to start the process.
-            
+
             This method patches the arguments such, that a debug client is
             started for the Python script. A Python script is assumed, if the
             program to be started contains the string 'python'.
-            
+
             @param args arguments of the start call
             @type list
             @param kwargs keyword arguments of the start call
             @type dict
             """
             if (
-                _debugClient.debugging and
-                _debugClient.multiprocessSupport and
-                ((len(args) >= 2 and isinstance(args[1], list)) or
-                 (len(args) == 1 and not isinstance(args[0], str)) or
-                 len(args) == 0)
+                _debugClient.debugging
+                and _debugClient.multiprocessSupport
+                and (
+                    (len(args) >= 2 and isinstance(args[1], list))
+                    or (len(args) == 1 and not isinstance(args[0], str))
+                    or len(args) == 0
+                )
             ):
                 if len(args) >= 2:
                     program = args[0]
@@ -87,24 +90,23 @@
                             _debugClient,
                             [program] + arguments,
                         )
-                        super().start(
-                            newArgs[0], newArgs[1:], mode)
+                        super().start(newArgs[0], newArgs[1:], mode)
                         return
-            
+
             super().start(*args, **kwargs)
-        
+
         ###################################################################
         ## Handling of 'startDetached(...)' below
         ###################################################################
-        
+
         def startDetached(self, *args, **kwargs):
             """
             Public method to start the detached process.
-            
+
             This method patches the arguments such, that a debug client is
             started for the Python script. A Python script is assumed, if the
             program to be started contains the string 'python'.
-            
+
             @param args arguments of the start call
             @type list
             @param kwargs keyword arguments of the start call
@@ -113,19 +115,18 @@
             @rtype bool
             """
             if isinstance(self, str):
-                return QProcessWrapper.startDetachedStatic(
-                    self, *args)
+                return QProcessWrapper.startDetachedStatic(self, *args)
             else:
                 return self.__startDetached(*args, **kwargs)
-        
+
         def __startDetached(self, *args, **kwargs):
             """
             Private method to start the detached process.
-            
+
             This method patches the arguments such, that a debug client is
             started for the Python script. A Python script is assumed, if the
             program to be started contains the string 'python'.
-            
+
             @param args arguments of the start call
             @type list
             @param kwargs keyword arguments of the start call
@@ -134,30 +135,29 @@
             @rtype bool
             """
             if (
-                _debugClient.debugging and
-                _debugClient.multiprocessSupport and
-                len(args) == 0
+                _debugClient.debugging
+                and _debugClient.multiprocessSupport
+                and len(args) == 0
             ):
                 program = self.program()
                 arguments = self.arguments()
                 wd = self.workingDirectory()
-                
+
                 ok = isPythonProgram(program)
                 if ok:
-                    return QProcessWrapper.startDetachedStatic(
-                        program, arguments, wd)
-            
+                    return QProcessWrapper.startDetachedStatic(program, arguments, wd)
+
             return super().startDetached(*args, **kwargs)
-        
+
         @staticmethod
         def startDetachedStatic(*args, **kwargs):
             """
             Static method to start the detached process.
-            
+
             This method patches the arguments such, that a debug client is
             started for the Python script. A Python script is assumed, if the
             program to be started contains the string 'python'.
-            
+
             @param args arguments of the start call
             @type list
             @param kwargs keyword arguments of the start call
@@ -166,9 +166,9 @@
             @rtype bool
             """
             if (
-                _debugClient.debugging and
-                _debugClient.multiprocessSupport and
-                (len(args) >= 2 and isinstance(args[1], list))
+                _debugClient.debugging
+                and _debugClient.multiprocessSupport
+                and (len(args) >= 2 and isinstance(args[1], list))
             ):
                 program = args[0]
                 arguments = args[1]
@@ -188,10 +188,10 @@
                             [program] + arguments,
                         )
                         return QProcessWrapper._origQProcessStartDetached(
-                            newArgs[0], newArgs[1:], wd)
-            
-            return QProcessWrapper._origQProcessStartDetached(
-                *args, **kwargs)
-    
+                            newArgs[0], newArgs[1:], wd
+                        )
+
+            return QProcessWrapper._origQProcessStartDetached(*args, **kwargs)
+
     _debugClient = debugClient
     module.QProcess = QProcessWrapper
--- a/src/eric7/DebugClients/Python/SubprocessExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/SubprocessExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,10 @@
 import shlex
 
 from DebugUtilities import (
-    isPythonProgram, patchArguments, stringToArgumentsWindows,
-    isWindowsPlatform
+    isPythonProgram,
+    patchArguments,
+    stringToArgumentsWindows,
+    isWindowsPlatform,
 )
 
 _debugClient = None
@@ -22,22 +24,23 @@
 def patchSubprocess(module, debugClient):
     """
     Function to patch the subprocess module.
-    
+
     @param module reference to the imported module to be patched
     @type module
     @param debugClient reference to the debug client object
     @type DebugClient
-    """     # __IGNORE_WARNING_D234__
+    """  # __IGNORE_WARNING_D234__
     global _debugClient
-    
+
     class PopenWrapper(module.Popen):
         """
         Wrapper class for subprocess.Popen.
         """
+
         def __init__(self, arguments, *args, **kwargs):
             """
             Constructor
-            
+
             @param arguments command line arguments for the new process
             @type list of str or str
             @param args constructor arguments of Popen
@@ -46,16 +49,16 @@
             @type dict
             """
             if (
-                _debugClient.debugging and
-                _debugClient.multiprocessSupport and
-                isinstance(arguments, (str, list))
+                _debugClient.debugging
+                and _debugClient.multiprocessSupport
+                and isinstance(arguments, (str, list))
             ):
                 if isinstance(arguments, str):
                     # convert to arguments list
                     arguments = (
                         stringToArgumentsWindows(arguments)
-                        if isWindowsPlatform() else
-                        shlex.split(arguments)
+                        if isWindowsPlatform()
+                        else shlex.split(arguments)
                     )
                 else:
                     # create a copy of the arguments
@@ -67,8 +70,8 @@
                         arguments = patchArguments(
                             _debugClient, arguments, noRedirect=True
                         )
-            
+
             super().__init__(arguments, *args, **kwargs)
-    
+
     _debugClient = debugClient
     module.Popen = PopenWrapper
--- a/src/eric7/DebugClients/Python/ThreadExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/ThreadExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,19 +22,20 @@
 class ThreadExtension:
     """
     Class implementing the thread support for the debugger.
-    
+
     Provides methods for intercepting thread creation, retrieving the running
     threads and their name and state.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.threadNumber = 1
         self._original_start_new_thread = None
-        
+
         self.clientLock = threading.RLock()
-        
+
         # dictionary of all threads running {id: DebugBase}
         self.threads = {_thread.get_ident(): self}
 
@@ -42,18 +43,17 @@
         self.currentThread = self
         # the thread we are at a breakpoint continuing at next command
         self.currentThreadExec = self
-        
+
         # special objects representing the main scripts thread and frame
         self.mainThread = self
 
-    def attachThread(self, target=None, args=None, kwargs=None,
-                     mainThread=False):
+    def attachThread(self, target=None, args=None, kwargs=None, mainThread=False):
         """
         Public method to setup a standard thread for DebugClient to debug.
-        
+
         If mainThread is True, then we are attaching to the already
         started mainthread of the app and the rest of the args are ignored.
-        
+
         @param target the start function of the target thread (i.e. the user
             code)
         @param args arguments to pass to target
@@ -64,33 +64,34 @@
         """
         if kwargs is None:
             kwargs = {}
-        
+
         if mainThread:
             ident = _thread.get_ident()
-            name = 'MainThread'
+            name = "MainThread"
             newThread = self.mainThread
             newThread.isMainThread = True
             if self.debugging:
                 sys.setprofile(newThread.profile)
-            
+
         else:
             newThread = DebugBase(self)
             ident = self._original_start_new_thread(
-                newThread.bootstrap, (target, args, kwargs))
-            name = 'Thread-{0}'.format(self.threadNumber)
+                newThread.bootstrap, (target, args, kwargs)
+            )
+            name = "Thread-{0}".format(self.threadNumber)
             self.threadNumber += 1
-        
+
         newThread.id = ident
         newThread.name = name
-        
+
         self.threads[ident] = newThread
 
         return ident
-    
+
     def threadTerminated(self, threadId):
         """
         Public method called when a DebugThread has exited.
-        
+
         @param threadId id of the DebugThread that has exited
         @type int
         """
@@ -100,25 +101,25 @@
                 del self.threads[threadId]
         finally:
             self.unlockClient()
-    
+
     def lockClient(self, blocking=True):
         """
         Public method to acquire the lock for this client.
-        
+
         @param blocking flag to indicating a blocking lock
         @type bool
         @return flag indicating successful locking
         @rtype bool
         """
         return self.clientLock.acquire(blocking)
-    
+
     def unlockClient(self):
         """
         Public method to release the lock for this client.
         """
         with contextlib.suppress(RuntimeError):
             self.clientLock.release()
-    
+
     def setCurrentThread(self, threadId):
         """
         Public method to set the current thread.
@@ -134,18 +135,18 @@
                 self.currentThread = self.threads.get(threadId)
         finally:
             self.unlockClient()
-    
+
     def dumpThreadList(self):
         """
         Public method to send the list of threads.
         """
         self.updateThreadList()
-        
+
         threadList = []
         currentId = _thread.get_ident()
         # update thread names set by user (threading.setName)
         threadNames = {t.ident: t.getName() for t in threading.enumerate()}
-        
+
         for threadId, thd in self.threads.items():
             d = {"id": threadId}
             try:
@@ -153,21 +154,24 @@
                 d["broken"] = thd.isBroken
                 d["except"] = thd.isException
             except Exception:
-                d["name"] = 'UnknownThread'
+                d["name"] = "UnknownThread"
                 d["broken"] = False
                 d["except"] = False
-            
+
             threadList.append(d)
-        
-        self.sendJsonCommand("ResponseThreadList", {
-            "currentID": currentId,
-            "threadList": threadList,
-        })
-    
+
+        self.sendJsonCommand(
+            "ResponseThreadList",
+            {
+                "currentID": currentId,
+                "threadList": threadList,
+            },
+        )
+
     def getExecutedFrame(self, frame):
         """
         Public method to return the currently executed frame.
-        
+
         @param frame the current frame
         @type frame object
         @return the frame which is excecuted (without debugger frames)
@@ -178,13 +182,18 @@
         while frame is not None:
             baseName = os.path.basename(frame.f_code.co_filename)
             if not baseName.startswith(
-                    ('DebugClientBase.py', 'DebugBase.py', 'AsyncFile.py',
-                     'ThreadExtension.py')):
+                (
+                    "DebugClientBase.py",
+                    "DebugBase.py",
+                    "AsyncFile.py",
+                    "ThreadExtension.py",
+                )
+            ):
                 break
             frame = frame.f_back
-        
+
         return frame
-    
+
     def updateThreadList(self):
         """
         Public method to update the list of running threads.
@@ -192,86 +201,89 @@
         frames = sys._current_frames()
         for threadId, frame in frames.items():
             # skip our own timer thread
-            if frame.f_code.co_name == '__eventPollTimer':
+            if frame.f_code.co_name == "__eventPollTimer":
                 continue
-            
+
             # Unknown thread
             if threadId not in self.threads:
                 newThread = DebugBase(self)
-                name = 'Thread-{0}'.format(self.threadNumber)
+                name = "Thread-{0}".format(self.threadNumber)
                 self.threadNumber += 1
-                
+
                 newThread.id = threadId
                 newThread.name = name
                 self.threads[threadId] = newThread
-            
+
             # adjust current frame
             if "__pypy__" not in sys.builtin_module_names:
                 # Don't update with None
                 currentFrame = self.getExecutedFrame(frame)
-                if (currentFrame is not None and
-                        self.threads[threadId].isBroken is False):
+                if (
+                    currentFrame is not None
+                    and self.threads[threadId].isBroken is False
+                ):
                     self.threads[threadId].currentFrame = currentFrame
-        
+
         # Clean up obsolet because terminated threads
-        self.threads = {id_: thrd for id_, thrd in self.threads.items()
-                        if id_ in frames}
-    
+        self.threads = {
+            id_: thrd for id_, thrd in self.threads.items() if id_ in frames
+        }
+
     #######################################################################
     ## Methods below deal with patching various modules to support
     ## debugging of threads.
     #######################################################################
-    
+
     def patchPyThread(self, module):
         """
         Public method to patch Python _thread module.
-        
+
         @param module reference to the imported module to be patched
         @type module
         """
         # make thread hooks available to system
         self._original_start_new_thread = module.start_new_thread
         module.start_new_thread = self.attachThread
-    
+
     def patchGreenlet(self, module):
         """
         Public method to patch the 'greenlet' module.
-        
+
         @param module reference to the imported module to be patched
         @type module
         @return flag indicating that the module was processed
         @rtype bool
         """
         # Check for greenlet.settrace
-        if hasattr(module, 'settrace'):
+        if hasattr(module, "settrace"):
             DebugBase.pollTimerEnabled = False
             return True
         return False
-    
+
     def patchPyThreading(self, module):
         """
         Public method to patch the Python threading module.
-        
+
         @param module reference to the imported module to be patched
         @type module
         """
         # _debugClient as a class attribute can't be accessed in following
         # class. Therefore we need a global variable.
         _debugClient = self
-        
+
         def _bootstrap(self, run):
             """
             Bootstrap for threading, which reports exceptions correctly.
-            
+
             @param run the run method of threading.Thread
             @type method pointer
             """
             newThread = DebugBase(_debugClient)
             newThread.name = self.name
-            
+
             _debugClient.threads[self.ident] = newThread
             _debugClient.dumpThreadList()
-            
+
             # see DebugBase.bootstrap
             sys.settrace(newThread.trace_dispatch)
             try:
@@ -282,11 +294,12 @@
             finally:
                 sys.settrace(None)
                 _debugClient.dumpThreadList()
-        
+
         class ThreadWrapper(module.Thread):
             """
             Wrapper class for threading.Thread.
             """
+
             def __init__(self, *args, **kwargs):
                 """
                 Constructor
@@ -294,44 +307,45 @@
                 # Overwrite the provided run method with our own, to
                 # intercept the thread creation by threading.Thread
                 self.run = lambda s=self, run=self.run: _bootstrap(s, run)
-                
+
                 super().__init__(*args, **kwargs)
-        
+
         module.Thread = ThreadWrapper
-        
+
         # Special handling of threading.(_)Timer
         timer = module.Timer
-            
+
         class TimerWrapper(timer, ThreadWrapper):
             """
             Wrapper class for threading.(_)Timer.
             """
+
             def __init__(self, interval, function, *args, **kwargs):
                 """
                 Constructor
                 """
-                super().__init__(
-                    interval, function, *args, **kwargs)
-        
+                super().__init__(interval, function, *args, **kwargs)
+
         module.Timer = TimerWrapper
-    
+
         # Special handling of threading._DummyThread
         class DummyThreadWrapper(module._DummyThread, ThreadWrapper):
             """
             Wrapper class for threading._DummyThread.
             """
+
             def __init__(self, *args, **kwargs):
                 """
                 Constructor
                 """
                 super().__init__(*args, **kwargs)
-        
+
         module._DummyThread = DummyThreadWrapper
-    
+
     def patchQThread(self, module):
         """
         Public method to patch the QtCore module's QThread.
-        
+
         @param module reference to the imported module to be patched
         @type module
         """
@@ -342,24 +356,24 @@
         def _bootstrapQThread(self, run):
             """
             Bootstrap for QThread, which reports exceptions correctly.
-            
+
             @param run the run method of *.QThread
             @type method pointer
             """
             global _qtThreadNumber
-            
+
             newThread = DebugBase(_debugClient)
             ident = _thread.get_ident()
-            name = 'QtThread-{0}'.format(_qtThreadNumber)
-            
+            name = "QtThread-{0}".format(_qtThreadNumber)
+
             _qtThreadNumber += 1
-            
+
             newThread.id = ident
             newThread.name = name
-            
+
             _debugClient.threads[ident] = newThread
             _debugClient.dumpThreadList()
-            
+
             # see DebugBase.bootstrap
             sys.settrace(newThread.trace_dispatch)
             try:
@@ -373,36 +387,36 @@
             finally:
                 sys.settrace(None)
                 _debugClient.dumpThreadList()
-    
+
         class QThreadWrapper(module.QThread):
             """
             Wrapper class for *.QThread.
             """
+
             def __init__(self, *args, **kwargs):
                 """
                 Constructor
                 """
                 # Overwrite the provided run method with our own, to
                 # intercept the thread creation by Qt
-                self.run = lambda s=self, run=self.run: (
-                    _bootstrapQThread(s, run))
-                
+                self.run = lambda s=self, run=self.run: (_bootstrapQThread(s, run))
+
                 super().__init__(*args, **kwargs)
-        
+
         class QRunnableWrapper(module.QRunnable):
             """
             Wrapper class for *.QRunnable.
             """
+
             def __init__(self, *args, **kwargs):
                 """
                 Constructor
                 """
                 # Overwrite the provided run method with our own, to
                 # intercept the thread creation by Qt
-                self.run = lambda s=self, run=self.run: (
-                    _bootstrapQThread(s, run))
-                
+                self.run = lambda s=self, run=self.run: (_bootstrapQThread(s, run))
+
                 super().__init__(*args, **kwargs)
-        
+
         module.QThread = QThreadWrapper
         module.QRunnable = QRunnableWrapper
--- a/src/eric7/DebugClients/Python/eric7dbgstub.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/eric7dbgstub.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,17 +16,17 @@
 debugger = None
 __scriptname = None
 
-modDir = sysconfig.get_path('platlib')
-ericpath = os.getenv('ERICDIR', getConfig('ericDir'))
+modDir = sysconfig.get_path("platlib")
+ericpath = os.getenv("ERICDIR", getConfig("ericDir"))
 
 if ericpath not in sys.path:
     sys.path.insert(-1, ericpath)
-    
+
 
 def initDebugger(kind="standard"):
     """
     Module function to initialize a debugger for remote debugging.
-    
+
     @param kind type of debugger ("standard" or "threads")
     @return flag indicating success (boolean)
     @exception ValueError raised to indicate a wrong debugger kind
@@ -36,43 +36,43 @@
     try:
         if kind == "standard":
             import DebugClient
+
             debugger = DebugClient.DebugClient()
         else:
             raise ValueError
     except ImportError:
         debugger = None
         res = False
-        
+
     return res
 
 
 def runcall(func, *args):
     """
     Module function mimicing the Pdb interface.
-    
+
     @param func function to be called (function object)
     @param *args arguments being passed to func
     @return the function result
     """
     global debugger, __scriptname
     return debugger.run_call(__scriptname, func, *args)
-    
+
 
 def setScriptname(name):
     """
     Module function to set the scriptname to be reported back to the IDE.
-    
+
     @param name absolute pathname of the script (string)
     """
     global __scriptname
     __scriptname = name
 
 
-def startDebugger(enableTrace=True, exceptions=True,
-                  tracePython=False, redirect=True):
+def startDebugger(enableTrace=True, exceptions=True, tracePython=False, redirect=True):
     """
     Module function used to start the remote debugger.
-    
+
     @param enableTrace flag to enable the tracing function (boolean)
     @param exceptions flag to enable exception reporting of the IDE
         (boolean)
@@ -83,5 +83,9 @@
     """
     global debugger
     if debugger:
-        debugger.startDebugger(enableTrace=enableTrace, exceptions=exceptions,
-                               tracePython=tracePython, redirect=redirect)
+        debugger.startDebugger(
+            enableTrace=enableTrace,
+            exceptions=exceptions,
+            tracePython=tracePython,
+            redirect=redirect,
+        )
--- a/src/eric7/DebugClients/Python/getpass.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DebugClients/Python/getpass.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,28 +22,29 @@
 
     First try various environment variables, then the password
     database.  This works on Windows as long as USERNAME is set.
-    
+
     @return username
     @rtype str
     """
     # this is copied from the original getpass.py
-    
+
     import os
 
-    for name in ('LOGNAME', 'USER', 'LNAME', 'USERNAME'):
+    for name in ("LOGNAME", "USER", "LNAME", "USERNAME"):
         user = os.environ.get(name)
         if user:
             return user
 
     # If this fails, the exception will "explain" why
     import pwd
+
     return pwd.getpwuid(os.getuid())[0]
 
 
-def getpass(prompt='Password: ', stream=None):
+def getpass(prompt="Password: ", stream=None):
     """
     Function to prompt for a password, with echo turned off.
-    
+
     @param prompt Prompt to be shown to the user
     @type str
     @param stream input stream to read from (ignored)
@@ -51,7 +52,7 @@
     @return Password entered by the user
     @rtype str
     """
-    return input(prompt, False)     # secok
+    return input(prompt, False)  # secok
 
 
 unix_getpass = getpass
--- a/src/eric7/Debugger/BreakPointModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/BreakPointModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,58 +16,60 @@
 class BreakPointModel(QAbstractItemModel):
     """
     Class implementing a custom model for breakpoints.
-    
+
     @signal dataAboutToBeChanged(QModelIndex, QModelIndex) emitted to indicate
         a change of the data
     """
+
     dataAboutToBeChanged = pyqtSignal(QModelIndex, QModelIndex)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent reference to the parent widget
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__project = project
-        
+
         self.breakpoints = []
         self.header = [
             self.tr("Filename"),
             self.tr("Line"),
-            self.tr('Condition'),
-            self.tr('Temporary'),
-            self.tr('Enabled'),
-            self.tr('Ignore Count'),
+            self.tr("Condition"),
+            self.tr("Temporary"),
+            self.tr("Enabled"),
+            self.tr("Ignore Count"),
         ]
-        self.alignments = [Qt.AlignmentFlag.AlignLeft,
-                           Qt.AlignmentFlag.AlignRight,
-                           Qt.AlignmentFlag.AlignLeft,
-                           Qt.AlignmentFlag.AlignHCenter,
-                           Qt.AlignmentFlag.AlignHCenter,
-                           Qt.AlignmentFlag.AlignRight,
-                           Qt.AlignmentFlag.AlignHCenter,
-                           ]
+        self.alignments = [
+            Qt.AlignmentFlag.AlignLeft,
+            Qt.AlignmentFlag.AlignRight,
+            Qt.AlignmentFlag.AlignLeft,
+            Qt.AlignmentFlag.AlignHCenter,
+            Qt.AlignmentFlag.AlignHCenter,
+            Qt.AlignmentFlag.AlignRight,
+            Qt.AlignmentFlag.AlignHCenter,
+        ]
 
     def columnCount(self, parent=None):
         """
         Public method to get the current column count.
-        
+
         @param parent reference to parent index (Unused)
         @type QModelIndex
         @return column count
         @rtype int
         """
         return len(self.header)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the current row count.
-        
+
         @param parent reference to parent index
         @type QModelIndex
         @return row count
@@ -78,11 +80,11 @@
             return len(self.breakpoints)
         else:
             return 0
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the requested data.
-        
+
         @param index index of the requested data
         @type QModelIndex
         @param role role of the requested data
@@ -92,7 +94,7 @@
         """
         if not index.isValid():
             return None
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if index.column() == 0:
                 filename = self.breakpoints[index.row()][0]
@@ -102,34 +104,27 @@
                     return filename
             elif index.column() in (1, 2, 5):
                 return self.breakpoints[index.row()][index.column()]
-        
-        if (
-            role == Qt.ItemDataRole.CheckStateRole and
-            index.column() in (3, 4)
-        ):
+
+        if role == Qt.ItemDataRole.CheckStateRole and index.column() in (3, 4):
             if self.breakpoints[index.row()][index.column()]:
                 return Qt.CheckState.Checked
             else:
                 return Qt.CheckState.Unchecked
-        
-        if (
-            role == Qt.ItemDataRole.ToolTipRole and
-            index.column() in (0, 2)
-        ):
+
+        if role == Qt.ItemDataRole.ToolTipRole and index.column() in (0, 2):
             return self.breakpoints[index.row()][index.column()]
-        
-        if (
-            role == Qt.ItemDataRole.TextAlignmentRole and
-            index.column() < len(self.alignments)
+
+        if role == Qt.ItemDataRole.TextAlignmentRole and index.column() < len(
+            self.alignments
         ):
             return self.alignments[index.column()].value
-        
+
         return None
-    
+
     def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
         """
         Public method to change data in the model.
-        
+
         @param index index of the changed data
         @type QModelIndex
         @param value value of the changed data
@@ -139,20 +134,22 @@
         @return flag indicating success
         @rtype bool
         """
-        if (not index.isValid() or
-            index.column() >= len(self.header) or
-                index.row() >= len(self.breakpoints)):
+        if (
+            not index.isValid()
+            or index.column() >= len(self.header)
+            or index.row() >= len(self.breakpoints)
+        ):
             return False
-        
+
         self.dataAboutToBeChanged.emit(index, index)
         self.breakpoints[index.row()][index.column()] = value
         self.dataChanged.emit(index, index)
         return True
-    
+
     def flags(self, index):
         """
         Public method to get item flags.
-        
+
         @param index index of the requested flags
         @type QModelIndex
         @return item flags for the given index
@@ -160,14 +157,13 @@
         """
         if not index.isValid():
             return Qt.ItemFlag.ItemIsEnabled
-        
+
         return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get header data.
-        
+
         @param section section number of the requested header data
         @type int
         @param orientation orientation of the header
@@ -178,20 +174,20 @@
         @rtype str
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             if section >= len(self.header):
                 return ""
             else:
                 return self.header[section]
-        
+
         return None
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number for the index
         @type int
         @param column column number for the index
@@ -201,28 +197,32 @@
         @return requested index
         @rtype QModelIndex
         """
-        if ((parent and parent.isValid()) or
-            row < 0 or row >= len(self.breakpoints) or
-                column < 0 or column >= len(self.header)):
+        if (
+            (parent and parent.isValid())
+            or row < 0
+            or row >= len(self.breakpoints)
+            or column < 0
+            or column >= len(self.header)
+        ):
             return QModelIndex()
-        
+
         return self.createIndex(row, column, self.breakpoints[row])
 
     def parent(self, index):
         """
         Public method to get the parent index.
-        
+
         @param index index of item to get parent
         @type QModelIndex
         @return index of parent
         @rtype QModelIndex
         """
         return QModelIndex()
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check for the presence of child items.
-        
+
         @param parent index of parent item
         @type QModelIndex
         @return flag indicating the presence of child items
@@ -232,13 +232,13 @@
             return len(self.breakpoints) > 0
         else:
             return False
-    
+
     ###########################################################################
-    
+
     def addBreakPoint(self, fn, line, properties):
         """
         Public method to add a new breakpoint to the list.
-        
+
         @param fn filename of the breakpoint
         @type str
         @param line line number of the breakpoint
@@ -252,11 +252,11 @@
         self.beginInsertRows(QModelIndex(), cnt, cnt)
         self.breakpoints.append(bp)
         self.endInsertRows()
-    
+
     def addBreakPoints(self, breakpoints):
         """
         Public method to add multiple breakpoints to the list.
-        
+
         @param breakpoints list of breakpoints with file name, line number,
             condition, temporary flag, enabled flag and ignore count each
         @type list of (str, int, str, bool, bool, int)
@@ -265,11 +265,11 @@
         self.beginInsertRows(QModelIndex(), cnt, cnt + len(breakpoints) - 1)
         self.breakpoints += breakpoints
         self.endInsertRows()
-    
+
     def setBreakPointByIndex(self, index, fn, line, properties):
         """
         Public method to set the values of a breakpoint given by index.
-        
+
         @param index index of the breakpoint
         @type QModelIndex
         @param fn filename of the breakpoint
@@ -284,7 +284,8 @@
             row = index.row()
             index1 = self.createIndex(row, 0, self.breakpoints[row])
             index2 = self.createIndex(
-                row, len(self.breakpoints[row]) - 1, self.breakpoints[row])
+                row, len(self.breakpoints[row]) - 1, self.breakpoints[row]
+            )
             self.dataAboutToBeChanged.emit(index1, index2)
             self.breakpoints[row] = [fn, line] + list(properties)
             self.dataChanged.emit(index1, index2)
@@ -292,7 +293,7 @@
     def setBreakPointEnabledByIndex(self, index, enabled):
         """
         Public method to set the enabled state of a breakpoint given by index.
-        
+
         @param index index of the breakpoint
         @type QModelIndex
         @param enabled flag giving the enabled state
@@ -305,11 +306,11 @@
             self.dataAboutToBeChanged.emit(index1, index1)
             self.breakpoints[row][col] = enabled
             self.dataChanged.emit(index1, index1)
-    
+
     def deleteBreakPointByIndex(self, index):
         """
         Public method to set the values of a breakpoint given by index.
-        
+
         @param index index of the breakpoint
         @type QModelIndex
         """
@@ -322,7 +323,7 @@
     def deleteBreakPoints(self, idxList):
         """
         Public method to delete a list of breakpoints given by their indexes.
-        
+
         @param idxList list of breakpoint indexes
         @type list of QModelIndex
         """
@@ -349,7 +350,7 @@
     def getBreakPointByIndex(self, index):
         """
         Public method to get the values of a breakpoint given by index.
-        
+
         @param index index of the breakpoint
         @type QModelIndex
         @return breakpoint (list of six values (filename, line number,
@@ -360,21 +361,21 @@
             return self.breakpoints[index.row()][:]  # return a copy
         else:
             return []
-    
+
     def getAllBreakpoints(self):
         """
         Public method to get a copy of the breakpoints.
-        
+
         @return list of breakpoints
         @rtype list of list of [str, int, str, bool, bool, int]
         """
         return copy.deepcopy(self.breakpoints)
-    
+
     def getBreakPointIndex(self, fn, lineno):
         """
         Public method to get the index of a breakpoint given by filename and
         line number.
-        
+
         @param fn filename of the breakpoint
         @type str
         @param lineno line number of the breakpoint
@@ -386,13 +387,13 @@
             bp = self.breakpoints[row]
             if bp[0] == fn and bp[1] == lineno:
                 return self.createIndex(row, 0, self.breakpoints[row])
-        
+
         return QModelIndex()
-    
+
     def isBreakPointTemporaryByIndex(self, index):
         """
         Public method to test, if a breakpoint given by its index is temporary.
-        
+
         @param index index of the breakpoint to test
         @type QModelIndex
         @return flag indicating a temporary breakpoint
--- a/src/eric7/Debugger/BreakPointViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/BreakPointViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,12 +9,8 @@
 
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, Qt, QItemSelectionModel, QSortFilterProxyModel
-)
-from PyQt6.QtWidgets import (
-    QTreeView, QAbstractItemView, QHeaderView, QMenu, QDialog
-)
+from PyQt6.QtCore import pyqtSignal, Qt, QItemSelectionModel, QSortFilterProxyModel
+from PyQt6.QtWidgets import QTreeView, QAbstractItemView, QHeaderView, QMenu, QDialog
 
 from EricWidgets.EricApplication import ericApp
 
@@ -26,71 +22,70 @@
 class BreakPointViewer(QTreeView):
     """
     Class implementing the Breakpoint viewer widget.
-    
+
     Breakpoints will be shown with all their details. They can be modified
     through the context menu of this widget.
-    
+
     @signal sourceFile(str, int) emitted to show the source of a breakpoint
     """
+
     sourceFile = pyqtSignal(str, int)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent the parent (QWidget)
         """
         super().__init__(parent)
         self.setObjectName("BreakPointViewer")
-        
+
         self.__model = None
-        
+
         self.setItemsExpandable(False)
         self.setRootIsDecorated(False)
         self.setAlternatingRowColors(True)
-        self.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
-        
+        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+
         self.setWindowTitle(self.tr("Breakpoints"))
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.doubleClicked.connect(self.__doubleClicked)
-        
+
         self.__createPopupMenus()
-        
+
     def setModel(self, model):
         """
         Public slot to set the breakpoint model.
-        
+
         @param model reference to the breakpoint model
         @type BreakPointModel
         """
         self.__model = model
-        
+
         self.sortingModel = QSortFilterProxyModel()
         self.sortingModel.setDynamicSortFilter(True)
         self.sortingModel.setSourceModel(self.__model)
         super().setModel(self.sortingModel)
-        
+
         header = self.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(True)
         header.setSectionsClickable(True)
-        
+
         self.setSortingEnabled(True)
-        
+
         self.__layoutDisplay()
-        
+
     def __layoutDisplay(self):
         """
         Private slot to perform a layout operation.
         """
         self.__resizeColumns()
         self.__resort()
-        
+
     def __resizeColumns(self):
         """
         Private slot to resize the view when items get added, edited or
@@ -98,40 +93,41 @@
         """
         self.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.header().setStretchLastSection(True)
-    
+
     def __resort(self):
         """
         Private slot to resort the tree.
         """
-        self.model().sort(self.header().sortIndicatorSection(),
-                          self.header().sortIndicatorOrder())
-        
+        self.model().sort(
+            self.header().sortIndicatorSection(), self.header().sortIndicatorOrder()
+        )
+
     def __toSourceIndex(self, index):
         """
         Private slot to convert an index to a source index.
-        
+
         @param index index to be converted
         @type QModelIndex
         @return mapped index
         @rtype QModelIndex
         """
         return self.sortingModel.mapToSource(index)
-        
+
     def __fromSourceIndex(self, sindex):
         """
         Private slot to convert a source index to an index.
-        
+
         @param sindex source index to be converted
         @type QModelIndex
         @return mapped index
         @rtype QModelIndex
         """
         return self.sortingModel.mapFromSource(sindex)
-        
+
     def __setRowSelected(self, index, selected=True):
         """
         Private slot to select a complete row.
-        
+
         @param index index determining the row to be selected
         @type QModelIndex
         @param selected flag indicating the action
@@ -139,16 +135,20 @@
         """
         if not index.isValid():
             return
-        
+
         flags = (
-            (QItemSelectionModel.SelectionFlag.ClearAndSelect |
-             QItemSelectionModel.SelectionFlag.Rows)
-            if selected else
-            (QItemSelectionModel.SelectionFlag.Deselect |
-             QItemSelectionModel.SelectionFlag.Rows)
+            (
+                QItemSelectionModel.SelectionFlag.ClearAndSelect
+                | QItemSelectionModel.SelectionFlag.Rows
+            )
+            if selected
+            else (
+                QItemSelectionModel.SelectionFlag.Deselect
+                | QItemSelectionModel.SelectionFlag.Rows
+            )
         )
         self.selectionModel().select(index, flags)
-        
+
     def __createPopupMenus(self):
         """
         Private method to generate the popup menus.
@@ -161,16 +161,14 @@
         self.menu.addAction(self.tr("Enable all"), self.__enableAllBreaks)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Disable"), self.__disableBreak)
-        self.menu.addAction(self.tr("Disable all"),
-                            self.__disableAllBreaks)
+        self.menu.addAction(self.tr("Disable all"), self.__disableAllBreaks)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Delete"), self.__deleteBreak)
         self.menu.addAction(self.tr("Delete all"), self.__deleteAllBreaks)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Goto"), self.__showSource)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr("Clear Histories"),
-                            self.clearHistories)
+        self.menu.addAction(self.tr("Clear Histories"), self.clearHistories)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Configure..."), self.__configure)
 
@@ -178,17 +176,16 @@
         self.backMenu = QMenu()
         self.backMenu.addAction(self.tr("Add"), self.__addBreak)
         self.backMenuActions["EnableAll"] = self.backMenu.addAction(
-            self.tr("Enable all"),
-            self.__enableAllBreaks)
+            self.tr("Enable all"), self.__enableAllBreaks
+        )
         self.backMenuActions["DisableAll"] = self.backMenu.addAction(
-            self.tr("Disable all"),
-            self.__disableAllBreaks)
+            self.tr("Disable all"), self.__disableAllBreaks
+        )
         self.backMenuActions["DeleteAll"] = self.backMenu.addAction(
-            self.tr("Delete all"),
-            self.__deleteAllBreaks)
+            self.tr("Delete all"), self.__deleteAllBreaks
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr("Clear Histories"),
-                                self.clearHistories)
+        self.backMenu.addAction(self.tr("Clear Histories"), self.clearHistories)
         self.backMenu.addSeparator()
         self.backMenu.addAction(self.tr("Configure..."), self.__configure)
         self.backMenu.aboutToShow.connect(self.__showBackMenu)
@@ -196,30 +193,29 @@
         self.multiMenu = QMenu()
         self.multiMenu.addAction(self.tr("Add"), self.__addBreak)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Enable selected"),
-                                 self.__enableSelectedBreaks)
-        self.multiMenu.addAction(self.tr("Enable all"),
-                                 self.__enableAllBreaks)
+        self.multiMenu.addAction(
+            self.tr("Enable selected"), self.__enableSelectedBreaks
+        )
+        self.multiMenu.addAction(self.tr("Enable all"), self.__enableAllBreaks)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Disable selected"),
-                                 self.__disableSelectedBreaks)
-        self.multiMenu.addAction(self.tr("Disable all"),
-                                 self.__disableAllBreaks)
+        self.multiMenu.addAction(
+            self.tr("Disable selected"), self.__disableSelectedBreaks
+        )
+        self.multiMenu.addAction(self.tr("Disable all"), self.__disableAllBreaks)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Delete selected"),
-                                 self.__deleteSelectedBreaks)
-        self.multiMenu.addAction(self.tr("Delete all"),
-                                 self.__deleteAllBreaks)
+        self.multiMenu.addAction(
+            self.tr("Delete selected"), self.__deleteSelectedBreaks
+        )
+        self.multiMenu.addAction(self.tr("Delete all"), self.__deleteAllBreaks)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Clear Histories"),
-                                 self.clearHistories)
+        self.multiMenu.addAction(self.tr("Clear Histories"), self.clearHistories)
         self.multiMenu.addSeparator()
         self.multiMenu.addAction(self.tr("Configure..."), self.__configure)
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         """
@@ -236,47 +232,53 @@
             self.menu.popup(coord)
         else:
             self.backMenu.popup(coord)
-    
+
     def __clearSelection(self):
         """
         Private slot to clear the selection.
         """
         for index in self.selectedIndexes():
             self.__setRowSelected(index, False)
-            
+
     def __addBreak(self):
         """
         Private slot to handle the add breakpoint context menu entry.
         """
         from .EditBreakpointDialog import EditBreakpointDialog
-        
+
         fnHistory, condHistory = self.__loadRecent()
-        
-        dlg = EditBreakpointDialog((fnHistory[0], None), None,
-                                   condHistory, self, modal=1,
-                                   addMode=1, filenameHistory=fnHistory)
+
+        dlg = EditBreakpointDialog(
+            (fnHistory[0], None),
+            None,
+            condHistory,
+            self,
+            modal=1,
+            addMode=1,
+            filenameHistory=fnHistory,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             fn, line, cond, temp, enabled, count = dlg.getAddData()
             if fn is not None:
                 if fn in fnHistory:
                     fnHistory.remove(fn)
                 fnHistory.insert(0, fn)
-            
+
             if cond:
                 if cond in condHistory:
                     condHistory.remove(cond)
                 condHistory.insert(0, cond)
-            
+
             self.__saveRecent(fnHistory, condHistory)
-            
+
             self.__model.addBreakPoint(fn, line, (cond, temp, enabled, count))
             self.__resizeColumns()
             self.__resort()
-    
+
     def __doubleClicked(self, index):
         """
         Private slot to handle the double clicked signal.
-        
+
         @param index index of the entry that was double clicked
         @type QModelIndex
         """
@@ -285,7 +287,7 @@
             bp = self.__model.getBreakPointByIndex(sindex)
             if not bp:
                 return
-            
+
             fn, line = bp[:2]
             self.sourceFile.emit(fn, line)
 
@@ -296,11 +298,11 @@
         index = self.currentIndex()
         if index.isValid():
             self.__editBreakpoint(index)
-    
+
     def __editBreakpoint(self, index):
         """
         Private slot to edit a breakpoint.
-        
+
         @param index index of breakpoint to be edited
         @type QModelIndex
         """
@@ -309,32 +311,34 @@
             bp = self.__model.getBreakPointByIndex(sindex)
             if not bp:
                 return
-            
+
             fn, line, cond, temp, enabled, count = bp[:6]
             fnHistory, condHistory = self.__loadRecent()
-            
+
             from .EditBreakpointDialog import EditBreakpointDialog
+
             dlg = EditBreakpointDialog(
-                (fn, line), (cond, temp, enabled, count),
-                condHistory, self, modal=True)
+                (fn, line), (cond, temp, enabled, count), condHistory, self, modal=True
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 cond, temp, enabled, count = dlg.getData()
                 if cond:
                     if cond in condHistory:
                         condHistory.remove(cond)
                     condHistory.insert(0, cond)
-                    
+
                     self.__saveRecent(fnHistory, condHistory)
-                
+
                 self.__model.setBreakPointByIndex(
-                    sindex, fn, line, (cond, temp, enabled, count))
+                    sindex, fn, line, (cond, temp, enabled, count)
+                )
                 self.__resizeColumns()
                 self.__resort()
 
     def __setBpEnabled(self, index, enabled):
         """
         Private method to set the enabled status of a breakpoint.
-        
+
         @param index index of breakpoint to be enabled/disabled
         @type QModelIndex
         @param enabled flag indicating the enabled status to be set
@@ -343,7 +347,7 @@
         sindex = self.__toSourceIndex(index)
         if sindex.isValid():
             self.__model.setBreakPointEnabledByIndex(sindex, enabled)
-        
+
     def __enableBreak(self):
         """
         Private slot to handle the enable breakpoint context menu entry.
@@ -414,7 +418,7 @@
         sindex = self.__toSourceIndex(index)
         if sindex.isValid():
             self.__model.deleteBreakPointByIndex(sindex)
-        
+
     def __deleteAllBreaks(self):
         """
         Private slot to handle the delete all breakpoints context menu entry.
@@ -442,14 +446,14 @@
         bp = self.__model.getBreakPointByIndex(sindex)
         if not bp:
             return
-        
+
         fn, line = bp[:2]
         self.sourceFile.emit(fn, line)
-    
+
     def highlightBreakpoint(self, fn, lineno):
         """
         Public slot to handle the clientLine signal.
-        
+
         @param fn filename of the breakpoint
         @type str
         @param lineno line number of the breakpoint
@@ -458,18 +462,18 @@
         sindex = self.__model.getBreakPointIndex(fn, lineno)
         if sindex.isValid():
             return
-        
+
         index = self.__fromSourceIndex(sindex)
         if index.isValid():
             self.__clearSelection()
             self.__setRowSelected(index, True)
-    
+
     def handleResetUI(self):
         """
         Public slot to reset the breakpoint viewer.
         """
         self.__clearSelection()
-    
+
     def __showBackMenu(self):
         """
         Private slot to handle the aboutToShow signal of the background menu.
@@ -486,57 +490,54 @@
     def __getSelectedItemsCount(self):
         """
         Private method to get the count of items selected.
-        
+
         @return count of items selected
         @rtype int
         """
         count = len(self.selectedIndexes()) // (self.__model.columnCount() - 1)
         # column count is 1 greater than selectable
         return count
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "debuggerGeneralPage")
-    
+        ericApp().getObject("UserInterface").showPreferences("debuggerGeneralPage")
+
     def __loadRecent(self):
         """
         Private method to load the recently used file names and breakpoint
         conditions.
-        
+
         @return tuple containing the recently used file names and breakpoint
             conditions
         @rtype tuple of (list of str, list of str)
         """
         Preferences.Prefs.rsettings.sync()
-        
+
         # load recently used file names
         fnHistory = []
-        fnHistory.append('')
+        fnHistory.append("")
         rs = Preferences.Prefs.rsettings.value(recentNameBreakpointFiles)
         if rs is not None:
-            recent = [f
-                      for f in Preferences.toList(rs)
-                      if pathlib.Path(f).exists()]
-            fnHistory.extend(
-                recent[:Preferences.getDebugger("RecentNumber")])
-        
+            recent = [f for f in Preferences.toList(rs) if pathlib.Path(f).exists()]
+            fnHistory.extend(recent[: Preferences.getDebugger("RecentNumber")])
+
         # load recently entered condition expressions
         condHistory = []
         rs = Preferences.Prefs.rsettings.value(recentNameBreakpointConditions)
         if rs is not None:
             condHistory = Preferences.toList(rs)[
-                :Preferences.getDebugger("RecentNumber")]
-        
+                : Preferences.getDebugger("RecentNumber")
+            ]
+
         return fnHistory, condHistory
-    
+
     def __saveRecent(self, fnHistory, condHistory):
         """
         Private method to save the list of recently used file names and
         breakpoint conditions.
-        
+
         @param fnHistory list of recently used file names
         @type list of str
         @param condHistory list of recently used breakpoint conditions
@@ -544,10 +545,11 @@
         """
         recent = [f for f in fnHistory if f]
         Preferences.Prefs.rsettings.setValue(recentNameBreakpointFiles, recent)
-        Preferences.Prefs.rsettings.setValue(recentNameBreakpointConditions,
-                                             condHistory)
+        Preferences.Prefs.rsettings.setValue(
+            recentNameBreakpointConditions, condHistory
+        )
         Preferences.Prefs.rsettings.sync()
-    
+
     def clearHistories(self):
         """
         Public method to clear the recently used file names and breakpoint
--- a/src/eric7/Debugger/CallStackViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/CallStackViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,12 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt
 from PyQt6.QtWidgets import (
-    QTreeWidget, QTreeWidgetItem, QMenu, QWidget, QVBoxLayout, QLabel
+    QTreeWidget,
+    QTreeWidgetItem,
+    QMenu,
+    QWidget,
+    QVBoxLayout,
+    QLabel,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -21,92 +26,93 @@
 class CallStackViewer(QWidget):
     """
     Class implementing the Call Stack viewer widget.
-    
+
     @signal sourceFile(str, int) emitted to show the source of a stack entry
     @signal frameSelected(int) emitted to signal the selection of a frame entry
     """
+
     sourceFile = pyqtSignal(str, int)
     frameSelected = pyqtSignal(int)
-    
+
     FilenameRole = Qt.ItemDataRole.UserRole + 1
     LinenoRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, debugServer, parent=None):
         """
         Constructor
-        
+
         @param debugServer reference to the debug server object
         @type DebugServer
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__layout = QVBoxLayout(self)
         self.setLayout(self.__layout)
         self.__debuggerLabel = QLabel(self)
         self.__layout.addWidget(self.__debuggerLabel)
         self.__callStackList = QTreeWidget(self)
         self.__layout.addWidget(self.__callStackList)
-        
+
         self.__callStackList.setHeaderHidden(True)
         self.__callStackList.setAlternatingRowColors(True)
         self.__callStackList.setItemsExpandable(False)
         self.__callStackList.setRootIsDecorated(False)
         self.setWindowTitle(self.tr("Call Stack"))
-        
+
         self.__menu = QMenu(self.__callStackList)
         self.__sourceAct = self.__menu.addAction(
-            self.tr("Show source"), self.__openSource)
+            self.tr("Show source"), self.__openSource
+        )
         self.__menu.addAction(self.tr("Clear"), self.__callStackList.clear)
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Save"), self.__saveStackTrace)
         self.__callStackList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.__callStackList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+            Qt.ContextMenuPolicy.CustomContextMenu
+        )
+        self.__callStackList.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.__dbs = debugServer
-        
+
         # file name, line number, function name, arguments
         self.__entryFormat = self.tr("File: {0}\nLine: {1}\n{2}{3}")
         # file name, line number
         self.__entryFormatShort = self.tr("File: {0}\nLine: {1}")
-        
+
         self.__projectMode = False
         self.__project = None
-        
+
         self.__dbs.clientStack.connect(self.__showCallStack)
-        self.__callStackList.itemDoubleClicked.connect(
-            self.__itemDoubleClicked)
-    
+        self.__callStackList.itemDoubleClicked.connect(self.__itemDoubleClicked)
+
     def setDebugger(self, debugUI):
         """
         Public method to set a reference to the Debug UI.
-        
+
         @param debugUI reference to the DebugUI object
         @type DebugUI
         """
         debugUI.clientStack.connect(self.__showCallStack)
-    
+
     def setProjectMode(self, enabled):
         """
         Public slot to set the call trace viewer to project mode.
-        
+
         In project mode the call trace info is shown with project relative
         path names.
-        
+
         @param enabled flag indicating to enable the project mode
         @type bool
         """
         self.__projectMode = enabled
         if enabled and self.__project is None:
             self.__project = ericApp().getObject("Project")
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         """
@@ -114,18 +120,18 @@
             itm = self.__callStackList.currentItem()
             self.__sourceAct.setEnabled(itm is not None)
             self.__menu.popup(self.__callStackList.mapToGlobal(coord))
-    
+
     def clear(self):
         """
         Public method to clear the stack viewer data.
         """
         self.__debuggerLabel.clear()
         self.__callStackList.clear()
-    
+
     def __showCallStack(self, stack, debuggerId):
         """
         Private slot to show the call stack of the program being debugged.
-        
+
         @param stack list of tuples with call stack data (file name,
             line number, function name, formatted argument/values list)
         @type list of tuples of (str, str, str, str)
@@ -133,36 +139,35 @@
         @type str
         """
         self.__debuggerLabel.setText(debuggerId)
-        
+
         self.__callStackList.clear()
         for fname, fline, ffunc, fargs in stack:
             dfname = (
-                self.__project.getRelativePath(fname)
-                if self.__projectMode else
-                fname
+                self.__project.getRelativePath(fname) if self.__projectMode else fname
             )
             itm = (
                 # use normal format
                 QTreeWidgetItem(
                     self.__callStackList,
-                    [self.__entryFormat.format(dfname, fline, ffunc, fargs)]
+                    [self.__entryFormat.format(dfname, fline, ffunc, fargs)],
                 )
-                if ffunc and not ffunc.startswith("<") else
+                if ffunc and not ffunc.startswith("<")
+                else
                 # use short format
                 QTreeWidgetItem(
                     self.__callStackList,
-                    [self.__entryFormatShort.format(dfname, fline)]
+                    [self.__entryFormatShort.format(dfname, fline)],
                 )
             )
             itm.setData(0, self.FilenameRole, fname)
             itm.setData(0, self.LinenoRole, fline)
-        
+
         self.__callStackList.resizeColumnToContents(0)
-    
+
     def __itemDoubleClicked(self, itm):
         """
         Private slot to handle a double click of a stack entry.
-        
+
         @param itm reference to the double clicked item
         @type QTreeWidgetItem
         """
@@ -171,10 +176,10 @@
         if self.__projectMode:
             fname = self.__project.getAbsolutePath(fname)
         self.sourceFile.emit(fname, fline)
-        
+
         index = self.__callStackList.indexOfTopLevelItem(itm)
         self.frameSelected.emit(index)
-    
+
     def __openSource(self):
         """
         Private slot to show the source for the selected stack entry.
@@ -182,7 +187,7 @@
         itm = self.__callStackList.currentItem()
         if itm:
             self.__itemDoubleClicked(itm)
-    
+
     def __saveStackTrace(self):
         """
         Private slot to save the stack trace info to a file.
@@ -194,7 +199,8 @@
                 "",
                 self.tr("Text Files (*.txt);;All Files (*)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -205,15 +211,19 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Call Stack Info"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 try:
                     title = self.tr("Call Stack of '{0}'").format(
-                        self.__debuggerLabel.text())
+                        self.__debuggerLabel.text()
+                    )
                     with fpath.open("w", encoding="utf-8") as f:
                         f.write("{0}\n".format(title))
                         f.write("{0}\n\n".format(len(title) * "="))
@@ -226,7 +236,9 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Error saving Call Stack Info"),
-                        self.tr("""<p>The call stack info could not be"""
-                                """ written to <b>{0}</b></p>"""
-                                """<p>Reason: {1}</p>""")
-                        .format(fpath, str(err)))
+                        self.tr(
+                            """<p>The call stack info could not be"""
+                            """ written to <b>{0}</b></p>"""
+                            """<p>Reason: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
--- a/src/eric7/Debugger/CallTraceViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/CallTraceViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,16 +25,17 @@
 class CallTraceViewer(QWidget, Ui_CallTraceViewer):
     """
     Class implementing the Call Trace viewer widget.
-    
+
     @signal sourceFile(str, int) emitted to show the source of a call/return
         point
     """
+
     sourceFile = pyqtSignal(str, int)
-    
+
     def __init__(self, debugServer, debugViewer, parent=None):
         """
         Constructor
-        
+
         @param debugServer reference to the debug server object
         @type DebugServer
         @param debugViewer reference to the debug viewer object
@@ -44,93 +45,92 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__dbs = debugServer
         self.__debugViewer = debugViewer
-        
-        self.startTraceButton.setIcon(
-            UI.PixmapCache.getIcon("callTraceStart"))
-        self.stopTraceButton.setIcon(
-            UI.PixmapCache.getIcon("callTraceStop"))
+
+        self.startTraceButton.setIcon(UI.PixmapCache.getIcon("callTraceStart"))
+        self.stopTraceButton.setIcon(UI.PixmapCache.getIcon("callTraceStop"))
         self.resizeButton.setIcon(UI.PixmapCache.getIcon("resizeColumns"))
         self.clearButton.setIcon(UI.PixmapCache.getIcon("editDelete"))
         self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSave"))
-        
-        self.__headerItem = QTreeWidgetItem(
-            ["", self.tr("From"), self.tr("To")])
+
+        self.__headerItem = QTreeWidgetItem(["", self.tr("From"), self.tr("To")])
         self.__headerItem.setIcon(0, UI.PixmapCache.getIcon("callReturn"))
         self.callTrace.setHeaderItem(self.__headerItem)
-        
+
         self.__callStack = []
-        
+
         self.__entryFormat = "{0}:{1} ({2})"
         self.__entryRe = re.compile(r"""(.+):(\d+)\s\((.*)\)""")
-        
+
         self.__projectMode = False
         self.__project = None
         self.__tracedDebuggerId = ""
-        
+
         stopOnExit = Preferences.toBool(
-            Preferences.getSettings().value("CallTrace/StopOnExit", True))
+            Preferences.getSettings().value("CallTrace/StopOnExit", True)
+        )
         self.stopCheckBox.setChecked(stopOnExit)
-        
-        self.__callTraceEnabled = (Preferences.toBool(
-            Preferences.getSettings().value("CallTrace/Enabled", False)) and
-            not stopOnExit)
-        
+
+        self.__callTraceEnabled = (
+            Preferences.toBool(
+                Preferences.getSettings().value("CallTrace/Enabled", False)
+            )
+            and not stopOnExit
+        )
+
         if self.__callTraceEnabled:
             self.startTraceButton.setEnabled(False)
         else:
             self.stopTraceButton.setEnabled(False)
-        
+
         self.__dbs.callTraceInfo.connect(self.__addCallTraceInfo)
         self.__dbs.clientExit.connect(self.__clientExit)
-    
+
     def __setCallTraceEnabled(self, enabled):
         """
         Private slot to set the call trace enabled status.
-        
+
         @param enabled flag indicating the new state
         @type bool
         """
         if enabled:
-            self.__tracedDebuggerId = (
-                self.__debugViewer.getSelectedDebuggerId()
-            )
+            self.__tracedDebuggerId = self.__debugViewer.getSelectedDebuggerId()
         self.__dbs.setCallTraceEnabled(self.__tracedDebuggerId, enabled)
         self.stopTraceButton.setEnabled(enabled)
         self.startTraceButton.setEnabled(not enabled)
         self.__callTraceEnabled = enabled
         Preferences.getSettings().setValue("CallTrace/Enabled", enabled)
-        
+
         if not enabled:
             for column in range(self.callTrace.columnCount()):
                 self.callTrace.resizeColumnToContents(column)
-    
+
     @pyqtSlot(bool)
     def on_stopCheckBox_clicked(self, checked):
         """
         Private slot to handle a click on the stop check box.
-        
+
         @param checked state of the check box
         @type bool
         """
         Preferences.getSettings().setValue("CallTrace/StopOnExit", checked)
-    
+
     @pyqtSlot()
     def on_startTraceButton_clicked(self):
         """
         Private slot to start call tracing.
         """
         self.__setCallTraceEnabled(True)
-    
+
     @pyqtSlot()
     def on_stopTraceButton_clicked(self):
         """
         Private slot to start call tracing.
         """
         self.__setCallTraceEnabled(False)
-    
+
     @pyqtSlot()
     def on_resizeButton_clicked(self):
         """
@@ -138,14 +138,14 @@
         """
         for column in range(self.callTrace.columnCount()):
             self.callTrace.resizeColumnToContents(column)
-    
+
     @pyqtSlot()
     def on_clearButton_clicked(self):
         """
         Private slot to clear the call trace.
         """
         self.clear()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -158,7 +158,8 @@
                 "",
                 self.tr("Text Files (*.txt);;All Files (*)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -169,15 +170,19 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Call Trace Info"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 try:
                     title = self.tr("Call Trace Info of '{0}'").format(
-                        self.__tracedDebuggerId)
+                        self.__tracedDebuggerId
+                    )
                     with fpath.open("w", encoding="utf-8") as f:
                         f.write("{0}\n".format(title))
                         f.write("{0}\n\n".format(len(title) * "="))
@@ -185,24 +190,28 @@
                         while itm is not None:
                             isCall = itm.data(0, Qt.ItemDataRole.UserRole)
                             call = "->" if isCall else "<-"
-                            f.write("{0} {1} || {2}\n".format(
-                                call,
-                                itm.text(1), itm.text(2)))
+                            f.write(
+                                "{0} {1} || {2}\n".format(
+                                    call, itm.text(1), itm.text(2)
+                                )
+                            )
                             itm = self.callTrace.itemBelow(itm)
                 except OSError as err:
                     EricMessageBox.critical(
                         self,
                         self.tr("Error saving Call Trace Info"),
-                        self.tr("""<p>The call trace info could not"""
-                                """ be written to <b>{0}</b></p>"""
-                                """<p>Reason: {1}</p>""")
-                        .format(fpath, str(err)))
-    
+                        self.tr(
+                            """<p>The call trace info could not"""
+                            """ be written to <b>{0}</b></p>"""
+                            """<p>Reason: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_callTrace_itemDoubleClicked(self, item, column):
         """
         Private slot to open the double clicked file in an editor.
-        
+
         @param item reference to the double clicked item
         @type QTreeWidgetItem
         @param column column that was double clicked
@@ -221,33 +230,42 @@
                 if self.__projectMode:
                     filename = self.__project.getAbsolutePath(filename)
                 self.sourceFile.emit(filename, lineno)
-    
+
     def clear(self):
         """
         Public slot to clear the call trace info.
         """
         self.callTrace.clear()
         self.__callStack = []
-    
+
     def setProjectMode(self, enabled):
         """
         Public slot to set the call trace viewer to project mode.
-        
+
         In project mode the call trace info is shown with project relative
         path names.
-        
+
         @param enabled flag indicating to enable the project mode
         @type bool
         """
         self.__projectMode = enabled
         if enabled and self.__project is None:
             self.__project = ericApp().getObject("Project")
-    
-    def __addCallTraceInfo(self, isCall, fromFile, fromLine, fromFunction,
-                           toFile, toLine, toFunction, debuggerId):
+
+    def __addCallTraceInfo(
+        self,
+        isCall,
+        fromFile,
+        fromLine,
+        fromFunction,
+        toFile,
+        toLine,
+        toFunction,
+        debuggerId,
+    ):
         """
         Private method to add an entry to the call trace viewer.
-        
+
         @param isCall flag indicating a 'call'
         @type bool
         @param fromFile name of the originating file
@@ -270,42 +288,44 @@
                 icon = UI.PixmapCache.getIcon("forward")
             else:
                 icon = UI.PixmapCache.getIcon("back")
-            parentItem = (
-                self.__callStack[-1] if self.__callStack else self.callTrace)
-            
+            parentItem = self.__callStack[-1] if self.__callStack else self.callTrace
+
             if self.__projectMode:
                 fromFile = self.__project.getRelativePath(fromFile)
                 toFile = self.__project.getRelativePath(toFile)
-            
+
             itm = QTreeWidgetItem(
                 parentItem,
-                ["",
-                 self.__entryFormat.format(fromFile, fromLine, fromFunction),
-                 self.__entryFormat.format(toFile, toLine, toFunction)])
+                [
+                    "",
+                    self.__entryFormat.format(fromFile, fromLine, fromFunction),
+                    self.__entryFormat.format(toFile, toLine, toFunction),
+                ],
+            )
             itm.setIcon(0, icon)
             itm.setData(0, Qt.ItemDataRole.UserRole, isCall)
             itm.setExpanded(True)
-            
+
             if isCall:
                 self.__callStack.append(itm)
             else:
                 if self.__callStack:
                     self.__callStack.pop(-1)
-    
+
     def isCallTraceEnabled(self):
         """
         Public method to get the state of the call trace function.
-        
+
         @return flag indicating the state of the call trace function
         @rtype bool
         """
         return self.__callTraceEnabled
-    
+
     @pyqtSlot(str, int, str, bool, str)
     def __clientExit(self, program, status, message, quiet, debuggerId):
         """
         Private slot to handle a debug client terminating.
-        
+
         @param program name of the exited program
         @type str
         @param status exit code of the debugged program
--- a/src/eric7/Debugger/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,44 +11,43 @@
 
 # Variable type definitions
 ConfigVarTypeDispStrings = {
-    '__': QT_TRANSLATE_NOOP('Variable Types', 'Hidden Attributes'),
-    'NoneType': QT_TRANSLATE_NOOP('Variable Types', 'None'),
-    'bool': QT_TRANSLATE_NOOP('Variable Types', 'Boolean'),
-    'int': QT_TRANSLATE_NOOP('Variable Types', 'Integer'),
-    'float': QT_TRANSLATE_NOOP('Variable Types', 'Float'),
-    'complex': QT_TRANSLATE_NOOP('Variable Types', 'Complex'),
-    'str': QT_TRANSLATE_NOOP('Variable Types', 'String'),
-    'tuple': QT_TRANSLATE_NOOP('Variable Types', 'Tuple'),
-    'list': QT_TRANSLATE_NOOP('Variable Types', 'List/Array'),
-    'dict': QT_TRANSLATE_NOOP('Variable Types', 'Dictionary/Hash/Map'),
-    'dict-proxy': QT_TRANSLATE_NOOP('Variable Types', 'Dictionary Proxy'),
-    'set': QT_TRANSLATE_NOOP('Variable Types', 'Set'),
-    'frozenset': QT_TRANSLATE_NOOP('Variable Types', 'Frozen Set'),
-    'file': QT_TRANSLATE_NOOP('Variable Types', 'File'),
-    'range': QT_TRANSLATE_NOOP('Variable Types', 'Range'),
-    'slice': QT_TRANSLATE_NOOP('Variable Types', 'Slice'),
-    'buffer': QT_TRANSLATE_NOOP('Variable Types', 'Buffer'),
-    'class': QT_TRANSLATE_NOOP('Variable Types', 'Class'),
-    'instance': QT_TRANSLATE_NOOP('Variable Types', 'Class Instance'),
-    'method': QT_TRANSLATE_NOOP('Variable Types', 'Class Method'),
-    'property': QT_TRANSLATE_NOOP('Variable Types', 'Class Property'),
-    'generator': QT_TRANSLATE_NOOP('Variable Types', 'Generator'),
-    'function': QT_TRANSLATE_NOOP('Variable Types', 'Function'),
-    'builtin_function_or_method':
-        QT_TRANSLATE_NOOP('Variable Types', 'Builtin Function'),
-    'code': QT_TRANSLATE_NOOP('Variable Types', 'Code'),
-    'module': QT_TRANSLATE_NOOP('Variable Types', 'Module'),
-    'ellipsis': QT_TRANSLATE_NOOP('Variable Types', 'Ellipsis'),
-    'traceback': QT_TRANSLATE_NOOP('Variable Types', 'Traceback'),
-    'frame': QT_TRANSLATE_NOOP('Variable Types', 'Frame'),
-    'bytes': QT_TRANSLATE_NOOP('Variable Types', 'Bytes'),
-    "special_attributes": QT_TRANSLATE_NOOP(
-        'Variable Types', "Special Attributes"),
-    'dict_items': QT_TRANSLATE_NOOP('Variable Types', 'Dict. Items View'),
-    'dict_keys': QT_TRANSLATE_NOOP('Variable Types', 'Dict. Keys View'),
-    'dict_values': QT_TRANSLATE_NOOP('Variable Types', 'Dict. Values View'),
-    'async_generator': QT_TRANSLATE_NOOP('Variable Types',
-                                         'Asynchronous Generator'),
-    'coroutine': QT_TRANSLATE_NOOP('Variable Types', 'Coroutine'),
-    'mappingproxy': QT_TRANSLATE_NOOP('Variable Types', 'Mapping Proxy'),
+    "__": QT_TRANSLATE_NOOP("Variable Types", "Hidden Attributes"),
+    "NoneType": QT_TRANSLATE_NOOP("Variable Types", "None"),
+    "bool": QT_TRANSLATE_NOOP("Variable Types", "Boolean"),
+    "int": QT_TRANSLATE_NOOP("Variable Types", "Integer"),
+    "float": QT_TRANSLATE_NOOP("Variable Types", "Float"),
+    "complex": QT_TRANSLATE_NOOP("Variable Types", "Complex"),
+    "str": QT_TRANSLATE_NOOP("Variable Types", "String"),
+    "tuple": QT_TRANSLATE_NOOP("Variable Types", "Tuple"),
+    "list": QT_TRANSLATE_NOOP("Variable Types", "List/Array"),
+    "dict": QT_TRANSLATE_NOOP("Variable Types", "Dictionary/Hash/Map"),
+    "dict-proxy": QT_TRANSLATE_NOOP("Variable Types", "Dictionary Proxy"),
+    "set": QT_TRANSLATE_NOOP("Variable Types", "Set"),
+    "frozenset": QT_TRANSLATE_NOOP("Variable Types", "Frozen Set"),
+    "file": QT_TRANSLATE_NOOP("Variable Types", "File"),
+    "range": QT_TRANSLATE_NOOP("Variable Types", "Range"),
+    "slice": QT_TRANSLATE_NOOP("Variable Types", "Slice"),
+    "buffer": QT_TRANSLATE_NOOP("Variable Types", "Buffer"),
+    "class": QT_TRANSLATE_NOOP("Variable Types", "Class"),
+    "instance": QT_TRANSLATE_NOOP("Variable Types", "Class Instance"),
+    "method": QT_TRANSLATE_NOOP("Variable Types", "Class Method"),
+    "property": QT_TRANSLATE_NOOP("Variable Types", "Class Property"),
+    "generator": QT_TRANSLATE_NOOP("Variable Types", "Generator"),
+    "function": QT_TRANSLATE_NOOP("Variable Types", "Function"),
+    "builtin_function_or_method": QT_TRANSLATE_NOOP(
+        "Variable Types", "Builtin Function"
+    ),
+    "code": QT_TRANSLATE_NOOP("Variable Types", "Code"),
+    "module": QT_TRANSLATE_NOOP("Variable Types", "Module"),
+    "ellipsis": QT_TRANSLATE_NOOP("Variable Types", "Ellipsis"),
+    "traceback": QT_TRANSLATE_NOOP("Variable Types", "Traceback"),
+    "frame": QT_TRANSLATE_NOOP("Variable Types", "Frame"),
+    "bytes": QT_TRANSLATE_NOOP("Variable Types", "Bytes"),
+    "special_attributes": QT_TRANSLATE_NOOP("Variable Types", "Special Attributes"),
+    "dict_items": QT_TRANSLATE_NOOP("Variable Types", "Dict. Items View"),
+    "dict_keys": QT_TRANSLATE_NOOP("Variable Types", "Dict. Keys View"),
+    "dict_values": QT_TRANSLATE_NOOP("Variable Types", "Dict. Values View"),
+    "async_generator": QT_TRANSLATE_NOOP("Variable Types", "Asynchronous Generator"),
+    "coroutine": QT_TRANSLATE_NOOP("Variable Types", "Coroutine"),
+    "mappingproxy": QT_TRANSLATE_NOOP("Variable Types", "Mapping Proxy"),
 }
--- a/src/eric7/Debugger/DebugClientCapabilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebugClientCapabilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,5 +14,6 @@
 HasCompleter = 0x0010
 HasShell = 0x0020
 
-HasAll = (HasDebugger | HasInterpreter | HasProfiler | HasCoverage |
-          HasCompleter | HasShell)
+HasAll = (
+    HasDebugger | HasInterpreter | HasProfiler | HasCoverage | HasCompleter | HasShell
+)
--- a/src/eric7/Debugger/DebugServer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebugServer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 import contextlib
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, QModelIndex
-from PyQt6.QtNetwork import (
-    QTcpServer, QHostAddress, QHostInfo, QNetworkInterface
-)
+from PyQt6.QtNetwork import QTcpServer, QHostAddress, QHostInfo, QNetworkInterface
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox
@@ -35,7 +33,7 @@
 class DebugServer(QTcpServer):
     """
     Class implementing the debug server embedded within the IDE.
-    
+
     @signal clientProcessStdout(str) emitted after the client has sent some
         output via stdout
     @signal clientProcessStderr(str) emitted after the client has sent some
@@ -109,6 +107,7 @@
     @signal clientDebuggerId(debuggerId) emitted to indicate a newly connected
         debugger backend
     """
+
     clientClearBreak = pyqtSignal(str, int, str)
     clientClearWatch = pyqtSignal(str, str)
     clientGone = pyqtSignal(bool)
@@ -118,7 +117,7 @@
     clientOutput = pyqtSignal(str)
     clientLine = pyqtSignal(str, int, str, str, bool)
     clientStack = pyqtSignal(list, str, str)
-    clientThreadList = pyqtSignal('PyQt_PyObject', list, str)
+    clientThreadList = pyqtSignal("PyQt_PyObject", list, str)
     clientThreadSet = pyqtSignal(str)
     clientVariables = pyqtSignal(int, list, str)
     clientVariable = pyqtSignal(int, list, str)
@@ -142,12 +141,17 @@
     passiveDebugStarted = pyqtSignal(str, bool)
     callTraceInfo = pyqtSignal(bool, str, str, str, str, str, str, str)
     appendStdout = pyqtSignal(str)
-    
-    def __init__(self, originalPathString, preventPassiveDebugging=False,
-                 project=None, parent=None):
+
+    def __init__(
+        self,
+        originalPathString,
+        preventPassiveDebugging=False,
+        project=None,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param originalPathString original PATH environment variable
         @type str
         @param preventPassiveDebugging flag overriding the PassiveDbgEnabled
@@ -159,9 +163,9 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__originalPathString = originalPathString
-        
+
         self.__debuggerInterfaces = {}
         # the interface name is the key, a function to get the
         # registration data is the value
@@ -171,19 +175,21 @@
         # function reference to create the debugger interface (see
         # __createDebuggerInterface() below) and the interface name is
         # the value
-        
+
         # create our models
         self.breakpointModel = BreakPointModel(project, self)
         self.watchpointModel = WatchPointModel(self)
         self.watchSpecialCreated = self.tr(
-            "created", "must be same as in EditWatchpointDialog")
+            "created", "must be same as in EditWatchpointDialog"
+        )
         self.watchSpecialChanged = self.tr(
-            "changed", "must be same as in EditWatchpointDialog")
-        
+            "changed", "must be same as in EditWatchpointDialog"
+        )
+
         # arrays to track already reported issues
         self.__reportedBreakpointIssues = []
         self.__reportedWatchpointIssues = []
-        
+
         self.networkInterface = Preferences.getDebugger("NetworkInterface")
         if self.networkInterface == "all":
             hostAddress = QHostAddress("0.0.0.0")
@@ -193,11 +199,12 @@
             # QHostAddress.SpecialAddress.AnyIPv6)
         else:
             hostAddress = QHostAddress(self.networkInterface)
-        self.networkInterfaceName, self.networkInterfaceIndex = (
-            self.__getNetworkInterfaceAndIndex(self.networkInterface))
-        
-        if (not preventPassiveDebugging and
-                Preferences.getDebugger("PassiveDbgEnabled")):
+        (
+            self.networkInterfaceName,
+            self.networkInterfaceIndex,
+        ) = self.__getNetworkInterfaceAndIndex(self.networkInterface)
+
+        if not preventPassiveDebugging and Preferences.getDebugger("PassiveDbgEnabled"):
             sock = Preferences.getDebugger("PassiveDbgPort")  # default: 42424
             self.listen(hostAddress, sock)
             self.passive = True
@@ -207,49 +214,49 @@
                 hostAddress.setScopeId(self.networkInterfaceName)
             self.listen(hostAddress)
             self.passive = False
-        
+
         self.debuggerInterface = None
         self.debugging = False
         self.running = False
         self.clientProcess = None
         self.clientInterpreter = ""
-        self.clientType = Preferences.getSettings().value('DebugClient/Type')
+        self.clientType = Preferences.getSettings().value("DebugClient/Type")
         if self.clientType is None:
-            self.clientType = 'Python3'
-        
-        self.lastClientType = ''
+            self.clientType = "Python3"
+
+        self.lastClientType = ""
         self.__autoClearShell = False
         self.__forProject = False
-        
+
         self.clientClearBreak.connect(self.__clientClearBreakPoint)
         self.clientClearWatch.connect(self.__clientClearWatchPoint)
         self.newConnection.connect(self.__newConnection)
-        
-        self.breakpointModel.rowsAboutToBeRemoved.connect(
-            self.__deleteBreakPoints)
+
+        self.breakpointModel.rowsAboutToBeRemoved.connect(self.__deleteBreakPoints)
         self.breakpointModel.dataAboutToBeChanged.connect(
-            self.__breakPointDataAboutToBeChanged)
+            self.__breakPointDataAboutToBeChanged
+        )
         self.breakpointModel.dataChanged.connect(self.__changeBreakPoints)
         self.breakpointModel.rowsInserted.connect(self.__addBreakPoints)
-        
-        self.watchpointModel.rowsAboutToBeRemoved.connect(
-            self.__deleteWatchPoints)
+
+        self.watchpointModel.rowsAboutToBeRemoved.connect(self.__deleteWatchPoints)
         self.watchpointModel.dataAboutToBeChanged.connect(
-            self.__watchPointDataAboutToBeChanged)
+            self.__watchPointDataAboutToBeChanged
+        )
         self.watchpointModel.dataChanged.connect(self.__changeWatchPoints)
         self.watchpointModel.rowsInserted.connect(self.__addWatchPoints)
-        
+
         self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize")
-        
+
         self.__multiprocessNoDebugList = []
-        
+
         self.__registerDebuggerInterfaces()
-    
+
     def getHostAddress(self, localhost):
         """
         Public method to get the IP address or hostname the debug server is
         listening.
-        
+
         @param localhost flag indicating to return the address for localhost
         @type bool
         @return IP address or hostname
@@ -266,14 +273,13 @@
             else:
                 return "{0}@@v6".format(QHostInfo.localHostName())
         else:
-            return "{0}@@i{1}".format(self.networkInterface,
-                                      self.networkInterfaceIndex)
-    
+            return "{0}@@i{1}".format(self.networkInterface, self.networkInterfaceIndex)
+
     def __getNetworkInterfaceAndIndex(self, address):
         """
         Private method to determine the network interface and the interface
         index.
-        
+
         @param address address to determine the info for
         @type str
         @return tuple of network interface name and index
@@ -284,34 +290,38 @@
                 addressEntries = networkInterface.addressEntries()
                 if len(addressEntries) > 0:
                     for addressEntry in addressEntries:
-                        if (addressEntry.ip().toString().lower() ==
-                                address.lower()):
-                            return (networkInterface.humanReadableName(),
-                                    networkInterface.index())
-        
+                        if addressEntry.ip().toString().lower() == address.lower():
+                            return (
+                                networkInterface.humanReadableName(),
+                                networkInterface.index(),
+                            )
+
         return "", 0
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
         """
         registeredInterfaces = {}
         for interfaceName in self.__debuggerInterfaces:
-            registeredInterfaces[interfaceName] = (
-                self.__debuggerInterfaces[interfaceName])
-        
+            registeredInterfaces[interfaceName] = self.__debuggerInterfaces[
+                interfaceName
+            ]
+
         self.__debuggerInterfaceRegistry = {}
         for interfaceName, getRegistryData in registeredInterfaces.items():
-            self.registerDebuggerInterface(interfaceName, getRegistryData,
-                                           reregister=True)
-        
+            self.registerDebuggerInterface(
+                interfaceName, getRegistryData, reregister=True
+            )
+
         self.__maxVariableSize = Preferences.getDebugger("MaxVariableSize")
-    
-    def registerDebuggerInterface(self, interfaceName, getRegistryData,
-                                  reregister=False):
+
+    def registerDebuggerInterface(
+        self, interfaceName, getRegistryData, reregister=False
+    ):
         """
         Public method to register a debugger interface.
-        
+
         @param interfaceName name of the debugger interface
         @type str
         @param getRegistryData reference to a function to be called
@@ -327,41 +337,53 @@
             EricMessageBox.warning(
                 None,
                 self.tr("Register Debugger Interface"),
-                self.tr("""<p>The debugger interface <b>{0}</b> has already"""
-                        """ been registered. Ignoring this request.</p>"""))
+                self.tr(
+                    """<p>The debugger interface <b>{0}</b> has already"""
+                    """ been registered. Ignoring this request.</p>"""
+                ),
+            )
             return
-        
+
         if not reregister:
             self.__debuggerInterfaces[interfaceName] = getRegistryData
         registryDataList = getRegistryData()
         if registryDataList:
-            for (clientLanguage, clientCapabilities, clientExtensions,
-                 interfaceCreator) in registryDataList:
+            for (
+                clientLanguage,
+                clientCapabilities,
+                clientExtensions,
+                interfaceCreator,
+            ) in registryDataList:
                 self.__debuggerInterfaceRegistry[clientLanguage] = [
-                    clientCapabilities, clientExtensions, interfaceCreator,
-                    interfaceName]
-    
+                    clientCapabilities,
+                    clientExtensions,
+                    interfaceCreator,
+                    interfaceName,
+                ]
+
     def unregisterDebuggerInterface(self, interfaceName):
         """
         Public method to unregister a debugger interface.
-        
+
         @param interfaceName interfaceName of the debugger interface
         @type str
         """
         if interfaceName in self.__debuggerInterfaces:
             clientLanguages = []
-            for clientLanguage, registryData in (
-                    self.__debuggerInterfaceRegistry.items()):
+            for (
+                clientLanguage,
+                registryData,
+            ) in self.__debuggerInterfaceRegistry.items():
                 if interfaceName == registryData[-1]:
                     clientLanguages.append(clientLanguage)
             for clientLanguage in clientLanguages:
                 del self.__debuggerInterfaceRegistry[clientLanguage]
             del self.__debuggerInterfaces[interfaceName]
-    
+
     def __findLanguageForExtension(self, ext):
         """
         Private method to get the language associated with a file extension.
-        
+
         @param ext file extension
         @type str
         @return associated language
@@ -370,9 +392,9 @@
         for language in self.__debuggerInterfaceRegistry:
             if ext in self.__debuggerInterfaceRegistry[language][1]:
                 return language
-        
+
         return ""
-    
+
     def __registerDebuggerInterfaces(self):
         """
         Private method to register the available internal debugger interfaces.
@@ -380,16 +402,16 @@
         for name, interface in DebuggerInterfaces.items():
             modName = "Debugger.{0}".format(interface)
             mod = __import__(modName)
-            components = modName.split('.')
+            components = modName.split(".")
             for comp in components[1:]:
                 mod = getattr(mod, comp)
-            
+
             self.registerDebuggerInterface(name, mod.getRegistryData)
-    
+
     def getSupportedLanguages(self, shellOnly=False):
         """
         Public slot to return the supported programming languages.
-        
+
         @param shellOnly flag indicating only languages supporting an
             interactive shell should be returned
         @type bool
@@ -399,18 +421,21 @@
         languages = list(self.__debuggerInterfaceRegistry.keys())
         with contextlib.suppress(ValueError):
             languages.remove("None")
-        
+
         if shellOnly:
-            languages = [lang for lang in languages
-                         if self.__debuggerInterfaceRegistry[lang][0] &
-                         DebugClientCapabilities.HasShell]
-        
+            languages = [
+                lang
+                for lang in languages
+                if self.__debuggerInterfaceRegistry[lang][0]
+                & DebugClientCapabilities.HasShell
+            ]
+
         return languages[:]
-    
+
     def getExtensions(self, language):
         """
         Public slot to get the extensions associated with the given language.
-        
+
         @param language language to get extensions for
         @type str
         @return tuple of extensions associated with the language
@@ -420,11 +445,11 @@
             return tuple(self.__debuggerInterfaceRegistry[language][1])
         else:
             return ()
-    
+
     def __createDebuggerInterface(self, clientType=None):
         """
         Private slot to create the debugger interface object.
-        
+
         @param clientType type of the client interface to be created
         @type str
         """
@@ -432,33 +457,39 @@
             if clientType is None:
                 clientType = self.clientType
             if clientType in self.__debuggerInterfaceRegistry:
-                self.debuggerInterface = (
-                    self.__debuggerInterfaceRegistry[clientType][2](
-                        self, self.passive))
+                self.debuggerInterface = self.__debuggerInterfaceRegistry[clientType][
+                    2
+                ](self, self.passive)
             else:
-                self.debuggerInterface = (
-                    self.__debuggerInterfaceRegistry["None"][2](
-                        self, self.passive))
+                self.debuggerInterface = self.__debuggerInterfaceRegistry["None"][2](
+                    self, self.passive
+                )
                 self.clientType = "None"
-    
+
     def __setClientType(self, clType):
         """
         Private method to set the client type.
-        
+
         @param clType type of client to be started
         @type str
         """
         if clType is not None and clType in self.getSupportedLanguages():
             self.clientType = clType
-            Preferences.getSettings().setValue(
-                'DebugClient/Type', self.clientType)
-    
-    def startClient(self, unplanned=True, clType=None, forProject=False,
-                    runInConsole=False, venvName="", workingDir=None,
-                    configOverride=None):
+            Preferences.getSettings().setValue("DebugClient/Type", self.clientType)
+
+    def startClient(
+        self,
+        unplanned=True,
+        clType=None,
+        forProject=False,
+        runInConsole=False,
+        venvName="",
+        workingDir=None,
+        configOverride=None,
+    ):
         """
         Public method to start a debug client.
-        
+
         @param unplanned flag indicating that the client has died
         @type bool
         @param clType type of client to be started
@@ -477,23 +508,23 @@
         @type dict
         """
         self.running = False
-        
+
         if (
-            (not self.passive or not self.passiveClientExited) and
-            self.debuggerInterface and
-            self.debuggerInterface.isConnected()
+            (not self.passive or not self.passiveClientExited)
+            and self.debuggerInterface
+            and self.debuggerInterface.isConnected()
         ):
             self.shutdownServer()
             self.debugging = False
             self.clientGone.emit(unplanned and self.debugging)
-        
+
         if clType:
             if clType not in self.getSupportedLanguages():
                 # a not supported client language was requested
                 return
-            
+
             self.__setClientType(clType)
-        
+
         # only start the client, if we are not in passive mode
         if not self.passive:
             if self.clientProcess:
@@ -504,36 +535,59 @@
                     self.clientProcess.waitForFinished(1000)
                     self.clientProcess.deleteLater()
                 self.clientProcess = None
-            
+
             self.__forProject = forProject
             self.__createDebuggerInterface()
             if forProject:
                 project = ericApp().getObject("Project")
                 if not project.isDebugPropertiesLoaded():
-                    self.clientProcess, isNetworked, clientInterpreter = (
-                        self.debuggerInterface.startRemote(
-                            self.serverPort(), runInConsole, venvName,
-                            self.__originalPathString, workingDir=workingDir,
-                            configOverride=configOverride))
+                    (
+                        self.clientProcess,
+                        isNetworked,
+                        clientInterpreter,
+                    ) = self.debuggerInterface.startRemote(
+                        self.serverPort(),
+                        runInConsole,
+                        venvName,
+                        self.__originalPathString,
+                        workingDir=workingDir,
+                        configOverride=configOverride,
+                    )
                 else:
-                    self.clientProcess, isNetworked, clientInterpreter = (
-                        self.debuggerInterface.startRemoteForProject(
-                            self.serverPort(), runInConsole, venvName,
-                            self.__originalPathString, workingDir=workingDir,
-                            configOverride=configOverride))
+                    (
+                        self.clientProcess,
+                        isNetworked,
+                        clientInterpreter,
+                    ) = self.debuggerInterface.startRemoteForProject(
+                        self.serverPort(),
+                        runInConsole,
+                        venvName,
+                        self.__originalPathString,
+                        workingDir=workingDir,
+                        configOverride=configOverride,
+                    )
             else:
-                self.clientProcess, isNetworked, clientInterpreter = (
-                    self.debuggerInterface.startRemote(
-                        self.serverPort(), runInConsole, venvName,
-                        self.__originalPathString, workingDir=workingDir,
-                        configOverride=configOverride))
-            
+                (
+                    self.clientProcess,
+                    isNetworked,
+                    clientInterpreter,
+                ) = self.debuggerInterface.startRemote(
+                    self.serverPort(),
+                    runInConsole,
+                    venvName,
+                    self.__originalPathString,
+                    workingDir=workingDir,
+                    configOverride=configOverride,
+                )
+
             if self.clientProcess:
                 self.clientProcess.readyReadStandardError.connect(
-                    self.__clientProcessError)
+                    self.__clientProcessError
+                )
                 self.clientProcess.readyReadStandardOutput.connect(
-                    self.__clientProcessOutput)
-                
+                    self.__clientProcessOutput
+                )
+
                 # Perform actions necessary, if client type has changed
                 if self.lastClientType != self.clientType:
                     self.lastClientType = self.clientType
@@ -547,34 +601,38 @@
         else:
             self.__createDebuggerInterface("None")
             clientInterpreter = ""
-        
+
         if clientInterpreter != self.clientInterpreter:
             self.clientInterpreter = clientInterpreter
             self.clientInterpreterChanged.emit(clientInterpreter)
-    
+
     def __clientProcessOutput(self):
         """
         Private slot to process client output received via stdout.
         """
-        output = str(self.clientProcess.readAllStandardOutput(),
-                     Preferences.getSystem("IOEncoding"),
-                     'replace')
+        output = str(
+            self.clientProcess.readAllStandardOutput(),
+            Preferences.getSystem("IOEncoding"),
+            "replace",
+        )
         self.clientProcessStdout.emit(output)
-    
+
     def __clientProcessError(self):
         """
         Private slot to process client output received via stderr.
         """
-        error = str(self.clientProcess.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+        error = str(
+            self.clientProcess.readAllStandardError(),
+            Preferences.getSystem("IOEncoding"),
+            "replace",
+        )
         self.clientProcessStderr.emit(error)
-    
+
     @pyqtSlot(str, int)
     def __clientClearBreakPoint(self, fn, lineno):
         """
         Private slot to handle the clientClearBreak signal.
-        
+
         @param fn filename of breakpoint to clear
         @type str
         @param lineno line number of breakpoint to clear
@@ -585,11 +643,11 @@
             self.breakpointModel.deleteBreakPointByIndex(index)
             if (fn, lineno) in self.__reportedBreakpointIssues:
                 self.__reportedBreakpointIssues.remove((fn, lineno))
-    
+
     def __deleteBreakPoints(self, parentIndex, start, end):
         """
         Private slot to delete breakpoints.
-        
+
         @param parentIndex index of parent item
         @type QModelIndex
         @param start start row
@@ -600,44 +658,41 @@
         if self.debugging:
             for row in range(start, end + 1):
                 index = self.breakpointModel.index(row, 0, parentIndex)
-                fn, lineno = (
-                    self.breakpointModel.getBreakPointByIndex(index)[0:2])
+                fn, lineno = self.breakpointModel.getBreakPointByIndex(index)[0:2]
                 # delete the breakpoints of all connected backends
                 self.remoteBreakpoint("", fn, lineno, False)
                 if (fn, lineno) in self.__reportedBreakpointIssues:
                     self.__reportedBreakpointIssues.remove((fn, lineno))
-    
+
     def __changeBreakPoints(self, startIndex, endIndex):
         """
         Private slot to set changed breakpoints.
-        
+
         @param startIndex starting index of the change breakpoins
         @type QModelIndex
         @param endIndex ending index of the change breakpoins
         @type QModelIndex
         """
         if self.debugging:
-            self.__addBreakPoints(
-                QModelIndex(), startIndex.row(), endIndex.row())
-    
+            self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def __breakPointDataAboutToBeChanged(self, startIndex, endIndex):
         """
         Private slot to handle the dataAboutToBeChanged signal of the
         breakpoint model.
-        
+
         @param startIndex start index of the rows to be changed
         @type QModelIndex
         @param endIndex end index of the rows to be changed
         @type QModelIndex
         """
         if self.debugging:
-            self.__deleteBreakPoints(
-                QModelIndex(), startIndex.row(), endIndex.row())
-    
+            self.__deleteBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def __addBreakPoints(self, parentIndex, start, end, debuggerId=""):
         """
         Private slot to add breakpoints.
-        
+
         @param parentIndex index of parent item
         @type QModelIndex
         @param start start row
@@ -651,24 +706,28 @@
         if self.debugging:
             for row in range(start, end + 1):
                 index = self.breakpointModel.index(row, 0, parentIndex)
-                fn, lineno, cond, temp, enabled, ignorecount = (
-                    self.breakpointModel.getBreakPointByIndex(index)[:6])
-                
+                (
+                    fn,
+                    lineno,
+                    cond,
+                    temp,
+                    enabled,
+                    ignorecount,
+                ) = self.breakpointModel.getBreakPointByIndex(index)[:6]
+
                 if (fn, lineno) in self.__reportedBreakpointIssues:
                     self.__reportedBreakpointIssues.remove((fn, lineno))
-                
+
                 self.remoteBreakpoint(debuggerId, fn, lineno, True, cond, temp)
                 if not enabled:
-                    self.__remoteBreakpointEnable(
-                        debuggerId, fn, lineno, False)
+                    self.__remoteBreakpointEnable(debuggerId, fn, lineno, False)
                 if ignorecount:
-                    self.__remoteBreakpointIgnore(
-                        debuggerId, fn, lineno, ignorecount)
-    
+                    self.__remoteBreakpointIgnore(debuggerId, fn, lineno, ignorecount)
+
     def __makeWatchCondition(self, cond, special):
         """
         Private method to construct the condition string.
-        
+
         @param cond condition
         @type str
         @param special special condition
@@ -684,11 +743,11 @@
             elif special == self.watchSpecialChanged:
                 _cond = "{0} ??changed??".format(cond)
         return _cond
-    
+
     def __splitWatchCondition(self, cond):
         """
         Private method to split a remote watch expression.
-        
+
         @param cond remote expression
         @type str
         @return tuple of local expression (string) and special condition
@@ -703,14 +762,14 @@
         else:
             cond = cond
             special = ""
-        
+
         return cond, special
-    
+
     @pyqtSlot(str)
     def __clientClearWatchPoint(self, condition):
         """
         Private slot to handle the clientClearWatch signal.
-        
+
         @param condition expression of watch expression to clear
         @type str
         """
@@ -720,11 +779,11 @@
             self.watchpointModel.deleteWatchPointByIndex(index)
             if condition in self.__reportedWatchpointIssues:
                 self.__reportedWatchpointIssues.remove(condition)
-    
+
     def __deleteWatchPoints(self, parentIndex, start, end):
         """
         Private slot to delete watch expressions.
-        
+
         @param parentIndex index of parent item
         @type QModelIndex
         @param start start row
@@ -735,31 +794,29 @@
         if self.debugging:
             for row in range(start, end + 1):
                 index = self.watchpointModel.index(row, 0, parentIndex)
-                cond, special = (
-                    self.watchpointModel.getWatchPointByIndex(index)[0:2])
+                cond, special = self.watchpointModel.getWatchPointByIndex(index)[0:2]
                 cond = self.__makeWatchCondition(cond, special)
                 self.__remoteWatchpoint("", cond, False)
                 if cond in self.__reportedWatchpointIssues:
                     self.__reportedWatchpointIssues.remove(cond)
-    
+
     def __watchPointDataAboutToBeChanged(self, startIndex, endIndex):
         """
         Private slot to handle the dataAboutToBeChanged signal of the
         watch expression model.
-        
+
         @param startIndex start index of the rows to be changed
         @type QModelIndex
         @param endIndex end index of the rows to be changed
         @type QModelIndex
         """
         if self.debugging:
-            self.__deleteWatchPoints(
-                QModelIndex(), startIndex.row(), endIndex.row())
-    
+            self.__deleteWatchPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def __addWatchPoints(self, parentIndex, start, end, debuggerId=""):
         """
         Private slot to set a watch expression.
-        
+
         @param parentIndex index of parent item
         @type QModelIndex
         @param start start row
@@ -773,37 +830,40 @@
         if self.debugging:
             for row in range(start, end + 1):
                 index = self.watchpointModel.index(row, 0, parentIndex)
-                cond, special, temp, enabled, ignorecount = (
-                    self.watchpointModel.getWatchPointByIndex(index)[:5])
+                (
+                    cond,
+                    special,
+                    temp,
+                    enabled,
+                    ignorecount,
+                ) = self.watchpointModel.getWatchPointByIndex(index)[:5]
                 cond = self.__makeWatchCondition(cond, special)
-                
+
                 if cond in self.__reportedWatchpointIssues:
                     self.__reportedWatchpointIssues.remove(cond)
-                
+
                 self.__remoteWatchpoint(debuggerId, cond, True, temp)
                 if not enabled:
                     self.__remoteWatchpointEnable(debuggerId, cond, False)
                 if ignorecount:
-                    self.__remoteWatchpointIgnore(debuggerId, cond,
-                                                  ignorecount)
-    
+                    self.__remoteWatchpointIgnore(debuggerId, cond, ignorecount)
+
     def __changeWatchPoints(self, startIndex, endIndex):
         """
         Private slot to set changed watch expressions.
-        
+
         @param startIndex start index of the rows to be changed
         @type QModelIndex
         @param endIndex end index of the rows to be changed
         @type QModelIndex
         """
         if self.debugging:
-            self.__addWatchPoints(
-                QModelIndex(), startIndex.row(), endIndex.row())
-    
+            self.__addWatchPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def getClientCapabilities(self, clientType):
         """
         Public method to retrieve the debug clients capabilities.
-        
+
         @param clientType debug client type
         @type str
         @return debug client capabilities
@@ -812,35 +872,35 @@
         try:
             return self.__debuggerInterfaceRegistry[clientType][0]
         except KeyError:
-            return 0    # no capabilities
-    
+            return 0  # no capabilities
+
     def getClientInterpreter(self):
         """
         Public method to get the interpreter of the debug client.
-        
+
         @return interpreter of the debug client
         @rtype str
         """
         return self.clientInterpreter
-    
+
     def getClientType(self):
         """
         Public method to get the currently running debug client type.
-        
+
         @return debug client type
         @rtype str
         """
         return self.clientType
-    
+
     def isClientProcessUp(self):
         """
         Public method to check, if the debug client process is up.
-        
+
         @return flag indicating a running debug client process
         @rtype bool
         """
         return self.clientProcess is not None
-    
+
     def __newConnection(self):
         """
         Private slot to handle a new connection.
@@ -854,9 +914,10 @@
                 self.tr("Connection from illegal host"),
                 self.tr(
                     """<p>A connection was attempted by the illegal host"""
-                    """ <b>{0}</b>. Accept this connection?</p>""")
-                .format(peerAddress),
-                icon=EricMessageBox.Warning)
+                    """ <b>{0}</b>. Accept this connection?</p>"""
+                ).format(peerAddress),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 sock.abort()
                 return
@@ -864,13 +925,12 @@
                 allowedHosts = Preferences.getDebugger("AllowedHosts")
                 allowedHosts.append(peerAddress)
                 Preferences.setDebugger("AllowedHosts", allowedHosts)
-        
+
         if self.passive:
-            self.__createDebuggerInterface(
-                Preferences.getDebugger("PassiveDbgType"))
-        
+            self.__createDebuggerInterface(Preferences.getDebugger("PassiveDbgType"))
+
         self.debuggerInterface.newConnection(sock)
-    
+
     def masterClientConnected(self):
         """
         Public method to perform actions after the master client has finally
@@ -885,42 +945,55 @@
             self.remoteBanner()
         elif self.passive:
             self.remoteBanner()
-    
+
     def shutdownServer(self):
         """
         Public method to cleanly shut down.
-        
+
         It closes our socket and shuts down
         the debug client. (Needed on Win OS)
         """
         if self.debuggerInterface is not None:
             self.debuggerInterface.shutdown()
-    
+
     def remoteEnvironment(self, env):
         """
         Public method to set the environment for a program to debug, run, ...
-        
+
         @param env environment settings
         @type str
         """
         envlist = shlex.split(env)
         envdict = {}
         for el in envlist:
-            if '=' in el:
-                key, value = el.split('=', 1)
+            if "=" in el:
+                key, value = el.split("=", 1)
                 envdict[key] = value
             else:
                 envdict[el] = ""
         self.debuggerInterface.remoteEnvironment(envdict)
-    
-    def remoteLoad(self, venvName, fn, argv, wd, env, autoClearShell=True,
-                   tracePython=False, autoContinue=True, forProject=False,
-                   runInConsole=False, clientType="", enableCallTrace=False,
-                   enableMultiprocess=False, multiprocessNoDebug="",
-                   configOverride=None):
+
+    def remoteLoad(
+        self,
+        venvName,
+        fn,
+        argv,
+        wd,
+        env,
+        autoClearShell=True,
+        tracePython=False,
+        autoContinue=True,
+        forProject=False,
+        runInConsole=False,
+        clientType="",
+        enableCallTrace=False,
+        enableMultiprocess=False,
+        multiprocessNoDebug="",
+        configOverride=None,
+    ):
         """
         Public method to load a new program to debug.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         @param fn the filename to debug
@@ -964,7 +1037,7 @@
         self.__multiprocessNoDebugList = [
             s.strip() for s in multiprocessNoDebug.split(os.pathsep)
         ]
-        
+
         if clientType not in self.getSupportedLanguages():
             # a not supported client language was requested
             EricMessageBox.critical(
@@ -972,42 +1045,62 @@
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger type <b>{0}</b> is not supported"""
-                    """ or not configured.</p>""").format(clientType)
+                    """ or not configured.</p>"""
+                ).format(clientType),
             )
             return
-        
+
         # Restart the client
         try:
             if clientType:
                 self.__setClientType(clientType)
             else:
                 self.__setClientType(
-                    self.__findLanguageForExtension(os.path.splitext(fn)[1]))
+                    self.__findLanguageForExtension(os.path.splitext(fn)[1])
+                )
         except KeyError:
-            self.__setClientType('Python3')    # assume it is a Python3 file
-        self.startClient(False, forProject=forProject,
-                         runInConsole=runInConsole, venvName=venvName,
-                         configOverride=configOverride)
-        
+            self.__setClientType("Python3")  # assume it is a Python3 file
+        self.startClient(
+            False,
+            forProject=forProject,
+            runInConsole=runInConsole,
+            venvName=venvName,
+            configOverride=configOverride,
+        )
+
         self.setCallTraceEnabled("", enableCallTrace)
         self.remoteEnvironment(env)
-        
+
         self.debuggerInterface.remoteLoad(
-            fn, argv, wd, tracePython, autoContinue,
-            enableMultiprocess=enableMultiprocess
+            fn,
+            argv,
+            wd,
+            tracePython,
+            autoContinue,
+            enableMultiprocess=enableMultiprocess,
         )
         self.debugging = True
         self.running = True
         self.__restoreBreakpoints()
         self.__restoreWatchpoints()
         self.__restoreNoDebugList()
-    
-    def remoteRun(self, venvName, fn, argv, wd, env, autoClearShell=True,
-                  forProject=False, runInConsole=False, clientType="",
-                  configOverride=None):
+
+    def remoteRun(
+        self,
+        venvName,
+        fn,
+        argv,
+        wd,
+        env,
+        autoClearShell=True,
+        forProject=False,
+        runInConsole=False,
+        clientType="",
+        configOverride=None,
+    ):
         """
         Public method to load a new program to run.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         @param fn the filename to debug
@@ -1033,43 +1126,60 @@
         @type dict
         """
         self.__autoClearShell = autoClearShell
-        
+
         if clientType not in self.getSupportedLanguages():
             EricMessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger type <b>{0}</b> is not supported"""
-                    """ or not configured.</p>""").format(clientType)
+                    """ or not configured.</p>"""
+                ).format(clientType),
             )
             # a not supported client language was requested
             return
-        
+
         # Restart the client
         try:
             if clientType:
                 self.__setClientType(clientType)
             else:
                 self.__setClientType(
-                    self.__findLanguageForExtension(os.path.splitext(fn)[1]))
+                    self.__findLanguageForExtension(os.path.splitext(fn)[1])
+                )
         except KeyError:
-            self.__setClientType('Python3')    # assume it is a Python3 file
-        self.startClient(False, forProject=forProject,
-                         runInConsole=runInConsole, venvName=venvName,
-                         configOverride=configOverride)
-        
+            self.__setClientType("Python3")  # assume it is a Python3 file
+        self.startClient(
+            False,
+            forProject=forProject,
+            runInConsole=runInConsole,
+            venvName=venvName,
+            configOverride=configOverride,
+        )
+
         self.remoteEnvironment(env)
-        
+
         self.debuggerInterface.remoteRun(fn, argv, wd)
         self.debugging = False
         self.running = True
-    
-    def remoteCoverage(self, venvName, fn, argv, wd, env,
-                       autoClearShell=True, erase=False, forProject=False,
-                       runInConsole=False, clientType="", configOverride=None):
+
+    def remoteCoverage(
+        self,
+        venvName,
+        fn,
+        argv,
+        wd,
+        env,
+        autoClearShell=True,
+        erase=False,
+        forProject=False,
+        runInConsole=False,
+        clientType="",
+        configOverride=None,
+    ):
         """
         Public method to load a new program to collect coverage data.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         @param fn the filename to debug
@@ -1098,7 +1208,7 @@
         @type dict
         """
         self.__autoClearShell = autoClearShell
-        
+
         if clientType not in self.getSupportedLanguages():
             # a not supported client language was requested
             EricMessageBox.critical(
@@ -1106,35 +1216,52 @@
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger type <b>{0}</b> is not supported"""
-                    """ or not configured.</p>""").format(clientType)
+                    """ or not configured.</p>"""
+                ).format(clientType),
             )
             return
-        
+
         # Restart the client
         try:
             if clientType:
                 self.__setClientType(clientType)
             else:
                 self.__setClientType(
-                    self.__findLanguageForExtension(os.path.splitext(fn)[1]))
+                    self.__findLanguageForExtension(os.path.splitext(fn)[1])
+                )
         except KeyError:
-            self.__setClientType('Python3')    # assume it is a Python3 file
-        self.startClient(False, forProject=forProject,
-                         runInConsole=runInConsole, venvName=venvName,
-                         configOverride=configOverride)
-        
+            self.__setClientType("Python3")  # assume it is a Python3 file
+        self.startClient(
+            False,
+            forProject=forProject,
+            runInConsole=runInConsole,
+            venvName=venvName,
+            configOverride=configOverride,
+        )
+
         self.remoteEnvironment(env)
-        
+
         self.debuggerInterface.remoteCoverage(fn, argv, wd, erase)
         self.debugging = False
         self.running = True
-    
-    def remoteProfile(self, venvName, fn, argv, wd, env,
-                      autoClearShell=True, erase=False, forProject=False,
-                      runInConsole=False, clientType="", configOverride=None):
+
+    def remoteProfile(
+        self,
+        venvName,
+        fn,
+        argv,
+        wd,
+        env,
+        autoClearShell=True,
+        erase=False,
+        forProject=False,
+        runInConsole=False,
+        clientType="",
+        configOverride=None,
+    ):
         """
         Public method to load a new program to collect profiling data.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         @param fn the filename to debug
@@ -1163,7 +1290,7 @@
         @type dict
         """
         self.__autoClearShell = autoClearShell
-        
+
         if clientType not in self.getSupportedLanguages():
             # a not supported client language was requested
             EricMessageBox.critical(
@@ -1171,114 +1298,121 @@
                 self.tr("Start Debugger"),
                 self.tr(
                     """<p>The debugger type <b>{0}</b> is not supported"""
-                    """ or not configured.</p>""").format(clientType)
+                    """ or not configured.</p>"""
+                ).format(clientType),
             )
             return
-        
+
         # Restart the client
         try:
             if clientType:
                 self.__setClientType(clientType)
             else:
                 self.__setClientType(
-                    self.__findLanguageForExtension(os.path.splitext(fn)[1]))
+                    self.__findLanguageForExtension(os.path.splitext(fn)[1])
+                )
         except KeyError:
-            self.__setClientType('Python3')    # assume it is a Python3 file
-        self.startClient(False, forProject=forProject,
-                         runInConsole=runInConsole, venvName=venvName,
-                         configOverride=configOverride)
-        
+            self.__setClientType("Python3")  # assume it is a Python3 file
+        self.startClient(
+            False,
+            forProject=forProject,
+            runInConsole=runInConsole,
+            venvName=venvName,
+            configOverride=configOverride,
+        )
+
         self.remoteEnvironment(env)
-        
+
         self.debuggerInterface.remoteProfile(fn, argv, wd, erase)
         self.debugging = False
         self.running = True
-    
+
     def remoteStatement(self, debuggerId, stmt):
         """
         Public method to execute a Python statement.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param stmt the Python statement to execute.
         @type str
         """
         self.debuggerInterface.remoteStatement(debuggerId, stmt.rstrip())
-    
+
     def remoteStep(self, debuggerId):
         """
         Public method to single step the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteStep(debuggerId)
-    
+
     def remoteStepOver(self, debuggerId):
         """
         Public method to step over the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteStepOver(debuggerId)
-    
+
     def remoteStepOut(self, debuggerId):
         """
         Public method to step out the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteStepOut(debuggerId)
-    
+
     def remoteStepQuit(self, debuggerId):
         """
         Public method to stop the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteStepQuit(debuggerId)
-    
+
     def remoteContinue(self, debuggerId, special=False):
         """
         Public method to continue the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param special flag indicating a special continue operation
         """
         self.debuggerInterface.remoteContinue(debuggerId, special)
-    
+
     def remoteContinueUntil(self, debuggerId, line):
         """
         Public method to continue the debugged program to the given line
         or until returning from the current frame.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued to
         @type int
         """
         self.debuggerInterface.remoteContinueUntil(debuggerId, line)
-    
+
     def remoteMoveIP(self, debuggerId, line):
         """
         Public method to move the instruction pointer to a different line.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued
         @type int
         """
         self.debuggerInterface.remoteMoveIP(debuggerId, line)
-    
-    def remoteBreakpoint(self, debuggerId, fn, line, setBreakpoint, cond=None,
-                         temp=False):
+
+    def remoteBreakpoint(
+        self, debuggerId, fn, line, setBreakpoint, cond=None, temp=False
+    ):
         """
         Public method to set or clear a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -1293,12 +1427,13 @@
         @type bool
         """
         self.debuggerInterface.remoteBreakpoint(
-            debuggerId, fn, line, setBreakpoint, cond, temp)
-    
+            debuggerId, fn, line, setBreakpoint, cond, temp
+        )
+
     def __remoteBreakpointEnable(self, debuggerId, fn, line, enable):
         """
         Private method to enable or disable a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -1308,13 +1443,12 @@
         @param enable flag indicating enabling or disabling a breakpoint
         @type bool
         """
-        self.debuggerInterface.remoteBreakpointEnable(
-            debuggerId, fn, line, enable)
-    
+        self.debuggerInterface.remoteBreakpointEnable(debuggerId, fn, line, enable)
+
     def __remoteBreakpointIgnore(self, debuggerId, fn, line, count):
         """
         Private method to ignore a breakpoint the next couple of occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -1324,13 +1458,12 @@
         @param count number of occurrences to ignore
         @type int
         """
-        self.debuggerInterface.remoteBreakpointIgnore(
-            debuggerId, fn, line, count)
-    
+        self.debuggerInterface.remoteBreakpointIgnore(debuggerId, fn, line, count)
+
     def __remoteWatchpoint(self, debuggerId, cond, setWatch, temp=False):
         """
         Private method to set or clear a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -1341,13 +1474,12 @@
         @type bool
         """
         # cond is combination of cond and special (s. watch expression viewer)
-        self.debuggerInterface.remoteWatchpoint(debuggerId, cond, setWatch,
-                                                temp)
-    
+        self.debuggerInterface.remoteWatchpoint(debuggerId, cond, setWatch, temp)
+
     def __remoteWatchpointEnable(self, debuggerId, cond, enable):
         """
         Private method to enable or disable a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -1357,12 +1489,12 @@
         """
         # cond is combination of cond and special (s. watch expression viewer)
         self.debuggerInterface.remoteWatchpointEnable(debuggerId, cond, enable)
-    
+
     def __remoteWatchpointIgnore(self, debuggerId, cond, count):
         """
         Private method to ignore a watch expression the next couple of
         occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -1372,11 +1504,11 @@
         """
         # cond is combination of cond and special (s. watch expression viewer)
         self.debuggerInterface.remoteWatchpointIgnore(debuggerId, cond, count)
-    
+
     def remoteRawInput(self, debuggerId, inputString):
         """
         Public method to send the raw input to the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param inputString the raw input
@@ -1384,40 +1516,40 @@
         """
         self.debuggerInterface.remoteRawInput(debuggerId, inputString)
         self.clientRawInputSent.emit(debuggerId)
-    
+
     def remoteThreadList(self, debuggerId):
         """
         Public method to request the list of threads from the client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteThreadList(debuggerId)
-    
+
     def remoteSetThread(self, debuggerId, tid):
         """
         Public method to request to set the given thread as current thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param tid id of the thread
         @type int
         """
         self.debuggerInterface.remoteSetThread(debuggerId, tid)
-    
+
     def remoteClientStack(self, debuggerId):
         """
         Public method to request the stack of the main thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debuggerInterface.remoteClientStack(debuggerId)
-    
+
     def remoteClientVariables(self, debuggerId, scope, filterList, framenr=0):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1428,13 +1560,15 @@
         @type int
         """
         self.debuggerInterface.remoteClientVariables(
-            debuggerId, scope, filterList, framenr, self.__maxVariableSize)
-    
-    def remoteClientVariable(self, debuggerId, scope, filterList, var,
-                             framenr=0, maxSize=0):
+            debuggerId, scope, filterList, framenr, self.__maxVariableSize
+        )
+
+    def remoteClientVariable(
+        self, debuggerId, scope, filterList, var, framenr=0, maxSize=0
+    ):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1451,23 +1585,23 @@
         @type int
         """
         self.debuggerInterface.remoteClientVariable(
-            debuggerId, scope, filterList, var, framenr,
-            self.__maxVariableSize)
-    
+            debuggerId, scope, filterList, var, framenr, self.__maxVariableSize
+        )
+
     def remoteClientDisassembly(self, debuggerId):
         """
         Public method to ask the client for the latest traceback disassembly.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         with contextlib.suppress(AttributeError):
             self.debuggerInterface.remoteClientDisassembly(debuggerId)
-    
+
     def remoteClientSetFilter(self, debuggerId, scope, filterStr):
         """
         Public method to set a variables filter list.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1475,48 +1609,47 @@
         @param filterStr regexp string for variable names to filter out
         @type str
         """
-        self.debuggerInterface.remoteClientSetFilter(
-            debuggerId, scope, filterStr)
-    
+        self.debuggerInterface.remoteClientSetFilter(debuggerId, scope, filterStr)
+
     def setCallTraceEnabled(self, debuggerId, on):
         """
         Public method to set the call trace state.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param on flag indicating to enable the call trace function
         @type bool
         """
         self.debuggerInterface.setCallTraceEnabled(debuggerId, on)
-    
+
     def remoteBanner(self):
         """
         Public slot to get the banner info of the remote client.
         """
         self.debuggerInterface.remoteBanner()
-    
+
     def remoteCapabilities(self):
         """
         Public slot to get the debug clients capabilities.
         """
         self.debuggerInterface.remoteCapabilities()
-    
+
     def remoteCompletion(self, debuggerId, text):
         """
         Public slot to get the a list of possible commandline completions
         from the remote client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param text the text to be completed
         @type str
         """
         self.debuggerInterface.remoteCompletion(debuggerId, text)
-    
+
     def signalClientOutput(self, line, debuggerId):
         """
         Public method to process a line of client output.
-        
+
         @param line client output
         @type str
         @param debuggerId ID of the debugger backend
@@ -1526,12 +1659,13 @@
             self.clientOutput.emit("{0}: {1}".format(debuggerId, line))
         else:
             self.clientOutput.emit(line)
-    
-    def signalClientLine(self, filename, lineno, debuggerId, forStack=False,
-                         threadName=""):
+
+    def signalClientLine(
+        self, filename, lineno, debuggerId, forStack=False, threadName=""
+    ):
         """
         Public method to process client position feedback.
-        
+
         @param filename name of the file currently being executed
         @type str
         @param lineno line of code currently being executed
@@ -1543,13 +1677,12 @@
         @param threadName name of the thread signaling the event
         @type str
         """
-        self.clientLine.emit(filename, lineno, debuggerId, threadName,
-                             forStack)
-    
+        self.clientLine.emit(filename, lineno, debuggerId, threadName, forStack)
+
     def signalClientStack(self, stack, debuggerId, threadName=""):
         """
         Public method to process a client's stack information.
-        
+
         @param stack list of stack entries. Each entry is a tuple of three
             values giving the filename, linenumber and method
         @type list of lists of (string, integer, string)
@@ -1559,11 +1692,11 @@
         @type str
         """
         self.clientStack.emit(stack, debuggerId, threadName)
-    
+
     def signalClientThreadList(self, currentId, threadList, debuggerId):
         """
         Public method to process the client thread list info.
-        
+
         @param currentId id of the current thread
         @type int
         @param threadList list of dictionaries containing the thread data
@@ -1572,20 +1705,20 @@
         @type str
         """
         self.clientThreadList.emit(currentId, threadList, debuggerId)
-    
+
     def signalClientThreadSet(self, debuggerId):
         """
         Public method to handle the change of the client thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.clientThreadSet.emit(debuggerId)
-    
+
     def signalClientVariables(self, scope, variables, debuggerId):
         """
         Public method to process the client variables info.
-        
+
         @param scope scope of the variables
             (-2 = no frame found, -1 = empty locals, 1 = global, 0 = local)
         @type int
@@ -1595,11 +1728,11 @@
         @type str
         """
         self.clientVariables.emit(scope, variables, debuggerId)
-    
+
     def signalClientVariable(self, scope, variables, debuggerId):
         """
         Public method to process the client variable info.
-        
+
         @param scope scope of the variables (-1 = empty global, 1 = global,
             0 = local)
         @type int
@@ -1609,22 +1742,22 @@
         @type str
         """
         self.clientVariable.emit(scope, variables, debuggerId)
-    
+
     def signalClientStatement(self, more, debuggerId):
         """
         Public method to process the input response from the client.
-        
+
         @param more flag indicating that more user input is required
         @type bool
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.clientStatement.emit(more, debuggerId)
-    
+
     def signalClientDisassembly(self, disassembly, debuggerId):
         """
         Public method to process the disassembly info from the client.
-        
+
         @param disassembly dictionary containing the disassembly information
         @type dict
         @param debuggerId ID of the debugger backend
@@ -1632,12 +1765,13 @@
         """
         if self.running:
             self.clientDisassembly.emit(disassembly, debuggerId)
-    
-    def signalClientException(self, exceptionType, exceptionMessage,
-                              stackTrace, debuggerId, threadName=""):
+
+    def signalClientException(
+        self, exceptionType, exceptionMessage, stackTrace, debuggerId, threadName=""
+    ):
         """
         Public method to process the exception info from the client.
-        
+
         @param exceptionType type of exception raised
         @type str
         @param exceptionMessage message given by the exception
@@ -1652,14 +1786,16 @@
         @type str
         """
         if self.running:
-            self.clientException.emit(exceptionType, exceptionMessage,
-                                      stackTrace, debuggerId, threadName)
-    
-    def signalClientSyntaxError(self, message, filename, lineNo, characterNo,
-                                debuggerId, threadName=""):
+            self.clientException.emit(
+                exceptionType, exceptionMessage, stackTrace, debuggerId, threadName
+            )
+
+    def signalClientSyntaxError(
+        self, message, filename, lineNo, characterNo, debuggerId, threadName=""
+    ):
         """
         Public method to process a syntax error info from the client.
-        
+
         @param message message of the syntax error
         @type str
         @param filename translated filename of the syntax error position
@@ -1674,14 +1810,16 @@
         @type str
         """
         if self.running:
-            self.clientSyntaxError.emit(message, filename, lineNo, characterNo,
-                                        debuggerId, threadName)
-    
-    def signalClientSignal(self, message, filename, lineNo,
-                           funcName, funcArgs, debuggerId):
+            self.clientSyntaxError.emit(
+                message, filename, lineNo, characterNo, debuggerId, threadName
+            )
+
+    def signalClientSignal(
+        self, message, filename, lineNo, funcName, funcArgs, debuggerId
+    ):
         """
         Public method to process a signal generated on the client side.
-        
+
         @param message message of the syntax error
         @type str
         @param filename translated filename of the syntax error position
@@ -1696,23 +1834,24 @@
         @type str
         """
         if self.running:
-            self.clientSignal.emit(message, filename, lineNo,
-                                   funcName, funcArgs, debuggerId)
-    
+            self.clientSignal.emit(
+                message, filename, lineNo, funcName, funcArgs, debuggerId
+            )
+
     def signalClientDisconnected(self, debuggerId):
         """
         Public method to send a signal when a debug client has closed its
         connection.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.clientDisconnected.emit(debuggerId)
-    
+
     def signalClientExit(self, program, status, message, debuggerId):
         """
         Public method to process the client exit status.
-        
+
         @param program name of the exited program
         @type str
         @param status exit code
@@ -1723,13 +1862,13 @@
         @type str
         """
         self.clientExit.emit(program, int(status), message, False, debuggerId)
-    
+
     def signalMainClientExit(self):
         """
         Public method to process the main client exiting.
         """
         self.mainClientExit.emit()
-    
+
     def signalLastClientExited(self):
         """
         Public method to process the last client exit event.
@@ -1737,20 +1876,21 @@
         if self.passive:
             self.__passiveShutDown()
         self.lastClientExited.emit()
-        if Preferences.getDebugger("AutomaticReset") or (self.running and
-                                                         not self.debugging):
+        if Preferences.getDebugger("AutomaticReset") or (
+            self.running and not self.debugging
+        ):
             self.debugging = False
             self.startClient(False, forProject=self.__forProject)
         if self.passive:
             self.__createDebuggerInterface("None")
-            self.signalClientOutput(self.tr('\nNot connected\n'))
+            self.signalClientOutput(self.tr("\nNot connected\n"))
             self.signalClientStatement(False, "")
         self.running = False
-    
+
     def signalClientClearBreak(self, filename, lineno, debuggerId):
         """
         Public method to process the client clear breakpoint command.
-        
+
         @param filename filename of the breakpoint
         @type str
         @param lineno line umber of the breakpoint
@@ -1759,11 +1899,11 @@
         @type str
         """
         self.clientClearBreak.emit(filename, lineno, debuggerId)
-    
+
     def signalClientBreakConditionError(self, filename, lineno, debuggerId):
         """
         Public method to process the client breakpoint condition error info.
-        
+
         @param filename filename of the breakpoint
         @type str
         @param lineno line umber of the breakpoint
@@ -1774,22 +1914,22 @@
         if (filename, lineno) not in self.__reportedBreakpointIssues:
             self.__reportedBreakpointIssues.append((filename, lineno))
             self.clientBreakConditionError.emit(filename, lineno, debuggerId)
-    
+
     def signalClientClearWatch(self, condition, debuggerId):
         """
         Public slot to handle the clientClearWatch signal.
-        
+
         @param condition expression of watch expression to clear
         @type str
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.clientClearWatch.emit(condition, debuggerId)
-    
+
     def signalClientWatchConditionError(self, condition, debuggerId):
         """
         Public method to process the client watch expression error info.
-        
+
         @param condition expression of watch expression to clear
         @type str
         @param debuggerId ID of the debugger backend
@@ -1798,11 +1938,11 @@
         if condition not in self.__reportedWatchpointIssues:
             self.__reportedWatchpointIssues.append(condition)
             self.clientWatchConditionError.emit(condition, debuggerId)
-    
+
     def signalClientRawInput(self, prompt, echo, debuggerId):
         """
         Public method to process the client raw input command.
-        
+
         @param prompt the input prompt
         @type str
         @param echo flag indicating an echoing of the input
@@ -1811,11 +1951,11 @@
         @type str
         """
         self.clientRawInput.emit(prompt, echo, debuggerId)
-    
+
     def signalClientBanner(self, version, platform, venvName):
         """
         Public method to process the client banner info.
-        
+
         @param version interpreter version info
         @type str
         @param platform hostname of the client
@@ -1824,11 +1964,11 @@
         @type str
         """
         self.clientBanner.emit(version, platform, venvName)
-    
+
     def signalClientCapabilities(self, capabilities, clientType, venvName):
         """
         Public method to process the client capabilities info.
-        
+
         @param capabilities bitmaks with the client capabilities
         @type int
         @param clientType type of the debug client
@@ -1839,11 +1979,11 @@
         with contextlib.suppress(KeyError):
             self.__debuggerInterfaceRegistry[clientType][0] = capabilities
             self.clientCapabilities.emit(capabilities, clientType, venvName)
-    
+
     def signalClientCompletionList(self, completionList, text, debuggerId):
         """
         Public method to process the client auto completion info.
-        
+
         @param completionList list of possible completions
         @type list of str
         @param text the text to be completed
@@ -1852,12 +1992,21 @@
         @type str
         """
         self.clientCompletionList.emit(completionList, text)
-    
-    def signalClientCallTrace(self, isCall, fromFile, fromLine, fromFunction,
-                              toFile, toLine, toFunction, debuggerId):
+
+    def signalClientCallTrace(
+        self,
+        isCall,
+        fromFile,
+        fromLine,
+        fromFunction,
+        toFile,
+        toLine,
+        toFunction,
+        debuggerId,
+    ):
         """
         Public method to process the client call trace data.
-        
+
         @param isCall flag indicating a 'call'
         @type bool
         @param fromFile name of the originating file
@@ -1876,13 +2025,20 @@
         @type str
         """
         self.callTraceInfo.emit(
-            isCall, fromFile, fromLine, fromFunction,
-            toFile, toLine, toFunction, debuggerId)
-    
+            isCall,
+            fromFile,
+            fromLine,
+            fromFunction,
+            toFile,
+            toLine,
+            toFunction,
+            debuggerId,
+        )
+
     def passiveStartUp(self, fn, exc, debuggerId):
         """
         Public method to handle a passive debug connection.
-        
+
         @param fn filename of the debugged script
         @type str
         @param exc flag to enable exception reporting of the IDE
@@ -1897,7 +2053,7 @@
         self.__restoreBreakpoints(debuggerId)
         self.__restoreWatchpoints(debuggerId)
         self.passiveDebugStarted.emit(fn, exc)
-    
+
     def __passiveShutDown(self):
         """
         Private method to shut down a passive debug connection.
@@ -1905,93 +2061,93 @@
         self.passiveClientExited = True
         self.shutdownServer()
         self.appendStdout.emit(self.tr("Passive debug connection closed\n"))
-    
+
     def __restoreBreakpoints(self, debuggerId=""):
         """
         Private method to restore the breakpoints after a restart.
-        
+
         @param debuggerId ID of the debugger backend to send to. If this is
             empty, they will be broadcast to all connected backends.
         @type str
         """
         if self.debugging:
             self.__addBreakPoints(
-                QModelIndex(), 0, self.breakpointModel.rowCount() - 1,
-                debuggerId)
-    
+                QModelIndex(), 0, self.breakpointModel.rowCount() - 1, debuggerId
+            )
+
     def __restoreWatchpoints(self, debuggerId=""):
         """
         Private method to restore the watch expressions after a restart.
-        
+
         @param debuggerId ID of the debugger backend to send to. If this is
             empty, they will be broadcast to all connected backends.
         @type str
         """
         if self.debugging:
             self.__addWatchPoints(
-                QModelIndex(), 0, self.watchpointModel.rowCount() - 1,
-                debuggerId)
-    
+                QModelIndex(), 0, self.watchpointModel.rowCount() - 1, debuggerId
+            )
+
     def getBreakPointModel(self):
         """
         Public slot to get a reference to the breakpoint model object.
-        
+
         @return reference to the breakpoint model object
         @rtype BreakPointModel
         """
         return self.breakpointModel
-    
+
     def getWatchPointModel(self):
         """
         Public slot to get a reference to the watch expression model object.
-        
+
         @return reference to the watch expression model object
         @rtype WatchPointModel
         """
         return self.watchpointModel
-    
+
     def isConnected(self):
         """
         Public method to test, if the debug server is connected to a backend.
-        
+
         @return flag indicating a connection
         @rtype bool
         """
         return self.debuggerInterface and self.debuggerInterface.isConnected()
-    
+
     def isDebugging(self):
         """
         Public method to test, if the debug server is debugging.
-        
+
         @return flag indicating the debugging state
         @rtype bool
         """
         return self.debugging
-    
+
     def setDebugging(self, on):
         """
         Public method to set the debugging state.
-        
+
         @param on flag indicating the new debugging state
         @type bool
         """
         self.debugging = on
-    
+
     def signalClientDebuggerId(self, debuggerId):
         """
         Public method to signal the receipt of a new debugger ID.
-        
+
         This signal indicates, that a new debugger backend has connected.
-        
+
         @param debuggerId ID of the newly connected debugger backend
         @type str
         """
         self.clientDebuggerId.emit(debuggerId)
-    
+
     def getDebuggerIds(self):
         """
         Public method to return the IDs of the connected debugger backends.
-        
+
         @return list of connected debugger backend IDs
         @rtype list of str
         """
@@ -1999,27 +2155,28 @@
             return self.debuggerInterface.getDebuggerIds()
         else:
             return []
-    
+
     def initializeClient(self, debuggerId):
         """
         Public method to initialize a freshly connected debug client.
-        
+
         @param debuggerId ID of the connected debugger
         @type str
         """
         self.__restoreBreakpoints(debuggerId)
         self.__restoreWatchpoints(debuggerId)
         self.__restoreNoDebugList(debuggerId)
-    
+
     def __restoreNoDebugList(self, debuggerId=""):
         """
         Private method to restore the list of scripts not to be debugged after
         a restart.
-        
+
         @param debuggerId ID of the debugger backend to send to. If this is
             empty, they will be broadcast to all connected backends.
         @type str
         """
         if self.debugging:
             self.debuggerInterface.remoteNoDebugList(
-                debuggerId, self.__multiprocessNoDebugList)
+                debuggerId, self.__multiprocessNoDebugList
+            )
--- a/src/eric7/Debugger/DebugUI.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebugUI.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,10 @@
 from UI.NotificationWidget import NotificationTypes
 
 from .DebugClientCapabilities import (
-    HasDebugger, HasInterpreter, HasProfiler, HasCoverage
+    HasDebugger,
+    HasInterpreter,
+    HasProfiler,
+    HasCoverage,
 )
 
 from Globals import recentNameBreakpointConditions
@@ -38,7 +41,7 @@
 class DebugUI(QObject):
     """
     Class implementing the debugger part of the UI.
-    
+
     @signal clientStack(stack, debuggerId) emitted at breaking after a reported
         exception
     @signal compileForms() emitted if changed project forms should be compiled
@@ -54,6 +57,7 @@
     @signal appendStdout(msg) emitted when the client program has terminated
         and the display of the termination dialog is suppressed
     """
+
     clientStack = pyqtSignal(list, str)
     resetUI = pyqtSignal(bool)
     exceptionInterrupt = pyqtSignal()
@@ -62,11 +66,11 @@
     executeMake = pyqtSignal()
     debuggingStarted = pyqtSignal(str)
     appendStdout = pyqtSignal(str)
-    
+
     def __init__(self, ui, vm, debugServer, debugViewer, project):
         """
         Constructor
-        
+
         @param ui reference to the main UI
         @param vm reference to the viewmanager
         @param debugServer reference to the debug server
@@ -74,71 +78,90 @@
         @param project reference to the project object
         """
         super().__init__(ui)
-        
+
         self.ui = ui
         self.viewmanager = vm
         self.debugServer = debugServer
         self.debugViewer = debugViewer
         self.project = project
-        
+
         # Clear some variables
         self.projectOpen = False
         self.editorOpen = False
-        
+
         # read the saved debug info values
         self.lastUsedVenvName = Preferences.getSettings().value(
-            'DebugInfo/VirtualEnvironment', '')
+            "DebugInfo/VirtualEnvironment", ""
+        )
         self.scriptsHistory = Preferences.toList(
-            Preferences.getSettings().value('DebugInfo/ScriptsHistory'))
+            Preferences.getSettings().value("DebugInfo/ScriptsHistory")
+        )
         self.argvHistory = Preferences.toList(
-            Preferences.getSettings().value('DebugInfo/ArgumentsHistory'))
+            Preferences.getSettings().value("DebugInfo/ArgumentsHistory")
+        )
         self.wdHistory = Preferences.toList(
-            Preferences.getSettings().value(
-                'DebugInfo/WorkingDirectoryHistory'))
+            Preferences.getSettings().value("DebugInfo/WorkingDirectoryHistory")
+        )
         self.envHistory = Preferences.toList(
-            Preferences.getSettings().value('DebugInfo/EnvironmentHistory'))
+            Preferences.getSettings().value("DebugInfo/EnvironmentHistory")
+        )
         self.excList = Preferences.toList(
-            Preferences.getSettings().value('DebugInfo/Exceptions'))
+            Preferences.getSettings().value("DebugInfo/Exceptions")
+        )
         self.excIgnoreList = Preferences.toList(
-            Preferences.getSettings().value('DebugInfo/IgnoredExceptions'))
+            Preferences.getSettings().value("DebugInfo/IgnoredExceptions")
+        )
         self.exceptions = Preferences.toBool(
-            Preferences.getSettings().value(
-                'DebugInfo/ReportExceptions', True))
+            Preferences.getSettings().value("DebugInfo/ReportExceptions", True)
+        )
         self.autoClearShell = Preferences.toBool(
-            Preferences.getSettings().value('DebugInfo/AutoClearShell', True))
+            Preferences.getSettings().value("DebugInfo/AutoClearShell", True)
+        )
         self.tracePython = Preferences.toBool(
-            Preferences.getSettings().value('DebugInfo/TracePython', False))
+            Preferences.getSettings().value("DebugInfo/TracePython", False)
+        )
         self.autoContinue = Preferences.toBool(
-            Preferences.getSettings().value('DebugInfo/AutoContinue', True))
+            Preferences.getSettings().value("DebugInfo/AutoContinue", True)
+        )
         self.enableMultiprocess = Preferences.toBool(
-            Preferences.getSettings().value(
-                'DebugInfo/EnableMultiprocess', False))
+            Preferences.getSettings().value("DebugInfo/EnableMultiprocess", False)
+        )
         self.multiprocessNoDebugHistory = Preferences.toList(
-            Preferences.getSettings().value(
-                'DebugInfo/MultiprocessNoDebugHistory'))
+            Preferences.getSettings().value("DebugInfo/MultiprocessNoDebugHistory")
+        )
         self.overrideGlobalConfig = {
-            "enable": Preferences.toBool(Preferences.getSettings().value(
-                'DebugInfo/OverrideGlobal', False)),
-            "redirect": Preferences.toBool(Preferences.getSettings().value(
-                'DebugInfo/RedirectStdinStdout', True)),
+            "enable": Preferences.toBool(
+                Preferences.getSettings().value("DebugInfo/OverrideGlobal", False)
+            ),
+            "redirect": Preferences.toBool(
+                Preferences.getSettings().value("DebugInfo/RedirectStdinStdout", True)
+            ),
         }
-        
+
         self.lastDebuggedFile = None
-        self.lastStartAction = 0    # 0=None, 1=Script, 2=Project
+        self.lastStartAction = 0  # 0=None, 1=Script, 2=Project
         self.clientType = ""
         self.lastAction = -1
         self.debugActions = [
-            self.__continue, self.__step, self.__stepOver, self.__stepOut,
-            self.__stepQuit, self.__runToCursor, self.__runUntil,
-            self.__moveInstructionPointer
+            self.__continue,
+            self.__step,
+            self.__stepOver,
+            self.__stepOut,
+            self.__stepQuit,
+            self.__runToCursor,
+            self.__runUntil,
+            self.__moveInstructionPointer,
         ]
-        self.__localsVarFilterList, self.__globalsVarFilterList = (
-            Preferences.getVarFilters())
+        (
+            self.__localsVarFilterList,
+            self.__globalsVarFilterList,
+        ) = Preferences.getVarFilters()
         self.debugViewer.setVariablesFilter(
-            self.__globalsVarFilterList, self.__localsVarFilterList)
-        
+            self.__globalsVarFilterList, self.__localsVarFilterList
+        )
+
         self.__clientDebuggerIds = set()
-        
+
         # Connect the signals emitted by the debug-server
         debugServer.clientGone.connect(self.__clientGone)
         debugServer.clientLine.connect(self.__clientLine)
@@ -150,34 +173,33 @@
         debugServer.clientSignal.connect(self.__clientSignal)
         debugServer.clientVariables.connect(self.__clientVariables)
         debugServer.clientVariable.connect(self.__clientVariable)
-        debugServer.clientBreakConditionError.connect(
-            self.__clientBreakConditionError)
-        debugServer.clientWatchConditionError.connect(
-            self.__clientWatchConditionError)
+        debugServer.clientBreakConditionError.connect(self.__clientBreakConditionError)
+        debugServer.clientWatchConditionError.connect(self.__clientWatchConditionError)
         debugServer.passiveDebugStarted.connect(self.__passiveDebugStarted)
         debugServer.clientThreadSet.connect(self.__clientThreadSet)
         debugServer.clientDebuggerId.connect(self.__clientDebuggerId)
-        
+
         # Connect the signals emitted by the viewmanager
         vm.editorOpened.connect(self.__editorOpened)
         vm.lastEditorClosed.connect(self.__lastEditorClosed)
         vm.checkActions.connect(self.__checkActions)
         vm.cursorChanged.connect(self.__cursorChanged)
         vm.breakpointToggled.connect(self.__cursorChanged)
-        
+
         # Connect the signals emitted by the project
         project.projectOpened.connect(self.__projectOpened)
         project.newProject.connect(self.__projectOpened)
         project.projectClosed.connect(self.__projectClosed)
-        
+
         # Set a flag for the passive debug mode
         self.passive = Preferences.getDebugger("PassiveDbgEnabled")
-    
-    def showNotification(self, notification,
-                         kind=NotificationTypes.INFORMATION, timeout=None):
+
+    def showNotification(
+        self, notification, kind=NotificationTypes.INFORMATION, timeout=None
+    ):
         """
         Public method to show some notification message.
-        
+
         @param notification message to be shown
         @type str
         @param kind kind of notification to be shown
@@ -188,12 +210,16 @@
         """
         self.ui.showNotification(
             UI.PixmapCache.getPixmap("debug48"),
-            self.tr("Notification"), notification, kind=kind, timeout=timeout)
-    
+            self.tr("Notification"),
+            notification,
+            kind=kind,
+            timeout=timeout,
+        )
+
     def variablesFilter(self, scope):
         """
         Public method to get the variables filter for a scope.
-        
+
         @param scope flag indicating global (True) or local (False) scope
         @return filters list
         @rtype list of str
@@ -202,435 +228,582 @@
             return self.__globalsVarFilterList[:]
         else:
             return self.__localsVarFilterList[:]
-        
+
     def initActions(self):
         """
         Public method defining the user interface actions.
         """
         self.actions = []
-        
+
         self.runAct = EricAction(
-            self.tr('Run Script'),
+            self.tr("Run Script"),
             UI.PixmapCache.getIcon("runScript"),
-            self.tr('&Run Script...'),
-            Qt.Key.Key_F2, 0, self, 'dbg_run_script')
-        self.runAct.setStatusTip(self.tr('Run the current Script'))
-        self.runAct.setWhatsThis(self.tr(
-            """<b>Run Script</b>"""
-            """<p>Set the command line arguments and run the script outside"""
-            """ the debugger. If the file has unsaved changes it may be"""
-            """ saved first.</p>"""
-        ))
+            self.tr("&Run Script..."),
+            Qt.Key.Key_F2,
+            0,
+            self,
+            "dbg_run_script",
+        )
+        self.runAct.setStatusTip(self.tr("Run the current Script"))
+        self.runAct.setWhatsThis(
+            self.tr(
+                """<b>Run Script</b>"""
+                """<p>Set the command line arguments and run the script outside"""
+                """ the debugger. If the file has unsaved changes it may be"""
+                """ saved first.</p>"""
+            )
+        )
         self.runAct.triggered.connect(self.__runScript)
         self.actions.append(self.runAct)
 
         self.runProjectAct = EricAction(
-            self.tr('Run Project'),
+            self.tr("Run Project"),
             UI.PixmapCache.getIcon("runProject"),
-            self.tr('Run &Project...'),
+            self.tr("Run &Project..."),
             QKeyCombination(Qt.Modifier.SHIFT, Qt.Key.Key_F2),
-            0, self, 'dbg_run_project')
-        self.runProjectAct.setStatusTip(self.tr('Run the current Project'))
-        self.runProjectAct.setWhatsThis(self.tr(
-            """<b>Run Project</b>"""
-            """<p>Set the command line arguments and run the current project"""
-            """ outside the debugger."""
-            """ If files of the current project have unsaved changes they"""
-            """ may be saved first.</p>"""
-        ))
+            0,
+            self,
+            "dbg_run_project",
+        )
+        self.runProjectAct.setStatusTip(self.tr("Run the current Project"))
+        self.runProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Run Project</b>"""
+                """<p>Set the command line arguments and run the current project"""
+                """ outside the debugger."""
+                """ If files of the current project have unsaved changes they"""
+                """ may be saved first.</p>"""
+            )
+        )
         self.runProjectAct.triggered.connect(self.__runProject)
         self.actions.append(self.runProjectAct)
 
         self.coverageAct = EricAction(
-            self.tr('Coverage run of Script'),
+            self.tr("Coverage run of Script"),
             UI.PixmapCache.getIcon("coverageScript"),
-            self.tr('Coverage run of Script...'), 0, 0, self,
-            'dbg_coverage_script')
+            self.tr("Coverage run of Script..."),
+            0,
+            0,
+            self,
+            "dbg_coverage_script",
+        )
         self.coverageAct.setStatusTip(
-            self.tr('Perform a coverage run of the current Script'))
-        self.coverageAct.setWhatsThis(self.tr(
-            """<b>Coverage run of Script</b>"""
-            """<p>Set the command line arguments and run the script under"""
-            """ the control of a coverage analysis tool. If the file has"""
-            """ unsaved changes it may be saved first.</p>"""
-        ))
+            self.tr("Perform a coverage run of the current Script")
+        )
+        self.coverageAct.setWhatsThis(
+            self.tr(
+                """<b>Coverage run of Script</b>"""
+                """<p>Set the command line arguments and run the script under"""
+                """ the control of a coverage analysis tool. If the file has"""
+                """ unsaved changes it may be saved first.</p>"""
+            )
+        )
         self.coverageAct.triggered.connect(self.__coverageScript)
         self.actions.append(self.coverageAct)
 
         self.coverageProjectAct = EricAction(
-            self.tr('Coverage run of Project'),
+            self.tr("Coverage run of Project"),
             UI.PixmapCache.getIcon("coverageProject"),
-            self.tr('Coverage run of Project...'), 0, 0, self,
-            'dbg_coverage_project')
+            self.tr("Coverage run of Project..."),
+            0,
+            0,
+            self,
+            "dbg_coverage_project",
+        )
         self.coverageProjectAct.setStatusTip(
-            self.tr('Perform a coverage run of the current Project'))
-        self.coverageProjectAct.setWhatsThis(self.tr(
-            """<b>Coverage run of Project</b>"""
-            """<p>Set the command line arguments and run the current project"""
-            """ under the control of a coverage analysis tool."""
-            """ If files of the current project have unsaved changes"""
-            """ they may be saved first.</p>"""
-        ))
+            self.tr("Perform a coverage run of the current Project")
+        )
+        self.coverageProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Coverage run of Project</b>"""
+                """<p>Set the command line arguments and run the current project"""
+                """ under the control of a coverage analysis tool."""
+                """ If files of the current project have unsaved changes"""
+                """ they may be saved first.</p>"""
+            )
+        )
         self.coverageProjectAct.triggered.connect(self.__coverageProject)
         self.actions.append(self.coverageProjectAct)
 
         self.profileAct = EricAction(
-            self.tr('Profile Script'),
+            self.tr("Profile Script"),
             UI.PixmapCache.getIcon("profileScript"),
-            self.tr('Profile Script...'), 0, 0, self, 'dbg_profile_script')
-        self.profileAct.setStatusTip(self.tr('Profile the current Script'))
-        self.profileAct.setWhatsThis(self.tr(
-            """<b>Profile Script</b>"""
-            """<p>Set the command line arguments and profile the script."""
-            """ If the file has unsaved changes it may be saved first.</p>"""
-        ))
+            self.tr("Profile Script..."),
+            0,
+            0,
+            self,
+            "dbg_profile_script",
+        )
+        self.profileAct.setStatusTip(self.tr("Profile the current Script"))
+        self.profileAct.setWhatsThis(
+            self.tr(
+                """<b>Profile Script</b>"""
+                """<p>Set the command line arguments and profile the script."""
+                """ If the file has unsaved changes it may be saved first.</p>"""
+            )
+        )
         self.profileAct.triggered.connect(self.__profileScript)
         self.actions.append(self.profileAct)
 
         self.profileProjectAct = EricAction(
-            self.tr('Profile Project'),
+            self.tr("Profile Project"),
             UI.PixmapCache.getIcon("profileProject"),
-            self.tr('Profile Project...'), 0, 0, self,
-            'dbg_profile_project')
-        self.profileProjectAct.setStatusTip(
-            self.tr('Profile the current Project'))
-        self.profileProjectAct.setWhatsThis(self.tr(
-            """<b>Profile Project</b>"""
-            """<p>Set the command line arguments and profile the current"""
-            """ project. If files of the current project have unsaved"""
-            """ changes they may be saved first.</p>"""
-        ))
+            self.tr("Profile Project..."),
+            0,
+            0,
+            self,
+            "dbg_profile_project",
+        )
+        self.profileProjectAct.setStatusTip(self.tr("Profile the current Project"))
+        self.profileProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Profile Project</b>"""
+                """<p>Set the command line arguments and profile the current"""
+                """ project. If files of the current project have unsaved"""
+                """ changes they may be saved first.</p>"""
+            )
+        )
         self.profileProjectAct.triggered.connect(self.__profileProject)
         self.actions.append(self.profileProjectAct)
 
         self.debugAct = EricAction(
-            self.tr('Debug Script'),
+            self.tr("Debug Script"),
             UI.PixmapCache.getIcon("debugScript"),
-            self.tr('&Debug Script...'), Qt.Key.Key_F5, 0, self,
-            'dbg_debug_script')
-        self.debugAct.setStatusTip(self.tr('Debug the current Script'))
-        self.debugAct.setWhatsThis(self.tr(
-            """<b>Debug Script</b>"""
-            """<p>Set the command line arguments and set the current line"""
-            """ to be the first executable Python statement of the current"""
-            """ editor window. If the file has unsaved changes it may be"""
-            """ saved first.</p>"""
-        ))
+            self.tr("&Debug Script..."),
+            Qt.Key.Key_F5,
+            0,
+            self,
+            "dbg_debug_script",
+        )
+        self.debugAct.setStatusTip(self.tr("Debug the current Script"))
+        self.debugAct.setWhatsThis(
+            self.tr(
+                """<b>Debug Script</b>"""
+                """<p>Set the command line arguments and set the current line"""
+                """ to be the first executable Python statement of the current"""
+                """ editor window. If the file has unsaved changes it may be"""
+                """ saved first.</p>"""
+            )
+        )
         self.debugAct.triggered.connect(self.__debugScript)
         self.actions.append(self.debugAct)
 
         self.debugProjectAct = EricAction(
-            self.tr('Debug Project'),
+            self.tr("Debug Project"),
             UI.PixmapCache.getIcon("debugProject"),
-            self.tr('Debug &Project...'),
+            self.tr("Debug &Project..."),
             QKeyCombination(Qt.Modifier.SHIFT, Qt.Key.Key_F5),
-            0, self, 'dbg_debug_project')
-        self.debugProjectAct.setStatusTip(self.tr(
-            'Debug the current Project'))
-        self.debugProjectAct.setWhatsThis(self.tr(
-            """<b>Debug Project</b>"""
-            """<p>Set the command line arguments and set the current line"""
-            """ to be the first executable Python statement of the main"""
-            """ script of the current project. If files of the current"""
-            """ project have unsaved changes they may be saved first.</p>"""
-        ))
+            0,
+            self,
+            "dbg_debug_project",
+        )
+        self.debugProjectAct.setStatusTip(self.tr("Debug the current Project"))
+        self.debugProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Debug Project</b>"""
+                """<p>Set the command line arguments and set the current line"""
+                """ to be the first executable Python statement of the main"""
+                """ script of the current project. If files of the current"""
+                """ project have unsaved changes they may be saved first.</p>"""
+            )
+        )
         self.debugProjectAct.triggered.connect(self.__debugProject)
         self.actions.append(self.debugProjectAct)
 
         self.restartAct = EricAction(
-            self.tr('Restart'),
+            self.tr("Restart"),
             UI.PixmapCache.getIcon("debugRestart"),
-            self.tr('Restart'), Qt.Key.Key_F4, 0, self, 'dbg_restart_script')
-        self.restartAct.setStatusTip(self.tr(
-            'Restart the last debugged script'))
-        self.restartAct.setWhatsThis(self.tr(
-            """<b>Restart</b>"""
-            """<p>Set the command line arguments and set the current line"""
-            """ to be the first executable Python statement of the script"""
-            """ that was debugged last. If there are unsaved changes, they"""
-            """ may be saved first.</p>"""
-        ))
+            self.tr("Restart"),
+            Qt.Key.Key_F4,
+            0,
+            self,
+            "dbg_restart_script",
+        )
+        self.restartAct.setStatusTip(self.tr("Restart the last debugged script"))
+        self.restartAct.setWhatsThis(
+            self.tr(
+                """<b>Restart</b>"""
+                """<p>Set the command line arguments and set the current line"""
+                """ to be the first executable Python statement of the script"""
+                """ that was debugged last. If there are unsaved changes, they"""
+                """ may be saved first.</p>"""
+            )
+        )
         self.restartAct.triggered.connect(self.__doRestart)
         self.actions.append(self.restartAct)
 
         self.stopAct = EricAction(
-            self.tr('Stop'),
+            self.tr("Stop"),
             UI.PixmapCache.getIcon("stopScript"),
-            self.tr('Stop'),
+            self.tr("Stop"),
             QKeyCombination(Qt.Modifier.SHIFT, Qt.Key.Key_F10),
             0,
-            self, 'dbg_stop_script')
+            self,
+            "dbg_stop_script",
+        )
         self.stopAct.setStatusTip(self.tr("""Stop the running script."""))
-        self.stopAct.setWhatsThis(self.tr(
-            """<b>Stop</b>"""
-            """<p>This stops the script running in the debugger backend.</p>"""
-        ))
+        self.stopAct.setWhatsThis(
+            self.tr(
+                """<b>Stop</b>"""
+                """<p>This stops the script running in the debugger backend.</p>"""
+            )
+        )
         self.stopAct.triggered.connect(self.__stopScript)
         self.actions.append(self.stopAct)
 
         self.debugActGrp = createActionGroup(self)
 
         act = EricAction(
-            self.tr('Continue'),
+            self.tr("Continue"),
             UI.PixmapCache.getIcon("continue"),
-            self.tr('&Continue'), Qt.Key.Key_F6, 0,
-            self.debugActGrp, 'dbg_continue')
-        act.setStatusTip(
-            self.tr('Continue running the program from the current line'))
-        act.setWhatsThis(self.tr(
-            """<b>Continue</b>"""
-            """<p>Continue running the program from the current line. The"""
-            """ program will stop when it terminates or when a breakpoint"""
-            """ is reached.</p>"""
-        ))
+            self.tr("&Continue"),
+            Qt.Key.Key_F6,
+            0,
+            self.debugActGrp,
+            "dbg_continue",
+        )
+        act.setStatusTip(self.tr("Continue running the program from the current line"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Continue</b>"""
+                """<p>Continue running the program from the current line. The"""
+                """ program will stop when it terminates or when a breakpoint"""
+                """ is reached.</p>"""
+            )
+        )
         act.triggered.connect(self.__continue)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Continue to Cursor'),
+            self.tr("Continue to Cursor"),
             UI.PixmapCache.getIcon("continueToCursor"),
-            self.tr('Continue &To Cursor'),
+            self.tr("Continue &To Cursor"),
             QKeyCombination(Qt.Modifier.SHIFT, Qt.Key.Key_F6),
-            0, self.debugActGrp, 'dbg_continue_to_cursor')
-        act.setStatusTip(self.tr(
-            """Continue running the program from the"""
-            """ current line to the current cursor position"""))
-        act.setWhatsThis(self.tr(
-            """<b>Continue To Cursor</b>"""
-            """<p>Continue running the program from the current line to the"""
-            """ current cursor position.</p>"""
-        ))
+            0,
+            self.debugActGrp,
+            "dbg_continue_to_cursor",
+        )
+        act.setStatusTip(
+            self.tr(
+                """Continue running the program from the"""
+                """ current line to the current cursor position"""
+            )
+        )
+        act.setWhatsThis(
+            self.tr(
+                """<b>Continue To Cursor</b>"""
+                """<p>Continue running the program from the current line to the"""
+                """ current cursor position.</p>"""
+            )
+        )
         act.triggered.connect(self.__runToCursor)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Continue Until'),
+            self.tr("Continue Until"),
             UI.PixmapCache.getIcon("continueUntil"),
-            self.tr('Continue &Until'),
+            self.tr("Continue &Until"),
             QKeyCombination(Qt.Modifier.CTRL, Qt.Key.Key_F6),
             0,
-            self.debugActGrp, 'dbg_continue_until')
-        act.setStatusTip(self.tr(
-            """Continue running the program from the current line to the"""
-            """ current cursor position or until leaving the current frame"""))
-        act.setWhatsThis(self.tr(
-            """<b>Continue Until</b>"""
-            """<p>Continue running the program from the current line to the"""
-            """ cursor position greater than the current line or until"""
-            """ leaving the current frame.</p>"""
-        ))
+            self.debugActGrp,
+            "dbg_continue_until",
+        )
+        act.setStatusTip(
+            self.tr(
+                """Continue running the program from the current line to the"""
+                """ current cursor position or until leaving the current frame"""
+            )
+        )
+        act.setWhatsThis(
+            self.tr(
+                """<b>Continue Until</b>"""
+                """<p>Continue running the program from the current line to the"""
+                """ cursor position greater than the current line or until"""
+                """ leaving the current frame.</p>"""
+            )
+        )
         act.triggered.connect(self.__runUntil)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Move Instruction Pointer to Cursor'),
+            self.tr("Move Instruction Pointer to Cursor"),
             UI.PixmapCache.getIcon("moveInstructionPointer"),
-            self.tr('&Jump To Cursor'), Qt.Key.Key_F12, 0,
-            self.debugActGrp, 'dbg_jump_to_cursor')
-        act.setStatusTip(self.tr(
-            """Skip the code from the"""
-            """ current line to the current cursor position"""))
-        act.setWhatsThis(self.tr(
-            """<b>Move Instruction Pointer to Cursor</b>"""
-            """<p>Move the Python internal instruction pointer to the"""
-            """ current cursor position without executing the code in"""
-            """ between.</p>"""
-            """<p>It's not possible to jump out of a function or jump"""
-            """ in a code block, e.g. a loop. In these cases, a error"""
-            """ message is printed to the log window.</p>"""
-        ))
+            self.tr("&Jump To Cursor"),
+            Qt.Key.Key_F12,
+            0,
+            self.debugActGrp,
+            "dbg_jump_to_cursor",
+        )
+        act.setStatusTip(
+            self.tr(
+                """Skip the code from the"""
+                """ current line to the current cursor position"""
+            )
+        )
+        act.setWhatsThis(
+            self.tr(
+                """<b>Move Instruction Pointer to Cursor</b>"""
+                """<p>Move the Python internal instruction pointer to the"""
+                """ current cursor position without executing the code in"""
+                """ between.</p>"""
+                """<p>It's not possible to jump out of a function or jump"""
+                """ in a code block, e.g. a loop. In these cases, a error"""
+                """ message is printed to the log window.</p>"""
+            )
+        )
         act.triggered.connect(self.__moveInstructionPointer)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Single Step'),
+            self.tr("Single Step"),
             UI.PixmapCache.getIcon("step"),
-            self.tr('Sin&gle Step'), Qt.Key.Key_F7, 0,
-            self.debugActGrp, 'dbg_single_step')
-        act.setStatusTip(self.tr('Execute a single Python statement'))
-        act.setWhatsThis(self.tr(
-            """<b>Single Step</b>"""
-            """<p>Execute a single Python statement. If the statement"""
-            """ is an <tt>import</tt> statement, a class constructor, or a"""
-            """ method or function call then control is returned to the"""
-            """ debugger at the next statement.</p>"""
-        ))
+            self.tr("Sin&gle Step"),
+            Qt.Key.Key_F7,
+            0,
+            self.debugActGrp,
+            "dbg_single_step",
+        )
+        act.setStatusTip(self.tr("Execute a single Python statement"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Single Step</b>"""
+                """<p>Execute a single Python statement. If the statement"""
+                """ is an <tt>import</tt> statement, a class constructor, or a"""
+                """ method or function call then control is returned to the"""
+                """ debugger at the next statement.</p>"""
+            )
+        )
         act.triggered.connect(self.__step)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Step Over'),
+            self.tr("Step Over"),
             UI.PixmapCache.getIcon("stepOver"),
-            self.tr('Step &Over'), Qt.Key.Key_F8, 0,
-            self.debugActGrp, 'dbg_step_over')
-        act.setStatusTip(self.tr(
-            """Execute a single Python statement staying"""
-            """ in the current frame"""))
-        act.setWhatsThis(self.tr(
-            """<b>Step Over</b>"""
-            """<p>Execute a single Python statement staying in the same"""
-            """ frame. If the statement is an <tt>import</tt> statement,"""
-            """ a class constructor, or a method or function call then"""
-            """ control is returned to the debugger after the statement"""
-            """ has completed.</p>"""
-        ))
+            self.tr("Step &Over"),
+            Qt.Key.Key_F8,
+            0,
+            self.debugActGrp,
+            "dbg_step_over",
+        )
+        act.setStatusTip(
+            self.tr(
+                """Execute a single Python statement staying"""
+                """ in the current frame"""
+            )
+        )
+        act.setWhatsThis(
+            self.tr(
+                """<b>Step Over</b>"""
+                """<p>Execute a single Python statement staying in the same"""
+                """ frame. If the statement is an <tt>import</tt> statement,"""
+                """ a class constructor, or a method or function call then"""
+                """ control is returned to the debugger after the statement"""
+                """ has completed.</p>"""
+            )
+        )
         act.triggered.connect(self.__stepOver)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Step Out'),
+            self.tr("Step Out"),
             UI.PixmapCache.getIcon("stepOut"),
-            self.tr('Step Ou&t'), Qt.Key.Key_F9, 0,
-            self.debugActGrp, 'dbg_step_out')
-        act.setStatusTip(self.tr(
-            """Execute Python statements until leaving"""
-            """ the current frame"""))
-        act.setWhatsThis(self.tr(
-            """<b>Step Out</b>"""
-            """<p>Execute Python statements until leaving the current"""
-            """ frame. If the statements are inside an <tt>import</tt>"""
-            """ statement, a class constructor, or a method or function"""
-            """ call then control is returned to the debugger after the"""
-            """ current frame has been left.</p>"""
-        ))
+            self.tr("Step Ou&t"),
+            Qt.Key.Key_F9,
+            0,
+            self.debugActGrp,
+            "dbg_step_out",
+        )
+        act.setStatusTip(
+            self.tr(
+                """Execute Python statements until leaving""" """ the current frame"""
+            )
+        )
+        act.setWhatsThis(
+            self.tr(
+                """<b>Step Out</b>"""
+                """<p>Execute Python statements until leaving the current"""
+                """ frame. If the statements are inside an <tt>import</tt>"""
+                """ statement, a class constructor, or a method or function"""
+                """ call then control is returned to the debugger after the"""
+                """ current frame has been left.</p>"""
+            )
+        )
         act.triggered.connect(self.__stepOut)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Stop'),
+            self.tr("Stop"),
             UI.PixmapCache.getIcon("stepQuit"),
-            self.tr('&Stop'), Qt.Key.Key_F10, 0,
-            self.debugActGrp, 'dbg_stop')
-        act.setStatusTip(self.tr('Stop debugging'))
-        act.setWhatsThis(self.tr(
-            """<b>Stop</b>"""
-            """<p>Stop the running debugging session.</p>"""
-        ))
+            self.tr("&Stop"),
+            Qt.Key.Key_F10,
+            0,
+            self.debugActGrp,
+            "dbg_stop",
+        )
+        act.setStatusTip(self.tr("Stop debugging"))
+        act.setWhatsThis(
+            self.tr("""<b>Stop</b>""" """<p>Stop the running debugging session.</p>""")
+        )
         act.triggered.connect(self.__stepQuit)
         self.actions.append(act)
-        
+
         self.dbgFilterAct = EricAction(
-            self.tr('Variables Type Filter'),
-            self.tr('Varia&bles Type Filter...'), 0, 0, self,
-            'dbg_variables_filter')
-        self.dbgFilterAct.setStatusTip(self.tr(
-            'Configure variables type filter'))
-        self.dbgFilterAct.setWhatsThis(self.tr(
-            """<b>Variables Type Filter</b>"""
-            """<p>Configure the variables type filter. Only variable types"""
-            """ that are not selected are displayed in the global or local"""
-            """ variables window during a debugging session.</p>"""
-        ))
-        self.dbgFilterAct.triggered.connect(
-            self.__configureVariablesFilters)
+            self.tr("Variables Type Filter"),
+            self.tr("Varia&bles Type Filter..."),
+            0,
+            0,
+            self,
+            "dbg_variables_filter",
+        )
+        self.dbgFilterAct.setStatusTip(self.tr("Configure variables type filter"))
+        self.dbgFilterAct.setWhatsThis(
+            self.tr(
+                """<b>Variables Type Filter</b>"""
+                """<p>Configure the variables type filter. Only variable types"""
+                """ that are not selected are displayed in the global or local"""
+                """ variables window during a debugging session.</p>"""
+            )
+        )
+        self.dbgFilterAct.triggered.connect(self.__configureVariablesFilters)
         self.actions.append(self.dbgFilterAct)
 
         self.excFilterAct = EricAction(
-            self.tr('Exceptions Filter'),
-            self.tr('&Exceptions Filter...'), 0, 0, self,
-            'dbg_exceptions_filter')
-        self.excFilterAct.setStatusTip(self.tr(
-            'Configure exceptions filter'))
-        self.excFilterAct.setWhatsThis(self.tr(
-            """<b>Exceptions Filter</b>"""
-            """<p>Configure the exceptions filter. Only exception types"""
-            """ that are listed are highlighted during a debugging"""
-            """ session.</p><p>Please note, that all unhandled exceptions"""
-            """ are highlighted indepent from the filter list.</p>"""
-        ))
-        self.excFilterAct.triggered.connect(
-            self.__configureExceptionsFilter)
+            self.tr("Exceptions Filter"),
+            self.tr("&Exceptions Filter..."),
+            0,
+            0,
+            self,
+            "dbg_exceptions_filter",
+        )
+        self.excFilterAct.setStatusTip(self.tr("Configure exceptions filter"))
+        self.excFilterAct.setWhatsThis(
+            self.tr(
+                """<b>Exceptions Filter</b>"""
+                """<p>Configure the exceptions filter. Only exception types"""
+                """ that are listed are highlighted during a debugging"""
+                """ session.</p><p>Please note, that all unhandled exceptions"""
+                """ are highlighted indepent from the filter list.</p>"""
+            )
+        )
+        self.excFilterAct.triggered.connect(self.__configureExceptionsFilter)
         self.actions.append(self.excFilterAct)
-        
+
         self.excIgnoreFilterAct = EricAction(
-            self.tr('Ignored Exceptions'),
-            self.tr('&Ignored Exceptions...'), 0, 0,
-            self, 'dbg_ignored_exceptions')
-        self.excIgnoreFilterAct.setStatusTip(self.tr(
-            'Configure ignored exceptions'))
-        self.excIgnoreFilterAct.setWhatsThis(self.tr(
-            """<b>Ignored Exceptions</b>"""
-            """<p>Configure the ignored exceptions. Only exception types"""
-            """ that are not listed are highlighted during a debugging"""
-            """ session.</p><p>Please note, that unhandled exceptions"""
-            """ cannot be ignored.</p>"""
-        ))
-        self.excIgnoreFilterAct.triggered.connect(
-            self.__configureIgnoredExceptions)
+            self.tr("Ignored Exceptions"),
+            self.tr("&Ignored Exceptions..."),
+            0,
+            0,
+            self,
+            "dbg_ignored_exceptions",
+        )
+        self.excIgnoreFilterAct.setStatusTip(self.tr("Configure ignored exceptions"))
+        self.excIgnoreFilterAct.setWhatsThis(
+            self.tr(
+                """<b>Ignored Exceptions</b>"""
+                """<p>Configure the ignored exceptions. Only exception types"""
+                """ that are not listed are highlighted during a debugging"""
+                """ session.</p><p>Please note, that unhandled exceptions"""
+                """ cannot be ignored.</p>"""
+            )
+        )
+        self.excIgnoreFilterAct.triggered.connect(self.__configureIgnoredExceptions)
         self.actions.append(self.excIgnoreFilterAct)
 
         self.dbgSetBpActGrp = createActionGroup(self)
 
         self.dbgToggleBpAct = EricAction(
-            self.tr('Toggle Breakpoint'),
+            self.tr("Toggle Breakpoint"),
             UI.PixmapCache.getIcon("breakpointToggle"),
-            self.tr('Toggle Breakpoint'),
+            self.tr("Toggle Breakpoint"),
             QKeySequence(self.tr("Shift+F11", "Debug|Toggle Breakpoint")),
-            0, self.dbgSetBpActGrp, 'dbg_toggle_breakpoint')
-        self.dbgToggleBpAct.setStatusTip(self.tr('Toggle Breakpoint'))
-        self.dbgToggleBpAct.setWhatsThis(self.tr(
-            """<b>Toggle Breakpoint</b>"""
-            """<p>Toggles a breakpoint at the current line of the"""
-            """ current editor.</p>"""
-        ))
+            0,
+            self.dbgSetBpActGrp,
+            "dbg_toggle_breakpoint",
+        )
+        self.dbgToggleBpAct.setStatusTip(self.tr("Toggle Breakpoint"))
+        self.dbgToggleBpAct.setWhatsThis(
+            self.tr(
+                """<b>Toggle Breakpoint</b>"""
+                """<p>Toggles a breakpoint at the current line of the"""
+                """ current editor.</p>"""
+            )
+        )
         self.dbgToggleBpAct.triggered.connect(self.__toggleBreakpoint)
         self.actions.append(self.dbgToggleBpAct)
-        
+
         self.dbgEditBpAct = EricAction(
-            self.tr('Edit Breakpoint'),
+            self.tr("Edit Breakpoint"),
             UI.PixmapCache.getIcon("cBreakpointToggle"),
-            self.tr('Edit Breakpoint...'),
-            QKeySequence(self.tr("Shift+F12", "Debug|Edit Breakpoint")), 0,
-            self.dbgSetBpActGrp, 'dbg_edit_breakpoint')
-        self.dbgEditBpAct.setStatusTip(self.tr('Edit Breakpoint'))
-        self.dbgEditBpAct.setWhatsThis(self.tr(
-            """<b>Edit Breakpoint</b>"""
-            """<p>Opens a dialog to edit the breakpoints properties."""
-            """ It works at the current line of the current editor.</p>"""
-        ))
+            self.tr("Edit Breakpoint..."),
+            QKeySequence(self.tr("Shift+F12", "Debug|Edit Breakpoint")),
+            0,
+            self.dbgSetBpActGrp,
+            "dbg_edit_breakpoint",
+        )
+        self.dbgEditBpAct.setStatusTip(self.tr("Edit Breakpoint"))
+        self.dbgEditBpAct.setWhatsThis(
+            self.tr(
+                """<b>Edit Breakpoint</b>"""
+                """<p>Opens a dialog to edit the breakpoints properties."""
+                """ It works at the current line of the current editor.</p>"""
+            )
+        )
         self.dbgEditBpAct.triggered.connect(self.__editBreakpoint)
         self.actions.append(self.dbgEditBpAct)
 
         self.dbgNextBpAct = EricAction(
-            self.tr('Next Breakpoint'),
+            self.tr("Next Breakpoint"),
             UI.PixmapCache.getIcon("breakpointNext"),
-            self.tr('Next Breakpoint'),
-            QKeySequence(
-                self.tr("Ctrl+Shift+PgDown", "Debug|Next Breakpoint")), 0,
-            self.dbgSetBpActGrp, 'dbg_next_breakpoint')
-        self.dbgNextBpAct.setStatusTip(self.tr('Next Breakpoint'))
-        self.dbgNextBpAct.setWhatsThis(self.tr(
-            """<b>Next Breakpoint</b>"""
-            """<p>Go to next breakpoint of the current editor.</p>"""
-        ))
+            self.tr("Next Breakpoint"),
+            QKeySequence(self.tr("Ctrl+Shift+PgDown", "Debug|Next Breakpoint")),
+            0,
+            self.dbgSetBpActGrp,
+            "dbg_next_breakpoint",
+        )
+        self.dbgNextBpAct.setStatusTip(self.tr("Next Breakpoint"))
+        self.dbgNextBpAct.setWhatsThis(
+            self.tr(
+                """<b>Next Breakpoint</b>"""
+                """<p>Go to next breakpoint of the current editor.</p>"""
+            )
+        )
         self.dbgNextBpAct.triggered.connect(self.__nextBreakpoint)
         self.actions.append(self.dbgNextBpAct)
 
         self.dbgPrevBpAct = EricAction(
-            self.tr('Previous Breakpoint'),
+            self.tr("Previous Breakpoint"),
             UI.PixmapCache.getIcon("breakpointPrevious"),
-            self.tr('Previous Breakpoint'),
-            QKeySequence(
-                self.tr("Ctrl+Shift+PgUp", "Debug|Previous Breakpoint")),
-            0, self.dbgSetBpActGrp, 'dbg_previous_breakpoint')
-        self.dbgPrevBpAct.setStatusTip(self.tr('Previous Breakpoint'))
-        self.dbgPrevBpAct.setWhatsThis(self.tr(
-            """<b>Previous Breakpoint</b>"""
-            """<p>Go to previous breakpoint of the current editor.</p>"""
-        ))
+            self.tr("Previous Breakpoint"),
+            QKeySequence(self.tr("Ctrl+Shift+PgUp", "Debug|Previous Breakpoint")),
+            0,
+            self.dbgSetBpActGrp,
+            "dbg_previous_breakpoint",
+        )
+        self.dbgPrevBpAct.setStatusTip(self.tr("Previous Breakpoint"))
+        self.dbgPrevBpAct.setWhatsThis(
+            self.tr(
+                """<b>Previous Breakpoint</b>"""
+                """<p>Go to previous breakpoint of the current editor.</p>"""
+            )
+        )
         self.dbgPrevBpAct.triggered.connect(self.__previousBreakpoint)
         self.actions.append(self.dbgPrevBpAct)
 
         act = EricAction(
-            self.tr('Clear Breakpoints'),
-            self.tr('Clear Breakpoints'),
-            0, 0,
-            self.dbgSetBpActGrp, 'dbg_clear_breakpoint')
-        act.setStatusTip(self.tr('Clear Breakpoints'))
-        act.setWhatsThis(self.tr(
-            """<b>Clear Breakpoints</b>"""
-            """<p>Clear breakpoints of all editors.</p>"""
-        ))
+            self.tr("Clear Breakpoints"),
+            self.tr("Clear Breakpoints"),
+            0,
+            0,
+            self.dbgSetBpActGrp,
+            "dbg_clear_breakpoint",
+        )
+        act.setStatusTip(self.tr("Clear Breakpoints"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Clear Breakpoints</b>"""
+                """<p>Clear breakpoints of all editors.</p>"""
+            )
+        )
         act.triggered.connect(self.__clearBreakpoints)
         self.actions.append(act)
 
@@ -642,19 +815,19 @@
         self.debugProjectAct.setEnabled(False)
         self.restartAct.setEnabled(False)
         self.stopAct.setEnabled(False)
-        
+
     def initMenus(self):
         """
         Public slot to initialize the project menu.
-        
+
         @return the generated menu
         """
-        dmenu = QMenu(self.tr('&Debug'), self.parent())
+        dmenu = QMenu(self.tr("&Debug"), self.parent())
         dmenu.setTearOffEnabled(True)
-        smenu = QMenu(self.tr('Sta&rt'), self.parent())
+        smenu = QMenu(self.tr("Sta&rt"), self.parent())
         smenu.setTearOffEnabled(True)
-        self.breakpointsMenu = QMenu(self.tr('&Breakpoints'), dmenu)
-        
+        self.breakpointsMenu = QMenu(self.tr("&Breakpoints"), dmenu)
+
         smenu.addAction(self.restartAct)
         smenu.addAction(self.stopAct)
         smenu.addSeparator()
@@ -669,7 +842,7 @@
         smenu.addSeparator()
         smenu.addAction(self.coverageAct)
         smenu.addAction(self.coverageProjectAct)
-        
+
         dmenu.addActions(self.debugActGrp.actions())
         dmenu.addSeparator()
         dmenu.addActions(self.dbgSetBpActGrp.actions())
@@ -678,17 +851,17 @@
         dmenu.addAction(self.dbgFilterAct)
         dmenu.addAction(self.excFilterAct)
         dmenu.addAction(self.excIgnoreFilterAct)
-        
+
         self.breakpointsMenu.aboutToShow.connect(self.__showBreakpointsMenu)
         self.breakpointsMenu.triggered.connect(self.__breakpointSelected)
         dmenu.aboutToShow.connect(self.__showDebugMenu)
-        
+
         return smenu, dmenu
-        
+
     def initToolbars(self, toolbarManager):
         """
         Public slot to initialize the debug toolbars.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbars (list of QToolBar)
@@ -696,8 +869,8 @@
         starttb = QToolBar(self.tr("Start"), self.ui)
         starttb.setIconSize(UI.Config.ToolBarIconSize)
         starttb.setObjectName("StartToolbar")
-        starttb.setToolTip(self.tr('Start'))
-        
+        starttb.setToolTip(self.tr("Start"))
+
         starttb.addAction(self.restartAct)
         starttb.addAction(self.stopAct)
         starttb.addSeparator()
@@ -706,34 +879,32 @@
         starttb.addSeparator()
         starttb.addAction(self.debugAct)
         starttb.addAction(self.debugProjectAct)
-        
+
         debugtb = QToolBar(self.tr("Debug"), self.ui)
         debugtb.setIconSize(UI.Config.ToolBarIconSize)
         debugtb.setObjectName("DebugToolbar")
-        debugtb.setToolTip(self.tr('Debug'))
-        
+        debugtb.setToolTip(self.tr("Debug"))
+
         debugtb.addActions(self.debugActGrp.actions())
         debugtb.addSeparator()
         debugtb.addAction(self.dbgToggleBpAct)
         debugtb.addAction(self.dbgEditBpAct)
         debugtb.addAction(self.dbgNextBpAct)
         debugtb.addAction(self.dbgPrevBpAct)
-        
+
         toolbarManager.addToolBar(starttb, starttb.windowTitle())
         toolbarManager.addToolBar(debugtb, debugtb.windowTitle())
         toolbarManager.addAction(self.profileAct, starttb.windowTitle())
         toolbarManager.addAction(self.profileProjectAct, starttb.windowTitle())
         toolbarManager.addAction(self.coverageAct, starttb.windowTitle())
-        toolbarManager.addAction(self.coverageProjectAct,
-                                 starttb.windowTitle())
-        
+        toolbarManager.addAction(self.coverageProjectAct, starttb.windowTitle())
+
         return [starttb, debugtb]
 
-    def setScriptsHistory(self, scriptName, clearHistories=False,
-                          history=None):
+    def setScriptsHistory(self, scriptName, clearHistories=False, history=None):
         """
         Public slot to initialize the scripts history.
-        
+
         @param scriptName script name
         @type str
         @param clearHistories flag indicating, that the list should
@@ -754,7 +925,7 @@
     def setArgvHistory(self, argsStr, clearHistories=False, history=None):
         """
         Public slot to initialize the argv history.
-        
+
         @param argsStr the commandline arguments (string)
         @param clearHistories flag indicating, that the list should
             be cleared (boolean)
@@ -772,7 +943,7 @@
     def setWdHistory(self, wdStr, clearHistories=False, history=None):
         """
         Public slot to initialize the wd history.
-        
+
         @param wdStr the working directory (string)
         @param clearHistories flag indicating, that the list should
             be cleared (boolean)
@@ -786,11 +957,11 @@
             if wdStr in self.wdHistory:
                 self.wdHistory.remove(wdStr)
             self.wdHistory.insert(0, wdStr)
-        
+
     def setEnvHistory(self, envStr, clearHistories=False, history=None):
         """
         Public slot to initialize the env history.
-        
+
         @param envStr the environment settings (string)
         @param clearHistories flag indicating, that the list should
             be cleared (boolean)
@@ -804,11 +975,11 @@
             if envStr in self.envHistory:
                 self.envHistory.remove(envStr)
             self.envHistory.insert(0, envStr)
-        
+
     def setExceptionReporting(self, exceptions):
         """
         Public slot to initialize the exception reporting flag.
-        
+
         @param exceptions flag indicating exception reporting status (boolean)
         """
         self.exceptions = exceptions
@@ -816,23 +987,23 @@
     def setExcList(self, excList):
         """
         Public slot to initialize the exceptions type list.
-        
+
         @param excList list of exception types (list of strings)
         """
-        self.excList = excList[:]   # keep a copy
-        
+        self.excList = excList[:]  # keep a copy
+
     def setExcIgnoreList(self, excIgnoreList):
         """
         Public slot to initialize the ignored exceptions type list.
-        
+
         @param excIgnoreList list of ignored exception types (list of strings)
         """
-        self.excIgnoreList = excIgnoreList[:]   # keep a copy
-        
+        self.excIgnoreList = excIgnoreList[:]  # keep a copy
+
     def setAutoClearShell(self, autoClearShell):
         """
         Public slot to initialize the autoClearShell flag.
-        
+
         @param autoClearShell flag indicating, that the interpreter window
             should be cleared (boolean)
         """
@@ -841,7 +1012,7 @@
     def setTracePython(self, tracePython):
         """
         Public slot to initialize the trace Python flag.
-        
+
         @param tracePython flag indicating if the Python library should be
             traced as well (boolean)
         """
@@ -850,7 +1021,7 @@
     def setAutoContinue(self, autoContinue):
         """
         Public slot to initialize the autoContinue flag.
-        
+
         @param autoContinue flag indicating, that the debugger should not
             stop at the first executable line (boolean)
         """
@@ -859,14 +1030,14 @@
     def __editorOpened(self, fn):
         """
         Private slot to handle the editorOpened signal.
-        
+
         @param fn filename of the opened editor
         """
         self.editorOpen = True
-        
+
         editor = self.viewmanager.getOpenEditor(fn) if fn else None
         self.__checkActions(editor)
-        
+
     def __lastEditorClosed(self):
         """
         Private slot to handle the closeProgram signal.
@@ -880,15 +1051,15 @@
             self.lastDebuggedFile = None
             self.lastStartAction = 0
             self.clientType = ""
-        
+
     def __checkActions(self, editor):
         """
         Private slot to check some actions for their enable/disable status.
-        
+
         @param editor editor window
         """
         fn = editor.getFileName() if editor else None
-        
+
         cap = 0
         if fn:
             for language in self.debugServer.getSupportedLanguages():
@@ -898,10 +1069,10 @@
                     break
             else:
                 if editor.isPy3File():
-                    cap = self.debugServer.getClientCapabilities('Python3')
+                    cap = self.debugServer.getClientCapabilities("Python3")
                 elif editor.isRubyFile():
-                    cap = self.debugServer.getClientCapabilities('Ruby')
-        
+                    cap = self.debugServer.getClientCapabilities("Ruby")
+
             self.dbgSetBpActGrp.setEnabled(cap & HasDebugger)
             if editor.curLineHasBreakpoint():
                 self.dbgEditBpAct.setEnabled(True)
@@ -915,16 +1086,16 @@
                 self.dbgPrevBpAct.setEnabled(False)
         else:
             self.dbgSetBpActGrp.setEnabled(False)
-        
+
     def __cursorChanged(self, editor):
         """
         Private slot handling the cursorChanged signal of the viewmanager.
-        
+
         @param editor editor window
         """
         if editor is None:
             return
-        
+
         if editor.isPyFile() or editor.isRubyFile():
             if editor.curLineHasBreakpoint():
                 self.dbgEditBpAct.setEnabled(True)
@@ -936,20 +1107,19 @@
             else:
                 self.dbgNextBpAct.setEnabled(False)
                 self.dbgPrevBpAct.setEnabled(False)
-        
+
     def __projectOpened(self):
         """
         Private slot to handle the projectOpened signal.
         """
         self.projectOpen = True
-        cap = self.debugServer.getClientCapabilities(
-            self.project.getProjectLanguage())
+        cap = self.debugServer.getClientCapabilities(self.project.getProjectLanguage())
         if not self.passive:
             self.debugProjectAct.setEnabled(cap & HasDebugger)
             self.runProjectAct.setEnabled(cap & HasInterpreter)
             self.profileProjectAct.setEnabled(cap & HasProfiler)
             self.coverageProjectAct.setEnabled(cap & HasCoverage)
-        
+
     def __projectClosed(self):
         """
         Private slot to handle the projectClosed signal.
@@ -959,13 +1129,13 @@
         self.profileProjectAct.setEnabled(False)
         self.coverageProjectAct.setEnabled(False)
         self.debugProjectAct.setEnabled(False)
-        
+
         if not self.editorOpen:
             self.restartAct.setEnabled(False)
             self.lastDebuggedFile = None
             self.lastStartAction = 0
             self.clientType = ""
-        
+
     def clearHistories(self):
         """
         Public method to clear the various debug histories.
@@ -975,21 +1145,25 @@
         self.wdHistory = []
         self.envHistory = []
         self.multiprocessNoDebugHistory = []
-        
-        Preferences.getSettings().setValue(
-            'DebugInfo/ScriptsHistory', self.scriptsHistory)
+
         Preferences.getSettings().setValue(
-            'DebugInfo/ArgumentsHistory', self.argvHistory)
+            "DebugInfo/ScriptsHistory", self.scriptsHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/WorkingDirectoryHistory', self.wdHistory)
+            "DebugInfo/ArgumentsHistory", self.argvHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/EnvironmentHistory', self.envHistory)
+            "DebugInfo/WorkingDirectoryHistory", self.wdHistory
+        )
+        Preferences.getSettings().setValue(
+            "DebugInfo/EnvironmentHistory", self.envHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/MultiprocessNoDebugHistory',
-            self.multiprocessNoDebugHistory)
-        
+            "DebugInfo/MultiprocessNoDebugHistory", self.multiprocessNoDebugHistory
+        )
+
         self.debugViewer.breakpointViewer.clearHistories()
-        
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
@@ -999,98 +1173,103 @@
         del self.argvHistory[10:]
         del self.wdHistory[10:]
         del self.envHistory[10:]
-        
-        Preferences.getSettings().setValue(
-            'DebugInfo/VirtualEnvironment', self.lastUsedVenvName)
+
         Preferences.getSettings().setValue(
-            'DebugInfo/ScriptsHistory', self.scriptsHistory)
+            "DebugInfo/VirtualEnvironment", self.lastUsedVenvName
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/ArgumentsHistory', self.argvHistory)
+            "DebugInfo/ScriptsHistory", self.scriptsHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/WorkingDirectoryHistory', self.wdHistory)
+            "DebugInfo/ArgumentsHistory", self.argvHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/EnvironmentHistory', self.envHistory)
+            "DebugInfo/WorkingDirectoryHistory", self.wdHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/Exceptions', self.excList)
+            "DebugInfo/EnvironmentHistory", self.envHistory
+        )
+        Preferences.getSettings().setValue("DebugInfo/Exceptions", self.excList)
         Preferences.getSettings().setValue(
-            'DebugInfo/IgnoredExceptions', self.excIgnoreList)
-        Preferences.getSettings().setValue(
-            'DebugInfo/ReportExceptions', self.exceptions)
+            "DebugInfo/IgnoredExceptions", self.excIgnoreList
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/AutoClearShell', self.autoClearShell)
-        Preferences.getSettings().setValue(
-            'DebugInfo/TracePython', self.tracePython)
+            "DebugInfo/ReportExceptions", self.exceptions
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/AutoContinue', self.autoContinue)
-        Preferences.getSettings().setValue(
-            'DebugInfo/EnableMultiprocess', self.enableMultiprocess)
+            "DebugInfo/AutoClearShell", self.autoClearShell
+        )
+        Preferences.getSettings().setValue("DebugInfo/TracePython", self.tracePython)
+        Preferences.getSettings().setValue("DebugInfo/AutoContinue", self.autoContinue)
         Preferences.getSettings().setValue(
-            'DebugInfo/MultiprocessNoDebugHistory',
-            self.multiprocessNoDebugHistory)
+            "DebugInfo/EnableMultiprocess", self.enableMultiprocess
+        )
+        Preferences.getSettings().setValue(
+            "DebugInfo/MultiprocessNoDebugHistory", self.multiprocessNoDebugHistory
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/OverrideGlobal',
-            self.overrideGlobalConfig["enable"])
+            "DebugInfo/OverrideGlobal", self.overrideGlobalConfig["enable"]
+        )
         Preferences.getSettings().setValue(
-            'DebugInfo/RedirectStdinStdout',
-            self.overrideGlobalConfig["redirect"])
-        
+            "DebugInfo/RedirectStdinStdout", self.overrideGlobalConfig["redirect"]
+        )
+
     def shutdownServer(self):
         """
         Public method to shut down the debug server.
-        
+
         This is needed to cleanly close the sockets on Win OS.
-        
+
         @return always true
         """
         self.debugServer.shutdownServer()
         return True
-        
+
     def __resetUI(self, fullReset=True):
         """
         Private slot to reset the user interface.
-        
+
         @param fullReset flag indicating a full reset is required
         @type bool
         """
         self.lastAction = -1
         self.debugActGrp.setEnabled(False)
         self.__clientDebuggerIds.clear()
-        
+
         if not self.passive:
             if self.editorOpen:
                 editor = self.viewmanager.activeWindow()
             else:
                 editor = None
             self.__checkActions(editor)
-            
+
             self.debugProjectAct.setEnabled(self.projectOpen)
             self.runProjectAct.setEnabled(self.projectOpen)
             self.profileProjectAct.setEnabled(self.projectOpen)
             self.coverageProjectAct.setEnabled(self.projectOpen)
-            if (
-                self.lastDebuggedFile is not None and
-                (self.editorOpen or self.projectOpen)
+            if self.lastDebuggedFile is not None and (
+                self.editorOpen or self.projectOpen
             ):
                 self.restartAct.setEnabled(True)
             else:
                 self.restartAct.setEnabled(False)
             self.stopAct.setEnabled(False)
-        
+
         self.resetUI.emit(fullReset)
-    
+
     def __clientDebuggerId(self, debuggerId):
         """
         Private slot to track the list of connected debuggers.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__clientDebuggerIds.add(debuggerId)
-    
+
     def __clientLine(self, fn, line, debuggerId, threadName, forStack):
         """
         Private method to handle a change to the current line.
-        
+
         @param fn filename
         @type str
         @param line linenumber
@@ -1112,27 +1291,27 @@
             self.__getClientVariables(debuggerId)
 
         self.debugActGrp.setEnabled(True)
-    
+
     @pyqtSlot(str)
     def __clientDisconnected(self, debuggerId):
         """
         Private slot to handle a debug client disconnecting its control
         socket.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__clientDebuggerIds.discard(debuggerId)
-        
+
         if len(self.__clientDebuggerIds) == 0:
             self.viewmanager.exit()
             self.__resetUI(fullReset=False)
-    
+
     @pyqtSlot(str, int, str, bool, str)
     def __clientExit(self, program, status, message, quiet, debuggerId):
         """
         Private slot to handle the debugged program terminating.
-        
+
         @param program name of the exited program
         @type str
         @param status exit code of the debugged program
@@ -1145,25 +1324,25 @@
         @type str
         """
         self.__clientDisconnected(debuggerId)
-        
+
         if not quiet:
             if not program:
                 program = self.ui.currentProg
-            
+
             if message:
-                info = self.tr("Message: {0}").format(
-                    Utilities.html_uencode(message))
+                info = self.tr("Message: {0}").format(Utilities.html_uencode(message))
             else:
                 info = ""
             if program is None:
                 msg = self.tr(
-                    '<p>The program has terminated with an exit status of'
-                    ' {0}.</p><p>{1}</p>').format(status, info)
+                    "<p>The program has terminated with an exit status of"
+                    " {0}.</p><p>{1}</p>"
+                ).format(status, info)
             else:
                 msg = self.tr(
-                    '<p><b>{0}</b> has terminated with an exit status of'
-                    ' {1}.</p><p>{2}</p>').format(
-                    os.path.basename(program), status, info)
+                    "<p><b>{0}</b> has terminated with an exit status of"
+                    " {1}.</p><p>{2}</p>"
+                ).format(os.path.basename(program), status, info)
             if status != 0:
                 timeout = 0
                 kind = NotificationTypes.WARNING
@@ -1172,20 +1351,23 @@
                 kind = NotificationTypes.INFORMATION
             self.ui.showNotification(
                 UI.PixmapCache.getPixmap("debug48"),
-                self.tr("Program terminated"), msg, kind=kind,
-                timeout=timeout)
-    
+                self.tr("Program terminated"),
+                msg,
+                kind=kind,
+                timeout=timeout,
+            )
+
     def __lastClientExited(self):
         """
         Private slot handling the exit of the last client.
         """
         self.viewmanager.exit()
         self.__resetUI()
-    
+
     def __clientSyntaxError(self, message, filename, lineNo, characterNo):
         """
         Private method to handle a syntax error in the debugged program.
-        
+
         @param message message of the syntax error (string)
         @param filename translated filename of the syntax error position
             (string)
@@ -1196,20 +1378,21 @@
         self.__resetUI()
         self.ui.raise_()
         self.ui.activateWindow()
-        
+
         if message is None:
             EricMessageBox.critical(
-                self.ui, Program,
+                self.ui,
+                Program,
                 self.tr(
-                    'The program being debugged contains an unspecified'
-                    ' syntax error.'))
+                    "The program being debugged contains an unspecified"
+                    " syntax error."
+                ),
+            )
             return
-            
+
         if not os.path.isabs(filename):
-            if os.path.exists(os.path.join(self.project.getProjectPath(),
-                              filename)):
-                filename = os.path.join(self.project.getProjectPath(),
-                                        filename)
+            if os.path.exists(os.path.join(self.project.getProjectPath(), filename)):
+                filename = os.path.join(self.project.getProjectPath(), filename)
             else:
                 ms = self.project.getMainScript(normalized=True)
                 if ms is not None:
@@ -1218,17 +1401,21 @@
                         filename = os.path.join(d, filename)
         self.viewmanager.setFileLine(filename, lineNo, True, True)
         EricMessageBox.critical(
-            self.ui, Program,
-            self.tr('<p>The file <b>{0}</b> contains the syntax error'
-                    ' <b>{1}</b> at line <b>{2}</b>, character <b>{3}</b>.'
-                    '</p>')
-                .format(filename, message, lineNo, characterNo))
-        
-    def __clientException(self, exceptionType, exceptionMessage, stackTrace,
-                          debuggerId):
+            self.ui,
+            Program,
+            self.tr(
+                "<p>The file <b>{0}</b> contains the syntax error"
+                " <b>{1}</b> at line <b>{2}</b>, character <b>{3}</b>."
+                "</p>"
+            ).format(filename, message, lineNo, characterNo),
+        )
+
+    def __clientException(
+        self, exceptionType, exceptionMessage, stackTrace, debuggerId
+    ):
         """
         Private method to handle an exception of the debugged program.
-        
+
         @param exceptionType type of exception raised
         @type str
         @param exceptionMessage message given by the exception
@@ -1242,19 +1429,23 @@
         QApplication.processEvents()
         if not exceptionType:
             EricMessageBox.critical(
-                self.ui, Program,
-                self.tr('An unhandled exception occured.'
-                        ' See the shell window for details.'))
+                self.ui,
+                Program,
+                self.tr(
+                    "An unhandled exception occured."
+                    " See the shell window for details."
+                ),
+            )
             return
-        
+
         if (
-            (self.exceptions and
-             exceptionType not in self.excIgnoreList and
-             (not len(self.excList) or
-              (len(self.excList) and exceptionType in self.excList)
-              )
-             ) or exceptionType.startswith('unhandled')
-        ):
+            self.exceptions
+            and exceptionType not in self.excIgnoreList
+            and (
+                not len(self.excList)
+                or (len(self.excList) and exceptionType in self.excList)
+            )
+        ) or exceptionType.startswith("unhandled"):
             res = None
             if stackTrace:
                 with contextlib.suppress(UnicodeError, OSError):
@@ -1262,51 +1453,59 @@
                     source, encoding = Utilities.readEncodedFile(file)
                     source = source.splitlines(True)
                     if len(source) >= line:
-                        lineFlags = Utilities.extractLineFlags(
-                            source[line - 1].strip())
+                        lineFlags = Utilities.extractLineFlags(source[line - 1].strip())
                         with contextlib.suppress(IndexError):
                             lineFlags += Utilities.extractLineFlags(
-                                source[line].strip(), flagsLine=True)
+                                source[line].strip(), flagsLine=True
+                            )
                         if "__IGNORE_EXCEPTION__" in lineFlags:
                             res = EricMessageBox.No
                 if res != EricMessageBox.No:
                     self.viewmanager.setFileLine(
-                        stackTrace[0][0], stackTrace[0][1], True)
+                        stackTrace[0][0], stackTrace[0][1], True
+                    )
             if res != EricMessageBox.No:
                 self.ui.activateWindow()
                 if Preferences.getDebugger("BreakAlways"):
                     res = EricMessageBox.Yes
                 else:
                     if stackTrace:
-                        if exceptionType.startswith('unhandled'):
+                        if exceptionType.startswith("unhandled"):
                             buttons = EricMessageBox.No | EricMessageBox.Yes
                         else:
-                            buttons = (EricMessageBox.No |
-                                       EricMessageBox.Yes |
-                                       EricMessageBox.Ignore)
+                            buttons = (
+                                EricMessageBox.No
+                                | EricMessageBox.Yes
+                                | EricMessageBox.Ignore
+                            )
                         res = EricMessageBox.critical(
-                            self.ui, Program,
+                            self.ui,
+                            Program,
                             self.tr(
-                                '<p>The debugged program raised the exception'
+                                "<p>The debugged program raised the exception"
                                 ' <b>{0}</b><br>"<b>{1}</b>"<br>'
-                                'File: <b>{2}</b>, Line: <b>{3}</b></p>'
-                                '<p>Break here?</p>')
-                            .format(
+                                "File: <b>{2}</b>, Line: <b>{3}</b></p>"
+                                "<p>Break here?</p>"
+                            ).format(
                                 exceptionType,
                                 Utilities.html_encode(exceptionMessage),
                                 stackTrace[0][0],
-                                stackTrace[0][1]),
+                                stackTrace[0][1],
+                            ),
                             buttons,
-                            EricMessageBox.No)
+                            EricMessageBox.No,
+                        )
                     else:
                         res = EricMessageBox.critical(
-                            self.ui, Program,
+                            self.ui,
+                            Program,
                             self.tr(
-                                '<p>The debugged program raised the exception'
-                                ' <b>{0}</b><br>"<b>{1}</b>"</p>')
-                            .format(
-                                exceptionType,
-                                Utilities.html_encode(exceptionMessage)))
+                                "<p>The debugged program raised the exception"
+                                ' <b>{0}</b><br>"<b>{1}</b>"</p>'
+                            ).format(
+                                exceptionType, Utilities.html_encode(exceptionMessage)
+                            ),
+                        )
             if res == EricMessageBox.Yes:
                 self.debugServer.setDebugging(True)
                 self.exceptionInterrupt.emit()
@@ -1320,11 +1519,10 @@
                 self.debugActGrp.setEnabled(True)
                 return
             elif (
-                res == EricMessageBox.Ignore and
-                exceptionType not in self.excIgnoreList
+                res == EricMessageBox.Ignore and exceptionType not in self.excIgnoreList
             ):
                 self.excIgnoreList.append(exceptionType)
-        
+
         if self.lastAction != -1:
             if self.lastAction == 2:
                 self.__specialContinue(debuggerId)
@@ -1332,12 +1530,11 @@
                 self.debugActions[self.lastAction](debuggerId)
         else:
             self.__continue(debuggerId)
-        
-    def __clientSignal(self, message, filename, lineNo, funcName, funcArgs,
-                       debuggerId):
+
+    def __clientSignal(self, message, filename, lineNo, funcName, funcArgs, debuggerId):
         """
         Private method to handle a signal generated on the client side.
-        
+
         @param message message of the syntax error
         @type str
         @param filename translated filename of the syntax error position
@@ -1356,64 +1553,70 @@
         QApplication.processEvents()
         self.viewmanager.setFileLine(filename, lineNo, True)
         EricMessageBox.critical(
-            self.ui, Program,
-            self.tr("""<p>The program generate the signal "{0}".<br/>"""
-                    """File: <b>{1}</b>, Line: <b>{2}</b></p>""").format(
-                message, filename, lineNo))
-        
+            self.ui,
+            Program,
+            self.tr(
+                """<p>The program generate the signal "{0}".<br/>"""
+                """File: <b>{1}</b>, Line: <b>{2}</b></p>"""
+            ).format(message, filename, lineNo),
+        )
+
     def __clientGone(self, unplanned):
         """
         Private method to handle the disconnection of the debugger client.
-        
+
         @param unplanned True if the client died, False otherwise
         """
         self.__resetUI()
         if unplanned:
             EricMessageBox.information(
-                self.ui, Program,
-                self.tr('The program being debugged has terminated'
-                        ' unexpectedly.'))
-        
+                self.ui,
+                Program,
+                self.tr("The program being debugged has terminated" " unexpectedly."),
+            )
+
     def __getThreadList(self, debuggerId):
         """
         Private method to get the list of threads from the client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debugServer.remoteThreadList(debuggerId)
-        
+
     def __clientThreadSet(self, debuggerId):
         """
         Private method to handle a change of the client's current thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if self.debugServer.isDebugging():
             self.debugServer.remoteClientVariables(
-                debuggerId, 0, self.__localsVarFilterList)
-    
+                debuggerId, 0, self.__localsVarFilterList
+            )
+
     def __getClientVariables(self, debuggerId):
         """
         Private method to request the global and local variables.
-        
+
         In the first step, the global variables are requested from the client.
         Once these have been received, the local variables are requested.
         This happens in the method '__clientVariables'.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         # get globals first
         self.debugServer.remoteClientVariables(
-            debuggerId, 1, self.__globalsVarFilterList)
+            debuggerId, 1, self.__globalsVarFilterList
+        )
         # the local variables are requested once we have received the globals
-        
+
     def __clientVariables(self, scope, variables, debuggerId):
         """
         Private method to write the clients variables to the user interface.
-        
+
         @param scope scope of the variables
             (-2 = no frame found, -1 = empty locals, 1 = global, 0 = local)
         @type int
@@ -1429,21 +1632,19 @@
                 if scope == 1:
                     # now get the local variables
                     self.debugServer.remoteClientVariables(
-                        self.getSelectedDebuggerId(),
-                        0, self.__localsVarFilterList)
+                        self.getSelectedDebuggerId(), 0, self.__localsVarFilterList
+                    )
             elif scope == 0:
                 self.debugViewer.showVariables(variables, False)
             elif scope == -1:
-                vlist = [
-                    (self.tr('No locals available.'), '', '', False, -2, '')
-                ]
+                vlist = [(self.tr("No locals available."), "", "", False, -2, "")]
                 self.debugViewer.showVariables(vlist, False)
-        
+
     def __clientVariable(self, scope, variables, debuggerId):
         """
         Private method to write the contents of a clients classvariable to
         the user interface.
-        
+
         @param scope scope of the variables (-1 = empty locals, 1 = global,
             0 = local)
         @type int
@@ -1458,20 +1659,20 @@
                 self.debugViewer.showVariable(variables, True)
             elif scope == 0:
                 self.debugViewer.showVariable(variables, False)
-    
+
     def __getClientDisassembly(self, debuggerId):
         """
         Private method to ask the client for the latest traceback disassembly.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.debugServer.remoteClientDisassembly(debuggerId)
-    
+
     def __clientBreakConditionError(self, filename, lineno, debuggerId):
         """
         Private method to handle a condition error of a breakpoint.
-        
+
         @param filename filename of the breakpoint
         @type str
         @param lineno line umber of the breakpoint
@@ -1484,54 +1685,54 @@
             self.tr("Breakpoint Condition Error"),
             self.tr(
                 """<p>The condition of the breakpoint <b>{0}, {1}</b>"""
-                """ contains a syntax error.</p>""")
-            .format(filename, lineno))
-        
+                """ contains a syntax error.</p>"""
+            ).format(filename, lineno),
+        )
+
         model = self.debugServer.getBreakPointModel()
         index = model.getBreakPointIndex(filename, lineno)
         if not index.isValid():
             return
-        
+
         bp = model.getBreakPointByIndex(index)
         if not bp:
             return
-        
+
         fn, line, cond, temp, enabled, count = bp[:6]
-        
+
         # get recently used breakpoint conditions
-        rs = Preferences.Prefs.rsettings.value(
-            recentNameBreakpointConditions)
+        rs = Preferences.Prefs.rsettings.value(recentNameBreakpointConditions)
         condHistory = (
-            Preferences.toList(rs)[
-                :Preferences.getDebugger("RecentNumber")]
-            if rs is not None else
-            []
+            Preferences.toList(rs)[: Preferences.getDebugger("RecentNumber")]
+            if rs is not None
+            else []
         )
-        
+
         from .EditBreakpointDialog import EditBreakpointDialog
+
         dlg = EditBreakpointDialog(
-            (fn, line), (cond, temp, enabled, count),
-            condHistory, self.ui, modal=True)
+            (fn, line), (cond, temp, enabled, count), condHistory, self.ui, modal=True
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             cond, temp, enabled, count = dlg.getData()
-            model.setBreakPointByIndex(index, fn, line,
-                                       (cond, temp, enabled, count))
-            
+            model.setBreakPointByIndex(index, fn, line, (cond, temp, enabled, count))
+
             if cond:
                 # save the recently used breakpoint condition
                 if cond in condHistory:
                     condHistory.remove(cond)
                 condHistory.insert(0, cond)
                 Preferences.Prefs.rsettings.setValue(
-                    recentNameBreakpointConditions, condHistory)
+                    recentNameBreakpointConditions, condHistory
+                )
                 Preferences.Prefs.rsettings.sync()
-        
+
     def __clientWatchConditionError(self, cond, debuggerId):
         """
         Private method to handle a expression error of a watch expression.
-        
+
         Note: This can only happen for normal watch expressions
-        
+
         @param cond expression of the watch expression
         @type str
         @param debuggerId ID of the debugger backend
@@ -1540,31 +1741,34 @@
         EricMessageBox.critical(
             self.ui,
             self.tr("Watch Expression Error"),
-            self.tr("""<p>The watch expression <b>{0}</b>"""
-                    """ contains a syntax error.</p>""")
-            .format(cond))
-        
+            self.tr(
+                """<p>The watch expression <b>{0}</b>"""
+                """ contains a syntax error.</p>"""
+            ).format(cond),
+        )
+
         model = self.debugServer.getWatchPointModel()
         index = model.getWatchPointIndex(cond)
         if not index.isValid():
             return
-        
+
         wp = model.getWatchPointByIndex(index)
         if not wp:
             return
-        
+
         cond, special, temp, enabled, count = wp[:5]
-        
+
         from .EditWatchpointDialog import EditWatchpointDialog
-        dlg = EditWatchpointDialog(
-            (cond, temp, enabled, count, special), self.ui)
+
+        dlg = EditWatchpointDialog((cond, temp, enabled, count, special), self.ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             cond, temp, enabled, count, special = dlg.getData()
-            
+
             # check for duplicates
             idx = model.getWatchPointIndex(cond, special)
-            duplicate = (idx.isValid() and
-                         idx.internalPointer() != index.internalPointer())
+            duplicate = (
+                idx.isValid() and idx.internalPointer() != index.internalPointer()
+            )
             if duplicate:
                 if not special:
                     msg = self.tr(
@@ -1578,90 +1782,89 @@
                         """ exists.</p>"""
                     ).format(special, Utilities.html_encode(cond))
                 EricMessageBox.warning(
-                    self.ui,
-                    self.tr("Watch expression already exists"),
-                    msg)
+                    self.ui, self.tr("Watch expression already exists"), msg
+                )
                 model.deleteWatchPointByIndex(index)
             else:
-                model.setWatchPointByIndex(index, cond, special,
-                                           (temp, enabled, count))
-        
+                model.setWatchPointByIndex(index, cond, special, (temp, enabled, count))
+
     def __configureVariablesFilters(self):
         """
         Private slot for displaying the variables filter configuration dialog.
         """
         from .VariablesFilterDialog import VariablesFilterDialog
-        dlg = VariablesFilterDialog(self.ui, 'Filter Dialog', True)
-        dlg.setSelection(self.__localsVarFilterList,
-                         self.__globalsVarFilterList)
+
+        dlg = VariablesFilterDialog(self.ui, "Filter Dialog", True)
+        dlg.setSelection(self.__localsVarFilterList, self.__globalsVarFilterList)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            self.__localsVarFilterList, self.__globalsVarFilterList = (
-                dlg.getSelection()
+            self.__localsVarFilterList, self.__globalsVarFilterList = dlg.getSelection()
+            self.debugViewer.setVariablesFilter(
+                self.__globalsVarFilterList, self.__localsVarFilterList
             )
-            self.debugViewer.setVariablesFilter(
-                self.__globalsVarFilterList, self.__localsVarFilterList)
 
     def __configureExceptionsFilter(self):
         """
         Private slot for displaying the exception filter dialog.
         """
         from .ExceptionsFilterDialog import ExceptionsFilterDialog
+
         dlg = ExceptionsFilterDialog(self.excList, ignore=False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            self.excList = dlg.getExceptionsList()[:]   # keep a copy
-        
+            self.excList = dlg.getExceptionsList()[:]  # keep a copy
+
     def __configureIgnoredExceptions(self):
         """
         Private slot for displaying the ignored exceptions dialog.
         """
         from .ExceptionsFilterDialog import ExceptionsFilterDialog
+
         dlg = ExceptionsFilterDialog(self.excIgnoreList, ignore=True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            self.excIgnoreList = dlg.getExceptionsList()[:]   # keep a copy
-        
+            self.excIgnoreList = dlg.getExceptionsList()[:]  # keep a copy
+
     def __toggleBreakpoint(self):
         """
         Private slot to handle the 'Set/Reset breakpoint' action.
         """
         self.viewmanager.activeWindow().menuToggleBreakpoint()
-        
+
     def __editBreakpoint(self):
         """
         Private slot to handle the 'Edit breakpoint' action.
         """
         self.viewmanager.activeWindow().menuEditBreakpoint()
-        
+
     def __nextBreakpoint(self):
         """
         Private slot to handle the 'Next breakpoint' action.
         """
         self.viewmanager.activeWindow().menuNextBreakpoint()
-        
+
     def __previousBreakpoint(self):
         """
         Private slot to handle the 'Previous breakpoint' action.
         """
         self.viewmanager.activeWindow().menuPreviousBreakpoint()
-        
+
     def __clearBreakpoints(self):
         """
         Private slot to handle the 'Clear breakpoints' action.
         """
         self.debugServer.getBreakPointModel().deleteAll()
-        
+
     def __showDebugMenu(self):
         """
         Private method to set up the debug menu.
         """
         bpCount = self.debugServer.getBreakPointModel().rowCount()
         self.menuBreakpointsAct.setEnabled(bpCount > 0)
-        
+
     def __showBreakpointsMenu(self):
         """
         Private method to handle the show breakpoints menu signal.
         """
         self.breakpointsMenu.clear()
-        
+
         model = self.debugServer.getBreakPointModel()
         for row in range(model.rowCount()):
             index = model.index(row, 0)
@@ -1671,22 +1874,24 @@
             act = self.breakpointsMenu.addAction(
                 "{0}{1}".format(
                     Utilities.compactPath(
-                        filename,
-                        self.ui.maxMenuFilePathLen - len(bpSuffix)),
-                    bpSuffix))
+                        filename, self.ui.maxMenuFilePathLen - len(bpSuffix)
+                    ),
+                    bpSuffix,
+                )
+            )
             act.setData([filename, line])
-    
+
     def __breakpointSelected(self, act):
         """
         Private method to handle the breakpoint selected signal.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         qvList = act.data()
         filename = qvList[0]
         line = qvList[1]
         self.viewmanager.openSourceFile(filename, line)
-        
+
     def __compileChangedProjectFiles(self):
         """
         Private method to signal compilation of changed forms and resources
@@ -1699,24 +1904,24 @@
         if Preferences.getProject("AutoExecuteMake"):
             self.executeMake.emit()
         QApplication.processEvents()
-        
+
     def __coverageScript(self):
         """
         Private slot to handle the coverage of script action.
         """
         self.doCoverage(False)
-        
+
     def __coverageProject(self):
         """
         Private slot to handle the coverage of project action.
         """
         self.__compileChangedProjectFiles()
         self.doCoverage(True)
-        
+
     def doCoverage(self, runProject, script=""):
         """
         Public method to handle the coverage actions.
-        
+
         @param runProject flag indicating coverage of the current project
             (True) or script (false)
         @type bool
@@ -1724,16 +1929,16 @@
         @type str
         """
         from .StartDialog import StartDialog
-        
+
         self.__resetUI()
         doNotStart = False
-        
+
         # Get the command line arguments, the working directory and the
         # exception reporting flag.
         cap = (
             self.tr("Coverage of Project")
-            if runProject else
-            self.tr("Coverage of Script")
+            if runProject
+            else self.tr("Coverage of Script")
         )
         if runProject:
             scriptName = self.project.getMainScript(True)
@@ -1744,18 +1949,34 @@
         else:
             scriptName = ""
         dlg = StartDialog(
-            cap, self.lastUsedVenvName, self.argvHistory, self.wdHistory,
-            self.envHistory, self.exceptions, self.ui, 2,
+            cap,
+            self.lastUsedVenvName,
+            self.argvHistory,
+            self.wdHistory,
+            self.envHistory,
+            self.exceptions,
+            self.ui,
+            2,
             autoClearShell=self.autoClearShell,
             configOverride=self.overrideGlobalConfig,
-            forProject=runProject, scriptName=scriptName,
-            scriptsList=self.scriptsHistory)
+            forProject=runProject,
+            scriptName=scriptName,
+            scriptsList=self.scriptsHistory,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (lastUsedVenvName, scriptName, argv, wd, env, exceptions,
-             clearShell, console) = dlg.getData()
+            (
+                lastUsedVenvName,
+                scriptName,
+                argv,
+                wd,
+                env,
+                exceptions,
+                clearShell,
+                console,
+            ) = dlg.getData()
             configOverride = dlg.getGlobalOverrideData()
             eraseCoverage = dlg.getCoverageData()
-            
+
             if runProject:
                 fn = self.project.getMainScript(True)
                 if fn is None:
@@ -1764,22 +1985,29 @@
                         self.tr("Coverage of Project"),
                         self.tr(
                             "There is no main script defined for the"
-                            " current project. Aborting"))
+                            " current project. Aborting"
+                        ),
+                    )
                     return
-                    
-                if (
-                    Preferences.getDebugger("Autosave") and
-                    not self.project.saveAllScripts(reportSyntaxErrors=True)
-                ):
+
+                if Preferences.getDebugger(
+                    "Autosave"
+                ) and not self.project.saveAllScripts(reportSyntaxErrors=True):
                     doNotStart = True
-                
+
                 # save the info for later use
                 self.project.setDbgInfo(
-                    lastUsedVenvName, argv, wd, env, exceptions, self.excList,
-                    self.excIgnoreList, clearShell,
-                    configOverride=configOverride
+                    lastUsedVenvName,
+                    argv,
+                    wd,
+                    env,
+                    exceptions,
+                    self.excList,
+                    self.excIgnoreList,
+                    clearShell,
+                    configOverride=configOverride,
                 )
-                
+
                 self.lastStartAction = 6
                 self.clientType = self.project.getProjectLanguage()
             else:
@@ -1791,68 +2019,75 @@
                     editor = self.viewmanager.activeWindow()
                     if editor is None:
                         return
-                    
+
                     if (
                         not self.viewmanager.checkDirty(
-                            editor, Preferences.getDebugger("Autosave")) or
-                        editor.getFileName() is None
+                            editor, Preferences.getDebugger("Autosave")
+                        )
+                        or editor.getFileName() is None
                     ):
                         return
-                        
+
                     fn = editor.getFileName()
                     self.clientType = editor.determineFileType()
                 self.lastStartAction = 5
-                
+
             # save the filename for use by the restart method
             self.lastDebuggedFile = fn
             self.restartAct.setEnabled(True)
-            
+
             # save the most recently used virtual environment
             self.lastUsedVenvName = lastUsedVenvName
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             self.setScriptsHistory(scriptName)
             self.setArgvHistory(argv)
             self.setWdHistory(wd)
             self.setEnvHistory(env)
-            
+
             # Save the exception flags
             self.exceptions = exceptions
-            
+
             # Save the erase coverage flag
             self.eraseCoverage = eraseCoverage
-            
+
             # Save the clear interpreter flag
             self.autoClearShell = clearShell
-            
+
             # Save the run in console flag
             self.runInConsole = console
-            
+
             # Save the global config override data
             self.overrideGlobalConfig = copy.deepcopy(configOverride)
-            
+
             # Hide all error highlights
             self.viewmanager.unhighlight()
-            
+
             if not doNotStart:
-                if runProject and self.project.getProjectType() in [
-                        "E7Plugin"]:
+                if runProject and self.project.getProjectType() in ["E7Plugin"]:
                     argv = '--plugin="{0}" {1}'.format(fn, argv)
-                    fn = os.path.join(getConfig('ericDir'), "eric7.py")
-                
+                    fn = os.path.join(getConfig("ericDir"), "eric7.py")
+
                 self.debugViewer.initCallStackViewer(runProject)
-                
+
                 # Ask the client to open the new program.
                 self.debugServer.remoteCoverage(
-                    lastUsedVenvName, fn, argv, wd, env,
-                    autoClearShell=self.autoClearShell, erase=eraseCoverage,
-                    forProject=runProject, runInConsole=console,
+                    lastUsedVenvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
+                    autoClearShell=self.autoClearShell,
+                    erase=eraseCoverage,
+                    forProject=runProject,
+                    runInConsole=console,
                     clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-                
+                    configOverride=self.overrideGlobalConfig,
+                )
+
                 self.stopAct.setEnabled(True)
-        
+
         if dlg.clearHistories():
             self.setScriptsHistory("", clearHistories=True)
             self.setArgvHistory("", clearHistories=True)
@@ -1860,30 +2095,29 @@
             self.setEnvHistory("", clearHistories=True)
             self.setMultiprocessNoDebugHistory("", clearHistories=True)
         elif dlg.historiesModified():
-            (scriptsHistory, argvHistory, wdHistory, envHistory,
-             _) = dlg.getHistories()
+            (scriptsHistory, argvHistory, wdHistory, envHistory, _) = dlg.getHistories()
             self.setScriptsHistory("", history=scriptsHistory)
             self.setArgvHistory("", history=argvHistory)
             self.setWdHistory("", history=wdHistory)
             self.setEnvHistory("", history=envHistory)
-    
+
     def __profileScript(self):
         """
         Private slot to handle the profile script action.
         """
         self.doProfile(False)
-        
+
     def __profileProject(self):
         """
         Private slot to handle the profile project action.
         """
         self.__compileChangedProjectFiles()
         self.doProfile(True)
-        
+
     def doProfile(self, runProject, script=""):
         """
         Public method to handle the profile actions.
-        
+
         @param runProject flag indicating profiling of the current project
             (True) or script (False)
         @type bool
@@ -1891,16 +2125,16 @@
         @type str
         """
         from .StartDialog import StartDialog
-        
+
         self.__resetUI()
         doNotStart = False
-        
+
         # Get the command line arguments, the working directory and the
         # exception reporting flag.
         cap = (
             self.tr("Profile of Project")
-            if runProject else
-            self.tr("Profile of Script")
+            if runProject
+            else self.tr("Profile of Script")
         )
         if runProject:
             scriptName = self.project.getMainScript(True)
@@ -1911,18 +2145,34 @@
         else:
             scriptName = ""
         dlg = StartDialog(
-            cap, self.lastUsedVenvName, self.argvHistory, self.wdHistory,
-            self.envHistory, self.exceptions, self.ui, 3,
+            cap,
+            self.lastUsedVenvName,
+            self.argvHistory,
+            self.wdHistory,
+            self.envHistory,
+            self.exceptions,
+            self.ui,
+            3,
             autoClearShell=self.autoClearShell,
             configOverride=self.overrideGlobalConfig,
-            forProject=runProject, scriptName=scriptName,
-            scriptsList=self.scriptsHistory)
+            forProject=runProject,
+            scriptName=scriptName,
+            scriptsList=self.scriptsHistory,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (lastUsedVenvName, scriptName, argv, wd, env, exceptions,
-             clearShell, console) = dlg.getData()
+            (
+                lastUsedVenvName,
+                scriptName,
+                argv,
+                wd,
+                env,
+                exceptions,
+                clearShell,
+                console,
+            ) = dlg.getData()
             configOverride = dlg.getGlobalOverrideData()
             eraseTimings = dlg.getProfilingData()
-            
+
             if runProject:
                 fn = self.project.getMainScript(True)
                 if fn is None:
@@ -1931,22 +2181,29 @@
                         self.tr("Profile of Project"),
                         self.tr(
                             "There is no main script defined for the"
-                            " current project. Aborting"))
+                            " current project. Aborting"
+                        ),
+                    )
                     return
-                    
-                if (
-                    Preferences.getDebugger("Autosave") and
-                    not self.project.saveAllScripts(reportSyntaxErrors=True)
-                ):
+
+                if Preferences.getDebugger(
+                    "Autosave"
+                ) and not self.project.saveAllScripts(reportSyntaxErrors=True):
                     doNotStart = True
-                
+
                 # save the info for later use
                 self.project.setDbgInfo(
-                    lastUsedVenvName, argv, wd, env, exceptions, self.excList,
-                    self.excIgnoreList, clearShell,
-                    configOverride=configOverride
+                    lastUsedVenvName,
+                    argv,
+                    wd,
+                    env,
+                    exceptions,
+                    self.excList,
+                    self.excIgnoreList,
+                    clearShell,
+                    configOverride=configOverride,
                 )
-                
+
                 self.lastStartAction = 8
                 self.clientType = self.project.getProjectLanguage()
             else:
@@ -1958,68 +2215,75 @@
                     editor = self.viewmanager.activeWindow()
                     if editor is None:
                         return
-                    
+
                     if (
                         not self.viewmanager.checkDirty(
-                            editor, Preferences.getDebugger("Autosave")) or
-                        editor.getFileName() is None
+                            editor, Preferences.getDebugger("Autosave")
+                        )
+                        or editor.getFileName() is None
                     ):
                         return
-                        
+
                     fn = editor.getFileName()
                     self.clientType = editor.determineFileType()
                 self.lastStartAction = 7
-                
+
             # save the filename for use by the restart method
             self.lastDebuggedFile = fn
             self.restartAct.setEnabled(True)
-            
+
             # save the most recently used virtual environment
             self.lastUsedVenvName = lastUsedVenvName
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             self.setScriptsHistory(scriptName)
             self.setArgvHistory(argv)
             self.setWdHistory(wd)
             self.setEnvHistory(env)
-            
+
             # Save the exception flags
             self.exceptions = exceptions
-            
+
             # Save the erase timing flag
             self.eraseTimings = eraseTimings
-            
+
             # Save the clear interpreter flag
             self.autoClearShell = clearShell
-            
+
             # Save the run in console flag
             self.runInConsole = console
-            
+
             # Save the global config override data
             self.overrideGlobalConfig = copy.deepcopy(configOverride)
-            
+
             # Hide all error highlights
             self.viewmanager.unhighlight()
-            
+
             if not doNotStart:
-                if runProject and self.project.getProjectType() in [
-                        "E7Plugin"]:
+                if runProject and self.project.getProjectType() in ["E7Plugin"]:
                     argv = '--plugin="{0}" {1}'.format(fn, argv)
-                    fn = os.path.join(getConfig('ericDir'), "eric7.py")
-                
+                    fn = os.path.join(getConfig("ericDir"), "eric7.py")
+
                 self.debugViewer.initCallStackViewer(runProject)
-                
+
                 # Ask the client to open the new program.
                 self.debugServer.remoteProfile(
-                    lastUsedVenvName, fn, argv, wd, env,
-                    autoClearShell=self.autoClearShell, erase=eraseTimings,
-                    forProject=runProject, runInConsole=console,
+                    lastUsedVenvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
+                    autoClearShell=self.autoClearShell,
+                    erase=eraseTimings,
+                    forProject=runProject,
+                    runInConsole=console,
                     clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-                
+                    configOverride=self.overrideGlobalConfig,
+                )
+
                 self.stopAct.setEnabled(True)
-        
+
         if dlg.clearHistories():
             self.setScriptsHistory("", clearHistories=True)
             self.setArgvHistory("", clearHistories=True)
@@ -2027,30 +2291,29 @@
             self.setEnvHistory("", clearHistories=True)
             self.setMultiprocessNoDebugHistory("", clearHistories=True)
         elif dlg.historiesModified():
-            (scriptsHistory, argvHistory, wdHistory, envHistory,
-             _) = dlg.getHistories()
+            (scriptsHistory, argvHistory, wdHistory, envHistory, _) = dlg.getHistories()
             self.setScriptsHistory("", history=scriptsHistory)
             self.setArgvHistory("", history=argvHistory)
             self.setWdHistory("", history=wdHistory)
             self.setEnvHistory("", history=envHistory)
-    
+
     def __runScript(self):
         """
         Private slot to handle the run script action.
         """
         self.doRun(False)
-        
+
     def __runProject(self):
         """
         Private slot to handle the run project action.
         """
         self.__compileChangedProjectFiles()
         self.doRun(True)
-        
+
     def doRun(self, runProject, script=""):
         """
         Public method to handle the run actions.
-        
+
         @param runProject flag indicating running the current project (True)
                 or script (False)
         @type bool
@@ -2058,17 +2321,13 @@
         @type str
         """
         from .StartDialog import StartDialog
-        
+
         self.__resetUI()
         doNotStart = False
-        
+
         # Get the command line arguments, the working directory and the
         # exception reporting flag.
-        cap = (
-            self.tr("Run Project")
-            if runProject else
-            self.tr("Run Script")
-        )
+        cap = self.tr("Run Project") if runProject else self.tr("Run Script")
         if runProject:
             scriptName = self.project.getMainScript(True)
         elif script:
@@ -2078,17 +2337,33 @@
         else:
             scriptName = ""
         dlg = StartDialog(
-            cap, self.lastUsedVenvName, self.argvHistory, self.wdHistory,
-            self.envHistory, self.exceptions, self.ui, 1,
+            cap,
+            self.lastUsedVenvName,
+            self.argvHistory,
+            self.wdHistory,
+            self.envHistory,
+            self.exceptions,
+            self.ui,
+            1,
             autoClearShell=self.autoClearShell,
             configOverride=self.overrideGlobalConfig,
-            forProject=runProject, scriptName=scriptName,
-            scriptsList=self.scriptsHistory)
+            forProject=runProject,
+            scriptName=scriptName,
+            scriptsList=self.scriptsHistory,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (lastUsedVenvName, scriptName, argv, wd, env, exceptions,
-             clearShell, console) = dlg.getData()
+            (
+                lastUsedVenvName,
+                scriptName,
+                argv,
+                wd,
+                env,
+                exceptions,
+                clearShell,
+                console,
+            ) = dlg.getData()
             configOverride = dlg.getGlobalOverrideData()
-            
+
             if runProject:
                 fn = self.project.getMainScript(True)
                 if fn is None:
@@ -2097,22 +2372,29 @@
                         self.tr("Run Project"),
                         self.tr(
                             "There is no main script defined for the"
-                            " current project. Aborting"))
+                            " current project. Aborting"
+                        ),
+                    )
                     return
-                    
-                if (
-                    Preferences.getDebugger("Autosave") and
-                    not self.project.saveAllScripts(reportSyntaxErrors=True)
-                ):
+
+                if Preferences.getDebugger(
+                    "Autosave"
+                ) and not self.project.saveAllScripts(reportSyntaxErrors=True):
                     doNotStart = True
-                
+
                 # save the info for later use
                 self.project.setDbgInfo(
-                    lastUsedVenvName, argv, wd, env, exceptions, self.excList,
-                    self.excIgnoreList, clearShell,
-                    configOverride=configOverride
+                    lastUsedVenvName,
+                    argv,
+                    wd,
+                    env,
+                    exceptions,
+                    self.excList,
+                    self.excIgnoreList,
+                    clearShell,
+                    configOverride=configOverride,
                 )
-                
+
                 self.lastStartAction = 4
                 self.clientType = self.project.getProjectLanguage()
             else:
@@ -2124,65 +2406,71 @@
                     editor = self.viewmanager.activeWindow()
                     if editor is None:
                         return
-                    
+
                     if (
                         not self.viewmanager.checkDirty(
-                            editor,
-                            Preferences.getDebugger("Autosave")) or
-                        editor.getFileName() is None
+                            editor, Preferences.getDebugger("Autosave")
+                        )
+                        or editor.getFileName() is None
                     ):
                         return
-                    
+
                     fn = editor.getFileName()
                     self.clientType = editor.determineFileType()
                 self.lastStartAction = 3
-            
+
             # save the filename for use by the restart method
             self.lastDebuggedFile = fn
             self.restartAct.setEnabled(True)
-            
+
             # save the most recently used virtual environment
             self.lastUsedVenvName = lastUsedVenvName
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             self.setScriptsHistory(scriptName)
             self.setArgvHistory(argv)
             self.setWdHistory(wd)
             self.setEnvHistory(env)
-            
+
             # Save the exception flags
             self.exceptions = exceptions
-            
+
             # Save the clear interpreter flag
             self.autoClearShell = clearShell
-            
+
             # Save the run in console flag
             self.runInConsole = console
-            
+
             # Save the global config override data
             self.overrideGlobalConfig = copy.deepcopy(configOverride)
-            
+
             # Hide all error highlights
             self.viewmanager.unhighlight()
-            
+
             if not doNotStart:
-                if runProject and self.project.getProjectType() in [
-                        "E7Plugin"]:
+                if runProject and self.project.getProjectType() in ["E7Plugin"]:
                     argv = '--plugin="{0}" {1}'.format(fn, argv)
-                    fn = os.path.join(getConfig('ericDir'), "eric7.py")
-                
+                    fn = os.path.join(getConfig("ericDir"), "eric7.py")
+
                 self.debugViewer.initCallStackViewer(runProject)
-                
+
                 # Ask the client to open the new program.
                 self.debugServer.remoteRun(
-                    lastUsedVenvName, fn, argv, wd, env,
-                    autoClearShell=self.autoClearShell, forProject=runProject,
-                    runInConsole=console, clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-                
+                    lastUsedVenvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
+                    autoClearShell=self.autoClearShell,
+                    forProject=runProject,
+                    runInConsole=console,
+                    clientType=self.clientType,
+                    configOverride=self.overrideGlobalConfig,
+                )
+
                 self.stopAct.setEnabled(True)
-        
+
         if dlg.clearHistories():
             self.setScriptsHistory("", clearHistories=True)
             self.setArgvHistory("", clearHistories=True)
@@ -2190,30 +2478,29 @@
             self.setEnvHistory("", clearHistories=True)
             self.setMultiprocessNoDebugHistory("", clearHistories=True)
         elif dlg.historiesModified():
-            (scriptsHistory, argvHistory, wdHistory, envHistory,
-             _) = dlg.getHistories()
+            (scriptsHistory, argvHistory, wdHistory, envHistory, _) = dlg.getHistories()
             self.setScriptsHistory("", history=scriptsHistory)
             self.setArgvHistory("", history=argvHistory)
             self.setWdHistory("", history=wdHistory)
             self.setEnvHistory("", history=envHistory)
-    
+
     def __debugScript(self):
         """
         Private slot to handle the debug script action.
         """
         self.doDebug(False)
-        
+
     def __debugProject(self):
         """
         Private slot to handle the debug project action.
         """
         self.__compileChangedProjectFiles()
         self.doDebug(True)
-        
+
     def doDebug(self, debugProject, script=""):
         """
         Public method to handle the debug actions.
-        
+
         @param debugProject flag indicating debugging the current project
             (True) or script (False)
         @type bool
@@ -2221,17 +2508,13 @@
         @type str
         """
         from .StartDialog import StartDialog
-        
+
         self.__resetUI()
         doNotStart = False
-        
+
         # Get the command line arguments, the working directory and the
         # exception reporting flag.
-        cap = (
-            self.tr("Debug Project")
-            if debugProject else
-            self.tr("Debug Script")
-        )
+        cap = self.tr("Debug Project") if debugProject else self.tr("Debug Script")
         if debugProject:
             scriptName = self.project.getMainScript(True)
         elif script:
@@ -2241,22 +2524,43 @@
         else:
             scriptName = ""
         dlg = StartDialog(
-            cap, self.lastUsedVenvName, self.argvHistory, self.wdHistory,
-            self.envHistory, self.exceptions, self.ui, 0,
-            tracePython=self.tracePython, autoClearShell=self.autoClearShell,
+            cap,
+            self.lastUsedVenvName,
+            self.argvHistory,
+            self.wdHistory,
+            self.envHistory,
+            self.exceptions,
+            self.ui,
+            0,
+            tracePython=self.tracePython,
+            autoClearShell=self.autoClearShell,
             autoContinue=self.autoContinue,
             enableMultiprocess=self.enableMultiprocess,
             multiprocessNoDebugHistory=self.multiprocessNoDebugHistory,
             configOverride=self.overrideGlobalConfig,
-            forProject=debugProject, scriptName=scriptName,
-            scriptsList=self.scriptsHistory)
+            forProject=debugProject,
+            scriptName=scriptName,
+            scriptsList=self.scriptsHistory,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (lastUsedVenvName, scriptName, argv, wd, env, exceptions,
-             clearShell, console) = dlg.getData()
+            (
+                lastUsedVenvName,
+                scriptName,
+                argv,
+                wd,
+                env,
+                exceptions,
+                clearShell,
+                console,
+            ) = dlg.getData()
             configOverride = dlg.getGlobalOverrideData()
-            (tracePython, autoContinue, enableMultiprocess,
-             multiprocessNoDebug) = dlg.getDebugData()
-            
+            (
+                tracePython,
+                autoContinue,
+                enableMultiprocess,
+                multiprocessNoDebug,
+            ) = dlg.getDebugData()
+
             if debugProject:
                 fn = self.project.getMainScript(True)
                 if fn is None:
@@ -2265,25 +2569,33 @@
                         self.tr("Debug Project"),
                         self.tr(
                             "There is no main script defined for the"
-                            " current project. No debugging possible."))
+                            " current project. No debugging possible."
+                        ),
+                    )
                     return
-                    
-                if (
-                    Preferences.getDebugger("Autosave") and
-                    not self.project.saveAllScripts(reportSyntaxErrors=True)
-                ):
+
+                if Preferences.getDebugger(
+                    "Autosave"
+                ) and not self.project.saveAllScripts(reportSyntaxErrors=True):
                     doNotStart = True
-                
+
                 # save the info for later use
                 self.project.setDbgInfo(
-                    lastUsedVenvName, argv, wd, env, exceptions, self.excList,
-                    self.excIgnoreList, clearShell, tracePython=tracePython,
+                    lastUsedVenvName,
+                    argv,
+                    wd,
+                    env,
+                    exceptions,
+                    self.excList,
+                    self.excIgnoreList,
+                    clearShell,
+                    tracePython=tracePython,
                     autoContinue=autoContinue,
                     enableMultiprocess=enableMultiprocess,
                     multiprocessNoDebug=multiprocessNoDebug,
-                    configOverride=configOverride
+                    configOverride=configOverride,
                 )
-                
+
                 self.lastStartAction = 2
                 self.clientType = self.project.getProjectLanguage()
             else:
@@ -2295,92 +2607,99 @@
                     editor = self.viewmanager.activeWindow()
                     if editor is None:
                         return
-                    
+
                     if (
                         not self.viewmanager.checkDirty(
-                            editor, Preferences.getDebugger("Autosave")) or
-                        editor.getFileName() is None
+                            editor, Preferences.getDebugger("Autosave")
+                        )
+                        or editor.getFileName() is None
                     ):
                         return
-                        
+
                     fn = editor.getFileName()
                     self.clientType = editor.determineFileType()
                 self.lastStartAction = 1
-            
+
             # save the filename for use by the restart method
             self.lastDebuggedFile = fn
             self.restartAct.setEnabled(True)
-            
+
             # save the most recently used virtual environment
             self.lastUsedVenvName = lastUsedVenvName
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             self.setScriptsHistory(scriptName)
             self.setArgvHistory(argv)
             self.setWdHistory(wd)
             self.setEnvHistory(env)
-            
+
             # Save the exception flags
             self.exceptions = exceptions
-            
+
             # Save the tracePython flag
             self.tracePython = tracePython
-            
+
             # Save the clear interpreter flag
             self.autoClearShell = clearShell
-            
+
             # Save the run in console flag
             self.runInConsole = console
-            
+
             # Save the auto continue flag
             self.autoContinue = autoContinue
-            
+
             # Save the multiprocess debugging data
             self.enableMultiprocess = enableMultiprocess
             self.setMultiprocessNoDebugHistory(multiprocessNoDebug)
-            
+
             # Save the global config override data
             self.overrideGlobalConfig = copy.deepcopy(configOverride)
-            
+
             # Hide all error highlights
             self.viewmanager.unhighlight()
-            
+
             if not doNotStart:
-                if debugProject and self.project.getProjectType() in [
-                        "E7Plugin"]:
+                if debugProject and self.project.getProjectType() in ["E7Plugin"]:
                     argv = '--plugin="{0}" {1}'.format(fn, argv)
-                    fn = os.path.join(getConfig('ericDir'), "eric7.py")
+                    fn = os.path.join(getConfig("ericDir"), "eric7.py")
                     tracePython = True  # override flag because it must be true
-                
+
                 self.debugViewer.initCallStackViewer(debugProject)
-                
+
                 # Ask the client to send call trace info
                 enableCallTrace = self.debugViewer.isCallTraceEnabled()
                 self.debugViewer.clearCallTrace()
                 self.debugViewer.setCallTraceToProjectMode(debugProject)
-                
+
                 # Ask the client to open the new program.
                 self.debugServer.remoteLoad(
-                    lastUsedVenvName, fn, argv, wd, env,
+                    lastUsedVenvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
                     autoClearShell=self.autoClearShell,
                     tracePython=tracePython,
-                    autoContinue=autoContinue, forProject=debugProject,
-                    runInConsole=console, clientType=self.clientType,
+                    autoContinue=autoContinue,
+                    forProject=debugProject,
+                    runInConsole=console,
+                    clientType=self.clientType,
                     enableCallTrace=enableCallTrace,
                     enableMultiprocess=enableMultiprocess,
                     multiprocessNoDebug=multiprocessNoDebug,
-                    configOverride=self.overrideGlobalConfig)
-                
+                    configOverride=self.overrideGlobalConfig,
+                )
+
                 if (
-                    self.debugServer.isClientProcessUp() and
-                    self.debugServer.getClientType() == self.clientType
+                    self.debugServer.isClientProcessUp()
+                    and self.debugServer.getClientType() == self.clientType
                 ):
                     # Signal that we have started a debugging session
                     self.debuggingStarted.emit(fn)
-                    
+
                     self.stopAct.setEnabled(True)
-        
+
         if dlg.clearHistories():
             self.setScriptsHistory("", clearHistories=True)
             self.setArgvHistory("", clearHistories=True)
@@ -2388,14 +2707,19 @@
             self.setEnvHistory("", clearHistories=True)
             self.setMultiprocessNoDebugHistory("", clearHistories=True)
         elif dlg.historiesModified():
-            (scriptsHistory, argvHistory, wdHistory, envHistory,
-             noDebugHistory) = dlg.getHistories()
+            (
+                scriptsHistory,
+                argvHistory,
+                wdHistory,
+                envHistory,
+                noDebugHistory,
+            ) = dlg.getHistories()
             self.setScriptsHistory("", history=scriptsHistory)
             self.setArgvHistory("", history=argvHistory)
             self.setWdHistory("", history=wdHistory)
             self.setEnvHistory("", history=envHistory)
             self.setMultiprocessNoDebugHistory("", history=noDebugHistory)
-    
+
     def __doRestart(self):
         """
         Private slot to handle the restart action to restart the last
@@ -2403,56 +2727,56 @@
         """
         self.__resetUI()
         doNotStart = False
-        
+
         # first save any changes
         if self.lastStartAction in [1, 3, 5, 7, 9]:
             editor = self.viewmanager.getOpenEditor(self.lastDebuggedFile)
-            if (
-                editor and
-                not self.viewmanager.checkDirty(
-                    editor, Preferences.getDebugger("Autosave"))
+            if editor and not self.viewmanager.checkDirty(
+                editor, Preferences.getDebugger("Autosave")
             ):
                 return
             forProject = False
         elif self.lastStartAction in [2, 4, 6, 8, 10]:
-            if (
-                Preferences.getDebugger("Autosave") and
-                not self.project.saveAllScripts(reportSyntaxErrors=True)
+            if Preferences.getDebugger("Autosave") and not self.project.saveAllScripts(
+                reportSyntaxErrors=True
             ):
                 doNotStart = True
             self.__compileChangedProjectFiles()
             forProject = True
         else:
-            return      # should not happen
-                    
+            return  # should not happen
+
         # get the saved stuff
         venvName = self.lastUsedVenvName
         wd = self.wdHistory[0]
         argv = self.argvHistory[0]
         fn = self.lastDebuggedFile
         env = self.envHistory[0]
-        
+
         # Hide all error highlights
         self.viewmanager.unhighlight()
-        
+
         if not doNotStart:
-            if forProject and self.project.getProjectType() in [
-                    "E7Plugin"]:
+            if forProject and self.project.getProjectType() in ["E7Plugin"]:
                 argv = '--plugin="{0}" {1}'.format(fn, argv)
-                fn = os.path.join(getConfig('ericDir'), "eric7.py")
-            
+                fn = os.path.join(getConfig("ericDir"), "eric7.py")
+
             self.debugViewer.initCallStackViewer(forProject)
-            
+
             if self.lastStartAction in [1, 2]:
                 # Ask the client to send call trace info
                 enableCallTrace = self.debugViewer.isCallTraceEnabled()
                 self.debugViewer.clearCallTrace()
                 self.debugViewer.setCallTraceToProjectMode(forProject)
                 multiprocessNoDebug = self.multiprocessNoDebugHistory[0]
-                
+
                 # Ask the client to debug the new program.
                 self.debugServer.remoteLoad(
-                    venvName, fn, argv, wd, env,
+                    venvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
                     autoClearShell=self.autoClearShell,
                     tracePython=self.tracePython,
                     autoContinue=self.autoContinue,
@@ -2462,83 +2786,99 @@
                     enableCallTrace=enableCallTrace,
                     enableMultiprocess=self.enableMultiprocess,
                     multiprocessNoDebug=multiprocessNoDebug,
-                    configOverride=self.overrideGlobalConfig)
-                
+                    configOverride=self.overrideGlobalConfig,
+                )
+
                 # Signal that we have started a debugging session
                 self.debuggingStarted.emit(fn)
-            
+
             elif self.lastStartAction in [3, 4]:
                 # Ask the client to run the new program.
                 self.debugServer.remoteRun(
-                    venvName, fn, argv, wd, env,
+                    venvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
                     autoClearShell=self.autoClearShell,
                     forProject=forProject,
                     runInConsole=self.runInConsole,
                     clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-            
+                    configOverride=self.overrideGlobalConfig,
+                )
+
             elif self.lastStartAction in [5, 6]:
                 # Ask the client to coverage run the new program.
                 self.debugServer.remoteCoverage(
-                    venvName, fn, argv, wd, env,
+                    venvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
                     autoClearShell=self.autoClearShell,
                     erase=self.eraseCoverage,
                     forProject=forProject,
                     runInConsole=self.runInConsole,
                     clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-            
+                    configOverride=self.overrideGlobalConfig,
+                )
+
             elif self.lastStartAction in [7, 8]:
                 # Ask the client to profile run the new program.
                 self.debugServer.remoteProfile(
-                    venvName, fn, argv, wd, env,
+                    venvName,
+                    fn,
+                    argv,
+                    wd,
+                    env,
                     autoClearShell=self.autoClearShell,
                     erase=self.eraseTimings,
                     forProject=forProject,
                     runInConsole=self.runInConsole,
                     clientType=self.clientType,
-                    configOverride=self.overrideGlobalConfig)
-            
+                    configOverride=self.overrideGlobalConfig,
+                )
+
             self.stopAct.setEnabled(True)
-        
+
     def __stopScript(self):
         """
         Private slot to stop the running script.
         """
         self.debugServer.startClient(False)
-        
+
     def __passiveDebugStarted(self, fn, exc):
         """
         Private slot to handle a passive debug session start.
-        
+
         @param fn filename of the debugged script
         @param exc flag to enable exception reporting of the IDE (boolean)
         """
         # Hide all error highlights
         self.viewmanager.unhighlight()
-        
+
         # Set filename of script being debugged
         self.ui.currentProg = fn
-        
+
         # Set exception reporting
         self.setExceptionReporting(exc)
-        
+
         # Signal that we have started a debugging session
         self.debuggingStarted.emit(fn)
-        
+
         # Initialize the call stack viewer
         self.debugViewer.initCallStackViewer(False)
-        
+
     def __continue(self, debuggerId=""):
         """
         Private method to handle the Continue action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 0
         self.__enterRemote()
         self.debugServer.remoteContinue(debuggerId)
@@ -2546,13 +2886,13 @@
     def __specialContinue(self, debuggerId=""):
         """
         Private method to handle the Special Continue action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 2
         self.__enterRemote()
         self.debugServer.remoteContinue(debuggerId, 1)
@@ -2560,13 +2900,13 @@
     def __step(self, debuggerId=""):
         """
         Private method to handle the Step action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 1
         self.__enterRemote()
         self.debugServer.remoteStep(debuggerId)
@@ -2574,13 +2914,13 @@
     def __stepOver(self, debuggerId=""):
         """
         Private method to handle the Step Over action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 2
         self.__enterRemote()
         self.debugServer.remoteStepOver(debuggerId)
@@ -2588,13 +2928,13 @@
     def __stepOut(self, debuggerId=""):
         """
         Private method to handle the Step Out action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 3
         self.__enterRemote()
         self.debugServer.remoteStepOut(debuggerId)
@@ -2602,13 +2942,13 @@
     def __stepQuit(self, debuggerId=""):
         """
         Private method to handle the Step Quit action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 4
         self.__enterRemote()
         self.debugServer.remoteStepQuit(debuggerId)
@@ -2617,32 +2957,32 @@
     def __runToCursor(self, debuggerId=""):
         """
         Private method to handle the Run to Cursor action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 0
         aw = self.viewmanager.activeWindow()
         line = aw.getCursorPosition()[0] + 1
         self.__enterRemote()
         self.debugServer.remoteBreakpoint(
-            self.getSelectedDebuggerId(),
-            aw.getFileName(), line, 1, None, 1)
+            self.getSelectedDebuggerId(), aw.getFileName(), line, 1, None, 1
+        )
         self.debugServer.remoteContinue(debuggerId)
 
     def __runUntil(self, debuggerId=""):
         """
         Private method to handle the Run Until action.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 0
         aw = self.viewmanager.activeWindow()
         line = aw.getCursorPosition()[0] + 1
@@ -2652,13 +2992,13 @@
     def __moveInstructionPointer(self, debuggerId=""):
         """
         Private method to move the instruction pointer to a different line.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         if not debuggerId:
             debuggerId = self.getSelectedDebuggerId()
-        
+
         self.lastAction = 0
         aw = self.viewmanager.activeWindow()
         line = aw.getCursorPosition()[0] + 1
@@ -2673,40 +3013,41 @@
         """
         # Disable further debug commands from the user.
         self.debugActGrp.setEnabled(False)
-        
+
         self.viewmanager.unhighlight(True)
 
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-    
+
     def getSelectedDebuggerId(self):
         """
         Public method to get the currently selected debugger ID.
-        
+
         @return selected debugger ID
         @rtype str
         """
         return self.debugViewer.getSelectedDebuggerId()
-    
+
     def setDebugActionsEnabled(self, enable):
         """
         Public method to set the enabled state of the debug actions.
-        
+
         @param enable enable state to be set
         @type bool
         """
         self.debugActGrp.setEnabled(enable)
 
-    def setMultiprocessNoDebugHistory(self, noDebugList, clearHistories=False,
-                                      history=None):
+    def setMultiprocessNoDebugHistory(
+        self, noDebugList, clearHistories=False, history=None
+    ):
         """
         Public slot to initialize the no debug list history.
-        
+
         @param noDebugList whitespace separated list of programs not to be
             debugged
         @type str
@@ -2723,21 +3064,21 @@
             if noDebugList in self.multiprocessNoDebugHistory:
                 self.multiprocessNoDebugHistory.remove(noDebugList)
             self.multiprocessNoDebugHistory.insert(0, noDebugList)
-    
+
     def setEnableMultiprocess(self, enableMultiprocess):
         """
         Public slot to initialize the enableMultiprocess flag.
-        
+
         @param enableMultiprocess flag indicating, that the debugger should be
             run in multi process mode
         @type bool
         """
         self.enableMultiprocess = enableMultiprocess
-    
+
     def setEnableGlobalConfigOverride(self, overrideData):
         """
         Public method to initialize the global config override data.
-        
+
         @param overrideData dictionary containing a flag indicating to enable
             global config override and a flag indicating to redirect
             stdin/stdout/stderr
--- a/src/eric7/Debugger/DebugViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebugViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,8 +25,18 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QCoreApplication
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QSizePolicy, QPushButton,
-    QComboBox, QLabel, QTreeWidget, QTreeWidgetItem, QHeaderView, QSplitter
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLineEdit,
+    QSizePolicy,
+    QPushButton,
+    QComboBox,
+    QLabel,
+    QTreeWidget,
+    QTreeWidgetItem,
+    QHeaderView,
+    QSplitter,
 )
 
 import UI.PixmapCache
@@ -38,21 +48,22 @@
 class DebugViewer(QWidget):
     """
     Class implementing a widget containing various debug related views.
-    
+
     The individual tabs contain the interpreter shell (optional),
     the filesystem browser (optional), the two variables viewers
     (global and local), a breakpoint viewer, a watch expression viewer and
     the exception logger. Additionally a list of all threads is shown.
-    
+
     @signal sourceFile(string, int) emitted to open a source file at a line
     @signal preferencesChanged() emitted to react on changed preferences
     """
+
     sourceFile = pyqtSignal(str, int)
     preferencesChanged = pyqtSignal()
-    
+
     ThreadIdRole = Qt.ItemDataRole.UserRole + 1
     DebuggerStateRole = Qt.ItemDataRole.UserRole + 2
-    
+
     # Map debug state to icon name
     StateIcon = {
         "broken": "break",
@@ -60,306 +71,301 @@
         "running": "mediaPlaybackStart",
         "syntax": "syntaxError22",
     }
-    
+
     # Map debug state to user message
     StateMessage = {
-        "broken": QCoreApplication.translate(
-            "DebugViewer", "waiting at breakpoint"),
-        "exception": QCoreApplication.translate(
-            "DebugViewer", "waiting at exception"),
-        "running": QCoreApplication.translate(
-            "DebugViewer", "running"),
-        "syntax": QCoreApplication.translate(
-            "DebugViewer", "syntax error"),
+        "broken": QCoreApplication.translate("DebugViewer", "waiting at breakpoint"),
+        "exception": QCoreApplication.translate("DebugViewer", "waiting at exception"),
+        "running": QCoreApplication.translate("DebugViewer", "running"),
+        "syntax": QCoreApplication.translate("DebugViewer", "syntax error"),
     }
-    
+
     def __init__(self, debugServer, parent=None):
         """
         Constructor
-        
+
         @param debugServer reference to the debug server object
         @type DebugServer
         @param parent parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.debugServer = debugServer
         self.debugUI = None
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__mainLayout = QVBoxLayout()
         self.__mainLayout.setContentsMargins(0, 3, 0, 0)
         self.setLayout(self.__mainLayout)
-        
+
         self.__mainSplitter = QSplitter(Qt.Orientation.Vertical, self)
         self.__mainLayout.addWidget(self.__mainSplitter)
-        
+
         # add the viewer showing the connected debug backends
         self.__debuggersWidget = QWidget()
         self.__debuggersLayout = QVBoxLayout(self.__debuggersWidget)
         self.__debuggersLayout.setContentsMargins(0, 0, 0, 0)
-        self.__debuggersLayout.addWidget(
-            QLabel(self.tr("Debuggers and Threads:")))
+        self.__debuggersLayout.addWidget(QLabel(self.tr("Debuggers and Threads:")))
         self.__debuggersList = QTreeWidget()
-        self.__debuggersList.setHeaderLabels(
-            [self.tr("ID"), self.tr("State"), ""])
+        self.__debuggersList.setHeaderLabels([self.tr("ID"), self.tr("State"), ""])
         self.__debuggersList.header().setStretchLastSection(True)
         self.__debuggersList.setSortingEnabled(True)
         self.__debuggersList.setRootIsDecorated(True)
         self.__debuggersList.setAlternatingRowColors(True)
         self.__debuggersLayout.addWidget(self.__debuggersList)
         self.__mainSplitter.addWidget(self.__debuggersWidget)
-        
-        self.__debuggersList.currentItemChanged.connect(
-            self.__debuggerSelected)
-        
+
+        self.__debuggersList.currentItemChanged.connect(self.__debuggerSelected)
+
         # add the tab widget containing various debug related views
         self.__tabWidget = EricTabWidget()
         self.__mainSplitter.addWidget(self.__tabWidget)
-        
+
         from .VariablesViewer import VariablesViewer
+
         # add the global variables viewer
         self.glvWidget = QWidget()
         self.glvWidgetVLayout = QVBoxLayout(self.glvWidget)
         self.glvWidgetVLayout.setContentsMargins(0, 0, 0, 0)
         self.glvWidgetVLayout.setSpacing(3)
         self.glvWidget.setLayout(self.glvWidgetVLayout)
-        
+
         self.globalsViewer = VariablesViewer(self, True, self.glvWidget)
         self.glvWidgetVLayout.addWidget(self.globalsViewer)
-        
+
         self.glvWidgetHLayout = QHBoxLayout()
         self.glvWidgetHLayout.setContentsMargins(3, 3, 3, 3)
-        
+
         self.globalsFilterEdit = QLineEdit(self.glvWidget)
         self.globalsFilterEdit.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
+        )
         self.glvWidgetHLayout.addWidget(self.globalsFilterEdit)
         self.globalsFilterEdit.setToolTip(
-            self.tr("Enter regular expression patterns separated by ';'"
-                    " to define variable filters. "))
+            self.tr(
+                "Enter regular expression patterns separated by ';'"
+                " to define variable filters. "
+            )
+        )
         self.globalsFilterEdit.setWhatsThis(
-            self.tr("Enter regular expression patterns separated by ';'"
-                    " to define variable filters. All variables and"
-                    " class attributes matched by one of the expressions"
-                    " are not shown in the list above."))
-        
-        self.setGlobalsFilterButton = QPushButton(
-            self.tr('Set'), self.glvWidget)
+            self.tr(
+                "Enter regular expression patterns separated by ';'"
+                " to define variable filters. All variables and"
+                " class attributes matched by one of the expressions"
+                " are not shown in the list above."
+            )
+        )
+
+        self.setGlobalsFilterButton = QPushButton(self.tr("Set"), self.glvWidget)
         self.glvWidgetHLayout.addWidget(self.setGlobalsFilterButton)
         self.glvWidgetVLayout.addLayout(self.glvWidgetHLayout)
-        
+
         index = self.__tabWidget.addTab(
-            self.glvWidget,
-            UI.PixmapCache.getIcon("globalVariables"), '')
+            self.glvWidget, UI.PixmapCache.getIcon("globalVariables"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows the list of global variables and their values."))
-        
-        self.setGlobalsFilterButton.clicked.connect(
-            self.setGlobalsFilter)
+            index, self.tr("Shows the list of global variables and their values.")
+        )
+
+        self.setGlobalsFilterButton.clicked.connect(self.setGlobalsFilter)
         self.globalsFilterEdit.returnPressed.connect(self.setGlobalsFilter)
-        
+
         # add the local variables viewer
         self.lvWidget = QWidget()
         self.lvWidgetVLayout = QVBoxLayout(self.lvWidget)
         self.lvWidgetVLayout.setContentsMargins(0, 0, 0, 0)
         self.lvWidgetVLayout.setSpacing(3)
         self.lvWidget.setLayout(self.lvWidgetVLayout)
-        
+
         self.lvWidgetHLayout1 = QHBoxLayout()
         self.lvWidgetHLayout1.setContentsMargins(3, 3, 3, 3)
-        
+
         self.stackComboBox = QComboBox(self.lvWidget)
         self.stackComboBox.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
+        )
         self.lvWidgetHLayout1.addWidget(self.stackComboBox)
 
-        self.sourceButton = QPushButton(self.tr('Source'), self.lvWidget)
+        self.sourceButton = QPushButton(self.tr("Source"), self.lvWidget)
         self.lvWidgetHLayout1.addWidget(self.sourceButton)
         self.sourceButton.setEnabled(False)
         self.lvWidgetVLayout.addLayout(self.lvWidgetHLayout1)
 
         self.localsViewer = VariablesViewer(self, False, self.lvWidget)
         self.lvWidgetVLayout.addWidget(self.localsViewer)
-        
+
         self.lvWidgetHLayout2 = QHBoxLayout()
         self.lvWidgetHLayout2.setContentsMargins(3, 3, 3, 3)
-        
+
         self.localsFilterEdit = QLineEdit(self.lvWidget)
         self.localsFilterEdit.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
+        )
         self.lvWidgetHLayout2.addWidget(self.localsFilterEdit)
         self.localsFilterEdit.setToolTip(
             self.tr(
                 "Enter regular expression patterns separated by ';' to define "
-                "variable filters. "))
+                "variable filters. "
+            )
+        )
         self.localsFilterEdit.setWhatsThis(
             self.tr(
                 "Enter regular expression patterns separated by ';' to define "
                 "variable filters. All variables and class attributes matched"
-                " by one of the expressions are not shown in the list above."))
-        
-        self.setLocalsFilterButton = QPushButton(
-            self.tr('Set'), self.lvWidget)
+                " by one of the expressions are not shown in the list above."
+            )
+        )
+
+        self.setLocalsFilterButton = QPushButton(self.tr("Set"), self.lvWidget)
         self.lvWidgetHLayout2.addWidget(self.setLocalsFilterButton)
         self.lvWidgetVLayout.addLayout(self.lvWidgetHLayout2)
-        
+
         index = self.__tabWidget.addTab(
-            self.lvWidget,
-            UI.PixmapCache.getIcon("localVariables"), '')
+            self.lvWidget, UI.PixmapCache.getIcon("localVariables"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows the list of local variables and their values."))
-        
+            index, self.tr("Shows the list of local variables and their values.")
+        )
+
         self.sourceButton.clicked.connect(self.__showSource)
-        self.stackComboBox.currentIndexChanged[int].connect(
-            self.__frameSelected)
+        self.stackComboBox.currentIndexChanged[int].connect(self.__frameSelected)
         self.setLocalsFilterButton.clicked.connect(self.setLocalsFilter)
         self.localsFilterEdit.returnPressed.connect(self.setLocalsFilter)
-        
+
         self.preferencesChanged.connect(self.handlePreferencesChanged)
         self.preferencesChanged.connect(self.globalsViewer.preferencesChanged)
         self.preferencesChanged.connect(self.localsViewer.preferencesChanged)
-        
+
         from .CallStackViewer import CallStackViewer
+
         # add the call stack viewer
         self.callStackViewer = CallStackViewer(self.debugServer)
         index = self.__tabWidget.addTab(
-            self.callStackViewer,
-            UI.PixmapCache.getIcon("callStack"), "")
-        self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows the current call stack."))
+            self.callStackViewer, UI.PixmapCache.getIcon("callStack"), ""
+        )
+        self.__tabWidget.setTabToolTip(index, self.tr("Shows the current call stack."))
         self.callStackViewer.sourceFile.connect(self.sourceFile)
-        self.callStackViewer.frameSelected.connect(
-            self.__callStackFrameSelected)
-        
+        self.callStackViewer.frameSelected.connect(self.__callStackFrameSelected)
+
         from .CallTraceViewer import CallTraceViewer
+
         # add the call trace viewer
         self.callTraceViewer = CallTraceViewer(self.debugServer, self)
         index = self.__tabWidget.addTab(
-            self.callTraceViewer,
-            UI.PixmapCache.getIcon("callTrace"), "")
+            self.callTraceViewer, UI.PixmapCache.getIcon("callTrace"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows a trace of the program flow."))
+            index, self.tr("Shows a trace of the program flow.")
+        )
         self.callTraceViewer.sourceFile.connect(self.sourceFile)
-        
+
         from .BreakPointViewer import BreakPointViewer
+
         # add the breakpoint viewer
         self.breakpointViewer = BreakPointViewer()
         self.breakpointViewer.setModel(self.debugServer.getBreakPointModel())
         index = self.__tabWidget.addTab(
-            self.breakpointViewer,
-            UI.PixmapCache.getIcon("breakpoints"), '')
+            self.breakpointViewer, UI.PixmapCache.getIcon("breakpoints"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows a list of defined breakpoints."))
+            index, self.tr("Shows a list of defined breakpoints.")
+        )
         self.breakpointViewer.sourceFile.connect(self.sourceFile)
-        
+
         from .WatchPointViewer import WatchPointViewer
+
         # add the watch expression viewer
         self.watchpointViewer = WatchPointViewer()
         self.watchpointViewer.setModel(self.debugServer.getWatchPointModel())
         index = self.__tabWidget.addTab(
-            self.watchpointViewer,
-            UI.PixmapCache.getIcon("watchpoints"), '')
+            self.watchpointViewer, UI.PixmapCache.getIcon("watchpoints"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows a list of defined watchpoints."))
-        
+            index, self.tr("Shows a list of defined watchpoints.")
+        )
+
         from .ExceptionLogger import ExceptionLogger
+
         # add the exception logger
         self.exceptionLogger = ExceptionLogger()
         index = self.__tabWidget.addTab(
-            self.exceptionLogger,
-            UI.PixmapCache.getIcon("exceptions"), '')
+            self.exceptionLogger, UI.PixmapCache.getIcon("exceptions"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows a list of raised exceptions."))
-        
+            index, self.tr("Shows a list of raised exceptions.")
+        )
+
         from UI.PythonDisViewer import PythonDisViewer, PythonDisViewerModes
+
         # add the Python disassembly viewer
         self.disassemblyViewer = PythonDisViewer(
-            None, mode=PythonDisViewerModes.TRACEBACK)
+            None, mode=PythonDisViewerModes.TRACEBACK
+        )
         index = self.__tabWidget.addTab(
-            self.disassemblyViewer,
-            UI.PixmapCache.getIcon("disassembly"), '')
+            self.disassemblyViewer, UI.PixmapCache.getIcon("disassembly"), ""
+        )
         self.__tabWidget.setTabToolTip(
-            index,
-            self.tr("Shows a code disassembly in case of an exception."))
-        
+            index, self.tr("Shows a code disassembly in case of an exception.")
+        )
+
         self.__tabWidget.setCurrentWidget(self.glvWidget)
-        
+
         self.__doDebuggersListUpdate = True
-        
+
         self.__mainSplitter.setSizes([100, 700])
-        
+
         self.currentStack = None
         self.framenr = 0
-        
+
         self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode")
         self.sourceButton.setVisible(not self.__autoViewSource)
-        
+
         # connect some debug server signals
-        self.debugServer.clientStack.connect(
-            self.handleClientStack)
-        self.debugServer.clientThreadList.connect(
-            self.__addThreadList)
-        self.debugServer.clientDebuggerId.connect(
-            self.__clientDebuggerId)
+        self.debugServer.clientStack.connect(self.handleClientStack)
+        self.debugServer.clientThreadList.connect(self.__addThreadList)
+        self.debugServer.clientDebuggerId.connect(self.__clientDebuggerId)
+        self.debugServer.passiveDebugStarted.connect(self.handleDebuggingStarted)
+        self.debugServer.clientLine.connect(self.__clientLine)
+        self.debugServer.clientSyntaxError.connect(self.__clientSyntaxError)
+        self.debugServer.clientException.connect(self.__clientException)
+        self.debugServer.clientExit.connect(self.__clientExit)
+        self.debugServer.clientDisconnected.connect(self.__removeDebugger)
+
+        self.debugServer.clientException.connect(self.exceptionLogger.addException)
         self.debugServer.passiveDebugStarted.connect(
-            self.handleDebuggingStarted)
-        self.debugServer.clientLine.connect(
-            self.__clientLine)
-        self.debugServer.clientSyntaxError.connect(
-            self.__clientSyntaxError)
-        self.debugServer.clientException.connect(
-            self.__clientException)
-        self.debugServer.clientExit.connect(
-            self.__clientExit)
-        self.debugServer.clientDisconnected.connect(
-            self.__removeDebugger)
-        
-        self.debugServer.clientException.connect(
-            self.exceptionLogger.addException)
-        self.debugServer.passiveDebugStarted.connect(
-            self.exceptionLogger.debuggingStarted)
-        
-        self.debugServer.clientLine.connect(
-            self.breakpointViewer.highlightBreakpoint)
-    
+            self.exceptionLogger.debuggingStarted
+        )
+
+        self.debugServer.clientLine.connect(self.breakpointViewer.highlightBreakpoint)
+
     def handlePreferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
         """
         self.__autoViewSource = Preferences.getDebugger("AutoViewSourceCode")
         self.sourceButton.setVisible(not self.__autoViewSource)
-        
+
     def setDebugger(self, debugUI):
         """
         Public method to set a reference to the Debug UI.
-        
+
         @param debugUI reference to the DebugUI object
         @type DebugUI
         """
         self.debugUI = debugUI
         self.callStackViewer.setDebugger(debugUI)
-        
+
         # connect some debugUI signals
         self.debugUI.clientStack.connect(self.handleClientStack)
-        self.debugUI.debuggingStarted.connect(
-            self.exceptionLogger.debuggingStarted)
-        self.debugUI.debuggingStarted.connect(
-            self.handleDebuggingStarted)
-    
+        self.debugUI.debuggingStarted.connect(self.exceptionLogger.debuggingStarted)
+        self.debugUI.debuggingStarted.connect(self.handleDebuggingStarted)
+
     def handleResetUI(self, fullReset):
         """
         Public method to reset the viewer.
-        
+
         @param fullReset flag indicating a full reset is required
         @type bool
         """
@@ -375,48 +381,48 @@
         if fullReset:
             self.__debuggersList.clear()
         self.disassemblyViewer.clear()
-        
+
     def initCallStackViewer(self, projectMode):
         """
         Public method to initialize the call stack viewer.
-        
+
         @param projectMode flag indicating to enable the project mode
         @type bool
         """
         self.callStackViewer.clear()
         self.callStackViewer.setProjectMode(projectMode)
-        
+
     def isCallTraceEnabled(self):
         """
         Public method to get the state of the call trace function.
-        
+
         @return flag indicating the state of the call trace function
         @rtype bool
         """
         return self.callTraceViewer.isCallTraceEnabled()
-        
+
     def clearCallTrace(self):
         """
         Public method to clear the recorded call trace.
         """
         self.callTraceViewer.clear()
-        
+
     def setCallTraceToProjectMode(self, enabled):
         """
         Public slot to set the call trace viewer to project mode.
-        
+
         In project mode the call trace info is shown with project relative
         path names.
-        
+
         @param enabled flag indicating to enable the project mode
         @type bool
         """
         self.callTraceViewer.setProjectMode(enabled)
-        
+
     def showVariables(self, vlist, showGlobals):
         """
         Public method to show the variables in the respective window.
-        
+
         @param vlist list of variables to display
         @type list
         @param showGlobals flag indicating global/local state
@@ -426,11 +432,11 @@
             self.globalsViewer.showVariables(vlist, self.framenr)
         else:
             self.localsViewer.showVariables(vlist, self.framenr)
-            
+
     def showVariable(self, vlist, showGlobals):
         """
         Public method to show the variables in the respective window.
-        
+
         @param vlist list of variables to display
         @type list
         @param showGlobals flag indicating global/local state
@@ -440,11 +446,11 @@
             self.globalsViewer.showVariable(vlist)
         else:
             self.localsViewer.showVariable(vlist)
-            
+
     def showVariablesTab(self, showGlobals):
         """
         Public method to make a variables tab visible.
-        
+
         @param showGlobals flag indicating global/local state
         @type bool
         """
@@ -452,11 +458,11 @@
             self.__tabWidget.setCurrentWidget(self.glvWidget)
         else:
             self.__tabWidget.setCurrentWidget(self.lvWidget)
-        
+
     def handleClientStack(self, stack, debuggerId):
         """
         Public slot to show the call stack of the program being debugged.
-        
+
         @param stack list of tuples with call stack data (file name,
             line number, function name, formatted argument/values list)
         @type list of tuples of (str, str, str, str)
@@ -472,13 +478,13 @@
             for s in stack:
                 # just show base filename to make it readable
                 s = (os.path.basename(s[0]), s[1], s[2])
-                self.stackComboBox.addItem('{0}:{1}:{2}'.format(*s))
+                self.stackComboBox.addItem("{0}:{1}:{2}".format(*s))
             self.stackComboBox.blockSignals(block)
-    
+
     def __clientLine(self, fn, line, debuggerId, threadName):
         """
         Private method to handle a change to the current line.
-        
+
         @param fn filename
         @type str
         @param line linenumber
@@ -492,12 +498,12 @@
         self.__setThreadIconAndState(debuggerId, threadName, "broken")
         if debuggerId != self.getSelectedDebuggerId():
             self.__setCurrentDebugger(debuggerId)
-    
+
     @pyqtSlot(str, int, str, bool, str)
     def __clientExit(self, program, status, message, quiet, debuggerId):
         """
         Private method to handle the debugged program terminating.
-        
+
         @param program name of the exited program
         @type str
         @param status exit code of the debugged program
@@ -519,14 +525,15 @@
                 self.sourceButton.setEnabled(False)
                 self.currentStack = None
                 self.stackComboBox.clear()
-            
+
             self.__removeDebugger(debuggerId)
-    
-    def __clientSyntaxError(self, message, filename, lineNo, characterNo,
-                            debuggerId, threadName):
+
+    def __clientSyntaxError(
+        self, message, filename, lineNo, characterNo, debuggerId, threadName
+    ):
         """
         Private method to handle a syntax error in the debugged program.
-        
+
         @param message message of the syntax error
         @type str
         @param filename translated filename of the syntax error position
@@ -542,12 +549,13 @@
         """
         self.__setDebuggerIconAndState(debuggerId, "syntax")
         self.__setThreadIconAndState(debuggerId, threadName, "syntax")
-    
-    def __clientException(self, exceptionType, exceptionMessage, stackTrace,
-                          debuggerId, threadName):
+
+    def __clientException(
+        self, exceptionType, exceptionMessage, stackTrace, debuggerId, threadName
+    ):
         """
         Private method to handle an exception of the debugged program.
-        
+
         @param exceptionType type of exception raised
         @type str
         @param exceptionMessage message given by the exception
@@ -561,11 +569,11 @@
         """
         self.__setDebuggerIconAndState(debuggerId, "exception")
         self.__setThreadIconAndState(debuggerId, threadName, "exception")
-    
+
     def setVariablesFilter(self, globalsFilter, localsFilter):
         """
         Public slot to set the local variables filter.
-        
+
         @param globalsFilter filter list for global variable types
         @type list of str
         @param localsFilter filter list for local variable types
@@ -573,7 +581,7 @@
         """
         self.__globalsFilter = globalsFilter
         self.__localsFilter = localsFilter
-        
+
     def __showSource(self):
         """
         Private slot to handle the source button press to show the selected
@@ -583,11 +591,11 @@
         if index > -1 and self.currentStack:
             s = self.currentStack[index]
             self.sourceFile.emit(s[0], int(s[1]))
-        
+
     def __frameSelected(self, frmnr):
         """
         Private slot to handle the selection of a new stack frame number.
-        
+
         @param frmnr frame number (0 is the current frame)
         @type int
         """
@@ -595,12 +603,12 @@
             self.framenr = frmnr
             if self.debugServer.isDebugging():
                 self.debugServer.remoteClientVariables(
-                    self.getSelectedDebuggerId(), 0, self.__localsFilter,
-                    frmnr)
-            
+                    self.getSelectedDebuggerId(), 0, self.__localsFilter, frmnr
+                )
+
             if self.__autoViewSource:
                 self.__showSource()
-        
+
     def setGlobalsFilter(self):
         """
         Public slot to set the global variable filter.
@@ -608,10 +616,12 @@
         if self.debugServer.isDebugging():
             filterStr = self.globalsFilterEdit.text()
             self.debugServer.remoteClientSetFilter(
-                self.getSelectedDebuggerId(), 1, filterStr)
+                self.getSelectedDebuggerId(), 1, filterStr
+            )
             self.debugServer.remoteClientVariables(
-                self.getSelectedDebuggerId(), 2, self.__globalsFilter)
-        
+                self.getSelectedDebuggerId(), 2, self.__globalsFilter
+            )
+
     def setLocalsFilter(self):
         """
         Public slot to set the local variable filter.
@@ -619,58 +629,59 @@
         if self.debugServer.isDebugging():
             filterStr = self.localsFilterEdit.text()
             self.debugServer.remoteClientSetFilter(
-                self.getSelectedDebuggerId(), 0, filterStr)
+                self.getSelectedDebuggerId(), 0, filterStr
+            )
             if self.currentStack:
                 self.debugServer.remoteClientVariables(
-                    self.getSelectedDebuggerId(), 0, self.__localsFilter,
-                    self.framenr)
-        
+                    self.getSelectedDebuggerId(), 0, self.__localsFilter, self.framenr
+                )
+
     def handleDebuggingStarted(self):
         """
         Public slot to handle the start of a debugging session.
-        
+
         This slot sets the variables filter expressions.
         """
         self.setGlobalsFilter()
         self.setLocalsFilter()
         self.showVariablesTab(False)
-        
+
         self.disassemblyViewer.clear()
-        
+
     def currentWidget(self):
         """
         Public method to get a reference to the current widget.
-        
+
         @return reference to the current widget
         @rtype QWidget
         """
         return self.__tabWidget.currentWidget()
-        
+
     def setCurrentWidget(self, widget):
         """
         Public slot to set the current page based on the given widget.
-        
+
         @param widget reference to the widget
         @type QWidget
         """
         self.__tabWidget.setCurrentWidget(widget)
-    
+
     def __callStackFrameSelected(self, frameNo):
         """
         Private slot to handle the selection of a call stack entry of the
         call stack viewer.
-        
+
         @param frameNo frame number (index) of the selected entry
         @type int
         """
         if frameNo >= 0:
             self.stackComboBox.setCurrentIndex(frameNo)
-    
+
     def __debuggerSelected(self, current, previous):
         """
         Private slot to handle the selection of a debugger backend in the
         debuggers list.
-        
+
         @param current reference to the new current item
         @type QTreeWidgetItem
         @param previous reference to the previous current item
@@ -685,52 +696,54 @@
                 self.currentStack = None
                 self.stackComboBox.clear()
                 self.callStackViewer.clear()
-                
+
                 self.debugServer.remoteSetThread(debuggerId, -1)
                 self.__showSource()
             else:
                 # it is a thread item
                 tid = current.data(0, self.ThreadIdRole)
-                self.debugServer.remoteSetThread(
-                    self.getSelectedDebuggerId(), tid)
-    
+                self.debugServer.remoteSetThread(self.getSelectedDebuggerId(), tid)
+
     def __clientDebuggerId(self, debuggerId):
         """
         Private slot to receive the ID of a newly connected debugger backend.
-        
+
         @param debuggerId ID of a newly connected debugger backend
         @type str
         """
         itm = QTreeWidgetItem(self.__debuggersList, [debuggerId])
         if self.__debuggersList.topLevelItemCount() > 1:
             self.debugUI.showNotification(
-                self.tr("<p>Debugger with ID <b>{0}</b> has been connected."
-                        "</p>")
-                .format(debuggerId))
-        
+                self.tr(
+                    "<p>Debugger with ID <b>{0}</b> has been connected." "</p>"
+                ).format(debuggerId)
+            )
+
         self.__debuggersList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-        
+            QHeaderView.ResizeMode.ResizeToContents
+        )
+
         if self.__debuggersList.topLevelItemCount() == 1:
             # it is the only item, select it as the current one
             self.__debuggersList.setCurrentItem(itm)
-    
+
     def __setCurrentDebugger(self, debuggerId):
         """
         Private method to set the current debugger based on the given ID.
-        
+
         @param debuggerId ID of the debugger to set as current debugger
         @type str
         """
         debuggerItems = self.__debuggersList.findItems(
-            debuggerId, Qt.MatchFlag.MatchExactly)
+            debuggerId, Qt.MatchFlag.MatchExactly
+        )
         if debuggerItems:
             debuggerItem = debuggerItems[0]
             currentItem = self.__debuggersList.currentItem()
             if currentItem is debuggerItem:
                 # nothing to do
                 return
-            
+
             if currentItem:
                 currentParent = currentItem.parent()
             else:
@@ -743,20 +756,20 @@
                 return
             else:
                 self.__debuggersList.setCurrentItem(debuggerItem)
-    
+
     def isOnlyDebugger(self):
         """
         Public method to test, if only one debugger is connected.
-        
+
         @return flag indicating that only one debugger is connected
         @rtype bool
         """
         return self.__debuggersList.topLevelItemCount() == 1
-    
+
     def getSelectedDebuggerId(self):
         """
         Public method to get the currently selected debugger ID.
-        
+
         @return selected debugger ID
         @rtype str
         """
@@ -770,11 +783,11 @@
                 return itm.parent().text(0)
         else:
             return ""
-    
+
     def getSelectedDebuggerState(self):
         """
         Public method to get the currently selected debugger's state.
-        
+
         @return selected debugger's state (broken, exception, running)
         @rtype str
         """
@@ -788,11 +801,11 @@
                 return itm.parent().data(0, self.DebuggerStateRole)
         else:
             return ""
-    
+
     def __setDebuggerIconAndState(self, debuggerId, state):
         """
         Private method to set the icon for a specific debugger ID.
-        
+
         @param debuggerId ID of the debugger backend (empty ID means the
             currently selected one)
         @type str
@@ -802,7 +815,8 @@
         debuggerItem = None
         if debuggerId:
             foundItems = self.__debuggersList.findItems(
-                debuggerId, Qt.MatchFlag.MatchExactly)
+                debuggerId, Qt.MatchFlag.MatchExactly
+            )
             if foundItems:
                 debuggerItem = foundItems[0]
         if debuggerItem is None:
@@ -819,29 +833,31 @@
             debuggerItem.setIcon(0, UI.PixmapCache.getIcon(iconName))
             debuggerItem.setData(0, self.DebuggerStateRole, state)
             debuggerItem.setText(1, stateText)
-            
+
             self.__debuggersList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
-    
+                QHeaderView.ResizeMode.ResizeToContents
+            )
+
     def __removeDebugger(self, debuggerId):
         """
         Private method to remove a debugger given its ID.
-        
+
         @param debuggerId ID of the debugger to be removed from the list
         @type str
         """
         foundItems = self.__debuggersList.findItems(
-            debuggerId, Qt.MatchFlag.MatchExactly)
+            debuggerId, Qt.MatchFlag.MatchExactly
+        )
         if foundItems:
             index = self.__debuggersList.indexOfTopLevelItem(foundItems[0])
             itm = self.__debuggersList.takeTopLevelItem(index)
             # __IGNORE_WARNING__
             del itm
-    
+
     def __addThreadList(self, currentID, threadList, debuggerId):
         """
         Private method to add the list of threads to a debugger entry.
-        
+
         @param currentID id of the current thread
         @type int
         @param threadList list of dictionaries containing the thread data
@@ -849,13 +865,14 @@
         @param debuggerId ID of the debugger backend
         @type str
         """
-        debugStatus = -1    # i.e. running
-        
+        debugStatus = -1  # i.e. running
+
         debuggerItems = self.__debuggersList.findItems(
-            debuggerId, Qt.MatchFlag.MatchExactly)
+            debuggerId, Qt.MatchFlag.MatchExactly
+        )
         if debuggerItems:
             debuggerItem = debuggerItems[0]
-            
+
             currentItem = self.__debuggersList.currentItem()
             if currentItem.parent() is debuggerItem:
                 currentChild = currentItem.text(0)
@@ -864,11 +881,11 @@
             self.__doDebuggersListUpdate = False
             debuggerItem.takeChildren()
             for thread in threadList:
-                if thread.get('except', False):
+                if thread.get("except", False):
                     stateText = DebugViewer.StateMessage["exception"]
                     iconName = DebugViewer.StateIcon["exception"]
                     debugStatus = 1
-                elif thread['broken']:
+                elif thread["broken"]:
                     stateText = DebugViewer.StateMessage["broken"]
                     iconName = DebugViewer.StateIcon["broken"]
                     if debugStatus < 1:
@@ -876,24 +893,24 @@
                 else:
                     stateText = DebugViewer.StateMessage["running"]
                     iconName = DebugViewer.StateIcon["running"]
-                itm = QTreeWidgetItem(debuggerItem,
-                                      [thread['name'], stateText])
-                itm.setData(0, self.ThreadIdRole, thread['id'])
+                itm = QTreeWidgetItem(debuggerItem, [thread["name"], stateText])
+                itm.setData(0, self.ThreadIdRole, thread["id"])
                 itm.setIcon(0, UI.PixmapCache.getIcon(iconName))
-                if currentChild == thread['name']:
+                if currentChild == thread["name"]:
                     self.__debuggersList.setCurrentItem(itm)
-                if thread['id'] == currentID:
+                if thread["id"] == currentID:
                     font = debuggerItem.font(0)
                     font.setItalic(True)
                     itm.setFont(0, font)
-            
+
             debuggerItem.setExpanded(debuggerItem.childCount() > 0)
-            
+
             self.__debuggersList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
+                QHeaderView.ResizeMode.ResizeToContents
+            )
             self.__debuggersList.header().setStretchLastSection(True)
             self.__doDebuggersListUpdate = True
-            
+
             if debugStatus == -1:
                 debuggerState = "running"
             elif debugStatus == 0:
@@ -901,12 +918,12 @@
             else:
                 debuggerState = "exception"
             self.__setDebuggerIconAndState(debuggerId, debuggerState)
-    
+
     def __setThreadIconAndState(self, debuggerId, threadName, state):
         """
         Private method to set the icon for a specific thread name and
         debugger ID.
-        
+
         @param debuggerId ID of the debugger backend (empty ID means the
             currently selected one)
         @type str
@@ -918,7 +935,8 @@
         debuggerItem = None
         if debuggerId:
             foundItems = self.__debuggersList.findItems(
-                debuggerId, Qt.MatchFlag.MatchExactly)
+                debuggerId, Qt.MatchFlag.MatchExactly
+            )
             if foundItems:
                 debuggerItem = foundItems[0]
         if debuggerItem is None:
@@ -930,7 +948,7 @@
                     break
             else:
                 childItem = None
-            
+
             if childItem is not None:
                 try:
                     iconName = DebugViewer.StateIcon[state]
@@ -942,6 +960,7 @@
                     stateText = self.tr("unknown state ({0})").format(state)
                 childItem.setIcon(0, UI.PixmapCache.getIcon(iconName))
                 childItem.setText(1, stateText)
-            
+
             self.__debuggersList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
+                QHeaderView.ResizeMode.ResizeToContents
+            )
--- a/src/eric7/Debugger/DebuggerInterfaceNone.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebuggerInterfaceNone.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,7 @@
 
 
 ClientDefaultCapabilities = 0
-    
+
 ClientTypeAssociations = []
 
 
@@ -19,30 +19,38 @@
     """
     Class implementing a dummy debugger interface for the debug server.
     """
+
     def __init__(self, debugServer, passive):
         """
         Constructor
-        
+
         @param debugServer reference to the debug server
         @type DebugServer
         @param passive flag indicating passive connection mode
         @type bool
         """
         super().__init__()
-        
+
         self.debugServer = debugServer
         self.passive = passive
-        
+
         self.qsock = None
         self.queue = []
         # set default values for capabilities of clients
         self.clientCapabilities = ClientDefaultCapabilities
-        
-    def startRemote(self, port, runInConsole, venvName, originalPathString,
-                    workingDir=None, configOverride=None):
+
+    def startRemote(
+        self,
+        port,
+        runInConsole,
+        venvName,
+        originalPathString,
+        workingDir=None,
+        configOverride=None,
+    ):
         """
         Public method to start a remote Python interpreter.
-        
+
         @param port port number the debug server is listening on
         @type int
         @param runInConsole flag indicating to start the debugger in a
@@ -63,12 +71,18 @@
         """
         return None, True, ""
 
-    def startRemoteForProject(self, port, runInConsole, venvName,
-                              originalPathString, workingDir=None,
-                              configOverride=None):
+    def startRemoteForProject(
+        self,
+        port,
+        runInConsole,
+        venvName,
+        originalPathString,
+        workingDir=None,
+        configOverride=None,
+    ):
         """
         Public method to start a remote Python interpreter for a project.
-        
+
         @param port port number the debug server is listening on
         @type int
         @param runInConsole flag indicating to start the debugger in a
@@ -92,65 +106,72 @@
     def getClientCapabilities(self):
         """
         Public method to retrieve the debug clients capabilities.
-        
+
         @return debug client capabilities
         @rtype int
         """
         return self.clientCapabilities
-        
+
     def newConnection(self, sock):
         """
         Public slot to handle a new connection.
-        
+
         @param sock reference to the socket object
         @type QTcpSocket
         @return flag indicating success
         @rtype bool
         """
         return False
-    
+
     def getDebuggerIds(self):
         """
         Public method to return the IDs of the connected debugger backends.
-        
+
         @return list of connected debugger backend IDs
         @rtype list of str
         """
         return []
-        
+
     def shutdown(self):
         """
         Public method to cleanly shut down.
-        
+
         It closes our socket and shuts down the debug client.
         (Needed on Win OS)
         """
         self.qsock = None
         self.queue = []
-        
+
     def isConnected(self):
         """
         Public method to test, if a debug client has connected.
-        
+
         @return flag indicating the connection status
         @rtype bool
         """
         return self.qsock is not None
-        
+
     def remoteEnvironment(self, env):
         """
         Public method to set the environment for a program to debug, run, ...
-        
+
         @param env environment settings
         @type dict
         """
         return
-        
-    def remoteLoad(self, fn, argv, wd, traceInterpreter=False,
-                   autoContinue=True, enableMultiprocess=False):
+
+    def remoteLoad(
+        self,
+        fn,
+        argv,
+        wd,
+        traceInterpreter=False,
+        autoContinue=True,
+        enableMultiprocess=False,
+    ):
         """
         Public method to load a new program to debug.
-        
+
         @param fn the filename to debug
         @type str
         @param argv the commandline arguments to pass to the program
@@ -168,11 +189,11 @@
         @type bool
         """
         return
-        
+
     def remoteRun(self, fn, argv, wd):
         """
         Public method to load a new program to run.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -181,11 +202,11 @@
         @type str
         """
         return
-        
+
     def remoteCoverage(self, fn, argv, wd, erase=False):
         """
         Public method to load a new program to collect coverage data.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -201,7 +222,7 @@
     def remoteProfile(self, fn, argv, wd, erase=False):
         """
         Public method to load a new program to collect profiling data.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -217,7 +238,7 @@
     def remoteStatement(self, debuggerId, stmt):
         """
         Public method to execute a Python statement.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param stmt the Python statement to execute.
@@ -229,7 +250,7 @@
     def remoteStep(self, debuggerId):
         """
         Public method to single step the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
@@ -238,7 +259,7 @@
     def remoteStepOver(self, debuggerId):
         """
         Public method to step over the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
@@ -247,7 +268,7 @@
     def remoteStepOut(self, debuggerId):
         """
         Public method to step out the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
@@ -256,7 +277,7 @@
     def remoteStepQuit(self, debuggerId):
         """
         Public method to stop the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
@@ -265,7 +286,7 @@
     def remoteContinue(self, debuggerId, special=False):
         """
         Public method to continue the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param special flag indicating a special continue operation
@@ -277,7 +298,7 @@
         """
         Public method to continue the debugged program to the given line
         or until returning from the current frame.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued to
@@ -288,7 +309,7 @@
     def remoteMoveIP(self, debuggerId, line):
         """
         Public method to move the instruction pointer to a different line.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued
@@ -296,11 +317,12 @@
         """
         return
 
-    def remoteBreakpoint(self, debuggerId, fn, line, setBreakpoint, cond=None,
-                         temp=False):
+    def remoteBreakpoint(
+        self, debuggerId, fn, line, setBreakpoint, cond=None, temp=False
+    ):
         """
         Public method to set or clear a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -315,11 +337,11 @@
         @type bool
         """
         return
-        
+
     def remoteBreakpointEnable(self, debuggerId, fn, line, enable):
         """
         Public method to enable or disable a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -330,11 +352,11 @@
         @type bool
         """
         return
-        
+
     def remoteBreakpointIgnore(self, debuggerId, fn, line, count):
         """
         Public method to ignore a breakpoint the next couple of occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -345,11 +367,11 @@
         @type int
         """
         return
-        
+
     def remoteWatchpoint(self, debuggerId, cond, setWatch, temp=False):
         """
         Public method to set or clear a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -360,11 +382,11 @@
         @type bool
         """
         return
-    
+
     def remoteWatchpointEnable(self, debuggerId, cond, enable):
         """
         Public method to enable or disable a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -373,12 +395,12 @@
         @type bool
         """
         return
-    
+
     def remoteWatchpointIgnore(self, debuggerId, cond, count):
         """
         Public method to ignore a watch expression the next couple of
         occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -387,52 +409,53 @@
         @type int
         """
         return
-    
+
     def remoteRawInput(self, debuggerId, inputString):
         """
         Public method to send the raw input to the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param inputString the raw input
         @type str
         """
         return
-        
+
     def remoteThreadList(self, debuggerId):
         """
         Public method to request the list of threads from the client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         return
-        
+
     def remoteSetThread(self, debuggerId, tid):
         """
         Public method to request to set the given thread as current thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param tid id of the thread
         @type int
         """
         return
-    
+
     def remoteClientStack(self, debuggerId):
         """
         Public method to request the stack of the main thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         return
-    
-    def remoteClientVariables(self, debuggerId, scope, filterList, framenr=0,
-                              maxSize=0):
+
+    def remoteClientVariables(
+        self, debuggerId, scope, filterList, framenr=0, maxSize=0
+    ):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -447,12 +470,13 @@
         @type int
         """
         return
-        
-    def remoteClientVariable(self, debuggerId, scope, filterList, var,
-                             framenr=0, maxSize=0):
+
+    def remoteClientVariable(
+        self, debuggerId, scope, filterList, var, framenr=0, maxSize=0
+    ):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -469,20 +493,20 @@
         @type int
         """
         return
-    
+
     def remoteClientDisassembly(self, debuggerId):
         """
         Public method to ask the client for the latest traceback disassembly.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         return
-        
+
     def remoteClientSetFilter(self, debuggerId, scope, filterStr):
         """
         Public method to set a variables filter list.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -491,52 +515,52 @@
         @type str
         """
         return
-        
+
     def setCallTraceEnabled(self, debuggerId, on):
         """
         Public method to set the call trace state.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param on flag indicating to enable the call trace function
         @type bool
         """
         return
-    
+
     def remoteNoDebugList(self, debuggerId, noDebugList):
         """
         Public method to set a list of programs not to be debugged.
-        
+
         The programs given in the list will not be run under the control
         of the multi process debugger.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param noDebugList list of Python programs not to be debugged
         @type list of str
         """
         return
-    
+
     def remoteBanner(self):
         """
         Public slot to get the banner info of the remote client.
         """
         return
-        
+
     def remoteCapabilities(self, debuggerId):
         """
         Public slot to get the debug clients capabilities.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         return
-        
+
     def remoteCompletion(self, debuggerId, text):
         """
         Public slot to get the a list of possible commandline completions
         from the remote client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param text the text to be completed
@@ -548,8 +572,8 @@
 def createDebuggerInterfaceNone(debugServer, passive):
     """
     Module function to create a debugger interface instance.
-    
-        
+
+
     @param debugServer reference to the debug server
     @type DebugServer
     @param passive flag indicating passive connection mode
@@ -563,11 +587,17 @@
 def getRegistryData():
     """
     Module function to get characterizing data for the debugger interface.
-    
+
     @return list of tuples containing the client type, the client capabilities,
         the client file type associations and a reference to the creation
         function
     @rtype list of tuple of (str, int, list of str, function)
     """
-    return [("None", ClientDefaultCapabilities, ClientTypeAssociations,
-            createDebuggerInterfaceNone)]
+    return [
+        (
+            "None",
+            ClientDefaultCapabilities,
+            ClientTypeAssociations,
+            createDebuggerInterfaceNone,
+        )
+    ]
--- a/src/eric7/Debugger/DebuggerInterfacePython.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/DebuggerInterfacePython.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,9 +13,7 @@
 import shlex
 import contextlib
 
-from PyQt6.QtCore import (
-    QObject, QProcess, QProcessEnvironment, QTimer
-)
+from PyQt6.QtCore import QObject, QProcess, QProcessEnvironment, QTimer
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox
@@ -37,59 +35,58 @@
     Class implementing the debugger interface for the debug server for
     Python 3.
     """
+
     def __init__(self, debugServer, passive):
         """
         Constructor
-        
+
         @param debugServer reference to the debug server
         @type DebugServer
         @param passive flag indicating passive connection mode
         @type bool
         """
         super().__init__()
-        
+
         self.__isNetworked = True
         self.__autoContinue = False
         self.__autoContinued = []
         self.__isStepCommand = False
-        
+
         self.debugServer = debugServer
         self.passive = passive
         self.process = None
         self.__startedVenv = ""
-        
+
         self.queue = []
         self.__master = None
         self.__connections = {}
         self.__pendingConnections = []
         self.__inShutdown = False
-        
+
         # set default values for capabilities of clients
         self.clientCapabilities = ClientDefaultCapabilities
-        
+
         # set translation function
         self.translate = self.__identityTranslation
-        
+
         if passive:
             # set translation function
             if Preferences.getDebugger("PathTranslation"):
-                self.translateRemote = Preferences.getDebugger(
-                    "PathTranslationRemote")
+                self.translateRemote = Preferences.getDebugger("PathTranslationRemote")
                 self.translateRemoteWindows = "\\" in self.translateRemote
-                self.translateLocal = Preferences.getDebugger(
-                    "PathTranslationLocal")
+                self.translateLocal = Preferences.getDebugger("PathTranslationLocal")
                 self.translateLocalWindows = "\\" in self.translateLocal
                 self.translate = self.__remoteTranslation
             else:
                 self.translate = self.__identityTranslation
-        
+
         # attribute to remember the name of the executed script
         self.__scriptName = ""
-    
+
     def __identityTranslation(self, fn, remote2local=True):
         """
         Private method to perform the identity path translation.
-        
+
         @param fn filename to be translated
         @type str
         @param remote2local flag indicating the direction of translation
@@ -99,11 +96,11 @@
         @rtype str
         """
         return fn
-    
+
     def __remoteTranslation(self, fn, remote2local=True):
         """
         Private method to perform the path translation.
-        
+
         @param fn filename to be translated
         @type str
         @param remote2local flag indicating the direction of translation
@@ -120,14 +117,13 @@
             path = fn.replace(self.translateLocal, self.translateRemote)
             if not self.translateRemoteWindows:
                 path = path.replace("\\", "/")
-        
+
         return path
-    
-    def __startProcess(self, program, arguments, environment=None,
-                       workingDir=None):
+
+    def __startProcess(self, program, arguments, environment=None, workingDir=None):
         """
         Private method to start the debugger client process.
-        
+
         @param program name of the executable to start
         @type str
         @param arguments arguments to be passed to the program
@@ -151,14 +147,21 @@
         proc.start(program, args)
         if not proc.waitForStarted(10000):
             proc = None
-        
+
         return proc
-    
-    def startRemote(self, port, runInConsole, venvName, originalPathString,
-                    workingDir=None, configOverride=None):
+
+    def startRemote(
+        self,
+        port,
+        runInConsole,
+        venvName,
+        originalPathString,
+        workingDir=None,
+        configOverride=None,
+    ):
         """
         Public method to start a remote Python interpreter.
-        
+
         @param port port number the debug server is listening on
         @type int
         @param runInConsole flag indicating to start the debugger in a
@@ -178,7 +181,7 @@
         @rtype tuple of (QProcess, bool, str)
         """
         global origPathEnv
-        
+
         if not venvName:
             venvName = Preferences.getDebugger("Python3VirtualEnv")
         venvManager = ericApp().getObject("VirtualEnvManager")
@@ -191,37 +194,36 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
-                self.tr(
-                    """<p>No suitable Python3 environment configured.</p>""")
+                self.tr("""<p>No suitable Python3 environment configured.</p>"""),
             )
             return None, False, ""
-        
+
         self.__inShutdown = False
-        
+
         debugClientType = Preferences.getDebugger("DebugClientType3")
         if debugClientType == "standard":
-            debugClient = os.path.join(getConfig('ericDir'),
-                                       "DebugClients", "Python",
-                                       "DebugClient.py")
+            debugClient = os.path.join(
+                getConfig("ericDir"), "DebugClients", "Python", "DebugClient.py"
+            )
         else:
             debugClient = Preferences.getDebugger("DebugClient3")
             if debugClient == "":
-                debugClient = os.path.join(sys.path[0],
-                                           "DebugClients", "Python",
-                                           "DebugClient.py")
-        
+                debugClient = os.path.join(
+                    sys.path[0], "DebugClients", "Python", "DebugClient.py"
+                )
+
         redirect = (
             str(configOverride["redirect"])
-            if configOverride and configOverride["enable"] else
-            str(Preferences.getDebugger("Python3Redirect"))
+            if configOverride and configOverride["enable"]
+            else str(Preferences.getDebugger("Python3Redirect"))
         )
-        noencoding = (Preferences.getDebugger("Python3NoEncoding") and
-                      '--no-encoding' or '')
+        noencoding = (
+            Preferences.getDebugger("Python3NoEncoding") and "--no-encoding" or ""
+        )
         multiprocessEnabled = (
-            '--multiprocess' if Preferences.getDebugger("MultiProcessEnabled")
-            else ''
+            "--multiprocess" if Preferences.getDebugger("MultiProcessEnabled") else ""
         )
-        
+
         if Preferences.getDebugger("RemoteDbgEnabled"):
             ipaddr = self.debugServer.getHostAddress(False)
             rexec = Preferences.getDebugger("RemoteExecution")
@@ -230,7 +232,10 @@
                 rhost = "localhost"
             if rexec:
                 args = Utilities.parseOptionString(rexec) + [
-                    rhost, interpreter, debugClient]
+                    rhost,
+                    interpreter,
+                    debugClient,
+                ]
                 if noencoding:
                     args.append(noencoding)
                 if multiprocessEnabled:
@@ -245,32 +250,35 @@
                                 break
                 else:
                     args[0] = Utilities.getExecutablePath(args[0])
-                process = self.__startProcess(args[0], args[1:],
-                                              workingDir=workingDir)
+                process = self.__startProcess(args[0], args[1:], workingDir=workingDir)
                 if process is None:
                     EricMessageBox.critical(
                         None,
                         self.tr("Start Debugger"),
                         self.tr(
                             """<p>The debugger backend could not be"""
-                            """ started.</p>"""))
-                
+                            """ started.</p>"""
+                        ),
+                    )
+
                 # set translation function
                 if Preferences.getDebugger("PathTranslation"):
                     self.translateRemote = Preferences.getDebugger(
-                        "PathTranslationRemote")
+                        "PathTranslationRemote"
+                    )
                     self.translateRemoteWindows = "\\" in self.translateRemote
                     self.translateLocal = Preferences.getDebugger(
-                        "PathTranslationLocal")
+                        "PathTranslationLocal"
+                    )
                     self.translate = self.__remoteTranslation
                     self.translateLocalWindows = "\\" in self.translateLocal
                 else:
                     self.translate = self.__identityTranslation
                 return process, self.__isNetworked, ""
-        
+
         # set translation function
         self.translate = self.__identityTranslation
-        
+
         # setup the environment for the debugger
         if Preferences.getDebugger("DebugEnvironmentReplace"):
             clientEnv = {}
@@ -278,68 +286,78 @@
             clientEnv = os.environ.copy()
             if originalPathString:
                 clientEnv["PATH"] = originalPathString
-        envlist = shlex.split(
-            Preferences.getDebugger("DebugEnvironment"))
+        envlist = shlex.split(Preferences.getDebugger("DebugEnvironment"))
         for el in envlist:
             with contextlib.suppress(ValueError):
-                key, value = el.split('=', 1)
+                key, value = el.split("=", 1)
                 clientEnv[str(key)] = str(value)
         if execPath:
             if "PATH" in clientEnv:
-                clientEnv["PATH"] = os.pathsep.join(
-                    [execPath, clientEnv["PATH"]])
+                clientEnv["PATH"] = os.pathsep.join([execPath, clientEnv["PATH"]])
             else:
                 clientEnv["PATH"] = execPath
-        
+
         ipaddr = self.debugServer.getHostAddress(True)
         if runInConsole or Preferences.getDebugger("ConsoleDbgEnabled"):
             ccmd = Preferences.getDebugger("ConsoleDbgCommand")
             if ccmd:
                 args = Utilities.parseOptionString(ccmd) + [
-                    interpreter, os.path.abspath(debugClient)]
+                    interpreter,
+                    os.path.abspath(debugClient),
+                ]
                 if noencoding:
                     args.append(noencoding)
                 if multiprocessEnabled:
                     args.append(multiprocessEnabled)
-                args.extend([str(port), '0', ipaddr])
+                args.extend([str(port), "0", ipaddr])
                 args[0] = Utilities.getExecutablePath(args[0])
-                process = self.__startProcess(args[0], args[1:], clientEnv,
-                                              workingDir=workingDir)
+                process = self.__startProcess(
+                    args[0], args[1:], clientEnv, workingDir=workingDir
+                )
                 if process is None:
                     EricMessageBox.critical(
                         None,
                         self.tr("Start Debugger"),
                         self.tr(
                             """<p>The debugger backend could not be"""
-                            """ started.</p>"""))
+                            """ started.</p>"""
+                        ),
+                    )
                 return process, self.__isNetworked, interpreter
-        
+
         args = [debugClient]
         if noencoding:
             args.append(noencoding)
         if multiprocessEnabled:
             args.append(multiprocessEnabled)
         args.extend([str(port), redirect, ipaddr])
-        process = self.__startProcess(interpreter, args, clientEnv,
-                                      workingDir=workingDir)
+        process = self.__startProcess(
+            interpreter, args, clientEnv, workingDir=workingDir
+        )
         if process is None:
             self.__startedVenv = ""
             EricMessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
-                self.tr(
-                    """<p>The debugger backend could not be started.</p>"""))
+                self.tr("""<p>The debugger backend could not be started.</p>"""),
+            )
         else:
             self.__startedVenv = venvName
-        
+
         return process, self.__isNetworked, interpreter
-    
-    def startRemoteForProject(self, port, runInConsole, venvName,
-                              originalPathString, workingDir=None,
-                              configOverride=None):
+
+    def startRemoteForProject(
+        self,
+        port,
+        runInConsole,
+        venvName,
+        originalPathString,
+        workingDir=None,
+        configOverride=None,
+    ):
         """
         Public method to start a remote Python interpreter for a project.
-        
+
         @param port port number the debug server is listening on
         @type int
         @param runInConsole flag indicating to start the debugger in a
@@ -359,27 +377,24 @@
         @rtype tuple of (QProcess, bool, str)
         """
         global origPathEnv
-        
+
         project = ericApp().getObject("Project")
         if not project.isDebugPropertiesLoaded():
             return None, self.__isNetworked, ""
-        
+
         # start debugger with project specific settings
         debugClient = project.getDebugProperty("DEBUGCLIENT")
-        
+
         redirect = (
             str(configOverride["redirect"])
-            if configOverride and configOverride["enable"] else
-            str(project.getDebugProperty("REDIRECT"))
-        )
-        noencoding = (
-            '--no-encoding' if project.getDebugProperty("NOENCODING") else ''
+            if configOverride and configOverride["enable"]
+            else str(project.getDebugProperty("REDIRECT"))
         )
+        noencoding = "--no-encoding" if project.getDebugProperty("NOENCODING") else ""
         multiprocessEnabled = (
-            '--multiprocess' if Preferences.getDebugger("MultiProcessEnabled")
-            else ''
+            "--multiprocess" if Preferences.getDebugger("MultiProcessEnabled") else ""
         )
-        
+
         if venvName:
             venvManager = ericApp().getObject("VirtualEnvManager")
             interpreter = venvManager.getVirtualenvInterpreter(venvName)
@@ -392,13 +407,12 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
-                self.tr(
-                    """<p>No suitable Python3 environment configured.</p>""")
+                self.tr("""<p>No suitable Python3 environment configured.</p>"""),
             )
             return None, self.__isNetworked, ""
-        
+
         self.__inShutdown = False
-        
+
         if project.getDebugProperty("REMOTEDEBUGGER"):
             ipaddr = self.debugServer.getHostAddress(False)
             rexec = project.getDebugProperty("REMOTECOMMAND")
@@ -407,7 +421,10 @@
                 rhost = "localhost"
             if rexec:
                 args = Utilities.parseOptionString(rexec) + [
-                    rhost, interpreter, debugClient]
+                    rhost,
+                    interpreter,
+                    debugClient,
+                ]
                 if noencoding:
                     args.append(noencoding)
                 if multiprocessEnabled:
@@ -422,19 +439,19 @@
                                 break
                 else:
                     args[0] = Utilities.getExecutablePath(args[0])
-                process = self.__startProcess(args[0], args[1:],
-                                              workingDir=workingDir)
+                process = self.__startProcess(args[0], args[1:], workingDir=workingDir)
                 if process is None:
                     EricMessageBox.critical(
                         None,
                         self.tr("Start Debugger"),
                         self.tr(
                             """<p>The debugger backend could not be"""
-                            """ started.</p>"""))
+                            """ started.</p>"""
+                        ),
+                    )
                 # set translation function
                 if project.getDebugProperty("PATHTRANSLATION"):
-                    self.translateRemote = project.getDebugProperty(
-                        "REMOTEPATH")
+                    self.translateRemote = project.getDebugProperty("REMOTEPATH")
                     self.translateRemoteWindows = "\\" in self.translateRemote
                     self.translateLocal = project.getDebugProperty("LOCALPATH")
                     self.translateLocalWindows = "\\" in self.translateLocal
@@ -445,10 +462,10 @@
             else:
                 # remote shell command is missing
                 return None, self.__isNetworked, ""
-        
+
         # set translation function
         self.translate = self.__identityTranslation
-        
+
         # setup the environment for the debugger
         if project.getDebugProperty("ENVIRONMENTOVERRIDE"):
             clientEnv = {}
@@ -456,93 +473,98 @@
             clientEnv = os.environ.copy()
             if originalPathString:
                 clientEnv["PATH"] = originalPathString
-        envlist = shlex.split(
-            project.getDebugProperty("ENVIRONMENTSTRING"))
+        envlist = shlex.split(project.getDebugProperty("ENVIRONMENTSTRING"))
         for el in envlist:
             with contextlib.suppress(ValueError):
-                key, value = el.split('=', 1)
+                key, value = el.split("=", 1)
                 clientEnv[str(key)] = str(value)
         if execPath:
             if "PATH" in clientEnv:
-                clientEnv["PATH"] = os.pathsep.join(
-                    [execPath, clientEnv["PATH"]])
+                clientEnv["PATH"] = os.pathsep.join([execPath, clientEnv["PATH"]])
             else:
                 clientEnv["PATH"] = execPath
-        
+
         ipaddr = self.debugServer.getHostAddress(True)
         if runInConsole or project.getDebugProperty("CONSOLEDEBUGGER"):
-            ccmd = (project.getDebugProperty("CONSOLECOMMAND") or
-                    Preferences.getDebugger("ConsoleDbgCommand"))
+            ccmd = project.getDebugProperty(
+                "CONSOLECOMMAND"
+            ) or Preferences.getDebugger("ConsoleDbgCommand")
             if ccmd:
                 args = Utilities.parseOptionString(ccmd) + [
-                    interpreter, os.path.abspath(debugClient)]
+                    interpreter,
+                    os.path.abspath(debugClient),
+                ]
                 if noencoding:
                     args.append(noencoding)
                 if multiprocessEnabled:
                     args.append(multiprocessEnabled)
-                args.extend([str(port), '0', ipaddr])
+                args.extend([str(port), "0", ipaddr])
                 args[0] = Utilities.getExecutablePath(args[0])
-                process = self.__startProcess(args[0], args[1:], clientEnv,
-                                              workingDir=workingDir)
+                process = self.__startProcess(
+                    args[0], args[1:], clientEnv, workingDir=workingDir
+                )
                 if process is None:
                     EricMessageBox.critical(
                         None,
                         self.tr("Start Debugger"),
                         self.tr(
                             """<p>The debugger backend could not be"""
-                            """ started.</p>"""))
+                            """ started.</p>"""
+                        ),
+                    )
                 return process, self.__isNetworked, interpreter
-        
+
         args = [debugClient]
         if noencoding:
             args.append(noencoding)
         if multiprocessEnabled:
             args.append(multiprocessEnabled)
         args.extend([str(port), redirect, ipaddr])
-        process = self.__startProcess(interpreter, args, clientEnv,
-                                      workingDir=workingDir)
+        process = self.__startProcess(
+            interpreter, args, clientEnv, workingDir=workingDir
+        )
         if process is None:
             self.__startedVenv = ""
             EricMessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
-                self.tr(
-                    """<p>The debugger backend could not be started.</p>"""))
+                self.tr("""<p>The debugger backend could not be started.</p>"""),
+            )
         else:
             self.__startedVenv = venvName
-        
+
         return process, self.__isNetworked, interpreter
-    
+
     def getClientCapabilities(self):
         """
         Public method to retrieve the debug clients capabilities.
-        
+
         @return debug client capabilities
         @rtype int
         """
         return self.clientCapabilities
-    
+
     def newConnection(self, sock):
         """
         Public slot to handle a new connection.
-        
+
         @param sock reference to the socket object
         @type QTcpSocket
         @return flag indicating success
         @rtype bool
         """
         self.__pendingConnections.append(sock)
-        
+
         sock.readyRead.connect(lambda: self.__parseClientLine(sock))
         sock.disconnected.connect(lambda: self.__socketDisconnected(sock))
-        
+
         return True
-    
+
     def __assignDebuggerId(self, sock, debuggerId):
         """
         Private method to set the debugger id for a recent debugger connection
         attempt.
-        
+
         @param sock reference to the socket object
         @type QTcpSocket
         @param debuggerId id of the connected debug client
@@ -551,34 +573,33 @@
         if sock in self.__pendingConnections:
             self.__connections[debuggerId] = sock
             self.__pendingConnections.remove(sock)
-            
+
             if self.__master is None:
                 self.__master = debuggerId
                 # Get the remote clients capabilities
                 self.remoteCapabilities(debuggerId)
-            
+
             self.debugServer.signalClientDebuggerId(debuggerId)
-            
+
             if debuggerId == self.__master:
                 self.__flush()
                 self.debugServer.masterClientConnected()
-            
+
             self.debugServer.initializeClient(debuggerId)
-            
+
             # perform auto-continue except for master
             if (
-                debuggerId != self.__master and
-                self.__autoContinue and
-                not self.__isStepCommand
+                debuggerId != self.__master
+                and self.__autoContinue
+                and not self.__isStepCommand
             ):
                 self.__autoContinued.append(debuggerId)
-                QTimer.singleShot(
-                    0, lambda: self.remoteContinue(debuggerId))
-    
+                QTimer.singleShot(0, lambda: self.remoteContinue(debuggerId))
+
     def __socketDisconnected(self, sock):
         """
         Private slot handling a socket disconnecting.
-        
+
         @param sock reference to the disconnected socket
         @type QTcpSocket
         """
@@ -597,7 +618,7 @@
         else:
             if sock in self.__pendingConnections:
                 self.__pendingConnections.remove(sock)
-        
+
         if not self.__connections:
             # no active connections anymore
             with contextlib.suppress(RuntimeError):
@@ -606,16 +627,16 @@
                 # ignore this
             self.__autoContinued.clear()
             self.debugServer.startClient()
-    
+
     def getDebuggerIds(self):
         """
         Public method to return the IDs of the connected debugger backends.
-        
+
         @return list of connected debugger backend IDs
         @rtype list of str
         """
         return sorted(self.__connections.keys())
-    
+
     def __flush(self):
         """
         Private slot to flush the queue.
@@ -623,40 +644,39 @@
         if self.__master:
             # Send commands that were waiting for the connection.
             for cmd in self.queue:
-                self.__writeJsonCommandToSocket(
-                    cmd, self.__connections[self.__master])
-        
+                self.__writeJsonCommandToSocket(cmd, self.__connections[self.__master])
+
         self.queue = []
-    
+
     def shutdown(self):
         """
         Public method to cleanly shut down.
-        
+
         It closes our sockets and shuts down the debug clients.
         (Needed on Win OS)
         """
         if not self.__master:
             return
-        
+
         self.__inShutdown = True
-        
+
         while self.__connections:
             debuggerId, sock = self.__connections.popitem()
             self.__shutdownSocket(sock)
-        
+
         while self.__pendingConnections:
             sock = self.__pendingConnections.pop()
             self.__shutdownSocket(sock)
-        
+
         # reinitialize
         self.queue = []
-        
+
         self.__master = None
-    
+
     def __shutdownSocket(self, sock):
         """
         Private slot to shut down a socket.
-        
+
         @param sock reference to the socket
         @type QTcpSocket
         """
@@ -668,35 +688,43 @@
         self.__sendJsonCommand("RequestShutdown", {}, sock=sock)
         sock.flush()
         sock.close()
-        
+
         sock.setParent(None)
         sock.deleteLater()
         del sock
-    
+
     def isConnected(self):
         """
         Public method to test, if a debug client has connected.
-        
+
         @return flag indicating the connection status
         @rtype bool
         """
         return bool(self.__connections)
-    
+
     def remoteEnvironment(self, env):
         """
         Public method to set the environment for a program to debug, run, ...
-        
+
         @param env environment settings
         @type dict
         """
-        self.__sendJsonCommand("RequestEnvironment", {"environment": env},
-                               self.__master)
-    
-    def remoteLoad(self, fn, argv, wd, traceInterpreter=False,
-                   autoContinue=True, enableMultiprocess=False):
+        self.__sendJsonCommand(
+            "RequestEnvironment", {"environment": env}, self.__master
+        )
+
+    def remoteLoad(
+        self,
+        fn,
+        argv,
+        wd,
+        traceInterpreter=False,
+        autoContinue=True,
+        enableMultiprocess=False,
+    ):
         """
         Public method to load a new program to debug.
-        
+
         @param fn the filename to debug
         @type str
         @param argv the commandline arguments to pass to the program
@@ -716,21 +744,25 @@
         self.__autoContinue = autoContinue
         self.__scriptName = os.path.abspath(fn)
         self.__isStepCommand = False
-        
+
         wd = self.translate(wd, False)
         fn = self.translate(os.path.abspath(fn), False)
-        self.__sendJsonCommand("RequestLoad", {
-            "workdir": wd,
-            "filename": fn,
-            "argv": Utilities.parseOptionString(argv),
-            "traceInterpreter": traceInterpreter,
-            "multiprocess": enableMultiprocess,
-        }, self.__master)
-    
+        self.__sendJsonCommand(
+            "RequestLoad",
+            {
+                "workdir": wd,
+                "filename": fn,
+                "argv": Utilities.parseOptionString(argv),
+                "traceInterpreter": traceInterpreter,
+                "multiprocess": enableMultiprocess,
+            },
+            self.__master,
+        )
+
     def remoteRun(self, fn, argv, wd):
         """
         Public method to load a new program to run.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -739,19 +771,23 @@
         @type str
         """
         self.__scriptName = os.path.abspath(fn)
-        
+
         wd = self.translate(wd, False)
         fn = self.translate(os.path.abspath(fn), False)
-        self.__sendJsonCommand("RequestRun", {
-            "workdir": wd,
-            "filename": fn,
-            "argv": Utilities.parseOptionString(argv),
-        }, self.__master)
-    
+        self.__sendJsonCommand(
+            "RequestRun",
+            {
+                "workdir": wd,
+                "filename": fn,
+                "argv": Utilities.parseOptionString(argv),
+            },
+            self.__master,
+        )
+
     def remoteCoverage(self, fn, argv, wd, erase=False):
         """
         Public method to load a new program to collect coverage data.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -763,20 +799,24 @@
         @type bool
         """
         self.__scriptName = os.path.abspath(fn)
-        
+
         wd = self.translate(wd, False)
         fn = self.translate(os.path.abspath(fn), False)
-        self.__sendJsonCommand("RequestCoverage", {
-            "workdir": wd,
-            "filename": fn,
-            "argv": Utilities.parseOptionString(argv),
-            "erase": erase,
-        }, self.__master)
-    
+        self.__sendJsonCommand(
+            "RequestCoverage",
+            {
+                "workdir": wd,
+                "filename": fn,
+                "argv": Utilities.parseOptionString(argv),
+                "erase": erase,
+            },
+            self.__master,
+        )
+
     def remoteProfile(self, fn, argv, wd, erase=False):
         """
         Public method to load a new program to collect profiling data.
-        
+
         @param fn the filename to run
         @type str
         @param argv the commandline arguments to pass to the program
@@ -788,116 +828,137 @@
         @type bool
         """
         self.__scriptName = os.path.abspath(fn)
-        
+
         wd = self.translate(wd, False)
         fn = self.translate(os.path.abspath(fn), False)
-        self.__sendJsonCommand("RequestProfile", {
-            "workdir": wd,
-            "filename": fn,
-            "argv": Utilities.parseOptionString(argv),
-            "erase": erase,
-        }, self.__master)
-    
+        self.__sendJsonCommand(
+            "RequestProfile",
+            {
+                "workdir": wd,
+                "filename": fn,
+                "argv": Utilities.parseOptionString(argv),
+                "erase": erase,
+            },
+            self.__master,
+        )
+
     def remoteStatement(self, debuggerId, stmt):
         """
         Public method to execute a Python statement.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param stmt the Python statement to execute.
         @type str
         """
-        self.__sendJsonCommand("ExecuteStatement", {
-            "statement": stmt,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "ExecuteStatement",
+            {
+                "statement": stmt,
+            },
+            debuggerId,
+        )
+
     def remoteStep(self, debuggerId):
         """
         Public method to single step the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__isStepCommand = True
         self.__sendJsonCommand("RequestStep", {}, debuggerId)
-    
+
     def remoteStepOver(self, debuggerId):
         """
         Public method to step over the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__isStepCommand = True
         self.__sendJsonCommand("RequestStepOver", {}, debuggerId)
-    
+
     def remoteStepOut(self, debuggerId):
         """
         Public method to step out the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__isStepCommand = True
         self.__sendJsonCommand("RequestStepOut", {}, debuggerId)
-    
+
     def remoteStepQuit(self, debuggerId):
         """
         Public method to stop the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__isStepCommand = True
         self.__sendJsonCommand("RequestStepQuit", {}, debuggerId)
-    
+
     def remoteContinue(self, debuggerId, special=False):
         """
         Public method to continue the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param special flag indicating a special continue operation
         @type bool
         """
         self.__isStepCommand = False
-        self.__sendJsonCommand("RequestContinue", {
-            "special": special,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestContinue",
+            {
+                "special": special,
+            },
+            debuggerId,
+        )
+
     def remoteContinueUntil(self, debuggerId, line):
         """
         Public method to continue the debugged program to the given line
         or until returning from the current frame.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued to
         @type int
         """
         self.__isStepCommand = False
-        self.__sendJsonCommand("RequestContinueUntil", {
-            "newLine": line,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestContinueUntil",
+            {
+                "newLine": line,
+            },
+            debuggerId,
+        )
+
     def remoteMoveIP(self, debuggerId, line):
         """
         Public method to move the instruction pointer to a different line.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param line the new line, where execution should be continued
         @type int
         """
-        self.__sendJsonCommand("RequestMoveIP", {
-            "newLine": line,
-        }, debuggerId)
-    
-    def remoteBreakpoint(self, debuggerId, fn, line, setBreakpoint, cond=None,
-                         temp=False):
+        self.__sendJsonCommand(
+            "RequestMoveIP",
+            {
+                "newLine": line,
+            },
+            debuggerId,
+        )
+
+    def remoteBreakpoint(
+        self, debuggerId, fn, line, setBreakpoint, cond=None, temp=False
+    ):
         """
         Public method to set or clear a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -911,21 +972,24 @@
         @param temp flag indicating a temporary breakpoint
         @type bool
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
-            self.__sendJsonCommand("RequestBreakpoint", {
-                "filename": self.translate(fn, False),
-                "line": line,
-                "temporary": temp,
-                "setBreakpoint": setBreakpoint,
-                "condition": cond,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestBreakpoint",
+                {
+                    "filename": self.translate(fn, False),
+                    "line": line,
+                    "temporary": temp,
+                    "setBreakpoint": setBreakpoint,
+                    "condition": cond,
+                },
+                debuggerId,
+            )
+
     def remoteBreakpointEnable(self, debuggerId, fn, line, enable):
         """
         Public method to enable or disable a breakpoint.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -935,19 +999,22 @@
         @param enable flag indicating enabling or disabling a breakpoint
         @type bool
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
-            self.__sendJsonCommand("RequestBreakpointEnable", {
-                "filename": self.translate(fn, False),
-                "line": line,
-                "enable": enable,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestBreakpointEnable",
+                {
+                    "filename": self.translate(fn, False),
+                    "line": line,
+                    "enable": enable,
+                },
+                debuggerId,
+            )
+
     def remoteBreakpointIgnore(self, debuggerId, fn, line, count):
         """
         Public method to ignore a breakpoint the next couple of occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param fn filename the breakpoint belongs to
@@ -957,19 +1024,22 @@
         @param count number of occurrences to ignore
         @type int
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
-            self.__sendJsonCommand("RequestBreakpointIgnore", {
-                "filename": self.translate(fn, False),
-                "line": line,
-                "count": count,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestBreakpointIgnore",
+                {
+                    "filename": self.translate(fn, False),
+                    "line": line,
+                    "count": count,
+                },
+                debuggerId,
+            )
+
     def remoteWatchpoint(self, debuggerId, cond, setWatch, temp=False):
         """
         Public method to set or clear a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -979,21 +1049,24 @@
         @param temp flag indicating a temporary watch expression
         @type bool
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
             # cond is combination of cond and special (s. watch expression
             # viewer)
-            self.__sendJsonCommand("RequestWatch", {
-                "temporary": temp,
-                "setWatch": setWatch,
-                "condition": cond,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestWatch",
+                {
+                    "temporary": temp,
+                    "setWatch": setWatch,
+                    "condition": cond,
+                },
+                debuggerId,
+            )
+
     def remoteWatchpointEnable(self, debuggerId, cond, enable):
         """
         Public method to enable or disable a watch expression.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -1001,21 +1074,24 @@
         @param enable flag indicating enabling or disabling a watch expression
         @type bool
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
             # cond is combination of cond and special (s. watch expression
             # viewer)
-            self.__sendJsonCommand("RequestWatchEnable", {
-                "condition": cond,
-                "enable": enable,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestWatchEnable",
+                {
+                    "condition": cond,
+                    "enable": enable,
+                },
+                debuggerId,
+            )
+
     def remoteWatchpointIgnore(self, debuggerId, cond, count):
         """
         Public method to ignore a watch expression the next couple of
         occurrences.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param cond expression of the watch expression
@@ -1023,65 +1099,77 @@
         @param count number of occurrences to ignore
         @type int
         """
-        debuggerList = ([debuggerId] if debuggerId
-                        else list(self.__connections.keys()))
+        debuggerList = [debuggerId] if debuggerId else list(self.__connections.keys())
         for debuggerId in debuggerList:
             # cond is combination of cond and special (s. watch expression
             # viewer)
-            self.__sendJsonCommand("RequestWatchIgnore", {
-                "condition": cond,
-                "count": count,
-            }, debuggerId)
-    
+            self.__sendJsonCommand(
+                "RequestWatchIgnore",
+                {
+                    "condition": cond,
+                    "count": count,
+                },
+                debuggerId,
+            )
+
     def remoteRawInput(self, debuggerId, inputString):
         """
         Public method to send the raw input to the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param inputString the raw input
         @type str
         """
-        self.__sendJsonCommand("RawInput", {
-            "input": inputString,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RawInput",
+            {
+                "input": inputString,
+            },
+            debuggerId,
+        )
+
     def remoteThreadList(self, debuggerId):
         """
         Public method to request the list of threads from the client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__sendJsonCommand("RequestThreadList", {}, debuggerId)
-    
+
     def remoteSetThread(self, debuggerId, tid):
         """
         Public method to request to set the given thread as current thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param tid id of the thread
         @type int
         """
-        self.__sendJsonCommand("RequestThreadSet", {
-            "threadID": tid,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestThreadSet",
+            {
+                "threadID": tid,
+            },
+            debuggerId,
+        )
+
     def remoteClientStack(self, debuggerId):
         """
         Public method to request the stack of the main thread.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__sendJsonCommand("RequestStack", {}, debuggerId)
-    
-    def remoteClientVariables(self, debuggerId, scope, filterList, framenr=0,
-                              maxSize=0):
+
+    def remoteClientVariables(
+        self, debuggerId, scope, filterList, framenr=0, maxSize=0
+    ):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1095,18 +1183,23 @@
             be given (@@TOO_BIG_TO_SHOW@@).
         @type int
         """
-        self.__sendJsonCommand("RequestVariables", {
-            "frameNumber": framenr,
-            "scope": scope,
-            "filters": filterList,
-            "maxSize": maxSize,
-        }, debuggerId)
-    
-    def remoteClientVariable(self, debuggerId, scope, filterList, var,
-                             framenr=0, maxSize=0):
+        self.__sendJsonCommand(
+            "RequestVariables",
+            {
+                "frameNumber": framenr,
+                "scope": scope,
+                "filters": filterList,
+                "maxSize": maxSize,
+            },
+            debuggerId,
+        )
+
+    def remoteClientVariable(
+        self, debuggerId, scope, filterList, var, framenr=0, maxSize=0
+    ):
         """
         Public method to request the variables of the debugged program.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1122,27 +1215,31 @@
             be given (@@TOO_BIG_TO_SHOW@@).
         @type int
         """
-        self.__sendJsonCommand("RequestVariable", {
-            "variable": var,
-            "frameNumber": framenr,
-            "scope": scope,
-            "filters": filterList,
-            "maxSize": maxSize,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestVariable",
+            {
+                "variable": var,
+                "frameNumber": framenr,
+                "scope": scope,
+                "filters": filterList,
+                "maxSize": maxSize,
+            },
+            debuggerId,
+        )
+
     def remoteClientDisassembly(self, debuggerId):
         """
         Public method to ask the client for the latest traceback disassembly.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__sendJsonCommand("RequestDisassembly", {}, debuggerId)
-    
+
     def remoteClientSetFilter(self, debuggerId, scope, filterStr):
         """
         Public method to set a variables filter list.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param scope the scope of the variables (0 = local, 1 = global)
@@ -1150,91 +1247,106 @@
         @param filterStr regexp string for variable names to filter out
         @type str
         """
-        self.__sendJsonCommand("RequestSetFilter", {
-            "scope": scope,
-            "filter": filterStr,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestSetFilter",
+            {
+                "scope": scope,
+                "filter": filterStr,
+            },
+            debuggerId,
+        )
+
     def setCallTraceEnabled(self, debuggerId, on):
         """
         Public method to set the call trace state.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param on flag indicating to enable the call trace function
         @type bool
         """
-        self.__sendJsonCommand("RequestCallTrace", {
-            "enable": on,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestCallTrace",
+            {
+                "enable": on,
+            },
+            debuggerId,
+        )
+
     def remoteNoDebugList(self, debuggerId, noDebugList):
         """
         Public method to set a list of programs not to be debugged.
-        
+
         The programs given in the list will not be run under the control
         of the multi process debugger.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param noDebugList list of Python programs not to be debugged
         @type list of str
         """
-        self.__sendJsonCommand("RequestSetNoDebugList", {
-            "noDebug": noDebugList,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestSetNoDebugList",
+            {
+                "noDebug": noDebugList,
+            },
+            debuggerId,
+        )
+
     def remoteBanner(self):
         """
         Public slot to get the banner info of the remote client.
         """
         self.__sendJsonCommand("RequestBanner", {})
-    
+
     def remoteCapabilities(self, debuggerId):
         """
         Public slot to get the debug clients capabilities.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         """
         self.__sendJsonCommand("RequestCapabilities", {}, debuggerId)
-    
+
     def remoteCompletion(self, debuggerId, text):
         """
         Public slot to get the a list of possible commandline completions
         from the remote client.
-        
+
         @param debuggerId ID of the debugger backend
         @type str
         @param text the text to be completed
         @type str
         """
-        self.__sendJsonCommand("RequestCompletion", {
-            "text": text,
-        }, debuggerId)
-    
+        self.__sendJsonCommand(
+            "RequestCompletion",
+            {
+                "text": text,
+            },
+            debuggerId,
+        )
+
     def __parseClientLine(self, sock):
         """
         Private method to handle data from the client.
-        
+
         @param sock reference to the socket to read data from
         @type QTcpSocket
         """
         while sock and sock.canReadLine():
             qs = sock.readLine()
-            line = bytes(qs).decode(
-                encoding=Preferences.getSystem("StringEncoding"))
-            
+            line = bytes(qs).decode(encoding=Preferences.getSystem("StringEncoding"))
+
             logging.debug("<Debug-Server> %s", line)
-##            print("Server: ", line)    ## debug    # __IGNORE_WARNING_M891__
-            
+            ##print("Server: ", line)    ## debug       # __IGNORE_WARNING_M891__
+
             self.__handleJsonCommand(line, sock)
-    
+
     def __handleJsonCommand(self, jsonStr, sock):
         """
         Private method to handle a command or response serialized as a
         JSON string.
-        
+
         @param jsonStr string containing the command or response received
             from the debug backend
         @type str
@@ -1242,33 +1354,34 @@
         @type QTcpSocket
         """
         import json
-        
+
         try:
             commandDict = json.loads(jsonStr.strip())
         except (TypeError, ValueError) as err:
             EricMessageBox.critical(
                 None,
                 self.tr("Debug Protocol Error"),
-                self.tr("""<p>The response received from the debugger"""
-                        """ backend could not be decoded. Please report"""
-                        """ this issue with the received data to the"""
-                        """ eric bugs email address.</p>"""
-                        """<p>Error: {0}</p>"""
-                        """<p>Data:<br/>{1}</p>""").format(
-                    str(err), Utilities.html_encode(jsonStr.strip())),
-                EricMessageBox.Ok)
+                self.tr(
+                    """<p>The response received from the debugger"""
+                    """ backend could not be decoded. Please report"""
+                    """ this issue with the received data to the"""
+                    """ eric bugs email address.</p>"""
+                    """<p>Error: {0}</p>"""
+                    """<p>Data:<br/>{1}</p>"""
+                ).format(str(err), Utilities.html_encode(jsonStr.strip())),
+                EricMessageBox.Ok,
+            )
             return
-        
+
         method = commandDict["method"]
         params = commandDict["params"]
-        
+
         if method == "DebuggerId":
             self.__assignDebuggerId(sock, params["debuggerId"])
-        
+
         elif method == "ClientOutput":
-            self.debugServer.signalClientOutput(
-                params["text"], params["debuggerId"])
-        
+            self.debugServer.signalClientOutput(params["text"], params["debuggerId"])
+
         elif method in ["ResponseLine", "ResponseStack"]:
             # Check if obsolete thread was clicked
             if params["stack"] == []:
@@ -1278,50 +1391,58 @@
             for s in params["stack"]:
                 s[0] = self.translate(s[0], True)
             cf = params["stack"][0]
-            if (
-                self.__autoContinue and
-                params["debuggerId"] not in self.__autoContinued
-            ):
+            if self.__autoContinue and params["debuggerId"] not in self.__autoContinued:
                 self.__autoContinued.append(params["debuggerId"])
-                QTimer.singleShot(
-                    0, lambda: self.remoteContinue(params["debuggerId"]))
+                QTimer.singleShot(0, lambda: self.remoteContinue(params["debuggerId"]))
             else:
                 self.debugServer.signalClientLine(
-                    cf[0], int(cf[1]), params["debuggerId"],
-                    method == "ResponseStack", threadName=params["threadName"])
+                    cf[0],
+                    int(cf[1]),
+                    params["debuggerId"],
+                    method == "ResponseStack",
+                    threadName=params["threadName"],
+                )
                 self.debugServer.signalClientStack(
-                    params["stack"], params["debuggerId"],
-                    threadName=params["threadName"])
-        
+                    params["stack"],
+                    params["debuggerId"],
+                    threadName=params["threadName"],
+                )
+
         elif method == "CallTrace":
             isCall = params["event"].lower() == "c"
             fromInfo = params["from"]
             toInfo = params["to"]
             self.debugServer.signalClientCallTrace(
                 isCall,
-                fromInfo["filename"], str(fromInfo["linenumber"]),
+                fromInfo["filename"],
+                str(fromInfo["linenumber"]),
                 fromInfo["codename"],
-                toInfo["filename"], str(toInfo["linenumber"]),
+                toInfo["filename"],
+                str(toInfo["linenumber"]),
                 toInfo["codename"],
-                params["debuggerId"])
-        
+                params["debuggerId"],
+            )
+
         elif method == "ResponseVariables":
             self.debugServer.signalClientVariables(
-                params["scope"], params["variables"], params["debuggerId"])
-        
+                params["scope"], params["variables"], params["debuggerId"]
+            )
+
         elif method == "ResponseVariable":
             self.debugServer.signalClientVariable(
-                params["scope"], [params["variable"]] + params["variables"],
-                params["debuggerId"])
-        
+                params["scope"],
+                [params["variable"]] + params["variables"],
+                params["debuggerId"],
+            )
+
         elif method == "ResponseThreadList":
             self.debugServer.signalClientThreadList(
-                params["currentID"], params["threadList"],
-                params["debuggerId"])
-        
+                params["currentID"], params["threadList"], params["debuggerId"]
+            )
+
         elif method == "ResponseThreadSet":
             self.debugServer.signalClientThreadSet(params["debuggerId"])
-        
+
         elif method == "ResponseCapabilities":
             self.clientCapabilities = params["capabilities"]
             if params["debuggerId"] == self.__master:
@@ -1331,7 +1452,7 @@
                     params["clientType"],
                     self.__startedVenv,
                 )
-        
+
         elif method == "ResponseBanner":
             if params["debuggerId"] == self.__master:
                 # signal only for the master connection
@@ -1340,39 +1461,45 @@
                     params["platform"],
                     self.__startedVenv,
                 )
-        
+
         elif method == "ResponseOK":
             self.debugServer.signalClientStatement(False, params["debuggerId"])
-        
+
         elif method == "ResponseContinue":
             self.debugServer.signalClientStatement(True, params["debuggerId"])
-        
+
         elif method == "RequestRaw":
             self.debugServer.signalClientRawInput(
-                params["prompt"], params["echo"], params["debuggerId"])
-        
+                params["prompt"], params["echo"], params["debuggerId"]
+            )
+
         elif method == "ResponseBPConditionError":
             fn = self.translate(params["filename"], True)
             self.debugServer.signalClientBreakConditionError(
-                fn, params["line"], params["debuggerId"])
-        
+                fn, params["line"], params["debuggerId"]
+            )
+
         elif method == "ResponseClearBreakpoint":
             fn = self.translate(params["filename"], True)
             self.debugServer.signalClientClearBreak(
-                fn, params["line"], params["debuggerId"])
-        
+                fn, params["line"], params["debuggerId"]
+            )
+
         elif method == "ResponseWatchConditionError":
             self.debugServer.signalClientWatchConditionError(
-                params["condition"], params["debuggerId"])
-        
+                params["condition"], params["debuggerId"]
+            )
+
         elif method == "ResponseClearWatch":
             self.debugServer.signalClientClearWatch(
-                params["condition"], params["debuggerId"])
-        
+                params["condition"], params["debuggerId"]
+            )
+
         elif method == "ResponseDisassembly":
             self.debugServer.signalClientDisassembly(
-                params["disassembly"], params["debuggerId"])
-        
+                params["disassembly"], params["debuggerId"]
+            )
+
         elif method == "ResponseException":
             exctype = params["type"]
             excmessage = params["message"]
@@ -1386,44 +1513,58 @@
                             stackEntry[0] = self.__scriptName
                         else:
                             break
-            
+
             self.debugServer.signalClientException(
-                exctype, excmessage, stack, params["debuggerId"],
-                params["threadName"])
-        
+                exctype, excmessage, stack, params["debuggerId"], params["threadName"]
+            )
+
         elif method == "ResponseSyntax":
             self.debugServer.signalClientSyntaxError(
-                params["message"], self.translate(params["filename"], True),
-                params["linenumber"], params["characternumber"],
-                params["debuggerId"], params["threadName"])
-        
+                params["message"],
+                self.translate(params["filename"], True),
+                params["linenumber"],
+                params["characternumber"],
+                params["debuggerId"],
+                params["threadName"],
+            )
+
         elif method == "ResponseSignal":
             self.debugServer.signalClientSignal(
-                params["message"], self.translate(params["filename"], True),
-                params["linenumber"], params["function"], params["arguments"],
-                params["debuggerId"])
-        
+                params["message"],
+                self.translate(params["filename"], True),
+                params["linenumber"],
+                params["function"],
+                params["arguments"],
+                params["debuggerId"],
+            )
+
         elif method == "ResponseExit":
             self.__scriptName = ""
             self.debugServer.signalClientExit(
-                params["program"], params["status"], params["message"],
-                params["debuggerId"])
+                params["program"],
+                params["status"],
+                params["message"],
+                params["debuggerId"],
+            )
             if params["debuggerId"] == self.__master:
                 self.debugServer.signalMainClientExit()
-        
+
         elif method == "PassiveStartup":
             self.debugServer.passiveStartUp(
-                self.translate(params["filename"], True), params["exceptions"],
-                params["debuggerId"])
-        
+                self.translate(params["filename"], True),
+                params["exceptions"],
+                params["debuggerId"],
+            )
+
         elif method == "ResponseCompletion":
             self.debugServer.signalClientCompletionList(
-                params["completions"], params["text"], params["debuggerId"])
-    
+                params["completions"], params["text"], params["debuggerId"]
+            )
+
     def __sendJsonCommand(self, command, params, debuggerId="", sock=None):
         """
         Private method to send a single command to the client.
-        
+
         @param command command name to be sent
         @type str
         @param params dictionary of named parameters for the command
@@ -1435,14 +1576,14 @@
         @type QTcpSocket
         """
         import json
-        
+
         commandDict = {
             "jsonrpc": "2.0",
             "method": command,
             "params": params,
         }
-        cmd = json.dumps(commandDict) + '\n'
-        
+        cmd = json.dumps(commandDict) + "\n"
+
         if debuggerId and debuggerId in self.__connections:
             sock = self.__connections[debuggerId]
         elif sock is None and self.__master is not None:
@@ -1451,17 +1592,17 @@
             self.__writeJsonCommandToSocket(cmd, sock)
         else:
             self.queue.append(cmd)
-    
+
     def __writeJsonCommandToSocket(self, cmd, sock):
         """
         Private method to write a JSON command to the socket.
-        
+
         @param cmd JSON command to be sent
         @type str
         @param sock reference to the socket to write to
         @type QTcpSocket
         """
-        data = cmd.encode('utf8', 'backslashreplace')
+        data = cmd.encode("utf8", "backslashreplace")
         length = "{0:09d}".format(len(data))
         sock.write(length.encode() + data)
         sock.flush()
@@ -1470,8 +1611,8 @@
 def createDebuggerInterfacePython3(debugServer, passive):
     """
     Module function to create a debugger interface instance.
-    
-        
+
+
     @param debugServer reference to the debug server
     @type DebugServer
     @param passive flag indicating passive connection mode
@@ -1486,7 +1627,7 @@
     """
     Module function to get characterizing data for the supported debugger
     interfaces.
-    
+
     @return list of tuples containing the client type, the client capabilities,
         the client file type associations and a reference to the creation
         function
@@ -1498,12 +1639,16 @@
             py3Exts.append(ext)
         else:
             py3Exts.append(".{0}".format(ext))
-    
+
     registryData = []
     if py3Exts:
         registryData.append(
-            ("Python3", ClientDefaultCapabilities, py3Exts,
-                createDebuggerInterfacePython3)
+            (
+                "Python3",
+                ClientDefaultCapabilities,
+                py3Exts,
+                createDebuggerInterfacePython3,
+            )
         )
-    
+
     return registryData
--- a/src/eric7/Debugger/EditBreakpointDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/EditBreakpointDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,11 +20,21 @@
     """
     Class implementing a dialog to edit breakpoint properties.
     """
-    def __init__(self, breakPointId, properties, condHistory, parent=None,
-                 name=None, modal=False, addMode=False, filenameHistory=None):
+
+    def __init__(
+        self,
+        breakPointId,
+        properties,
+        condHistory,
+        parent=None,
+        name=None,
+        modal=False,
+        addMode=False,
+        filenameHistory=None,
+    ):
         """
         Constructor
-        
+
         @param breakPointId id of the breakpoint (tuple)
                 (filename, linenumber)
         @param properties properties for the breakpoint (tuple)
@@ -42,29 +52,29 @@
         if name:
             self.setObjectName(name)
         self.setModal(modal)
-        
+
         self.filenamePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.filenamePicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         fn, lineno = breakPointId
-        
+
         if not addMode:
             cond, temp, enabled, count = properties
-            
+
             # set the filename
             if fn is not None:
                 self.filenamePicker.setEditText(fn)
-            
+
             # set the line number
             self.linenoSpinBox.setValue(lineno)
-            
+
             # set the condition
             if cond is None:
-                cond = ''
+                cond = ""
             try:
                 curr = condHistory.index(cond)
             except ValueError:
@@ -72,14 +82,14 @@
                 curr = 0
             self.conditionCombo.addItems(condHistory)
             self.conditionCombo.setCurrentIndex(curr)
-            
+
             # set the ignore count
             self.ignoreSpinBox.setValue(count)
-            
+
             # set the checkboxes
             self.temporaryCheckBox.setChecked(temp)
             self.enabledCheckBox.setChecked(enabled)
-            
+
             self.filenamePicker.setEnabled(False)
             self.linenoSpinBox.setEnabled(False)
             self.conditionCombo.setFocus()
@@ -95,9 +105,9 @@
                 curr = 0
             self.filenamePicker.addItems(filenameHistory)
             self.filenamePicker.setCurrentIndex(curr)
-            
+
             # set the condition
-            cond = ''
+            cond = ""
             try:
                 curr = condHistory.index(cond)
             except ValueError:
@@ -105,48 +115,54 @@
                 curr = 0
             self.conditionCombo.addItems(condHistory)
             self.conditionCombo.setCurrentIndex(curr)
-            
+
             if not fn:
                 self.okButton.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_filenamePicker_editTextChanged(self, fn):
         """
         Private slot to handle the change of the filename.
-        
+
         @param fn text of the filename edit (string)
         """
         if not fn:
             self.okButton.setEnabled(False)
         else:
             self.okButton.setEnabled(True)
-        
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return a tuple containing the breakpoints new properties
             (condition, temporary flag, enabled flag, ignore count)
         """
-        return (self.conditionCombo.currentText(),
-                self.temporaryCheckBox.isChecked(),
-                self.enabledCheckBox.isChecked(), self.ignoreSpinBox.value())
-        
+        return (
+            self.conditionCombo.currentText(),
+            self.temporaryCheckBox.isChecked(),
+            self.enabledCheckBox.isChecked(),
+            self.ignoreSpinBox.value(),
+        )
+
     def getAddData(self):
         """
         Public method to retrieve the entered data for an add.
-        
+
         @return a tuple containing the new breakpoints properties
             (filename, lineno, condition, temporary flag, enabled flag,
             ignore count)
         """
         fn = self.filenamePicker.currentText()
         fn = os.path.expanduser(os.path.expandvars(fn)) if fn else None
-        
-        return (fn, self.linenoSpinBox.value(),
-                self.conditionCombo.currentText(),
-                self.temporaryCheckBox.isChecked(),
-                self.enabledCheckBox.isChecked(),
-                self.ignoreSpinBox.value())
+
+        return (
+            fn,
+            self.linenoSpinBox.value(),
+            self.conditionCombo.currentText(),
+            self.temporaryCheckBox.isChecked(),
+            self.enabledCheckBox.isChecked(),
+            self.ignoreSpinBox.value(),
+        )
--- a/src/eric7/Debugger/EditWatchpointDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/EditWatchpointDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to edit watch expression properties.
     """
+
     def __init__(self, properties, parent=None, name=None, modal=False):
         """
         Constructor
-        
+
         @param properties properties for the watch expression (tuple)
             (expression, temporary flag, enabled flag, ignore count,
             special condition)
@@ -32,16 +33,15 @@
         if name:
             self.setObjectName(name)
         self.setModal(modal)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         # connect our widgets
         self.conditionEdit.textChanged.connect(self.__textChanged)
         self.specialEdit.textChanged.connect(self.__textChanged)
-        
+
         cond, temp, enabled, count, special = properties
-        
+
         # set the condition
         if not special:
             self.conditionButton.setChecked(True)
@@ -53,62 +53,65 @@
             if ind == -1:
                 ind = 0
             self.specialCombo.setCurrentIndex(ind)
-        
+
         # set the ignore count
         self.ignoreSpinBox.setValue(count)
-        
+
         # set the checkboxes
         self.temporaryCheckBox.setChecked(temp)
         self.enabledCheckBox.setChecked(enabled)
-        
+
         if not special:
             self.conditionEdit.setFocus()
         else:
             self.specialEdit.setFocus()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __textChanged(self, txt):
         """
         Private slot to handle the text changed signal of the condition line
         edit.
-        
+
         @param txt text of the line edit (string)
         """
         if self.conditionButton.isChecked():
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok
-            ).setEnabled(self.conditionEdit.text() != "")
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                self.conditionEdit.text() != ""
+            )
         elif self.specialButton.isChecked():
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok
-            ).setEnabled(self.specialEdit.text() != "")
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                self.specialEdit.text() != ""
+            )
         else:
             # should not happen
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return a tuple containing the watch expressions new properties
             (expression, temporary flag, enabled flag, ignore count,
             special condition)
         """
         if self.conditionButton.isChecked():
-            return (self.conditionEdit.text(),
-                    self.temporaryCheckBox.isChecked(),
-                    self.enabledCheckBox.isChecked(),
-                    self.ignoreSpinBox.value(),
-                    "")
+            return (
+                self.conditionEdit.text(),
+                self.temporaryCheckBox.isChecked(),
+                self.enabledCheckBox.isChecked(),
+                self.ignoreSpinBox.value(),
+                "",
+            )
         elif self.specialButton.isChecked():
-            return (self.specialEdit.text(),
-                    self.temporaryCheckBox.isChecked(),
-                    self.enabledCheckBox.isChecked(),
-                    self.ignoreSpinBox.value(),
-                    self.specialCombo.currentText())
+            return (
+                self.specialEdit.text(),
+                self.temporaryCheckBox.isChecked(),
+                self.enabledCheckBox.isChecked(),
+                self.ignoreSpinBox.value(),
+                self.specialCombo.currentText(),
+            )
         else:
             # should not happen
             return ("", False, False, 0, "")
--- a/src/eric7/Debugger/ExceptionLogger.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/ExceptionLogger.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,25 +18,26 @@
 class ExceptionLogger(QTreeWidget):
     """
     Class implementing the Exception Logger widget.
-    
+
     This class displays a log of all exceptions having occured during
     a debugging session.
-    
+
     @signal sourceFile(string, int) emitted to open a source file at a line
     """
+
     sourceFile = pyqtSignal(str, int)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent the parent widget of this widget
         """
         super().__init__(parent)
         self.setObjectName("ExceptionLogger")
-        
+
         self.setWindowTitle(self.tr("Exceptions"))
-        
+
         self.setWordWrap(True)
         self.setRootIsDecorated(True)
         self.setHeaderLabels([self.tr("Exception")])
@@ -46,31 +47,33 @@
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.itemDoubleClicked.connect(self.__itemDoubleClicked)
 
-        self.setWhatsThis(self.tr(
-            """<b>Exceptions Logger</b>"""
-            """<p>This windows shows a trace of all exceptions, that have"""
-            """ occured during the last debugging session. Initially only"""
-            """ the exception type and exception message are shown. After"""
-            """ the expansion of this entry, the complete call stack as"""
-            """ reported by the client is show with the most recent call"""
-            """ first.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Exceptions Logger</b>"""
+                """<p>This windows shows a trace of all exceptions, that have"""
+                """ occured during the last debugging session. Initially only"""
+                """ the exception type and exception message are shown. After"""
+                """ the expansion of this entry, the complete call stack as"""
+                """ reported by the client is show with the most recent call"""
+                """ first.</p>"""
+            )
+        )
+
         self.menu = QMenu(self)
         self.menu.addAction(self.tr("Show source"), self.__openSource)
         self.menu.addAction(self.tr("Clear"), self.clear)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.backMenu = QMenu(self)
         self.backMenu.addAction(self.tr("Clear"), self.clear)
         self.backMenu.addSeparator()
         self.backMenu.addAction(self.tr("Configure..."), self.__configure)
-        
+
     def __itemDoubleClicked(self, itm):
         """
         Private slot to handle the double click of an item.
-        
+
         @param itm the item that was double clicked(QTreeWidgetItem), ignored
         """
         self.__openSource()
@@ -78,7 +81,7 @@
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the global coordinates of the mouse pointer (QPoint)
         """
         itm = self.itemAt(coord)
@@ -87,12 +90,11 @@
             self.backMenu.popup(coord)
         else:
             self.menu.popup(coord)
-            
-    def addException(self, exceptionType, exceptionMessage, stackTrace,
-                     debuggerId):
+
+    def addException(self, exceptionType, exceptionMessage, stackTrace, debuggerId):
         """
         Public slot to handle the arrival of a new exception.
-        
+
         @param exceptionType type of exception raised
         @type str
         @param exceptionMessage message given by the exception
@@ -105,50 +107,53 @@
         itm = QTreeWidgetItem(self)
         if exceptionType is None:
             itm.setText(
-                0, self.tr('{0}: An unhandled exception occured.'
-                           ' See the shell window for details.')
-                .format(debuggerId))
+                0,
+                self.tr(
+                    "{0}: An unhandled exception occured."
+                    " See the shell window for details."
+                ).format(debuggerId),
+            )
             return
-        
+
         text = (
             self.tr("{0}: {1}").format(debuggerId, exceptionType)
-            if not exceptionMessage else
-            self.tr("{0}: {1}, {2}").format(debuggerId, exceptionType,
-                                            exceptionMessage)
+            if not exceptionMessage
+            else self.tr("{0}: {1}, {2}").format(
+                debuggerId, exceptionType, exceptionMessage
+            )
         )
-        
+
         itm.setText(0, text)
         itm.setToolTip(0, text)
-        
+
         # now add the call stack, most recent call first
         for entry in stackTrace:
             excitm = QTreeWidgetItem(itm)
             excitm.setText(0, "{0}, {1:d}".format(entry[0], entry[1]))
-            
+
     def debuggingStarted(self):
         """
         Public slot to clear the listview upon starting a new debugging
         session.
         """
         self.clear()
-        
+
     def __openSource(self):
         """
         Private slot to handle a double click on an entry.
         """
         itm = self.currentItem()
-        
+
         if itm.parent() is None:
             return
-            
+
         entry = itm.text(0)
         entryList = entry.split(",")
         with contextlib.suppress(IndexError, ValueError):
             self.sourceFile.emit(entryList[0], int(entryList[1]))
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "debuggerGeneralPage")
+        ericApp().getObject("UserInterface").showPreferences("debuggerGeneralPage")
--- a/src/eric7/Debugger/ExceptionsFilterDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/ExceptionsFilterDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing the exceptions filter dialog.
     """
+
     def __init__(self, excList, ignore, parent=None):
         """
         Constructor
-        
+
         @param excList list of exceptions to be edited (list of strings)
         @param ignore flag indicating the ignore exceptions mode (boolean)
         @param parent the parent widget (QWidget)
@@ -28,25 +29,22 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setModal(True)
-        
+
         self.exceptionList.addItems(excList)
-        
+
         if ignore:
             self.setWindowTitle(self.tr("Ignored Exceptions"))
-            self.exceptionList.setToolTip(
-                self.tr("List of ignored exceptions"))
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-    
+            self.exceptionList.setToolTip(self.tr("List of ignored exceptions"))
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
     @pyqtSlot()
     def on_exceptionList_itemSelectionChanged(self):
         """
         Private slot to handle the change of the selection.
         """
-        self.deleteButton.setEnabled(
-            len(self.exceptionList.selectedItems()) > 0)
-    
+        self.deleteButton.setEnabled(len(self.exceptionList.selectedItems()) > 0)
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -54,14 +52,14 @@
         """
         itm = self.exceptionList.takeItem(self.exceptionList.currentRow())
         del itm
-    
+
     @pyqtSlot()
     def on_deleteAllButton_clicked(self):
         """
         Private slot to delete all exceptions of the listbox.
         """
         while self.exceptionList.count() > 0:
-            itm = self.exceptionList.takeItem(0)    # __IGNORE_WARNING__
+            itm = self.exceptionList.takeItem(0)  # __IGNORE_WARNING__
             del itm
 
     @pyqtSlot()
@@ -73,14 +71,14 @@
         if exception:
             self.exceptionList.addItem(exception)
             self.exceptionEdit.clear()
-        
+
     def on_exceptionEdit_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of exceptionEdit.
-        
+
         This slot sets the enabled status of the add button and sets the forms
         default button.
-        
+
         @param txt the text entered into exceptionEdit (string)
         """
         if not txt:
@@ -91,11 +89,11 @@
             self.okButton.setDefault(False)
             self.addButton.setDefault(True)
             self.addButton.setEnabled(True)
-        
+
     def getExceptionsList(self):
         """
         Public method to retrieve the list of exception types.
-        
+
         @return list of exception types (list of strings)
         """
         excList = []
--- a/src/eric7/Debugger/StartDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/StartDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,22 +20,37 @@
 class StartDialog(QDialog):
     """
     Class implementing the Start Program dialog.
-    
+
     It implements a dialog that is used to start an
     application for debugging. It asks the user to enter
     the commandline parameters, the working directory and
     whether exception reporting should be disabled.
     """
-    def __init__(self, caption, lastUsedVenvName, argvList, wdList, envList,
-                 exceptions,
-                 parent=None, dialogType=0, modfuncList=None,
-                 tracePython=False, autoClearShell=True, autoContinue=True,
-                 enableMultiprocess=False, multiprocessNoDebugHistory=None,
-                 configOverride=None,
-                 forProject=False, scriptName="", scriptsList=None):
+
+    def __init__(
+        self,
+        caption,
+        lastUsedVenvName,
+        argvList,
+        wdList,
+        envList,
+        exceptions,
+        parent=None,
+        dialogType=0,
+        modfuncList=None,
+        tracePython=False,
+        autoClearShell=True,
+        autoContinue=True,
+        enableMultiprocess=False,
+        multiprocessNoDebugHistory=None,
+        configOverride=None,
+        forProject=False,
+        scriptName="",
+        scriptsList=None,
+    ):
         """
         Constructor
-        
+
         @param caption the caption to be displayed
         @type str
         @param lastUsedVenvName name of the most recently used virtual
@@ -89,54 +104,64 @@
         """
         super().__init__(parent)
         self.setModal(True)
-        
+
         self.dialogType = dialogType
         if dialogType == 0:
             from .Ui_StartDebugDialog import Ui_StartDebugDialog
+
             self.ui = Ui_StartDebugDialog()
         elif dialogType == 1:
             from .Ui_StartRunDialog import Ui_StartRunDialog
+
             self.ui = Ui_StartRunDialog()
         elif dialogType == 2:
             from .Ui_StartCoverageDialog import Ui_StartCoverageDialog
+
             self.ui = Ui_StartCoverageDialog()
         elif dialogType == 3:
             from .Ui_StartProfileDialog import Ui_StartProfileDialog
+
             self.ui = Ui_StartProfileDialog()
         self.ui.setupUi(self)
-        
+
         self.ui.venvComboBox.addItem("")
         self.ui.venvComboBox.addItems(
-            sorted(ericApp().getObject("VirtualEnvManager")
-                   .getVirtualenvNames()))
-        
+            sorted(ericApp().getObject("VirtualEnvManager").getVirtualenvNames())
+        )
+
         self.ui.scriptnamePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.ui.scriptnamePicker.setDefaultDirectory(
-            Preferences.getMultiProject("Workspace"))
-        self.ui.scriptnamePicker.setInsertPolicy(
-            QComboBox.InsertPolicy.InsertAtTop)
+            Preferences.getMultiProject("Workspace")
+        )
+        self.ui.scriptnamePicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.ui.scriptnamePicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        self.ui.scriptnamePicker.setFilters(self.tr(
-            "Python Files (*.py *.py3);;"
-            "Python GUI Files (*.pyw *.pyw3);;"
-            "All Files (*)"
-        ))
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+        self.ui.scriptnamePicker.setFilters(
+            self.tr(
+                "Python Files (*.py *.py3);;"
+                "Python GUI Files (*.pyw *.pyw3);;"
+                "All Files (*)"
+            )
+        )
         self.ui.scriptnamePicker.setEnabled(not forProject)
-        
+
         self.ui.workdirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.ui.workdirPicker.setDefaultDirectory(
-            Preferences.getMultiProject("Workspace"))
-        self.ui.workdirPicker.setInsertPolicy(
-            QComboBox.InsertPolicy.InsertAtTop)
+            Preferences.getMultiProject("Workspace")
+        )
+        self.ui.workdirPicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.ui.workdirPicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+
         self.clearButton = self.ui.buttonBox.addButton(
-            self.tr("Clear Histories"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Clear Histories"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.editButton = self.ui.buttonBox.addButton(
-            self.tr("Edit History"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Edit History"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.setWindowTitle(caption)
         self.ui.cmdlineCombo.clear()
         self.ui.cmdlineCombo.addItems(argvList)
@@ -151,56 +176,58 @@
         self.ui.exceptionCheckBox.setChecked(exceptions)
         self.ui.clearShellCheckBox.setChecked(autoClearShell)
         self.ui.consoleCheckBox.setEnabled(
-            Preferences.getDebugger("ConsoleDbgCommand") != "")
+            Preferences.getDebugger("ConsoleDbgCommand") != ""
+        )
         self.ui.consoleCheckBox.setChecked(False)
         venvIndex = max(0, self.ui.venvComboBox.findText(lastUsedVenvName))
         self.ui.venvComboBox.setCurrentIndex(venvIndex)
         self.ui.globalOverrideGroup.setChecked(configOverride["enable"])
         self.ui.redirectCheckBox.setChecked(configOverride["redirect"])
-        
+
         self.ui.scriptnamePicker.addItems(scriptsList)
         self.ui.scriptnamePicker.setText(scriptName)
-        
-        if dialogType == 0:        # start debug dialog
-            enableMultiprocessGlobal = Preferences.getDebugger(
-                "MultiProcessEnabled")
+
+        if dialogType == 0:  # start debug dialog
+            enableMultiprocessGlobal = Preferences.getDebugger("MultiProcessEnabled")
             self.ui.tracePythonCheckBox.setChecked(tracePython)
             self.ui.tracePythonCheckBox.show()
             self.ui.autoContinueCheckBox.setChecked(autoContinue)
             self.ui.multiprocessGroup.setEnabled(enableMultiprocessGlobal)
             self.ui.multiprocessGroup.setChecked(
-                enableMultiprocess & enableMultiprocessGlobal)
+                enableMultiprocess & enableMultiprocessGlobal
+            )
             self.ui.multiprocessNoDebugCombo.clear()
-            self.ui.multiprocessNoDebugCombo.setToolTip(self.tr(
-                "Enter the list of programs or program patterns not to be"
-                " debugged separated by '{0}'.").format(os.pathsep)
+            self.ui.multiprocessNoDebugCombo.setToolTip(
+                self.tr(
+                    "Enter the list of programs or program patterns not to be"
+                    " debugged separated by '{0}'."
+                ).format(os.pathsep)
             )
             if multiprocessNoDebugHistory:
-                self.ui.multiprocessNoDebugCombo.addItems(
-                    multiprocessNoDebugHistory)
+                self.ui.multiprocessNoDebugCombo.addItems(multiprocessNoDebugHistory)
                 self.ui.multiprocessNoDebugCombo.setCurrentIndex(0)
-        
-        if dialogType == 3:       # start coverage or profile dialog
+
+        if dialogType == 3:  # start coverage or profile dialog
             self.ui.eraseCheckBox.setChecked(True)
-        
+
         self.__clearHistoryLists = False
         self.__historiesModified = False
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_modFuncCombo_editTextChanged(self):
         """
         Private slot to enable/disable the OK button.
         """
-        self.ui.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setDisabled(
-                self.ui.modFuncCombo.currentText() == "")
-        
+        self.ui.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setDisabled(
+            self.ui.modFuncCombo.currentText() == ""
+        )
+
     def getData(self):
         """
         Public method to retrieve the data entered into this dialog.
-        
+
         @return a tuple of virtual environment, script name, argv, workdir,
             environment, exceptions flag, clear interpreter flag and run in
             console flag
@@ -212,25 +239,26 @@
         venvName = self.ui.venvComboBox.currentText()
         scriptName = (
             self.ui.scriptnamePicker.currentText()
-            if self.ui.scriptnamePicker.isEnabled() else
-            ""
+            if self.ui.scriptnamePicker.isEnabled()
+            else ""
         )
-        
-        return (venvName,
-                scriptName,
-                cmdLine,
-                workdir,
-                environment,
-                self.ui.exceptionCheckBox.isChecked(),
-                self.ui.clearShellCheckBox.isChecked(),
-                self.ui.consoleCheckBox.isChecked(),
-                )
-    
+
+        return (
+            venvName,
+            scriptName,
+            cmdLine,
+            workdir,
+            environment,
+            self.ui.exceptionCheckBox.isChecked(),
+            self.ui.clearShellCheckBox.isChecked(),
+            self.ui.consoleCheckBox.isChecked(),
+        )
+
     def getGlobalOverrideData(self):
         """
         Public method to retrieve the global configuration override data
         entered into this dialog.
-        
+
         @return dictionary containing a flag indicating to activate the global
             override and a flag indicating a redirect of stdin/stdout/stderr
         @rtype dict
@@ -239,12 +267,12 @@
             "enable": self.ui.globalOverrideGroup.isChecked(),
             "redirect": self.ui.redirectCheckBox.isChecked(),
         }
-    
+
     def getDebugData(self):
         """
         Public method to retrieve the debug related data entered into this
         dialog.
-        
+
         @return a tuple of a flag indicating, if the Python library should be
             traced as well, a flag indicating, that the debugger should not
             stop at the first executable line, a flag indicating to support
@@ -253,18 +281,20 @@
         @rtype tuple of (bool, bool, bool, str)
         """
         if self.dialogType == 0:
-            return (self.ui.tracePythonCheckBox.isChecked(),
-                    self.ui.autoContinueCheckBox.isChecked(),
-                    self.ui.multiprocessGroup.isChecked(),
-                    self.ui.multiprocessNoDebugCombo.currentText())
+            return (
+                self.ui.tracePythonCheckBox.isChecked(),
+                self.ui.autoContinueCheckBox.isChecked(),
+                self.ui.multiprocessGroup.isChecked(),
+                self.ui.multiprocessNoDebugCombo.currentText(),
+            )
         else:
             return (False, False, False, "")
-    
+
     def getCoverageData(self):
         """
         Public method to retrieve the coverage related data entered into this
         dialog.
-        
+
         @return flag indicating erasure of coverage info
         @rtype bool
         """
@@ -272,12 +302,12 @@
             return self.ui.eraseCheckBox.isChecked()
         else:
             return False
-        
+
     def getProfilingData(self):
         """
         Public method to retrieve the profiling related data entered into this
         dialog.
-        
+
         @return flag indicating erasure of profiling info
         @rtype bool
         """
@@ -285,36 +315,36 @@
             return self.ui.eraseCheckBox.isChecked()
         else:
             return False
-        
+
     def __clearHistories(self):
         """
         Private slot to clear the combo boxes lists and record a flag to
         clear the lists.
         """
         self.__clearHistoryLists = True
-        self.__historiesModified = False    # clear catches it all
-        
+        self.__historiesModified = False  # clear catches it all
+
         cmdLine = self.ui.cmdlineCombo.currentText()
         workdir = self.ui.workdirPicker.currentText()
         environment = self.ui.environmentCombo.currentText()
         scriptName = self.ui.scriptnamePicker.currentText()
-        
+
         self.ui.cmdlineCombo.clear()
         self.ui.workdirPicker.clear()
         self.ui.environmentCombo.clear()
         self.ui.scriptnamePicker.clear()
-        
+
         self.ui.cmdlineCombo.addItem(cmdLine)
         self.ui.workdirPicker.addItem(workdir)
         self.ui.environmentCombo.addItem(environment)
         self.ui.scriptnamePicker.addItem("")
         self.ui.scriptnamePicker.setCurrentText(scriptName)
-        
+
         if self.dialogType == 0:
             noDebugList = self.ui.multiprocessNoDebugCombo.currentText()
             self.ui.multiprocessNoDebugCombo.clear()
             self.ui.multiprocessNoDebugCombo.addItem(noDebugList)
-    
+
     def __editHistory(self):
         """
         Private slot to edit a history list.
@@ -341,7 +371,9 @@
             self.tr("Edit History"),
             self.tr("Select the history list to be edited:"),
             histories,
-            0, False)
+            0,
+            False,
+        )
         if ok and historyKind:
             history = []
             historiesIndex = histories.index(historyKind)
@@ -351,12 +383,11 @@
             else:
                 combo = widgets[historiesIndex]
                 if combo:
-                    history = [
-                        combo.itemText(idx) for idx in range(combo.count())
-                    ]
-            
+                    history = [combo.itemText(idx) for idx in range(combo.count())]
+
             if history:
                 from .StartHistoryEditDialog import StartHistoryEditDialog
+
                 dlg = StartHistoryEditDialog(history, self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 history = dlg.getHistory()
@@ -364,31 +395,31 @@
                 if combo:
                     combo.clear()
                     combo.addItems(history)
-                    
+
                     self.__historiesModified = True
-    
+
     def historiesModified(self):
         """
         Public method to test for modified histories.
-        
+
         @return flag indicating modified histories
         @rtype bool
         """
         return self.__historiesModified
-    
+
     def clearHistories(self):
         """
         Public method to test, if histories shall be cleared.
-        
+
         @return flag indicating histories shall be cleared
         @rtype bool
         """
         return self.__clearHistoryLists
-    
+
     def getHistories(self):
         """
         Public method to get the lists of histories.
-        
+
         @return tuple containing the histories of script names, command line
             arguments, working directories, environment settings and no debug
             programs lists
@@ -399,23 +430,27 @@
                 self.ui.multiprocessNoDebugCombo.itemText(index)
                 for index in range(self.ui.multiprocessNoDebugCombo.count())
             ]
-            if self.dialogType == 0 else
-            None
+            if self.dialogType == 0
+            else None
         )
         return (
             self.ui.scriptnamePicker.getPathItems(),
-            [self.ui.cmdlineCombo.itemText(index) for index in range(
-                self.ui.cmdlineCombo.count())],
+            [
+                self.ui.cmdlineCombo.itemText(index)
+                for index in range(self.ui.cmdlineCombo.count())
+            ],
             self.ui.workdirPicker.getPathItems(),
-            [self.ui.environmentCombo.itemText(index) for index in range(
-                self.ui.environmentCombo.count())],
+            [
+                self.ui.environmentCombo.itemText(index)
+                for index in range(self.ui.environmentCombo.count())
+            ],
             noDebugHistory,
         )
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
--- a/src/eric7/Debugger/StartHistoryEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/StartHistoryEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to edit a list of history entries.
     """
+
     def __init__(self, history, parent=None):
         """
         Constructor
-        
+
         @param history list of history entries to be edited
         @type list of str
         @param parent reference to the parent widget
@@ -30,15 +31,15 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.historyList.addItems(history)
         for row in range(self.historyList.count()):
             itm = self.historyList.item(row)
             flags = itm.flags() | Qt.ItemFlag.ItemIsEditable
             itm.setFlags(flags)
-        
+
         self.__updateEditButtons()
-    
+
     def __updateEditButtons(self):
         """
         Private method to set the state of the edit buttons.
@@ -47,14 +48,14 @@
         self.editButton.setEnabled(selectedCount == 1)
         self.deleteButton.setEnabled(selectedCount > 0)
         self.deleteAllButton.setEnabled(self.historyList.count() > 0)
-    
+
     @pyqtSlot()
     def on_historyList_itemSelectionChanged(self):
         """
         Private slot to handle the selection of entries.
         """
         self.__updateEditButtons()
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -66,10 +67,11 @@
             self.tr("Edit History Entry"),
             self.tr("Enter the new text:"),
             QLineEdit.EchoMode.Normal,
-            itm.text())
+            itm.text(),
+        )
         if ok:
             itm.setText(historyText)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -78,14 +80,16 @@
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Delete Selected Entries"),
-            self.tr("""Do you really want to delete the selected"""
-                    """ history entries?"""))
+            self.tr(
+                """Do you really want to delete the selected""" """ history entries?"""
+            ),
+        )
         if yes:
             for itm in self.historyList.selectedItems():
                 row = self.historyList.row(itm)
                 self.historyList.takeItem(row)
                 del itm
-    
+
     @pyqtSlot()
     def on_deleteAllButton_clicked(self):
         """
@@ -94,14 +98,15 @@
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Delete All Entries"),
-            self.tr("""Do you really want to delete the shown history?"""))
+            self.tr("""Do you really want to delete the shown history?"""),
+        )
         if yes:
             self.historyList.clear()
-    
+
     def getHistory(self):
         """
         Public method to get the new list of history entries.
-        
+
         @return list of history entries
         @rtype list of str
         """
@@ -109,5 +114,5 @@
         for row in range(self.historyList.count()):
             entry = self.historyList.item(row).text()
             history.append(entry)
-        
+
         return history
--- a/src/eric7/Debugger/VariableDetailDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/VariableDetailDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,22 +15,23 @@
 class VariableDetailDialog(QDialog, Ui_VariableDetailDialog):
     """
     Class implementing the variable detail dialog.
-    
+
     This dialog shows the name, the type and the value of a variable
     in a read only dialog. It is opened upon a double click in the
     variables viewer widget.
     """
+
     def __init__(self, var, vtype, value):
         """
         Constructor
-        
+
         @param var the variables name (string)
         @param vtype the variables type (string)
         @param value the variables value (string)
         """
         super().__init__()
         self.setupUi(self)
-        
+
         # set the different fields
         self.eName.setText(var)
         self.eType.setText(vtype)
--- a/src/eric7/Debugger/VariablesFilterDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/VariablesFilterDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,14 +19,15 @@
 class VariablesFilterDialog(QDialog, Ui_VariablesFilterDialog):
     """
     Class implementing the variables filter dialog.
-    
+
     It opens a dialog window for the configuration of the variables type
     filter to be applied during a debugging session.
     """
+
     def __init__(self, parent=None, name=None, modal=False):
         """
         Constructor
-        
+
         @param parent parent widget of this dialog (QWidget)
         @param name name of this dialog (string)
         @param modal flag to indicate a modal dialog (boolean)
@@ -38,25 +39,27 @@
         self.setupUi(self)
 
         self.defaultButton = self.buttonBox.addButton(
-            self.tr("Save Default"), QDialogButtonBox.ButtonRole.ActionRole)
-        
-        #populate the list widgets and set the default selection
+            self.tr("Save Default"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
+        # populate the list widgets and set the default selection
         for widget in self.localsList, self.globalsList:
             for varType, varTypeStr in ConfigVarTypeDispStrings.items():
                 itm = QListWidgetItem(self.tr(varTypeStr), widget)
                 itm.setData(Qt.ItemDataRole.UserRole, varType)
-                itm.setFlags(Qt.ItemFlag.ItemIsEnabled |
-                             Qt.ItemFlag.ItemIsUserCheckable)
+                itm.setFlags(
+                    Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsUserCheckable
+                )
                 itm.setCheckState(Qt.CheckState.Unchecked)
                 widget.addItem(itm)
-        
+
         lDefaultFilter, gDefaultFilter = Preferences.getVarFilters()
         self.setSelection(lDefaultFilter, gDefaultFilter)
 
     def getSelection(self):
         """
         Public slot to retrieve the current selections.
-        
+
         @return tuple of lists containing the variable filters. The first list
             is the locals variables filter, the second the globals variables
             filter.
@@ -67,18 +70,18 @@
             itm = self.localsList.item(row)
             if itm.checkState() == Qt.CheckState.Unchecked:
                 lList.append(itm.data(Qt.ItemDataRole.UserRole))
-        
+
         gList = []
         for row in range(self.globalsList.count()):
             itm = self.globalsList.item(row)
             if itm.checkState() == Qt.CheckState.Unchecked:
                 gList.append(itm.data(Qt.ItemDataRole.UserRole))
         return (lList, gList)
-    
+
     def setSelection(self, lList, gList):
         """
         Public slot to set the current selection.
-        
+
         @param lList local variables filter
         @type list of str
         @param gList global variables filter
@@ -90,7 +93,7 @@
                 itm.setCheckState(Qt.CheckState.Unchecked)
             else:
                 itm.setCheckState(Qt.CheckState.Checked)
-        
+
         for row in range(self.globalsList.count()):
             itm = self.globalsList.item(row)
             if itm.data(Qt.ItemDataRole.UserRole) in gList:
@@ -101,7 +104,7 @@
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.defaultButton:
--- a/src/eric7/Debugger/VariablesViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/VariablesViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,12 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    Qt, QAbstractItemModel, QModelIndex, QCoreApplication,
-    QSortFilterProxyModel, pyqtSignal
+    Qt,
+    QAbstractItemModel,
+    QModelIndex,
+    QCoreApplication,
+    QSortFilterProxyModel,
+    pyqtSignal,
 )
 from PyQt6.QtGui import QBrush, QFontMetrics
 from PyQt6.QtWidgets import QTreeView, QAbstractItemView, QToolTip, QMenu
@@ -32,17 +36,17 @@
     """
     Class implementing the data structure for all variable items.
     """
+
     # Initialize regular expression for unprintable strings
     rx_nonprintable = re.compile(r"""(\\x\d\d)+""")
-    
+
     noOfItemsStr = QCoreApplication.translate("VariablesViewer", "{0} items")
     unsized = QCoreApplication.translate("VariablesViewer", "unsized")
-    
-    def __init__(self, parent, dvar, indicator, dtype, hasChildren, length,
-                 dvalue):
+
+    def __init__(self, parent, dvar, indicator, dtype, hasChildren, length, dvalue):
         """
         Constructor
-        
+
         @param parent reference to the parent item
         @type VariableItem
         @param dvar variable name
@@ -69,34 +73,34 @@
         self.populated = False
         # Indicator that item was at least once fully populated
         self.wasPopulated = False
-        
+
         self.children = []
         # Flag to prevent endless reloading of current item while waiting on
         # a response from debugger
         self.pendigFetch = False
-        
+
         # Set of child items, which are displayed the first time or changed
         self.newItems = set()
         self.changedItems = set()
         # Name including its ID if it's a dict, set, etc.
         self.nameWithId = dvar
-        
-        self.name = ''
-        self.sort = ''
+
+        self.name = ""
+        self.sort = ""
         vtype = ConfigVarTypeDispStrings.get(dtype, dtype)
         self.type = QCoreApplication.translate("VariablesViewer", vtype)
         self.indicator = indicator
         self.value = dvalue
         self.valueShort = None
-        self.tooltip = ''
-        
+        self.tooltip = ""
+
         self.__getName(dvar)
         self.__getValue(dtype, dvalue, indicator, length)
-    
+
     def __getName(self, dvar):
         """
         Private method to extract the variable name.
-        
+
         @param dvar name of variable maybe with ID
         @type str
         """
@@ -108,7 +112,7 @@
             dvar = str(dvar)
         except ValueError:
             pass
-        
+
         self.name = dvar
         try:
             # Convert numbers to strings with preceding zeros
@@ -116,14 +120,14 @@
             self.sort = "{0:06}".format(asInt)
         except ValueError:
             self.sort = dvar.lower()
-    
+
     def __getValue(self, dtype, dvalue, indicator, length):
         """
         Private method to process the variables value.
-        
+
         Define and limit value, set tooltip text. If type is known to have
         children, the corresponding flag is set.
-        
+
         @param dtype type string
         @type str
         @param dvalue value of variable encoded as utf-8
@@ -136,57 +140,58 @@
         """
         length_code = length
         if isinstance(length, str):
-            length = int(length.split('x')[0])
-        
+            length = int(length.split("x")[0])
+
         if indicator and length > -2:
             self.childCount = max(0, length)  # Update count if array
-            if dtype == 'numpy.ndarray' and length == -1:
+            if dtype == "numpy.ndarray" and length == -1:
                 self.value = VariableItem.unsized
             else:
                 self.value = VariableItem.noOfItemsStr.format(length_code)
-        
-        if dtype != 'str':
+
+        if dtype != "str":
             self.valueShort = self.value
             self.tooltip = str(self.value)[:256]
             return
-        
+
         if VariableItem.rx_nonprintable.search(dvalue) is None:
             with contextlib.suppress(Exception):
                 dvalue = ast.literal_eval(dvalue)
-        
+
         dvalue = str(dvalue)
         self.value = dvalue
-        
-        if len(dvalue) > 2048:     # 2 kB
+
+        if len(dvalue) > 2048:  # 2 kB
             self.tooltip = dvalue[:2048]
             dvalue = QCoreApplication.translate(
-                "VariableItem", "<double click to show value>")
+                "VariableItem", "<double click to show value>"
+            )
         else:
             self.tooltip = dvalue
-        
+
         lines = dvalue[:2048].splitlines()
         if len(lines) > 1:
             # only show the first non-empty line;
             # indicate skipped lines by <...> at the
             # beginning and/or end
             index = 0
-            while index < len(lines) - 1 and lines[index].strip(' \t') == "":
+            while index < len(lines) - 1 and lines[index].strip(" \t") == "":
                 index += 1
-            
+
             dvalue = ""
             if index > 0:
                 dvalue += "<...>"
             dvalue += lines[index]
             if index < len(lines) - 1 or len(dvalue) > 2048:
                 dvalue += "<...>"
-        
+
         self.valueShort = dvalue
-    
+
     @property
     def absolutCount(self):
         """
         Public property to get the total number of children.
-        
+
         @return total number of children
         @rtype int
         """
@@ -196,15 +201,16 @@
 class VariablesModel(QAbstractItemModel):
     """
     Class implementing the data model for QTreeView.
-    
+
     @signal expand trigger QTreeView to expand given index
     """
+
     expand = pyqtSignal(QModelIndex)
-    
+
     def __init__(self, treeView, globalScope):
         """
         Constructor
-        
+
         @param treeView QTreeView showing the data
         @type VariablesViewer
         @param globalScope flag indicating global (True) or local (False)
@@ -214,21 +220,22 @@
         super().__init__()
         self.treeView = treeView
         self.proxyModel = treeView.proxyModel
-        
+
         self.framenr = -1
         self.openItems = []
         self.closedItems = []
-        
+
         visibility = self.tr("Globals") if globalScope else self.tr("Locals")
-        self.rootNode = VariableItem(None, visibility, '', self.tr("Type"),
-                                     True, 0, self.tr("Value"))
-        
+        self.rootNode = VariableItem(
+            None, visibility, "", self.tr("Type"), True, 0, self.tr("Value")
+        )
+
         self.__globalScope = globalScope
-    
+
     def clear(self, reset=False):
         """
         Public method to clear the complete data model.
-        
+
         @param reset flag to clear the expanded keys also
         @type bool
         """
@@ -241,18 +248,18 @@
             self.openItems = []
             self.closedItems = []
         self.endResetModel()
-    
+
     def __findVariable(self, pathlist):
         """
         Private method to get to the given variable.
-        
+
         @param pathlist full path to the variable
         @type list of str
         @return the found variable or None if it doesn't exist
         @rtype VariableItem or None
         """
         node = self.rootNode
-        
+
         for childName in pathlist or []:
             for item in node.children:
                 if item.nameWithId == childName:
@@ -260,13 +267,13 @@
                     break
             else:
                 return None
-        
+
         return node  # __IGNORE_WARNING_M834__
-    
+
     def showVariables(self, vlist, frmnr, pathlist=None):
         """
         Public method to update the data model of variable in pathlist.
-        
+
         @param vlist the list of variables to be displayed. Each
                 list entry is a tuple of three values.
                 <ul>
@@ -287,20 +294,20 @@
             if self.framenr != frmnr:
                 self.clear()
                 self.framenr = frmnr
-        
+
         parent = self.__findVariable(pathlist)
         if parent is None:
             return
-        
+
         parent.pendigFetch = False
-        
+
         if parent == self.rootNode:
             parentIdx = QModelIndex()
             parent.methodCount = len(vlist)
         else:
             row = parent.parent.children.index(parent)
             parentIdx = self.createIndex(row, 0, parent)
-        
+
         if itemStartIndex == -3:
             # Item doesn't exist any more
             parentIdx = self.parent(parentIdx)
@@ -309,7 +316,7 @@
             self.endRemoveRows()
             parent.parent.childCount -= 1
             return
-            
+
         elif itemStartIndex == -2:
             parent.wasPopulated = True
             parent.currentCount = parent.absolutCount
@@ -317,7 +324,7 @@
             # Remove items which are left over at the end of child list
             self.__cleanupParentList(parent, parentIdx)
             return
-            
+
         elif itemStartIndex == -1:
             parent.methodCount = len(vlist)
             idx = max(parent.currentCount, 0)
@@ -326,7 +333,7 @@
         else:
             idx = itemStartIndex
             parent.currentCount = idx + len(vlist)
-        
+
         # Now update the table
         endIndex = idx + len(vlist)
         newChild = None
@@ -337,15 +344,15 @@
                 child = parent.children[idx]
             except IndexError:
                 child = None
-            
+
             # Fetch possible new item
             if not newChild and vlist:
                 newChild = vlist.pop(0)
-                
+
                 # Process parameters of new item
                 newItem = VariableItem(parent, *newChild)
                 sort = newItem.sort
-            
+
             # Append or insert before already existing item
             if child is None or newChild and sort < child.sort:
                 self.beginInsertRows(parentIdx, idx, idx)
@@ -356,11 +363,11 @@
                 else:
                     parent.changedItems.add(newItem)
                 self.endInsertRows()
-                
+
                 idx += 1
                 newChild = None
                 continue
-                
+
             # Check if same name, type and afterwards value
             elif sort == child.sort and child.type == newItem.type:
                 # Check if value has changed
@@ -369,42 +376,42 @@
                     child.valueShort = newItem.valueShort
                     child.tooltip = newItem.tooltip
                     child.nameWithId = newItem.nameWithId
-                    
+
                     child.currentCount = -1
                     child.populated = False
                     child.childCount = newItem.childCount
-                    
+
                     # Highlight item because it has changed
                     parent.changedItems.add(child)
-                    
+
                     changedIndexStart = self.index(idx, 0, parentIdx)
                     changedIndexEnd = self.index(idx, 2, parentIdx)
                     self.dataChanged.emit(changedIndexStart, changedIndexEnd)
-                
+
                 newChild = None
                 idx += 1
                 continue
-            
+
             # Remove obsolete item
             self.beginRemoveRows(parentIdx, idx, idx)
             parent.children.remove(child)
             self.endRemoveRows()
             # idx stay unchanged
             knownChildrenCount -= 1
-        
+
         # Remove items which are left over at the end of child list
         if itemStartIndex == -1:
             parent.wasPopulated = True
             self.__cleanupParentList(parent, parentIdx)
-        
+
         # Request data for any expanded node
         self.getMore()
-    
+
     def __cleanupParentList(self, parent, parentIdx):
         """
         Private method to remove items which are left over at the end of the
         child list.
-        
+
         @param parent to clean up
         @type VariableItem
         @param parentIdx the parent index as QModelIndex
@@ -413,35 +420,34 @@
         end = len(parent.children)
         if end > parent.absolutCount:
             self.beginRemoveRows(parentIdx, parent.absolutCount, end)
-            del parent.children[parent.absolutCount:]
+            del parent.children[parent.absolutCount :]
             self.endRemoveRows()
-    
+
     def resetModifiedMarker(self, parentIdx=QModelIndex(), pathlist=()):
         """
         Public method to remove the modified marker from changed items.
-        
+
         @param parentIdx item to reset marker
         @type QModelIndex
         @param pathlist full path to the variable
         @type list of str
         """
-        parent = (parentIdx.internalPointer() if parentIdx.isValid()
-                  else self.rootNode)
-        
+        parent = parentIdx.internalPointer() if parentIdx.isValid() else self.rootNode
+
         parent.newItems.clear()
         parent.changedItems.clear()
-        
+
         pll = len(pathlist)
         posPaths = {x for x in self.openItems if len(x) > pll}
         posPaths |= {x for x in self.closedItems if len(x) > pll}
         posPaths = {x[pll] for x in posPaths if x[:pll] == pathlist}
-        
+
         if posPaths:
             for child in parent.children:
                 if (
-                    child.hasChildren and
-                    child.nameWithId in posPaths and
-                    child.currentCount >= 0
+                    child.hasChildren
+                    and child.nameWithId in posPaths
+                    and child.currentCount >= 0
                 ):
                     # Discard loaded elements and refresh if still expanded
                     child.currentCount = -1
@@ -449,10 +455,11 @@
                     row = parent.children.index(child)
                     newParentIdx = self.index(row, 0, parentIdx)
                     self.resetModifiedMarker(
-                        newParentIdx, pathlist + (child.nameWithId,))
-        
+                        newParentIdx, pathlist + (child.nameWithId,)
+                    )
+
         self.closedItems = []
-        
+
         # Little quirk: Refresh all visible items to clear the changed marker
         if parentIdx == QModelIndex():
             self.rootNode.currentCount = -1
@@ -460,35 +467,35 @@
             idxStart = self.index(0, 0, QModelIndex())
             idxEnd = self.index(0, 2, QModelIndex())
             self.dataChanged.emit(idxStart, idxEnd)
-    
+
     def columnCount(self, parent=QModelIndex()):
         """
         Public method to get the column count.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return number of columns
         @rtype int
         """
         return 3
-    
+
     def rowCount(self, parent=QModelIndex()):
         """
         Public method to get the row count.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return number of rows
         @rtype int
         """
         node = parent.internalPointer() if parent.isValid() else self.rootNode
-        
+
         return len(node.children)
-    
+
     def flags(self, index):
         """
         Public method to get the item flags.
-        
+
         @param index of item
         @type QModelIndex
         @return item flags
@@ -498,11 +505,11 @@
             return Qt.ItemFlag.NoItemFlags
 
         return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
-    
+
     def hasChildren(self, parent=QModelIndex()):
         """
         Public method to get a flag if parent has children.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return flag indicating parent has children
@@ -510,13 +517,13 @@
         """
         if not parent.isValid():
             return self.rootNode.children != []
-        
+
         return parent.internalPointer().hasChildren
-    
+
     def index(self, row, column, parent=QModelIndex()):
         """
         Public method to get the index of item at row:column of parent.
-        
+
         @param row number of rows
         @type int
         @param column number of columns
@@ -528,15 +535,15 @@
         """
         if not self.hasIndex(row, column, parent):
             return QModelIndex()
-        
+
         node = parent.internalPointer() if parent.isValid() else self.rootNode
-        
+
         return self.createIndex(row, column, node.children[row])
-    
+
     def parent(self, child):
         """
         Public method to get the parent of the given child.
-        
+
         @param child the model child node
         @type QModelIndex
         @return new model index for parent
@@ -548,19 +555,19 @@
         childNode = child.internalPointer()
         if childNode == self.rootNode:
             return QModelIndex()
-        
+
         parentNode = childNode.parent
-        
+
         if parentNode == self.rootNode:
             return QModelIndex()
-        
+
         row = parentNode.parent.children.index(parentNode)
         return self.createIndex(row, 0, parentNode)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method get the role data of item.
-        
+
         @param index the model index
         @type QModelIndex
         @param role the requested data role
@@ -570,13 +577,11 @@
         """
         if not index.isValid() or index.row() < 0:
             return None
-        
+
         node = index.internalPointer()
         column = index.column()
-        
-        if role in (
-            Qt.ItemDataRole.DisplayRole, SORT_ROLE, Qt.ItemDataRole.EditRole
-        ):
+
+        if role in (Qt.ItemDataRole.DisplayRole, SORT_ROLE, Qt.ItemDataRole.EditRole):
             try:
                 if column == 0:
                     # Sort first column with values from third column
@@ -584,20 +589,16 @@
                         return node.sort
                     return node.name + node.indicator
                 else:
-                    return {
-                        1: node.valueShort,
-                        2: node.type,
-                        3: node.sort
-                    }.get(column)
+                    return {1: node.valueShort, 2: node.type, 3: node.sort}.get(column)
             except AttributeError:
-                return ('None', '', '', '')[column]
-        
+                return ("None", "", "", "")[column]
+
         elif role == Qt.ItemDataRole.BackgroundRole:
             if node in node.parent.changedItems:
                 return self.__bgColorChanged
             elif node in node.parent.newItems:
                 return self.__bgColorNew
-        
+
         elif role == Qt.ItemDataRole.ToolTipRole:
             if column == 0:
                 tooltip = node.name + node.indicator
@@ -612,7 +613,7 @@
 
             if Qt.mightBeRichText(tooltip):
                 tooltip = Utilities.html_encode(tooltip)
-            
+
             if column == 0:
                 indentation = self.treeView.indentation()
                 indentCount = 0
@@ -620,7 +621,7 @@
                 while currentNode.parent:
                     indentCount += 1
                     currentNode = currentNode.parent
-                
+
                 indentation *= indentCount
             else:
                 indentation = 0
@@ -636,14 +637,13 @@
                 return tooltip
             else:
                 QToolTip.hideText()
-        
+
         return None
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method get the header names.
-        
+
         @param section the header section (row/column)
         @type int
         @param orientation the header's orientation
@@ -654,22 +654,22 @@
         @rtype str or None
         """
         if (
-            role != Qt.ItemDataRole.DisplayRole or
-            orientation != Qt.Orientation.Horizontal
+            role != Qt.ItemDataRole.DisplayRole
+            or orientation != Qt.Orientation.Horizontal
         ):
             return None
-        
+
         return {
             0: self.rootNode.name,
             1: self.rootNode.value,
             2: self.rootNode.type,
-            3: self.rootNode.sort
+            3: self.rootNode.sort,
         }.get(section)
-    
+
     def __findPendingItem(self, parent=None, pathlist=()):
         """
         Private method to find the next item to request data from debugger.
-        
+
         @param parent the model parent
         @type VariableItem
         @param pathlist full path to the variable
@@ -679,11 +679,11 @@
         """
         if parent is None:
             parent = self.rootNode
-        
+
         for child in parent.children:
             if not child.hasChildren:
                 continue
-            
+
             if pathlist + (child.nameWithId,) in self.openItems:
                 if child.populated:
                     index = None
@@ -691,20 +691,21 @@
                     idx = parent.children.index(child)
                     index = self.createIndex(idx, 0, child)
                     self.expand.emit(index)
-                
+
                 if child.currentCount < 0:
                     return index
-                
+
                 possibleIndex = self.__findPendingItem(
-                    child, pathlist + (child.nameWithId,))
-                
+                    child, pathlist + (child.nameWithId,)
+                )
+
                 if (possibleIndex or index) is None:
                     continue
-                
+
                 return possibleIndex or index
-        
+
         return None
-    
+
     def getMore(self):
         """
         Public method to fetch the next variable from debugger.
@@ -713,7 +714,7 @@
         item = self.__findPendingItem()
         if not item or not item.isValid():
             return
-        
+
         # step 2: check if data has to be retrieved
         node = item.internalPointer()
         lastVisibleItem = self.index(node.currentCount - 1, 0, item)
@@ -721,21 +722,26 @@
         rect = self.treeView.visualRect(lastVisibleItem)
         if rect.y() > self.treeView.height() or node.pendigFetch:
             return
-        
+
         node.pendigFetch = True
         # step 3: get a pathlist up to the requested variable
         pathlist = self.__buildTreePath(node)
         # step 4: request the variable from the debugger
-        variablesFilter = ericApp().getObject("DebugUI").variablesFilter(
-            self.__globalScope)
+        variablesFilter = (
+            ericApp().getObject("DebugUI").variablesFilter(self.__globalScope)
+        )
         ericApp().getObject("DebugServer").remoteClientVariable(
             ericApp().getObject("DebugUI").getSelectedDebuggerId(),
-            self.__globalScope, variablesFilter, pathlist, self.framenr)
-    
+            self.__globalScope,
+            variablesFilter,
+            pathlist,
+            self.framenr,
+        )
+
     def setExpanded(self, index, state):
         """
         Public method to set the expanded state of item.
-        
+
         @param index item to change expanded state
         @type QModelIndex
         @param state state of the item
@@ -753,34 +759,33 @@
             if pathlist in self.openItems:
                 self.openItems.remove(pathlist)
             self.closedItems.append(pathlist)
-    
+
     def __buildTreePath(self, parent):
         """
         Private method to build up a path from the root to parent.
-        
+
         @param parent item to build the path for
         @type VariableItem
         @return list of names denoting the path from the root
         @rtype tuple of str
         """
         pathlist = []
-        
+
         # build up a path from the top to the item
         while parent.parent:
             pathlist.append(parent.nameWithId)
             parent = parent.parent
-        
+
         pathlist.reverse()
         return tuple(pathlist)
-    
+
     def handlePreferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
         """
         self.__bgColorNew = QBrush(Preferences.getDebugger("BgColorNew"))
-        self.__bgColorChanged = QBrush(
-            Preferences.getDebugger("BgColorChanged"))
-        
+        self.__bgColorChanged = QBrush(Preferences.getDebugger("BgColorChanged"))
+
         idxStart = self.index(0, 0, QModelIndex())
         idxEnd = self.index(0, 2, QModelIndex())
         self.dataChanged.emit(idxStart, idxEnd)
@@ -790,34 +795,35 @@
     """
     Class for handling the sort operations.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent the parent model index
         @type QModelIndex
         """
         super().__init__(parent)
         self.setSortRole(SORT_ROLE)
-    
+
     def hasChildren(self, parent):
         """
         Public method to get a flag if parent has children.
-        
+
         The given model index has to be transformed to the underlying source
         model to get the correct result.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return flag if parent has children
         @rtype bool
         """
         return self.sourceModel().hasChildren(self.mapToSource(parent))
-    
+
     def setExpanded(self, index, state):
         """
         Public slot to get a flag if parent has children.
-        
+
         The given model index has to be transformed to the underlying source
         model to get the correct result.
         @param index item to change expanded state
@@ -831,7 +837,7 @@
 class VariablesViewer(QTreeView):
     """
     Class implementing the variables viewer view.
-    
+
     This view is used to display the variables of the program being
     debugged in a tree. Compound types will be shown with
     their main entry first. Once the subtree has been expanded, the
@@ -840,18 +846,19 @@
     was performed on the first column of the tree, otherwise it'll
     popup a dialog showing the variables parameters in a more readable
     form. This is especially useful for lengthy strings.
-    
+
     This view has two modes for displaying the global and the local
     variables.
-    
+
     @signal preferencesChanged() to inform model about new background colours
     """
+
     preferencesChanged = pyqtSignal()
-    
+
     def __init__(self, viewer, globalScope, parent=None):
         """
         Constructor
-        
+
         @param viewer reference to the debug viewer object
         @type DebugViewer
         @param globalScope flag indicating global (True) or local (False)
@@ -861,14 +868,14 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__debugViewer = viewer
         self.__globalScope = globalScope
         self.framenr = 0
-        
+
         # Massive performance gain
         self.setUniformRowHeights(True)
-        
+
         # Implements sorting and filtering
         self.proxyModel = VariablesProxyModel()
         # Variable model implements the underlying data model
@@ -877,62 +884,63 @@
         self.setModel(self.proxyModel)
         self.preferencesChanged.connect(self.varModel.handlePreferencesChanged)
         self.preferencesChanged.emit()  # Force initialization of colors
-        
-        self.expanded.connect(
-            lambda idx: self.proxyModel.setExpanded(idx, True))
-        self.collapsed.connect(
-            lambda idx: self.proxyModel.setExpanded(idx, False))
-        
+
+        self.expanded.connect(lambda idx: self.proxyModel.setExpanded(idx, True))
+        self.collapsed.connect(lambda idx: self.proxyModel.setExpanded(idx, False))
+
         self.setExpandsOnDoubleClick(False)
         self.doubleClicked.connect(self.__itemDoubleClicked)
-        
+
         self.varModel.expand.connect(self.__mdlRequestExpand)
-        
+
         self.setSortingEnabled(True)
         self.setAlternatingRowColors(True)
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
-        
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+
         if self.__globalScope:
             self.setWindowTitle(self.tr("Global Variables"))
-            self.setWhatsThis(self.tr(
-                """<b>The Global Variables Viewer Window</b>"""
-                """<p>This window displays the global variables"""
-                """ of the debugged program.</p>"""
-            ))
+            self.setWhatsThis(
+                self.tr(
+                    """<b>The Global Variables Viewer Window</b>"""
+                    """<p>This window displays the global variables"""
+                    """ of the debugged program.</p>"""
+                )
+            )
         else:
             self.setWindowTitle(self.tr("Local Variables"))
-            self.setWhatsThis(self.tr(
-                """<b>The Local Variables Viewer Window</b>"""
-                """<p>This window displays the local variables"""
-                """ of the debugged program.</p>"""
-            ))
-        
+            self.setWhatsThis(
+                self.tr(
+                    """<b>The Local Variables Viewer Window</b>"""
+                    """<p>This window displays the local variables"""
+                    """ of the debugged program.</p>"""
+                )
+            )
+
         header = self.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(True)
-        
+
         try:
             header.setSectionsClickable(True)
         except Exception:
             header.setClickable(True)
-        
-        header.resizeSection(0, 130)    # variable column
-        header.resizeSection(1, 180)    # value column
-        header.resizeSection(2, 50)     # type column
-        
+
+        header.resizeSection(0, 130)  # variable column
+        header.resizeSection(1, 180)  # value column
+        header.resizeSection(2, 50)  # type column
+
         header.sortIndicatorChanged.connect(lambda *x: self.varModel.getMore())
-        
+
         self.__createPopupMenus()
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
-        
+
         self.resortEnabled = True
-    
+
     def showVariables(self, vlist, frmnr):
         """
         Public method to show variables in a list.
-        
+
         @param vlist the list of variables to be displayed. Each
                 list entry is a tuple of three values.
                 <ul>
@@ -946,11 +954,11 @@
         """
         self.varModel.resetModifiedMarker()
         self.varModel.showVariables(vlist, frmnr)
-    
+
     def showVariable(self, vlist):
         """
         Public method to show variables in a list.
-        
+
         @param vlist the list of subitems to be displayed.
                 The first element gives the path of the
                 parent variable. Each other list entry is
@@ -963,37 +971,37 @@
         @type list
         """
         self.varModel.showVariables(vlist[1:], 0, vlist[0])
-    
+
     def handleResetUI(self):
         """
         Public method to reset the VariablesViewer.
         """
         self.varModel.clear(True)
-    
+
     def verticalScrollbarValueChanged(self, value):
         """
         Public slot informing about the scrollbar change.
-        
+
         @param value current value of the vertical scrollbar
         @type int
         """
         self.varModel.getMore()
         super().verticalScrollbarValueChanged(value)
-    
+
     def resizeEvent(self, event):
         """
         Protected slot informing about the widget size change.
-        
+
         @param event information
         @type QResizeEvent
         """
         self.varModel.getMore()
         super().resizeEvent(event)
-    
+
     def __itemDoubleClicked(self, index):
         """
         Private method called if an item was double clicked.
-        
+
         @param index the double clicked item
         @type QModelIndex
         """
@@ -1003,17 +1011,17 @@
             self.setExpanded(index, not state)
         else:
             self.__showVariableDetails(index)
-    
+
     def __mdlRequestExpand(self, modelIndex):
         """
         Private method to inform the view about items to be expand.
-        
+
         @param modelIndex the model index
         @type QModelIndex
         """
         index = self.proxyModel.mapFromSource(modelIndex)
         self.expand(index)
-    
+
     def __createPopupMenus(self):
         """
         Private method to generate the popup menus.
@@ -1028,20 +1036,20 @@
         self.menu.addAction(self.tr("Refresh"), self.__refreshView)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Configure..."), self.__configure)
-        self.menu.addAction(self.tr("Variables Type Filter..."),
-                            self.__configureFilter)
-        
+        self.menu.addAction(self.tr("Variables Type Filter..."), self.__configureFilter)
+
         self.backMenu = QMenu()
         self.backMenu.addAction(self.tr("Refresh"), self.__refreshView)
         self.backMenu.addSeparator()
         self.backMenu.addAction(self.tr("Configure..."), self.__configure)
-        self.backMenu.addAction(self.tr("Variables Type Filter..."),
-                                self.__configureFilter)
-    
+        self.backMenu.addAction(
+            self.tr("Variables Type Filter..."), self.__configureFilter
+        )
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         """
@@ -1050,7 +1058,7 @@
             self.menu.popup(gcoord)
         else:
             self.backMenu.popup(gcoord)
-    
+
     def __expandChildren(self):
         """
         Private slot to expand all child items of current parent.
@@ -1063,7 +1071,7 @@
                 idx = self.varModel.createIndex(row, 0, child)
                 idx = self.proxyModel.mapFromSource(idx)
                 self.expand(idx)
-    
+
     def __collapseChildren(self):
         """
         Private slot to collapse all child items of current parent.
@@ -1076,7 +1084,7 @@
             idx = self.proxyModel.mapFromSource(idx)
             if self.isExpanded(idx):
                 self.collapse(idx)
-    
+
     def __refreshView(self):
         """
         Private slot to refresh the view.
@@ -1085,42 +1093,42 @@
             self.__debugViewer.setGlobalsFilter()
         else:
             self.__debugViewer.setLocalsFilter()
-    
+
     def __showDetails(self):
         """
         Private slot to show details about the selected variable.
         """
         idx = self.currentIndex()
         self.__showVariableDetails(idx)
-    
+
     def __showVariableDetails(self, index):
         """
         Private method to show details about a variable.
-        
+
         @param index reference to the variable item
         @type QModelIndex
         """
         node = self.proxyModel.mapToSource(index).internalPointer()
-        
+
         val = node.value
         vtype = node.type
         name = node.name
-        
+
         par = node.parent
         nlist = [name]
-        
+
         # build up the fully qualified name
         while par.parent is not None:
             pname = par.name
             if par.indicator:
                 if nlist[0].endswith("."):
-                    nlist[0] = '[{0}].'.format(nlist[0][:-1])
+                    nlist[0] = "[{0}].".format(nlist[0][:-1])
                 else:
-                    nlist[0] = '[{0}]'.format(nlist[0])
+                    nlist[0] = "[{0}]".format(nlist[0])
                 nlist.insert(0, pname)
             else:
                 if par.type == "django.MultiValueDict":
-                    nlist[0] = 'getlist({0})'.format(nlist[0])
+                    nlist[0] = "getlist({0})".format(nlist[0])
                 elif par.type == "numpy.ndarray":
                     if nlist and nlist[0][0].isalpha():
                         if nlist[0] in ["min", "max", "mean"]:
@@ -1129,27 +1137,28 @@
                             nlist[0] = ".{0}".format(nlist[0])
                     nlist.insert(0, pname)
                 else:
-                    nlist.insert(0, '{0}.'.format(pname))
+                    nlist.insert(0, "{0}.".format(pname))
             par = par.parent
-        
-        name = ''.join(nlist)
+
+        name = "".join(nlist)
         # now show the dialog
         from .VariableDetailDialog import VariableDetailDialog
+
         dlg = VariableDetailDialog(name, vtype, val)
         dlg.exec()
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "debuggerGeneralPage")
-    
+        ericApp().getObject("UserInterface").showPreferences("debuggerGeneralPage")
+
     def __configureFilter(self):
         """
         Private method to open the variables filter dialog.
         """
         ericApp().getObject("DebugUI").dbgFilterAct.triggered.emit()
 
+
 #
 # eflag: noqa = M822
--- a/src/eric7/Debugger/WatchPointModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/WatchPointModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,48 +16,50 @@
 class WatchPointModel(QAbstractItemModel):
     """
     Class implementing a custom model for watch expressions.
-    
+
     @signal dataAboutToBeChanged(QModelIndex, QModelIndex) emitted to indicate
         a change of the data
     """
+
     dataAboutToBeChanged = pyqtSignal(QModelIndex, QModelIndex)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QObject)
         """
         super().__init__(parent)
-        
+
         self.watchpoints = []
         self.header = [
             self.tr("Condition"),
             self.tr("Special"),
-            self.tr('Temporary'),
-            self.tr('Enabled'),
-            self.tr('Ignore Count'),
+            self.tr("Temporary"),
+            self.tr("Enabled"),
+            self.tr("Ignore Count"),
         ]
-        self.alignments = [Qt.AlignmentFlag.AlignLeft,
-                           Qt.AlignmentFlag.AlignLeft,
-                           Qt.AlignmentFlag.AlignHCenter,
-                           Qt.AlignmentFlag.AlignHCenter,
-                           Qt.AlignmentFlag.AlignRight,
-                           ]
-        
+        self.alignments = [
+            Qt.AlignmentFlag.AlignLeft,
+            Qt.AlignmentFlag.AlignLeft,
+            Qt.AlignmentFlag.AlignHCenter,
+            Qt.AlignmentFlag.AlignHCenter,
+            Qt.AlignmentFlag.AlignRight,
+        ]
+
     def columnCount(self, parent=None):
         """
         Public method to get the current column count.
-        
+
         @param parent index of the parent item (QModelIndex) (Unused)
         @return column count (integer)
         """
         return len(self.header)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the current row count.
-        
+
         @param parent index of the parent item (QModelIndex)
         @return row count (integer)
         """
@@ -66,113 +68,102 @@
             return len(self.watchpoints)
         else:
             return 0
-    
+
     def data(self, index, role):
         """
         Public method to get the requested data.
-        
+
         @param index index of the requested data (QModelIndex)
         @param role role of the requested data (Qt.ItemDataRole)
         @return the requested data
         """
         if not index.isValid():
             return None
-        
-        if (
-            role == Qt.ItemDataRole.DisplayRole and
-            index.column() in [0, 1, 4]
-        ):
+
+        if role == Qt.ItemDataRole.DisplayRole and index.column() in [0, 1, 4]:
             return self.watchpoints[index.row()][index.column()]
-        
-        if (
-            role == Qt.ItemDataRole.CheckStateRole and
-            index.column() in [2, 3]
-        ):
+
+        if role == Qt.ItemDataRole.CheckStateRole and index.column() in [2, 3]:
             if self.watchpoints[index.row()][index.column()]:
                 return Qt.CheckState.Checked
             else:
                 return Qt.CheckState.Unchecked
-        
-        if (
-            role == Qt.ItemDataRole.ToolTipRole and
-            index.column() in [0, 1]
-        ):
+
+        if role == Qt.ItemDataRole.ToolTipRole and index.column() in [0, 1]:
             return self.watchpoints[index.row()][index.column()]
-        
-        if (
-            role == Qt.ItemDataRole.TextAlignmentRole and
-            index.column() < len(self.alignments)
+
+        if role == Qt.ItemDataRole.TextAlignmentRole and index.column() < len(
+            self.alignments
         ):
             return self.alignments[index.column()].value
-        
+
         return None
-    
+
     def flags(self, index):
         """
         Public method to get item flags.
-        
+
         @param index index of the requested flags (QModelIndex)
         @return item flags for the given index (Qt.ItemFlags)
         """
         if not index.isValid():
             return Qt.ItemFlag.ItemIsEnabled
-        
+
         return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get header data.
-        
+
         @param section section number of the requested header data (integer)
         @param orientation orientation of the header (Qt.Orientation)
         @param role role of the requested data (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             if section >= len(self.header):
                 return ""
             else:
                 return self.header[section]
-        
+
         return None
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number for the index (integer)
         @param column column number for the index (integer)
         @param parent index of the parent item (QModelIndex)
         @return requested index (QModelIndex)
         """
         if (
-            (parent and parent.isValid()) or
-            row < 0 or
-            row >= len(self.watchpoints) or
-            column < 0 or
-            column >= len(self.header)
+            (parent and parent.isValid())
+            or row < 0
+            or row >= len(self.watchpoints)
+            or column < 0
+            or column >= len(self.header)
         ):
             return QModelIndex()
-        
+
         return self.createIndex(row, column, self.watchpoints[row])
 
     def parent(self, index):
         """
         Public method to get the parent index.
-        
+
         @param index index of item to get parent (QModelIndex)
         @return index of parent (QModelIndex)
         """
         return QModelIndex()
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check for the presence of child items.
-        
+
         @param parent index of parent item (QModelIndex)
         @return flag indicating the presence of child items (boolean)
         """
@@ -180,13 +171,13 @@
             return len(self.watchpoints) > 0
         else:
             return False
-    
+
     ###########################################################################
-    
+
     def addWatchPoint(self, cond, special, properties):
         """
         Public method to add a new watch expression to the list.
-        
+
         @param cond expression of the watch expression
         @type str
         @param special special condition of the watch expression
@@ -200,11 +191,11 @@
         self.beginInsertRows(QModelIndex(), cnt, cnt)
         self.watchpoints.append(wp)
         self.endInsertRows()
-    
+
     def addWatchPoints(self, watchpoints):
         """
         Public method to add multiple watch expressions to the list.
-        
+
         @param watchpoints list of watch expressions with expression, special
             condition, temporary flag, enabled flag and ignore count each
         @type list of (str, str, bool, bool, int)
@@ -213,11 +204,11 @@
         self.beginInsertRows(QModelIndex(), cnt, cnt + len(watchpoints) - 1)
         self.watchpoints += watchpoints
         self.endInsertRows()
-    
+
     def setWatchPointByIndex(self, index, cond, special, properties):
         """
         Public method to set the values of a watch expression given by index.
-        
+
         @param index index of the watch expression (QModelIndex)
         @param cond expression of the watch expression (string)
         @param special special condition of the watch expression (string)
@@ -229,7 +220,8 @@
             row = index.row()
             index1 = self.createIndex(row, 0, self.watchpoints[row])
             index2 = self.createIndex(
-                row, len(self.watchpoints[row]) - 1, self.watchpoints[row])
+                row, len(self.watchpoints[row]) - 1, self.watchpoints[row]
+            )
             self.dataAboutToBeChanged.emit(index1, index2)
             self.watchpoints[row] = [cond, special] + list(properties)
             self.dataChanged.emit(index1, index2)
@@ -238,7 +230,7 @@
         """
         Public method to set the enabled state of a watch expression given by
         index.
-        
+
         @param index index of the watch expression (QModelIndex)
         @param enabled flag giving the enabled state (boolean)
         """
@@ -249,11 +241,11 @@
             self.dataAboutToBeChanged.emit(index1, index1)
             self.watchpoints[row][col] = enabled
             self.dataChanged.emit(index1, index1)
-    
+
     def deleteWatchPointByIndex(self, index):
         """
         Public method to set the values of a watch expression given by index.
-        
+
         @param index index of the watch expression (QModelIndex)
         """
         if index.isValid():
@@ -266,7 +258,7 @@
         """
         Public method to delete a list of watch expressions given by their
         indexes.
-        
+
         @param idxList list of watch expression indexes (list of QModelIndex)
         """
         rows = []
@@ -292,7 +284,7 @@
     def getWatchPointByIndex(self, index):
         """
         Public method to get the values of a watch expression given by index.
-        
+
         @param index index of the watch expression (QModelIndex)
         @return watch expression (list of six values (expression,
             special condition, temporary flag, enabled flag, ignore count))
@@ -302,21 +294,21 @@
             return self.watchpoints[index.row()][:]  # return a copy
         else:
             return []
-    
+
     def getAllWatchpoints(self):
         """
         Public method to get the list of watchpoints.
-        
+
         @return list of watchpoints
         @rtype list of list of [str, str, bool, bool, int]
         """
         return copy.deepcopy(self.watchpoints)
-    
+
     def getWatchPointIndex(self, cond, special=""):
         """
         Public method to get the index of a watch expression given by
         expression.
-        
+
         @param cond expression of the watch expression (string)
         @param special special condition of the watch expression (string)
         @return index (QModelIndex)
@@ -327,5 +319,5 @@
                 if special and wp[1] != special:
                     continue
                 return self.createIndex(row, 0, self.watchpoints[row])
-        
+
         return QModelIndex()
--- a/src/eric7/Debugger/WatchPointViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Debugger/WatchPointViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,12 +7,8 @@
 Module implementing the watch expression viewer widget.
 """
 
-from PyQt6.QtCore import (
-    Qt, QModelIndex, QItemSelectionModel, QSortFilterProxyModel
-)
-from PyQt6.QtWidgets import (
-    QTreeView, QAbstractItemView, QMenu, QHeaderView, QDialog
-)
+from PyQt6.QtCore import Qt, QModelIndex, QItemSelectionModel, QSortFilterProxyModel
+from PyQt6.QtWidgets import QTreeView, QAbstractItemView, QMenu, QHeaderView, QDialog
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox
@@ -23,66 +19,65 @@
 class WatchPointViewer(QTreeView):
     """
     Class implementing the watch expression viewer widget.
-    
+
     Watch expressions will be shown with all their details. They can be
     modified through the context menu of this widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent the parent (QWidget)
         """
         super().__init__(parent)
         self.setObjectName("WatchExpressionViewer")
-        
+
         self.__model = None
-        
+
         self.setItemsExpandable(False)
         self.setRootIsDecorated(False)
         self.setAlternatingRowColors(True)
-        self.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
-        
+        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+
         self.setWindowTitle(self.tr("Watchpoints"))
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.doubleClicked.connect(self.__doubleClicked)
-        
+
         self.__createPopupMenus()
-        
+
     def setModel(self, model):
         """
         Public slot to set the watch expression model.
-        
+
         @param model reference to the watch expression model (WatchPointModel)
         """
         self.__model = model
-        
+
         self.sortingModel = QSortFilterProxyModel()
         self.sortingModel.setDynamicSortFilter(True)
         self.sortingModel.setSourceModel(self.__model)
         super().setModel(self.sortingModel)
-        
+
         header = self.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(True)
         header.setSectionsClickable(True)
-        
+
         self.setSortingEnabled(True)
-        
+
         self.__layoutDisplay()
-        
+
     def __layoutDisplay(self):
         """
         Private slot to perform a layout operation.
         """
         self.__resizeColumns()
         self.__resort()
-        
+
     def __resizeColumns(self):
         """
         Private slot to resize the view when items get added, edited or
@@ -90,51 +85,56 @@
         """
         self.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.header().setStretchLastSection(True)
-    
+
     def __resort(self):
         """
         Private slot to resort the tree.
         """
-        self.model().sort(self.header().sortIndicatorSection(),
-                          self.header().sortIndicatorOrder())
-        
+        self.model().sort(
+            self.header().sortIndicatorSection(), self.header().sortIndicatorOrder()
+        )
+
     def __toSourceIndex(self, index):
         """
         Private slot to convert an index to a source index.
-        
+
         @param index index to be converted (QModelIndex)
         @return mapped index (QModelIndex)
         """
         return self.sortingModel.mapToSource(index)
-        
+
     def __fromSourceIndex(self, sindex):
         """
         Private slot to convert a source index to an index.
-        
+
         @param sindex source index to be converted (QModelIndex)
         @return mapped index (QModelIndex)
         """
         return self.sortingModel.mapFromSource(sindex)
-        
+
     def __setRowSelected(self, index, selected=True):
         """
         Private slot to select a complete row.
-        
+
         @param index index determining the row to be selected (QModelIndex)
         @param selected flag indicating the action (bool)
         """
         if not index.isValid():
             return
-        
+
         flags = (
-            (QItemSelectionModel.SelectionFlag.ClearAndSelect |
-             QItemSelectionModel.SelectionFlag.Rows)
-            if selected else
-            (QItemSelectionModel.SelectionFlag.Deselect |
-             QItemSelectionModel.SelectionFlag.Rows)
+            (
+                QItemSelectionModel.SelectionFlag.ClearAndSelect
+                | QItemSelectionModel.SelectionFlag.Rows
+            )
+            if selected
+            else (
+                QItemSelectionModel.SelectionFlag.Deselect
+                | QItemSelectionModel.SelectionFlag.Rows
+            )
         )
         self.selectionModel().select(index, flags)
-        
+
     def __createPopupMenus(self):
         """
         Private method to generate the popup menus.
@@ -144,16 +144,13 @@
         self.menu.addAction(self.tr("Edit..."), self.__editWatchPoint)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Enable"), self.__enableWatchPoint)
-        self.menu.addAction(self.tr("Enable all"),
-                            self.__enableAllWatchPoints)
+        self.menu.addAction(self.tr("Enable all"), self.__enableAllWatchPoints)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Disable"), self.__disableWatchPoint)
-        self.menu.addAction(self.tr("Disable all"),
-                            self.__disableAllWatchPoints)
+        self.menu.addAction(self.tr("Disable all"), self.__disableAllWatchPoints)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Delete"), self.__deleteWatchPoint)
-        self.menu.addAction(self.tr("Delete all"),
-                            self.__deleteAllWatchPoints)
+        self.menu.addAction(self.tr("Delete all"), self.__deleteAllWatchPoints)
         self.menu.addSeparator()
         self.menu.addAction(self.tr("Configure..."), self.__configure)
 
@@ -161,14 +158,14 @@
         self.backMenu = QMenu()
         self.backMenu.addAction(self.tr("Add"), self.__addWatchPoint)
         self.backMenuActions["EnableAll"] = self.backMenu.addAction(
-            self.tr("Enable all"),
-            self.__enableAllWatchPoints)
+            self.tr("Enable all"), self.__enableAllWatchPoints
+        )
         self.backMenuActions["DisableAll"] = self.backMenu.addAction(
-            self.tr("Disable all"),
-            self.__disableAllWatchPoints)
+            self.tr("Disable all"), self.__disableAllWatchPoints
+        )
         self.backMenuActions["DeleteAll"] = self.backMenu.addAction(
-            self.tr("Delete all"),
-            self.__deleteAllWatchPoints)
+            self.tr("Delete all"), self.__deleteAllWatchPoints
+        )
         self.backMenu.addSeparator()
         self.backMenu.addAction(self.tr("Configure..."), self.__configure)
         self.backMenu.aboutToShow.connect(self.__showBackMenu)
@@ -176,27 +173,27 @@
         self.multiMenu = QMenu()
         self.multiMenu.addAction(self.tr("Add"), self.__addWatchPoint)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Enable selected"),
-                                 self.__enableSelectedWatchPoints)
-        self.multiMenu.addAction(self.tr("Enable all"),
-                                 self.__enableAllWatchPoints)
+        self.multiMenu.addAction(
+            self.tr("Enable selected"), self.__enableSelectedWatchPoints
+        )
+        self.multiMenu.addAction(self.tr("Enable all"), self.__enableAllWatchPoints)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Disable selected"),
-                                 self.__disableSelectedWatchPoints)
-        self.multiMenu.addAction(self.tr("Disable all"),
-                                 self.__disableAllWatchPoints)
+        self.multiMenu.addAction(
+            self.tr("Disable selected"), self.__disableSelectedWatchPoints
+        )
+        self.multiMenu.addAction(self.tr("Disable all"), self.__disableAllWatchPoints)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr("Delete selected"),
-                                 self.__deleteSelectedWatchPoints)
-        self.multiMenu.addAction(self.tr("Delete all"),
-                                 self.__deleteAllWatchPoints)
+        self.multiMenu.addAction(
+            self.tr("Delete selected"), self.__deleteSelectedWatchPoints
+        )
+        self.multiMenu.addAction(self.tr("Delete all"), self.__deleteAllWatchPoints)
         self.multiMenu.addSeparator()
         self.multiMenu.addAction(self.tr("Configure..."), self.__configure)
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         cnt = self.__getSelectedItemsCount()
@@ -212,19 +209,18 @@
             self.menu.popup(coord)
         else:
             self.backMenu.popup(coord)
-    
+
     def __clearSelection(self):
         """
         Private slot to clear the selection.
         """
         for index in self.selectedIndexes():
             self.__setRowSelected(index, False)
-    
-    def __findDuplicates(self, cond, special, showMessage=False,
-                         index=None):
+
+    def __findDuplicates(self, cond, special, showMessage=False, index=None):
         """
         Private method to check, if an entry already exists.
-        
+
         @param cond condition to check (string)
         @param special special condition to check (string)
         @param showMessage flag indicating a message should be shown,
@@ -236,13 +232,11 @@
         if index is None:
             index = QModelIndex()
         idx = self.__model.getWatchPointIndex(cond, special)
-        duplicate = (idx.isValid() and
-                     idx.internalPointer() != index.internalPointer())
+        duplicate = idx.isValid() and idx.internalPointer() != index.internalPointer()
         if showMessage and duplicate:
             if not special:
                 msg = self.tr(
-                    """<p>A watch expression '<b>{0}</b>'"""
-                    """ already exists.</p>"""
+                    """<p>A watch expression '<b>{0}</b>'""" """ already exists.</p>"""
                 ).format(Utilities.html_encode(cond))
             else:
                 msg = self.tr(
@@ -250,30 +244,29 @@
                     """ for the variable <b>{1}</b> already exists.</p>"""
                 ).format(special, Utilities.html_encode(cond))
             EricMessageBox.warning(
-                self,
-                self.tr("Watch expression already exists"),
-                msg)
-        
+                self, self.tr("Watch expression already exists"), msg
+            )
+
         return duplicate
-    
+
     def __addWatchPoint(self):
         """
         Private slot to handle the add watch expression context menu entry.
         """
         from .EditWatchpointDialog import EditWatchpointDialog
+
         dlg = EditWatchpointDialog(("", False, True, 0, ""), self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             cond, temp, enabled, ignorecount, special = dlg.getData()
             if not self.__findDuplicates(cond, special, True):
-                self.__model.addWatchPoint(cond, special,
-                                           (temp, enabled, ignorecount))
+                self.__model.addWatchPoint(cond, special, (temp, enabled, ignorecount))
                 self.__resizeColumns()
                 self.__resort()
 
     def __doubleClicked(self, index):
         """
         Private slot to handle the double clicked signal.
-        
+
         @param index index of the entry that was double clicked (QModelIndex)
         """
         if index.isValid():
@@ -286,11 +279,11 @@
         index = self.currentIndex()
         if index.isValid():
             self.__doEditWatchPoint(index)
-    
+
     def __doEditWatchPoint(self, index):
         """
         Private slot to edit a watch expression.
-        
+
         @param index index of watch expression to be edited (QModelIndex)
         """
         sindex = self.__toSourceIndex(index)
@@ -298,24 +291,25 @@
             wp = self.__model.getWatchPointByIndex(sindex)
             if not wp:
                 return
-            
+
             cond, special, temp, enabled, count = wp[:5]
-            
+
             from .EditWatchpointDialog import EditWatchpointDialog
-            dlg = EditWatchpointDialog(
-                (cond, temp, enabled, count, special), self)
+
+            dlg = EditWatchpointDialog((cond, temp, enabled, count, special), self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 cond, temp, enabled, count, special = dlg.getData()
                 if not self.__findDuplicates(cond, special, True, sindex):
                     self.__model.setWatchPointByIndex(
-                        sindex, cond, special, (temp, enabled, count))
+                        sindex, cond, special, (temp, enabled, count)
+                    )
                     self.__resizeColumns()
                     self.__resort()
 
     def __setWpEnabled(self, index, enabled):
         """
         Private method to set the enabled status of a watch expression.
-        
+
         @param index index of watch expression to be enabled/disabled
             (QModelIndex)
         @param enabled flag indicating the enabled status to be set (boolean)
@@ -323,7 +317,7 @@
         sindex = self.__toSourceIndex(index)
         if sindex.isValid():
             self.__model.setWatchPointEnabledByIndex(sindex, enabled)
-        
+
     def __enableWatchPoint(self):
         """
         Private slot to handle the enable watch expression context menu entry.
@@ -396,7 +390,7 @@
         sindex = self.__toSourceIndex(index)
         if sindex.isValid():
             self.__model.deleteWatchPointByIndex(sindex)
-        
+
     def __deleteAllWatchPoints(self):
         """
         Private slot to handle the delete all watch expressions context menu
@@ -432,16 +426,15 @@
     def __getSelectedItemsCount(self):
         """
         Private method to get the count of items selected.
-        
+
         @return count of items selected (integer)
         """
         count = len(self.selectedIndexes()) // (self.__model.columnCount() - 1)
         # column count is 1 greater than selectable
         return count
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "debuggerGeneralPage")
+        ericApp().getObject("UserInterface").showPreferences("debuggerGeneralPage")
--- a/src/eric7/DocumentationTools/APIGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/APIGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,18 +12,19 @@
     """
     Class implementing the builtin documentation generator.
     """
+
     def __init__(self, module):
         """
         Constructor
-        
+
         @param module The information of the parsed Python file.
         """
         self.module = module
-        
+
     def genAPI(self, newStyle, basePackage, includePrivate):
         """
         Public method to generate the API information.
-        
+
         @param newStyle flag indicating the api generation for QScintilla 1.7
             and newer (boolean) (ignored)
         @param basePackage name of the base package (string)
@@ -32,22 +33,22 @@
         @return API information (list of strings)
         """
         self.includePrivate = includePrivate
-        modulePath = self.module.name.split('.')
-        if modulePath[-1] == '__init__':
+        modulePath = self.module.name.split(".")
+        if modulePath[-1] == "__init__":
             del modulePath[-1]
         if basePackage:
             modulePath[0] = basePackage
-        self.moduleName = "{0}.".format('.'.join(modulePath))
+        self.moduleName = "{0}.".format(".".join(modulePath))
         self.api = []
         self.__addGlobalsAPI()
         self.__addClassesAPI()
         self.__addFunctionsAPI()
         return self.api
-        
+
     def genBases(self, includePrivate):
         """
         Public method to generate the base classes information.
-        
+
         @param includePrivate flag indicating to include private classes
             (boolean)
         @return base classes information (dictionary of list of strings)
@@ -57,32 +58,32 @@
         classNames = sorted(self.module.classes.keys())
         for className in classNames:
             if (
-                not self.__isPrivate(self.module.classes[className]) and
-                className not in bases
+                not self.__isPrivate(self.module.classes[className])
+                and className not in bases
             ):
                 bases[className] = [
-                    b for b in self.module.classes[className].super
-                    if b != "object"]
+                    b for b in self.module.classes[className].super if b != "object"
+                ]
         return bases
-        
+
     def __isPrivate(self, obj):
         """
         Private method to check, if an object is considered private.
-        
+
         @param obj reference to the object to be checked
         @return flag indicating, that object is considered private (boolean)
         """
         private = obj.isPrivate() and not self.includePrivate
         return private
-        
+
     def __addGlobalsAPI(self):
         """
         Private method to generate the api section for global variables.
         """
         from QScintilla.Editor import Editor
-        
+
         moduleNameStr = "{0}".format(self.moduleName)
-        
+
         for globalName in sorted(self.module.globals.keys()):
             if not self.__isPrivate(self.module.globals[globalName]):
                 if self.module.globals[globalName].isPublic():
@@ -91,9 +92,10 @@
                     iconId = Editor.AttributeProtectedID
                 else:
                     iconId = Editor.AttributePrivateID
-                self.api.append("{0}{1}?{2:d}".format(
-                    moduleNameStr, globalName, iconId))
-        
+                self.api.append(
+                    "{0}{1}?{2:d}".format(moduleNameStr, globalName, iconId)
+                )
+
     def __addClassesAPI(self):
         """
         Private method to generate the api section for classes.
@@ -103,19 +105,19 @@
             if not self.__isPrivate(self.module.classes[className]):
                 self.__addClassVariablesAPI(className)
                 self.__addMethodsAPI(className)
-        
+
     def __addMethodsAPI(self, className):
         """
         Private method to generate the api section for class methods.
-        
+
         @param className name of the class containing the method (string)
         """
         from QScintilla.Editor import Editor
-        
+
         _class = self.module.classes[className]
         methods = sorted(_class.methods.keys())
-        if '__init__' in methods:
-            methods.remove('__init__')
+        if "__init__" in methods:
+            methods.remove("__init__")
             if _class.isPublic():
                 iconId = Editor.ClassID
             elif _class.isProtected():
@@ -123,10 +125,14 @@
             else:
                 iconId = Editor.ClassPrivateID
             self.api.append(
-                '{0}{1}?{2:d}({3})'.format(
-                    self.moduleName, _class.name, iconId,
-                    ', '.join(_class.methods['__init__'].parameters[1:])))
-            
+                "{0}{1}?{2:d}({3})".format(
+                    self.moduleName,
+                    _class.name,
+                    iconId,
+                    ", ".join(_class.methods["__init__"].parameters[1:]),
+                )
+            )
+
         classNameStr = "{0}{1}.".format(self.moduleName, className)
         for method in methods:
             if not self.__isPrivate(_class.methods[method]):
@@ -137,19 +143,23 @@
                 else:
                     iconId = Editor.MethodPrivateID
                 self.api.append(
-                    '{0}{1}?{2:d}({3})'.format(
-                        classNameStr, method, iconId,
-                        ', '.join(_class.methods[method].parameters[1:])))
-        
+                    "{0}{1}?{2:d}({3})".format(
+                        classNameStr,
+                        method,
+                        iconId,
+                        ", ".join(_class.methods[method].parameters[1:]),
+                    )
+                )
+
     def __addClassVariablesAPI(self, className):
         """
         Private method to generate class api section for class variables.
-        
+
         @param className name of the class containing the class variables
             (string)
         """
         from QScintilla.Editor import Editor
-        
+
         _class = self.module.classes[className]
         classNameStr = "{0}{1}.".format(self.moduleName, className)
         for variable in sorted(_class.globals.keys()):
@@ -160,15 +170,14 @@
                     iconId = Editor.AttributeProtectedID
                 else:
                     iconId = Editor.AttributePrivateID
-                self.api.append('{0}{1}?{2:d}'.format(
-                    classNameStr, variable, iconId))
-        
+                self.api.append("{0}{1}?{2:d}".format(classNameStr, variable, iconId))
+
     def __addFunctionsAPI(self):
         """
         Private method to generate the api section for functions.
         """
         from QScintilla.Editor import Editor
-        
+
         funcNames = sorted(self.module.functions.keys())
         for funcName in funcNames:
             if not self.__isPrivate(self.module.functions[funcName]):
@@ -179,7 +188,10 @@
                 else:
                     iconId = Editor.MethodPrivateID
                 self.api.append(
-                    '{0}{1}?{2:d}({3})'.format(
-                        self.moduleName, self.module.functions[funcName].name,
+                    "{0}{1}?{2:d}({3})".format(
+                        self.moduleName,
+                        self.module.functions[funcName].name,
                         iconId,
-                        ', '.join(self.module.functions[funcName].parameters)))
+                        ", ".join(self.module.functions[funcName].parameters),
+                    )
+                )
--- a/src/eric7/DocumentationTools/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,26 +9,25 @@
 
 # the default colors for the eric documentation generator
 eric7docDefaultColors = {
-    'BodyColor': '#000000',
-    'BodyBgColor': '#FFFFFF',
-    'Level1HeaderColor': '#0000FF',
-    'Level1HeaderBgColor': '#FFFFFF',
-    'Level2HeaderColor': '#FF0000',
-    'Level2HeaderBgColor': '#FFFFFF',
-    'CFColor': '#0000FF',
-    'CFBgColor': '#FFFFFF',
-    'LinkColor': '#0000FF',
+    "BodyColor": "#000000",
+    "BodyBgColor": "#FFFFFF",
+    "Level1HeaderColor": "#0000FF",
+    "Level1HeaderBgColor": "#FFFFFF",
+    "Level2HeaderColor": "#FF0000",
+    "Level2HeaderBgColor": "#FFFFFF",
+    "CFColor": "#0000FF",
+    "CFBgColor": "#FFFFFF",
+    "LinkColor": "#0000FF",
 }
 
 eric7docColorParameterNames = {
-    'BodyColor': 'body-color',
-    'BodyBgColor': 'body-background-color',
-    'Level1HeaderColor': 'l1header-color',
-    'Level1HeaderBgColor': 'l1header-background-color',
-    'Level2HeaderColor': 'l2header-color',
-    'Level2HeaderBgColor': 'l2header-background-color',
-    'CFColor': 'cfheader-color',
-    'CFBgColor': 'cfheader-background-color',
-    'LinkColor': 'link-color',
-
+    "BodyColor": "body-color",
+    "BodyBgColor": "body-background-color",
+    "Level1HeaderColor": "l1header-color",
+    "Level1HeaderBgColor": "l1header-background-color",
+    "Level2HeaderColor": "l2header-color",
+    "Level2HeaderBgColor": "l2header-background-color",
+    "CFColor": "cfheader-color",
+    "CFBgColor": "cfheader-background-color",
+    "LinkColor": "link-color",
 }
--- a/src/eric7/DocumentationTools/IndexGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/IndexGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,27 +21,24 @@
     Class implementing the index generator for the builtin documentation
     generator.
     """
+
     def __init__(self, outputDir):
         """
         Constructor
-        
+
         @param outputDir The output directory for the files
         @type str
         """
         self.outputDir = outputDir
         self.packages = {
-            "00index": {
-                "description": "",
-                "subpackages": {},
-                "modules": {}
-            }
+            "00index": {"description": "", "subpackages": {}, "modules": {}}
         }
         self.remembered = False
-    
+
     def remember(self, file, moduleDocument, basename=""):
         """
         Public method to remember a documentation file.
-        
+
         @param file The filename to be remembered. (string)
         @param moduleDocument The ModuleDocument object containing the
             information for the file.
@@ -52,7 +49,7 @@
         self.remembered = True
         if basename:
             file = file.replace(basename, "")
-            
+
         if "__init__" in file:
             dirName = os.path.dirname(file)
             udir = os.path.dirname(dirName)
@@ -66,28 +63,27 @@
                 elt = self.packages["00index"]
             package = dirName.replace(os.sep, ".")
             elt["subpackages"][package] = moduleDocument.shortDescription()
-                
+
             self.packages[package] = {
                 "description": moduleDocument.description(),
                 "subpackages": {},
-                "modules": {}
+                "modules": {},
             }
-            
+
             if moduleDocument.isEmpty():
                 return
-        
+
         package = os.path.dirname(file).replace(os.sep, ".")
         try:
             elt = self.packages[package]
         except KeyError:
             elt = self.packages["00index"]
-        elt["modules"][moduleDocument.name()] = (
-            moduleDocument.shortDescription())
-    
+        elt["modules"][moduleDocument.name()] = moduleDocument.shortDescription()
+
     def __writeIndex(self, packagename, package, newline=None):
         """
         Private method to generate an index file for a package.
-        
+
         @param packagename The name of the package. (string)
         @param package A dictionary with information about the package.
         @param newline newline character to be used (string)
@@ -99,12 +95,12 @@
         else:
             f = os.path.join(self.outputDir, "index-{0}".format(packagename))
             title = packagename
-        
+
         filename = joinext(f, ".html")
-        
+
         subpackages = ""
         modules = ""
-        
+
         # 1) subpackages
         if package["subpackages"]:
             subpacks = package["subpackages"]
@@ -113,18 +109,20 @@
             for name in names:
                 link = joinext("index-{0}".format(name), ".html")
                 lst.append(
-                    TemplatesListsStyleCSS.indexListEntryTemplate.format(**{
-                        "Description": subpacks[name],
-                        "Name": name.split(".")[-1],
-                        "Link": link,
-                    })
+                    TemplatesListsStyleCSS.indexListEntryTemplate.format(
+                        **{
+                            "Description": subpacks[name],
+                            "Name": name.split(".")[-1],
+                            "Link": link,
+                        }
+                    )
                 )
-            subpackages = (
-                TemplatesListsStyleCSS.indexListPackagesTemplate.format(**{
+            subpackages = TemplatesListsStyleCSS.indexListPackagesTemplate.format(
+                **{
                     "Entries": "".join(lst),
-                })
+                }
             )
-            
+
         # 2) modules
         if package["modules"]:
             mods = package["modules"]
@@ -136,38 +134,42 @@
                 if nam == "__init__":
                     nam = name.split(".")[-2]
                 lst.append(
-                    TemplatesListsStyleCSS.indexListEntryTemplate.format(**{
-                        "Description": mods[name],
-                        "Name": nam,
-                        "Link": link,
-                    })
+                    TemplatesListsStyleCSS.indexListEntryTemplate.format(
+                        **{
+                            "Description": mods[name],
+                            "Name": nam,
+                            "Link": link,
+                        }
+                    )
                 )
-            modules = (
-                TemplatesListsStyleCSS.indexListModulesTemplate.format(**{
+            modules = TemplatesListsStyleCSS.indexListModulesTemplate.format(
+                **{
                     "Entries": "".join(lst),
-                })
+                }
             )
-            
+
         doc = (
-            TemplatesListsStyleCSS.headerTemplate.format(
-                **{"Title": title}
-            ) + TemplatesListsStyleCSS.indexBodyTemplate.format(
-                **{"Title": title,
-                   "Description": package["description"],
-                   "Subpackages": subpackages,
-                   "Modules": modules}
-            ) + TemplatesListsStyleCSS.footerTemplate
+            TemplatesListsStyleCSS.headerTemplate.format(**{"Title": title})
+            + TemplatesListsStyleCSS.indexBodyTemplate.format(
+                **{
+                    "Title": title,
+                    "Description": package["description"],
+                    "Subpackages": subpackages,
+                    "Modules": modules,
+                }
+            )
+            + TemplatesListsStyleCSS.footerTemplate
         )
-    
+
         with open(filename, "w", encoding="utf-8", newline=newline) as f:
             f.write(doc)
-    
+
         return filename
-    
+
     def writeIndices(self, basename="", newline=None):
         """
         Public method to generate all index files.
-        
+
         @param basename The basename of the file hierarchy to be documented.
             The basename is stripped off the filename if it starts with
             the basename.
@@ -176,7 +178,7 @@
         if not self.remembered:
             sys.stderr.write("No index to generate.\n")
             return
-            
+
         if basename:
             basename = basename.replace(os.sep, ".")
             if not basename.endswith("."):
@@ -191,7 +193,7 @@
             else:
                 if out:
                     sys.stdout.write("{0} ok\n".format(out))
-    
+
         sys.stdout.write("Indices written.\n")
         sys.stdout.flush()
         sys.stderr.flush()
--- a/src/eric7/DocumentationTools/ModuleDocumentor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/ModuleDocumentor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,7 +33,9 @@
         [a-zA-Z_] \w*
     )
     [ \t]+ (?P<SignalDescription2> .*)
-    """, re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    """,
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 _event = re.compile(
     r"""
@@ -48,13 +50,16 @@
         [a-zA-Z_] \w*
     )
     [ \t]+ (?P<EventDescription2> .*)
-    """, re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    """,
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 
 class TagError(Exception):
     """
     Exception class raised, if an invalid documentation tag was found.
     """
+
     pass
 
 
@@ -62,78 +67,77 @@
     """
     Class implementing the builtin documentation generator.
     """
+
     def __init__(self, module):
         """
         Constructor
-        
+
         @param module information of the parsed Python file
         @type str
         """
         self.module = module
         self.empty = True
-        
+
         self.keywords = []
         # list of tuples containing the name (string) and
         # the ref (string). The ref is without the filename part.
         self.generated = False
-        
+
     def isEmpty(self):
         """
         Public method to determine, if the module contains any classes or
         functions.
-        
+
         @return Flag indicating an empty module (i.e. __init__.py without
             any contents)
         """
         return self.empty
-        
+
     def name(self):
         """
         Public method used to get the module name.
-        
+
         @return The name of the module. (string)
         """
         return self.module.name
-        
+
     def description(self):
         """
         Public method used to get the description of the module.
-        
+
         @return The description of the module. (string)
         """
         return self.__formatDescription(self.module.description)
-        
+
     def shortDescription(self):
         """
         Public method used to get the short description of the module.
-        
+
         The short description is just the first line of the modules
         description.
-        
+
         @return The short description of the module. (string)
         """
         return self.__getShortDescription(self.module.description)
-        
+
     def genDocument(self):
         """
         Public method to generate the source code documentation.
-        
+
         @return The source code documentation. (string)
         """
         doc = (
-            TemplatesListsStyleCSS.headerTemplate.format(
-                **{'Title': self.module.name}
-            ) +
-            self.__genModuleSection() +
-            TemplatesListsStyleCSS.footerTemplate
+            TemplatesListsStyleCSS.headerTemplate.format(**{"Title": self.module.name})
+            + self.__genModuleSection()
+            + TemplatesListsStyleCSS.footerTemplate
         )
         self.generated = True
         return doc
-        
+
     def __genModuleSection(self):
         """
         Private method to generate the body of the document.
-        
+
         @return The body of the document. (string)
         """
         globalsList = self.__genGlobalsListSection()
@@ -143,46 +147,50 @@
             if self.module.type == RB_SOURCE:
                 rbModulesList = self.__genRbModulesListSection()
                 modBody = TemplatesListsStyleCSS.rbFileTemplate.format(
-                    **{'Module': self.module.name,
-                       'ModuleDescription':
-                        self.__formatDescription(self.module.description),
-                       'GlobalsList': globalsList,
-                       'ClassList': classList,
-                       'RbModulesList': rbModulesList,
-                       'FunctionList': functionList,
-                       })
+                    **{
+                        "Module": self.module.name,
+                        "ModuleDescription": self.__formatDescription(
+                            self.module.description
+                        ),
+                        "GlobalsList": globalsList,
+                        "ClassList": classList,
+                        "RbModulesList": rbModulesList,
+                        "FunctionList": functionList,
+                    }
+                )
             else:
                 modBody = TemplatesListsStyleCSS.moduleTemplate.format(
-                    **{'Module': self.module.name,
-                       'ModuleDescription':
-                        self.__formatDescription(self.module.description),
-                       'GlobalsList': globalsList,
-                       'ClassList': classList,
-                       'FunctionList': functionList,
-                       })
+                    **{
+                        "Module": self.module.name,
+                        "ModuleDescription": self.__formatDescription(
+                            self.module.description
+                        ),
+                        "GlobalsList": globalsList,
+                        "ClassList": classList,
+                        "FunctionList": functionList,
+                    }
+                )
         except TagError as e:
-            sys.stderr.write(
-                "Error processing {0}.\n".format(self.module.file))
+            sys.stderr.write("Error processing {0}.\n".format(self.module.file))
             sys.stderr.write(
-                "Error in tags of description of module {0}.\n".format(
-                    self.module.name))
+                "Error in tags of description of module {0}.\n".format(self.module.name)
+            )
             sys.stderr.write("{0}\n".format(e))
             return ""
-            
+
         classesSection = self.__genClassesSection()
         functionsSection = self.__genFunctionsSection()
         rbModulesSection = (
-            self.__genRbModulesSection()
-            if self.module.type == RB_SOURCE else
-            ""
+            self.__genRbModulesSection() if self.module.type == RB_SOURCE else ""
         )
         return "{0}{1}{2}{3}".format(
-            modBody, classesSection, rbModulesSection, functionsSection)
-        
+            modBody, classesSection, rbModulesSection, functionsSection
+        )
+
     def __genListSection(self, names, sectionDict, kwSuffix=""):
         """
         Private method to generate a list section of the document.
-        
+
         @param names The names to appear in the list. (list of strings)
         @param sectionDict dictionary containing all relevant information
             (dict)
@@ -191,46 +199,58 @@
         """
         lst = []
         for name in names:
-            lst.append(TemplatesListsStyleCSS.listEntryTemplate.format(
-                **{'Link': "{0}".format(name),
-                   'Name': sectionDict[name].name,
-                   'Description':
-                    self.__getShortDescription(sectionDict[name].description),
-                   'Deprecated':
-                    self.__checkDeprecated(sectionDict[name].description) and
-                    TemplatesListsStyleCSS.listEntryDeprecatedTemplate or "",
-                   }))
-            n = ("{0} ({1})".format(name, kwSuffix) if kwSuffix
-                 else "{0}".format(name))
+            lst.append(
+                TemplatesListsStyleCSS.listEntryTemplate.format(
+                    **{
+                        "Link": "{0}".format(name),
+                        "Name": sectionDict[name].name,
+                        "Description": self.__getShortDescription(
+                            sectionDict[name].description
+                        ),
+                        "Deprecated": self.__checkDeprecated(
+                            sectionDict[name].description
+                        )
+                        and TemplatesListsStyleCSS.listEntryDeprecatedTemplate
+                        or "",
+                    }
+                )
+            )
+            n = "{0} ({1})".format(name, kwSuffix) if kwSuffix else "{0}".format(name)
             self.keywords.append((n, "#{0}".format(name)))
-        return ''.join(lst)
-        
+        return "".join(lst)
+
     def __genGlobalsListSection(self, class_=None):
         """
         Private method to generate the section listing all global attributes of
         the module.
-        
+
         @param class_ reference to a class object (Class)
         @return The globals list section. (string)
         """
         attrNames = []
         scope = class_ if class_ is not None else self.module
-        attrNames = sorted(attr for attr in scope.globals.keys()
-                           if not scope.globals[attr].isSignal)
+        attrNames = sorted(
+            attr for attr in scope.globals.keys() if not scope.globals[attr].isSignal
+        )
         s = (
-            ''.join(
-                [TemplatesListsStyleCSS.listEntrySimpleTemplate
-                 .format(**{'Name': name}) for name in attrNames])
-            if attrNames else
-            TemplatesListsStyleCSS.listEntryNoneTemplate
+            "".join(
+                [
+                    TemplatesListsStyleCSS.listEntrySimpleTemplate.format(
+                        **{"Name": name}
+                    )
+                    for name in attrNames
+                ]
+            )
+            if attrNames
+            else TemplatesListsStyleCSS.listEntryNoneTemplate
         )
-        return TemplatesListsStyleCSS.listTemplate.format(**{'Entries': s})
-        
+        return TemplatesListsStyleCSS.listTemplate.format(**{"Entries": s})
+
     def __genClassListSection(self):
         """
         Private method to generate the section listing all classes of the
         module.
-        
+
         @return The classes list section. (string)
         """
         names = sorted(self.module.classes.keys())
@@ -239,13 +259,13 @@
             s = self.__genListSection(names, self.module.classes)
         else:
             s = TemplatesListsStyleCSS.listEntryNoneTemplate
-        return TemplatesListsStyleCSS.listTemplate.format(**{'Entries': s})
-        
+        return TemplatesListsStyleCSS.listTemplate.format(**{"Entries": s})
+
     def __genRbModulesListSection(self):
         """
         Private method to generate the section listing all modules of the file
         (Ruby only).
-        
+
         @return The modules list section. (string)
         """
         names = sorted(self.module.modules.keys())
@@ -254,13 +274,13 @@
             s = self.__genListSection(names, self.module.modules)
         else:
             s = TemplatesListsStyleCSS.listEntryNoneTemplate
-        return TemplatesListsStyleCSS.listTemplate.format(**{'Entries': s})
-        
+        return TemplatesListsStyleCSS.listTemplate.format(**{"Entries": s})
+
     def __genFunctionListSection(self):
         """
         Private method to generate the section listing all functions of the
         module.
-        
+
         @return The functions list section. (string)
         """
         names = sorted(self.module.functions.keys())
@@ -269,13 +289,13 @@
             s = self.__genListSection(names, self.module.functions)
         else:
             s = TemplatesListsStyleCSS.listEntryNoneTemplate
-        return TemplatesListsStyleCSS.listTemplate.format(**{'Entries': s})
-        
+        return TemplatesListsStyleCSS.listTemplate.format(**{"Entries": s})
+
     def __genClassesSection(self):
         """
         Private method to generate the document section with details about
         classes.
-        
+
         @return The classes details section. (string)
         """
         classNames = sorted(self.module.classes.keys())
@@ -283,48 +303,55 @@
         for className in classNames:
             _class = self.module.classes[className]
             supers = _class.super
-            supers = ', '.join(supers) if len(supers) > 0 else "None"
-            
+            supers = ", ".join(supers) if len(supers) > 0 else "None"
+
             globalsList = self.__genGlobalsListSection(_class)
             classMethList, classMethBodies = self.__genMethodSection(
-                _class, className, Function.Class)
+                _class, className, Function.Class
+            )
             methList, methBodies = self.__genMethodSection(
-                _class, className, Function.General)
+                _class, className, Function.General
+            )
             staticMethList, staticMethBodies = self.__genMethodSection(
-                _class, className, Function.Static)
-            
+                _class, className, Function.Static
+            )
+
             try:
                 clsBody = TemplatesListsStyleCSS.classTemplate.format(
-                    **{'Anchor': className,
-                       'Class': _class.name,
-                       'ClassSuper': supers,
-                       'ClassDescription':
-                        self.__formatDescription(_class.description),
-                       'GlobalsList': globalsList,
-                       'ClassMethodList': classMethList,
-                       'MethodList': methList,
-                       'StaticMethodList': staticMethList,
-                       'MethodDetails':
-                        classMethBodies + methBodies + staticMethBodies,
-                       })
+                    **{
+                        "Anchor": className,
+                        "Class": _class.name,
+                        "ClassSuper": supers,
+                        "ClassDescription": self.__formatDescription(
+                            _class.description
+                        ),
+                        "GlobalsList": globalsList,
+                        "ClassMethodList": classMethList,
+                        "MethodList": methList,
+                        "StaticMethodList": staticMethList,
+                        "MethodDetails": classMethBodies
+                        + methBodies
+                        + staticMethBodies,
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
-                    "Error in tags of description of class {0}.\n".format(
-                        className))
+                    "Error in tags of description of class {0}.\n".format(className)
+                )
                 sys.stderr.write("{0}\n".format(e))
                 clsBody = ""
-            
+
             classes.append(clsBody)
-            
-        return ''.join(classes)
-        
-    def __genMethodsListSection(self, names, sectionDict, className, clsName,
-                                includeInit=True):
+
+        return "".join(classes)
+
+    def __genMethodsListSection(
+        self, names, sectionDict, className, clsName, includeInit=True
+    ):
         """
         Private method to generate the methods list section of a class.
-        
+
         @param names names to appear in the list (list of strings)
         @param sectionDict dictionary containing all relevant information
             (dict)
@@ -337,38 +364,55 @@
         lst = []
         if includeInit:
             with contextlib.suppress(KeyError):
-                lst.append(TemplatesListsStyleCSS.listEntryTemplate.format(
-                    **{'Link': "{0}.{1}".format(className, '__init__'),
-                       'Name': clsName,
-                       'Description': self.__getShortDescription(
-                           sectionDict['__init__'].description),
-                       'Deprecated': self.__checkDeprecated(
-                           sectionDict['__init__'].description) and
-                        TemplatesListsStyleCSS.listEntryDeprecatedTemplate or
-                        "",
-                       }))
+                lst.append(
+                    TemplatesListsStyleCSS.listEntryTemplate.format(
+                        **{
+                            "Link": "{0}.{1}".format(className, "__init__"),
+                            "Name": clsName,
+                            "Description": self.__getShortDescription(
+                                sectionDict["__init__"].description
+                            ),
+                            "Deprecated": self.__checkDeprecated(
+                                sectionDict["__init__"].description
+                            )
+                            and TemplatesListsStyleCSS.listEntryDeprecatedTemplate
+                            or "",
+                        }
+                    )
+                )
                 self.keywords.append(
-                    ("{0} (Constructor)".format(className),
-                     "#{0}.{1}".format(className, '__init__')))
-        
+                    (
+                        "{0} (Constructor)".format(className),
+                        "#{0}.{1}".format(className, "__init__"),
+                    )
+                )
+
         for name in names:
-            lst.append(TemplatesListsStyleCSS.listEntryTemplate.format(
-                **{'Link': "{0}.{1}".format(className, name),
-                   'Name': sectionDict[name].name,
-                   'Description':
-                    self.__getShortDescription(sectionDict[name].description),
-                   'Deprecated':
-                    self.__checkDeprecated(sectionDict[name].description) and
-                    TemplatesListsStyleCSS.listEntryDeprecatedTemplate or "",
-                   }))
-            self.keywords.append(("{0}.{1}".format(className, name),
-                                  "#{0}.{1}".format(className, name)))
-        return ''.join(lst)
-        
+            lst.append(
+                TemplatesListsStyleCSS.listEntryTemplate.format(
+                    **{
+                        "Link": "{0}.{1}".format(className, name),
+                        "Name": sectionDict[name].name,
+                        "Description": self.__getShortDescription(
+                            sectionDict[name].description
+                        ),
+                        "Deprecated": self.__checkDeprecated(
+                            sectionDict[name].description
+                        )
+                        and TemplatesListsStyleCSS.listEntryDeprecatedTemplate
+                        or "",
+                    }
+                )
+            )
+            self.keywords.append(
+                ("{0}.{1}".format(className, name), "#{0}.{1}".format(className, name))
+            )
+        return "".join(lst)
+
     def __genMethodSection(self, obj, className, modifierFilter):
         """
         Private method to generate the method details section.
-        
+
         @param obj reference to the object being formatted
         @param className name of the class containing the method (string)
         @param modifierFilter filter value designating the method types
@@ -376,31 +420,34 @@
         """
         methList = []
         methBodies = []
-        methods = sorted(k for k in obj.methods.keys()
-                         if obj.methods[k].modifier == modifierFilter)
-        if '__init__' in methods:
-            methods.remove('__init__')
+        methods = sorted(
+            k for k in obj.methods.keys() if obj.methods[k].modifier == modifierFilter
+        )
+        if "__init__" in methods:
+            methods.remove("__init__")
             try:
                 methBody = TemplatesListsStyleCSS.constructorTemplate.format(
-                    **{'Anchor': className,
-                       'Class': obj.name,
-                       'Method': '__init__',
-                       'MethodDescription':
-                        self.__formatDescription(
-                            obj.methods['__init__'].description),
-                       'Params':
-                        ', '.join(obj.methods['__init__'].parameters[1:]),
-                       })
+                    **{
+                        "Anchor": className,
+                        "Class": obj.name,
+                        "Method": "__init__",
+                        "MethodDescription": self.__formatDescription(
+                            obj.methods["__init__"].description
+                        ),
+                        "Params": ", ".join(obj.methods["__init__"].parameters[1:]),
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
                     "Error in tags of description of method {0}.{1}.\n".format(
-                        className, '__init__'))
+                        className, "__init__"
+                    )
+                )
                 sys.stderr.write("{0}\n".format(e))
                 methBody = ""
             methBodies.append(methBody)
-        
+
         if modifierFilter == Function.Class:
             methodClassifier = " (class method)"
         elif modifierFilter == Function.Static:
@@ -410,39 +457,48 @@
         for method in methods:
             try:
                 methBody = TemplatesListsStyleCSS.methodTemplate.format(
-                    **{'Anchor': className,
-                       'Class': obj.name,
-                       'Method': obj.methods[method].name,
-                       'MethodClassifier': methodClassifier,
-                       'MethodDescription':
-                        self.__formatDescription(
-                            obj.methods[method].description),
-                       'Params': ', '.join(obj.methods[method].parameters[1:]),
-                       })
+                    **{
+                        "Anchor": className,
+                        "Class": obj.name,
+                        "Method": obj.methods[method].name,
+                        "MethodClassifier": methodClassifier,
+                        "MethodDescription": self.__formatDescription(
+                            obj.methods[method].description
+                        ),
+                        "Params": ", ".join(obj.methods[method].parameters[1:]),
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
                     "Error in tags of description of method {0}.{1}.\n".format(
-                        className, method))
+                        className, method
+                    )
+                )
                 sys.stderr.write("{0}\n".format(e))
                 methBody = ""
             methBodies.append(methBody)
-            
+
         methList = self.__genMethodsListSection(
-            methods, obj.methods, className, obj.name,
-            includeInit=modifierFilter == Function.General)
-        
+            methods,
+            obj.methods,
+            className,
+            obj.name,
+            includeInit=modifierFilter == Function.General,
+        )
+
         if not methList:
             methList = TemplatesListsStyleCSS.listEntryNoneTemplate
-        return (TemplatesListsStyleCSS.listTemplate
-                .format(**{'Entries': methList}), ''.join(methBodies))
-        
+        return (
+            TemplatesListsStyleCSS.listTemplate.format(**{"Entries": methList}),
+            "".join(methBodies),
+        )
+
     def __genRbModulesSection(self):
         """
         Private method to generate the document section with details about
         Ruby modules.
-        
+
         @return The Ruby modules details section. (string)
         """
         rbModulesNames = sorted(self.module.modules.keys())
@@ -451,39 +507,45 @@
             rbModule = self.module.modules[rbModuleName]
             globalsList = self.__genGlobalsListSection(rbModule)
             methList, methBodies = self.__genMethodSection(
-                rbModule, rbModuleName, Function.General)
+                rbModule, rbModuleName, Function.General
+            )
             classList, classBodies = self.__genRbModulesClassesSection(
-                rbModule, rbModuleName)
-            
+                rbModule, rbModuleName
+            )
+
             try:
                 rbmBody = TemplatesListsStyleCSS.rbModuleTemplate.format(
-                    **{'Anchor': rbModuleName,
-                       'Module': rbModule.name,
-                       'ModuleDescription':
-                        self.__formatDescription(rbModule.description),
-                       'GlobalsList': globalsList,
-                       'ClassesList': classList,
-                       'ClassesDetails': classBodies,
-                       'FunctionsList': methList,
-                       'FunctionsDetails': methBodies,
-                       })
+                    **{
+                        "Anchor": rbModuleName,
+                        "Module": rbModule.name,
+                        "ModuleDescription": self.__formatDescription(
+                            rbModule.description
+                        ),
+                        "GlobalsList": globalsList,
+                        "ClassesList": classList,
+                        "ClassesDetails": classBodies,
+                        "FunctionsList": methList,
+                        "FunctionsDetails": methBodies,
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
-                    "Error in tags of description of Ruby module {0}.\n"
-                    .format(rbModuleName))
+                    "Error in tags of description of Ruby module {0}.\n".format(
+                        rbModuleName
+                    )
+                )
                 sys.stderr.write("{0}\n".format(e))
                 rbmBody = ""
-            
+
             rbModules.append(rbmBody)
-            
-        return ''.join(rbModules)
+
+        return "".join(rbModules)
 
     def __genRbModulesClassesSection(self, obj, modName):
         """
         Private method to generate the Ruby module classes details section.
-        
+
         @param obj Reference to the object being formatted.
         @param modName Name of the Ruby module containing the classes. (string)
         @return The classes list and classes details section.
@@ -494,44 +556,50 @@
         for className in classNames:
             _class = obj.classes[className]
             supers = _class.super
-            supers = ', '.join(supers) if len(supers) > 0 else "None"
-            
+            supers = ", ".join(supers) if len(supers) > 0 else "None"
+
             methList, methBodies = self.__genMethodSection(
-                _class, className, Function.General)
-            
+                _class, className, Function.General
+            )
+
             try:
                 clsBody = TemplatesListsStyleCSS.rbModulesClassTemplate.format(
-                    **{'Anchor': className,
-                       'Class': _class.name,
-                       'ClassSuper': supers,
-                       'ClassDescription':
-                        self.__formatDescription(_class.description),
-                       'MethodList': methList,
-                       'MethodDetails': methBodies,
-                       })
+                    **{
+                        "Anchor": className,
+                        "Class": _class.name,
+                        "ClassSuper": supers,
+                        "ClassDescription": self.__formatDescription(
+                            _class.description
+                        ),
+                        "MethodList": methList,
+                        "MethodDetails": methBodies,
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
-                    "Error in tags of description of class {0}.\n".format(
-                        className))
+                    "Error in tags of description of class {0}.\n".format(className)
+                )
                 sys.stderr.write("{0}\n".format(e))
                 clsBody = ""
-            
+
             classes.append(clsBody)
-            
+
         classesList = self.__genRbModulesClassesListSection(
-            classNames, obj.classes, modName)
-        
+            classNames, obj.classes, modName
+        )
+
         if not classesList:
             classesList = TemplatesListsStyleCSS.listEntryNoneTemplate
-        return (TemplatesListsStyleCSS.listTemplate
-                .format(**{'Entries': classesList}), ''.join(classes))
-        
+        return (
+            TemplatesListsStyleCSS.listTemplate.format(**{"Entries": classesList}),
+            "".join(classes),
+        )
+
     def __genRbModulesClassesListSection(self, names, sectionDict, moduleName):
         """
         Private method to generate the classes list section of a Ruby module.
-        
+
         @param names The names to appear in the list. (list of strings)
         @param sectionDict dictionary containing all relevant information
             (dict)
@@ -541,24 +609,35 @@
         """
         lst = []
         for name in names:
-            lst.append(TemplatesListsStyleCSS.listEntryTemplate.format(
-                **{'Link': "{0}.{1}".format(moduleName, name),
-                   'Name': sectionDict[name].name,
-                   'Description':
-                    self.__getShortDescription(sectionDict[name].description),
-                   'Deprecated':
-                    self.__checkDeprecated(sectionDict[name].description) and
-                    TemplatesListsStyleCSS.listEntryDeprecatedTemplate or "",
-                   }))
-            self.keywords.append(("{0}.{1}".format(moduleName, name),
-                                  "#{0}.{1}".format(moduleName, name)))
-        return ''.join(lst)
-        
+            lst.append(
+                TemplatesListsStyleCSS.listEntryTemplate.format(
+                    **{
+                        "Link": "{0}.{1}".format(moduleName, name),
+                        "Name": sectionDict[name].name,
+                        "Description": self.__getShortDescription(
+                            sectionDict[name].description
+                        ),
+                        "Deprecated": self.__checkDeprecated(
+                            sectionDict[name].description
+                        )
+                        and TemplatesListsStyleCSS.listEntryDeprecatedTemplate
+                        or "",
+                    }
+                )
+            )
+            self.keywords.append(
+                (
+                    "{0}.{1}".format(moduleName, name),
+                    "#{0}.{1}".format(moduleName, name),
+                )
+            )
+        return "".join(lst)
+
     def __genFunctionsSection(self):
         """
         Private method to generate the document section with details about
         functions.
-        
+
         @return The functions details section. (string)
         """
         funcBodies = []
@@ -566,33 +645,34 @@
         for funcName in funcNames:
             try:
                 funcBody = TemplatesListsStyleCSS.functionTemplate.format(
-                    **{'Anchor': funcName,
-                       'Function': self.module.functions[funcName].name,
-                       'FunctionDescription': self.__formatDescription(
-                           self.module.functions[funcName].description),
-                       'Params':
-                        ', '.join(self.module.functions[funcName].parameters),
-                       })
+                    **{
+                        "Anchor": funcName,
+                        "Function": self.module.functions[funcName].name,
+                        "FunctionDescription": self.__formatDescription(
+                            self.module.functions[funcName].description
+                        ),
+                        "Params": ", ".join(self.module.functions[funcName].parameters),
+                    }
+                )
             except TagError as e:
-                sys.stderr.write(
-                    "Error processing {0}.\n".format(self.module.file))
+                sys.stderr.write("Error processing {0}.\n".format(self.module.file))
                 sys.stderr.write(
-                    "Error in tags of description of function {0}.\n".format(
-                        funcName))
+                    "Error in tags of description of function {0}.\n".format(funcName)
+                )
                 sys.stderr.write("{0}\n".format(e))
                 funcBody = ""
-            
+
             funcBodies.append(funcBody)
-            
-        return ''.join(funcBodies)
-        
+
+        return "".join(funcBodies)
+
     def __getShortDescription(self, desc):
         """
         Private method to determine the short description of an object.
-        
+
         The short description is just the first non empty line of the
         documentation string.
-        
+
         @param desc The documentation string. (string)
         @return The short description. (string)
         """
@@ -603,37 +683,34 @@
             desc = desc.strip()
             if desc:
                 descfound = 1
-                dotpos = desc.find('.')
+                dotpos = desc.find(".")
                 if dotpos == -1:
                     sdlist.append(desc.strip())
                 else:
-                    while (
-                        dotpos + 1 < len(desc) and
-                        not desc[dotpos + 1].isspace()
-                    ):
+                    while dotpos + 1 < len(desc) and not desc[dotpos + 1].isspace():
                         # don't recognize '.' inside a number or word as
                         # stop condition
-                        dotpos = desc.find('.', dotpos + 1)
+                        dotpos = desc.find(".", dotpos + 1)
                         if dotpos == -1:
                             break
                     if dotpos == -1:
                         sdlist.append(desc.strip())
                     else:
-                        sdlist.append(desc[:dotpos + 1].strip())
-                        break   # break if a '.' is found
+                        sdlist.append(desc[: dotpos + 1].strip())
+                        break  # break if a '.' is found
             else:
                 if descfound:
-                    break   # break if an empty line is found
+                    break  # break if an empty line is found
         if sdlist:
-            return html_uencode(' '.join(sdlist))
+            return html_uencode(" ".join(sdlist))
         else:
-            return ''
-        
+            return ""
+
     def __checkDeprecated(self, descr):
         """
         Private method to check, if the object to be documented contains a
         deprecated flag.
-        
+
         @param descr documentation string (string)
         @return flag indicating the deprecation status (boolean)
         """
@@ -643,15 +720,15 @@
             if desc.startswith("@deprecated"):
                 return True
         return False
-        
+
     def __genParagraphs(self, lines):
         """
         Private method to assemble the descriptive paragraphs of a docstring.
-        
+
         A paragraph is made up of a number of consecutive lines without
         an intermediate empty line. Empty lines are treated as a paragraph
         delimiter.
-        
+
         @param lines A list of individual lines. (list of strings)
         @return Ready formatted paragraphs. (string)
         """
@@ -659,23 +736,29 @@
         linelist = []
         for line in lines:
             if line.strip():
-                if line == '.':
+                if line == ".":
                     linelist.append("")
                 else:
                     linelist.append(html_uencode(line))
             else:
-                lst.append(TemplatesListsStyleCSS.paragraphTemplate.format(
-                    **{'Lines': '\n'.join(linelist)}))
+                lst.append(
+                    TemplatesListsStyleCSS.paragraphTemplate.format(
+                        **{"Lines": "\n".join(linelist)}
+                    )
+                )
                 linelist = []
         if linelist:
-            lst.append(TemplatesListsStyleCSS.paragraphTemplate.format(
-                **{'Lines': '\n'.join(linelist)}))
-        return ''.join(lst)
-        
+            lst.append(
+                TemplatesListsStyleCSS.paragraphTemplate.format(
+                    **{"Lines": "\n".join(linelist)}
+                )
+            )
+        return "".join(lst)
+
     def __genDescriptionListSection(self, dictionary, template):
         """
         Private method to generate the list section of a description.
-        
+
         @param dictionary Dictionary containing the info for the
             list section.
         @param template The template to be used for the list. (string)
@@ -684,16 +767,20 @@
         lst = []
         keys = sorted(dictionary.keys())
         for key in keys:
-            lst.append(template.format(
-                **{'Name': key,
-                   'Description': html_uencode('\n'.join(dictionary[key])),
-                   }))
-        return ''.join(lst)
-        
+            lst.append(
+                template.format(
+                    **{
+                        "Name": key,
+                        "Description": html_uencode("\n".join(dictionary[key])),
+                    }
+                )
+            )
+        return "".join(lst)
+
     def __genParamDescriptionListSection(self, _list):
         """
         Private method to generate the list section of a description.
-        
+
         @param _list list containing the info for the parameter description
             list section (list of lists with three elements)
         @return formatted list section (string)
@@ -702,36 +789,37 @@
         for name, type_, lines in _list:
             if type_:
                 lst.append(
-                    TemplatesListsStyleCSS.parameterTypesListEntryTemplate
-                    .format(
-                        **{'Name': name,
-                           'Type': type_,
-                           'Description': html_uencode('\n'.join(lines)),
-                           }
+                    TemplatesListsStyleCSS.parameterTypesListEntryTemplate.format(
+                        **{
+                            "Name": name,
+                            "Type": type_,
+                            "Description": html_uencode("\n".join(lines)),
+                        }
                     )
                 )
             else:
                 lst.append(
                     TemplatesListsStyleCSS.parametersListEntryTemplate.format(
-                        **{'Name': name,
-                           'Description': html_uencode('\n'.join(lines)),
-                           }
+                        **{
+                            "Name": name,
+                            "Description": html_uencode("\n".join(lines)),
+                        }
                     )
                 )
-        return ''.join(lst)
-        
+        return "".join(lst)
+
     def __formatCrossReferenceEntry(self, entry):
         """
         Private method to format a cross reference entry.
-        
+
         This cross reference entry looks like "package.module#member label".
-        
+
         @param entry the entry to be formatted (string)
         @return formatted entry (string)
         """
         if entry.startswith('"'):
             return entry
-        elif entry.startswith('<'):
+        elif entry.startswith("<"):
             entry = entry[3:]
         else:
             try:
@@ -740,73 +828,78 @@
                 reference = entry
                 label = entry
             try:
-                path, anchor = reference.split('#', 1)
+                path, anchor = reference.split("#", 1)
             except ValueError:
                 path = reference
-                anchor = ''
-            reference = path and "{0}.html".format(path) or ''
+                anchor = ""
+            reference = path and "{0}.html".format(path) or ""
             if anchor:
                 reference = "{0}#{1}".format(reference, anchor)
             entry = 'href="{0}">{1}</a>'.format(reference, label)
-        
-        return TemplatesListsStyleCSS.seeLinkTemplate.format(**{'Link': entry})
-        
+
+        return TemplatesListsStyleCSS.seeLinkTemplate.format(**{"Link": entry})
+
     def __genSeeListSection(self, _list, template):
         """
         Private method to generate the "see also" list section of a
         description.
-        
+
         @param _list List containing the info for the section.
         @param template The template to be used for the list. (string)
         @return The list section. (string)
         """
         lst = []
         for seeEntry in _list:
-            seeEntryString = ''.join(seeEntry)
-            lst.append(template.format(
-                **{'Link': html_uencode(self.__formatCrossReferenceEntry(
-                    seeEntryString)),
-                   }))
-        return '\n'.join(lst)
-        
+            seeEntryString = "".join(seeEntry)
+            lst.append(
+                template.format(
+                    **{
+                        "Link": html_uencode(
+                            self.__formatCrossReferenceEntry(seeEntryString)
+                        ),
+                    }
+                )
+            )
+        return "\n".join(lst)
+
     def __processInlineTags(self, desc):
         """
         Private method to process inline tags.
-        
+
         @param desc One line of the description (string)
         @return processed line with inline tags expanded (string)
         @exception TagError raised to indicate an invalid tag
         """
-        start = desc.find('{@')
+        start = desc.find("{@")
         while start != -1:
-            stop = desc.find('}', start + 2)
+            stop = desc.find("}", start + 2)
             if stop == -1:
                 raise TagError("Unterminated inline tag.\n{0}".format(desc))
-            
-            tagText = desc[start + 1:stop]
-            if tagText.startswith('@link'):
+
+            tagText = desc[start + 1 : stop]
+            if tagText.startswith("@link"):
                 parts = tagText.split(None, 1)
                 if len(parts) < 2:
                     raise TagError(
-                        "Wrong format in inline tag {0}.\n{1}".format(
-                            parts[0], desc))
-                
+                        "Wrong format in inline tag {0}.\n{1}".format(parts[0], desc)
+                    )
+
                 formattedTag = self.__formatCrossReferenceEntry(parts[1])
                 desc = desc.replace("{{{0}}}".format(tagText), formattedTag)
             else:
                 tag = tagText.split(None, 1)[0]
                 raise TagError(
-                    "Unknown inline tag encountered, {0}.\n{1}".format(
-                        tag, desc))
-            
-            start = desc.find('{@')
-        
+                    "Unknown inline tag encountered, {0}.\n{1}".format(tag, desc)
+                )
+
+            start = desc.find("{@")
+
         return desc
-        
+
     def __formatDescription(self, descr):
         """
         Private method to format the contents of the documentation string.
-        
+
         @param descr The contents of the documentation string. (string)
         @exception TagError A tag doesn't have the correct number
             of arguments.
@@ -814,7 +907,7 @@
         """
         if not descr:
             return ""
-        
+
         paragraphs = []
         paramList = []
         returns = []
@@ -830,7 +923,7 @@
         seeList = []
         lastItem = paragraphs
         inTagSection = False
-        
+
         dlist = descr.splitlines()
         while dlist and not dlist[0]:
             del dlist[0]
@@ -842,8 +935,7 @@
             if buffer:
                 if desc.startswith("@"):
                     buffer = ""
-                    raise TagError(
-                        "Wrong format in {0} line.\n".format(lastTag))
+                    raise TagError("Wrong format in {0} line.\n".format(lastTag))
                 else:
                     desc = buffer + desc
             if desc:
@@ -852,11 +944,10 @@
                     parts = desc.split(None, 2)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     paramName = parts[1]
                     if parts[0] == "@keyparam":
-                        paramName += '='
+                        paramName += "="
                     try:
                         paramList.append([paramName, "", [parts[2]]])
                     except IndexError:
@@ -866,21 +957,21 @@
                     parts = desc.split(None, 1)
                     if lastTag not in ["@param", "@keyparam"]:
                         raise TagError(
-                            "{0} line must be preceded by a parameter line\n"
-                            .format(parts[0]))
+                            "{0} line must be preceded by a parameter line\n".format(
+                                parts[0]
+                            )
+                        )
                     inTagSection = True
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     paramList[-1][1] = parts[1]
                 elif desc.startswith("@ptype"):
                     inTagSection = True
                     parts = desc.split(None, 2)
                     lastTag = parts[0]
                     if len(parts) < 3:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     param, type_ = parts[1:]
                     for index in range(len(paramList)):
                         if paramList[index][0] == param:
@@ -888,28 +979,30 @@
                             break
                     else:
                         raise TagError(
-                            "Unknow parameter name '{0}' in {1} line.\n"
-                            .format(param, parts[0]))
+                            "Unknow parameter name '{0}' in {1} line.\n".format(
+                                param, parts[0]
+                            )
+                        )
                 elif desc.startswith(("@return", "@ireturn")):
                     inTagSection = True
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     returns = [parts[1]]
                     lastItem = returns
                 elif desc.startswith("@rtype"):
                     parts = desc.split(None, 1)
                     if lastTag not in ["@return", "@ireturn"]:
                         raise TagError(
-                            "{0} line must be preceded by a @return line\n"
-                            .format(parts[0]))
+                            "{0} line must be preceded by a @return line\n".format(
+                                parts[0]
+                            )
+                        )
                     inTagSection = True
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     returnTypes = [parts[1]]
                     lastItem = returnTypes
                 elif desc.startswith("@yield"):
@@ -917,21 +1010,21 @@
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     yields = [parts[1]]
                     lastItem = yields
                 elif desc.startswith("@ytype"):
                     parts = desc.split(None, 1)
                     if lastTag != "@yield":
                         raise TagError(
-                            "{0} line must be preceded by a @yield line\n"
-                            .format(parts[0]))
+                            "{0} line must be preceded by a @yield line\n".format(
+                                parts[0]
+                            )
+                        )
                     inTagSection = True
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     yieldTypes = [parts[1]]
                     lastItem = yieldTypes
                 elif desc.startswith(("@exception", "@throws", "@raise")):
@@ -939,8 +1032,7 @@
                     parts = desc.split(None, 2)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     excName = parts[1]
                     try:
                         exceptionDict[excName] = [parts[2]]
@@ -955,12 +1047,9 @@
                         buffer = desc
                     else:
                         buffer = ""
-                        signalName = (
-                            m.group("SignalName1") or m.group("SignalName2")
-                        )
-                        signalDesc = (
-                            m.group("SignalDescription1") or
-                            m.group("SignalDescription2")
+                        signalName = m.group("SignalName1") or m.group("SignalName2")
+                        signalDesc = m.group("SignalDescription1") or m.group(
+                            "SignalDescription2"
                         )
                         signalDict[signalName] = []
                         if signalDesc is not None:
@@ -974,12 +1063,9 @@
                         buffer = desc
                     else:
                         buffer = ""
-                        eventName = (
-                            m.group("EventName1") or m.group("EventName2")
-                        )
-                        eventDesc = (
-                            m.group("EventDescription1") or
-                            m.group("EventDescription2")
+                        eventName = m.group("EventName1") or m.group("EventName2")
+                        eventDesc = m.group("EventDescription1") or m.group(
+                            "EventDescription2"
                         )
                         eventDict[eventName] = []
                         if eventDesc is not None:
@@ -990,8 +1076,7 @@
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     deprecated = [parts[1]]
                     lastItem = deprecated
                 elif desc.startswith("@author"):
@@ -999,8 +1084,7 @@
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     authorInfo = [parts[1]]
                     lastItem = authorInfo
                 elif desc.startswith("@since"):
@@ -1008,8 +1092,7 @@
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     sinceInfo = [parts[1]]
                     lastItem = sinceInfo
                 elif desc.startswith("@see"):
@@ -1017,132 +1100,160 @@
                     parts = desc.split(None, 1)
                     lastTag = parts[0]
                     if len(parts) < 2:
-                        raise TagError(
-                            "Wrong format in {0} line.\n".format(parts[0]))
+                        raise TagError("Wrong format in {0} line.\n".format(parts[0]))
                     seeList.append([parts[1]])
                     lastItem = seeList[-1]
                 elif desc.startswith("@@"):
                     lastItem.append(desc[1:])
                 elif desc.startswith("@"):
                     tag = desc.split(None, 1)[0]
-                    raise TagError(
-                        "Unknown tag encountered, {0}.\n".format(tag))
+                    raise TagError("Unknown tag encountered, {0}.\n".format(tag))
                 else:
                     lastItem.append(ditem)
             elif not inTagSection:
                 lastItem.append(ditem)
-        
+
         description = self.__genParagraphs(paragraphs) if paragraphs else ""
-        
+
         parameterSect = (
             TemplatesListsStyleCSS.parametersListTemplate.format(
-                **{'Parameters': self.__genParamDescriptionListSection(
-                    paramList)})
-            if paramList else
-            ""
+                **{"Parameters": self.__genParamDescriptionListSection(paramList)}
+            )
+            if paramList
+            else ""
         )
-        
+
         returnSect = (
             TemplatesListsStyleCSS.returnsTemplate.format(
-                html_uencode('\n'.join(returns)))
-            if returns else
-            ""
+                html_uencode("\n".join(returns))
+            )
+            if returns
+            else ""
         )
-        
+
         returnTypesSect = (
             TemplatesListsStyleCSS.returnTypesTemplate.format(
-                html_uencode('\n'.join(returnTypes)))
-            if returnTypes else
-            ""
+                html_uencode("\n".join(returnTypes))
+            )
+            if returnTypes
+            else ""
         )
-        
+
         yieldSect = (
             TemplatesListsStyleCSS.yieldsTemplate.format(
-                html_uencode('\n'.join(yields)))
-            if yields else
-            ""
+                html_uencode("\n".join(yields))
+            )
+            if yields
+            else ""
         )
-        
+
         yieldTypesSect = (
             TemplatesListsStyleCSS.yieldTypesTemplate.format(
-                html_uencode('\n'.join(yieldTypes)))
-            if yieldTypes else
-            ""
+                html_uencode("\n".join(yieldTypes))
+            )
+            if yieldTypes
+            else ""
         )
-        
+
         exceptionSect = (
             TemplatesListsStyleCSS.exceptionsListTemplate.format(
-                **{'Exceptions': self.__genDescriptionListSection(
-                    exceptionDict,
-                    TemplatesListsStyleCSS.exceptionsListEntryTemplate)}
+                **{
+                    "Exceptions": self.__genDescriptionListSection(
+                        exceptionDict,
+                        TemplatesListsStyleCSS.exceptionsListEntryTemplate,
+                    )
+                }
             )
-            if exceptionDict else
-            ""
+            if exceptionDict
+            else ""
         )
-        
+
         signalSect = (
             TemplatesListsStyleCSS.signalsListTemplate.format(
-                **{'Signals': self.__genDescriptionListSection(
-                    signalDict,
-                    TemplatesListsStyleCSS.signalsListEntryTemplate)}
+                **{
+                    "Signals": self.__genDescriptionListSection(
+                        signalDict, TemplatesListsStyleCSS.signalsListEntryTemplate
+                    )
+                }
             )
-            if signalDict else
-            ""
+            if signalDict
+            else ""
         )
-        
+
         eventSect = (
             TemplatesListsStyleCSS.eventsListTemplate.format(
-                **{'Events': self.__genDescriptionListSection(
-                    eventDict,
-                    TemplatesListsStyleCSS.eventsListEntryTemplate)}
+                **{
+                    "Events": self.__genDescriptionListSection(
+                        eventDict, TemplatesListsStyleCSS.eventsListEntryTemplate
+                    )
+                }
             )
-            if eventDict else
-            ""
+            if eventDict
+            else ""
         )
-        
+
         deprecatedSect = (
             TemplatesListsStyleCSS.deprecatedTemplate.format(
-                **{'Lines': html_uencode('\n'.join(deprecated))})
-            if deprecated else
-            ""
+                **{"Lines": html_uencode("\n".join(deprecated))}
+            )
+            if deprecated
+            else ""
         )
-        
+
         authorInfoSect = (
             TemplatesListsStyleCSS.authorInfoTemplate.format(
-                **{'Authors': html_uencode('\n'.join(authorInfo))})
-            if authorInfo else
-            ""
+                **{"Authors": html_uencode("\n".join(authorInfo))}
+            )
+            if authorInfo
+            else ""
         )
-        
+
         sinceInfoSect = (
             TemplatesListsStyleCSS.sinceInfoTemplate.format(
-                **{'Info': html_uencode(sinceInfo[0])})
-            if sinceInfo else
-            ""
+                **{"Info": html_uencode(sinceInfo[0])}
+            )
+            if sinceInfo
+            else ""
         )
-        
+
         seeSect = (
             TemplatesListsStyleCSS.seeListTemplate.format(
-                **{'Links': self.__genSeeListSection(
-                    seeList, TemplatesListsStyleCSS.seeListEntryTemplate)})
-            if seeList else
-            ''
+                **{
+                    "Links": self.__genSeeListSection(
+                        seeList, TemplatesListsStyleCSS.seeListEntryTemplate
+                    )
+                }
+            )
+            if seeList
+            else ""
         )
-        
-        return "".join([
-            deprecatedSect, description, parameterSect, returnSect,
-            returnTypesSect, yieldSect, yieldTypesSect, exceptionSect,
-            signalSect, eventSect, authorInfoSect, seeSect, sinceInfoSect,
-        ])
-    
+
+        return "".join(
+            [
+                deprecatedSect,
+                description,
+                parameterSect,
+                returnSect,
+                returnTypesSect,
+                yieldSect,
+                yieldTypesSect,
+                exceptionSect,
+                signalSect,
+                eventSect,
+                authorInfoSect,
+                seeSect,
+                sinceInfoSect,
+            ]
+        )
+
     def getQtHelpKeywords(self):
         """
         Public method to retrieve the parts for the QtHelp keywords section.
-        
+
         @return list of tuples containing the name (string) and the ref
             (string). The ref is without the filename part.
         """
         if not self.generated:
             self.genDocument()
-        
+
         return self.keywords
--- a/src/eric7/DocumentationTools/QtHelpGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/QtHelpGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,11 +11,9 @@
 import sys
 import os
 import shutil
-import subprocess           # secok
+import subprocess  # secok
 
-from Utilities import (
-    joinext, html_encode, getQtBinariesPath, generateQtToolName
-)
+from Utilities import joinext, html_encode, getQtBinariesPath, generateQtToolName
 
 HelpCollection = r"""<?xml version="1.0" encoding="utf-8" ?>
 <QHelpCollectionProject version="1.0">
@@ -49,10 +47,10 @@
 </QtHelpProject>
 """
 
-HelpProjectFile = 'source.qhp'
-HelpHelpFile = 'source.qch'
-HelpCollectionProjectFile = 'source.qhcp'
-HelpCollectionFile = 'collection.qhc'
+HelpProjectFile = "source.qhp"
+HelpHelpFile = "source.qch"
+HelpCollectionProjectFile = "source.qhcp"
+HelpCollectionFile = "collection.qhc"
 
 
 class QtHelpGenerator:
@@ -60,12 +58,21 @@
     Class implementing the QtHelp generator for the builtin documentation
     generator.
     """
-    def __init__(self, htmlDir,
-                 outputDir, namespace, virtualFolder, filterName,
-                 filterAttributes, title, createCollection):
+
+    def __init__(
+        self,
+        htmlDir,
+        outputDir,
+        namespace,
+        virtualFolder,
+        filterName,
+        filterAttributes,
+        title,
+        createCollection,
+    ):
         """
         Constructor
-        
+
         @param htmlDir directory containing the HTML files (string)
         @param outputDir output directory for the files (string)
         @param namespace namespace to be used (string)
@@ -82,26 +89,19 @@
         self.namespace = namespace
         self.virtualFolder = virtualFolder
         self.filterName = filterName
-        self.filterAttributes = (
-            filterAttributes and filterAttributes.split(':') or []
-        )
+        self.filterAttributes = filterAttributes and filterAttributes.split(":") or []
         self.relPath = os.path.relpath(self.htmlDir, self.outputDir)
         self.title = title
         self.createCollection = createCollection
-        
-        self.packages = {
-            "00index": {
-                "subpackages": {},
-                "modules": {}
-            }
-        }
+
+        self.packages = {"00index": {"subpackages": {}, "modules": {}}}
         self.remembered = False
         self.keywords = []
-    
+
     def remember(self, file, moduleDocument, basename=""):
         """
         Public method to remember a documentation file.
-        
+
         @param file The filename to be remembered. (string)
         @param moduleDocument The ModuleDocument object containing the
             information for the file.
@@ -112,7 +112,7 @@
         self.remembered = True
         if basename:
             file = file.replace(basename, "")
-        
+
         if "__init__" in file:
             dirName = os.path.dirname(file)
             udir = os.path.dirname(dirName)
@@ -126,73 +126,77 @@
                 elt = self.packages["00index"]
             package = dirName.replace(os.sep, ".")
             elt["subpackages"][package] = moduleDocument.name()
-            
-            self.packages[package] = {
-                "subpackages": {},
-                "modules": {}
-            }
-            
-            kwEntry = ("{0} (Package)".format(package.split('.')[-1]),
-                       joinext("index-{0}".format(package), ".html"))
+
+            self.packages[package] = {"subpackages": {}, "modules": {}}
+
+            kwEntry = (
+                "{0} (Package)".format(package.split(".")[-1]),
+                joinext("index-{0}".format(package), ".html"),
+            )
             if kwEntry not in self.keywords:
                 self.keywords.append(kwEntry)
-            
+
             if moduleDocument.isEmpty():
                 return
-        
+
         package = os.path.dirname(file).replace(os.sep, ".")
         try:
             elt = self.packages[package]
         except KeyError:
             elt = self.packages["00index"]
         elt["modules"][moduleDocument.name()] = moduleDocument.name()
-        
+
         if "__init__" not in file:
             kwEntry = (
-                "{0} (Module)".format(moduleDocument.name().split('.')[-1]),
-                joinext(moduleDocument.name(), ".html"))
+                "{0} (Module)".format(moduleDocument.name().split(".")[-1]),
+                joinext(moduleDocument.name(), ".html"),
+            )
             if kwEntry not in self.keywords:
                 self.keywords.append(kwEntry)
         for kw in moduleDocument.getQtHelpKeywords():
-            kwEntry = (kw[0], "{0}{1}".format(
-                joinext(moduleDocument.name(), ".html"), kw[1]))
+            kwEntry = (
+                kw[0],
+                "{0}{1}".format(joinext(moduleDocument.name(), ".html"), kw[1]),
+            )
             if kwEntry not in self.keywords:
                 self.keywords.append(kwEntry)
-    
+
     def __generateSections(self, package, level):
         """
         Private method to generate the sections part.
-        
+
         @param package name of the package to process (string)
         @param level indentation level (integer)
         @return sections part (string)
         """
-        indent = level * '  '
-        indent1 = indent + '  '
+        indent = level * "  "
+        indent1 = indent + "  "
         s = indent + '<section title="{0}" ref="{1}">\n'.format(
             package == "00index" and self.title or package,
-            package == "00index" and
-            joinext("index", ".html") or
-            joinext("index-{0}".format(package), ".html"))
+            package == "00index"
+            and joinext("index", ".html")
+            or joinext("index-{0}".format(package), ".html"),
+        )
         for subpack in sorted(self.packages[package]["subpackages"]):
-            s += self.__generateSections(subpack, level + 1) + '\n'
+            s += self.__generateSections(subpack, level + 1) + "\n"
         for mod in sorted(self.packages[package]["modules"]):
             s += indent1 + '<section title="{0}" ref="{1}" />\n'.format(
-                mod, joinext(mod, ".html"))
-        s += indent + '</section>'
+                mod, joinext(mod, ".html")
+            )
+        s += indent + "</section>"
         return s
-    
+
     def __convertEol(self, txt, newline):
         """
         Private method to convert the newline characters.
-        
+
         @param txt text to be converted (string)
         @param newline newline character to be used (string)
         @return converted text (string)
         """
         # step 1: normalize eol to '\n'
         txt = txt.replace("\r\n", "\n").replace("\r", "\n")
-        
+
         # step 2: convert to the target eol
         if newline is None:
             return txt.replace("\n", os.linesep)
@@ -200,11 +204,11 @@
             return txt.replace("\n", newline)
         else:
             return txt
-    
+
     def generateFiles(self, basename="", newline=None):
         """
         Public method to generate all index files.
-        
+
         @param basename The basename of the file hierarchy to be documented.
             The basename is stripped off the filename if it starts with
             the basename.
@@ -213,26 +217,31 @@
         if not self.remembered:
             sys.stderr.write("No QtHelp to generate.\n")
             return
-        
+
         if basename:
             basename = basename.replace(os.sep, ".")
             if not basename.endswith("."):
                 basename = "{0}.".format(basename)
-        
+
         sections = self.__generateSections("00index", level=3)
-        filesList = sorted(e for e in os.listdir(self.htmlDir)
-                           if e.endswith('.html'))
+        filesList = sorted(e for e in os.listdir(self.htmlDir) if e.endswith(".html"))
         filesList.append("styles.css")
-        files = "\n".join(
-            ["      <file>{0}</file>".format(f) for f in filesList])
+        files = "\n".join(["      <file>{0}</file>".format(f) for f in filesList])
         filterAttribs = "\n".join(
-            ["    <filterAttribute>{0}</filterAttribute>".format(a)
-             for a in sorted(self.filterAttributes)])
+            [
+                "    <filterAttribute>{0}</filterAttribute>".format(a)
+                for a in sorted(self.filterAttributes)
+            ]
+        )
         keywords = "\n".join(
-            ['      <keyword name="{0}" id="{1}" ref="{2}" />'.format(
-             html_encode(kw[0]), html_encode(kw[0]), html_encode(kw[1]))
-             for kw in sorted(self.keywords)])
-        
+            [
+                '      <keyword name="{0}" id="{1}" ref="{2}" />'.format(
+                    html_encode(kw[0]), html_encode(kw[0]), html_encode(kw[1])
+                )
+                for kw in sorted(self.keywords)
+            ]
+        )
+
         helpAttribs = {
             "namespace": self.namespace,
             "folder": self.virtualFolder,
@@ -242,58 +251,70 @@
             "keywords": keywords,
             "files": files,
         }
-        
+
         txt = self.__convertEol(HelpProject.format(**helpAttribs), newline)
-        with open(os.path.join(self.outputDir, HelpProjectFile), "w",
-                  encoding="utf-8", newline=newline) as f:
+        with open(
+            os.path.join(self.outputDir, HelpProjectFile),
+            "w",
+            encoding="utf-8",
+            newline=newline,
+        ) as f:
             f.write(txt)
-        
-        if (
-            self.createCollection and
-            not os.path.exists(os.path.join(
-                self.outputDir, HelpCollectionProjectFile))
+
+        if self.createCollection and not os.path.exists(
+            os.path.join(self.outputDir, HelpCollectionProjectFile)
         ):
             collectionAttribs = {
                 "helpfile": HelpHelpFile,
             }
-            
-            txt = self.__convertEol(
-                HelpCollection.format(**collectionAttribs), newline)
-            with open(os.path.join(self.outputDir, HelpCollectionProjectFile),
-                      "w", encoding="utf-8", newline=newline) as f:
+
+            txt = self.__convertEol(HelpCollection.format(**collectionAttribs), newline)
+            with open(
+                os.path.join(self.outputDir, HelpCollectionProjectFile),
+                "w",
+                encoding="utf-8",
+                newline=newline,
+            ) as f:
                 f.write(txt)
-        
+
         sys.stdout.write("QtHelp files written.\n")
         sys.stdout.write("Generating QtHelp documentation...\n")
         sys.stdout.flush()
         sys.stderr.flush()
-        
+
         cwd = os.getcwd()
         # generate the compressed files
         qhelpgeneratorExe = os.path.join(
-            getQtBinariesPath(libexec=True),
-            generateQtToolName("qhelpgenerator")
+            getQtBinariesPath(libexec=True), generateQtToolName("qhelpgenerator")
         )
         if not os.path.exists(qhelpgeneratorExe):
             qhelpgeneratorExe = os.path.join(
-                getQtBinariesPath(libexec=False),
-                generateQtToolName("qhelpgenerator")
+                getQtBinariesPath(libexec=False), generateQtToolName("qhelpgenerator")
             )
-        shutil.copy(
-            os.path.join(self.outputDir, HelpProjectFile), self.htmlDir)
+        shutil.copy(os.path.join(self.outputDir, HelpProjectFile), self.htmlDir)
         os.chdir(self.htmlDir)
-        subprocess.run([            # secok
-            qhelpgeneratorExe,
-            HelpProjectFile, "-o", os.path.join(self.outputDir, HelpHelpFile)])
+        subprocess.run(
+            [  # secok
+                qhelpgeneratorExe,
+                HelpProjectFile,
+                "-o",
+                os.path.join(self.outputDir, HelpHelpFile),
+            ]
+        )
         os.remove(HelpProjectFile)
-        
+
         if self.createCollection:
             sys.stdout.write("Generating QtHelp collection...\n")
             sys.stdout.flush()
             sys.stderr.flush()
             os.chdir(self.outputDir)
-            subprocess.run([        # secok
-                qhelpgeneratorExe,
-                HelpCollectionProjectFile, "-o", HelpCollectionFile])
-        
+            subprocess.run(
+                [  # secok
+                    qhelpgeneratorExe,
+                    HelpCollectionProjectFile,
+                    "-o",
+                    HelpCollectionFile,
+                ]
+            )
+
         os.chdir(cwd)
--- a/src/eric7/DocumentationTools/TemplatesListsStyleCSS.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/TemplatesListsStyleCSS.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,7 @@
 ## Template for the CSS style sheet file       ##
 #################################################
 
-cssTemplate = '''body {{
+cssTemplate = """body {{
     color: {BodyColor};
     background: {BodyBgColor};
     margin: 0em 1em 10em 1em;
@@ -40,28 +40,28 @@
 a {{
     color: {LinkColor};
 }}
-'''
+"""
 
 #################################################
 ##  Common templates for index and docu files  ##
 #################################################
 
-headerTemplate = '''<!DOCTYPE html>
+headerTemplate = """<!DOCTYPE html>
 <html><head>
 <title>{Title}</title>
 <meta charset="UTF-8">
 <link rel="stylesheet" href="styles.css">
 </head>
-<body>'''
+<body>"""
 
-footerTemplate = '''
-</body></html>'''
+footerTemplate = """
+</body></html>"""
 
 #########################################
 ##  Templates for documentation files  ##
 #########################################
 
-moduleTemplate = '''
+moduleTemplate = """
 <a NAME="top" ID="top"></a>
 <h1>{Module}</h1>
 {ModuleDescription}
@@ -71,9 +71,9 @@
 {ClassList}
 <h3>Functions</h3>
 {FunctionList}
-<hr />'''
+<hr />"""
 
-rbFileTemplate = '''
+rbFileTemplate = """
 <a NAME="top" ID="top"></a>
 <h1>{Module}</h1>
 {ModuleDescription}
@@ -85,9 +85,9 @@
 {RbModulesList}
 <h3>Functions</h3>
 {FunctionList}
-<hr />'''
+<hr />"""
 
-classTemplate = '''
+classTemplate = """
 <hr />
 <a NAME="{Anchor}" ID="{Anchor}"></a>
 <h2>{Class}</h2>
@@ -104,21 +104,21 @@
 {StaticMethodList}
 {MethodDetails}
 <div align="right"><a href="#top">Up</a></div>
-<hr />'''
+<hr />"""
 
-methodTemplate = '''
+methodTemplate = """
 <a NAME="{Anchor}.{Method}" ID="{Anchor}.{Method}"></a>
 <h4>{Class}.{Method}{MethodClassifier}</h4>
 <b>{Method}</b>(<i>{Params}</i>)
-{MethodDescription}'''
+{MethodDescription}"""
 
-constructorTemplate = '''
+constructorTemplate = """
 <a NAME="{Anchor}.{Method}" ID="{Anchor}.{Method}"></a>
 <h4>{Class} (Constructor)</h4>
 <b>{Class}</b>(<i>{Params}</i>)
-{MethodDescription}'''
+{MethodDescription}"""
 
-rbModuleTemplate = '''
+rbModuleTemplate = """
 <hr />
 <a NAME="{Anchor}" ID="{Anchor}"></a>
 <h2>{Module}</h2>
@@ -133,9 +133,9 @@
 {ClassesDetails}
 {FunctionsDetails}
 <div align="right"><a href="#top">Up</a></div>
-<hr />'''
+<hr />"""
 
-rbModulesClassTemplate = '''
+rbModulesClassTemplate = """
 <a NAME="{Anchor}" ID="{Anchor}"></a>
 <h2>{Class}</h2>
 {ClassDescription}
@@ -145,180 +145,180 @@
 {MethodList}
 {MethodDetails}
 <div align="right"><a href="#top">Up</a></div>
-<hr />'''
+<hr />"""
 
-functionTemplate = '''
+functionTemplate = """
 <hr />
 <a NAME="{Anchor}" ID="{Anchor}"></a>
 <h2>{Function}</h2>
 <b>{Function}</b>(<i>{Params}</i>)
 {FunctionDescription}
 <div align="right"><a href="#top">Up</a></div>
-<hr />'''
+<hr />"""
 
-listTemplate = '''
+listTemplate = """
 <table>
 {Entries}
-</table>'''
+</table>"""
 
-listEntryTemplate = '''
+listEntryTemplate = """
 <tr>
 <td><a href="#{Link}">{Name}</a></td>
 <td>{Deprecated}{Description}</td>
-</tr>'''
+</tr>"""
 
-listEntryNoneTemplate = '''<tr><td>None</td></tr>'''
+listEntryNoneTemplate = """<tr><td>None</td></tr>"""
 
-listEntryDeprecatedTemplate = '''<b>Deprecated.</b>'''
+listEntryDeprecatedTemplate = """<b>Deprecated.</b>"""
 
-listEntrySimpleTemplate = '''<tr><td>{Name}</td></tr>'''
+listEntrySimpleTemplate = """<tr><td>{Name}</td></tr>"""
 
-paragraphTemplate = '''
+paragraphTemplate = """
 <p>
 {Lines}
-</p>'''
+</p>"""
 
-parametersListTemplate = '''
+parametersListTemplate = """
 <dl>
 {Parameters}
-</dl>'''
+</dl>"""
 
-parametersListEntryTemplate = '''
+parametersListEntryTemplate = """
 <dt><i>{Name}</i></dt>
 <dd>
 {Description}
-</dd>'''
+</dd>"""
 
-parameterTypesListEntryTemplate = '''
+parameterTypesListEntryTemplate = """
 <dt><i>{Name}</i> ({Type})</dt>
 <dd>
 {Description}
-</dd>'''
+</dd>"""
 
-returnsTemplate = '''
+returnsTemplate = """
 <dl>
 <dt>Return:</dt>
 <dd>
 {0}
 </dd>
-</dl>'''
+</dl>"""
 
-returnTypesTemplate = '''
+returnTypesTemplate = """
 <dl>
 <dt>Return Type:</dt>
 <dd>
 {0}
 </dd>
-</dl>'''
+</dl>"""
 
-yieldsTemplate = '''
+yieldsTemplate = """
 <dl>
 <dt>Yield:</dt>
 <dd>
 {0}
 </dd>
-</dl>'''
+</dl>"""
 
-yieldTypesTemplate = '''
+yieldTypesTemplate = """
 <dl>
 <dt>Yield Type:</dt>
 <dd>
 {0}
 </dd>
-</dl>'''
+</dl>"""
 
-exceptionsListTemplate = '''
+exceptionsListTemplate = """
 <dl>
 {Exceptions}
-</dl>'''
+</dl>"""
 
-exceptionsListEntryTemplate = '''
+exceptionsListEntryTemplate = """
 <dt>Raises <b>{Name}</b>:</dt>
 <dd>
 {Description}
-</dd>'''
+</dd>"""
 
-signalsListTemplate = '''
+signalsListTemplate = """
 <h3>Signals</h3>
 <dl>
 {Signals}
-</dl>'''
+</dl>"""
 
-signalsListEntryTemplate = '''
+signalsListEntryTemplate = """
 <dt>{Name}</dt>
 <dd>
 {Description}
-</dd>'''
+</dd>"""
 
-eventsListTemplate = '''
+eventsListTemplate = """
 <h3>Events</h3>
 <dl>
 {Events}
-</dl>'''
+</dl>"""
 
-eventsListEntryTemplate = '''
+eventsListEntryTemplate = """
 <dt>{Name}</dt>
 <dd>
 {Description}
-</dd>'''
+</dd>"""
 
-deprecatedTemplate = '''
+deprecatedTemplate = """
 <p>
 <b>Deprecated.</b>
 {Lines}
-</p>'''
+</p>"""
 
-authorInfoTemplate = '''
+authorInfoTemplate = """
 <p>
 <i>Author(s)</i>:
 {Authors}
-</p>'''
+</p>"""
 
-seeListTemplate = '''
+seeListTemplate = """
 <dl>
 <dt><b>See Also:</b></dt>
 {Links}
-</dl>'''
+</dl>"""
 
-seeListEntryTemplate = '''
+seeListEntryTemplate = """
 <dd>
 {Link}
-</dd>'''
+</dd>"""
 
-seeLinkTemplate = '''<a {Link}'''
+seeLinkTemplate = """<a {Link}"""
 
-sinceInfoTemplate = '''
+sinceInfoTemplate = """
 <p>
 <b>since</b> {Info}
-</p>'''
+</p>"""
 
 #################################
 ##  Templates for index files  ##
 #################################
 
-indexBodyTemplate = '''
+indexBodyTemplate = """
 <h1>{Title}</h1>
 {Description}
 {Subpackages}
-{Modules}'''
+{Modules}"""
 
-indexListPackagesTemplate = '''
+indexListPackagesTemplate = """
 <h3>Packages</h3>
 <table>
 {Entries}
-</table>'''
+</table>"""
 
-indexListModulesTemplate = '''
+indexListModulesTemplate = """
 <h3>Modules</h3>
 <table>
 {Entries}
-</table>'''
+</table>"""
 
-indexListEntryTemplate = '''
+indexListEntryTemplate = """
 <tr>
 <td><a href="{Link}">{Name}</a></td>
 <td>{Description}</td>
-</tr>'''
+</tr>"""
 
 #
 # eflag: noqa = E122
--- a/src/eric7/DocumentationTools/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/DocumentationTools/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,5 +9,5 @@
 
 supportedExtensionsDictForApis = {
     "Python3": [".py", ".pyw", ".py3", ".pyw3"],
-    "Ruby": [".rb"]
+    "Ruby": [".rb"],
 }
--- a/src/eric7/EricCore/EricTreeSortFilterProxyModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricCore/EricTreeSortFilterProxyModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,24 +13,25 @@
 class EricTreeSortFilterProxyModel(QSortFilterProxyModel):
     """
     Class implementing a modified QSortFilterProxyModel.
-   
+
     It always accepts the root nodes in the tree so filtering is only done
     on the children.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
-    
+
     def filterAcceptsRow(self, sourceRow, sourceParent):
         """
         Public method to determine, if the row is acceptable.
-        
+
         @param sourceRow row number in the source model (integer)
         @param sourceParent index of the source item (QModelIndex)
         @return flag indicating acceptance (boolean)
@@ -38,14 +39,13 @@
         idx = self.sourceModel().index(sourceRow, 0, sourceParent)
         if self.sourceModel().hasChildren(idx):
             return True
-        
-        return QSortFilterProxyModel.filterAcceptsRow(
-            self, sourceRow, sourceParent)
-    
+
+        return QSortFilterProxyModel.filterAcceptsRow(self, sourceRow, sourceParent)
+
     def hasChildren(self, parent=None):
         """
         Public method to check, if a parent node has some children.
-        
+
         @param parent index of the parent node (QModelIndex)
         @return flag indicating the presence of children (boolean)
         """
--- a/src/eric7/EricGraphics/EricArrowItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricGraphics/EricArrowItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,6 +22,7 @@
     """
     Class defining the arrow types.
     """
+
     NORMAL = 1
     WIDE = 2
 
@@ -30,12 +31,19 @@
     """
     Class implementing an arrow graphics item subclass.
     """
-    def __init__(self, origin=None, end=None,
-                 filled=False, arrowType=EricArrowType.NORMAL, colors=None,
-                 parent=None):
+
+    def __init__(
+        self,
+        origin=None,
+        end=None,
+        filled=False,
+        arrowType=EricArrowType.NORMAL,
+        colors=None,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param origin origin of the arrow
         @type QPointF
         @param end end point of the arrow
@@ -50,29 +58,28 @@
         @type QGraphicsItem
         """
         super().__init__(parent)
-        
+
         self._origin = QPointF() if origin is None else QPointF(origin)
         self._end = QPointF() if end is None else QPointF(end)
         self._filled = filled
         self.__type = arrowType
-        
+
         if colors is None:
-            self._colors = (QColor(Qt.GlobalColor.black),
-                            QColor(Qt.GlobalColor.white))
+            self._colors = (QColor(Qt.GlobalColor.black), QColor(Qt.GlobalColor.white))
         else:
             self._colors = colors
-        
+
         self._halfLength = 13.0
-        
+
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True)
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, True)
-        
+
     def setPoints(self, xa, ya, xb, yb):
         """
         Public method to set the start and end points of the line.
-        
+
         <b>Note:</b> This method does not redraw the item.
-        
+
         @param xa x-coordinate of the start point (float)
         @param ya y-coordinate of the start point (float)
         @param xb x-coordinate of the end point (float)
@@ -80,78 +87,99 @@
         """
         self._origin = QPointF(xa, ya)
         self._end = QPointF(xb, yb)
-        
+
     def setStartPoint(self, x, y):
         """
         Public method to set the start point.
-        
+
         <b>Note:</b> This method does not redraw the item.
-        
+
         @param x x-coordinate of the start point (float)
         @param y y-coordinate of the start point (float)
         """
         self._origin = QPointF(x, y)
-        
+
     def setEndPoint(self, x, y):
         """
         Public method to set the end point.
-        
+
         <b>Note:</b> This method does not redraw the item.
-        
+
         @param x x-coordinate of the end point (float)
         @param y y-coordinate of the end point (float)
         """
         self._end = QPointF(x, y)
-        
+
     def boundingRect(self):
         """
         Public method to return the bounding rectangle.
-        
+
         @return bounding rectangle (QRectF)
         """
         extra = self._halfLength / 2.0
-        return QRectF(self._origin, QSizeF(self._end.x() - self._origin.x(),
-                                           self._end.y() - self._origin.y())
-                      ).normalized().adjusted(-extra, -extra, extra, extra)
-        
+        return (
+            QRectF(
+                self._origin,
+                QSizeF(
+                    self._end.x() - self._origin.x(), self._end.y() - self._origin.y()
+                ),
+            )
+            .normalized()
+            .adjusted(-extra, -extra, extra, extra)
+        )
+
     def paint(self, painter, option, widget=None):
         """
         Public method to paint the item in local coordinates.
-        
+
         @param painter reference to the painter object (QPainter)
         @param option style options (QStyleOptionGraphicsItem)
         @param widget optional reference to the widget painted on (QWidget)
         """
-        width = 2 if (
-            (option.state & QStyle.StateFlag.State_Selected) ==
-            QStyle.StateFlag.State_Selected
-        ) else 1
-        
+        width = (
+            2
+            if (
+                (option.state & QStyle.StateFlag.State_Selected)
+                == QStyle.StateFlag.State_Selected
+            )
+            else 1
+        )
+
         # draw the line first
         line = QLineF(self._origin, self._end)
         painter.setPen(
-            QPen(self._colors[0], width, Qt.PenStyle.SolidLine,
-                 Qt.PenCapStyle.FlatCap, Qt.PenJoinStyle.MiterJoin))
+            QPen(
+                self._colors[0],
+                width,
+                Qt.PenStyle.SolidLine,
+                Qt.PenCapStyle.FlatCap,
+                Qt.PenJoinStyle.MiterJoin,
+            )
+        )
         painter.drawLine(line)
-        
+
         # draw the arrow head
         arrowAngle = (
             ArrowheadAngleFactor
-            if self.__type == EricArrowType.NORMAL else
-            2 * ArrowheadAngleFactor
+            if self.__type == EricArrowType.NORMAL
+            else 2 * ArrowheadAngleFactor
         )
         slope = math.atan2(line.dy(), line.dx())
-        
+
         # Calculate left arrow point
         arrowSlope = slope + arrowAngle
-        a1 = QPointF(self._end.x() - self._halfLength * math.cos(arrowSlope),
-                     self._end.y() - self._halfLength * math.sin(arrowSlope))
-        
+        a1 = QPointF(
+            self._end.x() - self._halfLength * math.cos(arrowSlope),
+            self._end.y() - self._halfLength * math.sin(arrowSlope),
+        )
+
         # Calculate right arrow point
         arrowSlope = slope - arrowAngle
-        a2 = QPointF(self._end.x() - self._halfLength * math.cos(arrowSlope),
-                     self._end.y() - self._halfLength * math.sin(arrowSlope))
-        
+        a2 = QPointF(
+            self._end.x() - self._halfLength * math.cos(arrowSlope),
+            self._end.y() - self._halfLength * math.sin(arrowSlope),
+        )
+
         if self._filled:
             painter.setBrush(self._colors[0])
         else:
--- a/src/eric7/EricGraphics/EricGraphicsView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricGraphics/EricGraphicsView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,63 +21,87 @@
 class EricGraphicsView(QGraphicsView):
     """
     Class implementing a graphics view.
-    
+
     @signal zoomValueChanged(int) emitted to signal a change of the zoom value
     """
+
     zoomValueChanged = pyqtSignal(int)
-    
+
     ZoomLevels = [
-        1, 3, 5, 7, 9,
-        10, 20, 30, 50, 67, 80, 90,
+        1,
+        3,
+        5,
+        7,
+        9,
+        10,
+        20,
+        30,
+        50,
+        67,
+        80,
+        90,
         100,
-        110, 120, 133, 150, 170, 200, 240, 300, 400,
-        500, 600, 700, 800, 900, 1000,
+        110,
+        120,
+        133,
+        150,
+        170,
+        200,
+        240,
+        300,
+        400,
+        500,
+        600,
+        700,
+        800,
+        900,
+        1000,
     ]
     ZoomLevelDefault = 100
-    
+
     def __init__(self, scene, parent=None):
         """
         Constructor
-        
+
         @param scene reference to the scene object (QGraphicsScene)
         @param parent parent widget (QWidget)
         """
         super().__init__(scene, parent)
         self.setObjectName("EricGraphicsView")
-        
+
         self.__initialSceneSize = self.scene().sceneRect().size()
         self.setBackgroundBrush(QBrush(self.getBackgroundColor()))
         self.setRenderHint(QPainter.RenderHint.Antialiasing, True)
         self.setDragMode(QGraphicsView.DragMode.RubberBandDrag)
-        self.setAlignment(
-            Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
+        self.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
         self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
         self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
-        self.setViewportUpdateMode(
-            QGraphicsView.ViewportUpdateMode.SmartViewportUpdate)
-        
-        self.setWhatsThis(self.tr(
-            "<b>Graphics View</b>\n"
-            "<p>This graphics view is used to show a diagram. \n"
-            "There are various actions available to manipulate the \n"
-            "shown items.</p>\n"
-            "<ul>\n"
-            "<li>Clicking on an item selects it.</li>\n"
-            "<li>Ctrl-clicking adds an item to the selection.</li>\n"
-            "<li>Ctrl-clicking a selected item deselects it.</li>\n"
-            "<li>Clicking on an empty spot of the canvas resets the selection."
-            "</li>\n"
-            "<li>Dragging the mouse over the canvas spans a rubberband to \n"
-            "select multiple items.</li>\n"
-            "<li>Dragging the mouse over a selected item moves the \n"
-            "whole selection.</li>\n"
-            "</ul>\n"
-        ))
-    
+        self.setViewportUpdateMode(QGraphicsView.ViewportUpdateMode.SmartViewportUpdate)
+
+        self.setWhatsThis(
+            self.tr(
+                "<b>Graphics View</b>\n"
+                "<p>This graphics view is used to show a diagram. \n"
+                "There are various actions available to manipulate the \n"
+                "shown items.</p>\n"
+                "<ul>\n"
+                "<li>Clicking on an item selects it.</li>\n"
+                "<li>Ctrl-clicking adds an item to the selection.</li>\n"
+                "<li>Ctrl-clicking a selected item deselects it.</li>\n"
+                "<li>Clicking on an empty spot of the canvas resets the selection."
+                "</li>\n"
+                "<li>Dragging the mouse over the canvas spans a rubberband to \n"
+                "select multiple items.</li>\n"
+                "<li>Dragging the mouse over a selected item moves the \n"
+                "whole selection.</li>\n"
+                "</ul>\n"
+            )
+        )
+
     def getDrawingColors(self):
         """
         Public method to get the configured drawing colors.
-        
+
         @return tuple containing the foreground and background colors
         @rtype tuple of (QColor, QColor)
         """
@@ -87,34 +111,34 @@
                 drawingMode = "white_black"
             else:
                 drawingMode = "black_white"
-        
+
         if drawingMode == "white_black":
             return (QColor("#ffffff"), QColor("#262626"))
         else:
             return (QColor("#000000"), QColor("#ffffff"))
-    
+
     def getForegroundColor(self):
         """
         Public method to get the configured foreground color.
-        
+
         @return foreground color
         @rtype QColor
         """
         return self.getDrawingColors()[0]
-    
+
     def getBackgroundColor(self):
         """
         Public method to get the configured background color.
-        
+
         @return background color
         @rtype QColor
         """
         return self.getDrawingColors()[1]
-    
+
     def __levelForZoom(self, zoom):
         """
         Private method determining the zoom level index given a zoom factor.
-        
+
         @param zoom zoom factor (integer)
         @return index of zoom factor (integer)
         """
@@ -125,7 +149,7 @@
                 if zoom <= EricGraphicsView.ZoomLevels[index]:
                     break
         return index
-    
+
     def zoomIn(self):
         """
         Public method to zoom in.
@@ -133,7 +157,7 @@
         index = self.__levelForZoom(self.zoom())
         if index < len(EricGraphicsView.ZoomLevels) - 1:
             self.setZoom(EricGraphicsView.ZoomLevels[index + 1])
-        
+
     def zoomOut(self):
         """
         Public method to zoom out.
@@ -141,18 +165,17 @@
         index = self.__levelForZoom(self.zoom())
         if index > 0:
             self.setZoom(EricGraphicsView.ZoomLevels[index - 1])
-    
+
     def zoomReset(self):
         """
         Public method to handle the reset the zoom value.
         """
-        self.setZoom(
-            EricGraphicsView.ZoomLevels[EricGraphicsView.ZoomLevelDefault])
-        
+        self.setZoom(EricGraphicsView.ZoomLevels[EricGraphicsView.ZoomLevelDefault])
+
     def setZoom(self, value):
         """
         Public method to set the zoom value in percent.
-        
+
         @param value zoom value in percent (integer)
         """
         if value != self.zoom():
@@ -160,19 +183,19 @@
             factor = value / 100.0
             self.scale(factor, factor)
             self.zoomValueChanged.emit(value)
-        
+
     def zoom(self):
         """
         Public method to get the current zoom factor in percent.
-        
+
         @return current zoom factor in percent (integer)
         """
         return int(self.transform().m11() * 100.0)
-       
+
     def resizeScene(self, amount, isWidth=True):
         """
         Public method to resize the scene.
-        
+
         @param amount size increment (integer)
         @param isWidth flag indicating width is to be resized (boolean)
         """
@@ -188,13 +211,13 @@
             width = rect.width()
         if height < rect.height():
             height = rect.height()
-        
+
         self.setSceneSize(width, height)
-        
+
     def setSceneSize(self, width, height):
         """
         Public method to set the scene size.
-        
+
         @param width width for the scene (real)
         @param height height for the scene (real)
         """
@@ -202,11 +225,11 @@
         rect.setHeight(height)
         rect.setWidth(width)
         self.scene().setSceneRect(rect)
-        
+
     def autoAdjustSceneSize(self, limit=False):
         """
         Public method to adjust the scene size to the diagram size.
-        
+
         @param limit flag indicating to limit the scene to the
             initial size (boolean)
         """
@@ -218,12 +241,12 @@
             newWidth = size.width()
             newHeight = size.height()
         self.setSceneSize(newWidth, newHeight)
-        
+
     def _getDiagramRect(self, border=0):
         """
         Protected method to calculate the minimum rectangle fitting the
         diagram.
-        
+
         @param border border width to include in the calculation (integer)
         @return the minimum rectangle (QRectF)
         """
@@ -251,13 +274,13 @@
             starty -= border
             endx += border
             endy += border
-            
+
         return QRectF(startx, starty, endx - startx + 1, endy - starty + 1)
-        
+
     def _getDiagramSize(self, border=0):
         """
         Protected method to calculate the minimum size fitting the diagram.
-        
+
         @param border border width to include in the calculation (integer)
         @return the minimum size (QSizeF)
         """
@@ -275,14 +298,14 @@
         if border:
             endx += border
             endy += border
-            
+
         return QSizeF(endx + 1, endy + 1)
-        
+
     def __getDiagram(self, rect, imageFormat="PNG", filename=None):
         """
         Private method to retrieve the diagram from the scene fitting it
         in the minimum rectangle.
-        
+
         @param rect minimum rectangle fitting the diagram
         @type QRectF
         @param imageFormat format for the image file
@@ -293,18 +316,19 @@
         @rtype QPixmap or QSvgGenerator
         """
         selectedItems = self.scene().selectedItems()
-        
+
         # step 1: deselect all widgets
         if selectedItems:
             for item in selectedItems:
                 item.setSelected(False)
-            
+
         # step 2: grab the diagram
         if imageFormat == "PNG":
             paintDevice = QPixmap(int(rect.width()), int(rect.height()))
             paintDevice.fill(self.backgroundBrush().color())
         else:
             from PyQt6.QtSvg import QSvgGenerator
+
             paintDevice = QSvgGenerator()
             paintDevice.setResolution(100)  # 100 dpi
             paintDevice.setSize(QSize(int(rect.width()), int(rect.height())))
@@ -313,18 +337,18 @@
         painter = QPainter(paintDevice)
         painter.setRenderHint(QPainter.RenderHint.Antialiasing, True)
         self.scene().render(painter, QRectF(), rect)
-        
+
         # step 3: reselect the widgets
         if selectedItems:
             for item in selectedItems:
                 item.setSelected(True)
-        
+
         return paintDevice
-        
+
     def saveImage(self, filename, imageFormat="PNG"):
         """
         Public method to save the scene to a file.
-        
+
         @param filename name of the file to write the image to (string)
         @param imageFormat format for the image file (string)
         @return flag indicating success (boolean)
@@ -336,73 +360,81 @@
         else:
             pixmap = self.__getDiagram(rect)
             return pixmap.save(filename, imageFormat)
-        
+
     def printDiagram(self, printer, diagramName=""):
         """
         Public method to print the diagram.
-        
+
         @param printer reference to a ready configured printer object
             (QPrinter)
         @param diagramName name of the diagram (string)
         """
         painter = QPainter(printer)
-        
+
         font = QFont(["times"], 10)
         painter.setFont(font)
         fm = painter.fontMetrics()
         fontHeight = fm.lineSpacing()
         marginX = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).x() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).x()
+            printer.pageLayout().paintRectPixels(printer.resolution()).x()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).x()
         )
         marginX = (
-            Preferences.getPrinter("LeftMargin") *
-            int(printer.resolution() / 2.54) - marginX
+            Preferences.getPrinter("LeftMargin") * int(printer.resolution() / 2.54)
+            - marginX
         )
         marginY = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).y() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).y()
+            printer.pageLayout().paintRectPixels(printer.resolution()).y()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).y()
         )
         marginY = (
-            Preferences.getPrinter("TopMargin") *
-            int(printer.resolution() / 2.54) - marginY
+            Preferences.getPrinter("TopMargin") * int(printer.resolution() / 2.54)
+            - marginY
         )
-        
+
         width = (
-            printer.width() - marginX -
-            Preferences.getPrinter("RightMargin") *
-            int(printer.resolution() / 2.54)
+            printer.width()
+            - marginX
+            - Preferences.getPrinter("RightMargin") * int(printer.resolution() / 2.54)
         )
         height = (
-            printer.height() - fontHeight - 4 - marginY -
-            Preferences.getPrinter("BottomMargin") *
-            int(printer.resolution() / 2.54)
+            printer.height()
+            - fontHeight
+            - 4
+            - marginY
+            - Preferences.getPrinter("BottomMargin") * int(printer.resolution() / 2.54)
         )
-        
-        self.scene().render(painter,
-                            target=QRectF(marginX, marginY, width, height))
-        
+
+        self.scene().render(painter, target=QRectF(marginX, marginY, width, height))
+
         # write a foot note
         tc = QColor(50, 50, 50)
         painter.setPen(tc)
         painter.drawRect(marginX, marginY, width, height)
-        painter.drawLine(marginX, marginY + height + 2,
-                         marginX + width, marginY + height + 2)
+        painter.drawLine(
+            marginX, marginY + height + 2, marginX + width, marginY + height + 2
+        )
         painter.setFont(font)
-        painter.drawText(marginX, marginY + height + 4, width,
-                         fontHeight, Qt.AlignmentFlag.AlignRight, diagramName)
-        
+        painter.drawText(
+            marginX,
+            marginY + height + 4,
+            width,
+            fontHeight,
+            Qt.AlignmentFlag.AlignRight,
+            diagramName,
+        )
+
         painter.end()
-    
+
     ###########################################################################
     ## The methods below should be overridden by subclasses to get special
     ## behavior.
     ###########################################################################
-    
+
     def filteredItems(self, items):
         """
         Public method to filter a list of items.
-        
+
         @param items list of items as returned by the scene object
             (QGraphicsItem)
         @return list of interesting collision items (QGraphicsItem)
--- a/src/eric7/EricGui/EricAction.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricGui/EricAction.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,26 +20,27 @@
     Class implementing an exception, which is raised, if the wrong number of
     arguments are given.
     """
+
     def __init__(self, error):
         """
         Constructor
-        
+
         @param error error message of the exception (string)
         """
         self.errorMessage = str(error)
-        
+
     def __repr__(self):
         """
         Special method returning a representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self.errorMessage)
-        
+
     def __str__(self):
         """
         Special method returning a string representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self.errorMessage)
@@ -49,10 +50,11 @@
     """
     Class implementing an Action class extending QAction.
     """
+
     def __init__(self, *args):
         """
         Constructor
-        
+
         @param args argument list of the constructor. This list is one of
             <ul>
             <li>text (string), icon (QIcon), menu text (string),
@@ -81,41 +83,45 @@
         if len(args) < 6 + incr:
             raise ArgumentsError(
                 "Not enough arguments, {0:d} expected, got {1:d}".format(
-                    6 + incr, len(args)))
+                    6 + incr, len(args)
+                )
+            )
         elif len(args) > 7 + incr:
             raise ArgumentsError(
                 "Too many arguments, max. {0:d} expected, got {1:d}".format(
-                    7 + incr, len(args)))
-            
+                    7 + incr, len(args)
+                )
+            )
+
         parent = args[4 + incr]
         super().__init__(parent)
         name = args[5 + incr]
         if name:
             self.setObjectName(name)
-        
+
         if args[1 + incr]:
             self.setText(args[1 + incr])
-        
+
         if args[0]:
             self.setIconText(args[0])
         if args[2 + incr]:
             self.setShortcut(QKeySequence(args[2 + incr]))
-        
+
         if args[3 + incr]:
             self.setAlternateShortcut(QKeySequence(args[3 + incr]))
-        
+
         if icon:
             self.setIcon(icon)
-        
+
         if len(args) == 7 + incr:
             self.setCheckable(args[6 + incr])
-        
+
         self.__ammendToolTip()
-        
+
     def setAlternateShortcut(self, shortcut, removeEmpty=False):
         """
         Public slot to set the alternative keyboard shortcut.
-        
+
         @param shortcut the alternative accelerator (QKeySequence)
         @param removeEmpty flag indicating to remove the alternate shortcut,
             if it is empty (boolean)
@@ -133,11 +139,11 @@
             if len(shortcuts) == 2:
                 del shortcuts[1]
                 self.setShortcuts(shortcuts)
-        
+
     def alternateShortcut(self):
         """
         Public method to retrieve the alternative keyboard shortcut.
-        
+
         @return the alternative accelerator (QKeySequence)
         """
         shortcuts = self.shortcuts()
@@ -145,42 +151,41 @@
             return QKeySequence()
         else:
             return shortcuts[1]
-        
+
     def setShortcut(self, shortcut):
         """
         Public slot to set the keyboard shortcut.
-        
+
         @param shortcut the accelerator (QKeySequence)
         """
         super().setShortcut(shortcut)
         self.__ammendToolTip()
-        
+
     def setShortcuts(self, shortcuts):
         """
         Public slot to set the list of keyboard shortcuts.
-        
+
         @param shortcuts list of keyboard accelerators (list of QKeySequence)
             or key for a platform dependent list of accelerators
             (QKeySequence.StandardKey)
         """
         super().setShortcuts(shortcuts)
         self.__ammendToolTip()
-        
+
     def setIconText(self, text):
         """
         Public slot to set the icon text of the action.
-        
+
         @param text new icon text (string)
         """
         super().setIconText(text)
         self.__ammendToolTip()
-        
+
     def __ammendToolTip(self):
         """
         Private slot to add the primary keyboard accelerator to the tooltip.
         """
-        shortcut = self.shortcut().toString(
-            QKeySequence.SequenceFormat.NativeText)
+        shortcut = self.shortcut().toString(QKeySequence.SequenceFormat.NativeText)
         if shortcut:
             if ericApp().isLeftToRight():
                 fmt = "{0} ({1})"
@@ -192,14 +197,14 @@
 def addActions(target, actions):
     """
     Module function to add a list of actions to a widget.
-    
+
     @param target reference to the target widget (QWidget)
     @param actions list of actions to be added to the target. A
         None indicates a separator (list of QActions)
     """
     if target is None:
         return
-    
+
     for action in actions:
         if action is None:
             target.addSeparator()
@@ -210,7 +215,7 @@
 def createActionGroup(parent, name=None, exclusive=False):
     """
     Module function to create an action group.
-    
+
     @param parent parent object of the action group (QObject)
     @param name name of the action group object (string)
     @param exclusive flag indicating an exclusive action group (boolean)
--- a/src/eric7/EricGui/EricGenericDiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricGui/EricGenericDiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,12 +17,13 @@
 def TERMINAL(pattern):
     """
     Function to mark a pattern as the final one to search for.
-    
+
     @param pattern pattern to be marked (string)
     @return marked pattern (string)
     """
     return "__TERMINAL__:{0}".format(pattern)
 
+
 # Cache the results of re.compile for performance reasons
 _REGEX_CACHE = {}
 
@@ -31,16 +32,17 @@
     """
     Class implementing a generic diff highlighter.
     """
+
     def __init__(self, doc):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         """
         super().__init__(doc)
-        
+
         self.regenerateRules()
-    
+
     def __initColours(self):
         """
         Private method to initialize the highlighter colours.
@@ -52,30 +54,30 @@
         self.contextColor = Preferences.getDiffColour("ContextColor")
         self.headerColor = Preferences.getDiffColour("HeaderColor")
         self.whitespaceColor = Preferences.getDiffColour("BadWhitespaceColor")
-    
+
     def createRules(self, *rules):
         """
         Public method to create the highlighting rules.
-        
+
         @param rules set of highlighting rules (list of tuples of rule
             pattern (string) and highlighting format (QTextCharFormat))
         """
         for _idx, ruleFormat in enumerate(rules):
             rule, formats = ruleFormat
-            terminal = rule.startswith(TERMINAL(''))
+            terminal = rule.startswith(TERMINAL(""))
             if terminal:
-                rule = rule[len(TERMINAL('')):]
+                rule = rule[len(TERMINAL("")) :]
             try:
                 regex = _REGEX_CACHE[rule]
             except KeyError:
                 regex = _REGEX_CACHE[rule] = re.compile(rule)
             self._rules.append((regex, formats, terminal))
-    
+
     def formats(self, line):
         """
         Public method to determine the highlighting formats for a line of
         text.
-        
+
         @param line text line to be highlighted (string)
         @return list of matched highlighting rules (list of tuples of match
             object and format (QTextCharFormat))
@@ -88,13 +90,13 @@
             matched.append([match, formats])
             if terminal:
                 return matched
-        
+
         return matched
-    
+
     def makeFormat(self, fg=None, bg=None, bold=False):
         """
         Public method to generate a format definition.
-        
+
         @param fg foreground color (QColor)
         @param bg background color (QColor)
         @param bold flag indicating bold text (boolean)
@@ -104,22 +106,22 @@
         charFormat = QTextCharFormat()
         charFormat.setFontFamilies([font.family()])
         charFormat.setFontPointSize(font.pointSize())
-        
+
         if fg:
             charFormat.setForeground(fg)
-        
+
         if bg:
             charFormat.setBackground(bg)
-        
+
         if bold:
             charFormat.setFontWeight(QFont.Weight.Bold)
-        
+
         return charFormat
-    
+
     def highlightBlock(self, text):
         """
         Public method to highlight a block of text.
-        
+
         @param text text to be highlighted (string)
         """
         formats = self.formats(text)
@@ -127,7 +129,7 @@
             # nothing matched
             self.setFormat(0, len(text), self.normalFormat)
             return
-        
+
         for match, formatStr in formats:
             start = match.start()
             groups = match.groups()
@@ -143,29 +145,28 @@
                 if not group:
                     # empty match
                     continue
-                
+
                 # allow None as a no-op format
                 length = len(group)
                 if formatStr[groupIndex]:
-                    self.setFormat(start, start + length,
-                                   formatStr[groupIndex])
+                    self.setFormat(start, start + length, formatStr[groupIndex])
                 start += length
-    
+
     def regenerateRules(self):
         """
         Public method to initialize or regenerate the syntax highlighter rules.
         """
         self.normalFormat = self.makeFormat()
-        
+
         self.__initColours()
-        
+
         self._rules = []
         self.generateRules()
-    
+
     def generateRules(self):
         """
         Public method to generate the rule set.
-        
+
         Note: This method must me implemented by derived syntax
         highlighters.
         """
--- a/src/eric7/EricGui/EricOverrideCursor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricGui/EricOverrideCursor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,32 +18,34 @@
     """
     Class implementing a context manager class for an override cursor.
     """
+
     def __init__(self, cursorShape=Qt.CursorShape.WaitCursor):
         """
         Constructor
-        
+
         @param cursorShape shape of the override cursor
         @type Qt.CursorShape
         """
         self.__cursorShape = cursorShape
-    
+
     def __enter__(self):
         """
         Special method called when entering the runtime ccontext.
-        
+
         @return reference to the context manager object
         @rtype EricOverrideCursor
         """
         QGuiApplication.setOverrideCursor(QCursor(self.__cursorShape))
         QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
+
         return self
-    
+
     def __exit__(self, exc_type, exc_value, traceback):
         """
         Special method called when exiting the runtime ccontext.
-        
+
         @param exc_type type of an exception raised in the runtime context
         @param exc_value value of an exception raised in the runtime context
         @param traceback traceback of an exception raised in the runtime
@@ -53,28 +55,30 @@
         """
         QGuiApplication.restoreOverrideCursor()
         QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
-        return None     # __IGNORE_WARNING_M831__
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
+
+        return None  # __IGNORE_WARNING_M831__
 
 
 class EricOverridenCursor(contextlib.AbstractContextManager):
     """
     Class implementing a context manager class for an overriden cursor.
-    
+
     The cursor is reset upon entering the runtime context and restored
     upon exiting it.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.__cursorShape = None
-    
+
     def __enter__(self):
         """
         Special method called when entering the runtime ccontext.
-        
+
         @return reference to the context manager object
         @rtype EricOverrideCursor
         """
@@ -83,14 +87,15 @@
             self.__cursorShape = cursor.shape()
             QGuiApplication.restoreOverrideCursor()
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
         return self
-    
+
     def __exit__(self, exc_type, exc_value, traceback):
         """
         Special method called when exiting the runtime ccontext.
-        
+
         @param exc_type type of an exception raised in the runtime context
         @param exc_value value of an exception raised in the runtime context
         @param traceback traceback of an exception raised in the runtime
@@ -101,31 +106,33 @@
         if self.__cursorShape is not None:
             QGuiApplication.setOverrideCursor(QCursor(self.__cursorShape))
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
-        return None     # __IGNORE_WARNING_M831__
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
+        return None  # __IGNORE_WARNING_M831__
 
 
 class EricOverrideCursorProcess(QProcess):
     """
     Class implementing a QProcess subclass controlling an override cursor.
     """
+
     def __init__(self, parent=None, cursorShape=Qt.CursorShape.WaitCursor):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         @param cursorShape shape of the override cursor
         @type Qt.CursorShape
         """
         super().__init__(parent)
-        
+
         self.__cursorShape = cursorShape
-        
+
         self.started.connect(self.__processStarted)
         self.finished.connect(self.__processFinished)
-    
+
     @pyqtSlot()
     def __processStarted(self):
         """
@@ -133,8 +140,9 @@
         """
         QGuiApplication.setOverrideCursor(QCursor(self.__cursorShape))
         QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-    
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
+
     @pyqtSlot()
     def __processFinished(self):
         """
@@ -142,4 +150,5 @@
         """
         QGuiApplication.restoreOverrideCursor()
         QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
--- a/src/eric7/EricNetwork/EricFtp.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricFtp.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,14 +9,14 @@
 """
 
 import enum
-import ftplib           # secok
+import ftplib  # secok
 from socket import _GLOBAL_DEFAULT_TIMEOUT
 
 
 class EricFtpProxyError(ftplib.Error):
     """
     Class to signal an error related to proxy configuration.
-    
+
     The error message starts with a three digit error code followed by a
     space and the error string. Supported error codes are:
     <ul>
@@ -37,6 +37,7 @@
       <li>992: proxy usage is enabled but no proxy password given</li>
     </ul>
     """
+
     pass
 
 
@@ -44,16 +45,17 @@
     """
     Class defining the supported FTP proxy types.
     """
-    NO_PROXY = 0                    # no proxy
-    NON_AUTHORIZING = 1             # non authorizing proxy
-    USER_SERVER = 2                 # proxy login first, than user@remote.host
-    SITE = 3                        # proxy login first, than use SITE command
-    OPEN = 4                        # proxy login first, than use OPEN command
-    USER_PROXYUSER_SERVER = 5       # one login for both
+
+    NO_PROXY = 0  # no proxy
+    NON_AUTHORIZING = 1  # non authorizing proxy
+    USER_SERVER = 2  # proxy login first, than user@remote.host
+    SITE = 3  # proxy login first, than use SITE command
+    OPEN = 4  # proxy login first, than use OPEN command
+    USER_PROXYUSER_SERVER = 5  # one login for both
     PROXYUSER_SERVER = 6
     # proxy login with remote host given, than normal remote login
     AUTH_RESP = 7  # authenticate to proxy with AUTH and RESP commands
-    BLUECOAT = 8                    # bluecoat proxy
+    BLUECOAT = 8  # bluecoat proxy
 
 
 class EricFtp(ftplib.FTP):
@@ -61,13 +63,24 @@
     Class implementing an extension to the Python FTP class to support FTP
     proxies.
     """
-    def __init__(self, host="", user="", password="", acct="",          # secok
-                 proxyType=EricFtpProxyType.NO_PROXY, proxyHost="",
-                 proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="",
-                 proxyAccount="", timeout=_GLOBAL_DEFAULT_TIMEOUT):
+
+    def __init__(
+        self,
+        host="",
+        user="",
+        password="",
+        acct="",  # secok
+        proxyType=EricFtpProxyType.NO_PROXY,
+        proxyHost="",
+        proxyPort=ftplib.FTP_PORT,
+        proxyUser="",
+        proxyPassword="",
+        proxyAccount="",
+        timeout=_GLOBAL_DEFAULT_TIMEOUT,
+    ):
         """
         Constructor
-        
+
         @param host name of the FTP host
         @type str
         @param user user name for login to FTP host
@@ -92,33 +105,39 @@
         @type int
         """
         super().__init__()
-        
+
         self.__timeout = timeout
-        
+
         self.__proxyType = proxyType
         self.__proxyHost = proxyHost
         self.__proxyPort = proxyPort
         self.__proxyUser = proxyUser
         self.__proxyPassword = proxyPassword
         self.__proxyAccount = proxyAccount
-        
+
         self.__host = host
         self.__port = ftplib.FTP_PORT
         self.__user = user
         self.__password = password
         self.__acct = acct
-        
+
         if host:
             self.connect(host)
             if user:
                 self.login(user, password, acct)
-    
-    def setProxy(self, proxyType=EricFtpProxyType.NO_PROXY, proxyHost="",
-                 proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="",
-                 proxyAccount=""):
+
+    def setProxy(
+        self,
+        proxyType=EricFtpProxyType.NO_PROXY,
+        proxyHost="",
+        proxyPort=ftplib.FTP_PORT,
+        proxyUser="",
+        proxyPassword="",
+        proxyAccount="",
+    ):
         """
         Public method to set the proxy configuration.
-        
+
         @param proxyType type of the FTP proxy
         @type EricFtpProxyType
         @param proxyHost name of the FTP proxy
@@ -138,12 +157,11 @@
         self.__proxyUser = proxyUser
         self.__proxyPassword = proxyPassword
         self.__proxyAccount = proxyAccount
-    
-    def setProxyAuthentication(self, proxyUser="", proxyPassword="",
-                               proxyAccount=""):
+
+    def setProxyAuthentication(self, proxyUser="", proxyPassword="", proxyAccount=""):
         """
         Public method to set the proxy authentication info.
-        
+
         @param proxyUser user name for login to the proxy
         @type str
         @param proxyPassword password  for login to the proxy
@@ -154,15 +172,15 @@
         self.__proxyUser = proxyUser
         self.__proxyPassword = proxyPassword
         self.__proxyAccount = proxyAccount
-    
+
     def connect(self, host="", port=0, timeout=-999):
         """
         Public method to connect to the given FTP server.
-        
+
         This extended method connects to the proxy instead of the given host,
         if a proxy is to be used. It throws an exception, if the proxy data
         is incomplete.
-        
+
         @param host name of the FTP host
         @type str
         @param port port of the FTP host
@@ -179,27 +197,26 @@
             self.__port = port
         if timeout != -999:
             self.__timeout = timeout
-        
+
         if self.__proxyType != EricFtpProxyType.NO_PROXY:
             if not self.__proxyHost:
                 raise EricFtpProxyError(
-                    "990 Proxy usage requested, but no proxy host given.")
-            
-            return super().connect(
-                self.__proxyHost, self.__proxyPort, self.__timeout)
+                    "990 Proxy usage requested, but no proxy host given."
+                )
+
+            return super().connect(self.__proxyHost, self.__proxyPort, self.__timeout)
         else:
-            return super().connect(
-                self.__host, self.__port, self.__timeout)
-    
-    def login(self, user="", password="", acct=""):         # secok
+            return super().connect(self.__host, self.__port, self.__timeout)
+
+    def login(self, user="", password="", acct=""):  # secok
         """
         Public method to login to the FTP server.
-        
+
         This extended method respects the FTP proxy configuration. There are
         many different FTP proxy products available. But unfortunately there
         is no standard for how o traverse a FTP proxy. The lis below shows
         the sequence of commands used.
-        
+
         <table>
           <tr><td>user</td><td>Username for remote host</td></tr>
           <tr><td>pass</td><td>Password for remote host</td></tr>
@@ -208,7 +225,7 @@
           <tr><td>remote.host</td><td>Hostname of the remote FTP server</td>
           </tr>
         </table>
-        
+
         <dl>
           <dt>EricFtpProxyType.NO_PROXY:</dt>
           <dd>
@@ -269,7 +286,7 @@
             ACCT prpass
           </dd>
         </dl>
-        
+
         @param user username for the remote host
         @type str
         @param password password for the remote host
@@ -285,34 +302,36 @@
             user = "anonymous"
         if not password:
             # make sure it is a string
-            password = ""           # secok
+            password = ""  # secok
         if not acct:
             # make sure it is a string
             acct = ""
-        if user == "anonymous" and password in {'', '-'}:
+        if user == "anonymous" and password in {"", "-"}:
             password += "anonymous@"
-        
+
         if self.__proxyType != EricFtpProxyType.NO_PROXY:
             if self.__proxyType != EricFtpProxyType.NON_AUTHORIZING:
                 # check, if a valid proxy configuration is known
                 if not self.__proxyUser:
                     raise EricFtpProxyError(
-                        "991 Proxy usage requested, but no proxy user given")
+                        "991 Proxy usage requested, but no proxy user given"
+                    )
                 if not self.__proxyPassword:
                     raise EricFtpProxyError(
-                        "992 Proxy usage requested, but no proxy password"
-                        " given")
-            
-            if self.__proxyType in [EricFtpProxyType.NON_AUTHORIZING,
-                                    EricFtpProxyType.AUTH_RESP,
-                                    EricFtpProxyType.BLUECOAT]:
+                        "992 Proxy usage requested, but no proxy password" " given"
+                    )
+
+            if self.__proxyType in [
+                EricFtpProxyType.NON_AUTHORIZING,
+                EricFtpProxyType.AUTH_RESP,
+                EricFtpProxyType.BLUECOAT,
+            ]:
                 user += "@" + self.__host
                 if self.__proxyType == EricFtpProxyType.BLUECOAT:
                     user += " " + self.__proxyUser
                     acct = self.__proxyPassword
             elif self.__proxyType == EricFtpProxyType.USER_PROXYUSER_SERVER:
-                user = "{0}@{1}@{2}".format(
-                    user, self.__proxyUser, self.__host)
+                user = "{0}@{1}@{2}".format(user, self.__proxyUser, self.__host)
                 password = "{0}@{1}".format(password, self.__proxyPassword)
             else:
                 pruser = self.__proxyUser
@@ -320,7 +339,7 @@
                     user += "@" + self.__host
                 elif self.__proxyType == EricFtpProxyType.PROXYUSER_SERVER:
                     pruser += "@" + self.__host
-                
+
                 # authenticate to the proxy first
                 presp = self.sendcmd("USER " + pruser)
                 if presp[0] == "3":
@@ -329,24 +348,28 @@
                     presp = self.sendcmd("ACCT " + self.__proxyAccount)
                 if presp[0] != "2":
                     raise EricFtpProxyError(
-                        "9{0}0 Error authorizing at proxy\n{1}".format(
-                            presp[0], presp))
-                
+                        "9{0}0 Error authorizing at proxy\n{1}".format(presp[0], presp)
+                    )
+
                 if self.__proxyType == EricFtpProxyType.SITE:
                     # send SITE command
                     presp = self.sendcmd("SITE " + self.__host)
                     if presp[0] != "2":
                         raise EricFtpProxyError(
                             "9{0}0 Error sending SITE command\n{1}".format(
-                                presp[0], presp))
+                                presp[0], presp
+                            )
+                        )
                 elif self.__proxyType == EricFtpProxyType.OPEN:
                     # send OPEN command
                     presp = self.sendcmd("OPEN " + self.__host)
                     if presp[0] != "2":
                         raise EricFtpProxyError(
                             "9{0}0 Error sending OPEN command\n{1}".format(
-                                presp[0], presp))
-        
+                                presp[0], presp
+                            )
+                        )
+
         # authenticate to the remote host or combined to proxy and remote host
         resp = self.sendcmd("USER " + user)
         if resp[0] == "3":
@@ -354,8 +377,8 @@
         if resp[0] == "3":
             resp = self.sendcmd("ACCT " + acct)
         if resp[0] != "2":
-            raise ftplib.error_reply(resp)          # secok
-        
+            raise ftplib.error_reply(resp)  # secok
+
         if self.__proxyType == EricFtpProxyType.AUTH_RESP:
             # authorize to the FTP proxy
             presp = self.sendcmd("AUTH " + self.__proxyUser)
@@ -363,7 +386,7 @@
                 presp = self.sendcmd("RESP " + self.__proxyPassword)
             if presp[0] != "2":
                 raise EricFtpProxyError(
-                    "9{0}0 Error authorizing at proxy\n{1}".format(
-                        presp[0], presp))
-        
+                    "9{0}0 Error authorizing at proxy\n{1}".format(presp[0], presp)
+                )
+
         return resp
--- a/src/eric7/EricNetwork/EricGoogleMail.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricGoogleMail.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,7 +25,10 @@
 import Globals
 
 from .EricGoogleMailHelpers import (
-    CLIENT_SECRET_FILE, SCOPES, TOKEN_FILE, APPLICATION_NAME
+    CLIENT_SECRET_FILE,
+    SCOPES,
+    TOKEN_FILE,
+    APPLICATION_NAME,
 )
 
 
@@ -33,46 +36,47 @@
     """
     Class implementing a simple web browser to perform the OAuth2
     authentication process.
-    
+
     @signal approvalCodeReceived(str) emitted to indicate the receipt of the
         approval code
     """
+
     approvalCodeReceived = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__layout = QVBoxLayout(self)
-        
+
         from PyQt6.QtWebEngineWidgets import QWebEngineView
+
         self.__browser = QWebEngineView(self)
         self.__browser.titleChanged.connect(self.__titleChanged)
         self.__browser.loadFinished.connect(self.__pageLoadFinished)
         self.__layout.addWidget(self.__browser)
-        
-        self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close)
+
+        self.__buttonBox = QDialogButtonBox(QDialogButtonBox.StandardButton.Close)
         self.__buttonBox.rejected.connect(self.reject)
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.resize(600, 700)
-    
+
     @pyqtSlot(str)
     def __titleChanged(self, title):
         """
         Private slot handling changes of the web page title.
-        
+
         @param title web page title
         @type str
         """
         self.setWindowTitle(title)
-    
+
     @pyqtSlot()
     def __pageLoadFinished(self):
         """
@@ -80,18 +84,20 @@
         """
         url = self.__browser.url()
         if url.toString().startswith(
-                "https://accounts.google.com/o/oauth2/approval/v2"):
+            "https://accounts.google.com/o/oauth2/approval/v2"
+        ):
             urlQuery = QUrlQuery(url)
             approvalCode = urlQuery.queryItemValue(
-                "approvalCode", QUrl.ComponentFormattingOption.FullyDecoded)
+                "approvalCode", QUrl.ComponentFormattingOption.FullyDecoded
+            )
             if approvalCode:
                 self.approvalCodeReceived.emit(approvalCode)
                 self.close()
-    
+
     def load(self, url):
         """
         Public method to start the authorization flow by loading the given URL.
-        
+
         @param url URL to be laoded
         @type str or QUrl
         """
@@ -101,46 +107,47 @@
 class EricGoogleMail(QObject):
     """
     Class implementing the logic to send emails via Google Mail.
-    
+
     @signal sendResult(bool, str) emitted to indicate the transmission result
         and a result message
     """
+
     sendResult = pyqtSignal(bool, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent=parent)
-        
+
         self.__messages = []
-        
+
         self.__session = None
         self.__clientConfig = {}
-        
+
         self.__browser = None
-    
+
     def sendMessage(self, message):
         """
         Public method to send a message via Google Mail.
-        
+
         @param message email message to be sent
         @type email.mime.text.MIMEBase
         """
         self.__messages.append(message)
-        
+
         if not self.__session:
             self.__startSession()
         else:
             self.__doSendMessages()
-    
+
     def __prepareMessage(self, message):
         """
         Private method to prepare the message for sending.
-        
+
         @param message message to be prepared
         @type email.mime.text.MIMEBase
         @return prepared message dictionary
@@ -148,178 +155,183 @@
         """
         messageAsBase64 = base64.urlsafe_b64encode(message.as_bytes())
         raw = messageAsBase64.decode()
-        return {'raw': raw}
-    
+        return {"raw": raw}
+
     def __startSession(self):
         """
         Private method to start an authorized session and optionally start the
         authorization flow.
         """
         # check for availability of secrets file
-        if not os.path.exists(os.path.join(Globals.getConfigDir(),
-                                           CLIENT_SECRET_FILE)):
+        if not os.path.exists(os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE)):
             self.sendResult.emit(
                 False,
-                self.tr("The client secrets file is not present. Has the Gmail"
-                        " API been enabled?")
+                self.tr(
+                    "The client secrets file is not present. Has the Gmail"
+                    " API been enabled?"
+                ),
             )
             return
-        
-        with open(os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE),
-                  "r") as clientSecret:
+
+        with open(
+            os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE), "r"
+        ) as clientSecret:
             clientData = json.load(clientSecret)
-            self.__clientConfig = clientData['installed']
+            self.__clientConfig = clientData["installed"]
         token = self.__loadToken()
         if token is None:
             # no valid OAuth2 token available
             self.__session = OAuth2Session(
-                self.__clientConfig['client_id'],
+                self.__clientConfig["client_id"],
                 scope=SCOPES,
-                redirect_uri=self.__clientConfig['redirect_uris'][0]
+                redirect_uri=self.__clientConfig["redirect_uris"][0],
             )
             authorizationUrl, _ = self.__session.authorization_url(
-                self.__clientConfig['auth_uri'],
+                self.__clientConfig["auth_uri"],
                 access_type="offline",
-                prompt="select_account"
+                prompt="select_account",
             )
             if self.__browser is None:
                 with contextlib.suppress(ImportError):
                     self.__browser = EricGoogleMailAuthBrowser()
                     self.__browser.approvalCodeReceived.connect(
-                        self.__processAuthorization)
+                        self.__processAuthorization
+                    )
             if self.__browser:
                 self.__browser.show()
                 self.__browser.load(QUrl(authorizationUrl))
             else:
                 from PyQt6.QtGui import QDesktopServices
+
                 QDesktopServices.openUrl(QUrl(authorizationUrl))
                 ok, authCode = EricTextInputDialog.getText(
                     None,
                     self.tr("OAuth2 Authorization Code"),
-                    self.tr("Enter the OAuth2 authorization code:"))
+                    self.tr("Enter the OAuth2 authorization code:"),
+                )
                 if ok and authCode:
                     self.__processAuthorization(authCode)
                 else:
                     self.__session = None
         else:
             self.__session = OAuth2Session(
-                self.__clientConfig['client_id'],
+                self.__clientConfig["client_id"],
                 scope=SCOPES,
-                redirect_uri=self.__clientConfig['redirect_uris'][0],
+                redirect_uri=self.__clientConfig["redirect_uris"][0],
                 token=token,
                 auto_refresh_kwargs={
-                    'client_id': self.__clientConfig['client_id'],
-                    'client_secret': self.__clientConfig['client_secret'],
+                    "client_id": self.__clientConfig["client_id"],
+                    "client_secret": self.__clientConfig["client_secret"],
                 },
-                auto_refresh_url=self.__clientConfig['token_uri'],
-                token_updater=self.__saveToken)
+                auto_refresh_url=self.__clientConfig["token_uri"],
+                token_updater=self.__saveToken,
+            )
             self.__doSendMessages()
-    
+
     @pyqtSlot(str)
     def __processAuthorization(self, authCode):
         """
         Private slot to process the received authorization code.
-        
+
         @param authCode received authorization code
         @type str
         """
         self.__session.fetch_token(
-            self.__clientConfig['token_uri'],
-            client_secret=self.__clientConfig['client_secret'],
-            code=authCode)
+            self.__clientConfig["token_uri"],
+            client_secret=self.__clientConfig["client_secret"],
+            code=authCode,
+        )
         self.__saveToken(self.__session.token)
-        
+
         # authorization completed; now send all queued messages
         self.__doSendMessages()
-    
+
     def __doSendMessages(self):
         """
         Private method to send all queued messages.
         """
         if not self.__session:
-            self.sendResult.emit(
-                False,
-                self.tr("No authorized session available.")
-            )
+            self.sendResult.emit(False, self.tr("No authorized session available."))
             return
-        
+
         try:
             results = []
             credentials = self.__credentialsFromSession()
-            service = discovery.build('gmail', 'v1', credentials=credentials,
-                                      cache_discovery=False)
+            service = discovery.build(
+                "gmail", "v1", credentials=credentials, cache_discovery=False
+            )
             count = 0
             while self.__messages:
                 count += 1
                 message = self.__messages.pop(0)
                 message1 = self.__prepareMessage(message)
-                service.users().messages().send(
-                    userId="me", body=message1).execute()
+                service.users().messages().send(userId="me", body=message1).execute()
                 results.append(self.tr("Message #{0} sent.").format(count))
 
             self.sendResult.emit(True, "\n\n".join(results))
         except Exception as error:
             self.sendResult.emit(False, str(error))
-    
+
     def __loadToken(self):
         """
         Private method to load a token from the token file.
-        
+
         @return loaded token
         @rtype dict or None
         """
-        homeDir = os.path.expanduser('~')
-        credentialsDir = os.path.join(homeDir, '.credentials')
+        homeDir = os.path.expanduser("~")
+        credentialsDir = os.path.join(homeDir, ".credentials")
         if not os.path.exists(credentialsDir):
             os.makedirs(credentialsDir)
         tokenPath = os.path.join(credentialsDir, TOKEN_FILE)
-        
+
         if os.path.exists(tokenPath):
             with open(tokenPath, "r") as tokenFile:
                 return json.load(tokenFile)
         else:
             return None
-    
+
     def __saveToken(self, token):
         """
         Private method to save a token to the token file.
-        
+
         @param token token to be saved
         @type dict
         """
-        homeDir = os.path.expanduser('~')
-        credentialsDir = os.path.join(homeDir, '.credentials')
+        homeDir = os.path.expanduser("~")
+        credentialsDir = os.path.join(homeDir, ".credentials")
         if not os.path.exists(credentialsDir):
             os.makedirs(credentialsDir)
         tokenPath = os.path.join(credentialsDir, TOKEN_FILE)
-        
+
         with open(tokenPath, "w") as tokenFile:
             json.dump(token, tokenFile)
-    
+
     def __credentialsFromSession(self):
         """
         Private method to create a credentials object.
-        
+
         @return created credentials object
         @rtype google.oauth2.credentials.Credentials
         """
         credentials = None
-        
+
         if self.__clientConfig and self.__session:
             token = self.__session.token
             if token:
                 credentials = Credentials(
-                    token['access_token'],
-                    refresh_token=token.get('refresh_token'),
-                    id_token=token.get('id_token'),
-                    token_uri=self.__clientConfig['token_uri'],
-                    client_id=self.__clientConfig['client_id'],
-                    client_secret=self.__clientConfig['client_secret'],
-                    scopes=SCOPES
+                    token["access_token"],
+                    refresh_token=token.get("refresh_token"),
+                    id_token=token.get("id_token"),
+                    token_uri=self.__clientConfig["token_uri"],
+                    client_id=self.__clientConfig["client_id"],
+                    client_secret=self.__clientConfig["client_secret"],
+                    scopes=SCOPES,
                 )
                 credentials.expiry = datetime.datetime.fromtimestamp(
-                    token['expires_at'])
-        
+                    token["expires_at"]
+                )
+
         return credentials
 
 
@@ -327,7 +339,7 @@
     """
     Module function to get some help about how to enable the Google Mail
     OAuth2 service.
-    
+
     @return help text
     @rtype str
     """
@@ -354,6 +366,6 @@
             "https://console.developers.google.com/start/api?id=gmail",
             APPLICATION_NAME,
             Globals.getConfigDir(),
-            CLIENT_SECRET_FILE
+            CLIENT_SECRET_FILE,
         )
     )
--- a/src/eric7/EricNetwork/EricGoogleMailHelpers.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricGoogleMailHelpers.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,10 +11,10 @@
 
 import Globals
 
-SCOPES = 'https://www.googleapis.com/auth/gmail.send'
-CLIENT_SECRET_FILE = 'eric_client_secret.json'          # secok
-TOKEN_FILE = 'eric_python_email_send_token.json'        # secok
-APPLICATION_NAME = 'Eric Python Send Email'
+SCOPES = "https://www.googleapis.com/auth/gmail.send"
+CLIENT_SECRET_FILE = "eric_client_secret.json"  # secok
+TOKEN_FILE = "eric_python_email_send_token.json"  # secok
+APPLICATION_NAME = "Eric Python Send Email"
 
 RequiredPackages = (
     "google-api-python-client",
@@ -25,23 +25,21 @@
 def isClientSecretFileAvailable():
     """
     Module function to check, if the client secret file has been installed.
-    
+
     @return flag indicating, that the credentials file is there
     @rtype bool
     """
-    return os.path.exists(
-        os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE))
+    return os.path.exists(os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE))
 
 
 def getInstallCommand():
     """
     Module function to get the install command to get the Google mail support
     activated.
-    
+
     @return install command
     @rtype str
     """
-    pipCommand = "pip install --upgrade {0}".format(
-        " ".join(RequiredPackages))
-    
+    pipCommand = "pip install --upgrade {0}".format(" ".join(RequiredPackages))
+
     return pipCommand
--- a/src/eric7/EricNetwork/EricJsonClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricJsonClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing a JSON based client base class.
     """
+
     def __init__(self, host, port, idString=""):
         """
         Constructor
-        
+
         @param host IP address the background service is listening
         @type str
         @param port port of the background service
@@ -34,13 +35,13 @@
         """
         self.__connection = socket.create_connection((host, port))
         if idString:
-            reply = idString + '\n'
-            self.__connection.sendall(reply.encode('utf8', 'backslashreplace'))
-    
+            reply = idString + "\n"
+            self.__connection.sendall(reply.encode("utf8", "backslashreplace"))
+
     def sendJson(self, command, params):
         """
         Public method to send a single refactoring command to the server.
-        
+
         @param command command name to be sent
         @type str
         @param params dictionary of named parameters for the command
@@ -51,14 +52,14 @@
             "method": command,
             "params": params,
         }
-        cmd = json.dumps(commandDict) + '\n'
-        self.__connection.sendall(cmd.encode('utf8', 'backslashreplace'))
-    
+        cmd = json.dumps(commandDict) + "\n"
+        self.__connection.sendall(cmd.encode("utf8", "backslashreplace"))
+
     def __receiveJson(self):
         """
         Private method to receive a JSON encode command and data from the
         server.
-        
+
         @return tuple containing the received command and a dictionary
             containing the associated data
         @rtype tuple of (str, dict)
@@ -69,48 +70,50 @@
         if len(length) < 9:
             # invalid length string received
             return None, None
-        
+
         length = int(length)
-        data = b''
+        data = b""
         while len(data) < length:
             newData = self.__connection.recv(length - len(data))
             if not newData:
                 return None, None
-            
+
             data += newData
-        
+
         # step 2: decode and convert the data
-        line = data.decode(
-            'utf8', 'backslashreplace')
+        line = data.decode("utf8", "backslashreplace")
         try:
             commandDict = json.loads(line.strip())
         except (TypeError, ValueError) as err:
-            self.sendJson("ClientException", {
-                "ExceptionType": "ProtocolError",
-                "ExceptionValue": str(err),
-                "ProtocolData": line.strip(),
-            })
+            self.sendJson(
+                "ClientException",
+                {
+                    "ExceptionType": "ProtocolError",
+                    "ExceptionValue": str(err),
+                    "ProtocolData": line.strip(),
+                },
+            )
             return None, None
-        
+
         method = commandDict["method"]
         params = commandDict["params"]
-        
+
         return method, params
-    
+
     def handleCall(self, method, params):
         """
         Public method to handle a method call from the server.
-        
+
         Note: This is an empty implementation that must be overridden in
         derived classes.
-        
+
         @param method requested method name
         @type str
         @param params dictionary with method specific parameters
         @type dict
         """
         pass
-    
+
     def run(self):
         """
         Public method implementing the main loop of the client.
@@ -119,9 +122,8 @@
             selectErrors = 0
             while selectErrors <= 10:  # selected arbitrarily
                 try:
-                    rrdy, wrdy, xrdy = select.select(
-                        [self.__connection], [], [])
-                    
+                    rrdy, wrdy, xrdy = select.select([self.__connection], [], [])
+
                     # Just waiting for self.__connection. Therefor no check
                     # needed.
                     method, params = self.__receiveJson()
@@ -131,13 +133,13 @@
                         break
                     else:
                         self.handleCall(method, params)
-                        
+
                         # reset select errors
                         selectErrors = 0
-                
+
                 except (select.error, KeyboardInterrupt, socket.error):
                     selectErrors += 1
-        
+
         except Exception:
             exctype, excval, exctb = sys.exc_info()
             tbinfofile = io.StringIO()
@@ -145,21 +147,24 @@
             tbinfofile.seek(0)
             tbinfo = tbinfofile.read()
             del exctb
-            self.sendJson("ClientException", {
-                "ExceptionType": str(exctype),
-                "ExceptionValue": str(excval),
-                "Traceback": tbinfo,
-            })
+            self.sendJson(
+                "ClientException",
+                {
+                    "ExceptionType": str(exctype),
+                    "ExceptionValue": str(excval),
+                    "Traceback": tbinfo,
+                },
+            )
 
         # Give time to process latest response on server side
         with contextlib.suppress(socket.error, OSError):
             self.__connection.shutdown(socket.SHUT_RDWR)
             self.__connection.close()
-    
+
     def poll(self, waitMethod=""):
         """
         Public method to check and receive one message (if available).
-        
+
         @param waitMethod name of a method to wait for
         @type str
         @return dictionary containing the data of the waited for method
@@ -167,12 +172,10 @@
         """
         try:
             if waitMethod:
-                rrdy, wrdy, xrdy = select.select(
-                    [self.__connection], [], [])
+                rrdy, wrdy, xrdy = select.select([self.__connection], [], [])
             else:
-                rrdy, wrdy, xrdy = select.select(
-                    [self.__connection], [], [], 0)
-            
+                rrdy, wrdy, xrdy = select.select([self.__connection], [], [], 0)
+
             if self.__connection in rrdy:
                 method, params = self.__receiveJson()
                 if method is not None:
@@ -182,11 +185,11 @@
                         return params
                     else:
                         self.handleCall(method, params)
-        
+
         except (select.error, KeyboardInterrupt, socket.error):
             # just ignore these
             pass
-        
+
         except Exception:
             exctype, excval, exctb = sys.exc_info()
             tbinfofile = io.StringIO()
@@ -194,10 +197,13 @@
             tbinfofile.seek(0)
             tbinfo = tbinfofile.read()
             del exctb
-            self.sendJson("ClientException", {
-                "ExceptionType": str(exctype),
-                "ExceptionValue": str(excval),
-                "Traceback": tbinfo,
-            })
-        
+            self.sendJson(
+                "ClientException",
+                {
+                    "ExceptionType": str(exctype),
+                    "ExceptionValue": str(excval),
+                    "Traceback": tbinfo,
+                },
+            )
+
         return None
--- a/src/eric7/EricNetwork/EricJsonServer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricJsonServer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,13 @@
 import json
 
 from PyQt6.QtCore import (
-    pyqtSlot, QProcess, QProcessEnvironment, QCoreApplication, QEventLoop,
-    QTimer, QThread
+    pyqtSlot,
+    QProcess,
+    QProcessEnvironment,
+    QCoreApplication,
+    QEventLoop,
+    QTimer,
+    QThread,
 )
 from PyQt6.QtNetwork import QTcpServer, QHostAddress
 
@@ -26,10 +31,11 @@
     """
     Class implementing a JSON based server base class.
     """
+
     def __init__(self, name="", multiplex=False, parent=None):
         """
         Constructor
-        
+
         @param name name of the server (used for output only)
         @type str
         @param multiplex flag indicating a multiplexing server
@@ -38,7 +44,7 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__name = name
         self.__multiplex = multiplex
         if self.__multiplex:
@@ -47,23 +53,26 @@
         else:
             self.__clientProcess = None
             self.__connection = None
-        
+
         # setup the network interface
         networkInterface = Preferences.getDebugger("NetworkInterface")
-        if networkInterface == "all" or '.' in networkInterface:
+        if networkInterface == "all" or "." in networkInterface:
             # IPv4
-            self.__hostAddress = '127.0.0.1'
+            self.__hostAddress = "127.0.0.1"
         else:
             # IPv6
-            self.__hostAddress = '::1'
+            self.__hostAddress = "::1"
         self.listen(QHostAddress(self.__hostAddress))
 
         self.newConnection.connect(self.handleNewConnection)
-        
+
         ## Note: Need the port if client is started external in debugger.
-        print('JSON server ({1}) listening on: {0:d}'   # __IGNORE_WARNING__
-              .format(self.serverPort(), self.__name))
-    
+        print(  # __IGNORE_WARNING_M801__
+            "JSON server ({1}) listening on: {0:d}".format(
+                self.serverPort(), self.__name
+            )
+        )
+
     @pyqtSlot()
     def handleNewConnection(self):
         """
@@ -72,12 +81,13 @@
         connection = self.nextPendingConnection()
         if not connection.isValid():
             return
-        
+
         if self.__multiplex:
             if not connection.waitForReadyRead(3000):
                 return
-            idString = bytes(connection.readLine()).decode(
-                "utf-8", 'backslashreplace').strip()
+            idString = (
+                bytes(connection.readLine()).decode("utf-8", "backslashreplace").strip()
+            )
             if idString in self.__connections:
                 self.__connections[idString].close()
             self.__connections[idString] = connection
@@ -85,19 +95,17 @@
             idString = ""
             if self.__connection is not None:
                 self.__connection.close()
-            
+
             self.__connection = connection
-        
-        connection.readyRead.connect(
-            lambda: self.__receiveJson(idString))
-        connection.disconnected.connect(
-            lambda: self.__handleDisconnect(idString))
-    
+
+        connection.readyRead.connect(lambda: self.__receiveJson(idString))
+        connection.disconnected.connect(lambda: self.__handleDisconnect(idString))
+
     @pyqtSlot()
     def __handleDisconnect(self, idString):
         """
         Private slot handling a disconnect of the client.
-        
+
         @param idString id of the connection been disconnected
         @type str
         """
@@ -108,15 +116,15 @@
         else:
             if self.__connection is not None:
                 self.__connection.close()
-            
+
             self.__connection = None
-    
+
     def connectionNames(self):
         """
         Public method to get the list of active connection names.
-        
+
         If this is not a multiplexing server, an empty list is returned.
-        
+
         @return list of active connection names
         @rtype list of str
         """
@@ -124,12 +132,12 @@
             return list(self.__connections.keys())
         else:
             return []
-    
+
     @pyqtSlot()
     def __receiveJson(self, idString):
         """
         Private slot handling received data from the client.
-        
+
         @param idString id of the connection
         @type str
         """
@@ -140,36 +148,38 @@
                 connection = None
         else:
             connection = self.__connection
-        
+
         while connection and connection.canReadLine():
             data = connection.readLine()
-            jsonLine = bytes(data).decode("utf-8", 'backslashreplace')
-            
-            #- print("JSON Server ({0}): {1}".format(self.__name, jsonLine))
-            #- this is for debugging only
-            
+            jsonLine = bytes(data).decode("utf-8", "backslashreplace")
+
+            # - print("JSON Server ({0}): {1}".format(self.__name, jsonLine))
+            # - this is for debugging only
+
             try:
                 clientDict = json.loads(jsonLine.strip())
             except (TypeError, ValueError) as err:
                 EricMessageBox.critical(
                     None,
                     self.tr("JSON Protocol Error"),
-                    self.tr("""<p>The response received from the client"""
-                            """ could not be decoded. Please report"""
-                            """ this issue with the received data to the"""
-                            """ eric bugs email address.</p>"""
-                            """<p>Error: {0}</p>"""
-                            """<p>Data:<br/>{1}</p>""").format(
-                        str(err), Utilities.html_encode(jsonLine.strip())),
-                    EricMessageBox.Ok)
+                    self.tr(
+                        """<p>The response received from the client"""
+                        """ could not be decoded. Please report"""
+                        """ this issue with the received data to the"""
+                        """ eric bugs email address.</p>"""
+                        """<p>Error: {0}</p>"""
+                        """<p>Data:<br/>{1}</p>"""
+                    ).format(str(err), Utilities.html_encode(jsonLine.strip())),
+                    EricMessageBox.Ok,
+                )
                 return
-            
+
             self.handleCall(clientDict["method"], clientDict["params"])
-    
+
     def sendJson(self, command, params, flush=False, idString=""):
         """
         Public method to send a single command to a client.
-        
+
         @param command command name to be sent
         @type str
         @param params dictionary of named parameters for the command
@@ -184,8 +194,8 @@
             "method": command,
             "params": params,
         }
-        cmd = json.dumps(commandDict) + '\n'
-        
+        cmd = json.dumps(commandDict) + "\n"
+
         if idString:
             try:
                 connection = self.__connections[idString]
@@ -193,19 +203,20 @@
                 connection = None
         else:
             connection = self.__connection
-        
+
         if connection is not None:
-            data = cmd.encode('utf8', 'backslashreplace')
+            data = cmd.encode("utf8", "backslashreplace")
             length = "{0:09d}".format(len(data))
             connection.write(length.encode() + data)
             if flush:
                 connection.flush()
-    
-    def startClient(self, interpreter, clientScript, clientArgs, idString="",
-                    environment=None):
+
+    def startClient(
+        self, interpreter, clientScript, clientArgs, idString="", environment=None
+    ):
         """
         Public method to start a client process.
-        
+
         @param interpreter interpreter to be used for the client
         @type str
         @param clientScript path to the client script
@@ -221,12 +232,11 @@
         """
         if interpreter == "" or not Utilities.isinpath(interpreter):
             return False
-        
+
         exitCode = None
-        
+
         proc = QProcess()
-        proc.setProcessChannelMode(
-            QProcess.ProcessChannelMode.ForwardedChannels)
+        proc.setProcessChannelMode(QProcess.ProcessChannelMode.ForwardedChannels)
         if environment is not None:
             env = QProcessEnvironment()
             for key, value in list(environment.items()):
@@ -239,58 +249,57 @@
         proc.start(interpreter, args)
         if not proc.waitForStarted(10000):
             proc = None
-        
+
         if idString:
             self.__clientProcesses[idString] = proc
             if proc:
                 timer = QTimer()
                 timer.setSingleShot(True)
-                timer.start(30000)           # 30s timeout
-                while (
-                    idString not in self.connectionNames() and
-                    timer.isActive()
-                ):
+                timer.start(30000)  # 30s timeout
+                while idString not in self.connectionNames() and timer.isActive():
                     # Give the event loop the chance to process the new
                     # connection of the client (= slow start).
                     QCoreApplication.processEvents(
-                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+                    )
                     QThread.msleep(100)
-                    
+
                     # check if client exited prematurely
                     if proc.state() == QProcess.ProcessState.NotRunning:
                         exitCode = proc.exitCode()
                         proc = None
                         self.__clientProcesses[idString] = None
                         break
-                    
+
                     QThread.msleep(500)
         else:
             if proc:
                 timer = QTimer()
                 timer.setSingleShot(True)
-                timer.start(1000)           # 1s timeout
+                timer.start(1000)  # 1s timeout
                 while timer.isActive():
                     # check if client exited prematurely
                     QCoreApplication.processEvents(
-                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+                    )
                     QThread.msleep(100)
                     if proc.state() == QProcess.ProcessState.NotRunning:
                         exitCode = proc.exitCode()
                         proc = None
                         break
             self.__clientProcess = proc
-        
+
         return proc is not None, exitCode
-    
+
     def stopClient(self, idString=""):
         """
         Public method to stop a client process.
-        
+
         @param idString id of the client to be stopped
         @type str
         """
         self.sendJson("Exit", {}, flush=True, idString=idString)
-        
+
         if idString:
             try:
                 connection = self.__connections[idString]
@@ -300,17 +309,17 @@
             connection = self.__connection
         if connection is not None:
             connection.waitForDisconnected()
-        
+
         if idString:
             with contextlib.suppress(KeyError):
-                if self .__clientProcesses[idString] is not None:
-                    self .__clientProcesses[idString].close()
+                if self.__clientProcesses[idString] is not None:
+                    self.__clientProcesses[idString].close()
                 del self.__clientProcesses[idString]
         else:
             if self.__clientProcess is not None:
                 self.__clientProcess.close()
                 self.__clientProcess = None
-    
+
     def stopAllClients(self):
         """
         Public method to stop all clients.
@@ -318,18 +327,18 @@
         clientNames = self.connectionNames()[:]
         for clientName in clientNames:
             self.stopClient(clientName)
-    
+
     #######################################################################
     ## The following methods should be overridden by derived classes
     #######################################################################
-    
+
     def handleCall(self, method, params):
         """
         Public method to handle a method call from the client.
-        
+
         Note: This is an empty implementation that must be overridden in
         derived classes.
-        
+
         @param method requested method name
         @type str
         @param params dictionary with method specific parameters
--- a/src/eric7/EricNetwork/EricJsonStreamReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricJsonStreamReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,18 +21,19 @@
 class EricJsonReader(QTcpServer):
     """
     Class implementing a JSON based reader class.
-    
+
     The reader is responsible for opening a socket to listen for writer
     connections.
-    
+
     @signal dataReceived(object) emitted after a data object was received
     """
+
     dataReceived = pyqtSignal(object)
-    
+
     def __init__(self, name="", ip=None, parent=None):
         """
         Constructor
-        
+
         @param name name of the server (used for output only)
         @type str
         @param ip IP address to listen at
@@ -41,47 +42,50 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__name = name
         self.__connection = None
-        
+
         # setup the network interface
         if ip is None:
             networkInterface = Preferences.getDebugger("NetworkInterface")
-            if networkInterface == "all" or '.' in networkInterface:
+            if networkInterface == "all" or "." in networkInterface:
                 # IPv4
-                self.__hostAddress = '127.0.0.1'
+                self.__hostAddress = "127.0.0.1"
             else:
                 # IPv6
-                self.__hostAddress = '::1'
+                self.__hostAddress = "::1"
         else:
             self.__hostAddress = ip
         self.listen(QHostAddress(self.__hostAddress))
 
         self.newConnection.connect(self.handleNewConnection)
-        
+
         ## Note: Need the port if writer is started external in debugger.
-        print('JSON reader ({1}) listening on: {0:d}'   # __IGNORE_WARNING__
-              .format(self.serverPort(), self.__name))
-    
+        print(  # __IGNORE_WARNING_M801__
+            "JSON reader ({1}) listening on: {0:d}".format(
+                self.serverPort(), self.__name
+            )
+        )
+
     def address(self):
         """
         Public method to get the host address.
-        
+
         @return host address
         @rtype str
         """
         return self.__hostAddress
-    
+
     def port(self):
         """
         Public method to get the port number to connect to.
-        
+
         @return port number
         @rtype int
         """
         return self.serverPort()
-    
+
     @pyqtSlot()
     def handleNewConnection(self):
         """
@@ -90,26 +94,26 @@
         connection = self.nextPendingConnection()
         if not connection.isValid():
             return
-        
+
         if self.__connection is not None:
             self.__connection.close()
-        
+
         self.__connection = connection
-        
+
         connection.readyRead.connect(self.__receiveJson)
         connection.disconnected.connect(self.__handleDisconnect)
-    
+
     @pyqtSlot()
     def __handleDisconnect(self):
         """
         Private slot handling a disconnect of the writer.
         """
         if self.__connection is not None:
-            self.__receiveJson()    # read all buffered data first
+            self.__receiveJson()  # read all buffered data first
             self.__connection.close()
-        
+
         self.__connection = None
-    
+
     @pyqtSlot()
     def __receiveJson(self):
         """
@@ -117,25 +121,27 @@
         """
         while self.__connection and self.__connection.canReadLine():
             dataStr = self.__connection.readLine()
-            jsonLine = bytes(dataStr).decode("utf-8", 'backslashreplace')
-            
-            #- print("JSON Reader ({0}): {1}".format(self.__name, jsonLine))
-            #- this is for debugging only
-            
+            jsonLine = bytes(dataStr).decode("utf-8", "backslashreplace")
+
+            # - print("JSON Reader ({0}): {1}".format(self.__name, jsonLine))
+            # - this is for debugging only
+
             try:
                 data = json.loads(jsonLine.strip())
             except (TypeError, ValueError) as err:
                 EricMessageBox.critical(
                     None,
                     self.tr("JSON Protocol Error"),
-                    self.tr("""<p>The data received from the writer"""
-                            """ could not be decoded. Please report"""
-                            """ this issue with the received data to the"""
-                            """ eric bugs email address.</p>"""
-                            """<p>Error: {0}</p>"""
-                            """<p>Data:<br/>{1}</p>""").format(
-                        str(err), Utilities.html_encode(jsonLine.strip())),
-                    EricMessageBox.Ok)
+                    self.tr(
+                        """<p>The data received from the writer"""
+                        """ could not be decoded. Please report"""
+                        """ this issue with the received data to the"""
+                        """ eric bugs email address.</p>"""
+                        """<p>Error: {0}</p>"""
+                        """<p>Data:<br/>{1}</p>"""
+                    ).format(str(err), Utilities.html_encode(jsonLine.strip())),
+                    EricMessageBox.Ok,
+                )
                 return
-            
+
             self.dataReceived.emit(data)
--- a/src/eric7/EricNetwork/EricJsonStreamWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricJsonStreamWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,27 +15,28 @@
     """
     Class implementing a JSON based writer class.
     """
+
     def __init__(self, host, port):
         """
         Constructor
-        
+
         @param host IP address the reader is listening on
         @type str
         @param port port the reader is listening on
         @type int
         """
         self.__connection = socket.create_connection((host, port))
-    
+
     def write(self, data):
         """
         Public method to send JSON serializable data.
-        
+
         @param data JSON serializable object to be sent
         @type object
         """
-        dataStr = json.dumps(data) + '\n'
-        self.__connection.sendall(dataStr.encode('utf8', 'backslashreplace'))
-    
+        dataStr = json.dumps(data) + "\n"
+        self.__connection.sendall(dataStr.encode("utf8", "backslashreplace"))
+
     def close(self):
         """
         Public method to close the stream.
--- a/src/eric7/EricNetwork/EricNetworkIcon.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricNetworkIcon.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,72 +18,74 @@
 class EricNetworkIcon(QLabel):
     """
     Class implementing a statusbar icon tracking the network status.
-    
+
     @signal onlineStateChanged(online) emitted to indicate a change of the
         network state
     @signal reachabilityStateChanged(reachability) emitted to indicate a
         change of the network reachability
     """
+
     onlineStateChanged = pyqtSignal(bool)
     reachabilityStateChanged = pyqtSignal(QNetworkInformation.Reachability)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
-        if (
-            Preferences.getUI("DynamicOnlineCheck") and
-            QNetworkInformation.load(QNetworkInformation.Feature.Reachability)
+
+        if Preferences.getUI("DynamicOnlineCheck") and QNetworkInformation.load(
+            QNetworkInformation.Feature.Reachability
         ):
             self.__online = (
-                QNetworkInformation.instance().reachability() ==
-                QNetworkInformation.Reachability.Online
+                QNetworkInformation.instance().reachability()
+                == QNetworkInformation.Reachability.Online
             )
-            self.__reachabilityChanged(
-                QNetworkInformation.instance().reachability())
+            self.__reachabilityChanged(QNetworkInformation.instance().reachability())
             QNetworkInformation.instance().reachabilityChanged.connect(
-                self.__reachabilityChanged)
+                self.__reachabilityChanged
+            )
         else:
             # assume to be 'always online' if no backend could be loaded or
             # dynamic online check is switched of
             self.__online = True
             self.__reachabilityChanged(QNetworkInformation.Reachability.Online)
-    
+
     def __reachabilityChanged(self, reachability):
         """
         Private slot handling reachability state changes.
-        
+
         @param reachability new reachability state
         @type QNetworkInformation.Reachability
         """
         online = reachability == QNetworkInformation.Reachability.Online
-        tooltip = self.tr("<p>Shows the Internet reachability status<br/><br/>"
-                          "<b>Internet:</b> {0}</p>")
-        
+        tooltip = self.tr(
+            "<p>Shows the Internet reachability status<br/><br/>"
+            "<b>Internet:</b> {0}</p>"
+        )
+
         if online:
             self.setPixmap(UI.PixmapCache.getPixmap("network-online"))
             tooltip = tooltip.format(self.tr("Reachable"))
         else:
             self.setPixmap(UI.PixmapCache.getPixmap("network-offline"))
             tooltip = tooltip.format(self.tr("Not Reachable"))
-        
+
         self.setToolTip(tooltip)
-        
+
         if online != self.__online:
             self.__online = online
             self.onlineStateChanged.emit(online)
-        
+
         self.reachabilityStateChanged.emit(reachability)
-    
+
     def isOnline(self):
         """
         Public method to get the online state.
-        
+
         @return online state
         @rtype bool
         """
--- a/src/eric7/EricNetwork/EricNetworkProxyFactory.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricNetworkProxyFactory.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 
 from PyQt6.QtCore import QUrl, QCoreApplication
 from PyQt6.QtWidgets import QDialog
-from PyQt6.QtNetwork import (
-    QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery
-)
+from PyQt6.QtNetwork import QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery
 
 from EricWidgets import EricMessageBox
 
@@ -26,7 +24,7 @@
 def schemeFromProxyType(proxyType):
     """
     Module function to determine the scheme name from the proxy type.
-    
+
     @param proxyType type of the proxy (QNetworkProxy.ProxyType)
     @return scheme (string, one of Http, Https, Ftp)
     """
@@ -45,16 +43,16 @@
 def proxyAuthenticationRequired(proxy, auth):
     """
     Module slot to handle a proxy authentication request.
-    
+
     @param proxy reference to the proxy object (QNetworkProxy)
     @param auth reference to the authenticator object (QAuthenticator)
     """
     info = QCoreApplication.translate(
-        "EricNetworkProxyFactory",
-        "<b>Connect to proxy '{0}' using:</b>"
+        "EricNetworkProxyFactory", "<b>Connect to proxy '{0}' using:</b>"
     ).format(Utilities.html_encode(proxy.hostName()))
-    
+
     from UI.AuthenticationDialog import AuthenticationDialog
+
     dlg = AuthenticationDialog(info, proxy.user(), True)
     dlg.setData(proxy.user(), proxy.password())
     if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -74,46 +72,44 @@
     """
     Class implementing a matcher for host names.
     """
+
     def __init__(self, pattern):
         """
         Constructor
-        
+
         @param pattern pattern to be matched against
         @type str
         """
         self.__regExp = None
         self.setPattern(pattern)
-    
+
     def setPattern(self, pattern):
         """
         Public method to set the match pattern.
-        
+
         @param pattern pattern to be matched against
         """
         self.__pattern = pattern
-        
+
         if "?" in pattern or "*" in pattern:
             regexp = "^.*{0}.*$".format(
-                pattern
-                .replace(".", "\\.")
-                .replace("*", ".*")
-                .replace("?", ".")
+                pattern.replace(".", "\\.").replace("*", ".*").replace("?", ".")
             )
             self.__regExp = re.compile(regexp, re.IGNORECASE)
-    
+
     def pattern(self):
         """
         Public method to get the match pattern.
-        
+
         @return match pattern
         @rtype str
         """
         return self.__pattern
-    
+
     def match(self, host):
         """
         Public method to test the given string.
-        
+
         @param host host name to be matched
         @type str
         @return flag indicating a successful match
@@ -121,7 +117,7 @@
         """
         if self.__regExp is None:
             return self.__pattern in host
-        
+
         return self.__regExp.search(host) is not None
 
 
@@ -129,19 +125,20 @@
     """
     Class implementing a network proxy factory.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__hostnameMatchers = []
         self.__exceptions = ""
-    
+
     def __setExceptions(self, exceptions):
         """
         Private method to set the host name exceptions.
-        
+
         @param exceptions list of exceptions separated by ','
         @type str
         """
@@ -149,22 +146,22 @@
         self.__exceptions = exceptions
         for exception in self.__exceptions.split(","):
             self.__hostnameMatchers.append(HostnameMatcher(exception.strip()))
-    
+
     def queryProxy(self, query):
         """
         Public method to determine a proxy for a given query.
-        
+
         @param query reference to the query object (QNetworkProxyQuery)
         @return list of proxies in order of preference (list of QNetworkProxy)
         """
         if (
-            query.queryType() == QNetworkProxyQuery.QueryType.UrlRequest and
-            query.protocolTag() in ["http", "https", "ftp"]
+            query.queryType() == QNetworkProxyQuery.QueryType.UrlRequest
+            and query.protocolTag() in ["http", "https", "ftp"]
         ):
             # use proxy at all ?
             if not Preferences.getUI("UseProxy"):
                 return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
-            
+
             # test for exceptions
             exceptions = Preferences.getUI("ProxyExceptions")
             if exceptions != self.__exceptions:
@@ -173,14 +170,14 @@
             for matcher in self.__hostnameMatchers:
                 if matcher.match(urlHost):
                     return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
-            
+
             # determine proxy
             if Preferences.getUI("UseSystemProxy"):
                 proxyList = QNetworkProxyFactory.systemProxyForQuery(query)
                 if (
-                    not Globals.isWindowsPlatform() and
-                    len(proxyList) == 1 and
-                    proxyList[0].type() == QNetworkProxy.ProxyType.NoProxy
+                    not Globals.isWindowsPlatform()
+                    and len(proxyList) == 1
+                    and proxyList[0].type() == QNetworkProxy.ProxyType.NoProxy
                 ):
                     # try it the Python way
                     # scan the environment for variables named <scheme>_proxy
@@ -188,22 +185,24 @@
                     for name, value in os.environ.items():
                         name = name.lower()
                         if (
-                            value and
-                            name[-6:] == '_proxy' and
-                            name[:-6] == query.protocolTag().lower()
+                            value
+                            and name[-6:] == "_proxy"
+                            and name[:-6] == query.protocolTag().lower()
                         ):
                             url = QUrl(value)
                             if url.scheme() in ["http", "https"]:
                                 proxyType = QNetworkProxy.ProxyType.HttpProxy
                             elif url.scheme() == "ftp":
-                                proxyType = (
-                                    QNetworkProxy.ProxyType.FtpCachingProxy
-                                )
+                                proxyType = QNetworkProxy.ProxyType.FtpCachingProxy
                             else:
                                 proxyType = QNetworkProxy.ProxyType.HttpProxy
                             proxy = QNetworkProxy(
-                                proxyType, url.host(), url.port(),
-                                url.userName(), url.password())
+                                proxyType,
+                                url.host(),
+                                url.port(),
+                                url.userName(),
+                                url.password(),
+                            )
                             proxyList = [proxy]
                             break
                 if proxyList:
@@ -212,10 +211,11 @@
                         scheme = "Http"
                     if scheme != "NoProxy":
                         proxyList[0].setUser(
-                            Preferences.getUI("ProxyUser/{0}".format(scheme)))
+                            Preferences.getUI("ProxyUser/{0}".format(scheme))
+                        )
                         proxyList[0].setPassword(
-                            Preferences.getUI(
-                                "ProxyPassword/{0}".format(scheme)))
+                            Preferences.getUI("ProxyPassword/{0}".format(scheme))
+                        )
                     return proxyList
                 else:
                     return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
@@ -229,16 +229,16 @@
                     EricMessageBox.critical(
                         None,
                         QCoreApplication.translate(
-                            "EricNetworkProxyFactory",
-                            "Proxy Configuration Error"),
+                            "EricNetworkProxyFactory", "Proxy Configuration Error"
+                        ),
                         QCoreApplication.translate(
                             "EricNetworkProxyFactory",
                             """Proxy usage was activated"""
                             """ but no proxy host for protocol"""
-                            """ '{0}' configured.""").format(protocolKey))
-                    return [
-                        QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)
-                    ]
+                            """ '{0}' configured.""",
+                        ).format(protocolKey),
+                    )
+                    return [QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)]
                 else:
                     if protocolKey in ["Http", "Https", "Ftp"]:
                         if query.protocolTag() == "ftp":
@@ -246,16 +246,14 @@
                         else:
                             proxyType = QNetworkProxy.ProxyType.HttpProxy
                         proxy = QNetworkProxy(
-                            proxyType, host,
+                            proxyType,
+                            host,
                             Preferences.getUI("ProxyPort/" + protocolKey),
                             Preferences.getUI("ProxyUser/" + protocolKey),
-                            Preferences.getUI("ProxyPassword/" + protocolKey))
+                            Preferences.getUI("ProxyPassword/" + protocolKey),
+                        )
                     else:
-                        proxy = QNetworkProxy(
-                            QNetworkProxy.ProxyType.DefaultProxy)
-                    return [
-                        proxy,
-                        QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)
-                    ]
+                        proxy = QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)
+                    return [proxy, QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)]
         else:
             return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
--- a/src/eric7/EricNetwork/EricNetworkUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricNetworkUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,7 @@
 def isValidAddress(address):
     """
     Public function to check, if the given address is valid.
-    
+
     @param address IPv4 or IPv6 address string
     @type str
     @return flag indicating validity
@@ -26,7 +26,7 @@
 def isValidIPv4Address(address):
     """
     Public function to check, if the given address is a valid IPv4 address.
-    
+
     @param address IPv4 address string
     @type str
     @return flag indicating validity
@@ -34,15 +34,15 @@
     """
     h = QHostAddress(address)
     return (
-        not h.isNull() and
-        h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv4Protocol
+        not h.isNull()
+        and h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv4Protocol
     )
 
 
 def isValidIPv6Address(address):
     """
     Public function to check, if the given address is a valid IPv6 address.
-    
+
     @param address IPv6 address string
     @type str
     @return flag indicating validity
@@ -50,6 +50,6 @@
     """
     h = QHostAddress(address)
     return (
-        not h.isNull() and
-        h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv6Protocol
+        not h.isNull()
+        and h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv6Protocol
     )
--- a/src/eric7/EricNetwork/EricSslCertificateSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslCertificateSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,28 +11,27 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem
+
 with contextlib.suppress(ImportError):
     from PyQt6.QtNetwork import QSslCertificate
 
-from .Ui_EricSslCertificateSelectionDialog import (
-    Ui_EricSslCertificateSelectionDialog
-)
+from .Ui_EricSslCertificateSelectionDialog import Ui_EricSslCertificateSelectionDialog
 
 import Utilities
 import UI.PixmapCache
 
 
-class EricSslCertificateSelectionDialog(QDialog,
-                                        Ui_EricSslCertificateSelectionDialog):
+class EricSslCertificateSelectionDialog(QDialog, Ui_EricSslCertificateSelectionDialog):
     """
     Class implementing a dialog to select a SSL certificate.
     """
+
     CertRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, certificates, parent=None):
         """
         Constructor
-        
+
         @param certificates list of SSL certificates to select from
         @type list of QSslCertificate
         @param parent reference to the parent widget
@@ -40,75 +39,75 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.viewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        
+
+        self.viewButton.setIcon(UI.PixmapCache.getIcon("certificates"))
+
         self.buttonBox.button(QDialogButtonBox.OK).setEnabled(False)
         self.viewButton.setEnabled(False)
-        
+
         self.__populateCertificatesTree(certificates)
-    
+
     def __populateCertificatesTree(self, certificates):
         """
         Private slot to populate the certificates tree.
-        
+
         @param certificates list of SSL certificates to select from
         @type list of QSslCertificate
         """
         for cert in certificates():
             self.__createCertificateEntry(cert)
-        
+
         self.certificatesTree.expandAll()
         for i in range(self.certificatesTree.columnCount()):
             self.certificatesTree.resizeColumnToContents(i)
         self.certificatesTree.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __createCaCertificateEntry(self, cert):
         """
         Private method to create a certificate entry.
-        
+
         @param cert certificate to insert
         @type QSslCertificate
         """
         # step 1: extract the info to be shown
         organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.Organization))
+        )
         commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName))
+        )
         if organisation is None or organisation == "":
             organisation = self.tr("(Unknown)")
         if commonName is None or commonName == "":
             commonName = self.tr("(Unknown common name)")
         expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
+
         # step 2: create the entry
         items = self.certificatesTree.findItems(
             organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
+            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive,
+        )
         if len(items) == 0:
             parent = QTreeWidgetItem(self.certificatesTree, [organisation])
             parent.setFirstColumnSpanned(True)
         else:
             parent = items[0]
-        
+
         itm = QTreeWidgetItem(parent, [commonName, expiryDate])
         itm.setData(0, self.CertRole, cert.toPem())
-    
+
     @pyqtSlot()
     def on_certificatesTree_itemSelectionChanged(self):
         """
         Private slot to handle the selection of an item.
         """
         enable = (
-            len(self.certificatesTree.selectedItems()) > 0 and
-            self.certificatesTree.selectedItems()[0].parent() is not None
+            len(self.certificatesTree.selectedItems()) > 0
+            and self.certificatesTree.selectedItems()[0].parent() is not None
         )
         self.buttonBox.button(QDialogButtonBox.OK).setEnabled(enable)
         self.viewButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_viewButton_clicked(self):
         """
@@ -116,32 +115,33 @@
         """
         with contextlib.suppress(ImportError):
             from EricNetwork.EricSslCertificatesInfoDialog import (
-                EricSslCertificatesInfoDialog
+                EricSslCertificatesInfoDialog,
             )
+
             cert = QSslCertificate.fromData(
-                self.certificatesTree.selectedItems()[0].data(
-                    0, self.CertRole))
+                self.certificatesTree.selectedItems()[0].data(0, self.CertRole)
+            )
             dlg = EricSslCertificatesInfoDialog(cert, self)
             dlg.exec()
-    
+
     def getSelectedCertificate(self):
         """
         Public method to get the selected certificate.
-        
+
         @return selected certificate
         @rtype QSslCertificate
         """
         valid = (
-            len(self.certificatesTree.selectedItems()) > 0 and
-            self.certificatesTree.selectedItems()[0].parent() is not None
+            len(self.certificatesTree.selectedItems()) > 0
+            and self.certificatesTree.selectedItems()[0].parent() is not None
         )
-        
+
         certificate = (
             QSslCertificate.fromData(
-                self.certificatesTree.selectedItems()[0].data(
-                    0, self.CertRole))
-            if valid else
-            None
+                self.certificatesTree.selectedItems()[0].data(0, self.CertRole)
+            )
+            if valid
+            else None
         )
-        
+
         return certificate
--- a/src/eric7/EricNetwork/EricSslCertificatesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslCertificatesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,6 +12,7 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QByteArray
 from PyQt6.QtWidgets import QDialog, QTreeWidgetItem
+
 with contextlib.suppress(ImportError):
     from PyQt6.QtNetwork import QSslCertificate, QSslConfiguration, QSsl
 
@@ -29,92 +30,86 @@
     """
     Class implementing a dialog to show and edit all certificates.
     """
+
     CertRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.serversViewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        self.serversDeleteButton.setIcon(
-            UI.PixmapCache.getIcon("certificateDelete"))
-        self.serversExportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateExport"))
-        self.serversImportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateImport"))
-        
-        self.caViewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        self.caDeleteButton.setIcon(
-            UI.PixmapCache.getIcon("certificateDelete"))
-        self.caExportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateExport"))
-        self.caImportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateImport"))
-        
+
+        self.serversViewButton.setIcon(UI.PixmapCache.getIcon("certificates"))
+        self.serversDeleteButton.setIcon(UI.PixmapCache.getIcon("certificateDelete"))
+        self.serversExportButton.setIcon(UI.PixmapCache.getIcon("certificateExport"))
+        self.serversImportButton.setIcon(UI.PixmapCache.getIcon("certificateImport"))
+
+        self.caViewButton.setIcon(UI.PixmapCache.getIcon("certificates"))
+        self.caDeleteButton.setIcon(UI.PixmapCache.getIcon("certificateDelete"))
+        self.caExportButton.setIcon(UI.PixmapCache.getIcon("certificateExport"))
+        self.caImportButton.setIcon(UI.PixmapCache.getIcon("certificateImport"))
+
         self.__populateServerCertificatesTree()
         self.__populateCaCertificatesTree()
-    
+
     def __populateServerCertificatesTree(self):
         """
         Private slot to populate the server certificates tree.
         """
         certificateDict = Globals.toDict(
-            Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+            Preferences.getSettings().value("Ssl/CaCertificatesDict")
+        )
         for server in certificateDict:
             for cert in QSslCertificate.fromData(certificateDict[server]):
                 self.__createServerCertificateEntry(server, cert)
-        
+
         self.serversCertificatesTree.expandAll()
         for i in range(self.serversCertificatesTree.columnCount()):
             self.serversCertificatesTree.resizeColumnToContents(i)
-    
+
     def __createServerCertificateEntry(self, server, cert):
         """
         Private method to create a server certificate entry.
-        
+
         @param server server name of the certificate (string)
         @param cert certificate to insert (QSslCertificate)
         """
         # step 1: extract the info to be shown
         organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.Organization))
+        )
         commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName))
+        )
         if organisation is None or organisation == "":
             organisation = self.tr("(Unknown)")
         if commonName is None or commonName == "":
             commonName = self.tr("(Unknown common name)")
         expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
+
         # step 2: create the entry
         items = self.serversCertificatesTree.findItems(
             organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
+            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive,
+        )
         if len(items) == 0:
-            parent = QTreeWidgetItem(
-                self.serversCertificatesTree, [organisation])
+            parent = QTreeWidgetItem(self.serversCertificatesTree, [organisation])
             parent.setFirstColumnSpanned(True)
         else:
             parent = items[0]
-        
+
         itm = QTreeWidgetItem(parent, [commonName, server, expiryDate])
         itm.setData(0, self.CertRole, cert.toPem())
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_serversCertificatesTree_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current item in the
         server certificates list.
-        
+
         @param current new current item (QTreeWidgetItem)
         @param previous previous current item (QTreeWidgetItem)
         """
@@ -122,7 +117,7 @@
         self.serversViewButton.setEnabled(enable)
         self.serversDeleteButton.setEnabled(enable)
         self.serversExportButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_serversViewButton_clicked(self):
         """
@@ -130,14 +125,15 @@
         """
         with contextlib.suppress(ImportError):
             from EricNetwork.EricSslCertificatesInfoDialog import (
-                EricSslCertificatesInfoDialog
+                EricSslCertificatesInfoDialog,
             )
+
             cert = QSslCertificate.fromData(
-                self.serversCertificatesTree.currentItem().data(
-                    0, self.CertRole))
+                self.serversCertificatesTree.currentItem().data(0, self.CertRole)
+            )
             dlg = EricSslCertificatesInfoDialog(cert, self)
             dlg.exec()
-    
+
     @pyqtSlot()
     def on_serversDeleteButton_clicked(self):
         """
@@ -147,48 +143,52 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Delete Server Certificate"),
-            self.tr("""<p>Shall the server certificate really be"""
-                    """ deleted?</p><p>{0}</p>"""
-                    """<p>If the server certificate is deleted, the"""
-                    """ normal security checks will be reinstantiated"""
-                    """ and the server has to present a valid"""
-                    """ certificate.</p>""")
-            .format(itm.text(0)))
+            self.tr(
+                """<p>Shall the server certificate really be"""
+                """ deleted?</p><p>{0}</p>"""
+                """<p>If the server certificate is deleted, the"""
+                """ normal security checks will be reinstantiated"""
+                """ and the server has to present a valid"""
+                """ certificate.</p>"""
+            ).format(itm.text(0)),
+        )
         if res:
             server = itm.text(1)
-            cert = self.serversCertificatesTree.currentItem().data(
-                0, self.CertRole)
-            
+            cert = self.serversCertificatesTree.currentItem().data(0, self.CertRole)
+
             # delete the selected entry and its parent entry,
             # if it was the only one
             parent = itm.parent()
             parent.takeChild(parent.indexOfChild(itm))
             if parent.childCount() == 0:
                 self.serversCertificatesTree.takeTopLevelItem(
-                    self.serversCertificatesTree.indexOfTopLevelItem(parent))
-            
+                    self.serversCertificatesTree.indexOfTopLevelItem(parent)
+                )
+
             # delete the certificate from the user certificate store
             certificateDict = Globals.toDict(
-                Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+                Preferences.getSettings().value("Ssl/CaCertificatesDict")
+            )
             if server in certificateDict:
-                certs = [c.toPem() for c in
-                         QSslCertificate.fromData(certificateDict[server])]
+                certs = [
+                    c.toPem() for c in QSslCertificate.fromData(certificateDict[server])
+                ]
                 if cert in certs:
                     certs.remove(cert)
                 if certs:
                     pems = QByteArray()
                     for cert in certs:
-                        pems.append(cert + b'\n')
+                        pems.append(cert + b"\n")
                     certificateDict[server] = pems
                 else:
                     del certificateDict[server]
             Preferences.getSettings().setValue(
-                "Ssl/CaCertificatesDict",
-                certificateDict)
-            
+                "Ssl/CaCertificatesDict", certificateDict
+            )
+
             # delete the certificate from the default certificates
             self.__updateDefaultConfiguration()
-    
+
     @pyqtSlot()
     def on_serversImportButton_clicked(self):
         """
@@ -198,59 +198,63 @@
         if certs:
             server = "*"
             certificateDict = Globals.toDict(
-                Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+                Preferences.getSettings().value("Ssl/CaCertificatesDict")
+            )
             if server in certificateDict:
                 sCerts = QSslCertificate.fromData(certificateDict[server])
             else:
                 sCerts = []
-            
+
             pems = QByteArray()
             for cert in certs:
                 if cert in sCerts:
                     commonStr = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.CommonName))
+                        cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName)
+                    )
                     EricMessageBox.warning(
                         self,
                         self.tr("Import Certificate"),
                         self.tr(
                             """<p>The certificate <b>{0}</b> already exists."""
-                            """ Skipping.</p>""")
-                        .format(Utilities.decodeString(commonStr)))
+                            """ Skipping.</p>"""
+                        ).format(Utilities.decodeString(commonStr)),
+                    )
                 else:
-                    pems.append(cert.toPem() + b'\n')
+                    pems.append(cert.toPem() + b"\n")
             if server not in certificateDict:
                 certificateDict[server] = QByteArray()
             certificateDict[server].append(pems)
             Preferences.getSettings().setValue(
-                "Ssl/CaCertificatesDict",
-                certificateDict)
-            
+                "Ssl/CaCertificatesDict", certificateDict
+            )
+
             self.serversCertificatesTree.clear()
             self.__populateServerCertificatesTree()
-            
+
             self.__updateDefaultConfiguration()
-    
+
     @pyqtSlot()
     def on_serversExportButton_clicked(self):
         """
         Private slot to export the selected server certificate.
         """
-        cert = self.serversCertificatesTree.currentItem().data(
-            0, self.CertRole)
+        cert = self.serversCertificatesTree.currentItem().data(0, self.CertRole)
         fname = (
-            self.serversCertificatesTree.currentItem().text(0).replace(" ", "")
+            self.serversCertificatesTree.currentItem()
+            .text(0)
+            .replace(" ", "")
             .replace("\t", "")
         )
         self.__exportCertificate(fname, cert)
-    
+
     def __updateDefaultConfiguration(self):
         """
         Private method to update the default SSL configuration.
         """
         caList = self.__getSystemCaCertificates()
         certificateDict = Globals.toDict(
-            Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+            Preferences.getSettings().value("Ssl/CaCertificatesDict")
+        )
         for server in certificateDict:
             for cert in QSslCertificate.fromData(certificateDict[server]):
                 if cert not in caList:
@@ -258,69 +262,73 @@
         sslCfg = QSslConfiguration.defaultConfiguration()
         sslCfg.setCaCertificates(caList)
         QSslConfiguration.setDefaultConfiguration(sslCfg)
-    
+
     def __getSystemCaCertificates(self):
         """
         Private method to get the list of system certificates.
-        
+
         @return list of system certificates (list of QSslCertificate)
         """
-        caList = QSslCertificate.fromData(Globals.toByteArray(
-            Preferences.getSettings().value("Help/SystemCertificates")))
+        caList = QSslCertificate.fromData(
+            Globals.toByteArray(
+                Preferences.getSettings().value("Help/SystemCertificates")
+            )
+        )
         if not caList:
             caList = QSslConfiguration.systemCaCertificates()
         return caList
-    
+
     def __populateCaCertificatesTree(self):
         """
         Private slot to populate the CA certificates tree.
         """
         for cert in self.__getSystemCaCertificates():
             self.__createCaCertificateEntry(cert)
-        
+
         self.caCertificatesTree.expandAll()
         for i in range(self.caCertificatesTree.columnCount()):
             self.caCertificatesTree.resizeColumnToContents(i)
         self.caCertificatesTree.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __createCaCertificateEntry(self, cert):
         """
         Private method to create a CA certificate entry.
-        
+
         @param cert certificate to insert (QSslCertificate)
         """
         # step 1: extract the info to be shown
         organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.Organization))
+        )
         commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
+            ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName))
+        )
         if organisation is None or organisation == "":
             organisation = self.tr("(Unknown)")
         if commonName is None or commonName == "":
             commonName = self.tr("(Unknown common name)")
         expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
+
         # step 2: create the entry
         items = self.caCertificatesTree.findItems(
             organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
+            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive,
+        )
         if len(items) == 0:
             parent = QTreeWidgetItem(self.caCertificatesTree, [organisation])
             parent.setFirstColumnSpanned(True)
         else:
             parent = items[0]
-        
+
         itm = QTreeWidgetItem(parent, [commonName, expiryDate])
         itm.setData(0, self.CertRole, cert.toPem())
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_caCertificatesTree_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current item
         in the CA certificates list.
-        
+
         @param current new current item (QTreeWidgetItem)
         @param previous previous current item (QTreeWidgetItem)
         """
@@ -328,7 +336,7 @@
         self.caViewButton.setEnabled(enable)
         self.caDeleteButton.setEnabled(enable)
         self.caExportButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_caViewButton_clicked(self):
         """
@@ -336,13 +344,15 @@
         """
         with contextlib.suppress(ImportError):
             from EricNetwork.EricSslCertificatesInfoDialog import (
-                EricSslCertificatesInfoDialog
+                EricSslCertificatesInfoDialog,
             )
+
             cert = QSslCertificate.fromData(
-                self.caCertificatesTree.currentItem().data(0, self.CertRole))
+                self.caCertificatesTree.currentItem().data(0, self.CertRole)
+            )
             dlg = EricSslCertificatesInfoDialog(cert, self)
             dlg.exec()
-    
+
     @pyqtSlot()
     def on_caDeleteButton_clicked(self):
         """
@@ -356,32 +366,33 @@
                 """<p>Shall the CA certificate really be deleted?</p>"""
                 """<p>{0}</p>"""
                 """<p>If the CA certificate is deleted, the browser"""
-                """ will not trust any certificate issued by this CA.</p>""")
-            .format(itm.text(0)))
+                """ will not trust any certificate issued by this CA.</p>"""
+            ).format(itm.text(0)),
+        )
         if res:
             cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
-            
+
             # delete the selected entry and its parent entry,
             # if it was the only one
             parent = itm.parent()
             parent.takeChild(parent.indexOfChild(itm))
             if parent.childCount() == 0:
                 self.caCertificatesTree.takeTopLevelItem(
-                    self.caCertificatesTree.indexOfTopLevelItem(parent))
-            
+                    self.caCertificatesTree.indexOfTopLevelItem(parent)
+                )
+
             # delete the certificate from the CA certificate store
             caCerts = self.__getSystemCaCertificates()
             if cert in caCerts:
                 caCerts.remove(cert)
             pems = QByteArray()
             for cert in caCerts:
-                pems.append(cert.toPem() + '\n')
-            Preferences.getSettings().setValue(
-                "Help/SystemCertificates", pems)
-            
+                pems.append(cert.toPem() + "\n")
+            Preferences.getSettings().setValue("Help/SystemCertificates", pems)
+
             # delete the certificate from the default certificates
             self.__updateDefaultConfiguration()
-    
+
     @pyqtSlot()
     def on_caImportButton_clicked(self):
         """
@@ -393,29 +404,29 @@
             for cert in certs:
                 if cert in caCerts:
                     commonStr = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.CommonName))
+                        cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName)
+                    )
                     EricMessageBox.warning(
                         self,
                         self.tr("Import Certificate"),
                         self.tr(
                             """<p>The certificate <b>{0}</b> already exists."""
-                            """ Skipping.</p>""")
-                        .format(Utilities.decodeString(commonStr)))
+                            """ Skipping.</p>"""
+                        ).format(Utilities.decodeString(commonStr)),
+                    )
                 else:
                     caCerts.append(cert)
-            
+
             pems = QByteArray()
             for cert in caCerts:
-                pems.append(cert.toPem() + '\n')
-            Preferences.getSettings().setValue(
-                "Help/SystemCertificates", pems)
-            
+                pems.append(cert.toPem() + "\n")
+            Preferences.getSettings().setValue("Help/SystemCertificates", pems)
+
             self.caCertificatesTree.clear()
             self.__populateCaCertificatesTree()
-            
+
             self.__updateDefaultConfiguration()
-    
+
     @pyqtSlot()
     def on_caExportButton_clicked(self):
         """
@@ -423,15 +434,17 @@
         """
         cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
         fname = (
-            self.caCertificatesTree.currentItem().text(0).replace(" ", "")
+            self.caCertificatesTree.currentItem()
+            .text(0)
+            .replace(" ", "")
             .replace("\t", "")
         )
         self.__exportCertificate(fname, cert)
-    
+
     def __exportCertificate(self, name, cert):
         """
         Private slot to export a certificate.
-        
+
         @param name default file name without extension
         @type str
         @param cert certificate to be exported encoded as PEM
@@ -442,11 +455,13 @@
                 self,
                 self.tr("Export Certificate"),
                 name,
-                self.tr("Certificate File (PEM) (*.pem);;"
-                        "Certificate File (DER) (*.der)"),
+                self.tr(
+                    "Certificate File (PEM) (*.pem);;" "Certificate File (DER) (*.der)"
+                ),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
-            
+                EricFileDialog.DontConfirmOverwrite,
+            )
+
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -457,18 +472,22 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Export Certificate"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fname),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fname),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 if fpath.suffix == ".pem":
                     crt = bytes(cert)
                 else:
                     crt = bytes(
-                        QSslCertificate.fromData(
-                            crt, QSsl.EncodingFormat.Pem)[0].toDer()
+                        QSslCertificate.fromData(crt, QSsl.EncodingFormat.Pem)[
+                            0
+                        ].toDer()
                     )
                 try:
                     with fpath.open("wb") as f:
@@ -479,13 +498,14 @@
                         self.tr("Export Certificate"),
                         self.tr(
                             """<p>The certificate could not be written"""
-                            """ to file <b>{0}</b></p><p>Error: {1}</p>""")
-                        .format(fpath, str(err)))
-    
+                            """ to file <b>{0}</b></p><p>Error: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
+
     def __importCertificate(self):
         """
         Private method to read a certificate.
-        
+
         @return certificates read
         @rtype list of QSslCertificate
         """
@@ -493,19 +513,19 @@
             self,
             self.tr("Import Certificate"),
             "",
-            self.tr("Certificate Files (*.pem *.crt *.der *.cer *.ca);;"
-                    "All Files (*)"))
-        
+            self.tr(
+                "Certificate Files (*.pem *.crt *.der *.cer *.ca);;" "All Files (*)"
+            ),
+        )
+
         if fname:
             try:
                 with pathlib.Path(fname).open("rb") as f:
                     crt = QByteArray(f.read())
-                cert = QSslCertificate.fromData(
-                    crt, QSsl.EncodingFormat.Pem)
+                cert = QSslCertificate.fromData(crt, QSsl.EncodingFormat.Pem)
                 if not cert:
-                    cert = QSslCertificate.fromData(
-                        crt, QSsl.EncodingFormat.Der)
-                
+                    cert = QSslCertificate.fromData(crt, QSsl.EncodingFormat.Der)
+
                 return cert
             except OSError as err:
                 EricMessageBox.critical(
@@ -513,7 +533,8 @@
                     self.tr("Import Certificate"),
                     self.tr(
                         """<p>The certificate could not be read from file"""
-                        """ <b>{0}</b></p><p>Error: {1}</p>""")
-                    .format(fname, str(err)))
-        
+                        """ <b>{0}</b></p><p>Error: {1}</p>"""
+                    ).format(fname, str(err)),
+                )
+
         return []
--- a/src/eric7/EricNetwork/EricSslCertificatesInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslCertificatesInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,14 +16,15 @@
     """
     Class implementing a dialog to show SSL certificate infos.
     """
+
     def __init__(self, certificateChain, parent=None):
         """
         Constructor
-        
+
         @param certificateChain SSL certificate chain (list of QSslCertificate)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.sslWidget.showCertificateChain(certificateChain)
--- a/src/eric7/EricNetwork/EricSslCertificatesInfoWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslCertificatesInfoWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,6 +9,7 @@
 
 from PyQt6.QtCore import pyqtSlot, QCryptographicHash, QDateTime
 from PyQt6.QtWidgets import QWidget
+
 try:
     from PyQt6.QtNetwork import QSslCertificate
 except ImportError:
@@ -23,21 +24,22 @@
     """
     Class implementing a widget to show SSL certificate infos.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__chain = []
-    
+
     def showCertificateChain(self, certificateChain):
         """
         Public method to show the SSL certificates of a certificate chain.
-        
+
         @param certificateChain list od SSL certificates
             (list of QSslCertificate)
         """
@@ -45,158 +47,198 @@
             self.chainLabel.show()
             self.chainComboBox.show()
             self.chainComboBox.clear()
-            
+
             self.__chain = certificateChain[:]
-            
+
             for cert in self.__chain:
-                name = ", ".join(cert.subjectInfo(
-                    QSslCertificate.SubjectInfo.CommonName))
+                name = ", ".join(
+                    cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName)
+                )
                 if not name:
                     name = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.Organization))
+                        cert.subjectInfo(QSslCertificate.SubjectInfo.Organization)
+                    )
                 if not name:
                     name = cert.serialNumber()
                 self.chainComboBox.addItem(name)
-            
+
             self.on_chainComboBox_activated(0)
-    
+
     def showCertificate(self, certificate):
         """
         Public method to show the SSL certificate information.
-        
+
         @param certificate reference to the SSL certificate (QSslCertificate)
         """
         self.chainLabel.hide()
         self.chainComboBox.hide()
         self.chainComboBox.clear()
-        
+
         self.__chain = []
-        
+
         if QSslCertificate:
             self.__showCertificate(certificate)
-    
+
     def __showCertificate(self, certificate):
         """
         Private method to show the  SSL certificate information.
-        
+
         @param certificate reference to the SSL certificate (QSslCertificate)
         """
         if QSslCertificate:
             self.blacklistedLabel.setVisible(False)
             self.blacklistedLabel.setStyleSheet(
-                "QLabel { color : white; background-color : red; }")
+                "QLabel { color : white; background-color : red; }"
+            )
             self.expiredLabel.setVisible(False)
             self.expiredLabel.setStyleSheet(
-                "QLabel { color : white; background-color : red; }")
-            
-            self.subjectCommonNameLabel.setText(self.__certificateString(
-                ", ".join(certificate.subjectInfo(
-                    QSslCertificate.SubjectInfo.CommonName))))
-            self.subjectOrganizationLabel.setText(self.__certificateString(
-                ", ".join(certificate.subjectInfo(
-                    QSslCertificate.SubjectInfo.Organization))))
+                "QLabel { color : white; background-color : red; }"
+            )
+
+            self.subjectCommonNameLabel.setText(
+                self.__certificateString(
+                    ", ".join(
+                        certificate.subjectInfo(QSslCertificate.SubjectInfo.CommonName)
+                    )
+                )
+            )
+            self.subjectOrganizationLabel.setText(
+                self.__certificateString(
+                    ", ".join(
+                        certificate.subjectInfo(
+                            QSslCertificate.SubjectInfo.Organization
+                        )
+                    )
+                )
+            )
             self.subjectOrganizationalUnitLabel.setText(
-                self.__certificateString(", ".join(
-                    certificate.subjectInfo(
-                        QSslCertificate.SubjectInfo.OrganizationalUnitName))))
-            self.issuerCommonNameLabel.setText(self.__certificateString(
-                ", ".join(certificate.issuerInfo(
-                    QSslCertificate.SubjectInfo.CommonName))))
-            self.issuerOrganizationLabel.setText(self.__certificateString(
-                ", ".join(certificate.issuerInfo(
-                    QSslCertificate.SubjectInfo.Organization))))
+                self.__certificateString(
+                    ", ".join(
+                        certificate.subjectInfo(
+                            QSslCertificate.SubjectInfo.OrganizationalUnitName
+                        )
+                    )
+                )
+            )
+            self.issuerCommonNameLabel.setText(
+                self.__certificateString(
+                    ", ".join(
+                        certificate.issuerInfo(QSslCertificate.SubjectInfo.CommonName)
+                    )
+                )
+            )
+            self.issuerOrganizationLabel.setText(
+                self.__certificateString(
+                    ", ".join(
+                        certificate.issuerInfo(QSslCertificate.SubjectInfo.Organization)
+                    )
+                )
+            )
             self.issuerOrganizationalUnitLabel.setText(
-                self.__certificateString(", ".join(
-                    certificate.issuerInfo(
-                        QSslCertificate.SubjectInfo.OrganizationalUnitName))))
+                self.__certificateString(
+                    ", ".join(
+                        certificate.issuerInfo(
+                            QSslCertificate.SubjectInfo.OrganizationalUnitName
+                        )
+                    )
+                )
+            )
             self.serialNumberLabel.setText(self.__serialNumber(certificate))
             self.effectiveLabel.setText(
-                certificate.effectiveDate().toString("yyyy-MM-dd"))
-            self.expiresLabel.setText(
-                certificate.expiryDate().toString("yyyy-MM-dd"))
-            self.sha1Label.setText(self.__formatHexString(
-                str(certificate.digest(
-                    QCryptographicHash.Algorithm.Sha1).toHex(),
-                    encoding="ascii")))
-            self.md5Label.setText(self.__formatHexString(
-                str(certificate.digest(
-                    QCryptographicHash.Algorithm.Md5).toHex(),
-                    encoding="ascii")))
-            
+                certificate.effectiveDate().toString("yyyy-MM-dd")
+            )
+            self.expiresLabel.setText(certificate.expiryDate().toString("yyyy-MM-dd"))
+            self.sha1Label.setText(
+                self.__formatHexString(
+                    str(
+                        certificate.digest(QCryptographicHash.Algorithm.Sha1).toHex(),
+                        encoding="ascii",
+                    )
+                )
+            )
+            self.md5Label.setText(
+                self.__formatHexString(
+                    str(
+                        certificate.digest(QCryptographicHash.Algorithm.Md5).toHex(),
+                        encoding="ascii",
+                    )
+                )
+            )
+
             if certificate.isBlacklisted():
                 # something is wrong; indicate it to the user
-                if self.__hasExpired(certificate.effectiveDate(),
-                                     certificate.expiryDate()):
+                if self.__hasExpired(
+                    certificate.effectiveDate(), certificate.expiryDate()
+                ):
                     self.expiredLabel.setVisible(True)
                 else:
                     self.blacklistedLabel.setVisible(True)
-    
+
     def __certificateString(self, txt):
         """
         Private method to prepare some text for display.
-        
+
         @param txt text to be displayed (string)
         @return prepared text (string)
         """
         if txt is None or txt == "":
             return self.tr("<not part of the certificate>")
-        
+
         return Utilities.decodeString(txt)
-    
+
     def __serialNumber(self, cert):
         """
         Private slot to format the certificate serial number.
-        
+
         @param cert reference to the SSL certificate (QSslCertificate)
         @return formated serial number (string)
         """
         serial = cert.serialNumber()
         if serial == "":
             return self.tr("<not part of the certificate>")
-        
-        if b':' in serial:
+
+        if b":" in serial:
             return str(serial, encoding="ascii").upper()
         else:
             hexString = hex(int(serial))[2:]
             return self.__formatHexString(hexString)
-    
+
     def __formatHexString(self, hexString):
         """
         Private method to format a hex string for display.
-        
+
         @param hexString hex string to be formatted (string)
         @return formatted string (string)
         """
         hexString = hexString.upper()
-        
+
         if len(hexString) % 2 == 1:
-            hexString = '0' + hexString
-        
+            hexString = "0" + hexString
+
         hexList = []
         while hexString:
             hexList.append(hexString[:2])
             hexString = hexString[2:]
-        
-        return ':'.join(hexList)
-    
+
+        return ":".join(hexList)
+
     def __hasExpired(self, effectiveDate, expiryDate):
         """
         Private method to check for a certificate expiration.
-        
+
         @param effectiveDate date the certificate becomes effective (QDateTime)
         @param expiryDate date the certificate expires (QDateTime)
         @return flag indicating the expiration status (boolean)
         """
         now = QDateTime.currentDateTime()
-        
+
         return now < effectiveDate or now >= expiryDate
-    
+
     @pyqtSlot(int)
     def on_chainComboBox_activated(self, index):
         """
         Private slot to show the certificate info for the selected entry.
-        
+
         @param index number of the certificate in the certificate chain
             (integer)
         """
--- a/src/eric7/EricNetwork/EricSslErrorHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslErrorHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,6 +25,7 @@
     """
     Class defining the SSL error handling states.
     """
+
     NOT_IGNORED = 0
     SYSTEM_IGNORED = 1
     USER_IGNORED = 2
@@ -33,29 +34,33 @@
 class EricSslErrorHandler(QObject):
     """
     Class implementing a handler for SSL errors.
-    
+
     It also initializes the default SSL configuration with certificates
     permanently accepted by the user already.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         caList = self.__getSystemCaCertificates()
         if Preferences.getSettings().contains("Help/CaCertificatesDict"):
             # port old entries stored under 'Help'
             certificateDict = Globals.toDict(
-                Preferences.getSettings().value("Help/CaCertificatesDict"))
+                Preferences.getSettings().value("Help/CaCertificatesDict")
+            )
             Preferences.getSettings().setValue(
-                "Ssl/CaCertificatesDict", certificateDict)
+                "Ssl/CaCertificatesDict", certificateDict
+            )
             Preferences.getSettings().remove("Help/CaCertificatesDict")
         else:
             certificateDict = Globals.toDict(
-                Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+                Preferences.getSettings().value("Ssl/CaCertificatesDict")
+            )
         for server in certificateDict:
             for cert in QSslCertificate.fromData(certificateDict[server]):
                 if cert not in caList:
@@ -64,29 +69,28 @@
         sslCfg.setCaCertificates(caList)
         try:
             sslProtocol = QSsl.SslProtocol.TlsV1_1OrLater
-            if Globals.isWindowsPlatform() and platform.win32_ver()[0] == '7':
+            if Globals.isWindowsPlatform() and platform.win32_ver()[0] == "7":
                 sslProtocol = QSsl.SslProtocol.SecureProtocols
         except AttributeError:
             sslProtocol = QSsl.SslProtocol.SecureProtocols
         sslCfg.setProtocol(sslProtocol)
         with contextlib.suppress(AttributeError):
-            sslCfg.setSslOption(QSsl.SslOption.SslOptionDisableCompression,
-                                True)
+            sslCfg.setSslOption(QSsl.SslOption.SslOptionDisableCompression, True)
         QSslConfiguration.setDefaultConfiguration(sslCfg)
-    
+
     def sslErrorsReplySlot(self, reply, errors):
         """
         Public slot to handle SSL errors for a network reply.
-        
+
         @param reply reference to the reply object (QNetworkReply)
         @param errors list of SSL errors (list of QSslError)
         """
         self.sslErrorsReply(reply, errors)
-    
+
     def sslErrorsReply(self, reply, errors):
         """
         Public slot to handle SSL errors for a network reply.
-        
+
         @param reply reference to the reply object (QNetworkReply)
         @param errors list of SSL errors (list of QSslError)
         @return tuple indicating to ignore the SSL errors (one of NotIgnored,
@@ -97,18 +101,17 @@
         ignore, defaultChanged = self.sslErrors(errors, url.host(), url.port())
         if ignore:
             if defaultChanged:
-                reply.setSslConfiguration(
-                    QSslConfiguration.defaultConfiguration())
+                reply.setSslConfiguration(QSslConfiguration.defaultConfiguration())
             reply.ignoreSslErrors()
         else:
             reply.abort()
-        
+
         return ignore, defaultChanged
-    
+
     def sslErrors(self, errors, server, port=-1):
         """
         Public method to handle SSL errors.
-        
+
         @param errors list of SSL errors
         @type list of QSslError
         @param server name of the server
@@ -121,12 +124,12 @@
         """
         caMerge = {}
         certificateDict = Globals.toDict(
-            Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+            Preferences.getSettings().value("Ssl/CaCertificatesDict")
+        )
         for caServer in certificateDict:
-            caMerge[caServer] = QSslCertificate.fromData(
-                certificateDict[caServer])
+            caMerge[caServer] = QSslCertificate.fromData(certificateDict[caServer])
         caNew = []
-        
+
         errorStrings = []
         if port != -1:
             server += ":{0:d}".format(port)
@@ -143,17 +146,19 @@
                         caNew.append(cert)
         if not errorStrings:
             return EricSslErrorState.SYSTEM_IGNORED, False
-        
-        errorString = '.</li><li>'.join(errorStrings)
+
+        errorString = ".</li><li>".join(errorStrings)
         ret = EricMessageBox.yesNo(
             None,
             self.tr("SSL Errors"),
-            self.tr("""<p>SSL Errors for <br /><b>{0}</b>"""
-                    """<ul><li>{1}</li></ul></p>"""
-                    """<p>Do you want to ignore these errors?</p>""")
-            .format(server, errorString),
-            icon=EricMessageBox.Warning)
-        
+            self.tr(
+                """<p>SSL Errors for <br /><b>{0}</b>"""
+                """<ul><li>{1}</li></ul></p>"""
+                """<p>Do you want to ignore these errors?</p>"""
+            ).format(server, errorString),
+            icon=EricMessageBox.Warning,
+        )
+
         if ret:
             caRet = False
             if len(caNew) > 0:
@@ -166,14 +171,15 @@
                     self.tr(
                         """<p>Certificates:<br/>{0}<br/>"""
                         """Do you want to accept all these certificates?"""
-                        """</p>""")
-                    .format("".join(certinfos)))
+                        """</p>"""
+                    ).format("".join(certinfos)),
+                )
                 if caRet:
                     if server not in caMerge:
                         caMerge[server] = []
                     for cert in caNew:
                         caMerge[server].append(cert)
-                    
+
                     sslCfg = QSslConfiguration.defaultConfiguration()
                     caList = sslCfg.caCertificates()
                     for cert in caNew:
@@ -185,89 +191,79 @@
                         sslCfg.setProtocol(QSsl.SslProtocol.SecureProtocols)
                     with contextlib.suppress(AttributeError):
                         sslCfg.setSslOption(
-                            QSsl.SslOption.SslOptionDisableCompression,
-                            True)
+                            QSsl.SslOption.SslOptionDisableCompression, True
+                        )
                     QSslConfiguration.setDefaultConfiguration(sslCfg)
-                    
+
                     certificateDict = {}
                     for server in caMerge:
                         pems = QByteArray()
                         for cert in caMerge[server]:
-                            pems.append(cert.toPem() + b'\n')
+                            pems.append(cert.toPem() + b"\n")
                         certificateDict[server] = pems
                     Preferences.getSettings().setValue(
-                        "Ssl/CaCertificatesDict",
-                        certificateDict)
-            
+                        "Ssl/CaCertificatesDict", certificateDict
+                    )
+
             return EricSslErrorState.USER_IGNORED, caRet
-        
+
         else:
             return EricSslErrorState.NOT_IGNORED, False
-    
+
     def __certToString(self, cert):
         """
         Private method to convert a certificate to a formatted string.
-        
+
         @param cert certificate to convert (QSslCertificate)
         @return formatted string (string)
         """
         result = "<p>"
-        
-        result += self.tr(
-            "Name: {0}"
-        ).format(
+
+        result += self.tr("Name: {0}").format(
             Utilities.html_encode(
                 Utilities.decodeString(
-                    ", ".join(cert.subjectInfo(
-                        QSslCertificate.SubjectInfo.CommonName))
+                    ", ".join(cert.subjectInfo(QSslCertificate.SubjectInfo.CommonName))
                 )
             )
         )
-        
-        result += self.tr(
-            "<br/>Organization: {0}"
-        ).format(
+
+        result += self.tr("<br/>Organization: {0}").format(
             Utilities.html_encode(
                 Utilities.decodeString(
-                    ", ".join(cert.subjectInfo(
-                        QSslCertificate.SubjectInfo.Organization))
+                    ", ".join(
+                        cert.subjectInfo(QSslCertificate.SubjectInfo.Organization)
+                    )
                 )
             )
         )
-        
-        result += self.tr(
-            "<br/>Issuer: {0}"
-        ).format(
+
+        result += self.tr("<br/>Issuer: {0}").format(
             Utilities.html_encode(
                 Utilities.decodeString(
-                    ", ".join(cert.issuerInfo(
-                        QSslCertificate.SubjectInfo.CommonName))
+                    ", ".join(cert.issuerInfo(QSslCertificate.SubjectInfo.CommonName))
                 )
             )
         )
-        result += self.tr(
-            "<br/>Not valid before: {0}<br/>Valid Until: {1}"
-        ).format(
-            Utilities.html_encode(
-                cert.effectiveDate().toString("yyyy-MM-dd")
-            ),
-            Utilities.html_encode(
-                cert.expiryDate().toString("yyyy-MM-dd")
-            )
+        result += self.tr("<br/>Not valid before: {0}<br/>Valid Until: {1}").format(
+            Utilities.html_encode(cert.effectiveDate().toString("yyyy-MM-dd")),
+            Utilities.html_encode(cert.expiryDate().toString("yyyy-MM-dd")),
         )
-        
+
         result += "</p>"
-        
+
         return result
-    
+
     def __getSystemCaCertificates(self):
         """
         Private method to get the list of system certificates.
-        
+
         @return list of system certificates (list of QSslCertificate)
         """
-        caList = QSslCertificate.fromData(Globals.toByteArray(
-            Preferences.getSettings().value("Ssl/SystemCertificates")))
+        caList = QSslCertificate.fromData(
+            Globals.toByteArray(
+                Preferences.getSettings().value("Ssl/SystemCertificates")
+            )
+        )
         if not caList:
             caList = QSslConfiguration.systemCaCertificates()
         return caList
--- a/src/eric7/EricNetwork/EricSslInfoWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslInfoWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,84 +19,81 @@
     """
     Class implementing a widget to show SSL certificate infos.
     """
+
     def __init__(self, url, configuration, parent=None):
         """
         Constructor
-        
+
         @param url URL to show SSL info for (QUrl)
         @param configuration SSL configuration (QSslConfiguration)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__url = QUrl(url)
         self.__configuration = QSslConfiguration(configuration)
-        
+
         self.setMinimumWidth(400)
-        
+
         certList = self.__configuration.peerCertificateChain()
         cert = certList[0] if certList else QSslCertificate()
-        
+
         layout = QGridLayout(self)
         rows = 0
-        
+
         ##########################################
         ## Identity Information
         ##########################################
         imageLabel = QLabel(self)
         layout.addWidget(imageLabel, rows, 0, Qt.AlignmentFlag.AlignCenter)
-        
+
         label = QLabel(self)
         label.setWordWrap(True)
-        label.setSizePolicy(QSizePolicy.Policy.Expanding,
-                            QSizePolicy.Policy.Preferred)
+        label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
         label.setText(self.tr("Identity"))
         font = label.font()
         font.setBold(True)
         label.setFont(font)
         layout.addWidget(label, rows, 1)
         rows += 1
-        
+
         label = QLabel(self)
         label.setWordWrap(True)
         if cert.isNull():
-            label.setText(self.tr(
-                "Warning: this site is NOT carrying a certificate."))
+            label.setText(self.tr("Warning: this site is NOT carrying a certificate."))
             imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
         else:
             valid = not cert.isBlacklisted()
             if valid:
-                txt = ", ".join(
-                    cert.issuerInfo(QSslCertificate.SubjectInfo.CommonName))
-                label.setText(self.tr(
-                    "The certificate for this site is valid"
-                    " and has been verified by:\n{0}").format(
-                    Utilities.decodeString(txt)))
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
+                txt = ", ".join(cert.issuerInfo(QSslCertificate.SubjectInfo.CommonName))
+                label.setText(
+                    self.tr(
+                        "The certificate for this site is valid"
+                        " and has been verified by:\n{0}"
+                    ).format(Utilities.decodeString(txt))
+                )
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityHigh32"))
             else:
-                label.setText(self.tr(
-                    "The certificate for this site is NOT valid."))
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
+                label.setText(self.tr("The certificate for this site is NOT valid."))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
             layout.addWidget(label, rows, 1)
             rows += 1
-            
+
             label = QLabel(self)
             label.setWordWrap(True)
             label.setText(
-                '<a href="moresslinfos">' +
-                self.tr("Certificate Information") + "</a>")
+                '<a href="moresslinfos">' + self.tr("Certificate Information") + "</a>"
+            )
             label.linkActivated.connect(self.__showCertificateInfos)
             layout.addWidget(label, rows, 1)
             rows += 1
-        
+
         ##########################################
         ## Identity Information
         ##########################################
         imageLabel = QLabel(self)
         layout.addWidget(imageLabel, rows, 0, Qt.AlignmentFlag.AlignCenter)
-        
+
         label = QLabel(self)
         label.setWordWrap(True)
         label.setText(self.tr("Encryption"))
@@ -105,92 +102,88 @@
         label.setFont(font)
         layout.addWidget(label, rows, 1)
         rows += 1
-        
+
         cipher = self.__configuration.sessionCipher()
         if cipher.isNull():
             label = QLabel(self)
             label.setWordWrap(True)
-            label.setText(self.tr(
-                'Your connection to "{0}" is NOT encrypted.\n').format(
-                self.__url.host()))
+            label.setText(
+                self.tr('Your connection to "{0}" is NOT encrypted.\n').format(
+                    self.__url.host()
+                )
+            )
             layout.addWidget(label, rows, 1)
             imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
             rows += 1
         else:
             label = QLabel(self)
             label.setWordWrap(True)
-            label.setText(self.tr(
-                'Your connection to "{0}" is encrypted.').format(
-                self.__url.host()))
+            label.setText(
+                self.tr('Your connection to "{0}" is encrypted.').format(
+                    self.__url.host()
+                )
+            )
             layout.addWidget(label, rows, 1)
-            
+
             proto = cipher.protocol()
             if proto == QSsl.SslProtocol.TlsV1_0:
                 sslVersion = "TLS v1.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
             elif proto == QSsl.SslProtocol.TlsV1_1:
                 sslVersion = "TLS v1.1"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityMedium32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityMedium32"))
             elif proto == QSsl.SslProtocol.TlsV1_2:
                 sslVersion = "TLS v1.2"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityHigh32"))
             elif proto == QSsl.SslProtocol.TlsV1_3:
                 sslVersion = "TLS v1.3"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityHigh32"))
             elif proto == QSsl.SslProtocol.DtlsV1_0:
                 sslVersion = "DTLS v1.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
             elif proto == QSsl.SslProtocol.DtlsV1_2:
                 sslVersion = "DTLS v1.2"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityHigh32"))
             else:
                 sslVersion = self.tr("unknown")
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
+                imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
             rows += 1
-            
+
             label = QLabel(self)
             label.setWordWrap(True)
-            label.setText(self.tr(
-                "It uses protocol: {0}").format(sslVersion))
+            label.setText(self.tr("It uses protocol: {0}").format(sslVersion))
             layout.addWidget(label, rows, 1)
             rows += 1
-            
+
             label = QLabel(self)
             label.setWordWrap(True)
             if (
-                not cipher.encryptionMethod() or
-                not cipher.usedBits() or
-                not cipher.authenticationMethod() or
-                not cipher.keyExchangeMethod()
+                not cipher.encryptionMethod()
+                or not cipher.usedBits()
+                or not cipher.authenticationMethod()
+                or not cipher.keyExchangeMethod()
             ):
-                label.setText(self.tr(
-                    "The cipher data is incomplete or not known."
-                ))
+                label.setText(self.tr("The cipher data is incomplete or not known."))
             else:
-                label.setText(self.tr(
-                    "It is encrypted using {0} at {1} bits, "
-                    "with {2} for message authentication and "
-                    "{3} as key exchange mechanism.\n\n"
-                ).format(
-                    cipher.encryptionMethod(),
-                    cipher.usedBits(),
-                    cipher.authenticationMethod(),
-                    cipher.keyExchangeMethod()
-                ))
+                label.setText(
+                    self.tr(
+                        "It is encrypted using {0} at {1} bits, "
+                        "with {2} for message authentication and "
+                        "{3} as key exchange mechanism.\n\n"
+                    ).format(
+                        cipher.encryptionMethod(),
+                        cipher.usedBits(),
+                        cipher.authenticationMethod(),
+                        cipher.keyExchangeMethod(),
+                    )
+                )
             layout.addWidget(label, rows, 1)
             rows += 1
-    
+
     def showAt(self, pos):
         """
         Public method to show the widget.
-        
+
         @param pos position to show at (QPoint)
         """
         self.adjustSize()
@@ -200,18 +193,16 @@
         p = QPoint(xpos, pos.y() + 10)
         self.move(p)
         self.show()
-    
+
     def __showCertificateInfos(self):
         """
         Private slot to show certificate information.
         """
-        from .EricSslCertificatesInfoDialog import (
-            EricSslCertificatesInfoDialog
-        )
-        dlg = EricSslCertificatesInfoDialog(
-            self.__configuration.peerCertificateChain())
+        from .EricSslCertificatesInfoDialog import EricSslCertificatesInfoDialog
+
+        dlg = EricSslCertificatesInfoDialog(self.__configuration.peerCertificateChain())
         dlg.exec()
-    
+
     def accept(self):
         """
         Public method to accept the widget.
--- a/src/eric7/EricNetwork/EricSslUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricSslUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,18 +13,21 @@
     Function to initialize some global SSL stuff.
     """
     blacklist = [
-        "SRP-AES-256-CBC-SHA",          # open to MitM
-        "SRP-AES-128-CBC-SHA",          # open to MitM
+        "SRP-AES-256-CBC-SHA",  # open to MitM
+        "SRP-AES-128-CBC-SHA",  # open to MitM
     ]
-    
+
     try:
         from PyQt6.QtNetwork import QSslConfiguration
     except ImportError:
         # no SSL available, so there is nothing to initialize
         return
-    
-    strongCiphers = [c for c in QSslConfiguration.supportedCiphers()
-                     if c.name() not in blacklist and c.usedBits() >= 128]
+
+    strongCiphers = [
+        c
+        for c in QSslConfiguration.supportedCiphers()
+        if c.name() not in blacklist and c.usedBits() >= 128
+    ]
     defaultSslConfiguration = QSslConfiguration.defaultConfiguration()
     defaultSslConfiguration.setCiphers(strongCiphers)
     QSslConfiguration.setDefaultConfiguration(defaultSslConfiguration)
--- a/src/eric7/EricNetwork/EricTldExtractor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricTldExtractor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,6 +24,7 @@
     """
     Class implementing the host parts helper.
     """
+
     def __init__(self):
         """
         Constructor
@@ -38,43 +39,44 @@
 class EricTldExtractor(QObject):
     """
     Class implementing the TLD Extractor.
-    
+
     Note: The module function instance() should be used to get a reference
     to a global object to avoid overhead.
     """
+
     def __init__(self, withPrivate=False, parent=None):
         """
         Constructor
-        
+
         @param withPrivate flag indicating to load private TLDs as well
         @type bool
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__withPrivate = withPrivate
         self.__dataFileName = ""
         self.__dataSearchPaths = []
-        
+
         self.__tldDict = collections.defaultdict(list)
         # dict with list of str as values
-        
+
         self.setDataSearchPaths()
-    
+
     def isDataLoaded(self):
         """
         Public method to check, if the TLD data ia already loaded.
-        
+
         @return flag indicating data is loaded
         @rtype bool
         """
         return bool(self.__tldDict)
-    
+
     def tld(self, host):
         """
         Public method to get the top level domain for a host.
-        
+
         @param host host name to get TLD for
         @type str
         @return TLD for host
@@ -82,118 +84,118 @@
         """
         if not host or host.startswith("."):
             return ""
-        
+
         cleanHost = self.__normalizedHost(host)
-        
-        tldPart = cleanHost[cleanHost.rfind(".") + 1:]
+
+        tldPart = cleanHost[cleanHost.rfind(".") + 1 :]
         cleanHost = bytes(QUrl.toAce(cleanHost)).decode("utf-8")
-        
+
         self.__loadData()
-        
+
         if tldPart not in self.__tldDict:
             return tldPart
-        
+
         tldRules = self.__tldDict[tldPart][:]
-        
+
         if tldPart not in tldRules:
             tldRules.append(tldPart)
-        
+
         maxLabelCount = 0
         isWildcardTLD = False
-        
+
         for rule in tldRules:
             labelCount = rule.count(".") + 1
-            
+
             if rule.startswith("!"):
                 rule = rule[1:]
-                
+
                 rule = bytes(QUrl.toAce(rule)).decode("utf-8")
-                
+
                 # matches with exception TLD
                 if cleanHost.endswith(rule):
-                    tldPart = rule[rule.find(".") + 1:]
+                    tldPart = rule[rule.find(".") + 1 :]
                     break
-            
+
             if rule.startswith("*"):
                 rule = rule[1:]
-                
+
                 if rule.startswith("."):
                     rule = rule[1:]
-                
+
                 isWildcardTLD = True
             else:
                 isWildcardTLD = False
-            
+
             rule = bytes(QUrl.toAce(rule)).decode("utf-8")
             testRule = "." + rule
             testUrl = "." + cleanHost
-            
+
             if labelCount > maxLabelCount and testUrl.endswith(testRule):
                 tldPart = rule
                 maxLabelCount = labelCount
-                
+
                 if isWildcardTLD:
                     temp = cleanHost
-                    temp = temp[:temp.rfind(tldPart)]
-                    
+                    temp = temp[: temp.rfind(tldPart)]
+
                     if temp.endswith("."):
                         temp = temp[:-1]
-                    
-                    temp = temp[temp.rfind(".") + 1:]
-                    
+
+                    temp = temp[temp.rfind(".") + 1 :]
+
                     if temp:
                         tldPart = temp + "." + rule
                     else:
                         tldPart = rule
-        
+
         temp = self.__normalizedHost(host)
-        tldPart = ".".join(
-            temp.split(".")[temp.count(".") - tldPart.count("."):])
-        
+        tldPart = ".".join(temp.split(".")[temp.count(".") - tldPart.count(".") :])
+
         return tldPart
-    
+
     def domain(self, host):
         """
         Public method to get the domain for a host.
-        
+
         @param host host name to get the domain for
         @type str
         @return domain for host
         @rtype str
         """
         tldPart = self.tld(host)
-        
+
         return self.__domainHelper(host, tldPart)
-    
+
     def registrableDomain(self, host):
         """
         Public method to get the registrable domain for a host.
-        
+
         @param host host name to get the registrable domain for
         @type str
         @return registrable domain for host
         @rtype str
         """
         tldPart = self.tld(host)
-        
+
         return self.__registrableDomainHelper(
-            self.__domainHelper(host, tldPart), tldPart)
-    
+            self.__domainHelper(host, tldPart), tldPart
+        )
+
     def subdomain(self, host):
         """
         Public method to get the subdomain for a host.
-        
+
         @param host host name to get the subdomain for
         @type str
         @return subdomain for host
         @rtype str
         """
         return self.__subdomainHelper(host, self.registrableDomain(host))
-    
+
     def splitParts(self, host):
         """
         Public method to split a host address into its parts.
-        
+
         @param host host address to be split
         @type str
         @return splitted host address
@@ -204,25 +206,25 @@
         hostParts.tld = self.tld(host)
         hostParts.domain = self.__domainHelper(host, hostParts.tld)
         hostParts.registrableDomain = self.__registrableDomainHelper(
-            hostParts.domain, hostParts.tld)
-        hostParts.subdomain = self.__subdomainHelper(
-            host, hostParts.registrableDomain)
-        
+            hostParts.domain, hostParts.tld
+        )
+        hostParts.subdomain = self.__subdomainHelper(host, hostParts.registrableDomain)
+
         return hostParts
-    
+
     def dataSearchPaths(self):
         """
         Public method to get the search paths for the TLD data file.
-        
+
         @return search paths for the TLD data file
         @rtype list of str
         """
         return self.__dataSearchPaths[:]
-    
+
     def setDataSearchPaths(self, searchPaths=None):
         """
         Public method to set the search paths for the TLD data file.
-        
+
         @param searchPaths search paths for the TLD data file or None,
             if the default search paths shall be set
         @type list of str
@@ -232,44 +234,45 @@
             self.__dataSearchPaths.extend(self.__defaultDataSearchPaths())
         else:
             self.__dataSearchPaths = self.__defaultDataSearchPaths()[:]
-        
+
         # remove duplicates
         paths = []
         for p in self.__dataSearchPaths:
             if p not in paths:
                 paths.append(p)
         self.__dataSearchPaths = paths
-    
+
     def __defaultDataSearchPaths(self):
         """
         Private method to get the default search paths for the TLD data file.
-        
+
         @return default search paths for the TLD data file
         @rtype list of str
         """
         return [os.path.join(os.path.dirname(__file__), "data")]
-    
+
     def getTldDownloadUrl(self):
         """
         Public method to get the TLD data file download URL.
-        
+
         @return download URL
         @rtype QUrl
         """
         return QUrl(
             "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/"
-            "effective_tld_names.dat?raw=1")
-    
+            "effective_tld_names.dat?raw=1"
+        )
+
     def __loadData(self):
         """
         Private method to load the TLD data.
         """
         if self.isDataLoaded():
             return
-        
+
         dataFileName = ""
         parsedDataFileExist = False
-        
+
         for searchPath in self.__dataSearchPaths:
             dataFileName = os.path.abspath(
                 os.path.join(searchPath, "effective_tld_names.dat")
@@ -277,7 +280,7 @@
             if os.path.exists(dataFileName):
                 parsedDataFileExist = True
                 break
-        
+
         if not parsedDataFileExist:
             tldDataFileDownloadLink = (
                 "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/"
@@ -286,27 +289,30 @@
             EricMessageBox.information(
                 None,
                 self.tr("TLD Data File not found"),
-                self.tr("""<p>The file 'effective_tld_names.dat' was not"""
-                        """ found!<br/>You can download it from """
-                        """'<a href="{0}"><b>here</b></a>' to one of the"""
-                        """ following paths:</p><ul>{1}</ul>""").format(
+                self.tr(
+                    """<p>The file 'effective_tld_names.dat' was not"""
+                    """ found!<br/>You can download it from """
+                    """'<a href="{0}"><b>here</b></a>' to one of the"""
+                    """ following paths:</p><ul>{1}</ul>"""
+                ).format(
                     tldDataFileDownloadLink,
-                    "".join(["<li>{0}</li>".format(p)
-                             for p in self.__dataSearchPaths]))
+                    "".join(["<li>{0}</li>".format(p) for p in self.__dataSearchPaths]),
+                ),
             )
             return
-        
+
         self.__dataFileName = dataFileName
-        if not self.__parseData(dataFileName,
-                                loadPrivateDomains=self.__withPrivate):
+        if not self.__parseData(dataFileName, loadPrivateDomains=self.__withPrivate):
             qWarning(
-                "EricTldExtractor: There are some parse errors for file: {0}"
-                .format(dataFileName))
-    
+                "EricTldExtractor: There are some parse errors for file: {0}".format(
+                    dataFileName
+                )
+            )
+
     def __parseData(self, dataFile, loadPrivateDomains=False):
         """
         Private method to parse TLD data.
-        
+
         @param dataFile name of the file containing the TLD data
         @type str
         @param loadPrivateDomains flag indicating to load private domains
@@ -316,50 +322,50 @@
         """
         # start with a fresh dictionary
         self.__tldDict = collections.defaultdict(list)
-        
+
         seekToEndOfPrivateDomains = False
-        
+
         try:
             with open(dataFile, "r", encoding="utf-8") as f:
                 for line in f.readlines():
                     if not line:
                         continue
-                    
+
                     if line.startswith("."):
                         line = line[1:]
-                    
+
                     if line.startswith("//"):
                         if "===END PRIVATE DOMAINS===" in line:
                             seekToEndOfPrivateDomains = False
-                        
+
                         if (
-                            not loadPrivateDomains and
-                            "===BEGIN PRIVATE DOMAINS===" in line
+                            not loadPrivateDomains
+                            and "===BEGIN PRIVATE DOMAINS===" in line
                         ):
                             seekToEndOfPrivateDomains = True
-                        
+
                         continue
-                    
+
                     if seekToEndOfPrivateDomains:
                         continue
-                    
+
                     # only data up to the first whitespace is used
                     line = line.split(None, 1)[0]
-                    
+
                     if "." not in line:
                         self.__tldDict[line].append(line)
                     else:
-                        key = line[line.rfind(".") + 1:]
+                        key = line[line.rfind(".") + 1 :]
                         self.__tldDict[key].append(line)
-                
+
                 return self.isDataLoaded()
         except OSError:
             return False
-    
+
     def __domainHelper(self, host, tldPart):
         """
         Private method to get the domain name without TLD.
-        
+
         @param host host address
         @type str
         @param tldPart TLD part of the host address
@@ -369,19 +375,19 @@
         """
         if not host or not tldPart:
             return ""
-        
+
         temp = self.__normalizedHost(host)
-        temp = temp[:temp.rfind(tldPart)]
-        
+        temp = temp[: temp.rfind(tldPart)]
+
         if temp.endswith("."):
             temp = temp[:-1]
-        
-        return temp[temp.rfind(".") + 1:]
-    
+
+        return temp[temp.rfind(".") + 1 :]
+
     def __registrableDomainHelper(self, domainPart, tldPart):
         """
         Private method to get the registrable domain (i.e. domain plus TLD).
-        
+
         @param domainPart domain part of a host address
         @type str
         @param tldPart TLD part of a host address
@@ -393,12 +399,12 @@
             return ""
         else:
             return "{0}.{1}".format(domainPart, tldPart)
-    
+
     def __subdomainHelper(self, host, registrablePart):
         """
         Private method to get the subdomain of a host address (i.e. domain part
         without the registrable domain name).
-        
+
         @param host host address
         @type str
         @param registrablePart registrable domain part of the host address
@@ -408,20 +414,20 @@
         """
         if not host or not registrablePart:
             return ""
-        
+
         subdomain = self.__normalizedHost(host)
-        
-        subdomain = subdomain[:subdomain.rfind(registrablePart)]
-        
+
+        subdomain = subdomain[: subdomain.rfind(registrablePart)]
+
         if subdomain.endswith("."):
             subdomain = subdomain[:-1]
-        
+
         return subdomain
-    
+
     def __normalizedHost(self, host):
         """
         Private method to get the normalized host for a host address.
-        
+
         @param host host address to be normalized
         @type str
         @return normalized host address
@@ -437,15 +443,15 @@
     """
     Global function to get a reference to the TLD extractor and create it, if
     it hasn't been yet.
-    
+
     @param withPrivate flag indicating to load private TLDs as well
     @type bool
     @return reference to the zoom manager object
     @rtype EricTldExtractor
     """
     global _TLDExtractor
-    
+
     if _TLDExtractor is None:
         _TLDExtractor = EricTldExtractor(withPrivate=withPrivate)
-    
+
     return _TLDExtractor
--- a/src/eric7/EricNetwork/EricUrlInfo.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricNetwork/EricUrlInfo.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,6 +16,7 @@
     """
     Class defining the URL permissions.
     """
+
     READ_OWNER = 0o0400
     WRITE_OWNER = 0o0200
     EXE_OWNER = 0o0100
@@ -31,12 +32,13 @@
     """
     Class implementing a replacement for QUrlInfo.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.__valid = False
-        
+
         self.__permissions = 0
         self.__size = 0
         self.__isDir = False
@@ -50,223 +52,223 @@
         self.__group = ""
         self.__lastModified = QDateTime()
         self.__lastRead = QDateTime()
-    
+
     def isValid(self):
         """
         Public method to check the validity of the object.
-        
+
         @return flag indicating validity (boolean)
         """
         return self.__valid
-    
+
     def setName(self, name):
         """
         Public method to set the name.
-        
+
         @param name name to be set (string)
         """
         self.__name = name
         self.__valid = True
-    
+
     def setPermissions(self, permissions):
         """
         Public method to set the permissions.
-        
+
         @param permissions permissions to be set (integer)
         """
         self.__permissions = permissions
         self.__valid = True
-    
+
     def setDir(self, isDir):
         """
         Public method to indicate a directory.
-        
+
         @param isDir flag indicating a directory (boolean)
         """
         self.__isDir = isDir
         self.__valid = True
-    
+
     def setFile(self, isFile):
         """
         Public method to indicate a file.
-        
+
         @param isFile flag indicating a file (boolean)
         """
         self.__isFile = isFile
         self.__valid = True
-    
+
     def setSymLink(self, isSymLink):
         """
         Public method to indicate a symbolic link.
-        
+
         @param isSymLink flag indicating a symbolic link (boolean)
         """
         self.__isSymLink = isSymLink
         self.__valid = True
-    
+
     def setOwner(self, owner):
         """
         Public method to set the owner.
-        
+
         @param owner owner to be set (string)
         """
         self.__owner = owner
         self.__valid = True
-    
+
     def setGroup(self, group):
         """
         Public method to set the group.
-        
+
         @param group group to be set (string)
         """
         self.__group = group
         self.__valid = True
-    
+
     def setSize(self, size):
         """
         Public method to set the size.
-        
+
         @param size size to be set (integer)
         """
         self.__size = size
         self.__valid = True
-    
+
     def setWritable(self, isWritable):
         """
         Public method to a writable entry.
-        
+
         @param isWritable flag indicating a writable entry (boolean)
         """
         self.__isWritable = isWritable
         self.__valid = True
-    
+
     def setReadable(self, isReadable):
         """
         Public method to a readable entry.
-        
+
         @param isReadable flag indicating a readable entry (boolean)
         """
         self.__isReadable = isReadable
         self.__valid = True
-    
+
     def setLastModified(self, dt):
         """
         Public method to set the last modified date and time.
-        
+
         @param dt date and time to set (QDateTime)
         """
         self.__lastModified = QDateTime(dt)
         self.__valid = True
-    
+
     def setLastRead(self, dt):
         """
         Public method to set the last read date and time.
-        
+
         @param dt date and time to set (QDateTime)
         """
         self.__lastRead = QDateTime(dt)
         self.__valid = True
-    
+
     def name(self):
         """
         Public method to get the name.
-        
+
         @return name (string)
         """
         return self.__name
-    
+
     def permissions(self):
         """
         Public method to get the permissions.
-        
+
         @return permissions (integer)
         """
         return self.__permissions
-    
+
     def owner(self):
         """
         Public method to get the owner.
-        
+
         @return owner (string)
         """
         return self.__owner
-    
+
     def group(self):
         """
         Public method to get the group.
-        
+
         @return group (string)
         """
         return self.__group
-    
+
     def size(self):
         """
         Public method to get the size.
-        
+
         @return size (integer)
         """
         return self.__size
-    
+
     def lastModified(self):
         """
         Public method to get the last modified date and time.
-        
+
         @return last modified date and time (QDateTime)
         """
         return QDateTime(self.__lastModified)
-    
+
     def lastRead(self):
         """
         Public method to get the last read date and time.
-        
+
         @return last read date and time (QDateTime)
         """
         return QDateTime(self.__lastRead)
-    
+
     def isDir(self):
         """
         Public method to test, if the entry is a directory.
-        
+
         @return flag indicating a directory (boolean)
         """
         return self.__isDir
-    
+
     def isFile(self):
         """
         Public method to test, if the entry is a file.
-        
+
         @return flag indicating a file (boolean)
         """
         return self.__isFile
-    
+
     def isSymLink(self):
         """
         Public method to test, if the entry is a symbolic link.
-        
+
         @return flag indicating a symbolic link (boolean)
         """
         return self.__isSymlink
-    
+
     def isWritable(self):
         """
         Public method to test, if the entry is writable.
-        
+
         @return flag indicating writable (boolean)
         """
         return self.__isWritable
-    
+
     def isReadable(self):
         """
         Public method to test, if the entry is readable.
-        
+
         @return flag indicating readable (boolean)
         """
         return self.__isReadable
-    
+
     def isExecutable(self):
         """
         Public method to test, if the entry is executable.
-        
+
         @return flag indicating executable (boolean)
         """
         return self.__isExecutable
--- a/src/eric7/EricUtilities/EricCache.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricUtilities/EricCache.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,73 +13,74 @@
 class EricCache:
     """
     Class implementing a LRU cache of a specific size.
-    
+
     If the maximum number of entries is exceeded, the least recently used item
     is removed from the cache. A cache hit moves the entry to the front of the
     cache.
     """
+
     def __init__(self, size=100):
         """
         Constructor
-        
+
         @param size maximum number of entries that may be stored in the cache
         @type int
         @exception ValueError raised to indicate an illegal 'size' parameter
         """
         if size < 0:
             raise ValueError("'size' parameter must be positive.")
-        
+
         self.__size = size
-        
+
         # internal objects
         self.__keyList = []
-        self.__store = {}           # stores the cache entries
-        self.__accesStore = {}      # stores the last access date and times
+        self.__store = {}  # stores the cache entries
+        self.__accesStore = {}  # stores the last access date and times
         self.__hits = 0
         self.__misses = 0
         self.__maxsize = 0
-        self.__maxCacheTime = 0     # 0 seconds means aging is disabled
-        
+        self.__maxCacheTime = 0  # 0 seconds means aging is disabled
+
         self.__cacheTimer = QTimer()
         self.__cacheTimer.setSingleShot(True)
         self.__cacheTimer.timeout.connect(self.__pruneCache)
-    
+
     def __moveLast(self, key):
         """
         Private method to move a cached item to the MRU position.
-        
+
         @param key key of the item to be retrieved
         @type any hashable type that can be used as a dict key
         """
         self.__keyList.remove(key)
         self.__keyList.append(key)
-    
+
     def __adjustToSize(self):
         """
         Private method to adjust the cache to its size.
         """
         if self.__size:
-            removeList = self.__keyList[:-self.__size]
-            self.__keyList = self.__keyList[-self.__size:]
+            removeList = self.__keyList[: -self.__size]
+            self.__keyList = self.__keyList[-self.__size :]
             for key in removeList:
                 del self.__store[key]
                 del self.__accesStore[key]
         else:
             self.reset()
-    
+
     def getSize(self):
         """
         Public method to get the maximum size of the cache.
-        
+
         @return maximum number of entries of the cache
         @rtype int
         """
         return self.__size
-    
+
     def setSize(self, newSize):
         """
         Public method to change the maximum size of the cache.
-        
+
         @param newSize maximum number of entries that may be stored in the
             cache
         @type int
@@ -87,20 +88,20 @@
         if newSize >= 0:
             self.__size = newSize
             self.__adjustToSize()
-    
+
     def getMaximumCacheTime(self):
         """
         Public method to get the maximum time entries may exist in the cache.
-        
+
         @return maximum cache time in seconds
         @rtype int
         """
         return self.__maxCacheTime
-    
+
     def setMaximumCacheTime(self, time):
         """
         Public method to set the maximum time entries may exist in the cache.
-        
+
         @param time maximum cache time in seconds
         @type int
         """
@@ -111,13 +112,13 @@
             if self.__maxCacheTime > 0:
                 self.__cacheTimer.setInterval(self.__maxCacheTime * 1000)
                 self.__cacheTimer.start()
-    
+
     def get(self, key):
         """
         Public method to get an entry from the cache given its key.
-        
+
         If the key is present in the cache, it is moved to the MRU position.
-        
+
         @param key key of the item to be retrieved
         @type any hashable type that can be used as a dict key
         @return cached item for the given key or None, if the key is not
@@ -132,14 +133,14 @@
         else:
             self.__misses += 1
             return None
-    
+
     def add(self, key, item):
         """
         Public method to add an item to the cache.
-        
+
         If the key is already in use, the cached item is replaced by the new
         one given and is moved to the MRU position
-        
+
         @param key key of the item to be retrieved
         @type any hashable type that can be used as a dict key
         @param item item to be cached under the given key
@@ -151,15 +152,15 @@
             self.__keyList.append(key)
         self.__store[key] = item
         self.__accesStore[key] = QDateTime.currentDateTimeUtc()
-        
+
         self.__adjustToSize()
-        
+
         self.__maxsize = max(self.__maxsize, len(self.__keyList))
-    
+
     def remove(self, key):
         """
         Public method to remove an item from the cache.
-        
+
         @param key key of the item to be retrieved
         @type any hashable type that can be used as a dict key
         """
@@ -167,7 +168,7 @@
             del self.__store[key]
             del self.__accesStore[key]
             self.__keyList.remove(key)
-    
+
     def clear(self):
         """
         Public method to clear the cache.
@@ -175,11 +176,11 @@
         self.__keyList = []
         self.__store = {}
         self.__accesStore = {}
-    
+
     def reset(self):
         """
         Public method to reset the cache.
-        
+
         This is like clear() but sets the various counters to their initial
         value as well.
         """
@@ -187,20 +188,20 @@
         self.__hits = 0
         self.__misses = 0
         self.__maxsize = 0
-    
+
     def length(self):
         """
         Public method to get the current length of the cache.
-        
+
         @return current length of the cache
         @rtype int
         """
         return len(self.__keyList)
-    
+
     def info(self):
         """
         Public method to get some information about the cache.
-        
+
         @return dictionary containing the cache info
         @rtype dict (with keys "hits", "misses", "maxsize", "currsize")
         """
@@ -210,19 +211,19 @@
             "maxsize": self.__maxsize,
             "currsize": self.length(),
         }
-    
+
     def __pruneCache(self):
         """
         Private slot to prune outdated cache entries and restart the timer.
         """
         if self.__maxCacheTime > 0:
             current = QDateTime.currentDateTimeUtc()
-            
+
             keysToBeDeleted = []
             for key, lastAccessTime in self.__accesStore.items():
                 if lastAccessTime.secsTo(current) > self.__maxCacheTime:
                     keysToBeDeleted.append(key)
             for key in keysToBeDeleted:
                 self.remove(key)
-        
+
             self.__cacheTimer.start()
--- a/src/eric7/EricUtilities/EricMutexLocker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricUtilities/EricMutexLocker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,30 +14,31 @@
     """
     Class implementing a context manager locking and unlocking a mutex.
     """
+
     def __init__(self, mutex):
         """
         Constructor
-        
+
         @param mutex reference to the mutex to be locked
         @type QMutex or QRecursiveMutex
         """
         self.__mutex = mutex
-    
+
     def __enter__(self):
         """
         Special method called when entering the runtime ccontext.
-        
+
         @return reference to the context manager object
         @rtype EricOverrideCursor
         """
         self.__mutex.lock()
-        
+
         return self
-    
+
     def __exit__(self, exc_type, exc_value, traceback):
         """
         Special method called when exiting the runtime ccontext.
-        
+
         @param exc_type type of an exception raised in the runtime context
         @param exc_value value of an exception raised in the runtime context
         @param traceback traceback of an exception raised in the runtime
@@ -46,5 +47,5 @@
         @rtype None
         """
         self.__mutex.unlock()
-        
-        return None     # __IGNORE_WARNING_M831__
+
+        return None  # __IGNORE_WARNING_M831__
--- a/src/eric7/EricWidgets/EricAnimatedLabel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricAnimatedLabel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a label widget showing an animated pixmap.
     """
+
     def __init__(self, parent=None, *, animationFile="", interval=100):
         """
         Constructor
-        
+
         @param parent reference to the parent window
         @type QWidget
         @keyparam animationFile path to the file containing the animation data
@@ -30,29 +31,29 @@
         @type int
         """
         super().__init__(parent)
-        
+
         self.__timer = QTimer(self)
         self.__timer.setInterval(interval)
         self.__timer.timeout.connect(self.__animate)
-        
+
         self.__currentFrame = 0
         self.__frames = 0
         self.__pixmap = None
         self.__pixmapHeight = 0
         self.__animationFile = ""
         self.__animationFileLoaded = False
-        
+
         self.__loadAnimationFile(animationFile)
-    
+
     def __loadAnimationFile(self, animationFile):
         """
         Private method to load an animation file.
-        
+
         @param animationFile path to the file containing the animation data
         @type str
         """
         self.__animationFile = animationFile
-        
+
         pixmap = UI.PixmapCache.getPixmap(animationFile)
         if not pixmap.isNull():
             self.__pixmap = pixmap
@@ -65,9 +66,9 @@
             self.__pixmapHeight = 0
             self.__frames = 0
             self.__animationFileLoaded = False
-        
+
         self.reset()
-    
+
     @pyqtSlot()
     def __animate(self):
         """
@@ -75,15 +76,17 @@
         """
         if self.__animationFileLoaded:
             self.__currentFrame = (self.__currentFrame + 1) % self.__frames
-            super().setPixmap(self.__pixmap.copy(
-                self.__currentFrame * self.__pixmapHeight,
-                0,
-                self.__pixmapHeight,
-                self.__pixmapHeight
-            ))
+            super().setPixmap(
+                self.__pixmap.copy(
+                    self.__currentFrame * self.__pixmapHeight,
+                    0,
+                    self.__pixmapHeight,
+                    self.__pixmapHeight,
+                )
+            )
         else:
             self.clear()
-    
+
     @pyqtSlot()
     def reset(self):
         """
@@ -91,7 +94,7 @@
         """
         self.__currentFrame = -1
         self.__animate()
-    
+
     @pyqtSlot()
     def start(self):
         """
@@ -99,27 +102,27 @@
         """
         if self.__animationFileLoaded:
             self.__timer.start()
-    
+
     @pyqtSlot()
     def stop(self):
         """
         Public slot to stop the animation.
         """
         self.__timer.stop()
-    
+
     def isActive(self):
         """
         Public method to check, if the animation is active.
-        
+
         @return flag indicating an active animation
         @rtype bool
         """
         return self.__timer.isActive() and self.__animationFileLoaded
-    
+
     def setAnimationFile(self, animationFile):
         """
         Public method to set the name of the animation file.
-        
+
         @param animationFile path to the file containing the animation data
         @type str
         """
@@ -128,51 +131,51 @@
         self.__loadAnimationFile(animationFile)
         if active and self.__animationFileLoaded:
             self.__timer.start()
-    
+
     def getAnimationFile(self):
         """
         Public method to get the name of the animation file.
-        
+
         @return path to the file containing the animation data
         @rtype str
         """
         return self.__animationFile
-    
+
     def isAnimationFileLoaded(self):
         """
         Public method to check, if the animation file was loaded.
-        
+
         @return flag indicating a successfully loaded animation file
         @rtype bool
         """
         return self.__animationFileLoaded
-    
+
     def setInterval(self, interval):
         """
         Public method to set the interval between the animated frames.
-        
+
         @param interval interval in milliseconds between animation frames
         @type int
         """
         self.__timer.setInterval(interval)
-    
+
     def getInterval(self):
         """
         Public method to get the interval between the animated frames.
-        
+
         @return interval in milliseconds between animation frames
         @rtype int
         """
         return self.__timer.interval()
-    
+
     def setPixmap(self, pixmap):
         """
         Public slot to set the pixmap of the label.
-        
+
         Setting a standard pixmap will stop the animation and set the given
         pixmap without animating it. Thereafter the animation has to be
         restarted with the start() method.
-        
+
         @param pixmap pixmap to be set
         @type QPixmap
         """
--- a/src/eric7/EricWidgets/EricAnimatedWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricAnimatedWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,13 +19,14 @@
     """
     Class implementing an animated widget.
     """
+
     DirectionDown = 0
     DirectionUp = 1
-    
+
     def __init__(self, direction=DirectionDown, duration=300, parent=None):
         """
         Constructor
-        
+
         @param direction direction of the animation
         @type int (one of DirectionDown or DirectionUp)
         @param duration duration of the animation
@@ -34,28 +35,28 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__direction = direction
         self.__stepHeight = 0.0
         self.__stepY = 0.0
         self.__startY = 0
         self.__widget = QWidget(self)
-        
+
         self.__timeline = QTimeLine(duration)
         self.__timeline.setFrameRange(0, 100)
         self.__timeline.frameChanged.connect(self.__animateFrame)
-        
+
         self.setMaximumHeight(0)
-    
+
     def widget(self):
         """
         Public method to get a reference to the animated widget.
-        
+
         @return reference to the animated widget
         @rtype QWidget
         """
         return self.__widget
-    
+
     @pyqtSlot()
     def startAnimation(self):
         """
@@ -63,35 +64,34 @@
         """
         if self.__timeline.state() == QTimeLine.State.Running:
             return
-        
+
         shown = 0
         hidden = 0
-        
+
         if self.__direction == self.DirectionDown:
             shown = 0
             hidden = -self.__widget.height()
-        
+
         self.__widget.move(QPoint(self.__widget.pos().x(), hidden))
-        
+
         self.__stepY = (hidden - shown) / 100.0
         self.__startY = hidden
         self.__stepHeight = self.__widget.height() / 100.0
-        
+
         self.__timeline.setDirection(QTimeLine.Direction.Forward)
         self.__timeline.start()
-    
+
     @pyqtSlot(int)
     def __animateFrame(self, frame):
         """
         Private slot to animate the next frame.
-        
+
         @param frame frame number
         @type int
         """
         self.setFixedHeight(frame * self.__stepHeight)
-        self.__widget.move(self.pos().x(),
-                           self.__startY - frame * self.__stepY)
-    
+        self.__widget.move(self.pos().x(), self.__startY - frame * self.__stepY)
+
     @pyqtSlot()
     def hide(self):
         """
@@ -99,23 +99,23 @@
         """
         if self.__timeline.state() == QTimeLine.State.Running:
             return
-        
+
         self.__timeline.setDirection(QTimeLine.Direction.Backward)
         self.__timeline.finished.connect(self.close)
         self.__timeline.start()
-        
+
         p = self.parentWidget()
         if p is not None:
             p.setFocus()
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle a resize event.
-        
+
         @param evt reference to the event object
         @type QResizeEvent
         """
         if evt.size().width() != self.__widget.width():
             self.__widget.resize(evt.size().width(), self.__widget.height())
-        
+
         super().resizeEvent(evt)
--- a/src/eric7/EricWidgets/EricApplication.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricApplication.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,7 @@
 from PyQt6.QtGui import QColor, QPalette
 from PyQt6.QtWidgets import QApplication
 
-QCoreApplication.setAttribute(
-    Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True)
+QCoreApplication.setAttribute(Qt.ApplicationAttribute.AA_ShareOpenGLContexts, True)
 
 from . import EricMessageBox
 
@@ -23,6 +22,7 @@
     """
     Eric application class with an object registry.
     """
+
     PaletteRoleMapping = {
         "alternate-base": QPalette.ColorRole.AlternateBase,
         "base": QPalette.ColorRole.Base,
@@ -40,22 +40,23 @@
         "link": QPalette.ColorRole.Link,
         "link-visited": QPalette.ColorRole.LinkVisited,
     }
-    
+
     def __init__(self, argv):
         """
         Constructor
-        
+
         @param argv command line arguments
         @type list
         """
         super().__init__(argv)
-        
+
         QCoreApplication.setAttribute(
-            Qt.ApplicationAttribute.AA_DontCreateNativeWidgetSiblings, True)
-        
+            Qt.ApplicationAttribute.AA_DontCreateNativeWidgetSiblings, True
+        )
+
         self.__objectRegistry = {}
         self.__pluginObjectRegistry = {}
-        
+
         self.__smallScreen = False
         if "--small-screen" in argv:
             self.__smallScreen = True
@@ -63,24 +64,23 @@
         if not self.__smallScreen:
             primaryScreenSize = self.primaryScreen().size()
             self.__smallScreen = (
-                primaryScreenSize.width() < 1920 or
-                primaryScreenSize.height() < 1080
+                primaryScreenSize.width() < 1920 or primaryScreenSize.height() < 1080
             )
-    
+
     def usesSmallScreen(self):
         """
         Public method to determine, if the application is used on a small
         screen.
-        
+
         @return flag indicating the use of a small screen
         @rtype bool
         """
         return self.__smallScreen
-    
+
     def registerObject(self, name, objectRef):
         """
         Public method to register an object in the object registry.
-        
+
         @param name name of the object
         @type str
         @param objectRef reference to the object
@@ -91,11 +91,11 @@
             raise KeyError('Object "{0}" already registered.'.format(name))
         else:
             self.__objectRegistry[name] = objectRef
-    
+
     def getObject(self, name):
         """
         Public method to get a reference to a registered object.
-        
+
         @param name name of the object
         @type str
         @return reference to the registered object
@@ -104,13 +104,13 @@
         """
         if name not in self.__objectRegistry:
             raise KeyError('Object "{0}" is not registered.'.format(name))
-        
+
         return self.__objectRegistry[name]
-    
+
     def registerPluginObject(self, name, objectRef, pluginType=None):
         """
         Public method to register a plugin object in the object registry.
-        
+
         @param name name of the plugin object
         @type str
         @param objectRef reference to the plugin object
@@ -120,25 +120,24 @@
         @exception KeyError raised when the given name is already in use
         """
         if name in self.__pluginObjectRegistry:
-            raise KeyError(
-                'Pluginobject "{0}" already registered.'.format(name))
+            raise KeyError('Pluginobject "{0}" already registered.'.format(name))
         else:
             self.__pluginObjectRegistry[name] = (objectRef, pluginType)
-    
+
     def unregisterPluginObject(self, name):
         """
         Public method to unregister a plugin object in the object registry.
-        
+
         @param name name of the plugin object
         @type str
         """
         if name in self.__pluginObjectRegistry:
             del self.__pluginObjectRegistry[name]
-    
+
     def getPluginObject(self, name):
         """
         Public method to get a reference to a registered plugin object.
-        
+
         @param name name of the plugin object
         @type str
         @return reference to the registered plugin object
@@ -146,16 +145,15 @@
         @exception KeyError raised when the given name is not known
         """
         if name not in self.__pluginObjectRegistry:
-            raise KeyError(
-                'Pluginobject "{0}" is not registered.'.format(name))
-        
+            raise KeyError('Pluginobject "{0}" is not registered.'.format(name))
+
         return self.__pluginObjectRegistry[name][0]
-    
+
     def getPluginObjects(self):
         """
         Public method to get a list of (name, reference) pairs of all
         registered plugin objects.
-        
+
         @return list of (name, reference) pairs
         @rtype list of (str, any)
         """
@@ -163,11 +161,11 @@
         for name in self.__pluginObjectRegistry:
             objects.append((name, self.__pluginObjectRegistry[name][0]))
         return objects
-    
+
     def getPluginObjectType(self, name):
         """
         Public method to get the type of a registered plugin object.
-        
+
         @param name name of the plugin object
         @type str
         @return type of the plugin object
@@ -175,15 +173,14 @@
         @exception KeyError raised when the given name is not known
         """
         if name not in self.__pluginObjectRegistry:
-            raise KeyError(
-                'Pluginobject "{0}" is not registered.'.format(name))
-        
+            raise KeyError('Pluginobject "{0}" is not registered.'.format(name))
+
         return self.__pluginObjectRegistry[name][1]
-    
+
     def getStyleIconsPath(self, universal=False):
         """
         Public method to get the path for the style icons.
-        
+
         @param universal flag indicating a universal file path (defaults to
             False)
         @type bool (optional)
@@ -193,24 +190,23 @@
         import Preferences
         import Utilities
         from eric7config import getConfig
-        
+
         styleIconsPath = Preferences.getUI("StyleIconsPath")
         if not styleIconsPath:
             # default is the 'StyleIcons' sub-directory of the icons
             # directory
-            styleIconsPath = os.path.join(
-                getConfig('ericIconDir'), "StyleIcons")
-        
+            styleIconsPath = os.path.join(getConfig("ericIconDir"), "StyleIcons")
+
         if universal:
             return Utilities.fromNativeSeparators(styleIconsPath)
         else:
             return styleIconsPath
-    
+
     def setStyleSheetFile(self, filename):
         """
         Public method to read a QSS style sheet file and set the application
         style sheet based on its contents.
-        
+
         @param filename name of the QSS style sheet file
         @type str
         """
@@ -222,36 +218,38 @@
                 EricMessageBox.warning(
                     None,
                     QCoreApplication.translate(
-                        "EricApplication", "Loading Style Sheet"),
+                        "EricApplication", "Loading Style Sheet"
+                    ),
                     QCoreApplication.translate(
                         "EricApplication",
                         """<p>The Qt Style Sheet file <b>{0}</b> could"""
-                        """ not be read.<br>Reason: {1}</p>""")
-                    .format(filename, str(msg)))
+                        """ not be read.<br>Reason: {1}</p>""",
+                    ).format(filename, str(msg)),
+                )
                 return
         else:
             styleSheet = ""
-        
+
         if styleSheet:
             # pre-process the style sheet to replace the placeholder for the
             # path to the icons
             styleIconsPath = self.getStyleIconsPath(universal=True)
             styleSheet = styleSheet.replace("${path}", styleIconsPath)
-        
+
         if "QPalette {" in styleSheet:
             self.__setPaletteFromStyleSheet(styleSheet)
-        
+
         ericApp().setStyleSheet(styleSheet)
-    
+
     def __setPaletteFromStyleSheet(self, styleSheet):
         """
         Private method to set the palette from a style sheet.
-        
+
         @param styleSheet style sheet
         @type str
         """
         palette = self.palette()
-        
+
         paletteStr = styleSheet.split("QPalette {")[1].split("}")[0]
         paletteLines = paletteStr.strip().splitlines()
         for line in paletteLines:
@@ -260,14 +258,14 @@
             value = value.strip("\t ;")
             if role in self.PaletteRoleMapping and value.startswith("#"):
                 palette.setColor(self.PaletteRoleMapping[role], QColor(value))
-        
+
         self.setPalette(palette)
-    
+
     def usesDarkPalette(self):
         """
         Public method to check, if the application uses a palette with a dark
         background.
-        
+
         @return flag indicating the use of a palette with a dark background
         @rtype bool
         """
@@ -275,4 +273,5 @@
         lightness = palette.color(QPalette.ColorRole.Window).lightness()
         return lightness <= 128
 
+
 ericApp = QCoreApplication.instance
--- a/src/eric7/EricWidgets/EricClickableLabel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricClickableLabel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,42 +14,41 @@
 class EricClickableLabel(QLabel):
     """
     Class implementing a clickable label.
-    
+
     @signal clicked(QPoint) emitted upon a click on the label
         with the left button
     @signal middleClicked(QPoint) emitted upon a click on the label
         with the middle button or CTRL and left button
     """
+
     clicked = pyqtSignal(QPoint)
     middleClicked = pyqtSignal(QPoint)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setCursor(Qt.CursorShape.PointingHandCursor)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method handling mouse release events.
-        
+
         @param evt mouse event (QMouseEvent)
         """
-        if (
-            evt.button() == Qt.MouseButton.LeftButton and
-            self.rect().contains(evt.position().toPoint())
+        if evt.button() == Qt.MouseButton.LeftButton and self.rect().contains(
+            evt.position().toPoint()
         ):
             if evt.modifiers() == Qt.KeyboardModifier.ControlModifier:
                 self.middleClicked.emit(evt.globalPosition().toPoint())
             else:
                 self.clicked.emit(evt.globalPosition().toPoint())
-        elif (
-            evt.button() == Qt.MouseButton.MiddleButton and
-            self.rect().contains(evt.position().toPoint())
+        elif evt.button() == Qt.MouseButton.MiddleButton and self.rect().contains(
+            evt.position().toPoint()
         ):
             self.middleClicked.emit(evt.globalPosition().toPoint())
         else:
--- a/src/eric7/EricWidgets/EricComboSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricComboSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to select one entry from a list of strings.
     """
+
     def __init__(self, entries, title="", message="", parent=None):
         """
         Constructor
-        
+
         @param entries list of entries to select from
         @type list of str or list of tuples of (str, any)
         @param title title of the dialog (defaults to "")
@@ -32,38 +33,36 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for entry in entries:
             if isinstance(entry, tuple):
                 self.selectionComboBox.addItem(*entry)
             else:
                 self.selectionComboBox.addItem(entry)
-        
-        self.on_selectionComboBox_currentTextChanged(
-            self.selectionComboBox.itemText(0))
-        
+
+        self.on_selectionComboBox_currentTextChanged(self.selectionComboBox.itemText(0))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_selectionComboBox_currentTextChanged(self, txt):
         """
         Private slot to react upon changes of the selected entry.
-        
+
         @param txt text of the selected entry
         @type str
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
+
     def getSelection(self):
         """
         Public method to retrieve the selected item and its data.
-        
+
         @return tuple containing the selected entry and its associated data
         @rtype tuple of (str, any)
         """
         return (
             self.selectionComboBox.currentText(),
-            self.selectionComboBox.currentData()
+            self.selectionComboBox.currentData(),
         )
--- a/src/eric7/EricWidgets/EricCompleters.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricCompleters.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,12 +20,16 @@
     """
     Class implementing a completer for file names.
     """
-    def __init__(self, parent=None,
-                 completionMode=QCompleter.CompletionMode.PopupCompletion,
-                 showHidden=False):
+
+    def __init__(
+        self,
+        parent=None,
+        completionMode=QCompleter.CompletionMode.PopupCompletion,
+        showHidden=False,
+    ):
         """
         Constructor
-        
+
         @param parent parent widget of the completer (QWidget)
         @param completionMode completion mode of the
             completer (QCompleter.CompletionMode)
@@ -36,17 +40,19 @@
         self.__model = QFileSystemModel(self)
         if showHidden:
             self.__model.setFilter(
-                QDir.Filter.Dirs |
-                QDir.Filter.Files |
-                QDir.Filter.Drives |
-                QDir.Filter.AllDirs |
-                QDir.Filter.Hidden)
+                QDir.Filter.Dirs
+                | QDir.Filter.Files
+                | QDir.Filter.Drives
+                | QDir.Filter.AllDirs
+                | QDir.Filter.Hidden
+            )
         else:
             self.__model.setFilter(
-                QDir.Filter.Dirs |
-                QDir.Filter.Files |
-                QDir.Filter.Drives |
-                QDir.Filter.AllDirs)
+                QDir.Filter.Dirs
+                | QDir.Filter.Files
+                | QDir.Filter.Drives
+                | QDir.Filter.AllDirs
+            )
         self.__model.setRootPath("")
         self.setModel(self.__model)
         self.setCompletionMode(completionMode)
@@ -54,22 +60,22 @@
             self.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
         if parent:
             parent.setCompleter(self)
-    
+
     def setRootPath(self, path):
         """
         Public method to set the root path of the model.
-        
+
         @param path root path for the model
         @type str
         """
         if not os.path.isdir(path):
             path = os.path.dirname(path)
         self.__model.setRootPath(path)
-    
+
     def rootPath(self):
         """
         Public method to get the root path of the model.
-        
+
         @return root path of the model
         @rtype str
         """
@@ -80,12 +86,16 @@
     """
     Class implementing a completer for directory names.
     """
-    def __init__(self, parent=None,
-                 completionMode=QCompleter.CompletionMode.PopupCompletion,
-                 showHidden=False):
+
+    def __init__(
+        self,
+        parent=None,
+        completionMode=QCompleter.CompletionMode.PopupCompletion,
+        showHidden=False,
+    ):
         """
         Constructor
-        
+
         @param parent parent widget of the completer (QWidget)
         @param completionMode completion mode of the
             completer (QCompleter.CompletionMode)
@@ -96,12 +106,10 @@
         self.__model = QFileSystemModel(self)
         if showHidden:
             self.__model.setFilter(
-                QDir.Filter.Drives |
-                QDir.Filter.AllDirs |
-                QDir.Filter.Hidden)
+                QDir.Filter.Drives | QDir.Filter.AllDirs | QDir.Filter.Hidden
+            )
         else:
-            self.__model.setFilter(
-                QDir.Filter.Drives | QDir.Filter.AllDirs)
+            self.__model.setFilter(QDir.Filter.Drives | QDir.Filter.AllDirs)
         self.__model.setRootPath("")
         self.setModel(self.__model)
         self.setCompletionMode(completionMode)
@@ -109,22 +117,22 @@
             self.setCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
         if parent:
             parent.setCompleter(self)
-    
+
     def setRootPath(self, path):
         """
         Public method to set the root path of the model.
-        
+
         @param path root path for the model
         @type str
         """
         if not os.path.isdir(path):
             path = os.path.dirname(path)
         self.__model.setRootPath(path)
-    
+
     def rootPath(self):
         """
         Public method to get the root path of the model.
-        
+
         @return root path of the model
         @rtype str
         """
@@ -135,11 +143,16 @@
     """
     Class implementing a completer for string lists.
     """
-    def __init__(self, parent=None, strings=None,
-                 completionMode=QCompleter.CompletionMode.PopupCompletion):
+
+    def __init__(
+        self,
+        parent=None,
+        strings=None,
+        completionMode=QCompleter.CompletionMode.PopupCompletion,
+    ):
         """
         Constructor
-        
+
         @param parent parent widget of the completer (QWidget)
         @param strings list of string to load into the completer
             (list of strings)
@@ -147,9 +160,7 @@
             completer (QCompleter.CompletionMode)
         """
         super().__init__(parent)
-        self.__model = QStringListModel(
-            [] if strings is None else strings[:],
-            parent)
+        self.__model = QStringListModel([] if strings is None else strings[:], parent)
         self.setModel(self.__model)
         self.setCompletionMode(completionMode)
         if parent:
--- a/src/eric7/EricWidgets/EricDirFileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricDirFileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,13 +15,14 @@
 class EricDirFileDialog(QFileDialog):
     """
     Derived QFileDialog to select files and directories simultaneously.
-    
+
     For this purpose the none native file dialog is used.
     """
+
     def __init__(self, parent=None, caption="", directory="", filterStr=""):
         """
         Constructor
-        
+
         @param parent parent widget of the dialog
         @type QWidget
         @param caption window title of the dialog
@@ -32,15 +33,15 @@
         @type str
         """
         self.__selectedFilesFolders = []
-        
+
         super().__init__(parent, caption, directory, filterStr)
         self.setFileMode(QFileDialog.FileMode.ExistingFiles)
-    
+
     @pyqtSlot()
     def exec(self):
         """
         Public slot to finalize initialization and start the event loop.
-        
+
         @return accepted or rejected
         @rtype QDialog.DialogCode
         """
@@ -48,11 +49,10 @@
         self.__fileNameEdit = self.findChild(QLineEdit)
         self.directoryEntered.connect(self.on_directoryEntered)
         self.__tree = self.findChild(QTreeView)
-        self.__tree.selectionModel().selectionChanged.connect(
-            self.on_selectionChanged)
-        
+        self.__tree.selectionModel().selectionChanged.connect(self.on_selectionChanged)
+
         return QFileDialog.exec(self)
-    
+
     @pyqtSlot()
     def accept(self):
         """
@@ -61,32 +61,33 @@
         # Avoid to close the dialog if only return is pressed
         if not self.__openBtn.isEnabled():
             return
-        
+
         self.__selectedFilesFolders = [
             x.data(QFileSystemModel.Roles.FilePathRole)
             for x in self.__tree.selectionModel().selectedIndexes()
-            if x.column() == 0]
-        
+            if x.column() == 0
+        ]
+
         self.hide()
-    
+
     @pyqtSlot(str)
     def on_directoryEntered(self, directory):
         """
         Private slot to reset selections if another directory was entered.
-        
+
         @param directory name of the directory entered
         @type str
         """
         self.__tree.selectionModel().clear()
         self.__fileNameEdit.clear()
         self.__openBtn.setEnabled(False)
-    
+
     @pyqtSlot(QItemSelection, QItemSelection)
     def on_selectionChanged(self, selected, deselected):
         """
         Private method to determine the selected files and folders and update
         the line edit.
-        
+
         @param selected newly selected entries
         @type QItemSelection
         @param deselected deselected entries
@@ -95,12 +96,15 @@
         selectedItems = self.__tree.selectionModel().selectedIndexes()
         if self.__tree.rootIndex() in selectedItems or selectedItems == []:
             return
-        
-        selectedFiles = [x.data(QFileSystemModel.Roles.FileNameRole)
-                         for x in selectedItems if x.column() == 0]
+
+        selectedFiles = [
+            x.data(QFileSystemModel.Roles.FileNameRole)
+            for x in selectedItems
+            if x.column() == 0
+        ]
         enteredFiles = self.__fileNameEdit.text().split('"')
         enteredFiles = [x.strip() for x in enteredFiles if x.strip()]
-        
+
         # Check if there is a directory in the selection. Then update the
         # lineEdit.
         for selectedFile in selectedFiles:
@@ -110,13 +114,14 @@
                     txt = '"{0}"'.format(txt)
                 self.__fileNameEdit.setText(txt)
                 break
-    
+
     @staticmethod
-    def getOpenFileAndDirNames(parent=None, caption="", directory="",
-                               filterStr="", options=None):
+    def getOpenFileAndDirNames(
+        parent=None, caption="", directory="", filterStr="", options=None
+    ):
         """
         Static method to get the names of files and directories for opening it.
-        
+
         @param parent parent widget of the dialog
         @type QWidget
         @param caption window title of the dialog
@@ -136,5 +141,5 @@
         dlg = EricDirFileDialog(parent, caption, directory, filterStr)
         dlg.setOptions(options)
         dlg.exec()
-        
+
         return dlg.__selectedFilesFolders
--- a/src/eric7/EricWidgets/EricErrorMessage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricErrorMessage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,13 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    qInstallMessageHandler, Qt, Q_ARG, QSettings, QtMsgType, QThread,
-    QMetaObject
+    qInstallMessageHandler,
+    Qt,
+    Q_ARG,
+    QSettings,
+    QtMsgType,
+    QThread,
+    QMetaObject,
 )
 from PyQt6.QtWidgets import QErrorMessage, QDialog
 
@@ -29,7 +34,8 @@
     QSettings.Format.IniFormat,
     QSettings.Scope.UserScope,
     Globals.settingsNameOrganization,
-    "eric7messagefilters")
+    "eric7messagefilters",
+)
 _defaultFilters = [
     "QFont::",
     "QCocoaMenu::removeMenuItem",
@@ -48,7 +54,7 @@
 def filterMessage(message):
     """
     Module function to filter messages.
-    
+
     @param message message to be checked
     @type str
     @return flag indicating that the message should be filtered out
@@ -56,8 +62,8 @@
     """
     return any(
         filterStr in message
-        for filterStr in Globals.toList(_filterSettings.value(
-            "MessageFilters", [])) + _defaultFilters
+        for filterStr in Globals.toList(_filterSettings.value("MessageFilters", []))
+        + _defaultFilters
     )
 
 
@@ -65,19 +71,20 @@
     """
     Class implementing a specialized error message dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-    
+
     def showMessage(self, message, msgType=""):
         """
         Public method to show a message.
-        
+
         @param message error message to be shown
         @type str
         @param msgType type of the error message
@@ -88,15 +95,16 @@
                 super().showMessage(message, msgType)
             else:
                 super().showMessage(message)
-    
+
     def editMessageFilters(self):
         """
         Public method to edit the list of message filters.
         """
         from .EricErrorMessageFilterDialog import EricErrorMessageFilterDialog
+
         dlg = EricErrorMessageFilterDialog(
-            Globals.toList(_filterSettings.value(
-                "MessageFilters", [])))
+            Globals.toList(_filterSettings.value("MessageFilters", []))
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             filters = dlg.getFilters()
             _filterSettings.setValue("MessageFilters", filters)
@@ -105,7 +113,7 @@
 def messageHandler(msgType, context, message):
     """
     Module function handling messages.
-    
+
     @param msgType type of the message
     @type  int, QtMsgType
     @param context context information
@@ -118,7 +126,7 @@
             # severity is lower than configured
             # just ignore the message
             return
-        
+
         with contextlib.suppress(RuntimeError):
             if msgType == QtMsgType.QtDebugMsg:
                 messageType = "Debug Message:"
@@ -143,11 +151,17 @@
                 (
                     "<p><b>{0}</b></p><p>{1}</p><p>File: {2}</p>"
                     "<p>Line: {3}</p><p>Function: {4}</p>"
-                ).format(messageType, Utilities.html_uencode(message),
-                         context.file, context.line, context.function)
-                if context.file is not None else
-                "<p><b>{0}</b></p><p>{1}</p>".format(
-                    messageType, Utilities.html_uencode(message))
+                ).format(
+                    messageType,
+                    Utilities.html_uencode(message),
+                    context.file,
+                    context.line,
+                    context.function,
+                )
+                if context.file is not None
+                else "<p><b>{0}</b></p><p>{1}</p>".format(
+                    messageType, Utilities.html_uencode(message)
+                )
             )
             if QThread.currentThread() == ericApp().thread():
                 _msgHandlerDialog.showMessage(msg)
@@ -156,12 +170,13 @@
                     _msgHandlerDialog,
                     "showMessage",
                     Qt.ConnectionType.QueuedConnection,
-                    Q_ARG(str, msg))
+                    Q_ARG(str, msg),
+                )
             return
     elif _origMsgHandler:
         _origMsgHandler(msgType, message)
         return
-    
+
     if msgType == QtMsgType.QtDebugMsg:
         messageType = "Debug Message"
     elif msgType == QtMsgType.QtInfoMsg:
@@ -174,26 +189,28 @@
         messageType = "Fatal Error"
     if isinstance(message, bytes):
         message = message.decode()
-    print("{0}: {1} in {2} at line {3} ({4})".format(
-        messageType, message, context.file, context.line,
-        context.function))
+    print(
+        "{0}: {1} in {2} at line {3} ({4})".format(
+            messageType, message, context.file, context.line, context.function
+        )
+    )
 
 
 def qtHandler():
     """
     Module function to install an EricErrorMessage dialog as the global
     message handler.
-    
+
     @return reference to the message handler dialog
     @rtype EricErrorMessage
     """
     global _msgHandlerDialog, _origMsgHandler
-    
+
     if _msgHandlerDialog is None:
         # Install an EricErrorMessage dialog as the global message handler.
         _msgHandlerDialog = EricErrorMessage()
         _origMsgHandler = qInstallMessageHandler(messageHandler)
-    
+
     return _msgHandlerDialog
 
 
@@ -210,11 +227,12 @@
 def messageHandlerInstalled():
     """
     Module function to check, if a message handler was installed.
-    
+
     @return flag indicating an installed message handler
     @rtype bool
     """
     return _msgHandlerDialog is not None
 
+
 #
 # eflag: noqa = M801
--- a/src/eric7/EricWidgets/EricErrorMessageFilterDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricErrorMessageFilterDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to manage the list of messages to be ignored.
     """
+
     def __init__(self, messageFilters, parent=None):
         """
         Constructor
-        
+
         @param messageFilters list of message filters to be edited
         @type list of str
         @param parent reference to the parent widget
@@ -27,20 +28,22 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.filtersEditWidget.setList(messageFilters)
-        self.filtersEditWidget.setListWhatsThis(self.tr(
-            "<b>Error Message Filters</b>"
-            "<p>This list shows the configured message filters used to"
-            " suppress error messages from within Qt.</p>"
-            "<p>A default list of message filters is added to this"
-            " user list.</p>"
-        ))
-    
+        self.filtersEditWidget.setListWhatsThis(
+            self.tr(
+                "<b>Error Message Filters</b>"
+                "<p>This list shows the configured message filters used to"
+                " suppress error messages from within Qt.</p>"
+                "<p>A default list of message filters is added to this"
+                " user list.</p>"
+            )
+        )
+
     def getFilters(self):
         """
         Public method to get the list of message filters.
-        
+
         @return error message filters (list of strings)
         """
         return self.filtersEditWidget.getList()
--- a/src/eric7/EricWidgets/EricFileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricFileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,7 +26,7 @@
     """
     Private function to reorder the file filter to cope with a KDE issue
     introduced by distributor's usage of KDE file dialogs.
-    
+
     @param filterStr Qt file filter
     @type str
     @param initialFilter initial filter
@@ -35,7 +35,7 @@
     @rtype str
     """
     if initialFilter and not Globals.isMacPlatform():
-        fileFilters = filterStr.split(';;')
+        fileFilters = filterStr.split(";;")
         if len(fileFilters) < 10 and initialFilter in fileFilters:
             fileFilters.remove(initialFilter)
         fileFilters.insert(0, initialFilter)
@@ -44,11 +44,10 @@
         return filterStr
 
 
-def getOpenFileName(parent=None, caption="", directory="",
-                    filterStr="", options=None):
+def getOpenFileName(parent=None, caption="", directory="", filterStr="", options=None):
     """
     Module function to get the name of a file for opening it.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -65,16 +64,17 @@
     if options is None:
         options = QFileDialog.Option(0)
     return QFileDialog.getOpenFileName(
-        parent, caption, directory, filterStr, "", options)[0]
+        parent, caption, directory, filterStr, "", options
+    )[0]
 
 
-def getOpenFileNameAndFilter(parent=None, caption="", directory="",
-                             filterStr="", initialFilter="",
-                             options=None):
+def getOpenFileNameAndFilter(
+    parent=None, caption="", directory="", filterStr="", initialFilter="", options=None
+):
     """
     Module function to get the name of a file for opening it and the selected
     file name filter.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -94,14 +94,14 @@
         options = QFileDialog.Option(0)
     newfilter = __reorderFilter(filterStr, initialFilter)
     return QFileDialog.getOpenFileName(
-        parent, caption, directory, newfilter, initialFilter, options)
+        parent, caption, directory, newfilter, initialFilter, options
+    )
 
 
-def getOpenFileNames(parent=None, caption="", directory="",
-                     filterStr="", options=None):
+def getOpenFileNames(parent=None, caption="", directory="", filterStr="", options=None):
     """
     Module function to get a list of names of files for opening.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -118,16 +118,17 @@
     if options is None:
         options = QFileDialog.Option(0)
     return QFileDialog.getOpenFileNames(
-        parent, caption, directory, filterStr, "", options)[0]
+        parent, caption, directory, filterStr, "", options
+    )[0]
 
 
-def getOpenFileNamesAndFilter(parent=None, caption="", directory="",
-                              filterStr="", initialFilter="",
-                              options=None):
+def getOpenFileNamesAndFilter(
+    parent=None, caption="", directory="", filterStr="", initialFilter="", options=None
+):
     """
     Module function to get a list of names of files for opening and the
     selected file name filter.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -147,14 +148,16 @@
         options = QFileDialog.Option(0)
     newfilter = __reorderFilter(filterStr, initialFilter)
     return QFileDialog.getOpenFileNames(
-        parent, caption, directory, newfilter, initialFilter, options)
+        parent, caption, directory, newfilter, initialFilter, options
+    )
 
 
-def getOpenFileAndDirNames(parent=None, caption="", directory="",
-                           filterStr="", options=None):
+def getOpenFileAndDirNames(
+    parent=None, caption="", directory="", filterStr="", options=None
+):
     """
     Module function to get the names of files and directories for opening.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -169,16 +172,16 @@
     @rtype list of str
     """
     from .EricDirFileDialog import EricDirFileDialog
+
     return EricDirFileDialog.getOpenFileAndDirNames(
         parent, caption, directory, filterStr, options
     )
 
 
-def getSaveFileName(parent=None, caption="", directory="",
-                    filterStr="", options=None):
+def getSaveFileName(parent=None, caption="", directory="", filterStr="", options=None):
     """
     Module function to get the name of a file for saving it.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -195,16 +198,17 @@
     if options is None:
         options = QFileDialog.Option(0)
     return QFileDialog.getSaveFileName(
-        parent, caption, directory, filterStr, "", options)[0]
+        parent, caption, directory, filterStr, "", options
+    )[0]
 
 
-def getSaveFileNameAndFilter(parent=None, caption="", directory="",
-                             filterStr="", initialFilter="",
-                             options=None):
+def getSaveFileNameAndFilter(
+    parent=None, caption="", directory="", filterStr="", initialFilter="", options=None
+):
     """
     Module function to get the name of a file for saving it and the selected
     file name filter.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -224,15 +228,16 @@
         options = QFileDialog.Option(0)
     newfilter = __reorderFilter(filterStr, initialFilter)
     return QFileDialog.getSaveFileName(
-        parent, caption, directory, newfilter, initialFilter, options)
+        parent, caption, directory, newfilter, initialFilter, options
+    )
 
 
-def getExistingDirectory(parent=None, caption="",
-                         directory="",
-                         options=QFileDialog.Option.ShowDirsOnly):
+def getExistingDirectory(
+    parent=None, caption="", directory="", options=QFileDialog.Option.ShowDirsOnly
+):
     """
     Module function to get the name of a directory.
-    
+
     @param parent parent widget of the dialog
     @type QWidget
     @param caption window title of the dialog
@@ -246,5 +251,4 @@
     """
     if options is None:
         options = QFileDialog.Option(0)
-    return QFileDialog.getExistingDirectory(parent, caption, directory,
-                                            options)
+    return QFileDialog.getExistingDirectory(parent, caption, directory, options)
--- a/src/eric7/EricWidgets/EricFileSaveConfirmDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricFileSaveConfirmDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 
 import os
 
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit
 
 from .EricPathPicker import EricPathPicker, EricPathPickerModes
 
@@ -21,10 +19,11 @@
     Class implementing a dialog to enter a file system path using a file
     picker.
     """
+
     def __init__(self, filename, title, message="", picker=True, parent=None):
         """
         Constructor
-        
+
         @param filename file name to be shown
         @type str
         @param title title for the dialog
@@ -37,54 +36,57 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setMinimumWidth(400)
-        
+
         self.__selectedAction = "cancel"
         self.__filename = filename
-        
+
         self.__layout = QVBoxLayout(self)
-        
+
         self.__label = QLabel(self)
         self.__label.setWordWrap(True)
         if message:
             self.__label.setText(message)
         else:
             self.__label.setText(self.tr("The given file exists already."))
-        
+
         if picker:
             self.__pathPicker = EricPathPicker(self)
             self.__pathPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         else:
             self.__pathPicker = QLineEdit(self)
             self.__pathPicker.setClearButtonEnabled(True)
-        
+
         self.__buttonBox = QDialogButtonBox(self)
         self.__cancelButton = self.__buttonBox.addButton(
-            QDialogButtonBox.StandardButton.Cancel)
+            QDialogButtonBox.StandardButton.Cancel
+        )
         self.__overwriteButton = self.__buttonBox.addButton(
-            self.tr("Overwrite"), QDialogButtonBox.ButtonRole.AcceptRole)
+            self.tr("Overwrite"), QDialogButtonBox.ButtonRole.AcceptRole
+        )
         self.__renameButton = self.__buttonBox.addButton(
-            self.tr("Rename"), QDialogButtonBox.ButtonRole.AcceptRole)
-        
+            self.tr("Rename"), QDialogButtonBox.ButtonRole.AcceptRole
+        )
+
         self.__layout.addWidget(self.__label)
         self.__layout.addWidget(self.__pathPicker)
         self.__layout.addWidget(self.__buttonBox)
-        
+
         # set values and states
         self.__pathPicker.setText(filename)
         if picker:
             self.__pathPicker.setDefaultDirectory(os.path.dirname(filename))
         self.__renameButton.setEnabled(False)
         self.__cancelButton.setDefault(True)
-        
+
         self.__buttonBox.clicked.connect(self.__buttonBoxClicked)
         self.__pathPicker.textChanged.connect(self.__filenameChanged)
-    
+
     def __buttonBoxClicked(self, button):
         """
         Private slot to handle the user clicking a button.
-        
+
         @param button reference to the clicked button
         @type QAbstractButton
         """
@@ -97,20 +99,20 @@
         elif button == self.__overwriteButton:
             self.__selectedAction = "overwrite"
             self.accept()
-    
+
     def __filenameChanged(self, text):
         """
         Private slot to handle a change of the file name.
-        
+
         @param text new file name
         @type str
         """
         self.__renameButton.setEnabled(text != self.__filename)
-    
+
     def selectedAction(self):
         """
         Public method to get the selected action and associated data.
-        
+
         @return tuple containing the selected action (cancel, rename,
             overwrite) and the filename (in case of 'rename' or 'overwrite')
         @rtype tuple of (str, str)
@@ -127,7 +129,7 @@
 def confirmOverwrite(filename, title, message="", picker=True, parent=None):
     """
     Function to confirm that a file shall be overwritten.
-    
+
     @param filename file name to be shown
     @type str
     @param title title for the dialog
@@ -142,7 +144,8 @@
         overwrite) and the filename (in case of 'rename' or 'overwrite')
     @rtype tuple of (str, str)
     """
-    dlg = EricFileSaveConfirmDialog(filename, title, message=message,
-                                    picker=picker, parent=parent)
+    dlg = EricFileSaveConfirmDialog(
+        filename, title, message=message, picker=picker, parent=parent
+    )
     dlg.exec()
     return dlg.selectedAction()
--- a/src/eric7/EricWidgets/EricIconBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricIconBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,43 +23,26 @@
 class EricIconBar(QWidget):
     """
     Class implementing a bar widget showing just icons.
-    
+
     @signal currentChanged(index) emitted to indicate a change of the current
         index
     @signal currentClicked(index) emitted to indicate, that the current icon
         was clicked
     """
+
     BarSizes = {
         # tuples with (icon size, border size, translated size string)
-        "xs": (
-            16, 1,
-            QCoreApplication.translate("EricIconBar", "extra small")
-        ),
-        "sm": (
-            22, 1,
-            QCoreApplication.translate("EricIconBar", "small")
-        ),
-        "md": (
-            32, 2,
-            QCoreApplication.translate("EricIconBar", "medium")
-        ),
-        "lg": (
-            48, 2,
-            QCoreApplication.translate("EricIconBar", "large")
-        ),
-        "xl": (
-            64, 3,
-            QCoreApplication.translate("EricIconBar", "extra large")
-        ),
-        "xxl": (
-            96, 3,
-            QCoreApplication.translate("EricIconBar", "very large")
-        ),
+        "xs": (16, 1, QCoreApplication.translate("EricIconBar", "extra small")),
+        "sm": (22, 1, QCoreApplication.translate("EricIconBar", "small")),
+        "md": (32, 2, QCoreApplication.translate("EricIconBar", "medium")),
+        "lg": (48, 2, QCoreApplication.translate("EricIconBar", "large")),
+        "xl": (64, 3, QCoreApplication.translate("EricIconBar", "extra large")),
+        "xxl": (96, 3, QCoreApplication.translate("EricIconBar", "very large")),
     }
     DefaultBarSize = "md"
-    
+
     MoreLabelAspect = 36 / 96
-    
+
     MenuStyleSheetTemplate = (
         "QMenu {{ background-color: {0}; "
         "selection-background-color: {1}; "
@@ -67,15 +50,16 @@
     )
     WidgetStyleSheetTemplate = "QWidget {{ background-color: {0}; }}"
     LabelStyleSheetTemplate = "QLabel {{ background-color: {0}; }}"
-    
+
     currentChanged = pyqtSignal(int)
     currentClicked = pyqtSignal(int)
-    
-    def __init__(self, orientation=Qt.Orientation.Horizontal,
-                 barSize=DefaultBarSize, parent=None):
+
+    def __init__(
+        self, orientation=Qt.Orientation.Horizontal, barSize=DefaultBarSize, parent=None
+    ):
         """
         Constructor
-        
+
         @param orientation orientation for the widget
         @type Qt.Orientation
         @param barSize size category for the bar (one of 'xs', 'sm', 'md',
@@ -85,64 +69,63 @@
         @type QWidget (optional)
         """
         super().__init__(parent)
-        
+
         try:
-            self.__barSize, self.__borderSize = (
-                EricIconBar.BarSizes[barSize][:2])
+            self.__barSize, self.__borderSize = EricIconBar.BarSizes[barSize][:2]
             self.__barSizeKey = barSize
         except KeyError:
-            self.__barSize, self.__borderSize = (
-                EricIconBar.BarSizes[EricIconBar.DefaultBarSize][:2])
-        self.__fixedHeightWidth = (
-            self.__barSize + 2 * self.__borderSize
+            self.__barSize, self.__borderSize = EricIconBar.BarSizes[
+                EricIconBar.DefaultBarSize
+            ][:2]
+        self.__fixedHeightWidth = self.__barSize + 2 * self.__borderSize
+        self.__minimumHeightWidth = (
+            int(self.__barSize * self.MoreLabelAspect) + 2 * self.__borderSize
         )
-        self.__minimumHeightWidth = int(
-            self.__barSize * self.MoreLabelAspect) + 2 * self.__borderSize
-        
+
         # set initial values
         self.__color = QColor("#008800")
         self.__orientation = Qt.Orientation.Horizontal
         self.__currentIndex = -1
         self.__icons = []
-        
+
         # initialize with horizontal layout and change later if needed
         self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)
         self.setFixedHeight(self.__fixedHeightWidth)
         self.setMinimumWidth(self.__minimumHeightWidth)
-        
+
         self.__layout = QBoxLayout(QBoxLayout.Direction.LeftToRight)
         self.__layout.setContentsMargins(
-            self.__borderSize, self.__borderSize,
-            self.__borderSize, self.__borderSize)
-        
+            self.__borderSize, self.__borderSize, self.__borderSize, self.__borderSize
+        )
+
         self.__layout.addStretch()
-        
+
         self.setLayout(self.__layout)
-        
+
         if orientation != self.__orientation:
             self.setOrientation(orientation)
-        
+
         self.setColor(self.__color)
-        
+
         self.__createAndAddMoreLabel()
-        
+
         self.__adjustIconLabels()
-    
+
     def setOrientation(self, orientation):
         """
         Public method to set the widget orientation.
-        
+
         @param orientation orientation to be set
         @type Qt.Orientation
         """
         # reset list widget size constraints
         self.setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)
-        
+
         # remove the 'More' icon
         itm = self.__layout.takeAt(self.__layout.count() - 1)
         itm.widget().deleteLater()
         del itm
-        
+
         if orientation == Qt.Orientation.Horizontal:
             self.setFixedHeight(self.__fixedHeightWidth)
             self.setMinimumWidth(self.__minimumHeightWidth)
@@ -151,26 +134,26 @@
             self.setFixedWidth(self.__fixedHeightWidth)
             self.setMinimumHeight(self.__minimumHeightWidth)
             self.__layout.setDirection(QBoxLayout.Direction.TopToBottom)
-        
+
         self.__orientation = orientation
-        
+
         self.__createAndAddMoreLabel()
-        
+
         self.__adjustIconLabels()
-    
+
     def orientation(self):
         """
         Public method to get the orientation of the widget.
-        
+
         @return orientation of the widget
         @rtype Qt.Orientation
         """
         return self.__orientation
-    
+
     def setBarSize(self, barSize):
         """
         Public method to set the icon bar size.
-        
+
         @param barSize size category for the bar (one of 'xs', 'sm', 'md',
             'lg', 'xl', 'xxl')
         @type str
@@ -179,82 +162,77 @@
         itm = self.__layout.takeAt(self.__layout.count() - 1)
         itm.widget().deleteLater()
         del itm
-        
-        self.__barSize, self.__borderSize = (
-            EricIconBar.BarSizes[barSize][:2])
+
+        self.__barSize, self.__borderSize = EricIconBar.BarSizes[barSize][:2]
         self.__barSizeKey = barSize
-        self.__fixedHeightWidth = (
-            self.__barSize + 2 * self.__borderSize
+        self.__fixedHeightWidth = self.__barSize + 2 * self.__borderSize
+        self.__minimumHeightWidth = (
+            int(self.__barSize * self.MoreLabelAspect) + 2 * self.__borderSize
         )
-        self.__minimumHeightWidth = int(
-            self.__barSize * self.MoreLabelAspect) + 2 * self.__borderSize
-        
+
         if self.__orientation == Qt.Orientation.Horizontal:
             self.setFixedHeight(self.__fixedHeightWidth)
             self.setMinimumWidth(self.__minimumHeightWidth)
         elif self.__orientation == Qt.Orientation.Vertical:
             self.setFixedWidth(self.__fixedHeightWidth)
             self.setMinimumHeight(self.__minimumHeightWidth)
-        
+
         self.__layout.setContentsMargins(
-            self.__borderSize, self.__borderSize,
-            self.__borderSize, self.__borderSize)
-        
+            self.__borderSize, self.__borderSize, self.__borderSize, self.__borderSize
+        )
+
         for index, icon in enumerate(self.__icons):
             iconLabel = self.__layout.itemAt(index)
             if iconLabel:
                 widget = iconLabel.widget()
                 widget.setFixedSize(self.__barSize, self.__barSize)
-                widget.setPixmap(
-                    icon.pixmap(self.__barSize, self.__barSize))
-        
+                widget.setPixmap(icon.pixmap(self.__barSize, self.__barSize))
+
         self.__createAndAddMoreLabel()
-        
+
         self.__adjustIconLabels()
-    
+
     def barSize(self):
         """
         Public method to get the icon bar size.
-        
+
         @return barSize size category for the bar (one of 'xs', 'sm', 'md',
             'lg', 'xl', 'xxl')
         @rtype str
         """
         return self.__barSizeKey
-    
+
     def setColor(self, color):
         """
         Public method to set the color of the widget.
-        
+
         @param color color of the widget
         @type QColor
         """
         self.__color = color
         self.__highlightColor = color.darker()
-        
-        self.setStyleSheet(
-            EricIconBar.WidgetStyleSheetTemplate.format(color.name()))
-        
+
+        self.setStyleSheet(EricIconBar.WidgetStyleSheetTemplate.format(color.name()))
+
         label = self.__layout.itemAt(self.__currentIndex)
         if label:
             label.widget().setStyleSheet(
-                EricIconBar.LabelStyleSheetTemplate
-                .format(self.__highlightColor.name())
+                EricIconBar.LabelStyleSheetTemplate.format(self.__highlightColor.name())
             )
-    
+
     def color(self):
         """
         Public method to return the current color.
-        
+
         @return current color
         @rtype QColor
         """
         return self.__color
-    
+
     def __createIcon(self, icon, label=""):
         """
         Private method to creat an icon label.
-        
+
         @param icon reference to the icon
         @type QIcon
         @param label label text to be shown as a tooltip (defaults to "")
@@ -268,11 +246,11 @@
         iconLabel.setPixmap(icon.pixmap(self.__barSize, self.__barSize))
         if label:
             iconLabel.setToolTip(label)
-        
+
         iconLabel.clicked.connect(lambda: self.__iconClicked(iconLabel))
-        
+
         return iconLabel
-    
+
     def __createAndAddMoreLabel(self):
         """
         Private method to create the label to be shown for too many icons.
@@ -281,7 +259,8 @@
         self.__moreLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
         if self.__orientation == Qt.Orientation.Horizontal:
             self.__moreLabel.setFixedSize(
-                int(self.__barSize * self.MoreLabelAspect), self.__barSize)
+                int(self.__barSize * self.MoreLabelAspect), self.__barSize
+            )
             self.__moreLabel.setPixmap(
                 UI.PixmapCache.getIcon("sbDotsH96").pixmap(
                     int(self.__barSize * self.MoreLabelAspect), self.__barSize
@@ -289,21 +268,22 @@
             )
         else:
             self.__moreLabel.setFixedSize(
-                self.__barSize, int(self.__barSize * self.MoreLabelAspect))
+                self.__barSize, int(self.__barSize * self.MoreLabelAspect)
+            )
             self.__moreLabel.setPixmap(
                 UI.PixmapCache.getIcon("sbDotsV96").pixmap(
                     self.__barSize, int(self.__barSize * self.MoreLabelAspect)
                 )
             )
-        
+
         self.__layout.addWidget(self.__moreLabel)
-        
+
         self.__moreLabel.clicked.connect(self.__moreLabelClicked)
-    
+
     def addIcon(self, icon, label=""):
         """
         Public method to add an icon to the bar.
-        
+
         @param icon reference to the icon
         @type QIcon
         @param label label text to be shown as a tooltip (defaults to "")
@@ -311,11 +291,11 @@
         """
         # the stretch item is always the last one
         self.insertIcon(self.count(), icon, label=label)
-    
+
     def insertIcon(self, index, icon, label=""):
         """
         Public method to insert an icon into the bar.
-        
+
         @param index position to insert the icon at
         @type int
         @param icon reference to the icon
@@ -326,18 +306,18 @@
         iconLabel = self.__createIcon(icon, label=label)
         self.__layout.insertWidget(index, iconLabel)
         self.__icons.insert(index, QIcon(icon))
-        
+
         if self.__currentIndex < 0:
             self.setCurrentIndex(index)
         elif index <= self.__currentIndex:
             self.setCurrentIndex(self.__currentIndex + 1)
-        
+
         self.__adjustIconLabels()
-    
+
     def removeIcon(self, index):
         """
         Public method to remove an icon from the bar.
-        
+
         @param index index of the icon to be removed
         @type int
         """
@@ -348,19 +328,19 @@
             itm = self.__layout.takeAt(index)
             itm.widget().deleteLater()
             del itm
-            
+
             if index == self.__currentIndex:
                 self.setCurrentIndex(index)
             elif index < self.__currentIndex:
                 self.setCurrentIndex(self.__currentIndex - 1)
-            
+
             self.__adjustIconLabels()
-    
+
     @pyqtSlot()
     def __iconClicked(self, label):
         """
         Private slot to handle an icon been clicked.
-        
+
         @param label reference to the clicked label
         @type EricClickableLabel
         """
@@ -370,17 +350,17 @@
                 self.currentClicked.emit(self.__currentIndex)
             else:
                 self.setCurrentIndex(index)
-    
+
     def setCurrentIndex(self, index):
         """
         Public method to set the current index.
-        
+
         @param index current index to be set
         @type int
         """
         if index >= self.count():
             index = -1
-        
+
         if index != self.__currentIndex and index >= 0:
             # reset style of previous current icon
             oldLabel = self.__layout.itemAt(self.__currentIndex)
@@ -388,40 +368,41 @@
                 widget = oldLabel.widget()
                 if widget is not None:
                     widget.setStyleSheet("")
-            
+
             # set style of new current icon
             newLabel = self.__layout.itemAt(index)
             if newLabel:
                 newLabel.widget().setStyleSheet(
-                    EricIconBar.LabelStyleSheetTemplate
-                    .format(self.__highlightColor.name())
+                    EricIconBar.LabelStyleSheetTemplate.format(
+                        self.__highlightColor.name()
+                    )
                 )
-            
+
             self.__currentIndex = index
             self.currentChanged.emit(self.__currentIndex)
-    
+
     def currentIndex(self):
         """
         Public method to get the current index.
-        
+
         @return current index
         @rtype int
         """
         return self.__currentIndex
-    
+
     def count(self):
         """
         Public method to get the number of icon labels.
-        
+
         @return number of icon labels
         @rtype int
         """
         return len(self.__icons)
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle a wheel event.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -430,7 +411,7 @@
             self.previousIcon()
         else:
             self.nextIcon()
-    
+
     @pyqtSlot()
     def previousIcon(self):
         """
@@ -440,9 +421,9 @@
         if index < 0:
             # wrap around
             index = self.count() - 1
-        
+
         self.setCurrentIndex(index)
-    
+
     @pyqtSlot()
     def nextIcon(self):
         """
@@ -452,23 +433,23 @@
         if index == self.count():
             # wrap around
             index = 0
-        
+
         self.setCurrentIndex(index)
-    
+
     @pyqtSlot()
     def __moreLabelClicked(self):
         """
         Private slot to handle a click onto the 'More' label.
         """
         menu = QMenu(self)
-        baseColor = ericApp().palette().color(
-            QPalette.ColorRole.Base)
-        highlightColor = ericApp().palette().color(
-            QPalette.ColorRole.Highlight)
+        baseColor = ericApp().palette().color(QPalette.ColorRole.Base)
+        highlightColor = ericApp().palette().color(QPalette.ColorRole.Highlight)
         menu.setStyleSheet(
             EricIconBar.MenuStyleSheetTemplate.format(
-                baseColor.name(), highlightColor.name()))
-        
+                baseColor.name(), highlightColor.name()
+            )
+        )
+
         for index in range(self.count()):
             iconLabel = self.__layout.itemAt(index)
             if iconLabel:
@@ -476,7 +457,7 @@
                 if not widget.isVisible():
                     act = menu.addAction(widget.toolTip())
                     act.setData(index)
-        
+
         selectedAction = menu.exec(QCursor.pos())
         if selectedAction is not None:
             index = selectedAction.data()
@@ -485,28 +466,28 @@
                     self.currentClicked.emit(self.__currentIndex)
                 else:
                     self.setCurrentIndex(index)
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resizing of the icon bar.
-        
+
         @param evt reference to the event object
         @type QResizeEvent
         """
         self.__adjustIconLabels()
-    
+
     def __adjustIconLabels(self):
         """
         Private method to adjust the visibility of the icon labels.
         """
         size = (
             self.width()
-            if self.orientation() == Qt.Orientation.Horizontal else
-            self.height()
+            if self.orientation() == Qt.Orientation.Horizontal
+            else self.height()
         ) - 2 * self.__borderSize
-        
+
         iconsSize = self.count() * self.__barSize
-        
+
         if size < iconsSize:
             self.__moreLabel.show()
             iconsSize += int(self.__barSize * self.MoreLabelAspect)
--- a/src/eric7/EricWidgets/EricLed.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricLed.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class defining the LED types.
     """
+
     RECTANGULAR = 0
     CIRCULAR = 1
 
@@ -28,11 +29,13 @@
     """
     Class implementing a LED widget.
     """
-    def __init__(self, parent=None, color=None, shape=EricLedType.CIRCULAR,
-                 rectRatio=1):
+
+    def __init__(
+        self, parent=None, color=None, shape=EricLedType.CIRCULAR, rectRatio=1
+    ):
         """
         Constructor
-        
+
         @param parent reference to parent widget
         @type QWidget
         @param color color of the LED
@@ -43,10 +46,10 @@
         @type float
         """
         super().__init__(parent)
-        
+
         if color is None:
             color = QColor("green")
-        
+
         self.__led_on = True
         self.__dark_factor = 300
         self.__offcolor = color.darker(self.__dark_factor)
@@ -54,13 +57,13 @@
         self.__framedLed = True
         self.__shape = shape
         self.__rectRatio = rectRatio
-        
+
         self.setColor(color)
-        
+
     def paintEvent(self, evt):
         """
         Protected slot handling the paint event.
-        
+
         @param evt paint event object
         @type QPaintEvent
         """
@@ -68,24 +71,24 @@
             self.__paintRound()
         elif self.__shape == EricLedType.RECTANGULAR:
             self.__paintRectangular()
-    
+
     def __getBestRoundSize(self):
         """
         Private method to calculate the width of the LED.
-        
+
         @return new width of the LED (integer)
         """
         width = min(self.width(), self.height())
         width -= 2  # leave one pixel border
         return width > -1 and width or 0
-        
+
     def __paintRound(self):
         """
         Private method to paint a round raised LED.
         """
         # Initialize coordinates, width and height of the LED
         width = self.__getBestRoundSize()
-        
+
         # Calculate the gradient for the LED
         wh = width / 2
         color = self.__led_on and self.__led_color or self.__offcolor
@@ -94,11 +97,10 @@
         gradient.setColorAt(0.6, color)
         if self.__framedLed:
             gradient.setColorAt(0.9, color.darker())
-            gradient.setColorAt(
-                1.0, self.palette().color(QPalette.ColorRole.Dark))
+            gradient.setColorAt(1.0, self.palette().color(QPalette.ColorRole.Dark))
         else:
             gradient.setColorAt(1.0, color.darker())
-        
+
         # now do the drawing
         paint = QPainter(self)
         paint.setRenderHint(QPainter.RenderHint.Antialiasing, True)
@@ -106,7 +108,7 @@
         paint.setPen(Qt.PenStyle.NoPen)
         paint.drawEllipse(1, 1, width, width)
         paint.end()
-        
+
     def __paintRectangular(self):
         """
         Private method to paint a rectangular raised LED.
@@ -116,7 +118,7 @@
         left = max(0, int((self.width() - width) / 2) - 1)
         right = min(int((self.width() + width) / 2), self.width())
         height = self.height()
-        
+
         # now do the drawing
         painter = QPainter(self)
         painter.setRenderHint(QPainter.RenderHint.Antialiasing, True)
@@ -133,123 +135,123 @@
         painter.drawLine(right - 1, 1, right - 1, height - 1)
         painter.fillRect(left + 1, 1, right - 2, height - 2, QBrush(color))
         painter.end()
-        
+
     def isOn(self):
         """
         Public method to return the LED state.
-        
+
         @return flag indicating the light state (boolean)
         """
         return self.__led_on
-        
+
     def shape(self):
         """
         Public method to return the LED shape.
-        
+
         @return LED shape
         @rtype EricLedType
         """
         return self.__shape
-        
+
     def ratio(self):
         """
         Public method to return the LED rectangular ratio [= width / height].
-        
+
         @return LED rectangular ratio (float)
         """
         return self.__rectRatio
-        
+
     def color(self):
         """
         Public method to return the LED color.
-        
+
         @return color of the LED (QColor)
         """
         return self.__led_color
-        
+
     def setOn(self, state):
         """
         Public method to set the LED to on.
-        
+
         @param state new state of the LED (boolean)
         """
         if self.__led_on != state:
             self.__led_on = state
             self.update()
-        
+
     def setShape(self, shape):
         """
         Public method to set the LED shape.
-        
+
         @param shape new LED shape
         @type EricLedType
         """
         if self.__shape != shape:
             self.__shape = shape
             self.update()
-        
+
     def setRatio(self, ratio):
         """
         Public method to set the LED rectangular ratio (width / height).
-        
+
         @param ratio new LED rectangular ratio (float)
         """
         if self.__rectRatio != ratio:
             self.__rectRatio = ratio
             self.update()
-        
+
     def setColor(self, color):
         """
         Public method to set the LED color.
-        
+
         @param color color for the LED (QColor)
         """
         if self.__led_color != color:
             self.__led_color = color
             self.__offcolor = color.darker(self.__dark_factor)
             self.update()
-        
+
     def setDarkFactor(self, darkfactor):
         """
         Public method to set the dark factor.
-        
+
         @param darkfactor value to set for the dark factor (integer)
         """
         if self.__dark_factor != darkfactor:
             self.__dark_factor = darkfactor
             self.__offcolor = self.__led_color.darker(darkfactor)
             self.update()
-        
+
     def darkFactor(self):
         """
         Public method to return the dark factor.
-        
+
         @return the current dark factor (integer)
         """
         return self.__dark_factor
-        
+
     def toggle(self):
         """
         Public slot to toggle the LED state.
         """
         self.setOn(not self.__led_on)
-        
+
     def on(self):
         """
         Public slot to set the LED to on.
         """
         self.setOn(True)
-        
+
     def off(self):
         """
         Public slot to set the LED to off.
         """
         self.setOn(False)
-        
+
     def setFramed(self, framed):
         """
         Public slot to set the __framedLed attribute.
-        
+
         @param framed flag indicating the framed state (boolean)
         """
         if self.__framedLed != framed:
@@ -257,27 +259,27 @@
             self.__off_map = None
             self.__on_map = None
             self.update()
-        
+
     def isFramed(self):
         """
         Public method to return the framed state.
-        
+
         @return flag indicating the current framed state (boolean)
         """
         return self.__framedLed
-        
+
     def sizeHint(self):
         """
         Public method to give a hint about our desired size.
-        
+
         @return size hint (QSize)
         """
         return QSize(18, 18)
-        
+
     def minimumSizeHint(self):
         """
         Public method to give a hint about our minimum size.
-        
+
         @return size hint (QSize)
         """
         return QSize(18, 18)
@@ -286,20 +288,22 @@
 class EricClickableLed(EricLed):
     """
     Class implementing a clickable LED widget.
-    
+
     @signal clicked(QPoint) emitted upon a click on the LED with the
         left button
     @signal middleClicked(QPoint) emitted upon a click on the LED with
         the middle button or CTRL and left button
     """
+
     clicked = pyqtSignal(QPoint)
     middleClicked = pyqtSignal(QPoint)
-    
-    def __init__(self, parent=None, color=None, shape=EricLedType.CIRCULAR,
-                 rectRatio=1):
+
+    def __init__(
+        self, parent=None, color=None, shape=EricLedType.CIRCULAR, rectRatio=1
+    ):
         """
         Constructor
-        
+
         @param parent reference to parent widget
         @type QWidget
         @param color color of the LED
@@ -310,26 +314,24 @@
         @type float
         """
         super().__init__(parent, color, shape, rectRatio)
-        
+
         self.setCursor(Qt.CursorShape.PointingHandCursor)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method handling mouse release events.
-        
+
         @param evt mouse event (QMouseEvent)
         """
-        if (
-            evt.button() == Qt.MouseButton.LeftButton and
-            self.rect().contains(evt.position().toPoint())
+        if evt.button() == Qt.MouseButton.LeftButton and self.rect().contains(
+            evt.position().toPoint()
         ):
             if evt.modifiers() == Qt.KeyboardModifier.ControlModifier:
                 self.middleClicked.emit(evt.globalPosition().toPoint())
             else:
                 self.clicked.emit(evt.globalPosition().toPoint())
-        elif (
-            evt.button() == Qt.MouseButton.MiddleButton and
-            self.rect().contains(evt.position().toPoint())
+        elif evt.button() == Qt.MouseButton.MiddleButton and self.rect().contains(
+            evt.position().toPoint()
         ):
             self.middleClicked.emit(evt.globalPosition().toPoint())
         else:
--- a/src/eric7/EricWidgets/EricLineEdit.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricLineEdit.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,31 +11,38 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QEvent
 from PyQt6.QtWidgets import (
-    QLineEdit, QWidget, QHBoxLayout, QBoxLayout, QLayout, QApplication,
-    QSpacerItem, QSizePolicy
+    QLineEdit,
+    QWidget,
+    QHBoxLayout,
+    QBoxLayout,
+    QLayout,
+    QApplication,
+    QSpacerItem,
+    QSizePolicy,
 )
 
 
 class EricLineEditSideWidget(QWidget):
     """
     Class implementing the side widgets for the line edit class.
-    
+
     @signal sizeHintChanged() emitted to indicate a change of the size hint
     """
+
     sizeHintChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-    
+
     def event(self, evt):
         """
         Public method to handle events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, whether the event was recognized (boolean)
         """
@@ -48,6 +55,7 @@
     """
     Class defining the line edit sides.
     """
+
     LEFT = 0
     RIGHT = 1
 
@@ -56,25 +64,26 @@
     """
     Class implementing a line edit widget showing some inactive text.
     """
+
     def __init__(self, parent=None, placeholderText=""):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param placeholderText text to be shown on inactivity
         @type str
         """
         super().__init__(parent)
-        
+
         self.setMinimumHeight(22)
-        
+
         self.setPlaceholderText(placeholderText)
-        
+
         self.__mainLayout = QHBoxLayout(self)
         self.__mainLayout.setContentsMargins(0, 0, 0, 0)
         self.__mainLayout.setSpacing(0)
-        
+
         self.__leftMargin = 0
         self.__leftWidget = EricLineEditSideWidget(self)
         self.__leftWidget.resize(0, 0)
@@ -84,9 +93,8 @@
             self.__leftLayout.setDirection(QBoxLayout.Direction.RightToLeft)
         else:
             self.__leftLayout.setDirection(QBoxLayout.Direction.LeftToRight)
-        self.__leftLayout.setSizeConstraint(
-            QLayout.SizeConstraint.SetFixedSize)
-        
+        self.__leftLayout.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
+
         self.__rightWidget = EricLineEditSideWidget(self)
         self.__rightWidget.resize(0, 0)
         self.__rightLayout = QHBoxLayout(self.__rightWidget)
@@ -95,83 +103,82 @@
             self.__rightLayout.setDirection(QBoxLayout.Direction.RightToLeft)
         else:
             self.__rightLayout.setDirection(QBoxLayout.Direction.LeftToRight)
-        
+
         horizontalSpacer = QSpacerItem(
-            0, 0, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            0, 0, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         self.__mainLayout.addWidget(
-            self.__leftWidget, 0,
-            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignLeft)
+            self.__leftWidget,
+            0,
+            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignLeft,
+        )
         self.__mainLayout.addItem(horizontalSpacer)
         self.__mainLayout.addWidget(
-            self.__rightWidget, 0,
-            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignRight)
+            self.__rightWidget,
+            0,
+            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignRight,
+        )
         if self.isRightToLeft():
             self.__mainLayout.setDirection(QBoxLayout.Direction.RightToLeft)
         else:
             self.__mainLayout.setDirection(QBoxLayout.Direction.LeftToRight)
-        
+
         self.setWidgetSpacing(3)
         self.__leftWidget.sizeHintChanged.connect(self._updateTextMargins)
         self.__rightWidget.sizeHintChanged.connect(self._updateTextMargins)
-    
+
     def setLeftMargin(self, margin):
         """
         Public method to set the left margin.
-        
+
         @param margin left margin in pixel (integer)
         """
         self.__leftMargin = margin
-    
+
     def leftMargin(self):
         """
         Public method to get the size of the left margin.
-        
+
         @return left margin in pixel (integer)
         """
         return self.__leftMargin
-    
+
     def event(self, evt):
         """
         Public method to handle events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, whether the event was recognized (boolean)
         """
         if evt.type() == QEvent.Type.LayoutDirectionChange:
             if self.isRightToLeft():
-                self.__mainLayout.setDirection(
-                    QBoxLayout.Direction.RightToLeft)
-                self.__leftLayout.setDirection(
-                    QBoxLayout.Direction.RightToLeft)
-                self.__rightLayout.setDirection(
-                    QBoxLayout.Direction.RightToLeft)
+                self.__mainLayout.setDirection(QBoxLayout.Direction.RightToLeft)
+                self.__leftLayout.setDirection(QBoxLayout.Direction.RightToLeft)
+                self.__rightLayout.setDirection(QBoxLayout.Direction.RightToLeft)
             else:
-                self.__mainLayout.setDirection(
-                    QBoxLayout.Direction.LeftToRight)
-                self.__leftLayout.setDirection(
-                    QBoxLayout.Direction.LeftToRight)
-                self.__rightLayout.setDirection(
-                    QBoxLayout.Direction.LeftToRight)
+                self.__mainLayout.setDirection(QBoxLayout.Direction.LeftToRight)
+                self.__leftLayout.setDirection(QBoxLayout.Direction.LeftToRight)
+                self.__rightLayout.setDirection(QBoxLayout.Direction.LeftToRight)
         return QLineEdit.event(self, evt)
-    
+
     def _updateTextMargins(self):
         """
         Protected slot to update the text margins.
         """
         left = (
             self.__leftWidget.sizeHint().width()
-            if self.__leftMargin == 0 else
-            self.__leftMargin
+            if self.__leftMargin == 0
+            else self.__leftMargin
         )
         right = self.__rightWidget.sizeHint().width()
         top = 0
         bottom = 0
         self.setTextMargins(left, top, right, bottom)
-    
+
     def addWidget(self, widget, position):
         """
         Public method to add a widget to a side.
-        
+
         @param widget reference to the widget to add
         @type QWidget
         @param position position to add to
@@ -179,7 +186,7 @@
         """
         if widget is None:
             return
-        
+
         if self.isRightToLeft():
             if position == EricLineEditSide.LEFT:
                 position = EricLineEditSide.RIGHT
@@ -189,43 +196,43 @@
             self.__leftLayout.addWidget(widget)
         else:
             self.__rightLayout.insertWidget(1, widget)
-    
+
     def removeWidget(self, widget):
         """
         Public method to remove a widget from a side.
-        
+
         @param widget reference to the widget to remove
         @type QWidget
         """
         if widget is None:
             return
-        
+
         self.__leftLayout.removeWidget(widget)
         self.__rightLayout.removeWidget(widget)
         widget.hide()
-    
+
     def widgetSpacing(self):
         """
         Public method to get the side widget spacing.
-        
+
         @return side widget spacing (integer)
         """
         return self.__leftLayout.spacing()
-    
+
     def setWidgetSpacing(self, spacing):
         """
         Public method to set the side widget spacing.
-        
+
         @param spacing side widget spacing (integer)
         """
         self.__leftLayout.setSpacing(spacing)
         self.__rightLayout.setSpacing(spacing)
         self._updateTextMargins()
-    
+
     def textMargin(self, position):
         """
         Public method to get the text margin for a side.
-        
+
         @param position side to get margin for
         @type EricLineEditSide
         @return text margin
@@ -235,8 +242,8 @@
         w = 0
         w = (
             self.__leftWidget.sizeHint().width()
-            if position == EricLineEditSide.LEFT else
-            self.__rightWidget.sizeHint().width()
+            if position == EricLineEditSide.LEFT
+            else self.__rightWidget.sizeHint().width()
         )
         if w == 0:
             return 0
@@ -248,11 +255,11 @@
     Class implementing a line edit widget showing some inactive text and a
     clear button, if it has some contents.
     """
-    def __init__(self, parent=None, placeholderText="",
-                 side=EricLineEditSide.RIGHT):
+
+    def __init__(self, parent=None, placeholderText="", side=EricLineEditSide.RIGHT):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param placeholderText text to be shown on inactivity
@@ -261,5 +268,5 @@
         @type EricLineEditSide
         """
         super().__init__(parent, placeholderText)
-        
+
         self.setClearButtonEnabled(True)
--- a/src/eric7/EricWidgets/EricLineEditButton.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricLineEditButton.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,44 +16,45 @@
     """
     Class implementing a button to be used with EricLineEdit.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__menu = None
         self.__image = None
-        
+
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.setCursor(Qt.CursorShape.ArrowCursor)
         self.setMinimumSize(16, 16)
-        
+
         self.clicked.connect(self.__clicked)
-    
+
     def setMenu(self, menu):
         """
         Public method to set the button menu.
-        
+
         @param menu reference to the menu (QMenu)
         """
         self.__menu = menu
         self.update()
-    
+
     def menu(self):
         """
         Public method to get a reference to the menu.
-        
+
         @return reference to the associated menu (QMenu)
         """
         return self.__menu
-    
+
     def setIcon(self, icon):
         """
         Public method to set the button icon.
-        
+
         @param icon icon to be set (QIcon)
         """
         if icon.isNull():
@@ -61,7 +62,7 @@
         else:
             self.__image = icon.pixmap(16, 16).toImage()
         super().setIcon(icon)
-    
+
     def __clicked(self):
         """
         Private slot to handle a button click.
@@ -69,20 +70,20 @@
         if self.__menu:
             pos = self.mapToGlobal(QPoint(0, self.height()))
             self.__menu.exec(pos)
-    
+
     def paintEvent(self, evt):
         """
         Protected method handling a paint event.
-        
+
         @param evt reference to the paint event (QPaintEvent)
         """
         painter = QPainter(self)
-        
+
         if self.__image is not None and not self.__image.isNull():
             x = (self.width() - self.__image.width()) // 2 - 1
             y = (self.height() - self.__image.height()) // 2 - 1
             painter.drawImage(x, y, self.__image)
-        
+
         if self.__menu is not None:
             triagPath = QPainterPath()
             startPos = QPointF(self.width() - 5, self.height() - 3)
--- a/src/eric7/EricWidgets/EricListSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricListSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,7 +9,10 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractItemView, QListWidgetItem
+    QDialog,
+    QDialogButtonBox,
+    QAbstractItemView,
+    QListWidgetItem,
 )
 
 from .Ui_EricListSelectionDialog import Ui_EricListSelectionDialog
@@ -19,14 +22,20 @@
     """
     Class implementing a dialog to select from a list of strings.
     """
-    def __init__(self, entries,
-                 selectionMode=QAbstractItemView.SelectionMode
-                 .ExtendedSelection,
-                 title="", message="", checkBoxSelection=False,
-                 doubleClickOk=False, parent=None):
+
+    def __init__(
+        self,
+        entries,
+        selectionMode=QAbstractItemView.SelectionMode.ExtendedSelection,
+        title="",
+        message="",
+        checkBoxSelection=False,
+        doubleClickOk=False,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param entries list of entries to select from
         @type list of str
         @param selectionMode selection mode for the list
@@ -46,44 +55,45 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if title:
             self.setWindowTitle(title)
         if message:
             self.messageLabel.setText(message)
-        
+
         self.__checkCount = 0
         self.__isCheckBoxSelection = checkBoxSelection
         if self.__isCheckBoxSelection:
             self.selectionList.setSelectionMode(
-                QAbstractItemView.SelectionMode.NoSelection)
+                QAbstractItemView.SelectionMode.NoSelection
+            )
             for entry in entries:
                 itm = QListWidgetItem(entry)
-                itm.setFlags(Qt.ItemFlag.ItemIsUserCheckable |
-                             Qt.ItemFlag.ItemIsEnabled)
+                itm.setFlags(
+                    Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsEnabled
+                )
                 itm.setCheckState(Qt.CheckState.Unchecked)
                 self.selectionList.addItem(itm)
         else:
             self.selectionList.setSelectionMode(selectionMode)
             self.selectionList.addItems(entries)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     @pyqtSlot()
     def on_selectionList_itemSelectionChanged(self):
         """
         Private slot handling a change of the selection.
         """
         if not self.__isCheckBoxSelection:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(
-                    len(self.selectionList.selectedItems()) > 0)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                len(self.selectionList.selectedItems()) > 0
+            )
+
     def on_selectionList_itemChanged(self, itm):
         """
         Private slot handling a change of an item.
-        
+
         @param itm reference to the changed item
         @type QListWidgetItem
         """
@@ -92,29 +102,29 @@
                 self.__checkCount += 1
             else:
                 self.__checkCount -= 1
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(
-                self.__checkCount > 0)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                self.__checkCount > 0
+            )
+
     @pyqtSlot(QListWidgetItem)
     def on_selectionList_itemDoubleClicked(self, item):
         """
         Private slot handling double clicking an item.
-        
+
         @param item double clicked item
         @type QListWidgetItem
         """
         if (
-            not self.__isCheckBoxSelection and
-            self.selectionList.selectionMode() ==
-            QAbstractItemView.SelectionMode.SingleSelection
+            not self.__isCheckBoxSelection
+            and self.selectionList.selectionMode()
+            == QAbstractItemView.SelectionMode.SingleSelection
         ):
             self.accept()
-    
+
     def getSelection(self):
         """
         Public method to retrieve the selected items.
-        
+
         @return selected entries
         @rtype list of str
         """
--- a/src/eric7/EricWidgets/EricListView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricListView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,21 +15,22 @@
     """
     Class implementing a list view supporting removal of entries.
     """
+
     def keyPressEvent(self, evt):
         """
         Protected method implementing special key handling.
-        
+
         @param evt reference to the event (QKeyEvent)
         """
         if (
-            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace] and
-            self.model() is not None
+            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace]
+            and self.model() is not None
         ):
             self.removeSelected()
             evt.setAccepted(True)
         else:
             super().keyPressEvent(evt)
-    
+
     def removeSelected(self):
         """
         Public method to remove the selected entries.
@@ -37,26 +38,28 @@
         if self.model() is None or self.selectionModel() is None:
             # no models available
             return
-        
+
         row = 0
         selectedRows = self.selectionModel().selectedRows()
         for selectedRow in reversed(selectedRows):
             row = selectedRow.row()
             self.model().removeRow(row, self.rootIndex())
-        
+
         idx = self.model().index(row, 0, self.rootIndex())
         if not idx.isValid():
             idx = self.model().index(row - 1, 0, self.rootIndex())
         self.selectionModel().select(
             idx,
-            QItemSelectionModel.SelectionFlag.SelectCurrent |
-            QItemSelectionModel.SelectionFlag.Rows)
+            QItemSelectionModel.SelectionFlag.SelectCurrent
+            | QItemSelectionModel.SelectionFlag.Rows,
+        )
         self.setCurrentIndex(idx)
-    
+
     def removeAll(self):
         """
         Public method to clear the view.
         """
         if self.model() is not None:
-            self.model().removeRows(0, self.model().rowCount(self.rootIndex()),
-                                    self.rootIndex())
+            self.model().removeRows(
+                0, self.model().rowCount(self.rootIndex()), self.rootIndex()
+            )
--- a/src/eric7/EricWidgets/EricMainWindow.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricMainWindow.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,21 +16,22 @@
     """
     Class implementing a main window with styling support.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.defaultStyleName = QApplication.style().objectName()
-    
+
     def setStyle(self, styleName, styleSheetFile):
         """
         Public method to set the style of the interface.
-        
+
         @param styleName name of the style to set
         @type str
         @param styleSheetFile name of a style sheet file to read to overwrite
@@ -46,6 +47,6 @@
             style = QStyleFactory.create(self.defaultStyleName)
         if style is not None:
             QApplication.setStyle(style)
-        
+
         # step 2: set a style sheet
         ericApp().setStyleSheetFile(styleSheetFile)
--- a/src/eric7/EricWidgets/EricMapWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricMapWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,28 +16,29 @@
     """
     Class implementing a base class for showing a document map.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setAttribute(Qt.WidgetAttribute.WA_OpaquePaintEvent)
-        
+
         self.__width = 14
         self.__lineBorder = 1
         self.__lineHeight = 2
         self.__backgroundColor = QColor("#e7e7e7")
         self.__setSliderColor()
-        
+
         self._master = None
         self.__enabled = False
         self.__rightSide = True
-        
+
         if parent is not None and isinstance(parent, QAbstractScrollArea):
             self.setMaster(parent)
-    
+
     def __setSliderColor(self):
         """
         Private method to set the slider color depending upon the background
@@ -49,7 +50,7 @@
         else:
             # light background, use black slider
             self.__sliderColor = Qt.GlobalColor.black
-    
+
     def __updateMasterViewportWidth(self):
         """
         Private method to update the master's viewport width.
@@ -63,44 +64,43 @@
                 self._master.setViewportMargins(0, 0, width, 0)
             else:
                 self._master.setViewportMargins(width, 0, 0, 0)
-    
+
     def setMaster(self, master):
         """
         Public method to set the map master widget.
-        
+
         @param master map master widget (QAbstractScrollArea)
         """
         self._master = master
-        self._master.setVerticalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
+        self._master.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
         self._master.verticalScrollBar().valueChanged.connect(self.update)
         self._master.verticalScrollBar().rangeChanged.connect(self.update)
         self.__updateMasterViewportWidth()
-    
+
     def setWidth(self, width):
         """
         Public method to set the widget width.
-        
+
         @param width widget width (integer)
         """
         if width != self.__width:
-            self.__width = max(6, width)    # minimum width 6 pixels
+            self.__width = max(6, width)  # minimum width 6 pixels
             self.__updateMasterViewportWidth()
             self.update()
-    
+
     def width(self):
         """
         Public method to get the widget's width.
-        
+
         @return widget width (integer)
         """
         return self.__width
-    
+
     def setMapPosition(self, onRight):
         """
         Public method to set, whether the map should be shown to the right or
         left of the master widget.
-        
+
         @param onRight flag indicating to show the map on the right side of
             the master widget
         @type bool
@@ -109,22 +109,22 @@
             self.__rightSide = onRight
             self.__updateMasterViewportWidth()
             self.update()
-    
+
     def isOnRightSide(self):
         """
         Public method to test, if the map is shown on the right side of the
         master widget.
-        
+
         @return flag indicating that the map is to the right of the master
             widget
         @rtype bool
         """
         return self.__rightSide
-    
+
     def setLineDimensions(self, border, height):
         """
         Public method to set the line (indicator) dimensions.
-        
+
         @param border border width on each side in x-direction (integer)
         @param height height of the line in pixels (integer)
         """
@@ -132,97 +132,98 @@
             self.__lineBorder = max(1, border)  # min border 1 pixel
             self.__lineHeight = max(1, height)  # min height 1 pixel
             self.update()
-    
+
     def lineDimensions(self):
         """
         Public method to get the line (indicator) dimensions.
-        
+
         @return tuple with border width (integer) and line height (integer)
         """
         return self.__lineBorder, self.__lineHeight
-    
+
     def setEnabled(self, enable):
         """
         Public method to set the enabled state.
-        
+
         @param enable flag indicating the enabled state (boolean)
         """
         if enable != self.__enabled:
             self.__enabled = enable
             self.setVisible(enable)
             self.__updateMasterViewportWidth()
-    
+
     def isEnabled(self):
         """
         Public method to check the enabled state.
-        
+
         @return flag indicating the enabled state (boolean)
         """
         return self.__enabled
-    
+
     def setBackgroundColor(self, color):
         """
         Public method to set the widget background color.
-        
+
         @param color color for the background (QColor)
         """
         if color != self.__backgroundColor:
             self.__backgroundColor = color
             self.__setSliderColor()
             self.update()
-    
+
     def backgroundColor(self):
         """
         Public method to get the background color.
-        
+
         @return background color (QColor)
         """
         return QColor(self.__backgroundColor)
-    
+
     def sizeHint(self):
         """
         Public method to give an indication about the preferred size.
-        
+
         @return preferred size (QSize)
         """
         return QSize(self.__width, 0)
-    
+
     def paintEvent(self, event):
         """
         Protected method to handle a paint event.
-        
+
         @param event paint event (QPaintEvent)
         """
         # step 1: fill the whole painting area
         painter = QPainter(self)
         painter.fillRect(event.rect(), self.__backgroundColor)
-        
+
         # step 2: paint the indicators
         self._paintIt(painter)
-        
+
         # step 3: paint the slider
         if self._master:
             penColor = self.__sliderColor
             painter.setPen(penColor)
             brushColor = Qt.GlobalColor.transparent
             painter.setBrush(QBrush(brushColor))
-            painter.drawRect(self.__generateSliderRange(
-                self._master.verticalScrollBar()))
-    
+            painter.drawRect(
+                self.__generateSliderRange(self._master.verticalScrollBar())
+            )
+
     def _paintIt(self, painter):
         """
         Protected method for painting the widget's indicators.
-        
+
         Note: This method should be implemented by subclasses.
-        
+
         @param painter reference to the painter object (QPainter)
         """
         pass
-    
+
     def mousePressEvent(self, event):
         """
         Protected method to handle a mouse button press.
-        
+
         @param event reference to the mouse event (QMouseEvent)
         """
         if event.button() == Qt.MouseButton.LeftButton and self._master:
@@ -230,32 +231,32 @@
             value = self.position2Value(event.position().toPoint().y() - 1)
             vsb.setValue(int(value - 0.5 * vsb.pageStep()))  # center on page
         self.__mousePressPos = None
-    
+
     def mouseMoveEvent(self, event):
         """
         Protected method to handle a mouse moves.
-        
+
         @param event reference to the mouse event (QMouseEvent)
         """
         if event.buttons() & Qt.MouseButton.LeftButton and self._master:
             vsb = self._master.verticalScrollBar()
             value = self.position2Value(event.position().toPoint().y() - 1)
             vsb.setValue(int(value - 0.5 * vsb.pageStep()))  # center on page
-    
+
     def wheelEvent(self, event):
         """
         Protected slot handling mouse wheel events.
-        
+
         @param event reference to the wheel event (QWheelEvent)
         """
         isVertical = event.angleDelta().x() == 0
         if (
-            self._master and
-            event.modifiers() == Qt.KeyboardModifier.NoModifier and
-            isVertical
+            self._master
+            and event.modifiers() == Qt.KeyboardModifier.NoModifier
+            and isVertical
         ):
             QCoreApplication.sendEvent(self._master.verticalScrollBar(), event)
-    
+
     def calculateGeometry(self):
         """
         Public method to recalculate the map widget's geometry.
@@ -272,17 +273,21 @@
                 vsbw = 0
             if self.__rightSide:
                 self.setGeometry(
-                    QRect(cr.right() - self.__width - vsbw, cr.top(),
-                          self.__width, cr.height()))
+                    QRect(
+                        cr.right() - self.__width - vsbw,
+                        cr.top(),
+                        self.__width,
+                        cr.height(),
+                    )
+                )
             else:
-                self.setGeometry(
-                    QRect(0, cr.top(), self.__width, cr.height()))
+                self.setGeometry(QRect(0, cr.top(), self.__width, cr.height()))
             self.update()
-    
+
     def scaleFactor(self, slider=False):
         """
         Public method to determine the scrollbar's scale factor.
-        
+
         @param slider flag indicating to calculate the result for the slider
             (boolean)
         @return scale factor (float)
@@ -295,11 +300,11 @@
             return float(posHeight) / valHeight
         else:
             return 1.0
-    
+
     def value2Position(self, value, slider=False):
         """
         Public method to convert a scrollbar value into a position.
-        
+
         @param value value to convert (integer)
         @param slider flag indicating to calculate the result for the slider
             (boolean)
@@ -308,15 +313,14 @@
         if self._master:
             offset = 0 if slider else 1
             vsb = self._master.verticalScrollBar()
-            return int((value - vsb.minimum()) * self.scaleFactor(slider) +
-                       offset)
+            return int((value - vsb.minimum()) * self.scaleFactor(slider) + offset)
         else:
             return value
-    
+
     def position2Value(self, position, slider=False):
         """
         Public method to convert a position into a scrollbar value.
-        
+
         @param position scrollbar position to convert (integer)
         @param slider flag indicating to calculate the result for the slider
             (boolean)
@@ -326,28 +330,34 @@
             offset = 0 if slider else 1
             vsb = self._master.verticalScrollBar()
             return vsb.minimum() + max(
-                0, (position - offset) / self.scaleFactor(slider))
+                0, (position - offset) / self.scaleFactor(slider)
+            )
         else:
             return position
-    
+
     def generateIndicatorRect(self, position):
         """
         Public method to generate an indicator rectangle.
-        
+
         @param position indicator position (integer)
         @return indicator rectangle (QRect)
         """
-        return QRect(self.__lineBorder, position - self.__lineHeight // 2,
-                     self.__width - self.__lineBorder, self.__lineHeight)
-    
+        return QRect(
+            self.__lineBorder,
+            position - self.__lineHeight // 2,
+            self.__width - self.__lineBorder,
+            self.__lineHeight,
+        )
+
     def __generateSliderRange(self, scrollbar):
         """
         Private method to generate the slider rectangle.
-        
+
         @param scrollbar reference to the vertical scrollbar (QScrollBar)
         @return slider rectangle (QRect)
         """
         pos1 = self.value2Position(scrollbar.value(), slider=True)
-        pos2 = self.value2Position(scrollbar.value() + scrollbar.pageStep(),
-                                   slider=True)
+        pos2 = self.value2Position(
+            scrollbar.value() + scrollbar.pageStep(), slider=True
+        )
         return QRect(0, pos1, self.__width - 1, pos2 - pos1)
--- a/src/eric7/EricWidgets/EricMessageBox.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricMessageBox.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 Critical = QMessageBox.Icon.Critical
 Information = QMessageBox.Icon.Information
 Question = QMessageBox.Icon.Question
-Warning = QMessageBox.Icon.Warning       # __IGNORE_WARNING_M131__
+Warning = QMessageBox.Icon.Warning  # __IGNORE_WARNING_M131__
 
 # QMessageBox.StandardButton
 Abort = QMessageBox.StandardButton.Abort
@@ -63,12 +63,19 @@
     """
     Class implementing a replacement for QMessageBox.
     """
-    def __init__(self, icon, title, text, modal=False,
-                 buttons=QMessageBox.StandardButton.NoButton,
-                 parent=None):
+
+    def __init__(
+        self,
+        icon,
+        title,
+        text,
+        modal=False,
+        buttons=QMessageBox.StandardButton.NoButton,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param icon type of icon to be shown (QMessageBox.Icon)
         @param title caption of the message box (string)
         @param text text to be shown by the message box (string)
@@ -86,26 +93,32 @@
         else:
             self.setWindowModality(Qt.WindowModality.NonModal)
         if title == "":
-            self.setWindowTitle("{0}".format(
-                QApplication.applicationName()))
+            self.setWindowTitle("{0}".format(QApplication.applicationName()))
         else:
-            self.setWindowTitle("{0} - {1}".format(
-                QApplication.applicationName(), title))
+            self.setWindowTitle(
+                "{0} - {1}".format(QApplication.applicationName(), title)
+            )
         self.setText(text)
         self.setStandardButtons(buttons)
 
+
 ###############################################################################
 ##  Replacements for QMessageBox static methods                              ##
 ###############################################################################
 
 
-def __messageBox(parent, title, text, icon,
-                 buttons=QMessageBox.StandardButton.Ok,
-                 defaultButton=QMessageBox.StandardButton.NoButton,
-                 textFormat=Qt.TextFormat.AutoText):
+def __messageBox(
+    parent,
+    title,
+    text,
+    icon,
+    buttons=QMessageBox.StandardButton.Ok,
+    defaultButton=QMessageBox.StandardButton.NoButton,
+    textFormat=Qt.TextFormat.AutoText,
+):
     """
     Private module function to show a modal message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -122,11 +135,11 @@
     if parent is not None:
         messageBox.setWindowModality(Qt.WindowModality.WindowModal)
     if title == "":
-        messageBox.setWindowTitle("{0}".format(
-            QApplication.applicationName()))
+        messageBox.setWindowTitle("{0}".format(QApplication.applicationName()))
     else:
-        messageBox.setWindowTitle("{0} - {1}".format(
-            QApplication.applicationName(), title))
+        messageBox.setWindowTitle(
+            "{0} - {1}".format(QApplication.applicationName(), title)
+        )
     messageBox.setTextFormat(textFormat)
     messageBox.setText(text)
     messageBox.setStandardButtons(buttons)
@@ -138,17 +151,22 @@
     else:
         return messageBox.standardButton(clickedButton)
 
+
 # the about functions are here for consistancy
 about = QMessageBox.about
 aboutQt = QMessageBox.aboutQt
 
 
-def critical(parent, title, text,
-             buttons=QMessageBox.StandardButton.Ok,
-             defaultButton=QMessageBox.StandardButton.NoButton):
+def critical(
+    parent,
+    title,
+    text,
+    buttons=QMessageBox.StandardButton.Ok,
+    defaultButton=QMessageBox.StandardButton.NoButton,
+):
     """
     Function to show a modal critical message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -158,16 +176,21 @@
         (QMessageBox.StandardButton)
     @return button pressed by the user (QMessageBox.StandardButton)
     """
-    return __messageBox(parent, title, text, QMessageBox.Icon.Critical,
-                        buttons, defaultButton)
+    return __messageBox(
+        parent, title, text, QMessageBox.Icon.Critical, buttons, defaultButton
+    )
 
 
-def information(parent, title, text,
-                buttons=QMessageBox.StandardButton.Ok,
-                defaultButton=QMessageBox.StandardButton.NoButton):
+def information(
+    parent,
+    title,
+    text,
+    buttons=QMessageBox.StandardButton.Ok,
+    defaultButton=QMessageBox.StandardButton.NoButton,
+):
     """
     Function to show a modal information message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -177,16 +200,21 @@
         (QMessageBox.StandardButton)
     @return button pressed by the user (QMessageBox.StandardButton)
     """
-    return __messageBox(parent, title, text, QMessageBox.Icon.Information,
-                        buttons, defaultButton)
+    return __messageBox(
+        parent, title, text, QMessageBox.Icon.Information, buttons, defaultButton
+    )
 
 
-def question(parent, title, text,
-             buttons=QMessageBox.StandardButton.Ok,
-             defaultButton=QMessageBox.StandardButton.NoButton):
+def question(
+    parent,
+    title,
+    text,
+    buttons=QMessageBox.StandardButton.Ok,
+    defaultButton=QMessageBox.StandardButton.NoButton,
+):
     """
     Function to show a modal question message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -196,16 +224,21 @@
         (QMessageBox.StandardButton)
     @return button pressed by the user (QMessageBox.StandardButton)
     """
-    return __messageBox(parent, title, text, QMessageBox.Icon.Question,
-                        buttons, defaultButton)
+    return __messageBox(
+        parent, title, text, QMessageBox.Icon.Question, buttons, defaultButton
+    )
 
 
-def warning(parent, title, text,
-            buttons=QMessageBox.StandardButton.Ok,
-            defaultButton=QMessageBox.StandardButton.NoButton):
+def warning(
+    parent,
+    title,
+    text,
+    buttons=QMessageBox.StandardButton.Ok,
+    defaultButton=QMessageBox.StandardButton.NoButton,
+):
     """
     Function to show a modal warning message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -215,19 +248,27 @@
         (QMessageBox.StandardButton)
     @return button pressed by the user (QMessageBox.StandardButton)
     """
-    return __messageBox(parent, title, text, QMessageBox.Icon.Warning,
-                        buttons, defaultButton)
+    return __messageBox(
+        parent, title, text, QMessageBox.Icon.Warning, buttons, defaultButton
+    )
+
 
 ###############################################################################
 ##  Additional convenience functions                                         ##
 ###############################################################################
 
 
-def yesNo(parent, title, text, icon=Question, yesDefault=False,
-          textFormat=Qt.TextFormat.AutoText):
+def yesNo(
+    parent,
+    title,
+    text,
+    icon=Question,
+    yesDefault=False,
+    textFormat=Qt.TextFormat.AutoText,
+):
     """
     Function to show a model yes/no message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -241,21 +282,23 @@
     """
     if icon not in [Critical, Information, Question, Warning]:
         raise ValueError("Bad value for 'icon' parameter.")
-    
+
     res = __messageBox(
-        parent, title, text, icon,
+        parent,
+        title,
+        text,
+        icon,
         QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
-        yesDefault and QMessageBox.StandardButton.Yes or
-        QMessageBox.StandardButton.No,
-        textFormat)
+        yesDefault and QMessageBox.StandardButton.Yes or QMessageBox.StandardButton.No,
+        textFormat,
+    )
     return res == QMessageBox.StandardButton.Yes
 
 
-def retryAbort(parent, title, text, icon=Question,
-               textFormat=Qt.TextFormat.AutoText):
+def retryAbort(parent, title, text, icon=Question, textFormat=Qt.TextFormat.AutoText):
     """
     Function to show a model abort/retry message box.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -267,20 +310,23 @@
     """
     if icon not in [Critical, Information, Question, Warning]:
         raise ValueError("Bad value for 'icon' parameter.")
-    
+
     res = __messageBox(
-        parent, title, text, icon,
+        parent,
+        title,
+        text,
+        icon,
         QMessageBox.StandardButton.Retry | QMessageBox.StandardButton.Abort,
         QMessageBox.StandardButton.Retry,
-        textFormat)
+        textFormat,
+    )
     return res == QMessageBox.StandardButton.Retry
 
 
-def okToClearData(parent, title, text, saveFunc,
-                  textFormat=Qt.TextFormat.AutoText):
+def okToClearData(parent, title, text, saveFunc, textFormat=Qt.TextFormat.AutoText):
     """
     Function to show a model message box to ask for clearing the data.
-    
+
     @param parent parent widget of the message box (QWidget)
     @param title caption of the message box (string)
     @param text text to be shown by the message box (string)
@@ -290,12 +336,18 @@
     @return flag indicating that it is ok to clear the data (boolean)
     """
     res = __messageBox(
-        parent, title, text, QMessageBox.Icon.Warning,
-        (QMessageBox.StandardButton.Abort |
-         QMessageBox.StandardButton.Discard |
-         QMessageBox.StandardButton.Save),
+        parent,
+        title,
+        text,
+        QMessageBox.Icon.Warning,
+        (
+            QMessageBox.StandardButton.Abort
+            | QMessageBox.StandardButton.Discard
+            | QMessageBox.StandardButton.Save
+        ),
         QMessageBox.StandardButton.Save,
-        textFormat)
+        textFormat,
+    )
     if res == QMessageBox.StandardButton.Abort:
         return False
     if res == QMessageBox.StandardButton.Save:
--- a/src/eric7/EricWidgets/EricModelMenu.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricModelMenu.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,19 +17,20 @@
 class EricModelMenu(QMenu):
     """
     Class implementing a menu populated from a QAbstractItemModel.
-    
+
     @signal activated(QModelIndex) emitted when an action has been triggered
     """
+
     activated = pyqtSignal(QModelIndex)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__maxRows = -1
         self.__firstSeparator = -1
         self.__maxWidth = -1
@@ -38,145 +39,145 @@
         self.__model = None
         self.__root = QModelIndex()
         self.__dragStartPosition = QPoint()
-        
+
         self.setAcceptDrops(True)
-        
+
         self._mouseButton = Qt.MouseButton.NoButton
         self._keyboardModifiers = Qt.KeyboardModifier.NoModifier
         self.__dropRow = -1
         self.__dropIndex = None
-        
+
         self.menuActions = []
-        
+
         # This is to ensure it will be shown on Mac OS X
         self.addAction("--not populated--")
-        
+
         self.aboutToShow.connect(self.__aboutToShow)
         self.triggered.connect(self.__actionTriggered)
-    
+
     def clear(self):
         """
         Public method to clear the menu.
         """
         super().clear()
         self.menuActions.clear()
-    
+
     def prePopulated(self):
         """
         Public method to add any actions before the tree.
-       
+
         @return flag indicating if any actions were added
         """
         return False
-    
+
     def postPopulated(self):
         """
         Public method to add any actions after the tree.
         """
         pass
-    
+
     def setModel(self, model):
         """
         Public method to set the model for the menu.
-        
+
         @param model reference to the model (QAbstractItemModel)
         """
         self.__model = model
-    
+
     def model(self):
         """
         Public method to get a reference to the model.
-        
+
         @return reference to the model (QAbstractItemModel)
         """
         return self.__model
-    
+
     def setMaxRows(self, rows):
         """
         Public method to set the maximum number of entries to show.
-        
+
         @param rows maximum number of entries to show (integer)
         """
         self.__maxRows = rows
-    
+
     def maxRows(self):
         """
         Public method to get the maximum number of entries to show.
-        
+
         @return maximum number of entries to show (integer)
         """
         return self.__maxRows
-    
+
     def setFirstSeparator(self, offset):
         """
         Public method to set the first separator.
-        
+
         @param offset row number of the first separator (integer)
         """
         self.__firstSeparator = offset
-    
+
     def firstSeparator(self):
         """
         Public method to get the first separator.
-        
+
         @return row number of the first separator (integer)
         """
         return self.__firstSeparator
-    
+
     def setRootIndex(self, index):
         """
         Public method to set the index of the root item.
-        
+
         @param index index of the root item (QModelIndex)
         """
         self.__root = index
-    
+
     def rootIndex(self):
         """
         Public method to get the index of the root item.
-        
+
         @return index of the root item (QModelIndex)
         """
         return self.__root
-    
+
     def setStatusBarTextRole(self, role):
         """
         Public method to set the role of the status bar text.
-        
+
         @param role role of the status bar text (integer)
         """
         self.__statusBarTextRole = role
-    
+
     def statusBarTextRole(self):
         """
         Public method to get the role of the status bar text.
-        
+
         @return role of the status bar text (integer)
         """
         return self.__statusBarTextRole
-    
+
     def setSeparatorRole(self, role):
         """
         Public method to set the role of the separator.
-        
+
         @param role role of the separator (integer)
         """
         self.__separatorRole = role
-    
+
     def separatorRole(self):
         """
         Public method to get the role of the separator.
-        
+
         @return role of the separator (integer)
         """
         return self.__separatorRole
-    
+
     def __aboutToShow(self):
         """
         Private slot to show the menu.
         """
         self.clear()
-        
+
         if self.prePopulated():
             self.addSeparator()
         max_ = self.__maxRows
@@ -184,20 +185,20 @@
             max_ += self.__firstSeparator
         self.createMenu(self.__root, max_, self, self)
         self.postPopulated()
-    
+
     def createBaseMenu(self):
         """
         Public method to get the menu that is used to populate sub menu's.
-        
+
         @return reference to the menu (EricModelMenu)
         """
         return EricModelMenu(self)
-    
+
     def createMenu(self, parent, max_, parentMenu=None, menu=None):
         """
         Public method to put all the children of a parent into a menu of a
         given length.
-        
+
         @param parent index of the parent item (QModelIndex)
         @param max_ maximum number of entries (integer)
         @param parentMenu reference to the parent menu (QMenu)
@@ -205,51 +206,47 @@
         """
         if menu is None:
             v = parent
-            
+
             title = parent.data()
             modelMenu = self.createBaseMenu()
             # triggered goes all the way up the menu structure
             modelMenu.triggered.disconnect(modelMenu.__actionTriggered)
             modelMenu.setTitle(title)
-            
+
             icon = parent.data(Qt.ItemDataRole.DecorationRole)
             if icon == NotImplemented or icon is None:
                 icon = UI.PixmapCache.getIcon("defaultIcon")
             modelMenu.setIcon(icon)
             if parentMenu is not None:
-                self.menuActions.append(
-                    parentMenu.addMenu(modelMenu).setData(v))
+                self.menuActions.append(parentMenu.addMenu(modelMenu).setData(v))
             modelMenu.setRootIndex(parent)
             modelMenu.setModel(self.__model)
             return
-        
+
         if self.__model is None:
             return
-        
+
         end = self.__model.rowCount(parent)
         if max_ != -1:
             end = min(max_, end)
-        
+
         for i in range(end):
             idx = self.__model.index(i, 0, parent)
             if self.__model.hasChildren(idx):
                 self.createMenu(idx, -1, menu)
             else:
-                if (
-                    self.__separatorRole != 0 and
-                    idx.data(self.__separatorRole)
-                ):
+                if self.__separatorRole != 0 and idx.data(self.__separatorRole):
                     self.addSeparator()
                 else:
                     menu.addAction(self.__makeAction(idx))
-            
+
             if menu == self and i == self.__firstSeparator - 1:
                 self.addSeparator()
-    
+
     def __makeAction(self, idx):
         """
         Private method to create an action.
-        
+
         @param idx index of the item to create an action for (QModelIndex)
         @return reference to the created action (QAction)
         """
@@ -258,16 +255,16 @@
             icon = UI.PixmapCache.getIcon("defaultIcon")
         action = self.makeAction(icon, idx.data(), self)
         action.setStatusTip(idx.data(self.__statusBarTextRole))
-        
+
         v = idx
         action.setData(v)
-        
+
         return action
-    
+
     def makeAction(self, icon, text, parent):
         """
         Public method to create an action.
-        
+
         @param icon icon of the action (QIcon)
         @param text text of the action (string)
         @param parent reference to the parent object (QObject)
@@ -278,46 +275,45 @@
             try:
                 self.__maxWidth = fm.horizontalAdvance("m") * 30
             except AttributeError:
-                self.__maxWidth = fm.width('m') * 30
-        smallText = fm.elidedText(text, Qt.TextElideMode.ElideMiddle,
-                                  self.__maxWidth)
-        
+                self.__maxWidth = fm.width("m") * 30
+        smallText = fm.elidedText(text, Qt.TextElideMode.ElideMiddle, self.__maxWidth)
+
         return QAction(icon, smallText, parent)
-    
+
     def __actionTriggered(self, action):
         """
         Private slot to handle the triggering of an action.
-        
+
         @param action reference to the action that was triggered (QAction)
         """
         idx = self.index(action)
         if idx.isValid():
             self._keyboardModifiers = QApplication.keyboardModifiers()
             self.activated[QModelIndex].emit(idx)
-    
+
     def index(self, action):
         """
         Public method to get the index of an action.
-        
+
         @param action reference to the action to get the index for (QAction)
         @return index of the action (QModelIndex)
         """
         if action is None:
             return QModelIndex()
-        
+
         idx = action.data()
         if idx is None:
             return QModelIndex()
-        
+
         if not isinstance(idx, QModelIndex):
             return QModelIndex()
-        
+
         return idx
-    
+
     def dragEnterEvent(self, evt):
         """
         Protected method to handle drag enter events.
-        
+
         @param evt reference to the event (QDragEnterEvent)
         """
         if self.__model is not None:
@@ -325,13 +321,13 @@
             for mimeType in mimeTypes:
                 if evt.mimeData().hasFormat(mimeType):
                     evt.acceptProposedAction()
-        
+
         super().dragEnterEvent(evt)
-    
+
     def dropEvent(self, evt):
         """
         Protected method to handle drop events.
-        
+
         @param evt reference to the event (QDropEvent)
         """
         if self.__model is not None:
@@ -344,106 +340,108 @@
                 if not idx.isValid():
                     super().dropEvent(evt)
                     return
-                
+
                 row = idx.row()
                 if self.__model.hasChildren(idx):
                     parentIndex = idx
                     row = self.__model.rowCount(idx)
-            
+
             self.__dropRow = row
             self.__dropIndex = parentIndex
             evt.acceptProposedAction()
-            self.__model.dropMimeData(evt.mimeData(), evt.dropAction(),
-                                      row, 0, parentIndex)
+            self.__model.dropMimeData(
+                evt.mimeData(), evt.dropAction(), row, 0, parentIndex
+            )
             self.close()
-        
+
         super().dropEvent(evt)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method handling mouse press events.
-        
+
         @param evt reference to the event object (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__dragStartPosition = evt.position().toPoint()
         super().mousePressEvent(evt)
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the event (QMouseEvent)
         """
         if self.__model is None:
             super().mouseMoveEvent(evt)
             return
-        
+
         if not (evt.buttons() & Qt.MouseButton.LeftButton):
             super().mouseMoveEvent(evt)
             return
-        
+
         if self.__dragStartPosition.isNull():
             super().mouseMoveEvent(evt)
             return
-        
-        manhattanLength = (evt.position().toPoint() -
-                           self.__dragStartPosition).manhattanLength()
+
+        manhattanLength = (
+            evt.position().toPoint() - self.__dragStartPosition
+        ).manhattanLength()
         if manhattanLength <= QApplication.startDragDistance():
             super().mouseMoveEvent(evt)
             return
-        
+
         act = self.actionAt(self.__dragStartPosition)
         if act is None:
             super().mouseMoveEvent(evt)
             return
-        
+
         idx = self.index(act)
         if not idx.isValid():
             super().mouseMoveEvent(evt)
             return
-        
+
         drag = QDrag(self)
         drag.setMimeData(self.__model.mimeData([idx]))
         actionRect = self.actionGeometry(act)
         drag.setPixmap(self.grab(actionRect))
-        
+
         if drag.exec() == Qt.DropAction.MoveAction:
             row = idx.row()
             if self.__dropIndex == idx.parent() and self.__dropRow <= row:
                 row += 1
             self.__model.removeRow(row, self.__root)
-            
+
             if not self.isAncestorOf(drag.target()):
                 self.close()
             else:
                 self.aboutToShow.emit()
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method handling mouse release events.
-        
+
         @param evt reference to the event object (QMouseEvent)
         """
         self._mouseButton = evt.button()
         self._keyboardModifiers = evt.modifiers()
-        
+
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__dragStartPosition = QPoint()
-        
+
         super().mouseReleaseEvent(evt)
-    
+
     def resetFlags(self):
         """
         Public method to reset the saved internal state.
         """
         self._mouseButton = Qt.MouseButton.NoButton
         self._keyboardModifiers = Qt.KeyboardModifier.NoModifier
-    
+
     def removeEntry(self, idx):
         """
         Public method to remove a menu entry.
-        
+
         @param idx index of the entry to be removed (QModelIndex)
         """
         row = idx.row()
--- a/src/eric7/EricWidgets/EricModelToolBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricModelToolBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,15 +15,16 @@
 class EricModelToolBar(QToolBar):
     """
     Class implementing a tool bar populated from a QAbstractItemModel.
-    
+
     @signal activated(QModelIndex) emitted when an action has been triggered
     """
+
     activated = pyqtSignal(QModelIndex)
-    
+
     def __init__(self, title=None, parent=None):
         """
         Constructor
-        
+
         @param title title for the tool bar (string)
         @param parent reference to the parent widget (QWidget)
         """
@@ -31,138 +32,131 @@
             super().__init__(title, parent)
         else:
             super().__init__(parent)
-        
+
         self.__model = None
-        
+
         self.__root = QModelIndex()
         self.__dragStartPosition = QPoint()
-        
+
         if self.isVisible():
             self._build()
-        
+
         self.setAcceptDrops(True)
-        
+
         self._mouseButton = Qt.MouseButton.NoButton
         self._keyboardModifiers = Qt.KeyboardModifier.NoModifier
         self.__dropRow = -1
         self.__dropIndex = None
-    
+
     def setModel(self, model):
         """
         Public method to set the model for the tool bar.
-        
+
         @param model reference to the model (QAbstractItemModel)
         """
         if self.__model is not None:
             self.__model.modelReset.disconnect(self._build)
-            self.__model.rowsInserted[QModelIndex, int, int].disconnect(
-                self._build)
-            self.__model.rowsRemoved[QModelIndex, int, int].disconnect(
-                self._build)
-            self.__model.dataChanged.disconnect(
-                self._build)
-        
+            self.__model.rowsInserted[QModelIndex, int, int].disconnect(self._build)
+            self.__model.rowsRemoved[QModelIndex, int, int].disconnect(self._build)
+            self.__model.dataChanged.disconnect(self._build)
+
         self.__model = model
-        
+
         if self.__model is not None:
             self.__model.modelReset.connect(self._build)
-            self.__model.rowsInserted[QModelIndex, int, int].connect(
-                self._build)
-            self.__model.rowsRemoved[QModelIndex, int, int].connect(
-                self._build)
-            self.__model.dataChanged.connect(
-                self._build)
-    
+            self.__model.rowsInserted[QModelIndex, int, int].connect(self._build)
+            self.__model.rowsRemoved[QModelIndex, int, int].connect(self._build)
+            self.__model.dataChanged.connect(self._build)
+
     def model(self):
         """
         Public method to get a reference to the model.
-        
+
         @return reference to the model (QAbstractItemModel)
         """
         return self.__model
-    
+
     def setRootIndex(self, idx):
         """
         Public method to set the root index.
-        
+
         @param idx index to be set as the root index (QModelIndex)
         """
         self.__root = idx
-    
+
     def rootIndex(self):
         """
         Public method to get the root index.
-        
+
         @return root index (QModelIndex)
         """
         return self.__root
-    
+
     def _build(self):
         """
         Protected slot to build the tool bar.
         """
         if self.__model is None:
             return
-        
+
         self.clear()
-        
+
         for i in range(self.__model.rowCount(self.__root)):
             idx = self.__model.index(i, 0, self.__root)
-            
+
             title = idx.data(Qt.ItemDataRole.DisplayRole)
             icon = idx.data(Qt.ItemDataRole.DecorationRole)
             if icon == NotImplemented or icon is None:
                 icon = QIcon()
             folder = self.__model.hasChildren(idx)
-            
+
             act = self.addAction(icon, title)
             act.setData(idx)
-            
+
             button = self.widgetForAction(act)
             button.installEventFilter(self)
-            
+
             if folder:
                 menu = self._createMenu()
                 menu.setModel(self.__model)
                 menu.setRootIndex(idx)
                 button.setMenu(menu)
-                button.setPopupMode(
-                    QToolButton.ToolButtonPopupMode.InstantPopup)
-                button.setToolButtonStyle(
-                    Qt.ToolButtonStyle.ToolButtonTextBesideIcon)
-    
+                button.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
+                button.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon)
+
     def index(self, action):
         """
         Public method to get the index of an action.
-        
+
         @param action reference to the action to get the index for (QAction)
         @return index of the action (QModelIndex)
         """
         if action is None:
             return QModelIndex()
-        
+
         idx = action.data()
         if idx is None:
             return QModelIndex()
-        
+
         if not isinstance(idx, QModelIndex):
             return QModelIndex()
-        
+
         return idx
-    
+
     def _createMenu(self):
         """
         Protected method to create the menu for a tool bar action.
-        
+
         @return menu for a tool bar action (EricModelMenu)
         """
         from .EricModelMenu import EricModelMenu
+
         return EricModelMenu(self)
-    
+
     def eventFilter(self, obj, evt):
         """
         Public method to handle event for other objects.
-        
+
         @param obj reference to the object (QObject)
         @param evt reference to the event (QEvent)
         @return flag indicating that the event should be filtered out (boolean)
@@ -175,18 +169,19 @@
             if idx.isValid():
                 self.activated[QModelIndex].emit(idx)
         elif (
-            evt.type() == QEvent.Type.MouseButtonPress and
-            evt.buttons() & Qt.MouseButton.LeftButton
+            evt.type() == QEvent.Type.MouseButtonPress
+            and evt.buttons() & Qt.MouseButton.LeftButton
         ):
             self.__dragStartPosition = self.mapFromGlobal(
-                evt.globalPosition().toPoint())
-        
+                evt.globalPosition().toPoint()
+            )
+
         return False
-    
+
     def dragEnterEvent(self, evt):
         """
         Protected method to handle drag enter events.
-        
+
         @param evt reference to the event (QDragEnterEvent)
         """
         if self.__model is not None:
@@ -194,13 +189,13 @@
             for mimeType in mimeTypes:
                 if evt.mimeData().hasFormat(mimeType):
                     evt.acceptProposedAction()
-        
+
         super().dragEnterEvent(evt)
-    
+
     def dropEvent(self, evt):
         """
         Protected method to handle drop events.
-        
+
         @param evt reference to the event (QDropEvent)
         @exception RuntimeError raised to indicate an invalid model index
         """
@@ -217,75 +212,77 @@
                 if self.__model.hasChildren(idx):
                     parentIndex = idx
                     row = self.__model.rowCount(idx)
-            
+
             self.__dropRow = row
             self.__dropIndex = parentIndex
             evt.acceptProposedAction()
-            self.__model.dropMimeData(evt.mimeData(), evt.dropAction(),
-                                      row, 0, parentIndex)
-        
+            self.__model.dropMimeData(
+                evt.mimeData(), evt.dropAction(), row, 0, parentIndex
+            )
+
         super().dropEvent(evt)
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the event (QMouseEvent)
         @exception RuntimeError raised to indicate an invalid model index
         """
         if self.__model is None:
             super().mouseMoveEvent(evt)
             return
-        
+
         if not (evt.buttons() & Qt.MouseButton.LeftButton):
             super().mouseMoveEvent(evt)
             return
-        
-        manhattanLength = (evt.position().toPoint() -
-                           self.__dragStartPosition).manhattanLength()
+
+        manhattanLength = (
+            evt.position().toPoint() - self.__dragStartPosition
+        ).manhattanLength()
         if manhattanLength <= QApplication.startDragDistance():
             super().mouseMoveEvent(evt)
             return
-        
+
         act = self.actionAt(self.__dragStartPosition)
         if act is None:
             super().mouseMoveEvent(evt)
             return
-        
+
         idx = self.index(act)
         if not idx.isValid():
             raise RuntimeError("invalid index")
-        
+
         drag = QDrag(self)
         drag.setMimeData(self.__model.mimeData([idx]))
         actionRect = self.actionGeometry(act)
         drag.setPixmap(self.grab(actionRect))
-        
+
         if drag.exec() == Qt.DropAction.MoveAction:
             row = idx.row()
             if self.__dropIndex == idx.parent() and self.__dropRow <= row:
                 row += 1
             self.__model.removeRow(row, self.__root)
-    
+
     def hideEvent(self, evt):
         """
         Protected method to handle hide events.
-        
+
         @param evt reference to the hide event (QHideEvent)
         """
         self.clear()
         super().hideEvent(evt)
-    
+
     def showEvent(self, evt):
         """
         Protected method to handle show events.
-        
+
         @param evt reference to the hide event (QHideEvent)
         """
         if len(self.actions()) == 0:
             self._build()
         super().showEvent(evt)
-    
+
     def resetFlags(self):
         """
         Public method to reset the saved internal state.
--- a/src/eric7/EricWidgets/EricPassivePopup.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricPassivePopup.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,45 +18,47 @@
     """
     Class defining the popup styles.
     """
-    BOXED = 0           # box with no shadow
-    STYLED = 1          # styled panel with no shadow
-    CUSTOM = 128        # reserved for extensions
+
+    BOXED = 0  # box with no shadow
+    STYLED = 1  # styled panel with no shadow
+    CUSTOM = 128  # reserved for extensions
 
 
 class EricPassivePopup(QFrame):
     """
     Class implementing dialog-like popup that displays messages without
     interrupting the user.
-    
+
     @signal clicked emitted to indicate a mouse button click
     """
-    DefaultPopupTime = 6 * 1000     # time im milliseconds
-    
-    clicked = pyqtSignal((), (QPoint, ))
-    
+
+    DefaultPopupTime = 6 * 1000  # time im milliseconds
+
+    clicked = pyqtSignal((), (QPoint,))
+
     def __init__(self, style=EricPassivePopupStyle.BOXED, parent=None):
         """
         Constructor
-        
+
         @param style style of the popup
         @type EricPassivePopupStyle
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(None)
-        
+
         self.__msgView = None
         self.__topLayout = None
         self.__hideDelay = EricPassivePopup.DefaultPopupTime
         self.__hideTimer = QTimer(self)
         self.__autoDelete = False
         self.__fixedPosition = QPoint()
-        
+
         self.setWindowFlags(
-            Qt.WindowType.Tool |
-            Qt.WindowType.X11BypassWindowManagerHint |
-            Qt.WindowType.WindowStaysOnTopHint |
-            Qt.WindowType.FramelessWindowHint
+            Qt.WindowType.Tool
+            | Qt.WindowType.X11BypassWindowManagerHint
+            | Qt.WindowType.WindowStaysOnTopHint
+            | Qt.WindowType.FramelessWindowHint
         )
         if style == EricPassivePopupStyle.STYLED:
             self.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
@@ -66,13 +68,13 @@
         self.setLineWidth(2)
         self.__hideTimer.timeout.connect(self.hide)
         self.clicked.connect(self.hide)
-        
+
         self.__customData = {}  # dictionary to store some custom data
-    
+
     def setView(self, child):
         """
         Public method to set the message view.
-        
+
         @param child reference to the widget to set as the message view
             (QWidget)
         """
@@ -80,58 +82,58 @@
         self.__topLayout = QVBoxLayout(self)
         self.__topLayout.addWidget(self.__msgView)
         self.__topLayout.activate()
-    
+
     def view(self):
         """
         Public method to get a reference to the message view.
-        
+
         @return reference to the message view (QWidget)
         """
         return self.__msgView
-    
+
     def setVisible(self, visible):
         """
         Public method to show or hide the popup.
-        
+
         @param visible flag indicating the visibility status (boolean)
         """
         if not visible:
             super().setVisible(visible)
             return
-        
+
         if self.size() != self.sizeHint():
             self.resize(self.sizeHint())
-        
+
         if self.__fixedPosition.isNull():
             self.__positionSelf()
         else:
             self.move(self.__fixedPosition)
         super().setVisible(True)
-        
+
         delay = self.__hideDelay
         if delay < 0:
             delay = EricPassivePopup.DefaultPopupTime
         if delay > 0:
             self.__hideTimer.start(delay)
-    
+
     def show(self, p=None):
         """
         Public slot to show the popup.
-        
+
         @param p position for the popup (QPoint)
         """
         if p is not None:
             self.__fixedPosition = p
         super().show()
-    
+
     def setTimeout(self, delay):
         """
         Public method to set the delay for the popup is removed automatically.
-        
+
         Setting the delay to 0 disables the timeout. If you're doing this, you
         may want to connect the clicked() signal to the hide() slot. Setting
         the delay to -1 makes it use the default value.
-        
+
         @param delay value for the delay in milliseconds (integer)
         """
         self.__hideDelay = delay
@@ -142,63 +144,63 @@
                 self.__hideTimer.start(delay)
             else:
                 self.__hideTimer.stop()
-    
+
     def timeout(self):
         """
         Public method to get the delay before the popup is removed
         automatically.
-        
+
         @return the delay before the popup is removed automatically (integer)
         """
         return self.__hideDelay
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle a mouse release event.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         self.clicked.emit()
         self.clicked.emit(evt.position().toPoint())
-    
+
     def hideEvent(self, evt):
         """
         Protected method to handle the hide event.
-        
+
         @param evt reference to the hide event (QHideEvent)
         """
         self.__hideTimer.stop()
-    
+
     def __defaultArea(self):
         """
         Private method to determine the default rectangle to be passed to
         moveNear().
-        
+
         @return default rectangle (QRect)
         """
         return QRect(100, 100, 200, 200)
-    
+
     def __positionSelf(self):
         """
         Private method to position the popup.
         """
         self.__moveNear(self.__defaultArea())
-    
+
     def __moveNear(self, target):
         """
         Private method to move the popup to be adjacent to the specified
         rectangle.
-        
+
         @param target rectangle to be placed at (QRect)
         """
         pos = self.__calculateNearbyPoint(target)
         self.move(pos.x(), pos.y())
-    
+
     def __calculateNearbyPoint(self, target):
         """
         Private method to calculate the position to place the popup near the
         specified rectangle.
-        
+
         @param target rectangle to be placed at (QRect)
         @return position to place the popup (QPoint)
         """
@@ -207,45 +209,45 @@
         y = pos.y()
         w = self.minimumSizeHint().width()
         h = self.minimumSizeHint().height()
-        
+
         r = QApplication.screenAt(QPoint(x + w // 2, y + h // 2)).geometry()
-        
+
         if x < r.center().x():
             x += target.width()
         else:
             x -= w
-        
+
         # It's apparently trying to go off screen, so display it ALL at the
         # bottom.
         if (y + h) > r.bottom():
             y = r.bottom() - h
-        
+
         if (x + w) > r.right():
             x = r.right() - w
-        
+
         if y < r.top():
             y = r.top()
-        
+
         if x < r.left():
             x = r.left()
-        
+
         return QPoint(x, y)
-    
+
     def setCustomData(self, key, data):
         """
         Public method to set some custom data.
-        
+
         @param key key for the custom data
         @type str
         @param data data to be stored
         @type any
         """
         self.__customData[key] = data
-    
+
     def getCustomData(self, key):
         """
         Public method to get some custom data.
-        
+
         @param key key for the custom data
         @type str
         @return stored data
--- a/src/eric7/EricWidgets/EricPasswordMeter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricPasswordMeter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,27 +16,28 @@
     """
     Class implementing a custom widget indicating the strength of a password.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         super().setTextVisible(False)
         super().setMaximum(100)
         self.__increment = 100 // (PasswordChecker.Complexity_VeryStrong + 1)
-        
+
         self.__indicatorColors = [
-            "#ff0000",      # red
-            "#ff8800",      # orange
-            "#ffff00",      # yellow
-            "#ccff00",      # yellow green
-            "#00ff00",      # green
+            "#ff0000",  # red
+            "#ff8800",  # orange
+            "#ffff00",  # yellow
+            "#ccff00",  # yellow green
+            "#00ff00",  # green
         ]
         self.__noIndicator = "#ffffff"
-        
+
         self.__styleSheetTemplate = (
             "QProgressBar {{"
             " border: 2px solid black;"
@@ -45,56 +46,56 @@
             "QProgressBar::chunk:horizontal {{"
             " background-color: {0}; }}"
         )
-        self.setStyleSheet(
-            self.__styleSheetTemplate.format(self.__noIndicator))
-    
+        self.setStyleSheet(self.__styleSheetTemplate.format(self.__noIndicator))
+
     def checkPasswordStrength(self, password):
         """
         Public slot to check the password strength and update the
         progress bar accordingly.
-        
+
         @param password password to be checked (string)
         """
         strength = PasswordChecker().checkPassword(password)
-        self.setStyleSheet(self.__styleSheetTemplate.format(
-            self.__indicatorColors[strength]))
-        super().setValue(
-            (strength + 1) * self.__increment)
-    
+        self.setStyleSheet(
+            self.__styleSheetTemplate.format(self.__indicatorColors[strength])
+        )
+        super().setValue((strength + 1) * self.__increment)
+
     def setValue(self, value):
         """
         Public method to set the value.
-        
+
         Overwritten to do nothing.
-        
+
         @param value value (integer)
         """
         pass
-    
+
     def setMaximum(self, value):
         """
         Public method to set the maximum value.
-        
+
         Overwritten to do nothing.
-        
+
         @param value maximum value (integer)
         """
         pass
-    
+
     def setMinimum(self, value):
         """
         Public method to set the minimal value.
-        
+
         Overwritten to do nothing.
-        
+
         @param value minimum value (integer)
         """
         pass
 
+
 if __name__ == "__main__":
     import sys
     from PyQt6.QtWidgets import QApplication
-    
+
     app = QApplication(sys.argv)
     meter = EricPasswordMeter()
     meter.show()
--- a/src/eric7/EricWidgets/EricPathPicker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricPathPicker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,12 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QCoreApplication, QDir
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QToolButton, QSizePolicy, QLineEdit, QComboBox
+    QWidget,
+    QHBoxLayout,
+    QToolButton,
+    QSizePolicy,
+    QLineEdit,
+    QComboBox,
 )
 
 from . import EricFileDialog
@@ -26,6 +31,7 @@
     """
     Class implementing the path picker modes.
     """
+
     OPEN_FILE_MODE = 0
     OPEN_FILES_MODE = 1
     SAVE_FILE_MODE = 2
@@ -42,7 +48,7 @@
     """
     Class implementing the base of a path picker widget consisting of a
     line edit or combo box and a tool button to open a file dialog.
-    
+
     @signal textChanged(path) emitted when the entered path has changed
         (line edit based widget)
     @signal editTextChanged(path) emitted when the entered path has changed
@@ -53,104 +59,105 @@
     @signal pickerButtonClicked emitted when the picker button was pressed and
         the widget mode is custom
     """
+
     DefaultMode = EricPathPickerModes.NO_MODE
-    
+
     textChanged = pyqtSignal(str)
     editTextChanged = pyqtSignal(str)
     pathSelected = pyqtSignal(str)
     aboutToShowPathPickerDialog = pyqtSignal()
     pickerButtonClicked = pyqtSignal()
-    
+
     def __init__(self, parent=None, useLineEdit=True):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param useLineEdit flag indicating the use of a line edit
         @type bool
         """
         super().__init__(parent)
-        
+
         self.__lineEditKind = useLineEdit
-        
+
         self.__mode = EricPathPicker.DefaultMode
         self.__editorEnabled = True
-        
+
         self._completer = None
         self.__filters = ""
         self.__defaultDirectory = ""
         self.__windowTitle = ""
-        
+
         self.__layout = QHBoxLayout(self)
         self.__layout.setSpacing(0)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         if useLineEdit:
             self._editor = QLineEdit(self)
-            self._editor.setPlaceholderText(QCoreApplication.translate(
-                "EricPathPickerBase", "Enter Path Name"))
+            self._editor.setPlaceholderText(
+                QCoreApplication.translate("EricPathPickerBase", "Enter Path Name")
+            )
             self._editor.setClearButtonEnabled(True)
         else:
             self._editor = QComboBox(self)
             self._editor.setEditable(True)
             self._editor.lineEdit().setPlaceholderText(
-                QCoreApplication.translate(
-                    "EricPathPickerBase", "Enter Path Name"))
+                QCoreApplication.translate("EricPathPickerBase", "Enter Path Name")
+            )
             self._editor.lineEdit().setClearButtonEnabled(True)
-        
+
         self.__button = QToolButton(self)
         self.__button.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.__button.setIcon(UI.PixmapCache.getIcon("open"))
-        
+
         self.__layout.addWidget(self._editor)
         self.__layout.addWidget(self.__button)
-        
+
         self.__button.clicked.connect(self.__showPathPickerDialog)
         if useLineEdit:
             self._editor.textEdited.connect(self.__pathEdited)
             self._editor.textChanged.connect(self.textChanged)
         else:
             self._editor.editTextChanged.connect(self.editTextChanged)
-        
+
         self.setFocusProxy(self._editor)
         self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
-        self.setSizePolicy(QSizePolicy.Policy.Expanding,
-                           QSizePolicy.Policy.Preferred)
-        
+        self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+
         self.__button.setEnabled(self.__mode != EricPathPickerModes.NO_MODE)
-    
+
     def __pathEdited(self, fpath):
         """
         Private slot handling editing of the path.
-        
+
         @param fpath current text of the path line edit
         @type str
         """
         if self._completer and not self._completer.popup().isVisible():
             self._completer.setRootPath(QDir.toNativeSeparators(fpath))
-    
+
     def setMode(self, mode):
         """
         Public method to set the path picker mode.
-        
+
         @param mode picker mode
         @type EricPathPickerModes
         @exception ValueError raised to indicate a bad parameter value
         """
         if mode not in EricPathPickerModes:
             raise ValueError("Bad value for 'mode' parameter.")
-        
+
         oldMode = self.__mode
         self.__mode = mode
-        
+
         if mode != oldMode or (self.__lineEditKind and not self._completer):
             if self.__lineEditKind and self._completer:
                 # Remove current completer
                 self._editor.setCompleter(None)
                 self._completer = None
-            
+
             if mode != EricPathPickerModes.NO_MODE:
                 if self.__lineEditKind:
                     # Set a new completer
@@ -158,63 +165,63 @@
                         self._completer = EricDirCompleter(self._editor)
                     else:
                         self._completer = EricFileCompleter(self._editor)
-                
+
                 # set inactive text
                 if mode in (
                     EricPathPickerModes.OPEN_FILES_MODE,
                     EricPathPickerModes.OPEN_FILES_AND_DIRS_MODE,
                 ):
                     self._editor.setPlaceholderText(
-                        self.tr("Enter Path Names separated by ';'"))
+                        self.tr("Enter Path Names separated by ';'")
+                    )
                 else:
-                    self._editor.setPlaceholderText(
-                        self.tr("Enter Path Name"))
+                    self._editor.setPlaceholderText(self.tr("Enter Path Name"))
         self.__button.setEnabled(self.__mode != EricPathPickerModes.NO_MODE)
-    
+
     def mode(self):
         """
         Public method to get the path picker mode.
-        
+
         @return path picker mode
         @rtype EricPathPickerModes
         """
         return self.__mode
-    
+
     def setPickerEnabled(self, enable):
         """
         Public method to set the enabled state of the file dialog button.
-        
+
         @param enable flag indicating the enabled state
         @type bool
         """
         self.__button.setEnabled(enable)
-    
+
     def isPickerEnabled(self):
         """
         Public method to get the file dialog button enabled state.
-        
+
         @return flag indicating the enabled state
         @rtype bool
         """
         return self.__button.isEnabled()
-    
+
     def clear(self):
         """
         Public method to clear the current path or list of paths.
         """
         self._editor.clear()
-    
+
     def clearEditText(self):
         """
         Public method to clear the current path.
         """
         if not self.__lineEditKind:
             self._editor.clearEditText()
-    
+
     def _setEditorText(self, text):
         """
         Protected method to set the text of the editor.
-        
+
         @param text text to set
         @type str
         """
@@ -224,11 +231,11 @@
             self._editor.setEditText(text)
             if text and self._editor.findText(text) == -1:
                 self._editor.insertItem(0, text)
-    
+
     def _editorText(self):
         """
         Protected method to get the text of the editor.
-        
+
         @return text of the editor
         @rtype str
         """
@@ -236,11 +243,11 @@
             return self._editor.text()
         else:
             return self._editor.currentText()
-    
+
     def setText(self, fpath, toNative=True):
         """
         Public method to set the current path.
-        
+
         @param fpath path to be set
         @type str
         @param toNative flag indicating to convert the path into
@@ -258,11 +265,11 @@
             self._setEditorText(fpath)
             if self._completer:
                 self._completer.setRootPath(fpath)
-    
+
     def text(self, toNative=True):
         """
         Public method to get the current path.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -275,21 +282,23 @@
         ):
             if toNative:
                 return ";".join(
-                    [QDir.toNativeSeparators(fpath)
-                     for fpath in self._editorText().split(";")])
+                    [
+                        QDir.toNativeSeparators(fpath)
+                        for fpath in self._editorText().split(";")
+                    ]
+                )
             else:
                 return self._editorText()
         else:
             if toNative:
-                return os.path.expanduser(
-                    QDir.toNativeSeparators(self._editorText()))
+                return os.path.expanduser(QDir.toNativeSeparators(self._editorText()))
             else:
                 return os.path.expanduser(self._editorText())
-    
+
     def setEditText(self, fpath, toNative=True):
         """
         Public method to set the current path.
-        
+
         @param fpath path to be set
         @type str
         @param toNative flag indicating to convert the path into
@@ -297,11 +306,11 @@
         @type bool
         """
         self.setText(fpath, toNative=toNative)
-    
+
     def currentText(self, toNative=True):
         """
         Public method to get the current path.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -309,11 +318,11 @@
         @rtype str
         """
         return self.text(toNative=toNative)
-    
+
     def setPath(self, fpath, toNative=True):
         """
         Public method to set the current path.
-        
+
         @param fpath path to be set
         @type str
         @param toNative flag indicating to convert the path into
@@ -321,11 +330,11 @@
         @type bool
         """
         self.setText(fpath, toNative=toNative)
-    
+
     def path(self, toNative=True):
         """
         Public method to get the current path.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -333,11 +342,11 @@
         @rtype str
         """
         return self.text(toNative=toNative)
-    
+
     def paths(self, toNative=True):
         """
         Public method to get the list of entered paths.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -351,11 +360,11 @@
             return self.path(toNative=toNative).split(";")
         else:
             return [self.path(toNative=toNative)]
-    
+
     def firstPath(self, toNative=True):
         """
         Public method to get the first path of a list of entered paths.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -363,11 +372,11 @@
         @rtype str
         """
         return self.paths(toNative=toNative)[0]
-    
+
     def lastPath(self, toNative=True):
         """
         Public method to get the last path of a list of entered paths.
-        
+
         @param toNative flag indicating to convert the path into
             a native format
         @type bool
@@ -375,142 +384,142 @@
         @rtype str
         """
         return self.paths(toNative=toNative)[-1]
-    
+
     def setEditorEnabled(self, enable):
         """
         Public method to set the path editor's enabled state.
-        
+
         @param enable flag indicating the enable state
         @type bool
         """
         if enable != self._editorEnabled:
             self._editorEnabled = enable
             self._editor.setEnabled(enable)
-    
+
     def editorEnabled(self):
         """
         Public method to get the path editor's enabled state.
-        
+
         @return flag indicating the enabled state
         @rtype bool
         """
         return self._editorEnabled
-    
+
     def setDefaultDirectory(self, directory):
         """
         Public method to set the default directory.
-        
+
         @param directory default directory
         @type str
         """
         self.__defaultDirectory = directory
-    
+
     def defaultDirectory(self):
         """
         Public method to get the default directory.
-        
+
         @return default directory
         @rtype str
         """
         return self.__defaultDirectory
-    
+
     def setWindowTitle(self, title):
         """
         Public method to set the path picker dialog window title.
-        
+
         @param title window title
         @type str
         """
         self.__windowTitle = title
-    
+
     def windowTitle(self):
         """
         Public method to get the path picker dialog's window title.
-        
+
         @return window title
         @rtype str
         """
         return self.__windowTitle
-    
+
     def setFilters(self, filters):
         """
         Public method to set the filters for the path picker dialog.
-        
+
         Note: Multiple filters must be separated by ';;'.
-        
+
         @param filters string containing the file filters
         @type str
         """
         self.__filters = filters
-    
+
     def filters(self):
         """
         Public methods to get the filter string.
-        
+
         @return filter string
         @rtype str
         """
         return self.__filters
-    
+
     def setNameFilters(self, filters):
         """
         Public method to set the name filters for the completer.
-        
+
         @param filters list of file name filters
         @type list of str
         """
         if self._completer:
             self._completer.model().setNameFilters(filters)
-    
+
     def setButtonToolTip(self, tooltip):
         """
         Public method to set the tool button tool tip.
-        
+
         @param tooltip text to be set as a tool tip
         @type str
         """
         self.__button.setToolTip(tooltip)
-    
+
     def buttonToolTip(self):
         """
         Public method to get the tool button tool tip.
-        
+
         @return tool tip text
         @rtype str
         """
         return self.__button.toolTip()
-    
+
     def setEditorToolTip(self, tooltip):
         """
         Public method to set the editor tool tip.
-        
+
         @param tooltip text to be set as a tool tip
         @type str
         """
         self._editor.setToolTip(tooltip)
-    
+
     def editorToolTip(self):
         """
         Public method to get the editor tool tip.
-        
+
         @return tool tip text
         @rtype str
         """
         return self._editor.toolTip()
-    
+
     def __showPathPickerDialog(self):
         """
         Private slot to show the path picker dialog.
         """
         if self.__mode == EricPathPickerModes.NO_MODE:
             return
-        
+
         if self.__mode == EricPathPickerModes.CUSTOM_MODE:
             self.pickerButtonClicked.emit()
             return
-        
+
         self.aboutToShowPathPickerDialog.emit()
-        
+
         windowTitle = self.__windowTitle
         if not windowTitle:
             if self.__mode == EricPathPickerModes.OPEN_FILE_MODE:
@@ -521,67 +530,62 @@
                 windowTitle = self.tr("Choose files and directories")
             elif self.__mode in [
                 EricPathPickerModes.SAVE_FILE_MODE,
-                    EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE,
-                    EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE]:
+                EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE,
+                EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE,
+            ]:
                 windowTitle = self.tr("Choose a file to save")
             elif self.__mode == EricPathPickerModes.DIRECTORY_MODE:
                 windowTitle = self.tr("Choose a directory")
-        
+
         directory = self._editorText()
         if not directory and self.__defaultDirectory:
             directory = self.__defaultDirectory
         directory = (
             os.path.expanduser(directory.split(";")[0])
-            if self.__mode in (
+            if self.__mode
+            in (
                 EricPathPickerModes.OPEN_FILES_MODE,
-                EricPathPickerModes.OPEN_FILES_AND_DIRS_MODE) else
-            os.path.expanduser(directory)
+                EricPathPickerModes.OPEN_FILES_AND_DIRS_MODE,
+            )
+            else os.path.expanduser(directory)
         )
         if not os.path.isabs(directory) and self.__defaultDirectory:
             directory = os.path.join(self.__defaultDirectory, directory)
         directory = QDir.fromNativeSeparators(directory)
-        
+
         if self.__mode == EricPathPickerModes.OPEN_FILE_MODE:
             fpath = EricFileDialog.getOpenFileName(
-                self,
-                windowTitle,
-                directory,
-                self.__filters)
+                self, windowTitle, directory, self.__filters
+            )
             fpath = QDir.toNativeSeparators(fpath)
         elif self.__mode == EricPathPickerModes.OPEN_FILES_MODE:
             fpaths = EricFileDialog.getOpenFileNames(
-                self,
-                windowTitle,
-                directory,
-                self.__filters)
-            fpath = ";".join([QDir.toNativeSeparators(fpath)
-                             for fpath in fpaths])
+                self, windowTitle, directory, self.__filters
+            )
+            fpath = ";".join([QDir.toNativeSeparators(fpath) for fpath in fpaths])
         elif self.__mode == EricPathPickerModes.OPEN_FILES_AND_DIRS_MODE:
             fpaths = EricFileDialog.getOpenFileAndDirNames(
-                self,
-                windowTitle,
-                directory,
-                self.__filters)
-            fpath = ";".join([QDir.toNativeSeparators(fpath)
-                             for fpath in fpaths])
+                self, windowTitle, directory, self.__filters
+            )
+            fpath = ";".join([QDir.toNativeSeparators(fpath) for fpath in fpaths])
         elif self.__mode == EricPathPickerModes.SAVE_FILE_MODE:
             fpath = EricFileDialog.getSaveFileName(
                 self,
                 windowTitle,
                 directory,
                 self.__filters,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             fpath = QDir.toNativeSeparators(fpath)
-        elif (
-            self.__mode == EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE
-        ):
+        elif self.__mode == EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE:
             fpath, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
                 self,
                 windowTitle,
                 directory,
                 self.__filters,
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             fpath = pathlib.Path(fpath)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -589,38 +593,32 @@
                     fpath = fpath.with_suffix(ex)
         elif self.__mode == EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE:
             fpath = EricFileDialog.getSaveFileName(
-                self,
-                windowTitle,
-                directory,
-                self.__filters)
+                self, windowTitle, directory, self.__filters
+            )
             fpath = QDir.toNativeSeparators(fpath)
         elif self.__mode == EricPathPickerModes.DIRECTORY_MODE:
             fpath = EricFileDialog.getExistingDirectory(
-                self,
-                windowTitle,
-                directory,
-                EricFileDialog.ShowDirsOnly)
+                self, windowTitle, directory, EricFileDialog.ShowDirsOnly
+            )
             fpath = QDir.toNativeSeparators(fpath)
             while fpath.endswith(os.sep):
                 fpath = fpath[:-1]
         elif self.__mode == EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE:
             fpath = EricFileDialog.getExistingDirectory(
-                self,
-                windowTitle,
-                directory,
-                EricFileDialog.DontUseNativeDialog)
+                self, windowTitle, directory, EricFileDialog.DontUseNativeDialog
+            )
             fpath = QDir.toNativeSeparators(fpath)
             while fpath.endswith(os.sep):
                 fpath = fpath[:-1]
-        
+
         if fpath:
             self._setEditorText(str(fpath))
             self.pathSelected.emit(str(fpath))
-    
+
     def setReadOnly(self, readOnly):
         """
         Public method to set the path picker to read only mode.
-        
+
         @param readOnly flag indicating read only mode
         @type bool
         """
@@ -629,11 +627,11 @@
         except AttributeError:
             self._editor.setEditable(not readOnly)
         self.setPickerEnabled(not readOnly)
-    
+
     def isReadOnly(self):
         """
         Public method to check the path picker for read only mode.
-        
+
         @return flg indicating read only mode
         @rtype bool
         """
@@ -641,70 +639,70 @@
             return self._editor.isReadOnly()
         except AttributeError:
             return not self._editor.isEditable()
-    
+
     ##################################################################
     ## Methods below emulate some of the QComboBox API
     ##################################################################
-    
+
     def addItems(self, pathsList):
         """
         Public method to add paths to the current list.
-        
+
         @param pathsList list of paths to add
         @type list of str
         """
         self._editor.addItems(pathsList)
-    
+
     def addItem(self, fpath):
         """
         Public method to add a paths to the current list.
-        
+
         @param fpath path to add
         @type str
         """
         self._editor.addItem(fpath)
-    
+
     def setPathsList(self, pathsList):
         """
         Public method to set the paths list.
-        
+
         @param pathsList list of paths
         @type list of str
         """
         self.clear()
         self.addItems(pathsList)
-    
+
     def setCurrentIndex(self, index):
         """
         Public slot to set the current index.
-        
+
         @param index index of the item to set current
         @type int
         """
         self._editor.setCurrentIndex(index)
-    
+
     def setCurrentText(self, text):
         """
         Public slot to set the current text.
-        
+
         @param text text of the item to set current
         @type str
         """
         self._editor.setCurrentText(text)
-    
+
     def setInsertPolicy(self, policy):
         """
         Public method to set the insertion policy of the combo box.
-        
+
         @param policy insertion policy
         @type QComboBox.InsertPolicy
         """
         self._editor.setInsertPolicy(policy)
-    
+
     def setSizeAdjustPolicy(self, policy):
         """
         Public method to set the size adjust policy of the combo box.
-        
+
         @param policy size adjust policy
         @type QComboBox.SizeAdjustPolicy
         """
@@ -716,10 +714,11 @@
     Class implementing a path picker widget consisting of a line edit and a
     tool button to open a file dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
@@ -731,19 +730,20 @@
     Class implementing a path picker widget consisting of a combobox and a
     tool button to open a file dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent, useLineEdit=False)
-    
+
     def getPathItems(self):
         """
         Public method to get the list of remembered paths.
-        
+
         @return list od remembered paths
         @rtype list of str
         """
--- a/src/eric7/EricWidgets/EricPathPickerDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricPathPickerDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,106 +17,115 @@
     Class implementing a dialog to enter a file system path using a file
     picker.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setMinimumWidth(400)
-        
+
         self.__layout = QVBoxLayout(self)
-        
+
         self.__label = QLabel(self)
         self.__label.setWordWrap(True)
-        
+
         self.__pathPicker = EricPathPicker(self)
         self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Cancel |
-            QDialogButtonBox.StandardButton.Ok, self)
-        
+            QDialogButtonBox.StandardButton.Cancel | QDialogButtonBox.StandardButton.Ok,
+            self,
+        )
+
         self.__layout.addWidget(self.__label)
         self.__layout.addWidget(self.__pathPicker)
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.__buttonBox.accepted.connect(self.accept)
         self.__buttonBox.rejected.connect(self.reject)
-    
+
     def setLabelText(self, text):
         """
         Public method to set the label text.
-        
+
         @param text label text
         @type str
         """
         self.__label.setText(text)
-    
+
     def setTitle(self, title):
         """
         Public method to set the window title.
-        
+
         @param title window title
         @type str
         """
         self.setWindowTitle(title)
         self.__pathPicker.setWindowTitle(title)
-    
+
     def setPickerMode(self, mode):
         """
         Public method to set the mode of the path picker.
-        
+
         @param mode picker mode
         @type EricPathPickerModes
         """
         self.__pathPicker.setMode(mode)
-    
+
     def setPickerPath(self, path):
         """
         Public method to set the path of the path picker.
-        
+
         @param path path to be set
         @type str
         """
         self.__pathPicker.setPath(path)
-    
+
     def setDefaultDirectory(self, directory):
         """
         Public method to set the default directory of the path picker.
-        
+
         @param directory default directory
         @type str
         """
         self.__pathPicker.setDefaultDirectory(directory)
-    
+
     def setPickerFilters(self, filters):
         """
         Public method to set the filters of the path picker.
-        
+
         Note: Multiple filters must be separated by ';;'.
-        
+
         @param filters string containing the file filters
         @type str
         """
         self.__pathPicker.setFilters(filters)
-    
+
     def getPath(self):
         """
         Public method to get the current path.
-        
+
         @return current path
         @rtype str
         """
         return self.__pathPicker.path()
 
 
-def getPath(parent, title, label, mode=EricPathPickerModes.OPEN_FILE_MODE,
-            path="", defaultDirectory="", filters=None):
+def getPath(
+    parent,
+    title,
+    label,
+    mode=EricPathPickerModes.OPEN_FILE_MODE,
+    path="",
+    defaultDirectory="",
+    filters=None,
+):
     """
     Function to get a file or directory path from the user.
-    
+
     @param parent reference to the parent widget
     @type QWidget
     @param title title of the dialog
@@ -149,7 +158,7 @@
         dlg.setDefaultDirectory(defaultDirectory)
     if filters is not None and len(filters) > 0:
         dlg.setPickerFilters(";;".join(filters))
-    
+
     # step 2: show the dialog and get the result
     if dlg.exec() == QDialog.DialogCode.Accepted:
         ok = True
@@ -157,6 +166,6 @@
     else:
         ok = False
         path = ""
-    
+
     # step 3: return the result
     return path, ok
--- a/src/eric7/EricWidgets/EricPlainTextDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricPlainTextDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to show some plain text.
     """
+
     def __init__(self, title="", text="", readOnly=True, parent=None):
         """
         Constructor
-        
+
         @param title title of the dialog (defaults to "")
         @type str (optional)
         @param text text to be shown (defaults to "")
@@ -33,16 +34,16 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.copyButton = self.buttonBox.addButton(
-            self.tr("Copy to Clipboard"),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Copy to Clipboard"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.copyButton.clicked.connect(self.on_copyButton_clicked)
-        
+
         self.setWindowTitle(title)
         self.textEdit.setPlainText(text)
         self.textEdit.setReadOnly(readOnly)
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -51,11 +52,11 @@
         txt = self.textEdit.toPlainText()
         cb = QGuiApplication.clipboard()
         cb.setText(txt)
-    
+
     def toPlainText(self):
         """
         Public method to get the plain text.
-        
+
         @return contents of the plain text edit
         @rtype str
         """
--- a/src/eric7/EricWidgets/EricProcessDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricProcessDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,12 @@
 import re
 
 from PyQt6.QtCore import (
-    QProcess, QTimer, pyqtSlot, Qt, QCoreApplication, QProcessEnvironment
+    QProcess,
+    QTimer,
+    pyqtSlot,
+    Qt,
+    QCoreApplication,
+    QProcessEnvironment,
 )
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QLineEdit
 
@@ -26,16 +31,16 @@
 class EricProcessDialog(QDialog, Ui_EricProcessDialog):
     """
     Class implementing a dialog starting a process and showing its output.
-    
+
     It starts a QProcess and displays a dialog that shows the output of the
     process. The dialog is modal, which causes a synchronized execution of
     the process.
     """
-    def __init__(self, outputTitle="", windowTitle="", showProgress=False,
-                 parent=None):
+
+    def __init__(self, outputTitle="", windowTitle="", showProgress=False, parent=None):
         """
         Constructor
-        
+
         @param outputTitle title for the output group
         @type str
         @param windowTitle title of the dialog
@@ -47,88 +52,78 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.resultbox.setFontFamily(font.family())
         self.resultbox.setFontPointSize(font.pointSize())
         self.errors.setFontFamily(font.family())
         self.errors.setFontPointSize(font.pointSize())
-        
+
         if windowTitle:
             self.setWindowTitle(windowTitle)
         if outputTitle:
             self.outputGroup.setTitle(outputTitle)
         self.__showProgress = showProgress
         self.progressBar.setVisible(self.__showProgress)
-        
+
         self.__process = None
         self.__progressRe = re.compile(r"""(\d{1,3})\s*%""")
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.__process = None
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-            Qt.FocusReason.OtherFocusReason)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.statusLabel.setText(self.tr("Process canceled."))
             self.__finish()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
         @type QProcess.ExitStatus
         """
-        self.__normal = (
-            (exitStatus == QProcess.ExitStatus.NormalExit) and
-            (exitCode == 0)
+        self.__normal = (exitStatus == QProcess.ExitStatus.NormalExit) and (
+            exitCode == 0
         )
         if self.__normal:
             self.statusLabel.setText(self.tr("Process finished successfully."))
@@ -136,15 +131,16 @@
             self.statusLabel.setText(self.tr("Process crashed."))
         else:
             self.statusLabel.setText(
-                self.tr("Process finished with exit code {0}")
-                .format(exitCode))
+                self.tr("Process finished with exit code {0}").format(exitCode)
+            )
         self.__finish()
-    
-    def startProcess(self, program, args, workingDir=None, showArgs=True,
-                     environment=None):
+
+    def startProcess(
+        self, program, args, workingDir=None, showArgs=True, environment=None
+    ):
         """
         Public slot used to start the process.
-        
+
         @param program path of the program to be executed
         @type str
         @param args list of arguments for the process
@@ -162,28 +158,28 @@
         self.errorGroup.hide()
         self.__normal = False
         self.__intercept = False
-        
+
         if environment is None:
             environment = {}
-        
+
         if showArgs:
-            self.resultbox.append(program + ' ' + ' '.join(args))
-            self.resultbox.append('')
-        
+            self.resultbox.append(program + " " + " ".join(args))
+            self.resultbox.append("")
+
         self.__process = QProcess()
         if environment:
             env = QProcessEnvironment.systemEnvironment()
             for key, value in environment.items():
                 env.insert(key, value)
             self.__process.setProcessEnvironment(env)
-        
+
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-        
+
         if workingDir:
             self.__process.setWorkingDirectory(workingDir)
-        
+
         self.__process.start(program, args)
         procStarted = self.__process.waitForStarted(10000)
         if not procStarted:
@@ -191,46 +187,49 @@
             self.inputGroup.setEnabled(False)
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
-                self.tr(
-                    '<p>The process <b>{0}</b> could not be started.</p>'
-                ).format(program))
+                self.tr("Process Generation Error"),
+                self.tr("<p>The process <b>{0}</b> could not be started.</p>").format(
+                    program
+                ),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-        
+
         return procStarted
-    
+
     def normalExit(self):
         """
         Public method to check for a normal process termination.
-        
+
         @return flag indicating normal process termination
         @rtype bool
         """
         return self.__normal
-    
+
     def normalExitWithoutErrors(self):
         """
         Public method to check for a normal process termination without
         error messages.
-        
+
         @return flag indicating normal process termination
         @rtype bool
         """
         return self.__normal and self.errors.toPlainText() == ""
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into the
         output pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardOutput(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             if self.__showProgress:
                 match = self.__progressRe.search(s)
                 if match:
@@ -240,31 +239,33 @@
                         s += "\n"
             self.resultbox.insertPlainText(s)
             self.resultbox.ensureCursorVisible()
-            
+
             QCoreApplication.processEvents()
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
-            
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
+
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-            
+
             QCoreApplication.processEvents()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box
         @type bool
         """
@@ -272,7 +273,7 @@
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -280,35 +281,35 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.__intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.__intercept:
             self.__intercept = False
             evt.accept()
             return
-        
+
         super().keyPressEvent(evt)
--- a/src/eric7/EricWidgets/EricProgressDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricProgressDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,11 +16,20 @@
     Class implementing a progress dialog allowing a customized progress bar
     label.
     """
-    def __init__(self, labelText, cancelButtonText, minimum, maximum,
-                 labelFormat=None, parent=None, flags=None):
+
+    def __init__(
+        self,
+        labelText,
+        cancelButtonText,
+        minimum,
+        maximum,
+        labelFormat=None,
+        parent=None,
+        flags=None,
+    ):
         """
         Constructor
-        
+
         @param labelText text of the dialog label (string)
         @param cancelButtonText text of the cancel button (string)
         @param minimum minimum value (integer)
@@ -31,29 +40,28 @@
         """
         if flags is None:
             flags = Qt.WindowType(0)
-        super().__init__(
-            labelText, cancelButtonText, minimum, maximum, parent, flags)
-        
+        super().__init__(labelText, cancelButtonText, minimum, maximum, parent, flags)
+
         self.__progressBar = QProgressBar(self)
         self.__progressBar.setMinimum(minimum)
         self.__progressBar.setMaximum(maximum)
         if labelFormat:
             self.__progressBar.setFormat(labelFormat)
-        
+
         self.setBar(self.__progressBar)
-    
+
     def format(self):
         """
         Public method to get the progress bar format.
-        
+
         @return progress bar format (string)
         """
         return self.__progressBar.format()
-    
+
     def setFormat(self, labelFormat):
         """
         Public method to set the progress bar format.
-        
+
         @param labelFormat progress bar format (string)
         """
         self.__progressBar.setFormat(labelFormat)
--- a/src/eric7/EricWidgets/EricSideBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricSideBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class defining the sidebar sides.
     """
+
     NORTH = 0
     EAST = 1
     SOUTH = 2
@@ -31,13 +32,15 @@
     Class implementing a sidebar with a widget area, that is hidden or shown,
     if the current tab is clicked again.
     """
+
     Version = 4
-    
-    def __init__(self, orientation=None,
-                 iconBarSize=EricIconBar.DefaultBarSize, parent=None):
+
+    def __init__(
+        self, orientation=None, iconBarSize=EricIconBar.DefaultBarSize, parent=None
+    ):
         """
         Constructor
-        
+
         @param orientation orientation of the sidebar widget
         @type EricSideBarSide
         @param iconBarSize size category for the bar (one of 'xs', 'sm', 'md',
@@ -47,66 +50,60 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         # initial layout is done for NORTH
-        self.__iconBar = EricIconBar(orientation=Qt.Orientation.Horizontal,
-                                     barSize=iconBarSize)
-        
+        self.__iconBar = EricIconBar(
+            orientation=Qt.Orientation.Horizontal, barSize=iconBarSize
+        )
+
         self.__stackedWidget = QStackedWidget(self)
         self.__stackedWidget.setContentsMargins(0, 0, 0, 0)
-        
+
         self.layout = QBoxLayout(QBoxLayout.Direction.TopToBottom)
         self.layout.setContentsMargins(0, 0, 0, 0)
         self.layout.setSpacing(3)
         self.layout.addWidget(self.__iconBar)
         self.layout.addWidget(self.__stackedWidget)
         self.setLayout(self.layout)
-        
+
         self.__minimized = False
         self.__minSize = 0
         self.__maxSize = 0
         self.__bigSize = QSize()
-        
+
         self.__hasFocus = False
         # flag storing if this widget or any child has the focus
         self.__autoHide = False
-        
+
         self.__orientation = EricSideBarSide.NORTH
         if orientation is None:
             orientation = EricSideBarSide.NORTH
         self.setOrientation(orientation)
-        
-        self.__iconBar.currentChanged.connect(
-            self.__stackedWidget.setCurrentIndex)
-        self.__iconBar.currentChanged.connect(
-            self.__currentIconChanged)
-        self.__iconBar.currentClicked.connect(
-            self.__currentIconClicked)
-    
+
+        self.__iconBar.currentChanged.connect(self.__stackedWidget.setCurrentIndex)
+        self.__iconBar.currentChanged.connect(self.__currentIconChanged)
+        self.__iconBar.currentClicked.connect(self.__currentIconClicked)
+
     def __shrinkIt(self):
         """
         Private method to shrink the sidebar.
         """
         self.__minimized = True
         self.__bigSize = self.size()
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.__minSize = self.minimumSizeHint().height()
             self.__maxSize = self.maximumHeight()
         else:
             self.__minSize = self.minimumSizeHint().width()
             self.__maxSize = self.maximumWidth()
-        
+
         self.__stackedWidget.hide()
-        
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.setFixedHeight(self.__iconBar.minimumSizeHint().height())
         else:
             self.setFixedWidth(self.__iconBar.minimumSizeHint().width())
-    
+
     def __expandIt(self):
         """
         Private method to expand the sidebar.
@@ -114,9 +111,7 @@
         self.__minimized = False
         self.__stackedWidget.show()
         self.resize(self.__bigSize)
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             minSize = max(self.__minSize, self.minimumSizeHint().height())
             self.setMinimumHeight(minSize)
             self.setMaximumHeight(self.__maxSize)
@@ -124,31 +119,31 @@
             minSize = max(self.__minSize, self.minimumSizeHint().width())
             self.setMinimumWidth(minSize)
             self.setMaximumWidth(self.__maxSize)
-    
+
     def isMinimized(self):
         """
         Public method to check the minimized state.
-        
+
         @return flag indicating the minimized state (boolean)
         """
         return self.__minimized
-    
+
     @pyqtSlot(int)
     def __currentIconChanged(self, index):
         """
         Private slot to handle a change of the current icon.
-        
+
         @param index index of the current icon
         @type int
         """
         if self.isMinimized():
             self.__expandIt()
-    
+
     @pyqtSlot(int)
     def __currentIconClicked(self, index):
         """
         Private slot to handle a click of the current icon.
-        
+
         @param index index of the clicked icon
         @type int
         """
@@ -156,11 +151,11 @@
             self.__expandIt()
         else:
             self.__shrinkIt()
-    
+
     def addTab(self, widget, icon, label=None):
         """
         Public method to add a tab to the sidebar.
-        
+
         @param widget reference to the widget to add
         @type QWidget
         @param icon reference to the icon of the widget
@@ -170,17 +165,15 @@
         """
         self.__iconBar.addIcon(icon, label)
         self.__stackedWidget.addWidget(widget)
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.__minSize = self.minimumSizeHint().height()
         else:
             self.__minSize = self.minimumSizeHint().width()
-    
+
     def insertTab(self, index, widget, icon, label=None):
         """
         Public method to insert a tab into the sidebar.
-        
+
         @param index the index to insert the tab at
         @type int
         @param widget reference to the widget to insert
@@ -191,38 +184,34 @@
         @type str
         """
         self.__iconBar.insertIcon(index, icon, label)
-        
+
         self.__stackedWidget.insertWidget(index, widget)
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.__minSize = self.minimumSizeHint().height()
         else:
             self.__minSize = self.minimumSizeHint().width()
-    
+
     def removeTab(self, index):
         """
         Public method to remove a tab.
-        
+
         @param index the index of the tab to remove
         @type int
         """
         self.__stackedWidget.removeWidget(self.__stackedWidget.widget(index))
         self.__iconBar.removeIcon(index)
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.__minSize = self.minimumSizeHint().height()
         else:
             self.__minSize = self.minimumSizeHint().width()
-    
+
     def clear(self):
         """
         Public method to remove all tabs.
         """
         while self.count() > 0:
             self.removeTab(0)
-    
+
     def prevTab(self):
         """
         Public slot used to show the previous tab.
@@ -230,10 +219,10 @@
         ind = self.currentIndex() - 1
         if ind == -1:
             ind = self.count() - 1
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
-    
+
     def nextTab(self):
         """
         Public slot used to show the next tab.
@@ -241,49 +230,49 @@
         ind = self.currentIndex() + 1
         if ind == self.count():
             ind = 0
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
-    
+
     def count(self):
         """
         Public method to get the number of tabs.
-        
+
         @return number of tabs in the sidebar (integer)
         """
         return self.__iconBar.count()
-    
+
     def currentIndex(self):
         """
         Public method to get the index of the current tab.
-        
+
         @return index of the current tab (integer)
         """
         return self.__stackedWidget.currentIndex()
-    
+
     def setCurrentIndex(self, index):
         """
         Public slot to set the current index.
-        
+
         @param index the index to set as the current index (integer)
         """
         self.__iconBar.setCurrentIndex(index)
         self.__stackedWidget.setCurrentIndex(index)
         if self.isMinimized():
             self.__expandIt()
-    
+
     def currentWidget(self):
         """
         Public method to get a reference to the current widget.
-        
+
         @return reference to the current widget (QWidget)
         """
         return self.__stackedWidget.currentWidget()
-    
+
     def setCurrentWidget(self, widget):
         """
         Public slot to set the current widget.
-        
+
         @param widget reference to the widget to become the current widget
             (QWidget)
         """
@@ -291,25 +280,25 @@
         self.__iconBar.setCurrentIndex(self.__stackedWidget.currentIndex())
         if self.isMinimized():
             self.__expandIt()
-    
+
     def indexOf(self, widget):
         """
         Public method to get the index of the given widget.
-        
+
         @param widget reference to the widget to get the index of (QWidget)
         @return index of the given widget (integer)
         """
         return self.__stackedWidget.indexOf(widget)
-    
+
     def orientation(self):
         """
         Public method to get the orientation of the sidebar.
-        
+
         @return orientation of the sidebar
         @rtype EricSideBarSide
         """
         return self.__orientation
-    
+
     def setOrientation(self, orient):
         """
         Public method to set the orientation of the sidebar.
@@ -330,38 +319,38 @@
             self.__iconBar.setOrientation(Qt.Orientation.Vertical)
             self.layout.setDirection(QBoxLayout.Direction.LeftToRight)
         self.__orientation = orient
-    
+
     def widget(self, index):
         """
         Public method to get a reference to the widget associated with a tab.
-        
+
         @param index index of the tab (integer)
         @return reference to the widget (QWidget)
         """
         return self.__stackedWidget.widget(index)
-    
+
     def setIconBarColor(self, color):
         """
         Public method to set the icon bar color.
-        
+
         @param color icon bar color
         @type QColor
         """
         self.__iconBar.setColor(color)
-    
+
     def iconBarColor(self):
         """
         Public method to get the icon bar color.
-        
+
         @return icon bar color
         @rtype QColor
         """
         return self.__iconBar.color()
-    
+
     def setIconBarSize(self, barSize):
         """
         Public method to set the icon bar size.
-        
+
         @param barSize size category for the bar (one of 'xs', 'sm', 'md',
             'lg', 'xl', 'xxl')
         @type str
@@ -371,33 +360,31 @@
             self.__shrinkIt()
         else:
             self.__expandIt()
-    
+
     def barSize(self):
         """
         Public method to get the icon bar size.
-        
+
         @return barSize size category for the bar (one of 'xs', 'sm', 'md',
             'lg', 'xl', 'xxl')
         @rtype str
         """
         return self.__iconBar.barSize()
-    
+
     def saveState(self):
         """
         Public method to save the state of the sidebar.
-        
+
         @return saved state as a byte array (QByteArray)
         """
         self.__bigSize = self.size()
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             self.__minSize = self.minimumSizeHint().height()
             self.__maxSize = self.maximumHeight()
         else:
             self.__minSize = self.minimumSizeHint().width()
             self.__maxSize = self.maximumWidth()
-        
+
         dataDict = {
             "version": self.Version,
             "minimized": self.__minimized,
@@ -406,47 +393,45 @@
             "max_size": self.__maxSize,
         }
         data = json.dumps(dataDict)
-        
+
         return data
-    
+
     def restoreState(self, state):
         """
         Public method to restore the state of the sidebar.
-        
+
         @param state byte array containing the saved state (QByteArray)
         @return flag indicating success (boolean)
         """
         if not isinstance(state, str) or state == "":
             return False
-        
+
         try:
             stateDict = json.loads(state)
         except json.JSONDecodeError:
             return False
-        
+
         if not stateDict:
             return False
-        
-        if self.__orientation in (
-            EricSideBarSide.NORTH, EricSideBarSide.SOUTH
-        ):
+
+        if self.__orientation in (EricSideBarSide.NORTH, EricSideBarSide.SOUTH):
             minSize = self.layout.minimumSize().height()
             maxSize = self.maximumHeight()
         else:
             minSize = self.layout.minimumSize().width()
             maxSize = self.maximumWidth()
-        
+
         if stateDict["version"] in (2, 3, 4):
             if stateDict["minimized"] and not self.__minimized:
                 self.__shrinkIt()
-            
+
             self.__bigSize = QSize(*stateDict["big_size"])
             self.__minSize = max(stateDict["min_size"], minSize)
             self.__maxSize = max(stateDict["max_size"], maxSize)
-            
+
             if not stateDict["minimized"]:
                 self.__expandIt()
-            
+
             return True
-        
+
         return False
--- a/src/eric7/EricWidgets/EricSimpleHelpDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricSimpleHelpDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to show some help text.
     """
+
     def __init__(self, title="", label="", helpStr="", parent=None):
         """
         Constructor
-        
+
         @param title title of the window
         @type str
         @param label label for the help
@@ -33,7 +34,7 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.setWindowTitle(title)
         if label:
             self.helpLabel.setText(label)
--- a/src/eric7/EricWidgets/EricSingleApplication.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricSingleApplication.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 
 from EricWidgets.EricApplication import ericApp
 
-from Toolbox.SingleApplication import (
-    SingleApplicationClient, SingleApplicationServer
-)
+from Toolbox.SingleApplication import SingleApplicationClient, SingleApplicationServer
 
 import Utilities
 
@@ -24,16 +22,17 @@
 SAFile = "eric7"
 
 # define the protocol tokens
-SAOpenFile = 'OpenFile'
-SAOpenProject = 'OpenProject'
-SAOpenMultiProject = 'OpenMultiProject'
-SAArguments = 'Arguments'
+SAOpenFile = "OpenFile"
+SAOpenProject = "OpenProject"
+SAOpenMultiProject = "OpenMultiProject"
+SAArguments = "Arguments"
 
 
 class EricSingleApplicationServer(SingleApplicationServer):
     """
     Class implementing the single application server embedded within the IDE.
     """
+
     def __init__(self):
         """
         Constructor
@@ -43,7 +42,7 @@
     def handleCommand(self, command, arguments):
         """
         Public slot to handle the command sent by the client.
-        
+
         @param command command sent by the client
         @type str
         @param arguments list of command arguments
@@ -68,31 +67,31 @@
     def __saOpenFile(self, fname):
         """
         Private method used to handle the "Open File" command.
-        
+
         @param fname filename to be opened (string)
         """
         ericApp().getObject("ViewManager").openSourceFile(fname)
-        
+
     def __saOpenProject(self, pfname):
         """
         Private method used to handle the "Open Project" command.
-        
+
         @param pfname filename of the project to be opened (string)
         """
         ericApp().getObject("Project").openProject(pfname)
-        
+
     def __saOpenMultiProject(self, pfname):
         """
         Private method used to handle the "Open Multi-Project" command.
-        
+
         @param pfname filename of the multi project to be opened (string)
         """
         ericApp().getObject("MultiProject").openMultiProject(pfname)
-        
+
     def __saArguments(self, argsStr):
         """
         Private method used to handle the "Arguments" command.
-        
+
         @param argsStr space delimited list of command args(string)
         """
         ericApp().getObject("DebugUI").setArgvHistory(argsStr)
@@ -102,85 +101,86 @@
     """
     Class implementing the single application client of the IDE.
     """
+
     def __init__(self):
         """
         Constructor
         """
         SingleApplicationClient.__init__(self, SAFile)
-        
+
     def processArgs(self, args):
         """
         Public method to process the command line args passed to the UI.
-        
+
         @param args list of files to open
         """
         # no args, return
         if args is None:
             return
-        
+
         # holds space delimited list of command args, if any
         argsStr = None
         # flag indicating '--' options was found
         ddseen = False
-        
-        argChars = ['-', '/'] if Utilities.isWindowsPlatform() else ['-']
-        
+
+        argChars = ["-", "/"] if Utilities.isWindowsPlatform() else ["-"]
+
         for arg in args:
-            if arg == '--' and not ddseen:
+            if arg == "--" and not ddseen:
                 ddseen = True
                 continue
-                
+
             if arg[0] in argChars or ddseen:
                 if argsStr is None:
                     argsStr = arg
                 else:
                     argsStr = "{0} {1}".format(argsStr, arg)
                 continue
-            
+
             ext = os.path.splitext(arg)[1]
             ext = os.path.normcase(ext)
-            
-            if ext in ('.epj', '.e4p'):
+
+            if ext in (".epj", ".e4p"):
                 self.__openProject(arg)
-            elif ext in ('.emj', '.e4m', '.e5m'):
+            elif ext in (".emj", ".e4m", ".e5m"):
                 self.__openMultiProject(arg)
             else:
                 self.__openFile(arg)
-        
+
         # send any args we had
         if argsStr is not None:
             self.__sendArguments(argsStr)
-        
+
         self.disconnect()
-        
+
     def __openFile(self, fname):
         """
         Private method to open a file in the application server.
-        
+
         @param fname name of file to be opened (string)
         """
         self.sendCommand(SAOpenFile, [os.path.abspath(fname)])
-        
+
     def __openProject(self, pfname):
         """
         Private method to open a project in the application server.
-        
+
         @param pfname name of the projectfile to be opened (string)
         """
         self.sendCommand(SAOpenProject, [os.path.abspath(pfname)])
-        
+
     def __openMultiProject(self, pfname):
         """
         Private method to open a project in the application server.
-        
+
         @param pfname name of the projectfile to be opened (string)
         """
         self.sendCommand(SAOpenMultiProject, [os.path.abspath(pfname)])
-        
+
     def __sendArguments(self, argsStr):
         """
         Private method to set the command arguments in the application server.
-        
+
         @param argsStr space delimited list of command args (string)
         """
         self.sendCommand(SAArguments, [argsStr])
--- a/src/eric7/EricWidgets/EricSpellCheckedTextEdit.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricSpellCheckedTextEdit.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,32 +15,39 @@
     import enchant.tokenize
     from enchant.errors import TokenizerNotFoundError, DictNotFoundError
     from enchant.utils import trim_suggestions
+
     ENCHANT_AVAILABLE = True
 except ImportError:
     ENCHANT_AVAILABLE = False
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication
 from PyQt6.QtGui import (
-    QAction, QActionGroup, QSyntaxHighlighter, QTextBlockUserData,
-    QTextCharFormat, QTextCursor
+    QAction,
+    QActionGroup,
+    QSyntaxHighlighter,
+    QTextBlockUserData,
+    QTextCharFormat,
+    QTextCursor,
 )
 from PyQt6.QtWidgets import QMenu, QTextEdit, QPlainTextEdit
 
 if ENCHANT_AVAILABLE:
-    class SpellCheckMixin():
+
+    class SpellCheckMixin:
         """
         Class implementing the spell-check mixin for the widget classes.
         """
+
         # don't show more than this to keep the menu manageable
         MaxSuggestions = 20
-        
+
         # default language to be used when no other is set
         DefaultLanguage = None
-        
+
         # default user lists
         DefaultUserWordList = None
         DefaultUserExceptionList = None
-        
+
         def __init__(self):
             """
             Constructor
@@ -52,7 +59,7 @@
                 spellDict = enchant.DictWithPWL(
                     SpellCheckMixin.DefaultLanguage,
                     SpellCheckMixin.DefaultUserWordList,
-                    SpellCheckMixin.DefaultUserExceptionList
+                    SpellCheckMixin.DefaultUserExceptionList,
                 )
             except DictNotFoundError:
                 try:
@@ -61,59 +68,60 @@
                     spellDict = enchant.DictWithPWL(
                         "en",
                         SpellCheckMixin.DefaultUserWordList,
-                        SpellCheckMixin.DefaultUserExceptionList
+                        SpellCheckMixin.DefaultUserExceptionList,
                     )
                 except DictNotFoundError:
                     # Still no dictionary could be found. Forget about spell
                     # checking.
                     spellDict = None
-            
+
             self.__highlighter.setDict(spellDict)
-        
+
         def contextMenuEvent(self, evt):
             """
             Protected method to handle context menu events to add a spelling
             suggestions submenu.
-            
+
             @param evt reference to the context menu event
             @type QContextMenuEvent
             """
             menu = self.__createSpellcheckContextMenu(evt.pos())
             menu.exec(evt.globalPos())
-        
+
         def __createSpellcheckContextMenu(self, pos):
             """
             Private method to create the spell-check context menu.
-            
+
             @param pos position of the mouse pointer
             @type QPoint
             @return context menu with additional spell-check entries
             @rtype QMenu
             """
             menu = self.createStandardContextMenu(pos)
-            
+
             # Add a submenu for setting the spell-check language and
             # document format.
             menu.addSeparator()
             self.__addRemoveEntry(self.__cursorForPosition(pos), menu)
             menu.addMenu(self.__createLanguagesMenu(menu))
             menu.addMenu(self.__createFormatsMenu(menu))
-            
+
             # Try to retrieve a menu of corrections for the right-clicked word
             spellMenu = self.__createCorrectionsMenu(
-                self.__cursorForMisspelling(pos), menu)
-            
+                self.__cursorForMisspelling(pos), menu
+            )
+
             if spellMenu:
                 menu.insertSeparator(menu.actions()[0])
                 menu.insertMenu(menu.actions()[0], spellMenu)
-            
+
             return menu
-        
+
         def __createCorrectionsMenu(self, cursor, parent=None):
             """
             Private method to create a menu for corrections of the selected
             word.
-            
+
             @param cursor reference to the text cursor
             @type QTextCursor
             @param parent reference to the parent widget (defaults to None)
@@ -123,36 +131,39 @@
             """
             if cursor is None:
                 return None
-            
+
             text = cursor.selectedText()
             suggestions = trim_suggestions(
-                text, self.__highlighter.dict().suggest(text),
-                SpellCheckMixin.MaxSuggestions)
-            
+                text,
+                self.__highlighter.dict().suggest(text),
+                SpellCheckMixin.MaxSuggestions,
+            )
+
             spellMenu = QMenu(
-                QCoreApplication.translate("SpellCheckMixin",
-                                           "Spelling Suggestions"),
-                parent)
+                QCoreApplication.translate("SpellCheckMixin", "Spelling Suggestions"),
+                parent,
+            )
             for word in suggestions:
                 act = spellMenu.addAction(word)
                 act.setData((cursor, word))
-            
+
             if suggestions:
                 spellMenu.addSeparator()
-            
+
             # add management entry
-            act = spellMenu.addAction(QCoreApplication.translate(
-                "SpellCheckMixin", "Add to Dictionary"))
+            act = spellMenu.addAction(
+                QCoreApplication.translate("SpellCheckMixin", "Add to Dictionary")
+            )
             act.setData((cursor, text, "add"))
-            
+
             spellMenu.triggered.connect(self.__spellMenuTriggered)
             return spellMenu
-        
+
         def __addRemoveEntry(self, cursor, menu):
             """
             Private method to create a menu entry to remove the word at the
             menu position.
-            
+
             @param cursor reference to the text cursor for the misspelled word
             @type QTextCursor
             @param menu reference to the context menu
@@ -160,18 +171,20 @@
             """
             if cursor is None:
                 return
-            
+
             text = cursor.selectedText()
-            menu.addAction(QCoreApplication.translate(
-                "SpellCheckMixin",
-                "Remove '{0}' from Dictionary").format(text),
-                lambda: self.__addToUserDict(text, "remove"))
-        
+            menu.addAction(
+                QCoreApplication.translate(
+                    "SpellCheckMixin", "Remove '{0}' from Dictionary"
+                ).format(text),
+                lambda: self.__addToUserDict(text, "remove"),
+            )
+
         def __createLanguagesMenu(self, parent=None):
             """
             Private method to create a menu for selecting the spell-check
             language.
-            
+
             @param parent reference to the parent widget (defaults to None)
             @type QWidget (optional)
             @return menu with spell-check languages
@@ -179,55 +192,56 @@
             """
             curLanguage = self.__highlighter.dict().tag.lower()
             languageMenu = QMenu(
-                QCoreApplication.translate("SpellCheckMixin", "Language"),
-                parent)
+                QCoreApplication.translate("SpellCheckMixin", "Language"), parent
+            )
             languageActions = QActionGroup(languageMenu)
-            
+
             for language in sorted(enchant.list_languages()):
                 act = QAction(language, languageActions)
                 act.setCheckable(True)
                 act.setChecked(language.lower() == curLanguage)
                 act.setData(language)
                 languageMenu.addAction(act)
-            
+
             languageMenu.triggered.connect(self.__setLanguage)
             return languageMenu
-        
+
         def __createFormatsMenu(self, parent=None):
             """
             Private method to create a menu for selecting the document format.
-            
+
             @param parent reference to the parent widget (defaults to None)
             @type QWidget (optional)
             @return menu with document formats
             @rtype QMenu
             """
             formatMenu = QMenu(
-                QCoreApplication.translate("SpellCheckMixin", "Format"),
-                parent)
+                QCoreApplication.translate("SpellCheckMixin", "Format"), parent
+            )
             formatActions = QActionGroup(formatMenu)
-            
+
             curFormat = self.__highlighter.chunkers()
             for name, chunkers in (
-                (QCoreApplication.translate("SpellCheckMixin", "Text"),
-                 []),
-                (QCoreApplication.translate("SpellCheckMixin", "HTML"),
-                 [enchant.tokenize.HTMLChunker])
+                (QCoreApplication.translate("SpellCheckMixin", "Text"), []),
+                (
+                    QCoreApplication.translate("SpellCheckMixin", "HTML"),
+                    [enchant.tokenize.HTMLChunker],
+                ),
             ):
                 act = QAction(name, formatActions)
                 act.setCheckable(True)
                 act.setChecked(chunkers == curFormat)
                 act.setData(chunkers)
                 formatMenu.addAction(act)
-            
+
             formatMenu.triggered.connect(self.__setFormat)
             return formatMenu
-        
+
         def __cursorForPosition(self, pos):
             """
             Private method to create a text cursor selecting the word at the
             given position.
-            
+
             @param pos position of the misspelled word
             @type QPoint
             @return text cursor for the word
@@ -235,46 +249,47 @@
             """
             cursor = self.cursorForPosition(pos)
             cursor.select(QTextCursor.SelectionType.WordUnderCursor)
-            
+
             if cursor.hasSelection():
                 return cursor
             else:
                 return None
-        
+
         def __cursorForMisspelling(self, pos):
             """
             Private method to create a text cursor selecting the misspelled
             word.
-            
+
             @param pos position of the misspelled word
             @type QPoint
             @return text cursor for the misspelled word
             @rtype QTextCursor
             """
             cursor = self.cursorForPosition(pos)
-            misspelledWords = getattr(cursor.block().userData(),
-                                      "misspelled", [])
-            
+            misspelledWords = getattr(cursor.block().userData(), "misspelled", [])
+
             # If the cursor is within a misspelling, select the word
             for (start, end) in misspelledWords:
                 if start <= cursor.positionInBlock() <= end:
                     blockPosition = cursor.block().position()
-                    
-                    cursor.setPosition(blockPosition + start,
-                                       QTextCursor.MoveMode.MoveAnchor)
-                    cursor.setPosition(blockPosition + end,
-                                       QTextCursor.MoveMode.KeepAnchor)
+
+                    cursor.setPosition(
+                        blockPosition + start, QTextCursor.MoveMode.MoveAnchor
+                    )
+                    cursor.setPosition(
+                        blockPosition + end, QTextCursor.MoveMode.KeepAnchor
+                    )
                     break
-            
+
             if cursor.hasSelection():
                 return cursor
             else:
                 return None
-        
+
         def __correctWord(self, cursor, word):
             """
             Private method to replace some misspelled text.
-            
+
             @param cursor reference to the text cursor for the misspelled word
             @type QTextCursor
             @param word replacement text
@@ -284,11 +299,11 @@
             cursor.removeSelectedText()
             cursor.insertText(word)
             cursor.endEditBlock()
-        
+
         def __addToUserDict(self, word, command):
             """
             Private method to add a word to the user word or exclude list.
-            
+
             @param word text to be added
             @type str
             @param command command indicating the user dictionary type
@@ -300,14 +315,14 @@
                     dictionary.add(word)
                 elif command == "remove":
                     dictionary.remove(word)
-                
+
                 self.__highlighter.rehighlight()
-        
+
         @pyqtSlot(QAction)
         def __spellMenuTriggered(self, act):
             """
             Private slot to handle a selection of the spell menu.
-            
+
             @param act reference to the selected action
             @type QAction
             """
@@ -315,94 +330,84 @@
             if len(data) == 2:
                 # replace the misspelled word
                 self.__correctWord(*data)
-            
+
             elif len(data) == 3:
                 # dictionary management action
                 _, word, command = data
                 self.__addToUserDict(word, command)
-        
+
         @pyqtSlot(QAction)
         def __setLanguage(self, act):
             """
             Private slot to set the selected language.
-            
+
             @param act reference to the selected action
             @type QAction
             """
             language = act.data()
             self.setLanguage(language)
-        
+
         @pyqtSlot(QAction)
         def __setFormat(self, act):
             """
             Private slot to set the selected document format.
-            
+
             @param act reference to the selected action
             @type QAction
             """
             chunkers = act.data()
             self.__highlighter.setChunkers(chunkers)
-        
+
         def setFormat(self, formatName):
             """
             Public method to set the document format.
-            
+
             @param formatName name of the document format
             @type str
             """
             self.__highlighter.setChunkers(
-                [enchant.tokenize.HTMLChunker]
-                if format == "html" else
-                []
+                [enchant.tokenize.HTMLChunker] if format == "html" else []
             )
-        
+
         def dict(self):
             """
             Public method to get a reference to the dictionary in use.
-            
+
             @return reference to the current dictionary
             @rtype enchant.Dict
             """
             return self.__highlighter.dict()
-        
+
         def setDict(self, spellDict):
             """
             Public method to set the dictionary to be used.
-            
+
             @param spellDict reference to the spell-check dictionary
             @type emchant.Dict
             """
             self.__highlighter.setDict(spellDict)
-        
+
         @pyqtSlot(str)
         def setLanguage(self, language):
             """
             Public slot to set the spellchecker language.
-            
+
             @param language language to be set
             @type str
             """
             epwl = self.dict().pwl
-            pwl = (
-                epwl.provider.file
-                if isinstance(epwl, enchant.Dict) else
-                None
-            )
-            
+            pwl = epwl.provider.file if isinstance(epwl, enchant.Dict) else None
+
             epel = self.dict().pel
-            pel = (
-                epel.provider.file
-                if isinstance(epel, enchant.Dict) else
-                None
-            )
+            pel = epel.provider.file if isinstance(epel, enchant.Dict) else None
             self.setLanguageWithPWL(language, pwl, pel)
-        
+
         @pyqtSlot(str, str, str)
         def setLanguageWithPWL(self, language, pwl, pel):
             """
             Public slot to set the spellchecker language and associated user
             word lists.
-            
+
             @param language language to be set
             @type str
             @param pwl file name of the personal word list
@@ -422,12 +427,12 @@
                     # checking.
                     spellDict = None
             self.__highlighter.setDict(spellDict)
-        
+
         @classmethod
         def setDefaultLanguage(cls, language, pwl=None, pel=None):
             """
             Class method to set the default spell-check language.
-            
+
             @param language language to be set as default
             @type str
             @param pwl file name of the personal word list
@@ -438,7 +443,7 @@
             with contextlib.suppress(DictNotFoundError):
                 cls.DefaultUserWordList = pwl
                 cls.DefaultUserExceptionList = pel
-                
+
                 # set default language only, if a dictionary is available
                 enchant.Dict(language)
                 cls.DefaultLanguage = language
@@ -448,60 +453,61 @@
         Class implementing a QSyntaxHighlighter subclass that consults a
         pyEnchant dictionary to highlight misspelled words.
         """
-        TokenFilters = (enchant.tokenize.EmailFilter,
-                        enchant.tokenize.URLFilter)
+
+        TokenFilters = (enchant.tokenize.EmailFilter, enchant.tokenize.URLFilter)
 
         # Define the spell-check style once and just assign it as necessary
         ErrorFormat = QTextCharFormat()
         ErrorFormat.setUnderlineColor(Qt.GlobalColor.red)
         ErrorFormat.setUnderlineStyle(
-            QTextCharFormat.UnderlineStyle.SpellCheckUnderline)
-        
+            QTextCharFormat.UnderlineStyle.SpellCheckUnderline
+        )
+
         def __init__(self, *args):
             """
             Constructor
-            
+
             @param *args list of arguments for the QSyntaxHighlighter
             @type list
             """
             QSyntaxHighlighter.__init__(self, *args)
-            
+
             self.__spellDict = None
             self.__tokenizer = None
             self.__chunkers = []
-        
+
         def chunkers(self):
             """
             Public method to get the chunkers in use.
-            
+
             @return list of chunkers in use
             @rtype list
             """
             return self.__chunkers
-        
+
         def setChunkers(self, chunkers):
             """
             Public method to set the chunkers to be used.
-            
+
             @param chunkers chunkers to be used
             @type list
             """
             self.__chunkers = chunkers
             self.setDict(self.dict())
-        
+
         def dict(self):
             """
             Public method to get the spelling dictionary in use.
-            
+
             @return spelling dictionary
             @rtype enchant.Dict
             """
             return self.__spellDict
-        
+
         def setDict(self, spellDict):
             """
             Public method to set the spelling dictionary to be used.
-            
+
             @param spellDict spelling dictionary
             @type enchant.Dict
             """
@@ -510,39 +516,40 @@
                     self.__tokenizer = enchant.tokenize.get_tokenizer(
                         spellDict.tag,
                         chunkers=self.__chunkers,
-                        filters=EnchantHighlighter.TokenFilters)
+                        filters=EnchantHighlighter.TokenFilters,
+                    )
                 except TokenizerNotFoundError:
                     # Fall back to the "good for most euro languages"
                     # English tokenizer
                     self.__tokenizer = enchant.tokenize.get_tokenizer(
                         chunkers=self.__chunkers,
-                        filters=EnchantHighlighter.TokenFilters)
+                        filters=EnchantHighlighter.TokenFilters,
+                    )
             else:
                 self.__tokenizer = None
-            
+
             self.__spellDict = spellDict
-            
+
             self.rehighlight()
-        
+
         def highlightBlock(self, text):
             """
             Public method to apply the text highlight.
-            
+
             @param text text to be spell-checked
             @type str
             """
             """Overridden QSyntaxHighlighter method to apply the highlight"""
             if self.__spellDict is None or self.__tokenizer is None:
                 return
-            
+
             # Build a list of all misspelled words and highlight them
             misspellings = []
             for (word, pos) in self.__tokenizer(text):
                 if not self.__spellDict.check(word):
-                    self.setFormat(pos, len(word),
-                                   EnchantHighlighter.ErrorFormat)
+                    self.setFormat(pos, len(word), EnchantHighlighter.ErrorFormat)
                     misspellings.append((pos, pos + len(word)))
-            
+
             # Store the list so the context menu can reuse this tokenization
             # pass (Block-relative values so editing other blocks won't
             # invalidate them)
@@ -552,10 +559,11 @@
 
 else:
 
-    class SpellCheckMixin():
+    class SpellCheckMixin:
         """
         Class implementing the spell-check mixin for the widget classes.
         """
+
         #
         # This is just a stub to provide the same API as the enchant enabled
         # one.
@@ -565,50 +573,50 @@
             Constructor
             """
             pass
-        
+
         def setFormat(self, formatName):
             """
             Public method to set the document format.
-            
+
             @param formatName name of the document format
             @type str
             """
             pass
-        
+
         def dict(self):
             """
             Public method to get a reference to the dictionary in use.
-            
+
             @return reference to the current dictionary
             @rtype enchant.Dict
             """
             pass
-        
+
         def setDict(self, spellDict):
             """
             Public method to set the dictionary to be used.
-            
+
             @param spellDict reference to the spell-check dictionary
             @type emchant.Dict
             """
             pass
-        
+
         @pyqtSlot(str)
         def setLanguage(self, language):
             """
             Public slot to set the spellchecker language.
-            
+
             @param language language to be set
             @type str
             """
             pass
-        
+
         @pyqtSlot(str, str, str)
         def setLanguageWithPWL(self, language, pwl, pel):
             """
             Public slot to set the spellchecker language and associated user
             word lists.
-            
+
             @param language language to be set
             @type str
             @param pwl file name of the personal word list
@@ -617,12 +625,12 @@
             @type str
             """
             pass
-        
+
         @classmethod
         def setDefaultLanguage(cls, language, pwl=None, pel=None):
             """
             Class method to set the default spell-check language.
-            
+
             @param language language to be set as default
             @type str
             @param pwl file name of the personal word list
@@ -637,10 +645,11 @@
     """
     Class implementing a QPlainTextEdit with built-in spell checker.
     """
+
     def __init__(self, *args):
         """
         Constructor
-        
+
         @param *args list of arguments for the QPlainTextEdit constructor.
         @type list
         """
@@ -652,43 +661,45 @@
     """
     Class implementing a QTextEdit with built-in spell checker.
     """
+
     def __init__(self, *args):
         """
         Constructor
-        
+
         @param *args list of arguments for the QPlainTextEdit constructor.
         @type list
         """
         QTextEdit.__init__(self, *args)
         SpellCheckMixin.__init__(self)
-        
+
         self.setFormat("html")
-    
+
     def setAcceptRichText(self, accept):
         """
         Public method to set the text edit mode.
-        
+
         @param accept flag indicating to accept rich text
         @type bool
         """
         QTextEdit.setAcceptRichText(self, accept)
         self.setFormat("html" if accept else "text")
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     import sys
     import os
     from PyQt6.QtWidgets import QApplication
-    
+
     if ENCHANT_AVAILABLE:
         dictPath = os.path.expanduser(os.path.join("~", ".eric7", "spelling"))
         SpellCheckMixin.setDefaultLanguage(
             "en_US",
             os.path.join(dictPath, "pwl.dic"),
-            os.path.join(dictPath, "pel.dic")
+            os.path.join(dictPath, "pel.dic"),
         )
-    
+
     app = QApplication(sys.argv)
     spellEdit = EricSpellCheckedPlainTextEdit()
     spellEdit.show()
-    
+
     sys.exit(app.exec())
--- a/src/eric7/EricWidgets/EricSqueezeLabels.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricSqueezeLabels.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,21 +18,22 @@
     """
     Class implementing a label that squeezes its contents to fit its size.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent Widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.__text = ''
-        self.__elided = ''
-    
+
+        self.__text = ""
+        self.__elided = ""
+
     def paintEvent(self, event):
         """
         Protected method called when some painting is required.
-        
+
         @param event reference to the paint event (QPaintEvent)
         """
         fm = self.fontMetrics()
@@ -42,16 +43,17 @@
             pixelLength = fm.width(self.__text)
         if pixelLength > self.contentsRect().width():
             self.__elided = fm.elidedText(
-                self.text(), Qt.TextElideMode.ElideMiddle, self.width())
+                self.text(), Qt.TextElideMode.ElideMiddle, self.width()
+            )
             super().setText(self.__elided)
         else:
             super().setText(self.__text)
         super().paintEvent(event)
-    
+
     def setText(self, txt):
         """
         Public method to set the label's text.
-        
+
         @param txt the text to be shown (string)
         """
         self.__text = txt
@@ -62,72 +64,69 @@
     """
     Class implementing a label showing a file path compacted to fit its size.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent Widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.__path = ''
+
+        self.__path = ""
         self.__surrounding = "{0}"
-    
+
     def setSurrounding(self, surrounding):
         """
         Public method to set the surrounding of the path string.
-        
+
         @param surrounding the a string containg placeholders for the path
             (string)
         """
         self.__surrounding = surrounding
-        super().setText(
-            self.__surrounding.format(self.__path))
-    
+        super().setText(self.__surrounding.format(self.__path))
+
     def setPath(self, path):
         """
         Public method to set the path of the label.
-        
+
         @param path path to be shown (string)
         """
         self.__path = path
-        super().setText(
-            self.__surrounding.format(self.__path))
-    
+        super().setText(self.__surrounding.format(self.__path))
+
     def setTextPath(self, surrounding, path):
         """
         Public method to set the surrounding and the path of the label.
-        
+
         @param surrounding the a string containg placeholders for the path
             (string)
         @param path path to be shown (string)
         """
         self.__surrounding = surrounding
         self.__path = path
-        super().setText(
-            self.__surrounding.format(self.__path))
-    
+        super().setText(self.__surrounding.format(self.__path))
+
     def paintEvent(self, event):
         """
         Protected method called when some painting is required.
-        
+
         @param event reference to the paint event (QPaintEvent)
         """
         if self.length(self.__path) > self.contentsRect().width():
             super().setText(
-                self.__surrounding.format(compactPath(self.__path,
-                                          self.contentsRect().width(),
-                                          self.length))
+                self.__surrounding.format(
+                    compactPath(self.__path, self.contentsRect().width(), self.length)
+                )
             )
         else:
-            super().setText(
-                self.__surrounding.format(self.__path))
+            super().setText(self.__surrounding.format(self.__path))
         super().paintEvent(event)
-    
+
     def length(self, txt):
         """
         Public method to return the length of a text in pixels.
-        
+
         @param txt text to calculate the length for after wrapped (string)
         @return length of the wrapped text in pixels (integer)
         """
--- a/src/eric7/EricWidgets/EricStringListEditWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricStringListEditWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,7 +8,11 @@
 """
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, Qt, QSortFilterProxyModel, QStringListModel
+    pyqtSlot,
+    pyqtSignal,
+    Qt,
+    QSortFilterProxyModel,
+    QStringListModel,
 )
 from PyQt6.QtWidgets import QWidget, QInputDialog, QLineEdit
 
@@ -18,80 +22,79 @@
 class EricStringListEditWidget(QWidget, Ui_EricStringListEditWidget):
     """
     Class implementing a dialog to edit a list of strings.
-    
+
     @signal setToDefault() emitted to request the default list of values
     """
+
     setToDefault = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__model = QStringListModel(self)
         self.__proxyModel = QSortFilterProxyModel(self)
-        self.__proxyModel.setFilterCaseSensitivity(
-            Qt.CaseSensitivity.CaseInsensitive)
+        self.__proxyModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
         self.__proxyModel.setSourceModel(self.__model)
         self.stringList.setModel(self.__proxyModel)
-        
+
         self.defaultButton.hide()
-        
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
-        
+
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
+
         self.removeButton.clicked.connect(self.stringList.removeSelected)
         self.removeAllButton.clicked.connect(self.stringList.removeAll)
         self.defaultButton.clicked.connect(self.setToDefault)
-    
+
     def setList(self, stringList):
         """
         Public method to set the list of strings to be edited.
-        
+
         @param stringList list of strings to be edited (list of string)
         """
         self.__model.setStringList(stringList)
         self.__model.sort(0)
-    
+
     def getList(self):
         """
         Public method to get the edited list of strings.
-        
+
         @return edited list of string (list of string)
         """
         return self.__model.stringList()[:]
-    
+
     def setListWhatsThis(self, txt):
         """
         Public method to set a what's that help text for the string list.
-        
+
         @param txt help text to be set (string)
         """
         self.stringList.setWhatsThis(txt)
-    
+
     def setDefaultVisible(self, visible):
         """
         Public method to show or hide the default button.
-        
+
         @param visible flag indicating the visibility of the default button
         @type bool
         """
         self.defaultButton.setVisible(visible)
-    
+
     def setAddVisible(self, visible):
         """
         Public method to show or hide the add button.
-        
+
         @param visible flag indicating the visibility of the add button
         @type bool
         """
         self.addButton.setVisible(visible)
         self.addLine.setVisible(visible)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -101,9 +104,9 @@
             self,
             self.tr("Add Entry"),
             self.tr("Enter the entry to add to the list:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and entry != "" and entry not in self.__model.stringList():
             self.__model.insertRow(self.__model.rowCount())
-            self.__model.setData(
-                self.__model.index(self.__model.rowCount() - 1), entry)
+            self.__model.setData(self.__model.index(self.__model.rowCount() - 1), entry)
             self.__model.sort(0)
--- a/src/eric7/EricWidgets/EricTabWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTabWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,19 +21,20 @@
     Class implementing a tab bar class substituting QTabBar to support wheel
     events.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self._tabWidget = parent
-    
+
     def wheelEvent(self, event):
         """
         Protected slot to support wheel events.
-        
+
         @param event reference to the wheel event (QWheelEvent)
         """
         with contextlib.suppress(AttributeError):
@@ -42,50 +43,51 @@
                 self._tabWidget.prevTab()
             elif delta < 0:
                 self._tabWidget.nextTab()
-            
+
             event.accept()
 
 
 class EricDnDTabBar(EricWheelTabBar):
     """
     Class implementing a tab bar class substituting QTabBar.
-    
+
     @signal tabMoveRequested(int, int) emitted to signal a tab move request
         giving the old and new index position
     """
+
     tabMoveRequested = pyqtSignal(int, int)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         EricWheelTabBar.__init__(self, parent)
         self.setAcceptDrops(True)
-        
+
         self.__dragStartPos = QPoint()
-    
+
     def mousePressEvent(self, event):
         """
         Protected method to handle mouse press events.
-        
+
         @param event reference to the mouse press event (QMouseEvent)
         """
         if event.button() == Qt.MouseButton.LeftButton:
             self.__dragStartPos = QPoint(event.position().toPoint())
         EricWheelTabBar.mousePressEvent(self, event)
-    
+
     def mouseMoveEvent(self, event):
         """
         Protected method to handle mouse move events.
-        
+
         @param event reference to the mouse move event (QMouseEvent)
         """
         if (
-            event.buttons() == Qt.MouseButton.LeftButton and
-            (event.position().toPoint() - self.__dragStartPos)
-            .manhattanLength() > QApplication.startDragDistance()
+            event.buttons() == Qt.MouseButton.LeftButton
+            and (event.position().toPoint() - self.__dragStartPos).manhattanLength()
+            > QApplication.startDragDistance()
         ):
             drag = QDrag(self)
             mimeData = QMimeData()
@@ -96,28 +98,28 @@
             drag.setMimeData(mimeData)
             drag.exec()
         EricWheelTabBar.mouseMoveEvent(self, event)
-    
+
     def dragEnterEvent(self, event):
         """
         Protected method to handle drag enter events.
-        
+
         @param event reference to the drag enter event (QDragEnterEvent)
         """
         mimeData = event.mimeData()
         formats = mimeData.formats()
         if (
-            "action" in formats and
-            mimeData.data("action") == b"tab-reordering" and
-            "tabbar-id" in formats and
-            int(mimeData.data("tabbar-id")) == id(self)
+            "action" in formats
+            and mimeData.data("action") == b"tab-reordering"
+            and "tabbar-id" in formats
+            and int(mimeData.data("tabbar-id")) == id(self)
         ):
             event.acceptProposedAction()
         EricWheelTabBar.dragEnterEvent(self, event)
-    
+
     def dropEvent(self, event):
         """
         Protected method to handle drop events.
-        
+
         @param event reference to the drop event (QDropEvent)
         """
         fromIndex = self.tabAt(self.__dragStartPos)
@@ -131,26 +133,27 @@
 class EricTabWidget(QTabWidget):
     """
     Class implementing a tab widget class substituting QTabWidget.
-    
+
     It provides slots to show the previous and next tab and give
     them the input focus and it allows to have a context menu for the tabs.
-    
+
     @signal customTabContextMenuRequested(const QPoint & point, int index)
         emitted when a context menu for a tab is requested
     """
+
     customTabContextMenuRequested = pyqtSignal(QPoint, int)
-    
+
     def __init__(self, parent=None, dnd=False):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         @param dnd flag indicating the support for Drag & Drop (boolean)
         """
         super().__init__(parent)
-        
+
         if dnd:
-            if not hasattr(self, 'setMovable'):
+            if not hasattr(self, "setMovable"):
                 self.__tabBar = EricDnDTabBar(self)
                 self.__tabBar.tabMoveRequested.connect(self.moveTab)
                 self.setTabBar(self.__tabBar)
@@ -161,15 +164,15 @@
         else:
             self.__tabBar = EricWheelTabBar(self)
             self.setTabBar(self.__tabBar)
-        
+
         self.__lastCurrentIndex = -1
         self.__currentIndex = -1
         self.currentChanged.connect(self.__currentChanged)
-    
+
     def setCustomTabBar(self, dnd, tabBar):
         """
         Public method to set a custom tab bar.
-        
+
         @param dnd flag indicating the support for Drag & Drop (boolean)
         @param tabBar reference to the tab bar to set (QTabBar)
         """
@@ -180,11 +183,11 @@
                 self.__tabBar.tabMoveRequested.connect(self.moveTab)
             else:
                 self.setMovable(True)
-    
+
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged signal.
-        
+
         @param index index of the current tab
         """
         if index == -1:
@@ -192,7 +195,7 @@
         else:
             self.__lastCurrentIndex = self.__currentIndex
         self.__currentIndex = index
-        
+
     def switchTab(self):
         """
         Public slot used to switch between the current and the previous
@@ -200,10 +203,10 @@
         """
         if self.__lastCurrentIndex == -1 or self.__currentIndex == -1:
             return
-        
+
         self.setCurrentIndex(self.__lastCurrentIndex)
         self.currentWidget().setFocus()
-        
+
     def nextTab(self):
         """
         Public slot used to show the next tab.
@@ -211,7 +214,7 @@
         ind = self.currentIndex() + 1
         if ind == self.count():
             ind = 0
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
 
@@ -222,28 +225,30 @@
         ind = self.currentIndex() - 1
         if ind == -1:
             ind = self.count() - 1
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
 
     def setTabContextMenuPolicy(self, policy):
         """
         Public method to set the context menu policy of the tab.
-        
+
         @param policy context menu policy to set (Qt.ContextMenuPolicy)
         """
         self.tabBar().setContextMenuPolicy(policy)
         if policy == Qt.ContextMenuPolicy.CustomContextMenu:
             self.tabBar().customContextMenuRequested.connect(
-                self.__handleTabCustomContextMenuRequested)
+                self.__handleTabCustomContextMenuRequested
+            )
         else:
             self.tabBar().customContextMenuRequested.disconnect(
-                self.__handleTabCustomContextMenuRequested)
+                self.__handleTabCustomContextMenuRequested
+            )
 
     def __handleTabCustomContextMenuRequested(self, point):
         """
         Private slot to handle the context menu request for the tabbar.
-        
+
         @param point point the context menu was requested (QPoint)
         """
         _tabbar = self.tabBar()
@@ -251,15 +256,16 @@
             rect = _tabbar.tabRect(index)
             if rect.contains(point):
                 self.customTabContextMenuRequested.emit(
-                    _tabbar.mapToParent(point), index)
+                    _tabbar.mapToParent(point), index
+                )
                 return
-        
+
         self.customTabContextMenuRequested.emit(_tabbar.mapToParent(point), -1)
-    
+
     def selectTab(self, pos):
         """
         Public method to get the index of a tab given a position.
-        
+
         @param pos position determining the tab index (QPoint)
         @return index of the tab (integer)
         """
@@ -268,13 +274,13 @@
             rect = _tabbar.tabRect(index)
             if rect.contains(pos):
                 return index
-        
+
         return -1
 
     def moveTab(self, curIndex, newIndex):
         """
         Public method to move a tab to a new index.
-        
+
         @param curIndex index of tab to be moved (integer)
         @param newIndex index the tab should be moved to (integer)
         """
@@ -285,38 +291,38 @@
         whatsThis = self.tabWhatsThis(curIndex)
         widget = self.widget(curIndex)
         curWidget = self.currentWidget()
-        
+
         # step 2: move the tab
         self.removeTab(curIndex)
         self.insertTab(newIndex, widget, icon, text)
-        
+
         # step 3: set the tab data again
         self.setTabToolTip(newIndex, toolTip)
         self.setTabWhatsThis(newIndex, whatsThis)
-        
+
         # step 4: set current widget
         self.setCurrentWidget(curWidget)
-    
+
     def __freeSide(self):
         """
         Private method to determine the free side of a tab.
-        
+
         @return free side (QTabBar.ButtonPosition)
         """
         side = self.__tabBar.style().styleHint(
-            QStyle.StyleHint.SH_TabBar_CloseButtonPosition,
-            None, None, None)
+            QStyle.StyleHint.SH_TabBar_CloseButtonPosition, None, None, None
+        )
         side = (
             QTabBar.ButtonPosition.RightSide
-            if side == QTabBar.ButtonPosition.LeftSide else
-            QTabBar.ButtonPosition.LeftSide
+            if side == QTabBar.ButtonPosition.LeftSide
+            else QTabBar.ButtonPosition.LeftSide
         )
         return side
-    
+
     def animationLabel(self, index, animationFile, interval=100):
         """
         Public slot to set an animated icon.
-        
+
         @param index tab index
         @type int
         @param animationFile name of the file containing the animation
@@ -328,28 +334,29 @@
         """
         if index == -1:
             return None
-        
-        if hasattr(self.__tabBar, 'setTabButton'):
+
+        if hasattr(self.__tabBar, "setTabButton"):
             side = self.__freeSide()
             animation = EricAnimatedLabel(
-                self, animationFile=animationFile, interval=interval)
+                self, animationFile=animationFile, interval=interval
+            )
             self.__tabBar.setTabButton(index, side, None)
             self.__tabBar.setTabButton(index, side, animation)
             animation.start()
             return animation
         else:
             return None
-    
+
     def resetAnimation(self, index):
         """
         Public slot to reset an animated icon.
-        
+
         @param index tab index (integer)
         """
         if index == -1:
             return
-        
-        if hasattr(self.__tabBar, 'tabButton'):
+
+        if hasattr(self.__tabBar, "tabButton"):
             side = self.__freeSide()
             animation = self.__tabBar.tabButton(index, side)
             if animation is not None:
--- a/src/eric7/EricWidgets/EricTableView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTableView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,21 +15,22 @@
     """
     Class implementing a table view supporting removal of entries.
     """
+
     def keyPressEvent(self, evt):
         """
         Protected method implementing special key handling.
-        
+
         @param evt reference to the event (QKeyEvent)
         """
         if (
-            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace] and
-            self.model() is not None
+            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace]
+            and self.model() is not None
         ):
             self.removeSelected()
             evt.setAccepted(True)
         else:
             super().keyPressEvent(evt)
-    
+
     def removeSelected(self):
         """
         Public method to remove the selected entries.
@@ -37,26 +38,28 @@
         if self.model() is None or self.selectionModel() is None:
             # no models available
             return
-        
+
         row = 0
         selectedRows = self.selectionModel().selectedRows()
         for selectedRow in reversed(selectedRows):
             row = selectedRow.row()
             self.model().removeRow(row, self.rootIndex())
-        
+
         idx = self.model().index(row, 0, self.rootIndex())
         if not idx.isValid():
             idx = self.model().index(row - 1, 0, self.rootIndex())
         self.selectionModel().select(
             idx,
-            QItemSelectionModel.SelectionFlag.SelectCurrent |
-            QItemSelectionModel.SelectionFlag.Rows)
+            QItemSelectionModel.SelectionFlag.SelectCurrent
+            | QItemSelectionModel.SelectionFlag.Rows,
+        )
         self.setCurrentIndex(idx)
-    
+
     def removeAll(self):
         """
         Public method to clear the view.
         """
         if self.model() is not None:
-            self.model().removeRows(0, self.model().rowCount(self.rootIndex()),
-                                    self.rootIndex())
+            self.model().removeRows(
+                0, self.model().rowCount(self.rootIndex()), self.rootIndex()
+            )
--- a/src/eric7/EricWidgets/EricTextEditSearchWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTextEditSearchWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,14 @@
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QMetaObject, QSize
 from PyQt6.QtGui import QPalette, QTextDocument, QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QCheckBox,
-    QToolButton, QSizePolicy
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLabel,
+    QComboBox,
+    QCheckBox,
+    QToolButton,
+    QSizePolicy,
 )
 
 import UI.PixmapCache
@@ -23,6 +29,7 @@
     """
     Class defining the supported text edit types.
     """
+
     UNKNOWN = 0
     QTEXTEDIT = 1
     QTEXTBROWSER = 2
@@ -32,16 +39,17 @@
 class EricTextEditSearchWidget(QWidget):
     """
     Class implementing a horizontal search widget for QTextEdit.
-    
+
     @signal closePressed() emitted to indicate the closing of the widget via
         the close button
     """
+
     closePressed = pyqtSignal()
-    
+
     def __init__(self, parent=None, widthForHeight=True, enableClose=False):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param widthForHeight flag indicating to prefer width for height.
@@ -53,50 +61,47 @@
         """
         super().__init__(parent)
         self.__setupUi(widthForHeight, enableClose)
-        
+
         self.__textedit = None
         self.__texteditType = EricTextEditType.UNKNOWN
         self.__findBackwards = False
-        
+
         self.__defaultBaseColor = (
-            self.findtextCombo.lineEdit().palette().color(
-                QPalette.ColorRole.Base)
+            self.findtextCombo.lineEdit().palette().color(QPalette.ColorRole.Base)
         )
         self.__defaultTextColor = (
-            self.findtextCombo.lineEdit().palette().color(
-                QPalette.ColorRole.Text)
+            self.findtextCombo.lineEdit().palette().color(QPalette.ColorRole.Text)
         )
-        
+
         self.findHistory = []
-        
+
         self.findtextCombo.setCompleter(None)
-        self.findtextCombo.lineEdit().returnPressed.connect(
-            self.__findByReturnPressed)
-        
+        self.findtextCombo.lineEdit().returnPressed.connect(self.__findByReturnPressed)
+
         self.__setSearchButtons(False)
         self.infoLabel.hide()
-        
+
         self.setFocusProxy(self.findtextCombo)
-    
+
     def __setupUi(self, widthForHeight, enableClose):
         """
         Private method to generate the UI.
-        
+
         @param widthForHeight flag indicating to prefer width for height
         @type bool
         @param enableClose flag indicating to show a close button
         @type bool
         """
         self.setObjectName("EricTextEditSearchWidget")
-        
+
         self.verticalLayout = QVBoxLayout(self)
         self.verticalLayout.setObjectName("verticalLayout")
         self.verticalLayout.setContentsMargins(0, 0, 0, 0)
-        
+
         # row 1 of widgets
         self.horizontalLayout1 = QHBoxLayout()
         self.horizontalLayout1.setObjectName("horizontalLayout1")
-        
+
         if enableClose:
             self.closeButton = QToolButton(self)
             self.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
@@ -104,21 +109,21 @@
             self.horizontalLayout1.addWidget(self.closeButton)
         else:
             self.closeButton = None
-        
+
         self.label = QLabel(self)
         self.label.setObjectName("label")
         self.label.setText(self.tr("Find:"))
         self.horizontalLayout1.addWidget(self.label)
-        
+
         self.findtextCombo = QComboBox(self)
         self.findtextCombo.setEditable(True)
         self.findtextCombo.lineEdit().setClearButtonEnabled(True)
-        sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding,
-                                 QSizePolicy.Policy.Fixed)
+        sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(
-            self.findtextCombo.sizePolicy().hasHeightForWidth())
+            self.findtextCombo.sizePolicy().hasHeightForWidth()
+        )
         self.findtextCombo.setSizePolicy(sizePolicy)
         self.findtextCombo.setMinimumSize(QSize(100, 0))
         self.findtextCombo.setEditable(True)
@@ -126,63 +131,61 @@
         self.findtextCombo.setDuplicatesEnabled(False)
         self.findtextCombo.setObjectName("findtextCombo")
         self.horizontalLayout1.addWidget(self.findtextCombo)
-        
+
         # row 2 (maybe) of widgets
         self.horizontalLayout2 = QHBoxLayout()
         self.horizontalLayout2.setObjectName("horizontalLayout2")
-        
+
         self.caseCheckBox = QCheckBox(self)
         self.caseCheckBox.setObjectName("caseCheckBox")
         self.caseCheckBox.setText(self.tr("Match case"))
         self.horizontalLayout2.addWidget(self.caseCheckBox)
-        
+
         self.wordCheckBox = QCheckBox(self)
         self.wordCheckBox.setObjectName("wordCheckBox")
         self.wordCheckBox.setText(self.tr("Whole word"))
         self.horizontalLayout2.addWidget(self.wordCheckBox)
-        
+
         # layout for the navigation buttons
         self.horizontalLayout3 = QHBoxLayout()
         self.horizontalLayout3.setSpacing(0)
         self.horizontalLayout3.setObjectName("horizontalLayout3")
-        
+
         self.findPrevButton = QToolButton(self)
         self.findPrevButton.setObjectName("findPrevButton")
-        self.findPrevButton.setToolTip(self.tr(
-            "Press to find the previous occurrence"))
+        self.findPrevButton.setToolTip(self.tr("Press to find the previous occurrence"))
         self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
         self.horizontalLayout3.addWidget(self.findPrevButton)
-        
+
         self.findNextButton = QToolButton(self)
         self.findNextButton.setObjectName("findNextButton")
-        self.findNextButton.setToolTip(self.tr(
-            "Press to find the next occurrence"))
+        self.findNextButton.setToolTip(self.tr("Press to find the next occurrence"))
         self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
         self.horizontalLayout3.addWidget(self.findNextButton)
-        
+
         self.horizontalLayout2.addLayout(self.horizontalLayout3)
-        
+
         # info label (in row 2 or 3)
         self.infoLabel = QLabel(self)
         self.infoLabel.setText("")
         self.infoLabel.setObjectName("infoLabel")
-        
+
         # place everything together
         self.verticalLayout.addLayout(self.horizontalLayout1)
         self.__addWidthForHeightLayout(widthForHeight)
         self.verticalLayout.addWidget(self.infoLabel)
-        
+
         QMetaObject.connectSlotsByName(self)
-        
+
         self.setTabOrder(self.findtextCombo, self.caseCheckBox)
         self.setTabOrder(self.caseCheckBox, self.wordCheckBox)
         self.setTabOrder(self.wordCheckBox, self.findPrevButton)
         self.setTabOrder(self.findPrevButton, self.findNextButton)
-    
+
     def setWidthForHeight(self, widthForHeight):
         """
         Public method to set the 'width for height'.
-        
+
         @param widthForHeight flag indicating to prefer width
         @type bool
         """
@@ -191,11 +194,11 @@
         else:
             self.verticalLayout.takeAt(self.__widthForHeightLayoutIndex)
         self.__addWidthForHeightLayout(widthForHeight)
-    
+
     def __addWidthForHeightLayout(self, widthForHeight):
         """
         Private method to set the middle part of the layout.
-        
+
         @param widthForHeight flag indicating to prefer width
         @type bool
         """
@@ -205,13 +208,13 @@
         else:
             self.verticalLayout.insertLayout(1, self.horizontalLayout2)
             self.__widthForHeightLayoutIndex = 1
-        
+
         self.__widthForHeight = widthForHeight
-    
+
     def attachTextEdit(self, textedit, editType=EricTextEditType.QTEXTEDIT):
         """
         Public method to attach a QTextEdit or QWebEngineView widget.
-        
+
         @param textedit reference to the edit widget to be attached
         @type QTextEdit, QTextBrowser or QWebEngineView
         @param editType type of the attached edit widget
@@ -219,39 +222,36 @@
         """
         if self.__textedit is not None:
             self.detachTextEdit()
-        
+
         self.__textedit = textedit
         self.__texteditType = editType
-        
-        self.wordCheckBox.setVisible(editType in (
-            EricTextEditType.QTEXTEDIT, EricTextEditType.QTEXTBROWSER
-        ))
+
+        self.wordCheckBox.setVisible(
+            editType in (EricTextEditType.QTEXTEDIT, EricTextEditType.QTEXTBROWSER)
+        )
         self.infoLabel.setVisible(editType == EricTextEditType.QWEBENGINEVIEW)
         if editType == EricTextEditType.QWEBENGINEVIEW:
-            self.__textedit.page().findTextFinished.connect(
-                self.__findTextFinished)
-    
+            self.__textedit.page().findTextFinished.connect(self.__findTextFinished)
+
     def detachTextEdit(self):
         """
         Public method to detach the current text edit.
         """
         if self.__texteditType == EricTextEditType.QWEBENGINEVIEW:
-            self.__textedit.page().findTextFinished.disconnect(
-                self.__findTextFinished)
-        
+            self.__textedit.page().findTextFinished.disconnect(self.__findTextFinished)
+
         self.__textedit = None
         self.__texteditType = EricTextEditType.UNKNOWN
-    
+
     @pyqtSlot()
     def activate(self):
         """
         Public slot to activate the widget.
         """
         self.show()
-        self.findtextCombo.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
+        self.findtextCombo.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
         self.findtextCombo.lineEdit().selectAll()
-    
+
     @pyqtSlot()
     def deactivate(self):
         """
@@ -264,31 +264,31 @@
         if self.closeButton is not None:
             self.hide()
             self.closePressed.emit()
-    
+
     @pyqtSlot()
     def __closeButtonClicked(self):
         """
         Private slot to close the widget.
-        
+
         Note: The widget is just hidden.
         """
         self.deactivate()
-    
+
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event
         @type QKeyEvent
         """
         if self.__textedit:
             key = event.key()
             modifiers = event.modifiers()
-            
+
             if key == Qt.Key.Key_Escape:
                 self.deactivate()
                 event.accept()
-            
+
             elif key == Qt.Key.Key_F3:
                 if modifiers == Qt.KeyboardModifier.NoModifier:
                     # search forward
@@ -298,88 +298,88 @@
                     # search backward
                     self.on_findPrevButton_clicked()
                     event.accept()
-    
+
     @pyqtSlot(str)
     def on_findtextCombo_editTextChanged(self, txt):
         """
         Private slot to enable/disable the find buttons.
-        
+
         @param txt text of the combobox
         @type str
         """
         self.__setSearchButtons(txt != "")
-        
+
         if self.__texteditType == EricTextEditType.QWEBENGINEVIEW:
             self.infoLabel.clear()
         else:
             self.infoLabel.hide()
         self.__setFindtextComboBackground(False)
-    
+
     def __setSearchButtons(self, enabled):
         """
         Private slot to set the state of the search buttons.
-        
+
         @param enabled flag indicating the state
         @type bool
         """
         self.findPrevButton.setEnabled(enabled)
         self.findNextButton.setEnabled(enabled)
-    
+
     def __findByReturnPressed(self):
         """
         Private slot to handle the returnPressed signal of the findtext
         combobox.
         """
         self.__find(self.__findBackwards)
-    
+
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
         """
         Private slot to find the previous occurrence.
         """
         self.__find(True)
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next occurrence.
         """
         self.__find(False)
-    
+
     @pyqtSlot()
     def findPrev(self):
         """
         Public slot to find the previous occurrence of the current search term.
         """
         self.on_findPrevButton_clicked()
-    
+
     @pyqtSlot()
     def findNext(self):
         """
         Public slot to find the next occurrence of the current search term.
         """
         self.on_findNextButton_clicked()
-    
+
     def __find(self, backwards):
         """
         Private method to search the associated text edit.
-        
+
         @param backwards flag indicating a backwards search
         @type bool
         """
         if not self.__textedit:
             return
-        
+
         self.infoLabel.clear()
         if self.__texteditType != EricTextEditType.QWEBENGINEVIEW:
             self.infoLabel.hide()
         self.__setFindtextComboBackground(False)
-        
+
         txt = self.findtextCombo.currentText()
         if not txt:
             return
         self.__findBackwards = backwards
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.findHistory:
@@ -387,32 +387,33 @@
         self.findHistory.insert(0, txt)
         self.findtextCombo.clear()
         self.findtextCombo.addItems(self.findHistory)
-        
+
         if self.__texteditType in (
-            EricTextEditType.QTEXTBROWSER, EricTextEditType.QTEXTEDIT
+            EricTextEditType.QTEXTBROWSER,
+            EricTextEditType.QTEXTEDIT,
         ):
             self.__findPrevNextQTextEdit(backwards)
         elif self.__texteditType == EricTextEditType.QWEBENGINEVIEW:
             self.__findPrevNextQWebEngineView(backwards)
-    
+
     def __findPrevNextQTextEdit(self, backwards):
         """
         Private method to to search the associated edit widget of
         type QTextEdit.
-        
+
         @param backwards flag indicating a backwards search
         @type bool
         """
         flags = (
             QTextDocument.FindFlag.FindBackward
-            if backwards else
-            QTextDocument.FindFlag(0)
+            if backwards
+            else QTextDocument.FindFlag(0)
         )
         if self.caseCheckBox.isChecked():
             flags |= QTextDocument.FindFlag.FindCaseSensitively
         if self.wordCheckBox.isChecked():
             flags |= QTextDocument.FindFlag.FindWholeWords
-        
+
         ok = self.__textedit.find(self.findtextCombo.currentText(), flags)
         if not ok:
             # wrap around once
@@ -426,71 +427,71 @@
             cursor.movePosition(moveOp)
             self.__textedit.setTextCursor(cursor)
             ok = self.__textedit.find(self.findtextCombo.currentText(), flags)
-        
+
         if not ok:
             self.infoLabel.setText(
-                self.tr("'{0}' was not found.").format(
-                    self.findtextCombo.currentText())
+                self.tr("'{0}' was not found.").format(self.findtextCombo.currentText())
             )
             self.infoLabel.show()
             self.__setFindtextComboBackground(True)
-    
+
     def __findPrevNextQWebEngineView(self, backwards):
         """
         Private method to to search the associated edit widget of
         type QWebEngineView.
-        
+
         @param backwards flag indicating a backwards search
         @type bool
         """
         from PyQt6.QtWebEngineCore import QWebEnginePage
-        
+
         findFlags = QWebEnginePage.FindFlag(0)
         if self.caseCheckBox.isChecked():
             findFlags |= QWebEnginePage.FindFlag.FindCaseSensitively
         if backwards:
             findFlags |= QWebEnginePage.FindFlag.FindBackward
         self.__textedit.findText(self.findtextCombo.currentText(), findFlags)
-    
+
     def __setFindtextComboBackground(self, error):
         """
         Private slot to change the findtext combo background to indicate
         errors.
-        
+
         @param error flag indicating an error condition
         @type bool
         """
         styleSheet = (
             "color: #000000; background-color: #ff6666"
-            if error else
-            f"color: {self.__defaultTextColor};"
+            if error
+            else f"color: {self.__defaultTextColor};"
             f" background-color: {self.__defaultBaseColor}"
         )
         self.findtextCombo.setStyleSheet(styleSheet)
-    
+
     def __findTextFinished(self, result):
         """
         Private slot handling the findTextFinished signal of the web page.
-        
+
         @param result reference to the QWebEngineFindTextResult object of the
             last search
         @type QWebEngineFindTextResult
         """
         if result.numberOfMatches() == 0:
             self.infoLabel.setText(
-                self.tr("'{0}' was not found.").format(
-                    self.findtextCombo.currentText())
+                self.tr("'{0}' was not found.").format(self.findtextCombo.currentText())
             )
             self.__setFindtextComboBackground(True)
         else:
-            self.infoLabel.setText(self.tr("Match {0} of {1}").format(
-                result.activeMatch(), result.numberOfMatches())
+            self.infoLabel.setText(
+                self.tr("Match {0} of {1}").format(
+                    result.activeMatch(), result.numberOfMatches()
+                )
             )
-    
+
     def showInfo(self, info):
         """
         Public method to show some information in the info label.
-        
+
         @param info informational text to be shown
         @type str
         """
--- a/src/eric7/EricWidgets/EricTextInputDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTextInputDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,111 +7,111 @@
 Module implementing a dialog to enter some text.
 """
 
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QLineEdit
 
 
 class EricTextInputDialog(QDialog):
     """
     Class implementing a dialog to enter some text.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setMaximumWidth(600)
-        
+
         self.__layout = QVBoxLayout(self)
-        
+
         self.__label = QLabel(self)
         self.__layout.addWidget(self.__label)
-        
+
         self.__lineEdit = QLineEdit(self)
         self.__lineEdit.setClearButtonEnabled(True)
         self.__layout.addWidget(self.__lineEdit)
-        
+
         self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Ok |
-            QDialogButtonBox.StandardButton.Cancel, self)
+            QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel,
+            self,
+        )
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.__buttonBox.accepted.connect(self.accept)
         self.__buttonBox.rejected.connect(self.reject)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def setTextEchoMode(self, echoMode):
         """
         Public method to set the echo mode of the line edit.
-        
+
         @param echoMode echo mode of the line edit
         @type QLineEdit.EchoMode
         """
         self.__lineEdit.setEchoMode(echoMode)
-    
+
     def textEchoMode(self):
         """
         Public method to get the current echo mode of the line edit.
-        
+
         @return echo mode of the line edit
         @rtype QLineEdit.EchoMode
         """
         return self.__lineEdit.echoMode()
-    
+
     def setTextValue(self, text):
         """
         Public method to set the text of the line edit.
-        
+
         @param text text for the line edit
         @type str
         """
         self.__lineEdit.setText(text)
-    
+
     def textValue(self):
         """
         Public method to get the text of the line edit.
-        
+
         @return text of the line edit
         @rtype str
         """
         return self.__lineEdit.text()
-    
+
     def setLabelText(self, text):
         """
         Public method to set the label text.
-        
+
         @param text label text
         @type str
         """
         self.__label.setText(text)
-        
+
         msh = self.minimumSizeHint()
         labelSizeHint = self.__label.sizeHint()
-        self.resize(max(self.width(), msh.width(), labelSizeHint.width()),
-                    msh.height())
-    
+        self.resize(max(self.width(), msh.width(), labelSizeHint.width()), msh.height())
+
     def labelText(self):
         """
         Public method to get the current label text.
-        
+
         @return current label text
         @rtype str
         """
         return self.label.text()
 
 
-def getText(parent, title, label, mode=QLineEdit.EchoMode.Normal, text="",
-            minimumWidth=300):
+def getText(
+    parent, title, label, mode=QLineEdit.EchoMode.Normal, text="", minimumWidth=300
+):
     """
     Function to get create a dialog to enter some text and return it.
-    
+
     @param parent reference to the parent widget
     @type QWidget
     @param title title of the dialog
@@ -134,7 +134,7 @@
     dlg.setTextEchoMode(mode)
     dlg.setTextValue(text)
     dlg.setMinimumWidth(minimumWidth)
-    
+
     if dlg.exec() == QDialog.DialogCode.Accepted:
         return True, dlg.textValue()
     else:
--- a/src/eric7/EricWidgets/EricTextSpinBox.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTextSpinBox.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,33 +14,34 @@
     """
     Class implementing a spinbox with textual entries.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__items = []
-        
+
         self.setMinimum(0)
         self.setMaximum(0)
-    
+
     def addItem(self, txt, data=None):
         """
         Public method to add an item with item data.
-        
+
         @param txt text to be shown (string)
         @param data associated data
         """
         self.__items.append((txt, data))
         self.setMaximum(len(self.__items) - 1)
-    
+
     def itemData(self, index):
         """
         Public method to retrieve the data associated with an item.
-        
+
         @param index index of the item (integer)
         @return associated data
         """
@@ -48,19 +49,19 @@
             return self.__items[index][1]
         except IndexError:
             return None
-    
+
     def currentIndex(self):
         """
         Public method to retrieve the current index.
-        
+
         @return current index (integer)
         """
         return self.value()
-    
+
     def textFromValue(self, value):
         """
         Public method to convert a value to text.
-        
+
         @param value value to be converted (integer)
         @return text for the given value (string)
         """
@@ -68,16 +69,16 @@
             return self.__items[value][0]
         except IndexError:
             return ""
-    
+
     def valueFromText(self, txt):
         """
         Public method to convert a text to a value.
-        
+
         @param txt text to be converted (string)
         @return value for the given text (integer)
         """
         for index in range(len(self.__items)):
             if self.__items[index][0] == txt:
                 return index
-        
+
         return self.minimum()
--- a/src/eric7/EricWidgets/EricToolBarDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricToolBarDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,13 @@
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtGui import QColor
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QTreeWidgetItem, QInputDialog, QLineEdit,
-    QListWidgetItem, QAbstractButton
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QInputDialog,
+    QLineEdit,
+    QListWidgetItem,
+    QAbstractButton,
 )
 
 from EricWidgets import EricMessageBox
@@ -25,10 +30,11 @@
     """
     Class storing data belonging to a toolbar entry of the toolbar dialog.
     """
+
     def __init__(self, toolBarId, actionIDs, default):
         """
         Constructor
-        
+
         @param toolBarId id of the toolbar object (integer)
         @param actionIDs list of action IDs belonging to the toolbar
             (list of integer)
@@ -39,53 +45,56 @@
         self.isDefault = default
         self.title = ""
         self.isChanged = False
-    
+
 
 class EricToolBarDialog(QDialog, Ui_EricToolBarDialog):
     """
     Class implementing a toolbar configuration dialog.
     """
+
     ActionIdRole = Qt.ItemDataRole.UserRole
     WidgetActionRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, toolBarManager, parent=None):
         """
         Constructor
-        
+
         @param toolBarManager reference to a toolbar manager object
             (EricToolBarManager)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__manager = toolBarManager
         self.__toolbarItems = {}
         # maps toolbar item IDs to toolbar items
         self.__currentToolBarItem = None
         self.__removedToolBarIDs = []
         # remember custom toolbars to be deleted
-        
+
         self.__widgetActionToToolBarItemID = {}
         # maps widget action IDs to toolbar item IDs
         self.__toolBarItemToWidgetActionID = {}
         # maps toolbar item IDs to widget action IDs
-        
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
         self.leftButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
         self.rightButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
-        
+
         self.__restoreDefaultsButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.RestoreDefaults)
+            QDialogButtonBox.StandardButton.RestoreDefaults
+        )
         self.__resetButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Reset)
-        
+            QDialogButtonBox.StandardButton.Reset
+        )
+
         self.actionsTree.header().hide()
         self.__separatorText = self.tr("--Separator--")
         itm = QTreeWidgetItem(self.actionsTree, [self.__separatorText])
         self.actionsTree.setCurrentItem(itm)
-        
+
         for category in sorted(self.__manager.categories()):
             categoryItem = QTreeWidgetItem(self.actionsTree, [category])
             for action in self.__manager.categoryActions(category):
@@ -93,19 +102,18 @@
                 item.setText(0, action.text())
                 item.setIcon(0, action.icon())
                 item.setTextAlignment(
-                    0,
-                    Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter
+                    0, Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter
                 )
-                item.setData(0, EricToolBarDialog.ActionIdRole,
-                             int(id(action)))
+                item.setData(0, EricToolBarDialog.ActionIdRole, int(id(action)))
                 item.setData(0, EricToolBarDialog.WidgetActionRole, False)
                 if self.__manager.isWidgetAction(action):
                     item.setData(0, EricToolBarDialog.WidgetActionRole, True)
-                    item.setData(0, Qt.ItemDataRole.ForegroundRole,
-                                 QColor(Qt.GlobalColor.blue))
+                    item.setData(
+                        0, Qt.ItemDataRole.ForegroundRole, QColor(Qt.GlobalColor.blue)
+                    )
                     self.__widgetActionToToolBarItemID[id(action)] = None
             categoryItem.setExpanded(True)
-        
+
         for tbID, actions in list(self.__manager.toolBarsActions().items()):
             tb = self.__manager.toolBarById(tbID)
             default = self.__manager.isDefaultToolBar(tb)
@@ -121,21 +129,22 @@
                     actionIDs.append(aID)
                     if aID in self.__widgetActionToToolBarItemID:
                         self.__widgetActionToToolBarItemID[aID] = id(tbItem)
-                        self.__toolBarItemToWidgetActionID[id(tbItem)].append(
-                            aID)
+                        self.__toolBarItemToWidgetActionID[id(tbItem)].append(aID)
             tbItem.actionIDs = actionIDs
             self.toolbarComboBox.addItem(tb.windowTitle(), int(id(tbItem)))
             if default:
                 self.toolbarComboBox.setItemData(
                     self.toolbarComboBox.count() - 1,
                     QColor(Qt.GlobalColor.darkGreen),
-                    Qt.ItemDataRole.ForegroundRole)
+                    Qt.ItemDataRole.ForegroundRole,
+                )
         self.toolbarComboBox.model().sort(0)
-        
+
         self.toolbarComboBox.currentIndexChanged[int].connect(
-            self.__toolbarComboBox_currentIndexChanged)
+            self.__toolbarComboBox_currentIndexChanged
+        )
         self.toolbarComboBox.setCurrentIndex(0)
-    
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
@@ -145,7 +154,8 @@
             self,
             self.tr("New Toolbar"),
             self.tr("Toolbar Name:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and name:
             if self.toolbarComboBox.findText(name) != -1:
                 # toolbar with this name already exists
@@ -153,11 +163,11 @@
                     self,
                     self.tr("New Toolbar"),
                     self.tr(
-                        """A toolbar with the name <b>{0}</b> already"""
-                        """ exists.""")
-                    .format(name))
+                        """A toolbar with the name <b>{0}</b> already""" """ exists."""
+                    ).format(name),
+                )
                 return
-            
+
             tbItem = EricToolBarItem(None, [], False)
             tbItem.title = name
             tbItem.isChanged = True
@@ -165,9 +175,8 @@
             self.__toolBarItemToWidgetActionID[id(tbItem)] = []
             self.toolbarComboBox.addItem(name, int(id(tbItem)))
             self.toolbarComboBox.model().sort(0)
-            self.toolbarComboBox.setCurrentIndex(
-                self.toolbarComboBox.findText(name))
-    
+            self.toolbarComboBox.setCurrentIndex(self.toolbarComboBox.findText(name))
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -177,16 +186,17 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Remove Toolbar"),
-            self.tr(
-                """Should the toolbar <b>{0}</b> really be removed?""")
-            .format(name))
+            self.tr("""Should the toolbar <b>{0}</b> really be removed?""").format(
+                name
+            ),
+        )
         if res:
             index = self.toolbarComboBox.currentIndex()
             tbItemID = self.toolbarComboBox.itemData(index)
             tbItem = self.__toolbarItems[tbItemID]
             if (
-                tbItem.toolBarId is not None and
-                tbItem.toolBarId not in self.__removedToolBarIDs
+                tbItem.toolBarId is not None
+                and tbItem.toolBarId not in self.__removedToolBarIDs
             ):
                 self.__removedToolBarIDs.append(tbItem.toolBarId)
             del self.__toolbarItems[tbItemID]
@@ -194,7 +204,7 @@
                 self.__widgetActionToToolBarItemID[widgetActionID] = None
             del self.__toolBarItemToWidgetActionID[tbItemID]
             self.toolbarComboBox.removeItem(index)
-    
+
     @pyqtSlot()
     def on_renameButton_clicked(self):
         """
@@ -206,7 +216,8 @@
             self.tr("Rename Toolbar"),
             self.tr("New Toolbar Name:"),
             QLineEdit.EchoMode.Normal,
-            oldName)
+            oldName,
+        )
         if ok and newName:
             if oldName == newName:
                 return
@@ -216,16 +227,16 @@
                     self,
                     self.tr("Rename Toolbar"),
                     self.tr(
-                        """A toolbar with the name <b>{0}</b> already"""
-                        """ exists.""")
-                    .format(newName))
+                        """A toolbar with the name <b>{0}</b> already""" """ exists."""
+                    ).format(newName),
+                )
                 return
             index = self.toolbarComboBox.currentIndex()
             self.toolbarComboBox.setItemText(index, newName)
             tbItem = self.__toolbarItems[self.toolbarComboBox.itemData(index)]
             tbItem.title = newName
             tbItem.isChanged = True
-    
+
     def __setupButtons(self):
         """
         Private slot to set the buttons state.
@@ -234,30 +245,28 @@
         if index > -1:
             itemID = self.toolbarComboBox.itemData(index)
             self.__currentToolBarItem = self.__toolbarItems[itemID]
-            self.renameButton.setEnabled(
-                not self.__currentToolBarItem.isDefault)
-            self.removeButton.setEnabled(
-                not self.__currentToolBarItem.isDefault)
-            self.__restoreDefaultsButton.setEnabled(
-                self.__currentToolBarItem.isDefault)
+            self.renameButton.setEnabled(not self.__currentToolBarItem.isDefault)
+            self.removeButton.setEnabled(not self.__currentToolBarItem.isDefault)
+            self.__restoreDefaultsButton.setEnabled(self.__currentToolBarItem.isDefault)
             self.__resetButton.setEnabled(
-                self.__currentToolBarItem.toolBarId is not None)
-        
+                self.__currentToolBarItem.toolBarId is not None
+            )
+
         row = self.toolbarActionsList.currentRow()
         self.upButton.setEnabled(row > 0)
         self.downButton.setEnabled(row < self.toolbarActionsList.count() - 1)
         self.leftButton.setEnabled(self.toolbarActionsList.count() > 0)
         rightEnable = (
-            self.actionsTree.currentItem().parent() is not None or
-            self.actionsTree.currentItem().text(0) == self.__separatorText
+            self.actionsTree.currentItem().parent() is not None
+            or self.actionsTree.currentItem().text(0) == self.__separatorText
         )
         self.rightButton.setEnabled(rightEnable)
-    
+
     @pyqtSlot(int)
     def __toolbarComboBox_currentIndexChanged(self, index):
         """
         Private slot called upon a selection of the current toolbar.
-        
+
         @param index index of the new current toolbar (integer)
         """
         itemID = self.toolbarComboBox.itemData(index)
@@ -271,40 +280,42 @@
                 action = self.__manager.actionById(actionID)
                 item.setText(action.text())
                 item.setIcon(action.icon())
-                item.setTextAlignment(Qt.AlignmentFlag.AlignLeft |
-                                      Qt.AlignmentFlag.AlignVCenter)
+                item.setTextAlignment(
+                    Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter
+                )
                 item.setData(EricToolBarDialog.ActionIdRole, int(id(action)))
                 item.setData(EricToolBarDialog.WidgetActionRole, False)
                 if self.__manager.isWidgetAction(action):
                     item.setData(EricToolBarDialog.WidgetActionRole, True)
-                    item.setData(Qt.ItemDataRole.ForegroundRole,
-                                 QColor(Qt.GlobalColor.blue))
+                    item.setData(
+                        Qt.ItemDataRole.ForegroundRole, QColor(Qt.GlobalColor.blue)
+                    )
         self.toolbarActionsList.setCurrentRow(0)
-        
+
         self.__setupButtons()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_actionsTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the currently selected action changes.
-        
+
         @param current reference to the current item (QTreeWidgetItem)
         @param previous reference to the previous current item
             (QTreeWidgetItem)
         """
         self.__setupButtons()
-    
+
     @pyqtSlot(QListWidgetItem, QListWidgetItem)
     def on_toolbarActionsList_currentItemChanged(self, current, previous):
         """
         Private slot to handle a change of the current item.
-        
+
         @param current reference to the current item (QListWidgetItem)
         @param previous reference to the previous current item
             (QListWidgetItem)
         """
         self.__setupButtons()
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -314,7 +325,7 @@
         if row == 0:
             # we're already at the top
             return
-        
+
         actionID = self.__currentToolBarItem.actionIDs.pop(row)
         self.__currentToolBarItem.actionIDs.insert(row - 1, actionID)
         self.__currentToolBarItem.isChanged = True
@@ -322,7 +333,7 @@
         self.toolbarActionsList.insertItem(row - 1, itm)
         self.toolbarActionsList.setCurrentItem(itm)
         self.__setupButtons()
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -332,7 +343,7 @@
         if row == self.toolbarActionsList.count() - 1:
             # we're already at the end
             return
-        
+
         actionID = self.__currentToolBarItem.actionIDs.pop(row)
         self.__currentToolBarItem.actionIDs.insert(row + 1, actionID)
         self.__currentToolBarItem.isChanged = True
@@ -340,7 +351,7 @@
         self.toolbarActionsList.insertItem(row + 1, itm)
         self.toolbarActionsList.setCurrentItem(itm)
         self.__setupButtons()
-    
+
     @pyqtSlot()
     def on_leftButton_clicked(self):
         """
@@ -351,78 +362,75 @@
         self.__currentToolBarItem.isChanged = True
         if actionID in self.__widgetActionToToolBarItemID:
             self.__widgetActionToToolBarItemID[actionID] = None
-            self.__toolBarItemToWidgetActionID[
-                id(self.__currentToolBarItem)].remove(actionID)
+            self.__toolBarItemToWidgetActionID[id(self.__currentToolBarItem)].remove(
+                actionID
+            )
         itm = self.toolbarActionsList.takeItem(row)
         del itm
         self.toolbarActionsList.setCurrentRow(row)
         self.__setupButtons()
-    
+
     @pyqtSlot()
     def on_rightButton_clicked(self):
         """
         Private slot to add an action to the list.
         """
         row = self.toolbarActionsList.currentRow() + 1
-            
+
         item = QListWidgetItem()
         if self.actionsTree.currentItem().text(0) == self.__separatorText:
             item.setText(self.__separatorText)
             actionID = None
         else:
             actionID = self.actionsTree.currentItem().data(
-                0, EricToolBarDialog.ActionIdRole)
+                0, EricToolBarDialog.ActionIdRole
+            )
             action = self.__manager.actionById(actionID)
             item.setText(action.text())
             item.setIcon(action.icon())
-            item.setTextAlignment(Qt.AlignmentFlag.AlignLeft |
-                                  Qt.AlignmentFlag.AlignVCenter)
+            item.setTextAlignment(
+                Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter
+            )
             item.setData(EricToolBarDialog.ActionIdRole, int(id(action)))
             item.setData(EricToolBarDialog.WidgetActionRole, False)
             if self.__manager.isWidgetAction(action):
                 item.setData(EricToolBarDialog.WidgetActionRole, True)
-                item.setData(Qt.ItemDataRole.ForegroundRole,
-                             QColor(Qt.GlobalColor.blue))
+                item.setData(
+                    Qt.ItemDataRole.ForegroundRole, QColor(Qt.GlobalColor.blue)
+                )
                 oldTbItemID = self.__widgetActionToToolBarItemID[actionID]
                 if oldTbItemID is not None:
                     self.__toolbarItems[oldTbItemID].actionIDs.remove(actionID)
                     self.__toolbarItems[oldTbItemID].isChanged = True
-                    self.__toolBarItemToWidgetActionID[oldTbItemID].remove(
-                        actionID)
+                    self.__toolBarItemToWidgetActionID[oldTbItemID].remove(actionID)
                 self.__widgetActionToToolBarItemID[actionID] = id(
-                    self.__currentToolBarItem)
+                    self.__currentToolBarItem
+                )
                 self.__toolBarItemToWidgetActionID[
-                    id(self.__currentToolBarItem)].append(actionID)
+                    id(self.__currentToolBarItem)
+                ].append(actionID)
         self.toolbarActionsList.insertItem(row, item)
         self.__currentToolBarItem.actionIDs.insert(row, actionID)
         self.__currentToolBarItem.isChanged = True
         self.toolbarActionsList.setCurrentRow(row)
         self.__setupButtons()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called, when a button of the button box was clicked.
-        
+
         @param button reference to the button clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.reject()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Apply
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Apply):
             self.__saveToolBars()
             self.__setupButtons()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Ok):
             self.__saveToolBars()
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Reset
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Reset):
             self.__resetCurrentToolbar()
             self.__setupButtons()
         elif button == self.buttonBox.button(
@@ -430,11 +438,11 @@
         ):
             self.__restoreCurrentToolbarToDefault()
             self.__setupButtons()
-    
+
     def __saveToolBars(self):
         """
         Private method to save the configured toolbars.
-        
+
         @exception RuntimeError raised to indicate an invalid action
         """
         # step 1: remove toolbars marked for deletion
@@ -442,12 +450,12 @@
             tb = self.__manager.toolBarById(tbID)
             self.__manager.deleteToolBar(tb)
         self.__removedToolBarIDs = []
-        
+
         # step 2: save configured toolbars
         for tbItem in list(self.__toolbarItems.values()):
             if not tbItem.isChanged:
                 continue
-            
+
             if tbItem.toolBarId is None:
                 # new custom toolbar
                 tb = self.__manager.createToolBar(tbItem.title)
@@ -456,7 +464,7 @@
                 tb = self.__manager.toolBarById(tbItem.toolBarId)
                 if not tbItem.isDefault and tbItem.title:
                     self.__manager.renameToolBar(tb, tbItem.title)
-            
+
             actions = []
             for actionID in tbItem.actionIDs:
                 if actionID is None:
@@ -465,16 +473,17 @@
                     action = self.__manager.actionById(actionID)
                     if action is None:
                         raise RuntimeError(
-                            "No such action, id: 0x{0:x}".format(actionID))
+                            "No such action, id: 0x{0:x}".format(actionID)
+                        )
                     actions.append(action)
             self.__manager.setToolBar(tb, actions)
             tbItem.isChanged = False
-    
+
     def __restoreCurrentToolbar(self, actions):
         """
         Private methdo to restore the current toolbar to the given list of
         actions.
-        
+
         @param actions list of actions to set for the current toolbar
         (list of QAction)
         """
@@ -483,7 +492,7 @@
             self.__widgetActionToToolBarItemID[widgetActionID] = None
         self.__toolBarItemToWidgetActionID[tbItemID] = []
         self.__currentToolBarItem.actionIDs = []
-        
+
         for action in actions:
             if action is None:
                 self.__currentToolBarItem.actionIDs.append(None)
@@ -493,17 +502,13 @@
                 if actionID in self.__widgetActionToToolBarItemID:
                     oldTbItemID = self.__widgetActionToToolBarItemID[actionID]
                     if oldTbItemID is not None:
-                        self.__toolbarItems[oldTbItemID].actionIDs.remove(
-                            actionID)
+                        self.__toolbarItems[oldTbItemID].actionIDs.remove(actionID)
                         self.__toolbarItems[oldTbItemID].isChanged = True
-                        self.__toolBarItemToWidgetActionID[oldTbItemID].remove(
-                            actionID)
+                        self.__toolBarItemToWidgetActionID[oldTbItemID].remove(actionID)
                     self.__widgetActionToToolBarItemID[actionID] = tbItemID
-                    self.__toolBarItemToWidgetActionID[tbItemID].append(
-                        actionID)
-        self.__toolbarComboBox_currentIndexChanged(
-            self.toolbarComboBox.currentIndex())
-    
+                    self.__toolBarItemToWidgetActionID[tbItemID].append(actionID)
+        self.__toolbarComboBox_currentIndexChanged(self.toolbarComboBox.currentIndex())
+
     def __resetCurrentToolbar(self):
         """
         Private method to revert all changes made to the current toolbar.
@@ -512,14 +517,14 @@
         actions = self.__manager.toolBarActions(tbID)
         self.__restoreCurrentToolbar(actions)
         self.__currentToolBarItem.isChanged = False
-    
+
     def __restoreCurrentToolbarToDefault(self):
         """
         Private method to set the current toolbar to its default configuration.
         """
         if not self.__currentToolBarItem.isDefault:
             return
-        
+
         tbID = self.__currentToolBarItem.toolBarId
         actions = self.__manager.defaultToolBarActions(tbID)
         self.__restoreCurrentToolbar(actions)
--- a/src/eric7/EricWidgets/EricToolBarManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricToolBarManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,22 +17,23 @@
     """
     Class implementing a toolbar manager.
     """
-    VersionMarker = 0xffff
-    ToolBarMarker = 0xfefe
-    CustomToolBarMarker = 0xfdfd
-    
+
+    VersionMarker = 0xFFFF
+    ToolBarMarker = 0xFEFE
+    CustomToolBarMarker = 0xFDFD
+
     def __init__(self, ui=None, parent=None):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__mainWindow = None
         self.__ui = ui
-        
+
         self.__toolBars = {}
         # maps toolbar IDs to actions
         self.__toolBarsWithSeparators = {}
@@ -43,7 +44,7 @@
         # list of custom toolbars
         self.__allToolBars = {}
         # maps toolbar IDs to toolbars
-        
+
         self.__categoryToActions = {}
         # maps categories to actions
         self.__actionToCategory = {}
@@ -52,20 +53,20 @@
         # maps action IDs to actions
         self.__actionToToolBars = {}
         # maps action IDs to toolbars
-        
+
         self.__widgetActions = {}
         # maps widget action IDs to toolbars
         self.__allWidgetActions = {}
         # maps widget action IDs to widget actions
-    
+
     ######################################################
     ## Private methods
     ######################################################
-    
+
     def __toolBarByName(self, name):
         """
         Private slot to get a toolbar by its object name.
-        
+
         @param name object name of the toolbar (string)
         @return reference to the toolbar (QToolBar)
         """
@@ -73,11 +74,11 @@
             if toolBar.objectName() == name:
                 return toolBar
         return None
-    
+
     def __findAction(self, name):
         """
         Private method to find an action by name.
-        
+
         @param name name of the action to search for (string)
         @return reference to the action (QAction)
         """
@@ -85,18 +86,18 @@
         for action in list(self.__allActions.values()):
             if action.objectName() == name:
                 return action
-        
+
         # check text() next
         for action in list(self.__allActions.values()):
             if action.text() == name:
                 return action
-        
+
         return None
-    
+
     def __findDefaultToolBar(self, name):
         """
         Private method to find a default toolbar by name.
-        
+
         @param name name of the default toolbar to search for (string)
         @return reference to the default toolbar (QToolBar)
         """
@@ -105,45 +106,45 @@
             tb = self.__allToolBars[tbID]
             if tb.objectName() == name:
                 return tb
-        
+
         # check windowTitle() next
         for tbID in self.__defaultToolBars:
             tb = self.__allToolBars[tbID]
             if tb.windowTitle() == name:
                 return tb
-        
+
         return None
-    
+
     ######################################################
     ## Public methods
     ######################################################
-    
+
     def setMainWindow(self, mainWindow):
         """
         Public method to set the reference to the main window.
-        
+
         @param mainWindow reference to the main window (QMainWindow)
         """
         self.__mainWindow = mainWindow
-    
+
     def mainWindow(self):
         """
         Public method to get the reference to the main window.
-        
+
         @return reference to the main window (QMainWindow)
         """
         return self.__mainWindow
-    
+
     def addToolBar(self, toolBar, category):
         """
         Public method to add a toolbar to be managed.
-        
+
         @param toolBar reference to the toolbar to be managed (QToolBar)
         @param category category for the toolbar (string)
         """
         if toolBar is None:
             return
-        
+
         newActions = []
         newActionsWithSeparators = []
         actions = toolBar.actions()
@@ -164,72 +165,70 @@
         self.__toolBars[tbID] = newActions
         self.__toolBarsWithSeparators[tbID] = newActionsWithSeparators
         self.__allToolBars[tbID] = toolBar
-    
+
     def removeToolBar(self, toolBar):
         """
         Public method to remove a toolbar added with addToolBar().
-        
+
         @param toolBar reference to the toolbar to be removed (QToolBar)
         """
         if toolBar is None:
             return
-        
+
         tbID = id(toolBar)
-        
+
         if tbID not in self.__defaultToolBars:
             return
-        
+
         defaultActions = self.__defaultToolBars[tbID][:]
         self.setToolBar(toolBar, [])
         for action in defaultActions:
             self.removeAction(action)
-        
+
         del self.__defaultToolBars[tbID]
         del self.__toolBars[tbID]
         del self.__toolBarsWithSeparators[tbID]
         del self.__allToolBars[tbID]
-        
+
         for action in defaultActions:
             if action is None:
                 toolBar.addSeparator()
             else:
                 toolBar.addAction(action)
-    
+
     def setToolBars(self, toolBars):
         """
         Public method to set the actions of several toolbars.
-        
+
         @param toolBars dictionary with toolbar id as key and
             a list of actions as value
         """
         for key, actions in list(toolBars.items()):
             tb = self.__allToolBars[key]
             self.setToolBar(tb, actions)
-    
+
     def setToolBar(self, toolBar, actions):
         """
         Public method to set the actions of a toolbar.
-        
+
         @param toolBar reference to the toolbar to configure (QToolBar)
         @param actions list of actions to be set (list of QAction)
         """
         if toolBar is None:
             return
-        
+
         tbID = id(toolBar)
         if tbID not in self.__toolBars:
             return
         if self.__toolBars[tbID] == actions:
             return
-        
+
         # step 1: check list of actions
         toRemove = {}
         newActions = []
         for action in actions:
-            if (
-                action is None or
-                (action not in newActions and
-                 id(action) in self.__allActions)
+            if action is None or (
+                action not in newActions and id(action) in self.__allActions
             ):
                 newActions.append(action)
             oldTB = self.toolBarWidgetAction(action)
@@ -238,7 +237,7 @@
                     toRemove[id(oldTB)] = []
                 toRemove[id(oldTB)].append(action)
         self.removeWidgetActions(toRemove)
-        
+
         # step 2: remove all toolbar actions
         for action in self.__toolBarsWithSeparators[tbID]:
             if self.toolBarWidgetAction(action) == tbID:
@@ -248,7 +247,7 @@
                 del action
             else:
                 self.__actionToToolBars[id(action)].remove(toolBar)
-        
+
         # step 3: set the actions as requested
         newActionsWithSeparators = []
         for action in newActions:
@@ -264,23 +263,23 @@
             else:
                 continue
             newActionsWithSeparators.append(newAction)
-        
+
         if toolBar.isVisible():
             toolBar.hide()
             toolBar.show()
         self.__toolBars[tbID] = newActions
         self.__toolBarsWithSeparators[tbID] = newActionsWithSeparators
-    
+
     def resetToolBar(self, toolBar):
         """
         Public method to reset a toolbar to its default state.
-        
+
         @param toolBar reference to the toolbar to configure (QToolBar)
         """
         if not self.isDefaultToolBar():
             return
         self.setToolBar(toolBar, self.__defaultToolBars[id(toolBar)])
-    
+
     def resetAllToolBars(self):
         """
         Public method to reset all toolbars to their default state.
@@ -288,38 +287,35 @@
         self.setToolBars(self.__defaultToolBars)
         for toolBar in self.__customToolBars[:]:
             self.deleteToolBar(toolBar)
-        
+
     def defaultToolBars(self):
         """
         Public method to get all toolbars added with addToolBar().
-        
+
         @return list of all default toolbars (list of QToolBar)
         """
         return list(self.__defaultToolBars.values())
-    
+
     def isDefaultToolBar(self, toolBar):
         """
         Public method to check, if a toolbar was added with addToolBar().
-        
+
         @param toolBar reference to the toolbar to be checked (QToolBar)
         @return flag indicating an added toolbar (boolean)
         """
-        return (
-            toolBar is not None and
-            id(toolBar) in self.__defaultToolBars
-        )
-    
+        return toolBar is not None and id(toolBar) in self.__defaultToolBars
+
     def createToolBar(self, title, name=""):
         """
         Public method to create a custom toolbar.
-        
+
         @param title title to be used for the toolbar (string)
         @param name optional name for the new toolbar (string)
         @return reference to the created toolbar (QToolBar)
         """
         if self.__mainWindow is None:
             return None
-        
+
         toolBar = QToolBar(title, self.__mainWindow)
         toolBar.setToolTip(title)
         if not name:
@@ -331,73 +327,73 @@
                 name = "{0}{1:d}".format(customPrefix, index)
         toolBar.setObjectName(name)
         self.__mainWindow.addToolBar(toolBar)
-        
+
         tbID = id(toolBar)
         self.__customToolBars.append(toolBar)
         self.__allToolBars[tbID] = toolBar
         self.__toolBars[tbID] = []
         self.__toolBarsWithSeparators[tbID] = []
-        
+
         if self.__ui is not None:
             toolBar.setIconSize(self.__ui.getToolBarIconSize())
             self.__ui.registerToolbar(name, title, toolBar)
-        
+
         return toolBar
-    
+
     def deleteToolBar(self, toolBar):
         """
         Public method to remove a custom toolbar created with createToolBar().
-        
+
         @param toolBar reference to the toolbar to be managed (QToolBar)
         """
         if toolBar is None:
             return
-        
+
         tbID = id(toolBar)
         if tbID not in self.__toolBars:
             return
         if tbID in self.__defaultToolBars:
             return
-        
+
         if self.__ui is not None:
             self.__ui.unregisterToolbar(toolBar.objectName())
-        
+
         self.setToolBar(toolBar, [])
-        
+
         del self.__allToolBars[tbID]
         del self.__toolBars[tbID]
         del self.__toolBarsWithSeparators[tbID]
         self.__customToolBars.remove(toolBar)
         self.__mainWindow.removeToolBar(toolBar)
         del toolBar
-    
+
     def renameToolBar(self, toolBar, title):
         """
         Public method to give a toolbar a new title.
-        
+
         @param toolBar reference to the toolbar to be managed (QToolBar)
         @param title title to be used for the toolbar (string)
         """
         if toolBar is None:
             return
-        
+
         toolBar.setWindowTitle(title)
-        
+
         if self.__ui is not None:
             self.__ui.reregisterToolbar(toolBar.objectName(), title)
-    
+
     def toolBars(self):
         """
         Public method to get all toolbars.
-        
+
         @return list of all toolbars (list of QToolBar)
         """
         return list(self.__allToolBars.values())
-    
+
     def addAction(self, action, category):
         """
         Public method to add an action to be managed.
-        
+
         @param action reference to the action to be managed (QAction)
         @param category category for the toolbar (string)
         """
@@ -407,7 +403,7 @@
             return
         if id(action) in self.__allActions:
             return
-        
+
         if action.metaObject().className() == "QWidgetAction":
             self.__widgetActions[id(action)] = None
             self.__allWidgetActions[id(action)] = action
@@ -417,11 +413,11 @@
         self.__categoryToActions[category].append(action)
         self.__actionToCategory[id(action)] = category
         self.__actionToToolBars[id(action)] = []
-    
+
     def addActions(self, actions, category):
         """
         Public method to add actions to be managed.
-        
+
         @param actions list of actions to be managed
         @type list of QAction
         @param category category for the toolbar
@@ -429,18 +425,18 @@
         """
         for action in actions:
             self.addAction(action, category)
-    
+
     def removeAction(self, action):
         """
         Public method to remove an action from the manager.
-        
+
         @param action reference to the action to be removed (QAction)
         """
         aID = id(action)
-        
+
         if aID not in self.__allActions:
             return
-        
+
         toolBars = self.__actionToToolBars[aID]
         for toolBar in toolBars:
             tbID = id(toolBar)
@@ -450,35 +446,35 @@
             if toolBar.isVisible():
                 toolBar.hide()
                 toolBar.show()
-        
+
         for tbID in self.__defaultToolBars:
             if action in self.__defaultToolBars[tbID]:
                 self.__defaultToolBars[tbID].remove(action)
-        
+
         del self.__allActions[aID]
         if aID in self.__widgetActions:
             del self.__widgetActions[aID]
             del self.__allWidgetActions[aID]
         del self.__actionToCategory[aID]
         del self.__actionToToolBars[aID]
-        
+
         for category in self.__categoryToActions:
             if action in self.__categoryToActions[category]:
                 self.__categoryToActions[category].remove(action)
-    
+
     def removeCategoryActions(self, category):
         """
         Public method to remove the actions belonging to a category.
-        
+
         @param category category for the actions (string)
         """
         for action in self.categoryActions(category):
             self.removeAction(action)
-    
+
     def saveState(self, version=0):
         """
         Public method to save the state of the toolbar manager.
-        
+
         @param version version number stored with the data (integer)
         @return saved state as a byte array (QByteArray)
         """
@@ -487,7 +483,7 @@
         stream.setVersion(QDataStream.Version.Qt_4_6)
         stream.writeUInt16(EricToolBarManager.VersionMarker)
         stream.writeUInt16(version)
-        
+
         # save default toolbars
         stream.writeUInt16(EricToolBarManager.ToolBarMarker)
         stream.writeUInt16(len(self.__defaultToolBars))
@@ -506,7 +502,7 @@
                         stream.writeString(action.text().encode("utf-8"))
                 else:
                     stream.writeString("".encode("utf-8"))
-        
+
         # save the custom toolbars
         stream.writeUInt16(EricToolBarManager.CustomToolBarMarker)
         stream.writeUInt16(len(self.__toolBars) - len(self.__defaultToolBars))
@@ -519,26 +515,25 @@
                 for action in self.__toolBars[tbID]:
                     if action is not None:
                         if action.objectName():
-                            stream.writeString(action.objectName()
-                                               .encode("utf-8"))
+                            stream.writeString(action.objectName().encode("utf-8"))
                         else:
                             stream.writeString(action.text().encode("utf-8"))
                     else:
                         stream.writeString("".encode("utf-8"))
-        
+
         return data
-    
+
     def restoreState(self, state, version=0):
         """
         Public method to restore the state of the toolbar manager.
-        
+
         @param state byte array containing the saved state (QByteArray)
         @param version version number stored with the data (integer)
         @return flag indicating success (boolean)
         """
         if state.isEmpty():
             return False
-        
+
         data = QByteArray(state)
         stream = QDataStream(data, QIODevice.OpenModeFlag.ReadOnly)
         stream.setVersion(QDataStream.Version.Qt_4_6)
@@ -546,11 +541,11 @@
         vers = stream.readUInt16()
         if marker != EricToolBarManager.VersionMarker or vers != version:
             return False
-        
+
         tmarker = stream.readUInt16()
         if tmarker != EricToolBarManager.ToolBarMarker:
             return False
-        
+
         toolBarCount = stream.readUInt16()
         for _i in range(toolBarCount):
             objectName = Utilities.readStringFromStream(stream)
@@ -567,13 +562,13 @@
             toolBar = self.__findDefaultToolBar(objectName)
             if toolBar is not None:
                 self.setToolBar(toolBar, actions)
-        
+
         cmarker = stream.readUInt16()
         if cmarker != EricToolBarManager.CustomToolBarMarker:
             return False
-        
+
         oldCustomToolBars = self.__customToolBars[:]
-        
+
         toolBarCount = stream.readUInt16()
         for _i in range(toolBarCount):
             objectName = Utilities.readStringFromStream(stream)
@@ -597,16 +592,16 @@
             if toolBar is not None:
                 toolBar.setObjectName(objectName)
                 self.setToolBar(toolBar, actions)
-        
+
         for tb in oldCustomToolBars:
             self.deleteToolBar(tb)
-        
+
         return True
-    
+
     def toolBarWidgetAction(self, action):
         """
         Public method to get the toolbar for a widget action.
-        
+
         @param action widget action to check for (QAction)
         @return reference to the toolbar containing action (QToolBar)
         """
@@ -614,11 +609,11 @@
         if aID in self.__widgetActions:
             return self.__widgetActions[aID]
         return None
-    
+
     def removeWidgetActions(self, actions):
         """
         Public method to remove widget actions.
-        
+
         @param actions dictionary with toolbar id as key and
             a list of widget actions as value
         """
@@ -626,100 +621,97 @@
             toolBar = self.__allToolBars[tbID]
             newActions = self.__toolBars[tbID][:]
             newActionsWithSeparators = self.__toolBarsWithSeparators[tbID][:]
-            
+
             removedActions = []
             for action in actions[tbID]:
-                if (
-                    action in newActions and
-                    self.toolBarWidgetAction(action) == toolBar
-                ):
+                if action in newActions and self.toolBarWidgetAction(action) == toolBar:
                     newActions.remove(action)
                     newActionsWithSeparators.remove(action)
                     removedActions.append(action)
-            
+
             self.__toolBars[tbID] = newActions
             self.__toolBarsWithSeparators[tbID] = newActionsWithSeparators
-            
+
             for action in removedActions:
                 self.__widgetActions[id(action)] = None
                 self.__actionToToolBars[id(action)].remove(toolBar)
                 toolBar.removeAction(action)
-    
+
     def isWidgetAction(self, action):
         """
         Public method to check, if action is a widget action.
-        
+
         @param action reference to the action to be checked (QAction)
         @return flag indicating a widget action (boolean)
         """
         return id(action) in self.__allWidgetActions
-    
+
     def categories(self):
         """
         Public method to get the list of categories.
-        
+
         @return list of categories (list of string)
         """
         return list(self.__categoryToActions.keys())
-    
+
     def categoryActions(self, category):
         """
         Public method to get the actions belonging to a category.
-        
+
         @param category category for the actions (string)
         @return list of actions (list of QAction)
         """
         if category not in self.__categoryToActions:
             return []
-        
+
         return self.__categoryToActions[category][:]
-    
+
     def actionById(self, aID):
         """
         Public method to get an action given its id.
-        
+
         @param aID id of the action object (integer)
         @return reference to the action (QAction)
         """
         if aID not in self.__allActions:
             return None
         return self.__allActions[aID]
-    
+
     def toolBarById(self, tbID):
         """
         Public method to get a toolbar given its id.
-        
+
         @param tbID id of the toolbar object (integer)
         @return reference to the toolbar (QToolBar)
         """
         if tbID not in self.__allToolBars:
             return None
         return self.__allToolBars[tbID]
-    
+
     def toolBarActions(self, tbID):
         """
         Public method to get a toolbar's actions given its id.
-        
+
         @param tbID id of the toolbar object (integer)
         @return list of actions (list of QAction)
         """
         if tbID not in self.__toolBars:
             return []
         return self.__toolBars[tbID][:]
-    
+
     def toolBarsActions(self):
         """
         Public method to get all toolbars and their actions.
-        
+
         @return reference to dictionary of toolbar IDs as key and list
             of actions as values
         """
         return self.__toolBars
-    
+
     def defaultToolBarActions(self, tbID):
         """
         Public method to get a default toolbar's actions given its id.
-        
+
         @param tbID id of the default toolbar object (integer)
         @return list of actions (list of QAction)
         """
--- a/src/eric7/EricWidgets/EricToolBox.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricToolBox.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     Class implementing a ToolBox class substituting QToolBox to support wheel
     events.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
@@ -30,20 +31,21 @@
     """
     Class implementing a vertical QToolBox like widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         EricTabWidget.__init__(self, parent)
         self.setTabPosition(QTabWidget.TabPosition.West)
         self.setUsesScrollButtons(True)
-    
+
     def addItem(self, widget, icon, text):
         """
         Public method to add a widget to the toolbox.
-        
+
         @param widget reference to the widget to be added (QWidget)
         @param icon the icon to be shown (QIcon)
         @param text the text to be shown (string)
@@ -52,11 +54,11 @@
         index = self.addTab(widget, icon, "")
         self.setTabToolTip(index, text)
         return index
-    
+
     def insertItem(self, index, widget, icon, text):
         """
         Public method to add a widget to the toolbox.
-        
+
         @param index position at which the widget should be inserted (integer)
         @param widget reference to the widget to be added (QWidget)
         @param icon the icon to be shown (QIcon)
@@ -66,28 +68,28 @@
         index = self.insertTab(index, widget, icon, "")
         self.setTabToolTip(index, text)
         return index
-    
+
     def removeItem(self, index):
         """
         Public method to remove a widget from the toolbox.
-        
+
         @param index index of the widget to remove (integer)
         """
         self.removeTab(index)
-    
+
     def setItemToolTip(self, index, toolTip):
         """
         Public method to set the tooltip of an item.
-        
+
         @param index index of the item (integer)
         @param toolTip tooltip text to be set (string)
         """
         self.setTabToolTip(index, toolTip)
-    
+
     def setItemEnabled(self, index, enabled):
         """
         Public method to set the enabled state of an item.
-        
+
         @param index index of the item (integer)
         @param enabled flag indicating the enabled state (boolean)
         """
--- a/src/eric7/EricWidgets/EricToolButton.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricToolButton.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,12 @@
 
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QTimer, QSize
 from PyQt6.QtWidgets import (
-    QToolButton, QStyle, QStyleOptionToolButton, QStyleOption, QApplication,
-    QLabel
+    QToolButton,
+    QStyle,
+    QStyleOptionToolButton,
+    QStyleOption,
+    QApplication,
+    QLabel,
 )
 
 
@@ -20,6 +24,7 @@
     """
     Class defining the tool button options.
     """
+
     DEFAULT = 0
     SHOW_MENU_INSIDE = 1
     TOOLBAR_LOOKUP = 2
@@ -28,7 +33,7 @@
 class EricToolButton(QToolButton):
     """
     Class implementing a specialized tool button subclass.
-    
+
     @signal aboutToShowMenu() emitted before the tool button menu is shown
     @signal aboutToHideMenu() emitted before the tool button menu is hidden
     @signal middleClicked() emitted when the middle mouse button was clicked
@@ -37,87 +42,90 @@
     @signal doubleClicked() emitted when the left mouse button was
         double clicked
     """
+
     aboutToShowMenu = pyqtSignal()
     aboutToHideMenu = pyqtSignal()
     middleClicked = pyqtSignal()
     controlClicked = pyqtSignal()
     doubleClicked = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setMinimumWidth(16)
-        
+
         self.__menu = None
         self.__options = EricToolButtonOptions.DEFAULT
-        
+
         self.__badgeLabel = QLabel(self)
         font = self.__badgeLabel.font()
         font.setPixelSize(int(self.__badgeLabel.height() / 2.5))
         self.__badgeLabel.setFont(font)
         self.__badgeLabel.hide()
-        
+
         opt = QStyleOptionToolButton()
         self.initStyleOption(opt)
-        
+
         self.__pressTimer = QTimer()
         self.__pressTimer.setSingleShot(True)
         self.__pressTimer.setInterval(
             QApplication.style().styleHint(
-                QStyle.StyleHint.SH_ToolButton_PopupDelay, opt, self))
+                QStyle.StyleHint.SH_ToolButton_PopupDelay, opt, self
+            )
+        )
         self.__pressTimer.timeout.connect(self.__showMenu)
-    
+
     ##################################################################
     ## Menu handling methods below.
     ##
     ## The menu is handled in EricToolButton and is not passed to
     ## QToolButton. No menu indicator will be shown in the button.
     ##################################################################
-    
+
     def menu(self):
         """
         Public method to get a reference to the tool button menu.
-        
+
         @return reference to the tool button menu
         @rtype QMenu
         """
         return self.__menu
-    
+
     def setMenu(self, menu):
         """
         Public method to set the tool button menu.
-        
+
         @param menu reference to the tool button menu
         @type QMenu
         """
         if menu is not None:
             if self.__menu:
                 self.__menu.aboutToHide.disconnect(self.__menuAboutToHide)
-            
+
             self.__menu = menu
             self.__menu.aboutToHide.connect(self.__menuAboutToHide)
-    
+
     def showMenuInside(self):
         """
         Public method to check, if the menu edge shall be aligned with
         the button.
-        
+
         @return flag indicating that the menu edge shall be aligned
         @rtype bool
         """
         return bool(self.__options & EricToolButtonOptions.SHOW_MENU_INSIDE)
-    
+
     def setShowMenuInside(self, enable):
         """
         Public method to set a flag to show the menu edge aligned with
         the button.
-        
+
         @param enable flag indicating to align the menu edge to the button
         @type bool
         """
@@ -125,7 +133,7 @@
             self.__options |= EricToolButtonOptions.SHOW_MENU_INSIDE
         else:
             self.__options &= ~EricToolButtonOptions.SHOW_MENU_INSIDE
-    
+
     @pyqtSlot()
     def __showMenu(self):
         """
@@ -133,23 +141,20 @@
         """
         if self.__menu is None or self.__menu.isVisible():
             return
-        
+
         self.aboutToShowMenu.emit()
-        
+
         if self.__options & EricToolButtonOptions.SHOW_MENU_INSIDE:
             pos = self.mapToGlobal(self.rect().bottomRight())
-            if (
-                QApplication.layoutDirection() ==
-                Qt.LayoutDirection.RightToLeft
-            ):
+            if QApplication.layoutDirection() == Qt.LayoutDirection.RightToLeft:
                 pos.setX(pos.x() - self.rect().width())
             else:
                 pos.setX(pos.x() - self.__menu.sizeHint().width())
         else:
             pos = self.mapToGlobal(self.rect().bottomLeft())
-        
+
         self.__menu.popup(pos)
-    
+
     @pyqtSlot()
     def __menuAboutToHide(self):
         """
@@ -157,129 +162,126 @@
         """
         self.setDown(False)
         self.aboutToHideMenu.emit()
-    
+
     ##################################################################
     ## Methods to handle the tool button look
     ##################################################################
-    
+
     def toolbarButtonLook(self):
         """
         Public method to check, if the button has the toolbar look.
-        
+
         @return flag indicating toolbar look
         @rtype bool
         """
         return bool(self.__options & EricToolButtonOptions.TOOLBAR_LOOKUP)
-    
+
     def setToolbarButtonLook(self, enable):
         """
         Public method to set the toolbar look state.
-        
+
         @param enable flag indicating toolbar look
         @type bool
         """
         if enable:
             self.__options |= EricToolButtonOptions.TOOLBAR_LOOKUP
-            
+
             opt = QStyleOption()
             opt.initFrom(self)
             size = self.style().pixelMetric(
-                QStyle.PixelMetric.PM_ToolBarIconSize, opt, self)
+                QStyle.PixelMetric.PM_ToolBarIconSize, opt, self
+            )
             self.setIconSize(QSize(size, size))
         else:
             self.__options &= ~EricToolButtonOptions.TOOLBAR_LOOKUP
-        
+
         self.setProperty("toolbar-look", enable)
         self.style().unpolish(self)
         self.style().polish(self)
-    
+
     ##################################################################
     ## Methods to handle some event types
     ##################################################################
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse press events.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         if self.popupMode() == QToolButton.ToolButtonPopupMode.DelayedPopup:
             self.__pressTimer.start()
-        
+
         if (
-            (evt.buttons() == Qt.MouseButton.LeftButton and
-             self.__menu is not None and
-             (self.popupMode() ==
-              QToolButton.ToolButtonPopupMode.InstantPopup)) or
-            (evt.buttons() == Qt.MouseButton.RightButton and
-             self.__menu is not None)
-        ):
+            evt.buttons() == Qt.MouseButton.LeftButton
+            and self.__menu is not None
+            and (self.popupMode() == QToolButton.ToolButtonPopupMode.InstantPopup)
+        ) or (evt.buttons() == Qt.MouseButton.RightButton and self.__menu is not None):
             self.setDown(True)
             self.__showMenu()
         else:
             super().mousePressEvent(evt)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse release events.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         self.__pressTimer.stop()
-        
-        if (
-            evt.button() == Qt.MouseButton.MiddleButton and
-            self.rect().contains(evt.position().toPoint())
+
+        if evt.button() == Qt.MouseButton.MiddleButton and self.rect().contains(
+            evt.position().toPoint()
         ):
             self.middleClicked.emit()
             self.setDown(False)
         elif (
-            evt.button() == Qt.MouseButton.LeftButton and
-            self.rect().contains(evt.position().toPoint()) and
-            evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+            evt.button() == Qt.MouseButton.LeftButton
+            and self.rect().contains(evt.position().toPoint())
+            and evt.modifiers() == Qt.KeyboardModifier.ControlModifier
         ):
             self.controlClicked.emit()
             self.setDown(False)
         else:
             super().mouseReleaseEvent(evt)
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double click events.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         super().mouseDoubleClickEvent(evt)
-        
+
         self.__pressTimer.stop()
-        
+
         if evt.buttons() == Qt.MouseButton.LeftButton:
             self.doubleClicked.emit()
-    
+
     def contextMenuEvent(self, evt):
         """
         Protected method to handle context menu events.
-        
+
         @param evt reference to the context menu event
         @type QContextMenuEvent
         """
         # block to prevent showing the context menu and the tool button menu
         if self.__menu is not None:
             return
-        
+
         super().contextMenuEvent(evt)
-    
+
     ##################################################################
     ## Methods to handle the tool button badge
     ##################################################################
-    
+
     def setBadgeText(self, text):
         """
         Public method to set the badge text.
-        
+
         @param text badge text to be set
         @type str
         """
@@ -291,11 +293,11 @@
         else:
             self.__badgeLabel.clear()
             self.__badgeLabel.hide()
-    
+
     def badgeText(self):
         """
         Public method to get the badge text.
-        
+
         @return badge text
         @rtype str
         """
--- a/src/eric7/EricWidgets/EricTreeView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTreeView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,41 +15,43 @@
     """
     Class implementing a tree view supporting removal of entries.
     """
+
     def keyPressEvent(self, evt):
         """
         Protected method implementing special key handling.
-        
+
         @param evt reference to the event (QKeyEvent)
         """
         if (
-            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace] and
-            self.model() is not None
+            evt.key() in [Qt.Key.Key_Delete, Qt.Key.Key_Backspace]
+            and self.model() is not None
         ):
             self.removeSelected()
             evt.setAccepted(True)
         else:
             super().keyPressEvent(evt)
-    
+
     def removeSelected(self):
         """
         Public method to remove the selected entries.
         """
         if (
-            self.model() is None or
-            self.selectionModel() is None or
-            not self.selectionModel().hasSelection()
+            self.model() is None
+            or self.selectionModel() is None
+            or not self.selectionModel().hasSelection()
         ):
             # no models available or nothing selected
             return
-        
+
         selectedRows = self.selectionModel().selectedRows()
         for idx in sorted(selectedRows, reverse=True):
             self.model().removeRow(idx.row(), idx.parent())
-    
+
     def removeAll(self):
         """
         Public method to clear the view.
         """
         if self.model() is not None:
-            self.model().removeRows(0, self.model().rowCount(self.rootIndex()),
-                                    self.rootIndex())
+            self.model().removeRows(
+                0, self.model().rowCount(self.rootIndex()), self.rootIndex()
+            )
--- a/src/eric7/EricWidgets/EricTreeWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricTreeWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class defining the items expansion state.
     """
+
     COLLAPSED = 0
     EXPANDED = 1
 
@@ -24,57 +25,58 @@
 class EricTreeWidget(QTreeWidget):
     """
     Class implementing an extended tree widget.
-    
+
     @signal itemControlClicked(QTreeWidgetItem) emitted after a Ctrl-Click
             on an item
     @signal itemMiddleButtonClicked(QTreeWidgetItem) emitted after a click
             of the middle button on an item
     """
+
     itemControlClicked = pyqtSignal(QTreeWidgetItem)
     itemMiddleButtonClicked = pyqtSignal(QTreeWidgetItem)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__refreshAllItemsNeeded = True
         self.__allTreeItems = []
         self.__showMode = EricTreeWidgetItemsState.COLLAPSED
-        
+
         self.setVerticalScrollMode(QAbstractItemView.ScrollMode.ScrollPerPixel)
-        
+
         self.itemChanged.connect(self.__scheduleRefresh)
-    
+
     def setDefaultItemShowMode(self, mode):
         """
         Public method to set the default item show mode.
-        
+
         @param mode default mode
         @type EricTreeWidgetItemsState
         """
         self.__showMode = mode
-    
+
     def allItems(self):
         """
         Public method to get a list of all items.
-        
+
         @return list of all items (list of QTreeWidgetItem)
         """
         if self.__refreshAllItemsNeeded:
             self.__allTreeItems = []
             self.__iterateAllItems(None)
             self.__refreshAllItemsNeeded = False
-        
+
         return self.__allTreeItems
-    
+
     def appendToParentItem(self, parent, item):
         """
         Public method to append an item to a parent item.
-        
+
         @param parent text of the parent item (string) or
             the parent item (QTreeWidgetItem)
         @param item item to be appended (QTreeWidgetItem)
@@ -84,7 +86,7 @@
         """
         if not isinstance(parent, (QTreeWidgetItem, str)):
             raise RuntimeError("illegal type for parent")
-        
+
         if isinstance(parent, QTreeWidgetItem):
             if parent is None or parent.treeWidget() != self:
                 return False
@@ -96,15 +98,15 @@
             parentItem = lst[0]
             if parentItem is None:
                 return False
-        
+
         self.__allTreeItems.append(item)
         parentItem.addChild(item)
         return True
-    
+
     def prependToParentItem(self, parent, item):
         """
         Public method to prepend an item to a parent item.
-        
+
         @param parent text of the parent item (string) or
             the parent item (QTreeWidgetItem)
         @param item item to be prepended (QTreeWidgetItem)
@@ -114,7 +116,7 @@
         """
         if not isinstance(parent, (QTreeWidgetItem, str)):
             raise RuntimeError("illegal type for parent")
-        
+
         if isinstance(parent, QTreeWidgetItem):
             if parent is None or parent.treeWidget() != self:
                 return False
@@ -126,82 +128,82 @@
             parentItem = lst[0]
             if parentItem is None:
                 return False
-        
+
         self.__allTreeItems.append(item)
         parentItem.insertChild(0, item)
         return True
-    
+
     def addTopLevelItem(self, item):
         """
         Public method to add a top level item.
-        
+
         @param item item to be added as a top level item (QTreeWidgetItem)
         """
         self.__allTreeItems.append(item)
         super().addTopLevelItem(item)
-    
+
     def addTopLevelItems(self, items):
         """
         Public method to add a list of top level items.
-        
+
         @param items items to be added as top level items
             (list of QTreeWidgetItem)
         """
         self.__allTreeItems.extend(items)
         super().addTopLevelItems(items)
-    
+
     def insertTopLevelItem(self, index, item):
         """
         Public method to insert a top level item.
-        
+
         @param index index for the insertion (integer)
         @param item item to be inserted as a top level item (QTreeWidgetItem)
         """
         self.__allTreeItems.append(item)
         super().insertTopLevelItem(index, item)
-    
+
     def insertTopLevelItems(self, index, items):
         """
         Public method to insert a list of top level items.
-        
+
         @param index index for the insertion (integer)
         @param items items to be inserted as top level items
             (list of QTreeWidgetItem)
         """
         self.__allTreeItems.extend(items)
         super().insertTopLevelItems(index, items)
-    
+
     def deleteItem(self, item):
         """
         Public method to delete an item.
-        
+
         @param item item to be deleted (QTreeWidgetItem)
         """
         if item in self.__allTreeItems:
             self.__allTreeItems.remove(item)
-        
+
         self.__refreshAllItemsNeeded = True
-        
+
         del item
-    
+
     def deleteItems(self, items):
         """
         Public method to delete a list of items.
-        
+
         @param items items to be deleted (list of QTreeWidgetItem)
         """
         for item in items:
             self.deleteItem(item)
-    
+
     def filterString(self, filterStr):
         """
         Public slot to set a new filter.
-        
+
         @param filterStr filter to be set (string)
         """
         self.expandAll()
         allItems = self.allItems()
-        
+
         if filterStr:
             lFilter = filterStr.lower()
             for itm in allItems:
@@ -209,21 +211,18 @@
                 itm.setExpanded(True)
             for index in range(self.topLevelItemCount()):
                 self.topLevelItem(index).setHidden(False)
-            
+
             firstItm = self.topLevelItem(0)
             belowItm = self.itemBelow(firstItm)
             topLvlIndex = 0
             while firstItm:
                 if lFilter in firstItm.text(0).lower():
                     firstItm.setHidden(False)
-                elif (
-                    not firstItm.parent() and
-                    (not belowItm or not belowItm.parent())
-                ):
+                elif not firstItm.parent() and (not belowItm or not belowItm.parent()):
                     firstItm.setHidden(True)
                 elif not belowItm:
                     break
-                
+
                 topLvlIndex += 1
                 firstItm = self.topLevelItem(topLvlIndex)
                 belowItm = self.itemBelow(firstItm)
@@ -234,51 +233,50 @@
                 self.topLevelItem(index).setHidden(False)
             if self.__showMode == EricTreeWidgetItemsState.COLLAPSED:
                 self.collapseAll()
-    
+
     def clear(self):
         """
         Public slot to clear the tree.
         """
         self.__allTreeItems = []
         super().clear()
-    
+
     def __scheduleRefresh(self):
         """
         Private slot to schedule a refresh of the tree.
         """
         self.__refreshAllItemsNeeded = True
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method handling mouse press events.
-        
+
         @param evt mouse press event (QMouseEvent)
         """
         if (
-            evt.modifiers() == Qt.KeyboardModifier.ControlModifier and
-            evt.buttons() == Qt.MouseButton.LeftButton
+            evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+            and evt.buttons() == Qt.MouseButton.LeftButton
         ):
             self.itemControlClicked.emit(self.itemAt(evt.position().toPoint()))
             return
         elif evt.buttons() == Qt.MouseButton.MiddleButton:
-            self.itemMiddleButtonClicked.emit(
-                self.itemAt(evt.position().toPoint()))
+            self.itemMiddleButtonClicked.emit(self.itemAt(evt.position().toPoint()))
             return
         else:
             super().mousePressEvent(evt)
-    
+
     def __iterateAllItems(self, parent):
         """
         Private method to iterate over the child items of the parent.
-        
+
         @param parent parent item to iterate (QTreeWidgetItem)
         """
         count = parent.childCount() if parent else self.topLevelItemCount()
-        
+
         for index in range(count):
             itm = parent.child(index) if parent else self.topLevelItem(index)
-            
+
             if itm.childCount() == 0:
                 self.__allTreeItems.append(itm)
-            
+
             self.__iterateAllItems(itm)
--- a/src/eric7/EricWidgets/EricZoomWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricWidgets/EricZoomWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,15 +16,16 @@
 class EricZoomWidget(QWidget, Ui_EricZoomWidget):
     """
     Class implementing a zoom widget for the status bar.
-    
+
     @signal valueChanged(value) emitted to indicate the new zoom value (int)
     """
+
     valueChanged = pyqtSignal(int)
-    
+
     def __init__(self, outPix, inPix, resetPix, parent=None):
         """
         Constructor
-        
+
         @param outPix pixmap for the zoom out button (QPixmap)
         @param inPix pixmap for the zoom in button (QPixmap)
         @param resetPix pixmap for the zoom reset button (QPixmap)
@@ -32,176 +33,176 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.zoomOutLabel.setPixmap(outPix.scaled(16, 16))
         self.zoomInLabel.setPixmap(inPix.scaled(16, 16))
         self.zoomResetLabel.setPixmap(resetPix.scaled(16, 16))
-        
+
         self.zoomOutLabel.clicked.connect(self.__zoomOut)
         self.zoomInLabel.clicked.connect(self.__zoomIn)
         self.zoomResetLabel.clicked.connect(self.__zoomReset)
-        
+
         self.slider.valueChanged.connect(self._sliderValueChanged)
-        
+
         self.__default = 0
         self.__percent = False
-        
+
         # mapped slider
         self.__mapped = False
         self.__mapping = []
-        
+
         self.__setValueLabelWidth()
-    
+
     @pyqtSlot(int)
     def on_slider_sliderMoved(self, value):
         """
         Private slot to handle changes of the zoom value.
-        
+
         @param value value of the slider (integer)
         """
         if self.__mapped:
             self.valueChanged.emit(self.__mapping[value])
         else:
             self.valueChanged.emit(value)
-    
+
     def setValue(self, value):
         """
         Public slot to set the value.
-        
+
         @param value new zoom value (integer)
         """
         self.slider.setValue(self.__indexForValue(value))
-    
+
     def value(self):
         """
         Public method to get the current value.
-        
+
         @return current zoom value (integer)
         """
         if self.__mapped:
             return self.__mapping[self.slider.value()]
         else:
             return self.slider.value()
-    
+
     def setMinimum(self, minimum):
         """
         Public method to set the minimum value.
-        
+
         @param minimum new minimum value (integer)
         """
         if not self.__mapped:
             self.slider.setMinimum(minimum)
             self.__setValueLabelWidth()
-    
+
     def minimum(self):
         """
         Public method to get the minimum value.
-        
+
         @return minimum value (integer)
         """
         if self.__mapped:
             return self.__mapping[0]
         else:
             return self.slider.minimum()
-    
+
     def setMaximum(self, maximum):
         """
         Public method to set the maximum value.
-        
+
         @param maximum new maximum value (integer)
         """
         if not self.__mapped:
             self.slider.setMaximum(maximum)
             self.__setValueLabelWidth()
-    
+
     def maximum(self):
         """
         Public method to get the maximum value.
-        
+
         @return maximum value (integer)
         """
         if self.__mapped:
             return self.__mapping[-1]
         else:
             return self.slider.maximum()
-    
+
     def setSingleStep(self, value):
         """
         Public method to set the single step value.
-        
+
         @param value value for the single step (integer)
         """
         self.slider.setSingleStep(value)
-    
+
     def singleStep(self):
         """
         Public method to get the single step value.
-        
+
         @return single step value (integer)
         """
         return self.slider.singleStep()
-    
+
     def setPageStep(self, value):
         """
         Public method to set the page step value.
-        
+
         @param value page step value (integer)
         """
         self.slider.setPageStep(value)
-    
+
     def pageStep(self):
         """
         Public method to get the page step value.
-        
+
         @return page step value (integer)
         """
         return self.slider.pageStep()
-    
+
     def setDefault(self, value):
         """
         Public method to set the default zoom value.
-        
+
         @param value default zoom value (integer)
         """
         self.__default = self.__indexForValue(value)
-    
+
     def default(self):
         """
         Public method to get the default zoom value.
-        
+
         @return default zoom value (integer)
         """
         if self.__mapped:
             return self.__mapping[self.__default]
         else:
             return self.__default
-    
+
     def setPercent(self, on):
         """
         Public method to set the percent mode of the widget.
-        
+
         @param on flag indicating percent mode (boolean)
         """
         self.__percent = on
         self.__setValueLabelWidth()
-    
+
     def isPercent(self):
         """
         Public method to get the percent mode.
-        
+
         @return flag indicating percent mode (boolean)
         """
         return self.__percent
-    
+
     def setMapping(self, mapping, default, percent=True):
         """
         Public method to set a zoom level mapping.
-        
+
         When zoom level mapping is activated, the slider covers
         values from 0 to the max. index of the mapping list. The
         default value is the value of the default zoom level. If
         percent is given, the zoom level is shown as a percent value.
-        
+
         @param mapping list of mapping values (list of integer)
         @param default index of the default value (integer)
         @param percent flag indicating to show zoom value in percent
@@ -225,65 +226,64 @@
             self.__percent = False
             self.slider.setValue(0)
         self.__setValueLabelWidth()
-    
+
     def mapping(self):
         """
         Public method to get the current mapping.
-        
+
         @return tuple of the mapping and the default index
             (list of integer, integer)
         """
         return self.__mapping[:], self.__default
-    
+
     def isMapped(self):
         """
         Public method to check for a mapped zoom widget.
-        
+
         @return flag indicating a mapped zoom widget (boolean)
         """
         return self.__mapped
-    
+
     def __zoomReset(self):
         """
         Private slot to reset the value.
         """
         self.slider.setValue(self.__default)
         self.valueChanged.emit(self.value())
-    
+
     def __zoomOut(self):
         """
         Private slot to zoom out one step.
         """
         self.slider.setValue(self.slider.value() - self.slider.singleStep())
         self.valueChanged.emit(self.value())
-    
+
     def __zoomIn(self):
         """
         Private slot to zoom in one step.
         """
         self.slider.setValue(self.slider.value() + self.slider.singleStep())
         self.valueChanged.emit(self.value())
-    
+
     def _sliderValueChanged(self, value):
         """
         Protected slot to handle changes of the slider value.
-        
+
         @param value slider value (integer)
         """
         val = self.__mapping[value] if self.__mapped else value
         fmtStr = "{0}%" if self.__percent else "{0}"
         self.valueLabel.setText(fmtStr.format(val))
         self.valueChanged.emit(val)
-    
+
     def __setValueLabelWidth(self):
         """
         Private slot to determine the width of the zoom value label.
         """
         labelLen = (
             max(len(str(v)) for v in self.__mapping)
-            if self.__mapped else
-            max(len(str(self.slider.maximum())),
-                len(str(self.slider.minimum())))
+            if self.__mapped
+            else max(len(str(self.slider.maximum())), len(str(self.slider.minimum())))
         )
         fmtStr = "{0}%" if self.__percent else "{0}"
         label = fmtStr.format("0" * labelLen)
@@ -293,11 +293,11 @@
             width = self.valueLabel.fontMetrics().width(label)
         self.valueLabel.setMinimumWidth(width)
         self.valueLabel.setMaximumWidth(width)
-    
+
     def __indexForValue(self, value):
         """
         Private method to get the nearest index for a given value.
-        
+
         @param value value to get the index for (integer)
         @return index into the mapping list or the unchanged value,
             if mapping is not set (integer)
--- a/src/eric7/EricXML/DebuggerPropertiesReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/DebuggerPropertiesReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,27 @@
     """
     Class for reading an XML project debugger properties file.
     """
+
     supportedVersions = ["3.9", "6.0"]
-    
+
     def __init__(self, device, project):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param project Reference to the project object to store the
                 information into.
         """
         XMLStreamReaderBase.__init__(self, device)
-    
+
         self.project = project
-        
+
         self.version = ""
-    
+
     def readXML(self, quiet=False):
         """
         Public method to read and parse the XML document.
-        
+
         @param quiet flag indicating quiet operations.
                 If this flag is true, no errors are reported.
         """
@@ -44,96 +45,85 @@
             if self.isStartElement():
                 if self.name() == "DebuggerProperties":
                     self.version = self.attribute(
-                        "version", debuggerPropertiesFileFormatVersion)
+                        "version", debuggerPropertiesFileFormatVersion
+                    )
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "VirtualEnv":
-                    self.project.debugProperties["VIRTUALENV"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties["VIRTUALENV"] = self.readElementText()
                 elif self.name() == "Interpreter":
                     # just read this obsolete entry and ignore it
                     self.readElementText()
                 elif self.name() == "DebugClient":
-                    self.project.debugProperties["DEBUGCLIENT"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties["DEBUGCLIENT"] = self.readElementText()
                 elif self.name() == "Environment":
-                    self.project.debugProperties["ENVIRONMENTOVERRIDE"] = (
-                        int(self.attribute("override", "0"))
+                    self.project.debugProperties["ENVIRONMENTOVERRIDE"] = int(
+                        self.attribute("override", "0")
                     )
-                    self.project.debugProperties["ENVIRONMENTSTRING"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties[
+                        "ENVIRONMENTSTRING"
+                    ] = self.readElementText()
                 elif self.name() == "RemoteDebugger":
                     self.__readRemoteDebugger()
                 elif self.name() == "PathTranslation":
                     self.__readPathTranslation()
                 elif self.name() == "ConsoleDebugger":
-                    self.project.debugProperties["CONSOLEDEBUGGER"] = (
-                        int(self.attribute("on", "0"))
+                    self.project.debugProperties["CONSOLEDEBUGGER"] = int(
+                        self.attribute("on", "0")
                     )
-                    self.project.debugProperties["CONSOLECOMMAND"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties[
+                        "CONSOLECOMMAND"
+                    ] = self.readElementText()
                 elif self.name() == "Redirect":
-                    self.project.debugProperties["REDIRECT"] = (
-                        int(self.attribute("on", "1"))
+                    self.project.debugProperties["REDIRECT"] = int(
+                        self.attribute("on", "1")
                     )
                 elif self.name() == "Noencoding":
-                    self.project.debugProperties["NOENCODING"] = (
-                        int(self.attribute("on", "0"))
+                    self.project.debugProperties["NOENCODING"] = int(
+                        self.attribute("on", "0")
                     )
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         if not quiet:
             self.showErrorMessage()
-    
+
     def __readRemoteDebugger(self):
         """
         Private method to read the remote debugger info.
         """
-        self.project.debugProperties["REMOTEDEBUGGER"] = int(self.attribute(
-            "on", "0"))
-        
+        self.project.debugProperties["REMOTEDEBUGGER"] = int(self.attribute("on", "0"))
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "RemoteDebugger":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "RemoteHost":
-                    self.project.debugProperties["REMOTEHOST"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties["REMOTEHOST"] = self.readElementText()
                 elif self.name() == "RemoteCommand":
-                    self.project.debugProperties["REMOTECOMMAND"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties[
+                        "REMOTECOMMAND"
+                    ] = self.readElementText()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readPathTranslation(self):
         """
         Private method to read the path translation info.
         """
-        self.project.debugProperties["PATHTRANSLATION"] = int(self.attribute(
-            "on", "0"))
-        
+        self.project.debugProperties["PATHTRANSLATION"] = int(self.attribute("on", "0"))
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "PathTranslation":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "RemotePath":
-                    self.project.debugProperties["REMOTEPATH"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties["REMOTEPATH"] = self.readElementText()
                 elif self.name() == "LocalPath":
-                    self.project.debugProperties["LOCALPATH"] = (
-                        self.readElementText()
-                    )
+                    self.project.debugProperties["LOCALPATH"] = self.readElementText()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
--- a/src/eric7/EricXML/HighlightingStylesReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/HighlightingStylesReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,79 +16,78 @@
     """
     Class for reading a highlighting styles XML file.
     """
+
     supportedVersions = ["4.3", "6.0"]
-    
+
     def __init__(self, device, lexers):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param lexers dictionary of lexer objects for which to import the
             styles
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.lexers = lexers
-        
+
         self.version = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
-        
+
         @return list of read lexer style definitions
         @rtype list of dict
         """
         self.__lexersList = []
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 if self.name() == "HighlightingStyles":
                     self.version = self.attribute(
-                        "version",
-                        highlightingStylesFileFormatVersion)
+                        "version", highlightingStylesFileFormatVersion
+                    )
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "Lexer":
                     self.__readLexer()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-        
+
         return self.__lexersList
-    
+
     def __readLexer(self):
         """
         Private method to read the lexer info.
         """
         language = self.attribute("name")
-        self.__lexersList.append({
-            "name": language,
-            "styles": [],
-        })
-        lexer = (
-            self.lexers[language]
-            if language and language in self.lexers else
-            None
+        self.__lexersList.append(
+            {
+                "name": language,
+                "styles": [],
+            }
         )
-        
+        lexer = self.lexers[language] if language and language in self.lexers else None
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Lexer":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Style":
                     self.__readStyle(lexer)
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readStyle(self, lexer):
         """
         Private method to read the style info.
-        
+
         @param lexer reference to the lexer object
         """
         if lexer is not None:
@@ -97,36 +96,30 @@
                 style = int(style)
                 substyle = int(self.attribute("substyle", "-1"))
                 # -1 is default for base styles
-                
+
                 styleDict = {
                     "style": style,
                     "substyle": substyle,
                 }
-                
+
                 color = self.attribute("color")
                 if color:
                     styleDict["color"] = color
                 else:
-                    styleDict["color"] = (
-                        lexer.defaultColor(style, substyle).name()
-                    )
-                
+                    styleDict["color"] = lexer.defaultColor(style, substyle).name()
+
                 paper = self.attribute("paper")
                 if paper:
                     styleDict["paper"] = paper
                 else:
-                    styleDict["paper"] = (
-                        lexer.defaultPaper(style, substyle).name()
-                    )
-                
+                    styleDict["paper"] = lexer.defaultPaper(style, substyle).name()
+
                 fontStr = self.attribute("font")
                 if fontStr:
                     styleDict["font"] = fontStr
                 else:
-                    styleDict["font"] = (
-                        lexer.defaultFont(style, substyle).toString()
-                    )
-                
+                    styleDict["font"] = lexer.defaultFont(style, substyle).toString()
+
                 eolfill = self.attribute("eolfill")
                 if eolfill:
                     eolfill = self.toBool(eolfill)
@@ -135,22 +128,21 @@
                 else:
                     eolfill = lexer.defaulEolFill(style, substyle)
                 styleDict["eolfill"] = eolfill
-        
+
                 while not self.atEnd():
                     self.readNext()
                     if self.isStartElement():
                         if self.name() == "Description":
                             description = self.readElementText().strip()
                             if not description:
-                                description = lexer.defaultDescription(
-                                    style, substyle)
+                                description = lexer.defaultDescription(style, substyle)
                             styleDict["description"] = description
                         elif self.name() == "Words":
                             words = self.readElementText().strip()
                             if not words:
                                 words = lexer.defaultWords(style, substyle)
                             styleDict["words"] = words
-                    
+
                     if self.isEndElement() and self.name() == "Style":
                         if "description" not in styleDict:
                             styleDict["description"] = ""
@@ -158,7 +150,7 @@
                             styleDict["words"] = ""
                         self.__lexersList[-1]["styles"].append(styleDict)
                         return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Style":
--- a/src/eric7/EricXML/MultiProjectReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/MultiProjectReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,23 +19,24 @@
     """
     Class for reading an XML multi project file.
     """
+
     supportedVersions = ["4.2", "5.0", "5.1"]
-    
+
     def __init__(self, device, multiProject):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param multiProject Reference to the multi project object to store the
                 information into.
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.multiProject = multiProject
         self.path = os.path.dirname(device.fileName())
-        
+
         self.version = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -45,8 +46,8 @@
             if self.isStartElement():
                 if self.name() == "MultiProject":
                     self.version = self.attribute(
-                        "version",
-                        multiProjectFileFormatVersion)
+                        "version", multiProjectFileFormatVersion
+                    )
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "Description":
@@ -55,9 +56,9 @@
                     self.__readProjects()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-    
+
     def __readProjects(self):
         """
         Private method to read the project infos.
@@ -66,19 +67,19 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Projects":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Project":
                     self.__readProject()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readProject(self):
         """
         Private method to read the project info.
         """
         project = {}
-        
+
         project["master"] = self.toBool(self.attribute("isMaster", "False"))
         uid = self.attribute("uid", "")
         if uid:
@@ -86,23 +87,25 @@
         else:
             # upgrade from pre 5.1 format
             from PyQt6.QtCore import QUuid
+
             project["uid"] = QUuid.createUuid().toString()
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Project":
-                if 'category' not in project:
+                if "category" not in project:
                     # upgrade from 4.2 format
                     project["category"] = ""
                 self.multiProject.addProject(project)
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "ProjectName":
                     project["name"] = self.readElementText()
                 elif self.name() == "ProjectFile":
                     project["file"] = Utilities.absoluteUniversalPath(
-                        self.readElementText(), self.path)
+                        self.readElementText(), self.path
+                    )
                 elif self.name() == "ProjectDescription":
                     project["description"] = self.readElementText()
                 elif self.name() == "ProjectCategory":
--- a/src/eric7/EricXML/PluginRepositoryReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/PluginRepositoryReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,22 +17,23 @@
     """
     Class to read the plug-in repository contents file.
     """
+
     supportedVersions = ["4.1", "4.2"]
-    
+
     def __init__(self, device, entryCallback):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param entryCallback reference to a function to be called once the
             data for a plug-in has been read (function)
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.__entryCallback = entryCallback
-        
+
         self.version = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -42,8 +43,8 @@
             if self.isStartElement():
                 if self.name() == "Plugins":
                     self.version = self.attribute(
-                        "version",
-                        pluginRepositoryFileFormatVersion)
+                        "version", pluginRepositoryFileFormatVersion
+                    )
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "RepositoryUrl":
@@ -53,33 +54,39 @@
                     self.__readPlugin()
                 else:
                     self._skipUnknownElement()
-        
+
         self.showErrorMessage()
-    
+
     def __readPlugin(self):
         """
         Private method to read the plug-in info.
         """
-        pluginInfo = {"name": "",
-                      "short": "",
-                      "description": "",
-                      "url": "",
-                      "author": "",
-                      "version": "",
-                      "filename": "",
-                      }
+        pluginInfo = {
+            "name": "",
+            "short": "",
+            "description": "",
+            "url": "",
+            "author": "",
+            "version": "",
+            "filename": "",
+        }
         pluginInfo["status"] = self.attribute("status", "unknown")
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Plugin":
                 self.__entryCallback(
-                    pluginInfo["name"], pluginInfo["short"],
-                    pluginInfo["description"], pluginInfo["url"],
-                    pluginInfo["author"], pluginInfo["version"],
-                    pluginInfo["filename"], pluginInfo["status"])
+                    pluginInfo["name"],
+                    pluginInfo["short"],
+                    pluginInfo["description"],
+                    pluginInfo["url"],
+                    pluginInfo["author"],
+                    pluginInfo["version"],
+                    pluginInfo["filename"],
+                    pluginInfo["status"],
+                )
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Name":
                     pluginInfo["name"] = self.readElementText()
--- a/src/eric7/EricXML/ProjectReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/ProjectReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,24 +17,23 @@
     """
     Class for reading an XML project file.
     """
-    supportedVersions = ["4.6",
-                         "5.0", "5.1",
-                         "6.0", "6.1", "6.2", "6.3", "6.4", "6.5"]
-    
+
+    supportedVersions = ["4.6", "5.0", "5.1", "6.0", "6.1", "6.2", "6.3", "6.4", "6.5"]
+
     def __init__(self, device, project):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param project Reference to the project object to store the
                 information into.
         """
         XMLStreamReaderBase.__init__(self, device)
-    
+
         self.project = project
-        
+
         self.version = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -43,21 +42,18 @@
             self.readNext()
             if self.isStartElement():
                 if self.name() == "Project":
-                    self.version = self.attribute(
-                        "version", projectFileFormatVersion)
+                    self.version = self.attribute("version", projectFileFormatVersion)
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "Language":
-                    self.project.pdata["SPELLLANGUAGE"] = (
+                    self.project.pdata["SPELLLANGUAGE"] = self.readElementText()
+                elif self.name() == "ProjectWordList":
+                    self.project.pdata["SPELLWORDS"] = Utilities.toNativeSeparators(
                         self.readElementText()
                     )
-                elif self.name() == "ProjectWordList":
-                    self.project.pdata["SPELLWORDS"] = (
-                        Utilities.toNativeSeparators(self.readElementText())
-                    )
                 elif self.name() == "ProjectExcludeList":
-                    self.project.pdata["SPELLEXCLUDES"] = (
-                        Utilities.toNativeSeparators(self.readElementText())
+                    self.project.pdata["SPELLEXCLUDES"] = Utilities.toNativeSeparators(
+                        self.readElementText()
                     )
                 elif self.name() == "Hash":
                     self.project.pdata["HASH"] = self.readElementText()
@@ -80,28 +76,27 @@
                 elif self.name() == "Email":
                     self.project.pdata["EMAIL"] = self.readElementText()
                 elif self.name() == "TranslationPattern":
-                    self.project.pdata["TRANSLATIONPATTERN"] = (
-                        Utilities.toNativeSeparators(self.readElementText())
-                    )
+                    self.project.pdata[
+                        "TRANSLATIONPATTERN"
+                    ] = Utilities.toNativeSeparators(self.readElementText())
                 elif self.name() == "TranslationsBinPath":
-                    self.project.pdata["TRANSLATIONSBINPATH"] = (
-                        Utilities.toNativeSeparators(self.readElementText())
-                    )
+                    self.project.pdata[
+                        "TRANSLATIONSBINPATH"
+                    ] = Utilities.toNativeSeparators(self.readElementText())
                 elif self.name() == "Eol":
-                    self.project.pdata["EOL"] = int(
-                        self.attribute("index", "0")
-                    )
+                    self.project.pdata["EOL"] = int(self.attribute("index", "0"))
                 elif self.name() == "Sources":
                     self.__readFiles("Sources", "Source", "SOURCES")
                 elif self.name() == "Forms":
                     self.__readFiles("Forms", "Form", "FORMS")
                 elif self.name() == "Translations":
-                    self.__readFiles(
-                        "Translations", "Translation", "TRANSLATIONS")
+                    self.__readFiles("Translations", "Translation", "TRANSLATIONS")
                 elif self.name() == "TranslationExceptions":
                     self.__readFiles(
-                        "TranslationExceptions", "TranslationException",
-                        "TRANSLATIONEXCEPTIONS")
+                        "TranslationExceptions",
+                        "TranslationException",
+                        "TRANSLATIONEXCEPTIONS",
+                    )
                 elif self.name() == "Resources":
                     self.__readFiles("Resources", "Resource", "RESOURCES")
                 elif self.name() == "Interfaces":
@@ -111,8 +106,8 @@
                 elif self.name() == "Others":
                     self.__readFiles("Others", "Other", "OTHERS")
                 elif self.name() == "MainScript":
-                    self.project.pdata["MAINSCRIPT"] = (
-                        Utilities.toNativeSeparators(self.readElementText())
+                    self.project.pdata["MAINSCRIPT"] = Utilities.toNativeSeparators(
+                        self.readElementText()
                     )
                 elif self.name() == "Vcs":
                     self.__readVcs()
@@ -121,45 +116,52 @@
                 elif self.name() == "LexerAssociations":
                     self.__readLexerAssociations()
                 elif self.name() == "Make":
-                    self.__readBasicDataField(
-                        "Make", "MakeParameters", "MAKEPARAMS")
+                    self.__readBasicDataField("Make", "MakeParameters", "MAKEPARAMS")
                 elif self.name() == "IdlCompiler":
                     self.__readBasicDataField(
-                        "IdlCompiler", "IdlCompilerParameters", "IDLPARAMS")
+                        "IdlCompiler", "IdlCompilerParameters", "IDLPARAMS"
+                    )
                 elif self.name() == "UicCompiler":
                     self.__readBasicDataField(
-                        "UicCompiler", "UicCompilerParameters", "UICPARAMS")
+                        "UicCompiler", "UicCompilerParameters", "UICPARAMS"
+                    )
                 elif self.name() == "RccCompiler":
                     self.__readBasicDataField(
-                        "RccCompiler", "RccCompilerParameters", "RCCPARAMS")
+                        "RccCompiler", "RccCompilerParameters", "RCCPARAMS"
+                    )
                 elif self.name() == "DocstringStyle":
                     self.project.pdata["DOCSTRING"] = self.readElementText()
                 elif self.name() == "ProjectTypeSpecific":
                     self.__readBasicDataField(
-                        "ProjectTypeSpecific", "ProjectTypeSpecificData",
-                        "PROJECTTYPESPECIFICDATA")
+                        "ProjectTypeSpecific",
+                        "ProjectTypeSpecificData",
+                        "PROJECTTYPESPECIFICDATA",
+                    )
                 elif self.name() == "Documentation":
                     self.__readBasicDataField(
-                        "Documentation", "DocumentationParams",
-                        "DOCUMENTATIONPARMS")
+                        "Documentation", "DocumentationParams", "DOCUMENTATIONPARMS"
+                    )
                 elif self.name() == "Packagers":
                     self.__readBasicDataField(
-                        "Packagers", "PackagersParams", "PACKAGERSPARMS")
+                        "Packagers", "PackagersParams", "PACKAGERSPARMS"
+                    )
                 elif self.name() == "Checkers":
                     self.__readBasicDataField(
-                        "Checkers", "CheckersParams", "CHECKERSPARMS")
+                        "Checkers", "CheckersParams", "CHECKERSPARMS"
+                    )
                 elif self.name() == "OtherTools":
                     self.__readBasicDataField(
-                        "OtherTools", "OtherToolsParams", "OTHERTOOLSPARMS")
+                        "OtherTools", "OtherToolsParams", "OTHERTOOLSPARMS"
+                    )
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-    
+
     def __readFiles(self, tag, listTag, dataKey):
         """
         Private method to read a list of files.
-        
+
         @param tag name of the list tag (string)
         @param listTag name of the list element tag (string)
         @param dataKey key of the project data element (string)
@@ -168,18 +170,19 @@
             self.readNext()
             if self.isEndElement() and self.name() == tag:
                 break
-            
+
             if self.isStartElement():
                 if self.name() == listTag:
                     self.project.pdata[dataKey].append(
-                        Utilities.toNativeSeparators(self.readElementText()))
+                        Utilities.toNativeSeparators(self.readElementText())
+                    )
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readBasicDataField(self, tag, dataTag, dataKey):
         """
         Private method to read a list of files.
-        
+
         @param tag name of the list tag (string)
         @param dataTag name of the data tag (string)
         @param dataKey key of the project data element (string)
@@ -188,13 +191,13 @@
             self.readNext()
             if self.isEndElement() and self.name() == tag:
                 break
-            
+
             if self.isStartElement():
                 if self.name() == dataTag:
                     self.project.pdata[dataKey] = self._readBasics()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readVcs(self):
         """
         Private method to read the VCS info.
@@ -203,7 +206,7 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Vcs":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "VcsType":
                     self.project.pdata["VCS"] = self.readElementText()
@@ -213,7 +216,7 @@
                     self.project.pdata["VCSOTHERDATA"] = self._readBasics()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readFiletypeAssociations(self):
         """
         Private method to read the file type associations.
@@ -222,7 +225,7 @@
             self.readNext()
             if self.isEndElement() and self.name() == "FiletypeAssociations":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "FiletypeAssociation":
                     pattern = self.attribute("pattern", "")
@@ -231,7 +234,7 @@
                         self.project.pdata["FILETYPES"][pattern] = filetype
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readLexerAssociations(self):
         """
         Private method to read the lexer associations.
@@ -240,7 +243,7 @@
             self.readNext()
             if self.isEndElement() and self.name() == "LexerAssociations":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "LexerAssociation":
                     pattern = self.attribute("pattern", "")
--- a/src/eric7/EricXML/SessionReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/SessionReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,30 +17,30 @@
     """
     Class for reading an XML session file.
     """
-    supportedVersions = ["4.3", "4.4", "5.0", "6.0", "6.1", "6.2", "6.3",
-                         "6.4"]
-    
+
+    supportedVersions = ["4.3", "4.4", "5.0", "6.0", "6.1", "6.2", "6.3", "6.4"]
+
     def __init__(self, device, isGlobal):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from
         @type QIODevice
         @param isGlobal flag indicating to read the global session
         @type bool
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.version = ""
         self.isGlobal = isGlobal
-        
+
         self.project = ericApp().getObject("Project")
         self.projectBrowser = ericApp().getObject("ProjectBrowser")
         self.multiProject = ericApp().getObject("MultiProject")
         self.vm = ericApp().getObject("ViewManager")
         self.dbg = ericApp().getObject("DebugUI")
         self.dbs = ericApp().getObject("DebugServer")
-        
+
         if not self.isGlobal:
             # clear all breakpoints and bookmarks first
             # (in case we are rereading a session file)
@@ -51,11 +51,11 @@
                     editor.clearBookmarks()
             self.dbs.getBreakPointModel().deleteAll()
             self.dbs.getWatchPointModel().deleteAll()
-    
+
     def readXML(self, quiet=False):
         """
         Public method to read and parse the XML document.
-        
+
         @param quiet flag indicating quiet operations.
             If this flag is true, no errors are reported.
         @type bool
@@ -64,13 +64,11 @@
             self.readNext()
             if self.isStartElement():
                 if self.name() == "Session":
-                    self.version = self.attribute(
-                        "version", sessionFileFormatVersion)
+                    self.version = self.attribute("version", sessionFileFormatVersion)
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "MultiProject":
-                    self.multiProject.openMultiProject(
-                        self.readElementText(), False)
+                    self.multiProject.openMultiProject(self.readElementText(), False)
                 elif self.name() == "Project":
                     self.project.openProject(self.readElementText(), False)
                 elif self.name() == "Filenames":
@@ -101,10 +99,10 @@
                     self.vm.setSplitCount(splitCount)
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         if not quiet:
             self.showErrorMessage()
-    
+
     def __readFilenames(self):
         """
         Private method to read the file name infos.
@@ -114,14 +112,14 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Filenames":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Filename":
                     cline = int(self.attribute("cline", "0"))
                     cindex = int(self.attribute("cindex", "0"))
                     folds = self.attribute("folds")
                     if folds:
-                        folds = [int(f) - 1 for f in folds.split(',')]
+                        folds = [int(f) - 1 for f in folds.split(",")]
                     else:
                         folds = []
                     zoom = int(self.attribute("zoom", "-9999"))
@@ -129,15 +127,19 @@
                     splitIndex = int(self.attribute("splitindex", "0"))
                     editorIndex = int(self.attribute("editorindex", "-1"))
                     filename = self.readElementText()
-                    
+
                     if cloned and filename in editorDict:
                         editor = editorDict[filename]
                         ed = self.vm.newEditorView(
-                            filename, editor, editor.getFileType(),
-                            indexes=(splitIndex, editorIndex))
+                            filename,
+                            editor,
+                            editor.getFileType(),
+                            indexes=(splitIndex, editorIndex),
+                        )
                     else:
                         ed = self.vm.openSourceFile(
-                            filename, indexes=(splitIndex, editorIndex))
+                            filename, indexes=(splitIndex, editorIndex)
+                        )
                         editorDict[filename] = ed
                     if ed is not None:
                         if zoom > -9999:
@@ -149,7 +151,7 @@
                         ed.ensureCursorVisible()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readBreakpoints(self):
         """
         Private method to read the break point infos.
@@ -158,13 +160,13 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Breakpoints":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Breakpoint":
                     self.__readBreakpoint()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readBreakpoint(self):
         """
         Private method to read the break point info.
@@ -175,14 +177,15 @@
         bpTemp = False
         bpEnabled = True
         bpCount = 0
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Breakpoint":
                 self.dbs.getBreakPointModel().addBreakPoint(
-                    filename, lineno, (bpCond, bpTemp, bpEnabled, bpCount))
+                    filename, lineno, (bpCond, bpTemp, bpEnabled, bpCount)
+                )
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "BpFilename":
                     filename = self.readElementText()
@@ -190,8 +193,8 @@
                     lineno = int(self.attribute("value", "0"))
                 elif self.name() == "Condition":
                     bpCond = self.readElementText()
-                    if bpCond == 'None':
-                        bpCond = ''
+                    if bpCond == "None":
+                        bpCond = ""
                 elif self.name() == "Temporary":
                     bpTemp = self.toBool(self.attribute("value", "False"))
                 elif self.name() == "Enabled":
@@ -200,7 +203,7 @@
                     bpCount = int(self.attribute("value", "0"))
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readWatchexpressions(self):
         """
         Private method to read watch expression infos.
@@ -209,13 +212,13 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Watchexpressions":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Watchexpression":
                     self.__readWatchexpression()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readWatchexpression(self):
         """
         Private method to read the watch expression info.
@@ -225,19 +228,20 @@
         weEnabled = True
         weCount = 0
         weSpecialCond = ""
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Watchexpression":
                 self.dbs.getWatchPointModel().addWatchPoint(
-                    weCond, weSpecialCond, (weTemp, weEnabled, weCount))
+                    weCond, weSpecialCond, (weTemp, weEnabled, weCount)
+                )
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Condition":
                     weCond = self.readElementText()
-                    if weCond == 'None':
-                        weCond = ''
+                    if weCond == "None":
+                        weCond = ""
                 elif self.name() == "Temporary":
                     weTemp = self.toBool(self.attribute("value", "False"))
                 elif self.name() == "Enabled":
@@ -248,14 +252,14 @@
                     weSpecialCond = self.readElementText()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readDebugInfo(self):
         """
         Private method to read the debug infos.
         """
         dbgExcList = []
         dbgExcIgnoreList = []
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
@@ -269,11 +273,10 @@
                     self.dbg.setExcIgnoreList(dbgExcIgnoreList)
                     if not self.isGlobal:
                         self.project.dbgExcIgnoreList = dbgExcIgnoreList[:]
-            
+
             if self.isStartElement():
-                if self.name() in ("Exceptions", "IgnoredExceptions",
-                                   "CovexcPattern"):
-                    pass    # ignore these start tags
+                if self.name() in ("Exceptions", "IgnoredExceptions", "CovexcPattern"):
+                    pass  # ignore these start tags
                 elif self.name() == "VirtualEnv":
                     txt = self.readElementText()
                     self.dbg.lastUsedVenvName = txt
@@ -341,7 +344,7 @@
                         self.project.dbgGlobalConfigOverride = configOverride
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readBookmarks(self):
         """
         Private method to read the bookmark infos.
@@ -350,20 +353,20 @@
             self.readNext()
             if self.isEndElement() and self.name() == "Bookmarks":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Bookmark":
                     self.__readBookmark()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readBookmark(self):
         """
         Private method to read the bookmark info.
         """
         filename = ""
         lineno = 0
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Bookmark":
@@ -371,7 +374,7 @@
                 if editor is not None:
                     editor.toggleBookmark(lineno)
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "BmFilename":
                     filename = self.readElementText()
@@ -379,7 +382,7 @@
                     lineno = int(self.attribute("value", "0"))
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readProjectBrowserStates(self):
         """
         Private method to read the project browser state infos.
@@ -388,7 +391,7 @@
             self.readNext()
             if self.isEndElement() and self.name() == "ProjectBrowserStates":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "ProjectBrowserState":
                     browserName = self.attribute("name", "")
@@ -397,25 +400,24 @@
                     self.__readProjectBrowserState(browserName)
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
     def __readProjectBrowserState(self, browserName):
         """
         Private method to read the project browser state info.
-        
+
         @param browserName name of the project browser
         @type str
         """
         expandedNames = []
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "ProjectBrowserState":
-                projectBrowser = self.projectBrowser.getProjectBrowser(
-                    browserName)
+                projectBrowser = self.projectBrowser.getProjectBrowser(browserName)
                 if projectBrowser is not None:
                     projectBrowser.expandItemsByName(expandedNames)
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "ExpandedItemName":
                     itemName = self.readElementText()
--- a/src/eric7/EricXML/ShortcutsReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/ShortcutsReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,19 +15,20 @@
     """
     Class for reading an XML shortcuts file.
     """
+
     supportedVersions = ["3.6"]
-    
+
     def __init__(self, device):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.version = ""
         self.shortcuts = {}
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -36,17 +37,16 @@
             self.readNext()
             if self.isStartElement():
                 if self.name() == "Shortcuts":
-                    self.version = self.attribute(
-                        "version", shortcutsFileFormatVersion)
+                    self.version = self.attribute("version", shortcutsFileFormatVersion)
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "Shortcut":
                     self.__readShortCut()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-    
+
     def __readShortCut(self):
         """
         Private method to read the shortcut data.
@@ -55,7 +55,7 @@
         name = ""
         accel = ""
         altAccel = ""
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Shortcut":
@@ -64,7 +64,7 @@
                         self.shortcuts[category] = {}
                     self.shortcuts[category][name] = (accel, altAccel)
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Name":
                     name = self.readElementText()
@@ -74,11 +74,11 @@
                     altAccel = self.readElementText()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def getShortcuts(self):
         """
         Public method to retrieve the shortcuts.
-        
+
         @return Dictionary of dictionaries of shortcuts. The keys of the
             dictionary are the categories, the values are dictionaries.
             These dictionaries have the shortcut name as their key and
--- a/src/eric7/EricXML/SpellCheckDictionariesReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/SpellCheckDictionariesReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,23 +17,26 @@
     """
     Class to read the web browser spell check dictionaries list file.
     """
-    supportedVersions = ["1.0", ]
-    
+
+    supportedVersions = [
+        "1.0",
+    ]
+
     def __init__(self, data, entryCallback):
         """
         Constructor
-        
+
         @param data reference to the data array to read XML from (QByteArray)
         @param entryCallback reference to a function to be called once the
             data for a dictionary has been read (function)
         """
         XMLStreamReaderBase.__init__(self, data)
-        
+
         self.__entryCallback = entryCallback
-        
+
         self.version = ""
         self.baseUrl = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -43,8 +46,8 @@
             if self.isStartElement():
                 if self.name() == "Dictionaries":
                     self.version = self.attribute(
-                        "version",
-                        dictionariesListFileFormatVersion)
+                        "version", dictionariesListFileFormatVersion
+                    )
                     self.baseUrl = self.attribute("baseurl", "")
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
@@ -55,28 +58,32 @@
                     self.__readDictionary()
                 else:
                     self._skipUnknownElement()
-        
+
         self.showErrorMessage()
-    
+
     def __readDictionary(self):
         """
         Private method to read the plug-in info.
         """
-        dictionaryInfo = {"short": "",
-                          "filename": "",
-                          "documentation": "",
-                          "locales": [],
-                          }
-        
+        dictionaryInfo = {
+            "short": "",
+            "filename": "",
+            "documentation": "",
+            "locales": [],
+        }
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Dictionary":
                 self.__entryCallback(
-                    dictionaryInfo["short"], dictionaryInfo["filename"],
+                    dictionaryInfo["short"],
+                    dictionaryInfo["filename"],
                     self.baseUrl + dictionaryInfo["filename"],
-                    dictionaryInfo["documentation"], dictionaryInfo["locales"])
+                    dictionaryInfo["documentation"],
+                    dictionaryInfo["locales"],
+                )
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Short":
                     dictionaryInfo["short"] = self.readElementText()
--- a/src/eric7/EricXML/TasksReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/TasksReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,29 +24,30 @@
     """
     Class for reading an XML tasks file.
     """
+
     supportedVersions = ["4.2", "5.0", "5.1", "6.0"]
-    
+
     def __init__(self, device, forProject=False, viewer=None):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param forProject flag indicating project related mode (boolean)
         @param viewer reference to the task viewer (TaskViewer)
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.viewer = viewer
-        
+
         self.forProject = forProject
         if viewer:
             self.viewer = viewer
         else:
             self.viewer = ericApp().getObject("TaskViewer")
-        
+
         self.version = ""
         self.tasks = []
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -57,11 +58,10 @@
                 for task, expanded in self.tasks:
                     task.setExpanded(expanded)
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Tasks":
-                    self.version = self.attribute(
-                        "version", tasksFileFormatVersion)
+                    self.version = self.attribute("version", tasksFileFormatVersion)
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "Task":
@@ -72,23 +72,24 @@
                         self.viewer.setTasksScanFilter(scanFilter)
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-    
+
     def __readTask(self):
         """
         Private method to read the task info.
         """
-        task = {"summary": "",
-                "priority": TaskPriority.NORMAL,
-                "completed": False,
-                "created": 0,
-                "filename": "",
-                "linenumber": 0,
-                "type": TaskType.TODO,
-                "description": "",
-                "uid": "",
-                }
+        task = {
+            "summary": "",
+            "priority": TaskPriority.NORMAL,
+            "completed": False,
+            "created": 0,
+            "filename": "",
+            "linenumber": 0,
+            "type": TaskType.TODO,
+            "description": "",
+            "uid": "",
+        }
         task["priority"] = TaskPriority(
             int(self.attribute("priority", str(TaskPriority.NORMAL.value)))
         )
@@ -107,35 +108,43 @@
         else:
             # upgrade from pre 6.0 format
             from PyQt6.QtCore import QUuid
+
             task["uid"] = QUuid.createUuid().toString()
         parentUid = self.attribute("parent_uid", "")
         expanded = self.toBool(self.attribute("expanded", "True"))
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "Task":
                 parentTask = self.viewer.findParentTask(parentUid)
                 addedTask = self.viewer.addTask(
-                    task["summary"], priority=task["priority"],
-                    filename=task["filename"], lineno=task["linenumber"],
-                    completed=task["completed"], _time=task["created"],
-                    isProjectTask=self.forProject, taskType=task["type"],
-                    description=task["description"], uid=task["uid"],
-                    parentTask=parentTask)
+                    task["summary"],
+                    priority=task["priority"],
+                    filename=task["filename"],
+                    lineno=task["linenumber"],
+                    completed=task["completed"],
+                    _time=task["created"],
+                    isProjectTask=self.forProject,
+                    taskType=task["type"],
+                    description=task["description"],
+                    uid=task["uid"],
+                    parentTask=parentTask,
+                )
                 if addedTask:
                     self.tasks.append((addedTask, expanded))
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Summary":
                     task["summary"] = self.readElementText()
                 elif self.name() == "Description":
                     task["description"] = self.readElementText()
                 elif self.name() == "Created":
-                    task["created"] = time.mktime(time.strptime(
-                        self.readElementText(), "%Y-%m-%d, %H:%M:%S"))
+                    task["created"] = time.mktime(
+                        time.strptime(self.readElementText(), "%Y-%m-%d, %H:%M:%S")
+                    )
                 elif self.name() == "Resource":
-                    continue    # handle but ignore this tag
+                    continue  # handle but ignore this tag
                 elif self.name() == "Filename":
                     task["filename"] = Utilities.toNativeSeparators(
                         self.readElementText()
--- a/src/eric7/EricXML/TemplatesReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/TemplatesReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,22 +15,23 @@
     """
     Class for reading an XML tasks file.
     """
+
     supportedVersions = ["4.0"]
-    
+
     def __init__(self, device, viewer):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param viewer reference to the template viewer object (TemplateViewer)
         """
         XMLStreamReaderBase.__init__(self, device)
-        
+
         self.__viewer = viewer
-        
+
         self.version = ""
         self.groupName = "DEFAULT"
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -39,56 +40,55 @@
             self.readNext()
             if self.isStartElement():
                 if self.name() == "Templates":
-                    self.version = self.attribute(
-                        "version", templatesFileFormatVersion)
+                    self.version = self.attribute("version", templatesFileFormatVersion)
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "TemplateGroup":
                     self.__readTemplateGroup()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
-    
+
     def __readTemplateGroup(self):
         """
         Private method to read a template group.
         """
-        self.groupName = self.attribute('name', "DEFAULT")
-        language = self.attribute('language', "All")
+        self.groupName = self.attribute("name", "DEFAULT")
+        language = self.attribute("language", "All")
         self.__viewer.addGroup(self.groupName, language)
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement() and self.name() == "TemplateGroup":
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Template":
                     self.__readTemplate()
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-    
+
     def __readTemplate(self):
         """
         Private method to read the template definition.
         """
-        templateName = self.attribute('name', '')
+        templateName = self.attribute("name", "")
         templateDescription = ""
         templateText = ""
-        
+
         while not self.atEnd():
             self.readNext()
-            if (
-                self.isEndElement() and
-                self.name() == "Template" and
-                templateName
-            ):
-                self.__viewer.addEntry(self.groupName, templateName,
-                                       templateDescription, templateText,
-                                       quiet=True)
+            if self.isEndElement() and self.name() == "Template" and templateName:
+                self.__viewer.addEntry(
+                    self.groupName,
+                    templateName,
+                    templateDescription,
+                    templateText,
+                    quiet=True,
+                )
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "TemplateDescription":
                     templateDescription = self.readElementText()
--- a/src/eric7/EricXML/UserProjectReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/UserProjectReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,22 +17,23 @@
     """
     Class for reading an XML user project properties file.
     """
+
     supportedVersions = ["4.0"]
-    
+
     def __init__(self, device, project):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         @param project Reference to the project object to store the
                 information into.
         """
         XMLStreamReaderBase.__init__(self, device)
-    
+
         self.project = project
-        
+
         self.version = ""
-    
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
@@ -42,17 +43,20 @@
             if self.isStartElement():
                 if self.name() == "UserProject":
                     self.version = self.attribute(
-                        "version", userProjectFileFormatVersion)
+                        "version", userProjectFileFormatVersion
+                    )
                     if self.version not in self.supportedVersions:
                         self.raiseUnsupportedFormatVersion(self.version)
                 elif self.name() == "VcsType":
                     self.project.pudata["VCSOVERRIDE"] = self.readElementText()
                 elif self.name() == "VcsStatusMonitorInterval":
-                    interval = int(self.attribute(
-                        "value",
-                        Preferences.getVCS("StatusMonitorInterval")))
+                    interval = int(
+                        self.attribute(
+                            "value", Preferences.getVCS("StatusMonitorInterval")
+                        )
+                    )
                     self.project.pudata["VCSSTATUSMONITORINTERVAL"] = interval
                 else:
                     self.raiseUnexpectedStartTag(self.name())
-        
+
         self.showErrorMessage()
--- a/src/eric7/EricXML/XMLStreamReaderBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/EricXML/XMLStreamReaderBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,7 +7,7 @@
 Module implementing a base class for all of eric7s XML stream writers.
 """
 
-import pickle           # secok
+import pickle  # secok
 import base64
 
 from PyQt6.QtCore import QXmlStreamReader, QCoreApplication
@@ -19,30 +19,31 @@
     """
     Class implementing a base class for all of eric7s XML stream readers.
     """
+
     def __init__(self, device):
         """
         Constructor
-        
+
         @param device reference to the I/O device to read from (QIODevice)
         """
         super().__init__(device)
-    
+
     def toBool(self, value):
         """
         Public method to convert the given value to bool.
-        
+
         @param value value to be converted ("True", "False", "1", "0")
         @return converted value (boolean) or None in case of an error
         """
         if value.lower() in ["true", "false"]:
             return value.lower() == "true"
-        
+
         if value in ["1", "0"]:
             return bool(int(value))
-        
+
         self.raiseBadValue(value)
         return None
-    
+
     def showErrorMessage(self):
         """
         Public method to show an error message.
@@ -52,61 +53,70 @@
                 msg = QCoreApplication.translate(
                     "XMLStreamReaderBase",
                     "<p>XML parse error in file <b>{0}</b>, line {1},"
-                    " column {2}</p><p>Error: {3}</p>").format(
+                    " column {2}</p><p>Error: {3}</p>",
+                ).format(
                     self.device().fileName(),
-                    self.lineNumber(), self.columnNumber(),
-                    self.errorString())
+                    self.lineNumber(),
+                    self.columnNumber(),
+                    self.errorString(),
+                )
             else:
                 msg = QCoreApplication.translate(
                     "XMLStreamReaderBase",
-                    "<p>XML parse error (line {0},"
-                    " column {1})</p><p>Error: {2}</p>").format(
-                    self.lineNumber(), self.columnNumber(),
-                    self.errorString())
+                    "<p>XML parse error (line {0}," " column {1})</p><p>Error: {2}</p>",
+                ).format(self.lineNumber(), self.columnNumber(), self.errorString())
             EricMessageBox.warning(
                 None,
-                QCoreApplication.translate(
-                    "XMLStreamReaderBase", "XML parse error"),
-                msg)
-    
+                QCoreApplication.translate("XMLStreamReaderBase", "XML parse error"),
+                msg,
+            )
+
     def raiseUnexpectedStartTag(self, tag):
         """
         Public method to raise an error for an unexpected start tag.
-        
+
         @param tag name of the unexpected tag (string)
         """
-        self.raiseError(QCoreApplication.translate(
-            "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag)))
-    
+        self.raiseError(
+            QCoreApplication.translate(
+                "XMLStreamReaderBase", "Unexpected start tag '{0}'.".format(tag)
+            )
+        )
+
     def raiseUnsupportedFormatVersion(self, version):
         """
         Public method to raise an error for an unsupported file format version.
-        
+
         @param version unsupported version (string)
         """
-        self.raiseError(QCoreApplication.translate(
-            "XMLStreamReaderBase",
-            "File format version '{0}' is not supported.").format(version))
-    
+        self.raiseError(
+            QCoreApplication.translate(
+                "XMLStreamReaderBase", "File format version '{0}' is not supported."
+            ).format(version)
+        )
+
     def raiseBadValue(self, value):
         """
         Public method to raise an error for a bad value.
-        
+
         @param value bad value (string)
         """
-        self.raiseError(QCoreApplication.translate(
-            "XMLStreamReaderBase", "Bad value: {0}").format(value))
-    
+        self.raiseError(
+            QCoreApplication.translate("XMLStreamReaderBase", "Bad value: {0}").format(
+                value
+            )
+        )
+
     def readXML(self):
         """
         Public method to read and parse the XML document.
         """
         pass
-    
+
     def attribute(self, name, default=""):
         """
         Public method to read the given attribute of the current tag.
-        
+
         @param name name of the attribute (string)
         @param default default value (string)
         @return value of the requested tag attribute (string)
@@ -128,26 +138,26 @@
             else:
                 value = default
             return value
-    
+
     def _skipUnknownElement(self):
         """
         Protected method to skip over all unknown elements.
         """
         if not self.isStartElement():
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 self._skipUnknownElement()
-    
+
     def _readBasics(self):
         """
         Protected method to read an object of a basic Python type.
-        
+
         @return Python object read
         """
         while not self.atEnd():
@@ -172,12 +182,12 @@
                     elif self.name() == "string":
                         val = self.readElementText()
                     elif self.name() == "bytes":
-                        by = bytes([int(b) for b in
-                                    self.readElementText().split(",")])
+                        by = bytes([int(b) for b in self.readElementText().split(",")])
                         val = by
                     elif self.name() == "bytearray":
-                        by = bytearray([int(b) for b in
-                                        self.readElementText().split(",")])
+                        by = bytearray(
+                            [int(b) for b in self.readElementText().split(",")]
+                        )
                         val = by
                     elif self.name() == "tuple":
                         val = self.__readTuple()
@@ -197,31 +207,32 @@
                     elif self.name() == "pickle":
                         encoding = self.attribute("encoding")
                         if encoding != "base64":
-                            self.raiseError(QCoreApplication.translate(
-                                "XMLStreamReaderBase",
-                                "Pickle data encoding '{0}' is not"
-                                " supported.").format(encoding))
+                            self.raiseError(
+                                QCoreApplication.translate(
+                                    "XMLStreamReaderBase",
+                                    "Pickle data encoding '{0}' is not" " supported.",
+                                ).format(encoding)
+                            )
                             continue
                         b64 = self.readElementText()
                         pic = base64.b64decode(b64.encode("ASCII"))
-                        val = pickle.loads(pic)         # secok
+                        val = pickle.loads(pic)  # secok
                     else:
                         self._skipUnknownElement()
                 except ValueError as err:
                     self.raiseError(str(err))
                     continue
-            
+
             if self.isEndElement():
-                if self.name() in [
-                        "tuple", "list", "dict", "set", "frozenset"]:
+                if self.name() in ["tuple", "list", "dict", "set", "frozenset"]:
                     return None
                 else:
                     return val
-    
+
     def __readTuple(self):
         """
         Private method to read a Python tuple.
-        
+
         @return Python tuple
         """
         li = []
@@ -231,11 +242,11 @@
                 return tuple(li)
             else:
                 li.append(val)
-    
+
     def __readList(self):
         """
         Private method to read a Python list.
-        
+
         @return Python list
         """
         li = []
@@ -245,11 +256,11 @@
                 return li
             else:
                 li.append(val)
-    
+
     def __readDict(self):
         """
         Private method to read a Python dictionary.
-        
+
         @return Python dictionary
         """
         d = {}
@@ -262,14 +273,14 @@
                     d[key] = self._readBasics()
                     if self.isEndElement() and self.name() == "dict":
                         self.readNext()
-            
+
             if self.isEndElement() and self.name() == "dict":
                 return d
-    
+
     def __readSet(self):
         """
         Private method to read a Python set.
-        
+
         @return Python set
         """
         li = []
@@ -279,21 +290,17 @@
                 return set(li)
             else:
                 li.append(val)
-    
+
     def __readFrozenset(self):
         """
         Private method to read a Python set.
-        
+
         @return Python set
         """
         li = []
         while not self.atEnd():
             val = self._readBasics()
-            if (
-                self.isEndElement() and
-                self.name() == "frozenset" and
-                val is None
-            ):
+            if self.isEndElement() and self.name() == "frozenset" and val is None:
                 return frozenset(li)
             else:
                 li.append(val)
--- a/src/eric7/Globals/AppInfo.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Globals/AppInfo.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,7 @@
 def makeAppInfo(argv, name, arg, description, options=None):
     """
     Module function to generate a dictionary describing the application.
-    
+
     @param argv list of commandline parameters (list of strings)
     @param name name of the application (string)
     @param arg commandline arguments (string)
@@ -30,5 +30,5 @@
         "name": name,
         "description": description,
         "version": Version,
-        "options": [] if options is None else options[:]
+        "options": [] if options is None else options[:],
     }
--- a/src/eric7/Globals/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Globals/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,12 @@
 import sys
 
 from PyQt6.QtCore import (
-    QDir, QByteArray, QCoreApplication, QT_VERSION, QProcess, qVersion
+    QDir,
+    QByteArray,
+    QCoreApplication,
+    QT_VERSION,
+    QProcess,
+    qVersion,
 )
 
 from eric7config import getConfig
@@ -47,7 +52,7 @@
 def isWindowsPlatform():
     """
     Function to check, if this is a Windows platform.
-    
+
     @return flag indicating Windows platform
     @rtype bool
     """
@@ -57,7 +62,7 @@
 def isMacPlatform():
     """
     Function to check, if this is a Mac platform.
-    
+
     @return flag indicating Mac platform
     @rtype bool
     """
@@ -67,7 +72,7 @@
 def isLinuxPlatform():
     """
     Function to check, if this is a Linux platform.
-    
+
     @return flag indicating Linux platform
     @rtype bool
     """
@@ -78,122 +83,122 @@
     """
     Function to determine the name of the desktop environment used
     (Linux only).
-    
+
     @return name of the desktop environment
     @rtype str
     """
     if not isLinuxPlatform():
         return ""
-    
+
     currDesktop = os.environ.get("XDG_CURRENT_DESKTOP", "")
     if currDesktop:
         return currDesktop
-    
+
     currDesktop = os.environ.get("XDG_SESSION_DESKTOP", "")
     if currDesktop:
         return currDesktop
-    
+
     currDesktop = os.environ.get("GDMSESSION", "")
     if currDesktop:
         return currDesktop
-    
+
     currDesktop = os.environ.get("GNOME_DESKTOP_SESSION_ID", "")
     if currDesktop:
         return currDesktop
-    
+
     currDesktop = os.environ.get("KDE_FULL_SESSION", "")
     if currDesktop:
         if currDesktop == "true":
             return "KDE"
-        
+
         return currDesktop
-    
+
     currDesktop = os.environ.get("DESKTOP_SESSION", "")
     if currDesktop:
         return currDesktop
-    
+
     return ""
 
 
 def isKdeDesktop():
     """
     Function to check, if the current session is a KDE desktop (Linux only).
-    
+
     @return flag indicating a KDE desktop
     @rtype bool
     """
     if not isLinuxPlatform():
         return False
-    
+
     isKDE = False
-    
+
     desktop = (
-        os.environ.get("XDG_CURRENT_DESKTOP", "").lower() or
-        os.environ.get("XDG_SESSION_DESKTOP", "").lower() or
-        os.environ.get("DESKTOP_SESSION", "").lower()
+        os.environ.get("XDG_CURRENT_DESKTOP", "").lower()
+        or os.environ.get("XDG_SESSION_DESKTOP", "").lower()
+        or os.environ.get("DESKTOP_SESSION", "").lower()
     )
     isKDE = (
         "kde" in desktop or "plasma" in desktop
-        if desktop else
-        bool(os.environ.get("KDE_FULL_SESSION", ""))
+        if desktop
+        else bool(os.environ.get("KDE_FULL_SESSION", ""))
     )
-    
+
     return isKDE
 
 
 def isGnomeDesktop():
     """
     Function to check, if the current session is a Gnome desktop (Linux only).
-    
+
     @return flag indicating a Gnome desktop
     @rtype bool
     """
     if not isLinuxPlatform():
         return False
-    
+
     isGnome = False
-    
+
     desktop = (
-        os.environ.get("XDG_CURRENT_DESKTOP", "").lower() or
-        os.environ.get("XDG_SESSION_DESKTOP", "").lower() or
-        os.environ.get("GDMSESSION", "").lower()
+        os.environ.get("XDG_CURRENT_DESKTOP", "").lower()
+        or os.environ.get("XDG_SESSION_DESKTOP", "").lower()
+        or os.environ.get("GDMSESSION", "").lower()
     )
     isGnome = (
         "gnome" in desktop
-        if desktop else
-        bool(os.environ.get("GNOME_DESKTOP_SESSION_ID", ""))
+        if desktop
+        else bool(os.environ.get("GNOME_DESKTOP_SESSION_ID", ""))
     )
-    
+
     return isGnome
 
 
 def sessionType():
     """
     Function to determine the name of the running session (Linux only).
-    
+
     @return name of the desktop environment
     @rtype str
     """
     if not isLinuxPlatform():
         return ""
-    
+
     sessionType = os.environ.get("XDG_SESSION_TYPE", "").lower()
     if "x11" in sessionType:
         return "X11"
     elif "wayland" in sessionType:
         return "Wayland"
-    
+
     sessionType = os.environ.get("WAYLAND_DISPLAY", "").lower()
     if "wayland" in sessionType:
         return "Wayland"
-    
+
     return ""
 
 
 def isWaylandSession():
     """
     Function to check, if the current session is a wayland session.
-    
+
     @return flag indicating a wayland session
     @rtype bool
     """
@@ -203,7 +208,7 @@
 def getConfigDir():
     """
     Module function to get the name of the directory storing the config data.
-    
+
     @return directory name of the config dir
     @rtype str
     """
@@ -220,7 +225,7 @@
 def getInstallInfoFilePath():
     """
     Public method to get the path name of the install info file.
-    
+
     @return file path of the install info file
     @rtype str
     """
@@ -238,7 +243,7 @@
 def setConfigDir(d):
     """
     Module function to set the name of the directory storing the config data.
-    
+
     @param d name of an existing directory
     @type str
     """
@@ -249,7 +254,7 @@
 def getPythonExecutable():
     """
     Function to determine the path of the (non-windowed) Python executable.
-    
+
     @return path of the Python executable
     @rtype str
     """
@@ -264,49 +269,50 @@
 def getPythonLibraryDirectory():
     """
     Function to determine the path to Python's library directory.
-    
+
     @return path to the Python library directory
     @rtype str
     """
     import sysconfig
-    return sysconfig.get_path('platlib')
+
+    return sysconfig.get_path("platlib")
 
 
 def getPyQt6ModulesDirectory():
     """
     Function to determine the path to PyQt6 modules directory.
-    
+
     @return path to the PyQt6 modules directory
     @rtype str
     """
     import sysconfig
-    
-    pyqtPath = os.path.join(sysconfig.get_path('platlib'), "PyQt6")
+
+    pyqtPath = os.path.join(sysconfig.get_path("platlib"), "PyQt6")
     if os.path.exists(pyqtPath):
         return pyqtPath
-    
+
     return ""
-    
+
 
 def getPyQtToolsPath(version=5):
     """
     Module function to get the path of the PyQt tools.
-    
+
     @param version PyQt major version
     @type int
     @return path to the PyQt tools
     @rtype str
     """
     import Preferences
-    
+
     toolsPath = ""
-    
+
     # step 1: check, if the user has configured a tools path
     if version == 5:
         toolsPath = Preferences.getQt("PyQtToolsDir")
     elif version == 6:
         toolsPath = Preferences.getQt("PyQt6ToolsDir")
-    
+
     # step 2: determine from used Python interpreter (pylupdate is test object)
     if not toolsPath:
         program = "pylupdate{0}".format(version)
@@ -321,14 +327,14 @@
             dirName = os.path.dirname(sys.executable)
             if os.path.exists(os.path.join(dirName, program)):
                 toolsPath = dirName
-    
+
     return toolsPath
 
 
 def getQtBinariesPath(libexec=False):
     """
     Module function to get the path of the Qt binaries.
-    
+
     @param libexec flag indicating to get the path of the executable library
         (defaults to False)
     @type bool (optional)
@@ -336,9 +342,9 @@
     @rtype str
     """
     import Preferences
-    
+
     binPath = ""
-    
+
     # step 1: check, if the user has configured a tools path
     qtToolsDir = Preferences.getQt("QtToolsDir")
     if qtToolsDir:
@@ -350,27 +356,28 @@
             binPath = Preferences.getQt("QtToolsDir")
         if not os.path.exists(binPath):
             binPath = ""
-    
+
     # step 2: try the qt6_applications package
     if not binPath:
         with contextlib.suppress(ImportError):
             # if qt6-applications is not installed just go to the next step
             import qt6_applications
+
             if libexec:
                 binPath = os.path.join(
-                    os.path.dirname(qt6_applications.__file__),
-                    "Qt", "libexec")
+                    os.path.dirname(qt6_applications.__file__), "Qt", "libexec"
+                )
                 if not os.path.exists(binPath):
                     binPath = os.path.join(
-                        os.path.dirname(qt6_applications.__file__),
-                        "Qt", "bin")
+                        os.path.dirname(qt6_applications.__file__), "Qt", "bin"
+                    )
             else:
                 binPath = os.path.join(
-                    os.path.dirname(qt6_applications.__file__),
-                    "Qt", "bin")
+                    os.path.dirname(qt6_applications.__file__), "Qt", "bin"
+                )
             if not os.path.exists(binPath):
                 binPath = ""
-    
+
     # step 3: determine from used Python interpreter (designer is test object)
     if not binPath:
         program = "designer"
@@ -385,7 +392,7 @@
             dirName = os.path.dirname(sys.executable)
             if os.path.exists(os.path.join(dirName, program)):
                 binPath = dirName
-    
+
     return QDir.toNativeSeparators(binPath)
 
 
@@ -397,11 +404,11 @@
 def versionToTuple(version, length=3):
     """
     Module function to convert a version string into a tuple.
-    
+
     Note: A version string consists of non-negative decimals separated by "."
     optionally followed by a suffix. Suffix is everything after the last
     decimal.
-    
+
     @param version version string
     @type str
     @param length desired length of the version tuple
@@ -410,28 +417,28 @@
     @rtype tuple of int
     """
     versionParts = []
-    
+
     # step 1: extract suffix
     version = re.split(r"[^\d.]", version)[0]
     for part in version.split("."):
         with contextlib.suppress(ValueError):
             versionParts.append(int(part.strip()))
     versionParts.extend([0] * length)
-    
+
     return tuple(versionParts[:length])
 
 
 def qVersionTuple():
     """
     Module function to get the Qt version as a tuple.
-    
+
     @return Qt version as a tuple
     @rtype tuple of int
     """
     return (
-        (QT_VERSION & 0xff0000) >> 16,
-        (QT_VERSION & 0xff00) >> 8,
-        QT_VERSION & 0xff,
+        (QT_VERSION & 0xFF0000) >> 16,
+        (QT_VERSION & 0xFF00) >> 8,
+        QT_VERSION & 0xFF,
     )
 
 
@@ -444,7 +451,7 @@
     """
     Module function to group a string into sub-strings separated by a
     separator.
-    
+
     @param txt text to be grouped
     @type str
     @param sep separator string
@@ -455,7 +462,7 @@
     @rtype str
     """
     groups = []
-    
+
     while len(txt) // groupLen != 0:
         groups.insert(0, txt[-groupLen:])
         txt = txt[:-groupLen]
@@ -467,7 +474,7 @@
 def strToQByteArray(txt):
     """
     Module function to convert a Python string into a QByteArray.
-    
+
     @param txt Python string to be converted
     @type str, bytes, bytearray
     @return converted QByteArray
@@ -475,38 +482,33 @@
     """
     if isinstance(txt, str):
         txt = txt.encode("utf-8")
-    
+
     return QByteArray(txt)
 
 
 def dataString(size):
     """
     Module function to generate a formatted size string.
-    
+
     @param size size to be formatted
     @type int
     @return formatted data string
     @rtype str
     """
     if size < 1024:
-        return QCoreApplication.translate(
-            "Globals", "{0:4.2f} Bytes").format(size)
+        return QCoreApplication.translate("Globals", "{0:4.2f} Bytes").format(size)
     elif size < 1024 * 1024:
         size /= 1024
-        return QCoreApplication.translate(
-            "Globals", "{0:4.2f} KiB").format(size)
+        return QCoreApplication.translate("Globals", "{0:4.2f} KiB").format(size)
     elif size < 1024 * 1024 * 1024:
         size /= 1024 * 1024
-        return QCoreApplication.translate(
-            "Globals", "{0:4.2f} MiB").format(size)
+        return QCoreApplication.translate("Globals", "{0:4.2f} MiB").format(size)
     elif size < 1024 * 1024 * 1024 * 1024:
         size /= 1024 * 1024 * 1024
-        return QCoreApplication.translate(
-            "Globals", "{0:4.2f} GiB").format(size)
+        return QCoreApplication.translate("Globals", "{0:4.2f} GiB").format(size)
     else:
         size /= 1024 * 1024 * 1024 * 1024
-        return QCoreApplication.translate(
-            "Globals", "{0:4.2f} TiB").format(size)
+        return QCoreApplication.translate("Globals", "{0:4.2f} TiB").format(size)
 
 
 ###############################################################################
@@ -517,7 +519,7 @@
 def toBool(value):
     """
     Module function to convert a value to bool.
-    
+
     @param value value to be converted
     @type str
     @return converted data
@@ -534,7 +536,7 @@
 def toList(value):
     """
     Module function to convert a value to a list.
-    
+
     @param value value to be converted
     @type None, list or Any
     @return converted data
@@ -551,7 +553,7 @@
 def toByteArray(value):
     """
     Module function to convert a value to a byte array.
-    
+
     @param value value to be converted
     @type QByteArray or None
     @return converted data
@@ -566,7 +568,7 @@
 def toDict(value):
     """
     Module function to convert a value to a dictionary.
-    
+
     @param value value to be converted
     @type dict or None
     @return converted data
@@ -586,21 +588,23 @@
 def getWebBrowserSupport():
     """
     Module function to determine the supported web browser variant.
-    
+
     @return string indicating the supported web browser variant ("QtWebEngine",
         or "None")
     @rtype str
     """
     from eric7config import getConfig
-    scriptPath = os.path.join(getConfig("ericDir"), "Tools",
-                              "webBrowserSupport.py")
+
+    scriptPath = os.path.join(getConfig("ericDir"), "Tools", "webBrowserSupport.py")
     proc = QProcess()
     proc.start(getPythonExecutable(), [scriptPath, qVersion()])
     variant = (
-        str(proc.readAllStandardOutput(), "utf-8", 'replace').strip()
-        if proc.waitForFinished(10000) else
-        "None"
+        str(proc.readAllStandardOutput(), "utf-8", "replace").strip()
+        if proc.waitForFinished(10000)
+        else "None"
     )
     return variant
+
+
 #
 # eflag: noqa = M801
--- a/src/eric7/Graphics/ApplicationDiagramBuilder.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/ApplicationDiagramBuilder.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class implementing a builder for imports diagrams of the application.
     """
+
     def __init__(self, dialog, view, project, noModules=False):
         """
         Constructor
-        
+
         @param dialog reference to the UML dialog
         @type UMLDialog
         @param view reference to the view object
@@ -42,41 +43,43 @@
         """
         super().__init__(dialog, view, project)
         self.setObjectName("ApplicationDiagram")
-        
+
         self.noModules = noModules
-        
+
         self.umlView.setDiagramName(
-            self.tr("Application Diagram {0}").format(
-                self.project.getProjectName()))
-        
+            self.tr("Application Diagram {0}").format(self.project.getProjectName())
+        )
+
     def __buildModulesDict(self):
         """
         Private method to build a dictionary of modules contained in the
         application.
-        
+
         @return dictionary of modules contained in the application
         @rtype dict
         """
         import Utilities.ModuleParser
-        extensions = (
-            Preferences.getPython("Python3Extensions") +
-            ['.rb']
-        )
+
+        extensions = Preferences.getPython("Python3Extensions") + [".rb"]
         moduleDict = {}
         mods = self.project.pdata["SOURCES"]
         modules = []
         for module in mods:
-            modules.append(Utilities.normabsjoinpath(
-                self.project.ppath, module))
+            modules.append(Utilities.normabsjoinpath(self.project.ppath, module))
         tot = len(modules)
         progress = EricProgressDialog(
             self.tr("Parsing modules..."),
-            None, 0, tot, self.tr("%v/%m Modules"), self.parent())
+            None,
+            0,
+            tot,
+            self.tr("%v/%m Modules"),
+            self.parent(),
+        )
         progress.setWindowTitle(self.tr("Application Diagram"))
         try:
             progress.show()
             QApplication.processEvents()
-            
+
             now = time.monotonic()
             for prog, module in enumerate(modules):
                 progress.setValue(prog)
@@ -87,7 +90,8 @@
                     continue
                 try:
                     mod = Utilities.ModuleParser.readModule(
-                        module, extensions=extensions, caching=False)
+                        module, extensions=extensions, caching=False
+                    )
                 except ImportError:
                     continue
                 else:
@@ -97,11 +101,11 @@
             progress.setValue(tot)
             progress.deleteLater()
         return moduleDict
-    
+
     def __findApplicationRoot(self):
         """
         Private method to find the application root path.
-        
+
         @return application root path
         @rtype str
         """
@@ -119,7 +123,7 @@
                     init = os.path.join(fullpath, "__init__.py")
                     if os.path.exists(init):
                         candidates.append(fullpath)
-            
+
             # check, if project uses the 'src' layout
             if os.path.exists(os.path.join(path, "src")):
                 srcPath = os.path.join(path, "src")
@@ -129,7 +133,7 @@
                         init = os.path.join(fullpath, "__init__.py")
                         if os.path.exists(init):
                             candidates.append(fullpath)
-            
+
             if len(candidates) == 1:
                 return candidates[0]
             elif len(candidates) > 1:
@@ -138,17 +142,22 @@
                     self.tr("Application Diagram"),
                     self.tr("Select the application directory:"),
                     sorted(candidates),
-                    0, True)
+                    0,
+                    True,
+                )
                 if ok:
                     return root
             else:
                 EricMessageBox.warning(
                     None,
                     self.tr("Application Diagram"),
-                    self.tr("""No application package could be detected."""
-                            """ Aborting..."""))
+                    self.tr(
+                        """No application package could be detected."""
+                        """ Aborting..."""
+                    ),
+                )
         return None
-        
+
     def buildDiagram(self):
         """
         Public method to build the packages shapes of the diagram.
@@ -157,14 +166,14 @@
         if rpath is None:
             # no root path detected
             return
-        
-        root = os.path.splitdrive(rpath)[1].replace(os.sep, '.')[1:]
-        
+
+        root = os.path.splitdrive(rpath)[1].replace(os.sep, ".")[1:]
+
         packages = {}
         self.__shapes = {}
-        
+
         modules = self.__buildModulesDict()
-        
+
         # step 1: build a dictionary of packages
         for module in sorted(modules.keys()):
             if "." in module:
@@ -175,7 +184,7 @@
                 packages[packageName][0].append(moduleName)
             else:
                 packages[packageName] = ([moduleName], [])
-                
+
         # step 2: assign modules to dictionaries and update import relationship
         for module in sorted(modules.keys()):
             package = module.rsplit(".", 1)[0]
@@ -184,9 +193,8 @@
                 if moduleImport in modules:
                     impLst.append(moduleImport)
                 else:
-                    if moduleImport.find('.') == -1:
-                        n = "{0}.{1}".format(modules[module].package,
-                                             moduleImport)
+                    if moduleImport.find(".") == -1:
+                        n = "{0}.{1}".format(modules[module].package, moduleImport)
                         if n in modules:
                             impLst.append(n)
                         else:
@@ -201,8 +209,8 @@
                         if n in modules:
                             impLst.append(n)
             for moduleImport in list(modules[module].from_imports.keys()):
-                if moduleImport.startswith('.'):
-                    dots = len(moduleImport) - len(moduleImport.lstrip('.'))
+                if moduleImport.startswith("."):
+                    dots = len(moduleImport) - len(moduleImport.lstrip("."))
                     if dots == 1:
                         moduleImport = moduleImport[1:]
                     elif dots > 1:
@@ -211,24 +219,24 @@
                         ppath = packagePath
                         while hasInit:
                             ppath = os.path.dirname(ppath)
-                            hasInit = len(glob.glob(os.path.join(
-                                ppath, '__init__.*'))) > 0
-                        shortPackage = (
-                            packagePath.replace(ppath, '')
-                            .replace(os.sep, '.')[1:]
+                            hasInit = (
+                                len(glob.glob(os.path.join(ppath, "__init__.*"))) > 0
+                            )
+                        shortPackage = packagePath.replace(ppath, "").replace(
+                            os.sep, "."
+                        )[1:]
+                        packageList = shortPackage.split(".")[1:]
+                        packageListLen = len(packageList)
+                        moduleImport = ".".join(
+                            packageList[: packageListLen - dots + 1]
+                            + [moduleImport[dots:]]
                         )
-                        packageList = shortPackage.split('.')[1:]
-                        packageListLen = len(packageList)
-                        moduleImport = '.'.join(
-                            packageList[:packageListLen - dots + 1] +
-                            [moduleImport[dots:]])
-                
+
                 if moduleImport in modules:
                     impLst.append(moduleImport)
                 else:
-                    if moduleImport.find('.') == -1:
-                        n = "{0}.{1}".format(modules[module].package,
-                                             moduleImport)
+                    if moduleImport.find(".") == -1:
+                        n = "{0}.{1}".format(modules[module].package, moduleImport)
                         if n in modules:
                             impLst.append(n)
                         else:
@@ -245,27 +253,23 @@
             for moduleImport in impLst:
                 impPackage = moduleImport.rsplit(".", 1)[0]
                 try:
-                    if (
-                        impPackage not in packages[package][1] and
-                        impPackage != package
-                    ):
+                    if impPackage not in packages[package][1] and impPackage != package:
                         packages[package][1].append(impPackage)
                 except KeyError:
                     continue
-        
+
         for package in sorted(packages.keys()):
             if package:
-                relPackage = package.replace(root, '')
-                if relPackage and relPackage[0] == '.':
+                relPackage = package.replace(root, "")
+                if relPackage and relPackage[0] == ".":
                     relPackage = relPackage[1:]
                 else:
                     relPackage = self.tr("<<Application>>")
             else:
                 relPackage = self.tr("<<Others>>")
-            shape = self.__addPackage(
-                relPackage, packages[package][0], 0.0, 0.0)
+            shape = self.__addPackage(relPackage, packages[package][0], 0.0, 0.0)
             self.__shapes[package] = (shape, packages[package][1])
-        
+
         # build a list of routes
         nodes = []
         routes = []
@@ -275,15 +279,15 @@
                 route = (module, rel)
                 if route not in routes:
                     routes.append(route)
-        
+
         self.__arrangeNodes(nodes, routes[:])
         self.__createAssociations(routes)
         self.umlView.autoAdjustSceneSize(limit=True)
-    
+
     def __addPackage(self, name, modules, x, y):
         """
         Private method to add a package to the diagram.
-        
+
         @param name package name to be shown
         @type str
         @param modules list of module names contained in the package
@@ -296,19 +300,26 @@
         @rtype PackageItem
         """
         from .PackageItem import PackageItem, PackageModel
+
         modules.sort()
         pm = PackageModel(name, modules)
-        pw = PackageItem(pm, x, y, noModules=self.noModules, scene=self.scene,
-                         colors=self.umlView.getDrawingColors())
+        pw = PackageItem(
+            pm,
+            x,
+            y,
+            noModules=self.noModules,
+            scene=self.scene,
+            colors=self.umlView.getDrawingColors(),
+        )
         pw.setId(self.umlView.getItemId())
         return pw
-    
+
     def __arrangeNodes(self, nodes, routes, whiteSpaceFactor=1.2):
         """
         Private method to arrange the shapes on the canvas.
-        
+
         The algorithm is borrowed from Boa Constructor.
-        
+
         @param nodes list of nodes to arrange
         @type list of str
         @param routes list of routes
@@ -318,16 +329,16 @@
         @type float
         """
         from . import GraphicsUtilities
+
         generations = GraphicsUtilities.sort(nodes, routes)
-        
+
         # calculate width and height of all elements
         sizes = []
         for generation in generations:
             sizes.append([])
             for child in generation:
-                sizes[-1].append(
-                    self.__shapes[child][0].sceneBoundingRect())
-                
+                sizes[-1].append(self.__shapes[child][0].sceneBoundingRect())
+
         # calculate total width and total height
         width = 0
         height = 0
@@ -336,72 +347,71 @@
         for generation in sizes:
             currentWidth = 0
             currentHeight = 0
-            
+
             for rect in generation:
                 if rect.height() > currentHeight:
                     currentHeight = rect.height()
                 currentWidth += rect.width()
-                
+
             # update totals
             if currentWidth > width:
                 width = currentWidth
             height += currentHeight
-            
+
             # store generation info
             widths.append(currentWidth)
             heights.append(currentHeight)
-        
+
         # add in some whitespace
         width *= whiteSpaceFactor
         height = height * whiteSpaceFactor - 20
         verticalWhiteSpace = 40.0
-        
+
         sceneRect = self.umlView.sceneRect()
         width += 50.0
         height += 50.0
         swidth = sceneRect.width() if width < sceneRect.width() else width
         sheight = sceneRect.height() if height < sceneRect.height() else height
         self.umlView.setSceneSize(swidth, sheight)
-        
+
         # distribute each generation across the width and the
         # generations across height
         y = 10.0
-        for currentWidth, currentHeight, generation in (
-            zip(reversed(widths), reversed(heights), reversed(generations))
+        for currentWidth, currentHeight, generation in zip(
+            reversed(widths), reversed(heights), reversed(generations)
         ):
             x = 10.0
             # whiteSpace is the space between any two elements
-            whiteSpace = (
-                (width - currentWidth - 20) /
-                (len(generation) - 1.0 or 2.0)
-            )
+            whiteSpace = (width - currentWidth - 20) / (len(generation) - 1.0 or 2.0)
             for name in generation:
                 shape = self.__shapes[name][0]
                 shape.setPos(x, y)
                 rect = shape.sceneBoundingRect()
                 x = x + rect.width() + whiteSpace
             y = y + currentHeight + verticalWhiteSpace
-    
+
     def __createAssociations(self, routes):
         """
         Private method to generate the associations between the module shapes.
-        
+
         @param routes list of associations
         @type list of tuple of (str, str)
         """
         from .AssociationItem import AssociationItem, AssociationType
+
         for route in routes:
             assoc = AssociationItem(
                 self.__shapes[route[0]][0],
                 self.__shapes[route[1]][0],
                 AssociationType.IMPORTS,
-                colors=self.umlView.getDrawingColors())
+                colors=self.umlView.getDrawingColors(),
+            )
             self.scene.addItem(assoc)
-    
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -411,12 +421,12 @@
         """
         parts = data.split(", ")
         if (
-            len(parts) != 2 or
-            not parts[0].startswith("project=") or
-            not parts[1].startswith("no_modules=")
+            len(parts) != 2
+            or not parts[0].startswith("project=")
+            or not parts[1].startswith("no_modules=")
         ):
             return False
-        
+
         projectFile = parts[0].split("=", 1)[1].strip()
         if projectFile != self.project.getProjectFile():
             res = EricMessageBox.yesNo(
@@ -424,21 +434,22 @@
                 self.tr("Load Diagram"),
                 self.tr(
                     """<p>The diagram belongs to the project <b>{0}</b>."""
-                    """ Shall this project be opened?</p>""").format(
-                    projectFile))
+                    """ Shall this project be opened?</p>"""
+                ).format(projectFile),
+            )
             if res:
                 self.project.openProject(projectFile)
-            
+
         self.noModules = Utilities.toBool(parts[1].split("=", 1)[1].strip())
-        
+
         self.initialize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -446,11 +457,11 @@
             "project_name": self.project.getProjectName(),
             "no_modules": self.noModules,
         }
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
@@ -461,7 +472,7 @@
         """
         try:
             self.noModules = data["no_modules"]
-            
+
             if data["project_name"] != self.project.getProjectName():
                 msg = self.tr(
                     "<p>The diagram belongs to project <b>{0}</b>."
@@ -470,7 +481,7 @@
                 return False, msg
         except KeyError:
             return False, ""
-        
+
         self.initialize()
-        
+
         return True, ""
--- a/src/eric7/Graphics/AssociationItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/AssociationItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class defining the association types.
     """
+
     NORMAL = 0
     GENERALISATION = 1
     IMPORTS = 2
@@ -30,6 +31,7 @@
     """
     Class defining the regions for an association end point.
     """
+
     NO_REGION = 0
     WEST = 1
     NORTH = 2
@@ -45,15 +47,23 @@
 class AssociationItem(EricArrowItem):
     """
     Class implementing a graphics item for an association between two items.
-    
+
     The association is drawn as an arrow starting at the first items and
     ending at the second.
     """
-    def __init__(self, itemA, itemB, assocType=AssociationType.NORMAL,
-                 topToBottom=False, colors=None, parent=None):
+
+    def __init__(
+        self,
+        itemA,
+        itemB,
+        assocType=AssociationType.NORMAL,
+        topToBottom=False,
+        colors=None,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param itemA first widget of the association
         @type UMLItem
         @param itemB second widget of the association
@@ -74,39 +84,44 @@
         elif assocType == AssociationType.GENERALISATION:
             arrowType = EricArrowType.WIDE
             arrowFilled = False
-        
-        EricArrowItem.__init__(self, QPointF(0, 0), QPointF(100, 100),
-                               arrowFilled, arrowType, colors, parent)
-        
+
+        EricArrowItem.__init__(
+            self,
+            QPointF(0, 0),
+            QPointF(100, 100),
+            arrowFilled,
+            arrowType,
+            colors,
+            parent,
+        )
+
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, False)
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, False)
-        
+
         if topToBottom:
-            self.calculateEndingPoints = (
-                self.__calculateEndingPoints_topToBottom
-            )
+            self.calculateEndingPoints = self.__calculateEndingPoints_topToBottom
         else:
-            #- self.calculateEndingPoints = self.__calculateEndingPoints_center
+            # - self.calculateEndingPoints = self.__calculateEndingPoints_center
             self.calculateEndingPoints = self.__calculateEndingPoints_rectangle
-        
+
         self.itemA = itemA
         self.itemB = itemB
         self.assocType = assocType
         self.topToBottom = topToBottom
-        
+
         self.regionA = AssociationPointRegion.NO_REGION
         self.regionB = AssociationPointRegion.NO_REGION
-        
+
         self.calculateEndingPoints()
-        
+
         self.itemA.addAssociation(self)
         self.itemB.addAssociation(self)
-        
+
     def __mapRectFromItem(self, item):
         """
         Private method to map item's rectangle to this item's coordinate
         system.
-        
+
         @param item reference to the item to be mapped
         @type QGraphicsRectItem
         @return item's rectangle in local coordinates
@@ -115,70 +130,70 @@
         rect = item.rect()
         tl = self.mapFromItem(item, rect.topLeft())
         return QRectF(tl.x(), tl.y(), rect.width(), rect.height())
-        
+
     def __calculateEndingPoints_topToBottom(self):
         """
         Private method to calculate the ending points of the association item.
-        
+
         The ending points are calculated from the top center of the lower item
         to the bottom center of the upper item.
         """
         if self.itemA is None or self.itemB is None:
             return
-        
+
         self.prepareGeometryChange()
-        
+
         rectA = self.__mapRectFromItem(self.itemA)
         rectB = self.__mapRectFromItem(self.itemB)
-        midA = QPointF(rectA.x() + rectA.width() / 2.0,
-                       rectA.y() + rectA.height() / 2.0)
-        midB = QPointF(rectB.x() + rectB.width() / 2.0,
-                       rectB.y() + rectB.height() / 2.0)
+        midA = QPointF(
+            rectA.x() + rectA.width() / 2.0, rectA.y() + rectA.height() / 2.0
+        )
+        midB = QPointF(
+            rectB.x() + rectB.width() / 2.0, rectB.y() + rectB.height() / 2.0
+        )
         if midA.y() > midB.y():
             startP = QPointF(rectA.x() + rectA.width() / 2.0, rectA.y())
-            endP = QPointF(rectB.x() + rectB.width() / 2.0,
-                           rectB.y() + rectB.height())
+            endP = QPointF(rectB.x() + rectB.width() / 2.0, rectB.y() + rectB.height())
         else:
-            startP = QPointF(rectA.x() + rectA.width() / 2.0,
-                             rectA.y() + rectA.height())
+            startP = QPointF(
+                rectA.x() + rectA.width() / 2.0, rectA.y() + rectA.height()
+            )
             endP = QPointF(rectB.x() + rectB.width() / 2.0, rectB.y())
         self.setPoints(startP.x(), startP.y(), endP.x(), endP.y())
-    
+
     def __calculateEndingPoints_center(self):
         """
         Private method to calculate the ending points of the association item.
-        
+
         The ending points are calculated from the centers of the
         two associated items.
         """
         if self.itemA is None or self.itemB is None:
             return
-        
+
         self.prepareGeometryChange()
-        
+
         rectA = self.__mapRectFromItem(self.itemA)
         rectB = self.__mapRectFromItem(self.itemB)
-        midA = QPointF(rectA.x() + rectA.width() / 2.0,
-                       rectA.y() + rectA.height() / 2.0)
-        midB = QPointF(rectB.x() + rectB.width() / 2.0,
-                       rectB.y() + rectB.height() / 2.0)
+        midA = QPointF(
+            rectA.x() + rectA.width() / 2.0, rectA.y() + rectA.height() / 2.0
+        )
+        midB = QPointF(
+            rectB.x() + rectB.width() / 2.0, rectB.y() + rectB.height() / 2.0
+        )
         startP = self.__findRectIntersectionPoint(self.itemA, midA, midB)
         endP = self.__findRectIntersectionPoint(self.itemB, midB, midA)
-        
-        if (
-            startP.x() != -1 and
-            startP.y() != -1 and
-            endP.x() != -1 and
-            endP.y() != -1
-        ):
+
+        if startP.x() != -1 and startP.y() != -1 and endP.x() != -1 and endP.y() != -1:
+            # __IGNORE_WARNING_C111__
             self.setPoints(startP.x(), startP.y(), endP.x(), endP.y())
-        
+
     def __calculateEndingPoints_rectangle(self):
         r"""
         Private method to calculate the ending points of the association item.
-        
+
         The ending points are calculated by the following method.
-        
+
         For each item the diagram is divided in four Regions by its diagonals
         as indicated below
         <pre>
@@ -197,30 +212,30 @@
             |        /  Region 4  \        |
             +------------------------------+
         </pre>
-        
+
         Each diagonal is defined by two corners of the bounding rectangle.
-        
+
         To calculate the start point  we have to find out in which
         region (defined by itemA's diagonals) is itemB's TopLeft corner
         (lets call it region M). After that the start point will be
         the middle point of rectangle's side contained in region M.
-        
+
         To calculate the end point we repeat the above but in the opposite
         direction (from itemB to itemA)
         """
         if self.itemA is None or self.itemB is None:
             return
-        
+
         self.prepareGeometryChange()
-        
+
         rectA = self.__mapRectFromItem(self.itemA)
         rectB = self.__mapRectFromItem(self.itemB)
-        
+
         xA = rectA.x() + rectA.width() / 2.0
         yA = rectA.y() + rectA.height() / 2.0
         xB = rectB.x() + rectB.width() / 2.0
         yB = rectB.y() + rectB.height() / 2.0
-        
+
         # find itemA region
         rc = QRectF(xA, yA, rectA.width(), rectA.height())
         self.regionA = self.__findPointRegion(rc, xB, yB)
@@ -233,12 +248,12 @@
             self.regionA = AssociationPointRegion.SOUTH
         elif self.regionA in (
             AssociationPointRegion.SOUTH_WEST,
-            AssociationPointRegion.CENTER
+            AssociationPointRegion.CENTER,
         ):
             self.regionA = AssociationPointRegion.WEST
-        
+
         self.__updateEndPoint(self.regionA, True)
-        
+
         # now do the same for itemB
         rc = QRectF(xB, yB, rectB.width(), rectB.height())
         self.regionB = self.__findPointRegion(rc, xA, yA)
@@ -251,17 +266,17 @@
             self.regionB = AssociationPointRegion.SOUTH
         elif self.regionB in (
             AssociationPointRegion.SOUTH_WEST,
-            AssociationPointRegion.CENTER
+            AssociationPointRegion.CENTER,
         ):
             self.regionB = AssociationPointRegion.WEST
-        
+
         self.__updateEndPoint(self.regionB, False)
-        
+
     def __findPointRegion(self, rect, posX, posY):
         """
         Private method to find out, which region of rectangle rect contains
         the point (PosX, PosY) and returns the region number.
-        
+
         @param rect rectangle to calculate the region for
         @type QRectF
         @param posX x position of point
@@ -288,54 +303,54 @@
         slope1 = -slope2
         b1 = x + w / 2.0 - y * slope1
         b2 = x + w / 2.0 - y * slope2
-        
+
         eval1 = slope1 * posY + b1
         eval2 = slope2 * posY + b2
-        
+
         result = AssociationPointRegion.NO_REGION
-        
+
         # inside region 1
         if eval1 > posX and eval2 > posX:
             result = AssociationPointRegion.WEST
-        
-        #inside region 2
+
+        # inside region 2
         elif eval1 > posX and eval2 < posX:
             result = AssociationPointRegion.NORTH
-        
+
         # inside region 3
         elif eval1 < posX and eval2 < posX:
             result = AssociationPointRegion.EAST
-        
+
         # inside region 4
         elif eval1 < posX and eval2 > posX:
             result = AssociationPointRegion.SOUTH
-        
+
         # inside region 5
         elif eval1 == posX and eval2 < posX:
             result = AssociationPointRegion.NORTH_WEST
-        
+
         # inside region 6
         elif eval1 < posX and eval2 == posX:
             result = AssociationPointRegion.NORTH_EAST
-        
+
         # inside region 7
         elif eval1 == posX and eval2 > posX:
             result = AssociationPointRegion.SOUTH_EAST
-        
+
         # inside region 8
         elif eval1 > posX and eval2 == posX:
             result = AssociationPointRegion.SOUTH_WEST
-        
+
         # inside region 9
         elif eval1 == posX and eval2 == posX:
             result = AssociationPointRegion.CENTER
-        
+
         return result
-        
+
     def __updateEndPoint(self, region, isWidgetA):
         """
         Private method to update an endpoint.
-        
+
         @param region the region for the endpoint
         @type AssociationPointRegion
         @param isWidgetA flag indicating update for itemA is done
@@ -343,11 +358,11 @@
         """
         if region == AssociationPointRegion.NO_REGION:
             return
-        
+
         rect = (
             self.__mapRectFromItem(self.itemA)
-            if isWidgetA else
-            self.__mapRectFromItem(self.itemB)
+            if isWidgetA
+            else self.__mapRectFromItem(self.itemB)
         )
         x = rect.x()
         y = rect.y()
@@ -355,7 +370,7 @@
         wh = rect.height()
         ch = wh / 2.0
         cw = ww / 2.0
-        
+
         if region == AssociationPointRegion.WEST:
             px = x
             py = y + ch
@@ -365,23 +380,20 @@
         elif region == AssociationPointRegion.EAST:
             px = x + ww
             py = y + ch
-        elif region in (
-            AssociationPointRegion.SOUTH,
-            AssociationPointRegion.CENTER
-        ):
+        elif region in (AssociationPointRegion.SOUTH, AssociationPointRegion.CENTER):
             px = x + cw
             py = y + wh
-        
+
         if isWidgetA:
             self.setStartPoint(px, py)
         else:
             self.setEndPoint(px, py)
-        
+
     def __findRectIntersectionPoint(self, item, p1, p2):
         """
         Private method to find the intersection point of a line with a
         rectangle.
-        
+
         @param item item to check against
         @type UMLItem
         @param p1 first point of the line
@@ -396,41 +408,41 @@
             QLineF(rect.topLeft(), rect.topRight()),
             QLineF(rect.topLeft(), rect.bottomLeft()),
             QLineF(rect.bottomRight(), rect.bottomLeft()),
-            QLineF(rect.bottomRight(), rect.topRight())
+            QLineF(rect.bottomRight(), rect.topRight()),
         ]
         intersectLine = QLineF(p1, p2)
         intersectPoint = QPointF(0, 0)
         for line in lines:
             if (
-                intersectLine.intersect(line, intersectPoint) ==
-                QLineF.IntersectType.BoundedIntersection
+                intersectLine.intersect(line, intersectPoint)
+                == QLineF.IntersectType.BoundedIntersection
             ):
                 return intersectPoint
         return QPointF(-1.0, -1.0)
-        
+
     def __findIntersection(self, p1, p2, p3, p4):
         """
         Private method to calculate the intersection point of two lines.
-        
+
         The first line is determined by the points p1 and p2, the second
         line by p3 and p4. If the intersection point is not contained in
         the segment p1p2, then it returns (-1.0, -1.0).
-        
+
         For the function's internal calculations remember:<br />
         QT coordinates start with the point (0,0) as the topleft corner
         and x-values increase from left to right and y-values increase
         from top to bottom; it means the visible area is quadrant I in
         the regular XY coordinate system
-        
+
         <pre>
             Quadrant II     |   Quadrant I
            -----------------|-----------------
             Quadrant III    |   Quadrant IV
         </pre>
-        
+
         In order for the linear function calculations to work in this method
         we must switch x and y values (x values become y values and viceversa)
-        
+
         @param p1 first point of first line
         @type QPointF
         @param p2 second point of first line
@@ -450,16 +462,16 @@
         y3 = p3.x()
         x4 = p4.y()
         y4 = p4.x()
-        
+
         # line 1 is the line between (x1, y1) and (x2, y2)
         # line 2 is the line between (x3, y3) and (x4, y4)
-        no_line1 = True    # it is false, if line 1 is a linear function
-        no_line2 = True    # it is false, if line 2 is a linear function
+        no_line1 = True  # it is false, if line 1 is a linear function
+        no_line2 = True  # it is false, if line 2 is a linear function
         slope1 = 0.0
         slope2 = 0.0
         b1 = 0.0
         b2 = 0.0
-        
+
         if x2 != x1:
             slope1 = (y2 - y1) / (x2 - x1)
             b1 = y1 - slope1 * x1
@@ -468,7 +480,7 @@
             slope2 = (y4 - y3) / (x4 - x3)
             b2 = y3 - slope2 * x3
             no_line2 = False
-        
+
         pt = QPointF()
         # if either line is not a function
         if no_line1 and no_line2:
@@ -510,56 +522,60 @@
                     pt.setX(-1.0)
                     pt.setY(-1.0)
             return pt
-        
+
         if slope1 == slope2:
             pt.setX(-1.0)
             pt.setY(-1.0)
             return pt
-        
+
         pt.setY((b2 - b1) / (slope1 - slope2))
         pt.setX(slope1 * pt.y() + b1)
         # the intersection point must be inside the segment (x1, y1) (x2, y2)
         if x2 >= x1 and y2 >= y1:
-            if not ((x1 <= pt.y() and pt.y() <= x2) and
-                    (y1 <= pt.x() and pt.x() <= y2)):
+            if not (
+                (x1 <= pt.y() and pt.y() <= x2) and (y1 <= pt.x() and pt.x() <= y2)
+            ):
                 pt.setX(-1.0)
                 pt.setY(-1.0)
         elif x2 < x1 and y2 >= y1:
-            if not ((x2 <= pt.y() and pt.y() <= x1) and
-                    (y1 <= pt.x() and pt.x() <= y2)):
+            if not (
+                (x2 <= pt.y() and pt.y() <= x1) and (y1 <= pt.x() and pt.x() <= y2)
+            ):
                 pt.setX(-1.0)
                 pt.setY(-1.0)
         elif x2 >= x1 and y2 < y1:
-            if not ((x1 <= pt.y() and pt.y() <= x2) and
-                    (y2 <= pt.x() and pt.x() <= y1)):
+            if not (
+                (x1 <= pt.y() and pt.y() <= x2) and (y2 <= pt.x() and pt.x() <= y1)
+            ):
                 pt.setX(-1.0)
                 pt.setY(-1.0)
         else:
-            if not ((x2 <= pt.y() and pt.y() <= x1) and
-                    (y2 <= pt.x() and pt.x() <= y1)):
+            if not (
+                (x2 <= pt.y() and pt.y() <= x1) and (y2 <= pt.x() and pt.x() <= y1)
+            ):
                 pt.setX(-1.0)
                 pt.setY(-1.0)
-        
+
         return pt
-        
+
     def widgetMoved(self):
         """
         Public method to recalculate the association after a widget was moved.
         """
         self.calculateEndingPoints()
-        
+
     def unassociate(self):
         """
         Public method to unassociate from the widgets.
         """
         self.itemA.removeAssociation(self)
         self.itemB.removeAssociation(self)
-    
+
     @classmethod
     def parseAssociationItemDataString(cls, data):
         """
         Class method to parse the given persistence data.
-        
+
         @param data persisted data to be parsed
         @type str
         @return tuple with the IDs of the source and destination items,
@@ -582,13 +598,13 @@
                     assocType = AssociationType(int(value))
                 elif key == "topToBottom":
                     topToBottom = Utilities.toBool(value)
-        
+
         return src, dst, assocType, topToBottom
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -598,12 +614,12 @@
             "type": self.assocType.value,
             "topToBottom": self.topToBottom,
         }
-    
+
     @classmethod
     def fromDict(cls, data, umlItems, colors=None):
         """
         Class method to create an association item from persisted data.
-        
+
         @param data dictionary containing the persisted data as generated
             by toDict()
         @type dict
@@ -615,10 +631,12 @@
         @rtype AssociationItem
         """
         try:
-            return cls(umlItems[data["src"]],
-                       umlItems[data["dst"]],
-                       assocType=AssociationType(data["type"]),
-                       topToBottom=data["topToBottom"],
-                       colors=colors)
+            return cls(
+                umlItems[data["src"]],
+                umlItems[data["dst"]],
+                assocType=AssociationType(data["type"]),
+                topToBottom=data["topToBottom"],
+                colors=colors,
+            )
         except (KeyError, ValueError):
             return None
--- a/src/eric7/Graphics/ClassItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/ClassItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,11 +20,13 @@
     """
     Class implementing the class model.
     """
-    def __init__(self, name, methods=None, instanceAttributes=None,
-                 classAttributes=None):
+
+    def __init__(
+        self, name, methods=None, instanceAttributes=None, classAttributes=None
+    ):
         """
         Constructor
-        
+
         @param name the class name
         @type str
         @param methods list of method names of the class
@@ -35,68 +37,62 @@
         @type list of str
         """
         super().__init__(name)
-        
+
         self.methods = [] if methods is None else methods[:]
         self.instanceAttributes = (
-            []
-            if instanceAttributes is None else
-            instanceAttributes[:]
+            [] if instanceAttributes is None else instanceAttributes[:]
         )
-        self.classAttributes = (
-            []
-            if classAttributes is None else
-            classAttributes[:]
-        )
-    
+        self.classAttributes = [] if classAttributes is None else classAttributes[:]
+
     def addMethod(self, method):
         """
         Public method to add a method to the class model.
-        
+
         @param method method name to be added
         @type str
         """
         self.methods.append(method)
-    
+
     def addInstanceAttribute(self, attribute):
         """
         Public method to add an instance attribute to the class model.
-        
+
         @param attribute instance attribute name to be added
         @type str
         """
         self.instanceAttributes.append(attribute)
-    
+
     def addClassAttribute(self, attribute):
         """
         Public method to add a class attribute to the class model.
-        
+
         @param attribute class attribute name to be added
         @type str
         """
         self.classAttributes.append(attribute)
-    
+
     def getMethods(self):
         """
         Public method to retrieve the methods of the class.
-        
+
         @return list of class methods
         @rtype list of str
         """
         return self.methods[:]
-    
+
     def getInstanceAttributes(self):
         """
         Public method to retrieve the attributes of the class.
-        
+
         @return list of instance attributes
         @rtype list of str
         """
         return self.instanceAttributes[:]
-    
+
     def getClassAttributes(self):
         """
         Public method to retrieve the global attributes of the class.
-        
+
         @return list of class attributes
         @rtype list of str
         """
@@ -107,14 +103,24 @@
     """
     Class implementing an UML like class item.
     """
+
     ItemType = "class"
-    
-    def __init__(self, model=None, external=False, x=0, y=0,
-                 rounded=False, noAttrs=False, colors=None, parent=None,
-                 scene=None):
+
+    def __init__(
+        self,
+        model=None,
+        external=False,
+        x=0,
+        y=0,
+        rounded=False,
+        noAttrs=False,
+        colors=None,
+        parent=None,
+        scene=None,
+    ):
         """
         Constructor
-        
+
         @param model class model containing the class data
         @type ClassModel
         @param external flag indicating a class defined outside our scope
@@ -135,32 +141,32 @@
         @type QGraphicsScene
         """
         UMLItem.__init__(self, model, x, y, rounded, colors, parent)
-        
+
         self.external = external
         self.noAttrs = noAttrs
-        
+
         if scene:
             scene.addItem(self)
-        
+
         if self.model:
             self.__createTexts()
             self.__calculateSize()
-        
+
     def __createTexts(self):
         """
         Private method to create the text items of the class item.
         """
         if self.model is None:
             return
-        
+
         boldFont = QFont(self.font)
         boldFont.setBold(True)
         boldFont.setUnderline(True)
-        
+
         classAttributes = self.model.getClassAttributes()
         attrs = self.model.getInstanceAttributes()
         meths = self.model.getMethods()
-        
+
         x = self.margin + int(self.rect().x())
         y = self.margin + int(self.rect().y())
         self.header = QGraphicsSimpleTextItem(self)
@@ -169,32 +175,29 @@
         self.header.setText(self.model.getName())
         self.header.setPos(x, y)
         y += int(self.header.boundingRect().height()) + self.margin
-        
+
         if self.external:
             self.classAttributes = None
         else:
-            txt = QCoreApplication.translate(
-                "ClassItem", "Class Attributes:\n  ")
+            txt = QCoreApplication.translate("ClassItem", "Class Attributes:\n  ")
             txt += (
                 "\n  ".join(classAttributes)
-                if globals else
-                "  " + QCoreApplication.translate("ClassItem", "none")
+                if globals
+                else "  " + QCoreApplication.translate("ClassItem", "none")
             )
             self.classAttributes = QGraphicsSimpleTextItem(self)
             self.classAttributes.setBrush(self._colors[0])
             self.classAttributes.setFont(self.font)
             self.classAttributes.setText(txt)
             self.classAttributes.setPos(x, y)
-            y += (int(self.classAttributes.boundingRect().height()) +
-                  self.margin)
-        
+            y += int(self.classAttributes.boundingRect().height()) + self.margin
+
         if not self.noAttrs and not self.external:
-            txt = QCoreApplication.translate(
-                "ClassItem", "Instance Attributes:\n  ")
+            txt = QCoreApplication.translate("ClassItem", "Instance Attributes:\n  ")
             txt += (
                 "\n  ".join(attrs)
-                if attrs else
-                "  " + QCoreApplication.translate("ClassItem", "none")
+                if attrs
+                else "  " + QCoreApplication.translate("ClassItem", "none")
             )
             self.attrs = QGraphicsSimpleTextItem(self)
             self.attrs.setBrush(self._colors[0])
@@ -204,54 +207,47 @@
             y += int(self.attrs.boundingRect().height()) + self.margin
         else:
             self.attrs = None
-        
+
         if self.external:
             txt = " "
         else:
             txt = QCoreApplication.translate("ClassItem", "Methods:\n  ")
             txt += (
                 "\n  ".join(meths)
-                if meths else
-                "  " + QCoreApplication.translate("ClassItem", "none")
+                if meths
+                else "  " + QCoreApplication.translate("ClassItem", "none")
             )
         self.meths = QGraphicsSimpleTextItem(self)
         self.meths.setBrush(self._colors[0])
         self.meths.setFont(self.font)
         self.meths.setText(txt)
         self.meths.setPos(x, y)
-        
+
     def __calculateSize(self):
         """
         Private method to calculate the size of the class item.
         """
         if self.model is None:
             return
-        
+
         width = int(self.header.boundingRect().width())
         height = int(self.header.boundingRect().height())
         if self.classAttributes:
-            width = max(width,
-                        int(self.classAttributes.boundingRect().width()))
-            height += (
-                int(self.classAttributes.boundingRect().height()) + self.margin
-            )
+            width = max(width, int(self.classAttributes.boundingRect().width()))
+            height += int(self.classAttributes.boundingRect().height()) + self.margin
         if self.attrs:
-            width = max(width,
-                        int(self.attrs.boundingRect().width()))
-            height = (
-                height + int(self.attrs.boundingRect().height()) + self.margin
-            )
+            width = max(width, int(self.attrs.boundingRect().width()))
+            height = height + int(self.attrs.boundingRect().height()) + self.margin
         if self.meths:
-            width = max(width,
-                        int(self.meths.boundingRect().width()))
+            width = max(width, int(self.meths.boundingRect().width()))
             height += int(self.meths.boundingRect().height())
-        
+
         self.setSize(width + 2 * self.margin, height + 2 * self.margin)
-        
+
     def setModel(self, model):
         """
         Public method to set the class model.
-        
+
         @param model class model containing the class data
         @type ClassModel
         """
@@ -269,11 +265,11 @@
         self.model = model
         self.__createTexts()
         self.__calculateSize()
-        
+
     def paint(self, painter, option, widget=None):
         """
         Public method to paint the item in local coordinates.
-        
+
         @param painter reference to the painter object
         @type QPainter
         @param option style options
@@ -283,52 +279,46 @@
         """
         pen = self.pen()
         if (
-            (option.state & QStyle.StateFlag.State_Selected) ==
-            QStyle.StateFlag.State_Selected
-        ):
+            option.state & QStyle.StateFlag.State_Selected
+        ) == QStyle.StateFlag.State_Selected:
             pen.setWidth(2)
         else:
             pen.setWidth(1)
-        
+
         painter.setPen(pen)
         painter.setBrush(self.brush())
         painter.setFont(self.font)
-        
+
         offsetX = int(self.rect().x())
         offsetY = int(self.rect().y())
         w = int(self.rect().width())
         h = int(self.rect().height())
-        
+
         painter.drawRect(offsetX, offsetY, w, h)
         y = self.margin + int(self.header.boundingRect().height())
         painter.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y)
         if self.classAttributes:
-            y += (
-                self.margin +
-                int(self.classAttributes.boundingRect().height())
-            )
-            painter.drawLine(offsetX, offsetY + y,
-                             offsetX + w - 1, offsetY + y)
+            y += self.margin + int(self.classAttributes.boundingRect().height())
+            painter.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y)
         if self.attrs:
             y += self.margin + int(self.attrs.boundingRect().height())
-            painter.drawLine(offsetX, offsetY + y,
-                             offsetX + w - 1, offsetY + y)
-        
+            painter.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y)
+
         self.adjustAssociations()
-        
+
     def isExternal(self):
         """
         Public method returning the external state.
-        
+
         @return external state
         @rtype bool
         """
         return self.external
-    
+
     def parseItemDataString(self, version, data):
         """
         Public method to parse the given persistence data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -339,12 +329,12 @@
         parts = data.split(", ")
         if len(parts) < 3:
             return False
-        
+
         name = ""
         instanceAttributes = []
         methods = []
         classAttributes = []
-        
+
         for part in parts:
             key, value = part.split("=", 1)
             if key == "is_external":
@@ -361,18 +351,17 @@
                 classAttributes = value.strip().split("||")
             else:
                 return False
-        
-        self.model = ClassModel(name, methods, instanceAttributes,
-                                classAttributes)
+
+        self.model = ClassModel(name, methods, instanceAttributes, classAttributes)
         self.__createTexts()
         self.__calculateSize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -388,12 +377,12 @@
             "methods": self.model.getMethods(),
             "class_attributes": self.model.getClassAttributes(),
         }
-    
+
     @classmethod
     def fromDict(cls, data, colors=None):
         """
         Class method to create a class item from persisted data.
-        
+
         @param data dictionary containing the persisted data as generated
             by toDict()
         @type dict
@@ -403,16 +392,20 @@
         @rtype ClassItem
         """
         try:
-            model = ClassModel(data["model_name"],
-                               data["methods"],
-                               data["attributes"],
-                               data["class_attributes"])
-            itm = cls(model=model,
-                      external=data["is_external"],
-                      x=0,
-                      y=0,
-                      noAttrs=data["no_attributes"],
-                      colors=colors)
+            model = ClassModel(
+                data["model_name"],
+                data["methods"],
+                data["attributes"],
+                data["class_attributes"],
+            )
+            itm = cls(
+                model=model,
+                external=data["is_external"],
+                x=0,
+                y=0,
+                noAttrs=data["no_attributes"],
+                colors=colors,
+            )
             itm.setPos(data["x"], data["y"])
             itm.setId(data["id"])
             return itm
--- a/src/eric7/Graphics/GraphicsUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/GraphicsUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,18 +12,19 @@
     """
     Unable to calculate result because of recursive structure.
     """
+
     pass
 
 
 def sort(nodes, routes, noRecursion=False):
     """
     Function to sort widgets topographically.
-    
+
     Passed a list of nodes and a list of source, dest routes, it attempts
     to create a list of stages, where each sub list is one stage in a process.
-    
+
     The algorithm was taken from Boa Constructor.
-    
+
     @param nodes list of nodes to be sorted
     @type str
     @param routes list of routes between the nodes
@@ -35,7 +36,7 @@
     @exception RecursionError a recursion error was detected
     """
     children, parents = _buildChildrenLists(routes)
-    
+
     # first stage is those nodes having no incoming routes...
     stage = []
     stages = [stage]
@@ -43,17 +44,17 @@
     for node in nodes:
         if not parents.get(node):
             stage.append(node)
-    
+
     if nodes and not stage:
         # there is no element, which does not depend on some other element!
         stage.append(nodes[0])
-    
+
     taken.extend(stage)
     nodes = list(filter(lambda x, li=stage: x not in li, nodes))
     while nodes:
         previousStageChildren = []
         nodelen = len(nodes)
-        
+
         # second stage are those nodes, which are direct children of the
         # first stage
         for node in stage:
@@ -62,7 +63,7 @@
                     previousStageChildren.append(child)
                 elif child in taken and noRecursion:
                     raise RecursionError((child, node))
-        
+
         # unless they are children of other direct children...
         stage = previousStageChildren
         removes = []
@@ -70,17 +71,17 @@
             currentParents = parents.get(current, [])
             for parent in currentParents:
                 if (
-                    parent in stage and
-                    parent != current and
-                    current not in parents.get(parent, [])
+                    parent in stage
+                    and parent != current
+                    and current not in parents.get(parent, [])
                 ):
                     # is not mutually dependant
                     removes.append(current)
-        
+
         for remove in removes:
             while remove in stage:
                 stage.remove(remove)
-        
+
         stages.append(stage)
         taken.extend(stage)
         nodes = list(filter(lambda x, li=stage: x not in li, nodes))
@@ -90,16 +91,16 @@
             else:
                 stages.append(nodes[:])
                 nodes = []
-    
+
     return stages
-    
+
 
 def _buildChildrenLists(routes):
     """
     Function to build up parent - child relationships.
-    
+
     Taken from Boa Constructor.
-    
+
     @param routes list of routes between nodes
     @type list of tuple of (str, str)
     @return dictionary of child and dictionary of parent relationships
--- a/src/eric7/Graphics/ImportsDiagramBuilder.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/ImportsDiagramBuilder.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,15 +24,15 @@
 class ImportsDiagramBuilder(UMLDiagramBuilder):
     """
     Class implementing a builder for imports diagrams of a package.
-    
+
     Note: Only package internal imports are shown in order to maintain
     some readability.
     """
-    def __init__(self, dialog, view, project, package,
-                 showExternalImports=False):
+
+    def __init__(self, dialog, view, project, package, showExternalImports=False):
         """
         Constructor
-        
+
         @param dialog reference to the UML dialog
         @type UMLDialog
         @param view reference to the view object
@@ -48,68 +48,70 @@
         """
         super().__init__(dialog, view, project)
         self.setObjectName("ImportsDiagram")
-        
+
         self.showExternalImports = showExternalImports
         self.packagePath = os.path.abspath(package)
-        
+
         self.__relPackagePath = (
             self.project.getRelativePath(self.packagePath)
-            if self.project.isProjectSource(self.packagePath) else
-            ""
+            if self.project.isProjectSource(self.packagePath)
+            else ""
         )
-    
+
     def initialize(self):
         """
         Public method to initialize the object.
         """
-        self.package = os.path.splitdrive(self.packagePath)[1].replace(
-            os.sep, '.')[1:]
+        self.package = os.path.splitdrive(self.packagePath)[1].replace(os.sep, ".")[1:]
         hasInit = True
         ppath = self.packagePath
         while hasInit:
             ppath = os.path.dirname(ppath)
-            hasInit = len(glob.glob(os.path.join(ppath, '__init__.*'))) > 0
-        self.shortPackage = self.packagePath.replace(ppath, '').replace(
-            os.sep, '.')[1:]
-        
+            hasInit = len(glob.glob(os.path.join(ppath, "__init__.*"))) > 0
+        self.shortPackage = self.packagePath.replace(ppath, "").replace(os.sep, ".")[1:]
+
         pname = self.project.getProjectName()
         name = (
             self.tr("Imports Diagramm {0}: {1}").format(
-                pname, self.project.getRelativePath(self.packagePath))
-            if pname else
-            self.tr("Imports Diagramm: {0}").format(self.packagePath)
+                pname, self.project.getRelativePath(self.packagePath)
+            )
+            if pname
+            else self.tr("Imports Diagramm: {0}").format(self.packagePath)
         )
         self.umlView.setDiagramName(name)
-    
+
     def __buildModulesDict(self):
         """
         Private method to build a dictionary of modules contained in the
         package.
-        
+
         @return dictionary of modules contained in the package
         @rtype dict
         """
         import Utilities.ModuleParser
-        extensions = (
-            Preferences.getPython("Python3Extensions")
-        )
+
+        extensions = Preferences.getPython("Python3Extensions")
         moduleDict = {}
         modules = []
-        for ext in (
-            Preferences.getPython("Python3Extensions")
-        ):
-            modules.extend(glob.glob(Utilities.normjoinpath(
-                self.packagePath, '*{0}'.format(ext))))
-        
+        for ext in Preferences.getPython("Python3Extensions"):
+            modules.extend(
+                glob.glob(Utilities.normjoinpath(self.packagePath, "*{0}".format(ext)))
+            )
+
         tot = len(modules)
         progress = EricProgressDialog(
             self.tr("Parsing modules..."),
-            None, 0, tot, self.tr("%v/%m Modules"), self.parent())
+            None,
+            0,
+            tot,
+            self.tr("%v/%m Modules"),
+            self.parent(),
+        )
         progress.setWindowTitle(self.tr("Imports Diagramm"))
         try:
             progress.show()
             QApplication.processEvents()
-            
+
             now = time.monotonic()
             for prog, module in enumerate(modules):
                 progress.setValue(prog)
@@ -118,46 +120,50 @@
                     now = time.monotonic()
                 try:
                     mod = Utilities.ModuleParser.readModule(
-                        module, extensions=extensions, caching=False)
+                        module, extensions=extensions, caching=False
+                    )
                 except ImportError:
                     continue
                 else:
                     name = mod.name
                     if name.startswith(self.package):
-                        name = name[len(self.package) + 1:]
+                        name = name[len(self.package) + 1 :]
                     moduleDict[name] = mod
         finally:
             progress.setValue(tot)
             progress.deleteLater()
         return moduleDict
-    
+
     def buildDiagram(self):
         """
         Public method to build the modules shapes of the diagram.
         """
-        initlist = glob.glob(os.path.join(self.packagePath, '__init__.*'))
+        initlist = glob.glob(os.path.join(self.packagePath, "__init__.*"))
         if len(initlist) == 0:
             ct = QGraphicsTextItem(None)
-            ct.setHtml(self.buildErrorMessage(
-                self.tr("The directory <b>'{0}'</b> is not a Python"
-                        " package.").format(self.package)
-            ))
+            ct.setHtml(
+                self.buildErrorMessage(
+                    self.tr(
+                        "The directory <b>'{0}'</b> is not a Python" " package."
+                    ).format(self.package)
+                )
+            )
             self.scene.addItem(ct)
             return
-        
+
         self.__shapes = {}
-        
+
         modules = self.__buildModulesDict()
         externalMods = []
-        packageList = self.shortPackage.split('.')
+        packageList = self.shortPackage.split(".")
         packageListLen = len(packageList)
         for module in sorted(modules.keys()):
             impLst = []
             for importName in modules[module].imports:
                 n = (
-                    importName[len(self.package) + 1:]
-                    if importName.startswith(self.package) else
-                    importName
+                    importName[len(self.package) + 1 :]
+                    if importName.startswith(self.package)
+                    else importName
                 )
                 if importName in modules:
                     impLst.append(n)
@@ -166,20 +172,21 @@
                     if n not in externalMods:
                         externalMods.append(n)
             for importName in list(modules[module].from_imports.keys()):
-                if importName.startswith('.'):
-                    dots = len(importName) - len(importName.lstrip('.'))
+                if importName.startswith("."):
+                    dots = len(importName) - len(importName.lstrip("."))
                     if dots == 1:
                         n = importName[1:]
                         importName = n
                     else:
                         if self.showExternalImports:
-                            n = '.'.join(
-                                packageList[:packageListLen - dots + 1] +
-                                [importName[dots:]])
+                            n = ".".join(
+                                packageList[: packageListLen - dots + 1]
+                                + [importName[dots:]]
+                            )
                         else:
                             n = importName
                 elif importName.startswith(self.package):
-                    n = importName[len(self.package) + 1:]
+                    n = importName[len(self.package) + 1 :]
                 else:
                     n = importName
                 if importName in modules:
@@ -188,7 +195,7 @@
                     impLst.append(n)
                     if n not in externalMods:
                         externalMods.append(n)
-            
+
             classNames = []
             for class_ in list(modules[module].classes.keys()):
                 className = modules[module].classes[class_].name
@@ -196,11 +203,11 @@
                     classNames.append(className)
             shape = self.__addModule(module, classNames, 0.0, 0.0)
             self.__shapes[module] = (shape, impLst)
-        
+
         for module in externalMods:
             shape = self.__addModule(module, [], 0.0, 0.0)
             self.__shapes[module] = (shape, [])
-        
+
         # build a list of routes
         nodes = []
         routes = []
@@ -210,15 +217,15 @@
                 route = (module, rel)
                 if route not in routes:
                     routes.append(route)
-        
+
         self.__arrangeNodes(nodes, routes[:])
         self.__createAssociations(routes)
         self.umlView.autoAdjustSceneSize(limit=True)
-    
+
     def __addModule(self, name, classes, x, y):
         """
         Private method to add a module to the diagram.
-        
+
         @param name module name to be shown
         @type str
         @param classes list of class names contained in the module
@@ -231,19 +238,21 @@
         @rtype ModuleItem
         """
         from .ModuleItem import ModuleItem, ModuleModel
+
         classes.sort()
         impM = ModuleModel(name, classes)
-        impW = ModuleItem(impM, x, y, scene=self.scene,
-                          colors=self.umlView.getDrawingColors())
+        impW = ModuleItem(
+            impM, x, y, scene=self.scene, colors=self.umlView.getDrawingColors()
+        )
         impW.setId(self.umlView.getItemId())
         return impW
-    
+
     def __arrangeNodes(self, nodes, routes, whiteSpaceFactor=1.2):
         """
         Private method to arrange the shapes on the canvas.
-        
+
         The algorithm is borrowed from Boa Constructor.
-        
+
         @param nodes list of nodes to arrange
         @type list of str
         @param routes list of routes
@@ -253,16 +262,16 @@
         @type float
         """
         from . import GraphicsUtilities
+
         generations = GraphicsUtilities.sort(nodes, routes)
-        
+
         # calculate width and height of all elements
         sizes = []
         for generation in generations:
             sizes.append([])
             for child in generation:
-                sizes[-1].append(
-                    self.__shapes[child][0].sceneBoundingRect())
-                
+                sizes[-1].append(self.__shapes[child][0].sceneBoundingRect())
+
         # calculate total width and total height
         width = 0
         height = 0
@@ -271,72 +280,71 @@
         for generation in sizes:
             currentWidth = 0
             currentHeight = 0
-            
+
             for rect in generation:
                 if rect.height() > currentHeight:
                     currentHeight = rect.height()
                 currentWidth += rect.width()
-                
+
             # update totals
             if currentWidth > width:
                 width = currentWidth
             height += currentHeight
-            
+
             # store generation info
             widths.append(currentWidth)
             heights.append(currentHeight)
-        
+
         # add in some whitespace
         width *= whiteSpaceFactor
         height = height * whiteSpaceFactor - 20
         verticalWhiteSpace = 40.0
-        
+
         sceneRect = self.umlView.sceneRect()
         width += 50.0
         height += 50.0
         swidth = sceneRect.width() if width < sceneRect.width() else width
         sheight = sceneRect.height() if height < sceneRect.height() else height
         self.umlView.setSceneSize(swidth, sheight)
-        
+
         # distribute each generation across the width and the
         # generations across height
         y = 10.0
-        for currentWidth, currentHeight, generation in (
-            zip(reversed(widths), reversed(heights), reversed(generations))
+        for currentWidth, currentHeight, generation in zip(
+            reversed(widths), reversed(heights), reversed(generations)
         ):
             x = 10.0
             # whiteSpace is the space between any two elements
-            whiteSpace = (
-                (width - currentWidth - 20) /
-                (len(generation) - 1.0 or 2.0)
-            )
+            whiteSpace = (width - currentWidth - 20) / (len(generation) - 1.0 or 2.0)
             for name in generation:
                 shape = self.__shapes[name][0]
                 shape.setPos(x, y)
                 rect = shape.sceneBoundingRect()
                 x = x + rect.width() + whiteSpace
             y = y + currentHeight + verticalWhiteSpace
-    
+
     def __createAssociations(self, routes):
         """
         Private method to generate the associations between the module shapes.
-        
+
         @param routes list of associations
         @type list of tuple of (str, str)
         """
         from .AssociationItem import AssociationItem, AssociationType
+
         for route in routes:
             assoc = AssociationItem(
                 self.__shapes[route[0]][0],
                 self.__shapes[route[1]][0],
                 AssociationType.IMPORTS,
-                colors=self.umlView.getDrawingColors())
+                colors=self.umlView.getDrawingColors(),
+            )
             self.scene.addItem(assoc)
-    
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -346,24 +354,23 @@
         """
         parts = data.split(", ")
         if (
-            len(parts) != 2 or
-            not parts[0].startswith("package=") or
-            not parts[1].startswith("show_external=")
+            len(parts) != 2
+            or not parts[0].startswith("package=")
+            or not parts[1].startswith("show_external=")
         ):
             return False
-        
+
         self.packagePath = parts[0].split("=", 1)[1].strip()
-        self.showExternalImports = Utilities.toBool(
-            parts[1].split("=", 1)[1].strip())
-        
+        self.showExternalImports = Utilities.toBool(parts[1].split("=", 1)[1].strip())
+
         self.initialize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -371,19 +378,19 @@
             "project_name": self.project.getProjectName(),
             "show_external": self.showExternalImports,
         }
-        
+
         data["package"] = (
             Utilities.fromNativeSeparators(self.__relPackagePath)
-            if self.__relPackagePath else
-            Utilities.fromNativeSeparators(self.packagePath)
+            if self.__relPackagePath
+            else Utilities.fromNativeSeparators(self.packagePath)
         )
-        
+
         return data
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
@@ -394,7 +401,7 @@
         """
         try:
             self.showExternalImports = data["show_external"]
-            
+
             packagePath = Utilities.toNativeSeparators(data["package"])
             if os.path.isabs(packagePath):
                 self.packagePath = packagePath
@@ -407,12 +414,12 @@
                         " Please open it and try again.</p>"
                     ).format(data["project_name"])
                     return False, msg
-                
+
                 self.__relPackagePath = packagePath
                 self.package = self.project.getAbsolutePath(packagePath)
         except KeyError:
             return False, ""
-        
+
         self.initialize()
-        
+
         return True, ""
--- a/src/eric7/Graphics/ModuleItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/ModuleItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,32 +17,33 @@
     """
     Class implementing the module model.
     """
+
     def __init__(self, name, classlist=None):
         """
         Constructor
-        
+
         @param name the module name
         @type str
         @param classlist list of class names
         @type list of str
         """
         super().__init__(name)
-        
+
         self.classlist = [] if classlist is None else classlist[:]
-    
+
     def addClass(self, classname):
         """
         Public method to add a class to the module model.
-        
+
         @param classname class name to be added
         @type str
         """
         self.classlist.append(classname)
-    
+
     def getClasses(self):
         """
         Public method to retrieve the classes of the module.
-        
+
         @return list of class names
         @rtype list of str
         """
@@ -53,13 +54,15 @@
     """
     Class implementing a module item.
     """
+
     ItemType = "module"
-    
-    def __init__(self, model=None, x=0, y=0, rounded=False, colors=None,
-                 parent=None, scene=None):
+
+    def __init__(
+        self, model=None, x=0, y=0, rounded=False, colors=None, parent=None, scene=None
+    ):
         """
         Constructor
-        
+
         @param model module model containing the module data
         @type ModuleModel
         @param x x-coordinate
@@ -76,26 +79,26 @@
         @type QGraphicsScene
         """
         UMLItem.__init__(self, model, x, y, rounded, colors, parent)
-        
+
         if scene:
             scene.addItem(self)
-        
+
         if self.model:
             self.__createTexts()
             self.__calculateSize()
-        
+
     def __createTexts(self):
         """
         Private method to create the text items of the module item.
         """
         if self.model is None:
             return
-        
+
         boldFont = QFont(self.font)
         boldFont.setBold(True)
-        
+
         classes = self.model.getClasses()
-        
+
         x = self.margin + int(self.rect().x())
         y = self.margin + int(self.rect().y())
         self.header = QGraphicsSimpleTextItem(self)
@@ -110,25 +113,25 @@
         self.classes.setFont(self.font)
         self.classes.setText(txt)
         self.classes.setPos(x, y)
-        
+
     def __calculateSize(self):
         """
         Private method to calculate the size of the module item.
         """
         if self.model is None:
             return
-        
+
         width = int(self.header.boundingRect().width())
         height = int(self.header.boundingRect().height())
         if self.classes:
             width = max(width, int(self.classes.boundingRect().width()))
             height += int(self.classes.boundingRect().height())
         self.setSize(width + 2 * self.margin, height + 2 * self.margin)
-    
+
     def setModel(self, model):
         """
         Public method to set the module model.
-        
+
         @param model module model containing the module data
         @type ModuleModel
         """
@@ -140,11 +143,11 @@
         self.model = model
         self.__createTexts()
         self.__calculateSize()
-        
+
     def paint(self, painter, option, widget=None):
         """
         Public method to paint the item in local coordinates.
-        
+
         @param painter reference to the painter object
         @type QPainter
         @param option style options
@@ -154,32 +157,31 @@
         """
         pen = self.pen()
         if (
-            (option.state & QStyle.StateFlag.State_Selected) ==
-            QStyle.StateFlag.State_Selected
-        ):
+            option.state & QStyle.StateFlag.State_Selected
+        ) == QStyle.StateFlag.State_Selected:
             pen.setWidth(2)
         else:
             pen.setWidth(1)
-        
+
         painter.setPen(pen)
         painter.setBrush(self.brush())
         painter.setFont(self.font)
-        
+
         offsetX = int(self.rect().x())
         offsetY = int(self.rect().y())
         w = int(self.rect().width())
         h = int(self.rect().height())
-        
+
         painter.drawRect(offsetX, offsetY, w, h)
         y = self.margin + int(self.header.boundingRect().height())
         painter.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y)
-        
+
         self.adjustAssociations()
-    
+
     def parseItemDataString(self, version, data):
         """
         Public method to parse the given persistence data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -190,10 +192,10 @@
         parts = data.split(", ")
         if len(parts) < 1:
             return False
-        
+
         name = ""
         classes = []
-        
+
         for part in parts:
             key, value = part.split("=", 1)
             if key == "name":
@@ -202,17 +204,17 @@
                 classes = value.strip().split("||")
             else:
                 return False
-        
+
         self.model = ModuleModel(name, classes)
         self.__createTexts()
         self.__calculateSize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -224,12 +226,12 @@
             "model_name": self.model.getName(),
             "classes": self.model.getClasses(),
         }
-    
+
     @classmethod
     def fromDict(cls, data, colors=None):
         """
         Class method to create a class item from persisted data.
-        
+
         @param data dictionary containing the persisted data as generated
             by toDict()
         @type dict
@@ -239,12 +241,8 @@
         @rtype ClassItem
         """
         try:
-            model = ModuleModel(data["model_name"],
-                                data["classes"])
-            itm = cls(model,
-                      x=0,
-                      y=0,
-                      colors=colors)
+            model = ModuleModel(data["model_name"], data["classes"])
+            itm = cls(model, x=0, y=0, colors=colors)
             itm.setPos(data["x"], data["y"])
             itm.setId(data["id"])
             return itm
--- a/src/eric7/Graphics/PackageDiagramBuilder.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/PackageDiagramBuilder.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class implementing a builder for UML like class diagrams of a package.
     """
+
     def __init__(self, dialog, view, project, package, noAttrs=False):
         """
         Constructor
-        
+
         @param dialog reference to the UML dialog
         @type UMLDialog
         @param view reference to the view object
@@ -43,16 +44,16 @@
         """
         super().__init__(dialog, view, project)
         self.setObjectName("PackageDiagram")
-        
+
         self.package = os.path.abspath(package)
         self.noAttrs = noAttrs
-        
+
         self.__relPackage = (
             self.project.getRelativePath(self.package)
-            if self.project.isProjectSource(self.package) else
-            ""
+            if self.project.isProjectSource(self.package)
+            else ""
         )
-    
+
     def initialize(self):
         """
         Public method to initialize the object.
@@ -60,57 +61,57 @@
         pname = self.project.getProjectName()
         name = (
             self.tr("Package Diagram {0}: {1}").format(
-                pname, self.project.getRelativePath(self.package))
-            if pname else
-            self.tr("Package Diagram: {0}").format(self.package)
+                pname, self.project.getRelativePath(self.package)
+            )
+            if pname
+            else self.tr("Package Diagram: {0}").format(self.package)
         )
         self.umlView.setDiagramName(name)
-    
+
     def __getCurrentShape(self, name):
         """
         Private method to get the named shape.
-        
+
         @param name name of the shape
         @type str
         @return shape
         @rtype QCanvasItem
         """
         return self.allClasses.get(name)
-    
+
     def __buildModulesDict(self):
         """
         Private method to build a dictionary of modules contained in the
         package.
-        
+
         @return dictionary of modules contained in the package
         @rtype dict
         """
         import Utilities.ModuleParser
-        
-        supportedExt = (
-            ['*{0}'.format(ext) for ext in
-             Preferences.getPython("Python3Extensions")] +
-            ['*.rb']
-        )
-        extensions = (
-            Preferences.getPython("Python3Extensions") +
-            ['.rb']
-        )
-        
+
+        supportedExt = [
+            "*{0}".format(ext) for ext in Preferences.getPython("Python3Extensions")
+        ] + ["*.rb"]
+        extensions = Preferences.getPython("Python3Extensions") + [".rb"]
+
         moduleDict = {}
         modules = []
         for ext in supportedExt:
-            modules.extend(glob.glob(
-                Utilities.normjoinpath(self.package, ext)))
+            modules.extend(glob.glob(Utilities.normjoinpath(self.package, ext)))
         tot = len(modules)
         progress = EricProgressDialog(
             self.tr("Parsing modules..."),
-            None, 0, tot, self.tr("%v/%m Modules"), self.parent())
+            None,
+            0,
+            tot,
+            self.tr("%v/%m Modules"),
+            self.parent(),
+        )
         progress.setWindowTitle(self.tr("Package Diagram"))
         try:
             progress.show()
             QApplication.processEvents()
-            
+
             now = time.monotonic()
             for prog, module in enumerate(modules):
                 progress.setValue(prog)
@@ -119,73 +120,71 @@
                     now = time.monotonic()
                 try:
                     mod = Utilities.ModuleParser.readModule(
-                        module, extensions=extensions, caching=False)
+                        module, extensions=extensions, caching=False
+                    )
                 except ImportError:
                     continue
                 else:
                     name = mod.name
                     if name.startswith(self.package):
-                        name = name[len(self.package) + 1:]
+                        name = name[len(self.package) + 1 :]
                     moduleDict[name] = mod
         finally:
             progress.setValue(tot)
             progress.deleteLater()
         return moduleDict
-    
+
     def __buildSubpackagesDict(self):
         """
         Private method to build a dictionary of sub-packages contained in this
         package.
-        
+
         @return dictionary of sub-packages contained in this package
         @rtype dict
         """
         import Utilities.ModuleParser
-        
-        supportedExt = (
-            ['*{0}'.format(ext) for ext in
-             Preferences.getPython("Python3Extensions")] +
-            ['*.rb']
-        )
-        extensions = (
-            Preferences.getPython("Python3Extensions") +
-            ['.rb']
-        )
-        
+
+        supportedExt = [
+            "*{0}".format(ext) for ext in Preferences.getPython("Python3Extensions")
+        ] + ["*.rb"]
+        extensions = Preferences.getPython("Python3Extensions") + [".rb"]
+
         subpackagesDict = {}
         subpackagesList = []
-        
+
         for subpackage in os.listdir(self.package):
             subpackagePath = os.path.join(self.package, subpackage)
             if (
-                os.path.isdir(subpackagePath) and
-                subpackage != "__pycache__" and
-                len(glob.glob(
-                    os.path.join(subpackagePath, "__init__.*")
-                )) != 0
+                os.path.isdir(subpackagePath)
+                and subpackage != "__pycache__"
+                and len(glob.glob(os.path.join(subpackagePath, "__init__.*"))) != 0
             ):
                 subpackagesList.append(subpackagePath)
-        
+
         tot = 0
         for ext in supportedExt:
             for subpackage in subpackagesList:
                 tot += len(glob.glob(Utilities.normjoinpath(subpackage, ext)))
         progress = EricProgressDialog(
             self.tr("Parsing modules..."),
-            None, 0, tot, self.tr("%v/%m Modules"), self.parent())
+            None,
+            0,
+            tot,
+            self.tr("%v/%m Modules"),
+            self.parent(),
+        )
         progress.setWindowTitle(self.tr("Package Diagram"))
         try:
             progress.show()
             QApplication.processEvents()
-            
+
             now = time.monotonic()
             for subpackage in subpackagesList:
                 packageName = os.path.basename(subpackage)
                 subpackagesDict[packageName] = []
                 modules = []
                 for ext in supportedExt:
-                    modules.extend(glob.glob(
-                        Utilities.normjoinpath(subpackage, ext)))
+                    modules.extend(glob.glob(Utilities.normjoinpath(subpackage, ext)))
                 for prog, module in enumerate(modules):
                     progress.setValue(prog)
                     if time.monotonic() - now > 0.01:
@@ -193,7 +192,8 @@
                         now = time.monotonic()
                     try:
                         mod = Utilities.ModuleParser.readModule(
-                            module, extensions=extensions, caching=False)
+                            module, extensions=extensions, caching=False
+                        )
                     except ImportError:
                         continue
                     else:
@@ -210,39 +210,45 @@
             progress.setValue(tot)
             progress.deleteLater()
         return subpackagesDict
-    
+
     def buildDiagram(self):
         """
         Public method to build the class shapes of the package diagram.
-        
+
         The algorithm is borrowed from Boa Constructor.
         """
         self.allClasses = {}
-        
-        initlist = glob.glob(os.path.join(self.package, '__init__.*'))
+
+        initlist = glob.glob(os.path.join(self.package, "__init__.*"))
         if len(initlist) == 0:
             ct = QGraphicsTextItem(None)
             self.scene.addItem(ct)
             ct.setHtml(
-                self.tr("The directory <b>'{0}'</b> is not a package.")
-                    .format(self.package))
+                self.tr("The directory <b>'{0}'</b> is not a package.").format(
+                    self.package
+                )
+            )
             return
-        
+
         modules = self.__buildModulesDict()
         subpackages = self.__buildSubpackagesDict()
-        
+
         if not modules and not subpackages:
             ct = QGraphicsTextItem(None)
             self.scene.addItem(ct)
-            ct.setHtml(self.buildErrorMessage(
-                self.tr("The package <b>'{0}'</b> does not contain any modules"
-                        " or subpackages.").format(self.package)
-            ))
+            ct.setHtml(
+                self.buildErrorMessage(
+                    self.tr(
+                        "The package <b>'{0}'</b> does not contain any modules"
+                        " or subpackages."
+                    ).format(self.package)
+                )
+            )
             return
-            
+
         # step 1: build all classes found in the modules
         classesFound = False
-        
+
         for modName in list(modules.keys()):
             module = modules[modName]
             for cls in list(module.classes.keys()):
@@ -251,16 +257,20 @@
         if not classesFound and not subpackages:
             ct = QGraphicsTextItem(None)
             self.scene.addItem(ct)
-            ct.setHtml(self.buildErrorMessage(
-                self.tr("The package <b>'{0}'</b> does not contain any"
-                        " classes or subpackages.").format(self.package)
-            ))
+            ct.setHtml(
+                self.buildErrorMessage(
+                    self.tr(
+                        "The package <b>'{0}'</b> does not contain any"
+                        " classes or subpackages."
+                    ).format(self.package)
+                )
+            )
             return
-        
+
         # step 2: build the class hierarchies
         routes = []
         nodes = []
-        
+
         for modName in list(modules.keys()):
             module = modules[modName]
             todo = [module.createHierarchy()]
@@ -268,57 +278,57 @@
                 hierarchy = todo[0]
                 for className in hierarchy:
                     cw = self.__getCurrentShape(className)
-                    if not cw and className.find('.') >= 0:
-                        cw = self.__getCurrentShape(className.split('.')[-1])
+                    if not cw and className.find(".") >= 0:
+                        cw = self.__getCurrentShape(className.split(".")[-1])
                         if cw:
                             self.allClasses[className] = cw
                     if cw and cw.noAttrs != self.noAttrs:
                         cw = None
-                    if cw and not (cw.external and
-                                   (className in module.classes or
-                                    className in module.modules)
-                                   ):
+                    if cw and not (
+                        cw.external
+                        and (className in module.classes or className in module.modules)
+                    ):
                         if className not in nodes:
                             nodes.append(className)
                     else:
                         if className in module.classes:
                             # this is a local class (defined in this module)
                             self.__addLocalClass(
-                                className, module.classes[className],
-                                0, 0)
+                                className, module.classes[className], 0, 0
+                            )
                         elif className in module.modules:
                             # this is a local module (defined in this module)
                             self.__addLocalClass(
-                                className, module.modules[className],
-                                0, 0, True)
+                                className, module.modules[className], 0, 0, True
+                            )
                         else:
                             self.__addExternalClass(className, 0, 0)
                         nodes.append(className)
-                    
+
                     if hierarchy.get(className):
                         todo.append(hierarchy.get(className))
                         children = list(hierarchy.get(className).keys())
                         for child in children:
                             if (className, child) not in routes:
                                 routes.append((className, child))
-                
+
                 del todo[0]
-        
+
         # step 3: build the subpackages
         for subpackage in sorted(subpackages.keys()):
             self.__addPackage(subpackage, subpackages[subpackage], 0, 0)
             nodes.append(subpackage)
-        
+
         self.__arrangeClasses(nodes, routes[:])
         self.__createAssociations(routes)
         self.umlView.autoAdjustSceneSize(limit=True)
-    
+
     def __arrangeClasses(self, nodes, routes, whiteSpaceFactor=1.2):
         """
         Private method to arrange the shapes on the canvas.
-        
+
         The algorithm is borrowed from Boa Constructor.
-        
+
         @param nodes list of nodes to arrange
         @type list of str
         @param routes list of routes
@@ -328,16 +338,16 @@
         @type float
         """
         from . import GraphicsUtilities
+
         generations = GraphicsUtilities.sort(nodes, routes)
-        
+
         # calculate width and height of all elements
         sizes = []
         for generation in generations:
             sizes.append([])
             for child in generation:
-                sizes[-1].append(
-                    self.__getCurrentShape(child).sceneBoundingRect())
-                
+                sizes[-1].append(self.__getCurrentShape(child).sceneBoundingRect())
+
         # calculate total width and total height
         width = 0
         height = 0
@@ -346,56 +356,53 @@
         for generation in sizes:
             currentWidth = 0
             currentHeight = 0
-            
+
             for rect in generation:
                 if rect.bottom() > currentHeight:
                     currentHeight = rect.bottom()
                 currentWidth += rect.right()
-                
+
             # update totals
             if currentWidth > width:
                 width = currentWidth
             height += currentHeight
-            
+
             # store generation info
             widths.append(currentWidth)
             heights.append(currentHeight)
-        
+
         # add in some whitespace
         width *= whiteSpaceFactor
         height = height * whiteSpaceFactor - 20
         verticalWhiteSpace = 40.0
-        
+
         sceneRect = self.umlView.sceneRect()
         width += 50.0
         height += 50.0
         swidth = sceneRect.width() if width < sceneRect.width() else width
         sheight = sceneRect.height() if height < sceneRect.height() else height
         self.umlView.setSceneSize(swidth, sheight)
-        
+
         # distribute each generation across the width and the
         # generations across height
         y = 10.0
-        for currentWidth, currentHeight, generation in (
-            zip_longest(widths, heights, generations)
+        for currentWidth, currentHeight, generation in zip_longest(
+            widths, heights, generations
         ):
             x = 10.0
             # whiteSpace is the space between any two elements
-            whiteSpace = (
-                (width - currentWidth - 20) /
-                (len(generation) - 1.0 or 2.0)
-            )
+            whiteSpace = (width - currentWidth - 20) / (len(generation) - 1.0 or 2.0)
             for className in generation:
                 cw = self.__getCurrentShape(className)
                 cw.setPos(x, y)
                 rect = cw.sceneBoundingRect()
                 x = x + rect.width() + whiteSpace
             y = y + currentHeight + verticalWhiteSpace
-    
+
     def __addLocalClass(self, className, _class, x, y, isRbModule=False):
         """
         Private method to add a class defined in the module.
-        
+
         @param className name of the class to be as a dictionary key
         @type str
         @param _class class to be shown
@@ -408,6 +415,7 @@
         @type bool
         """
         from .ClassItem import ClassItem, ClassModel
+
         name = _class.name
         if isRbModule:
             name = "{0} (Module)".format(name)
@@ -415,20 +423,27 @@
             name,
             sorted(_class.methods.keys())[:],
             sorted(_class.attributes.keys())[:],
-            sorted(_class.globals.keys())[:]
+            sorted(_class.globals.keys())[:],
         )
-        cw = ClassItem(cl, False, x, y, noAttrs=self.noAttrs, scene=self.scene,
-                       colors=self.umlView.getDrawingColors())
+        cw = ClassItem(
+            cl,
+            False,
+            x,
+            y,
+            noAttrs=self.noAttrs,
+            scene=self.scene,
+            colors=self.umlView.getDrawingColors(),
+        )
         cw.setId(self.umlView.getItemId())
         self.allClasses[className] = cw
-    
+
     def __addExternalClass(self, _class, x, y):
         """
         Private method to add a class defined outside the module.
-        
+
         If the canvas is too small to take the shape, it
         is enlarged.
-        
+
         @param _class class to be shown
         @type ModuleParser.Class
         @param x x-coordinate
@@ -437,16 +452,24 @@
         @type float
         """
         from .ClassItem import ClassItem, ClassModel
+
         cl = ClassModel(_class)
-        cw = ClassItem(cl, True, x, y, noAttrs=self.noAttrs, scene=self.scene,
-                       colors=self.umlView.getDrawingColors())
+        cw = ClassItem(
+            cl,
+            True,
+            x,
+            y,
+            noAttrs=self.noAttrs,
+            scene=self.scene,
+            colors=self.umlView.getDrawingColors(),
+        )
         cw.setId(self.umlView.getItemId())
         self.allClasses[_class] = cw
-    
+
     def __addPackage(self, name, modules, x, y):
         """
         Private method to add a package to the diagram.
-        
+
         @param name package name to be shown
         @type str
         @param modules list of module names contained in the package
@@ -457,20 +480,23 @@
         @type float
         """
         from .PackageItem import PackageItem, PackageModel
+
         pm = PackageModel(name, modules)
-        pw = PackageItem(pm, x, y, scene=self.scene,
-                         colors=self.umlView.getDrawingColors())
+        pw = PackageItem(
+            pm, x, y, scene=self.scene, colors=self.umlView.getDrawingColors()
+        )
         pw.setId(self.umlView.getItemId())
         self.allClasses[name] = pw
-    
+
     def __createAssociations(self, routes):
         """
         Private method to generate the associations between the class shapes.
-        
+
         @param routes list of relationsships
         @type list of tuple of (str, str)
         """
         from .AssociationItem import AssociationItem, AssociationType
+
         for route in routes:
             if len(route) > 1:
                 assoc = AssociationItem(
@@ -478,13 +504,14 @@
                     self.__getCurrentShape(route[0]),
                     AssociationType.GENERALISATION,
                     topToBottom=True,
-                    colors=self.umlView.getDrawingColors())
+                    colors=self.umlView.getDrawingColors(),
+                )
                 self.scene.addItem(assoc)
-    
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -494,23 +521,23 @@
         """
         parts = data.split(", ")
         if (
-            len(parts) != 2 or
-            not parts[0].startswith("package=") or
-            not parts[1].startswith("no_attributes=")
+            len(parts) != 2
+            or not parts[0].startswith("package=")
+            or not parts[1].startswith("no_attributes=")
         ):
             return False
-        
+
         self.package = parts[0].split("=", 1)[1].strip()
         self.noAttrs = Utilities.toBool(parts[1].split("=", 1)[1].strip())
-        
+
         self.initialize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -518,19 +545,19 @@
             "project_name": self.project.getProjectName(),
             "no_attributes": self.noAttrs,
         }
-        
+
         data["package"] = (
             Utilities.fromNativeSeparators(self.__relPackage)
-            if self.__relPackage else
-            Utilities.fromNativeSeparators(self.package)
+            if self.__relPackage
+            else Utilities.fromNativeSeparators(self.package)
         )
-        
+
         return data
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
@@ -541,7 +568,7 @@
         """
         try:
             self.noAttrs = data["no_attributes"]
-            
+
             package = Utilities.toNativeSeparators(data["package"])
             if os.path.isabs(package):
                 self.package = package
@@ -554,12 +581,12 @@
                         " Please open it and try again.</p>"
                     ).format(data["project_name"])
                     return False, msg
-                
+
                 self.__relPackage = package
                 self.package = self.project.getAbsolutePath(package)
         except KeyError:
             return False, ""
-        
+
         self.initialize()
-        
+
         return True, ""
--- a/src/eric7/Graphics/PackageItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/PackageItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,32 +19,33 @@
     """
     Class implementing the package model.
     """
+
     def __init__(self, name, moduleslist=None):
         """
         Constructor
-        
+
         @param name package name
         @type str
         @param moduleslist list of module names
         @type list of str
         """
         super().__init__(name)
-        
+
         self.moduleslist = [] if moduleslist is None else moduleslist[:]
-    
+
     def addModule(self, modulename):
         """
         Public method to add a module to the package model.
-        
+
         @param modulename module name to be added
         @type str
         """
         self.moduleslist.append(modulename)
-    
+
     def getModules(self):
         """
         Public method to retrieve the modules of the package.
-        
+
         @return list of module names
         @rtype list of str
         """
@@ -55,13 +56,23 @@
     """
     Class implementing a package item.
     """
+
     ItemType = "package"
-    
-    def __init__(self, model=None, x=0, y=0, rounded=False,
-                 noModules=False, colors=None, parent=None, scene=None):
+
+    def __init__(
+        self,
+        model=None,
+        x=0,
+        y=0,
+        rounded=False,
+        noModules=False,
+        colors=None,
+        parent=None,
+        scene=None,
+    ):
         """
         Constructor
-        
+
         @param model package model containing the package data
         @type PackageModel
         @param x x-coordinate
@@ -82,26 +93,26 @@
         """
         UMLItem.__init__(self, model, x, y, rounded, colors, parent)
         self.noModules = noModules
-        
+
         if scene:
             scene.addItem(self)
-        
+
         if self.model:
             self.__createTexts()
             self.__calculateSize()
-        
+
     def __createTexts(self):
         """
         Private method to create the text items of the class item.
         """
         if self.model is None:
             return
-        
+
         boldFont = QFont(self.font)
         boldFont.setBold(True)
-        
+
         modules = self.model.getModules()
-        
+
         x = self.margin + int(self.rect().x())
         y = self.margin + int(self.rect().y())
         self.header = QGraphicsSimpleTextItem(self)
@@ -110,7 +121,7 @@
         self.header.setText(self.model.getName())
         self.header.setPos(x, y)
         y += int(self.header.boundingRect().height()) + self.margin
-        
+
         if not self.noModules:
             if modules:
                 txt = "\n".join(modules)
@@ -123,36 +134,34 @@
             self.modules.setPos(x, y)
         else:
             self.modules = None
-        
+
     def __calculateSize(self):
         """
         Private method to calculate the size of the package widget.
         """
         if self.model is None:
             return
-        
+
         width = int(self.header.boundingRect().width())
         height = int(self.header.boundingRect().height())
         if self.modules:
-            width = max(width,
-                        int(self.modules.boundingRect().width()))
+            width = max(width, int(self.modules.boundingRect().width()))
             height += int(self.modules.boundingRect().height())
         latchW = width / 3.0
         latchH = min(15.0, latchW)
-        self.setSize(width + 2 * self.margin,
-                     height + latchH + 2 * self.margin)
-        
+        self.setSize(width + 2 * self.margin, height + latchH + 2 * self.margin)
+
         x = self.margin + int(self.rect().x())
         y = self.margin + int(self.rect().y()) + latchH
         self.header.setPos(x, y)
         y += int(self.header.boundingRect().height()) + self.margin
         if self.modules:
             self.modules.setPos(x, y)
-       
+
     def setModel(self, model):
         """
         Public method to set the package model.
-        
+
         @param model package model containing the package data
         @type PackageModel
         """
@@ -164,11 +173,11 @@
         self.model = model
         self.__createTexts()
         self.__calculateSize()
-        
+
     def paint(self, painter, option, widget=None):
         """
         Public method to paint the item in local coordinates.
-        
+
         @param painter reference to the painter object
         @type QPainter
         @param option style options
@@ -178,35 +187,34 @@
         """
         pen = self.pen()
         if (
-            (option.state & QStyle.StateFlag.State_Selected) ==
-            QStyle.StateFlag.State_Selected
-        ):
+            option.state & QStyle.StateFlag.State_Selected
+        ) == QStyle.StateFlag.State_Selected:
             pen.setWidth(2)
         else:
             pen.setWidth(1)
-        
+
         offsetX = int(self.rect().x())
         offsetY = int(self.rect().y())
         w = int(self.rect().width())
         latchW = w / 3.0
         latchH = min(15.0, latchW)
         h = int(self.rect().height() - latchH + 1)
-        
+
         painter.setPen(pen)
         painter.setBrush(self.brush())
         painter.setFont(self.font)
-        
+
         painter.drawRect(offsetX, offsetY, int(latchW), int(latchH))
         painter.drawRect(offsetX, offsetY + int(latchH), w, h)
         y = int(self.margin + self.header.boundingRect().height() + latchH)
         painter.drawLine(offsetX, offsetY + y, offsetX + w - 1, offsetY + y)
-        
+
         self.adjustAssociations()
-    
+
     def parseItemDataString(self, version, data):
         """
         Public method to parse the given persistence data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -217,10 +225,10 @@
         parts = data.split(", ")
         if len(parts) < 2:
             return False
-        
+
         name = ""
         modules = []
-        
+
         for part in parts:
             key, value = part.split("=", 1)
             if key == "no_modules":
@@ -231,17 +239,17 @@
                 modules = value.strip().split("||")
             else:
                 return False
-        
+
         self.model = PackageModel(name, modules)
         self.__createTexts()
         self.__calculateSize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -254,12 +262,12 @@
             "no_nodules": self.noModules,
             "modules": self.model.getModules(),
         }
-    
+
     @classmethod
     def fromDict(cls, data, colors=None):
         """
         Class method to create a class item from persisted data.
-        
+
         @param data dictionary containing the persisted data as generated
             by toDict()
         @type dict
@@ -269,13 +277,8 @@
         @rtype ClassItem
         """
         try:
-            model = PackageModel(data["model_name"],
-                                 data["modules"])
-            itm = cls(model,
-                      x=0,
-                      y=0,
-                      noModules=data["no_nodules"],
-                      colors=colors)
+            model = PackageModel(data["model_name"], data["modules"])
+            itm = cls(model, x=0, y=0, noModules=data["no_nodules"], colors=colors)
             itm.setPos(data["x"], data["y"])
             itm.setId(data["id"])
             return itm
--- a/src/eric7/Graphics/PixmapDiagram.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/PixmapDiagram.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,11 +9,16 @@
 
 from PyQt6.QtCore import Qt, QSize, QEvent, QMarginsF
 from PyQt6.QtGui import (
-    QPalette, QImage, QPixmap, QPainter, QFont, QColor, QAction, QPageLayout
+    QPalette,
+    QImage,
+    QPixmap,
+    QPainter,
+    QFont,
+    QColor,
+    QAction,
+    QPageLayout,
 )
-from PyQt6.QtWidgets import (
-    QLabel, QSizePolicy, QScrollArea, QMenu, QToolBar
-)
+from PyQt6.QtWidgets import QLabel, QSizePolicy, QScrollArea, QMenu, QToolBar
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog
 
 from EricWidgets import EricMessageBox
@@ -29,19 +34,43 @@
     """
     Class implementing a dialog showing a pixmap.
     """
+
     ZoomLevels = [
-        1, 3, 5, 7, 9,
-        10, 20, 30, 50, 67, 80, 90,
+        1,
+        3,
+        5,
+        7,
+        9,
+        10,
+        20,
+        30,
+        50,
+        67,
+        80,
+        90,
         100,
-        110, 120, 133, 150, 170, 200, 240, 300, 400,
-        500, 600, 700, 800, 900, 1000,
+        110,
+        120,
+        133,
+        150,
+        170,
+        200,
+        240,
+        300,
+        400,
+        500,
+        600,
+        700,
+        800,
+        900,
+        1000,
     ]
     ZoomLevelDefault = 100
-    
+
     def __init__(self, pixmap, parent=None, name=None):
         """
         Constructor
-        
+
         @param pixmap filename of a graphics file to show
         @type str
         @param parent parent widget of the view
@@ -55,61 +84,61 @@
         else:
             self.setObjectName("PixmapDiagram")
         self.setWindowTitle(self.tr("Pixmap-Viewer"))
-        
+
         self.pixmapLabel = QLabel()
         self.pixmapLabel.setObjectName("pixmapLabel")
         self.pixmapLabel.setBackgroundRole(QPalette.ColorRole.Base)
         self.pixmapLabel.setSizePolicy(
-            QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored)
+            QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored
+        )
         self.pixmapLabel.setScaledContents(True)
-        
+
         self.pixmapView = QScrollArea()
         self.pixmapView.setObjectName("pixmapView")
         self.pixmapView.setBackgroundRole(QPalette.ColorRole.Dark)
         self.pixmapView.setWidget(self.pixmapLabel)
-        
+
         self.setCentralWidget(self.pixmapView)
-        
+
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         self.statusBar().addPermanentWidget(self.__zoomWidget)
         self.__zoomWidget.setMapping(
-            PixmapDiagram.ZoomLevels, PixmapDiagram.ZoomLevelDefault)
+            PixmapDiagram.ZoomLevels, PixmapDiagram.ZoomLevelDefault
+        )
         self.__zoomWidget.valueChanged.connect(self.__doZoom)
-        
+
         # polish up the dialog
         self.resize(QSize(800, 600).expandedTo(self.minimumSizeHint()))
-        
+
         self.pixmapfile = pixmap
         self.status = self.__showPixmap(self.pixmapfile)
-        
+
         self.__initActions()
         self.__initContextMenu()
         self.__initToolBars()
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-    
+
     def __initActions(self):
         """
         Private method to initialize the view actions.
         """
-        self.closeAct = QAction(
-            UI.PixmapCache.getIcon("close"),
-            self.tr("Close"), self)
+        self.closeAct = QAction(UI.PixmapCache.getIcon("close"), self.tr("Close"), self)
         self.closeAct.triggered.connect(self.close)
-        
-        self.printAct = QAction(
-            UI.PixmapCache.getIcon("print"),
-            self.tr("Print"), self)
+
+        self.printAct = QAction(UI.PixmapCache.getIcon("print"), self.tr("Print"), self)
         self.printAct.triggered.connect(self.__printDiagram)
-        
+
         self.printPreviewAct = QAction(
-            UI.PixmapCache.getIcon("printPreview"),
-            self.tr("Print Preview"), self)
+            UI.PixmapCache.getIcon("printPreview"), self.tr("Print Preview"), self
+        )
         self.printPreviewAct.triggered.connect(self.__printPreviewDiagram)
-        
+
     def __initContextMenu(self):
         """
         Private method to initialize the context menu.
@@ -119,19 +148,19 @@
         self.__menu.addSeparator()
         self.__menu.addAction(self.printPreviewAct)
         self.__menu.addAction(self.printAct)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
-        
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         """
         self.__menu.popup(self.mapToGlobal(coord))
-        
+
     def __initToolBars(self):
         """
         Private method to populate the toolbars with our actions.
@@ -139,19 +168,19 @@
         self.windowToolBar = QToolBar(self.tr("Window"), self)
         self.windowToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.windowToolBar.addAction(self.closeAct)
-        
+
         self.graphicsToolBar = QToolBar(self.tr("Graphics"), self)
         self.graphicsToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.graphicsToolBar.addAction(self.printPreviewAct)
         self.graphicsToolBar.addAction(self.printAct)
-        
+
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.windowToolBar)
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.graphicsToolBar)
-        
+
     def __showPixmap(self, filename):
         """
         Private method to show a file.
-        
+
         @param filename name of the file to be shown
         @type str
         @return flag indicating success
@@ -164,35 +193,37 @@
                 self.tr("Pixmap-Viewer"),
                 self.tr(
                     """<p>The file <b>{0}</b> cannot be displayed."""
-                    """ The format is not supported.</p>""").format(filename))
+                    """ The format is not supported.</p>"""
+                ).format(filename),
+            )
             return False
-        
+
         self.pixmapLabel.setPixmap(QPixmap.fromImage(image))
         self.pixmapLabel.adjustSize()
         return True
-        
+
     def getDiagramName(self):
         """
         Public method to retrieve a name for the diagram.
-        
+
         @return name for the diagram
         @rtype str
         """
         return self.pixmapfile
-        
+
     def getStatus(self):
         """
         Public method to retrieve the status of the canvas.
-        
+
         @return flag indicating a successful pixmap loading
         @rtype bool
         """
         return self.status
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -204,13 +235,13 @@
                 self.__zoomIn()
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating, if the event was handled
@@ -219,13 +250,13 @@
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -236,27 +267,28 @@
             elif pinch.state() == Qt.GestureState.GestureUpdated:
                 self.__doZoom(int(pinch.totalScaleFactor() * 100))
             evt.accept()
-    
+
     ###########################################################################
     ## Private menu handling methods below.
     ###########################################################################
-    
+
     def __adjustScrollBar(self, scrollBar, factor):
         """
         Private method to adjust a scrollbar by a certain factor.
-        
+
         @param scrollBar reference to the scrollbar object
         @type QScrollBar
         @param factor factor to adjust by
         @type float
         """
-        scrollBar.setValue(int(factor * scrollBar.value() +
-                           ((factor - 1) * scrollBar.pageStep() / 2)))
-        
+        scrollBar.setValue(
+            int(factor * scrollBar.value() + ((factor - 1) * scrollBar.pageStep() / 2))
+        )
+
     def __levelForZoom(self, zoom):
         """
         Private method determining the zoom level index given a zoom factor.
-        
+
         @param zoom zoom factor
         @type int
         @return index of zoom factor
@@ -269,27 +301,24 @@
                 if zoom <= PixmapDiagram.ZoomLevels[index]:
                     break
         return index
-    
+
     def __doZoom(self, value):
         """
         Private method to set the zoom value in percent.
-        
+
         @param value zoom value in percent
         @type int
         """
         oldValue = self.__zoom()
         if value != oldValue:
-            self.pixmapLabel.resize(
-                value / 100 * self.pixmapLabel.pixmap().size())
-            
+            self.pixmapLabel.resize(value / 100 * self.pixmapLabel.pixmap().size())
+
             factor = value / oldValue
-            self.__adjustScrollBar(
-                self.pixmapView.horizontalScrollBar(), factor)
-            self.__adjustScrollBar(
-                self.pixmapView.verticalScrollBar(), factor)
-            
+            self.__adjustScrollBar(self.pixmapView.horizontalScrollBar(), factor)
+            self.__adjustScrollBar(self.pixmapView.verticalScrollBar(), factor)
+
             self.__zoomWidget.setValue(value)
-        
+
     def __zoomIn(self):
         """
         Private method to zoom into the pixmap.
@@ -297,7 +326,7 @@
         index = self.__levelForZoom(self.__zoom())
         if index < len(PixmapDiagram.ZoomLevels) - 1:
             self.__doZoom(PixmapDiagram.ZoomLevels[index + 1])
-        
+
     def __zoomOut(self):
         """
         Private method to zoom out of the pixmap.
@@ -305,23 +334,22 @@
         index = self.__levelForZoom(self.__zoom())
         if index > 0:
             self.__doZoom(PixmapDiagram.ZoomLevels[index - 1])
-        
+
     def __zoomReset(self):
         """
         Private method to reset the zoom value.
         """
         self.__doZoom(PixmapDiagram.ZoomLevels[PixmapDiagram.ZoomLevelDefault])
-        
+
     def __zoom(self):
         """
         Private method to get the current zoom factor in percent.
-        
+
         @return current zoom factor in percent
         @rtype int
         """
-        return int(self.pixmapLabel.width() /
-                   self.pixmapLabel.pixmap().width() * 100.0)
-        
+        return int(self.pixmapLabel.width() / self.pixmapLabel.pixmap().width() * 100.0)
+
     def __printDiagram(self):
         """
         Private slot called to print the diagram.
@@ -337,17 +365,17 @@
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
         printer.setPrinterName(Preferences.getPrinter("PrinterName"))
-        
+
         printDialog = QPrintDialog(printer, self)
         if printDialog.exec():
             self.__print(printer)
-        
+
     def __printPreviewDiagram(self):
         """
         Private slot called to show a print preview of the diagram.
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
-        
+
         printer = QPrinter(mode=QPrinter.PrinterMode.ScreenResolution)
         printer.setFullPage(True)
         if Preferences.getPrinter("ColorMode"):
@@ -358,23 +386,25 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printer.setPrinterName(Preferences.getPrinter("PrinterName"))
-        
+
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested[QPrinter].connect(self.__print)
         preview.exec()
-        
+
     def __print(self, printer):
         """
         Private slot to the actual printing.
-        
+
         @param printer reference to the printer object
         @type QPrinter
         """
@@ -387,31 +417,33 @@
         fm = painter.fontMetrics()
         fontHeight = fm.lineSpacing()
         marginX = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).x() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).x()
+            printer.pageLayout().paintRectPixels(printer.resolution()).x()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).x()
         )
         marginX = (
-            Preferences.getPrinter("LeftMargin") *
-            int(printer.resolution() / 2.54) - marginX
+            Preferences.getPrinter("LeftMargin") * int(printer.resolution() / 2.54)
+            - marginX
         )
         marginY = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).y() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).y()
+            printer.pageLayout().paintRectPixels(printer.resolution()).y()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).y()
         )
         marginY = (
-            Preferences.getPrinter("TopMargin") *
-            int(printer.resolution() / 2.54) - marginY
+            Preferences.getPrinter("TopMargin") * int(printer.resolution() / 2.54)
+            - marginY
         )
 
         width = (
-            printer.width() - marginX -
-            Preferences.getPrinter("RightMargin") *
-            int(printer.resolution() / 2.54)
+            printer.width()
+            - marginX
+            - Preferences.getPrinter("RightMargin") * int(printer.resolution() / 2.54)
         )
         height = (
-            printer.height() - fontHeight - 4 - marginY -
-            Preferences.getPrinter("BottomMargin") *
-            int(printer.resolution() / 2.54)
+            printer.height()
+            - fontHeight
+            - 4
+            - marginY
+            - Preferences.getPrinter("BottomMargin") * int(printer.resolution() / 2.54)
         )
 
         # write a foot note
@@ -419,18 +451,26 @@
         tc = QColor(50, 50, 50)
         painter.setPen(tc)
         painter.drawRect(marginX, marginY, width, height)
-        painter.drawLine(marginX, marginY + height + 2,
-                         marginX + width, marginY + height + 2)
+        painter.drawLine(
+            marginX, marginY + height + 2, marginX + width, marginY + height + 2
+        )
         painter.setFont(font)
-        painter.drawText(marginX, marginY + height + 4, width,
-                         fontHeight, Qt.AlignmentFlag.AlignRight, s)
+        painter.drawText(
+            marginX,
+            marginY + height + 4,
+            width,
+            fontHeight,
+            Qt.AlignmentFlag.AlignRight,
+            s,
+        )
 
         # render the diagram
         size = self.pixmapLabel.pixmap().size()
-        size.scale(QSize(width - 10, height - 10),  # 5 px inner margin
-                   Qt.AspectRatioMode.KeepAspectRatio)
-        painter.setViewport(marginX + 5, marginY + 5,
-                            size.width(), size.height())
+        size.scale(
+            QSize(width - 10, height - 10),  # 5 px inner margin
+            Qt.AspectRatioMode.KeepAspectRatio,
+        )
+        painter.setViewport(marginX + 5, marginY + 5, size.width(), size.height())
         painter.setWindow(self.pixmapLabel.pixmap().rect())
         painter.drawPixmap(0, 0, self.pixmapLabel.pixmap())
         painter.end()
--- a/src/eric7/Graphics/SvgDiagram.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/SvgDiagram.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,19 +25,43 @@
     """
     Class implementing a dialog showing a SVG graphic.
     """
+
     ZoomLevels = [
-        1, 3, 5, 7, 9,
-        10, 20, 30, 50, 67, 80, 90,
+        1,
+        3,
+        5,
+        7,
+        9,
+        10,
+        20,
+        30,
+        50,
+        67,
+        80,
+        90,
         100,
-        110, 120, 133, 150, 170, 200, 240, 300, 400,
-        500, 600, 700, 800, 900, 1000,
+        110,
+        120,
+        133,
+        150,
+        170,
+        200,
+        240,
+        300,
+        400,
+        500,
+        600,
+        700,
+        800,
+        900,
+        1000,
     ]
     ZoomLevelDefault = 100
-    
+
     def __init__(self, svgFile, parent=None, name=None):
         """
         Constructor
-        
+
         @param svgFile filename of a SVG graphics file to show
         @type str
         @param parent parent widget of the view
@@ -51,62 +75,60 @@
         else:
             self.setObjectName("SvgDiagram")
         self.setWindowTitle(self.tr("SVG-Viewer"))
-        
+
         self.svgWidget = QSvgWidget()
         self.svgWidget.setObjectName("svgWidget")
         self.svgWidget.setBackgroundRole(QPalette.ColorRole.Base)
         self.svgWidget.setSizePolicy(
-            QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored)
-        
+            QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored
+        )
+
         self.svgView = QScrollArea()
         self.svgView.setObjectName("svgView")
         self.svgView.setBackgroundRole(QPalette.ColorRole.Dark)
         self.svgView.setWidget(self.svgWidget)
-        
+
         self.setCentralWidget(self.svgView)
-        
+
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         self.statusBar().addPermanentWidget(self.__zoomWidget)
-        self.__zoomWidget.setMapping(
-            SvgDiagram.ZoomLevels, SvgDiagram.ZoomLevelDefault)
+        self.__zoomWidget.setMapping(SvgDiagram.ZoomLevels, SvgDiagram.ZoomLevelDefault)
         self.__zoomWidget.valueChanged.connect(self.__doZoom)
-        
+
         # polish up the dialog
         self.resize(QSize(800, 600).expandedTo(self.minimumSizeHint()))
-        
+
         self.zoom = 1.0
         self.svgFile = svgFile
         self.svgWidget.load(self.svgFile)
         self.svgWidget.resize(self.svgWidget.renderer().defaultSize())
-        
+
         self.__initActions()
         self.__initContextMenu()
         self.__initToolBars()
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-        
+
     def __initActions(self):
         """
         Private method to initialize the view actions.
         """
-        self.closeAct = QAction(
-            UI.PixmapCache.getIcon("close"),
-            self.tr("Close"), self)
+        self.closeAct = QAction(UI.PixmapCache.getIcon("close"), self.tr("Close"), self)
         self.closeAct.triggered.connect(self.close)
-        
-        self.printAct = QAction(
-            UI.PixmapCache.getIcon("print"),
-            self.tr("Print"), self)
+
+        self.printAct = QAction(UI.PixmapCache.getIcon("print"), self.tr("Print"), self)
         self.printAct.triggered.connect(self.__printDiagram)
-        
+
         self.printPreviewAct = QAction(
-            UI.PixmapCache.getIcon("printPreview"),
-            self.tr("Print Preview"), self)
+            UI.PixmapCache.getIcon("printPreview"), self.tr("Print Preview"), self
+        )
         self.printPreviewAct.triggered.connect(self.__printPreviewDiagram)
-        
+
     def __initContextMenu(self):
         """
         Private method to initialize the context menu.
@@ -116,19 +138,19 @@
         self.__menu.addSeparator()
         self.__menu.addAction(self.printPreviewAct)
         self.__menu.addAction(self.printAct)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
-        
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         """
         self.__menu.popup(self.mapToGlobal(coord))
-        
+
     def __initToolBars(self):
         """
         Private method to populate the toolbars with our actions.
@@ -136,28 +158,28 @@
         self.windowToolBar = QToolBar(self.tr("Window"), self)
         self.windowToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.windowToolBar.addAction(self.closeAct)
-        
+
         self.graphicsToolBar = QToolBar(self.tr("Graphics"), self)
         self.graphicsToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.graphicsToolBar.addAction(self.printPreviewAct)
         self.graphicsToolBar.addAction(self.printAct)
-        
+
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.windowToolBar)
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.graphicsToolBar)
-        
+
     def getDiagramName(self):
         """
         Public method to retrieve a name for the diagram.
-        
+
         @return name for the diagram
         @rtype str
         """
         return self.svgFile
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -169,13 +191,13 @@
                 self.__zoomIn()
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating, if the event was handled
@@ -184,13 +206,13 @@
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -201,28 +223,28 @@
             elif pinch.state() == Qt.GestureState.GestureUpdated:
                 self.__doZoom(int(pinch.totalScaleFactor() * 100))
             evt.accept()
-    
+
     ###########################################################################
     ## Private menu handling methods below.
     ###########################################################################
-    
+
     def __adjustScrollBar(self, scrollBar, factor):
         """
         Private method to adjust a scrollbar by a certain factor.
-        
+
         @param scrollBar reference to the scrollbar object
         @type QScrollBar
         @param factor factor to adjust by
         @type float
         """
         scrollBar.setValue(
-            int(factor * scrollBar.value() +
-                ((factor - 1) * scrollBar.pageStep() / 2)))
-        
+            int(factor * scrollBar.value() + ((factor - 1) * scrollBar.pageStep() / 2))
+        )
+
     def __levelForZoom(self, zoom):
         """
         Private method determining the zoom level index given a zoom factor.
-        
+
         @param zoom zoom factor
         @type int
         @return index of zoom factor
@@ -235,24 +257,24 @@
                 if zoom <= SvgDiagram.ZoomLevels[index]:
                     break
         return index
-    
+
     def __doZoom(self, value):
         """
         Private method to set the zoom value in percent.
-        
+
         @param value zoom value in percent
         @type int
         """
         oldValue = self.__zoom()
         if value != oldValue:
             self.svgWidget.resize(value / 100 * self.svgWidget.sizeHint())
-            
+
             factor = value / oldValue
             self.__adjustScrollBar(self.svgView.horizontalScrollBar(), factor)
             self.__adjustScrollBar(self.svgView.verticalScrollBar(), factor)
-            
+
             self.__zoomWidget.setValue(value)
-        
+
     def __zoomIn(self):
         """
         Private method to zoom into the SVG.
@@ -260,7 +282,7 @@
         index = self.__levelForZoom(self.__zoom())
         if index < len(SvgDiagram.ZoomLevels) - 1:
             self.__doZoom(SvgDiagram.ZoomLevels[index + 1])
-        
+
     def __zoomOut(self):
         """
         Private method to zoom out of the SVG.
@@ -268,23 +290,22 @@
         index = self.__levelForZoom(self.__zoom())
         if index > 0:
             self.__doZoom(SvgDiagram.ZoomLevels[index - 1])
-        
+
     def __zoomReset(self):
         """
         Private method to reset the zoom value.
         """
         self.__doZoom(SvgDiagram.ZoomLevels[SvgDiagram.ZoomLevelDefault])
-        
+
     def __zoom(self):
         """
         Private method to get the current zoom factor in percent.
-        
+
         @return current zoom factor in percent
         @rtype int
         """
-        return int(self.svgWidget.width() /
-                   self.svgWidget.sizeHint().width() * 100.0)
-        
+        return int(self.svgWidget.width() / self.svgWidget.sizeHint().width() * 100.0)
+
     def __printDiagram(self):
         """
         Private slot called to print the diagram.
@@ -302,17 +323,17 @@
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
             printer.setPrinterName(printerName)
-        
+
         printDialog = QPrintDialog(printer, self)
         if printDialog.exec():
             self.__print(printer)
-        
+
     def __printPreviewDiagram(self):
         """
         Private slot called to show a print preview of the diagram.
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
-        
+
         printer = QPrinter(mode=QPrinter.PrinterMode.ScreenResolution)
         printer.setFullPage(True)
         if Preferences.getPrinter("ColorMode"):
@@ -323,25 +344,27 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
             printer.setPrinterName(printerName)
-        
+
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested[QPrinter].connect(self.__print)
         preview.exec()
-        
+
     def __print(self, printer):
         """
         Private slot to the actual printing.
-        
+
         @param printer reference to the printer object
         @type QPrinter
         """
@@ -354,31 +377,33 @@
         fm = painter.fontMetrics()
         fontHeight = fm.lineSpacing()
         marginX = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).x() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).x()
+            printer.pageLayout().paintRectPixels(printer.resolution()).x()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).x()
         )
         marginX = (
-            Preferences.getPrinter("LeftMargin") *
-            int(printer.resolution() / 2.54) - marginX
+            Preferences.getPrinter("LeftMargin") * int(printer.resolution() / 2.54)
+            - marginX
         )
         marginY = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).y() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).y()
+            printer.pageLayout().paintRectPixels(printer.resolution()).y()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).y()
         )
         marginY = (
-            Preferences.getPrinter("TopMargin") *
-            int(printer.resolution() / 2.54) - marginY
+            Preferences.getPrinter("TopMargin") * int(printer.resolution() / 2.54)
+            - marginY
         )
 
         width = (
-            printer.width() - marginX -
-            Preferences.getPrinter("RightMargin") *
-            int(printer.resolution() / 2.54)
+            printer.width()
+            - marginX
+            - Preferences.getPrinter("RightMargin") * int(printer.resolution() / 2.54)
         )
         height = (
-            printer.height() - fontHeight - 4 - marginY -
-            Preferences.getPrinter("BottomMargin") *
-            int(printer.resolution() / 2.54)
+            printer.height()
+            - fontHeight
+            - 4
+            - marginY
+            - Preferences.getPrinter("BottomMargin") * int(printer.resolution() / 2.54)
         )
 
         # write a foot note
@@ -386,11 +411,18 @@
         tc = QColor(50, 50, 50)
         painter.setPen(tc)
         painter.drawRect(marginX, marginY, width, height)
-        painter.drawLine(marginX, marginY + height + 2,
-                         marginX + width, marginY + height + 2)
+        painter.drawLine(
+            marginX, marginY + height + 2, marginX + width, marginY + height + 2
+        )
         painter.setFont(font)
-        painter.drawText(marginX, marginY + height + 4, width,
-                         fontHeight, Qt.AlignmentFlag.AlignRight, s)
+        painter.drawText(
+            marginX,
+            marginY + height + 4,
+            width,
+            fontHeight,
+            Qt.AlignmentFlag.AlignRight,
+            s,
+        )
 
         # render the diagram
         painter.setViewport(marginX, marginY, width, height)
--- a/src/eric7/Graphics/UMLClassDiagramBuilder.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLClassDiagramBuilder.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing a builder for UML like class diagrams.
     """
+
     def __init__(self, dialog, view, project, file, noAttrs=False):
         """
         Constructor
-        
+
         @param dialog reference to the UML dialog
         @type UMLDialog
         @param view reference to the view object
@@ -39,16 +40,16 @@
         """
         super().__init__(dialog, view, project)
         self.setObjectName("UMLClassDiagramBuilder")
-        
+
         self.file = file
         self.noAttrs = noAttrs
-        
+
         self.__relFile = (
             self.project.getRelativePath(self.file)
-            if self.project.isProjectSource(self.file) else
-            ""
+            if self.project.isProjectSource(self.file)
+            else ""
         )
-    
+
     def initialize(self):
         """
         Public method to initialize the object.
@@ -56,53 +57,55 @@
         pname = self.project.getProjectName()
         name = (
             self.tr("Class Diagram {0}: {1}").format(
-                pname, self.project.getRelativePath(self.file))
-            if pname and self.project.isProjectSource(self.file) else
-            self.tr("Class Diagram: {0}").format(self.file)
+                pname, self.project.getRelativePath(self.file)
+            )
+            if pname and self.project.isProjectSource(self.file)
+            else self.tr("Class Diagram: {0}").format(self.file)
         )
         self.umlView.setDiagramName(name)
-        
+
     def __getCurrentShape(self, name):
         """
         Private method to get the named shape.
-        
+
         @param name name of the shape
         @type str
         @return shape
         @rtype QGraphicsItem
         """
         return self.allClasses.get(name)
-        
+
     def buildDiagram(self):
         """
         Public method to build the class shapes of the class diagram.
-        
+
         The algorithm is borrowed from Boa Constructor.
         """
         import Utilities.ModuleParser
-        
+
         self.allClasses = {}
         self.allModules = {}
-        
+
         try:
-            extensions = (
-                Preferences.getPython("Python3Extensions") +
-                ['.rb']
+            extensions = Preferences.getPython("Python3Extensions") + [".rb"]
+            module = Utilities.ModuleParser.readModule(
+                self.file, extensions=extensions, caching=False
             )
-            module = Utilities.ModuleParser.readModule(
-                self.file, extensions=extensions, caching=False)
         except ImportError:
             ct = QGraphicsTextItem(None)
-            ct.setHtml(self.buildErrorMessage(
-                self.tr("The module <b>'{0}'</b> could not be found.")
-                    .format(self.file)
-            ))
+            ct.setHtml(
+                self.buildErrorMessage(
+                    self.tr("The module <b>'{0}'</b> could not be found.").format(
+                        self.file
+                    )
+                )
+            )
             self.scene.addItem(ct)
             return
-        
+
         if self.file not in self.allModules:
             self.allModules[self.file] = []
-        
+
         routes = []
         nodes = []
         todo = [module.createHierarchy()]
@@ -112,17 +115,18 @@
             for className in hierarchy:
                 classesFound = True
                 cw = self.__getCurrentShape(className)
-                if not cw and className.find('.') >= 0:
-                    cw = self.__getCurrentShape(className.split('.')[-1])
+                if not cw and className.find(".") >= 0:
+                    cw = self.__getCurrentShape(className.split(".")[-1])
                     if cw:
                         self.allClasses[className] = cw
                         if className not in self.allModules[self.file]:
                             self.allModules[self.file].append(className)
                 if cw and cw.noAttrs != self.noAttrs:
                     cw = None
-                if cw and not (cw.external and
-                               (className in module.classes or
-                                className in module.modules)):
+                if cw and not (
+                    cw.external
+                    and (className in module.classes or className in module.modules)
+                ):
                     if cw.scene() != self.scene:
                         self.scene.addItem(cw)
                         cw.setPos(10, 10)
@@ -131,43 +135,46 @@
                 else:
                     if className in module.classes:
                         # this is a local class (defined in this module)
-                        self.__addLocalClass(
-                            className, module.classes[className], 0, 0)
+                        self.__addLocalClass(className, module.classes[className], 0, 0)
                     elif className in module.modules:
                         # this is a local module (defined in this module)
                         self.__addLocalClass(
-                            className, module.modules[className], 0, 0, True)
+                            className, module.modules[className], 0, 0, True
+                        )
                     else:
                         self.__addExternalClass(className, 0, 0)
                     nodes.append(className)
-                
+
                 if hierarchy.get(className):
                     todo.append(hierarchy.get(className))
                     children = list(hierarchy.get(className).keys())
                     for child in children:
                         if (className, child) not in routes:
                             routes.append((className, child))
-            
+
             del todo[0]
-        
+
         if classesFound:
             self.__arrangeClasses(nodes, routes[:])
             self.__createAssociations(routes)
             self.umlView.autoAdjustSceneSize(limit=True)
         else:
             ct = QGraphicsTextItem(None)
-            ct.setHtml(self.buildErrorMessage(
-                self.tr("The module <b>'{0}'</b> does not contain any"
-                        " classes.").format(self.file)
-            ))
+            ct.setHtml(
+                self.buildErrorMessage(
+                    self.tr(
+                        "The module <b>'{0}'</b> does not contain any" " classes."
+                    ).format(self.file)
+                )
+            )
             self.scene.addItem(ct)
-        
+
     def __arrangeClasses(self, nodes, routes, whiteSpaceFactor=1.2):
         """
         Private method to arrange the shapes on the canvas.
-        
+
         The algorithm is borrowed from Boa Constructor.
-        
+
         @param nodes list of nodes to arrange
         @type list of str
         @param routes list of routes
@@ -177,16 +184,16 @@
         @type float
         """
         from . import GraphicsUtilities
+
         generations = GraphicsUtilities.sort(nodes, routes)
-        
+
         # calculate width and height of all elements
         sizes = []
         for generation in generations:
             sizes.append([])
             for child in generation:
-                sizes[-1].append(
-                    self.__getCurrentShape(child).sceneBoundingRect())
-        
+                sizes[-1].append(self.__getCurrentShape(child).sceneBoundingRect())
+
         # calculate total width and total height
         width = 0
         height = 0
@@ -195,56 +202,53 @@
         for generation in sizes:
             currentWidth = 0
             currentHeight = 0
-            
+
             for rect in generation:
                 if rect.bottom() > currentHeight:
                     currentHeight = rect.bottom()
                 currentWidth += rect.right()
-            
+
             # update totals
             if currentWidth > width:
                 width = currentWidth
             height += currentHeight
-            
+
             # store generation info
             widths.append(currentWidth)
             heights.append(currentHeight)
-        
+
         # add in some whitespace
         width *= whiteSpaceFactor
         height = height * whiteSpaceFactor - 20
         verticalWhiteSpace = 40.0
-        
+
         sceneRect = self.umlView.sceneRect()
         width += 50.0
         height += 50.0
         swidth = sceneRect.width() if width < sceneRect.width() else width
         sheight = sceneRect.height() if height < sceneRect.height() else height
         self.umlView.setSceneSize(swidth, sheight)
-        
+
         # distribute each generation across the width and the
         # generations across height
         y = 10.0
-        for currentWidth, currentHeight, generation in (
-                zip_longest(widths, heights, generations)
+        for currentWidth, currentHeight, generation in zip_longest(
+            widths, heights, generations
         ):
             x = 10.0
             # whiteSpace is the space between any two elements
-            whiteSpace = (
-                (width - currentWidth - 20) /
-                (len(generation) - 1.0 or 2.0)
-            )
+            whiteSpace = (width - currentWidth - 20) / (len(generation) - 1.0 or 2.0)
             for className in generation:
                 cw = self.__getCurrentShape(className)
                 cw.setPos(x, y)
                 rect = cw.sceneBoundingRect()
                 x = x + rect.width() + whiteSpace
             y = y + currentHeight + verticalWhiteSpace
-        
+
     def __addLocalClass(self, className, _class, x, y, isRbModule=False):
         """
         Private method to add a class defined in the module.
-        
+
         @param className name of the class to be as a dictionary key
         @type str
         @param _class class to be shown
@@ -257,6 +261,7 @@
         @type bool
         """
         from .ClassItem import ClassItem, ClassModel
+
         name = _class.name
         if isRbModule:
             name = "{0} (Module)".format(name)
@@ -264,22 +269,29 @@
             name,
             sorted(_class.methods.keys())[:],
             sorted(_class.attributes.keys())[:],
-            sorted(_class.globals.keys())[:]
+            sorted(_class.globals.keys())[:],
         )
-        cw = ClassItem(cl, False, x, y, noAttrs=self.noAttrs, scene=self.scene,
-                       colors=self.umlView.getDrawingColors())
+        cw = ClassItem(
+            cl,
+            False,
+            x,
+            y,
+            noAttrs=self.noAttrs,
+            scene=self.scene,
+            colors=self.umlView.getDrawingColors(),
+        )
         cw.setId(self.umlView.getItemId())
         self.allClasses[className] = cw
         if _class.name not in self.allModules[self.file]:
             self.allModules[self.file].append(_class.name)
-        
+
     def __addExternalClass(self, _class, x, y):
         """
         Private method to add a class defined outside the module.
-        
+
         If the canvas is too small to take the shape, it
         is enlarged.
-        
+
         @param _class class to be shown
         @type ModuleParser.Class
         @param x x-coordinate
@@ -288,22 +300,31 @@
         @type float
         """
         from .ClassItem import ClassItem, ClassModel
+
         cl = ClassModel(_class)
-        cw = ClassItem(cl, True, x, y, noAttrs=self.noAttrs, scene=self.scene,
-                       colors=self.umlView.getDrawingColors())
+        cw = ClassItem(
+            cl,
+            True,
+            x,
+            y,
+            noAttrs=self.noAttrs,
+            scene=self.scene,
+            colors=self.umlView.getDrawingColors(),
+        )
         cw.setId(self.umlView.getItemId())
         self.allClasses[_class] = cw
         if _class not in self.allModules[self.file]:
             self.allModules[self.file].append(_class)
-        
+
     def __createAssociations(self, routes):
         """
         Private method to generate the associations between the class shapes.
-        
+
         @param routes list of relationsships
         @type list of tuple of (str, str)
         """
         from .AssociationItem import AssociationItem, AssociationType
+
         for route in routes:
             if len(route) > 1:
                 assoc = AssociationItem(
@@ -311,13 +332,14 @@
                     self.__getCurrentShape(route[0]),
                     AssociationType.GENERALISATION,
                     topToBottom=True,
-                    colors=self.umlView.getDrawingColors())
+                    colors=self.umlView.getDrawingColors(),
+                )
                 self.scene.addItem(assoc)
-    
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -327,23 +349,23 @@
         """
         parts = data.split(", ")
         if (
-            len(parts) != 2 or
-            not parts[0].startswith("file=") or
-            not parts[1].startswith("no_attributes=")
+            len(parts) != 2
+            or not parts[0].startswith("file=")
+            or not parts[1].startswith("no_attributes=")
         ):
             return False
-        
+
         self.file = parts[0].split("=", 1)[1].strip()
         self.noAttrs = Utilities.toBool(parts[1].split("=", 1)[1].strip())
-        
+
         self.initialize()
-        
+
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -351,19 +373,19 @@
             "project_name": self.project.getProjectName(),
             "no_attributes": self.noAttrs,
         }
-        
+
         data["file"] = (
             Utilities.fromNativeSeparators(self.__relFile)
-            if self.__relFile else
-            Utilities.fromNativeSeparators(self.file)
+            if self.__relFile
+            else Utilities.fromNativeSeparators(self.file)
         )
-        
+
         return data
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
@@ -374,7 +396,7 @@
         """
         try:
             self.noAttrs = data["no_attributes"]
-            
+
             file = Utilities.toNativeSeparators(data["file"])
             if os.path.isabs(file):
                 self.file = file
@@ -387,12 +409,12 @@
                         " Please open it and try again.</p>"
                     ).format(data["project_name"])
                     return False, msg
-                
+
                 self.__relFile = file
                 self.file = self.project.getAbsolutePath(file)
         except KeyError:
             return False, ""
-        
+
         self.initialize()
-        
+
         return True, ""
--- a/src/eric7/Graphics/UMLDiagramBuilder.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLDiagramBuilder.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,10 +14,11 @@
     """
     Class implementing the UML diagram builder base class.
     """
+
     def __init__(self, dialog, view, project):
         """
         Constructor
-        
+
         @param dialog reference to the UML dialog
         @type UMLDialog
         @param view reference to the view object
@@ -26,49 +27,49 @@
         @type Project
         """
         super().__init__(dialog)
-        
+
         self.umlView = view
         self.scene = self.umlView.scene()
         self.project = project
-    
+
     def initialize(self):
         """
         Public method to initialize the object.
         """
         return
-    
+
     def buildErrorMessage(self, msg):
         """
         Public method to build an error string to be included in the scene.
-        
+
         @param msg error message
         @type str
         @return prepared error string
         @rtype str
         """
         return (
-            "<font color='{0}'>".format(
-                self.umlView.getDrawingColors()[0].name()) +
-            msg +
-            "</font>"
+            "<font color='{0}'>".format(self.umlView.getDrawingColors()[0].name())
+            + msg
+            + "</font>"
         )
-    
+
     def buildDiagram(self):
         """
         Public method to build the diagram.
-        
+
         This class must be implemented in subclasses.
-        
+
         @exception NotImplementedError raised to indicate that this class
             must be subclassed
         """
         raise NotImplementedError(
-            "Method 'buildDiagram' must be implemented in subclasses.")
-    
+            "Method 'buildDiagram' must be implemented in subclasses."
+        )
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -77,20 +78,20 @@
         @rtype bool
         """
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
         return {}
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
--- a/src/eric7/Graphics/UMLDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,6 +26,7 @@
     """
     Class defining the UML dialog types.
     """
+
     CLASS_DIAGRAM = 0
     PACKAGE_DIAGRAM = 1
     IMPORTS_DIAGRAM = 2
@@ -37,25 +38,31 @@
     """
     Class implementing a dialog showing UML like diagrams.
     """
-    FileVersions = ("1.0", )
-    JsonFileVersions = ("1.0", )
-    
+
+    FileVersions = ("1.0",)
+    JsonFileVersions = ("1.0",)
+
     UMLDialogType2String = {
-        UMLDialogType.CLASS_DIAGRAM:
-            QCoreApplication.translate("UMLDialog", "Class Diagram"),
-        UMLDialogType.PACKAGE_DIAGRAM:
-            QCoreApplication.translate("UMLDialog", "Package Diagram"),
-        UMLDialogType.IMPORTS_DIAGRAM:
-            QCoreApplication.translate("UMLDialog", "Imports Diagram"),
-        UMLDialogType.APPLICATION_DIAGRAM:
-            QCoreApplication.translate("UMLDialog", "Application Diagram"),
+        UMLDialogType.CLASS_DIAGRAM: QCoreApplication.translate(
+            "UMLDialog", "Class Diagram"
+        ),
+        UMLDialogType.PACKAGE_DIAGRAM: QCoreApplication.translate(
+            "UMLDialog", "Package Diagram"
+        ),
+        UMLDialogType.IMPORTS_DIAGRAM: QCoreApplication.translate(
+            "UMLDialog", "Imports Diagram"
+        ),
+        UMLDialogType.APPLICATION_DIAGRAM: QCoreApplication.translate(
+            "UMLDialog", "Application Diagram"
+        ),
     }
-    
-    def __init__(self, diagramType, project, path="", parent=None,
-                 initBuilder=True, **kwargs):
+
+    def __init__(
+        self, diagramType, project, path="", parent=None, initBuilder=True, **kwargs
+    ):
         """
         Constructor
-        
+
         @param diagramType type of the diagram
         @type UMLDialogType
         @param project reference to the project object
@@ -72,33 +79,33 @@
         """
         super().__init__(parent)
         self.setObjectName("UMLDialog")
-        
+
         self.__project = project
         self.__diagramType = diagramType
-        
+
         from .UMLGraphicsView import UMLGraphicsView
+
         self.scene = QGraphicsScene(0.0, 0.0, 800.0, 600.0)
         self.umlView = UMLGraphicsView(self.scene, parent=self)
-        self.builder = self.__diagramBuilder(
-            self.__diagramType, path, **kwargs)
+        self.builder = self.__diagramBuilder(self.__diagramType, path, **kwargs)
         if self.builder and initBuilder:
             self.builder.initialize()
-        
+
         self.__fileName = ""
-        
+
         self.__initActions()
         self.__initToolBars()
-        
+
         self.setCentralWidget(self.umlView)
-        
+
         self.umlView.relayout.connect(self.__relayout)
-        
+
         self.setWindowTitle(self.__getDiagramTitel(self.__diagramType))
-    
+
     def __getDiagramTitel(self, diagramType):
         """
         Private method to get a textual description for the diagram type.
-        
+
         @param diagramType diagram type string
         @type str
         @return titel of the diagram
@@ -107,47 +114,40 @@
         return UMLDialog.UMLDialogType2String.get(
             diagramType, self.tr("Illegal Diagram Type")
         )
-    
+
     def __initActions(self):
         """
         Private slot to initialize the actions.
         """
-        self.closeAct = QAction(
-            UI.PixmapCache.getIcon("close"),
-            self.tr("Close"), self)
+        self.closeAct = QAction(UI.PixmapCache.getIcon("close"), self.tr("Close"), self)
         self.closeAct.triggered.connect(self.close)
-        
-        self.openAct = QAction(
-            UI.PixmapCache.getIcon("open"),
-            self.tr("Load"), self)
+
+        self.openAct = QAction(UI.PixmapCache.getIcon("open"), self.tr("Load"), self)
         self.openAct.triggered.connect(self.load)
-        
+
         self.saveAct = QAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr("Save"), self)
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self
+        )
         self.saveAct.triggered.connect(self.__save)
-        
+
         self.saveAsAct = QAction(
-            UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr("Save As..."), self)
+            UI.PixmapCache.getIcon("fileSaveAs"), self.tr("Save As..."), self
+        )
         self.saveAsAct.triggered.connect(self.__saveAs)
-        
+
         self.saveImageAct = QAction(
-            UI.PixmapCache.getIcon("fileSavePixmap"),
-            self.tr("Save as Image"), self)
+            UI.PixmapCache.getIcon("fileSavePixmap"), self.tr("Save as Image"), self
+        )
         self.saveImageAct.triggered.connect(self.umlView.saveImage)
-        
-        self.printAct = QAction(
-            UI.PixmapCache.getIcon("print"),
-            self.tr("Print"), self)
+
+        self.printAct = QAction(UI.PixmapCache.getIcon("print"), self.tr("Print"), self)
         self.printAct.triggered.connect(self.umlView.printDiagram)
-        
+
         self.printPreviewAct = QAction(
-            UI.PixmapCache.getIcon("printPreview"),
-            self.tr("Print Preview"), self)
-        self.printPreviewAct.triggered.connect(
-            self.umlView.printPreviewDiagram)
-    
+            UI.PixmapCache.getIcon("printPreview"), self.tr("Print Preview"), self
+        )
+        self.printPreviewAct.triggered.connect(self.umlView.printPreviewDiagram)
+
     def __initToolBars(self):
         """
         Private slot to initialize the toolbars.
@@ -155,7 +155,7 @@
         self.windowToolBar = QToolBar(self.tr("Window"), self)
         self.windowToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.windowToolBar.addAction(self.closeAct)
-        
+
         self.fileToolBar = QToolBar(self.tr("File"), self)
         self.fileToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.fileToolBar.addAction(self.openAct)
@@ -166,17 +166,17 @@
         self.fileToolBar.addSeparator()
         self.fileToolBar.addAction(self.printPreviewAct)
         self.fileToolBar.addAction(self.printAct)
-        
+
         self.umlToolBar = self.umlView.initToolBar()
-        
+
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.fileToolBar)
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.windowToolBar)
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.umlToolBar)
-    
+
     def show(self, fromFile=False):
         """
         Public method to show the dialog.
-        
+
         @param fromFile flag indicating, that the diagram was loaded
             from file
         @type bool
@@ -184,18 +184,18 @@
         if not fromFile and self.builder:
             self.builder.buildDiagram()
         super().show()
-    
+
     def __relayout(self):
         """
         Private method to re-layout the diagram.
         """
         if self.builder:
             self.builder.buildDiagram()
-    
+
     def __diagramBuilder(self, diagramType, path, **kwargs):
         """
         Private method to instantiate a diagram builder object.
-        
+
         @param diagramType type of the diagram
         @type UMLDialogType
         @param path file or directory path to build the diagram from
@@ -207,34 +207,42 @@
         """
         if diagramType == UMLDialogType.CLASS_DIAGRAM:
             from .UMLClassDiagramBuilder import UMLClassDiagramBuilder
+
             return UMLClassDiagramBuilder(
-                self, self.umlView, self.__project, path, **kwargs)
+                self, self.umlView, self.__project, path, **kwargs
+            )
         elif diagramType == UMLDialogType.PACKAGE_DIAGRAM:
             from .PackageDiagramBuilder import PackageDiagramBuilder
+
             return PackageDiagramBuilder(
-                self, self.umlView, self.__project, path, **kwargs)
+                self, self.umlView, self.__project, path, **kwargs
+            )
         elif diagramType == UMLDialogType.IMPORTS_DIAGRAM:
             from .ImportsDiagramBuilder import ImportsDiagramBuilder
+
             return ImportsDiagramBuilder(
-                self, self.umlView, self.__project, path, **kwargs)
+                self, self.umlView, self.__project, path, **kwargs
+            )
         elif diagramType == UMLDialogType.APPLICATION_DIAGRAM:
             from .ApplicationDiagramBuilder import ApplicationDiagramBuilder
+
             return ApplicationDiagramBuilder(
-                self, self.umlView, self.__project, **kwargs)
+                self, self.umlView, self.__project, **kwargs
+            )
         else:
             return None
-    
+
     def __save(self):
         """
         Private slot to save the diagram with the current name.
         """
         self.__saveAs(self.__fileName)
-    
+
     @pyqtSlot()
     def __saveAs(self, filename=""):
         """
         Private slot to save the diagram.
-        
+
         @param filename name of the file to write to
         @type str
         """
@@ -243,14 +251,17 @@
                 self,
                 self.tr("Save Diagram"),
                 "",
-                self.tr("Eric Graphics File (*.egj);;"
-                        "Eric Text Graphics File (*.e5g);;"
-                        "All Files (*)"),
+                self.tr(
+                    "Eric Graphics File (*.egj);;"
+                    "Eric Text Graphics File (*.e5g);;"
+                    "All Files (*)"
+                ),
                 "",
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if not fname:
                 return
-            
+
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -260,24 +271,26 @@
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Save Diagram"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
             filename = str(fpath)
-        
+
         res = self.__writeJsonGraphicsFile(filename)
-        
+
         if res:
             # save the file name only in case of success
             self.__fileName = filename
-    
+
     # Note: remove loading of eric6 line based diagram format after 22.6
     def load(self, filename=""):
         """
         Public method to load a diagram from a file.
-        
+
         @param filename name of the file to be loaded
         @type str
         @return flag indicating success
@@ -288,30 +301,34 @@
                 self,
                 self.tr("Load Diagram"),
                 "",
-                self.tr("Eric Graphics File (*.egj);;"
-                        "Eric Text Graphics File (*.e5g);;"
-                        "All Files (*)"))
+                self.tr(
+                    "Eric Graphics File (*.egj);;"
+                    "Eric Text Graphics File (*.e5g);;"
+                    "All Files (*)"
+                ),
+            )
             if not filename:
                 # Canceled by user
                 return False
-        
+
         return (
             self.__readLineBasedGraphicsFile(filename)
-            if filename.endswith(".e5g") else
+            if filename.endswith(".e5g")
+            else
             # JSON format is the default
             self.__readJsonGraphicsFile(filename)
         )
-    
+
     #######################################################################
     ## Methods to read and write eric graphics files of the old line
     ## based file format.
     #######################################################################
-    
+
     def __readLineBasedGraphicsFile(self, filename):
         """
         Private method to read an eric graphics file using the old line
         based file format.
-        
+
         @param filename name of the file to be read
         @type str
         @return flag indicating success
@@ -326,27 +343,26 @@
                 self.tr("Load Diagram"),
                 self.tr(
                     """<p>The file <b>{0}</b> could not be read.</p>"""
-                    """<p>Reason: {1}</p>""").format(filename, str(err)))
+                    """<p>Reason: {1}</p>"""
+                ).format(filename, str(err)),
+            )
             return False
-        
+
         lines = data.splitlines()
         if len(lines) < 3:
             self.__showInvalidDataMessage(filename)
             return False
-        
+
         try:
             # step 1: check version
             linenum = 0
             key, value = lines[linenum].split(": ", 1)
-            if (
-                key.strip() != "version" or
-                value.strip() not in UMLDialog.FileVersions
-            ):
+            if key.strip() != "version" or value.strip() not in UMLDialog.FileVersions:
                 self.__showInvalidDataMessage(filename, linenum)
                 return False
             else:
                 version = value
-            
+
             # step 2: extract diagram type
             linenum += 1
             key, value = lines[linenum].split(": ", 1)
@@ -361,7 +377,7 @@
                 return False
             self.scene.clear()
             self.builder = self.__diagramBuilder(self.__diagramType, "")
-            
+
             # step 3: extract scene size
             linenum += 1
             key, value = lines[linenum].split(": ", 1)
@@ -374,7 +390,7 @@
                 self.__showInvalidDataMessage(filename, linenum)
                 return False
             self.umlView.setSceneSize(width, height)
-            
+
             # step 4: extract builder data if available
             linenum += 1
             key, value = lines[linenum].split(": ", 1)
@@ -384,54 +400,55 @@
                     self.__showInvalidDataMessage(filename, linenum)
                     return False
                 linenum += 1
-            
+
             # step 5: extract the graphics items
-            ok, vlinenum = self.umlView.parsePersistenceData(
-                version, lines[linenum:])
+            ok, vlinenum = self.umlView.parsePersistenceData(version, lines[linenum:])
             if not ok:
                 self.__showInvalidDataMessage(filename, linenum + vlinenum)
                 return False
-        
+
         except IndexError:
             self.__showInvalidDataMessage(filename)
             return False
-        
+
         # everything worked fine, so remember the file name and set the
         # window title
         self.setWindowTitle(self.__getDiagramTitel(self.__diagramType))
         self.__fileName = filename
-        
+
         return True
-    
+
     def __showInvalidDataMessage(self, filename, linenum=-1):
         """
         Private slot to show a message dialog indicating an invalid data file.
-        
+
         @param filename name of the file containing the invalid data
         @type str
         @param linenum number of the invalid line
         @type int
         """
         msg = (
-            self.tr("""<p>The file <b>{0}</b> does not contain"""
-                    """ valid data.</p>""").format(filename)
-            if linenum < 0 else
-            self.tr("""<p>The file <b>{0}</b> does not contain"""
-                    """ valid data.</p><p>Invalid line: {1}</p>"""
-                    ).format(filename, linenum + 1)
+            self.tr(
+                """<p>The file <b>{0}</b> does not contain""" """ valid data.</p>"""
+            ).format(filename)
+            if linenum < 0
+            else self.tr(
+                """<p>The file <b>{0}</b> does not contain"""
+                """ valid data.</p><p>Invalid line: {1}</p>"""
+            ).format(filename, linenum + 1)
         )
         EricMessageBox.critical(self, self.tr("Load Diagram"), msg)
-    
+
     #######################################################################
     ## Methods to read and write eric graphics files of the JSON based
     ## file format.
     #######################################################################
-    
+
     def __writeJsonGraphicsFile(self, filename):
         """
         Private method to write an eric graphics file using the JSON based
         file format.
-        
+
         @param filename name of the file to write to
         @type str
         @return flag indicating a successful write
@@ -446,7 +463,7 @@
             "builder": self.builder.toDict(),
             "view": self.umlView.toDict(),
         }
-        
+
         try:
             jsonString = json.dumps(data, indent=2)
             with open(filename, "w") as f:
@@ -458,15 +475,16 @@
                 self.tr("Save Diagram"),
                 self.tr(
                     """<p>The file <b>{0}</b> could not be saved.</p>"""
-                    """<p>Reason: {1}</p>""").format(filename, str(err))
+                    """<p>Reason: {1}</p>"""
+                ).format(filename, str(err)),
             )
             return False
-    
+
     def __readJsonGraphicsFile(self, filename):
         """
         Private method to read an eric graphics file using the JSON based
         file format.
-        
+
         @param filename name of the file to be read
         @type str
         @return flag indicating a successful read
@@ -482,10 +500,11 @@
                 self.tr("Load Diagram"),
                 self.tr(
                     """<p>The file <b>{0}</b> could not be read.</p>"""
-                    """<p>Reason: {1}</p>""").format(filename, str(err))
+                    """<p>Reason: {1}</p>"""
+                ).format(filename, str(err)),
             )
             return False
-        
+
         try:
             # step 1: check version
             if data["version"] in UMLDialog.JsonFileVersions:
@@ -493,7 +512,7 @@
             else:
                 self.__showInvalidDataMessage(filename)
                 return False
-            
+
             # step 2: set diagram type
             try:
                 self.__diagramType = UMLDialogType(data["type"])
@@ -502,10 +521,10 @@
                 return False
             self.scene.clear()
             self.builder = self.__diagramBuilder(self.__diagramType, "")
-            
+
             # step 3: set scene size
             self.umlView.setSceneSize(data["width"], data["height"])
-            
+
             # step 4: extract builder data if available
             ok, msg = self.builder.fromDict(version, data["builder"])
             if not ok:
@@ -515,7 +534,8 @@
                         self.tr("Load Diagram"),
                         msg,
                         EricMessageBox.Abort | EricMessageBox.Ignore,
-                        EricMessageBox.Abort)
+                        EricMessageBox.Abort,
+                    )
                     if res == EricMessageBox.Abort:
                         return False
                     else:
@@ -523,7 +543,7 @@
                 else:
                     self.__showInvalidDataMessage(filename)
                     return False
-            
+
             # step 5: extract the graphics items
             ok = self.umlView.fromDict(version, data["view"])
             if not ok:
@@ -532,10 +552,10 @@
         except KeyError:
             self.__showInvalidDataMessage(filename)
             return False
-        
+
         # everything worked fine, so remember the file name and set the
         # window title
         self.setWindowTitle(self.__getDiagramTitel(self.__diagramType))
         self.__fileName = filename
-        
+
         return True
--- a/src/eric7/Graphics/UMLGraphicsView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLGraphicsView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, Qt, QSignalMapper, QEvent, QRectF, QMarginsF
-)
+from PyQt6.QtCore import pyqtSignal, Qt, QSignalMapper, QEvent, QRectF, QMarginsF
 from PyQt6.QtGui import QAction, QPageLayout
 from PyQt6.QtWidgets import QGraphicsView, QToolBar, QDialog
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog
@@ -32,16 +30,17 @@
 class UMLGraphicsView(EricGraphicsView):
     """
     Class implementing a specialized EricGraphicsView for our diagrams.
-    
+
     @signal relayout() emitted to indicate a relayout of the diagram
         is requested
     """
+
     relayout = pyqtSignal()
-    
+
     def __init__(self, scene, parent=None):
         """
         Constructor
-        
+
         @param scene reference to the scene object
         @type QGraphicsScene
         @param parent parent widget of the view
@@ -49,31 +48,33 @@
         """
         EricGraphicsView.__init__(self, scene, parent)
         self.setObjectName("UMLGraphicsView")
-        self.setViewportUpdateMode(
-            QGraphicsView.ViewportUpdateMode.FullViewportUpdate)
-        
+        self.setViewportUpdateMode(QGraphicsView.ViewportUpdateMode.FullViewportUpdate)
+
         self.diagramName = "Unnamed"
         self.__itemId = -1
-        
+
         self.border = 10
         self.deltaSize = 100.0
-        
+
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         parent.statusBar().addPermanentWidget(self.__zoomWidget)
         self.__zoomWidget.setMapping(
-            EricGraphicsView.ZoomLevels, EricGraphicsView.ZoomLevelDefault)
+            EricGraphicsView.ZoomLevels, EricGraphicsView.ZoomLevelDefault
+        )
         self.__zoomWidget.valueChanged.connect(self.setZoom)
         self.zoomValueChanged.connect(self.__zoomWidget.setValue)
-        
+
         self.__initActions()
-        
+
         scene.changed.connect(self.__sceneChanged)
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-        
+
     def __initActions(self):
         """
         Private method to initialize the view actions.
@@ -84,107 +85,105 @@
         except AttributeError:
             # pre Qt 5.15
             self.alignMapper.mapped[int].connect(self.__alignShapes)
-        
+
         self.deleteShapeAct = QAction(
-            UI.PixmapCache.getIcon("deleteShape"),
-            self.tr("Delete shapes"), self)
+            UI.PixmapCache.getIcon("deleteShape"), self.tr("Delete shapes"), self
+        )
         self.deleteShapeAct.triggered.connect(self.__deleteShape)
-        
+
         self.incWidthAct = QAction(
             UI.PixmapCache.getIcon("sceneWidthInc"),
-            self.tr("Increase width by {0} points").format(
-                self.deltaSize),
-            self)
+            self.tr("Increase width by {0} points").format(self.deltaSize),
+            self,
+        )
         self.incWidthAct.triggered.connect(self.__incWidth)
-        
+
         self.incHeightAct = QAction(
             UI.PixmapCache.getIcon("sceneHeightInc"),
-            self.tr("Increase height by {0} points").format(
-                self.deltaSize),
-            self)
+            self.tr("Increase height by {0} points").format(self.deltaSize),
+            self,
+        )
         self.incHeightAct.triggered.connect(self.__incHeight)
-        
+
         self.decWidthAct = QAction(
             UI.PixmapCache.getIcon("sceneWidthDec"),
-            self.tr("Decrease width by {0} points").format(
-                self.deltaSize),
-            self)
+            self.tr("Decrease width by {0} points").format(self.deltaSize),
+            self,
+        )
         self.decWidthAct.triggered.connect(self.__decWidth)
-        
+
         self.decHeightAct = QAction(
             UI.PixmapCache.getIcon("sceneHeightDec"),
-            self.tr("Decrease height by {0} points").format(
-                self.deltaSize),
-            self)
+            self.tr("Decrease height by {0} points").format(self.deltaSize),
+            self,
+        )
         self.decHeightAct.triggered.connect(self.__decHeight)
-        
+
         self.setSizeAct = QAction(
-            UI.PixmapCache.getIcon("sceneSize"),
-            self.tr("Set size"), self)
+            UI.PixmapCache.getIcon("sceneSize"), self.tr("Set size"), self
+        )
         self.setSizeAct.triggered.connect(self.__setSize)
-        
+
         self.rescanAct = QAction(
-            UI.PixmapCache.getIcon("rescan"),
-            self.tr("Re-Scan"), self)
+            UI.PixmapCache.getIcon("rescan"), self.tr("Re-Scan"), self
+        )
         self.rescanAct.triggered.connect(self.__rescan)
-        
+
         self.relayoutAct = QAction(
-            UI.PixmapCache.getIcon("relayout"),
-            self.tr("Re-Layout"), self)
+            UI.PixmapCache.getIcon("relayout"), self.tr("Re-Layout"), self
+        )
         self.relayoutAct.triggered.connect(self.__relayout)
-        
+
         self.alignLeftAct = QAction(
-            UI.PixmapCache.getIcon("shapesAlignLeft"),
-            self.tr("Align Left"), self)
-        self.alignMapper.setMapping(
-            self.alignLeftAct, Qt.AlignmentFlag.AlignLeft)
+            UI.PixmapCache.getIcon("shapesAlignLeft"), self.tr("Align Left"), self
+        )
+        self.alignMapper.setMapping(self.alignLeftAct, Qt.AlignmentFlag.AlignLeft)
         self.alignLeftAct.triggered.connect(self.alignMapper.map)
-        
+
         self.alignHCenterAct = QAction(
             UI.PixmapCache.getIcon("shapesAlignHCenter"),
-            self.tr("Align Center Horizontal"), self)
-        self.alignMapper.setMapping(
-            self.alignHCenterAct, Qt.AlignmentFlag.AlignHCenter)
+            self.tr("Align Center Horizontal"),
+            self,
+        )
+        self.alignMapper.setMapping(self.alignHCenterAct, Qt.AlignmentFlag.AlignHCenter)
         self.alignHCenterAct.triggered.connect(self.alignMapper.map)
-        
+
         self.alignRightAct = QAction(
-            UI.PixmapCache.getIcon("shapesAlignRight"),
-            self.tr("Align Right"), self)
-        self.alignMapper.setMapping(
-            self.alignRightAct, Qt.AlignmentFlag.AlignRight)
+            UI.PixmapCache.getIcon("shapesAlignRight"), self.tr("Align Right"), self
+        )
+        self.alignMapper.setMapping(self.alignRightAct, Qt.AlignmentFlag.AlignRight)
         self.alignRightAct.triggered.connect(self.alignMapper.map)
-        
+
         self.alignTopAct = QAction(
-            UI.PixmapCache.getIcon("shapesAlignTop"),
-            self.tr("Align Top"), self)
-        self.alignMapper.setMapping(
-            self.alignTopAct, Qt.AlignmentFlag.AlignTop)
+            UI.PixmapCache.getIcon("shapesAlignTop"), self.tr("Align Top"), self
+        )
+        self.alignMapper.setMapping(self.alignTopAct, Qt.AlignmentFlag.AlignTop)
         self.alignTopAct.triggered.connect(self.alignMapper.map)
-        
+
         self.alignVCenterAct = QAction(
             UI.PixmapCache.getIcon("shapesAlignVCenter"),
-            self.tr("Align Center Vertical"), self)
-        self.alignMapper.setMapping(
-            self.alignVCenterAct, Qt.AlignmentFlag.AlignVCenter)
+            self.tr("Align Center Vertical"),
+            self,
+        )
+        self.alignMapper.setMapping(self.alignVCenterAct, Qt.AlignmentFlag.AlignVCenter)
         self.alignVCenterAct.triggered.connect(self.alignMapper.map)
-        
+
         self.alignBottomAct = QAction(
-            UI.PixmapCache.getIcon("shapesAlignBottom"),
-            self.tr("Align Bottom"), self)
-        self.alignMapper.setMapping(
-            self.alignBottomAct, Qt.AlignmentFlag.AlignBottom)
+            UI.PixmapCache.getIcon("shapesAlignBottom"), self.tr("Align Bottom"), self
+        )
+        self.alignMapper.setMapping(self.alignBottomAct, Qt.AlignmentFlag.AlignBottom)
         self.alignBottomAct.triggered.connect(self.alignMapper.map)
-    
+
     def setLayoutActionsEnabled(self, enable):
         """
         Public method to enable or disable the layout related actions.
-        
+
         @param enable flag indicating the desired enable state
         @type bool
         """
         self.rescanAct.setEnabled(enable)
         self.relayoutAct.setEnabled(enable)
-    
+
     def __checkSizeActions(self):
         """
         Private slot to set the enabled state of the size actions.
@@ -199,11 +198,11 @@
             self.decHeightAct.setEnabled(False)
         else:
             self.decHeightAct.setEnabled(True)
-        
+
     def __sceneChanged(self, areas):
         """
         Private slot called when the scene changes.
-        
+
         @param areas list of rectangles that contain changes
         @type list of QRectF
         """
@@ -211,7 +210,7 @@
             self.deleteShapeAct.setEnabled(True)
         else:
             self.deleteShapeAct.setEnabled(False)
-        
+
         sceneRect = self.scene().sceneRect()
         newWidth = width = sceneRect.width()
         newHeight = height = sceneRect.height()
@@ -221,15 +220,15 @@
             newWidth = rect.right() + 10
         if sceneRect.bottom() - 10 < rect.bottom():
             newHeight = rect.bottom() + 10
-        
+
         if newHeight != height or newWidth != width:
             self.setSceneSize(newWidth, newHeight)
             self.__checkSizeActions()
-        
+
     def initToolBar(self):
         """
         Public method to populate a toolbar with our actions.
-        
+
         @return the populated toolBar
         @rtype QToolBar
         """
@@ -252,13 +251,13 @@
         toolBar.addSeparator()
         toolBar.addAction(self.rescanAct)
         toolBar.addAction(self.relayoutAct)
-        
+
         return toolBar
-        
+
     def filteredItems(self, items, itemType=UMLItem):
         """
         Public method to filter a list of items.
-        
+
         @param items list of items as returned by the scene object
         @type QGraphicsItem
         @param itemType type to be filtered
@@ -267,32 +266,32 @@
         @rtype QGraphicsItem
         """
         return [itm for itm in items if isinstance(itm, itemType)]
-        
+
     def selectItems(self, items):
         """
         Public method to select the given items.
-        
+
         @param items list of items to be selected
         @type list of QGraphicsItemItem
         """
         # step 1: deselect all items
         self.unselectItems()
-        
+
         # step 2: select all given items
         for itm in items:
             if isinstance(itm, UMLItem):
                 itm.setSelected(True)
-        
+
     def selectItem(self, item):
         """
         Public method to select an item.
-        
+
         @param item item to be selected
         @type QGraphicsItemItem
         """
         if isinstance(item, UMLItem):
             item.setSelected(not item.isSelected())
-        
+
     def __deleteShape(self):
         """
         Private method to delete the selected shapes from the display.
@@ -302,60 +301,62 @@
             item.setSelected(False)
             self.scene().removeItem(item)
             del item
-        
+
     def __incWidth(self):
         """
         Private method to handle the increase width context menu entry.
         """
         self.resizeScene(self.deltaSize, True)
         self.__checkSizeActions()
-        
+
     def __incHeight(self):
         """
         Private method to handle the increase height context menu entry.
         """
         self.resizeScene(self.deltaSize, False)
         self.__checkSizeActions()
-        
+
     def __decWidth(self):
         """
         Private method to handle the decrease width context menu entry.
         """
         self.resizeScene(-self.deltaSize, True)
         self.__checkSizeActions()
-        
+
     def __decHeight(self):
         """
         Private method to handle the decrease height context menu entry.
         """
         self.resizeScene(-self.deltaSize, False)
         self.__checkSizeActions()
-        
+
     def __setSize(self):
         """
         Private method to handle the set size context menu entry.
         """
         from .UMLSceneSizeDialog import UMLSceneSizeDialog
+
         rect = self._getDiagramRect(10)
         sceneRect = self.scene().sceneRect()
-        dlg = UMLSceneSizeDialog(sceneRect.width(), sceneRect.height(),
-                                 rect.width(), rect.height(), self)
+        dlg = UMLSceneSizeDialog(
+            sceneRect.width(), sceneRect.height(), rect.width(), rect.height(), self
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             width, height = dlg.getData()
             self.setSceneSize(width, height)
         self.__checkSizeActions()
-        
+
     def autoAdjustSceneSize(self, limit=False):
         """
         Public method to adjust the scene size to the diagram size.
-        
+
         @param limit flag indicating to limit the scene to the
             initial size
         @type bool
         """
         super().autoAdjustSceneSize(limit=limit)
         self.__checkSizeActions()
-        
+
     def saveImage(self):
         """
         Public method to handle the save context menu entry.
@@ -364,10 +365,12 @@
             self,
             self.tr("Save Diagram"),
             "",
-            self.tr("Portable Network Graphics (*.png);;"
-                    "Scalable Vector Graphics (*.svg)"),
+            self.tr(
+                "Portable Network Graphics (*.png);;" "Scalable Vector Graphics (*.svg)"
+            ),
             "",
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if fname:
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
@@ -378,22 +381,24 @@
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Save Diagram"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-            
-            success = super().saveImage(
-                str(fpath), fpath.suffix.upper())
+
+            success = super().saveImage(str(fpath), fpath.suffix.upper())
             if not success:
                 EricMessageBox.critical(
                     self,
                     self.tr("Save Diagram"),
                     self.tr(
-                        """<p>The file <b>{0}</b> could not be saved.</p>""")
-                    .format(fpath))
-        
+                        """<p>The file <b>{0}</b> could not be saved.</p>"""
+                    ).format(fpath),
+                )
+
     def __relayout(self):
         """
         Private slot to handle the re-layout context menu entry.
@@ -401,7 +406,7 @@
         self.__itemId = -1
         self.scene().clear()
         self.relayout.emit()
-        
+
     def __rescan(self):
         """
         Private slot to handle the re-scan context menu entry.
@@ -415,12 +420,12 @@
                 itemPositions[name] = (item.x(), item.y())
                 if item.isSelected():
                     selectedItems.append(name)
-        
+
         # 2. save
-        
+
         # 2. re-layout the diagram
         self.__relayout()
-        
+
         # 3. move known items to the saved positions
         for item in self.filteredItems(self.scene().items(), UMLItem):
             name = item.getName()
@@ -428,7 +433,7 @@
                 item.setPos(*itemPositions[name])
             if name in selectedItems:
                 item.setSelected(True)
-        
+
     def printDiagram(self):
         """
         Public slot called to print the diagram.
@@ -443,28 +448,29 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
             printer.setPrinterName(printerName)
-        
+
         printDialog = QPrintDialog(printer, self)
         if printDialog.exec():
-            super().printDiagram(
-                printer, self.diagramName)
-        
+            super().printDiagram(printer, self.diagramName)
+
     def printPreviewDiagram(self):
         """
         Public slot called to show a print preview of the diagram.
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
-        
+
         printer = QPrinter(mode=QPrinter.PrinterMode.PrinterResolution)
         printer.setFullPage(True)
         if Preferences.getPrinter("ColorMode"):
@@ -475,43 +481,45 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
             printer.setPrinterName(printerName)
-        
+
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested[QPrinter].connect(self.__printPreviewPrint)
         preview.exec()
-        
+
     def __printPreviewPrint(self, printer):
         """
         Private slot to generate a print preview.
-        
+
         @param printer reference to the printer object
         @type QPrinter
         """
         super().printDiagram(printer, self.diagramName)
-        
+
     def setDiagramName(self, name):
         """
         Public slot to set the diagram name.
-        
+
         @param name diagram name
         @type str
         """
         self.diagramName = name
-        
+
     def __alignShapes(self, alignment):
         """
         Private slot to align the selected shapes.
-        
+
         @param alignment alignment type
         @type Qt.AlignmentFlag
         """
@@ -519,7 +527,7 @@
         items = self.scene().selectedItems()
         if len(items) <= 1:
             return
-        
+
         # step 2: find the index of the item to align in relation to
         amount = None
         for i, item in enumerate(items):
@@ -550,7 +558,7 @@
                     amount = rect.height()
                     index = i
         rect = items[index].sceneBoundingRect()
-        
+
         # step 3: move the other items
         for i, item in enumerate(items):
             if i == index:
@@ -560,35 +568,29 @@
             if alignment == Qt.AlignmentFlag.AlignLeft:
                 xOffset = rect.x() - itemrect.x()
             elif alignment == Qt.AlignmentFlag.AlignRight:
-                xOffset = (
-                    (rect.x() + rect.width()) -
-                    (itemrect.x() + itemrect.width())
-                )
+                xOffset = (rect.x() + rect.width()) - (itemrect.x() + itemrect.width())
             elif alignment == Qt.AlignmentFlag.AlignHCenter:
-                xOffset = (
-                    (rect.x() + rect.width() // 2) -
-                    (itemrect.x() + itemrect.width() // 2)
+                xOffset = (rect.x() + rect.width() // 2) - (
+                    itemrect.x() + itemrect.width() // 2
                 )
             elif alignment == Qt.AlignmentFlag.AlignTop:
                 yOffset = rect.y() - itemrect.y()
             elif alignment == Qt.AlignmentFlag.AlignBottom:
-                yOffset = (
-                    (rect.y() + rect.height()) -
-                    (itemrect.y() + itemrect.height())
+                yOffset = (rect.y() + rect.height()) - (
+                    itemrect.y() + itemrect.height()
                 )
             elif alignment == Qt.AlignmentFlag.AlignVCenter:
-                yOffset = (
-                    (rect.y() + rect.height() // 2) -
-                    (itemrect.y() + itemrect.height() // 2)
+                yOffset = (rect.y() + rect.height() // 2) - (
+                    itemrect.y() + itemrect.height() // 2
                 )
             item.moveBy(xOffset, yOffset)
-        
+
         self.scene().update()
-    
+
     def __itemsBoundingRect(self, items):
         """
         Private method to calculate the bounding rectangle of the given items.
-        
+
         @param items list of items to operate on
         @type list of UMLItem
         @return bounding rectangle
@@ -606,17 +608,16 @@
             top = min(rect.top(), top)
             bottom = max(rect.bottom(), bottom)
         return QRectF(left, top, right - left, bottom - top)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key press events.
-        
+
         @param evt reference to the key event
         @type QKeyEvent
         """
         key = evt.key()
-        if key in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left,
-                   Qt.Key.Key_Right]:
+        if key in [Qt.Key.Key_Up, Qt.Key.Key_Down, Qt.Key.Key_Left, Qt.Key.Key_Right]:
             items = self.filteredItems(self.scene().selectedItems())
             if items:
                 if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
@@ -639,13 +640,13 @@
                     item.moveBy(dx, dy)
                 evt.accept()
                 return
-        
+
         super().keyPressEvent(evt)
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -657,13 +658,13 @@
                 self.zoomIn()
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating, if the event was handled
@@ -672,13 +673,13 @@
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -689,11 +690,11 @@
             elif pinch.state() == Qt.GestureState.GestureUpdated:
                 self.setZoom(int(pinch.totalScaleFactor() * 100))
             evt.accept()
-    
+
     def getItemId(self):
         """
         Public method to get the ID to be assigned to an item.
-        
+
         @return item ID
         @rtype int
         """
@@ -703,7 +704,7 @@
     def findItem(self, itemId):
         """
         Public method to find an UML item based on the ID.
-        
+
         @param itemId of the item to search for
         @type int
         @return item found or None
@@ -715,13 +716,13 @@
                     return item
             except AttributeError:
                 continue
-        
+
         return None
-    
+
     def findItemByName(self, name):
         """
         Public method to find an UML item based on its name.
-        
+
         @param name name to look for
         @type str
         @return item found or None
@@ -733,13 +734,13 @@
                     return item
             except AttributeError:
                 continue
-        
+
         return None
-    
+
     def parsePersistenceData(self, version, data):
         """
         Public method to parse persisted data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -749,20 +750,20 @@
         @rtype int
         """
         umlItems = {}
-        
+
         if not data[0].startswith("diagram_name:"):
             return False, 0
         self.diagramName = data[0].split(": ", 1)[1].strip()
-        
+
         from .ClassItem import ClassItem
         from .ModuleItem import ModuleItem
         from .PackageItem import PackageItem
         from .AssociationItem import AssociationItem
-        
+
         for linenum, line in enumerate(data[1:], start=1):
             if not line.startswith(("item:", "association:")):
                 return False, linenum
-            
+
             key, value = line.split(": ", 1)
             if key == "item":
                 itemId, x, y, itemType, itemData = value.split(", ", 4)
@@ -772,14 +773,17 @@
                     y = float(y.split("=", 1)[1].strip())
                     itemType = itemType.split("=", 1)[1].strip()
                     if itemType == ClassItem.ItemType:
-                        itm = ClassItem(x=0, y=0, scene=self.scene(),
-                                        colors=self.getDrawingColors())
+                        itm = ClassItem(
+                            x=0, y=0, scene=self.scene(), colors=self.getDrawingColors()
+                        )
                     elif itemType == ModuleItem.ItemType:
-                        itm = ModuleItem(x=0, y=0, scene=self.scene(),
-                                         colors=self.getDrawingColors())
+                        itm = ModuleItem(
+                            x=0, y=0, scene=self.scene(), colors=self.getDrawingColors()
+                        )
                     elif itemType == PackageItem.ItemType:
-                        itm = PackageItem(x=0, y=0, scene=self.scene(),
-                                          colors=self.getDrawingColors())
+                        itm = PackageItem(
+                            x=0, y=0, scene=self.scene(), colors=self.getDrawingColors()
+                        )
                     itm.setPos(x, y)
                     itm.setId(itemId)
                     umlItems[itemId] = itm
@@ -788,47 +792,49 @@
                 except ValueError:
                     return False, linenum
             elif key == "association":
-                srcId, dstId, assocType, topToBottom = (
-                    AssociationItem.parseAssociationItemDataString(
-                        value.strip())
+                (
+                    srcId,
+                    dstId,
+                    assocType,
+                    topToBottom,
+                ) = AssociationItem.parseAssociationItemDataString(value.strip())
+                assoc = AssociationItem(
+                    umlItems[srcId], umlItems[dstId], assocType, topToBottom
                 )
-                assoc = AssociationItem(umlItems[srcId], umlItems[dstId],
-                                        assocType, topToBottom)
                 self.scene().addItem(assoc)
-        
+
         return True, -1
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
         items = [
-            item.toDict()
-            for item in self.filteredItems(self.scene().items(), UMLItem)
+            item.toDict() for item in self.filteredItems(self.scene().items(), UMLItem)
         ]
-        
+
         from .AssociationItem import AssociationItem
+
         associations = [
             assoc.toDict()
-            for assoc in self.filteredItems(self.scene().items(),
-                                            AssociationItem)
+            for assoc in self.filteredItems(self.scene().items(), AssociationItem)
         ]
-        
+
         data = {
             "diagram_name": self.diagramName,
             "items": items,
             "associations": associations,
         }
-        
+
         return data
-    
+
     def fromDict(self, version, data):
         """
         Public method to populate the class with data persisted by 'toDict()'.
-        
+
         @param version version of the data
         @type str
         @param data dictionary containing the persisted data
@@ -841,33 +847,30 @@
         from .ModuleItem import ModuleItem
         from .PackageItem import PackageItem
         from .AssociationItem import AssociationItem
-        
+
         umlItems = {}
-        
+
         try:
             self.diagramName = data["diagram_name"]
             for itemData in data["items"]:
                 if itemData["type"] == UMLItem.ItemType:
-                    itm = UMLItem.fromDict(
-                        itemData, colors=self.getDrawingColors())
+                    itm = UMLItem.fromDict(itemData, colors=self.getDrawingColors())
                 elif itemData["type"] == ClassItem.ItemType:
-                    itm = ClassItem.fromDict(
-                        itemData, colors=self.getDrawingColors())
+                    itm = ClassItem.fromDict(itemData, colors=self.getDrawingColors())
                 elif itemData["type"] == ModuleItem.ItemType:
-                    itm = ModuleItem.fromDict(
-                        itemData, colors=self.getDrawingColors())
+                    itm = ModuleItem.fromDict(itemData, colors=self.getDrawingColors())
                 elif itemData["type"] == PackageItem.ItemType:
-                    itm = PackageItem.fromDict(
-                        itemData, colors=self.getDrawingColors())
+                    itm = PackageItem.fromDict(itemData, colors=self.getDrawingColors())
                 if itm is not None:
                     umlItems[itm.getId()] = itm
                     self.scene().addItem(itm)
-            
+
             for assocData in data["associations"]:
                 assoc = AssociationItem.fromDict(
-                    assocData, umlItems, colors=self.getDrawingColors())
+                    assocData, umlItems, colors=self.getDrawingColors()
+                )
                 self.scene().addItem(assoc)
-            
+
             return True
         except KeyError:
             return False
--- a/src/eric7/Graphics/UMLItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,19 +18,20 @@
     """
     Class implementing the UMLModel base class.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name package name
         @type str
         """
         self.name = name
-    
+
     def getName(self):
         """
         Public method to retrieve the model name.
-        
+
         @return model name
         @rtype str
         """
@@ -41,13 +42,13 @@
     """
     Class implementing the UMLItem base class.
     """
+
     ItemType = "UMLItem"
-    
-    def __init__(self, model=None, x=0, y=0, rounded=False, colors=None,
-                 parent=None):
+
+    def __init__(self, model=None, x=0, y=0, rounded=False, colors=None, parent=None):
         """
         Constructor
-        
+
         @param model UML model containing the item data
         @type UMLModel
         @param x x-coordinate
@@ -63,36 +64,34 @@
         """
         super().__init__(parent)
         self.model = model
-        
+
         if colors is None:
-            self._colors = (QColor(Qt.GlobalColor.black),
-                            QColor(Qt.GlobalColor.white))
+            self._colors = (QColor(Qt.GlobalColor.black), QColor(Qt.GlobalColor.white))
         else:
             self._colors = colors
         self.setPen(QPen(self._colors[0]))
-        
+
         self.font = Preferences.getGraphics("Font")
         self.margin = 5
         self.associations = []
         self.shouldAdjustAssociations = False
         self.__id = -1
-        
+
         self.setRect(x, y, 60, 30)
-        
+
         if rounded:
             p = self.pen()
             p.setCapStyle(Qt.PenCapStyle.RoundCap)
             p.setJoinStyle(Qt.PenJoinStyle.RoundJoin)
-        
+
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True)
         self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, True)
-        self.setFlag(
-            QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True)
-    
+        self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True)
+
     def getName(self):
         """
         Public method to retrieve the item name.
-        
+
         @return item name
         @rtype str
         """
@@ -100,11 +99,11 @@
             return self.model.name
         else:
             return ""
-    
+
     def setSize(self, width, height):
         """
         Public method to set the rectangles size.
-        
+
         @param width width of the rectangle
         @type float
         @param height height of the rectangle
@@ -113,27 +112,27 @@
         rect = self.rect()
         rect.setSize(QSizeF(width, height))
         self.setRect(rect)
-    
+
     def addAssociation(self, assoc):
         """
         Public method to add an association to this widget.
-        
+
         @param assoc association to be added
         @type AssociationWidget
         """
         if assoc and assoc not in self.associations:
             self.associations.append(assoc)
-    
+
     def removeAssociation(self, assoc):
         """
         Public method to remove an association to this widget.
-        
+
         @param assoc association to be removed
         @type AssociationWidget
         """
         if assoc and assoc in self.associations:
             self.associations.remove(assoc)
-    
+
     def removeAssociations(self):
         """
         Public method to remove all associations of this widget.
@@ -142,7 +141,7 @@
             assoc.unassociate()
             assoc.hide()
             del assoc
-    
+
     def adjustAssociations(self):
         """
         Public method to adjust the associations to widget movements.
@@ -151,11 +150,11 @@
             for assoc in self.associations:
                 assoc.widgetMoved()
             self.shouldAdjustAssociations = False
-    
+
     def moveBy(self, dx, dy):
         """
         Public overriden method to move the widget relative.
-        
+
         @param dx relative movement in x-direction
         @type float
         @param dy relative movement in y-direction
@@ -163,11 +162,11 @@
         """
         super().moveBy(dx, dy)
         self.adjustAssociations()
-    
+
     def setPos(self, x, y):
         """
         Public overriden method to set the items position.
-        
+
         @param x absolute x-position
         @type float
         @param y absolute y-position
@@ -175,11 +174,11 @@
         """
         super().setPos(x, y)
         self.adjustAssociations()
-    
+
     def itemChange(self, change, value):
         """
         Public method called when an items state changes.
-        
+
         @param change the item's change
         @type QGraphicsItem.GraphicsItemChange
         @param value the value of the change
@@ -188,7 +187,7 @@
         if change == QGraphicsItem.GraphicsItemChange.ItemPositionChange:
             # 1. remember to adjust associations
             self.shouldAdjustAssociations = True
-            
+
             # 2. ensure the new position is inside the scene
             scene = self.scene()
             if scene:
@@ -198,13 +197,13 @@
                     value.setX(min(rect.right(), max(value.x(), rect.left())))
                     value.setY(min(rect.bottom(), max(value.y(), rect.top())))
                     return value
-            
+
         return QGraphicsItem.itemChange(self, change, value)
-    
+
     def paint(self, painter, option, widget=None):
         """
         Public method to paint the item in local coordinates.
-        
+
         @param painter reference to the painter object
         @type QPainter
         @param option style options
@@ -214,49 +213,48 @@
         """
         pen = self.pen()
         if (
-            (option.state & QStyle.StateFlag.State_Selected) ==
-            QStyle.StateFlag.State_Selected
-        ):
+            option.state & QStyle.StateFlag.State_Selected
+        ) == QStyle.StateFlag.State_Selected:
             pen.setWidth(2)
         else:
             pen.setWidth(1)
-        
+
         painter.setPen(pen)
         painter.setBrush(self.brush())
         painter.drawRect(self.rect())
         self.adjustAssociations()
-    
+
     def setId(self, itemId):
         """
         Public method to assign an ID to the item.
-        
+
         @param itemId assigned ID
         @type int
         """
         self.__id = itemId
-    
+
     def getId(self):
         """
         Public method to get the item ID.
-        
+
         @return ID of the item
         @rtype int
         """
         return self.__id
-    
+
     def getItemType(self):
         """
         Public method to get the item's type.
-        
+
         @return item type
         @rtype str
         """
         return self.ItemType
-    
+
     def parseItemDataString(self, version, data):
         """
         Public method to parse the given persistence data.
-        
+
         @param version version of the data
         @type str
         @param data persisted data to be parsed
@@ -265,11 +263,11 @@
         @rtype bool
         """
         return True
-    
+
     def toDict(self):
         """
         Public method to collect data to be persisted.
-        
+
         @return dictionary containing data to be persisted
         @rtype dict
         """
@@ -280,12 +278,12 @@
             "type": self.getItemType(),
             "model_name": self.model.getName(),
         }
-    
+
     @classmethod
     def fromDict(cls, data, colors=None):
         """
         Class method to create a generic UML item from persisted data.
-        
+
         @param data dictionary containing the persisted data as generated
             by toDict()
         @type dict
@@ -296,10 +294,7 @@
         """
         try:
             model = UMLModel(data["model_name"])
-            itm = cls(model=model,
-                      x=0,
-                      y=0,
-                      colors=colors)
+            itm = cls(model=model, x=0, y=0, colors=colors)
             itm.setPos(data["x"], data["y"])
             itm.setId(data["id"])
             return itm
--- a/src/eric7/Graphics/UMLSceneSizeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Graphics/UMLSceneSizeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to set the scene sizes.
     """
+
     def __init__(self, w, h, minW, minH, parent=None, name=None):
         """
         Constructor
-        
+
         @param w current width of scene
         @type int
         @param h current height of scene
@@ -37,21 +38,21 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.widthSpinBox.setValue(w)
         self.heightSpinBox.setValue(h)
         self.widthSpinBox.setMinimum(minW)
         self.heightSpinBox.setMinimum(minH)
         self.widthSpinBox.selectAll()
         self.widthSpinBox.setFocus()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple giving the selected width and height
         @rtype tuple of (int, int)
         """
--- a/src/eric7/HelpViewer/HelpBookmarkPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpBookmarkPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to edit the bookmark properties.
     """
+
     def __init__(self, title="", url="", parent=None):
         """
         Constructor
-        
+
         @param title title for the bookmark (defaults to "")
         @type str (optional)
         @param url URL for the bookmark (defaults to "")
@@ -30,30 +31,29 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.titleEdit.textChanged.connect(self.__updateOkButton)
         self.urlEdit.textChanged.connect(self.__updateOkButton)
-        
+
         self.titleEdit.setText(title)
         self.urlEdit.setText(url)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOkButton(self):
         """
         Private method to set the enabled state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.titleEdit.text().strip()) and
-            bool(self.urlEdit.text().strip())
+            bool(self.titleEdit.text().strip()) and bool(self.urlEdit.text().strip())
         )
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple containing the title and URL for the bookmark
         @rtype tuple of (str, str)
         """
--- a/src/eric7/HelpViewer/HelpBookmarksImportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpBookmarksImportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,38 +19,41 @@
     """
     Class implementing a dialog to enter the bookmarks import parameters.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.bookmarksPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.bookmarksPicker.setFilters(
-            self.tr("eric Bookmarks Files (*.json);;All Files (*)"))
+            self.tr("eric Bookmarks Files (*.json);;All Files (*)")
+        )
         self.bookmarksPicker.textChanged.connect(self.__updateOkButton)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot()
     def __updateOkButton(self):
         """
         Private method to update the state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.bookmarksPicker.text()))
-    
+            bool(self.bookmarksPicker.text())
+        )
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple containing a flag indicating to replace the existing
             bookmarks and the path of the bookmarks file to be imported
         @rtype tuple of (bool, str)
--- a/src/eric7/HelpViewer/HelpBookmarksWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpBookmarksWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,8 +15,12 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QUrl
 from PyQt6.QtGui import QClipboard, QGuiApplication
 from PyQt6.QtWidgets import (
-    QAbstractItemView, QApplication, QDialog, QListWidget, QListWidgetItem,
-    QMenu
+    QAbstractItemView,
+    QApplication,
+    QDialog,
+    QListWidget,
+    QListWidgetItem,
+    QMenu,
 )
 
 from EricWidgets import EricFileDialog, EricMessageBox
@@ -29,53 +33,51 @@
 class HelpBookmarksWidget(QListWidget):
     """
     Class implementing a widget showing the list of bookmarks.
-    
+
     @signal escapePressed() emitted when the ESC key was pressed
     @signal openUrl(QUrl, str) emitted to open an entry in the current tab
     @signal newTab(QUrl, str) emitted to open an entry in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open an entry in a
         new background tab
     """
+
     escapePressed = pyqtSignal()
     openUrl = pyqtSignal(QUrl)
     newTab = pyqtSignal(QUrl)
     newBackgroundTab = pyqtSignal(QUrl)
-    
+
     UrlRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setObjectName("HelpBookmarksWidget")
-        
+
         self.__helpViewer = parent
-        
+
         self.setAlternatingRowColors(True)
-        self.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
         self.setSortingEnabled(True)
-        
-        self.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+
+        self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.__bookmarks = []
         self.__loadBookmarks()
-        
+
         self.itemDoubleClicked.connect(self.__bookmarkActivated)
-    
+
     @pyqtSlot(QPoint)
     def __showContextMenu(self, point):
         """
         Private slot to handle the customContextMenuRequested signal of
         the viewlist.
-        
+
         @param point position to open the menu at
         @type QPoint
         """
@@ -89,12 +91,12 @@
         else:
             # multiple selected bookmarks
             self.__showBookmarksContextMenu(point)
-    
+
     @pyqtSlot(QPoint)
     def __showBackgroundMenu(self, point):
         """
         Private slot to show the background menu (i.e. no selection).
-        
+
         @param point position to open the menu at
         @type QPoint
         """
@@ -108,7 +110,7 @@
         menu.addSeparator()
         exportBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
         importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
-        
+
         act = menu.exec(self.mapToGlobal(point))
         if act == openBookmarks:
             self.__openBookmarks(selected=False)
@@ -117,35 +119,30 @@
         elif act == addBookmark:
             self.__bookmarkCurrentPage()
         elif act == deleteBookmarks:
-            self.__deleteBookmarks([
-                self.item(row) for row in range(self.count())
-            ])
+            self.__deleteBookmarks([self.item(row) for row in range(self.count())])
         elif act == exportBookmarks:
             self.__exportBookmarks(selected=False)
         elif act == importBookmarks:
             self.__importBookmarks()
-    
+
     @pyqtSlot(QPoint)
     def __showBookmarkContextMenu(self, point):
         """
         Private slot to show the context menu for a bookmark.
-        
+
         @param point position to open the menu at
         @type QPoint
         """
         itm = self.selectedItems()[0]
         url = itm.data(self.UrlRole)
-        validUrl = (
-            url is not None and not url.isEmpty() and url.isValid()
-        )
-        
+        validUrl = url is not None and not url.isEmpty() and url.isValid()
+
         menu = QMenu()
         curPage = menu.addAction(self.tr("Open Link"))
         curPage.setEnabled(validUrl)
         newPage = menu.addAction(self.tr("Open Link in New Page"))
         newPage.setEnabled(validUrl)
-        newBackgroundPage = menu.addAction(
-            self.tr("Open Link in Background Page"))
+        newBackgroundPage = menu.addAction(self.tr("Open Link in Background Page"))
         newBackgroundPage.setEnabled(validUrl)
         menu.addSeparator()
         copyUrl = menu.addAction(self.tr("Copy URL to Clipboard"))
@@ -160,7 +157,7 @@
         menu.addSeparator()
         exportBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
         importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
-        
+
         act = menu.exec(self.mapToGlobal(point))
         if act == curPage:
             self.openUrl.emit(url)
@@ -171,9 +168,11 @@
         elif act == copyUrl:
             # copy the URL to both clipboard areas
             QGuiApplication.clipboard().setText(
-                url.toString(), QClipboard.Mode.Clipboard)
+                url.toString(), QClipboard.Mode.Clipboard
+            )
             QGuiApplication.clipboard().setText(
-                url.toString(), QClipboard.Mode.Selection)
+                url.toString(), QClipboard.Mode.Selection
+            )
         elif act == newBookmark:
             self.__newBookmark()
         elif act == addBookmark:
@@ -186,12 +185,12 @@
             self.__exportBookmarks(selected=False)
         elif act == importBookmarks:
             self.__importBookmarks()
-    
+
     @pyqtSlot(QPoint)
     def __showBookmarksContextMenu(self, point):
         """
         Private slot to show the context menu for multiple bookmark.
-        
+
         @param point position to open the menu at
         @type QPoint
         """
@@ -203,7 +202,7 @@
         exportBookmarks = menu.addAction(self.tr("Export Selected Bookmarks"))
         exportAllBookmarks = menu.addAction(self.tr("Export All Bookmarks"))
         importBookmarks = menu.addAction(self.tr("Import Bookmarks"))
-        
+
         act = menu.exec(self.mapToGlobal(point))
         if act == openBookmarks:
             self.__openBookmarks(selected=True)
@@ -215,28 +214,28 @@
             self.__exportBookmarks(selected=False)
         elif act == importBookmarks:
             self.__importBookmarks()
-    
+
     @pyqtSlot(str, str)
     def __addBookmark(self, title, url):
         """
         Private slot to add a bookmark entry.
-        
+
         @param title title for the bookmark
         @type str
         @param url URL for the bookmark
         @type str
         """
         url = url.strip()
-        
+
         itm = QListWidgetItem(title, self)
         itm.setData(self.UrlRole, QUrl(url))
         itm.setToolTip(url)
-    
+
     @pyqtSlot(str, QUrl)
     def addBookmark(self, title, url):
         """
         Public slot to add a bookmark with given data.
-        
+
         @param title title for the bookmark
         @type str
         @param url URL for the bookmark
@@ -248,7 +247,7 @@
             self.__addBookmark(title, url)
             self.sortItems()
             self.__saveBookmarks()
-    
+
     @pyqtSlot()
     def __bookmarkCurrentPage(self):
         """
@@ -258,7 +257,7 @@
         title = currentViewer.pageTitle()
         url = currentViewer.link()
         self.addBookmark(title, url)
-    
+
     @pyqtSlot()
     def __newBookmark(self):
         """
@@ -270,17 +269,18 @@
             self.__addBookmark(title, url)
             self.sortItems()
             self.__saveBookmarks()
-    
+
     @pyqtSlot()
     def __editBookmark(self, itm):
         """
         Private slot to edit a bookmark.
-        
+
         @param itm reference to the bookmark item to be edited
         @type QListWidgetItem
         """
         dlg = HelpBookmarkPropertiesDialog(
-            itm.text(), itm.data(self.UrlRole).toString(), self)
+            itm.text(), itm.data(self.UrlRole).toString(), self
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             title, url = dlg.getData()
             itm.setText(title)
@@ -288,12 +288,12 @@
             itm.setToolTip(url)
             self.sortItems()
             self.__saveBookmarks()
-    
+
     @pyqtSlot(QListWidgetItem)
     def __bookmarkActivated(self, itm):
         """
         Private slot handling the activation of a bookmark.
-        
+
         @param itm reference to the activated item
         @type QListWidgetItem
         """
@@ -301,71 +301,68 @@
         if url and not url.isEmpty() and url.isValid():
             buttons = QApplication.mouseButtons()
             modifiers = QApplication.keyboardModifiers()
-            
+
             if buttons & Qt.MouseButton.MiddleButton:
                 self.newTab.emit(url)
             else:
-                if (
-                    modifiers & (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    ) == (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    )
+                if modifiers & (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
+                ) == (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
                 ):
                     self.newBackgroundTab.emit(url)
                 elif modifiers & Qt.KeyboardModifier.ControlModifier:
                     self.newTab.emit(url)
                 elif (
-                    modifiers & Qt.KeyboardModifier.ShiftModifier and
-                    not self.__internal
+                    modifiers & Qt.KeyboardModifier.ShiftModifier
+                    and not self.__internal
                 ):
                     self.newWindow.emit(url)
                 else:
                     self.openUrl.emit(url)
-    
+
     def __openBookmarks(self, selected=False):
         """
         Private method to open all or selected bookmarks.
-        
+
         @param selected flag indicating to open the selected bookmarks
             (defaults to False)
         @type bool (optional)
         """
         items = (
             self.selectedItems()
-            if selected else
-            [self.item(row) for row in range(self.count())]
+            if selected
+            else [self.item(row) for row in range(self.count())]
         )
-        
+
         for itm in items:
             url = itm.data(self.UrlRole)
             if url is not None and not url.isEmpty() and url.isValid():
                 self.newTab.emit(url)
-    
+
     def __deleteBookmarks(self, items):
         """
         Private method to delete the given bookmark items.
-        
+
         @param items list of bookmarks to be deleted
         @type list of QListWidgetItem
         """
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self,
             self.tr("Delete Bookmarks"),
             self.tr("Shall these bookmarks really be deleted?"),
-            [itm.text() for itm in items]
+            [itm.text() for itm in items],
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for itm in items:
                 self.takeItem(self.row(itm))
                 del itm
             self.__saveBookmarks()
-    
+
     def __loadBookmarks(self):
         """
         Private method to load the defined bookmarks.
@@ -373,12 +370,12 @@
         bookmarksStr = Preferences.getHelp("Bookmarks")
         with contextlib.suppress(ValueError):
             bookmarks = json.loads(bookmarksStr)
-        
+
         self.clear()
         for bookmark in bookmarks:
             self.__addBookmark(bookmark["title"], bookmark["url"])
         self.sortItems()
-    
+
     def __saveBookmarks(self):
         """
         Private method to save the defined bookmarks.
@@ -386,17 +383,19 @@
         bookmarks = []
         for row in range(self.count()):
             itm = self.item(row)
-            bookmarks.append({
-                "title": itm.text(),
-                "url": itm.data(self.UrlRole).toString(),
-            })
+            bookmarks.append(
+                {
+                    "title": itm.text(),
+                    "url": itm.data(self.UrlRole).toString(),
+                }
+            )
         Preferences.setHelp("Bookmarks", json.dumps(bookmarks))
-    
+
     @pyqtSlot()
     def __exportBookmarks(self, selected=False):
         """
         Private slot to export the bookmarks into a JSON file.
-        
+
         @param selected flag indicating to export the selected bookmarks
             (defaults to False)
         @type bool (optional)
@@ -407,7 +406,7 @@
             "",
             self.tr("eric Bookmarks Files (*.json);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite
+            EricFileDialog.DontConfirmOverwrite,
         )
         if filename:
             ext = os.path.splitext(filename)[1]
@@ -415,35 +414,41 @@
                 ex = selectedFilter.split("(*")[1].split(")")[0]
                 if ex:
                     filename += ex
-            
+
             if os.path.exists(filename):
                 ok = EricMessageBox.yesNo(
                     self,
                     self.tr("Export Bookmarks"),
-                    self.tr("""The file <b>{0}</b> already exists. Do you"""
-                            """ want to overwrite it?""").format(filename))
+                    self.tr(
+                        """The file <b>{0}</b> already exists. Do you"""
+                        """ want to overwrite it?"""
+                    ).format(filename),
+                )
                 if not ok:
                     return
-            
+
             bookmarksDict = {
                 "creator": "eric7",
                 "version": 1,
                 "created": datetime.datetime.now().isoformat(
-                    sep=" ", timespec="seconds"),
-                "bookmarks": []
+                    sep=" ", timespec="seconds"
+                ),
+                "bookmarks": [],
             }
             bookmarkItems = (
                 self.selectedItems()
-                if selected else
-                [self.item(row) for row in range(self.count())]
+                if selected
+                else [self.item(row) for row in range(self.count())]
             )
             for bookmarkItem in bookmarkItems:
-                bookmarksDict["bookmarks"].append({
-                    "type": "url",
-                    "title": bookmarkItem.text(),
-                    "url": bookmarkItem.data(self.UrlRole).toString(),
-                })
-            
+                bookmarksDict["bookmarks"].append(
+                    {
+                        "type": "url",
+                        "title": bookmarkItem.text(),
+                        "url": bookmarkItem.data(self.UrlRole).toString(),
+                    }
+                )
+
             jsonStr = json.dumps(bookmarksDict, indent=2, sort_keys=True)
             try:
                 with open(filename, "w") as f:
@@ -452,21 +457,23 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Export Bookmarks"),
-                    self.tr("""<p>The bookmarks could not be exported"""
-                            """ to <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                    .format(filename, str(err)))
-    
+                    self.tr(
+                        """<p>The bookmarks could not be exported"""
+                        """ to <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                    ).format(filename, str(err)),
+                )
+
     @pyqtSlot()
     def __importBookmarks(self):
         """
         Private slot to import bookmarks from a JSON file.
         """
         from .HelpBookmarksImportDialog import HelpBookmarksImportDialog
-        
+
         dlg = HelpBookmarksImportDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             replace, filename = dlg.getData()
-            
+
             try:
                 with open(filename, "r") as f:
                     jsonStr = f.read()
@@ -478,20 +485,20 @@
                     self.tr(
                         "<p>The bookmarks file <b>{0}</b> could not be "
                         "read.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return
-            
+
             if not isinstance(bookmarks, dict):
                 EricMessageBox.critical(
                     self,
                     self.tr("Import Bookmarks"),
                     self.tr(
                         "The bookmarks file <b>{0}</b> has invalid contents."
-                    ).format(filename)
+                    ).format(filename),
                 )
                 return
-            
+
             try:
                 if bookmarks["creator"] != "eric7":
                     EricMessageBox.critical(
@@ -500,10 +507,10 @@
                         self.tr(
                             "The bookmarks file <b>{0}</b> was not created"
                             " with 'eric7'."
-                        ).format(filename)
+                        ).format(filename),
                     )
                     return
-                
+
                 if bookmarks["version"] != 1:
                     EricMessageBox.critical(
                         self,
@@ -511,24 +518,24 @@
                         self.tr(
                             "The bookmarks file <b>{0}</b> has an unsupported"
                             " format version."
-                        ).format(filename)
+                        ).format(filename),
                     )
                     return
-                
+
                 if replace:
                     self.clear()
-                
+
                 for bookmark in bookmarks["bookmarks"]:
                     if bookmark["type"] == "url":
                         self.__addBookmark(bookmark["title"], bookmark["url"])
                 self.sortItems()
                 self.__saveBookmarks()
-            
+
             except KeyError:
                 EricMessageBox.critical(
                     self,
                     self.tr("Import Bookmarks"),
                     self.tr(
                         "The bookmarks file <b>{0}</b> has invalid contents."
-                    ).format(filename)
+                    ).format(filename),
                 )
--- a/src/eric7/HelpViewer/HelpViewerImpl.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpViewerImpl.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,164 +13,165 @@
 class HelpViewerImpl:
     """
     Class implementing the help viewer base class.
-    
+
     This is the base class of help viewer implementations and defines the
     interface. Als subclasses must implement the these methods.
-    
+
     @signal titleChanged() emitted to indicate a change of the page title
     @signal loadFinished(ok) emitted to indicate the completion of a page load
     @signal zoomChanged() emitted to indicate a change of the zoom level
     """
+
     titleChanged = pyqtSignal()
     loadFinished = pyqtSignal(bool)
     zoomChanged = pyqtSignal()
-    
+
     def __init__(self, engine):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         """
         self._engine = engine
-    
+
     def setLink(self, url):
         """
         Public method to set the URL of the document to be shown.
-        
+
         @param url URL of the document
         @type QUrl
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def link(self):
         """
         Public method to get the URL of the shown document.
-        
+
         @return URL of the document
         @rtype QUrl
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return QUrl()
-    
+
     def pageTitle(self):
         """
         Public method get the page title.
-        
+
         @return page title
         @rtype str
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return ""
-    
+
     def isEmptyPage(self):
         """
         Public method to check, if the current page is the empty page.
-        
+
         @return flag indicating an empty page is loaded
         @rtype bool
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return False
-    
+
     def gotoHistory(self, index):
         """
         Public method to step through the history.
-        
+
         @param index history index (<0 backward, >0 forward)
         @type int
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def isBackwardAvailable(self):
         """
         Public method to check, if stepping backward through the history is
         available.
-        
+
         @return flag indicating backward stepping is available
         @rtype bool
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return False
-    
+
     def isForwardAvailable(self):
         """
         Public method to check, if stepping forward through the history is
         available.
-        
+
         @return flag indicating forward stepping is available
         @rtype bool
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return False
-    
+
     def scaleUp(self):
         """
         Public method to zoom in.
-        
+
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def scaleDown(self):
         """
         Public method to zoom out.
-        
+
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def setScale(self, scale):
         """
         Public method to set the zoom level.
-        
+
         @param scale zoom level to set
         @type int
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def resetScale(self):
         """
         Public method to reset the zoom level.
-        
+
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
-    
+
     def scale(self):
         """
         Public method to get the zoom level.
-        
+
         @return current zoom level
         @rtype int
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return 0
-    
+
     def isScaleUpAvailable(self):
         """
         Public method to check, if the max. zoom level is reached.
-        
+
         @return flag indicating scale up is available
         @rtype bool
         @exception RuntimeError raised when not implemented
         """
         raise RuntimeError("Not implemented")
         return False
-    
+
     def isScaleDownAvailable(self):
         """
         Public method to check, if the min. zoom level is reached.
-        
+
         @return flag indicating scale down is available
         @rtype bool
         @exception RuntimeError raised when not implemented
--- a/src/eric7/HelpViewer/HelpViewerImplQTB.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpViewerImplQTB.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,13 @@
 import functools
 
 from PyQt6.QtCore import (
-    pyqtSlot, Qt, QByteArray, QUrl, QEvent, QCoreApplication, QPoint
+    pyqtSlot,
+    Qt,
+    QByteArray,
+    QUrl,
+    QEvent,
+    QCoreApplication,
+    QPoint,
 )
 from PyQt6.QtGui import QDesktopServices, QImage, QGuiApplication, QClipboard
 from PyQt6.QtWidgets import QTextBrowser, QMenu
@@ -23,10 +29,8 @@
 
 AboutBlank = QCoreApplication.translate(
     "HelpViewer",
-    "<html>"
-    "<head><title>about:blank</title></head>"
-    "<body></body>"
-    "</html>")
+    "<html>" "<head><title>about:blank</title></head>" "<body></body>" "</html>",
+)
 
 PageNotFound = QCoreApplication.translate(
     "HelpViewer",
@@ -35,17 +39,19 @@
     """<body><div align="center"><br><br>"""
     """<h1>The page could not be found</h1><br>"""
     """<h3>'{0}'</h3></div></body>"""
-    """</html>""")
+    """</html>""",
+)
 
 
 class HelpViewerImplQTB(HelpViewerImpl, QTextBrowser):
     """
     Class implementing the QTextBrowser based help viewer class.
     """
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         @param parent reference to the parent widget
@@ -53,23 +59,23 @@
         """
         QTextBrowser.__init__(self, parent=parent)
         HelpViewerImpl.__init__(self, engine)
-        
+
         self.__helpViewerWidget = parent
-        
+
         self.__zoomCount = 0
-        
+
         self.__menu = QMenu(self)
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
-        
+
         self.sourceChanged.connect(self.titleChanged)
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-    
+
     def setLink(self, url):
         """
         Public method to set the URL of the document to be shown.
-        
+
         @param url source of the document
         @type QUrl
         """
@@ -77,20 +83,20 @@
             self.setHtml(self.__helpViewerWidget.emptyDocument())
         else:
             self.setSource(url)
-    
+
     def link(self):
         """
         Public method to get the URL of the shown document.
-        
+
         @return URL of the document
         @rtype QUrl
         """
         return self.source()
-    
+
     def doSetSource(self, url, type_):
         """
         Public method to load the data and show it.
-        
+
         @param url URL of resource to load
         @type QUrl
         @param type_ type of the resource to load
@@ -99,17 +105,17 @@
         if not self.__canLoadResource(url):
             QDesktopServices.openUrl(url)
             return
-        
+
         super().doSetSource(url, type_)
-        
+
         self.sourceChanged.emit(url)
         self.loadFinished.emit(True)
-    
+
     def loadResource(self, type_, name):
         """
         Public method to load data of the specified type from the resource with
         the given name.
-        
+
         @param type_ resource type
         @type int
         @param name resource name
@@ -119,8 +125,8 @@
         """
         ba = QByteArray()
         scheme = name.scheme()
-        
-        if type_ < 4:     # QTextDocument.ResourceType.MarkdownResource
+
+        if type_ < 4:  # QTextDocument.ResourceType.MarkdownResource
             if scheme == "about":
                 if name.toString() == "about:blank":
                     return QByteArray(AboutBlank.encode("utf-8"))
@@ -132,24 +138,22 @@
                 url = self._engine.findFile(name)
                 if url.isValid():
                     ba = self._engine.fileData(url)
-            
+
             if name.toString().lower().endswith(".svg"):
                 image = QImage()
                 image.loadFromData(ba, "svg")
                 if not image.isNull():
                     return image
-            
+
             if ba.isEmpty():
-                ba = QByteArray(
-                    PageNotFound.format(name.toString()).encode("utf-8")
-                )
-        
+                ba = QByteArray(PageNotFound.format(name.toString()).encode("utf-8"))
+
         return ba
-    
+
     def __canLoadResource(self, url):
         """
         Private method to check, if the given resource can be loaded.
-        
+
         @param url URL of resource to be loaded
         @type QUrl
         @return flag indicating, that the given URL can be handled
@@ -157,41 +161,40 @@
         """
         scheme = url.scheme()
         return scheme in ("about", "qthelp", "file", "")
-    
+
     def pageTitle(self):
         """
         Public method get the page title.
-        
+
         @return page title
         @rtype str
         """
         titleStr = self.documentTitle()
         if not titleStr:
             url = self.link()
-            
+
             titleStr = url.host()
             if not titleStr:
-                titleStr = url.toString(
-                    QUrl.UrlFormattingOption.RemoveFragment)
-        
+                titleStr = url.toString(QUrl.UrlFormattingOption.RemoveFragment)
+
         if not titleStr or titleStr == "about:blank":
             titleStr = self.tr("Empty Page")
-        
+
         return titleStr
-    
+
     def isEmptyPage(self):
         """
         Public method to check, if the current page is the empty page.
-        
+
         @return flag indicating an empty page is loaded
         @rtype bool
         """
         return self.pageTitle() == self.tr("Empty Page")
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
@@ -203,17 +206,17 @@
             evt.accept()
         else:
             super().mousePressEvent(evt)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method called by a mouse release event.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         hasModifier = evt.modifiers() != Qt.KeyboardModifier.NoModifier
         if evt.button() == Qt.MouseButton.LeftButton and hasModifier:
-            
+
             anchor = self.anchorAt(evt.pos())
             if anchor:
                 url = self.link().resolved(QUrl(anchor))
@@ -224,11 +227,11 @@
                 evt.accept()
         else:
             super().mousePressEvent(evt)
-    
+
     def gotoHistory(self, index):
         """
         Public method to step through the history.
-        
+
         @param index history index (<0 backward, >0 forward)
         @type int
         """
@@ -240,27 +243,27 @@
             # forward
             for _ind in range(index):
                 self.forward()
-    
+
     def isBackwardAvailable(self):
         """
         Public method to check, if stepping backward through the history is
         available.
-        
+
         @return flag indicating backward stepping is available
         @rtype bool
         """
         return QTextBrowser.isBackwardAvailable(self)
-    
+
     def isForwardAvailable(self):
         """
         Public method to check, if stepping forward through the history is
         available.
-        
+
         @return flag indicating forward stepping is available
         @rtype bool
         """
         return QTextBrowser.isForwardAvailable(self)
-    
+
     def scaleUp(self):
         """
         Public method to zoom in.
@@ -269,7 +272,7 @@
             self.__zoomCount += 1
             self.zoomIn()
             self.zoomChanged.emit()
-    
+
     def scaleDown(self):
         """
         Public method to zoom out.
@@ -278,11 +281,11 @@
             self.__zoomCount -= 1
             self.zoomOut()
             self.zoomChanged.emit()
-    
+
     def setScale(self, scale):
         """
         Public method to set the zoom level.
-        
+
         @param scale zoom level to set
         @type int
         """
@@ -290,7 +293,7 @@
             self.zoomOut(scale)
             self.__zoomCount = scale
             self.zoomChanged.emit()
-    
+
     def resetScale(self):
         """
         Public method to reset the zoom level.
@@ -299,38 +302,38 @@
             self.zoomOut(self.__zoomCount)
             self.zoomChanged.emit()
         self.__zoomCount = 0
-    
+
     def scale(self):
         """
         Public method to get the zoom level.
-        
+
         @return current zoom level
         @rtype int
         """
         return self.__zoomCount
-    
+
     def isScaleUpAvailable(self):
         """
         Public method to check, if the max. zoom level is reached.
-        
+
         @return flag indicating scale up is available
         @rtype bool
         """
         return self.__zoomCount < 10
-    
+
     def isScaleDownAvailable(self):
         """
         Public method to check, if the min. zoom level is reached.
-        
+
         @return flag indicating scale down is available
         @rtype bool
         """
         return self.__zoomCount > -5
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel event to zoom.
-        
+
         @param evt reference to the event object
         @type QWheelEvent
         """
@@ -341,47 +344,40 @@
             else:
                 self.scaleDown()
             evt.accept()
-        
+
         elif evt.modifiers() & Qt.KeyboardModifier.ShiftModifier:
             if delta < 0:
                 self.backward()
             elif delta > 0:
                 self.forward()
             evt.accept()
-        
+
         else:
             QTextBrowser.wheelEvent(self, evt)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key press events.
-        
+
         @param evt reference to the key event
         @type QKeyEvent
         """
         key = evt.key()
-        isControlModifier = (
-            evt.modifiers() == Qt.KeyboardModifier.ControlModifier
-        )
-        
-        if (
-            key == Qt.Key.Key_ZoomIn or
-            (key == Qt.Key.Key_Plus and isControlModifier)
-        ):
+        isControlModifier = evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+
+        if key == Qt.Key.Key_ZoomIn or (key == Qt.Key.Key_Plus and isControlModifier):
             self.scaleUp()
             evt.accept()
-        elif (
-            key == Qt.Key.Key_ZoomOut or
-            (key == Qt.Key.Key_Minus and isControlModifier)
+        elif key == Qt.Key.Key_ZoomOut or (
+            key == Qt.Key.Key_Minus and isControlModifier
         ):
             self.scaleDown()
             evt.accept()
         elif key == Qt.Key.Key_0 and isControlModifier:
             self.resetScale()
             evt.accept()
-        elif (
-            key == Qt.Key.Key_Backspace or
-            (key == Qt.Key.Key_Left and isControlModifier)
+        elif key == Qt.Key.Key_Backspace or (
+            key == Qt.Key.Key_Left and isControlModifier
         ):
             self.backward()
             evt.accept()
@@ -391,25 +387,22 @@
         elif key == Qt.Key.Key_F and isControlModifier:
             self.__helpViewerWidget.showHideSearch(True)
             evt.accept()
-        elif (
-            key == Qt.Key.Key_F3 and
-            evt.modifiers() == Qt.KeyboardModifier.NoModifier
-        ):
+        elif key == Qt.Key.Key_F3 and evt.modifiers() == Qt.KeyboardModifier.NoModifier:
             self.__helpViewerWidget.searchNext()
             evt.accept()
         elif (
-            key == Qt.Key.Key_F3 and
-            evt.modifiers() == Qt.KeyboardModifier.ShiftModifier
+            key == Qt.Key.Key_F3
+            and evt.modifiers() == Qt.KeyboardModifier.ShiftModifier
         ):
             self.__helpViewerWidget.searchPrev()
             evt.accept()
         else:
             super().keyPressEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating the event was handled
@@ -418,13 +411,13 @@
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -443,16 +436,16 @@
                     pinch.setTotalScaleFactor(1.6)
                 self.setScale(zoom)
             evt.accept()
-    
+
     #######################################################################
     ## Context menu related methods below
     #######################################################################
-    
+
     @pyqtSlot(QPoint)
     def __showContextMenu(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos position to show the context menu at
         @type QPoint
         """
@@ -460,97 +453,86 @@
         anchor = self.anchorAt(pos)
         linkUrl = self.link().resolved(QUrl(anchor)) if anchor else QUrl()
         selectedText = self.textCursor().selectedText()
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("back"),
-            self.tr("Backward"),
-            self.backward)
+            UI.PixmapCache.getIcon("back"), self.tr("Backward"), self.backward
+        )
         act.setEnabled(self.isBackwardAvailable())
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("forward"),
-            self.tr("Forward"),
-            self.forward)
+            UI.PixmapCache.getIcon("forward"), self.tr("Forward"), self.forward
+        )
         act.setEnabled(self.isForwardAvailable())
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("reload"),
-            self.tr("Reload"),
-            self.reload)
-        
+            UI.PixmapCache.getIcon("reload"), self.tr("Reload"), self.reload
+        )
+
         if not linkUrl.isEmpty() and linkUrl.scheme() != "javascript":
             self.__createLinkContextMenu(self.__menu, linkUrl)
-        
+
         self.__menu.addSeparator()
-        
-        act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy Page URL to Clipboard"))
-        act.setData(self.link())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("bookmark22"),
-            self.tr("Bookmark Page"))
-        act.setData({
-            "title": self.pageTitle(),
-            "url": self.link()
-        })
-        act.triggered.connect(
-            functools.partial(self.__bookmarkPage, act))
-        
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy Page URL to Clipboard")
+        )
+        act.setData(self.link())
+        act.triggered.connect(functools.partial(self.__copyLink, act))
+
+        act = self.__menu.addAction(
+            UI.PixmapCache.getIcon("bookmark22"), self.tr("Bookmark Page")
+        )
+        act.setData({"title": self.pageTitle(), "url": self.link()})
+        act.triggered.connect(functools.partial(self.__bookmarkPage, act))
+
         self.__menu.addSeparator()
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("zoomIn"),
-            self.tr("Zoom in"),
-            self.scaleUp)
+            UI.PixmapCache.getIcon("zoomIn"), self.tr("Zoom in"), self.scaleUp
+        )
         act.setEnabled(self.isScaleUpAvailable())
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("zoomOut"),
-            self.tr("Zoom out"),
-            self.scaleDown)
+            UI.PixmapCache.getIcon("zoomOut"), self.tr("Zoom out"), self.scaleDown
+        )
         act.setEnabled(self.isScaleDownAvailable())
-        
+
         self.__menu.addAction(
-            UI.PixmapCache.getIcon("zoomReset"),
-            self.tr("Zoom reset"),
-            self.resetScale)
-        
+            UI.PixmapCache.getIcon("zoomReset"), self.tr("Zoom reset"), self.resetScale
+        )
+
         self.__menu.addSeparator()
-        
+
         act = self.__menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy"),
-            self.copy)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.copy
+        )
         act.setEnabled(bool(selectedText))
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("editSelectAll"),
             self.tr("Select All"),
-            self.selectAll)
-        
+            self.selectAll,
+        )
+
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
-            UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'),
-            self.__closePage)
-        
+            UI.PixmapCache.getIcon("tabClose"), self.tr("Close"), self.__closePage
+        )
+
         act = self.__menu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
             self.tr("Close Others"),
-            self.__closeOtherPages)
+            self.__closeOtherPages,
+        )
         act.setEnabled(self.__helpViewerWidget.openPagesCount() > 1)
-        
+
         self.__menu.popup(self.mapToGlobal(pos))
-    
+
     def __createLinkContextMenu(self, menu, linkUrl):
         """
         Private method to populate the context menu for URLs.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param linkUrl URL to create the menu part for
@@ -558,61 +540,58 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("openNewTab"),
-            self.tr("Open Link in New Page"))
+            UI.PixmapCache.getIcon("openNewTab"), self.tr("Open Link in New Page")
+        )
         act.setData(linkUrl)
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewPage, act))
-        
+        act.triggered.connect(functools.partial(self.__openLinkInNewPage, act))
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("newWindow"),
-            self.tr("Open Link in Background Page"))
+            UI.PixmapCache.getIcon("newWindow"), self.tr("Open Link in Background Page")
+        )
         act.setData(linkUrl)
-        act.triggered.connect(
-            functools.partial(self.__openLinkInBackgroundPage, act))
-        
+        act.triggered.connect(functools.partial(self.__openLinkInBackgroundPage, act))
+
         menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy URL to Clipboard")
+        )
         act.setData(linkUrl)
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
-    
+        act.triggered.connect(functools.partial(self.__copyLink, act))
+
     def __openLinkInNewPage(self, act):
         """
         Private method called by the context menu to open a link in a new page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__helpViewerWidget.openUrlNewPage(url)
-    
+
     def __openLinkInBackgroundPage(self, act):
         """
         Private method called by the context menu to open a link in a
         background page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__helpViewerWidget.openUrlNewBackgroundPage(url)
-    
+
     def __bookmarkPage(self, act):
         """
         Private method called by the context menu to bookmark the page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
@@ -621,34 +600,34 @@
             with contextlib.suppress(KeyError):
                 url = data["url"]
                 title = data["title"]
-                
+
                 self.__helpViewerWidget.bookmarkPage(title, url)
-    
+
     def __copyLink(self, act):
         """
         Private method called by the context menu to copy a link to the
         clipboard.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
-        
+
         if isinstance(data, QUrl):
             data = data.toString()
-        
+
         # copy the URL to both clipboard areas
         QGuiApplication.clipboard().setText(data, QClipboard.Mode.Clipboard)
         QGuiApplication.clipboard().setText(data, QClipboard.Mode.Selection)
-    
+
     def __closePage(self):
         """
         Private method called by the context menu to close the current page.
         """
         self.__helpViewerWidget.closeCurrentPage()
-    
+
     def __closeOtherPages(self):
         """
         Private method called by the context menu to close all other pages.
--- a/src/eric7/HelpViewer/HelpViewerImplQWE.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpViewerImplQWE.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,17 +26,34 @@
     """
     Class implementing the QTextBrowser based help viewer class.
     """
+
     ZoomLevels = [
-        30, 40, 50, 67, 80, 90,
+        30,
+        40,
+        50,
+        67,
+        80,
+        90,
         100,
-        110, 120, 133, 150, 170, 200, 220, 233, 250, 270, 285, 300,
+        110,
+        120,
+        133,
+        150,
+        170,
+        200,
+        220,
+        233,
+        250,
+        270,
+        285,
+        300,
     ]
     ZoomLevelDefault = 100
-    
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         @param parent reference to the parent widget
@@ -44,44 +61,44 @@
         """
         QWebEngineView.__init__(self, parent=parent)
         HelpViewerImpl.__init__(self, engine)
-        
+
         self.__helpViewerWidget = parent
-        
+
         self.__rwhvqt = None
         self.installEventFilter(self)
-        
+
         self.__page = None
         self.__createNewPage()
-        
+
         self.__currentScale = 100
-        
+
         self.__menu = QMenu(self)
-    
+
     def __createNewPage(self):
         """
         Private method to create a new page object.
         """
         self.__page = QWebEnginePage(self.__helpViewerWidget.webProfile())
         self.setPage(self.__page)
-        
+
         self.__page.titleChanged.connect(self.__titleChanged)
         self.__page.urlChanged.connect(self.__titleChanged)
         self.__page.newWindowRequested.connect(self.__newWindowRequested)
-    
+
     def __newWindowRequested(self, request):
         """
         Private slot handling new window requests of the web page.
-        
+
         @param request reference to the new window request
         @type QWebEngineNewWindowRequest
         """
         background = (
-            request.destination() ==
-            QWebEngineNewWindowRequest.DestinationType.InNewBackgroundTab
+            request.destination()
+            == QWebEngineNewWindowRequest.DestinationType.InNewBackgroundTab
         )
         newViewer = self.__helpViewerWidget.addPage(background=background)
         request.openIn(newViewer.page())
-    
+
     def __setRwhvqt(self):
         """
         Private slot to set widget that receives input events.
@@ -92,12 +109,12 @@
             self.__rwhvqt.grabGesture(Qt.GestureType.PinchGesture)
             self.__rwhvqt.installEventFilter(self)
         else:
-            print("Focus proxy is null!")   # __IGNORE_WARNING_M801__
-    
+            print("Focus proxy is null!")  # __IGNORE_WARNING_M801__
+
     def setLink(self, url):
         """
         Public method to set the URL of the document to be shown.
-        
+
         @param url URL of the document
         @type QUrl
         """
@@ -105,27 +122,27 @@
             self.setHtml(self.__helpViewerWidget.emptyDocument())
         else:
             super().setUrl(url)
-    
+
     def link(self):
         """
         Public method to get the URL of the shown document.
-        
+
         @return url URL of the document
         @rtype QUrl
         """
         return super().url()
-    
+
     @pyqtSlot()
     def __titleChanged(self):
         """
         Private method to handle a change of the web page title.
         """
         super().titleChanged.emit()
-    
+
     def pageTitle(self):
         """
         Public method get the page title.
-        
+
         @return page title
         @rtype str
         """
@@ -135,98 +152,97 @@
                 url = self.__page.requestedUrl()
             else:
                 url = self.link()
-            
+
             titleStr = url.host()
             if not titleStr:
-                titleStr = url.toString(
-                    QUrl.UrlFormattingOption.RemoveFragment)
-        
+                titleStr = url.toString(QUrl.UrlFormattingOption.RemoveFragment)
+
         if not titleStr or titleStr == "about:blank":
             titleStr = self.tr("Empty Page")
-        
+
         return titleStr
-    
+
     def isEmptyPage(self):
         """
         Public method to check, if the current page is the empty page.
-        
+
         @return flag indicating an empty page is loaded
         @rtype bool
         """
         return self.pageTitle() == self.tr("Empty Page")
-    
+
     #######################################################################
     ## History related methods below
     #######################################################################
-    
+
     def isBackwardAvailable(self):
         """
         Public method to check, if stepping backward through the history is
         available.
-        
+
         @return flag indicating backward stepping is available
         @rtype bool
         """
         return self.history().canGoBack()
-    
+
     def isForwardAvailable(self):
         """
         Public method to check, if stepping forward through the history is
         available.
-        
+
         @return flag indicating forward stepping is available
         @rtype bool
         """
         return self.history().canGoForward()
-    
+
     def backward(self):
         """
         Public slot to move backwards in history.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Back)
-    
+
     def forward(self):
         """
         Public slot to move forward in history.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Forward)
-    
+
     def reload(self):
         """
         Public slot to reload the current page.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Reload)
-    
+
     def backwardHistoryCount(self):
         """
         Public method to get the number of available back history items.
-        
+
         Note: For performance reasons this is limited to the maximum number of
         history items the help viewer is interested in.
-        
+
         @return count of available back history items
         @rtype int
         """
         history = self.history()
         return len(history.backItems(HelpViewerWidget.MaxHistoryItems))
-    
+
     def forwardHistoryCount(self):
         """
         Public method to get the number of available forward history items.
-        
+
         Note: For performance reasons this is limited to the maximum number of
         history items the help viewer is interested in.
-        
+
         @return count of available forward history items
         @rtype int
         """
         history = self.history()
         return len(history.forwardItems(HelpViewerWidget.MaxHistoryItems))
-    
+
     def historyTitle(self, offset):
         """
         Public method to get the title of a history item.
-        
+
         @param offset offset of the item with respect to the current page
         @type int
         @return title of the requeted item in history
@@ -236,11 +252,11 @@
         currentIndex = history.currentItemIndex()
         itm = self.history().itemAt(currentIndex + offset)
         return itm.title()
-    
+
     def gotoHistory(self, offset):
         """
         Public method to go to a history item.
-        
+
         @param offset offset of the item with respect to the current page
         @type int
         """
@@ -248,21 +264,21 @@
         currentIndex = history.currentItemIndex()
         itm = self.history().itemAt(currentIndex + offset)
         history.goToItem(itm)
-    
+
     def clearHistory(self):
         """
         Public method to clear the history.
         """
         self.history().clear()
-    
+
     #######################################################################
     ## Zoom related methods below
     #######################################################################
-    
+
     def __levelForScale(self, scale):
         """
         Private method determining the zoom level index given a zoom factor.
-        
+
         @param scale zoom factor
         @type int
         @return index of zoom factor
@@ -275,7 +291,7 @@
                 if scale <= self.ZoomLevels[scale]:
                     break
         return index
-    
+
     def scaleUp(self):
         """
         Public method to zoom in.
@@ -283,7 +299,7 @@
         index = self.__levelForScale(self.__currentScale)
         if index < len(self.ZoomLevels) - 1:
             self.setScale(self.ZoomLevels[index + 1])
-    
+
     def scaleDown(self):
         """
         Public method to zoom out.
@@ -291,11 +307,11 @@
         index = self.__levelForScale(self.__currentScale)
         if index > 0:
             self.setScale(self.ZoomLevels[index - 1])
-    
+
     def setScale(self, scale):
         """
         Public method to set the zoom level.
-        
+
         @param scale zoom level to set
         @type int
         """
@@ -303,51 +319,51 @@
             self.setZoomFactor(scale / 100.0)
             self.__currentScale = scale
             self.zoomChanged.emit()
-    
+
     def resetScale(self):
         """
         Public method to reset the zoom level.
         """
         index = self.__levelForScale(self.ZoomLevelDefault)
         self.setScale(self.ZoomLevels[index])
-    
+
     def scale(self):
         """
         Public method to get the zoom level.
-        
+
         @return current zoom level
         @rtype int
         """
         return self.__currentScale
-    
+
     def isScaleUpAvailable(self):
         """
         Public method to check, if the max. zoom level is reached.
-        
+
         @return flag indicating scale up is available
         @rtype bool
         """
         index = self.__levelForScale(self.__currentScale)
         return index < len(self.ZoomLevels) - 1
-    
+
     def isScaleDownAvailable(self):
         """
         Public method to check, if the min. zoom level is reached.
-        
+
         @return flag indicating scale down is available
         @rtype bool
         """
         index = self.__levelForScale(self.__currentScale)
         return index > 0
-    
+
     #######################################################################
     ## Event handlers below
     #######################################################################
-    
+
     def eventFilter(self, obj, evt):
         """
         Public method to process event for other objects.
-        
+
         @param obj reference to object to process events for
         @type QObject
         @param evt reference to event to be processed
@@ -356,24 +372,23 @@
         @rtype bool
         """
         if (
-            obj is self and
-            evt.type() == QEvent.Type.ParentChange and
-            self.parentWidget() is not None
+            obj is self
+            and evt.type() == QEvent.Type.ParentChange
+            and self.parentWidget() is not None
         ):
             self.parentWidget().installEventFilter(self)
-        
+
         # find the render widget receiving events for the web page
         if obj is self and evt.type() == QEvent.Type.ChildAdded:
             QTimer.singleShot(0, self.__setRwhvqt)
-        
+
         # forward events to WebBrowserView
-        if (
-            obj is self.__rwhvqt and
-            evt.type() in [QEvent.Type.KeyPress,
-                           QEvent.Type.MouseButtonRelease,
-                           QEvent.Type.Wheel,
-                           QEvent.Type.Gesture]
-        ):
+        if obj is self.__rwhvqt and evt.type() in [
+            QEvent.Type.KeyPress,
+            QEvent.Type.MouseButtonRelease,
+            QEvent.Type.Wheel,
+            QEvent.Type.Gesture,
+        ]:
             wasAccepted = evt.isAccepted()
             evt.setAccepted(False)
             if evt.type() == QEvent.Type.KeyPress:
@@ -387,11 +402,11 @@
             ret = evt.isAccepted()
             evt.setAccepted(wasAccepted)
             return ret
-        
-        if (
-            obj is self.parentWidget() and
-            evt.type() in [QEvent.Type.KeyPress, QEvent.Type.KeyRelease]
-        ):
+
+        if obj is self.parentWidget() and evt.type() in [
+            QEvent.Type.KeyPress,
+            QEvent.Type.KeyRelease,
+        ]:
             wasAccepted = evt.isAccepted()
             evt.setAccepted(False)
             if evt.type() == QEvent.Type.KeyPress:
@@ -399,49 +414,41 @@
             ret = evt.isAccepted()
             evt.setAccepted(wasAccepted)
             return ret
-        
+
         # block already handled events
-        if (
-            obj is self and
-            evt.type() in [QEvent.Type.KeyPress,
-                           QEvent.Type.MouseButtonRelease,
-                           QEvent.Type.Wheel,
-                           QEvent.Type.Gesture]
-        ):
+        if obj is self and evt.type() in [
+            QEvent.Type.KeyPress,
+            QEvent.Type.MouseButtonRelease,
+            QEvent.Type.Wheel,
+            QEvent.Type.Gesture,
+        ]:
             return True
-        
+
         return super().eventFilter(obj, evt)
-    
+
     def _keyPressEvent(self, evt):
         """
         Protected method called by a key press.
-        
+
         @param evt reference to the key event
         @type QKeyEvent
         """
         key = evt.key()
-        isControlModifier = (
-            evt.modifiers() == Qt.KeyboardModifier.ControlModifier
-        )
-        
-        if (
-            key == Qt.Key.Key_ZoomIn or
-            (key == Qt.Key.Key_Plus and isControlModifier)
-        ):
+        isControlModifier = evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+
+        if key == Qt.Key.Key_ZoomIn or (key == Qt.Key.Key_Plus and isControlModifier):
             self.scaleUp()
             evt.accept()
-        elif (
-            key == Qt.Key.Key_ZoomOut or
-            (key == Qt.Key.Key_Minus and isControlModifier)
+        elif key == Qt.Key.Key_ZoomOut or (
+            key == Qt.Key.Key_Minus and isControlModifier
         ):
             self.scaleDown()
             evt.accept()
         elif key == Qt.Key.Key_0 and isControlModifier:
             self.resetScale()
             evt.accept()
-        elif (
-            key == Qt.Key.Key_Backspace or
-            (key == Qt.Key.Key_Left and isControlModifier)
+        elif key == Qt.Key.Key_Backspace or (
+            key == Qt.Key.Key_Left and isControlModifier
         ):
             self.backward()
             evt.accept()
@@ -451,47 +458,36 @@
         elif key == Qt.Key.Key_F and isControlModifier:
             self.__helpViewerWidget.showHideSearch(True)
             evt.accept()
-        elif (
-            key == Qt.Key.Key_F3 and
-            evt.modifiers() == Qt.KeyboardModifier.NoModifier
-        ):
+        elif key == Qt.Key.Key_F3 and evt.modifiers() == Qt.KeyboardModifier.NoModifier:
             self.__helpViewerWidget.searchNext()
             evt.accept()
         elif (
-            key == Qt.Key.Key_F3 and
-            evt.modifiers() == Qt.KeyboardModifier.ShiftModifier
+            key == Qt.Key.Key_F3
+            and evt.modifiers() == Qt.KeyboardModifier.ShiftModifier
         ):
             self.__helpViewerWidget.searchPrev()
             evt.accept()
-    
+
     def _mouseReleaseEvent(self, evt):
         """
         Protected method called by a mouse release event.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         accepted = evt.isAccepted()
         self.__page.event(evt)
-        if (
-            not evt.isAccepted() and
-            evt.button() == Qt.MouseButton.MiddleButton
-        ):
-            url = QUrl(QGuiApplication.clipboard().text(
-                QClipboard.Mode.Selection))
-            if (
-                not url.isEmpty() and
-                url.isValid() and
-                url.scheme() != ""
-            ):
+        if not evt.isAccepted() and evt.button() == Qt.MouseButton.MiddleButton:
+            url = QUrl(QGuiApplication.clipboard().text(QClipboard.Mode.Selection))
+            if not url.isEmpty() and url.isValid() and url.scheme() != "":
                 self.setLink(url)
                 accepted = True
         evt.setAccepted(accepted)
-    
+
     def _wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -502,18 +498,18 @@
             elif delta > 0:
                 self.scaleUp()
             evt.accept()
-        
+
         elif evt.modifiers() & Qt.KeyboardModifier.ShiftModifier:
             if delta < 0:
                 self.backward()
             elif delta > 0:
                 self.forward()
             evt.accept()
-    
+
     def _gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -525,156 +521,145 @@
                 scaleFactor = pinch.totalScaleFactor()
                 self.setScale(int(scaleFactor * 100))
             evt.accept()
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, if the event was handled (boolean)
         """
         if evt.type() == QEvent.Type.Gesture:
             self._gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     #######################################################################
     ## Context menu related methods below
     #######################################################################
-    
+
     def contextMenuEvent(self, evt):
         """
         Protected method called to create a context menu.
-        
+
         This method is overridden from QWebEngineView.
-        
+
         @param evt reference to the context menu event object
         @type QContextMenuEvent
         """
         pos = evt.pos()
         reason = evt.reason()
         QTimer.singleShot(
-            0,
-            lambda: self._contextMenuEvent(QContextMenuEvent(reason, pos)))
+            0, lambda: self._contextMenuEvent(QContextMenuEvent(reason, pos))
+        )
         # needs to be done this way because contextMenuEvent is blocking
         # the main loop
-    
+
     def _contextMenuEvent(self, evt):
         """
         Protected method called to create a context menu.
-        
+
         @param evt reference to the context menu event object
             (QContextMenuEvent)
         """
         self.__menu.clear()
-        
+
         self.__createContextMenu(self.__menu)
-        
+
         if not self.__menu.isEmpty():
             pos = evt.globalPos()
             self.__menu.popup(QPoint(pos.x(), pos.y() + 1))
-    
+
     def __createContextMenu(self, menu):
         """
         Private method to populate the context menu.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         """
         contextMenuData = self.lastContextMenuRequest()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("back"),
-            self.tr("Backward"),
-            self.backward)
+            UI.PixmapCache.getIcon("back"), self.tr("Backward"), self.backward
+        )
         act.setEnabled(self.isBackwardAvailable())
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("forward"),
-            self.tr("Forward"),
-            self.forward)
+            UI.PixmapCache.getIcon("forward"), self.tr("Forward"), self.forward
+        )
         act.setEnabled(self.isForwardAvailable())
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("reload"),
-            self.tr("Reload"),
-            self.reload)
-        
+            UI.PixmapCache.getIcon("reload"), self.tr("Reload"), self.reload
+        )
+
         if (
-            not contextMenuData.linkUrl().isEmpty() and
-            contextMenuData.linkUrl().scheme() != "javascript"
+            not contextMenuData.linkUrl().isEmpty()
+            and contextMenuData.linkUrl().scheme() != "javascript"
         ):
             self.__createLinkContextMenu(menu, contextMenuData)
-        
+
         menu.addSeparator()
-        
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy Page URL to Clipboard"))
-        act.setData(self.link())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("bookmark22"),
-            self.tr("Bookmark Page"))
-        act.setData({
-            "title": self.pageTitle(),
-            "url": self.link()
-        })
-        act.triggered.connect(
-            functools.partial(self.__bookmarkPage, act))
-        
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy Page URL to Clipboard")
+        )
+        act.setData(self.link())
+        act.triggered.connect(functools.partial(self.__copyLink, act))
+
+        act = menu.addAction(
+            UI.PixmapCache.getIcon("bookmark22"), self.tr("Bookmark Page")
+        )
+        act.setData({"title": self.pageTitle(), "url": self.link()})
+        act.triggered.connect(functools.partial(self.__bookmarkPage, act))
+
         menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("zoomIn"),
-            self.tr("Zoom in"),
-            self.scaleUp)
+            UI.PixmapCache.getIcon("zoomIn"), self.tr("Zoom in"), self.scaleUp
+        )
         act.setEnabled(self.isScaleUpAvailable())
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("zoomOut"),
-            self.tr("Zoom out"),
-            self.scaleDown)
+            UI.PixmapCache.getIcon("zoomOut"), self.tr("Zoom out"), self.scaleDown
+        )
         act.setEnabled(self.isScaleDownAvailable())
-        
+
         menu.addAction(
-            UI.PixmapCache.getIcon("zoomReset"),
-            self.tr("Zoom reset"),
-            self.resetScale)
-        
+            UI.PixmapCache.getIcon("zoomReset"), self.tr("Zoom reset"), self.resetScale
+        )
+
         menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy"),
-            self.__copyText)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyText
+        )
         act.setEnabled(bool(contextMenuData.selectedText()))
-        
+
         menu.addAction(
             UI.PixmapCache.getIcon("editSelectAll"),
             self.tr("Select All"),
-            self.__selectAll)
-        
+            self.__selectAll,
+        )
+
         menu.addSeparator()
-        
+
         menu.addAction(
-            UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'),
-            self.__closePage)
-        
+            UI.PixmapCache.getIcon("tabClose"), self.tr("Close"), self.__closePage
+        )
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
             self.tr("Close Others"),
-            self.__closeOtherPages)
+            self.__closeOtherPages,
+        )
         act.setEnabled(self.__helpViewerWidget.openPagesCount() > 1)
-    
+
     def __createLinkContextMenu(self, menu, contextMenuData):
         """
         Private method to populate the context menu for URLs.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param contextMenuData data of the last context menu request
@@ -682,61 +667,58 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("openNewTab"),
-            self.tr("Open Link in New Page"))
+            UI.PixmapCache.getIcon("openNewTab"), self.tr("Open Link in New Page")
+        )
         act.setData(contextMenuData.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewPage, act))
-        
+        act.triggered.connect(functools.partial(self.__openLinkInNewPage, act))
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("newWindow"),
-            self.tr("Open Link in Background Page"))
+            UI.PixmapCache.getIcon("newWindow"), self.tr("Open Link in Background Page")
+        )
         act.setData(contextMenuData.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInBackgroundPage, act))
-        
+        act.triggered.connect(functools.partial(self.__openLinkInBackgroundPage, act))
+
         menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy URL to Clipboard")
+        )
         act.setData(contextMenuData.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
-    
+        act.triggered.connect(functools.partial(self.__copyLink, act))
+
     def __openLinkInNewPage(self, act):
         """
         Private method called by the context menu to open a link in a new page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__helpViewerWidget.openUrlNewPage(url)
-    
+
     def __openLinkInBackgroundPage(self, act):
         """
         Private method called by the context menu to open a link in a
         background page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__helpViewerWidget.openUrlNewBackgroundPage(url)
-    
+
     def __bookmarkPage(self, act):
         """
         Private method called by the context menu to bookmark the page.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
@@ -745,47 +727,47 @@
             with contextlib.suppress(KeyError):
                 url = data["url"]
                 title = data["title"]
-                
+
                 self.__helpViewerWidget.bookmarkPage(title, url)
-    
+
     def __copyLink(self, act):
         """
         Private method called by the context menu to copy a link to the
         clipboard.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
-        
+
         if isinstance(data, QUrl):
             data = data.toString()
-        
+
         # copy the URL to both clipboard areas
         QGuiApplication.clipboard().setText(data, QClipboard.Mode.Clipboard)
         QGuiApplication.clipboard().setText(data, QClipboard.Mode.Selection)
-    
+
     def __copyText(self):
         """
         Private method called by the context menu to copy selected text to the
         clipboard.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Copy)
-    
+
     def __selectAll(self):
         """
         Private method called by the context menu to select all text.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.SelectAll)
-    
+
     def __closePage(self):
         """
         Private method called by the context menu to close the current page.
         """
         self.__helpViewerWidget.closeCurrentPage()
-    
+
     def __closeOtherPages(self):
         """
         Private method called by the context menu to close all other pages.
--- a/src/eric7/HelpViewer/HelpViewerWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/HelpViewerWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,12 +13,25 @@
 from PyQt6.QtGui import QAction, QFont, QFontMetrics
 from PyQt6.QtHelp import QHelpEngine
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QVBoxLayout, QComboBox, QSizePolicy, QStackedWidget,
-    QToolButton, QButtonGroup, QAbstractButton, QMenu, QFrame, QLabel,
-    QProgressBar, QSplitter
+    QWidget,
+    QHBoxLayout,
+    QVBoxLayout,
+    QComboBox,
+    QSizePolicy,
+    QStackedWidget,
+    QToolButton,
+    QButtonGroup,
+    QAbstractButton,
+    QMenu,
+    QFrame,
+    QLabel,
+    QProgressBar,
+    QSplitter,
 )
+
 try:
     from PyQt6.QtWebEngineCore import QWebEngineProfile, QWebEngineSettings
+
     WEBENGINE_AVAILABLE = True
 except ImportError:
     WEBENGINE_AVAILABLE = False
@@ -26,7 +39,8 @@
 from EricWidgets import EricFileDialog, EricMessageBox
 from EricWidgets.EricApplication import ericApp
 from EricWidgets.EricTextEditSearchWidget import (
-    EricTextEditSearchWidget, EricTextEditType
+    EricTextEditSearchWidget,
+    EricTextEditType,
 )
 
 import UI.PixmapCache
@@ -45,191 +59,185 @@
     """
     Class implementing an embedded viewer for QtHelp and local HTML files.
     """
-    MaxHistoryItems = 20    # max. number of history items to be shown
-    
+
+    MaxHistoryItems = 20  # max. number of history items to be shown
+
     EmpytDocument_Light = (
-        '''<!DOCTYPE html>\n'''
-        '''<html lang="EN">\n'''
-        '''<head>\n'''
-        '''<style type="text/css">\n'''
-        '''html {background-color: #ffffff;}\n'''
-        '''body {background-color: #ffffff;\n'''
-        '''      color: #000000;\n'''
-        '''      margin: 10px 10px 10px 10px;\n'''
-        '''}\n'''
-        '''</style'''
-        '''</head>\n'''
-        '''<body>\n'''
-        '''</body>\n'''
-        '''</html>'''
+        """<!DOCTYPE html>\n"""
+        """<html lang="EN">\n"""
+        """<head>\n"""
+        """<style type="text/css">\n"""
+        """html {background-color: #ffffff;}\n"""
+        """body {background-color: #ffffff;\n"""
+        """      color: #000000;\n"""
+        """      margin: 10px 10px 10px 10px;\n"""
+        """}\n"""
+        """</style"""
+        """</head>\n"""
+        """<body>\n"""
+        """</body>\n"""
+        """</html>"""
     )
     EmpytDocument_Dark = (
-        '''<!DOCTYPE html>\n'''
-        '''<html lang="EN">\n'''
-        '''<head>\n'''
-        '''<style type="text/css">\n'''
-        '''html {background-color: #262626;}\n'''
-        '''body {background-color: #262626;\n'''
-        '''      color: #ffffff;\n'''
-        '''      margin: 10px 10px 10px 10px;\n'''
-        '''}\n'''
-        '''</style'''
-        '''</head>\n'''
-        '''<body>\n'''
-        '''</body>\n'''
-        '''</html>'''
+        """<!DOCTYPE html>\n"""
+        """<html lang="EN">\n"""
+        """<head>\n"""
+        """<style type="text/css">\n"""
+        """html {background-color: #262626;}\n"""
+        """body {background-color: #262626;\n"""
+        """      color: #ffffff;\n"""
+        """      margin: 10px 10px 10px 10px;\n"""
+        """}\n"""
+        """</style"""
+        """</head>\n"""
+        """<body>\n"""
+        """</body>\n"""
+        """</html>"""
     )
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setObjectName("HelpViewerWidget")
-        
+
         self.__ui = parent
-        
+
         self.__initHelpEngine()
-        
+
         self.__layout = QVBoxLayout()
         self.__layout.setObjectName("MainLayout")
         self.__layout.setContentsMargins(0, 3, 0, 0)
-        
+
         ###################################################################
         ## Help Topic Selector
         ###################################################################
-        
+
         self.__selectorLayout = QHBoxLayout()
-        
+
         self.__helpSelector = QComboBox(self)
         self.__helpSelector.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         self.__selectorLayout.addWidget(self.__helpSelector)
         self.__populateHelpSelector()
         self.__helpSelector.activated.connect(self.__helpTopicSelected)
-        
+
         self.__openButton = QToolButton(self)
         self.__openButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.__openButton.setToolTip(self.tr("Open a local file"))
         self.__openButton.clicked.connect(self.__openFile)
         self.__selectorLayout.addWidget(self.__openButton)
-        
+
         self.__actionsButton = QToolButton(self)
-        self.__actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
-        self.__actionsButton.setToolTip(
-            self.tr("Select action from menu"))
-        self.__actionsButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.__actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
+        self.__actionsButton.setToolTip(self.tr("Select action from menu"))
+        self.__actionsButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
         self.__selectorLayout.addWidget(self.__actionsButton)
-        
+
         self.__layout.addLayout(self.__selectorLayout)
-        
+
         ###################################################################
         ## Navigation Buttons
         ###################################################################
-        
+
         self.__navButtonsLayout = QHBoxLayout()
-        
+
         self.__navButtonsLayout.addStretch()
-        
+
         self.__backwardButton = QToolButton(self)
         self.__backwardButton.setIcon(UI.PixmapCache.getIcon("back"))
         self.__backwardButton.setToolTip(self.tr("Move one page backward"))
         self.__backwardButton.clicked.connect(self.__backward)
-        
+
         self.__forwardButton = QToolButton(self)
         self.__forwardButton.setIcon(UI.PixmapCache.getIcon("forward"))
         self.__forwardButton.setToolTip(self.tr("Move one page forward"))
         self.__forwardButton.clicked.connect(self.__forward)
-        
+
         self.__backForButtonLayout = QHBoxLayout()
         self.__backForButtonLayout.setContentsMargins(0, 0, 0, 0)
         self.__backForButtonLayout.setSpacing(0)
         self.__backForButtonLayout.addWidget(self.__backwardButton)
         self.__backForButtonLayout.addWidget(self.__forwardButton)
         self.__navButtonsLayout.addLayout(self.__backForButtonLayout)
-        
+
         self.__reloadButton = QToolButton(self)
         self.__reloadButton.setIcon(UI.PixmapCache.getIcon("reload"))
         self.__reloadButton.setToolTip(self.tr("Reload the current page"))
         self.__reloadButton.clicked.connect(self.__reload)
         self.__navButtonsLayout.addWidget(self.__reloadButton)
-        
+
         self.__buttonLine1 = QFrame(self)
         self.__buttonLine1.setFrameShape(QFrame.Shape.VLine)
         self.__buttonLine1.setFrameShadow(QFrame.Shadow.Sunken)
         self.__navButtonsLayout.addWidget(self.__buttonLine1)
-        
+
         self.__zoomInButton = QToolButton(self)
         self.__zoomInButton.setIcon(UI.PixmapCache.getIcon("zoomIn"))
-        self.__zoomInButton.setToolTip(
-            self.tr("Zoom in on the current page"))
+        self.__zoomInButton.setToolTip(self.tr("Zoom in on the current page"))
         self.__zoomInButton.clicked.connect(self.__zoomIn)
         self.__navButtonsLayout.addWidget(self.__zoomInButton)
-        
+
         self.__zoomOutButton = QToolButton(self)
         self.__zoomOutButton.setIcon(UI.PixmapCache.getIcon("zoomOut"))
-        self.__zoomOutButton.setToolTip(
-            self.tr("Zoom out on the current page"))
+        self.__zoomOutButton.setToolTip(self.tr("Zoom out on the current page"))
         self.__zoomOutButton.clicked.connect(self.__zoomOut)
         self.__navButtonsLayout.addWidget(self.__zoomOutButton)
-        
+
         self.__zoomResetButton = QToolButton(self)
         self.__zoomResetButton.setIcon(UI.PixmapCache.getIcon("zoomReset"))
         self.__zoomResetButton.setToolTip(
-            self.tr("Reset the zoom level of the current page"))
+            self.tr("Reset the zoom level of the current page")
+        )
         self.__zoomResetButton.clicked.connect(self.__zoomReset)
         self.__navButtonsLayout.addWidget(self.__zoomResetButton)
-        
+
         self.__buttonLine2 = QFrame(self)
         self.__buttonLine2.setFrameShape(QFrame.Shape.VLine)
         self.__buttonLine2.setFrameShadow(QFrame.Shadow.Sunken)
         self.__navButtonsLayout.addWidget(self.__buttonLine2)
-        
+
         self.__addPageButton = QToolButton(self)
         self.__addPageButton.setIcon(UI.PixmapCache.getIcon("plus"))
-        self.__addPageButton.setToolTip(
-            self.tr("Add a new empty page"))
+        self.__addPageButton.setToolTip(self.tr("Add a new empty page"))
         self.__addPageButton.clicked.connect(self.__addNewPage)
         self.__navButtonsLayout.addWidget(self.__addPageButton)
-        
+
         self.__closePageButton = QToolButton(self)
         self.__closePageButton.setIcon(UI.PixmapCache.getIcon("minus"))
-        self.__closePageButton.setToolTip(
-            self.tr("Close the current page"))
+        self.__closePageButton.setToolTip(self.tr("Close the current page"))
         self.__closePageButton.clicked.connect(self.closeCurrentPage)
         self.__navButtonsLayout.addWidget(self.__closePageButton)
-        
+
         self.__buttonLine3 = QFrame(self)
         self.__buttonLine3.setFrameShape(QFrame.Shape.VLine)
         self.__buttonLine3.setFrameShadow(QFrame.Shadow.Sunken)
         self.__navButtonsLayout.addWidget(self.__buttonLine3)
-        
+
         self.__searchButton = QToolButton(self)
         self.__searchButton.setIcon(UI.PixmapCache.getIcon("find"))
-        self.__searchButton.setToolTip(
-            self.tr("Show or hide the search pane"))
+        self.__searchButton.setToolTip(self.tr("Show or hide the search pane"))
         self.__searchButton.setCheckable(True)
         self.__searchButton.setChecked(False)
         self.__searchButton.clicked.connect(self.showHideSearch)
         self.__navButtonsLayout.addWidget(self.__searchButton)
-        
+
         self.__navButtonsLayout.addStretch()
-        
+
         self.__layout.addLayout(self.__navButtonsLayout)
-                
+
         self.__backMenu = QMenu(self)
         self.__backMenu.triggered.connect(self.__navigationMenuActionTriggered)
         self.__backwardButton.setMenu(self.__backMenu)
         self.__backMenu.aboutToShow.connect(self.__showBackMenu)
-        
+
         self.__forwardMenu = QMenu(self)
-        self.__forwardMenu.triggered.connect(
-            self.__navigationMenuActionTriggered)
+        self.__forwardMenu.triggered.connect(self.__navigationMenuActionTriggered)
         self.__forwardButton.setMenu(self.__forwardMenu)
         self.__forwardMenu.aboutToShow.connect(self.__showForwardMenu)
 
@@ -237,102 +245,109 @@
         ## Center widget with help pages, search widget and navigation
         ## widgets
         ###################################################################
-        
+
         self.__centerSplitter = QSplitter(Qt.Orientation.Vertical, self)
         self.__centerSplitter.setChildrenCollapsible(False)
         self.__layout.addWidget(self.__centerSplitter)
-        
+
         self.__helpCenterWidget = QWidget(self)
         self.__helpCenterLayout = QVBoxLayout()
         self.__helpCenterLayout.setContentsMargins(0, 0, 0, 0)
         self.__helpCenterWidget.setLayout(self.__helpCenterLayout)
-        
+
         ###################################################################
-        
+
         self.__helpStack = QStackedWidget(self)
         self.__helpStack.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding
+        )
         self.__helpCenterLayout.addWidget(self.__helpStack)
-        
+
         ###################################################################
-        
+
         self.__searchWidget = EricTextEditSearchWidget(
-            self, widthForHeight=False, enableClose=True)
+            self, widthForHeight=False, enableClose=True
+        )
         self.__helpCenterLayout.addWidget(self.__searchWidget)
         self.__searchWidget.closePressed.connect(self.__searchWidgetClosed)
         self.__searchWidget.hide()
-        
+
         self.__centerSplitter.addWidget(self.__helpCenterWidget)
-        
+
         ###################################################################
-        
+
         self.__helpNavigationStack = QStackedWidget(self)
         self.__helpNavigationStack.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         self.__helpNavigationStack.setMinimumHeight(100)
         self.__centerSplitter.addWidget(self.__helpNavigationStack)
         self.__populateNavigationStack()
-        
+
         ###################################################################
         ## Bottom buttons
         ###################################################################
-        
+
         self.__buttonLayout = QHBoxLayout()
-        
+
         self.__buttonGroup = QButtonGroup(self)
         self.__buttonGroup.setExclusive(True)
-        self.__buttonGroup.buttonClicked.connect(
-            self.__selectNavigationWidget)
-        
+        self.__buttonGroup.buttonClicked.connect(self.__selectNavigationWidget)
+
         self.__buttonLayout.addStretch()
-        
+
         self.__openPagesButton = self.__addNavigationButton(
-            "fileMisc", self.tr("Show list of open pages"))
+            "fileMisc", self.tr("Show list of open pages")
+        )
         self.__helpTocButton = self.__addNavigationButton(
-            "tableOfContents", self.tr("Show the table of contents"))
+            "tableOfContents", self.tr("Show the table of contents")
+        )
         self.__helpIndexButton = self.__addNavigationButton(
-            "helpIndex", self.tr("Show the help document index"))
+            "helpIndex", self.tr("Show the help document index")
+        )
         self.__helpSearchButton = self.__addNavigationButton(
-            "documentFind", self.tr("Show the help search window"))
+            "documentFind", self.tr("Show the help search window")
+        )
         self.__bookmarksButton = self.__addNavigationButton(
-            "bookmark22", self.tr("Show list of bookmarks"))
-        
+            "bookmark22", self.tr("Show list of bookmarks")
+        )
+
         self.__buttonLayout.addStretch()
-        
+
         self.__helpFilterWidget = self.__initFilterWidget()
         self.__buttonLayout.addWidget(self.__helpFilterWidget)
-        
+
         self.__layout.addLayout(self.__buttonLayout)
-        
+
         self.__indexingProgressWidget = self.__initIndexingProgress()
         self.__layout.addWidget(self.__indexingProgressWidget)
         self.__indexingProgressWidget.hide()
-        
+
         ###################################################################
-        
+
         self.setLayout(self.__layout)
-        
+
         self.__openPagesButton.setChecked(True)
-        
+
         self.__ui.preferencesChanged.connect(self.__populateHelpSelector)
-        
+
         self.__initActionsMenu()
-        
+
         if WEBENGINE_AVAILABLE:
             self.__initQWebEngine()
             self.__ui.preferencesChanged.connect(self.__initQWebEngineSettings)
-        
+
         self.addPage()
         self.__checkActionButtons()
-        
+
         self.__centerSplitter.setSizes([900, 150])
-        
+
         QTimer.singleShot(50, self.__lookForNewDocumentation)
-    
+
     def __addNavigationButton(self, iconName, toolTip):
         """
         Private method to create and add a navigation button.
-        
+
         @param iconName name of the icon
         @type str
         @param toolTip tooltip to be shown
@@ -346,100 +361,85 @@
         button.setCheckable(True)
         self.__buttonGroup.addButton(button)
         self.__buttonLayout.addWidget(button)
-        
+
         return button
-    
+
     def __populateNavigationStack(self):
         """
         Private method to populate the stack of navigation widgets.
         """
         # Open Pages
         self.__openPagesList = OpenPagesWidget(self.__helpStack, self)
-        self.__openPagesList.currentPageChanged.connect(
-            self.__currentPageChanged)
+        self.__openPagesList.currentPageChanged.connect(self.__currentPageChanged)
         self.__helpNavigationStack.addWidget(self.__openPagesList)
-        
+
         # QtHelp TOC widget
-        self.__helpTocWidget = HelpTocWidget(
-            self.__helpEngine, internal=True)
+        self.__helpTocWidget = HelpTocWidget(self.__helpEngine, internal=True)
         self.__helpTocWidget.escapePressed.connect(self.__activateCurrentPage)
         self.__helpTocWidget.openUrl.connect(self.openUrl)
         self.__helpTocWidget.newTab.connect(self.openUrlNewPage)
-        self.__helpTocWidget.newBackgroundTab.connect(
-            self.openUrlNewBackgroundPage)
+        self.__helpTocWidget.newBackgroundTab.connect(self.openUrlNewBackgroundPage)
         self.__helpNavigationStack.addWidget(self.__helpTocWidget)
-        
+
         # QtHelp Index widget
-        self.__helpIndexWidget = HelpIndexWidget(
-            self.__helpEngine, internal=True)
-        self.__helpIndexWidget.escapePressed.connect(
-            self.__activateCurrentPage)
+        self.__helpIndexWidget = HelpIndexWidget(self.__helpEngine, internal=True)
+        self.__helpIndexWidget.escapePressed.connect(self.__activateCurrentPage)
         self.__helpIndexWidget.openUrl.connect(self.openUrl)
         self.__helpIndexWidget.newTab.connect(self.openUrlNewPage)
-        self.__helpIndexWidget.newBackgroundTab.connect(
-            self.openUrlNewBackgroundPage)
+        self.__helpIndexWidget.newBackgroundTab.connect(self.openUrlNewBackgroundPage)
         self.__helpNavigationStack.addWidget(self.__helpIndexWidget)
-        
+
         # QtHelp Search widget
         self.__indexing = False
         self.__indexingProgress = None
         self.__helpSearchEngine = self.__helpEngine.searchEngine()
-        self.__helpSearchEngine.indexingStarted.connect(
-            self.__indexingStarted)
-        self.__helpSearchEngine.indexingFinished.connect(
-            self.__indexingFinished)
-        
+        self.__helpSearchEngine.indexingStarted.connect(self.__indexingStarted)
+        self.__helpSearchEngine.indexingFinished.connect(self.__indexingFinished)
+
         self.__helpSearchWidget = HelpSearchWidget(
-            self.__helpSearchEngine, internal=True)
-        self.__helpSearchWidget.escapePressed.connect(
-            self.__activateCurrentPage)
+            self.__helpSearchEngine, internal=True
+        )
+        self.__helpSearchWidget.escapePressed.connect(self.__activateCurrentPage)
         self.__helpSearchWidget.openUrl.connect(self.openUrl)
         self.__helpSearchWidget.newTab.connect(self.openUrlNewPage)
-        self.__helpSearchWidget.newBackgroundTab.connect(
-            self.openUrlNewBackgroundPage)
+        self.__helpSearchWidget.newBackgroundTab.connect(self.openUrlNewBackgroundPage)
         self.__helpNavigationStack.addWidget(self.__helpSearchWidget)
-        
+
         # Bookmarks widget
         self.__bookmarksList = HelpBookmarksWidget(self)
         self.__bookmarksList.escapePressed.connect(self.__activateCurrentPage)
         self.__bookmarksList.openUrl.connect(self.openUrl)
         self.__bookmarksList.newTab.connect(self.openUrlNewPage)
-        self.__bookmarksList.newBackgroundTab.connect(
-            self.openUrlNewBackgroundPage)
+        self.__bookmarksList.newBackgroundTab.connect(self.openUrlNewBackgroundPage)
         self.__helpNavigationStack.addWidget(self.__bookmarksList)
-    
+
     @pyqtSlot(QAbstractButton)
     def __selectNavigationWidget(self, button):
         """
         Private slot to select the navigation widget.
-        
+
         @param button reference to the clicked button
         @type QAbstractButton
         """
         if button == self.__openPagesButton:
-            self.__helpNavigationStack.setCurrentWidget(
-                self.__openPagesList)
+            self.__helpNavigationStack.setCurrentWidget(self.__openPagesList)
         elif button == self.__helpTocButton:
-            self.__helpNavigationStack.setCurrentWidget(
-                self.__helpTocWidget)
+            self.__helpNavigationStack.setCurrentWidget(self.__helpTocWidget)
         elif button == self.__helpIndexButton:
-            self.__helpNavigationStack.setCurrentWidget(
-                self.__helpIndexWidget)
+            self.__helpNavigationStack.setCurrentWidget(self.__helpIndexWidget)
         elif button == self.__helpSearchButton:
-            self.__helpNavigationStack.setCurrentWidget(
-                self.__helpSearchWidget)
+            self.__helpNavigationStack.setCurrentWidget(self.__helpSearchWidget)
         elif button == self.__bookmarksButton:
-            self.__helpNavigationStack.setCurrentWidget(
-                self.__bookmarksList)
-    
+            self.__helpNavigationStack.setCurrentWidget(self.__bookmarksList)
+
     def __populateHelpSelector(self):
         """
         Private method to populate the help selection combo box.
         """
         self.__helpSelector.clear()
-        
+
         self.__helpSelector.addItem("", "")
-        
+
         for key, topic in [
             ("EricDocDir", self.tr("eric API Documentation")),
             ("PythonDocDir", self.tr("Python 3 Documentation")),
@@ -453,7 +453,7 @@
             urlStr = Preferences.getHelp(key)
             if urlStr:
                 self.__helpSelector.addItem(topic, urlStr)
-    
+
     @pyqtSlot()
     def __helpTopicSelected(self):
         """
@@ -465,11 +465,11 @@
             self.openUrl(url)
         else:
             self.openUrl(QUrl("about:blank"))
-    
+
     def activate(self, searchWord=None, url=None):
         """
         Public method to activate the widget and search for a given word.
-        
+
         @param searchWord word to search for (defaults to None)
         @type str (optional)
         @param url URL to show in a new page
@@ -485,19 +485,19 @@
             cv = self.currentViewer()
             if cv:
                 cv.setFocus(Qt.FocusReason.OtherFocusReason)
-            
+
             if searchWord:
                 self.searchQtHelp(searchWord)
-    
+
     def shutdown(self):
         """
         Public method to perform shut down actions.
         """
         self.__helpSearchEngine.cancelIndexing()
         self.__helpSearchEngine.cancelSearching()
-        
+
         self.__helpInstaller.stop()
-    
+
     @pyqtSlot()
     def __openFile(self):
         """
@@ -507,11 +507,11 @@
             self,
             self.tr("Open HTML File"),
             "",
-            self.tr("HTML Files (*.htm *.html);;All Files (*)")
+            self.tr("HTML Files (*.htm *.html);;All Files (*)"),
         )
         if htmlFile:
             self.currentViewer().setLink(QUrl.fromLocalFile(htmlFile))
-    
+
     @pyqtSlot()
     def __addNewPage(self):
         """
@@ -520,11 +520,11 @@
         urlStr = self.__helpSelector.currentData()
         url = QUrl(urlStr) if bool(urlStr) else None
         self.addPage(url=url)
-    
+
     def addPage(self, url=None, background=False):
         """
         Public method to add a new help page with the given URL.
-        
+
         @param url requested URL (defaults to QUrl("about:blank"))
         @type QUrl (optional)
         @param background flag indicating to open the page in the background
@@ -535,30 +535,29 @@
         """
         if url is None:
             url = QUrl("about:blank")
-        
+
         viewer, viewerType = self.__newViewer()
         viewer.setLink(url)
-        
+
         cv = self.currentViewer()
         if background and bool(cv):
             index = self.__helpStack.indexOf(cv) + 1
             self.__helpStack.insertWidget(index, viewer)
-            self.__openPagesList.insertPage(
-                index, viewer, background=background)
+            self.__openPagesList.insertPage(index, viewer, background=background)
             cv.setFocus(Qt.FocusReason.OtherFocusReason)
         else:
             self.__helpStack.addWidget(viewer)
             self.__openPagesList.addPage(viewer, background=background)
             viewer.setFocus(Qt.FocusReason.OtherFocusReason)
             self.__searchWidget.attachTextEdit(viewer, editType=viewerType)
-        
+
         return viewer
-    
+
     @pyqtSlot(QUrl)
     def openUrl(self, url):
         """
         Public slot to load a URL in the current page.
-        
+
         @param url URL to be opened
         @type QUrl
         """
@@ -566,48 +565,48 @@
         if cv:
             cv.setLink(url)
             cv.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     @pyqtSlot(QUrl)
     def openUrlNewPage(self, url):
         """
         Public slot to load a URL in a new page.
-        
+
         @param url URL to be opened
         @type QUrl
         """
         self.addPage(url=url)
-    
+
     @pyqtSlot(QUrl)
     def openUrlNewBackgroundPage(self, url):
         """
         Public slot to load a URL in a new background page.
-        
+
         @param url URL to be opened
         @type QUrl
         """
         self.addPage(url=url, background=True)
-    
+
     @pyqtSlot()
     def closeCurrentPage(self):
         """
         Public slot to close the current page.
         """
         self.__openPagesList.closeCurrentPage()
-    
+
     @pyqtSlot()
     def closeOtherPages(self):
         """
         Public slot to close all other pages.
         """
         self.__openPagesList.closeOtherPages()
-    
+
     @pyqtSlot()
     def closeAllPages(self):
         """
         Public slot to close all pages.
         """
         self.__openPagesList.closeAllPages()
-    
+
     @pyqtSlot()
     def __activateCurrentPage(self):
         """
@@ -616,71 +615,71 @@
         cv = self.currentViewer()
         if cv:
             cv.setFocus()
-    
+
     def __newViewer(self):
         """
         Private method to create a new help viewer.
-        
+
         @return tuple containing the reference to the created help viewer
             object and its type
         @rtype tuple of (HelpViewerImpl, EricTextEditType)
         """
         if WEBENGINE_AVAILABLE:
             from .HelpViewerImplQWE import HelpViewerImplQWE
+
             viewer = HelpViewerImplQWE(self.__helpEngine, self)
             viewerType = EricTextEditType.QWEBENGINEVIEW
         else:
             from .HelpViewerImplQTB import HelpViewerImplQTB
+
             viewer = HelpViewerImplQTB(self.__helpEngine, self)
             viewerType = EricTextEditType.QTEXTBROWSER
-        
+
         viewer.zoomChanged.connect(self.__checkActionButtons)
-        
+
         return viewer, viewerType
-    
+
     def currentViewer(self):
         """
         Public method to get the active viewer.
-        
+
         @return reference to the active help viewer
         @rtype HelpViewerImpl
         """
         return self.__helpStack.currentWidget()
-    
+
     def bookmarkPage(self, title, url):
         """
         Public method to bookmark a page with the given data.
-        
+
         @param title title of the page
         @type str
         @param url URL of the page
         @type QUrl
         """
         self.__bookmarksList.addBookmark(title, url)
-    
+
     #######################################################################
     ## QtHelp related code below
     #######################################################################
-    
+
     def __initHelpEngine(self):
         """
         Private method to initialize the QtHelp related stuff.
         """
-        self.__helpEngine = QHelpEngine(
-            self.__getQtHelpCollectionFileName(),
-            self)
+        self.__helpEngine = QHelpEngine(self.__getQtHelpCollectionFileName(), self)
         self.__helpEngine.setReadOnly(False)
         self.__helpEngine.setUsesFilterEngine(True)
-        
+
         self.__helpEngine.warning.connect(self.__warning)
-        
+
         self.__helpEngine.setupData()
         self.__removeOldDocumentation()
-    
+
     def __getQtHelpCollectionFileName(self):
         """
         Private method to determine the name of the QtHelp collection file.
-        
+
         @return path of the QtHelp collection file
         @rtype str
         """
@@ -688,19 +687,17 @@
         if not os.path.exists(qthelpDir):
             os.makedirs(qthelpDir)
         return os.path.join(qthelpDir, "eric7help.qhc")
-    
+
     @pyqtSlot(str)
     def __warning(self, msg):
         """
         Private slot handling warnings of the help engine.
-        
+
         @param msg message sent by the help  engine
         @type str
         """
-        EricMessageBox.warning(
-            self,
-            self.tr("Help Engine"), msg)
-    
+        EricMessageBox.warning(self, self.tr("Help Engine"), msg)
+
     @pyqtSlot()
     def __removeOldDocumentation(self):
         """
@@ -710,7 +707,7 @@
             docFile = self.__helpEngine.documentationFileName(namespace)
             if not os.path.exists(docFile):
                 self.__helpEngine.unregisterDocumentation(namespace)
-    
+
     @pyqtSlot()
     def __lookForNewDocumentation(self):
         """
@@ -718,87 +715,83 @@
         help database.
         """
         from WebBrowser.QtHelp.HelpDocsInstaller import HelpDocsInstaller
-        self.__helpInstaller = HelpDocsInstaller(
-            self.__helpEngine.collectionFile())
-        self.__helpInstaller.errorMessage.connect(
-            self.__showInstallationError)
+
+        self.__helpInstaller = HelpDocsInstaller(self.__helpEngine.collectionFile())
+        self.__helpInstaller.errorMessage.connect(self.__showInstallationError)
         self.__helpInstaller.docsInstalled.connect(self.__docsInstalled)
-        
-        self.__ui.statusBar().showMessage(
-            self.tr("Looking for Documentation..."))
+
+        self.__ui.statusBar().showMessage(self.tr("Looking for Documentation..."))
         self.__helpInstaller.installDocs()
-    
+
     @pyqtSlot(str)
     def __showInstallationError(self, message):
         """
         Private slot to show installation errors.
-        
+
         @param message message to be shown
         @type str
         """
-        EricMessageBox.warning(
-            self,
-            self.tr("eric Help Viewer"),
-            message)
-    
+        EricMessageBox.warning(self, self.tr("eric Help Viewer"), message)
+
     @pyqtSlot(bool)
     def __docsInstalled(self, installed):
         """
         Private slot handling the end of documentation installation.
-        
+
         @param installed flag indicating that documents were installed
         @type bool
         """
         self.__ui.statusBar().clearMessage()
         self.__helpEngine.setupData()
-    
+
     #######################################################################
     ## Actions Menu related methods
     #######################################################################
-    
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
         """
         self.__actionsMenu = QMenu()
         self.__actionsMenu.setToolTipsVisible(True)
-        
+
         self.__actionsMenu.addAction(
-            self.tr("Manage QtHelp Documents"),
-            self.__manageQtHelpDocuments)
+            self.tr("Manage QtHelp Documents"), self.__manageQtHelpDocuments
+        )
         self.__actionsMenu.addAction(
             self.tr("Reindex Documentation"),
-            self.__helpSearchEngine.reindexDocumentation)
+            self.__helpSearchEngine.reindexDocumentation,
+        )
         self.__actionsMenu.addSeparator()
         self.__actionsMenu.addAction(
-            self.tr("Configure Help Documentation"),
-            self.__configureHelpDocumentation)
-        
+            self.tr("Configure Help Documentation"), self.__configureHelpDocumentation
+        )
+
         self.__actionsButton.setMenu(self.__actionsMenu)
-    
+
     @pyqtSlot()
     def __manageQtHelpDocuments(self):
         """
         Private slot to manage the QtHelp documentation database.
         """
         from WebBrowser.QtHelp.QtHelpDocumentationConfigurationDialog import (
-            QtHelpDocumentationConfigurationDialog
+            QtHelpDocumentationConfigurationDialog,
         )
-        dlg = QtHelpDocumentationConfigurationDialog(
-            self.__helpEngine, self)
+
+        dlg = QtHelpDocumentationConfigurationDialog(self.__helpEngine, self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __configureHelpDocumentation(self):
         """
         Private slot to open the Help Documentation configuration page.
         """
         self.__ui.showPreferences("helpDocumentationPage")
-    
+
     #######################################################################
     ## Navigation related methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def __backward(self):
         """
@@ -807,7 +800,7 @@
         cv = self.currentViewer()
         if cv:
             cv.backward()
-    
+
     @pyqtSlot()
     def __forward(self):
         """
@@ -816,7 +809,7 @@
         cv = self.currentViewer()
         if cv:
             cv.forward()
-    
+
     @pyqtSlot()
     def __reload(self):
         """
@@ -825,7 +818,7 @@
         cv = self.currentViewer()
         if cv:
             cv.reload()
-    
+
     def __showBackMenu(self):
         """
         Private slot showing the backward navigation menu.
@@ -833,19 +826,19 @@
         cv = self.currentViewer()
         if cv:
             self.__backMenu.clear()
-            backwardHistoryCount = min(cv.backwardHistoryCount(),
-                                       HelpViewerWidget.MaxHistoryItems)
-            
+            backwardHistoryCount = min(
+                cv.backwardHistoryCount(), HelpViewerWidget.MaxHistoryItems
+            )
+
             for index in range(1, backwardHistoryCount + 1):
                 act = QAction(self)
                 act.setData(-index)
                 act.setText(cv.historyTitle(-index))
                 self.__backMenu.addAction(act)
-            
+
             self.__backMenu.addSeparator()
-            self.__backMenu.addAction(self.tr("Clear History"),
-                                      self.__clearHistory)
-    
+            self.__backMenu.addAction(self.tr("Clear History"), self.__clearHistory)
+
     def __showForwardMenu(self):
         """
         Private slot showing the forward navigation menu.
@@ -853,23 +846,23 @@
         cv = self.currentViewer()
         if cv:
             self.__forwardMenu.clear()
-            forwardHistoryCount = min(cv.forwardHistoryCount(),
-                                      HelpViewerWidget.MaxHistoryItems)
-        
+            forwardHistoryCount = min(
+                cv.forwardHistoryCount(), HelpViewerWidget.MaxHistoryItems
+            )
+
             for index in range(1, forwardHistoryCount + 1):
                 act = QAction(self)
                 act.setData(index)
                 act.setText(cv.historyTitle(index))
                 self.__forwardMenu.addAction(act)
-            
+
             self.__forwardMenu.addSeparator()
-            self.__forwardMenu.addAction(self.tr("Clear History"),
-                                         self.__clearHistory)
-    
+            self.__forwardMenu.addAction(self.tr("Clear History"), self.__clearHistory)
+
     def __navigationMenuActionTriggered(self, act):
         """
         Private slot to go to the selected page.
-        
+
         @param act reference to the action selected in the navigation menu
         @type QAction
         """
@@ -878,7 +871,7 @@
             index = act.data()
             if index is not None:
                 cv.gotoHistory(index)
-    
+
     def __clearHistory(self):
         """
         Private slot to clear the history of the current viewer.
@@ -887,11 +880,11 @@
         if cv:
             cv.clearHistory()
             self.__checkActionButtons()
-    
+
     #######################################################################
     ## Page navigation related methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def __checkActionButtons(self):
         """
@@ -908,7 +901,7 @@
             self.__forwardButton.setEnabled(False)
             self.__zoomInButton.setEnabled(False)
             self.__zoomOutButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def __currentPageChanged(self):
         """
@@ -921,16 +914,16 @@
                 cv,
                 editType=(
                     EricTextEditType.QWEBENGINEVIEW
-                    if WEBENGINE_AVAILABLE else
-                    EricTextEditType.QTEXTBROWSER
-                )
+                    if WEBENGINE_AVAILABLE
+                    else EricTextEditType.QTEXTBROWSER
+                ),
             )
             cv.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     #######################################################################
     ## Zoom related methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def __zoomIn(self):
         """
@@ -939,7 +932,7 @@
         cv = self.currentViewer()
         if cv:
             cv.scaleUp()
-    
+
     @pyqtSlot()
     def __zoomOut(self):
         """
@@ -948,7 +941,7 @@
         cv = self.currentViewer()
         if cv:
             cv.scaleDown()
-    
+
     @pyqtSlot()
     def __zoomReset(self):
         """
@@ -957,34 +950,34 @@
         cv = self.currentViewer()
         if cv:
             cv.resetScale()
-    
+
     #######################################################################
     ## QtHelp Search related methods below
     #######################################################################
-    
+
     def __initIndexingProgress(self):
         """
         Private method to initialize the help documents indexing progress
         widget.
-        
+
         @return reference to the generated widget
         @rtype QWidget
         """
         progressWidget = QWidget(self)
         layout = QHBoxLayout(progressWidget)
         layout.setContentsMargins(0, 0, 0, 0)
-        
+
         label = QLabel(self.tr("Updating search index"))
         layout.addWidget(label)
-        
+
         progressBar = QProgressBar()
         progressBar.setRange(0, 0)
         progressBar.setTextVisible(False)
         progressBar.setFixedHeight(16)
         layout.addWidget(progressBar)
-        
+
         return progressWidget
-    
+
     @pyqtSlot()
     def __indexingStarted(self):
         """
@@ -992,7 +985,7 @@
         """
         self.__indexing = True
         self.__indexingProgressWidget.show()
-    
+
     @pyqtSlot()
     def __indexingFinished(self):
         """
@@ -1000,61 +993,60 @@
         """
         self.__indexingProgressWidget.hide()
         self.__indexing = False
-    
+
     @pyqtSlot(str)
     def searchQtHelp(self, searchExpression):
         """
         Public slot to search for a given search expression.
-        
+
         @param searchExpression expression to search for
         @type str
         """
         if searchExpression:
             if self.__indexing:
                 # Try again a second later
-                QTimer.singleShot(
-                    1000,
-                    lambda: self.searchQtHelp(searchExpression)
-                )
+                QTimer.singleShot(1000, lambda: self.searchQtHelp(searchExpression))
             else:
                 self.__helpSearchButton.setChecked(True)
                 self.__helpSearchEngine.search(searchExpression)
-    
+
     #######################################################################
     ## QtHelp filter related methods below
     #######################################################################
-    
+
     def __initFilterWidget(self):
         """
         Private method to initialize the filter selection widget.
-        
+
         @return reference to the generated widget
         @rtype QWidget
         """
         filterWidget = QWidget()
         layout = QHBoxLayout(filterWidget)
         layout.setContentsMargins(0, 0, 0, 0)
-        
+
         label = QLabel(self.tr("Filtered by: "))
         layout.addWidget(label)
-        
+
         self.__helpFilterCombo = QComboBox()
-        comboWidth = QFontMetrics(QFont()).horizontalAdvance(
-            "ComboBoxWithEnoughWidth")
+        comboWidth = QFontMetrics(QFont()).horizontalAdvance("ComboBoxWithEnoughWidth")
         self.__helpFilterCombo.setMinimumWidth(comboWidth)
         layout.addWidget(self.__helpFilterCombo)
-        
+
         self.__helpEngine.setupFinished.connect(
-            self.__setupFilterCombo, Qt.ConnectionType.QueuedConnection)
+            self.__setupFilterCombo, Qt.ConnectionType.QueuedConnection
+        )
         self.__helpFilterCombo.currentIndexChanged.connect(
-            self.__filterQtHelpDocumentation)
+            self.__filterQtHelpDocumentation
+        )
         self.__helpEngine.filterEngine().filterActivated.connect(
-            self.__currentFilterChanged)
-        
+            self.__currentFilterChanged
+        )
+
         self.__setupFilterCombo()
-        
+
         return filterWidget
-    
+
     @pyqtSlot()
     def __setupFilterCombo(self):
         """
@@ -1066,7 +1058,7 @@
         if not activeFilter:
             activeFilter = self.tr("Unfiltered")
         allFilters = self.__helpEngine.filterEngine().filters()
-        
+
         blocked = self.__helpFilterCombo.blockSignals(True)
         self.__helpFilterCombo.clear()
         self.__helpFilterCombo.addItem(self.tr("Unfiltered"))
@@ -1075,26 +1067,26 @@
             for helpFilter in sorted(allFilters):
                 self.__helpFilterCombo.addItem(helpFilter, helpFilter)
         self.__helpFilterCombo.blockSignals(blocked)
-        
+
         self.__helpFilterCombo.setCurrentText(activeFilter)
-    
+
     @pyqtSlot(int)
     def __filterQtHelpDocumentation(self, index):
         """
         Private slot to filter the QtHelp documentation.
-        
+
         @param index index of the selected QtHelp documentation filter
         @type int
         """
         if self.__helpEngine:
             helpFilter = self.__helpFilterCombo.itemData(index)
             self.__helpEngine.filterEngine().setActiveFilter(helpFilter)
-    
+
     @pyqtSlot(str)
     def __currentFilterChanged(self, filter_):
         """
         Private slot handling a change of the active QtHelp filter.
-        
+
         @param filter_ filter name
         @type str
         """
@@ -1102,191 +1094,215 @@
         if index < 0:
             index = 0
         self.__helpFilterCombo.setCurrentIndex(index)
-    
+
     #######################################################################
     ## QWebEngine related code below
     #######################################################################
-    
+
     def __initQWebEngine(self):
         """
         Private method to initialize global QWebEngine related objects.
         """
         self.__webProfile = QWebEngineProfile.defaultProfile()
         self.__webProfile.setHttpCacheType(
-            QWebEngineProfile.HttpCacheType.MemoryHttpCache)
+            QWebEngineProfile.HttpCacheType.MemoryHttpCache
+        )
         self.__webProfile.setHttpCacheMaximumSize(0)
-        
+
         self.__initQWebEngineSettings()
-        
+
         from WebBrowser.Network.QtHelpSchemeHandler import QtHelpSchemeHandler
+
         self.__qtHelpSchemeHandler = QtHelpSchemeHandler(self.__helpEngine)
         self.__webProfile.installUrlSchemeHandler(
-            QByteArray(b"qthelp"), self.__qtHelpSchemeHandler)
-    
+            QByteArray(b"qthelp"), self.__qtHelpSchemeHandler
+        )
+
     def webProfile(self):
         """
         Public method to get a reference to the global web profile object.
-        
+
         @return reference to the global web profile object
         @rtype QWebEngineProfile
         """
         return self.__webProfile
-    
+
     def webSettings(self):
         """
         Public method to get the web settings of the current profile.
-        
+
         @return web settings of the current profile
         @rtype QWebEngineSettings
         """
         return self.webProfile().settings()
-    
+
     def __initQWebEngineSettings(self):
         """
         Private method to set the global web settings.
         """
         settings = self.webSettings()
-        
+
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.StandardFont,
-            Preferences.getWebBrowser("StandardFontFamily"))
+            Preferences.getWebBrowser("StandardFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.FixedFont,
-            Preferences.getWebBrowser("FixedFontFamily"))
+            Preferences.getWebBrowser("FixedFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.SerifFont,
-            Preferences.getWebBrowser("SerifFontFamily"))
+            Preferences.getWebBrowser("SerifFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.SansSerifFont,
-            Preferences.getWebBrowser("SansSerifFontFamily"))
+            Preferences.getWebBrowser("SansSerifFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.CursiveFont,
-            Preferences.getWebBrowser("CursiveFontFamily"))
+            Preferences.getWebBrowser("CursiveFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.FantasyFont,
-            Preferences.getWebBrowser("FantasyFontFamily"))
-        
+            Preferences.getWebBrowser("FantasyFontFamily"),
+        )
+
         settings.setFontSize(
             QWebEngineSettings.FontSize.DefaultFontSize,
-            Preferences.getWebBrowser("DefaultFontSize"))
+            Preferences.getWebBrowser("DefaultFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.DefaultFixedFontSize,
-            Preferences.getWebBrowser("DefaultFixedFontSize"))
+            Preferences.getWebBrowser("DefaultFixedFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.MinimumFontSize,
-            Preferences.getWebBrowser("MinimumFontSize"))
+            Preferences.getWebBrowser("MinimumFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.MinimumLogicalFontSize,
-            Preferences.getWebBrowser("MinimumLogicalFontSize"))
-        
+            Preferences.getWebBrowser("MinimumLogicalFontSize"),
+        )
+
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AutoLoadImages,
-            Preferences.getWebBrowser("AutoLoadImages"))
-        settings.setAttribute(
-            QWebEngineSettings.WebAttribute.JavascriptEnabled,
-            True)
+            Preferences.getWebBrowser("AutoLoadImages"),
+        )
+        settings.setAttribute(QWebEngineSettings.WebAttribute.JavascriptEnabled, True)
         # JavaScript is needed for the web browser functionality
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows,
-            Preferences.getWebBrowser("JavaScriptCanOpenWindows"))
+            Preferences.getWebBrowser("JavaScriptCanOpenWindows"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard,
-            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"))
-        settings.setAttribute(
-            QWebEngineSettings.WebAttribute.PluginsEnabled,
-            False)
-        
+            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"),
+        )
+        settings.setAttribute(QWebEngineSettings.WebAttribute.PluginsEnabled, False)
+
         settings.setAttribute(
-            QWebEngineSettings.WebAttribute.LocalStorageEnabled,
-            False)
+            QWebEngineSettings.WebAttribute.LocalStorageEnabled, False
+        )
         settings.setDefaultTextEncoding(
-            Preferences.getWebBrowser("DefaultTextEncoding"))
-        
+            Preferences.getWebBrowser("DefaultTextEncoding")
+        )
+
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.SpatialNavigationEnabled,
-            Preferences.getWebBrowser("SpatialNavigationEnabled"))
+            Preferences.getWebBrowser("SpatialNavigationEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain,
-            Preferences.getWebBrowser("LinksIncludedInFocusChain"))
+            Preferences.getWebBrowser("LinksIncludedInFocusChain"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls,
-            Preferences.getWebBrowser("LocalContentCanAccessRemoteUrls"))
+            Preferences.getWebBrowser("LocalContentCanAccessRemoteUrls"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls,
-            Preferences.getWebBrowser("LocalContentCanAccessFileUrls"))
+            Preferences.getWebBrowser("LocalContentCanAccessFileUrls"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.XSSAuditingEnabled,
-            Preferences.getWebBrowser("XSSAuditingEnabled"))
+            Preferences.getWebBrowser("XSSAuditingEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled,
-            Preferences.getWebBrowser("ScrollAnimatorEnabled"))
+            Preferences.getWebBrowser("ScrollAnimatorEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ErrorPageEnabled,
-            Preferences.getWebBrowser("ErrorPageEnabled"))
+            Preferences.getWebBrowser("ErrorPageEnabled"),
+        )
         settings.setAttribute(
-            QWebEngineSettings.WebAttribute.FullScreenSupportEnabled,
-            False)
+            QWebEngineSettings.WebAttribute.FullScreenSupportEnabled, False
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ScreenCaptureEnabled,
-            Preferences.getWebBrowser("ScreenCaptureEnabled"))
+            Preferences.getWebBrowser("ScreenCaptureEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.WebGLEnabled,
-            Preferences.getWebBrowser("WebGLEnabled"))
+            Preferences.getWebBrowser("WebGLEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled,
-            Preferences.getWebBrowser("FocusOnNavigationEnabled"))
+            Preferences.getWebBrowser("FocusOnNavigationEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PrintElementBackgrounds,
-            Preferences.getWebBrowser("PrintElementBackgrounds"))
+            Preferences.getWebBrowser("PrintElementBackgrounds"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AllowRunningInsecureContent,
-            Preferences.getWebBrowser("AllowRunningInsecureContent"))
+            Preferences.getWebBrowser("AllowRunningInsecureContent"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AllowGeolocationOnInsecureOrigins,
-            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins"))
+            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins"),
+        )
         settings.setAttribute(
-            QWebEngineSettings.WebAttribute
-            .AllowWindowActivationFromJavaScript,
-            Preferences.getWebBrowser(
-                "AllowWindowActivationFromJavaScript"))
+            QWebEngineSettings.WebAttribute.AllowWindowActivationFromJavaScript,
+            Preferences.getWebBrowser("AllowWindowActivationFromJavaScript"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ShowScrollBars,
-            Preferences.getWebBrowser("ShowScrollBars"))
+            Preferences.getWebBrowser("ShowScrollBars"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture,
-            Preferences.getWebBrowser(
-                "PlaybackRequiresUserGesture"))
+            Preferences.getWebBrowser("PlaybackRequiresUserGesture"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanPaste,
-            Preferences.getWebBrowser(
-                "JavaScriptCanPaste"))
+            Preferences.getWebBrowser("JavaScriptCanPaste"),
+        )
         settings.setAttribute(
-            QWebEngineSettings.WebAttribute.WebRTCPublicInterfacesOnly,
-            False)
-        settings.setAttribute(
-            QWebEngineSettings.WebAttribute.DnsPrefetchEnabled,
-            False)
+            QWebEngineSettings.WebAttribute.WebRTCPublicInterfacesOnly, False
+        )
+        settings.setAttribute(QWebEngineSettings.WebAttribute.DnsPrefetchEnabled, False)
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PdfViewerEnabled,
-            Preferences.getWebBrowser(
-                "PdfViewerEnabled"))
-    
+            Preferences.getWebBrowser("PdfViewerEnabled"),
+        )
+
     #######################################################################
     ## Search widget related methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def __searchWidgetClosed(self):
         """
         Private slot to handle the closing of the search widget.
         """
         self.__searchButton.setChecked(False)
-    
+
     @pyqtSlot(bool)
     def showHideSearch(self, visible):
         """
         Public slot to show or hide the search widget.
-        
+
         @param visible flag indicating to show or hide the search widget
         @type bool
         """
@@ -1295,39 +1311,39 @@
             self.__searchWidget.activate()
         else:
             self.__searchWidget.deactivate()
-    
+
     @pyqtSlot()
     def searchPrev(self):
         """
         Public slot to find the previous occurrence of the current search term.
         """
         self.__searchWidget.findPrev()
-    
+
     @pyqtSlot()
     def searchNext(self):
         """
         Public slot to find the next occurrence of the current search term.
         """
         self.__searchWidget.findNext()
-    
+
     #######################################################################
     ## Utility methods below
     #######################################################################
-    
+
     def openPagesCount(self):
         """
         Public method to get the count of open pages.
-        
+
         @return count of open pages
         @rtype int
         """
         return self.__helpStack.count()
-    
+
     @classmethod
     def emptyDocument(cls):
         """
         Class method to get the HTML code for an empty page.
-        
+
         @return HTML code for an empty page.
         @rtype str
         """
--- a/src/eric7/HelpViewer/OpenPagesWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HelpViewer/OpenPagesWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,16 +17,17 @@
 class OpenPagesWidget(QListWidget):
     """
     Class implementing a widget showing the list of open pages.
-    
+
     @signal currentPageChanged(index) emitted to signal a change of the current
         page index
     """
+
     currentPageChanged = pyqtSignal(int)
-    
+
     def __init__(self, stack, parent=None):
         """
         Constructor
-        
+
         @param stack reference to the stack widget containing the open
             help pages
         @type QStackedWidget
@@ -35,28 +36,24 @@
         """
         super().__init__(parent)
         self.setObjectName("OpenPagesWidget")
-        
+
         self.__helpViewer = parent
-        
+
         self.setAlternatingRowColors(True)
-        self.setSelectionMode(
-            QAbstractItemView.SelectionMode.SingleSelection)
-        self.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.currentRowChanged.connect(
-            self.__currentRowChanged)
-        self.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+        self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
+        self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.currentRowChanged.connect(self.__currentRowChanged)
+        self.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.__stack = stack
         self.__stack.currentChanged.connect(self.__currentPageChanged)
-        
+
         self.__initContextMenu()
-        
+
         self.__defaultFont = self.font()
         self.__boldFont = self.font()
         self.__boldFont.setBold(True)
-    
+
     def __initContextMenu(self):
         """
         Private method to initialize the context menu.
@@ -64,24 +61,26 @@
         self.__menu = QMenu(self)
         self.__menu.addAction(
             UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'), self.__contextMenuClose)
+            self.tr("Close"),
+            self.__contextMenuClose,
+        )
         self.closeOthersMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
             self.tr("Close Others"),
-            self.__contextMenuCloseOthers)
-        self.__menu.addAction(
-            self.tr('Close All'), self.__contextMenuCloseAll)
+            self.__contextMenuCloseOthers,
+        )
+        self.__menu.addAction(self.tr("Close All"), self.__contextMenuCloseAll)
         self.__menu.addSeparator()
         self.__copyUrlAct = self.__menu.addAction(
-            self.tr("Copy URL to Clipboard"),
-            self.__contextMenuCopyUrlToClipboard)
-    
+            self.tr("Copy URL to Clipboard"), self.__contextMenuCopyUrlToClipboard
+        )
+
     @pyqtSlot(QPoint)
     def __showContextMenu(self, point):
         """
         Private slot to handle the customContextMenuRequested signal of
         the viewlist.
-        
+
         @param point position to open the menu at
         @type QPoint
         """
@@ -89,36 +88,34 @@
         self.__copyUrlAct.setEnabled(bool(itm) and itm.text() != "about:blank")
         self.closeOthersMenuAct.setEnabled(self.count() > 1)
         self.__menu.popup(self.mapToGlobal(point))
-    
+
     @pyqtSlot(int)
     def __currentPageChanged(self, index):
         """
         Private slot to handle a change of the shown page.
-        
+
         @param index index of the current page
         @type int
         """
         for row in range(self.count()):
             itm = self.item(row)
-            itm.setFont(
-                self.__boldFont if row == index else self.__defaultFont
-            )
-    
+            itm.setFont(self.__boldFont if row == index else self.__defaultFont)
+
     @pyqtSlot(int)
     def __currentRowChanged(self, row):
         """
         Private slot handling a change of the current row.
-        
+
         @param row current row
         @type int
         """
         self.__stack.setCurrentIndex(row)
         self.currentPageChanged.emit(row)
-    
+
     def addPage(self, viewer, background=False):
         """
         Public method to add a viewer page to our list.
-        
+
         @param viewer reference to the viewer object
         @type HelpViewerImpl
         @param background flag indicating to not change the current page
@@ -126,19 +123,17 @@
         @type bool (optional)
         """
         self.addItem(viewer.pageTitle())
-        viewer.titleChanged.connect(
-            lambda: self.__viewerTitleChanged(viewer))
-        
+        viewer.titleChanged.connect(lambda: self.__viewerTitleChanged(viewer))
+
         if not background:
-            self.setCurrentRow(
-                self.count() - 1)
+            self.setCurrentRow(self.count() - 1)
         if self.count() == 1:
             self.__currentPageChanged(0)
-    
+
     def insertPage(self, index, viewer, background=False):
         """
         Public method to insert a viewer page into our list.
-        
+
         @param index index to insert at
         @type int
         @param viewer reference to the viewer object
@@ -149,18 +144,17 @@
         """
         currentRow = self.currentRow()
         self.insertItem(index, viewer.pageTitle())
-        viewer.titleChanged.connect(
-            lambda: self.__viewerTitleChanged(viewer))
-        
+        viewer.titleChanged.connect(lambda: self.__viewerTitleChanged(viewer))
+
         if not background:
             self.setCurrentRow(index)
         else:
             self.setCurrentRow(currentRow)
-    
+
     def __viewerTitleChanged(self, viewer):
         """
         Private method to handle the change of a viewer title.
-        
+
         @param viewer reference to the viewer that change title
         @type HelpViewerImpl
         """
@@ -168,32 +162,32 @@
         itm = self.item(index)
         itm.setText(viewer.pageTitle())
         self.currentPageChanged.emit(index)
-    
+
     #######################################################################
     ## Context menu action methods
     #######################################################################
-    
+
     @pyqtSlot()
     def __contextMenuClose(self):
         """
         Private slot to close a page via the context menu.
         """
         self.closeCurrentPage()
-    
+
     @pyqtSlot()
     def __contextMenuCloseOthers(self):
         """
         Private slot to close all other pages via the context menu.
         """
         self.closeOtherPages()
-    
+
     @pyqtSlot()
     def __contextMenuCloseAll(self):
         """
         Private slot to close all pages via the context menu.
         """
         self.closeAllPages()
-    
+
     @pyqtSlot()
     def __contextMenuCopyUrlToClipboard(self):
         """
@@ -204,31 +198,29 @@
         url = viewer.link()
         if url.isValid():
             urlStr = url.toString()
-            
+
             # copy the URL to both clipboard areas
-            QGuiApplication.clipboard().setText(
-                urlStr, QClipboard.Mode.Clipboard)
-            QGuiApplication.clipboard().setText(
-                urlStr, QClipboard.Mode.Selection)
-    
+            QGuiApplication.clipboard().setText(urlStr, QClipboard.Mode.Clipboard)
+            QGuiApplication.clipboard().setText(urlStr, QClipboard.Mode.Selection)
+
     def __removeViewer(self, row):
         """
         Private method to remove a viewer page.
-        
+
         @param row row associated with the viewer
         @type int
         """
         viewer = self.__stack.widget(row)
         self.__stack.removeWidget(viewer)
         viewer.deleteLater()
-        
+
         itm = self.takeItem(row)
         del itm
-    
+
     #######################################################################
     ## Slots for external access below
     #######################################################################
-    
+
     @pyqtSlot()
     def closeCurrentPage(self):
         """
@@ -236,10 +228,10 @@
         """
         row = self.currentRow()
         self.__removeViewer(row)
-        
+
         if self.count() == 0:
             self.__helpViewer.addPage()
-    
+
     @pyqtSlot()
     def closeOtherPages(self):
         """
@@ -249,7 +241,7 @@
         for row in range(self.count() - 1, -1, -1):
             if row != currentRow:
                 self.__removeViewer(row)
-    
+
     @pyqtSlot()
     def closeAllPages(self):
         """
--- a/src/eric7/HexEdit/HexEditChunks.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditChunks.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,6 +16,7 @@
     """
     Class implementing a container for the data chunks.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,7 +29,7 @@
 class HexEditChunks:
     """
     Class implementing the storage backend for the hex editor.
-    
+
     When HexEditWidget loads data, HexEditChunks access them using a QIODevice
     interface. When the app uses a QByteArray or Python bytearray interface,
     QBuffer is used to provide again a QIODevice like interface. No data will
@@ -42,14 +43,15 @@
     to that chunk, there is a second chunk, which keeps track of which bytes
     are changed and which are not.
     """
+
     BUFFER_SIZE = 0x10000
     CHUNK_SIZE = 0x1000
-    READ_CHUNK_MASK = 0xfffffffffffff000
-    
+    READ_CHUNK_MASK = 0xFFFFFFFFFFFFF000
+
     def __init__(self, ioDevice=None):
         """
         Constructor
-        
+
         @param ioDevice io device to get the data from
         @type QIODevice
         """
@@ -57,17 +59,17 @@
         self.__pos = 0
         self.__size = 0
         self.__chunks = []
-        
+
         if ioDevice is None:
             buf = QBuffer()
             self.setIODevice(buf)
         else:
             self.setIODevice(ioDevice)
-    
+
     def setIODevice(self, ioDevice):
         """
         Public method to set an io device to read the binary data from.
-        
+
         @param ioDevice io device to get the data from
         @type QIODevice
         @return flag indicating successful operation
@@ -83,16 +85,16 @@
             # fallback is an empty buffer
             self.__ioDevice = QBuffer()
             self.__size = 0
-        
+
         self.__chunks = []
         self.__pos = 0
-        
+
         return ok
-    
+
     def data(self, pos=0, maxSize=-1, highlighted=None):
         """
         Public method to get data out of the chunks.
-        
+
         @param pos position to get bytes from
         @type int
         @param maxSize maximum amount of bytes to get
@@ -104,23 +106,23 @@
         """
         ioDelta = 0
         chunkIdx = 0
-        
+
         chunk = HexEditChunk()
         buffer = bytearray()
-        
+
         if highlighted is not None:
             del highlighted[:]
-        
+
         if pos >= self.__size:
             return buffer
-        
+
         if maxSize < 0:
             maxSize = self.__size
         elif (pos + maxSize) > self.__size:
             maxSize = self.__size - pos
-        
+
         self.__ioDevice.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         while maxSize > 0:
             chunk.absPos = sys.maxsize
             chunksLoopOngoing = True
@@ -129,7 +131,7 @@
                 # and we take the edited data, if availible. ioDelta is a
                 # difference counter to justify the read pointer to the
                 # original data, if data in between was deleted or inserted.
-                
+
                 chunk = self.__chunks[chunkIdx]
                 if chunk.absPos > pos:
                     chunksLoopOngoing = False
@@ -142,13 +144,14 @@
                     else:
                         count = maxSize
                     if count > 0:
-                        buffer += chunk.data[chunkOfs:chunkOfs + count]
+                        buffer += chunk.data[chunkOfs : chunkOfs + count]
                         maxSize -= count
                         pos += count
                         if highlighted is not None:
                             highlighted += chunk.dataChanged[
-                                chunkOfs:chunkOfs + count]
-            
+                                chunkOfs : chunkOfs + count
+                            ]
+
             if maxSize > 0 and pos < chunk.absPos:
                 # In this section, we read data from the original source. This
                 # will only happen, when no copied data is available.
@@ -156,7 +159,7 @@
                     byteCount = maxSize
                 else:
                     byteCount = chunk.absPos - pos
-                
+
                 maxSize -= byteCount
                 self.__ioDevice.seek(pos + ioDelta)
                 readBuffer = bytearray(self.__ioDevice.read(byteCount))
@@ -164,14 +167,14 @@
                 if highlighted is not None:
                     highlighted += bytearray(len(readBuffer))
                 pos += len(readBuffer)
-        
+
         self.__ioDevice.close()
         return buffer
-    
+
     def write(self, ioDevice, pos=0, count=-1):
         """
         Public method to write data to an io device.
-        
+
         @param ioDevice io device to write the data to
         @type QIODevice
         @param pos position to write bytes from
@@ -184,25 +187,25 @@
         if count == -1:
             # write all data
             count = self.__size
-        
+
         ok = ioDevice.open(QIODevice.OpenModeFlag.WriteOnly)
         if ok:
             idx = pos
             while idx < count:
                 data = self.data(idx, self.BUFFER_SIZE)
                 ioDevice.write(QByteArray(data))
-                
+
                 # increment loop variable
                 idx += self.BUFFER_SIZE
-            
+
             ioDevice.close()
-        
+
         return ok
-    
+
     def setDataChanged(self, pos, dataChanged):
         """
         Public method to set highlighting info.
-        
+
         @param pos position to set highlighting info for
         @type int
         @param dataChanged flag indicating changed data
@@ -214,11 +217,11 @@
         chunkIdx = self.__getChunkIndex(pos)
         posInChunk = pos - self.__chunks[chunkIdx].absPos
         self.__chunks[chunkIdx].dataChanged[posInChunk] = int(dataChanged)
-    
+
     def dataChanged(self, pos):
         """
         Public method to test, if some data was changed.
-        
+
         @param pos byte position to check
         @type int
         @return flag indicating the changed state
@@ -227,11 +230,11 @@
         highlighted = bytearray()
         self.data(pos, 1, highlighted)
         return highlighted and bool(highlighted[0])
-    
+
     def indexOf(self, byteArray, start):
         """
         Public method to search the first occurrence of some data.
-        
+
         @param byteArray data to search for
         @type bytearray
         @param start position to start the search at
@@ -240,7 +243,7 @@
         @rtype int
         """
         ba = bytearray(byteArray)
-        
+
         result = -1
         pos = start
         while pos < self.__size:
@@ -249,16 +252,16 @@
             if findPos >= 0:
                 result = pos + findPos
                 break
-            
+
             # increment loop variable
             pos += self.BUFFER_SIZE
-        
+
         return result
-    
+
     def lastIndexOf(self, byteArray, start):
         """
         Public method to search the last occurrence of some data.
-        
+
         @param byteArray data to search for
         @type bytearray
         @param start position to start the search at
@@ -267,29 +270,29 @@
         @rtype int
         """
         ba = bytearray(byteArray)
-        
+
         result = -1
         pos = start
         while pos > 0 and result < 0:
             sPos = pos - self.BUFFER_SIZE - len(ba) + 1
             if sPos < 0:
                 sPos = 0
-            
+
             buffer = self.data(sPos, pos - sPos)
             findPos = buffer.rfind(ba)
             if findPos >= 0:
                 result = sPos + findPos
                 break
-            
+
             # increment loop variable
             pos -= self.BUFFER_SIZE
-        
+
         return result
-    
+
     def insert(self, pos, data):
         """
         Public method to insert a byte.
-        
+
         @param pos position to insert at
         @type int
         @param data byte to insert
@@ -300,11 +303,11 @@
         if pos < 0 or pos > self.__size:
             # position is out of range, do nothing
             return False
-        
+
         chunkIdx = (
             self.__getChunkIndex(pos - 1)
-            if pos == self.__size else
-            self.__getChunkIndex(pos)
+            if pos == self.__size
+            else self.__getChunkIndex(pos)
         )
         chunk = self.__chunks[chunkIdx]
         posInChunk = pos - chunk.absPos
@@ -315,11 +318,11 @@
         self.__size += 1
         self.__pos = pos
         return True
-    
+
     def overwrite(self, pos, data):
         """
         Public method to overwrite a byte.
-        
+
         @param pos position to overwrite
         @type int
         @param data byte to overwrite with
@@ -330,7 +333,7 @@
         if pos < 0 or pos >= self.__size:
             # position is out of range, do nothing
             return False
-        
+
         chunkIdx = self.__getChunkIndex(pos)
         chunk = self.__chunks[chunkIdx]
         posInChunk = pos - chunk.absPos
@@ -338,11 +341,11 @@
         chunk.dataChanged[posInChunk] = 1
         self.__pos = pos
         return True
-    
+
     def removeAt(self, pos):
         """
         Public method to remove a byte.
-        
+
         @param pos position to remove
         @type int
         @return flag indicating success
@@ -351,7 +354,7 @@
         if pos < 0 or pos >= self.__size:
             # position is out of range, do nothing
             return False
-        
+
         chunkIdx = self.__getChunkIndex(pos)
         chunk = self.__chunks[chunkIdx]
         posInChunk = pos - chunk.absPos
@@ -362,13 +365,13 @@
         self.__size -= 1
         self.__pos = pos
         return True
-    
+
     def __getitem__(self, pos):
         """
         Special method to get a byte at a position.
-        
+
         Note: This realizes the [] get operator.
-        
+
         @param pos position of byte to get
         @type int
         @return requested byte
@@ -376,36 +379,36 @@
         """
         if pos >= self.__size:
             return 0
-##            raise IndexError
-        
+        ##            raise IndexError
+
         return self.data(pos, 1)[0]
-    
+
     def pos(self):
         """
         Public method to get the current position.
-        
+
         @return current position
         @rtype int
         """
         return self.__pos
-    
+
     def size(self):
         """
         Public method to get the current data size.
-        
+
         @return current data size
         @rtype int
         """
         return self.__size
-    
+
     def __getChunkIndex(self, absPos):
         """
         Private method to get the chunk index for a position.
-        
+
         This method checks, if there is already a copied chunk available. If
         there is one, it returns its index. If there is no copied chunk
         available, original data will be copied into a new chunk.
-        
+
         @param absPos absolute position of the data.
         @type int
         @return index of the chunk containing the position
@@ -414,23 +417,20 @@
         foundIdx = -1
         insertIdx = 0
         ioDelta = 0
-        
+
         for idx in range(len(self.__chunks)):
             chunk = self.__chunks[idx]
-            if (
-                absPos >= chunk.absPos and
-                absPos < (chunk.absPos + len(chunk.data))
-            ):
+            if absPos >= chunk.absPos and absPos < (chunk.absPos + len(chunk.data)):
                 foundIdx = idx
                 break
-            
+
             if absPos < chunk.absPos:
                 insertIdx = idx
                 break
-            
+
             ioDelta += len(chunk.data) - self.CHUNK_SIZE
             insertIdx = idx + 1
-        
+
         if foundIdx == -1:
             newChunk = HexEditChunk()
             readAbsPos = absPos - ioDelta
@@ -443,5 +443,5 @@
             newChunk.dataChanged = bytearray(len(newChunk.data))
             self.__chunks.insert(insertIdx, newChunk)
             foundIdx = insertIdx
-        
+
         return foundIdx
--- a/src/eric7/HexEdit/HexEditGotoWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditGotoWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     """
     Class implementing a movement (goto) widget for the hex editor.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the hex editor widget
         @type HexEditWidget
         @param parent reference to the parent widget
@@ -32,28 +33,32 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__editor = editor
-        
+
         # keep this in sync with the logic in on_gotoButton_clicked()
         self.__formatAndValidators = {
-            "hex": (self.tr("Hex"), QRegularExpressionValidator(
-                QRegularExpression("[0-9a-f:]*"))),
-            "dec": (self.tr("Dec"), QRegularExpressionValidator(
-                QRegularExpression("[0-9]*"))),
+            "hex": (
+                self.tr("Hex"),
+                QRegularExpressionValidator(QRegularExpression("[0-9a-f:]*")),
+            ),
+            "dec": (
+                self.tr("Dec"),
+                QRegularExpressionValidator(QRegularExpression("[0-9]*")),
+            ),
         }
         formatOrder = ["hex", "dec"]
-        
+
         self.__currentFormat = ""
-        
+
         self.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
-        
+
         for dataFormat in formatOrder:
             formatStr, validator = self.__formatAndValidators[dataFormat]
             self.formatCombo.addItem(formatStr, dataFormat)
-        
+
         self.formatCombo.setCurrentIndex(0)
-    
+
     @pyqtSlot()
     def on_closeButton_clicked(self):
         """
@@ -61,39 +66,37 @@
         """
         self.__editor.setFocus(Qt.FocusReason.OtherFocusReason)
         self.close()
-    
+
     @pyqtSlot(int)
     def on_formatCombo_currentIndexChanged(self, idx):
         """
         Private slot to handle a selection of the format.
-        
+
         @param idx index of the selected entry
         @type int
         """
         if idx >= 0:
             dataFormat = self.formatCombo.itemData(idx)
-            
+
             if dataFormat != self.__currentFormat:
                 txt = self.offsetEdit.text()
-                newTxt = self.__convertText(
-                    txt, self.__currentFormat, dataFormat)
+                newTxt = self.__convertText(txt, self.__currentFormat, dataFormat)
                 self.__currentFormat = dataFormat
-                
-                self.offsetEdit.setValidator(
-                    self.__formatAndValidators[dataFormat][1])
-                
+
+                self.offsetEdit.setValidator(self.__formatAndValidators[dataFormat][1])
+
                 self.offsetEdit.setText(newTxt)
-    
+
     @pyqtSlot(str)
     def on_offsetEdit_textChanged(self, offset):
         """
         Private slot handling a change of the entered offset.
-        
+
         @param offset entered offset
         @type str
         """
         self.gotoButton.setEnabled(bool(offset))
-        
+
     @pyqtSlot()
     def on_gotoButton_clicked(self):
         """
@@ -106,14 +109,18 @@
             offset = int(offset, 16)
         else:
             offset = int(self.offsetEdit.text(), 10)
-        
+
         fromCursor = self.cursorCheckBox.isChecked()
         backwards = self.backCheckBox.isChecked()
         extendSelection = self.selectionCheckBox.isChecked()
-        
-        self.__editor.goto(offset, fromCursor=fromCursor, backwards=backwards,
-                           extendSelection=extendSelection)
-    
+
+        self.__editor.goto(
+            offset,
+            fromCursor=fromCursor,
+            backwards=backwards,
+            extendSelection=extendSelection,
+        )
+
     def show(self):
         """
         Public slot to show the widget.
@@ -121,7 +128,7 @@
         self.offsetEdit.selectAll()
         self.offsetEdit.setFocus()
         super().show()
-    
+
     def reset(self):
         """
         Public slot to reset the input widgets.
@@ -135,17 +142,17 @@
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event
         @type QKeyEvent
         """
         if event.key() == Qt.Key.Key_Escape:
             self.close()
-    
+
     def __convertText(self, txt, oldFormat, newFormat):
         """
         Private method to convert text from one format into another.
-        
+
         @param txt text to be converted
         @type str
         @param oldFormat current format of the text
@@ -162,12 +169,12 @@
                 index = int(txt, 16)
             else:
                 index = int(txt, 10)
-            
+
             # step 2: convert the integer to text using the new format
             if newFormat == "hex":
                 txt = "{0:x}".format(index)
                 txt = Globals.strGroup(txt, ":", 4)
             else:
                 txt = "{0:d}".format(index)
-        
+
         return txt
--- a/src/eric7/HexEdit/HexEditMainWindow.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditMainWindow.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,12 +11,16 @@
 import contextlib
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QSize, QCoreApplication, QLocale
-)
+from PyQt6.QtCore import pyqtSignal, pyqtSlot, QSize, QCoreApplication, QLocale
 from PyQt6.QtGui import QKeySequence, QAction
 from PyQt6.QtWidgets import (
-    QWhatsThis, QLabel, QWidget, QVBoxLayout, QDialog, QFrame, QMenu
+    QWhatsThis,
+    QLabel,
+    QWidget,
+    QVBoxLayout,
+    QDialog,
+    QFrame,
+    QMenu,
 )
 
 from EricGui.EricAction import EricAction
@@ -40,19 +44,20 @@
 class HexEditMainWindow(EricMainWindow):
     """
     Class implementing the web browser main window.
-    
+
     @signal editorClosed() emitted after the window was requested to close down
     """
+
     editorClosed = pyqtSignal()
-    
+
     windows = []
-    
+
     maxMenuFilePathLen = 75
-    
+
     def __init__(self, fileName="", parent=None, fromEric=False, project=None):
         """
         Constructor
-        
+
         @param fileName name of a file to load on startup (string)
         @param parent parent widget of this window (QWidget)
         @param fromEric flag indicating whether it was called from within
@@ -61,7 +66,7 @@
         """
         super().__init__(parent)
         self.setObjectName("eric7_hex_editor")
-        
+
         self.__srHistory = {
             "search": [],
             # list of recent searches (tuple of format type index and
@@ -70,19 +75,16 @@
             # list of recent replaces (tuple of format type index and
             # replace term
         }
-        
+
         self.__fromEric = fromEric
         self.setWindowIcon(UI.PixmapCache.getIcon("hexEditor"))
-        
+
         if not self.__fromEric:
-            self.setStyle(Preferences.getUI("Style"),
-                          Preferences.getUI("StyleSheet"))
-        
+            self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.__editor = HexEditWidget()
-        self.__searchWidget = HexEditSearchReplaceWidget(
-            self.__editor, self, False)
-        self.__replaceWidget = HexEditSearchReplaceWidget(
-            self.__editor, self, True)
+        self.__searchWidget = HexEditSearchReplaceWidget(self.__editor, self, False)
+        self.__replaceWidget = HexEditSearchReplaceWidget(self.__editor, self, True)
         self.__gotoWidget = HexEditGotoWidget(self.__editor)
         cw = QWidget()
         layout = QVBoxLayout(cw)
@@ -97,24 +99,24 @@
         self.__replaceWidget.hide()
         self.__gotoWidget.hide()
         self.setCentralWidget(cw)
-        
+
         g = Preferences.getGeometry("HexEditorGeometry")
         if g.isEmpty():
             s = QSize(600, 500)
             self.resize(s)
         else:
             self.restoreGeometry(g)
-        
+
         self.__initActions()
         self.__initMenus()
         self.__initToolbars()
         self.__createStatusBar()
-        
+
         self.__class__.windows.append(self)
-        
+
         state = Preferences.getHexEditor("HexEditorState")
         self.restoreState(state)
-        
+
         self.__editor.currentAddressChanged.connect(self.__showAddress)
         self.__editor.selectionAvailable.connect(self.__showSelectionInfo)
         self.__editor.currentSizeChanged.connect(self.__showSize)
@@ -122,547 +124,667 @@
         self.__editor.overwriteModeChanged.connect(self.__showEditMode)
         self.__editor.readOnlyChanged.connect(self.__showReadOnlyMode)
         self.__editor.readOnlyChanged.connect(self.__checkActions)
-        
+
         self.preferencesChanged()
-        self.__editor.setOverwriteMode(
-            Preferences.getHexEditor("OpenInOverwriteMode"))
-        
+        self.__editor.setOverwriteMode(Preferences.getHexEditor("OpenInOverwriteMode"))
+
         self.__project = project
         self.__lastOpenPath = ""
         self.__lastSavePath = ""
-        
+
         self.__recent = []
         self.__loadRecent()
-        
+
         self.__setCurrentFile("")
         if fileName:
             self.__loadHexFile(fileName)
-        
+
         self.__checkActions()
-    
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         # list of all actions
         self.__actions = []
-        
+
         self.__initFileActions()
         self.__initEditActions()
         self.__initHelpActions()
         if not self.__fromEric:
             self.__initConfigActions()
-        
+
     def __initFileActions(self):
         """
         Private method to define the file related user interface actions.
         """
         self.newWindowAct = EricAction(
-            self.tr('New Window'),
+            self.tr("New Window"),
             UI.PixmapCache.getIcon("newWindow"),
-            self.tr('New &Window'),
-            0, 0, self, 'hexEditor_file_new_window')
-        self.newWindowAct.setStatusTip(self.tr(
-            'Open a binary file for editing in a new hex editor window'))
-        self.newWindowAct.setWhatsThis(self.tr(
-            """<b>New Window</b>"""
-            """<p>This opens a binary file for editing in a new hex editor"""
-            """ window.</p>"""
-        ))
+            self.tr("New &Window"),
+            0,
+            0,
+            self,
+            "hexEditor_file_new_window",
+        )
+        self.newWindowAct.setStatusTip(
+            self.tr("Open a binary file for editing in a new hex editor window")
+        )
+        self.newWindowAct.setWhatsThis(
+            self.tr(
+                """<b>New Window</b>"""
+                """<p>This opens a binary file for editing in a new hex editor"""
+                """ window.</p>"""
+            )
+        )
         self.newWindowAct.triggered.connect(self.__openHexFileNewWindow)
         self.__actions.append(self.newWindowAct)
-        
+
         # correct texts will be set later
         self.openAct = EricAction(
-            self.tr('Open'),
+            self.tr("Open"),
             UI.PixmapCache.getIcon("open"),
-            self.tr('&Open...'),
+            self.tr("&Open..."),
             QKeySequence(self.tr("Ctrl+O", "File|Open")),
-            0, self, 'hexEditor_file_open')
+            0,
+            self,
+            "hexEditor_file_open",
+        )
         self.openAct.triggered.connect(self.__openHexFile)
         self.__actions.append(self.openAct)
-        
+
         # correct texts will be set later
         self.openReadOnlyAct = EricAction(
-            "", "",
-            0, 0, self, 'hexEditor_file_open_read_only')
+            "", "", 0, 0, self, "hexEditor_file_open_read_only"
+        )
         self.openReadOnlyAct.triggered.connect(self.__openHexFileReadOnly)
         self.__actions.append(self.openReadOnlyAct)
-        
+
         self.saveAct = EricAction(
-            self.tr('Save'),
+            self.tr("Save"),
             UI.PixmapCache.getIcon("fileSave"),
-            self.tr('&Save'),
+            self.tr("&Save"),
             QKeySequence(self.tr("Ctrl+S", "File|Save")),
-            0, self, 'hexEditor_file_save')
-        self.saveAct.setStatusTip(self.tr('Save the current binary file'))
-        self.saveAct.setWhatsThis(self.tr(
-            """<b>Save File</b>"""
-            """<p>Save the contents of the hex editor window.</p>"""
-        ))
+            0,
+            self,
+            "hexEditor_file_save",
+        )
+        self.saveAct.setStatusTip(self.tr("Save the current binary file"))
+        self.saveAct.setWhatsThis(
+            self.tr(
+                """<b>Save File</b>"""
+                """<p>Save the contents of the hex editor window.</p>"""
+            )
+        )
         self.saveAct.triggered.connect(self.__saveHexFile)
         self.__actions.append(self.saveAct)
-        
+
         self.saveAsAct = EricAction(
-            self.tr('Save As'),
+            self.tr("Save As"),
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save &As...'),
+            self.tr("Save &As..."),
             QKeySequence(self.tr("Shift+Ctrl+S", "File|Save As")),
-            0, self, 'hexEditor_file_save_as')
+            0,
+            self,
+            "hexEditor_file_save_as",
+        )
         self.saveAsAct.setStatusTip(
-            self.tr('Save the current binary data to a new file'))
-        self.saveAsAct.setWhatsThis(self.tr(
-            """<b>Save As...</b>"""
-            """<p>Saves the current binary data to a new file.</p>"""
-        ))
+            self.tr("Save the current binary data to a new file")
+        )
+        self.saveAsAct.setWhatsThis(
+            self.tr(
+                """<b>Save As...</b>"""
+                """<p>Saves the current binary data to a new file.</p>"""
+            )
+        )
         self.saveAsAct.triggered.connect(self.__saveHexFileAs)
         self.__actions.append(self.saveAsAct)
-        
+
         self.saveReadableAct = EricAction(
-            self.tr('Save As Readable'),
-            self.tr('Save As &Readable...'),
-            0, 0, self, 'hexEditor_file_save_readable')
+            self.tr("Save As Readable"),
+            self.tr("Save As &Readable..."),
+            0,
+            0,
+            self,
+            "hexEditor_file_save_readable",
+        )
         self.saveReadableAct.setStatusTip(
-            self.tr('Save the current binary data to a new file in a readable'
-                    ' format'))
-        self.saveReadableAct.setWhatsThis(self.tr(
-            """<b>Save As Readable...</b>"""
-            """<p>Saves the current binary data to a new file in a readable"""
-            """ format.</p>"""
-        ))
+            self.tr(
+                "Save the current binary data to a new file in a readable" " format"
+            )
+        )
+        self.saveReadableAct.setWhatsThis(
+            self.tr(
+                """<b>Save As Readable...</b>"""
+                """<p>Saves the current binary data to a new file in a readable"""
+                """ format.</p>"""
+            )
+        )
         self.saveReadableAct.triggered.connect(self.__saveHexFileReadable)
         self.__actions.append(self.saveReadableAct)
-        
+
         self.closeAct = EricAction(
-            self.tr('Close'),
+            self.tr("Close"),
             UI.PixmapCache.getIcon("close"),
-            self.tr('&Close'),
+            self.tr("&Close"),
             QKeySequence(self.tr("Ctrl+W", "File|Close")),
-            0, self, 'hexEditor_file_close')
-        self.closeAct.setStatusTip(self.tr(
-            'Close the current hex editor window'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close</b>"""
-            """<p>Closes the current hex editor window.</p>"""
-        ))
+            0,
+            self,
+            "hexEditor_file_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the current hex editor window"))
+        self.closeAct.setWhatsThis(
+            self.tr(
+                """<b>Close</b>""" """<p>Closes the current hex editor window.</p>"""
+            )
+        )
         self.closeAct.triggered.connect(self.close)
         self.__actions.append(self.closeAct)
-        
+
         self.closeAllAct = EricAction(
-            self.tr('Close All'),
-            self.tr('Close &All'),
-            0, 0, self, 'hexEditor_file_close_all')
-        self.closeAllAct.setStatusTip(self.tr(
-            'Close all hex editor windows'))
-        self.closeAllAct.setWhatsThis(self.tr(
-            """<b>Close All</b>"""
-            """<p>Closes all hex editor windows.</p>"""
-        ))
+            self.tr("Close All"),
+            self.tr("Close &All"),
+            0,
+            0,
+            self,
+            "hexEditor_file_close_all",
+        )
+        self.closeAllAct.setStatusTip(self.tr("Close all hex editor windows"))
+        self.closeAllAct.setWhatsThis(
+            self.tr("""<b>Close All</b>""" """<p>Closes all hex editor windows.</p>""")
+        )
         self.closeAllAct.triggered.connect(self.__closeAll)
         self.__actions.append(self.closeAllAct)
-        
+
         self.closeOthersAct = EricAction(
-            self.tr('Close Others'),
-            self.tr('Close Others'),
-            0, 0, self, 'hexEditor_file_close_others')
-        self.closeOthersAct.setStatusTip(self.tr(
-            'Close all other hex editor windows'))
-        self.closeOthersAct.setWhatsThis(self.tr(
-            """<b>Close Others</b>"""
-            """<p>Closes all other hex editor windows.</p>"""
-        ))
+            self.tr("Close Others"),
+            self.tr("Close Others"),
+            0,
+            0,
+            self,
+            "hexEditor_file_close_others",
+        )
+        self.closeOthersAct.setStatusTip(self.tr("Close all other hex editor windows"))
+        self.closeOthersAct.setWhatsThis(
+            self.tr(
+                """<b>Close Others</b>"""
+                """<p>Closes all other hex editor windows.</p>"""
+            )
+        )
         self.closeOthersAct.triggered.connect(self.__closeOthers)
         self.__actions.append(self.closeOthersAct)
-        
+
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'hexEditor_file_quit')
-        self.exitAct.setStatusTip(self.tr('Quit the hex editor'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the hex editor.</p>"""
-        ))
+            0,
+            self,
+            "hexEditor_file_quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the hex editor"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the hex editor.</p>""")
+        )
         if not self.__fromEric:
             self.exitAct.triggered.connect(self.__closeAll)
         self.__actions.append(self.exitAct)
-    
+
     def __initEditActions(self):
         """
         Private method to create the Edit actions.
         """
         self.undoAct = EricAction(
-            self.tr('Undo'),
+            self.tr("Undo"),
             UI.PixmapCache.getIcon("editUndo"),
-            self.tr('&Undo'),
+            self.tr("&Undo"),
             QKeySequence(self.tr("Ctrl+Z", "Edit|Undo")),
             QKeySequence(self.tr("Alt+Backspace", "Edit|Undo")),
-            self, 'hexEditor_edit_undo')
-        self.undoAct.setStatusTip(self.tr('Undo the last change'))
-        self.undoAct.setWhatsThis(self.tr(
-            """<b>Undo</b>"""
-            """<p>Undo the last change done.</p>"""
-        ))
+            self,
+            "hexEditor_edit_undo",
+        )
+        self.undoAct.setStatusTip(self.tr("Undo the last change"))
+        self.undoAct.setWhatsThis(
+            self.tr("""<b>Undo</b>""" """<p>Undo the last change done.</p>""")
+        )
         self.undoAct.triggered.connect(self.__editor.undo)
         self.__actions.append(self.undoAct)
-        
+
         self.redoAct = EricAction(
-            self.tr('Redo'),
+            self.tr("Redo"),
             UI.PixmapCache.getIcon("editRedo"),
-            self.tr('&Redo'),
+            self.tr("&Redo"),
             QKeySequence(self.tr("Ctrl+Shift+Z", "Edit|Redo")),
-            0, self, 'hexEditor_edit_redo')
-        self.redoAct.setStatusTip(self.tr('Redo the last change'))
-        self.redoAct.setWhatsThis(self.tr(
-            """<b>Redo</b>"""
-            """<p>Redo the last change done.</p>"""
-        ))
+            0,
+            self,
+            "hexEditor_edit_redo",
+        )
+        self.redoAct.setStatusTip(self.tr("Redo the last change"))
+        self.redoAct.setWhatsThis(
+            self.tr("""<b>Redo</b>""" """<p>Redo the last change done.</p>""")
+        )
         self.redoAct.triggered.connect(self.__editor.redo)
         self.__actions.append(self.redoAct)
-        
+
         self.revertAct = EricAction(
-            self.tr('Revert to last saved state'),
-            self.tr('Re&vert to last saved state'),
+            self.tr("Revert to last saved state"),
+            self.tr("Re&vert to last saved state"),
             QKeySequence(self.tr("Ctrl+Y", "Edit|Revert")),
             0,
-            self, 'hexEditor_edit_revert')
-        self.revertAct.setStatusTip(self.tr('Revert to last saved state'))
-        self.revertAct.setWhatsThis(self.tr(
-            """<b>Revert to last saved state</b>"""
-            """<p>Undo all changes up to the last saved state of the"""
-            """ editor.</p>"""
-        ))
+            self,
+            "hexEditor_edit_revert",
+        )
+        self.revertAct.setStatusTip(self.tr("Revert to last saved state"))
+        self.revertAct.setWhatsThis(
+            self.tr(
+                """<b>Revert to last saved state</b>"""
+                """<p>Undo all changes up to the last saved state of the"""
+                """ editor.</p>"""
+            )
+        )
         self.revertAct.triggered.connect(self.__editor.revertToUnmodified)
         self.__actions.append(self.revertAct)
-        
+
         self.cutAct = EricAction(
-            self.tr('Cut'),
+            self.tr("Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            self.tr('Cu&t'),
+            self.tr("Cu&t"),
             QKeySequence(self.tr("Ctrl+X", "Edit|Cut")),
             QKeySequence(self.tr("Shift+Del", "Edit|Cut")),
-            self, 'hexEditor_edit_cut')
-        self.cutAct.setStatusTip(self.tr('Cut the selection'))
-        self.cutAct.setWhatsThis(self.tr(
-            """<b>Cut</b>"""
-            """<p>Cut the selected binary area to the clipboard.</p>"""
-        ))
+            self,
+            "hexEditor_edit_cut",
+        )
+        self.cutAct.setStatusTip(self.tr("Cut the selection"))
+        self.cutAct.setWhatsThis(
+            self.tr(
+                """<b>Cut</b>"""
+                """<p>Cut the selected binary area to the clipboard.</p>"""
+            )
+        )
         self.cutAct.triggered.connect(self.__editor.cut)
         self.__actions.append(self.cutAct)
-        
+
         self.copyAct = EricAction(
-            self.tr('Copy'),
+            self.tr("Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr('&Copy'),
+            self.tr("&Copy"),
             QKeySequence(self.tr("Ctrl+C", "Edit|Copy")),
             QKeySequence(self.tr("Ctrl+Ins", "Edit|Copy")),
-            self, 'hexEditor_edit_copy')
-        self.copyAct.setStatusTip(self.tr('Copy the selection'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy the selected binary area to the clipboard.</p>"""
-        ))
+            self,
+            "hexEditor_edit_copy",
+        )
+        self.copyAct.setStatusTip(self.tr("Copy the selection"))
+        self.copyAct.setWhatsThis(
+            self.tr(
+                """<b>Copy</b>"""
+                """<p>Copy the selected binary area to the clipboard.</p>"""
+            )
+        )
         self.copyAct.triggered.connect(self.__editor.copy)
         self.__actions.append(self.copyAct)
-        
+
         self.pasteAct = EricAction(
-            self.tr('Paste'),
+            self.tr("Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            self.tr('&Paste'),
+            self.tr("&Paste"),
             QKeySequence(self.tr("Ctrl+V", "Edit|Paste")),
             QKeySequence(self.tr("Shift+Ins", "Edit|Paste")),
-            self, 'hexEditor_edit_paste')
-        self.pasteAct.setStatusTip(self.tr('Paste the clipboard contents'))
-        self.pasteAct.setWhatsThis(self.tr(
-            """<b>Paste</b>"""
-            """<p>Paste the clipboard contents.</p>"""
-        ))
+            self,
+            "hexEditor_edit_paste",
+        )
+        self.pasteAct.setStatusTip(self.tr("Paste the clipboard contents"))
+        self.pasteAct.setWhatsThis(
+            self.tr("""<b>Paste</b>""" """<p>Paste the clipboard contents.</p>""")
+        )
         self.pasteAct.triggered.connect(self.__editor.paste)
         self.__actions.append(self.pasteAct)
-        
+
         self.selectAllAct = EricAction(
-            self.tr('Select All'),
+            self.tr("Select All"),
             UI.PixmapCache.getIcon("editSelectAll"),
-            self.tr('&Select All'),
+            self.tr("&Select All"),
             QKeySequence(self.tr("Ctrl+A", "Edit|Select All")),
             0,
-            self, 'hexEditor_edit_select_all')
-        self.selectAllAct.setStatusTip(self.tr(
-            'Select the complete binary data'))
-        self.selectAllAct.setWhatsThis(self.tr(
-            """<b>Select All</b>"""
-            """<p>Selects the complete binary data.</p>"""
-        ))
+            self,
+            "hexEditor_edit_select_all",
+        )
+        self.selectAllAct.setStatusTip(self.tr("Select the complete binary data"))
+        self.selectAllAct.setWhatsThis(
+            self.tr(
+                """<b>Select All</b>""" """<p>Selects the complete binary data.</p>"""
+            )
+        )
         self.selectAllAct.triggered.connect(self.__editor.selectAll)
         self.__actions.append(self.selectAllAct)
-        
+
         self.deselectAllAct = EricAction(
-            self.tr('Deselect all'),
-            self.tr('&Deselect all'),
+            self.tr("Deselect all"),
+            self.tr("&Deselect all"),
             QKeySequence(self.tr("Alt+Ctrl+A", "Edit|Deselect all")),
             0,
-            self, 'hexEditor_edit_deselect_all')
-        self.deselectAllAct.setStatusTip(self.tr('Deselect all binary data'))
-        self.deselectAllAct.setWhatsThis(self.tr(
-            """<b>Deselect All</b>"""
-            """<p>Deselect all all binary data.</p>"""
-        ))
+            self,
+            "hexEditor_edit_deselect_all",
+        )
+        self.deselectAllAct.setStatusTip(self.tr("Deselect all binary data"))
+        self.deselectAllAct.setWhatsThis(
+            self.tr(
+                """<b>Deselect All</b>""" """<p>Deselect all all binary data.</p>"""
+            )
+        )
         self.deselectAllAct.triggered.connect(self.__editor.deselectAll)
         self.__actions.append(self.deselectAllAct)
-        
+
         self.saveSelectionReadableAct = EricAction(
-            self.tr('Save Selection Readable'),
-            self.tr('Save Selection Readable...'),
-            0, 0, self, 'hexEditor_edit_selection_save_readable')
+            self.tr("Save Selection Readable"),
+            self.tr("Save Selection Readable..."),
+            0,
+            0,
+            self,
+            "hexEditor_edit_selection_save_readable",
+        )
         self.saveSelectionReadableAct.setStatusTip(
-            self.tr('Save the binary data of the current selection to a file'
-                    ' in a readable format'))
-        self.saveSelectionReadableAct.setWhatsThis(self.tr(
-            """<b>Save Selection Readable...</b>"""
-            """<p>Saves the binary data of the current selection to a file"""
-            """ in a readable format.</p>"""
-        ))
-        self.saveSelectionReadableAct.triggered.connect(
-            self.__saveSelectionReadable)
+            self.tr(
+                "Save the binary data of the current selection to a file"
+                " in a readable format"
+            )
+        )
+        self.saveSelectionReadableAct.setWhatsThis(
+            self.tr(
+                """<b>Save Selection Readable...</b>"""
+                """<p>Saves the binary data of the current selection to a file"""
+                """ in a readable format.</p>"""
+            )
+        )
+        self.saveSelectionReadableAct.triggered.connect(self.__saveSelectionReadable)
         self.__actions.append(self.saveSelectionReadableAct)
-        
+
         self.readonlyAct = EricAction(
-            self.tr('Set Read Only'),
-            self.tr('Set Read Only'),
-            0, 0, self, 'hexEditor_edit_readonly', True)
-        self.readonlyAct.setStatusTip(self.tr(
-            'Change the edit mode to read only'))
-        self.readonlyAct.setWhatsThis(self.tr(
-            """<b>Set Read Only</b>"""
-            """<p>This changes the edit mode to read only (i.e. to view"""
-            """ mode).</p>"""
-        ))
+            self.tr("Set Read Only"),
+            self.tr("Set Read Only"),
+            0,
+            0,
+            self,
+            "hexEditor_edit_readonly",
+            True,
+        )
+        self.readonlyAct.setStatusTip(self.tr("Change the edit mode to read only"))
+        self.readonlyAct.setWhatsThis(
+            self.tr(
+                """<b>Set Read Only</b>"""
+                """<p>This changes the edit mode to read only (i.e. to view"""
+                """ mode).</p>"""
+            )
+        )
         self.readonlyAct.setChecked(False)
         self.readonlyAct.toggled[bool].connect(self.__editor.setReadOnly)
         self.__editor.readOnlyChanged.connect(self.readonlyAct.setChecked)
         self.__actions.append(self.readonlyAct)
-        
+
         self.searchAct = EricAction(
-            self.tr('Search'),
+            self.tr("Search"),
             UI.PixmapCache.getIcon("find"),
-            self.tr('&Search...'),
+            self.tr("&Search..."),
             QKeySequence(self.tr("Ctrl+F", "Search|Search")),
             0,
-            self, 'hexEditor_edit_search')
-        self.searchAct.setStatusTip(self.tr('Search for data'))
-        self.searchAct.setWhatsThis(self.tr(
-            """<b>Search</b>"""
-            """<p>Search for some data. A dialog is shown to enter the"""
-            """ data to search for in various formats.</p>"""
-        ))
+            self,
+            "hexEditor_edit_search",
+        )
+        self.searchAct.setStatusTip(self.tr("Search for data"))
+        self.searchAct.setWhatsThis(
+            self.tr(
+                """<b>Search</b>"""
+                """<p>Search for some data. A dialog is shown to enter the"""
+                """ data to search for in various formats.</p>"""
+            )
+        )
         self.searchAct.triggered.connect(self.__search)
         self.__actions.append(self.searchAct)
-        
+
         self.searchNextAct = EricAction(
-            self.tr('Search next'),
+            self.tr("Search next"),
             UI.PixmapCache.getIcon("findNext"),
-            self.tr('Search &next'),
+            self.tr("Search &next"),
             QKeySequence(self.tr("F3", "Search|Search next")),
             0,
-            self, 'hexEditor_edit_search_next')
-        self.searchNextAct.setStatusTip(self.tr(
-            'Search next occurrence'))
-        self.searchNextAct.setWhatsThis(self.tr(
-            """<b>Search next</b>"""
-            """<p>Search the next occurrence of some data. The previously"""
-            """ entered search data are reused.</p>"""
-        ))
+            self,
+            "hexEditor_edit_search_next",
+        )
+        self.searchNextAct.setStatusTip(self.tr("Search next occurrence"))
+        self.searchNextAct.setWhatsThis(
+            self.tr(
+                """<b>Search next</b>"""
+                """<p>Search the next occurrence of some data. The previously"""
+                """ entered search data are reused.</p>"""
+            )
+        )
         self.searchNextAct.triggered.connect(self.__searchWidget.findPrevNext)
         self.__actions.append(self.searchNextAct)
-        
+
         self.searchPrevAct = EricAction(
-            self.tr('Search previous'),
+            self.tr("Search previous"),
             UI.PixmapCache.getIcon("findPrev"),
-            self.tr('Search &previous'),
+            self.tr("Search &previous"),
             QKeySequence(self.tr("Shift+F3", "Search|Search previous")),
             0,
-            self, 'hexEditor_edit_search_previous')
-        self.searchPrevAct.setStatusTip(self.tr(
-            'Search previous occurrence'))
-        self.searchPrevAct.setWhatsThis(self.tr(
-            """<b>Search previous</b>"""
-            """<p>Search the previous occurrence of some data. The"""
-            """ previously entered search data are reused.</p>"""
-        ))
+            self,
+            "hexEditor_edit_search_previous",
+        )
+        self.searchPrevAct.setStatusTip(self.tr("Search previous occurrence"))
+        self.searchPrevAct.setWhatsThis(
+            self.tr(
+                """<b>Search previous</b>"""
+                """<p>Search the previous occurrence of some data. The"""
+                """ previously entered search data are reused.</p>"""
+            )
+        )
         self.searchPrevAct.triggered.connect(
-            lambda: self.__searchWidget.findPrevNext(True))
+            lambda: self.__searchWidget.findPrevNext(True)
+        )
         self.__actions.append(self.searchPrevAct)
-        
+
         self.replaceAct = EricAction(
-            self.tr('Replace'),
-            self.tr('&Replace...'),
+            self.tr("Replace"),
+            self.tr("&Replace..."),
             QKeySequence(self.tr("Ctrl+R", "Search|Replace")),
             0,
-            self, 'hexEditor_edit_search_replace')
-        self.replaceAct.setStatusTip(self.tr('Replace data'))
-        self.replaceAct.setWhatsThis(self.tr(
-            """<b>Replace</b>"""
-            """<p>Search for some data and replace it."""
-            """ A dialog is shown to enter the data to search for and the"""
-            """ replacement data in various formats.</p>"""
-        ))
+            self,
+            "hexEditor_edit_search_replace",
+        )
+        self.replaceAct.setStatusTip(self.tr("Replace data"))
+        self.replaceAct.setWhatsThis(
+            self.tr(
+                """<b>Replace</b>"""
+                """<p>Search for some data and replace it."""
+                """ A dialog is shown to enter the data to search for and the"""
+                """ replacement data in various formats.</p>"""
+            )
+        )
         self.replaceAct.triggered.connect(self.__replace)
         self.__actions.append(self.replaceAct)
-        
+
         self.gotoAct = EricAction(
-            self.tr('Goto Offset'),
+            self.tr("Goto Offset"),
             UI.PixmapCache.getIcon("goto"),
-            self.tr('&Goto Offset...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+G", "Search|Goto Offset")),
+            self.tr("&Goto Offset..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+G", "Search|Goto Offset"
+                )
+            ),
             0,
-            self, 'hexEditor_edit_goto')
-        self.gotoAct.setStatusTip(self.tr('Goto Offset'))
-        self.gotoAct.setWhatsThis(self.tr(
-            """<b>Goto Offset</b>"""
-            """<p>Go to a specific address. A dialog is shown to enter"""
-            """ the movement data.</p>"""
-        ))
+            self,
+            "hexEditor_edit_goto",
+        )
+        self.gotoAct.setStatusTip(self.tr("Goto Offset"))
+        self.gotoAct.setWhatsThis(
+            self.tr(
+                """<b>Goto Offset</b>"""
+                """<p>Go to a specific address. A dialog is shown to enter"""
+                """ the movement data.</p>"""
+            )
+        )
         self.gotoAct.triggered.connect(self.__goto)
         self.__actions.append(self.gotoAct)
-        
+
         self.redoAct.setEnabled(False)
         self.__editor.canRedoChanged.connect(self.redoAct.setEnabled)
-        
+
         self.undoAct.setEnabled(False)
         self.__editor.canUndoChanged.connect(self.undoAct.setEnabled)
-        
+
         self.revertAct.setEnabled(False)
         self.__editor.dataChanged.connect(self.revertAct.setEnabled)
-        
+
         self.cutAct.setEnabled(False)
         self.copyAct.setEnabled(False)
         self.saveSelectionReadableAct.setEnabled(False)
         self.__editor.selectionAvailable.connect(self.__checkActions)
         self.__editor.selectionAvailable.connect(self.copyAct.setEnabled)
         self.__editor.selectionAvailable.connect(
-            self.saveSelectionReadableAct.setEnabled)
-    
+            self.saveSelectionReadableAct.setEnabled
+        )
+
     def __initHelpActions(self):
         """
         Private method to create the Help actions.
         """
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'hexEditor_help_about')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "hexEditor_help_about"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.__actions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'hexEditor_help_about_qt')
+            self.tr("About Qt"),
+            self.tr("About &Qt"),
+            0,
+            0,
+            self,
+            "hexEditor_help_about_qt",
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.__actions.append(self.aboutQtAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1", "Help|What's This?'")),
-            0, self, 'hexEditor_help_whats_this')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be accessed"""
-            """ using the context help button in the titlebar.</p>"""
-        ))
+            0,
+            self,
+            "hexEditor_help_whats_this",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be accessed"""
+                """ using the context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.__actions.append(self.whatsThisAct)
-    
+
     def __initConfigActions(self):
         """
         Private method to create the Settings actions.
         """
         self.prefAct = EricAction(
-            self.tr('Preferences'),
+            self.tr("Preferences"),
             UI.PixmapCache.getIcon("configure"),
-            self.tr('&Preferences...'),
-            0, 0, self, 'hexEditor_settings_preferences')
-        self.prefAct.setStatusTip(self.tr(
-            'Set the prefered configuration'))
-        self.prefAct.setWhatsThis(self.tr(
-            """<b>Preferences</b>"""
-            """<p>Set the configuration items of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("&Preferences..."),
+            0,
+            0,
+            self,
+            "hexEditor_settings_preferences",
+        )
+        self.prefAct.setStatusTip(self.tr("Set the prefered configuration"))
+        self.prefAct.setWhatsThis(
+            self.tr(
+                """<b>Preferences</b>"""
+                """<p>Set the configuration items of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.prefAct.triggered.connect(self.__showPreferences)
         self.prefAct.setMenuRole(QAction.MenuRole.PreferencesRole)
         self.__actions.append(self.prefAct)
-    
+
     def __setReadOnlyActionTexts(self):
         """
         Private method to switch the 'Open Read Only' action between
         'read only' and 'read write'.
         """
         if Preferences.getHexEditor("OpenReadOnly"):
-            self.openAct.setStatusTip(self.tr(
-                'Open a binary file for viewing'))
-            self.openAct.setWhatsThis(self.tr(
-                """<b>Open File</b>"""
-                """<p>This opens a binary file for viewing (i.e. in read"""
-                """ only mode). It pops up a file selection dialog.</p>"""
-            ))
-            
-            self.openReadOnlyAct.setText(self.tr('Open for Editing...'))
-            self.openReadOnlyAct.setIconText(self.tr('Open for Editing'))
-            self.openReadOnlyAct.setStatusTip(self.tr(
-                'Open a binary file for editing'))
-            self.openReadOnlyAct.setWhatsThis(self.tr(
-                """<b>Open for Editing</b>"""
-                """<p>This opens a binary file for editing."""
-                """ It pops up a file selection dialog.</p>"""
-            ))
+            self.openAct.setStatusTip(self.tr("Open a binary file for viewing"))
+            self.openAct.setWhatsThis(
+                self.tr(
+                    """<b>Open File</b>"""
+                    """<p>This opens a binary file for viewing (i.e. in read"""
+                    """ only mode). It pops up a file selection dialog.</p>"""
+                )
+            )
+
+            self.openReadOnlyAct.setText(self.tr("Open for Editing..."))
+            self.openReadOnlyAct.setIconText(self.tr("Open for Editing"))
+            self.openReadOnlyAct.setStatusTip(self.tr("Open a binary file for editing"))
+            self.openReadOnlyAct.setWhatsThis(
+                self.tr(
+                    """<b>Open for Editing</b>"""
+                    """<p>This opens a binary file for editing."""
+                    """ It pops up a file selection dialog.</p>"""
+                )
+            )
         else:
-            self.openAct.setStatusTip(self.tr(
-                'Open a binary file for editing'))
-            self.openAct.setWhatsThis(self.tr(
-                """<b>Open File</b>"""
-                """<p>This opens a binary file for editing."""
-                """ It pops up a file selection dialog.</p>"""
-            ))
-            
-            self.openReadOnlyAct.setText(self.tr('Open Read Only...'))
-            self.openReadOnlyAct.setIconText(self.tr('Open Read Only'))
-            self.openReadOnlyAct.setStatusTip(self.tr(
-                'Open a binary file for viewing'))
-            self.openReadOnlyAct.setWhatsThis(self.tr(
-                """<b>Open Read Only</b>"""
-                """<p>This opens a binary file for viewing (i.e. in read"""
-                """ only mode). It pops up a file selection dialog.</p>"""
-            ))
-    
+            self.openAct.setStatusTip(self.tr("Open a binary file for editing"))
+            self.openAct.setWhatsThis(
+                self.tr(
+                    """<b>Open File</b>"""
+                    """<p>This opens a binary file for editing."""
+                    """ It pops up a file selection dialog.</p>"""
+                )
+            )
+
+            self.openReadOnlyAct.setText(self.tr("Open Read Only..."))
+            self.openReadOnlyAct.setIconText(self.tr("Open Read Only"))
+            self.openReadOnlyAct.setStatusTip(self.tr("Open a binary file for viewing"))
+            self.openReadOnlyAct.setWhatsThis(
+                self.tr(
+                    """<b>Open Read Only</b>"""
+                    """<p>This opens a binary file for viewing (i.e. in read"""
+                    """ only mode). It pops up a file selection dialog.</p>"""
+                )
+            )
+
     def __initMenus(self):
         """
         Private method to create the menus.
         """
         mb = self.menuBar()
-        
-        menu = mb.addMenu(self.tr('&File'))
+
+        menu = mb.addMenu(self.tr("&File"))
         menu.setTearOffEnabled(True)
-        self.__recentMenu = QMenu(self.tr('Open &Recent Files'), menu)
+        self.__recentMenu = QMenu(self.tr("Open &Recent Files"), menu)
         menu.addAction(self.newWindowAct)
         menu.addAction(self.openAct)
         menu.addAction(self.openReadOnlyAct)
@@ -682,7 +804,7 @@
         menu.aboutToShow.connect(self.__showFileMenu)
         self.__recentMenu.aboutToShow.connect(self.__showRecentMenu)
         self.__recentMenu.triggered.connect(self.__openRecentHexFile)
-        
+
         menu = mb.addMenu(self.tr("&Edit"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.undoAct)
@@ -705,20 +827,20 @@
         menu.addAction(self.gotoAct)
         menu.addSeparator()
         menu.addAction(self.readonlyAct)
-        
+
         if not self.__fromEric:
             menu = mb.addMenu(self.tr("Se&ttings"))
             menu.setTearOffEnabled(True)
             menu.addAction(self.prefAct)
-        
+
         mb.addSeparator()
-        
+
         menu = mb.addMenu(self.tr("&Help"))
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
         menu.addSeparator()
         menu.addAction(self.whatsThisAct)
-    
+
     def __initToolbars(self):
         """
         Private method to create the toolbars.
@@ -735,7 +857,7 @@
         filetb.addAction(self.closeAct)
         if not self.__fromEric:
             filetb.addAction(self.exitAct)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setObjectName("EditToolBar")
         edittb.setIconSize(UI.Config.ToolBarIconSize)
@@ -745,129 +867,132 @@
         edittb.addAction(self.cutAct)
         edittb.addAction(self.copyAct)
         edittb.addAction(self.pasteAct)
-        
+
         searchtb = self.addToolBar(self.tr("Find"))
         searchtb.setObjectName("SearchToolBar")
         searchtb.setIconSize(UI.Config.ToolBarIconSize)
         searchtb.addAction(self.searchAct)
         searchtb.addAction(self.searchNextAct)
         searchtb.addAction(self.searchPrevAct)
-        
+
         if not self.__fromEric:
             settingstb = self.addToolBar(self.tr("Settings"))
             settingstb.setObjectName("SettingsToolBar")
             settingstb.setIconSize(UI.Config.ToolBarIconSize)
             settingstb.addAction(self.prefAct)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setObjectName("HelpToolBar")
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-    
+
     def __createStatusBar(self):
         """
         Private method to initialize the status bar.
         """
         self.__statusBar = self.statusBar()
         self.__statusBar.setSizeGripEnabled(True)
-        
+
         self.__sbAddress = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbAddress)
-        self.__sbAddress.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the cursor"""
-            """ address.</p>"""
-        ))
-        self.__sbAddress.setFrameStyle(
-            QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
-        
+        self.__sbAddress.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the cursor"""
+                """ address.</p>"""
+            )
+        )
+        self.__sbAddress.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
+
         self.__sbSelection = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbSelection)
-        self.__sbSelection.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays some selection"""
-            """ information.</p>"""
-        ))
-        self.__sbSelection.setFrameStyle(
-            QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
-        
+        self.__sbSelection.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays some selection"""
+                """ information.</p>"""
+            )
+        )
+        self.__sbSelection.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
+
         self.__sbSize = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbSize)
-        self.__sbSize.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the size of the"""
-            """ binary data.</p>"""
-        ))
-        self.__sbSize.setFrameStyle(
-            QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
-        
+        self.__sbSize.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the size of the"""
+                """ binary data.</p>"""
+            )
+        )
+        self.__sbSize.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
+
         self.__sbEditMode = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbEditMode)
-        self.__sbEditMode.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the edit mode.</p>"""
-        ))
-        self.__sbEditMode.setFrameStyle(
-            QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
+        self.__sbEditMode.setWhatsThis(
+            self.tr("""<p>This part of the status bar displays the edit mode.</p>""")
+        )
+        self.__sbEditMode.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
         self.__sbEditMode.clicked.connect(self.__toggleEditMode)
-        
+
         self.__sbReadOnly = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbReadOnly)
-        self.__sbReadOnly.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the read"""
-            """ only mode.</p>"""
-        ))
-        self.__sbReadOnly.setFrameStyle(
-            QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
+        self.__sbReadOnly.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the read"""
+                """ only mode.</p>"""
+            )
+        )
+        self.__sbReadOnly.setFrameStyle(QFrame.Shape.StyledPanel | QFrame.Shadow.Plain)
         self.__sbReadOnly.clicked.connect(self.__toggleReadOnlyMode)
 
         self.__showEditMode(self.__editor.overwriteMode())
         self.__showReadOnlyMode(self.__editor.isReadOnly())
-    
+
     @pyqtSlot(int)
     def __showAddress(self, address):
         """
         Private slot to show the address of the cursor position.
-        
+
         @param address address of the cursor
         @type int
         """
         txt = "{0:0{1}x}".format(address, self.__editor.addressWidth())
         txt = strGroup(txt, ":", 4)
         self.__sbAddress.setText(self.tr("Address: {0}").format(txt))
-    
+
     @pyqtSlot(bool)
     def __showSelectionInfo(self, avail):
         """
         Private slot to show selection information.
-        
+
         @param avail flag indicating the availability of a selection.
         @type bool
         """
         if avail:
             addrWidth = self.__editor.addressWidth()
-            start = "{0:0{1}x}".format(self.__editor.getSelectionBegin(),
-                                       addrWidth)
+            start = "{0:0{1}x}".format(self.__editor.getSelectionBegin(), addrWidth)
             start = strGroup(start, ":", 4)
-            end = "{0:0{1}x}".format(self.__editor.getSelectionEnd(),
-                                     addrWidth)
+            end = "{0:0{1}x}".format(self.__editor.getSelectionEnd(), addrWidth)
             end = strGroup(end, ":", 4)
             slen = self.__editor.getSelectionLength()
             self.__sbSelection.setText(
-                self.tr("Selection: {0} - {1} ({2} Bytes)",
-                        "0: start, 1: end, 2: selection length")
-                .format(start, end, QLocale().toString(slen))
+                self.tr(
+                    "Selection: {0} - {1} ({2} Bytes)",
+                    "0: start, 1: end, 2: selection length",
+                ).format(start, end, QLocale().toString(slen))
             )
         else:
             self.__sbSelection.setText(
-                self.tr("Selection: -", "no selection available"))
-    
+                self.tr("Selection: -", "no selection available")
+            )
+
     @pyqtSlot(bool)
     def __showReadOnlyMode(self, on):
         """
         Private slot to show the read only mode.
-        
+
         @param on flag indicating the read only state
         @type bool
         """
         self.__sbReadOnly.setText(self.tr("ro") if on else self.tr("rw"))
-    
+
     @pyqtSlot()
     def __toggleReadOnlyMode(self):
         """
@@ -875,18 +1000,19 @@
         bar label.
         """
         self.__editor.setReadOnly(not self.__editor.isReadOnly())
-    
+
     @pyqtSlot(bool)
     def __showEditMode(self, overwrite):
         """
         Private slot to show the edit mode.
-        
+
         @param overwrite flag indicating overwrite mode
         @type bool
         """
         self.__sbEditMode.setText(
-            self.tr("Overwrite") if overwrite else self.tr("Insert"))
-    
+            self.tr("Overwrite") if overwrite else self.tr("Insert")
+        )
+
     @pyqtSlot()
     def __toggleEditMode(self):
         """
@@ -894,22 +1020,21 @@
         label.
         """
         self.__editor.setOverwriteMode(not self.__editor.overwriteMode())
-    
+
     @pyqtSlot(int)
     def __showSize(self, size):
         """
         Private slot to show the binary data size.
-        
+
         @param size size of the binary data
         @type int
         """
-        self.__sbSize.setText(
-            self.tr("Size: {0}").format(QLocale().toString(size)))
-    
+        self.__sbSize.setText(self.tr("Size: {0}").format(QLocale().toString(size)))
+
     def closeEvent(self, evt):
         """
         Protected event handler for the close event.
-        
+
         @param evt reference to the close event
             <br />This event is simply accepted after the history has been
             saved and all window references have been deleted.
@@ -920,50 +1045,52 @@
             Preferences.setHexEditor("HexEditorState", state)
 
             Preferences.setGeometry("HexEditorGeometry", self.saveGeometry())
-            
+
             with contextlib.suppress(ValueError):
                 if self.__fromEric or len(self.__class__.windows) > 1:
-                    del self.__class__.windows[
-                        self.__class__.windows.index(self)]
-            
+                    del self.__class__.windows[self.__class__.windows.index(self)]
+
             if not self.__fromEric:
                 Preferences.syncPreferences()
-            
+
             self.__saveRecent()
-            
+
             evt.accept()
             self.editorClosed.emit()
         else:
             evt.ignore()
-    
+
     def __openHexFileNewWindow(self):
         """
         Private slot called to open a binary file in new hex editor window.
         """
         if (
-            not self.__lastOpenPath and
-            self.__project is not None and
-            self.__project.isOpen()
+            not self.__lastOpenPath
+            and self.__project is not None
+            and self.__project.isOpen()
         ):
             self.__lastOpenPath = self.__project.getProjectPath()
-        
+
         fileName = EricFileDialog.getOpenFileName(
             self,
             self.tr("Open binary file in new window"),
             self.__lastOpenPath,
-            self.tr("All Files (*)"))
+            self.tr("All Files (*)"),
+        )
         if fileName:
-            he = HexEditMainWindow(fileName=fileName,
-                                   parent=self.parent(),
-                                   fromEric=self.__fromEric,
-                                   project=self.__project)
+            he = HexEditMainWindow(
+                fileName=fileName,
+                parent=self.parent(),
+                fromEric=self.__fromEric,
+                project=self.__project,
+            )
             he.setRecentPaths("", self.__lastSavePath)
             he.show()
-    
+
     def __maybeSave(self):
         """
         Private method to ask the user to save the file, if it was modified.
-        
+
         @return flag indicating, if it is ok to continue
         @rtype bool
         """
@@ -972,65 +1099,70 @@
                 self,
                 self.tr("eric Hex Editor"),
                 self.tr("""The loaded file has unsaved changes."""),
-                self.__saveHexFile)
+                self.__saveHexFile,
+            )
             if not ret:
                 return False
         return True
-    
+
     def __loadHexFile(self, fileName):
         """
         Private method to load a binary file.
-        
+
         @param fileName name of the binary file to load
         @type str
         """
         if not os.path.exists(fileName):
             EricMessageBox.warning(
-                self, self.tr("eric Hex Editor"),
-                self.tr("The file '{0}' does not exist.")
-                .format(fileName))
+                self,
+                self.tr("eric Hex Editor"),
+                self.tr("The file '{0}' does not exist.").format(fileName),
+            )
             return
-        
+
         try:
             with open(fileName, "rb") as f:
                 data = f.read()
         except OSError as err:
             EricMessageBox.warning(
-                self, self.tr("eric Hex Editor"),
-                self.tr("<p>Cannot read file <b>{0}</b>.</p>"
-                        "<p>Reason: {1}</p>")
-                .format(fileName, str(err)))
+                self,
+                self.tr("eric Hex Editor"),
+                self.tr(
+                    "<p>Cannot read file <b>{0}</b>.</p>" "<p>Reason: {1}</p>"
+                ).format(fileName, str(err)),
+            )
             return
-        
+
         self.__lastOpenPath = os.path.dirname(fileName)
         self.__editor.setData(data)
         self.__setCurrentFile(fileName)
-        
+
         self.__editor.setReadOnly(Preferences.getHexEditor("OpenReadOnly"))
-        
+
         self.__gotoWidget.reset()
-    
+
     def __openHexFile(self):
         """
         Private slot to open a binary file.
         """
         if self.__maybeSave():
             if (
-                not self.__lastOpenPath and
-                self.__project is not None and
-                self.__project.isOpen()
+                not self.__lastOpenPath
+                and self.__project is not None
+                and self.__project.isOpen()
             ):
                 self.__lastOpenPath = self.__project.getProjectPath()
-            
+
             fileName = EricFileDialog.getOpenFileName(
                 self,
                 self.tr("Open binary file"),
                 self.__lastOpenPath,
-                self.tr("All Files (*)"))
+                self.tr("All Files (*)"),
+            )
             if fileName:
                 self.__loadHexFile(fileName)
         self.__checkActions()
-    
+
     def __openHexFileReadOnly(self):
         """
         Private slot to open a binary file in read only mode.
@@ -1038,68 +1170,71 @@
         self.__openHexFile()
         self.__editor.setReadOnly(not Preferences.getHexEditor("OpenReadOnly"))
         self.__checkActions()
-    
+
     def __saveHexFile(self):
         """
         Private method to save a binary file.
-        
+
         @return flag indicating success
         @rtype bool
         """
         ok = (
             self.__saveHexDataFile(self.__fileName)
-            if self.__fileName else
-            self.__saveHexFileAs()
+            if self.__fileName
+            else self.__saveHexFileAs()
         )
-        
+
         if ok:
             self.__editor.undoStack().setClean()
-        
+
         return ok
-    
+
     def __saveHexFileAs(self):
         """
         Private method to save the data to a new file.
-        
+
         @return flag indicating success
         @rtype bool
         """
         if (
-            not self.__lastSavePath and
-            self.__project is not None and
-            self.__project.isOpen()
+            not self.__lastSavePath
+            and self.__project is not None
+            and self.__project.isOpen()
         ):
             self.__lastSavePath = self.__project.getProjectPath()
         if not self.__lastSavePath and self.__lastOpenPath:
             self.__lastSavePath = self.__lastOpenPath
-        
+
         fileName = EricFileDialog.getSaveFileName(
             self,
             self.tr("Save binary file"),
             self.__lastSavePath,
             self.tr("All Files (*)"),
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if not fileName:
             return False
-        
+
         if pathlib.Path(fileName).exists():
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save binary file"),
-                self.tr("<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fileName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fileName),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return False
-        
+
         self.__lastSavePath = os.path.dirname(fileName)
-        
+
         return self.__saveHexDataFile(fileName)
-    
+
     def __saveHexDataFile(self, fileName):
         """
         Private method to save the binary data to a file.
-        
+
         @param fileName name of the file to write to
         @type str
         @return flag indicating success
@@ -1110,49 +1245,48 @@
                 f.write(self.__editor.data())
         except OSError as err:
             EricMessageBox.warning(
-                self, self.tr("eric Hex Editor"),
-                self.tr("<p>Cannot write file <b>{0}</b>.</p>"
-                        "<p>Reason: {1}</p>")
-                .format(fileName, str(err)))
+                self,
+                self.tr("eric Hex Editor"),
+                self.tr(
+                    "<p>Cannot write file <b>{0}</b>.</p>" "<p>Reason: {1}</p>"
+                ).format(fileName, str(err)),
+            )
             self.__checkActions()
             return False
-        
+
         self.__editor.setModified(False, setCleanState=True)
-        
+
         self.__setCurrentFile(fileName)
         self.__statusBar.showMessage(self.tr("File saved"), 2000)
-        
+
         self.__checkActions()
-        
+
         return True
-    
+
     def __saveHexFileReadable(self, selectionOnly=False):
         """
         Private method to save the binary data in readable format.
-        
+
         @param selectionOnly flag indicating to save the selection only
         @type bool
         """
         savePath = self.__lastSavePath
-        if (
-            not savePath and
-            self.__project is not None and
-            self.__project.isOpen()
-        ):
+        if not savePath and self.__project is not None and self.__project.isOpen():
             savePath = self.__project.getProjectPath()
         if not savePath and self.__lastOpenPath:
             savePath = self.__lastOpenPath
-        
+
         fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save to readable file"),
             savePath,
             self.tr("Text Files (*.txt);;All Files (*)"),
             self.tr("Text Files (*.txt)"),
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if not fileName:
             return
-        
+
         fpath = pathlib.Path(fileName)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -1162,44 +1296,48 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save to readable file"),
-                self.tr("<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         readableData = (
             self.__editor.selectionToReadableString()
-            if selectionOnly else
-            self.__editor.toReadableString()
+            if selectionOnly
+            else self.__editor.toReadableString()
         )
         try:
             with fpath.open("w", encoding="latin1") as f:
                 f.write(readableData)
         except OSError as err:
             EricMessageBox.warning(
-                self, self.tr("eric Hex Editor"),
-                self.tr("<p>Cannot write file <b>{0}</b>.</p>"
-                        "<p>Reason: {1}</p>")
-                .format(fpath, str(err)))
+                self,
+                self.tr("eric Hex Editor"),
+                self.tr(
+                    "<p>Cannot write file <b>{0}</b>.</p>" "<p>Reason: {1}</p>"
+                ).format(fpath, str(err)),
+            )
             return
-        
+
         self.__statusBar.showMessage(self.tr("File saved"), 2000)
-    
+
     def __saveSelectionReadable(self):
         """
         Private method to save the data of the current selection in readable
         format.
         """
         self.__saveHexFileReadable(selectionOnly=True)
-    
+
     def __closeAll(self):
         """
         Private slot to close all windows.
         """
         self.__closeOthers()
         self.close()
-    
+
     def __closeOthers(self):
         """
         Private slot to close all other windows.
@@ -1211,40 +1349,41 @@
     def __setCurrentFile(self, fileName):
         """
         Private method to register the file name of the current file.
-        
+
         @param fileName name of the file to register
         @type str
         """
         self.__fileName = fileName
         # insert filename into list of recently opened files
         self.__addToRecentList(fileName)
-        
+
         shownName = (
             self.tr("Untitled")
-            if not self.__fileName else
-            self.__strippedName(self.__fileName)
+            if not self.__fileName
+            else self.__strippedName(self.__fileName)
         )
-        
-        self.setWindowTitle(self.tr("{0}[*] - {1}")
-                            .format(shownName, self.tr("Hex Editor")))
-        
+
+        self.setWindowTitle(
+            self.tr("{0}[*] - {1}").format(shownName, self.tr("Hex Editor"))
+        )
+
         self.setWindowModified(self.__editor.isModified())
-    
+
     def __strippedName(self, fullFileName):
         """
         Private method to return the filename part of the given path.
-        
+
         @param fullFileName full pathname of the given file
         @type str
         @return filename part
         @rtype str
         """
         return pathlib.Path(fullFileName).name
-    
+
     def setRecentPaths(self, openPath, savePath):
         """
         Public method to set the last open and save paths.
-        
+
         @param openPath least recently used open path
         @type str
         @param savePath least recently used save path
@@ -1254,51 +1393,56 @@
             self.__lastOpenPath = openPath
         if savePath:
             self.__lastSavePath = savePath
-    
+
     @pyqtSlot()
     def __checkActions(self):
         """
         Private slot to check some actions for their enable/disable status.
         """
         self.saveAct.setEnabled(self.__editor.isModified())
-        
-        self.cutAct.setEnabled(not self.__editor.isReadOnly() and
-                               self.__editor.hasSelection())
+
+        self.cutAct.setEnabled(
+            not self.__editor.isReadOnly() and self.__editor.hasSelection()
+        )
         self.pasteAct.setEnabled(not self.__editor.isReadOnly())
         self.replaceAct.setEnabled(not self.__editor.isReadOnly())
-    
+
     @pyqtSlot(bool)
     def __modificationChanged(self, m):
         """
         Private slot to handle the dataChanged signal.
-        
+
         @param m modification status
         @type bool
         """
         self.setWindowModified(m)
         self.__checkActions()
-    
+
     def __about(self):
         """
         Private slot to show a little About message.
         """
         EricMessageBox.about(
-            self, self.tr("About eric Hex Editor"),
-            self.tr("The eric Hex Editor is a simple editor component"
-                    " to edit binary files."))
-    
+            self,
+            self.tr("About eric Hex Editor"),
+            self.tr(
+                "The eric Hex Editor is a simple editor component"
+                " to edit binary files."
+            ),
+        )
+
     def __aboutQt(self):
         """
         Private slot to handle the About Qt dialog.
         """
         EricMessageBox.aboutQt(self, "eric Hex Editor")
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-        
+
     def __search(self):
         """
         Private method to handle the search action.
@@ -1306,12 +1450,10 @@
         self.__replaceWidget.hide()
         self.__gotoWidget.hide()
         txt = (
-            self.__editor.selectionToHexString()
-            if self.__editor.hasSelection() else
-            ""
+            self.__editor.selectionToHexString() if self.__editor.hasSelection() else ""
         )
         self.__searchWidget.show(txt)
-        
+
     def __replace(self):
         """
         Private method to handle the replace action.
@@ -1319,12 +1461,10 @@
         self.__searchWidget.hide()
         self.__gotoWidget.hide()
         txt = (
-            self.__editor.selectionToHexString()
-            if self.__editor.hasSelection() else
-            ""
+            self.__editor.selectionToHexString() if self.__editor.hasSelection() else ""
         )
         self.__replaceWidget.show(txt)
-    
+
     def __goto(self):
         """
         Private method to handle the goto action.
@@ -1332,36 +1472,38 @@
         self.__searchWidget.hide()
         self.__replaceWidget.hide()
         self.__gotoWidget.show()
-    
+
     def preferencesChanged(self):
         """
         Public method to (re-)read the various settings.
         """
-        self.__editor.setAddressWidth(
-            Preferences.getHexEditor("AddressAreaWidth"))
-        self.__editor.setAddressArea(
-            Preferences.getHexEditor("ShowAddressArea"))
-        self.__editor.setAsciiArea(
-            Preferences.getHexEditor("ShowAsciiArea"))
-        self.__editor.setHighlighting(
-            Preferences.getHexEditor("HighlightChanges"))
-        self.__editor.setFont(
-            Preferences.getHexEditor("Font"))
-        
+        self.__editor.setAddressWidth(Preferences.getHexEditor("AddressAreaWidth"))
+        self.__editor.setAddressArea(Preferences.getHexEditor("ShowAddressArea"))
+        self.__editor.setAsciiArea(Preferences.getHexEditor("ShowAsciiArea"))
+        self.__editor.setHighlighting(Preferences.getHexEditor("HighlightChanges"))
+        self.__editor.setFont(Preferences.getHexEditor("Font"))
+
         self.__setReadOnlyActionTexts()
-    
+
     def __showPreferences(self):
         """
         Private slot to set the preferences.
         """
         from Preferences.ConfigurationDialog import (
-            ConfigurationDialog, ConfigurationMode
+            ConfigurationDialog,
+            ConfigurationMode,
         )
+
         dlg = ConfigurationDialog(
-            None, 'Configuration', True, fromEric=True,
-            displayMode=ConfigurationMode.HEXEDITORMODE)
+            None,
+            "Configuration",
+            True,
+            fromEric=True,
+            displayMode=ConfigurationMode.HEXEDITORMODE,
+        )
         dlg.preferencesChanged.connect(
-            self.__preferencesChangedByLocalPreferencesDialog)
+            self.__preferencesChangedByLocalPreferencesDialog
+        )
         dlg.show()
         dlg.showConfigurationPageByName("hexEditorPage")
         dlg.exec()
@@ -1370,62 +1512,62 @@
             dlg.setPreferences()
             Preferences.syncPreferences()
             self.__preferencesChangedByLocalPreferencesDialog()
-    
+
     def __preferencesChangedByLocalPreferencesDialog(self):
         """
         Private slot to handle preferences changes by our local dialog.
         """
         for hexEditor in HexEditMainWindow.windows:
             hexEditor.preferencesChanged()
-    
+
     def getSRHistory(self, key):
         """
         Public method to get the search or replace history list.
-        
+
         @param key name of list to return
         @type str (must be 'search' or 'replace')
         @return the requested history list
         @rtype list of tuples of (int, str)
         """
-        if key in ['search', 'replace']:
+        if key in ["search", "replace"]:
             return self.__srHistory[key]
-        
+
         return []
-    
+
     @pyqtSlot()
     def __showFileMenu(self):
         """
         Private slot to modify the file menu before being shown.
         """
         self.__menuRecentAct.setEnabled(len(self.__recent) > 0)
-    
+
     @pyqtSlot()
     def __showRecentMenu(self):
         """
         Private slot to set up the recent files menu.
         """
         self.__loadRecent()
-        
+
         self.__recentMenu.clear()
-        
+
         for idx, rs in enumerate(self.__recent, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.__recentMenu.addAction(
                 formatStr.format(
-                    idx,
-                    Utilities.compactPath(
-                        rs, HexEditMainWindow.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rs, HexEditMainWindow.maxMenuFilePathLen)
+                )
+            )
             act.setData(rs)
             act.setEnabled(pathlib.Path(rs).exists())
-        
+
         self.__recentMenu.addSeparator()
-        self.__recentMenu.addAction(self.tr('&Clear'), self.__clearRecent)
-    
+        self.__recentMenu.addAction(self.tr("&Clear"), self.__clearRecent)
+
     @pyqtSlot(QAction)
     def __openRecentHexFile(self, act):
         """
         Private method to open a file from the list of recently opened files.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         fileName = act.data()
@@ -1433,14 +1575,14 @@
             self.__loadHexFile(fileName)
             self.__editor.setReadOnly(Preferences.getHexEditor("OpenReadOnly"))
             self.__checkActions()
-    
+
     @pyqtSlot()
     def __clearRecent(self):
         """
         Private method to clear the list of recently opened files.
         """
         self.__recent = []
-    
+
     def __loadRecent(self):
         """
         Private method to load the list of recently opened files.
@@ -1452,18 +1594,18 @@
             for f in Preferences.toList(rs):
                 if pathlib.Path(f).exists():
                     self.__recent.append(f)
-        
+
     def __saveRecent(self):
         """
         Private method to save the list of recently opened files.
         """
         Preferences.Prefs.rsettings.setValue(recentNameHexFiles, self.__recent)
         Preferences.Prefs.rsettings.sync()
-    
+
     def __addToRecentList(self, fileName):
         """
         Private method to add a file name to the list of recently opened files.
-        
+
         @param fileName name of the file to be added
         """
         if fileName:
--- a/src/eric7/HexEdit/HexEditSearchReplaceWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditSearchReplaceWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     """
     Class implementing a search and replace widget for the hex editor.
     """
+
     def __init__(self, editor, mainWindow, replace=False, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the hex editor widget
         @type HexEditWidget
         @param mainWindow reference to the main window
@@ -35,54 +36,61 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__replace = replace
         self.__editor = editor
-        
+
         # keep this in sync with the logic in __getContent()
         self.__formatAndValidators = {
-            "hex": (self.tr("Hex"), QRegularExpressionValidator(
-                QRegularExpression("[0-9a-f]*"))),
-            "dec": (self.tr("Dec"), QRegularExpressionValidator(
-                QRegularExpression("[0-9]*"))),
-            "oct": (self.tr("Oct"), QRegularExpressionValidator(
-                QRegularExpression("[0-7]*"))),
-            "bin": (self.tr("Bin"), QRegularExpressionValidator(
-                QRegularExpression("[01]*"))),
+            "hex": (
+                self.tr("Hex"),
+                QRegularExpressionValidator(QRegularExpression("[0-9a-f]*")),
+            ),
+            "dec": (
+                self.tr("Dec"),
+                QRegularExpressionValidator(QRegularExpression("[0-9]*")),
+            ),
+            "oct": (
+                self.tr("Oct"),
+                QRegularExpressionValidator(QRegularExpression("[0-7]*")),
+            ),
+            "bin": (
+                self.tr("Bin"),
+                QRegularExpressionValidator(QRegularExpression("[01]*")),
+            ),
             "iso-8859-1": (self.tr("Text"), None),
             # text as latin-1/iso-8859-1
             "utf-8": (self.tr("UTF-8"), None),
             # text as utf-8
         }
         formatOrder = ["hex", "dec", "oct", "bin", "iso-8859-1", "utf-8"]
-        
+
         self.__currentFindFormat = ""
         self.__currentReplaceFormat = ""
-        
+
         self.__findHistory = mainWindow.getSRHistory("search")
         if replace:
             from .Ui_HexEditReplaceWidget import Ui_HexEditReplaceWidget
+
             self.__replaceHistory = mainWindow.getSRHistory("replace")
             self.__ui = Ui_HexEditReplaceWidget()
         else:
             from .Ui_HexEditSearchWidget import Ui_HexEditSearchWidget
+
             self.__ui = Ui_HexEditSearchWidget()
         self.__ui.setupUi(self)
-        
+
         self.__ui.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
-        self.__ui.findPrevButton.setIcon(
-            UI.PixmapCache.getIcon("1leftarrow"))
-        self.__ui.findNextButton.setIcon(
-            UI.PixmapCache.getIcon("1rightarrow"))
-        
+        self.__ui.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
+        self.__ui.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
+
         if replace:
-            self.__ui.replaceButton.setIcon(
-                UI.PixmapCache.getIcon("editReplace"))
+            self.__ui.replaceButton.setIcon(UI.PixmapCache.getIcon("editReplace"))
             self.__ui.replaceSearchButton.setIcon(
-                UI.PixmapCache.getIcon("editReplaceSearch"))
-            self.__ui.replaceAllButton.setIcon(
-                UI.PixmapCache.getIcon("editReplaceAll"))
-        
+                UI.PixmapCache.getIcon("editReplaceSearch")
+            )
+            self.__ui.replaceAllButton.setIcon(UI.PixmapCache.getIcon("editReplaceAll"))
+
         for dataFormat in formatOrder:
             formatStr, validator = self.__formatAndValidators[dataFormat]
             self.__ui.findFormatCombo.addItem(formatStr, dataFormat)
@@ -90,60 +98,70 @@
             for dataFormat in formatOrder:
                 formatStr, validator = self.__formatAndValidators[dataFormat]
                 self.__ui.replaceFormatCombo.addItem(formatStr, dataFormat)
-        
+
         self.__ui.findtextCombo.setCompleter(None)
         self.__ui.findtextCombo.lineEdit().returnPressed.connect(
-            self.__findByReturnPressed)
+            self.__findByReturnPressed
+        )
         if replace:
             self.__ui.replacetextCombo.setCompleter(None)
             self.__ui.replacetextCombo.lineEdit().returnPressed.connect(
-                self.on_replaceButton_clicked)
-        
+                self.on_replaceButton_clicked
+            )
+
         self.findNextAct = EricAction(
-            self.tr('Find Next'),
-            self.tr('Find Next'),
-            0, 0, self, 'hexEditor_search_widget_find_next')
+            self.tr("Find Next"),
+            self.tr("Find Next"),
+            0,
+            0,
+            self,
+            "hexEditor_search_widget_find_next",
+        )
         self.findNextAct.triggered.connect(self.on_findNextButton_clicked)
         self.findNextAct.setEnabled(False)
         self.__ui.findtextCombo.addAction(self.findNextAct)
-        
+
         self.findPrevAct = EricAction(
-            self.tr('Find Prev'),
-            self.tr('Find Prev'),
-            0, 0, self, 'hexEditor_search_widget_find_prev')
+            self.tr("Find Prev"),
+            self.tr("Find Prev"),
+            0,
+            0,
+            self,
+            "hexEditor_search_widget_find_prev",
+        )
         self.findPrevAct.triggered.connect(self.on_findPrevButton_clicked)
         self.findPrevAct.setEnabled(False)
         self.__ui.findtextCombo.addAction(self.findPrevAct)
-        
+
         self.__havefound = False
-    
+
     @pyqtSlot(int)
     def on_findFormatCombo_currentIndexChanged(self, idx):
         """
         Private slot to handle a selection from the find format.
-        
+
         @param idx index of the selected entry
         @type int
         """
         if idx >= 0:
             findFormat = self.__ui.findFormatCombo.itemData(idx)
-            
+
             if findFormat != self.__currentFindFormat:
                 txt = self.__ui.findtextCombo.currentText()
-                newTxt = self.__convertText(
-                    txt, self.__currentFindFormat, findFormat)
+                newTxt = self.__convertText(txt, self.__currentFindFormat, findFormat)
                 self.__currentFindFormat = findFormat
-                
+
                 self.__ui.findtextCombo.setValidator(
-                    self.__formatAndValidators[findFormat][1])
-                
+                    self.__formatAndValidators[findFormat][1]
+                )
+
                 self.__ui.findtextCombo.setEditText(newTxt)
-    
+
     @pyqtSlot(str)
     def on_findtextCombo_editTextChanged(self, txt):
         """
         Private slot to enable/disable the find buttons.
-        
+
         @param txt text of the find text combo
         @type str
         """
@@ -165,12 +183,12 @@
                 self.__ui.replaceButton.setEnabled(False)
                 self.__ui.replaceSearchButton.setEnabled(False)
                 self.__ui.replaceAllButton.setEnabled(True)
-    
+
     @pyqtSlot(int)
     def on_findtextCombo_activated(self, idx):
         """
         Private slot to handle a selection from the find history.
-        
+
         @param idx index of the selected entry
         @type int
         """
@@ -178,12 +196,12 @@
             formatIndex = self.__ui.findtextCombo.itemData(idx)
             if formatIndex is not None:
                 self.__ui.findFormatCombo.setCurrentIndex(formatIndex)
-    
+
     def __getContent(self, replace=False):
         """
         Private method to get the contents of the find/replace combo as
         a bytearray.
-        
+
         @param replace flag indicating to retrieve the replace contents
         @type bool
         @return search or replace term as text and binary data
@@ -197,12 +215,12 @@
             textCombo = self.__ui.findtextCombo
             formatCombo = self.__ui.findFormatCombo
             history = self.__findHistory
-        
+
         txt = textCombo.currentText()
         idx = formatCombo.currentIndex()
         findFormat = formatCombo.itemData(idx)
         ba = self.__text2bytearray(txt, findFormat)
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         historyEntry = (idx, txt)
@@ -212,27 +230,27 @@
         textCombo.clear()
         for index, text in history:
             textCombo.addItem(text, index)
-        
+
         return ba, txt
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next occurrence.
         """
         self.findPrevNext(False)
-    
+
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
         """
         Private slot to find the previous occurrence.
         """
         self.findPrevNext(True)
-    
+
     def findPrevNext(self, prev=False):
         """
         Public slot to find the next occurrence of the search term.
-        
+
         @param prev flag indicating a backwards search
         @type bool
         @return flag indicating a successful search
@@ -241,41 +259,41 @@
         if not self.__havefound or not self.__ui.findtextCombo.currentText():
             self.show()
             return False
-        
+
         self.__findBackwards = prev
         ba, txt = self.__getContent()
-        
+
         idx = -1
         if len(ba) > 0:
             startIndex = self.__editor.cursorPosition() // 2
             if prev:
                 if (
-                    self.__editor.hasSelection() and
-                    startIndex == self.__editor.getSelectionEnd()
+                    self.__editor.hasSelection()
+                    and startIndex == self.__editor.getSelectionEnd()
                 ):
                     # skip to the selection start
                     startIndex = self.__editor.getSelectionBegin()
                 idx = self.__editor.lastIndexOf(ba, startIndex)
             else:
                 if (
-                    self.__editor.hasSelection() and
-                    startIndex == self.__editor.getSelectionBegin() - 1
+                    self.__editor.hasSelection()
+                    and startIndex == self.__editor.getSelectionBegin() - 1
                 ):
                     # skip to the selection end
                     startIndex = self.__editor.getSelectionEnd()
                 idx = self.__editor.indexOf(ba, startIndex)
-        
+
         if idx >= 0:
             if self.__replace:
                 self.__ui.replaceButton.setEnabled(True)
                 self.__ui.replaceSearchButton.setEnabled(True)
         else:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("'{0}' was not found.").format(txt))
-        
+                self, self.windowTitle(), self.tr("'{0}' was not found.").format(txt)
+            )
+
         return idx >= 0
-    
+
     def __findByReturnPressed(self):
         """
         Private slot to handle a return pressed in the find combo.
@@ -284,34 +302,36 @@
             self.findPrevNext(True)
         else:
             self.findPrevNext(False)
-    
+
     @pyqtSlot(int)
     def on_replaceFormatCombo_currentIndexChanged(self, idx):
         """
         Private slot to handle a selection from the replace format.
-        
+
         @param idx index of the selected entry
         @type int
         """
         if idx >= 0:
             replaceFormat = self.__ui.replaceFormatCombo.itemData(idx)
-            
+
             if replaceFormat != self.__currentReplaceFormat:
                 txt = self.__ui.replacetextCombo.currentText()
                 newTxt = self.__convertText(
-                    txt, self.__currentReplaceFormat, replaceFormat)
+                    txt, self.__currentReplaceFormat, replaceFormat
+                )
                 self.__currentReplaceFormat = replaceFormat
-                
+
                 self.__ui.replacetextCombo.setValidator(
-                    self.__formatAndValidators[replaceFormat][1])
-                
+                    self.__formatAndValidators[replaceFormat][1]
+                )
+
                 self.__ui.replacetextCombo.setEditText(newTxt)
-    
+
     @pyqtSlot(int)
     def on_replacetextCombo_activated(self, idx):
         """
         Private slot to handle a selection from the replace history.
-        
+
         @param idx index of the selected entry
         @type int
         """
@@ -326,7 +346,7 @@
         Private slot to replace one occurrence of data.
         """
         self.__doReplace(False)
-    
+
     @pyqtSlot()
     def on_replaceSearchButton_clicked(self):
         """
@@ -334,49 +354,49 @@
         one.
         """
         self.__doReplace(True)
-    
+
     def __doReplace(self, searchNext):
         """
         Private method to replace one occurrence of data.
-        
+
         @param searchNext flag indicating to search for the next occurrence
         @type bool
         """
         # Check enabled status due to dual purpose usage of this method
         if (
-            not self.__ui.replaceButton.isEnabled() and
-            not self.__ui.replaceSearchButton.isEnabled()
+            not self.__ui.replaceButton.isEnabled()
+            and not self.__ui.replaceSearchButton.isEnabled()
         ):
             return
-        
+
         fba, ftxt = self.__getContent(False)
         rba, rtxt = self.__getContent(True)
-        
+
         ok = False
         if self.__editor.hasSelection():
             # we did a successful search before
             startIdx = self.__editor.getSelectionBegin()
             self.__editor.replaceByteArray(startIdx, len(fba), rba)
-            
+
             if searchNext:
                 ok = self.findPrevNext(self.__findBackwards)
-        
+
         if not ok:
             self.__ui.replaceButton.setEnabled(False)
             self.__ui.replaceSearchButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def on_replaceAllButton_clicked(self):
         """
         Private slot to replace all occurrences of data.
         """
         replacements = 0
-        
+
         cursorPosition = self.__editor.cursorPosition()
-        
+
         fba, ftxt = self.__getContent(False)
         rba, rtxt = self.__getContent(True)
-        
+
         idx = 0
         while idx >= 0:
             idx = self.__editor.indexOf(fba, idx)
@@ -384,76 +404,78 @@
                 self.__editor.replaceByteArray(idx, len(fba), rba)
                 idx += len(rba)
                 replacements += 1
-        
+
         if replacements:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("Replaced {0} occurrences.")
-                .format(replacements))
+                self,
+                self.windowTitle(),
+                self.tr("Replaced {0} occurrences.").format(replacements),
+            )
         else:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("Nothing replaced because '{0}' was not found.")
-                .format(ftxt))
-        
+                self,
+                self.windowTitle(),
+                self.tr("Nothing replaced because '{0}' was not found.").format(ftxt),
+            )
+
         self.__editor.setCursorPosition(cursorPosition)
         self.__editor.ensureVisible()
-    
-    def __showFind(self, text=''):
+
+    def __showFind(self, text=""):
         """
         Private method to display this widget in find mode.
-        
+
         @param text hex encoded text to be shown in the findtext edit
         @type str
         """
         self.__replace = False
-        
+
         self.__ui.findtextCombo.clear()
         for index, txt in self.__findHistory:
             self.__ui.findtextCombo.addItem(txt, index)
-        self.__ui.findFormatCombo.setCurrentIndex(0)    # 0 is always Hex
+        self.__ui.findFormatCombo.setCurrentIndex(0)  # 0 is always Hex
         self.on_findFormatCombo_currentIndexChanged(0)
         self.__ui.findtextCombo.setEditText(text)
         self.__ui.findtextCombo.lineEdit().selectAll()
         self.__ui.findtextCombo.setFocus()
         self.on_findtextCombo_editTextChanged(text)
-        
+
         self.__havefound = True
         self.__findBackwards = False
-    
-    def __showReplace(self, text=''):
+
+    def __showReplace(self, text=""):
         """
         Private slot to display this widget in replace mode.
-        
+
         @param text hex encoded text to be shown in the findtext edit
         @type str
         """
         self.__replace = True
-        
+
         self.__ui.findtextCombo.clear()
         for index, txt in self.__findHistory:
             self.__ui.findtextCombo.addItem(txt, index)
-        self.__ui.findFormatCombo.setCurrentIndex(0)    # 0 is always Hex
+        self.__ui.findFormatCombo.setCurrentIndex(0)  # 0 is always Hex
         self.on_findFormatCombo_currentIndexChanged(0)
         self.__ui.findtextCombo.setEditText(text)
         self.__ui.findtextCombo.lineEdit().selectAll()
         self.__ui.findtextCombo.setFocus()
         self.on_findtextCombo_editTextChanged(text)
-        
+
         self.__ui.replacetextCombo.clear()
         for index, txt in self.__replaceHistory:
             self.__ui.replacetextCombo.addItem(txt, index)
-        self.__ui.replaceFormatCombo.setCurrentIndex(0)    # 0 is always Hex
+        self.__ui.replaceFormatCombo.setCurrentIndex(0)  # 0 is always Hex
         self.on_replaceFormatCombo_currentIndexChanged(0)
-        self.__ui.replacetextCombo.setEditText('')
-        
+        self.__ui.replacetextCombo.setEditText("")
+
         self.__havefound = True
         self.__findBackwards = False
-    
-    def show(self, text=''):
+
+    def show(self, text=""):
         """
         Public slot to show the widget.
-        
+
         @param text hex encoded text to be shown in the findtext edit
         @type str
         """
@@ -463,7 +485,7 @@
             self.__showFind(text)
         super().show()
         self.activateWindow()
-    
+
     @pyqtSlot()
     def on_closeButton_clicked(self):
         """
@@ -475,17 +497,17 @@
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event
         @type QKeyEvent
         """
         if event.key() == Qt.Key.Key_Escape:
             self.close()
-    
+
     def __convertText(self, txt, oldFormat, newFormat):
         """
         Private method to convert text from one format into another.
-        
+
         @param txt text to be converted
         @type str
         @param oldFormat current format of the text
@@ -498,16 +520,16 @@
         if txt and oldFormat and newFormat and oldFormat != newFormat:
             # step 1: convert the text to a byte array using the old format
             byteArray = self.__text2bytearray(txt, oldFormat)
-            
+
             # step 2: convert the byte array to text using the new format
             txt = self.__bytearray2text(byteArray, newFormat)
-        
+
         return txt
-    
+
     def __int2bytearray(self, value):
         """
         Private method to convert an integer to a byte array.
-        
+
         @param value value to be converted
         @type int
         @return byte array for the given value
@@ -517,13 +539,13 @@
         while value > 0:
             value, modulus = divmod(value, 256)
             ba.insert(0, modulus)
-        
+
         return ba
-    
+
     def __bytearray2int(self, array):
         """
         Private method to convert a byte array to an integer value.
-        
+
         @param array byte array to be converted
         @type bytearray
         @return integer value of the given array
@@ -532,13 +554,13 @@
         value = 0
         for b in array:
             value = value * 256 + b
-        
+
         return value
-    
+
     def __text2bytearray(self, txt, dataFormat):
         """
         Private method to convert a text to a byte array.
-        
+
         @param txt text to be converted
         @type str
         @param dataFormat format of the text
@@ -550,27 +572,26 @@
         """
         if dataFormat not in self.__formatAndValidators.keys():
             raise ValueError("Bad value for 'dataFormat' parameter.")
-        
-        if dataFormat == "hex":             # hex format
-            ba = bytearray(QByteArray.fromHex(
-                bytes(txt, encoding="ascii")))
-        elif dataFormat == "dec":           # decimal format
+
+        if dataFormat == "hex":  # hex format
+            ba = bytearray(QByteArray.fromHex(bytes(txt, encoding="ascii")))
+        elif dataFormat == "dec":  # decimal format
             ba = self.__int2bytearray(int(txt, 10))
-        elif dataFormat == "oct":           # octal format
+        elif dataFormat == "oct":  # octal format
             ba = self.__int2bytearray(int(txt, 8))
-        elif dataFormat == "bin":           # binary format
+        elif dataFormat == "bin":  # binary format
             ba = self.__int2bytearray(int(txt, 2))
-        elif dataFormat == "iso-8859-1":    # latin-1/iso-8859-1 text
+        elif dataFormat == "iso-8859-1":  # latin-1/iso-8859-1 text
             ba = bytearray(txt, encoding="iso-8859-1")
-        elif dataFormat == "utf-8":         # utf-8 text
+        elif dataFormat == "utf-8":  # utf-8 text
             ba = bytearray(txt, encoding="utf-8")
-        
+
         return ba
-    
+
     def __bytearray2text(self, array, dataFormat):
         """
         Private method to convert a byte array to a text.
-        
+
         @param array byte array to be converted
         @type bytearray
         @param dataFormat format of the text
@@ -582,18 +603,18 @@
         """
         if dataFormat not in self.__formatAndValidators.keys():
             raise ValueError("Bad value for 'dataFormat' parameter.")
-        
-        if dataFormat == "hex":             # hex format
+
+        if dataFormat == "hex":  # hex format
             txt = "{0:x}".format(self.__bytearray2int(array))
-        elif dataFormat == "dec":           # decimal format
+        elif dataFormat == "dec":  # decimal format
             txt = "{0:d}".format(self.__bytearray2int(array))
-        elif dataFormat == "oct":           # octal format
+        elif dataFormat == "oct":  # octal format
             txt = "{0:o}".format(self.__bytearray2int(array))
-        elif dataFormat == "bin":           # binary format
+        elif dataFormat == "bin":  # binary format
             txt = "{0:b}".format(self.__bytearray2int(array))
-        elif dataFormat == "iso-8859-1":    # latin-1/iso-8859-1 text
+        elif dataFormat == "iso-8859-1":  # latin-1/iso-8859-1 text
             txt = str(array, encoding="iso-8859-1")
-        elif dataFormat == "utf-8":         # utf-8 text
+        elif dataFormat == "utf-8":  # utf-8 text
             txt = str(array, encoding="utf-8", errors="replace")
-        
+
         return txt
--- a/src/eric7/HexEdit/HexEditUndoStack.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditUndoStack.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,6 +16,7 @@
     """
     Class implementing the edit commands.
     """
+
     INSERT = 0
     REMOVEAT = 1
     OVERWRITE = 2
@@ -25,10 +26,11 @@
     """
     Class implementing the Undo command.
     """
+
     def __init__(self, chunks, cmd, pos, newByte, parent=None):
         """
         Constructor
-        
+
         @param chunks reference to the data container
         @type HexEditChunks
         @param cmd edit command
@@ -41,15 +43,15 @@
         @type QUndoCommand
         """
         super().__init__(parent)
-        
+
         self.__chunks = chunks
         self._pos = pos
         self._newByte = newByte
         self._cmd = cmd
-        
+
         self.__wasChanged = False
         self.__oldByte = 0
-    
+
     def undo(self):
         """
         Public method to undo the command.
@@ -62,7 +64,7 @@
         elif self._cmd == HexEditCommand.REMOVEAT:
             self.__chunks.insert(self._pos, self.__oldByte)
             self.__chunks.setDataChanged(self._pos, self.__wasChanged)
-    
+
     def redo(self):
         """
         Public method to redo the command.
@@ -77,32 +79,32 @@
             self.__oldByte = self.__chunks[self._pos]
             self.__wasChanged = self.__chunks.dataChanged(self._pos)
             self.__chunks.removeAt(self._pos)
-    
+
     def mergeWith(self, command):
         """
         Public method to merge this command with another one.
-        
+
         @param command reference to the command to merge with
         @type QUndoCommand
         @return flag indicating a successful merge
         @rtype bool
         """
         result = False
-        
+
         if (
-            self._cmd != HexEditCommand.REMOVEAT and
-            command._cmd == HexEditCommand.OVERWRITE and
-            command._pos == self._pos
+            self._cmd != HexEditCommand.REMOVEAT
+            and command._cmd == HexEditCommand.OVERWRITE
+            and command._pos == self._pos
         ):
             self._newByte = command._newByte
             result = True
-        
+
         return result
-    
+
     def id(self):
         """
         Public method to get the ID of this undo command class.
-        
+
         @return ID of the undo command class
         @rtype int
         """
@@ -113,58 +115,59 @@
     """
     Class implementing an Undo stack for the hex edit widget.
     """
+
     def __init__(self, chunks, parent=None):
         """
         Constructor
-        
+
         @param chunks reference to the data container
         @type HexEditChunks
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__chunks = chunks
         self.__parent = parent
-    
+
     def insert(self, pos, data):
         """
         Public method to insert a byte.
-        
+
         @param pos position to insert at
         @type int
         @param data byte to be inserted
         @type int (range 0 to 255)
         """
         if pos >= 0 and pos <= self.__chunks.size():
-            uc = HexEditUndoCommand(
-                self.__chunks, HexEditCommand.INSERT, pos, data)
+            uc = HexEditUndoCommand(self.__chunks, HexEditCommand.INSERT, pos, data)
             self.push(uc)
-    
+
     def insertByteArray(self, pos, byteArray):
         """
         Public method to insert bytes.
-        
+
         @param pos position to insert at
         @type int
         @param byteArray data to be inserted
         @type byteArray or QByteArray
         """
         ba = bytearray(byteArray)
-        
+
         if pos >= 0 and pos <= self.__chunks.size():
             txt = self.tr("Inserting %n byte(s)", "", len(ba))
             self.beginMacro(txt)
             for idx in range(len(ba)):
                 uc = HexEditUndoCommand(
-                    self.__chunks, HexEditCommand.INSERT, pos + idx, ba[idx])
+                    self.__chunks, HexEditCommand.INSERT, pos + idx, ba[idx]
+                )
                 self.push(uc)
             self.endMacro()
-    
+
     def removeAt(self, pos, length=1):
         """
         Public method to remove bytes.
-        
+
         @param pos position to remove bytes from
         @type int
         @param length amount of bytes to remove
@@ -172,36 +175,35 @@
         """
         if pos >= 0 and pos <= self.__chunks.size():
             if length == 1:
-                uc = HexEditUndoCommand(
-                    self.__chunks, HexEditCommand.REMOVEAT, pos, 0)
+                uc = HexEditUndoCommand(self.__chunks, HexEditCommand.REMOVEAT, pos, 0)
                 self.push(uc)
             else:
                 txt = self.tr("Deleting %n byte(s)", "", length)
                 self.beginMacro(txt)
                 for _cnt in range(length):
                     uc = HexEditUndoCommand(
-                        self.__chunks, HexEditCommand.REMOVEAT, pos, 0)
+                        self.__chunks, HexEditCommand.REMOVEAT, pos, 0
+                    )
                     self.push(uc)
                 self.endMacro()
-    
+
     def overwrite(self, pos, data):
         """
         Public method to replace a byte.
-        
+
         @param pos position to replace the byte at
         @type int
         @param data byte to replace with
         @type int (range 0 to 255)
         """
         if pos >= 0 and pos <= self.__chunks.size():
-            uc = HexEditUndoCommand(
-                self.__chunks, HexEditCommand.OVERWRITE, pos, data)
+            uc = HexEditUndoCommand(self.__chunks, HexEditCommand.OVERWRITE, pos, data)
             self.push(uc)
-    
+
     def overwriteByteArray(self, pos, length, byteArray):
         """
         Public method to replace bytes.
-        
+
         @param pos position to replace the bytes at
         @type int
         @param length amount of bytes to replace
@@ -210,7 +212,7 @@
         @type bytearray or QByteArray
         """
         ba = bytearray(byteArray)
-        
+
         if pos >= 0 and pos <= self.__chunks.size():
             txt = self.tr("Inserting %n byte(s)", "", len(ba))
             self.beginMacro(txt)
--- a/src/eric7/HexEdit/HexEditWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/HexEdit/HexEditWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,14 @@
 import math
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QByteArray, QTimer, QRect, QBuffer, QIODevice
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QByteArray,
+    QTimer,
+    QRect,
+    QBuffer,
+    QIODevice,
 )
 from PyQt6.QtGui import QFont, QPalette, QKeySequence, QPainter
 from PyQt6.QtWidgets import QAbstractScrollArea, QApplication
@@ -26,7 +33,7 @@
 class HexEditWidget(QAbstractScrollArea):
     """
     Class implementing an editor for binary data.
-    
+
     @signal currentAddressChanged(address) emitted to indicate the new
         cursor position
     @signal currentSizeChanged(size) emitted to indicate the new size of
@@ -41,6 +48,7 @@
     @signal selectionAvailable(bool) emitted to signal a change of the
         selection
     """
+
     currentAddressChanged = pyqtSignal(int)
     currentSizeChanged = pyqtSignal(int)
     dataChanged = pyqtSignal(bool)
@@ -49,19 +57,19 @@
     canRedoChanged = pyqtSignal(bool)
     canUndoChanged = pyqtSignal(bool)
     selectionAvailable = pyqtSignal(bool)
-    
+
     HEXCHARS_PER_LINE = 47
     BYTES_PER_LINE = 16
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent refernce to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         # Properties
         self.__addressArea = True
         # switch the address area on/off
@@ -81,7 +89,7 @@
         # set read only mode on/off
         self.__cursorPosition = 0
         # absolute position of cursor, 1 Byte == 2 tics
-        
+
         self.__addrDigits = 0
         self.__addrSeparators = 0
         self.__blink = True
@@ -94,7 +102,7 @@
         self.__markedShown = bytearray()
         self.__modified = False
         self.__rowsShown = 0
-        
+
         # pixel related attributes (starting with __px)
         self.__pxCharWidth = 0
         self.__pxCharHeight = 0
@@ -108,7 +116,7 @@
         self.__pxCursorWidth = 0
         self.__pxCursorX = 0
         self.__pxCursorY = 0
-        
+
         # absolute byte position related attributes (starting with __b)
         self.__bSelectionBegin = 0
         self.__bSelectionEnd = 0
@@ -116,76 +124,74 @@
         self.__bPosFirst = 0
         self.__bPosLast = 0
         self.__bPosCurrent = 0
-        
+
         self.__chunks = HexEditChunks()
         self.__undoStack = HexEditUndoStack(self.__chunks, self)
         if Globals.isWindowsPlatform():
             self.setFont(QFont(["Courier"], 10))
         else:
             self.setFont(QFont(["Monospace"], 10))
-        
+
         self.__cursorTimer = QTimer()
         self.__cursorTimer.timeout.connect(self.__updateCursor)
-        
+
         self.verticalScrollBar().valueChanged.connect(self.__adjust)
-        
+
         self.__undoStack.indexChanged.connect(self.__dataChangedPrivate)
         self.__undoStack.canRedoChanged.connect(self.__canRedoChanged)
         self.__undoStack.canUndoChanged.connect(self.__canUndoChanged)
-        
+
         self.readOnlyChanged.connect(self.__canRedoChanged)
         self.readOnlyChanged.connect(self.__canUndoChanged)
-        
+
         self.__cursorTimer.setInterval(500)
         self.__cursorTimer.start()
-        
+
         self.setAddressWidth(4)
         self.setAddressArea(True)
         self.setAsciiArea(True)
         self.setOverwriteMode(True)
         self.setHighlighting(True)
         self.setReadOnly(False)
-        
+
         self.__initialize()
-    
+
     def undoStack(self):
         """
         Public method to get a reference to the undo stack.
-        
+
         @return reference to the undo stack
         @rtype HexEditUndoStack
         """
         return self.__undoStack
-    
+
     @pyqtSlot()
     def __canRedoChanged(self):
         """
         Private slot handling changes of the Redo state.
         """
-        self.canRedoChanged.emit(
-            self.__undoStack.canRedo() and not self.__readOnly)
-    
+        self.canRedoChanged.emit(self.__undoStack.canRedo() and not self.__readOnly)
+
     @pyqtSlot()
     def __canUndoChanged(self):
         """
         Private slot handling changes of the Undo state.
         """
-        self.canUndoChanged.emit(
-            self.__undoStack.canUndo() and not self.__readOnly)
-    
+        self.canUndoChanged.emit(self.__undoStack.canUndo() and not self.__readOnly)
+
     def addressArea(self):
         """
         Public method to get the address area visibility.
-        
+
         @return flag indicating the address area visibility
         @rtype bool
         """
         return self.__addressArea
-    
+
     def setAddressArea(self, on):
         """
         Public method to set the address area visibility.
-        
+
         @param on flag indicating the address area visibility
         @type bool
         """
@@ -193,20 +199,20 @@
         self.__adjust()
         self.setCursorPosition(self.__cursorPosition)
         self.viewport().update()
-    
+
     def addressOffset(self):
         """
         Public method to get the address offset.
-        
+
         @return address offset
         @rtype int
         """
         return self.__addressOffset
-    
+
     def setAddressOffset(self, offset):
         """
         Public method to set the address offset.
-        
+
         @param offset address offset
         @type int
         """
@@ -214,14 +220,14 @@
         self.__adjust()
         self.setCursorPosition(self.__cursorPosition)
         self.viewport().update()
-    
+
     def addressWidth(self):
         """
         Public method to get the width of the address area in
         characters.
-        
+
         Note: The address area width is always a multiple of four.
-        
+
         @return minimum width of the address area
         @rtype int
         """
@@ -240,19 +246,19 @@
             n += 1
             size //= 0x10
         n = int(math.ceil(n / 4)) * 4
-        
+
         if n > self.__addressWidth:
             return n
         else:
             return self.__addressWidth
-    
+
     def setAddressWidth(self, width):
         """
         Public method to set the width of the address area.
-        
+
         Note: The address area width is always a multiple of four.
         The given value will be adjusted as required.
-        
+
         @param width width of the address area in characters
         @type int
         """
@@ -260,39 +266,39 @@
         self.__adjust()
         self.setCursorPosition(self.__cursorPosition)
         self.viewport().update()
-    
+
     def asciiArea(self):
         """
         Public method to get the visibility of the ASCII area.
-        
+
         @return visibility of the ASCII area
         @rtype bool
         """
         return self.__asciiArea
-    
+
     def setAsciiArea(self, on):
         """
         Public method to set the visibility of the ASCII area.
-        
+
         @param on flag indicating the visibility of the ASCII area
         @type bool
         """
         self.__asciiArea = on
         self.viewport().update()
-    
+
     def cursorPosition(self):
         """
         Public method to get the cursor position.
-        
+
         @return cursor position
         @rtype int
         """
         return self.__cursorPosition
-    
+
     def setCursorPosition(self, pos):
         """
         Public method to set the cursor position.
-        
+
         @param pos cursor position
         @type int
         """
@@ -301,7 +307,7 @@
         self.viewport().update(self.__cursorRect)
         if self.__asciiArea:
             self.viewport().update(self.__cursorRectAscii)
-        
+
         # step 2: check, if cursor is in range
         if self.__overwriteMode and pos > (self.__chunks.size() * 2 - 1):
             pos = self.__chunks.size() * 2 - 1
@@ -309,69 +315,77 @@
             pos = self.__chunks.size() * 2
         if pos < 0:
             pos = 0
-        
+
         # step 3: calculate new position of cursor
         self.__cursorPosition = pos
         self.__bPosCurrent = pos // 2
         self.__pxCursorY = (
-            ((pos // 2 - self.__bPosFirst) // self.BYTES_PER_LINE + 1) *
-            self.__pxCharHeight)
-        x = (pos % (2 * self.BYTES_PER_LINE))
+            (pos // 2 - self.__bPosFirst) // self.BYTES_PER_LINE + 1
+        ) * self.__pxCharHeight
+        x = pos % (2 * self.BYTES_PER_LINE)
         self.__pxCursorX = (
-            (((x // 2) * 3) + (x % 2)) * self.__pxCharWidth + self.__pxPosHexX)
-        
+            ((x // 2) * 3) + (x % 2)
+        ) * self.__pxCharWidth + self.__pxPosHexX
+
         self.__setHexCursorRect()
-        
+
         # step 4: calculate position of ASCII cursor
         x = self.__bPosCurrent % self.BYTES_PER_LINE
         self.__cursorRectAscii = QRect(
             self.__pxPosAsciiX + x * self.__pxCharWidth - 1,
             self.__pxCursorY - self.__pxCharHeight + 4,
-            self.__pxCharWidth + 1, self.__pxCharHeight + 1)
-        
+            self.__pxCharWidth + 1,
+            self.__pxCharHeight + 1,
+        )
+
         # step 5: draw new cursors
         self.__blink = True
         self.viewport().update(self.__cursorRect)
         if self.__asciiArea:
             self.viewport().update(self.__cursorRectAscii)
         self.currentAddressChanged.emit(self.__bPosCurrent)
-    
+
     def __setHexCursorRect(self):
         """
         Private method to set the cursor.
         """
         if self.__overwriteMode:
             self.__cursorRect = QRect(
-                self.__pxCursorX, self.__pxCursorY + self.__pxCursorWidth,
-                self.__pxCharWidth, self.__pxCursorWidth)
+                self.__pxCursorX,
+                self.__pxCursorY + self.__pxCursorWidth,
+                self.__pxCharWidth,
+                self.__pxCursorWidth,
+            )
         else:
             self.__cursorRect = QRect(
-                self.__pxCursorX, self.__pxCursorY - self.__pxCharHeight + 4,
-                self.__pxCursorWidth, self.__pxCharHeight)
-    
+                self.__pxCursorX,
+                self.__pxCursorY - self.__pxCharHeight + 4,
+                self.__pxCursorWidth,
+                self.__pxCharHeight,
+            )
+
     def cursorBytePosition(self):
         """
         Public method to get the cursor position in bytes.
-        
+
         @return cursor position in bytes
         @rtype int
         """
         return self.__bPosCurrent
-    
+
     def setCursorBytePosition(self, pos):
         """
         Public method to set the cursor position in bytes.
-        
+
         @param pos cursor position in bytes
         @type int
         """
         self.setCursorPosition(pos * 2)
-    
-    def goto(self, offset, fromCursor=False, backwards=False,
-             extendSelection=False):
+
+    def goto(self, offset, fromCursor=False, backwards=False, extendSelection=False):
         """
         Public method to move the cursor.
-        
+
         @param offset offset to move to
         @type int
         @param fromCursor flag indicating a move relative to the current cursor
@@ -391,51 +405,51 @@
                 newPos = self.__chunks.size() - offset
             else:
                 newPos = offset
-        
+
         self.setCursorBytePosition(newPos)
         if extendSelection:
             self.__setSelection(self.__cursorPosition)
         else:
             self.__resetSelection(self.__cursorPosition)
-        
+
         self.__refresh()
-    
+
     def data(self):
         """
         Public method to get the binary data.
-        
+
         @return binary data
         @rtype bytearray
         """
         return self.__chunks.data(0, -1)
-    
+
     def setData(self, dataOrDevice):
         """
         Public method to set the data to show.
-        
+
         @param dataOrDevice byte array or device containing the data
         @type bytes, bytearray, QByteArray or QIODevice
         @return flag indicating success
         @rtype bool
         @exception TypeError raised to indicate a wrong parameter type
         """
-        if not isinstance(dataOrDevice, (bytes, bytearray, QByteArray,
-                                         QIODevice)):
+        if not isinstance(dataOrDevice, (bytes, bytearray, QByteArray, QIODevice)):
             raise TypeError(
                 "setData: parameter must be bytes, bytearray, "
-                "QByteArray or QIODevice")
-        
+                "QByteArray or QIODevice"
+            )
+
         if isinstance(dataOrDevice, (bytes, bytearray, QByteArray)):
             self.__data = bytearray(dataOrDevice)
             self.__bData.setData(self.__data)
             return self.__setData(self.__bData)
         else:
             return self.__setData(dataOrDevice)
-    
+
     def __setData(self, ioDevice):
         """
         Private method to set the data to show.
-        
+
         @param ioDevice device containing the data
         @type QIODevice
         @return flag indicating success
@@ -445,45 +459,45 @@
         self.__initialize()
         self.__dataChangedPrivate()
         return ok
-    
+
     def highlighting(self):
         """
         Public method to get the highlighting state.
-        
+
         @return highlighting state
         @rtype bool
         """
         return self.__highlighting
-    
+
     def setHighlighting(self, on):
         """
         Public method to set the highlighting state.
-        
+
         @param on new highlighting state
         @type bool
         """
         self.__highlighting = on
         self.viewport().update()
-    
+
     def overwriteMode(self):
         """
         Public method to get the overwrite mode.
-        
+
         @return overwrite mode
         @rtype bool
         """
         return self.__overwriteMode
-    
+
     def setOverwriteMode(self, on):
         """
         Public method to set the overwrite mode.
-        
+
         @param on flag indicating the new overwrite mode
         @type bool
         """
         self.__overwriteMode = on
         self.overwriteModeChanged.emit(self.__overwriteMode)
-        
+
         # step 1: delete old cursor
         self.__blink = False
         self.viewport().update(self.__cursorRect)
@@ -492,39 +506,39 @@
         # step 3: draw new cursors
         self.__blink = True
         self.viewport().update(self.__cursorRect)
-    
+
     def isReadOnly(self):
         """
         Public method to test the read only state.
-        
+
         @return flag indicating the read only state
         @rtype bool
         """
         return self.__readOnly
-    
+
     def setReadOnly(self, on):
         """
         Public method to set the read only state.
-        
+
         @param on new read only state
         @type bool
         """
         self.__readOnly = on
         self.readOnlyChanged.emit(self.__readOnly)
-    
+
     def font(self):
         """
         Public method to get the font used to show the data.
-        
+
         @return font used to show the data
         @rtype QFont
         """
         return super().font()
-    
+
     def setFont(self, font):
         """
         Public method to set the font used to show the data.
-        
+
         @param font font used to show the data
         @type QFont
         """
@@ -541,11 +555,11 @@
         self.__pxSelectionSub = self.fontMetrics().descent()
         self.__adjust()
         self.viewport().update()
-    
+
     def dataAt(self, pos, count=-1):
         """
         Public method to get data from a given position.
-        
+
         @param pos position to get data from
         @type int
         @param count amount of bytes to get
@@ -554,11 +568,11 @@
         @rtype bytearray
         """
         return bytearray(self.__chunks.data(pos, count))
-    
+
     def write(self, device, pos=0, count=-1):
         """
         Public method to write data from a given position to a device.
-        
+
         @param device device to write to
         @type QIODevice
         @param pos position to start the write at
@@ -569,11 +583,11 @@
         @rtype bool
         """
         return self.__chunks.write(device, pos, count)
-    
+
     def insert(self, pos, ch):
         """
         Public method to insert a byte.
-        
+
         @param pos position to insert the byte at
         @type int
         @param ch byte to insert
@@ -582,11 +596,11 @@
         if ch in range(0, 256):
             self.__undoStack.insert(pos, ch)
             self.__refresh()
-    
+
     def remove(self, pos, length=1):
         """
         Public method to remove bytes.
-        
+
         @param pos position to remove bytes from
         @type int
         @param length amount of bytes to remove
@@ -594,11 +608,11 @@
         """
         self.__undoStack.removeAt(pos, length)
         self.__refresh()
-    
+
     def replace(self, pos, ch):
         """
         Public method to replace a byte.
-        
+
         @param pos position to replace the byte at
         @type int
         @param ch byte to replace with
@@ -607,11 +621,11 @@
         if ch in range(0, 256):
             self.__undoStack.overwrite(pos, ch)
             self.__refresh()
-    
+
     def insertByteArray(self, pos, byteArray):
         """
         Public method to insert bytes.
-        
+
         @param pos position to insert the bytes at
         @type int
         @param byteArray bytes to be insert
@@ -619,11 +633,11 @@
         """
         self.__undoStack.insertByteArray(pos, bytearray(byteArray))
         self.__refresh()
-    
+
     def replaceByteArray(self, pos, length, byteArray):
         """
         Public method to replace bytes.
-        
+
         @param pos position to replace the bytes at
         @type int
         @param length amount of bytes to replace
@@ -633,11 +647,11 @@
         """
         self.__undoStack.overwriteByteArray(pos, length, bytearray(byteArray))
         self.__refresh()
-    
+
     def cursorPositionFromPoint(self, point):
         """
         Public method to calculate a cursor position from a graphics position.
-        
+
         @param point graphics position
         @type QPoint
         @return cursor position
@@ -645,39 +659,37 @@
         """
         result = -1
         if (point.x() >= self.__pxPosHexX) and (
-            point.x() < (self.__pxPosHexX + (1 + self.HEXCHARS_PER_LINE) *
-                         self.__pxCharWidth)):
+            point.x()
+            < (self.__pxPosHexX + (1 + self.HEXCHARS_PER_LINE) * self.__pxCharWidth)
+        ):
             x = (
-                (point.x() - self.__pxPosHexX - self.__pxCharWidth // 2) //
-                self.__pxCharWidth
-            )
+                point.x() - self.__pxPosHexX - self.__pxCharWidth // 2
+            ) // self.__pxCharWidth
             x = (x // 3) * 2 + x % 3
-            y = (
-                ((point.y() - 3) // self.__pxCharHeight) * 2 *
-                self.BYTES_PER_LINE
-            )
+            y = ((point.y() - 3) // self.__pxCharHeight) * 2 * self.BYTES_PER_LINE
             result = self.__bPosFirst * 2 + x + y
         return result
-    
+
     def ensureVisible(self):
         """
         Public method to ensure, that the cursor is visible.
         """
         if self.__cursorPosition < 2 * self.__bPosFirst:
             self.verticalScrollBar().setValue(
-                self.__cursorPosition // 2 // self.BYTES_PER_LINE)
+                self.__cursorPosition // 2 // self.BYTES_PER_LINE
+            )
         if self.__cursorPosition > (
-            (self.__bPosFirst + (self.__rowsShown - 1) *
-             self.BYTES_PER_LINE) * 2):
+            (self.__bPosFirst + (self.__rowsShown - 1) * self.BYTES_PER_LINE) * 2
+        ):
             self.verticalScrollBar().setValue(
-                self.__cursorPosition // 2 // self.BYTES_PER_LINE -
-                self.__rowsShown + 1)
+                self.__cursorPosition // 2 // self.BYTES_PER_LINE - self.__rowsShown + 1
+            )
         self.viewport().update()
-    
+
     def indexOf(self, byteArray, start):
         """
         Public method to find the first occurrence of a byte array in our data.
-        
+
         @param byteArray data to search for
         @type bytearray or QByteArray
         @param start start position of the search
@@ -694,11 +706,11 @@
             self.__setSelection(curPos + len(byteArray) * 2)
             self.ensureVisible()
         return pos
-    
+
     def lastIndexOf(self, byteArray, start):
         """
         Public method to find the last occurrence of a byte array in our data.
-        
+
         @param byteArray data to search for
         @type bytearray or QByteArray
         @param start start position of the search
@@ -715,20 +727,20 @@
             self.__setSelection(curPos + len(byteArray) * 2)
             self.ensureVisible()
         return pos
-    
+
     def isModified(self):
         """
         Public method to check for any modification.
-        
+
         @return flag indicating a modified state
         @rtype bool
         """
         return self.__modified
-    
+
     def setModified(self, modified, setCleanState=False):
         """
         Public slot to set the modified flag.
-        
+
         @param modified flag indicating the new modification status
         @type bool
         @param setCleanState flag indicating to set the undo stack to clean
@@ -736,42 +748,44 @@
         """
         self.__modified = modified
         self.dataChanged.emit(modified)
-        
+
         if not modified and setCleanState:
             self.__undoStack.setClean()
-    
+
     def selectionToHexString(self):
         """
         Public method to get a hexadecimal representation of the selection.
-        
+
         @return hexadecimal representation of the selection
         @rtype str
         """
-        byteArray = self.__chunks.data(self.getSelectionBegin(),
-                                       self.getSelectionLength())
+        byteArray = self.__chunks.data(
+            self.getSelectionBegin(), self.getSelectionLength()
+        )
         return self.__toHex(byteArray).decode(encoding="ascii")
-    
+
     def selectionToReadableString(self):
         """
         Public method to get a formatted representation of the selection.
-        
+
         @return formatted representation of the selection
         @rtype str
         """
-        byteArray = self.__chunks.data(self.getSelectionBegin(),
-                                       self.getSelectionLength())
+        byteArray = self.__chunks.data(
+            self.getSelectionBegin(), self.getSelectionLength()
+        )
         return self.__toReadable(byteArray)
-    
+
     def toReadableString(self):
         """
         Public method to get a formatted representation of our data.
-        
+
         @return formatted representation of our data
         @rtype str
         """
         byteArray = self.__chunks.data()
         return self.__toReadable(byteArray)
-    
+
     @pyqtSlot()
     def redo(self):
         """
@@ -780,7 +794,7 @@
         self.__undoStack.redo()
         self.setCursorPosition(self.__chunks.pos() * 2)
         self.__refresh()
-    
+
     @pyqtSlot()
     def undo(self):
         """
@@ -789,7 +803,7 @@
         self.__undoStack.undo()
         self.setCursorPosition(self.__chunks.pos() * 2)
         self.__refresh()
-    
+
     @pyqtSlot()
     def revertToUnmodified(self):
         """
@@ -800,99 +814,98 @@
             self.__undoStack.setIndex(cleanIndex)
         self.setCursorPosition(self.__chunks.pos() * 2)
         self.__refresh()
-    
+
     ####################################################
     ## Cursor movement commands
     ####################################################
-    
+
     def moveCursorToNextChar(self):
         """
         Public method to move the cursor to the next byte.
         """
         self.setCursorPosition(self.__cursorPosition + 1)
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToPreviousChar(self):
         """
         Public method to move the cursor to the previous byte.
         """
         self.setCursorPosition(self.__cursorPosition - 1)
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToEndOfLine(self):
         """
         Public method to move the cursor to the end of the current line.
         """
-        self.setCursorPosition(self.__cursorPosition |
-                               (2 * self.BYTES_PER_LINE - 1))
+        self.setCursorPosition(self.__cursorPosition | (2 * self.BYTES_PER_LINE - 1))
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToStartOfLine(self):
         """
         Public method to move the cursor to the beginning of the current line.
         """
         self.setCursorPosition(
-            self.__cursorPosition -
-            (self.__cursorPosition % (2 * self.BYTES_PER_LINE)))
+            self.__cursorPosition - (self.__cursorPosition % (2 * self.BYTES_PER_LINE))
+        )
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToPreviousLine(self):
         """
         Public method to move the cursor to the previous line.
         """
         self.setCursorPosition(self.__cursorPosition - 2 * self.BYTES_PER_LINE)
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToNextLine(self):
         """
         Public method to move the cursor to the next line.
         """
         self.setCursorPosition(self.__cursorPosition + 2 * self.BYTES_PER_LINE)
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToNextPage(self):
         """
         Public method to move the cursor to the next page.
         """
         self.setCursorPosition(
-            self.__cursorPosition +
-            (self.__rowsShown - 1) * 2 * self.BYTES_PER_LINE)
+            self.__cursorPosition + (self.__rowsShown - 1) * 2 * self.BYTES_PER_LINE
+        )
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToPreviousPage(self):
         """
         Public method to move the cursor to the previous page.
         """
         self.setCursorPosition(
-            self.__cursorPosition -
-            (self.__rowsShown - 1) * 2 * self.BYTES_PER_LINE)
+            self.__cursorPosition - (self.__rowsShown - 1) * 2 * self.BYTES_PER_LINE
+        )
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToEndOfDocument(self):
         """
         Public method to move the cursor to the end of the data.
         """
         self.setCursorPosition(self.__chunks.size() * 2)
         self.__resetSelection(self.__cursorPosition)
-    
+
     def moveCursorToStartOfDocument(self):
         """
         Public method to move the cursor to the start of the data.
         """
         self.setCursorPosition(0)
         self.__resetSelection(self.__cursorPosition)
-    
+
     ####################################################
     ## Selection commands
     ####################################################
-    
+
     def deselectAll(self):
         """
         Public method to deselect all data.
         """
         self.__resetSelection(0)
         self.__refresh()
-    
+
     def selectAll(self):
         """
         Public method to select all data.
@@ -900,7 +913,7 @@
         self.__resetSelection(0)
         self.__setSelection(2 * self.__chunks.size() + 1)
         self.__refresh()
-    
+
     def selectNextChar(self):
         """
         Public method to extend the selection by one byte right.
@@ -908,7 +921,7 @@
         pos = self.__cursorPosition + 1
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectPreviousChar(self):
         """
         Public method to extend the selection by one byte left.
@@ -916,30 +929,29 @@
         pos = self.__cursorPosition - 1
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectToEndOfLine(self):
         """
         Public method to extend the selection to the end of line.
         """
         pos = (
-            self.__cursorPosition -
-            (self.__cursorPosition % (2 * self.BYTES_PER_LINE)) +
-            2 * self.BYTES_PER_LINE
+            self.__cursorPosition
+            - (self.__cursorPosition % (2 * self.BYTES_PER_LINE))
+            + 2 * self.BYTES_PER_LINE
         )
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectToStartOfLine(self):
         """
         Public method to extend the selection to the start of line.
         """
-        pos = (
-            self.__cursorPosition -
-            (self.__cursorPosition % (2 * self.BYTES_PER_LINE))
+        pos = self.__cursorPosition - (
+            self.__cursorPosition % (2 * self.BYTES_PER_LINE)
         )
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectPreviousLine(self):
         """
         Public method to extend the selection one line up.
@@ -947,7 +959,7 @@
         pos = self.__cursorPosition - 2 * self.BYTES_PER_LINE
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectNextLine(self):
         """
         Public method to extend the selection one line down.
@@ -955,31 +967,33 @@
         pos = self.__cursorPosition + 2 * self.BYTES_PER_LINE
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectNextPage(self):
         """
         Public method to extend the selection one page down.
         """
         pos = (
-            self.__cursorPosition +
-            ((self.viewport().height() // self.__pxCharHeight) - 1) *
-            2 * self.BYTES_PER_LINE
+            self.__cursorPosition
+            + ((self.viewport().height() // self.__pxCharHeight) - 1)
+            * 2
+            * self.BYTES_PER_LINE
         )
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectPreviousPage(self):
         """
         Public method to extend the selection one page up.
         """
         pos = (
-            self.__cursorPosition -
-            ((self.viewport().height() // self.__pxCharHeight) - 1) *
-            2 * self.BYTES_PER_LINE
+            self.__cursorPosition
+            - ((self.viewport().height() // self.__pxCharHeight) - 1)
+            * 2
+            * self.BYTES_PER_LINE
         )
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectEndOfDocument(self):
         """
         Public method to extend the selection to the end of the data.
@@ -987,7 +1001,7 @@
         pos = self.__chunks.size() * 2
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     def selectStartOfDocument(self):
         """
         Public method to extend the selection to the start of the data.
@@ -995,18 +1009,19 @@
         pos = 0
         self.setCursorPosition(pos)
         self.__setSelection(pos)
-    
+
     ####################################################
     ## Edit commands
     ####################################################
-    
+
     def cut(self):
         """
         Public method to cut the selected bytes and move them to the clipboard.
         """
         if not self.__readOnly:
-            byteArray = self.__toHex(self.__chunks.data(
-                self.getSelectionBegin(), self.getSelectionLength()))
+            byteArray = self.__toHex(
+                self.__chunks.data(self.getSelectionBegin(), self.getSelectionLength())
+            )
             idx = 32
             while idx < len(byteArray):
                 byteArray.insert(idx, "\n")
@@ -1015,27 +1030,28 @@
             cb.setText(byteArray.decode(encoding="latin1"))
             if self.__overwriteMode:
                 length = self.getSelectionLength()
-                self.replaceByteArray(self.getSelectionBegin(), length,
-                                      bytearray(length))
+                self.replaceByteArray(
+                    self.getSelectionBegin(), length, bytearray(length)
+                )
             else:
-                self.remove(self.getSelectionBegin(),
-                            self.getSelectionLength())
+                self.remove(self.getSelectionBegin(), self.getSelectionLength())
             self.setCursorPosition(2 * self.getSelectionBegin())
             self.__resetSelection(2 * self.getSelectionBegin())
-    
+
     def copy(self):
         """
         Public method to copy the selected bytes to the clipboard.
         """
-        byteArray = self.__toHex(self.__chunks.data(
-            self.getSelectionBegin(), self.getSelectionLength()))
+        byteArray = self.__toHex(
+            self.__chunks.data(self.getSelectionBegin(), self.getSelectionLength())
+        )
         idx = 32
         while idx < len(byteArray):
             byteArray.insert(idx, "\n")
             idx += 33
         cb = QApplication.clipboard()
         cb.setText(byteArray.decode(encoding="latin1"))
-    
+
     def paste(self):
         """
         Public method to paste bytes from the clipboard.
@@ -1044,14 +1060,12 @@
             cb = QApplication.clipboard()
             byteArray = self.__fromHex(cb.text().encode(encoding="latin1"))
             if self.__overwriteMode:
-                self.replaceByteArray(self.__bPosCurrent, len(byteArray),
-                                      byteArray)
+                self.replaceByteArray(self.__bPosCurrent, len(byteArray), byteArray)
             else:
                 self.insertByteArray(self.__bPosCurrent, byteArray)
-            self.setCursorPosition(
-                self.__cursorPosition + 2 * len(byteArray))
+            self.setCursorPosition(self.__cursorPosition + 2 * len(byteArray))
             self.__resetSelection(2 * self.getSelectionBegin())
-    
+
     def deleteByte(self):
         """
         Public method to delete the current byte.
@@ -1061,11 +1075,9 @@
                 self.__bPosCurrent = self.getSelectionBegin()
                 if self.__overwriteMode:
                     byteArray = bytearray(self.getSelectionLength())
-                    self.replaceByteArray(self.__bPosCurrent, len(byteArray),
-                                          byteArray)
+                    self.replaceByteArray(self.__bPosCurrent, len(byteArray), byteArray)
                 else:
-                    self.remove(self.__bPosCurrent,
-                                self.getSelectionLength())
+                    self.remove(self.__bPosCurrent, self.getSelectionLength())
             else:
                 if self.__overwriteMode:
                     self.replace(self.__bPosCurrent, 0)
@@ -1073,7 +1085,7 @@
                     self.remove(self.__bPosCurrent, 1)
             self.setCursorPosition(2 * self.__bPosCurrent)
             self.__resetSelection(2 * self.__bPosCurrent)
-    
+
     def deleteByteBack(self):
         """
         Public method to delete the previous byte.
@@ -1084,11 +1096,9 @@
                 self.setCursorPosition(2 * self.__bPosCurrent)
                 if self.__overwriteMode:
                     byteArray = bytearray(self.getSelectionLength())
-                    self.replaceByteArray(self.__bPosCurrent, len(byteArray),
-                                          byteArray)
+                    self.replaceByteArray(self.__bPosCurrent, len(byteArray), byteArray)
                 else:
-                    self.remove(self.__bPosCurrent,
-                                self.getSelectionLength())
+                    self.remove(self.__bPosCurrent, self.getSelectionLength())
             else:
                 self.__bPosCurrent -= 1
                 if self.__overwriteMode:
@@ -1097,15 +1107,15 @@
                     self.remove(self.__bPosCurrent, 1)
                 self.setCursorPosition(2 * self.__bPosCurrent)
             self.__resetSelection(2 * self.__bPosCurrent)
-    
+
     ####################################################
     ## Event handling methods
     ####################################################
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key press events.
-        
+
         @param evt reference to the key event
         @type QKeyEvent
         """
@@ -1130,7 +1140,7 @@
             self.moveCursorToEndOfDocument()
         elif evt.matches(QKeySequence.StandardKey.MoveToStartOfDocument):
             self.moveCursorToStartOfDocument()
-        
+
         # Selection commands
         elif evt.matches(QKeySequence.StandardKey.SelectAll):
             self.selectAll()
@@ -1154,17 +1164,17 @@
             self.selectEndOfDocument()
         elif evt.matches(QKeySequence.StandardKey.SelectStartOfDocument):
             self.selectStartOfDocument()
-        
+
         # Edit commands
         elif evt.matches(QKeySequence.StandardKey.Copy):
             self.copy()
         elif (
-            evt.key() == Qt.Key.Key_Insert and
-            evt.modifiers() == Qt.KeyboardModifier.NoModifier
+            evt.key() == Qt.Key.Key_Insert
+            and evt.modifiers() == Qt.KeyboardModifier.NoModifier
         ):
             self.setOverwriteMode(not self.overwriteMode())
             self.setCursorPosition(self.__cursorPosition)
-        
+
         elif not self.__readOnly:
             if evt.matches(QKeySequence.StandardKey.Cut):
                 self.cut()
@@ -1173,18 +1183,18 @@
             elif evt.matches(QKeySequence.StandardKey.Delete):
                 self.deleteByte()
             elif (
-                evt.key() == Qt.Key.Key_Backspace and
-                evt.modifiers() == Qt.KeyboardModifier.NoModifier
+                evt.key() == Qt.Key.Key_Backspace
+                and evt.modifiers() == Qt.KeyboardModifier.NoModifier
             ):
                 self.deleteByteBack()
             elif evt.matches(QKeySequence.StandardKey.Undo):
                 self.undo()
             elif evt.matches(QKeySequence.StandardKey.Redo):
                 self.redo()
-            
+
             elif QApplication.keyboardModifiers() in [
                 Qt.KeyboardModifier.NoModifier,
-                Qt.KeyboardModifier.KeypadModifier
+                Qt.KeyboardModifier.KeypadModifier,
             ]:
                 # some hex input
                 key = evt.text()
@@ -1193,33 +1203,31 @@
                         if self.__overwriteMode:
                             length = self.getSelectionLength()
                             self.replaceByteArray(
-                                self.getSelectionBegin(), length,
-                                bytearray(length))
+                                self.getSelectionBegin(), length, bytearray(length)
+                            )
                         else:
-                            self.remove(self.getSelectionBegin(),
-                                        self.getSelectionLength())
+                            self.remove(
+                                self.getSelectionBegin(), self.getSelectionLength()
+                            )
                             self.__bPosCurrent = self.getSelectionBegin()
                         self.setCursorPosition(2 * self.__bPosCurrent)
                         self.__resetSelection(2 * self.__bPosCurrent)
-                    
+
                     # if in insert mode, insert a byte
-                    if (
-                        not self.__overwriteMode and
-                        (self.__cursorPosition % 2) == 0
-                    ):
+                    if not self.__overwriteMode and (self.__cursorPosition % 2) == 0:
                         self.insert(self.__bPosCurrent, 0)
-                    
+
                     # change content
                     if self.__chunks.size() > 0:
                         hexValue = self.__toHex(
-                            self.__chunks.data(self.__bPosCurrent, 1))
+                            self.__chunks.data(self.__bPosCurrent, 1)
+                        )
                         if (self.__cursorPosition % 2) == 0:
                             hexValue[0] = ord(key)
                         else:
                             hexValue[1] = ord(key)
-                        self.replace(self.__bPosCurrent,
-                                     self.__fromHex(hexValue)[0])
-                        
+                        self.replace(self.__bPosCurrent, self.__fromHex(hexValue)[0])
+
                         self.setCursorPosition(self.__cursorPosition + 1)
                         self.__resetSelection(self.__cursorPosition)
                     else:
@@ -1230,13 +1238,13 @@
                 return
         else:
             return
-        
+
         self.__refresh()
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse moves.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
@@ -1246,11 +1254,11 @@
         if actPos >= 0:
             self.setCursorPosition(actPos)
             self.__setSelection(actPos)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse button presses.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
@@ -1263,65 +1271,67 @@
             else:
                 self.__resetSelection(cPos)
             self.setCursorPosition(cPos)
-    
+
     def paintEvent(self, evt):
         """
         Protected method to handle paint events.
-        
+
         @param evt reference to the paint event
         @type QPaintEvent
         """
         painter = QPainter(self.viewport())
-        
+
         # initialize colors
         if ericApp().usesDarkPalette():
-            addressAreaForeground = self.palette().color(
-                QPalette.ColorRole.Text)
-            addressAreaBackground = self.palette().color(
-                QPalette.ColorRole.Base).lighter(200)
-            highlightingForeground = self.palette().color(
-                QPalette.ColorRole.HighlightedText).darker(200)
-            highlightingBackground = self.palette().color(
-                QPalette.ColorRole.Highlight).lighter()
+            addressAreaForeground = self.palette().color(QPalette.ColorRole.Text)
+            addressAreaBackground = (
+                self.palette().color(QPalette.ColorRole.Base).lighter(200)
+            )
+            highlightingForeground = (
+                self.palette().color(QPalette.ColorRole.HighlightedText).darker(200)
+            )
+            highlightingBackground = (
+                self.palette().color(QPalette.ColorRole.Highlight).lighter()
+            )
         else:
-            addressAreaForeground = self.palette().color(
-                QPalette.ColorRole.Text)
-            addressAreaBackground = self.palette().color(
-                QPalette.ColorRole.Base).darker()
-            highlightingForeground = self.palette().color(
-                QPalette.ColorRole.HighlightedText).lighter()
-            highlightingBackground = self.palette().color(
-                QPalette.ColorRole.Highlight).darker()
-        selectionForeground = self.palette().color(
-            QPalette.ColorRole.HighlightedText)
-        selectionBackground = self.palette().color(
-            QPalette.ColorRole.Highlight)
-        standardBackground = self.viewport().palette().color(
-            QPalette.ColorRole.Base)
-        standardForeground = self.viewport().palette().color(
-            QPalette.ColorRole.Text)
-        
-        if (
-            evt.rect() != self.__cursorRect and
-            evt.rect() != self.__cursorRectAscii
-        ):
+            addressAreaForeground = self.palette().color(QPalette.ColorRole.Text)
+            addressAreaBackground = (
+                self.palette().color(QPalette.ColorRole.Base).darker()
+            )
+            highlightingForeground = (
+                self.palette().color(QPalette.ColorRole.HighlightedText).lighter()
+            )
+            highlightingBackground = (
+                self.palette().color(QPalette.ColorRole.Highlight).darker()
+            )
+        selectionForeground = self.palette().color(QPalette.ColorRole.HighlightedText)
+        selectionBackground = self.palette().color(QPalette.ColorRole.Highlight)
+        standardBackground = self.viewport().palette().color(QPalette.ColorRole.Base)
+        standardForeground = self.viewport().palette().color(QPalette.ColorRole.Text)
+
+        if evt.rect() != self.__cursorRect and evt.rect() != self.__cursorRectAscii:
             pxOfsX = self.horizontalScrollBar().value()
             pxPosStartY = self.__pxCharHeight
-            
+
             # draw some patterns if needed
             painter.fillRect(evt.rect(), standardBackground)
             if self.__addressArea:
                 painter.fillRect(
-                    QRect(-pxOfsX, evt.rect().top(),
-                          self.__pxPosHexX - self.__pxGapAdrHex // 2 - pxOfsX,
-                          self.height()),
-                    addressAreaBackground)
+                    QRect(
+                        -pxOfsX,
+                        evt.rect().top(),
+                        self.__pxPosHexX - self.__pxGapAdrHex // 2 - pxOfsX,
+                        self.height(),
+                    ),
+                    addressAreaBackground,
+                )
             if self.__asciiArea:
                 linePos = self.__pxPosAsciiX - (self.__pxGapHexAscii // 2)
                 painter.setPen(Qt.GlobalColor.gray)
-                painter.drawLine(linePos - pxOfsX, evt.rect().top(),
-                                 linePos - pxOfsX, self.height())
-            
+                painter.drawLine(
+                    linePos - pxOfsX, evt.rect().top(), linePos - pxOfsX, self.height()
+                )
+
             # paint the address area
             if self.__addressArea:
                 painter.setPen(addressAreaForeground)
@@ -1330,134 +1340,135 @@
                 pxPosY = self.__pxCharHeight
                 while row <= len(self.__dataShown) // self.BYTES_PER_LINE:
                     address = "{0:0{1}x}".format(
-                        self.__bPosFirst + row * self.BYTES_PER_LINE,
-                        self.__addrDigits)
+                        self.__bPosFirst + row * self.BYTES_PER_LINE, self.__addrDigits
+                    )
                     address = Globals.strGroup(address, ":", 4)
-                    painter.drawText(self.__pxPosAdrX - pxOfsX, pxPosY,
-                                     address)
+                    painter.drawText(self.__pxPosAdrX - pxOfsX, pxPosY, address)
                     # increment loop variables
                     row += 1
                     pxPosY += self.__pxCharHeight
-            
+
             # paint hex and ascii area
             painter.setBackgroundMode(Qt.BGMode.TransparentMode)
-            
+
             row = 0
             pxPosY = pxPosStartY
             while row <= self.__rowsShown:
                 pxPosX = self.__pxPosHexX - pxOfsX
                 pxPosAsciiX2 = self.__pxPosAsciiX - pxOfsX
                 bPosLine = row * self.BYTES_PER_LINE
-                
+
                 colIdx = 0
                 while (
-                    bPosLine + colIdx < len(self.__dataShown) and
-                    colIdx < self.BYTES_PER_LINE
+                    bPosLine + colIdx < len(self.__dataShown)
+                    and colIdx < self.BYTES_PER_LINE
                 ):
                     background = standardBackground
                     painter.setPen(standardForeground)
-                    
+
                     posBa = self.__bPosFirst + bPosLine + colIdx
                     if (
-                        self.getSelectionBegin() <= posBa and
-                        self.getSelectionEnd() > posBa
+                        self.getSelectionBegin() <= posBa
+                        and self.getSelectionEnd() > posBa
                     ):
                         background = selectionBackground
                         painter.setPen(selectionForeground)
                     elif (
-                        self.__highlighting and
-                        self.__markedShown and
-                        self.__markedShown[posBa - self.__bPosFirst]
+                        self.__highlighting
+                        and self.__markedShown
+                        and self.__markedShown[posBa - self.__bPosFirst]
                     ):
                         background = highlightingBackground
                         painter.setPen(highlightingForeground)
-                    
+
                     # render hex value
                     rect = QRect()
                     if colIdx == 0:
                         rect.setRect(
                             pxPosX,
-                            pxPosY - self.__pxCharHeight +
-                            self.__pxSelectionSub,
+                            pxPosY - self.__pxCharHeight + self.__pxSelectionSub,
                             2 * self.__pxCharWidth,
-                            self.__pxCharHeight)
+                            self.__pxCharHeight,
+                        )
                     else:
                         rect.setRect(
                             pxPosX - self.__pxCharWidth,
-                            pxPosY - self.__pxCharHeight +
-                            self.__pxSelectionSub,
+                            pxPosY - self.__pxCharHeight + self.__pxSelectionSub,
                             3 * self.__pxCharWidth,
-                            self.__pxCharHeight)
+                            self.__pxCharHeight,
+                        )
                     painter.fillRect(rect, background)
-                    hexStr = (
-                        chr(self.__hexDataShown[(bPosLine + colIdx) * 2]) +
-                        chr(self.__hexDataShown[(bPosLine + colIdx) * 2 + 1])
+                    hexStr = chr(self.__hexDataShown[(bPosLine + colIdx) * 2]) + chr(
+                        self.__hexDataShown[(bPosLine + colIdx) * 2 + 1]
                     )
                     painter.drawText(pxPosX, pxPosY, hexStr)
                     pxPosX += 3 * self.__pxCharWidth
-                    
+
                     # render ascii value
                     if self.__asciiArea:
                         by = self.__dataShown[bPosLine + colIdx]
-                        if by < 0x20 or (by > 0x7e and by < 0xa0):
+                        if by < 0x20 or (by > 0x7E and by < 0xA0):
                             ch = "."
                         else:
                             ch = chr(by)
                         rect.setRect(
                             pxPosAsciiX2,
-                            pxPosY - self.__pxCharHeight +
-                            self.__pxSelectionSub,
+                            pxPosY - self.__pxCharHeight + self.__pxSelectionSub,
                             self.__pxCharWidth,
-                            self.__pxCharHeight)
+                            self.__pxCharHeight,
+                        )
                         painter.fillRect(rect, background)
                         painter.drawText(pxPosAsciiX2, pxPosY, ch)
                         pxPosAsciiX2 += self.__pxCharWidth
-                    
+
                     # increment loop variable
                     colIdx += 1
-                
+
                 # increment loop variables
                 row += 1
                 pxPosY += self.__pxCharHeight
-        
+
         painter.setBackgroundMode(Qt.BGMode.TransparentMode)
         painter.setPen(standardForeground)
-        
+
         # paint cursor
         if self.__blink and not self.__readOnly and self.isActiveWindow():
             painter.fillRect(self.__cursorRect, standardForeground)
         else:
             if self.__hexDataShown:
                 try:
-                    c = chr(self.__hexDataShown[
-                            self.__cursorPosition - self.__bPosFirst * 2])
+                    c = chr(
+                        self.__hexDataShown[
+                            self.__cursorPosition - self.__bPosFirst * 2
+                        ]
+                    )
                 except IndexError:
                     c = ""
             else:
                 c = ""
             painter.drawText(self.__pxCursorX, self.__pxCursorY, c)
-        
+
         if self.__asciiArea:
             painter.drawRect(self.__cursorRectAscii)
-        
+
         # emit event, if size has changed
         if self.__lastEventSize != self.__chunks.size():
             self.__lastEventSize = self.__chunks.size()
             self.currentSizeChanged.emit(self.__lastEventSize)
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt reference to the resize event
         @type QResizeEvent
         """
         self.__adjust()
-    
+
     def __resetSelection(self, pos=None):
         """
         Private method to reset the selection.
-        
+
         @param pos position to set selection start and end to
             (if this is None, selection end is set to selection start)
         @type int or None
@@ -1472,13 +1483,13 @@
             self.__bSelectionInit = pos
             self.__bSelectionBegin = pos
             self.__bSelectionEnd = pos
-        
+
         self.selectionAvailable.emit(False)
-    
+
     def __setSelection(self, pos):
         """
         Private method to set the selection.
-        
+
         @param pos position
         @type int
         """
@@ -1491,45 +1502,45 @@
         else:
             self.__bSelectionBegin = pos
             self.__bSelectionEnd = self.__bSelectionInit
-        
+
         self.selectionAvailable.emit(True)
-    
+
     def getSelectionBegin(self):
         """
         Public method to get the start of the selection.
-        
+
         @return selection start
         @rtype int
         """
         return self.__bSelectionBegin
-    
+
     def getSelectionEnd(self):
         """
         Public method to get the end of the selection.
-        
+
         @return selection end
         @rtype int
         """
         return self.__bSelectionEnd
-    
+
     def getSelectionLength(self):
         """
         Public method to get the length of the selection.
-        
+
         @return selection length
         @rtype int
         """
         return self.__bSelectionEnd - self.__bSelectionBegin
-    
+
     def hasSelection(self):
         """
         Public method to test for a selection.
-        
+
         @return flag indicating the presence of a selection
         @rtype bool
         """
         return self.__bSelectionBegin != self.__bSelectionEnd
-    
+
     def __initialize(self):
         """
         Private method to do some initialization.
@@ -1540,7 +1551,7 @@
         self.setCursorPosition(0)
         self.verticalScrollBar().setValue(0)
         self.__modified = False
-    
+
     def __readBuffers(self):
         """
         Private method to read the buffers.
@@ -1548,36 +1559,36 @@
         self.__dataShown = self.__chunks.data(
             self.__bPosFirst,
             self.__bPosLast - self.__bPosFirst + self.BYTES_PER_LINE + 1,
-            self.__markedShown
+            self.__markedShown,
         )
         self.__hexDataShown = self.__toHex(self.__dataShown)
-    
+
     def __toHex(self, byteArray):
         """
         Private method to convert the data of a Python bytearray to hex.
-        
+
         @param byteArray byte array to be converted
         @type bytearray
         @return converted data
         @rtype bytearray
         """
         return bytearray(QByteArray(byteArray).toHex())
-    
+
     def __fromHex(self, byteArray):
         """
         Private method to convert data of a Python bytearray from hex.
-        
+
         @param byteArray byte array to be converted
         @type bytearray
         @return converted data
         @rtype bytearray
         """
         return bytearray(QByteArray.fromHex(byteArray))
-        
+
     def __toReadable(self, byteArray):
         """
         Private method to convert some data into a readable format.
-        
+
         @param byteArray data to be converted
         @type bytearray or QByteArray
         @return readable data
@@ -1586,22 +1597,21 @@
         byteArray = bytearray(byteArray)
         result = ""
         for i in range(0, len(byteArray), 16):
-            addrStr = "{0:0{1}x}".format(self.__addressOffset + i,
-                                         self.addressWidth())
+            addrStr = "{0:0{1}x}".format(self.__addressOffset + i, self.addressWidth())
             hexStr = ""
             ascStr = ""
             for j in range(16):
                 if (i + j) < len(byteArray):
                     hexStr += " {0:02x}".format(byteArray[i + j])
                     by = byteArray[i + j]
-                    if by < 0x20 or (by > 0x7e and by < 0xa0):
+                    if by < 0x20 or (by > 0x7E and by < 0xA0):
                         ch = "."
                     else:
                         ch = chr(by)
                     ascStr += ch
             result += "{0} {1:<48} {2:<17}\n".format(addrStr, hexStr, ascStr)
         return result
-    
+
     @pyqtSlot()
     def __adjust(self):
         """
@@ -1612,59 +1622,56 @@
             self.__addrDigits = self.addressWidth()
             self.__addrSeparators = self.__addrDigits // 4 - 1
             self.__pxPosHexX = (
-                self.__pxGapAdr +
-                (self.__addrDigits + self.__addrSeparators) *
-                self.__pxCharWidth + self.__pxGapAdrHex)
+                self.__pxGapAdr
+                + (self.__addrDigits + self.__addrSeparators) * self.__pxCharWidth
+                + self.__pxGapAdrHex
+            )
         else:
             self.__pxPosHexX = self.__pxGapAdrHex
         self.__pxPosAdrX = self.__pxGapAdr
         self.__pxPosAsciiX = (
-            self.__pxPosHexX +
-            self.HEXCHARS_PER_LINE * self.__pxCharWidth +
-            self.__pxGapHexAscii
+            self.__pxPosHexX
+            + self.HEXCHARS_PER_LINE * self.__pxCharWidth
+            + self.__pxGapHexAscii
         )
-        
+
         # set horizontal scrollbar
         pxWidth = self.__pxPosAsciiX
         if self.__asciiArea:
             pxWidth += self.BYTES_PER_LINE * self.__pxCharWidth
-        self.horizontalScrollBar().setRange(
-            0, pxWidth - self.viewport().width())
+        self.horizontalScrollBar().setRange(0, pxWidth - self.viewport().width())
         self.horizontalScrollBar().setPageStep(self.viewport().width())
-        
+
         # set vertical scrollbar
-        self.__rowsShown = (
-            (self.viewport().height() - 4) // self.__pxCharHeight
-        )
+        self.__rowsShown = (self.viewport().height() - 4) // self.__pxCharHeight
         lineCount = (self.__chunks.size() // self.BYTES_PER_LINE) + 1
         self.verticalScrollBar().setRange(0, lineCount - self.__rowsShown)
         self.verticalScrollBar().setPageStep(self.__rowsShown)
-        
+
         # do the rest
         value = self.verticalScrollBar().value()
         self.__bPosFirst = value * self.BYTES_PER_LINE
-        self.__bPosLast = (
-            self.__bPosFirst + self.__rowsShown * self.BYTES_PER_LINE - 1
-        )
+        self.__bPosLast = self.__bPosFirst + self.__rowsShown * self.BYTES_PER_LINE - 1
         if self.__bPosLast >= self.__chunks.size():
             self.__bPosLast = self.__chunks.size() - 1
         self.__readBuffers()
         self.setCursorPosition(self.__cursorPosition)
-    
+
     @pyqtSlot(int)
     def __dataChangedPrivate(self, idx=0):
         """
         Private slot to handle data changes.
-        
+
         @param idx index
         @type int
         """
         self.__modified = (
-            self.__undoStack.cleanIndex() == -1 or
-            self.__undoStack.index() != self.__undoStack.cleanIndex())
+            self.__undoStack.cleanIndex() == -1
+            or self.__undoStack.index() != self.__undoStack.cleanIndex()
+        )
         self.__adjust()
         self.dataChanged.emit(self.__modified)
-    
+
     @pyqtSlot()
     def __refresh(self):
         """
@@ -1672,7 +1679,7 @@
         """
         self.ensureVisible()
         self.__readBuffers()
-    
+
     @pyqtSlot()
     def __updateCursor(self):
         """
--- a/src/eric7/IconEditor/IconEditorGrid.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/IconEditor/IconEditorGrid.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,17 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QRect, QSize
 from PyQt6.QtGui import (
-    QImage, QColor, QPixmap, qRgba, QPainter, QCursor, QBrush, qGray, qAlpha,
-    QUndoCommand, QUndoStack
+    QImage,
+    QColor,
+    QPixmap,
+    qRgba,
+    QPainter,
+    QCursor,
+    QBrush,
+    qGray,
+    qAlpha,
+    QUndoCommand,
+    QUndoStack,
 )
 from PyQt6.QtWidgets import QWidget, QSizePolicy, QApplication, QDialog
 
@@ -25,10 +34,11 @@
     """
     Class implementing an undo command for the icon editor.
     """
+
     def __init__(self, grid, text, oldImage, parent=None):
         """
         Constructor
-        
+
         @param grid reference to the icon editor grid (IconEditorGrid)
         @param text text for the undo command (string)
         @param oldImage copy of the icon before the changes were applied
@@ -36,37 +46,38 @@
         @param parent reference to the parent command (QUndoCommand)
         """
         super().__init__(text, parent)
-        
+
         self.__grid = grid
         self.__imageBefore = QImage(oldImage)
         self.__imageAfter = None
-    
+
     def setAfterImage(self, image):
         """
         Public method to set the image after the changes were applied.
-        
+
         @param image copy of the icon after the changes were applied (QImage)
         """
         self.__imageAfter = QImage(image)
-    
+
     def undo(self):
         """
         Public method to perform the undo.
         """
         self.__grid.setIconImage(self.__imageBefore, undoRedo=True)
-    
+
     def redo(self):
         """
         Public method to perform the redo.
         """
         if self.__imageAfter:
             self.__grid.setIconImage(self.__imageAfter, undoRedo=True)
-    
+
 
 class IconEditorTool(enum.IntEnum):
     """
     Class defining the edit tools.
     """
+
     PENCIL = 1
     RUBBER = 2
     LINE = 3
@@ -78,7 +89,7 @@
     FILLED_ELLIPSE = 9
     FILL = 10
     COLOR_PICKER = 11
-    
+
     SELECT_RECTANGLE = 100
     SELECT_CIRCLE = 101
 
@@ -86,7 +97,7 @@
 class IconEditorGrid(QWidget):
     """
     Class implementing the icon editor grid.
-    
+
     @signal canRedoChanged(bool) emitted after the redo status has changed
     @signal canUndoChanged(bool) emitted after the undo status has changed
     @signal clipboardImageAvailable(bool) emitted to signal the availability
@@ -101,6 +112,7 @@
     @signal sizeChanged(int, int) emitted after the size has been changed
     @signal zoomChanged(int) emitted to signal a change of the zoom value
     """
+
     canRedoChanged = pyqtSignal(bool)
     canUndoChanged = pyqtSignal(bool)
     clipboardImageAvailable = pyqtSignal(bool)
@@ -111,28 +123,27 @@
     selectionAvailable = pyqtSignal(bool)
     sizeChanged = pyqtSignal(int, int)
     zoomChanged = pyqtSignal(int)
-    
+
     MarkColor = QColor(255, 255, 255, 255)
     NoMarkColor = QColor(0, 0, 0, 0)
-    
+
     ZoomMinimum = 100
     ZoomMaximum = 10000
     ZoomStep = 100
     ZoomDefault = 1200
     ZoomPercent = True
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setAttribute(Qt.WidgetAttribute.WA_StaticContents)
-        self.setSizePolicy(QSizePolicy.Policy.Minimum,
-                           QSizePolicy.Policy.Minimum)
-        
+        self.setSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum)
+
         self.__curColor = Qt.GlobalColor.black
         self.__zoom = 12
         self.__curTool = IconEditorTool.PENCIL
@@ -144,70 +155,68 @@
         self.__isPasting = False
         self.__clipboardSize = QSize()
         self.__pasteRect = QRect()
-        
+
         self.__undoStack = QUndoStack(self)
         self.__currentUndoCmd = None
-        
+
         self.__image = QImage(32, 32, QImage.Format.Format_ARGB32)
         self.__image.fill(Qt.GlobalColor.transparent)
         self.__markImage = QImage(self.__image)
         self.__markImage.fill(self.NoMarkColor.rgba())
-        
-        self.__compositingMode = (
-            QPainter.CompositionMode.CompositionMode_SourceOver
-        )
+
+        self.__compositingMode = QPainter.CompositionMode.CompositionMode_SourceOver
         self.__lastPos = (-1, -1)
-        
+
         self.__gridEnabled = True
         self.__selectionAvailable = False
-        
+
         self.__initCursors()
         self.__initUndoTexts()
-        
+
         self.setMouseTracking(True)
-        
+
         self.__undoStack.canRedoChanged.connect(self.canRedoChanged)
         self.__undoStack.canUndoChanged.connect(self.canUndoChanged)
         self.__undoStack.cleanChanged.connect(self.__cleanChanged)
-        
+
         self.imageChanged.connect(self.__updatePreviewPixmap)
         QApplication.clipboard().dataChanged.connect(self.__checkClipboard)
-        
+
         self.__checkClipboard()
-    
+
     def __initCursors(self):
         """
         Private method to initialize the various cursors.
         """
         cursorsPath = os.path.join(os.path.dirname(__file__), "cursors")
-        
+
         self.__normalCursor = QCursor(Qt.CursorShape.ArrowCursor)
-        
+
         pix = QPixmap(os.path.join(cursorsPath, "colorpicker-cursor.xpm"))
         mask = pix.createHeuristicMask()
         pix.setMask(mask)
         self.__colorPickerCursor = QCursor(pix, 1, 21)
-        
+
         pix = QPixmap(os.path.join(cursorsPath, "paintbrush-cursor.xpm"))
         mask = pix.createHeuristicMask()
         pix.setMask(mask)
         self.__paintCursor = QCursor(pix, 0, 19)
-        
+
         pix = QPixmap(os.path.join(cursorsPath, "fill-cursor.xpm"))
         mask = pix.createHeuristicMask()
         pix.setMask(mask)
         self.__fillCursor = QCursor(pix, 3, 20)
-        
+
         pix = QPixmap(os.path.join(cursorsPath, "aim-cursor.xpm"))
         mask = pix.createHeuristicMask()
         pix.setMask(mask)
         self.__aimCursor = QCursor(pix, 10, 10)
-        
+
         pix = QPixmap(os.path.join(cursorsPath, "eraser-cursor.xpm"))
         mask = pix.createHeuristicMask()
         pix.setMask(mask)
         self.__rubberCursor = QCursor(pix, 1, 16)
-    
+
     def __initUndoTexts(self):
         """
         Private method to initialize texts to be associated with undo commands
@@ -225,96 +234,101 @@
             IconEditorTool.FILLED_ELLIPSE: self.tr("Draw Filled Ellipse"),
             IconEditorTool.FILL: self.tr("Fill Region"),
         }
-    
+
     def isDirty(self):
         """
         Public method to check the dirty status.
-        
+
         @return flag indicating a modified status (boolean)
         """
         return self.__dirty
-    
+
     def setDirty(self, dirty, setCleanState=False):
         """
         Public slot to set the dirty flag.
-        
+
         @param dirty flag indicating the new modification status (boolean)
         @param setCleanState flag indicating to set the undo stack to clean
             (boolean)
         """
         self.__dirty = dirty
         self.imageChanged.emit(dirty)
-        
+
         if not dirty and setCleanState:
             self.__undoStack.setClean()
-    
+
     def sizeHint(self):
         """
         Public method to report the size hint.
-        
+
         @return size hint (QSize)
         """
         size = self.__zoom * self.__image.size()
         if self.__zoom >= 3 and self.__gridEnabled:
             size += QSize(1, 1)
         return size
-    
+
     def setPenColor(self, newColor):
         """
         Public method to set the drawing color.
-        
+
         @param newColor reference to the new color (QColor)
         """
         self.__curColor = QColor(newColor)
         self.colorChanged.emit(QColor(newColor))
-    
+
     def penColor(self):
         """
         Public method to get the current drawing color.
-        
+
         @return current drawing color (QColor)
         """
         return QColor(self.__curColor)
-    
+
     def setCompositingMode(self, mode):
         """
         Public method to set the compositing mode.
-        
+
         @param mode compositing mode to set (QPainter.CompositionMode)
         """
         self.__compositingMode = mode
-    
+
     def compositingMode(self):
         """
         Public method to get the compositing mode.
-        
+
         @return compositing mode (QPainter.CompositionMode)
         """
         return self.__compositingMode
-    
+
     def setTool(self, tool):
         """
         Public method to set the current drawing tool.
-        
+
         @param tool drawing tool to be used
         @type IconEditorTool
         """
         self.__curTool = tool
         self.__lastPos = (-1, -1)
-        
+
         if self.__curTool in [
-            IconEditorTool.SELECT_RECTANGLE, IconEditorTool.SELECT_CIRCLE
+            IconEditorTool.SELECT_RECTANGLE,
+            IconEditorTool.SELECT_CIRCLE,
         ]:
             self.__selecting = True
         else:
             self.__selecting = False
-        
+
         if self.__curTool in [
-            IconEditorTool.SELECT_RECTANGLE, IconEditorTool.SELECT_CIRCLE,
+            IconEditorTool.SELECT_RECTANGLE,
+            IconEditorTool.SELECT_CIRCLE,
             IconEditorTool.LINE,
-            IconEditorTool.RECTANGLE, IconEditorTool.FILLED_RECTANGLE,
-            IconEditorTool.CIRCLE, IconEditorTool.FILLED_CIRCLE,
-            IconEditorTool.ELLIPSE, IconEditorTool.FILLED_ELLIPSE
+            IconEditorTool.RECTANGLE,
+            IconEditorTool.FILLED_RECTANGLE,
+            IconEditorTool.CIRCLE,
+            IconEditorTool.FILLED_CIRCLE,
+            IconEditorTool.ELLIPSE,
+            IconEditorTool.FILLED_ELLIPSE,
         ]:
             self.setCursor(self.__aimCursor)
         elif self.__curTool == IconEditorTool.FILL:
@@ -327,108 +341,107 @@
             self.setCursor(self.__rubberCursor)
         else:
             self.setCursor(self.__normalCursor)
-    
+
     def tool(self):
         """
         Public method to get the current drawing tool.
-        
+
         @return current drawing tool
         @rtype IconEditorTool
         """
         return self.__curTool
-    
+
     def setIconImage(self, newImage, undoRedo=False, clearUndo=False):
         """
         Public method to set a new icon image.
-        
+
         @param newImage reference to the new image (QImage)
         @param undoRedo flag indicating an undo or redo operation (boolean)
         @param clearUndo flag indicating to clear the undo stack (boolean)
         """
         if newImage != self.__image:
-            self.__image = newImage.convertToFormat(
-                QImage.Format.Format_ARGB32)
+            self.__image = newImage.convertToFormat(QImage.Format.Format_ARGB32)
             self.update()
             self.updateGeometry()
             self.resize(self.sizeHint())
-            
+
             self.__markImage = QImage(self.__image)
             self.__markImage.fill(self.NoMarkColor.rgba())
-            
+
             if undoRedo:
                 self.setDirty(not self.__undoStack.isClean())
             else:
                 self.setDirty(False)
-            
+
             if clearUndo:
                 self.__undoStack.clear()
-            
+
             self.sizeChanged.emit(*self.iconSize())
-    
+
     def iconImage(self):
         """
         Public method to get a copy of the icon image.
-        
+
         @return copy of the icon image (QImage)
         """
         return QImage(self.__image)
-    
+
     def iconSize(self):
         """
         Public method to get the size of the icon.
-        
+
         @return width and height of the image as a tuple (integer, integer)
         """
         return self.__image.width(), self.__image.height()
-    
+
     def setZoomFactor(self, newZoom):
         """
         Public method to set the zoom factor in percent.
-        
+
         @param newZoom zoom factor (integer >= 100)
         """
-        newZoom = max(100, newZoom)   # must not be less than 100
+        newZoom = max(100, newZoom)  # must not be less than 100
         if newZoom != self.__zoom:
             self.__zoom = newZoom // 100
             self.update()
             self.updateGeometry()
             self.resize(self.sizeHint())
             self.zoomChanged.emit(int(self.__zoom * 100))
-    
+
     def zoomFactor(self):
         """
         Public method to get the current zoom factor in percent.
-        
+
         @return zoom factor (integer)
         """
         return self.__zoom * 100
-    
+
     def setGridEnabled(self, enable):
         """
         Public method to enable the display of grid lines.
-        
+
         @param enable enabled status of the grid lines (boolean)
         """
         if enable != self.__gridEnabled:
             self.__gridEnabled = enable
             self.update()
-    
+
     def isGridEnabled(self):
         """
         Public method to get the grid lines status.
-        
+
         @return enabled status of the grid lines (boolean)
         """
         return self.__gridEnabled
-    
+
     def paintEvent(self, evt):
         """
         Protected method called to repaint some of the widget.
-        
+
         @param evt reference to the paint event object (QPaintEvent)
         """
         painter = QPainter(self)
-        
+
         if self.__zoom >= 3 and self.__gridEnabled:
             if ericApp().usesDarkPalette():
                 painter.setPen(self.palette().window().color())
@@ -437,16 +450,22 @@
             i = 0
             while i <= self.__image.width():
                 painter.drawLine(
-                    self.__zoom * i, 0,
-                    self.__zoom * i, self.__zoom * self.__image.height())
+                    self.__zoom * i,
+                    0,
+                    self.__zoom * i,
+                    self.__zoom * self.__image.height(),
+                )
                 i += 1
             j = 0
             while j <= self.__image.height():
                 painter.drawLine(
-                    0, self.__zoom * j,
-                    self.__zoom * self.__image.width(), self.__zoom * j)
+                    0,
+                    self.__zoom * j,
+                    self.__zoom * self.__image.width(),
+                    self.__zoom * j,
+                )
                 j += 1
-        
+
         col = QColor("#aaa")
         painter.setPen(Qt.PenStyle.DashLine)
         for i in range(0, self.__image.width()):
@@ -456,34 +475,36 @@
                     color = QColor.fromRgba(self.__image.pixel(i, j))
                     painter.fillRect(rect, QBrush(Qt.GlobalColor.white))
                     painter.fillRect(QRect(rect.topLeft(), rect.center()), col)
-                    painter.fillRect(QRect(rect.center(), rect.bottomRight()),
-                                     col)
+                    painter.fillRect(QRect(rect.center(), rect.bottomRight()), col)
                     painter.fillRect(rect, QBrush(color))
-                
+
                     if self.__isMarked(i, j):
                         painter.drawRect(rect.adjusted(0, 0, -1, -1))
-        
+
         painter.end()
-    
+
     def __pixelRect(self, i, j):
         """
         Private method to determine the rectangle for a given pixel coordinate.
-        
+
         @param i x-coordinate of the pixel in the image (integer)
         @param j y-coordinate of the pixel in the image (integer)
         @return rectangle for the given pixel coordinates (QRect)
         """
         if self.__zoom >= 3 and self.__gridEnabled:
-            return QRect(self.__zoom * i + 1, self.__zoom * j + 1,
-                         self.__zoom - 1, self.__zoom - 1)
+            return QRect(
+                self.__zoom * i + 1,
+                self.__zoom * j + 1,
+                self.__zoom - 1,
+                self.__zoom - 1,
+            )
         else:
-            return QRect(self.__zoom * i, self.__zoom * j,
-                         self.__zoom, self.__zoom)
-    
+            return QRect(self.__zoom * i, self.__zoom * j, self.__zoom, self.__zoom)
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse button press events.
-        
+
         @param evt reference to the mouse event object (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
@@ -494,17 +515,19 @@
                 self.update(self.__pasteRect)
                 self.__pasteRect = QRect()
                 return
-            
+
             if self.__curTool == IconEditorTool.PENCIL:
-                cmd = IconEditCommand(self, self.__undoTexts[self.__curTool],
-                                      self.__image)
+                cmd = IconEditCommand(
+                    self, self.__undoTexts[self.__curTool], self.__image
+                )
                 self.__setImagePixel(evt.position().toPoint(), True)
                 self.setDirty(True)
                 self.__undoStack.push(cmd)
                 self.__currentUndoCmd = cmd
             elif self.__curTool == IconEditorTool.RUBBER:
-                cmd = IconEditCommand(self, self.__undoTexts[self.__curTool],
-                                      self.__image)
+                cmd = IconEditCommand(
+                    self, self.__undoTexts[self.__curTool], self.__image
+                )
                 self.__setImagePixel(evt.position().toPoint(), False)
                 self.setDirty(True)
                 self.__undoStack.push(cmd)
@@ -513,8 +536,9 @@
                 i, j = self.__imageCoordinates(evt.position().toPoint())
                 col = QColor()
                 col.setRgba(self.__image.pixel(i, j))
-                cmd = IconEditCommand(self, self.__undoTexts[self.__curTool],
-                                      self.__image)
+                cmd = IconEditCommand(
+                    self, self.__undoTexts[self.__curTool], self.__image
+                )
                 self.__drawFlood(i, j, col)
                 self.setDirty(True)
                 self.__undoStack.push(cmd)
@@ -528,23 +552,19 @@
                 self.__unMark()
                 self.__startPos = evt.position().toPoint()
                 self.__endPos = evt.position().toPoint()
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the mouse event object (QMouseEvent)
         """
-        self.positionChanged.emit(
-            *self.__imageCoordinates(evt.position().toPoint()))
-        
-        if (
-            self.__isPasting and
-            not (evt.buttons() & Qt.MouseButton.LeftButton)
-        ):
+        self.positionChanged.emit(*self.__imageCoordinates(evt.position().toPoint()))
+
+        if self.__isPasting and not (evt.buttons() & Qt.MouseButton.LeftButton):
             self.__drawPasteRect(evt.position().toPoint())
             return
-        
+
         if evt.buttons() & Qt.MouseButton.LeftButton:
             if self.__curTool == IconEditorTool.PENCIL:
                 self.__setImagePixel(evt.position().toPoint(), True)
@@ -552,48 +572,50 @@
             elif self.__curTool == IconEditorTool.RUBBER:
                 self.__setImagePixel(evt.position().toPoint(), False)
                 self.setDirty(True)
-            elif self.__curTool in [IconEditorTool.FILL,
-                                    IconEditorTool.COLOR_PICKER]:
-                pass    # do nothing
+            elif self.__curTool in [IconEditorTool.FILL, IconEditorTool.COLOR_PICKER]:
+                pass  # do nothing
             else:
                 self.__drawTool(evt.position().toPoint(), True)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse button release events.
-        
+
         @param evt reference to the mouse event object (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             if (
-                self.__curTool in [IconEditorTool.PENCIL,
-                                   IconEditorTool.RUBBER] and
-                self.__currentUndoCmd
+                self.__curTool in [IconEditorTool.PENCIL, IconEditorTool.RUBBER]
+                and self.__currentUndoCmd
             ):
                 self.__currentUndoCmd.setAfterImage(self.__image)
                 self.__currentUndoCmd = None
-            
+
             if self.__curTool not in [
-                IconEditorTool.PENCIL, IconEditorTool.RUBBER,
-                IconEditorTool.FILL, IconEditorTool.COLOR_PICKER,
-                IconEditorTool.SELECT_RECTANGLE, IconEditorTool.SELECT_CIRCLE
+                IconEditorTool.PENCIL,
+                IconEditorTool.RUBBER,
+                IconEditorTool.FILL,
+                IconEditorTool.COLOR_PICKER,
+                IconEditorTool.SELECT_RECTANGLE,
+                IconEditorTool.SELECT_CIRCLE,
             ]:
-                cmd = IconEditCommand(self, self.__undoTexts[self.__curTool],
-                                      self.__image)
+                cmd = IconEditCommand(
+                    self, self.__undoTexts[self.__curTool], self.__image
+                )
                 if self.__drawTool(evt.position().toPoint(), False):
                     self.__undoStack.push(cmd)
                     cmd.setAfterImage(self.__image)
                     self.setDirty(True)
-    
+
     def __setImagePixel(self, pos, opaque):
         """
         Private slot to set or erase a pixel.
-        
+
         @param pos position of the pixel in the widget (QPoint)
         @param opaque flag indicating a set operation (boolean)
         """
         i, j = self.__imageCoordinates(pos)
-        
+
         if self.__image.rect().contains(i, j) and (i, j) != self.__lastPos:
             if opaque:
                 painter = QPainter(self.__image)
@@ -603,66 +625,68 @@
             else:
                 self.__image.setPixel(i, j, qRgba(0, 0, 0, 0))
             self.__lastPos = (i, j)
-        
+
             self.update(self.__pixelRect(i, j))
-    
+
     def __imageCoordinates(self, pos):
         """
         Private method to convert from widget to image coordinates.
-        
+
         @param pos widget coordinate (QPoint)
         @return tuple with the image coordinates (tuple of two integers)
         """
         i = pos.x() // self.__zoom
         j = pos.y() // self.__zoom
         return i, j
-    
+
     def __drawPasteRect(self, pos):
         """
         Private slot to draw a rectangle for signaling a paste operation.
-        
+
         @param pos widget position of the paste rectangle (QPoint)
         """
         self.__markImage.fill(self.NoMarkColor.rgba())
         if self.__pasteRect.isValid():
             self.__updateImageRect(
                 self.__pasteRect.topLeft(),
-                self.__pasteRect.bottomRight() + QPoint(1, 1))
-        
+                self.__pasteRect.bottomRight() + QPoint(1, 1),
+            )
+
         x, y = self.__imageCoordinates(pos)
         isize = self.__image.size()
         sx = (
             self.__clipboardSize.width()
-            if x + self.__clipboardSize.width() <= isize.width() else
-            isize.width() - x
+            if x + self.__clipboardSize.width() <= isize.width()
+            else isize.width() - x
         )
         sy = (
             self.__clipboardSize.height()
-            if y + self.__clipboardSize.height() <= isize.height() else
-            isize.height() - y
+            if y + self.__clipboardSize.height() <= isize.height()
+            else isize.height() - y
         )
-        
+
         self.__pasteRect = QRect(QPoint(x, y), QSize(sx - 1, sy - 1))
-        
+
         painter = QPainter(self.__markImage)
         painter.setPen(self.MarkColor)
         painter.drawRect(self.__pasteRect)
         painter.end()
-        
-        self.__updateImageRect(self.__pasteRect.topLeft(),
-                               self.__pasteRect.bottomRight() + QPoint(1, 1))
-    
+
+        self.__updateImageRect(
+            self.__pasteRect.topLeft(), self.__pasteRect.bottomRight() + QPoint(1, 1)
+        )
+
     def __drawTool(self, pos, mark):
         """
         Private method to perform a draw operation depending of the current
         tool.
-        
+
         @param pos widget coordinate to perform the draw operation at (QPoint)
         @param mark flag indicating a mark operation (boolean)
         @return flag indicating a successful draw (boolean)
         """
         self.__unMark()
-        
+
         if mark:
             self.__endPos = QPoint(pos)
             drawColor = self.MarkColor
@@ -670,20 +694,21 @@
         else:
             drawColor = self.penColor()
             img = self.__image
-        
+
         start = QPoint(*self.__imageCoordinates(self.__startPos))
         end = QPoint(*self.__imageCoordinates(pos))
-        
+
         painter = QPainter(img)
         painter.setPen(drawColor)
         painter.setCompositionMode(self.__compositingMode)
-        
+
         if self.__curTool == IconEditorTool.LINE:
             painter.drawLine(start, end)
-        
+
         elif self.__curTool in [
-            IconEditorTool.RECTANGLE, IconEditorTool.FILLED_RECTANGLE,
-            IconEditorTool.SELECT_RECTANGLE
+            IconEditorTool.RECTANGLE,
+            IconEditorTool.FILLED_RECTANGLE,
+            IconEditorTool.SELECT_RECTANGLE,
         ]:
             left = min(start.x(), end.x())
             top = min(start.y(), end.y())
@@ -697,32 +722,32 @@
             else:
                 painter.drawRect(left, top, right - left, bottom - top)
             if self.__selecting:
-                self.__selRect = QRect(
-                    left, top, right - left + 1, bottom - top + 1)
+                self.__selRect = QRect(left, top, right - left + 1, bottom - top + 1)
                 self.__selectionAvailable = True
                 self.selectionAvailable.emit(True)
-        
+
         elif self.__curTool in [
-            IconEditorTool.CIRCLE, IconEditorTool.FILLED_CIRCLE,
-            IconEditorTool.SELECT_CIRCLE
+            IconEditorTool.CIRCLE,
+            IconEditorTool.FILLED_CIRCLE,
+            IconEditorTool.SELECT_CIRCLE,
         ]:
             deltaX = abs(start.x() - end.x())
             deltaY = abs(start.y() - end.y())
             r = max(deltaX, deltaY)
             if self.__curTool in [
-                IconEditorTool.FILLED_CIRCLE, IconEditorTool.SELECT_CIRCLE
+                IconEditorTool.FILLED_CIRCLE,
+                IconEditorTool.SELECT_CIRCLE,
             ]:
                 painter.setBrush(QBrush(drawColor))
             painter.drawEllipse(start, r, r)
             if self.__selecting:
-                self.__selRect = QRect(start.x() - r, start.y() - r,
-                                       2 * r + 1, 2 * r + 1)
+                self.__selRect = QRect(
+                    start.x() - r, start.y() - r, 2 * r + 1, 2 * r + 1
+                )
                 self.__selectionAvailable = True
                 self.selectionAvailable.emit(True)
-        
-        elif self.__curTool in [
-            IconEditorTool.ELLIPSE, IconEditorTool.FILLED_ELLIPSE
-        ]:
+
+        elif self.__curTool in [IconEditorTool.ELLIPSE, IconEditorTool.FILLED_ELLIPSE]:
             r1 = abs(start.x() - end.x())
             r2 = abs(start.y() - end.y())
             if r1 == 0 or r2 == 0:
@@ -730,23 +755,25 @@
             if self.__curTool == IconEditorTool.FILLED_ELLIPSE:
                 painter.setBrush(QBrush(drawColor))
             painter.drawEllipse(start, r1, r2)
-        
+
         painter.end()
-        
+
         if self.__curTool in [
-            IconEditorTool.CIRCLE, IconEditorTool.FILLED_CIRCLE,
-            IconEditorTool.ELLIPSE, IconEditorTool.FILLED_ELLIPSE
+            IconEditorTool.CIRCLE,
+            IconEditorTool.FILLED_CIRCLE,
+            IconEditorTool.ELLIPSE,
+            IconEditorTool.FILLED_ELLIPSE,
         ]:
             self.update()
         else:
             self.__updateRect(self.__startPos, pos)
-        
+
         return True
-    
+
     def __drawFlood(self, i, j, oldColor, doUpdate=True):
         """
         Private method to perform a flood fill operation.
-        
+
         @param i x-value in image coordinates (integer)
         @param j y-value in image coordinates (integer)
         @param oldColor reference to the color at position i, j (QColor)
@@ -754,38 +781,40 @@
             (used for speed optimizations)
         """
         if (
-            not self.__image.rect().contains(i, j) or
-            self.__image.pixel(i, j) != oldColor.rgba() or
-            self.__image.pixel(i, j) == self.penColor().rgba()
+            not self.__image.rect().contains(i, j)
+            or self.__image.pixel(i, j) != oldColor.rgba()
+            or self.__image.pixel(i, j) == self.penColor().rgba()
         ):
             return
-        
+
         self.__image.setPixel(i, j, self.penColor().rgba())
-        
+
         self.__drawFlood(i, j - 1, oldColor, False)
         self.__drawFlood(i, j + 1, oldColor, False)
         self.__drawFlood(i - 1, j, oldColor, False)
         self.__drawFlood(i + 1, j, oldColor, False)
-        
+
         if doUpdate:
             self.update()
-    
+
     def __updateRect(self, pos1, pos2):
         """
         Private slot to update parts of the widget.
-        
+
         @param pos1 top, left position for the update in widget coordinates
             (QPoint)
         @param pos2 bottom, right position for the update in widget
             coordinates (QPoint)
         """
-        self.__updateImageRect(QPoint(*self.__imageCoordinates(pos1)),
-                               QPoint(*self.__imageCoordinates(pos2)))
-    
+        self.__updateImageRect(
+            QPoint(*self.__imageCoordinates(pos1)),
+            QPoint(*self.__imageCoordinates(pos2)),
+        )
+
     def __updateImageRect(self, ipos1, ipos2):
         """
         Private slot to update parts of the widget.
-        
+
         @param ipos1 top, left position for the update in image coordinates
             (QPoint)
         @param ipos2 bottom, right position for the update in image
@@ -793,58 +822,60 @@
         """
         r1 = self.__pixelRect(ipos1.x(), ipos1.y())
         r2 = self.__pixelRect(ipos2.x(), ipos2.y())
-        
+
         left = min(r1.x(), r2.x())
         top = min(r1.y(), r2.y())
         right = max(r1.x() + r1.width(), r2.x() + r2.width())
         bottom = max(r1.y() + r1.height(), r2.y() + r2.height())
         self.update(left, top, right - left + 1, bottom - top + 1)
-    
+
     def __unMark(self):
         """
         Private slot to remove the mark indicator.
         """
         self.__markImage.fill(self.NoMarkColor.rgba())
         if self.__curTool in [
-            IconEditorTool.CIRCLE, IconEditorTool.FILLED_CIRCLE,
-            IconEditorTool.ELLIPSE, IconEditorTool.FILLED_ELLIPSE,
-            IconEditorTool.SELECT_CIRCLE
+            IconEditorTool.CIRCLE,
+            IconEditorTool.FILLED_CIRCLE,
+            IconEditorTool.ELLIPSE,
+            IconEditorTool.FILLED_ELLIPSE,
+            IconEditorTool.SELECT_CIRCLE,
         ]:
             self.update()
         else:
             self.__updateRect(self.__startPos, self.__endPos)
-        
+
         if self.__selecting:
             self.__selRect = QRect()
             self.__selectionAvailable = False
             self.selectionAvailable.emit(False)
-    
+
     def __isMarked(self, i, j):
         """
         Private method to check, if a pixel is marked.
-        
+
         @param i x-value in image coordinates (integer)
         @param j y-value in image coordinates (integer)
         @return flag indicating a marked pixel (boolean)
         """
         return self.__markImage.pixel(i, j) == self.MarkColor.rgba()
-    
+
     def __updatePreviewPixmap(self):
         """
         Private slot to generate and signal an updated preview pixmap.
         """
         p = QPixmap.fromImage(self.__image)
         self.previewChanged.emit(p)
-    
+
     def previewPixmap(self):
         """
         Public method to generate a preview pixmap.
-        
+
         @return preview pixmap (QPixmap)
         """
         p = QPixmap.fromImage(self.__image)
         return p
-    
+
     def __checkClipboard(self):
         """
         Private slot to check, if the clipboard contains a valid image, and
@@ -853,19 +884,19 @@
         ok = self.__clipboardImage()[1]
         self.__clipboardImageAvailable = ok
         self.clipboardImageAvailable.emit(ok)
-    
+
     def canPaste(self):
         """
         Public slot to check the availability of the paste operation.
-        
+
         @return flag indicating availability of paste (boolean)
         """
         return self.__clipboardImageAvailable
-    
+
     def __clipboardImage(self):
         """
         Private method to get an image from the clipboard.
-        
+
         @return tuple with the image (QImage) and a flag indicating a
             valid image (boolean)
         """
@@ -873,48 +904,51 @@
         ok = not img.isNull()
         if ok:
             img = img.convertToFormat(QImage.Format.Format_ARGB32)
-        
+
         return img, ok
-    
+
     def __getSelectionImage(self, cut):
         """
         Private method to get an image from the selection.
-        
+
         @param cut flag indicating to cut the selection (boolean)
         @return image of the selection (QImage)
         """
         if cut:
-            cmd = IconEditCommand(self, self.tr("Cut Selection"),
-                                  self.__image)
-        
+            cmd = IconEditCommand(self, self.tr("Cut Selection"), self.__image)
+
         img = QImage(self.__selRect.size(), QImage.Format.Format_ARGB32)
         img.fill(Qt.GlobalColor.transparent)
         for i in range(0, self.__selRect.width()):
             for j in range(0, self.__selRect.height()):
-                if (
-                    self.__image.rect().contains(
-                        self.__selRect.x() + i, self.__selRect.y() + j) and
-                    self.__isMarked(self.__selRect.x() + i,
-                                    self.__selRect.y() + j)
-                ):
-                    img.setPixel(i, j, self.__image.pixel(
-                        self.__selRect.x() + i, self.__selRect.y() + j))
+                if self.__image.rect().contains(
+                    self.__selRect.x() + i, self.__selRect.y() + j
+                ) and self.__isMarked(self.__selRect.x() + i, self.__selRect.y() + j):
+                    img.setPixel(
+                        i,
+                        j,
+                        self.__image.pixel(
+                            self.__selRect.x() + i, self.__selRect.y() + j
+                        ),
+                    )
                     if cut:
-                        self.__image.setPixel(self.__selRect.x() + i,
-                                              self.__selRect.y() + j,
-                                              Qt.GlobalColor.transparent)
-        
+                        self.__image.setPixel(
+                            self.__selRect.x() + i,
+                            self.__selRect.y() + j,
+                            Qt.GlobalColor.transparent,
+                        )
+
         if cut:
             self.__undoStack.push(cmd)
             cmd.setAfterImage(self.__image)
-        
+
         self.__unMark()
-        
+
         if cut:
             self.update(self.__selRect)
-        
+
         return img
-    
+
     def editCopy(self):
         """
         Public slot to copy the selection.
@@ -922,7 +956,7 @@
         if self.__selRect.isValid():
             img = self.__getSelectionImage(False)
             QApplication.clipboard().setImage(img)
-    
+
     def editCut(self):
         """
         Public slot to cut the selection.
@@ -930,27 +964,29 @@
         if self.__selRect.isValid():
             img = self.__getSelectionImage(True)
             QApplication.clipboard().setImage(img)
-    
+
     @pyqtSlot()
     def editPaste(self, pasting=False):
         """
         Public slot to paste an image from the clipboard.
-        
+
         @param pasting flag indicating part two of the paste operation
             (boolean)
         """
         img, ok = self.__clipboardImage()
         if ok:
             if (
-                img.width() > self.__image.width() or
-                img.height() > self.__image.height()
+                img.width() > self.__image.width()
+                or img.height() > self.__image.height()
             ):
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Paste"),
                     self.tr(
                         """<p>The clipboard image is larger than the"""
-                        """ current image.<br/>Paste as new image?</p>"""))
+                        """ current image.<br/>Paste as new image?</p>"""
+                    ),
+                )
                 if res:
                     self.editPasteAsNew()
                 return
@@ -958,29 +994,35 @@
                 self.__isPasting = True
                 self.__clipboardSize = img.size()
             else:
-                cmd = IconEditCommand(self, self.tr("Paste Clipboard"),
-                                      self.__image)
+                cmd = IconEditCommand(self, self.tr("Paste Clipboard"), self.__image)
                 self.__markImage.fill(self.NoMarkColor.rgba())
                 painter = QPainter(self.__image)
                 painter.setPen(self.penColor())
                 painter.setCompositionMode(self.__compositingMode)
                 painter.drawImage(
-                    self.__pasteRect.x(), self.__pasteRect.y(), img, 0, 0,
+                    self.__pasteRect.x(),
+                    self.__pasteRect.y(),
+                    img,
+                    0,
+                    0,
                     self.__pasteRect.width() + 1,
-                    self.__pasteRect.height() + 1)
-                
+                    self.__pasteRect.height() + 1,
+                )
+
                 self.__undoStack.push(cmd)
                 cmd.setAfterImage(self.__image)
-                
+
                 self.__updateImageRect(
                     self.__pasteRect.topLeft(),
-                    self.__pasteRect.bottomRight() + QPoint(1, 1))
+                    self.__pasteRect.bottomRight() + QPoint(1, 1),
+                )
         else:
             EricMessageBox.warning(
                 self,
                 self.tr("Pasting Image"),
-                self.tr("""Invalid image data in clipboard."""))
-    
+                self.tr("""Invalid image data in clipboard."""),
+            )
+
     def editPasteAsNew(self):
         """
         Public slot to paste the clipboard as a new image.
@@ -988,69 +1030,70 @@
         img, ok = self.__clipboardImage()
         if ok:
             cmd = IconEditCommand(
-                self, self.tr("Paste Clipboard as New Image"),
-                self.__image)
+                self, self.tr("Paste Clipboard as New Image"), self.__image
+            )
             self.setIconImage(img)
             self.setDirty(True)
             self.__undoStack.push(cmd)
             cmd.setAfterImage(self.__image)
-    
+
     def editSelectAll(self):
         """
         Public slot to select the complete image.
         """
         self.__unMark()
-        
+
         self.__startPos = QPoint(0, 0)
         self.__endPos = QPoint(self.rect().bottomRight())
         self.__markImage.fill(self.MarkColor.rgba())
         self.__selRect = self.__image.rect()
         self.__selectionAvailable = True
         self.selectionAvailable.emit(True)
-        
+
         self.update()
-    
+
     def editClear(self):
         """
         Public slot to clear the image.
         """
         self.__unMark()
-        
+
         cmd = IconEditCommand(self, self.tr("Clear Image"), self.__image)
         self.__image.fill(Qt.GlobalColor.transparent)
         self.update()
         self.setDirty(True)
         self.__undoStack.push(cmd)
         cmd.setAfterImage(self.__image)
-    
+
     def editResize(self):
         """
         Public slot to resize the image.
         """
         from .IconSizeDialog import IconSizeDialog
+
         dlg = IconSizeDialog(self.__image.width(), self.__image.height())
         res = dlg.exec()
         if res == QDialog.DialogCode.Accepted:
             newWidth, newHeight = dlg.getData()
-            if (
-                newWidth != self.__image.width() or
-                newHeight != self.__image.height()
-            ):
-                cmd = IconEditCommand(self, self.tr("Resize Image"),
-                                      self.__image)
+            if newWidth != self.__image.width() or newHeight != self.__image.height():
+                cmd = IconEditCommand(self, self.tr("Resize Image"), self.__image)
                 img = self.__image.scaled(
-                    newWidth, newHeight, Qt.AspectRatioMode.IgnoreAspectRatio,
-                    Qt.TransformationMode.SmoothTransformation)
+                    newWidth,
+                    newHeight,
+                    Qt.AspectRatioMode.IgnoreAspectRatio,
+                    Qt.TransformationMode.SmoothTransformation,
+                )
                 self.setIconImage(img)
                 self.setDirty(True)
                 self.__undoStack.push(cmd)
                 cmd.setAfterImage(self.__image)
-    
+
     def editNew(self):
         """
         Public slot to generate a new, empty image.
         """
         from .IconSizeDialog import IconSizeDialog
+
         dlg = IconSizeDialog(self.__image.width(), self.__image.height())
         res = dlg.exec()
         if res == QDialog.DialogCode.Accepted:
@@ -1058,20 +1101,18 @@
             img = QImage(width, height, QImage.Format.Format_ARGB32)
             img.fill(Qt.GlobalColor.transparent)
             self.setIconImage(img)
-    
+
     def grayScale(self):
         """
         Public slot to convert the image to gray preserving transparency.
         """
-        cmd = IconEditCommand(self, self.tr("Convert to Grayscale"),
-                              self.__image)
+        cmd = IconEditCommand(self, self.tr("Convert to Grayscale"), self.__image)
         for x in range(self.__image.width()):
             for y in range(self.__image.height()):
                 col = self.__image.pixel(x, y)
                 if col != qRgba(0, 0, 0, 0):
                     gray = qGray(col)
-                    self.__image.setPixel(
-                        x, y, qRgba(gray, gray, gray, qAlpha(col)))
+                    self.__image.setPixel(x, y, qRgba(gray, gray, gray, qAlpha(col)))
         self.update()
         self.setDirty(True)
         self.__undoStack.push(cmd)
@@ -1083,38 +1124,38 @@
         """
         if self.__undoStack.canUndo():
             self.__undoStack.undo()
-    
+
     def editRedo(self):
         """
         Public slot to perform a redo operation.
         """
         if self.__undoStack.canRedo():
             self.__undoStack.redo()
-    
+
     def canUndo(self):
         """
         Public method to return the undo status.
-        
+
         @return flag indicating the availability of undo (boolean)
         """
         return self.__undoStack.canUndo()
-    
+
     def canRedo(self):
         """
         Public method to return the redo status.
-        
+
         @return flag indicating the availability of redo (boolean)
         """
         return self.__undoStack.canRedo()
-    
+
     def __cleanChanged(self, clean):
         """
         Private slot to handle the undo stack clean state change.
-        
+
         @param clean flag indicating the clean state (boolean)
         """
         self.setDirty(not clean)
-    
+
     def shutdown(self):
         """
         Public slot to perform some shutdown actions.
@@ -1122,11 +1163,11 @@
         self.__undoStack.canRedoChanged.disconnect(self.canRedoChanged)
         self.__undoStack.canUndoChanged.disconnect(self.canUndoChanged)
         self.__undoStack.cleanChanged.disconnect(self.__cleanChanged)
-    
+
     def isSelectionAvailable(self):
         """
         Public method to check the availability of a selection.
-        
+
         @return flag indicating the availability of a selection (boolean)
         """
         return self.__selectionAvailable
--- a/src/eric7/IconEditor/IconEditorPalette.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/IconEditor/IconEditorPalette.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,186 +10,218 @@
 from PyQt6.QtCore import pyqtSignal, Qt
 from PyQt6.QtGui import QColor, QPainter, QPixmap
 from PyQt6.QtWidgets import (
-    QWidget, QBoxLayout, QLabel, QFrame, QPushButton, QSpinBox, QGroupBox,
-    QVBoxLayout, QRadioButton, QSpacerItem, QSizePolicy, QColorDialog
+    QWidget,
+    QBoxLayout,
+    QLabel,
+    QFrame,
+    QPushButton,
+    QSpinBox,
+    QGroupBox,
+    QVBoxLayout,
+    QRadioButton,
+    QSpacerItem,
+    QSizePolicy,
+    QColorDialog,
 )
 
 
 class IconEditorPalette(QWidget):
     """
     Class implementing a palette widget for the icon editor.
-    
+
     @signal colorSelected(QColor) emitted after a new color has been selected
     @signal compositingChanged(QPainter.CompositionMode) emitted to signal a
         change of the compositing mode
     """
+
     colorSelected = pyqtSignal(QColor)
     compositingChanged = pyqtSignal(QPainter.CompositionMode)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         direction = (
             QBoxLayout.Direction.LeftToRight
-            if self.layoutDirection == Qt.Orientation.Horizontal else
-            QBoxLayout.Direction.TopToBottom
+            if self.layoutDirection == Qt.Orientation.Horizontal
+            else QBoxLayout.Direction.TopToBottom
         )
         self.__layout = QBoxLayout(direction, self)
         self.setLayout(self.__layout)
-        
+
         self.__preview = QLabel(self)
         self.__preview.setFrameStyle(QFrame.Shape.Panel | QFrame.Shadow.Sunken)
         self.__preview.setFixedHeight(64)
         self.__preview.setAlignment(
-            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
-        self.__preview.setWhatsThis(self.tr(
-            """<b>Preview</b>"""
-            """<p>This is a 1:1 preview of the current icon.</p>"""
-        ))
+            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
+        )
+        self.__preview.setWhatsThis(
+            self.tr(
+                """<b>Preview</b>"""
+                """<p>This is a 1:1 preview of the current icon.</p>"""
+            )
+        )
         self.__layout.addWidget(self.__preview)
-        
+
         self.__color = QLabel(self)
         self.__color.setFrameStyle(QFrame.Shape.Panel | QFrame.Shadow.Sunken)
         self.__color.setFixedHeight(24)
         self.__color.setAlignment(
-            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
-        self.__color.setWhatsThis(self.tr(
-            """<b>Current Color</b>"""
-            """<p>This is the currently selected color used for drawing.</p>"""
-        ))
+            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
+        )
+        self.__color.setWhatsThis(
+            self.tr(
+                """<b>Current Color</b>"""
+                """<p>This is the currently selected color used for drawing.</p>"""
+            )
+        )
         self.__layout.addWidget(self.__color)
-        
+
         self.__colorTxt = QLabel(self)
         self.__colorTxt.setAlignment(
-            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
-        self.__colorTxt.setWhatsThis(self.tr(
-            """<b>Current Color Value</b>"""
-            """<p>This is the currently selected color value used for"""
-            """ drawing.</p>"""
-        ))
+            Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
+        )
+        self.__colorTxt.setWhatsThis(
+            self.tr(
+                """<b>Current Color Value</b>"""
+                """<p>This is the currently selected color value used for"""
+                """ drawing.</p>"""
+            )
+        )
         self.__layout.addWidget(self.__colorTxt)
-        
+
         self.__colorButton = QPushButton(self.tr("Select Color"), self)
-        self.__colorButton.setWhatsThis(self.tr(
-            """<b>Select Color</b>"""
-            """<p>Select the current drawing color via a color selection"""
-            """ dialog.</p>"""
-        ))
+        self.__colorButton.setWhatsThis(
+            self.tr(
+                """<b>Select Color</b>"""
+                """<p>Select the current drawing color via a color selection"""
+                """ dialog.</p>"""
+            )
+        )
         self.__colorButton.clicked.connect(self.__selectColor)
         self.__layout.addWidget(self.__colorButton)
-        
+
         self.__colorAlpha = QSpinBox(self)
         self.__colorAlpha.setRange(0, 255)
-        self.__colorAlpha.setWhatsThis(self.tr(
-            """<b>Select alpha channel value</b>"""
-            """<p>Select the value for the alpha channel of the current"""
-            """ color.</p>"""
-        ))
+        self.__colorAlpha.setWhatsThis(
+            self.tr(
+                """<b>Select alpha channel value</b>"""
+                """<p>Select the value for the alpha channel of the current"""
+                """ color.</p>"""
+            )
+        )
         self.__layout.addWidget(self.__colorAlpha)
         self.__colorAlpha.valueChanged[int].connect(self.__alphaChanged)
-        
+
         self.__compositingGroup = QGroupBox(self.tr("Compositing"), self)
         self.__compositingGroupLayout = QVBoxLayout(self.__compositingGroup)
         self.__compositingGroup.setLayout(self.__compositingGroupLayout)
-        self.__sourceButton = QRadioButton(self.tr("Replace"),
-                                           self.__compositingGroup)
-        self.__sourceButton.setWhatsThis(self.tr(
-            """<b>Replace</b>"""
-            """<p>Replace the existing pixel with a new color.</p>"""
-        ))
+        self.__sourceButton = QRadioButton(self.tr("Replace"), self.__compositingGroup)
+        self.__sourceButton.setWhatsThis(
+            self.tr(
+                """<b>Replace</b>"""
+                """<p>Replace the existing pixel with a new color.</p>"""
+            )
+        )
         self.__sourceButton.clicked[bool].connect(self.__compositingChanged)
         self.__compositingGroupLayout.addWidget(self.__sourceButton)
-        self.__sourceOverButton = QRadioButton(self.tr("Blend"),
-                                               self.__compositingGroup)
-        self.__sourceOverButton.setWhatsThis(self.tr(
-            """<b>Blend</b>"""
-            """<p>Blend the new color over the existing pixel.</p>"""
-        ))
+        self.__sourceOverButton = QRadioButton(
+            self.tr("Blend"), self.__compositingGroup
+        )
+        self.__sourceOverButton.setWhatsThis(
+            self.tr(
+                """<b>Blend</b>"""
+                """<p>Blend the new color over the existing pixel.</p>"""
+            )
+        )
         self.__sourceOverButton.setChecked(True)
-        self.__sourceOverButton.clicked[bool].connect(
-            self.__compositingChanged)
+        self.__sourceOverButton.clicked[bool].connect(self.__compositingChanged)
         self.__compositingGroupLayout.addWidget(self.__sourceOverButton)
         self.__layout.addWidget(self.__compositingGroup)
-        
+
         spacer = QSpacerItem(
-            10, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+            10, 10, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.__layout.addItem(spacer)
-    
+
     def previewChanged(self, pixmap):
         """
         Public slot to update the preview.
-        
+
         @param pixmap new preview pixmap (QPixmap)
         """
         self.__preview.setPixmap(pixmap)
-    
+
     def colorChanged(self, color):
         """
         Public slot to update the color preview.
-        
+
         @param color new color (QColor)
         """
         self.__currentColor = color
         self.__currentAlpha = color.alpha()
-        
+
         pm = QPixmap(90, 18)
         pm.fill(color)
         self.__color.setPixmap(pm)
-        
+
         self.__colorTxt.setText(
             "{0:d}, {1:d}, {2:d}, {3:d}".format(
-                color.red(), color.green(), color.blue(), color.alpha()))
-        
+                color.red(), color.green(), color.blue(), color.alpha()
+            )
+        )
+
         self.__colorAlpha.setValue(self.__currentAlpha)
-    
+
     def __selectColor(self):
         """
         Private slot to select a new drawing color.
         """
         col = QColorDialog.getColor(self.__currentColor)
         col.setAlpha(self.__currentAlpha)
-        
+
         if col.isValid():
             self.colorSelected.emit(col)
-    
+
     def __alphaChanged(self, val):
         """
         Private slot to track changes of the alpha channel.
-        
+
         @param val value of the alpha channel
         """
         if val != self.__currentAlpha:
             col = QColor(self.__currentColor)
             col.setAlpha(val)
             self.colorSelected.emit(col)
-    
+
     def setCompositingMode(self, mode):
         """
         Public method to set the compositing mode.
-        
+
         @param mode compositing mode to set (QPainter.CompositionMode)
         """
         if mode == QPainter.CompositionMode.CompositionMode_Source:
             self.__sourceButton.setChecked(True)
         elif mode == QPainter.CompositionMode.CompositionMode_SourceOver:
             self.__sourceOverButton.setChecked(True)
-    
+
     def __compositingChanged(self, on):
         """
         Private slot to handle a change of the compositing mode.
-        
+
         @param on flag indicating the checked state of the compositing button
             (boolean)
         """
         if on:
             if self.__sourceButton.isChecked():
                 self.compositingChanged.emit(
-                    QPainter.CompositionMode.CompositionMode_Source)
+                    QPainter.CompositionMode.CompositionMode_Source
+                )
             elif self.__sourceOverButton.isChecked():
                 self.compositingChanged.emit(
-                    QPainter.CompositionMode.CompositionMode_SourceOver)
+                    QPainter.CompositionMode.CompositionMode_SourceOver
+                )
--- a/src/eric7/IconEditor/IconEditorWindow.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/IconEditor/IconEditorWindow.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 import pathlib
 
 from PyQt6.QtCore import pyqtSignal, Qt, QSize, QSignalMapper, QEvent
-from PyQt6.QtGui import (
-    QPalette, QImage, QImageReader, QImageWriter, QKeySequence
-)
+from PyQt6.QtGui import QPalette, QImage, QImageReader, QImageWriter, QKeySequence
 from PyQt6.QtWidgets import QScrollArea, QLabel, QDockWidget, QWhatsThis
 
 from EricGui.EricAction import EricAction, createActionGroup
@@ -33,18 +31,25 @@
 class IconEditorWindow(EricMainWindow):
     """
     Class implementing the web browser main window.
-    
+
     @signal editorClosed() emitted after the window was requested to close down
     """
+
     editorClosed = pyqtSignal()
-    
+
     windows = []
-    
-    def __init__(self, fileName="", parent=None, fromEric=False,
-                 initShortcutsOnly=False, project=None):
+
+    def __init__(
+        self,
+        fileName="",
+        parent=None,
+        fromEric=False,
+        initShortcutsOnly=False,
+        project=None,
+    ):
         """
         Constructor
-        
+
         @param fileName name of a file to load on startup (string)
         @param parent parent widget of this window (QWidget)
         @param fromEric flag indicating whether it was called from within
@@ -55,102 +60,100 @@
         """
         super().__init__(parent)
         self.setObjectName("eric7_icon_editor")
-        
+
         self.fromEric = fromEric
         self.initShortcutsOnly = initShortcutsOnly
         self.setWindowIcon(UI.PixmapCache.getIcon("iconEditor"))
-        
+
         if self.initShortcutsOnly:
             self.__initActions()
         else:
             if not self.fromEric:
-                self.setStyle(Preferences.getUI("Style"),
-                              Preferences.getUI("StyleSheet"))
+                self.setStyle(
+                    Preferences.getUI("Style"), Preferences.getUI("StyleSheet")
+                )
             self.__editor = IconEditorGrid()
             self.__scrollArea = QScrollArea()
             self.__scrollArea.setWidget(self.__editor)
-            self.__scrollArea.viewport().setBackgroundRole(
-                QPalette.ColorRole.Dark)
+            self.__scrollArea.viewport().setBackgroundRole(QPalette.ColorRole.Dark)
             self.__scrollArea.viewport().setAutoFillBackground(True)
             self.setCentralWidget(self.__scrollArea)
-            
+
             g = Preferences.getGeometry("IconEditorGeometry")
             if g.isEmpty():
                 s = QSize(600, 500)
                 self.resize(s)
             else:
                 self.restoreGeometry(g)
-            
+
             self.__initActions()
             self.__initMenus()
             self.__initToolbars()
             self.__createStatusBar()
             self.__initFileFilters()
             self.__createPaletteDock()
-            
+
             self.__palette.previewChanged(self.__editor.previewPixmap())
             self.__palette.colorChanged(self.__editor.penColor())
             self.__palette.setCompositingMode(self.__editor.compositingMode())
-            
+
             self.__class__.windows.append(self)
-            
+
             state = Preferences.getIconEditor("IconEditorState")
             self.restoreState(state)
-            
+
             self.__editor.imageChanged.connect(self.__modificationChanged)
             self.__editor.positionChanged.connect(self.__updatePosition)
             self.__editor.sizeChanged.connect(self.__updateSize)
             self.__editor.previewChanged.connect(self.__palette.previewChanged)
             self.__editor.colorChanged.connect(self.__palette.colorChanged)
             self.__palette.colorSelected.connect(self.__editor.setPenColor)
-            self.__palette.compositingChanged.connect(
-                self.__editor.setCompositingMode)
-            
+            self.__palette.compositingChanged.connect(self.__editor.setCompositingMode)
+
             self.__setCurrentFile("")
             if fileName:
                 self.__loadIconFile(fileName)
-            
+
             self.__checkActions()
-            
+
             self.__project = project
             self.__lastOpenPath = ""
             self.__lastSavePath = ""
-            
+
             self.grabGesture(Qt.GestureType.PinchGesture)
-    
+
     def __initFileFilters(self):
         """
         Private method to define the supported image file filters.
         """
         filters = {
-            'bmp': self.tr("Windows Bitmap File (*.bmp)"),
-            'cur': self.tr("Windows Cursor File (*.cur)"),
-            'dds': self.tr("DirectDraw-Surface File (*.dds)"),
-            'gif': self.tr("Graphic Interchange Format File (*.gif)"),
-            'icns': self.tr("Apple Icon File (*.icns)"),
-            'ico': self.tr("Windows Icon File (*.ico)"),
-            'jp2': self.tr("JPEG2000 File (*.jp2)"),
-            'jpg': self.tr("JPEG File (*.jpg)"),
-            'jpeg': self.tr("JPEG File (*.jpeg)"),
-            'mng': self.tr("Multiple-Image Network Graphics File (*.mng)"),
-            'pbm': self.tr("Portable Bitmap File (*.pbm)"),
-            'pcx': self.tr("Paintbrush Bitmap File (*.pcx)"),
-            'pgm': self.tr("Portable Graymap File (*.pgm)"),
-            'png': self.tr("Portable Network Graphics File (*.png)"),
-            'ppm': self.tr("Portable Pixmap File (*.ppm)"),
-            'sgi': self.tr("Silicon Graphics Image File (*.sgi)"),
-            'svg': self.tr("Scalable Vector Graphics File (*.svg)"),
-            'svgz': self.tr("Compressed Scalable Vector Graphics File"
-                            " (*.svgz)"),
-            'tga': self.tr("Targa Graphic File (*.tga)"),
-            'tif': self.tr("TIFF File (*.tif)"),
-            'tiff': self.tr("TIFF File (*.tiff)"),
-            'wbmp': self.tr("WAP Bitmap File (*.wbmp)"),
-            'webp': self.tr("WebP Image File (*.webp)"),
-            'xbm': self.tr("X11 Bitmap File (*.xbm)"),
-            'xpm': self.tr("X11 Pixmap File (*.xpm)"),
+            "bmp": self.tr("Windows Bitmap File (*.bmp)"),
+            "cur": self.tr("Windows Cursor File (*.cur)"),
+            "dds": self.tr("DirectDraw-Surface File (*.dds)"),
+            "gif": self.tr("Graphic Interchange Format File (*.gif)"),
+            "icns": self.tr("Apple Icon File (*.icns)"),
+            "ico": self.tr("Windows Icon File (*.ico)"),
+            "jp2": self.tr("JPEG2000 File (*.jp2)"),
+            "jpg": self.tr("JPEG File (*.jpg)"),
+            "jpeg": self.tr("JPEG File (*.jpeg)"),
+            "mng": self.tr("Multiple-Image Network Graphics File (*.mng)"),
+            "pbm": self.tr("Portable Bitmap File (*.pbm)"),
+            "pcx": self.tr("Paintbrush Bitmap File (*.pcx)"),
+            "pgm": self.tr("Portable Graymap File (*.pgm)"),
+            "png": self.tr("Portable Network Graphics File (*.png)"),
+            "ppm": self.tr("Portable Pixmap File (*.ppm)"),
+            "sgi": self.tr("Silicon Graphics Image File (*.sgi)"),
+            "svg": self.tr("Scalable Vector Graphics File (*.svg)"),
+            "svgz": self.tr("Compressed Scalable Vector Graphics File" " (*.svgz)"),
+            "tga": self.tr("Targa Graphic File (*.tga)"),
+            "tif": self.tr("TIFF File (*.tif)"),
+            "tiff": self.tr("TIFF File (*.tiff)"),
+            "wbmp": self.tr("WAP Bitmap File (*.wbmp)"),
+            "webp": self.tr("WebP Image File (*.webp)"),
+            "xbm": self.tr("X11 Bitmap File (*.xbm)"),
+            "xpm": self.tr("X11 Pixmap File (*.xpm)"),
         }
-        
+
         inputFormats = []
         readFormats = QImageReader.supportedImageFormats()
         for readFormat in readFormats:
@@ -158,668 +161,797 @@
                 inputFormats.append(filters[bytes(readFormat).decode()])
         inputFormats.sort()
         inputFormats.append(self.tr("All Files (*)"))
-        self.__inputFilter = ';;'.join(inputFormats)
-        
+        self.__inputFilter = ";;".join(inputFormats)
+
         outputFormats = []
         writeFormats = QImageWriter.supportedImageFormats()
         for writeFormat in writeFormats:
             with contextlib.suppress(KeyError):
                 outputFormats.append(filters[bytes(writeFormat).decode()])
         outputFormats.sort()
-        self.__outputFilter = ';;'.join(outputFormats)
-        
-        self.__defaultFilter = filters['png']
-    
+        self.__outputFilter = ";;".join(outputFormats)
+
+        self.__defaultFilter = filters["png"]
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         # list of all actions
         self.__actions = []
-        
+
         self.__initFileActions()
         self.__initEditActions()
         self.__initViewActions()
         self.__initToolsActions()
         self.__initHelpActions()
-        
+
     def __initFileActions(self):
         """
         Private method to define the file related user interface actions.
         """
         self.newAct = EricAction(
-            self.tr('New'),
+            self.tr("New"),
             UI.PixmapCache.getIcon("new"),
-            self.tr('&New'),
+            self.tr("&New"),
             QKeySequence(self.tr("Ctrl+N", "File|New")),
-            0, self, 'iconEditor_file_new')
-        self.newAct.setStatusTip(self.tr('Create a new icon'))
-        self.newAct.setWhatsThis(self.tr(
-            """<b>New</b>"""
-            """<p>This creates a new icon.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_new",
+        )
+        self.newAct.setStatusTip(self.tr("Create a new icon"))
+        self.newAct.setWhatsThis(
+            self.tr("""<b>New</b>""" """<p>This creates a new icon.</p>""")
+        )
         self.newAct.triggered.connect(self.__newIcon)
         self.__actions.append(self.newAct)
-        
+
         self.newWindowAct = EricAction(
-            self.tr('New Window'),
+            self.tr("New Window"),
             UI.PixmapCache.getIcon("newWindow"),
-            self.tr('New &Window'),
-            0, 0, self, 'iconEditor_file_new_window')
-        self.newWindowAct.setStatusTip(self.tr(
-            'Open a new icon editor window'))
-        self.newWindowAct.setWhatsThis(self.tr(
-            """<b>New Window</b>"""
-            """<p>This opens a new icon editor window.</p>"""
-        ))
+            self.tr("New &Window"),
+            0,
+            0,
+            self,
+            "iconEditor_file_new_window",
+        )
+        self.newWindowAct.setStatusTip(self.tr("Open a new icon editor window"))
+        self.newWindowAct.setWhatsThis(
+            self.tr(
+                """<b>New Window</b>"""
+                """<p>This opens a new icon editor window.</p>"""
+            )
+        )
         self.newWindowAct.triggered.connect(self.__newWindow)
         self.__actions.append(self.newWindowAct)
-        
+
         self.openAct = EricAction(
-            self.tr('Open'),
+            self.tr("Open"),
             UI.PixmapCache.getIcon("open"),
-            self.tr('&Open...'),
+            self.tr("&Open..."),
             QKeySequence(self.tr("Ctrl+O", "File|Open")),
-            0, self, 'iconEditor_file_open')
-        self.openAct.setStatusTip(self.tr('Open an icon file for editing'))
-        self.openAct.setWhatsThis(self.tr(
-            """<b>Open File</b>"""
-            """<p>This opens a new icon file for editing."""
-            """ It pops up a file selection dialog.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_open",
+        )
+        self.openAct.setStatusTip(self.tr("Open an icon file for editing"))
+        self.openAct.setWhatsThis(
+            self.tr(
+                """<b>Open File</b>"""
+                """<p>This opens a new icon file for editing."""
+                """ It pops up a file selection dialog.</p>"""
+            )
+        )
         self.openAct.triggered.connect(self.__openIcon)
         self.__actions.append(self.openAct)
-        
+
         self.saveAct = EricAction(
-            self.tr('Save'),
+            self.tr("Save"),
             UI.PixmapCache.getIcon("fileSave"),
-            self.tr('&Save'),
+            self.tr("&Save"),
             QKeySequence(self.tr("Ctrl+S", "File|Save")),
-            0, self, 'iconEditor_file_save')
-        self.saveAct.setStatusTip(self.tr('Save the current icon'))
-        self.saveAct.setWhatsThis(self.tr(
-            """<b>Save File</b>"""
-            """<p>Save the contents of the icon editor window.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_save",
+        )
+        self.saveAct.setStatusTip(self.tr("Save the current icon"))
+        self.saveAct.setWhatsThis(
+            self.tr(
+                """<b>Save File</b>"""
+                """<p>Save the contents of the icon editor window.</p>"""
+            )
+        )
         self.saveAct.triggered.connect(self.__saveIcon)
         self.__actions.append(self.saveAct)
-        
+
         self.saveAsAct = EricAction(
-            self.tr('Save As'),
+            self.tr("Save As"),
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save &As...'),
+            self.tr("Save &As..."),
             QKeySequence(self.tr("Shift+Ctrl+S", "File|Save As")),
-            0, self, 'iconEditor_file_save_as')
-        self.saveAsAct.setStatusTip(
-            self.tr('Save the current icon to a new file'))
-        self.saveAsAct.setWhatsThis(self.tr(
-            """<b>Save As...</b>"""
-            """<p>Saves the current icon to a new file.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_save_as",
+        )
+        self.saveAsAct.setStatusTip(self.tr("Save the current icon to a new file"))
+        self.saveAsAct.setWhatsThis(
+            self.tr(
+                """<b>Save As...</b>"""
+                """<p>Saves the current icon to a new file.</p>"""
+            )
+        )
         self.saveAsAct.triggered.connect(self.__saveIconAs)
         self.__actions.append(self.saveAsAct)
-        
+
         self.closeAct = EricAction(
-            self.tr('Close'),
+            self.tr("Close"),
             UI.PixmapCache.getIcon("close"),
-            self.tr('&Close'),
+            self.tr("&Close"),
             QKeySequence(self.tr("Ctrl+W", "File|Close")),
-            0, self, 'iconEditor_file_close')
-        self.closeAct.setStatusTip(self.tr(
-            'Close the current icon editor window'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close</b>"""
-            """<p>Closes the current icon editor window.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the current icon editor window"))
+        self.closeAct.setWhatsThis(
+            self.tr(
+                """<b>Close</b>""" """<p>Closes the current icon editor window.</p>"""
+            )
+        )
         self.closeAct.triggered.connect(self.close)
         self.__actions.append(self.closeAct)
-        
+
         self.closeAllAct = EricAction(
-            self.tr('Close All'),
-            self.tr('Close &All'),
-            0, 0, self, 'iconEditor_file_close_all')
-        self.closeAllAct.setStatusTip(self.tr(
-            'Close all icon editor windows'))
-        self.closeAllAct.setWhatsThis(self.tr(
-            """<b>Close All</b>"""
-            """<p>Closes all icon editor windows except the first one.</p>"""
-        ))
+            self.tr("Close All"),
+            self.tr("Close &All"),
+            0,
+            0,
+            self,
+            "iconEditor_file_close_all",
+        )
+        self.closeAllAct.setStatusTip(self.tr("Close all icon editor windows"))
+        self.closeAllAct.setWhatsThis(
+            self.tr(
+                """<b>Close All</b>"""
+                """<p>Closes all icon editor windows except the first one.</p>"""
+            )
+        )
         self.closeAllAct.triggered.connect(self.__closeAll)
         self.__actions.append(self.closeAllAct)
-        
+
         self.closeOthersAct = EricAction(
-            self.tr('Close Others'),
-            self.tr('Close Others'),
-            0, 0, self, 'iconEditor_file_close_others')
-        self.closeOthersAct.setStatusTip(self.tr(
-            'Close all other icon editor windows'))
-        self.closeOthersAct.setWhatsThis(self.tr(
-            """<b>Close Others</b>"""
-            """<p>Closes all other icon editor windows.</p>"""
-        ))
+            self.tr("Close Others"),
+            self.tr("Close Others"),
+            0,
+            0,
+            self,
+            "iconEditor_file_close_others",
+        )
+        self.closeOthersAct.setStatusTip(self.tr("Close all other icon editor windows"))
+        self.closeOthersAct.setWhatsThis(
+            self.tr(
+                """<b>Close Others</b>"""
+                """<p>Closes all other icon editor windows.</p>"""
+            )
+        )
         self.closeOthersAct.triggered.connect(self.__closeOthers)
         self.__actions.append(self.closeOthersAct)
-        
+
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'iconEditor_file_quit')
-        self.exitAct.setStatusTip(self.tr('Quit the icon editor'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the icon editor.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_file_quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the icon editor"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the icon editor.</p>""")
+        )
         if not self.fromEric:
             self.exitAct.triggered.connect(self.__closeAll)
         self.__actions.append(self.exitAct)
-    
+
     def __initEditActions(self):
         """
         Private method to create the Edit actions.
         """
         self.undoAct = EricAction(
-            self.tr('Undo'),
+            self.tr("Undo"),
             UI.PixmapCache.getIcon("editUndo"),
-            self.tr('&Undo'),
+            self.tr("&Undo"),
             QKeySequence(self.tr("Ctrl+Z", "Edit|Undo")),
             QKeySequence(self.tr("Alt+Backspace", "Edit|Undo")),
-            self, 'iconEditor_edit_undo')
-        self.undoAct.setStatusTip(self.tr('Undo the last change'))
-        self.undoAct.setWhatsThis(self.tr(
-            """<b>Undo</b>"""
-            """<p>Undo the last change done.</p>"""
-        ))
+            self,
+            "iconEditor_edit_undo",
+        )
+        self.undoAct.setStatusTip(self.tr("Undo the last change"))
+        self.undoAct.setWhatsThis(
+            self.tr("""<b>Undo</b>""" """<p>Undo the last change done.</p>""")
+        )
         self.undoAct.triggered.connect(self.__editor.editUndo)
         self.__actions.append(self.undoAct)
-        
+
         self.redoAct = EricAction(
-            self.tr('Redo'),
+            self.tr("Redo"),
             UI.PixmapCache.getIcon("editRedo"),
-            self.tr('&Redo'),
+            self.tr("&Redo"),
             QKeySequence(self.tr("Ctrl+Shift+Z", "Edit|Redo")),
-            0, self, 'iconEditor_edit_redo')
-        self.redoAct.setStatusTip(self.tr('Redo the last change'))
-        self.redoAct.setWhatsThis(self.tr(
-            """<b>Redo</b>"""
-            """<p>Redo the last change done.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_edit_redo",
+        )
+        self.redoAct.setStatusTip(self.tr("Redo the last change"))
+        self.redoAct.setWhatsThis(
+            self.tr("""<b>Redo</b>""" """<p>Redo the last change done.</p>""")
+        )
         self.redoAct.triggered.connect(self.__editor.editRedo)
         self.__actions.append(self.redoAct)
-        
+
         self.cutAct = EricAction(
-            self.tr('Cut'),
+            self.tr("Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            self.tr('Cu&t'),
+            self.tr("Cu&t"),
             QKeySequence(self.tr("Ctrl+X", "Edit|Cut")),
             QKeySequence(self.tr("Shift+Del", "Edit|Cut")),
-            self, 'iconEditor_edit_cut')
-        self.cutAct.setStatusTip(self.tr('Cut the selection'))
-        self.cutAct.setWhatsThis(self.tr(
-            """<b>Cut</b>"""
-            """<p>Cut the selected image area to the clipboard.</p>"""
-        ))
+            self,
+            "iconEditor_edit_cut",
+        )
+        self.cutAct.setStatusTip(self.tr("Cut the selection"))
+        self.cutAct.setWhatsThis(
+            self.tr(
+                """<b>Cut</b>"""
+                """<p>Cut the selected image area to the clipboard.</p>"""
+            )
+        )
         self.cutAct.triggered.connect(self.__editor.editCut)
         self.__actions.append(self.cutAct)
-        
+
         self.copyAct = EricAction(
-            self.tr('Copy'),
+            self.tr("Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr('&Copy'),
+            self.tr("&Copy"),
             QKeySequence(self.tr("Ctrl+C", "Edit|Copy")),
             QKeySequence(self.tr("Ctrl+Ins", "Edit|Copy")),
-            self, 'iconEditor_edit_copy')
-        self.copyAct.setStatusTip(self.tr('Copy the selection'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy the selected image area to the clipboard.</p>"""
-        ))
+            self,
+            "iconEditor_edit_copy",
+        )
+        self.copyAct.setStatusTip(self.tr("Copy the selection"))
+        self.copyAct.setWhatsThis(
+            self.tr(
+                """<b>Copy</b>"""
+                """<p>Copy the selected image area to the clipboard.</p>"""
+            )
+        )
         self.copyAct.triggered.connect(self.__editor.editCopy)
         self.__actions.append(self.copyAct)
-        
+
         self.pasteAct = EricAction(
-            self.tr('Paste'),
+            self.tr("Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            self.tr('&Paste'),
+            self.tr("&Paste"),
             QKeySequence(self.tr("Ctrl+V", "Edit|Paste")),
             QKeySequence(self.tr("Shift+Ins", "Edit|Paste")),
-            self, 'iconEditor_edit_paste')
-        self.pasteAct.setStatusTip(self.tr('Paste the clipboard image'))
-        self.pasteAct.setWhatsThis(self.tr(
-            """<b>Paste</b>"""
-            """<p>Paste the clipboard image.</p>"""
-        ))
+            self,
+            "iconEditor_edit_paste",
+        )
+        self.pasteAct.setStatusTip(self.tr("Paste the clipboard image"))
+        self.pasteAct.setWhatsThis(
+            self.tr("""<b>Paste</b>""" """<p>Paste the clipboard image.</p>""")
+        )
         self.pasteAct.triggered.connect(self.__editor.editPaste)
         self.__actions.append(self.pasteAct)
-        
+
         self.pasteNewAct = EricAction(
-            self.tr('Paste as New'),
-            self.tr('Paste as &New'),
-            0, 0, self, 'iconEditor_edit_paste_as_new')
-        self.pasteNewAct.setStatusTip(self.tr(
-            'Paste the clipboard image replacing the current one'))
-        self.pasteNewAct.setWhatsThis(self.tr(
-            """<b>Paste as New</b>"""
-            """<p>Paste the clipboard image replacing the current one.</p>"""
-        ))
+            self.tr("Paste as New"),
+            self.tr("Paste as &New"),
+            0,
+            0,
+            self,
+            "iconEditor_edit_paste_as_new",
+        )
+        self.pasteNewAct.setStatusTip(
+            self.tr("Paste the clipboard image replacing the current one")
+        )
+        self.pasteNewAct.setWhatsThis(
+            self.tr(
+                """<b>Paste as New</b>"""
+                """<p>Paste the clipboard image replacing the current one.</p>"""
+            )
+        )
         self.pasteNewAct.triggered.connect(self.__editor.editPasteAsNew)
         self.__actions.append(self.pasteNewAct)
-        
+
         self.deleteAct = EricAction(
-            self.tr('Clear'),
+            self.tr("Clear"),
             UI.PixmapCache.getIcon("editDelete"),
-            self.tr('Cl&ear'),
+            self.tr("Cl&ear"),
             QKeySequence(self.tr("Alt+Shift+C", "Edit|Clear")),
             0,
-            self, 'iconEditor_edit_clear')
-        self.deleteAct.setStatusTip(self.tr('Clear the icon image'))
-        self.deleteAct.setWhatsThis(self.tr(
-            """<b>Clear</b>"""
-            """<p>Clear the icon image and set it to be completely"""
-            """ transparent.</p>"""
-        ))
+            self,
+            "iconEditor_edit_clear",
+        )
+        self.deleteAct.setStatusTip(self.tr("Clear the icon image"))
+        self.deleteAct.setWhatsThis(
+            self.tr(
+                """<b>Clear</b>"""
+                """<p>Clear the icon image and set it to be completely"""
+                """ transparent.</p>"""
+            )
+        )
         self.deleteAct.triggered.connect(self.__editor.editClear)
         self.__actions.append(self.deleteAct)
-        
+
         self.selectAllAct = EricAction(
-            self.tr('Select All'),
-            self.tr('&Select All'),
+            self.tr("Select All"),
+            self.tr("&Select All"),
             QKeySequence(self.tr("Ctrl+A", "Edit|Select All")),
             0,
-            self, 'iconEditor_edit_select_all')
-        self.selectAllAct.setStatusTip(self.tr(
-            'Select the complete icon image'))
-        self.selectAllAct.setWhatsThis(self.tr(
-            """<b>Select All</b>"""
-            """<p>Selects the complete icon image.</p>"""
-        ))
+            self,
+            "iconEditor_edit_select_all",
+        )
+        self.selectAllAct.setStatusTip(self.tr("Select the complete icon image"))
+        self.selectAllAct.setWhatsThis(
+            self.tr(
+                """<b>Select All</b>""" """<p>Selects the complete icon image.</p>"""
+            )
+        )
         self.selectAllAct.triggered.connect(self.__editor.editSelectAll)
         self.__actions.append(self.selectAllAct)
-        
+
         self.resizeAct = EricAction(
-            self.tr('Change Size'),
+            self.tr("Change Size"),
             UI.PixmapCache.getIcon("transformResize"),
-            self.tr('Change Si&ze...'),
-            0, 0,
-            self, 'iconEditor_edit_change_size')
-        self.resizeAct.setStatusTip(self.tr('Change the icon size'))
-        self.resizeAct.setWhatsThis(self.tr(
-            """<b>Change Size...</b>"""
-            """<p>Changes the icon size.</p>"""
-        ))
+            self.tr("Change Si&ze..."),
+            0,
+            0,
+            self,
+            "iconEditor_edit_change_size",
+        )
+        self.resizeAct.setStatusTip(self.tr("Change the icon size"))
+        self.resizeAct.setWhatsThis(
+            self.tr("""<b>Change Size...</b>""" """<p>Changes the icon size.</p>""")
+        )
         self.resizeAct.triggered.connect(self.__editor.editResize)
         self.__actions.append(self.resizeAct)
-        
+
         self.grayscaleAct = EricAction(
-            self.tr('Grayscale'),
+            self.tr("Grayscale"),
             UI.PixmapCache.getIcon("grayscale"),
-            self.tr('&Grayscale'),
-            0, 0,
-            self, 'iconEditor_edit_grayscale')
-        self.grayscaleAct.setStatusTip(self.tr(
-            'Change the icon to grayscale'))
-        self.grayscaleAct.setWhatsThis(self.tr(
-            """<b>Grayscale</b>"""
-            """<p>Changes the icon to grayscale.</p>"""
-        ))
+            self.tr("&Grayscale"),
+            0,
+            0,
+            self,
+            "iconEditor_edit_grayscale",
+        )
+        self.grayscaleAct.setStatusTip(self.tr("Change the icon to grayscale"))
+        self.grayscaleAct.setWhatsThis(
+            self.tr("""<b>Grayscale</b>""" """<p>Changes the icon to grayscale.</p>""")
+        )
         self.grayscaleAct.triggered.connect(self.__editor.grayScale)
         self.__actions.append(self.grayscaleAct)
-        
+
         self.redoAct.setEnabled(False)
         self.__editor.canRedoChanged.connect(self.redoAct.setEnabled)
-        
+
         self.undoAct.setEnabled(False)
         self.__editor.canUndoChanged.connect(self.undoAct.setEnabled)
-        
+
         self.cutAct.setEnabled(False)
         self.copyAct.setEnabled(False)
         self.__editor.selectionAvailable.connect(self.cutAct.setEnabled)
         self.__editor.selectionAvailable.connect(self.copyAct.setEnabled)
-        
+
         self.pasteAct.setEnabled(self.__editor.canPaste())
         self.pasteNewAct.setEnabled(self.__editor.canPaste())
-        self.__editor.clipboardImageAvailable.connect(
-            self.pasteAct.setEnabled)
-        self.__editor.clipboardImageAvailable.connect(
-            self.pasteNewAct.setEnabled)
-    
+        self.__editor.clipboardImageAvailable.connect(self.pasteAct.setEnabled)
+        self.__editor.clipboardImageAvailable.connect(self.pasteNewAct.setEnabled)
+
     def __initViewActions(self):
         """
         Private method to create the View actions.
         """
         self.zoomInAct = EricAction(
-            self.tr('Zoom in'),
+            self.tr("Zoom in"),
             UI.PixmapCache.getIcon("zoomIn"),
-            self.tr('Zoom &in'),
+            self.tr("Zoom &in"),
             QKeySequence(self.tr("Ctrl++", "View|Zoom in")),
-            0, self, 'iconEditor_view_zoom_in')
-        self.zoomInAct.setStatusTip(self.tr('Zoom in on the icon'))
-        self.zoomInAct.setWhatsThis(self.tr(
-            """<b>Zoom in</b>"""
-            """<p>Zoom in on the icon. This makes the grid bigger.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_view_zoom_in",
+        )
+        self.zoomInAct.setStatusTip(self.tr("Zoom in on the icon"))
+        self.zoomInAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the icon. This makes the grid bigger.</p>"""
+            )
+        )
         self.zoomInAct.triggered.connect(self.__zoomIn)
         self.__actions.append(self.zoomInAct)
-        
+
         self.zoomOutAct = EricAction(
-            self.tr('Zoom out'),
+            self.tr("Zoom out"),
             UI.PixmapCache.getIcon("zoomOut"),
-            self.tr('Zoom &out'),
+            self.tr("Zoom &out"),
             QKeySequence(self.tr("Ctrl+-", "View|Zoom out")),
-            0, self, 'iconEditor_view_zoom_out')
-        self.zoomOutAct.setStatusTip(self.tr('Zoom out on the icon'))
-        self.zoomOutAct.setWhatsThis(self.tr(
-            """<b>Zoom out</b>"""
-            """<p>Zoom out on the icon. This makes the grid smaller.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_view_zoom_out",
+        )
+        self.zoomOutAct.setStatusTip(self.tr("Zoom out on the icon"))
+        self.zoomOutAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the icon. This makes the grid smaller.</p>"""
+            )
+        )
         self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.__actions.append(self.zoomOutAct)
-        
+
         self.zoomResetAct = EricAction(
-            self.tr('Zoom reset'),
+            self.tr("Zoom reset"),
             UI.PixmapCache.getIcon("zoomReset"),
-            self.tr('Zoom &reset'),
+            self.tr("Zoom &reset"),
             QKeySequence(self.tr("Ctrl+0", "View|Zoom reset")),
-            0, self, 'iconEditor_view_zoom_reset')
-        self.zoomResetAct.setStatusTip(self.tr(
-            'Reset the zoom of the icon'))
-        self.zoomResetAct.setWhatsThis(self.tr(
-            """<b>Zoom reset</b>"""
-            """<p>Reset the zoom of the icon. """
-            """This sets the zoom factor to 100%.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_view_zoom_reset",
+        )
+        self.zoomResetAct.setStatusTip(self.tr("Reset the zoom of the icon"))
+        self.zoomResetAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom reset</b>"""
+                """<p>Reset the zoom of the icon. """
+                """This sets the zoom factor to 100%.</p>"""
+            )
+        )
         self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.__actions.append(self.zoomResetAct)
-        
+
         self.showGridAct = EricAction(
-            self.tr('Show Grid'),
+            self.tr("Show Grid"),
             UI.PixmapCache.getIcon("grid"),
-            self.tr('Show &Grid'),
-            0, 0,
-            self, 'iconEditor_view_show_grid')
-        self.showGridAct.setStatusTip(self.tr(
-            'Toggle the display of the grid'))
-        self.showGridAct.setWhatsThis(self.tr(
-            """<b>Show Grid</b>"""
-            """<p>Toggle the display of the grid.</p>"""
-        ))
+            self.tr("Show &Grid"),
+            0,
+            0,
+            self,
+            "iconEditor_view_show_grid",
+        )
+        self.showGridAct.setStatusTip(self.tr("Toggle the display of the grid"))
+        self.showGridAct.setWhatsThis(
+            self.tr("""<b>Show Grid</b>""" """<p>Toggle the display of the grid.</p>""")
+        )
         self.showGridAct.triggered[bool].connect(self.__editor.setGridEnabled)
         self.__actions.append(self.showGridAct)
         self.showGridAct.setCheckable(True)
         self.showGridAct.setChecked(self.__editor.isGridEnabled())
-    
+
     def __initToolsActions(self):
         """
         Private method to create the View actions.
         """
         self.esm = QSignalMapper(self)
         self.esm.mappedInt.connect(self.__editor.setTool)
-        
+
         self.drawingActGrp = createActionGroup(self)
         self.drawingActGrp.setExclusive(True)
-        
+
         self.drawPencilAct = EricAction(
-            self.tr('Freehand'),
+            self.tr("Freehand"),
             UI.PixmapCache.getIcon("drawBrush"),
-            self.tr('&Freehand'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_pencil')
-        self.drawPencilAct.setWhatsThis(self.tr(
-            """<b>Free hand</b>"""
-            """<p>Draws non linear lines.</p>"""
-        ))
+            self.tr("&Freehand"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_pencil",
+        )
+        self.drawPencilAct.setWhatsThis(
+            self.tr("""<b>Free hand</b>""" """<p>Draws non linear lines.</p>""")
+        )
         self.drawPencilAct.setCheckable(True)
         self.esm.setMapping(self.drawPencilAct, IconEditorTool.PENCIL)
         self.drawPencilAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawPencilAct)
-        
+
         self.drawColorPickerAct = EricAction(
-            self.tr('Color Picker'),
+            self.tr("Color Picker"),
             UI.PixmapCache.getIcon("colorPicker"),
-            self.tr('&Color Picker'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_color_picker')
-        self.drawColorPickerAct.setWhatsThis(self.tr(
-            """<b>Color Picker</b>"""
-            """<p>The color of the pixel clicked on will become """
-            """the current draw color.</p>"""
-        ))
+            self.tr("&Color Picker"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_color_picker",
+        )
+        self.drawColorPickerAct.setWhatsThis(
+            self.tr(
+                """<b>Color Picker</b>"""
+                """<p>The color of the pixel clicked on will become """
+                """the current draw color.</p>"""
+            )
+        )
         self.drawColorPickerAct.setCheckable(True)
-        self.esm.setMapping(self.drawColorPickerAct,
-                            IconEditorTool.COLOR_PICKER)
+        self.esm.setMapping(self.drawColorPickerAct, IconEditorTool.COLOR_PICKER)
         self.drawColorPickerAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawColorPickerAct)
-        
+
         self.drawRectangleAct = EricAction(
-            self.tr('Rectangle'),
+            self.tr("Rectangle"),
             UI.PixmapCache.getIcon("drawRectangle"),
-            self.tr('&Rectangle'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_rectangle')
-        self.drawRectangleAct.setWhatsThis(self.tr(
-            """<b>Rectangle</b>"""
-            """<p>Draw a rectangle.</p>"""
-        ))
+            self.tr("&Rectangle"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_rectangle",
+        )
+        self.drawRectangleAct.setWhatsThis(
+            self.tr("""<b>Rectangle</b>""" """<p>Draw a rectangle.</p>""")
+        )
         self.drawRectangleAct.setCheckable(True)
         self.esm.setMapping(self.drawRectangleAct, IconEditorTool.RECTANGLE)
         self.drawRectangleAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawRectangleAct)
-        
+
         self.drawFilledRectangleAct = EricAction(
-            self.tr('Filled Rectangle'),
+            self.tr("Filled Rectangle"),
             UI.PixmapCache.getIcon("drawRectangleFilled"),
-            self.tr('F&illed Rectangle'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_filled_rectangle')
-        self.drawFilledRectangleAct.setWhatsThis(self.tr(
-            """<b>Filled Rectangle</b>"""
-            """<p>Draw a filled rectangle.</p>"""
-        ))
+            self.tr("F&illed Rectangle"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_filled_rectangle",
+        )
+        self.drawFilledRectangleAct.setWhatsThis(
+            self.tr("""<b>Filled Rectangle</b>""" """<p>Draw a filled rectangle.</p>""")
+        )
         self.drawFilledRectangleAct.setCheckable(True)
-        self.esm.setMapping(self.drawFilledRectangleAct,
-                            IconEditorTool.FILLED_RECTANGLE)
+        self.esm.setMapping(
+            self.drawFilledRectangleAct, IconEditorTool.FILLED_RECTANGLE
+        )
         self.drawFilledRectangleAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawFilledRectangleAct)
-        
+
         self.drawCircleAct = EricAction(
-            self.tr('Circle'),
+            self.tr("Circle"),
             UI.PixmapCache.getIcon("drawCircle"),
-            self.tr('Circle'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_circle')
-        self.drawCircleAct.setWhatsThis(self.tr(
-            """<b>Circle</b>"""
-            """<p>Draw a circle.</p>"""
-        ))
+            self.tr("Circle"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_circle",
+        )
+        self.drawCircleAct.setWhatsThis(
+            self.tr("""<b>Circle</b>""" """<p>Draw a circle.</p>""")
+        )
         self.drawCircleAct.setCheckable(True)
         self.esm.setMapping(self.drawCircleAct, IconEditorTool.CIRCLE)
         self.drawCircleAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawCircleAct)
-        
+
         self.drawFilledCircleAct = EricAction(
-            self.tr('Filled Circle'),
+            self.tr("Filled Circle"),
             UI.PixmapCache.getIcon("drawCircleFilled"),
-            self.tr('Fille&d Circle'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_filled_circle')
-        self.drawFilledCircleAct.setWhatsThis(self.tr(
-            """<b>Filled Circle</b>"""
-            """<p>Draw a filled circle.</p>"""
-        ))
+            self.tr("Fille&d Circle"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_filled_circle",
+        )
+        self.drawFilledCircleAct.setWhatsThis(
+            self.tr("""<b>Filled Circle</b>""" """<p>Draw a filled circle.</p>""")
+        )
         self.drawFilledCircleAct.setCheckable(True)
-        self.esm.setMapping(self.drawFilledCircleAct,
-                            IconEditorTool.FILLED_CIRCLE)
+        self.esm.setMapping(self.drawFilledCircleAct, IconEditorTool.FILLED_CIRCLE)
         self.drawFilledCircleAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawFilledCircleAct)
-        
+
         self.drawEllipseAct = EricAction(
-            self.tr('Ellipse'),
+            self.tr("Ellipse"),
             UI.PixmapCache.getIcon("drawEllipse"),
-            self.tr('&Ellipse'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_ellipse')
-        self.drawEllipseAct.setWhatsThis(self.tr(
-            """<b>Ellipse</b>"""
-            """<p>Draw an ellipse.</p>"""
-        ))
+            self.tr("&Ellipse"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_ellipse",
+        )
+        self.drawEllipseAct.setWhatsThis(
+            self.tr("""<b>Ellipse</b>""" """<p>Draw an ellipse.</p>""")
+        )
         self.drawEllipseAct.setCheckable(True)
         self.esm.setMapping(self.drawEllipseAct, IconEditorTool.ELLIPSE)
         self.drawEllipseAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawEllipseAct)
-        
+
         self.drawFilledEllipseAct = EricAction(
-            self.tr('Filled Ellipse'),
+            self.tr("Filled Ellipse"),
             UI.PixmapCache.getIcon("drawEllipseFilled"),
-            self.tr('Fille&d Elli&pse'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_filled_ellipse')
-        self.drawFilledEllipseAct.setWhatsThis(self.tr(
-            """<b>Filled Ellipse</b>"""
-            """<p>Draw a filled ellipse.</p>"""
-        ))
+            self.tr("Fille&d Elli&pse"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_filled_ellipse",
+        )
+        self.drawFilledEllipseAct.setWhatsThis(
+            self.tr("""<b>Filled Ellipse</b>""" """<p>Draw a filled ellipse.</p>""")
+        )
         self.drawFilledEllipseAct.setCheckable(True)
-        self.esm.setMapping(self.drawFilledEllipseAct,
-                            IconEditorTool.FILLED_ELLIPSE)
+        self.esm.setMapping(self.drawFilledEllipseAct, IconEditorTool.FILLED_ELLIPSE)
         self.drawFilledEllipseAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawFilledEllipseAct)
-        
+
         self.drawFloodFillAct = EricAction(
-            self.tr('Flood Fill'),
+            self.tr("Flood Fill"),
             UI.PixmapCache.getIcon("drawFill"),
-            self.tr('Fl&ood Fill'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_flood_fill')
-        self.drawFloodFillAct.setWhatsThis(self.tr(
-            """<b>Flood Fill</b>"""
-            """<p>Fill adjoining pixels with the same color with """
-            """the current color.</p>"""
-        ))
+            self.tr("Fl&ood Fill"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_flood_fill",
+        )
+        self.drawFloodFillAct.setWhatsThis(
+            self.tr(
+                """<b>Flood Fill</b>"""
+                """<p>Fill adjoining pixels with the same color with """
+                """the current color.</p>"""
+            )
+        )
         self.drawFloodFillAct.setCheckable(True)
         self.esm.setMapping(self.drawFloodFillAct, IconEditorTool.FILL)
         self.drawFloodFillAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawFloodFillAct)
-        
+
         self.drawLineAct = EricAction(
-            self.tr('Line'),
+            self.tr("Line"),
             UI.PixmapCache.getIcon("drawLine"),
-            self.tr('&Line'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_line')
-        self.drawLineAct.setWhatsThis(self.tr(
-            """<b>Line</b>"""
-            """<p>Draw a line.</p>"""
-        ))
+            self.tr("&Line"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_line",
+        )
+        self.drawLineAct.setWhatsThis(
+            self.tr("""<b>Line</b>""" """<p>Draw a line.</p>""")
+        )
         self.drawLineAct.setCheckable(True)
         self.esm.setMapping(self.drawLineAct, IconEditorTool.LINE)
         self.drawLineAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawLineAct)
-        
+
         self.drawEraserAct = EricAction(
-            self.tr('Eraser (Transparent)'),
+            self.tr("Eraser (Transparent)"),
             UI.PixmapCache.getIcon("drawEraser"),
-            self.tr('Eraser (&Transparent)'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_eraser')
-        self.drawEraserAct.setWhatsThis(self.tr(
-            """<b>Eraser (Transparent)</b>"""
-            """<p>Erase pixels by setting them to transparent.</p>"""
-        ))
+            self.tr("Eraser (&Transparent)"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_eraser",
+        )
+        self.drawEraserAct.setWhatsThis(
+            self.tr(
+                """<b>Eraser (Transparent)</b>"""
+                """<p>Erase pixels by setting them to transparent.</p>"""
+            )
+        )
         self.drawEraserAct.setCheckable(True)
         self.esm.setMapping(self.drawEraserAct, IconEditorTool.RUBBER)
         self.drawEraserAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawEraserAct)
-        
+
         self.drawRectangleSelectionAct = EricAction(
-            self.tr('Rectangular Selection'),
+            self.tr("Rectangular Selection"),
             UI.PixmapCache.getIcon("selectRectangle"),
-            self.tr('Rect&angular Selection'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_selection_rectangle')
-        self.drawRectangleSelectionAct.setWhatsThis(self.tr(
-            """<b>Rectangular Selection</b>"""
-            """<p>Select a rectangular section of the icon using"""
-            """ the mouse.</p>"""
-        ))
+            self.tr("Rect&angular Selection"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_selection_rectangle",
+        )
+        self.drawRectangleSelectionAct.setWhatsThis(
+            self.tr(
+                """<b>Rectangular Selection</b>"""
+                """<p>Select a rectangular section of the icon using"""
+                """ the mouse.</p>"""
+            )
+        )
         self.drawRectangleSelectionAct.setCheckable(True)
-        self.esm.setMapping(self.drawRectangleSelectionAct,
-                            IconEditorTool.SELECT_RECTANGLE)
+        self.esm.setMapping(
+            self.drawRectangleSelectionAct, IconEditorTool.SELECT_RECTANGLE
+        )
         self.drawRectangleSelectionAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawRectangleSelectionAct)
-        
+
         self.drawCircleSelectionAct = EricAction(
-            self.tr('Circular Selection'),
+            self.tr("Circular Selection"),
             UI.PixmapCache.getIcon("selectCircle"),
-            self.tr('Rect&angular Selection'),
-            0, 0,
-            self.drawingActGrp, 'iconEditor_tools_selection_circle')
-        self.drawCircleSelectionAct.setWhatsThis(self.tr(
-            """<b>Circular Selection</b>"""
-            """<p>Select a circular section of the icon using"""
-            """ the mouse.</p>"""
-        ))
+            self.tr("Rect&angular Selection"),
+            0,
+            0,
+            self.drawingActGrp,
+            "iconEditor_tools_selection_circle",
+        )
+        self.drawCircleSelectionAct.setWhatsThis(
+            self.tr(
+                """<b>Circular Selection</b>"""
+                """<p>Select a circular section of the icon using"""
+                """ the mouse.</p>"""
+            )
+        )
         self.drawCircleSelectionAct.setCheckable(True)
-        self.esm.setMapping(self.drawCircleSelectionAct,
-                            IconEditorTool.SELECT_CIRCLE)
+        self.esm.setMapping(self.drawCircleSelectionAct, IconEditorTool.SELECT_CIRCLE)
         self.drawCircleSelectionAct.triggered.connect(self.esm.map)
         self.__actions.append(self.drawCircleSelectionAct)
-        
+
         self.drawPencilAct.trigger()
-    
+
     def __initHelpActions(self):
         """
         Private method to create the Help actions.
         """
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'iconEditor_help_about')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "iconEditor_help_about"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.__actions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'iconEditor_help_about_qt')
+            self.tr("About Qt"),
+            self.tr("About &Qt"),
+            0,
+            0,
+            self,
+            "iconEditor_help_about_qt",
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.__actions.append(self.aboutQtAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1", "Help|What's This?'")),
-            0, self, 'iconEditor_help_whats_this')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be accessed"""
-            """ using the context help button in the titlebar.</p>"""
-        ))
+            0,
+            self,
+            "iconEditor_help_whats_this",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be accessed"""
+                """ using the context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.__actions.append(self.whatsThisAct)
-    
+
     def __initMenus(self):
         """
         Private method to create the menus.
         """
         mb = self.menuBar()
-        
-        menu = mb.addMenu(self.tr('&File'))
+
+        menu = mb.addMenu(self.tr("&File"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.newAct)
         menu.addAction(self.newWindowAct)
@@ -835,7 +967,7 @@
         else:
             menu.addSeparator()
             menu.addAction(self.exitAct)
-        
+
         menu = mb.addMenu(self.tr("&Edit"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.undoAct)
@@ -851,16 +983,16 @@
         menu.addSeparator()
         menu.addAction(self.resizeAct)
         menu.addAction(self.grayscaleAct)
-        
-        menu = mb.addMenu(self.tr('&View'))
+
+        menu = mb.addMenu(self.tr("&View"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.zoomInAct)
         menu.addAction(self.zoomResetAct)
         menu.addAction(self.zoomOutAct)
         menu.addSeparator()
         menu.addAction(self.showGridAct)
-        
-        menu = mb.addMenu(self.tr('&Tools'))
+
+        menu = mb.addMenu(self.tr("&Tools"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.drawPencilAct)
         menu.addAction(self.drawColorPickerAct)
@@ -876,15 +1008,15 @@
         menu.addSeparator()
         menu.addAction(self.drawRectangleSelectionAct)
         menu.addAction(self.drawCircleSelectionAct)
-        
+
         mb.addSeparator()
-        
+
         menu = mb.addMenu(self.tr("&Help"))
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
         menu.addSeparator()
         menu.addAction(self.whatsThisAct)
-    
+
     def __initToolbars(self):
         """
         Private method to create the toolbars.
@@ -902,7 +1034,7 @@
         filetb.addAction(self.closeAct)
         if not self.fromEric:
             filetb.addAction(self.exitAct)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setObjectName("EditToolBar")
         edittb.setIconSize(UI.Config.ToolBarIconSize)
@@ -915,12 +1047,12 @@
         edittb.addSeparator()
         edittb.addAction(self.resizeAct)
         edittb.addAction(self.grayscaleAct)
-        
+
         viewtb = self.addToolBar(self.tr("View"))
         viewtb.setObjectName("ViewToolBar")
         viewtb.setIconSize(UI.Config.ToolBarIconSize)
         viewtb.addAction(self.showGridAct)
-        
+
         toolstb = self.addToolBar(self.tr("Tools"))
         toolstb.setObjectName("ToolsToolBar")
         toolstb.setIconSize(UI.Config.ToolBarIconSize)
@@ -938,12 +1070,12 @@
         toolstb.addSeparator()
         toolstb.addAction(self.drawRectangleSelectionAct)
         toolstb.addAction(self.drawCircleSelectionAct)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setObjectName("HelpToolBar")
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-    
+
     def __createStatusBar(self):
         """
         Private method to initialize the status bar.
@@ -953,23 +1085,27 @@
 
         self.__sbSize = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbSize)
-        self.__sbSize.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the icon size.</p>"""
-        ))
+        self.__sbSize.setWhatsThis(
+            self.tr("""<p>This part of the status bar displays the icon size.</p>""")
+        )
         self.__updateSize(*self.__editor.iconSize())
 
         self.__sbPos = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.__sbPos)
-        self.__sbPos.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the cursor"""
-            """ position.</p>"""
-        ))
+        self.__sbPos.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the cursor"""
+                """ position.</p>"""
+            )
+        )
         self.__updatePosition(0, 0)
-        
+
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         self.__zoomWidget.setMinimum(IconEditorGrid.ZoomMinimum)
         self.__zoomWidget.setMaximum(IconEditorGrid.ZoomMaximum)
         self.__zoomWidget.setDefault(IconEditorGrid.ZoomDefault)
@@ -979,57 +1115,55 @@
         self.__zoomWidget.setValue(self.__editor.zoomFactor())
         self.__zoomWidget.valueChanged.connect(self.__editor.setZoomFactor)
         self.__editor.zoomChanged.connect(self.__zoomWidget.setValue)
-        
+
         self.__updateZoom()
-    
+
     def __createPaletteDock(self):
         """
         Private method to initialize the palette dock widget.
         """
         from .IconEditorPalette import IconEditorPalette
-        
+
         self.__paletteDock = QDockWidget(self)
         self.__paletteDock.setObjectName("paletteDock")
         self.__paletteDock.setFeatures(
-            QDockWidget.DockWidgetFeature.DockWidgetClosable |
-            QDockWidget.DockWidgetFeature.DockWidgetMovable |
-            QDockWidget.DockWidgetFeature.DockWidgetFloatable
+            QDockWidget.DockWidgetFeature.DockWidgetClosable
+            | QDockWidget.DockWidgetFeature.DockWidgetMovable
+            | QDockWidget.DockWidgetFeature.DockWidgetFloatable
         )
         self.__paletteDock.setWindowTitle("Palette")
         self.__palette = IconEditorPalette()
         self.__paletteDock.setWidget(self.__palette)
-        self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea,
-                           self.__paletteDock)
-    
+        self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.__paletteDock)
+
     def closeEvent(self, evt):
         """
         Protected event handler for the close event.
-        
+
         @param evt the close event (QCloseEvent)
                 <br />This event is simply accepted after the history has been
                 saved and all window references have been deleted.
         """
         if self.__maybeSave():
             self.__editor.shutdown()
-            
+
             state = self.saveState()
             Preferences.setIconEditor("IconEditorState", state)
 
             Preferences.setGeometry("IconEditorGeometry", self.saveGeometry())
-            
+
             with contextlib.suppress(ValueError):
                 if self.fromEric or len(self.__class__.windows) > 1:
-                    del self.__class__.windows[
-                        self.__class__.windows.index(self)]
-            
+                    del self.__class__.windows[self.__class__.windows.index(self)]
+
             if not self.fromEric:
                 Preferences.syncPreferences()
-            
+
             evt.accept()
             self.editorClosed.emit()
         else:
             evt.ignore()
-    
+
     def __newIcon(self):
         """
         Private slot to create a new icon.
@@ -1037,77 +1171,80 @@
         if self.__maybeSave():
             self.__editor.editNew()
             self.__setCurrentFile("")
-        
+
         self.__checkActions()
-    
+
     def __newWindow(self):
         """
         Private slot called to open a new icon editor window.
         """
-        ie = IconEditorWindow(parent=self.parent(), fromEric=self.fromEric,
-                              project=self.__project)
+        ie = IconEditorWindow(
+            parent=self.parent(), fromEric=self.fromEric, project=self.__project
+        )
         ie.setRecentPaths(self.__lastOpenPath, self.__lastSavePath)
         ie.show()
-    
+
     def __openIcon(self):
         """
         Private slot to open an icon file.
         """
         if self.__maybeSave():
             if (
-                not self.__lastOpenPath and
-                self.__project is not None and
-                self.__project.isOpen()
+                not self.__lastOpenPath
+                and self.__project is not None
+                and self.__project.isOpen()
             ):
                 self.__lastOpenPath = self.__project.getProjectPath()
-            
+
             fileName = EricFileDialog.getOpenFileNameAndFilter(
                 self,
                 self.tr("Open icon file"),
                 self.__lastOpenPath,
                 self.__inputFilter,
-                self.__defaultFilter)[0]
+                self.__defaultFilter,
+            )[0]
             if fileName:
                 self.__loadIconFile(fileName)
                 self.__lastOpenPath = os.path.dirname(fileName)
         self.__checkActions()
-    
+
     def __saveIcon(self):
         """
         Private slot to save the icon.
-        
+
         @return flag indicating success (boolean)
         """
         if not self.__fileName:
             return self.__saveIconAs()
         else:
             return self.__saveIconFile(self.__fileName)
-    
+
     def __saveIconAs(self):
         """
         Private slot to save the icon with a new name.
-        
+
         @return flag indicating success (boolean)
         """
         if (
-            not self.__lastSavePath and
-            self.__project is not None and
-            self.__project.isOpen()
+            not self.__lastSavePath
+            and self.__project is not None
+            and self.__project.isOpen()
         ):
             self.__lastSavePath = self.__project.getProjectPath()
         if not self.__lastSavePath and self.__lastOpenPath:
             self.__lastSavePath = self.__lastOpenPath
-        
+
         fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save icon file"),
             self.__lastSavePath,
             self.__outputFilter,
             self.__defaultFilter,
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if not fileName:
             return False
-        
+
         fpath = pathlib.Path(fileName)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -1117,23 +1254,25 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save icon file"),
-                self.tr("<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return False
-        
+
         self.__lastSavePath = str(fpath.parent)
-        
+
         return self.__saveIconFile(str(fpath))
-    
+
     def __closeAll(self):
         """
         Private slot to close all windows.
         """
         self.__closeOthers()
         self.close()
-    
+
     def __closeOthers(self):
         """
         Private slot to close all other windows.
@@ -1141,18 +1280,20 @@
         for win in self.__class__.windows[:]:
             if win != self:
                 win.close()
-    
+
     def __loadIconFile(self, fileName):
         """
         Private method to load an icon file.
-        
+
         @param fileName name of the icon file to load (string).
         """
         img = QImage(fileName)
         if img.isNull():
             EricMessageBox.warning(
-                self, self.tr("eric Icon Editor"),
-                self.tr("Cannot read file '{0}'.").format(fileName))
+                self,
+                self.tr("eric Icon Editor"),
+                self.tr("Cannot read file '{0}'.").format(fileName),
+            )
         else:
             self.__editor.setIconImage(img, clearUndo=True)
             self.__setCurrentFile(fileName)
@@ -1160,64 +1301,66 @@
     def __saveIconFile(self, fileName):
         """
         Private method to save to the given file.
-        
+
         @param fileName name of the file to save to (string)
         @return flag indicating success (boolean)
         """
         img = self.__editor.iconImage()
         res = img.save(fileName)
-        
+
         if not res:
             EricMessageBox.warning(
-                self, self.tr("eric Icon Editor"),
-                self.tr("Cannot write file '{0}'.")
-                .format(fileName))
-        
+                self,
+                self.tr("eric Icon Editor"),
+                self.tr("Cannot write file '{0}'.").format(fileName),
+            )
+
             self.__checkActions()
-            
+
             return False
-        
+
         self.__editor.setDirty(False, setCleanState=True)
-        
+
         self.__setCurrentFile(fileName)
         self.__statusBar.showMessage(self.tr("Icon saved"), 2000)
-        
+
         self.__checkActions()
-        
+
         return True
 
     def __setCurrentFile(self, fileName):
         """
         Private method to register the file name of the current file.
-        
+
         @param fileName name of the file to register (string)
         """
         self.__fileName = fileName
-        
+
         shownName = (
             self.__strippedName(self.__fileName)
-            if self.__fileName else
-            self.tr("Untitled")
+            if self.__fileName
+            else self.tr("Untitled")
         )
-        
-        self.setWindowTitle(self.tr("{0}[*] - {1}")
-                            .format(shownName, self.tr("Icon Editor")))
-        
+
+        self.setWindowTitle(
+            self.tr("{0}[*] - {1}").format(shownName, self.tr("Icon Editor"))
+        )
+
         self.setWindowModified(self.__editor.isDirty())
-    
+
     def __strippedName(self, fullFileName):
         """
         Private method to return the filename part of the given path.
-        
+
         @param fullFileName full pathname of the given file (string)
         @return filename part (string)
         """
         return pathlib.Path(fullFileName).name
-    
+
     def __maybeSave(self):
         """
         Private method to ask the user to save the file, if it was modified.
-        
+
         @return flag indicating, if it is ok to continue (boolean)
         """
         if self.__editor.isDirty():
@@ -1225,15 +1368,16 @@
                 self,
                 self.tr("eric Icon Editor"),
                 self.tr("""The icon image has unsaved changes."""),
-                self.__saveIcon)
+                self.__saveIcon,
+            )
             if not ret:
                 return False
         return True
-    
+
     def setRecentPaths(self, openPath, savePath):
         """
         Public method to set the last open and save paths.
-        
+
         @param openPath least recently used open path (string)
         @param savePath least recently used save path (string)
         """
@@ -1241,7 +1385,7 @@
             self.__lastOpenPath = openPath
         if savePath:
             self.__lastSavePath = savePath
-    
+
     def __checkActions(self):
         """
         Private slot to check some actions for their enable/disable status.
@@ -1251,87 +1395,95 @@
     def __modificationChanged(self, m):
         """
         Private slot to handle the modificationChanged signal.
-        
+
         @param m modification status
         """
         self.setWindowModified(m)
         self.__checkActions()
-    
+
     def __updatePosition(self, x, y):
         """
         Private slot to show the current cursor position.
-        
+
         @param x x-coordinate (integer)
         @param y y-coordinate (integer)
         """
         self.__sbPos.setText("X: {0:d} Y: {1:d}".format(x + 1, y + 1))
-    
+
     def __updateSize(self, w, h):
         """
         Private slot to show the current icon size.
-        
+
         @param w width of the icon (integer)
         @param h height of the icon (integer)
         """
         self.__sbSize.setText("Size: {0:d} x {1:d}".format(w, h))
-    
+
     def __updateZoom(self):
         """
         Private slot to show the current zoom factor.
         """
         self.zoomOutAct.setEnabled(
-            self.__editor.zoomFactor() > IconEditorGrid.ZoomMinimum)
+            self.__editor.zoomFactor() > IconEditorGrid.ZoomMinimum
+        )
         self.zoomInAct.setEnabled(
-            self.__editor.zoomFactor() < IconEditorGrid.ZoomMaximum)
-    
+            self.__editor.zoomFactor() < IconEditorGrid.ZoomMaximum
+        )
+
     def __zoomIn(self):
         """
         Private slot called to handle the zoom in action.
         """
         self.__editor.setZoomFactor(
-            self.__editor.zoomFactor() + IconEditorGrid.ZoomStep)
+            self.__editor.zoomFactor() + IconEditorGrid.ZoomStep
+        )
         self.__updateZoom()
-    
+
     def __zoomOut(self):
         """
         Private slot called to handle the zoom out action.
         """
         self.__editor.setZoomFactor(
-            self.__editor.zoomFactor() - IconEditorGrid.ZoomStep)
+            self.__editor.zoomFactor() - IconEditorGrid.ZoomStep
+        )
         self.__updateZoom()
-    
+
     def __zoomReset(self):
         """
         Private slot called to handle the zoom reset action.
         """
         self.__editor.setZoomFactor(IconEditorGrid.ZoomDefault)
         self.__updateZoom()
-    
+
     def __about(self):
         """
         Private slot to show a little About message.
         """
         EricMessageBox.about(
-            self, self.tr("About eric Icon Editor"),
-            self.tr("The eric Icon Editor is a simple editor component"
-                    " to perform icon drawing tasks."))
-    
+            self,
+            self.tr("About eric Icon Editor"),
+            self.tr(
+                "The eric Icon Editor is a simple editor component"
+                " to perform icon drawing tasks."
+            ),
+        )
+
     def __aboutQt(self):
         """
         Private slot to handle the About Qt dialog.
         """
         EricMessageBox.aboutQt(self, "eric Icon Editor")
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-    
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event (QWheelEvent)
         """
         if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
@@ -1342,26 +1494,26 @@
                 self.__zoomIn()
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, if the event was handled (boolean)
         """
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event (QGestureEvent
         """
         pinch = evt.gesture(Qt.GestureType.PinchGesture)
@@ -1369,7 +1521,6 @@
             if pinch.state() == Qt.GestureState.GestureStarted:
                 pinch.setTotalScaleFactor(self.__editor.zoomFactor() / 100.0)
             elif pinch.state() == Qt.GestureState.GestureUpdated:
-                self.__editor.setZoomFactor(
-                    int(pinch.totalScaleFactor() * 100))
+                self.__editor.setZoomFactor(int(pinch.totalScaleFactor() * 100))
                 self.__updateZoom()
             evt.accept()
--- a/src/eric7/IconEditor/IconSizeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/IconEditor/IconSizeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,29 +16,30 @@
     """
     Class implementing a dialog to enter the icon size.
     """
+
     def __init__(self, width, height, parent=None):
         """
         Constructor
-        
+
         @param width width to be set (integer)
         @param height height to be set (integer)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.widthSpin.setValue(width)
         self.heightSpin.setValue(height)
-        
+
         self.widthSpin.selectAll()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with width and height (tuple of two integers)
         """
         return self.widthSpin.value(), self.heightSpin.value()
--- a/src/eric7/JediInterface/AssistantJedi.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/JediInterface/AssistantJedi.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the Jedi assistant interface.
     """
+
     def __init__(self, ui, viewManager, project):
         """
         Constructor
-        
+
         @param ui reference to the user interface object
         @type UserInterface
         @param viewManager reference to the viewmanager object
@@ -33,22 +34,23 @@
         super().__init__(ui)
         self.__ui = ui
         self.__vm = viewManager
-        
+
         self.__jediServer = None
         self.__editors = []
         self.__menuActions = {}
-        
+
         from .JediServer import JediServer
+
         self.__jediServer = JediServer(self.__vm, project, self.__ui)
         self.__jediServer.activate()
-        
+
         self.__ui.preferencesChanged.connect(self.__preferencesChanged)
-        
+
         self.__initRefactoringMenu()
-        
+
         self.__vm.editorOpenedEd.connect(self.__editorOpened)
         self.__vm.editorClosedEd.connect(self.__editorClosed)
-    
+
     @pyqtSlot()
     def __preferencesChanged(self):
         """
@@ -57,37 +59,41 @@
         for editor in self.__editors:
             self.__disconnectMouseClickHandler(editor)
             self.__connectMouseClickHandler(editor)
-    
+
     def __determineLanguage(self):
         """
         Private method to determine the valid language strings.
-        
+
         @return list of valid language strings
         @rtype list of str
         """
-        return ["Python3", "MicroPython",
-                "Pygments|Python", "Pygments|Python 2.x",
-                "Cython"]
-    
+        return [
+            "Python3",
+            "MicroPython",
+            "Pygments|Python",
+            "Pygments|Python 2.x",
+            "Cython",
+        ]
+
     def __editorOpened(self, editor):
         """
         Private slot called, when a new editor was opened.
-        
+
         @param editor reference to the new editor
         @type Editor
         """
         languages = self.__determineLanguage()
-        
+
         if editor.getLanguage() in languages:
             self.__connectEditor(editor)
-        
+
         editor.languageChanged.connect(self.__editorLanguageChanged)
         self.__editors.append(editor)
-    
+
     def __editorClosed(self, editor):
         """
         Private slot called, when an editor was closed.
-        
+
         @param editor reference to the editor
         @type Editor
         """
@@ -95,58 +101,56 @@
             editor.languageChanged.disconnect(self.__editorLanguageChanged)
             self.__disconnectEditor(editor)
             self.__editors.remove(editor)
-    
+
     def __editorLanguageChanged(self, language):
         """
         Private slot to handle the language change of an editor.
-        
+
         @param language programming language of the editor
         @type str
         """
         editor = self.sender()
         languages = self.__determineLanguage()
-        
+
         self.__disconnectEditor(editor)
         if language in languages:
             self.__connectEditor(editor)
-    
+
     def __connectEditor(self, editor):
         """
         Private method to connect an editor.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         self.__setAutoCompletionHook(editor)
         self.__setCalltipsHook(editor)
-        
+
         self.__connectMouseClickHandler(editor)
-        
-        editor.registerMouseHoverHelpFunction(
-            self.__jediServer.hoverHelp)
-        
+
+        editor.registerMouseHoverHelpFunction(self.__jediServer.hoverHelp)
+
         menu = editor.getMenu("Main")
         if menu is not None:
             checkAction = editor.getMenu("Checks").menuAction()
             act = menu.insertMenu(checkAction, self.__menu)
             self.__menuActions[editor] = [act]
         editor.showMenu.connect(self.__editorShowMenu)
-    
+
     def __disconnectEditor(self, editor):
         """
         Private method to disconnect an editor.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         self.__unsetAutoCompletionHook(editor)
         self.__unsetCalltipsHook(editor)
-        
+
         self.__disconnectMouseClickHandler(editor)
-        
-        editor.unregisterMouseHoverHelpFunction(
-            self.__jediServer.hoverHelp)
-        
+
+        editor.unregisterMouseHoverHelpFunction(self.__jediServer.hoverHelp)
+
         with contextlib.suppress(TypeError):
             editor.showMenu.disconnect(self.__editorShowMenu)
         menu = editor.getMenu("Main")
@@ -155,11 +159,11 @@
                 with contextlib.suppress(RuntimeError):
                     menu.removeAction(act)
             del self.__menuActions[editor]
-    
+
     def __connectMouseClickHandler(self, editor):
         """
         Private method to connect the mouse click handler to an editor.
-        
+
         @param editor reference to the editor
         @type Editor
         """
@@ -168,79 +172,78 @@
                 "jedi",
                 Preferences.getJedi("MouseClickGotoModifiers"),
                 Preferences.getJedi("MouseClickGotoButton"),
-                self.__jediServer.gotoDefinition
+                self.__jediServer.gotoDefinition,
             )
-    
+
     def __disconnectMouseClickHandler(self, editor):
         """
         Private method to disconnect the mouse click handler from an editor.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         editor.removeMouseClickHandlers("jedi")
-    
+
     def __setAutoCompletionHook(self, editor):
         """
         Private method to set the autocompletion hook.
-        
+
         @param editor reference to the editor
         @type Editor
         """
-        editor.addCompletionListHook(
-            "jedi", self.__jediServer.requestCompletions, True)
-    
+        editor.addCompletionListHook("jedi", self.__jediServer.requestCompletions, True)
+
     def __unsetAutoCompletionHook(self, editor):
         """
         Private method to unset the autocompletion hook.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         editor.removeCompletionListHook("jedi")
-    
+
     def __setCalltipsHook(self, editor):
         """
         Private method to set the calltip hook.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         editor.addCallTipHook("jedi", self.__jediServer.getCallTips)
-    
+
     def __unsetCalltipsHook(self, editor):
         """
         Private method to unset the calltip hook.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         editor.removeCallTipHook("jedi")
-    
+
     def __initRefactoringMenu(self):
         """
         Private method to initialize the Refactoring menu.
         """
         self.__menu = QMenu(self.tr("Refactoring"))
         self.__menu.addAction(
-            self.tr("Rename Variable"),
-            self.__jediServer.refactoringRenameVariable)
+            self.tr("Rename Variable"), self.__jediServer.refactoringRenameVariable
+        )
         self.__menu.addAction(
-            self.tr("Extract Variable"),
-            self.__jediServer.refactoringExtractNewVariable)
+            self.tr("Extract Variable"), self.__jediServer.refactoringExtractNewVariable
+        )
         self.__menu.addAction(
-            self.tr("Inline Variable"),
-            self.__jediServer.refactoringInlineVariable)
+            self.tr("Inline Variable"), self.__jediServer.refactoringInlineVariable
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
-            self.tr("Extract Function"),
-            self.__jediServer.refactoringExtractFunction)
-    
+            self.tr("Extract Function"), self.__jediServer.refactoringExtractFunction
+        )
+
     def __editorShowMenu(self, menuName, menu, editor):
         """
         Private slot called, when the the editor context menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown
         @type str
         @param menu reference to the menu
--- a/src/eric7/JediInterface/JediClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/JediInterface/JediClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,7 @@
 
 SuppressedException = Exception
 
-modulePath = sys.argv[-1]   # it is always the last parameter
+modulePath = sys.argv[-1]  # it is always the last parameter
 sys.path.insert(1, modulePath)
 
 try:
@@ -27,10 +27,11 @@
     """
     Class implementing the Jedi client of eric7.
     """
+
     def __init__(self, host, port, idString):
         """
         Constructor
-        
+
         @param host ip address the background service is listening
         @type str
         @param port port of the background service
@@ -40,18 +41,16 @@
         @type str
         """
         super().__init__(host, port, idString)
-        
+
         self.__methodMapping = {
             "openProject": self.__openProject,
             "closeProject": self.__closeProject,
-            
             "getCompletions": self.__getCompletions,
             "getCallTips": self.__getCallTips,
             "getDocumentation": self.__getDocumentation,
             "hoverHelp": self.__getHoverHelp,
             "gotoDefinition": self.__getAssignment,
             "gotoReferences": self.__getReferences,
-            
             "renameVariable": self.__renameVariable,
             "extractVariable": self.__extractVariable,
             "inlineVariable": self.__inlineVariable,
@@ -59,85 +58,85 @@
             "applyRefactoring": self.__applyRefactoring,
             "cancelRefactoring": self.__cancelRefactoring,
         }
-        
+
         self.__id = idString
-        
+
         self.__project = None
-        
+
         self.__refactorings = {}
-    
+
     def handleCall(self, method, params):
         """
         Public method to handle a method call from the server.
-        
+
         @param method requested method name
         @type str
         @param params dictionary with method specific parameters
         @type dict
         """
         self.__methodMapping[method](params)
-    
+
     def __handleError(self, err):
         """
         Private method to process an error.
-        
+
         @param err exception object
         @type Exception or Warning
         @return dictionary containing the error information
         @rtype dict
         """
         error = str(type(err)).split()[-1]
-        error = error[1:-2].split('.')[-1]
+        error = error[1:-2].split(".")[-1]
         errorDict = {
             "Error": error,
             "ErrorString": str(err),
         }
-        
+
         return errorDict
-    
+
     def __openProject(self, params):
         """
         Private method to create a jedi project and load its saved data.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
         projectPath = params["ProjectPath"]
         self.__project = jedi.Project(projectPath)
-    
+
     def __closeProject(self, params):
         """
         Private method to save a jedi project's data.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
         if self.__project is not None:
             self.__project.save()
-    
+
     def __completionType(self, completion):
         """
         Private method to assemble the completion type depending on the
         visibility indicated by the completion name.
-        
+
         @param completion reference to the completion object
         @type jedi.api.classes.Completion
         @return modified completion type
         @rtype str
         """
-        if completion.name.startswith('__'):
-            compType = '__' + completion.type
-        elif completion.name.startswith('_'):
-            compType = '_' + completion.type
+        if completion.name.startswith("__"):
+            compType = "__" + completion.type
+        elif completion.name.startswith("_"):
+            compType = "_" + completion.type
         else:
             compType = completion.type
-        
+
         return compType
-    
+
     def __completionFullName(self, completion):
         """
         Private method to extract the full completion name.
-        
+
         @param completion reference to the completion object
         @type jedi.api.classes.Completion
         @return full completion name
@@ -146,16 +145,16 @@
         fullName = completion.full_name
         fullName = (
             fullName.replace("__main__", completion.module_name)
-            if fullName else
-            completion.module_name
+            if fullName
+            else completion.module_name
         )
-        
+
         return fullName
-    
+
     def __getCompletions(self, params):
         """
         Private method to calculate possible completions.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -164,40 +163,42 @@
         line = params["Line"]
         index = params["Index"]
         fuzzy = params["Fuzzy"]
-        
+
         errorDict = {}
         response = []
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             completions = script.complete(line, index, fuzzy=fuzzy)
             response = [
                 {
-                    'ModulePath': str(completion.module_path),
-                    'Name': completion.name,
-                    'FullName': self.__completionFullName(completion),
-                    'CompletionType': self.__completionType(completion),
-                } for completion in completions
-                if not (completion.name.startswith("__") and
-                        completion.name.endswith("__"))
+                    "ModulePath": str(completion.module_path),
+                    "Name": completion.name,
+                    "FullName": self.__completionFullName(completion),
+                    "CompletionType": self.__completionType(completion),
+                }
+                for completion in completions
+                if not (
+                    completion.name.startswith("__") and completion.name.endswith("__")
+                )
             ]
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Completions": response,
             "CompletionText": params["CompletionText"],
             "FileName": filename,
         }
         result.update(errorDict)
-        
+
         self.sendJson("CompletionsResult", result)
-    
+
     def __getCallTips(self, params):
         """
         Private method to calculate possible calltips.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -205,12 +206,12 @@
         source = params["Source"]
         line = params["Line"]
         index = params["Index"]
-        
+
         errorDict = {}
         calltips = []
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             signatures = script.get_signatures(line, index)
             for signature in signatures:
@@ -219,18 +220,18 @@
                 calltips.append("{0}{1}".format(name, params))
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "CallTips": calltips,
         }
         result.update(errorDict)
-        
+
         self.sendJson("CallTipsResult", result)
 
     def __extractParameters(self, signature):
         """
         Private method to extract the call parameter descriptions.
-        
+
         @param signature a jedi signature object
         @type object
         @return a string with comma seperated parameter names and default
@@ -238,17 +239,18 @@
         @rtype str
         """
         try:
-            params = ", ".join([param.description.split('param ', 1)[-1]
-                                for param in signature.params])
+            params = ", ".join(
+                [param.description.split("param ", 1)[-1] for param in signature.params]
+            )
             return "({0})".format(params)
         except AttributeError:
             # Empty strings as argspec suppress display of "definition"
-            return ' '
-    
+            return " "
+
     def __getDocumentation(self, params):
         """
         Private method to get some source code documentation.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -256,15 +258,15 @@
         source = params["Source"]
         line = params["Line"]
         index = params["Index"]
-        
+
         errorDict = {}
         docu = {}
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             definitions = script.infer(line, index)
-            definition = definitions[0]     # use the first one only
+            definition = definitions[0]  # use the first one only
             docu = {
                 "name": definition.full_name,
                 "module": definition.module_name,
@@ -273,18 +275,18 @@
             }
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "DocumentationDict": docu,
         }
         result.update(errorDict)
-        
+
         self.sendJson("DocumentationResult", result)
-    
+
     def __getHoverHelp(self, params):
         """
         Private method to get some source code documentation.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -293,17 +295,17 @@
         line = params["Line"]
         index = params["Index"]
         uid = params["Uuid"]
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
 
         errorDict = {}
         helpText = ""
-        
+
         try:
             helpText = script.help(line, index)[0].docstring()
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Line": line,
             "Index": index,
@@ -311,13 +313,13 @@
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("HoverHelpResult", result)
-    
+
     def __getAssignment(self, params):
         """
         Private method to get the place a parameter is defined.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -326,27 +328,27 @@
         line = params["Line"]
         index = params["Index"]
         uid = params["Uuid"]
-        
+
         errorDict = {}
         gotoDefinition = {}
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             assignments = script.goto(
-                line, index, follow_imports=True, follow_builtin_imports=True)
+                line, index, follow_imports=True, follow_builtin_imports=True
+            )
             for assignment in assignments:
                 if bool(assignment.module_path):
                     gotoDefinition = {
-                        'ModulePath': str(assignment.module_path),
-                        'Line': (0 if assignment.line is None else
-                                 assignment.line),
-                        'Column': assignment.column,
+                        "ModulePath": str(assignment.module_path),
+                        "Line": (0 if assignment.line is None else assignment.line),
+                        "Column": assignment.column,
                     }
-                    
+
                     if (
-                        gotoDefinition["ModulePath"] == filename and
-                        gotoDefinition["Line"] == line
+                        gotoDefinition["ModulePath"] == filename
+                        and gotoDefinition["Line"] == line
                     ):
                         # user called for the definition itself
                         # => send the references instead
@@ -355,19 +357,19 @@
                 break
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "GotoDefinitionDict": gotoDefinition,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("GotoDefinitionResult", result)
-    
+
     def __getReferences(self, params):
         """
         Private method to get the places a parameter is referenced.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -376,44 +378,44 @@
         line = params["Line"]
         index = params["Index"]
         uid = params["Uuid"]
-        
+
         errorDict = {}
         gotoReferences = []
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
-            references = script.get_references(line, index,
-                                               include_builtins=False)
+            references = script.get_references(line, index, include_builtins=False)
             for reference in references:
                 if bool(reference.module_path):
                     if (
-                        reference.line == line and
-                        str(reference.module_path) == filename
+                        reference.line == line
+                        and str(reference.module_path) == filename
                     ):
                         continue
-                    gotoReferences.append({
-                        'ModulePath': str(reference.module_path),
-                        'Line': (0 if reference.line is None else
-                                 reference.line),
-                        'Column': reference.column,
-                        'Code': reference.get_line_code(),
-                    })
+                    gotoReferences.append(
+                        {
+                            "ModulePath": str(reference.module_path),
+                            "Line": (0 if reference.line is None else reference.line),
+                            "Column": reference.column,
+                            "Code": reference.get_line_code(),
+                        }
+                    )
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "GotoReferencesList": gotoReferences,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("GotoReferencesResult", result)
-    
+
     def __renameVariable(self, params):
         """
         Private method to rename the variable under the cursor.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -423,31 +425,31 @@
         index = params["Index"]
         uid = params["Uuid"]
         newName = params["NewName"]
-        
+
         errorDict = {}
         diff = ""
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             refactoring = script.rename(line, index, new_name=newName)
             self.__refactorings[uid] = refactoring
             diff = refactoring.get_diff()
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Diff": diff,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("RefactoringDiff", result)
-    
+
     def __extractVariable(self, params):
         """
         Private method to extract a statement to a new variable.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -459,34 +461,33 @@
         endIndex = params["EndIndex"]
         uid = params["Uuid"]
         newName = params["NewName"]
-        
+
         errorDict = {}
         diff = ""
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             refactoring = script.extract_variable(
-                line, index, new_name=newName,
-                until_line=endLine, until_column=endIndex
+                line, index, new_name=newName, until_line=endLine, until_column=endIndex
             )
             self.__refactorings[uid] = refactoring
             diff = refactoring.get_diff()
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Diff": diff,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("RefactoringDiff", result)
-    
+
     def __inlineVariable(self, params):
         """
         Private method to inline a variable statement.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -495,31 +496,31 @@
         line = params["Line"]
         index = params["Index"]
         uid = params["Uuid"]
-        
+
         errorDict = {}
         diff = ""
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             refactoring = script.inline(line, index)
             self.__refactorings[uid] = refactoring
             diff = refactoring.get_diff()
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Diff": diff,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("RefactoringDiff", result)
-    
+
     def __extractFunction(self, params):
         """
         Private method to extract an expression to a new function.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -531,41 +532,40 @@
         endIndex = params["EndIndex"]
         uid = params["Uuid"]
         newName = params["NewName"]
-        
+
         errorDict = {}
         diff = ""
-        
+
         script = jedi.Script(source, path=filename, project=self.__project)
-        
+
         try:
             refactoring = script.extract_function(
-                line, index, new_name=newName,
-                until_line=endLine, until_column=endIndex
+                line, index, new_name=newName, until_line=endLine, until_column=endIndex
             )
             self.__refactorings[uid] = refactoring
             diff = refactoring.get_diff()
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "Diff": diff,
             "Uuid": uid,
         }
         result.update(errorDict)
-        
+
         self.sendJson("RefactoringDiff", result)
-    
+
     def __applyRefactoring(self, params):
         """
         Private method to apply a refactoring.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
         uid = params["Uuid"]
-        
+
         errorDict = {}
-        
+
         try:
             refactoring = self.__refactorings[uid]
             refactoring.apply()
@@ -574,21 +574,21 @@
             ok = False
         except SuppressedException as err:
             errorDict = self.__handleError(err)
-        
+
         result = {
             "result": ok,
         }
         result.update(errorDict)
-        
+
         self.sendJson("RefactoringApplyResult", result)
-        
+
         with contextlib.suppress(KeyError):
             del self.__refactorings[uid]
-    
+
     def __cancelRefactoring(self, params):
         """
         Private method to cancel a refactoring.
-        
+
         @param params dictionary containing the method parameters
         @type dict
         """
@@ -597,18 +597,17 @@
             del self.__refactorings[uid]
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     if len(sys.argv) != 5:
-        print('Host, port, id and module path parameters are missing.'
-              ' Abort.')
+        print("Host, port, id and module path parameters are missing." " Abort.")
         sys.exit(1)
-    
+
     host, port, idString = sys.argv[1:-1]
-    
+
     client = JediClient(host, int(port), idString)
     # Start the main loop
     client.run()
-    
+
     sys.exit(0)
 
 #
--- a/src/eric7/JediInterface/JediServer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/JediInterface/JediServer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,8 +31,9 @@
     """
     Class implementing the interface to the jedi library.
     """
+
     IdProject = "Project"
-    
+
     PictureIDs = {
         "class": "?{0}".format(Editor.ClassID),
         "_class": "?{0}".format(Editor.ClassProtectedID),
@@ -55,11 +56,11 @@
         "import": "",
         "None": "",
     }
-    
+
     def __init__(self, viewManager, project, ui):
         """
         Constructor
-        
+
         @param viewManager reference to the viewmanager object
         @type ViewManager
         @param project reference to the project object
@@ -67,21 +68,20 @@
         @param ui reference to the user interface
         @type UserInterface
         """
-        super().__init__(
-            "JediServer", multiplex=True, parent=ui)
-        
+        super().__init__("JediServer", multiplex=True, parent=ui)
+
         self.__ui = ui
         self.__vm = viewManager
         self.__ericProject = project
-        
+
         self.__editorLanguageMapping = {}
-        
+
         self.__documentationViewer = None
-        
+
         # attributes to store the resuls of the client side
         self.__completions = None
         self.__calltips = None
-        
+
         self.__methodMapping = {
             "CompletionsResult": self.__processCompletionsResult,
             "CallTipsResult": self.__processCallTipsResult,
@@ -89,19 +89,17 @@
             "HoverHelpResult": self.__processHoverHelpResult,
             "GotoDefinitionResult": self.__processGotoDefinitionResult,
             "GotoReferencesResult": self.__processGotoReferencesResult,
-            
             "RefactoringDiff": self.__showRefactoringDiff,
             "RefactoringApplyResult": self.__checkRefactoringResult,
-            
             "ClientException": self.__processClientException,
         }
-        
+
         # temporary store for editor references indexed by Uuid
         self.__editors = {}
-        
+
         # Python 3
         self.__ensureActive("Python3")
-    
+
     def __updateEditorLanguageMapping(self):
         """
         Private method to update the editor language to connection mapping.
@@ -109,54 +107,56 @@
         self.__editorLanguageMapping = {}
         for name in self.connectionNames():
             if name == "Python3":
-                self.__editorLanguageMapping.update({
-                    "Python3": "Python3",
-                    "MicroPython": "Python3",
-                    "Pygments|Python": "Python3",
-                    "Pygments|Python 2.x": "Python3",
-                    "Cython": "Python3",
-                })
-    
+                self.__editorLanguageMapping.update(
+                    {
+                        "Python3": "Python3",
+                        "MicroPython": "Python3",
+                        "Pygments|Python": "Python3",
+                        "Pygments|Python 2.x": "Python3",
+                        "Cython": "Python3",
+                    }
+                )
+
     def isSupportedLanguage(self, language):
         """
         Public method to check, if the given language is supported.
-        
+
         @param language editor programming language to check
         @type str
         @return flag indicating the support status
         @rtype bool
         """
         return language in self.__editorLanguageMapping
-    
+
     def __idString(self, editor):
         """
         Private method to determine the ID string for the back-end.
-        
+
         @param editor reference to the editor to determine the ID string for
         @type Editor
         @return ID string
         @rtype str
         """
         idString = ""
-        
+
         language = editor.getLanguage()
         if (
-            self.__ericProject.isOpen() and
-            self.__ericProject.getProjectLanguage() == language
+            self.__ericProject.isOpen()
+            and self.__ericProject.getProjectLanguage() == language
         ):
             filename = editor.getFileName()
             if self.__ericProject.isProjectSource(filename):
                 idString = JediServer.IdProject
-        
+
         if not idString and language in self.__editorLanguageMapping:
             idString = self.__editorLanguageMapping[language]
-        
+
         return idString
-    
+
     def __prepareData(self, editor):
         """
         Private method to gather data about current cursor position.
-        
+
         @param editor reference to the editor object, that called this method
         @type Editor
         @return tuple of filename, line, index, source
@@ -164,14 +164,14 @@
         """
         filename = editor.getFileName()
         line, index = editor.getCursorPosition()
-        line += 1       # jedi line numbers are 1 based
+        line += 1  # jedi line numbers are 1 based
         source = editor.text()
         return filename, line, index, source
-    
+
     def requestCompletions(self, editor, context, acText):
         """
         Public method to request a list of possible completions.
-        
+
         @param editor reference to the editor object, that called this method
         @type Editor
         @param context flag indicating to autocomplete a context
@@ -181,54 +181,57 @@
         """
         if not Preferences.getJedi("JediCompletionsEnabled"):
             return
-        
+
         idString = self.__idString(editor)
         if not idString:
             return
-        
+
         filename, line, index, source = self.__prepareData(editor)
         fuzzy = Preferences.getJedi("JediFuzzyCompletionsEnabled")
-        
+
         self.__ensureActive(idString)
-        
-        self.sendJson("getCompletions", {
-            "FileName": filename,
-            "Source": source,
-            "Line": line,
-            "Index": index,
-            "Fuzzy": fuzzy,
-            "CompletionText": acText,
-        }, idString=idString)
-    
+
+        self.sendJson(
+            "getCompletions",
+            {
+                "FileName": filename,
+                "Source": source,
+                "Line": line,
+                "Index": index,
+                "Fuzzy": fuzzy,
+                "CompletionText": acText,
+            },
+            idString=idString,
+        )
+
     def __processCompletionsResult(self, result):
         """
         Private method to process the completions sent by the client.
-        
+
         @param result dictionary containing the result sent by the client
         @type dict
         """
         names = []
         for completion in result["Completions"]:
-            name = completion['Name']
-            context = completion['FullName']
+            name = completion["Name"]
+            context = completion["FullName"]
             if context:
                 if context.endswith(".{0}".format(name)):
                     context = context.rsplit(".", 1)[0]
                 name = "{0} ({1})".format(name, context)
-            
-            name += JediServer.PictureIDs.get(completion['CompletionType'], '')
+
+            name += JediServer.PictureIDs.get(completion["CompletionType"], "")
             names.append(name)
-        
+
         if "Error" not in result:
             editor = self.__vm.getOpenEditor(result["FileName"])
             if editor is not None:
-                editor.completionsListReady(names,
-                                            result["CompletionText"])
-    
+                editor.completionsListReady(names, result["CompletionText"])
+
     def getCallTips(self, editor, pos, commas):
         """
         Public method to calculate calltips.
-        
+
         @param editor reference to the editor object, that called this method
         @type Editor
         @param pos position in the text for the calltip
@@ -240,38 +243,42 @@
         """
         if not Preferences.getJedi("JediCalltipsEnabled"):
             return []
-        
+
         # reset the calltips buffer
         self.__calltips = None
-        
+
         idString = self.__idString(editor)
         if not idString:
             return []
-        
+
         filename, line, index, source = self.__prepareData(editor)
-        
+
         self.__ensureActive(idString)
-        self.sendJson("getCallTips", {
-            "FileName": filename,
-            "Source": source,
-            "Line": line,
-            "Index": index,
-        }, idString=idString)
-        
+        self.sendJson(
+            "getCallTips",
+            {
+                "FileName": filename,
+                "Source": source,
+                "Line": line,
+                "Index": index,
+            },
+            idString=idString,
+        )
+
         # emulate the synchronous behaviour
         timer = QTimer()
         timer.setSingleShot(True)
-        timer.start(5000)           # 5s timeout
+        timer.start(5000)  # 5s timeout
         while self.__calltips is None and timer.isActive():
             QCoreApplication.processEvents()
             QThread.msleep(100)
-        
+
         return [] if self.__calltips is None else self.__calltips
-    
+
     def __processCallTipsResult(self, result):
         """
         Private method to process the calltips sent by the client.
-        
+
         @param result dictionary containing the result sent by the client
         @type dict
         """
@@ -279,106 +286,109 @@
             self.__calltips = []
         else:
             self.__calltips = result["CallTips"]
-    
+
     def requestCodeDocumentation(self, editor):
         """
         Public method to request source code documentation for the given
         editor.
-        
+
         @param editor reference to the editor to get source code documentation
             for
         @type Editor
         """
         if self.__documentationViewer is None:
             return
-        
+
         idString = self.__idString(editor)
-        
+
         if not idString:
             language = editor.getLanguage()
-            warning = (
-                self.tr("Language <b>{0}</b> is not supported.")
-                .format(language)
-            )
-            self.__documentationViewer.documentationReady(
-                warning, isWarning=True)
+            warning = self.tr("Language <b>{0}</b> is not supported.").format(language)
+            self.__documentationViewer.documentationReady(warning, isWarning=True)
             return
-        
+
         filename, line, index, source = self.__prepareData(editor)
         sourceLines = source.splitlines()
         # Correct index if cursor is standing after an opening bracket
-        if line > 0 and index > 0 and sourceLines[line - 1][index - 1] == '(':
+        if line > 0 and index > 0 and sourceLines[line - 1][index - 1] == "(":
             index -= 1
-        
+
         self.__ensureActive(idString)
-        self.sendJson("getDocumentation", {
-            "FileName": filename,
-            "Source": source,
-            "Line": line,
-            "Index": index,
-        }, idString=idString)
-    
+        self.sendJson(
+            "getDocumentation",
+            {
+                "FileName": filename,
+                "Source": source,
+                "Line": line,
+                "Index": index,
+            },
+            idString=idString,
+        )
+
     def __processDocumentationResult(self, result):
         """
         Private method to process the documentation sent by the client.
-        
+
         @param result dictionary containing the result sent by the client
         @type dict with keys 'name', 'module', 'argspec', 'docstring'
         """
         if self.__documentationViewer is None:
             return
-    
+
         docu = None
-        
+
         if "Error" not in result:
             docu = result["DocumentationDict"]
-            docu["note"] = (
-                self.tr("Present in <i>{0}</i> module")
-                .format(docu["module"]))
-        
+            docu["note"] = self.tr("Present in <i>{0}</i> module").format(
+                docu["module"]
+            )
+
         if docu is None:
             msg = self.tr("No documentation available.")
-            self.__documentationViewer.documentationReady(
-                msg, isDocWarning=True)
+            self.__documentationViewer.documentationReady(msg, isDocWarning=True)
         else:
             self.__documentationViewer.documentationReady(docu)
-    
+
     def gotoDefinition(self, editor):
         """
         Public slot to find the definition for the word at the cursor position
         and go to it.
-        
+
         Note: This is executed upon a mouse click sequence.
-        
+
         @param editor reference to the calling editor
         @type Editor
         """
         if not Preferences.getJedi("MouseClickEnabled"):
             return
-        
+
         idString = self.__idString(editor)
         if not idString:
             return
-        
+
         filename, line, index, source = self.__prepareData(editor)
-        
+
         self.__ensureActive(idString)
-        
+
         euuid = str(uuid.uuid4())
         self.__editors[euuid] = editor
-        
-        self.sendJson("gotoDefinition", {
-            "FileName": filename,
-            "Source": source,
-            "Line": line,
-            "Index": index,
-            "Uuid": euuid,
-        }, idString=idString)
-    
+
+        self.sendJson(
+            "gotoDefinition",
+            {
+                "FileName": filename,
+                "Source": source,
+                "Line": line,
+                "Index": index,
+                "Uuid": euuid,
+            },
+            idString=idString,
+        )
+
     def __processGotoDefinitionResult(self, result):
         """
         Private method callback for the goto definition result.
-        
+
         @param result dictionary containing the result data
         @type dict
         """
@@ -387,27 +397,28 @@
             # ignore errors silently
             location = result["GotoDefinitionDict"]
             if location:
-                self.__vm.openSourceFile(location["ModulePath"],
-                                         location["Line"],
-                                         addNext=True)
+                self.__vm.openSourceFile(
+                    location["ModulePath"], location["Line"], addNext=True
+                )
             else:
                 ericApp().getObject("UserInterface").statusBar().showMessage(
-                    self.tr('Jedi: No definition found'), 5000)
-        
+                    self.tr("Jedi: No definition found"), 5000
+                )
+
         with contextlib.suppress(KeyError):
             del self.__editors[euuid]
-    
+
     def __processGotoReferencesResult(self, result):
         """
         Private method callback for the goto references result.
-        
+
         @param result dictionary containing the result data
         @type dict
         """
         euuid = result["Uuid"]
         with contextlib.suppress(ImportError):
             from QScintilla.Editor import ReferenceItem
-            
+
             if "Error" not in result:
                 # ignore errors silently
                 references = result["GotoReferencesList"]
@@ -423,17 +434,18 @@
                                 codeLine=ref["Code"],
                                 line=ref["Line"],
                                 column=ref["Column"],
-                            ) for ref in references
+                            )
+                            for ref in references
                         ]
                         editor.gotoReferenceHandler(referenceItemsList)
-        
+
         with contextlib.suppress(KeyError):
             del self.__editors[euuid]
-    
+
     def hoverHelp(self, editor, line, index):
         """
         Public method to initiate the display of mouse hover help.
-        
+
         @param editor reference to the calling editor
         @type Editor
         @param line line number (zero based)
@@ -444,28 +456,32 @@
         idString = self.__idString(editor)
         if not idString:
             return
-        
+
         filename = editor.getFileName()
-        line += 1       # jedi line numbers are 1 based
+        line += 1  # jedi line numbers are 1 based
         source = editor.text()
-        
+
         self.__ensureActive(idString)
-        
+
         euuid = str(uuid.uuid4())
         self.__editors[euuid] = editor
-        
-        self.sendJson("hoverHelp", {
-            "FileName": filename,
-            "Source": source,
-            "Line": line,
-            "Index": index,
-            "Uuid": euuid,
-        }, idString=idString)
-    
+
+        self.sendJson(
+            "hoverHelp",
+            {
+                "FileName": filename,
+                "Source": source,
+                "Line": line,
+                "Index": index,
+                "Uuid": euuid,
+            },
+            idString=idString,
+        )
+
     def __processHoverHelpResult(self, result):
         """
         Private method callback for the goto definition result.
-        
+
         @param result dictionary containing the result data
         @type dict
         """
@@ -476,21 +492,20 @@
             if helpText:
                 with contextlib.suppress(KeyError):
                     self.__editors[euuid].showMouseHoverHelpData(
-                        result["Line"] - 1,
-                        result["Index"],
-                        helpText
+                        result["Line"] - 1, result["Index"], helpText
                     )
             else:
                 ericApp().getObject("UserInterface").statusBar().showMessage(
-                    self.tr('Jedi: No mouse hover help found'), 5000)
-        
+                    self.tr("Jedi: No mouse hover help found"), 5000
+                )
+
         with contextlib.suppress(KeyError):
             del self.__editors[euuid]
-    
+
     #######################################################################
     ## Refactoring methods below
     #######################################################################
-    
+
     @pyqtSlot()
     def refactoringRenameVariable(self):
         """
@@ -501,34 +516,38 @@
             idString = self.__idString(editor)
             if not idString:
                 return
-            
+
             newName, ok = QInputDialog.getText(
                 None,
                 self.tr("Rename Variable"),
                 self.tr("Enter the new name for the variable:"),
                 QLineEdit.EchoMode.Normal,
-                editor.selectedText()
+                editor.selectedText(),
             )
-            
+
             if ok and newName and self.__vm.checkAllDirty():
                 filename = editor.getFileName()
                 line, index = editor.getCursorPosition()
                 source = editor.text()
-                
+
                 self.__ensureActive(idString)
-                
+
                 euuid = str(uuid.uuid4())
                 self.__editors[euuid] = editor
-                
-                self.sendJson("renameVariable", {
-                    "FileName": filename,
-                    "Source": source,
-                    "Line": line + 1,
-                    "Index": index,
-                    "Uuid": euuid,
-                    "NewName": newName,
-                }, idString=idString)
-    
+
+                self.sendJson(
+                    "renameVariable",
+                    {
+                        "FileName": filename,
+                        "Source": source,
+                        "Line": line + 1,
+                        "Index": index,
+                        "Uuid": euuid,
+                        "NewName": newName,
+                    },
+                    idString=idString,
+                )
+
     @pyqtSlot()
     def refactoringExtractNewVariable(self):
         """
@@ -539,40 +558,44 @@
             idString = self.__idString(editor)
             if not idString:
                 return
-            
+
             newName, ok = QInputDialog.getText(
                 None,
                 self.tr("Extract Variable"),
                 self.tr("Enter the name for the new variable:"),
-                QLineEdit.EchoMode.Normal
+                QLineEdit.EchoMode.Normal,
             )
-            
+
             if ok and newName and editor.checkDirty():
                 filename = editor.getFileName()
                 sLine, sIndex, eLine, eIndex = editor.getSelection()
                 source = editor.text()
-                    
+
                 self.__ensureActive(idString)
-                
+
                 euuid = str(uuid.uuid4())
                 self.__editors[euuid] = editor
-                
-                self.sendJson("extractVariable", {
-                    "FileName": filename,
-                    "Source": source,
-                    "Line": sLine + 1,
-                    "Index": sIndex,
-                    "EndLine": eLine + 1,
-                    "EndIndex": eIndex,
-                    "Uuid": euuid,
-                    "NewName": newName,
-                }, idString=idString)
-    
+
+                self.sendJson(
+                    "extractVariable",
+                    {
+                        "FileName": filename,
+                        "Source": source,
+                        "Line": sLine + 1,
+                        "Index": sIndex,
+                        "EndLine": eLine + 1,
+                        "EndIndex": eIndex,
+                        "Uuid": euuid,
+                        "NewName": newName,
+                    },
+                    idString=idString,
+                )
+
     @pyqtSlot()
     def refactoringInlineVariable(self):
         """
         Public slot to inline the selected variable.
-        
+
         Note: This is the opposite to Extract New Variable.
         """
         editor = self.__vm.activeWindow()
@@ -580,25 +603,29 @@
             idString = self.__idString(editor)
             if not idString:
                 return
-            
+
             if editor.checkDirty():
                 filename = editor.getFileName()
                 line, index = editor.getCursorPosition()
                 source = editor.text()
-                
+
                 self.__ensureActive(idString)
-                
+
                 euuid = str(uuid.uuid4())
                 self.__editors[euuid] = editor
-                
-                self.sendJson("inlineVariable", {
-                    "FileName": filename,
-                    "Source": source,
-                    "Line": line + 1,
-                    "Index": index,
-                    "Uuid": euuid,
-                }, idString=idString)
-    
+
+                self.sendJson(
+                    "inlineVariable",
+                    {
+                        "FileName": filename,
+                        "Source": source,
+                        "Line": line + 1,
+                        "Index": index,
+                        "Uuid": euuid,
+                    },
+                    idString=idString,
+                )
+
     @pyqtSlot()
     def refactoringExtractFunction(self):
         """
@@ -609,39 +636,43 @@
             idString = self.__idString(editor)
             if not idString:
                 return
-            
+
             newName, ok = QInputDialog.getText(
                 None,
                 self.tr("Extract Function"),
                 self.tr("Enter the name for the function:"),
-                QLineEdit.EchoMode.Normal
+                QLineEdit.EchoMode.Normal,
             )
-            
+
             if ok and newName and editor.checkDirty():
                 filename = editor.getFileName()
                 sLine, sIndex, eLine, eIndex = editor.getSelection()
                 source = editor.text()
-                    
+
                 self.__ensureActive(idString)
-                
+
                 euuid = str(uuid.uuid4())
                 self.__editors[euuid] = editor
-                
-                self.sendJson("extractFunction", {
-                    "FileName": filename,
-                    "Source": source,
-                    "Line": sLine + 1,
-                    "Index": sIndex,
-                    "EndLine": eLine + 1,
-                    "EndIndex": eIndex,
-                    "Uuid": euuid,
-                    "NewName": newName,
-                }, idString=idString)
-    
+
+                self.sendJson(
+                    "extractFunction",
+                    {
+                        "FileName": filename,
+                        "Source": source,
+                        "Line": sLine + 1,
+                        "Index": sIndex,
+                        "EndLine": eLine + 1,
+                        "EndIndex": eIndex,
+                        "Uuid": euuid,
+                        "NewName": newName,
+                    },
+                    idString=idString,
+                )
+
     def __showRefactoringDiff(self, result):
         """
         Private method to show the diff of a refactoring.
-        
+
         @param result dictionary containing the result data
         @type dict
         """
@@ -657,48 +688,58 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Refactoring"),
-                self.tr("<p>The refactoring could not be performed.</p>"
-                        "<p>Reason: {0}</p>").format(result["ErrorString"])
+                self.tr(
+                    "<p>The refactoring could not be performed.</p>"
+                    "<p>Reason: {0}</p>"
+                ).format(result["ErrorString"]),
             )
-    
+
     def __applyRefactoring(self, uid):
         """
         Private method to apply a given refactoring.
-        
+
         @param uid UID of the calculated refactoring
         @type str
         """
         with contextlib.suppress(KeyError):
             editor = self.__editors[uid]
             idString = self.__idString(editor)
-            
-            self.sendJson("applyRefactoring", {
-                "Uuid": uid,
-            }, idString=idString)
-            
+
+            self.sendJson(
+                "applyRefactoring",
+                {
+                    "Uuid": uid,
+                },
+                idString=idString,
+            )
+
             del self.__editors[uid]
-    
+
     def __cancelRefactoring(self, uid):
         """
         Private method to cancel a given refactoring.
-        
+
         @param uid UID of the calculated refactoring
         @type str
         """
         with contextlib.suppress(KeyError):
             editor = self.__editors[uid]
             idString = self.__idString(editor)
-            
-            self.sendJson("cancelRefactoring", {
-                "Uuid": uid,
-            }, idString=idString)
-            
+
+            self.sendJson(
+                "cancelRefactoring",
+                {
+                    "Uuid": uid,
+                },
+                idString=idString,
+            )
+
             del self.__editors[uid]
-    
+
     def __checkRefactoringResult(self, result):
         """
         Private method to check the refactoring result for errors.
-        
+
         @param result dictionary containing the result data
         @type dict
         """
@@ -706,56 +747,62 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Apply Refactoring"),
-                self.tr("<p>The refactoring could not be applied.</p>"
-                        "<p>Reason: {0}</p>").format(result["ErrorString"])
+                self.tr(
+                    "<p>The refactoring could not be applied.</p>" "<p>Reason: {0}</p>"
+                ).format(result["ErrorString"]),
             )
-    
+
     #######################################################################
     ## Methods below handle the network connection
     #######################################################################
-    
+
     def handleCall(self, method, params):
         """
         Public method to handle a method call from the client.
-        
+
         @param method requested method name
         @type str
         @param params dictionary with method specific parameters
         @type dict
         """
         self.__methodMapping[method](params)
-    
+
     def __processClientException(self, params):
         """
         Private method to handle exceptions of the refactoring client.
-        
+
         @param params dictionary containing the exception data
         @type dict
         """
         if params["ExceptionType"] == "ProtocolError":
             self.__ui.appendToStderr(
-                self.tr("The data received from the Jedi server could not be"
-                        " decoded. Please report this issue with the received"
-                        " data to the eric bugs email address.\n"
-                        "Error: {0}\n"
-                        "Data:\n{1}\n").format(
-                    params["ExceptionValue"],
-                    params["ProtocolData"]))
+                self.tr(
+                    "The data received from the Jedi server could not be"
+                    " decoded. Please report this issue with the received"
+                    " data to the eric bugs email address.\n"
+                    "Error: {0}\n"
+                    "Data:\n{1}\n"
+                ).format(params["ExceptionValue"], params["ProtocolData"])
+            )
         else:
             self.__ui.appendToStderr(
-                self.tr("An exception happened in the Jedi client. Please"
-                        " report it to the eric bugs email address.\n"
-                        "Exception: {0}\n"
-                        "Value: {1}\n"
-                        "Traceback: {2}\n").format(
+                self.tr(
+                    "An exception happened in the Jedi client. Please"
+                    " report it to the eric bugs email address.\n"
+                    "Exception: {0}\n"
+                    "Value: {1}\n"
+                    "Traceback: {2}\n"
+                ).format(
                     params["ExceptionType"],
                     params["ExceptionValue"],
-                    params["Traceback"]))
-    
+                    params["Traceback"],
+                )
+            )
+
     def __startJediClient(self, interpreter, idString, clientEnv):
         """
         Private method to start the Jedi client with the given interpreter.
-        
+
         @param interpreter interpreter to be used for the Jedi client
         @type str
         @param idString id of the client to be started
@@ -767,38 +814,47 @@
         @rtype bool
         """
         ok = False
-        
+
         if interpreter:
-            client = os.path.join(os.path.dirname(__file__),
-                                  "JediClient.py")
+            client = os.path.join(os.path.dirname(__file__), "JediClient.py")
             ok, exitCode = self.startClient(
-                interpreter, client,
+                interpreter,
+                client,
                 [Globals.getPythonLibraryDirectory()],
-                idString=idString, environment=clientEnv)
+                idString=idString,
+                environment=clientEnv,
+            )
             if not ok:
                 if exitCode == 42:
-                    self.__ui.appendToStderr("JediServer: " + self.tr(
-                        "The jedi and/or parso library is not installed.\n"
-                    ))
+                    self.__ui.appendToStderr(
+                        "JediServer: "
+                        + self.tr("The jedi and/or parso library is not installed.\n")
+                    )
                 else:
-                    self.__ui.appendToStderr("JediServer: " + self.tr(
-                        "'{0}' is not supported because the configured"
-                        " interpreter could not be started.\n"
-                    ).format(idString))
+                    self.__ui.appendToStderr(
+                        "JediServer: "
+                        + self.tr(
+                            "'{0}' is not supported because the configured"
+                            " interpreter could not be started.\n"
+                        ).format(idString)
+                    )
         else:
-            self.__ui.appendToStderr("JediServer: " + self.tr(
-                "'{0}' is not supported because no suitable interpreter is"
-                " configured.\n"
-            ).format(idString))
-        
+            self.__ui.appendToStderr(
+                "JediServer: "
+                + self.tr(
+                    "'{0}' is not supported because no suitable interpreter is"
+                    " configured.\n"
+                ).format(idString)
+            )
+
         return ok
-    
+
     def __ensureActive(self, idString):
         """
         Private method to ensure, that the requested client is active.
-        
+
         A non-active client will be started.
-        
+
         @param idString id of the client to be checked
         @type str
         @return flag indicating an active client
@@ -822,15 +878,15 @@
                     if not venvName:
                         venvName, _ = venvManager.getDefaultEnvironment()
                 if venvName:
-                    interpreter = venvManager.getVirtualenvInterpreter(
-                        venvName)
+                    interpreter = venvManager.getVirtualenvInterpreter(venvName)
                     execPath = venvManager.getVirtualenvExecPath(venvName)
-                    
+
                     # build a suitable environment
                     if execPath:
                         if "PATH" in clientEnv:
                             clientEnv["PATH"] = os.pathsep.join(
-                                [execPath, clientEnv["PATH"]])
+                                [execPath, clientEnv["PATH"]]
+                            )
                         else:
                             clientEnv["PATH"] = execPath
             if interpreter:
@@ -838,12 +894,12 @@
             else:
                 ok = False
         return ok
-    
+
     def __interpreterForProject(self):
         """
         Private method to determine the interpreter for the current project and
         the environment to run it.
-        
+
         @return tuple containing the interpreter of the current project and the
             environment variables
         @rtype tuple of (str, dict)
@@ -853,32 +909,32 @@
         clientEnv = os.environ.copy()
         if "PATH" in clientEnv:
             clientEnv["PATH"] = self.__ui.getOriginalPathString()
-        
+
         if projectLanguage in ("Python3", "MicroPython", "Cython"):
-            interpreter = self.__ericProject.getProjectInterpreter(
-                resolveGlobal=False)
+            interpreter = self.__ericProject.getProjectInterpreter(resolveGlobal=False)
             if interpreter:
                 execPath = self.__ericProject.getProjectExecPath()
-                
+
                 # build a suitable environment
                 if execPath:
                     if "PATH" in clientEnv:
                         clientEnv["PATH"] = os.pathsep.join(
-                            [execPath, clientEnv["PATH"]])
+                            [execPath, clientEnv["PATH"]]
+                        )
                     else:
                         clientEnv["PATH"] = execPath
-        
+
         return interpreter, clientEnv
-    
+
     @pyqtSlot()
     def handleNewConnection(self):
         """
         Public slot for new incoming connections from a client.
         """
         super().handleNewConnection()
-        
+
         self.__updateEditorLanguageMapping()
-    
+
     def activate(self):
         """
         Public method to activate the Jedi server.
@@ -886,12 +942,15 @@
         self.__documentationViewer = self.__ui.documentationViewer()
         if self.__documentationViewer is not None:
             self.__documentationViewer.registerProvider(
-                "jedi", self.tr("Jedi"), self.requestCodeDocumentation,
-                self.isSupportedLanguage)
-        
+                "jedi",
+                self.tr("Jedi"),
+                self.requestCodeDocumentation,
+                self.isSupportedLanguage,
+            )
+
         self.__ericProject.projectOpened.connect(self.__projectOpened)
         self.__ericProject.projectClosed.connect(self.__projectClosed)
-    
+
     def deactivate(self):
         """
         Public method to deactivate the code assist server.
@@ -901,23 +960,27 @@
         """
         if self.__documentationViewer is not None:
             self.__documentationViewer.unregisterProvider("jedi")
-        
+
         with contextlib.suppress(TypeError):
             self.__ericProject.projectOpened.disconnect(self.__projectOpened)
             self.__ericProject.projectClosed.disconnect(self.__projectClosed)
-        
+
         self.stopAllClients()
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
         Private slot to handle the projectOpened signal.
         """
         self.__ensureActive(JediServer.IdProject)
-        self.sendJson("openProject", {
-            "ProjectPath": self.__ericProject.getProjectPath(),
-        }, idString=JediServer.IdProject)
-    
+        self.sendJson(
+            "openProject",
+            {
+                "ProjectPath": self.__ericProject.getProjectPath(),
+            },
+            idString=JediServer.IdProject,
+        )
+
     @pyqtSlot()
     def __projectClosed(self):
         """
@@ -925,5 +988,5 @@
         """
         self.__ensureActive(JediServer.IdProject)
         self.sendJson("closeProject", {}, idString=JediServer.IdProject)
-        
+
         self.stopClient(idString=JediServer.IdProject)
--- a/src/eric7/JediInterface/RefactoringPreviewDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/JediInterface/RefactoringPreviewDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to preview refactoring changes.
     """
+
     def __init__(self, title, diff, parent=None):
         """
         Constructor
-        
+
         @param title title string to be shown above the diff
         @type str
         @param diff changes to be shown (unified diff)
@@ -31,11 +32,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.buttonBox.addButton(
-            self.tr("&Apply Changes"), QDialogButtonBox.ButtonRole.AcceptRole)
-        
+            self.tr("&Apply Changes"), QDialogButtonBox.ButtonRole.AcceptRole
+        )
+
         self.highlighter = DiffHighlighter(self.previewEdit.document())
-        
+
         self.titleLabel.setText(title)
         self.previewEdit.setPlainText(diff)
--- a/src/eric7/MicroPython/AddEditDevicesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/AddEditDevicesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,14 +24,14 @@
     Class implementing a dialog to add or edit data of unknown MicroPython
     devices.
     """
-    def __init__(self, vid=0, pid=0, description=0, deviceData=None,
-                 parent=None):
+
+    def __init__(self, vid=0, pid=0, description=0, deviceData=None, parent=None):
         """
         Constructor
-        
+
         Note: Either vid and pid and description or deviceData dictionary
         must be given.
-        
+
         @param vid vendor ID of the device (defaults to 0)
         @type int (optional)
         @param pid product ID of the device (defaults to 0)
@@ -45,18 +45,19 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # populate the device type combo box
         self.deviceTypeComboBox.addItem("", "")
         for board, desc in sorted(getSupportedDevices(), key=lambda x: x[1]):
             self.deviceTypeComboBox.addItem(desc, board)
-        
+
         if deviceData is not None:
             self.vidEdit.setText("0x{0:04x}".format(deviceData["vid"]))
             self.pidEdit.setText("0x{0:04x}".format(deviceData["pid"]))
             self.descriptionEdit.setText(deviceData["description"])
             self.deviceTypeComboBox.setCurrentIndex(
-                self.deviceTypeComboBox.findData(deviceData["type"]))
+                self.deviceTypeComboBox.findData(deviceData["type"])
+            )
             self.dataVolumeEdit.setText(deviceData["data_volume"])
             self.flashVolumeEdit.setText(deviceData["flash_volume"])
         else:
@@ -66,54 +67,57 @@
             self.deviceTypeComboBox.setCurrentText("")
             self.dataVolumeEdit.setText("")
             self.flashVolumeEdit.setText("")
-        
+
         self.deviceTypeComboBox.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(int)
     def on_deviceTypeComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a device type.
-        
+
         @param index index of the current item
         @type int
         """
         board = self.deviceTypeComboBox.currentData()
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(board))
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(board)
+        )
         self.reportButton.setEnabled(bool(board))
-    
+
     @pyqtSlot()
     def on_reportButton_clicked(self):
         """
         Private slot to report the entered data to the eric-bugs email address.
         """
-        body = "\r\n".join([
-            "This is an unknown MicroPython device. Please add it.",
-            "",
-            "VID: {0}".format(self.vidEdit.text()),
-            "PID: {0}".format(self.pidEdit.text()),
-            "Description: {0}".format(self.descriptionEdit.text()),
-            "Device Type: {0}".format(self.deviceTypeComboBox.currentData()),
-            "Data Volume: {0}".format(self.dataVolumeEdit.text().strip()),
-            "Flash Volume: {0}".format(self.flashVolumeEdit.text().strip()),
-        ])
-        
+        body = "\r\n".join(
+            [
+                "This is an unknown MicroPython device. Please add it.",
+                "",
+                "VID: {0}".format(self.vidEdit.text()),
+                "PID: {0}".format(self.pidEdit.text()),
+                "Description: {0}".format(self.descriptionEdit.text()),
+                "Device Type: {0}".format(self.deviceTypeComboBox.currentData()),
+                "Data Volume: {0}".format(self.dataVolumeEdit.text().strip()),
+                "Flash Volume: {0}".format(self.flashVolumeEdit.text().strip()),
+            ]
+        )
+
         urlQuery = QUrlQuery()
         urlQuery.addQueryItem("subject", "Unsupported MicroPython Device")
         urlQuery.addQueryItem("body", body)
-        
+
         url = QUrl("mailto:{0}".format(BugAddress))
         url.setQuery(urlQuery)
-        
+
         QDesktopServices.openUrl(url)
-    
+
     def getDeviceDict(self):
         """
         Public method to get the entered data as a dictionary.
-        
+
         @return dictionary containing the entered data
         @rtype dict
         """
--- a/src/eric7/MicroPython/BoardDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/BoardDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to show information about a connected board.
     """
+
     def __init__(self, data, parent=None):
         """
         Constructor
-        
+
         @param data dictionary containing the data to be shown
         @type dict
         @param parent reference to the parent widget (defaults to None)
@@ -30,37 +31,34 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         loc = QLocale()
-        
+
         self.dataTree.setColumnCount(2)
-        
+
         header = self.__createHeader(self.tr("General"))
-        QTreeWidgetItem(header, [
-            self.tr("Board ID"),
-            data["mc_id"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Board Frequency"),
-            self.tr("{0} MHz").format(
-                loc.toString(data["mc_frequency_mhz"], "f", 0))
-        ])
+        QTreeWidgetItem(header, [self.tr("Board ID"), data["mc_id"]])
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("Board Frequency"),
+                self.tr("{0} MHz").format(
+                    loc.toString(data["mc_frequency_mhz"], "f", 0)
+                ),
+            ],
+        )
         with contextlib.suppress(KeyError):
-            QTreeWidgetItem(header, [
-                self.tr("Board Temperature"),
-                self.tr("{0} °C").format(
-                    loc.toString(data["mc_temp_c"], "f", 1))
-            ])
-        
+            QTreeWidgetItem(
+                header,
+                [
+                    self.tr("Board Temperature"),
+                    self.tr("{0} °C").format(loc.toString(data["mc_temp_c"], "f", 1)),
+                ],
+            )
+
         header = self.__createHeader(self.tr("Python"))
-        QTreeWidgetItem(header, [
-            self.tr("Python Version"),
-            data["py_version"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Platform"),
-            data["py_platform"]
-        ])
+        QTreeWidgetItem(header, [self.tr("Python Version"), data["py_version"]])
+        QTreeWidgetItem(header, [self.tr("Platform"), data["py_platform"]])
         if data["mpy_name"] == "micropython":
             mpyName = "MicroPython"
         elif data["mpy_name"] == "circuitpython":
@@ -69,95 +67,102 @@
             mpyName = self.tr("unknown")
         else:
             mpyName = data["name"]
-        QTreeWidgetItem(header, [
-            self.tr("Implementation"),
-            self.tr("{0} V. {1}").format(
-                mpyName,
-                self.tr("unknown")
-                if data["mpy_version"] == "unknown" else
-                data["mpy_version"]
-            )
-        ])
-        
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("Implementation"),
+                self.tr("{0} V. {1}").format(
+                    mpyName,
+                    self.tr("unknown")
+                    if data["mpy_version"] == "unknown"
+                    else data["mpy_version"],
+                ),
+            ],
+        )
+
         header = self.__createHeader(self.tr("System"))
-        QTreeWidgetItem(header, [
-            self.tr("System Name"),
-            data["sysname"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Node Name"),
-            data["nodename"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Release"),
-            data["release"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Version"),
-            data["version"]
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("Machine"),
-            data["machine"]
-        ])
-        
+        QTreeWidgetItem(header, [self.tr("System Name"), data["sysname"]])
+        QTreeWidgetItem(header, [self.tr("Node Name"), data["nodename"]])
+        QTreeWidgetItem(header, [self.tr("Release"), data["release"]])
+        QTreeWidgetItem(header, [self.tr("Version"), data["version"]])
+        QTreeWidgetItem(header, [self.tr("Machine"), data["machine"]])
+
         header = self.__createHeader(self.tr("Memory"))
-        QTreeWidgetItem(header, [
-            self.tr("total"),
-            self.tr("{0} KBytes").format(
-                loc.toString(data["mem_total_kb"], "f", 2))
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("used"),
-            self.tr("{0} KBytes ({1}%)").format(
-                loc.toString(data["mem_used_kb"], "f", 2),
-                loc.toString(data["mem_used_pc"], "f", 2))
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("free"),
-            self.tr("{0} KBytes ({1}%)").format(
-                loc.toString(data["mem_free_kb"], "f", 2),
-                loc.toString(data["mem_free_pc"], "f", 2))
-        ])
-        
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("total"),
+                self.tr("{0} KBytes").format(
+                    loc.toString(data["mem_total_kb"], "f", 2)
+                ),
+            ],
+        )
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("used"),
+                self.tr("{0} KBytes ({1}%)").format(
+                    loc.toString(data["mem_used_kb"], "f", 2),
+                    loc.toString(data["mem_used_pc"], "f", 2),
+                ),
+            ],
+        )
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("free"),
+                self.tr("{0} KBytes ({1}%)").format(
+                    loc.toString(data["mem_free_kb"], "f", 2),
+                    loc.toString(data["mem_free_pc"], "f", 2),
+                ),
+            ],
+        )
+
         header = self.__createHeader(self.tr("Flash Memory"))
-        QTreeWidgetItem(header, [
-            self.tr("total"),
-            self.tr("{0} KBytes").format(
-                loc.toString(data["flash_total_kb"], "f", 0))
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("used"),
-            self.tr("{0} KBytes ({1}%)").format(
-                loc.toString(data["flash_used_kb"], "f", 0),
-                loc.toString(data["flash_used_pc"], "f", 2))
-        ])
-        QTreeWidgetItem(header, [
-            self.tr("free"),
-            self.tr("{0} KBytes ({1}%)").format(
-                loc.toString(data["flash_free_kb"], "f", 0),
-                loc.toString(data["flash_free_pc"], "f", 2))
-        ])
-        
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("total"),
+                self.tr("{0} KBytes").format(
+                    loc.toString(data["flash_total_kb"], "f", 0)
+                ),
+            ],
+        )
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("used"),
+                self.tr("{0} KBytes ({1}%)").format(
+                    loc.toString(data["flash_used_kb"], "f", 0),
+                    loc.toString(data["flash_used_pc"], "f", 2),
+                ),
+            ],
+        )
+        QTreeWidgetItem(
+            header,
+            [
+                self.tr("free"),
+                self.tr("{0} KBytes ({1}%)").format(
+                    loc.toString(data["flash_free_kb"], "f", 0),
+                    loc.toString(data["flash_free_pc"], "f", 2),
+                ),
+            ],
+        )
+
         header = self.__createHeader(self.tr("µLab"))
         if data["ulab"] is not None:
-            QTreeWidgetItem(header, [
-                self.tr("Version"),
-                data["ulab"]
-            ])
+            QTreeWidgetItem(header, [self.tr("Version"), data["ulab"]])
         else:
-            itm = QTreeWidgetItem(header, [
-                self.tr("µLab is not available")
-            ])
+            itm = QTreeWidgetItem(header, [self.tr("µLab is not available")])
             itm.setFirstColumnSpanned(True)
-        
+
         for col in range(self.dataTree.columnCount()):
             self.dataTree.resizeColumnToContents(col)
-    
+
     def __createHeader(self, headerText):
         """
         Private method to create a header item.
-        
+
         @param headerText text for the header item
         @type str
         @return reference to the created header item
@@ -166,10 +171,10 @@
         headerItem = QTreeWidgetItem(self.dataTree, [headerText])
         headerItem.setExpanded(True)
         headerItem.setFirstColumnSpanned(True)
-        
+
         font = headerItem.font(0)
         font.setBold(True)
-        
+
         headerItem.setFont(0, font)
-        
+
         return headerItem
--- a/src/eric7/MicroPython/CircuitPythonDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/CircuitPythonDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,12 +25,13 @@
     """
     Class implementing the device for CircuitPython boards.
     """
+
     DeviceVolumeName = "CIRCUITPY"
-    
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -38,120 +39,120 @@
         @param parent reference to the parent object
         @type QObject
         """
-        super().__init__(
-            microPythonWidget, deviceType, parent)
-        
+        super().__init__(microPythonWidget, deviceType, parent)
+
         self.__workspace = self.__findWorkspace()
-        
+
         self.__nonUF2devices = {
             "teensy": self.__flashTeensy,
         }
-    
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-        
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
         if self.__deviceVolumeMounted():
             self.microPython.setActionButtons(open=True, save=True)
-    
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return False
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.tr("CircuitPython")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def supportsLocalFileAccess(self):
         """
         Public method to indicate file access via a local directory.
-        
+
         @return flag indicating file access via local directory
         @rtype bool
         """
         return self.__deviceVolumeMounted()
-    
+
     def __deviceVolumeMounted(self):
         """
         Private method to check, if the device volume is mounted.
-        
+
         @return flag indicated a mounted device
         @rtype bool
         """
         if self.__workspace and not os.path.exists(self.__workspace):
-            self.__workspace = ""       # reset
-        
+            self.__workspace = ""  # reset
+
         return self.DeviceVolumeName in self.getWorkspace(silent=True)
-    
+
     def getWorkspace(self, silent=False):
         """
         Public method to get the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -163,11 +164,11 @@
         else:
             self.__workspace = self.__findWorkspace(silent=silent)
             return self.__workspace
-    
+
     def __findWorkspace(self, silent=False):
         """
         Private method to find the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -175,9 +176,8 @@
         """
         # Attempts to find the paths on the filesystem that represents the
         # plugged in CIRCUITPY boards.
-        deviceDirectories = Utilities.findVolume(self.DeviceVolumeName,
-                                                 findAll=True)
-        
+        deviceDirectories = Utilities.findVolume(self.DeviceVolumeName, findAll=True)
+
         if deviceDirectories:
             if len(deviceDirectories) == 1:
                 return deviceDirectories[0]
@@ -190,41 +190,44 @@
                 EricMessageBox.warning(
                     self.microPython,
                     self.tr("Workspace Directory"),
-                    self.tr("Python files for CircuitPython can be edited in"
-                            " place, if the device volume is locally"
-                            " available. Such a volume was not found. In"
-                            " place editing will not be available."
-                            )
+                    self.tr(
+                        "Python files for CircuitPython can be edited in"
+                        " place, if the device volume is locally"
+                        " available. Such a volume was not found. In"
+                        " place editing will not be available."
+                    ),
                 )
-            
+
             return super().getWorkspace()
-    
+
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         connected = self.microPython.isConnected()
-        
-        act = menu.addAction(self.tr("Flash CircuitPython Firmware"),
-                             self.__flashCircuitPython)
+
+        act = menu.addAction(
+            self.tr("Flash CircuitPython Firmware"), self.__flashCircuitPython
+        )
         act.setEnabled(not connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Install Library Files"),
-                             self.__installLibraryFiles)
+        act = menu.addAction(
+            self.tr("Install Library Files"), self.__installLibraryFiles
+        )
         act.setEnabled(self.__deviceVolumeMounted())
-    
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return True
-    
+
     @pyqtSlot()
     def __flashCircuitPython(self):
         """
@@ -238,9 +241,10 @@
                     break
             else:
                 from .UF2FlashDialog import UF2FlashDialog
+
                 dlg = UF2FlashDialog(boardType="circuitpython")
                 dlg.exec()
-    
+
     def __flashTeensy(self):
         """
         Private method to show a message box because Teens does not support
@@ -249,14 +253,16 @@
         EricMessageBox.information(
             self.microPython,
             self.tr("Flash CircuitPython Firmware"),
-            self.tr("""<p>Teensy 4.0 and Teensy 4.1 do not support the UF2"""
-                    """ bootloader. Please use the 'Teensy Loader'"""
-                    """ application to flash CircuitPython. Make sure you"""
-                    """ downloaded the CircuitPython .hex file.</p>"""
-                    """<p>See <a href="{0}">the PJRC Teensy web site</a>"""
-                    """ for details.</p>""")
-            .format("https://www.pjrc.com/teensy/loader.html"))
-    
+            self.tr(
+                """<p>Teensy 4.0 and Teensy 4.1 do not support the UF2"""
+                """ bootloader. Please use the 'Teensy Loader'"""
+                """ application to flash CircuitPython. Make sure you"""
+                """ downloaded the CircuitPython .hex file.</p>"""
+                """<p>See <a href="{0}">the PJRC Teensy web site</a>"""
+                """ for details.</p>"""
+            ).format("https://www.pjrc.com/teensy/loader.html"),
+        )
+
     @pyqtSlot()
     def __installLibraryFiles(self):
         """
@@ -266,47 +272,57 @@
             EricMessageBox.critical(
                 self.microPython,
                 self.tr("Install Library Files"),
-                self.tr("""The device volume "<b>{0}</b>" is not available."""
-                        """ Ensure it is mounted properly and try again."""))
+                self.tr(
+                    """The device volume "<b>{0}</b>" is not available."""
+                    """ Ensure it is mounted properly and try again."""
+                ),
+            )
             return
-        
+
         target = os.path.join(self.getWorkspace(), "lib")
         # ensure that the library directory exists on the device
         if not os.path.isdir(target):
             os.makedirs(target)
-        
+
         libraryFiles = EricFileDialog.getOpenFileNames(
             self.microPython,
             self.tr("Install Library Files"),
             os.path.expanduser("~"),
-            self.tr("Compiled Python Files (*.mpy);;"
-                    "Python Files (*.py);;"
-                    "All Files (*)"))
-        
+            self.tr(
+                "Compiled Python Files (*.mpy);;"
+                "Python Files (*.py);;"
+                "All Files (*)"
+            ),
+        )
+
         for libraryFile in libraryFiles:
             if os.path.exists(libraryFile):
                 shutil.copy2(libraryFile, target)
-    
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
         return Preferences.getMicroPython("CircuitPythonDocuUrl")
-    
+
     def getDownloadMenuEntries(self):
         """
         Public method to retrieve the entries for the downloads menu.
-        
+
         @return list of tuples with menu text and URL to be opened for each
             entry
         @rtype list of tuple of (str, str)
         """
         return [
-            (self.tr("CircuitPython Firmware"),
-             Preferences.getMicroPython("CircuitPythonFirmwareUrl")),
-            (self.tr("CircuitPython Libraries"),
-             Preferences.getMicroPython("CircuitPythonLibrariesUrl"))
+            (
+                self.tr("CircuitPython Firmware"),
+                Preferences.getMicroPython("CircuitPythonFirmwareUrl"),
+            ),
+            (
+                self.tr("CircuitPython Libraries"),
+                Preferences.getMicroPython("CircuitPythonLibrariesUrl"),
+            ),
         ]
--- a/src/eric7/MicroPython/ConnectionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/ConnectionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,13 +21,14 @@
     Class implementing a dialog to select the port to connect to and the type
     of the attached device.
     """
+
     PortNameRole = Qt.ItemDataRole.UserRole
     VidPidRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, ports, currentPort, currentType, parent=None):
         """
         Constructor
-        
+
         @param ports list of detected ports
         @type list of str
         @param currentPort port most recently selected
@@ -39,75 +40,73 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for index, (vid, pid, description, portName) in enumerate(
             sorted(ports, key=lambda x: x[3])
         ):
             self.portNameComboBox.addItem(
-                self.tr("{0} - {1}", "description - port name")
-                .format(description, portName))
-            self.portNameComboBox.setItemData(
-                index, portName, self.PortNameRole)
-            self.portNameComboBox.setItemData(
-                index, (vid, pid), self.VidPidRole)
-        
+                self.tr("{0} - {1}", "description - port name").format(
+                    description, portName
+                )
+            )
+            self.portNameComboBox.setItemData(index, portName, self.PortNameRole)
+            self.portNameComboBox.setItemData(index, (vid, pid), self.VidPidRole)
+
         self.deviceTypeComboBox.addItem("", "")
         for board, description in sorted(
-            MicroPythonDevices.getSupportedDevices(),
-            key=lambda x: x[1]
+            MicroPythonDevices.getSupportedDevices(), key=lambda x: x[1]
         ):
             self.deviceTypeComboBox.addItem(description, board)
-        
+
         if self.portNameComboBox.currentText():
             # some ports were found; use the previously selected type as
             # default
-            portIndex = self.portNameComboBox.findData(
-                currentPort, self.PortNameRole)
+            portIndex = self.portNameComboBox.findData(currentPort, self.PortNameRole)
             typeIndex = self.deviceTypeComboBox.findData(currentType)
         else:
             portIndex = 0
             typeIndex = 0
         self.portNameComboBox.setCurrentIndex(portIndex)
         self.deviceTypeComboBox.setCurrentIndex(typeIndex)
-        
+
         self.__updateOK()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method to update the status of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.portNameComboBox.currentData(self.PortNameRole)) and
-            bool(self.deviceTypeComboBox.currentData())
+            bool(self.portNameComboBox.currentData(self.PortNameRole))
+            and bool(self.deviceTypeComboBox.currentData())
         )
-    
+
     @pyqtSlot(str)
     def on_portNameComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle the selection of a port name.
-        
+
         @param txt selected port
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_deviceTypeComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle the selection of a device type.
-        
+
         @param txt selected device description
         @type str
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the VID, PID and name of the selected port
             and the selected device type
         @rtype tuple of (int, int, str, str)
--- a/src/eric7/MicroPython/EspBackupRestoreFirmwareDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/EspBackupRestoreFirmwareDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,17 +15,15 @@
 
 from EricWidgets.EricPathPicker import EricPathPickerModes
 
-from .Ui_EspBackupRestoreFirmwareDialog import (
-    Ui_EspBackupRestoreFirmwareDialog
-)
+from .Ui_EspBackupRestoreFirmwareDialog import Ui_EspBackupRestoreFirmwareDialog
 
 
-class EspBackupRestoreFirmwareDialog(QDialog,
-                                     Ui_EspBackupRestoreFirmwareDialog):
+class EspBackupRestoreFirmwareDialog(QDialog, Ui_EspBackupRestoreFirmwareDialog):
     """
     Class implementing a dialog to select the ESP chip type and the backup and
     restore parameters.
     """
+
     Chips = (
         ("", ""),
         ("ESP32", "esp32"),
@@ -34,7 +32,7 @@
         ("ESP32-S3", "esp32s3"),
         ("ESP8266", "esp8266"),
     )
-    
+
     FlashModes = [
         ("", ""),
         ("Quad I/O", "qio"),
@@ -42,7 +40,7 @@
         ("Dual I/O", "dio"),
         ("Dual Output", "dout"),
     ]
-    
+
     FlashSizes = {
         "esp32": [
             (" 1 MB", "0x100000"),
@@ -82,11 +80,11 @@
             ("16 MB", "0x1000000"),
         ],
     }
-    
+
     def __init__(self, backupMode=True, parent=None):
         """
         Constructor
-        
+
         @param backupMode flag indicating parameters for a firmware backup are
             requested
         @type bool
@@ -95,21 +93,22 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__isBackupMode = backupMode
-        
+
         for text, chip in self.Chips:
             self.espComboBox.addItem(text, chip)
-        
-        self.baudRateComboBox.addItems([
-            "74.880", "115.200", "230.400", "460.800", "921.600", "1.500.000"])
+
+        self.baudRateComboBox.addItems(
+            ["74.880", "115.200", "230.400", "460.800", "921.600", "1.500.000"]
+        )
         self.baudRateComboBox.setCurrentIndex(3)
-        
-        self.firmwarePicker.setFilters(
-            self.tr("Firmware Files (*.img);;All Files (*)"))
+
+        self.firmwarePicker.setFilters(self.tr("Firmware Files (*.img);;All Files (*)"))
         if self.__isBackupMode:
             self.firmwarePicker.setMode(
-                EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE)
+                EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE
+            )
             self.sizeInfoLabel.clear()
             self.modeComboBox.setEnabled(False)
             self.modeInfoLabel.setEnabled(False)
@@ -119,29 +118,27 @@
             for text, mode in self.FlashModes:
                 self.modeComboBox.addItem(text, mode)
             self.setWindowTitle(self.tr("Restore Firmware"))
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOkButton(self):
         """
         Private method to update the state of the OK button.
         """
         firmwareFile = self.firmwarePicker.text()
-        enable = (bool(self.espComboBox.currentText()) and
-                  bool(firmwareFile))
+        enable = bool(self.espComboBox.currentText()) and bool(firmwareFile)
         if self.__isBackupMode:
             enable &= bool(self.sizeComboBox.currentText())
         else:
             enable &= os.path.exists(firmwareFile)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_espComboBox_currentTextChanged(self, chip):
         """
         Private slot to handle the selection of a chip type.
-        
+
         @param chip selected chip type
         @type str
         """
@@ -152,35 +149,35 @@
             self.sizeComboBox.addItem("")
             for text, data in self.FlashSizes[chipType]:
                 self.sizeComboBox.addItem(text, data)
-            
+
             self.sizeComboBox.setCurrentText(selectedSize)
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_sizeComboBox_currentTextChanged(self, size):
         """
         Private slot handling a change of the selected firmware size.
-        
+
         @param size selected size text
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_firmwarePicker_textChanged(self, firmware):
         """
         Private slot handling a change of the firmware path.
-        
+
         @param firmware path to the firmware
         @type str
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the selected chip type, the firmware size,
             the baud rate or flashing, the flash mode and the path of the
             firmware file
@@ -188,10 +185,10 @@
         """
         flashSize = (
             self.sizeComboBox.currentData()
-            if self.__isBackupMode else
-            self.sizeComboBox.currentText().replace(" ", "")
+            if self.__isBackupMode
+            else self.sizeComboBox.currentText().replace(" ", "")
         )
-        
+
         return (
             self.espComboBox.currentData(),
             flashSize,
--- a/src/eric7/MicroPython/EspDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/EspDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class implementing the device for ESP32 and ESP8266 based boards.
     """
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -38,134 +39,129 @@
         @type QObject
         """
         super().__init__(microPythonWidget, deviceType, parent)
-    
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-    
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return True
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.tr("ESP8266, ESP32")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         connected = self.microPython.isConnected()
-        
-        act = menu.addAction(self.tr("Erase Flash"),
-                             self.__eraseFlash)
+
+        act = menu.addAction(self.tr("Erase Flash"), self.__eraseFlash)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Flash MicroPython Firmware"),
-                             self.__flashMicroPython)
+        act = menu.addAction(
+            self.tr("Flash MicroPython Firmware"), self.__flashMicroPython
+        )
         act.setEnabled(not connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Flash Additional Firmware"),
-                             self.__flashAddons)
+        act = menu.addAction(self.tr("Flash Additional Firmware"), self.__flashAddons)
         act.setEnabled(not connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Backup Firmware"),
-                             self.__backupFlash)
+        act = menu.addAction(self.tr("Backup Firmware"), self.__backupFlash)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Restore Firmware"),
-                             self.__restoreFlash)
+        act = menu.addAction(self.tr("Restore Firmware"), self.__restoreFlash)
         act.setEnabled(not connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Show Chip ID"),
-                             self.__showChipID)
+        act = menu.addAction(self.tr("Show Chip ID"), self.__showChipID)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Show Flash ID"),
-                             self.__showFlashID)
+        act = menu.addAction(self.tr("Show Flash ID"), self.__showFlashID)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Show MAC Address"),
-                             self.__showMACAddress)
+        act = menu.addAction(self.tr("Show MAC Address"), self.__showMACAddress)
         act.setEnabled(not connected)
         menu.addSeparator()
         act = menu.addAction(self.tr("Reset Device"), self.__resetDevice)
         menu.addSeparator()
         menu.addAction(self.tr("Install 'esptool.py'"), self.__installEspTool)
-    
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return True
-    
+
     @pyqtSlot()
     def __eraseFlash(self):
         """
@@ -174,158 +170,187 @@
         ok = EricMessageBox.yesNo(
             self.microPython,
             self.tr("Erase Flash"),
-            self.tr("""Shall the flash of the selected device really be"""
-                    """ erased?"""))
+            self.tr(
+                """Shall the flash of the selected device really be""" """ erased?"""
+            ),
+        )
         if ok:
             flashArgs = [
                 "-u",
-                "-m", "esptool",
-                "--port", self.microPython.getCurrentPort(),
+                "-m",
+                "esptool",
+                "--port",
+                self.microPython.getCurrentPort(),
                 "erase_flash",
             ]
-            dlg = EricProcessDialog(self.tr("'esptool erase_flash' Output"),
-                                    self.tr("Erase Flash"),
-                                    showProgress=True)
+            dlg = EricProcessDialog(
+                self.tr("'esptool erase_flash' Output"),
+                self.tr("Erase Flash"),
+                showProgress=True,
+            )
             res = dlg.startProcess(Globals.getPythonExecutable(), flashArgs)
             if res:
                 dlg.exec()
-    
+
     @pyqtSlot()
     def __flashMicroPython(self):
         """
         Private slot to flash a MicroPython firmware to the device.
         """
         from .EspFirmwareSelectionDialog import EspFirmwareSelectionDialog
+
         dlg = EspFirmwareSelectionDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             chip, firmware, baudRate, flashMode, flashAddress = dlg.getData()
             flashArgs = [
                 "-u",
-                "-m", "esptool",
-                "--chip", chip,
-                "--port", self.microPython.getCurrentPort(),
+                "-m",
+                "esptool",
+                "--chip",
+                chip,
+                "--port",
+                self.microPython.getCurrentPort(),
             ]
             if baudRate != "115200":
-                flashArgs += [
-                    "--baud", baudRate
-                ]
+                flashArgs += ["--baud", baudRate]
             flashArgs.append("write_flash")
             if flashMode:
-                flashArgs += [
-                    "--flash_mode", flashMode
-                ]
+                flashArgs += ["--flash_mode", flashMode]
             flashArgs += [
                 flashAddress,
                 firmware,
             ]
-            dlg = EricProcessDialog(self.tr("'esptool write_flash' Output"),
-                                    self.tr("Flash MicroPython Firmware"),
-                                    showProgress=True)
+            dlg = EricProcessDialog(
+                self.tr("'esptool write_flash' Output"),
+                self.tr("Flash MicroPython Firmware"),
+                showProgress=True,
+            )
             res = dlg.startProcess(Globals.getPythonExecutable(), flashArgs)
             if res:
                 dlg.exec()
-    
+
     @pyqtSlot()
     def __flashAddons(self):
         """
         Private slot to flash some additional firmware images.
         """
         from .EspFirmwareSelectionDialog import EspFirmwareSelectionDialog
+
         dlg = EspFirmwareSelectionDialog(addon=True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             chip, firmware, baudRate, flashMode, flashAddress = dlg.getData()
             flashArgs = [
                 "-u",
-                "-m", "esptool",
-                "--chip", chip,
-                "--port", self.microPython.getCurrentPort(),
+                "-m",
+                "esptool",
+                "--chip",
+                chip,
+                "--port",
+                self.microPython.getCurrentPort(),
             ]
             if baudRate != "115200":
-                flashArgs += [
-                    "--baud", baudRate
-                ]
+                flashArgs += ["--baud", baudRate]
             flashArgs.append("write_flash")
             if flashMode:
-                flashArgs += [
-                    "--flash_mode", flashMode
-                ]
+                flashArgs += ["--flash_mode", flashMode]
             flashArgs += [
                 flashAddress.lower(),
                 firmware,
             ]
-            dlg = EricProcessDialog(self.tr("'esptool write_flash' Output"),
-                                    self.tr("Flash Additional Firmware"),
-                                    showProgress=True)
+            dlg = EricProcessDialog(
+                self.tr("'esptool write_flash' Output"),
+                self.tr("Flash Additional Firmware"),
+                showProgress=True,
+            )
             res = dlg.startProcess(Globals.getPythonExecutable(), flashArgs)
             if res:
                 dlg.exec()
-    
+
     @pyqtSlot()
     def __backupFlash(self):
         """
         Private slot to backup the currently flashed firmware.
         """
-        from .EspBackupRestoreFirmwareDialog import (
-            EspBackupRestoreFirmwareDialog
-        )
+        from .EspBackupRestoreFirmwareDialog import EspBackupRestoreFirmwareDialog
+
         dlg = EspBackupRestoreFirmwareDialog(backupMode=True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             chip, flashSize, baudRate, flashMode, firmware = dlg.getData()
             flashArgs = [
                 "-u",
-                "-m", "esptool",
-                "--chip", chip,
-                "--port", self.microPython.getCurrentPort(),
-                "--baud", baudRate,
+                "-m",
+                "esptool",
+                "--chip",
+                chip,
+                "--port",
+                self.microPython.getCurrentPort(),
+                "--baud",
+                baudRate,
                 "read_flash",
-                "0x0", flashSize,
+                "0x0",
+                flashSize,
                 firmware,
             ]
-            dlg = EricProcessDialog(self.tr("'esptool read_flash' Output"),
-                                    self.tr("Backup Firmware"),
-                                    showProgress=True)
+            dlg = EricProcessDialog(
+                self.tr("'esptool read_flash' Output"),
+                self.tr("Backup Firmware"),
+                showProgress=True,
+            )
             res = dlg.startProcess(Globals.getPythonExecutable(), flashArgs)
             if res:
                 dlg.exec()
-    
+
     @pyqtSlot()
     def __restoreFlash(self):
         """
         Private slot to restore a previously saved firmware.
         """
-        from .EspBackupRestoreFirmwareDialog import (
-            EspBackupRestoreFirmwareDialog
-        )
+        from .EspBackupRestoreFirmwareDialog import EspBackupRestoreFirmwareDialog
+
         dlg = EspBackupRestoreFirmwareDialog(backupMode=False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             chip, flashSize, baudRate, flashMode, firmware = dlg.getData()
             flashArgs = [
                 "-u",
-                "-m", "esptool",
-                "--chip", chip,
-                "--port", self.microPython.getCurrentPort(),
-                "--baud", baudRate,
+                "-m",
+                "esptool",
+                "--chip",
+                chip,
+                "--port",
+                self.microPython.getCurrentPort(),
+                "--baud",
+                baudRate,
                 "write_flash",
             ]
             if flashMode:
-                flashArgs.extend([
-                    "--flash_mode", flashMode,
-                ])
+                flashArgs.extend(
+                    [
+                        "--flash_mode",
+                        flashMode,
+                    ]
+                )
             if bool(flashSize):
-                flashArgs.extend([
-                    "--flash_size", flashSize,
-                ])
-            flashArgs.extend([
-                "0x0",
-                firmware,
-            ])
-            dlg = EricProcessDialog(self.tr("'esptool write_flash' Output"),
-                                    self.tr("Restore Firmware"),
-                                    showProgress=True)
+                flashArgs.extend(
+                    [
+                        "--flash_size",
+                        flashSize,
+                    ]
+                )
+            flashArgs.extend(
+                [
+                    "0x0",
+                    firmware,
+                ]
+            )
+            dlg = EricProcessDialog(
+                self.tr("'esptool write_flash' Output"),
+                self.tr("Restore Firmware"),
+                showProgress=True,
+            )
             res = dlg.startProcess(Globals.getPythonExecutable(), flashArgs)
             if res:
                 dlg.exec()
-    
+
     @pyqtSlot()
     def __showChipID(self):
         """
@@ -333,16 +358,19 @@
         """
         args = [
             "-u",
-            "-m", "esptool",
-            "--port", self.microPython.getCurrentPort(),
-            "chip_id"
+            "-m",
+            "esptool",
+            "--port",
+            self.microPython.getCurrentPort(),
+            "chip_id",
         ]
-        dlg = EricProcessDialog(self.tr("'esptool chip_id' Output"),
-                                self.tr("Show Chip ID"))
+        dlg = EricProcessDialog(
+            self.tr("'esptool chip_id' Output"), self.tr("Show Chip ID")
+        )
         res = dlg.startProcess(Globals.getPythonExecutable(), args)
         if res:
             dlg.exec()
-    
+
     @pyqtSlot()
     def __showFlashID(self):
         """
@@ -350,16 +378,19 @@
         """
         args = [
             "-u",
-            "-m", "esptool",
-            "--port", self.microPython.getCurrentPort(),
-            "flash_id"
+            "-m",
+            "esptool",
+            "--port",
+            self.microPython.getCurrentPort(),
+            "flash_id",
         ]
-        dlg = EricProcessDialog(self.tr("'esptool flash_id' Output"),
-                                self.tr("Show Flash ID"))
+        dlg = EricProcessDialog(
+            self.tr("'esptool flash_id' Output"), self.tr("Show Flash ID")
+        )
         res = dlg.startProcess(Globals.getPythonExecutable(), args)
         if res:
             dlg.exec()
-    
+
     @pyqtSlot()
     def __showMACAddress(self):
         """
@@ -367,63 +398,69 @@
         """
         args = [
             "-u",
-            "-m", "esptool",
-            "--port", self.microPython.getCurrentPort(),
-            "read_mac"
+            "-m",
+            "esptool",
+            "--port",
+            self.microPython.getCurrentPort(),
+            "read_mac",
         ]
-        dlg = EricProcessDialog(self.tr("'esptool read_mac' Output"),
-                                self.tr("Show MAC Address"))
+        dlg = EricProcessDialog(
+            self.tr("'esptool read_mac' Output"), self.tr("Show MAC Address")
+        )
         res = dlg.startProcess(Globals.getPythonExecutable(), args)
         if res:
             dlg.exec()
-    
+
     @pyqtSlot()
     def __resetDevice(self):
         """
         Private slot to reset the connected device.
         """
         if self.microPython.isConnected():
-            self.microPython.commandsInterface().execute([
-                "import machine",
-                "machine.reset()",
-            ])
+            self.microPython.commandsInterface().execute(
+                [
+                    "import machine",
+                    "machine.reset()",
+                ]
+            )
         else:
             # perform a reset via esptool using flash_id command ignoring
             # the output
             args = [
                 "-u",
-                "-m", "esptool",
-                "--port", self.microPython.getCurrentPort(),
-                "flash_id"
+                "-m",
+                "esptool",
+                "--port",
+                self.microPython.getCurrentPort(),
+                "flash_id",
             ]
             proc = QProcess()
             proc.start(Globals.getPythonExecutable(), args)
             procStarted = proc.waitForStarted(10000)
             if procStarted:
                 proc.waitForFinished(10000)
-    
+
     @pyqtSlot()
     def __installEspTool(self):
         """
         Private slot to install the esptool package via pip.
         """
         pip = ericApp().getObject("Pip")
-        pip.installPackages(["esptool"],
-                            interpreter=Globals.getPythonExecutable())
-    
+        pip.installPackages(["esptool"], interpreter=Globals.getPythonExecutable())
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
         return Preferences.getMicroPython("MicroPythonDocuUrl")
-    
+
     def getFirmwareUrl(self):
         """
         Public method to get the device firmware download URL.
-        
+
         @return firmware download URL of the device
         @rtype str
         """
--- a/src/eric7/MicroPython/EspFirmwareSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/EspFirmwareSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,6 +24,7 @@
     Class implementing a dialog to select the ESP chip type and the firmware to
     be flashed.
     """
+
     Chips = (
         ("", ""),
         ("ESP32", "esp32"),
@@ -32,7 +33,7 @@
         ("ESP32-S3", "esp32s3"),
         ("ESP8266", "esp8266"),
     )
-    
+
     FlashModes = (
         ("", ""),
         ("Quad I/O", "qio"),
@@ -40,7 +41,7 @@
         ("Dual I/O", "dio"),
         ("Dual Output", "dout"),
     )
-    
+
     FlashAddresses = {
         "esp8266": "0x0000",
         "esp32": "0x1000",
@@ -48,11 +49,11 @@
         "esp32s2": "0x1000",
         "esp32s3": "0x0000",
     }
-    
+
     def __init__(self, addon=False, parent=None):
         """
         Constructor
-        
+
         @param addon flag indicating an addon firmware
         @type bool
         @param parent reference to the parent widget
@@ -60,23 +61,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__addon = addon
-        
+
         self.firmwarePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.firmwarePicker.setFilters(
-            self.tr("Firmware Files (*.bin);;All Files (*)"))
-        
+        self.firmwarePicker.setFilters(self.tr("Firmware Files (*.bin);;All Files (*)"))
+
         for text, chip in self.Chips:
             self.espComboBox.addItem(text, chip)
-        
-        self.baudRateComboBox.addItems([
-            "74.880", "115.200", "230.400", "460.800", "921.600", "1.500.000"])
+
+        self.baudRateComboBox.addItems(
+            ["74.880", "115.200", "230.400", "460.800", "921.600", "1.500.000"]
+        )
         self.baudRateComboBox.setCurrentIndex(3)
-        
+
         for text, mode in self.FlashModes:
             self.modeComboBox.addItem(text, mode)
-        
+
         if addon:
             self.__validator = QRegularExpressionValidator(
                 QRegularExpression(r"[0-9a-fA-F]{0,7}")
@@ -85,67 +86,66 @@
         else:
             self.addressLabel.hide()
             self.addressEdit.hide()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOkButton(self):
         """
         Private method to update the state of the OK button.
         """
         firmwareFile = self.firmwarePicker.text()
-        enable = (bool(self.espComboBox.currentText()) and
-                  bool(firmwareFile) and os.path.exists(firmwareFile))
+        enable = (
+            bool(self.espComboBox.currentText())
+            and bool(firmwareFile)
+            and os.path.exists(firmwareFile)
+        )
         if self.__addon:
             enable &= bool(self.addressEdit.text())
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_espComboBox_currentTextChanged(self, chip):
         """
         Private slot to handle the selection of a chip type.
-        
+
         @param chip selected chip type
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_firmwarePicker_textChanged(self, firmware):
         """
         Private slot handling a change of the firmware path.
-        
+
         @param firmware path to the firmware
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_addressEdit_textChanged(self, address):
         """
         Private slot handling a change of the address.
-        
+
         @param address entered address
         @type str
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the selected chip type, the path of the
             firmware file, the baud rate, the flash mode and the flash
             address
         @rtype tuple of (str, str, str, str, str)
         """
         chip = self.espComboBox.currentData()
-        address = (
-            self.addressEdit.text()
-            if self.__addon else
-            self.FlashAddresses[chip])
-        
+        address = self.addressEdit.text() if self.__addon else self.FlashAddresses[chip]
+
         return (
             chip,
             self.firmwarePicker.text(),
--- a/src/eric7/MicroPython/GenericMicroPythonDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/GenericMicroPythonDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     """
     Class implementing the device interface for generic MicroPython boards.
     """
+
     def __init__(self, microPythonWidget, deviceType, vid, pid, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -38,124 +39,120 @@
         @param parent reference to the parent object
         @type QObject
         """
-        super().__init__(
-            microPythonWidget, deviceType, parent)
-        
+        super().__init__(microPythonWidget, deviceType, parent)
+
         self.__directAccess = False
         self.__deviceVolumeName = ""
         self.__workspace = ""
         self.__deviceName = ""
-        
+
         for deviceData in Preferences.getMicroPython("ManualDevices"):
-            if (
-                deviceData["vid"] == vid and
-                deviceData["pid"] == pid
-            ):
+            if deviceData["vid"] == vid and deviceData["pid"] == pid:
                 self.__deviceVolumeName = deviceData["data_volume"]
                 self.__directAccess = bool(deviceData["data_volume"])
                 self.__deviceName = deviceData["description"]
-                
+
                 if self.__directAccess:
                     self.__workspace = self.__findWorkspace()
-    
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-        
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
         if self.__directAccess and self.__deviceVolumeMounted():
             self.microPython.setActionButtons(open=True, save=True)
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.__deviceName
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def supportsLocalFileAccess(self):
         """
         Public method to indicate file access via a local directory.
-        
+
         @return flag indicating file access via local directory
         @rtype bool
         """
         return self.__deviceVolumeMounted()
-    
+
     def __deviceVolumeMounted(self):
         """
         Private method to check, if the device volume is mounted.
-        
+
         @return flag indicated a mounted device
         @rtype bool
         """
         if self.__workspace and not os.path.exists(self.__workspace):
-            self.__workspace = ""       # reset
-        
-        return (
-            self.__directAccess and
-            self.__deviceVolumeName in self.getWorkspace(silent=True)
+            self.__workspace = ""  # reset
+
+        return self.__directAccess and self.__deviceVolumeName in self.getWorkspace(
+            silent=True
         )
-    
+
     def getWorkspace(self, silent=False):
         """
         Public method to get the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -170,11 +167,11 @@
                 return self.__workspace
         else:
             return super().getWorkspace()
-    
+
     def __findWorkspace(self, silent=False):
         """
         Private method to find the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -182,9 +179,8 @@
         """
         # Attempts to find the path on the filesystem that represents the
         # plugged in board.
-        deviceDirectories = Utilities.findVolume(self.__deviceVolumeName,
-                                                 findAll=True)
-        
+        deviceDirectories = Utilities.findVolume(self.__deviceVolumeName, findAll=True)
+
         if deviceDirectories:
             if len(deviceDirectories) == 1:
                 return deviceDirectories[0]
@@ -197,11 +193,12 @@
                 EricMessageBox.warning(
                     self.microPython,
                     self.tr("Workspace Directory"),
-                    self.tr("Python files for this generic board can be"
-                            " edited in place, if the device volume is locally"
-                            " available. A volume named '{0}' was not found."
-                            " In place editing will not be available."
-                            ).format(self.__deviceVolumeName)
+                    self.tr(
+                        "Python files for this generic board can be"
+                        " edited in place, if the device volume is locally"
+                        " available. A volume named '{0}' was not found."
+                        " In place editing will not be available."
+                    ).format(self.__deviceVolumeName),
                 )
-            
+
             return super().getWorkspace()
--- a/src/eric7/MicroPython/IgnoredDevicesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/IgnoredDevicesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to manage the list of ignored serial devices.
     """
+
     def __init__(self, deviceList, parent=None):
         """
         Constructor
-        
+
         @param deviceList list of ignored serial devices given by VID and PID
         @type list of tuple of (int, int)
         @param parent reference to the parent widget
@@ -27,19 +28,21 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.devicesEditWidget.setList([
-            "{0} ({1:04x}/{2:04x})".format(description, vid, pid)
-            for vid, pid, description in deviceList
-        ])
-        
+
+        self.devicesEditWidget.setList(
+            [
+                "{0} ({1:04x}/{2:04x})".format(description, vid, pid)
+                for vid, pid, description in deviceList
+            ]
+        )
+
         self.devicesEditWidget.setDefaultVisible(False)
         self.devicesEditWidget.setAddVisible(False)
-    
+
     def getDevices(self):
         """
         Public method to get the list of ignored serial devices.
-        
+
         @return list of tuples containing the VID, PID and a description
             of each ignored device
         @rtype list of tuple of (int, int, str)
@@ -50,5 +53,5 @@
             description, vid_pid = entry.rsplit(None, 1)
             vid, pid = vid_pid[1:-1].split("/", 1)
             deviceList.append((int(vid, 16), int(pid, 16), description))
-        
+
         return deviceList
--- a/src/eric7/MicroPython/MicroPythonCommandsInterface.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonCommandsInterface.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,13 @@
 import os
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, QObject, QThread, QTimer, QCoreApplication,
-    QEventLoop
+    pyqtSlot,
+    pyqtSignal,
+    QObject,
+    QThread,
+    QTimer,
+    QCoreApplication,
+    QEventLoop,
 )
 
 from .MicroPythonSerialPort import MicroPythonSerialPort
@@ -24,7 +29,7 @@
 class MicroPythonCommandsInterface(QObject):
     """
     Class implementing some file system commands for MicroPython.
-    
+
     Commands are provided to perform operations on the file system of a
     connected MicroPython device. Supported commands are:
     <ul>
@@ -39,7 +44,7 @@
     <li>mkdir: create a new directory</li>
     <li>rmdir: remove an empty directory</li>
     </ul>
-    
+
     There are additional commands related to time and version.
     <ul>
     <li>version: get version info about MicroPython</li>
@@ -47,33 +52,34 @@
     <li>syncTime: synchronize the time of the connected device</li>
     <li>showTime: show the current time of the connected device</li>
     </ul>
-    
+
     @signal executeAsyncFinished() emitted to indicate the end of an
         asynchronously executed list of commands (e.g. a script)
     @signal dataReceived(data) emitted to send data received via the serial
         connection for further processing
     """
+
     executeAsyncFinished = pyqtSignal()
     dataReceived = pyqtSignal(bytes)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__repl = parent
-        
+
         self.__blockReadyRead = False
-        
+
         self.__serial = MicroPythonSerialPort(
-            timeout=Preferences.getMicroPython("SerialTimeout"),
-            parent=self)
+            timeout=Preferences.getMicroPython("SerialTimeout"), parent=self
+        )
         self.__serial.readyRead.connect(self.__readSerial)
-    
+
     @pyqtSlot()
     def __readSerial(self):
         """
@@ -83,66 +89,66 @@
         if not self.__blockReadyRead:
             data = bytes(self.__serial.readAll())
             self.dataReceived.emit(data)
-    
+
     @pyqtSlot()
     def connectToDevice(self, port):
         """
         Public slot to start the manager.
-        
+
         @param port name of the port to be used
         @type str
         @return flag indicating success
         @rtype bool
         """
         return self.__serial.openSerialLink(port)
-    
+
     @pyqtSlot()
     def disconnectFromDevice(self):
         """
         Public slot to stop the thread.
         """
         self.__serial.closeSerialLink()
-    
+
     def isConnected(self):
         """
         Public method to get the connection status.
-        
+
         @return flag indicating the connection status
         @rtype bool
         """
         return self.__serial.isConnected()
-    
+
     @pyqtSlot()
     def handlePreferencesChanged(self):
         """
         Public slot to handle a change of the preferences.
         """
         self.__serial.setTimeout(Preferences.getMicroPython("SerialTimeout"))
-    
+
     def write(self, data):
         """
         Public method to write data to the connected device.
-        
+
         @param data data to be written
         @type bytes or bytearray
         """
         self.__serial.isConnected() and self.__serial.write(data)
-    
+
     def __rawOn(self):
         """
         Private method to switch the connected device to 'raw' mode.
-        
+
         Note: switching to raw mode is done with synchronous writes.
-        
+
         @return flag indicating success
         @@rtype bool
         """
         if not self.__serial:
             return False
-        
+
         rawReplMessage = b"raw REPL; CTRL-B to exit\r\n>"
-        
-        self.__serial.write(b"\x02")        # end raw mode if required
+
+        self.__serial.write(b"\x02")  # end raw mode if required
         written = self.__serial.waitForBytesWritten(500)
         # time out after 500ms if device is not responding
         if not written:
@@ -155,8 +161,8 @@
             if not written:
                 return False
             QThread.msleep(10)
-        self.__serial.readAll()             # read all data and discard it
-        self.__serial.write(b"\r\x01")      # send CTRL-A to enter raw mode
+        self.__serial.readAll()  # read all data and discard it
+        self.__serial.write(b"\r\x01")  # send CTRL-A to enter raw mode
         self.__serial.readUntil(rawReplMessage)
         if self.__serial.hasTimedOut():
             # it timed out; try it again and than fail
@@ -164,28 +170,29 @@
             self.__serial.readUntil(rawReplMessage)
             if self.__serial.hasTimedOut():
                 return False
-        
+
         QCoreApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        self.__serial.readAll()             # read all data and discard it
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
+        self.__serial.readAll()  # read all data and discard it
         return True
-    
+
     def __rawOff(self):
         """
         Private method to switch 'raw' mode off.
         """
         if self.__serial:
-            self.__serial.write(b"\x02")      # send CTRL-B to cancel raw mode
+            self.__serial.write(b"\x02")  # send CTRL-B to cancel raw mode
             self.__serial.readUntil(b">>> ")  # read until Python prompt
-            self.__serial.readAll()           # read all data and discard it
-    
+            self.__serial.readAll()  # read all data and discard it
+
     def execute(self, commands):
         """
         Public method to send commands to the connected device and return the
         result.
-        
+
         If no serial connection is available, empty results will be returned.
-        
+
         @param commands list of commands to be executed
         @type str
         @return tuple containing stdout and stderr output of the device
@@ -193,23 +200,20 @@
         """
         if not self.__serial:
             return b"", b""
-        
+
         if not self.__serial.isConnected():
             return b"", b"Device not connected or not switched on."
-        
+
         result = bytearray()
         err = b""
-        
+
         # switch on raw mode
         self.__blockReadyRead = True
         ok = self.__rawOn()
         if not ok:
             self.__blockReadyRead = False
-            return (
-                b"",
-                b"Could not switch to raw mode. Is the device switched on?"
-            )
-        
+            return (b"", b"Could not switch to raw mode. Is the device switched on?")
+
         # send commands
         QThread.msleep(10)
         for command in commands:
@@ -217,15 +221,17 @@
                 commandBytes = command.encode("utf-8")
                 self.__serial.write(commandBytes + b"\x04")
                 QCoreApplication.processEvents(
-                    QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                    QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+                )
                 ok = self.__serial.readUntil(b"OK")
                 if ok != b"OK":
                     return (
                         b"",
                         "Expected 'OK', got '{0}', followed by '{1}'".format(
-                            ok, self.__serial.readAll()).encode("utf-8")
+                            ok, self.__serial.readAll()
+                        ).encode("utf-8"),
                     )
-                
+
                 # read until prompt
                 response = self.__serial.readUntil(b"\x04>")
                 if self.__serial.hasTimedOut():
@@ -240,25 +246,26 @@
                 if err:
                     self.__blockReadyRead = False
                     return b"", err
-        
+
         # switch off raw mode
         QThread.msleep(10)
         self.__rawOff()
         self.__blockReadyRead = False
-        
+
         return bytes(result), err
-    
+
     def executeAsync(self, commandsList):
         """
         Public method to execute a series of commands over a period of time
         without returning any result (asynchronous execution).
-        
+
         @param commandsList list of commands to be execute on the device
         @type list of bytes
         """
+
         def remainingTask(commands):
             self.executeAsync(commands)
-        
+
         if commandsList:
             command = commandsList[0]
             self.__serial.write(command)
@@ -266,11 +273,11 @@
             QTimer.singleShot(2, lambda: remainingTask(remainder))
         else:
             self.executeAsyncFinished.emit()
-    
+
     def __shortError(self, error):
         """
         Private method to create a shortened error message.
-        
+
         @param error verbose error message
         @type bytes
         @return shortened error message
@@ -283,15 +290,15 @@
             except Exception:
                 return decodedError
         return self.tr("Detected an error without indications.")
-    
+
     ##################################################################
     ## Methods below implement the file system commands
     ##################################################################
-    
+
     def ls(self, dirname=""):
         """
         Public method to get a directory listing of the connected device.
-        
+
         @param dirname name of the directory to be listed
         @type str
         @return tuple containg the directory listing
@@ -305,8 +312,8 @@
                 "print(__os_.listdir())",
                 "del __os_",
             ]
-            if self.__repl.isMicrobit() else
-            [
+            if self.__repl.isMicrobit()
+            else [
                 "import os as __os_",
                 "print(__os_.listdir('{0}'))".format(dirname),
                 "del __os_",
@@ -316,12 +323,12 @@
         if err:
             raise OSError(self.__shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
-    
+
     def lls(self, dirname="", fullstat=False, showHidden=False):
         """
         Public method to get a long directory listing of the connected device
         including meta data.
-        
+
         @param dirname name of the directory to be listed
         @type str
         @param fullstat flag indicating to return the full stat() tuple
@@ -339,53 +346,65 @@
             # BBC micro:bit does not support directories
             [
                 "import os as __os_",
-                "\n".join([
-                    "def is_visible(filename, showHidden):",
-                    "    return showHidden or "
-                    "(filename[0] != '.' and filename[-1] != '~')",
-                ]),
-                "\n".join([
-                    "def stat(filename):",
-                    "    size = __os_.size(filename)",
-                    "    return (0, 0, 0, 0, 0, 0, size, 0, 0, 0)"
-                ]),
-                "\n".join([
-                    "def listdir_stat(showHidden):",
-                    "    files = __os_.listdir()",
-                    "    return list((f, stat(f)) for f in files if"
-                    " is_visible(f,showHidden))",
-                ]),
+                "\n".join(
+                    [
+                        "def is_visible(filename, showHidden):",
+                        "    return showHidden or "
+                        "(filename[0] != '.' and filename[-1] != '~')",
+                    ]
+                ),
+                "\n".join(
+                    [
+                        "def stat(filename):",
+                        "    size = __os_.size(filename)",
+                        "    return (0, 0, 0, 0, 0, 0, size, 0, 0, 0)",
+                    ]
+                ),
+                "\n".join(
+                    [
+                        "def listdir_stat(showHidden):",
+                        "    files = __os_.listdir()",
+                        "    return list((f, stat(f)) for f in files if"
+                        " is_visible(f,showHidden))",
+                    ]
+                ),
                 "print(listdir_stat({0}))".format(showHidden),
                 "del __os_, stat, listdir_stat, is_visible",
             ]
-            if self.__repl.isMicrobit() else
-            [
+            if self.__repl.isMicrobit()
+            else [
                 "import os as __os_",
-                "\n".join([
-                    "def is_visible(filename, showHidden):",
-                    "    return showHidden or "
-                    "(filename[0] != '.' and filename[-1] != '~')",
-                ]),
-                "\n".join([
-                    "def stat(filename):",
-                    "    try:",
-                    "        rstat = __os_.lstat(filename)",
-                    "    except:",
-                    "        rstat = __os_.stat(filename)",
-                    "    return tuple(rstat)",
-                ]),
-                "\n".join([
-                    "def listdir_stat(dirname, showHidden):",
-                    "    try:",
-                    "        files = __os_.listdir(dirname)",
-                    "    except OSError:",
-                    "        return []",
-                    "    if dirname in ('', '/'):",
-                    "        return list((f, stat(f)) for f in files if"
-                    " is_visible(f, showHidden))",
-                    "    return list((f, stat(dirname + '/' + f))"
-                    " for f in files if is_visible(f, showHidden))",
-                ]),
+                "\n".join(
+                    [
+                        "def is_visible(filename, showHidden):",
+                        "    return showHidden or "
+                        "(filename[0] != '.' and filename[-1] != '~')",
+                    ]
+                ),
+                "\n".join(
+                    [
+                        "def stat(filename):",
+                        "    try:",
+                        "        rstat = __os_.lstat(filename)",
+                        "    except:",
+                        "        rstat = __os_.stat(filename)",
+                        "    return tuple(rstat)",
+                    ]
+                ),
+                "\n".join(
+                    [
+                        "def listdir_stat(dirname, showHidden):",
+                        "    try:",
+                        "        files = __os_.listdir(dirname)",
+                        "    except OSError:",
+                        "        return []",
+                        "    if dirname in ('', '/'):",
+                        "        return list((f, stat(f)) for f in files if"
+                        " is_visible(f, showHidden))",
+                        "    return list((f, stat(dirname + '/' + f))"
+                        " for f in files if is_visible(f, showHidden))",
+                    ]
+                ),
                 "print(listdir_stat('{0}', {1}))".format(dirname, showHidden),
                 "del __os_, stat, listdir_stat, is_visible",
             ]
@@ -401,11 +420,11 @@
                 return fileslist
             else:
                 return [(f, (s[0], s[6], s[8])) for f, s in fileslist]
-    
+
     def cd(self, dirname):
         """
         Public method to change the current directory on the connected device.
-        
+
         @param dirname directory to change to
         @type str
         @exception OSError raised to indicate an issue with the device
@@ -419,11 +438,11 @@
             out, err = self.execute(commands)
             if err:
                 raise OSError(self.__shortError(err))
-    
+
     def pwd(self):
         """
         Public method to get the current directory of the connected device.
-        
+
         @return current directory
         @rtype str
         @exception OSError raised to indicate an issue with the device
@@ -431,7 +450,7 @@
         if self.__repl.isMicrobit():
             # BBC micro:bit does not support directories
             return ""
-        
+
         commands = [
             "import os as __os_",
             "print(__os_.getcwd())",
@@ -441,11 +460,11 @@
         if err:
             raise OSError(self.__shortError(err))
         return out.decode("utf-8").strip()
-    
+
     def rm(self, filename):
         """
         Public method to remove a file from the connected device.
-        
+
         @param filename name of the file to be removed
         @type str
         @exception OSError raised to indicate an issue with the device
@@ -459,11 +478,11 @@
             out, err = self.execute(commands)
             if err:
                 raise OSError(self.__shortError(err))
-    
+
     def rmrf(self, name, recursive=False, force=False):
         """
         Public method to remove a file or directory recursively.
-        
+
         @param name of the file or directory to remove
         @type str
         @param recursive flag indicating a recursive deletion
@@ -477,43 +496,44 @@
         if name:
             commands = [
                 "import os as __os_",
-                "\n".join([
-                    "def remove_file(name, recursive=False, force=False):",
-                    "    try:",
-                    "        mode = __os_.stat(name)[0]",
-                    "        if mode & 0x4000 != 0:",
-                    "            if recursive:",
-                    "                for file in __os_.listdir(name):",
-                    "                    success = remove_file("
-                    "name + '/' + file, recursive, force)",
-                    "                    if not success and not force:",
-                    "                        return False",
-                    "                __os_.rmdir(name)",
-                    "            else:",
-                    "                if not force:",
-                    "                    return False",
-                    "        else:",
-                    "            __os_.remove(name)",
-                    "    except:",
-                    "        if not force:",
-                    "            return False",
-                    "    return True",
-                ]),
-                "print(remove_file('{0}', {1}, {2}))".format(name, recursive,
-                                                             force),
+                "\n".join(
+                    [
+                        "def remove_file(name, recursive=False, force=False):",
+                        "    try:",
+                        "        mode = __os_.stat(name)[0]",
+                        "        if mode & 0x4000 != 0:",
+                        "            if recursive:",
+                        "                for file in __os_.listdir(name):",
+                        "                    success = remove_file("
+                        "name + '/' + file, recursive, force)",
+                        "                    if not success and not force:",
+                        "                        return False",
+                        "                __os_.rmdir(name)",
+                        "            else:",
+                        "                if not force:",
+                        "                    return False",
+                        "        else:",
+                        "            __os_.remove(name)",
+                        "    except:",
+                        "        if not force:",
+                        "            return False",
+                        "    return True",
+                    ]
+                ),
+                "print(remove_file('{0}', {1}, {2}))".format(name, recursive, force),
                 "del __os_, remove_file",
             ]
             out, err = self.execute(commands)
             if err:
                 raise OSError(self.__shortError(err))
             return ast.literal_eval(out.decode("utf-8"))
-        
+
         return False
-    
+
     def mkdir(self, dirname):
         """
         Public method to create a new directory.
-        
+
         @param dirname name of the directory to create
         @type str
         @exception OSError raised to indicate an issue with the device
@@ -527,11 +547,11 @@
             out, err = self.execute(commands)
             if err:
                 raise OSError(self.__shortError(err))
-    
+
     def rmdir(self, dirname):
         """
         Public method to remove a directory.
-        
+
         @param dirname name of the directory to be removed
         @type str
         @exception OSError raised to indicate an issue with the device
@@ -545,11 +565,11 @@
             out, err = self.execute(commands)
             if err:
                 raise OSError(self.__shortError(err))
-    
+
     def put(self, hostFileName, deviceFileName=None):
         """
         Public method to copy a local file to the connected device.
-        
+
         @param hostFileName name of the file to be copied
         @type str
         @param deviceFileName name of the file to copy to
@@ -560,16 +580,16 @@
         """
         if not os.path.isfile(hostFileName):
             raise OSError("No such file: {0}".format(hostFileName))
-        
+
         with open(hostFileName, "rb") as hostFile:
             content = hostFile.read()
             # convert eol '\r'
             content = content.replace(b"\r\n", b"\r")
             content = content.replace(b"\n", b"\r")
-        
+
         if not deviceFileName:
             deviceFileName = os.path.basename(hostFileName)
-        
+
         commands = [
             "fd = open('{0}', 'wb')".format(deviceFileName),
             "f = fd.write",
@@ -578,20 +598,22 @@
             chunk = content[:64]
             commands.append("f(" + repr(chunk) + ")")
             content = content[64:]
-        commands.extend([
-            "fd.close()",
-            "del f, fd",
-        ])
-        
+        commands.extend(
+            [
+                "fd.close()",
+                "del f, fd",
+            ]
+        )
+
         out, err = self.execute(commands)
         if err:
             raise OSError(self.__shortError(err))
         return True
-    
+
     def get(self, deviceFileName, hostFileName=None):
         """
         Public method to copy a file from the connected device.
-        
+
         @param deviceFileName name of the file to copy
         @type str
         @param hostFileName name of the file to copy to
@@ -602,37 +624,39 @@
         """
         if not hostFileName:
             hostFileName = deviceFileName
-        
+
         commands = [
-            "\n".join([
-                "def send_data():",
-                "    try:",
-                "        from microbit import uart as u",
-                "    except ImportError:",
-                "        try:",
-                "            from machine import UART",
-                "            u = UART(0, {0})".format(115200),
-                "        except Exception:",
-                "            try:",
-                "                from sys import stdout as u",
-                "            except Exception:",
-                "                raise Exception('Could not find UART module"
-                " in device.')",
-                "    f = open('{0}', 'rb')".format(deviceFileName),
-                "    r = f.read",
-                "    result = True",
-                "    while result:",
-                "        result = r(32)",
-                "        if result:",
-                "            u.write(result)",
-                "    f.close()",
-            ]),
+            "\n".join(
+                [
+                    "def send_data():",
+                    "    try:",
+                    "        from microbit import uart as u",
+                    "    except ImportError:",
+                    "        try:",
+                    "            from machine import UART",
+                    "            u = UART(0, {0})".format(115200),
+                    "        except Exception:",
+                    "            try:",
+                    "                from sys import stdout as u",
+                    "            except Exception:",
+                    "                raise Exception('Could not find UART module"
+                    " in device.')",
+                    "    f = open('{0}', 'rb')".format(deviceFileName),
+                    "    r = f.read",
+                    "    result = True",
+                    "    while result:",
+                    "        result = r(32)",
+                    "        if result:",
+                    "            u.write(result)",
+                    "    f.close()",
+                ]
+            ),
             "send_data()",
         ]
         out, err = self.execute(commands)
         if err:
             raise OSError(self.__shortError(err))
-        
+
         # write the received bytes to the local file
         # convert eol to "\n"
         out = out.replace(b"\r\n", b"\n")
@@ -640,12 +664,12 @@
         with open(hostFileName, "wb") as hostFile:
             hostFile.write(out)
         return True
-    
+
     def fileSystemInfo(self):
         """
         Public method to obtain information about the currently mounted file
         systems.
-        
+
         @return tuple of tuples containing the file system name, the total
             size, the used size and the free size
         @rtype tuple of tuples of (str, int, int, int)
@@ -653,20 +677,22 @@
         """
         commands = [
             "import os as __os_",
-            "\n".join([
-                "def fsinfo():",
-                "    infolist = []",
-                "    info = __os_.statvfs('/')",
-                "    if info[0] == 0:",
-                # assume it is just mount points
-                "        fsnames = __os_.listdir('/')",
-                "        for fs in fsnames:",
-                "            fs = '/' + fs",
-                "            infolist.append((fs, __os_.statvfs(fs)))",
-                "    else:",
-                "        infolist.append(('/', info))",
-                "    return infolist",
-            ]),
+            "\n".join(
+                [
+                    "def fsinfo():",
+                    "    infolist = []",
+                    "    info = __os_.statvfs('/')",
+                    "    if info[0] == 0:",
+                    # assume it is just mount points
+                    "        fsnames = __os_.listdir('/')",
+                    "        for fs in fsnames:",
+                    "            fs = '/' + fs",
+                    "            infolist.append((fs, __os_.statvfs(fs)))",
+                    "    else:",
+                    "        infolist.append(('/', info))",
+                    "    return infolist",
+                ]
+            ),
             "print(fsinfo())",
             "del __os_, fsinfo",
         ]
@@ -683,18 +709,18 @@
                 freeSize = info[4] * info[1]
                 usedSize = totalSize - freeSize
                 filesystemInfos.append((fs, totalSize, usedSize, freeSize))
-        
+
         return tuple(filesystemInfos)
-    
+
     ##################################################################
     ## non-filesystem related methods below
     ##################################################################
-    
+
     def version(self):
         """
         Public method to get the MicroPython version information of the
         connected device.
-        
+
         @return dictionary containing the version information
         @rtype dict
         @exception OSError raised to indicate an issue with the device
@@ -707,7 +733,7 @@
         out, err = self.execute(commands)
         if err:
             raise OSError(self.__shortError(err))
-        
+
         rawOutput = out.decode("utf-8").strip()
         rawOutput = rawOutput[1:-1]
         items = rawOutput.split(",")
@@ -716,32 +742,36 @@
             key, value = item.strip().split("=")
             result[key.strip()] = value.strip()[1:-1]
         return result
-    
+
     def getImplementation(self):
         """
         Public method to get some implementation information of the connected
         device.
-        
+
         @return dictionary containing the implementation information
         @rtype dict
         @exception OSError raised to indicate an issue with the device
         """
         commands = [
             "import sys as __sys_",
-            "res = {}",                             # __IGNORE_WARNING_M613__
-            "\n".join([
-                "try:",
-                "    res['name'] = __sys_.implementation.name",
-                "except AttributeError:",
-                "    res['name'] = 'unknown'",
-            ]),
-            "\n".join([
-                "try:",
-                "    res['version'] = '.'.join((str(i) for i in"
-                " __sys_.implementation.version))",
-                "except AttributeError:",
-                "    res['version'] = 'unknown'",
-            ]),
+            "res = {}",  # __IGNORE_WARNING_M613__
+            "\n".join(
+                [
+                    "try:",
+                    "    res['name'] = __sys_.implementation.name",
+                    "except AttributeError:",
+                    "    res['name'] = 'unknown'",
+                ]
+            ),
+            "\n".join(
+                [
+                    "try:",
+                    "    res['version'] = '.'.join((str(i) for i in"
+                    " __sys_.implementation.version))",
+                    "except AttributeError:",
+                    "    res['version'] = 'unknown'",
+                ]
+            ),
             "print(res)",
             "del res, __sys_",
         ]
@@ -749,18 +779,17 @@
         if err:
             raise OSError(self.__shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
-    
+
     def getBoardInformation(self):
         """
         Public method to get some information data of the connected board.
-        
+
         @return dictionary containing the determined data
         @rtype dict
         @exception OSError raised to indicate an issue with the device
         """
         commands = [
-            "res = {}",                             # __IGNORE_WARNING_M613__
-            
+            "res = {}",  # __IGNORE_WARNING_M613__
             "import gc as __gc_",
             "__gc_.enable()",
             "__gc_.collect()",
@@ -773,7 +802,6 @@
             "res['mem_free_kb'] = mem_free / 1024.0",
             "res['mem_free_pc'] = mem_free / mem_total * 100.0",
             "del __gc_, mem_alloc, mem_free, mem_total",
-            
             "import os as __os_",
             "uname = __os_.uname()",
             "res['sysname'] = uname.sysname",
@@ -781,66 +809,70 @@
             "res['release'] = uname.release",
             "res['version'] = uname.version",
             "res['machine'] = uname.machine",
-            
             "import sys as __sys_",
             "res['py_platform'] = __sys_.platform",
             "res['py_version'] = __sys_.version",
-            "\n".join([
-                "try:",
-                "    res['mpy_name'] = __sys_.implementation.name",
-                "except AttributeError:",
-                "    res['mpy_name'] = 'unknown'",
-            ]),
-            "\n".join([
-                "try:",
-                "    res['mpy_version'] = '.'.join((str(i) for i in"
-                " __sys_.implementation.version))",
-                "except AttributeError:",
-                "    res['mpy_version'] = 'unknown'",
-            ]),
-            
+            "\n".join(
+                [
+                    "try:",
+                    "    res['mpy_name'] = __sys_.implementation.name",
+                    "except AttributeError:",
+                    "    res['mpy_name'] = 'unknown'",
+                ]
+            ),
+            "\n".join(
+                [
+                    "try:",
+                    "    res['mpy_version'] = '.'.join((str(i) for i in"
+                    " __sys_.implementation.version))",
+                    "except AttributeError:",
+                    "    res['mpy_version'] = 'unknown'",
+                ]
+            ),
             "stat_ = __os_.statvfs('/flash')",
             "res['flash_total_kb'] = stat_[2] * stat_[0] / 1024.0",
             "res['flash_free_kb'] = stat_[3] * stat_[0] / 1024.0",
-            "res['flash_used_kb'] = res['flash_total_kb'] -"
-            " res['flash_free_kb']",
+            "res['flash_used_kb'] = res['flash_total_kb'] -" " res['flash_free_kb']",
             "res['flash_free_pc'] = res['flash_free_kb'] /"
             " res['flash_total_kb'] * 100.0",
             "res['flash_used_pc'] = res['flash_used_kb'] /"
             " res['flash_total_kb'] * 100.0",
-            
-            "\n".join([
-                "try:",
-                "    import machine as __mc_",
-                "    res['mc_frequency_mhz'] = __mc_.freq() / 1000000.0",
-                "    res['mc_id'] = ':'.join(['{0:X}'.format(x)"
-                " for x in __mc_.unique_id()])",
-                "    del __mc_",
-                "except ImportError:",
-                "\n".join([
-                    "    try:",
-                    "        import microcontroller as __mc_",
-                    "        res['mc_frequency_mhz'] = __mc_.cpu.frequency"
-                    " / 1000000.0",
-                    "        res['mc_temp_c'] = __mc_.cpu.temperature",
-                    "        res['mc_id'] = ':'.join(['{0:X}'.format(x)"
-                    " for x in __mc_.cpu.uid])",
-                    "        del __mc_",
-                    "    except ImportError:",
-                    "        res['mc_frequency'] = None",
-                    "        res['mc_temp'] = None",
-                ]),
-            ]),
-            
-            "\n".join([
-                "try:",
-                "    import ulab as __ulab_",
-                "    res['ulab'] = __ulab_.__version__",
-                "    del __ulab_",
-                "except ImportError:",
-                "    res['ulab'] = None",
-            ]),
-            
+            "\n".join(
+                [
+                    "try:",
+                    "    import machine as __mc_",
+                    "    res['mc_frequency_mhz'] = __mc_.freq() / 1000000.0",
+                    "    res['mc_id'] = ':'.join(['{0:X}'.format(x)"
+                    " for x in __mc_.unique_id()])",
+                    "    del __mc_",
+                    "except ImportError:",
+                    "\n".join(
+                        [
+                            "    try:",
+                            "        import microcontroller as __mc_",
+                            "        res['mc_frequency_mhz'] = __mc_.cpu.frequency"
+                            " / 1000000.0",
+                            "        res['mc_temp_c'] = __mc_.cpu.temperature",
+                            "        res['mc_id'] = ':'.join(['{0:X}'.format(x)"
+                            " for x in __mc_.cpu.uid])",
+                            "        del __mc_",
+                            "    except ImportError:",
+                            "        res['mc_frequency'] = None",
+                            "        res['mc_temp'] = None",
+                        ]
+                    ),
+                ]
+            ),
+            "\n".join(
+                [
+                    "try:",
+                    "    import ulab as __ulab_",
+                    "    res['ulab'] = __ulab_.__version__",
+                    "    del __ulab_",
+                    "except ImportError:",
+                    "    res['ulab'] = None",
+                ]
+            ),
             "print(res)",
             "del res, stat_, __os_, __sys_",
         ]
@@ -848,12 +880,12 @@
         if err:
             raise OSError(self.__shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
-    
+
     def syncTime(self, deviceType):
         """
         Public method to set the time of the connected device to the local
         computer's time.
-        
+
         @param deviceType type of board to sync time to
         @type str
         @exception OSError raised to indicate an issue with the device
@@ -874,56 +906,64 @@
             # subseconds)
             # http://docs.micropython.org/en/latest/library/pyb.RTC.html
             # #pyb.RTC.datetime
-            set_time = "\n".join([
-                "def set_time(rtc_time):",
-                "    import pyb",
-                "    rtc = pyb.RTC()",
-                "    rtc.datetime(rtc_time[:7] + (0,))",
-            ])
+            set_time = "\n".join(
+                [
+                    "def set_time(rtc_time):",
+                    "    import pyb",
+                    "    rtc = pyb.RTC()",
+                    "    rtc.datetime(rtc_time[:7] + (0,))",
+                ]
+            )
         elif deviceType == "esp":
             # The machine.RTC documentation was incorrect and doesn't agree
             # with the code, so no link is presented here. The order of the
             # arguments is the same as the pyboard except for LoBo MPy.
-            set_time = "\n".join([
-                "def set_time(rtc_time):",
-                "    import machine",
-                "    rtc = machine.RTC()",
-                "    try:",                 # ESP8266 may use rtc.datetime()
-                "        rtc.datetime(rtc_time[:7] + (0,))",
-                "    except Exception:",    # ESP32 uses rtc.init()
-                "        import os",
-                "        if 'LoBo' in os.uname()[0]:",      # LoBo MPy
-                "            clock_time = rtc_time[:3] +"
-                " rtc_time[4:7] + (rtc_time[3], rtc_time[7])",
-                "        else:",
-                "            clock_time = rtc_time[:7] + (0,)",
-                "        rtc.init(clock_time)",
-            ])
+            set_time = "\n".join(
+                [
+                    "def set_time(rtc_time):",
+                    "    import machine",
+                    "    rtc = machine.RTC()",
+                    "    try:",  # ESP8266 may use rtc.datetime()
+                    "        rtc.datetime(rtc_time[:7] + (0,))",
+                    "    except Exception:",  # ESP32 uses rtc.init()
+                    "        import os",
+                    "        if 'LoBo' in os.uname()[0]:",  # LoBo MPy
+                    "            clock_time = rtc_time[:3] +"
+                    " rtc_time[4:7] + (rtc_time[3], rtc_time[7])",
+                    "        else:",
+                    "            clock_time = rtc_time[:7] + (0,)",
+                    "        rtc.init(clock_time)",
+                ]
+            )
         elif deviceType == "circuitpython":
-            set_time = "\n".join([
-                "def set_time(rtc_time):",
-                "    import rtc",
-                "    import time",
-                "    clock = rtc.RTC()",
-                "    clock_time = rtc_time[:3] + rtc_time[4:7] + (rtc_time[3],"
-                " rtc_time[7], rtc_time[8])",
-                "    clock.datetime = time.struct_time(clock_time)",
-            ])
+            set_time = "\n".join(
+                [
+                    "def set_time(rtc_time):",
+                    "    import rtc",
+                    "    import time",
+                    "    clock = rtc.RTC()",
+                    "    clock_time = rtc_time[:3] + rtc_time[4:7] + (rtc_time[3],"
+                    " rtc_time[7], rtc_time[8])",
+                    "    clock.datetime = time.struct_time(clock_time)",
+                ]
+            )
         elif deviceType in ("bbc_microbit", "calliope"):
             # BBC micro:bit and Calliope mini don't support time commands
             return
         elif deviceType == "rp2040":
             # Raspberry Pi Pico (RP2040) - machine.RTC doesn't exist
-            set_time = "\n".join([
-                "def set_time(rtc_time):",
-                "    setup_0 = rtc_time[0] << 12 | rtc_time[1] << 8 |"
-                " rtc_time[2]",
-                "    setup_1 = (rtc_time[3] % 7) << 24 | rtc_time[4] << 16 |"
-                " rtc_time[5] << 8 | rtc_time[6]",
-                "    machine.mem32[0x4005c004] = setup_0",
-                "    machine.mem32[0x4005c008] = setup_1",
-                "    machine.mem32[0x4005c00c] |= 0x10",
-            ])
+            set_time = "\n".join(
+                [
+                    "def set_time(rtc_time):",
+                    "    setup_0 = rtc_time[0] << 12 | rtc_time[1] << 8 |"
+                    " rtc_time[2]",
+                    "    setup_1 = (rtc_time[3] % 7) << 24 | rtc_time[4] << 16 |"
+                    " rtc_time[5] << 8 | rtc_time[6]",
+                    "    machine.mem32[0x4005c004] = setup_0",
+                    "    machine.mem32[0x4005c008] = setup_1",
+                    "    machine.mem32[0x4005c00c] |= 0x10",
+                ]
+            )
         elif deviceType == "pycom":
             # PyCom's machine.RTC takes its arguments in a slightly
             # different order than the official machine.RTC.
@@ -931,60 +971,73 @@
             # tzinfo]])
             # https://docs.pycom.io/firmwareapi/pycom/machine/rtc/
             # #rtc-init-datetime-none-source-rtc-internal-rc
-            set_time = "\n".join([
-                "def set_time(rtc_time):",
-                "    import pycom",
-                "    rtc_time2 = rtc_time[:3] + rtc_time[4:7]",
-                "    import machine",
-                "    rtc = machine.RTC()",
-                "    rtc.init(rtc_time2)",
-            ])
+            set_time = "\n".join(
+                [
+                    "def set_time(rtc_time):",
+                    "    import pycom",
+                    "    rtc_time2 = rtc_time[:3] + rtc_time[4:7]",
+                    "    import machine",
+                    "    rtc = machine.RTC()",
+                    "    rtc.init(rtc_time2)",
+                ]
+            )
         else:
             # no set_time() support for generic boards
             return
-        
+
         now = time.localtime(time.time())
         commands = [
             set_time,
-            "set_time({0})".format((
-                now.tm_year, now.tm_mon, now.tm_mday, now.tm_wday + 1,
-                now.tm_hour, now.tm_min, now.tm_sec, now.tm_yday, now.tm_isdst
-            )),
+            "set_time({0})".format(
+                (
+                    now.tm_year,
+                    now.tm_mon,
+                    now.tm_mday,
+                    now.tm_wday + 1,
+                    now.tm_hour,
+                    now.tm_min,
+                    now.tm_sec,
+                    now.tm_yday,
+                    now.tm_isdst,
+                )
+            ),
             "del set_time",
         ]
         out, err = self.execute(commands)
         if err:
             raise OSError(self.__shortError(err))
-    
+
     def getTime(self):
         """
         Public method to get the current time of the device.
-        
+
         @return time of the device
         @rtype str
         @exception OSError raised to indicate an issue with the device
         """
         commands = [
-            "\n".join([
-                "try:",
-                "    import rtc as __rtc_",
-                "    print('{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'"
-                ".format(*__rtc_.RTC().datetime[:6]))",
-                "    del __rtc_",
-                "except:",
-                "    import time as __time_",
-                "    try:",
-                "        print(__time_.strftime('%Y-%m-%d %H:%M:%S',"
-                # __IGNORE_WARNING_M601__
-                " __time_.localtime()))",
-                "    except AttributeError:",
-                "        tm = __time_.localtime()",
-                "        print('{0:04d}-{1:02d}-{2:02d}"
-                " {3:02d}:{4:02d}:{5:02d}'"
-                ".format(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))",
-                "        del tm",
-                "    del __time_"
-            ]),
+            "\n".join(
+                [
+                    "try:",
+                    "    import rtc as __rtc_",
+                    "    print('{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'"
+                    ".format(*__rtc_.RTC().datetime[:6]))",
+                    "    del __rtc_",
+                    "except:",
+                    "    import time as __time_",
+                    "    try:",
+                    "        print(__time_.strftime('%Y-%m-%d %H:%M:%S',"
+                    # __IGNORE_WARNING_M601__
+                    " __time_.localtime()))",
+                    "    except AttributeError:",
+                    "        tm = __time_.localtime()",
+                    "        print('{0:04d}-{1:02d}-{2:02d}"
+                    " {3:02d}:{4:02d}:{5:02d}'"
+                    ".format(tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))",
+                    "        del tm",
+                    "    del __time_",
+                ]
+            ),
         ]
         out, err = self.execute(commands)
         if err:
--- a/src/eric7/MicroPython/MicroPythonDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,236 +23,227 @@
 SupportedBoards = {
     "esp": {
         "ids": [
-            (0x0403, 0x6001),       # M5Stack ESP32 device"),
-            (0x0403, 0x6001),       # FT232/FT245 (XinaBox CW01, CW02)
-            (0x0403, 0x6010),       # FT2232C/D/L/HL/Q (ESP-WROVER-KIT)
-            (0x0403, 0x6011),       # FT4232
-            (0x0403, 0x6014),       # FT232H
-            (0x0403, 0x6015),       # Sparkfun ESP32
-            (0x0403, 0x601C),       # FT4222H
-            (0x10C4, 0xEA60),       # CP210x
-            (0x1A86, 0x55D4),       # CH343
-            (0x1A86, 0x7523),       # HL-340, CH340
+            (0x0403, 0x6001),  # M5Stack ESP32 device"),
+            (0x0403, 0x6001),  # FT232/FT245 (XinaBox CW01, CW02)
+            (0x0403, 0x6010),  # FT2232C/D/L/HL/Q (ESP-WROVER-KIT)
+            (0x0403, 0x6011),  # FT4232
+            (0x0403, 0x6014),  # FT232H
+            (0x0403, 0x6015),  # Sparkfun ESP32
+            (0x0403, 0x601C),  # FT4222H
+            (0x10C4, 0xEA60),  # CP210x
+            (0x1A86, 0x55D4),  # CH343
+            (0x1A86, 0x7523),  # HL-340, CH340
         ],
         "description": "ESP32, ESP8266",
         "icon": "esp32Device",
         "port_description": "",
     },
-    
     "circuitpython": {
         "ids": [
-            (0x04D8, 0xEA2A),       # BHDynamics DynaLoRa_USB
-            (0x04D8, 0xEAD1),       # BH Dynamics DynOSSAT-EDU-EPS-v1.0
-            (0x04D8, 0xEAD2),       # BH Dynamics DynOSSAT-EDU-OBC-v1.0
-            (0x04D8, 0xEC44),       # maholli PyCubed
-            (0x04D8, 0xEC63),       # Kevin Neubauer CircuitBrains Basic
-            (0x04D8, 0xEC64),       # Kevin Neubauer CircuitBrains Deluxe
-            (0x04D8, 0xEC72),       # XinaBox CC03
-            (0x04D8, 0xEC75),       # XinaBox CS11
-            (0x04D8, 0xED5F),       # Itaca Innovation uChip CircuitPython
-            (0x04D8, 0xED94),       # maholli kicksat-sprite
-            (0x04D8, 0xEDB3),       # Capable Robot Programmable USB Hub
-            (0x04D8, 0xEDBE),       # maholli SAM32
-            (0x04D8, 0xEE8C),       # J&J Studios LLC datum-Distance
-            (0x04D8, 0xEE8D),       # J&J Studios LLC datum-IMU
-            (0x04D8, 0xEE8E),       # J&J Studios LLC datum-Light
-            (0x04D8, 0xEE8F),       # J&J Studios LLC datum-Weather
-            (0x04D8, 0xEF67),       # senseBox MCU
-            (0x054C, 0x0BC2),       # Sony Spresense
-            (0x1209, 0x2017),       # Benjamin Shockley Mini SAM M4
-            (0x1209, 0x3141),       # CrumpSpace CrumpS2
-            (0x1209, 0x3252),       # Targett Module Clip w/Wroom
-            (0x1209, 0x3253),       # Targett Module Clip w/Wrover
-            (0x1209, 0x4D43),       # Robotics Masters Robo HAT MM1 M4
-            (0x1209, 0x4DDD),       # ODT CP Sapling
-            (0x1209, 0x4DDE),       # ODT CP Sapling M0 w/ SPI Flash
-            (0x1209, 0x4DDF),       # ODT CP Sapling Rev B
-            (0x1209, 0x4DF0),       # Oak Dev Tech Pixelwing ESP32S2
-            (0x1209, 0x4DF1),       # Oak Dev Tech BREAD2040
-            (0x1209, 0x4DF2),       # Oak Dev Tech CAST AWAY RP2040
-            (0x1209, 0x5BF0),       # Foosn Fomu
-            (0x1209, 0x7150),       # Electronic Cats Hunter Cat NFC
-            (0x1209, 0x7382),       # Invector Labs AB iLabs Challenger 840
-            (0x1209, 0x805A),       # Electronic Cats BastBLE
-            (0x1209, 0xA182),       # Solder Party RP2040 Stamp
-            (0x1209, 0xBAB0),       # Electronic Cats Bast WiFi
-            (0x1209, 0xBAB1),       # Electronic Cats Meow Meow
-            (0x1209, 0xBAB2),       # Electronic Cats CatWAN USBStick
-            (0x1209, 0xBAB3),       # Electronic Cats Bast Pro Mini M0
-            (0x1209, 0xBAB6),       # Electronic Cats Escornabot Makech
-            (0x1209, 0xBAB8),       # Electronic Cats NFC Copy Cat
-            (0x1209, 0xC051),       # Betrusted Simmel
-            (0x1209, 0xD10D),       # Diodes Delight Piunora
-            (0x1209, 0xE3E3),       # StackRduino M0 PRO
-            (0x1209, 0xF500),       # Silicognition LLC M4-Shim
-            (0x16D0, 0x08C6),       # Pimoroni Keybow 2040
-            (0x16D0, 0x08C7),       # Pimoroni Tiny 2040 (8MB)
-            (0x16D0, 0x08C8),       # Pimoroni PicoSystem
-            (0x1915, 0xB001),       # Makerdiary Pitaya Go
-            (0x192F, 0xB1B2),       # WarmBit BluePixel nRF52840
-            (0x1B4F, 0x0015),       # SparkFun RedBoard Turbo Board
-            (0x1B4F, 0x0016),       # SparkFun SAMD51 Thing+
-            (0x1B4F, 0x0017),       # SparkFun LUMIDrive Board
-            (0x1B4F, 0x0020),       # SparkFun MicroMod SAMD51 Processor
-            (0x1B4F, 0x0021),       # SparkFun MicroMod nRF52840 Processor
-            (0x1B4F, 0x0024),       # SparkFun MicroMod RP2040 Processor
-            (0x1B4F, 0x0025),       # SparkFun Thing Plus RP2040
-            (0x1B4F, 0x0026),       # SparkFun Pro Micro RP2040
-            (0x1B4F, 0x0027),       # SparkFun STM32 MicroMod Processor
-            (0x1B4F, 0x0028),       # SparkFun Thing Plus - STM32
-            (0x1B4F, 0x002E),       # PJRC/Sparkfun Teensy MicroMod
-            (0x1B4F, 0x5289),       # SparkFun SFE_nRF52840_Mini
-            (0x1B4F, 0x8D22),       # SparkFun SAMD21 Mini Breakout
-            (0x1B4F, 0x8D23),       # SparkFun SAMD21 Dev Breakout
-            (0x1B4F, 0x8D24),       # SparkFun Qwiic Micro
-            (0x1D50, 0x60E8),       # Radomir Dopieralski PewPew M4
-            (0x1D50, 0x6152),       # nrf52.jpconstantineau.com BlueMicro833
-            (0x1D50, 0x6153),       # JPConstantineau PyKey18
-            (0x1D50, 0x6153),       # JPConstantineau PyKey44
-            (0x1D50, 0x6153),       # JPConstantineau PyKey60
-            (0x1D50, 0x6153),       # JPConstantineau PyKey87
-            (0x1D50, 0x6154),       # JPConstantineau EncoderPad RP2040
-            (0x1D50, 0x6161),       # nrf52.jpconstantineau.com BlueMicro840
-            (0x2341, 0x8053),       # Arduino MKR1300
-            (0x2341, 0x8057),       # Arduino Nano 33 IoT
-            (0x2341, 0x805A),       # Arduino Arduino_Nano_33_BLE
-            (0x2341, 0x824D),       # Arduino Zero
-            (0x2786, 0x9207),       # Switch Sc. BLE-SS dev board Multi Sensor
-            (0x2786, 0x920D),       # Switch Sc. SSCI ISP1807 Dev Board
-            (0x2786, 0x920F),       # Switch Sc. SSCI ISP1807 Micro Board
-            (0x2886, 0x002F),       # Seeed Seeeduino XIAO
-            (0x2886, 0x0042),       # Seeed Seeeduino XIAO RP2040
-            (0x2886, 0x0045),       # Seeed XIAO nRF52840 Sense
-            (0x2886, 0x802D),       # Seeed Seeeduino Wio Terminal
-            (0x2886, 0x802F),       # Seeed Seeeduino XIAO KB
-            (0x2886, 0xF001),       # Makerdiary nRF52840 M.2 Developer Kit
-            (0x2886, 0xF002),       # Makerdiary M60 Keyboard
-            (0x2B04, 0xC00C),       # Particle Argon
-            (0x2B04, 0xC00D),       # Particle Boron
-            (0x2B04, 0xC00E),       # Particle Xenon
-            (0x2E8A, 0x1000),       # Cytron Maker Pi RP2040
-            (0x2E8A, 0x1002),       # Pimoroni Pico LiPo (4MB)
-            (0x2E8A, 0x1003),       # Pimoroni Pico LiPo (16MB)
-            (0x2E8A, 0x1005),       # Melopero Shake RP2040
-            (0x2E8A, 0x1006),       # Invector Labs Challenger RP2040 WiFi
-            (0x2E8A, 0x1008),       # Pimoroni PGA2040
-            (0x2E8A, 0x1009),       # Pimoroni Interstate 75
-            (0x2E8A, 0x100A),       # Pimoroni Plasma 2040
-            (0x2E8A, 0x100B),       # Invector Labs Challenger RP2040 LTE
-            (0x2E8A, 0x100D),       # Invector Labs Challenger NB RP2040 WiFi
-            (0x2E8A, 0x100E),       # Raspberry Pi Zero
-            (0x2E8A, 0x100F),       # Cytron Maker Nano RP2040
-            (0x2E8A, 0x1012),       # Raspberry Pi Compute Module 4 IO Board
-            (0x2E8A, 0x1013),       # Raspberry Pi 4B
-            (0x2E8A, 0x1014),       # Raspberry Pi Compute Module 4
-            (0x2E8A, 0x1015),       # Raspberry Pi Zero 2W
-            (0x2E8A, 0x1016),       # Pimoroni Tiny 2040 (2MB)
-            (0x2E8A, 0x1019),       # Pimoroni Motor 2040
-            (0x2E8A, 0x101A),       # Pimoroni Servo 2040
-            (0x2E8A, 0x101B),       # Pimoroni Badger 2040
-            (0x2E8A, 0x101E),       # Raspberry Pi Zero W
-            (0x2E8A, 0x101F),       # Waveshare Electronics RP2040-Zero
-            (0x2E8A, 0x1026),       # ELECFREAKS Pico:ed
-            (0x2E8A, 0x1027),       # WIZnet W5100S-EVB-Pico
-            (0x303A, 0x7001),       # Espressif ESP32-S2-HMI-DevKit-1
-            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1
-            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1-N8
-            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1-N8R2
-            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1-N8R8
-            (0x303A, 0x7003),       # Espressif ESP32-S3-DevKitC-1-nopsram
-            (0x303A, 0x7005),       # Espressif ESP32-S3-Box-2.5
-            (0x303A, 0x7007),       # Espressif ESP32-S3-DevKitM-1-N8
-            (0x303A, 0x7009),       # Espressif ESP32-S2-DevKitC-1-N4
-            (0x303A, 0x7009),       # Espressif ESP32-S2-DevKitC-1-N4R2
-            (0x303A, 0x700B),       # Espressif ESP32-S3-USB-OTG-N8
-            (0x303A, 0x8002),       # UnexpectedMaker TinyS2
-            (0x303A, 0x8007),       # LILYGO TTGO T8 ESP32-S2
-            (0x303A, 0x800D),       # Gravitech Cucumber RS
-            (0x303A, 0x80A1),       # Gravitech Cucumber R
-            (0x303A, 0x80A4),       # Gravitech Cucumber M
-            (0x303A, 0x80A7),       # Gravitech Cucumber MS
-            (0x303A, 0x80AA),       # Espressif Franzininho WIFI w/Wroom
-            (0x303A, 0x80AD),       # Espressif Franzininho WIFI w/Wrover
-            (0x303A, 0x80AF),       # Artisense Reference Design RD00
-            (0x303A, 0x80B2),       # Muselab nanoESP32-S2  w/Wrover
-            (0x303A, 0x80B5),       # UnexpectedMaker FeatherS2 Neo
-            (0x303A, 0x80B7),       # MORPHEANS MORPHESP-240
-            (0x303A, 0x80C3),       # Lolin S2 Mini
-            (0x303A, 0x80C6),       # Lolin S2 Pico
-            (0x303A, 0x80D1),       # UnexpectedMaker TinyS3
-            (0x303A, 0x80D4),       # UnexpectedMaker ProS3
-            (0x303A, 0x80D7),       # UnexpectedMaker FeatherS3
-            (0x303A, 0x80D9),       # FutureKeys HexKy_S2
-            (0x303A, 0x80E8),       # HiiBot IoTs2
-            (0x303A, 0x80EA),       # LILYGO TTGO T8 ESP32-S2-WROOM
-            (0x303A, 0x80ED),       # LILYGO TTGO T8 ESP32-S2
-            (0x30A4, 0x0002),       # Blues Inc. Swan R5
-            (0x3171, 0x0101),       # 8086.net Commander
-            (0x31E2, 0x2001),       # BDMICRO LLC VINA-D21
-            (0x31E2, 0x2011),       # BDMICRO LLC VINA-D51
-            (0x31E2, 0x2021),       # BDMICRO LLC VINA-D51
-            (0x32BD, 0x3001),       # Alorium Tech. AloriumTech Evo M51
-            (0x4097, 0x0001),       # TG-Boards Datalore IP M4
-            (0x612B, 0x80A7),       # Ai-Thinker ESP 12k NodeMCU
-            
-            (0x239A, None),         # Any Adafruit Boards
+            (0x04D8, 0xEA2A),  # BHDynamics DynaLoRa_USB
+            (0x04D8, 0xEAD1),  # BH Dynamics DynOSSAT-EDU-EPS-v1.0
+            (0x04D8, 0xEAD2),  # BH Dynamics DynOSSAT-EDU-OBC-v1.0
+            (0x04D8, 0xEC44),  # maholli PyCubed
+            (0x04D8, 0xEC63),  # Kevin Neubauer CircuitBrains Basic
+            (0x04D8, 0xEC64),  # Kevin Neubauer CircuitBrains Deluxe
+            (0x04D8, 0xEC72),  # XinaBox CC03
+            (0x04D8, 0xEC75),  # XinaBox CS11
+            (0x04D8, 0xED5F),  # Itaca Innovation uChip CircuitPython
+            (0x04D8, 0xED94),  # maholli kicksat-sprite
+            (0x04D8, 0xEDB3),  # Capable Robot Programmable USB Hub
+            (0x04D8, 0xEDBE),  # maholli SAM32
+            (0x04D8, 0xEE8C),  # J&J Studios LLC datum-Distance
+            (0x04D8, 0xEE8D),  # J&J Studios LLC datum-IMU
+            (0x04D8, 0xEE8E),  # J&J Studios LLC datum-Light
+            (0x04D8, 0xEE8F),  # J&J Studios LLC datum-Weather
+            (0x04D8, 0xEF67),  # senseBox MCU
+            (0x054C, 0x0BC2),  # Sony Spresense
+            (0x1209, 0x2017),  # Benjamin Shockley Mini SAM M4
+            (0x1209, 0x3141),  # CrumpSpace CrumpS2
+            (0x1209, 0x3252),  # Targett Module Clip w/Wroom
+            (0x1209, 0x3253),  # Targett Module Clip w/Wrover
+            (0x1209, 0x4D43),  # Robotics Masters Robo HAT MM1 M4
+            (0x1209, 0x4DDD),  # ODT CP Sapling
+            (0x1209, 0x4DDE),  # ODT CP Sapling M0 w/ SPI Flash
+            (0x1209, 0x4DDF),  # ODT CP Sapling Rev B
+            (0x1209, 0x4DF0),  # Oak Dev Tech Pixelwing ESP32S2
+            (0x1209, 0x4DF1),  # Oak Dev Tech BREAD2040
+            (0x1209, 0x4DF2),  # Oak Dev Tech CAST AWAY RP2040
+            (0x1209, 0x5BF0),  # Foosn Fomu
+            (0x1209, 0x7150),  # Electronic Cats Hunter Cat NFC
+            (0x1209, 0x7382),  # Invector Labs AB iLabs Challenger 840
+            (0x1209, 0x805A),  # Electronic Cats BastBLE
+            (0x1209, 0xA182),  # Solder Party RP2040 Stamp
+            (0x1209, 0xBAB0),  # Electronic Cats Bast WiFi
+            (0x1209, 0xBAB1),  # Electronic Cats Meow Meow
+            (0x1209, 0xBAB2),  # Electronic Cats CatWAN USBStick
+            (0x1209, 0xBAB3),  # Electronic Cats Bast Pro Mini M0
+            (0x1209, 0xBAB6),  # Electronic Cats Escornabot Makech
+            (0x1209, 0xBAB8),  # Electronic Cats NFC Copy Cat
+            (0x1209, 0xC051),  # Betrusted Simmel
+            (0x1209, 0xD10D),  # Diodes Delight Piunora
+            (0x1209, 0xE3E3),  # StackRduino M0 PRO
+            (0x1209, 0xF500),  # Silicognition LLC M4-Shim
+            (0x16D0, 0x08C6),  # Pimoroni Keybow 2040
+            (0x16D0, 0x08C7),  # Pimoroni Tiny 2040 (8MB)
+            (0x16D0, 0x08C8),  # Pimoroni PicoSystem
+            (0x1915, 0xB001),  # Makerdiary Pitaya Go
+            (0x192F, 0xB1B2),  # WarmBit BluePixel nRF52840
+            (0x1B4F, 0x0015),  # SparkFun RedBoard Turbo Board
+            (0x1B4F, 0x0016),  # SparkFun SAMD51 Thing+
+            (0x1B4F, 0x0017),  # SparkFun LUMIDrive Board
+            (0x1B4F, 0x0020),  # SparkFun MicroMod SAMD51 Processor
+            (0x1B4F, 0x0021),  # SparkFun MicroMod nRF52840 Processor
+            (0x1B4F, 0x0024),  # SparkFun MicroMod RP2040 Processor
+            (0x1B4F, 0x0025),  # SparkFun Thing Plus RP2040
+            (0x1B4F, 0x0026),  # SparkFun Pro Micro RP2040
+            (0x1B4F, 0x0027),  # SparkFun STM32 MicroMod Processor
+            (0x1B4F, 0x0028),  # SparkFun Thing Plus - STM32
+            (0x1B4F, 0x002E),  # PJRC/Sparkfun Teensy MicroMod
+            (0x1B4F, 0x5289),  # SparkFun SFE_nRF52840_Mini
+            (0x1B4F, 0x8D22),  # SparkFun SAMD21 Mini Breakout
+            (0x1B4F, 0x8D23),  # SparkFun SAMD21 Dev Breakout
+            (0x1B4F, 0x8D24),  # SparkFun Qwiic Micro
+            (0x1D50, 0x60E8),  # Radomir Dopieralski PewPew M4
+            (0x1D50, 0x6152),  # nrf52.jpconstantineau.com BlueMicro833
+            (0x1D50, 0x6153),  # JPConstantineau PyKey18
+            (0x1D50, 0x6153),  # JPConstantineau PyKey44
+            (0x1D50, 0x6153),  # JPConstantineau PyKey60
+            (0x1D50, 0x6153),  # JPConstantineau PyKey87
+            (0x1D50, 0x6154),  # JPConstantineau EncoderPad RP2040
+            (0x1D50, 0x6161),  # nrf52.jpconstantineau.com BlueMicro840
+            (0x2341, 0x8053),  # Arduino MKR1300
+            (0x2341, 0x8057),  # Arduino Nano 33 IoT
+            (0x2341, 0x805A),  # Arduino Arduino_Nano_33_BLE
+            (0x2341, 0x824D),  # Arduino Zero
+            (0x2786, 0x9207),  # Switch Sc. BLE-SS dev board Multi Sensor
+            (0x2786, 0x920D),  # Switch Sc. SSCI ISP1807 Dev Board
+            (0x2786, 0x920F),  # Switch Sc. SSCI ISP1807 Micro Board
+            (0x2886, 0x002F),  # Seeed Seeeduino XIAO
+            (0x2886, 0x0042),  # Seeed Seeeduino XIAO RP2040
+            (0x2886, 0x0045),  # Seeed XIAO nRF52840 Sense
+            (0x2886, 0x802D),  # Seeed Seeeduino Wio Terminal
+            (0x2886, 0x802F),  # Seeed Seeeduino XIAO KB
+            (0x2886, 0xF001),  # Makerdiary nRF52840 M.2 Developer Kit
+            (0x2886, 0xF002),  # Makerdiary M60 Keyboard
+            (0x2B04, 0xC00C),  # Particle Argon
+            (0x2B04, 0xC00D),  # Particle Boron
+            (0x2B04, 0xC00E),  # Particle Xenon
+            (0x2E8A, 0x1000),  # Cytron Maker Pi RP2040
+            (0x2E8A, 0x1002),  # Pimoroni Pico LiPo (4MB)
+            (0x2E8A, 0x1003),  # Pimoroni Pico LiPo (16MB)
+            (0x2E8A, 0x1005),  # Melopero Shake RP2040
+            (0x2E8A, 0x1006),  # Invector Labs Challenger RP2040 WiFi
+            (0x2E8A, 0x1008),  # Pimoroni PGA2040
+            (0x2E8A, 0x1009),  # Pimoroni Interstate 75
+            (0x2E8A, 0x100A),  # Pimoroni Plasma 2040
+            (0x2E8A, 0x100B),  # Invector Labs Challenger RP2040 LTE
+            (0x2E8A, 0x100D),  # Invector Labs Challenger NB RP2040 WiFi
+            (0x2E8A, 0x100E),  # Raspberry Pi Zero
+            (0x2E8A, 0x100F),  # Cytron Maker Nano RP2040
+            (0x2E8A, 0x1012),  # Raspberry Pi Compute Module 4 IO Board
+            (0x2E8A, 0x1013),  # Raspberry Pi 4B
+            (0x2E8A, 0x1014),  # Raspberry Pi Compute Module 4
+            (0x2E8A, 0x1015),  # Raspberry Pi Zero 2W
+            (0x2E8A, 0x1016),  # Pimoroni Tiny 2040 (2MB)
+            (0x2E8A, 0x1019),  # Pimoroni Motor 2040
+            (0x2E8A, 0x101A),  # Pimoroni Servo 2040
+            (0x2E8A, 0x101B),  # Pimoroni Badger 2040
+            (0x2E8A, 0x101E),  # Raspberry Pi Zero W
+            (0x2E8A, 0x101F),  # Waveshare Electronics RP2040-Zero
+            (0x2E8A, 0x1026),  # ELECFREAKS Pico:ed
+            (0x2E8A, 0x1027),  # WIZnet W5100S-EVB-Pico
+            (0x303A, 0x7001),  # Espressif ESP32-S2-HMI-DevKit-1
+            (0x303A, 0x7003),  # Espressif ESP32-S3-DevKitC-1
+            (0x303A, 0x7003),  # Espressif ESP32-S3-DevKitC-1-N8
+            (0x303A, 0x7003),  # Espressif ESP32-S3-DevKitC-1-N8R2
+            (0x303A, 0x7003),  # Espressif ESP32-S3-DevKitC-1-N8R8
+            (0x303A, 0x7003),  # Espressif ESP32-S3-DevKitC-1-nopsram
+            (0x303A, 0x7005),  # Espressif ESP32-S3-Box-2.5
+            (0x303A, 0x7007),  # Espressif ESP32-S3-DevKitM-1-N8
+            (0x303A, 0x7009),  # Espressif ESP32-S2-DevKitC-1-N4
+            (0x303A, 0x7009),  # Espressif ESP32-S2-DevKitC-1-N4R2
+            (0x303A, 0x700B),  # Espressif ESP32-S3-USB-OTG-N8
+            (0x303A, 0x8002),  # UnexpectedMaker TinyS2
+            (0x303A, 0x8007),  # LILYGO TTGO T8 ESP32-S2
+            (0x303A, 0x800D),  # Gravitech Cucumber RS
+            (0x303A, 0x80A1),  # Gravitech Cucumber R
+            (0x303A, 0x80A4),  # Gravitech Cucumber M
+            (0x303A, 0x80A7),  # Gravitech Cucumber MS
+            (0x303A, 0x80AA),  # Espressif Franzininho WIFI w/Wroom
+            (0x303A, 0x80AD),  # Espressif Franzininho WIFI w/Wrover
+            (0x303A, 0x80AF),  # Artisense Reference Design RD00
+            (0x303A, 0x80B2),  # Muselab nanoESP32-S2  w/Wrover
+            (0x303A, 0x80B5),  # UnexpectedMaker FeatherS2 Neo
+            (0x303A, 0x80B7),  # MORPHEANS MORPHESP-240
+            (0x303A, 0x80C3),  # Lolin S2 Mini
+            (0x303A, 0x80C6),  # Lolin S2 Pico
+            (0x303A, 0x80D1),  # UnexpectedMaker TinyS3
+            (0x303A, 0x80D4),  # UnexpectedMaker ProS3
+            (0x303A, 0x80D7),  # UnexpectedMaker FeatherS3
+            (0x303A, 0x80D9),  # FutureKeys HexKy_S2
+            (0x303A, 0x80E8),  # HiiBot IoTs2
+            (0x303A, 0x80EA),  # LILYGO TTGO T8 ESP32-S2-WROOM
+            (0x303A, 0x80ED),  # LILYGO TTGO T8 ESP32-S2
+            (0x30A4, 0x0002),  # Blues Inc. Swan R5
+            (0x3171, 0x0101),  # 8086.net Commander
+            (0x31E2, 0x2001),  # BDMICRO LLC VINA-D21
+            (0x31E2, 0x2011),  # BDMICRO LLC VINA-D51
+            (0x31E2, 0x2021),  # BDMICRO LLC VINA-D51
+            (0x32BD, 0x3001),  # Alorium Tech. AloriumTech Evo M51
+            (0x4097, 0x0001),  # TG-Boards Datalore IP M4
+            (0x612B, 0x80A7),  # Ai-Thinker ESP 12k NodeMCU
+            (0x239A, None),  # Any Adafruit Boards
         ],
         "description": "CircuitPython",
         "icon": "circuitPythonDevice",
         "port_description": "",
     },
-    
     "bbc_microbit": {
         "ids": [
-            (0x0D28, 0x0204),       # micro:bit
+            (0x0D28, 0x0204),  # micro:bit
         ],
         "description": "BBC micro:bit",
         "icon": "microbitDevice",
         "port_description": "BBC micro:bit CMSIS-DAP",
     },
-    
     "calliope": {
         "ids": [
-            (0x0D28, 0x0204),       # Calliope mini
+            (0x0D28, 0x0204),  # Calliope mini
         ],
         "description": "Calliope mini",
         "icon": "calliope_mini",
         "port_description": "DAPLink CMSIS-DAP",
     },
-    
     "pyboard": {
         "ids": [
-            (0xF055, 0x9800),       # Pyboard in CDC mode
-            (0xF055, 0x9801),       # Pyboard in CDC+HID mode
-            (0xF055, 0x9802),       # Pyboard in CDC+MSC mode
+            (0xF055, 0x9800),  # Pyboard in CDC mode
+            (0xF055, 0x9801),  # Pyboard in CDC+HID mode
+            (0xF055, 0x9802),  # Pyboard in CDC+MSC mode
         ],
         "description": "PyBoard",
         "icon": "micropython48",
         "port_description": "",
     },
-    
     "rp2040": {
         "ids": [
-            (0x2E8A, 0x0005),       # Raspberry Pi Pico
+            (0x2E8A, 0x0005),  # Raspberry Pi Pico
         ],
-        "description": QCoreApplication.translate(
-            "MicroPythonDevice", "RP2040 based"),
+        "description": QCoreApplication.translate("MicroPythonDevice", "RP2040 based"),
         "icon": "rp2040Device",
         "port_description": "",
     },
-    
     "generic": {
         # only manually configured devices use this
         "ids": [],
-        "description": QCoreApplication.translate(
-            "MicroPythonDevice", "Generic Board"),
+        "description": QCoreApplication.translate("MicroPythonDevice", "Generic Board"),
         "icon": "micropython48",
         "port_description": "",
     },
 }
 
 IgnoredBoards = (
-    (0x8086, 0x9c3d),
+    (0x8086, 0x9C3D),
     (0x8086, None),
 )
 
@@ -260,21 +251,20 @@
 def getSupportedDevices():
     """
     Function to get a list of supported MicroPython devices.
-    
+
     @return set of tuples with the board type and description
     @rtype set of tuples of (str, str)
     """
     boards = []
     for board in SupportedBoards:
-        boards.append(
-            (board, SupportedBoards[board]["description"]))
+        boards.append((board, SupportedBoards[board]["description"]))
     return boards
 
 
 def getFoundDevices():
     """
     Function to check the serial ports for supported MicroPython devices.
-    
+
     @return tuple containing a list of tuples with the board type, the port
         description, a description, the serial port it is connected at, the
         VID and PID for known device types, a list of tuples with VID, PID
@@ -285,80 +275,88 @@
         list of tuples of (int, int, str, str)
     """
     from PyQt6.QtSerialPort import QSerialPortInfo
-    
+
     foundDevices = []
     unknownDevices = []
     unknownPorts = []
-    
+
     manualDevices = {}
     for deviceDict in Preferences.getMicroPython("ManualDevices"):
         manualDevices[(deviceDict["vid"], deviceDict["pid"])] = deviceDict
-    
+
     availablePorts = QSerialPortInfo.availablePorts()
     for port in availablePorts:
         if port.hasVendorIdentifier() and port.hasProductIdentifier():
             supported = False
             vid = port.vendorIdentifier()
             pid = port.productIdentifier()
-            
+
             for board in SupportedBoards:
-                if (
-                    (vid, pid) in SupportedBoards[board]["ids"] or
-                    (vid, None) in SupportedBoards[board]["ids"]
-                ):
-                    if (
-                        board in ("bbc_microbit", "calliope") and
-                        (port.description().strip() !=
-                         SupportedBoards[board]["port_description"])
+                if (vid, pid) in SupportedBoards[board]["ids"] or (
+                    vid,
+                    None,
+                ) in SupportedBoards[board]["ids"]:
+                    if board in ("bbc_microbit", "calliope") and (
+                        port.description().strip()
+                        != SupportedBoards[board]["port_description"]
                     ):
                         # both boards have the same VID and PID
                         # try to differentiate based on port description
                         continue
-                    foundDevices.append((
+                    foundDevices.append(
+                        (
+                            board,
+                            port.description(),
+                            SupportedBoards[board]["description"],
+                            port.portName(),
+                            vid,
+                            pid,
+                        )
+                    )
+                    supported = True
+            if not supported and (vid, pid) in manualDevices:
+                # check the locally added ones next
+                board = manualDevices[(vid, pid)]["type"]
+                foundDevices.append(
+                    (
                         board,
                         port.description(),
                         SupportedBoards[board]["description"],
                         port.portName(),
                         vid,
                         pid,
-                    ))
-                    supported = True
-            if not supported and (vid, pid) in manualDevices:
-                # check the locally added ones next
-                board = manualDevices[(vid, pid)]["type"]
-                foundDevices.append((
-                    board,
-                    port.description(),
-                    SupportedBoards[board]["description"],
-                    port.portName(),
-                    vid,
-                    pid,
-                ))
+                    )
+                )
                 supported = True
             if not supported:
                 if vid and pid:
-                    if (
-                        (vid, pid) not in IgnoredBoards and
-                        (vid, None) not in IgnoredBoards
-                    ):
+                    if (vid, pid) not in IgnoredBoards and (
+                        vid,
+                        None,
+                    ) not in IgnoredBoards:
                         unknownDevices.append((vid, pid, port.description()))
-                        logging.debug("Unknown device: (0x%04x:0x%04x %s)",
-                                      vid, pid, port.description())
+                        logging.debug(
+                            "Unknown device: (0x%04x:0x%04x %s)",
+                            vid,
+                            pid,
+                            port.description(),
+                        )
                 else:
                     # either VID or PID or both not detected
                     desc = port.description()
                     if not desc:
-                        desc = QCoreApplication.translate("MicroPythonDevice",
-                                                          "Unknown Device")
+                        desc = QCoreApplication.translate(
+                            "MicroPythonDevice", "Unknown Device"
+                        )
                     unknownPorts.append((vid, pid, desc, port.portName()))
-    
+
     return foundDevices, unknownDevices, unknownPorts
 
 
 def getDeviceIcon(boardName, iconFormat=True):
     """
     Function to get the icon for the given board.
-    
+
     @param boardName name of the board
     @type str
     @param iconFormat flag indicating to get an icon or a pixmap
@@ -369,11 +367,12 @@
     """
     iconName = (
         SupportedBoards[boardName]["icon"]
-        if boardName in SupportedBoards else
+        if boardName in SupportedBoards
+        else
         # return a generic MicroPython icon
         "micropython48"
     )
-    
+
     if iconFormat:
         return UI.PixmapCache.getIcon(iconName)
     else:
@@ -383,7 +382,7 @@
 def getDevice(deviceType, microPythonWidget, vid, pid):
     """
     Public method to instantiate a specific MicroPython device interface.
-    
+
     @param deviceType type of the device interface
     @type str
     @param microPythonWidget reference to the main MicroPython widget
@@ -397,23 +396,28 @@
     """
     if deviceType == "esp":
         from .EspDevices import EspDevice
+
         return EspDevice(microPythonWidget, deviceType)
     elif deviceType == "circuitpython":
         from .CircuitPythonDevices import CircuitPythonDevice
+
         return CircuitPythonDevice(microPythonWidget, deviceType)
     elif deviceType in ("bbc_microbit", "calliope"):
         from .MicrobitDevices import MicrobitDevice
+
         return MicrobitDevice(microPythonWidget, deviceType)
     elif deviceType == "pyboard":
         from .PyBoardDevices import PyBoardDevice
+
         return PyBoardDevice(microPythonWidget, deviceType)
     elif deviceType == "rp2040":
         from .RP2040Devices import RP2040Device
+
         return RP2040Device(microPythonWidget, deviceType)
     elif deviceType == "generic":
         from .GenericMicroPythonDevices import GenericMicroPythonDevice
-        return GenericMicroPythonDevice(microPythonWidget, deviceType,
-                                        vid, pid)
+
+        return GenericMicroPythonDevice(microPythonWidget, deviceType, vid, pid)
     else:
         # nothing specific requested
         return MicroPythonDevice(microPythonWidget, deviceType)
@@ -423,10 +427,11 @@
     """
     Base class for the more specific MicroPython devices.
     """
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -435,150 +440,149 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self._deviceType = deviceType
         self.microPython = microPythonWidget
-    
+
     def getDeviceType(self):
         """
         Public method to get the device type.
-        
+
         @return type of the device
         @rtype str
         """
         return self._deviceType
-    
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         self.microPython.setActionButtons(
-            open=False, save=False,
-            run=False, repl=False, files=False, chart=False)
-    
+            open=False, save=False, run=False, repl=False, files=False, chart=False
+        )
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return True
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.tr("Unsupported Device")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return False, self.tr("REPL is not supported by this device.")
-    
+
     def setRepl(self, on):
         """
         Public method to set the REPL status and dependent status.
-        
+
         @param on flag indicating the active status
         @type bool
         """
         pass
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return False, self.tr("Plotter is not supported by this device.")
-    
+
     def setPlotter(self, on):
         """
         Public method to set the Plotter status and dependent status.
-        
+
         @param on flag indicating the active status
         @type bool
         """
         pass
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
-        return False, self.tr("Running scripts is not supported by this"
-                              " device.")
-    
+        return False, self.tr("Running scripts is not supported by this" " device.")
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pass
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return False, self.tr("File Manager is not supported by this device.")
-    
+
     def setFileManager(self, on):
         """
         Public method to set the File Manager status and dependent status.
-        
+
         @param on flag indicating the active status
         @type bool
         """
         pass
-    
+
     def supportsLocalFileAccess(self):
         """
         Public method to indicate file access via a local directory.
-        
+
         @return flag indicating file access via local directory
         @rtype bool
         """
-        return False        # default
-    
+        return False  # default
+
     def getWorkspace(self):
         """
         Public method to get the workspace directory.
-        
+
         @return workspace directory used for saving files
         @rtype str
         """
         return (
-            Preferences.getMicroPython("MpyWorkspace") or
-            Preferences.getMultiProject("Workspace") or
-            os.path.expanduser("~")
+            Preferences.getMicroPython("MpyWorkspace")
+            or Preferences.getMultiProject("Workspace")
+            or os.path.expanduser("~")
         )
-    
+
     def selectDeviceDirectory(self, deviceDirectories):
         """
         Public method to select the device directory from a list of detected
         ones.
-        
+
         @param deviceDirectories list of directories to select from
         @type list of str
         @return selected directory or an empty string
@@ -589,108 +593,112 @@
             self.tr("Select Device Directory"),
             self.tr("Select the directory for the connected device:"),
             [""] + deviceDirectories,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             return deviceDirectory
         else:
             # user cancelled
             return ""
-    
+
     def sendCommands(self, commandsList):
         """
         Public method to send a list of commands to the device.
-        
+
         @param commandsList list of commands to be sent to the device
         @type list of str
         """
-        rawOn = [       # sequence of commands to enter raw mode
-            b'\x02',            # Ctrl-B: exit raw repl (just in case)
-            b'\r\x03\x03\x03',  # Ctrl-C three times: interrupt any running
-                                # program
-            b'\r\x01',          # Ctrl-A: enter raw REPL
+        rawOn = [  # sequence of commands to enter raw mode
+            b"\x02",  # Ctrl-B: exit raw repl (just in case)
+            b"\r\x03\x03\x03",  # Ctrl-C three times: interrupt any running
+            # program
+            b"\r\x01",  # Ctrl-A: enter raw REPL
         ]
-        newLine = [b'print("\\n")\r', ]
-        commands = [c.encode("utf-8)") + b'\r' for c in commandsList]
-        commands.append(b'\r')
-        commands.append(b'\x04')
-        rawOff = [b'\x02', b'\x02']
+        newLine = [
+            b'print("\\n")\r',
+        ]
+        commands = [c.encode("utf-8)") + b"\r" for c in commandsList]
+        commands.append(b"\r")
+        commands.append(b"\x04")
+        rawOff = [b"\x02", b"\x02"]
         commandSequence = rawOn + newLine + commands + rawOff
         self.microPython.commandsInterface().executeAsync(commandSequence)
-    
+
     @pyqtSlot()
     def handleDataFlood(self):
         """
         Public slot handling a data floof from the device.
         """
         pass
-    
+
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         pass
-    
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return False
-    
+
     def hasTimeCommands(self):
         """
         Public method to check, if the device supports time commands.
-        
+
         The default returns True.
-        
+
         @return flag indicating support for time commands
         @rtype bool
         """
         return True
-    
+
     def hasDocumentationUrl(self):
         """
         Public method to check, if the device has a configured documentation
         URL.
-        
+
         @return flag indicating a configured documentation URL
         @rtype bool
         """
         return bool(self.getDocumentationUrl())
-    
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
         return ""
-    
+
     def hasFirmwareUrl(self):
         """
         Public method to check, if the device has a configured firmware
         download URL.
-        
+
         @return flag indicating a configured firmware download URL
         @rtype bool
         """
         return bool(self.getFirmwareUrl())
-    
+
     def getFirmwareUrl(self):
         """
         Public method to get the device firmware download URL.
-        
+
         @return firmware download URL of the device
         @rtype str
         """
         return ""
-    
+
     def downloadFirmware(self):
         """
         Public method to download the device firmware.
@@ -698,11 +706,11 @@
         url = self.getFirmwareUrl()
         if url:
             ericApp().getObject("UserInterface").launchHelpViewer(url)
-    
+
     def getDownloadMenuEntries(self):
         """
         Public method to retrieve the entries for the downloads menu.
-        
+
         @return list of tuples with menu text and URL to be opened for each
             entry
         @rtype list of tuple of (str, str)
--- a/src/eric7/MicroPython/MicroPythonFileManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonFileManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,10 @@
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, QObject
 
 from .MicroPythonFileSystemUtilities import (
-    mtime2string, mode2string, decoratedName, listdirStat
+    mtime2string,
+    mode2string,
+    decoratedName,
+    listdirStat,
 )
 
 
@@ -22,7 +25,7 @@
     """
     Class implementing an interface to the device file system commands with
     some additional sugar.
-    
+
     @signal longListFiles(result) emitted with a tuple of tuples containing the
         name, mode, size and time for each directory entry
     @signal currentDir(dirname) emitted to report the current directory of the
@@ -43,10 +46,11 @@
     @signal createDirectoryDone() emitted after a directory was created
     @signal fsinfoDone(fsinfo) emitted after the file system information was
         obtained
-    
+
     @signal error(exc) emitted with a failure message to indicate a failure
         during the most recent operation
     """
+
     longListFiles = pyqtSignal(tuple)
     currentDir = pyqtSignal(str)
     currentDirChanged = pyqtSignal(str)
@@ -58,44 +62,47 @@
     removeDirectoryDone = pyqtSignal()
     createDirectoryDone = pyqtSignal()
     fsinfoDone = pyqtSignal(tuple)
-    
+
     error = pyqtSignal(str, str)
-    
+
     def __init__(self, commandsInterface, parent=None):
         """
         Constructor
-        
+
         @param commandsInterface reference to the commands interface object
         @type MicroPythonCommandsInterface
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__commandsInterface = commandsInterface
-    
+
     @pyqtSlot(str)
     def lls(self, dirname, showHidden=False):
         """
         Public slot to get a long listing of the given directory.
-        
+
         @param dirname name of the directory to list
         @type str
         @param showHidden flag indicating to show hidden files as well
         @type bool
         """
         try:
-            filesList = self.__commandsInterface.lls(
-                dirname, showHidden=showHidden)
-            result = [(decoratedName(name, mode),
-                       mode2string(mode),
-                       str(size),
-                       mtime2string(mtime, adjustEpoch=True)) for
-                      name, (mode, size, mtime) in filesList]
+            filesList = self.__commandsInterface.lls(dirname, showHidden=showHidden)
+            result = [
+                (
+                    decoratedName(name, mode),
+                    mode2string(mode),
+                    str(size),
+                    mtime2string(mtime, adjustEpoch=True),
+                )
+                for name, (mode, size, mtime) in filesList
+            ]
             self.longListFiles.emit(tuple(result))
         except Exception as exc:
             self.error.emit("lls", str(exc))
-    
+
     @pyqtSlot()
     def pwd(self):
         """
@@ -106,12 +113,12 @@
             self.currentDir.emit(pwd)
         except Exception as exc:
             self.error.emit("pwd", str(exc))
-    
+
     @pyqtSlot(str)
     def cd(self, dirname):
         """
         Public slot to change the current directory of the device.
-        
+
         @param dirname name of the desired current directory
         @type str
         """
@@ -120,13 +127,13 @@
             self.currentDirChanged.emit(dirname)
         except Exception as exc:
             self.error.emit("cd", str(exc))
-    
+
     @pyqtSlot(str)
     @pyqtSlot(str, str)
     def get(self, deviceFileName, hostFileName=""):
         """
         Public slot to get a file from the connected device.
-        
+
         @param deviceFileName name of the file on the device
         @type str
         @param hostFileName name of the local file
@@ -134,20 +141,19 @@
         """
         if hostFileName and os.path.isdir(hostFileName):
             # only a local directory was given
-            hostFileName = os.path.join(hostFileName,
-                                        os.path.basename(deviceFileName))
+            hostFileName = os.path.join(hostFileName, os.path.basename(deviceFileName))
         try:
             self.__commandsInterface.get(deviceFileName, hostFileName)
             self.getFileDone.emit(deviceFileName, hostFileName)
         except Exception as exc:
             self.error.emit("get", str(exc))
-    
+
     @pyqtSlot(str)
     @pyqtSlot(str, str)
     def put(self, hostFileName, deviceFileName=""):
         """
         Public slot to put a file onto the device.
-        
+
         @param hostFileName name of the local file
         @type str
         @param deviceFileName name of the file on the connected device
@@ -158,12 +164,12 @@
             self.putFileDone.emit(hostFileName, deviceFileName)
         except Exception as exc:
             self.error.emit("put", str(exc))
-    
+
     @pyqtSlot(str)
     def delete(self, deviceFileName):
         """
         Public slot to delete a file on the device.
-        
+
         @param deviceFileName name of the file on the connected device
         @type str
         """
@@ -172,12 +178,18 @@
             self.deleteFileDone.emit(deviceFileName)
         except Exception as exc:
             self.error.emit("delete", str(exc))
-    
-    def __rsync(self, hostDirectory, deviceDirectory, mirror=True,
-                localDevice=False, indentLevel=0):
+
+    def __rsync(
+        self,
+        hostDirectory,
+        deviceDirectory,
+        mirror=True,
+        localDevice=False,
+        indentLevel=0,
+    ):
         """
         Private method to synchronize a local directory to the device.
-        
+
         @param hostDirectory name of the local directory
         @type str
         @param deviceDirectory name of the directory on the device
@@ -194,27 +206,28 @@
         """
         indent = 4 * "&nbsp;"
         errors = []
-        
+
         if not os.path.isdir(hostDirectory):
-            return [self.tr(
-                "The given name '{0}' is not a directory or does not exist.")
-                .format(hostDirectory)
+            return [
+                self.tr(
+                    "The given name '{0}' is not a directory or does not exist."
+                ).format(hostDirectory)
             ]
-        
+
         indentStr = indentLevel * indent
         self.rsyncProgressMessage.emit(
-            self.tr("{1}Synchronizing <b>{0}</b>.")
-            .format(deviceDirectory, indentStr)
+            self.tr("{1}Synchronizing <b>{0}</b>.").format(deviceDirectory, indentStr)
         )
-        
+
         doneMessage = self.tr("{1}Done synchronizing <b>{0}</b>.").format(
-            deviceDirectory, indentStr)
-        
+            deviceDirectory, indentStr
+        )
+
         sourceDict = {}
         sourceFiles = listdirStat(hostDirectory)
         for name, nstat in sourceFiles:
             sourceDict[name] = nstat
-        
+
         destinationDict = {}
         if localDevice:
             if not os.path.isdir(deviceDirectory):
@@ -229,7 +242,8 @@
         else:
             try:
                 destinationFiles = self.__commandsInterface.lls(
-                    deviceDirectory, fullstat=True)
+                    deviceDirectory, fullstat=True
+                )
             except Exception as exc:
                 return [str(exc)]
             if destinationFiles is None:
@@ -241,32 +255,36 @@
             else:
                 for name, nstat in destinationFiles:
                     destinationDict[name] = nstat
-        
+
         destinationSet = set(destinationDict.keys())
         sourceSet = set(sourceDict.keys())
-        toAdd = sourceSet - destinationSet                  # add to dev
-        toDelete = destinationSet - sourceSet               # delete from dev
-        toUpdate = destinationSet.intersection(sourceSet)   # update files
+        toAdd = sourceSet - destinationSet  # add to dev
+        toDelete = destinationSet - sourceSet  # delete from dev
+        toUpdate = destinationSet.intersection(sourceSet)  # update files
         indentStr = (indentLevel + 1) * indent
-        
+
         if localDevice:
             for sourceBasename in toAdd:
                 # name exists in source but not in device
                 sourceFilename = os.path.join(hostDirectory, sourceBasename)
                 destFilename = os.path.join(deviceDirectory, sourceBasename)
                 self.rsyncProgressMessage.emit(
-                    self.tr("{1}Adding <b>{0}</b>...")
-                    .format(destFilename, indentStr))
+                    self.tr("{1}Adding <b>{0}</b>...").format(destFilename, indentStr)
+                )
                 if os.path.isfile(sourceFilename):
                     shutil.copy2(sourceFilename, destFilename)
                 elif os.path.isdir(sourceFilename):
                     # recurse
-                    errs = self.__rsync(sourceFilename, destFilename,
-                                        mirror=mirror, localDevice=localDevice,
-                                        indentLevel=indentLevel + 1)
+                    errs = self.__rsync(
+                        sourceFilename,
+                        destFilename,
+                        mirror=mirror,
+                        localDevice=localDevice,
+                        indentLevel=indentLevel + 1,
+                    )
                     # just note issues but ignore them otherwise
                     errors.extend(errs)
-            
+
             if mirror:
                 for destBasename in toDelete:
                     # name exists in device but not local, delete
@@ -275,7 +293,7 @@
                         shutil.rmtree(destFilename, ignore_errors=True)
                     elif os.path.isfile(destFilename):
                         os.remove(destFilename)
-            
+
             for sourceBasename in toUpdate:
                 # names exist in both; do an update
                 sourceStat = sourceDict[sourceBasename]
@@ -286,32 +304,36 @@
                 if os.path.isdir(sourceFilename):
                     if os.path.isdir(destFilename):
                         # both are directories => recurs
-                        errs = self.__rsync(sourceFilename, destFilename,
-                                            mirror=mirror,
-                                            localDevice=localDevice,
-                                            indentLevel=indentLevel + 1)
+                        errs = self.__rsync(
+                            sourceFilename,
+                            destFilename,
+                            mirror=mirror,
+                            localDevice=localDevice,
+                            indentLevel=indentLevel + 1,
+                        )
                         # just note issues but ignore them otherwise
                         errors.extend(errs)
                     else:
                         self.rsyncProgressMessage.emit(
-                            self.tr("Source <b>{0}</b> is a directory and"
-                                    " destination <b>{1}</b> is a file."
-                                    " Ignoring it.")
-                            .format(sourceFilename, destFilename)
+                            self.tr(
+                                "Source <b>{0}</b> is a directory and"
+                                " destination <b>{1}</b> is a file."
+                                " Ignoring it."
+                            ).format(sourceFilename, destFilename)
                         )
                 else:
                     if os.path.isdir(destFilename):
                         self.rsyncProgressMessage.emit(
-                            self.tr("Source <b>{0}</b> is a file and"
-                                    " destination <b>{1}</b> is a directory."
-                                    " Ignoring it.")
-                            .format(sourceFilename, destFilename)
+                            self.tr(
+                                "Source <b>{0}</b> is a file and"
+                                " destination <b>{1}</b> is a directory."
+                                " Ignoring it."
+                            ).format(sourceFilename, destFilename)
                         )
                     else:
-                        if sourceStat[8] > destStat[8]:     # mtime
+                        if sourceStat[8] > destStat[8]:  # mtime
                             self.rsyncProgressMessage.emit(
-                                self.tr("Updating <b>{0}</b>...")
-                                .format(destFilename)
+                                self.tr("Updating <b>{0}</b>...").format(destFilename)
                             )
                         shutil.copy2(sourceFilename, destFilename)
         else:
@@ -320,46 +342,50 @@
                 sourceFilename = os.path.join(hostDirectory, sourceBasename)
                 destFilename = (
                     "/" + sourceBasename
-                    if deviceDirectory == "/" else
-                    deviceDirectory + "/" + sourceBasename
+                    if deviceDirectory == "/"
+                    else deviceDirectory + "/" + sourceBasename
                 )
                 self.rsyncProgressMessage.emit(
-                    self.tr("{1}Adding <b>{0}</b>...")
-                    .format(destFilename, indentStr))
+                    self.tr("{1}Adding <b>{0}</b>...").format(destFilename, indentStr)
+                )
                 if os.path.isfile(sourceFilename):
                     try:
-                        self.__commandsInterface.put(sourceFilename,
-                                                     destFilename)
+                        self.__commandsInterface.put(sourceFilename, destFilename)
                     except Exception as exc:
                         # just note issues but ignore them otherwise
                         errors.append(str(exc))
                 elif os.path.isdir(sourceFilename):
                     # recurse
-                    errs = self.__rsync(sourceFilename, destFilename,
-                                        mirror=mirror,
-                                        indentLevel=indentLevel + 1)
+                    errs = self.__rsync(
+                        sourceFilename,
+                        destFilename,
+                        mirror=mirror,
+                        indentLevel=indentLevel + 1,
+                    )
                     # just note issues but ignore them otherwise
                     errors.extend(errs)
-        
+
             if mirror:
                 for destBasename in toDelete:
                     # name exists in device but not local, delete
                     destFilename = (
                         "/" + sourceBasename
-                        if deviceDirectory == "/" else
-                        deviceDirectory + "/" + destBasename
+                        if deviceDirectory == "/"
+                        else deviceDirectory + "/" + destBasename
                     )
                     self.rsyncProgressMessage.emit(
-                        self.tr("{1}Removing <b>{0}</b>...")
-                        .format(destFilename, indentStr))
+                        self.tr("{1}Removing <b>{0}</b>...").format(
+                            destFilename, indentStr
+                        )
+                    )
                     try:
-                        self.__commandsInterface.rmrf(destFilename,
-                                                      recursive=True,
-                                                      force=True)
+                        self.__commandsInterface.rmrf(
+                            destFilename, recursive=True, force=True
+                        )
                     except Exception as exc:
                         # just note issues but ignore them otherwise
                         errors.append(str(exc))
-            
+
             for sourceBasename in toUpdate:
                 # names exist in both; do an update
                 sourceStat = sourceDict[sourceBasename]
@@ -367,57 +393,63 @@
                 sourceFilename = os.path.join(hostDirectory, sourceBasename)
                 destFilename = (
                     "/" + sourceBasename
-                    if deviceDirectory == "/" else
-                    deviceDirectory + "/" + sourceBasename
+                    if deviceDirectory == "/"
+                    else deviceDirectory + "/" + sourceBasename
                 )
                 destMode = destStat[0]
                 if os.path.isdir(sourceFilename):
                     if stat.S_ISDIR(destMode):
                         # both are directories => recurs
-                        errs = self.__rsync(sourceFilename, destFilename,
-                                            mirror=mirror,
-                                            indentLevel=indentLevel + 1)
+                        errs = self.__rsync(
+                            sourceFilename,
+                            destFilename,
+                            mirror=mirror,
+                            indentLevel=indentLevel + 1,
+                        )
                         # just note issues but ignore them otherwise
                         errors.extend(errs)
                     else:
                         self.rsyncProgressMessage.emit(
-                            self.tr("Source <b>{0}</b> is a directory and"
-                                    " destination <b>{1}</b> is a file."
-                                    " Ignoring it.")
-                            .format(sourceFilename, destFilename)
+                            self.tr(
+                                "Source <b>{0}</b> is a directory and"
+                                " destination <b>{1}</b> is a file."
+                                " Ignoring it."
+                            ).format(sourceFilename, destFilename)
                         )
                 else:
                     if stat.S_ISDIR(destMode):
                         self.rsyncProgressMessage.emit(
-                            self.tr("Source <b>{0}</b> is a file and"
-                                    " destination <b>{1}</b> is a directory."
-                                    " Ignoring it.")
-                            .format(sourceFilename, destFilename)
+                            self.tr(
+                                "Source <b>{0}</b> is a file and"
+                                " destination <b>{1}</b> is a directory."
+                                " Ignoring it."
+                            ).format(sourceFilename, destFilename)
                         )
                     else:
-                        if sourceStat[8] > destStat[8]:     # mtime
+                        if sourceStat[8] > destStat[8]:  # mtime
                             self.rsyncProgressMessage.emit(
-                                self.tr("{1}Updating <b>{0}</b>...")
-                                .format(destFilename, indentStr)
+                                self.tr("{1}Updating <b>{0}</b>...").format(
+                                    destFilename, indentStr
+                                )
                             )
                             try:
-                                self.__commandsInterface.put(sourceFilename,
-                                                             destFilename)
+                                self.__commandsInterface.put(
+                                    sourceFilename, destFilename
+                                )
                             except Exception as exc:
                                 errors.append(str(exc))
-        
+
         self.rsyncProgressMessage.emit(doneMessage)
-        
+
         return errors
-    
+
     @pyqtSlot(str, str)
     @pyqtSlot(str, str, bool)
     @pyqtSlot(str, str, bool, bool)
-    def rsync(self, hostDirectory, deviceDirectory, mirror=True,
-              localDevice=False):
+    def rsync(self, hostDirectory, deviceDirectory, mirror=True, localDevice=False):
         """
         Public slot to synchronize a local directory to the device.
-        
+
         @param hostDirectory name of the local directory
         @type str
         @param deviceDirectory name of the directory on the device
@@ -428,18 +460,19 @@
         @param localDevice flag indicating device access via local file system
         @type bool
         """
-        errors = self.__rsync(hostDirectory, deviceDirectory, mirror=mirror,
-                              localDevice=localDevice)
+        errors = self.__rsync(
+            hostDirectory, deviceDirectory, mirror=mirror, localDevice=localDevice
+        )
         if errors:
             self.error.emit("rsync", "\n".join(errors))
-        
+
         self.rsyncDone.emit(hostDirectory, deviceDirectory)
-    
+
     @pyqtSlot(str)
     def mkdir(self, dirname):
         """
         Public slot to create a new directory.
-        
+
         @param dirname name of the directory to create
         @type str
         """
@@ -448,13 +481,13 @@
             self.createDirectoryDone.emit()
         except Exception as exc:
             self.error.emit("mkdir", str(exc))
-    
+
     @pyqtSlot(str)
     @pyqtSlot(str, bool)
     def rmdir(self, dirname, recursive=False):
         """
         Public slot to (recursively) remove a directory.
-        
+
         @param dirname name of the directory to be removed
         @type str
         @param recursive flag indicating a recursive removal
@@ -462,14 +495,13 @@
         """
         try:
             if recursive:
-                self.__commandsInterface.rmrf(dirname, recursive=True,
-                                              force=True)
+                self.__commandsInterface.rmrf(dirname, recursive=True, force=True)
             else:
                 self.__commandsInterface.rmdir(dirname)
             self.removeDirectoryDone.emit()
         except Exception as exc:
             self.error.emit("rmdir", str(exc))
-    
+
     def fileSystemInfo(self):
         """
         Public method to obtain information about the currently mounted file
--- a/src/eric7/MicroPython/MicroPythonFileManagerWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonFileManagerWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint
 from PyQt6.QtWidgets import (
-    QWidget, QTreeWidgetItem, QHeaderView, QMenu, QInputDialog, QLineEdit,
-    QDialog
+    QWidget,
+    QTreeWidgetItem,
+    QHeaderView,
+    QMenu,
+    QInputDialog,
+    QLineEdit,
+    QDialog,
 )
 
 from EricWidgets import EricMessageBox, EricPathPickerDialog
@@ -25,7 +30,10 @@
 
 from .MicroPythonFileManager import MicroPythonFileManager
 from .MicroPythonFileSystemUtilities import (
-    mtime2string, mode2string, decoratedName, listdirStat
+    mtime2string,
+    mode2string,
+    decoratedName,
+    listdirStat,
 )
 
 from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
@@ -40,10 +48,11 @@
     """
     Class implementing a file manager for MicroPython devices.
     """
+
     def __init__(self, commandsInterface, deviceWithLocalAccess, parent=None):
         """
         Constructor
-        
+
         @param commandsInterface reference to the commands interface object
         @type MicroPythonCommandsInterface
         @param deviceWithLocalAccess flag indicating the device supports file
@@ -54,10 +63,10 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__repl = parent
         self.__deviceWithLocalAccess = deviceWithLocalAccess
-        
+
         self.syncButton.setIcon(UI.PixmapCache.getIcon("2rightarrow"))
         self.putButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
         self.putAsButton.setIcon(UI.PixmapCache.getIcon("putAs"))
@@ -69,23 +78,25 @@
         self.deviceUpButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.deviceHomeButton.setIcon(UI.PixmapCache.getIcon("home"))
         self.deviceReloadButton.setIcon(UI.PixmapCache.getIcon("reload"))
-        
+
         self.deviceUpButton.setEnabled(not self.__repl.isMicrobit())
         self.deviceHomeButton.setEnabled(not self.__repl.isMicrobit())
-        
+
         self.putButton.setEnabled(False)
         self.putAsButton.setEnabled(False)
         self.getButton.setEnabled(False)
         self.getAsButton.setEnabled(False)
-        
+
         self.localFileTreeWidget.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
+            0, Qt.SortOrder.AscendingOrder
+        )
         self.deviceFileTreeWidget.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+            0, Qt.SortOrder.AscendingOrder
+        )
+
         self.__progressInfoDialog = None
         self.__fileManager = MicroPythonFileManager(commandsInterface, self)
-        
+
         self.__fileManager.longListFiles.connect(self.__handleLongListFiles)
         self.__fileManager.currentDir.connect(self.__handleCurrentDir)
         self.__fileManager.currentDirChanged.connect(self.__handleCurrentDir)
@@ -93,50 +104,61 @@
         self.__fileManager.getFileDone.connect(self.__handleGetDone)
         self.__fileManager.rsyncDone.connect(self.__handleRsyncDone)
         self.__fileManager.rsyncProgressMessage.connect(
-            self.__handleRsyncProgressMessage)
+            self.__handleRsyncProgressMessage
+        )
         self.__fileManager.removeDirectoryDone.connect(self.__newDeviceList)
         self.__fileManager.createDirectoryDone.connect(self.__newDeviceList)
         self.__fileManager.deleteFileDone.connect(self.__newDeviceList)
         self.__fileManager.fsinfoDone.connect(self.__fsInfoResultReceived)
-        
+
         self.__fileManager.error.connect(self.__handleError)
-        
+
         self.localFileTreeWidget.customContextMenuRequested.connect(
-            self.__showLocalContextMenu)
+            self.__showLocalContextMenu
+        )
         self.deviceFileTreeWidget.customContextMenuRequested.connect(
-            self.__showDeviceContextMenu)
-        
+            self.__showDeviceContextMenu
+        )
+
         self.__localMenu = QMenu(self)
-        self.__localMenu.addAction(self.tr("Change Directory"),
-                                   self.__changeLocalDirectory)
+        self.__localMenu.addAction(
+            self.tr("Change Directory"), self.__changeLocalDirectory
+        )
         self.__localMenu.addAction(
-            self.tr("Create Directory"), self.__createLocalDirectory)
+            self.tr("Create Directory"), self.__createLocalDirectory
+        )
         self.__localDelDirTreeAct = self.__localMenu.addAction(
-            self.tr("Delete Directory Tree"), self.__deleteLocalDirectoryTree)
+            self.tr("Delete Directory Tree"), self.__deleteLocalDirectoryTree
+        )
         self.__localMenu.addSeparator()
         self.__localDelFileAct = self.__localMenu.addAction(
-            self.tr("Delete File"), self.__deleteLocalFile)
+            self.tr("Delete File"), self.__deleteLocalFile
+        )
         self.__localMenu.addSeparator()
         act = self.__localMenu.addAction(self.tr("Show Hidden Files"))
         act.setCheckable(True)
         act.setChecked(Preferences.getMicroPython("ShowHiddenLocal"))
         act.triggered[bool].connect(self.__localHiddenChanged)
-        
+
         self.__deviceMenu = QMenu(self)
         if not self.__repl.isMicrobit():
             self.__deviceMenu.addAction(
-                self.tr("Change Directory"), self.__changeDeviceDirectory)
+                self.tr("Change Directory"), self.__changeDeviceDirectory
+            )
             self.__deviceMenu.addAction(
-                self.tr("Create Directory"), self.__createDeviceDirectory)
+                self.tr("Create Directory"), self.__createDeviceDirectory
+            )
             if not self.__deviceWithLocalAccess:
                 self.__devDelDirAct = self.__deviceMenu.addAction(
-                    self.tr("Delete Directory"), self.__deleteDeviceDirectory)
+                    self.tr("Delete Directory"), self.__deleteDeviceDirectory
+                )
             self.__devDelDirTreeAct = self.__deviceMenu.addAction(
-                self.tr("Delete Directory Tree"),
-                self.__deleteDeviceDirectoryTree)
+                self.tr("Delete Directory Tree"), self.__deleteDeviceDirectoryTree
+            )
             self.__deviceMenu.addSeparator()
         self.__devDelFileAct = self.__deviceMenu.addAction(
-            self.tr("Delete File"), self.__deleteDeviceFile)
+            self.tr("Delete File"), self.__deleteDeviceFile
+        )
         self.__deviceMenu.addSeparator()
         act = self.__deviceMenu.addAction(self.tr("Show Hidden Files"))
         act.setCheckable(True)
@@ -145,8 +167,9 @@
         if not parent.isMicrobit():
             self.__deviceMenu.addSeparator()
             self.__deviceMenu.addAction(
-                self.tr("Show Filesystem Info"), self.__showFileSystemInfo)
-    
+                self.tr("Show Filesystem Info"), self.__showFileSystemInfo
+            )
+
     def start(self):
         """
         Public method to start the widget.
@@ -158,32 +181,32 @@
             dirname = os.path.dirname(aw.getFileName())
         if not dirname:
             dirname = (
-                Preferences.getMicroPython("MpyWorkspace") or
-                Preferences.getMultiProject("Workspace") or
-                os.path.expanduser("~")
+                Preferences.getMicroPython("MpyWorkspace")
+                or Preferences.getMultiProject("Workspace")
+                or os.path.expanduser("~")
             )
         self.__listLocalFiles(dirname)
-        
+
         if self.__deviceWithLocalAccess:
             dirname = self.__repl.getDeviceWorkspace()
             if dirname:
                 self.__listLocalFiles(dirname, True)
                 return
-        
+
         # list files via device script
         self.__fileManager.pwd()
-    
+
     def stop(self):
         """
         Public method to stop the widget.
         """
         pass
-    
+
     @pyqtSlot(str, str)
     def __handleError(self, method, error):
         """
         Private slot to handle errors.
-        
+
         @param method name of the method the error occured in
         @type str
         @param error error message
@@ -192,43 +215,47 @@
         EricMessageBox.warning(
             self,
             self.tr("Error handling device"),
-            self.tr("<p>There was an error communicating with the connected"
-                    " device.</p><p>Method: {0}</p><p>Message: {1}</p>")
-            .format(method, error))
-    
+            self.tr(
+                "<p>There was an error communicating with the connected"
+                " device.</p><p>Method: {0}</p><p>Message: {1}</p>"
+            ).format(method, error),
+        )
+
     @pyqtSlot(str)
     def __handleCurrentDir(self, dirname):
         """
         Private slot to handle a change of the current directory of the device.
-        
+
         @param dirname name of the current directory
         @type str
         """
         self.deviceCwd.setText(dirname)
         self.__newDeviceList()
-    
+
     @pyqtSlot(tuple)
     def __handleLongListFiles(self, filesList):
         """
         Private slot to receive a long directory listing.
-        
+
         @param filesList tuple containing tuples with name, mode, size and time
             for each directory entry
         @type tuple of (str, str, str, str)
         """
         self.deviceFileTreeWidget.clear()
         for name, mode, size, dateTime in filesList:
-            itm = QTreeWidgetItem(self.deviceFileTreeWidget,
-                                  [name, mode, size, dateTime])
+            itm = QTreeWidgetItem(
+                self.deviceFileTreeWidget, [name, mode, size, dateTime]
+            )
             itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
             itm.setTextAlignment(2, Qt.AlignmentFlag.AlignRight)
         self.deviceFileTreeWidget.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-    
+            QHeaderView.ResizeMode.ResizeToContents
+        )
+
     def __listLocalFiles(self, dirname="", localDevice=False):
         """
         Private method to populate the local files list.
-        
+
         @param dirname name of the local directory to be listed
         @type str
         @param localDevice flag indicating device access via local file system
@@ -244,34 +271,35 @@
         else:
             self.localCwd.setText(dirname)
             showHidden = Preferences.getMicroPython("ShowHiddenLocal")
-        
+
         filesStatList = listdirStat(dirname, showHidden=showHidden)
-        filesList = [(
-            decoratedName(f, s[0], os.path.isdir(os.path.join(dirname, f))),
-            mode2string(s[0]),
-            str(s[6]),
-            mtime2string(s[8])) for f, s in filesStatList]
+        filesList = [
+            (
+                decoratedName(f, s[0], os.path.isdir(os.path.join(dirname, f))),
+                mode2string(s[0]),
+                str(s[6]),
+                mtime2string(s[8]),
+            )
+            for f, s in filesStatList
+        ]
         fileTreeWidget = (
-            self.deviceFileTreeWidget
-            if localDevice else
-            self.localFileTreeWidget
+            self.deviceFileTreeWidget if localDevice else self.localFileTreeWidget
         )
         fileTreeWidget.clear()
         for item in filesList:
             itm = QTreeWidgetItem(fileTreeWidget, item)
             itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
             itm.setTextAlignment(2, Qt.AlignmentFlag.AlignRight)
-        fileTreeWidget.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-    
+        fileTreeWidget.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_localFileTreeWidget_itemActivated(self, item, column):
         """
         Private slot to handle the activation of a local item.
-        
+
         If the item is a directory, the list will be re-populated for this
         directory.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column column of the activation
@@ -283,7 +311,7 @@
             self.__listLocalFiles(name[:-1])
         elif Utilities.MimeTypes.isTextFile(name):
             ericApp().getObject("ViewManager").getEditor(name)
-    
+
     @pyqtSlot()
     def on_localFileTreeWidget_itemSelectionChanged(self):
         """
@@ -292,11 +320,11 @@
         enable = bool(len(self.localFileTreeWidget.selectedItems()))
         if enable:
             enable &= not (
-                self.localFileTreeWidget.selectedItems()[0].text(0)
-                .endswith("/"))
+                self.localFileTreeWidget.selectedItems()[0].text(0).endswith("/")
+            )
         self.putButton.setEnabled(enable)
         self.putAsButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_localUpButton_clicked(self):
         """
@@ -305,19 +333,19 @@
         cwd = self.localCwd.text()
         dirname = os.path.dirname(cwd)
         self.__listLocalFiles(dirname)
-    
+
     @pyqtSlot()
     def on_localHomeButton_clicked(self):
         """
         Private slot to change directory to the configured workspace.
         """
         dirname = (
-            Preferences.getMicroPython("MpyWorkspace") or
-            Preferences.getMultiProject("Workspace") or
-            os.path.expanduser("~")
+            Preferences.getMicroPython("MpyWorkspace")
+            or Preferences.getMultiProject("Workspace")
+            or os.path.expanduser("~")
         )
         self.__listLocalFiles(dirname)
-    
+
     @pyqtSlot()
     def on_localReloadButton_clicked(self):
         """
@@ -325,15 +353,15 @@
         """
         dirname = self.localCwd.text()
         self.__listLocalFiles(dirname)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_deviceFileTreeWidget_itemActivated(self, item, column):
         """
         Private slot to handle the activation of a device item.
-        
+
         If the item is a directory, the current working directory is changed
         and the list will be re-populated for this directory.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column column of the activation
@@ -355,7 +383,7 @@
             if name.endswith("/"):
                 # directory names end with a '/'
                 self.__fileManager.cd(name[:-1])
-    
+
     @pyqtSlot()
     def on_deviceFileTreeWidget_itemSelectionChanged(self):
         """
@@ -364,11 +392,11 @@
         enable = bool(len(self.deviceFileTreeWidget.selectedItems()))
         if enable:
             enable &= not (
-                self.deviceFileTreeWidget.selectedItems()[0].text(0)
-                .endswith("/"))
+                self.deviceFileTreeWidget.selectedItems()[0].text(0).endswith("/")
+            )
         self.getButton.setEnabled(enable)
         self.getAsButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_deviceUpButton_clicked(self):
         """
@@ -380,7 +408,7 @@
             self.__listLocalFiles(dirname, True)
         else:
             self.__fileManager.cd(dirname)
-    
+
     @pyqtSlot()
     def on_deviceHomeButton_clicked(self):
         """
@@ -391,10 +419,10 @@
             if dirname:
                 self.__listLocalFiles(dirname, True)
                 return
-        
+
         # list files via device script
         self.__fileManager.cd("/")
-    
+
     @pyqtSlot()
     def on_deviceReloadButton_clicked(self):
         """
@@ -408,11 +436,11 @@
                 self.__newDeviceList()
             else:
                 self.__fileManager.pwd()
-    
+
     def __isFileInList(self, filename, treeWidget):
         """
         Private method to check, if a file name is contained in a tree widget.
-        
+
         @param filename name of the file to check
         @type str
         @param treeWidget reference to the tree widget to be checked against
@@ -420,17 +448,15 @@
         @rtype bool
         """
         itemCount = treeWidget.topLevelItemCount()
-        return (
-            itemCount > 0 and
-            any(treeWidget.topLevelItem(row).text(0) == filename
-                for row in range(itemCount))
+        return itemCount > 0 and any(
+            treeWidget.topLevelItem(row).text(0) == filename for row in range(itemCount)
         )
-    
+
     @pyqtSlot()
     def on_putButton_clicked(self, putAs=False):
         """
         Private slot to copy the selected file to the connected device.
-        
+
         @param putAs flag indicating to give it a new name
         @type bool
         """
@@ -445,32 +471,35 @@
                         self.tr("Put File As"),
                         self.tr("Enter a new name for the file"),
                         QLineEdit.EchoMode.Normal,
-                        filename)
+                        filename,
+                    )
                     if not ok or not filename:
                         return
                 else:
                     deviceFilename = filename
-                
-                if self.__isFileInList(deviceFilename,
-                                       self.deviceFileTreeWidget):
+
+                if self.__isFileInList(deviceFilename, self.deviceFileTreeWidget):
                     # ask for overwrite permission
                     action, resultFilename = confirmOverwrite(
-                        deviceFilename, self.tr("Copy File to Device"),
-                        self.tr("The given file exists already"
-                                " (Enter file name only)."),
-                        False, self)
+                        deviceFilename,
+                        self.tr("Copy File to Device"),
+                        self.tr(
+                            "The given file exists already" " (Enter file name only)."
+                        ),
+                        False,
+                        self,
+                    )
                     if action == "cancel":
                         return
                     elif action == "rename":
                         deviceFilename = os.path.basename(resultFilename)
-                
+
                 if self.__deviceWithLocalAccess:
                     shutil.copy2(
                         os.path.join(self.localCwd.text(), filename),
-                        os.path.join(self.deviceCwd.text(), deviceFilename)
+                        os.path.join(self.deviceCwd.text(), deviceFilename),
                     )
-                    self.__listLocalFiles(self.deviceCwd.text(),
-                                          localDevice=True)
+                    self.__listLocalFiles(self.deviceCwd.text(), localDevice=True)
                 else:
                     deviceCwd = self.deviceCwd.text()
                     if deviceCwd:
@@ -479,10 +508,9 @@
                         else:
                             deviceFilename = "/" + deviceFilename
                     self.__fileManager.put(
-                        os.path.join(self.localCwd.text(), filename),
-                        deviceFilename
+                        os.path.join(self.localCwd.text(), filename), deviceFilename
                     )
-    
+
     @pyqtSlot()
     def on_putAsButton_clicked(self):
         """
@@ -490,12 +518,12 @@
         with a different name.
         """
         self.on_putButton_clicked(putAs=True)
-    
+
     @pyqtSlot()
     def on_getButton_clicked(self, getAs=False):
         """
         Private slot to copy the selected file from the connected device.
-        
+
         @param getAs flag indicating to give it a new name
         @type bool
         """
@@ -510,28 +538,31 @@
                         self.tr("Get File As"),
                         self.tr("Enter a new name for the file"),
                         QLineEdit.EchoMode.Normal,
-                        filename)
+                        filename,
+                    )
                     if not ok or not filename:
                         return
                 else:
                     localFilename = filename
-                
-                if self.__isFileInList(localFilename,
-                                       self.localFileTreeWidget):
+
+                if self.__isFileInList(localFilename, self.localFileTreeWidget):
                     # ask for overwrite permission
                     action, resultFilename = confirmOverwrite(
-                        localFilename, self.tr("Copy File from Device"),
+                        localFilename,
+                        self.tr("Copy File from Device"),
                         self.tr("The given file exists already."),
-                        True, self)
+                        True,
+                        self,
+                    )
                     if action == "cancel":
                         return
                     elif action == "rename":
                         localFilename = resultFilename
-                
+
                 if self.__deviceWithLocalAccess:
                     shutil.copy2(
                         os.path.join(self.deviceCwd.text(), filename),
-                        os.path.join(self.localCwd.text(), localFilename)
+                        os.path.join(self.localCwd.text(), localFilename),
                     )
                     self.__listLocalFiles(self.localCwd.text())
                 else:
@@ -539,10 +570,9 @@
                     if deviceCwd:
                         filename = deviceCwd + "/" + filename
                     self.__fileManager.get(
-                        filename,
-                        os.path.join(self.localCwd.text(), localFilename)
+                        filename, os.path.join(self.localCwd.text(), localFilename)
                     )
-    
+
     @pyqtSlot()
     def on_getAsButton_clicked(self):
         """
@@ -550,19 +580,19 @@
         with a different name.
         """
         self.on_getButton_clicked(getAs=True)
-    
+
     @pyqtSlot(str, str)
     def __handleGetDone(self, deviceFile, localFile):
         """
         Private slot handling a successful copy of a file from the device.
-        
+
         @param deviceFile name of the file on the device
         @type str
         @param localFile name of the local file
         @type str
         """
         self.__listLocalFiles(self.localCwd.text())
-    
+
     @pyqtSlot()
     def on_syncButton_clicked(self):
         """
@@ -574,12 +604,12 @@
             mirror=True,
             localDevice=self.__deviceWithLocalAccess,
         )
-    
+
     @pyqtSlot(str, str)
     def __handleRsyncDone(self, localDir, deviceDir):
         """
         Private method to handle the completion of the rsync operation.
-        
+
         @param localDir name of the local directory
         @type str
         @param deviceDir name of the device directory
@@ -588,25 +618,25 @@
         # simulate button presses to reload the two lists
         self.on_localReloadButton_clicked()
         self.on_deviceReloadButton_clicked()
-    
+
     @pyqtSlot(str)
     def __handleRsyncProgressMessage(self, message):
         """
         Private slot handling progress messages sent by the file manager.
-        
+
         @param message message to be shown
         @type str
         """
         if self.__progressInfoDialog is None:
-            from .MicroPythonProgressInfoDialog import (
-                MicroPythonProgressInfoDialog
-            )
+            from .MicroPythonProgressInfoDialog import MicroPythonProgressInfoDialog
+
             self.__progressInfoDialog = MicroPythonProgressInfoDialog(self)
             self.__progressInfoDialog.finished.connect(
-                self.__progressInfoDialogFinished)
+                self.__progressInfoDialogFinished
+            )
         self.__progressInfoDialog.show()
         self.__progressInfoDialog.addMessage(message)
-    
+
     @pyqtSlot()
     def __progressInfoDialogFinished(self):
         """
@@ -614,7 +644,7 @@
         """
         self.__progressInfoDialog.deleteLater()
         self.__progressInfoDialog = None
-    
+
     @pyqtSlot()
     def __newDeviceList(self):
         """
@@ -622,18 +652,18 @@
         """
         self.__fileManager.lls(
             self.deviceCwd.text(),
-            showHidden=Preferences.getMicroPython("ShowHiddenDevice")
+            showHidden=Preferences.getMicroPython("ShowHiddenDevice"),
         )
-    
+
     ##################################################################
     ## Context menu methods for the local files below
     ##################################################################
-    
+
     @pyqtSlot(QPoint)
     def __showLocalContextMenu(self, pos):
         """
         Private slot to show the REPL context menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
@@ -647,19 +677,19 @@
             isFile = False
         self.__localDelDirTreeAct.setEnabled(isDir)
         self.__localDelFileAct.setEnabled(isFile)
-        
+
         self.__localMenu.exec(self.localFileTreeWidget.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def __changeLocalDirectory(self, localDevice=False):
         """
         Private slot to change the local directory.
-        
+
         @param localDevice flag indicating device access via local file system
         @type bool
         """
         cwdWidget = self.deviceCwd if localDevice else self.localCwd
-        
+
         dirPath, ok = EricPathPickerDialog.getPath(
             self,
             self.tr("Change Directory"),
@@ -673,42 +703,43 @@
                 dirPath = os.path.join(cwdWidget.text(), dirPath)
             cwdWidget.setText(dirPath)
             self.__listLocalFiles(dirPath, localDevice=localDevice)
-    
+
     @pyqtSlot()
     def __createLocalDirectory(self, localDevice=False):
         """
         Private slot to create a local directory.
-        
+
         @param localDevice flag indicating device access via local file system
         @type bool
         """
         cwdWidget = self.deviceCwd if localDevice else self.localCwd
-        
+
         dirPath, ok = QInputDialog.getText(
             self,
             self.tr("Create Directory"),
             self.tr("Enter directory name:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and dirPath:
             dirPath = os.path.join(cwdWidget.text(), dirPath)
             try:
                 os.mkdir(dirPath)
-                self.__listLocalFiles(cwdWidget.text(),
-                                      localDevice=localDevice)
+                self.__listLocalFiles(cwdWidget.text(), localDevice=localDevice)
             except OSError as exc:
                 EricMessageBox.critical(
                     self,
                     self.tr("Create Directory"),
-                    self.tr("""<p>The directory <b>{0}</b> could not be"""
-                            """ created.</p><p>Reason: {1}</p>""").format(
-                        dirPath, str(exc))
+                    self.tr(
+                        """<p>The directory <b>{0}</b> could not be"""
+                        """ created.</p><p>Reason: {1}</p>"""
+                    ).format(dirPath, str(exc)),
                 )
-    
+
     @pyqtSlot()
     def __deleteLocalDirectoryTree(self, localDevice=False):
         """
         Private slot to delete a local directory tree.
-        
+
         @param localDevice flag indicating device access via local file system
         @type bool
         """
@@ -718,35 +749,35 @@
         else:
             cwdWidget = self.localCwd
             fileTreeWidget = self.localFileTreeWidget
-        
+
         if bool(len(fileTreeWidget.selectedItems())):
             name = fileTreeWidget.selectedItems()[0].text(0)
             dirname = os.path.join(cwdWidget.text(), name[:-1])
             dlg = DeleteFilesConfirmationDialog(
                 self,
                 self.tr("Delete Directory Tree"),
-                self.tr(
-                    "Do you really want to delete this directory tree?"),
-                [dirname])
+                self.tr("Do you really want to delete this directory tree?"),
+                [dirname],
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 try:
                     shutil.rmtree(dirname)
-                    self.__listLocalFiles(cwdWidget.text(),
-                                          localDevice=localDevice)
+                    self.__listLocalFiles(cwdWidget.text(), localDevice=localDevice)
                 except Exception as exc:
                     EricMessageBox.critical(
                         self,
                         self.tr("Delete Directory Tree"),
-                        self.tr("""<p>The directory <b>{0}</b> could not be"""
-                                """ deleted.</p><p>Reason: {1}</p>""").format(
-                            dirname, str(exc))
+                        self.tr(
+                            """<p>The directory <b>{0}</b> could not be"""
+                            """ deleted.</p><p>Reason: {1}</p>"""
+                        ).format(dirname, str(exc)),
                     )
-    
+
     @pyqtSlot()
     def __deleteLocalFile(self, localDevice=False):
         """
         Private slot to delete a local file.
-        
+
         @param localDevice flag indicating device access via local file system
         @type bool
         """
@@ -756,50 +787,50 @@
         else:
             cwdWidget = self.localCwd
             fileTreeWidget = self.localFileTreeWidget
-        
+
         if bool(len(fileTreeWidget.selectedItems())):
             name = fileTreeWidget.selectedItems()[0].text(0)
             filename = os.path.join(cwdWidget.text(), name)
             dlg = DeleteFilesConfirmationDialog(
                 self,
                 self.tr("Delete File"),
-                self.tr(
-                    "Do you really want to delete this file?"),
-                [filename])
+                self.tr("Do you really want to delete this file?"),
+                [filename],
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 try:
                     os.remove(filename)
-                    self.__listLocalFiles(cwdWidget.text(),
-                                          localDevice=localDevice)
+                    self.__listLocalFiles(cwdWidget.text(), localDevice=localDevice)
                 except OSError as exc:
                     EricMessageBox.critical(
                         self,
                         self.tr("Delete File"),
-                        self.tr("""<p>The file <b>{0}</b> could not be"""
-                                """ deleted.</p><p>Reason: {1}</p>""").format(
-                            filename, str(exc))
+                        self.tr(
+                            """<p>The file <b>{0}</b> could not be"""
+                            """ deleted.</p><p>Reason: {1}</p>"""
+                        ).format(filename, str(exc)),
                     )
-    
+
     @pyqtSlot(bool)
     def __localHiddenChanged(self, checked):
         """
         Private slot handling a change of the local show hidden menu entry.
-        
+
         @param checked new check state of the action
         @type bool
         """
         Preferences.setMicroPython("ShowHiddenLocal", checked)
         self.on_localReloadButton_clicked()
-    
+
     ##################################################################
     ## Context menu methods for the device files below
     ##################################################################
-    
+
     @pyqtSlot(QPoint)
     def __showDeviceContextMenu(self, pos):
         """
         Private slot to show the REPL context menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
@@ -816,14 +847,14 @@
                 self.__devDelDirAct.setEnabled(isDir)
             self.__devDelDirTreeAct.setEnabled(isDir)
         self.__devDelFileAct.setEnabled(isFile)
-        
+
         self.__deviceMenu.exec(self.deviceFileTreeWidget.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def __changeDeviceDirectory(self):
         """
         Private slot to change the current directory of the device.
-        
+
         Note: This triggers a re-population of the device list for the new
         current directory.
         """
@@ -835,12 +866,13 @@
                 self.tr("Change Directory"),
                 self.tr("Enter the directory path on the device:"),
                 QLineEdit.EchoMode.Normal,
-                self.deviceCwd.text())
+                self.deviceCwd.text(),
+            )
             if ok and dirPath:
                 if not dirPath.startswith("/"):
                     dirPath = self.deviceCwd.text() + "/" + dirPath
                 self.__fileManager.cd(dirPath)
-    
+
     @pyqtSlot()
     def __createDeviceDirectory(self):
         """
@@ -853,10 +885,11 @@
                 self,
                 self.tr("Create Directory"),
                 self.tr("Enter directory name:"),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and dirPath:
                 self.__fileManager.mkdir(dirPath)
-    
+
     @pyqtSlot()
     def __deleteDeviceDirectory(self):
         """
@@ -878,12 +911,12 @@
                 dlg = DeleteFilesConfirmationDialog(
                     self,
                     self.tr("Delete Directory"),
-                    self.tr(
-                        "Do you really want to delete this directory?"),
-                    [dirname])
+                    self.tr("Do you really want to delete this directory?"),
+                    [dirname],
+                )
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     self.__fileManager.rmdir(dirname)
-    
+
     @pyqtSlot()
     def __deleteDeviceDirectoryTree(self):
         """
@@ -906,12 +939,12 @@
                 dlg = DeleteFilesConfirmationDialog(
                     self,
                     self.tr("Delete Directory Tree"),
-                    self.tr(
-                        "Do you really want to delete this directory tree?"),
-                    [dirname])
+                    self.tr("Do you really want to delete this directory tree?"),
+                    [dirname],
+                )
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     self.__fileManager.rmdir(dirname, recursive=True)
-    
+
     @pyqtSlot()
     def __deleteDeviceFile(self):
         """
@@ -933,35 +966,35 @@
                 dlg = DeleteFilesConfirmationDialog(
                     self,
                     self.tr("Delete File"),
-                    self.tr(
-                        "Do you really want to delete this file?"),
-                    [filename])
+                    self.tr("Do you really want to delete this file?"),
+                    [filename],
+                )
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     self.__fileManager.delete(filename)
-    
+
     @pyqtSlot(bool)
     def __deviceHiddenChanged(self, checked):
         """
         Private slot handling a change of the device show hidden menu entry.
-        
+
         @param checked new check state of the action
         @type bool
         """
         Preferences.setMicroPython("ShowHiddenDevice", checked)
         self.on_deviceReloadButton_clicked()
-    
+
     @pyqtSlot()
     def __showFileSystemInfo(self):
         """
         Private slot to show some file system information.
         """
         self.__fileManager.fileSystemInfo()
-    
+
     @pyqtSlot(tuple)
     def __fsInfoResultReceived(self, fsinfo):
         """
         Private slot to show the file system information of the device.
-        
+
         @param fsinfo tuple of tuples containing the file system name, the
             total size, the used size and the free size
         @type tuple of tuples of (str, int, int, int)
@@ -975,12 +1008,10 @@
                 "<tr><td>Used Size: </td><td align='right'>{2}</td></tr>"
                 "<tr><td>Free Size: </td><td align='right'>{3}</td></tr>"
                 "</table>"
-            ).format(name,
-                     Globals.dataString(totalSize),
-                     Globals.dataString(usedSize),
-                     Globals.dataString(freeSize),
-                     )
-        EricMessageBox.information(
-            self,
-            self.tr("Filesystem Information"),
-            msg)
+            ).format(
+                name,
+                Globals.dataString(totalSize),
+                Globals.dataString(usedSize),
+                Globals.dataString(freeSize),
+            )
+        EricMessageBox.information(self, self.tr("Filesystem Information"), msg)
--- a/src/eric7/MicroPython/MicroPythonFileSystemUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonFileSystemUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,7 @@
 def mtime2string(mtime, adjustEpoch=False):
     """
     Function to convert a time value to a string representation.
-    
+
     @param mtime time value
     @type int
     @param adjustEpoch flag indicating to adjust the time for the difference
@@ -35,7 +35,7 @@
 def mode2string(mode):
     """
     Function to convert a mode value to a string representation.
-    
+
     @param mode mode value
     @type int
     @return string representation of the given mode value
@@ -47,7 +47,7 @@
 def decoratedName(name, mode, isDir=False):
     """
     Function to decorate the given name according to the given mode.
-    
+
     @param name file or directory name
     @type str
     @param mode mode value
@@ -71,7 +71,7 @@
 def isVisible(name, showHidden):
     """
     Function to check, if a filesystem entry is a hidden file or directory.
-    
+
     @param name name to be checked
     @type str
     @param showHidden flag indicating to show hidden files as well
@@ -79,16 +79,13 @@
     @return flag indicating a visible filesystem entry
     @rtype bool
     """
-    return (
-        showHidden or
-        (not name.startswith(".") and not name.endswith("~"))
-    )
+    return showHidden or (not name.startswith(".") and not name.endswith("~"))
 
 
 def fstat(filename):
     """
     Function to get the stat() of file.
-    
+
     @param filename name of the file
     @type str
     @return tuple containing the stat() result
@@ -104,7 +101,7 @@
 def listdirStat(dirname, showHidden=False):
     """
     Function to get a list of directory entries and associated stat() tuples.
-    
+
     @param dirname name of the directory to list
     @type str
     @param showHidden flag indicating to show hidden files as well
@@ -117,9 +114,10 @@
         files = os.listdir(dirname) if dirname else os.listdir()
     except OSError:
         return []
-    
-    if dirname in ('', '/'):
+
+    if dirname in ("", "/"):
         return [(f, fstat(f)) for f in files if isVisible(f, showHidden)]
-    
-    return [(f, fstat(os.path.join(dirname, f))) for f in files
-            if isVisible(f, showHidden)]
+
+    return [
+        (f, fstat(os.path.join(dirname, f))) for f in files if isVisible(f, showHidden)
+    ]
--- a/src/eric7/MicroPython/MicroPythonGraphWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonGraphWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,8 +17,14 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt
 from PyQt6.QtGui import QPainter
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QVBoxLayout, QToolButton, QSizePolicy, QSpacerItem,
-    QLabel, QSpinBox
+    QWidget,
+    QHBoxLayout,
+    QVBoxLayout,
+    QToolButton,
+    QSizePolicy,
+    QSpacerItem,
+    QLabel,
+    QSpinBox,
 )
 from PyQt6.QtCharts import QChartView, QChart, QLineSeries, QValueAxis
 
@@ -32,99 +38,103 @@
 class MicroPythonGraphWidget(QWidget):
     """
     Class implementing the MicroPython graph widget.
-    
+
     @signal dataFlood emitted to indicate, that too much data is received
     """
+
     dataFlood = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__layout = QHBoxLayout()
         self.__layout.setContentsMargins(2, 2, 2, 2)
         self.setLayout(self.__layout)
-        
+
         self.__chartView = QChartView(self)
         self.__chartView.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding
+        )
         self.__layout.addWidget(self.__chartView)
-        
+
         self.__verticalLayout = QVBoxLayout()
         self.__verticalLayout.setContentsMargins(0, 0, 0, 0)
         self.__layout.addLayout(self.__verticalLayout)
-        
+
         self.__saveButton = QToolButton(self)
         self.__saveButton.setIcon(UI.PixmapCache.getIcon("fileSave"))
         self.__saveButton.setToolTip(self.tr("Press to save the raw data"))
         self.__saveButton.clicked.connect(self.on_saveButton_clicked)
         self.__verticalLayout.addWidget(self.__saveButton)
-        self.__verticalLayout.setAlignment(self.__saveButton,
-                                           Qt.AlignmentFlag.AlignHCenter)
-        
-        spacerItem = QSpacerItem(20, 20, QSizePolicy.Policy.Minimum,
-                                 QSizePolicy.Policy.Expanding)
+        self.__verticalLayout.setAlignment(
+            self.__saveButton, Qt.AlignmentFlag.AlignHCenter
+        )
+
+        spacerItem = QSpacerItem(
+            20, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.__verticalLayout.addItem(spacerItem)
-        
+
         label = QLabel(self.tr("max. X:"))
         self.__verticalLayout.addWidget(label)
-        self.__verticalLayout.setAlignment(label,
-                                           Qt.AlignmentFlag.AlignHCenter)
-        
+        self.__verticalLayout.setAlignment(label, Qt.AlignmentFlag.AlignHCenter)
+
         self.__maxX = 100
         self.__maxXSpinBox = QSpinBox()
         self.__maxXSpinBox.setMinimum(100)
         self.__maxXSpinBox.setMaximum(1000)
         self.__maxXSpinBox.setSingleStep(100)
-        self.__maxXSpinBox.setToolTip(self.tr(
-            "Enter the maximum number of data points to be plotted."))
+        self.__maxXSpinBox.setToolTip(
+            self.tr("Enter the maximum number of data points to be plotted.")
+        )
         self.__maxXSpinBox.setValue(self.__maxX)
         self.__maxXSpinBox.setAlignment(Qt.AlignmentFlag.AlignRight)
         self.__verticalLayout.addWidget(self.__maxXSpinBox)
-        
+
         # holds the data to be checked for plotable data
         self.__inputBuffer = []
         # holds the raw data
         self.__rawData = []
         self.__dirty = False
-        
+
         self.__maxY = 1000
         self.__flooded = False  # flag indicating a data flood
-        
+
         self.__data = [deque([0] * self.__maxX)]
         self.__series = [QLineSeries()]
-        
+
         # Y-axis ranges
         self.__yRanges = [1, 5, 10, 25, 50, 100, 250, 500, 1000]
-        
+
         # setup the chart
         self.__chart = QChart()
         self.__chart.legend().hide()
         self.__chart.addSeries(self.__series[0])
-        
+
         self.__axisX = QValueAxis()
         self.__axisX.setLabelFormat("time")
         self.__chart.addAxis(self.__axisX, Qt.AlignmentFlag.AlignBottom)
         self.__series[0].attachAxis(self.__axisX)
         self.__axisX.setRange(0, self.__maxX)
-        
+
         self.__axisY = QValueAxis()
         self.__axisY.setLabelFormat("%d")
         self.__chart.addAxis(self.__axisY, Qt.AlignmentFlag.AlignLeft)
         self.__series[0].attachAxis(self.__axisY)
         self.__axisY.setRange(-self.__maxY, self.__maxY)
-        
+
         self.__chartView.setChart(self.__chart)
         self.__chartView.setRenderHint(QPainter.RenderHint.Antialiasing)
         self.preferencesChanged()
-        
+
         self.__maxXSpinBox.valueChanged.connect(self.__handleMaxXChanged)
-    
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
@@ -140,17 +150,17 @@
                 self.__chart.setTheme(QChart.ChartTheme.ChartThemeLight)
         else:
             self.__chart.setTheme(chartColorTheme)
-    
+
     @pyqtSlot(bytes)
     def processData(self, data):
         """
         Public slot to process the raw data.
-        
+
         It takes raw bytes, checks the data for a valid tuple of ints or
         floats and adds the data to the graph. If the the length of the bytes
         data is greater than 1024 then a dataFlood signal is emitted to ensure
         eric can take action to remain responsive.
-        
+
         @param data raw data received from the connected device via the main
             device widget
         @type bytes
@@ -158,19 +168,19 @@
         # flooding guard
         if self.__flooded:
             return
-        
+
         if len(data) > 1024:
             self.__flooded = True
             self.dataFlood.emit()
             return
-        
+
         # disable the inputs while processing data
         self.__saveButton.setEnabled(False)
         self.__maxXSpinBox.setEnabled(False)
-        
+
         data = data.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
         self.__inputBuffer.append(data)
-        
+
         # check if the data contains a Python tuple containing numbers (int
         # or float) on a single line
         inputBytes = b"".join(self.__inputBuffer)
@@ -179,7 +189,7 @@
             if not line.endswith(b"\n"):
                 # incomplete line (last line); skip it
                 break
-            
+
             line = line.strip()
             if line.startswith(b"(") and line.endswith(b")"):
                 # it may be a tuple we are interested in
@@ -197,32 +207,32 @@
                         continue
                 if values:
                     self.__addData(tuple(values))
-        
+
         self.__inputBuffer = []
         if lines[-1] and not lines[-1].endswith(b"\n"):
             # Append any left over bytes for processing next time data is
             # received.
             self.__inputBuffer.append(lines[-1])
-        
+
         # re-enable the inputs
         self.__saveButton.setEnabled(True)
         self.__maxXSpinBox.setEnabled(True)
-    
+
     def __addData(self, values):
         """
         Private method to add a tuple of values to the graph.
-        
+
         It ensures there are the required number of line series, adds the data
         to the line series and updates the range of the chart so the chart
         displays nicely.
-        
+
         @param values tuple containing the data to be added
         @type tuple of int or float
         """
         # store incoming data to be able to dump it as CSV upon request
         self.__rawData.append(values)
         self.__dirty = True
-        
+
         # check number of incoming values and adjust line series accordingly
         if len(values) != len(self.__series):
             valuesLen = len(values)
@@ -242,16 +252,17 @@
                     self.__chart.removeSeries(oldSeries)
                 self.__series = self.__series[:valuesLen]
                 self.__data = self.__data[:valuesLen]
-        
+
         # add the new values to the display and compute the maximum range
         maxRanges = []
         for index, value in enumerate(values):
             self.__data[index].appendleft(value)
-            maxRanges.append(max([max(self.__data[index]),
-                                  abs(min(self.__data[index]))]))
+            maxRanges.append(
+                max([max(self.__data[index]), abs(min(self.__data[index]))])
+            )
             if len(self.__data[index]) > self.__maxX:
                 self.__data[index].pop()
-        
+
         # re-scale the y-axis
         maxYRange = max(maxRanges)
         yRange = bisect.bisect_left(self.__yRanges, maxYRange)
@@ -262,13 +273,13 @@
         elif maxYRange < self.__maxY / 2:
             self.__maxY /= 2
         self.__axisY.setRange(-self.__maxY, self.__maxY)
-        
+
         # ensure that floats are used to label the y-axis if the range is small
         if self.__maxY <= 5:
             self.__axisY.setLabelFormat("%2.2f")
         else:
             self.__axisY.setLabelFormat("%d")
-        
+
         # update the line series
         for index, series in enumerate(self.__series):
             series.clear()
@@ -278,49 +289,49 @@
                 xyValues.append((x, value))
             for xy in xyValues:
                 series.append(*xy)
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to save the raw data to a CSV file.
         """
         self.saveData()
-    
+
     def hasData(self):
         """
         Public method to check, if the chart contains some valid data.
-        
+
         @return flag indicating valid data
         @rtype bool
         """
         return len(self.__rawData) > 0
-    
+
     def isDirty(self):
         """
         Public method to check, if the chart contains unsaved data.
-        
+
         @return flag indicating unsaved data
         @rtype bool
         """
         return self.hasData() and self.__dirty
-    
+
     def saveData(self):
         """
         Public method to save the dialog's raw data.
-        
+
         @return flag indicating success
         @rtype bool
         """
         baseDir = (
-            Preferences.getMicroPython("MpyWorkspace") or
-            Preferences.getMultiProject("Workspace") or
-            os.path.expanduser("~")
+            Preferences.getMicroPython("MpyWorkspace")
+            or Preferences.getMultiProject("Workspace")
+            or os.path.expanduser("~")
         )
         dataDir = os.path.join(baseDir, "data_capture")
-        
+
         if not os.path.exists(dataDir):
             os.makedirs(dataDir)
-        
+
         # save the raw data as a CSV file
         fileName = "{0}.csv".format(time.strftime("%Y%m%d-%H%M%S"))
         fullPath = os.path.join(dataDir, fileName)
@@ -328,7 +339,7 @@
             with open(fullPath, "w") as csvFile:
                 csvWriter = csv.writer(csvFile)
                 csvWriter.writerows(self.__rawData)
-            
+
             self.__dirty = False
             return True
         except OSError as err:
@@ -337,15 +348,16 @@
                 self.tr("Save Chart Data"),
                 self.tr(
                     """<p>The chart data could not be saved into file"""
-                    """ <b>{0}</b>.</p><p>Reason: {1}</p>""").format(
-                    fullPath, str(err)))
+                    """ <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                ).format(fullPath, str(err)),
+            )
             return False
-    
+
     @pyqtSlot(int)
     def __handleMaxXChanged(self, value):
         """
         Private slot handling a change of the max. X spin box.
-        
+
         @param value value of the spin box
         @type int
         """
@@ -363,6 +375,6 @@
             for deq in self.__data:
                 data.append(deque(list(deq)[:value]))
             self.__data = data
-        
+
         self.__maxX = value
         self.__axisX.setRange(0, self.__maxX)
--- a/src/eric7/MicroPython/MicroPythonProgressInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonProgressInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,21 +18,22 @@
     """
     Class implementing a dialog to show progress messages.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-    
+
     @pyqtSlot(str)
     def addMessage(self, message):
         """
         Public slot to add a message to the progress display.
-        
+
         @param message progress information to be shown
         @type str
         """
--- a/src/eric7/MicroPython/MicroPythonSerialPort.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonSerialPort.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,34 +17,35 @@
     Class implementing a QSerialPort with additional functionality for
     MicroPython devices.
     """
+
     def __init__(self, timeout=10000, parent=None):
         """
         Constructor
-        
+
         @param timeout timout in milliseconds to be set
         @type int
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__connected = False
-        self.__timeout = timeout      # 10s default timeout
+        self.__timeout = timeout  # 10s default timeout
         self.__timedOut = False
-    
+
     def setTimeout(self, timeout):
         """
         Public method to set the timeout for device operations.
-        
+
         @param timeout timout in milliseconds to be set
         @type int
         """
         self.__timeout = timeout
-    
+
     def openSerialLink(self, port):
         """
         Public method to open a serial link to a given serial port.
-        
+
         @param port port name to connect to
         @type str
         @return flag indicating success
@@ -58,44 +59,44 @@
             self.setDataBits(QSerialPort.DataBits.Data8)
             self.setParity(QSerialPort.Parity.NoParity)
             self.setStopBits(QSerialPort.StopBits.OneStop)
-            
+
             self.__connected = True
             return True
         else:
             return False
-    
+
     def closeSerialLink(self):
         """
         Public method to close the open serial connection.
         """
         if self.__connected:
             self.close()
-            
+
             self.__connected = False
-    
+
     def isConnected(self):
         """
         Public method to get the connection state.
-        
+
         @return flag indicating the connection state
         @rtype bool
         """
         return self.__connected
-    
+
     def hasTimedOut(self):
         """
         Public method to check, if the last 'readUntil' has timed out.
-        
+
         @return flag indicating a timeout
         @@rtype bool
         """
         return self.__timedOut
-    
+
     def readUntil(self, expected=b"\n", size=None):
         r"""
         Public method to read data until an expected sequence is found
         (default: \n) or a specific size is exceeded.
-        
+
         @param expected expected bytes sequence
         @type bytes
         @param size maximum data to be read
@@ -105,11 +106,12 @@
         """
         data = bytearray()
         self.__timedOut = False
-        
+
         t = QTime.currentTime()
         while True:
             QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
             c = bytes(self.read(1))
             if c:
                 data += c
@@ -120,5 +122,5 @@
             if t.msecsTo(QTime.currentTime()) > self.__timeout:
                 self.__timedOut = True
                 break
-        
+
         return bytes(data)
--- a/src/eric7/MicroPython/MicroPythonWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicroPythonWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,8 +15,15 @@
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QPoint, QEvent
 from PyQt6.QtGui import QColor, QKeySequence, QTextCursor, QBrush, QClipboard
 from PyQt6.QtWidgets import (
-    QWidget, QMenu, QApplication, QHBoxLayout, QSpacerItem, QSizePolicy,
-    QTextEdit, QToolButton, QDialog
+    QWidget,
+    QMenu,
+    QApplication,
+    QHBoxLayout,
+    QSpacerItem,
+    QSizePolicy,
+    QTextEdit,
+    QToolButton,
+    QDialog,
 )
 
 from EricWidgets.EricZoomWidget import EricZoomWidget
@@ -29,14 +36,18 @@
 
 from . import MicroPythonDevices
 from . import UF2FlashDialog
+
 try:
     from .MicroPythonGraphWidget import MicroPythonGraphWidget
+
     HAS_QTCHART = True
 except ImportError:
     HAS_QTCHART = False
 from .MicroPythonFileManagerWidget import MicroPythonFileManagerWidget
+
 try:
     from .MicroPythonCommandsInterface import MicroPythonCommandsInterface
+
     HAS_QTSERIALPORT = True
 except ImportError:
     HAS_QTSERIALPORT = False
@@ -182,92 +193,90 @@
 class MicroPythonWidget(QWidget, Ui_MicroPythonWidget):
     """
     Class implementing the MicroPython REPL widget.
-    
+
     @signal dataReceived(data) emitted to send data received via the serial
         connection for further processing
     """
+
     ZoomMin = -10
     ZoomMax = 20
-    
+
     DeviceTypeRole = Qt.ItemDataRole.UserRole
     DeviceBoardRole = Qt.ItemDataRole.UserRole + 1
     DevicePortRole = Qt.ItemDataRole.UserRole + 2
     DeviceVidRole = Qt.ItemDataRole.UserRole + 3
     DevicePidRole = Qt.ItemDataRole.UserRole + 4
-    
+
     dataReceived = pyqtSignal(bytes)
-    
+
     ManualMarker = "<manual>"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         self.__ui = parent
-        
+
         self.__superMenu = QMenu(self)
         self.__superMenu.aboutToShow.connect(self.__aboutToShowSuperMenu)
-        
-        self.menuButton.setObjectName(
-            "micropython_supermenu_button")
+
+        self.menuButton.setObjectName("micropython_supermenu_button")
         self.menuButton.setIcon(UI.PixmapCache.getIcon("superMenu"))
         self.menuButton.setToolTip(self.tr("MicroPython Menu"))
-        self.menuButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
-        self.menuButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.menuButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.menuButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.menuButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.menuButton.setAutoRaise(True)
         self.menuButton.setShowMenuInside(True)
         self.menuButton.setMenu(self.__superMenu)
-        
-        self.deviceIconLabel.setPixmap(MicroPythonDevices.getDeviceIcon(
-            "", False))
-        
+
+        self.deviceIconLabel.setPixmap(MicroPythonDevices.getDeviceIcon("", False))
+
         self.openButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSaveAs"))
-        
+
         self.checkButton.setIcon(UI.PixmapCache.getIcon("question"))
         self.runButton.setIcon(UI.PixmapCache.getIcon("start"))
         self.replButton.setIcon(UI.PixmapCache.getIcon("terminal"))
         self.filesButton.setIcon(UI.PixmapCache.getIcon("filemanager"))
         self.chartButton.setIcon(UI.PixmapCache.getIcon("chart"))
         self.connectButton.setIcon(UI.PixmapCache.getIcon("linkConnect"))
-        
+
         self.__zoomLayout = QHBoxLayout()
-        spacerItem = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding,
-                                 QSizePolicy.Policy.Minimum)
+        spacerItem = QSpacerItem(
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         self.__zoomLayout.addSpacerItem(spacerItem)
-        
+
         self.__zoom0 = self.replEdit.fontPointSize()
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         self.__zoomLayout.addWidget(self.__zoomWidget)
-        self.layout().insertLayout(
-            self.layout().count() - 1,
-            self.__zoomLayout)
+        self.layout().insertLayout(self.layout().count() - 1, self.__zoomLayout)
         self.__zoomWidget.setMinimum(self.ZoomMin)
         self.__zoomWidget.setMaximum(self.ZoomMax)
         self.__zoomWidget.valueChanged.connect(self.__doZoom)
         self.__currentZoom = 0
-        
+
         self.__fileManagerWidget = None
         self.__chartWidget = None
-        
+
         self.__unknownPorts = []
         self.__lastPort = None
         self.__lastDeviceType = None
-        
+
         if HAS_QTSERIALPORT:
             self.__interface = MicroPythonCommandsInterface(self)
         else:
@@ -275,229 +284,241 @@
         self.__device = None
         self.__connected = False
         self.__setConnected(False)
-        
+
         if not HAS_QTSERIALPORT:
-            self.replEdit.setHtml(self.tr(
-                "<h3>The QtSerialPort package is not available.<br/>"
-                "MicroPython support is deactivated.</h3>"))
+            self.replEdit.setHtml(
+                self.tr(
+                    "<h3>The QtSerialPort package is not available.<br/>"
+                    "MicroPython support is deactivated.</h3>"
+                )
+            )
             self.setEnabled(False)
             return
-        
+
         self.__vt100Re = re.compile(
-            r'(?P<count>\d*)(?P<color>(?:;?\d*)*)(?P<action>[ABCDKm])')
-        
+            r"(?P<count>\d*)(?P<color>(?:;?\d*)*)(?P<action>[ABCDKm])"
+        )
+
         self.__populateDeviceTypeComboBox()
-        
+
         self.replEdit.installEventFilter(self)
         # Hack to intercept middle button paste
         self.__origReplEditMouseReleaseEvent = self.replEdit.mouseReleaseEvent
         self.replEdit.mouseReleaseEvent = self.__replEditMouseReleaseEvent
-        
-        self.replEdit.customContextMenuRequested.connect(
-            self.__showContextMenu)
+
+        self.replEdit.customContextMenuRequested.connect(self.__showContextMenu)
         self.__ui.preferencesChanged.connect(self.__handlePreferencesChanged)
-        self.__ui.preferencesChanged.connect(
-            self.__interface.handlePreferencesChanged)
-        
+        self.__ui.preferencesChanged.connect(self.__interface.handlePreferencesChanged)
+
         self.__handlePreferencesChanged()
-        
+
         charFormat = self.replEdit.currentCharFormat()
         self.DefaultForeground = charFormat.foreground()
         self.DefaultBackground = charFormat.background()
-    
+
     def __populateDeviceTypeComboBox(self):
         """
         Private method to populate the device type selector.
         """
         currentDevice = self.deviceTypeComboBox.currentText()
-        
+
         self.deviceTypeComboBox.clear()
         self.deviceInfoLabel.clear()
-        
+
         self.deviceTypeComboBox.addItem("", "")
-        devices, unknownDevices, unknownPorts = (
-            MicroPythonDevices.getFoundDevices()
-        )
+        devices, unknownDevices, unknownPorts = MicroPythonDevices.getFoundDevices()
         if devices:
             supportedMessage = self.tr(
-                "%n supported device(s) detected.", "", len(devices))
-            
-            for index, (boardType, boardName, description, portName,
-                        vid, pid) in enumerate(sorted(devices), 1):
+                "%n supported device(s) detected.", "", len(devices)
+            )
+
+            for index, (
+                boardType,
+                boardName,
+                description,
+                portName,
+                vid,
+                pid,
+            ) in enumerate(sorted(devices), 1):
                 self.deviceTypeComboBox.addItem(
-                    self.tr("{0} - {1} ({2})",
-                            "board name, description, port name")
-                    .format(boardName, description, portName)
+                    self.tr(
+                        "{0} - {1} ({2})", "board name, description, port name"
+                    ).format(boardName, description, portName)
                 )
                 self.deviceTypeComboBox.setItemData(
-                    index, boardType, self.DeviceTypeRole)
+                    index, boardType, self.DeviceTypeRole
+                )
                 self.deviceTypeComboBox.setItemData(
-                    index, boardName, self.DeviceBoardRole)
+                    index, boardName, self.DeviceBoardRole
+                )
                 self.deviceTypeComboBox.setItemData(
-                    index, portName, self.DevicePortRole)
-                self.deviceTypeComboBox.setItemData(
-                    index, vid, self.DeviceVidRole)
-                self.deviceTypeComboBox.setItemData(
-                    index, pid, self.DevicePidRole)
-            
+                    index, portName, self.DevicePortRole
+                )
+                self.deviceTypeComboBox.setItemData(index, vid, self.DeviceVidRole)
+                self.deviceTypeComboBox.setItemData(index, pid, self.DevicePidRole)
+
         else:
             supportedMessage = self.tr("No supported devices detected.")
-        
+
         self.__unknownPorts = unknownPorts
         if self.__unknownPorts:
             unknownMessage = self.tr(
-                "\n%n unknown device(s) for manual selection.", "",
-                len(self.__unknownPorts))
+                "\n%n unknown device(s) for manual selection.",
+                "",
+                len(self.__unknownPorts),
+            )
             if self.deviceTypeComboBox.count():
-                self.deviceTypeComboBox.insertSeparator(
-                    self.deviceTypeComboBox.count())
+                self.deviceTypeComboBox.insertSeparator(self.deviceTypeComboBox.count())
             self.deviceTypeComboBox.addItem(self.tr("Manual Selection"))
             self.deviceTypeComboBox.setItemData(
                 self.deviceTypeComboBox.count() - 1,
-                self.ManualMarker, self.DeviceTypeRole)
+                self.ManualMarker,
+                self.DeviceTypeRole,
+            )
         else:
             unknownMessage = ""
-        
+
         self.deviceInfoLabel.setText(supportedMessage + unknownMessage)
-        
-        index = self.deviceTypeComboBox.findText(currentDevice,
-                                                 Qt.MatchFlag.MatchExactly)
+
+        index = self.deviceTypeComboBox.findText(
+            currentDevice, Qt.MatchFlag.MatchExactly
+        )
         if index == -1:
             # entry is no longer present
             index = 0
             if self.__connected:
                 # we are still connected, so disconnect
                 self.on_connectButton_clicked()
-        
+
         self.on_deviceTypeComboBox_activated(index)
         self.deviceTypeComboBox.setCurrentIndex(index)
-        
+
         if unknownDevices:
             ignoredUnknown = {
-                tuple(d)
-                for d in Preferences.getMicroPython("IgnoredUnknownDevices")
+                tuple(d) for d in Preferences.getMicroPython("IgnoredUnknownDevices")
             }
-            uf2Devices = {(*x[2], x[1])
-                          for x in UF2FlashDialog.getFoundDevices()}
-            newUnknownDevices = (
-                set(unknownDevices) - ignoredUnknown - uf2Devices
-            )
+            uf2Devices = {(*x[2], x[1]) for x in UF2FlashDialog.getFoundDevices()}
+            newUnknownDevices = set(unknownDevices) - ignoredUnknown - uf2Devices
             if newUnknownDevices:
                 button = EricMessageBox.information(
                     self,
                     self.tr("Unknown MicroPython Device"),
                     self.tr(
-                        '<p>Detected these unknown serial devices</p>'
-                        '<ul>'
-                        '<li>{0}</li>'
-                        '</ul>'
-                        '<p>Please report them together with the board name'
+                        "<p>Detected these unknown serial devices</p>"
+                        "<ul>"
+                        "<li>{0}</li>"
+                        "</ul>"
+                        "<p>Please report them together with the board name"
                         ' and a short description to <a href="mailto:{1}">'
-                        ' the eric bug reporting address</a> if it is a'
-                        ' MicroPython board.</p>'
-                    ).format("</li><li>".join([
-                        self.tr("{0} (0x{1:04x}/0x{2:04x})",
-                                "description, VId, PId").format(
-                            desc, vid, pid)
-                        for vid, pid, desc in newUnknownDevices]),
-                        BugAddress),
-                    EricMessageBox.Ignore | EricMessageBox.Ok
+                        " the eric bug reporting address</a> if it is a"
+                        " MicroPython board.</p>"
+                    ).format(
+                        "</li><li>".join(
+                            [
+                                self.tr(
+                                    "{0} (0x{1:04x}/0x{2:04x})", "description, VId, PId"
+                                ).format(desc, vid, pid)
+                                for vid, pid, desc in newUnknownDevices
+                            ]
+                        ),
+                        BugAddress,
+                    ),
+                    EricMessageBox.Ignore | EricMessageBox.Ok,
                 )
                 if button == EricMessageBox.Ignore:
                     ignoredUnknown = list(ignoredUnknown | newUnknownDevices)
-                    Preferences.setMicroPython("IgnoredUnknownDevices",
-                                               ignoredUnknown)
+                    Preferences.setMicroPython("IgnoredUnknownDevices", ignoredUnknown)
                 else:
                     yes = EricMessageBox.yesNo(
                         self,
                         self.tr("Unknown MicroPython Device"),
-                        self.tr("""Would you like to add them to the list of"""
-                                """ manually configured devices?"""),
-                        yesDefault=True)
+                        self.tr(
+                            """Would you like to add them to the list of"""
+                            """ manually configured devices?"""
+                        ),
+                        yesDefault=True,
+                    )
                     if yes:
                         self.__addUnknownDevices(list(newUnknownDevices))
-    
+
     def __handlePreferencesChanged(self):
         """
         Private slot to handle a change in preferences.
         """
         self.__colorScheme = Preferences.getMicroPython("ColorScheme")
-        
+
         self.__font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.replEdit.setFontFamily(self.__font.family())
         self.replEdit.setFontPointSize(self.__font.pointSize())
-        
+
         if Preferences.getMicroPython("ReplLineWrap"):
             self.replEdit.setLineWrapMode(QTextEdit.LineWrapMode.WidgetWidth)
         else:
             self.replEdit.setLineWrapMode(QTextEdit.LineWrapMode.NoWrap)
-        
+
         if self.__chartWidget is not None:
             self.__chartWidget.preferencesChanged()
-    
+
     def commandsInterface(self):
         """
         Public method to get a reference to the commands interface object.
-        
+
         @return reference to the commands interface object
         @rtype MicroPythonCommandsInterface
         """
         return self.__interface
-    
+
     def isMicrobit(self):
         """
         Public method to check, if the connected/selected device is a
         BBC micro:bit or Calliope mini.
-        
+
         @return flag indicating a micro:bit device
         rtype bool
         """
         if self.__device and (
-            "micro:bit" in self.__device.deviceName() or
-            "Calliope" in self.__device.deviceName()
+            "micro:bit" in self.__device.deviceName()
+            or "Calliope" in self.__device.deviceName()
         ):
             return True
-        
+
         return False
-    
+
     @pyqtSlot(int)
     def on_deviceTypeComboBox_activated(self, index):
         """
         Private slot handling the selection of a device type.
-        
+
         @param index index of the selected device
         @type int
         """
-        deviceType = self.deviceTypeComboBox.itemData(
-            index, self.DeviceTypeRole)
+        deviceType = self.deviceTypeComboBox.itemData(index, self.DeviceTypeRole)
         if deviceType == self.ManualMarker:
             self.connectButton.setEnabled(bool(self.__unknownPorts))
         else:
-            self.deviceIconLabel.setPixmap(MicroPythonDevices.getDeviceIcon(
-                deviceType, False))
-            
-            vid = self.deviceTypeComboBox.itemData(
-                index, self.DeviceVidRole)
-            pid = self.deviceTypeComboBox.itemData(
-                index, self.DevicePidRole)
-            
-            self.__device = MicroPythonDevices.getDevice(deviceType, self,
-                                                         vid, pid)
+            self.deviceIconLabel.setPixmap(
+                MicroPythonDevices.getDeviceIcon(deviceType, False)
+            )
+
+            vid = self.deviceTypeComboBox.itemData(index, self.DeviceVidRole)
+            pid = self.deviceTypeComboBox.itemData(index, self.DevicePidRole)
+
+            self.__device = MicroPythonDevices.getDevice(deviceType, self, vid, pid)
             self.__device.setButtons()
-            
+
             self.connectButton.setEnabled(bool(deviceType))
-    
+
     @pyqtSlot()
     def on_checkButton_clicked(self):
         """
         Private slot to check for connected devices.
         """
         self.__populateDeviceTypeComboBox()
-    
+
     def setActionButtons(self, **kwargs):
         """
         Public method to set the enabled state of the various action buttons.
-        
+
         @keyparam kwargs keyword arguments containg the enabled states (keys
             are 'run', 'repl', 'files', 'chart', 'open', 'save'
         @type dict
@@ -514,12 +535,12 @@
             self.filesButton.setEnabled(kwargs["files"])
         if "chart" in kwargs:
             self.chartButton.setEnabled(kwargs["chart"] and HAS_QTCHART)
-    
+
     @pyqtSlot(QPoint)
     def __showContextMenu(self, pos):
         """
         Private slot to show the REPL context menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
@@ -531,65 +552,73 @@
             copyKeys = QKeySequence("Ctrl+Shift+C")
             pasteKeys = QKeySequence("Ctrl+Shift+V")
             selectAllKeys = QKeySequence("Ctrl+Shift+A")
-        
+
         menu = QMenu(self)
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editDelete"), self.tr("Clear"),
-            self.__clear)
+            UI.PixmapCache.getIcon("editDelete"), self.tr("Clear"), self.__clear
+        )
         act.setEnabled(bool(self.replEdit.toPlainText()))
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"),
-            copyKeys, self.replEdit.copy)
+            UI.PixmapCache.getIcon("editCopy"),
+            self.tr("Copy"),
+            copyKeys,
+            self.replEdit.copy,
+        )
         act.setEnabled(self.replEdit.textCursor().hasSelection())
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editPaste"), self.tr("Paste"),
-            pasteKeys, self.__paste)
-        act.setEnabled(self.replEdit.canPaste() and
-                       self.__interface.isConnected())
+            UI.PixmapCache.getIcon("editPaste"),
+            self.tr("Paste"),
+            pasteKeys,
+            self.__paste,
+        )
+        act.setEnabled(self.replEdit.canPaste() and self.__interface.isConnected())
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editSelectAll"), self.tr("Select All"),
-            selectAllKeys, self.replEdit.selectAll)
+            UI.PixmapCache.getIcon("editSelectAll"),
+            self.tr("Select All"),
+            selectAllKeys,
+            self.replEdit.selectAll,
+        )
         act.setEnabled(bool(self.replEdit.toPlainText()))
-        
+
         menu.exec(self.replEdit.mapToGlobal(pos))
-    
+
     def __setConnected(self, connected):
         """
         Private method to set the connection status LED.
-        
+
         @param connected connection state
         @type bool
         """
         self.__connected = connected
-        
+
         self.deviceConnectedLed.setOn(connected)
         if self.__fileManagerWidget:
             self.__fileManagerWidget.deviceConnectedLed.setOn(connected)
-        
+
         self.deviceTypeComboBox.setEnabled(not connected)
-        
+
         if connected:
-            self.connectButton.setIcon(
-                UI.PixmapCache.getIcon("linkDisconnect"))
-            self.connectButton.setToolTip(self.tr(
-                "Press to disconnect the current device"))
+            self.connectButton.setIcon(UI.PixmapCache.getIcon("linkDisconnect"))
+            self.connectButton.setToolTip(
+                self.tr("Press to disconnect the current device")
+            )
         else:
-            self.connectButton.setIcon(
-                UI.PixmapCache.getIcon("linkConnect"))
-            self.connectButton.setToolTip(self.tr(
-                "Press to connect the selected device"))
-    
+            self.connectButton.setIcon(UI.PixmapCache.getIcon("linkConnect"))
+            self.connectButton.setToolTip(
+                self.tr("Press to connect the selected device")
+            )
+
     def isConnected(self):
         """
         Public method to get the connection state.
-        
+
         @return connection state
         @rtype bool
         """
         return self.__connected
-    
+
     def __showNoDeviceMessage(self):
         """
         Private method to show a message dialog indicating a missing device.
@@ -597,58 +626,63 @@
         EricMessageBox.critical(
             self,
             self.tr("No device attached"),
-            self.tr("""Please ensure the device is plugged into your"""
-                    """ computer and selected.\n\nIt must have a version"""
-                    """ of MicroPython (or CircuitPython) flashed onto"""
-                    """ it before anything will work.\n\nFinally press"""
-                    """ the device's reset button and wait a few seconds"""
-                    """ before trying again."""))
-    
+            self.tr(
+                """Please ensure the device is plugged into your"""
+                """ computer and selected.\n\nIt must have a version"""
+                """ of MicroPython (or CircuitPython) flashed onto"""
+                """ it before anything will work.\n\nFinally press"""
+                """ the device's reset button and wait a few seconds"""
+                """ before trying again."""
+            ),
+        )
+
     @pyqtSlot(bool)
     def on_replButton_clicked(self, checked):
         """
         Private slot to connect to enable or disable the REPL widget.
-       
+
         If the selected device is not connected yet, this will be done now.
-        
+
         @param checked state of the button
         @type bool
         """
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         if checked:
             ok, reason = self.__device.canStartRepl()
             if not ok:
                 EricMessageBox.warning(
                     self,
                     self.tr("Start REPL"),
-                    self.tr("""<p>The REPL cannot be started.</p><p>Reason:"""
-                            """ {0}</p>""").format(reason))
+                    self.tr(
+                        """<p>The REPL cannot be started.</p><p>Reason:"""
+                        """ {0}</p>"""
+                    ).format(reason),
+                )
                 return
-            
+
             self.replEdit.clear()
             self.__interface.dataReceived.connect(self.__processData)
-            
+
             if not self.__interface.isConnected():
                 self.__connectToDevice()
                 if self.__device.forceInterrupt():
                     # send a Ctrl-B (exit raw mode)
-                    self.__interface.write(b'\x02')
+                    self.__interface.write(b"\x02")
                     # send Ctrl-C (keyboard interrupt)
-                    self.__interface.write(b'\x03')
-            
+                    self.__interface.write(b"\x03")
+
             self.__device.setRepl(True)
             self.replEdit.setFocus(Qt.FocusReason.OtherFocusReason)
         else:
             self.__interface.dataReceived.disconnect(self.__processData)
-            if (not self.chartButton.isChecked() and
-                    not self.filesButton.isChecked()):
+            if not self.chartButton.isChecked() and not self.filesButton.isChecked():
                 self.__disconnectFromDevice()
             self.__device.setRepl(False)
         self.replButton.setChecked(checked)
-    
+
     @pyqtSlot()
     def on_connectButton_clicked(self):
         """
@@ -658,7 +692,7 @@
         if self.__connected:
             with EricOverrideCursor():
                 self.__disconnectFromDevice()
-            
+
             if self.replButton.isChecked():
                 self.on_replButton_clicked(False)
             if self.filesButton.isChecked():
@@ -668,7 +702,7 @@
         else:
             with EricOverrideCursor():
                 self.__connectToDevice()
-    
+
     @pyqtSlot()
     def __clear(self):
         """
@@ -676,12 +710,12 @@
         """
         self.replEdit.clear()
         self.__interface.isConnected() and self.__interface.write(b"\r")
-    
+
     @pyqtSlot()
     def __paste(self, mode=QClipboard.Mode.Clipboard):
         """
         Private slot to perform a paste operation.
-        
+
         @param mode paste mode (defaults to QClipboard.Mode.Clipboard)
         @type QClipboard.Mode (optional)
         """
@@ -690,15 +724,16 @@
         if clipboard:
             pasteText = clipboard.text(mode=mode)
             if pasteText:
-                pasteText = pasteText.replace('\n\r', '\r')
-                pasteText = pasteText.replace('\n', '\r')
+                pasteText = pasteText.replace("\n\r", "\r")
+                pasteText = pasteText.replace("\n", "\r")
                 self.__interface.isConnected() and self.__interface.write(
-                    pasteText.encode("utf-8"))
-    
+                    pasteText.encode("utf-8")
+                )
+
     def eventFilter(self, obj, evt):
         """
         Public method to process events for the REPL pane.
-        
+
         @param obj reference to the object the event was meant for
         @type QObject
         @param evt reference to the event object
@@ -709,43 +744,45 @@
         if obj is self.replEdit and evt.type() == QEvent.Type.KeyPress:
             # handle the key press event on behalve of the REPL pane
             key = evt.key()
-            msg = bytes(evt.text(), 'utf8')
+            msg = bytes(evt.text(), "utf8")
             if key == Qt.Key.Key_Backspace:
-                msg = b'\b'
+                msg = b"\b"
             elif key == Qt.Key.Key_Delete:
-                msg = b'\x1B[\x33\x7E'
+                msg = b"\x1B[\x33\x7E"
             elif key == Qt.Key.Key_Up:
-                msg = b'\x1B[A'
+                msg = b"\x1B[A"
             elif key == Qt.Key.Key_Down:
-                msg = b'\x1B[B'
+                msg = b"\x1B[B"
             elif key == Qt.Key.Key_Right:
-                msg = b'\x1B[C'
+                msg = b"\x1B[C"
             elif key == Qt.Key.Key_Left:
-                msg = b'\x1B[D'
+                msg = b"\x1B[D"
             elif key == Qt.Key.Key_Home:
-                msg = b'\x1B[H'
+                msg = b"\x1B[H"
             elif key == Qt.Key.Key_End:
-                msg = b'\x1B[F'
-            elif ((Globals.isMacPlatform() and
-                   evt.modifiers() == Qt.KeyboardModifier.MetaModifier) or
-                  (not Globals.isMacPlatform() and
-                   evt.modifiers() == Qt.KeyboardModifier.ControlModifier)):
+                msg = b"\x1B[F"
+            elif (
+                Globals.isMacPlatform()
+                and evt.modifiers() == Qt.KeyboardModifier.MetaModifier
+            ) or (
+                not Globals.isMacPlatform()
+                and evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+            ):
                 if Qt.Key.Key_A <= key <= Qt.Key.Key_Z:
                     # devices treat an input of \x01 as Ctrl+A, etc.
                     msg = bytes([1 + key - Qt.Key.Key_A])
-            elif (
-                evt.modifiers() == (
-                    Qt.KeyboardModifier.ControlModifier |
-                    Qt.KeyboardModifier.ShiftModifier) or
-                (Globals.isMacPlatform() and
-                 evt.modifiers() == Qt.KeyboardModifier.ControlModifier)
+            elif evt.modifiers() == (
+                Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier
+            ) or (
+                Globals.isMacPlatform()
+                and evt.modifiers() == Qt.KeyboardModifier.ControlModifier
             ):
                 if key == Qt.Key.Key_C:
                     self.replEdit.copy()
-                    msg = b''
+                    msg = b""
                 elif key == Qt.Key.Key_V:
                     self.__paste()
-                    msg = b''
+                    msg = b""
                 elif key == Qt.Key.Key_A:
                     self.replEdit.selectAll()
                     msg = b""
@@ -758,32 +795,32 @@
         else:
             # standard event processing
             return super().eventFilter(obj, evt)
-    
+
     def __replEditMouseReleaseEvent(self, evt):
         """
         Private method handling mouse release events for the replEdit widget.
-        
+
         Note: this is a hack because QTextEdit does not allow filtering of
         QEvent.Type.MouseButtonRelease. To make middle button paste work, we
         had to intercept the protected event method (some kind of
         reimplementing it).
-        
+
         @param evt reference to the event object
         @type QMouseEvent
         """
         if evt.button() == Qt.MouseButton.MiddleButton:
             self.__paste(mode=QClipboard.Mode.Selection)
-            msg = b''
+            msg = b""
             if self.__interface.isConnected():
                 self.__interface.write(msg)
             evt.accept()
         else:
             self.__origReplEditMouseReleaseEvent(evt)
-    
+
     def __processData(self, data):
         """
         Private slot to process bytes received from the device.
-        
+
         @param data bytes received from the device
         @type bytes
         """
@@ -791,96 +828,92 @@
         # the text cursor must be on the last line
         while tc.movePosition(QTextCursor.MoveOperation.Down):
             pass
-        
+
         # set the font
         charFormat = tc.charFormat()
         charFormat.setFontFamilies([self.__font.family()])
         charFormat.setFontPointSize(self.__font.pointSize())
         tc.setCharFormat(charFormat)
-        
+
         index = 0
         while index < len(data):
-            if data[index] == 8:        # \b
+            if data[index] == 8:  # \b
                 tc.movePosition(QTextCursor.MoveOperation.Left)
                 self.replEdit.setTextCursor(tc)
-            elif data[index] in (4, 13):     # EOT, \r
+            elif data[index] in (4, 13):  # EOT, \r
                 pass
-            elif (len(data) > index + 1 and
-                  data[index] == 27 and
-                  data[index + 1] == 91):
+            elif len(data) > index + 1 and data[index] == 27 and data[index + 1] == 91:
                 # VT100 cursor command detected: <Esc>[
-                index += 2      # move index to after the [
+                index += 2  # move index to after the [
                 match = self.__vt100Re.search(
-                    data[index:].decode("utf-8", errors="replace"))
+                    data[index:].decode("utf-8", errors="replace")
+                )
                 if match:
                     # move to last position in control sequence
                     # ++ will be done at end of loop
                     index += match.end() - 1
-                    
+
                     action = match.group("action")
                     if action in "ABCD":
                         if match.group("count") == "":
                             count = 1
                         else:
                             count = int(match.group("count"))
-                        
-                        if action == "A":       # up
-                            tc.movePosition(QTextCursor.MoveOperation.Up,
-                                            n=count)
+
+                        if action == "A":  # up
+                            tc.movePosition(QTextCursor.MoveOperation.Up, n=count)
                             self.replEdit.setTextCursor(tc)
-                        elif action == "B":     # down
-                            tc.movePosition(QTextCursor.MoveOperation.Down,
-                                            n=count)
+                        elif action == "B":  # down
+                            tc.movePosition(QTextCursor.MoveOperation.Down, n=count)
                             self.replEdit.setTextCursor(tc)
-                        elif action == "C":     # right
-                            tc.movePosition(QTextCursor.MoveOperation.Right,
-                                            n=count)
+                        elif action == "C":  # right
+                            tc.movePosition(QTextCursor.MoveOperation.Right, n=count)
                             self.replEdit.setTextCursor(tc)
-                        elif action == "D":     # left
-                            tc.movePosition(QTextCursor.MoveOperation.Left,
-                                            n=count)
+                        elif action == "D":  # left
+                            tc.movePosition(QTextCursor.MoveOperation.Left, n=count)
                             self.replEdit.setTextCursor(tc)
-                    elif action == "K":     # delete things
+                    elif action == "K":  # delete things
                         if match.group("count") in ("", "0"):
                             # delete to end of line
                             tc.movePosition(
                                 QTextCursor.MoveOperation.EndOfLine,
-                                mode=QTextCursor.MoveMode.KeepAnchor)
+                                mode=QTextCursor.MoveMode.KeepAnchor,
+                            )
                             tc.removeSelectedText()
                             self.replEdit.setTextCursor(tc)
                         elif match.group("count") == "1":
                             # delete to beinning of line
                             tc.movePosition(
                                 QTextCursor.MoveOperation.StartOfLine,
-                                mode=QTextCursor.MoveMode.KeepAnchor)
+                                mode=QTextCursor.MoveMode.KeepAnchor,
+                            )
                             tc.removeSelectedText()
                             self.replEdit.setTextCursor(tc)
                         elif match.group("count") == "2":
                             # delete whole line
-                            tc.movePosition(
-                                QTextCursor.MoveOperation.EndOfLine)
+                            tc.movePosition(QTextCursor.MoveOperation.EndOfLine)
                             tc.movePosition(
                                 QTextCursor.MoveOperation.StartOfLine,
-                                mode=QTextCursor.MoveMode.KeepAnchor)
+                                mode=QTextCursor.MoveMode.KeepAnchor,
+                            )
                             tc.removeSelectedText()
                             self.replEdit.setTextCursor(tc)
                     elif action == "m":
-                        self.__setCharFormat(match.group(0)[:-1].split(";"),
-                                             tc)
+                        self.__setCharFormat(match.group(0)[:-1].split(";"), tc)
             else:
                 tc.deleteChar()
                 self.replEdit.setTextCursor(tc)
                 self.replEdit.insertPlainText(chr(data[index]))
-            
+
             index += 1
-        
+
         self.replEdit.ensureCursorVisible()
-    
+
     def __setCharFormat(self, formatCodes, textCursor):
         """
         Private method setting the current text format of the REPL pane based
         on the passed ANSI codes.
-        
+
         Following codes are used:
         <ul>
         <li>0: Reset</li>
@@ -931,7 +964,7 @@
         <li>106: bright background Cyan</li>
         <li>107: bright background White</li>
         </ul>
-        
+
         @param formatCodes list of format codes
         @type list of str
         @param textCursor reference to the text cursor
@@ -940,7 +973,7 @@
         if not formatCodes:
             # empty format codes list is treated as a reset
             formatCodes = ["0"]
-        
+
         charFormat = textCursor.charFormat()
         for formatCode in formatCodes:
             try:
@@ -948,7 +981,7 @@
             except ValueError:
                 # ignore non digit values
                 continue
-            
+
             if formatCode == 0:
                 charFormat.setFontWeight(50)
                 charFormat.setFontItalic(False)
@@ -981,27 +1014,31 @@
                 charFormat.setFontOverline(False)
             elif formatCode in (30, 31, 32, 33, 34, 35, 36, 37):
                 charFormat.setForeground(
-                    AnsiColorSchemes[self.__colorScheme][formatCode - 30])
+                    AnsiColorSchemes[self.__colorScheme][formatCode - 30]
+                )
             elif formatCode in (40, 41, 42, 43, 44, 45, 46, 47):
                 charFormat.setBackground(
-                    AnsiColorSchemes[self.__colorScheme][formatCode - 40])
+                    AnsiColorSchemes[self.__colorScheme][formatCode - 40]
+                )
             elif formatCode in (90, 91, 92, 93, 94, 95, 96, 97):
                 charFormat.setForeground(
-                    AnsiColorSchemes[self.__colorScheme][formatCode - 80])
+                    AnsiColorSchemes[self.__colorScheme][formatCode - 80]
+                )
             elif formatCode in (100, 101, 102, 103, 104, 105, 106, 107):
                 charFormat.setBackground(
-                    AnsiColorSchemes[self.__colorScheme][formatCode - 90])
+                    AnsiColorSchemes[self.__colorScheme][formatCode - 90]
+                )
             elif formatCode == 39:
                 charFormat.setForeground(self.DefaultForeground)
             elif formatCode == 49:
                 charFormat.setBackground(self.DefaultBackground)
-        
+
         textCursor.setCharFormat(charFormat)
-    
+
     def __doZoom(self, value):
         """
         Private slot to zoom the REPL pane.
-        
+
         @param value zoom value
         @type int
         """
@@ -1010,11 +1047,11 @@
         elif value > self.__currentZoom:
             self.replEdit.zoomIn(value - self.__currentZoom)
         self.__currentZoom = value
-    
+
     def getCurrentPort(self):
         """
         Public method to determine the port path of the selected device.
-        
+
         @return path of the port of the selected device
         @rtype str
         """
@@ -1028,21 +1065,21 @@
                 return "/dev/{0}".format(portName)
         else:
             return ""
-    
+
     def getCurrentBoard(self):
         """
         Public method to get the board name of the selected device.
-        
+
         @return board name of the selected device
         @rtype str
         """
         boardName = self.deviceTypeComboBox.currentData(self.DeviceBoardRole)
         return boardName
-    
+
     def getDeviceWorkspace(self):
         """
         Public method to get the workspace directory of the device.
-        
+
         @return workspace directory of the device
         @rtype str
         """
@@ -1050,7 +1087,7 @@
             return self.__device.getWorkspace()
         else:
             return ""
-    
+
     def __connectToDevice(self):
         """
         Private method to connect to the selected device.
@@ -1058,90 +1095,103 @@
         port = self.getCurrentPort()
         if not port:
             from .ConnectionSelectionDialog import ConnectionSelectionDialog
+
             with EricOverridenCursor():
                 dlg = ConnectionSelectionDialog(
                     self.__unknownPorts, self.__lastPort, self.__lastDeviceType
                 )
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     vid, pid, port, deviceType = dlg.getData()
-                    
+
                     self.deviceIconLabel.setPixmap(
-                        MicroPythonDevices.getDeviceIcon(deviceType, False))
+                        MicroPythonDevices.getDeviceIcon(deviceType, False)
+                    )
                     self.__device = MicroPythonDevices.getDevice(
-                        deviceType, self, vid, pid)
+                        deviceType, self, vid, pid
+                    )
                     self.__device.setButtons()
-                    
+
                     self.__lastPort = port
                     self.__lastDeviceType = deviceType
                 else:
                     return
-        
+
         if self.__interface.connectToDevice(port):
             self.__setConnected(True)
-            
-            if (Preferences.getMicroPython("SyncTimeAfterConnect") and
-                    self.__device.hasTimeCommands()):
+
+            if (
+                Preferences.getMicroPython("SyncTimeAfterConnect")
+                and self.__device.hasTimeCommands()
+            ):
                 self.__synchronizeTime(quiet=True)
         else:
             with EricOverridenCursor():
                 EricMessageBox.warning(
                     self,
                     self.tr("Serial Device Connect"),
-                    self.tr("""<p>Cannot connect to device at serial"""
-                            """ port <b>{0}</b>.</p>""").format(port))
-    
+                    self.tr(
+                        """<p>Cannot connect to device at serial"""
+                        """ port <b>{0}</b>.</p>"""
+                    ).format(port),
+                )
+
     def __disconnectFromDevice(self):
         """
         Private method to disconnect from the device.
         """
         self.__interface.disconnectFromDevice()
         self.__setConnected(False)
-    
+
     @pyqtSlot()
     def on_runButton_clicked(self):
         """
         Private slot to execute the script of the active editor on the
         selected device.
-        
+
         If the REPL is not active yet, it will be activated, which might cause
         an unconnected device to be connected.
         """
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         aw = ericApp().getObject("ViewManager").activeWindow()
         if aw is None:
             EricMessageBox.critical(
                 self,
                 self.tr("Run Script"),
-                self.tr("""There is no editor open. Abort..."""))
+                self.tr("""There is no editor open. Abort..."""),
+            )
             return
-        
+
         script = aw.text()
         if not script:
             EricMessageBox.critical(
                 self,
                 self.tr("Run Script"),
-                self.tr("""The current editor does not contain a script."""
-                        """ Abort..."""))
+                self.tr(
+                    """The current editor does not contain a script.""" """ Abort..."""
+                ),
+            )
             return
-        
+
         ok, reason = self.__device.canRunScript()
         if not ok:
             EricMessageBox.warning(
                 self,
                 self.tr("Run Script"),
-                self.tr("""<p>Cannot run script.</p><p>Reason:"""
-                        """ {0}</p>""").format(reason))
+                self.tr(
+                    """<p>Cannot run script.</p><p>Reason:""" """ {0}</p>"""
+                ).format(reason),
+            )
             return
-        
+
         if not self.replButton.isChecked():
             # activate on the REPL
             self.on_replButton_clicked(True)
         if self.replButton.isChecked():
             self.__device.runScript(script)
-    
+
     @pyqtSlot()
     def on_openButton_clicked(self):
         """
@@ -1150,17 +1200,18 @@
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         workspace = self.getDeviceWorkspace()
         if workspace:
             fileName = EricFileDialog.getOpenFileName(
                 self,
                 self.tr("Open Python File"),
                 workspace,
-                self.tr("Python3 Files (*.py);;All Files (*)"))
+                self.tr("Python3 Files (*.py);;All Files (*)"),
+            )
             if fileName:
                 ericApp().getObject("ViewManager").openSourceFile(fileName)
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -1169,61 +1220,65 @@
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         aw = ericApp().getObject("ViewManager").activeWindow()
         if aw:
             workspace = self.getDeviceWorkspace()
             if workspace:
                 aw.saveFileAs(workspace)
-    
+
     @pyqtSlot(bool)
     def on_chartButton_clicked(self, checked):
         """
         Private slot to open a chart view to plot data received from the
         connected device.
-       
+
         If the selected device is not connected yet, this will be done now.
-        
+
         @param checked state of the button
         @type bool
         """
         if not HAS_QTCHART:
             # QtCharts not available => fail silently
             return
-        
+
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         if checked:
             ok, reason = self.__device.canStartPlotter()
             if not ok:
                 EricMessageBox.warning(
                     self,
                     self.tr("Start Chart"),
-                    self.tr("""<p>The Chart cannot be started.</p><p>Reason:"""
-                            """ {0}</p>""").format(reason))
+                    self.tr(
+                        """<p>The Chart cannot be started.</p><p>Reason:"""
+                        """ {0}</p>"""
+                    ).format(reason),
+                )
                 return
-            
+
             self.__chartWidget = MicroPythonGraphWidget(self)
-            self.__interface.dataReceived.connect(
-                self.__chartWidget.processData)
-            self.__chartWidget.dataFlood.connect(
-                self.handleDataFlood)
-            
-            self.__ui.addSideWidget(self.__ui.BottomSide, self.__chartWidget,
-                                    UI.PixmapCache.getIcon("chart"),
-                                    self.tr("µPy Chart"))
+            self.__interface.dataReceived.connect(self.__chartWidget.processData)
+            self.__chartWidget.dataFlood.connect(self.handleDataFlood)
+
+            self.__ui.addSideWidget(
+                self.__ui.BottomSide,
+                self.__chartWidget,
+                UI.PixmapCache.getIcon("chart"),
+                self.tr("µPy Chart"),
+            )
             self.__ui.showSideWidget(self.__chartWidget)
-            
+
             if not self.__interface.isConnected():
                 self.__connectToDevice()
                 if self.__device.forceInterrupt():
                     # send a Ctrl-B (exit raw mode)
-                    self.__interface.write(b'\x02')
+                    self.__interface.write(b"\x02")
                     # send Ctrl-C (keyboard interrupt)
-                    self.__interface.write(b'\x03')
-            
+                    self.__interface.write(b"\x03")
+
             self.__device.setPlotter(True)
         else:
             if self.__chartWidget.isDirty():
@@ -1231,28 +1286,26 @@
                     self,
                     self.tr("Unsaved Chart Data"),
                     self.tr("""The chart contains unsaved data."""),
-                    self.__chartWidget.saveData)
+                    self.__chartWidget.saveData,
+                )
                 if not res:
                     # abort
                     return
-            
-            self.__interface.dataReceived.disconnect(
-                self.__chartWidget.processData)
-            self.__chartWidget.dataFlood.disconnect(
-                self.handleDataFlood)
-            
-            if (not self.replButton.isChecked() and
-                    not self.filesButton.isChecked()):
+
+            self.__interface.dataReceived.disconnect(self.__chartWidget.processData)
+            self.__chartWidget.dataFlood.disconnect(self.handleDataFlood)
+
+            if not self.replButton.isChecked() and not self.filesButton.isChecked():
                 self.__disconnectFromDevice()
-            
+
             self.__device.setPlotter(False)
             self.__ui.removeSideWidget(self.__chartWidget)
-            
+
             self.__chartWidget.deleteLater()
             self.__chartWidget = None
-        
+
         self.chartButton.setChecked(checked)
-    
+
     @pyqtSlot()
     def handleDataFlood(self):
         """
@@ -1260,76 +1313,77 @@
         """
         self.on_connectButton_clicked()
         self.__device.handleDataFlood()
-    
+
     @pyqtSlot(bool)
     def on_filesButton_clicked(self, checked):
         """
         Private slot to open a file manager window to the connected device.
-       
+
         If the selected device is not connected yet, this will be done now.
-        
+
         @param checked state of the button
         @type bool
         """
         if not self.__device:
             self.__showNoDeviceMessage()
             return
-        
+
         if checked:
             ok, reason = self.__device.canStartFileManager()
             if not ok:
                 EricMessageBox.warning(
                     self,
                     self.tr("Start File Manager"),
-                    self.tr("""<p>The File Manager cannot be started.</p>"""
-                            """<p>Reason: {0}</p>""").format(reason))
+                    self.tr(
+                        """<p>The File Manager cannot be started.</p>"""
+                        """<p>Reason: {0}</p>"""
+                    ).format(reason),
+                )
                 return
-            
+
             with EricOverrideCursor():
                 if not self.__interface.isConnected():
                     self.__connectToDevice()
                 if self.__connected:
                     self.__fileManagerWidget = MicroPythonFileManagerWidget(
-                        self.__interface,
-                        self.__device.supportsLocalFileAccess(),
-                        self)
-                    
+                        self.__interface, self.__device.supportsLocalFileAccess(), self
+                    )
+
                     self.__ui.addSideWidget(
                         self.__ui.BottomSide,
                         self.__fileManagerWidget,
                         UI.PixmapCache.getIcon("filemanager"),
-                        self.tr("µPy Files")
+                        self.tr("µPy Files"),
                     )
                     self.__ui.showSideWidget(self.__fileManagerWidget)
 
                     self.__device.setFileManager(True)
-                    
+
                     self.__fileManagerWidget.start()
         else:
             self.__fileManagerWidget.stop()
-            
-            if (not self.replButton.isChecked() and
-                    not self.chartButton.isChecked()):
+
+            if not self.replButton.isChecked() and not self.chartButton.isChecked():
                 self.__disconnectFromDevice()
-            
+
             self.__device.setFileManager(False)
             self.__ui.removeSideWidget(self.__fileManagerWidget)
-            
+
             self.__fileManagerWidget.deleteLater()
             self.__fileManagerWidget = None
-        
+
         self.filesButton.setChecked(checked)
-    
+
     ##################################################################
     ## Super Menu related methods below
     ##################################################################
-    
+
     def __aboutToShowSuperMenu(self):
         """
         Private slot to populate the Super Menu before showing it.
         """
         self.__superMenu.clear()
-        
+
         # prepare the download menu
         if self.__device:
             menuEntries = self.__device.getDownloadMenuEntries()
@@ -1340,46 +1394,52 @@
                         downloadMenu.addSeparator()
                     else:
                         downloadMenu.addAction(
-                            text,
-                            functools.partial(self.__downloadFromUrl, url)
+                            text, functools.partial(self.__downloadFromUrl, url)
                         )
             else:
                 downloadMenu = None
-        
+
         # populate the super menu
         hasTime = self.__device.hasTimeCommands() if self.__device else False
-        
+
         act = self.__superMenu.addAction(
-            self.tr("Show Version"), self.__showDeviceVersion)
+            self.tr("Show Version"), self.__showDeviceVersion
+        )
         act.setEnabled(self.__connected)
         act = self.__superMenu.addAction(
-            self.tr("Show Implementation"), self.__showImplementation)
+            self.tr("Show Implementation"), self.__showImplementation
+        )
         act.setEnabled(self.__connected)
         act = self.__superMenu.addAction(
-            self.tr("Show Board Data"), self.__showBoardInformation)
+            self.tr("Show Board Data"), self.__showBoardInformation
+        )
         act.setEnabled(self.__connected)
         self.__superMenu.addSeparator()
         if hasTime:
             act = self.__superMenu.addAction(
-                self.tr("Synchronize Time"), self.__synchronizeTime)
+                self.tr("Synchronize Time"), self.__synchronizeTime
+            )
             act.setEnabled(self.__connected)
             act = self.__superMenu.addAction(
-                self.tr("Show Device Time"), self.__showDeviceTime)
+                self.tr("Show Device Time"), self.__showDeviceTime
+            )
             act.setEnabled(self.__connected)
-        self.__superMenu.addAction(
-            self.tr("Show Local Time"), self.__showLocalTime)
+        self.__superMenu.addAction(self.tr("Show Local Time"), self.__showLocalTime)
         if hasTime:
             act = self.__superMenu.addAction(
-                self.tr("Show Time"), self.__showLocalAndDeviceTime)
+                self.tr("Show Time"), self.__showLocalAndDeviceTime
+            )
             act.setEnabled(self.__connected)
         self.__superMenu.addSeparator()
         if not Globals.isWindowsPlatform():
             available = self.__mpyCrossAvailable()
             act = self.__superMenu.addAction(
-                self.tr("Compile Python File"), self.__compileFile2Mpy)
+                self.tr("Compile Python File"), self.__compileFile2Mpy
+            )
             act.setEnabled(available)
             act = self.__superMenu.addAction(
-                self.tr("Compile Current Editor"), self.__compileEditor2Mpy)
+                self.tr("Compile Current Editor"), self.__compileEditor2Mpy
+            )
             aw = ericApp().getObject("ViewManager").activeWindow()
             act.setEnabled(available and bool(aw))
             self.__superMenu.addSeparator()
@@ -1389,27 +1449,30 @@
             if downloadMenu is None:
                 # generic download action
                 act = self.__superMenu.addAction(
-                    self.tr("Download Firmware"), self.__downloadFirmware)
+                    self.tr("Download Firmware"), self.__downloadFirmware
+                )
                 act.setEnabled(self.__device.hasFirmwareUrl())
             else:
                 # download sub-menu
                 self.__superMenu.addMenu(downloadMenu)
             self.__superMenu.addSeparator()
             act = self.__superMenu.addAction(
-                self.tr("Show Documentation"), self.__showDocumentation)
+                self.tr("Show Documentation"), self.__showDocumentation
+            )
             act.setEnabled(self.__device.hasDocumentationUrl())
             self.__superMenu.addSeparator()
         if not self.__device.hasFlashMenuEntry():
-            self.__superMenu.addAction(self.tr("Flash UF2 Device"),
-                                       self.__flashUF2)
+            self.__superMenu.addAction(self.tr("Flash UF2 Device"), self.__flashUF2)
             self.__superMenu.addSeparator()
-        self.__superMenu.addAction(self.tr("Manage Unknown Devices"),
-                                   self.__manageUnknownDevices)
-        self.__superMenu.addAction(self.tr("Ignored Serial Devices"),
-                                   self.__manageIgnored)
+        self.__superMenu.addAction(
+            self.tr("Manage Unknown Devices"), self.__manageUnknownDevices
+        )
+        self.__superMenu.addAction(
+            self.tr("Ignored Serial Devices"), self.__manageIgnored
+        )
         self.__superMenu.addSeparator()
         self.__superMenu.addAction(self.tr("Configure"), self.__configure)
-    
+
     @pyqtSlot()
     def __showDeviceVersion(self):
         """
@@ -1418,24 +1481,20 @@
         try:
             versionInfo = self.__interface.version()
             if versionInfo:
-                msg = self.tr(
-                    "<h3>Device Version Information</h3>"
-                )
+                msg = self.tr("<h3>Device Version Information</h3>")
                 msg += "<table>"
                 for key, value in versionInfo.items():
                     msg += "<tr><td><b>{0}</b></td><td>{1}</td></tr>".format(
-                        key.capitalize(), value)
+                        key.capitalize(), value
+                    )
                 msg += "</table>"
             else:
                 msg = self.tr("No version information available.")
-            
-            EricMessageBox.information(
-                self,
-                self.tr("Device Version Information"),
-                msg)
+
+            EricMessageBox.information(self, self.tr("Device Version Information"), msg)
         except Exception as exc:
             self.__showError("version()", str(exc))
-    
+
     @pyqtSlot()
     def __showImplementation(self):
         """
@@ -1453,21 +1512,21 @@
                 name = impInfo["name"]
             version = (
                 self.tr("unknown")
-                if impInfo["version"] == "unknown" else
-                impInfo["version"]
+                if impInfo["version"] == "unknown"
+                else impInfo["version"]
             )
-            
+
             EricMessageBox.information(
                 self,
                 self.tr("Device Implementation Information"),
                 self.tr(
                     "<h3>Device Implementation Information</h3>"
                     "<p>This device contains <b>{0} {1}</b>.</p>"
-                ).format(name, version)
+                ).format(name, version),
             )
         except Exception as exc:
             self.__showError("getImplementation()", str(exc))
-    
+
     @pyqtSlot()
     def __showBoardInformation(self):
         """
@@ -1475,43 +1534,46 @@
         """
         try:
             boardInfo = self.__interface.getBoardInformation()
-            
+
             from .BoardDataDialog import BoardDataDialog
+
             dlg = BoardDataDialog(boardInfo)
             dlg.exec()
         except Exception as exc:
             self.__showError("getBoardInformation()", str(exc))
-    
+
     @pyqtSlot()
     def __synchronizeTime(self, quiet=False):
         """
         Private slot to set the time of the connected device to the local
         computer's time.
-        
+
         @param quiet flag indicating to not show a message
         @type bool
         """
         if self.__device and self.__device.hasTimeCommands():
             try:
                 self.__interface.syncTime(self.__device.getDeviceType())
-                
+
                 if not quiet:
                     with EricOverridenCursor():
                         EricMessageBox.information(
                             self,
                             self.tr("Synchronize Time"),
-                            self.tr("<p>The time of the connected device was"
-                                    " synchronized with the local time.</p>") +
-                            self.__getDeviceTime()
+                            self.tr(
+                                "<p>The time of the connected device was"
+                                " synchronized with the local time.</p>"
+                            )
+                            + self.__getDeviceTime(),
                         )
             except Exception as exc:
                 self.__showError("syncTime()", str(exc))
-    
+
     def __getDeviceTime(self):
         """
         Private method to get a string containing the date and time of the
         connected device.
-        
+
         @return date and time of the connected device
         @rtype str
         """
@@ -1528,16 +1590,15 @@
                         "</table>"
                     ).format(date, time)
                 except ValueError:
-                    return self.tr(
-                        "<h3>Device Date and Time</h3>"
-                        "<p>{0}</p>"
-                    ).format(dateTimeString.strip())
+                    return self.tr("<h3>Device Date and Time</h3>" "<p>{0}</p>").format(
+                        dateTimeString.strip()
+                    )
             except Exception as exc:
                 self.__showError("getTime()", str(exc))
                 return ""
         else:
             return ""
-    
+
     @pyqtSlot()
     def __showDeviceTime(self):
         """
@@ -1545,81 +1606,77 @@
         """
         msg = self.__getDeviceTime()
         if msg:
-            EricMessageBox.information(
-                self,
-                self.tr("Device Date and Time"),
-                msg)
-    
+            EricMessageBox.information(self, self.tr("Device Date and Time"), msg)
+
     @pyqtSlot()
     def __showLocalTime(self):
         """
         Private slot to show the local date and time.
         """
         localdatetime = time.localtime()
-        localdate = time.strftime('%Y-%m-%d', localdatetime)
-        localtime = time.strftime('%H:%M:%S', localdatetime)
+        localdate = time.strftime("%Y-%m-%d", localdatetime)
+        localtime = time.strftime("%H:%M:%S", localdatetime)
         EricMessageBox.information(
             self,
             self.tr("Local Date and Time"),
-            self.tr("<h3>Local Date and Time</h3>"
-                    "<table>"
-                    "<tr><td><b>Date</b></td><td>{0}</td></tr>"
-                    "<tr><td><b>Time</b></td><td>{1}</td></tr>"
-                    "</table>"
-                    ).format(localdate, localtime)
+            self.tr(
+                "<h3>Local Date and Time</h3>"
+                "<table>"
+                "<tr><td><b>Date</b></td><td>{0}</td></tr>"
+                "<tr><td><b>Time</b></td><td>{1}</td></tr>"
+                "</table>"
+            ).format(localdate, localtime),
         )
-    
+
     @pyqtSlot()
     def __showLocalAndDeviceTime(self):
         """
         Private slot to show the local and device time side-by-side.
         """
         localdatetime = time.localtime()
-        localdate = time.strftime('%Y-%m-%d', localdatetime)
-        localtime = time.strftime('%H:%M:%S', localdatetime)
-        
+        localdate = time.strftime("%Y-%m-%d", localdatetime)
+        localtime = time.strftime("%H:%M:%S", localdatetime)
+
         try:
             deviceDateTimeString = self.__interface.getTime()
             try:
-                devicedate, devicetime = (
-                    deviceDateTimeString.strip().split(None, 1)
-                )
+                devicedate, devicetime = deviceDateTimeString.strip().split(None, 1)
                 EricMessageBox.information(
                     self,
                     self.tr("Date and Time"),
-                    self.tr("<table>"
-                            "<tr><th></th><th>Local Date and Time</th>"
-                            "<th>Device Date and Time</th></tr>"
-                            "<tr><td><b>Date</b></td>"
-                            "<td align='center'>{0}</td>"
-                            "<td align='center'>{2}</td></tr>"
-                            "<tr><td><b>Time</b></td>"
-                            "<td align='center'>{1}</td>"
-                            "<td align='center'>{3}</td></tr>"
-                            "</table>"
-                            ).format(localdate, localtime,
-                                     devicedate, devicetime)
+                    self.tr(
+                        "<table>"
+                        "<tr><th></th><th>Local Date and Time</th>"
+                        "<th>Device Date and Time</th></tr>"
+                        "<tr><td><b>Date</b></td>"
+                        "<td align='center'>{0}</td>"
+                        "<td align='center'>{2}</td></tr>"
+                        "<tr><td><b>Time</b></td>"
+                        "<td align='center'>{1}</td>"
+                        "<td align='center'>{3}</td></tr>"
+                        "</table>"
+                    ).format(localdate, localtime, devicedate, devicetime),
                 )
             except ValueError:
                 EricMessageBox.information(
                     self,
                     self.tr("Date and Time"),
-                    self.tr("<table>"
-                            "<tr><th>Local Date and Time</th>"
-                            "<th>Device Date and Time</th></tr>"
-                            "<tr><td align='center'>{0} {1}</td>"
-                            "<td align='center'>{2}</td></tr>"
-                            "</table>"
-                            ).format(localdate, localtime,
-                                     deviceDateTimeString.strip())
+                    self.tr(
+                        "<table>"
+                        "<tr><th>Local Date and Time</th>"
+                        "<th>Device Date and Time</th></tr>"
+                        "<tr><td align='center'>{0} {1}</td>"
+                        "<td align='center'>{2}</td></tr>"
+                        "</table>"
+                    ).format(localdate, localtime, deviceDateTimeString.strip()),
                 )
         except Exception as exc:
             self.__showError("getTime()", str(exc))
-    
+
     def __showError(self, method, error):
         """
         Private method to show some error message.
-        
+
         @param method name of the method the error occured in
         @type str
         @param error error message
@@ -1629,15 +1686,17 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Error handling device"),
-                self.tr("<p>There was an error communicating with the"
-                        " connected device.</p><p>Method: {0}</p>"
-                        "<p>Message: {1}</p>")
-                .format(method, error))
-    
+                self.tr(
+                    "<p>There was an error communicating with the"
+                    " connected device.</p><p>Method: {0}</p>"
+                    "<p>Message: {1}</p>"
+                ).format(method, error),
+            )
+
     def __mpyCrossAvailable(self):
         """
         Private method to check the availability of mpy-cross.
-        
+
         @return flag indicating the availability of mpy-cross
         @rtype bool
         """
@@ -1650,13 +1709,13 @@
         else:
             if Utilities.isExecutable(program):
                 available = True
-        
+
         return available
-    
+
     def __crossCompile(self, pythonFile="", title=""):
         """
         Private method to cross compile a Python file to a .mpy file.
-        
+
         @param pythonFile name of the Python file to be compiled
         @type str
         @param title title for the various dialogs
@@ -1669,12 +1728,15 @@
                 EricMessageBox.critical(
                     self,
                     title,
-                    self.tr("""The MicroPython cross compiler"""
-                            """ <b>mpy-cross</b> cannot be found. Ensure it"""
-                            """ is in the search path or configure it on"""
-                            """ the MicroPython configuration page."""))
+                    self.tr(
+                        """The MicroPython cross compiler"""
+                        """ <b>mpy-cross</b> cannot be found. Ensure it"""
+                        """ is in the search path or configure it on"""
+                        """ the MicroPython configuration page."""
+                    ),
+                )
                 return
-        
+
         if not pythonFile:
             defaultDirectory = ""
             aw = ericApp().getObject("ViewManager").activeWindow()
@@ -1684,27 +1746,30 @@
                     defaultDirectory = os.path.dirname(fn)
             if not defaultDirectory:
                 defaultDirectory = (
-                    Preferences.getMicroPython("MpyWorkspace") or
-                    Preferences.getMultiProject("Workspace") or
-                    os.path.expanduser("~")
+                    Preferences.getMicroPython("MpyWorkspace")
+                    or Preferences.getMultiProject("Workspace")
+                    or os.path.expanduser("~")
                 )
             pythonFile = EricFileDialog.getOpenFileName(
                 self,
                 title,
                 defaultDirectory,
-                self.tr("Python Files (*.py);;All Files (*)"))
+                self.tr("Python Files (*.py);;All Files (*)"),
+            )
             if not pythonFile:
                 # user cancelled
                 return
-        
+
         if not os.path.exists(pythonFile):
             EricMessageBox.critical(
                 self,
                 title,
-                self.tr("""The Python file <b>{0}</b> does not exist."""
-                        """ Aborting...""").format(pythonFile))
+                self.tr(
+                    """The Python file <b>{0}</b> does not exist.""" """ Aborting..."""
+                ).format(pythonFile),
+            )
             return
-        
+
         compileArgs = [
             pythonFile,
         ]
@@ -1712,14 +1777,14 @@
         res = dlg.startProcess(program, compileArgs)
         if res:
             dlg.exec()
-    
+
     @pyqtSlot()
     def __compileFile2Mpy(self):
         """
         Private slot to cross compile a Python file (*.py) to a .mpy file.
         """
         self.__crossCompile(title=self.tr("Compile Python File"))
-    
+
     @pyqtSlot()
     def __compileEditor2Mpy(self):
         """
@@ -1734,15 +1799,17 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Compile Current Editor"),
-                self.tr("""The current editor does not contain a Python"""
-                        """ file. Aborting..."""))
+                self.tr(
+                    """The current editor does not contain a Python"""
+                    """ file. Aborting..."""
+                ),
+            )
             return
-        
+
         self.__crossCompile(
-            pythonFile=aw.getFileName(),
-            title=self.tr("Compile Current Editor")
+            pythonFile=aw.getFileName(), title=self.tr("Compile Current Editor")
         )
-    
+
     @pyqtSlot()
     def __showDocumentation(self):
         """
@@ -1751,10 +1818,10 @@
         if self.__device is None or not self.__device.hasDocumentationUrl():
             # abort silently
             return
-        
+
         url = self.__device.getDocumentationUrl()
         ericApp().getObject("UserInterface").launchHelpViewer(url)
-    
+
     @pyqtSlot()
     def __downloadFirmware(self):
         """
@@ -1763,45 +1830,44 @@
         if self.__device is None or not self.__device.hasFirmwareUrl():
             # abort silently
             return
-        
+
         self.__device.downloadFirmware()
-    
+
     def __downloadFromUrl(self, url):
         """
         Private method to open a web browser for the given URL.
-        
+
         @param url URL to be opened
         @type str
         """
         if self.__device is None:
             # abort silently
             return
-        
+
         if url:
             ericApp().getObject("UserInterface").launchHelpViewer(url)
-    
+
     @pyqtSlot()
     def __manageIgnored(self):
         """
         Private slot to manage the list of ignored serial devices.
         """
         from .IgnoredDevicesDialog import IgnoredDevicesDialog
-        
+
         dlg = IgnoredDevicesDialog(
-            Preferences.getMicroPython("IgnoredUnknownDevices"),
-            self)
+            Preferences.getMicroPython("IgnoredUnknownDevices"), self
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             ignoredDevices = dlg.getDevices()
-            Preferences.setMicroPython("IgnoredUnknownDevices",
-                                       ignoredDevices)
-    
+            Preferences.setMicroPython("IgnoredUnknownDevices", ignoredDevices)
+
     @pyqtSlot()
     def __configure(self):
         """
         Private slot to open the MicroPython configuration page.
         """
         ericApp().getObject("UserInterface").showPreferences("microPythonPage")
-    
+
     @pyqtSlot()
     def __manageUnknownDevices(self):
         """
@@ -1809,33 +1875,33 @@
         list of supported boards).
         """
         from .UnknownDevicesDialog import UnknownDevicesDialog
+
         dlg = UnknownDevicesDialog()
         dlg.exec()
-    
+
     def __addUnknownDevices(self, devices):
         """
         Private method to add devices to the list of manually added boards.
-        
+
         @param devices list of not ignored but unknown devices
         @type list of tuple of (int, int, str)
         """
         from .AddEditDevicesDialog import AddEditDevicesDialog
-        
+
         if len(devices) > 1:
-            from EricWidgets.EricListSelectionDialog import (
-                EricListSelectionDialog
-            )
+            from EricWidgets.EricListSelectionDialog import EricListSelectionDialog
+
             sdlg = EricListSelectionDialog(
                 [d[2] for d in devices],
                 title=self.tr("Add Unknown Devices"),
                 message=self.tr("Select the devices to be added:"),
-                checkBoxSelection=True
+                checkBoxSelection=True,
             )
             if sdlg.exec() == QDialog.DialogCode.Accepted:
                 selectedDevices = sdlg.getSelection()
         else:
             selectedDevices = devices[0][2]
-        
+
         if selectedDevices:
             manualDevices = Preferences.getMicroPython("ManualDevices")
             for vid, pid, description in devices:
@@ -1844,10 +1910,10 @@
                     if dlg.exec() == QDialog.DialogCode.Accepted:
                         manualDevices.append(dlg.getDeviceDict())
             Preferences.setMicroPython("ManualDevices", manualDevices)
-            
+
             # rescan the ports
             self.__populateDeviceTypeComboBox()
-    
+
     @pyqtSlot()
     def __flashUF2(self):
         """
--- a/src/eric7/MicroPython/MicrobitDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/MicrobitDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,10 +28,11 @@
     """
     Class implementing the device for BBC micro:bit and Calliope mini boards.
     """
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType type of the device
@@ -39,31 +40,31 @@
         @param parent reference to the parent object
         @type QObject
         """
-        super().__init__(
-            microPythonWidget, deviceType, parent)
-    
+        super().__init__(microPythonWidget, deviceType, parent)
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-    
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return True
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
@@ -73,113 +74,113 @@
         else:
             # Calliope mini
             return self.tr("Calliope mini")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def hasTimeCommands(self):
         """
         Public method to check, if the device supports time commands.
-        
+
         The default returns True.
-        
+
         @return flag indicating support for time commands
         @rtype bool
         """
         return False
-    
+
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         connected = self.microPython.isConnected()
-        
-        act = menu.addAction(self.tr("Flash MicroPython"),
-                             self.__flashMicroPython)
+
+        act = menu.addAction(self.tr("Flash MicroPython"), self.__flashMicroPython)
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Flash Firmware"),
-                             lambda: self.__flashMicroPython(firmware=True))
+        act = menu.addAction(
+            self.tr("Flash Firmware"), lambda: self.__flashMicroPython(firmware=True)
+        )
         act.setEnabled(not connected)
         menu.addSeparator()
         act = menu.addAction(self.tr("Save Script"), self.__saveScriptToDevice)
-        act.setToolTip(self.tr(
-            "Save the current script to the selected device"))
+        act.setToolTip(self.tr("Save the current script to the selected device"))
         act.setEnabled(connected)
-        act = menu.addAction(self.tr("Save Script as 'main.py'"),
-                             self.__saveMain)
-        act.setToolTip(self.tr(
-            "Save the current script as 'main.py' on the connected device"))
+        act = menu.addAction(self.tr("Save Script as 'main.py'"), self.__saveMain)
+        act.setToolTip(
+            self.tr("Save the current script as 'main.py' on the connected device")
+        )
         act.setEnabled(connected)
         menu.addSeparator()
-        act = menu.addAction(self.tr("Reset {0}").format(self.deviceName()),
-                             self.__resetDevice)
+        act = menu.addAction(
+            self.tr("Reset {0}").format(self.deviceName()), self.__resetDevice
+        )
         act.setEnabled(connected)
-    
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return True
-    
+
     @pyqtSlot()
     def __flashMicroPython(self, firmware=False):
         """
         Private slot to flash MicroPython or the DAPLink firmware to the
         device.
-        
+
         @param firmware flag indicating to flash the DAPLink firmware
         @type bool
         """
@@ -189,19 +190,15 @@
         if self.getDeviceType() == "bbc_microbit":
             # BBC micro:bit
             if firmware:
-                deviceDirectories = Utilities.findVolume("MAINTENANCE",
-                                                         findAll=True)
+                deviceDirectories = Utilities.findVolume("MAINTENANCE", findAll=True)
             else:
-                deviceDirectories = Utilities.findVolume("MICROBIT",
-                                                         findAll=True)
+                deviceDirectories = Utilities.findVolume("MICROBIT", findAll=True)
         else:
             # Calliope mini
             if firmware:
-                deviceDirectories = Utilities.findVolume("MAINTENANCE",
-                                                         findAll=True)
+                deviceDirectories = Utilities.findVolume("MAINTENANCE", findAll=True)
             else:
-                deviceDirectories = Utilities.findVolume("MINI",
-                                                         findAll=True)
+                deviceDirectories = Utilities.findVolume("MINI", findAll=True)
         if len(deviceDirectories) == 0:
             if self.getDeviceType() == "bbc_microbit":
                 # BBC micro:bit is not ready or not mounted
@@ -210,31 +207,31 @@
                         self.microPython,
                         self.tr("Flash MicroPython/Firmware"),
                         self.tr(
-                            '<p>The BBC micro:bit is not ready for flashing'
-                            ' the DAPLink firmware. Follow these'
-                            ' instructions. </p>'
-                            '<ul>'
-                            '<li>unplug USB cable and any batteries</li>'
-                            '<li>keep RESET button pressed an plug USB cable'
-                            ' back in</li>'
-                            '<li>a drive called MAINTENANCE should be'
-                            ' available</li>'
-                            '</ul>'
-                            '<p>See the '
+                            "<p>The BBC micro:bit is not ready for flashing"
+                            " the DAPLink firmware. Follow these"
+                            " instructions. </p>"
+                            "<ul>"
+                            "<li>unplug USB cable and any batteries</li>"
+                            "<li>keep RESET button pressed an plug USB cable"
+                            " back in</li>"
+                            "<li>a drive called MAINTENANCE should be"
+                            " available</li>"
+                            "</ul>"
+                            "<p>See the "
                             '<a href="https://microbit.org/guide/firmware/">'
-                            'micro:bit web site</a> for details.</p>'
-                        )
+                            "micro:bit web site</a> for details.</p>"
+                        ),
                     )
                 else:
                     EricMessageBox.critical(
                         self.microPython,
                         self.tr("Flash MicroPython/Firmware"),
                         self.tr(
-                            '<p>The BBC micro:bit is not ready for flashing'
-                            ' the MicroPython firmware. Please make sure,'
-                            ' that a drive called MICROBIT is available.'
-                            '</p>'
-                        )
+                            "<p>The BBC micro:bit is not ready for flashing"
+                            " the MicroPython firmware. Please make sure,"
+                            " that a drive called MICROBIT is available."
+                            "</p>"
+                        ),
                     )
             else:
                 # Calliope mini is not ready or not mounted
@@ -244,16 +241,16 @@
                         self.tr("Flash MicroPython/Firmware"),
                         self.tr(
                             '<p>The "Calliope mini" is not ready for flashing'
-                            ' the DAPLink firmware. Follow these'
-                            ' instructions. </p>'
-                            '<ul>'
-                            '<li>unplug USB cable and any batteries</li>'
-                            '<li>keep RESET button pressed an plug USB cable'
-                            ' back in</li>'
-                            '<li>a drive called MAINTENANCE should be'
-                            ' available</li>'
-                            '</ul>'
-                        )
+                            " the DAPLink firmware. Follow these"
+                            " instructions. </p>"
+                            "<ul>"
+                            "<li>unplug USB cable and any batteries</li>"
+                            "<li>keep RESET button pressed an plug USB cable"
+                            " back in</li>"
+                            "<li>a drive called MAINTENANCE should be"
+                            " available</li>"
+                            "</ul>"
+                        ),
                     )
                 else:
                     EricMessageBox.critical(
@@ -261,30 +258,33 @@
                         self.tr("Flash MicroPython/Firmware"),
                         self.tr(
                             '<p>The "Calliope mini" is not ready for flashing'
-                            ' the MicroPython firmware. Please make sure,'
-                            ' that a drive called MINI is available.'
-                            '</p>'
-                        )
+                            " the MicroPython firmware. Please make sure,"
+                            " that a drive called MINI is available."
+                            "</p>"
+                        ),
                     )
         elif len(deviceDirectories) == 1:
             downloadsPath = QStandardPaths.standardLocations(
-                QStandardPaths.StandardLocation.DownloadLocation)[0]
+                QStandardPaths.StandardLocation.DownloadLocation
+            )[0]
             firmware = EricFileDialog.getOpenFileName(
                 self.microPython,
                 self.tr("Flash MicroPython/Firmware"),
                 downloadsPath,
-                self.tr("MicroPython/Firmware Files (*.hex *.bin);;"
-                        "All Files (*)"))
+                self.tr("MicroPython/Firmware Files (*.hex *.bin);;" "All Files (*)"),
+            )
             if firmware and os.path.exists(firmware):
                 shutil.copy2(firmware, deviceDirectories[0])
         else:
             EricMessageBox.warning(
                 self,
                 self.tr("Flash MicroPython/Firmware"),
-                self.tr("There are multiple devices ready for flashing."
-                        " Please make sure, that only one device is prepared.")
+                self.tr(
+                    "There are multiple devices ready for flashing."
+                    " Please make sure, that only one device is prepared."
+                ),
             )
-    
+
     @pyqtSlot()
     def __saveMain(self):
         """
@@ -292,43 +292,45 @@
         connected device.
         """
         self.__saveScriptToDevice("main.py")
-    
+
     @pyqtSlot()
     def __saveScriptToDevice(self, scriptName=""):
         """
         Private method to save the current script onto the connected
         device.
-        
+
         @param scriptName name of the file on the device
         @type str
         """
         aw = ericApp().getObject("ViewManager").activeWindow()
         if not aw:
             return
-        
+
         title = (
             self.tr("Save Script as '{0}'").format(scriptName)
-            if scriptName else
-            self.tr("Save Script")
+            if scriptName
+            else self.tr("Save Script")
         )
-        
+
         if not (aw.isPyFile() or aw.isMicroPythonFile()):
             yes = EricMessageBox.yesNo(
                 self.microPython,
                 title,
-                self.tr("""The current editor does not contain a Python"""
-                        """ script. Write it anyway?"""))
+                self.tr(
+                    """The current editor does not contain a Python"""
+                    """ script. Write it anyway?"""
+                ),
+            )
             if not yes:
                 return
-        
+
         script = aw.text().strip()
         if not script:
             EricMessageBox.warning(
-                self.microPython,
-                title,
-                self.tr("""The script is empty. Aborting."""))
+                self.microPython, title, self.tr("""The script is empty. Aborting.""")
+            )
             return
-        
+
         if not scriptName:
             scriptName = os.path.basename(aw.getFileName())
             scriptName, ok = QInputDialog.getText(
@@ -336,12 +338,13 @@
                 title,
                 self.tr("Enter a file name on the device:"),
                 QLineEdit.EchoMode.Normal,
-                scriptName)
+                scriptName,
+            )
             if not ok or not bool(scriptName):
                 return
-            
+
             title = self.tr("Save Script as '{0}'").format(scriptName)
-        
+
         commands = [
             "fd = open('{0}', 'wb')".format(scriptName),
             "f = fd.write",
@@ -354,13 +357,15 @@
             EricMessageBox.critical(
                 self.microPython,
                 title,
-                self.tr("""<p>The script could not be saved to the"""
-                        """ device.</p><p>Reason: {0}</p>""")
-                .format(err.decode("utf-8")))
-        
+                self.tr(
+                    """<p>The script could not be saved to the"""
+                    """ device.</p><p>Reason: {0}</p>"""
+                ).format(err.decode("utf-8")),
+            )
+
         # reset the device
         self.__resetDevice()
-    
+
     @pyqtSlot()
     def __resetDevice(self):
         """
@@ -368,21 +373,25 @@
         """
         if self.getDeviceType() == "bbc_microbit":
             # BBC micro:bit
-            self.microPython.commandsInterface().execute([
-                "import microbit",
-                "microbit.reset()",
-            ])
+            self.microPython.commandsInterface().execute(
+                [
+                    "import microbit",
+                    "microbit.reset()",
+                ]
+            )
         else:
             # Calliope mini
-            self.microPython.commandsInterface().execute([
-                "import calliope_mini",
-                "calliope_mini.reset()",
-            ])
-    
+            self.microPython.commandsInterface().execute(
+                [
+                    "import calliope_mini",
+                    "calliope_mini.reset()",
+                ]
+            )
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
@@ -392,28 +401,38 @@
         else:
             # Calliope mini
             return Preferences.getMicroPython("CalliopeDocuUrl")
-    
+
     def getDownloadMenuEntries(self):
         """
         Public method to retrieve the entries for the downloads menu.
-        
+
         @return list of tuples with menu text and URL to be opened for each
             entry
         @rtype list of tuple of (str, str)
         """
         if self.getDeviceType() == "bbc_microbit":
             return [
-                (self.tr("MicroPython Firmware for BBC micro:bit V1"),
-                 Preferences.getMicroPython("MicrobitMicroPythonUrl")),
-                (self.tr("MicroPython Firmware for BBC micro:bit V2"),
-                 Preferences.getMicroPython("MicrobitV2MicroPythonUrl")),
-                (self.tr("DAPLink Firmware"),
-                 Preferences.getMicroPython("MicrobitFirmwareUrl"))
+                (
+                    self.tr("MicroPython Firmware for BBC micro:bit V1"),
+                    Preferences.getMicroPython("MicrobitMicroPythonUrl"),
+                ),
+                (
+                    self.tr("MicroPython Firmware for BBC micro:bit V2"),
+                    Preferences.getMicroPython("MicrobitV2MicroPythonUrl"),
+                ),
+                (
+                    self.tr("DAPLink Firmware"),
+                    Preferences.getMicroPython("MicrobitFirmwareUrl"),
+                ),
             ]
         else:
             return [
-                (self.tr("MicroPython Firmware"),
-                 Preferences.getMicroPython("CalliopeMicroPythonUrl")),
-                (self.tr("DAPLink Firmware"),
-                 Preferences.getMicroPython("CalliopeDAPLinkUrl"))
+                (
+                    self.tr("MicroPython Firmware"),
+                    Preferences.getMicroPython("CalliopeMicroPythonUrl"),
+                ),
+                (
+                    self.tr("DAPLink Firmware"),
+                    Preferences.getMicroPython("CalliopeDAPLinkUrl"),
+                ),
             ]
--- a/src/eric7/MicroPython/PyBoardDevices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/PyBoardDevices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,17 +26,17 @@
     """
     Class implementing the device for PyBoard boards.
     """
+
     DeviceVolumeName = "PYBFLASH"
-    
+
     FlashInstructionsURL = (
-        "https://github.com/micropython/micropython/wiki/"
-        "Pyboard-Firmware-Update"
+        "https://github.com/micropython/micropython/wiki/" "Pyboard-Firmware-Update"
     )
-    
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -45,114 +45,115 @@
         @type QObject
         """
         super().__init__(microPythonWidget, deviceType, parent)
-        
+
         self.__workspace = self.__findWorkspace()
-    
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-        
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
         if self.__deviceVolumeMounted():
             self.microPython.setActionButtons(open=True, save=True)
-    
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return False
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.tr("PyBoard")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def supportsLocalFileAccess(self):
         """
         Public method to indicate file access via a local directory.
-        
+
         @return flag indicating file access via local directory
         @rtype bool
         """
         return self.__deviceVolumeMounted()
-    
+
     def __deviceVolumeMounted(self):
         """
         Private method to check, if the device volume is mounted.
-        
+
         @return flag indicated a mounted device
         @rtype bool
         """
         if self.__workspace and not os.path.exists(self.__workspace):
-            self.__workspace = ""       # reset
-        
+            self.__workspace = ""  # reset
+
         return self.DeviceVolumeName in self.getWorkspace(silent=True)
-    
+
     def getWorkspace(self, silent=False):
         """
         Public method to get the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -164,11 +165,11 @@
         else:
             self.__workspace = self.__findWorkspace(silent=silent)
             return self.__workspace
-    
+
     def __findWorkspace(self, silent=False):
         """
         Private method to find the workspace directory.
-        
+
         @param silent flag indicating silent operations
         @type bool
         @return workspace directory used for saving files
@@ -176,9 +177,8 @@
         """
         # Attempts to find the path on the filesystem that represents the
         # plugged in PyBoard board.
-        deviceDirectories = Utilities.findVolume(self.DeviceVolumeName,
-                                                 findAll=True)
-        
+        deviceDirectories = Utilities.findVolume(self.DeviceVolumeName, findAll=True)
+
         if deviceDirectories:
             if len(deviceDirectories) == 1:
                 return deviceDirectories[0]
@@ -191,28 +191,29 @@
                 EricMessageBox.warning(
                     self.microPython,
                     self.tr("Workspace Directory"),
-                    self.tr("Python files for PyBoard can be edited in"
-                            " place, if the device volume is locally"
-                            " available. Such a volume was not found. In"
-                            " place editing will not be available."
-                            )
+                    self.tr(
+                        "Python files for PyBoard can be edited in"
+                        " place, if the device volume is locally"
+                        " available. Such a volume was not found. In"
+                        " place editing will not be available."
+                    ),
                 )
-            
+
             return super().getWorkspace()
-    
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
         return Preferences.getMicroPython("MicroPythonDocuUrl")
-        
+
     def getFirmwareUrl(self):
         """
         Public method to get the device firmware download URL.
-        
+
         @return firmware download URL of the device
         @rtype str
         """
@@ -221,34 +222,36 @@
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         connected = self.microPython.isConnected()
-        
-        act = menu.addAction(self.tr("Activate Bootloader"),
-                             self.__activateBootloader)
+
+        act = menu.addAction(self.tr("Activate Bootloader"), self.__activateBootloader)
         act.setEnabled(connected)
-        act = menu.addAction(self.tr("List DFU-capable Devices"),
-                             self.__listDfuCapableDevices)
+        act = menu.addAction(
+            self.tr("List DFU-capable Devices"), self.__listDfuCapableDevices
+        )
         act.setEnabled(not connected)
-        act = menu.addAction(self.tr("Flash MicroPython Firmware"),
-                             self.__flashMicroPython)
+        act = menu.addAction(
+            self.tr("Flash MicroPython Firmware"), self.__flashMicroPython
+        )
         act.setEnabled(not connected)
         menu.addSeparator()
-        menu.addAction(self.tr("MicroPython Flash Instructions"),
-                       self.__showFlashInstructions)
-    
+        menu.addAction(
+            self.tr("MicroPython Flash Instructions"), self.__showFlashInstructions
+        )
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return True
-    
+
     @pyqtSlot()
     def __showFlashInstructions(self):
         """
@@ -256,12 +259,13 @@
         MicroPython on the pyboard.
         """
         ericApp().getObject("UserInterface").launchHelpViewer(
-            PyBoardDevice.FlashInstructionsURL)
-    
+            PyBoardDevice.FlashInstructionsURL
+        )
+
     def __dfuUtilAvailable(self):
         """
         Private method to check the availability of dfu-util.
-        
+
         @return flag indicating the availability of dfu-util
         @rtype bool
         """
@@ -274,24 +278,26 @@
         else:
             if Utilities.isExecutable(program):
                 available = True
-        
+
         if not available:
             EricMessageBox.critical(
                 self.microPython,
                 self.tr("dfu-util not available"),
-                self.tr("""The dfu-util firmware flashing tool"""
-                        """ <b>dfu-util</b> cannot be found or is not"""
-                        """ executable. Ensure it is in the search path"""
-                        """ or configure it on the MicroPython"""
-                        """ configuration page.""")
+                self.tr(
+                    """The dfu-util firmware flashing tool"""
+                    """ <b>dfu-util</b> cannot be found or is not"""
+                    """ executable. Ensure it is in the search path"""
+                    """ or configure it on the MicroPython"""
+                    """ configuration page."""
+                ),
             )
-        
+
         return available
-    
+
     def __showDfuEnableInstructions(self, flash=True):
         """
         Private method to show some instructions to enable the DFU mode.
-        
+
         @param flash flag indicating to show a warning message for flashing
         @type bool
         @return flag indicating OK to continue or abort
@@ -305,25 +311,24 @@
             "<p>4. Re-connect your board</p>"
             "<hr />"
         )
-        
+
         if flash:
             msg += self.tr(
                 "<p><b>Warning:</b> Make sure that all other DFU capable"
                 " devices except your PyBoard are disconnected."
                 "<hr />"
             )
-        
-        msg += self.tr(
-            "<p>Press <b>OK</b> to continue...</p>"
-        )
+
+        msg += self.tr("<p>Press <b>OK</b> to continue...</p>")
         res = EricMessageBox.information(
             self.microPython,
             self.tr("Enable DFU mode"),
             msg,
-            EricMessageBox.Abort | EricMessageBox.Ok)
-        
+            EricMessageBox.Abort | EricMessageBox.Ok,
+        )
+
         return res == EricMessageBox.Ok
-    
+
     def __showDfuDisableInstructions(self):
         """
         Private method to show some instructions to disable the DFU mode.
@@ -336,12 +341,8 @@
             "<hr />"
             "<p>Press <b>OK</b> to continue...</p>"
         )
-        EricMessageBox.information(
-            self.microPython,
-            self.tr("Disable DFU mode"),
-            msg
-        )
-    
+        EricMessageBox.information(self.microPython, self.tr("Disable DFU mode"), msg)
+
     @pyqtSlot()
     def __listDfuCapableDevices(self):
         """
@@ -353,18 +354,17 @@
                 program = Preferences.getMicroPython("DfuUtilPath")
                 if not program:
                     program = "dfu-util"
-                
+
                 args = [
                     "--list",
                 ]
                 dlg = EricProcessDialog(
-                    self.tr("'dfu-util' Output"),
-                    self.tr("List DFU capable Devices")
+                    self.tr("'dfu-util' Output"), self.tr("List DFU capable Devices")
                 )
                 res = dlg.startProcess(program, args)
                 if res:
                     dlg.exec()
-    
+
     @pyqtSlot()
     def __flashMicroPython(self):
         """
@@ -376,39 +376,43 @@
                 program = Preferences.getMicroPython("DfuUtilPath")
                 if not program:
                     program = "dfu-util"
-                
+
                 downloadsPath = QStandardPaths.standardLocations(
-                    QStandardPaths.StandardLocation.DownloadLocation)[0]
+                    QStandardPaths.StandardLocation.DownloadLocation
+                )[0]
                 firmware = EricFileDialog.getOpenFileName(
                     self.microPython,
                     self.tr("Flash MicroPython Firmware"),
                     downloadsPath,
-                    self.tr(
-                        "MicroPython Firmware Files (*.dfu);;All Files (*)")
+                    self.tr("MicroPython Firmware Files (*.dfu);;All Files (*)"),
                 )
                 if firmware and os.path.exists(firmware):
                     args = [
-                        "--alt", "0",
-                        "--download", firmware,
+                        "--alt",
+                        "0",
+                        "--download",
+                        firmware,
                     ]
                     dlg = EricProcessDialog(
                         self.tr("'dfu-util' Output"),
-                        self.tr("Flash MicroPython Firmware")
+                        self.tr("Flash MicroPython Firmware"),
                     )
                     res = dlg.startProcess(program, args)
                     if res:
                         dlg.exec()
                         self.__showDfuDisableInstructions()
-    
+
     @pyqtSlot()
     def __activateBootloader(self):
         """
         Private slot to activate the bootloader and disconnect.
         """
         if self.microPython.isConnected():
-            self.microPython.commandsInterface().execute([
-                "import pyb",
-                "pyb.bootloader()",
-            ])
+            self.microPython.commandsInterface().execute(
+                [
+                    "import pyb",
+                    "pyb.bootloader()",
+                ]
+            )
             # simulate pressing the disconnect button
             self.microPython.on_connectButton_clicked()
--- a/src/eric7/MicroPython/RP2040Devices.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/RP2040Devices.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing the device for RP2040 based boards.
     """
+
     def __init__(self, microPythonWidget, deviceType, parent=None):
         """
         Constructor
-        
+
         @param microPythonWidget reference to the main MicroPython widget
         @type MicroPythonWidget
         @param deviceType device type assigned to this device interface
@@ -31,154 +32,162 @@
         @param parent reference to the parent object
         @type QObject
         """
-        super().__init__(
-            microPythonWidget, deviceType, parent)
-    
+        super().__init__(microPythonWidget, deviceType, parent)
+
     def setButtons(self):
         """
         Public method to enable the supported action buttons.
         """
         super().setButtons()
         self.microPython.setActionButtons(
-            run=True, repl=True, files=True, chart=HAS_QTCHART)
-    
+            run=True, repl=True, files=True, chart=HAS_QTCHART
+        )
+
     def forceInterrupt(self):
         """
         Public method to determine the need for an interrupt when opening the
         serial connection.
-        
+
         @return flag indicating an interrupt is needed
         @rtype bool
         """
         return False
-    
+
     def deviceName(self):
         """
         Public method to get the name of the device.
-        
+
         @return name of the device
         @rtype str
         """
         return self.tr("RP2040")
-    
+
     def canStartRepl(self):
         """
         Public method to determine, if a REPL can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a REPL
             and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canStartPlotter(self):
         """
         Public method to determine, if a Plotter can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def canRunScript(self):
         """
         Public method to determine, if a script can be executed.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             Plotter and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def runScript(self, script):
         """
         Public method to run the given Python script.
-        
+
         @param script script to be executed
         @type str
         """
         pythonScript = script.split("\n")
         self.sendCommands(pythonScript)
-    
+
     def canStartFileManager(self):
         """
         Public method to determine, if a File Manager can be started.
-        
+
         @return tuple containing a flag indicating it is safe to start a
             File Manager and a reason why it cannot.
         @rtype tuple of (bool, str)
         """
         return True, ""
-    
+
     def addDeviceMenuEntries(self, menu):
         """
         Public method to add device specific entries to the given menu.
-        
+
         @param menu reference to the context menu
         @type QMenu
         """
         connected = self.microPython.isConnected()
-        
-        act = menu.addAction(self.tr("Activate Bootloader"),
-                             self.__activateBootloader)
+
+        act = menu.addAction(self.tr("Activate Bootloader"), self.__activateBootloader)
         act.setEnabled(connected)
         act = menu.addAction(self.tr("Flash Firmware"), self.__flashPython)
         act.setEnabled(not connected)
-    
+
     def hasFlashMenuEntry(self):
         """
         Public method to check, if the device has its own flash menu entry.
-        
+
         @return flag indicating a specific flash menu entry
         @rtype bool
         """
         return True
-    
+
     @pyqtSlot()
     def __flashPython(self):
         """
         Private slot to flash a MicroPython firmware to the device.
         """
         from .UF2FlashDialog import UF2FlashDialog
+
         dlg = UF2FlashDialog(boardType="rp2040")
         dlg.exec()
-    
+
     def __activateBootloader(self):
         """
         Private method to switch the board into 'bootloader' mode.
         """
         if self.microPython.isConnected():
-            self.microPython.commandsInterface().execute([
-                "import machine",
-                "machine.bootloader()",
-            ])
+            self.microPython.commandsInterface().execute(
+                [
+                    "import machine",
+                    "machine.bootloader()",
+                ]
+            )
             # simulate pressing the disconnect button
             self.microPython.on_connectButton_clicked()
-    
+
     def getDocumentationUrl(self):
         """
         Public method to get the device documentation URL.
-        
+
         @return documentation URL of the device
         @rtype str
         """
         return Preferences.getMicroPython("MicroPythonDocuUrl")
-    
+
     def getDownloadMenuEntries(self):
         """
         Public method to retrieve the entries for the downloads menu.
-        
+
         @return list of tuples with menu text and URL to be opened for each
             entry
         @rtype list of tuple of (str, str)
         """
         return [
-            (self.tr("MicroPython Firmware"),
-             Preferences.getMicroPython("MicroPythonFirmwareUrl")),
+            (
+                self.tr("MicroPython Firmware"),
+                Preferences.getMicroPython("MicroPythonFirmwareUrl"),
+            ),
             ("<separator>", ""),
-            (self.tr("CircuitPython Firmware"),
-             Preferences.getMicroPython("CircuitPythonFirmwareUrl")),
-            (self.tr("CircuitPython Libraries"),
-             Preferences.getMicroPython("CircuitPythonLibrariesUrl"))
+            (
+                self.tr("CircuitPython Firmware"),
+                Preferences.getMicroPython("CircuitPythonFirmwareUrl"),
+            ),
+            (
+                self.tr("CircuitPython Libraries"),
+                Preferences.getMicroPython("CircuitPythonLibrariesUrl"),
+            ),
         ]
--- a/src/eric7/MicroPython/UF2FlashDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/UF2FlashDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,463 +28,463 @@
     "circuitpython": {
         "volumes": {
             (0x03EB, 0x2402): [
-                "SAMD21",         # SAMD21 Board
-                "SAME54",         # SAME54 Board
+                "SAMD21",  # SAMD21 Board
+                "SAME54",  # SAME54 Board
             ],
             (0x04D8, 0xEC44): [
-                "PYCUBEDBOOT",    # PyCubedv04
+                "PYCUBEDBOOT",  # PyCubedv04
             ],
             (0x04D8, 0xEC63): [
-                "BOOT",           # CircuitBrains Basic
+                "BOOT",  # CircuitBrains Basic
             ],
             (0x04D8, 0xEC64): [
-                "BOOT",           # CircuitBrains Deluxe
+                "BOOT",  # CircuitBrains Deluxe
             ],
             (0x04D8, 0xED5F): [
-                "UCHIPYBOOT",     # uChip CircuitPython
+                "UCHIPYBOOT",  # uChip CircuitPython
             ],
             (0x04D8, 0xEDB3): [
-                "USBHUBBOOT",     # Programmable USB Hub
+                "USBHUBBOOT",  # Programmable USB Hub
             ],
             (0x04D8, 0xEDBE): [
-                "SAM32BOOT",      # SAM32
+                "SAM32BOOT",  # SAM32
             ],
             (0x04D8, 0xEF66): [
-                "SENSEBOX",       # senseBox MCU
+                "SENSEBOX",  # senseBox MCU
             ],
             (0x1209, 0x2017): [
-                "MINISAMBOOT",    # Mini SAM M4
+                "MINISAMBOOT",  # Mini SAM M4
             ],
             (0x1209, 0x3252): [
-                "MCBS2OMBOOT",    # Module Clip w/Wroom
+                "MCBS2OMBOOT",  # Module Clip w/Wroom
             ],
             (0x1209, 0x3253): [
-                "MCBS2ERBOOT",    # Module Clip w/Wrover
+                "MCBS2ERBOOT",  # Module Clip w/Wrover
             ],
             (0x1209, 0x4D44): [
-                "ROBOM0BOOT",     # Robo HAT MM1
-                "ROBOM4BOOT",     # Robo HAT MM1 M4
+                "ROBOM0BOOT",  # Robo HAT MM1
+                "ROBOM4BOOT",  # Robo HAT MM1 M4
             ],
             (0x1209, 0x4DDD): [
-                "SapBOOT",        # CP Sapling
+                "SapBOOT",  # CP Sapling
             ],
             (0x1209, 0x7102): [
-                "MINISAMBOOT",    # Mini SAM M0
+                "MINISAMBOOT",  # Mini SAM M0
             ],
             (0x1209, 0x7A01): [
-                "MIKOTO-BOOT",    # Mikoto nRF52840
+                "MIKOTO-BOOT",  # Mikoto nRF52840
             ],
             (0x1209, 0x805A): [
-                "BASTBLE",        # Bast BLE
+                "BASTBLE",  # Bast BLE
             ],
             (0x1209, 0xE3E2): [
-                "StackRduino",    # StackRduino M0 PRO
+                "StackRduino",  # StackRduino M0 PRO
             ],
             (0x1209, 0xF501): [
-                "M4SHIMBOOT",     # M4-Shim
+                "M4SHIMBOOT",  # M4-Shim
             ],
             (0x15BA, 0x28DC): [
-                "OLMLIPOBOOT",    # ESP32S2 DevKit Lipo
+                "OLMLIPOBOOT",  # ESP32S2 DevKit Lipo
             ],
             (0x16D0, 0x0CDA): [
-                "AUTOMAT",        # automat
+                "AUTOMAT",  # automat
             ],
             (0x1B4F, 0x0022): [
-                "SFMM852BOOT",    # MicroMod nRF52840
+                "SFMM852BOOT",  # MicroMod nRF52840
             ],
             (0x1B4F, 0x002C): [
-                "THNG+32BOOT",    # Thing Plus - STM32
+                "THNG+32BOOT",  # Thing Plus - STM32
             ],
             (0x1B4F, 0x0D22): [
-                "SPARKFUN",       # SAMD21 Mini Breakout
+                "SPARKFUN",  # SAMD21 Mini Breakout
             ],
             (0x1B4F, 0x0D23): [
-                "SPARKFUN",       # SAMD21 Dev Breakout
+                "SPARKFUN",  # SAMD21 Dev Breakout
             ],
             (0x1D50, 0x6110): [
-                "ROBOTICS",       # Robotics
+                "ROBOTICS",  # Robotics
             ],
             (0x1D50, 0x6112): [
-                "RCBOOT",         # Wattuino RC
+                "RCBOOT",  # Wattuino RC
             ],
             (0x1D50, 0x6157): [
-                "BBOARDBOOT",     # nRF52840 BBoard
+                "BBOARDBOOT",  # nRF52840 BBoard
             ],
             (0x1D50, 0x6160): [
-                "BLUEMICRO",      # BlueMicro
+                "BLUEMICRO",  # BlueMicro
             ],
             (0x1D50, 0x616F): [
-                "BLUEMICRO",      # BlueMicro
+                "BLUEMICRO",  # BlueMicro
             ],
             (0x1FC9, 0x0094): [
-                "DblM33BOOT",     # Double M33
-                "LPC5528BOOT",    # LPCXpresso 55s28
-                "LPC5569BOOT",    # LPCXpresso 55s69
+                "DblM33BOOT",  # Double M33
+                "LPC5528BOOT",  # LPCXpresso 55s28
+                "LPC5569BOOT",  # LPCXpresso 55s69
             ],
             (0x1FC9, 0x0154): [
-                "K32L2BOOT",      # FRDM-K32L2B3
-                "K32L2BOOT",      # KUIIC
+                "K32L2BOOT",  # FRDM-K32L2B3
+                "K32L2BOOT",  # KUIIC
             ],
             (0x230A, 0x00E9): [
-                "TAU_BOOT",       # Tau
+                "TAU_BOOT",  # Tau
             ],
             (0x2341, 0x0057): [
-                "NANOBOOT",       # NANO 33 IoT
+                "NANOBOOT",  # NANO 33 IoT
             ],
             (0x2341, 0x8053): [
-                "MKR1300",        # MKR1300
+                "MKR1300",  # MKR1300
             ],
             (0x239A, 0x000F): [
-                "ITSYBOOT",       # ItsyBitsy M0 Express
+                "ITSYBOOT",  # ItsyBitsy M0 Express
             ],
             (0x239A, 0x0013): [
-                "METROBOOT",      # Metro M0
+                "METROBOOT",  # Metro M0
             ],
             (0x239A, 0x0015): [
-                "FEATHERBOOT",    # Feather M0
+                "FEATHERBOOT",  # Feather M0
             ],
             (0x239A, 0x0018): [
-                "CPLAYBOOT",      # CPlay Express
+                "CPLAYBOOT",  # CPlay Express
             ],
             (0x239A, 0x001B): [
-                "FEATHERBOOT",    # Feather M0 Express
+                "FEATHERBOOT",  # Feather M0 Express
             ],
             (0x239A, 0x001C): [
-                "GEMMABOOT",      # Gemma M0
+                "GEMMABOOT",  # Gemma M0
             ],
             (0x239A, 0x001E): [
-                "TRINKETBOOT",    # Trinket M0
+                "TRINKETBOOT",  # Trinket M0
             ],
             (0x239A, 0x0021): [
-                "METROM4BOOT",    # Metro M4 Express
+                "METROM4BOOT",  # Metro M4 Express
             ],
             (0x239A, 0x0022): [
-                "ARCADE-D5",      # Feather Arcade D51
-                "FEATHERBOOT",    # Feather M4 Express
+                "ARCADE-D5",  # Feather Arcade D51
+                "FEATHERBOOT",  # Feather M4 Express
             ],
             (0x239A, 0x0024): [
-                "RADIOBOOT",      # Radiofruit M0
+                "RADIOBOOT",  # Radiofruit M0
             ],
             (0x239A, 0x0027): [
-                "PIRKEYBOOT",     # pIRKey M0
+                "PIRKEYBOOT",  # pIRKey M0
             ],
             (0x239A, 0x0029): [
-                "ARGONBOOT  ",    # Argon
-                "BORONBOOT  ",    # Boron
-                "FTHR840BOOT",    # Feather nRF52840 Express
-                "MDK840DONGL",    # MDK nRF52840 USB Dongle
-                "WS52840EVK",     # Waveshare nRF52840 Eval
-                "XENONBOOT  ",    # Xenon
+                "ARGONBOOT  ",  # Argon
+                "BORONBOOT  ",  # Boron
+                "FTHR840BOOT",  # Feather nRF52840 Express
+                "MDK840DONGL",  # MDK nRF52840 USB Dongle
+                "WS52840EVK",  # Waveshare nRF52840 Eval
+                "XENONBOOT  ",  # Xenon
             ],
             (0x239A, 0x002B): [
-                "ARCADE-D5",      # Itsy Arcade D51
-                "ITSYM4BOOT",     # ItsyBitsy M4 Express
+                "ARCADE-D5",  # Itsy Arcade D51
+                "ITSYM4BOOT",  # ItsyBitsy M4 Express
             ],
             (0x239A, 0x002D): [
-                "CRICKITBOOT",    # crickit
+                "CRICKITBOOT",  # crickit
             ],
             (0x239A, 0x002F): [
-                "TRELM4BOOT",     # Trellis M4 Express
+                "TRELM4BOOT",  # Trellis M4 Express
             ],
             (0x239A, 0x0031): [
-                "GCM4BOOT",       # Grand Central M4 Express
+                "GCM4BOOT",  # Grand Central M4 Express
             ],
             (0x239A, 0x0033): [
-                "PYBADGEBOOT",    # PyBadge
+                "PYBADGEBOOT",  # PyBadge
             ],
             (0x239A, 0x0034): [
-                "BADGELCBOOT",    # BadgeLC
-                "PEWBOOT",        # PewPew
+                "BADGELCBOOT",  # BadgeLC
+                "PEWBOOT",  # PewPew
             ],
             (0x239A, 0x0035): [
-                "MKRZEROBOOT",    # MKRZero
-                "PORTALBOOT",     # PyPortal M4 Express
+                "MKRZEROBOOT",  # MKRZero
+                "PORTALBOOT",  # PyPortal M4 Express
             ],
             (0x239A, 0x0037): [
-                "METROM4BOOT",    # Metro M4 AirLift
+                "METROM4BOOT",  # Metro M4 AirLift
             ],
             (0x239A, 0x003D): [
-                "PYGAMERBOOT",    # PyGamer
+                "PYGAMERBOOT",  # PyGamer
             ],
             (0x239A, 0x003F): [
-                "METR840BOOT",    # Metro nRF52840 Express
+                "METR840BOOT",  # Metro nRF52840 Express
             ],
             (0x239A, 0x0045): [
-                "CPLAYBTBOOT",    # Circuit Playground nRF52840
+                "CPLAYBTBOOT",  # Circuit Playground nRF52840
             ],
             (0x239A, 0x0047): [
-                "MASKM4BOOT",     # Hallowing Mask M4
+                "MASKM4BOOT",  # Hallowing Mask M4
             ],
             (0x239A, 0x0049): [
-                "HALLOM4BOOT",    # HalloWing M4
+                "HALLOM4BOOT",  # HalloWing M4
             ],
             (0x239A, 0x004D): [
-                "SNEKBOOT",       # snekboard
+                "SNEKBOOT",  # snekboard
             ],
             (0x239A, 0x0051): [
-                "ITSY840BOOT",    # ItsyBitsy nRF52840 Express
+                "ITSY840BOOT",  # ItsyBitsy nRF52840 Express
             ],
             (0x239A, 0x0057): [
-                "SERPENTBOOT",    # Serpente
+                "SERPENTBOOT",  # Serpente
             ],
             (0x239A, 0x0059): [
-                "FTHR405BOOT",    # Feather STM32F405 Express
+                "FTHR405BOOT",  # Feather STM32F405 Express
             ],
             (0x239A, 0x005D): [
-                "BlackPill",      # STM32F401CxUx
-                "STMF411BOOT",    # STM32F411 Discovery
+                "BlackPill",  # STM32F401CxUx
+                "STMF411BOOT",  # STM32F411 Discovery
             ],
             (0x239A, 0x0061): [
-                "SOLBOOT",        # Sol
+                "SOLBOOT",  # Sol
             ],
             (0x239A, 0x0063): [
-                "NANO33BOOT",     # Nano 33 BLE
+                "NANO33BOOT",  # Nano 33 BLE
             ],
             (0x239A, 0x0065): [
-                "ND6BOOT",        # ndBit6
+                "ND6BOOT",  # ndBit6
             ],
             (0x239A, 0x0069): [
-                "STMF411BOOT",    # STM32F411 BlackPill
+                "STMF411BOOT",  # STM32F411 BlackPill
             ],
             (0x239A, 0x006B): [
-                "shIRtty",        # shIRtty
+                "shIRtty",  # shIRtty
             ],
             (0x239A, 0x0071): [
-                "CLUEBOOT",       # CLUE nRF52840
+                "CLUEBOOT",  # CLUE nRF52840
             ],
             (0x239A, 0x0077): [
-                "RT1010BOOT",     # RT1010 EVK
+                "RT1010BOOT",  # RT1010 EVK
             ],
             (0x239A, 0x0079): [
-                "ARAMBOOT",       # ARAMCON Badge 2019
+                "ARAMBOOT",  # ARAMCON Badge 2019
             ],
             (0x239A, 0x007B): [
-                "ARAMBOOT",       # ARAMCON2 Badge
+                "ARAMBOOT",  # ARAMCON2 Badge
             ],
             (0x239A, 0x007D): [
-                "BOOKBOOT",       # The Open Book Feather
+                "BOOKBOOT",  # The Open Book Feather
             ],
             (0x239A, 0x007F): [
-                "BADGEBOOT",      # OHS2020 Badge
+                "BADGEBOOT",  # OHS2020 Badge
             ],
             (0x239A, 0x0081): [
-                "RT1020BOOT",     # RT1020 EVK
-                "RT1024BOOT",     # RT1024 EVK
+                "RT1020BOOT",  # RT1020 EVK
+                "RT1024BOOT",  # RT1024 EVK
             ],
             (0x239A, 0x0083): [
-                "RT1060BOOT",     # RT1060 EVK
-                "RT1064BOOT",     # RT1064 EVK
+                "RT1060BOOT",  # RT1060 EVK
+                "RT1064BOOT",  # RT1064 EVK
             ],
             (0x239A, 0x0087): [
-                "FTHRSNSBOOT",    # Feather nRF52840 Sense
+                "FTHRSNSBOOT",  # Feather nRF52840 Sense
             ],
             (0x239A, 0x0093): [
-                "ISVITABoot",     # IkigaiSense Vita nRF52840
+                "ISVITABoot",  # IkigaiSense Vita nRF52840
             ],
             (0x239A, 0x0095): [
-                "UARTLOGBOOT",    # UARTLogger II
+                "UARTLOGBOOT",  # UARTLogger II
             ],
             (0x239A, 0x009F): [
-                "ADM840BOOT",     # AtelierDuMaker NRF52840 Breakout
+                "ADM840BOOT",  # AtelierDuMaker NRF52840 Breakout
             ],
             (0x239A, 0x00A5): [
-                "S3DKC1BOOT",     # ESP32S3 DevKitC 1
-                "S3DKM1BOOT",     # ESP32S3 DevKitM 1
-                "SAOLA1RBOOT",    # Saola 1R WROVER
+                "S3DKC1BOOT",  # ESP32S3 DevKitC 1
+                "S3DKM1BOOT",  # ESP32S3 DevKitM 1
+                "SAOLA1RBOOT",  # Saola 1R WROVER
             ],
             (0x239A, 0x00A7): [
-                "SAOLA1MBOOT",    # Saola 1M WROOM
+                "SAOLA1MBOOT",  # Saola 1M WROOM
             ],
             (0x239A, 0x00AB): [
-                "UFTHRS2BOOT",    # FeatherS2
+                "UFTHRS2BOOT",  # FeatherS2
             ],
             (0x239A, 0x00AF): [
-                "FLUFFBOOT",      # Fluff M0
+                "FLUFFBOOT",  # Fluff M0
             ],
             (0x239A, 0x00B3): [
-                "NICENANO",       # nice!nano
+                "NICENANO",  # nice!nano
             ],
             (0x239A, 0x00B5): [
-                "E54XBOOT",       # SAME54 Xplained
+                "E54XBOOT",  # SAME54 Xplained
             ],
             (0x239A, 0x00B9): [
-                "ND7BOOT",        # ndBit7
+                "ND7BOOT",  # ndBit7
             ],
             (0x239A, 0x00BB): [
-                "MDBT50QBOOT",    # Raytac MDBT50Q Demo Board 40
+                "MDBT50QBOOT",  # Raytac MDBT50Q Demo Board 40
             ],
             (0x239A, 0x00BF): [
-                "BADGEBOOT",      # BLM Badge
+                "BADGEBOOT",  # BLM Badge
             ],
             (0x239A, 0x00C3): [
-                "GEMINIBOOT",     # Gemini
+                "GEMINIBOOT",  # Gemini
             ],
             (0x239A, 0x00C5): [
-                "MICROS2BOOT",    # microS2
+                "MICROS2BOOT",  # microS2
             ],
             (0x239A, 0x00C7): [
-                "KALUGA1BOOT",    # Kaluga 1
+                "KALUGA1BOOT",  # Kaluga 1
             ],
             (0x239A, 0x00C9): [
-                "MATRIXBOOT",     # Matrix Portal M4
+                "MATRIXBOOT",  # Matrix Portal M4
             ],
             (0x239A, 0x00CB): [
-                "QTPY_BOOT",      # QT Py M0
+                "QTPY_BOOT",  # QT Py M0
             ],
             (0x239A, 0x00CD): [
-                "FTHRCANBOOT",    # Feather M4 CAN Express
+                "FTHRCANBOOT",  # Feather M4 CAN Express
             ],
             (0x239A, 0x00DE): [
-                "NANOESPBOOT",    # nanoESP32-S2 WROOM
+                "NANOESPBOOT",  # nanoESP32-S2 WROOM
             ],
             (0x239A, 0x00DF): [
-                "METROS2BOOT",    # Metro ESP32-S2
+                "METROS2BOOT",  # Metro ESP32-S2
             ],
             (0x239A, 0x00E1): [
-                "METROM7BOOT",    # Metro M7 iMX RT1011
+                "METROM7BOOT",  # Metro M7 iMX RT1011
             ],
             (0x239A, 0x00E5): [
-                "MAGTAGBOOT",     # Metro MagTag 2.9 Grayscale
-                "MAGTAGBOOT",     # MagTag 2.9 Grayscale
+                "MAGTAGBOOT",  # Metro MagTag 2.9 Grayscale
+                "MAGTAGBOOT",  # MagTag 2.9 Grayscale
             ],
             (0x239A, 0x00EB): [
-                "FTHRS2BOOT",     # Feather ESP32-S2
+                "FTHRS2BOOT",  # Feather ESP32-S2
             ],
             (0x239A, 0x00ED): [
-                "FTHRS2BOOT",     # Feather ESP32-S2 Reverse TFT
+                "FTHRS2BOOT",  # Feather ESP32-S2 Reverse TFT
             ],
             (0x239A, 0x00EF): [
-                "TRINKEYBOOT",    # NeoPixel Trinkey M0
+                "TRINKEYBOOT",  # NeoPixel Trinkey M0
             ],
             (0x239A, 0x00F5): [
-                "STARBOOT",       # Binary Star
+                "STARBOOT",  # Binary Star
             ],
             (0x239A, 0x00F9): [
-                "HOUSEBOOT",      # FunHouse
+                "HOUSEBOOT",  # FunHouse
             ],
             (0x239A, 0x00FB): [
-                "TRINKEYBOOT",    # Rotary Trinkey M0
+                "TRINKEYBOOT",  # Rotary Trinkey M0
             ],
             (0x239A, 0x00FF): [
-                "TRINKEYBOOT",    # NeoKey Trinkey M0
+                "TRINKEYBOOT",  # NeoKey Trinkey M0
             ],
             (0x239A, 0x0101): [
-                "TRINKEYBOOT",    # Slide Trinkey M0
+                "TRINKEYBOOT",  # Slide Trinkey M0
             ],
             (0x239A, 0x0103): [
-                "TRINKEYBOOT",    # ProxSense Trinkey M0
+                "TRINKEYBOOT",  # ProxSense Trinkey M0
             ],
             (0x239A, 0x010B): [
-                "MDBT50QBOOT",    # Raytac MDBT50Q-RX
+                "MDBT50QBOOT",  # Raytac MDBT50Q-RX
             ],
             (0x239A, 0x010D): [
-                "GLASSESBOOT",    # LED Glasses Driver nRF52840
+                "GLASSESBOOT",  # LED Glasses Driver nRF52840
             ],
             (0x239A, 0x010F): [
-                "FTHRS2BOOT",     # Feather ESP32-S2 TFT
+                "FTHRS2BOOT",  # Feather ESP32-S2 TFT
             ],
             (0x239A, 0x0111): [
-                "QTPYS2BOOT",     # QT Py ESP32-S2
+                "QTPYS2BOOT",  # QT Py ESP32-S2
             ],
             (0x239A, 0x0113): [
-                "FTHRS3BOOT",     # Feather ESP32-S3 No PSRAM
+                "FTHRS3BOOT",  # Feather ESP32-S3 No PSRAM
             ],
             (0x239A, 0x0115): [
-                "FEATHERBOOT",    # Feather M4 Adalogger
+                "FEATHERBOOT",  # Feather M4 Adalogger
             ],
             (0x239A, 0x0117): [
-                "CAMERABOOT",     # Camera
+                "CAMERABOOT",  # Camera
             ],
             (0x239A, 0x0119): [
-                "QTPYS3BOOT",     # QT Py ESP32-S3
+                "QTPYS3BOOT",  # QT Py ESP32-S3
             ],
             (0x239A, 0x800B): [
-                "ATMZBOOT",       # ATMegaZero ESP32-S2
+                "ATMZBOOT",  # ATMegaZero ESP32-S2
             ],
             (0x239A, 0xB000): [
-                "HALLOWBOOT",     # Hallowing M0
+                "HALLOWBOOT",  # Hallowing M0
             ],
             (0x239A, 0xE005): [
-                "HONKBOOT",       # Big Honking Button
+                "HONKBOOT",  # Big Honking Button
             ],
             (0x2886, 0x000D): [
-                "Grove Zero",     # Grove Zero
+                "Grove Zero",  # Grove Zero
             ],
             (0x2886, 0x002F): [
-                "Seeed XIAO",     # Seeeduino XIAO
+                "Seeed XIAO",  # Seeeduino XIAO
             ],
             (0x2886, 0xF00E): [
-                "PITAYAGO",       # Pitaya Go
+                "PITAYAGO",  # Pitaya Go
             ],
             (0x2886, 0xF00F): [
-                "M60KEYBOARD",    # MakerDiary M60 Mechanical Keyboard
-                "nRF52840M2",     # MakerDiary nRF52840 M.2 Module
+                "M60KEYBOARD",  # MakerDiary M60 Mechanical Keyboard
+                "nRF52840M2",  # MakerDiary nRF52840 M.2 Module
             ],
             (0x303A, 0x7000): [
-                "ESPHMI1BOOT",    # HMI 1
+                "ESPHMI1BOOT",  # HMI 1
             ],
             (0x303A, 0x8005): [
-                "TINYS2BOOT",     # TinyS2
+                "TINYS2BOOT",  # TinyS2
             ],
             (0x303A, 0x8008): [
-                "TTGOS2BOOT",     # TTGO_T8_S2_Display
+                "TTGOS2BOOT",  # TTGO_T8_S2_Display
             ],
             (0x303A, 0x800E): [
-                "CCMBRISBOOT",    # CucumberRIS v1.1
+                "CCMBRISBOOT",  # CucumberRIS v1.1
             ],
             (0x303A, 0x80B0): [
-                "RD00RBOOT",      # Reference Design RD00
+                "RD00RBOOT",  # Reference Design RD00
             ],
             (0x303A, 0x80B3): [
-                "NANOESPBOOT",    # nanoESP32-S2 WROVER
+                "NANOESPBOOT",  # nanoESP32-S2 WROVER
             ],
             (0x303A, 0x80B5): [
-                "FS2NEOBOOT",     # FeatherS2 Neo
+                "FS2NEOBOOT",  # FeatherS2 Neo
             ],
             (0x303A, 0x80B6): [
-                "MORPHBOOT",      # MORPHESP-240
+                "MORPHBOOT",  # MORPHESP-240
             ],
             (0x303A, 0x80C4): [
-                "S2MINIBOOT",     # S2 Mini
+                "S2MINIBOOT",  # S2 Mini
             ],
             (0x303A, 0x80C7): [
-                "S2PICOBOOT",     # S2 Pico
+                "S2PICOBOOT",  # S2 Pico
             ],
             (0x303A, 0x80D2): [
-                "TINYS3BOOT",     # TinyS3
+                "TINYS3BOOT",  # TinyS3
             ],
             (0x303A, 0x80D5): [
-                "PROS3BOOT",      # ProS3
+                "PROS3BOOT",  # ProS3
             ],
             (0x303A, 0x80D8): [
-                "UFTHRS3BOOT",    # FeatherS3
+                "UFTHRS3BOOT",  # FeatherS3
             ],
             (0x303A, 0x80DA): [
-                "HEXKYBOOT",      # HexKy-S2
+                "HEXKYBOOT",  # HexKy-S2
             ],
             (0x303A, 0x80DE): [
-                "LEAFS3BOOT",     # BPI-Leaf-S3
+                "LEAFS3BOOT",  # BPI-Leaf-S3
             ],
             (0x303A, 0x80E1): [
-                "LEAFS2BOOT",     # BPI-Leaf-S2
+                "LEAFS2BOOT",  # BPI-Leaf-S2
             ],
             (0x303A, 0x80E4): [
-                "BITS2BOOT",      # BPI-BIT-S2
+                "BITS2BOOT",  # BPI-BIT-S2
             ],
             (0x303A, 0x80EB): [
-                "TTGOS2BOOT",     # TTGO_T8_S2_WROOM
+                "TTGOS2BOOT",  # TTGO_T8_S2_WROOM
             ],
             (0x303A, 0x80EE): [
-                "TTGOS2BOOT",     # TTGO_T8_S2
+                "TTGOS2BOOT",  # TTGO_T8_S2
             ],
             (0x3171, 0x0100): [
-                "CMDBOOT",        # COMMANDER
+                "CMDBOOT",  # COMMANDER
             ],
             (0x80E7, 0x8111): [
-                "IOTS2BOOT",      # HiiBot IoTs2
+                "IOTS2BOOT",  # HiiBot IoTs2
             ],
             (0xCAFE, 0xFFFF): [
-                "F303BOOT",       # STM32F303 Discovery
+                "F303BOOT",  # STM32F303 Discovery
             ],
         },
         "instructions": QCoreApplication.translate(
@@ -501,16 +501,15 @@
             " mounting it).</li>"
             "<li>Select the firmware file to be flashed and click the"
             " flash button.</li>"
-            "</ol>"
+            "</ol>",
         ),
         "show_all": True,
         "firmware": "CircuitPython",
     },
-    
     "circuitpython_rp2040": {
         "volumes": {
             (0x239A, 0x80F4): [
-                "RPI-RP2",        # Raspberry Pi Pico loaded with CircuitPython
+                "RPI-RP2",  # Raspberry Pi Pico loaded with CircuitPython
             ],
         },
         "instructions": QCoreApplication.translate(
@@ -534,16 +533,15 @@
             " mounting it).</li>"
             "<li>Select the firmware file to be flashed and click the"
             " flash button.</li>"
-            "</ol>"
+            "</ol>",
         ),
         "show_all": False,
         "firmware": "CircuitPython",
     },
-    
     "rp2040": {
         "volumes": {
             (0x0000, 0x0000): [
-                "RPI-RP2",        # Raspberry Pi Pico does not present a TTY
+                "RPI-RP2",  # Raspberry Pi Pico does not present a TTY
             ],
         },
         "instructions": QCoreApplication.translate(
@@ -567,7 +565,7 @@
             " mounting it).</li>"
             "<li>Select the firmware file to be flashed and click the"
             " flash button.</li>"
-            "</ol>"
+            "</ol>",
         ),
         "show_all": True,
         "firmware": "MicroPython / CircuitPython",
@@ -578,7 +576,7 @@
 def getFoundDevices(boardType=""):
     """
     Function to get the list of known serial devices supporting UF2.
-    
+
     @param boardType specific board type to search for
     @type str
     @return list of tuples with the board type, the port description, the
@@ -586,29 +584,31 @@
     @rtype list of tuple of (str, str, int, int)
     """
     from PyQt6.QtSerialPort import QSerialPortInfo
-    
+
     foundDevices = []
-    
+
     availablePorts = QSerialPortInfo.availablePorts()
     for port in availablePorts:
         vid = port.vendorIdentifier()
         pid = port.productIdentifier()
-        
+
         if vid == 0 and pid == 0:
             # no device detected at port
             continue
-        
+
         for board in SupportedUF2Boards:
-            if (
-                (not boardType or (board.startswith(boardType))) and
-                (vid, pid) in SupportedUF2Boards[board]["volumes"]
-            ):
-                foundDevices.append((
-                    board,
-                    port.description(),
-                    (vid, pid),
-                ))
-    
+            if (not boardType or (board.startswith(boardType))) and (
+                vid,
+                pid,
+            ) in SupportedUF2Boards[board]["volumes"]:
+                foundDevices.append(
+                    (
+                        board,
+                        port.description(),
+                        (vid, pid),
+                    )
+                )
+
     # second run for boards needing special treatment (e.g. RP2040)
     for board in SupportedUF2Boards:
         if not boardType or (board == boardType):
@@ -619,13 +619,16 @@
                 for volume in volumes:
                     foundVolumes += Utilities.findVolume(volume, findAll=True)
                 if foundVolumes:
-                    foundDevices.append((
-                        board,
-                        QCoreApplication.translate(
-                            "UF2FlashDialog", "'{0}' Board").format(board),
-                        (0, 0),             # VID/PID of (0, 0) is special
-                    ))
-    
+                    foundDevices.append(
+                        (
+                            board,
+                            QCoreApplication.translate(
+                                "UF2FlashDialog", "'{0}' Board"
+                            ).format(board),
+                            (0, 0),  # VID/PID of (0, 0) is special
+                        )
+                    )
+
     return foundDevices
 
 
@@ -633,13 +636,14 @@
     """
     Class implementing a dialog to flash any UF2 capable device.
     """
+
     DeviceTypeRole = Qt.ItemDataRole.UserRole
     DeviceVidPidRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, boardType="", parent=None):
         """
         Constructor
-        
+
         @param boardType specific board type to show the dialog for
         @type str
         @param parent reference to the parent widget (defaults to None)
@@ -647,30 +651,30 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton.setIcon(UI.PixmapCache.getIcon("rescan"))
-        
+
         self.firmwarePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.firmwarePicker.setFilters(
-            self.tr("MicroPython/CircuitPython Files (*.uf2);;"
-                    "All Files (*)"))
-        
+            self.tr("MicroPython/CircuitPython Files (*.uf2);;" "All Files (*)")
+        )
+
         self.bootPicker.setMode(EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
         self.bootPicker.setEnabled(False)
-        
+
         self.__mandatoryStyleSheet = (
             "QLineEdit {border: 2px solid; border-color: #dd8888}"
-            if ericApp().usesDarkPalette() else
-            "QLineEdit {border: 2px solid; border-color: #800000}"
+            if ericApp().usesDarkPalette()
+            else "QLineEdit {border: 2px solid; border-color: #800000}"
         )
         self.__manualType = "<manual>"
-        
+
         self.__boardType = boardType
-        
+
         self.__populate()
-        
+
         self.__updateFlashButton()
-    
+
     def __populate(self):
         """
         Private method to (re-)populate the dialog.
@@ -678,63 +682,61 @@
         # save the currently selected device
         currentDevice = self.devicesComboBox.currentText()
         firmwareFile = self.firmwarePicker.text()
-        
+
         # clear the entries first
         self.devicesComboBox.clear()
         self.firmwarePicker.clear()
         self.bootPicker.clear()
         self.infoLabel.clear()
         self.infoEdit.clear()
-        
+
         # now populate the entries with data
         devices = getFoundDevices(boardType=self.__boardType)
         if len(devices) == 0:
             # no device detected
-            devices = list(filter(
-                lambda x: x[0] in SupportedUF2Boards,
-                MicroPythonDevices.getFoundDevices()[0]
-            ))
+            devices = list(
+                filter(
+                    lambda x: x[0] in SupportedUF2Boards,
+                    MicroPythonDevices.getFoundDevices()[0],
+                )
+            )
             if devices:
                 self.__showSpecificInstructions(list(devices))
             else:
                 self.__showAllInstructions()
             self.devicesComboBox.addItem("")
             self.devicesComboBox.addItem(self.tr("Manual Select"))
-            self.devicesComboBox.setItemData(1, self.__manualType,
-                                             self.DeviceTypeRole)
+            self.devicesComboBox.setItemData(1, self.__manualType, self.DeviceTypeRole)
         elif len(devices) == 1:
             # set the board type to the found one
             self.__boardType = devices[0][0]
-            
+
             self.devicesComboBox.addItem(devices[0][1])
-            self.devicesComboBox.setItemData(
-                0, devices[0][0], self.DeviceTypeRole)
-            self.devicesComboBox.setItemData(
-                0, devices[0][2], self.DeviceVidPidRole)
+            self.devicesComboBox.setItemData(0, devices[0][0], self.DeviceTypeRole)
+            self.devicesComboBox.setItemData(0, devices[0][2], self.DeviceVidPidRole)
             self.devicesComboBox.addItem(self.tr("Manual Select"))
-            self.devicesComboBox.setItemData(1, self.__manualType,
-                                             self.DeviceTypeRole)
+            self.devicesComboBox.setItemData(1, self.__manualType, self.DeviceTypeRole)
             self.on_devicesComboBox_currentIndexChanged(0)
         else:
             self.devicesComboBox.addItem("")
-            for index, (boardType, description,
-                        vidpid) in enumerate(sorted(devices), 1):
+            for index, (boardType, description, vidpid) in enumerate(
+                sorted(devices), 1
+            ):
                 self.devicesComboBox.addItem(description)
-                self.devicesComboBox.setItemData(
-                    index, boardType, self.DeviceTypeRole)
-                self.devicesComboBox.setItemData(
-                    index, vidpid, self.DeviceVidPidRole)
+                self.devicesComboBox.setItemData(index, boardType, self.DeviceTypeRole)
+                self.devicesComboBox.setItemData(index, vidpid, self.DeviceVidPidRole)
             self.devicesComboBox.addItem(self.tr("Manual Select"))
-            self.devicesComboBox.setItemData(index + 1, self.__manualType,
-                                             self.DeviceTypeRole)
-        
+            self.devicesComboBox.setItemData(
+                index + 1, self.__manualType, self.DeviceTypeRole
+            )
+
         # reselect the remembered device, if it is still there
         if currentDevice:
             self.devicesComboBox.setCurrentText(currentDevice)
             self.firmwarePicker.setText(firmwareFile)
         else:
             self.devicesComboBox.setCurrentIndex(0)
-    
+
     def __updateFlashButton(self):
         """
         Private method to update the state of the Flash button and the retest
@@ -746,7 +748,7 @@
                 self.firmwarePicker.setStyleSheet("")
             else:
                 self.firmwarePicker.setStyleSheet(self.__mandatoryStyleSheet)
-            
+
             if bool(self.bootPicker.text()):
                 self.bootPicker.setStyleSheet("")
             else:
@@ -754,21 +756,21 @@
         else:
             self.firmwarePicker.setStyleSheet("")
             self.bootPicker.setStyleSheet("")
-        
+
         enable = (
-            bool(self.bootPicker.text()) and
-            bool(firmwareFile) and
-            os.path.exists(firmwareFile)
+            bool(self.bootPicker.text())
+            and bool(firmwareFile)
+            and os.path.exists(firmwareFile)
         )
         self.flashButton.setEnabled(enable)
-    
+
     def __showAllInstructions(self):
         """
         Private method to show instructions for resetting devices to bootloader
         mode.
         """
         self.infoLabel.setText(self.tr("Reset Instructions:"))
-        
+
         htmlText = self.tr(
             "<h4>No known devices detected.</h4>"
             "<p>Follow the appropriate instructions below to set <b>one</b>"
@@ -777,24 +779,21 @@
         )
         for boardType in SupportedUF2Boards:
             if SupportedUF2Boards[boardType]["show_all"]:
-                htmlText += (
-                    "<hr/>" +
-                    SupportedUF2Boards[boardType]["instructions"]
-                )
+                htmlText += "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
         self.infoEdit.setHtml(htmlText)
-    
+
     def __showSpecificInstructions(self, devices):
         """
         Private method to show instructions for resetting devices to bootloader
         mode for a list of detected devices.
-        
+
         @param devices list of detected devices
         @type list of str
         """
         boardTypes = {x[0] for x in devices}
-        
+
         self.infoLabel.setText(self.tr("Reset Instructions:"))
-        
+
         if self.__boardType:
             htmlText = self.tr(
                 "<h4>Flash {0} Firmware</h4>"
@@ -812,25 +811,21 @@
                 "<ul><li>{0}</li></ul>"
                 "<p>Follow the instructions below to set <b>one</b> board into"
                 " 'bootloader' mode. Press <b>Refresh</b> when ready.</p>"
-            ).format(
-                "</li><li>".join(sorted(x[1] for x in devices))
-            )
+            ).format("</li><li>".join(sorted(x[1] for x in devices)))
             for boardType in sorted(boardTypes):
-                htmlText += (
-                    "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
-                )
+                htmlText += "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
         self.infoEdit.setHtml(htmlText)
-    
+
     def __showTypedInstructions(self, boardType):
         """
         Private method to show instructions for resetting devices to bootloader
         mode for a specific board type.
-        
+
         @param boardType type of the board to show instructions for
         @type str
         """
         self.infoLabel.setText(self.tr("Reset Instructions:"))
-        
+
         htmlText = self.tr(
             "<h4>No known devices detected.</h4>"
             "<p>Follow the instructions below to set <b>one</b> board into"
@@ -838,13 +833,13 @@
         )
         htmlText += "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
         self.infoEdit.setHtml(htmlText)
-    
+
     def __showManualInstructions(self):
         """
         Private method to show instructions for flashing devices manually.
         """
         self.infoLabel.setText(self.tr("Flash Instructions:"))
-        
+
         htmlText = self.tr(
             "<h4>Flash method 'manual' selected.</h4>"
             "<p>Follow the instructions below to flash a device by entering"
@@ -860,18 +855,18 @@
         for boardType in SupportedUF2Boards:
             htmlText += "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
         self.infoEdit.setHtml(htmlText)
-    
+
     def __showNoVolumeInformation(self, volumes, boardType):
         """
         Private method to show information about the expected boot volume(s).
-        
+
         @param volumes list of expected volume names
         @type list of str
         @param boardType type of the board to show instructions for
         @type str
         """
         self.infoLabel.setText(self.tr("Boot Volume not found:"))
-        
+
         htmlText = self.tr(
             "<h4>No Boot Volume detected.</h4>"
             "<p>Please ensure that the boot volume of the device to be flashed"
@@ -888,7 +883,7 @@
                 "<ul><li>{0}</li></ul>"
                 "<p>Press <b>Refresh</b> when ready.</p>"
             ).format("</li><li>".join(sorted(volumes)))
-        
+
         if boardType:
             htmlText += self.tr(
                 "<h4>Reset Instructions</h4>"
@@ -896,21 +891,21 @@
                 " 'bootloader' mode. Press <b>Refresh</b> when ready.</p>"
             )
             htmlText += "<hr/>" + SupportedUF2Boards[boardType]["instructions"]
-        
+
         self.infoEdit.setHtml(htmlText)
-    
+
     def __showMultipleVolumesInformation(self, volumePaths):
         """
         Private method to show information because multiple devices of the
         same type are ready for flashing.
-        
+
         Note: This is a dangerous situation!
-        
+
         @param volumePaths list of volume paths
         @type list of str
         """
         self.infoLabel.setText(self.tr("Multiple Boot Volumes found:"))
-        
+
         htmlText = self.tr(
             "<h4>Multiple Boot Volumes were found</h4>"
             "<p>These volume paths were found.</p><ul><li>{0}</li></ul>"
@@ -918,7 +913,7 @@
             " flashing. Press <b>Refresh</b> when ready.</p>"
         ).format("</li><li>".join(sorted(volumePaths)))
         self.infoEdit.setHtml(htmlText)
-    
+
     @pyqtSlot()
     def on_flashButton_clicked(self):
         """
@@ -931,24 +926,28 @@
         if os.path.exists(firmwarePath) and os.path.exists(volumePath):
             if boardType == self.__manualType:
                 self.infoLabel.setText(self.tr("Flashing Firmware"))
-                self.infoEdit.setHtml(self.tr(
-                    "<p>Flashing the selected firmware to the device. Please"
-                    " wait until the device resets automatically.</p>")
+                self.infoEdit.setHtml(
+                    self.tr(
+                        "<p>Flashing the selected firmware to the device. Please"
+                        " wait until the device resets automatically.</p>"
+                    )
                 )
             else:
                 firmwareType = SupportedUF2Boards[boardType]["firmware"]
-                self.infoLabel.setText(
-                    self.tr("Flashing {0}").format(firmwareType))
-                self.infoEdit.setHtml(self.tr(
-                    "<p>Flashing the {0} firmware to the device. Please wait"
-                    " until the device resets automatically.</p>"
-                ).format(firmwareType))
+                self.infoLabel.setText(self.tr("Flashing {0}").format(firmwareType))
+                self.infoEdit.setHtml(
+                    self.tr(
+                        "<p>Flashing the {0} firmware to the device. Please wait"
+                        " until the device resets automatically.</p>"
+                    ).format(firmwareType)
+                )
             QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
             shutil.copy2(firmwarePath, volumePath)
             QThread.sleep(1)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -957,24 +956,24 @@
         # special treatment for RPi Pico
         if self.__boardType == "circuitpython_rp2040":
             self.__boardType = "rp2040"
-        
+
         self.__populate()
-    
+
     @pyqtSlot(int)
     def on_devicesComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a board.
-        
+
         @param index selected index
         @type int
         """
         vidpid = self.devicesComboBox.itemData(index, self.DeviceVidPidRole)
         boardType = self.devicesComboBox.itemData(index, self.DeviceTypeRole)
-        
+
         self.bootPicker.setEnabled(boardType == self.__manualType)
         if boardType == self.__manualType:
             self.__showManualInstructions()
-        
+
         if vidpid is None:
             if boardType is None:
                 self.bootPicker.clear()
@@ -983,7 +982,7 @@
             foundVolumes = []
             for volume in volumes:
                 foundVolumes += Utilities.findVolume(volume, findAll=True)
-            
+
             if len(foundVolumes) == 0:
                 self.__showNoVolumeInformation(volumes, boardType)
                 self.bootPicker.clear()
@@ -992,24 +991,24 @@
             else:
                 self.__showMultipleVolumesInformation()
                 self.bootPicker.clear()
-        
+
         self.__updateFlashButton()
-    
+
     @pyqtSlot(str)
     def on_firmwarePicker_textChanged(self, text):
         """
         Private slot handling a change of the firmware file.
-        
+
         @param text current text of the firmware edit
         @type str
         """
         self.__updateFlashButton()
-    
+
     @pyqtSlot(str)
     def on_bootPicker_textChanged(self, text):
         """
         Private slot handling a change of the boot volume.
-        
+
         @param text current text of the boot volume edit
         @type str
         """
--- a/src/eric7/MicroPython/UnknownDevicesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MicroPython/UnknownDevicesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,44 +23,47 @@
     """
     Class implementing a dialog to manage the list of unknown devices.
     """
+
     DeviceDataRole = Qt.ItemDataRole.UserRole
     ModifiedRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__loadDevices()
-    
+
     def __loadDevices(self):
         """
         Private method to load the list of unknown devices.
         """
         self.deviceList.clear()
-        
+
         devices = Preferences.getMicroPython("ManualDevices")
         for device in devices:
             itm = QListWidgetItem(
-                self.tr("{0} (0x{1:04x}/0x{2:04x})", "description, VID, PID")
-                .format(device["description"], device["vid"], device["pid"]),
-                self.deviceList)
+                self.tr("{0} (0x{1:04x}/0x{2:04x})", "description, VID, PID").format(
+                    device["description"], device["vid"], device["pid"]
+                ),
+                self.deviceList,
+            )
             itm.setData(self.DeviceDataRole, device)
             itm.setData(self.ModifiedRole, False)
-        
+
         self.__initialDeviceCount = self.deviceList.count()
-        
+
         self.__checkButtons()
-    
+
     def __isDirty(self):
         """
         Private method to check, if the dialog contains unsaved data.
-        
+
         @return flag indicating the presence of unsaved data
         @rtype bool
         """
@@ -69,44 +72,45 @@
             dirty |= self.deviceList.item(row).data(self.ModifiedRole)
         dirty |= self.deviceList.count() != self.__initialDeviceCount
         return dirty
-    
+
     def __editItem(self, item):
         """
         Private method to edit the given item.
-        
+
         @param item reference to the item to be edited
         @type QListWidgetItem
         """
         if item is None:
             # play it safe
             return
-        
+
         from .AddEditDevicesDialog import AddEditDevicesDialog
+
         dlg = AddEditDevicesDialog(deviceData=item.data(self.DeviceDataRole))
         if dlg.exec() == QDialog.DialogCode.Accepted:
             deviceDict = dlg.getDeviceDict()
             item.setData(self.DeviceDataRole, deviceDict)
             item.setData(self.ModifiedRole, True)
-            
-            item.setText(self.tr("{0} (*)", "list entry is modified")
-                         .format(item.text()))
-    
+
+            item.setText(
+                self.tr("{0} (*)", "list entry is modified").format(item.text())
+            )
+
     def __saveDeviceData(self):
         """
         Private method to save the device data.
-        
+
         @return flag indicating a successful save
         @rtype bool
         """
         devices = []
-        
+
         for row in range(self.deviceList.count()):
-            devices.append(self.deviceList.item(row).data(
-                self.DeviceDataRole))
+            devices.append(self.deviceList.item(row).data(self.DeviceDataRole))
         Preferences.setMicroPython("ManualDevices", devices)
-        
+
         return True
-    
+
     @pyqtSlot()
     def __checkButtons(self):
         """
@@ -115,24 +119,24 @@
         selectedItemsCount = len(self.deviceList.selectedItems())
         self.editButton.setEnabled(selectedItemsCount == 1)
         self.deleteButton.setEnabled(selectedItemsCount >= 1)
-    
+
     @pyqtSlot(QListWidgetItem)
     def on_deviceList_itemActivated(self, item):
         """
         Private slot to edit the data of the activated item.
-        
+
         @param item reference to the activated item
         @type QListWidgetItem
         """
         self.__editItem(item)
-    
+
     @pyqtSlot()
     def on_deviceList_itemSelectionChanged(self):
         """
         Private slot to handle a change of selected items.
         """
         self.__checkButtons()
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -140,7 +144,7 @@
         """
         itm = self.deviceList.selectedItems()[0]
         self.__editItem(itm)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -153,15 +157,18 @@
             ok = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Unknown Devices"),
-                self.tr("The selected entries contain some with modified"
-                        " data. Shall they really be deleted?"))
+                self.tr(
+                    "The selected entries contain some with modified"
+                    " data. Shall they really be deleted?"
+                ),
+            )
             if not ok:
                 return
-        
+
         for itm in self.deviceList.selectedItems():
             self.deviceList.takeItem(self.deviceList.row(itm))
             del itm
-    
+
     @pyqtSlot()
     def on_deleteAllButton_clicked(self):
         """
@@ -171,13 +178,16 @@
             ok = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Unknown Devices"),
-                self.tr("The list contains some devices with modified"
-                        " data. Shall they really be deleted?"))
+                self.tr(
+                    "The list contains some devices with modified"
+                    " data. Shall they really be deleted?"
+                ),
+            )
             if not ok:
                 return
-            
+
         self.deviceList.clear()
-    
+
     @pyqtSlot()
     def on_restoreButton_clicked(self):
         """
@@ -187,14 +197,17 @@
             ok = EricMessageBox.yesNo(
                 self,
                 self.tr("Restore Unknown Devices"),
-                self.tr("Restoring the list of unknown devices will overwrite"
-                        " all changes made. Do you really want to restore the"
-                        " list?"))
+                self.tr(
+                    "Restoring the list of unknown devices will overwrite"
+                    " all changes made. Do you really want to restore the"
+                    " list?"
+                ),
+            )
             if not ok:
                 return
-        
+
         self.__loadDevices()
-    
+
     @pyqtSlot()
     def on_reportButton_clicked(self):
         """
@@ -207,10 +220,9 @@
                 " Please add them.",
                 "",
             ]
-            
+
             for row in range(self.deviceList.count()):
-                deviceDict = self.deviceList.item(row).data(
-                    self.DeviceDataRole)
+                deviceDict = self.deviceList.item(row).data(self.DeviceDataRole)
                 bodyList += [
                     "Board #{0}:".format(row),
                     "  VID: {0}".format(deviceDict["vid"]),
@@ -219,28 +231,28 @@
                     "  Device Type: {0}".format(deviceDict["type"]),
                     "  Data Volume: {0}".format(deviceDict["data_volume"]),
                     "  Flash Volume: {0}".format(deviceDict["flash_volume"]),
-                    ""
+                    "",
                 ]
-            
+
             urlQuery = QUrlQuery()
             urlQuery.addQueryItem("subject", "Unsupported MicroPython Devices")
             urlQuery.addQueryItem("body", "\r\n".join(bodyList))
-            
+
             url = QUrl("mailto:{0}".format(BugAddress))
             url.setQuery(urlQuery)
-            
+
             QDesktopServices.openUrl(url)
-    
+
     @pyqtSlot()
     def on_buttonBox_accepted(self):
         """
         Private slot to handle the OK button press.
-        
+
         This action saves the edited list to the preferences store.
         """
         self.__saveDeviceData()
         self.accept()
-    
+
     @pyqtSlot()
     def on_buttonBox_rejected(self):
         """
@@ -250,10 +262,12 @@
             ok = EricMessageBox.okToClearData(
                 self,
                 self.tr("Unsaved Data"),
-                self.tr("""The list of devices contains some with modified"""
-                        """ data."""),
-                self.__saveDeviceData)
+                self.tr(
+                    """The list of devices contains some with modified""" """ data."""
+                ),
+                self.__saveDeviceData,
+            )
             if not ok:
                 return
-        
+
         self.reject()
--- a/src/eric7/MultiProject/AddProjectDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MultiProject/AddProjectDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,13 @@
     """
     Class implementing the add project dialog.
     """
-    def __init__(self, parent=None, startdir="", project=None,
-                 categories=None, category=""):
+
+    def __init__(
+        self, parent=None, startdir="", project=None, categories=None, category=""
+    ):
         """
         Constructor
-        
+
         @param parent parent widget of this dialog
         @type QWidget
         @param startdir start directory for the selection dialog
@@ -42,42 +44,43 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.filenamePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.filenamePicker.setFilters(
-            self.tr("Project Files (*.epj);;XML Project Files (*.e4p)"))
+            self.tr("Project Files (*.epj);;XML Project Files (*.e4p)")
+        )
         self.filenamePicker.setDefaultDirectory(
-            Preferences.getMultiProject("Workspace"))
-        
+            Preferences.getMultiProject("Workspace")
+        )
+
         if categories:
             self.categoryComboBox.addItem("")
             self.categoryComboBox.addItems(sorted(categories))
         self.categoryComboBox.setEditText(category)
-        
+
         self.startdir = startdir
         self.uid = ""
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.__okButton.setEnabled(False)
-        
+
         if project is not None:
             self.setWindowTitle(self.tr("Project Properties"))
-            
-            self.nameEdit.setText(project['name'])
-            self.filenamePicker.setText(project['file'])
-            self.descriptionEdit.setPlainText(project['description'])
-            self.masterCheckBox.setChecked(project['master'])
-            index = self.categoryComboBox.findText(project['category'])
+
+            self.nameEdit.setText(project["name"])
+            self.filenamePicker.setText(project["file"])
+            self.descriptionEdit.setPlainText(project["description"])
+            self.masterCheckBox.setChecked(project["master"])
+            index = self.categoryComboBox.findText(project["category"])
             if index == -1:
                 index = 0
             self.categoryComboBox.setCurrentIndex(index)
             self.uid = project["uid"]
-    
+
     def getData(self):
         """
         Public slot to retrieve the dialogs data.
-        
+
         @return tuple of five values (string, string, boolean, string, string)
             giving the project name, the name of the project file, a flag
             telling whether the project shall be the main project, a short
@@ -86,40 +89,45 @@
         if not self.uid:
             # new project entry
             from PyQt6.QtCore import QUuid
+
             self.uid = QUuid.createUuid().toString()
-        
+
         filename = self.filenamePicker.text()
         if not os.path.isabs(filename):
             filename = Utilities.toNativeSeparators(
-                os.path.join(self.startdir, filename))
-        return (self.nameEdit.text(),
-                filename,
-                self.masterCheckBox.isChecked(),
-                self.descriptionEdit.toPlainText(),
-                self.categoryComboBox.currentText(),
-                self.uid)
-    
+                os.path.join(self.startdir, filename)
+            )
+        return (
+            self.nameEdit.text(),
+            filename,
+            self.masterCheckBox.isChecked(),
+            self.descriptionEdit.toPlainText(),
+            self.categoryComboBox.currentText(),
+            self.uid,
+        )
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot called when the project name has changed.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUi()
-    
+
     @pyqtSlot(str)
     def on_filenamePicker_textChanged(self, txt):
         """
         Private slot called when the project filename has changed.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUi()
-    
+
     def __updateUi(self):
         """
         Private method to update the dialog.
         """
-        self.__okButton.setEnabled(self.nameEdit.text() != "" and
-                                   self.filenamePicker.text() != "")
+        self.__okButton.setEnabled(
+            self.nameEdit.text() != "" and self.filenamePicker.text() != ""
+        )
--- a/src/eric7/MultiProject/MultiProject.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MultiProject/MultiProject.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 import contextlib
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QFile, QIODevice, QObject, QUuid
-)
+from PyQt6.QtCore import pyqtSignal, pyqtSlot, QFile, QIODevice, QObject, QUuid
 from PyQt6.QtWidgets import QMenu, QDialog, QToolBar
 
 from Globals import recentNameMultiProject
@@ -35,7 +33,7 @@
 class MultiProject(QObject):
     """
     Class implementing the project management functionality.
-    
+
     @signal dirty(bool) emitted when the dirty state changes
     @signal newMultiProject() emitted after a new multi project was generated
     @signal multiProjectOpened() emitted after a multi project file was read
@@ -52,6 +50,7 @@
             has been removed
     @signal projectOpened(filename) emitted after the project has been opened
     """
+
     dirty = pyqtSignal(bool)
     newMultiProject = pyqtSignal()
     multiProjectOpened = pyqtSignal()
@@ -62,40 +61,40 @@
     projectAdded = pyqtSignal(dict)
     projectRemoved = pyqtSignal(dict)
     projectOpened = pyqtSignal(str)
-    
+
     def __init__(self, project, parent=None, filename=None):
         """
         Constructor
-        
+
         @param project reference to the project object (Project.Project)
         @param parent parent widget (usually the ui object) (QWidget)
         @param filename optional filename of a multi project file to open
             (string)
         """
         super().__init__(parent)
-        
+
         self.ui = parent
         self.projectObject = project
-        
+
         self.__initData()
-        
+
         self.__multiProjectFile = MultiProjectFile(self)
-        
+
         self.recent = []
         self.__loadRecent()
-        
+
         if filename is not None:
             self.openMultiProject(filename)
-    
+
     def __initData(self):
         """
         Private method to initialize the multi project data part.
         """
-        self.loaded = False     # flag for the loaded status
-        self.__dirty = False      # dirty flag
-        self.pfile = ""         # name of the multi project file
-        self.ppath = ""         # name of the multi project directory
-        self.description = ""   # description of the multi project
+        self.loaded = False  # flag for the loaded status
+        self.__dirty = False  # dirty flag
+        self.pfile = ""  # name of the multi project file
+        self.ppath = ""  # name of the multi project directory
+        self.description = ""  # description of the multi project
         self.name = ""
         self.opened = False
         self.__projects = {}
@@ -108,7 +107,7 @@
         # 'category'    : name of the group
         # 'uid'         : unique identifier
         self.categories = []
-    
+
     def __loadRecent(self):
         """
         Private method to load the recently opened multi project filenames.
@@ -120,111 +119,107 @@
             for f in rp:
                 if pathlib.Path(f).exists():
                     self.recent.append(f)
-    
+
     def __saveRecent(self):
         """
         Private method to save the list of recently opened filenames.
         """
-        Preferences.Prefs.rsettings.setValue(
-            recentNameMultiProject, self.recent)
+        Preferences.Prefs.rsettings.setValue(recentNameMultiProject, self.recent)
         Preferences.Prefs.rsettings.sync()
-    
+
     def getMostRecent(self):
         """
         Public method to get the most recently opened multiproject.
-        
+
         @return path of the most recently opened multiproject (string)
         """
         if len(self.recent):
             return self.recent[0]
         else:
             return None
-        
+
     def setDirty(self, b):
         """
         Public method to set the dirty state.
-        
+
         It emits the signal dirty(int).
-        
+
         @param b dirty state (boolean)
         """
         self.__dirty = b
         self.saveAct.setEnabled(b)
         self.dirty.emit(bool(b))
-    
+
     def isDirty(self):
         """
         Public method to return the dirty state.
-        
+
         @return dirty state (boolean)
         """
         return self.__dirty
-    
+
     def isOpen(self):
         """
         Public method to return the opened state.
-        
+
         @return open state (boolean)
         """
         return self.opened
-    
+
     def getMultiProjectPath(self):
         """
         Public method to get the multi project path.
-        
+
         @return multi project path (string)
         """
         return self.ppath
-    
+
     def getMultiProjectFile(self):
         """
         Public method to get the path of the multi project file.
-        
+
         @return path of the multi project file (string)
         """
         return self.pfile
-    
+
     def __checkFilesExist(self):
         """
         Private method to check, if the files in a list exist.
-        
+
         The project files are checked for existance in the
         filesystem. Non existant projects are removed from the list and the
         dirty state of the multi project is changed accordingly.
         """
         removelist = []
         for key, project in self.__projects.items():
-            if not os.path.exists(project['file']):
+            if not os.path.exists(project["file"]):
                 removelist.append(key)
-        
+
         if removelist:
             for key in removelist:
                 del self.__projects[key]
             self.setDirty(True)
-    
+
     def __extractCategories(self):
         """
         Private slot to extract the categories used in the project definitions.
         """
         for project in self.__projects.values():
-            if (
-                project['category'] and
-                project['category'] not in self.categories
-            ):
-                self.categories.append(project['category'])
-    
+            if project["category"] and project["category"] not in self.categories:
+                self.categories.append(project["category"])
+
     def getCategories(self):
         """
         Public method to get the list of defined categories.
-        
+
         @return list of categories (list of string)
         """
         return [c for c in self.categories if c]
-    
+
     def __readMultiProject(self, fn):
         """
         Private method to read in a multi project (.emj, .e4m, .e5m) file.
-        
+
         @param fn filename of the multi project file to be read (string)
         @return flag indicating success
         """
@@ -238,6 +233,7 @@
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
                 with EricOverrideCursor():
                     from EricXML.MultiProjectReader import MultiProjectReader
+
                     reader = MultiProjectReader(f, self)
                     reader.readXML()
                     f.close()
@@ -247,30 +243,31 @@
                     self.ui,
                     self.tr("Read Multi Project File"),
                     self.tr(
-                        "<p>The multi project file <b>{0}</b> could not be"
-                        " read.</p>").format(fn))
+                        "<p>The multi project file <b>{0}</b> could not be" " read.</p>"
+                    ).format(fn),
+                )
                 res = False
-        
+
         if res:
             self.pfile = os.path.abspath(fn)
             self.ppath = os.path.abspath(os.path.dirname(fn))
-            
+
             self.__extractCategories()
-            
+
             # insert filename into list of recently opened multi projects
             self.__syncRecent()
-            
+
             self.name = os.path.splitext(os.path.basename(fn))[0]
-            
+
             # check, if the files of the multi project still exist
             self.__checkFilesExist()
-        
+
         return res
 
     def __writeMultiProject(self, fn=None):
         """
         Private method to save the multi project infos to a multi project file.
-        
+
         @param fn optional filename of the multi project file to be written.
             If fn is None, the filename stored in the multi project object
             is used. This is the 'save' action. If fn is given, this filename
@@ -280,83 +277,83 @@
         """
         if fn is None:
             fn = self.pfile
-        
+
         res = self.__multiProjectFile.writeFile(fn)
         if res:
             self.pfile = os.path.abspath(fn)
             self.ppath = os.path.abspath(os.path.dirname(fn))
             self.name = os.path.splitext(os.path.basename(fn))[0]
             self.setDirty(False)
-            
+
             # insert filename into list of recently opened projects
             self.__syncRecent()
-        
+
         return res
-    
+
     def addProject(self, project):
         """
         Public method to add a project to the multi-project.
-        
+
         @param project dictionary containing the project data to be added
         @type dict
         """
-        self.__projects[project['uid']] = project
-    
+        self.__projects[project["uid"]] = project
+
     @pyqtSlot()
     def addNewProject(self, startdir="", category=""):
         """
         Public slot used to add a new project to the multi-project.
-        
+
         @param startdir start directory for the selection dialog
         @type str
         @param category category to be preset
         @type str
         """
         from .AddProjectDialog import AddProjectDialog
+
         if not startdir:
             startdir = self.ppath
         if not startdir:
             startdir = Preferences.getMultiProject("Workspace")
-        dlg = AddProjectDialog(self.ui, startdir=startdir,
-                               categories=self.categories, category=category)
+        dlg = AddProjectDialog(
+            self.ui, startdir=startdir, categories=self.categories, category=category
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            name, filename, isMaster, description, category, uid = (
-                dlg.getData()
-            )
-            
+            name, filename, isMaster, description, category, uid = dlg.getData()
+
             # step 1: check, if project was already added
             for project in self.__projects.values():
-                if project['file'] == filename:
+                if project["file"] == filename:
                     return
-            
+
             # step 2: check, if master should be changed
             if isMaster:
                 for project in self.__projects.values():
-                    if project['master']:
-                        project['master'] = False
+                    if project["master"]:
+                        project["master"] = False
                         self.projectDataChanged.emit(project)
                         self.setDirty(True)
                         break
-            
+
             # step 3: add the project entry
             project = {
-                'name': name,
-                'file': filename,
-                'master': isMaster,
-                'description': description,
-                'category': category,
-                'uid': uid,
+                "name": name,
+                "file": filename,
+                "master": isMaster,
+                "description": description,
+                "category": category,
+                "uid": uid,
             }
             self.__projects[uid] = project
             if category not in self.categories:
                 self.categories.append(category)
             self.projectAdded.emit(project)
             self.setDirty(True)
-    
+
     def copyProject(self, uid):
         """
         Public method to copy the project with given UID on disk.
-        
+
         @param uid UID of the project to copy
         @type str
         """
@@ -369,84 +366,84 @@
             dstProjectDirectory, ok = EricPathPickerDialog.getPath(
                 self.parent(),
                 self.tr("Copy Project"),
-                self.tr("Enter directory for the new project (must not exist"
-                        " already):"),
+                self.tr(
+                    "Enter directory for the new project (must not exist" " already):"
+                ),
                 mode=EricPathPickerModes.DIRECTORY_MODE,
                 path=srcProjectDirectory,
                 defaultDirectory=startdir,
             )
-            if (
-                ok and
-                dstProjectDirectory and
-                not os.path.exists(dstProjectDirectory)
-            ):
+            if ok and dstProjectDirectory and not os.path.exists(dstProjectDirectory):
                 try:
                     shutil.copytree(srcProjectDirectory, dstProjectDirectory)
                 except shutil.Error:
                     EricMessageBox.critical(
                         self.parent(),
                         self.tr("Copy Project"),
-                        self.tr("<p>The source project <b>{0}</b> could not"
-                                " be copied to its destination <b>{1}</b>."
-                                "</p>").format(srcProjectDirectory,
-                                               dstProjectDirectory))
+                        self.tr(
+                            "<p>The source project <b>{0}</b> could not"
+                            " be copied to its destination <b>{1}</b>."
+                            "</p>"
+                        ).format(srcProjectDirectory, dstProjectDirectory),
+                    )
                     return
-                
+
                 dstUid = QUuid.createUuid().toString()
                 dstProject = {
-                    'name': self.tr("{0} - Copy").format(srcProject["name"]),
-                    'file': os.path.join(dstProjectDirectory,
-                                         os.path.basename(srcProject["file"])),
-                    'master': False,
-                    'description': srcProject["description"],
-                    'category': srcProject["category"],
-                    'uid': dstUid,
+                    "name": self.tr("{0} - Copy").format(srcProject["name"]),
+                    "file": os.path.join(
+                        dstProjectDirectory, os.path.basename(srcProject["file"])
+                    ),
+                    "master": False,
+                    "description": srcProject["description"],
+                    "category": srcProject["category"],
+                    "uid": dstUid,
                 }
                 self.__projects[dstUid] = dstProject
                 self.projectAdded.emit(dstProject)
                 self.setDirty(True)
-    
+
     def changeProjectProperties(self, pro):
         """
         Public method to change the data of a project entry.
-        
+
         @param pro dictionary with the project data (string)
         """
         # step 1: check, if master should be changed
-        if pro['master']:
+        if pro["master"]:
             for project in self.__projects.values():
-                if project['master']:
-                    if project['uid'] != pro['uid']:
-                        project['master'] = False
+                if project["master"]:
+                    if project["uid"] != pro["uid"]:
+                        project["master"] = False
                         self.projectDataChanged.emit(project)
                         self.setDirty(True)
                     break
-        
+
         # step 2: change the entry
-        project = self.__projects[pro['uid']]
+        project = self.__projects[pro["uid"]]
         # project UID is not changeable via interface
-        project['file'] = pro['file']
-        project['name'] = pro['name']
-        project['master'] = pro['master']
-        project['description'] = pro['description']
-        project['category'] = pro['category']
-        if project['category'] not in self.categories:
-            self.categories.append(project['category'])
+        project["file"] = pro["file"]
+        project["name"] = pro["name"]
+        project["master"] = pro["master"]
+        project["description"] = pro["description"]
+        project["category"] = pro["category"]
+        if project["category"] not in self.categories:
+            self.categories.append(project["category"])
         self.projectDataChanged.emit(project)
         self.setDirty(True)
-    
+
     def getProjects(self):
         """
         Public method to get all project entries.
-        
+
         @return list of all project entries (list of dictionaries)
         """
         return self.__projects.values()
-    
+
     def getProject(self, uid):
         """
         Public method to get a reference to a project entry.
-        
+
         @param uid UID of the project to get
         @type str
         @return dictionary containing the project data
@@ -456,11 +453,11 @@
             return self.__projects[uid]
         else:
             return None
-    
+
     def removeProject(self, uid):
         """
         Public slot to remove a project from the multi project.
-        
+
         @param uid UID of the project to be removed from the multi
             project
         @type str
@@ -470,11 +467,11 @@
             del self.__projects[uid]
             self.projectRemoved.emit(project)
             self.setDirty(True)
-    
+
     def deleteProject(self, uid):
         """
         Public slot to delete project(s) from the multi project and disk.
-        
+
         @param uid UID of the project to be removed from the multi
             project
         @type str
@@ -483,20 +480,21 @@
             project = self.__projects[uid]
             projectPath = os.path.dirname(project["file"])
             shutil.rmtree(projectPath, True)
-            
+
             self.removeProject(uid)
-    
+
     def __newMultiProject(self):
         """
         Private slot to build a new multi project.
-        
+
         This method displays the new multi project dialog and initializes
         the multi project object with the data entered.
         """
         if not self.checkDirty():
             return
-            
+
         from .PropertiesDialog import PropertiesDialog
+
         dlg = PropertiesDialog(self, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.closeMultiProject()
@@ -508,24 +506,25 @@
             self.addProjectAct.setEnabled(True)
             self.propsAct.setEnabled(True)
             self.newMultiProject.emit()
-    
+
     def __showProperties(self):
         """
         Private slot to display the properties dialog.
         """
         from .PropertiesDialog import PropertiesDialog
+
         dlg = PropertiesDialog(self, False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.storeData()
             self.setDirty(True)
             self.multiProjectPropertiesChanged.emit()
-    
+
     @pyqtSlot()
     @pyqtSlot(str)
     def openMultiProject(self, fn=None, openMaster=True):
         """
         Public slot to open a multi project.
-        
+
         @param fn optional filename of the multi project file to be
             read
         @type str
@@ -535,49 +534,52 @@
         """
         if not self.checkDirty():
             return
-        
+
         if fn is None:
             fn = EricFileDialog.getOpenFileName(
                 self.parent(),
                 self.tr("Open Multi Project"),
-                Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir(),
-                self.tr("Multi Project Files (*.emj);;"
-                        "XML Multi Project Files (*.e5m *.e4m)"))
-            
+                Preferences.getMultiProject("Workspace") or Utilities.getHomeDir(),
+                self.tr(
+                    "Multi Project Files (*.emj);;"
+                    "XML Multi Project Files (*.e5m *.e4m)"
+                ),
+            )
+
             if fn == "":
                 fn = None
-        
+
         if fn is not None:
             self.closeMultiProject()
             ok = self.__readMultiProject(fn)
             if ok:
                 self.opened = True
-                
+
                 self.closeAct.setEnabled(True)
                 self.saveasAct.setEnabled(True)
                 self.addProjectAct.setEnabled(True)
                 self.propsAct.setEnabled(True)
-                
+
                 self.multiProjectOpened.emit()
-                
+
                 if openMaster and Preferences.getMultiProject(
-                        "OpenMasterAutomatically"):
+                    "OpenMasterAutomatically"
+                ):
                     self.__openMasterProject(False)
-    
+
     def saveMultiProject(self):
         """
         Public slot to save the current multi project.
-        
+
         @return flag indicating success
         @rtype bool
         """
         if self.isDirty():
             if len(self.pfile) > 0:
                 if self.pfile.endswith((".e4m", ".e5m")):
-                    self.pfile = (self.pfile
-                                  .replace(".e4m", ".emj")
-                                  .replace(".e5m", ".emj"))
+                    self.pfile = self.pfile.replace(".e4m", ".emj").replace(
+                        ".e5m", ".emj"
+                    )
                     self.__syncRecent()
                 ok = self.__writeMultiProject()
             else:
@@ -585,20 +587,19 @@
         else:
             ok = True
         return ok
-    
+
     def saveMultiProjectAs(self):
         """
         Public slot to save the current multi project to a different file.
-        
+
         @return flag indicating success
         @rtype bool
         """
         defaultFilter = self.tr("Multi Project Files (*.emj)")
         defaultPath = (
             self.ppath
-            if self.ppath else
-            (Preferences.getMultiProject("Workspace") or
-             Utilities.getHomeDir())
+            if self.ppath
+            else (Preferences.getMultiProject("Workspace") or Utilities.getHomeDir())
         )
         fn, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self.parent(),
@@ -606,8 +607,9 @@
             defaultPath,
             self.tr("Multi Project Files (*.emj)"),
             defaultFilter,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if fn:
             fpath = pathlib.Path(fn)
             if not fpath.suffix:
@@ -618,25 +620,27 @@
                 res = EricMessageBox.yesNo(
                     self.parent(),
                     self.tr("Save File"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fn),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fn),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return False
-                
+
             self.name = fpath.stem
             self.__writeMultiProject(str(fpath))
-            
+
             self.multiProjectClosed.emit()
             self.multiProjectOpened.emit()
             return True
         else:
             return False
-    
+
     def checkDirty(self):
         """
         Public method to check the dirty status and open a message window.
-        
+
         @return flag indicating whether this operation was successful (boolean)
         """
         if self.isDirty():
@@ -644,46 +648,47 @@
                 self.parent(),
                 self.tr("Close Multiproject"),
                 self.tr("The current multiproject has unsaved changes."),
-                self.saveMultiProject)
+                self.saveMultiProject,
+            )
             if res:
                 self.setDirty(False)
             return res
-        
+
         return True
-    
+
     def closeMultiProject(self):
         """
         Public slot to close the current multi project.
-        
+
         @return flag indicating success (boolean)
         """
         # save the list of recently opened projects
         self.__saveRecent()
-        
+
         if not self.isOpen():
             return True
-        
+
         if not self.checkDirty():
             return False
-        
+
         # now close the current project, if it belongs to the multi project
         pfile = self.projectObject.getProjectFile()
         if pfile:
             for project in self.__projects.values():
-                if project['file'] == pfile:
+                if project["file"] == pfile:
                     if not self.projectObject.closeProject():
                         return False
                     break
-        
+
         self.__initData()
         self.closeAct.setEnabled(False)
         self.saveasAct.setEnabled(False)
         self.saveAct.setEnabled(False)
         self.addProjectAct.setEnabled(False)
         self.propsAct.setEnabled(False)
-        
+
         self.multiProjectClosed.emit()
-        
+
         return True
 
     def initActions(self):
@@ -691,102 +696,141 @@
         Public slot to initialize the multi project related actions.
         """
         self.actions = []
-        
+
         self.actGrp1 = createActionGroup(self)
-        
+
         act = EricAction(
-            self.tr('New multiproject'),
+            self.tr("New multiproject"),
             UI.PixmapCache.getIcon("multiProjectNew"),
-            self.tr('&New...'), 0, 0,
-            self.actGrp1, 'multi_project_new')
-        act.setStatusTip(self.tr('Generate a new multiproject'))
-        act.setWhatsThis(self.tr(
-            """<b>New...</b>"""
-            """<p>This opens a dialog for entering the info for a"""
-            """ new multiproject.</p>"""
-        ))
+            self.tr("&New..."),
+            0,
+            0,
+            self.actGrp1,
+            "multi_project_new",
+        )
+        act.setStatusTip(self.tr("Generate a new multiproject"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>New...</b>"""
+                """<p>This opens a dialog for entering the info for a"""
+                """ new multiproject.</p>"""
+            )
+        )
         act.triggered.connect(self.__newMultiProject)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Open multiproject'),
+            self.tr("Open multiproject"),
             UI.PixmapCache.getIcon("multiProjectOpen"),
-            self.tr('&Open...'), 0, 0,
-            self.actGrp1, 'multi_project_open')
-        act.setStatusTip(self.tr('Open an existing multiproject'))
-        act.setWhatsThis(self.tr(
-            """<b>Open...</b>"""
-            """<p>This opens an existing multiproject.</p>"""
-        ))
+            self.tr("&Open..."),
+            0,
+            0,
+            self.actGrp1,
+            "multi_project_open",
+        )
+        act.setStatusTip(self.tr("Open an existing multiproject"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Open...</b>""" """<p>This opens an existing multiproject.</p>"""
+            )
+        )
         act.triggered.connect(self.openMultiProject)
         self.actions.append(act)
 
         self.closeAct = EricAction(
-            self.tr('Close multiproject'),
+            self.tr("Close multiproject"),
             UI.PixmapCache.getIcon("multiProjectClose"),
-            self.tr('&Close'), 0, 0, self, 'multi_project_close')
-        self.closeAct.setStatusTip(self.tr(
-            'Close the current multiproject'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close</b>"""
-            """<p>This closes the current multiproject.</p>"""
-        ))
+            self.tr("&Close"),
+            0,
+            0,
+            self,
+            "multi_project_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the current multiproject"))
+        self.closeAct.setWhatsThis(
+            self.tr(
+                """<b>Close</b>""" """<p>This closes the current multiproject.</p>"""
+            )
+        )
         self.closeAct.triggered.connect(self.closeMultiProject)
         self.actions.append(self.closeAct)
 
         self.saveAct = EricAction(
-            self.tr('Save multiproject'),
+            self.tr("Save multiproject"),
             UI.PixmapCache.getIcon("multiProjectSave"),
-            self.tr('&Save'), 0, 0, self, 'multi_project_save')
-        self.saveAct.setStatusTip(self.tr('Save the current multiproject'))
-        self.saveAct.setWhatsThis(self.tr(
-            """<b>Save</b>"""
-            """<p>This saves the current multiproject.</p>"""
-        ))
+            self.tr("&Save"),
+            0,
+            0,
+            self,
+            "multi_project_save",
+        )
+        self.saveAct.setStatusTip(self.tr("Save the current multiproject"))
+        self.saveAct.setWhatsThis(
+            self.tr("""<b>Save</b>""" """<p>This saves the current multiproject.</p>""")
+        )
         self.saveAct.triggered.connect(self.saveMultiProject)
         self.actions.append(self.saveAct)
 
         self.saveasAct = EricAction(
-            self.tr('Save multiproject as'),
+            self.tr("Save multiproject as"),
             UI.PixmapCache.getIcon("multiProjectSaveAs"),
-            self.tr('Save &as...'), 0, 0, self,
-            'multi_project_save_as')
-        self.saveasAct.setStatusTip(self.tr(
-            'Save the current multiproject to a new file'))
-        self.saveasAct.setWhatsThis(self.tr(
-            """<b>Save as</b>"""
-            """<p>This saves the current multiproject to a new file.</p>"""
-        ))
+            self.tr("Save &as..."),
+            0,
+            0,
+            self,
+            "multi_project_save_as",
+        )
+        self.saveasAct.setStatusTip(
+            self.tr("Save the current multiproject to a new file")
+        )
+        self.saveasAct.setWhatsThis(
+            self.tr(
+                """<b>Save as</b>"""
+                """<p>This saves the current multiproject to a new file.</p>"""
+            )
+        )
         self.saveasAct.triggered.connect(self.saveMultiProjectAs)
         self.actions.append(self.saveasAct)
 
         self.addProjectAct = EricAction(
-            self.tr('Add project to multiproject'),
+            self.tr("Add project to multiproject"),
             UI.PixmapCache.getIcon("fileProject"),
-            self.tr('Add &project...'), 0, 0,
-            self, 'multi_project_add_project')
-        self.addProjectAct.setStatusTip(self.tr(
-            'Add a project to the current multiproject'))
-        self.addProjectAct.setWhatsThis(self.tr(
-            """<b>Add project...</b>"""
-            """<p>This opens a dialog for adding a project"""
-            """ to the current multiproject.</p>"""
-        ))
+            self.tr("Add &project..."),
+            0,
+            0,
+            self,
+            "multi_project_add_project",
+        )
+        self.addProjectAct.setStatusTip(
+            self.tr("Add a project to the current multiproject")
+        )
+        self.addProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Add project...</b>"""
+                """<p>This opens a dialog for adding a project"""
+                """ to the current multiproject.</p>"""
+            )
+        )
         self.addProjectAct.triggered.connect(self.addNewProject)
         self.actions.append(self.addProjectAct)
 
         self.propsAct = EricAction(
-            self.tr('Multiproject properties'),
+            self.tr("Multiproject properties"),
             UI.PixmapCache.getIcon("multiProjectProps"),
-            self.tr('&Properties...'), 0, 0, self,
-            'multi_project_properties')
-        self.propsAct.setStatusTip(self.tr(
-            'Show the multiproject properties'))
-        self.propsAct.setWhatsThis(self.tr(
-            """<b>Properties...</b>"""
-            """<p>This shows a dialog to edit the multiproject"""
-            """ properties.</p>"""
-        ))
+            self.tr("&Properties..."),
+            0,
+            0,
+            self,
+            "multi_project_properties",
+        )
+        self.propsAct.setStatusTip(self.tr("Show the multiproject properties"))
+        self.propsAct.setWhatsThis(
+            self.tr(
+                """<b>Properties...</b>"""
+                """<p>This shows a dialog to edit the multiproject"""
+                """ properties.</p>"""
+            )
+        )
         self.propsAct.triggered.connect(self.__showProperties)
         self.actions.append(self.propsAct)
 
@@ -795,27 +839,26 @@
         self.saveasAct.setEnabled(False)
         self.addProjectAct.setEnabled(False)
         self.propsAct.setEnabled(False)
-    
+
     def initMenu(self):
         """
         Public slot to initialize the multi project menu.
-        
+
         @return the menu generated (QMenu)
         """
-        menu = QMenu(self.tr('&Multiproject'), self.parent())
-        self.recentMenu = QMenu(self.tr('Open &Recent Multiprojects'),
-                                menu)
-        
+        menu = QMenu(self.tr("&Multiproject"), self.parent())
+        self.recentMenu = QMenu(self.tr("Open &Recent Multiprojects"), menu)
+
         self.__menus = {
             "Main": menu,
             "Recent": self.recentMenu,
         }
-        
+
         # connect the aboutToShow signals
         self.recentMenu.aboutToShow.connect(self.__showContextMenuRecent)
         self.recentMenu.triggered.connect(self.__openRecent)
         menu.aboutToShow.connect(self.__showMenu)
-        
+
         # build the main menu
         menu.setTearOffEnabled(True)
         menu.addActions(self.actGrp1.actions())
@@ -829,14 +872,14 @@
         menu.addAction(self.addProjectAct)
         menu.addSeparator()
         menu.addAction(self.propsAct)
-        
+
         self.menu = menu
         return menu
-    
+
     def initToolbar(self, toolbarManager):
         """
         Public slot to initialize the multi project toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the toolbar generated (QToolBar)
@@ -844,28 +887,28 @@
         tb = QToolBar(self.tr("Multiproject"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("MultiProjectToolbar")
-        tb.setToolTip(self.tr('Multiproject'))
-        
+        tb.setToolTip(self.tr("Multiproject"))
+
         tb.addActions(self.actGrp1.actions())
         tb.addAction(self.closeAct)
         tb.addSeparator()
         tb.addAction(self.saveAct)
         tb.addAction(self.saveasAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.addProjectAct, tb.windowTitle())
         toolbarManager.addAction(self.propsAct, tb.windowTitle())
-        
+
         return tb
-    
+
     def __showMenu(self):
         """
         Private method to set up the multi project menu.
         """
         self.menuRecentAct.setEnabled(len(self.recent) > 0)
-        
+
         self.showMenu.emit("Main", self.__menus["Main"])
-    
+
     def __syncRecent(self):
         """
         Private method to synchronize the list of recently opened multi
@@ -879,75 +922,76 @@
         if len(self.recent) > maxRecent:
             self.recent = self.recent[:maxRecent]
         self.__saveRecent()
-    
+
     def __showContextMenuRecent(self):
         """
         Private method to set up the recent multi projects menu.
         """
         self.__loadRecent()
-        
+
         self.recentMenu.clear()
-        
+
         for idx, rp in enumerate(self.recent, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentMenu.addAction(
                 formatStr.format(
-                    idx,
-                    Utilities.compactPath(rp, self.ui.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rp, self.ui.maxMenuFilePathLen)
+                )
+            )
             act.setData(rp)
             act.setEnabled(pathlib.Path(rp).exists())
-        
+
         self.recentMenu.addSeparator()
-        self.recentMenu.addAction(self.tr('&Clear'), self.clearRecent)
-    
+        self.recentMenu.addAction(self.tr("&Clear"), self.clearRecent)
+
     def __openRecent(self, act):
         """
         Private method to open a multi project from the list of rencently
         opened multi projects.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         file = act.data()
         if file:
             self.openMultiProject(file)
-    
+
     def clearRecent(self):
         """
         Public method to clear the recent multi projects menu.
         """
         self.recent = []
         self.__saveRecent()
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-    
+
     def addEricActions(self, actions):
         """
         Public method to add actions to the list of actions.
-        
+
         @param actions list of actions (list of EricAction)
         """
         self.actions.extend(actions)
-    
+
     def removeEricActions(self, actions):
         """
         Public method to remove actions from the list of actions.
-        
+
         @param actions list of actions (list of EricAction)
         """
         for act in actions:
             with contextlib.suppress(ValueError):
                 self.actions.remove(act)
-    
+
     def getMenu(self, menuName):
         """
         Public method to get a reference to the main menu or a submenu.
-        
+
         @param menuName name of the menu (string)
         @return reference to the requested menu (QMenu) or None
         """
@@ -955,53 +999,52 @@
             return self.__menus[menuName]
         except KeyError:
             return None
-    
+
     def openProject(self, filename):
         """
         Public slot to open a project.
-        
+
         @param filename filename of the project file (string)
         """
         self.projectObject.openProject(filename)
         self.projectOpened.emit(filename)
-    
+
     def __openMasterProject(self, reopen=True):
         """
         Private slot to open the master project.
-        
+
         @param reopen flag indicating, that the master project should be
             reopened, if it has been opened already (boolean)
         """
         for project in self.__projects.values():
-            if (
-                project['master'] and
-                (reopen or
-                 not self.projectObject.isOpen() or
-                 self.projectObject.getProjectFile() != project['file'])
+            if project["master"] and (
+                reopen
+                or not self.projectObject.isOpen()
+                or self.projectObject.getProjectFile() != project["file"]
             ):
-                self.openProject(project['file'])
+                self.openProject(project["file"])
                 return
-    
+
     def getMasterProjectFile(self):
         """
         Public method to get the filename of the master project.
-        
+
         @return name of the master project file (string)
         """
         for project in self.__projects:
-            if project['master']:
-                return project['file']
-        
+            if project["master"]:
+                return project["file"]
+
         return None
-    
+
     def getDependantProjectFiles(self):
         """
         Public method to get the filenames of the dependent projects.
-        
+
         @return names of the dependent project files (list of strings)
         """
         files = []
         for project in self.__projects.values():
-            if not project['master']:
-                files.append(project['file'])
+            if not project["master"]:
+                files.append(project["file"])
         return files
--- a/src/eric7/MultiProject/MultiProjectBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MultiProject/MultiProjectBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,13 +23,14 @@
     """
     Class implementing the multi project browser.
     """
+
     ProjectFileNameRole = Qt.ItemDataRole.UserRole
     ProjectUidRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, multiProject, project, parent=None):
         """
         Constructor
-        
+
         @param multiProject reference to the multi project object
         @type MultiProject
         @param project reference to the project object
@@ -40,81 +41,75 @@
         super().__init__(parent)
         self.multiProject = multiProject
         self.project = project
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.setAlternatingRowColors(True)
         self.setHeaderHidden(True)
         self.setItemsExpandable(False)
         self.setRootIsDecorated(False)
         self.setSortingEnabled(True)
-        
+
         self.__openingProject = False
-        
-        self.multiProject.newMultiProject.connect(
-            self.__newMultiProject)
-        self.multiProject.multiProjectOpened.connect(
-            self.__multiProjectOpened)
-        self.multiProject.multiProjectClosed.connect(
-            self.__multiProjectClosed)
-        self.multiProject.projectDataChanged.connect(
-            self.__projectDataChanged)
-        self.multiProject.projectAdded.connect(
-            self.__projectAdded)
-        self.multiProject.projectRemoved.connect(
-            self.__projectRemoved)
-        
+
+        self.multiProject.newMultiProject.connect(self.__newMultiProject)
+        self.multiProject.multiProjectOpened.connect(self.__multiProjectOpened)
+        self.multiProject.multiProjectClosed.connect(self.__multiProjectClosed)
+        self.multiProject.projectDataChanged.connect(self.__projectDataChanged)
+        self.multiProject.projectAdded.connect(self.__projectAdded)
+        self.multiProject.projectRemoved.connect(self.__projectRemoved)
+
         self.project.projectOpened.connect(self.__projectOpened)
         self.project.projectClosed.connect(self.__projectClosed)
-        
+
         self.__createPopupMenu()
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
         self.itemActivated.connect(self.__openItem)
-        
+
         self.setEnabled(False)
-    
+
     ###########################################################################
     ## Slot handling methods below
     ###########################################################################
-    
+
     def __newMultiProject(self):
         """
         Private slot to handle the creation of a new multi project.
         """
         self.clear()
         self.setEnabled(True)
-    
+
     def __multiProjectOpened(self):
         """
         Private slot to handle the opening of a multi project.
         """
         for project in self.multiProject.getProjects():
             self.__addProject(project)
-        
+
         self.sortItems(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.setEnabled(True)
-    
+
     def __multiProjectClosed(self):
         """
         Private slot to handle the closing of a multi project.
         """
         self.clear()
         self.setEnabled(False)
-    
+
     def __projectAdded(self, project):
         """
         Private slot to handle the addition of a project to the multi project.
-        
+
         @param project reference to the project data dictionary
         """
         self.__addProject(project)
         self.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __projectRemoved(self, project):
         """
         Private slot to handle the removal of a project from the multi project.
-        
+
         @param project reference to the project data dictionary
         """
         itm = self.__findProjectItem(project)
@@ -126,11 +121,11 @@
                 top = self.takeTopLevelItem(self.indexOfTopLevelItem(parent))
                 # __IGNORE_WARNING__
                 del top
-    
+
     def __projectDataChanged(self, project):
         """
         Private slot to handle the change of a project of the multi project.
-        
+
         @param project reference to the project data dictionary
         """
         itm = self.__findProjectItem(project)
@@ -141,28 +136,28 @@
                 self.__addProject(project)
             else:
                 self.__setItemData(itm, project)
-            
+
         self.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __projectOpened(self):
         """
         Private slot to handle the opening of a project.
         """
         projectfile = self.project.getProjectFile()
         project = {
-            'name': "",
-            'file': projectfile,
-            'master': False,
-            'description': "",
-            'category': "",
-            'uid': "",
+            "name": "",
+            "file": projectfile,
+            "master": False,
+            "description": "",
+            "category": "",
+            "uid": "",
         }
         itm = self.__findProjectItem(project)
         if itm:
             font = itm.font(0)
             font.setBold(True)
             itm.setFont(0, font)
-    
+
     def __projectClosed(self):
         """
         Private slot to handle the closing of a project.
@@ -174,11 +169,11 @@
                 font = childItem.font(0)
                 font.setBold(False)
                 childItem.setFont(0, font)
-    
+
     def __contextMenuRequested(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         itm = self.itemAt(coord)
@@ -186,33 +181,33 @@
             self.__backMenu.popup(self.mapToGlobal(coord))
         else:
             self.__menu.popup(self.mapToGlobal(coord))
-    
+
     def __openItem(self, itm=None):
         """
         Private slot to open a project.
-        
+
         @param itm reference to the project item to be opened (QTreeWidgetItem)
         """
         if itm is None:
             itm = self.currentItem()
             if itm is None or itm.parent() is None:
                 return
-        
+
         if not self.__openingProject:
             filename = itm.data(0, MultiProjectBrowser.ProjectFileNameRole)
             if filename:
                 self.__openingProject = True
                 self.multiProject.openProject(filename)
                 self.__openingProject = False
-    
+
     ###########################################################################
     ## Private methods below
     ###########################################################################
-    
+
     def __findCategoryItem(self, category):
         """
         Private method to find the item for a category.
-        
+
         @param category category to search for (string)
         @return reference to the category item or None, if there is
             no such item (QTreeWidgetItem or None)
@@ -223,46 +218,45 @@
             itm = self.topLevelItem(index)
             if itm.text(0) == category:
                 return itm
-        
+
         return None
-    
+
     def __addProject(self, project):
         """
         Private method to add a project to the list.
-        
+
         @param project reference to the project data dictionary
         """
-        parent = self.__findCategoryItem(project['category'])
+        parent = self.__findCategoryItem(project["category"])
         if parent is None:
-            if project['category']:
-                parent = QTreeWidgetItem(self, [project['category']])
+            if project["category"]:
+                parent = QTreeWidgetItem(self, [project["category"]])
             else:
                 parent = QTreeWidgetItem(self, [self.tr("Not categorized")])
             parent.setExpanded(True)
         itm = QTreeWidgetItem(parent)
         self.__setItemData(itm, project)
-    
+
     def __setItemData(self, itm, project):
         """
         Private method to set the data of a project item.
-        
+
         @param itm reference to the item to be set (QTreeWidgetItem)
         @param project reference to the project data dictionary
         """
-        itm.setText(0, project['name'])
-        if project['master']:
+        itm.setText(0, project["name"])
+        if project["master"]:
             itm.setIcon(0, UI.PixmapCache.getIcon("masterProject"))
         else:
             itm.setIcon(0, UI.PixmapCache.getIcon("empty"))
-        itm.setToolTip(0, project['file'])
-        itm.setData(0, MultiProjectBrowser.ProjectFileNameRole,
-                    project['file'])
-        itm.setData(0, MultiProjectBrowser.ProjectUidRole, project['uid'])
-    
+        itm.setToolTip(0, project["file"])
+        itm.setData(0, MultiProjectBrowser.ProjectFileNameRole, project["file"])
+        itm.setData(0, MultiProjectBrowser.ProjectUidRole, project["uid"])
+
     def __findProjectItem(self, project):
         """
         Private method to search a specific project item.
-        
+
         @param project reference to the project data dictionary
         @return reference to the item (QTreeWidgetItem) or None
         """
@@ -272,7 +266,7 @@
         else:
             compareData = project["file"]
             compareRole = MultiProjectBrowser.ProjectFileNameRole
-        
+
         for topIndex in range(self.topLevelItemCount()):
             topItm = self.topLevelItem(topIndex)
             for childIndex in range(topItm.childCount()):
@@ -280,9 +274,9 @@
                 data = itm.data(0, compareRole)
                 if data == compareData:
                     return itm
-        
+
         return None
-    
+
     def __removeProject(self):
         """
         Private method to handle the Remove context menu entry.
@@ -292,7 +286,7 @@
             uid = itm.data(0, MultiProjectBrowser.ProjectUidRole)
             if uid:
                 self.multiProject.removeProject(uid)
-    
+
     def __deleteProject(self):
         """
         Private method to handle the Delete context menu entry.
@@ -301,13 +295,16 @@
         if itm is not None and itm.parent() is not None:
             projectFile = itm.data(0, MultiProjectBrowser.ProjectFileNameRole)
             projectPath = os.path.dirname(projectFile)
-            
+
             if self.project.getProjectPath() == projectPath:
                 EricMessageBox.warning(
                     self,
                     self.tr("Delete Project"),
-                    self.tr("""The current project cannot be deleted."""
-                            """ Please close it first."""))
+                    self.tr(
+                        """The current project cannot be deleted."""
+                        """ Please close it first."""
+                    ),
+                )
             else:
                 projectFiles = glob.glob(os.path.join(projectPath, "*.epj"))
                 projectFiles += glob.glob(os.path.join(projectPath, "*.e4p"))
@@ -318,41 +315,44 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Delete Project"),
-                        self.tr("""<p>Shall the project <b>{0}</b> (Path:"""
-                                """ {1}) really be deleted?</p>""").format(
-                            itm.text(0), projectPath))
+                        self.tr(
+                            """<p>Shall the project <b>{0}</b> (Path:"""
+                            """ {1}) really be deleted?</p>"""
+                        ).format(itm.text(0), projectPath),
+                    )
                 else:
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Delete Project"),
-                        self.tr("""<p>Shall the project <b>{0}</b> (Path:"""
-                                """ {1}) really be deleted?</p>"""
-                                """<p><b>Warning:</b> It contains <b>{2}</b>"""
-                                """ sub-projects.</p>""").format(
-                            itm.text(0), projectPath, len(projectFiles)))
+                        self.tr(
+                            """<p>Shall the project <b>{0}</b> (Path:"""
+                            """ {1}) really be deleted?</p>"""
+                            """<p><b>Warning:</b> It contains <b>{2}</b>"""
+                            """ sub-projects.</p>"""
+                        ).format(itm.text(0), projectPath, len(projectFiles)),
+                    )
                 if res:
                     for subprojectFile in projectFiles:
                         # remove all sub-projects before deleting the directory
                         if subprojectFile != projectFile:
                             projectData = {
-                                'name': "",
-                                'file': subprojectFile,
-                                'master': False,
-                                'description': "",
-                                'category': "",
-                                'uid': "",
+                                "name": "",
+                                "file": subprojectFile,
+                                "master": False,
+                                "description": "",
+                                "category": "",
+                                "uid": "",
                             }
                             pitm = self.__findProjectItem(projectData)
                             if pitm:
-                                uid = pitm.data(
-                                    0, MultiProjectBrowser.ProjectUidRole)
+                                uid = pitm.data(0, MultiProjectBrowser.ProjectUidRole)
                                 if uid:
                                     self.multiProject.removeProject(uid)
-                        
+
                     uid = itm.data(0, MultiProjectBrowser.ProjectUidRole)
                     if uid:
                         self.multiProject.deleteProject(uid)
-    
+
     def __showProjectProperties(self):
         """
         Private method to show the data of a project entry.
@@ -364,22 +364,31 @@
                 project = self.multiProject.getProject(uid)
                 if project is not None:
                     from .AddProjectDialog import AddProjectDialog
+
                     dlg = AddProjectDialog(
-                        self, project=project,
-                        categories=self.multiProject.getCategories())
+                        self,
+                        project=project,
+                        categories=self.multiProject.getCategories(),
+                    )
                     if dlg.exec() == QDialog.DialogCode.Accepted:
-                        (name, filename, isMaster, description, category,
-                         uid) = dlg.getData()
+                        (
+                            name,
+                            filename,
+                            isMaster,
+                            description,
+                            category,
+                            uid,
+                        ) = dlg.getData()
                         project = {
-                            'name': name,
-                            'file': filename,
-                            'master': isMaster,
-                            'description': description,
-                            'category': category,
-                            'uid': uid,
+                            "name": name,
+                            "file": filename,
+                            "master": isMaster,
+                            "description": description,
+                            "category": category,
+                            "uid": uid,
                         }
                         self.multiProject.changeProjectProperties(project)
-    
+
     def __addNewProject(self):
         """
         Private method to add a new project entry.
@@ -394,7 +403,7 @@
         else:
             category = ""
         self.multiProject.addNewProject(category=category)
-    
+
     def __copyProject(self):
         """
         Private method to copy the selected project on disk.
@@ -405,37 +414,31 @@
             uid = itm.data(0, MultiProjectBrowser.ProjectUidRole)
             if uid:
                 self.multiProject.copyProject(uid)
-    
+
     def __createPopupMenu(self):
         """
         Private method to create the popup menu.
         """
         self.__menu = QMenu(self)
         self.__menu.addAction(self.tr("Open"), self.__openItem)
-        self.__menu.addAction(self.tr("Remove from Multi Project"),
-                              self.__removeProject)
-        self.__menu.addAction(self.tr("Delete from Disk"),
-                              self.__deleteProject)
-        self.__menu.addAction(self.tr("Properties"),
-                              self.__showProjectProperties)
+        self.__menu.addAction(
+            self.tr("Remove from Multi Project"), self.__removeProject
+        )
+        self.__menu.addAction(self.tr("Delete from Disk"), self.__deleteProject)
+        self.__menu.addAction(self.tr("Properties"), self.__showProjectProperties)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr("Add Project..."),
-                              self.__addNewProject)
-        self.__menu.addAction(self.tr("Copy Project..."),
-                              self.__copyProject)
+        self.__menu.addAction(self.tr("Add Project..."), self.__addNewProject)
+        self.__menu.addAction(self.tr("Copy Project..."), self.__copyProject)
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.__backMenu = QMenu(self)
-        self.__backMenu.addAction(self.tr("Add Project..."),
-                                  self.__addNewProject)
+        self.__backMenu.addAction(self.tr("Add Project..."), self.__addNewProject)
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(self.tr("Configure..."),
-                                  self.__configure)
-    
+        self.__backMenu.addAction(self.tr("Configure..."), self.__configure)
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "multiProjectPage")
+        ericApp().getObject("UserInterface").showPreferences("multiProjectPage")
--- a/src/eric7/MultiProject/MultiProjectFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MultiProject/MultiProjectFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class representing the multi project JSON file.
     """
+
     def __init__(self, multiProject: MultiProject, parent: QObject = None):
         """
         Constructor
-        
+
         @param multiProject reference to the multi project object
         @type MultiProject
         @param parent reference to the parent object (defaults to None)
@@ -37,32 +38,30 @@
         """
         super().__init__(parent)
         self.__multiProject = multiProject
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the multi project data to a multi project
         JSON file.
-        
+
         @param filename name of the multi project file
         @type str
         @return flag indicating a successful write
         @rtype bool
         """
         name = os.path.splitext(os.path.basename(filename))[0]
-        
+
         multiProjectDict = {}
         multiProjectDict["header"] = {
             "comment": f"eric multi project file for multi project {name}",
         }
-        
+
         if Preferences.getMultiProject("TimestampFile"):
-            multiProjectDict["header"]["saved"] = (
-                time.strftime('%Y-%m-%d, %H:%M:%S')
-            )
-        
+            multiProjectDict["header"]["saved"] = time.strftime("%Y-%m-%d, %H:%M:%S")
+
         multiProjectDict["description"] = self.__multiProject.description
         multiProjectDict["projects"] = list(self.__multiProject.getProjects())
-        
+
         try:
             jsonString = json.dumps(multiProjectDict, indent=2)
             with open(filename, "w") as f:
@@ -75,17 +74,17 @@
                     self.tr(
                         "<p>The multi project file <b>{0}</b> could not be "
                         "written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the multi project data from a multi project
         JSON file.
-        
+
         @param filename name of the multi project file
         @type str
         @return flag indicating a successful read
@@ -102,12 +101,12 @@
                 self.tr(
                     "<p>The multi project file <b>{0}</b> could not be "
                     "read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         self.__multiProject.description = multiProjectDict["description"]
         for project in multiProjectDict["projects"]:
             self.__multiProject.addProject(project)
-        
+
         return True
--- a/src/eric7/MultiProject/PropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/MultiProject/PropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,23 +16,24 @@
     """
     Class implementing the multi project properties dialog.
     """
+
     def __init__(self, multiProject, new=True, parent=None):
         """
         Constructor
-        
+
         @param multiProject reference to the multi project object
         @param new flag indicating the generation of a new multi project
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.multiProject = multiProject
         self.newMultiProject = new
-        
+
         if not new:
             self.descriptionEdit.setPlainText(self.multiProject.description)
-    
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
--- a/src/eric7/Network/IRC/IrcChannelEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcChannelEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to edit channel data.
     """
+
     def __init__(self, name, key, autoJoin, edit, parent=None):
         """
         Constructor
-        
+
         @param name channel name (string)
         @param key channel key (string)
         @param autoJoin flag indicating, that the channel should
@@ -31,37 +32,37 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.nameEdit.setText(name)
         self.keyEdit.setText(key)
         self.autoJoinCheckBox.setChecked(autoJoin)
-        
+
         self.nameEdit.setReadOnly(edit)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(name != "")
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(name != "")
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the given name.
-        
+
         @param txt text of the edit (string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(txt != "")
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(txt != "")
+
     def getData(self):
         """
         Public method to get the channel data.
-        
+
         @return tuple giving the channel name, channel key and a flag
             indicating, that the channel should be joined automatically
             (string, string, boolean)
         """
-        return (self.nameEdit.text(),
-                self.keyEdit.text(),
-                self.autoJoinCheckBox.isChecked())
+        return (
+            self.nameEdit.text(),
+            self.keyEdit.text(),
+            self.autoJoinCheckBox.isChecked(),
+        )
--- a/src/eric7/Network/IRC/IrcChannelWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcChannelWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,11 +13,22 @@
 import re
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, QDateTime, QPoint, QTimer, QUrl, QCoreApplication
+    pyqtSlot,
+    pyqtSignal,
+    QDateTime,
+    QPoint,
+    QTimer,
+    QUrl,
+    QCoreApplication,
 )
 from PyQt6.QtGui import QIcon, QPainter, QTextCursor, QDesktopServices
 from PyQt6.QtWidgets import (
-    QWidget, QListWidgetItem, QMenu, QApplication, QInputDialog, QLineEdit
+    QWidget,
+    QListWidgetItem,
+    QMenu,
+    QApplication,
+    QInputDialog,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox, EricFileDialog
@@ -38,60 +49,60 @@
     """
     Class implementing a list widget item containing an IRC channel user.
     """
-    Normal = 0x00       # no privileges
-    Operator = 0x01     # channel operator
-    Voice = 0x02        # voice operator
-    Admin = 0x04        # administrator
-    Halfop = 0x08       # half operator
-    Owner = 0x10        # channel owner
-    Away = 0x80         # user away
-    
+
+    Normal = 0x00  # no privileges
+    Operator = 0x01  # channel operator
+    Voice = 0x02  # voice operator
+    Admin = 0x04  # administrator
+    Halfop = 0x08  # half operator
+    Owner = 0x10  # channel owner
+    Away = 0x80  # user away
+
     PrivilegeMapping = {
         "a": Away,
         "o": Operator,
         "O": Owner,
         "v": Voice,
-        
     }
-    
+
     def __init__(self, name, parent=None):
         """
         Constructor
-        
+
         @param name string with user name and privilege prefix (string)
         @param parent reference to the parent widget (QListWidget or
             QListWidgetItem)
         """
         super().__init__(name, parent)
-        
+
         self.__privilege = IrcUserItem.Normal
         self.__name = name
         self.__ignored = False
-        
+
         self.__setText()
         self.__setIcon()
-    
+
     def name(self):
         """
         Public method to get the user name.
-        
+
         @return user name (string)
         """
         return self.__name
-    
+
     def setName(self, name):
         """
         Public method to set a new nick name.
-        
+
         @param name new nick name for the user (string)
         """
         self.__name = name
         self.__setText()
-    
+
     def changePrivilege(self, privilege):
         """
         Public method to set or unset a user privilege.
-        
+
         @param privilege privilege to set or unset (string)
         """
         oper = privilege[0]
@@ -102,25 +113,27 @@
             elif oper == "-":
                 self.__privilege &= ~IrcUserItem.PrivilegeMapping[priv]
         self.__setIcon()
-    
+
     def clearPrivileges(self):
         """
         Public method to clear the user privileges.
         """
         self.__privilege = IrcUserItem.Normal
         self.__setIcon()
-    
+
     def __setText(self):
         """
         Private method to set the user item text.
         """
         if self.__ignored:
-            self.setText(QCoreApplication.translate(
-                "IrcUserItem",
-                "{0} (ignored)").format(self.__name))
+            self.setText(
+                QCoreApplication.translate("IrcUserItem", "{0} (ignored)").format(
+                    self.__name
+                )
+            )
         else:
             self.setText(self.__name)
-    
+
     def __setIcon(self):
         """
         Private method to set the icon dependent on user privileges.
@@ -140,14 +153,14 @@
             icon = UI.PixmapCache.getIcon("ircNormal")
         if self.__privilege & IrcUserItem.Away:
             icon = self.__awayIcon(icon)
-        
+
         # step 2: set the icon
         self.setIcon(icon)
-    
+
     def __awayIcon(self, icon):
         """
         Private method to convert an icon to an away icon.
-        
+
         @param icon icon to be converted (QIcon)
         @return away icon (QIcon)
         """
@@ -157,11 +170,11 @@
         painter.drawPixmap(0, 0, pix2)
         painter.end()
         return QIcon(pix1)
-    
+
     def parseWhoFlags(self, flags):
         """
         Public method to parse the user flags reported by a WHO command.
-        
+
         @param flags user flags as reported by WHO (string)
         """
         # H The user is not away.
@@ -181,31 +194,33 @@
             privilege |= IrcUserItem.Away
         self.__privilege = privilege
         self.__setIcon()
-    
+
     def canChangeTopic(self):
         """
         Public method to check, if the user is allowed to change the topic.
-        
+
         @return flag indicating that the topic can be changed (boolean)
         """
-        return(bool(self.__privilege & IrcUserItem.Operator) or
-               bool(self.__privilege & IrcUserItem.Admin) or
-               bool(self.__privilege & IrcUserItem.Owner))
-    
+        return (
+            bool(self.__privilege & IrcUserItem.Operator)
+            or bool(self.__privilege & IrcUserItem.Admin)
+            or bool(self.__privilege & IrcUserItem.Owner)
+        )
+
     def setIgnored(self, ignored):
         """
         Public method to set the user status to ignored.
-        
+
         @param ignored flag indicating the new ignored status
         @type bool
         """
         self.__ignored = ignored
         self.__setText()
-    
+
     def isIgnored(self):
         """
         Public method to check, if this user is ignored.
-        
+
         @return flag indicating the ignored status
         @rtype bool
         """
@@ -215,7 +230,7 @@
 class IrcChannelWidget(QWidget, Ui_IrcChannelWidget):
     """
     Class implementing the IRC channel widget.
-    
+
     @signal sendData(str) emitted to send a message to the channel
     @signal sendCtcpRequest(str, str, str) emitted to send a CTCP request
     @signal sendCtcpReply(str, str) emitted to send a CTCP reply
@@ -227,6 +242,7 @@
     @signal leaveChannels(list) emitted to leave a list of channels
     @signal leaveAllChannels() emitted to leave all channels
     """
+
     sendData = pyqtSignal(str)
     sendCtcpRequest = pyqtSignal(str, str, str)
     sendCtcpReply = pyqtSignal(str, str)
@@ -235,37 +251,37 @@
     awayCommand = pyqtSignal(str)
     leaveChannels = pyqtSignal(list)
     leaveAllChannels = pyqtSignal()
-    
+
     UrlRe = re.compile(
         r"""((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)+"""
-        r"""(?:[\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)""")
-    
+        r"""(?:[\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)"""
+    )
+
     JoinIndicator = "--&gt;"
     LeaveIndicator = "&lt;--"
     MessageIndicator = "***"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__ui = ericApp().getObject("UserInterface")
         self.__ircWidget = parent
-        
-        self.editTopicButton.setIcon(
-            UI.PixmapCache.getIcon("ircEditTopic"))
+
+        self.editTopicButton.setIcon(UI.PixmapCache.getIcon("ircEditTopic"))
         self.editTopicButton.hide()
-        
+
         height = self.usersList.height() + self.messages.height()
         self.splitter.setSizes([int(height * 0.3), int(height * 0.7)])
-        
+
         self.__initMessagesMenu()
         self.__initUsersMenu()
-        
+
         self.__name = ""
         self.__userName = ""
         self.__partMessage = ""
@@ -273,20 +289,18 @@
         self.__private = False
         self.__privatePartner = ""
         self.__whoIsNick = ""
-        
+
         self.__markerLine = ""
         self.__hidden = True
-        
+
         self.__serviceNamesLower = ["nickserv", "chanserv", "memoserv"]
-        
+
         self.__patterns = [
             # :foo_!n=foo@foohost.bar.net PRIVMSG #eric-ide :some long message
             # :foo_!n=foo@foohost.bar.net PRIVMSG bar_ :some long message
-            (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"),
-             self.__message),
+            (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__message),
             # :foo_!n=foo@foohost.bar.net JOIN :#eric-ide
-            (re.compile(r":([^!]+)!([^ ]+)\sJOIN\s:?([^ ]+)"),
-             self.__userJoin),
+            (re.compile(r":([^!]+)!([^ ]+)\sJOIN\s:?([^ ]+)"), self.__userJoin),
             # :foo_!n=foo@foohost.bar.net PART #eric-ide :part message
             (re.compile(r":([^!]+).*\sPART\s([^ ]+)\s:(.*)"), self.__userPart),
             # :foo_!n=foo@foohost.bar.net PART #eric-ide
@@ -298,16 +312,16 @@
             # :foo_!n=foo@foohost.bar.net NICK :newnick
             (re.compile(r":([^!]+).*\sNICK\s:(.*)"), self.__userNickChange),
             # :foo_!n=foo@foohost.bar.net MODE #eric-ide +o foo_
-            (re.compile(r":([^!]+).*\sMODE\s([^ ]+)\s([+-][ovO]+)\s([^ ]+).*"),
-                self.__setUserPrivilege),
+            (
+                re.compile(r":([^!]+).*\sMODE\s([^ ]+)\s([+-][ovO]+)\s([^ ]+).*"),
+                self.__setUserPrivilege,
+            ),
             # :cameron.libera.chat MODE #eric-ide +ns
-            (re.compile(r":([^ ]+)\sMODE\s([^ ]+)\s(.+)"),
-             self.__updateChannelModes),
+            (re.compile(r":([^ ]+)\sMODE\s([^ ]+)\s(.+)"), self.__updateChannelModes),
             # :foo_!n=foo@foohost.bar.net TOPIC #eric-ide :eric - Python IDE
             (re.compile(r":.*\sTOPIC\s([^ ]+)\s:(.*)"), self.__setTopic),
             # :sturgeon.libera.chat 301 foo_ bar :Gone away for now
-            (re.compile(r":.*\s301\s([^ ]+)\s([^ ]+)\s:(.+)"),
-             self.__userAway),
+            (re.compile(r":.*\s301\s([^ ]+)\s([^ ]+)\s:(.+)"), self.__userAway),
             # :sturgeon.libera.chat 315 foo_ #eric-ide :End of /WHO list.
             (re.compile(r":.*\s315\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoEnd),
             # :zelazny.libera.chat 324 foo_ #eric-ide +cnt
@@ -315,78 +329,84 @@
             # :zelazny.libera.chat 328 foo_ #eric-ide :http://www.bugger.com/
             (re.compile(r":.*\s328\s.*\s([^ ]+)\s:(.+)"), self.__channelUrl),
             # :zelazny.libera.chat 329 foo_ #eric-ide 1353001005
-            (re.compile(r":.*\s329\s.*\s([^ ]+)\s(.+)"),
-             self.__channelCreated),
+            (re.compile(r":.*\s329\s.*\s([^ ]+)\s(.+)"), self.__channelCreated),
             # :zelazny.libera.chat 332 foo_ #eric-ide :eric support channel
             (re.compile(r":.*\s332\s.*\s([^ ]+)\s:(.*)"), self.__setTopic),
             # :zelazny.libera.chat foo_ 333 #eric-ide foo 1353089020
-            (re.compile(r":.*\s333\s.*\s([^ ]+)\s([^ ]+)\s(\d+)"),
-             self.__topicCreated),
+            (re.compile(r":.*\s333\s.*\s([^ ]+)\s([^ ]+)\s(\d+)"), self.__topicCreated),
             # :cameron.libera.chat 352 detlev_ #eric-ide ~foo foohost.bar.net
             # cameron.libera.chat foo_ H :0 Foo Bar
-            (re.compile(
-                r":.*\s352\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s[^ ]+\s([^ ]+)"
-                r"\s([^ ]+)\s:\d+\s(.*)"), self.__whoEntry),
+            (
+                re.compile(
+                    r":.*\s352\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s[^ ]+\s([^ ]+)"
+                    r"\s([^ ]+)\s:\d+\s(.*)"
+                ),
+                self.__whoEntry,
+            ),
             # :zelazny.libera.chat 353 foo_ @ #eric-ide :@user1 +user2 user3
             (re.compile(r":.*\s353\s.*\s.\s([^ ]+)\s:(.*)"), self.__userList),
             # :sturgeon.libera.chat 354 foo_ 42 ChanServ H@
-            (re.compile(r":.*\s354\s[^ ]+\s42\s([^ ]+)\s(.*)"),
-             self.__autoWhoEntry),
+            (re.compile(r":.*\s354\s[^ ]+\s42\s([^ ]+)\s(.*)"), self.__autoWhoEntry),
             # :zelazny.libera.chat 366 foo_ #eric-ide :End of /NAMES list.
             (re.compile(r":.*\s366\s.*\s([^ ]+)\s:(.*)"), self.__ignore),
             # :sturgeon.libera.chat 704 foo_ index :Help topics available:
             (re.compile(r":.*\s70[456]\s[^ ]+\s([^ ]+)\s:(.*)"), self.__help),
-            
             # WHOIS replies
             # :sturgeon.libera.chat 311 foo_ bar ~bar barhost.foo.net * :Bar
-            (re.compile(
-                r":.*\s311\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s\*\s:(.*)"),
-             self.__whoIsUser),
+            (
+                re.compile(r":.*\s311\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s\*\s:(.*)"),
+                self.__whoIsUser,
+            ),
             # :sturgeon.libera.chat 319 foo_ bar :@#eric-ide
-            (re.compile(r":.*\s319\s[^ ]+\s([^ ]+)\s:(.*)"),
-             self.__whoIsChannels),
+            (re.compile(r":.*\s319\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsChannels),
             # :sturgeon.libera.chat 312 foo_ bar sturgeon.libera.chat :London
-            (re.compile(r":.*\s312\s[^ ]+\s([^ ]+)\s([^ ]+)\s:(.*)"),
-             self.__whoIsServer),
+            (
+                re.compile(r":.*\s312\s[^ ]+\s([^ ]+)\s([^ ]+)\s:(.*)"),
+                self.__whoIsServer,
+            ),
             # :sturgeon.libera.chat 671 foo_ bar :is using a secure connection
             (re.compile(r":.*\s671\s[^ ]+\s([^ ]+)\s:.*"), self.__whoIsSecure),
             # :sturgeon.libera.chat 317 foo_ bar 3758 1355046912 :seconds
             # idle, signon time
-            (re.compile(r":.*\s317\s[^ ]+\s([^ ]+)\s(\d+)\s(\d+)\s:.*"),
-                self.__whoIsIdle),
+            (
+                re.compile(r":.*\s317\s[^ ]+\s([^ ]+)\s(\d+)\s(\d+)\s:.*"),
+                self.__whoIsIdle,
+            ),
             # :sturgeon.libera.chat 330 foo_ bar bar :is logged in as
-            (re.compile(r":.*\s330\s[^ ]+\s([^ ]+)\s([^ ]+)\s:.*"),
-             self.__whoIsAccount),
+            (
+                re.compile(r":.*\s330\s[^ ]+\s([^ ]+)\s([^ ]+)\s:.*"),
+                self.__whoIsAccount,
+            ),
             # :sturgeon.libera.chat 318 foo_ bar :End of /WHOIS list.
             (re.compile(r":.*\s318\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsEnd),
             # :sturgeon.libera.chat 307 foo_ bar :is an identified user
-            (re.compile(r":.*\s307\s[^ ]+\s([^ ]+)\s:(.*)"),
-             self.__whoIsIdentify),
+            (re.compile(r":.*\s307\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsIdentify),
             # :sturgeon.libera.chat 320 foo_ bar :is an identified user
-            (re.compile(r":.*\s320\s[^ ]+\s([^ ]+)\s:(.*)"),
-             self.__whoIsIdentify),
+            (re.compile(r":.*\s320\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsIdentify),
             # :sturgeon.libera.chat 310 foo_ bar :is available for help
-            (re.compile(r":.*\s310\s[^ ]+\s([^ ]+)\s:(.*)"),
-             self.__whoIsHelper),
+            (re.compile(r":.*\s310\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsHelper),
             # :sturgeon.libera.chat 338 foo_ bar real.ident@real.host
             # 12.34.56.78 :Actual user@host, Actual IP
-            (re.compile(r":.*\s338\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s:.*"),
-             self.__whoIsActually),
+            (
+                re.compile(r":.*\s338\s[^ ]+\s([^ ]+)\s([^ ]+)\s([^ ]+)\s:.*"),
+                self.__whoIsActually,
+            ),
             # :sturgeon.libera.chat 313 foo_ bar :is an IRC Operator
-            (re.compile(r":.*\s313\s[^ ]+\s([^ ]+)\s:(.*)"),
-             self.__whoIsOperator),
+            (re.compile(r":.*\s313\s[^ ]+\s([^ ]+)\s:(.*)"), self.__whoIsOperator),
             # :sturgeon.libera.chat 378 foo_ bar :is connecting from
             # *@mnch-4d044d5a.pool.mediaWays.net 77.4.77.90
-            (re.compile(r":.*\s378\s[^ ]+\s([^ ]+)\s:.*\s([^ ]+)\s([^ ]+)"),
-             self.__whoIsConnection),
+            (
+                re.compile(r":.*\s378\s[^ ]+\s([^ ]+)\s:.*\s([^ ]+)\s([^ ]+)"),
+                self.__whoIsConnection,
+            ),
         ]
-        
+
         self.__autoWhoTemplate = "WHO {0} %tnf,42"
         self.__autoWhoTimer = QTimer()
         self.__autoWhoTimer.setSingleShot(True)
         self.__autoWhoTimer.timeout.connect(self.__sendAutoWhoCommand)
         self.__autoWhoRequested = False
-    
+
     @pyqtSlot()
     def on_messageEdit_returnPressed(self):
         """
@@ -400,17 +420,20 @@
         """
         Private method to process a message entered by the user or via the
         user list context menu.
-        
+
         @param msg message to be processed
         @type str
         """
         self.messages.append(
             '<font color="{0}">{2} <b>&lt;</b><font color="{1}">{3}</font>'
-            '<b>&gt;</b> {4}</font>'.format(
+            "<b>&gt;</b> {4}</font>".format(
                 Preferences.getIrc("ChannelMessageColour"),
                 Preferences.getIrc("OwnNickColour"),
-                ircTimestamp(), self.__userName,
-                Utilities.html_encode(msg)))
+                ircTimestamp(),
+                self.__userName,
+                Utilities.html_encode(msg),
+            )
+        )
 
         if msg.startswith("/"):
             if self.__private:
@@ -419,7 +442,9 @@
                     self.tr("Send Message"),
                     self.tr(
                         """Messages starting with a '/' are not allowed"""
-                        """ in private chats."""))
+                        """ in private chats."""
+                    ),
+                )
             else:
                 sendData = True
                 # flag set to False, if command was handled
@@ -429,25 +454,25 @@
                 if cmd in ["MSG", "QUERY"]:
                     cmd = "PRIVMSG"
                     if len(msgList) > 1:
-                        if (
-                            msgList[1].strip().lower() in
-                            self.__serviceNamesLower
-                        ):
+                        if msgList[1].strip().lower() in self.__serviceNamesLower:
                             msg = (
-                                "PRIVMSG " +
-                                msgList[1].strip().lower() +
-                                " :" + " ".join(msgList[2:])
+                                "PRIVMSG "
+                                + msgList[1].strip().lower()
+                                + " :"
+                                + " ".join(msgList[2:])
                             )
                         else:
                             msg = "PRIVMSG {0} :{1}".format(
-                                msgList[1], " ".join(msgList[2:]))
+                                msgList[1], " ".join(msgList[2:])
+                            )
                     else:
                         msgList[0] = cmd
                         msg = " ".join(msgList)
                 elif cmd == "NOTICE":
                     if len(msgList) > 2:
                         msg = "NOTICE {0} :{1}".format(
-                            msgList[1], " ".join(msgList[2:]))
+                            msgList[1], " ".join(msgList[2:])
+                        )
                     else:
                         msg = "NOTICE {0}".format(" ".join(msgList[1:]))
                 elif cmd == "PING":
@@ -466,8 +491,9 @@
                             userNamesList = msgList[1:]
                     else:
                         userNamesList = []
-                    userNames = ",".join(
-                        u.rstrip(",") for u in userNamesList).split(",")
+                    userNames = ",".join(u.rstrip(",") for u in userNamesList).split(
+                        ","
+                    )
                     for userName in userNames:
                         itm = self.__findUser(userName)
                         if itm:
@@ -478,8 +504,9 @@
                         userNamesList = msgList[1:]
                     else:
                         userNamesList = []
-                    userNames = ",".join(
-                        u.rstrip(",") for u in userNamesList).split(",")
+                    userNames = ",".join(u.rstrip(",") for u in userNamesList).split(
+                        ","
+                    )
                     for userName in userNames:
                         itm = self.__findUser(userName)
                         if itm:
@@ -499,8 +526,7 @@
                             keys = msgList[2].split(",")
                         else:
                             keys = []
-                        for channel, key in zip_longest(
-                                channels, keys, fillvalue=""):
+                        for channel, key in zip_longest(channels, keys, fillvalue=""):
                             self.__ircWidget.joinChannel(channel, key)
                 elif cmd == "PART":
                     sendData = False
@@ -517,15 +543,13 @@
                     self.sendData.emit(msg)
         else:
             if self.__private:
-                self.sendData.emit(
-                    "PRIVMSG " + self.__privatePartner + " :" + msg)
+                self.sendData.emit("PRIVMSG " + self.__privatePartner + " :" + msg)
             else:
-                self.sendData.emit(
-                    "PRIVMSG " + self.__name + " :" + msg)
+                self.sendData.emit("PRIVMSG " + self.__name + " :" + msg)
 
         self.messageEdit.clear()
         self.unsetMarkerLine()
-    
+
     def requestLeave(self):
         """
         Public method to leave the channel.
@@ -534,8 +558,9 @@
             self,
             self.tr("Leave IRC channel"),
             self.tr(
-                """Do you really want to leave the IRC channel"""
-                """ <b>{0}</b>?""").format(self.__name))
+                """Do you really want to leave the IRC channel""" """ <b>{0}</b>?"""
+            ).format(self.__name),
+        )
         if ok:
             self.leaveChannel()
 
@@ -544,90 +569,89 @@
         Public slot to leave the channel.
         """
         if not self.__private:
-            self.sendData.emit(
-                "PART " + self.__name + " :" + self.__partMessage)
+            self.sendData.emit("PART " + self.__name + " :" + self.__partMessage)
         self.channelClosed.emit(self.__name)
-    
+
     def name(self):
         """
         Public method to get the name of the channel.
-        
+
         @return name of the channel (string)
         """
         return self.__name
-    
+
     def setName(self, name):
         """
         Public method to set the name of the channel.
-        
+
         @param name of the channel (string)
         """
         self.__name = name
-    
+
     def getUsersCount(self):
         """
         Public method to get the users count of the channel.
-        
+
         @return users count of the channel (integer)
         """
         return self.usersList.count()
-    
+
     def userName(self):
         """
         Public method to get the nick name of the user.
-        
+
         @return nick name of the user (string)
         """
         return self.__userName
-    
+
     def setUserName(self, name):
         """
         Public method to set the user name for the channel.
-        
+
         @param name user name for the channel (string)
         """
         self.__userName = name
-    
+
     def partMessage(self):
         """
         Public method to get the part message.
-        
+
         @return part message (string)
         """
         return self.__partMessage
-    
+
     def setPartMessage(self, message):
         """
         Public method to set the part message.
-        
+
         @param message message to be used for PART messages (string)
         """
         self.__partMessage = message
-    
+
     def setPrivate(self, private, partner=""):
         """
         Public method to set the private chat mode.
-        
+
         @param private flag indicating private chat mode (boolean)
         @param partner name of the partner user (string)
         """
         self.__private = private
         self.__privatePartner = partner
         self.editTopicButton.setEnabled(private)
-    
+
     def setPrivateInfo(self, infoText):
         """
         Public method to set some info text for private chat mode.
-        
+
         @param infoText info text to be shown (string)
         """
         if self.__private:
             self.topicLabel.setText(infoText)
-    
+
     def handleMessage(self, line):
         """
         Public method to handle the message sent by the server.
-        
+
         @param line server message (string)
         @return flag indicating, if the message was handled (boolean)
         """
@@ -635,13 +659,13 @@
             match = patternRe.match(line)
             if match is not None and patternFunc(match):
                 return True
-        
+
         return False
-    
+
     def __message(self, match):
         """
         Private method to handle messages to the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -655,91 +679,91 @@
             if itm and itm.isIgnored():
                 # user should be ignored
                 return True
-            
+
             if match.group(4).startswith("\x01"):
                 return self.__handleCtcp(match)
-            
+
             self.addMessage(senderName, match.group(4))
             if self.__private and not self.topicLabel.text():
-                self.setPrivateInfo(
-                    "{0} - {1}".format(match.group(1), match.group(2)))
+                self.setPrivateInfo("{0} - {1}".format(match.group(1), match.group(2)))
             return True
-        
+
         return False
-    
+
     def addMessage(self, sender, msg):
         """
         Public method to add a message from external.
-        
+
         @param sender nick name of the sender (string)
         @param msg message received from sender (string)
         """
         self.__appendMessage(
             '<font color="{0}">{2} <b>&lt;</b><font color="{1}">{3}</font>'
-            '<b>&gt;</b> {4}</font>'.format(
+            "<b>&gt;</b> {4}</font>".format(
                 Preferences.getIrc("ChannelMessageColour"),
                 Preferences.getIrc("NickColour"),
-                ircTimestamp(), sender, ircFilter(msg)))
+                ircTimestamp(),
+                sender,
+                ircFilter(msg),
+            )
+        )
         if Preferences.getIrc("ShowNotifications"):
             if Preferences.getIrc("NotifyMessage"):
                 self.__ui.showNotification(
-                    UI.PixmapCache.getPixmap("irc48"),
-                    self.tr("Channel Message"), msg)
+                    UI.PixmapCache.getPixmap("irc48"), self.tr("Channel Message"), msg
+                )
             elif (
-                Preferences.getIrc("NotifyNick") and
-                self.__userName.lower() in msg.lower()
+                Preferences.getIrc("NotifyNick")
+                and self.__userName.lower() in msg.lower()
             ):
                 self.__ui.showNotification(
-                    UI.PixmapCache.getPixmap("irc48"),
-                    self.tr("Nick mentioned"), msg)
-    
+                    UI.PixmapCache.getPixmap("irc48"), self.tr("Nick mentioned"), msg
+                )
+
     def addUsers(self, users):
         """
         Public method to add users to the channel.
-        
+
         @param users list of user names to add (list of string)
         """
         for user in users:
             itm = self.__findUser(user)
             if itm is None:
                 IrcUserItem(user, self.usersList)
-    
+
     def __userJoin(self, match):
         """
         Private method to handle a user joining the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
         if match.group(3).lower() == self.__name.lower():
             if self.__userName != match.group(1):
                 IrcUserItem(match.group(1), self.usersList)
-                msg = self.tr(
-                    "{0} has joined the channel {1} ({2}).").format(
-                    match.group(1), self.__name, match.group(2))
-                self.__addManagementMessage(
-                    IrcChannelWidget.JoinIndicator, msg)
+                msg = self.tr("{0} has joined the channel {1} ({2}).").format(
+                    match.group(1), self.__name, match.group(2)
+                )
+                self.__addManagementMessage(IrcChannelWidget.JoinIndicator, msg)
             else:
-                msg = self.tr(
-                    "You have joined the channel {0} ({1}).").format(
-                    self.__name, match.group(2))
-                self.__addManagementMessage(
-                    IrcChannelWidget.JoinIndicator, msg)
-            if (
-                Preferences.getIrc("ShowNotifications") and
-                Preferences.getIrc("NotifyJoinPart")
+                msg = self.tr("You have joined the channel {0} ({1}).").format(
+                    self.__name, match.group(2)
+                )
+                self.__addManagementMessage(IrcChannelWidget.JoinIndicator, msg)
+            if Preferences.getIrc("ShowNotifications") and Preferences.getIrc(
+                "NotifyJoinPart"
             ):
                 self.__ui.showNotification(
-                    UI.PixmapCache.getPixmap("irc48"),
-                    self.tr("Join Channel"), msg)
+                    UI.PixmapCache.getPixmap("irc48"), self.tr("Join Channel"), msg
+                )
             return True
-        
+
         return False
-    
+
     def __userPart(self, match):
         """
         Private method to handle a user leaving the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -748,33 +772,31 @@
             self.usersList.takeItem(self.usersList.row(itm))
             del itm
             if match.lastindex == 2:
-                msg = self.tr("{0} has left {1}.").format(
-                    match.group(1), self.__name)
+                msg = self.tr("{0} has left {1}.").format(match.group(1), self.__name)
                 nmsg = msg
-                self.__addManagementMessage(
-                    IrcChannelWidget.LeaveIndicator, msg)
+                self.__addManagementMessage(IrcChannelWidget.LeaveIndicator, msg)
             else:
                 msg = self.tr("{0} has left {1}: {2}.").format(
-                    match.group(1), self.__name, ircFilter(match.group(3)))
+                    match.group(1), self.__name, ircFilter(match.group(3))
+                )
                 nmsg = self.tr("{0} has left {1}: {2}.").format(
-                    match.group(1), self.__name, match.group(3))
-                self.__addManagementMessage(
-                    IrcChannelWidget.LeaveIndicator, msg)
-            if (
-                Preferences.getIrc("ShowNotifications") and
-                Preferences.getIrc("NotifyJoinPart")
+                    match.group(1), self.__name, match.group(3)
+                )
+                self.__addManagementMessage(IrcChannelWidget.LeaveIndicator, msg)
+            if Preferences.getIrc("ShowNotifications") and Preferences.getIrc(
+                "NotifyJoinPart"
             ):
                 self.__ui.showNotification(
-                    UI.PixmapCache.getPixmap("irc48"),
-                    self.tr("Leave Channel"), nmsg)
+                    UI.PixmapCache.getPixmap("irc48"), self.tr("Leave Channel"), nmsg
+                )
             return True
-        
+
         return False
-    
+
     def __userQuit(self, match):
         """
         Private method to handle a user logging off the server.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -783,30 +805,27 @@
             self.usersList.takeItem(self.usersList.row(itm))
             del itm
             if match.lastindex == 1:
-                msg = self.tr("{0} has quit {1}.").format(
-                    match.group(1), self.__name)
-                self.__addManagementMessage(
-                    IrcChannelWidget.MessageIndicator, msg)
+                msg = self.tr("{0} has quit {1}.").format(match.group(1), self.__name)
+                self.__addManagementMessage(IrcChannelWidget.MessageIndicator, msg)
             else:
                 msg = self.tr("{0} has quit {1}: {2}.").format(
-                    match.group(1), self.__name, ircFilter(match.group(2)))
-                self.__addManagementMessage(
-                    IrcChannelWidget.MessageIndicator, msg)
-            if (
-                Preferences.getIrc("ShowNotifications") and
-                Preferences.getIrc("NotifyJoinPart")
+                    match.group(1), self.__name, ircFilter(match.group(2))
+                )
+                self.__addManagementMessage(IrcChannelWidget.MessageIndicator, msg)
+            if Preferences.getIrc("ShowNotifications") and Preferences.getIrc(
+                "NotifyJoinPart"
             ):
                 self.__ui.showNotification(
-                    UI.PixmapCache.getPixmap("irc48"),
-                    self.tr("Quit"), msg)
-        
+                    UI.PixmapCache.getPixmap("irc48"), self.tr("Quit"), msg
+                )
+
         # always return False for other channels and server to process
         return False
-    
+
     def __userNickChange(self, match):
         """
         Private method to handle a nickname change of a user.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -816,22 +835,24 @@
             if match.group(1) == self.__userName:
                 self.__addManagementMessage(
                     IrcChannelWidget.MessageIndicator,
-                    self.tr("You are now known as {0}.").format(
-                        match.group(2)))
+                    self.tr("You are now known as {0}.").format(match.group(2)),
+                )
                 self.__userName = match.group(2)
             else:
                 self.__addManagementMessage(
                     IrcChannelWidget.MessageIndicator,
                     self.tr("User {0} is now known as {1}.").format(
-                        match.group(1), match.group(2)))
-        
+                        match.group(1), match.group(2)
+                    ),
+                )
+
         # always return False for other channels and server to process
         return False
-    
+
     def __userList(self, match):
         """
         Private method to handle the receipt of a list of users of the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -844,32 +865,32 @@
                     itm = IrcUserItem(userName, self.usersList)
                 for privilege in userPrivileges:
                     itm.changePrivilege(privilege)
-            
+
             self.__setEditTopicButton()
             return True
-        
+
         return False
 
     def __userAway(self, match):
         """
         Private method to handle a topic change of the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
         if match.group(1).lower() == self.__name.lower():
             self.__addManagementMessage(
                 self.tr("Away"),
-                self.tr("{0} is away: {1}").format(
-                    match.group(2), match.group(3)))
+                self.tr("{0} is away: {1}").format(match.group(2), match.group(3)),
+            )
             return True
-        
+
         return False
-    
+
     def __setTopic(self, match):
         """
         Private method to handle a topic change of the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -877,16 +898,18 @@
             self.topicLabel.setText(match.group(2))
             self.__addManagementMessage(
                 IrcChannelWidget.MessageIndicator,
-                ircFilter(self.tr('The channel topic is: "{0}".').format(
-                    match.group(2))))
+                ircFilter(
+                    self.tr('The channel topic is: "{0}".').format(match.group(2))
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __topicCreated(self, match):
         """
         Private method to handle a topic created message.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -895,32 +918,35 @@
                 IrcChannelWidget.MessageIndicator,
                 self.tr("The topic was set by {0} on {1}.").format(
                     match.group(2),
-                    QDateTime.fromSecsSinceEpoch(int(match.group(3)))
-                    .toString("yyyy-MM-dd hh:mm")))
+                    QDateTime.fromSecsSinceEpoch(int(match.group(3))).toString(
+                        "yyyy-MM-dd hh:mm"
+                    ),
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __channelUrl(self, match):
         """
         Private method to handle a channel URL message.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
         if match.group(1).lower() == self.__name.lower():
             self.__addManagementMessage(
                 IrcChannelWidget.MessageIndicator,
-                ircFilter(self.tr("Channel URL: {0}").format(
-                    match.group(2))))
+                ircFilter(self.tr("Channel URL: {0}").format(match.group(2))),
+            )
             return True
-        
+
         return False
-    
+
     def __channelModes(self, match):
         """
         Private method to handle a message reporting the channel modes.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -934,29 +960,28 @@
                     continue
                 elif modeChar == "k":
                     parameter = modesParameters.pop(0)
-                    modes.append(self.tr(
-                        "password protected ({0})").format(parameter))
+                    modes.append(self.tr("password protected ({0})").format(parameter))
                 elif modeChar == "l":
                     parameter = modesParameters.pop(0)
-                    modes.append(self.tr(
-                        "limited to %n user(s)", "", int(parameter)))
+                    modes.append(self.tr("limited to %n user(s)", "", int(parameter)))
                 elif modeChar in modesDict:
                     modes.append(modesDict[modeChar])
                 else:
                     modes.append(modeChar)
-            
+
             self.__addManagementMessage(
                 IrcChannelWidget.MessageIndicator,
-                self.tr("Channel modes: {0}.").format(", ".join(modes)))
-            
+                self.tr("Channel modes: {0}.").format(", ".join(modes)),
+            )
+
             return True
-        
+
         return False
-    
+
     def __channelCreated(self, match):
         """
         Private method to handle a channel created message.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -964,16 +989,19 @@
             self.__addManagementMessage(
                 IrcChannelWidget.MessageIndicator,
                 self.tr("This channel was created on {0}.").format(
-                    QDateTime.fromSecsSinceEpoch(int(match.group(2)))
-                    .toString("yyyy-MM-dd hh:mm")))
+                    QDateTime.fromSecsSinceEpoch(int(match.group(2))).toString(
+                        "yyyy-MM-dd hh:mm"
+                    )
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __updateChannelModes(self, match):
         """
         Private method to handle a message reporting the channel modes.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1000,35 +1028,35 @@
                         ).format(nick)
                     else:
                         message = self.tr(
-                            "{0} removes the 'anonymous' mode from the"
-                            " channel.").format(nick)
+                            "{0} removes the 'anonymous' mode from the" " channel."
+                        ).format(nick)
                 elif mode == "b":
                     if isPlus:
-                        message = self.tr(
-                            "{0} sets a ban on {1}.").format(
-                            nick, modesParameters.pop(0))
+                        message = self.tr("{0} sets a ban on {1}.").format(
+                            nick, modesParameters.pop(0)
+                        )
                     else:
-                        message = self.tr(
-                            "{0} removes the ban on {1}.").format(
-                            nick, modesParameters.pop(0))
+                        message = self.tr("{0} removes the ban on {1}.").format(
+                            nick, modesParameters.pop(0)
+                        )
                 elif mode == "c":
                     if isPlus:
                         message = self.tr(
-                            "{0} sets the channel mode to 'no colors"
-                            " allowed'.").format(nick)
+                            "{0} sets the channel mode to 'no colors" " allowed'."
+                        ).format(nick)
                     else:
                         message = self.tr(
-                            "{0} sets the channel mode to 'allow color"
-                            " codes'.").format(nick)
+                            "{0} sets the channel mode to 'allow color" " codes'."
+                        ).format(nick)
                 elif mode == "e":
                     if isPlus:
-                        message = self.tr(
-                            "{0} sets a ban exception on {1}.").format(
-                            nick, modesParameters.pop(0))
+                        message = self.tr("{0} sets a ban exception on {1}.").format(
+                            nick, modesParameters.pop(0)
+                        )
                     else:
                         message = self.tr(
-                            "{0} removes the ban exception on {1}.").format(
-                            nick, modesParameters.pop(0))
+                            "{0} removes the ban exception on {1}."
+                        ).format(nick, modesParameters.pop(0))
                 elif mode == "i":
                     if isPlus:
                         message = self.tr(
@@ -1036,24 +1064,24 @@
                         ).format(nick)
                     else:
                         message = self.tr(
-                            "{0} removes the 'invite only' mode from the"
-                            " channel.").format(nick)
+                            "{0} removes the 'invite only' mode from the" " channel."
+                        ).format(nick)
                 elif mode == "k":
                     if isPlus:
-                        message = self.tr(
-                            "{0} sets the channel key to '{1}'.").format(
-                            nick, modesParameters.pop(0))
+                        message = self.tr("{0} sets the channel key to '{1}'.").format(
+                            nick, modesParameters.pop(0)
+                        )
                     else:
-                        message = self.tr(
-                            "{0} removes the channel key.").format(nick)
+                        message = self.tr("{0} removes the channel key.").format(nick)
                 elif mode == "l":
                     if isPlus:
                         message = self.tr(
-                            "{0} sets the channel limit to %n nick(s).", "",
-                            int(modesParameters.pop(0))).format(nick)
+                            "{0} sets the channel limit to %n nick(s).",
+                            "",
+                            int(modesParameters.pop(0)),
+                        ).format(nick)
                     else:
-                        message = self.tr(
-                            "{0} removes the channel limit.").format(nick)
+                        message = self.tr("{0} removes the channel limit.").format(nick)
                 elif mode == "m":
                     if isPlus:
                         message = self.tr(
@@ -1067,11 +1095,13 @@
                     if isPlus:
                         message = self.tr(
                             "{0} sets the channel mode to 'no messages from"
-                            " outside'.").format(nick)
+                            " outside'."
+                        ).format(nick)
                     else:
                         message = self.tr(
                             "{0} sets the channel mode to 'allow messages"
-                            " from outside'.").format(nick)
+                            " from outside'."
+                        ).format(nick)
                 elif mode == "p":
                     if isPlus:
                         message = self.tr(
@@ -1103,32 +1133,33 @@
                         ).format(nick)
                 elif mode == "t":
                     if isPlus:
-                        message = self.tr(
-                            "{0} switches on 'topic protection'.").format(nick)
+                        message = self.tr("{0} switches on 'topic protection'.").format(
+                            nick
+                        )
                     else:
                         message = self.tr(
                             "{0} switches off 'topic protection'."
                         ).format(nick)
                 elif mode == "I":
                     if isPlus:
-                        message = self.tr(
-                            "{0} sets invitation mask {1}.").format(
-                            nick, modesParameters.pop(0))
+                        message = self.tr("{0} sets invitation mask {1}.").format(
+                            nick, modesParameters.pop(0)
+                        )
                     else:
                         message = self.tr(
-                            "{0} removes the invitation mask {1}.").format(
-                            nick, modesParameters.pop(0))
-                
+                            "{0} removes the invitation mask {1}."
+                        ).format(nick, modesParameters.pop(0))
+
                 self.__addManagementMessage(self.tr("Mode"), message)
-            
+
             return True
-        
+
         return False
-    
+
     def __setUserPrivilege(self, match):
         """
         Private method to handle a change of user privileges for the channel.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1140,39 +1171,41 @@
             self.__addManagementMessage(
                 IrcChannelWidget.MessageIndicator,
                 self.tr("{0} sets mode for {1}: {2}.").format(
-                    match.group(1), match.group(4), match.group(3)))
+                    match.group(1), match.group(4), match.group(3)
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __ignore(self, match):
         """
         Private method to handle a channel message we are not interested in.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
         if match.group(1).lower() == self.__name.lower():
             return True
-        
+
         return False
-    
+
     def __help(self, match):
         """
         Private method to handle a help message.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
         self.__addManagementMessage(
-            self.tr("Help"),
-            "{0} {1}".format(match.group(1), ircFilter(match.group(2))))
+            self.tr("Help"), "{0} {1}".format(match.group(1), ircFilter(match.group(2)))
+        )
         return True
-    
+
     def __handleCtcp(self, match):
         """
         Private method to handle a CTCP channel command.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
@@ -1192,48 +1225,54 @@
                 self.__addManagementMessage(
                     self.tr("CTCP"),
                     self.tr("Received Version request from {0}.").format(
-                        match.group(1)))
+                        match.group(1)
+                    ),
+                )
                 self.sendCtcpReply.emit(match.group(1), "VERSION " + msg)
             elif ctcpRequest == "ping":
                 self.__addManagementMessage(
                     self.tr("CTCP"),
                     self.tr(
-                        "Received CTCP-PING request from {0},"
-                        " sending answer.").format(match.group(1)))
-                self.sendCtcpReply.emit(
-                    match.group(1), "PING {0}".format(ctcpArg))
+                        "Received CTCP-PING request from {0}," " sending answer."
+                    ).format(match.group(1)),
+                )
+                self.sendCtcpReply.emit(match.group(1), "PING {0}".format(ctcpArg))
             elif ctcpRequest == "clientinfo":
                 self.__addManagementMessage(
                     self.tr("CTCP"),
                     self.tr(
-                        "Received CTCP-CLIENTINFO request from {0},"
-                        " sending answer.").format(match.group(1)))
+                        "Received CTCP-CLIENTINFO request from {0}," " sending answer."
+                    ).format(match.group(1)),
+                )
                 self.sendCtcpReply.emit(
-                    match.group(1), "CLIENTINFO CLIENTINFO PING VERSION")
+                    match.group(1), "CLIENTINFO CLIENTINFO PING VERSION"
+                )
             else:
                 self.__addManagementMessage(
                     self.tr("CTCP"),
-                    self.tr("Received unknown CTCP-{0} request from {1}.")
-                    .format(ctcpRequest, match.group(1)))
+                    self.tr("Received unknown CTCP-{0} request from {1}.").format(
+                        ctcpRequest, match.group(1)
+                    ),
+                )
             return True
-        
+
         return False
-    
+
     def setUserPrivilegePrefix(self, prefixes):
         """
         Public method to set the user privilege to prefix mapping.
-        
+
         @param prefixes dictionary with privilege as key and prefix as value
         """
         self.__prefixToPrivilege = {}
         for privilege, prefix in prefixes.items():
             if prefix:
                 self.__prefixToPrivilege[prefix] = privilege
-    
+
     def __findUser(self, name):
         """
         Private method to find the user in the list of users.
-        
+
         @param name user name to search for (string)
         @return reference to the list entry (QListWidgetItem)
         """
@@ -1241,13 +1280,13 @@
             itm = self.usersList.item(row)
             if itm.name() == name:
                 return itm
-        
+
         return None
-    
+
     def __extractPrivilege(self, name):
         """
         Private method to extract the user privileges out of the name.
-        
+
         @param name user name and prefixes (string)
         @return list of privileges and user name (list of string, string)
         """
@@ -1258,13 +1297,13 @@
             name = name[1:]
             if name[0] == ",":
                 name = name[1:]
-        
+
         return privileges, name
-    
+
     def __addManagementMessage(self, indicator, message):
         """
         Private method to add a channel management message to the list.
-        
+
         @param indicator indicator to be shown (string)
         @param message message to be shown (string)
         """
@@ -1276,35 +1315,38 @@
             color = Preferences.getIrc("ChannelInfoColour")
         self.__appendMessage(
             '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format(
-                color, ircTimestamp(), indicator, message))
-    
+                color, ircTimestamp(), indicator, message
+            )
+        )
+
     def __appendMessage(self, message):
         """
         Private slot to append a message.
-        
+
         @param message message to be appended (string)
         """
         if (
-            self.__hidden and
-            self.__markerLine == "" and
-            Preferences.getIrc("MarkPositionWhenHidden")
+            self.__hidden
+            and self.__markerLine == ""
+            and Preferences.getIrc("MarkPositionWhenHidden")
         ):
             self.setMarkerLine()
         self.messages.append(message)
-    
+
     def setMarkerLine(self):
         """
         Public method to draw a line to mark the current position.
         """
         self.unsetMarkerLine()
         self.__markerLine = (
-            '<span style=" color:{0}; background-color:{1};">{2}</span>'
-            .format(Preferences.getIrc("MarkerLineForegroundColour"),
-                    Preferences.getIrc("MarkerLineBackgroundColour"),
-                    self.tr('--- New From Here ---'))
+            '<span style=" color:{0}; background-color:{1};">{2}</span>'.format(
+                Preferences.getIrc("MarkerLineForegroundColour"),
+                Preferences.getIrc("MarkerLineBackgroundColour"),
+                self.tr("--- New From Here ---"),
+            )
         )
         self.messages.append(self.__markerLine)
-    
+
     def unsetMarkerLine(self):
         """
         Public method to remove the marker line.
@@ -1320,20 +1362,20 @@
             self.messages.setHtml(txt)
             self.__markerLine = ""
             self.messages.moveCursor(QTextCursor.MoveOperation.End)
-    
+
     def __clearMessages(self):
         """
         Private slot to clear the contents of the messages display.
         """
         self.messages.clear()
-    
+
     def __copyMessages(self):
         """
         Private slot to copy the selection of the messages display to the
         clipboard.
         """
         self.messages.copy()
-    
+
     def __copyAllMessages(self):
         """
         Private slot to copy the contents of the messages display to the
@@ -1343,7 +1385,7 @@
         if txt:
             cb = QApplication.clipboard()
             cb.setText(txt)
-    
+
     def __cutAllMessages(self):
         """
         Private slot to cut the contents of the messages display to the
@@ -1354,7 +1396,7 @@
             cb = QApplication.clipboard()
             cb.setText(txt)
         self.messages.clear()
-    
+
     def __saveMessages(self):
         """
         Private slot to save the contents of the messages display.
@@ -1369,11 +1411,12 @@
                 self,
                 self.tr("Save Messages"),
                 "",
-                self.tr(
-                    "HTML Files (*.{0});;Text Files (*.txt);;All Files (*)")
-                .format(htmlExtension),
+                self.tr("HTML Files (*.{0});;Text Files (*.txt);;All Files (*)").format(
+                    htmlExtension
+                ),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -1384,17 +1427,20 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Messages"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 try:
                     txt = (
                         self.messages.toHtml()
-                        if fpath.suffix.lower() in [".htm", ".html"] else
-                        self.messages.toPlainText()
+                        if fpath.suffix.lower() in [".htm", ".html"]
+                        else self.messages.toPlainText()
                     )
                     with fpath.open("w", encoding="utf-8") as f:
                         f.write(txt)
@@ -1404,56 +1450,60 @@
                         self.tr("Error saving Messages"),
                         self.tr(
                             """<p>The messages contents could not be written"""
-                            """ to <b>{0}</b></p><p>Reason: {1}</p>""")
-                        .format(fpath, str(err)))
-    
+                            """ to <b>{0}</b></p><p>Reason: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
+
     def __initMessagesMenu(self):
         """
         Private slot to initialize the context menu of the messages pane.
         """
         self.__messagesMenu = QMenu(self)
         self.__copyMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy"), self.__copyMessages)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyMessages
+        )
         self.__messagesMenu.addSeparator()
         self.__cutAllMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editCut"),
-            self.tr("Cut all"), self.__cutAllMessages)
+            UI.PixmapCache.getIcon("editCut"), self.tr("Cut all"), self.__cutAllMessages
+        )
         self.__copyAllMessagesAct = self.__messagesMenu.addAction(
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy all"), self.__copyAllMessages)
+            self.tr("Copy all"),
+            self.__copyAllMessages,
+        )
         self.__messagesMenu.addSeparator()
         self.__clearMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editDelete"),
-            self.tr("Clear"), self.__clearMessages)
+            UI.PixmapCache.getIcon("editDelete"), self.tr("Clear"), self.__clearMessages
+        )
         self.__messagesMenu.addSeparator()
         self.__saveMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr("Save"), self.__saveMessages)
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__saveMessages
+        )
         self.__messagesMenu.addSeparator()
         self.__setMarkerMessagesAct = self.__messagesMenu.addAction(
-            self.tr("Mark Current Position"), self.setMarkerLine)
+            self.tr("Mark Current Position"), self.setMarkerLine
+        )
         self.__unsetMarkerMessagesAct = self.__messagesMenu.addAction(
-            self.tr("Remove Position Marker"),
-            self.unsetMarkerLine)
-        
+            self.tr("Remove Position Marker"), self.unsetMarkerLine
+        )
+
         self.on_messages_copyAvailable(False)
-    
+
     @pyqtSlot(bool)
     def on_messages_copyAvailable(self, yes):
         """
         Private slot to react to text selection/deselection of the messages
         edit.
-        
+
         @param yes flag signaling the availability of selected text (boolean)
         """
         self.__copyMessagesAct.setEnabled(yes)
-    
+
     @pyqtSlot(QPoint)
     def on_messages_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the messages pane.
-        
+
         @param pos the position of the mouse pointer (QPoint)
         """
         enable = not self.messages.document().isEmpty()
@@ -1463,108 +1513,120 @@
         self.__setMarkerMessagesAct.setEnabled(self.__markerLine == "")
         self.__unsetMarkerMessagesAct.setEnabled(self.__markerLine != "")
         self.__messagesMenu.popup(self.messages.mapToGlobal(pos))
-    
+
     def __whoIs(self):
         """
         Private slot to get information about the selected user.
         """
         self.__whoIsNick = self.usersList.selectedItems()[0].text()
         self.sendData.emit("WHOIS " + self.__whoIsNick)
-    
+
     def __openPrivateChat(self):
         """
         Private slot to open a chat with the selected user.
         """
         user = self.usersList.selectedItems()[0].text()
         self.openPrivateChat.emit(user)
-    
+
     def __sendUserMessage(self):
         """
         Private slot to send a private message to a specific user.
         """
         from EricWidgets import EricTextInputDialog
-        
+
         user = self.usersList.selectedItems()[0].text()
         ok, message = EricTextInputDialog.getText(
-            self, self.tr("Send Message"),
+            self,
+            self.tr("Send Message"),
             self.tr("Enter the message to be sent:"),
-            minimumWidth=400)
+            minimumWidth=400,
+        )
         if ok and message:
             self.__processUserMessage("/MSG {0} {1}".format(user, message))
-    
+
     def __sendUserQuery(self):
         """
         Private slot to send a query message to a specific user.
         """
         from EricWidgets import EricTextInputDialog
-        
+
         user = self.usersList.selectedItems()[0].text()
         ok, message = EricTextInputDialog.getText(
-            self, self.tr("Send Query"),
+            self,
+            self.tr("Send Query"),
             self.tr("Enter the message to be sent:"),
-            minimumWidth=400)
+            minimumWidth=400,
+        )
         if ok and message:
             self.__processUserMessage("/QUERY {0} {1}".format(user, message))
-    
+
     def __sendUserNotice(self):
         """
         Private slot to send a notice message to a specific user.
         """
         from EricWidgets import EricTextInputDialog
-        
+
         user = self.usersList.selectedItems()[0].text()
         ok, message = EricTextInputDialog.getText(
-            self, self.tr("Send Notice"),
+            self,
+            self.tr("Send Notice"),
             self.tr("Enter the message to be sent:"),
-            minimumWidth=400)
+            minimumWidth=400,
+        )
         if ok and message:
             self.__processUserMessage("/NOTICE {0} {1}".format(user, message))
-    
+
     def __pingUser(self):
         """
         Private slot to send a ping to a specific user.
         """
         user = self.usersList.selectedItems()[0].text()
         self.__processUserMessage("/PING {0}".format(user))
-    
+
     def __ignoreUser(self):
         """
         Private slot to ignore a specific user.
         """
         user = self.usersList.selectedItems()[0].text()
         self.__processUserMessage("/IGNORE {0}".format(user))
-    
+
     def __initUsersMenu(self):
         """
         Private slot to initialize the users list context menu.
         """
         self.__usersMenu = QMenu(self)
-        self.__whoIsAct = self.__usersMenu.addAction(
-            self.tr("Who Is"), self.__whoIs)
+        self.__whoIsAct = self.__usersMenu.addAction(self.tr("Who Is"), self.__whoIs)
         self.__usersMenu.addSeparator()
         self.__privateChatAct = self.__usersMenu.addAction(
-            self.tr("Private Chat"), self.__openPrivateChat)
+            self.tr("Private Chat"), self.__openPrivateChat
+        )
         self.__usersMenu.addSeparator()
         self.__sendUserMessageAct = self.__usersMenu.addAction(
-            self.tr("Send Message"), self.__sendUserMessage)
+            self.tr("Send Message"), self.__sendUserMessage
+        )
         self.__sendUserQueryAct = self.__usersMenu.addAction(
-            self.tr("Send Query"), self.__sendUserQuery)
+            self.tr("Send Query"), self.__sendUserQuery
+        )
         self.__sendUserNoticeAct = self.__usersMenu.addAction(
-            self.tr("Send Notice"), self.__sendUserNotice)
+            self.tr("Send Notice"), self.__sendUserNotice
+        )
         self.__usersMenu.addSeparator()
         self.__pingUserAct = self.__usersMenu.addAction(
-            self.tr("Send Ping"), self.__pingUser)
+            self.tr("Send Ping"), self.__pingUser
+        )
         self.__ignoreUserAct = self.__usersMenu.addAction(
-            self.tr("Ignore User"), self.__ignoreUser)
+            self.tr("Ignore User"), self.__ignoreUser
+        )
         self.__usersMenu.addSeparator()
         self.__usersListRefreshAct = self.__usersMenu.addAction(
-            self.tr("Refresh"), self.__sendAutoWhoCommand)
-    
+            self.tr("Refresh"), self.__sendAutoWhoCommand
+        )
+
     @pyqtSlot(QPoint)
     def on_usersList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the users list.
-        
+
         @param pos the position of the mouse pointer (QPoint)
         """
         enable = len(self.usersList.selectedItems()) > 0
@@ -1572,38 +1634,42 @@
         itm = self.usersList.itemAt(pos)
         if itm and enablePrivate:
             enablePrivate = itm.text().lower() not in [
-                "chanserv", self.__userName.lower()]
+                "chanserv",
+                self.__userName.lower(),
+            ]
         self.__whoIsAct.setEnabled(enable)
         self.__privateChatAct.setEnabled(enablePrivate)
         self.__usersListRefreshAct.setEnabled(
-            self.usersList.count() <= Preferences.getIrc("AutoUserInfoMax"))
+            self.usersList.count() <= Preferences.getIrc("AutoUserInfoMax")
+        )
         self.__usersMenu.popup(self.usersList.mapToGlobal(pos))
-    
+
     def hideEvent(self, evt):
         """
         Protected method handling hide events.
-        
+
         @param evt reference to the hide event (QHideEvent)
         """
         self.__hidden = True
-    
+
     def showEvent(self, evt):
         """
         Protected method handling show events.
-        
+
         @param evt reference to the show event (QShowEvent)
         """
         self.__hidden = False
-    
+
     def initAutoWho(self):
         """
         Public method to initialize the Auto Who system.
         """
         if Preferences.getIrc("AutoUserInfoLookup"):
             self.__autoWhoTimer.setInterval(
-                Preferences.getIrc("AutoUserInfoInterval") * 1000)
+                Preferences.getIrc("AutoUserInfoInterval") * 1000
+            )
             self.__autoWhoTimer.start()
-    
+
     @pyqtSlot()
     def __sendAutoWhoCommand(self):
         """
@@ -1612,12 +1678,12 @@
         if self.usersList.count() <= Preferences.getIrc("AutoUserInfoMax"):
             self.__autoWhoRequested = True
             self.sendData.emit(self.__autoWhoTemplate.format(self.__name))
-    
+
     def __autoWhoEntry(self, match):
         """
         Private method to handle a WHO entry returned by the server as
         requested automatically.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1628,13 +1694,13 @@
             if itm:
                 itm.parseWhoFlags(match.group(2))
             return True
-        
+
         return False
-    
+
     def __whoEnd(self, match):
         """
         Private method to handle the end of the WHO list.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1645,17 +1711,17 @@
             else:
                 self.__addManagementMessage(
                     self.tr("Who"),
-                    self.tr("End of WHO list for {0}.").format(
-                        match.group(1)))
+                    self.tr("End of WHO list for {0}.").format(match.group(1)),
+                )
             return True
-        
+
         return False
-    
+
     def __whoEntry(self, match):
         """
         Private method to handle a WHO entry returned by the server as
         requested manually.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1666,23 +1732,21 @@
         # group(5)  user flags
         # group(6)  real name
         if match.group(1).lower() == self.__name.lower():
-            away = (
-                self.tr(" (Away)")
-                if match.group(5).startswith("G") else ""
-            )
+            away = self.tr(" (Away)") if match.group(5).startswith("G") else ""
             self.__addManagementMessage(
                 self.tr("Who"),
                 self.tr("{0} is {1}@{2} ({3}){4}").format(
-                    match.group(4), match.group(2), match.group(3),
-                    match.group(6), away))
+                    match.group(4), match.group(2), match.group(3), match.group(6), away
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsUser(self, match):
         """
         Private method to handle the WHOIS user reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1695,15 +1759,17 @@
             self.__addManagementMessage(
                 self.tr("Whois"),
                 self.tr("{0} is {1}@{2} ({3}).").format(
-                    match.group(1), match.group(2), match.group(3), realName))
+                    match.group(1), match.group(2), match.group(3), realName
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsChannels(self, match):
         """
         Private method to handle the WHOIS channels reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1716,15 +1782,14 @@
             halfopChannels = []
             ownerChannels = []
             adminChannels = []
-            
+
             # generate the list of channels the user is in
             channelList = match.group(2).split()
             for channel in channelList:
                 if channel.startswith(("*", "&")):
                     adminChannels.append(channel[1:])
-                elif (
-                    channel.startswith(("!", "~")) and
-                    self.__ircWidget.isChannelName(channel[1:])
+                elif channel.startswith(("!", "~")) and self.__ircWidget.isChannelName(
+                    channel[1:]
                 ):
                     ownerChannels.append(channel[1:])
                 elif channel.startswith("@+"):
@@ -1737,46 +1802,58 @@
                     voiceChannels.append(channel[1:])
                 else:
                     userChannels.append(channel)
-            
+
             # show messages
             if userChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} is a user on channels: {1}").format(
-                        match.group(1), " ".join(userChannels)))
+                        match.group(1), " ".join(userChannels)
+                    ),
+                )
             if voiceChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} has voice on channels: {1}").format(
-                        match.group(1), " ".join(voiceChannels)))
+                        match.group(1), " ".join(voiceChannels)
+                    ),
+                )
             if halfopChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} is a halfop on channels: {1}").format(
-                        match.group(1), " ".join(halfopChannels)))
+                        match.group(1), " ".join(halfopChannels)
+                    ),
+                )
             if opChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} is an operator on channels: {1}").format(
-                        match.group(1), " ".join(opChannels)))
+                        match.group(1), " ".join(opChannels)
+                    ),
+                )
             if ownerChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} is owner of channels: {1}").format(
-                        match.group(1), " ".join(ownerChannels)))
+                        match.group(1), " ".join(ownerChannels)
+                    ),
+                )
             if adminChannels:
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} is admin on channels: {1}").format(
-                        match.group(1), " ".join(adminChannels)))
+                        match.group(1), " ".join(adminChannels)
+                    ),
+                )
             return True
-        
+
         return False
-    
+
     def __whoIsServer(self, match):
         """
         Private method to handle the WHOIS server reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1787,15 +1864,17 @@
             self.__addManagementMessage(
                 self.tr("Whois"),
                 self.tr("{0} is online via {1} ({2}).").format(
-                    match.group(1), match.group(2), match.group(3)))
+                    match.group(1), match.group(2), match.group(3)
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsOperator(self, match):
         """
         Private method to handle the WHOIS operator reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1805,20 +1884,20 @@
             if match.group(2).lower().startswith("is an irc operator"):
                 self.__addManagementMessage(
                     self.tr("Whois"),
-                    self.tr("{0} is an IRC Operator.").format(
-                        match.group(1)))
+                    self.tr("{0} is an IRC Operator.").format(match.group(1)),
+                )
             else:
                 self.__addManagementMessage(
-                    self.tr("Whois"),
-                    "{0} {1}".format(match.group(1), match.group(2)))
+                    self.tr("Whois"), "{0} {1}".format(match.group(1), match.group(2))
+                )
             return True
-        
+
         return False
-    
+
     def __whoIsIdle(self, match):
         """
         Private method to handle the WHOIS idle reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1830,11 +1909,11 @@
             minutes = seconds // 60
             hours = minutes // 60
             days = hours // 24
-            
+
             signonTimestamp = int(match.group(3))
             signonTime = QDateTime()
             signonTime.setTime_t(signonTimestamp)
-            
+
             if days:
                 daysString = self.tr("%n day(s)", "", days)
                 hoursString = self.tr("%n hour(s)", "", hours)
@@ -1846,9 +1925,15 @@
                         "{0} has been idle for {1}, {2}, {3}, and {4}.",
                         "{0} = name of person, {1} = (x days),"
                         " {2} = (x hours), {3} = (x minutes),"
-                        " {4} = (x seconds)").format(
-                        match.group(1), daysString, hoursString, minutesString,
-                        secondsString))
+                        " {4} = (x seconds)",
+                    ).format(
+                        match.group(1),
+                        daysString,
+                        hoursString,
+                        minutesString,
+                        secondsString,
+                    ),
+                )
             elif hours:
                 hoursString = self.tr("%n hour(s)", "", hours)
                 minutesString = self.tr("%n minute(s)", "", minutes)
@@ -1858,9 +1943,9 @@
                     self.tr(
                         "{0} has been idle for {1}, {2}, and {3}.",
                         "{0} = name of person, {1} = (x hours), "
-                        "{2} = (x minutes), {3} = (x seconds)")
-                    .format(match.group(1), hoursString, minutesString,
-                            secondsString))
+                        "{2} = (x minutes), {3} = (x seconds)",
+                    ).format(match.group(1), hoursString, minutesString, secondsString),
+                )
             elif minutes:
                 minutesString = self.tr("%n minute(s)", "", minutes)
                 secondsString = self.tr("%n second(s)", "", seconds)
@@ -1868,30 +1953,32 @@
                     self.tr("Whois"),
                     self.tr(
                         "{0} has been idle for {1} and {2}.",
-                        "{0} = name of person, {1} = (x minutes), "
-                        "{3} = (x seconds)")
-                    .format(match.group(1), minutesString, secondsString))
+                        "{0} = name of person, {1} = (x minutes), " "{3} = (x seconds)",
+                    ).format(match.group(1), minutesString, secondsString),
+                )
             else:
                 self.__addManagementMessage(
                     self.tr("Whois"),
-                    self.tr(
-                        "{0} has been idle for %n second(s).", "",
-                        seconds).format(match.group(1)))
-            
+                    self.tr("{0} has been idle for %n second(s).", "", seconds).format(
+                        match.group(1)
+                    ),
+                )
+
             if not signonTime.isNull():
                 self.__addManagementMessage(
                     self.tr("Whois"),
                     self.tr("{0} has been online since {1}.").format(
-                        match.group(1),
-                        signonTime.toString("yyyy-MM-dd, hh:mm:ss")))
+                        match.group(1), signonTime.toString("yyyy-MM-dd, hh:mm:ss")
+                    ),
+                )
             return True
-        
+
         return False
-    
+
     def __whoIsEnd(self, match):
         """
         Private method to handle the end of WHOIS reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1901,16 +1988,16 @@
             self.__whoIsNick = ""
             self.__addManagementMessage(
                 self.tr("Whois"),
-                self.tr("End of WHOIS list for {0}.").format(
-                    match.group(1)))
+                self.tr("End of WHOIS list for {0}.").format(match.group(1)),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsIdentify(self, match):
         """
         Private method to handle the WHOIS identify and identified replies.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1919,16 +2006,16 @@
         if match.group(1) == self.__whoIsNick:
             self.__addManagementMessage(
                 self.tr("Whois"),
-                self.tr("{0} is an identified user.").format(
-                    match.group(1)))
+                self.tr("{0} is an identified user.").format(match.group(1)),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsHelper(self, match):
         """
         Private method to handle the WHOIS helper reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1937,16 +2024,16 @@
         if match.group(1) == self.__whoIsNick:
             self.__addManagementMessage(
                 self.tr("Whois"),
-                self.tr("{0} is available for help.").format(
-                    match.group(1)))
+                self.tr("{0} is available for help.").format(match.group(1)),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsAccount(self, match):
         """
         Private method to handle the WHOIS account reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1956,15 +2043,17 @@
             self.__addManagementMessage(
                 self.tr("Whois"),
                 self.tr("{0} is logged in as {1}.").format(
-                    match.group(1), match.group(2)))
+                    match.group(1), match.group(2)
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsActually(self, match):
         """
         Private method to handle the WHOIS actually reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1974,17 +2063,18 @@
         if match.group(1) == self.__whoIsNick:
             self.__addManagementMessage(
                 self.tr("Whois"),
-                self.tr(
-                    "{0} is actually using the host {1} (IP: {2}).").format(
-                    match.group(1), match.group(2), match.group(3)))
+                self.tr("{0} is actually using the host {1} (IP: {2}).").format(
+                    match.group(1), match.group(2), match.group(3)
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsSecure(self, match):
         """
         Private method to handle the WHOIS secure reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -1992,16 +2082,16 @@
         if match.group(1) == self.__whoIsNick:
             self.__addManagementMessage(
                 self.tr("Whois"),
-                self.tr("{0} is using a secure connection.").format(
-                    match.group(1)))
+                self.tr("{0} is using a secure connection.").format(match.group(1)),
+            )
             return True
-        
+
         return False
-    
+
     def __whoIsConnection(self, match):
         """
         Private method to handle the WHOIS connection reply.
-        
+
         @param match match object that matched the pattern
         @return flag indicating whether the message was handled (boolean)
         """
@@ -2012,11 +2102,13 @@
             self.__addManagementMessage(
                 self.tr("Whois"),
                 self.tr("{0} is connecting from {1} (IP: {2}).").format(
-                    match.group(1), match.group(2), match.group(3)))
+                    match.group(1), match.group(2), match.group(3)
+                ),
+            )
             return True
-        
+
         return False
-    
+
     def __setEditTopicButton(self):
         """
         Private method to set the visibility of the Edit Topic button.
@@ -2024,7 +2116,7 @@
         itm = self.__findUser(self.__userName)
         if itm:
             self.editTopicButton.setVisible(itm.canChangeTopic())
-    
+
     @pyqtSlot()
     def on_editTopicButton_clicked(self):
         """
@@ -2035,16 +2127,16 @@
             self.tr("Edit Channel Topic"),
             self.tr("Enter the topic for this channel:"),
             QLineEdit.EchoMode.Normal,
-            self.topicLabel.text())
+            self.topicLabel.text(),
+        )
         if ok and topic != "":
-            self.sendData.emit("TOPIC {0} :{1}".format(
-                self.__name, topic))
-    
+            self.sendData.emit("TOPIC {0} :{1}".format(self.__name, topic))
+
     @pyqtSlot(QUrl)
     def on_messages_anchorClicked(self, url):
         """
         Private slot to open links in the default browser.
-        
+
         @param url URL to be opened (QUrl)
         """
         QDesktopServices.openUrl(url)
--- a/src/eric7/Network/IRC/IrcIdentitiesEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcIdentitiesEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class implementing the identities management dialog.
     """
+
     def __init__(self, manager, identityName, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the IRC network manager object
             (IrcNetworkManager)
         @param identityName name of the identity to be selected (string)
@@ -37,7 +38,7 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.copyButton.setIcon(UI.PixmapCache.getIcon("editCopy"))
         self.renameButton.setIcon(UI.PixmapCache.getIcon("editRename"))
@@ -45,20 +46,18 @@
         self.nicknameAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.nicknameDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.nicknameUpButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
-        self.nicknameDownButton.setIcon(
-            UI.PixmapCache.getIcon("1downarrow"))
-        self.showPasswordButton.setIcon(
-            UI.PixmapCache.getIcon("showPassword"))
-        
+        self.nicknameDownButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
+        self.showPasswordButton.setIcon(UI.PixmapCache.getIcon("showPassword"))
+
         self.__manager = manager
-        
+
         self.__identities = self.__manager.getIdentities()
         self.__currentIdentity = None
-        
+
         identities = sorted(self.__manager.getIdentityNames())
-        identities[identities.index(IrcIdentity.DefaultIdentityName)] = (
-            IrcIdentity.DefaultIdentityDisplay
-        )
+        identities[
+            identities.index(IrcIdentity.DefaultIdentityName)
+        ] = IrcIdentity.DefaultIdentityDisplay
         self.identitiesCombo.addItems(identities)
         if identityName == IrcIdentity.DefaultIdentityName:
             identityName = IrcIdentity.DefaultIdentityDisplay
@@ -67,43 +66,44 @@
             index = 0
             identityName = self.identitiesCombo.itemText(0)
         self.identitiesCombo.setCurrentIndex(index)
-        
+
         self.on_identitiesCombo_currentIndexChanged(index)
-        
+
         self.nicknameEdit.installEventFilter(self)
-    
+
     def eventFilter(self, obj, evt):
         """
         Public method to handle events for other objects.
-        
+
         @param obj reference to the object (QObject)
         @param evt reference to the event (QEvent)
         @return flag indicating that the event should be filtered out (boolean)
         """
         if (
-            obj == self.nicknameEdit and
-            evt.type() == QEvent.Type.KeyPress and
-            evt.key() in [Qt.Key.Key_Enter, Qt.Key.Key_Return]
+            obj == self.nicknameEdit
+            and evt.type() == QEvent.Type.KeyPress
+            and evt.key() in [Qt.Key.Key_Enter, Qt.Key.Key_Return]
         ):
             self.on_nicknameAddButton_clicked()
             return True
-        
+
         return super().eventFilter(obj, evt)
 
     def __updateIdentitiesButtons(self):
         """
         Private slot to update the status of the identity related buttons.
         """
-        enable = (self.identitiesCombo.currentText() !=
-                  IrcIdentity.DefaultIdentityDisplay)
+        enable = (
+            self.identitiesCombo.currentText() != IrcIdentity.DefaultIdentityDisplay
+        )
         self.renameButton.setEnabled(enable)
         self.deleteButton.setEnabled(enable)
-    
+
     @pyqtSlot(int)
     def on_identitiesCombo_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of an identity.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -111,103 +111,111 @@
         if identity == IrcIdentity.DefaultIdentityDisplay:
             identity = IrcIdentity.DefaultIdentityName
         self.__updateIdentitiesButtons()
-        
+
         if self.__currentIdentity and not self.__checkCurrentIdentity():
             return
-        
+
         self.__refreshCurrentIdentity()
-        
+
         self.__currentIdentity = self.__identities[identity]
-        
+
         # General Tab
         self.realnameEdit.setText(self.__currentIdentity.getRealName())
         self.nicknamesList.clear()
         self.nicknamesList.addItems(self.__currentIdentity.getNickNames())
         self.serviceEdit.setText(self.__currentIdentity.getServiceName())
         self.passwordEdit.setText(self.__currentIdentity.getPassword())
-        
+
         # Away Tab
         self.rememberPosOnAwayCheckBox.setChecked(
-            self.__currentIdentity.rememberAwayPosition())
+            self.__currentIdentity.rememberAwayPosition()
+        )
         self.awayEdit.setText(self.__currentIdentity.getAwayMessage())
-        
+
         # Advanced Tab
         self.identEdit.setText(self.__currentIdentity.getIdent())
         self.quitEdit.setText(self.__currentIdentity.getQuitMessage())
         self.partEdit.setText(self.__currentIdentity.getPartMessage())
-        
+
         self.__updateIdentitiesButtons()
         self.__updateNicknameUpDownButtons()
         self.__updateNicknameButtons()
-        
+
         self.identityTabWidget.setCurrentIndex(0)
-    
+
     def __refreshCurrentIdentity(self):
         """
         Private method to read back the data for the current identity.
         """
         if self.__currentIdentity is None:
             return
-        
+
         # General Tab
         self.__currentIdentity.setRealName(self.realnameEdit.text())
         self.__currentIdentity.setNickNames(
-            [self.nicknamesList.item(row).text()
-             for row in range(self.nicknamesList.count())])
+            [
+                self.nicknamesList.item(row).text()
+                for row in range(self.nicknamesList.count())
+            ]
+        )
         self.__currentIdentity.setServiceName(self.serviceEdit.text())
         self.__currentIdentity.setPassword(self.passwordEdit.text())
-        
+
         # Away Tab
         self.__currentIdentity.setRememberAwayPosition(
-            self.rememberPosOnAwayCheckBox.isChecked())
+            self.rememberPosOnAwayCheckBox.isChecked()
+        )
         self.__currentIdentity.setAwayMessage(self.awayEdit.text())
-        
+
         # Advanced Tab
         self.__currentIdentity.setIdent(self.identEdit.text())
         self.__currentIdentity.setQuitMessage(self.quitEdit.text())
         self.__currentIdentity.setPartMessage(self.partEdit.text())
-    
+
     def __checkCurrentIdentity(self):
         """
         Private method to check the data for the current identity.
-        
+
         @return flag indicating a successful check (boolean)
         """
         if self.nicknamesList.count() == 0:
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Identity"),
-                self.tr(
-                    """The identity must contain at least one nick name."""))
+                self.tr("""The identity must contain at least one nick name."""),
+            )
             block = self.identitiesCombo.blockSignals(True)
             identity = self.__currentIdentity.getName()
             if identity == IrcIdentity.DefaultIdentityName:
                 identity = IrcIdentity.DefaultIdentityDisplay
             self.identitiesCombo.setCurrentIndex(
-                self.identitiesCombo.findText(identity))
+                self.identitiesCombo.findText(identity)
+            )
             self.identitiesCombo.blockSignals(block)
             self.identityTabWidget.setCurrentIndex(0)
             self.nicknameEdit.setFocus()
             return False
-        
+
         if not self.realnameEdit.text():
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Identity"),
-                self.tr("""The identity must have a real name."""))
+                self.tr("""The identity must have a real name."""),
+            )
             block = self.identitiesCombo.blockSignals(True)
             identity = self.__currentIdentity.getName()
             if identity == IrcIdentity.DefaultIdentityName:
                 identity = IrcIdentity.DefaultIdentityDisplay
             self.identitiesCombo.setCurrentIndex(
-                self.identitiesCombo.findText(identity))
+                self.identitiesCombo.findText(identity)
+            )
             self.identitiesCombo.blockSignals(block)
             self.identityTabWidget.setCurrentIndex(0)
             self.realnameEdit.setFocus()
             return False
-        
+
         return True
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -217,8 +225,9 @@
             self,
             self.tr("Add Identity"),
             self.tr("Identity Name:"),
-            QLineEdit.EchoMode.Normal)
-        
+            QLineEdit.EchoMode.Normal,
+        )
+
         if ok:
             if name:
                 if name in self.__identities:
@@ -227,8 +236,9 @@
                         self.tr("Add Identity"),
                         self.tr(
                             """An identity named <b>{0}</b> already exists."""
-                            """ You must provide a different name.""").format(
-                            name))
+                            """ You must provide a different name."""
+                        ).format(name),
+                    )
                     self.on_addButton_clicked()
                 else:
                     identity = IrcIdentity(name)
@@ -237,14 +247,16 @@
                     self.__identities[name] = identity
                     self.identitiesCombo.addItem(name)
                     self.identitiesCombo.setCurrentIndex(
-                        self.identitiesCombo.count() - 1)
+                        self.identitiesCombo.count() - 1
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Add Identity"),
-                    self.tr("""The identity has to have a name."""))
+                    self.tr("""The identity has to have a name."""),
+                )
                 self.on_addButton_clicked()
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -256,8 +268,9 @@
             self.tr("Copy Identity"),
             self.tr("Identity Name:"),
             QLineEdit.EchoMode.Normal,
-            currentIdentity)
-        
+            currentIdentity,
+        )
+
         if ok:
             if name:
                 if name in self.__identities:
@@ -266,8 +279,9 @@
                         self.tr("Copy Identity"),
                         self.tr(
                             """An identity named <b>{0}</b> already exists."""
-                            """ You must provide a different name.""").format(
-                            name))
+                            """ You must provide a different name."""
+                        ).format(name),
+                    )
                     self.on_copyButton_clicked()
                 else:
                     identity = copy.deepcopy(self.__currentIdentity)
@@ -275,14 +289,16 @@
                     self.__identities[name] = identity
                     self.identitiesCombo.addItem(name)
                     self.identitiesCombo.setCurrentIndex(
-                        self.identitiesCombo.count() - 1)
+                        self.identitiesCombo.count() - 1
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Copy Identity"),
-                    self.tr("""The identity has to have a name."""))
+                    self.tr("""The identity has to have a name."""),
+                )
                 self.on_copyButton_clicked()
-    
+
     @pyqtSlot()
     def on_renameButton_clicked(self):
         """
@@ -294,8 +310,9 @@
             self.tr("Rename Identity"),
             self.tr("Identity Name:"),
             QLineEdit.EchoMode.Normal,
-            currentIdentity)
-        
+            currentIdentity,
+        )
+
         if ok and name != currentIdentity:
             if name:
                 if name in self.__identities:
@@ -304,22 +321,25 @@
                         self.tr("Rename Identity"),
                         self.tr(
                             """An identity named <b>{0}</b> already exists."""
-                            """ You must provide a different name.""").format(
-                            name))
+                            """ You must provide a different name."""
+                        ).format(name),
+                    )
                     self.on_renameButton_clicked()
                 else:
                     del self.__identities[currentIdentity]
                     self.__currentIdentity.setName(name)
                     self.__identities[name] = self.__currentIdentity
                     self.identitiesCombo.setItemText(
-                        self.identitiesCombo.currentIndex(), name)
+                        self.identitiesCombo.currentIndex(), name
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Copy Identity"),
-                    self.tr("""The identity has to have a name."""))
+                    self.tr("""The identity has to have a name."""),
+                )
                 self.on_renameButton_clicked()
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -328,33 +348,36 @@
         currentIdentity = self.identitiesCombo.currentText()
         if currentIdentity == IrcIdentity.DefaultIdentityDisplay:
             return
-        
+
         inUse = False
         for networkName in self.__manager.getNetworkNames():
             inUse = (
-                self.__manager.getNetwork(networkName).getIdentityName() ==
-                currentIdentity)
+                self.__manager.getNetwork(networkName).getIdentityName()
+                == currentIdentity
+            )
             if inUse:
                 break
-        
+
         msg = (
-            self.tr("This identity is in use. If you remove it, the network"
-                    " settings using it will fall back to the default"
-                    " identity. Should it be deleted anyway?")
-            if inUse else
-            self.tr("Do you really want to delete all information for"
-                    " this identity?")
+            self.tr(
+                "This identity is in use. If you remove it, the network"
+                " settings using it will fall back to the default"
+                " identity. Should it be deleted anyway?"
+            )
+            if inUse
+            else self.tr(
+                "Do you really want to delete all information for" " this identity?"
+            )
         )
         res = EricMessageBox.yesNo(
-            self,
-            self.tr("Delete Identity"),
-            msg,
-            icon=EricMessageBox.Warning)
+            self, self.tr("Delete Identity"), msg, icon=EricMessageBox.Warning
+        )
         if res:
             del self.__identities[currentIdentity]
             self.identitiesCombo.removeItem(
-                self.identitiesCombo.findText(currentIdentity))
-    
+                self.identitiesCombo.findText(currentIdentity)
+            )
+
     def __updateNicknameUpDownButtons(self):
         """
         Private method to set the enabled state of the nick name up and
@@ -367,39 +390,37 @@
             if self.nicknamesList.currentRow() == 0:
                 self.nicknameUpButton.setEnabled(False)
                 self.nicknameDownButton.setEnabled(True)
-            elif (
-                self.nicknamesList.currentRow() ==
-                self.nicknamesList.count() - 1
-            ):
+            elif self.nicknamesList.currentRow() == self.nicknamesList.count() - 1:
                 self.nicknameUpButton.setEnabled(True)
                 self.nicknameDownButton.setEnabled(False)
             else:
                 self.nicknameUpButton.setEnabled(True)
                 self.nicknameDownButton.setEnabled(True)
-    
+
     def __updateNicknameButtons(self):
         """
         Private slot to update the nick name buttons except the up and
         down buttons.
         """
         self.nicknameDeleteButton.setEnabled(
-            len(self.nicknamesList.selectedItems()) != 0)
-        
+            len(self.nicknamesList.selectedItems()) != 0
+        )
+
         self.nicknameAddButton.setEnabled(self.nicknameEdit.text() != "")
-    
+
     @pyqtSlot(str)
     def on_nicknameEdit_textEdited(self, nick):
         """
         Private slot handling a change of the nick name.
-        
+
         @param nick new nick name (string)
         """
         sel = self.nicknamesList.selectedItems()
         if sel:
             sel[0].setText(nick)
-        
+
         self.__updateNicknameButtons()
-    
+
     @pyqtSlot()
     def on_nicknamesList_itemSelectionChanged(self):
         """
@@ -408,26 +429,27 @@
         items = self.nicknamesList.selectedItems()
         if items:
             self.nicknameEdit.setText(items[0].text())
-        
+
         self.__updateNicknameUpDownButtons()
         self.__updateNicknameButtons()
-        
+
         self.nicknameEdit.setFocus()
-    
+
     @pyqtSlot()
     def on_nicknameAddButton_clicked(self):
         """
         Private slot to add a new nickname.
         """
         nick = self.nicknameEdit.text()
-        if nick not in [self.nicknamesList.item(row).text()
-                        for row in range(self.nicknamesList.count())]:
+        if nick not in [
+            self.nicknamesList.item(row).text()
+            for row in range(self.nicknamesList.count())
+        ]:
             self.nicknamesList.insertItem(0, nick)
-        self.nicknamesList.setCurrentRow(
-            0, QItemSelectionModel.SelectionFlag.Clear)
+        self.nicknamesList.setCurrentRow(0, QItemSelectionModel.SelectionFlag.Clear)
         self.nicknameEdit.clear()
         self.__updateNicknameButtons()
-    
+
     @pyqtSlot()
     def on_nicknameDeleteButton_clicked(self):
         """
@@ -436,7 +458,7 @@
         itm = self.nicknamesList.takeItem(self.nicknamesList.currentRow())
         del itm
         self.__updateNicknameButtons()
-    
+
     @pyqtSlot()
     def on_nicknameUpButton_clicked(self):
         """
@@ -448,7 +470,7 @@
             row -= 1
             self.nicknamesList.insertItem(row, itm)
             self.nicknamesList.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_nicknameDownButton_clicked(self):
         """
@@ -460,36 +482,32 @@
             row += 1
             self.nicknamesList.insertItem(row, itm)
             self.nicknamesList.setCurrentItem(itm)
-    
+
     @pyqtSlot(bool)
     def on_showPasswordButton_clicked(self, checked):
         """
         Private slot to show or hide the password.
-        
+
         @param checked state of the button
         @type bool
         """
         if checked:
             self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Normal)
-            self.showPasswordButton.setIcon(
-                UI.PixmapCache.getIcon("hidePassword"))
-            self.showPasswordButton.setToolTip(
-                self.tr("Press to hide the password"))
+            self.showPasswordButton.setIcon(UI.PixmapCache.getIcon("hidePassword"))
+            self.showPasswordButton.setToolTip(self.tr("Press to hide the password"))
         else:
             self.passwordEdit.setEchoMode(QLineEdit.EchoMode.Password)
-            self.showPasswordButton.setIcon(
-                UI.PixmapCache.getIcon("showPassword"))
-            self.showPasswordButton.setToolTip(
-                self.tr("Press to show the password"))
-    
+            self.showPasswordButton.setIcon(UI.PixmapCache.getIcon("showPassword"))
+            self.showPasswordButton.setToolTip(self.tr("Press to show the password"))
+
     def accept(self):
         """
         Public slot handling the acceptance of the dialog.
         """
         if not self.__checkCurrentIdentity():
             return
-        
+
         self.__refreshCurrentIdentity()
         self.__manager.setIdentities(self.__identities)
-        
+
         super().accept()
--- a/src/eric7/Network/IRC/IrcMessageEdit.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcMessageEdit.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,36 +15,37 @@
     """
     Class implementing a specialized line edit for entering IRC messages.
     """
+
     MaxHistory = 100
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
-        self.__historyList = [""]   # initialize with one empty line
+
+        self.__historyList = [""]  # initialize with one empty line
         self.__historyLine = 0
-    
+
     def setText(self, text):
         """
         Public method to set the text.
-        
+
         Note: This reimplementation ensures, that the cursor is at the end of
         the text.
-        
+
         @param text text to be set (string)
         """
         super().setText(text)
         self.setCursorPosition(len(text))
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method implementing special key handling.
-        
+
         @param evt reference to the event (QKeyEvent)
         """
         key = evt.key()
@@ -60,13 +61,13 @@
         elif evt.text() == chr(21):
             # ^U: clear the text
             self.setText("")
-        
+
         super().keyPressEvent(evt)
-    
+
     def wheelEvent(self, evt):
         """
         Protected slot to support wheel events.
-        
+
         @param evt reference to the wheel event (QWheelEvent)
         """
         delta = evt.angleDelta().y()
@@ -74,38 +75,37 @@
             self.__getHistory(True)
         elif delta < 0:
             self.__getHistory(False)
-        
+
         super().wheelEvent(evt)
-    
+
     def __addHistory(self, txt):
         """
         Private method to add an entry to the history.
-        
+
         @param txt text to be added to the history (string)
         """
         # Only add the entry, if it is not the same as last time
-        if (
-            len(self.__historyList) == 1 or
-            (len(self.__historyList) > 1 and self.__historyList[1] != txt)
+        if len(self.__historyList) == 1 or (
+            len(self.__historyList) > 1 and self.__historyList[1] != txt
         ):
             # Replace empty first entry and add new empty first entry
             self.__historyList[0] = txt
             self.__historyList.insert(0, "")
             # Keep history below the defined limit
-            del self.__historyList[IrcMessageEdit.MaxHistory:]
-        
+            del self.__historyList[IrcMessageEdit.MaxHistory :]
+
         self.__historyLine = 0
-    
+
     def __getHistory(self, up):
         """
         Private method to move in the history.
-        
+
         @param up flag indicating the direction (boolean)
         """
         # preserve the current text, if it is not empty
         if self.text():
             self.__historyList[self.__historyLine] = self.text()
-        
+
         if up:
             self.__historyLine += 1
             # If the position was moved past the end of the history,
@@ -124,6 +124,6 @@
                 # If the position is not at the top of the history,
                 # decrement it
                 self.__historyLine -= 1
-        
+
         # replace the text of the line edit with the selected history entry
         self.setText(self.__historyList[self.__historyLine])
--- a/src/eric7/Network/IRC/IrcNetworkEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcNetworkEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     """
     Class implementing a dialog for editing IRC network definitions.
     """
+
     def __init__(self, manager, networkName, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the IRC network manager object
             (IrcNetworkManager)
         @param networkName name of the network to work on (string)
@@ -34,46 +35,42 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__manager = manager
-        
-        self.editIdentitiesButton.setIcon(
-            UI.PixmapCache.getIcon("ircConfigure"))
-        self.editServerButton.setIcon(
-            UI.PixmapCache.getIcon("ircConfigure"))
-        self.editChannelButton.setIcon(
-            UI.PixmapCache.getIcon("ircConfigure"))
+
+        self.editIdentitiesButton.setIcon(UI.PixmapCache.getIcon("ircConfigure"))
+        self.editServerButton.setIcon(UI.PixmapCache.getIcon("ircConfigure"))
+        self.editChannelButton.setIcon(UI.PixmapCache.getIcon("ircConfigure"))
         self.addChannelButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.deleteChannelButton.setIcon(UI.PixmapCache.getIcon("minus"))
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         if networkName:
-            self.__network = copy.deepcopy(
-                self.__manager.getNetwork(networkName))
+            self.__network = copy.deepcopy(self.__manager.getNetwork(networkName))
         else:
             from .IrcNetworkManager import IrcNetwork
+
             self.__network = IrcNetwork("")
-        
+
         # network name
         self.networkEdit.setText(networkName)
-        
+
         # identities
         self.__refreshIdentityCombo(self.__network.getIdentityName())
-        
+
         # server
         self.serverEdit.setText(self.__network.getServerName())
-        
+
         # channels
         for channelName in sorted(self.__network.getChannelNames()):
             channel = self.__network.getChannel(channelName)
             autoJoin = self.tr("Yes") if channel.autoJoin() else self.tr("No")
             QTreeWidgetItem(self.channelList, [channelName, autoJoin])
-        
+
         self.__updateOkButton()
         self.on_channelList_itemSelectionChanged()
-    
+
     def __updateOkButton(self):
         """
         Private method to update the OK button state.
@@ -81,31 +78,32 @@
         enable = True
         enable &= self.networkEdit.text() != ""
         enable &= self.serverEdit.text() != ""
-        
+
         self.__okButton.setEnabled(enable)
-    
+
     @pyqtSlot(str)
     def on_networkEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the network name.
-        
+
         @param txt text entered into the network name edit (string)
         """
         self.__updateOkButton()
-    
+
     def __refreshIdentityCombo(self, currentIdentity):
         """
         Private method to refresh the identity combo.
-        
+
         @param currentIdentity name of the identity to select (string)
         """
         self.identityCombo.clear()
-        
+
         from .IrcNetworkManager import IrcIdentity
+
         identities = sorted(self.__manager.getIdentityNames())
-        identities[identities.index(IrcIdentity.DefaultIdentityName)] = (
-            IrcIdentity.DefaultIdentityDisplay
-        )
+        identities[
+            identities.index(IrcIdentity.DefaultIdentityName)
+        ] = IrcIdentity.DefaultIdentityDisplay
         self.identityCombo.addItems(identities)
         if currentIdentity == IrcIdentity.DefaultIdentityName:
             currentIdentity = IrcIdentity.DefaultIdentityDisplay
@@ -113,59 +111,61 @@
         if index == -1:
             index = 0
         self.identityCombo.setCurrentIndex(index)
-    
+
     @pyqtSlot(str)
     def on_identityCombo_currentTextChanged(self, identity):
         """
         Private slot to handle the selection of an identity.
-        
+
         @param identity selected identity
         @type str
         """
         from .IrcNetworkManager import IrcIdentity
-        
+
         if identity == IrcIdentity.DefaultIdentityDisplay:
             identity = IrcIdentity.DefaultIdentityName
         self.__network.setIdentityName(identity)
-    
+
     @pyqtSlot()
     def on_editIdentitiesButton_clicked(self):
         """
         Private slot to edit the identities.
         """
         from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog
+
         currentIdentity = self.identityCombo.currentText()
         dlg = IrcIdentitiesEditDialog(self.__manager, currentIdentity, self)
         dlg.exec()
         self.__refreshIdentityCombo(currentIdentity)
-    
+
     @pyqtSlot(str)
     def on_serverEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the server name.
-        
+
         @param txt text entered into the server name edit (string)
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot()
     def on_editServerButton_clicked(self):
         """
         Private slot to edit the server configuration.
         """
         from .IrcServerEditDialog import IrcServerEditDialog
+
         dlg = IrcServerEditDialog(self.__network.getServer())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__network.setServer(dlg.getServer())
             self.serverEdit.setText(self.__network.getServerName())
-    
+
     @pyqtSlot()
     def on_addChannelButton_clicked(self):
         """
         Private slot to add a channel.
         """
         self.__editChannel(None)
-    
+
     @pyqtSlot()
     def on_editChannelButton_clicked(self):
         """
@@ -174,7 +174,7 @@
         itm = self.channelList.selectedItems()[0]
         if itm:
             self.__editChannel(itm)
-    
+
     @pyqtSlot()
     def on_deleteChannelButton_clicked(self):
         """
@@ -185,26 +185,27 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Channel"),
-                self.tr(
-                    """Do you really want to delete channel <b>{0}</b>?""")
-                .format(itm.text(0)))
+                self.tr("""Do you really want to delete channel <b>{0}</b>?""").format(
+                    itm.text(0)
+                ),
+            )
             if res:
                 self.__network.deleteChannel(itm.text(0))
-                
+
                 index = self.channelList.indexOfTopLevelItem(itm)
                 self.channelList.takeTopLevelItem(index)
                 del itm
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_channelList_itemActivated(self, item, column):
         """
         Private slot to handle the activation of a channel entry.
-        
+
         @param item reference to the activated item (QTreeWidgetItem)
         @param column column the activation occurred in (integer)
         """
         self.__editChannel(item)
-    
+
     @pyqtSlot()
     def on_channelList_itemSelectionChanged(self):
         """
@@ -214,11 +215,11 @@
         enable = bool(selectedItems)
         self.editChannelButton.setEnabled(enable)
         self.deleteChannelButton.setEnabled(enable)
-    
+
     def __editChannel(self, itm):
         """
         Private method to edit a channel.
-        
+
         @param itm reference to the item to be edited (QTreeWidgetItem)
         """
         if itm:
@@ -231,11 +232,13 @@
             name = ""
             key = ""
             autoJoin = False
-        
+
         from .IrcChannelEditDialog import IrcChannelEditDialog
+
         dlg = IrcChannelEditDialog(name, key, autoJoin, itm is not None, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             from .IrcNetworkManager import IrcChannel
+
             name, key, autoJoin = dlg.getData()
             channel = IrcChannel(name)
             channel.setKey(key)
@@ -253,11 +256,11 @@
                     autoJoinTxt = self.tr("No")
                 QTreeWidgetItem(self.channelList, [name, autoJoinTxt])
                 self.__network.addChannel(channel)
-    
+
     def getNetwork(self):
         """
         Public method to get the network object.
-        
+
         @return edited network object (IrcNetwork)
         """
         self.__network.setName(self.networkEdit.text())
--- a/src/eric7/Network/IRC/IrcNetworkListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcNetworkListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,18 +19,19 @@
     """
     Class implementing a dialog to list the configured IRC networks.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the IRC network manager (IrcNetworkManager)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__manager = manager
-        
+
         self.__refreshNetworksList()
 
     def __resizeColumns(self):
@@ -39,7 +40,7 @@
         """
         for col in range(self.networksList.columnCount()):
             self.networksList.resizeColumnToContents(col)
-    
+
     def __checkButtons(self):
         """
         Private slot to set the enabled state of the buttons.
@@ -51,89 +52,85 @@
         else:
             for itm in selectedItems:
                 enable &= itm.parent() is None
-        
+
         self.editButton.setEnabled(enable)
         self.deleteButton.setEnabled(enable)
         self.autoConnectButton.setEnabled(enable)
-        
+
         if enable:
             itm = self.networksList.selectedItems()[0]
             check = self.__manager.getNetwork(itm.text(0)).autoConnect()
             self.autoConnectButton.setChecked(check)
-    
+
     def __refreshNetworkEntry(self, itm):
         """
         Private method to (re-)set the data of a network entry.
-        
+
         @param itm reference to the network entry (QTreeWidgetItem)
         """
         # step 1: delete all child entries
         children = itm.takeChildren()
         for child in children:
             del child
-        
+
         # step 2: (re-)add the child entries
         from .IrcNetworkManager import IrcIdentity
+
         networkName = itm.text(0)
         network = self.__manager.getNetwork(networkName)
         server = network.getServer()
         identityName = network.getIdentityName()
         if identityName == IrcIdentity.DefaultIdentityName:
             identityName = IrcIdentity.DefaultIdentityDisplay
-        autoConnect = (
-            self.tr("Yes") if network.autoConnect() else self.tr("No")
-        )
-        
-        QTreeWidgetItem(
-            itm,
-            [self.tr("Identity"), identityName])
+        autoConnect = self.tr("Yes") if network.autoConnect() else self.tr("No")
+
+        QTreeWidgetItem(itm, [self.tr("Identity"), identityName])
         QTreeWidgetItem(
             itm,
-            [self.tr("Server"), "{0}:{1}".format(
-             server.getName(), server.getPort())])
-        QTreeWidgetItem(
-            itm,
-            [self.tr("Channels"), ", ".join(network.getChannelNames())])
+            [self.tr("Server"), "{0}:{1}".format(server.getName(), server.getPort())],
+        )
         QTreeWidgetItem(
-            itm,
-            [self.tr("Auto-Connect"), autoConnect])
-        
+            itm, [self.tr("Channels"), ", ".join(network.getChannelNames())]
+        )
+        QTreeWidgetItem(itm, [self.tr("Auto-Connect"), autoConnect])
+
         self.__resizeColumns()
-    
+
     def __refreshNetworksList(self):
         """
         Private method to refresh the complete networks list.
         """
         self.networksList.clear()
-        
+
         networkNames = self.__manager.getNetworkNames()
         for networkName in networkNames:
             topitm = QTreeWidgetItem(self.networksList, [networkName])
             self.__refreshNetworkEntry(topitm)
             topitm.setExpanded(True)
         self.__resizeColumns()
-        
+
         self.__checkButtons()
-    
+
     @pyqtSlot()
     def on_networksList_itemSelectionChanged(self):
         """
         Private slot to handle changes of the selection of networks.
         """
         self.__checkButtons()
-    
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
         Private slot to add a new network entry.
         """
         from .IrcNetworkEditDialog import IrcNetworkEditDialog
+
         dlg = IrcNetworkEditDialog(self.__manager, "", self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             network = dlg.getNetwork()
             self.__manager.addNetwork(network)
             self.__refreshNetworksList()
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -142,6 +139,7 @@
         itm = self.networksList.selectedItems()[0]
         if itm:
             from .IrcNetworkEditDialog import IrcNetworkEditDialog
+
             networkName = itm.text(0)
             dlg = IrcNetworkEditDialog(self.__manager, networkName, self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -150,7 +148,7 @@
                 if network.getName() != networkName:
                     itm.setText(0, network.getName())
                 self.__refreshNetworkEntry(itm)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -163,38 +161,39 @@
                 self,
                 self.tr("Delete Irc Network"),
                 self.tr(
-                    """Do you really want to delete IRC network <b>{0}</b>?""")
-                .format(networkName))
+                    """Do you really want to delete IRC network <b>{0}</b>?"""
+                ).format(networkName),
+            )
             if res:
                 index = self.networksList.indexOfTopLevelItem(itm)
                 self.networksList.takeTopLevelItem(index)
                 del itm
-                
+
                 self.__manager.deleteNetwork(networkName)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_networksList_itemExpanded(self, item):
         """
         Private slot handling the expansion of a top level item.
-        
+
         @param item reference to the expanded item (QTreeWidgetItem)
         """
         self.__resizeColumns()
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_networksList_itemCollapsed(self, item):
         """
         Private slot handling the collapse of a top level item.
-        
+
         @param item reference to the collapsed item (QTreeWidgetItem)
         """
         self.__resizeColumns()
-    
+
     @pyqtSlot(bool)
     def on_autoConnectButton_clicked(self, checked):
         """
         Private slot handling the auto-connect selection.
-        
+
         @param checked flag indicating the state of the button (boolean)
         """
         itm = self.networksList.selectedItems()[0]
@@ -210,7 +209,7 @@
                     else:
                         network.setAutoConnect(False)
                     self.__manager.networkChanged()
-                
+
                 # step 2: update list entries
                 for index in range(self.networksList.topLevelItemCount()):
                     titm = self.networksList.topLevelItem(index)
@@ -223,14 +222,14 @@
                 network = self.__manager.getNetwork(networkName)
                 network.setAutoConnect(False)
                 self.__manager.networkChanged()
-                
+
                 # step 2: update list entry
                 self.__setAutoConnectEntry(itm, False)
-    
+
     def __setAutoConnectEntry(self, itm, on):
         """
         Private method to set the auto-connect entry of a network item.
-        
+
         @param itm reference to the network item (QTreeWidgetItem)
         @param on flag indicating the auto-connect state (boolean)
         """
@@ -239,19 +238,19 @@
             citm = itm.child(index)
             if citm.text(0) == self.tr("Auto-Connect"):
                 citm.setText(1, autoConnect)
-    
+
     @pyqtSlot()
     def on_editIdentitiesButton_clicked(self):
         """
         Private slot to edit the identities.
         """
         from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog
+
         dlg = IrcIdentitiesEditDialog(self.__manager, "", self)
         dlg.exec()
-        
+
         selectedNetwork = self.networksList.selectedItems()
-        selectedNetworkName = (
-            selectedNetwork[0].text(0) if selectedNetwork else "")
+        selectedNetworkName = selectedNetwork[0].text(0) if selectedNetwork else ""
         self.__refreshNetworksList()
         if selectedNetworkName:
             for index in range(self.networksList.topLevelItemCount()):
--- a/src/eric7/Network/IRC/IrcNetworkManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcNetworkManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,42 +21,41 @@
     """
     Class implementing the IRC identity object.
     """
+
     DefaultIdentityName = "0default"
     DefaultIdentityDisplay = QCoreApplication.translate(
-        "IrcIdentity", "Default Identity")
-    
-    DefaultAwayMessage = QCoreApplication.translate(
-        "IrcIdentity", "Gone away for now.")
-    DefaultQuitMessage = QCoreApplication.translate(
-        "IrcIdentity", "IRC for eric IDE")
-    DefaultPartMessage = QCoreApplication.translate(
-        "IrcIdentity", "IRC for eric IDE")
-    
+        "IrcIdentity", "Default Identity"
+    )
+
+    DefaultAwayMessage = QCoreApplication.translate("IrcIdentity", "Gone away for now.")
+    DefaultQuitMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE")
+    DefaultPartMessage = QCoreApplication.translate("IrcIdentity", "IRC for eric IDE")
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the identity (string)
         """
         super().__init__()
-        
+
         self.__name = name
         self.__realName = ""
         self.__nickNames = []
         self.__serviceName = ""
         self.__password = ""
         self.__ident = Utilities.getUserName()
-        
+
         self.__rememberPosOnAway = True
         self.__awayMessage = IrcIdentity.DefaultAwayMessage
-        
+
         self.__quitMessage = IrcIdentity.DefaultQuitMessage
         self.__partMessage = IrcIdentity.DefaultPartMessage
-    
+
     def save(self, settings):
         """
         Public method to save the identity data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         # no need to save the name because that is the group key
@@ -69,11 +68,11 @@
         settings.setValue("PartMessage", self.__partMessage)
         settings.setValue("RememberAwayPosition", self.__rememberPosOnAway)
         settings.setValue("AwayMessage", self.__awayMessage)
-    
+
     def load(self, settings):
         """
         Public method to load the identity data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         self.__ident = settings.value("Ident", Utilities.getUserName())
@@ -82,191 +81,195 @@
         self.__serviceName = settings.value("ServiceName", "")
         self.__password = settings.value("Password", "")
         self.__quitMessage = settings.value(
-            "QuitMessage", IrcIdentity.DefaultQuitMessage)
+            "QuitMessage", IrcIdentity.DefaultQuitMessage
+        )
         self.__partMessage = settings.value(
-            "PartMessage", IrcIdentity.DefaultPartMessage)
+            "PartMessage", IrcIdentity.DefaultPartMessage
+        )
         self.__rememberPosOnAway = Preferences.toBool(
-            settings.value("RememberAwayPosition", True))
+            settings.value("RememberAwayPosition", True)
+        )
         self.__awayMessage = settings.value(
-            "AwayMessage", IrcIdentity.DefaultAwayMessage)
-    
+            "AwayMessage", IrcIdentity.DefaultAwayMessage
+        )
+
     def setName(self, name):
         """
         Public method to set the identity name.
-        
+
         @param name identity name (string)
         """
         self.__name = name
-    
+
     def getName(self):
         """
         Public method to get the identity name.
-        
+
         @return identity name (string)
         """
         return self.__name
-    
+
     def setIdent(self, name):
         """
         Public method to set the real identity name.
-        
+
         @param name real identity name (string)
         """
         self.__ident = name
-    
+
     def getIdent(self):
         """
         Public method to get the real identity name.
-        
+
         @return real identity name (string)
         """
         return self.__ident
-    
+
     def setRealName(self, name):
         """
         Public method to set the real name of the identity.
-        
+
         @param name real name (string)
         """
         self.__realName = name
-    
+
     def getRealName(self):
         """
         Public method to get the real name.
-        
+
         @return real name (string)
         """
         return self.__realName
-    
+
     def setNickNames(self, names):
         """
         Public method to set the nick names of the identity.
-        
+
         @param names nick names (list of string)
         """
         self.__nickNames = names[:]
-    
+
     def getNickNames(self):
         """
         Public method to get the nick names.
-        
+
         @return nick names (list of string)
         """
         return self.__nickNames
-    
+
     def setServiceName(self, name):
         """
         Public method to set the service name of the identity used for
         identification.
-        
+
         @param name service name (string)
         """
         self.__serviceName = name
-    
+
     def getServiceName(self):
         """
         Public method to get the service name of the identity used for
         identification.
-        
+
         @return service name (string)
         """
         return self.__serviceName
-    
+
     def setPassword(self, password):
         """
         Public method to set a new password.
-        
+
         @param password password to set (string)
         """
         self.__password = pwConvert(password, encode=True)
-    
+
     def getPassword(self):
         """
         Public method to get the password.
-        
+
         @return password (string)
         """
         return pwConvert(self.__password, encode=False)
-    
+
     def setQuitMessage(self, message):
         """
         Public method to set the QUIT message.
-        
+
         @param message QUIT message (string)
         """
         if message:
             self.__quitMessage = message
         else:
             self.__quitMessage = IrcIdentity.DefaultQuitMessage
-    
+
     def getQuitMessage(self):
         """
         Public method to get the QUIT message.
-        
+
         @return QUIT message (string)
         """
         return self.__quitMessage
-    
+
     def setPartMessage(self, message):
         """
         Public method to set the PART message.
-        
+
         @param message PART message (string)
         """
         if message:
             self.__partMessage = message
         else:
             self.__partMessage = IrcIdentity.DefaultPartMessage
-    
+
     def getPartMessage(self):
         """
         Public method to get the PART message.
-        
+
         @return PART message (string)
         """
         return self.__partMessage
-    
+
     def setRememberAwayPosition(self, remember):
         """
         Public method to set to remember the chat position upon AWAY.
-        
+
         @param remember flag indicating to remember the chat position (boolean)
         """
         self.__rememberPosOnAway = remember
-    
+
     def rememberAwayPosition(self):
         """
         Public method to get a flag indicating to remember the chat position
         upon AWAY.
-        
+
         @return flag indicating to remember the chat position (boolean)
         """
         return self.__rememberPosOnAway
-    
+
     def setAwayMessage(self, message):
         """
         Public method to set the AWAY message.
-        
+
         @param message AWAY message (string)
         """
         if message:
             self.__awayMessage = message
         else:
             self.__awayMessage = IrcIdentity.DefaultAwayMessage
-    
+
     def getAwayMessage(self):
         """
         Public method to get the AWAY message.
-        
+
         @return AWAY message (string)
         """
         return self.__awayMessage
-    
+
     @classmethod
     def createDefaultIdentity(cls):
         """
         Class method to create the default identity.
-        
+
         @return default identity (IrcIdentity)
         """
         userName = Utilities.getUserName()
@@ -284,104 +287,105 @@
     """
     Class implementing the IRC identity object.
     """
+
     DefaultPort = 6667
     DefaultSslPort = 6697
-    
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the server (string)
         """
         super().__init__()
-        
+
         self.__server = name
         self.__port = IrcServer.DefaultPort
         self.__ssl = False
         self.__password = ""
-    
+
     def save(self, settings):
         """
         Public method to save the server data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         settings.setValue("Name", self.__server)
         settings.setValue("Port", self.__port)
         settings.setValue("SSL", self.__ssl)
         settings.setValue("Password", self.__password)
-    
+
     def load(self, settings):
         """
         Public method to load the server data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         self.__server = settings.value("Name", "")
         self.__port = int(settings.value("Port", IrcServer.DefaultPort))
         self.__ssl = Preferences.toBool(settings.value("SSL", False))
         self.__password = settings.value("Password", "")
-    
+
     def getName(self):
         """
         Public method to get the server name.
-        
+
         @return server name (string)
         """
         return self.__server
-    
+
     def setName(self, name):
         """
         Public method to set the server name.
-        
+
         @param name server name (string)
         """
         self.__server = name
-    
+
     def getPort(self):
         """
         Public method to get the server port number.
-        
+
         @return port number (integer)
         """
         return self.__port
-    
+
     def setPort(self, port):
         """
         Public method to set the server port number.
-        
+
         @param port server port number (integer)
         """
         self.__port = port
-    
+
     def useSSL(self):
         """
         Public method to check for SSL usage.
-        
+
         @return flag indicating SSL usage (boolean)
         """
         return self.__ssl
-    
+
     def setUseSSL(self, on):
         """
         Public method to set the SSL usage.
-        
+
         @param on flag indicating SSL usage (boolean)
         """
         self.__ssl = on
-    
+
     def setPassword(self, password):
         """
         Public method to set a new password.
-        
+
         @param password password to set (string)
         """
         self.__password = pwConvert(password, encode=True)
-    
+
     def getPassword(self):
         """
         Public method to get the password.
-        
+
         @return password (string)
         """
         return pwConvert(self.__password, encode=False)
@@ -391,74 +395,75 @@
     """
     Class implementing the IRC channel object.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the network (string)
         """
         super().__init__()
-        
+
         self.__name = name
         self.__key = ""
         self.__autoJoin = False
-    
+
     def save(self, settings):
         """
         Public method to save the channel data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         # no need to save the channel name because that is the group key
         settings.setValue("Key", self.__key)
         settings.setValue("AutoJoin", self.__autoJoin)
-    
+
     def load(self, settings):
         """
         Public method to load the network data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         self.__key = settings.value("Key", "")
         self.__autoJoin = Preferences.toBool(settings.value("AutoJoin", False))
-    
+
     def getName(self):
         """
         Public method to get the channel name.
-        
+
         @return channel name (string)
         """
         return self.__name
-    
+
     def setKey(self, key):
         """
         Public method to set a new channel key.
-        
+
         @param key channel key to set (string)
         """
         self.__key = pwConvert(key, encode=True)
-    
+
     def getKey(self):
         """
         Public method to get the channel key.
-        
+
         @return channel key (string)
         """
         return pwConvert(self.__key, encode=False)
-    
+
     def autoJoin(self):
         """
         Public method to check the auto join status.
-        
+
         @return flag indicating if the channel should be
             joined automatically (boolean)
         """
         return self.__autoJoin
-    
+
     def setAutoJoin(self, enable):
         """
         Public method to set the auto join status of the channel.
-        
+
         @param enable flag indicating if the channel should be
             joined automatically (boolean)
         """
@@ -469,56 +474,56 @@
     """
     Class implementing the IRC network object.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the network (string)
         """
         super().__init__()
-        
+
         self.__name = name
         self.__identity = ""
         self.__server = None
         self.__channels = {}
         self.__autoConnect = False
-    
+
     def save(self, settings):
         """
         Public method to save the network data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         # no need to save the network name because that is the group key
         settings.setValue("Identity", self.__identity)
         settings.setValue("AutoConnect", self.__autoConnect)
-        
+
         settings.beginGroup("Server")
         self.__server.save(settings)
         settings.endGroup()
-        
+
         settings.beginGroup("Channels")
         for key in self.__channels:
             settings.beginGroup(key)
             self.__channels[key].save(settings)
             settings.endGroup()
         settings.endGroup()
-    
+
     def load(self, settings):
         """
         Public method to load the network data.
-        
+
         @param settings reference to the settings object (QSettings)
         """
         self.__identity = settings.value("Identity", "")
-        self.__autoConnect = Preferences.toBool(
-            settings.value("AutoConnect", False))
-        
+        self.__autoConnect = Preferences.toBool(settings.value("AutoConnect", False))
+
         settings.beginGroup("Server")
         self.__server = IrcServer("")
         self.__server.load(settings)
         settings.endGroup()
-        
+
         settings.beginGroup("Channels")
         for key in settings.childGroups():
             self.__channels[key] = IrcChannel(key)
@@ -526,96 +531,96 @@
             self.__channels[key].load(settings)
             settings.endGroup()
         settings.endGroup()
-    
+
     def setName(self, name):
         """
         Public method to set the network name.
-        
+
         @param name network name (string)
         """
         self.__name = name
-    
+
     def getName(self):
         """
         Public method to get the network name.
-        
+
         @return network name (string)
         """
         return self.__name
-    
+
     def setIdentityName(self, name):
         """
         Public method to set the name of the identity.
-        
+
         @param name identity name (string)
         """
         self.__identity = name
-    
+
     def getIdentityName(self):
         """
         Public method to get the name of the identity.
-        
+
         @return identity name (string)
         """
         return self.__identity
-    
+
     def getServerName(self):
         """
         Public method to get the server name.
-        
+
         @return server name (string)
         """
         if self.__server:
             return self.__server.getName()
         else:
             return ""
-    
+
     def getServer(self):
         """
         Public method to get the server object.
-        
+
         @return reference to the server (IrcServer)
         """
         return self.__server
-    
+
     def setServer(self, server):
         """
         Public method to set the server.
-        
+
         @param server server object to set (IrcServer)
         """
         self.__server = server
-    
+
     def setChannels(self, channels):
         """
         Public method to set the list of channels.
-        
+
         @param channels list of channels for the network (list of IrcChannel)
         """
         self.__channels = {}
         for channel in channels:
             self.__channels[channel.getName()] = channel
-    
+
     def getChannels(self):
         """
         Public method to get the channels.
-        
+
         @return list of channels for the network (list of IrcChannel)
         """
         return list(copy.deepcopy(self.__channels).values())
-    
+
     def getChannelNames(self):
         """
         Public method to get the list of channels.
-        
+
         @return list of channel names (list of string)
         """
         return sorted(self.__channels.keys())
-    
+
     def getChannel(self, channelName):
         """
         Public method to get a channel.
-        
+
         @param channelName name of the channel to retrieve (string)
         @return reference to the channel (IrcChannel)
         """
@@ -623,58 +628,58 @@
             return self.__channels[channelName]
         else:
             return None
-    
+
     def setChannel(self, channel):
         """
         Public method to set a channel.
-        
+
         @param channel channel object to set (IrcChannel)
         """
         channelName = channel.getName()
         if channelName in self.__channels:
             self.__channels[channelName] = channel
-    
+
     def addChannel(self, channel):
         """
         Public method to add a channel.
-        
+
         @param channel channel object to add (IrcChannel)
         """
         channelName = channel.getName()
         if channelName not in self.__channels:
             self.__channels[channelName] = channel
-    
+
     def deleteChannel(self, channelName):
         """
         Public method to delete the given channel.
-        
+
         @param channelName name of the channel to be deleted (string)
         """
         if channelName in self.__channels:
             del self.__channels[channelName]
-    
+
     def setAutoConnect(self, enable):
         """
         Public method to set the auto connect flag.
-        
+
         @param enable flag indicate to connect to the network at start-up.
         """
         self.__autoConnect = enable
-    
+
     def autoConnect(self):
         """
         Public method to check, if the network should be connected to at
         start-up.
-        
+
         @return flag indicating an auto connect (boolean)
         """
         return self.__autoConnect
-    
+
     @classmethod
     def createDefaultNetwork(cls, ssl=False):
         """
         Class method to create the default network.
-        
+
         @param ssl flag indicating to create a SSL network configuration
             (boolean)
         @return default network object (IrcNetwork)
@@ -683,7 +688,7 @@
         networkName = "libera.chat (SSL)" if ssl else "libera.chat"
         network = IrcNetwork(networkName)
         network.setIdentityName(IrcIdentity.DefaultIdentityName)
-        
+
         # server
         serverName = "irc.libera.chat"
         server = IrcServer(serverName)
@@ -693,64 +698,65 @@
         else:
             server.setPort(IrcServer.DefaultPort)
         network.setServer(server)
-        
+
         # channel
         channel = IrcChannel("#eric-ide")
         channel.setAutoJoin(False)
         network.addChannel(channel)
-        
+
         # auto connect
         network.setAutoConnect(False)
-        
+
         return network
 
 
 class IrcNetworkManager(QObject):
     """
     Class implementing the IRC identity object.
-    
+
     @signal dataChanged() emitted after some data has changed
     @signal networksChanged() emitted after a network object has changed
     @signal identitiesChanged() emitted after an identity object has changed
     """
+
     dataChanged = pyqtSignal()
     networksChanged = pyqtSignal()
     identitiesChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.__settings = Preferences.getSettings()
-        
+
         self.__networks = {}
         self.__identities = {}
-        
+
         self.dataChanged.connect(self.__saveTimer.changeOccurred)
-    
+
     def close(self):
         """
         Public method to close the open search engines manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def save(self):
         """
         Public slot to save the IRC data.
         """
         if not self.__loaded:
             return
-        
+
         # save IRC data
         self.__settings.beginGroup("IRC")
-        
+
         # identities
         self.__settings.remove("Identities")
         self.__settings.beginGroup("Identities")
@@ -759,7 +765,7 @@
             self.__identities[key].save(self.__settings)
             self.__settings.endGroup()
         self.__settings.endGroup()
-        
+
         # networks
         self.__settings.remove("Networks")
         self.__settings.beginGroup("Networks")
@@ -768,19 +774,19 @@
             self.__networks[key].save(self.__settings)
             self.__settings.endGroup()
         self.__settings.endGroup()
-        
+
         self.__settings.endGroup()
-    
+
     def __load(self):
         """
         Private slot to load the IRC data.
         """
         if self.__loaded:
             return
-        
+
         # load IRC data
         self.__settings.beginGroup("IRC")
-        
+
         # identities
         self.__settings.beginGroup("Identities")
         for key in self.__settings.childGroups():
@@ -789,7 +795,7 @@
             self.__identities[key].load(self.__settings)
             self.__settings.endGroup()
         self.__settings.endGroup()
-        
+
         # networks
         self.__settings.beginGroup("Networks")
         for key in self.__settings.childGroups():
@@ -798,49 +804,49 @@
             self.__networks[key].load(self.__settings)
             self.__settings.endGroup()
         self.__settings.endGroup()
-        
+
         self.__settings.endGroup()
-        
+
         if not self.__identities or not self.__networks:
             # data structures got corrupted; load defaults
             self.__loadDefaults()
-        
+
         if IrcIdentity.DefaultIdentityName not in self.__identities:
             self.__loadDefaults(identityOnly=True)
-        
+
         self.__loaded = True
-    
+
     def __loadDefaults(self, identityOnly=False):
         """
         Private method to load default values.
-        
+
         @param identityOnly flag indicating to just load the default
             identity (boolean)
         """
         if not identityOnly:
             self.__networks = {}
             self.__identities = {}
-        
+
         # identity
         identity = IrcIdentity.createDefaultIdentity()
         self.__identities[identity.getName()] = identity
-        
+
         if not identityOnly:
             network = IrcNetwork.createDefaultNetwork()
             self.__networks[network.getName()] = network
             network = IrcNetwork.createDefaultNetwork(True)
             self.__networks[network.getName()] = network
-        
+
         self.dataChanged.emit()
-    
+
     ##################################################################
     ## Identity related methods below
     ##################################################################
-    
+
     def getIdentity(self, name, create=False):
         """
         Public method to get an identity object.
-        
+
         @param name name of the identity to get (string)
         @param create flag indicating to create a new object,
             if none exists (boolean)
@@ -848,123 +854,120 @@
         """
         if not name:
             return None
-        
+
         if not self.__loaded:
             self.__load()
-        
+
         if name in self.__identities:
             return self.__identities[name]
         elif create:
             ircId = IrcIdentity(name)
             self.__identities[name] = ircId
-            
+
             self.dataChanged.emit()
-            
+
             return ircId
         else:
             return None
-    
+
     def getIdentities(self):
         """
         Public method to get a copy of all identities.
-        
+
         @return dictionary of all identities (dict of IrcIdentity)
         """
         return copy.deepcopy(self.__identities)
-    
+
     def setIdentities(self, identities):
         """
         Public method to set the identities.
-        
+
         @param identities dictionary of all identities (dict of IrcIdentity)
         """
         self.__identities = copy.deepcopy(identities)
         self.identityChanged()
-        
+
         # Check all networks, if the identity they use is still available.
         # If it isn't, change them to use the default identity.
         for network in self.__networks.values():
             if network.getIdentityName() not in self.__identities:
                 network.setIdentityName(IrcIdentity.DefaultIdentityName)
-    
+
     def getIdentityNames(self):
         """
         Public method to get the names of all identities.
-        
+
         @return names of all identities (list of string)
         """
         return list(self.__identities.keys())
-    
+
     def addIdentity(self, identity):
         """
         Public method to add a new identity.
-        
+
         @param identity reference to the identity to add (IrcIdentity)
         """
         name = identity.getName()
         self.__identities[name] = identity
         self.identityChanged()
-    
+
     def deleteIdentity(self, name):
         """
         Public method to delete the given identity.
-        
+
         @param name name of the identity to delete (string)
         """
-        if (
-            name in self.__identities and
-            name != IrcIdentity.DefaultIdentityName
-        ):
+        if name in self.__identities and name != IrcIdentity.DefaultIdentityName:
             del self.__identities[name]
             self.identityChanged()
-    
+
     def renameIdentity(self, oldName, newName):
         """
         Public method to rename an identity.
-        
+
         @param oldName old name of the identity (string)
         @param newName new name of the identity (string)
         """
         if oldName in self.__identities:
             self.__identities[newName] = self.__identities[oldName]
             del self.__identities[oldName]
-            
+
             for network in self.__networks:
                 if network.getIdentityName() == oldName:
                     network.setIdentityName(newName)
-            
+
             self.identityChanged()
-    
+
     def identityChanged(self):
         """
         Public method to indicate a change of an identity object.
         """
         self.dataChanged.emit()
         self.identitiesChanged.emit()
-    
+
     ##################################################################
     ## Network related methods below
     ##################################################################
-    
+
     def getNetwork(self, name):
         """
         Public method to get a network object.
-        
+
         @param name name of the network (string)
         @return reference to the network object (IrcNetwork)
         """
         if not self.__loaded:
             self.__load()
-        
+
         if name in self.__networks:
             return self.__networks[name]
         else:
             return None
-    
+
     def setNetwork(self, network, networkName=""):
         """
         Public method to set a network.
-        
+
         @param network network object to set (IrcNetwork)
         @param networkName name the network was known for (string)
         """
@@ -976,42 +979,42 @@
         elif name in self.__networks:
             self.__networks[name] = network
             self.networkChanged()
-    
+
     def addNetwork(self, network):
         """
         Public method to add a network.
-        
+
         @param network network object to add (IrcNetwork)
         """
         name = network.getName()
         if name not in self.__networks:
             self.__networks[name] = network
             self.networkChanged()
-    
+
     def deleteNetwork(self, name):
         """
         Public method to delete the given network.
-        
+
         @param name name of the network to delete (string)
         """
         if name in self.__networks:
             del self.__networks[name]
             self.networkChanged()
-    
+
     def networkChanged(self):
         """
         Public method to indicate a change of a network object.
         """
         self.dataChanged.emit()
         self.networksChanged.emit()
-    
+
     def getNetworkNames(self):
         """
         Public method to get a list of all known network names.
-        
+
         @return list of network names (list of string)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return sorted(self.__networks.keys())
--- a/src/eric7/Network/IRC/IrcNetworkWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcNetworkWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,7 +28,7 @@
 class IrcNetworkWidget(QWidget, Ui_IrcNetworkWidget):
     """
     Class implementing the network part of the IRC widget.
-    
+
     @signal connectNetwork(str,bool,bool) emitted to connect or disconnect from
         a network
     @signal editNetwork(str) emitted to edit a network configuration
@@ -38,6 +38,7 @@
     @signal away(bool) emitted to indicate the away status
     @signal autoConnected() emitted after an automatic connection was initiated
     """
+
     connectNetwork = pyqtSignal(str, bool, bool)
     editNetwork = pyqtSignal(str)
     joinChannel = pyqtSignal(str)
@@ -45,52 +46,52 @@
     sendData = pyqtSignal(str)
     away = pyqtSignal(bool)
     autoConnected = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.connectButton.setIcon(UI.PixmapCache.getIcon("ircConnect"))
         self.editButton.setIcon(UI.PixmapCache.getIcon("ircConfigure"))
         self.joinButton.setIcon(UI.PixmapCache.getIcon("ircJoinChannel"))
         self.awayButton.setIcon(UI.PixmapCache.getIcon("ircUserPresent"))
-        
+
         self.joinButton.setEnabled(False)
         self.nickCombo.setEnabled(False)
         self.awayButton.setEnabled(False)
-        
-        self.channelCombo.lineEdit().returnPressed.connect(
-            self.on_joinButton_clicked)
+
+        self.channelCombo.lineEdit().returnPressed.connect(self.on_joinButton_clicked)
         self.nickCombo.lineEdit().returnPressed.connect(
-            self.on_nickCombo_currentIndexChanged)
-        
+            self.on_nickCombo_currentIndexChanged
+        )
+
         self.setConnected(False)
-        
+
         self.__initMessagesMenu()
-        
+
         self.__manager = None
         self.__connected = False
         self.__registered = False
         self.__away = False
-    
+
     def initialize(self, manager):
         """
         Public method to initialize the widget.
-        
+
         @param manager reference to the network manager (IrcNetworkManager)
         """
         self.__manager = manager
-        
+
         self.networkCombo.addItems(self.__manager.getNetworkNames())
-        
+
         self.__manager.networksChanged.connect(self.__refreshNetworks)
         self.__manager.identitiesChanged.connect(self.__refreshNetworks)
-    
+
     def autoConnect(self):
         """
         Public method to perform the IRC auto connection.
@@ -101,7 +102,7 @@
         userInterface.onlineStateChanged.connect(self.__onlineStateChanged)
         if online:
             self.__autoConnect()
-    
+
     def __autoConnect(self):
         """
         Private method to perform the IRC auto connection.
@@ -113,12 +114,12 @@
                 self.on_connectButton_clicked()
                 self.autoConnected.emit()
                 break
-    
+
     @pyqtSlot(bool)
     def __onlineStateChanged(self, online):
         """
         Private slot handling online state changes.
-        
+
         @param online online state
         @type bool
         """
@@ -131,7 +132,7 @@
         else:
             network = self.networkCombo.currentText()
             self.connectNetwork.emit(network, online, True)
-    
+
     @pyqtSlot()
     def __refreshNetworks(self):
         """
@@ -152,7 +153,7 @@
         self.nickCombo.setEditText(currentNick)
         self.nickCombo.blockSignals(blocked)
         self.channelCombo.setEditText(currentChannel)
-    
+
     @pyqtSlot()
     def on_connectButton_clicked(self):
         """
@@ -160,7 +161,7 @@
         """
         network = self.networkCombo.currentText()
         self.connectNetwork.emit(network, not self.__connected, False)
-    
+
     @pyqtSlot()
     def on_awayButton_clicked(self):
         """
@@ -170,21 +171,19 @@
             self.handleAwayCommand("")
         else:
             networkName = self.networkCombo.currentText()
-            identityName = (
-                self.__manager.getNetwork(networkName).getIdentityName()
-            )
+            identityName = self.__manager.getNetwork(networkName).getIdentityName()
             identity = self.__manager.getIdentity(identityName)
             if identity:
                 awayMessage = identity.getAwayMessage()
             else:
                 awayMessage = ""
             self.handleAwayCommand(awayMessage)
-    
+
     @pyqtSlot(str)
     def handleAwayCommand(self, awayMessage):
         """
         Public slot to process an away command.
-        
+
         @param awayMessage message to be set for being away
         @type str
         """
@@ -198,11 +197,10 @@
         elif not awayMessage and self.__away:
             # cancel being away
             self.sendData.emit("AWAY")
-            self.awayButton.setIcon(
-                UI.PixmapCache.getIcon("ircUserPresent"))
+            self.awayButton.setIcon(UI.PixmapCache.getIcon("ircUserPresent"))
             self.__away = False
             self.away.emit(self.__away)
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -210,17 +208,17 @@
         """
         network = self.networkCombo.currentText()
         self.editNetwork.emit(network)
-    
+
     @pyqtSlot(str)
     def on_channelCombo_editTextChanged(self, txt):
         """
         Private slot to react upon changes of the channel.
-        
+
         @param txt current text of the channel combo (string)
         """
         on = bool(txt) and self.__registered
         self.joinButton.setEnabled(on)
-    
+
     @pyqtSlot()
     def on_joinButton_clicked(self):
         """
@@ -228,12 +226,12 @@
         """
         channel = self.channelCombo.currentText()
         self.joinChannel.emit(channel)
-    
+
     @pyqtSlot(int)
     def on_networkCombo_currentIndexChanged(self, index):
         """
         Private slot to handle selections of a network.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -245,70 +243,67 @@
             channels = network.getChannelNames()
             self.channelCombo.addItems(channels)
             self.channelCombo.setEnabled(True)
-            identity = self.__manager.getIdentity(
-                network.getIdentityName())
+            identity = self.__manager.getIdentity(network.getIdentityName())
             if identity:
                 self.nickCombo.addItems(identity.getNickNames())
         else:
             self.channelCombo.setEnabled(False)
-    
+
     def getNetworkChannels(self):
         """
         Public method to get the list of channels associated with the
         selected network.
-        
+
         @return associated channels (list of IrcChannel)
         """
         networkName = self.networkCombo.currentText()
         network = self.__manager.getNetwork(networkName)
         return network.getChannels()
-    
+
     @pyqtSlot(int)
     @pyqtSlot()
     def on_nickCombo_currentIndexChanged(self, nick=0):
         """
         Private slot to use another nick name.
-        
+
         @param nick index of the selected nick name (unused)
         """
         if self.__connected:
             self.nickChanged.emit(self.nickCombo.currentText())
-    
+
     def getNickname(self):
         """
         Public method to get the currently selected nick name.
-        
+
         @return selected nick name (string)
         """
         return self.nickCombo.currentText()
-    
+
     def setNickName(self, nick):
         """
         Public slot to set the nick name in use.
-        
+
         @param nick nick name in use (string)
         """
         self.nickCombo.blockSignals(True)
         self.nickCombo.setEditText(nick)
         self.nickCombo.blockSignals(False)
-    
+
     def addMessage(self, msg):
         """
         Public method to add a message.
-        
+
         @param msg message to be added (string)
         """
         s = '<font color="{0}">{1} {2}</font>'.format(
-            Preferences.getIrc("NetworkMessageColour"),
-            ircTimestamp(),
-            msg
+            Preferences.getIrc("NetworkMessageColour"), ircTimestamp(), msg
         )
         self.messages.append(s)
-    
+
     def addServerMessage(self, msgType, msg, filterMsg=True):
         """
         Public method to add a server message.
-        
+
         @param msgType txpe of the message (string)
         @param msg message to be added (string)
         @param filterMsg flag indicating to filter the message (boolean)
@@ -316,58 +311,52 @@
         if filterMsg:
             msg = ircFilter(msg)
         s = '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format(
-            Preferences.getIrc("ServerMessageColour"),
-            ircTimestamp(),
-            msgType,
-            msg
+            Preferences.getIrc("ServerMessageColour"), ircTimestamp(), msgType, msg
         )
         self.messages.append(s)
-    
+
     def addErrorMessage(self, msgType, msg):
         """
         Public method to add an error message.
-        
+
         @param msgType txpe of the message (string)
         @param msg message to be added (string)
         """
         s = '<font color="{0}">{1} <b>[</b>{2}<b>]</b> {3}</font>'.format(
-            Preferences.getIrc("ErrorMessageColour"),
-            ircTimestamp(),
-            msgType,
-            msg
+            Preferences.getIrc("ErrorMessageColour"), ircTimestamp(), msgType, msg
         )
         self.messages.append(s)
-    
+
     def setConnected(self, connected):
         """
         Public slot to set the connection state.
-        
+
         @param connected flag indicating the connection state (boolean)
         """
         self.__connected = connected
         if self.__connected:
-            self.connectButton.setIcon(
-                UI.PixmapCache.getIcon("ircDisconnect"))
+            self.connectButton.setIcon(UI.PixmapCache.getIcon("ircDisconnect"))
             self.connectButton.setToolTip(
-                self.tr("Press to disconnect from the network"))
+                self.tr("Press to disconnect from the network")
+            )
         else:
-            self.connectButton.setIcon(
-                UI.PixmapCache.getIcon("ircConnect"))
+            self.connectButton.setIcon(UI.PixmapCache.getIcon("ircConnect"))
             self.connectButton.setToolTip(
-                self.tr("Press to connect to the selected network"))
-    
+                self.tr("Press to connect to the selected network")
+            )
+
     def isConnected(self):
         """
         Public method to check, if the network is connected.
-        
+
         @return flag indicating a connected network (boolean)
         """
         return self.__connected
-    
+
     def setRegistered(self, registered):
         """
         Public slot to set the registered state.
-        
+
         @param registered flag indicating the registration state (boolean)
         """
         self.__registered = registered
@@ -376,23 +365,22 @@
         self.nickCombo.setEnabled(registered)
         self.awayButton.setEnabled(registered)
         if registered:
-            self.awayButton.setIcon(
-                UI.PixmapCache.getIcon("ircUserPresent"))
+            self.awayButton.setIcon(UI.PixmapCache.getIcon("ircUserPresent"))
             self.__away = False
-    
+
     def __clearMessages(self):
         """
         Private slot to clear the contents of the messages display.
         """
         self.messages.clear()
-    
+
     def __copyMessages(self):
         """
         Private slot to copy the selection of the messages display to
         the clipboard.
         """
         self.messages.copy()
-    
+
     def __copyAllMessages(self):
         """
         Private slot to copy the contents of the messages display to
@@ -402,7 +390,7 @@
         if txt:
             cb = QApplication.clipboard()
             cb.setText(txt)
-    
+
     def __cutAllMessages(self):
         """
         Private slot to cut the contents of the messages display to
@@ -413,7 +401,7 @@
             cb = QApplication.clipboard()
             cb.setText(txt)
         self.messages.clear()
-    
+
     def __saveMessages(self):
         """
         Private slot to save the contents of the messages display.
@@ -428,11 +416,12 @@
                 self,
                 self.tr("Save Messages"),
                 "",
-                self.tr(
-                    "HTML Files (*.{0});;Text Files (*.txt);;All Files (*)")
-                .format(htmlExtension),
+                self.tr("HTML Files (*.{0});;Text Files (*.txt);;All Files (*)").format(
+                    htmlExtension
+                ),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if fname:
                 fpath = pathlib.Path(fname)
                 if not fpath.suffix:
@@ -443,17 +432,20 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Messages"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
-                
+
                 try:
                     txt = (
                         self.messages.toHtml()
-                        if fpath.suffix.lower() in [".htm", ".html"] else
-                        self.messages.toPlainText()
+                        if fpath.suffix.lower() in [".htm", ".html"]
+                        else self.messages.toPlainText()
                     )
                     with fpath.open("w", encoding="utf-8") as f:
                         f.write(txt)
@@ -463,50 +455,53 @@
                         self.tr("Error saving Messages"),
                         self.tr(
                             """<p>The messages contents could not be written"""
-                            """ to <b>{0}</b></p><p>Reason: {1}</p>""")
-                        .format(fpath, str(err)))
-    
+                            """ to <b>{0}</b></p><p>Reason: {1}</p>"""
+                        ).format(fpath, str(err)),
+                    )
+
     def __initMessagesMenu(self):
         """
         Private slot to initialize the context menu of the messages pane.
         """
         self.__messagesMenu = QMenu(self)
         self.__copyMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy"), self.__copyMessages)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.__copyMessages
+        )
         self.__messagesMenu.addSeparator()
         self.__cutAllMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editCut"),
-            self.tr("Cut all"), self.__cutAllMessages)
+            UI.PixmapCache.getIcon("editCut"), self.tr("Cut all"), self.__cutAllMessages
+        )
         self.__copyAllMessagesAct = self.__messagesMenu.addAction(
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy all"), self.__copyAllMessages)
+            self.tr("Copy all"),
+            self.__copyAllMessages,
+        )
         self.__messagesMenu.addSeparator()
         self.__clearMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("editDelete"),
-            self.tr("Clear"), self.__clearMessages)
+            UI.PixmapCache.getIcon("editDelete"), self.tr("Clear"), self.__clearMessages
+        )
         self.__messagesMenu.addSeparator()
         self.__saveMessagesAct = self.__messagesMenu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr("Save"), self.__saveMessages)
-        
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__saveMessages
+        )
+
         self.on_messages_copyAvailable(False)
-    
+
     @pyqtSlot(bool)
     def on_messages_copyAvailable(self, yes):
         """
         Private slot to react to text selection/deselection of the
         messages edit.
-        
+
         @param yes flag signaling the availability of selected text (boolean)
         """
         self.__copyMessagesAct.setEnabled(yes)
-    
+
     @pyqtSlot(QPoint)
     def on_messages_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the messages pane.
-        
+
         @param pos position the menu should be opened at (QPoint)
         """
         enable = not self.messages.document().isEmpty()
@@ -514,12 +509,12 @@
         self.__copyAllMessagesAct.setEnabled(enable)
         self.__saveMessagesAct.setEnabled(enable)
         self.__messagesMenu.popup(self.messages.mapToGlobal(pos))
-    
+
     @pyqtSlot(QUrl)
     def on_messages_anchorClicked(self, url):
         """
         Private slot to open links in the default browser.
-        
+
         @param url URL to be opened (QUrl)
         """
         QDesktopServices.openUrl(url)
--- a/src/eric7/Network/IRC/IrcServerEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcServerEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,56 +17,57 @@
     """
     Class implementing a dialog for editing the IRC server configuration.
     """
+
     def __init__(self, server, parent=None):
         """
         Constructor
-        
+
         @param server reference to the IRC server object (IrcServer)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         if server:
             self.serverEdit.setText(server.getName())
             self.portSpinBox.setValue(server.getPort())
             self.passwordEdit.setText(server.getPassword())
             self.sslCheckBox.setChecked(server.useSSL())
-        
+
         self.__updateOkButton()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOkButton(self):
         """
         Private method to update the OK button state.
         """
         self.__okButton.setEnabled(self.serverEdit.text() != "")
-    
+
     @pyqtSlot(str)
     def on_serverEdit_textChanged(self, name):
         """
         Private slot handling changes of the server name.
-        
+
         @param name current name of the server (string)
         """
         self.__updateOkButton()
-    
+
     def getServer(self):
         """
         Public method to create a server object from the data entered into
         the dialog.
-        
+
         @return server object (IrcServer)
         """
         from .IrcNetworkManager import IrcServer
+
         server = IrcServer(self.serverEdit.text())
         server.setPort(self.portSpinBox.value())
         server.setPassword(self.passwordEdit.text())
         server.setUseSSL(self.sslCheckBox.isChecked())
-        
+
         return server
--- a/src/eric7/Network/IRC/IrcUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,16 +18,18 @@
 
 __UrlRe = re.compile(
     r"""((?:http|ftp|https):\/\/[\w\-_]+(?:\.[\w\-_]+)+"""
-    r"""(?:[\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)""")
+    r"""(?:[\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)"""
+)
 __ColorRe = re.compile(
     r"""((?:\x03(?:0[0-9]|1[0-5]|[0-9])?(?:,(?:0[0-9]|1[0-5]|[0-9]))?)"""
-    r"""|\x02|\x03|\x13|\x15|\x16|\x17|\x1d|\x1f)""")
+    r"""|\x02|\x03|\x13|\x15|\x16|\x17|\x1d|\x1f)"""
+)
 
 
 def ircTimestamp():
     """
     Module method to generate a time stamp string.
-    
+
     @return time stamp (string)
     """
     if Preferences.getIrc("ShowTimestamps"):
@@ -36,13 +38,15 @@
                 f = "{0} {1}"
             else:
                 f = "{1} {0}"
-            formatString = f.format(Preferences.getIrc("DateFormat"),
-                                    Preferences.getIrc("TimeFormat"))
+            formatString = f.format(
+                Preferences.getIrc("DateFormat"), Preferences.getIrc("TimeFormat")
+            )
         else:
             formatString = Preferences.getIrc("TimeFormat")
         return '<font color="{0}">[{1}]</font> '.format(
             Preferences.getIrc("TimestampColour"),
-            QTime.currentTime().toString(formatString))
+            QTime.currentTime().toString(formatString),
+        )
     else:
         return ""
 
@@ -50,19 +54,19 @@
 def ircFilter(msg):
     """
     Module method to make the message HTML compliant and detect URLs.
-    
+
     @param msg message to process (string)
     @return processed message (string)
     """
     # step 1: cleanup message
     msg = Utilities.html_encode(msg)
-    
+
     # step 2: replace IRC formatting characters
     openTags = []
     parts = __ColorRe.split(msg)
     msgParts = []
     for part in parts:
-        if part == "\x02":                                  # bold
+        if part == "\x02":  # bold
             if openTags and openTags[-1] == "b":
                 msgParts.append("</" + openTags.pop(-1) + ">")
             else:
@@ -76,16 +80,16 @@
                     continue
             else:
                 continue
-        elif part == "\x0f":                                # reset
+        elif part == "\x0f":  # reset
             while openTags:
                 msgParts.append("</" + openTags.pop(-1) + ">")
-        elif part == "\x13":                                # strikethru
+        elif part == "\x13":  # strikethru
             if openTags and openTags[-1] == "s":
                 msgParts.append("</" + openTags.pop(-1) + ">")
             else:
                 msgParts.append("<s>")
                 openTags.append("s")
-        elif part in ["\x15", "\x1f"]:                      # underline
+        elif part in ["\x15", "\x1f"]:  # underline
             if openTags and openTags[-1] == "u":
                 msgParts.append("</" + openTags.pop(-1) + ">")
             else:
@@ -94,7 +98,7 @@
         elif part == "\x16":
             # revert color not supported
             continue
-        elif part == "\x1d":                                # italic
+        elif part == "\x1d":  # italic
             if openTags and openTags[-1] == "i":
                 msgParts.append("</" + openTags.pop(-1) + ">")
             else:
@@ -105,23 +109,21 @@
                 colors = part[1:].split(",", 1)
                 if len(colors) == 1:
                     # foreground color only
-                    tag = '<span style="color:{0}">'.format(Preferences.getIrc(
-                        "IrcColor{0}".format(int(colors[0]))))
+                    tag = '<span style="color:{0}">'.format(
+                        Preferences.getIrc("IrcColor{0}".format(int(colors[0])))
+                    )
                 else:
                     if colors[0]:
                         # foreground and background
-                        tag = (
-                            '<span style="background-color:{0};color={1}">'
-                            .format(Preferences.getIrc(
-                                "IrcColor{0}".format(int(colors[0]))),
-                                Preferences.getIrc(
-                                    "IrcColor{0}".format(int(colors[1]))))
+                        tag = '<span style="background-color:{0};color={1}">'.format(
+                            Preferences.getIrc("IrcColor{0}".format(int(colors[0]))),
+                            Preferences.getIrc("IrcColor{0}".format(int(colors[1]))),
                         )
                     else:
                         # background only
                         tag = '<span style="background-color:{0}">'.format(
-                            Preferences.getIrc(
-                                "IrcColor{0}".format(int(colors[1]))))
+                            Preferences.getIrc("IrcColor{0}".format(int(colors[1])))
+                        )
                 msgParts.append(tag)
                 openTags.append("span")
             else:
@@ -129,17 +131,20 @@
         else:
             msgParts.append(part)
     msg = "".join(msgParts)
-    
+
     # step 3: find http and https links
     parts = __UrlRe.split(msg)
     msgParts = []
     for part in parts:
         if part.startswith(("http://", "https://", "ftp://")):
-            msgParts.append('<a href="{0}" style="color:{1}">{0}</a>'.format(
-                part, Preferences.getIrc("HyperlinkColour")))
+            msgParts.append(
+                '<a href="{0}" style="color:{1}">{0}</a>'.format(
+                    part, Preferences.getIrc("HyperlinkColour")
+                )
+            )
         else:
             msgParts.append(part)
-    
+
     return "".join(msgParts)
 
 
@@ -151,7 +156,7 @@
     Private module function to initialize the channels modes dictionary.
     """
     global __channelModesDict
-    
+
     modesDict = {
         "a": QCoreApplication.translate("IrcUtilities", "anonymous"),
         "b": QCoreApplication.translate("IrcUtilities", "ban mask"),
@@ -161,8 +166,7 @@
         "k": QCoreApplication.translate("IrcUtilities", "password protected"),
         "l": QCoreApplication.translate("IrcUtilities", "user limit"),
         "m": QCoreApplication.translate("IrcUtilities", "moderated"),
-        "n": QCoreApplication.translate("IrcUtilities",
-                                        "no messages from outside"),
+        "n": QCoreApplication.translate("IrcUtilities", "no messages from outside"),
         "p": QCoreApplication.translate("IrcUtilities", "private"),
         "q": QCoreApplication.translate("IrcUtilities", "quiet"),
         "r": QCoreApplication.translate("IrcUtilities", "reop channel"),
@@ -176,12 +180,12 @@
 def getChannelModesDict():
     """
     Module function to get the dictionary with the channel modes mappings.
-    
+
     @return dictionary with channel modes mapping (dict)
     """
     global __channelModesDict
-    
+
     if __channelModesDict is None:
         __initChannelModesDict()
-    
+
     return __channelModesDict
--- a/src/eric7/Network/IRC/IrcWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Network/IRC/IrcWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,16 +10,14 @@
 import re
 import logging
 
-from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, Qt, QByteArray, QTimer, QDateTime
-)
+from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QByteArray, QTimer, QDateTime
 from PyQt6.QtWidgets import QWidget, QToolButton, QLabel, QTabWidget
 from PyQt6.QtNetwork import QTcpSocket, QAbstractSocket
+
 try:
     from PyQt6.QtNetwork import QSslSocket, QSslConfiguration
-    from EricNetwork.EricSslErrorHandler import (
-        EricSslErrorHandler, EricSslErrorState
-    )
+    from EricNetwork.EricSslErrorHandler import EricSslErrorHandler, EricSslErrorState
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -39,43 +37,44 @@
 class IrcWidget(QWidget, Ui_IrcWidget):
     """
     Class implementing the IRC window.
-    
+
     @signal autoConnected() emitted after an automatic connection was initiated
     """
+
     autoConnected = pyqtSignal()
-    
+
     ServerDisconnected = 1
     ServerConnected = 2
     ServerConnecting = 3
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         from .IrcNetworkManager import IrcNetworkManager
+
         self.__ircNetworkManager = IrcNetworkManager(self)
-        
+
         self.__leaveButton = QToolButton(self)
-        self.__leaveButton.setIcon(
-            UI.PixmapCache.getIcon("ircCloseChannel"))
-        self.__leaveButton.setToolTip(
-            self.tr("Press to leave the current channel"))
+        self.__leaveButton.setIcon(UI.PixmapCache.getIcon("ircCloseChannel"))
+        self.__leaveButton.setToolTip(self.tr("Press to leave the current channel"))
         self.__leaveButton.clicked.connect(self.__leaveChannel)
         self.__leaveButton.setEnabled(False)
         self.channelsWidget.setCornerWidget(
-            self.__leaveButton, Qt.Corner.BottomRightCorner)
+            self.__leaveButton, Qt.Corner.BottomRightCorner
+        )
         self.channelsWidget.setTabsClosable(False)
         if not isMacPlatform():
             self.channelsWidget.setTabPosition(QTabWidget.TabPosition.South)
-        
+
         height = self.height()
         self.splitter.setSizes([int(height * 0.6), int(height * 0.4)])
-        
+
         self.__channelList = []
         self.__channelTypePrefixes = ""
         self.__userName = ""
@@ -85,42 +84,40 @@
         self.__nickName = ""
         self.__server = None
         self.__registering = False
-        
+
         self.__connectionState = IrcWidget.ServerDisconnected
         self.__sslErrorLock = False
-        
+
         self.__buffer = ""
         self.__userPrefix = {}
-        
+
         self.__socket = None
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
         else:
             self.__sslErrorHandler = None
-        
+
         self.__patterns = [
             # :foo_!n=foo@foohost.bar.net PRIVMSG bar_ :some long message
-            (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"),
-             self.__query),
+            (re.compile(r":([^!]+)!([^ ]+)\sPRIVMSG\s([^ ]+)\s:(.*)"), self.__query),
             # :foo.bar.net COMMAND some message
-            (re.compile(r""":([^ ]+)\s+([A-Z]+)\s+(.+)"""),
-             self.__handleNamedMessage),
+            (re.compile(r""":([^ ]+)\s+([A-Z]+)\s+(.+)"""), self.__handleNamedMessage),
             # :foo.bar.net 123 * :info
-            (re.compile(r""":([^ ]+)\s+(\d{3})\s+(.+)"""),
-             self.__handleNumericMessage),
+            (re.compile(r""":([^ ]+)\s+(\d{3})\s+(.+)"""), self.__handleNumericMessage),
             # PING :ping message
             (re.compile(r"""PING\s+:(.*)"""), self.__ping),
         ]
         self.__prefixRe = re.compile(r""".*\sPREFIX=\((.*)\)([^ ]+).*""")
         self.__chanTypesRe = re.compile(r""".*\sCHANTYPES=([^ ]+).*""")
-        
+
         ircPic = UI.PixmapCache.getPixmap("irc128")
         self.__emptyLabel = QLabel()
         self.__emptyLabel.setPixmap(ircPic)
         self.__emptyLabel.setAlignment(
-            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignHCenter)
+            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignHCenter
+        )
         self.channelsWidget.addTab(self.__emptyLabel, "")
-        
+
         # all initialized, do connections now
         self.__ircNetworkManager.dataChanged.connect(self.__networkDataChanged)
         self.networkWidget.initialize(self.__ircNetworkManager)
@@ -131,11 +128,11 @@
         self.networkWidget.sendData.connect(self.__send)
         self.networkWidget.away.connect(self.__away)
         self.networkWidget.autoConnected.connect(self.autoConnected)
-    
+
     def shutdown(self):
         """
         Public method to shut down the widget.
-        
+
         @return flag indicating successful shutdown (boolean)
         """
         if self.__server:
@@ -146,19 +143,21 @@
                     self.tr(
                         """<p>Do you really want to disconnect from"""
                         """ <b>{0}</b>?</p><p>All channels will be closed."""
-                        """</p>""").format(self.__server.getName()))
+                        """</p>"""
+                    ).format(self.__server.getName()),
+                )
             else:
                 ok = True
             if ok:
                 self.__connectNetwork("", False, True)
         else:
             ok = True
-        
+
         if ok:
             self.__ircNetworkManager.close()
-        
+
         return ok
-    
+
     def autoConnect(self):
         """
         Public method to initiate the IRC auto connection.
@@ -168,7 +167,7 @@
     def __connectNetwork(self, name, connect, silent):
         """
         Private slot to connect to or disconnect from the given network.
-        
+
         @param name name of the network to connect to (string)
         @param connect flag indicating to connect (boolean)
         @param silent flag indicating a silent connect/disconnect (boolean)
@@ -178,8 +177,7 @@
             if network:
                 self.__server = network.getServer()
                 self.__identityName = network.getIdentityName()
-                identity = self.__ircNetworkManager.getIdentity(
-                    self.__identityName)
+                identity = self.__ircNetworkManager.getIdentity(self.__identityName)
                 if identity:
                     self.__userName = identity.getIdent()
                     self.__quitMessage = identity.getQuitMessage()
@@ -193,53 +191,50 @@
                                     """An encrypted connection to the IRC"""
                                     """ network was requested but SSL is not"""
                                     """ available. Please change the server"""
-                                    """ configuration."""))
+                                    """ configuration."""
+                                ),
+                            )
                             return
-                        
+
                         if useSSL:
                             # create SSL socket
                             self.__socket = QSslSocket(self)
-                            self.__socket.encrypted.connect(
-                                self.__hostConnected)
-                            self.__socket.sslErrors.connect(
-                                self.__sslErrors)
+                            self.__socket.encrypted.connect(self.__hostConnected)
+                            self.__socket.sslErrors.connect(self.__sslErrors)
                         else:
                             # create TCP socket
                             self.__socket = QTcpSocket(self)
-                            self.__socket.connected.connect(
-                                self.__hostConnected)
-                        self.__socket.hostFound.connect(
-                            self.__hostFound)
-                        self.__socket.disconnected.connect(
-                            self.__hostDisconnected)
-                        self.__socket.readyRead.connect(
-                            self.__readyRead)
-                        self.__socket.errorOccurred.connect(
-                            self.__tcpError)
-                        
+                            self.__socket.connected.connect(self.__hostConnected)
+                        self.__socket.hostFound.connect(self.__hostFound)
+                        self.__socket.disconnected.connect(self.__hostDisconnected)
+                        self.__socket.readyRead.connect(self.__readyRead)
+                        self.__socket.errorOccurred.connect(self.__tcpError)
+
                         self.__connectionState = IrcWidget.ServerConnecting
                         if useSSL:
                             self.networkWidget.addServerMessage(
                                 self.tr("Info"),
-                                self.tr("Looking for server {0} (port {1})"
-                                        " using an SSL encrypted connection"
-                                        "...").format(self.__server.getName(),
-                                                      self.__server.getPort()))
+                                self.tr(
+                                    "Looking for server {0} (port {1})"
+                                    " using an SSL encrypted connection"
+                                    "..."
+                                ).format(
+                                    self.__server.getName(), self.__server.getPort()
+                                ),
+                            )
                             self.__socket.connectToHostEncrypted(
-                                self.__server.getName(),
-                                self.__server.getPort()
+                                self.__server.getName(), self.__server.getPort()
                             )
                         else:
                             self.networkWidget.addServerMessage(
                                 self.tr("Info"),
-                                self.tr(
-                                    "Looking for server {0} (port {1})...")
-                                .format(
-                                    self.__server.getName(),
-                                    self.__server.getPort()))
+                                self.tr("Looking for server {0} (port {1})...").format(
+                                    self.__server.getName(), self.__server.getPort()
+                                ),
+                            )
                             self.__socket.connectToHost(
-                                self.__server.getName(),
-                                self.__server.getPort())
+                                self.__server.getName(), self.__server.getPort()
+                            )
         else:
             if silent:
                 ok = True
@@ -247,25 +242,29 @@
                 ok = EricMessageBox.yesNo(
                     self,
                     self.tr("Disconnect from Server"),
-                    self.tr("""<p>Do you really want to disconnect from"""
-                            """ <b>{0}</b>?</p><p>All channels will be"""
-                            """ closed.</p>""")
-                    .format(self.__server.getName()))
+                    self.tr(
+                        """<p>Do you really want to disconnect from"""
+                        """ <b>{0}</b>?</p><p>All channels will be"""
+                        """ closed.</p>"""
+                    ).format(self.__server.getName()),
+                )
             if ok:
                 if self.__server is not None:
                     self.networkWidget.addServerMessage(
                         self.tr("Info"),
                         self.tr("Disconnecting from server {0}...").format(
-                            self.__server.getName()))
+                            self.__server.getName()
+                        ),
+                    )
                 elif name:
                     self.networkWidget.addServerMessage(
                         self.tr("Info"),
-                        self.tr("Disconnecting from network {0}...").format(
-                            name))
+                        self.tr("Disconnecting from network {0}...").format(name),
+                    )
                 else:
                     self.networkWidget.addServerMessage(
-                        self.tr("Info"),
-                        self.tr("Disconnecting from server."))
+                        self.tr("Info"), self.tr("Disconnecting from server.")
+                    )
                 self.__closeAllChannels()
                 self.__send("QUIT :" + self.__quitMessage)
                 if self.__socket:
@@ -278,17 +277,18 @@
                 self.__userName = ""
                 self.__identityName = ""
                 self.__quitMessage = ""
-    
+
     def __editNetwork(self, name):
         """
         Private slot to edit the network configuration.
-        
+
         @param name name of the network to edit (string)
         """
         from .IrcNetworkListDialog import IrcNetworkListDialog
+
         dlg = IrcNetworkListDialog(self.__ircNetworkManager, self)
         dlg.exec()
-    
+
     def __networkDataChanged(self):
         """
         Private slot handling changes of the network and identity definitions.
@@ -298,11 +298,11 @@
             partMsg = identity.getPartMessage()
             for channel in self.__channelList:
                 channel.setPartMessage(partMsg)
-    
+
     def joinChannel(self, name, key=""):
         """
         Public slot to join a channel.
-        
+
         @param name name of the channel (string)
         @param key key of the channel (string)
         """
@@ -310,8 +310,9 @@
         for channel in self.__channelList:
             if channel.name() == name:
                 return
-        
+
         from .IrcChannelWidget import IrcChannelWidget
+
         channel = IrcChannelWidget(self)
         channel.setName(name)
         channel.setUserName(self.__nickName)
@@ -320,7 +321,7 @@
             channel.setPartMessage(identity.getPartMessage())
         channel.setUserPrivilegePrefix(self.__userPrefix)
         channel.initAutoWho()
-        
+
         channel.sendData.connect(self.__send)
         channel.sendCtcpRequest.connect(self.__sendCtcpRequest)
         channel.sendCtcpReply.connect(self.__sendCtcpReply)
@@ -329,27 +330,27 @@
         channel.awayCommand.connect(self.networkWidget.handleAwayCommand)
         channel.leaveChannels.connect(self.__leaveChannels)
         channel.leaveAllChannels.connect(self.__leaveAllChannels)
-        
+
         self.channelsWidget.addTab(channel, name)
         self.__channelList.append(channel)
         self.channelsWidget.setCurrentWidget(channel)
-        
+
         joinCommand = ["JOIN", name]
         if key:
             joinCommand.append(key)
         self.__send(" ".join(joinCommand))
         self.__send("MODE " + name)
-        
+
         emptyIndex = self.channelsWidget.indexOf(self.__emptyLabel)
         if emptyIndex > -1:
             self.channelsWidget.removeTab(emptyIndex)
             self.__leaveButton.setEnabled(True)
         self.channelsWidget.setTabsClosable(True)
-    
+
     def __query(self, match):
         """
         Private method to handle a new private connection.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
@@ -359,24 +360,24 @@
         # group(4)   message
         if match.group(4).startswith("\x01"):
             return self.__handleCtcp(match)
-        
+
         self.__openPrivate(match.group(1))
         # the above call sets the new channel as the current widget
         channel = self.channelsWidget.currentWidget()
         channel.addMessage(match.group(1), match.group(4))
-        channel.setPrivateInfo(
-            "{0} - {1}".format(match.group(1), match.group(2)))
-        
+        channel.setPrivateInfo("{0} - {1}".format(match.group(1), match.group(2)))
+
         return True
-    
+
     @pyqtSlot(str)
     def __openPrivate(self, name):
         """
         Private slot to open a private chat with the given user.
-        
+
         @param name name of the user (string)
         """
         from .IrcChannelWidget import IrcChannelWidget
+
         channel = IrcChannelWidget(self)
         channel.setName(self.__nickName)
         channel.setUserName(self.__nickName)
@@ -386,7 +387,7 @@
         channel.setUserPrivilegePrefix(self.__userPrefix)
         channel.setPrivate(True, name)
         channel.addUsers([name, self.__nickName])
-        
+
         channel.sendData.connect(self.__send)
         channel.sendCtcpRequest.connect(self.__sendCtcpRequest)
         channel.sendCtcpReply.connect(self.__sendCtcpReply)
@@ -394,11 +395,11 @@
         channel.awayCommand.connect(self.networkWidget.handleAwayCommand)
         channel.leaveChannels.connect(self.__leaveChannels)
         channel.leaveAllChannels.connect(self.__leaveAllChannels)
-        
+
         self.channelsWidget.addTab(channel, name)
         self.__channelList.append(channel)
         self.channelsWidget.setCurrentWidget(channel)
-    
+
     @pyqtSlot()
     def __leaveChannel(self):
         """
@@ -406,13 +407,13 @@
         """
         channel = self.channelsWidget.currentWidget()
         channel.requestLeave()
-    
+
     @pyqtSlot(list)
     def __leaveChannels(self, channelNames):
         """
         Private slot to leave a list of channels and close their associated
         tabs.
-        
+
         @param channelNames list of channels to leave
         @type list of str
         """
@@ -420,7 +421,7 @@
             for channel in self.__channelList:
                 if channel.name() == channelName:
                     channel.leaveChannel()
-    
+
     @pyqtSlot()
     def __leaveAllChannels(self):
         """
@@ -429,7 +430,7 @@
         while self.__channelList:
             channel = self.__channelList[0]
             channel.leaveChannel()
-    
+
     def __closeAllChannels(self):
         """
         Private method to close all channels.
@@ -439,56 +440,54 @@
             self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel))
             channel.deleteLater()
             channel = None
-        
+
         self.channelsWidget.addTab(self.__emptyLabel, "")
         self.__emptyLabel.show()
         self.__leaveButton.setEnabled(False)
         self.channelsWidget.setTabsClosable(False)
-    
+
     def __closeChannel(self, name):
         """
         Private slot handling the closing of a channel.
-        
+
         @param name name of the closed channel (string)
         """
         for channel in self.__channelList:
             if channel.name() == name:
-                self.channelsWidget.removeTab(
-                    self.channelsWidget.indexOf(channel))
+                self.channelsWidget.removeTab(self.channelsWidget.indexOf(channel))
                 self.__channelList.remove(channel)
                 channel.deleteLater()
-        
+
         if self.channelsWidget.count() == 0:
             self.channelsWidget.addTab(self.__emptyLabel, "")
             self.__emptyLabel.show()
             self.__leaveButton.setEnabled(False)
             self.channelsWidget.setTabsClosable(False)
-    
+
     @pyqtSlot(int)
     def on_channelsWidget_tabCloseRequested(self, index):
         """
         Private slot to close a channel by pressing the close button of
         the channels widget.
-        
+
         @param index index of the tab to be closed (integer)
         """
         channel = self.channelsWidget.widget(index)
         channel.requestLeave()
-    
+
     def __send(self, data):
         """
         Private slot to send data to the IRC server.
-        
+
         @param data data to be sent (string)
         """
         if self.__socket:
-            self.__socket.write(
-                QByteArray("{0}\r\n".format(data).encode("utf-8")))
-    
+            self.__socket.write(QByteArray("{0}\r\n".format(data).encode("utf-8")))
+
     def __sendCtcpRequest(self, receiver, request, arguments):
         """
         Private slot to send a CTCP request.
-        
+
         @param receiver nick name of the receiver
         @type str
         @param request CTCP request to be sent
@@ -498,48 +497,45 @@
         """
         request = request.upper()
         if request == "PING":
-            arguments = "Eric IRC {0}".format(
-                QDateTime.currentMSecsSinceEpoch())
-            
-        self.__send("PRIVMSG {0} :\x01{1} {2}\x01".format(
-            receiver, request, arguments))
-    
+            arguments = "Eric IRC {0}".format(QDateTime.currentMSecsSinceEpoch())
+
+        self.__send("PRIVMSG {0} :\x01{1} {2}\x01".format(receiver, request, arguments))
+
     def __sendCtcpReply(self, receiver, text):
         """
         Private slot to send a CTCP reply.
-        
+
         @param receiver nick name of the receiver
         @type str
         @param text text to be sent
         @type str
         """
         self.__send("NOTICE {0} :\x01{1}\x01".format(receiver, text))
-    
+
     def __hostFound(self):
         """
         Private slot to indicate the host was found.
         """
         self.networkWidget.addServerMessage(
-            self.tr("Info"),
-            self.tr("Server found,connecting..."))
-    
+            self.tr("Info"), self.tr("Server found,connecting...")
+        )
+
     def __hostConnected(self):
         """
         Private slot to log in to the server after the connection was
         established.
         """
         self.networkWidget.addServerMessage(
-            self.tr("Info"),
-            self.tr("Connected,logging in..."))
+            self.tr("Info"), self.tr("Connected,logging in...")
+        )
         self.networkWidget.setConnected(True)
-        
+
         self.__registering = True
         serverPassword = self.__server.getPassword()
         if serverPassword:
             self.__send("PASS " + serverPassword)
-        
-        identity = self.__ircNetworkManager.getIdentity(
-            self.__identityName)
+
+        identity = self.__ircNetworkManager.getIdentity(self.__identityName)
         nick = self.networkWidget.getNickname()
         if not nick and identity:
             self.__nickIndex = 0
@@ -557,7 +553,7 @@
                 realName = "eric IDE chat"
             self.__send("NICK " + nick)
             self.__send("USER " + self.__userName + " 0 * :" + realName)
-    
+
     def __hostDisconnected(self):
         """
         Private slot to indicate the host was disconnected.
@@ -565,31 +561,30 @@
         if self.networkWidget.isConnected():
             self.__closeAllChannels()
             self.networkWidget.addServerMessage(
-                self.tr("Info"),
-                self.tr("Server disconnected."))
+                self.tr("Info"), self.tr("Server disconnected.")
+            )
             self.networkWidget.setRegistered(False)
             self.networkWidget.setConnected(False)
             self.__server = None
             self.__nickName = ""
             self.__nickIndex = -1
             self.__channelTypePrefixes = ""
-            
+
             if self.__socket:
                 self.__socket.deleteLater()
             self.__socket = None
-            
+
             self.__connectionState = IrcWidget.ServerDisconnected
             self.__sslErrorLock = False
-    
+
     def __readyRead(self):
         """
         Private slot to read data from the socket.
         """
         if self.__socket:
             self.__buffer += str(
-                self.__socket.readAll(),
-                Preferences.getSystem("IOEncoding"),
-                'replace')
+                self.__socket.readAll(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             if self.__buffer.endswith("\r\n"):
                 for line in self.__buffer.splitlines():
                     line = line.strip()
@@ -613,20 +608,22 @@
                                     self.tr("Message Error"),
                                     self.tr(
                                         "Unknown message received from server:"
-                                        "<br/>{0}").format(line))
-                
+                                        "<br/>{0}"
+                                    ).format(line),
+                                )
+
                 self.__updateUsersCount()
                 self.__buffer = ""
-    
+
     def __handleCtcpReply(self, match):
         """
         Private method to handle a server message containing a CTCP reply.
-        
+
         @param match reference to the match object
         """
         if "!" in match.group(1):
             sender = match.group(1).split("!", 1)[0]
-            
+
             try:
                 ctcpCommand = match.group(3).split(":", 1)[1]
             except IndexError:
@@ -637,7 +634,7 @@
             else:
                 ctcpReply, ctcpArg = ctcpCommand, ""
             ctcpReply = ctcpReply.upper()
-            
+
             if ctcpReply == "PING" and ctcpArg.startswith("Eric IRC "):
                 # it is a response to a ping request
                 pingDateTime = int(ctcpArg.split()[-1])
@@ -646,18 +643,21 @@
                     self.tr("CTCP"),
                     self.tr(
                         "Received CTCP-PING response from {0} with latency"
-                        " of {1} ms.").format(sender, latency))
+                        " of {1} ms."
+                    ).format(sender, latency),
+                )
             else:
                 self.networkWidget.addServerMessage(
                     self.tr("CTCP"),
-                    self.tr(
-                        "Received unknown CTCP-{0} response from {1}.")
-                    .format(ctcpReply, sender))
-    
+                    self.tr("Received unknown CTCP-{0} response from {1}.").format(
+                        ctcpReply, sender
+                    ),
+                )
+
     def __handleNamedMessage(self, match):
         """
         Private method to handle a server message containing a message name.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
@@ -667,11 +667,11 @@
                 msg = match.group(3).split(":", 1)[1]
             except IndexError:
                 msg = match.group(3)
-            
+
             if msg.startswith("\x01"):
                 self.__handleCtcpReply(match)
                 return True
-            
+
             if "!" in match.group(1):
                 name = match.group(1).split("!", 1)[0]
                 msg = "-{0}- {1}".format(name, msg)
@@ -683,27 +683,26 @@
                 # :foo MODE foo :+i
                 name, modes = match.group(3).split(" :")
                 sourceNick = match.group(1)
-                if (
-                    not self.isChannelName(name) and
-                    name == self.__nickName
-                ):
+                if not self.isChannelName(name) and name == self.__nickName:
                     if sourceNick == self.__nickName:
                         msg = self.tr(
-                            "You have set your personal modes to"
-                            " <b>[{0}]</b>.").format(modes)
+                            "You have set your personal modes to" " <b>[{0}]</b>."
+                        ).format(modes)
                     else:
                         msg = self.tr(
-                            "{0} has changed your personal modes to"
-                            " <b>[{1}]</b>.").format(sourceNick, modes)
+                            "{0} has changed your personal modes to" " <b>[{1}]</b>."
+                        ).format(sourceNick, modes)
                     self.networkWidget.addServerMessage(
-                        self.tr("Mode"), msg, filterMsg=False)
+                        self.tr("Mode"), msg, filterMsg=False
+                    )
                     return True
         elif name == "PART":
             nick = match.group(1).split("!", 1)[0]
             if nick == self.__nickName:
                 channel = match.group(3).split(None, 1)[0]
                 self.networkWidget.addMessage(
-                    self.tr("You have left channel {0}.").format(channel))
+                    self.tr("You have left channel {0}.").format(channel)
+                )
                 return True
         elif name == "QUIT":
             # don't do anything with it here
@@ -714,45 +713,46 @@
             newNick = match.group(3).split(":", 1)[1]
             if oldNick == self.__nickName:
                 self.networkWidget.addMessage(
-                    self.tr("You are now known as {0}.").format(newNick))
+                    self.tr("You are now known as {0}.").format(newNick)
+                )
                 self.__nickName = newNick
                 self.networkWidget.setNickName(newNick)
             else:
                 self.networkWidget.addMessage(
-                    self.tr("User {0} is now known as {1}.").format(
-                        oldNick, newNick))
+                    self.tr("User {0} is now known as {1}.").format(oldNick, newNick)
+                )
             return True
         elif name == "PONG":
             nick = match.group(3).split(":", 1)[1]
             self.networkWidget.addMessage(
-                self.tr("Received PONG from {0}").format(nick))
+                self.tr("Received PONG from {0}").format(nick)
+            )
             return True
         elif name == "ERROR":
             self.networkWidget.addErrorMessage(
-                self.tr("Server Error"), match.group(3).split(":", 1)[1])
+                self.tr("Server Error"), match.group(3).split(":", 1)[1]
+            )
             return True
-        
+
         return False
-    
+
     def __handleNumericMessage(self, match):
         """
         Private method to handle a server message containing a numeric code.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
         code = int(match.group(2))
         if code < 400:
-            return self.__handleServerReply(
-                code, match.group(1), match.group(3))
+            return self.__handleServerReply(code, match.group(1), match.group(3))
         else:
-            return self.__handleServerError(
-                code, match.group(1), match.group(3))
-    
+            return self.__handleServerError(code, match.group(1), match.group(3))
+
     def __handleServerError(self, code, server, message):
         """
         Private slot to handle a server error reply.
-        
+
         @param code numerical code sent by the server (integer)
         @param server name of the server (string)
         @param message message sent by the server (string)
@@ -765,13 +765,13 @@
                 self.__handleNickInUse()
         else:
             self.networkWidget.addServerMessage(self.tr("Error"), message)
-        
+
         return True
-    
+
     def __handleServerReply(self, code, server, message):
         """
         Private slot to handle a server reply.
-        
+
         @param code numerical code sent by the server (integer)
         @param server name of the server (string)
         @param message message sent by the server (string)
@@ -790,7 +790,7 @@
             msgType = self.tr("Away")
         else:
             msgType = self.tr("Info ({0})").format(code)
-        
+
         # special treatment for some messages
         if code == 375:
             message = self.tr("Message of the day")
@@ -799,19 +799,18 @@
         elif code == 4:
             parts = message.strip().split()
             message = self.tr(
-                "Server {0} (Version {1}), User-Modes: {2},"
-                " Channel-Modes: {3}"
+                "Server {0} (Version {1}), User-Modes: {2}," " Channel-Modes: {3}"
             ).format(parts[1], parts[2], parts[3], parts[4])
         elif code == 265:
             parts = message.strip().split()
-            message = self.tr(
-                "Current users on {0}: {1}, max. {2}").format(
-                server, parts[1], parts[2])
+            message = self.tr("Current users on {0}: {1}, max. {2}").format(
+                server, parts[1], parts[2]
+            )
         elif code == 266:
             parts = message.strip().split()
-            message = self.tr(
-                "Current users on the network: {0}, max. {1}").format(
-                parts[1], parts[2])
+            message = self.tr("Current users on the network: {0}, max. {1}").format(
+                parts[1], parts[2]
+            )
         elif code == 305:
             message = self.tr("You are no longer marked as being away.")
         elif code == 306:
@@ -822,9 +821,9 @@
                 message = message[1:]
             else:
                 message = message.replace(":", "", 1)
-        
+
         self.networkWidget.addServerMessage(msgType, message)
-        
+
         if code == 1:
             # register with services after the welcome message
             self.__connectionState = IrcWidget.ServerConnected
@@ -842,9 +841,9 @@
             m = self.__chanTypesRe.match(message)
             if m:
                 self.__setChannelTypePrefixes(m.group(1))
-        
+
         return True
-    
+
     def __registerWithServices(self):
         """
         Private method to register to services.
@@ -855,7 +854,7 @@
             password = identity.getPassword()
             if service and password:
                 self.__send("PRIVMSG " + service + " :identify " + password)
-    
+
     def __autoJoinChannels(self):
         """
         Private slot to join channels automatically once a server got
@@ -866,11 +865,11 @@
                 name = channel.getName()
                 key = channel.getKey()
                 self.joinChannel(name, key)
-    
+
     def __tcpError(self, error):
         """
         Private slot to handle errors reported by the TCP socket.
-        
+
         @param error error code reported by the socket
             (QAbstractSocket.SocketError)
         """
@@ -881,45 +880,52 @@
                     self.tr("SSL Error"),
                     self.tr(
                         """Connection to server {0} (port {1}) lost while"""
-                        """ waiting for user response to an SSL error.""")
-                    .format(self.__server.getName(), self.__server.getPort()))
+                        """ waiting for user response to an SSL error."""
+                    ).format(self.__server.getName(), self.__server.getPort()),
+                )
                 self.__connectionState = IrcWidget.ServerDisconnected
         elif error == QAbstractSocket.SocketError.HostNotFoundError:
             self.networkWidget.addErrorMessage(
                 self.tr("Socket Error"),
                 self.tr(
                     "The host was not found. Please check the host name"
-                    " and port settings."))
+                    " and port settings."
+                ),
+            )
         elif error == QAbstractSocket.SocketError.ConnectionRefusedError:
             self.networkWidget.addErrorMessage(
                 self.tr("Socket Error"),
                 self.tr(
                     "The connection was refused by the peer. Please check the"
-                    " host name and port settings."))
+                    " host name and port settings."
+                ),
+            )
         elif error == QAbstractSocket.SocketError.SslHandshakeFailedError:
             self.networkWidget.addErrorMessage(
-                self.tr("Socket Error"),
-                self.tr("The SSL handshake failed."))
+                self.tr("Socket Error"), self.tr("The SSL handshake failed.")
+            )
         else:
             if self.__socket:
                 self.networkWidget.addErrorMessage(
                     self.tr("Socket Error"),
-                    self.tr(
-                        "The following network error occurred:<br/>{0}")
-                    .format(self.__socket.errorString()))
+                    self.tr("The following network error occurred:<br/>{0}").format(
+                        self.__socket.errorString()
+                    ),
+                )
             else:
                 self.networkWidget.addErrorMessage(
-                    self.tr("Socket Error"),
-                    self.tr("A network error occurred."))
-    
+                    self.tr("Socket Error"), self.tr("A network error occurred.")
+                )
+
     def __sslErrors(self, errors):
         """
         Private slot to handle SSL errors.
-        
+
         @param errors list of SSL errors (list of QSslError)
         """
         ignored, defaultChanged = self.__sslErrorHandler.sslErrors(
-            errors, self.__server.getName(), self.__server.getPort())
+            errors, self.__server.getName(), self.__server.getPort()
+        )
         if ignored == EricSslErrorState.NOT_IGNORED:
             self.networkWidget.addErrorMessage(
                 self.tr("SSL Error"),
@@ -927,28 +933,31 @@
                     """Could not connect to {0} (port {1}) using an SSL"""
                     """ encrypted connection. Either the server does not"""
                     """ support SSL (did you use the correct port?) or"""
-                    """ you rejected the certificate.""")
-                .format(self.__server.getName(), self.__server.getPort()))
+                    """ you rejected the certificate."""
+                ).format(self.__server.getName(), self.__server.getPort()),
+            )
             self.__socket.close()
         else:
             if defaultChanged:
                 self.__socket.setSslConfiguration(
-                    QSslConfiguration.defaultConfiguration())
+                    QSslConfiguration.defaultConfiguration()
+                )
             if ignored == EricSslErrorState.USER_IGNORED:
                 self.networkWidget.addErrorMessage(
                     self.tr("SSL Error"),
                     self.tr(
                         """The SSL certificate for the server {0} (port {1})"""
                         """ failed the authenticity check. SSL errors"""
-                        """ were accepted by you.""")
-                    .format(self.__server.getName(), self.__server.getPort()))
+                        """ were accepted by you."""
+                    ).format(self.__server.getName(), self.__server.getPort()),
+                )
             if self.__connectionState == IrcWidget.ServerConnecting:
                 self.__socket.ignoreSslErrors()
-    
+
     def __setUserPrivilegePrefix(self, prefix1, prefix2):
         """
         Private method to set the user privilege prefix.
-        
+
         @param prefix1 first part of the prefix (string)
         @param prefix2 indictors the first part gets mapped to (string)
         """
@@ -958,21 +967,21 @@
         for i in range(len(prefix1)):
             self.__userPrefix["+" + prefix1[i]] = prefix2[i]
             self.__userPrefix["-" + prefix1[i]] = ""
-    
+
     def __ping(self, match):
         """
         Private method to handle a PING message.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
         self.__send("PONG " + match.group(1))
         return True
-    
+
     def __handleCtcp(self, match):
         """
         Private method to handle a CTCP command.
-        
+
         @param match reference to the match object
         @return flag indicating, if the message was handled (boolean)
         """
@@ -996,35 +1005,39 @@
                 self.networkWidget.addServerMessage(
                     self.tr("CTCP"),
                     self.tr("Received Version request from {0}.").format(
-                        match.group(1)))
+                        match.group(1)
+                    ),
+                )
                 self.__sendCtcpReply(match.group(1), "VERSION " + msg)
             elif ctcpRequest == "ping":
                 self.networkWidget.addServerMessage(
                     self.tr("CTCP"),
                     self.tr(
-                        "Received CTCP-PING request from {0},"
-                        " sending answer.").format(match.group(1)))
-                self.__sendCtcpReply(
-                    match.group(1), "PING {0}".format(ctcpArg))
+                        "Received CTCP-PING request from {0}," " sending answer."
+                    ).format(match.group(1)),
+                )
+                self.__sendCtcpReply(match.group(1), "PING {0}".format(ctcpArg))
             elif ctcpRequest == "clientinfo":
                 self.networkWidget.addServerMessage(
                     self.tr("CTCP"),
                     self.tr(
-                        "Received CTCP-CLIENTINFO request from {0},"
-                        " sending answer.").format(match.group(1)))
+                        "Received CTCP-CLIENTINFO request from {0}," " sending answer."
+                    ).format(match.group(1)),
+                )
                 self.__sendCtcpReply(
-                    match.group(1),
-                    "CLIENTINFO CLIENTINFO PING VERSION")
+                    match.group(1), "CLIENTINFO CLIENTINFO PING VERSION"
+                )
             else:
                 self.networkWidget.addServerMessage(
                     self.tr("CTCP"),
-                    self.tr(
-                        "Received unknown CTCP-{0} request from {1}.")
-                    .format(ctcpRequest, match.group(1)))
+                    self.tr("Received unknown CTCP-{0} request from {1}.").format(
+                        ctcpRequest, match.group(1)
+                    ),
+                )
             return True
-        
+
         return False
-    
+
     def __updateUsersCount(self):
         """
         Private method to update the users count on the channel tabs.
@@ -1034,16 +1047,17 @@
             self.channelsWidget.setTabText(
                 index,
                 self.tr("{0} ({1})", "channel name, users count").format(
-                    channel.name(), channel.getUsersCount()))
-    
+                    channel.name(), channel.getUsersCount()
+                ),
+            )
+
     def __handleNickInUseLogin(self):
         """
         Private method to handle a 443 server error at login.
         """
         self.__nickIndex += 1
         try:
-            identity = self.__ircNetworkManager.getIdentity(
-                self.__identityName)
+            identity = self.__ircNetworkManager.getIdentity(self.__identityName)
             if identity:
                 nick = identity.getNickNames()[self.__nickIndex]
                 self.__nickName = nick
@@ -1057,66 +1071,66 @@
                 self.tr("Critical"),
                 self.tr(
                     "No nickname acceptable to the server configured"
-                    " for <b>{0}</b>. Disconnecting...")
-                .format(self.__userName),
-                filterMsg=False)
+                    " for <b>{0}</b>. Disconnecting..."
+                ).format(self.__userName),
+                filterMsg=False,
+            )
             self.__connectNetwork("", False, True)
             self.__nickName = ""
             self.__nickIndex = -1
             return
-        
+
         self.networkWidget.setNickName(nick)
         self.__send("NICK " + nick)
-    
+
     def __handleNickInUse(self):
         """
         Private method to handle a 443 server error.
         """
         self.networkWidget.addServerMessage(
-            self.tr("Critical"),
-            self.tr("The given nickname is already in use."))
-    
+            self.tr("Critical"), self.tr("The given nickname is already in use.")
+        )
+
     def __changeNick(self, nick):
         """
         Private slot to use a new nick name.
-        
+
         @param nick nick name to use (str)
         """
         if nick and nick != self.__nickName:
             self.__send("NICK " + nick)
-    
+
     def __setChannelTypePrefixes(self, prefixes):
         """
         Private method to set the channel type prefixes.
-        
+
         @param prefixes channel prefix characters (string)
         """
         self.__channelTypePrefixes = prefixes
-    
+
     def isChannelName(self, name):
         """
         Public method to check, if the given name is a channel name.
-        
+
         @param name name to check (string)
         @return flag indicating a channel name (boolean)
         """
         if not name:
             return False
-        
+
         if self.__channelTypePrefixes:
             return name[0] in self.__channelTypePrefixes
         else:
             return name[0] in "#&"
-    
+
     def __away(self, isAway):
         """
         Private slot handling the change of the away state.
-        
+
         @param isAway flag indicating the current away state (boolean)
         """
         if isAway and self.__identityName:
-            identity = self.__ircNetworkManager.getIdentity(
-                self.__identityName)
+            identity = self.__ircNetworkManager.getIdentity(self.__identityName)
             if identity and identity.rememberAwayPosition():
                 for channel in self.__channelList:
                     channel.setMarkerLine()
--- a/src/eric7/PipInterface/Pip.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/Pip.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,20 +12,18 @@
 import json
 import contextlib
 
-from PyQt6.QtCore import (
-    pyqtSlot, QObject, QProcess, QUrl, QCoreApplication, QThread
-)
+from PyQt6.QtCore import pyqtSlot, QObject, QProcess, QUrl, QCoreApplication, QThread
 from PyQt6.QtWidgets import QDialog, QInputDialog, QLineEdit
-from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply
-)
+from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
 
 from EricWidgets import EricMessageBox
 from EricWidgets.EricApplication import ericApp
 
 from EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired
+
 try:
     from EricNetwork.EricSslErrorHandler import EricSslErrorHandler
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -41,63 +39,66 @@
     """
     Class implementing the pip GUI logic.
     """
+
     DefaultPyPiUrl = "https://pypi.org"
     DefaultIndexUrlPypi = DefaultPyPiUrl + "/pypi"
     DefaultIndexUrlSimple = DefaultPyPiUrl + "/simple"
     DefaultIndexUrlSearch = DefaultPyPiUrl + "/search/"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the user interface object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__ui = parent
-        
+
         # attributes for the network objects
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
+            proxyAuthenticationRequired
+        )
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
             self.__networkManager.sslErrors.connect(
-                self.__sslErrorHandler.sslErrorsReply)
+                self.__sslErrorHandler.sslErrorsReply
+            )
         self.__replies = []
-        
+
         self.__vulnerabilityChecker = PipVulnerabilityChecker(self, self)
-    
+
     def getNetworkAccessManager(self):
         """
         Public method to get a reference to the network access manager object.
-        
+
         @return reference to the network access manager object
         @rtype QNetworkAccessManager
         """
         return self.__networkManager
-    
+
     def getVulnerabilityChecker(self):
         """
         Public method to get a reference to the vulnerability checker object.
-        
+
         @return reference to the vulnerability checker object
         @rtype PipVulnerabilityChecker
         """
         return self.__vulnerabilityChecker
-    
+
     ##########################################################################
     ## Methods below implement some utility functions
     ##########################################################################
-    
+
     def runProcess(self, args, interpreter):
         """
         Public method to execute the current pip with the given arguments.
-        
+
         The selected pip executable is called with the given arguments and
         waited for its end.
-        
+
         @param args list of command line arguments
         @type list of str
         @param interpreter path of the Python interpreter to be used
@@ -107,7 +108,7 @@
         @rtype tuple of (bool, str)
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         process = QProcess()
         process.start(interpreter, args)
         procStarted = process.waitForStarted()
@@ -115,27 +116,28 @@
             finished = process.waitForFinished(30000)
             if finished:
                 if process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(), ioEncoding,
-                                 'replace')
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                     return True, output
                 else:
-                    return (False,
-                            self.tr("python exited with an error ({0}).")
-                            .format(process.exitCode()))
+                    return (
+                        False,
+                        self.tr("python exited with an error ({0}).").format(
+                            process.exitCode()
+                        ),
+                    )
             else:
                 process.terminate()
                 process.waitForFinished(2000)
                 process.kill()
                 process.waitForFinished(3000)
-                return False, self.tr("python did not finish within"
-                                      " 30 seconds.")
-        
+                return False, self.tr("python did not finish within" " 30 seconds.")
+
         return False, self.tr("python could not be started.")
-    
+
     def getUserConfig(self):
         """
         Public method to get the name of the user configuration file.
-        
+
         @return path of the user configuration file
         @rtype str
         """
@@ -143,24 +145,23 @@
         # OS X:     ~/Library/Application Support/pip/pip.conf
         # Windows:  %APPDATA%\pip\pip.ini
         # Environment: $PIP_CONFIG_FILE
-        
+
         with contextlib.suppress(KeyError):
             return os.environ["PIP_CONFIG_FILE"]
-        
+
         if Globals.isWindowsPlatform():
             config = os.path.join(os.environ["APPDATA"], "pip", "pip.ini")
         elif Globals.isMacPlatform():
-            config = os.path.expanduser(
-                "~/Library/Application Support/pip/pip.conf")
+            config = os.path.expanduser("~/Library/Application Support/pip/pip.conf")
         else:
             config = os.path.expanduser("~/.config/pip/pip.conf")
-        
+
         return config
-    
+
     def getVirtualenvConfig(self, venvName):
         """
         Public method to get the name of the virtualenv configuration file.
-        
+
         @param venvName name of the environment to get config file path for
         @type str
         @return path of the virtualenv configuration file
@@ -168,24 +169,24 @@
         """
         # Unix, OS X:   $VIRTUAL_ENV/pip.conf
         # Windows:      %VIRTUAL_ENV%\pip.ini
-        
+
         pip = "pip.ini" if Globals.isWindowsPlatform() else "pip.conf"
-        
+
         venvManager = ericApp().getObject("VirtualEnvManager")
         venvDirectory = (
             os.path.dirname(self.getUserConfig())
-            if venvManager.isGlobalEnvironment(venvName) else
-            venvManager.getVirtualenvDirectory(venvName)
+            if venvManager.isGlobalEnvironment(venvName)
+            else venvManager.getVirtualenvDirectory(venvName)
         )
-        
+
         config = os.path.join(venvDirectory, pip) if venvDirectory else ""
-        
+
         return config
-    
+
     def getProjectEnvironmentString(self):
         """
         Public method to get the string for the project environment.
-        
+
         @return string for the project environment
         @rtype str
         """
@@ -193,11 +194,11 @@
             return self.tr("<project>")
         else:
             return ""
-    
+
     def getVirtualenvInterpreter(self, venvName):
         """
         Public method to get the interpreter for a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @return interpreter path
@@ -205,23 +206,27 @@
         """
         interpreter = (
             ericApp().getObject("Project").getProjectInterpreter()
-            if venvName == self.getProjectEnvironmentString() else
-            ericApp().getObject("VirtualEnvManager")
+            if venvName == self.getProjectEnvironmentString()
+            else ericApp()
+            .getObject("VirtualEnvManager")
             .getVirtualenvInterpreter(venvName)
         )
         if not interpreter:
             EricMessageBox.critical(
                 None,
                 self.tr("Interpreter for Virtual Environment"),
-                self.tr("""No interpreter configured for the selected"""
-                        """ virtual environment."""))
-        
+                self.tr(
+                    """No interpreter configured for the selected"""
+                    """ virtual environment."""
+                ),
+            )
+
         return interpreter
-    
+
     def getVirtualenvNames(self, noRemote=False, noConda=False):
         """
         Public method to get a sorted list of virtual environment names.
-        
+
         @param noRemote flag indicating to exclude environments for remote
             debugging
         @type bool
@@ -231,13 +236,15 @@
         @rtype list of str
         """
         return sorted(
-            ericApp().getObject("VirtualEnvManager").getVirtualenvNames(
-                noRemote=noRemote, noConda=noConda))
-    
+            ericApp()
+            .getObject("VirtualEnvManager")
+            .getVirtualenvNames(noRemote=noRemote, noConda=noConda)
+        )
+
     def installPip(self, venvName, userSite=False):
         """
         Public method to install pip.
-        
+
         @param venvName name of the environment to install pip into
         @type str
         @param userSite flag indicating an install to the user install
@@ -247,91 +254,102 @@
         interpreter = self.getVirtualenvInterpreter(venvName)
         if not interpreter:
             return
-        
-        dia = PipDialog(self.tr('Install PIP'))
+
+        dia = PipDialog(self.tr("Install PIP"))
         commands = (
             [(interpreter, ["-m", "ensurepip", "--user"])]
-            if userSite else
-            [(interpreter, ["-m", "ensurepip"])]
+            if userSite
+            else [(interpreter, ["-m", "ensurepip"])]
         )
         if Preferences.getPip("PipSearchIndex"):
             indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
-            args = ["-m", "pip", "install", "--index-url", indexUrl,
-                    "--upgrade"]
+            args = ["-m", "pip", "install", "--index-url", indexUrl, "--upgrade"]
         else:
             args = ["-m", "pip", "install", "--upgrade"]
         if userSite:
             args.append("--user")
         args.append("pip")
         commands.append((interpreter, args[:]))
-    
+
         res = dia.startProcesses(commands)
         if res:
             dia.exec()
-    
+
     @pyqtSlot()
     def repairPip(self, venvName):
         """
         Public method to repair the pip installation.
-        
+
         @param venvName name of the environment to install pip into
         @type str
         """
         interpreter = self.getVirtualenvInterpreter(venvName)
         if not interpreter:
             return
-        
+
         # python -m pip install --ignore-installed pip
         if Preferences.getPip("PipSearchIndex"):
             indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
-            args = ["-m", "pip", "install", "--index-url", indexUrl,
-                    "--ignore-installed"]
+            args = [
+                "-m",
+                "pip",
+                "install",
+                "--index-url",
+                indexUrl,
+                "--ignore-installed",
+            ]
         else:
             args = ["-m", "pip", "install", "--ignore-installed"]
         args.append("pip")
-        
-        dia = PipDialog(self.tr('Repair PIP'))
+
+        dia = PipDialog(self.tr("Repair PIP"))
         res = dia.startProcess(interpreter, args)
         if res:
             dia.exec()
-    
+
     def __checkUpgradePyQt(self, packages):
         """
         Private method to check, if an upgrade of PyQt packages is attempted.
-        
+
         @param packages list of packages to upgrade
         @type list of str
         @return flag indicating a PyQt upgrade
         @rtype bool
         """
         pyqtPackages = [
-            p for p in packages if p.lower() in [
-                "pyqt6", "pyqt6-sip", "pyqt6-webengine", "pyqt6-charts",
-                "pyqt6-qscintilla", "pyqt6-qt6", "pyqt6-webengine-qt6",
-                "pyqt6-charts-qt6"
+            p
+            for p in packages
+            if p.lower()
+            in [
+                "pyqt6",
+                "pyqt6-sip",
+                "pyqt6-webengine",
+                "pyqt6-charts",
+                "pyqt6-qscintilla",
+                "pyqt6-qt6",
+                "pyqt6-webengine-qt6",
+                "pyqt6-charts-qt6",
             ]
         ]
         return bool(pyqtPackages)
-    
+
     def __checkUpgradeEric(self, packages):
         """
         Private method to check, if an upgrade of the eric-ide package is
         attempted.
-        
+
         @param packages list of packages to upgrade
         @type list of str
         @return flag indicating an eric-ide upgrade
         @rtype bool
         """
-        ericPackages = [
-            p for p in packages if p.lower() == "eric-ide"
-        ]
+        ericPackages = [p for p in packages if p.lower() == "eric-ide"]
         return bool(ericPackages)
-    
+
     def upgradePackages(self, packages, venvName, userSite=False):
         """
         Public method to upgrade the given list of packages.
-        
+
         @param packages list of packages to upgrade
         @type list of str
         @param venvName name of the virtual environment to be used
@@ -344,9 +362,10 @@
         """
         if not venvName:
             return False
-        
+
         if self.getVirtualenvInterpreter(venvName) in (
-            sys.executable, Globals.getPythonExecutable()
+            sys.executable,
+            Globals.getPythonExecutable(),
         ):
             upgradePyQt = self.__checkUpgradePyQt(packages)
             upgradeEric = self.__checkUpgradeEric(packages)
@@ -358,34 +377,39 @@
                         self.__ui.upgradeEric()
                     elif upgradePyQt:
                         self.__ui.upgradePyQt()
-                    return None     # should not be reached; play it safe
+                    return None  # should not be reached; play it safe
                 except AttributeError:
                     return False
-        
+
         interpreter = self.getVirtualenvInterpreter(venvName)
         if not interpreter:
             return False
-        
+
         if Preferences.getPip("PipSearchIndex"):
             indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
-            args = ["-m", "pip", "install", "--index-url", indexUrl,
-                    "--upgrade"]
+            args = ["-m", "pip", "install", "--index-url", indexUrl, "--upgrade"]
         else:
             args = ["-m", "pip", "install", "--upgrade"]
         if userSite:
             args.append("--user")
         args += packages
-        dia = PipDialog(self.tr('Upgrade Packages'))
+        dia = PipDialog(self.tr("Upgrade Packages"))
         res = dia.startProcess(interpreter, args)
         if res:
             dia.exec()
         return res
-    
-    def installPackages(self, packages, venvName="", userSite=False,
-                        interpreter="", forceReinstall=False):
+
+    def installPackages(
+        self,
+        packages,
+        venvName="",
+        userSite=False,
+        interpreter="",
+        forceReinstall=False,
+    ):
         """
         Public method to install the given list of packages.
-        
+
         @param packages list of packages to install
         @type list of str
         @param venvName name of the virtual environment to be used
@@ -403,7 +427,7 @@
             interpreter = self.getVirtualenvInterpreter(venvName)
             if not interpreter:
                 return
-        
+
         if interpreter:
             if Preferences.getPip("PipSearchIndex"):
                 indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
@@ -415,19 +439,20 @@
             if forceReinstall:
                 args.append("--force-reinstall")
             args += packages
-            dia = PipDialog(self.tr('Install Packages'))
+            dia = PipDialog(self.tr("Install Packages"))
             res = dia.startProcess(interpreter, args)
             if res:
                 dia.exec()
-    
+
     def installRequirements(self, venvName):
         """
         Public method to install packages as given in a requirements file.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
         from .PipFileSelectionDialog import PipFileSelectionDialog
+
         dlg = PipFileSelectionDialog(self, "requirements")
         if dlg.exec() == QDialog.DialogCode.Accepted:
             requirements, user = dlg.getData()
@@ -435,7 +460,7 @@
                 interpreter = self.getVirtualenvInterpreter(venvName)
                 if not interpreter:
                     return
-                
+
                 if Preferences.getPip("PipSearchIndex"):
                     indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
                     args = ["-m", "pip", "install", "--index-url", indexUrl]
@@ -444,15 +469,15 @@
                 if user:
                     args.append("--user")
                 args += ["--requirement", requirements]
-                dia = PipDialog(self.tr('Install Packages from Requirements'))
+                dia = PipDialog(self.tr("Install Packages from Requirements"))
                 res = dia.startProcess(interpreter, args)
                 if res:
                     dia.exec()
-    
+
     def uninstallPackages(self, packages, venvName):
         """
         Public method to uninstall the given list of packages.
-        
+
         @param packages list of packages to uninstall
         @type list of str
         @param venvName name of the virtual environment to be used
@@ -462,37 +487,36 @@
         """
         res = False
         if packages and venvName:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Uninstall Packages"),
-                self.tr(
-                    "Do you really want to uninstall these packages?"),
-                packages)
+                self.tr("Do you really want to uninstall these packages?"),
+                packages,
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 interpreter = self.getVirtualenvInterpreter(venvName)
                 if not interpreter:
                     return False
                 args = ["-m", "pip", "uninstall", "--yes"] + packages
-                dia = PipDialog(self.tr('Uninstall Packages'))
+                dia = PipDialog(self.tr("Uninstall Packages"))
                 res = dia.startProcess(interpreter, args)
                 if res:
                     dia.exec()
         return res
-    
+
     def uninstallRequirements(self, venvName):
         """
         Public method to uninstall packages as given in a requirements file.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
         if venvName:
             from .PipFileSelectionDialog import PipFileSelectionDialog
-            dlg = PipFileSelectionDialog(self, "requirements",
-                                         install=False)
+
+            dlg = PipFileSelectionDialog(self, "requirements", install=False)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 requirements, _user = dlg.getData()
                 if requirements and os.path.exists(requirements):
@@ -501,79 +525,79 @@
                             reqs = f.read().splitlines()
                     except OSError:
                         return
-                    
+
                     from UI.DeleteFilesConfirmationDialog import (
-                        DeleteFilesConfirmationDialog
+                        DeleteFilesConfirmationDialog,
                     )
+
                     dlg = DeleteFilesConfirmationDialog(
                         self.parent(),
                         self.tr("Uninstall Packages"),
-                        self.tr(
-                            "Do you really want to uninstall these packages?"),
-                        reqs)
+                        self.tr("Do you really want to uninstall these packages?"),
+                        reqs,
+                    )
                     if dlg.exec() == QDialog.DialogCode.Accepted:
                         interpreter = self.getVirtualenvInterpreter(venvName)
                         if not interpreter:
                             return
-                        
-                        args = ["-m", "pip", "uninstall", "--requirement",
-                                requirements]
-                        dia = PipDialog(
-                            self.tr('Uninstall Packages from Requirements'))
+
+                        args = ["-m", "pip", "uninstall", "--requirement", requirements]
+                        dia = PipDialog(self.tr("Uninstall Packages from Requirements"))
                         res = dia.startProcess(interpreter, args)
                         if res:
                             dia.exec()
-    
+
     def getIndexUrl(self):
         """
         Public method to get the index URL for PyPI.
-        
+
         @return index URL for PyPI
         @rtype str
         """
         indexUrl = (
             Preferences.getPip("PipSearchIndex") + "/simple"
-            if Preferences.getPip("PipSearchIndex") else
-            Pip.DefaultIndexUrlSimple
+            if Preferences.getPip("PipSearchIndex")
+            else Pip.DefaultIndexUrlSimple
         )
-        
+
         return indexUrl
-    
+
     def getIndexUrlPypi(self):
         """
         Public method to get the index URL for PyPI API calls.
-        
+
         @return index URL for XML RPC calls
         @rtype str
         """
         indexUrl = (
             Preferences.getPip("PipSearchIndex") + "/pypi"
-            if Preferences.getPip("PipSearchIndex") else
-            Pip.DefaultIndexUrlPypi
+            if Preferences.getPip("PipSearchIndex")
+            else Pip.DefaultIndexUrlPypi
         )
-        
+
         return indexUrl
-    
+
     def getIndexUrlSearch(self):
         """
         Public method to get the index URL for PyPI API calls.
-        
+
         @return index URL for XML RPC calls
         @rtype str
         """
         indexUrl = (
             Preferences.getPip("PipSearchIndex") + "/search/"
-            if Preferences.getPip("PipSearchIndex") else
-            Pip.DefaultIndexUrlSearch
+            if Preferences.getPip("PipSearchIndex")
+            else Pip.DefaultIndexUrlSearch
         )
-        
+
         return indexUrl
-    
-    def getInstalledPackages(self, envName, localPackages=True,
-                             notRequired=False, usersite=False):
+
+    def getInstalledPackages(
+        self, envName, localPackages=True, notRequired=False, usersite=False
+    ):
         """
         Public method to get the list of installed packages.
-        
+
         @param envName name of the environment to get the packages for
         @type str
         @param localPackages flag indicating to get local packages only
@@ -588,12 +612,13 @@
         @rtype list of tuple of (str, str)
         """
         packages = []
-        
+
         if envName:
             interpreter = self.getVirtualenvInterpreter(envName)
             if interpreter:
                 args = [
-                    "-m", "pip",
+                    "-m",
+                    "pip",
                     "list",
                     "--format=json",
                 ]
@@ -603,36 +628,41 @@
                     args.append("--not-required")
                 if usersite:
                     args.append("--user")
-                
+
                 if Preferences.getPip("PipSearchIndex"):
                     indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
                     args += ["--index-url", indexUrl]
-                
+
                 proc = QProcess()
                 proc.start(interpreter, args)
                 if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-                    output = str(proc.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace').strip()
+                    output = str(
+                        proc.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    ).strip()
                     try:
                         jsonList = json.loads(output)
                     except Exception:
                         jsonList = []
-                    
+
                     for package in jsonList:
                         if isinstance(package, dict):
-                            packages.append((
-                                package["name"],
-                                package["version"],
-                            ))
-           
+                            packages.append(
+                                (
+                                    package["name"],
+                                    package["version"],
+                                )
+                            )
+
         return packages
-    
-    def getOutdatedPackages(self, envName, localPackages=True,
-                            notRequired=False, usersite=False):
+
+    def getOutdatedPackages(
+        self, envName, localPackages=True, notRequired=False, usersite=False
+    ):
         """
         Public method to get the list of outdated packages.
-        
+
         @param envName name of the environment to get the packages for
         @type str
         @param localPackages flag indicating to get local packages only
@@ -648,12 +678,13 @@
         @rtype list of tuple of (str, str, str)
         """
         packages = []
-        
+
         if envName:
             interpreter = self.getVirtualenvInterpreter(envName)
             if interpreter:
                 args = [
-                    "-m", "pip",
+                    "-m",
+                    "pip",
                     "list",
                     "--outdated",
                     "--format=json",
@@ -664,36 +695,40 @@
                     args.append("--not-required")
                 if usersite:
                     args.append("--user")
-                
+
                 if Preferences.getPip("PipSearchIndex"):
                     indexUrl = Preferences.getPip("PipSearchIndex") + "/simple"
                     args += ["--index-url", indexUrl]
-                
+
                 proc = QProcess()
                 proc.start(interpreter, args)
                 if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-                    output = str(proc.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace').strip()
+                    output = str(
+                        proc.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    ).strip()
                     try:
                         jsonList = json.loads(output)
                     except Exception:
                         jsonList = []
-                    
+
                     for package in jsonList:
                         if isinstance(package, dict):
-                            packages.append((
-                                package["name"],
-                                package["version"],
-                                package["latest_version"],
-                            ))
-           
+                            packages.append(
+                                (
+                                    package["name"],
+                                    package["version"],
+                                    package["latest_version"],
+                                )
+                            )
+
         return packages
-    
+
     def checkPackageOutdated(self, packageStart, envName):
         """
         Public method to check, if a group of packages is outdated.
-        
+
         @param packageStart start string for package names to be checked
             (case insensitive)
         @type str
@@ -705,20 +740,20 @@
         @rtype tuple of (bool, (str, str, str))
         """
         filteredPackages = []
-        
+
         if bool(envName) and bool(packageStart):
             packages = self.getOutdatedPackages(envName)
             filterStr = packageStart.lower()
             filteredPackages = [
-                p for p in packages
-                if p[0].lower().startswith(filterStr)]
-        
+                p for p in packages if p[0].lower().startswith(filterStr)
+            ]
+
         return bool(filteredPackages), filteredPackages
-    
+
     def getPackageDetails(self, name, version):
         """
         Public method to get package details using the PyPI JSON interface.
-        
+
         @param name package name
         @type str
         @param version package version
@@ -727,38 +762,37 @@
         @rtype dict
         """
         result = {}
-        
+
         if name and version:
-            url = "{0}/{1}/{2}/json".format(
-                self.getIndexUrlPypi(), name, version)
+            url = "{0}/{1}/{2}/json".format(self.getIndexUrlPypi(), name, version)
             request = QNetworkRequest(QUrl(url))
             reply = self.__networkManager.get(request)
             while not reply.isFinished():
                 QCoreApplication.processEvents()
                 QThread.msleep(100)
-            
+
             reply.deleteLater()
             if reply.error() == QNetworkReply.NetworkError.NoError:
-                data = str(reply.readAll(),
-                           Preferences.getSystem("IOEncoding"),
-                           'replace')
+                data = str(
+                    reply.readAll(), Preferences.getSystem("IOEncoding"), "replace"
+                )
                 with contextlib.suppress(Exception):
                     result = json.loads(data)
-        
+
         return result
-    
+
     def getPackageVersions(self, name):
         """
         Public method to get a list of versions available for the given
         package.
-        
+
         @param name package name
         @type str
         @return list of available versions
         @rtype list of str
         """
         result = []
-        
+
         if name:
             url = "{0}/{1}/json".format(self.getIndexUrlPypi(), name)
             request = QNetworkRequest(QUrl(url))
@@ -766,23 +800,24 @@
             while not reply.isFinished():
                 QCoreApplication.processEvents()
                 QThread.msleep(100)
-            
+
             reply.deleteLater()
             if reply.error() == QNetworkReply.NetworkError.NoError:
-                dataStr = str(reply.readAll(),
-                              Preferences.getSystem("IOEncoding"),
-                              'replace')
+                dataStr = str(
+                    reply.readAll(), Preferences.getSystem("IOEncoding"), "replace"
+                )
                 with contextlib.suppress(Exception):
                     data = json.loads(dataStr)
                     result = list(data["releases"].keys())
-        
+
         return result
-    
-    def getFrozenPackages(self, envName, localPackages=True, usersite=False,
-                          requirement=None):
+
+    def getFrozenPackages(
+        self, envName, localPackages=True, usersite=False, requirement=None
+    ):
         """
         Public method to get the list of package specifiers to freeze them.
-        
+
         @param envName name of the environment to get the package specifiers
             for
         @type str
@@ -798,12 +833,13 @@
         @rtype list of str
         """
         specifiers = []
-        
+
         if envName:
             interpreter = self.getVirtualenvInterpreter(envName)
             if interpreter:
                 args = [
-                    "-m", "pip",
+                    "-m",
+                    "pip",
                     "freeze",
                 ]
                 if localPackages:
@@ -813,22 +849,23 @@
                 if requirement and os.path.exists(requirement):
                     args.append("--requirement")
                     args.append(requirement)
-                
+
                 success, output = self.runProcess(args, interpreter)
                 if success and output:
-                    specifiers = [spec.strip() for spec in output.splitlines()
-                                  if spec.strip()]
-        
+                    specifiers = [
+                        spec.strip() for spec in output.splitlines() if spec.strip()
+                    ]
+
         return specifiers
-    
+
     #######################################################################
     ## Cache handling methods below
     #######################################################################
-    
+
     def showCacheInfo(self, venvName):
         """
         Public method to show some information about the pip cache.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
@@ -840,11 +877,11 @@
                 res = dia.startProcess(interpreter, args, showArgs=False)
                 if res:
                     dia.exec()
-    
+
     def cacheList(self, venvName):
         """
         Public method to list files contained in the pip cache.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
@@ -855,22 +892,22 @@
                     None,
                     self.tr("List Cached Files"),
                     self.tr("Enter a file pattern (empty for all):"),
-                    QLineEdit.EchoMode.Normal)
-                
+                    QLineEdit.EchoMode.Normal,
+                )
+
                 if ok:
                     args = ["-m", "pip", "cache", "list"]
                     if pattern.strip():
                         args.append(pattern.strip())
                     dia = PipDialog(self.tr("List Cached Files"))
-                    res = dia.startProcess(interpreter, args,
-                                           showArgs=False)
+                    res = dia.startProcess(interpreter, args, showArgs=False)
                     if res:
                         dia.exec()
-    
+
     def cacheRemove(self, venvName):
         """
         Public method to remove files from the pip cache.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
@@ -881,20 +918,20 @@
                     None,
                     self.tr("Remove Cached Files"),
                     self.tr("Enter a file pattern:"),
-                    QLineEdit.EchoMode.Normal)
-                
+                    QLineEdit.EchoMode.Normal,
+                )
+
                 if ok and pattern.strip():
                     args = ["-m", "pip", "cache", "remove", pattern.strip()]
                     dia = PipDialog(self.tr("Remove Cached Files"))
-                    res = dia.startProcess(interpreter, args,
-                                           showArgs=False)
+                    res = dia.startProcess(interpreter, args, showArgs=False)
                     if res:
                         dia.exec()
-    
+
     def cachePurge(self, venvName):
         """
         Public method to remove all files from the pip cache.
-        
+
         @param venvName name of the virtual environment to be used
         @type str
         """
@@ -904,25 +941,28 @@
                 ok = EricMessageBox.yesNo(
                     None,
                     self.tr("Purge Cache"),
-                    self.tr("Do you really want to purge the pip cache? All"
-                            " files need to be downloaded again."))
+                    self.tr(
+                        "Do you really want to purge the pip cache? All"
+                        " files need to be downloaded again."
+                    ),
+                )
                 if ok:
                     args = ["-m", "pip", "cache", "purge"]
                     dia = PipDialog(self.tr("Purge Cache"))
-                    res = dia.startProcess(interpreter, args,
-                                           showArgs=False)
+                    res = dia.startProcess(interpreter, args, showArgs=False)
                     if res:
                         dia.exec()
-    
+
     #######################################################################
     ## Dependency tree handling methods below
     #######################################################################
-    
-    def getDependencyTree(self, envName, localPackages=True, usersite=False,
-                          reverse=False):
+
+    def getDependencyTree(
+        self, envName, localPackages=True, usersite=False, reverse=False
+    ):
         """
         Public method to get the dependency tree of installed packages.
-        
+
         @param envName name of the environment to get the packages for
         @type str
         @param localPackages flag indicating to get the tree for local
@@ -939,11 +979,12 @@
         @rtype list of dict
         """
         dependencies = []
-        
+
         if envName:
             interpreter = self.getVirtualenvInterpreter(envName)
             if interpreter:
                 from . import pipdeptree
+
                 with open(pipdeptree.__file__, "r") as f:
                     content = f.read()
                 args = [
@@ -957,27 +998,28 @@
                     args.append("--user-only")
                 if reverse:
                     args.append("--reverse")
-                
+
                 proc = QProcess()
                 proc.start(interpreter, args)
                 if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-                    output = str(proc.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace').strip()
+                    output = str(
+                        proc.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    ).strip()
                     with contextlib.suppress(json.JSONDecodeError):
                         dependencies = json.loads(output)
-        
+
         return dependencies
-    
+
     #######################################################################
     ## License handling methods below
     #######################################################################
-    
-    def getLicenses(self, envName, localPackages=True, usersite=False,
-                    summary=False):
+
+    def getLicenses(self, envName, localPackages=True, usersite=False, summary=False):
         """
         Public method to get the licenses per package for a given environment.
-        
+
         @param envName name of the environment to get the licenses for
         @type str
         @param localPackages flag indicating to get the licenses for local
@@ -994,11 +1036,12 @@
         @rtype dict
         """
         licenses = []
-        
+
         if envName:
             interpreter = self.getVirtualenvInterpreter(envName)
             if interpreter:
                 from . import piplicenses
+
                 with open(piplicenses.__file__, "r") as f:
                     content = f.read()
                 args = [
@@ -1017,23 +1060,25 @@
                     args.append("--user-only")
                 if summary:
                     args.append("--summary")
-                
+
                 proc = QProcess()
                 proc.start(interpreter, args)
                 if proc.waitForStarted(15000) and proc.waitForFinished(30000):
-                    output = str(proc.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace').strip()
+                    output = str(
+                        proc.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    ).strip()
                     with contextlib.suppress(json.JSONDecodeError):
                         licenses = json.loads(output)
-        
+
         return licenses
-    
+
     def getLicensesSummary(self, envName, localPackages=True, usersite=False):
         """
         Public method to get a summary of licenses found in a given
         environment.
-        
+
         @param envName name of the environment to get the licenses summary for
         @type str
         @param localPackages flag indicating to get the licenses summary for
@@ -1046,5 +1091,6 @@
             packages
         @rtype dict
         """
-        return self.getLicenses(envName, localPackages=localPackages,
-                                usersite=usersite, summary=True)
+        return self.getLicenses(
+            envName, localPackages=localPackages, usersite=usersite, summary=True
+        )
--- a/src/eric7/PipInterface/PipDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,9 +7,7 @@
 Module implementing a dialog showing the output of a pip command.
 """
 
-from PyQt6.QtCore import (
-    pyqtSlot, Qt, QCoreApplication, QTimer, QProcess
-)
+from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication, QTimer, QProcess
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
 
 from EricWidgets import EricMessageBox
@@ -24,10 +22,11 @@
     Class implementing a dialog showing the output of a 'python -m pip'
     command.
     """
+
     def __init__(self, text, parent=None):
         """
         Constructor
-        
+
         @param text text to be shown by the label
         @type str
         @param parent reference to the parent widget
@@ -35,100 +34,97 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.proc = None
         self.__processQueue = []
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.outputGroup.setTitle(text)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event
         @type QCloseEvent
         """
         self.__cancel()
         e.accept()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.proc is not None and
-            self.proc.state() != QProcess.ProcessState.NotRunning
+            self.proc is not None
+            and self.proc.state() != QProcess.ProcessState.NotRunning
         ):
             self.proc.terminate()
             QTimer.singleShot(2000, self.proc.kill)
             self.proc.waitForFinished(3000)
-        
+
         self.proc = None
-        
+
         if self.__processQueue:
             cmd, args = self.__processQueue.pop(0)
             self.__addOutput("\n\n")
             self.startProcess(cmd, args)
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setDefault(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+                Qt.FocusReason.OtherFocusReason
+            )
+
     def __cancel(self):
         """
         Private slot to cancel the current action.
         """
         self.__processQueue = []
         self.__finish()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__cancel()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
         @type QProcess.ExitStatus
         """
         self.__finish()
-    
+
     def startProcess(self, cmd, args, showArgs=True):
         """
         Public slot used to start the process.
-        
+
         @param cmd name of the pip executable to be used
         @type str
         @param args list of arguments for the process
@@ -140,11 +136,11 @@
         """
         if len(self.errors.toPlainText()) == 0:
             self.errorGroup.hide()
-        
+
         if showArgs:
-            self.resultbox.append(cmd + ' ' + ' '.join(args))
-            self.resultbox.append('')
-        
+            self.resultbox.append(cmd + " " + " ".join(args))
+            self.resultbox.append("")
+
         self.proc = QProcess()
         self.proc.finished.connect(self.__procFinished)
         self.proc.readyReadStandardOutput.connect(self.__readStdout)
@@ -155,16 +151,15 @@
             self.buttonBox.setFocus()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
-                self.tr(
-                    'The process {0} could not be started.'
-                ).format(cmd))
+                self.tr("Process Generation Error"),
+                self.tr("The process {0} could not be started.").format(cmd),
+            )
         return procStarted
-    
+
     def startProcesses(self, processParams):
         """
         Public method to issue a list of commands to be executed.
-        
+
         @param processParams list of tuples containing the command
             and arguments
         @type list of tuples of (str, list of str)
@@ -176,42 +171,40 @@
                 self.__processQueue.append((cmd, args[:]))
         cmd, args = processParams[0]
         return self.startProcess(cmd, args)
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.proc is not None:
-            txt = str(self.proc.readAllStandardOutput(),
-                      self.__ioEncoding, 'replace')
+            txt = str(self.proc.readAllStandardOutput(), self.__ioEncoding, "replace")
             self.__addOutput(txt)
 
     def __addOutput(self, txt):
         """
         Private method to add some text to the output pane.
-        
+
         @param txt text to be added
         @type str
         """
         self.resultbox.insertPlainText(txt)
         self.resultbox.ensureCursorVisible()
         QCoreApplication.processEvents()
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.proc is not None:
-            s = str(self.proc.readAllStandardError(),
-                    self.__ioEncoding, 'replace')
+            s = str(self.proc.readAllStandardError(), self.__ioEncoding, "replace")
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-            
+
             QCoreApplication.processEvents()
--- a/src/eric7/PipInterface/PipFileSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipFileSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog to enter a file to be processed.
     """
+
     def __init__(self, pip, mode, install=True, parent=None):
         """
         Constructor
-        
+
         @param pip reference to the pip object
         @type Pip
         @param mode mode of the dialog
@@ -39,63 +40,67 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if mode == "requirements":
             self.fileLabel.setText(self.tr("Enter requirements file:"))
             self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-            self.filePicker.setToolTip(self.tr(
-                "Press to select the requirements file through a file"
-                " selection dialog."))
-            self.filePicker.setFilters(
-                self.tr("Text Files (*.txt);;All Files (*)"))
+            self.filePicker.setToolTip(
+                self.tr(
+                    "Press to select the requirements file through a file"
+                    " selection dialog."
+                )
+            )
+            self.filePicker.setFilters(self.tr("Text Files (*.txt);;All Files (*)"))
         elif mode == "package":
             self.fileLabel.setText(self.tr("Enter package file:"))
             self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-            self.filePicker.setToolTip(self.tr(
-                "Press to select the package file through a file"
-                " selection dialog."))
+            self.filePicker.setToolTip(
+                self.tr(
+                    "Press to select the package file through a file"
+                    " selection dialog."
+                )
+            )
             self.filePicker.setFilters(
-                self.tr("Python Wheel (*.whl);;"
-                        "Archive Files (*.tar.gz *.zip);;"
-                        "All Files (*)"))
+                self.tr(
+                    "Python Wheel (*.whl);;"
+                    "Archive Files (*.tar.gz *.zip);;"
+                    "All Files (*)"
+                )
+            )
         else:
             self.fileLabel.setText(self.tr("Enter file name:"))
             self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-            self.filePicker.setToolTip(self.tr(
-                "Press to select a file through a file selection dialog."))
+            self.filePicker.setToolTip(
+                self.tr("Press to select a file through a file selection dialog.")
+            )
             self.filePicker.setFilters(self.tr("All Files (*)"))
         self.filePicker.setDefaultDirectory(os.path.expanduser("~"))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.userCheckBox.setVisible(install)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_filePicker_textChanged(self, txt):
         """
         Private slot to handle entering the name of a file.
-        
+
         @param txt name of the file
         @type str
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            os.path.exists(Utilities.toNativeSeparators(txt))
+            bool(txt) and os.path.exists(Utilities.toNativeSeparators(txt))
         )
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with the name of the selected file and a flag indicating
             to install to the user install directory
         @rtype tuple of (str, bool)
         """
-        return (
-            self.filePicker.text(),
-            self.userCheckBox.isChecked()
-        )
+        return (self.filePicker.text(), self.userCheckBox.isChecked())
--- a/src/eric7/PipInterface/PipFreezeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipFreezeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton, QApplication
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, QApplication
 
 from EricWidgets import EricMessageBox, EricFileDialog
 from EricWidgets.EricPathPicker import EricPathPickerModes
@@ -28,10 +26,11 @@
     """
     Class implementing a dialog to generate a requirements file.
     """
+
     def __init__(self, pip, parent=None):
         """
         Constructor
-        
+
         @param pip reference to the master object
         @type Pip
         @param parent reference to the parent widget
@@ -40,78 +39,78 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.__environmentName = ""
-        
+
         self.requirementsFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.requirementsFilePicker.setFilters(
-            self.tr("Text Files (*.txt);;All Files (*)"))
-        
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+
         self.__pip = pip
-        
+
         self.__requirementsEdited = False
         self.__requirementsAvailable = False
-        
+
         self.__updateButtons()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event
         @type QCloseEvent
         """
         e.accept()
-    
+
     @pyqtSlot()
     def on_localCheckBox_clicked(self):
         """
         Private slot handling the switching of the local mode.
         """
         self.__refresh()
-    
+
     @pyqtSlot()
     def on_userCheckBox_clicked(self):
         """
         Private slot handling the switching of the user-site mode.
         """
         self.__refresh()
-    
+
     @pyqtSlot(str)
     def on_requirementsFilePicker_textChanged(self, txt):
         """
         Private slot handling a change of the requirements file name.
-        
+
         @param txt name of the requirements file
         @type str
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_requirementsEdit_textChanged(self):
         """
         Private slot handling changes of the requirements text.
         """
         self.__requirementsEdited = True
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
         elif button == self.__refreshButton:
             self.__refresh()
-    
+
     def __refresh(self):
         """
         Private slot to refresh the displayed list.
@@ -120,75 +119,78 @@
             EricMessageBox.yesNo(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""The requirements were changed. Do you want"""
-                        """ to overwrite these changes?"""))
-            if self.__requirementsEdited else
-            True
+                self.tr(
+                    """The requirements were changed. Do you want"""
+                    """ to overwrite these changes?"""
+                ),
+            )
+            if self.__requirementsEdited
+            else True
         )
         if ok:
             self.start(self.__environmentName)
-    
+
     def start(self, venvName):
         """
         Public method to start the command.
-        
+
         @param venvName name of the environment to act upon
         @type str
         """
         self.requirementsEdit.clear()
         self.__requirementsAvailable = False
         self.__environmentName = venvName
-        
+
         fileName = (
             Utilities.toNativeSeparators(self.requirementsFilePicker.text())
-            if self.requirementsFilePicker.text() else
-            ""
+            if self.requirementsFilePicker.text()
+            else ""
         )
-        
+
         with EricOverrideCursor():
             specifiers = self.__pip.getFrozenPackages(
-                venvName, localPackages=self.localCheckBox.isChecked(),
-                usersite=self.userCheckBox.isChecked(), requirement=fileName)
-            
+                venvName,
+                localPackages=self.localCheckBox.isChecked(),
+                usersite=self.userCheckBox.isChecked(),
+                requirement=fileName,
+            )
+
             if specifiers:
-                self.requirementsEdit.setPlainText(
-                    "\n".join(specifiers) + "\n")
+                self.requirementsEdit.setPlainText("\n".join(specifiers) + "\n")
                 self.__requirementsAvailable = True
             else:
-                self.requirementsEdit.setPlainText(self.tr(
-                    "No package specifiers generated by 'pip freeze'.")
+                self.requirementsEdit.setPlainText(
+                    self.tr("No package specifiers generated by 'pip freeze'.")
                 )
-        
+
         self.__updateButtons()
-        
+
         self.__requirementsEdited = False
-    
+
     def __updateButtons(self):
         """
         Private method to set the state of the various buttons.
         """
         self.saveButton.setEnabled(
-            self.__requirementsAvailable and
-            bool(self.requirementsFilePicker.text())
+            self.__requirementsAvailable and bool(self.requirementsFilePicker.text())
         )
         self.saveToButton.setEnabled(self.__requirementsAvailable)
         self.copyButton.setEnabled(self.__requirementsAvailable)
-        
+
         aw = ericApp().getObject("ViewManager").activeWindow()
         if aw and self.__requirementsAvailable:
             self.insertButton.setEnabled(True)
             self.replaceAllButton.setEnabled(True)
-            self.replaceSelectionButton.setEnabled(
-                aw.hasSelectedText())
+            self.replaceSelectionButton.setEnabled(aw.hasSelectedText())
         else:
             self.insertButton.setEnabled(False)
             self.replaceAllButton.setEnabled(False)
             self.replaceSelectionButton.setEnabled(False)
-    
+
     def __writeToFile(self, fileName):
         """
         Private method to write the requirements text to a file.
-        
+
         @param fileName name of the file to write to
         @type str
         """
@@ -196,11 +198,14 @@
             ok = EricMessageBox.warning(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""The file <b>{0}</b> already exists. Do you want"""
-                        """ to overwrite it?""").format(fileName))
+                self.tr(
+                    """The file <b>{0}</b> already exists. Do you want"""
+                    """ to overwrite it?"""
+                ).format(fileName),
+            )
             if not ok:
                 return
-        
+
         try:
             with open(fileName, "w") as f:
                 f.write(self.requirementsEdit.toPlainText())
@@ -208,10 +213,12 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Generate Requirements"),
-                self.tr("""<p>The requirements could not be written"""
-                        """ to <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                .format(fileName, str(err)))
-    
+                self.tr(
+                    """<p>The requirements could not be written"""
+                    """ to <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                ).format(fileName, str(err)),
+            )
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -219,7 +226,7 @@
         """
         fileName = self.requirementsFilePicker.text()
         self.__writeToFile(fileName)
-    
+
     @pyqtSlot()
     def on_saveToButton_clicked(self):
         """
@@ -231,7 +238,7 @@
             os.path.expanduser("~"),
             self.tr("Text Files (*.txt);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite
+            EricFileDialog.DontConfirmOverwrite,
         )
         if fileName:
             ext = os.path.splitext(fileName)[1]
@@ -240,7 +247,7 @@
                 if ex:
                     fileName += ex
             self.__writeToFile(fileName)
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -249,7 +256,7 @@
         txt = self.requirementsEdit.toPlainText()
         cb = QApplication.clipboard()
         cb.setText(txt)
-    
+
     @pyqtSlot()
     def on_insertButton_clicked(self):
         """
@@ -261,7 +268,7 @@
             aw.beginUndoAction()
             aw.insert(self.requirementsEdit.toPlainText())
             aw.endUndoAction()
-    
+
     @pyqtSlot()
     def on_replaceSelectionButton_clicked(self):
         """
@@ -273,7 +280,7 @@
             aw.beginUndoAction()
             aw.replaceSelectedText(self.requirementsEdit.toPlainText())
             aw.endUndoAction()
-    
+
     @pyqtSlot()
     def on_replaceAllButton_clicked(self):
         """
--- a/src/eric7/PipInterface/PipLicensesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipLicensesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,18 +23,20 @@
     """
     Class implementing a dialog to show the licenses of an environment.
     """
+
     LicensesPackageColumn = 0
     LicensesVersionColumn = 1
     LicensesLicenseColumn = 2
-    
+
     SummaryCountColumn = 0
     SummaryLicenseColumn = 1
-    
-    def __init__(self, pip, environment, localPackages=True, usersite=False,
-                 parent=None):
+
+    def __init__(
+        self, pip, environment, localPackages=True, usersite=False, parent=None
+    ):
         """
         Constructor
-        
+
         @param pip reference to the pip interface object
         @type Pip
         @param environment name of the environment to show the licenses for
@@ -50,38 +52,39 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         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.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__saveCSVButton.clicked.connect(self.__saveAsCSV)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.localCheckBox.setChecked(localPackages)
         self.userCheckBox.setChecked(usersite)
-        
+
         self.localCheckBox.toggled.connect(self.__refreshLicenses)
         self.userCheckBox.toggled.connect(self.__refreshLicenses)
-        
+
         if environment:
-            self.environmentLabel.setText("<b>{0}</b>".format(
-                self.tr('Licenses of "{0}"').format(environment)
-            ))
+            self.environmentLabel.setText(
+                "<b>{0}</b>".format(self.tr('Licenses of "{0}"').format(environment))
+            )
         else:
             # That should never happen; play it safe.
             self.environmentLabel.setText(self.tr("No environment specified."))
-        
+
         self.licenseFilterComboBox.currentTextChanged.connect(
-            self.__filterPackagesByLicense)
-        
+            self.__filterPackagesByLicense
+        )
+
         self.__refreshLicenses()
-        
+
     @pyqtSlot()
     def __refreshLicenses(self):
         """
@@ -91,9 +94,9 @@
             self.licensesList.clear()
             self.summaryList.clear()
             self.licenseFilterComboBox.clear()
-            
+
             licensesForFilter = set()
-            
+
             # step 1: show the licenses per package
             self.licensesList.setUpdatesEnabled(False)
             licenses = self.__pip.getLicenses(
@@ -102,19 +105,22 @@
                 usersite=self.userCheckBox.isChecked(),
             )
             for lic in licenses:
-                QTreeWidgetItem(self.licensesList, [
-                    lic["Name"],
-                    lic["Version"],
-                    lic["License"].replace("; ", "\n"),
-                ])
-            
+                QTreeWidgetItem(
+                    self.licensesList,
+                    [
+                        lic["Name"],
+                        lic["Version"],
+                        lic["License"].replace("; ", "\n"),
+                    ],
+                )
+
             self.licensesList.sortItems(
-                PipLicensesDialog.LicensesPackageColumn,
-                Qt.SortOrder.AscendingOrder)
+                PipLicensesDialog.LicensesPackageColumn, Qt.SortOrder.AscendingOrder
+            )
             for col in range(self.licensesList.columnCount()):
                 self.licensesList.resizeColumnToContents(col)
             self.licensesList.setUpdatesEnabled(True)
-            
+
             # step 2: show the licenses summary
             self.summaryList.setUpdatesEnabled(False)
             licenses = self.__pip.getLicensesSummary(
@@ -123,30 +129,34 @@
                 usersite=self.userCheckBox.isChecked(),
             )
             for lic in licenses:
-                QTreeWidgetItem(self.summaryList, [
-                    "{0:4d}".format(lic["Count"]),
-                    lic["License"].replace("; ", "\n"),
-                ])
+                QTreeWidgetItem(
+                    self.summaryList,
+                    [
+                        "{0:4d}".format(lic["Count"]),
+                        lic["License"].replace("; ", "\n"),
+                    ],
+                )
                 licensesForFilter |= set(lic["License"].split("; "))
-            
+
             self.summaryList.sortItems(
-                PipLicensesDialog.SummaryLicenseColumn,
-                Qt.SortOrder.AscendingOrder)
+                PipLicensesDialog.SummaryLicenseColumn, Qt.SortOrder.AscendingOrder
+            )
             for col in range(self.summaryList.columnCount()):
                 self.summaryList.resizeColumnToContents(col)
             self.summaryList.setUpdatesEnabled(True)
-            
+
             self.licenseFilterComboBox.addItems(
-                [self.__allFilter] + sorted(licensesForFilter))
-        
+                [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
         """
@@ -160,25 +170,24 @@
                 itm.setHidden(False)
             else:
                 itm.setHidden(
-                    regexp.search(
-                        itm.text(PipLicensesDialog.LicensesLicenseColumn)
-                    ) is None
+                    regexp.search(itm.text(PipLicensesDialog.LicensesLicenseColumn))
+                    is None
                 )
-    
+
     @pyqtSlot()
     def __saveAsCSV(self):
         """
         Private slot to save the license information as a CSV file.
         """
         import csv
-        
+
         fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save as CSV"),
             os.path.expanduser("~"),
             self.tr("CSV Files (*.csv);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite
+            EricFileDialog.DontConfirmOverwrite,
         )
         if fileName:
             ext = os.path.splitext(fileName)[1]
@@ -186,21 +195,22 @@
                 ex = selectedFilter.split("(*")[1].split(")")[0]
                 if ex:
                     fileName += ex
-            
+
             try:
-                with open(fileName, "w", newline="",
-                          encoding="utf-8") as csvFile:
+                with open(fileName, "w", newline="", encoding="utf-8") as csvFile:
                     fieldNames = ["Name", "Version", "License"]
                     writer = csv.DictWriter(csvFile, fieldnames=fieldNames)
-                    
+
                     writer.writeheader()
                     for row in range(self.licensesList.topLevelItemCount()):
                         itm = self.licensesList.topLevelItem(row)
-                        writer.writerow({
-                            "Name": itm.text(0),
-                            "Version": itm.text(1),
-                            "License": itm.text(2),
-                        })
+                        writer.writerow(
+                            {
+                                "Name": itm.text(0),
+                                "Version": itm.text(1),
+                                "License": itm.text(2),
+                            }
+                        )
             except OSError as err:
                 EricMessageBox.critical(
                     self,
@@ -209,5 +219,5 @@
                         """<p>The license information could not be saved"""
                         """ into the CSV file <b>{0}</b>.</p>"""
                         """<p>Reason: {1}</p>"""
-                    ).format(fileName, str(err))
+                    ).format(fileName, str(err)),
                 )
--- a/src/eric7/PipInterface/PipPackageDetailsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipPackageDetailsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QLocale
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QTreeWidgetItem, QLabel, QHeaderView,
-    QAbstractButton
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QLabel,
+    QHeaderView,
+    QAbstractButton,
 )
 
 from .Ui_PipPackageDetailsDialog import Ui_PipPackageDetailsDialog
@@ -20,14 +24,15 @@
     """
     Class implementing a dialog to show details about a package.
     """
+
     ButtonInstall = 1
     ButtonRemove = 2
     ButtonUpgrade = 4
-    
+
     def __init__(self, detailsData, buttonsMode=0, parent=None):
         """
         Constructor
-        
+
         @param detailsData package details
         @type dict
         @param buttonsMode flags telling which convenience buttons to enable
@@ -39,16 +44,19 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__pipWidget = parent
-        
+
         self.__installButton = self.buttonBox.addButton(
-            self.tr("Install"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Install"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__removeButton = self.buttonBox.addButton(
-            self.tr("Uninstall"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Uninstall"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__upgradeButton = self.buttonBox.addButton(
-            self.tr("Upgrade"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Upgrade"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.__locale = QLocale()
         self.__packageTypeMap = {
             "sdist": self.tr("Source"),
@@ -61,59 +69,69 @@
             "bdist_dumb": self.tr("Archive"),
         }
         self.__packageName = detailsData["info"]["name"]
-        
+
         self.__populateDetails(detailsData["info"])
         self.__populateDownloadUrls(detailsData["urls"])
         self.__populateRequiresProvides(detailsData["info"])
-        
+
         self.__installButton.setEnabled(buttonsMode & self.ButtonInstall)
         self.__removeButton.setEnabled(buttonsMode & self.ButtonRemove)
         self.__upgradeButton.setEnabled(buttonsMode & self.ButtonUpgrade)
-    
+
     def __populateDetails(self, detailsData):
         """
         Private method to populate the details tab.
-        
+
         @param detailsData package details
         @type dict
         """
         self.packageNameLabel.setText(
-            "<h1>{0} {1}</h1".format(self.__sanitize(detailsData["name"]),
-                                     self.__sanitize(detailsData["version"])))
-        self.summaryLabel.setText(
-            self.__sanitize(detailsData["summary"][:240]))
-        self.descriptionEdit.setPlainText(
-            self.__sanitize(detailsData["description"]))
+            "<h1>{0} {1}</h1".format(
+                self.__sanitize(detailsData["name"]),
+                self.__sanitize(detailsData["version"]),
+            )
+        )
+        self.summaryLabel.setText(self.__sanitize(detailsData["summary"][:240]))
+        self.descriptionEdit.setPlainText(self.__sanitize(detailsData["description"]))
         self.authorLabel.setText(self.__sanitize(detailsData["author"]))
         self.authorEmailLabel.setText(
             '<a href="mailto:{0}">{0}</a>'.format(
-                self.__sanitize(detailsData["author_email"])))
+                self.__sanitize(detailsData["author_email"])
+            )
+        )
         self.licenseLabel.setText(self.__sanitize(detailsData["license"]))
         self.platformLabel.setText(self.__sanitize(detailsData["platform"]))
         self.homePageLabel.setText(
             '<a href="{0}">{0}</a>'.format(
-                self.__sanitize(detailsData["home_page"], forUrl=True)))
+                self.__sanitize(detailsData["home_page"], forUrl=True)
+            )
+        )
         self.packageUrlLabel.setText(
             '<a href="{0}">{0}</a>'.format(
-                self.__sanitize(detailsData["package_url"], forUrl=True)))
+                self.__sanitize(detailsData["package_url"], forUrl=True)
+            )
+        )
         self.releaseUrlLabel.setText(
             '<a href="{0}">{0}</a>'.format(
-                self.__sanitize(detailsData["release_url"], forUrl=True)))
+                self.__sanitize(detailsData["release_url"], forUrl=True)
+            )
+        )
         self.docsUrlLabel.setText(
             '<a href="{0}">{0}</a>'.format(
-                self.__sanitize(detailsData["docs_url"], forUrl=True)))
+                self.__sanitize(detailsData["docs_url"], forUrl=True)
+            )
+        )
         self.classifiersList.addItems(detailsData["classifiers"])
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
     def __populateDownloadUrls(self, downloadsData):
         """
         Private method to populate the download URLs tab.
-        
+
         @param downloadsData downloads information
         @type dict
         """
@@ -121,65 +139,72 @@
         if downloadsData:
             self.infoWidget.setTabEnabled(index, True)
             for download in downloadsData:
-                itm = QTreeWidgetItem(self.downloadUrlsList, [
-                    "",
-                    self.__packageTypeMap[download["packagetype"]]
-                    if download["packagetype"] in self.__packageTypeMap
-                    else "",
-                    download["python_version"]
-                    if download["python_version"] != "source"
-                    else "",
-                    self.__formatUploadDate(download["upload_time"]),
-                    self.__formatSize(download["size"]),
-                ])
+                itm = QTreeWidgetItem(
+                    self.downloadUrlsList,
+                    [
+                        "",
+                        self.__packageTypeMap[download["packagetype"]]
+                        if download["packagetype"] in self.__packageTypeMap
+                        else "",
+                        download["python_version"]
+                        if download["python_version"] != "source"
+                        else "",
+                        self.__formatUploadDate(download["upload_time"]),
+                        self.__formatSize(download["size"]),
+                    ],
+                )
                 pgpLink = (
                     ' (<a href="{0}">pgp</a>)'.format(download["url"] + ".asc")
-                    if download["has_sig"] else
-                    ""
+                    if download["has_sig"]
+                    else ""
                 )
-                urlLabel = QLabel('<a href="{0}#md5={2}">{1}</a>{3}'.format(
-                    download["url"], download["filename"],
-                    download["md5_digest"], pgpLink))
+                urlLabel = QLabel(
+                    '<a href="{0}#md5={2}">{1}</a>{3}'.format(
+                        download["url"],
+                        download["filename"],
+                        download["md5_digest"],
+                        pgpLink,
+                    )
+                )
                 urlLabel.setTextInteractionFlags(
-                    Qt.TextInteractionFlag.LinksAccessibleByMouse)
+                    Qt.TextInteractionFlag.LinksAccessibleByMouse
+                )
                 urlLabel.setOpenExternalLinks(True)
                 self.downloadUrlsList.setItemWidget(itm, 0, urlLabel)
             header = self.downloadUrlsList.header()
             header.resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         else:
             self.infoWidget.setTabEnabled(index, False)
-    
+
     def __populateRequiresProvides(self, detailsData):
         """
         Private method to populate the requires/provides tab.
-        
+
         @param detailsData package details
         @type dict
         """
         populatedItems = 0
-        
+
         if "requires" in detailsData and detailsData["requires"]:
             self.requiredPackagesList.addItems(detailsData["requires"])
             populatedItems += len(detailsData["requires"])
         if "requires_dist" in detailsData and detailsData["requires_dist"]:
-            self.requiredDistributionsList.addItems(
-                detailsData["requires_dist"])
+            self.requiredDistributionsList.addItems(detailsData["requires_dist"])
             populatedItems += len(detailsData["requires_dist"])
         if "provides" in detailsData and detailsData["provides"]:
             self.providedPackagesList.addItems(detailsData["provides"])
             populatedItems += len(detailsData["provides"])
         if "provides_dist" in detailsData and detailsData["provides_dist"]:
-            self.providedDistributionsList.addItems(
-                detailsData["provides_dist"])
+            self.providedDistributionsList.addItems(detailsData["provides_dist"])
             populatedItems += len(detailsData["provides_dist"])
-        
+
         index = self.infoWidget.indexOf(self.requires)
         self.infoWidget.setTabEnabled(index, populatedItems > 0)
-    
+
     def __sanitize(self, text, forUrl=False):
         """
         Private method to clean-up the given text.
-        
+
         @param text raw text
         @type str
         @param forUrl flag indicating to sanitize an URL text
@@ -192,18 +217,18 @@
         elif text == "any":
             text = self.tr("any")
         if forUrl and (
-            not isinstance(text, str) or
-            not text.startswith(("http://", "https://", "ftp://"))
+            not isinstance(text, str)
+            or not text.startswith(("http://", "https://", "ftp://"))
         ):
             # ignore if the schema is not one of the listed ones
             text = ""
-        
+
         return text
-    
+
     def __formatUploadDate(self, datetime):
         """
         Private method to format the upload date.
-        
+
         @param datetime upload date and time
         @type xmlrpc.DateTime or str
         @return formatted date string
@@ -214,11 +239,11 @@
         else:
             date = datetime.value.split("T")[0]
             return "{0}-{1}-{2}".format(date[:4], date[4:6], date[6:])
-    
+
     def __formatSize(self, size):
         """
         Private slot to format the size.
-        
+
         @param size size to be formatted
         @type int
         @return formatted size
@@ -237,12 +262,12 @@
             size /= 1024 * 1024 * 1024
             unit = self.tr("GB")
         return self.tr("{0:.1f} {1}", "value, unit").format(size, unit)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot handling the user pressing an action button.
-        
+
         @param button button activated by the user
         @type QAbstractButton
         """
--- a/src/eric7/PipInterface/PipPackagesInputDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipPackagesInputDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter package specifications.
     """
+
     def __init__(self, pip, title, install=True, parent=None):
         """
         Constructor
-        
+
         @param pip reference to the pip object
         @type Pip
         @param title dialog title
@@ -32,39 +33,34 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowTitle(title)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.userCheckBox.setVisible(install)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_packagesEdit_textChanged(self, txt):
         """
         Private slot handling entering package names.
-        
+
         @param txt name of the requirements file
         @type str
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with the list of package specifications and a flag
             indicating to install to the user install directory
         @rtype tuple of (list of str, bool)
         """
         packages = [p.strip() for p in self.packagesEdit.text().split()]
-        
-        return (
-            packages,
-            self.userCheckBox.isChecked()
-        )
+
+        return (packages, self.userCheckBox.isChecked())
--- a/src/eric7/PipInterface/PipPackagesWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipPackagesWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,8 +18,14 @@
 from PyQt6.QtGui import QIcon
 from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest
 from PyQt6.QtWidgets import (
-    QWidget, QToolButton, QApplication, QHeaderView, QTreeWidgetItem,
-    QMenu, QDialog, QAbstractItemView
+    QWidget,
+    QToolButton,
+    QApplication,
+    QHeaderView,
+    QTreeWidgetItem,
+    QMenu,
+    QDialog,
+    QAbstractItemView,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -38,12 +44,13 @@
     """
     Class implementing the parser for the PyPI search result page.
     """
+
     ClassPrefix = "package-snippet__"
-    
+
     def __init__(self, data):
         """
         Constructor
-        
+
         @param data data to be parsed
         @type str
         """
@@ -51,12 +58,12 @@
         self.__results = []
         self.__activeClass = None
         self.feed(data)
-    
+
     def __getClass(self, attrs):
         """
         Private method to extract the class attribute out of the list of
         attributes.
-        
+
         @param attrs list of tag attributes as (name, value) tuples
         @type list of tuple of (str, str)
         @return value of the 'class' attribute or None
@@ -65,14 +72,14 @@
         for name, value in attrs:
             if name == "class":
                 return value
-        
+
         return None
-    
+
     def __getDate(self, attrs):
         """
         Private method to extract the datetime attribute out of the list of
         attributes and process it.
-        
+
         @param attrs list of tag attributes as (name, value) tuples
         @type list of tuple of (str, str)
         @return value of the 'class' attribute or None
@@ -81,13 +88,13 @@
         for name, value in attrs:
             if name == "datetime":
                 return value.split("T")[0]
-        
+
         return None
-    
+
     def handle_starttag(self, tag, attrs):
         """
         Public method to process the start tag.
-        
+
         @param tag tag name (all lowercase)
         @type str
         @param attrs list of tag attributes as (name, value) tuples
@@ -95,12 +102,14 @@
         """
         if tag == "a" and self.__getClass(attrs) == "package-snippet":
             self.__results.append({})
-        
+
         if tag in ("span", "p"):
             tagClass = self.__getClass(attrs)
             if tagClass in (
-                "package-snippet__name", "package-snippet__description",
-                "package-snippet__version", "package-snippet__released",
+                "package-snippet__name",
+                "package-snippet__description",
+                "package-snippet__version",
+                "package-snippet__released",
                 "package-snippet__created",
             ):
                 self.__activeClass = tagClass
@@ -112,31 +121,31 @@
             self.__activeClass = None
         else:
             self.__activeClass = None
-    
+
     def handle_data(self, data):
         """
         Public method process arbitrary data.
-        
+
         @param data data to be processed
         @type str
         """
         if self.__activeClass is not None:
             attributeName = self.__activeClass.replace(self.ClassPrefix, "")
             self.__results[-1][attributeName] = data
-    
+
     def handle_endtag(self, tag):
         """
         Public method to process the end tag.
-        
+
         @param tag tag name (all lowercase)
         @type str
         """
         self.__activeClass = None
-    
+
     def getResults(self):
         """
         Public method to get the extracted search results.
-        
+
         @return extracted result data
         @rtype list of dict
         """
@@ -147,27 +156,28 @@
     """
     Class implementing the pip packages management widget.
     """
+
     ShowProcessGeneralMode = 0
     ShowProcessClassifiersMode = 1
     ShowProcessEntryPointsMode = 2
     ShowProcessFilesListMode = 3
-    
+
     SearchVersionRole = Qt.ItemDataRole.UserRole + 1
     VulnerabilityRole = Qt.ItemDataRole.UserRole + 2
-    
+
     PackageColumn = 0
     InstalledVersionColumn = 1
     AvailableVersionColumn = 2
     VulnerabilityColumn = 3
-    
+
     DepPackageColumn = 0
     DepInstalledVersionColumn = 1
     DepRequiredVersionColumn = 2
-    
+
     def __init__(self, pip, parent=None):
         """
         Constructor
-        
+
         @param pip reference to the global pip interface
         @type Pip
         @param parent reference to the parent widget
@@ -175,58 +185,44 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         self.viewToggleButton.setIcon(UI.PixmapCache.getIcon("viewListTree"))
-        
-        self.pipMenuButton.setObjectName(
-            "pip_supermenu_button")
+
+        self.pipMenuButton.setObjectName("pip_supermenu_button")
         self.pipMenuButton.setIcon(UI.PixmapCache.getIcon("superMenu"))
         self.pipMenuButton.setToolTip(self.tr("pip Menu"))
-        self.pipMenuButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
-        self.pipMenuButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.pipMenuButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.pipMenuButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.pipMenuButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.pipMenuButton.setAutoRaise(True)
         self.pipMenuButton.setShowMenuInside(True)
-        
-        self.refreshButton.setIcon(
-            UI.PixmapCache.getIcon("reload"))
-        self.upgradeButton.setIcon(
-            UI.PixmapCache.getIcon("1uparrow"))
-        self.upgradeAllButton.setIcon(
-            UI.PixmapCache.getIcon("2uparrow"))
-        self.uninstallButton.setIcon(
-            UI.PixmapCache.getIcon("minus"))
-        self.showPackageDetailsButton.setIcon(
-            UI.PixmapCache.getIcon("info"))
-        self.searchToggleButton.setIcon(
-            UI.PixmapCache.getIcon("find"))
-        self.searchButton.setIcon(
-            UI.PixmapCache.getIcon("findNext"))
-        self.searchMoreButton.setIcon(
-            UI.PixmapCache.getIcon("plus"))
-        self.installButton.setIcon(
-            UI.PixmapCache.getIcon("plus"))
-        self.installUserSiteButton.setIcon(
-            UI.PixmapCache.getIcon("addUser"))
-        self.showDetailsButton.setIcon(
-            UI.PixmapCache.getIcon("info"))
-        
-        self.refreshDependenciesButton.setIcon(
-            UI.PixmapCache.getIcon("reload"))
-        self.showDepPackageDetailsButton.setIcon(
-            UI.PixmapCache.getIcon("info"))
-        
+
+        self.refreshButton.setIcon(UI.PixmapCache.getIcon("reload"))
+        self.upgradeButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
+        self.upgradeAllButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
+        self.uninstallButton.setIcon(UI.PixmapCache.getIcon("minus"))
+        self.showPackageDetailsButton.setIcon(UI.PixmapCache.getIcon("info"))
+        self.searchToggleButton.setIcon(UI.PixmapCache.getIcon("find"))
+        self.searchButton.setIcon(UI.PixmapCache.getIcon("findNext"))
+        self.searchMoreButton.setIcon(UI.PixmapCache.getIcon("plus"))
+        self.installButton.setIcon(UI.PixmapCache.getIcon("plus"))
+        self.installUserSiteButton.setIcon(UI.PixmapCache.getIcon("addUser"))
+        self.showDetailsButton.setIcon(UI.PixmapCache.getIcon("info"))
+
+        self.refreshDependenciesButton.setIcon(UI.PixmapCache.getIcon("reload"))
+        self.showDepPackageDetailsButton.setIcon(UI.PixmapCache.getIcon("info"))
+
         self.__pip = pip
-        
+
         self.packagesList.header().setSortIndicator(
-            PipPackagesWidget.PackageColumn, Qt.SortOrder.AscendingOrder)
+            PipPackagesWidget.PackageColumn, Qt.SortOrder.AscendingOrder
+        )
         self.dependenciesList.header().setSortIndicator(
-            PipPackagesWidget.DepPackageColumn, Qt.SortOrder.AscendingOrder)
-        
+            PipPackagesWidget.DepPackageColumn, Qt.SortOrder.AscendingOrder
+        )
+
         self.__infoLabels = {
             "name": self.tr("Name:"),
             "version": self.tr("Version:"),
@@ -245,38 +241,34 @@
         }
         self.infoWidget.setHeaderLabels(["Key", "Value"])
         self.dependencyInfoWidget.setHeaderLabels(["Key", "Value"])
-        
+
         venvManager = ericApp().getObject("VirtualEnvManager")
-        venvManager.virtualEnvironmentAdded.connect(
-            self.on_refreshButton_clicked)
-        venvManager.virtualEnvironmentRemoved.connect(
-            self.on_refreshButton_clicked)
+        venvManager.virtualEnvironmentAdded.connect(self.on_refreshButton_clicked)
+        venvManager.virtualEnvironmentRemoved.connect(self.on_refreshButton_clicked)
         self.__selectedEnvironment = None
-        
+
         project = ericApp().getObject("Project")
-        project.projectOpened.connect(
-            self.__projectOpened)
-        project.projectClosed.connect(
-            self.__projectClosed)
-        
+        project.projectOpened.connect(self.__projectOpened)
+        project.projectClosed.connect(self.__projectClosed)
+
         self.__initPipMenu()
         self.__populateEnvironments()
         self.__updateActionButtons()
         self.__updateDepActionButtons()
-        
+
         self.statusLabel.hide()
         self.searchWidget.hide()
         self.__lastSearchPage = 0
-        
+
         self.__queryName = []
         self.__querySummary = []
-        
+
         self.__replies = []
-        
+
         self.__packageDetailsDialog = None
-        
+
         self.viewsStackWidget.setCurrentWidget(self.packagesPage)
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
@@ -285,19 +277,19 @@
         projectVenv = self.__pip.getProjectEnvironmentString()
         if projectVenv:
             self.environmentsComboBox.insertItem(1, projectVenv)
-    
+
     @pyqtSlot(bool)
     def __projectClosed(self, shutdown):
         """
         Private slot to handle the projectClosed signal.
-        
+
         @param shutdown flag indicating the IDE shutdown
         @type bool
         """
         if not shutdown:
             # the project entry is always at index 1
             self.environmentsComboBox.removeItem(1)
-    
+
     def __populateEnvironments(self):
         """
         Private method to get a list of environments and populate the selector.
@@ -308,36 +300,38 @@
             self.environmentsComboBox.addItem(projectVenv)
         self.environmentsComboBox.addItems(
             self.__pip.getVirtualenvNames(
-                noRemote=True,
-                noConda=Preferences.getPip("ExcludeCondaEnvironments")
+                noRemote=True, noConda=Preferences.getPip("ExcludeCondaEnvironments")
             )
         )
-    
+
     def __isPipAvailable(self):
         """
         Private method to check, if the pip package is available for the
         selected environment.
-        
+
         @return flag indicating availability
         @rtype bool
         """
         available = False
-        
+
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             available = (
-                len(self.packagesList.findItems(
-                    "pip",
-                    Qt.MatchFlag.MatchExactly |
-                    Qt.MatchFlag.MatchCaseSensitive)) == 1
+                len(
+                    self.packagesList.findItems(
+                        "pip",
+                        Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
+                    )
+                )
+                == 1
             )
-        
+
         return available
-    
+
     def __availablePipVersion(self):
         """
         Private method to get the pip version of the selected environment.
-        
+
         @return tuple containing the version number or tuple with all zeros
             in case pip is not available
         @rtype tuple of int
@@ -346,44 +340,45 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             pipList = self.packagesList.findItems(
-                "pip",
-                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
+                "pip", Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
             )
             if len(pipList) > 0:
                 pipVersionTuple = Globals.versionToTuple(
-                    pipList[0].text(PipPackagesWidget.InstalledVersionColumn))
-        
+                    pipList[0].text(PipPackagesWidget.InstalledVersionColumn)
+                )
+
         return pipVersionTuple
-    
+
     def getPip(self):
         """
         Public method to get a reference to the pip interface object.
-        
+
         @return reference to the pip interface object
         @rtype Pip
         """
         return self.__pip
-    
+
     #######################################################################
     ## Slots handling widget signals below
     #######################################################################
-    
+
     def __selectedUpdateableItems(self):
         """
         Private method to get a list of selected items that can be updated.
-        
+
         @return list of selected items that can be updated
         @rtype list of QTreeWidgetItem
         """
         return [
-            itm for itm in self.packagesList.selectedItems()
+            itm
+            for itm in self.packagesList.selectedItems()
             if bool(itm.text(PipPackagesWidget.AvailableVersionColumn))
         ]
-    
+
     def __allUpdateableItems(self):
         """
         Private method to get a list of all items that can be updated.
-        
+
         @return list of all items that can be updated
         @rtype list of QTreeWidgetItem
         """
@@ -392,28 +387,26 @@
             itm = self.packagesList.topLevelItem(index)
             if itm.text(PipPackagesWidget.AvailableVersionColumn):
                 updateableItems.append(itm)
-        
+
         return updateableItems
-    
+
     def __updateActionButtons(self):
         """
         Private method to set the state of the action buttons.
         """
         if self.__isPipAvailable():
-            self.upgradeButton.setEnabled(
-                bool(self.__selectedUpdateableItems()))
-            self.uninstallButton.setEnabled(
-                bool(self.packagesList.selectedItems()))
-            self.upgradeAllButton.setEnabled(
-                bool(self.__allUpdateableItems()))
+            self.upgradeButton.setEnabled(bool(self.__selectedUpdateableItems()))
+            self.uninstallButton.setEnabled(bool(self.packagesList.selectedItems()))
+            self.upgradeAllButton.setEnabled(bool(self.__allUpdateableItems()))
             self.showPackageDetailsButton.setEnabled(
-                len(self.packagesList.selectedItems()) == 1)
+                len(self.packagesList.selectedItems()) == 1
+            )
         else:
             self.upgradeButton.setEnabled(False)
             self.uninstallButton.setEnabled(False)
             self.upgradeAllButton.setEnabled(False)
             self.showPackageDetailsButton.setEnabled(False)
-    
+
     def __refreshPackagesList(self):
         """
         Private method to refresh the packages list.
@@ -424,9 +417,8 @@
             interpreter = self.__pip.getVirtualenvInterpreter(venvName)
             if interpreter:
                 self.statusLabel.show()
-                self.statusLabel.setText(
-                    self.tr("Getting installed packages..."))
-                
+                self.statusLabel.setText(self.tr("Getting installed packages..."))
+
                 with EricOverrideCursor():
                     # 1. populate with installed packages
                     self.packagesList.setUpdatesEnabled(False)
@@ -437,13 +429,11 @@
                         usersite=self.userCheckBox.isChecked(),
                     )
                     for package, version in installedPackages:
-                        QTreeWidgetItem(self.packagesList,
-                                        [package, version, "", ""])
+                        QTreeWidgetItem(self.packagesList, [package, version, "", ""])
                     self.packagesList.setUpdatesEnabled(True)
-                    self.statusLabel.setText(
-                        self.tr("Getting outdated packages..."))
+                    self.statusLabel.setText(self.tr("Getting outdated packages..."))
                     QApplication.processEvents()
-                    
+
                     # 2. update with update information
                     self.packagesList.setUpdatesEnabled(False)
                     outdatedPackages = self.__pip.getOutdatedPackages(
@@ -455,37 +445,36 @@
                     for package, _version, latest in outdatedPackages:
                         items = self.packagesList.findItems(
                             package,
-                            Qt.MatchFlag.MatchExactly |
-                            Qt.MatchFlag.MatchCaseSensitive
+                            Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
                         )
                         if items:
                             itm = items[0]
                             itm.setText(
-                                PipPackagesWidget.AvailableVersionColumn,
-                                latest)
-                    
+                                PipPackagesWidget.AvailableVersionColumn, latest
+                            )
+
                     self.packagesList.sortItems(
-                        PipPackagesWidget.PackageColumn,
-                        Qt.SortOrder.AscendingOrder)
+                        PipPackagesWidget.PackageColumn, Qt.SortOrder.AscendingOrder
+                    )
                     for col in range(self.packagesList.columnCount()):
                         self.packagesList.resizeColumnToContents(col)
                     self.packagesList.setUpdatesEnabled(True)
-                    
+
                     # 3. update with vulnerability information
                     if self.vulnerabilityCheckBox.isChecked():
                         self.__updateVulnerabilityData()
                 self.statusLabel.hide()
-        
+
         self.__updateActionButtons()
         self.__updateSearchActionButtons()
         self.__updateSearchButton()
         self.__updateSearchMoreButton(False)
-    
+
     @pyqtSlot(str)
     def on_environmentsComboBox_currentTextChanged(self, name):
         """
         Private slot handling the selection of a Python environment.
-        
+
         @param name name of the selected Python environment
         @type str
         """
@@ -495,32 +484,32 @@
             else:
                 self.__refreshPackagesList()
             self.__selectedEnvironment = name
-    
+
     @pyqtSlot()
     def on_localCheckBox_clicked(self):
         """
         Private slot handling the switching of the local mode.
         """
         self.__refreshPackagesList()
-    
+
     @pyqtSlot()
     def on_notRequiredCheckBox_clicked(self):
         """
         Private slot handling the switching of the 'not required' mode.
         """
         self.__refreshPackagesList()
-    
+
     @pyqtSlot()
     def on_userCheckBox_clicked(self):
         """
         Private slot handling the switching of the 'user-site' mode.
         """
         self.__refreshPackagesList()
-    
+
     def __showPackageInformation(self, packageName, infoWidget):
         """
         Private method to show information for a package.
-        
+
         @param packageName name of the package
         @type str
         @param infoWidget reference to the widget to contain the information
@@ -530,17 +519,17 @@
         interpreter = self.__pip.getVirtualenvInterpreter(environment)
         if not interpreter:
             return
-        
+
         args = ["-m", "pip", "show"]
         if self.verboseCheckBox.isChecked():
             args.append("--verbose")
         if self.installedFilesCheckBox.isChecked():
             args.append("--files")
         args.append(packageName)
-        
+
         with EricOverrideCursor():
             success, output = self.__pip.runProcess(args, interpreter)
-            
+
             if success and output:
                 mode = self.ShowProcessGeneralMode
                 for line in output.splitlines():
@@ -548,9 +537,7 @@
                     if line != "---":
                         if mode != self.ShowProcessGeneralMode:
                             if line[0] == " ":
-                                QTreeWidgetItem(
-                                    infoWidget,
-                                    [" ", line.strip()])
+                                QTreeWidgetItem(infoWidget, [" ", line.strip()])
                             else:
                                 mode = self.ShowProcessGeneralMode
                         if mode == self.ShowProcessGeneralMode:
@@ -562,8 +549,8 @@
                             label = label.lower()
                             if label in self.__infoLabels:
                                 QTreeWidgetItem(
-                                    infoWidget,
-                                    [self.__infoLabels[label], info])
+                                    infoWidget, [self.__infoLabels[label], info]
+                                )
                             if label == "files":
                                 mode = self.ShowProcessFilesListMode
                             elif label == "classifiers":
@@ -571,16 +558,13 @@
                             elif label == "entry-points":
                                 mode = self.ShowProcessEntryPointsMode
                 infoWidget.scrollToTop()
-            
+
             header = infoWidget.header()
             header.setStretchLastSection(False)
             header.resizeSections(QHeaderView.ResizeMode.ResizeToContents)
-            if (
-                header.sectionSize(0) + header.sectionSize(1) <
-                header.width()
-            ):
+            if header.sectionSize(0) + header.sectionSize(1) < header.width():
                 header.setStretchLastSection(True)
-    
+
     @pyqtSlot()
     def on_packagesList_itemSelectionChanged(self):
         """
@@ -588,43 +572,43 @@
         """
         if len(self.packagesList.selectedItems()) == 0:
             self.infoWidget.clear()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_packagesList_itemPressed(self, item, column):
         """
         Private slot reacting on a package item being pressed.
-        
+
         @param item reference to the pressed item
         @type QTreeWidgetItem
         @param column pressed column
         @type int
         """
         self.infoWidget.clear()
-        
+
         if item is not None:
-            if (
-                column == PipPackagesWidget.VulnerabilityColumn and
-                bool(item.text(PipPackagesWidget.VulnerabilityColumn))
+            if column == PipPackagesWidget.VulnerabilityColumn and bool(
+                item.text(PipPackagesWidget.VulnerabilityColumn)
             ):
                 self.__showVulnerabilityInformation(
                     item.text(PipPackagesWidget.PackageColumn),
                     item.text(PipPackagesWidget.InstalledVersionColumn),
-                    item.data(PipPackagesWidget.VulnerabilityColumn,
-                              PipPackagesWidget.VulnerabilityRole)
+                    item.data(
+                        PipPackagesWidget.VulnerabilityColumn,
+                        PipPackagesWidget.VulnerabilityRole,
+                    ),
                 )
             else:
                 self.__showPackageInformation(
-                    item.text(PipPackagesWidget.PackageColumn),
-                    self.infoWidget
+                    item.text(PipPackagesWidget.PackageColumn), self.infoWidget
                 )
-        
+
         self.__updateActionButtons()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_packagesList_itemActivated(self, item, column):
         """
         Private slot reacting on a package item being activated.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column activated column
@@ -634,44 +618,42 @@
         upgradable = bool(item.text(PipPackagesWidget.AvailableVersionColumn))
         if column == PipPackagesWidget.InstalledVersionColumn:
             # show details for installed version
-            packageVersion = item.text(
-                PipPackagesWidget.InstalledVersionColumn)
+            packageVersion = item.text(PipPackagesWidget.InstalledVersionColumn)
         else:
             # show details for available version or installed one
             if item.text(PipPackagesWidget.AvailableVersionColumn):
-                packageVersion = item.text(
-                    PipPackagesWidget.AvailableVersionColumn)
+                packageVersion = item.text(PipPackagesWidget.AvailableVersionColumn)
             else:
-                packageVersion = item.text(
-                    PipPackagesWidget.InstalledVersionColumn)
-        
-        self.__showPackageDetails(packageName, packageVersion,
-                                  upgradable=upgradable)
-    
+                packageVersion = item.text(PipPackagesWidget.InstalledVersionColumn)
+
+        self.__showPackageDetails(packageName, packageVersion, upgradable=upgradable)
+
     @pyqtSlot(bool)
     def on_verboseCheckBox_clicked(self, checked):
         """
         Private slot to handle a change of the verbose package information
         checkbox.
-        
+
         @param checked state of the checkbox
         @type bool
         """
-        self.on_packagesList_itemPressed(self.packagesList.currentItem(),
-                                         self.packagesList.currentColumn())
-    
+        self.on_packagesList_itemPressed(
+            self.packagesList.currentItem(), self.packagesList.currentColumn()
+        )
+
     @pyqtSlot(bool)
     def on_installedFilesCheckBox_clicked(self, checked):
         """
         Private slot to handle a change of the installed files information
         checkbox.
-        
+
         @param checked state of the checkbox
         @type bool
         """
-        self.on_packagesList_itemPressed(self.packagesList.currentItem(),
-                                         self.packagesList.currentColumn())
-    
+        self.on_packagesList_itemPressed(
+            self.packagesList.currentItem(), self.packagesList.currentColumn()
+        )
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -680,75 +662,83 @@
         currentEnvironment = self.environmentsComboBox.currentText()
         self.environmentsComboBox.clear()
         self.packagesList.clear()
-        
+
         with EricOverrideCursor():
             self.__populateEnvironments()
-            
+
             index = self.environmentsComboBox.findText(
                 currentEnvironment,
-                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
+                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
             )
             if index != -1:
                 self.environmentsComboBox.setCurrentIndex(index)
-        
+
         self.__updateActionButtons()
-    
+
     @pyqtSlot()
     def on_upgradeButton_clicked(self):
         """
         Private slot to upgrade selected packages of the selected environment.
         """
-        packages = [itm.text(PipPackagesWidget.PackageColumn)
-                    for itm in self.__selectedUpdateableItems()]
+        packages = [
+            itm.text(PipPackagesWidget.PackageColumn)
+            for itm in self.__selectedUpdateableItems()
+        ]
         if packages:
             self.executeUpgradePackages(packages)
-    
+
     @pyqtSlot()
     def on_upgradeAllButton_clicked(self):
         """
         Private slot to upgrade all packages of the selected environment.
         """
-        packages = [itm.text(PipPackagesWidget.PackageColumn)
-                    for itm in self.__allUpdateableItems()]
+        packages = [
+            itm.text(PipPackagesWidget.PackageColumn)
+            for itm in self.__allUpdateableItems()
+        ]
         if packages:
             self.executeUpgradePackages(packages)
-    
+
     @pyqtSlot()
     def on_uninstallButton_clicked(self):
         """
         Private slot to remove selected packages of the selected environment.
         """
-        packages = [itm.text(PipPackagesWidget.PackageColumn)
-                    for itm in self.packagesList.selectedItems()]
+        packages = [
+            itm.text(PipPackagesWidget.PackageColumn)
+            for itm in self.packagesList.selectedItems()
+        ]
         self.executeUninstallPackages(packages)
-    
+
     def executeUninstallPackages(self, packages):
         """
         Public method to uninstall the given list of packages.
-        
+
         @param packages list of package names to be uninstalled
         @type list of str
         """
         if packages:
             ok = self.__pip.uninstallPackages(
-                packages,
-                venvName=self.environmentsComboBox.currentText())
+                packages, venvName=self.environmentsComboBox.currentText()
+            )
             if ok:
                 self.on_refreshButton_clicked()
-    
+
     def executeUpgradePackages(self, packages):
         """
         Public method to execute the pip upgrade command.
-        
+
         @param packages list of package names to be upgraded
         @type list of str
         """
         ok = self.__pip.upgradePackages(
-            packages, venvName=self.environmentsComboBox.currentText(),
-            userSite=self.userCheckBox.isChecked())
+            packages,
+            venvName=self.environmentsComboBox.currentText(),
+            userSite=self.userCheckBox.isChecked(),
+        )
         if ok:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_showPackageDetailsButton_clicked(self):
         """
@@ -757,144 +747,135 @@
         item = self.packagesList.selectedItems()[0]
         if item:
             packageName = item.text(PipPackagesWidget.PackageColumn)
-            upgradable = bool(item.text(
-                PipPackagesWidget.AvailableVersionColumn))
+            upgradable = bool(item.text(PipPackagesWidget.AvailableVersionColumn))
             # show details for available version or installed one
             if item.text(PipPackagesWidget.AvailableVersionColumn):
-                packageVersion = item.text(
-                    PipPackagesWidget.AvailableVersionColumn)
+                packageVersion = item.text(PipPackagesWidget.AvailableVersionColumn)
             else:
-                packageVersion = item.text(
-                    PipPackagesWidget.InstalledVersionColumn)
-            
-            self.__showPackageDetails(packageName, packageVersion,
-                                      upgradable=upgradable)
-    
+                packageVersion = item.text(PipPackagesWidget.InstalledVersionColumn)
+
+            self.__showPackageDetails(
+                packageName, packageVersion, upgradable=upgradable
+            )
+
     #######################################################################
     ## Search widget related methods below
     #######################################################################
-    
+
     def __updateSearchActionButtons(self):
         """
         Private method to update the action button states of the search widget.
         """
         installEnable = (
-            len(self.searchResultList.selectedItems()) > 0 and
-            self.environmentsComboBox.currentIndex() > 0 and
-            self.__isPipAvailable()
+            len(self.searchResultList.selectedItems()) > 0
+            and self.environmentsComboBox.currentIndex() > 0
+            and self.__isPipAvailable()
         )
         self.installButton.setEnabled(installEnable)
         self.installUserSiteButton.setEnabled(installEnable)
-        
+
         self.showDetailsButton.setEnabled(
-            len(self.searchResultList.selectedItems()) == 1 and
-            self.__isPipAvailable()
+            len(self.searchResultList.selectedItems()) == 1 and self.__isPipAvailable()
         )
-    
+
     def __updateSearchButton(self):
         """
         Private method to update the state of the search button.
         """
         self.searchButton.setEnabled(
-            bool(self.searchEditName.text()) and
-            self.__isPipAvailable()
+            bool(self.searchEditName.text()) and self.__isPipAvailable()
         )
-    
+
     def __updateSearchMoreButton(self, enable):
         """
         Private method to update the state of the search more button.
-        
+
         @param enable flag indicating the desired enable state
         @type bool
         """
         self.searchMoreButton.setEnabled(
-            enable and
-            bool(self.searchEditName.text()) and
-            self.__isPipAvailable()
+            enable and bool(self.searchEditName.text()) and self.__isPipAvailable()
         )
-    
+
     @pyqtSlot(bool)
     def on_searchToggleButton_toggled(self, checked):
         """
         Private slot to togle the search widget.
-        
+
         @param checked state of the search widget button
         @type bool
         """
         self.searchWidget.setVisible(checked)
-        
+
         if checked:
             self.searchEditName.setFocus(Qt.FocusReason.OtherFocusReason)
             self.searchEditName.selectAll()
-            
+
             self.__updateSearchActionButtons()
             self.__updateSearchButton()
             self.__updateSearchMoreButton(False)
-    
+
     @pyqtSlot(str)
     def on_searchEditName_textChanged(self, txt):
         """
         Private slot handling a change of the search term.
-        
+
         @param txt search term
         @type str
         """
         self.__updateSearchButton()
-    
+
     @pyqtSlot()
     def on_searchEditName_returnPressed(self):
         """
         Private slot initiating a search via a press of the Return key.
         """
-        if (
-            bool(self.searchEditName.text()) and
-            self.__isPipAvailable()
-        ):
+        if bool(self.searchEditName.text()) and self.__isPipAvailable():
             self.__searchFirst()
-    
+
     @pyqtSlot()
     def on_searchButton_clicked(self):
         """
         Private slot handling a press of the search button.
         """
         self.__searchFirst()
-    
+
     @pyqtSlot()
     def on_searchMoreButton_clicked(self):
         """
         Private slot handling a press of the search more button.
         """
         self.__search(self.__lastSearchPage + 1)
-    
+
     @pyqtSlot()
     def on_searchResultList_itemSelectionChanged(self):
         """
         Private slot handling changes of the search result selection.
         """
         self.__updateSearchActionButtons()
-    
+
     def __searchFirst(self):
         """
         Private method to perform the search for packages.
         """
         self.searchResultList.clear()
         self.searchInfoLabel.clear()
-        
+
         self.__updateSearchMoreButton(False)
-        
+
         self.__search()
-    
+
     def __search(self, page=1):
         """
         Private method to perform the search by calling the PyPI search URL.
-        
+
         @param page search page to retrieve (defaults to 1)
         @type int (optional)
         """
         self.__lastSearchPage = page
-        
+
         self.searchButton.setEnabled(False)
-        
+
         searchTerm = self.searchEditName.text().strip()
         searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode()
         urlQuery = QUrlQuery()
@@ -902,29 +883,29 @@
         urlQuery.addQueryItem("page", str(page))
         url = QUrl(self.__pip.getIndexUrlSearch())
         url.setQuery(urlQuery)
-        
+
         request = QNetworkRequest(QUrl(url))
         request.setAttribute(
             QNetworkRequest.Attribute.CacheLoadControlAttribute,
-            QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+            QNetworkRequest.CacheLoadControl.AlwaysNetwork,
+        )
         reply = self.__pip.getNetworkAccessManager().get(request)
-        reply.finished.connect(
-            lambda: self.__searchResponse(reply))
+        reply.finished.connect(lambda: self.__searchResponse(reply))
         self.__replies.append(reply)
-    
+
     def __searchResponse(self, reply):
         """
         Private method to extract the search result data from the response.
-        
+
         @param reply reference to the reply object containing the data
         @type QNetworkReply
         """
         if reply in self.__replies:
             self.__replies.remove(reply)
-        
+
         urlQuery = QUrlQuery(reply.url())
         searchTerm = urlQuery.queryItemValue("q")
-        
+
         if reply.error() != QNetworkReply.NetworkError.NoError:
             EricMessageBox.warning(
                 None,
@@ -932,78 +913,86 @@
                 self.tr(
                     "<p>Received an error while searching for <b>{0}</b>.</p>"
                     "<p>Error: {1}</p>"
-                ).format(searchTerm, reply.errorString())
+                ).format(searchTerm, reply.errorString()),
             )
             reply.deleteLater()
             return
-        
+
         data = bytes(reply.readAll()).decode()
         reply.deleteLater()
-        
+
         results = PypiSearchResultsParser(data).getResults()
         if results:
             # PyPI returns max. 20 entries per page
             if len(results) < 20:
-                msg = self.tr("%n package(s) found.", "",
-                              (self.__lastSearchPage - 1) * 20 + len(results))
+                msg = self.tr(
+                    "%n package(s) found.",
+                    "",
+                    (self.__lastSearchPage - 1) * 20 + len(results),
+                )
                 self.__updateSearchMoreButton(False)
             else:
                 msg = self.tr("Showing first {0} packages found.").format(
-                    self.__lastSearchPage * 20)
+                    self.__lastSearchPage * 20
+                )
                 self.__updateSearchMoreButton(True)
             self.searchInfoLabel.setText(msg)
             lastItem = self.searchResultList.topLevelItem(
-                self.searchResultList.topLevelItemCount() - 1)
+                self.searchResultList.topLevelItemCount() - 1
+            )
         else:
             self.__updateSearchMoreButton(False)
             if self.__lastSearchPage == 1:
                 EricMessageBox.warning(
                     self,
                     self.tr("Search PyPI"),
-                    self.tr("""<p>There were no results for <b>{0}</b>.</p>""")
-                    .format(searchTerm)
+                    self.tr("""<p>There were no results for <b>{0}</b>.</p>""").format(
+                        searchTerm
+                    ),
                 )
                 self.searchInfoLabel.setText(
-                    self.tr("""<p>There were no results for <b>{0}</b>.</p>""")
-                    .format(searchTerm)
+                    self.tr("""<p>There were no results for <b>{0}</b>.</p>""").format(
+                        searchTerm
+                    )
                 )
             else:
                 EricMessageBox.warning(
                     self,
                     self.tr("Search PyPI"),
-                    self.tr("""<p>There were no more results for"""
-                            """ <b>{0}</b>.</p>""").format(searchTerm)
+                    self.tr(
+                        """<p>There were no more results for""" """ <b>{0}</b>.</p>"""
+                    ).format(searchTerm),
                 )
             lastItem = None
-        
+
         wrapper = textwrap.TextWrapper(width=80)
         for result in results:
             try:
-                description = "\n".join([
-                    wrapper.fill(line) for line in
-                    result['description'].strip().splitlines()
-                ])
+                description = "\n".join(
+                    [
+                        wrapper.fill(line)
+                        for line in result["description"].strip().splitlines()
+                    ]
+                )
             except KeyError:
                 description = ""
-            date = (
-                result["released"]
-                if "released" in result else
-                result["created"]
-            )
+            date = result["released"] if "released" in result else result["created"]
             itm = QTreeWidgetItem(
-                self.searchResultList, [
-                    result['name'].strip(),
-                    result['version'],
+                self.searchResultList,
+                [
+                    result["name"].strip(),
+                    result["version"],
                     date.strip(),
                     description,
-                ])
-            itm.setData(0, self.SearchVersionRole, result['version'])
-        
+                ],
+            )
+            itm.setData(0, self.SearchVersionRole, result["version"])
+
         if lastItem:
             self.searchResultList.scrollToItem(
-                lastItem,
-                QAbstractItemView.ScrollHint.PositionAtTop)
-        
+                lastItem, QAbstractItemView.ScrollHint.PositionAtTop
+            )
+
         header = self.searchResultList.header()
         header.setStretchLastSection(False)
         header.resizeSections(QHeaderView.ResizeMode.ResizeToContents)
@@ -1012,44 +1001,42 @@
             headerSize += header.sectionSize(col)
         if headerSize < header.width():
             header.setStretchLastSection(True)
-        
+
         self.__finishSearch()
-    
+
     def __finishSearch(self):
         """
         Private slot performing the search finishing actions.
         """
         self.__updateSearchActionButtons()
         self.__updateSearchButton()
-        
+
         self.searchEditName.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     @pyqtSlot()
     def on_installButton_clicked(self):
         """
         Private slot to handle pressing the Install button..
         """
         packages = [
-            itm.text(0).strip()
-            for itm in self.searchResultList.selectedItems()
+            itm.text(0).strip() for itm in self.searchResultList.selectedItems()
         ]
         self.executeInstallPackages(packages)
-    
+
     @pyqtSlot()
     def on_installUserSiteButton_clicked(self):
         """
         Private slot to handle pressing the Install to User-Site button..
         """
         packages = [
-            itm.text(0).strip()
-            for itm in self.searchResultList.selectedItems()
+            itm.text(0).strip() for itm in self.searchResultList.selectedItems()
         ]
         self.executeInstallPackages(packages, userSite=True)
-    
+
     def executeInstallPackages(self, packages, userSite=False):
         """
         Public method to install the given list of packages.
-        
+
         @param packages list of package names to be installed
         @type list of str
         @param userSite flag indicating to install to the user directory
@@ -1057,52 +1044,51 @@
         """
         venvName = self.environmentsComboBox.currentText()
         if venvName and packages:
-            self.__pip.installPackages(packages, venvName=venvName,
-                                       userSite=userSite)
+            self.__pip.installPackages(packages, venvName=venvName, userSite=userSite)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_showDetailsButton_clicked(self):
         """
         Private slot to handle pressing the Show Details button.
         """
         self.__showSearchedDetails()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_searchResultList_itemActivated(self, item, column):
         """
         Private slot reacting on an search result item activation.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column activated column
         @type int
         """
         self.__showSearchedDetails(item)
-    
+
     def __showSearchedDetails(self, item=None):
         """
         Private slot to show details about the selected search result package.
-        
+
         @param item reference to the search result item to show details for
         @type QTreeWidgetItem
         """
         self.showDetailsButton.setEnabled(False)
-        
+
         if not item:
             item = self.searchResultList.selectedItems()[0]
-        
+
         packageVersion = item.data(0, self.SearchVersionRole)
         packageName = item.text(0)
-        
-        self.__showPackageDetails(packageName, packageVersion,
-                                  installable=True)
-    
-    def __showPackageDetails(self, packageName, packageVersion,
-                             upgradable=False, installable=False):
+
+        self.__showPackageDetails(packageName, packageVersion, installable=True)
+
+    def __showPackageDetails(
+        self, packageName, packageVersion, upgradable=False, installable=False
+    ):
         """
         Private method to populate the package details dialog.
-        
+
         @param packageName name of the package to show details for
         @type str
         @param packageVersion version of the package
@@ -1115,43 +1101,44 @@
         @type bool (optional)
         """
         with EricOverrideCursor():
-            packageData = self.__pip.getPackageDetails(
-                packageName, packageVersion)
-        
+            packageData = self.__pip.getPackageDetails(packageName, packageVersion)
+
         if packageData:
             from .PipPackageDetailsDialog import PipPackageDetailsDialog
-            
+
             self.showDetailsButton.setEnabled(True)
-            
+
             if installable:
                 buttonsMode = PipPackageDetailsDialog.ButtonInstall
             elif upgradable:
                 buttonsMode = (
-                    PipPackageDetailsDialog.ButtonRemove |
-                    PipPackageDetailsDialog.ButtonUpgrade
+                    PipPackageDetailsDialog.ButtonRemove
+                    | PipPackageDetailsDialog.ButtonUpgrade
                 )
             else:
                 buttonsMode = PipPackageDetailsDialog.ButtonRemove
-            
+
             if self.__packageDetailsDialog is not None:
                 self.__packageDetailsDialog.close()
-            
-            self.__packageDetailsDialog = (
-                PipPackageDetailsDialog(packageData, buttonsMode=buttonsMode,
-                                        parent=self)
+
+            self.__packageDetailsDialog = PipPackageDetailsDialog(
+                packageData, buttonsMode=buttonsMode, parent=self
             )
             self.__packageDetailsDialog.show()
         else:
             EricMessageBox.warning(
                 self,
                 self.tr("Search PyPI"),
-                self.tr("""<p>No package details info for <b>{0}</b>"""
-                        """ available.</p>""").format(packageName))
-    
+                self.tr(
+                    """<p>No package details info for <b>{0}</b>"""
+                    """ available.</p>"""
+                ).format(packageName),
+            )
+
     #######################################################################
     ## Menu related methods below
     #######################################################################
-        
+
     def __initPipMenu(self):
         """
         Private method to create the super menu and attach it to the super
@@ -1159,81 +1146,80 @@
         """
         self.__pipMenu = QMenu()
         self.__installPipAct = self.__pipMenu.addAction(
-            self.tr("Install Pip"),
-            self.__installPip)
+            self.tr("Install Pip"), self.__installPip
+        )
         self.__installPipUserAct = self.__pipMenu.addAction(
-            self.tr("Install Pip to User-Site"),
-            self.__installPipUser)
+            self.tr("Install Pip to User-Site"), self.__installPipUser
+        )
         self.__repairPipAct = self.__pipMenu.addAction(
-            self.tr("Repair Pip"),
-            self.__repairPip)
+            self.tr("Repair Pip"), self.__repairPip
+        )
         self.__pipMenu.addSeparator()
         self.__installPackagesAct = self.__pipMenu.addAction(
-            self.tr("Install Packages"),
-            self.__installPackages)
+            self.tr("Install Packages"), self.__installPackages
+        )
         self.__installLocalPackageAct = self.__pipMenu.addAction(
-            self.tr("Install Local Package"),
-            self.__installLocalPackage)
+            self.tr("Install Local Package"), self.__installLocalPackage
+        )
         self.__pipMenu.addSeparator()
         self.__installRequirementsAct = self.__pipMenu.addAction(
-            self.tr("Install Requirements"),
-            self.__installRequirements)
+            self.tr("Install Requirements"), self.__installRequirements
+        )
         self.__reinstallPackagesAct = self.__pipMenu.addAction(
-            self.tr("Re-Install Selected Packages"),
-            self.__reinstallPackages)
+            self.tr("Re-Install Selected Packages"), self.__reinstallPackages
+        )
         self.__uninstallRequirementsAct = self.__pipMenu.addAction(
-            self.tr("Uninstall Requirements"),
-            self.__uninstallRequirements)
+            self.tr("Uninstall Requirements"), self.__uninstallRequirements
+        )
         self.__generateRequirementsAct = self.__pipMenu.addAction(
-            self.tr("Generate Requirements..."),
-            self.__generateRequirements)
+            self.tr("Generate Requirements..."), self.__generateRequirements
+        )
         self.__pipMenu.addSeparator()
         self.__showLicensesDialogAct = self.__pipMenu.addAction(
-            self.tr("Show Licenses..."),
-            self.__showLicensesDialog)
+            self.tr("Show Licenses..."), self.__showLicensesDialog
+        )
         self.__pipMenu.addSeparator()
         self.__checkVulnerabilityAct = self.__pipMenu.addAction(
-            self.tr("Check Vulnerabilities"),
-            self.__updateVulnerabilityData)
+            self.tr("Check Vulnerabilities"), self.__updateVulnerabilityData
+        )
         # updateVulnerabilityDbAct
         self.__pipMenu.addAction(
-            self.tr("Update Vulnerability Database"),
-            self.__updateVulnerabilityDbCache)
+            self.tr("Update Vulnerability Database"), self.__updateVulnerabilityDbCache
+        )
         self.__pipMenu.addSeparator()
         self.__cyclonedxAct = self.__pipMenu.addAction(
-            self.tr("Create SBOM file"),
-            self.__createSBOMFile)
+            self.tr("Create SBOM file"), self.__createSBOMFile
+        )
         self.__pipMenu.addSeparator()
         self.__cacheInfoAct = self.__pipMenu.addAction(
-            self.tr("Show Cache Info..."),
-            self.__showCacheInfo)
+            self.tr("Show Cache Info..."), self.__showCacheInfo
+        )
         self.__cacheShowListAct = self.__pipMenu.addAction(
-            self.tr("Show Cached Files..."),
-            self.__showCacheList)
+            self.tr("Show Cached Files..."), self.__showCacheList
+        )
         self.__cacheRemoveAct = self.__pipMenu.addAction(
-            self.tr("Remove Cached Files..."),
-            self.__removeCachedFiles)
+            self.tr("Remove Cached Files..."), self.__removeCachedFiles
+        )
         self.__cachePurgeAct = self.__pipMenu.addAction(
-            self.tr("Purge Cache..."),
-            self.__purgeCache)
+            self.tr("Purge Cache..."), self.__purgeCache
+        )
         self.__pipMenu.addSeparator()
         # editUserConfigAct
         self.__pipMenu.addAction(
-            self.tr("Edit User Configuration..."),
-            self.__editUserConfiguration)
+            self.tr("Edit User Configuration..."), self.__editUserConfiguration
+        )
         self.__editVirtualenvConfigAct = self.__pipMenu.addAction(
             self.tr("Edit Environment Configuration..."),
-            self.__editVirtualenvConfiguration)
+            self.__editVirtualenvConfiguration,
+        )
         self.__pipMenu.addSeparator()
         # pipConfigAct
-        self.__pipMenu.addAction(
-            self.tr("Configure..."),
-            self.__pipConfigure)
+        self.__pipMenu.addAction(self.tr("Configure..."), self.__pipConfigure)
 
         self.__pipMenu.aboutToShow.connect(self.__aboutToShowPipMenu)
-        
+
         self.pipMenuButton.setMenu(self.__pipMenu)
-    
+
     def __aboutToShowPipMenu(self):
         """
         Private slot to set the action enabled status.
@@ -1241,33 +1227,34 @@
         enable = bool(self.environmentsComboBox.currentText())
         enablePip = self.__isPipAvailable()
         enablePipCache = self.__availablePipVersion() >= (20, 1, 0)
-        
+
         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.__installRequirementsAct.setEnabled(enablePip)
         self.__uninstallRequirementsAct.setEnabled(enablePip)
         self.__generateRequirementsAct.setEnabled(enablePip)
-        
+
         self.__cacheInfoAct.setEnabled(enablePipCache)
         self.__cacheShowListAct.setEnabled(enablePipCache)
         self.__cacheRemoveAct.setEnabled(enablePipCache)
         self.__cachePurgeAct.setEnabled(enablePipCache)
-        
+
         self.__editVirtualenvConfigAct.setEnabled(enable)
-        
+
         self.__checkVulnerabilityAct.setEnabled(
-            enable & self.vulnerabilityCheckBox.isEnabled())
-        
+            enable & self.vulnerabilityCheckBox.isEnabled()
+        )
+
         self.__cyclonedxAct.setEnabled(enable)
-        
+
         self.__showLicensesDialogAct.setEnabled(enable)
-    
+
     @pyqtSlot()
     def __installPip(self):
         """
@@ -1277,7 +1264,7 @@
         if venvName:
             self.__pip.installPip(venvName)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __installPipUser(self):
         """
@@ -1288,7 +1275,7 @@
         if venvName:
             self.__pip.installPip(venvName, userSite=True)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __repairPip(self):
         """
@@ -1299,7 +1286,7 @@
         if venvName:
             self.__pip.repairPip(venvName)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __installPackages(self):
         """
@@ -1308,11 +1295,12 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             from .PipPackagesInputDialog import PipPackagesInputDialog
+
             dlg = PipPackagesInputDialog(self, self.tr("Install Packages"))
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 packages, user = dlg.getData()
                 self.executeInstallPackages(packages, userSite=user)
-    
+
     @pyqtSlot()
     def __installLocalPackage(self):
         """
@@ -1321,25 +1309,27 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             from .PipFileSelectionDialog import PipFileSelectionDialog
+
             dlg = PipFileSelectionDialog(self, "package")
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 package, user = dlg.getData()
                 if package and os.path.exists(package):
                     self.executeInstallPackages([package], userSite=user)
-    
+
     @pyqtSlot()
     def __reinstallPackages(self):
         """
         Private slot to force a re-installation of the selected packages.
         """
-        packages = [itm.text(PipPackagesWidget.PackageColumn)
-                    for itm in self.packagesList.selectedItems()]
+        packages = [
+            itm.text(PipPackagesWidget.PackageColumn)
+            for itm in self.packagesList.selectedItems()
+        ]
         venvName = self.environmentsComboBox.currentText()
         if venvName and packages:
-            self.__pip.installPackages(packages, venvName=venvName,
-                                       forceReinstall=True)
+            self.__pip.installPackages(packages, venvName=venvName, forceReinstall=True)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __installRequirements(self):
         """
@@ -1349,7 +1339,7 @@
         if venvName:
             self.__pip.installRequirements(venvName)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __uninstallRequirements(self):
         """
@@ -1359,7 +1349,7 @@
         if venvName:
             self.__pip.uninstallRequirements(venvName)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __generateRequirements(self):
         """
@@ -1368,17 +1358,18 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             from .PipFreezeDialog import PipFreezeDialog
+
             self.__freezeDialog = PipFreezeDialog(self.__pip, self)
             self.__freezeDialog.show()
             self.__freezeDialog.start(venvName)
-    
+
     @pyqtSlot()
     def __editUserConfiguration(self):
         """
         Private slot to edit the user configuration.
         """
         self.__editConfiguration()
-    
+
     @pyqtSlot()
     def __editVirtualenvConfiguration(self):
         """
@@ -1387,15 +1378,16 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             self.__editConfiguration(venvName=venvName)
-    
+
     def __editConfiguration(self, venvName=""):
         """
         Private method to edit a configuration.
-        
+
         @param venvName name of the environment to act upon
         @type str
         """
         from QScintilla.MiniEditor import MiniEditor
+
         if venvName:
             cfgFile = self.__pip.getVirtualenvConfig(venvName)
             if not cfgFile:
@@ -1407,10 +1399,10 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Edit Configuration"),
-                self.tr("""No valid configuration path determined."""
-                        """ Aborting"""))
+                self.tr("""No valid configuration path determined.""" """ Aborting"""),
+            )
             return
-        
+
         try:
             if not os.path.isdir(cfgDir):
                 os.makedirs(cfgDir)
@@ -1418,32 +1410,32 @@
             EricMessageBox.critical(
                 None,
                 self.tr("Edit Configuration"),
-                self.tr("""No valid configuration path determined."""
-                        """ Aborting"""))
+                self.tr("""No valid configuration path determined.""" """ Aborting"""),
+            )
             return
-        
+
         if not os.path.exists(cfgFile):
             with contextlib.suppress(OSError), open(cfgFile, "w") as f:
                 f.write("[global]\n")
-        
+
         # check, if the destination is writeable
         if not os.access(cfgFile, os.W_OK):
             EricMessageBox.critical(
                 None,
                 self.tr("Edit Configuration"),
-                self.tr("""No valid configuration path determined."""
-                        """ Aborting"""))
+                self.tr("""No valid configuration path determined.""" """ Aborting"""),
+            )
             return
-        
+
         self.__editor = MiniEditor(cfgFile, "Properties")
         self.__editor.show()
- 
+
     def __pipConfigure(self):
         """
         Private slot to open the configuration page.
         """
         ericApp().getObject("UserInterface").showPreferences("pipPage")
-    
+
     @pyqtSlot()
     def __showCacheInfo(self):
         """
@@ -1452,7 +1444,7 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             self.__pip.showCacheInfo(venvName)
-    
+
     @pyqtSlot()
     def __showCacheList(self):
         """
@@ -1461,7 +1453,7 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             self.__pip.cacheList(venvName)
-    
+
     @pyqtSlot()
     def __removeCachedFiles(self):
         """
@@ -1470,7 +1462,7 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             self.__pip.cacheRemove(venvName)
-    
+
     @pyqtSlot()
     def __purgeCache(self):
         """
@@ -1479,25 +1471,26 @@
         venvName = self.environmentsComboBox.currentText()
         if venvName:
             self.__pip.cachePurge(venvName)
-    
+
     ##################################################################
     ## Interface to the vulnerability checks below
     ##################################################################
-    
+
     @pyqtSlot(bool)
     def on_vulnerabilityCheckBox_clicked(self, checked):
         """
         Private slot handling a change of the automatic vulnerability checks.
-        
+
         @param checked flag indicating the state of the check box
         @type bool
         """
         if checked:
             self.__updateVulnerabilityData(clearFirst=True)
-        
+
         self.packagesList.header().setSectionHidden(
-            PipPackagesWidget.VulnerabilityColumn, not checked)
-    
+            PipPackagesWidget.VulnerabilityColumn, not checked
+        )
+
     @pyqtSlot()
     def __clearVulnerabilityInfo(self):
         """
@@ -1508,64 +1501,66 @@
             itm.setText(PipPackagesWidget.VulnerabilityColumn, "")
             itm.setToolTip(PipPackagesWidget.VulnerabilityColumn, "")
             itm.setIcon(PipPackagesWidget.VulnerabilityColumn, QIcon())
-            itm.setData(PipPackagesWidget.VulnerabilityColumn,
-                        PipPackagesWidget.VulnerabilityRole,
-                        None)
-    
+            itm.setData(
+                PipPackagesWidget.VulnerabilityColumn,
+                PipPackagesWidget.VulnerabilityRole,
+                None,
+            )
+
     @pyqtSlot()
     def __updateVulnerabilityData(self, clearFirst=True):
         """
         Private slot to update the shown vulnerability info.
-        
+
         @param clearFirst flag indicating to clear the vulnerability info first
             (defaults to True)
         @type bool (optional)
         """
         if clearFirst:
             self.__clearVulnerabilityInfo()
-        
+
         packages = []
         for row in range(self.packagesList.topLevelItemCount()):
             itm = self.packagesList.topLevelItem(row)
-            packages.append(Package(
-                name=itm.text(PipPackagesWidget.PackageColumn),
-                version=itm.text(PipPackagesWidget.InstalledVersionColumn)
-            ))
-        
-        error, vulnerabilities = (
-            self.__pip.getVulnerabilityChecker().check(packages)
-        )
+            packages.append(
+                Package(
+                    name=itm.text(PipPackagesWidget.PackageColumn),
+                    version=itm.text(PipPackagesWidget.InstalledVersionColumn),
+                )
+            )
+
+        error, vulnerabilities = self.__pip.getVulnerabilityChecker().check(packages)
         if error == VulnerabilityCheckError.OK:
             for package in vulnerabilities:
                 items = self.packagesList.findItems(
-                    package,
-                    Qt.MatchFlag.MatchExactly |
-                    Qt.MatchFlag.MatchCaseSensitive
+                    package, Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
                 )
                 if items:
                     itm = items[0]
                     itm.setData(
                         PipPackagesWidget.VulnerabilityColumn,
                         PipPackagesWidget.VulnerabilityRole,
-                        vulnerabilities[package]
+                        vulnerabilities[package],
                     )
                     affected = {v.spec for v in vulnerabilities[package]}
                     itm.setText(
-                        PipPackagesWidget.VulnerabilityColumn,
-                        ', '.join(affected)
+                        PipPackagesWidget.VulnerabilityColumn, ", ".join(affected)
                     )
                     itm.setIcon(
                         PipPackagesWidget.VulnerabilityColumn,
-                        UI.PixmapCache.getIcon("securityLow")
+                        UI.PixmapCache.getIcon("securityLow"),
                     )
-        
-        elif error in (VulnerabilityCheckError.FullDbUnavailable,
-                       VulnerabilityCheckError.SummaryDbUnavailable):
+
+        elif error in (
+            VulnerabilityCheckError.FullDbUnavailable,
+            VulnerabilityCheckError.SummaryDbUnavailable,
+        ):
             self.vulnerabilityCheckBox.setChecked(False)
             self.vulnerabilityCheckBox.setEnabled(False)
             self.packagesList.setColumnHidden(
-                PipPackagesWidget.VulnerabilityColumn, True)
-    
+                PipPackagesWidget.VulnerabilityColumn, True
+            )
+
     @pyqtSlot()
     def __updateVulnerabilityDbCache(self):
         """
@@ -1574,12 +1569,13 @@
         """
         with EricOverrideCursor():
             self.__pip.getVulnerabilityChecker().updateVulnerabilityDb()
-    
-    def __showVulnerabilityInformation(self, packageName, packageVersion,
-                                       vulnerabilities):
+
+    def __showVulnerabilityInformation(
+        self, packageName, packageVersion, vulnerabilities
+    ):
         """
         Private method to show the detected vulnerability data.
-        
+
         @param packageName name of the package
         @type str
         @param packageVersion installed version number
@@ -1587,9 +1583,8 @@
         @param vulnerabilities list of vulnerabilities
         @type list of Vulnerability
         """
-        header = (
-            self.tr("{0} {1}", "package name, package version")
-            .format(packageName, packageVersion)
+        header = self.tr("{0} {1}", "package name, package version").format(
+            packageName, packageVersion
         )
         topItem = QTreeWidgetItem(self.infoWidget, [header])
         topItem.setFirstColumnSpanned(True)
@@ -1597,78 +1592,76 @@
         font = topItem.font(0)
         font.setBold(True)
         topItem.setFont(0, font)
-        
+
         for vulnerability in vulnerabilities:
             title = (
                 vulnerability.cve
-                if vulnerability.cve else
-                vulnerability.vulnerabilityId
+                if vulnerability.cve
+                else vulnerability.vulnerabilityId
             )
             titleItem = QTreeWidgetItem(topItem, [title])
             titleItem.setFirstColumnSpanned(True)
             titleItem.setExpanded(True)
-            
+
             QTreeWidgetItem(
-                titleItem,
-                [self.tr("Affected Version:"), vulnerability.spec])
+                titleItem, [self.tr("Affected Version:"), vulnerability.spec]
+            )
             itm = QTreeWidgetItem(
-                titleItem,
-                [self.tr("Advisory:"), vulnerability.advisory])
-            itm.setToolTip(1, "<p>{0}</p>".format(
-                vulnerability.advisory.replace("\r\n", "<br/>")
-            ))
-        
+                titleItem, [self.tr("Advisory:"), vulnerability.advisory]
+            )
+            itm.setToolTip(
+                1, "<p>{0}</p>".format(vulnerability.advisory.replace("\r\n", "<br/>"))
+            )
+
         self.infoWidget.scrollToTop()
         self.infoWidget.resizeColumnToContents(0)
-        
+
         header = self.infoWidget.header()
         header.setStretchLastSection(True)
-    
+
     #######################################################################
     ## Dependency tree related methods below
     #######################################################################
-    
+
     @pyqtSlot(bool)
     def on_viewToggleButton_toggled(self, checked):
         """
         Private slot handling the view selection.
-        
+
         @param checked state of the toggle button
         @type bool
         """
         if checked:
-            self.viewsStackWidget.setCurrentWidget(
-                self.dependenciesPage)
+            self.viewsStackWidget.setCurrentWidget(self.dependenciesPage)
             self.__refreshDependencyTree()
         else:
-            self.viewsStackWidget.setCurrentWidget(
-                self.packagesPage)
+            self.viewsStackWidget.setCurrentWidget(self.packagesPage)
             self.__refreshPackagesList()
-    
+
     @pyqtSlot(bool)
     def on_requiresButton_toggled(self, checked):
         """
         Private slot handling the selection of the view type.
-        
+
         @param checked state of the radio button (unused)
         @type bool
         """
         self.__refreshDependencyTree()
-    
+
     @pyqtSlot()
     def on_localDepCheckBox_clicked(self):
         """
         Private slot handling the switching of the local mode.
         """
         self.__refreshDependencyTree()
-    
+
     @pyqtSlot()
     def on_userDepCheckBox_clicked(self):
         """
         Private slot handling the switching of the 'user-site' mode.
         """
         self.__refreshDependencyTree()
-    
+
     def __refreshDependencyTree(self):
         """
         Private method to refresh the dependency tree.
@@ -1685,80 +1678,81 @@
                         usersite=self.userDepCheckBox.isChecked(),
                         reverse=self.requiredByButton.isChecked(),
                     )
-                    
+
                     self.dependenciesList.setUpdatesEnabled(False)
                     for dependency in dependencies:
                         self.__addDependency(dependency, self.dependenciesList)
-                    
+
                     self.dependenciesList.sortItems(
-                        PipPackagesWidget.DepPackageColumn,
-                        Qt.SortOrder.AscendingOrder)
+                        PipPackagesWidget.DepPackageColumn, Qt.SortOrder.AscendingOrder
+                    )
                     for col in range(self.dependenciesList.columnCount()):
                         self.dependenciesList.resizeColumnToContents(col)
                     self.dependenciesList.setUpdatesEnabled(True)
-        
+
         self.__updateDepActionButtons()
-    
+
     def __addDependency(self, dependency, parent):
         """
         Private method to add a dependency branch to a given parent.
-        
+
         @param dependency dependency to be added
         @type dict
         @param parent reference to the parent item
         @type QTreeWidget or QTreeWidgetItem
         """
-        itm = QTreeWidgetItem(parent, [
-            dependency["package_name"],
-            dependency["installed_version"],
-            dependency["required_version"],
-        ])
+        itm = QTreeWidgetItem(
+            parent,
+            [
+                dependency["package_name"],
+                dependency["installed_version"],
+                dependency["required_version"],
+            ],
+        )
         itm.setExpanded(True)
-        
+
         if dependency["installed_version"] == "?":
-            itm.setText(PipPackagesWidget.DepInstalledVersionColumn,
-                        self.tr("unknown"))
-        
+            itm.setText(PipPackagesWidget.DepInstalledVersionColumn, self.tr("unknown"))
+
         if dependency["required_version"].lower() not in ("any", "?"):
             spec = (
                 "=={0}".format(dependency["required_version"])
-                if dependency["required_version"][0] in "0123456789" else
-                dependency["required_version"]
+                if dependency["required_version"][0] in "0123456789"
+                else dependency["required_version"]
             )
             specifierSet = SpecifierSet(specifiers=spec)
             if not specifierSet.contains(dependency["installed_version"]):
-                itm.setIcon(PipPackagesWidget.DepRequiredVersionColumn,
-                            UI.PixmapCache.getIcon("warning"))
-        
+                itm.setIcon(
+                    PipPackagesWidget.DepRequiredVersionColumn,
+                    UI.PixmapCache.getIcon("warning"),
+                )
+
         elif dependency["required_version"].lower() == "any":
-            itm.setText(PipPackagesWidget.DepRequiredVersionColumn,
-                        self.tr("any"))
-        
+            itm.setText(PipPackagesWidget.DepRequiredVersionColumn, self.tr("any"))
+
         elif dependency["required_version"] == "?":
-            itm.setText(PipPackagesWidget.DepRequiredVersionColumn,
-                        self.tr("unknown"))
-        
+            itm.setText(PipPackagesWidget.DepRequiredVersionColumn, self.tr("unknown"))
+
         # recursively add sub-dependencies
         for dep in dependency["dependencies"]:
             self.__addDependency(dep, itm)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_dependenciesList_itemActivated(self, item, column):
         """
         Private slot reacting on a package item of the dependency tree being
         activated.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column activated column
         @type int
         """
         packageName = item.text(PipPackagesWidget.DepPackageColumn)
-        packageVersion = item.text(
-            PipPackagesWidget.DepInstalledVersionColumn)
-        
+        packageVersion = item.text(PipPackagesWidget.DepInstalledVersionColumn)
+
         self.__showPackageDetails(packageName, packageVersion)
-    
+
     @pyqtSlot()
     def on_dependenciesList_itemSelectionChanged(self):
         """
@@ -1767,28 +1761,27 @@
         """
         if len(self.dependenciesList.selectedItems()) == 0:
             self.dependencyInfoWidget.clear()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_dependenciesList_itemPressed(self, item, column):
         """
         Private slot reacting on a package item of the dependency tree being
         pressed.
-        
+
         @param item reference to the pressed item
         @type QTreeWidgetItem
         @param column pressed column
         @type int
         """
         self.dependencyInfoWidget.clear()
-        
+
         if item is not None:
             self.__showPackageInformation(
-                item.text(PipPackagesWidget.DepPackageColumn),
-                self.dependencyInfoWidget
+                item.text(PipPackagesWidget.DepPackageColumn), self.dependencyInfoWidget
             )
-        
+
         self.__updateDepActionButtons()
-    
+
     @pyqtSlot()
     def on_refreshDependenciesButton_clicked(self):
         """
@@ -1797,19 +1790,19 @@
         currentEnvironment = self.environmentsComboBox.currentText()
         self.environmentsComboBox.clear()
         self.dependenciesList.clear()
-        
+
         with EricOverrideCursor():
             self.__populateEnvironments()
-            
+
             index = self.environmentsComboBox.findText(
                 currentEnvironment,
-                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
+                Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive,
             )
             if index != -1:
                 self.environmentsComboBox.setCurrentIndex(index)
-        
+
         self.__updateDepActionButtons()
-    
+
     @pyqtSlot()
     def on_showDepPackageDetailsButton_clicked(self):
         """
@@ -1819,24 +1812,22 @@
         item = self.dependenciesList.selectedItems()[0]
         if item:
             packageName = item.text(PipPackagesWidget.DepPackageColumn)
-            packageVersion = item.text(
-                PipPackagesWidget.DepInstalledVersionColumn)
-            
+            packageVersion = item.text(PipPackagesWidget.DepInstalledVersionColumn)
+
             self.__showPackageDetails(packageName, packageVersion)
-    
+
     def __updateDepActionButtons(self):
         """
         Private method to set the state of the dependency page action buttons.
         """
         self.showDepPackageDetailsButton.setEnabled(
-            len(self.dependenciesList.selectedItems()) == 1 and
-            self.__isPipAvailable()
+            len(self.dependenciesList.selectedItems()) == 1 and self.__isPipAvailable()
         )
-    
+
     ##################################################################
     ## Interface to show the licenses dialog below
     ##################################################################
-    
+
     @pyqtSlot()
     def __showLicensesDialog(self):
         """
@@ -1844,38 +1835,38 @@
         environment.
         """
         from .PipLicensesDialog import PipLicensesDialog
-        
+
         environment = self.environmentsComboBox.currentText()
         localPackages = (
             self.localDepCheckBox.isChecked()
-            if self.viewToggleButton.isChecked() else
-            self.localCheckBox.isChecked()
+            if self.viewToggleButton.isChecked()
+            else self.localCheckBox.isChecked()
         )
         usersite = (
             self.userDepCheckBox.isChecked()
-            if self.viewToggleButton.isChecked() else
-            self.userCheckBox.isChecked()
+            if self.viewToggleButton.isChecked()
+            else self.userCheckBox.isChecked()
         )
         dlg = PipLicensesDialog(
             self.__pip,
             environment,
             localPackages=localPackages,
             usersite=usersite,
-            parent=self
+            parent=self,
         )
         dlg.exec()
-    
+
     ##################################################################
     ## Interface to create a SBOM file using CycloneDX
     ##################################################################
-    
+
     @pyqtSlot()
     def __createSBOMFile(self):
         """
         Private slot to create a "Software Bill Of Material" file.
         """
         import CycloneDXInterface
-        
+
         venvName = self.environmentsComboBox.currentText()
         if venvName == self.__pip.getProjectEnvironmentString():
             venvName = "<project>"
--- a/src/eric7/PipInterface/PipVulnerabilityChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PipInterface/PipVulnerabilityChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -34,8 +34,9 @@
     """
     Class containing the package data.
     """
-    name: str               # package name
-    version: str            # version
+
+    name: str  # package name
+    version: str  # version
 
 
 @dataclass
@@ -43,18 +44,20 @@
     """
     Class containing the vulnerability data.
     """
-    name: str               # package name
-    spec: dict              # package specification record
-    version: str            # package version
-    cve: str                # CVE ID
-    advisory: str           # CVE advisory text
-    vulnerabilityId: str    # vulnerability ID
+
+    name: str  # package name
+    spec: dict  # package specification record
+    version: str  # package version
+    cve: str  # CVE ID
+    advisory: str  # CVE advisory text
+    vulnerabilityId: str  # vulnerability ID
 
 
 class VulnerabilityCheckError(enum.Enum):
     """
     Class defining various vulnerability check error states.
     """
+
     OK = 0
     SummaryDbUnavailable = 1
     FullDbUnavailable = 2
@@ -64,33 +67,33 @@
     """
     Class implementing a Python package vulnerability checker.
     """
+
     FullDbFile = "insecure_full.json"
     SummaryDbFile = "insecure.json"
-    
+
     def __init__(self, pip, parent=None):
         """
         Constructor
-        
+
         @param pip reference to the global pip interface
         @type Pip
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
-        
+
         self.__pip = pip
-        
+
         securityDir = os.path.join(Globals.getConfigDir(), "security")
         os.makedirs(securityDir, mode=0o700, exist_ok=True)
-        self.__cacheFile = os.path.join(securityDir,
-                                        "vulnerability_cache.json")
+        self.__cacheFile = os.path.join(securityDir, "vulnerability_cache.json")
         if not os.path.exists(self.__cacheFile):
             self.__createCacheFile()
-    
+
     def __createCacheFile(self):
         """
         Private method to create the cache file.
-        
+
         The cache file has the following structure.
         {
           "insecure.json": {
@@ -115,11 +118,11 @@
         }
         with open(self.__cacheFile, "w") as f:
             json.dump(structure, f, indent=2)
-    
+
     def __getDataFromCache(self, dbName):
         """
         Private method to get the vulnerability database from the cache.
-        
+
         @param dbName name of the vulnerability database
         @type str
         @return dictionary containing the requested vulnerability data
@@ -129,25 +132,23 @@
             with open(self.__cacheFile, "r") as f:  # __IGNORE_WARNING_Y117__
                 with contextlib.suppress(json.JSONDecodeError, OSError):
                     cachedData = json.load(f)
-                    if (
-                        dbName in cachedData and
-                        "cachedAt" in cachedData[dbName]
-                    ):
+                    if dbName in cachedData and "cachedAt" in cachedData[dbName]:
                         cacheValidPeriod = Preferences.getPip(
-                            "VulnerabilityDbCacheValidity")
+                            "VulnerabilityDbCacheValidity"
+                        )
                         if (
-                            cachedData[dbName]["cachedAt"] + cacheValidPeriod >
-                            time.time()
+                            cachedData[dbName]["cachedAt"] + cacheValidPeriod
+                            > time.time()
                         ):
                             return cachedData[dbName]["db"]
-        
+
         return {}
-    
+
     def __writeDataToCache(self, dbName, data):
         """
         Private method to write the vulnerability data for a database to the
         cache.
-        
+
         @param dbName name of the vulnerability database
         @type str
         @param data dictionary containing the vulnerability data
@@ -155,28 +156,28 @@
         """
         if not os.path.exists(self.__cacheFile):
             self.__createCacheFile()
-        
+
         with open(self.__cacheFile, "r") as f:
             try:
                 cache = json.load(f)
             except json.JSONDecodeError:
                 cache = {}
-        
+
         cache[dbName] = {
             "cachedAt": time.time(),
             "db": data,
         }
         with open(self.__cacheFile, "w") as f:
             json.dump(cache, f, indent=2)
-    
+
     def __fetchVulnerabilityDatabase(self, full=False, forceUpdate=False):
         """
         Private method to get the data of the vulnerability database.
-        
+
         If the cached data is still valid, this data will be used.
         Otherwise a copy of the requested database will be downloaded
         and cached.
-        
+
         @param full flag indicating to get the database containing the full
             data set (defaults to False)
         @type bool (optional)
@@ -188,32 +189,30 @@
         """
         dbName = (
             PipVulnerabilityChecker.FullDbFile
-            if full else
-            PipVulnerabilityChecker.SummaryDbFile
+            if full
+            else PipVulnerabilityChecker.SummaryDbFile
         )
-        
+
         if not forceUpdate:
             cachedData = self.__getDataFromCache(dbName)
             if cachedData:
                 return cachedData
-        
+
         url = Preferences.getPip("VulnerabilityDbMirror") + dbName
         request = QNetworkRequest(QUrl(url))
         reply = self.__pip.getNetworkAccessManager().get(request)
         while not reply.isFinished():
             QCoreApplication.processEvents()
             QThread.msleep(100)
-        
+
         reply.deleteLater()
         if reply.error() == QNetworkReply.NetworkError.NoError:
-            data = str(reply.readAll(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            data = str(reply.readAll(), Preferences.getSystem("IOEncoding"), "replace")
             with contextlib.suppress(json.JSONDecodeError):
                 data = json.loads(data)
                 self.__writeDataToCache(dbName, data)
                 return data
-        
+
         EricMessageBox.critical(
             None,
             self.tr("Fetching Vulnerability Database"),
@@ -221,14 +220,14 @@
                 """<p>The vulnerability database <b>{0}</b> could not"""
                 """ be loaded from <b>{1}</b>.</p><p>The vulnerability"""
                 """ check is not available.</p>"""
-            ).format(dbName, Preferences.getPip("VulnerabilityDbMirror"))
+            ).format(dbName, Preferences.getPip("VulnerabilityDbMirror")),
         )
         return {}
-    
+
     def __getVulnerabilities(self, package, specifier, db):
         """
         Private method to get the vulnerabilities for a package.
-        
+
         @param package name of the package
         @type str
         @param specifier package specifier
@@ -242,11 +241,11 @@
             for entrySpec in entry["specs"]:
                 if entrySpec == specifier:
                     yield entry
-    
+
     def check(self, packages):
         """
         Public method to check the given packages for vulnerabilities.
-        
+
         @param packages list of packages
         @type Package
         @return tuple containing an error status and a dictionary containing
@@ -256,44 +255,43 @@
         db = self.__fetchVulnerabilityDatabase()
         if not db:
             return VulnerabilityCheckError.SummaryDbUnavailable, []
-        
+
         fullDb = None
         vulnerablePackages = frozenset(db.keys())
         vulnerabilities = collections.defaultdict(list)
-        
+
         for package in packages:
             # normalize the package name, the safety-db is converting
             # underscores to dashes and uses lowercase
             name = package.name.replace("_", "-").lower()
-        
+
             if name in vulnerablePackages:
                 # we have a candidate here, build the spec set
                 for specifier in db[name]:
                     specifierSet = SpecifierSet(specifiers=specifier)
                     if specifierSet.contains(package.version):
                         if not fullDb:
-                            fullDb = self.__fetchVulnerabilityDatabase(
-                                full=True)
+                            fullDb = self.__fetchVulnerabilityDatabase(full=True)
                         for data in self.__getVulnerabilities(
                             package=name, specifier=specifier, db=fullDb
                         ):
-                            vulnarabilityId = (
-                                data.get("id").replace("pyup.io-", "")
-                            )
+                            vulnarabilityId = data.get("id").replace("pyup.io-", "")
                             cveId = data.get("cve", "")
                             if cveId:
                                 cveId = cveId.split(",", 1)[0].strip()
-                            vulnerabilities[package.name].append(Vulnerability(
-                                name=name,
-                                spec=specifier,
-                                version=package.version,
-                                cve=cveId,
-                                advisory=data.get("advisory", ""),
-                                vulnerabilityId=vulnarabilityId
-                            ))
-        
+                            vulnerabilities[package.name].append(
+                                Vulnerability(
+                                    name=name,
+                                    spec=specifier,
+                                    version=package.version,
+                                    cve=cveId,
+                                    advisory=data.get("advisory", ""),
+                                    vulnerabilityId=vulnarabilityId,
+                                )
+                            )
+
         return VulnerabilityCheckError.OK, vulnerabilities
-    
+
     def updateVulnerabilityDb(self):
         """
         Public method to update the cache of the vulnerability databases.
--- a/src/eric7/PluginManager/PluginDetailsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginDetailsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,20 +17,21 @@
     """
     Class implementing the Plugin Details Dialog.
     """
+
     def __init__(self, details, parent=None):
         """
         Constructor
-        
+
         @param details dictionary containing the info to be displayed
         @param parent parent of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__autoactivate = details["autoactivate"]
         self.__active = details["active"]
-        
+
         self.moduleNameEdit.setText(details["moduleName"])
         self.moduleFileNameEdit.setText(details["moduleFileName"])
         self.pluginNameEdit.setText(details["pluginName"])
@@ -40,14 +41,14 @@
         self.errorEdit.setText(details["error"])
         self.autoactivateCheckBox.setChecked(details["autoactivate"])
         self.activeCheckBox.setChecked(details["active"])
-    
+
     @pyqtSlot()
     def on_activeCheckBox_clicked(self):
         """
         Private slot called, when the activeCheckBox was clicked.
         """
         self.activeCheckBox.setChecked(self.__active)
-    
+
     @pyqtSlot()
     def on_autoactivateCheckBox_clicked(self):
         """
--- a/src/eric7/PluginManager/PluginExceptions.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginExceptions.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,25 +14,27 @@
     """
     Class defining a special error for the plugin classes.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError", "Unspecific plugin error.")
-        
+            "PluginError", "Unspecific plugin error."
+        )
+
     def __repr__(self):
         """
         Special method returning a representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self._errorMessage)
-        
+
     def __str__(self):
         """
         Special method returning a string representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self._errorMessage)
@@ -43,30 +45,33 @@
     Class defining an error raised, when the plugin paths were not found and
     could not be created.
     """
+
     def __init__(self, msg=None):
         """
         Constructor
-        
+
         @param msg message to be used by the exception (string)
         """
         if msg:
             self._errorMessage = msg
         else:
             self._errorMessage = QCoreApplication.translate(
-                "PluginError",
-                "Plugin paths not found or not creatable.")
+                "PluginError", "Plugin paths not found or not creatable."
+            )
 
 
 class PluginModulesError(PluginError):
     """
     Class defining an error raised, when no plugin modules were found.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError", "No plugin modules found.")
+            "PluginError", "No plugin modules found."
+        )
 
 
 class PluginLoadError(PluginError):
@@ -74,15 +79,15 @@
     Class defining an error raised, when there was an error during plugin
     loading.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the plugin module (string)
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError",
-            "Error loading plugin module: {0}"
+            "PluginError", "Error loading plugin module: {0}"
         ).format(name)
 
 
@@ -91,15 +96,15 @@
     Class defining an error raised, when there was an error during plugin
     activation.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the plugin module (string)
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError",
-            "Error activating plugin module: {0}"
+            "PluginError", "Error activating plugin module: {0}"
         ).format(name)
 
 
@@ -107,16 +112,16 @@
     """
     Class defining an error raised, when the plugin module is invalid.
     """
+
     def __init__(self, name, missing):
         """
         Constructor
-        
+
         @param name name of the plugin module (string)
         @param missing description of the missing element (string)
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError",
-            "The plugin module {0} is missing {1}."
+            "PluginError", "The plugin module {0} is missing {1}."
         ).format(name, missing)
 
 
@@ -124,16 +129,16 @@
     """
     Class defining an error raised, when the plugin module's class is invalid.
     """
+
     def __init__(self, name, class_, missing):
         """
         Constructor
-        
+
         @param name name of the plugin module (string)
         @param class_ name of the class not satisfying the requirements
             (string)
         @param missing description of the missing element (string)
         """
         self._errorMessage = QCoreApplication.translate(
-            "PluginError",
-            "The plugin class {0} of module {1} is missing {2}."
+            "PluginError", "The plugin class {0} of module {1} is missing {2}."
         ).format(class_, name, missing)
--- a/src/eric7/PluginManager/PluginInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,39 +18,40 @@
     """
     Class implementing the Plugin Info Dialog.
     """
+
     def __init__(self, pluginManager, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @param parent parent of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.pm = pluginManager
-        
+
         self.__autoActivateColumn = 3
         self.__activeColumn = 4
-        
+
         self.pluginList.headerItem().setText(self.pluginList.columnCount(), "")
-        
+
         # populate the list
         self.__populateList()
         self.pluginList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.__menu = QMenu(self)
-        self.__menu.addAction(self.tr('Show details'), self.__showDetails)
+        self.__menu.addAction(self.tr("Show details"), self.__showDetails)
         self.__activateAct = self.__menu.addAction(
-            self.tr('Activate'), self.__activatePlugin)
+            self.tr("Activate"), self.__activatePlugin
+        )
         self.__deactivateAct = self.__menu.addAction(
-            self.tr('Deactivate'), self.__deactivatePlugin)
-        self.pluginList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.pluginList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-    
+            self.tr("Deactivate"), self.__deactivatePlugin
+        )
+        self.pluginList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.pluginList.customContextMenuRequested.connect(self.__showContextMenu)
+
     def __populateList(self):
         """
         Private method to (re)populate the list of plugins.
@@ -59,13 +60,13 @@
         for info in self.pm.getPluginInfos():
             self.__createEntry(info)
         self.pluginList.sortItems(
-            self.pluginList.sortColumn(),
-            self.pluginList.header().sortIndicatorOrder())
-        
+            self.pluginList.sortColumn(), self.pluginList.header().sortIndicatorOrder()
+        )
+
     def __createEntry(self, info):
         """
         Private method to create a list entry based on the provided info.
-        
+
         @param info dictionary giving the info for the entry (as returned by
             PluginManager.getPluginInfos())
         @type dict
@@ -76,32 +77,28 @@
             info["version"],
             (info["auto_activate"] and self.tr("Yes") or self.tr("On-Demand")),
             (info["active"] and self.tr("Yes") or self.tr("No")),
-            info["short_desc"]
+            info["short_desc"],
         ]
         itm = QTreeWidgetItem(self.pluginList, infoList)
         if info["error"]:
             # plugin error
             for col in range(self.pluginList.columnCount()):
                 itm.setForeground(col, QBrush(Qt.GlobalColor.red))
-        itm.setTextAlignment(self.__autoActivateColumn,
-                             Qt.AlignmentFlag.AlignHCenter)
-        itm.setTextAlignment(self.__activeColumn,
-                             Qt.AlignmentFlag.AlignHCenter)
-        
-        self.pluginList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        itm.setTextAlignment(self.__autoActivateColumn, Qt.AlignmentFlag.AlignHCenter)
+        itm.setTextAlignment(self.__activeColumn, Qt.AlignmentFlag.AlignHCenter)
+
+        self.pluginList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.pluginList.header().setStretchLastSection(True)
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         itm = self.pluginList.itemAt(coord)
         if itm is not None:
-            autoactivate = (itm.text(self.__autoActivateColumn) ==
-                            self.tr("Yes"))
+            autoactivate = itm.text(self.__autoActivateColumn) == self.tr("Yes")
             if itm.text(self.__activeColumn) == self.tr("Yes"):
                 self.__activateAct.setEnabled(False)
                 self.__deactivateAct.setEnabled(autoactivate)
@@ -109,12 +106,12 @@
                 self.__activateAct.setEnabled(autoactivate)
                 self.__deactivateAct.setEnabled(False)
             self.__menu.popup(self.mapToGlobal(coord))
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_pluginList_itemActivated(self, item, column):
         """
         Private slot to show details about a plugin.
-        
+
         @param item reference to the selected item (QTreeWidgetItem)
         @param column column number (integer)
         """
@@ -124,16 +121,17 @@
             pass
         else:
             from .PluginDetailsDialog import PluginDetailsDialog
+
             dlg = PluginDetailsDialog(details, self)
             dlg.show()
-    
+
     def __showDetails(self):
         """
         Private slot to handle the "Show details" context menu action.
         """
         itm = self.pluginList.currentItem()
         self.on_pluginList_itemActivated(itm, 0)
-    
+
     def __activatePlugin(self):
         """
         Private slot to handle the "Deactivate" context menu action.
@@ -143,7 +141,7 @@
         self.pm.activatePlugin(moduleName)
         # repopulate the list
         self.__populateList()
-    
+
     def __deactivatePlugin(self):
         """
         Private slot to handle the "Activate" context menu action.
--- a/src/eric7/PluginManager/PluginInstallDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginInstallDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,8 +20,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QAbstractButton, QApplication, QDialog,
-    QVBoxLayout
+    QWidget,
+    QDialogButtonBox,
+    QAbstractButton,
+    QApplication,
+    QDialog,
+    QVBoxLayout,
 )
 
 from EricWidgets import EricFileDialog
@@ -39,10 +43,11 @@
     """
     Class implementing the Plugin installation dialog.
     """
+
     def __init__(self, pluginManager, pluginFileNames, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @param pluginFileNames list of plugin files suggested for
             installation (list of strings)
@@ -50,45 +55,49 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if pluginManager is None:
             # started as external plugin installer
             from .PluginManager import PluginManager
+
             self.__pluginManager = PluginManager(doLoadPlugins=False)
             self.__external = True
         else:
             self.__pluginManager = pluginManager
             self.__external = False
-        
+
         self.__backButton = self.buttonBox.addButton(
-            self.tr("< Back"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("< Back"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__nextButton = self.buttonBox.addButton(
-            self.tr("Next >"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Next >"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__finishButton = self.buttonBox.addButton(
-            self.tr("Install"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Install"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.__closeButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close)
+            QDialogButtonBox.StandardButton.Close
+        )
         self.__cancelButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel)
-        
+            QDialogButtonBox.StandardButton.Cancel
+        )
+
         userDir = self.__pluginManager.getPluginDir("user")
         if userDir is not None:
-            self.destinationCombo.addItem(
-                self.tr("User plugins directory"),
-                userDir)
-        
+            self.destinationCombo.addItem(self.tr("User plugins directory"), userDir)
+
         globalDir = self.__pluginManager.getPluginDir("global")
         if globalDir is not None and os.access(globalDir, os.W_OK):
             self.destinationCombo.addItem(
-                self.tr("Global plugins directory"),
-                globalDir)
-        
+                self.tr("Global plugins directory"), globalDir
+            )
+
         self.__installedDirs = []
         self.__installedFiles = []
-        
+
         self.__restartNeeded = False
-        
+
         downloadDir = Preferences.getPluginManager("DownloadPath")
         for pluginFileName in pluginFileNames:
             pluginFilePath = pathlib.Path(pluginFileName)
@@ -96,22 +105,22 @@
                 pluginFilePath = downloadDir / pluginFilePath
             self.archivesList.addItem(str(pluginFilePath))
             self.archivesList.sortItems()
-        
+
         self.__currentIndex = 0
         self.__selectPage()
-    
+
     def restartNeeded(self):
         """
         Public method to check, if a restart of the IDE is required.
-        
+
         @return flag indicating a restart is required (boolean)
         """
         return self.__restartNeeded
-    
+
     def __createArchivesList(self):
         """
         Private method to create a list of plugin archive names.
-        
+
         @return list of plugin archive names (list of strings)
         """
         archivesList = []
@@ -142,18 +151,16 @@
             self.__finishButton.setEnabled(True)
             self.__closeButton.hide()
             self.__cancelButton.show()
-            
+
             msg = self.tr(
                 "Plugin ZIP-Archives:\n{0}\n\nDestination:\n{1} ({2})"
             ).format(
                 "\n".join(self.__createArchivesList()),
                 self.destinationCombo.currentText(),
-                self.destinationCombo.itemData(
-                    self.destinationCombo.currentIndex()
-                )
+                self.destinationCombo.itemData(self.destinationCombo.currentIndex()),
             )
             self.summaryEdit.setPlainText(msg)
-    
+
     @pyqtSlot()
     def on_addArchivesButton_clicked(self):
         """
@@ -164,8 +171,9 @@
             self,
             self.tr("Select plugin ZIP-archives"),
             dn,
-            self.tr("Plugin archive (*.zip)"))
-        
+            self.tr("Plugin archive (*.zip)"),
+        )
+
         if archives:
             matchflags = Qt.MatchFlag.MatchFixedString
             if not Utilities.isWindowsPlatform():
@@ -175,34 +183,32 @@
                     # entry not in list already
                     self.archivesList.addItem(archive)
             self.archivesList.sortItems()
-        
+
         self.__nextButton.setEnabled(self.archivesList.count() > 0)
-    
+
     @pyqtSlot()
     def on_archivesList_itemSelectionChanged(self):
         """
         Private slot called, when the selection of the archives list changes.
         """
-        self.removeArchivesButton.setEnabled(
-            len(self.archivesList.selectedItems()) > 0)
-    
+        self.removeArchivesButton.setEnabled(len(self.archivesList.selectedItems()) > 0)
+
     @pyqtSlot()
     def on_removeArchivesButton_clicked(self):
         """
         Private slot to remove archives from the list.
         """
         for archiveItem in self.archivesList.selectedItems():
-            itm = self.archivesList.takeItem(
-                self.archivesList.row(archiveItem))
+            itm = self.archivesList.takeItem(self.archivesList.row(archiveItem))
             del itm
-        
+
         self.__nextButton.setEnabled(self.archivesList.count() > 0)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the click of a button of the button box.
-        
+
         @param button reference to the button pressed (QAbstractButton)
         """
         if button == self.__backButton:
@@ -219,18 +225,17 @@
                 self.__restartNeeded = True
             self.__closeButton.show()
             self.__cancelButton.hide()
-    
+
     def __installPlugins(self):
         """
         Private method to install the selected plugin archives.
-        
+
         @return flag indicating success (boolean)
         """
         res = True
         self.summaryEdit.clear()
         for archive in self.__createArchivesList():
-            self.summaryEdit.append(
-                self.tr("Installing {0} ...").format(archive))
+            self.summaryEdit.append(self.tr("Installing {0} ...").format(archive))
             ok, msg, restart = self.__installPlugin(archive)
             res = res and ok
             if ok:
@@ -241,18 +246,18 @@
                 self.__restartNeeded = True
         self.summaryEdit.append("\n")
         if res:
-            self.summaryEdit.append(self.tr(
-                """The plugins were installed successfully."""))
+            self.summaryEdit.append(
+                self.tr("""The plugins were installed successfully.""")
+            )
         else:
-            self.summaryEdit.append(self.tr(
-                """Some plugins could not be installed."""))
-        
+            self.summaryEdit.append(self.tr("""Some plugins could not be installed."""))
+
         return res
-    
+
     def __installPlugin(self, archiveFilename):
         """
         Private slot to install the selected plugin.
-        
+
         @param archiveFilename name of the plugin archive
             file (string)
         @return flag indicating success (boolean), error message
@@ -260,14 +265,15 @@
             of the IDE is required (boolean)
         """
         installedPluginName = ""
-        
+
         archive = archiveFilename
         destination = self.destinationCombo.itemData(
-            self.destinationCombo.currentIndex())
-        
+            self.destinationCombo.currentIndex()
+        )
+
         # check if archive is a local url
         url = urllib.parse.urlparse(archive)
-        if url[0].lower() == 'file':
+        if url[0].lower() == "file":
             archive = url[2]
 
         # check, if the archive exists
@@ -276,32 +282,35 @@
                 False,
                 self.tr(
                     """<p>The archive file <b>{0}</b> does not exist. """
-                    """Aborting...</p>""").format(archive),
-                False
+                    """Aborting...</p>"""
+                ).format(archive),
+                False,
             )
-        
+
         # check, if the archive is a valid zip file
         if not zipfile.is_zipfile(archive):
             return (
                 False,
                 self.tr(
                     """<p>The file <b>{0}</b> is not a valid plugin """
-                    """ZIP-archive. Aborting...</p>""").format(archive),
-                False
+                    """ZIP-archive. Aborting...</p>"""
+                ).format(archive),
+                False,
             )
-        
+
         # check, if the destination is writeable
         if not os.access(destination, os.W_OK):
             return (
                 False,
                 self.tr(
                     """<p>The destination directory <b>{0}</b> is not """
-                    """writeable. Aborting...</p>""").format(destination),
-                False
+                    """writeable. Aborting...</p>"""
+                ).format(destination),
+                False,
             )
-        
+
         zipFile = zipfile.ZipFile(archive, "r")
-        
+
         # check, if the archive contains a valid plugin
         pluginFound = False
         pluginFileName = ""
@@ -311,16 +320,17 @@
                 pluginFound = True
                 pluginFileName = name
                 break
-        
+
         if not pluginFound:
             return (
                 False,
                 self.tr(
                     """<p>The file <b>{0}</b> is not a valid plugin """
-                    """ZIP-archive. Aborting...</p>""").format(archive),
-                False
+                    """ZIP-archive. Aborting...</p>"""
+                ).format(archive),
+                False,
             )
-        
+
         # parse the plugin module's plugin header
         pluginSource = Utilities.decode(zipFile.read(pluginFileName))[0]
         packageName = ""
@@ -332,8 +342,8 @@
             if line.startswith("packageName"):
                 tokens = line.split("=")
                 if (
-                    tokens[0].strip() == "packageName" and
-                    tokens[1].strip()[1:-1] != "__core__"
+                    tokens[0].strip() == "packageName"
+                    and tokens[1].strip()[1:-1] != "__core__"
                 ):
                     if tokens[1].strip()[0] in ['"', "'"]:
                         packageName = tokens[1].strip()[1:-1]
@@ -358,7 +368,7 @@
                     doCompile = False
             elif line.startswith("# End-Of-Header"):
                 break
-        
+
         if not packageName:
             return (
                 False,
@@ -366,9 +376,9 @@
                     """<p>The plugin module <b>{0}</b> does not contain """
                     """a 'packageName' attribute. Aborting...</p>"""
                 ).format(pluginFileName),
-                False
+                False,
             )
-        
+
         if pyqtApi < 2:
             return (
                 False,
@@ -376,62 +386,62 @@
                     """<p>The plugin module <b>{0}</b> does not conform"""
                     """ with the PyQt v2 API. Aborting...</p>"""
                 ).format(pluginFileName),
-                False
+                False,
             )
-        
+
         # check, if it is a plugin, that collides with others
         if (
-            not os.path.exists(os.path.join(destination, pluginFileName)) and
-            packageName != "None" and
-            os.path.exists(os.path.join(destination, packageName))
+            not os.path.exists(os.path.join(destination, pluginFileName))
+            and packageName != "None"
+            and os.path.exists(os.path.join(destination, packageName))
         ):
             return (
                 False,
-                self.tr("""<p>The plugin package <b>{0}</b> exists. """
-                        """Aborting...</p>""").format(
-                    os.path.join(destination, packageName)),
-                False
+                self.tr(
+                    """<p>The plugin package <b>{0}</b> exists. """
+                    """Aborting...</p>"""
+                ).format(os.path.join(destination, packageName)),
+                False,
             )
-        
+
         if (
-            os.path.exists(os.path.join(destination, pluginFileName)) and
-            packageName != "None" and
-            not os.path.exists(os.path.join(destination, packageName))
+            os.path.exists(os.path.join(destination, pluginFileName))
+            and packageName != "None"
+            and not os.path.exists(os.path.join(destination, packageName))
         ):
             return (
                 False,
-                self.tr("""<p>The plugin module <b>{0}</b> exists. """
-                        """Aborting...</p>""").format(
-                    os.path.join(destination, pluginFileName)),
-                False
+                self.tr(
+                    """<p>The plugin module <b>{0}</b> exists. """ """Aborting...</p>"""
+                ).format(os.path.join(destination, pluginFileName)),
+                False,
             )
-        
+
         activatePlugin = False
         if not self.__external:
-            activatePlugin = (
-                not self.__pluginManager.isPluginLoaded(
-                    installedPluginName) or
-                (self.__pluginManager.isPluginLoaded(installedPluginName) and
-                 self.__pluginManager.isPluginActive(installedPluginName))
+            activatePlugin = not self.__pluginManager.isPluginLoaded(
+                installedPluginName
+            ) or (
+                self.__pluginManager.isPluginLoaded(installedPluginName)
+                and self.__pluginManager.isPluginActive(installedPluginName)
             )
             # try to unload a plugin with the same name
             self.__pluginManager.unloadPlugin(installedPluginName)
-        
+
         # uninstall existing plug-in first to get clean conditions
-        if (
-            packageName != "None" and
-            not os.path.exists(
-                os.path.join(destination, packageName, "__init__.py"))
+        if packageName != "None" and not os.path.exists(
+            os.path.join(destination, packageName, "__init__.py")
         ):
             # package directory contains just data, don't delete it
             self.__uninstallPackage(destination, pluginFileName, "")
         else:
             self.__uninstallPackage(destination, pluginFileName, packageName)
-        
+
         # clean sys.modules
         reload_ = self.__pluginManager.removePluginFromSysModules(
-            installedPluginName, packageName, internalPackages)
-        
+            installedPluginName, packageName, internalPackages
+        )
+
         # now do the installation
         self.__installedDirs = []
         self.__installedFiles = []
@@ -441,7 +451,7 @@
                 tot = len(namelist)
                 self.progress.setMaximum(tot)
                 QApplication.processEvents()
-                
+
                 now = time.monotonic()
                 for prog, name in enumerate(namelist):
                     self.progress.setValue(prog)
@@ -449,9 +459,9 @@
                         QApplication.processEvents()
                         now = time.monotonic()
                     if (
-                        name == pluginFileName or
-                        name.startswith("{0}/".format(packageName)) or
-                        name.startswith("{0}\\".format(packageName))
+                        name == pluginFileName
+                        or name.startswith("{0}/".format(packageName))
+                        or name.startswith("{0}\\".format(packageName))
                     ):
                         outname = name.replace("/", os.sep)
                         outname = os.path.join(destination, outname)
@@ -480,19 +490,14 @@
             self.__rollback()
             return (
                 False,
-                self.tr("Error installing plugin. Reason: {0}")
-                .format(str(why)),
-                False
+                self.tr("Error installing plugin. Reason: {0}").format(str(why)),
+                False,
             )
         except Exception:
             sys.stderr.write("Unspecific exception installing plugin.\n")
             self.__rollback()
-            return (
-                False,
-                self.tr("Unspecific exception installing plugin."),
-                False
-            )
-        
+            return (False, self.tr("Unspecific exception installing plugin."), False)
+
         # now compile the plugins
         if doCompile:
             dirName = os.path.join(destination, packageName)
@@ -501,15 +506,16 @@
             compileall.compile_dir(dirName, quiet=True)
             compileall.compile_file(files, quiet=True)
             os.path.join_unicode = True
-        
+
             # now load and activate the plugin
         self.__pluginManager.loadPlugin(
-            installedPluginName, destination, reload_=reload_, install=True)
+            installedPluginName, destination, reload_=reload_, install=True
+        )
         if activatePlugin and not self.__external:
             self.__pluginManager.activatePlugin(installedPluginName)
-        
+
         return True, "", needsRestart
-    
+
     def __rollback(self):
         """
         Private method to rollback a failed installation.
@@ -520,14 +526,14 @@
         for dname in self.__installedDirs:
             if os.path.exists(dname):
                 shutil.rmtree(dname)
-    
+
     def __makedirs(self, name, mode=0o777):
         """
         Private method to create a directory and all intermediate ones.
-        
+
         This is an extended version of the Python one in order to
         record the created directories.
-        
+
         @param name name of the directory to create (string)
         @param mode permission to set for the new directory (integer)
         """
@@ -541,49 +547,47 @@
                 return
         os.mkdir(name, mode)
         self.__installedDirs.append(name)
-    
+
     def __uninstallPackage(self, destination, pluginFileName, packageName):
         """
         Private method to uninstall an already installed plugin to prepare
         the update.
-        
+
         @param destination name of the plugin directory (string)
         @param pluginFileName name of the plugin file (string)
         @param packageName name of the plugin package (string)
         """
         packageDir = (
             None
-            if packageName in ("", "None") else
-            os.path.join(destination, packageName)
+            if packageName in ("", "None")
+            else os.path.join(destination, packageName)
         )
         pluginFile = os.path.join(destination, pluginFileName)
-        
+
         with contextlib.suppress(OSError, os.error):
             if packageDir and os.path.exists(packageDir):
                 shutil.rmtree(packageDir)
-            
+
             fnameo = "{0}o".format(pluginFile)
             if os.path.exists(fnameo):
                 os.remove(fnameo)
-            
+
             fnamec = "{0}c".format(pluginFile)
             if os.path.exists(fnamec):
                 os.remove(fnamec)
-            
-            pluginDirCache = os.path.join(
-                os.path.dirname(pluginFile), "__pycache__")
+
+            pluginDirCache = os.path.join(os.path.dirname(pluginFile), "__pycache__")
             if os.path.exists(pluginDirCache):
-                pluginFileName = os.path.splitext(
-                    os.path.basename(pluginFile))[0]
+                pluginFileName = os.path.splitext(os.path.basename(pluginFile))[0]
                 for fnameo in glob.glob(
-                    os.path.join(pluginDirCache,
-                                 "{0}*.pyo".format(pluginFileName))):
+                    os.path.join(pluginDirCache, "{0}*.pyo".format(pluginFileName))
+                ):
                     os.remove(fnameo)
                 for fnamec in glob.glob(
-                    os.path.join(pluginDirCache,
-                                 "{0}*.pyc".format(pluginFileName))):
+                    os.path.join(pluginDirCache, "{0}*.pyc".format(pluginFileName))
+                ):
                     os.remove(fnamec)
-            
+
             os.remove(pluginFile)
 
 
@@ -591,10 +595,11 @@
     """
     Class for the dialog variant.
     """
+
     def __init__(self, pluginManager, pluginFileNames, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @param pluginFileNames list of plugin files suggested for
             installation (list of strings)
@@ -602,24 +607,24 @@
         """
         super().__init__(parent)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.cw = PluginInstallWidget(pluginManager, pluginFileNames, self)
         size = self.cw.size()
         self.__layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.buttonBox.accepted.connect(self.accept)
         self.cw.buttonBox.rejected.connect(self.reject)
-    
+
     def restartNeeded(self):
         """
         Public method to check, if a restart of the IDE is required.
-        
+
         @return flag indicating a restart is required (boolean)
         """
         return self.cw.restartNeeded()
@@ -629,10 +634,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, pluginFileNames, parent=None):
         """
         Constructor
-        
+
         @param pluginFileNames list of plugin files suggested for
             installation (list of strings)
         @param parent reference to the parent widget (QWidget)
@@ -643,9 +649,8 @@
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.buttonBox.accepted.connect(self.close)
         self.cw.buttonBox.rejected.connect(self.close)
--- a/src/eric7/PluginManager/PluginManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,25 +18,27 @@
 
 from PyQt6.QtCore import pyqtSignal, QObject, QFile, QUrl, QIODevice
 from PyQt6.QtGui import QPixmap
-from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply
-)
+from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
 
 from EricWidgets import EricMessageBox
 from EricWidgets.EricApplication import ericApp
 
 from EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired
+
 try:
-    from EricNetwork.EricSslErrorHandler import (
-        EricSslErrorHandler, EricSslErrorState
-    )
+    from EricNetwork.EricSslErrorHandler import EricSslErrorHandler, EricSslErrorState
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
 
 from .PluginExceptions import (
-    PluginPathError, PluginModulesError, PluginLoadError,
-    PluginActivationError, PluginModuleFormatError, PluginClassFormatError
+    PluginPathError,
+    PluginModulesError,
+    PluginLoadError,
+    PluginActivationError,
+    PluginModuleFormatError,
+    PluginClassFormatError,
 )
 
 import UI.PixmapCache
@@ -51,7 +53,7 @@
 class PluginManager(QObject):
     """
     Class implementing the Plugin Manager.
-    
+
     @signal shutdown() emitted at shutdown of the IDE
     @signal pluginAboutToBeActivated(modulName, pluginObject) emitted just
         before a plugin is activated
@@ -66,6 +68,7 @@
     @signal pluginRepositoryFileDownloaded() emitted to indicate a completed
         download of the plugin repository file
     """
+
     shutdown = pyqtSignal()
     pluginAboutToBeActivated = pyqtSignal(str, object)
     pluginActivated = pyqtSignal(str, object)
@@ -73,19 +76,20 @@
     pluginAboutToBeDeactivated = pyqtSignal(str, object)
     pluginDeactivated = pyqtSignal(str, object)
     pluginRepositoryFileDownloaded = pyqtSignal()
-    
-    def __init__(self, parent=None, disabledPlugins=None, doLoadPlugins=True,
-                 develPlugin=None):
+
+    def __init__(
+        self, parent=None, disabledPlugins=None, doLoadPlugins=True, develPlugin=None
+    ):
         """
         Constructor
-        
+
         The Plugin Manager deals with three different plugin directories.
         The first is the one, that is part of eric7 (eric7/Plugins). The
         second one is the global plugin directory called 'eric7plugins',
         which is located inside the site-packages directory. The last one
         is the user plugin directory located inside the .eric7 directory
         of the users home directory.
-        
+
         @param parent reference to the parent object
         @type QObject
         @param disabledPlugins list of plug-ins that have been disabled via
@@ -102,7 +106,7 @@
             plug-in modules
         """
         super().__init__(parent)
-        
+
         self.__ui = parent
         self.__develPluginFile = develPlugin
         self.__develPluginName = None
@@ -110,20 +114,20 @@
             self.__disabledPlugins = disabledPlugins[:]
         else:
             self.__disabledPlugins = []
-        
+
         self.__inactivePluginsKey = "PluginManager/InactivePlugins"
-        
+
         self.pluginDirs = {
-            "eric7": os.path.join(getConfig('ericDir'), "Plugins"),
-            "global": os.path.join(Utilities.getPythonLibraryDirectory(),
-                                   "eric7plugins"),
+            "eric7": os.path.join(getConfig("ericDir"), "Plugins"),
+            "global": os.path.join(
+                Utilities.getPythonLibraryDirectory(), "eric7plugins"
+            ),
             "user": os.path.join(Utilities.getConfigDir(), "eric7plugins"),
         }
         self.__priorityOrder = ["eric7", "global", "user"]
-        
-        self.__defaultDownloadDir = os.path.join(
-            Utilities.getConfigDir(), "Downloads")
-        
+
+        self.__defaultDownloadDir = os.path.join(Utilities.getConfigDir(), "Downloads")
+
         self.__activePlugins = {}
         self.__inactivePlugins = {}
         self.__onDemandActivePlugins = {}
@@ -133,54 +137,55 @@
         self.__onDemandActiveModules = {}
         self.__onDemandInactiveModules = {}
         self.__failedModules = {}
-        
+
         self.__foundCoreModules = []
         self.__foundGlobalModules = []
         self.__foundUserModules = []
-        
+
         self.__modulesCount = 0
-        
+
         pdirsExist, msg = self.__pluginDirectoriesExist()
         if not pdirsExist:
             raise PluginPathError(msg)
-        
+
         if doLoadPlugins:
             if not self.__pluginModulesExist():
                 raise PluginModulesError
-            
+
             self.__insertPluginsPaths()
-            
+
             self.__loadPlugins()
-        
+
         self.__checkPluginsDownloadDirectory()
-        
-        self.pluginRepositoryFile = os.path.join(Utilities.getConfigDir(),
-                                                 "PluginRepository")
-        
+
+        self.pluginRepositoryFile = os.path.join(
+            Utilities.getConfigDir(), "PluginRepository"
+        )
+
         # attributes for the network objects
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
+            proxyAuthenticationRequired
+        )
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
             self.__networkManager.sslErrors.connect(self.__sslErrors)
         self.__replies = []
-        
+
     def finalizeSetup(self):
         """
         Public method to finalize the setup of the plugin manager.
         """
-        for module in (
-            list(self.__onDemandInactiveModules.values()) +
-            list(self.__onDemandActiveModules.values())
+        for module in list(self.__onDemandInactiveModules.values()) + list(
+            self.__onDemandActiveModules.values()
         ):
             if hasattr(module, "moduleSetup"):
                 module.moduleSetup()
-        
+
     def getPluginDir(self, key):
         """
         Public method to get the path of a plugin directory.
-        
+
         @param key key of the plug-in directory (string)
         @return path of the requested plugin directory (string)
         """
@@ -191,13 +196,13 @@
                 return self.pluginDirs[key]
             except KeyError:
                 return None
-    
+
     def __pluginDirectoriesExist(self):
         """
         Private method to check, if the plugin folders exist.
-        
+
         If the plugin folders don't exist, they are created (if possible).
-        
+
         @return tuple of a flag indicating existence of any of the plugin
             directories (boolean) and a message (string)
         """
@@ -211,9 +216,11 @@
                 except OSError:
                     return (
                         False,
-                        self.tr("Could not create a package for {0}.")
-                            .format(self.__develPluginFile))
-        
+                        self.tr("Could not create a package for {0}.").format(
+                            self.__develPluginFile
+                        ),
+                    )
+
         fname = os.path.join(self.pluginDirs["user"], "__init__.py")
         if not os.path.exists(fname):
             if not os.path.exists(self.pluginDirs["user"]):
@@ -223,77 +230,81 @@
                     pass
             except OSError:
                 del self.pluginDirs["user"]
-        
+
         if not os.path.exists(self.pluginDirs["global"]):
             try:
                 # create the global plugins directory
                 os.mkdir(self.pluginDirs["global"], 0o755)
                 fname = os.path.join(self.pluginDirs["global"], "__init__.py")
                 with open(fname, "w", encoding="utf-8") as f:
-                    f.write('# -*- coding: utf-8 -*-' + "\n")
+                    f.write("# -*- coding: utf-8 -*-" + "\n")
                     f.write("\n")
                     f.write('"""' + "\n")
-                    f.write('Package containing the global plugins.' + "\n")
+                    f.write("Package containing the global plugins." + "\n")
                     f.write('"""' + "\n")
             except OSError:
                 del self.pluginDirs["global"]
-        
+
         if not os.path.exists(self.pluginDirs["eric7"]):
             return (
                 False,
                 self.tr(
-                    "The internal plugin directory <b>{0}</b>"
-                    " does not exits.").format(self.pluginDirs["eric7"]))
-        
+                    "The internal plugin directory <b>{0}</b>" " does not exits."
+                ).format(self.pluginDirs["eric7"]),
+            )
+
         return (True, "")
-    
+
     def __pluginModulesExist(self):
         """
         Private method to check, if there are plugins available.
-        
+
         @return flag indicating the availability of plugins (boolean)
         """
-        if (
-            self.__develPluginFile and
-            not os.path.exists(self.__develPluginFile)
-        ):
+        if self.__develPluginFile and not os.path.exists(self.__develPluginFile):
             return False
-        
-        self.__foundCoreModules = self.getPluginModules(
-            self.pluginDirs["eric7"])
+
+        self.__foundCoreModules = self.getPluginModules(self.pluginDirs["eric7"])
         if Preferences.getPluginManager("ActivateExternal"):
             if "global" in self.pluginDirs:
                 self.__foundGlobalModules = self.getPluginModules(
-                    self.pluginDirs["global"])
+                    self.pluginDirs["global"]
+                )
             if "user" in self.pluginDirs:
-                self.__foundUserModules = self.getPluginModules(
-                    self.pluginDirs["user"])
-        
-        return len(self.__foundCoreModules + self.__foundGlobalModules +
-                   self.__foundUserModules) > 0
-    
+                self.__foundUserModules = self.getPluginModules(self.pluginDirs["user"])
+
+        return (
+            len(
+                self.__foundCoreModules
+                + self.__foundGlobalModules
+                + self.__foundUserModules
+            )
+            > 0
+        )
+
     def getPluginModules(self, pluginPath):
         """
         Public method to get a list of plugin modules.
-        
+
         @param pluginPath name of the path to search (string)
         @return list of plugin module names (list of string)
         """
-        pluginFiles = [f[:-3] for f in os.listdir(pluginPath)
-                       if self.isValidPluginName(f)]
+        pluginFiles = [
+            f[:-3] for f in os.listdir(pluginPath) if self.isValidPluginName(f)
+        ]
         return pluginFiles[:]
-    
+
     def isValidPluginName(self, pluginName):
         """
         Public method to check, if a file name is a valid plugin name.
-        
+
         Plugin modules must start with "Plugin" and have the extension ".py".
-        
+
         @param pluginName name of the file to be checked (string)
         @return flag indicating a valid plugin name (boolean)
         """
         return pluginName.startswith("Plugin") and pluginName.endswith(".py")
-    
+
     def __insertPluginsPaths(self):
         """
         Private method to insert the valid plugin paths intos the search path.
@@ -303,13 +314,13 @@
                 if self.pluginDirs[key] not in sys.path:
                     sys.path.insert(2, self.pluginDirs[key])
                 UI.PixmapCache.addSearchPath(self.pluginDirs[key])
-        
+
         if self.__develPluginFile:
             path = Utilities.splitPath(self.__develPluginFile)[0]
             if path not in sys.path:
                 sys.path.insert(2, path)
             UI.PixmapCache.addSearchPath(path)
-    
+
     def __loadPlugins(self):
         """
         Private method to load the plugins found.
@@ -317,79 +328,79 @@
         develPluginName = ""
         if self.__develPluginFile:
             develPluginPath, develPluginName = Utilities.splitPath(
-                self.__develPluginFile)
+                self.__develPluginFile
+            )
             if self.isValidPluginName(develPluginName):
                 develPluginName = develPluginName[:-3]
-        
+
         for pluginName in self.__foundGlobalModules:
             # user and core plug-ins have priority
             if (
-                pluginName not in self.__foundUserModules and
-                pluginName not in self.__foundCoreModules and
-                pluginName != develPluginName
+                pluginName not in self.__foundUserModules
+                and pluginName not in self.__foundCoreModules
+                and pluginName != develPluginName
             ):
                 self.loadPlugin(pluginName, self.pluginDirs["global"])
-        
+
         for pluginName in self.__foundUserModules:
             # core plug-ins have priority
             if (
-                pluginName not in self.__foundCoreModules and
-                pluginName != develPluginName
+                pluginName not in self.__foundCoreModules
+                and pluginName != develPluginName
             ):
                 self.loadPlugin(pluginName, self.pluginDirs["user"])
-        
+
         for pluginName in self.__foundCoreModules:
             # plug-in under development has priority
             if pluginName != develPluginName:
                 self.loadPlugin(pluginName, self.pluginDirs["eric7"])
-        
+
         if develPluginName:
             self.loadPlugin(develPluginName, develPluginPath)
             self.__develPluginName = develPluginName
-    
+
     def loadDocumentationSetPlugins(self):
         """
         Public method to load just the documentation sets plugins.
-        
+
         @exception PluginModulesError raised to indicate the absence of
             plug-in modules
         """
         if not self.__pluginModulesExist():
             raise PluginModulesError
-        
+
         self.__insertPluginsPaths()
-        
+
         for pluginName in self.__foundGlobalModules:
             # user and core plug-ins have priority
             if (
-                pluginName not in self.__foundUserModules and
-                pluginName not in self.__foundCoreModules and
-                pluginName.startswith("PluginDocumentationSets")
+                pluginName not in self.__foundUserModules
+                and pluginName not in self.__foundCoreModules
+                and pluginName.startswith("PluginDocumentationSets")
             ):
                 self.loadPlugin(pluginName, self.pluginDirs["global"])
-        
+
         for pluginName in self.__foundUserModules:
             # core plug-ins have priority
-            if (
-                pluginName not in self.__foundCoreModules and
-                pluginName.startswith("PluginDocumentationSets")
+            if pluginName not in self.__foundCoreModules and pluginName.startswith(
+                "PluginDocumentationSets"
             ):
                 self.loadPlugin(pluginName, self.pluginDirs["user"])
-        
+
         for pluginName in self.__foundCoreModules:
             # plug-in under development has priority
             if pluginName.startswith("PluginDocumentationSets"):
                 self.loadPlugin(pluginName, self.pluginDirs["eric7"])
-    
+
     def loadPlugin(self, name, directory, reload_=False, install=False):
         """
         Public method to load a plugin module.
-        
+
         Initially all modules are inactive. Modules that are requested on
         demand are sorted out and are added to the on demand list. Some
         basic validity checks are performed as well. Modules failing these
         checks are added to the failed modules list.
-        
+
         @param name name of the module to be loaded
         @type str
         @param directory name of the plugin directory
@@ -410,15 +421,15 @@
             spec.loader.exec_module(module)
             if not hasattr(module, "autoactivate"):
                 module.error = self.tr(
-                    "Module is missing the 'autoactivate' attribute.")
+                    "Module is missing the 'autoactivate' attribute."
+                )
                 self.__failedModules[name] = module
                 raise PluginLoadError(name)
             if getattr(module, "autoactivate", False):
                 self.__inactiveModules[name] = module
             else:
-                if (
-                    not hasattr(module, "pluginType") or
-                    not hasattr(module, "pluginTypename")
+                if not hasattr(module, "pluginType") or not hasattr(
+                    module, "pluginTypename"
                 ):
                     module.error = self.tr(
                         "Module is missing the 'pluginType' "
@@ -431,10 +442,8 @@
             module.eric7PluginModuleName = name
             module.eric7PluginModuleFilename = fname
             if (
-                (install or
-                 Preferences.getPluginManager("AutoInstallDependencies")) and
-                hasattr(module, "installDependencies")
-            ):
+                install or Preferences.getPluginManager("AutoInstallDependencies")
+            ) and hasattr(module, "installDependencies"):
                 # ask the module to install its dependencies
                 module.installDependencies(self.pipInstall)
             self.__modulesCount += 1
@@ -444,31 +453,31 @@
                 with contextlib.suppress(KeyError, AttributeError):
                     pluginObject = self.__onDemandInactivePlugins[name]
                     pluginObject.initToolbar(
-                        self.__ui, ericApp().getObject("ToolbarManager"))
+                        self.__ui, ericApp().getObject("ToolbarManager")
+                    )
         except PluginLoadError:
             print("Error loading plug-in module:", name)
         except Exception as err:
             module = types.ModuleType(name)
-            module.error = self.tr(
-                "Module failed to load. Error: {0}").format(str(err))
+            module.error = self.tr("Module failed to load. Error: {0}").format(str(err))
             self.__failedModules[name] = module
             print("Error loading plug-in module:", name)
             print(str(err))
-    
+
     def unloadPlugin(self, name):
         """
         Public method to unload a plugin module.
-        
+
         @param name name of the module to be unloaded (string)
         @return flag indicating success (boolean)
         """
         if name in self.__onDemandActiveModules:
             # cannot unload an ondemand plugin, that is in use
             return False
-        
+
         if name in self.__activeModules:
             self.deactivatePlugin(name)
-        
+
         if name in self.__inactiveModules:
             with contextlib.suppress(KeyError):
                 pluginObject = self.__inactivePlugins[name]
@@ -485,16 +494,15 @@
             del self.__onDemandInactiveModules[name]
         elif name in self.__failedModules:
             del self.__failedModules[name]
-        
+
         self.__modulesCount -= 1
         return True
-    
-    def removePluginFromSysModules(self, pluginName, package,
-                                   internalPackages):
+
+    def removePluginFromSysModules(self, pluginName, package, internalPackages):
         """
         Public method to remove a plugin and all related modules from
         sys.modules.
-        
+
         @param pluginName name of the plugin module (string)
         @param package name of the plugin package (string)
         @param internalPackages list of intenal packages (list of string)
@@ -506,30 +514,27 @@
         if not package:
             package = "__None__"
         for moduleName in list(sys.modules.keys())[:]:
-            if (
-                moduleName == pluginName or
-                moduleName.split(".")[0] in packages
-            ):
+            if moduleName == pluginName or moduleName.split(".")[0] in packages:
                 found = True
                 del sys.modules[moduleName]
         return found
-    
+
     def initOnDemandPlugins(self):
         """
         Public method to create plugin objects for all on demand plugins.
-        
+
         Note: The plugins are not activated.
         """
         names = sorted(self.__onDemandInactiveModules.keys())
         for name in names:
             self.initOnDemandPlugin(name)
-    
+
     def initOnDemandPlugin(self, name):
         """
         Public method to create a plugin object for the named on demand plugin.
-        
+
         Note: The plug-in is not activated.
-        
+
         @param name name of the plug-in (string)
         @exception PluginActivationError raised to indicate an issue during the
             plug-in activation
@@ -539,7 +544,7 @@
                 module = self.__onDemandInactiveModules[name]
             except KeyError:
                 return
-            
+
             if not self.__canActivatePlugin(module):
                 raise PluginActivationError(module.eric7PluginModuleName)
             version = getattr(module, "version", "0.0.0")
@@ -554,11 +559,11 @@
                 self.__onDemandInactivePlugins[name] = pluginObject
         except PluginActivationError:
             return
-    
+
     def initPluginToolbars(self, toolbarManager):
         """
         Public method to initialize plug-in toolbars.
-        
+
         @param toolbarManager reference to the toolbar manager object
             (EricToolBarManager)
         """
@@ -566,21 +571,21 @@
         for pluginObject in self.__onDemandInactivePlugins.values():
             with contextlib.suppress(AttributeError):
                 pluginObject.initToolbar(self.__ui, toolbarManager)
-    
+
     def activatePlugins(self):
         """
         Public method to activate all plugins having the "autoactivate"
         attribute set to True.
         """
-        savedInactiveList = Preferences.getSettings().value(
-            self.__inactivePluginsKey)
+        savedInactiveList = Preferences.getSettings().value(self.__inactivePluginsKey)
         inactiveList = self.__disabledPlugins[:]
         if savedInactiveList is not None:
-            inactiveList += [p for p in savedInactiveList
-                             if p not in self.__disabledPlugins]
+            inactiveList += [
+                p for p in savedInactiveList if p not in self.__disabledPlugins
+            ]
         if (
-            self.__develPluginName is not None and
-            self.__develPluginName in inactiveList
+            self.__develPluginName is not None
+            and self.__develPluginName in inactiveList
         ):
             inactiveList.remove(self.__develPluginName)
         names = sorted(self.__inactiveModules.keys())
@@ -588,11 +593,11 @@
             if name not in inactiveList:
                 self.activatePlugin(name)
         self.allPlugginsActivated.emit()
-    
+
     def activatePlugin(self, name, onDemand=False):
         """
         Public method to activate a plugin.
-        
+
         @param name name of the module to be activated
         @param onDemand flag indicating activation of an
             on demand plugin (boolean)
@@ -604,12 +609,12 @@
             try:
                 module = (
                     self.__onDemandInactiveModules[name]
-                    if onDemand else
-                    self.__inactiveModules[name]
+                    if onDemand
+                    else self.__inactiveModules[name]
                 )
             except KeyError:
                 return None
-            
+
             if not self.__canActivatePlugin(module):
                 raise PluginActivationError(module.eric7PluginModuleName)
             version = getattr(module, "version", "0.0.0")
@@ -626,8 +631,7 @@
             try:
                 obj, ok = pluginObject.activate()
             except TypeError:
-                module.error = self.tr(
-                    "Incompatible plugin activation method.")
+                module.error = self.tr("Incompatible plugin activation method.")
                 obj = None
                 ok = True
             except Exception as err:
@@ -636,12 +640,12 @@
                 ok = False
             if not ok:
                 return None
-            
+
             self.pluginActivated.emit(name, pluginObject)
             pluginObject.eric7PluginModule = module
             pluginObject.eric7PluginName = className
             pluginObject.eric7PluginVersion = version
-            
+
             if onDemand:
                 self.__onDemandInactiveModules.pop(name)
                 with contextlib.suppress(KeyError):
@@ -657,11 +661,11 @@
             return obj
         except PluginActivationError:
             return None
-    
+
     def __canActivatePlugin(self, module):
         """
         Private method to check, if a plugin can be activated.
-        
+
         @param module reference to the module to be activated
         @return flag indicating, if the module satisfies all requirements
             for being activated (boolean)
@@ -672,28 +676,25 @@
         """
         try:
             if not hasattr(module, "version"):
-                raise PluginModuleFormatError(
-                    module.eric7PluginModuleName, "version")
+                raise PluginModuleFormatError(module.eric7PluginModuleName, "version")
             if not hasattr(module, "className"):
-                raise PluginModuleFormatError(
-                    module.eric7PluginModuleName, "className")
+                raise PluginModuleFormatError(module.eric7PluginModuleName, "className")
             className = getattr(module, "className", "")
             if not className or not hasattr(module, className):
-                raise PluginModuleFormatError(
-                    module.eric7PluginModuleName, className)
+                raise PluginModuleFormatError(module.eric7PluginModuleName, className)
             pluginClass = getattr(module, className)
             if not hasattr(pluginClass, "__init__"):
                 raise PluginClassFormatError(
-                    module.eric7PluginModuleName,
-                    className, "__init__")
+                    module.eric7PluginModuleName, className, "__init__"
+                )
             if not hasattr(pluginClass, "activate"):
                 raise PluginClassFormatError(
-                    module.eric7PluginModuleName,
-                    className, "activate")
+                    module.eric7PluginModuleName, className, "activate"
+                )
             if not hasattr(pluginClass, "deactivate"):
                 raise PluginClassFormatError(
-                    module.eric7PluginModuleName,
-                    className, "deactivate")
+                    module.eric7PluginModuleName, className, "deactivate"
+                )
             return True
         except PluginModuleFormatError as e:
             print(repr(e))
@@ -701,11 +702,11 @@
         except PluginClassFormatError as e:
             print(repr(e))
             return False
-    
+
     def deactivatePlugin(self, name, onDemand=False):
         """
         Public method to deactivate a plugin.
-        
+
         @param name name of the module to be deactivated
         @param onDemand flag indicating deactivation of an
             on demand plugin (boolean)
@@ -713,12 +714,12 @@
         try:
             module = (
                 self.__onDemandActiveModules[name]
-                if onDemand else
-                self.__activeModules[name]
+                if onDemand
+                else self.__activeModules[name]
             )
         except KeyError:
             return
-        
+
         if self.__canDeactivatePlugin(module):
             pluginObject = None
             if onDemand and name in self.__onDemandActivePlugins:
@@ -729,7 +730,7 @@
                 self.pluginAboutToBeDeactivated.emit(name, pluginObject)
                 pluginObject.deactivate()
                 self.pluginDeactivated.emit(name, pluginObject)
-                
+
                 if onDemand:
                     self.__onDemandActiveModules.pop(name)
                     self.__onDemandActivePlugins.pop(name)
@@ -741,22 +742,22 @@
                         self.__activePlugins.pop(name)
                     self.__inactivePlugins[name] = pluginObject
                     self.__inactiveModules[name] = module
-    
+
     def __canDeactivatePlugin(self, module):
         """
         Private method to check, if a plugin can be deactivated.
-        
+
         @param module reference to the module to be deactivated
         @return flag indicating, if the module satisfies all requirements
             for being deactivated (boolean)
         """
         return getattr(module, "deactivateable", True)
-    
+
     def getPluginObject(self, type_, typename, maybeActive=False):
         """
         Public method to activate an ondemand plugin given by type and
         typename.
-        
+
         @param type_ type of the plugin to be activated (string)
         @param typename name of the plugin within the type category (string)
         @param maybeActive flag indicating, that the plugin may be active
@@ -765,26 +766,26 @@
         """
         for name, module in list(self.__onDemandInactiveModules.items()):
             if (
-                getattr(module, "pluginType", "") == type_ and
-                getattr(module, "pluginTypename", "") == typename
+                getattr(module, "pluginType", "") == type_
+                and getattr(module, "pluginTypename", "") == typename
             ):
                 return self.activatePlugin(name, onDemand=True)
-        
+
         if maybeActive:
             for name, module in list(self.__onDemandActiveModules.items()):
                 if (
-                    getattr(module, "pluginType", "") == type_ and
-                    getattr(module, "pluginTypename", "") == typename
+                    getattr(module, "pluginType", "") == type_
+                    and getattr(module, "pluginTypename", "") == typename
                 ):
                     self.deactivatePlugin(name, onDemand=True)
                     return self.activatePlugin(name, onDemand=True)
-        
+
         return None
-    
+
     def getPluginInfos(self):
         """
         Public method to get infos about all loaded plug-ins.
-        
+
         @return list of dictionaries with keys "module_name", "plugin_name",
             "version", "auto_activate", "active", "short_desc", "error"
         @rtype list of dict ("module_name": str, "plugin_name": str,
@@ -792,63 +793,73 @@
             "short_desc": str, "error": bool)
         """
         infos = []
-        
+
         # 1. active, non-on-demand modules
         for name in list(self.__activeModules.keys()):
             info = self.__getShortInfo(self.__activeModules[name])
-            info.update({
-                "module_name": name,
-                "auto_activate": True,
-                "active": True,
-            })
+            info.update(
+                {
+                    "module_name": name,
+                    "auto_activate": True,
+                    "active": True,
+                }
+            )
             infos.append(info)
-        
+
         # 2. inactive, non-on-demand modules
         for name in list(self.__inactiveModules.keys()):
             info = self.__getShortInfo(self.__inactiveModules[name])
-            info.update({
-                "module_name": name,
-                "auto_activate": True,
-                "active": False,
-            })
+            info.update(
+                {
+                    "module_name": name,
+                    "auto_activate": True,
+                    "active": False,
+                }
+            )
             infos.append(info)
-        
+
         # 3. active, on-demand modules
         for name in list(self.__onDemandActiveModules.keys()):
             info = self.__getShortInfo(self.__onDemandActiveModules[name])
-            info.update({
-                "module_name": name,
-                "auto_activate": False,
-                "active": True,
-            })
+            info.update(
+                {
+                    "module_name": name,
+                    "auto_activate": False,
+                    "active": True,
+                }
+            )
             infos.append(info)
-        
+
         # 4. inactive, non-on-demand modules
         for name in list(self.__onDemandInactiveModules.keys()):
             info = self.__getShortInfo(self.__onDemandInactiveModules[name])
-            info.update({
-                "module_name": name,
-                "auto_activate": False,
-                "active": False,
-            })
+            info.update(
+                {
+                    "module_name": name,
+                    "auto_activate": False,
+                    "active": False,
+                }
+            )
             infos.append(info)
-        
+
         # 5. failed modules
         for name in list(self.__failedModules.keys()):
             info = self.__getShortInfo(self.__failedModules[name])
-            info.update({
-                "module_name": name,
-                "auto_activate": False,
-                "active": False,
-            })
+            info.update(
+                {
+                    "module_name": name,
+                    "auto_activate": False,
+                    "active": False,
+                }
+            )
             infos.append(info)
-        
+
         return infos
-    
+
     def __getShortInfo(self, module):
         """
         Private method to extract the short info from a module.
-        
+
         @param module module to extract short info from
         @return dictionay containing plug-in data
         @rtype dict ("plugin_name": str, "version": str, "short_desc": str,
@@ -860,19 +871,19 @@
             "short_desc": getattr(module, "shortDescription", ""),
             "error": bool(getattr(module, "error", "")),
         }
-    
+
     def getPluginDetails(self, name):
         """
         Public method to get detailed information about a plugin.
-        
+
         @param name name of the module to get detailed infos about (string)
         @return details of the plugin as a dictionary
         """
         details = {}
-        
+
         autoactivate = True
         active = True
-        
+
         if name in self.__activeModules:
             module = self.__activeModules[name]
         elif name in self.__inactiveModules:
@@ -895,10 +906,9 @@
         else:
             # should not happen
             return None
-        
+
         details["moduleName"] = name
-        details["moduleFileName"] = getattr(
-            module, "eric7PluginModuleFilename", "")
+        details["moduleFileName"] = getattr(module, "eric7PluginModuleFilename", "")
         details["pluginName"] = getattr(module, "name", "")
         details["version"] = getattr(module, "version", "")
         details["author"] = getattr(module, "author", "")
@@ -906,9 +916,9 @@
         details["autoactivate"] = autoactivate
         details["active"] = active
         details["error"] = getattr(module, "error", "")
-        
+
         return details
-    
+
     def doShutdown(self):
         """
         Public method called to perform actions upon shutdown of the IDE.
@@ -917,27 +927,26 @@
         for name in list(self.__inactiveModules.keys()):
             names.append(name)
         Preferences.getSettings().setValue(self.__inactivePluginsKey, names)
-        
+
         self.shutdown.emit()
 
     def getPluginDisplayStrings(self, type_):
         """
         Public method to get the display strings of all plugins of a specific
         type.
-        
+
         @param type_ type of the plugins (string)
         @return dictionary with name as key and display string as value
             (dictionary of string)
         """
         pluginDict = {}
-        
-        for module in (
-            list(self.__onDemandActiveModules.values()) +
-            list(self.__onDemandInactiveModules.values())
+
+        for module in list(self.__onDemandActiveModules.values()) + list(
+            self.__onDemandInactiveModules.values()
         ):
             if (
-                getattr(module, "pluginType", "") == type_ and
-                getattr(module, "error", "") == ""
+                getattr(module, "pluginType", "") == type_
+                and getattr(module, "error", "") == ""
             ):
                 plugin_name = getattr(module, "pluginTypename", "")
                 if plugin_name:
@@ -950,74 +959,71 @@
                             pluginDict[plugin_name] = disp
                     else:
                         pluginDict[plugin_name] = plugin_name
-        
+
         return pluginDict
-        
+
     def getPluginPreviewPixmap(self, type_, name):
         """
         Public method to get a preview pixmap of a plugin of a specific type.
-        
+
         @param type_ type of the plugin (string)
         @param name name of the plugin type (string)
         @return preview pixmap (QPixmap)
         """
-        for module in (
-            list(self.__onDemandActiveModules.values()) +
-            list(self.__onDemandInactiveModules.values())
+        for module in list(self.__onDemandActiveModules.values()) + list(
+            self.__onDemandInactiveModules.values()
         ):
             if (
-                getattr(module, "pluginType", "") == type_ and
-                getattr(module, "pluginTypename", "") == name
+                getattr(module, "pluginType", "") == type_
+                and getattr(module, "pluginTypename", "") == name
             ):
                 if hasattr(module, "previewPix"):
                     return module.previewPix()
                 else:
                     return QPixmap()
-        
+
         return QPixmap()
-        
+
     def getPluginApiFiles(self, language):
         """
         Public method to get the list of API files installed by a plugin.
-        
+
         @param language language of the requested API files (string)
         @return list of API filenames (list of string)
         """
         apis = []
-        
-        for module in (
-            list(self.__activeModules.values()) +
-            list(self.__onDemandActiveModules.values())
+
+        for module in list(self.__activeModules.values()) + list(
+            self.__onDemandActiveModules.values()
         ):
             if hasattr(module, "apiFiles"):
                 apis.extend(module.apiFiles(language))
-        
+
         return apis
-        
+
     def getPluginQtHelpFiles(self):
         """
         Public method to get the list of QtHelp documentation files provided
         by a plug-in.
-        
+
         @return dictionary with documentation type as key and list of files
             as value
         @rtype dict (key: str, value: list of str)
         """
         helpFiles = {}
-        for module in (
-            list(self.__activeModules.values()) +
-            list(self.__onDemandActiveModules.values())
+        for module in list(self.__activeModules.values()) + list(
+            self.__onDemandActiveModules.values()
         ):
             if hasattr(module, "helpFiles"):
                 helpFiles.update(module.helpFiles())
-        
+
         return helpFiles
-        
+
     def getPluginExeDisplayData(self):
         """
         Public method to get data to display information about a plugins
         external tool.
-        
+
         @return list of dictionaries containing the data. Each dictionary must
             either contain data for the determination or the data to be
             displayed.<br />
@@ -1048,31 +1054,29 @@
             </ul>
         """
         infos = []
-        
-        for module in (
-            list(self.__activeModules.values()) +
-            list(self.__inactiveModules.values())
+
+        for module in list(self.__activeModules.values()) + list(
+            self.__inactiveModules.values()
         ):
             if hasattr(module, "exeDisplayDataList"):
                 infos.extend(module.exeDisplayDataList())
             elif hasattr(module, "exeDisplayData"):
                 infos.append(module.exeDisplayData())
-        for module in (
-            list(self.__onDemandActiveModules.values()) +
-            list(self.__onDemandInactiveModules.values())
+        for module in list(self.__onDemandActiveModules.values()) + list(
+            self.__onDemandInactiveModules.values()
         ):
             if hasattr(module, "exeDisplayDataList"):
                 infos.extend(module.exeDisplayDataList())
             elif hasattr(module, "exeDisplayData"):
                 infos.append(module.exeDisplayData())
-        
+
         return infos
-        
+
     def getPluginConfigData(self):
         """
         Public method to get the config data of all active, non on-demand
         plugins used by the configuration dialog.
-        
+
         Plugins supporting this functionality must provide the plugin module
         function 'getConfigData' returning a dictionary with unique keys
         of lists with the following list contents:
@@ -1097,74 +1101,72 @@
           <dd>This will be used by the configuration dialog and must always
               be None</dd>
         </dl>
-        
+
         @return plug-in configuration data
         """
         configData = {}
         for module in (
-            list(self.__activeModules.values()) +
-            list(self.__onDemandActiveModules.values()) +
-                list(self.__onDemandInactiveModules.values())
+            list(self.__activeModules.values())
+            + list(self.__onDemandActiveModules.values())
+            + list(self.__onDemandInactiveModules.values())
         ):
-            if hasattr(module, 'getConfigData'):
+            if hasattr(module, "getConfigData"):
                 configData.update(module.getConfigData())
         return configData
-        
+
     def isPluginLoaded(self, pluginName):
         """
         Public method to check, if a certain plugin is loaded.
-        
+
         @param pluginName name of the plugin to check for (string)
         @return flag indicating, if the plugin is loaded (boolean)
         """
         return (
-            pluginName in self.__activeModules or
-            pluginName in self.__inactiveModules or
-            pluginName in self.__onDemandActiveModules or
-            pluginName in self.__onDemandInactiveModules
+            pluginName in self.__activeModules
+            or pluginName in self.__inactiveModules
+            or pluginName in self.__onDemandActiveModules
+            or pluginName in self.__onDemandInactiveModules
         )
-        
+
     def isPluginActive(self, pluginName):
         """
         Public method to check, if a certain plugin is active.
-        
+
         @param pluginName name of the plugin to check for (string)
         @return flag indicating, if the plugin is active (boolean)
         """
         return (
-            pluginName in self.__activeModules or
-            pluginName in self.__onDemandActiveModules
+            pluginName in self.__activeModules
+            or pluginName in self.__onDemandActiveModules
         )
-    
+
     ###########################################################################
     ## Specialized plug-in module handling methods below
     ###########################################################################
-    
+
     ###########################################################################
     ## VCS related methods below
     ###########################################################################
-    
+
     def getVcsSystemIndicators(self):
         """
         Public method to get the Vcs System indicators.
-        
+
         Plugins supporting this functionality must support the module function
         getVcsSystemIndicator returning a dictionary with indicator as key and
         a tuple with the vcs name (string) and vcs display string (string).
-        
+
         @return dictionary with indicator as key and a list of tuples as
             values. Each tuple contains the vcs name (string) and vcs display
             string (string).
         """
         vcsDict = {}
-        
-        for module in (
-            list(self.__onDemandActiveModules.values()) +
-            list(self.__onDemandInactiveModules.values())
+
+        for module in list(self.__onDemandActiveModules.values()) + list(
+            self.__onDemandInactiveModules.values()
         ):
-            if (
-                getattr(module, "pluginType", "") == "version_control" and
-                hasattr(module, "getVcsSystemIndicator")
+            if getattr(module, "pluginType", "") == "version_control" and hasattr(
+                module, "getVcsSystemIndicator"
             ):
                 res = module.getVcsSystemIndicator()
                 for indicator, vcsData in list(res.items()):
@@ -1172,9 +1174,9 @@
                         vcsDict[indicator].append(vcsData)
                     else:
                         vcsDict[indicator] = [vcsData]
-        
+
         return vcsDict
-    
+
     def deactivateVcsPlugins(self):
         """
         Public method to deactivated all activated VCS plugins.
@@ -1182,11 +1184,11 @@
         for name, module in list(self.__onDemandActiveModules.items()):
             if getattr(module, "pluginType", "") == "version_control":
                 self.deactivatePlugin(name, True)
-    
+
     ########################################################################
     ## Methods for the creation of the plug-ins download directory
     ########################################################################
-    
+
     def __checkPluginsDownloadDirectory(self):
         """
         Private slot to check for the existence of the plugins download
@@ -1195,7 +1197,7 @@
         downloadDir = Preferences.getPluginManager("DownloadPath")
         if not downloadDir:
             downloadDir = self.__defaultDownloadDir
-        
+
         if not os.path.exists(downloadDir):
             try:
                 os.mkdir(downloadDir, 0o755)
@@ -1213,22 +1215,23 @@
                                 """<p>The plugin download directory"""
                                 """ <b>{0}</b> could not be created. Please"""
                                 """ configure it via the configuration"""
-                                """ dialog.</p><p>Reason: {1}</p>""")
-                            .format(downloadDir, str(err)))
+                                """ dialog.</p><p>Reason: {1}</p>"""
+                            ).format(downloadDir, str(err)),
+                        )
                         downloadDir = ""
-        
+
         Preferences.setPluginManager("DownloadPath", downloadDir)
-    
+
     def preferencesChanged(self):
         """
         Public slot to react to changes in configuration.
         """
         self.__checkPluginsDownloadDirectory()
-    
+
     ########################################################################
     ## Methods for automatic plug-in update check below
     ########################################################################
-    
+
     def checkPluginUpdatesAvailable(self):
         """
         Public method to check the availability of updates of plug-ins.
@@ -1239,13 +1242,10 @@
         # 2 = weekly
         # 3 = monthly
         # 4 = always
-        
-        if (
-            period == 0 or
-            (self.__ui is not None and not self.__ui.isOnline())
-        ):
+
+        if period == 0 or (self.__ui is not None and not self.__ui.isOnline()):
             return
-        
+
         elif period in [1, 2, 3] and pathlib.Path(self.pluginRepositoryFile).exists():
             lastModified = datetime.datetime.fromtimestamp(
                 pathlib.Path(self.pluginRepositoryFile).stat().st_mtime
@@ -1253,46 +1253,46 @@
             now = datetime.datetime.now()
             delta = now - lastModified
             if (
-                (period == 1 and lastModified.date().day == now.date().day) or
-                (period == 2 and delta.days < 7) or
-                (period == 3 and delta.days < 30)
+                (period == 1 and lastModified.date().day == now.date().day)
+                or (period == 2 and delta.days < 7)
+                or (period == 3 and delta.days < 30)
             ):
                 # daily, weekly, monthly
                 return
-        
+
         self.downLoadRepositoryFile()
-    
+
     def downLoadRepositoryFile(self, url=None):
         """
         Public method to download the plugin repository file.
-        
+
         @param url URL to get the plugin repository file from
             (defaults to None)
         @type QUrl or str (optional)
         """
         self.__updateAvailable = False
-        
+
         if url is None:
             url = Preferences.getUI("PluginRepositoryUrl7")
         request = QNetworkRequest(QUrl(url))
         request.setAttribute(
             QNetworkRequest.Attribute.CacheLoadControlAttribute,
-            QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+            QNetworkRequest.CacheLoadControl.AlwaysNetwork,
+        )
         reply = self.__networkManager.get(request)
-        reply.finished.connect(
-            lambda: self.__downloadRepositoryFileDone(reply))
+        reply.finished.connect(lambda: self.__downloadRepositoryFileDone(reply))
         self.__replies.append(reply)
-    
+
     def __downloadRepositoryFileDone(self, reply):
         """
         Private method called after the repository file was downloaded.
-        
+
         @param reply reference to the reply object of the download
         @type QNetworkReply
         """
         if reply in self.__replies:
             self.__replies.remove(reply)
-        
+
         if reply.error() != QNetworkReply.NetworkError.NoError:
             EricMessageBox.warning(
                 None,
@@ -1300,12 +1300,13 @@
                 self.tr(
                     """<p>Could not download the requested file"""
                     """ from {0}.</p><p>Error: {1}</p>"""
-                ).format(Preferences.getUI("PluginRepositoryUrl7"),
-                         reply.errorString())
+                ).format(
+                    Preferences.getUI("PluginRepositoryUrl7"), reply.errorString()
+                ),
             )
             reply.deleteLater()
             return
-        
+
         ioDevice = QFile(self.pluginRepositoryFile + ".tmp")
         ioDevice.open(QIODevice.OpenModeFlag.WriteOnly)
         ioDevice.write(reply.readAll())
@@ -1314,34 +1315,34 @@
             QFile.remove(self.pluginRepositoryFile)
         ioDevice.rename(self.pluginRepositoryFile)
         reply.deleteLater()
-        
+
         if os.path.exists(self.pluginRepositoryFile):
             f = QFile(self.pluginRepositoryFile)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
                 # save current URL
                 url = Preferences.getUI("PluginRepositoryUrl7")
-                
+
                 # read the repository file
-                from EricXML.PluginRepositoryReader import (
-                    PluginRepositoryReader
-                )
+                from EricXML.PluginRepositoryReader import PluginRepositoryReader
+
                 reader = PluginRepositoryReader(f, self.checkPluginEntry)
                 reader.readXML()
                 if url != Preferences.getUI("PluginRepositoryUrl7"):
                     # redo if it is a redirect
                     self.checkPluginUpdatesAvailable()
                     return
-                
+
                 if self.__updateAvailable:
                     self.__ui and self.__ui.activatePluginRepositoryViewer()
                 else:
                     self.pluginRepositoryFileDownloaded.emit()
-    
-    def checkPluginEntry(self, name, short, description, url, author, version,
-                         filename, status):
+
+    def checkPluginEntry(
+        self, name, short, description, url, author, version, filename, status
+    ):
         """
         Public method to check a plug-in's data for an update.
-        
+
         @param name data for the name field (string)
         @param short data for the short field (string)
         @param description data for the description field (list of strings)
@@ -1355,25 +1356,23 @@
         pluginName = os.path.splitext(url.rsplit("/", 1)[1])[0]
         if pluginName in Preferences.getPluginManager("HiddenPlugins"):
             return
-        
-        archive = os.path.join(Preferences.getPluginManager("DownloadPath"),
-                               filename)
-        
+
+        archive = os.path.join(Preferences.getPluginManager("DownloadPath"), filename)
+
         # Check against installed/loaded plug-ins
         pluginDetails = self.getPluginDetails(pluginName)
         if pluginDetails is None:
             if not Preferences.getPluginManager("CheckInstalledOnly"):
                 self.__updateAvailable = True
             return
-        
+
         versionTuple = Globals.versionToTuple(version)[:3]
-        pluginVersionTuple = Globals.versionToTuple(
-            pluginDetails["version"])[:3]
-        
+        pluginVersionTuple = Globals.versionToTuple(pluginDetails["version"])[:3]
+
         if pluginVersionTuple < versionTuple:
             self.__updateAvailable = True
             return
-        
+
         if not Preferences.getPluginManager("CheckInstalledOnly"):
             # Check against downloaded plugin archives
             # 1. Check, if the archive file exists
@@ -1381,12 +1380,12 @@
                 if pluginDetails["moduleName"] != pluginName:
                     self.__updateAvailable = True
                 return
-            
+
             # 2. Check, if the archive is a valid zip file
             if not zipfile.is_zipfile(archive):
                 self.__updateAvailable = True
                 return
-            
+
             # 3. Check the version of the archive file
             zipFile = zipfile.ZipFile(archive, "r")
             try:
@@ -1394,56 +1393,55 @@
             except KeyError:
                 aversion = "0.0.0"
             zipFile.close()
-            
+
             aversionTuple = Globals.versionToTuple(aversion)[:3]
             if aversionTuple != versionTuple:
                 self.__updateAvailable = True
-    
+
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.
-        
+
         @param reply reference to the reply object (QNetworkReply)
         @param errors list of SSL errors (list of QSslError)
         """
         ignored = self.__sslErrorHandler.sslErrorsReply(reply, errors)[0]
         if ignored == EricSslErrorState.NOT_IGNORED:
             self.__downloadCancelled = True
-    
+
     ########################################################################
     ## Methods to clear private data of plug-ins below
     ########################################################################
-    
+
     def clearPluginsPrivateData(self, type_):
         """
         Public method to clear the private data of plug-ins of a specified
         type.
-        
+
         Plugins supporting this functionality must support the module function
         clearPrivateData() and have the module level attribute pluginType.
-        
+
         @param type_ type of the plugin to clear private data for (string)
         """
         for module in (
-            list(self.__onDemandActiveModules.values()) +
-            list(self.__onDemandInactiveModules.values()) +
-            list(self.__activeModules.values()) +
-            list(self.__inactiveModules.values())
+            list(self.__onDemandActiveModules.values())
+            + list(self.__onDemandInactiveModules.values())
+            + list(self.__activeModules.values())
+            + list(self.__inactiveModules.values())
         ):
-            if (
-                getattr(module, "pluginType", "") == type_ and
-                hasattr(module, "clearPrivateData")
+            if getattr(module, "pluginType", "") == type_ and hasattr(
+                module, "clearPrivateData"
             ):
                 module.clearPrivateData()
-    
+
     ########################################################################
     ## Methods to install a plug-in module dependency via pip
     ########################################################################
-    
+
     def pipInstall(self, packages):
         """
         Public method to install the given package via pip.
-        
+
         @param packages list of packages to install
         @type list of str
         """
@@ -1452,9 +1450,10 @@
         except KeyError:
             # Installation is performed via the plug-in installation script.
             from PipInterface.Pip import Pip
+
             pip = Pip(self)
-        pip.installPackages(packages,
-                            interpreter=Globals.getPythonExecutable())
+        pip.installPackages(packages, interpreter=Globals.getPythonExecutable())
+
 
 #
 # eflag: noqa = M801
--- a/src/eric7/PluginManager/PluginRepositoryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginRepositoryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,15 +13,33 @@
 import re
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QFile, QIODevice, QUrl, QProcess, QPoint,
-    QCoreApplication
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QFile,
+    QIODevice,
+    QUrl,
+    QProcess,
+    QPoint,
+    QCoreApplication,
 )
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QAbstractButton, QTreeWidgetItem, QDialog,
-    QVBoxLayout, QHBoxLayout, QMenu, QLabel, QToolButton
+    QWidget,
+    QDialogButtonBox,
+    QAbstractButton,
+    QTreeWidgetItem,
+    QDialog,
+    QVBoxLayout,
+    QHBoxLayout,
+    QMenu,
+    QLabel,
+    QToolButton,
 )
 from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply, QNetworkInformation
+    QNetworkAccessManager,
+    QNetworkRequest,
+    QNetworkReply,
+    QNetworkInformation,
 )
 
 from .Ui_PluginRepositoryDialog import Ui_PluginRepositoryDialog
@@ -31,10 +49,10 @@
 from EricWidgets.EricApplication import ericApp
 
 from EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired
+
 try:
-    from EricNetwork.EricSslErrorHandler import (
-        EricSslErrorHandler, EricSslErrorState
-    )
+    from EricNetwork.EricSslErrorHandler import EricSslErrorHandler, EricSslErrorState
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -51,12 +69,13 @@
 class PluginRepositoryWidget(QWidget, Ui_PluginRepositoryDialog):
     """
     Class implementing a dialog showing the available plugins.
-    
+
     @signal closeAndInstall() emitted when the Close & Install button is
         pressed
     """
+
     closeAndInstall = pyqtSignal()
-    
+
     DescrRole = Qt.ItemDataRole.UserRole
     UrlRole = Qt.ItemDataRole.UserRole + 1
     FilenameRole = Qt.ItemDataRole.UserRole + 2
@@ -67,11 +86,11 @@
     PluginStatusLocalUpdate = 2
     PluginStatusRemoteUpdate = 3
     PluginStatusError = 4
-    
+
     def __init__(self, pluginManager, integrated=False, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @type PluginManager
         @param integrated flag indicating the integration into the sidebar
@@ -81,171 +100,179 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if pluginManager is None:
             # started as external plug-in repository dialog
             from .PluginManager import PluginManager
+
             self.__pluginManager = PluginManager()
             self.__external = True
         else:
             self.__pluginManager = pluginManager
             self.__external = False
         self.__integratedWidget = integrated
-        
+
         if integrated:
             self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         if self.__integratedWidget:
             self.__actionButtonsLayout = QHBoxLayout()
             self.__actionButtonsLayout.addStretch()
-            
+
             self.__updateButton = QToolButton(self)
             self.__updateButton.setIcon(UI.PixmapCache.getIcon("reload"))
             self.__updateButton.setToolTip(self.tr("Update"))
             self.__updateButton.clicked.connect(self.__updateList)
             self.__actionButtonsLayout.addWidget(self.__updateButton)
-            
+
             self.__downloadButton = QToolButton(self)
             self.__downloadButton.setIcon(UI.PixmapCache.getIcon("download"))
             self.__downloadButton.setToolTip(self.tr("Download"))
             self.__downloadButton.clicked.connect(self.__downloadButtonClicked)
             self.__actionButtonsLayout.addWidget(self.__downloadButton)
-            
+
             self.__downloadInstallButton = QToolButton(self)
-            self.__downloadInstallButton.setIcon(
-                UI.PixmapCache.getIcon("downloadPlus"))
-            self.__downloadInstallButton.setToolTip(
-                self.tr("Download & Install"))
+            self.__downloadInstallButton.setIcon(UI.PixmapCache.getIcon("downloadPlus"))
+            self.__downloadInstallButton.setToolTip(self.tr("Download & Install"))
             self.__downloadInstallButton.clicked.connect(
-                self.__downloadInstallButtonClicked)
+                self.__downloadInstallButtonClicked
+            )
             self.__actionButtonsLayout.addWidget(self.__downloadInstallButton)
-            
+
             self.__downloadCancelButton = QToolButton(self)
-            self.__downloadCancelButton.setIcon(
-                UI.PixmapCache.getIcon("cancel"))
+            self.__downloadCancelButton.setIcon(UI.PixmapCache.getIcon("cancel"))
             self.__downloadCancelButton.setToolTip(self.tr("Cancel"))
             self.__downloadCancelButton.clicked.connect(self.__downloadCancel)
             self.__actionButtonsLayout.addWidget(self.__downloadCancelButton)
-            
+
             self.__installButton = QToolButton(self)
             self.__installButton.setIcon(UI.PixmapCache.getIcon("plus"))
             self.__installButton.setToolTip(self.tr("Install"))
             self.__installButton.clicked.connect(self.__closeAndInstall)
             self.__actionButtonsLayout.addWidget(self.__installButton)
-            
+
             self.__actionButtonsLayout.addStretch()
-            
+
             self.layout().addLayout(self.__actionButtonsLayout)
             self.buttonBox.hide()
         else:
             self.__updateButton = self.buttonBox.addButton(
-                self.tr("Update"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Update"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.__downloadButton = self.buttonBox.addButton(
-                self.tr("Download"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Download"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.__downloadInstallButton = self.buttonBox.addButton(
-                self.tr("Download && Install"),
-                QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Download && Install"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.__downloadCancelButton = self.buttonBox.addButton(
-                self.tr("Cancel"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Cancel"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.__installButton = self.buttonBox.addButton(
-                self.tr("Close && Install"),
-                QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Close && Install"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             if not self.__integratedWidget:
                 self.__closeButton = self.buttonBox.addButton(
-                    self.tr("Close"), QDialogButtonBox.ButtonRole.RejectRole)
+                    self.tr("Close"), QDialogButtonBox.ButtonRole.RejectRole
+                )
                 self.__closeButton.setEnabled(True)
-        
+
         self.__downloadButton.setEnabled(False)
         self.__downloadInstallButton.setEnabled(False)
         self.__downloadCancelButton.setEnabled(False)
         self.__installButton.setEnabled(False)
-        
-        self.repositoryUrlEdit.setText(
-            Preferences.getUI("PluginRepositoryUrl7"))
-        
+
+        self.repositoryUrlEdit.setText(Preferences.getUI("PluginRepositoryUrl7"))
+
         if self.__integratedWidget:
             self.repositoryList.setHeaderHidden(True)
         else:
             self.repositoryList.headerItem().setText(
-                self.repositoryList.columnCount(), "")
+                self.repositoryList.columnCount(), ""
+            )
             self.repositoryList.header().setSortIndicator(
-                0, Qt.SortOrder.AscendingOrder)
-        
+                0, Qt.SortOrder.AscendingOrder
+            )
+
         self.__pluginContextMenu = QMenu(self)
         self.__hideAct = self.__pluginContextMenu.addAction(
-            self.tr("Hide"), self.__hidePlugin)
+            self.tr("Hide"), self.__hidePlugin
+        )
         self.__hideSelectedAct = self.__pluginContextMenu.addAction(
-            self.tr("Hide Selected"), self.__hideSelectedPlugins)
+            self.tr("Hide Selected"), self.__hideSelectedPlugins
+        )
         self.__pluginContextMenu.addSeparator()
         self.__showAllAct = self.__pluginContextMenu.addAction(
-            self.tr("Show All"), self.__showAllPlugins)
+            self.tr("Show All"), self.__showAllPlugins
+        )
         self.__pluginContextMenu.addSeparator()
         self.__pluginContextMenu.addAction(
-            self.tr("Cleanup Downloads"), self.__cleanupDownloads)
-        
-        self.pluginRepositoryFile = os.path.join(Utilities.getConfigDir(),
-                                                 "PluginRepository")
-        
-        self.__pluginManager.pluginRepositoryFileDownloaded.connect(
-            self.__populateList)
-        
+            self.tr("Cleanup Downloads"), self.__cleanupDownloads
+        )
+
+        self.pluginRepositoryFile = os.path.join(
+            Utilities.getConfigDir(), "PluginRepository"
+        )
+
+        self.__pluginManager.pluginRepositoryFileDownloaded.connect(self.__populateList)
+
         # attributes for the network objects
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
+            proxyAuthenticationRequired
+        )
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
             self.__networkManager.sslErrors.connect(self.__sslErrors)
         self.__replies = []
-        
-        if (
-            Preferences.getUI("DynamicOnlineCheck") and
-            QNetworkInformation.load(QNetworkInformation.Feature.Reachability)
+
+        if Preferences.getUI("DynamicOnlineCheck") and QNetworkInformation.load(
+            QNetworkInformation.Feature.Reachability
         ):
-            self.__reachabilityChanged(
-                QNetworkInformation.instance().reachability())
+            self.__reachabilityChanged(QNetworkInformation.instance().reachability())
             QNetworkInformation.instance().reachabilityChanged.connect(
-                self.__reachabilityChanged)
+                self.__reachabilityChanged
+            )
         else:
             # assume to be 'always online' if no backend could be loaded or
             # dynamic online check is switched of
             self.__reachabilityChanged(QNetworkInformation.Reachability.Online)
-        
+
         self.__pluginsToDownload = []
         self.__pluginsDownloaded = []
         self.__isDownloadInstall = False
         self.__allDownloadedOk = False
-        
+
         self.__hiddenPlugins = Preferences.getPluginManager("HiddenPlugins")
-        
+
         self.__populateList()
-    
+
     def __reachabilityChanged(self, reachability):
         """
         Private slot handling reachability state changes.
-        
+
         @param reachability new reachability state
         @type QNetworkInformation.Reachability
         """
         online = reachability == QNetworkInformation.Reachability.Online
         self.__online = online
-        
+
         self.__updateButton.setEnabled(online)
         self.on_repositoryList_itemSelectionChanged()
-        
+
         if not self.__integratedWidget:
             msg = (
                 self.tr("Internet Reachability Status: Reachable")
-                if online else
-                self.tr("Internet Reachability Status: Not Reachable")
+                if online
+                else self.tr("Internet Reachability Status: Not Reachable")
             )
             self.statusLabel.setText(msg)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the click of a button of the button box.
-        
+
         @param button reference to the button pressed (QAbstractButton)
         """
         if button == self.__updateButton:
@@ -258,7 +285,7 @@
             self.__downloadCancel()
         elif button == self.__installButton:
             self.__closeAndInstall()
-    
+
     @pyqtSlot()
     def __downloadButtonClicked(self):
         """
@@ -266,7 +293,7 @@
         """
         self.__isDownloadInstall = False
         self.__downloadPlugins()
-    
+
     @pyqtSlot()
     def __downloadInstallButtonClicked(self):
         """
@@ -275,35 +302,35 @@
         self.__isDownloadInstall = True
         self.__allDownloadedOk = True
         self.__downloadPlugins()
-    
+
     def __formatDescription(self, lines):
         """
         Private method to format the description.
-        
+
         @param lines lines of the description (list of strings)
         @return formatted description (string)
         """
         # remove empty line at start and end
         newlines = lines[:]
-        if len(newlines) and newlines[0] == '':
+        if len(newlines) and newlines[0] == "":
             del newlines[0]
-        if len(newlines) and newlines[-1] == '':
+        if len(newlines) and newlines[-1] == "":
             del newlines[-1]
-        
+
         # replace empty lines by newline character
         index = 0
         while index < len(newlines):
-            if newlines[index] == '':
-                newlines[index] = '\n'
+            if newlines[index] == "":
+                newlines[index] = "\n"
             index += 1
-        
+
         # join lines by a blank
-        return ' '.join(newlines)
-    
+        return " ".join(newlines)
+
     def __changeScheme(self, url, newScheme=""):
         """
         Private method to change the scheme of the given URL.
-        
+
         @param url URL to be modified
         @type str
         @param newScheme scheme to be set for the given URL
@@ -312,29 +339,29 @@
         """
         if not newScheme:
             newScheme = self.repositoryUrlEdit.text().split("//", 1)[0]
-        
+
         return newScheme + "//" + url.split("//", 1)[1]
-    
+
     @pyqtSlot(QPoint)
     def on_repositoryList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos position to show the menu (QPoint)
         """
         self.__hideAct.setEnabled(
-            self.repositoryList.currentItem() is not None and
-            len(self.__selectedItems()) == 1)
-        self.__hideSelectedAct.setEnabled(
-            len(self.__selectedItems()) > 1)
+            self.repositoryList.currentItem() is not None
+            and len(self.__selectedItems()) == 1
+        )
+        self.__hideSelectedAct.setEnabled(len(self.__selectedItems()) > 1)
         self.__showAllAct.setEnabled(bool(self.__hasHiddenPlugins()))
         self.__pluginContextMenu.popup(self.repositoryList.mapToGlobal(pos))
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_repositoryList_currentItemChanged(self, current, previous):
         """
         Private slot to handle the change of the current item.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -342,21 +369,25 @@
             self.descriptionEdit.clear()
             self.authorEdit.clear()
             return
-        
+
         url = current.data(0, PluginRepositoryWidget.UrlRole)
         url = "" if url is None else self.__changeScheme(url)
         self.urlEdit.setText(url)
         self.descriptionEdit.setPlainText(
-            current.data(0, PluginRepositoryWidget.DescrRole) and
-            self.__formatDescription(
-                current.data(0, PluginRepositoryWidget.DescrRole)) or "")
+            current.data(0, PluginRepositoryWidget.DescrRole)
+            and self.__formatDescription(
+                current.data(0, PluginRepositoryWidget.DescrRole)
+            )
+            or ""
+        )
         self.authorEdit.setText(
-            current.data(0, PluginRepositoryWidget.AuthorRole) or "")
-    
+            current.data(0, PluginRepositoryWidget.AuthorRole) or ""
+        )
+
     def __selectedItems(self):
         """
         Private method to get all selected items without the toplevel ones.
-        
+
         @return list of selected items (list)
         """
         ql = self.repositoryList.selectedItems()
@@ -365,7 +396,7 @@
             if ti in ql:
                 ql.remove(ti)
         return ql
-    
+
     @pyqtSlot()
     def on_repositoryList_itemSelectionChanged(self):
         """
@@ -375,13 +406,13 @@
         self.__downloadButton.setEnabled(enable and self.__online)
         self.__downloadInstallButton.setEnabled(enable and self.__online)
         self.__installButton.setEnabled(enable)
-    
+
     def reloadList(self):
         """
         Public method to reload the list of plugins.
         """
         self.__populateList()
-    
+
     @pyqtSlot()
     def __updateList(self):
         """
@@ -389,20 +420,20 @@
         """
         url = self.repositoryUrlEdit.text()
         self.__pluginManager.downLoadRepositoryFile(url=url)
-    
+
     def __downloadRepositoryFileDone(self, status, filename):
         """
         Private method called after the repository file was downloaded.
-        
+
         @param status flaging indicating a successful download (boolean)
         @param filename full path of the downloaded file (string)
         """
         self.__populateList()
-    
+
     def __downloadPluginDone(self, status, filename):
         """
         Private method called, when the download of a plugin is finished.
-        
+
         @param status flag indicating a successful download (boolean)
         @param filename full path of the downloaded file (string)
         """
@@ -410,23 +441,25 @@
             self.__pluginsDownloaded.append(filename)
         if self.__isDownloadInstall:
             self.__allDownloadedOk &= status
-        
+
         if len(self.__pluginsToDownload):
             self.__pluginsToDownload.pop(0)
-        
+
         if len(self.__pluginsToDownload):
             self.__downloadPlugin()
         else:
             self.__downloadPluginsDone()
-    
+
     def __downloadPlugin(self):
         """
         Private method to download the next plugin.
         """
-        self.__downloadFile(self.__pluginsToDownload[0][0],
-                            self.__pluginsToDownload[0][1],
-                            self.__downloadPluginDone)
-    
+        self.__downloadFile(
+            self.__pluginsToDownload[0][0],
+            self.__pluginsToDownload[0][1],
+            self.__downloadPluginDone,
+        )
+
     def __downloadPlugins(self):
         """
         Private slot to download the selected plugins.
@@ -436,21 +469,26 @@
         self.__downloadButton.setEnabled(False)
         self.__downloadInstallButton.setEnabled(False)
         self.__installButton.setEnabled(False)
-        
+
         newScheme = self.repositoryUrlEdit.text().split("//", 1)[0]
         for itm in self.repositoryList.selectedItems():
-            if itm not in [self.__stableItem, self.__unstableItem,
-                           self.__unknownItem, self.__obsoleteItem]:
+            if itm not in [
+                self.__stableItem,
+                self.__unstableItem,
+                self.__unknownItem,
+                self.__obsoleteItem,
+            ]:
                 url = self.__changeScheme(
-                    itm.data(0, PluginRepositoryWidget.UrlRole),
-                    newScheme)
+                    itm.data(0, PluginRepositoryWidget.UrlRole), newScheme
+                )
                 filename = os.path.join(
                     Preferences.getPluginManager("DownloadPath"),
-                    itm.data(0, PluginRepositoryWidget.FilenameRole))
+                    itm.data(0, PluginRepositoryWidget.FilenameRole),
+                )
                 self.__pluginsToDownload.append((url, filename))
         if self.__pluginsToDownload:
             self.__downloadPlugin()
-    
+
     def __downloadPluginsDone(self):
         """
         Private method called, when the download of the plugins is finished.
@@ -458,14 +496,14 @@
         self.__downloadButton.setEnabled(len(self.__selectedItems()))
         self.__downloadInstallButton.setEnabled(len(self.__selectedItems()))
         self.__installButton.setEnabled(len(self.__selectedItems()))
-        ui = (ericApp().getObject("UserInterface")
-              if not self.__external else None)
+        ui = ericApp().getObject("UserInterface") if not self.__external else None
         if ui is not None:
             ui.showNotification(
                 UI.PixmapCache.getPixmap("plugin48"),
                 self.tr("Download Plugin Files"),
-                self.tr("""The requested plugins were downloaded."""))
-        
+                self.tr("""The requested plugins were downloaded."""),
+            )
+
         if self.__isDownloadInstall:
             self.closeAndInstall.emit()
         else:
@@ -473,21 +511,23 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Download Plugin Files"),
-                    self.tr("""The requested plugins were downloaded."""))
-            
+                    self.tr("""The requested plugins were downloaded."""),
+                )
+
             self.downloadProgress.setValue(0)
-            
+
             # repopulate the list to update the refresh icons
             self.__populateList()
-    
+
     def __resortRepositoryList(self):
         """
         Private method to resort the tree.
         """
         self.repositoryList.sortItems(
             self.repositoryList.sortColumn(),
-            self.repositoryList.header().sortIndicatorOrder())
-    
+            self.repositoryList.header().sortIndicatorOrder(),
+        )
+
     def __populateList(self):
         """
         Private method to populate the list of available plugins.
@@ -497,20 +537,19 @@
         self.__unstableItem = None
         self.__unknownItem = None
         self.__obsoleteItem = None
-        
+
         self.__newItems = 0
         self.__updateLocalItems = 0
         self.__updateRemoteItems = 0
-        
+
         self.downloadProgress.setValue(0)
-        
+
         if os.path.exists(self.pluginRepositoryFile):
             self.__repositoryMissing = False
             f = QFile(self.pluginRepositoryFile)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
-                from EricXML.PluginRepositoryReader import (
-                    PluginRepositoryReader
-                )
+                from EricXML.PluginRepositoryReader import PluginRepositoryReader
+
                 reader = PluginRepositoryReader(f, self.addEntry)
                 reader.readXML()
                 self.repositoryList.resizeColumnToContents(0)
@@ -526,34 +565,38 @@
                         self.tr(
                             """The URL of the Plugins Repository has"""
                             """ changed. Select the "Update" button to get"""
-                            """ the new repository file."""))
+                            """ the new repository file."""
+                        ),
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Read plugins repository file"),
-                    self.tr("<p>The plugins repository file <b>{0}</b> "
-                            "could not be read. Select Update</p>")
-                    .format(self.pluginRepositoryFile))
+                    self.tr(
+                        "<p>The plugins repository file <b>{0}</b> "
+                        "could not be read. Select Update</p>"
+                    ).format(self.pluginRepositoryFile),
+                )
         else:
             self.__repositoryMissing = True
             QTreeWidgetItem(
                 self.repositoryList,
-                ["", self.tr(
-                    "No plugin repository file available.\nSelect Update.")
-                 ])
+                ["", self.tr("No plugin repository file available.\nSelect Update.")],
+            )
             self.repositoryList.resizeColumnToContents(1)
-        
-        self.newLabel.setText(self.tr("New: <b>{0}</b>")
-                              .format(self.__newItems))
-        self.updateLocalLabel.setText(self.tr("Local Updates: <b>{0}</b>")
-                                      .format(self.__updateLocalItems))
-        self.updateRemoteLabel.setText(self.tr("Remote Updates: <b>{0}</b>")
-                                       .format(self.__updateRemoteItems))
-    
+
+        self.newLabel.setText(self.tr("New: <b>{0}</b>").format(self.__newItems))
+        self.updateLocalLabel.setText(
+            self.tr("Local Updates: <b>{0}</b>").format(self.__updateLocalItems)
+        )
+        self.updateRemoteLabel.setText(
+            self.tr("Remote Updates: <b>{0}</b>").format(self.__updateRemoteItems)
+        )
+
     def __downloadFile(self, url, filename, doneMethod=None):
         """
         Private slot to download the given file.
-        
+
         @param url URL for the download (string)
         @param filename local name of the file (string)
         @param doneMethod method to be called when done
@@ -565,16 +608,18 @@
             if not self.__integratedWidget:
                 self.__closeButton.setEnabled(False)
             self.__downloadCancelButton.setEnabled(True)
-            
+
             self.statusLabel.setText(url)
-            
+
             request = QNetworkRequest(QUrl(url))
             request.setAttribute(
                 QNetworkRequest.Attribute.CacheLoadControlAttribute,
-                QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+                QNetworkRequest.CacheLoadControl.AlwaysNetwork,
+            )
             reply = self.__networkManager.get(request)
             reply.finished.connect(
-                lambda: self.__downloadFileDone(reply, filename, doneMethod))
+                lambda: self.__downloadFileDone(reply, filename, doneMethod)
+            )
             reply.downloadProgress.connect(self.__downloadProgress)
             self.__replies.append(reply)
         else:
@@ -584,13 +629,14 @@
                 self.tr(
                     """<p>Could not download the requested file"""
                     """ from {0}.</p><p>Error: {1}</p>"""
-                ).format(url, self.tr("No connection to Internet.")))
-    
+                ).format(url, self.tr("No connection to Internet.")),
+            )
+
     def __downloadFileDone(self, reply, fileName, doneMethod):
         """
         Private method called, after the file has been downloaded
         from the Internet.
-        
+
         @param reply reference to the reply object of the download
         @type QNetworkReply
         @param fileName local name of the file
@@ -602,37 +648,33 @@
         if not self.__integratedWidget:
             self.__closeButton.setEnabled(True)
         self.__downloadCancelButton.setEnabled(False)
-        
+
         ok = True
         if reply in self.__replies:
             self.__replies.remove(reply)
         if reply.error() != QNetworkReply.NetworkError.NoError:
             ok = False
-            if (
-                reply.error() !=
-                QNetworkReply.NetworkError.OperationCanceledError
-            ):
+            if reply.error() != QNetworkReply.NetworkError.OperationCanceledError:
                 EricMessageBox.warning(
                     self,
                     self.tr("Error downloading file"),
                     self.tr(
                         """<p>Could not download the requested file"""
                         """ from {0}.</p><p>Error: {1}</p>"""
-                    ).format(reply.url().toString(), reply.errorString())
+                    ).format(reply.url().toString(), reply.errorString()),
                 )
             self.downloadProgress.setValue(0)
             if self.repositoryList.topLevelItemCount():
                 if self.repositoryList.currentItem() is None:
                     self.repositoryList.setCurrentItem(
-                        self.repositoryList.topLevelItem(0))
+                        self.repositoryList.topLevelItem(0)
+                    )
                 else:
-                    self.__downloadButton.setEnabled(
-                        len(self.__selectedItems()))
-                    self.__downloadInstallButton.setEnabled(
-                        len(self.__selectedItems()))
+                    self.__downloadButton.setEnabled(len(self.__selectedItems()))
+                    self.__downloadInstallButton.setEnabled(len(self.__selectedItems()))
             reply.deleteLater()
             return
-        
+
         downloadIODevice = QFile(fileName + ".tmp")
         downloadIODevice.open(QIODevice.OpenModeFlag.WriteOnly)
         # read data in chunks
@@ -647,14 +689,14 @@
             QFile.remove(fileName)
         downloadIODevice.rename(fileName)
         reply.deleteLater()
-        
+
         if doneMethod is not None:
             doneMethod(ok, fileName)
-    
+
     def __downloadCancel(self, reply=None):
         """
         Private slot to cancel the current download.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
@@ -663,23 +705,24 @@
         self.__pluginsToDownload = []
         if reply is not None:
             reply.abort()
-    
+
     def __downloadProgress(self, done, total):
         """
         Private slot to show the download progress.
-        
+
         @param done number of bytes downloaded so far (integer)
         @param total total bytes to be downloaded (integer)
         """
         if total:
             self.downloadProgress.setMaximum(total)
             self.downloadProgress.setValue(done)
-    
-    def addEntry(self, name, short, description, url, author, version,
-                 filename, status):
+
+    def addEntry(
+        self, name, short, description, url, author, version, filename, status
+    ):
         """
         Public method to add an entry to the list.
-        
+
         @param name data for the name field (string)
         @param short data for the short field (string)
         @param description data for the description field (list of strings)
@@ -692,32 +735,36 @@
         pluginName = filename.rsplit("-", 1)[0]
         if pluginName in self.__hiddenPlugins:
             return
-        
+
         if status == "stable":
             if self.__stableItem is None:
                 self.__stableItem = QTreeWidgetItem(
-                    self.repositoryList, [self.tr("Stable")])
+                    self.repositoryList, [self.tr("Stable")]
+                )
                 self.__stableItem.setExpanded(True)
             parent = self.__stableItem
         elif status == "unstable":
             if self.__unstableItem is None:
                 self.__unstableItem = QTreeWidgetItem(
-                    self.repositoryList, [self.tr("Unstable")])
+                    self.repositoryList, [self.tr("Unstable")]
+                )
                 self.__unstableItem.setExpanded(True)
             parent = self.__unstableItem
         elif status == "obsolete":
             if self.__obsoleteItem is None:
                 self.__obsoleteItem = QTreeWidgetItem(
-                    self.repositoryList, [self.tr("Obsolete")])
+                    self.repositoryList, [self.tr("Obsolete")]
+                )
                 self.__obsoleteItem.setExpanded(True)
             parent = self.__obsoleteItem
         else:
             if self.__unknownItem is None:
                 self.__unknownItem = QTreeWidgetItem(
-                    self.repositoryList, [self.tr("Unknown")])
+                    self.repositoryList, [self.tr("Unknown")]
+                )
                 self.__unknownItem.setExpanded(True)
             parent = self.__unknownItem
-        
+
         if self.__integratedWidget:
             entryFormat = "<b>{0}</b> - Version: <i>{1}</i><br/>{2}"
             itm = QTreeWidgetItem(parent)
@@ -726,12 +773,12 @@
             self.repositoryList.setItemWidget(itm, 0, label)
         else:
             itm = QTreeWidgetItem(parent, [name, version, short])
-        
+
         itm.setData(0, PluginRepositoryWidget.UrlRole, url)
         itm.setData(0, PluginRepositoryWidget.FilenameRole, filename)
         itm.setData(0, PluginRepositoryWidget.AuthorRole, author)
         itm.setData(0, PluginRepositoryWidget.DescrRole, description)
-        
+
         iconColumn = 0 if self.__integratedWidget else 1
         updateStatus = self.__updateStatus(filename, version)
         if updateStatus == PluginRepositoryWidget.PluginStatusUpToDate:
@@ -752,102 +799,97 @@
         elif updateStatus == PluginRepositoryWidget.PluginStatusError:
             itm.setIcon(iconColumn, UI.PixmapCache.getIcon("warning"))
             itm.setToolTip(iconColumn, self.tr("error determining status"))
-    
+
     def __updateStatus(self, filename, version):
         """
         Private method to check the given archive update status.
-        
+
         @param filename data for the filename field (string)
         @param version data for the version field (string)
         @return plug-in update status (integer, one of PluginStatusNew,
             PluginStatusUpToDate, PluginStatusLocalUpdate,
             PluginStatusRemoteUpdate)
         """
-        archive = os.path.join(Preferences.getPluginManager("DownloadPath"),
-                               filename)
-        
+        archive = os.path.join(Preferences.getPluginManager("DownloadPath"), filename)
+
         # check, if it is an update (i.e. we already have archives
         # with the same pattern)
-        archivesPattern = archive.rsplit('-', 1)[0] + "-*.zip"
+        archivesPattern = archive.rsplit("-", 1)[0] + "-*.zip"
         if len(glob.glob(archivesPattern)) == 0:
             # Check against installed/loaded plug-ins
-            pluginName = filename.rsplit('-', 1)[0]
+            pluginName = filename.rsplit("-", 1)[0]
             pluginDetails = self.__pluginManager.getPluginDetails(pluginName)
-            if (
-                pluginDetails is None or
-                pluginDetails["moduleName"] != pluginName
-            ):
+            if pluginDetails is None or pluginDetails["moduleName"] != pluginName:
                 return PluginRepositoryWidget.PluginStatusNew
             if pluginDetails["error"]:
                 return PluginRepositoryWidget.PluginStatusError
-            pluginVersionTuple = Globals.versionToTuple(
-                pluginDetails["version"])[:3]
+            pluginVersionTuple = Globals.versionToTuple(pluginDetails["version"])[:3]
             versionTuple = Globals.versionToTuple(version)[:3]
             if pluginVersionTuple < versionTuple:
                 return PluginRepositoryWidget.PluginStatusRemoteUpdate
             else:
                 return PluginRepositoryWidget.PluginStatusUpToDate
-        
+
         # check, if the archive exists
         if not os.path.exists(archive):
             return PluginRepositoryWidget.PluginStatusRemoteUpdate
-        
+
         # check, if the archive is a valid zip file
         if not zipfile.is_zipfile(archive):
             return PluginRepositoryWidget.PluginStatusRemoteUpdate
-        
+
         zipFile = zipfile.ZipFile(archive, "r")
         try:
             aversion = zipFile.read("VERSION").decode("utf-8")
         except KeyError:
             aversion = ""
         zipFile.close()
-        
+
         if aversion == version:
             # Check against installed/loaded plug-ins
-            pluginName = filename.rsplit('-', 1)[0]
+            pluginName = filename.rsplit("-", 1)[0]
             pluginDetails = self.__pluginManager.getPluginDetails(pluginName)
             if pluginDetails is None:
                 return PluginRepositoryWidget.PluginStatusLocalUpdate
             if (
-                Globals.versionToTuple(pluginDetails["version"])[:3] <
-                Globals.versionToTuple(version)[:3]
+                Globals.versionToTuple(pluginDetails["version"])[:3]
+                < Globals.versionToTuple(version)[:3]
             ):
                 return PluginRepositoryWidget.PluginStatusLocalUpdate
             else:
                 return PluginRepositoryWidget.PluginStatusUpToDate
         else:
             return PluginRepositoryWidget.PluginStatusRemoteUpdate
-    
+
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.
-        
+
         @param reply reference to the reply object (QNetworkReply)
         @param errors list of SSL errors (list of QSslError)
         """
         ignored = self.__sslErrorHandler.sslErrorsReply(reply, errors)[0]
         if ignored == EricSslErrorState.NOT_IGNORED:
             self.__downloadCancel(reply)
-    
+
     def getDownloadedPlugins(self):
         """
         Public method to get the list of recently downloaded plugin files.
-        
+
         @return list of plugin filenames (list of strings)
         """
         return self.__pluginsDownloaded
-    
+
     @pyqtSlot(bool)
     def on_repositoryUrlEditButton_toggled(self, checked):
         """
         Private slot to set the read only status of the repository URL line
         edit.
-        
+
         @param checked state of the push button (boolean)
         """
         self.repositoryUrlEdit.setReadOnly(not checked)
-    
+
     def __closeAndInstall(self):
         """
         Private method to close the dialog and invoke the install dialog.
@@ -856,58 +898,60 @@
             for itm in self.__selectedItems():
                 filename = os.path.join(
                     Preferences.getPluginManager("DownloadPath"),
-                    itm.data(0, PluginRepositoryWidget.FilenameRole))
+                    itm.data(0, PluginRepositoryWidget.FilenameRole),
+                )
                 self.__pluginsDownloaded.append(filename)
         self.closeAndInstall.emit()
-    
+
     def __hidePlugin(self):
         """
         Private slot to hide the current plug-in.
         """
         itm = self.__selectedItems()[0]
-        pluginName = (itm.data(0, PluginRepositoryWidget.FilenameRole)
-                      .rsplit("-", 1)[0])
+        pluginName = itm.data(0, PluginRepositoryWidget.FilenameRole).rsplit("-", 1)[0]
         self.__updateHiddenPluginsList([pluginName])
-    
+
     def __hideSelectedPlugins(self):
         """
         Private slot to hide all selected plug-ins.
         """
         hideList = []
         for itm in self.__selectedItems():
-            pluginName = (itm.data(0, PluginRepositoryWidget.FilenameRole)
-                          .rsplit("-", 1)[0])
+            pluginName = itm.data(0, PluginRepositoryWidget.FilenameRole).rsplit(
+                "-", 1
+            )[0]
             hideList.append(pluginName)
         self.__updateHiddenPluginsList(hideList)
-    
+
     def __showAllPlugins(self):
         """
         Private slot to show all plug-ins.
         """
         self.__hiddenPlugins = []
         self.__updateHiddenPluginsList([])
-    
+
     def __hasHiddenPlugins(self):
         """
         Private method to check, if there are any hidden plug-ins.
-        
+
         @return flag indicating the presence of hidden plug-ins (boolean)
         """
         return bool(self.__hiddenPlugins)
-    
+
     def __updateHiddenPluginsList(self, hideList):
         """
         Private method to store the list of hidden plug-ins to the settings.
-        
+
         @param hideList list of plug-ins to add to the list of hidden ones
             (list of string)
         """
         if hideList:
             self.__hiddenPlugins.extend(
-                [p for p in hideList if p not in self.__hiddenPlugins])
+                [p for p in hideList if p not in self.__hiddenPlugins]
+            )
         Preferences.setPluginManager("HiddenPlugins", self.__hiddenPlugins)
         self.__populateList()
-    
+
     def __cleanupDownloads(self):
         """
         Private slot to cleanup the plug-in downloads area.
@@ -919,10 +963,11 @@
     """
     Class for the dialog variant.
     """
+
     def __init__(self, pluginManager, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @type PluginManager
         @param parent reference to the parent widget
@@ -930,31 +975,31 @@
         """
         super().__init__(parent)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.cw = PluginRepositoryWidget(pluginManager, parent=self)
         size = self.cw.size()
         self.__layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.buttonBox.accepted.connect(self.accept)
         self.cw.buttonBox.rejected.connect(self.reject)
         self.cw.closeAndInstall.connect(self.__closeAndInstall)
-        
+
     def __closeAndInstall(self):
         """
         Private slot to handle the closeAndInstall signal.
         """
         self.done(QDialog.DialogCode.Accepted + 1)
-    
+
     def getDownloadedPlugins(self):
         """
         Public method to get the list of recently downloaded plugin files.
-        
+
         @return list of plugin filenames (list of strings)
         """
         return self.cw.getDownloadedPlugins()
@@ -964,10 +1009,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
@@ -976,55 +1022,55 @@
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.buttonBox.accepted.connect(self.close)
         self.cw.buttonBox.rejected.connect(self.close)
         self.cw.closeAndInstall.connect(self.__startPluginInstall)
-    
+
     def __startPluginInstall(self):
         """
         Private slot to start the eric plugin installation dialog.
         """
         proc = QProcess()
         applPath = os.path.join(getConfig("ericDir"), "eric7_plugininstall.py")
-        
+
         args = []
         args.append(applPath)
         args += self.cw.getDownloadedPlugins()
-        
-        if (
-            not os.path.isfile(applPath) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(applPath) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start the process.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
+                    "<p>Could not start the process.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
                 ).format(applPath),
-                self.tr('OK'))
-        
+                self.tr("OK"),
+            )
+
         self.close()
 
 
 def PluginRepositoryDownloadCleanup(quiet=False):
     """
     Module function to clean up the plug-in downloads area.
-    
+
     @param quiet flag indicating quiet operations
     @type bool
     """
-    pluginsRegister = []    # list of plug-ins contained in the repository
-    
-    def registerPlugin(name, short, description, url, author, version,
-                       filename, status):
+    pluginsRegister = []  # list of plug-ins contained in the repository
+
+    def registerPlugin(
+        name, short, description, url, author, version, filename, status
+    ):
         """
         Method to register a plug-in's data.
-        
+
         @param name data for the name field (string)
         @param short data for the short field (string)
         @param description data for the description field (list of strings)
@@ -1037,19 +1083,17 @@
         pluginName = os.path.splitext(url.rsplit("/", 1)[1])[0]
         if pluginName not in pluginsRegister:
             pluginsRegister.append(pluginName)
-    
+
     downloadPath = Preferences.getPluginManager("DownloadPath")
     downloads = {}  # plug-in name as key, file name as value
-    
+
     # step 1: extract plug-ins and downloaded files
     for pluginFile in os.listdir(downloadPath):
         if not os.path.isfile(os.path.join(downloadPath, pluginFile)):
             continue
-        
+
         try:
-            pluginName, pluginVersion = (
-                pluginFile.replace(".zip", "").rsplit("-", 1)
-            )
+            pluginName, pluginVersion = pluginFile.replace(".zip", "").rsplit("-", 1)
             pluginVersionList = re.split("[._-]", pluginVersion)
             for index in range(len(pluginVersionList)):
                 try:
@@ -1063,22 +1107,28 @@
             # => assume version 0.0.0
             pluginName = pluginFile.replace(".zip", "")
             pluginVersionList = [0, 0, 0]
-        
+
         if pluginName not in downloads:
             downloads[pluginName] = []
         downloads[pluginName].append((pluginFile, tuple(pluginVersionList)))
-    
+
     # step 2: delete old entries
     hiddenPlugins = Preferences.getPluginManager("HiddenPlugins")
     for pluginName in downloads:
         downloads[pluginName].sort(key=lambda x: x[1])
-    
+
         removeFiles = (
             [f[0] for f in downloads[pluginName]]
-            if (pluginName in hiddenPlugins and
-                not Preferences.getPluginManager("KeepHidden")) else
-            [f[0] for f in downloads[pluginName][
-                :-Preferences.getPluginManager("KeepGenerations")]]
+            if (
+                pluginName in hiddenPlugins
+                and not Preferences.getPluginManager("KeepHidden")
+            )
+            else [
+                f[0]
+                for f in downloads[pluginName][
+                    : -Preferences.getPluginManager("KeepGenerations")
+                ]
+            ]
         )
         for removeFile in removeFiles:
             try:
@@ -1088,24 +1138,25 @@
                     EricMessageBox.critical(
                         None,
                         QCoreApplication.translate(
-                            "PluginRepositoryWidget",
-                            "Cleanup of Plugin Downloads"),
+                            "PluginRepositoryWidget", "Cleanup of Plugin Downloads"
+                        ),
                         QCoreApplication.translate(
                             "PluginRepositoryWidget",
                             """<p>The plugin download <b>{0}</b> could"""
-                            """ not be deleted.</p><p>Reason: {1}</p>""")
-                        .format(removeFile, str(err)))
-    
+                            """ not be deleted.</p><p>Reason: {1}</p>""",
+                        ).format(removeFile, str(err)),
+                    )
+
     # step 3: delete entries of obsolete plug-ins
-    pluginRepositoryFile = os.path.join(Utilities.getConfigDir(),
-                                        "PluginRepository")
+    pluginRepositoryFile = os.path.join(Utilities.getConfigDir(), "PluginRepository")
     if os.path.exists(pluginRepositoryFile):
         f = QFile(pluginRepositoryFile)
         if f.open(QIODevice.OpenModeFlag.ReadOnly):
             from EricXML.PluginRepositoryReader import PluginRepositoryReader
+
             reader = PluginRepositoryReader(f, registerPlugin)
             reader.readXML()
-            
+
             for pluginName in downloads:
                 if pluginName not in pluginsRegister:
                     removeFiles = [f[0] for f in downloads[pluginName]]
@@ -1118,10 +1169,13 @@
                                     None,
                                     QCoreApplication.translate(
                                         "PluginRepositoryWidget",
-                                        "Cleanup of Plugin Downloads"),
+                                        "Cleanup of Plugin Downloads",
+                                    ),
                                     QCoreApplication.translate(
                                         "PluginRepositoryWidget",
                                         "<p>The plugin download <b>{0}</b>"
                                         " could not be deleted.</p>"
-                                        "<p>Reason: {1}</p>""")
-                                    .format(removeFile, str(err)))
+                                        "<p>Reason: {1}</p>"
+                                        "",
+                                    ).format(removeFile, str(err)),
+                                )
--- a/src/eric7/PluginManager/PluginUninstallDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/PluginManager/PluginUninstallDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -29,62 +29,62 @@
 class PluginUninstallWidget(QWidget, Ui_PluginUninstallDialog):
     """
     Class implementing a dialog for plugin deinstallation.
-    
+
     @signal accepted() emitted to indicate the removal of a plug-in
     """
+
     accepted = pyqtSignal()
-    
+
     def __init__(self, pluginManager, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @param parent parent of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if pluginManager is None:
             # started as external plugin deinstaller
             from .PluginManager import PluginManager
+
             self.__pluginManager = PluginManager(doLoadPlugins=False)
             self.__external = True
         else:
             self.__pluginManager = pluginManager
             self.__external = False
-        
+
         self.pluginDirectoryCombo.addItem(
-            self.tr("User plugins directory"),
-            self.__pluginManager.getPluginDir("user"))
-        
+            self.tr("User plugins directory"), self.__pluginManager.getPluginDir("user")
+        )
+
         globalDir = self.__pluginManager.getPluginDir("global")
         if globalDir is not None and os.access(globalDir, os.W_OK):
             self.pluginDirectoryCombo.addItem(
-                self.tr("Global plugins directory"),
-                globalDir)
-    
+                self.tr("Global plugins directory"), globalDir
+            )
+
     @pyqtSlot(int)
     def on_pluginDirectoryCombo_currentIndexChanged(self, index):
         """
         Private slot to populate the plugin name combo upon a change of the
         plugin area.
-        
+
         @param index index of the selected item (integer)
         """
         pluginDirectory = self.pluginDirectoryCombo.itemData(index)
-        pluginNames = sorted(self.__pluginManager.getPluginModules(
-            pluginDirectory))
-        
+        pluginNames = sorted(self.__pluginManager.getPluginModules(pluginDirectory))
+
         self.pluginsList.clear()
         for pluginName in pluginNames:
             fname = "{0}.py".format(os.path.join(pluginDirectory, pluginName))
             itm = QListWidgetItem(pluginName)
             itm.setData(Qt.ItemDataRole.UserRole, fname)
-            itm.setFlags(Qt.ItemFlag.ItemIsEnabled |
-                         Qt.ItemFlag.ItemIsUserCheckable)
+            itm.setFlags(Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsUserCheckable)
             itm.setCheckState(Qt.CheckState.Unchecked)
             self.pluginsList.addItem(itm)
-    
+
     @pyqtSlot()
     def on_buttonBox_accepted(self):
         """
@@ -92,11 +92,11 @@
         """
         if self.__uninstallPlugins():
             self.accepted.emit()
-    
+
     def __getCheckedPlugins(self):
         """
         Private method to get the list of plugins to be uninstalled.
-        
+
         @return list of tuples with the plugin name and plugin file name
         @rtype list of tuples of (str, str)
         """
@@ -104,14 +104,13 @@
         for row in range(self.pluginsList.count()):
             itm = self.pluginsList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
-                plugins.append((itm.text(),
-                                itm.data(Qt.ItemDataRole.UserRole)))
+                plugins.append((itm.text(), itm.data(Qt.ItemDataRole.UserRole)))
         return plugins
-    
+
     def __uninstallPlugins(self):
         """
         Private method to uninstall the selected plugins.
-        
+
         @return flag indicating success
         @rtype bool
         """
@@ -121,11 +120,11 @@
             if self.__uninstallPlugin(pluginName, pluginFile):
                 uninstallCount += 1
         return uninstallCount == len(checkedPlugins)
-    
+
     def __uninstallPlugin(self, pluginName, pluginFile):
         """
         Private method to uninstall a given plugin.
-        
+
         @param pluginName name of the plugin
         @type str
         @param pluginFile file name of the plugin
@@ -134,17 +133,20 @@
         @rtype bool
         """
         pluginDirectory = self.pluginDirectoryCombo.itemData(
-            self.pluginDirectoryCombo.currentIndex())
-        
+            self.pluginDirectoryCombo.currentIndex()
+        )
+
         if not self.__pluginManager.unloadPlugin(pluginName):
             EricMessageBox.critical(
                 self,
                 self.tr("Plugin Uninstallation"),
                 self.tr(
                     """<p>The plugin <b>{0}</b> could not be unloaded."""
-                    """ Aborting...</p>""").format(pluginName))
+                    """ Aborting...</p>"""
+                ).format(pluginName),
+            )
             return False
-        
+
         if pluginDirectory not in sys.path:
             sys.path.insert(2, pluginDirectory)
         spec = importlib.util.spec_from_file_location(pluginName, pluginFile)
@@ -156,9 +158,11 @@
                 self.tr("Plugin Uninstallation"),
                 self.tr(
                     """<p>The plugin <b>{0}</b> has no 'packageName'"""
-                    """ attribute. Aborting...</p>""").format(pluginName))
+                    """ attribute. Aborting...</p>"""
+                ).format(pluginName),
+            )
             return False
-        
+
         package = getattr(module, "packageName", None)
         if package is None:
             package = "None"
@@ -166,45 +170,45 @@
         else:
             packageDir = os.path.join(pluginDirectory, package)
         if (
-            hasattr(module, "prepareUninstall") and
-            not self.keepConfigurationCheckBox.isChecked()
+            hasattr(module, "prepareUninstall")
+            and not self.keepConfigurationCheckBox.isChecked()
         ):
             module.prepareUninstall()
         internalPackages = []
         if hasattr(module, "internalPackages"):
             # it is a comma separated string
-            internalPackages = [p.strip() for p in
-                                module.internalPackages.split(",")]
+            internalPackages = [p.strip() for p in module.internalPackages.split(",")]
         del module
-        
+
         # clean sys.modules
         self.__pluginManager.removePluginFromSysModules(
-            pluginName, package, internalPackages)
-        
+            pluginName, package, internalPackages
+        )
+
         try:
             if packageDir and os.path.exists(packageDir):
                 shutil.rmtree(packageDir)
-            
+
             fnameo = "{0}o".format(pluginFile)
             if os.path.exists(fnameo):
                 os.remove(fnameo)
-            
+
             fnamec = "{0}c".format(pluginFile)
             if os.path.exists(fnamec):
                 os.remove(fnamec)
-            
-            pluginDirCache = os.path.join(
-                os.path.dirname(pluginFile), "__pycache__")
+
+            pluginDirCache = os.path.join(os.path.dirname(pluginFile), "__pycache__")
             if os.path.exists(pluginDirCache):
-                pluginFileName = os.path.splitext(
-                    os.path.basename(pluginFile))[0]
-                for fnameo in glob.glob(os.path.join(
-                        pluginDirCache, "{0}*.pyo".format(pluginFileName))):
+                pluginFileName = os.path.splitext(os.path.basename(pluginFile))[0]
+                for fnameo in glob.glob(
+                    os.path.join(pluginDirCache, "{0}*.pyo".format(pluginFileName))
+                ):
                     os.remove(fnameo)
-                for fnamec in glob.glob(os.path.join(
-                        pluginDirCache, "{0}*.pyc".format(pluginFileName))):
+                for fnamec in glob.glob(
+                    os.path.join(pluginDirCache, "{0}*.pyc".format(pluginFileName))
+                ):
                     os.remove(fnamec)
-            
+
             os.remove(pluginFile)
         except OSError as err:
             EricMessageBox.critical(
@@ -213,9 +217,11 @@
                 self.tr(
                     """<p>The plugin package <b>{0}</b> could not be"""
                     """ removed. Aborting...</p>"""
-                    """<p>Reason: {1}</p>""").format(packageDir, str(err)))
+                    """<p>Reason: {1}</p>"""
+                ).format(packageDir, str(err)),
+            )
             return False
-        
+
         if not self.__external:
             ui = ericApp().getObject("UserInterface")
             ui.showNotification(
@@ -223,17 +229,19 @@
                 self.tr("Plugin Uninstallation"),
                 self.tr(
                     """<p>The plugin <b>{0}</b> was uninstalled"""
-                    """ successfully from {1}.</p>""")
-                .format(pluginName, pluginDirectory))
+                    """ successfully from {1}.</p>"""
+                ).format(pluginName, pluginDirectory),
+            )
             return True
-        
+
         EricMessageBox.information(
             self,
             self.tr("Plugin Uninstallation"),
             self.tr(
                 """<p>The plugin <b>{0}</b> was uninstalled successfully"""
-                """ from {1}.</p>""")
-            .format(pluginName, pluginDirectory))
+                """ from {1}.</p>"""
+            ).format(pluginName, pluginDirectory),
+        )
         return True
 
 
@@ -241,26 +249,27 @@
     """
     Class for the dialog variant.
     """
+
     def __init__(self, pluginManager, parent=None):
         """
         Constructor
-        
+
         @param pluginManager reference to the plugin manager object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.cw = PluginUninstallWidget(pluginManager, self)
         size = self.cw.size()
         self.__layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.buttonBox.accepted.connect(self.accept)
         self.cw.buttonBox.rejected.connect(self.reject)
 
@@ -269,10 +278,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
@@ -281,9 +291,8 @@
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.buttonBox.accepted.connect(self.close)
         self.cw.buttonBox.rejected.connect(self.close)
--- a/src/eric7/Plugins/AboutPlugin/AboutDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/AboutPlugin/AboutDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -32,12 +32,10 @@
     """ <a href="mailto:{3}">{3}</a>.</p>"""
     """<p>{0} uses third party software which is copyrighted"""
     """ by its respective copyright holder. For details see"""
-    """ the copyright notice of the individual package.</p>"""
-).format(UI.Info.Program, UI.Info.Homepage, UI.Info.BugAddress,
-         UI.Info.FeatureAddress)
+    """ the copyright notice of the individual package.</p>""",
+).format(UI.Info.Program, UI.Info.Homepage, UI.Info.BugAddress, UI.Info.FeatureAddress)
 
-authorsText = (
-    """
+authorsText = """
 Detlev Offenbach
     Project Manager, Maintainer and German translation
     
@@ -67,10 +65,8 @@
 Gianluca
     Italian translations
 """
-)
 
-thanksText = (
-    """Phil Thompson for providing PyQt and QScintilla and pushing me into this
+thanksText = """Phil Thompson for providing PyQt and QScintilla and pushing me into this
 business.
 
 Andrew Bushnell of Fluent Inc. for contributing the multithreading debugger
@@ -100,7 +96,6 @@
 for providing patches to improve eric3, eric4, eric5 and eric6.
 
 And all the people who reported bugs and made suggestions."""
-)
 
 licenseText = (
     """Eric is {0}
@@ -733,53 +728,54 @@
 copy of the Program in return for a fee.
 
                      END OF TERMS AND CONDITIONS
-""").format(UI.Info.Copyright)
+"""
+).format(UI.Info.Copyright)
 
 
 class AboutDialog(QDialog, Ui_AboutDialog):
     """
     Class implementing an 'About Eric' dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.ericLabel.setText(titleText)
-        self.ericPixmap.setPixmap(
-            UI.PixmapCache.getPixmap("eric").scaled(48, 48))
-        
+        self.ericPixmap.setPixmap(UI.PixmapCache.getPixmap("eric").scaled(48, 48))
+
         ####################################################################
         ## ABOUT
         ####################################################################
-        
+
         self.aboutEdit.setHtml(aboutText)
-        
+
         ####################################################################
         ## Copyright, Authors
         ####################################################################
-        
+
         self.authorsEdit.setPlainText(authorsText)
-        
+
         ####################################################################
         ## THANKS
         ####################################################################
-        
+
         self.thanksEdit.setPlainText(thanksText)
-        
+
         ####################################################################
         ## LICENSE
         ####################################################################
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.licenseEdit.setFontFamily(font.family())
         self.licenseEdit.setFontPointSize(font.pointSize())
-        
+
         self.licenseEdit.setPlainText(licenseText)
-        
+
         self.aboutTabWidget.setCurrentWidget(self.about)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,34 +22,37 @@
     """
     Class implementing a checker for function type annotations.
     """
+
     Codes = [
         ## Function Annotations
-        "A001", "A002", "A003",
-        
+        "A001",
+        "A002",
+        "A003",
         ## Method Annotations
-        "A101", "A102",
-        
+        "A101",
+        "A102",
         ## Return Annotations
-        "A201", "A202", "A203", "A204", "A205", "A206",
-        
+        "A201",
+        "A202",
+        "A203",
+        "A204",
+        "A205",
+        "A206",
         ## Mixed kind of annotations
         "A301",
-        
         ## Annotations Future
         "A871",
-        
         ## Annotation Coverage
         "A881",
-        
         ## Annotation Complexity
-        "A891", "A892",
+        "A891",
+        "A892",
     ]
 
-    def __init__(self, source, filename, tree, select, ignore, expected,
-                 repeat, args):
+    def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -68,7 +71,7 @@
         @type dict
         """
         self.__select = tuple(select)
-        self.__ignore = ('',) if select else tuple(ignore)
+        self.__ignore = ("",) if select else tuple(ignore)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__filename = filename
@@ -78,28 +81,38 @@
 
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         checkersWithCodes = [
             (
                 self.__checkFunctionAnnotations,
-                ("A001", "A002", "A003", "A101", "A102",
-                 "A201", "A202", "A203", "A204", "A205", "A206",
-                 "A301", )
+                (
+                    "A001",
+                    "A002",
+                    "A003",
+                    "A101",
+                    "A102",
+                    "A201",
+                    "A202",
+                    "A203",
+                    "A204",
+                    "A205",
+                    "A206",
+                    "A301",
+                ),
             ),
             (self.__checkAnnotationsFuture, ("A871",)),
             (self.__checkAnnotationsCoverage, ("A881",)),
             (self.__checkAnnotationComplexity, ("A891", "A892")),
         ]
-        
+
         self.__checkers = []
         for checker, codes in checkersWithCodes:
-            if any(not (code and self.__ignoreCode(code))
-                    for code in codes):
+            if any(not (code and self.__ignoreCode(code)) for code in codes):
                 self.__checkers.append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -109,13 +122,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -127,16 +139,16 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
             self.errors.append(
@@ -148,7 +160,7 @@
                     "args": args,
                 }
             )
-    
+
     def run(self):
         """
         Public method to check the given source against annotation issues.
@@ -156,97 +168,102 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         for check in self.__checkers:
             check()
-    
+
     #######################################################################
     ## Annotations
     ##
     ## adapted from: flake8-annotations v2.7.0
     #######################################################################
-    
+
     def __checkFunctionAnnotations(self):
         """
         Private method to check for function annotation issues.
         """
         suppressNoneReturning = self.__args.get(
             "SuppressNoneReturning",
-            AnnotationsCheckerDefaultArgs["SuppressNoneReturning"])
+            AnnotationsCheckerDefaultArgs["SuppressNoneReturning"],
+        )
         suppressDummyArgs = self.__args.get(
-            "SuppressDummyArgs",
-            AnnotationsCheckerDefaultArgs["SuppressDummyArgs"])
+            "SuppressDummyArgs", AnnotationsCheckerDefaultArgs["SuppressDummyArgs"]
+        )
         allowUntypedDefs = self.__args.get(
-            "AllowUntypedDefs",
-            AnnotationsCheckerDefaultArgs["AllowUntypedDefs"])
+            "AllowUntypedDefs", AnnotationsCheckerDefaultArgs["AllowUntypedDefs"]
+        )
         allowUntypedNested = self.__args.get(
-            "AllowUntypedNested",
-            AnnotationsCheckerDefaultArgs["AllowUntypedNested"])
+            "AllowUntypedNested", AnnotationsCheckerDefaultArgs["AllowUntypedNested"]
+        )
         mypyInitReturn = self.__args.get(
-            "MypyInitReturn",
-            AnnotationsCheckerDefaultArgs["MypyInitReturn"])
-        
+            "MypyInitReturn", AnnotationsCheckerDefaultArgs["MypyInitReturn"]
+        )
+
         # Store decorator lists as sets for easier lookup
-        dispatchDecorators = set(self.__args.get(
-            "DispatchDecorators",
-            AnnotationsCheckerDefaultArgs["DispatchDecorators"]))
-        overloadDecorators = set(self.__args.get(
-            "OverloadDecorators",
-            AnnotationsCheckerDefaultArgs["OverloadDecorators"]))
-        
+        dispatchDecorators = set(
+            self.__args.get(
+                "DispatchDecorators",
+                AnnotationsCheckerDefaultArgs["DispatchDecorators"],
+            )
+        )
+        overloadDecorators = set(
+            self.__args.get(
+                "OverloadDecorators",
+                AnnotationsCheckerDefaultArgs["OverloadDecorators"],
+            )
+        )
+
         from .AnnotationsFunctionVisitor import FunctionVisitor
+
         visitor = FunctionVisitor(self.__source)
         visitor.visit(self.__tree)
-        
+
         # Keep track of the last encountered function decorated by
         # `typing.overload`, if any. Per the `typing` module documentation,
         # a series of overload-decorated definitions must be followed by
         # exactly one non-overload-decorated definition of the same function.
         lastOverloadDecoratedFunctionName = None
-        
+
         # Iterate over the arguments with missing type hints, by function.
         for function in visitor.functionDefinitions:
-            if (
-                function.isDynamicallyTyped() and
-                (allowUntypedDefs or
-                 (function.isNested and allowUntypedNested))
+            if function.isDynamicallyTyped() and (
+                allowUntypedDefs or (function.isNested and allowUntypedNested)
             ):
                 # Skip recording errors from dynamically typed functions
                 # or nested functions
                 continue
-            
+
             # Skip recording errors for configured dispatch functions, such as
             # (by default) `functools.singledispatch` and
             # `functools.singledispatchmethod`
             if function.hasDecorator(dispatchDecorators):
                 continue
-            
+
             # Create sentinels to check for mixed hint styles
             hasTypeComment = function.hasTypeComment
-            
+
             has3107Annotation = False
             # PEP 3107 annotations are captured by the return arg
-            
+
             # Iterate over annotated args to detect mixing of type annotations
             # and type comments. Emit this only once per function definition
             for arg in function.getAnnotatedArguments():
                 if arg.hasTypeComment:
                     hasTypeComment = True
-                
+
                 if arg.has3107Annotation:
                     has3107Annotation = True
-                
+
                 if hasTypeComment and has3107Annotation:
                     # Short-circuit check for mixing of type comments &
                     # 3107-style annotations
-                    self.__error(function.lineno - 1, function.col_offset,
-                                 "A301")
+                    self.__error(function.lineno - 1, function.col_offset, "A301")
                     break
-            
+
             # Before we iterate over the function's missing annotations, check
             # to see if it's the closing function def in a series of
             # `typing.overload` decorated functions.
@@ -257,50 +274,50 @@
             # iteration
             if function.hasDecorator(overloadDecorators):
                 lastOverloadDecoratedFunctionName = function.name
-            
+
             # Record explicit errors for arguments that are missing annotations
             for arg in function.getMissedAnnotations():
                 if arg.argname == "return":
                     # return annotations have multiple possible short-circuit
                     # paths
                     if (
-                        suppressNoneReturning and
-                        not arg.hasTypeAnnotation and
-                        function.hasOnlyNoneReturns
+                        suppressNoneReturning
+                        and not arg.hasTypeAnnotation
+                        and function.hasOnlyNoneReturns
                     ):
                         # Skip recording return errors if the function has only
                         # `None` returns. This includes the case of no returns.
                         continue
-                    
+
                     if (
-                        mypyInitReturn and
-                        function.isClassMethod and
-                        function.name == "__init__" and
-                        function.getAnnotatedArguments()
+                        mypyInitReturn
+                        and function.isClassMethod
+                        and function.name == "__init__"
+                        and function.getAnnotatedArguments()
                     ):
                         # Skip recording return errors for `__init__` if at
                         # least one argument is annotated
                         continue
-                
+
                 # If the `suppressDummyArgs` flag is `True`, skip recording
                 # errors for any arguments named `_`
                 if arg.argname == "_" and suppressDummyArgs:
                     continue
 
                 self.__classifyError(function, arg)
-    
+
     def __classifyError(self, function, arg):
         """
         Private method to classify the missing type annotation based on the
         Function & Argument metadata.
-        
+
         For the currently defined rules & program flow, the assumption can be
         made that an argument passed to this method will match a linting error,
         and will only match a single linting error
-        
+
         This function provides an initial classificaton, then passes relevant
         attributes to cached helper function(s).
-        
+
         @param function reference to the Function object
         @type Function
         @param arg reference to the Argument object
@@ -310,29 +327,30 @@
         # All return "arguments" have an explicitly defined name "return"
         if arg.argname == "return":
             errorCode = self.__returnErrorClassifier(
-                function.isClassMethod, function.classDecoratorType,
-                function.functionType
+                function.isClassMethod,
+                function.classDecoratorType,
+                function.functionType,
             )
         else:
             # Otherwise, classify function argument error
             isFirstArg = arg == function.args[0]
             errorCode = self.__argumentErrorClassifier(
-                function.isClassMethod, isFirstArg,
-                function.classDecoratorType, arg.annotationType,
+                function.isClassMethod,
+                isFirstArg,
+                function.classDecoratorType,
+                arg.annotationType,
             )
-        
+
         if errorCode in ("A001", "A002", "A003"):
-            self.__error(arg.lineno - 1, arg.col_offset, errorCode,
-                         arg.argname)
+            self.__error(arg.lineno - 1, arg.col_offset, errorCode, arg.argname)
         else:
             self.__error(arg.lineno - 1, arg.col_offset, errorCode)
-    
+
     @lru_cache()
-    def __returnErrorClassifier(self, isClassMethod, classDecoratorType,
-                                functionType):
+    def __returnErrorClassifier(self, isClassMethod, classDecoratorType, functionType):
         """
         Private method to classify a return type annotation issue.
-        
+
         @param isClassMethod flag indicating a classmethod type function
         @type bool
         @param classDecoratorType type of class decorator
@@ -358,13 +376,14 @@
             return "A202"
         else:
             return "A201"
-    
+
     @lru_cache()
-    def __argumentErrorClassifier(self, isClassMethod, isFirstArg,
-                                  classDecoratorType, annotationType):
+    def __argumentErrorClassifier(
+        self, isClassMethod, isFirstArg, classDecoratorType, annotationType
+    ):
         """
         Private method to classify an argument type annotation issue.
-        
+
         @param isClassMethod flag indicating a classmethod type function
         @type bool
         @param isFirstArg flag indicating the first argument
@@ -395,106 +414,134 @@
         else:
             # Combine PosOnlyArgs, Args, and KwOnlyArgs
             return "A001"
-    
+
     #######################################################################
     ## Annotations Coverage
     ##
     ## adapted from: flake8-annotations-coverage v0.0.5
     #######################################################################
-    
+
     def __checkAnnotationsCoverage(self):
         """
         Private method to check for function annotation coverage.
         """
         minAnnotationsCoverage = self.__args.get(
-            "MinimumCoverage",
-            AnnotationsCheckerDefaultArgs["MinimumCoverage"])
+            "MinimumCoverage", AnnotationsCheckerDefaultArgs["MinimumCoverage"]
+        )
         if minAnnotationsCoverage == 0:
             # 0 means it is switched off
             return
-        
+
         functionDefs = [
-            f for f in ast.walk(self.__tree)
+            f
+            for f in ast.walk(self.__tree)
             if isinstance(f, (ast.AsyncFunctionDef, ast.FunctionDef))
         ]
         if not functionDefs:
             # no functions/methods at all
             return
-        
+
         functionDefAnnotationsInfo = [
             self.__hasTypeAnnotations(f) for f in functionDefs
         ]
         annotationsCoverage = int(
-            len(list(filter(None, functionDefAnnotationsInfo))) /
-            len(functionDefAnnotationsInfo) * 100
+            len(list(filter(None, functionDefAnnotationsInfo)))
+            / len(functionDefAnnotationsInfo)
+            * 100
         )
         if annotationsCoverage < minAnnotationsCoverage:
             self.__error(0, 0, "A881", annotationsCoverage)
-    
+
     def __hasTypeAnnotations(self, funcNode):
         """
         Private method to check for type annotations.
-        
+
         @param funcNode reference to the function definition node to be checked
         @type ast.AsyncFunctionDef or ast.FunctionDef
         @return flag indicating the presence of type annotations
         @rtype bool
         """
         hasReturnAnnotation = funcNode.returns is not None
-        hasArgsAnnotations = any(a for a in funcNode.args.args
-                                 if a.annotation is not None)
-        hasKwargsAnnotations = (funcNode.args and
-                                funcNode.args.kwarg and
-                                funcNode.args.kwarg.annotation is not None)
-        hasKwonlyargsAnnotations = any(a for a in funcNode.args.kwonlyargs
-                                       if a.annotation is not None)
-        
-        return any((hasReturnAnnotation, hasArgsAnnotations,
-                    hasKwargsAnnotations, hasKwonlyargsAnnotations))
-    
+        hasArgsAnnotations = any(
+            a for a in funcNode.args.args if a.annotation is not None
+        )
+        hasKwargsAnnotations = (
+            funcNode.args
+            and funcNode.args.kwarg
+            and funcNode.args.kwarg.annotation is not None
+        )
+        hasKwonlyargsAnnotations = any(
+            a for a in funcNode.args.kwonlyargs if a.annotation is not None
+        )
+
+        return any(
+            (
+                hasReturnAnnotation,
+                hasArgsAnnotations,
+                hasKwargsAnnotations,
+                hasKwonlyargsAnnotations,
+            )
+        )
+
     #######################################################################
     ## Annotations Complexity
     ##
     ## adapted from: flake8-annotations-complexity v0.0.6
     #######################################################################
-    
+
     def __checkAnnotationComplexity(self):
         """
         Private method to check the type annotation complexity.
         """
         maxAnnotationComplexity = self.__args.get(
-            "MaximumComplexity",
-            AnnotationsCheckerDefaultArgs["MaximumComplexity"])
+            "MaximumComplexity", AnnotationsCheckerDefaultArgs["MaximumComplexity"]
+        )
         maxAnnotationLength = self.__args.get(
-            "MaximumLength", AnnotationsCheckerDefaultArgs["MaximumLength"])
+            "MaximumLength", AnnotationsCheckerDefaultArgs["MaximumLength"]
+        )
         typeAnnotations = []
-        
+
         functionDefs = [
-            f for f in ast.walk(self.__tree)
+            f
+            for f in ast.walk(self.__tree)
             if isinstance(f, (ast.AsyncFunctionDef, ast.FunctionDef))
         ]
         for functionDef in functionDefs:
-            typeAnnotations += list(filter(
-                None, [a.annotation for a in functionDef.args.args]))
+            typeAnnotations += list(
+                filter(None, [a.annotation for a in functionDef.args.args])
+            )
             if functionDef.returns:
                 typeAnnotations.append(functionDef.returns)
-        typeAnnotations += [a.annotation for a in ast.walk(self.__tree)
-                            if isinstance(a, ast.AnnAssign) and a.annotation]
+        typeAnnotations += [
+            a.annotation
+            for a in ast.walk(self.__tree)
+            if isinstance(a, ast.AnnAssign) and a.annotation
+        ]
         for annotation in typeAnnotations:
             complexity = self.__getAnnotationComplexity(annotation)
             if complexity > maxAnnotationComplexity:
-                self.__error(annotation.lineno - 1, annotation.col_offset,
-                             "A891", complexity, maxAnnotationComplexity)
-            
+                self.__error(
+                    annotation.lineno - 1,
+                    annotation.col_offset,
+                    "A891",
+                    complexity,
+                    maxAnnotationComplexity,
+                )
+
             annotationLength = self.__getAnnotationLength(annotation)
             if annotationLength > maxAnnotationLength:
-                self.__error(annotation.lineno - 1, annotation.col_offset,
-                             "A892", annotationLength, maxAnnotationLength)
-    
+                self.__error(
+                    annotation.lineno - 1,
+                    annotation.col_offset,
+                    "A892",
+                    annotationLength,
+                    maxAnnotationLength,
+                )
+
     def __getAnnotationComplexity(self, annotationNode, defaultComplexity=1):
         """
         Private method to determine the annotation complexity.
-        
+
         @param annotationNode reference to the node to determine the annotation
             complexity for
         @type ast.AST
@@ -510,25 +557,24 @@
                 return defaultComplexity
         if isinstance(annotationNode, ast.Subscript):
             if sys.version_info >= (3, 9):
-                return (defaultComplexity +
-                        self.__getAnnotationComplexity(annotationNode.slice))
+                return defaultComplexity + self.__getAnnotationComplexity(
+                    annotationNode.slice
+                )
             else:
-                return (
-                    defaultComplexity +
-                    self.__getAnnotationComplexity(annotationNode.slice.value)
+                return defaultComplexity + self.__getAnnotationComplexity(
+                    annotationNode.slice.value
                 )
         if isinstance(annotationNode, ast.Tuple):
             return max(
-                (self.__getAnnotationComplexity(n)
-                 for n in annotationNode.elts),
-                default=defaultComplexity
+                (self.__getAnnotationComplexity(n) for n in annotationNode.elts),
+                default=defaultComplexity,
             )
         return defaultComplexity
-    
+
     def __getAnnotationLength(self, annotationNode):
         """
         Private method to determine the annotation length.
-        
+
         @param annotationNode reference to the node to determine the annotation
             length for
         @type ast.AST
@@ -549,26 +595,24 @@
             except AttributeError:
                 return 0
         return 0
-    
+
     #######################################################################
     ## 'from __future__ import annotations' checck
     ##
     ## adapted from: flake8-future-annotations v0.0.4
     #######################################################################
-    
+
     def __checkAnnotationsFuture(self):
         """
         Private method to check the use of __future__ and typing imports.
         """
         from .AnnotationsFutureVisitor import AnnotationsFutureVisitor
+
         visitor = AnnotationsFutureVisitor()
         visitor.visit(self.__tree)
-        
-        if (
-            visitor.importsFutureAnnotations() or
-            not visitor.hasTypingImports()
-        ):
+
+        if visitor.importsFutureAnnotations() or not visitor.hasTypingImports():
             return
-        
+
         imports = ", ".join(visitor.getTypingImports())
         self.__error(0, 0, "A871", imports)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsCheckerDefaults.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsCheckerDefaults.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,8 @@
     "MypyInitReturn": False,
     "DispatchDecorators": ["singledispatch", "singledispatchmethod"],
     "OverloadDecorators": ["overload"],
-    
     # Annotation Coverage
-    "MinimumCoverage": 75,      # % of type annotation coverage
-    
+    "MinimumCoverage": 75,  # % of type annotation coverage
     # Annotation Complexity
     "MaximumComplexity": 3,
     "MaximumLength": 7,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsEnums.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsEnums.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,16 +18,18 @@
     """
     Class representing the various function types.
     """
+
     PUBLIC = enum.auto()
-    PROTECTED = enum.auto()      # Leading single underscore
-    PRIVATE = enum.auto()        # Leading double underscore
-    SPECIAL = enum.auto()        # Leading & trailing double underscore
+    PROTECTED = enum.auto()  # Leading single underscore
+    PRIVATE = enum.auto()  # Leading double underscore
+    SPECIAL = enum.auto()  # Leading & trailing double underscore
 
 
 class ClassDecoratorType(enum.Enum):
     """
     Class representing the various class method decorators.
     """
+
     CLASSMETHOD = enum.auto()
     STATICMETHOD = enum.auto()
 
@@ -36,6 +38,7 @@
     """
     Class representing the kind of missing type annotation.
     """
+
     POSONLYARGS = enum.auto()
     ARGS = enum.auto()
     VARARG = enum.auto()
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFunctionVisitor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFunctionVisitor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,12 +25,20 @@
     """
     Class representing a function argument.
     """
-    def __init__(self, argname, lineno, col_offset, annotationType,
-                 hasTypeAnnotation=False, has3107Annotation=False,
-                 hasTypeComment=False):
+
+    def __init__(
+        self,
+        argname,
+        lineno,
+        col_offset,
+        annotationType,
+        hasTypeAnnotation=False,
+        has3107Annotation=False,
+        hasTypeComment=False,
+    ):
         """
         Constructor
-        
+
         @param argname name of the argument
         @type str
         @param lineno line number
@@ -56,12 +64,12 @@
         self.hasTypeAnnotation = hasTypeAnnotation
         self.has3107Annotation = has3107Annotation
         self.hasTypeComment = hasTypeComment
-    
+
     @classmethod
     def fromNode(cls, node, annotationTypeName):
         """
         Class method to create an Argument object based on the given node.
-        
+
         @param node reference to the node to be converted
         @type ast.arguments
         @param annotationTypeName name of the annotation type
@@ -88,14 +96,25 @@
     """
     Class representing a function.
     """
-    def __init__(self, name, lineno, col_offset,
-                 functionType=FunctionType.PUBLIC, isClassMethod=False,
-                 classDecoratorType=None, isReturnAnnotated=False,
-                 hasTypeComment=False, hasOnlyNoneReturns=True,
-                 isNested=False, decoratorList=None, args=None):
+
+    def __init__(
+        self,
+        name,
+        lineno,
+        col_offset,
+        functionType=FunctionType.PUBLIC,
+        isClassMethod=False,
+        classDecoratorType=None,
+        isReturnAnnotated=False,
+        hasTypeComment=False,
+        hasOnlyNoneReturns=True,
+        isNested=False,
+        decoratorList=None,
+        args=None,
+    ):
         """
         Constructor
-        
+
         @param name name of the function
         @type str
         @param lineno line number
@@ -138,24 +157,24 @@
         self.isNested = isNested
         self.decoratorList = decoratorList
         self.args = args
-    
+
     def isFullyAnnotated(self):
         """
         Public method to check, if the function definition is fully type
         annotated.
 
         Note: self.args will always include an Argument object for return.
-        
+
         @return flag indicating a fully annotated function definition
         @rtype bool
         """
         return all(arg.hasTypeAnnotation for arg in self.args)
-    
+
     def isDynamicallyTyped(self):
         """
         Public method to check, if a function definition is dynamically typed
         (i.e. completely lacking hints).
-        
+
         @return flag indicating a dynamically typed function definition
         @rtype bool
         """
@@ -165,7 +184,7 @@
         """
         Public method to provide a list of arguments with missing type
         annotations.
-        
+
         @return list of arguments with missing type annotations
         @rtype list of Argument
         """
@@ -174,26 +193,26 @@
     def getAnnotatedArguments(self):
         """
         Public method to get list of arguments with type annotations.
-        
+
         @return list of arguments with type annotations.
         @rtype list of Argument
         """
         return [arg for arg in self.args if arg.hasTypeAnnotation]
-    
+
     def hasDecorator(self, checkDecorators):
         """
         Public method to check whether the function node is decorated by any of
         the provided decorators.
-        
+
         Decorator matching is done against the provided `checkDecorators` set.
         Decorators are assumed to be either a module attribute (e.g.
         `@typing.overload`) or name (e.g. `@overload`). For the case of a
         module attribute, only the attribute is checked against
         `overload_decorators`.
-        
+
         Note: Deeper decorator imports (e.g. `a.b.overload`) are not explicitly
         supported.
-        
+
         @param checkDecorators set of decorators to check against
         @type set of str
         @return flag indicating the presence of any decorators
@@ -205,18 +224,18 @@
             return self.__decoratorChecker(decorator, checkDecorators)
         else:
             return False
-    
+
     def __decoratorChecker(self, decorator, checkDecorators):
         """
         Private method to check the provided decorator for a match against the
         provided set of check names.
-        
+
         Decorators are assumed to be of the following form:
             * `a.name` or `a.name()`
             * `name` or `name()`
-        
+
         Note: Deeper imports (e.g. `a.b.name`) are not explicitly supported.
-        
+
         @param decorator decorator node to check
         @type ast.Attribute, ast.Call or ast.Name
         @param checkDecorators set of decorators to check against
@@ -237,24 +256,24 @@
             # `decorator.func` will be `ast.Name` or `ast.Attribute`,
             # which we can check recursively
             return self.__decoratorChecker(decorator.func, checkDecorators)
-        
+
         return None
-    
+
     @classmethod
     def fromNode(cls, node, lines, **kwargs):
         """
         Class method to create a Function object from ast.FunctionDef or
         ast.AsyncFunctionDef nodes.
-        
+
         Accept the source code, as a list of strings, in order to get the
         column where the function definition ends.
-        
+
         With exceptions, input kwargs are passed straight through to Function's
         __init__. The following kwargs will be overridden:
           * function_type
           * class_decorator_type
           * args
-        
+
         @param node reference to the function definition node
         @type ast.AsyncFunctionDef or ast.FunctionDef
         @param lines list of source code lines
@@ -266,63 +285,63 @@
         """
         # Extract function types from function name
         kwargs["functionType"] = cls.getFunctionType(node.name)
-        
+
         # Identify type of class method, if applicable
         if kwargs.get("isClassMethod", False):
             kwargs["classDecoratorType"] = cls.getClassDecoratorType(node)
-        
+
         # Store raw decorator list for use by property methods
         kwargs["decoratorList"] = node.decorator_list
-        
+
         # Instantiate empty args list here since it has no default
         kwargs["args"] = []
 
         newFunction = cls(node.name, node.lineno, node.col_offset, **kwargs)
-        
+
         # Iterate over arguments by type & add
         for argType in AST_ARG_TYPES:
             args = node.args.__getattribute__(argType)
             if args:
                 if not isinstance(args, list):
                     args = [args]
-                
+
                 newFunction.args.extend(
-                    [Argument.fromNode(arg, argType.upper())
-                     for arg in args]
+                    [Argument.fromNode(arg, argType.upper()) for arg in args]
                 )
-        
+
         # Create an Argument object for the return hint
         defEndLineno, defEndColOffset = cls.colonSeeker(node, lines)
-        returnArg = Argument("return", defEndLineno, defEndColOffset,
-                             AnnotationType.RETURN)
+        returnArg = Argument(
+            "return", defEndLineno, defEndColOffset, AnnotationType.RETURN
+        )
         if node.returns:
             returnArg.hasTypeAnnotation = True
             returnArg.has3107Annotation = True
             newFunction.isReturnAnnotated = True
-        
+
         newFunction.args.append(returnArg)
-        
+
         # Type comments in-line with input arguments are handled by the
         # Argument class. If a function-level type comment is present, attempt
         # to parse for any missed type hints.
         if node.type_comment:
             newFunction.hasTypeComment = True
             newFunction = cls.tryTypeComment(newFunction, node)
-        
+
         # Check for the presence of non-`None` returns using the special-case
         # return node visitor.
         returnVisitor = ReturnVisitor(node)
         returnVisitor.visit(node)
         newFunction.hasOnlyNoneReturns = returnVisitor.hasOnlyNoneReturns
-        
+
         return newFunction
-    
+
     @staticmethod
     def colonSeeker(node, lines):
         """
         Static method to find the line & column indices of the function
         definition's closing colon.
-        
+
         @param node reference to the function definition node
         @type ast.AsyncFunctionDef or ast.FunctionDef
         @param lines list of source code lines
@@ -332,9 +351,8 @@
         """
         # Special case single line function definitions
         if node.lineno == node.body[0].lineno:
-            return Function._singleLineColonSeeker(
-                node, lines[node.lineno - 1])
-        
+            return Function._singleLineColonSeeker(node, lines[node.lineno - 1])
+
         # With Python < 3.8, the function node includes the docstring and the
         # body does not, so we have to rewind through any docstrings, if
         # present, before looking for the def colon. We should end up with
@@ -351,24 +369,24 @@
                     if '"""' in lines[defEndLineno - 1]:
                         # Docstring has closed
                         break
-        
+
         # Once we've gotten here, we've found the line where the docstring
         # begins, so we have to step up one more line to get to the close of
         # the def.
         defEndLineno -= 1
-        
+
         # Use str.rfind() to account for annotations on the same line,
         # definition closure should be the last : on the line
         defEndColOffset = lines[defEndLineno - 1].rfind(":")
-        
+
         return defEndLineno, defEndColOffset
-    
+
     @staticmethod
     def _singleLineColonSeeker(node, line):
         """
         Static method to find the line & column indices of a single line
         function definition.
-        
+
         @param node reference to the function definition node
         @type ast.AsyncFunctionDef or ast.FunctionDef
         @param line source code line
@@ -379,17 +397,17 @@
         colStart = node.col_offset
         colEnd = node.body[0].col_offset
         defEndColOffset = line.rfind(":", colStart, colEnd)
-        
+
         return node.lineno, defEndColOffset
-    
+
     @staticmethod
     def tryTypeComment(funcObj, node):
         """
         Static method to infer type hints from a function-level type comment.
-        
+
         If a function is type commented it is assumed to have a return
         annotation, otherwise Python will fail to parse the hint.
-        
+
         @param funcObj reference to the Function object
         @type Function
         @param node reference to the function definition node
@@ -399,56 +417,54 @@
         """
         hintTree = ast.parse(node.type_comment, "<func_type>", "func_type")
         hintTree = Function._maybeInjectClassArgument(hintTree, funcObj)
-        
-        for arg, hintComment in itertools.zip_longest(
-            funcObj.args, hintTree.argtypes
-        ):
+
+        for arg, hintComment in itertools.zip_longest(funcObj.args, hintTree.argtypes):
             if isinstance(hintComment, ast.Ellipsis):
                 continue
-            
+
             if arg and hintComment:
                 arg.hasTypeAnnotation = True
                 arg.hasTypeComment = True
-        
+
         # Return arg is always last
         funcObj.args[-1].hasTypeAnnotation = True
         funcObj.args[-1].hasTypeComment = True
         funcObj.isReturnAnnotated = True
-        
+
         return funcObj
-    
+
     @staticmethod
     def _maybeInjectClassArgument(hintTree, funcObj):
         """
         Static method to inject `self` or `cls` args into a type comment to
         align with PEP 3107-style annotations.
-        
+
         Because PEP 484 does not describe a method to provide partial function-
         level type comments, there is a potential for ambiguity in the context
         of both class methods and classmethods when aligning type comments to
         method arguments.
-        
+
         These two class methods, for example, should lint equivalently:
-        
+
             def bar(self, a):
                 # type: (int) -> int
                 ...
-        
+
             def bar(self, a: int) -> int
                 ...
-        
+
         When this example type comment is parsed by `ast` and then matched with
         the method's arguments, it associates the `int` hint to `self` rather
         than `a`, so a dummy hint needs to be provided in situations where
         `self` or `class` are not hinted in the type comment in order to
         achieve equivalent linting results to PEP-3107 style annotations.
-        
+
         A dummy `ast.Ellipses` constant is injected if the following criteria
         are met:
             1. The function node is either a class method or classmethod
             2. The number of hinted args is at least 1 less than the number
                of function args
-        
+
         @param hintTree parsed type hint node
         @type ast.FunctionType
         @param funcObj reference to the Function object
@@ -460,15 +476,14 @@
             # Short circuit
             return hintTree
 
-        if (
-            funcObj.classDecoratorType != ClassDecoratorType.STATICMETHOD and
-            len(hintTree.argtypes) < (len(funcObj.args) - 1)
-        ):
+        if funcObj.classDecoratorType != ClassDecoratorType.STATICMETHOD and len(
+            hintTree.argtypes
+        ) < (len(funcObj.args) - 1):
             # Subtract 1 to skip return arg
             hintTree.argtypes = [ast.Ellipsis()] + hintTree.argtypes
-        
+
         return hintTree
-    
+
     @staticmethod
     def getFunctionType(functionName):
         """
@@ -479,7 +494,7 @@
           2. Private: function name prefixed by "__"
           3. Protected: function name prefixed by "_"
           4. Public: everything else
-        
+
         @param functionName function name to be checked
         @type str
         @return type of function
@@ -493,19 +508,19 @@
             return FunctionType.PROTECTED
         else:
             return FunctionType.PUBLIC
-    
+
     @staticmethod
     def getClassDecoratorType(functionNode):
         """
         Static method to get the class method's decorator type from its
         function node.
-        
+
         Only @classmethod and @staticmethod decorators are identified; all
         other decorators are ignored
-        
+
         If @classmethod or @staticmethod decorators are not present, this
         function will return None.
-        
+
         @param functionNode reference to the function definition node
         @type ast.AsyncFunctionDef or ast.FunctionDef
         @return class decorator type
@@ -532,28 +547,29 @@
     """
     Class implementing a node visitor to check function annotations.
     """
+
     AstFuncTypes = (ast.FunctionDef, ast.AsyncFunctionDef)
-    
+
     def __init__(self, lines):
         """
         Constructor
-        
+
         @param lines source code lines of the function
         @type list of str
         """
         self.lines = lines
         self.functionDefinitions = []
         self.__context = []
-    
+
     def switchContext(self, node):
         """
         Public method implementing a context switcher as a generic function
         visitor in order to track function context.
-        
+
         Without keeping track of context, it's challenging to reliably
         differentiate class methods from "regular" functions, especially in the
         case of nested classes.
-        
+
         @param node reference to the function definition node to be analyzed
         @type ast.AsyncFunctionDef or ast.FunctionDef
         """
@@ -567,21 +583,18 @@
                     self.functionDefinitions.append(
                         Function.fromNode(node, self.lines, isClassMethod=True)
                     )
-                elif isinstance(
-                    self.__context[-1], FunctionVisitor.AstFuncTypes
-                ):
+                elif isinstance(self.__context[-1], FunctionVisitor.AstFuncTypes):
                     # Check for nested function & pass the appropriate flag
                     self.functionDefinitions.append(
                         Function.fromNode(node, self.lines, isNested=True)
                     )
             else:
-                self.functionDefinitions.append(
-                    Function.fromNode(node, self.lines))
-        
+                self.functionDefinitions.append(Function.fromNode(node, self.lines))
+
         self.__context.append(node)
         self.generic_visit(node)
         self.__context.pop()
-    
+
     visit_FunctionDef = switchContext
     visit_AsyncFunctionDef = switchContext
     visit_ClassDef = switchContext
@@ -591,24 +604,25 @@
     """
     Class implementing a node visitor to check the return statements of a
     function node.
-    
+
     If the function node being visited has an explicit return statement of
     anything other than `None`, the `instance.hasOnlyNoneReturns` flag will
     be set to `False`.
-    
+
     If the function node being visited has no return statement, or contains
     only return statement(s) that explicitly return `None`, the
     `instance.hasOnlyNoneReturns` flag will be set to `True`.
-    
+
     Due to the generic visiting being done, we need to keep track of the
     context in which a non-`None` return node is found. These functions are
     added to a set that is checked to see whether nor not the parent node is
     present.
     """
+
     def __init__(self, parentNode):
         """
         Constructor
-        
+
         @param parentNode reference to the function definition node to be
             analyzed
         @type ast.AsyncFunctionDef or ast.FunctionDef
@@ -616,28 +630,28 @@
         self.parentNode = parentNode
         self.__context = []
         self.__nonNoneReturnNodes = set()
-    
+
     @property
     def hasOnlyNoneReturns(self):
         """
         Public method indicating, that the parent node isn't in the visited
         nodes that don't return `None`.
-        
+
         @return flag indicating, that the parent node isn't in the visited
             nodes that don't return `None`
         @rtype bool
         """
         return self.parentNode not in self.__nonNoneReturnNodes
-    
+
     def visit_Return(self, node):
         """
         Public method to check each Return node to see if it returns anything
         other than `None`.
-        
+
         If the node being visited returns anything other than `None`, its
         parent context is added to the set of non-returning child nodes of
         the parent node.
-        
+
         @param node reference to the AST Return node
         @type ast.Return
         """
@@ -647,22 +661,22 @@
             # `ast.NameConstant`, which we need to check to see if it's
             # actually `None`
             if (
-                isinstance(node.value, (ast.Constant, ast.NameConstant)) and
-                node.value.value is None
+                isinstance(node.value, (ast.Constant, ast.NameConstant))
+                and node.value.value is None
             ):
                 return
-            
+
             self.__nonNoneReturnNodes.add(self.__context[-1])
 
     def switchContext(self, node):
         """
         Public method implementing a context switcher as a generic function
         visitor in order to track function context.
-        
+
         Without keeping track of context, it's challenging to reliably
         differentiate class methods from "regular" functions, especially in the
         case of nested classes.
-        
+
         @param node reference to the function definition node to be analyzed
         @type ast.AsyncFunctionDef or ast.FunctionDef
         """
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFutureVisitor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFutureVisitor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing a node visitor to check __future__ imports.
     """
+
     SimplifyableTypes = (
         "DefaultDict",
         "Deque",
@@ -31,30 +32,30 @@
         "Union",
         "Type",
     )
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__typingAliases = []
         self.__importsFutureAnnotations = False
-        
+
         # e.g. from typing import List, typing.List, t.List
         self.__typingImports = []
-    
+
     def visit_Import(self, node):
         """
         Public method to check imports for typing related stuff.
-        
+
         This looks like:
         import typing
         or
         import typing as t
-        
+
         typing or t will be added to the list of typing aliases.
-        
+
         @param node reference to the AST Import node
         @type ast.Import
         """
@@ -63,9 +64,9 @@
                 self.__typingAliases.append("typing")
             if alias.asname is not None:
                 self.__typingAliases.append(alias.asname)
-        
+
         self.generic_visit(node)
-    
+
     def visit_ImportFrom(self, node):
         """
         Public method to detect the 'from __future__ import annotations'
@@ -73,7 +74,7 @@
 
         If 'from typing import ...' is used, add simplifiable names that were
         imported.
-        
+
         @param node reference to the AST ImportFrom node
         @type ast.ImportFrom
         """
@@ -88,48 +89,48 @@
                     self.__typingImports.append(alias.name)
 
         self.generic_visit(node)
-    
+
     def visit_Attribute(self, node):
         """
         Public method to record simplifiable names.
-        
+
         If 'import typing' or 'import typing as t' is used, add simplifiable
         names that were used later on in the code.
-        
+
         @param node reference to the AST Attribute node
         @type ast.Attribute
         """
         if (
-            node.attr in AnnotationsFutureVisitor.SimplifyableTypes and
-            isinstance(node.value, ast.Name) and
-            node.value.id in self.__typingAliases
+            node.attr in AnnotationsFutureVisitor.SimplifyableTypes
+            and isinstance(node.value, ast.Name)
+            and node.value.id in self.__typingAliases
         ):
             self.__typingImports.append(f"{node.value.id}.{node.attr}")
-        
+
         self.generic_visit(node)
-    
+
     def importsFutureAnnotations(self):
         """
         Public method to check, if the analyzed code uses future annotation.
-        
+
         @return flag indicatung the use of future annotation
         @rtype bool
         """
         return self.__importsFutureAnnotations
-    
+
     def hasTypingImports(self):
         """
         Public method to check, if the analyzed code includes typing imports.
-        
+
         @return flag indicating the use of typing imports
         @rtype bool
         """
         return bool(self.__typingImports)
-    
+
     def getTypingImports(self):
         """
         Public method to get the list of typing imports.
-        
+
         @return list of typing imports
         @rtype list of str
         """
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,56 +13,55 @@
 
 _annotationsMessages = {
     "A001": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing type annotation for function argument '{0}'"),
+        "AnnotationsChecker", "missing type annotation for function argument '{0}'"
+    ),
     "A002": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing type annotation for '*{0}'"),
+        "AnnotationsChecker", "missing type annotation for '*{0}'"
+    ),
     "A003": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing type annotation for '**{0}'"),
+        "AnnotationsChecker", "missing type annotation for '**{0}'"
+    ),
     "A101": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing type annotation for 'self' in method"),
+        "AnnotationsChecker", "missing type annotation for 'self' in method"
+    ),
     "A102": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing type annotation for 'cls' in classmethod"),
+        "AnnotationsChecker", "missing type annotation for 'cls' in classmethod"
+    ),
     "A201": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for public function"),
+        "AnnotationsChecker", "missing return type annotation for public function"
+    ),
     "A202": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for protected function"),
+        "AnnotationsChecker", "missing return type annotation for protected function"
+    ),
     "A203": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for private function"),
+        "AnnotationsChecker", "missing return type annotation for private function"
+    ),
     "A204": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for special method"),
+        "AnnotationsChecker", "missing return type annotation for special method"
+    ),
     "A205": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for staticmethod"),
+        "AnnotationsChecker", "missing return type annotation for staticmethod"
+    ),
     "A206": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "missing return type annotation for classmethod"),
+        "AnnotationsChecker", "missing return type annotation for classmethod"
+    ),
     "A301": QCoreApplication.translate(
         "AnnotationsChecker",
-        "PEP 484 disallows both type annotations and type comments"),
-    
+        "PEP 484 disallows both type annotations and type comments",
+    ),
     "A871": QCoreApplication.translate(
         "AnnotationsChecker",
-        "missing 'from __future__ import annotations' but imports: {0}"),
-    
+        "missing 'from __future__ import annotations' but imports: {0}",
+    ),
     "A881": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "type annotation coverage of {0}% is too low"),
-    
+        "AnnotationsChecker", "type annotation coverage of {0}% is too low"
+    ),
     "A891": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "type annotation is too complex ({0} > {1})"),
+        "AnnotationsChecker", "type annotation is too complex ({0} > {1})"
+    ),
     "A892": QCoreApplication.translate(
-        "AnnotationsChecker",
-        "type annotation is too long ({0} > {1})"),
+        "AnnotationsChecker", "type annotation is too long ({0} > {1})"
+    ),
 }
 
 _annotationsMessagesSampleArgs = {
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,83 +13,70 @@
 
 if sys.version_info >= (3, 8, 0):
     # functions for Python >= 3.8
-    
+
     import numbers
-    
+
     def isNumber(node):
         """
         Function to check that a node is a number.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a number
         @rtype bool
         """
-        return (
-            isinstance(node, ast.Constant) and
-            isinstance(node.value, numbers.Number)
-        )
-    
+        return isinstance(node, ast.Constant) and isinstance(node.value, numbers.Number)
+
     def isString(node):
         """
         Function to check that a node is a string.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a string
         @rtype bool
         """
-        return (
-            isinstance(node, ast.Constant) and
-            isinstance(node.value, str)
-        )
-    
+        return isinstance(node, ast.Constant) and isinstance(node.value, str)
+
     def isBytes(node):
         """
         Function to check that a node is a bytes.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a bytes
         @rtype bool
         """
-        return (
-            isinstance(node, ast.Constant) and
-            isinstance(node.value, bytes)
-        )
-    
+        return isinstance(node, ast.Constant) and isinstance(node.value, bytes)
+
     def isBaseString(node):
         """
         Function to check that a node is a bytes or string.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a bytes or string
         @rtype bool
         """
-        return (
-            isinstance(node, ast.Constant) and
-            isinstance(node.value, (bytes, str))
-        )
-    
+        return isinstance(node, ast.Constant) and isinstance(node.value, (bytes, str))
+
     def isNameConstant(node):
         """
         Function to check that a node is a name constant.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a name constant
         @rtype bool
         """
-        return (
-            isinstance(node, ast.Constant) and
-            not isinstance(node.value, (bytes, str, numbers.Number))
+        return isinstance(node, ast.Constant) and not isinstance(
+            node.value, (bytes, str, numbers.Number)
         )
-    
+
     def getValue(node):
         """
         Function to extract the value of a node.
-        
+
         @param node reference to the node to extract the value from
         @type ast.Constant
         @return value of the node
@@ -98,89 +85,87 @@
         """
         if not isinstance(node, ast.Constant):
             raise TypeError("Illegal node type passed.")
-        
+
         return node.value
 
 else:
     # functions for Python < 3.8
-    
+
     def isNumber(node):
         """
         Function to check that a node is a number.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a number
         @rtype bool
         """
         return isinstance(node, ast.Num)
-    
+
     def isString(node):
         """
         Function to check that a node is a string.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a string
         @rtype bool
         """
         return isinstance(node, ast.Str)
-    
+
     def isBytes(node):
         """
         Function to check that a node is a bytes.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a bytes
         @rtype bool
         """
         return isinstance(node, ast.Bytes)
-    
+
     def isBaseString(node):
         """
         Function to check that a node is a bytes or string.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a bytes or string
         @rtype bool
         """
         return isinstance(node, (ast.Str, ast.Bytes))
-    
+
     def isNameConstant(node):
         """
         Function to check that a node is a name constant.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating a name constant
         @rtype bool
         """
         return isinstance(node, ast.NameConstant)
-    
+
     def getValue(node):
         """
         Function to extract the value of a node.
-        
+
         @param node reference to the node to extract the value from
         @type one of ast.Num, ast.Str, ast.Bytes or ast.NameConstant
         @return value of the node
         @rtype one of str, bytes, int
         @exception TypeError raised to indicate an unsupported type
         """
-        if not isinstance(
-            node, (ast.Num, ast.Str, ast.Bytes, ast.NameConstant)
-        ):
+        if not isinstance(node, (ast.Num, ast.Str, ast.Bytes, ast.NameConstant)):
             raise TypeError("Illegal node type passed.")
-        
+
         if isinstance(node, ast.Num):
             return node.n
-        
+
         elif isinstance(node, (ast.Str, ast.Bytes)):
             return node.s
-        
+
         elif isinstance(node, ast.NameConstant):
             return node.value
-        
+
         return None
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,64 +11,62 @@
 from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
-from .Ui_CodeStyleAddBuiltinIgnoreDialog import (
-    Ui_CodeStyleAddBuiltinIgnoreDialog
-)
+from .Ui_CodeStyleAddBuiltinIgnoreDialog import Ui_CodeStyleAddBuiltinIgnoreDialog
 
 
-class CodeStyleAddBuiltinIgnoreDialog(QDialog,
-                                      Ui_CodeStyleAddBuiltinIgnoreDialog):
+class CodeStyleAddBuiltinIgnoreDialog(QDialog, Ui_CodeStyleAddBuiltinIgnoreDialog):
     """
     Class implementing a dialog to enter the data for a built-in assignment to
     be ignored.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__updateOkButton
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOkButton(self):
         """
         Private slot to set the state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.leftEdit.text()) and
-            bool(self.rightEdit.text()))
-    
+            bool(self.leftEdit.text()) and bool(self.rightEdit.text())
+        )
+
     @pyqtSlot(str)
     def on_leftEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the text of the left side edit.
-        
+
         @param txt text of the line edit
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_rightEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the text of the right side edit.
-        
+
         @param txt text of the line edit
         @type str
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the left and right hand side of the assignment
         @rtype tuple of two str
         """
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,7 +31,7 @@
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     return codeStyleCheck
@@ -40,7 +40,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     return codeStyleBatchCheck
@@ -50,21 +50,22 @@
     """
     Class implementing a special report to be used with our dialog.
     """
+
     def __init__(self, options):
         """
         Constructor
-        
+
         @param options options for the report (optparse.Values)
         """
         super().__init__(options)
-        
+
         self.__repeat = options.repeat
         self.errors = []
-    
+
     def error_args(self, line_number, offset, code, check, *args):
         """
         Public method to collect the error messages.
-        
+
         @param line_number line number of the issue (integer)
         @param offset position within line of the issue (integer)
         @param code message code (string)
@@ -72,8 +73,7 @@
         @param args arguments for the message (list)
         @return error code (string)
         """
-        code = super().error_args(
-            line_number, offset, code, check, *args)
+        code = super().error_args(line_number, offset, code, check, *args)
         if code and (self.counters[code] == 1 or self.__repeat):
             self.errors.append(
                 {
@@ -91,7 +91,7 @@
     """
     Function to extract flags starting and ending with '__' from a line
     comment.
-    
+
     @param line line to extract flags from (string)
     @param startComment string identifying the start of the comment (string)
     @param endComment string identifying the end of a comment (string)
@@ -99,29 +99,32 @@
     @return list containing the extracted flags (list of strings)
     """
     flags = []
-    
-    if not flagsLine or (
-       flagsLine and line.strip().startswith(startComment)):
+
+    if not flagsLine or (flagsLine and line.strip().startswith(startComment)):
         pos = line.rfind(startComment)
         if pos >= 0:
-            comment = line[pos + len(startComment):].strip()
+            comment = line[pos + len(startComment) :].strip()
             if endComment:
                 endPos = line.rfind(endComment)
                 if endPos >= 0:
                     comment = comment[:endPos]
-            flags = [f.strip() for f in comment.split()
-                     if (f.startswith("__") and f.endswith("__"))]
-            flags += [f.strip().lower() for f in comment.split()
-                      if f in ("noqa", "NOQA",
-                               "nosec", "NOSEC",
-                               "secok", "SECOK")]
+            flags = [
+                f.strip()
+                for f in comment.split()
+                if (f.startswith("__") and f.endswith("__"))
+            ]
+            flags += [
+                f.strip().lower()
+                for f in comment.split()
+                if f in ("noqa", "NOQA", "nosec", "NOSEC", "secok", "SECOK")
+            ]
     return flags
 
 
 def ignoreCode(code, lineFlags):
     """
     Function to check, if the given code should be ignored as per line flags.
-    
+
     @param code error code to be checked
     @type str
     @param lineFlags list of line flags to check against
@@ -130,29 +133,29 @@
     @rtype bool
     """
     if lineFlags:
-        
+
         if (
-            "__IGNORE_WARNING__" in lineFlags or
-            "noqa" in lineFlags or
-            "nosec" in lineFlags
+            "__IGNORE_WARNING__" in lineFlags
+            or "noqa" in lineFlags
+            or "nosec" in lineFlags
         ):
             # ignore all warning codes
             return True
-        
+
         for flag in lineFlags:
             # check individual warning code
             if flag.startswith("__IGNORE_WARNING_"):
                 ignoredCode = flag[2:-2].rsplit("_", 1)[-1]
                 if code.startswith(ignoredCode):
                     return True
-    
+
     return False
 
 
 def securityOk(code, lineFlags):
     """
     Function to check, if the given code is an acknowledged security report.
-    
+
     @param code error code to be checked
     @type str
     @param lineFlags list of line flags to check against
@@ -162,14 +165,14 @@
     """
     if lineFlags:
         return "secok" in lineFlags
-    
+
     return False
 
 
 def codeStyleCheck(filename, source, args):
     """
     Do the code style check and/or fix found errors.
-    
+
     @param filename source filename
     @type str
     @param source string containing the code to check
@@ -194,7 +197,7 @@
 def codeStyleBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check code style for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for codeStyleCheck
     @type list
     @param send reference to send function
@@ -228,9 +231,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -240,7 +242,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -252,18 +254,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList.pop(0))
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -272,11 +274,11 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the style check.
-    
+
     @param inputQueue input queue (multiprocessing.Queue)
     @param outputQueue output queue (multiprocessing.Queue)
     """
-    for filename, source, args in iter(inputQueue.get, 'STOP'):
+    for filename, source, args in iter(inputQueue.get, "STOP"):
         result = __checkCodeStyle(filename, source, args)
         outputQueue.put((filename, result))
 
@@ -284,7 +286,7 @@
 def __checkSyntax(filename, source):
     """
     Private module function to perform a syntax check.
-    
+
     @param filename source filename
     @type str
     @param source string containing the code to check
@@ -295,13 +297,13 @@
     @rtype tuple of (dict, dict, None) or tuple of (None, None, ast.Module)
     """
     src = "".join(source)
-    
+
     try:
         tree = (
-            ast.parse(src, filename, 'exec', type_comments=True)
+            ast.parse(src, filename, "exec", type_comments=True)
             # need the 'type_comments' parameter to include type annotations
-            if sys.version_info >= (3, 8) else
-            ast.parse(src, filename, 'exec')
+            if sys.version_info >= (3, 8)
+            else ast.parse(src, filename, "exec")
         )
         return None, None, tree
     except (SyntaxError, TypeError):
@@ -319,10 +321,11 @@
                 "offset": offset[1],
                 "code": "E901",
                 "args": [exc_type.__name__, exc.args[0]],
-            }, {
+            },
+            {
                 "E901": 1,
             },
-            None
+            None,
         )
 
 
@@ -330,7 +333,7 @@
     """
     Private module function to perform the code style check and/or fix
     found errors.
-    
+
     @param filename source filename
     @type str
     @param source string containing the code to check
@@ -359,44 +362,69 @@
         </ul>
     @rtype tuple of (dict, list of dict)
     """
-    (excludeMessages, includeMessages, repeatMessages, fixCodes, noFixCodes,
-     fixIssues, maxLineLength, maxDocLineLength, blankLines, hangClosing,
-     docType, codeComplexityArgs, miscellaneousArgs, annotationArgs,
-     securityArgs, importsArgs, errors, eol, encoding, backup) = args
-    
+    (
+        excludeMessages,
+        includeMessages,
+        repeatMessages,
+        fixCodes,
+        noFixCodes,
+        fixIssues,
+        maxLineLength,
+        maxDocLineLength,
+        blankLines,
+        hangClosing,
+        docType,
+        codeComplexityArgs,
+        miscellaneousArgs,
+        annotationArgs,
+        securityArgs,
+        importsArgs,
+        errors,
+        eol,
+        encoding,
+        backup,
+    ) = args
+
     stats = {}
 
     if fixIssues:
         from CodeStyleFixer import CodeStyleFixer
+
         fixer = CodeStyleFixer(
-            filename, source, fixCodes, noFixCodes,
-            maxLineLength, blankLines, True, eol, backup)
+            filename,
+            source,
+            fixCodes,
+            noFixCodes,
+            maxLineLength,
+            blankLines,
+            True,
+            eol,
+            backup,
+        )
         # always fix in place
     else:
         fixer = None
-    
+
     if not errors:
         if includeMessages:
-            select = [s.strip() for s in
-                      includeMessages.split(',') if s.strip()]
+            select = [s.strip() for s in includeMessages.split(",") if s.strip()]
         else:
             select = []
         if excludeMessages:
-            ignore = [i.strip() for i in
-                      excludeMessages.split(',') if i.strip()]
+            ignore = [i.strip() for i in excludeMessages.split(",") if i.strip()]
         else:
             ignore = []
-        
+
         syntaxError, syntaxStats, tree = __checkSyntax(filename, source)
-        
+
         # perform the checks only, if syntax is ok and AST tree was generated
         if tree:
             # check coding style
             pycodestyle.BLANK_LINES_CONFIG = {
                 # Top level class and function.
-                'top_level': blankLines[0],
+                "top_level": blankLines[0],
                 # Methods and nested class and function.
-                'method': blankLines[1],
+                "method": blankLines[1],
             }
             styleGuide = pycodestyle.StyleGuide(
                 reporter=CodeStyleCheckerReport,
@@ -410,76 +438,101 @@
             report = styleGuide.check_files([filename])
             stats.update(report.counters)
             errors = report.errors
-            
+
             # check documentation style
             docStyleChecker = DocStyleChecker(
-                source, filename, select, ignore, [], repeatMessages,
-                maxLineLength=maxDocLineLength, docType=docType)
+                source,
+                filename,
+                select,
+                ignore,
+                [],
+                repeatMessages,
+                maxLineLength=maxDocLineLength,
+                docType=docType,
+            )
             docStyleChecker.run()
             stats.update(docStyleChecker.counters)
             errors += docStyleChecker.errors
-            
+
             # miscellaneous additional checks
             miscellaneousChecker = MiscellaneousChecker(
-                source, filename, tree, select, ignore, [], repeatMessages,
-                miscellaneousArgs)
+                source,
+                filename,
+                tree,
+                select,
+                ignore,
+                [],
+                repeatMessages,
+                miscellaneousArgs,
+            )
             miscellaneousChecker.run()
             stats.update(miscellaneousChecker.counters)
             errors += miscellaneousChecker.errors
-            
+
             # check code complexity
             complexityChecker = ComplexityChecker(
-                source, filename, tree, select, ignore, codeComplexityArgs)
+                source, filename, tree, select, ignore, codeComplexityArgs
+            )
             complexityChecker.run()
             stats.update(complexityChecker.counters)
             errors += complexityChecker.errors
-            
+
             # check function annotations
             if sys.version_info >= (3, 8, 0):
                 # annotations with type comments are supported from
                 # Python 3.8 on
                 from Annotations.AnnotationsChecker import AnnotationsChecker
+
                 annotationsChecker = AnnotationsChecker(
-                    source, filename, tree, select, ignore, [], repeatMessages,
-                    annotationArgs)
+                    source,
+                    filename,
+                    tree,
+                    select,
+                    ignore,
+                    [],
+                    repeatMessages,
+                    annotationArgs,
+                )
                 annotationsChecker.run()
                 stats.update(annotationsChecker.counters)
                 errors += annotationsChecker.errors
-            
+
             # check for security issues
             securityChecker = SecurityChecker(
-                source, filename, tree, select, ignore, [], repeatMessages,
-                securityArgs)
+                source, filename, tree, select, ignore, [], repeatMessages, securityArgs
+            )
             securityChecker.run()
             stats.update(securityChecker.counters)
             errors += securityChecker.errors
-            
+
             # check for pathlib usage
             pathlibChecker = PathlibChecker(
-                source, filename, tree, select, ignore, [], repeatMessages)
+                source, filename, tree, select, ignore, [], repeatMessages
+            )
             pathlibChecker.run()
             stats.update(pathlibChecker.counters)
             errors += pathlibChecker.errors
-            
+
             # check for code simplifications
             simplifyChecker = SimplifyChecker(
-                source, filename, tree, select, ignore, [], repeatMessages)
+                source, filename, tree, select, ignore, [], repeatMessages
+            )
             simplifyChecker.run()
             stats.update(simplifyChecker.counters)
             errors += simplifyChecker.errors
-            
+
             # check import statements
             importsChecker = ImportsChecker(
-                source, filename, tree, select, ignore, [], repeatMessages,
-                importsArgs)
+                source, filename, tree, select, ignore, [], repeatMessages, importsArgs
+            )
             importsChecker.run()
             stats.update(importsChecker.counters)
             errors += importsChecker.errors
-        
+
         elif syntaxError:
             errors = [syntaxError]
             stats.update(syntaxStats)
-    
+
     errorsDict = {}
     for error in errors:
         if error["line"] > len(source):
@@ -492,62 +545,72 @@
     for lineno, errorsList in errorsDict.items():
         errorsList.sort(key=lambda x: x[0], reverse=True)
         for _, error in errorsList:
-            error.update({
-                "ignored": False,
-                "fixed": False,
-                "autofixing": False,
-                "fixcode": "",
-                "fixargs": [],
-                "securityOk": False,
-            })
-            
+            error.update(
+                {
+                    "ignored": False,
+                    "fixed": False,
+                    "autofixing": False,
+                    "fixcode": "",
+                    "fixargs": [],
+                    "securityOk": False,
+                }
+            )
+
             if source:
                 code = error["code"]
                 lineFlags = extractLineFlags(source[lineno - 1].strip())
                 with contextlib.suppress(IndexError):
-                    lineFlags += extractLineFlags(source[lineno].strip(),
-                                                  flagsLine=True)
-                
+                    lineFlags += extractLineFlags(
+                        source[lineno].strip(), flagsLine=True
+                    )
+
                 if securityOk(code, lineFlags):
                     error["securityOk"] = True
-                
+
                 if ignoreCode(code, lineFlags):
                     error["ignored"] = True
                 else:
                     if fixer:
                         res, fixcode, fixargs, id_ = fixer.fixIssue(
-                            lineno, error["offset"], code)
+                            lineno, error["offset"], code
+                        )
                         if res == -1:
                             deferredFixes[id_] = error
                         else:
-                            error.update({
-                                "fixed": res == 1,
-                                "autofixing": True,
-                                "fixcode": fixcode,
-                                "fixargs": fixargs,
-                            })
-            
+                            error.update(
+                                {
+                                    "fixed": res == 1,
+                                    "autofixing": True,
+                                    "fixcode": fixcode,
+                                    "fixargs": fixargs,
+                                }
+                            )
+
             results.append(error)
-    
+
     if fixer:
         deferredResults = fixer.finalize()
         for id_ in deferredResults:
             fixed, fixcode, fixargs = deferredResults[id_]
             error = deferredFixes[id_]
-            error.update({
-                "ignored": False,
-                "fixed": fixed == 1,
-                "autofixing": True,
-                "fixcode": fixcode,
-                "fixargs": fixargs,
-            })
+            error.update(
+                {
+                    "ignored": False,
+                    "fixed": fixed == 1,
+                    "autofixing": True,
+                    "fixcode": fixcode,
+                    "fixargs": fixargs,
+                }
+            )
 
         saveError = fixer.saveFile(encoding)
         if saveError:
             for error in results:
-                error.update({
-                    "fixcode": saveError[0],
-                    "fixargs": saveError[1],
-                })
+                error.update(
+                    {
+                        "fixcode": saveError[0],
+                        "fixargs": saveError[1],
+                    }
+                )
 
     return stats, results
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,8 +17,14 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QCoreApplication
 from PyQt6.QtGui import QIcon
 from PyQt6.QtWidgets import (
-    QDialog, QTreeWidgetItem, QAbstractButton, QDialogButtonBox, QApplication,
-    QListWidgetItem, QInputDialog, QLineEdit
+    QDialog,
+    QTreeWidgetItem,
+    QAbstractButton,
+    QDialogButtonBox,
+    QApplication,
+    QListWidgetItem,
+    QInputDialog,
+    QLineEdit,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -32,18 +38,15 @@
 from . import pycodestyle
 from . import CodeStyleCheckerUtilities
 
-from .Miscellaneous.MiscellaneousDefaults import (
-    MiscellaneousCheckerDefaultArgs
-)
-from .Annotations.AnnotationsCheckerDefaults import (
-    AnnotationsCheckerDefaultArgs
-)
+from .Miscellaneous.MiscellaneousDefaults import MiscellaneousCheckerDefaultArgs
+from .Annotations.AnnotationsCheckerDefaults import AnnotationsCheckerDefaultArgs
 
 
 class CodeStyleCheckerDialog(QDialog, Ui_CodeStyleCheckerDialog):
     """
     Class implementing a dialog to show the results of the code style check.
     """
+
     filenameRole = Qt.ItemDataRole.UserRole + 1
     lineRole = Qt.ItemDataRole.UserRole + 2
     positionRole = Qt.ItemDataRole.UserRole + 3
@@ -52,63 +55,56 @@
     codeRole = Qt.ItemDataRole.UserRole + 6
     ignoredRole = Qt.ItemDataRole.UserRole + 7
     argsRole = Qt.ItemDataRole.UserRole + 8
-    
+
     availableFutures = [
-        'division', 'absolute_import', 'with_statement',
-        'print_function', 'unicode_literals', 'generator_stop',
-        'annotations']
-    
+        "division",
+        "absolute_import",
+        "with_statement",
+        "print_function",
+        "unicode_literals",
+        "generator_stop",
+        "annotations",
+    ]
+
     cryptoBitSelectionsDsaRsa = [
-        "512", "1024", "2048", "4096", "8192", "16384", "32786",
+        "512",
+        "1024",
+        "2048",
+        "4096",
+        "8192",
+        "16384",
+        "32786",
     ]
     cryptoBitSelectionsEc = [
-        "160", "224", "256", "384", "512",
+        "160",
+        "224",
+        "256",
+        "384",
+        "512",
     ]
-    
+
     checkCategories = {
-        "A": QCoreApplication.translate(
-            "CheckerCategories",
-            "Annotations"),
-        "C": QCoreApplication.translate(
-            "CheckerCategories",
-            "Code Complexity"),
-        "D": QCoreApplication.translate(
-            "CheckerCategories",
-            "Documentation"),
-        "E": QCoreApplication.translate(
-            "CheckerCategories",
-            "Errors"),
-        "I": QCoreApplication.translate(
-            "CheckerCategories",
-            "Imports"),
-        "M": QCoreApplication.translate(
-            "CheckerCategories",
-            "Miscellaneous"),
-        "N": QCoreApplication.translate(
-            "CheckerCategories",
-            "Naming"),
-        "P": QCoreApplication.translate(
-            "CheckerCategories",
-            "'pathlib' Usage"),
-        "S": QCoreApplication.translate(
-            "CheckerCategories",
-            "Security"),
-        "W": QCoreApplication.translate(
-            "CheckerCategories",
-            "Warnings"),
-        "Y": QCoreApplication.translate(
-            "CheckerCategories",
-            "Simplify Code"),
+        "A": QCoreApplication.translate("CheckerCategories", "Annotations"),
+        "C": QCoreApplication.translate("CheckerCategories", "Code Complexity"),
+        "D": QCoreApplication.translate("CheckerCategories", "Documentation"),
+        "E": QCoreApplication.translate("CheckerCategories", "Errors"),
+        "I": QCoreApplication.translate("CheckerCategories", "Imports"),
+        "M": QCoreApplication.translate("CheckerCategories", "Miscellaneous"),
+        "N": QCoreApplication.translate("CheckerCategories", "Naming"),
+        "P": QCoreApplication.translate("CheckerCategories", "'pathlib' Usage"),
+        "S": QCoreApplication.translate("CheckerCategories", "Security"),
+        "W": QCoreApplication.translate("CheckerCategories", "Warnings"),
+        "Y": QCoreApplication.translate("CheckerCategories", "Simplify Code"),
     }
-    
+
     noResults = 0
     noFiles = 1
     hasResults = 2
-    
+
     def __init__(self, styleCheckService, project=None, parent=None):
         """
         Constructor
-        
+
         @param styleCheckService reference to the service
         @type CodeStyleCheckService
         @param project reference to the project if called on project or project
@@ -120,76 +116,68 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__project = project
-        
+
         self.optionsTabWidget.setCurrentIndex(0)
-        
-        self.excludeMessagesSelectButton.setIcon(
-            UI.PixmapCache.getIcon("select"))
-        self.includeMessagesSelectButton.setIcon(
-            UI.PixmapCache.getIcon("select"))
-        self.fixIssuesSelectButton.setIcon(
-            UI.PixmapCache.getIcon("select"))
-        self.noFixIssuesSelectButton.setIcon(
-            UI.PixmapCache.getIcon("select"))
-        
+
+        self.excludeMessagesSelectButton.setIcon(UI.PixmapCache.getIcon("select"))
+        self.includeMessagesSelectButton.setIcon(UI.PixmapCache.getIcon("select"))
+        self.fixIssuesSelectButton.setIcon(UI.PixmapCache.getIcon("select"))
+        self.noFixIssuesSelectButton.setIcon(UI.PixmapCache.getIcon("select"))
+
         self.docTypeComboBox.addItem(self.tr("PEP-257"), "pep257")
         self.docTypeComboBox.addItem(self.tr("Eric"), "eric")
         self.docTypeComboBox.addItem(self.tr("Eric (Blacked)"), "eric_black")
-        
+
         for category, text in CodeStyleCheckerDialog.checkCategories.items():
             itm = QListWidgetItem(text, self.categoriesList)
             itm.setData(Qt.ItemDataRole.UserRole, category)
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             itm.setCheckState(Qt.CheckState.Unchecked)
-        
+
         for future in CodeStyleCheckerDialog.availableFutures:
             itm = QListWidgetItem(future, self.futuresList)
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             itm.setCheckState(Qt.CheckState.Unchecked)
-        
-        self.dsaHighRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
+
+        self.dsaHighRiskCombo.addItems(CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
         self.dsaMediumRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
-        self.rsaHighRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
+            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa
+        )
+        self.rsaHighRiskCombo.addItems(CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
         self.rsaMediumRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa)
-        self.ecHighRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsEc)
-        self.ecMediumRiskCombo.addItems(
-            CodeStyleCheckerDialog.cryptoBitSelectionsEc)
-        
+            CodeStyleCheckerDialog.cryptoBitSelectionsDsaRsa
+        )
+        self.ecHighRiskCombo.addItems(CodeStyleCheckerDialog.cryptoBitSelectionsEc)
+        self.ecMediumRiskCombo.addItems(CodeStyleCheckerDialog.cryptoBitSelectionsEc)
+
         self.statisticsButton.setEnabled(False)
         self.showButton.setEnabled(False)
         self.cancelButton.setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
-        self.resultList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.resultList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.addBuiltinButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.deleteBuiltinButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.addWhitelistButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.deleteWhitelistButton.setIcon(UI.PixmapCache.getIcon("minus"))
-        
+
         self.restartButton.setEnabled(False)
         self.fixButton.setEnabled(False)
-        
+
         self.checkProgress.setVisible(False)
         self.checkProgressLabel.setVisible(False)
         self.checkProgressLabel.setMaximumWidth(600)
-        
+
         self.styleCheckService = styleCheckService
         self.styleCheckService.styleChecked.connect(self.__processResult)
         self.styleCheckService.batchFinished.connect(self.__batchFinished)
         self.styleCheckService.error.connect(self.__processError)
         self.filename = None
-        
+
         self.results = CodeStyleCheckerDialog.noResults
         self.cancelled = False
         self.__lastFileItem = None
@@ -197,7 +185,7 @@
         self.__finished = True
         self.__errorItem = None
         self.__timenow = time.monotonic()
-        
+
         self.__fileOrFileList = ""
         self.__forProject = False
         self.__data = {}
@@ -205,16 +193,16 @@
         self.__onlyFixes = {}
         self.__noFixCodesList = []
         self.__detectedCodes = []
-        
+
         self.on_loadDefaultButton_clicked()
-        
+
         self.mainWidget.setCurrentWidget(self.configureTab)
         self.optionsTabWidget.setCurrentWidget(self.globalOptionsTab)
-    
+
     def __defaultStatistics(self):
         """
         Private method to return the default statistics entry.
-        
+
         @return dictionary with default statistics entry
         @rtype dict
         """
@@ -222,41 +210,39 @@
             "total": 0,
             "ignored": 0,
         }
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
-        self.resultList.sortItems(self.resultList.sortColumn(),
-                                  self.resultList.header().sortIndicatorOrder()
-                                  )
-    
+        self.resultList.sortItems(
+            self.resultList.sortColumn(), self.resultList.header().sortIndicatorOrder()
+        )
+
     def __createErrorItem(self, filename, message):
         """
         Private slot to create a new error item in the result list.
-        
+
         @param filename name of the file
         @type str
         @param message error message
         @type str
         """
         if self.__errorItem is None:
-            self.__errorItem = QTreeWidgetItem(self.resultList, [
-                self.tr("Errors")])
+            self.__errorItem = QTreeWidgetItem(self.resultList, [self.tr("Errors")])
             self.__errorItem.setExpanded(True)
             self.__errorItem.setForeground(0, Qt.GlobalColor.red)
-        
-        msg = "{0} ({1})".format(self.__project.getRelativePath(filename),
-                                 message)
+
+        msg = "{0} ({1})".format(self.__project.getRelativePath(filename), message)
         if not self.resultList.findItems(msg, Qt.MatchFlag.MatchExactly):
             itm = QTreeWidgetItem(self.__errorItem, [msg])
             itm.setForeground(0, Qt.GlobalColor.red)
             itm.setFirstColumnSpanned(True)
-    
+
     def __createFileErrorItem(self, filename, message):
         """
         Private method to create an error entry for a given file.
-        
+
         @param filename file name of the file
         @type str
         @param message error message text
@@ -274,11 +260,11 @@
             "ignored": False,
         }
         self.__createResultItem(filename, result)
-    
+
     def __createResultItem(self, filename, result):
         """
         Private method to create an entry in the result list.
-        
+
         @param filename file name of the file
         @type str
         @param result dictionary containing check result data
@@ -287,47 +273,44 @@
         @rtype QTreeWidgetItem
         """
         from .CodeStyleFixer import FixableCodeStyleIssues
-        
+
         if self.__lastFileItem is None:
             # It's a new file
-            self.__lastFileItem = QTreeWidgetItem(self.resultList, [
-                self.__project.getRelativePath(filename)])
+            self.__lastFileItem = QTreeWidgetItem(
+                self.resultList, [self.__project.getRelativePath(filename)]
+            )
             self.__lastFileItem.setFirstColumnSpanned(True)
             self.__lastFileItem.setExpanded(True)
             self.__lastFileItem.setData(0, self.filenameRole, filename)
-        
+
         msgCode = result["code"].split(".", 1)[0]
         self.__detectedCodes.append(msgCode)
-        
+
         fixable = False
         itm = QTreeWidgetItem(
-            self.__lastFileItem, [
-                "{0:6}".format(result["line"]),
-                msgCode,
-                result["display"]
-            ]
+            self.__lastFileItem,
+            ["{0:6}".format(result["line"]), msgCode, result["display"]],
         )
-        
-        CodeStyleCheckerUtilities.setItemIcon(
-            itm, 1, msgCode, result.get("severity"))
-        
+
+        CodeStyleCheckerUtilities.setItemIcon(itm, 1, msgCode, result.get("severity"))
+
         if result["fixed"]:
             itm.setIcon(0, UI.PixmapCache.getIcon("issueFixed"))
         elif (
-            msgCode in FixableCodeStyleIssues and
-            not result["autofixing"] and
-            msgCode not in self.__noFixCodesList
+            msgCode in FixableCodeStyleIssues
+            and not result["autofixing"]
+            and msgCode not in self.__noFixCodesList
         ):
             itm.setIcon(0, UI.PixmapCache.getIcon("issueFixable"))
             fixable = True
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignVCenter)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignVCenter)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignVCenter)
-        
+
         itm.setData(0, self.filenameRole, filename)
         itm.setData(0, self.lineRole, int(result["line"]))
         itm.setData(0, self.positionRole, int(result["offset"]))
@@ -336,20 +319,20 @@
         itm.setData(0, self.codeRole, msgCode)
         itm.setData(0, self.ignoredRole, result["ignored"])
         itm.setData(0, self.argsRole, result["args"])
-        
+
         if result["ignored"]:
             font = itm.font(0)
             font.setItalic(True)
             for col in range(itm.columnCount()):
                 itm.setFont(col, font)
-        
+
         return itm
-    
+
     def __modifyFixedResultItem(self, itm, result):
         """
         Private method to modify a result list entry to show its
         positive fixed state.
-        
+
         @param itm reference to the item to modify
         @type QTreeWidgetItem
         @param result dictionary containing check result data
@@ -358,16 +341,16 @@
         if result["fixed"]:
             itm.setText(2, result["display"])
             itm.setIcon(0, UI.PixmapCache.getIcon("issueFixed"))
-            
+
             itm.setData(0, self.messageRole, result["display"])
         else:
             itm.setIcon(0, QIcon())
         itm.setData(0, self.fixableRole, False)
-    
+
     def __updateStatistics(self, statistics, fixer, ignoredErrors, securityOk):
         """
         Private method to update the collected statistics.
-        
+
         @param statistics dictionary of statistical data with
             message code as key and message count as value
         @type dict
@@ -388,16 +371,16 @@
                 self.__statistics[key]["ignored"] += ignoredErrors[key]
         self.__statistics["_IssuesFixed"] += fixer
         self.__statistics["_SecurityOK"] += securityOk
-    
+
     def __updateFixerStatistics(self, fixer):
         """
         Private method to update the collected fixer related statistics.
-        
+
         @param fixer reference to the code style fixer
         @type CodeStyleFixer
         """
         self.__statistics["_IssuesFixed"] += fixer
-    
+
     def __resetStatistics(self):
         """
         Private slot to reset the statistics data.
@@ -407,11 +390,11 @@
         self.__statistics["_FilesIssues"] = 0
         self.__statistics["_IssuesFixed"] = 0
         self.__statistics["_SecurityOK"] = 0
-    
+
     def __getBanRelativeImportsValue(self):
         """
         Private method to get the value corresponding the selected button.
-        
+
         @return value for the BanRelativeImports argument
         @rtype str
         """
@@ -421,12 +404,12 @@
             return "true"
         else:
             return ""
-    
+
     def __setBanRelativeImports(self, value):
         """
         Private method to set the button according to the ban relative imports
         setting.
-        
+
         @param value value of the ban relative imports setting
         @type str
         """
@@ -436,11 +419,11 @@
             self.banAllButton.setChecked(True)
         else:
             self.allowAllButton.setChecked(True)
-    
+
     def prepare(self, fileList, project):
         """
         Public method to prepare the dialog with a list of filenames.
-        
+
         @param fileList list of filenames
         @type list of str
         @param project reference to the project object
@@ -449,18 +432,13 @@
         self.__fileOrFileList = fileList[:]
         self.__project = project
         self.__forProject = True
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
         self.cancelButton.setEnabled(False)
-        
+
         self.__data = self.__project.getData("CHECKERSPARMS", "Pep8Checker")
-        if (
-            self.__data is None or
-            len(self.__data) < 6
-        ):
+        if self.__data is None or len(self.__data) < 6:
             # initialize the data structure
             self.__data = {
                 "ExcludeFiles": "",
@@ -472,7 +450,8 @@
             }
         if "EnabledCheckerCategories" not in self.__data:
             self.__data["EnabledCheckerCategories"] = ",".join(
-                CodeStyleCheckerDialog.checkCategories.keys())
+                CodeStyleCheckerDialog.checkCategories.keys()
+            )
         if "MaxLineLength" not in self.__data:
             self.__data["MaxLineLength"] = 88
             # better code formatting than pycodestyle.MAX_LINE_LENGTH
@@ -497,95 +476,101 @@
         if "LineComplexityScore" not in self.__data:
             self.__data["LineComplexityScore"] = 10
         if "ValidEncodings" not in self.__data:
-            self.__data["ValidEncodings"] = (
-                MiscellaneousCheckerDefaultArgs["CodingChecker"]
-            )
+            self.__data["ValidEncodings"] = MiscellaneousCheckerDefaultArgs[
+                "CodingChecker"
+            ]
         if (
-            "CopyrightMinFileSize" not in self.__data or
-            "CopyrightAuthor" not in self.__data
+            "CopyrightMinFileSize" not in self.__data
+            or "CopyrightAuthor" not in self.__data
         ):
-            self.__data["CopyrightMinFileSize"] = (
-                MiscellaneousCheckerDefaultArgs[
-                    "CopyrightChecker"]["MinFilesize"]
-            )
-            self.__data["CopyrightAuthor"] = (
-                MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"]
-            )
+            self.__data["CopyrightMinFileSize"] = MiscellaneousCheckerDefaultArgs[
+                "CopyrightChecker"
+            ]["MinFilesize"]
+            self.__data["CopyrightAuthor"] = MiscellaneousCheckerDefaultArgs[
+                "CopyrightChecker"
+            ]["Author"]
         if "FutureChecker" not in self.__data:
             self.__data["FutureChecker"] = ""
         if "BuiltinsChecker" not in self.__data:
             self.__data["BuiltinsChecker"] = copy.deepcopy(
                 MiscellaneousCheckerDefaultArgs["BuiltinsChecker"]
             )
-        
+
         if "CommentedCodeChecker" not in self.__data:
             self.__data["CommentedCodeChecker"] = copy.deepcopy(
                 MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]
             )
         if "WhiteList" not in self.__data["CommentedCodeChecker"]:
-            self.__data["CommentedCodeChecker"]["WhiteList"] = (
-                MiscellaneousCheckerDefaultArgs[
-                    "CommentedCodeChecker"]["WhiteList"][:]
-            )
-        
+            self.__data["CommentedCodeChecker"][
+                "WhiteList"
+            ] = MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]["WhiteList"][:]
+
         if "AnnotationsChecker" not in self.__data:
             self.__data["AnnotationsChecker"] = copy.deepcopy(
-                AnnotationsCheckerDefaultArgs)
+                AnnotationsCheckerDefaultArgs
+            )
         else:
             # We are upgrading from an older data structure
             if "MaximumLength" not in self.__data["AnnotationsChecker"]:
                 # MaximumLength is the sentinel for the first extension
-                self.__data["AnnotationsChecker"].update({
-                    "MaximumLength":
-                        AnnotationsCheckerDefaultArgs["MaximumLength"],
-                    "SuppressNoneReturning":
-                        AnnotationsCheckerDefaultArgs["SuppressNoneReturning"],
-                    "SuppressDummyArgs":
-                        AnnotationsCheckerDefaultArgs["SuppressDummyArgs"],
-                    "AllowUntypedDefs":
-                        AnnotationsCheckerDefaultArgs["AllowUntypedDefs"],
-                    "AllowUntypedNested":
-                        AnnotationsCheckerDefaultArgs["AllowUntypedNested"],
-                    "MypyInitReturn":
-                        AnnotationsCheckerDefaultArgs["MypyInitReturn"],
-                    "DispatchDecorators":
-                        AnnotationsCheckerDefaultArgs["DispatchDecorators"],
-                    "OverloadDecorators":
-                        AnnotationsCheckerDefaultArgs["OverloadDecorators"],
-                })
-        
+                self.__data["AnnotationsChecker"].update(
+                    {
+                        "MaximumLength": AnnotationsCheckerDefaultArgs["MaximumLength"],
+                        "SuppressNoneReturning": AnnotationsCheckerDefaultArgs[
+                            "SuppressNoneReturning"
+                        ],
+                        "SuppressDummyArgs": AnnotationsCheckerDefaultArgs[
+                            "SuppressDummyArgs"
+                        ],
+                        "AllowUntypedDefs": AnnotationsCheckerDefaultArgs[
+                            "AllowUntypedDefs"
+                        ],
+                        "AllowUntypedNested": AnnotationsCheckerDefaultArgs[
+                            "AllowUntypedNested"
+                        ],
+                        "MypyInitReturn": AnnotationsCheckerDefaultArgs[
+                            "MypyInitReturn"
+                        ],
+                        "DispatchDecorators": AnnotationsCheckerDefaultArgs[
+                            "DispatchDecorators"
+                        ],
+                        "OverloadDecorators": AnnotationsCheckerDefaultArgs[
+                            "OverloadDecorators"
+                        ],
+                    }
+                )
+
         if "SecurityChecker" not in self.__data:
             from .Security.SecurityDefaults import SecurityDefaults
+
             self.__data["SecurityChecker"] = {
-                "HardcodedTmpDirectories":
-                    SecurityDefaults["hardcoded_tmp_directories"],
-                "InsecureHashes":
-                    SecurityDefaults["insecure_hashes"],
-                "InsecureSslProtocolVersions":
-                    SecurityDefaults["insecure_ssl_protocol_versions"],
-                "WeakKeySizeDsaHigh":
-                    str(SecurityDefaults["weak_key_size_dsa_high"]),
-                "WeakKeySizeDsaMedium":
-                    str(SecurityDefaults["weak_key_size_dsa_medium"]),
-                "WeakKeySizeRsaHigh":
-                    str(SecurityDefaults["weak_key_size_rsa_high"]),
-                "WeakKeySizeRsaMedium":
-                    str(SecurityDefaults["weak_key_size_rsa_medium"]),
-                "WeakKeySizeEcHigh":
-                    str(SecurityDefaults["weak_key_size_ec_high"]),
-                "WeakKeySizeEcMedium":
-                    str(SecurityDefaults["weak_key_size_ec_medium"]),
-                "CheckTypedException":
-                    SecurityDefaults["check_typed_exception"],
+                "HardcodedTmpDirectories": SecurityDefaults[
+                    "hardcoded_tmp_directories"
+                ],
+                "InsecureHashes": SecurityDefaults["insecure_hashes"],
+                "InsecureSslProtocolVersions": SecurityDefaults[
+                    "insecure_ssl_protocol_versions"
+                ],
+                "WeakKeySizeDsaHigh": str(SecurityDefaults["weak_key_size_dsa_high"]),
+                "WeakKeySizeDsaMedium": str(
+                    SecurityDefaults["weak_key_size_dsa_medium"]
+                ),
+                "WeakKeySizeRsaHigh": str(SecurityDefaults["weak_key_size_rsa_high"]),
+                "WeakKeySizeRsaMedium": str(
+                    SecurityDefaults["weak_key_size_rsa_medium"]
+                ),
+                "WeakKeySizeEcHigh": str(SecurityDefaults["weak_key_size_ec_high"]),
+                "WeakKeySizeEcMedium": str(SecurityDefaults["weak_key_size_ec_medium"]),
+                "CheckTypedException": SecurityDefaults["check_typed_exception"],
             }
-        
+
         if "ImportsChecker" not in self.__data:
             self.__data["ImportsChecker"] = {
                 "ApplicationPackageNames": [],
                 "BannedModules": [],
                 "BanRelativeImports": "",
             }
-        
+
         self.__initCategoriesList(self.__data["EnabledCheckerCategories"])
         self.excludeFilesEdit.setText(self.__data["ExcludeFiles"])
         self.excludeMessagesEdit.setText(self.__data["ExcludeMessages"])
@@ -601,70 +586,89 @@
         self.blankBeforeMethodSpinBox.setValue(self.__data["BlankLines"][1])
         self.hangClosingCheckBox.setChecked(self.__data["HangClosing"])
         self.docTypeComboBox.setCurrentIndex(
-            self.docTypeComboBox.findData(self.__data["DocstringType"]))
+            self.docTypeComboBox.findData(self.__data["DocstringType"])
+        )
         self.complexitySpinBox.setValue(self.__data["MaxCodeComplexity"])
         self.lineComplexitySpinBox.setValue(self.__data["LineComplexity"])
-        self.lineComplexityScoreSpinBox.setValue(
-            self.__data["LineComplexityScore"])
+        self.lineComplexityScoreSpinBox.setValue(self.__data["LineComplexityScore"])
         self.encodingsEdit.setText(self.__data["ValidEncodings"])
-        self.copyrightFileSizeSpinBox.setValue(
-            self.__data["CopyrightMinFileSize"])
+        self.copyrightFileSizeSpinBox.setValue(self.__data["CopyrightMinFileSize"])
         self.copyrightAuthorEdit.setText(self.__data["CopyrightAuthor"])
         self.__initFuturesList(self.__data["FutureChecker"])
         self.__initBuiltinsIgnoreList(self.__data["BuiltinsChecker"])
         self.aggressiveCheckBox.setChecked(
-            self.__data["CommentedCodeChecker"]["Aggressive"])
+            self.__data["CommentedCodeChecker"]["Aggressive"]
+        )
         self.__initCommentedCodeCheckerWhiteList(
-            self.__data["CommentedCodeChecker"]["WhiteList"])
-        
+            self.__data["CommentedCodeChecker"]["WhiteList"]
+        )
+
         # type annotations
         self.minAnnotationsCoverageSpinBox.setValue(
-            self.__data["AnnotationsChecker"]["MinimumCoverage"])
+            self.__data["AnnotationsChecker"]["MinimumCoverage"]
+        )
         self.maxAnnotationsComplexitySpinBox.setValue(
-            self.__data["AnnotationsChecker"]["MaximumComplexity"])
+            self.__data["AnnotationsChecker"]["MaximumComplexity"]
+        )
         self.maxAnnotationsLengthSpinBox.setValue(
-            self.__data["AnnotationsChecker"]["MaximumLength"])
+            self.__data["AnnotationsChecker"]["MaximumLength"]
+        )
         self.suppressNoneReturningCheckBox.setChecked(
-            self.__data["AnnotationsChecker"]["SuppressNoneReturning"])
+            self.__data["AnnotationsChecker"]["SuppressNoneReturning"]
+        )
         self.suppressDummyArgsCheckBox.setChecked(
-            self.__data["AnnotationsChecker"]["SuppressDummyArgs"])
+            self.__data["AnnotationsChecker"]["SuppressDummyArgs"]
+        )
         self.allowUntypedDefsCheckBox.setChecked(
-            self.__data["AnnotationsChecker"]["AllowUntypedDefs"])
+            self.__data["AnnotationsChecker"]["AllowUntypedDefs"]
+        )
         self.allowUntypedNestedCheckBox.setChecked(
-            self.__data["AnnotationsChecker"]["AllowUntypedNested"])
+            self.__data["AnnotationsChecker"]["AllowUntypedNested"]
+        )
         self.mypyInitReturnCheckBox.setChecked(
-            self.__data["AnnotationsChecker"]["MypyInitReturn"])
+            self.__data["AnnotationsChecker"]["MypyInitReturn"]
+        )
         self.dispatchDecoratorEdit.setText(
-            ", ".join(
-                self.__data["AnnotationsChecker"]["DispatchDecorators"]))
+            ", ".join(self.__data["AnnotationsChecker"]["DispatchDecorators"])
+        )
         self.overloadDecoratorEdit.setText(
-            ", ".join(
-                self.__data["AnnotationsChecker"]["OverloadDecorators"]))
-        
+            ", ".join(self.__data["AnnotationsChecker"]["OverloadDecorators"])
+        )
+
         # security
-        self.tmpDirectoriesEdit.setPlainText("\n".join(
-            self.__data["SecurityChecker"]["HardcodedTmpDirectories"]))
-        self.hashesEdit.setText(", ".join(
-            self.__data["SecurityChecker"]["InsecureHashes"]))
-        self.insecureSslProtocolsEdit.setPlainText("\n".join(
-            self.__data["SecurityChecker"]["InsecureSslProtocolVersions"]))
+        self.tmpDirectoriesEdit.setPlainText(
+            "\n".join(self.__data["SecurityChecker"]["HardcodedTmpDirectories"])
+        )
+        self.hashesEdit.setText(
+            ", ".join(self.__data["SecurityChecker"]["InsecureHashes"])
+        )
+        self.insecureSslProtocolsEdit.setPlainText(
+            "\n".join(self.__data["SecurityChecker"]["InsecureSslProtocolVersions"])
+        )
         self.dsaHighRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeDsaHigh"])
+            self.__data["SecurityChecker"]["WeakKeySizeDsaHigh"]
+        )
         self.dsaMediumRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeDsaMedium"])
+            self.__data["SecurityChecker"]["WeakKeySizeDsaMedium"]
+        )
         self.rsaHighRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeRsaHigh"])
+            self.__data["SecurityChecker"]["WeakKeySizeRsaHigh"]
+        )
         self.rsaMediumRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeRsaMedium"])
+            self.__data["SecurityChecker"]["WeakKeySizeRsaMedium"]
+        )
         self.ecHighRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeEcHigh"])
+            self.__data["SecurityChecker"]["WeakKeySizeEcHigh"]
+        )
         self.ecMediumRiskCombo.setCurrentText(
-            self.__data["SecurityChecker"]["WeakKeySizeEcMedium"])
+            self.__data["SecurityChecker"]["WeakKeySizeEcMedium"]
+        )
         self.typedExceptionsCheckBox.setChecked(
-            self.__data["SecurityChecker"]["CheckTypedException"])
-        
+            self.__data["SecurityChecker"]["CheckTypedException"]
+        )
+
         self.__cleanupData()
-    
+
     def __prepareProgress(self):
         """
         Private method to prepare the progress tab for the next run.
@@ -676,19 +680,21 @@
             self.checkProgress.setVisible(len(self.files) > 1)
             if len(self.files) > 1:
                 if self.__project:
-                    self.progressList.addItems([
-                        os.path.join("...", self.__project.getRelativePath(f))
-                        for f in self.files
-                    ])
+                    self.progressList.addItems(
+                        [
+                            os.path.join("...", self.__project.getRelativePath(f))
+                            for f in self.files
+                        ]
+                    )
                 else:
                     self.progressList.addItems(self.files)
-        
+
         QApplication.processEvents()
-    
+
     def start(self, fn, save=False, repeat=None):
         """
         Public slot to start the code style check.
-        
+
         @param fn file or list of files or directory to be checked
         @type str or list of str
         @param save flag indicating to save the given file/file list/directory
@@ -698,12 +704,11 @@
         """
         if self.__project is None:
             self.__project = ericApp().getObject("Project")
-        
+
         self.mainWidget.setCurrentWidget(self.progressTab)
-        
+
         self.cancelled = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
         self.cancelButton.setEnabled(True)
         self.cancelButton.setDefault(True)
         self.statisticsButton.setEnabled(False)
@@ -715,46 +720,44 @@
             self.repeatCheckBox.setChecked(repeat)
         self.checkProgress.setVisible(True)
         QApplication.processEvents()
-        
+
         if save:
             self.__fileOrFileList = fn
-        
+
         if isinstance(fn, list):
             self.files = fn[:]
         elif os.path.isdir(fn):
             self.files = []
             extensions = set(Preferences.getPython("Python3Extensions"))
             for ext in extensions:
-                self.files.extend(Utilities.direntries(
-                    fn, True, '*{0}'.format(ext), 0))
+                self.files.extend(Utilities.direntries(fn, True, "*{0}".format(ext), 0))
         else:
             self.files = [fn]
-        
+
         # filter the list depending on the filter string
         if self.files:
             filterString = self.excludeFilesEdit.text()
-            filterList = [f.strip() for f in filterString.split(",")
-                          if f.strip()]
+            filterList = [f.strip() for f in filterString.split(",") if f.strip()]
             for fileFilter in filterList:
                 self.files = [
-                    f for f in self.files
-                    if not fnmatch.fnmatch(f, fileFilter.strip())
+                    f for f in self.files if not fnmatch.fnmatch(f, fileFilter.strip())
                 ]
-        
+
         self.__errorItem = None
         self.__resetStatistics()
         self.__clearErrors(self.files)
         self.__cleanupData()
         self.__prepareProgress()
-        
+
         # disable updates of the list for speed
         self.resultList.setUpdatesEnabled(False)
         self.resultList.setSortingEnabled(False)
-        
+
         if len(self.files) > 0:
             self.securityNoteLabel.setVisible(
-                "S" in self.__getCategories(True, asList=True))
-            
+                "S" in self.__getCategories(True, asList=True)
+            )
+
             # extract the configuration values
             excludeMessages = self.__assembleExcludeMessages()
             includeMessages = self.includeMessagesEdit.text()
@@ -765,18 +768,15 @@
                 c.strip() for c in noFixCodes.split(",") if c.strip()
             ]
             fixIssues = self.fixIssuesCheckBox.isChecked() and repeatMessages
-            self.showIgnored = (
-                self.ignoredCheckBox.isChecked() and repeatMessages
-            )
+            self.showIgnored = self.ignoredCheckBox.isChecked() and repeatMessages
             maxLineLength = self.lineLengthSpinBox.value()
             maxDocLineLength = self.docLineLengthSpinBox.value()
             blankLines = (
                 self.blankBeforeTopLevelSpinBox.value(),
-                self.blankBeforeMethodSpinBox.value()
+                self.blankBeforeMethodSpinBox.value(),
             )
             hangClosing = self.hangClosingCheckBox.isChecked()
-            docType = self.docTypeComboBox.itemData(
-                self.docTypeComboBox.currentIndex())
+            docType = self.docTypeComboBox.itemData(self.docTypeComboBox.currentIndex())
             codeComplexityArgs = {
                 "McCabeComplexity": self.complexitySpinBox.value(),
                 "LineComplexity": self.lineComplexitySpinBox.value(),
@@ -793,83 +793,79 @@
                 "CommentedCodeChecker": {
                     "Aggressive": self.aggressiveCheckBox.isChecked(),
                     "WhiteList": self.__getCommentedCodeCheckerWhiteList(),
-                }
+                },
             }
-            
+
             annotationArgs = {
-                "MinimumCoverage":
-                    self.minAnnotationsCoverageSpinBox.value(),
-                "MaximumComplexity":
-                    self.maxAnnotationsComplexitySpinBox.value(),
-                "MaximumLength":
-                    self.maxAnnotationsLengthSpinBox.value(),
-                "SuppressNoneReturning":
-                    self.suppressNoneReturningCheckBox.isChecked(),
-                "SuppressDummyArgs":
-                    self.suppressDummyArgsCheckBox.isChecked(),
-                "AllowUntypedDefs":
-                    self.allowUntypedDefsCheckBox.isChecked(),
-                "AllowUntypedNested":
-                    self.allowUntypedNestedCheckBox.isChecked(),
-                "MypyInitReturn":
-                    self.mypyInitReturnCheckBox.isChecked(),
-                "DispatchDecorators":
-                    [d.strip()
-                     for d in self.dispatchDecoratorEdit.text().split(",")],
-                "OverloadDecorators":
-                    [d.strip()
-                     for d in self.overloadDecoratorEdit.text().split(",")],
+                "MinimumCoverage": self.minAnnotationsCoverageSpinBox.value(),
+                "MaximumComplexity": self.maxAnnotationsComplexitySpinBox.value(),
+                "MaximumLength": self.maxAnnotationsLengthSpinBox.value(),
+                "SuppressNoneReturning": self.suppressNoneReturningCheckBox.isChecked(),
+                "SuppressDummyArgs": self.suppressDummyArgsCheckBox.isChecked(),
+                "AllowUntypedDefs": self.allowUntypedDefsCheckBox.isChecked(),
+                "AllowUntypedNested": self.allowUntypedNestedCheckBox.isChecked(),
+                "MypyInitReturn": self.mypyInitReturnCheckBox.isChecked(),
+                "DispatchDecorators": [
+                    d.strip() for d in self.dispatchDecoratorEdit.text().split(",")
+                ],
+                "OverloadDecorators": [
+                    d.strip() for d in self.overloadDecoratorEdit.text().split(",")
+                ],
             }
-            
+
             securityArgs = {
                 "hardcoded_tmp_directories": [
                     t.strip()
                     for t in self.tmpDirectoriesEdit.toPlainText().splitlines()
                 ],
                 "insecure_hashes": [
-                    h.strip()
-                    for h in self.hashesEdit.text().split(",")
+                    h.strip() for h in self.hashesEdit.text().split(",")
                 ],
                 "insecure_ssl_protocol_versions": [
                     p.strip()
-                    for p in self.insecureSslProtocolsEdit.toPlainText()
-                    .splitlines()
+                    for p in self.insecureSslProtocolsEdit.toPlainText().splitlines()
                 ],
-                "weak_key_size_dsa_high":
-                    int(self.dsaHighRiskCombo.currentText()),
-                "weak_key_size_dsa_medium":
-                    int(self.dsaMediumRiskCombo.currentText()),
-                "weak_key_size_rsa_high":
-                    int(self.rsaHighRiskCombo.currentText()),
-                "weak_key_size_rsa_medium":
-                    int(self.rsaMediumRiskCombo.currentText()),
-                "weak_key_size_ec_high":
-                    int(self.ecHighRiskCombo.currentText()),
-                "weak_key_size_ec_medium":
-                    int(self.ecMediumRiskCombo.currentText()),
-                "check_typed_exception":
-                    self.typedExceptionsCheckBox.isChecked(),
+                "weak_key_size_dsa_high": int(self.dsaHighRiskCombo.currentText()),
+                "weak_key_size_dsa_medium": int(self.dsaMediumRiskCombo.currentText()),
+                "weak_key_size_rsa_high": int(self.rsaHighRiskCombo.currentText()),
+                "weak_key_size_rsa_medium": int(self.rsaMediumRiskCombo.currentText()),
+                "weak_key_size_ec_high": int(self.ecHighRiskCombo.currentText()),
+                "weak_key_size_ec_medium": int(self.ecMediumRiskCombo.currentText()),
+                "check_typed_exception": self.typedExceptionsCheckBox.isChecked(),
             }
-            
+
             importsArgs = {
-                "ApplicationPackageNames":
-                    sorted(self.appPackagesEdit.toPlainText().split()),
-                "BannedModules":
-                    sorted(self.bannedModulesEdit.toPlainText().split()),
+                "ApplicationPackageNames": sorted(
+                    self.appPackagesEdit.toPlainText().split()
+                ),
+                "BannedModules": sorted(self.bannedModulesEdit.toPlainText().split()),
                 "BanRelativeImports": self.__getBanRelativeImportsValue(),
             }
-            
-            self.__options = [excludeMessages, includeMessages, repeatMessages,
-                              fixCodes, noFixCodes, fixIssues, maxLineLength,
-                              maxDocLineLength, blankLines, hangClosing,
-                              docType, codeComplexityArgs, miscellaneousArgs,
-                              annotationArgs, securityArgs, importsArgs]
-            
+
+            self.__options = [
+                excludeMessages,
+                includeMessages,
+                repeatMessages,
+                fixCodes,
+                noFixCodes,
+                fixIssues,
+                maxLineLength,
+                maxDocLineLength,
+                blankLines,
+                hangClosing,
+                docType,
+                codeComplexityArgs,
+                miscellaneousArgs,
+                annotationArgs,
+                securityArgs,
+                importsArgs,
+            ]
+
             # now go through all the files
             self.progress = 0
             self.files.sort()
             self.__timenow = time.monotonic()
-            
+
             if len(self.files) == 1:
                 self.__batch = False
                 self.mainWidget.setCurrentWidget(self.resultsTab)
@@ -881,15 +877,15 @@
             self.results = CodeStyleCheckerDialog.noFiles
             self.__finished = False
             self.__finish()
-    
+
     def __modifyOptions(self, source):
         """
         Private method to modify the options based on eflag: entries.
-        
+
         This method looks for comment lines like '# eflag: noqa = M601'
         at the end of the source in order to extend the list of excluded
         messages for one file only.
-        
+
         @param source source text
         @type list of str or str
         @return list of checker options
@@ -904,13 +900,13 @@
             excludeMessages += flags["noqa"]
             options[0] = excludeMessages
         return options
-    
-    def check(self, codestring=''):
+
+    def check(self, codestring=""):
         """
         Public method to start a style check for one file.
-        
+
         The results are reported to the __processResult slot.
-        
+
         @param codestring optional sourcestring
         @type str
         """
@@ -920,7 +916,7 @@
             self.checkProgress.setValue(1)
             self.__finish()
             return
-        
+
         self.filename = self.files.pop(0)
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(self.filename)
@@ -929,16 +925,15 @@
         if self.cancelled:
             self.__resort()
             return
-        
+
         self.__lastFileItem = None
-        
+
         if codestring:
             source = codestring.splitlines(True)
             encoding = Utilities.get_coding(source)
         else:
             try:
-                source, encoding = Utilities.readEncodedFile(
-                    self.filename)
+                source, encoding = Utilities.readEncodedFile(self.filename)
                 source = source.splitlines(True)
             except (UnicodeError, OSError) as msg:
                 self.results = CodeStyleCheckerDialog.hasResults
@@ -947,79 +942,80 @@
                 # Continue with next file
                 self.check()
                 return
-        if encoding.endswith(
-                ('-selected', '-default', '-guessed', '-ignore')):
-            encoding = encoding.rsplit('-', 1)[0]
-        
+        if encoding.endswith(("-selected", "-default", "-guessed", "-ignore")):
+            encoding = encoding.rsplit("-", 1)[0]
+
         options = self.__modifyOptions(source)
-        
+
         errors = []
         self.__itms = []
         for error, itm in self.__onlyFixes.pop(self.filename, []):
             errors.append(error)
             self.__itms.append(itm)
-        
+
         eol = self.__getEol(self.filename)
         args = options + [
-            errors, eol, encoding, Preferences.getEditor("CreateBackupFile")
+            errors,
+            eol,
+            encoding,
+            Preferences.getEditor("CreateBackupFile"),
         ]
         self.__finished = False
-        self.styleCheckService.styleCheck(
-            None, self.filename, source, args)
-    
+        self.styleCheckService.styleCheck(None, self.filename, source, args)
+
     def checkBatch(self):
         """
         Public method to start a style check batch job.
-        
+
         The results are reported to the __processResult slot.
         """
         self.__lastFileItem = None
-        
+
         self.checkProgressLabel.setPath(self.tr("Preparing files..."))
-        
+
         argumentsList = []
         for progress, filename in enumerate(self.files, start=1):
             self.checkProgress.setValue(progress)
             if time.monotonic() - self.__timenow > 0.01:
                 QApplication.processEvents()
                 self.__timenow = time.monotonic()
-            
+
             try:
-                source, encoding = Utilities.readEncodedFile(
-                    filename)
+                source, encoding = Utilities.readEncodedFile(filename)
                 source = source.splitlines(True)
             except (UnicodeError, OSError) as msg:
                 self.results = CodeStyleCheckerDialog.hasResults
                 self.__createFileErrorItem(filename, str(msg))
                 continue
-            
-            if encoding.endswith(
-                    ('-selected', '-default', '-guessed', '-ignore')):
-                encoding = encoding.rsplit('-', 1)[0]
-            
+
+            if encoding.endswith(("-selected", "-default", "-guessed", "-ignore")):
+                encoding = encoding.rsplit("-", 1)[0]
+
             options = self.__modifyOptions(source)
-            
+
             errors = []
             self.__itms = []
             for error, itm in self.__onlyFixes.pop(filename, []):
                 errors.append(error)
                 self.__itms.append(itm)
-            
+
             eol = self.__getEol(filename)
             args = options + [
-                errors, eol, encoding,
-                Preferences.getEditor("CreateBackupFile")
+                errors,
+                eol,
+                encoding,
+                Preferences.getEditor("CreateBackupFile"),
             ]
             argumentsList.append((filename, source, args))
-        
+
         # reset the progress bar to the checked files
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(self.tr("Transferring data..."))
         QApplication.processEvents()
-        
+
         self.__finished = False
         self.styleCheckService.styleBatchCheck(argumentsList)
-    
+
     def __batchFinished(self):
         """
         Private slot handling the completion of a batch job.
@@ -1028,25 +1024,25 @@
         self.checkProgress.setMaximum(1)
         self.checkProgress.setValue(1)
         self.__finish()
-    
+
     def __processError(self, fn, msg):
         """
         Private slot to process an error indication from the service.
-        
+
         @param fn filename of the file
         @type str
         @param msg error message
         @type str
         """
         self.__createErrorItem(fn, msg)
-        
+
         if not self.__batch:
             self.check()
-    
+
     def __processResult(self, fn, codeStyleCheckerStats, fixes, results):
         """
         Private slot called after perfoming a style check on one file.
-        
+
         @param fn filename of the just checked file
         @type str
         @param codeStyleCheckerStats stats of style and name check
@@ -1058,12 +1054,12 @@
         """
         if self.__finished:
             return
-        
+
         # Check if it's the requested file, otherwise ignore signal if not
         # in batch mode
         if not self.__batch and fn != self.filename:
             return
-        
+
         fixed = None
         ignoredErrors = collections.defaultdict(int)
         securityOk = 0
@@ -1073,63 +1069,64 @@
             self.__updateFixerStatistics(fixes)
         else:
             self.__lastFileItem = None
-            
+
             for result in results:
                 if result["ignored"]:
                     ignoredErrors[result["code"]] += 1
                     if self.showIgnored:
-                        result["display"] = self.tr(
-                            "{0} (ignored)"
-                        ).format(result["display"])
+                        result["display"] = self.tr("{0} (ignored)").format(
+                            result["display"]
+                        )
                     else:
                         continue
-                
+
                 elif result["securityOk"]:
                     securityOk += 1
                     if result["code"].startswith("S"):
                         continue
-                
+
                 self.results = CodeStyleCheckerDialog.hasResults
                 self.__createResultItem(fn, result)
-            
+
             self.__updateStatistics(
-                codeStyleCheckerStats, fixes, ignoredErrors, securityOk)
-        
+                codeStyleCheckerStats, fixes, ignoredErrors, securityOk
+            )
+
         if fixed:
             vm = ericApp().getObject("ViewManager")
             editor = vm.getOpenEditor(fn)
             if editor:
                 editor.refresh()
-        
+
         self.progress += 1
         self.__updateProgress(fn)
-        
+
         if not self.__batch:
             self.check()
-    
+
     def __updateProgress(self, fn):
         """
         Private method to update the progress tab.
-        
+
         @param fn filename of the just checked file
         @type str
         """
         if self.__project:
             fn = os.path.join("...", self.__project.getRelativePath(fn))
-        
+
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(fn)
-        
+
         # remove file from the list of jobs to do
         fileItems = self.progressList.findItems(fn, Qt.MatchFlag.MatchExactly)
         if fileItems:
             row = self.progressList.row(fileItems[0])
             self.progressList.takeItem(row)
-        
+
         if time.monotonic() - self.__timenow > 0.01:
             QApplication.processEvents()
             self.__timenow = time.monotonic()
-    
+
     def __finish(self):
         """
         Private slot called when the code style check finished or the user
@@ -1137,26 +1134,28 @@
         """
         if not self.__finished:
             self.__finished = True
-            
+
             self.cancelled = True
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setDefault(True)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(
+                True
+            )
             self.cancelButton.setEnabled(False)
             self.statisticsButton.setEnabled(True)
             self.showButton.setEnabled(True)
             self.startButton.setEnabled(True)
             self.restartButton.setEnabled(True)
-            
+
             if self.results != CodeStyleCheckerDialog.hasResults:
                 if self.results == CodeStyleCheckerDialog.noResults:
-                    QTreeWidgetItem(
-                        self.resultList, [self.tr('No issues found.')])
+                    QTreeWidgetItem(self.resultList, [self.tr("No issues found.")])
                 else:
                     QTreeWidgetItem(
                         self.resultList,
-                        [self.tr('No files found (check your ignore list).')])
+                        [self.tr("No files found (check your ignore list).")],
+                    )
                 QApplication.processEvents()
                 self.showButton.setEnabled(False)
             else:
@@ -1164,26 +1163,26 @@
             for col in range(self.resultList.columnCount()):
                 self.resultList.resizeColumnToContents(col)
             self.resultList.header().setStretchLastSection(True)
-            
+
             if self.__detectedCodes:
                 self.filterComboBox.addItem("")
                 self.filterComboBox.addItems(sorted(set(self.__detectedCodes)))
                 self.filterComboBox.setEnabled(True)
                 self.filterButton.setEnabled(True)
-            
+
             self.checkProgress.setVisible(False)
             self.checkProgressLabel.setVisible(False)
-            
+
             self.__resort()
             self.resultList.setUpdatesEnabled(True)
             self.resultList.setSortingEnabled(True)
-            
+
             self.mainWidget.setCurrentWidget(self.resultsTab)
-    
+
     def __getEol(self, fn):
         """
         Private method to get the applicable eol string.
-        
+
         @param fn filename where to determine the line ending
         @type str
         @return eol string
@@ -1195,14 +1194,14 @@
             else Utilities.linesep()
         )
         return eol
-    
+
     @pyqtSlot()
     def on_startButton_clicked(self):
         """
         Private slot to start a code style check run.
         """
         self.__cleanupData()
-        
+
         if self.__forProject:
             data = {
                 "EnabledCheckerCategories": self.__getCategories(True),
@@ -1218,11 +1217,12 @@
                 "MaxDocLineLength": self.docLineLengthSpinBox.value(),
                 "BlankLines": (
                     self.blankBeforeTopLevelSpinBox.value(),
-                    self.blankBeforeMethodSpinBox.value()
+                    self.blankBeforeMethodSpinBox.value(),
                 ),
                 "HangClosing": self.hangClosingCheckBox.isChecked(),
                 "DocstringType": self.docTypeComboBox.itemData(
-                    self.docTypeComboBox.currentIndex()),
+                    self.docTypeComboBox.currentIndex()
+                ),
                 "MaxCodeComplexity": self.complexitySpinBox.value(),
                 "LineComplexity": self.lineComplexitySpinBox.value(),
                 "LineComplexityScore": self.lineComplexityScoreSpinBox.value(),
@@ -1236,77 +1236,61 @@
                     "WhiteList": self.__getCommentedCodeCheckerWhiteList(),
                 },
                 "AnnotationsChecker": {
-                    "MinimumCoverage":
-                        self.minAnnotationsCoverageSpinBox.value(),
-                    "MaximumComplexity":
-                        self.maxAnnotationsComplexitySpinBox.value(),
-                    "MaximumLength":
-                        self.maxAnnotationsLengthSpinBox.value(),
-                    "SuppressNoneReturning":
-                        self.suppressNoneReturningCheckBox.isChecked(),
-                    "SuppressDummyArgs":
-                        self.suppressDummyArgsCheckBox.isChecked(),
-                    "AllowUntypedDefs":
-                        self.allowUntypedDefsCheckBox.isChecked(),
-                    "AllowUntypedNested":
-                        self.allowUntypedNestedCheckBox.isChecked(),
-                    "MypyInitReturn":
-                        self.mypyInitReturnCheckBox.isChecked(),
-                    "DispatchDecorators":
-                        [d.strip()
-                         for d in self.dispatchDecoratorEdit.text().split(",")
-                         ],
-                    "OverloadDecorators":
-                        [d.strip()
-                         for d in self.overloadDecoratorEdit.text().split(",")
-                         ],
+                    "MinimumCoverage": self.minAnnotationsCoverageSpinBox.value(),
+                    "MaximumComplexity": self.maxAnnotationsComplexitySpinBox.value(),
+                    "MaximumLength": self.maxAnnotationsLengthSpinBox.value(),
+                    "SuppressNoneReturning": (
+                        self.suppressNoneReturningCheckBox.isChecked()
+                    ),
+                    "SuppressDummyArgs": self.suppressDummyArgsCheckBox.isChecked(),
+                    "AllowUntypedDefs": self.allowUntypedDefsCheckBox.isChecked(),
+                    "AllowUntypedNested": self.allowUntypedNestedCheckBox.isChecked(),
+                    "MypyInitReturn": self.mypyInitReturnCheckBox.isChecked(),
+                    "DispatchDecorators": [
+                        d.strip() for d in self.dispatchDecoratorEdit.text().split(",")
+                    ],
+                    "OverloadDecorators": [
+                        d.strip() for d in self.overloadDecoratorEdit.text().split(",")
+                    ],
                 },
                 "SecurityChecker": {
                     "HardcodedTmpDirectories": [
                         t.strip()
-                        for t in self.tmpDirectoriesEdit.toPlainText()
-                        .splitlines()
+                        for t in self.tmpDirectoriesEdit.toPlainText().splitlines()
                     ],
                     "InsecureHashes": [
-                        h.strip()
-                        for h in self.hashesEdit.text().split(",")
+                        h.strip() for h in self.hashesEdit.text().split(",")
                     ],
                     "InsecureSslProtocolVersions": [
                         p.strip()
-                        for p in self.insecureSslProtocolsEdit.toPlainText()
-                        .splitlines()
+                        for p in (
+                            self.insecureSslProtocolsEdit.toPlainText().splitlines()
+                        )
                     ],
-                    "WeakKeySizeDsaHigh":
-                        self.dsaHighRiskCombo.currentText(),
-                    "WeakKeySizeDsaMedium":
-                        self.dsaMediumRiskCombo.currentText(),
-                    "WeakKeySizeRsaHigh":
-                        self.rsaHighRiskCombo.currentText(),
-                    "WeakKeySizeRsaMedium":
-                        self.rsaMediumRiskCombo.currentText(),
-                    "WeakKeySizeEcHigh":
-                        self.ecHighRiskCombo.currentText(),
-                    "WeakKeySizeEcMedium":
-                        self.ecMediumRiskCombo.currentText(),
-                    "CheckTypedException":
-                        self.typedExceptionsCheckBox.isChecked(),
+                    "WeakKeySizeDsaHigh": self.dsaHighRiskCombo.currentText(),
+                    "WeakKeySizeDsaMedium": self.dsaMediumRiskCombo.currentText(),
+                    "WeakKeySizeRsaHigh": self.rsaHighRiskCombo.currentText(),
+                    "WeakKeySizeRsaMedium": self.rsaMediumRiskCombo.currentText(),
+                    "WeakKeySizeEcHigh": self.ecHighRiskCombo.currentText(),
+                    "WeakKeySizeEcMedium": self.ecMediumRiskCombo.currentText(),
+                    "CheckTypedException": self.typedExceptionsCheckBox.isChecked(),
                 },
                 "ImportsChecker": {
-                    "ApplicationPackageNames":
-                        sorted(self.appPackagesEdit.toPlainText().split()),
-                    "BannedModules":
-                        sorted(self.bannedModulesEdit.toPlainText().split()),
+                    "ApplicationPackageNames": sorted(
+                        self.appPackagesEdit.toPlainText().split()
+                    ),
+                    "BannedModules": sorted(
+                        self.bannedModulesEdit.toPlainText().split()
+                    ),
                     "BanRelativeImports": self.__getBanRelativeImportsValue(),
                 },
             }
-            if (
-                json.dumps(data, sort_keys=True) !=
-                json.dumps(self.__data, sort_keys=True)
+            if json.dumps(data, sort_keys=True) != json.dumps(
+                self.__data, sort_keys=True
             ):
                 self.__data = data
-                self.__project.setData("CHECKERSPARMS", "Pep8Checker",
-                                       self.__data)
-        
+                self.__project.setData("CHECKERSPARMS", "Pep8Checker", self.__data)
+
         self.resultList.clear()
         self.results = CodeStyleCheckerDialog.noResults
         self.cancelled = False
@@ -1314,20 +1298,20 @@
         self.filterComboBox.clear()
         self.filterComboBox.setEnabled(False)
         self.filterButton.setEnabled(False)
-        
+
         self.start(self.__fileOrFileList)
-    
+
     @pyqtSlot()
     def on_restartButton_clicked(self):
         """
         Private slot to restart a code style check run.
         """
         self.on_startButton_clicked()
-    
+
     def __selectCodes(self, edit, categories, showFixCodes):
         """
         Private method to select message codes via a selection dialog.
-        
+
         @param edit reference of the line edit to be populated
         @type QLineEdit
         @param categories list of message categories to omit
@@ -1337,31 +1321,31 @@
         @type bool
         """
         from .CodeStyleCodeSelectionDialog import CodeStyleCodeSelectionDialog
-        dlg = CodeStyleCodeSelectionDialog(edit.text(), categories,
-                                           showFixCodes, self)
+
+        dlg = CodeStyleCodeSelectionDialog(edit.text(), categories, showFixCodes, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             edit.setText(dlg.getSelectedCodes())
-    
+
     @pyqtSlot()
     def on_excludeMessagesSelectButton_clicked(self):
         """
         Private slot to select the message codes to be excluded via a
         selection dialog.
         """
-        self.__selectCodes(self.excludeMessagesEdit,
-                           self.__getCategories(False, asList=True),
-                           False)
-    
+        self.__selectCodes(
+            self.excludeMessagesEdit, self.__getCategories(False, asList=True), False
+        )
+
     @pyqtSlot()
     def on_includeMessagesSelectButton_clicked(self):
         """
         Private slot to select the message codes to be included via a
         selection dialog.
         """
-        self.__selectCodes(self.includeMessagesEdit,
-                           self.__getCategories(True, asList=True),
-                           False)
-    
+        self.__selectCodes(
+            self.includeMessagesEdit, self.__getCategories(True, asList=True), False
+        )
+
     @pyqtSlot()
     def on_fixIssuesSelectButton_clicked(self):
         """
@@ -1369,7 +1353,7 @@
         selection dialog.
         """
         self.__selectCodes(self.fixIssuesEdit, [], True)
-    
+
     @pyqtSlot()
     def on_noFixIssuesSelectButton_clicked(self):
         """
@@ -1377,12 +1361,12 @@
         selection dialog.
         """
         self.__selectCodes(self.noFixIssuesEdit, [], True)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_resultList_itemActivated(self, item, column):
         """
         Private slot to handle the activation of an item.
-        
+
         @param item reference to the activated item
         @type QTreeWidgetItem
         @param column column the item was activated in
@@ -1390,40 +1374,41 @@
         """
         if self.results != CodeStyleCheckerDialog.hasResults:
             return
-        
+
         if item.parent():
             fn = os.path.abspath(item.data(0, self.filenameRole))
             lineno = item.data(0, self.lineRole)
             position = item.data(0, self.positionRole)
             message = item.data(0, self.messageRole)
             code = item.data(0, self.codeRole)
-            
+
             vm = ericApp().getObject("ViewManager")
             vm.openSourceFile(fn, lineno=lineno, pos=position + 1)
             editor = vm.getOpenEditor(fn)
-            
+
             if code in ["E901", "E902"]:
                 editor.toggleSyntaxError(lineno, 0, True, message, True)
             else:
                 editor.toggleWarning(
-                    lineno, 0, True, message, warningType=editor.WarningStyle)
-            
+                    lineno, 0, True, message, warningType=editor.WarningStyle
+                )
+
             editor.updateVerticalScrollBar()
-    
+
     @pyqtSlot()
     def on_resultList_itemSelectionChanged(self):
         """
         Private slot to change the dialog state depending on the selection.
         """
         self.fixButton.setEnabled(len(self.__getSelectedFixableItems()) > 0)
-    
+
     @pyqtSlot()
     def on_showButton_clicked(self):
         """
         Private slot to handle the "Show" button press.
         """
         vm = ericApp().getObject("ViewManager")
-        
+
         selectedIndexes = []
         for index in range(self.resultList.topLevelItemCount()):
             if self.resultList.topLevelItem(index).isSelected():
@@ -1441,216 +1426,344 @@
                 lineno = citm.data(0, self.lineRole)
                 message = citm.data(0, self.messageRole)
                 editor.toggleWarning(
-                    lineno, 0, True, message, warningType=editor.WarningStyle)
-        
+                    lineno, 0, True, message, warningType=editor.WarningStyle
+                )
+
         # go through the list again to clear warning markers for files,
         # that are ok
         openFiles = vm.getOpenFilenames()
         errorFiles = []
         for index in range(self.resultList.topLevelItemCount()):
             itm = self.resultList.topLevelItem(index)
-            errorFiles.append(
-                os.path.abspath(itm.data(0, self.filenameRole)))
+            errorFiles.append(os.path.abspath(itm.data(0, self.filenameRole)))
         for file in openFiles:
             if file not in errorFiles:
                 editor = vm.getOpenEditor(file)
                 editor.clearStyleWarnings()
-        
+
         editor = vm.activeWindow()
         editor.updateVerticalScrollBar()
-    
+
     @pyqtSlot()
     def on_statisticsButton_clicked(self):
         """
         Private slot to show the statistics dialog.
         """
         from .CodeStyleStatisticsDialog import CodeStyleStatisticsDialog
+
         dlg = CodeStyleStatisticsDialog(self.__statistics, self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def on_loadDefaultButton_clicked(self):
         """
         Private slot to load the default configuration values.
         """
-        self.__initCategoriesList(Preferences.getSettings().value(
-            "PEP8/EnabledCheckerCategories",
-            ",".join(CodeStyleCheckerDialog.checkCategories.keys())))
-        self.excludeFilesEdit.setText(Preferences.getSettings().value(
-            "PEP8/ExcludeFilePatterns", ""))
-        self.excludeMessagesEdit.setText(Preferences.getSettings().value(
-            "PEP8/ExcludeMessages", pycodestyle.DEFAULT_IGNORE))
-        self.includeMessagesEdit.setText(Preferences.getSettings().value(
-            "PEP8/IncludeMessages", ""))
-        self.repeatCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value("PEP8/RepeatMessages", False)))
-        self.fixIssuesEdit.setText(Preferences.getSettings().value(
-            "PEP8/FixCodes", ""))
-        self.noFixIssuesEdit.setText(Preferences.getSettings().value(
-            "PEP8/NoFixCodes", "E501"))
-        self.fixIssuesCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value("PEP8/FixIssues", False)))
-        self.ignoredCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value("PEP8/ShowIgnored", False)))
-        self.lineLengthSpinBox.setValue(int(
-            Preferences.getSettings().value("PEP8/MaxLineLength", 88)))
-        self.docLineLengthSpinBox.setValue(int(
-            Preferences.getSettings().value("PEP8/MaxDocLineLength", 88)))
+        self.__initCategoriesList(
+            Preferences.getSettings().value(
+                "PEP8/EnabledCheckerCategories",
+                ",".join(CodeStyleCheckerDialog.checkCategories.keys()),
+            )
+        )
+        self.excludeFilesEdit.setText(
+            Preferences.getSettings().value("PEP8/ExcludeFilePatterns", "")
+        )
+        self.excludeMessagesEdit.setText(
+            Preferences.getSettings().value(
+                "PEP8/ExcludeMessages", pycodestyle.DEFAULT_IGNORE
+            )
+        )
+        self.includeMessagesEdit.setText(
+            Preferences.getSettings().value("PEP8/IncludeMessages", "")
+        )
+        self.repeatCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value("PEP8/RepeatMessages", False)
+            )
+        )
+        self.fixIssuesEdit.setText(Preferences.getSettings().value("PEP8/FixCodes", ""))
+        self.noFixIssuesEdit.setText(
+            Preferences.getSettings().value("PEP8/NoFixCodes", "E501")
+        )
+        self.fixIssuesCheckBox.setChecked(
+            Preferences.toBool(Preferences.getSettings().value("PEP8/FixIssues", False))
+        )
+        self.ignoredCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value("PEP8/ShowIgnored", False)
+            )
+        )
+        self.lineLengthSpinBox.setValue(
+            int(Preferences.getSettings().value("PEP8/MaxLineLength", 88))
+        )
+        self.docLineLengthSpinBox.setValue(
+            int(Preferences.getSettings().value("PEP8/MaxDocLineLength", 88))
+        )
         self.blankBeforeTopLevelSpinBox.setValue(
-            int(Preferences.getSettings().value(
-                "PEP8/BlankLinesBeforeTopLevel", 2)))
+            int(Preferences.getSettings().value("PEP8/BlankLinesBeforeTopLevel", 2))
+        )
         self.blankBeforeMethodSpinBox.setValue(
-            int(Preferences.getSettings().value(
-                "PEP8/BlankLinesBeforeMethod", 1)))
-        self.hangClosingCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value("PEP8/HangClosing", False)))
-        self.docTypeComboBox.setCurrentIndex(self.docTypeComboBox.findData(
-            Preferences.getSettings().value("PEP8/DocstringType", "pep257")))
-        self.complexitySpinBox.setValue(int(Preferences.getSettings().value(
-            "PEP8/MaxCodeComplexity", 10)))
+            int(Preferences.getSettings().value("PEP8/BlankLinesBeforeMethod", 1))
+        )
+        self.hangClosingCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value("PEP8/HangClosing", False)
+            )
+        )
+        self.docTypeComboBox.setCurrentIndex(
+            self.docTypeComboBox.findData(
+                Preferences.getSettings().value("PEP8/DocstringType", "pep257")
+            )
+        )
+        self.complexitySpinBox.setValue(
+            int(Preferences.getSettings().value("PEP8/MaxCodeComplexity", 10))
+        )
         self.lineComplexitySpinBox.setValue(
-            int(Preferences.getSettings().value(
-                "PEP8/LineComplexity", 15)))
+            int(Preferences.getSettings().value("PEP8/LineComplexity", 15))
+        )
         self.lineComplexityScoreSpinBox.setValue(
-            int(Preferences.getSettings().value(
-                "PEP8/LineComplexityScore", 10)))
-        self.encodingsEdit.setText(Preferences.getSettings().value(
-            "PEP8/ValidEncodings",
-            MiscellaneousCheckerDefaultArgs["CodingChecker"]
-        ))
-        self.copyrightFileSizeSpinBox.setValue(int(
+            int(Preferences.getSettings().value("PEP8/LineComplexityScore", 10))
+        )
+        self.encodingsEdit.setText(
             Preferences.getSettings().value(
-                "PEP8/CopyrightMinFileSize",
-                MiscellaneousCheckerDefaultArgs[
-                    "CopyrightChecker"]["MinFilesize"]
+                "PEP8/ValidEncodings", MiscellaneousCheckerDefaultArgs["CodingChecker"]
             )
-        ))
+        )
+        self.copyrightFileSizeSpinBox.setValue(
+            int(
+                Preferences.getSettings().value(
+                    "PEP8/CopyrightMinFileSize",
+                    MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["MinFilesize"],
+                )
+            )
+        )
         self.copyrightAuthorEdit.setText(
             Preferences.getSettings().value(
                 "PEP8/CopyrightAuthor",
-                MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"]
+                MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"],
             )
         )
         self.__initFuturesList(
-            Preferences.getSettings().value("PEP8/FutureChecker", ""))
-        self.__initBuiltinsIgnoreList(Preferences.toDict(
-            Preferences.getSettings().value(
-                "PEP8/BuiltinsChecker",
-                MiscellaneousCheckerDefaultArgs["BuiltinsChecker"]
-            ))
+            Preferences.getSettings().value("PEP8/FutureChecker", "")
+        )
+        self.__initBuiltinsIgnoreList(
+            Preferences.toDict(
+                Preferences.getSettings().value(
+                    "PEP8/BuiltinsChecker",
+                    MiscellaneousCheckerDefaultArgs["BuiltinsChecker"],
+                )
+            )
         )
-        self.aggressiveCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/AggressiveSearch",
-                MiscellaneousCheckerDefaultArgs[
-                    "CommentedCodeChecker"]["Aggressive"]
-            )))
-        self.__initCommentedCodeCheckerWhiteList(Preferences.toList(
-            Preferences.getSettings().value(
-                "PEP8/CommentedCodeWhitelist",
-                MiscellaneousCheckerDefaultArgs[
-                    "CommentedCodeChecker"]["WhiteList"]
+        self.aggressiveCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/AggressiveSearch",
+                    MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"][
+                        "Aggressive"
+                    ],
+                )
             )
-        ))
-        
+        )
+        self.__initCommentedCodeCheckerWhiteList(
+            Preferences.toList(
+                Preferences.getSettings().value(
+                    "PEP8/CommentedCodeWhitelist",
+                    MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"][
+                        "WhiteList"
+                    ],
+                )
+            )
+        )
+
         # Type Annotations Checker
-        self.minAnnotationsCoverageSpinBox.setValue(int(
-            Preferences.getSettings().value(
-                "PEP8/MinimumAnnotationsCoverage",
-                AnnotationsCheckerDefaultArgs["MinimumCoverage"])))
-        self.maxAnnotationsComplexitySpinBox.setValue(int(
-            Preferences.getSettings().value(
-                "PEP8/MaximumAnnotationComplexity",
-                AnnotationsCheckerDefaultArgs["MaximumComplexity"])))
-        self.maxAnnotationsLengthSpinBox.setValue(int(
-            Preferences.getSettings().value(
-                "PEP8/MaximumAnnotationLength",
-                AnnotationsCheckerDefaultArgs["MaximumLength"])))
-        self.suppressNoneReturningCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/SuppressNoneReturning",
-                AnnotationsCheckerDefaultArgs["SuppressNoneReturning"])))
-        self.suppressDummyArgsCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/SuppressDummyArgs",
-                AnnotationsCheckerDefaultArgs["SuppressDummyArgs"])))
-        self.allowUntypedDefsCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/AllowUntypedDefs",
-                AnnotationsCheckerDefaultArgs["AllowUntypedDefs"])))
-        self.allowUntypedNestedCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/AllowUntypedNested",
-                AnnotationsCheckerDefaultArgs["AllowUntypedNested"])))
-        self.mypyInitReturnCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/MypyInitReturn",
-                AnnotationsCheckerDefaultArgs["MypyInitReturn"])))
-        self.dispatchDecoratorEdit.setText(", ".join(Preferences.toList(
-            Preferences.getSettings().value(
-                "PEP8/DispatchDecorators",
-                AnnotationsCheckerDefaultArgs["DispatchDecorators"]))))
-        self.overloadDecoratorEdit.setText(", ".join(Preferences.toList(
-            Preferences.getSettings().value(
-                "PEP8/OverloadDecorators",
-                AnnotationsCheckerDefaultArgs["OverloadDecorators"]))))
-        
+        self.minAnnotationsCoverageSpinBox.setValue(
+            int(
+                Preferences.getSettings().value(
+                    "PEP8/MinimumAnnotationsCoverage",
+                    AnnotationsCheckerDefaultArgs["MinimumCoverage"],
+                )
+            )
+        )
+        self.maxAnnotationsComplexitySpinBox.setValue(
+            int(
+                Preferences.getSettings().value(
+                    "PEP8/MaximumAnnotationComplexity",
+                    AnnotationsCheckerDefaultArgs["MaximumComplexity"],
+                )
+            )
+        )
+        self.maxAnnotationsLengthSpinBox.setValue(
+            int(
+                Preferences.getSettings().value(
+                    "PEP8/MaximumAnnotationLength",
+                    AnnotationsCheckerDefaultArgs["MaximumLength"],
+                )
+            )
+        )
+        self.suppressNoneReturningCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/SuppressNoneReturning",
+                    AnnotationsCheckerDefaultArgs["SuppressNoneReturning"],
+                )
+            )
+        )
+        self.suppressDummyArgsCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/SuppressDummyArgs",
+                    AnnotationsCheckerDefaultArgs["SuppressDummyArgs"],
+                )
+            )
+        )
+        self.allowUntypedDefsCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/AllowUntypedDefs",
+                    AnnotationsCheckerDefaultArgs["AllowUntypedDefs"],
+                )
+            )
+        )
+        self.allowUntypedNestedCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/AllowUntypedNested",
+                    AnnotationsCheckerDefaultArgs["AllowUntypedNested"],
+                )
+            )
+        )
+        self.mypyInitReturnCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/MypyInitReturn",
+                    AnnotationsCheckerDefaultArgs["MypyInitReturn"],
+                )
+            )
+        )
+        self.dispatchDecoratorEdit.setText(
+            ", ".join(
+                Preferences.toList(
+                    Preferences.getSettings().value(
+                        "PEP8/DispatchDecorators",
+                        AnnotationsCheckerDefaultArgs["DispatchDecorators"],
+                    )
+                )
+            )
+        )
+        self.overloadDecoratorEdit.setText(
+            ", ".join(
+                Preferences.toList(
+                    Preferences.getSettings().value(
+                        "PEP8/OverloadDecorators",
+                        AnnotationsCheckerDefaultArgs["OverloadDecorators"],
+                    )
+                )
+            )
+        )
+
         # Security Checker
         from .Security.SecurityDefaults import SecurityDefaults
-        self.tmpDirectoriesEdit.setPlainText("\n".join(
-            Preferences.toList(Preferences.getSettings().value(
-                "PEP8/HardcodedTmpDirectories",
-                SecurityDefaults["hardcoded_tmp_directories"]))))
-        self.hashesEdit.setText(", ".join(
-            Preferences.toList(Preferences.getSettings().value(
-                "PEP8/InsecureHashes",
-                SecurityDefaults["insecure_hashes"])))),
-        self.insecureSslProtocolsEdit.setPlainText("\n".join(
-            Preferences.toList(Preferences.getSettings().value(
-                "PEP8/InsecureSslProtocolVersions",
-                SecurityDefaults["insecure_ssl_protocol_versions"])))),
+
+        self.tmpDirectoriesEdit.setPlainText(
+            "\n".join(
+                Preferences.toList(
+                    Preferences.getSettings().value(
+                        "PEP8/HardcodedTmpDirectories",
+                        SecurityDefaults["hardcoded_tmp_directories"],
+                    )
+                )
+            )
+        )
+        self.hashesEdit.setText(
+            ", ".join(
+                Preferences.toList(
+                    Preferences.getSettings().value(
+                        "PEP8/InsecureHashes", SecurityDefaults["insecure_hashes"]
+                    )
+                )
+            )
+        ),
+        self.insecureSslProtocolsEdit.setPlainText(
+            "\n".join(
+                Preferences.toList(
+                    Preferences.getSettings().value(
+                        "PEP8/InsecureSslProtocolVersions",
+                        SecurityDefaults["insecure_ssl_protocol_versions"],
+                    )
+                )
+            )
+        ),
         self.dsaHighRiskCombo.setCurrentText(
             Preferences.getSettings().value(
                 "PEP8/WeakKeySizeDsaHigh",
-                str(SecurityDefaults["weak_key_size_dsa_high"])))
+                str(SecurityDefaults["weak_key_size_dsa_high"]),
+            )
+        )
         self.dsaMediumRiskCombo.setCurrentText(
             Preferences.getSettings().value(
                 "PEP8/WeakKeySizeDsaMedium",
-                str(SecurityDefaults["weak_key_size_dsa_medium"]))),
+                str(SecurityDefaults["weak_key_size_dsa_medium"]),
+            )
+        ),
         self.rsaHighRiskCombo.setCurrentText(
             Preferences.getSettings().value(
                 "PEP8/WeakKeySizeRsaHigh",
-                str(SecurityDefaults["weak_key_size_rsa_high"]))),
+                str(SecurityDefaults["weak_key_size_rsa_high"]),
+            )
+        ),
         self.rsaMediumRiskCombo.setCurrentText(
             Preferences.getSettings().value(
                 "PEP8/WeakKeySizeRsaMedium",
-                str(SecurityDefaults["weak_key_size_rsa_medium"]))),
+                str(SecurityDefaults["weak_key_size_rsa_medium"]),
+            )
+        ),
         self.ecHighRiskCombo.setCurrentText(
             Preferences.getSettings().value(
-                "PEP8/WeakKeySizeEcHigh",
-                str(SecurityDefaults["weak_key_size_ec_high"]))),
+                "PEP8/WeakKeySizeEcHigh", str(SecurityDefaults["weak_key_size_ec_high"])
+            )
+        ),
         self.ecMediumRiskCombo.setCurrentText(
             Preferences.getSettings().value(
                 "PEP8/WeakKeySizeEcMedium",
-                str(SecurityDefaults["weak_key_size_ec_medium"]))),
-        self.typedExceptionsCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "PEP8/CheckTypedException",
-                SecurityDefaults["check_typed_exception"]))),
-        
+                str(SecurityDefaults["weak_key_size_ec_medium"]),
+            )
+        ),
+        self.typedExceptionsCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value(
+                    "PEP8/CheckTypedException",
+                    SecurityDefaults["check_typed_exception"],
+                )
+            )
+        ),
+
         # Imports Checker
-        self.appPackagesEdit.setPlainText(" ".join(
-            sorted(Preferences.toList(Preferences.getSettings().value(
-                "PEP8/ApplicationPackageNames", [])))))
-        self.bannedModulesEdit.setPlainText(" ".join(
-            sorted(Preferences.toList(Preferences.getSettings().value(
-                "PEP8/BannedModules", [])))))
+        self.appPackagesEdit.setPlainText(
+            " ".join(
+                sorted(
+                    Preferences.toList(
+                        Preferences.getSettings().value(
+                            "PEP8/ApplicationPackageNames", []
+                        )
+                    )
+                )
+            )
+        )
+        self.bannedModulesEdit.setPlainText(
+            " ".join(
+                sorted(
+                    Preferences.toList(
+                        Preferences.getSettings().value("PEP8/BannedModules", [])
+                    )
+                )
+            )
+        )
         self.__setBanRelativeImports(
-            Preferences.getSettings().value(
-                "PEP8/BanRelativeImports", ""))
-        
+            Preferences.getSettings().value("PEP8/BanRelativeImports", "")
+        )
+
         self.__cleanupData()
-    
+
     @pyqtSlot()
     def on_storeDefaultButton_clicked(self):
         """
@@ -1658,144 +1771,166 @@
         default values.
         """
         Preferences.getSettings().setValue(
-            "PEP8/EnabledCheckerCategories", self.__getCategories(True))
+            "PEP8/EnabledCheckerCategories", self.__getCategories(True)
+        )
         Preferences.getSettings().setValue(
-            "PEP8/ExcludeFilePatterns", self.excludeFilesEdit.text())
-        Preferences.getSettings().setValue(
-            "PEP8/ExcludeMessages", self.excludeMessagesEdit.text())
+            "PEP8/ExcludeFilePatterns", self.excludeFilesEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/IncludeMessages", self.includeMessagesEdit.text())
-        Preferences.getSettings().setValue(
-            "PEP8/RepeatMessages", self.repeatCheckBox.isChecked())
+            "PEP8/ExcludeMessages", self.excludeMessagesEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/FixCodes", self.fixIssuesEdit.text())
+            "PEP8/IncludeMessages", self.includeMessagesEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/NoFixCodes", self.noFixIssuesEdit.text())
+            "PEP8/RepeatMessages", self.repeatCheckBox.isChecked()
+        )
+        Preferences.getSettings().setValue("PEP8/FixCodes", self.fixIssuesEdit.text())
         Preferences.getSettings().setValue(
-            "PEP8/FixIssues", self.fixIssuesCheckBox.isChecked())
+            "PEP8/NoFixCodes", self.noFixIssuesEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/ShowIgnored", self.ignoredCheckBox.isChecked())
+            "PEP8/FixIssues", self.fixIssuesCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/MaxLineLength", self.lineLengthSpinBox.value())
+            "PEP8/ShowIgnored", self.ignoredCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/MaxDocLineLength", self.docLineLengthSpinBox.value())
+            "PEP8/MaxLineLength", self.lineLengthSpinBox.value()
+        )
+        Preferences.getSettings().setValue(
+            "PEP8/MaxDocLineLength", self.docLineLengthSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/BlankLinesBeforeTopLevel",
-            self.blankBeforeTopLevelSpinBox.value())
+            "PEP8/BlankLinesBeforeTopLevel", self.blankBeforeTopLevelSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/BlankLinesBeforeMethod",
-            self.blankBeforeMethodSpinBox.value())
+            "PEP8/BlankLinesBeforeMethod", self.blankBeforeMethodSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/HangClosing", self.hangClosingCheckBox.isChecked())
+            "PEP8/HangClosing", self.hangClosingCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/DocstringType", self.docTypeComboBox.itemData(
-                self.docTypeComboBox.currentIndex()))
-        Preferences.getSettings().setValue(
-            "PEP8/MaxCodeComplexity", self.complexitySpinBox.value())
+            "PEP8/DocstringType",
+            self.docTypeComboBox.itemData(self.docTypeComboBox.currentIndex()),
+        )
         Preferences.getSettings().setValue(
-            "PEP8/LineComplexity", self.lineComplexitySpinBox.value())
+            "PEP8/MaxCodeComplexity", self.complexitySpinBox.value()
+        )
+        Preferences.getSettings().setValue(
+            "PEP8/LineComplexity", self.lineComplexitySpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/LineComplexityScore",
-            self.lineComplexityScoreSpinBox.value())
+            "PEP8/LineComplexityScore", self.lineComplexityScoreSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/ValidEncodings", self.encodingsEdit.text())
+            "PEP8/ValidEncodings", self.encodingsEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/CopyrightMinFileSize", self.copyrightFileSizeSpinBox.value())
+            "PEP8/CopyrightMinFileSize", self.copyrightFileSizeSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/CopyrightAuthor", self.copyrightAuthorEdit.text())
+            "PEP8/CopyrightAuthor", self.copyrightAuthorEdit.text()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/FutureChecker", self.__getSelectedFutureImports())
+            "PEP8/FutureChecker", self.__getSelectedFutureImports()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/BuiltinsChecker", self.__getBuiltinsIgnoreList())
-        Preferences.getSettings().setValue(
-            "PEP8/AggressiveSearch", self.aggressiveCheckBox.isChecked())
+            "PEP8/BuiltinsChecker", self.__getBuiltinsIgnoreList()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/CommentedCodeWhitelist",
-            self.__getCommentedCodeCheckerWhiteList())
-        
+            "PEP8/AggressiveSearch", self.aggressiveCheckBox.isChecked()
+        )
+        Preferences.getSettings().setValue(
+            "PEP8/CommentedCodeWhitelist", self.__getCommentedCodeCheckerWhiteList()
+        )
+
         # Type Annotations Checker
         Preferences.getSettings().setValue(
             "PEP8/MinimumAnnotationsCoverage",
-            self.minAnnotationsCoverageSpinBox.value())
+            self.minAnnotationsCoverageSpinBox.value(),
+        )
         Preferences.getSettings().setValue(
             "PEP8/MaximumAnnotationComplexity",
-            self.maxAnnotationsComplexitySpinBox.value())
+            self.maxAnnotationsComplexitySpinBox.value(),
+        )
         Preferences.getSettings().setValue(
-            "PEP8/MaximumAnnotationLength",
-            self.maxAnnotationsLengthSpinBox.value())
+            "PEP8/MaximumAnnotationLength", self.maxAnnotationsLengthSpinBox.value()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/SuppressNoneReturning",
-            self.suppressNoneReturningCheckBox.isChecked())
+            "PEP8/SuppressNoneReturning", self.suppressNoneReturningCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/SuppressDummyArgs",
-            self.suppressDummyArgsCheckBox.isChecked())
+            "PEP8/SuppressDummyArgs", self.suppressDummyArgsCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/AllowUntypedDefs",
-            self.allowUntypedDefsCheckBox.isChecked())
+            "PEP8/AllowUntypedDefs", self.allowUntypedDefsCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/AllowUntypedNested",
-            self.allowUntypedNestedCheckBox.isChecked())
+            "PEP8/AllowUntypedNested", self.allowUntypedNestedCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
-            "PEP8/MypyInitReturn",
-            self.mypyInitReturnCheckBox.isChecked())
+            "PEP8/MypyInitReturn", self.mypyInitReturnCheckBox.isChecked()
+        )
         Preferences.getSettings().setValue(
             "PEP8/DispatchDecorators",
-            [d.strip()
-             for d in self.dispatchDecoratorEdit.text().split(",")])
+            [d.strip() for d in self.dispatchDecoratorEdit.text().split(",")],
+        )
         Preferences.getSettings().setValue(
             "PEP8/OverloadDecorators",
-            [d.strip()
-             for d in self.overloadDecoratorEdit.text().split(",")])
-        
+            [d.strip() for d in self.overloadDecoratorEdit.text().split(",")],
+        )
+
         # Security Checker
         Preferences.getSettings().setValue(
             "PEP8/HardcodedTmpDirectories",
-            [t.strip()
-             for t in self.tmpDirectoriesEdit.toPlainText().splitlines()
-             ]),
+            [t.strip() for t in self.tmpDirectoriesEdit.toPlainText().splitlines()],
+        ),
         Preferences.getSettings().setValue(
             "PEP8/InsecureHashes",
-            [h.strip()
-             for h in self.hashesEdit.text().split(",")
-             ]),
+            [h.strip() for h in self.hashesEdit.text().split(",")],
+        ),
         Preferences.getSettings().setValue(
             "PEP8/InsecureSslProtocolVersions",
-            [p.strip()
-             for p in self.insecureSslProtocolsEdit.toPlainText().splitlines()
-             ]),
+            [
+                p.strip()
+                for p in self.insecureSslProtocolsEdit.toPlainText().splitlines()
+            ],
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeDsaHigh",
-            self.dsaHighRiskCombo.currentText()),
+            "PEP8/WeakKeySizeDsaHigh", self.dsaHighRiskCombo.currentText()
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeDsaMedium",
-            self.dsaMediumRiskCombo.currentText()),
-        Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeRsaHigh",
-            self.rsaHighRiskCombo.currentText()),
+            "PEP8/WeakKeySizeDsaMedium", self.dsaMediumRiskCombo.currentText()
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeRsaMedium",
-            self.rsaMediumRiskCombo.currentText()),
+            "PEP8/WeakKeySizeRsaHigh", self.rsaHighRiskCombo.currentText()
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeEcHigh",
-            self.ecHighRiskCombo.currentText()),
+            "PEP8/WeakKeySizeRsaMedium", self.rsaMediumRiskCombo.currentText()
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeEcMedium",
-            self.ecMediumRiskCombo.currentText()),
+            "PEP8/WeakKeySizeEcHigh", self.ecHighRiskCombo.currentText()
+        ),
         Preferences.getSettings().setValue(
-            "PEP8/CheckTypedException",
-            self.typedExceptionsCheckBox.isChecked()),
-        
+            "PEP8/WeakKeySizeEcMedium", self.ecMediumRiskCombo.currentText()
+        ),
+        Preferences.getSettings().setValue(
+            "PEP8/CheckTypedException", self.typedExceptionsCheckBox.isChecked()
+        ),
+
         # Imports Checker
         Preferences.getSettings().setValue(
             "PEP8/ApplicationPackageNames",
-            sorted(self.appPackagesEdit.toPlainText().split()))
+            sorted(self.appPackagesEdit.toPlainText().split()),
+        )
         Preferences.getSettings().setValue(
-            "PEP8/BannedModules",
-            sorted(self.bannedModulesEdit.toPlainText().split()))
+            "PEP8/BannedModules", sorted(self.bannedModulesEdit.toPlainText().split())
+        )
         Preferences.getSettings().setValue(
-            "PEP8/BanRelativeImports",
-            self.__getBanRelativeImportsValue())
-    
+            "PEP8/BanRelativeImports", self.__getBanRelativeImportsValue()
+        )
+
     @pyqtSlot()
     def on_resetDefaultButton_clicked(self):
         """
@@ -1803,10 +1938,12 @@
         """
         Preferences.getSettings().setValue(
             "PEP8/EnabledCheckerCategories",
-            ",".join(CodeStyleCheckerDialog.checkCategories.keys()))
+            ",".join(CodeStyleCheckerDialog.checkCategories.keys()),
+        )
         Preferences.getSettings().setValue("PEP8/ExcludeFilePatterns", "")
         Preferences.getSettings().setValue(
-            "PEP8/ExcludeMessages", pycodestyle.DEFAULT_IGNORE)
+            "PEP8/ExcludeMessages", pycodestyle.DEFAULT_IGNORE
+        )
         Preferences.getSettings().setValue("PEP8/IncludeMessages", "")
         Preferences.getSettings().setValue("PEP8/RepeatMessages", False)
         Preferences.getSettings().setValue("PEP8/FixCodes", "")
@@ -1823,109 +1960,114 @@
         Preferences.getSettings().setValue("PEP8/LineComplexity", 15)
         Preferences.getSettings().setValue("PEP8/LineComplexityScore", 10)
         Preferences.getSettings().setValue(
-            "PEP8/ValidEncodings",
-            MiscellaneousCheckerDefaultArgs["CodingChecker"]
+            "PEP8/ValidEncodings", MiscellaneousCheckerDefaultArgs["CodingChecker"]
         )
         Preferences.getSettings().setValue(
             "PEP8/CopyrightMinFileSize",
-            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["MinFilesize"]
+            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["MinFilesize"],
         )
         Preferences.getSettings().setValue(
             "PEP8/CopyrightAuthor",
-            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"]
+            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"],
         )
         Preferences.getSettings().setValue("PEP8/FutureChecker", "")
         Preferences.getSettings().setValue(
-            "PEP8/BuiltinsChecker",
-            MiscellaneousCheckerDefaultArgs["BuiltinsChecker"]
+            "PEP8/BuiltinsChecker", MiscellaneousCheckerDefaultArgs["BuiltinsChecker"]
         )
         Preferences.getSettings().setValue(
             "PEP8/AggressiveSearch",
-            MiscellaneousCheckerDefaultArgs[
-                "CommentedCodeChecker"]["Aggressive"]
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]["Aggressive"],
         )
         Preferences.getSettings().setValue(
             "PEP8/CommentedCodeWhitelist",
-            MiscellaneousCheckerDefaultArgs[
-                "CommentedCodeChecker"]["WhiteList"]
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]["WhiteList"],
         )
-        
+
         # Type Annotations Checker
         Preferences.getSettings().setValue(
             "PEP8/MinimumAnnotationsCoverage",
-            AnnotationsCheckerDefaultArgs["MinimumCoverage"])
+            AnnotationsCheckerDefaultArgs["MinimumCoverage"],
+        )
         Preferences.getSettings().setValue(
             "PEP8/MaximumAnnotationComplexity",
-            AnnotationsCheckerDefaultArgs["MaximumComplexity"])
+            AnnotationsCheckerDefaultArgs["MaximumComplexity"],
+        )
         Preferences.getSettings().setValue(
             "PEP8/MaximumAnnotationLength",
-            AnnotationsCheckerDefaultArgs["MaximumLength"])
+            AnnotationsCheckerDefaultArgs["MaximumLength"],
+        )
         Preferences.getSettings().setValue(
             "PEP8/SuppressNoneReturning",
-            AnnotationsCheckerDefaultArgs["SuppressNoneReturning"])
+            AnnotationsCheckerDefaultArgs["SuppressNoneReturning"],
+        )
         Preferences.getSettings().setValue(
-            "PEP8/SuppressDummyArgs",
-            AnnotationsCheckerDefaultArgs["SuppressDummyArgs"])
+            "PEP8/SuppressDummyArgs", AnnotationsCheckerDefaultArgs["SuppressDummyArgs"]
+        )
         Preferences.getSettings().setValue(
-            "PEP8/AllowUntypedDefs",
-            AnnotationsCheckerDefaultArgs["AllowUntypedDefs"])
+            "PEP8/AllowUntypedDefs", AnnotationsCheckerDefaultArgs["AllowUntypedDefs"]
+        )
         Preferences.getSettings().setValue(
             "PEP8/AllowUntypedNested",
-            AnnotationsCheckerDefaultArgs["AllowUntypedNested"])
+            AnnotationsCheckerDefaultArgs["AllowUntypedNested"],
+        )
         Preferences.getSettings().setValue(
-            "PEP8/MypyInitReturn",
-            AnnotationsCheckerDefaultArgs["MypyInitReturn"])
+            "PEP8/MypyInitReturn", AnnotationsCheckerDefaultArgs["MypyInitReturn"]
+        )
         Preferences.getSettings().setValue(
             "PEP8/DispatchDecorators",
-            AnnotationsCheckerDefaultArgs["DispatchDecorators"])
+            AnnotationsCheckerDefaultArgs["DispatchDecorators"],
+        )
         Preferences.getSettings().setValue(
             "PEP8/OverloadDecorators",
-            AnnotationsCheckerDefaultArgs["OverloadDecorators"])
-        
+            AnnotationsCheckerDefaultArgs["OverloadDecorators"],
+        )
+
         # Security Checker
         from .Security.SecurityDefaults import SecurityDefaults
+
         Preferences.getSettings().setValue(
             "PEP8/HardcodedTmpDirectories",
-            SecurityDefaults["hardcoded_tmp_directories"])
+            SecurityDefaults["hardcoded_tmp_directories"],
+        )
         Preferences.getSettings().setValue(
-            "PEP8/InsecureHashes",
-            SecurityDefaults["insecure_hashes"])
+            "PEP8/InsecureHashes", SecurityDefaults["insecure_hashes"]
+        )
         Preferences.getSettings().setValue(
             "PEP8/InsecureSslProtocolVersions",
-            SecurityDefaults["insecure_ssl_protocol_versions"])
+            SecurityDefaults["insecure_ssl_protocol_versions"],
+        )
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeDsaHigh",
-            str(SecurityDefaults["weak_key_size_dsa_high"]))
+            "PEP8/WeakKeySizeDsaHigh", str(SecurityDefaults["weak_key_size_dsa_high"])
+        )
         Preferences.getSettings().setValue(
             "PEP8/WeakKeySizeDsaMedium",
-            str(SecurityDefaults["weak_key_size_dsa_medium"]))
+            str(SecurityDefaults["weak_key_size_dsa_medium"]),
+        )
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeRsaHigh",
-            str(SecurityDefaults["weak_key_size_rsa_high"]))
+            "PEP8/WeakKeySizeRsaHigh", str(SecurityDefaults["weak_key_size_rsa_high"])
+        )
         Preferences.getSettings().setValue(
             "PEP8/WeakKeySizeRsaMedium",
-            str(SecurityDefaults["weak_key_size_rsa_medium"]))
+            str(SecurityDefaults["weak_key_size_rsa_medium"]),
+        )
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeEcHigh",
-            str(SecurityDefaults["weak_key_size_ec_high"]))
+            "PEP8/WeakKeySizeEcHigh", str(SecurityDefaults["weak_key_size_ec_high"])
+        )
         Preferences.getSettings().setValue(
-            "PEP8/WeakKeySizeEcMedium",
-            str(SecurityDefaults["weak_key_size_ec_medium"]))
+            "PEP8/WeakKeySizeEcMedium", str(SecurityDefaults["weak_key_size_ec_medium"])
+        )
         Preferences.getSettings().setValue(
-            "PEP8/CheckTypedException",
-            SecurityDefaults["check_typed_exception"])
-        
+            "PEP8/CheckTypedException", SecurityDefaults["check_typed_exception"]
+        )
+
         # Imports Checker
-        Preferences.getSettings().setValue(
-            "PEP8/ApplicationPackageNames", [])
-        Preferences.getSettings().setValue(
-            "PEP8/BannedModules", [])
-        Preferences.getSettings().setValue(
-            "PEP8/BanRelativeImports", "")
-        
+        Preferences.getSettings().setValue("PEP8/ApplicationPackageNames", [])
+        Preferences.getSettings().setValue("PEP8/BannedModules", [])
+        Preferences.getSettings().setValue("PEP8/BanRelativeImports", "")
+
         # Update UI with default values
         self.on_loadDefaultButton_clicked()
-    
+
     @pyqtSlot()
     def on_cancelButton_clicked(self):
         """
@@ -1936,25 +2078,23 @@
             QTimer.singleShot(1000, self.__finish)
         else:
             self.__finish()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-    
+
     def __clearErrors(self, files):
         """
         Private method to clear all warning markers of open editors to be
         checked.
-        
+
         @param files list of files to be checked
         @type list of str
         """
@@ -1963,12 +2103,12 @@
         for file in [f for f in openFiles if f in files]:
             editor = vm.getOpenEditor(file)
             editor.clearStyleWarnings()
-    
+
     @pyqtSlot()
     def on_fixButton_clicked(self):
         """
         Private slot to fix selected issues.
-        
+
         Build a dictionary of issues to fix. Update the initialized __options.
         Then call check with the dict as keyparam to fix selected issues.
         """
@@ -1979,25 +2119,27 @@
             filename = itm.data(0, self.filenameRole)
             if filename not in fixesDict:
                 fixesDict[filename] = []
-            fixesDict[filename].append((
-                {
-                    "file": filename,
-                    "line": itm.data(0, self.lineRole),
-                    "offset": itm.data(0, self.positionRole),
-                    "code": itm.data(0, self.codeRole),
-                    "display": itm.data(0, self.messageRole),
-                    "args": itm.data(0, self.argsRole),
-                },
-                itm
-            ))
-    
+            fixesDict[filename].append(
+                (
+                    {
+                        "file": filename,
+                        "line": itm.data(0, self.lineRole),
+                        "offset": itm.data(0, self.positionRole),
+                        "code": itm.data(0, self.codeRole),
+                        "display": itm.data(0, self.messageRole),
+                        "args": itm.data(0, self.argsRole),
+                    },
+                    itm,
+                )
+            )
+
         # update the configuration values (3: fixCodes, 4: noFixCodes,
         # 5: fixIssues, 6: maxLineLength)
         self.__options[3] = self.fixIssuesEdit.text()
         self.__options[4] = self.noFixIssuesEdit.text()
         self.__options[5] = True
         self.__options[6] = self.lineLengthSpinBox.value()
-        
+
         self.files = list(fixesDict.keys())
         # now go through all the files
         self.progress = 0
@@ -2005,11 +2147,11 @@
         self.cancelled = False
         self.__onlyFixes = fixesDict
         self.check()
-    
+
     def __getSelectedFixableItems(self):
         """
         Private method to extract all selected items for fixable issues.
-        
+
         @return selected items for fixable issues
         @rtype list of QTreeWidgetItem
         """
@@ -2022,32 +2164,31 @@
                         fixableItems.append(citm)
             elif self.__itemFixable(itm) and itm not in fixableItems:
                 fixableItems.append(itm)
-        
+
         return fixableItems
-    
+
     def __itemFixable(self, itm):
         """
         Private method to check, if an item has a fixable issue.
-        
+
         @param itm item to be checked
         @type QTreeWidgetItem
         @return flag indicating a fixable issue
         @rtype bool
         """
-        return (itm.data(0, self.fixableRole) and
-                not itm.data(0, self.ignoredRole))
-    
+        return itm.data(0, self.fixableRole) and not itm.data(0, self.ignoredRole)
+
     def __initFuturesList(self, selectedFutures):
         """
         Private method to set the selected status of the future imports.
-        
+
         @param selectedFutures comma separated list of expected future imports
         @type str
         """
         expectedImports = (
             [i.strip() for i in selectedFutures.split(",") if bool(i.strip())]
-            if selectedFutures else
-            []
+            if selectedFutures
+            else []
         )
         for row in range(self.futuresList.count()):
             itm = self.futuresList.item(row)
@@ -2055,11 +2196,11 @@
                 itm.setCheckState(Qt.CheckState.Checked)
             else:
                 itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     def __getSelectedFutureImports(self):
         """
         Private method to get the expected future imports.
-        
+
         @return expected future imports as a comma separated string
         @rtype str
         """
@@ -2069,11 +2210,11 @@
             if itm.checkState() == Qt.CheckState.Checked:
                 selectedFutures.append(itm.text())
         return ", ".join(selectedFutures)
-    
+
     def __initBuiltinsIgnoreList(self, builtinsIgnoreDict):
         """
         Private method to populate the list of shadowed builtins to be ignored.
-        
+
         @param builtinsIgnoreDict dictionary containing the builtins
             assignments to be ignored
         @type dict of list of str
@@ -2082,14 +2223,14 @@
         for left, rightList in builtinsIgnoreDict.items():
             for right in rightList:
                 QTreeWidgetItem(self.builtinsAssignmentList, [left, right])
-        
+
         self.on_builtinsAssignmentList_itemSelectionChanged()
-    
+
     def __getBuiltinsIgnoreList(self):
         """
         Private method to get a dictionary containing the builtins assignments
         to be ignored.
-        
+
         @return dictionary containing the builtins assignments to be ignored
         @rtype dict of list of str
         """
@@ -2100,30 +2241,30 @@
             if left not in builtinsIgnoreDict:
                 builtinsIgnoreDict[left] = []
             builtinsIgnoreDict[left].append(right)
-        
+
         return builtinsIgnoreDict
-    
+
     @pyqtSlot()
     def on_builtinsAssignmentList_itemSelectionChanged(self):
         """
         Private slot to react upon changes of the selected builtin assignments.
         """
         self.deleteBuiltinButton.setEnabled(
-            len(self.builtinsAssignmentList.selectedItems()) > 0)
-    
+            len(self.builtinsAssignmentList.selectedItems()) > 0
+        )
+
     @pyqtSlot()
     def on_addBuiltinButton_clicked(self):
         """
         Private slot to add a built-in assignment to be ignored.
         """
-        from .CodeStyleAddBuiltinIgnoreDialog import (
-            CodeStyleAddBuiltinIgnoreDialog
-        )
+        from .CodeStyleAddBuiltinIgnoreDialog import CodeStyleAddBuiltinIgnoreDialog
+
         dlg = CodeStyleAddBuiltinIgnoreDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             left, right = dlg.getData()
             QTreeWidgetItem(self.builtinsAssignmentList, [left, right])
-    
+
     @pyqtSlot()
     def on_deleteBuiltinButton_clicked(self):
         """
@@ -2133,20 +2274,19 @@
             index = self.builtinsAssignmentList.indexOfTopLevelItem(itm)
             self.builtinsAssignmentList.takeTopLevelItem(index)
             del itm
-    
+
     def __initCategoriesList(self, enabledCategories):
         """
         Private method to set the enabled status of the checker categories.
-        
+
         @param enabledCategories comma separated list of enabled checker
             categories
         @type str
         """
         enabledCategoriesList = (
-            [c.strip() for c in enabledCategories.split(",")
-             if bool(c.strip())]
-            if enabledCategories else
-            list(CodeStyleCheckerDialog.checkCategories.keys())
+            [c.strip() for c in enabledCategories.split(",") if bool(c.strip())]
+            if enabledCategories
+            else list(CodeStyleCheckerDialog.checkCategories.keys())
         )
         for row in range(self.categoriesList.count()):
             itm = self.categoriesList.item(row)
@@ -2154,11 +2294,11 @@
                 itm.setCheckState(Qt.CheckState.Checked)
             else:
                 itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     def __getCategories(self, enabled, asList=False):
         """
         Private method to get the enabled or disabled checker categories.
-        
+
         @param enabled flag indicating to return enabled categories
         @type bool
         @param asList flag indicating to return the checker categories as a
@@ -2168,7 +2308,7 @@
         @rtype str or list of str
         """
         state = Qt.CheckState.Checked if enabled else Qt.CheckState.Unchecked
-        
+
         checkerList = []
         for row in range(self.categoriesList.count()):
             itm = self.categoriesList.item(row)
@@ -2178,17 +2318,17 @@
             return checkerList
         else:
             return ", ".join(checkerList)
-    
+
     def __assembleExcludeMessages(self):
         """
         Private method to assemble the list of excluded checks.
-        
+
         @return list of excluded checks as a comma separated string.
         @rtype str
         """
         excludeMessages = self.excludeMessagesEdit.text()
         disabledCategories = self.__getCategories(False)
-        
+
         if excludeMessages and disabledCategories:
             return disabledCategories + "," + excludeMessages
         elif disabledCategories:
@@ -2197,7 +2337,7 @@
             return excludeMessages
         else:
             return ""
-    
+
     def __cleanupData(self):
         """
         Private method to clean the loaded/entered data of redundant entries.
@@ -2205,65 +2345,62 @@
         # Migrate single letter exclude messages to disabled checker categories
         # and delete them from exlude messages
         excludedMessages = [
-            m.strip()
-            for m in self.excludeMessagesEdit.text().split(",")
-            if bool(m)
+            m.strip() for m in self.excludeMessagesEdit.text().split(",") if bool(m)
         ]
-        excludedMessageCategories = [
-            c for c in excludedMessages if len(c) == 1
-        ]
+        excludedMessageCategories = [c for c in excludedMessages if len(c) == 1]
         enabledCheckers = self.__getCategories(True, asList=True)
         for category in excludedMessageCategories:
             if category in enabledCheckers:
                 enabledCheckers.remove(category)
             excludedMessages.remove(category)
-        
+
         # Remove excluded messages of an already excluded category
         disabledCheckers = self.__getCategories(False, asList=True)
         for message in excludedMessages[:]:
             if message[0] in disabledCheckers:
                 excludedMessages.remove(message)
-        
+
         self.excludeMessagesEdit.setText(",".join(excludedMessages))
         self.__initCategoriesList(",".join(enabledCheckers))
-    
+
     def __initCommentedCodeCheckerWhiteList(self, whitelist):
         """
         Private method to populate the list of commented code whitelist
         patterns.
-        
+
         @param whitelist list of commented code whitelist patterns
         @type list of str
         """
         self.whitelistWidget.clear()
-        
+
         for pattern in whitelist:
             QListWidgetItem(pattern, self.whitelistWidget)
-        
+
         self.on_whitelistWidget_itemSelectionChanged()
-    
+
     def __getCommentedCodeCheckerWhiteList(self):
         """
         Private method to get the list of commented code whitelist patterns.
-        
+
         @return list of commented code whitelist patterns
         @rtype list of str
         """
         whitelist = []
-        
+
         for row in range(self.whitelistWidget.count()):
             whitelist.append(self.whitelistWidget.item(row).text())
-        
+
         return whitelist
-    
+
     @pyqtSlot()
     def on_whitelistWidget_itemSelectionChanged(self):
         """
         Private slot to react upon changes of the selected whitelist patterns.
         """
         self.deleteWhitelistButton.setEnabled(
-            len(self.whitelistWidget.selectedItems()) > 0)
-    
+            len(self.whitelistWidget.selectedItems()) > 0
+        )
+
     @pyqtSlot()
     def on_addWhitelistButton_clicked(self):
         """
@@ -2273,10 +2410,11 @@
             self,
             self.tr("Commented Code Whitelist Pattern"),
             self.tr("Enter a Commented Code Whitelist Pattern"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and pattern:
             QListWidgetItem(pattern, self.whitelistWidget)
-    
+
     @pyqtSlot()
     def on_deleteWhitelistButton_clicked(self):
         """
@@ -2286,7 +2424,7 @@
             row = self.whitelistWidget.row(itm)
             self.whitelistWidget.takeItem(row)
             del itm
-    
+
     @pyqtSlot()
     def on_filterButton_clicked(self):
         """
@@ -2294,7 +2432,7 @@
         code.
         """
         selectedMessageCode = self.filterComboBox.currentText()
-        
+
         for topRow in range(self.resultList.topLevelItemCount()):
             topItem = self.resultList.topLevelItem(topRow)
             topItem.setExpanded(True)
@@ -2303,8 +2441,8 @@
                 childItem = topItem.child(childIndex)
                 hideChild = (
                     childItem.data(0, self.codeRole) != selectedMessageCode
-                    if selectedMessageCode else
-                    False
+                    if selectedMessageCode
+                    else False
                 )
                 childItem.setHidden(hideChild)
                 if hideChild:
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,7 @@
 def setItemIcon(itm, column, msgCode, severity=None):
     """
     Function to set the icon of the passed message item.
-    
+
     @param itm reference to the message item
     @type QTreeWidgetItem
     @param column column for the icon
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCodeSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCodeSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     """
     Class implementing a dialog to select code style message codes.
     """
+
     def __init__(self, codes, categories, showFixCodes, parent=None):
         """
         Constructor
-        
+
         @param codes comma separated list of selected codes
         @type str
         @param categories list of message categories to omit
@@ -39,25 +40,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         textWrapper = textwrap.TextWrapper(width=60)
-        
+
         self.codeTable.headerItem().setText(self.codeTable.columnCount(), "")
         codeList = [code.strip() for code in codes.split(",") if code.strip()]
         if categories:
             codeList = [code for code in codeList if code[0] not in categories]
-        
+
         if showFixCodes:
             from .CodeStyleFixer import FixableCodeStyleIssues
+
             selectableCodes = FixableCodeStyleIssues
         else:
-            selectableCodes = (
-                [x for x in getMessageCodes() if not x.startswith('FIX')]
-            )
+            selectableCodes = [x for x in getMessageCodes() if not x.startswith("FIX")]
             if categories:
                 # filter by category
-                selectableCodes = [x for x in selectableCodes
-                                   if x[0] not in categories]
+                selectableCodes = [x for x in selectableCodes if x[0] not in categories]
         for msgCode in sorted(selectableCodes):
             message = getTranslatedMessage(msgCode, [], example=True)
             if message is None:
@@ -70,8 +69,9 @@
                         break
                 else:
                     continue
-            itm = QTreeWidgetItem(self.codeTable, [
-                msgCode, "\n".join(textWrapper.wrap(message))])
+            itm = QTreeWidgetItem(
+                self.codeTable, [msgCode, "\n".join(textWrapper.wrap(message))]
+            )
             CodeStyleCheckerUtilities.setItemIcon(itm, 0, msgCode)
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             if msgCode in codeList:
@@ -82,21 +82,21 @@
         self.codeTable.resizeColumnToContents(0)
         self.codeTable.resizeColumnToContents(1)
         self.codeTable.header().setStretchLastSection(True)
-        
+
         self.__extraCodes = codeList[:]
-    
+
     def getSelectedCodes(self):
         """
         Public method to get a comma separated list of codes selected.
-        
+
         @return comma separated list of selected codes
         @rtype str
         """
         selectedCodes = []
-        
+
         for index in range(self.codeTable.topLevelItemCount()):
             itm = self.codeTable.topLevelItem(index)
             if itm.checkState(0) == Qt.CheckState.Checked:
                 selectedCodes.append(itm.text(0))
-        
+
         return ", ".join(self.__extraCodes + selectedCodes)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,82 @@
     import pycodestyle
 
 FixableCodeStyleIssues = [
-    "D111", "D112", "D121", "D131", "D141", "D142",
-    "D143", "D144", "D145",
-    "D221", "D222", "D231", "D242", "D243", "D244",
-    "D245", "D246", "D247",
-    "E101", "E111", "E121", "E122", "E123", "E124",
-    "E125", "E126", "E127", "E128", "E133", "E201",
-    "E202", "E203", "E211", "E221", "E222", "E223",
-    "E224", "E225", "E226", "E227", "E228", "E231",
-    "E241", "E242", "E251", "E261", "E262", "E271",
-    "E272", "E273", "E274", "E301", "E302", "E303",
-    "E304", "E305", "E306", "E307", "E308", "E401",
-    "E501", "E502", "E701", "E702", "E703", "E711",
+    "D111",
+    "D112",
+    "D121",
+    "D131",
+    "D141",
+    "D142",
+    "D143",
+    "D144",
+    "D145",
+    "D221",
+    "D222",
+    "D231",
+    "D242",
+    "D243",
+    "D244",
+    "D245",
+    "D246",
+    "D247",
+    "E101",
+    "E111",
+    "E121",
+    "E122",
+    "E123",
+    "E124",
+    "E125",
+    "E126",
+    "E127",
+    "E128",
+    "E133",
+    "E201",
+    "E202",
+    "E203",
+    "E211",
+    "E221",
+    "E222",
+    "E223",
+    "E224",
+    "E225",
+    "E226",
+    "E227",
+    "E228",
+    "E231",
+    "E241",
+    "E242",
+    "E251",
+    "E261",
+    "E262",
+    "E271",
+    "E272",
+    "E273",
+    "E274",
+    "E301",
+    "E302",
+    "E303",
+    "E304",
+    "E305",
+    "E306",
+    "E307",
+    "E308",
+    "E401",
+    "E501",
+    "E502",
+    "E701",
+    "E702",
+    "E703",
+    "E711",
     "E712",
-    "N804", "N805", "N806",
-    "W191", "W291", "W292", "W293", "W391", "W603",
+    "N804",
+    "N805",
+    "N806",
+    "W191",
+    "W291",
+    "W292",
+    "W293",
+    "W391",
+    "W603",
 ]
 
 
@@ -41,11 +102,22 @@
     """
     Class implementing a fixer for certain code style issues.
     """
-    def __init__(self, filename, sourceLines, fixCodes, noFixCodes,
-                 maxLineLength, blankLines, inPlace, eol, backup=False):
+
+    def __init__(
+        self,
+        filename,
+        sourceLines,
+        fixCodes,
+        noFixCodes,
+        maxLineLength,
+        blankLines,
+        inPlace,
+        eol,
+        backup=False,
+    ):
         """
         Constructor
-        
+
         @param filename name of the file to be fixed
         @type str
         @param sourceLines list of source lines including eol marker
@@ -71,30 +143,30 @@
         @type bool
         """
         super().__init__()
-        
+
         self.__filename = filename
         self.__origName = ""
         self.__source = sourceLines[:]  # save a copy
         self.__fixCodes = [c.strip() for c in fixCodes.split(",") if c.strip()]
-        self.__noFixCodes = [
-            c.strip() for c in noFixCodes.split(",") if c.strip()]
+        self.__noFixCodes = [c.strip() for c in noFixCodes.split(",") if c.strip()]
         self.__maxLineLength = maxLineLength
         self.__blankLines = {
             "toplevel": blankLines[0],
             "method": blankLines[1],
         }
         self.fixed = 0
-        
+
         self.__reindenter = None
         self.__indentWord = self.__getIndentWord()
-        
+
         if inPlace:
             self.__createBackup = backup
         else:
             self.__origName = self.__filename
             self.__filename = os.path.join(
                 os.path.dirname(self.__filename),
-                "fixed_" + os.path.basename(self.__filename))
+                "fixed_" + os.path.basename(self.__filename),
+            )
             self.__createBackup = False
         self.__eol = eol
 
@@ -183,85 +255,87 @@
         self.__stack = []
         # These need to be fixed before the file is saved but after all
         # inline fixes.
-        
+
         self.__multiLineNumbers = None
         self.__docLineNumbers = None
-        
+
         self.__lastID = 0
-    
+
     def saveFile(self, encoding):
         """
         Public method to save the modified file.
-        
+
         @param encoding encoding of the source file (string)
         @return error message on failure (tuple of str)
         """
         import codecs
-        
+
         if not self.__modified:
             # no need to write
             return None
-        
+
         if self.__createBackup:
             # create a backup file before writing any changes
             if os.path.islink(self.__filename):
-                bfn = '{0}~'.format(os.path.realpath(self.__filename))
+                bfn = "{0}~".format(os.path.realpath(self.__filename))
             else:
-                bfn = '{0}~'.format(self.__filename)
+                bfn = "{0}~".format(self.__filename)
             with contextlib.suppress(OSError):
                 os.remove(bfn)
             with contextlib.suppress(OSError):
                 os.rename(self.__filename, bfn)
-        
+
         txt = "".join(self.__source)
         try:
-            enc = 'utf-8' if encoding == 'utf-8-bom' else encoding
+            enc = "utf-8" if encoding == "utf-8-bom" else encoding
             txt = txt.encode(enc)
-            if encoding == 'utf-8-bom':
+            if encoding == "utf-8-bom":
                 txt = codecs.BOM_UTF8 + txt
-            
+
             with open(self.__filename, "wb") as fp:
                 fp.write(txt)
         except (OSError, UnicodeError) as err:
             # Could not save the file! Skipping it. Reason: {0}
             return ("FIXWRITE_ERROR", [str(err)])
-        
+
         return None
-    
+
     def __codeMatch(self, code):
         """
         Private method to check, if the code should be fixed.
-        
+
         @param code to check (string)
         @return flag indicating it should be fixed (boolean)
         """
+
         def mutualStartswith(a, b):
             """
             Local helper method to compare the beginnings of two strings
             against each other.
-            
+
             @return flag indicating that one string starts with the other
                 (boolean)
             """
             return b.startswith(a) or a.startswith(b)
-        
-        if (
-            self.__noFixCodes and
-            any(mutualStartswith(code.lower(), noFixCode.lower())
-                for noFixCode in [c.strip() for c in self.__noFixCodes])
+
+        if self.__noFixCodes and any(
+            mutualStartswith(code.lower(), noFixCode.lower())
+            for noFixCode in [c.strip() for c in self.__noFixCodes]
         ):
             return False
 
         if self.__fixCodes:
-            return any(mutualStartswith(code.lower(), fixCode.lower())
-                       for fixCode in [c.strip() for c in self.__fixCodes])
+            return any(
+                mutualStartswith(code.lower(), fixCode.lower())
+                for fixCode in [c.strip() for c in self.__fixCodes]
+            )
 
         return True
-    
+
     def fixIssue(self, line, pos, code):
         """
         Public method to fix the fixable issues.
-        
+
         @param line line number of the issue
         @type int
         @param pos position inside line
@@ -274,9 +348,9 @@
         @rtype tuple of (int, str, list, int)
         """
         if (
-            line <= len(self.__source) and
-            self.__codeMatch(code) and
-            code in self.__fixes
+            line <= len(self.__source)
+            and self.__codeMatch(code)
+            and code in self.__fixes
         ):
             res = self.__fixes[code](code, line, pos)
             if res[0] == 1:
@@ -284,17 +358,17 @@
                 self.fixed += 1
         else:
             res = (0, "", [], 0)
-        
+
         return res
-    
+
     def finalize(self):
         """
         Public method to apply all deferred fixes.
-        
+
         @return dictionary containing the fix results
         """
         results = {}
-        
+
         # step 1: do fixes operating on logical lines first
         for id_, code, line, pos in self.__stackLogical:
             res, msg, args, _ = self.__fixes[code](code, line, pos, apply=True)
@@ -302,7 +376,7 @@
                 self.__modified = True
                 self.fixed += 1
             results[id_] = (res, msg, args)
-        
+
         # step 2: do fixes that change the number of lines
         for id_, code, line, pos in reversed(self.__stack):
             res, msg, args, _ = self.__fixes[code](code, line, pos, apply=True)
@@ -310,23 +384,23 @@
                 self.__modified = True
                 self.fixed += 1
             results[id_] = (res, msg, args)
-        
+
         return results
-    
+
     def __getID(self):
         """
         Private method to get the ID for a deferred fix.
-        
+
         @return ID for a deferred fix (integer)
         """
         self.__lastID += 1
         return self.__lastID
-    
+
     def __findLogical(self):
         """
         Private method to extract the index of all the starts and ends of
         lines.
-        
+
         @return tuple containing two lists of integer with start and end tuples
             of lines
         """
@@ -336,9 +410,13 @@
         sio = StringIO("".join(self.__source))
         parens = 0
         for t in tokenize.generate_tokens(sio.readline):
-            if t[0] in [tokenize.COMMENT, tokenize.DEDENT,
-                        tokenize.INDENT, tokenize.NL,
-                        tokenize.ENDMARKER]:
+            if t[0] in [
+                tokenize.COMMENT,
+                tokenize.DEDENT,
+                tokenize.INDENT,
+                tokenize.NL,
+                tokenize.ENDMARKER,
+            ]:
                 continue
             if not parens and t[0] in [tokenize.NEWLINE, tokenize.SEMI]:
                 last_newline = True
@@ -348,17 +426,17 @@
                 logical_start.append((t[2][0] - 1, t[2][1]))
                 last_newline = False
             if t[0] == tokenize.OP:
-                if t[1] in '([{':
+                if t[1] in "([{":
                     parens += 1
-                elif t[1] in '}])':
+                elif t[1] in "}])":
                     parens -= 1
         return logical_start, logical_end
-    
+
     def __getLogical(self, line, pos):
         """
         Private method to get the logical line corresponding to the given
         position.
-        
+
         @param line line number of the issue (integer)
         @param pos position inside line (integer)
         @return tuple of a tuple of two integers giving the start of the
@@ -382,39 +460,39 @@
                 break
         if ls is None:
             return None
-        
-        original = self.__source[ls[0]:le[0] + 1]
+
+        original = self.__source[ls[0] : le[0] + 1]
         return ls, le, original
-    
+
     def __getIndentWord(self):
         """
         Private method to determine the indentation type.
-        
+
         @return string to be used for an indentation (string)
         """
         sio = StringIO("".join(self.__source))
-        indentWord = "    "     # default in case of failure
+        indentWord = "    "  # default in case of failure
         with contextlib.suppress(SyntaxError, tokenize.TokenError):
             for token in tokenize.generate_tokens(sio.readline):
                 if token[0] == tokenize.INDENT:
                     indentWord = token[1]
                     break
         return indentWord
-    
+
     def __getIndent(self, line):
         """
         Private method to get the indentation string.
-        
+
         @param line line to determine the indentation string from (string)
         @return indentation string (string)
         """
         return line.replace(line.lstrip(), "")
-    
+
     def __multilineStringLines(self):
         """
         Private method to determine the line numbers that are within multi line
         strings and these which are part of a documentation string.
-        
+
         @return tuple of a set of line numbers belonging to a multi line
             string and a set of line numbers belonging to a multi line
             documentation string (tuple of two set of integer)
@@ -424,31 +502,29 @@
             sio = StringIO(source)
             self.__multiLineNumbers = set()
             self.__docLineNumbers = set()
-            previousTokenType = ''
+            previousTokenType = ""
             with contextlib.suppress(SyntaxError, tokenize.TokenError):
                 for t in tokenize.generate_tokens(sio.readline):
                     tokenType = t[0]
                     startRow = t[2][0]
                     endRow = t[3][0]
 
-                    if (tokenType == tokenize.STRING and startRow != endRow):
+                    if tokenType == tokenize.STRING and startRow != endRow:
                         if previousTokenType != tokenize.INDENT:
-                            self.__multiLineNumbers |= set(
-                                range(startRow, 1 + endRow))
+                            self.__multiLineNumbers |= set(range(startRow, 1 + endRow))
                         else:
-                            self.__docLineNumbers |= set(
-                                range(startRow, 1 + endRow))
+                            self.__docLineNumbers |= set(range(startRow, 1 + endRow))
 
                     previousTokenType = tokenType
-        
+
         return self.__multiLineNumbers, self.__docLineNumbers
-    
+
     def __fixReindent(self, line, pos, logical):
         """
         Private method to fix a badly indented line.
 
         This is done by adding or removing from its initial indent only.
-        
+
         @param line line number of the issue (integer)
         @param pos position inside line (integer)
         @param logical logical line structure
@@ -457,14 +533,14 @@
         """
         if not logical:
             raise ValueError("Bad value for 'logical' parameter.")
-        
+
         ls, _, original = logical
 
         rewrapper = IndentationWrapper(original)
         valid_indents = rewrapper.pep8Expected()
         if not rewrapper.rel_indent:
             return False
-        
+
         if line > ls[0]:
             # got a valid continuation line number
             row = line - ls[0] - 1
@@ -473,14 +549,14 @@
             got = rewrapper.rel_indent[row]
         else:
             return False
-        
+
         line1 = ls[0] + row
         # always pick the expected indent, for now.
         indent_to = valid[0]
 
         if got != indent_to:
             orig_line = self.__source[line1]
-            new_line = ' ' * (indent_to) + orig_line.lstrip()
+            new_line = " " * (indent_to) + orig_line.lstrip()
             if new_line == orig_line:
                 return False
             else:
@@ -488,11 +564,11 @@
                 return True
         else:
             return False
-    
+
     def __fixWhitespace(self, line, offset, replacement):
         """
         Private method to correct whitespace at the given offset.
-        
+
         @param line line to be corrected (string)
         @param offset offset within line (integer)
         @param replacement replacement string (string)
@@ -504,13 +580,13 @@
             return line
         else:
             return left + replacement + right
-    
+
     def __fixD111(self, code, line, pos):
         """
         Private method to fix docstring enclosed in wrong quotes.
-       
+
         Codes: D111
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -523,8 +599,7 @@
         @rtype tuple of (int, str, list or int, int)
         """
         line -= 1
-        quotes = re.match(r"""\s*[ru]?('''|'|\")""",
-                          self.__source[line]).group(1)
+        quotes = re.match(r"""\s*[ru]?('''|'|\")""", self.__source[line]).group(1)
         left, right = self.__source[line].split(quotes, 1)
         self.__source[line] = left + '"""' + right
         while line < len(self.__source):
@@ -533,16 +608,16 @@
                 self.__source[line] = left + '"""' + right
                 break
             line += 1
-        
+
         # Triple single quotes converted to triple double quotes.
         return (1, "FIXD111", [], 0)
-    
+
     def __fixD112(self, code, line, pos):
         """
         Private method to fix docstring 'r' in leading quotes.
-        
+
         Codes: D112
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -559,22 +634,22 @@
             insertChar = "r"
         else:
             return (0, "", 0)
-        
+
         newText = (
-            self.__getIndent(self.__source[line]) +
-            insertChar +
-            self.__source[line].lstrip()
+            self.__getIndent(self.__source[line])
+            + insertChar
+            + self.__source[line].lstrip()
         )
         self.__source[line] = newText
         # Introductory quotes corrected to be {0}"""
-        return (1, 'FIXD112', [insertChar], 0)
-    
+        return (1, "FIXD112", [insertChar], 0)
+
     def __fixD121(self, code, line, pos, apply=False):
         """
         Private method to fix a single line docstring on multiple lines.
-       
+
         Codes: D121
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -590,21 +665,17 @@
         """
         if apply:
             line -= 1
-            if not self.__source[line].lstrip().startswith(
-                    ('"""', 'r"""', 'u"""')):
+            if not self.__source[line].lstrip().startswith(('"""', 'r"""', 'u"""')):
                 # only correctly formatted docstrings will be fixed
                 return (0, "", [], 0)
-            
-            docstring = (
-                self.__source[line].rstrip() +
-                self.__source[line + 1].strip()
-            )
+
+            docstring = self.__source[line].rstrip() + self.__source[line + 1].strip()
             if docstring.endswith('"""'):
                 docstring += self.__eol
             else:
                 docstring += self.__source[line + 2].lstrip()
                 self.__source[line + 2] = ""
-            
+
             self.__source[line] = docstring
             self.__source[line + 1] = ""
             # Single line docstring put on one line.
@@ -613,14 +684,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD131(self, code, line, pos):
         """
         Private method to fix a docstring summary not ending with a
         period.
-       
+
         Codes: D131
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -634,41 +705,41 @@
         """
         line -= 1
         newText = ""
-        if (
-            self.__source[line].rstrip().endswith(('"""', "'''")) and
-            self.__source[line].lstrip().startswith(('"""', 'r"""', 'u"""'))
-        ):
+        if self.__source[line].rstrip().endswith(('"""', "'''")) and self.__source[
+            line
+        ].lstrip().startswith(('"""', 'r"""', 'u"""')):
             # it is a one-liner
             newText = (
-                self.__source[line].rstrip()[:-3].rstrip() +
-                "." +
-                self.__source[line].rstrip()[-3:] +
-                self.__eol
+                self.__source[line].rstrip()[:-3].rstrip()
+                + "."
+                + self.__source[line].rstrip()[-3:]
+                + self.__eol
             )
         else:
-            if (
-                line < len(self.__source) - 1 and
-                (not self.__source[line + 1].strip() or
-                 self.__source[line + 1].lstrip().startswith("@") or
-                 (self.__source[line + 1].strip() in ('"""', "'''") and
-                  not self.__source[line].lstrip().startswith("@")))
+            if line < len(self.__source) - 1 and (
+                not self.__source[line + 1].strip()
+                or self.__source[line + 1].lstrip().startswith("@")
+                or (
+                    self.__source[line + 1].strip() in ('"""', "'''")
+                    and not self.__source[line].lstrip().startswith("@")
+                )
             ):
                 newText = self.__source[line].rstrip() + "." + self.__eol
-        
+
         if newText:
             self.__source[line] = newText
             # Period added to summary line.
             return (1, "FIXD131", [], 0)
         else:
             return (0, "", [], 0)
-    
+
     def __fixD141(self, code, line, pos, apply=False):
         """
         Private method to fix a function/method docstring preceded by a
         blank line.
-       
+
         Codes: D141
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -691,14 +762,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD142(self, code, line, pos, apply=False):
         """
         Private method to fix a class docstring not preceded by a
         blank line.
-       
+
         Codes: D142
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -721,14 +792,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD143(self, code, line, pos, apply=False):
         """
         Private method to fix a class docstring not followed by a
         blank line.
-       
+
         Codes: D143
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -751,14 +822,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD144(self, code, line, pos, apply=False):
         """
         Private method to fix a docstring summary not followed by a
         blank line.
-       
+
         Codes: D144
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -777,7 +848,7 @@
             if not self.__source[line].rstrip().endswith("."):
                 # only correct summary lines can be fixed here
                 return (0, "", 0)
-            
+
             self.__source[line] += self.__eol
             # Blank line inserted after docstring summary.
             return (1, "FIXD144", [], 0)
@@ -785,14 +856,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD145(self, code, line, pos, apply=False):
         """
         Private method to fix the last paragraph of a multi-line docstring
         not followed by a blank line.
-       
+
         Codes: D143
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -815,14 +886,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD221(self, code, line, pos, apply=False):
         """
         Private method to fix leading and trailing quotes of docstring
         not on separate lines.
-       
+
         Codes: D221, D222
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -849,14 +920,7 @@
             else:
                 # trailing
                 first, second = source[:-3].strip(), source[-3:]
-            newText = (
-                indent +
-                first +
-                self.__eol +
-                indent +
-                second +
-                self.__eol
-            )
+            newText = indent + first + self.__eol + indent + second + self.__eol
             self.__source[line] = newText
             if code == "D221":
                 # Leading quotes put on separate line.
@@ -869,14 +933,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD242(self, code, line, pos, apply=False):
         """
         Private method to fix a class or function/method docstring preceded
         by a blank line.
-       
+
         Codes: D242, D244
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -904,14 +968,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD243(self, code, line, pos, apply=False):
         """
         Private method to fix a class or function/method docstring followed
         by a blank line.
-       
+
         Codes: D243, D245
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -939,14 +1003,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixD247(self, code, line, pos, apply=False):
         """
         Private method to fix a last paragraph of a docstring followed
         by a blank line.
-       
+
         Codes: D247
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -969,13 +1033,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE101(self, code, line, pos):
         """
         Private method to fix obsolete tab usage and indentation errors.
-        
+
         Codes: E101, E111, W191
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1002,14 +1066,14 @@
             return (1, msg, [], 0)
         else:
             return (0, "", [], 0)
-    
+
     def __fixE121(self, code, line, pos, apply=False):
         """
         Private method to fix the indentation of continuation lines and
         closing brackets.
-       
+
         Codes: E121, E124
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1041,13 +1105,13 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE122(self, code, line, pos, apply=False):
         """
         Private method to fix a missing indentation of continuation lines.
-        
+
         Codes: E122
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1072,8 +1136,7 @@
                     text = self.__source[line]
                     indentation = self.__getIndent(text)
                     self.__source[line] = (
-                        indentation +
-                        self.__indentWord + text.lstrip()
+                        indentation + self.__indentWord + text.lstrip()
                     )
                 # Missing indentation of continuation line corrected.
                 return (1, "FIXE122", [], 0)
@@ -1082,13 +1145,13 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE123(self, code, line, pos, apply=False):
         """
         Private method to fix the indentation of a closing bracket lines.
-        
+
         Codes: E123
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1124,14 +1187,14 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE125(self, code, line, pos, apply=False):
         """
         Private method to fix the indentation of continuation lines not
         distinguishable from next logical line.
-       
+
         Codes: E125
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1154,8 +1217,7 @@
                     row = line - 1
                     text = self.__source[row]
                     self.__source[row] = (
-                        self.__getIndent(text) +
-                        self.__indentWord + text.lstrip()
+                        self.__getIndent(text) + self.__indentWord + text.lstrip()
                     )
                 # Indentation level changed.
                 return (1, "FIXE125", [], 0)
@@ -1164,14 +1226,14 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE126(self, code, line, pos, apply=False):
         """
         Private method to fix over-indented/under-indented hanging
         indentation.
-       
+
         Codes: E126, E133
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1193,8 +1255,9 @@
                 row = line - 1
                 text = self.__source[row]
                 newText = (
-                    self.__getIndent(logicalLines[0]) +
-                    self.__indentWord + text.lstrip()
+                    self.__getIndent(logicalLines[0])
+                    + self.__indentWord
+                    + text.lstrip()
                 )
                 if newText == text:
                     # fall back to slower method
@@ -1210,13 +1273,13 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE127(self, code, line, pos, apply=False):
         """
         Private method to fix over/under indented lines.
-       
+
         Codes: E127, E128
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1238,16 +1301,16 @@
                 row = line - 1
                 text = self.__source[row]
                 newText = text
-                
-                if logicalLines[0].rstrip().endswith('\\'):
+
+                if logicalLines[0].rstrip().endswith("\\"):
                     newText = (
-                        self.__getIndent(logicalLines[0]) +
-                        self.__indentWord +
-                        text.lstrip()
+                        self.__getIndent(logicalLines[0])
+                        + self.__indentWord
+                        + text.lstrip()
                     )
                 else:
                     startIndex = None
-                    for symbol in '([{':
+                    for symbol in "([{":
                         if symbol in logicalLines[0]:
                             foundIndex = logicalLines[0].find(symbol) + 1
                             if startIndex is None:
@@ -1256,8 +1319,8 @@
                                 startIndex = min(startIndex, foundIndex)
 
                     if startIndex is not None:
-                        newText = startIndex * ' ' + text.lstrip()
-                    
+                        newText = startIndex * " " + text.lstrip()
+
                 if newText == text:
                     # fall back to slower method
                     changed = self.__fixReindent(line, pos, logical)
@@ -1272,13 +1335,13 @@
             fixId = self.__getID()
             self.__stackLogical.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE201(self, code, line, pos):
         """
         Private method to fix extraneous whitespace.
-       
+
         Codes: E201, E202, E203, E211
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1292,25 +1355,25 @@
         """
         line -= 1
         text = self.__source[line]
-        
-        if '"""' in text or "'''" in text or text.rstrip().endswith('\\'):
+
+        if '"""' in text or "'''" in text or text.rstrip().endswith("\\"):
             return (0, "", [], 0)
-        
-        newText = self.__fixWhitespace(text, pos, '')
+
+        newText = self.__fixWhitespace(text, pos, "")
         if newText == text:
             return (0, "", [], 0)
-        
+
         self.__source[line] = newText
         # Extraneous whitespace removed.
         return (1, "FIXE201", [], 0)
-    
+
     def __fixE221(self, code, line, pos):
         """
         Private method to fix extraneous whitespace around operator or
         keyword.
-       
+
         Codes: E221, E222, E223, E224, E241, E242, E271, E272, E273, E274
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1324,23 +1387,23 @@
         """
         line -= 1
         text = self.__source[line]
-        
-        if '"""' in text or "'''" in text or text.rstrip().endswith('\\'):
+
+        if '"""' in text or "'''" in text or text.rstrip().endswith("\\"):
             return (0, "", [], 0)
-        
-        newText = self.__fixWhitespace(text, pos, ' ')
+
+        newText = self.__fixWhitespace(text, pos, " ")
         if newText == text:
             return (0, "", [], 0)
-        
+
         self.__source[line] = newText
         return (1, "FIXE221", [], 0)
-    
+
     def __fixE225(self, code, line, pos):
         """
         Private method to fix extraneous whitespaces around operator.
-       
+
         Codes: E225, E226, E227, E228
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1354,13 +1417,13 @@
         """
         line -= 1
         text = self.__source[line]
-        
-        if '"""' in text or "'''" in text or text.rstrip().endswith('\\'):
+
+        if '"""' in text or "'''" in text or text.rstrip().endswith("\\"):
             return (0, "", [], 0)
-        
+
         newText = text
         # determine length of operator
-        tokens = '<>*/=^&|%!+-'
+        tokens = "<>*/=^&|%!+-"
         pos2 = pos
         token_delimiter = len(tokens)
         for _ in range(3):
@@ -1370,22 +1433,22 @@
                 token_delimiter = 5
             else:
                 break
-        if pos2 < len(text) and text[pos2] not in ' \t':
-            newText = self.__fixWhitespace(newText, pos2, ' ')
-        newText = self.__fixWhitespace(newText, pos, ' ')
+        if pos2 < len(text) and text[pos2] not in " \t":
+            newText = self.__fixWhitespace(newText, pos2, " ")
+        newText = self.__fixWhitespace(newText, pos, " ")
         if newText == text:
             return (0, "", [], 0)
-        
+
         self.__source[line] = newText
         # Missing whitespaces added.
         return (1, "FIXE225", [], 0)
-    
+
     def __fixE231(self, code, line, pos):
         """
         Private method to fix missing whitespace after ',;:'.
-        
+
         Codes: E231
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1400,20 +1463,18 @@
         line -= 1
         pos += 1
         self.__source[line] = (
-            self.__source[line][:pos] +
-            " " +
-            self.__source[line][pos:]
+            self.__source[line][:pos] + " " + self.__source[line][pos:]
         )
         # Missing whitespace added.
         return (1, "FIXE231", [], 0)
-    
+
     def __fixE251(self, code, line, pos):
         """
         Private method to fix extraneous whitespace around keyword and
         default parameter equals.
-       
+
         Codes: E251
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1427,32 +1488,30 @@
         """
         line -= 1
         text = self.__source[line]
-        
+
         # This is necessary since pycodestyle sometimes reports columns that
         # goes past the end of the physical line. This happens in cases like,
         # foo(bar\n=None)
         col = min(pos, len(text) - 1)
         newText = (
-            text
-            if text[col].strip() else
-            text[:col].rstrip() + text[col:].lstrip()
+            text if text[col].strip() else text[:col].rstrip() + text[col:].lstrip()
         )
-        
+
         # There could be an escaped newline
-        if newText.endswith(('=\\\n', '=\\\r\n', '=\\\r')):
+        if newText.endswith(("=\\\n", "=\\\r\n", "=\\\r")):
             self.__source[line] = newText.rstrip("\n\r \t\\")
             self.__source[line + 1] = self.__source[line + 1].lstrip()
         else:
             self.__source[line] = newText
         # Extraneous whitespace removed.
         return (1, "FIXE251", [], 0)
-    
+
     def __fixE261(self, code, line, pos):
         """
         Private method to fix whitespace before or after inline comment.
-        
+
         Codes: E261, E262
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1466,20 +1525,20 @@
         """
         line -= 1
         text = self.__source[line]
-        left = text[:pos].rstrip(' \t#')
-        right = text[pos:].lstrip(' \t#')
+        left = text[:pos].rstrip(" \t#")
+        right = text[pos:].lstrip(" \t#")
         newText = left + ("  # " + right if right.strip() else right)
         self.__source[line] = newText
         # Whitespace around comment sign corrected.
         return (1, "FIXE261", [], 0)
-    
+
     def __fixBlankLinesBefore(self, code, line, pos, apply=False):
         """
         Private method to fix the need for blank lines before class, function
         and method definitions.
-       
+
         Codes: E301, E302, E303, E305, E306, E307, E308
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1500,7 +1559,7 @@
                 blankLinesBefore = 1
             else:
                 blankLinesBefore = self.__blankLines["toplevel"]
-            
+
             # count blank lines
             index = line - 1
             blanks = 0
@@ -1511,7 +1570,7 @@
                 else:
                     break
             delta = blanks - blankLinesBefore
-            
+
             line -= 1
             if delta < 0:
                 # insert blank lines (one or two)
@@ -1534,14 +1593,14 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE304(self, code, line, pos, apply=False):
         """
         Private method to fix superfluous blank lines after a function
         decorator.
-       
+
         Codes: E304
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1569,13 +1628,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE401(self, code, line, pos, apply=False):
         """
         Private method to fix multiple imports on one line.
-       
+
         Codes: E401
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1594,19 +1653,19 @@
             text = self.__source[line]
             if not text.lstrip().startswith("import"):
                 return (0, "", [], 0)
-            
+
             # pycodestyle (1.3.1) reports false positive if there is an import
             # statement followed by a semicolon and some unrelated
             # statement with commas in it.
-            if ';' in text:
+            if ";" in text:
                 return (0, "", [], 0)
-            
+
             newText = (
-                text[:pos].rstrip("\t ,") +
-                self.__eol +
-                self.__getIndent(text) +
-                "import " +
-                text[pos:].lstrip("\t ,")
+                text[:pos].rstrip("\t ,")
+                + self.__eol
+                + self.__getIndent(text)
+                + "import "
+                + text[pos:].lstrip("\t ,")
             )
             self.__source[line] = newText
             # Imports were put on separate lines.
@@ -1615,13 +1674,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE501(self, code, line, pos, apply=False):
         """
         Private method to fix the long lines by breaking them.
-       
+
         Codes: E501
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1636,9 +1695,7 @@
         @rtype tuple of (int, str, list or int, int)
         """
         if apply:
-            multilineStringLines, docStringLines = (
-                self.__multilineStringLines()
-            )
+            multilineStringLines, docStringLines = self.__multilineStringLines()
             isDocString = line in docStringLines
             line -= 1
             text = self.__source[line]
@@ -1651,9 +1708,14 @@
             else:
                 nextText = ""
             shortener = LineShortener(
-                text, prevText, nextText,
-                maxLength=self.__maxLineLength, eol=self.__eol,
-                indentWord=self.__indentWord, isDocString=isDocString)
+                text,
+                prevText,
+                nextText,
+                maxLength=self.__maxLineLength,
+                eol=self.__eol,
+                indentWord=self.__indentWord,
+                isDocString=isDocString,
+            )
             changed, newText, newNextText = shortener.shorten()
             if changed:
                 if newText != text:
@@ -1670,13 +1732,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE502(self, code, line, pos):
         """
         Private method to fix redundant backslash within brackets.
-       
+
         Codes: E502
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1689,18 +1751,17 @@
         @rtype tuple of (int, str, list or int, int)
         """
         self.__source[line - 1] = (
-            self.__source[line - 1].rstrip("\n\r \t\\") +
-            self.__eol
+            self.__source[line - 1].rstrip("\n\r \t\\") + self.__eol
         )
         # Redundant backslash in brackets removed.
         return (1, "FIXE502", [], 0)
-    
+
     def __fixE701(self, code, line, pos, apply=False):
         """
         Private method to fix colon-separated compound statements.
-       
+
         Codes: E701
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1718,14 +1779,14 @@
             line -= 1
             text = self.__source[line]
             pos += 1
-            
+
             newText = (
-                text[:pos] +
-                self.__eol +
-                self.__getIndent(text) +
-                self.__indentWord +
-                text[pos:].lstrip("\n\r \t\\") +
-                self.__eol
+                text[:pos]
+                + self.__eol
+                + self.__getIndent(text)
+                + self.__indentWord
+                + text[pos:].lstrip("\n\r \t\\")
+                + self.__eol
             )
             self.__source[line] = newText
             # Compound statement corrected.
@@ -1734,13 +1795,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE702(self, code, line, pos, apply=False):
         """
         Private method to fix semicolon-separated compound statements.
-        
+
         Codes: E702, E703
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1757,7 +1818,7 @@
         if apply:
             line -= 1
             text = self.__source[line]
-            
+
             if text.rstrip().endswith("\\"):
                 # normalize '1; \\\n2' into '1; 2'
                 self.__source[line] = text.rstrip("\n\r \t\\")
@@ -1774,13 +1835,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixE711(self, code, line, pos):
         """
         Private method to fix comparison with None.
-       
+
         Codes: E711, E712
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1794,36 +1855,36 @@
         """
         line -= 1
         text = self.__source[line]
-        
+
         rightPos = pos + 2
         if rightPos >= len(text):
             return (0, "", 0)
-        
+
         left = text[:pos].rstrip()
         center = text[pos:rightPos]
         right = text[rightPos:].lstrip()
-        
+
         if not right.startswith(("None", "True", "False")):
             return (0, "", [], 0)
-        
+
         if center.strip() == "==":
             center = "is"
         elif center.strip() == "!=":
             center = "is not"
         else:
             return (0, "", [], 0)
-        
+
         self.__source[line] = " ".join([left, center, right])
         # Comparison to None/True/False corrected.
         return (1, "FIXE711", [], 0)
-    
+
     def __fixN804(self, code, line, pos, apply=False):
         """
         Private method to fix a wrong first argument of normal and
         class methods.
-       
+
         Codes: N804, N805
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1844,15 +1905,15 @@
                 arg = "cls"
             else:
                 arg = "self"
-            
+
             if text.rstrip().endswith("("):
                 newText = (
-                    text +
-                    self.__getIndent(text) +
-                    self.__indentWord +
-                    arg +
-                    "," +
-                    self.__eol
+                    text
+                    + self.__getIndent(text)
+                    + self.__indentWord
+                    + arg
+                    + ","
+                    + self.__eol
                 )
             else:
                 index = text.find("(") + 1
@@ -1870,13 +1931,13 @@
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixN806(self, code, line, pos, apply=False):
         """
         Private method to fix a wrong first argument of static methods.
-        
+
         Codes: N806
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1896,7 +1957,7 @@
             index = text.find("(") + 1
             left = text[:index]
             right = text[index:]
-            
+
             if right.startswith(("cls", "self")):
                 # cls or self are on the definition line
                 if right.startswith("cls"):
@@ -1923,26 +1984,24 @@
                 right = right.lstrip(", ")
                 if right.startswith("):"):
                     # merge with previous line
-                    self.__source[line - 1] = (
-                        self.__source[line - 1].rstrip() + right
-                    )
+                    self.__source[line - 1] = self.__source[line - 1].rstrip() + right
                     self.__source[line] = ""
                 else:
                     self.__source[line] = indent + right
-            
+
             # '{0}' argument removed.
             return (1, "FIXN806", [arg], 0)
         else:
             fixId = self.__getID()
             self.__stack.append((fixId, code, line, pos))
             return (-1, "", [], fixId)
-    
+
     def __fixW291(self, code, line, pos):
         """
         Private method to fix trailing whitespace.
-       
+
         Codes: W291, W293
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1954,17 +2013,18 @@
             message and an ID for a deferred fix
         @rtype tuple of (int, str, list or int, int)
         """
-        self.__source[line - 1] = re.sub(r'[\t ]+(\r?)$', r"\1",
-                                         self.__source[line - 1])
+        self.__source[line - 1] = re.sub(
+            r"[\t ]+(\r?)$", r"\1", self.__source[line - 1]
+        )
         # Whitespace stripped from end of line.
         return (1, "FIXW291", [], 0)
-    
+
     def __fixW292(self, code, line, pos):
         """
         Private method to fix a missing newline at the end of file.
-       
+
         Codes: W292
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -1979,13 +2039,13 @@
         self.__source[line - 1] += self.__eol
         # newline added to end of file.
         return (1, "FIXW292", [], 0)
-    
+
     def __fixW391(self, code, line, pos):
         """
         Private method to fix trailing blank lines.
-       
+
         Codes: W391
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -2006,13 +2066,13 @@
                 break
         # Superfluous trailing blank lines removed from end of file.
         return (1, "FIXW391", [], 0)
-    
+
     def __fixW603(self, code, line, pos):
         """
         Private method to fix the not equal notation.
-       
+
         Codes: W603
-        
+
         @param code code of the issue
         @type str
         @param line line number of the issue
@@ -2036,10 +2096,11 @@
 
     Released to the public domain, by Tim Peters, 03 October 2000.
     """
+
     def __init__(self, sourceLines):
         """
         Constructor
-        
+
         @param sourceLines list of source lines including eol marker
             (list of string)
         """
@@ -2050,8 +2111,7 @@
         # File lines, rstripped & tab-expanded.  Dummy at start is so
         # that we can use tokenize's 1-based line numbering easily.
         # Note that a line is all-blank iff it's "\n".
-        self.lines = [line.rstrip().expandtabs() + "\n"
-                      for line in self.raw]
+        self.lines = [line.rstrip().expandtabs() + "\n" for line in self.raw]
         self.lines.insert(0, None)
         self.index = 1  # index into self.lines of next line
 
@@ -2060,18 +2120,18 @@
         # signal that tokenize doesn't know what to do about them;
         # indeed, they're our headache!
         self.stats = []
-    
+
     def run(self):
         """
         Public method to run the re-indenter.
-        
+
         @return flag indicating that a change was done (boolean)
         """
         try:
             stats = self.__genStats(tokenize.generate_tokens(self.getline))
         except (SyntaxError, tokenize.TokenError):
             return False
-        
+
         # Remove trailing empty lines.
         lines = self.lines
         while lines and lines[-1] == "\n":
@@ -2113,9 +2173,9 @@
                             jline, jlevel = stats[j]
                             if jlevel >= 0:
                                 want = (
-                                    have +
-                                    self.__getlspace(after[jline - 1]) -
-                                    self.__getlspace(lines[jline])
+                                    have
+                                    + self.__getlspace(after[jline - 1])
+                                    - self.__getlspace(lines[jline])
                                 )
                                 break
                     if want < 0:
@@ -2138,23 +2198,23 @@
                         remove = min(self.__getlspace(line), -diff)
                         after.append(line[remove:])
         return self.raw != self.after
-    
+
     def fixedLine(self, line):
         """
         Public method to get a fixed line.
-        
+
         @param line number of the line to retrieve (integer)
         @return fixed line (string)
         """
         if line < len(self.after):
             return self.after[line]
-        
+
         return ""
-    
+
     def getline(self):
         """
         Public method to get a line of text for tokenize.
-        
+
         @return line of text (string)
         """
         if self.index >= len(self.lines):
@@ -2167,7 +2227,7 @@
     def __genStats(self, tokens):
         """
         Private method to generate the re-indent statistics.
-        
+
         @param tokens tokens generator (tokenize._tokenize)
         @return reference to the generated statistics
         """
@@ -2208,15 +2268,15 @@
                 # must be the first token of the next program statement, or an
                 # ENDMARKER.
                 find_stmt = False
-                if line:   # not endmarker
+                if line:  # not endmarker
                     stats.append((sline, level))
-        
+
         return stats
-    
+
     def __getlspace(self, line):
         """
         Private method to count number of leading blanks.
-        
+
         @param line line to check (string)
         @return number of leading blanks (integer)
         """
@@ -2233,22 +2293,29 @@
 
     Each instance operates on a single logical line.
     """
-    SKIP_TOKENS = frozenset([
-        tokenize.COMMENT, tokenize.NL, tokenize.INDENT,
-        tokenize.DEDENT, tokenize.NEWLINE, tokenize.ENDMARKER
-    ])
+
+    SKIP_TOKENS = frozenset(
+        [
+            tokenize.COMMENT,
+            tokenize.NL,
+            tokenize.INDENT,
+            tokenize.DEDENT,
+            tokenize.NEWLINE,
+            tokenize.ENDMARKER,
+        ]
+    )
 
     def __init__(self, physical_lines):
         """
         Constructor
-        
+
         @param physical_lines list of physical lines to operate on
             (list of strings)
         """
         self.lines = physical_lines
         self.tokens = []
         self.rel_indent = None
-        sio = StringIO(''.join(physical_lines))
+        sio = StringIO("".join(physical_lines))
         for t in tokenize.generate_tokens(sio.readline):
             if not len(self.tokens) and t[0] in self.SKIP_TOKENS:
                 continue
@@ -2260,7 +2327,7 @@
     def __buildTokensLogical(self, tokens):
         """
         Private method to build a logical line from a list of tokens.
-        
+
         @param tokens list of tokens as generated by tokenize.generate_tokens
         @return logical line (string)
         """
@@ -2276,15 +2343,16 @@
                 start_line, start = t[2]
                 if end_line != start_line:  # different row
                     prev_text = self.lines[end_line - 1][end - 1]
-                    if prev_text == ',' or (prev_text not in '{[(' and
-                                            text not in '}])'):
-                        logical.append(' ')
+                    if prev_text == "," or (
+                        prev_text not in "{[(" and text not in "}])"
+                    ):
+                        logical.append(" ")
                 elif end != start:  # different column
                     fill = self.lines[end_line - 1][end:start]
                     logical.append(fill)
             logical.append(text)
             previous = t
-        logical_line = ''.join(logical)
+        logical_line = "".join(logical)
         return logical_line
 
     def pep8Expected(self):
@@ -2314,7 +2382,7 @@
             # bug, really.
             return valid_indents
 
-        indent_next = self.logical_line.endswith(':')
+        indent_next = self.logical_line.endswith(":")
 
         row = depth = 0
         parens = [0] * nrows
@@ -2328,8 +2396,10 @@
             newline = row < start[0] - first_row
             if newline:
                 row = start[0] - first_row
-                newline = (not last_token_multiline and
-                           token_type not in (tokenize.NL, tokenize.NEWLINE))
+                newline = not last_token_multiline and token_type not in (
+                    tokenize.NL,
+                    tokenize.NEWLINE,
+                )
 
             if newline:
                 # This is where the differences start. Instead of looking at
@@ -2352,7 +2422,7 @@
                 # list
                 vi = []
                 add_second_chances = False
-                if token_type == tokenize.OP and text in ']})':
+                if token_type == tokenize.OP and text in "]})":
                     # this line starts with a closing bracket, so it needs to
                     # be closed at the same indent as the opening one.
                     if indent[depth]:
@@ -2382,8 +2452,7 @@
                     vi.append(indent_level + hang)
 
                 # about the best we can do without look-ahead
-                if (indent_next and vi[0] == indent_level + 4 and
-                        nrows == row + 1):
+                if indent_next and vi[0] == indent_level + 4 and nrows == row + 1:
                     vi[0] += 4
 
                 if add_second_chances:
@@ -2391,9 +2460,9 @@
                     min_indent = vi[0]
                     for col, what in indent_chances.items():
                         if col > min_indent and (
-                            what is True or
-                            (what == str and token_type == tokenize.STRING) or
-                            (what == text and token_type == tokenize.OP)
+                            what is True
+                            or (what == str and token_type == tokenize.STRING)
+                            or (what == text and token_type == tokenize.OP)
                         ):
                             vi.append(col)
                     vi = sorted(vi)
@@ -2404,33 +2473,31 @@
                 # pycodestyle.
                 visual_indent = indent_chances.get(start[1])
                 last_indent = start
-                rel_indent[row] = (
-                    pycodestyle.expand_indent(line) - indent_level
-                )
+                rel_indent[row] = pycodestyle.expand_indent(line) - indent_level
                 hang = rel_indent[row] - rel_indent[open_row]
 
-                if token_type == tokenize.OP and text in ']})':
+                if token_type == tokenize.OP and text in "]})":
                     pass
                 elif visual_indent is True and not indent[depth]:
                     indent[depth] = start[1]
 
             # line altered: comments shouldn't define a visual indent
-            if parens[row] and not indent[depth] and token_type not in (
-                tokenize.NL, tokenize.COMMENT
+            if (
+                parens[row]
+                and not indent[depth]
+                and token_type not in (tokenize.NL, tokenize.COMMENT)
             ):
                 indent[depth] = start[1]
                 indent_chances[start[1]] = True
-            elif token_type == tokenize.STRING or text in (
-                'u', 'ur', 'b', 'br'
-            ):
+            elif token_type == tokenize.STRING or text in ("u", "ur", "b", "br"):
                 indent_chances[start[1]] = str
 
             if token_type == tokenize.OP:
-                if text in '([{':
+                if text in "([{":
                     depth += 1
                     indent.append(0)
                     parens[row] += 1
-                elif text in ')]}' and depth > 0:
+                elif text in ")]}" and depth > 0:
                     prev_indent = indent.pop() or last_indent[1]
                     for d in range(depth):
                         if indent[d] > prev_indent:
@@ -2448,7 +2515,7 @@
                 if start[1] not in indent_chances:
                     indent_chances[start[1]] = text
 
-            last_token_multiline = (start[0] != end[0])
+            last_token_multiline = start[0] != end[0]
 
         return valid_indents
 
@@ -2457,11 +2524,20 @@
     """
     Class used to shorten lines to a given maximum of characters.
     """
-    def __init__(self, curLine, prevLine, nextLine, maxLength=88, eol="\n",
-                 indentWord="    ", isDocString=False):
+
+    def __init__(
+        self,
+        curLine,
+        prevLine,
+        nextLine,
+        maxLength=88,
+        eol="\n",
+        indentWord="    ",
+        isDocString=False,
+    ):
         """
         Constructor
-        
+
         @param curLine text to work on (string)
         @param prevLine line before the text to work on (string)
         @param nextLine line after the text to work on (string)
@@ -2478,18 +2554,18 @@
         self.__eol = eol
         self.__indentWord = indentWord
         self.__isDocString = isDocString
-    
+
     def shorten(self):
         """
         Public method to shorten the line wrapped by the class instance.
-        
+
         @return tuple of a flag indicating successful shortening, the
             shortened line and the changed next line (boolean, string, string)
         """
         # 1. check for comment
-        if self.__text.lstrip().startswith('#'):
+        if self.__text.lstrip().startswith("#"):
             lastComment = True
-            if self.__nextText.lstrip().startswith('#'):
+            if self.__nextText.lstrip().startswith("#"):
                 lastComment = False
 
             # Wrap commented lines.
@@ -2498,13 +2574,13 @@
                 return False, "", ""
             else:
                 return True, newText, ""
-        elif '#' in self.__text:
+        elif "#" in self.__text:
             pos = self.__text.rfind("#")
             newText = (
-                self.__text[:pos].rstrip() +
-                self.__eol +
-                self.__getIndent(self.__text) +
-                self.__text[pos:]
+                self.__text[:pos].rstrip()
+                + self.__eol
+                + self.__getIndent(self.__text)
+                + self.__text[pos:]
             )
             if newText == self.__text:
                 return False, "", ""
@@ -2528,36 +2604,31 @@
                         # eric doc comment
                         # create a new line and indent it
                         newText = (
-                            first +
-                            self.__eol +
-                            self.__getIndent(first) +
-                            self.__indentWord +
-                            second
+                            first
+                            + self.__eol
+                            + self.__getIndent(first)
+                            + self.__indentWord
+                            + second
                         )
                         newNext = ""
                     else:
                         newText = first + self.__eol
                         newNext = (
-                            self.__getIndent(self.__nextText) +
-                            second.rstrip() +
-                            " " +
-                            self.__nextText.lstrip()
+                            self.__getIndent(self.__nextText)
+                            + second.rstrip()
+                            + " "
+                            + self.__nextText.lstrip()
                         )
                 else:
                     # empty line, add a new line
-                    newText = (
-                        first +
-                        self.__eol +
-                        self.__getIndent(first) +
-                        second
-                    )
+                    newText = first + self.__eol + self.__getIndent(first) + second
                     newNext = ""
             return True, newText, newNext
-        
+
         indent = self.__getIndent(self.__text)
-        source = self.__text[len(indent):]
+        source = self.__text[len(indent) :]
         sio = StringIO(source)
-        
+
         # Check for multi line string.
         try:
             tokens = list(tokenize.generate_tokens(sio.readline))
@@ -2566,10 +2637,10 @@
                 # just join the continuation line and let the next run
                 # handle it once it tokenizes ok
                 newText = (
-                    indent +
-                    source.rstrip()[:-1].rstrip() +
-                    " " +
-                    self.__nextText.lstrip()
+                    indent
+                    + source.rstrip()[:-1].rstrip()
+                    + " "
+                    + self.__nextText.lstrip()
                 )
                 if indent:
                     newNext = indent
@@ -2585,25 +2656,30 @@
 
         # Handle statements by putting the right hand side on a line by itself.
         # This should let the next pass shorten it.
-        if source.startswith('return '):
+        if source.startswith("return "):
             newText = (
-                indent +
-                'return (' +
-                self.__eol +
-                indent + self.__indentWord + re.sub('^return ', '', source) +
-                indent + ')' + self.__eol
+                indent
+                + "return ("
+                + self.__eol
+                + indent
+                + self.__indentWord
+                + re.sub("^return ", "", source)
+                + indent
+                + ")"
+                + self.__eol
             )
             return True, newText, ""
-        
+
         candidates = self.__shortenLine(tokens, source, indent)
         if candidates:
             candidates = sorted(
                 set(candidates).union([self.__text]),
-                key=lambda x: self.__lineShorteningRank(x))
+                key=lambda x: self.__lineShorteningRank(x),
+            )
             if candidates[0] == self.__text:
                 return False, "", ""
             return True, candidates[0], ""
-        
+
         source = self.__text
         rs = source.rstrip()
         if rs.endswith(("'", '"')) and " " in source:
@@ -2616,91 +2692,103 @@
             while blank > maxLen and blank != -1:
                 blank = source.rfind(" ", 0, blank)
             if blank != -1:
-                if source[blank + 1:].startswith(quote):
+                if source[blank + 1 :].startswith(quote):
                     first = source[:maxLen]
                     second = source[maxLen:]
                 else:
                     first = source[:blank]
-                    second = source[blank + 1:]
+                    second = source[blank + 1 :]
                 return (
                     True,
-                    first + quote + " \\" + self.__eol +
-                    indent + self.__indentWord + quote + second,
-                    "")
+                    first
+                    + quote
+                    + " \\"
+                    + self.__eol
+                    + indent
+                    + self.__indentWord
+                    + quote
+                    + second,
+                    "",
+                )
             else:
                 # Cannot break
                 return False, "", ""
-        
+
         return False, "", ""
-    
+
     def __shortenComment(self, isLast):
         """
         Private method to shorten a comment line.
-        
+
         @param isLast flag indicating, that the line is the last comment line
             (boolean)
         @return shortened comment line (string)
         """
         if len(self.__text) <= self.__maxLength:
             return self.__text
-        
+
         newText = self.__text.rstrip()
 
         # PEP 8 recommends 72 characters for comment text.
-        indentation = self.__getIndent(newText) + '# '
-        maxLength = min(self.__maxLength,
-                        len(indentation) + 72)
+        indentation = self.__getIndent(newText) + "# "
+        maxLength = min(self.__maxLength, len(indentation) + 72)
 
         MIN_CHARACTER_REPEAT = 5
         if (
-            len(newText) - len(newText.rstrip(newText[-1])) >=
-            MIN_CHARACTER_REPEAT and
-            not newText[-1].isalnum()
+            len(newText) - len(newText.rstrip(newText[-1])) >= MIN_CHARACTER_REPEAT
+            and not newText[-1].isalnum()
         ):
             # Trim comments that end with things like ---------
             return newText[:maxLength] + self.__eol
         elif isLast and re.match(r"\s*#+\s*\w+", newText):
             import textwrap
-            splitLines = textwrap.wrap(newText.lstrip(" \t#"),
-                                       initial_indent=indentation,
-                                       subsequent_indent=indentation,
-                                       width=maxLength,
-                                       break_long_words=False,
-                                       break_on_hyphens=False)
+
+            splitLines = textwrap.wrap(
+                newText.lstrip(" \t#"),
+                initial_indent=indentation,
+                subsequent_indent=indentation,
+                width=maxLength,
+                break_long_words=False,
+                break_on_hyphens=False,
+            )
             return self.__eol.join(splitLines) + self.__eol
         else:
             return newText + self.__eol
-    
+
     def __breakMultiline(self):
         """
         Private method to break multi line strings.
-        
+
         @return tuple of the shortened line and the changed next line
             (string, string)
         """
         indentation = self.__getIndent(self.__text)
 
         # Handle special case.
-        for symbol in '([{':
+        for symbol in "([{":
             # Only valid if symbol is not on a line by itself.
             if (
-                symbol in self.__text and
-                self.__text.strip() != symbol and
-                self.__text.rstrip().endswith((',', '%'))
+                symbol in self.__text
+                and self.__text.strip() != symbol
+                and self.__text.rstrip().endswith((",", "%"))
             ):
                 index = 1 + self.__text.find(symbol)
 
                 if index <= len(self.__indentWord) + len(indentation):
                     continue
 
-                if self.__isProbablyInsideStringOrComment(
-                        self.__text, index - 1):
+                if self.__isProbablyInsideStringOrComment(self.__text, index - 1):
                     continue
 
-                return (self.__text[:index].rstrip() + self.__eol +
-                        indentation + self.__indentWord +
-                        self.__text[index:].lstrip(), "")
-        
+                return (
+                    self.__text[:index].rstrip()
+                    + self.__eol
+                    + indentation
+                    + self.__indentWord
+                    + self.__text[index:].lstrip(),
+                    "",
+                )
+
         newText = self.__text
         newNext = self.__nextText
         blank = newText.rfind(" ")
@@ -2717,29 +2805,23 @@
                     newNext = ""
                 else:
                     newNext = (
-                        self.__getIndent(newNext) +
-                        second +
-                        " " +
-                        newNext.lstrip()
+                        self.__getIndent(newNext) + second + " " + newNext.lstrip()
                     )
             else:
                 # empty line, add a new line
                 newText = first + self.__eol
                 newNext = (
-                    self.__getIndent(newNext) +
-                    second +
-                    self.__eol +
-                    newNext.lstrip()
+                    self.__getIndent(newNext) + second + self.__eol + newNext.lstrip()
                 )
             return newText, newNext
         else:
             return None
-    
+
     def __isProbablyInsideStringOrComment(self, line, index):
         """
         Private method to check, if the given string might be inside a string
         or comment.
-        
+
         @param line line to check (string)
         @param index position inside line to check (integer)
         @return flag indicating the possibility of being inside a string
@@ -2752,16 +2834,16 @@
                 return True
 
         # Check against being in a comment.
-        pos = line.find('#')
+        pos = line.find("#")
         if pos != -1 and pos <= index:
             return True
 
         return False
-    
+
     def __shortenLine(self, tokens, source, indent):
         """
         Private method to shorten a line of code at an operator.
-        
+
         @param tokens tokens of the line as generated by tokenize
             (list of token)
         @param source code string to work at (string)
@@ -2769,85 +2851,89 @@
         @return list of candidates (list of string)
         """
         candidates = []
-        
+
         for tkn in tokens:
             tokenType = tkn[0]
             tokenString = tkn[1]
 
-            if (
-                tokenType == tokenize.COMMENT and
-                not self.__prevText.rstrip().endswith('\\')
+            if tokenType == tokenize.COMMENT and not self.__prevText.rstrip().endswith(
+                "\\"
             ):
                 # Move inline comments to previous line.
                 offset = tkn[2][1]
                 first = source[:offset]
                 second = source[offset:]
                 candidates.append(
-                    indent + second.strip() + self.__eol +
-                    indent + first.strip() + self.__eol)
-            elif tokenType == tokenize.OP and tokenString != '=':
+                    indent
+                    + second.strip()
+                    + self.__eol
+                    + indent
+                    + first.strip()
+                    + self.__eol
+                )
+            elif tokenType == tokenize.OP and tokenString != "=":
                 # Don't break on '=' after keyword as this violates PEP 8.
                 offset = tkn[2][1] + 1
                 first = source[:offset]
 
                 secondIndent = indent
-                if first.rstrip().endswith('('):
+                if first.rstrip().endswith("("):
                     secondIndent += self.__indentWord
-                elif '(' in first:
-                    secondIndent += ' ' * (1 + first.find('('))
+                elif "(" in first:
+                    secondIndent += " " * (1 + first.find("("))
                 else:
                     secondIndent += self.__indentWord
 
-                second = (secondIndent + source[offset:].lstrip())
+                second = secondIndent + source[offset:].lstrip()
                 if not second.strip():
                     continue
 
                 # Do not begin a line with a comma
-                if second.lstrip().startswith(','):
+                if second.lstrip().startswith(","):
                     continue
-                
+
                 # Do end a line with a dot
-                if first.rstrip().endswith('.'):
+                if first.rstrip().endswith("."):
                     continue
-                
-                if tokenString in '+-*/,':
-                    newText = first + ' \\' + self.__eol + second
+
+                if tokenString in "+-*/,":
+                    newText = first + " \\" + self.__eol + second
                 else:
                     newText = first + self.__eol + second
 
                 # Only fix if syntax is okay.
                 if self.__checkSyntax(self.__normalizeMultiline(newText)):
                     candidates.append(indent + newText)
-        
+
         return candidates
-    
+
     def __normalizeMultiline(self, text):
         """
         Private method to remove multiline-related code that will cause syntax
         error.
-        
+
         @param text code line to work on (string)
         @return normalized code line (string)
         """
-        for quote in '\'"':
+        for quote in "'\"":
             dictPattern = r"^{q}[^{q}]*{q} *: *".format(q=quote)
             if re.match(dictPattern, text):
-                if not text.strip().endswith('}'):
-                    text += '}'
-                return '{' + text
-
-        if text.startswith('def ') and text.rstrip().endswith(':'):
+                if not text.strip().endswith("}"):
+                    text += "}"
+                return "{" + text
+
+        if text.startswith("def ") and text.rstrip().endswith(":"):
             # Do not allow ':' to be alone. That is invalid.
             splitText = [item.strip() for item in text.split(self.__eol)]
-            if ':' not in splitText and 'def' not in splitText:
-                return text[len('def'):].strip().rstrip(':')
+            if ":" not in splitText and "def" not in splitText:
+                return text[len("def") :].strip().rstrip(":")
 
         return text
-    
+
     def __lineShorteningRank(self, candidate):
         """
         Private method to rank a candidate.
-        
+
         @param candidate candidate line to rank (string)
         @return rank of the candidate (integer)
         """
@@ -2856,27 +2942,24 @@
             if candidate == self.__text:
                 # give the original a disadvantage
                 rank += 50
-            
+
             lines = candidate.split(self.__eol)
 
             offset = 0
-            if lines[0].rstrip()[-1] not in '([{':
-                for symbol in '([{':
+            if lines[0].rstrip()[-1] not in "([{":
+                for symbol in "([{":
                     offset = max(offset, 1 + lines[0].find(symbol))
 
             maxLength = max(offset + len(x.strip()) for x in lines)
             rank += maxLength
             rank += len(lines)
 
-            badStartingSymbol = {
-                '(': ')',
-                '[': ']',
-                '{': '}'}.get(lines[0][-1], None)
+            badStartingSymbol = {"(": ")", "[": "]", "{": "}"}.get(lines[0][-1], None)
 
             if (
-                len(lines) > 1 and
-                badStartingSymbol and
-                lines[1].lstrip().startswith(badStartingSymbol)
+                len(lines) > 1
+                and badStartingSymbol
+                and lines[1].lstrip().startswith(badStartingSymbol)
             ):
                 rank += 20
 
@@ -2885,65 +2968,64 @@
                 rank += 100
 
             for currentLine in lines:
-                for badStart in ['.', '%', '+', '-', '/']:
+                for badStart in [".", "%", "+", "-", "/"]:
                     if currentLine.startswith(badStart):
                         rank += 100
 
-                for ending in '([{':
+                for ending in "([{":
                     # Avoid lonely opening. They result in longer lines.
-                    if (
-                        currentLine.endswith(ending) and
-                        len(currentLine.strip()) <= len(self.__indentWord)
+                    if currentLine.endswith(ending) and len(currentLine.strip()) <= len(
+                        self.__indentWord
                     ):
                         rank += 100
 
-                if currentLine.endswith('%'):
+                if currentLine.endswith("%"):
                     rank -= 20
 
                 # Try to break list comprehensions at the "for".
-                if currentLine.lstrip().startswith('for'):
+                if currentLine.lstrip().startswith("for"):
                     rank -= 50
 
                 rank += 10 * self.__countUnbalancedBrackets(currentLine)
         else:
             rank = 100000
-        
+
         return max(0, rank)
-    
+
     def __countUnbalancedBrackets(self, line):
         """
         Private method to determine the number of unmatched open/close
         brackets.
-        
+
         @param line line to work at (string)
         @return number of unmatched open/close brackets (integer)
         """
         count = 0
-        for opening, closing in ['()', '[]', '{}']:
+        for opening, closing in ["()", "[]", "{}"]:
             # __IGNORE_WARNING_M613__
             count += abs(line.count(opening) - line.count(closing))
-        
+
         return count
-    
+
     def __getIndent(self, line):
         """
         Private method to get the indentation string.
-        
+
         @param line line to determine the indentation string from (string)
         @return indentation string (string)
         """
         # copied from CodeStyleFixer
         return line.replace(line.lstrip(), "")
-    
+
     def __checkSyntax(self, code):
         """
         Private method to check the syntax of the given code fragment.
-        
+
         @param code code fragment to check (string)
         @return flag indicating syntax is ok (boolean)
         """
         code = code.replace("\r\n", "\n").replace("\r", "\n")
         try:
-            return compile(code, '<string>', 'exec')
+            return compile(code, "<string>", "exec")
         except (SyntaxError, TypeError, UnicodeDecodeError):
             return False
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleStatisticsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleStatisticsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,10 +25,11 @@
     Class implementing a dialog showing statistical data for the last
     code style checker run.
     """
+
     def __init__(self, statisticData, parent=None):
         """
         Constructor
-        
+
         @param statisticData dictionary with the statistical data
         @type dict
         @param parent reference to the parent widget
@@ -36,7 +37,7 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         stats = statisticData.copy()
         filesCount = stats["_FilesCount"]
         filesIssues = stats["_FilesIssues"]
@@ -46,43 +47,42 @@
         del stats["_FilesIssues"]
         del stats["_IssuesFixed"]
         del stats["_SecurityOK"]
-        
+
         totalIssues = 0
         ignoresCount = 0
-        
+
         textWrapper = textwrap.TextWrapper(width=80)
-        
+
         for msgCode in sorted(stats.keys()):
             message = getTranslatedMessage(msgCode, [], example=True)
             if message is None:
                 continue
-            
-            self.__createItem(stats[msgCode], msgCode,
-                              "\n".join(textWrapper.wrap(message)))
+
+            self.__createItem(
+                stats[msgCode], msgCode, "\n".join(textWrapper.wrap(message))
+            )
             totalIssues += stats[msgCode]["total"]
             ignoresCount += stats[msgCode]["ignored"]
-        
-        self.totalIssues.setText(
-            self.tr("%n issue(s) found", "", totalIssues))
-        self.ignoredIssues.setText(
-            self.tr("%n issue(s) ignored", "", ignoresCount))
-        self.fixedIssues.setText(
-            self.tr("%n issue(s) fixed", "", fixesCount))
-        self.filesChecked.setText(
-            self.tr("%n file(s) checked", "", filesCount))
+
+        self.totalIssues.setText(self.tr("%n issue(s) found", "", totalIssues))
+        self.ignoredIssues.setText(self.tr("%n issue(s) ignored", "", ignoresCount))
+        self.fixedIssues.setText(self.tr("%n issue(s) fixed", "", fixesCount))
+        self.filesChecked.setText(self.tr("%n file(s) checked", "", filesCount))
         self.filesIssues.setText(
-            self.tr("%n file(s) with issues found", "", filesIssues))
+            self.tr("%n file(s) with issues found", "", filesIssues)
+        )
         self.securityOk.setText(
-            self.tr("%n security issue(s) acknowledged", "", securityOk))
-        
+            self.tr("%n security issue(s) acknowledged", "", securityOk)
+        )
+
         self.statisticsList.resizeColumnToContents(0)
         self.statisticsList.resizeColumnToContents(1)
         self.statisticsList.resizeColumnToContents(2)
-    
+
     def __createItem(self, counts, msgCode, message):
         """
         Private method to create an entry in the result list.
-        
+
         @param counts dictionary containing the total and ignored occurrences
             of the issue
         @type dict
@@ -91,14 +91,23 @@
         @param message code style issue message to be shown
         @type str
         """
-        itm = QTreeWidgetItem(self.statisticsList, [
-            msgCode, "{0:6d}".format(counts["total"] - counts["ignored"]),
-            "{0:6d}".format(counts["ignored"]), message])
+        itm = QTreeWidgetItem(
+            self.statisticsList,
+            [
+                msgCode,
+                "{0:6d}".format(counts["total"] - counts["ignored"]),
+                "{0:6d}".format(counts["ignored"]),
+                message,
+            ],
+        )
         CodeStyleCheckerUtilities.setItemIcon(itm, 0, msgCode)
-        
+
         itm.setTextAlignment(
-            0, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
+            0, Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter
+        )
         itm.setTextAlignment(
-            1, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
+            1, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
+        )
         itm.setTextAlignment(
-            2, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
+            2, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
+        )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/ComplexityChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/ComplexityChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,15 +17,17 @@
     """
     Class implementing a checker for code complexity.
     """
+
     Codes = [
         "C101",
-        "C111", "C112",
+        "C111",
+        "C112",
     ]
 
     def __init__(self, source, filename, tree, select, ignore, args):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -43,32 +45,31 @@
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
         self.__select = tuple(select)
-        self.__ignore = ('',) if select else tuple(ignore)
+        self.__ignore = ("",) if select else tuple(ignore)
         self.__args = args
-        
+
         self.__defaultArgs = {
             "McCabeComplexity": 10,
             "LineComplexity": 15,
             "LineComplexityScore": 10,
         }
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         checkersWithCodes = [
             (self.__checkMcCabeComplexity, ("C101",)),
             (self.__checkLineComplexity, ("C111", "C112")),
         ]
-        
+
         self.__checkers = []
         for checker, codes in checkersWithCodes:
-            if any(not (code and self.__ignoreCode(code))
-                    for code in codes):
+            if any(not (code and self.__ignoreCode(code)) for code in codes):
                 self.__checkers.append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -78,13 +79,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -96,12 +96,12 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         if code:
             # record the issue with one based line number
             self.errors.append(
@@ -113,7 +113,7 @@
                     "args": args,
                 }
             )
-    
+
     def run(self):
         """
         Public method to check the given source for code complexity.
@@ -121,59 +121,62 @@
         if not self.__filename or not self.__source:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         for check in self.__checkers:
             check()
-    
+
     def __checkMcCabeComplexity(self):
         """
         Private method to check the McCabe code complexity.
         """
         try:
             # create the AST again because it is modified by the checker
-            tree = compile(''.join(self.__source), self.__filename, 'exec',
-                           ast.PyCF_ONLY_AST)
+            tree = compile(
+                "".join(self.__source), self.__filename, "exec", ast.PyCF_ONLY_AST
+            )
         except (SyntaxError, TypeError):
             # compile errors are already reported by the run() method
             return
-        
-        maxComplexity = self.__args.get("McCabeComplexity",
-                                        self.__defaultArgs["McCabeComplexity"])
-        
+
+        maxComplexity = self.__args.get(
+            "McCabeComplexity", self.__defaultArgs["McCabeComplexity"]
+        )
+
         visitor = PathGraphingAstVisitor()
         visitor.preorder(tree, visitor)
         for graph in visitor.graphs.values():
             if graph.complexity() > maxComplexity:
-                self.__error(graph.lineno, 0, "C101",
-                             graph.entity, graph.complexity())
-    
+                self.__error(graph.lineno, 0, "C101", graph.entity, graph.complexity())
+
     def __checkLineComplexity(self):
         """
         Private method to check the complexity of a single line of code and
         the median line complexity of the source code.
-        
+
         Complexity is defined as the number of AST nodes produced by a line
         of code.
         """
         maxLineComplexity = self.__args.get(
-            "LineComplexity", self.__defaultArgs["LineComplexity"])
+            "LineComplexity", self.__defaultArgs["LineComplexity"]
+        )
         maxLineComplexityScore = self.__args.get(
-            "LineComplexityScore", self.__defaultArgs["LineComplexityScore"])
-        
+            "LineComplexityScore", self.__defaultArgs["LineComplexityScore"]
+        )
+
         visitor = LineComplexityVisitor()
         visitor.visit(self.__tree)
-        
+
         sortedItems = visitor.sortedList()
         score = visitor.score()
-        
+
         for line, complexity in sortedItems:
             if complexity > maxLineComplexity:
                 self.__error(line, 0, "C111", complexity)
-        
+
         if score > maxLineComplexityScore:
             self.__error(0, 0, "C112", score)
 
@@ -183,40 +186,40 @@
     Class calculating the number of AST nodes per line of code
     and the median nodes/line score.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
         self.__count = {}
-    
+
     def visit(self, node):
         """
         Public method to recursively visit all the nodes and add up the
         instructions.
-        
+
         @param node reference to the node
         @type ast.AST
         """
-        if hasattr(node, 'lineno'):
+        if hasattr(node, "lineno"):
             self.__count[node.lineno] = self.__count.get(node.lineno, 0) + 1
         self.generic_visit(node)
-    
+
     def sortedList(self):
         """
         Public method to get a sorted list of (line, nodes) tuples.
-        
+
         @return sorted list of (line, nodes) tuples
         @rtype list of tuple of (int,int)
         """
-        lst = [(line, self.__count[line])
-               for line in sorted(self.__count.keys())]
+        lst = [(line, self.__count[line]) for line in sorted(self.__count.keys())]
         return lst
 
     def score(self):
         """
         Public method to calculate the median.
-        
+
         @return median line complexity value
         @rtype float
         """
@@ -224,12 +227,10 @@
         sortedList = sorted(lst)
         listLength = len(lst)
         medianIndex = (listLength - 1) // 2
-        
+
         if listLength == 0:
             return 0.0
-        elif (listLength % 2):
+        elif listLength % 2:
             return float(sortedList[medianIndex])
         else:
-            return (
-                (sortedList[medianIndex] + sortedList[medianIndex + 1]) / 2.0
-            )
+            return (sortedList[medianIndex] + sortedList[medianIndex + 1]) / 2.0
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,12 +13,14 @@
 
 _complexityMessages = {
     "C101": QCoreApplication.translate(
-        "ComplexityChecker", "'{0}' is too complex ({1})"),
+        "ComplexityChecker", "'{0}' is too complex ({1})"
+    ),
     "C111": QCoreApplication.translate(
-        "ComplexityChecker", "source code line is too complex ({0})"),
+        "ComplexityChecker", "source code line is too complex ({0})"
+    ),
     "C112": QCoreApplication.translate(
-        "ComplexityChecker",
-        "overall source code line complexity is too high ({0})"),
+        "ComplexityChecker", "overall source code line complexity is too high ({0})"
+    ),
 }
 
 _complexityMessagesSampleArgs = {
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/DocStyleChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/DocStyleChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,7 @@
 import contextlib
 
 try:
-    ast.AsyncFunctionDef    # __IGNORE_EXCEPTION__
+    ast.AsyncFunctionDef  # __IGNORE_EXCEPTION__
 except AttributeError:
     ast.AsyncFunctionDef = ast.FunctionDef
 
@@ -27,10 +27,11 @@
     """
     Class implementing the source context.
     """
+
     def __init__(self, source, startLine, contextType):
         """
         Constructor
-        
+
         @param source source code of the context (list of string or string)
         @param startLine line number the context starts in the source (integer)
         @param contextType type of the context object (string)
@@ -43,74 +44,73 @@
         self.__indent = ""
         self.__type = contextType
         self.__special = ""
-        
+
         # ensure first line is left justified
         if self.__source:
-            self.__indent = self.__source[0].replace(
-                self.__source[0].lstrip(), "")
+            self.__indent = self.__source[0].replace(self.__source[0].lstrip(), "")
             self.__source[0] = self.__source[0].lstrip()
-    
+
     def source(self):
         """
         Public method to get the source.
-        
+
         @return source (list of string)
         """
         return self.__source
-    
+
     def ssource(self):
         """
         Public method to get the joined source lines.
-        
+
         @return source (string)
         """
         return "".join(self.__source)
-    
+
     def start(self):
         """
         Public method to get the start line number.
-        
+
         @return start line number (integer)
         """
         return self.__start
-    
+
     def end(self):
         """
         Public method to get the end line number.
-        
+
         @return end line number (integer)
         """
         return self.__start + len(self.__source) - 1
-    
+
     def indent(self):
         """
         Public method to get the indentation of the first line.
-        
+
         @return indentation string (string)
         """
         return self.__indent
-    
+
     def contextType(self):
         """
         Public method to get the context type.
-        
+
         @return context type (string)
         """
         return self.__type
-    
+
     def setSpecial(self, special):
         """
         Public method to set a special attribute for the context.
-        
+
         @param special attribute string
         @type str
         """
         self.__special = special
-    
+
     def special(self):
         """
         Public method to get the special context attribute string.
-        
+
         @return attribute string
         @rtype str
         """
@@ -121,27 +121,75 @@
     """
     Class implementing a checker for documentation string conventions.
     """
+
     Codes = [
-        "D101", "D102", "D103", "D104", "D105",
-        "D111", "D112",
-        "D121", "D122",
-        "D130", "D131", "D132", "D133", "D134",
-        "D141", "D142", "D143", "D144", "D145",
-        
-        "D201", "D202.1", "D202.2", "D203", "D205", "D206",
-        "D221", "D222",
-        "D231", "D232", "D234r", "D234y", "D235r", "D235y", "D236", "D237",
-        "D238", "D239",
-        "D242", "D243", "D244", "D245", "D246", "D247",
-        "D250", "D251", "D252", "D253",
-        "D260", "D261", "D262", "D263",
+        "D101",
+        "D102",
+        "D103",
+        "D104",
+        "D105",
+        "D111",
+        "D112",
+        "D121",
+        "D122",
+        "D130",
+        "D131",
+        "D132",
+        "D133",
+        "D134",
+        "D141",
+        "D142",
+        "D143",
+        "D144",
+        "D145",
+        "D201",
+        "D202.1",
+        "D202.2",
+        "D203",
+        "D205",
+        "D206",
+        "D221",
+        "D222",
+        "D231",
+        "D232",
+        "D234r",
+        "D234y",
+        "D235r",
+        "D235y",
+        "D236",
+        "D237",
+        "D238",
+        "D239",
+        "D242",
+        "D243",
+        "D244",
+        "D245",
+        "D246",
+        "D247",
+        "D250",
+        "D251",
+        "D252",
+        "D253",
+        "D260",
+        "D261",
+        "D262",
+        "D263",
     ]
 
-    def __init__(self, source, filename, select, ignore, expected, repeat,
-                 maxLineLength=88, docType="pep257"):
+    def __init__(
+        self,
+        source,
+        filename,
+        select,
+        ignore,
+        expected,
+        repeat,
+        maxLineLength=88,
+        docType="pep257",
+    ):
         """
         Constructor
-        
+
         @param source source code to be checked (list of string)
         @param filename name of the source file (string)
         @param select list of selected codes (list of string)
@@ -154,45 +202,46 @@
             (string, one of 'eric' or 'pep257')
         """
         self.__select = tuple(select)
-        self.__ignore = ('',) if select else tuple(ignore)
+        self.__ignore = ("",) if select else tuple(ignore)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__maxLineLength = maxLineLength
         self.__docType = docType
         self.__filename = filename
         self.__source = source[:]
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         self.__lineNumber = 0
-        
+
         # caches
         self.__functionsCache = None
         self.__classesCache = None
         self.__methodsCache = None
-        
+
         self.__keywords = [
-            'moduleDocstring', 'functionDocstring',
-            'classDocstring', 'methodDocstring',
-            'defDocstring', 'docstring'
+            "moduleDocstring",
+            "functionDocstring",
+            "classDocstring",
+            "methodDocstring",
+            "defDocstring",
+            "docstring",
         ]
         if self.__docType == "pep257":
             checkersWithCodes = {
                 "moduleDocstring": [
                     (self.__checkModulesDocstrings, ("D101",)),
                 ],
-                "functionDocstring": [
-                ],
+                "functionDocstring": [],
                 "classDocstring": [
                     (self.__checkClassDocstring, ("D104", "D105")),
                     (self.__checkBlankBeforeAndAfterClass, ("D142", "D143")),
                 ],
-                "methodDocstring": [
-                ],
+                "methodDocstring": [],
                 "defDocstring": [
                     (self.__checkFunctionDocstring, ("D102", "D103")),
                     (self.__checkImperativeMood, ("D132",)),
@@ -216,30 +265,36 @@
                 "moduleDocstring": [
                     (self.__checkModulesDocstrings, ("D101", "D201")),
                 ],
-                "functionDocstring": [
-                ],
+                "functionDocstring": [],
                 "classDocstring": [
                     (self.__checkClassDocstring, ("D104", "D205", "D206")),
-                    (self.__checkEricNoBlankBeforeAndAfterClassOrFunction,
-                     ("D242", "D243")),
+                    (
+                        self.__checkEricNoBlankBeforeAndAfterClassOrFunction,
+                        ("D242", "D243"),
+                    ),
                     (self.__checkEricSignal, ("D260", "D261", "D262", "D263")),
                 ],
                 "methodDocstring": [
                     (self.__checkEricSummary, ("D232")),
                 ],
                 "defDocstring": [
-                    (self.__checkFunctionDocstring,
-                     ("D102", "D202.1", "D202.2", "D203")),
+                    (
+                        self.__checkFunctionDocstring,
+                        ("D102", "D202.1", "D202.2", "D203"),
+                    ),
                     (self.__checkImperativeMood, ("D132",)),
                     (self.__checkNoSignature, ("D133",)),
                     (self.__checkEricReturn, ("D234r", "D235r")),
                     (self.__checkEricYield, ("D234y", "D235y")),
-                    (self.__checkEricFunctionArguments,
-                     ("D236", "D237", "D238", "D239")),
-                    (self.__checkEricNoBlankBeforeAndAfterClassOrFunction,
-                     ("D244", "D245")),
-                    (self.__checkEricException,
-                     ("D250", "D251", "D252", "D253")),
+                    (
+                        self.__checkEricFunctionArguments,
+                        ("D236", "D237", "D238", "D239"),
+                    ),
+                    (
+                        self.__checkEricNoBlankBeforeAndAfterClassOrFunction,
+                        ("D244", "D245"),
+                    ),
+                    (self.__checkEricException, ("D250", "D251", "D252", "D253")),
                 ],
                 "docstring": [
                     (self.__checkTripleDoubleQuotes, ("D111",)),
@@ -249,19 +304,18 @@
                     (self.__checkEricEndsWithPeriod, ("D231",)),
                     (self.__checkEricBlankAfterSummary, ("D246",)),
                     (self.__checkEricNBlankAfterLastParagraph, ("D247",)),
-                    (self.__checkEricQuotesOnSeparateLines, ("D222", "D223"))
+                    (self.__checkEricQuotesOnSeparateLines, ("D222", "D223")),
                 ],
             }
-        
+
         self.__checkers = {}
         for key, checkers in checkersWithCodes.items():
             for checker, codes in checkers:
-                if any(not (code and self.__ignoreCode(code))
-                        for code in codes):
+                if any(not (code and self.__ignoreCode(code)) for code in codes):
                     if key not in self.__checkers:
                         self.__checkers[key] = []
                     self.__checkers[key].append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the error code should be ignored.
@@ -269,13 +323,12 @@
         @param code message code to check for (string)
         @return flag indicating to ignore the given code (boolean)
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue (integer)
         @param offset position within line of the issue (integer)
         @param code message code (string)
@@ -283,16 +336,16 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
             self.errors.append(
@@ -304,24 +357,24 @@
                     "args": args,
                 }
             )
-    
+
     def __resetReadline(self):
         """
         Private method to reset the internal readline function.
         """
         self.__lineNumber = 0
-    
+
     def __readline(self):
         """
         Private method to get the next line from the source.
-        
+
         @return next line of source (string)
         """
         self.__lineNumber += 1
         if self.__lineNumber > len(self.__source):
-            return ''
+            return ""
         return self.__source[self.__lineNumber - 1]
-    
+
     def run(self):
         """
         Public method to check the given source for violations of doc string
@@ -330,68 +383,72 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         for keyword in self.__keywords:
             if keyword in self.__checkers:
                 for check in self.__checkers[keyword]:
                     for context in self.__parseContexts(keyword):
                         docstring = self.__parseDocstring(context, keyword)
                         check(docstring, context)
-    
+
     def __getSummaryLine(self, docstringContext):
         """
         Private method to extract the summary line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @return summary line (string) and the line it was found on (integer)
         """
         lines = docstringContext.source()
-        
-        line = (lines[0]
-                .replace('r"""', "", 1)
-                .replace('u"""', "", 1)
-                .replace('"""', "")
-                .replace("r'''", "", 1)
-                .replace("u'''", "", 1)
-                .replace("'''", "")
-                .strip())
-        
+
+        line = (
+            lines[0]
+            .replace('r"""', "", 1)
+            .replace('u"""', "", 1)
+            .replace('"""', "")
+            .replace("r'''", "", 1)
+            .replace("u'''", "", 1)
+            .replace("'''", "")
+            .strip()
+        )
+
         if len(lines) == 1 or len(line) > 0:
             return line, 0
         return lines[1].strip().replace('"""', "").replace("'''", ""), 1
-    
+
     def __getSummaryLines(self, docstringContext):
         """
         Private method to extract the summary lines.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @return summary lines (list of string) and the line it was found on
             (integer)
         """
         summaries = []
         lines = docstringContext.source()
-        
-        line0 = (lines[0]
-                 .replace('r"""', "", 1)
-                 .replace('u"""', "", 1)
-                 .replace('"""', "")
-                 .replace("r'''", "", 1)
-                 .replace("u'''", "", 1)
-                 .replace("'''", "")
-                 .strip())
+
+        line0 = (
+            lines[0]
+            .replace('r"""', "", 1)
+            .replace('u"""', "", 1)
+            .replace('"""', "")
+            .replace("r'''", "", 1)
+            .replace("u'''", "", 1)
+            .replace("'''", "")
+            .strip()
+        )
         line1 = (
             lines[1].strip().replace('"""', "").replace("'''", "")
-            if len(lines) > 1 else
-            ""
+            if len(lines) > 1
+            else ""
         )
         line2 = (
             lines[2].strip().replace('"""', "").replace("'''", "")
-            if len(lines) > 2 else
-            ""
+            if len(lines) > 2
+            else ""
         )
         if line0:
             lineno = 0
@@ -409,11 +466,11 @@
             lineno = 2
             summaries.append(line2)
         return summaries, lineno
-    
+
     def __getArgNames(self, node):
         """
         Private method to get the argument names of a function node.
-        
+
         @param node AST node to extract arguments names from
         @return tuple of two list of argument names, one for arguments
             and one for keyword arguments (tuple of list of string)
@@ -422,66 +479,65 @@
         arguments.extend([arg.arg for arg in node.args.args])
         if node.args.vararg is not None:
             arguments.append(node.args.vararg.arg)
-        
+
         kwarguments = []
         kwarguments.extend([arg.arg for arg in node.args.kwonlyargs])
         if node.args.kwarg is not None:
             kwarguments.append(node.args.kwarg.arg)
         return arguments, kwarguments
-    
+
     ##################################################################
     ## Parsing functionality below
     ##################################################################
-    
+
     def __parseModuleDocstring(self, source):
         """
         Private method to extract a docstring given a module source.
-        
+
         @param source source to parse (list of string)
         @return context of extracted docstring (DocStyleContext)
         """
         for kind, value, (line, _char), _, _ in tokenize.generate_tokens(
-                StringIO("".join(source)).readline):
+            StringIO("".join(source)).readline
+        ):
             if kind in [tokenize.COMMENT, tokenize.NEWLINE, tokenize.NL]:
                 continue
             elif kind == tokenize.STRING:  # first STRING should be docstring
                 return DocStyleContext(value, line - 1, "docstring")
             else:
                 return None
-        
+
         return None
 
-    def __parseDocstring(self, context, what=''):
+    def __parseDocstring(self, context, what=""):
         """
         Private method to extract a docstring given `def` or `class` source.
-        
+
         @param context context data to get the docstring from (DocStyleContext)
         @param what string denoting what is being parsed (string)
         @return context of extracted docstring (DocStyleContext)
         """
         moduleDocstring = self.__parseModuleDocstring(context.source())
-        if what.startswith('module') or context.contextType() == "module":
+        if what.startswith("module") or context.contextType() == "module":
             return moduleDocstring
         if moduleDocstring:
             return moduleDocstring
-        
-        tokenGenerator = tokenize.generate_tokens(
-            StringIO(context.ssource()).readline)
+
+        tokenGenerator = tokenize.generate_tokens(StringIO(context.ssource()).readline)
         with contextlib.suppress(StopIteration):
             kind = None
             while kind != tokenize.INDENT:
                 kind, _, _, _, _ = next(tokenGenerator)
             kind, value, (line, char), _, _ = next(tokenGenerator)
             if kind == tokenize.STRING:  # STRING after INDENT is a docstring
-                return DocStyleContext(
-                    value, context.start() + line - 1, "docstring")
-        
+                return DocStyleContext(value, context.start() + line - 1, "docstring")
+
         return None
-    
+
     def __parseTopLevel(self, keyword):
         """
         Private method to extract top-level functions or classes.
-        
+
         @param keyword keyword signaling what to extract (string)
         @return extracted function or class contexts (list of DocStyleContext)
         """
@@ -492,45 +548,42 @@
         try:
             while True:
                 start, end = None, None
-                while not (kind == tokenize.NAME and
-                           value == keyword and
-                           char == 0):
+                while not (kind == tokenize.NAME and value == keyword and char == 0):
                     kind, value, (line, char), _, _ = next(tokenGenerator)
                 start = line - 1, char
-                while not (kind == tokenize.DEDENT and
-                           value == '' and
-                           char == 0):
+                while not (kind == tokenize.DEDENT and value == "" and char == 0):
                     kind, value, (line, char), _, _ = next(tokenGenerator)
                 end = line - 1, char
-                contexts.append(DocStyleContext(
-                    self.__source[start[0]:end[0]], start[0], keyword))
+                contexts.append(
+                    DocStyleContext(self.__source[start[0] : end[0]], start[0], keyword)
+                )
         except StopIteration:
             return contexts
-    
+
     def __parseFunctions(self):
         """
         Private method to extract top-level functions.
-        
+
         @return extracted function contexts (list of DocStyleContext)
         """
         if not self.__functionsCache:
-            self.__functionsCache = self.__parseTopLevel('def')
+            self.__functionsCache = self.__parseTopLevel("def")
         return self.__functionsCache
-    
+
     def __parseClasses(self):
         """
         Private method to extract top-level classes.
-        
+
         @return extracted class contexts (list of DocStyleContext)
         """
         if not self.__classesCache:
-            self.__classesCache = self.__parseTopLevel('class')
+            self.__classesCache = self.__parseTopLevel("class")
         return self.__classesCache
-    
+
     def __skipIndentedBlock(self, tokenGenerator):
         """
         Private method to skip over an indented block of source code.
-        
+
         @param tokenGenerator token generator
         @return last token of the indented block
         """
@@ -545,78 +598,73 @@
                 indent -= 1
             if indent == 0:
                 return kind, value, start, end, raw
-        
+
         return None
-    
+
     def __parseMethods(self):
         """
         Private method to extract methods of all classes.
-        
+
         @return extracted method contexts (list of DocStyleContext)
         """
         if not self.__methodsCache:
             contexts = []
             for classContext in self.__parseClasses():
                 tokenGenerator = tokenize.generate_tokens(
-                    StringIO(classContext.ssource()).readline)
+                    StringIO(classContext.ssource()).readline
+                )
                 kind, value, char = None, None, None
                 with contextlib.suppress(StopIteration):
                     while True:
                         start, end = None, None
-                        while not (kind == tokenize.NAME and value == 'def'):
-                            kind, value, (line, char), _, _ = (
-                                next(tokenGenerator)
-                            )
+                        while not (kind == tokenize.NAME and value == "def"):
+                            kind, value, (line, char), _, _ = next(tokenGenerator)
                         start = line - 1, char
-                        kind, value, (line, char), _, _ = (
-                            self.__skipIndentedBlock(tokenGenerator)
+                        kind, value, (line, char), _, _ = self.__skipIndentedBlock(
+                            tokenGenerator
                         )
                         end = line - 1, char
                         startLine = classContext.start() + start[0]
                         endLine = classContext.start() + end[0]
                         context = DocStyleContext(
-                            self.__source[startLine:endLine],
-                            startLine, "def")
+                            self.__source[startLine:endLine], startLine, "def"
+                        )
                         if startLine > 0:
-                            if (
-                                self.__source[startLine - 1].strip() ==
-                                "@staticmethod"
-                            ):
+                            if self.__source[startLine - 1].strip() == "@staticmethod":
                                 context.setSpecial("staticmethod")
-                            elif (
-                                self.__source[startLine - 1].strip() ==
-                                "@classmethod"
-                            ):
+                            elif self.__source[startLine - 1].strip() == "@classmethod":
                                 context.setSpecial("classmethod")
                         contexts.append(context)
             self.__methodsCache = contexts
-        
+
         return self.__methodsCache
 
     def __parseContexts(self, kind):
         """
         Private method to extract a context from the source.
-        
+
         @param kind kind of context to extract (string)
         @return requested contexts (list of DocStyleContext)
         """
-        if kind == 'moduleDocstring':
+        if kind == "moduleDocstring":
             return [DocStyleContext(self.__source, 0, "module")]
-        if kind == 'functionDocstring':
+        if kind == "functionDocstring":
             return self.__parseFunctions()
-        if kind == 'classDocstring':
+        if kind == "classDocstring":
             return self.__parseClasses()
-        if kind == 'methodDocstring':
+        if kind == "methodDocstring":
             return self.__parseMethods()
-        if kind == 'defDocstring':
+        if kind == "defDocstring":
             return self.__parseFunctions() + self.__parseMethods()
-        if kind == 'docstring':
-            return ([DocStyleContext(self.__source, 0, "module")] +
-                    self.__parseFunctions() +
-                    self.__parseClasses() +
-                    self.__parseMethods())
-        return []       # fall back
-    
+        if kind == "docstring":
+            return (
+                [DocStyleContext(self.__source, 0, "module")]
+                + self.__parseFunctions()
+                + self.__parseClasses()
+                + self.__parseMethods()
+            )
+        return []  # fall back
+
     ##################################################################
     ## Checking functionality below (PEP-257)
     ##################################################################
@@ -624,150 +672,140 @@
     def __checkModulesDocstrings(self, docstringContext, context):
         """
         Private method to check, if the module has a docstring.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             self.__error(context.start(), 0, "D101")
             return
-        
+
         docstring = docstringContext.ssource()
-        if (not docstring or not docstring.strip() or
-                not docstring.strip('\'"')):
+        if not docstring or not docstring.strip() or not docstring.strip("'\""):
             self.__error(context.start(), 0, "D101")
-        
+
         if (
-            self.__docType == "eric" and
-            docstring.strip('\'"').strip() ==
-            "Module documentation goes here."
+            self.__docType == "eric"
+            and docstring.strip("'\"").strip() == "Module documentation goes here."
         ):
             self.__error(docstringContext.end(), 0, "D201")
             return
-    
+
     def __checkFunctionDocstring(self, docstringContext, context):
         """
         Private method to check, that all public functions and methods
         have a docstring.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         functionName = context.source()[0].lstrip().split()[1].split("(")[0]
-        if functionName.startswith('_') and not functionName.endswith('__'):
+        if functionName.startswith("_") and not functionName.endswith("__"):
             if self.__docType == "eric":
                 code = "D203"
             else:
                 code = "D103"
         else:
             code = "D102"
-        
+
         if docstringContext is None:
             self.__error(context.start(), 0, code)
             return
-        
+
         docstring = docstringContext.ssource()
-        if (not docstring or not docstring.strip() or
-                not docstring.strip('\'"')):
+        if not docstring or not docstring.strip() or not docstring.strip("'\""):
             self.__error(context.start(), 0, code)
-        
+
         if self.__docType == "eric":
-            if (
-                docstring.strip('\'"').strip() ==
-                "Function documentation goes here."
-            ):
+            if docstring.strip("'\"").strip() == "Function documentation goes here.":
                 self.__error(docstringContext.end(), 0, "D202.1")
                 return
-            
-            if (
-                "DESCRIPTION" in docstring or
-                "TYPE" in docstring
-            ):
+
+            if "DESCRIPTION" in docstring or "TYPE" in docstring:
                 self.__error(docstringContext.end(), 0, "D202.2")
                 return
-    
+
     def __checkClassDocstring(self, docstringContext, context):
         """
         Private method to check, that all public functions and methods
         have a docstring.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         className = context.source()[0].lstrip().split()[1].split("(")[0]
-        if className.startswith('_'):
+        if className.startswith("_"):
             if self.__docType == "eric":
                 code = "D205"
             else:
                 code = "D105"
         else:
             code = "D104"
-        
+
         if docstringContext is None:
             self.__error(context.start(), 0, code)
             return
-        
+
         docstring = docstringContext.ssource()
-        if (not docstring or not docstring.strip() or
-                not docstring.strip('\'"')):
+        if not docstring or not docstring.strip() or not docstring.strip("'\""):
             self.__error(context.start(), 0, code)
             return
-        
+
         if (
-            self.__docType == "eric" and
-            docstring.strip('\'"').strip() == "Class documentation goes here."
+            self.__docType == "eric"
+            and docstring.strip("'\"").strip() == "Class documentation goes here."
         ):
             self.__error(docstringContext.end(), 0, "D206")
             return
-    
+
     def __checkTripleDoubleQuotes(self, docstringContext, context):
         """
         Private method to check, that all docstrings are surrounded
         by triple double quotes.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstring = docstringContext.ssource().strip()
         if not docstring.startswith(('"""', 'r"""', 'u"""')):
             self.__error(docstringContext.start(), 0, "D111")
-    
+
     def __checkBackslashes(self, docstringContext, context):
         """
         Private method to check, that all docstrings containing
         backslashes are surrounded by raw triple double quotes.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstring = docstringContext.ssource().strip()
         if "\\" in docstring and not docstring.startswith('r"""'):
             self.__error(docstringContext.start(), 0, "D112")
-    
+
     def __checkOneLiner(self, docstringContext, context):
         """
         Private method to check, that one-liner docstrings fit on
         one line with quotes.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         lines = docstringContext.source()
         if len(lines) > 1:
-            nonEmptyLines = [line for line in lines
-                             if line.strip().strip('\'"')]
+            nonEmptyLines = [line for line in lines if line.strip().strip("'\"")]
             if len(nonEmptyLines) == 1:
-                modLen = len(context.indent() + '"""' +
-                             nonEmptyLines[0].strip() + '"""')
+                modLen = len(
+                    context.indent() + '"""' + nonEmptyLines[0].strip() + '"""'
+                )
                 if context.contextType() != "module":
                     modLen += 4
                 if not nonEmptyLines[0].strip().endswith("."):
@@ -775,228 +813,221 @@
                     modLen += 1
                 if modLen <= self.__maxLineLength:
                     self.__error(docstringContext.start(), 0, "D121")
-    
+
     def __checkIndent(self, docstringContext, context):
         """
         Private method to check, that docstrings are properly indented.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         lines = docstringContext.source()
         if len(lines) == 1:
             return
-        
+
         nonEmptyLines = [line.rstrip() for line in lines[1:] if line.strip()]
         if not nonEmptyLines:
             return
-        
+
         indent = min(len(line) - len(line.strip()) for line in nonEmptyLines)
         expectedIndent = (
-            0
-            if context.contextType() == "module" else
-            len(context.indent()) + 4
+            0 if context.contextType() == "module" else len(context.indent()) + 4
         )
         if indent != expectedIndent:
             self.__error(docstringContext.start(), 0, "D122")
-    
+
     def __checkSummary(self, docstringContext, context):
         """
         Private method to check, that docstring summaries contain some text.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         summary, lineNumber = self.__getSummaryLine(docstringContext)
         if summary == "":
             self.__error(docstringContext.start() + lineNumber, 0, "D130")
-    
+
     def __checkEndsWithPeriod(self, docstringContext, context):
         """
         Private method to check, that docstring summaries end with a period.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         summary, lineNumber = self.__getSummaryLine(docstringContext)
         if not summary.endswith("."):
             self.__error(docstringContext.start() + lineNumber, 0, "D131")
-    
+
     def __checkImperativeMood(self, docstringContext, context):
         """
         Private method to check, that docstring summaries are in
         imperative mood.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         summary, lineNumber = self.__getSummaryLine(docstringContext)
         if summary:
             firstWord = summary.strip().split()[0]
             if firstWord.endswith("s") and not firstWord.endswith("ss"):
                 self.__error(docstringContext.start() + lineNumber, 0, "D132")
-    
+
     def __checkNoSignature(self, docstringContext, context):
         """
         Private method to check, that docstring summaries don't repeat
         the function's signature.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         functionName = context.source()[0].lstrip().split()[1].split("(")[0]
         summary, lineNumber = self.__getSummaryLine(docstringContext)
-        if (
-            functionName + "(" in summary.replace(" ", "") and
-            functionName + "()" not in summary.replace(" ", "")
-        ):
+        if functionName + "(" in summary.replace(
+            " ", ""
+        ) and functionName + "()" not in summary.replace(" ", ""):
             # report only, if it is not an abbreviated form (i.e. function() )
             self.__error(docstringContext.start() + lineNumber, 0, "D133")
-    
+
     def __checkReturnType(self, docstringContext, context):
         """
         Private method to check, that docstrings mention the return value type.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         if "return" not in docstringContext.ssource().lower():
             tokens = list(
-                tokenize.generate_tokens(StringIO(context.ssource()).readline))
-            return_ = [tokens[i + 1][0] for i, token in enumerate(tokens)
-                       if token[1] == "return"]
-            if (set(return_) -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} !=
-                    set()):
+                tokenize.generate_tokens(StringIO(context.ssource()).readline)
+            )
+            return_ = [
+                tokens[i + 1][0]
+                for i, token in enumerate(tokens)
+                if token[1] == "return"
+            ]
+            if (
+                set(return_) - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE}
+                != set()
+            ):
                 self.__error(docstringContext.end(), 0, "D134")
-    
+
     def __checkNoBlankLineBefore(self, docstringContext, context):
         """
         Private method to check, that function/method docstrings are not
         preceded by a blank line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         contextLines = context.source()
         cti = 0
-        while (
-            cti < len(contextLines) and
-            not contextLines[cti].strip().startswith(
-                ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''"))
+        while cti < len(contextLines) and not contextLines[cti].strip().startswith(
+            ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''")
         ):
             cti += 1
         if cti == len(contextLines):
             return
-        
+
         if not contextLines[cti - 1].strip():
             self.__error(docstringContext.start(), 0, "D141")
-    
+
     def __checkBlankBeforeAndAfterClass(self, docstringContext, context):
         """
         Private method to check, that class docstrings have one
         blank line around them.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         contextLines = context.source()
         cti = 0
-        while (
-            cti < len(contextLines) and
-            not contextLines[cti].strip().startswith(
-                ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''"))
+        while cti < len(contextLines) and not contextLines[cti].strip().startswith(
+            ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''")
         ):
             cti += 1
         if cti == len(contextLines):
             return
-        
+
         start = cti
-        if contextLines[cti].strip() in (
-                '"""', 'r"""', 'u"""', "'''", "r'''", "u'''"):
+        if contextLines[cti].strip() in ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''"):
             # it is a multi line docstring
             cti += 1
-        
-        while (
-            cti < len(contextLines) and
-            not contextLines[cti].strip().endswith(('"""', "'''"))
+
+        while cti < len(contextLines) and not contextLines[cti].strip().endswith(
+            ('"""', "'''")
         ):
             cti += 1
         end = cti
         if cti >= len(contextLines) - 1:
             return
-        
+
         if contextLines[start - 1].strip():
             self.__error(docstringContext.start(), 0, "D142")
         if contextLines[end + 1].strip():
             self.__error(docstringContext.end(), 0, "D143")
-    
+
     def __checkBlankAfterSummary(self, docstringContext, context):
         """
         Private method to check, that docstring summaries are followed
         by a blank line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstrings = docstringContext.source()
         if len(docstrings) <= 3:
             # correct/invalid one-liner
             return
-        
+
         summary, lineNumber = self.__getSummaryLine(docstringContext)
-        if (
-            len(docstrings) > 2 and
-            docstrings[lineNumber + 1].strip()
-        ):
+        if len(docstrings) > 2 and docstrings[lineNumber + 1].strip():
             self.__error(docstringContext.start() + lineNumber, 0, "D144")
-    
+
     def __checkBlankAfterLastParagraph(self, docstringContext, context):
         """
         Private method to check, that the last paragraph of docstrings is
         followed by a blank line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstrings = docstringContext.source()
         if len(docstrings) <= 3:
             # correct/invalid one-liner
             return
-        
+
         if docstrings[-2].strip():
             self.__error(docstringContext.end(), 0, "D145")
-    
+
     ##################################################################
     ## Checking functionality below (eric specific ones)
     ##################################################################
@@ -1005,127 +1036,130 @@
         """
         Private method to check, that leading and trailing quotes are on
         a line by themselves.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         lines = docstringContext.source()
-        if lines[0].strip().strip('ru"\''):
+        if lines[0].strip().strip("ru\"'"):
             self.__error(docstringContext.start(), 0, "D221")
-        if lines[-1].strip().strip('"\''):
+        if lines[-1].strip().strip("\"'"):
             self.__error(docstringContext.end(), 0, "D222")
-    
+
     def __checkEricEndsWithPeriod(self, docstringContext, context):
         """
         Private method to check, that docstring summaries end with a period.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         summaryLines, lineNumber = self.__getSummaryLines(docstringContext)
         if summaryLines:
             if summaryLines[-1].lstrip().startswith("@"):
                 summaryLines.pop(-1)
             summary = " ".join([s.strip() for s in summaryLines if s])
             if (
-                summary and
-                not summary.endswith(".") and
-                summary.split(None, 1)[0].lower() != "constructor"
+                summary
+                and not summary.endswith(".")
+                and summary.split(None, 1)[0].lower() != "constructor"
             ):
                 self.__error(
-                    docstringContext.start() + lineNumber +
-                    len(summaryLines) - 1,
-                    0, "D231")
-    
+                    docstringContext.start() + lineNumber + len(summaryLines) - 1,
+                    0,
+                    "D231",
+                )
+
     def __checkEricReturn(self, docstringContext, context):
         """
         Private method to check, that docstrings contain an &#64;return line
         if they return anything and don't otherwise.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
-        tokens = list(
-            tokenize.generate_tokens(StringIO(context.ssource()).readline))
-        return_ = [tokens[i + 1][0] for i, token in enumerate(tokens)
-                   if token[1] == "return"]
+
+        tokens = list(tokenize.generate_tokens(StringIO(context.ssource()).readline))
+        return_ = [
+            tokens[i + 1][0] for i, token in enumerate(tokens) if token[1] == "return"
+        ]
         if "@return" not in docstringContext.ssource():
-            if (set(return_) -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} !=
-                    set()):
+            if (
+                set(return_) - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE}
+                != set()
+            ):
                 self.__error(docstringContext.end(), 0, "D234r")
         else:
-            if (set(return_) -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} ==
-                    set()):
+            if (
+                set(return_) - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE}
+                == set()
+            ):
                 self.__error(docstringContext.end(), 0, "D235r")
-    
+
     def __checkEricYield(self, docstringContext, context):
         """
         Private method to check, that docstrings contain an &#64;yield line
         if they return anything and don't otherwise.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
-        tokens = list(
-            tokenize.generate_tokens(StringIO(context.ssource()).readline))
-        yield_ = [tokens[i + 1][0] for i, token in enumerate(tokens)
-                  if token[1] == "yield"]
+
+        tokens = list(tokenize.generate_tokens(StringIO(context.ssource()).readline))
+        yield_ = [
+            tokens[i + 1][0] for i, token in enumerate(tokens) if token[1] == "yield"
+        ]
         if "@yield" not in docstringContext.ssource():
-            if (set(yield_) -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} !=
-                    set()):
+            if set(yield_) - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} != set():
                 self.__error(docstringContext.end(), 0, "D234y")
         else:
-            if (set(yield_) -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} ==
-                    set()):
+            if set(yield_) - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} == set():
                 self.__error(docstringContext.end(), 0, "D235y")
-    
+
     def __checkEricFunctionArguments(self, docstringContext, context):
         """
         Private method to check, that docstrings contain an &#64;param and/or
         &#64;keyparam line for each argument.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         try:
             tree = ast.parse(context.ssource())
         except (SyntaxError, TypeError):
             return
-        if (isinstance(tree, ast.Module) and len(tree.body) == 1 and
-                isinstance(tree.body[0],
-                           (ast.FunctionDef, ast.AsyncFunctionDef))):
+        if (
+            isinstance(tree, ast.Module)
+            and len(tree.body) == 1
+            and isinstance(tree.body[0], (ast.FunctionDef, ast.AsyncFunctionDef))
+        ):
             functionDef = tree.body[0]
             argNames, kwNames = self.__getArgNames(functionDef)
             if "self" in argNames:
                 argNames.remove("self")
             if "cls" in argNames:
                 argNames.remove("cls")
-            
+
             docstring = docstringContext.ssource()
-            if (docstring.count("@param") + docstring.count("@keyparam") <
-                    len(argNames + kwNames)):
+            if docstring.count("@param") + docstring.count("@keyparam") < len(
+                argNames + kwNames
+            ):
                 self.__error(docstringContext.end(), 0, "D236")
-            elif (docstring.count("@param") + docstring.count("@keyparam") >
-                    len(argNames + kwNames)):
+            elif docstring.count("@param") + docstring.count("@keyparam") > len(
+                argNames + kwNames
+            ):
                 self.__error(docstringContext.end(), 0, "D237")
             else:
                 # extract @param and @keyparam from docstring
@@ -1139,7 +1173,7 @@
                             if at == "@keyparam":
                                 kwargs.append(name.lstrip("*"))
                             args.append(name.lstrip("*"))
-                
+
                 # do the checks
                 for name in kwNames:
                     if name not in kwargs:
@@ -1147,24 +1181,23 @@
                         return
                 if argNames + kwNames != args:
                     self.__error(docstringContext.end(), 0, "D239")
-    
+
     def __checkEricException(self, docstringContext, context):
         """
         Private method to check, that docstrings contain an &#64;exception line
         if they raise an exception and don't otherwise.
-        
+
         Note: This method also checks the raised and documented exceptions for
         completeness (i.e. raised exceptions that are not documented or
         documented exceptions that are not raised)
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
-        tokens = list(
-            tokenize.generate_tokens(StringIO(context.ssource()).readline))
+
+        tokens = list(tokenize.generate_tokens(StringIO(context.ssource()).readline))
         exceptions = set()
         raisedExceptions = set()
         tokensLen = len(tokens)
@@ -1172,28 +1205,22 @@
             if token[1] == "raise":
                 exceptions.add(tokens[i + 1][0])
                 if tokens[i + 1][0] == tokenize.NAME:
-                    if (
-                        tokensLen > (i + 2) and
-                        tokens[i + 2][1] == "."
-                    ):
-                        raisedExceptions.add("{0}.{1}".format(
-                            tokens[i + 1][1], tokens[i + 3][1]))
+                    if tokensLen > (i + 2) and tokens[i + 2][1] == ".":
+                        raisedExceptions.add(
+                            "{0}.{1}".format(tokens[i + 1][1], tokens[i + 3][1])
+                        )
                     else:
                         raisedExceptions.add(tokens[i + 1][1])
-        
+
         if (
-            "@exception" not in docstringContext.ssource() and
-            "@throws" not in docstringContext.ssource() and
-            "@raise" not in docstringContext.ssource()
+            "@exception" not in docstringContext.ssource()
+            and "@throws" not in docstringContext.ssource()
+            and "@raise" not in docstringContext.ssource()
         ):
-            if (exceptions -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} !=
-                    set()):
+            if exceptions - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} != set():
                 self.__error(docstringContext.end(), 0, "D250")
         else:
-            if (exceptions -
-                    {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} ==
-                    set()):
+            if exceptions - {tokenize.COMMENT, tokenize.NL, tokenize.NEWLINE} == set():
                 self.__error(docstringContext.end(), 0, "D251")
             else:
                 # step 1: extract documented exceptions
@@ -1204,36 +1231,33 @@
                         exceptionTokens = line.split(None, 2)
                         if len(exceptionTokens) >= 2:
                             documentedExceptions.add(exceptionTokens[1])
-                
+
                 # step 2: report undocumented exceptions
                 for exception in raisedExceptions:
                     if exception not in documentedExceptions:
-                        self.__error(docstringContext.end(), 0, "D252",
-                                     exception)
-                
+                        self.__error(docstringContext.end(), 0, "D252", exception)
+
                 # step 3: report undefined signals
                 for exception in documentedExceptions:
                     if exception not in raisedExceptions:
-                        self.__error(docstringContext.end(), 0, "D253",
-                                     exception)
-    
+                        self.__error(docstringContext.end(), 0, "D253", exception)
+
     def __checkEricSignal(self, docstringContext, context):
         """
         Private method to check, that docstrings contain an &#64;signal line
         if they define signals and don't otherwise.
-        
+
         Note: This method also checks the defined and documented signals for
         completeness (i.e. defined signals that are not documented or
         documented signals that are not defined)
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
-        tokens = list(
-            tokenize.generate_tokens(StringIO(context.ssource()).readline))
+
+        tokens = list(tokenize.generate_tokens(StringIO(context.ssource()).readline))
         definedSignals = set()
         for i, token in enumerate(tokens):
             if token[1] in ("pyqtSignal", "Signal"):
@@ -1241,7 +1265,7 @@
                     definedSignals.add(tokens[i - 4][1])
                 elif tokens[i - 1][1] == "=":
                     definedSignals.add(tokens[i - 2][1])
-        
+
         if "@signal" not in docstringContext.ssource() and definedSignals:
             self.__error(docstringContext.end(), 0, "D260")
         elif "@signal" in docstringContext.ssource():
@@ -1259,79 +1283,76 @@
                             if "(" in signal:
                                 signal = signal.split("(", 1)[0]
                             documentedSignals.add(signal)
-                
+
                 # step 2: report undocumented signals
                 for signal in definedSignals:
                     if signal not in documentedSignals:
                         self.__error(docstringContext.end(), 0, "D262", signal)
-                
+
                 # step 3: report undefined signals
                 for signal in documentedSignals:
                     if signal not in definedSignals:
                         self.__error(docstringContext.end(), 0, "D263", signal)
-    
+
     def __checkEricBlankAfterSummary(self, docstringContext, context):
         """
         Private method to check, that docstring summaries are followed
         by a blank line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstrings = docstringContext.source()
         if len(docstrings) <= 3:
             # correct/invalid one-liner
             return
-        
+
         summaryLines, lineNumber = self.__getSummaryLines(docstringContext)
         if (
-            len(docstrings) - 2 > lineNumber + len(summaryLines) - 1 and
-            docstrings[lineNumber + len(summaryLines)].strip()
+            len(docstrings) - 2 > lineNumber + len(summaryLines) - 1
+            and docstrings[lineNumber + len(summaryLines)].strip()
         ):
             self.__error(docstringContext.start() + lineNumber, 0, "D246")
-    
+
     def __checkEricNoBlankBeforeAndAfterClassOrFunction(
-            self, docstringContext, context):
+        self, docstringContext, context
+    ):
         """
         Private method to check, that class and function/method docstrings
         have no blank line around them.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         contextLines = context.source()
         isClassContext = contextLines[0].lstrip().startswith("class ")
         cti = 0
-        while (
-            cti < len(contextLines) and
-            not contextLines[cti].strip().startswith(
-                ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''"))
+        while cti < len(contextLines) and not contextLines[cti].strip().startswith(
+            ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''")
         ):
             cti += 1
         if cti == len(contextLines):
             return
-        
+
         start = cti
-        if contextLines[cti].strip() in (
-                '"""', 'r"""', 'u"""', "'''", "r'''", "u'''"):
+        if contextLines[cti].strip() in ('"""', 'r"""', 'u"""', "'''", "r'''", "u'''"):
             # it is a multi line docstring
             cti += 1
-        
-        while (
-            cti < len(contextLines) and
-            not contextLines[cti].strip().endswith(('"""', "'''"))
+
+        while cti < len(contextLines) and not contextLines[cti].strip().endswith(
+            ('"""', "'''")
         ):
             cti += 1
         end = cti
         if cti >= len(contextLines) - 1:
             return
-        
+
         if isClassContext:
             if not contextLines[start - 1].strip():
                 self.__error(docstringContext.start(), 0, "D242")
@@ -1344,44 +1365,44 @@
                 self.__error(docstringContext.start(), 0, "D244")
             if not contextLines[end + 1].strip():
                 if (
-                    self.__docType == "eric_black" and
-                    len(contextLines) > end + 2 and
-                    contextLines[end + 2].strip().startswith("def ")
+                    self.__docType == "eric_black"
+                    and len(contextLines) > end + 2
+                    and contextLines[end + 2].strip().startswith("def ")
                 ):
                     return
-                
+
                 self.__error(docstringContext.end(), 0, "D245")
-    
+
     def __checkEricNBlankAfterLastParagraph(self, docstringContext, context):
         """
         Private method to check, that the last paragraph of docstrings is
         not followed by a blank line.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         docstrings = docstringContext.source()
         if len(docstrings) <= 3:
             # correct/invalid one-liner
             return
-        
+
         if not docstrings[-2].strip():
             self.__error(docstringContext.end(), 0, "D247")
-    
+
     def __checkEricSummary(self, docstringContext, context):
         """
         Private method to check, that method docstring summaries start with
         specific words.
-        
+
         @param docstringContext docstring context (DocStyleContext)
         @param context context of the docstring (DocStyleContext)
         """
         if docstringContext is None:
             return
-        
+
         summary, lineNumber = self.__getSummaryLine(docstringContext)
         if summary:
             # check, if the first word is 'Constructor', 'Public',
@@ -1390,74 +1411,93 @@
                 context.source()[0].lstrip().split()[1].split("(", 1)
             )
             firstWord = summary.strip().split(None, 1)[0].lower()
-            if functionName == '__init__':
-                if firstWord != 'constructor':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'constructor')
-            elif (
-                functionName.startswith('__') and
-                functionName.endswith('__')
-            ):
-                if firstWord != 'special':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'special')
+            if functionName == "__init__":
+                if firstWord != "constructor":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "constructor"
+                    )
+            elif functionName.startswith("__") and functionName.endswith("__"):
+                if firstWord != "special":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "special"
+                    )
             elif context.special() == "staticmethod":
                 secondWord = summary.strip().split(None, 2)[1].lower()
-                if firstWord != 'static' and secondWord != 'static':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'static')
-                elif secondWord == 'static':
-                    if functionName.startswith(('__', 'on_')):
-                        if firstWord != 'private':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'private static')
-                    elif (
-                        functionName.startswith('_') or
-                        functionName.endswith('Event')
-                    ):
-                        if firstWord != 'protected':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'protected static')
+                if firstWord != "static" and secondWord != "static":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "static"
+                    )
+                elif secondWord == "static":
+                    if functionName.startswith(("__", "on_")):
+                        if firstWord != "private":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "private static",
+                            )
+                    elif functionName.startswith("_") or functionName.endswith("Event"):
+                        if firstWord != "protected":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "protected static",
+                            )
                     else:
-                        if firstWord != 'public':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'public static')
+                        if firstWord != "public":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "public static",
+                            )
             elif (
-                arguments.startswith(('cls,', 'cls)')) or
-                context.special() == "classmethod"
+                arguments.startswith(("cls,", "cls)"))
+                or context.special() == "classmethod"
             ):
                 secondWord = summary.strip().split(None, 2)[1].lower()
-                if firstWord != 'class' and secondWord != 'class':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'class')
-                elif secondWord == 'class':
-                    if functionName.startswith(('__', 'on_')):
-                        if firstWord != 'private':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'private class')
-                    elif (
-                        functionName.startswith('_') or
-                        functionName.endswith('Event')
-                    ):
-                        if firstWord != 'protected':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'protected class')
+                if firstWord != "class" and secondWord != "class":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "class"
+                    )
+                elif secondWord == "class":
+                    if functionName.startswith(("__", "on_")):
+                        if firstWord != "private":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "private class",
+                            )
+                    elif functionName.startswith("_") or functionName.endswith("Event"):
+                        if firstWord != "protected":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "protected class",
+                            )
                     else:
-                        if firstWord != 'public':
-                            self.__error(docstringContext.start() + lineNumber,
-                                         0, "D232", 'public class')
-            elif functionName.startswith(('__', 'on_')):
-                if firstWord != 'private':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'private')
-            elif (
-                functionName.startswith('_') or
-                functionName.endswith('Event')
-            ):
-                if firstWord != 'protected':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'protected')
+                        if firstWord != "public":
+                            self.__error(
+                                docstringContext.start() + lineNumber,
+                                0,
+                                "D232",
+                                "public class",
+                            )
+            elif functionName.startswith(("__", "on_")):
+                if firstWord != "private":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "private"
+                    )
+            elif functionName.startswith("_") or functionName.endswith("Event"):
+                if firstWord != "protected":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "protected"
+                    )
             else:
-                if firstWord != 'public':
-                    self.__error(docstringContext.start() + lineNumber, 0,
-                                 "D232", 'public')
+                if firstWord != "public":
+                    self.__error(
+                        docstringContext.start() + lineNumber, 0, "D232", "public"
+                    )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,150 +13,177 @@
 
 _docStyleMessages = {
     "D101": QCoreApplication.translate(
-        "DocStyleChecker", "module is missing a docstring"),
+        "DocStyleChecker", "module is missing a docstring"
+    ),
     "D102": QCoreApplication.translate(
-        "DocStyleChecker",
-        "public function/method is missing a docstring"),
+        "DocStyleChecker", "public function/method is missing a docstring"
+    ),
     "D103": QCoreApplication.translate(
-        "DocStyleChecker",
-        "private function/method may be missing a docstring"),
+        "DocStyleChecker", "private function/method may be missing a docstring"
+    ),
     "D104": QCoreApplication.translate(
-        "DocStyleChecker", "public class is missing a docstring"),
+        "DocStyleChecker", "public class is missing a docstring"
+    ),
     "D105": QCoreApplication.translate(
-        "DocStyleChecker", "private class may be missing a docstring"),
+        "DocStyleChecker", "private class may be missing a docstring"
+    ),
     "D111": QCoreApplication.translate(
-        "DocStyleChecker", 'docstring not surrounded by """'),
+        "DocStyleChecker", 'docstring not surrounded by """'
+    ),
     "D112": QCoreApplication.translate(
-        "DocStyleChecker",
-        'docstring containing \\ not surrounded by r"""'),
+        "DocStyleChecker", 'docstring containing \\ not surrounded by r"""'
+    ),
     "D121": QCoreApplication.translate(
-        "DocStyleChecker", "one-liner docstring on multiple lines"),
+        "DocStyleChecker", "one-liner docstring on multiple lines"
+    ),
     "D122": QCoreApplication.translate(
-        "DocStyleChecker", "docstring has wrong indentation"),
+        "DocStyleChecker", "docstring has wrong indentation"
+    ),
     "D130": QCoreApplication.translate(
-        "DocStyleChecker", "docstring does not contain a summary"),
+        "DocStyleChecker", "docstring does not contain a summary"
+    ),
     "D131": QCoreApplication.translate(
-        "DocStyleChecker", "docstring summary does not end with a period"),
+        "DocStyleChecker", "docstring summary does not end with a period"
+    ),
     "D132": QCoreApplication.translate(
         "DocStyleChecker",
-        "docstring summary is not in imperative mood"
-        " (Does instead of Do)"),
+        "docstring summary is not in imperative mood" " (Does instead of Do)",
+    ),
     "D133": QCoreApplication.translate(
         "DocStyleChecker",
-        "docstring summary looks like a function's/method's signature"),
+        "docstring summary looks like a function's/method's signature",
+    ),
     "D134": QCoreApplication.translate(
-        "DocStyleChecker",
-        "docstring does not mention the return value type"),
+        "DocStyleChecker", "docstring does not mention the return value type"
+    ),
     "D141": QCoreApplication.translate(
-        "DocStyleChecker",
-        "function/method docstring is separated by a blank line"),
+        "DocStyleChecker", "function/method docstring is separated by a blank line"
+    ),
     "D142": QCoreApplication.translate(
-        "DocStyleChecker",
-        "class docstring is not preceded by a blank line"),
+        "DocStyleChecker", "class docstring is not preceded by a blank line"
+    ),
     "D143": QCoreApplication.translate(
-        "DocStyleChecker",
-        "class docstring is not followed by a blank line"),
+        "DocStyleChecker", "class docstring is not followed by a blank line"
+    ),
     "D144": QCoreApplication.translate(
-        "DocStyleChecker",
-        "docstring summary is not followed by a blank line"),
+        "DocStyleChecker", "docstring summary is not followed by a blank line"
+    ),
     "D145": QCoreApplication.translate(
-        "DocStyleChecker",
-        "last paragraph of docstring is not followed by a blank line"),
-    
+        "DocStyleChecker", "last paragraph of docstring is not followed by a blank line"
+    ),
     "D201": QCoreApplication.translate(
-        "DocStyleChecker", "module docstring is still a default string"),
+        "DocStyleChecker", "module docstring is still a default string"
+    ),
     "D202.1": QCoreApplication.translate(
-        "DocStyleChecker", "function docstring is still a default string"),
+        "DocStyleChecker", "function docstring is still a default string"
+    ),
     "D202.2": QCoreApplication.translate(
-        "DocStyleChecker",
-        "function docstring still contains some placeholders"),
+        "DocStyleChecker", "function docstring still contains some placeholders"
+    ),
     "D203": QCoreApplication.translate(
-        "DocStyleChecker",
-        "private function/method is missing a docstring"),
+        "DocStyleChecker", "private function/method is missing a docstring"
+    ),
     "D205": QCoreApplication.translate(
-        "DocStyleChecker", "private class is missing a docstring"),
+        "DocStyleChecker", "private class is missing a docstring"
+    ),
     "D206": QCoreApplication.translate(
-        "DocStyleChecker", "class docstring is still a default string"),
+        "DocStyleChecker", "class docstring is still a default string"
+    ),
     "D221": QCoreApplication.translate(
-        "DocStyleChecker",
-        "leading quotes of docstring not on separate line"),
+        "DocStyleChecker", "leading quotes of docstring not on separate line"
+    ),
     "D222": QCoreApplication.translate(
-        "DocStyleChecker",
-        "trailing quotes of docstring not on separate line"),
+        "DocStyleChecker", "trailing quotes of docstring not on separate line"
+    ),
     "D231": QCoreApplication.translate(
-        "DocStyleChecker", "docstring summary does not end with a period"),
+        "DocStyleChecker", "docstring summary does not end with a period"
+    ),
     "D232": QCoreApplication.translate(
-        "DocStyleChecker", "docstring summary does not start with '{0}'"),
+        "DocStyleChecker", "docstring summary does not start with '{0}'"
+    ),
     "D234r": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring does not contain a @return line but function/method"
-        " returns something"),
+        " returns something",
+    ),
     "D235r": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring contains a @return line but function/method doesn't"
-        " return anything"),
+        " return anything",
+    ),
     "D234y": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring does not contain a @yield line but function/method"
-        " yields something"),
+        " yields something",
+    ),
     "D235y": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring contains a @yield line but function/method doesn't"
-        " yield anything"),
+        " yield anything",
+    ),
     "D236": QCoreApplication.translate(
-        "DocStyleChecker",
-        "docstring does not contain enough @param/@keyparam lines"),
+        "DocStyleChecker", "docstring does not contain enough @param/@keyparam lines"
+    ),
     "D237": QCoreApplication.translate(
-        "DocStyleChecker",
-        "docstring contains too many @param/@keyparam lines"),
+        "DocStyleChecker", "docstring contains too many @param/@keyparam lines"
+    ),
     "D238": QCoreApplication.translate(
         "DocStyleChecker",
-        "keyword only arguments must be documented with @keyparam lines"),
+        "keyword only arguments must be documented with @keyparam lines",
+    ),
     "D239": QCoreApplication.translate(
-        "DocStyleChecker", "order of @param/@keyparam lines does"
-        " not match the function/method signature"),
-    "D242": QCoreApplication.translate(
-        "DocStyleChecker", "class docstring is preceded by a blank line"),
-    "D243": QCoreApplication.translate(
-        "DocStyleChecker", "class docstring is followed by a blank line"),
-    "D244": QCoreApplication.translate(
         "DocStyleChecker",
-        "function/method docstring is preceded by a blank line"),
+        "order of @param/@keyparam lines does"
+        " not match the function/method signature",
+    ),
+    "D242": QCoreApplication.translate(
+        "DocStyleChecker", "class docstring is preceded by a blank line"
+    ),
+    "D243": QCoreApplication.translate(
+        "DocStyleChecker", "class docstring is followed by a blank line"
+    ),
+    "D244": QCoreApplication.translate(
+        "DocStyleChecker", "function/method docstring is preceded by a blank line"
+    ),
     "D245": QCoreApplication.translate(
-        "DocStyleChecker",
-        "function/method docstring is followed by a blank line"),
+        "DocStyleChecker", "function/method docstring is followed by a blank line"
+    ),
     "D246": QCoreApplication.translate(
-        "DocStyleChecker",
-        "docstring summary is not followed by a blank line"),
+        "DocStyleChecker", "docstring summary is not followed by a blank line"
+    ),
     "D247": QCoreApplication.translate(
-        "DocStyleChecker",
-        "last paragraph of docstring is followed by a blank line"),
+        "DocStyleChecker", "last paragraph of docstring is followed by a blank line"
+    ),
     "D250": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring does not contain a @exception line but function/method"
-        " raises an exception"),
+        " raises an exception",
+    ),
     "D251": QCoreApplication.translate(
         "DocStyleChecker",
         "docstring contains a @exception line but function/method doesn't"
-        " raise an exception"),
+        " raise an exception",
+    ),
     "D252": QCoreApplication.translate(
-        "DocStyleChecker",
-        "raised exception '{0}' is not documented in docstring"),
+        "DocStyleChecker", "raised exception '{0}' is not documented in docstring"
+    ),
     "D253": QCoreApplication.translate(
-        "DocStyleChecker",
-        "documented exception '{0}' is not raised"),
+        "DocStyleChecker", "documented exception '{0}' is not raised"
+    ),
     "D260": QCoreApplication.translate(
         "DocStyleChecker",
-        "docstring does not contain a @signal line but class defines signals"),
+        "docstring does not contain a @signal line but class defines signals",
+    ),
     "D261": QCoreApplication.translate(
         "DocStyleChecker",
-        "docstring contains a @signal line but class doesn't define signals"),
+        "docstring contains a @signal line but class doesn't define signals",
+    ),
     "D262": QCoreApplication.translate(
-        "DocStyleChecker",
-        "defined signal '{0}' is not documented in docstring"),
+        "DocStyleChecker", "defined signal '{0}' is not documented in docstring"
+    ),
     "D263": QCoreApplication.translate(
-        "DocStyleChecker",
-        "documented signal '{0}' is not defined"),
+        "DocStyleChecker", "documented signal '{0}' is not defined"
+    ),
 }
 
 _docStyleMessagesSampleArgs = {
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportNode.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportNode.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class representing an exception for an invalid import node.
     """
+
     pass
 
 
@@ -29,10 +30,11 @@
     """
     Class representing an import or import from node.
     """
+
     def __init__(self, appNames, astNode, checker):
         """
         Constructor
-        
+
         @param appNames list of application package names
         @type list of str
         @param astNode reference to the ast node
@@ -46,19 +48,19 @@
             raise ImportNodeException(
                 "Node type {0} not recognized".format(type(astNode))
             )
-        
+
         self.node = astNode
         self.error = None
         level = None
         group = None
-        
+
         if isinstance(astNode, ast.Import):
             self.nodeType = NodeTypeEnum.IMPORT
             names = astNode.names
 
             self.moduleName = names[0].name
             level = 0
-        
+
         elif isinstance(astNode, ast.ImportFrom):
             module = astNode.module
             self.moduleName = "" if module is None else module
@@ -69,7 +71,7 @@
             if names != expectedNames:
                 self.error = (self.node, "I202", ", ".join(expectedNames))
             level = astNode.level
-        
+
         if self.moduleName == "__future__":
             group = GroupEnum.FUTURE
         elif self.moduleName in checker.getStandardModules():
@@ -79,13 +81,12 @@
         else:
             group = GroupEnum.THIRD_PARTY
             for name in appNames:
-                if (
-                    name == self.moduleName or
-                    self.moduleName.startswith("{0}.".format(name))
+                if name == self.moduleName or self.moduleName.startswith(
+                    "{0}.".format(name)
                 ):
                     group = GroupEnum.APPLICATION
                     break
-        
+
         if group == GroupEnum.STDLIB:
             self.sorter = group, self.nodeType, self.moduleName
         else:
@@ -93,57 +94,54 @@
             dotIndex = m.find(".")
             topName = m if dotIndex == -1 else m[:dotIndex]
             self.sorter = group, level, topName, self.nodeType, m
-    
+
     def __eq__(self, other):
         """
         Special method implementing the equality operator.
-        
+
         @param other reference to the object to compare
         @type ImportNode
         @return flag indicating equality
         @rtype bool
         """
         return self.sorter == other.sorter
-    
+
     def __lt__(self, other):
         """
         Special method implementing the less than operator.
-        
+
         @param other reference to the object to compare
         @type ImportNode
         @return flag indicating a less than situation
         @rtype bool
         """
         return self.sorter < other.sorter
-    
+
     def __str__(self):
         """
         Special method to create a string representation of the instance.
-        
+
         @return string representation of the instance
         @rtype str
         @exception ImportNodeException raised to indicate an invalid node was
             given to this class
         """
-        if (
-            self.nodeType not in (NodeTypeEnum.IMPORT,
-                                  NodeTypeEnum.IMPORT_FROM)
-        ):
+        if self.nodeType not in (NodeTypeEnum.IMPORT, NodeTypeEnum.IMPORT_FROM):
             raise ImportNodeException(
                 "The node type {0} is not recognized.".format(self.nodeType)
             )
-        
+
         if self.nodeType == NodeTypeEnum.IMPORT:
             return "import {0}".format(self.moduleName)
         elif self.nodeType == NodeTypeEnum.IMPORT_FROM:
             level = self.node.level
             levelStr = "" if level == 0 else "." * level
             names = [
-                n.name + ("" if n.asname is None else
-                          " as {0}".format(n.asname))
+                n.name + ("" if n.asname is None else " as {0}".format(n.asname))
                 for n in self.node.names
             ]
             return "from {0}{1} import {2}".format(
-                levelStr, self.moduleName, ", ".join(names))
-        
+                levelStr, self.moduleName, ", ".join(names)
+            )
+
         return None
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,22 +16,28 @@
     """
     Class implementing a checker for import statements.
     """
+
     Codes = [
         ## Local imports
-        "I101", "I102", "I103",
-        
+        "I101",
+        "I102",
+        "I103",
         ## Imports order
-        "I201", "I202", "I203", "I204",
-        
+        "I201",
+        "I202",
+        "I203",
+        "I204",
         ## Various other import related
-        "I901", "I902", "I903", "I904",
+        "I901",
+        "I902",
+        "I903",
+        "I904",
     ]
 
-    def __init__(self, source, filename, tree, select, ignore, expected,
-                 repeat, args):
+    def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -57,25 +63,24 @@
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
         self.__args = args
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         checkersWithCodes = [
             (self.__checkLocalImports, ("I101", "I102", "I103")),
             (self.__checkImportOrder, ("I201", "I202", "I203", "I204")),
             (self.__tidyImports, ("I901", "I902", "I903", "I904")),
         ]
-        
+
         self.__checkers = []
         for checker, codes in checkersWithCodes:
-            if any(not (code and self.__ignoreCode(code))
-                    for code in codes):
+            if any(not (code and self.__ignoreCode(code)) for code in codes):
                 self.__checkers.append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -85,13 +90,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -103,16 +107,16 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
             self.errors.append(
@@ -124,7 +128,7 @@
                     "args": args,
                 }
             )
-    
+
     def run(self):
         """
         Public method to check the given source against miscellaneous
@@ -133,18 +137,18 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         for check in self.__checkers:
             check()
-    
+
     def getStandardModules(self):
         """
         Public method to get a list of modules of the standard library.
-        
+
         @return set of builtin modules
         @rtype set of str
         """
@@ -152,58 +156,231 @@
             return sys.stdlib_module_names
         except AttributeError:
             return {
-                "__future__", "__main__", "_dummy_thread", "_thread", "abc",
-                "aifc", "argparse", "array", "ast", "asynchat", "asyncio",
-                "asyncore", "atexit", "audioop", "base64", "bdb", "binascii",
-                "binhex", "bisect", "builtins", "bz2", "calendar", "cgi",
-                "cgitb", "chunk", "cmath", "cmd", "code", "codecs", "codeop",
-                "collections", "colorsys", "compileall", "concurrent",
-                "configparser", "contextlib", "contextvars", "copy", "copyreg",
-                "cProfile", "crypt", "csv", "ctypes", "curses", "dataclasses",
-                "datetime", "dbm", "decimal", "difflib", "dis", "distutils",
-                "doctest", "dummy_threading", "email", "encodings",
-                "ensurepip", "enum", "errno", "faulthandler", "fcntl",
-                "filecmp", "fileinput", "fnmatch", "formatter", "fractions",
-                "ftplib", "functools", "gc", "getopt", "getpass", "gettext",
-                "glob", "grp", "gzip", "hashlib", "heapq", "hmac", "html",
-                "http", "imaplib", "imghdr", "imp", "importlib", "inspect",
-                "io", "ipaddress", "itertools", "json", "keyword", "lib2to3",
-                "linecache", "locale", "logging", "lzma", "mailbox", "mailcap",
-                "marshal", "math", "mimetypes", "mmap", "modulefinder",
-                "msilib", "msvcrt", "multiprocessing", "netrc", "nis",
-                "nntplib", "numbers", "operator", "optparse", "os",
-                "ossaudiodev", "parser", "pathlib", "pdb", "pickle",
-                "pickletools", "pipes", "pkgutil", "platform", "plistlib",
-                "poplib", "posix", "pprint", "profile", "pstats", "pty", "pwd",
-                "py_compile", "pyclbr", "pydoc", "queue", "quopri", "random",
-                "re", "readline", "reprlib", "resource", "rlcompleter",
-                "runpy", "sched", "secrets", "select", "selectors", "shelve",
-                "shlex", "shutil", "signal", "site", "smtpd", "smtplib",
-                "sndhdr", "socket", "socketserver", "spwd", "sqlite3", "ssl",
-                "stat", "statistics", "string", "stringprep", "struct",
-                "subprocess", "sunau", "symbol", "symtable", "sys",
-                "sysconfig", "syslog", "tabnanny", "tarfile", "telnetlib",
-                "tempfile", "termios", "test", "textwrap", "threading", "time",
-                "timeit", "tkinter", "token", "tokenize", "trace", "traceback",
-                "tracemalloc", "tty", "turtle", "turtledemo", "types",
-                "typing", "unicodedata", "unittest", "urllib", "uu", "uuid",
-                "venv", "warnings", "wave", "weakref", "webbrowser", "winreg",
-                "winsound", "wsgiref", "xdrlib", "xml", "xmlrpc", "zipapp",
-                "zipfile", "zipimport", "zlib", "zoneinfo",
+                "__future__",
+                "__main__",
+                "_dummy_thread",
+                "_thread",
+                "abc",
+                "aifc",
+                "argparse",
+                "array",
+                "ast",
+                "asynchat",
+                "asyncio",
+                "asyncore",
+                "atexit",
+                "audioop",
+                "base64",
+                "bdb",
+                "binascii",
+                "binhex",
+                "bisect",
+                "builtins",
+                "bz2",
+                "calendar",
+                "cgi",
+                "cgitb",
+                "chunk",
+                "cmath",
+                "cmd",
+                "code",
+                "codecs",
+                "codeop",
+                "collections",
+                "colorsys",
+                "compileall",
+                "concurrent",
+                "configparser",
+                "contextlib",
+                "contextvars",
+                "copy",
+                "copyreg",
+                "cProfile",
+                "crypt",
+                "csv",
+                "ctypes",
+                "curses",
+                "dataclasses",
+                "datetime",
+                "dbm",
+                "decimal",
+                "difflib",
+                "dis",
+                "distutils",
+                "doctest",
+                "dummy_threading",
+                "email",
+                "encodings",
+                "ensurepip",
+                "enum",
+                "errno",
+                "faulthandler",
+                "fcntl",
+                "filecmp",
+                "fileinput",
+                "fnmatch",
+                "formatter",
+                "fractions",
+                "ftplib",
+                "functools",
+                "gc",
+                "getopt",
+                "getpass",
+                "gettext",
+                "glob",
+                "grp",
+                "gzip",
+                "hashlib",
+                "heapq",
+                "hmac",
+                "html",
+                "http",
+                "imaplib",
+                "imghdr",
+                "imp",
+                "importlib",
+                "inspect",
+                "io",
+                "ipaddress",
+                "itertools",
+                "json",
+                "keyword",
+                "lib2to3",
+                "linecache",
+                "locale",
+                "logging",
+                "lzma",
+                "mailbox",
+                "mailcap",
+                "marshal",
+                "math",
+                "mimetypes",
+                "mmap",
+                "modulefinder",
+                "msilib",
+                "msvcrt",
+                "multiprocessing",
+                "netrc",
+                "nis",
+                "nntplib",
+                "numbers",
+                "operator",
+                "optparse",
+                "os",
+                "ossaudiodev",
+                "parser",
+                "pathlib",
+                "pdb",
+                "pickle",
+                "pickletools",
+                "pipes",
+                "pkgutil",
+                "platform",
+                "plistlib",
+                "poplib",
+                "posix",
+                "pprint",
+                "profile",
+                "pstats",
+                "pty",
+                "pwd",
+                "py_compile",
+                "pyclbr",
+                "pydoc",
+                "queue",
+                "quopri",
+                "random",
+                "re",
+                "readline",
+                "reprlib",
+                "resource",
+                "rlcompleter",
+                "runpy",
+                "sched",
+                "secrets",
+                "select",
+                "selectors",
+                "shelve",
+                "shlex",
+                "shutil",
+                "signal",
+                "site",
+                "smtpd",
+                "smtplib",
+                "sndhdr",
+                "socket",
+                "socketserver",
+                "spwd",
+                "sqlite3",
+                "ssl",
+                "stat",
+                "statistics",
+                "string",
+                "stringprep",
+                "struct",
+                "subprocess",
+                "sunau",
+                "symbol",
+                "symtable",
+                "sys",
+                "sysconfig",
+                "syslog",
+                "tabnanny",
+                "tarfile",
+                "telnetlib",
+                "tempfile",
+                "termios",
+                "test",
+                "textwrap",
+                "threading",
+                "time",
+                "timeit",
+                "tkinter",
+                "token",
+                "tokenize",
+                "trace",
+                "traceback",
+                "tracemalloc",
+                "tty",
+                "turtle",
+                "turtledemo",
+                "types",
+                "typing",
+                "unicodedata",
+                "unittest",
+                "urllib",
+                "uu",
+                "uuid",
+                "venv",
+                "warnings",
+                "wave",
+                "weakref",
+                "webbrowser",
+                "winreg",
+                "winsound",
+                "wsgiref",
+                "xdrlib",
+                "xml",
+                "xmlrpc",
+                "zipapp",
+                "zipfile",
+                "zipimport",
+                "zlib",
+                "zoneinfo",
             }
-    
+
     #######################################################################
     ## Local imports
     ##
     ## adapted from: flake8-local-import v1.0.6
     #######################################################################
-    
+
     def __checkLocalImports(self):
         """
         Private method to check local imports.
         """
         from .LocalImportVisitor import LocalImportVisitor
-        
+
         visitor = LocalImportVisitor(self.__args, self)
         visitor.visit(copy.deepcopy(self.__tree))
         for violation in visitor.violations:
@@ -211,70 +388,69 @@
                 node = violation[0]
                 reason = violation[1]
                 self.__error(node.lineno - 1, node.col_offset, reason)
-    
+
     #######################################################################
     ## Import order
     ##
     ## adapted from: flake8-alphabetize v0.0.17
     #######################################################################
-    
+
     def __checkImportOrder(self):
         """
         Private method to check the order of import statements.
         """
         from .ImportNode import ImportNode
-        
+
         errors = []
         imports = []
         importNodes, listNode = self.__findNodes(self.__tree)
-        
+
         # check for an error in '__all__'
         allError = self.__findErrorInAll(listNode)
         if allError is not None:
             errors.append(allError)
-        
+
         for importNode in importNodes:
-            if (
-                isinstance(importNode, ast.Import) and
-                len(importNode.names) > 1
-            ):
+            if isinstance(importNode, ast.Import) and len(importNode.names) > 1:
                 # skip suck imports because its already handled by pycodestyle
                 continue
-            
-            imports.append(ImportNode(
-                self.__args.get("ApplicationPackageNames", []),
-                importNode, self))
-        
+
+            imports.append(
+                ImportNode(
+                    self.__args.get("ApplicationPackageNames", []), importNode, self
+                )
+            )
+
         lenImports = len(imports)
         if lenImports > 0:
             p = imports[0]
             if p.error is not None:
                 errors.append(p.error)
-            
+
             if lenImports > 1:
                 for n in imports[1:]:
                     if n.error is not None:
                         errors.append(n.error)
-                    
+
                     if n == p:
                         errors.append((n.node, "I203", str(p), str(n)))
                     elif n < p:
                         errors.append((n.node, "I201", str(n), str(p)))
-                    
+
                     p = n
-        
+
         for error in errors:
             if not self.__ignoreCode(error[1]):
                 node = error[0]
                 reason = error[1]
                 args = error[2:]
                 self.__error(node.lineno - 1, node.col_offset, reason, *args)
-    
+
     def __findNodes(self, tree):
         """
         Private method to find all import and import from nodes of the given
         tree.
-        
+
         @param tree reference to the ast node tree to be parsed
         @type ast.AST
         @return tuple containing a list of import nodes and the '__all__' node
@@ -282,14 +458,14 @@
         """
         importNodes = []
         listNode = None
-        
+
         if isinstance(tree, ast.Module):
             body = tree.body
-            
+
             for n in body:
                 if isinstance(n, (ast.Import, ast.ImportFrom)):
                     importNodes.append(n)
-                
+
                 elif isinstance(n, ast.Assign):
                     for t in n.targets:
                         if isinstance(t, ast.Name) and t.id == "__all__":
@@ -297,13 +473,13 @@
 
                             if isinstance(value, (ast.List, ast.Tuple)):
                                 listNode = value
-        
+
         return importNodes, listNode
-    
+
     def __findErrorInAll(self, node):
         """
         Private method to check the '__all__' node for errors.
-        
+
         @param node reference to the '__all__' node
         @type ast.List or ast.Tuple
         @return tuple containing a reference to the node and an error code
@@ -323,46 +499,40 @@
             expectedList = sorted(actualList)
             if expectedList != actualList:
                 return (node, "I204", ", ".join(expectedList))
-        
+
         return None
-    
+
     #######################################################################
     ## Tidy imports
     ##
     ## adapted from: flake8-tidy-imports v4.5.0
     #######################################################################
-    
+
     def __tidyImports(self):
         """
         Private method to check various other import related topics.
         """
         self.__bannedModules = self.__args.get("BannedModules", [])
         self.__banRelativeImports = self.__args.get("BanRelativeImports", "")
-        
+
         ruleMethods = []
         if not self.__ignoreCode("I901"):
             ruleMethods.append(self.__checkUnnecessaryAlias)
-        if (
-            not self.__ignoreCode("I902") and
-            bool(self.__bannedModules)
-        ):
+        if not self.__ignoreCode("I902") and bool(self.__bannedModules):
             ruleMethods.append(self.__checkBannedImport)
         if (
-            (not self.__ignoreCode("I903") and
-             self.__banRelativeImports == "parents") or
-            (not self.__ignoreCode("I904") and
-             self.__banRelativeImports == "true")
-        ):
+            not self.__ignoreCode("I903") and self.__banRelativeImports == "parents"
+        ) or (not self.__ignoreCode("I904") and self.__banRelativeImports == "true"):
             ruleMethods.append(self.__checkBannedRelativeImports)
-        
+
         for node in ast.walk(self.__tree):
             for method in ruleMethods:
                 method(node)
-    
+
     def __checkUnnecessaryAlias(self, node):
         """
         Private method to check unnecessary import aliases.
-        
+
         @param node reference to the node to be checked
         @type ast.AST
         """
@@ -373,36 +543,32 @@
                     importedName = alias.name
                 else:
                     fromName, importedName = alias.name.rsplit(".", 1)
-                
+
                 if importedName == alias.asname:
                     if fromName:
-                        rewritten = "from {0} import {1}".format(
-                            fromName, importedName)
+                        rewritten = "from {0} import {1}".format(fromName, importedName)
                     else:
                         rewritten = "import {0}".format(importedName)
-                    
-                    self.__error(node.lineno - 1, node.col_offset, "I901",
-                                 rewritten)
-        
+
+                    self.__error(node.lineno - 1, node.col_offset, "I901", rewritten)
+
         elif isinstance(node, ast.ImportFrom):
             for alias in node.names:
                 if alias.name == alias.asname:
-                    rewritten = "from {0} import {1}".format(
-                        node.module, alias.name)
-                    
-                    self.__error(node.lineno - 1, node.col_offset, "I901",
-                                 rewritten)
-    
+                    rewritten = "from {0} import {1}".format(node.module, alias.name)
+
+                    self.__error(node.lineno - 1, node.col_offset, "I901", rewritten)
+
     def __checkBannedImport(self, node):
         """
         Private method to check import of banned modules.
-        
+
         @param node reference to the node to be checked
         @type ast.AST
         """
         if not bool(self.__bannedModules):
             return
-        
+
         if isinstance(node, ast.Import):
             moduleNames = [alias.name for alias in node.names]
         elif isinstance(node, ast.ImportFrom):
@@ -412,12 +578,12 @@
                 moduleNames.append("{0}.{1}".format(nodeModule, alias.name))
         else:
             return
-        
+
         # Sort from most to least specific paths.
         moduleNames.sort(key=len, reverse=True)
-        
+
         warned = set()
-        
+
         for moduleName in moduleNames:
             if moduleName in self.__bannedModules:
                 if any(mod.startswith(moduleName) for mod in warned):
@@ -426,29 +592,28 @@
                     continue
                 else:
                     warned.add(moduleName)
-                self.__error(node.lineno - 1, node.col_offset, "I902",
-                             moduleName)
-    
+                self.__error(node.lineno - 1, node.col_offset, "I902", moduleName)
+
     def __checkBannedRelativeImports(self, node):
         """
         Private method to check if relative imports are banned.
-        
+
         @param node reference to the node to be checked
         @type ast.AST
         """
         if not self.__banRelativeImports:
             return
-        
+
         elif self.__banRelativeImports == "parents":
             minNodeLevel = 1
             msgCode = "I903"
         else:
             minNodeLevel = 0
             msgCode = "I904"
-        
+
         if (
-            self.__banRelativeImports and
-            isinstance(node, ast.ImportFrom) and
-            node.level > minNodeLevel
+            self.__banRelativeImports
+            and isinstance(node, ast.ImportFrom)
+            and node.level > minNodeLevel
         ):
             self.__error(node.lineno - 1, node.col_offset, msgCode)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsEnums.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsEnums.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,6 +18,7 @@
     """
     Class representing the various import groups.
     """
+
     FUTURE = 1
     STDLIB = 2
     THIRD_PARTY = 3
@@ -28,5 +29,6 @@
     """
     Class representing the import node types.
     """
+
     IMPORT = 1
     IMPORT_FROM = 2
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/LocalImportVisitor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/LocalImportVisitor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a node visitor for checking local import statements.
     """
+
     def __init__(self, args, checker):
         """
         Constructor
-        
+
         @param args dictionary containing the checker arguments
         @type dict
         @param checker reference to the checker
@@ -29,126 +30,120 @@
         """
         self.__appImportNames = args.get("ApplicationPackageNames", [])
         self.__checker = checker
-        
+
         self.violations = []
-    
+
     def visit(self, node):
         """
         Public method to traverse the tree of an AST node.
-        
+
         @param node AST node to parse
         @type ast.AST
         """
         previous = None
-        isLocal = (
-            isinstance(node, ast.FunctionDef) or
-            getattr(node, 'is_local', False)
-        )
+        isLocal = isinstance(node, ast.FunctionDef) or getattr(node, "is_local", False)
         for child in ast.iter_child_nodes(node):
             child.parent = node
             child.previous = previous
             child.is_local = isLocal
             previous = child
-        
+
         super().visit(node)
-    
+
     def visit_FunctionDef(self, node):
         """
         Public method to handle a function definition.
-        
+
         @param node reference to the node to be processed
         @type ast.FunctionDef
         """
         children = list(ast.iter_child_nodes(node))
         if len(children) > 1:
             firstStatement = children[1]
-            
+
             if isinstance(firstStatement, ast.Expr):
-                value = getattr(firstStatement, 'value', None)
+                value = getattr(firstStatement, "value", None)
                 if isinstance(value, ast.Constant):
                     firstStatement.is_doc_str = True
-        
+
         self.generic_visit(node)
-    
+
     def visit_Import(self, node):
         """
         Public method to handle an import statement.
-        
+
         @param node reference to the node to be processed
         @type ast.Import
         """
-        if not getattr(node, 'is_local', False):
+        if not getattr(node, "is_local", False):
             self.generic_visit(node)
             return
-        
+
         for name in node.names:
-            self.__assertExternalModule(node, name.name or '')
-        
+            self.__assertExternalModule(node, name.name or "")
+
         self.__visitImportNode(node)
-    
+
     def visit_ImportFrom(self, node):
         """
         Public method to handle an import from statement.
-        
+
         @param node reference to the node to be processed
         @type ast.ImportFrom
         """
-        if not getattr(node, 'is_local', False):
+        if not getattr(node, "is_local", False):
             self.generic_visit(node)
             return
-        
-        self.__assertExternalModule(node, node.module or '')
-        
+
+        self.__assertExternalModule(node, node.module or "")
+
         self.__visitImportNode(node)
-    
+
     def __visitImportNode(self, node):
         """
         Private method to handle an import or import from statement.
-        
+
         @param node reference to the node to be processed
         @type ast.Import or ast.ImportFrom
         """
-        parent = getattr(node, 'parent', None)
+        parent = getattr(node, "parent", None)
         if isinstance(parent, ast.Module):
             self.generic_visit(node)
             return
-        
-        previous = getattr(node, 'previous', None)
-        
+
+        previous = getattr(node, "previous", None)
+
         isAllowedPrevious = (
-            (isinstance(previous, ast.Expr) and
-             getattr(previous, 'is_doc_str', False)) or
-            isinstance(previous, (ast.Import, ast.ImportFrom, ast.arguments))
-        )
-        
+            isinstance(previous, ast.Expr) and getattr(previous, "is_doc_str", False)
+        ) or isinstance(previous, (ast.Import, ast.ImportFrom, ast.arguments))
+
         if not isinstance(parent, ast.FunctionDef) or not isAllowedPrevious:
             self.violations.append((node, "I101"))
-        
+
         self.generic_visit(node)
-    
+
     def __assertExternalModule(self, node, module):
         """
         Private method to assert the given node.
-        
+
         @param node reference to the node to be processed
         @type ast.stmt
         @param module name of the module
         @type str
         """
-        parent = getattr(node, 'parent', None)
+        parent = getattr(node, "parent", None)
         if isinstance(parent, ast.Module):
             return
-        
-        modulePrefix = module + '.'
-        
-        if (
-            getattr(node, 'level', 0) != 0 or
-            any(modulePrefix.startswith(appModule + '.')
-                for appModule in self.__appImportNames)
+
+        modulePrefix = module + "."
+
+        if getattr(node, "level", 0) != 0 or any(
+            modulePrefix.startswith(appModule + ".")
+            for appModule in self.__appImportNames
         ):
             return
-        
-        if module.split('.')[0] not in self.__checker.getStandardModules():
+
+        if module.split(".")[0] not in self.__checker.getStandardModules():
             self.violations.append((node, "I102"))
         else:
             self.violations.append((node, "I103"))
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,44 +12,39 @@
 
 _importsMessages = {
     "I101": QCoreApplication.translate(
-        "ImportsChecker",
-        "local import must be at the beginning of the method body"),
+        "ImportsChecker", "local import must be at the beginning of the method body"
+    ),
     "I102": QCoreApplication.translate(
         "ImportsChecker",
-        "packages from external modules should not be imported locally"),
+        "packages from external modules should not be imported locally",
+    ),
     "I103": QCoreApplication.translate(
         "ImportsChecker",
-        "packages from standard modules should not be imported locally"),
-    
+        "packages from standard modules should not be imported locally",
+    ),
     "I201": QCoreApplication.translate(
         "ImportsChecker",
-        "Import statements are in the wrong order. "
-        "'{0}' should be before '{1}'"),
+        "Import statements are in the wrong order. " "'{0}' should be before '{1}'",
+    ),
     "I202": QCoreApplication.translate(
-        "ImportsChecker",
-        "Imported names are in the wrong order. "
-        "Should be '{0}'"),
+        "ImportsChecker", "Imported names are in the wrong order. " "Should be '{0}'"
+    ),
     "I203": QCoreApplication.translate(
         "ImportsChecker",
-        "Import statements should be combined. "
-        "'{0}' should be combined with '{1}'"),
+        "Import statements should be combined. " "'{0}' should be combined with '{1}'",
+    ),
     "I204": QCoreApplication.translate(
         "ImportsChecker",
-        "The names in __all__ are in the wrong order. "
-        "The order should be '{0}'"),
-    
+        "The names in __all__ are in the wrong order. " "The order should be '{0}'",
+    ),
     "I901": QCoreApplication.translate(
-        "ImportsChecker",
-        "unnecessary import alias - rewrite as '{0}'"),
-    "I902": QCoreApplication.translate(
-        "ImportsChecker",
-        "banned import '{0}' used"),
+        "ImportsChecker", "unnecessary import alias - rewrite as '{0}'"
+    ),
+    "I902": QCoreApplication.translate("ImportsChecker", "banned import '{0}' used"),
     "I903": QCoreApplication.translate(
-        "ImportsChecker",
-        "relative imports from parent modules are banned"),
-    "I904": QCoreApplication.translate(
-        "ImportsChecker",
-        "relative imports are banned"),
+        "ImportsChecker", "relative imports from parent modules are banned"
+    ),
+    "I904": QCoreApplication.translate("ImportsChecker", "relative imports are banned"),
 }
 
 _importsMessagesSampleArgs = {
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,7 +27,7 @@
 def composeCallPath(node):
     """
     Generator function to assemble the call path of a given node.
-    
+
     @param node node to assemble call path for
     @type ast.Node
     @yield call path components
@@ -44,88 +44,133 @@
     """
     Class implementing a checker for miscellaneous checks.
     """
+
     Codes = [
         ## Coding line
-        "M101", "M102",
-        
+        "M101",
+        "M102",
         ## Copyright
-        "M111", "M112",
-        
+        "M111",
+        "M112",
         ## Shadowed Builtins
-        "M131", "M132",
-        
+        "M131",
+        "M132",
         ## Comprehensions
-        "M181", "M182", "M183", "M184", "M185", "M186", "M187", "M188",
+        "M181",
+        "M182",
+        "M183",
+        "M184",
+        "M185",
+        "M186",
+        "M187",
+        "M188",
         "M189",
-        "M191", "M192", "M193", "M195", "M196", "M197", "M198",
-        
+        "M191",
+        "M192",
+        "M193",
+        "M195",
+        "M196",
+        "M197",
+        "M198",
         ## Dictionaries with sorted keys
         "M201",
-        
         ## Naive datetime usage
-        "M301", "M302", "M303", "M304", "M305", "M306", "M307", "M308",
-        "M311", "M312", "M313", "M314", "M315",
+        "M301",
+        "M302",
+        "M303",
+        "M304",
+        "M305",
+        "M306",
+        "M307",
+        "M308",
+        "M311",
+        "M312",
+        "M313",
+        "M314",
+        "M315",
         "M321",
-        
         ## sys.version and sys.version_info usage
-        "M401", "M402", "M403",
-        "M411", "M412", "M413", "M414",
-        "M421", "M422", "M423",
-        
+        "M401",
+        "M402",
+        "M403",
+        "M411",
+        "M412",
+        "M413",
+        "M414",
+        "M421",
+        "M422",
+        "M423",
         ## Bugbear
-        "M501", "M502", "M503", "M504", "M505", "M506", "M507", "M508",
+        "M501",
+        "M502",
+        "M503",
+        "M504",
+        "M505",
+        "M506",
+        "M507",
+        "M508",
         "M509",
-        "M511", "M512", "M513",
-        "M521", "M522", "M523", "M524",
-        
+        "M511",
+        "M512",
+        "M513",
+        "M521",
+        "M522",
+        "M523",
+        "M524",
         ## Format Strings
         "M601",
-        "M611", "M612", "M613",
-        "M621", "M622", "M623", "M624", "M625",
-        "M631", "M632",
-        
+        "M611",
+        "M612",
+        "M613",
+        "M621",
+        "M622",
+        "M623",
+        "M624",
+        "M625",
+        "M631",
+        "M632",
         ## Logging
-        "M651", "M652", "M653", "M654", "M655",
-        
+        "M651",
+        "M652",
+        "M653",
+        "M654",
+        "M655",
         ## Future statements
-        "M701", "M702",
-        
+        "M701",
+        "M702",
         ## Gettext
         "M711",
-        
         ## print
         "M801",
-        
         ## one element tuple
         "M811",
-        
         ## Mutable Defaults
-        "M821", "M822",
-        
+        "M821",
+        "M822",
         ## return statements
-        "M831", "M832", "M833", "M834",
-        
+        "M831",
+        "M832",
+        "M833",
+        "M834",
         ## line continuation
         "M841",
-        
         ## commented code
         "M891",
     ]
-    
+
     Formatter = Formatter()
-    FormatFieldRegex = re.compile(r'^((?:\s|.)*?)(\..*|\[.*\])?$')
-    
+    FormatFieldRegex = re.compile(r"^((?:\s|.)*?)(\..*|\[.*\])?$")
+
     BuiltinsWhiteList = [
         "__name__",
         "__doc__",
         "credits",
     ]
 
-    def __init__(self, source, filename, tree, select, ignore, expected,
-                 repeat, args):
+    def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -144,53 +189,127 @@
         @type dict
         """
         self.__select = tuple(select)
-        self.__ignore = ('',) if select else tuple(ignore)
+        self.__ignore = ("",) if select else tuple(ignore)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__filename = filename
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
         self.__args = args
-        
+
         self.__pep3101FormatRegex = re.compile(
-            r'^(?:[^\'"]*[\'"][^\'"]*[\'"])*\s*%|^\s*%')
-        
+            r'^(?:[^\'"]*[\'"][^\'"]*[\'"])*\s*%|^\s*%'
+        )
+
         import builtins
-        self.__builtins = [b for b in dir(builtins)
-                           if b not in self.BuiltinsWhiteList]
-        
+
+        self.__builtins = [b for b in dir(builtins) if b not in self.BuiltinsWhiteList]
+
         self.__eradicator = Eradicator()
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         checkersWithCodes = [
             (self.__checkCoding, ("M101", "M102")),
             (self.__checkCopyright, ("M111", "M112")),
             (self.__checkBuiltins, ("M131", "M132")),
-            (self.__checkComprehensions, ("M181", "M182", "M183", "M184",
-                                          "M185", "M186", "M187", "M188",
-                                          "M189",
-                                          "M191", "M192", "M193",
-                                          "M195", "M196", "M197", "M198")),
+            (
+                self.__checkComprehensions,
+                (
+                    "M181",
+                    "M182",
+                    "M183",
+                    "M184",
+                    "M185",
+                    "M186",
+                    "M187",
+                    "M188",
+                    "M189",
+                    "M191",
+                    "M192",
+                    "M193",
+                    "M195",
+                    "M196",
+                    "M197",
+                    "M198",
+                ),
+            ),
             (self.__checkDictWithSortedKeys, ("M201",)),
-            (self.__checkDateTime, ("M301", "M302", "M303", "M304", "M305",
-                                    "M306", "M307", "M308", "M311", "M312",
-                                    "M313", "M314", "M315", "M321")),
-            (self.__checkSysVersion, ("M401", "M402", "M403",
-                                      "M411", "M412", "M413", "M414",
-                                      "M421", "M422", "M423")),
-            (self.__checkBugBear, ("M501", "M502", "M503", "M504", "M505",
-                                   "M506", "M507", "M508", "M509",
-                                   "M511", "M512", "M513",
-                                   "M521", "M522", "M523", "M524")),
+            (
+                self.__checkDateTime,
+                (
+                    "M301",
+                    "M302",
+                    "M303",
+                    "M304",
+                    "M305",
+                    "M306",
+                    "M307",
+                    "M308",
+                    "M311",
+                    "M312",
+                    "M313",
+                    "M314",
+                    "M315",
+                    "M321",
+                ),
+            ),
+            (
+                self.__checkSysVersion,
+                (
+                    "M401",
+                    "M402",
+                    "M403",
+                    "M411",
+                    "M412",
+                    "M413",
+                    "M414",
+                    "M421",
+                    "M422",
+                    "M423",
+                ),
+            ),
+            (
+                self.__checkBugBear,
+                (
+                    "M501",
+                    "M502",
+                    "M503",
+                    "M504",
+                    "M505",
+                    "M506",
+                    "M507",
+                    "M508",
+                    "M509",
+                    "M511",
+                    "M512",
+                    "M513",
+                    "M521",
+                    "M522",
+                    "M523",
+                    "M524",
+                ),
+            ),
             (self.__checkPep3101, ("M601",)),
-            (self.__checkFormatString, ("M611", "M612", "M613",
-                                        "M621", "M622", "M623", "M624", "M625",
-                                        "M631", "M632")),
+            (
+                self.__checkFormatString,
+                (
+                    "M611",
+                    "M612",
+                    "M613",
+                    "M621",
+                    "M622",
+                    "M623",
+                    "M624",
+                    "M625",
+                    "M631",
+                    "M632",
+                ),
+            ),
             (self.__checkLogging, ("M651", "M652", "M653", "M654", "M655")),
             (self.__checkFuture, ("M701", "M702")),
             (self.__checkGettext, ("M711",)),
@@ -201,24 +320,25 @@
             (self.__checkLineContinuation, ("M841",)),
             (self.__checkCommentedCode, ("M891",)),
         ]
-        
+
         # the eradicate whitelist
         commentedCodeCheckerArgs = self.__args.get(
             "CommentedCodeChecker",
-            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"])
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"],
+        )
         commentedCodeCheckerWhitelist = commentedCodeCheckerArgs.get(
             "WhiteList",
-            MiscellaneousCheckerDefaultArgs[
-                "CommentedCodeChecker"]["WhiteList"])
-        self.__eradicator.update_whitelist(commentedCodeCheckerWhitelist,
-                                           extend_default=False)
-        
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]["WhiteList"],
+        )
+        self.__eradicator.update_whitelist(
+            commentedCodeCheckerWhitelist, extend_default=False
+        )
+
         self.__checkers = []
         for checker, codes in checkersWithCodes:
-            if any(not (code and self.__ignoreCode(code))
-                    for code in codes):
+            if any(not (code and self.__ignoreCode(code)) for code in codes):
                 self.__checkers.append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -228,13 +348,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -246,16 +365,16 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
             self.errors.append(
@@ -267,7 +386,7 @@
                     "args": args,
                 }
             )
-    
+
     def run(self):
         """
         Public method to check the given source against miscellaneous
@@ -276,29 +395,28 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         for check in self.__checkers:
             check()
-    
+
     def __getCoding(self):
         """
         Private method to get the defined coding of the source.
-        
+
         @return tuple containing the line number and the coding
         @rtype tuple of int and str
         """
         for lineno, line in enumerate(self.__source[:5]):
-            matched = re.search(r'coding[:=]\s*([-\w_.]+)',
-                                line, re.IGNORECASE)
+            matched = re.search(r"coding[:=]\s*([-\w_.]+)", line, re.IGNORECASE)
             if matched:
                 return lineno, matched.group(1)
         else:
             return 0, ""
-    
+
     def __checkCoding(self):
         """
         Private method to check the presence of a coding line and valid
@@ -306,55 +424,56 @@
         """
         if len(self.__source) == 0:
             return
-        
-        encodings = [e.lower().strip()
-                     for e in self.__args.get(
-                     "CodingChecker",
-                     MiscellaneousCheckerDefaultArgs["CodingChecker"])
-                     .split(",")]
+
+        encodings = [
+            e.lower().strip()
+            for e in self.__args.get(
+                "CodingChecker", MiscellaneousCheckerDefaultArgs["CodingChecker"]
+            ).split(",")
+        ]
         lineno, coding = self.__getCoding()
         if coding:
             if coding.lower() not in encodings:
                 self.__error(lineno, 0, "M102", coding)
         else:
             self.__error(0, 0, "M101")
-    
+
     def __checkCopyright(self):
         """
         Private method to check the presence of a copyright statement.
         """
         source = "".join(self.__source)
         copyrightArgs = self.__args.get(
-            "CopyrightChecker",
-            MiscellaneousCheckerDefaultArgs["CopyrightChecker"])
+            "CopyrightChecker", MiscellaneousCheckerDefaultArgs["CopyrightChecker"]
+        )
         copyrightMinFileSize = copyrightArgs.get(
             "MinFilesize",
-            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["MinFilesize"])
+            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["MinFilesize"],
+        )
         copyrightAuthor = copyrightArgs.get(
-            "Author",
-            MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"])
+            "Author", MiscellaneousCheckerDefaultArgs["CopyrightChecker"]["Author"]
+        )
         copyrightRegexStr = (
             r"Copyright\s+(\(C\)\s+)?(\d{{4}}\s+-\s+)?\d{{4}}\s+{author}"
         )
-        
+
         tocheck = max(1024, copyrightMinFileSize)
         topOfSource = source[:tocheck]
         if len(topOfSource) < copyrightMinFileSize:
             return
 
-        copyrightRe = re.compile(copyrightRegexStr.format(author=r".*"),
-                                 re.IGNORECASE)
+        copyrightRe = re.compile(copyrightRegexStr.format(author=r".*"), re.IGNORECASE)
         if not copyrightRe.search(topOfSource):
             self.__error(0, 0, "M111")
             return
-        
+
         if copyrightAuthor:
             copyrightAuthorRe = re.compile(
-                copyrightRegexStr.format(author=copyrightAuthor),
-                re.IGNORECASE)
+                copyrightRegexStr.format(author=copyrightAuthor), re.IGNORECASE
+            )
             if not copyrightAuthorRe.search(topOfSource):
                 self.__error(0, 0, "M112")
-    
+
     def __checkCommentedCode(self):
         """
         Private method to check for commented code.
@@ -362,15 +481,17 @@
         source = "".join(self.__source)
         commentedCodeCheckerArgs = self.__args.get(
             "CommentedCodeChecker",
-            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"])
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"],
+        )
         aggressive = commentedCodeCheckerArgs.get(
             "Aggressive",
-            MiscellaneousCheckerDefaultArgs[
-                "CommentedCodeChecker"]["Aggressive"])
+            MiscellaneousCheckerDefaultArgs["CommentedCodeChecker"]["Aggressive"],
+        )
         for markedLine in self.__eradicator.commented_out_code_line_numbers(
-                source, aggressive=aggressive):
+            source, aggressive=aggressive
+        ):
             self.__error(markedLine - 1, 0, "M891")
-    
+
     def __checkLineContinuation(self):
         """
         Private method to check line continuation using backslash.
@@ -387,37 +508,33 @@
             content = stripped[lineno - 1]
             withoutComment = content[:start] + content[stop:]
             stripped[lineno - 1] = withoutComment.rstrip()
-        
+
         # perform check with 'cleaned' source
         for lineIndex, line in enumerate(stripped):
             strippedLine = line.strip()
-            if (strippedLine.endswith('\\') and
-                    not strippedLine.startswith(('assert', 'with'))):
+            if strippedLine.endswith("\\") and not strippedLine.startswith(
+                ("assert", "with")
+            ):
                 self.__error(lineIndex, len(line), "M841")
-    
+
     def __checkPrintStatements(self):
         """
         Private method to check for print statements.
         """
         for node in ast.walk(self.__tree):
             if (
-                (isinstance(node, ast.Call) and
-                 getattr(node.func, 'id', None) == 'print') or
-                (hasattr(ast, 'Print') and isinstance(node, ast.Print))
-            ):
+                isinstance(node, ast.Call) and getattr(node.func, "id", None) == "print"
+            ) or (hasattr(ast, "Print") and isinstance(node, ast.Print)):
                 self.__error(node.lineno - 1, node.col_offset, "M801")
-    
+
     def __checkTuple(self):
         """
         Private method to check for one element tuples.
         """
         for node in ast.walk(self.__tree):
-            if (
-                isinstance(node, ast.Tuple) and
-                len(node.elts) == 1
-            ):
+            if isinstance(node, ast.Tuple) and len(node.elts) == 1:
                 self.__error(node.lineno - 1, node.col_offset, "M811")
-    
+
     def __checkFuture(self):
         """
         Private method to check the __future__ imports.
@@ -425,27 +542,24 @@
         expectedImports = {
             i.strip()
             for i in self.__args.get("FutureChecker", "").split(",")
-            if bool(i.strip())}
+            if bool(i.strip())
+        }
         if len(expectedImports) == 0:
             # nothing to check for; disabling the check
             return
-        
+
         imports = set()
         node = None
         hasCode = False
-        
+
         for node in ast.walk(self.__tree):
-            if (isinstance(node, ast.ImportFrom) and
-                    node.module == '__future__'):
+            if isinstance(node, ast.ImportFrom) and node.module == "__future__":
                 imports |= {name.name for name in node.names}
             elif isinstance(node, ast.Expr):
                 if not AstUtilities.isString(node.value):
                     hasCode = True
                     break
-            elif not (
-                AstUtilities.isString(node) or
-                isinstance(node, ast.Module)
-            ):
+            elif not (AstUtilities.isString(node) or isinstance(node, ast.Module)):
                 hasCode = True
                 break
 
@@ -454,12 +568,18 @@
 
         if imports < expectedImports:
             if imports:
-                self.__error(node.lineno - 1, node.col_offset, "M701",
-                             ", ".join(expectedImports), ", ".join(imports))
+                self.__error(
+                    node.lineno - 1,
+                    node.col_offset,
+                    "M701",
+                    ", ".join(expectedImports),
+                    ", ".join(imports),
+                )
             else:
-                self.__error(node.lineno - 1, node.col_offset, "M702",
-                             ", ".join(expectedImports))
-    
+                self.__error(
+                    node.lineno - 1, node.col_offset, "M702", ", ".join(expectedImports)
+                )
+
     def __checkPep3101(self):
         """
         Private method to check for old style string formatting.
@@ -468,9 +588,9 @@
             match = self.__pep3101FormatRegex.search(line)
             if match:
                 lineLen = len(line)
-                pos = line.find('%')
+                pos = line.find("%")
                 formatPos = pos
-                formatter = '%'
+                formatter = "%"
                 if line[pos + 1] == "(":
                     pos = line.find(")", pos)
                 c = line[pos]
@@ -482,7 +602,7 @@
                 if c in "diouxXeEfFgGcrs":
                     formatter += c
                 self.__error(lineno, formatPos, "M601", formatter)
-    
+
     def __checkFormatString(self):
         """
         Private method to check string format strings.
@@ -491,7 +611,7 @@
         if not coding:
             # default to utf-8
             coding = "utf-8"
-        
+
         visitor = TextVisitor()
         visitor.visit(self.__tree)
         for node in visitor.nodes:
@@ -510,10 +630,10 @@
                         self.__error(node.lineno - 1, node.col_offset, "M612")
                     else:
                         self.__error(node.lineno - 1, node.col_offset, "M613")
-            
+
             if node in visitor.calls:
                 call, strArgs = visitor.calls[node]
-                
+
                 numbers = set()
                 names = set()
                 # Determine which fields require a keyword and which an arg
@@ -528,20 +648,21 @@
                         numbers.add(number)
                     else:
                         names.add(fieldMatch.group(1))
-                
+
                 keywords = {keyword.arg for keyword in call.keywords}
                 numArgs = len(call.args)
                 if strArgs:
                     numArgs -= 1
                 hasKwArgs = any(kw.arg is None for kw in call.keywords)
-                hasStarArgs = sum(1 for arg in call.args
-                                  if isinstance(arg, ast.Starred))
-                
+                hasStarArgs = sum(
+                    1 for arg in call.args if isinstance(arg, ast.Starred)
+                )
+
                 if hasKwArgs:
                     keywords.discard(None)
                 if hasStarArgs:
                     numArgs -= 1
-                
+
                 # if starargs or kwargs is not None, it can't count the
                 # parameters but at least check if the args are used
                 if hasKwArgs and not names:
@@ -550,36 +671,34 @@
                 if hasStarArgs and not numbers:
                     # No numbers but args
                     self.__error(call.lineno - 1, call.col_offset, "M624")
-                
+
                 if not hasKwArgs and not hasStarArgs:
                     # can actually verify numbers and names
                     for number in sorted(numbers):
                         if number >= numArgs:
-                            self.__error(call.lineno - 1, call.col_offset,
-                                         "M621", number)
-                    
+                            self.__error(
+                                call.lineno - 1, call.col_offset, "M621", number
+                            )
+
                     for name in sorted(names):
                         if name not in keywords:
-                            self.__error(call.lineno - 1, call.col_offset,
-                                         "M622", name)
-                
+                            self.__error(call.lineno - 1, call.col_offset, "M622", name)
+
                 for arg in range(numArgs):
                     if arg not in numbers:
-                        self.__error(call.lineno - 1, call.col_offset, "M631",
-                                     arg)
-                
+                        self.__error(call.lineno - 1, call.col_offset, "M631", arg)
+
                 for keyword in keywords:
                     if keyword not in names:
-                        self.__error(call.lineno - 1, call.col_offset, "M632",
-                                     keyword)
-                
+                        self.__error(call.lineno - 1, call.col_offset, "M632", keyword)
+
                 if implicit and explicit:
                     self.__error(call.lineno - 1, call.col_offset, "M625")
-    
+
     def __getFields(self, string):
         """
         Private method to extract the format field information.
-        
+
         @param string format string to be parsed
         @type str
         @return format field information as a tuple with fields, implicit
@@ -592,21 +711,23 @@
         explicit = False
         try:
             for _literal, field, spec, conv in self.Formatter.parse(string):
-                if field is not None and (conv is None or conv in 'rsa'):
+                if field is not None and (conv is None or conv in "rsa"):
                     if not field:
                         field = str(next(cnt))
                         implicit = True
                     else:
                         explicit = True
                     fields.add(field)
-                    fields.update(parsedSpec[1]
-                                  for parsedSpec in self.Formatter.parse(spec)
-                                  if parsedSpec[1] is not None)
+                    fields.update(
+                        parsedSpec[1]
+                        for parsedSpec in self.Formatter.parse(spec)
+                        if parsedSpec[1] is not None
+                    )
         except ValueError:
             return set(), False, False
         else:
             return fields, implicit, explicit
-    
+
     def __checkBuiltins(self):
         """
         Private method to check, if built-ins are shadowed.
@@ -614,67 +735,64 @@
         functionDefs = [ast.FunctionDef]
         with contextlib.suppress(AttributeError):
             functionDefs.append(ast.AsyncFunctionDef)
-        
+
         ignoreBuiltinAssignments = self.__args.get(
-            "BuiltinsChecker",
-            MiscellaneousCheckerDefaultArgs["BuiltinsChecker"])
-        
+            "BuiltinsChecker", MiscellaneousCheckerDefaultArgs["BuiltinsChecker"]
+        )
+
         for node in ast.walk(self.__tree):
             if isinstance(node, ast.Assign):
                 # assign statement
                 for element in node.targets:
-                    if (
-                        isinstance(element, ast.Name) and
-                        element.id in self.__builtins
-                    ):
+                    if isinstance(element, ast.Name) and element.id in self.__builtins:
                         value = node.value
                         if (
-                            isinstance(value, ast.Name) and
-                            element.id in ignoreBuiltinAssignments and
-                            value.id in ignoreBuiltinAssignments[element.id]
+                            isinstance(value, ast.Name)
+                            and element.id in ignoreBuiltinAssignments
+                            and value.id in ignoreBuiltinAssignments[element.id]
                         ):
                             # ignore compatibility assignments
                             continue
-                        self.__error(element.lineno - 1, element.col_offset,
-                                     "M131", element.id)
+                        self.__error(
+                            element.lineno - 1, element.col_offset, "M131", element.id
+                        )
                     elif isinstance(element, (ast.Tuple, ast.List)):
                         for tupleElement in element.elts:
                             if (
-                                isinstance(tupleElement, ast.Name) and
-                                tupleElement.id in self.__builtins
+                                isinstance(tupleElement, ast.Name)
+                                and tupleElement.id in self.__builtins
                             ):
-                                self.__error(tupleElement.lineno - 1,
-                                             tupleElement.col_offset,
-                                             "M131", tupleElement.id)
+                                self.__error(
+                                    tupleElement.lineno - 1,
+                                    tupleElement.col_offset,
+                                    "M131",
+                                    tupleElement.id,
+                                )
             elif isinstance(node, ast.For):
                 # for loop
                 target = node.target
-                if (
-                    isinstance(target, ast.Name) and
-                    target.id in self.__builtins
-                ):
-                    self.__error(target.lineno - 1, target.col_offset,
-                                 "M131", target.id)
+                if isinstance(target, ast.Name) and target.id in self.__builtins:
+                    self.__error(
+                        target.lineno - 1, target.col_offset, "M131", target.id
+                    )
                 elif isinstance(target, (ast.Tuple, ast.List)):
                     for element in target.elts:
                         if (
-                            isinstance(element, ast.Name) and
-                            element.id in self.__builtins
+                            isinstance(element, ast.Name)
+                            and element.id in self.__builtins
                         ):
-                            self.__error(element.lineno - 1,
-                                         element.col_offset,
-                                         "M131", element.id)
-            elif any(isinstance(node, functionDef)
-                     for functionDef in functionDefs):
+                            self.__error(
+                                element.lineno - 1,
+                                element.col_offset,
+                                "M131",
+                                element.id,
+                            )
+            elif any(isinstance(node, functionDef) for functionDef in functionDefs):
                 # (asynchronous) function definition
                 for arg in node.args.args:
-                    if (
-                        isinstance(arg, ast.arg) and
-                        arg.arg in self.__builtins
-                    ):
-                        self.__error(arg.lineno - 1, arg.col_offset,
-                                     "M132", arg.arg)
-    
+                    if isinstance(arg, ast.arg) and arg.arg in self.__builtins:
+                        self.__error(arg.lineno - 1, arg.col_offset, "M132", arg.arg)
+
     def __checkComprehensions(self):
         """
         Private method to check some comprehension related things.
@@ -683,11 +801,11 @@
             if isinstance(node, ast.Call) and isinstance(node.func, ast.Name):
                 nArgs = len(node.args)
                 nKwArgs = len(node.keywords)
-                
+
                 if (
-                    nArgs == 1 and
-                    isinstance(node.args[0], ast.GeneratorExp) and
-                    node.func.id in ('list', 'set')
+                    nArgs == 1
+                    and isinstance(node.args[0], ast.GeneratorExp)
+                    and node.func.id in ("list", "set")
                 ):
                     errorCode = {
                         "list": "M181",
@@ -696,48 +814,51 @@
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
 
                 elif (
-                    nArgs == 1 and
-                    isinstance(node.args[0],
-                               (ast.GeneratorExp, ast.ListComp)) and
-                    isinstance(node.args[0].elt, ast.Tuple) and
-                    len(node.args[0].elt.elts) == 2 and
-                    node.func.id == "dict"
+                    nArgs == 1
+                    and isinstance(node.args[0], (ast.GeneratorExp, ast.ListComp))
+                    and isinstance(node.args[0].elt, ast.Tuple)
+                    and len(node.args[0].elt.elts) == 2
+                    and node.func.id == "dict"
                 ):
                     if isinstance(node.args[0], ast.GeneratorExp):
                         errorCode = "M183"
                     else:
                         errorCode = "M185"
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
-                
+
                 elif (
-                    nArgs == 1 and
-                    isinstance(node.args[0], ast.ListComp) and
-                    node.func.id in ('list', 'set')
+                    nArgs == 1
+                    and isinstance(node.args[0], ast.ListComp)
+                    and node.func.id in ("list", "set")
                 ):
                     errorCode = {
-                        'list': 'M195',
-                        'set': 'M184',
+                        "list": "M195",
+                        "set": "M184",
                     }[node.func.id]
                     self.__error(node.lineno - 1, node.col_offset, errorCode)
-                
+
                 elif nArgs == 1 and (
-                    isinstance(node.args[0], ast.Tuple) and
-                    node.func.id == "tuple" or
-                    isinstance(node.args[0], ast.List) and
-                    node.func.id == "list"
+                    isinstance(node.args[0], ast.Tuple)
+                    and node.func.id == "tuple"
+                    or isinstance(node.args[0], ast.List)
+                    and node.func.id == "list"
                 ):
                     errorCode = {
-                        'tuple': 'M197',
-                        'list': 'M198',
+                        "tuple": "M197",
+                        "list": "M198",
                     }[node.func.id]
-                    self.__error(node.lineno - 1, node.col_offset, errorCode,
-                                 type(node.args[0]).__name__.lower(),
-                                 node.func.id)
-                
+                    self.__error(
+                        node.lineno - 1,
+                        node.col_offset,
+                        errorCode,
+                        type(node.args[0]).__name__.lower(),
+                        node.func.id,
+                    )
+
                 elif (
-                    nArgs == 1 and
-                    isinstance(node.args[0], (ast.Tuple, ast.List)) and
-                    node.func.id in ("tuple", "list", "set", "dict")
+                    nArgs == 1
+                    and isinstance(node.args[0], (ast.Tuple, ast.List))
+                    and node.func.id in ("tuple", "list", "set", "dict")
                 ):
                     errorCode = {
                         "tuple": "M192",
@@ -745,29 +866,30 @@
                         "set": "M191",
                         "dict": "M191",
                     }[node.func.id]
-                    self.__error(node.lineno - 1, node.col_offset, errorCode,
-                                 type(node.args[0]).__name__.lower(),
-                                 node.func.id)
-                
+                    self.__error(
+                        node.lineno - 1,
+                        node.col_offset,
+                        errorCode,
+                        type(node.args[0]).__name__.lower(),
+                        node.func.id,
+                    )
+
                 elif (
-                    nArgs == 0 and
-                    not any(isinstance(a, ast.Starred) for a in node.args) and
-                    not any(k.arg is None for k in node.keywords) and
-                    node.func.id == "dict"
+                    nArgs == 0
+                    and not any(isinstance(a, ast.Starred) for a in node.args)
+                    and not any(k.arg is None for k in node.keywords)
+                    and node.func.id == "dict"
                 ) or (
-                    nArgs == 0 and
-                    nKwArgs == 0 and
-                    node.func.id in ("tuple", "list")
+                    nArgs == 0 and nKwArgs == 0 and node.func.id in ("tuple", "list")
                 ):
-                    self.__error(node.lineno - 1, node.col_offset, "M186",
-                                 node.func.id)
-                
+                    self.__error(node.lineno - 1, node.col_offset, "M186", node.func.id)
+
                 elif (
-                    node.func.id in {"list", "reversed"} and
-                    nArgs > 0 and
-                    isinstance(node.args[0], ast.Call) and
-                    isinstance(node.args[0].func, ast.Name) and
-                    node.args[0].func.id == "sorted"
+                    node.func.id in {"list", "reversed"}
+                    and nArgs > 0
+                    and isinstance(node.args[0], ast.Call)
+                    and isinstance(node.args[0].func, ast.Name)
+                    and node.args[0].func.id == "sorted"
                 ):
                     if node.func.id == "reversed":
                         reverseFlagValue = False
@@ -783,64 +905,78 @@
                                 reverseFlagValue = None
 
                         if reverseFlagValue is None:
-                            self.__error(node.lineno - 1, node.col_offset,
-                                         "M187a", node.func.id,
-                                         node.args[0].func.id)
+                            self.__error(
+                                node.lineno - 1,
+                                node.col_offset,
+                                "M187a",
+                                node.func.id,
+                                node.args[0].func.id,
+                            )
                         else:
-                            self.__error(node.lineno - 1, node.col_offset,
-                                         "M187b", node.func.id,
-                                         node.args[0].func.id,
-                                         not reverseFlagValue)
+                            self.__error(
+                                node.lineno - 1,
+                                node.col_offset,
+                                "M187b",
+                                node.func.id,
+                                node.args[0].func.id,
+                                not reverseFlagValue,
+                            )
                     else:
-                        self.__error(node.lineno - 1, node.col_offset,
-                                     "M187c", node.func.id,
-                                     node.args[0].func.id)
-                
+                        self.__error(
+                            node.lineno - 1,
+                            node.col_offset,
+                            "M187c",
+                            node.func.id,
+                            node.args[0].func.id,
+                        )
+
                 elif (
-                    nArgs > 0 and
-                    isinstance(node.args[0], ast.Call) and
-                    isinstance(node.args[0].func, ast.Name) and
-                    (
+                    nArgs > 0
+                    and isinstance(node.args[0], ast.Call)
+                    and isinstance(node.args[0].func, ast.Name)
+                    and (
                         (
-                            node.func.id in {"set", "sorted"} and
-                            node.args[0].func.id in {
-                                "list", "reversed", "sorted", "tuple"}
-                        ) or (
-                            node.func.id in {"list", "tuple"} and
-                            node.args[0].func.id in {"list", "tuple"}
-                        ) or (
-                            node.func.id == "set" and
-                            node.args[0].func.id == "set"
+                            node.func.id in {"set", "sorted"}
+                            and node.args[0].func.id
+                            in {"list", "reversed", "sorted", "tuple"}
                         )
+                        or (
+                            node.func.id in {"list", "tuple"}
+                            and node.args[0].func.id in {"list", "tuple"}
+                        )
+                        or (node.func.id == "set" and node.args[0].func.id == "set")
                     )
                 ):
-                    self.__error(node.lineno - 1, node.col_offset, "M188",
-                                 node.args[0].func.id, node.func.id)
-                
+                    self.__error(
+                        node.lineno - 1,
+                        node.col_offset,
+                        "M188",
+                        node.args[0].func.id,
+                        node.func.id,
+                    )
+
                 elif (
-                    node.func.id in {"reversed", "set", "sorted"} and
-                    nArgs > 0 and
-                    isinstance(node.args[0], ast.Subscript) and
-                    isinstance(node.args[0].slice, ast.Slice) and
-                    node.args[0].slice.lower is None and
-                    node.args[0].slice.upper is None and
-                    isinstance(node.args[0].slice.step, ast.UnaryOp) and
-                    isinstance(node.args[0].slice.step.op, ast.USub) and
-                    isinstance(node.args[0].slice.step.operand, ast.Num) and
-                    node.args[0].slice.step.operand.n == 1
+                    node.func.id in {"reversed", "set", "sorted"}
+                    and nArgs > 0
+                    and isinstance(node.args[0], ast.Subscript)
+                    and isinstance(node.args[0].slice, ast.Slice)
+                    and node.args[0].slice.lower is None
+                    and node.args[0].slice.upper is None
+                    and isinstance(node.args[0].slice.step, ast.UnaryOp)
+                    and isinstance(node.args[0].slice.step.op, ast.USub)
+                    and isinstance(node.args[0].slice.step.operand, ast.Num)
+                    and node.args[0].slice.step.operand.n == 1
                 ):
-                    self.__error(node.lineno - 1, node.col_offset,
-                                 "M189", node.func.id)
-                
-                elif (
-                    isinstance(node, (ast.ListComp, ast.SetComp)) and (
-                        len(node.generators) == 1 and
-                        not node.generators[0].ifs and
-                        not node.generators[0].is_async and (
-                            isinstance(node.elt, ast.Name) and
-                            isinstance(node.generators[0].target, ast.Name) and
-                            node.elt.id == node.generators[0].target.id
-                        )
+                    self.__error(node.lineno - 1, node.col_offset, "M189", node.func.id)
+
+                elif isinstance(node, (ast.ListComp, ast.SetComp)) and (
+                    len(node.generators) == 1
+                    and not node.generators[0].ifs
+                    and not node.generators[0].is_async
+                    and (
+                        isinstance(node.elt, ast.Name)
+                        and isinstance(node.generators[0].target, ast.Name)
+                        and node.elt.id == node.generators[0].target.id
                     )
                 ):
                     compType = {
@@ -848,10 +984,9 @@
                         ast.ListComp: "list",
                         ast.SetComp: "set",
                     }[node.__class__]
-                    
-                    self.__error(node.lineno - 1, node.col_offset,
-                                 "M196", compType)
-    
+
+                    self.__error(node.lineno - 1, node.col_offset, "M196", compType)
+
     def __checkMutableDefault(self):
         """
         Private method to check for use of mutable types as default arguments.
@@ -882,52 +1017,58 @@
         functionDefs = [ast.FunctionDef]
         with contextlib.suppress(AttributeError):
             functionDefs.append(ast.AsyncFunctionDef)
-        
+
         for node in ast.walk(self.__tree):
-            if any(isinstance(node, functionDef)
-                   for functionDef in functionDefs):
+            if any(isinstance(node, functionDef) for functionDef in functionDefs):
                 defaults = node.args.defaults[:]
                 with contextlib.suppress(AttributeError):
                     defaults += node.args.kw_defaults[:]
                 for default in defaults:
-                    if any(isinstance(default, mutableType)
-                           for mutableType in mutableTypes):
+                    if any(
+                        isinstance(default, mutableType) for mutableType in mutableTypes
+                    ):
                         typeName = type(default).__name__
                         if isinstance(default, ast.Call):
-                            callPath = '.'.join(composeCallPath(default.func))
+                            callPath = ".".join(composeCallPath(default.func))
                             if callPath in mutableCalls:
-                                self.__error(default.lineno - 1,
-                                             default.col_offset,
-                                             "M823", callPath + "()")
+                                self.__error(
+                                    default.lineno - 1,
+                                    default.col_offset,
+                                    "M823",
+                                    callPath + "()",
+                                )
                             elif callPath not in immutableCalls:
-                                self.__error(default.lineno - 1,
-                                             default.col_offset,
-                                             "M822", typeName)
+                                self.__error(
+                                    default.lineno - 1,
+                                    default.col_offset,
+                                    "M822",
+                                    typeName,
+                                )
                         else:
-                            self.__error(default.lineno - 1,
-                                         default.col_offset,
-                                         "M821", typeName)
-    
+                            self.__error(
+                                default.lineno - 1, default.col_offset, "M821", typeName
+                            )
+
     def __dictShouldBeChecked(self, node):
         """
         Private function to test, if the node should be checked.
-        
+
         @param node reference to the AST node
         @return flag indicating to check the node
         @rtype bool
         """
         if not all(AstUtilities.isString(key) for key in node.keys):
             return False
-        
+
         if (
-            "__IGNORE_WARNING__" in self.__source[node.lineno - 1] or
-            "__IGNORE_WARNING_M201__" in self.__source[node.lineno - 1]
+            "__IGNORE_WARNING__" in self.__source[node.lineno - 1]
+            or "__IGNORE_WARNING_M201__" in self.__source[node.lineno - 1]
         ):
             return False
-        
+
         lineNumbers = [key.lineno for key in node.keys]
         return len(lineNumbers) == len(set(lineNumbers))
-    
+
     def __checkDictWithSortedKeys(self):
         """
         Private method to check, if dictionary keys appear in sorted order.
@@ -936,9 +1077,10 @@
             if isinstance(node, ast.Dict) and self.__dictShouldBeChecked(node):
                 for key1, key2 in zip(node.keys, node.keys[1:]):
                     if key2.s < key1.s:
-                        self.__error(key2.lineno - 1, key2.col_offset,
-                                     "M201", key2.s, key1.s)
-    
+                        self.__error(
+                            key2.lineno - 1, key2.col_offset, "M201", key2.s, key1.s
+                        )
+
     def __checkLogging(self):
         """
         Private method to check logging statements.
@@ -947,19 +1089,19 @@
         visitor.visit(self.__tree)
         for node, reason in visitor.violations:
             self.__error(node.lineno - 1, node.col_offset, reason)
-    
+
     def __checkGettext(self):
         """
         Private method to check the 'gettext' import statement.
         """
         for node in ast.walk(self.__tree):
-            if (
-                isinstance(node, ast.ImportFrom) and
-                any(name.asname == '_' for name in node.names)
+            if isinstance(node, ast.ImportFrom) and any(
+                name.asname == "_" for name in node.names
             ):
-                self.__error(node.lineno - 1, node.col_offset, "M711",
-                             node.names[0].name)
-    
+                self.__error(
+                    node.lineno - 1, node.col_offset, "M711", node.names[0].name
+                )
+
     def __checkBugBear(self):
         """
         Private method for bugbear checks.
@@ -971,7 +1113,7 @@
             reason = violation[1]
             params = violation[2:]
             self.__error(node.lineno - 1, node.col_offset, reason, *params)
-    
+
     def __checkReturn(self):
         """
         Private method to check return statements.
@@ -982,7 +1124,7 @@
             node = violation[0]
             reason = violation[1]
             self.__error(node.lineno - 1, node.col_offset, reason)
-    
+
     def __checkDateTime(self):
         """
         Private method to check use of naive datetime functions.
@@ -993,7 +1135,7 @@
         for node in ast.walk(tree):
             for childNode in ast.iter_child_nodes(node):
                 childNode._dtCheckerParent = node
-        
+
         # step 2: perform checks and report issues
         visitor = DateTimeVisitor()
         visitor.visit(tree)
@@ -1001,7 +1143,7 @@
             node = violation[0]
             reason = violation[1]
             self.__error(node.lineno - 1, node.col_offset, reason)
-    
+
     def __checkSysVersion(self):
         """
         Private method to check the use of sys.version and sys.version_info.
@@ -1021,8 +1163,9 @@
     It tries to detect docstrings as string of the first expression of each
     module, class or function.
     """
+
     # modelled after the string format flake8 extension
-    
+
     def __init__(self):
         """
         Constructor
@@ -1034,18 +1177,18 @@
     def __addNode(self, node):
         """
         Private method to add a node to our list of nodes.
-        
+
         @param node reference to the node to add
         @type ast.AST
         """
-        if not hasattr(node, 'is_docstring'):
+        if not hasattr(node, "is_docstring"):
             node.is_docstring = False
         self.nodes.append(node)
 
     def visit_Str(self, node):
         """
         Public method to record a string node.
-        
+
         @param node reference to the string node
         @type ast.Str
         """
@@ -1054,16 +1197,16 @@
     def visit_Bytes(self, node):
         """
         Public method to record a bytes node.
-        
+
         @param node reference to the bytes node
         @type ast.Bytes
         """
         self.__addNode(node)
-    
+
     def visit_Constant(self, node):
         """
         Public method to handle constant nodes.
-        
+
         @param node reference to the bytes node
         @type ast.Constant
         """
@@ -1078,7 +1221,7 @@
     def __visitDefinition(self, node):
         """
         Private method handling class and function definitions.
-        
+
         @param node reference to the node to handle
         @type ast.FunctionDef, ast.AsyncFunctionDef or ast.ClassDef
         """
@@ -1096,14 +1239,14 @@
 
         If the first node is an expression which contains a string or bytes it
         marks that as a docstring.
-        
+
         @param node reference to the node to traverse
         @type ast.AST
         """
         if (
-            node.body and
-            isinstance(node.body[0], ast.Expr) and
-            AstUtilities.isBaseString(node.body[0].value)
+            node.body
+            and isinstance(node.body[0], ast.Expr)
+            and AstUtilities.isBaseString(node.body[0].value)
         ):
             node.body[0].value.is_docstring = True
 
@@ -1113,7 +1256,7 @@
     def visit_Module(self, node):
         """
         Public method to handle a module.
-        
+
         @param node reference to the node to handle
         @type ast.Module
         """
@@ -1122,7 +1265,7 @@
     def visit_ClassDef(self, node):
         """
         Public method to handle a class definition.
-        
+
         @param node reference to the node to handle
         @type ast.ClassDef
         """
@@ -1132,7 +1275,7 @@
     def visit_FunctionDef(self, node):
         """
         Public method to handle a function definition.
-        
+
         @param node reference to the node to handle
         @type ast.FunctionDef
         """
@@ -1142,7 +1285,7 @@
     def visit_AsyncFunctionDef(self, node):
         """
         Public method to handle an asynchronous function definition.
-        
+
         @param node reference to the node to handle
         @type ast.AsyncFunctionDef
         """
@@ -1152,21 +1295,18 @@
     def visit_Call(self, node):
         """
         Public method to handle a function call.
-        
+
         @param node reference to the node to handle
         @type ast.Call
         """
-        if (
-            isinstance(node.func, ast.Attribute) and
-            node.func.attr == 'format'
-        ):
+        if isinstance(node.func, ast.Attribute) and node.func.attr == "format":
             if AstUtilities.isBaseString(node.func.value):
                 self.calls[node.func.value] = (node, False)
             elif (
-                isinstance(node.func.value, ast.Name) and
-                node.func.value.id == 'str' and
-                node.args and
-                AstUtilities.isBaseString(node.args[0])
+                isinstance(node.func.value, ast.Name)
+                and node.func.value.id == "str"
+                and node.args
+                and AstUtilities.isBaseString(node.args[0])
             ):
                 self.calls[node.args[0]] = (node, True)
         super().generic_visit(node)
@@ -1176,6 +1316,7 @@
     """
     Class implementing a node visitor to check logging statements.
     """
+
     LoggingLevels = {
         "debug",
         "critical",
@@ -1184,13 +1325,13 @@
         "warn",
         "warning",
     }
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__currentLoggingCall = None
         self.__currentLoggingArgument = None
         self.__currentLoggingLevel = None
@@ -1200,7 +1341,7 @@
     def __withinLoggingStatement(self):
         """
         Private method to check, if we are inside a logging statement.
-        
+
         @return flag indicating we are inside a logging statement
         @rtype bool
         """
@@ -1209,7 +1350,7 @@
     def __withinLoggingArgument(self):
         """
         Private method to check, if we are inside a logging argument.
-        
+
         @return flag indicating we are inside a logging argument
         @rtype bool
         """
@@ -1218,21 +1359,21 @@
     def __withinExtraKeyword(self, node):
         """
         Private method to check, if we are inside the extra keyword.
-        
+
         @param node reference to the node to be checked
         @type ast.keyword
         @return flag indicating we are inside the extra keyword
         @rtype bool
         """
         return (
-            self.__currentExtraKeyword is not None and
-            self.__currentExtraKeyword != node
+            self.__currentExtraKeyword is not None
+            and self.__currentExtraKeyword != node
         )
-    
+
     def __detectLoggingLevel(self, node):
         """
         Private method to decide whether an AST Call is a logging call.
-        
+
         @param node reference to the node to be processed
         @type ast.Call
         @return logging level
@@ -1241,10 +1382,10 @@
         with contextlib.suppress(AttributeError):
             if node.func.value.id == "warnings":
                 return None
-            
+
             if node.func.attr in LoggingVisitor.LoggingLevels:
                 return node.func.attr
-        
+
         return None
 
     def __isFormatCall(self, node):
@@ -1260,66 +1401,62 @@
             return node.func.attr == "format"
         except AttributeError:
             return False
-    
+
     def visit_Call(self, node):
         """
         Public method to handle a function call.
 
         Every logging statement and string format is expected to be a function
         call.
-        
+
         @param node reference to the node to be processed
         @type ast.Call
         """
         # we are in a logging statement
         if (
-            self.__withinLoggingStatement() and
-            self.__withinLoggingArgument() and
-            self.__isFormatCall(node)
+            self.__withinLoggingStatement()
+            and self.__withinLoggingArgument()
+            and self.__isFormatCall(node)
         ):
             self.violations.append((node, "M651"))
             super().generic_visit(node)
             return
-        
+
         loggingLevel = self.__detectLoggingLevel(node)
-        
+
         if loggingLevel and self.__currentLoggingLevel is None:
             self.__currentLoggingLevel = loggingLevel
-        
+
         # we are in some other statement
         if loggingLevel is None:
             super().generic_visit(node)
             return
-        
+
         # we are entering a new logging statement
         self.__currentLoggingCall = node
-        
+
         if loggingLevel == "warn":
             self.violations.append((node, "M655"))
-        
+
         for index, child in enumerate(ast.iter_child_nodes(node)):
             if index == 1:
                 self.__currentLoggingArgument = child
-            if (
-                index > 1 and
-                isinstance(child, ast.keyword) and
-                child.arg == "extra"
-            ):
+            if index > 1 and isinstance(child, ast.keyword) and child.arg == "extra":
                 self.__currentExtraKeyword = child
-            
+
             super().visit(child)
-            
+
             self.__currentLoggingArgument = None
             self.__currentExtraKeyword = None
-        
+
         self.__currentLoggingCall = None
         self.__currentLoggingLevel = None
-    
+
     def visit_BinOp(self, node):
         """
         Public method to handle binary operations while processing the first
         logging argument.
-        
+
         @param node reference to the node to be processed
         @type ast.BinOp
         """
@@ -1327,27 +1464,27 @@
             # handle percent format
             if isinstance(node.op, ast.Mod):
                 self.violations.append((node, "M652"))
-            
+
             # handle string concat
             if isinstance(node.op, ast.Add):
                 self.violations.append((node, "M653"))
-        
+
         super().generic_visit(node)
-    
+
     def visit_JoinedStr(self, node):
         """
         Public method to handle f-string arguments.
-        
+
         @param node reference to the node to be processed
         @type ast.JoinedStr
         """
         if (
-            self.__withinLoggingStatement() and
-            any(isinstance(i, ast.FormattedValue) for i in node.values) and
-            self.__withinLoggingArgument()
+            self.__withinLoggingStatement()
+            and any(isinstance(i, ast.FormattedValue) for i in node.values)
+            and self.__withinLoggingArgument()
         ):
             self.violations.append((node, "M654"))
-            
+
             super().generic_visit(node)
 
 
@@ -1355,42 +1492,43 @@
     """
     Class implementing a node visitor to check for various topics.
     """
+
     #
     # This class was implemented along the BugBear flake8 extension (v 19.3.0).
     # Original: Copyright (c) 2016 Łukasz Langa
     #
-    
+
     NodeWindowSize = 4
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__nodeStack = []
         self.__nodeWindow = []
         self.violations = []
-    
+
     def visit(self, node):
         """
         Public method to traverse a given AST node.
-        
+
         @param node AST node to be traversed
         @type ast.Node
         """
         self.__nodeStack.append(node)
         self.__nodeWindow.append(node)
-        self.__nodeWindow = self.__nodeWindow[-BugBearVisitor.NodeWindowSize:]
-        
+        self.__nodeWindow = self.__nodeWindow[-BugBearVisitor.NodeWindowSize :]
+
         super().visit(node)
-        
+
         self.__nodeStack.pop()
-    
+
     def visit_UAdd(self, node):
         """
         Public method to handle unary additions.
-        
+
         @param node reference to the node to be processed
         @type ast.UAdd
         """
@@ -1398,13 +1536,13 @@
         if trailingNodes == [ast.UnaryOp, ast.UAdd, ast.UnaryOp, ast.UAdd]:
             originator = self.__nodeWindow[-4]
             self.violations.append((originator, "M501"))
-        
+
         self.generic_visit(node)
-    
+
     def visit_Call(self, node):
         """
         Public method to handle a function call.
-        
+
         @param node reference to the node to be processed
         @type ast.Call
         """
@@ -1414,7 +1552,7 @@
             "M522": ("viewkeys", "viewvalues", "viewitems", "viewlists"),
             "M523": ("next",),
         }
-        
+
         if isinstance(node.func, ast.Attribute):
             for code, methods in methodsDict.items():
                 if node.func.attr in methods:
@@ -1430,165 +1568,161 @@
                 if isinstance(node.func, ast.Name) and node.func.id == "super":
                     args = node.args
                     if (
-                        len(args) == 2 and
-                        isinstance(args[0], ast.Attribute) and
-                        isinstance(args[0].value, ast.Name) and
-                        args[0].value.id == 'self' and
-                        args[0].attr == '__class__'
+                        len(args) == 2
+                        and isinstance(args[0], ast.Attribute)
+                        and isinstance(args[0].value, ast.Name)
+                        and args[0].value.id == "self"
+                        and args[0].attr == "__class__"
                     ):
                         self.violations.append((node, "M509"))
-                
+
                 # bad getattr and setattr
                 if (
-                    node.func.id in ("getattr", "hasattr") and
-                    node.args[1].s == "__call__"
+                    node.func.id in ("getattr", "hasattr")
+                    and node.args[1].s == "__call__"
                 ):
                     self.violations.append((node, "M511"))
                 if (
-                    node.func.id == "getattr" and
-                    len(node.args) == 2 and
-                    AstUtilities.isString(node.args[1])
+                    node.func.id == "getattr"
+                    and len(node.args) == 2
+                    and AstUtilities.isString(node.args[1])
                 ):
                     self.violations.append((node, "M512"))
                 elif (
-                    node.func.id == "setattr" and
-                    len(node.args) == 3 and
-                    AstUtilities.isString(node.args[1])
+                    node.func.id == "setattr"
+                    and len(node.args) == 3
+                    and AstUtilities.isString(node.args[1])
                 ):
                     self.violations.append((node, "M513"))
 
             self.generic_visit(node)
-    
+
     def visit_Attribute(self, node):
         """
         Public method to handle attributes.
-        
+
         @param node reference to the node to be processed
         @type ast.Attribute
         """
         callPath = list(composeCallPath(node))
-        
-        if '.'.join(callPath) == 'sys.maxint':
+
+        if ".".join(callPath) == "sys.maxint":
             self.violations.append((node, "M504"))
-        
-        elif (
-            len(callPath) == 2 and
-            callPath[1] == 'message'
-        ):
+
+        elif len(callPath) == 2 and callPath[1] == "message":
             name = callPath[0]
             for elem in reversed(self.__nodeStack[:-1]):
                 if isinstance(elem, ast.ExceptHandler) and elem.name == name:
                     self.violations.append((node, "M505"))
                     break
-    
+
     def visit_Assign(self, node):
         """
         Public method to handle assignments.
-        
+
         @param node reference to the node to be processed
         @type ast.Assign
         """
         if isinstance(self.__nodeStack[-2], ast.ClassDef):
             # By using 'hasattr' below we're ignoring starred arguments, slices
             # and tuples for simplicity.
-            assignTargets = {t.id for t in node.targets if hasattr(t, 'id')}
-            if '__metaclass__' in assignTargets:
+            assignTargets = {t.id for t in node.targets if hasattr(t, "id")}
+            if "__metaclass__" in assignTargets:
                 self.violations.append((node, "M524"))
-        
+
         elif len(node.targets) == 1:
             target = node.targets[0]
             if (
-                isinstance(target, ast.Attribute) and
-                isinstance(target.value, ast.Name) and
-                (target.value.id, target.attr) == ('os', 'environ')
+                isinstance(target, ast.Attribute)
+                and isinstance(target.value, ast.Name)
+                and (target.value.id, target.attr) == ("os", "environ")
             ):
                 self.violations.append((node, "M506"))
-        
+
         self.generic_visit(node)
-    
+
     def visit_For(self, node):
         """
         Public method to handle 'for' statements.
-        
+
         @param node reference to the node to be processed
         @type ast.For
         """
         self.__checkForM507(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_AsyncFor(self, node):
         """
         Public method to handle 'for' statements.
-        
+
         @param node reference to the node to be processed
         @type ast.AsyncFor
         """
         self.__checkForM507(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_Assert(self, node):
         """
         Public method to handle 'assert' statements.
-        
+
         @param node reference to the node to be processed
         @type ast.Assert
         """
         if (
-            AstUtilities.isNameConstant(node.test) and
-            AstUtilities.getValue(node.test) is False
+            AstUtilities.isNameConstant(node.test)
+            and AstUtilities.getValue(node.test) is False
         ):
             self.violations.append((node, "M503"))
-        
+
         self.generic_visit(node)
-    
+
     def visit_JoinedStr(self, node):
         """
         Public method to handle f-string arguments.
-        
+
         @param node reference to the node to be processed
         @type ast.JoinedStr
         """
         for value in node.values:
             if isinstance(value, ast.FormattedValue):
                 return
-        
+
         self.violations.append((node, "M508"))
-    
+
     def __checkForM502(self, node):
         """
         Private method to check the use of *strip().
-        
+
         @param node reference to the node to be processed
         @type ast.Call
         """
         if node.func.attr not in ("lstrip", "rstrip", "strip"):
-            return          # method name doesn't match
-        
+            return  # method name doesn't match
+
         if len(node.args) != 1 or not AstUtilities.isString(node.args[0]):
-            return          # used arguments don't match the builtin strip
-        
+            return  # used arguments don't match the builtin strip
+
         s = AstUtilities.getValue(node.args[0])
         if len(s) == 1:
-            return          # stripping just one character
-        
+            return  # stripping just one character
+
         if len(s) == len(set(s)):
-            return          # no characters appear more than once
+            return  # no characters appear more than once
 
         self.violations.append((node, "M502"))
-    
+
     def __checkForM507(self, node):
         """
         Private method to check for unused loop variables.
-        
+
         @param node reference to the node to be processed
         @type ast.For
         """
         targets = NameFinder()
         targets.visit(node.target)
-        ctrlNames = set(filter(lambda s: not s.startswith('_'),
-                               targets.getNames()))
+        ctrlNames = set(filter(lambda s: not s.startswith("_"), targets.getNames()))
         body = NameFinder()
         for expr in node.body:
             body.visit(expr)
@@ -1602,18 +1736,19 @@
     """
     Class to extract a name out of a tree of nodes.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__names = {}
 
     def visit_Name(self, node):
         """
         Public method to handle 'Name' nodes.
-        
+
         @param node reference to the node to be processed
         @type ast.Name
         """
@@ -1622,7 +1757,7 @@
     def visit(self, node):
         """
         Public method to traverse a given AST node.
-        
+
         @param node AST node to be traversed
         @type ast.Node
         """
@@ -1631,11 +1766,11 @@
                 super().visit(elem)
         else:
             super().visit(node)
-    
+
     def getNames(self):
         """
         Public method to return the extracted names and Name nodes.
-        
+
         @return dictionary containing the names as keys and the list of nodes
         @rtype dict
         """
@@ -1646,140 +1781,143 @@
     """
     Class implementing a node visitor to check return statements.
     """
-    Assigns = 'assigns'
-    Refs = 'refs'
-    Returns = 'returns'
-    
+
+    Assigns = "assigns"
+    Refs = "refs"
+    Returns = "returns"
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__stack = []
         self.violations = []
         self.__loopCount = 0
-    
+
     @property
     def assigns(self):
         """
         Public method to get the Assign nodes.
-        
+
         @return dictionary containing the node name as key and line number
             as value
         @rtype dict
         """
         return self.__stack[-1][ReturnVisitor.Assigns]
-    
+
     @property
     def refs(self):
         """
         Public method to get the References nodes.
-        
+
         @return dictionary containing the node name as key and line number
             as value
         @rtype dict
         """
         return self.__stack[-1][ReturnVisitor.Refs]
-    
+
     @property
     def returns(self):
         """
         Public method to get the Return nodes.
-        
+
         @return dictionary containing the node name as key and line number
             as value
         @rtype dict
         """
         return self.__stack[-1][ReturnVisitor.Returns]
-    
+
     def visit_For(self, node):
         """
         Public method to handle a for loop.
-        
+
         @param node reference to the for node to handle
         @type ast.For
         """
         self.__visitLoop(node)
-    
+
     def visit_AsyncFor(self, node):
         """
         Public method to handle an async for loop.
-        
+
         @param node reference to the async for node to handle
         @type ast.AsyncFor
         """
         self.__visitLoop(node)
-    
+
     def visit_While(self, node):
         """
         Public method to handle a while loop.
-        
+
         @param node reference to the while node to handle
         @type ast.While
         """
         self.__visitLoop(node)
-    
+
     def __visitLoop(self, node):
         """
         Private method to handle loop nodes.
-        
+
         @param node reference to the loop node to handle
         @type ast.For, ast.AsyncFor or ast.While
         """
         self.__loopCount += 1
         self.generic_visit(node)
         self.__loopCount -= 1
-    
+
     def __visitWithStack(self, node):
         """
         Private method to traverse a given function node using a stack.
-        
+
         @param node AST node to be traversed
         @type ast.FunctionDef or ast.AsyncFunctionDef
         """
-        self.__stack.append({
-            ReturnVisitor.Assigns: defaultdict(list),
-            ReturnVisitor.Refs: defaultdict(list),
-            ReturnVisitor.Returns: []
-        })
-        
+        self.__stack.append(
+            {
+                ReturnVisitor.Assigns: defaultdict(list),
+                ReturnVisitor.Refs: defaultdict(list),
+                ReturnVisitor.Returns: [],
+            }
+        )
+
         self.generic_visit(node)
         self.__checkFunction(node)
         self.__stack.pop()
-    
+
     def visit_FunctionDef(self, node):
         """
         Public method to handle a function definition.
-        
+
         @param node reference to the node to handle
         @type ast.FunctionDef
         """
         self.__visitWithStack(node)
-    
+
     def visit_AsyncFunctionDef(self, node):
         """
         Public method to handle a function definition.
-        
+
         @param node reference to the node to handle
         @type ast.AsyncFunctionDef
         """
         self.__visitWithStack(node)
-    
+
     def visit_Return(self, node):
         """
         Public method to handle a return node.
-        
+
         @param node reference to the node to handle
         @type ast.Return
         """
         self.returns.append(node)
         self.generic_visit(node)
-    
+
     def visit_Assign(self, node):
         """
         Public method to handle an assign node.
-        
+
         @param node reference to the node to handle
         @type ast.Assign
         """
@@ -1787,31 +1925,28 @@
             return
 
         self.generic_visit(node.value)
-        
+
         target = node.targets[0]
-        if (
-            isinstance(target, ast.Tuple) and
-            not isinstance(node.value, ast.Tuple)
-        ):
+        if isinstance(target, ast.Tuple) and not isinstance(node.value, ast.Tuple):
             # skip unpacking assign
             return
-        
+
         self.__visitAssignTarget(target)
-    
+
     def visit_Name(self, node):
         """
         Public method to handle a name node.
-        
+
         @param node reference to the node to handle
         @type ast.Name
         """
         if self.__stack:
             self.refs[node.id].append(node.lineno)
-    
+
     def __visitAssignTarget(self, node):
         """
         Private method to handle an assign target node.
-        
+
         @param node reference to the node to handle
         @type ast.AST
         """
@@ -1819,70 +1954,66 @@
             for elt in node.elts:
                 self.__visitAssignTarget(elt)
             return
-        
+
         if not self.__loopCount and isinstance(node, ast.Name):
             self.assigns[node.id].append(node.lineno)
             return
-        
+
         self.generic_visit(node)
-    
+
     def __checkFunction(self, node):
         """
         Private method to check a function definition node.
-        
+
         @param node reference to the node to check
         @type ast.AsyncFunctionDef or ast.FunctionDef
         """
         if not self.returns or not node.body:
             return
-        
+
         if len(node.body) == 1 and isinstance(node.body[-1], ast.Return):
             # skip functions that consist of `return None` only
             return
-        
+
         if not self.__resultExists():
             self.__checkUnnecessaryReturnNone()
             return
-        
+
         self.__checkImplicitReturnValue()
         self.__checkImplicitReturn(node.body[-1])
-        
+
         for n in self.returns:
             if n.value:
                 self.__checkUnnecessaryAssign(n.value)
-    
+
     def __isNone(self, node):
         """
         Private method to check, if a node value is None.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating the node contains a None value
         @rtype bool
         """
-        return (
-            AstUtilities.isNameConstant(node) and
-            AstUtilities.getValue(node) is None
-        )
-    
+        return AstUtilities.isNameConstant(node) and AstUtilities.getValue(node) is None
+
     def __isFalse(self, node):
         """
         Private method to check, if a node value is False.
-        
+
         @param node reference to the node to check
         @type ast.AST
         @return flag indicating the node contains a False value
         @rtype bool
         """
         return (
-            AstUtilities.isNameConstant(node) and
-            AstUtilities.getValue(node) is False
+            AstUtilities.isNameConstant(node) and AstUtilities.getValue(node) is False
         )
-    
+
     def __resultExists(self):
         """
         Private method to check the existance of a return result.
-        
+
         @return flag indicating the existence of a return result
         @rtype bool
         """
@@ -1890,9 +2021,9 @@
             value = node.value
             if value and not self.__isNone(value):
                 return True
-        
+
         return False
-    
+
     def __checkImplicitReturnValue(self):
         """
         Private method to check for implicit return values.
@@ -1900,7 +2031,7 @@
         for node in self.returns:
             if not node.value:
                 self.violations.append((node, "M832"))
-    
+
     def __checkUnnecessaryReturnNone(self):
         """
         Private method to check for an unnecessary 'return None' statement.
@@ -1908,11 +2039,11 @@
         for node in self.returns:
             if self.__isNone(node.value):
                 self.violations.append((node, "M831"))
-    
+
     def __checkImplicitReturn(self, node):
         """
         Private method to check for an implicit return statement.
-        
+
         @param node reference to the node to check
         @type ast.AST
         """
@@ -1920,59 +2051,59 @@
             if not node.body or not node.orelse:
                 self.violations.append((node, "M833"))
                 return
-            
+
             self.__checkImplicitReturn(node.body[-1])
             self.__checkImplicitReturn(node.orelse[-1])
             return
-        
+
         if isinstance(node, (ast.For, ast.AsyncFor)) and node.orelse:
             self.__checkImplicitReturn(node.orelse[-1])
             return
-        
+
         if isinstance(node, (ast.With, ast.AsyncWith)):
             self.__checkImplicitReturn(node.body[-1])
             return
-        
+
         if isinstance(node, ast.Assert) and self.__isFalse(node.test):
             return
-        
+
         try:
             okNodes = (ast.Return, ast.Raise, ast.While, ast.Try)
         except AttributeError:
             okNodes = (ast.Return, ast.Raise, ast.While)
         if not isinstance(node, okNodes):
             self.violations.append((node, "M833"))
-    
+
     def __checkUnnecessaryAssign(self, node):
         """
         Private method to check for an unnecessary assign statement.
-        
+
         @param node reference to the node to check
         @type ast.AST
         """
         if not isinstance(node, ast.Name):
             return
-        
+
         varname = node.id
         returnLineno = node.lineno
-        
+
         if varname not in self.assigns:
             return
-        
+
         if varname not in self.refs:
             self.violations.append((node, "M834"))
             return
-        
+
         if self.__hasRefsBeforeNextAssign(varname, returnLineno):
             return
-        
+
         self.violations.append((node, "M834"))
 
     def __hasRefsBeforeNextAssign(self, varname, returnLineno):
         """
         Private method to check for references before a following assign
         statement.
-        
+
         @param varname variable name to check for
         @type str
         @param returnLineno line number of the return statement
@@ -1982,47 +2113,48 @@
         """
         beforeAssign = 0
         afterAssign = None
-        
+
         for lineno in sorted(self.assigns[varname]):
             if lineno > returnLineno:
                 afterAssign = lineno
                 break
-            
+
             if lineno <= returnLineno:
                 beforeAssign = lineno
-        
+
         for lineno in self.refs[varname]:
             if lineno == returnLineno:
                 continue
-            
+
             if afterAssign:
                 if beforeAssign < lineno <= afterAssign:
                     return True
-            
+
             elif beforeAssign < lineno:
                 return True
-        
+
         return False
 
 
 class DateTimeVisitor(ast.NodeVisitor):
     """
     Class implementing a node visitor to check datetime function calls.
-    
+
     Note: This class is modelled after flake8_datetimez checker.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.violations = []
-    
+
     def __getFromKeywords(self, keywords, name):
         """
         Private method to get a keyword node given its name.
-        
+
         @param keywords list of keyword argument nodes
         @type list of ast.AST
         @param name name of the keyword node
@@ -2033,195 +2165,176 @@
         for keyword in keywords:
             if keyword.arg == name:
                 return keyword
-        
+
         return None
-    
+
     def visit_Call(self, node):
         """
         Public method to handle a function call.
 
         Every datetime related function call is check for use of the naive
         variant (i.e. use without TZ info).
-        
+
         @param node reference to the node to be processed
         @type ast.Call
         """
         # datetime.something()
         isDateTimeClass = (
-            isinstance(node.func, ast.Attribute) and
-            isinstance(node.func.value, ast.Name) and
-            node.func.value.id == 'datetime')
-        
+            isinstance(node.func, ast.Attribute)
+            and isinstance(node.func.value, ast.Name)
+            and node.func.value.id == "datetime"
+        )
+
         # datetime.datetime.something()
         isDateTimeModuleAndClass = (
-            isinstance(node.func, ast.Attribute) and
-            isinstance(node.func.value, ast.Attribute) and
-            node.func.value.attr == 'datetime' and
-            isinstance(node.func.value.value, ast.Name) and
-            node.func.value.value.id == 'datetime')
-        
+            isinstance(node.func, ast.Attribute)
+            and isinstance(node.func.value, ast.Attribute)
+            and node.func.value.attr == "datetime"
+            and isinstance(node.func.value.value, ast.Name)
+            and node.func.value.value.id == "datetime"
+        )
+
         if isDateTimeClass:
-            if node.func.attr == 'datetime':
+            if node.func.attr == "datetime":
                 # datetime.datetime(2000, 1, 1, 0, 0, 0, 0,
                 #                   datetime.timezone.utc)
-                isCase1 = (
-                    len(node.args) >= 8 and
-                    not (
-                        AstUtilities.isNameConstant(node.args[7]) and
-                        AstUtilities.getValue(node.args[7]) is None
-                    )
+                isCase1 = len(node.args) >= 8 and not (
+                    AstUtilities.isNameConstant(node.args[7])
+                    and AstUtilities.getValue(node.args[7]) is None
                 )
-                
+
                 # datetime.datetime(2000, 1, 1, tzinfo=datetime.timezone.utc)
-                tzinfoKeyword = self.__getFromKeywords(node.keywords, 'tzinfo')
-                isCase2 = (
-                    tzinfoKeyword is not None and
-                    not (
-                        AstUtilities.isNameConstant(tzinfoKeyword.value) and
-                        AstUtilities.getValue(tzinfoKeyword.value) is None
-                    )
+                tzinfoKeyword = self.__getFromKeywords(node.keywords, "tzinfo")
+                isCase2 = tzinfoKeyword is not None and not (
+                    AstUtilities.isNameConstant(tzinfoKeyword.value)
+                    and AstUtilities.getValue(tzinfoKeyword.value) is None
                 )
-                
+
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M301"))
-            
-            elif node.func.attr == 'time':
+
+            elif node.func.attr == "time":
                 # time(12, 10, 45, 0, datetime.timezone.utc)
-                isCase1 = (
-                    len(node.args) >= 5 and
-                    not (
-                        AstUtilities.isNameConstant(node.args[4]) and
-                        AstUtilities.getValue(node.args[4]) is None
-                    )
+                isCase1 = len(node.args) >= 5 and not (
+                    AstUtilities.isNameConstant(node.args[4])
+                    and AstUtilities.getValue(node.args[4]) is None
                 )
-                
+
                 # datetime.time(12, 10, 45, tzinfo=datetime.timezone.utc)
-                tzinfoKeyword = self.__getFromKeywords(node.keywords, 'tzinfo')
-                isCase2 = (
-                    tzinfoKeyword is not None and
-                    not (
-                        AstUtilities.isNameConstant(tzinfoKeyword.value) and
-                        AstUtilities.getValue(tzinfoKeyword.value) is None
-                    )
+                tzinfoKeyword = self.__getFromKeywords(node.keywords, "tzinfo")
+                isCase2 = tzinfoKeyword is not None and not (
+                    AstUtilities.isNameConstant(tzinfoKeyword.value)
+                    and AstUtilities.getValue(tzinfoKeyword.value) is None
                 )
-                
+
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M321"))
-            
-            elif node.func.attr == 'date':
+
+            elif node.func.attr == "date":
                 self.violations.append((node, "M311"))
-        
+
         if isDateTimeClass or isDateTimeModuleAndClass:
-            if node.func.attr == 'today':
+            if node.func.attr == "today":
                 self.violations.append((node, "M302"))
-            
-            elif node.func.attr == 'utcnow':
+
+            elif node.func.attr == "utcnow":
                 self.violations.append((node, "M303"))
-            
-            elif node.func.attr == 'utcfromtimestamp':
+
+            elif node.func.attr == "utcfromtimestamp":
                 self.violations.append((node, "M304"))
-            
-            elif node.func.attr in 'now':
+
+            elif node.func.attr in "now":
                 # datetime.now(UTC)
                 isCase1 = (
-                    len(node.args) == 1 and
-                    len(node.keywords) == 0 and
-                    not (
-                        AstUtilities.isNameConstant(node.args[0]) and
-                        AstUtilities.getValue(node.args[0]) is None
+                    len(node.args) == 1
+                    and len(node.keywords) == 0
+                    and not (
+                        AstUtilities.isNameConstant(node.args[0])
+                        and AstUtilities.getValue(node.args[0]) is None
                     )
                 )
-                
+
                 # datetime.now(tz=UTC)
-                tzKeyword = self.__getFromKeywords(node.keywords, 'tz')
-                isCase2 = (
-                    tzKeyword is not None and
-                    not (
-                        AstUtilities.isNameConstant(tzKeyword.value) and
-                        AstUtilities.getValue(tzKeyword.value) is None
-                    )
+                tzKeyword = self.__getFromKeywords(node.keywords, "tz")
+                isCase2 = tzKeyword is not None and not (
+                    AstUtilities.isNameConstant(tzKeyword.value)
+                    and AstUtilities.getValue(tzKeyword.value) is None
                 )
-                
+
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M305"))
-            
-            elif node.func.attr == 'fromtimestamp':
+
+            elif node.func.attr == "fromtimestamp":
                 # datetime.fromtimestamp(1234, UTC)
                 isCase1 = (
-                    len(node.args) == 2 and
-                    len(node.keywords) == 0 and
-                    not (
-                        AstUtilities.isNameConstant(node.args[1]) and
-                        AstUtilities.getValue(node.args[1]) is None
+                    len(node.args) == 2
+                    and len(node.keywords) == 0
+                    and not (
+                        AstUtilities.isNameConstant(node.args[1])
+                        and AstUtilities.getValue(node.args[1]) is None
                     )
                 )
-                
+
                 # datetime.fromtimestamp(1234, tz=UTC)
-                tzKeyword = self.__getFromKeywords(node.keywords, 'tz')
-                isCase2 = (
-                    tzKeyword is not None and
-                    not (
-                        AstUtilities.isNameConstant(tzKeyword.value) and
-                        AstUtilities.getValue(tzKeyword.value) is None
-                    )
+                tzKeyword = self.__getFromKeywords(node.keywords, "tz")
+                isCase2 = tzKeyword is not None and not (
+                    AstUtilities.isNameConstant(tzKeyword.value)
+                    and AstUtilities.getValue(tzKeyword.value) is None
                 )
-                
+
                 if not (isCase1 or isCase2):
                     self.violations.append((node, "M306"))
-            
-            elif node.func.attr == 'strptime':
+
+            elif node.func.attr == "strptime":
                 # datetime.strptime(...).replace(tzinfo=UTC)
-                parent = getattr(node, '_dtCheckerParent', None)
-                pparent = getattr(parent, '_dtCheckerParent', None)
-                if (
-                    not (isinstance(parent, ast.Attribute) and
-                         parent.attr == 'replace') or
-                    not isinstance(pparent, ast.Call)
-                ):
+                parent = getattr(node, "_dtCheckerParent", None)
+                pparent = getattr(parent, "_dtCheckerParent", None)
+                if not (
+                    isinstance(parent, ast.Attribute) and parent.attr == "replace"
+                ) or not isinstance(pparent, ast.Call):
                     isCase1 = False
                 else:
-                    tzinfoKeyword = self.__getFromKeywords(pparent.keywords,
-                                                           'tzinfo')
-                    isCase1 = (
-                        tzinfoKeyword is not None and
-                        not (
-                            AstUtilities.isNameConstant(
-                                tzinfoKeyword.value) and
-                            AstUtilities.getValue(tzinfoKeyword.value) is None
-                        )
+                    tzinfoKeyword = self.__getFromKeywords(pparent.keywords, "tzinfo")
+                    isCase1 = tzinfoKeyword is not None and not (
+                        AstUtilities.isNameConstant(tzinfoKeyword.value)
+                        and AstUtilities.getValue(tzinfoKeyword.value) is None
                     )
-                
+
                 if not isCase1:
                     self.violations.append((node, "M307"))
-            
-            elif node.func.attr == 'fromordinal':
+
+            elif node.func.attr == "fromordinal":
                 self.violations.append((node, "M308"))
-        
+
         # date.something()
-        isDateClass = (isinstance(node.func, ast.Attribute) and
-                       isinstance(node.func.value, ast.Name) and
-                       node.func.value.id == 'date')
-        
+        isDateClass = (
+            isinstance(node.func, ast.Attribute)
+            and isinstance(node.func.value, ast.Name)
+            and node.func.value.id == "date"
+        )
+
         # datetime.date.something()
-        isDateModuleAndClass = (isinstance(node.func, ast.Attribute) and
-                                isinstance(node.func.value, ast.Attribute) and
-                                node.func.value.attr == 'date' and
-                                isinstance(node.func.value.value, ast.Name) and
-                                node.func.value.value.id == 'datetime')
-        
+        isDateModuleAndClass = (
+            isinstance(node.func, ast.Attribute)
+            and isinstance(node.func.value, ast.Attribute)
+            and node.func.value.attr == "date"
+            and isinstance(node.func.value.value, ast.Name)
+            and node.func.value.value.id == "datetime"
+        )
+
         if isDateClass or isDateModuleAndClass:
-            if node.func.attr == 'today':
+            if node.func.attr == "today":
                 self.violations.append((node, "M312"))
-            
-            elif node.func.attr == 'fromtimestamp':
+
+            elif node.func.attr == "fromtimestamp":
                 self.violations.append((node, "M313"))
-            
-            elif node.func.attr == 'fromordinal':
+
+            elif node.func.attr == "fromordinal":
                 self.violations.append((node, "M314"))
-            
-            elif node.func.attr == 'fromisoformat':
+
+            elif node.func.attr == "fromisoformat":
                 self.violations.append((node, "M315"))
-        
+
         self.generic_visit(node)
 
 
@@ -2229,35 +2342,36 @@
     """
     Class implementing a node visitor to check the use of sys.version and
     sys.version_info.
-    
+
     Note: This class is modelled after flake8-2020 checker.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.violations = []
         self.__fromImports = {}
-    
+
     def visit_ImportFrom(self, node):
         """
         Public method to handle a from ... import ... statement.
-        
+
         @param node reference to the node to be processed
         @type ast.ImportFrom
         """
         for alias in node.names:
             if node.module is not None and not alias.asname:
                 self.__fromImports[alias.name] = node.module
-        
+
         self.generic_visit(node)
-    
+
     def __isSys(self, attr, node):
         """
         Private method to check for a reference to sys attribute.
-        
+
         @param attr attribute name
         @type str
         @param node reference to the node to be checked
@@ -2267,22 +2381,23 @@
         """
         match = False
         if (
-            (isinstance(node, ast.Attribute) and
-             isinstance(node.value, ast.Name) and
-             node.value.id == "sys" and
-             node.attr == attr) or
-            (isinstance(node, ast.Name) and
-             node.id == attr and
-             self.__fromImports.get(node.id) == "sys")
+            isinstance(node, ast.Attribute)
+            and isinstance(node.value, ast.Name)
+            and node.value.id == "sys"
+            and node.attr == attr
+        ) or (
+            isinstance(node, ast.Name)
+            and node.id == attr
+            and self.__fromImports.get(node.id) == "sys"
         ):
             match = True
-        
+
         return match
-    
+
     def __isSysVersionUpperSlice(self, node, n):
         """
         Private method to check the upper slice of sys.version.
-        
+
         @param node reference to the node to be checked
         @type ast.Node
         @param n slice value to check against
@@ -2291,18 +2406,18 @@
         @rtype bool
         """
         return (
-            self.__isSys("version", node.value) and
-            isinstance(node.slice, ast.Slice) and
-            node.slice.lower is None and
-            AstUtilities.isNumber(node.slice.upper) and
-            AstUtilities.getValue(node.slice.upper) == n and
-            node.slice.step is None
+            self.__isSys("version", node.value)
+            and isinstance(node.slice, ast.Slice)
+            and node.slice.lower is None
+            and AstUtilities.isNumber(node.slice.upper)
+            and AstUtilities.getValue(node.slice.upper) == n
+            and node.slice.step is None
         )
-    
+
     def visit_Subscript(self, node):
         """
         Public method to handle a subscript.
-        
+
         @param node reference to the node to be processed
         @type ast.Subscript
         """
@@ -2311,46 +2426,46 @@
         elif self.__isSysVersionUpperSlice(node, 3):
             self.violations.append((node.value, "M401"))
         elif (
-            self.__isSys('version', node.value) and
-            isinstance(node.slice, ast.Index) and
-            AstUtilities.isNumber(node.slice.value) and
-            AstUtilities.getValue(node.slice.value) == 2
+            self.__isSys("version", node.value)
+            and isinstance(node.slice, ast.Index)
+            and AstUtilities.isNumber(node.slice.value)
+            and AstUtilities.getValue(node.slice.value) == 2
         ):
             self.violations.append((node.value, "M402"))
         elif (
-            self.__isSys('version', node.value) and
-            isinstance(node.slice, ast.Index) and
-            AstUtilities.isNumber(node.slice.value) and
-            AstUtilities.getValue(node.slice.value) == 0
+            self.__isSys("version", node.value)
+            and isinstance(node.slice, ast.Index)
+            and AstUtilities.isNumber(node.slice.value)
+            and AstUtilities.getValue(node.slice.value) == 0
         ):
             self.violations.append((node.value, "M421"))
 
         self.generic_visit(node)
-    
+
     def visit_Compare(self, node):
         """
         Public method to handle a comparison.
-        
+
         @param node reference to the node to be processed
         @type ast.Compare
         """
         if (
-            isinstance(node.left, ast.Subscript) and
-            self.__isSys('version_info', node.left.value) and
-            isinstance(node.left.slice, ast.Index) and
-            AstUtilities.isNumber(node.left.slice.value) and
-            AstUtilities.getValue(node.left.slice.value) == 0 and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], ast.Eq) and
-            AstUtilities.isNumber(node.comparators[0]) and
-            AstUtilities.getValue(node.comparators[0]) == 3
+            isinstance(node.left, ast.Subscript)
+            and self.__isSys("version_info", node.left.value)
+            and isinstance(node.left.slice, ast.Index)
+            and AstUtilities.isNumber(node.left.slice.value)
+            and AstUtilities.getValue(node.left.slice.value) == 0
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], ast.Eq)
+            and AstUtilities.isNumber(node.comparators[0])
+            and AstUtilities.getValue(node.comparators[0]) == 3
         ):
             self.violations.append((node.left, "M411"))
         elif (
-            self.__isSys('version', node.left) and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            AstUtilities.isString(node.comparators[0])
+            self.__isSys("version", node.left)
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE))
+            and AstUtilities.isString(node.comparators[0])
         ):
             if len(AstUtilities.getValue(node.comparators[0])) == 1:
                 errorCode = "M422"
@@ -2358,55 +2473,56 @@
                 errorCode = "M403"
             self.violations.append((node.left, errorCode))
         elif (
-            isinstance(node.left, ast.Subscript) and
-            self.__isSys('version_info', node.left.value) and
-            isinstance(node.left.slice, ast.Index) and
-            AstUtilities.isNumber(node.left.slice.value) and
-            AstUtilities.getValue(node.left.slice.value) == 1 and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            AstUtilities.isNumber(node.comparators[0])
+            isinstance(node.left, ast.Subscript)
+            and self.__isSys("version_info", node.left.value)
+            and isinstance(node.left.slice, ast.Index)
+            and AstUtilities.isNumber(node.left.slice.value)
+            and AstUtilities.getValue(node.left.slice.value) == 1
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE))
+            and AstUtilities.isNumber(node.comparators[0])
         ):
             self.violations.append((node, "M413"))
         elif (
-            isinstance(node.left, ast.Attribute) and
-            self.__isSys('version_info', node.left.value) and
-            node.left.attr == 'minor' and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE)) and
-            AstUtilities.isNumber(node.comparators[0])
+            isinstance(node.left, ast.Attribute)
+            and self.__isSys("version_info", node.left.value)
+            and node.left.attr == "minor"
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], (ast.Lt, ast.LtE, ast.Gt, ast.GtE))
+            and AstUtilities.isNumber(node.comparators[0])
         ):
             self.violations.append((node, "M414"))
-        
+
         self.generic_visit(node)
-    
+
     def visit_Attribute(self, node):
         """
         Public method to handle an attribute.
-        
+
         @param node reference to the node to be processed
         @type ast.Attribute
         """
         if (
-            isinstance(node.value, ast.Name) and
-            node.value.id == 'six' and
-            node.attr == 'PY3'
+            isinstance(node.value, ast.Name)
+            and node.value.id == "six"
+            and node.attr == "PY3"
         ):
             self.violations.append((node, "M412"))
-        
+
         self.generic_visit(node)
 
     def visit_Name(self, node):
         """
         Public method to handle an name.
-        
+
         @param node reference to the node to be processed
         @type ast.Name
         """
-        if node.id == 'PY3' and self.__fromImports.get(node.id) == 'six':
+        if node.id == "PY3" and self.__fromImports.get(node.id) == "six":
             self.violations.append((node, "M412"))
-        
+
         self.generic_visit(node)
 
+
 #
 # eflag: noqa = M891
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousDefaults.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousDefaults.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,10 +9,14 @@
 
 MiscellaneousCheckerDefaultArgs = {
     "BuiltinsChecker": {
-        "chr": ["unichr", ],
-        "str": ["unicode", ],
+        "chr": [
+            "unichr",
+        ],
+        "str": [
+            "unicode",
+        ],
     },
-    "CodingChecker": 'latin-1, utf-8',
+    "CodingChecker": "latin-1, utf-8",
     "CopyrightChecker": {
         "Author": "",
         "MinFilesize": 0,
@@ -20,18 +24,18 @@
     "CommentedCodeChecker": {
         "Aggressive": False,
         "WhiteList": [
-            r'pylint',
-            r'pyright',
-            r'noqa',
-            r'type:\s*ignore',
-            r'fmt:\s*(on|off)',
-            r'TODO',
-            r'FIXME',
-            r'WARNING',
-            r'NOTE',
-            r'TEST',
-            r'DOCU',
-            r'XXX',
+            r"pylint",
+            r"pyright",
+            r"noqa",
+            r"type:\s*ignore",
+            r"fmt:\s*(on|off)",
+            r"TODO",
+            r"FIXME",
+            r"WARNING",
+            r"NOTE",
+            r"TEST",
+            r"DOCU",
+            r"XXX",
         ],
-    }
+    },
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,325 +13,362 @@
 
 _miscellaneousMessages = {
     "M101": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "coding magic comment not found"),
+        "MiscellaneousChecker", "coding magic comment not found"
+    ),
     "M102": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "unknown encoding ({0}) found in coding magic comment"),
+        "MiscellaneousChecker", "unknown encoding ({0}) found in coding magic comment"
+    ),
     "M111": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "copyright notice not present"),
+        "MiscellaneousChecker", "copyright notice not present"
+    ),
     "M112": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "copyright notice contains invalid author"),
+        "MiscellaneousChecker", "copyright notice contains invalid author"
+    ),
     "M131": QCoreApplication.translate(
         "MiscellaneousChecker",
         '"{0}" is a Python builtin and is being shadowed; '
-        'consider renaming the variable'),
+        "consider renaming the variable",
+    ),
     "M132": QCoreApplication.translate(
         "MiscellaneousChecker",
         '"{0}" is used as an argument and thus shadows a '
-        'Python builtin; consider renaming the argument'),
+        "Python builtin; consider renaming the argument",
+    ),
     "M181": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary generator - rewrite as a list comprehension'),
+        "unnecessary generator - rewrite as a list comprehension",
+    ),
     "M182": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary generator - rewrite as a set comprehension'),
+        "MiscellaneousChecker", "unnecessary generator - rewrite as a set comprehension"
+    ),
     "M183": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary generator - rewrite as a dict comprehension'),
+        "unnecessary generator - rewrite as a dict comprehension",
+    ),
     "M184": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary list comprehension - rewrite as a set comprehension'),
+        "unnecessary list comprehension - rewrite as a set comprehension",
+    ),
     "M185": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary list comprehension - rewrite as a dict comprehension'),
+        "unnecessary list comprehension - rewrite as a dict comprehension",
+    ),
     "M186": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary {0} call - rewrite as a literal'),
+        "MiscellaneousChecker", "unnecessary {0} call - rewrite as a literal"
+    ),
     "M187a": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} call around {1}()'
-        ' - toggle reverse argument to sorted()'),
+        "unnecessary {0} call around {1}()" " - toggle reverse argument to sorted()",
+    ),
     "M187b": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} call around {1}() - use sorted(..., reverse={2})'),
+        "unnecessary {0} call around {1}() - use sorted(..., reverse={2})",
+    ),
     "M187c": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary {0} call around {1}()'),
+        "MiscellaneousChecker", "unnecessary {0} call around {1}()"
+    ),
     "M188": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary {0} call within {1}()'),
+        "MiscellaneousChecker", "unnecessary {0} call within {1}()"
+    ),
     "M189": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary subscript reversal of iterable within {0}()'),
+        "unnecessary subscript reversal of iterable within {0}()",
+    ),
     "M191": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary {0} literal - rewrite as a {1} literal'),
+        "MiscellaneousChecker", "unnecessary {0} literal - rewrite as a {1} literal"
+    ),
     "M192": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} passed to tuple() - rewrite as a {1} literal'),
+        "unnecessary {0} passed to tuple() - rewrite as a {1} literal",
+    ),
     "M193": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} passed to list() - rewrite as a {1} literal'),
+        "unnecessary {0} passed to list() - rewrite as a {1} literal",
+    ),
     "M195": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary list call - remove the outer call to list()'),
+        "unnecessary list call - remove the outer call to list()",
+    ),
     "M196": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        'unnecessary {0} comprehension - rewrite using {0}()'),
+        "MiscellaneousChecker", "unnecessary {0} comprehension - rewrite using {0}()"
+    ),
     "M197": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} passed to tuple() - remove the outer call to {1}()'),
+        "unnecessary {0} passed to tuple() - remove the outer call to {1}()",
+    ),
     "M198": QCoreApplication.translate(
         "MiscellaneousChecker",
-        'unnecessary {0} passed to list() - remove the outer call to {1}()'),
-    
+        "unnecessary {0} passed to list() - remove the outer call to {1}()",
+    ),
     "M201": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "sort keys - '{0}' should be before '{1}'"),
-    
+        "MiscellaneousChecker", "sort keys - '{0}' should be before '{1}'"
+    ),
     "M301": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "use of 'datetime.datetime()' without 'tzinfo' argument should be"
-        " avoided"),
+        "use of 'datetime.datetime()' without 'tzinfo' argument should be" " avoided",
+    ),
     "M302": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.datetime.today()' should be avoided.\n"
-        "Use 'datetime.datetime.now(tz=)' instead."),
+        "Use 'datetime.datetime.now(tz=)' instead.",
+    ),
     "M303": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.datetime.utcnow()' should be avoided.\n"
-        "Use 'datetime.datetime.now(tz=)' instead."),
+        "Use 'datetime.datetime.now(tz=)' instead.",
+    ),
     "M304": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.datetime.utcfromtimestamp()' should be avoided.\n"
-        "Use 'datetime.datetime.fromtimestamp(, tz=)' instead."),
+        "Use 'datetime.datetime.fromtimestamp(, tz=)' instead.",
+    ),
     "M305": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "use of 'datetime.datetime.now()' without 'tz' argument should be"
-        " avoided"),
+        "use of 'datetime.datetime.now()' without 'tz' argument should be" " avoided",
+    ),
     "M306": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.datetime.fromtimestamp()' without 'tz' argument"
-        " should be avoided"),
+        " should be avoided",
+    ),
     "M307": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.datetime.strptime()' should be followed by"
-        " '.replace(tzinfo=)'"),
+        " '.replace(tzinfo=)'",
+    ),
     "M308": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "use of 'datetime.datetime.fromordinal()' should be avoided"),
+        "use of 'datetime.datetime.fromordinal()' should be avoided",
+    ),
     "M311": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.date()' should be avoided.\n"
-        "Use 'datetime.datetime(, tzinfo=).date()' instead."),
+        "Use 'datetime.datetime(, tzinfo=).date()' instead.",
+    ),
     "M312": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.date.today()' should be avoided.\n"
-        "Use 'datetime.datetime.now(tz=).date()' instead."),
+        "Use 'datetime.datetime.now(tz=).date()' instead.",
+    ),
     "M313": QCoreApplication.translate(
         "MiscellaneousChecker",
         "use of 'datetime.date.fromtimestamp()' should be avoided.\n"
-        "Use 'datetime.datetime.fromtimestamp(tz=).date()' instead."),
+        "Use 'datetime.datetime.fromtimestamp(tz=).date()' instead.",
+    ),
     "M314": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "use of 'datetime.date.fromordinal()' should be avoided"),
+        "MiscellaneousChecker", "use of 'datetime.date.fromordinal()' should be avoided"
+    ),
     "M315": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "use of 'datetime.date.fromisoformat()' should be avoided"),
+        "use of 'datetime.date.fromisoformat()' should be avoided",
+    ),
     "M321": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "use of 'datetime.time()' without 'tzinfo' argument should be"
-        " avoided"),
-    
+        "use of 'datetime.time()' without 'tzinfo' argument should be" " avoided",
+    ),
     "M401": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version[:3]' referenced (Python 3.10), use 'sys.version_info'"),
+        "'sys.version[:3]' referenced (Python 3.10), use 'sys.version_info'",
+    ),
     "M402": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version[2]' referenced (Python 3.10), use 'sys.version_info'"),
+        "'sys.version[2]' referenced (Python 3.10), use 'sys.version_info'",
+    ),
     "M403": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version' compared to string (Python 3.10), use"
-        " 'sys.version_info'"),
+        "'sys.version' compared to string (Python 3.10), use" " 'sys.version_info'",
+    ),
     "M411": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version_info[0] == 3' referenced (Python 4), use '>='"),
+        "'sys.version_info[0] == 3' referenced (Python 4), use '>='",
+    ),
     "M412": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "'six.PY3' referenced (Python 4), use 'not six.PY2'"),
+        "MiscellaneousChecker", "'six.PY3' referenced (Python 4), use 'not six.PY2'"
+    ),
     "M413": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'sys.version_info[1]' compared to integer (Python 4),"
-        " compare 'sys.version_info' to tuple"),
+        " compare 'sys.version_info' to tuple",
+    ),
     "M414": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'sys.version_info.minor' compared to integer (Python 4),"
-        " compare 'sys.version_info' to tuple"),
+        " compare 'sys.version_info' to tuple",
+    ),
     "M421": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version[0]' referenced (Python 10), use 'sys.version_info'"),
+        "'sys.version[0]' referenced (Python 10), use 'sys.version_info'",
+    ),
     "M422": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version' compared to string (Python 10),"
-        " use 'sys.version_info'"),
+        "'sys.version' compared to string (Python 10)," " use 'sys.version_info'",
+    ),
     "M423": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.version[:1]' referenced (Python 10), use 'sys.version_info'"),
-    
+        "'sys.version[:1]' referenced (Python 10), use 'sys.version_info'",
+    ),
     "M501": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "Python does not support the unary prefix increment"),
+        "MiscellaneousChecker", "Python does not support the unary prefix increment"
+    ),
     "M502": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "using .strip() with multi-character strings is misleading"),
+        "using .strip() with multi-character strings is misleading",
+    ),
     "M503": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "do not call assert False since python -O removes these calls"),
+        "do not call assert False since python -O removes these calls",
+    ),
     "M504": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "'sys.maxint' is not defined in Python 3 - use 'sys.maxsize'"),
+        "'sys.maxint' is not defined in Python 3 - use 'sys.maxsize'",
+    ),
     "M505": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'BaseException.message' has been deprecated as of Python 2.6 and is"
-        " removed in Python 3 - use 'str(e)'"),
+        " removed in Python 3 - use 'str(e)'",
+    ),
     "M506": QCoreApplication.translate(
         "MiscellaneousChecker",
         "assigning to 'os.environ' does not clear the environment -"
-        " use 'os.environ.clear()'"),
+        " use 'os.environ.clear()'",
+    ),
     "M507": QCoreApplication.translate(
         "MiscellaneousChecker",
         "loop control variable {0} not used within the loop body -"
-        " start the name with an underscore"),
-    "M508": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "unncessary f-string"),
+        " start the name with an underscore",
+    ),
+    "M508": QCoreApplication.translate("MiscellaneousChecker", "unncessary f-string"),
     "M509": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "cannot use 'self.__class__' as first argument of 'super()' call"),
+        "cannot use 'self.__class__' as first argument of 'super()' call",
+    ),
     "M511": QCoreApplication.translate(
         "MiscellaneousChecker",
         """using 'hasattr(x, "__call__")' to test if 'x' is callable is"""
-        """ unreliable"""),
+        """ unreliable""",
+    ),
     "M512": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "do not call getattr with a constant attribute value"),
+        "MiscellaneousChecker", "do not call getattr with a constant attribute value"
+    ),
     "M513": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "do not call setattr with a constant attribute value"),
+        "MiscellaneousChecker", "do not call setattr with a constant attribute value"
+    ),
     "M521": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "Python 3 does not include '.iter*' methods on dictionaries"),
+        "Python 3 does not include '.iter*' methods on dictionaries",
+    ),
     "M522": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "Python 3 does not include '.view*' methods on dictionaries"),
+        "Python 3 does not include '.view*' methods on dictionaries",
+    ),
     "M523": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "'.next()' does not exist in Python 3"),
+        "MiscellaneousChecker", "'.next()' does not exist in Python 3"
+    ),
     "M524": QCoreApplication.translate(
         "MiscellaneousChecker",
         "'__metaclass__' does nothing on Python 3 -"
-        " use 'class MyClass(BaseClass, metaclass=...)'"),
-    
-    "M601": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "found {0} formatter"),
+        " use 'class MyClass(BaseClass, metaclass=...)'",
+    ),
+    "M601": QCoreApplication.translate("MiscellaneousChecker", "found {0} formatter"),
     "M611": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "format string does contain unindexed parameters"),
+        "MiscellaneousChecker", "format string does contain unindexed parameters"
+    ),
     "M612": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "docstring does contain unindexed parameters"),
+        "MiscellaneousChecker", "docstring does contain unindexed parameters"
+    ),
     "M613": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "other string does contain unindexed parameters"),
+        "MiscellaneousChecker", "other string does contain unindexed parameters"
+    ),
     "M621": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "format call uses too large index ({0})"),
+        "MiscellaneousChecker", "format call uses too large index ({0})"
+    ),
     "M622": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "format call uses missing keyword ({0})"),
+        "MiscellaneousChecker", "format call uses missing keyword ({0})"
+    ),
     "M623": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "format call uses keyword arguments but no named entries"),
+        "format call uses keyword arguments but no named entries",
+    ),
     "M624": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "format call uses variable arguments but no numbered entries"),
+        "format call uses variable arguments but no numbered entries",
+    ),
     "M625": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "format call uses implicit and explicit indexes together"),
+        "format call uses implicit and explicit indexes together",
+    ),
     "M631": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "format call provides unused index ({0})"),
+        "MiscellaneousChecker", "format call provides unused index ({0})"
+    ),
     "M632": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "format call provides unused keyword ({0})"),
+        "MiscellaneousChecker", "format call provides unused keyword ({0})"
+    ),
     "M651": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "logging statement uses string.format()"),
+        "MiscellaneousChecker", "logging statement uses string.format()"
+    ),
     "M652": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "logging statement uses '%'"),          # __IGNORE_WARNING_M601__
+        "MiscellaneousChecker", "logging statement uses '%'"  # __IGNORE_WARNING_M601__
+    ),
     "M653": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "logging statement uses '+'"),
+        "MiscellaneousChecker", "logging statement uses '+'"
+    ),
     "M654": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "logging statement uses f-string"),
+        "MiscellaneousChecker", "logging statement uses f-string"
+    ),
     "M655": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "logging statement uses 'warn' instead of 'warning'"),
-    
+        "MiscellaneousChecker", "logging statement uses 'warn' instead of 'warning'"
+    ),
     "M701": QCoreApplication.translate(
         "MiscellaneousChecker",
-        "expected these __future__ imports: {0}; but only got: {1}"),
+        "expected these __future__ imports: {0}; but only got: {1}",
+    ),
     "M702": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "expected these __future__ imports: {0}; but got none"),
+        "MiscellaneousChecker", "expected these __future__ imports: {0}; but got none"
+    ),
     "M711": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "gettext import with alias _ found: {0}"),
-    
-    "M801": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "print statement found"),
+        "MiscellaneousChecker", "gettext import with alias _ found: {0}"
+    ),
+    "M801": QCoreApplication.translate("MiscellaneousChecker", "print statement found"),
     "M811": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "one element tuple found"),
+        "MiscellaneousChecker", "one element tuple found"
+    ),
     "M821": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "mutable default argument of type {0}"),
+        "MiscellaneousChecker", "mutable default argument of type {0}"
+    ),
     "M822": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "mutable default argument of type {0}"),
+        "MiscellaneousChecker", "mutable default argument of type {0}"
+    ),
     "M823": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "mutable default argument of function call '{0}'"),
+        "MiscellaneousChecker", "mutable default argument of function call '{0}'"
+    ),
     "M831": QCoreApplication.translate(
         "MiscellaneousChecker",
         "None should not be added at any return if function has no return"
-        " value except None"),
+        " value except None",
+    ),
     "M832": QCoreApplication.translate(
         "MiscellaneousChecker",
         "an explicit value at every return should be added if function has"
-        " a return value except None"),
+        " a return value except None",
+    ),
     "M833": QCoreApplication.translate(
         "MiscellaneousChecker",
         "an explicit return at the end of the function should be added if"
-        " it has a return value except None"),
+        " it has a return value except None",
+    ),
     "M834": QCoreApplication.translate(
         "MiscellaneousChecker",
         "a value should not be assigned to a variable if it will be used as a"
-        " return value only"),
+        " return value only",
+    ),
     "M841": QCoreApplication.translate(
         "MiscellaneousChecker",
         "prefer implied line continuation inside parentheses, "
-        "brackets and braces as opposed to a backslash"),
+        "brackets and braces as opposed to a backslash",
+    ),
     "M891": QCoreApplication.translate(
-        "MiscellaneousChecker",
-        "commented code lines should be removed"),
+        "MiscellaneousChecker", "commented code lines should be removed"
+    ),
 }
 
 _miscellaneousMessagesSampleArgs = {
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/NamingStyleChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/NamingStyleChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,7 @@
 import os
 
 try:
-    ast.AsyncFunctionDef    # __IGNORE_EXCEPTION__
+    ast.AsyncFunctionDef  # __IGNORE_EXCEPTION__
 except AttributeError:
     ast.AsyncFunctionDef = ast.FunctionDef
 
@@ -22,20 +22,33 @@
     """
     Class implementing a checker for naming conventions.
     """
+
     LowercaseRegex = re.compile(r"[_a-z][_a-z0-9]*$")
     UppercaseRegexp = re.compile(r"[_A-Z][_A-Z0-9]*$")
     CamelcaseRegexp = re.compile(r"_?[A-Z][a-zA-Z0-9]*$")
     MixedcaseRegexp = re.compile(r"_?[a-z][a-zA-Z0-9]*$")
-    
+
     Codes = [
-        "N801", "N802", "N803", "N804", "N805", "N806", "N807", "N808",
-        "N811", "N812", "N813", "N814", "N821", "N831"
+        "N801",
+        "N802",
+        "N803",
+        "N804",
+        "N805",
+        "N806",
+        "N807",
+        "N808",
+        "N811",
+        "N812",
+        "N813",
+        "N814",
+        "N821",
+        "N831",
     ]
-    
+
     def __init__(self, tree, filename, options):
         """
         Constructor (according to 'extended' pycodestyle.py API)
-        
+
         @param tree AST tree of the source file
         @param filename name of the source file (string)
         @param options options as parsed by pycodestyle.StyleGuide
@@ -43,7 +56,7 @@
         self.__parents = collections.deque()
         self.__tree = tree
         self.__filename = filename
-        
+
         self.__checkersWithCodes = {
             "classdef": [
                 (self.__checkClassName, ("N801",)),
@@ -51,8 +64,7 @@
             ],
             "functiondef": [
                 (self.__checkFunctionName, ("N802",)),
-                (self.__checkFunctionArgumentNames,
-                    ("N803", "N804", "N805", "N806")),
+                (self.__checkFunctionArgumentNames, ("N803", "N804", "N805", "N806")),
                 (self.__checkNameToBeAvoided, ("N831",)),
             ],
             "assign": [
@@ -66,12 +78,11 @@
                 (self.__checkModule, ("N807", "N808")),
             ],
         }
-        
+
         self.__checkers = {}
         for key, checkers in self.__checkersWithCodes.items():
             for checker, codes in checkers:
-                if any(not (code and options.ignore_code(code))
-                        for code in codes):
+                if any(not (code and options.ignore_code(code)) for code in codes):
                     if key not in self.__checkers:
                         self.__checkers[key] = []
                     self.__checkers[key].append(checker)
@@ -79,7 +90,7 @@
     def run(self):
         """
         Public method run by the pycodestyle.py checker.
-        
+
         @return tuple giving line number, offset within line, code and
             checker function
         """
@@ -87,11 +98,11 @@
             return self.__visitTree(self.__tree)
         else:
             return ()
-    
+
     def __visitTree(self, node):
         """
         Private method to scan the given AST tree.
-        
+
         @param node AST tree node to scan
         @yield tuple giving line number, offset within line and error code
         @ytype tuple of (int, int, str)
@@ -101,11 +112,11 @@
         for child in ast.iter_child_nodes(node):
             yield from self.__visitTree(child)
         self.__parents.pop()
-    
+
     def __visitNode(self, node):
         """
         Private method to inspect the given AST node.
-        
+
         @param node AST tree node to inspect
         @yield tuple giving line number, offset within line and error code
         @ytype tuple of (int, int, str)
@@ -114,31 +125,33 @@
             self.__tagClassFunctions(node)
         elif isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
             self.__findGlobalDefs(node)
-        
+
         checkerName = node.__class__.__name__.lower()
         if checkerName in self.__checkers:
             for checker in self.__checkers[checkerName]:
                 for error in checker(node, self.__parents):
                     yield error + (self.__checkers[checkerName],)
-    
+
     def __tagClassFunctions(self, classNode):
         """
         Private method to tag functions if they are methods, class methods or
         static methods.
-        
+
         @param classNode AST tree node to tag
         """
         # try to find all 'old style decorators'
         # like m = staticmethod(m)
         lateDecoration = {}
         for node in ast.iter_child_nodes(classNode):
-            if not (isinstance(node, ast.Assign) and
-                    isinstance(node.value, ast.Call) and
-                    isinstance(node.value.func, ast.Name)):
+            if not (
+                isinstance(node, ast.Assign)
+                and isinstance(node.value, ast.Call)
+                and isinstance(node.value.func, ast.Name)
+            ):
                 continue
             funcName = node.value.func.id
             if funcName in ("classmethod", "staticmethod"):
-                meth = (len(node.value.args) == 1 and node.value.args[0])
+                meth = len(node.value.args) == 1 and node.value.args[0]
                 if isinstance(meth, ast.Name):
                     lateDecoration[meth.id] = funcName
 
@@ -146,24 +159,27 @@
         for node in ast.iter_child_nodes(classNode):
             if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
                 continue
-            
-            node.function_type = 'method'
+
+            node.function_type = "method"
             if node.name == "__new__":
                 node.function_type = "classmethod"
-            
+
             if node.name in lateDecoration:
                 node.function_type = lateDecoration[node.name]
             elif node.decorator_list:
-                names = [d.id for d in node.decorator_list
-                         if isinstance(d, ast.Name) and
-                         d.id in ("classmethod", "staticmethod")]
+                names = [
+                    d.id
+                    for d in node.decorator_list
+                    if isinstance(d, ast.Name)
+                    and d.id in ("classmethod", "staticmethod")
+                ]
                 if names:
                     node.function_type = names[0]
 
     def __findGlobalDefs(self, functionNode):
         """
         Private method amend a node with global definitions information.
-        
+
         @param functionNode AST tree node to amend
         """
         globalNames = set()
@@ -173,26 +189,27 @@
             if isinstance(node, ast.Global):
                 globalNames.update(node.names)
 
-            if not isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef,
-                                     ast.ClassDef)):
+            if not isinstance(
+                node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)
+            ):
                 nodesToCheck.extend(ast.iter_child_nodes(node))
         functionNode.global_names = globalNames
-    
+
     def __getArgNames(self, node):
         """
         Private method to get the argument names of a function node.
-        
+
         @param node AST node to extract arguments names from
         @return list of argument names (list of string)
         """
         posArgs = [arg.arg for arg in node.args.args]
         kwOnly = [arg.arg for arg in node.args.kwonlyargs]
         return posArgs + kwOnly
-    
+
     def __error(self, node, code):
         """
         Private method to build the error information.
-        
+
         @param node AST node to report an error for
         @param code error code to report (string)
         @return tuple giving line number, offset within line and error code
@@ -211,69 +228,68 @@
                 lineno += len(node.decorator_list)
                 offset += 4
         return (lineno, offset, code)
-    
+
     def __isNameToBeAvoided(self, name):
         """
         Private method to check, if the given name should be avoided.
-        
+
         @param name name to be checked (string)
         @return flag indicating to avoid it (boolen)
         """
         return name in ("l", "O", "I")
-    
+
     def __checkNameToBeAvoided(self, node, parents):
         """
         Private class to check the given node for a name to be avoided (N831).
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
         @ytype tuple of (int, int, str)
         """
-        if isinstance(node, (ast.ClassDef, ast.FunctionDef,
-                             ast.AsyncFunctionDef)):
+        if isinstance(node, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)):
             name = node.name
             if self.__isNameToBeAvoided(name):
                 yield self.__error(node, "N831")
                 return
-        
+
         if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
             argNames = self.__getArgNames(node)
             for arg in argNames:
                 if self.__isNameToBeAvoided(arg):
                     yield self.__error(node, "N831")
                     return
-        
+
         if isinstance(node, ast.Assign):
             for target in node.targets:
                 if isinstance(target, ast.Name):
                     name = target.id
                     if not name:
                         return
-                    
+
                     if self.__isNameToBeAvoided(name):
                         yield self.__error(node, "N831")
                         return
-                
+
                 elif isinstance(target, (ast.Tuple, ast.List)):
                     for element in target.elts:
                         if isinstance(element, ast.Name):
                             name = element.id
                             if not name:
                                 return
-                            
+
                             if self.__isNameToBeAvoided(name):
                                 yield self.__error(node, "N831")
                                 return
-    
+
     def __checkClassName(self, node, parents):
         """
         Private class to check the given node for class name
         conventions (N801).
-        
+
         Almost without exception, class names use the CapWords convention.
         Classes for internal use have a leading underscore in addition.
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -281,18 +297,18 @@
         """
         if not self.CamelcaseRegexp.match(node.name):
             yield self.__error(node, "N801")
-    
+
     def __checkFunctionName(self, node, parents):
         """
         Private class to check the given node for function name
         conventions (N802).
-        
+
         Function names should be lowercase, with words separated by underscores
         as necessary to improve readability. Functions <b>not</b> being
         methods '__' in front and back are not allowed. Mixed case is allowed
         only in contexts where that's already the prevailing style
         (e.g. threading.py), to retain backwards compatibility.
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -301,20 +317,19 @@
         functionType = getattr(node, "function_type", "function")
         name = node.name
         if (
-            (functionType == "function" and "__" in (name[:2], name[-2:])) or
-            not self.LowercaseRegex.match(name)
-        ):
+            functionType == "function" and "__" in (name[:2], name[-2:])
+        ) or not self.LowercaseRegex.match(name):
             yield self.__error(node, "N802")
-    
+
     def __checkFunctionArgumentNames(self, node, parents):
         """
         Private class to check the argument names of functions
         (N803, N804, N805, N806).
-        
+
         The argument names of a function should be lowercase, with words
         separated by underscores. A class method should have 'cls' as the
         first argument. A method should have 'self' as the first argument.
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -325,49 +340,40 @@
             if not self.LowercaseRegex.match(kwarg):
                 yield self.__error(node, "N803")
                 return
-        
+
         if node.args.vararg is not None:
             vararg = node.args.vararg.arg
             if not self.LowercaseRegex.match(vararg):
                 yield self.__error(node, "N803")
                 return
-        
+
         argNames = self.__getArgNames(node)
         functionType = getattr(node, "function_type", "function")
-        
+
         if not argNames:
             if functionType == "method":
                 yield self.__error(node, "N805")
             elif functionType == "classmethod":
                 yield self.__error(node, "N804")
             return
-        
-        if (
-            functionType == "method" and
-            argNames[0] != "self"
-        ):
+
+        if functionType == "method" and argNames[0] != "self":
             yield self.__error(node, "N805")
-        elif (
-            functionType == "classmethod" and
-            argNames[0] != "cls"
-        ):
+        elif functionType == "classmethod" and argNames[0] != "cls":
             yield self.__error(node, "N804")
-        elif (
-            functionType == "staticmethod" and
-            argNames[0] in ("cls", "self")
-        ):
+        elif functionType == "staticmethod" and argNames[0] in ("cls", "self"):
             yield self.__error(node, "N806")
         for arg in argNames:
             if not self.LowercaseRegex.match(arg):
                 yield self.__error(node, "N803")
                 return
-    
+
     def __checkVariablesInFunction(self, node, parents):
         """
         Private method to check local variables in functions (N821).
-        
+
         Local variables in functions should be lowercase.
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -384,16 +390,16 @@
             name = isinstance(target, ast.Name) and target.id
             if not name or name in parentFunc.global_names:
                 return
-            
-            if not self.LowercaseRegex.match(name) and name[:1] != '_':
+
+            if not self.LowercaseRegex.match(name) and name[:1] != "_":
                 yield self.__error(target, "N821")
-    
+
     def __checkModule(self, node, parents):
         """
         Private method to check module naming conventions (N807, N808).
-        
+
         Module and package names should be lowercase.
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -403,20 +409,18 @@
             moduleName = os.path.splitext(os.path.basename(self.__filename))[0]
             if moduleName.lower() != moduleName:
                 yield self.__error(node, "N807")
-            
+
             if moduleName == "__init__":
                 # we got a package
-                packageName = (
-                    os.path.split(os.path.dirname(self.__filename))[1]
-                )
+                packageName = os.path.split(os.path.dirname(self.__filename))[1]
                 if packageName.lower() != packageName:
                     yield self.__error(node, "N808")
-    
+
     def __checkImportAs(self, node, parents):
         """
         Private method to check that imports don't change the
         naming convention (N811, N812, N813, N814).
-        
+
         @param node AST note to check
         @param parents list of parent nodes
         @yield tuple giving line number, offset within line and error code
@@ -425,7 +429,7 @@
         for name in node.names:
             if not name.asname:
                 continue
-            
+
             if self.UppercaseRegexp.match(name.name):
                 if not self.UppercaseRegexp.match(name.asname):
                     yield self.__error(node, "N811")
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Naming/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,46 +13,46 @@
 
 _namingStyleMessages = {
     "N801": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "class names should use CapWords convention"),
+        "NamingStyleChecker", "class names should use CapWords convention"
+    ),
     "N802": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "function name should be lowercase"),
+        "NamingStyleChecker", "function name should be lowercase"
+    ),
     "N803": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "argument name should be lowercase"),
+        "NamingStyleChecker", "argument name should be lowercase"
+    ),
     "N804": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "first argument of a class method should be named 'cls'"),
+        "NamingStyleChecker", "first argument of a class method should be named 'cls'"
+    ),
     "N805": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "first argument of a method should be named 'self'"),
+        "NamingStyleChecker", "first argument of a method should be named 'self'"
+    ),
     "N806": QCoreApplication.translate(
         "NamingStyleChecker",
-        "first argument of a static method should not be named"
-        " 'self' or 'cls"),
+        "first argument of a static method should not be named" " 'self' or 'cls",
+    ),
     "N807": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "module names should be lowercase"),
+        "NamingStyleChecker", "module names should be lowercase"
+    ),
     "N808": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "package names should be lowercase"),
+        "NamingStyleChecker", "package names should be lowercase"
+    ),
     "N811": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "constant imported as non constant"),
+        "NamingStyleChecker", "constant imported as non constant"
+    ),
     "N812": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "lowercase imported as non lowercase"),
+        "NamingStyleChecker", "lowercase imported as non lowercase"
+    ),
     "N813": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "camelcase imported as lowercase"),
+        "NamingStyleChecker", "camelcase imported as lowercase"
+    ),
     "N814": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "camelcase imported as constant"),
+        "NamingStyleChecker", "camelcase imported as constant"
+    ),
     "N821": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "variable in function should be lowercase"),
+        "NamingStyleChecker", "variable in function should be lowercase"
+    ),
     "N831": QCoreApplication.translate(
-        "NamingStyleChecker",
-        "names 'l', 'O' and 'I' should be avoided"),
+        "NamingStyleChecker", "names 'l', 'O' and 'I' should be avoided"
+    ),
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/PathlibChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/PathlibChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,22 +18,43 @@
     Class implementing a checker for functions that can be replaced by use of
     the pathlib module.
     """
+
     Codes = [
         ## Replacements for the os module functions
-        "P101", "P102", "P103", "P104", "P105", "P106", "P107",
-        "P108", "P109", "P110", "P111", "P112", "P113", "P114",
-        
+        "P101",
+        "P102",
+        "P103",
+        "P104",
+        "P105",
+        "P106",
+        "P107",
+        "P108",
+        "P109",
+        "P110",
+        "P111",
+        "P112",
+        "P113",
+        "P114",
         ## Replacements for the os.path module functions
-        "P201", "P202", "P203", "P204", "P205", "P206", "P207",
-        "P208", "P209", "P210", "P211", "P212", "P213",
-        
+        "P201",
+        "P202",
+        "P203",
+        "P204",
+        "P205",
+        "P206",
+        "P207",
+        "P208",
+        "P209",
+        "P210",
+        "P211",
+        "P212",
+        "P213",
         ## Replacements for some Python standrd library functions
         "P301",
-        
         ## Replacements for py.path.local
         "P401",
     ]
-    
+
     # map functions to be replaced to error codes
     Function2Code = {
         "os.chmod": "P101",
@@ -50,7 +71,6 @@
         "os.listdir": "P112",
         "os.link": "P113",
         "os.symlink": "P114",
-        
         "os.path.abspath": "P201",
         "os.path.exists": "P202",
         "os.path.expanduser": "P203",
@@ -64,17 +84,14 @@
         "os.path.samefile": "P211",
         "os.path.splitext": "P212",
         "os.path.relpath": "P213",
-        
         "open": "P301",
-        
         "py.path.local": "P401",
     }
-    
-    def __init__(self, source, filename, tree, selected, ignored, expected,
-                 repeat):
+
+    def __init__(self, source, filename, tree, selected, ignored, expected, repeat):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -91,22 +108,21 @@
         @type bool
         """
         self.__select = tuple(selected)
-        self.__ignore = ('',) if selected else tuple(ignored)
+        self.__ignore = ("",) if selected else tuple(ignored)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__filename = filename
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
-        self.__checkCodes = (code for code in self.Codes
-                             if not self.__ignoreCode(code))
-    
+
+        self.__checkCodes = (code for code in self.Codes if not self.__ignoreCode(code))
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -116,13 +132,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -134,16 +149,16 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
             self.errors.append(
@@ -155,7 +170,7 @@
                     "args": args,
                 }
             )
-    
+
     def run(self):
         """
         Public method to check the given source against functions
@@ -164,19 +179,19 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkCodes:
             # don't do anything, if no codes were selected
             return
-        
+
         visitor = PathlibVisitor(self.__checkForReplacement)
         visitor.visit(self.__tree)
-    
+
     def __checkForReplacement(self, node, name):
         """
         Private method to check the given node for the need for a
         replacement.
-        
+
         @param node reference to the AST node to check
         @type ast.AST
         @param name resolved name of the node
@@ -191,23 +206,24 @@
     """
     Class to traverse the AST node tree and check for potential issues.
     """
+
     def __init__(self, checkCallback):
         """
         Constructor
-        
+
         @param checkCallback callback function taking a reference to the
             AST node and the resolved name
         @type func
         """
         super().__init__()
-        
+
         self.__checkCallback = checkCallback
         self.__importAlias = {}
-    
+
     def visit_ImportFrom(self, node):
         """
         Public method handle the ImportFrom AST node.
-        
+
         @param node reference to the ImportFrom AST node
         @type ast.ImportFrom
         """
@@ -220,7 +236,7 @@
     def visit_Import(self, node):
         """
         Public method to handle the Import AST node.
-        
+
         @param node reference to the Import AST node
         @type ast.Import
         """
@@ -231,13 +247,13 @@
     def visit_Call(self, node):
         """
         Public method to handle the Call AST node.
-        
+
         @param node reference to the Call AST node
         @type ast.Call
         """
         nameResolver = NameResolver(self.__importAlias)
         nameResolver.visit(node.func)
-        
+
         self.__checkCallback(node, nameResolver.name())
 
 
@@ -245,20 +261,21 @@
     """
     Class to resolve a Name or Attribute node.
     """
+
     def __init__(self, importAlias):
         """
         Constructor
-        
+
         @param importAlias reference to the import aliases dictionary
         @type dict
         """
         self.__importAlias = importAlias
         self.__names = []
-    
+
     def name(self):
         """
         Public method to resolve the name.
-        
+
         @return resolved name
         @rtype str
         """
@@ -266,22 +283,22 @@
             attr = self.__importAlias[self.__names[-1]]
             self.__names[-1] = attr
             # do nothing if there is no such name or the names list is empty
-        
+
         return ".".join(reversed(self.__names))
-    
+
     def visit_Name(self, node):
         """
         Public method to handle the Name AST node.
-        
+
         @param node reference to the Name AST node
         @type ast.Name
         """
         self.__names.append(node.id)
-    
+
     def visit_Attribute(self, node):
         """
         Public method to handle the Attribute AST node.
-        
+
         @param node reference to the Attribute AST node
         @type ast.Attribute
         """
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/PathLib/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,102 +14,113 @@
 _pathlibMessages = {
     "P101": QCoreApplication.translate(
         "PathlibChecker",
-        "os.chmod('foo', 0o444) should be replaced by foo_path.chmod(0o444)"),
+        "os.chmod('foo', 0o444) should be replaced by foo_path.chmod(0o444)",
+    ),
     "P102": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.mkdir('foo') should be replaced by foo_path.mkdir()"),
+        "PathlibChecker", "os.mkdir('foo') should be replaced by foo_path.mkdir()"
+    ),
     "P103": QCoreApplication.translate(
         "PathlibChecker",
-        "os.makedirs('foo/bar') should be replaced by "
-        "bar_path.mkdir(parents=True)"),
+        "os.makedirs('foo/bar') should be replaced by " "bar_path.mkdir(parents=True)",
+    ),
     "P104": QCoreApplication.translate(
         "PathlibChecker",
-        "os.rename('foo', 'bar') should be replaced by "
-        "foo_path.rename(Path('bar'))"),
+        "os.rename('foo', 'bar') should be replaced by " "foo_path.rename(Path('bar'))",
+    ),
     "P105": QCoreApplication.translate(
         "PathlibChecker",
         "os.replace('foo', 'bar') should be replaced by "
-        "foo_path.replace(Path('bar'))"),
+        "foo_path.replace(Path('bar'))",
+    ),
     "P106": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.rmdir('foo') should be replaced by foo_path.rmdir()"),
+        "PathlibChecker", "os.rmdir('foo') should be replaced by foo_path.rmdir()"
+    ),
     "P107": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.remove('foo') should be replaced by foo_path.unlink()"),
+        "PathlibChecker", "os.remove('foo') should be replaced by foo_path.unlink()"
+    ),
     "P108": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.unlink('foo'') should be replaced by foo_path.unlink()"),
+        "PathlibChecker", "os.unlink('foo'') should be replaced by foo_path.unlink()"
+    ),
     "P109": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.getcwd() should be replaced by Path.cwd()"),
+        "PathlibChecker", "os.getcwd() should be replaced by Path.cwd()"
+    ),
     "P110": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.readlink('foo') should be replaced by foo_path.readlink()"),
+        "PathlibChecker", "os.readlink('foo') should be replaced by foo_path.readlink()"
+    ),
     "P111": QCoreApplication.translate(
         "PathlibChecker",
         "os.stat('foo') should be replaced by foo_path.stat() or "
-        "foo_path.owner() or foo_path.group()"),
+        "foo_path.owner() or foo_path.group()",
+    ),
     "P112": QCoreApplication.translate(
         "PathlibChecker",
-        "os.listdir(path='foo') should be replaced by foo_path.iterdir()"),
+        "os.listdir(path='foo') should be replaced by foo_path.iterdir()",
+    ),
     "P113": QCoreApplication.translate(
         "PathlibChecker",
-        "os.link('bar', 'foo') should be replaced by"
-        " foo_path.hardlink_to('bar')"),
+        "os.link('bar', 'foo') should be replaced by" " foo_path.hardlink_to('bar')",
+    ),
     "P114": QCoreApplication.translate(
         "PathlibChecker",
-        "os.symlink('bar', 'foo') should be replaced by"
-        " foo_path.symlink_to('bar')"),
-    
+        "os.symlink('bar', 'foo') should be replaced by" " foo_path.symlink_to('bar')",
+    ),
     "P201": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.abspath('foo') should be replaced by foo_path.resolve()"),
+        "os.path.abspath('foo') should be replaced by foo_path.resolve()",
+    ),
     "P202": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.exists('foo') should be replaced by foo_path.exists()"),
+        "os.path.exists('foo') should be replaced by foo_path.exists()",
+    ),
     "P203": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.expanduser('~/foo') should be replaced by "
-        "foo_path.expanduser()"),
+        "os.path.expanduser('~/foo') should be replaced by " "foo_path.expanduser()",
+    ),
     "P204": QCoreApplication.translate(
-        "PathlibChecker",
-        "os.path.isdir('foo') should be replaced by foo_path.is_dir()"),
+        "PathlibChecker", "os.path.isdir('foo') should be replaced by foo_path.is_dir()"
+    ),
     "P205": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.isfile('foo') should be replaced by foo_path.is_file()"),
+        "os.path.isfile('foo') should be replaced by foo_path.is_file()",
+    ),
     "P206": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.islink('foo') should be replaced by foo_path.is_symlink()"),
+        "os.path.islink('foo') should be replaced by foo_path.is_symlink()",
+    ),
     "P207": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.isabs('foo') should be replaced by foo_path.is_absolute()"),
+        "os.path.isabs('foo') should be replaced by foo_path.is_absolute()",
+    ),
     "P208": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.join('foo', 'bar') should be replaced by "
-        "foo_path / 'bar'"),
+        "os.path.join('foo', 'bar') should be replaced by " "foo_path / 'bar'",
+    ),
     "P209": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.basename('foo/bar') should be replaced by bar_path.name"),
+        "os.path.basename('foo/bar') should be replaced by bar_path.name",
+    ),
     "P210": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.dirname('foo/bar') should be replaced by bar_path.parent"),
+        "os.path.dirname('foo/bar') should be replaced by bar_path.parent",
+    ),
     "P211": QCoreApplication.translate(
         "PathlibChecker",
         "os.path.samefile('foo', 'bar') should be replaced by "
-        "foo_path.samefile(bar_path)"),
+        "foo_path.samefile(bar_path)",
+    ),
     "P212": QCoreApplication.translate(
         "PathlibChecker",
-        "os.path.splitext('foo.bar') should be replaced by foo_path.suffix"),
+        "os.path.splitext('foo.bar') should be replaced by foo_path.suffix",
+    ),
     "P213": QCoreApplication.translate(
         "PathlibChecker",
         "os.path.relpath('/bar/foo', start='bar') should be replaced by "
-        "foo_path.relative_to('/bar')"),
-    
+        "foo_path.relative_to('/bar')",
+    ),
     "P301": QCoreApplication.translate(
-        "PathlibChecker",
-        "open('foo') should be replaced by Path('foo').open()"),
-    
+        "PathlibChecker", "open('foo') should be replaced by Path('foo').open()"
+    ),
     "P401": QCoreApplication.translate(
-        "PathlibChecker",
-        "py.path.local is in maintenance mode, use pathlib instead"),
+        "PathlibChecker", "py.path.local is in maintenance mode, use pathlib instead"
+    ),
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,37 +14,39 @@
 def generateCheckersDict():
     """
     Function to generate the dictionary with checkers.
-    
+
     Checker modules are searched for inside this package. Each module
     defining some checks must contain a function 'getChecks()' returning
     a dictionary containing the check type as key and a list of tuples
     with the check function and associated message codes.
-    
+
     @return dictionary containing list of tuples with checker data
     @rtype dict
     """
     checkersDict = collections.defaultdict(list)
-    
+
     checkersDirectory = os.path.dirname(__file__)
-    checkerModules = [os.path.splitext(m)[0]
-                      for m in os.listdir(checkersDirectory)
-                      if m != "__init__.py" and m.endswith(".py")]
-    
+    checkerModules = [
+        os.path.splitext(m)[0]
+        for m in os.listdir(checkersDirectory)
+        if m != "__init__.py" and m.endswith(".py")
+    ]
+
     for checkerModule in checkerModules:
         modName = "Security.Checks.{0}".format(checkerModule)
         try:
             mod = __import__(modName)
-            components = modName.split('.')
+            components = modName.split(".")
             for comp in components[1:]:
                 mod = getattr(mod, comp)
         except ImportError:
             continue
-        
+
         if not hasattr(mod, "getChecks"):
             continue
-        
+
         modCheckersDict = mod.getChecks()
         for checktype, checks in modCheckersDict.items():
             checkersDict[checktype].extend(checks)
-    
+
     return checkersDict
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/assert.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/assert.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkAssertUsed(reportError, context, config):
     """
     Function to check for the use of 'assert'.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,10 +42,4 @@
     @param config dictionary with configuration data
     @type dict
     """
-    reportError(
-        context.node.lineno - 1,
-        context.node.col_offset,
-        "S101",
-        "L",
-        "H"
-    )
+    reportError(context.node.lineno - 1, context.node.col_offset, "S101", "L", "H")
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,7 +25,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,26 +36,23 @@
         ],
     }
 
+
 AWS_ACCESS_KEY_ID_SYMBOLS = string.ascii_uppercase + string.digits
-AWS_ACCESS_KEY_ID_REGEX = re.compile(
-    '[' + AWS_ACCESS_KEY_ID_SYMBOLS + ']{20}'
-)
+AWS_ACCESS_KEY_ID_REGEX = re.compile("[" + AWS_ACCESS_KEY_ID_SYMBOLS + "]{20}")
 AWS_ACCESS_KEY_ID_MAX_ENTROPY = 3
 
-AWS_SECRET_ACCESS_KEY_SYMBOLS = string.ascii_letters + string.digits + '/+='
-AWS_SECRET_ACCESS_KEY_REGEX = re.compile(
-    '[' + AWS_SECRET_ACCESS_KEY_SYMBOLS + ']{40}'
-)
+AWS_SECRET_ACCESS_KEY_SYMBOLS = string.ascii_letters + string.digits + "/+="
+AWS_SECRET_ACCESS_KEY_REGEX = re.compile("[" + AWS_SECRET_ACCESS_KEY_SYMBOLS + "]{40}")
 AWS_SECRET_ACCESS_KEY_MAX_ENTROPY = 4.5
 
 
 def shannonEntropy(data, symbols):
     """
     Function to caclculate the Shannon entropy of some given data.
-    
+
     Source:
     http://blog.dkbza.org/2007/05/scanning-data-for-entropy-anomalies.html
-    
+
     @param data data to calculate the entropy for
     @type str
     @param symbols allowed symbols
@@ -70,14 +67,14 @@
     for x in symbols:
         p_x = float(counts[x]) / len(data)
         if p_x > 0:
-            entropy += - p_x * math.log(p_x, 2)
+            entropy += -p_x * math.log(p_x, 2)
     return entropy
 
 
 def checkHardcodedAwsKey(reportError, context, config):
     """
     Function to check for potentially hardcoded AWS passwords.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -95,9 +92,9 @@
                 "S801",
                 "L",
                 "M",
-                node.s
+                node.s,
             )
-    
+
     elif AWS_SECRET_ACCESS_KEY_REGEX.fullmatch(node.s):
         entropy = shannonEntropy(node.s, AWS_SECRET_ACCESS_KEY_SYMBOLS)
         if entropy > AWS_SECRET_ACCESS_KEY_MAX_ENTROPY:
@@ -107,5 +104,5 @@
                 "S802",
                 "M",
                 "M",
-                node.s
+                node.s,
             )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,156 +21,146 @@
 import AstUtilities
 
 _blacklists = {
-    'S301': ([
-        'pickle.loads',
-        'pickle.load',
-        'pickle.Unpickler',
-        'cPickle.loads',
-        'cPickle.load',
-        'cPickle.Unpickler',
-        'dill.loads',
-        'dill.load',
-        'dill.Unpickler',
-        'shelve.open',
-        'shelve.DbfilenameShelf'],
-        "M"),
-    'S302': ([
-        'marshal.load',
-        'marshal.loads'],
-        "M"),
-    'S303': ([
-        'hashlib.md5',
-        'hashlib.sha1',
-        'Crypto.Hash.MD2.new',
-        'Crypto.Hash.MD4.new',
-        'Crypto.Hash.MD5.new',
-        'Crypto.Hash.SHA.new',
-        'Cryptodome.Hash.MD2.new',
-        'Cryptodome.Hash.MD4.new',
-        'Cryptodome.Hash.MD5.new',
-        'Cryptodome.Hash.SHA.new',
-        'cryptography.hazmat.primitives.hashes.MD5',
-        'cryptography.hazmat.primitives.hashes.SHA1'],
-        "M"),
-    'S304': ([
-        'Crypto.Cipher.ARC2.new',
-        'Crypto.Cipher.ARC4.new',
-        'Crypto.Cipher.Blowfish.new',
-        'Crypto.Cipher.DES.new',
-        'Crypto.Cipher.XOR.new',
-        'Cryptodome.Cipher.ARC2.new',
-        'Cryptodome.Cipher.ARC4.new',
-        'Cryptodome.Cipher.Blowfish.new',
-        'Cryptodome.Cipher.DES.new',
-        'Cryptodome.Cipher.XOR.new',
-        'cryptography.hazmat.primitives.ciphers.algorithms.ARC4',
-        'cryptography.hazmat.primitives.ciphers.algorithms.Blowfish',
-        'cryptography.hazmat.primitives.ciphers.algorithms.IDEA'],
-        "H"),
-    'S305': ([
-        'cryptography.hazmat.primitives.ciphers.modes.ECB'],
-        "M"),
-    'S306': ([
-        'tempfile.mktemp'],
-        "M"),
-    'S307': ([
-        'eval'],
-        "M"),
-    'S308': ([
-        'django.utils.safestring.mark_safe'],
-        "M"),
-    'S309': ([
-        'httplib.HTTPSConnection',
-        'http.client.HTTPSConnection',
-        'six.moves.http_client.HTTPSConnection'],
-        "M"),
-    'S310': ([
-        'urllib.urlopen',
-        'urllib.request.urlopen',
-        'urllib.urlretrieve',
-        'urllib.request.urlretrieve',
-        'urllib.URLopener',
-        'urllib.request.URLopener',
-        'urllib.FancyURLopener',
-        'urllib.request.FancyURLopener',
-        'urllib2.urlopen',
-        'urllib2.Request',
-        'six.moves.urllib.request.urlopen',
-        'six.moves.urllib.request.urlretrieve',
-        'six.moves.urllib.request.URLopener',
-        'six.moves.urllib.request.FancyURLopener'],
-        ""),
-    'S311': ([
-        'random.random',
-        'random.randrange',
-        'random.randint',
-        'random.choice',
-        'random.uniform',
-        'random.triangular'],
-        "L"),
-    'S312': ([
-        'telnetlib.*'],
-        "H"),
-    'S313': ([
-        'xml.etree.cElementTree.parse',
-        'xml.etree.cElementTree.iterparse',
-        'xml.etree.cElementTree.fromstring',
-        'xml.etree.cElementTree.XMLParser'],
-        "M"),
-    'S314': ([
-        'xml.etree.ElementTree.parse',
-        'xml.etree.ElementTree.iterparse',
-        'xml.etree.ElementTree.fromstring',
-        'xml.etree.ElementTree.XMLParser'],
-        "M"),
-    'S315': ([
-        'xml.sax.expatreader.create_parser'],
-        "M"),
-    'S316': ([
-        'xml.dom.expatbuilder.parse',
-        'xml.dom.expatbuilder.parseString'],
-        "M"),
-    'S317': ([
-        'xml.sax.parse',
-        'xml.sax.parseString',
-        'xml.sax.make_parser'],
-        "M"),
-    'S318': ([
-        'xml.dom.minidom.parse',
-        'xml.dom.minidom.parseString'],
-        "M"),
-    'S319': ([
-        'xml.dom.pulldom.parse',
-        'xml.dom.pulldom.parseString'],
-        "M"),
-    'S320': ([
-        'lxml.etree.parse',
-        'lxml.etree.fromstring',
-        'lxml.etree.RestrictedElement',
-        'lxml.etree.GlobalParserTLS',
-        'lxml.etree.getDefaultParser',
-        'lxml.etree.check_docinfo'],
-        "M"),
-    'S321': ([
-        'ftplib.*'],
-        "H"),
-    'S322': ([
-        'input'],
-        "H"),
-    'S323': ([
-        'ssl._create_unverified_context'],
-        "M"),
-    'S324': ([
-        'os.tempnam',
-        'os.tmpnam'],
-        "M"),
+    "S301": (
+        [
+            "pickle.loads",
+            "pickle.load",
+            "pickle.Unpickler",
+            "cPickle.loads",
+            "cPickle.load",
+            "cPickle.Unpickler",
+            "dill.loads",
+            "dill.load",
+            "dill.Unpickler",
+            "shelve.open",
+            "shelve.DbfilenameShelf",
+        ],
+        "M",
+    ),
+    "S302": (["marshal.load", "marshal.loads"], "M"),
+    "S303": (
+        [
+            "hashlib.md5",
+            "hashlib.sha1",
+            "Crypto.Hash.MD2.new",
+            "Crypto.Hash.MD4.new",
+            "Crypto.Hash.MD5.new",
+            "Crypto.Hash.SHA.new",
+            "Cryptodome.Hash.MD2.new",
+            "Cryptodome.Hash.MD4.new",
+            "Cryptodome.Hash.MD5.new",
+            "Cryptodome.Hash.SHA.new",
+            "cryptography.hazmat.primitives.hashes.MD5",
+            "cryptography.hazmat.primitives.hashes.SHA1",
+        ],
+        "M",
+    ),
+    "S304": (
+        [
+            "Crypto.Cipher.ARC2.new",
+            "Crypto.Cipher.ARC4.new",
+            "Crypto.Cipher.Blowfish.new",
+            "Crypto.Cipher.DES.new",
+            "Crypto.Cipher.XOR.new",
+            "Cryptodome.Cipher.ARC2.new",
+            "Cryptodome.Cipher.ARC4.new",
+            "Cryptodome.Cipher.Blowfish.new",
+            "Cryptodome.Cipher.DES.new",
+            "Cryptodome.Cipher.XOR.new",
+            "cryptography.hazmat.primitives.ciphers.algorithms.ARC4",
+            "cryptography.hazmat.primitives.ciphers.algorithms.Blowfish",
+            "cryptography.hazmat.primitives.ciphers.algorithms.IDEA",
+        ],
+        "H",
+    ),
+    "S305": (["cryptography.hazmat.primitives.ciphers.modes.ECB"], "M"),
+    "S306": (["tempfile.mktemp"], "M"),
+    "S307": (["eval"], "M"),
+    "S308": (["django.utils.safestring.mark_safe"], "M"),
+    "S309": (
+        [
+            "httplib.HTTPSConnection",
+            "http.client.HTTPSConnection",
+            "six.moves.http_client.HTTPSConnection",
+        ],
+        "M",
+    ),
+    "S310": (
+        [
+            "urllib.urlopen",
+            "urllib.request.urlopen",
+            "urllib.urlretrieve",
+            "urllib.request.urlretrieve",
+            "urllib.URLopener",
+            "urllib.request.URLopener",
+            "urllib.FancyURLopener",
+            "urllib.request.FancyURLopener",
+            "urllib2.urlopen",
+            "urllib2.Request",
+            "six.moves.urllib.request.urlopen",
+            "six.moves.urllib.request.urlretrieve",
+            "six.moves.urllib.request.URLopener",
+            "six.moves.urllib.request.FancyURLopener",
+        ],
+        "",
+    ),
+    "S311": (
+        [
+            "random.random",
+            "random.randrange",
+            "random.randint",
+            "random.choice",
+            "random.uniform",
+            "random.triangular",
+        ],
+        "L",
+    ),
+    "S312": (["telnetlib.*"], "H"),
+    "S313": (
+        [
+            "xml.etree.cElementTree.parse",
+            "xml.etree.cElementTree.iterparse",
+            "xml.etree.cElementTree.fromstring",
+            "xml.etree.cElementTree.XMLParser",
+        ],
+        "M",
+    ),
+    "S314": (
+        [
+            "xml.etree.ElementTree.parse",
+            "xml.etree.ElementTree.iterparse",
+            "xml.etree.ElementTree.fromstring",
+            "xml.etree.ElementTree.XMLParser",
+        ],
+        "M",
+    ),
+    "S315": (["xml.sax.expatreader.create_parser"], "M"),
+    "S316": (["xml.dom.expatbuilder.parse", "xml.dom.expatbuilder.parseString"], "M"),
+    "S317": (["xml.sax.parse", "xml.sax.parseString", "xml.sax.make_parser"], "M"),
+    "S318": (["xml.dom.minidom.parse", "xml.dom.minidom.parseString"], "M"),
+    "S319": (["xml.dom.pulldom.parse", "xml.dom.pulldom.parseString"], "M"),
+    "S320": (
+        [
+            "lxml.etree.parse",
+            "lxml.etree.fromstring",
+            "lxml.etree.RestrictedElement",
+            "lxml.etree.GlobalParserTLS",
+            "lxml.etree.getDefaultParser",
+            "lxml.etree.check_docinfo",
+        ],
+        "M",
+    ),
+    "S321": (["ftplib.*"], "H"),
+    "S322": (["input"], "H"),
+    "S323": (["ssl._create_unverified_context"], "M"),
+    "S324": (["os.tempnam", "os.tmpnam"], "M"),
 }
 
 
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -185,7 +175,7 @@
 def checkBlacklist(reportError, context, config):
     """
     Function to check for blacklisted method calls.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -194,10 +184,10 @@
     @type dict
     """
     nodeType = context.node.__class__.__name__
-    
-    if nodeType == 'Call':
+
+    if nodeType == "Call":
         func = context.node.func
-        if isinstance(func, ast.Name) and func.id == '__import__':
+        if isinstance(func, ast.Name) and func.id == "__import__":
             if len(context.node.args):
                 if AstUtilities.isString(context.node.args[0]):
                     name = context.node.args[0].s
@@ -212,7 +202,7 @@
             # Will produce None if argument is not a literal or identifier.
             if name in ["importlib.import_module", "importlib.__import__"]:
                 name = context.callArgs[0]
-        
+
         for code in _blacklists:
             qualnames, severity = _blacklists[code]
             for qualname in qualnames:
@@ -223,5 +213,5 @@
                         code,
                         severity,
                         "H",
-                        name
+                        name,
                     )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListImports.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListImports.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,65 +16,45 @@
 #
 
 _blacklists = {
-    "S401": ([
-        'telnetlib'],
-        "H"),
-    "S402": ([
-        'ftplib'],
-        "H"),
-    "S403": ([
-        'pickle',
-        'cPickle',
-        'dill',
-        'shelve'],
-        "L"),
-    "S404": ([
-        'subprocess'],
-        "L"),
-    "S405": ([
-        'xml.etree.cElementTree',
-        'xml.etree.ElementTree'],
-        "L"),
-    "S406": ([
-        'xml.sax'],
-        "L"),
-    "S407": ([
-        'xml.dom.expatbuilder'],
-        "L"),
-    "S408": ([
-        'xml.dom.minidom'],
-        "L"),
-    "S409": ([
-        'xml.dom.pulldom'],
-        "L"),
-    "S410": ([
-        'lxml'],
-        "L"),
-    "S411": ([
-        'xmlrpclib'],
-        "H"),
-    "S412": ([
-        'wsgiref.handlers.CGIHandler',
-        'twisted.web.twcgi.CGIScript',
-        'twisted.web.twcgi.CGIDirectory'],
-        "H"),
-    "S413": ([
-        'Crypto.Cipher',
-        'Crypto.Hash',
-        'Crypto.IO',
-        'Crypto.Protocol',
-        'Crypto.PublicKey',
-        'Crypto.Random',
-        'Crypto.Signature',
-        'Crypto.Util'],
-        "H"),
+    "S401": (["telnetlib"], "H"),
+    "S402": (["ftplib"], "H"),
+    "S403": (["pickle", "cPickle", "dill", "shelve"], "L"),
+    "S404": (["subprocess"], "L"),
+    "S405": (["xml.etree.cElementTree", "xml.etree.ElementTree"], "L"),
+    "S406": (["xml.sax"], "L"),
+    "S407": (["xml.dom.expatbuilder"], "L"),
+    "S408": (["xml.dom.minidom"], "L"),
+    "S409": (["xml.dom.pulldom"], "L"),
+    "S410": (["lxml"], "L"),
+    "S411": (["xmlrpclib"], "H"),
+    "S412": (
+        [
+            "wsgiref.handlers.CGIHandler",
+            "twisted.web.twcgi.CGIScript",
+            "twisted.web.twcgi.CGIDirectory",
+        ],
+        "H",
+    ),
+    "S413": (
+        [
+            "Crypto.Cipher",
+            "Crypto.Hash",
+            "Crypto.IO",
+            "Crypto.Protocol",
+            "Crypto.PublicKey",
+            "Crypto.Random",
+            "Crypto.Signature",
+            "Crypto.Util",
+        ],
+        "H",
+    ),
 }
 
 
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -95,7 +75,7 @@
 def checkBlacklist(reportError, context, config):
     """
     Function to check for blacklisted method calls.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -105,12 +85,9 @@
     """
     nodeType = context.node.__class__.__name__
 
-    if nodeType.startswith('Import'):
+    if nodeType.startswith("Import"):
         prefix = ""
-        if (
-            nodeType == "ImportFrom" and
-            context.node.module is not None
-        ):
+        if nodeType == "ImportFrom" and context.node.module is not None:
             prefix = context.node.module + "."
 
         for code in _blacklists:
@@ -124,5 +101,5 @@
                             code,
                             severity,
                             "H",
-                            name.name
+                            name.name,
                         )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/certificateValidation.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/certificateValidation.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkNoCertificateValidation(reportError, context, config):
     """
     Function to check for switched off certificate validation.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,16 +42,16 @@
     @param config dictionary with configuration data
     @type dict
     """
-    http_verbs = ('get', 'options', 'head', 'post', 'put', 'patch', 'delete')
+    http_verbs = ("get", "options", "head", "post", "put", "patch", "delete")
     if (
-        'requests' in context.callFunctionNameQual and
-        context.callFunctionName in http_verbs and
-        context.checkCallArgValue('verify', 'False')
+        "requests" in context.callFunctionNameQual
+        and context.callFunctionName in http_verbs
+        and context.checkCallArgValue("verify", "False")
     ):
         reportError(
-            context.getLinenoForCallArg('verify') - 1,
-            context.getOffsetForCallArg('verify'),
+            context.getLinenoForCallArg("verify") - 1,
+            context.getOffsetForCallArg("verify"),
             "S501",
             "H",
-            "H"
+            "H",
         )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoSqlInjection.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoSqlInjection.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,7 +23,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -39,7 +39,7 @@
 def keywords2dict(keywords):
     """
     Function to extract keywords arguments into a dictionary.
-    
+
     @param keywords list of keyword nodes
     @type list of ast.keyword
     @return dictionary with keyword name and value
@@ -55,7 +55,7 @@
 def checkDjangoExtraUsed(reportError, context, config):
     """
     Function to check for potential SQL injection on extra function.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -63,24 +63,24 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if context.callFunctionName == 'extra':
+    if context.callFunctionName == "extra":
         kwargs = keywords2dict(context.node.keywords)
         args = context.node.args
         if args:
             if len(args) >= 1:
-                kwargs['select'] = args[0]
+                kwargs["select"] = args[0]
             if len(args) >= 2:
-                kwargs['where'] = args[1]
+                kwargs["where"] = args[1]
             if len(args) >= 3:
-                kwargs['params'] = args[2]
+                kwargs["params"] = args[2]
             if len(args) >= 4:
-                kwargs['tables'] = args[3]
+                kwargs["tables"] = args[3]
             if len(args) >= 5:
-                kwargs['order_by'] = args[4]
+                kwargs["order_by"] = args[4]
             if len(args) >= 6:
-                kwargs['select_params'] = args[5]
+                kwargs["select_params"] = args[5]
         insecure = False
-        for key in ['where', 'tables']:
+        for key in ["where", "tables"]:
             if key in kwargs:
                 if isinstance(kwargs[key], ast.List):
                     for val in kwargs[key].elts:
@@ -90,34 +90,30 @@
                 else:
                     insecure = True
                     break
-        if not insecure and 'select' in kwargs:
-            if isinstance(kwargs['select'], ast.Dict):
-                for k in kwargs['select'].keys:
+        if not insecure and "select" in kwargs:
+            if isinstance(kwargs["select"], ast.Dict):
+                for k in kwargs["select"].keys:
                     if not AstUtilities.isString(k):
                         insecure = True
                         break
                 if not insecure:
-                    for v in kwargs['select'].values:
+                    for v in kwargs["select"].values:
                         if not AstUtilities.isString(v):
                             insecure = True
                             break
             else:
                 insecure = True
-        
+
         if insecure:
             reportError(
-                context.node.lineno - 1,
-                context.node.col_offset,
-                "S610",
-                "M",
-                "M"
+                context.node.lineno - 1, context.node.col_offset, "S610", "M", "M"
             )
 
 
 def checkDjangoRawSqlUsed(reportError, context, config):
     """
     Function to check for potential SQL injection on RawSQL function.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -126,15 +122,11 @@
     @type dict
     """
     if (
-        context.isModuleImportedLike('django.db.models') and
-        context.callFunctionName == 'RawSQL'
+        context.isModuleImportedLike("django.db.models")
+        and context.callFunctionName == "RawSQL"
     ):
         sql = context.node.args[0]
         if not AstUtilities.isString(sql):
             reportError(
-                context.node.lineno - 1,
-                context.node.col_offset,
-                "S611",
-                "M",
-                "M"
+                context.node.lineno - 1, context.node.col_offset, "S611", "M", "M"
             )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,7 +23,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -38,7 +38,7 @@
 def checkDjangoXssVulnerability(reportError, context, config):
     """
     Function to check for potential XSS vulnerability.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -46,13 +46,13 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if context.isModuleImportedLike('django.utils.safestring'):
+    if context.isModuleImportedLike("django.utils.safestring"):
         affectedFunctions = [
-            'mark_safe',
-            'SafeText',
-            'SafeUnicode',
-            'SafeString',
-            'SafeBytes'
+            "mark_safe",
+            "SafeText",
+            "SafeUnicode",
+            "SafeString",
+            "SafeBytes",
         ]
         if context.callFunctionName in affectedFunctions:
             xss = context.node.args[0]
@@ -63,29 +63,29 @@
 def checkPotentialRisk(reportError, node):
     """
     Function to check a given node for a potential XSS vulnerability.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param node node to be checked
     @type ast.Call
     """
     xssVar = node.args[0]
-    
+
     secure = False
-    
+
     if isinstance(xssVar, ast.Name):
         # Check if the var are secure
         parent = node._securityParent
         while not isinstance(parent, (ast.Module, ast.FunctionDef)):
             parent = parent._securityParent
-        
+
         isParam = False
         if isinstance(parent, ast.FunctionDef):
             for name in parent.args.args:
                 if name.arg == xssVar.id:
                     isParam = True
                     break
-        
+
         if not isParam:
             secure = evaluateVar(xssVar, parent, node.lineno)
     elif isinstance(xssVar, ast.Call):
@@ -102,25 +102,20 @@
                 parent = parent._securityParent
             newCall = transform2call(xssVar)
             secure = evaluateCall(newCall, parent)
-    
+
     if not secure:
-        reportError(
-            node.lineno - 1,
-            node.col_offset,
-            "S703",
-            "M",
-            "H"
-        )
+        reportError(node.lineno - 1, node.col_offset, "S703", "M", "H")
 
 
 class DeepAssignation:
     """
     Class to perform a deep analysis of an assign.
     """
+
     def __init__(self, varName, ignoreNodes=None):
         """
         Constructor
-        
+
         @param varName name of the variable
         @type str
         @param ignoreNodes list of nodes to ignore
@@ -128,11 +123,11 @@
         """
         self.__varName = varName
         self.__ignoreNodes = ignoreNodes
-    
+
     def isAssignedIn(self, items):
         """
         Public method to check, if the variable is assigned to.
-        
+
         @param items list of nodes to check against
         @type list of ast.AST
         @return list of nodes assigned
@@ -146,13 +141,13 @@
                     assigned.extend(newAssigned)
                 else:
                     assigned.append(newAssigned)
-        
+
         return assigned
-    
+
     def isAssigned(self, node):
         """
         Public method to check assignment against a given node.
-        
+
         @param node node to check against
         @type ast.AST
         @return flag indicating an assignement
@@ -160,31 +155,26 @@
         """
         assigned = False
         if (
-            self.__ignoreNodes and
-            isinstance(self.__ignoreNodes, (list, tuple, object)) and
-            isinstance(node, self.__ignoreNodes)
+            self.__ignoreNodes
+            and isinstance(self.__ignoreNodes, (list, tuple, object))
+            and isinstance(node, self.__ignoreNodes)
         ):
             return assigned
-        
+
         if isinstance(node, ast.Expr):
             assigned = self.isAssigned(node.value)
         elif isinstance(node, ast.FunctionDef):
             for name in node.args.args:
-                if (
-                    isinstance(name, ast.Name) and
-                    name.id == self.var_name.id
-                ):
+                if isinstance(name, ast.Name) and name.id == self.var_name.id:
                     # If is param the assignations are not affected
                     return assigned
-            
+
             assigned = self.isAssignedIn(node.body)
         elif isinstance(node, ast.With):
             for withitem in node.items:
-                varId = getattr(withitem.optional_vars, 'id', None)
+                varId = getattr(withitem.optional_vars, "id", None)
                 assigned = (
-                    node
-                    if varId == self.__varName.id else
-                    self.isAssignedIn(node.body)
+                    node if varId == self.__varName.id else self.isAssignedIn(node.body)
                 )
         elif isinstance(node, ast.Try):
             assigned = []
@@ -200,9 +190,9 @@
             assigned.extend(self.isAssignedIn(node.body))
             assigned.extend(self.isAssignedIn(node.orelse))
         elif (
-            isinstance(node, ast.AugAssign) and
-            isinstance(node.target, ast.Name) and
-            node.target.id == self.__varName.id
+            isinstance(node, ast.AugAssign)
+            and isinstance(node.target, ast.Name)
+            and node.target.id == self.__varName.id
         ):
             assigned = node.value
         elif isinstance(node, ast.Assign) and node.targets:
@@ -215,14 +205,14 @@
                     if name.id == self.__varName.id:
                         assigned = node.value.elts[pos]
                         break
-        
+
         return assigned
 
 
 def evaluateVar(xssVar, parent, until, ignoreNodes=None):
     """
     Function to evaluate a variable node for potential XSS vulnerability.
-    
+
     @param xssVar variable node to be checked
     @type ast.Name
     @param parent parent node
@@ -236,12 +226,11 @@
     """
     secure = False
     if isinstance(xssVar, ast.Name):
-        if (
-            isinstance(parent, ast.FunctionDef) and
-            any(name.arg == xssVar.id for name in parent.args.args)
+        if isinstance(parent, ast.FunctionDef) and any(
+            name.arg == xssVar.id for name in parent.args.args
         ):
             return False  # Params are not secure
-        
+
         analyser = DeepAssignation(xssVar, ignoreNodes)
         for node in parent.body:
             if node.lineno >= until:
@@ -251,8 +240,7 @@
                 if AstUtilities.isString(to):
                     secure = True
                 elif isinstance(to, ast.Name):
-                    secure = evaluateVar(
-                        to, parent, to.lineno, ignoreNodes)
+                    secure = evaluateVar(to, parent, to.lineno, ignoreNodes)
                 elif isinstance(to, ast.Call):
                     secure = evaluateCall(to, parent, ignoreNodes)
                 elif isinstance(to, (list, tuple)):
@@ -261,8 +249,7 @@
                         if AstUtilities.isString(someTo):
                             numSecure += 1
                         elif isinstance(someTo, ast.Name):
-                            if evaluateVar(someTo, parent,
-                                           node.lineno, ignoreNodes):
+                            if evaluateVar(someTo, parent, node.lineno, ignoreNodes):
                                 numSecure += 1
                             else:
                                 break
@@ -276,14 +263,14 @@
                 else:
                     secure = False
                     break
-    
+
     return secure
 
 
 def evaluateCall(call, parent, ignoreNodes=None):
     """
     Function to evaluate a call node for potential XSS vulnerability.
-    
+
     @param call call node to be checked
     @type ast.Call
     @param parent parent node
@@ -295,20 +282,20 @@
     """
     secure = False
     evaluate = False
-    
+
     if (
-        isinstance(call, ast.Call) and
-        isinstance(call.func, ast.Attribute) and
-        AstUtilities.isString(call.func.value) and
-        call.func.attr == 'format'
+        isinstance(call, ast.Call)
+        and isinstance(call.func, ast.Attribute)
+        and AstUtilities.isString(call.func.value)
+        and call.func.attr == "format"
     ):
         evaluate = True
         if call.keywords:
             evaluate = False
-    
+
     if evaluate:
         args = list(call.args)
-        
+
         numSecure = 0
         for arg in args:
             if AstUtilities.isString(arg):
@@ -323,23 +310,22 @@
                     numSecure += 1
                 else:
                     break
-            elif (
-                isinstance(arg, ast.Starred) and
-                isinstance(arg.value, (ast.List, ast.Tuple))
+            elif isinstance(arg, ast.Starred) and isinstance(
+                arg.value, (ast.List, ast.Tuple)
             ):
                 args.extend(arg.value.elts)
                 numSecure += 1
             else:
                 break
         secure = numSecure == len(args)
-    
+
     return secure
 
 
 def transform2call(var):
     """
     Function to transform a variable node to a call node.
-    
+
     @param var variable node
     @type ast.BinOp
     @return call node
@@ -356,12 +342,12 @@
             newCall.lineno = var.lineno
             newCall.func = ast.Attribute()
             newCall.func.value = var.left
-            newCall.func.attr = 'format'
+            newCall.func.attr = "format"
             if isinstance(var.right, ast.Tuple):
                 newCall.args = var.right.elts
             else:
                 newCall.args = [var.right]
-            
+
             return newCall
-    
+
     return None
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkExecUsed(reportError, context, config):
     """
     Function to check for the use of 'exec'.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,11 +42,5 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if context.callFunctionNameQual == 'exec':
-        reportError(
-            context.node.lineno - 1,
-            context.node.col_offset,
-            "S102",
-            "M",
-            "H"
-        )
+    if context.callFunctionNameQual == "exec":
+        reportError(context.node.lineno - 1, context.node.col_offset, "S102", "M", "H")
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/flaskDebug.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/flaskDebug.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkFlaskDebug(reportError, context, config):
     """
     Function to check for a flask app being run with debug.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -43,14 +43,8 @@
     @type dict
     """
     if (
-        context.isModuleImportedLike('flask') and
-        context.callFunctionNameQual.endswith('.run') and
-        context.checkCallArgValue('debug', 'True')
+        context.isModuleImportedLike("flask")
+        and context.callFunctionNameQual.endswith(".run")
+        and context.checkCallArgValue("debug", "True")
     ):
-        reportError(
-            context.node.lineno - 1,
-            context.node.col_offset,
-            "S201",
-            "L",
-            "M"
-        )
+        reportError(context.node.lineno - 1, context.node.col_offset, "S201", "L", "M")
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkBindAllInterfaces(reportError, context, config):
     """
     Function to check for binding to all interfaces.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,7 +42,7 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if context.stringVal == '0.0.0.0':          # secok
+    if context.stringVal == "0.0.0.0":  # secok
         reportError(
             context.node.lineno - 1,
             context.node.col_offset,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalFilePermissions.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalFilePermissions.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,7 +36,7 @@
 def checkFilePermissions(reportError, context, config):
     """
     Function to check for setting too permissive file permissions.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -44,27 +44,24 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if (
-        'chmod' in context.callFunctionName and
-        context.callArgsCount == 2
-    ):
+    if "chmod" in context.callFunctionName and context.callArgsCount == 2:
         mode = context.getCallArgAtPosition(1)
-        
+
         if (
-            mode is not None and
-            isinstance(mode, int) and
-            (mode & stat.S_IWOTH or mode & stat.S_IXGRP)
+            mode is not None
+            and isinstance(mode, int)
+            and (mode & stat.S_IWOTH or mode & stat.S_IXGRP)
         ):
             # world writable is an HIGH, group executable is a MEDIUM
             if mode & stat.S_IWOTH:
                 severity = "H"
             else:
                 severity = "M"
-            
+
             filename = context.getCallArgAtPosition(0)
             if filename is None:
-                filename = 'NOT PARSED'
-            
+                filename = "NOT PARSED"
+
             reportError(
                 context.node.lineno - 1,
                 context.node.col_offset,
@@ -72,5 +69,5 @@
                 severity,
                 "H",
                 oct(mode),
-                filename
+                filename,
             )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,16 +21,13 @@
 import AstUtilities
 
 RE_WORDS = "(pas+wo?r?d|pass(phrase)?|pwd|token|secrete?|ken+wort|geheim)"
-RE_CANDIDATES = re.compile(
-    '(^{0}$|_{0}_|^{0}_|_{0}$)'.format(RE_WORDS),
-    re.IGNORECASE
-)
+RE_CANDIDATES = re.compile("(^{0}$|_{0}_|^{0}_|_{0}$)".format(RE_WORDS), re.IGNORECASE)
 
 
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -51,7 +48,7 @@
 def checkHardcodedPasswordAsString(reportError, context, config):
     """
     Function to check for use of hardcoded password strings.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -70,19 +67,30 @@
                     "S105",
                     "L",
                     "M",
-                    node.s
+                    node.s,
                 )
-    
-    elif (
-        isinstance(node._securityParent, ast.Index) and
-        RE_CANDIDATES.search(node.s)
-    ):
+
+    elif isinstance(node._securityParent, ast.Index) and RE_CANDIDATES.search(node.s):
         # looks for "dict[candidate]='some_string'"
         # assign -> subscript -> index -> string
         assign = node._securityParent._securityParent._securityParent
+        if isinstance(assign, ast.Assign) and AstUtilities.isString(assign.value):
+            reportError(
+                context.node.lineno - 1,
+                context.node.col_offset,
+                "S105",
+                "L",
+                "M",
+                assign.value.s,
+            )
+
+    elif isinstance(node._securityParent, ast.Compare):
+        # looks for "candidate == 'some_string'"
+        comp = node._securityParent
         if (
-            isinstance(assign, ast.Assign) and
-            AstUtilities.isString(assign.value)
+            isinstance(comp.left, ast.Name)
+            and RE_CANDIDATES.search(comp.left.id)
+            and AstUtilities.isString(comp.comparators[0])
         ):
             reportError(
                 context.node.lineno - 1,
@@ -90,31 +98,14 @@
                 "S105",
                 "L",
                 "M",
-                assign.value.s
-            )
-    
-    elif isinstance(node._securityParent, ast.Compare):
-        # looks for "candidate == 'some_string'"
-        comp = node._securityParent
-        if (
-            isinstance(comp.left, ast.Name) and
-            RE_CANDIDATES.search(comp.left.id) and
-            AstUtilities.isString(comp.comparators[0])
-        ):
-            reportError(
-                context.node.lineno - 1,
-                context.node.col_offset,
-                "S105",
-                "L",
-                "M",
-                comp.comparators[0].s
+                comp.comparators[0].s,
             )
 
 
 def checkHardcodedPasswordAsFunctionArg(reportError, context, config):
     """
     Function to check for use of hard-coded password function arguments.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -131,14 +122,14 @@
                 "S106",
                 "L",
                 "M",
-                kw.value.s
+                kw.value.s,
             )
 
 
 def checkHardcodedPasswordAsDefault(reportError, context, config):
     """
     Function to check for use of hard-coded password argument defaults.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -147,17 +138,17 @@
     @type dict
     """
     # looks for "def function(candidate='some_string')"
-    
+
     # this pads the list of default values with "None" if nothing is given
-    defs = [None] * (len(context.node.args.args) -
-                     len(context.node.args.defaults))
+    defs = [None] * (len(context.node.args.args) - len(context.node.args.defaults))
     defs.extend(context.node.args.defaults)
-    
+
     # go through all (param, value)s and look for candidates
     for key, val in zip(context.node.args.args, defs):
         if (
-            isinstance(key, (ast.Name, ast.arg)) and
-            AstUtilities.isString(val) and RE_CANDIDATES.search(key.arg)
+            isinstance(key, (ast.Name, ast.arg))
+            and AstUtilities.isString(val)
+            and RE_CANDIDATES.search(key.arg)
         ):
             reportError(
                 context.node.lineno - 1,
@@ -165,5 +156,5 @@
                 "S107",
                 "L",
                 "M",
-                val.s
+                val.s,
             )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedTmp.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedTmp.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,7 @@
 # Original Copyright 2014 Hewlett-Packard Development Company, L.P.
 #
 # SPDX-License-Identifier: Apache-2.0
-#...r\Security\Checks\generalHardcodedTmp.py
+# ...r\Security\Checks\generalHardcodedTmp.py
 
 from Security.SecurityDefaults import SecurityDefaults
 
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,7 +36,7 @@
 def checkHardcodedTmpDirectory(reportError, context, config):
     """
     Function to check for insecure usage of tmp file/directory.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -46,10 +46,10 @@
     """
     tmpDirs = (
         config["hardcoded_tmp_directories"]
-        if config and "hardcoded_tmp_directories" in config else
-        SecurityDefaults["hardcoded_tmp_directories"]
+        if config and "hardcoded_tmp_directories" in config
+        else SecurityDefaults["hardcoded_tmp_directories"]
     )
-    
+
     if any(context.stringVal.startswith(s) for s in tmpDirs):
         reportError(
             context.node.lineno - 1,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionParamiko.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionParamiko.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkParamikoCalls(reportError, context, config):
     """
     Function to check for shell injection within Paramiko.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,11 +42,10 @@
     @param config dictionary with configuration data
     @type dict
     """
-    for module in ['paramiko']:
-        if (
-            context.isModuleImportedLike(module) and
-            context.callFunctionName in ['exec_command']
-        ):
+    for module in ["paramiko"]:
+        if context.isModuleImportedLike(module) and context.callFunctionName in [
+            "exec_command"
+        ]:
             reportError(
                 context.node.lineno - 1,
                 context.node.col_offset,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,13 +24,13 @@
 
 # This regex starts with a windows drive letter (eg C:)
 # or one of our path delimeter characters (/, \, .)
-fullPathMatchRe = re.compile(r'^(?:[A-Za-z](?=\:)|[\\\/\.])')
+fullPathMatchRe = re.compile(r"^(?:[A-Za-z](?=\:)|[\\\/\.])")
 
 
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -50,7 +50,7 @@
 def _evaluateShellCall(context):
     """
     Function to determine the severity of a shell call.
-    
+
     @param context context to be inspected
     @type SecurityContext
     @return severity level (L, M or H)
@@ -67,7 +67,7 @@
 def hasShell(context):
     """
     Function to check, if the node of the context contains the shell keyword.
-    
+
     @param context context to be inspected
     @type SecurityContext
     @return tuple containing a flag indicating the presence of the 'shell'
@@ -77,10 +77,10 @@
     keywords = context.node.keywords
     result = False
     shell = False
-    if 'shell' in context.callKeywords:
+    if "shell" in context.callKeywords:
         shell = True
         for key in keywords:
-            if key.arg == 'shell':
+            if key.arg == "shell":
                 val = key.value
                 if AstUtilities.isNumber(val):
                     result = bool(val.n)
@@ -88,20 +88,20 @@
                     result = bool(val.elts)
                 elif isinstance(val, ast.Dict):
                     result = bool(val.keys)
-                elif isinstance(val, ast.Name) and val.id in ['False', 'None']:
+                elif isinstance(val, ast.Name) and val.id in ["False", "None"]:
                     result = False
                 elif AstUtilities.isNameConstant(val):
                     result = val.value
                 else:
                     result = True
-    
+
     return shell, result
 
 
 def checkSubprocessPopenWithShell(reportError, context, config):
     """
     Function to check for use of popen with shell equals true.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -111,26 +111,26 @@
     """
     functionNames = (
         config["shell_injection_subprocess"]
-        if config and "shell_injection_subprocess" in config else
-        SecurityDefaults["shell_injection_subprocess"]
+        if config and "shell_injection_subprocess" in config
+        else SecurityDefaults["shell_injection_subprocess"]
     )
-    
+
     if context.callFunctionNameQual in functionNames:
         shell, shellValue = hasShell(context)
         if shell and shellValue and len(context.callArgs) > 0:
             sev = _evaluateShellCall(context)
             if sev == "L":
                 reportError(
-                    context.getLinenoForCallArg('shell') - 1,
-                    context.getOffsetForCallArg('shell'),
+                    context.getLinenoForCallArg("shell") - 1,
+                    context.getOffsetForCallArg("shell"),
                     "S602.L",
                     sev,
                     "H",
                 )
             else:
                 reportError(
-                    context.getLinenoForCallArg('shell') - 1,
-                    context.getOffsetForCallArg('shell'),
+                    context.getLinenoForCallArg("shell") - 1,
+                    context.getOffsetForCallArg("shell"),
                     "S602.H",
                     sev,
                     "H",
@@ -140,7 +140,7 @@
 def checkSubprocessPopenWithoutShell(reportError, context, config):
     """
     Function to check for use of popen without shell equals true.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -150,14 +150,11 @@
     """
     functionNames = (
         config["shell_injection_subprocess"]
-        if config and "shell_injection_subprocess" in config else
-        SecurityDefaults["shell_injection_subprocess"]
+        if config and "shell_injection_subprocess" in config
+        else SecurityDefaults["shell_injection_subprocess"]
     )
-    
-    if (
-        context.callFunctionNameQual in functionNames and
-        not hasShell(context)[0]
-    ):
+
+    if context.callFunctionNameQual in functionNames and not hasShell(context)[0]:
         reportError(
             context.node.lineno - 1,
             context.node.col_offset,
@@ -170,7 +167,7 @@
 def checkOtherFunctionWithShell(reportError, context, config):
     """
     Function to check for any function with shell equals true.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -180,16 +177,16 @@
     """
     functionNames = (
         config["shell_injection_subprocess"]
-        if config and "shell_injection_subprocess" in config else
-        SecurityDefaults["shell_injection_subprocess"]
+        if config and "shell_injection_subprocess" in config
+        else SecurityDefaults["shell_injection_subprocess"]
     )
-    
+
     if context.callFunctionNameQual not in functionNames:
         shell, shellValue = hasShell(context)
         if shell and shellValue:
             reportError(
-                context.getLinenoForCallArg('shell') - 1,
-                context.getOffsetForCallArg('shell'),
+                context.getLinenoForCallArg("shell") - 1,
+                context.getOffsetForCallArg("shell"),
                 "S604",
                 "M",
                 "L",
@@ -199,7 +196,7 @@
 def checkStartProcessWithShell(reportError, context, config):
     """
     Function to check for starting a process with a shell.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -209,14 +206,11 @@
     """
     functionNames = (
         config["shell_injection_shell"]
-        if config and "shell_injection_shell" in config else
-        SecurityDefaults["shell_injection_shell"]
+        if config and "shell_injection_shell" in config
+        else SecurityDefaults["shell_injection_shell"]
     )
-    
-    if (
-        context.callFunctionNameQual in functionNames and
-        len(context.callArgs) > 0
-    ):
+
+    if context.callFunctionNameQual in functionNames and len(context.callArgs) > 0:
         sev = _evaluateShellCall(context)
         if sev == "L":
             reportError(
@@ -239,7 +233,7 @@
 def checkStartProcessWithNoShell(reportError, context, config):
     """
     Function to check for starting a process with no shell.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -249,10 +243,10 @@
     """
     functionNames = (
         config["shell_injection_noshell"]
-        if config and "shell_injection_noshell" in config else
-        SecurityDefaults["shell_injection_noshell"]
+        if config and "shell_injection_noshell" in config
+        else SecurityDefaults["shell_injection_noshell"]
     )
-    
+
     if context.callFunctionNameQual in functionNames:
         reportError(
             context.node.lineno - 1,
@@ -266,7 +260,7 @@
 def checkStartProcessWithPartialPath(reportError, context, config):
     """
     Function to check for starting a process with no shell.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -276,35 +270,29 @@
     """
     functionNames = (
         config["shell_injection_subprocess"]
-        if config and "shell_injection_subprocess" in config else
-        SecurityDefaults["shell_injection_subprocess"]
+        if config and "shell_injection_subprocess" in config
+        else SecurityDefaults["shell_injection_subprocess"]
     )
-    
+
     if config and "shell_injection_shell" in config:
         functionNames += config["shell_injection_shell"]
     else:
         functionNames += SecurityDefaults["shell_injection_shell"]
-    
+
     if config and "shell_injection_noshell" in config:
         functionNames += config["shell_injection_noshell"]
     else:
         functionNames += SecurityDefaults["shell_injection_noshell"]
-    
-    if (
-        len(context.callArgs) and
-        context.callFunctionNameQual in functionNames
-    ):
+
+    if len(context.callArgs) and context.callFunctionNameQual in functionNames:
         node = context.node.args[0]
-        
+
         # some calls take an arg list, check the first part
         if isinstance(node, ast.List):
             node = node.elts[0]
-        
+
         # make sure the param is a string literal and not a var name
-        if (
-            AstUtilities.isString(node) and
-            not fullPathMatchRe.match(node.s)
-        ):
+        if AstUtilities.isString(node) and not fullPathMatchRe.match(node.s):
             reportError(
                 context.node.lineno - 1,
                 context.node.col_offset,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionSql.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionSql.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,7 +24,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -37,10 +37,10 @@
 
 
 SIMPLE_SQL_RE = re.compile(
-    r'(select\s.*from\s|'
-    r'delete\s+from\s|'
-    r'insert\s+into\s.*values\s|'
-    r'update\s.*set\s)',
+    r"(select\s.*from\s|"
+    r"delete\s+from\s|"
+    r"insert\s+into\s.*values\s|"
+    r"update\s.*set\s)",
     re.IGNORECASE | re.DOTALL,
 )
 
@@ -48,7 +48,7 @@
 def _checkString(data):
     """
     Function to check a given string against the list of search patterns.
-    
+
     @param data string data to be checked
     @type str
     @return flag indicating a match
@@ -60,7 +60,7 @@
 def _evaluateAst(node):
     """
     Function to analyze the given ast node.
-    
+
     @param node ast node to be analyzed
     @type ast.Str
     @return tuple containing a flag indicating an execute call and
@@ -68,28 +68,25 @@
     @rtype tuple of (bool, str)
     """
     wrapper = None
-    statement = ''
+    statement = ""
 
     if isinstance(node._securityParent, ast.BinOp):
         out = SecurityUtils.concatString(node, node._securityParent)
         wrapper = out[0]._securityParent
         statement = out[1]
     elif (
-        isinstance(node._securityParent, ast.Attribute) and
-        node._securityParent.attr == 'format'
+        isinstance(node._securityParent, ast.Attribute)
+        and node._securityParent.attr == "format"
     ):
         statement = node.s
         # Hierarchy for "".format() is Wrapper -> Call -> Attribute -> Str
         wrapper = node._securityParent._securityParent._securityParent
-    elif (
-        hasattr(ast, 'JoinedStr') and
-        isinstance(node._securityParent, ast.JoinedStr)
-    ):
+    elif hasattr(ast, "JoinedStr") and isinstance(node._securityParent, ast.JoinedStr):
         statement = node.s
         wrapper = node._securityParent._securityParent
-    
+
     if isinstance(wrapper, ast.Call):  # wrapped in "execute" call?
-        names = ['execute', 'executemany']
+        names = ["execute", "executemany"]
         name = SecurityUtils.getCalledName(wrapper)
         return (name in names, statement)
     else:
@@ -99,7 +96,7 @@
 def checkHardcodedSqlExpressions(reportError, context, config):
     """
     Function to check for SQL injection.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionWildcard.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionWildcard.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,7 +36,7 @@
 def checkLinuxCommandsWildcardInjection(reportError, context, config):
     """
     Function to check for use of wildcard injection.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -46,41 +46,39 @@
     """
     subProcessFunctionNames = (
         config["shell_injection_subprocess"]
-        if config and "shell_injection_subprocess" in config else
-        SecurityDefaults["shell_injection_subprocess"]
+        if config and "shell_injection_subprocess" in config
+        else SecurityDefaults["shell_injection_subprocess"]
     )
-    
+
     shellFunctionNames = (
         config["shell_injection_shell"]
-        if config and "shell_injection_shell" in config else
-        SecurityDefaults["shell_injection_shell"]
+        if config and "shell_injection_shell" in config
+        else SecurityDefaults["shell_injection_shell"]
     )
-    
-    vulnerableFunctions = ['chown', 'chmod', 'tar', 'rsync']
+
+    vulnerableFunctions = ["chown", "chmod", "tar", "rsync"]
     if (
-        (context.callFunctionNameQual in shellFunctionNames or
-         (context.callFunctionNameQual in subProcessFunctionNames and
-          context.checkCallArgValue('shell', 'True'))) and
-        context.callArgsCount >= 1
-    ):
+        context.callFunctionNameQual in shellFunctionNames
+        or (
+            context.callFunctionNameQual in subProcessFunctionNames
+            and context.checkCallArgValue("shell", "True")
+        )
+    ) and context.callArgsCount >= 1:
         callArgument = context.getCallArgAtPosition(0)
-        argumentString = ''
+        argumentString = ""
         if isinstance(callArgument, list):
             for li in callArgument:
-                argumentString += ' {0}'.format(li)
+                argumentString += " {0}".format(li)
         elif isinstance(callArgument, str):
             argumentString = callArgument
-        
-        if argumentString != '':
+
+        if argumentString != "":
             for vulnerableFunction in vulnerableFunctions:
-                if (
-                    vulnerableFunction in argumentString and
-                    '*' in argumentString
-                ):
-                    lineNo = context.getLinenoForCallArg('shell')
+                if vulnerableFunction in argumentString and "*" in argumentString:
+                    lineNo = context.getLinenoForCallArg("shell")
                     if lineNo < 1:
                         lineNo = context.node.lineno
-                    offset = context.getOffsetForCallArg('shell')
+                    offset = context.getOffsetForCallArg("shell")
                     if offset < 0:
                         offset = context.node.col_offset
                     reportError(
@@ -89,5 +87,5 @@
                         "S609",
                         "H",
                         "M",
-                        context.callFunctionNameQual
+                        context.callFunctionNameQual,
                     )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureHashlibNew.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureHashlibNew.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -38,7 +38,7 @@
     """
     Function to check for use of insecure md4, md5, or sha1 hash functions
     in hashlib.new().
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -48,26 +48,23 @@
     """
     insecureHashes = (
         [h.lower() for h in config["insecure_hashes"]]
-        if config and "insecure_hashes" in config else
-        SecurityDefaults["insecure_hashes"]
+        if config and "insecure_hashes" in config
+        else SecurityDefaults["insecure_hashes"]
     )
-    
+
     if isinstance(context.callFunctionNameQual, str):
-        qualnameList = context.callFunctionNameQual.split('.')
+        qualnameList = context.callFunctionNameQual.split(".")
         func = qualnameList[-1]
-        if 'hashlib' in qualnameList and func == 'new':
+        if "hashlib" in qualnameList and func == "new":
             args = context.callArgs
             keywords = context.callKeywords
-            name = args[0] if args else keywords['name']
-            if (
-                isinstance(name, str) and
-                name.lower() in insecureHashes
-            ):
+            name = args[0] if args else keywords["name"]
+            if isinstance(name, str) and name.lower() in insecureHashes:
                 reportError(
                     context.node.lineno - 1,
                     context.node.col_offset,
                     "S331",
                     "M",
                     "H",
-                    name.upper()
+                    name.upper(),
                 )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureSslTls.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureSslTls.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -40,7 +40,7 @@
 def checkInsecureSslProtocolVersion(reportError, context, config):
     """
     Function to check for use of insecure SSL protocol version.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -50,48 +50,47 @@
     """
     insecureProtocolVersions = (
         config["insecure_ssl_protocol_versions"]
-        if config and "insecure_ssl_protocol_versions" in config else
-        SecurityDefaults["insecure_ssl_protocol_versions"]
+        if config and "insecure_ssl_protocol_versions" in config
+        else SecurityDefaults["insecure_ssl_protocol_versions"]
     )
-    
-    if context.callFunctionNameQual == 'ssl.wrap_socket':
-        if context.checkCallArgValue('ssl_version', insecureProtocolVersions):
+
+    if context.callFunctionNameQual == "ssl.wrap_socket":
+        if context.checkCallArgValue("ssl_version", insecureProtocolVersions):
             reportError(
-                context.getLinenoForCallArg('ssl_version') - 1,
-                context.getOffsetForCallArg('ssl_version'),
+                context.getLinenoForCallArg("ssl_version") - 1,
+                context.getOffsetForCallArg("ssl_version"),
                 "S502.1",
                 "H",
                 "H",
             )
-    
-    elif context.callFunctionNameQual == 'pyOpenSSL.SSL.Context':
-        if context.checkCallArgValue('method', insecureProtocolVersions):
+
+    elif context.callFunctionNameQual == "pyOpenSSL.SSL.Context":
+        if context.checkCallArgValue("method", insecureProtocolVersions):
             reportError(
-                context.getLinenoForCallArg('method') - 1,
-                context.getOffsetForCallArg('method'),
+                context.getLinenoForCallArg("method") - 1,
+                context.getOffsetForCallArg("method"),
                 "S502.2",
                 "H",
                 "H",
             )
-    
+
     elif (
-        context.callFunctionNameQual != 'ssl.wrap_socket' and
-        context.callFunctionNameQual != 'pyOpenSSL.SSL.Context'
+        context.callFunctionNameQual != "ssl.wrap_socket"
+        and context.callFunctionNameQual != "pyOpenSSL.SSL.Context"
     ):
-        if context.checkCallArgValue('method', insecureProtocolVersions):
+        if context.checkCallArgValue("method", insecureProtocolVersions):
             reportError(
-                context.getLinenoForCallArg('method') - 1,
-                context.getOffsetForCallArg('method'),
+                context.getLinenoForCallArg("method") - 1,
+                context.getOffsetForCallArg("method"),
                 "S502.3",
                 "H",
                 "H",
             )
-        
-        elif context.checkCallArgValue('ssl_version',
-                                       insecureProtocolVersions):
+
+        elif context.checkCallArgValue("ssl_version", insecureProtocolVersions):
             reportError(
-                context.getLinenoForCallArg('ssl_version') - 1,
-                context.getOffsetForCallArg('ssl_version'),
+                context.getLinenoForCallArg("ssl_version") - 1,
+                context.getOffsetForCallArg("ssl_version"),
                 "S502.3",
                 "H",
                 "H",
@@ -101,7 +100,7 @@
 def checkInsecureSslDefaults(reportError, context, config):
     """
     Function to check for SSL use with insecure defaults specified.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -111,10 +110,10 @@
     """
     insecureProtocolVersions = (
         config["insecure_ssl_protocol_versions"]
-        if config and "insecure_ssl_protocol_versions" in config else
-        SecurityDefaults["insecure_ssl_protocol_versions"]
+        if config and "insecure_ssl_protocol_versions" in config
+        else SecurityDefaults["insecure_ssl_protocol_versions"]
     )
-    
+
     for default in context.functionDefDefaultsQual:
         val = default.split(".")[-1]
         if val in insecureProtocolVersions:
@@ -130,7 +129,7 @@
 def checkSslWithoutVersion(reportError, context, config):
     """
     Function to check for SSL use with no version specified.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -139,8 +138,8 @@
     @type dict
     """
     if (
-        context.callFunctionNameQual == 'ssl.wrap_socket' and
-        context.checkCallArgValue('ssl_version') is None
+        context.callFunctionNameQual == "ssl.wrap_socket"
+        and context.checkCallArgValue("ssl_version") is None
     ):
         # checkCallArgValue() returns False if the argument is found
         # but does not match the supplied value (or the default None).
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/jinja2Templates.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/jinja2Templates.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,7 +36,7 @@
 def checkJinja2Autoescape(reportError, context, config):
     """
     Function to check for not auto escaping in jinja2.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -45,18 +45,15 @@
     @type dict
     """
     if isinstance(context.callFunctionNameQual, str):
-        qualnameList = context.callFunctionNameQual.split('.')
+        qualnameList = context.callFunctionNameQual.split(".")
         func = qualnameList[-1]
-        if 'jinja2' in qualnameList and func == 'Environment':
+        if "jinja2" in qualnameList and func == "Environment":
             for node in ast.walk(context.node):
                 if isinstance(node, ast.keyword):
                     # definite autoescape = False
-                    if (
-                        getattr(node, 'arg', None) == 'autoescape' and
-                        (
-                            getattr(node.value, 'id', None) == 'False' or
-                            getattr(node.value, 'value', None) is False
-                        )
+                    if getattr(node, "arg", None) == "autoescape" and (
+                        getattr(node.value, "id", None) == "False"
+                        or getattr(node.value, "value", None) is False
                     ):
                         reportError(
                             context.node.lineno - 1,
@@ -66,19 +63,23 @@
                             "H",
                         )
                         return
-                    
+
                     # found autoescape
-                    if getattr(node, 'arg', None) == 'autoescape':
-                        value = getattr(node, 'value', None)
+                    if getattr(node, "arg", None) == "autoescape":
+                        value = getattr(node, "value", None)
                         if (
-                            getattr(value, 'id', None) == 'True' or
-                            getattr(value, 'value', None) is True or
-                            (isinstance(value, ast.Call) and
-                             (getattr(value.func, 'id', None) ==
-                              'select_autoescape'))
+                            getattr(value, "id", None) == "True"
+                            or getattr(value, "value", None) is True
+                            or (
+                                isinstance(value, ast.Call)
+                                and (
+                                    getattr(value.func, "id", None)
+                                    == "select_autoescape"
+                                )
+                            )
                         ):
                             return
-                        
+
                         else:
                             reportError(
                                 context.node.lineno - 1,
@@ -88,7 +89,7 @@
                                 "M",
                             )
                             return
-            
+
             # We haven't found a keyword named autoescape, indicating default
             # behavior
             reportError(
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/makoTemplates.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/makoTemplates.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkMakoTemplateUsage(reportError, context, config):
     """
     Function to check for use of mako templates.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -43,9 +43,9 @@
     @type dict
     """
     if isinstance(context.callFunctionNameQual, str):
-        qualnameList = context.callFunctionNameQual.split('.')
+        qualnameList = context.callFunctionNameQual.split(".")
         func = qualnameList[-1]
-        if 'mako' in qualnameList and func == 'Template':
+        if "mako" in qualnameList and func == "Template":
             # unlike Jinja2, mako does not have a template wide autoescape
             # feature and thus each variable must be carefully sanitized.
             reportError(
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/sshNoHostKeyVerification.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/sshNoHostKeyVerification.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkSshNoHostKeyVerification(reportError, context, config):
     """
     Function to check for use of mako templates.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -43,10 +43,10 @@
     @type dict
     """
     if (
-        context.isModuleImportedLike('paramiko') and
-        context.callFunctionName == 'set_missing_host_key_policy' and
-        context.callArgs and
-        context.callArgs[0] in ['AutoAddPolicy', 'WarningPolicy']
+        context.isModuleImportedLike("paramiko")
+        and context.callFunctionName == "set_missing_host_key_policy"
+        and context.callArgs
+        and context.callArgs[0] in ["AutoAddPolicy", "WarningPolicy"]
     ):
         reportError(
             context.node.lineno - 1,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/tryExcept.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/tryExcept.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,7 +23,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -39,7 +39,7 @@
 def checkTryExceptPass(reportError, context, config):
     """
     Function to check for a pass in the except block.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -49,19 +49,19 @@
     """
     checkTypedException = (
         config["check_typed_exception"]
-        if config and "check_typed_exception" in config else
-        SecurityDefaults["check_typed_exception"]
+        if config and "check_typed_exception" in config
+        else SecurityDefaults["check_typed_exception"]
     )
-    
+
     node = context.node
     if len(node.body) == 1:
         if (
-            not checkTypedException and
-            node.type is not None and
-            getattr(node.type, 'id', None) != 'Exception'
+            not checkTypedException
+            and node.type is not None
+            and getattr(node.type, "id", None) != "Exception"
         ):
             return
-        
+
         if isinstance(node.body[0], ast.Pass):
             reportError(
                 context.node.lineno - 1,
@@ -75,7 +75,7 @@
 def checkTryExceptContinue(reportError, context, config):
     """
     Function to check for a continue in the except block.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -85,19 +85,19 @@
     """
     checkTypedException = (
         config["check_typed_exception"]
-        if config and "check_typed_exception" in config else
-        SecurityDefaults["check_typed_exception"]
+        if config and "check_typed_exception" in config
+        else SecurityDefaults["check_typed_exception"]
     )
-    
+
     node = context.node
     if len(node.body) == 1:
         if (
-            not checkTypedException and
-            node.type is not None and
-            getattr(node.type, 'id', None) != 'Exception'
+            not checkTypedException
+            and node.type is not None
+            and getattr(node.type, "id", None) != "Exception"
         ):
             return
-        
+
         if isinstance(node.body[0], ast.Continue):
             reportError(
                 context.node.lineno - 1,
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -36,7 +36,7 @@
 def _classifyKeySize(reportError, config, keyType, keySize, node):
     """
     Function to classify a key and report an error if insufficient.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param config dictionary with configuration data
@@ -57,12 +57,12 @@
         except ValueError:
             # size provided via a variable - can't process it at the moment
             return False
-    
+
     conf = {}
     conf.update(SecurityDefaults)
     if config:
         conf.update(config)
-    
+
     keySizes = {
         "DSA": [
             (conf["weak_key_size_dsa_high"], "H"),
@@ -77,27 +77,21 @@
             (conf["weak_key_size_ec_medium"], "M"),
         ],
     }
-    
+
     for size, level in keySizes[keyType]:
         if keySize < size:
             reportError(
-                node.lineno - 1,
-                node.col_offset,
-                "S505",
-                level,
-                "H",
-                keyType,
-                size
+                node.lineno - 1, node.col_offset, "S505", level, "H", keyType, size
             )
             return True
-    
+
     return False
 
 
 def _weakCryptoKeySizeCryptography(reportError, context, config):
     """
     Function to check 'cryptography.hazmat' for weak key use.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -108,38 +102,36 @@
     @rtype bool
     """
     funcKeyType = {
-        'cryptography.hazmat.primitives.asymmetric.dsa.'
-        'generate_private_key': 'DSA',
-        'cryptography.hazmat.primitives.asymmetric.rsa.'
-        'generate_private_key': 'RSA',
-        'cryptography.hazmat.primitives.asymmetric.ec.'
-        'generate_private_key': 'EC',
+        "cryptography.hazmat.primitives.asymmetric.dsa." "generate_private_key": "DSA",
+        "cryptography.hazmat.primitives.asymmetric.rsa." "generate_private_key": "RSA",
+        "cryptography.hazmat.primitives.asymmetric.ec." "generate_private_key": "EC",
     }
     argPosition = {
-        'DSA': 0,
-        'RSA': 1,
-        'EC': 0,
+        "DSA": 0,
+        "RSA": 1,
+        "EC": 0,
     }
     keyType = funcKeyType.get(context.callFunctionNameQual)
-    if keyType in ['DSA', 'RSA']:
-        keySize = (context.getCallArgValue('key_size') or
-                   context.getCallArgAtPosition(argPosition[keyType]) or
-                   2048)
-        return _classifyKeySize(reportError, config, keyType, keySize,
-                                context.node)
-    
-    elif keyType == 'EC':
+    if keyType in ["DSA", "RSA"]:
+        keySize = (
+            context.getCallArgValue("key_size")
+            or context.getCallArgAtPosition(argPosition[keyType])
+            or 2048
+        )
+        return _classifyKeySize(reportError, config, keyType, keySize, context.node)
+
+    elif keyType == "EC":
         curveKeySizes = {
-            'SECP192R1': 192,
-            'SECT163K1': 163,
-            'SECT163R2': 163,
+            "SECP192R1": 192,
+            "SECT163K1": 163,
+            "SECT163R2": 163,
         }
-        curve = (context.getCallArgValue('curve') or
-                 context.callArgs[argPosition[keyType]])
+        curve = (
+            context.getCallArgValue("curve") or context.callArgs[argPosition[keyType]]
+        )
         keySize = curveKeySizes[curve] if curve in curveKeySizes else 224
-        return _classifyKeySize(reportError, config, keyType, keySize,
-                                context.node)
-    
+        return _classifyKeySize(reportError, config, keyType, keySize, context.node)
+
     else:
         return False
 
@@ -147,7 +139,7 @@
 def _weakCryptoKeySizePycrypto(reportError, context, config):
     """
     Function to check 'pycrypto' for weak key use.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -158,25 +150,24 @@
     @rtype bool
     """
     funcKeyType = {
-        'Crypto.PublicKey.DSA.generate': 'DSA',
-        'Crypto.PublicKey.RSA.generate': 'RSA',
-        'Cryptodome.PublicKey.DSA.generate': 'DSA',
-        'Cryptodome.PublicKey.RSA.generate': 'RSA',
+        "Crypto.PublicKey.DSA.generate": "DSA",
+        "Crypto.PublicKey.RSA.generate": "RSA",
+        "Cryptodome.PublicKey.DSA.generate": "DSA",
+        "Cryptodome.PublicKey.RSA.generate": "RSA",
     }
     keyType = funcKeyType.get(context.callFunctionNameQual)
     if keyType:
-        keySize = (context.getCallArgValue('bits') or
-                   context.getCallArgAtPosition(0) or
-                   2048)
-        return _classifyKeySize(reportError, config, keyType, keySize,
-                                context.node)
+        keySize = (
+            context.getCallArgValue("bits") or context.getCallArgAtPosition(0) or 2048
+        )
+        return _classifyKeySize(reportError, config, keyType, keySize, context.node)
     return False
 
 
 def checkWeakCryptographicKey(reportError, context, config):
     """
     Function to check for weak cryptographic key use.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -185,6 +176,6 @@
     @type dict
     """
     (
-        _weakCryptoKeySizeCryptography(reportError, context, config) or
-        _weakCryptoKeySizePycrypto(reportError, context, config)
+        _weakCryptoKeySizeCryptography(reportError, context, config)
+        or _weakCryptoKeySizePycrypto(reportError, context, config)
     )
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/yamlLoad.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/yamlLoad.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
-    
+
     @return dictionary containing checker lists containing checker function and
         list of codes
     @rtype dict
@@ -34,7 +34,7 @@
 def checkYamlLoad(reportError, context, config):
     """
     Function to check for the use of of yaml load functions.
-    
+
     @param reportError function to be used to report errors
     @type func
     @param context security context object
@@ -42,23 +42,19 @@
     @param config dictionary with configuration data
     @type dict
     """
-    imported = context.isModuleImportedExact('yaml')
+    imported = context.isModuleImportedExact("yaml")
     qualname = context.callFunctionNameQual
     if not imported and isinstance(qualname, str):
         return
-    
-    qualnameList = qualname.split('.')
+
+    qualnameList = qualname.split(".")
     func = qualnameList[-1]
-    if all([
-            'yaml' in qualnameList,
-            func == 'load',
-            not context.checkCallArgValue('Loader', 'SafeLoader'),
-            not context.checkCallArgValue('Loader', 'CSafeLoader'),
-    ]):
-        reportError(
-            context.node.lineno - 1,
-            context.node.col_offset,
-            "S506",
-            "M",
-            "H"
-        )
+    if all(
+        [
+            "yaml" in qualnameList,
+            func == "load",
+            not context.checkCallArgValue("Loader", "SafeLoader"),
+            not context.checkCallArgValue("Loader", "CSafeLoader"),
+        ]
+    ):
+        reportError(context.node.lineno - 1, context.node.col_offset, "S506", "M", "H")
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,88 +18,110 @@
     """
     Class implementing a checker for security issues.
     """
+
     Codes = [
         # assert used
         "S101",
-        
         # exec used
         "S102",
-        
         # bad file permissions
         "S103",
-        
         # bind to all interfaces
         "S104",
-        
         # hardcoded passwords
-        "S105", "S106", "S107"
-        
+        "S105",
+        "S106",
+        "S107"
         # hardcoded tmp directory
         "S108",
-        
         # try-except
-        "S110", "S112",
-        
+        "S110",
+        "S112",
         # flask app
         "S201",
-        
         # insecure function calls (blacklisted)
-        "S301", "S302", "S303", "S304", "S305", "S306", "S307", "S308", "S309",
-        "S310", "S311", "S312", "S313", "S314", "S315", "S316", "S317", "S318",
-        "S319", "S320", "S321", "S322", "S323", "S324",
-        
+        "S301",
+        "S302",
+        "S303",
+        "S304",
+        "S305",
+        "S306",
+        "S307",
+        "S308",
+        "S309",
+        "S310",
+        "S311",
+        "S312",
+        "S313",
+        "S314",
+        "S315",
+        "S316",
+        "S317",
+        "S318",
+        "S319",
+        "S320",
+        "S321",
+        "S322",
+        "S323",
+        "S324",
         # hashlib.new
         "S331",
-        
         # insecure imports (blacklisted)
-        "S401", "S402", "S403", "S404", "S405", "S406", "S407", "S408", "S409",
-        "S410", "S411", "S412", "S413",
-        
+        "S401",
+        "S402",
+        "S403",
+        "S404",
+        "S405",
+        "S406",
+        "S407",
+        "S408",
+        "S409",
+        "S410",
+        "S411",
+        "S412",
+        "S413",
         # insecure certificate usage
         "S501",
-        
         # insecure SSL/TLS protocol version
-        "S502", "S503", "S504",
-        
+        "S502",
+        "S503",
+        "S504",
         # weak cryptographic keys
         "S505",
-        
         # YAML load
         "S506",
-        
         # SSH host key verification
         "S507",
-        
         # Shell injection
-        "S601", "S602", "S603", "S604", "S605", "S606", "S607",
-        
+        "S601",
+        "S602",
+        "S603",
+        "S604",
+        "S605",
+        "S606",
+        "S607",
         # SQL injection
         "S608",
-        
         # Wildcard injection
         "S609",
-        
         # Django SQL injection
-        "S610", "S611",
-        
+        "S610",
+        "S611",
         # Jinja2 templates
         "S701",
-        
         # Mako templates
         "S702",
-        
         # Django XSS vulnerability
         "S703",
-        
         # hardcoded AWS passwords
-        "S801", "S802",
+        "S801",
+        "S802",
     ]
-    
-    def __init__(self, source, filename, tree, select, ignore, expected,
-                 repeat, args):
+
+    def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -118,29 +140,28 @@
         @type dict
         """
         self.__select = tuple(select)
-        self.__ignore = ('',) if select else tuple(ignore)
+        self.__ignore = ("",) if select else tuple(ignore)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__filename = filename
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
         self.__args = args
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
+
         checkersWithCodes = Checks.generateCheckersDict()
-        
+
         self.__checkers = collections.defaultdict(list)
         for checkType, checkersList in checkersWithCodes.items():
             for checker, codes in checkersList:
-                if any(not (code and self.__ignoreCode(code))
-                       for code in codes):
+                if any(not (code and self.__ignoreCode(code)) for code in codes):
                     self.__checkers[checkType].append(checker)
-    
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -150,14 +171,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
-    def reportError(self, lineNumber, offset, code, severity, confidence,
-                    *args):
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
+    def reportError(self, lineNumber, offset, code, severity, confidence, *args):
         """
         Public method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -175,37 +194,39 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         if code in self.counters:
             self.counters[code] += 1
         else:
             self.counters[code] = 1
-        
+
         # Don't care about expected codes
         if code in self.__expected:
             return
-        
+
         if code and (self.counters[code] == 1 or self.__repeat):
             # record the issue with one based line number
-            self.errors.append({
-                "file": self.__filename,
-                "line": lineNumber + 1,
-                "offset": offset,
-                "code": code,
-                "args": args,
-                "severity": severity,
-                "confidence": confidence,
-            })
-    
+            self.errors.append(
+                {
+                    "file": self.__filename,
+                    "line": lineNumber + 1,
+                    "offset": offset,
+                    "code": code,
+                    "args": args,
+                    "severity": severity,
+                    "confidence": confidence,
+                }
+            )
+
     def getConfig(self):
         """
         Public method to get the configuration dictionary.
-        
+
         @return dictionary containing the configuration
         @rtype dict
         """
         return self.__args
-    
+
     def run(self):
         """
         Public method to check the given source against security related
@@ -214,11 +235,12 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkers:
             # don't do anything, if no codes were selected
             return
-        
+
         securityNodeVisitor = SecurityNodeVisitor(
-            self, self.__checkers, self.__filename)
+            self, self.__checkers, self.__filename
+        )
         securityNodeVisitor.generic_visit(self.__tree)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,13 +28,14 @@
     """
     Class implementing a context class for security related checks.
     """
+
     def __init__(self, contextObject=None):
         """
         Constructor
-        
+
         Initialize the class with a context dictionary or an empty
         dictionary.
-        
+
         @param contextObject context dictionary to be used to populate the
             class
         @type dict
@@ -43,186 +44,177 @@
             self.__context = copy.copy(contextObject)
         else:
             self.__context = {}
-    
+
     def __repr__(self):
         """
         Special method to generate representation of object for printing or
         interactive use.
-        
+
         @return string representation of the object
         @rtype str
         """
         return "<SecurityContext {0}>".formar(self.__context)
-    
+
     @property
     def callArgs(self):
         """
         Public method to get a list of function args.
-        
+
         @return list of function args
         @rtype list
         """
         args = []
-        if (
-            'call' in self.__context and
-            hasattr(self.__context['call'], 'args')
-        ):
-            for arg in self.__context['call'].args:
-                if hasattr(arg, 'attr'):
+        if "call" in self.__context and hasattr(self.__context["call"], "args"):
+            for arg in self.__context["call"].args:
+                if hasattr(arg, "attr"):
                     args.append(arg.attr)
                 else:
                     args.append(self.__getLiteralValue(arg))
         return args
-    
+
     @property
     def callArgsCount(self):
         """
         Public method to get the number of args a function call has.
-        
+
         @return number of args a function call has
         @rtype int
         """
-        if (
-            'call' in self.__context and
-            hasattr(self.__context['call'], 'args')
-        ):
-            return len(self.__context['call'].args)
+        if "call" in self.__context and hasattr(self.__context["call"], "args"):
+            return len(self.__context["call"].args)
         else:
             return None
-    
+
     @property
     def callFunctionName(self):
         """
         Public method to get the name (not FQ) of a function call.
-        
+
         @return name (not FQ) of a function call
         @rtype str
         """
-        return self.__context.get('name')
-    
+        return self.__context.get("name")
+
     @property
     def callFunctionNameQual(self):
         """
         Public method to get the FQ name of a function call.
-        
+
         @return FQ name of a function call
         @rtype str
         """
-        return self.__context.get('qualname')
-    
+        return self.__context.get("qualname")
+
     @property
     def callKeywords(self):
         """
         Public method to get a dictionary of keyword parameters.
-        
+
         @return dictionary of keyword parameters
         @rtype dict
         """
-        if (
-            'call' in self.__context and
-            hasattr(self.__context['call'], 'keywords')
-        ):
+        if "call" in self.__context and hasattr(self.__context["call"], "keywords"):
             returnDict = {}
-            for kw in self.__context['call'].keywords:
-                if hasattr(kw.value, 'attr'):
+            for kw in self.__context["call"].keywords:
+                if hasattr(kw.value, "attr"):
                     returnDict[kw.arg] = kw.value.attr
                 else:
                     returnDict[kw.arg] = self.__getLiteralValue(kw.value)
             return returnDict
-        
+
         else:
             return None
-    
+
     @property
     def node(self):
         """
         Public method to get the raw AST node associated with the context.
-        
+
         @return raw AST node associated with the context
         @rtype ast.AST
         """
-        return self.__context.get('node')
-    
+        return self.__context.get("node")
+
     @property
     def stringVal(self):
         """
         Public method to get the value of a standalone string object.
-        
+
         @return value of a standalone string object
         @rtype str
         """
-        return self.__context.get('str')
-    
+        return self.__context.get("str")
+
     @property
     def bytesVal(self):
         """
         Public method to get the value of a standalone bytes object.
-        
+
         @return value of a standalone bytes object
         @rtype bytes
         """
-        return self.__context.get('bytes')
-    
+        return self.__context.get("bytes")
+
     @property
     def stringValAsEscapedBytes(self):
         r"""
         Public method to get the escaped value of the object.
-        
+
         Turn the value of a string or bytes object into a byte sequence with
         unknown, control, and \\ characters escaped.
 
         This function should be used when looking for a known sequence in a
         potentially badly encoded string in the code.
-        
+
         @return sequence of printable ascii bytes representing original string
         @rtype str
         """
         val = self.stringVal
         if val is not None:
-            return val.encode('unicode_escape')
-        
+            return val.encode("unicode_escape")
+
         val = self.bytesVal
         if val is not None:
             return SecurityUtils.escapedBytesRepresentation(val)
-        
+
         return None
-    
+
     @property
     def statement(self):
         """
         Public method to get the raw AST for the current statement.
-        
+
         @return raw AST for the current statement
         @rtype ast.AST
         """
-        return self.__context.get('statement')
-    
+        return self.__context.get("statement")
+
     @property
     def functionDefDefaultsQual(self):
         """
         Public method to get a list of fully qualified default values in a
         function def.
-        
+
         @return list of fully qualified default values in a function def
         @rtype list
         """
         defaults = []
         if (
-            'node' in self.__context and
-            hasattr(self.__context['node'], 'args') and
-            hasattr(self.__context['node'].args, 'defaults')
+            "node" in self.__context
+            and hasattr(self.__context["node"], "args")
+            and hasattr(self.__context["node"].args, "defaults")
         ):
-            for default in self.__context['node'].args.defaults:
-                defaults.append(SecurityUtils.getQualAttr(
-                    default,
-                    self.__context['import_aliases']))
-        
+            for default in self.__context["node"].args.defaults:
+                defaults.append(
+                    SecurityUtils.getQualAttr(default, self.__context["import_aliases"])
+                )
+
         return defaults
-    
+
     def __getLiteralValue(self, literal):
         """
         Private method to turn AST literals into native Python types.
-        
+
         @param literal AST literal to be converted
         @type ast.AST
         @return converted Python object
@@ -230,53 +222,50 @@
         """
         if AstUtilities.isNumber(literal):
             literalValue = literal.n
-        
+
         elif AstUtilities.isString(literal) or AstUtilities.isBytes(literal):
             literalValue = literal.s
-        
+
         elif isinstance(literal, ast.List):
             returnList = []
             for li in literal.elts:
                 returnList.append(self.__getLiteralValue(li))
             literalValue = returnList
-        
+
         elif isinstance(literal, ast.Tuple):
             returnTuple = ()
             for ti in literal.elts:
                 returnTuple = returnTuple + (self.__getLiteralValue(ti),)
             literalValue = returnTuple
-        
+
         elif isinstance(literal, ast.Set):
             returnSet = set()
             for si in literal.elts:
                 returnSet.add(self.__getLiteralValue(si))
             literalValue = returnSet
-        
+
         elif isinstance(literal, ast.Dict):
             literalValue = dict(zip(literal.keys, literal.values))
-        
-        elif (
-            sys.version_info <= (3, 8, 0) and
-            isinstance(literal, ast.Ellipsis)
-        ):
+
+        elif sys.version_info <= (3, 8, 0) and isinstance(literal, ast.Ellipsis):
             # what do we want to do with this?
             literalValue = None
-        
+
         elif isinstance(literal, ast.Name):
             literalValue = literal.id
-        
+
         elif AstUtilities.isNameConstant(literal):
             literalValue = str(literal.value)
-        
+
         else:
             literalValue = None
-        
+
         return literalValue
-    
+
     def getCallArgValue(self, argumentName):
         """
         Public method to get the value of a named argument in a function call.
-        
+
         @param argumentName name of the argument to get the value for
         @type str
         @return value of the named argument
@@ -285,14 +274,14 @@
         kwdValues = self.callKeywords
         if kwdValues is not None and argumentName in kwdValues:
             return kwdValues[argumentName]
-        
+
         return None
-    
+
     def checkCallArgValue(self, argumentName, argumentValues=None):
         """
         Public method to check for a value of a named argument in a function
         call.
-        
+
         @param argumentName name of the argument to be checked
         @type str
         @param argumentValues value or list of values to test against
@@ -311,44 +300,44 @@
             # argument name not found, return None to allow testing for this
             # eventuality
             return None
-    
+
     def getLinenoForCallArg(self, argumentName):
         """
         Public method to get the line number for a specific named argument.
-        
+
         @param argumentName name of the argument to get the line number for
         @type str
         @return line number of the found argument or -1
         @rtype int
         """
-        if hasattr(self.node, 'keywords'):
+        if hasattr(self.node, "keywords"):
             for key in self.node.keywords:
                 if key.arg == argumentName:
                     return key.value.lineno
-        
+
         return -1
-    
+
     def getOffsetForCallArg(self, argumentName):
         """
         Public method to get the offset for a specific named argument.
-        
+
         @param argumentName name of the argument to get the line number for
         @type str
         @return offset of the found argument or -1
         @rtype int
         """
-        if hasattr(self.node, 'keywords'):
+        if hasattr(self.node, "keywords"):
             for key in self.node.keywords:
                 if key.arg == argumentName:
                     return key.value.col_offset
-        
+
         return -1
-    
+
     def getCallArgAtPosition(self, positionNum):
         """
         Public method to get a positional argument at the specified position
         (if it exists).
-        
+
         @param positionNum index of the argument to get the value for
         @type int
         @return value of the argument at the specified position if it exists
@@ -356,47 +345,45 @@
         """
         maxArgs = self.callArgsCount
         if maxArgs and positionNum < maxArgs:
-            return self.__getLiteralValue(
-                self.__context['call'].args[positionNum]
-            )
+            return self.__getLiteralValue(self.__context["call"].args[positionNum])
         else:
             return None
-    
+
     def isModuleBeingImported(self, module):
         """
         Public method to check for the given module is currently being
         imported.
-        
+
         @param module module name to look for
         @type str
         @return flag indicating the given module was found
         @rtype bool
         """
-        return self.__context.get('module') == module
-    
+        return self.__context.get("module") == module
+
     def isModuleImportedExact(self, module):
         """
         Public method to check if a given module has been imported; only exact
         matches.
-        
+
         @param module module name to look for
         @type str
         @return flag indicating the given module was found
         @rtype bool
         """
-        return module in self.__context.get('imports', [])
-    
+        return module in self.__context.get("imports", [])
+
     def isModuleImportedLike(self, module):
         """
         Public method to check if a given module has been imported; given
         module exists.
-        
+
         @param module module name to look for
         @type str
         @return flag indicating the given module was found
         @rtype bool
         """
         try:
-            return any(module in imp for imp in self.__context['imports'])
+            return any(module in imp for imp in self.__context["imports"])
         except KeyError:
             return False
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,68 +11,65 @@
     # generalHardcodedTmp.py
     "hardcoded_tmp_directories": ["/tmp", "/var/tmp", "/dev/shm", "~/tmp"],
     # secok
-    
     # insecureHashlibNew.py
-    "insecure_hashes": ['md4', 'md5', 'sha', 'sha1'],
-    
+    "insecure_hashes": ["md4", "md5", "sha", "sha1"],
     # injectionShell.py
     # injectionWildcard.py
     "shell_injection_subprocess": [
-        'subprocess.Popen',
-        'subprocess.call',
-        'subprocess.check_call',
-        'subprocess.check_output',
-        'subprocess.run'],
-    
+        "subprocess.Popen",
+        "subprocess.call",
+        "subprocess.check_call",
+        "subprocess.check_output",
+        "subprocess.run",
+    ],
     # injectionShell.py
     # injectionWildcard.py
     "shell_injection_shell": [
-        'os.system',
-        'os.popen',
-        'os.popen2',
-        'os.popen3',
-        'os.popen4',
-        'popen2.popen2',
-        'popen2.popen3',
-        'popen2.popen4',
-        'popen2.Popen3',
-        'popen2.Popen4',
-        'commands.getoutput',
-        'commands.getstatusoutput'],
-    
+        "os.system",
+        "os.popen",
+        "os.popen2",
+        "os.popen3",
+        "os.popen4",
+        "popen2.popen2",
+        "popen2.popen3",
+        "popen2.popen4",
+        "popen2.Popen3",
+        "popen2.Popen4",
+        "commands.getoutput",
+        "commands.getstatusoutput",
+    ],
     # injectionShell.py
     "shell_injection_noshell": [
-        'os.execl',
-        'os.execle',
-        'os.execlp',
-        'os.execlpe',
-        'os.execv',
-        'os.execve',
-        'os.execvp',
-        'os.execvpe',
-        'os.spawnl',
-        'os.spawnle',
-        'os.spawnlp',
-        'os.spawnlpe',
-        'os.spawnv',
-        'os.spawnve',
-        'os.spawnvp',
-        'os.spawnvpe',
-        'os.startfile'],
-    
+        "os.execl",
+        "os.execle",
+        "os.execlp",
+        "os.execlpe",
+        "os.execv",
+        "os.execve",
+        "os.execvp",
+        "os.execvpe",
+        "os.spawnl",
+        "os.spawnle",
+        "os.spawnlp",
+        "os.spawnlpe",
+        "os.spawnv",
+        "os.spawnve",
+        "os.spawnvp",
+        "os.spawnvpe",
+        "os.startfile",
+    ],
     # insecureSslTls.py
     "insecure_ssl_protocol_versions": [
-        'PROTOCOL_SSLv2',
-        'SSLv2_METHOD',
-        'SSLv23_METHOD',
-        'PROTOCOL_SSLv3',
-        'PROTOCOL_TLSv1',
-        'SSLv3_METHOD',
-        'TLSv1_METHOD'],
-    
+        "PROTOCOL_SSLv2",
+        "SSLv2_METHOD",
+        "SSLv23_METHOD",
+        "PROTOCOL_SSLv3",
+        "PROTOCOL_TLSv1",
+        "SSLv3_METHOD",
+        "TLSv1_METHOD",
+    ],
     # tryExcept.py
     "check_typed_exception": False,
-    
     # weakCryptographicKey.py
     "weak_key_size_dsa_high": 1024,
     "weak_key_size_dsa_medium": 2048,
@@ -80,5 +77,4 @@
     "weak_key_size_rsa_medium": 2048,
     "weak_key_size_ec_high": 160,
     "weak_key_size_ec_medium": 224,
-
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityNodeVisitor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityNodeVisitor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing an AST node visitor for security checks.
     """
+
     def __init__(self, checker, secCheckers, filename):
         """
         Constructor
-        
+
         @param checker reference to the main security checker object
         @type SecurityChecker
         @param secCheckers dictionary containing the available checker routines
@@ -30,7 +31,7 @@
         """
         self.__checker = checker
         self.__securityCheckers = secCheckers
-        
+
         self.seen = 0
         self.depth = 0
         self.filename = filename
@@ -42,97 +43,97 @@
             self.namespace = SecurityUtils.getModuleQualnameFromPath(filename)
         except SecurityUtils.InvalidModulePath:
             self.namespace = ""
-    
+
     def __runChecks(self, checkType):
         """
         Private method to run all enabled checks for a given check type.
-        
+
         @param checkType type of checks to be run
         @type str
         """
         if checkType in self.__securityCheckers:
             for check in self.__securityCheckers[checkType]:
-                check(self.__checker.reportError,
-                      SecurityContext(self.__context),
-                      self.__checker.getConfig())
-    
+                check(
+                    self.__checker.reportError,
+                    SecurityContext(self.__context),
+                    self.__checker.getConfig(),
+                )
+
     def visit_ClassDef(self, node):
         """
         Public method defining a visitor for AST ClassDef nodes.
-        
+
         Add class name to current namespace for all descendants.
-        
+
         @param node reference to the node being inspected
         @type ast.ClassDef
         """
         # For all child nodes, add this class name to current namespace
-        self.namespace = SecurityUtils.namespacePathJoin(
-            self.namespace, node.name)
-    
+        self.namespace = SecurityUtils.namespacePathJoin(self.namespace, node.name)
+
     def visit_FunctionDef(self, node):
         """
         Public method defining a visitor for AST FunctionDef nodes.
-        
+
         @param node reference to the node being inspected
         @type ast.FunctionDef
         """
         self.__visitFunctionDefinition(node)
-    
+
     def visit_AsyncFunctionDef(self, node):
         """
         Public method defining a visitor for AST AsyncFunctionDef nodes.
-        
+
         @param node reference to the node being inspected
         @type ast.AsyncFunctionDef
         """
         self.__visitFunctionDefinition(node)
-    
+
     def __visitFunctionDefinition(self, node):
         """
         Private method defining a visitor for AST FunctionDef and
         AsyncFunctionDef nodes.
-        
+
         Add relevant information about the node to the context for use in tests
         which inspect function definitions. Add the function name to the
         current namespace for all descendants.
-        
+
         @param node reference to the node being inspected
         @type ast.FunctionDef, ast.AsyncFunctionDef
         """
-        self.__context['function'] = node
+        self.__context["function"] = node
         qualname = SecurityUtils.namespacePathJoin(self.namespace, node.name)
-        name = qualname.split('.')[-1]
-        self.__context['qualname'] = qualname
-        self.__context['name'] = name
+        name = qualname.split(".")[-1]
+        self.__context["qualname"] = qualname
+        self.__context["name"] = name
 
         # For all child nodes and any tests run, add this function name to
         # current namespace
-        self.namespace = SecurityUtils.namespacePathJoin(
-            self.namespace, node.name)
-        
+        self.namespace = SecurityUtils.namespacePathJoin(self.namespace, node.name)
+
         self.__runChecks("FunctionDef")
-    
+
     def visit_Call(self, node):
         """
         Public method defining a visitor for AST Call nodes.
-        
+
         Add relevant information about the node to the context for use in tests
         which inspect function calls.
-        
+
         @param node reference to the node being inspected
         @type ast.Call
         """
-        self.__context['call'] = node
+        self.__context["call"] = node
         qualname = SecurityUtils.getCallName(node, self.import_aliases)
-        name = qualname.split('.')[-1]
-        self.__context['qualname'] = qualname
-        self.__context['name'] = name
+        name = qualname.split(".")[-1]
+        self.__context["qualname"] = qualname
+        self.__context["name"] = name
         self.__runChecks("Call")
-    
+
     def visit_Import(self, node):
         """
         Public method defining a visitor for AST Import nodes.
-        
+
         @param node reference to the node being inspected
         @type ast.Import
         """
@@ -140,16 +141,16 @@
             if nodename.asname:
                 self.import_aliases[nodename.asname] = nodename.name
             self.imports.add(nodename.name)
-            self.__context['module'] = nodename.name
+            self.__context["module"] = nodename.name
         self.__runChecks("Import")
-    
+
     def visit_ImportFrom(self, node):
         """
         Public method defining a visitor for AST Import nodes.
-        
+
         This adds relevant information about the node to
         the context for use in tests which inspect imports.
-        
+
         @param node reference to the node being inspected
         @type ast.ImportFrom
         """
@@ -157,30 +158,27 @@
         if module is None:
             self.visit_Import(node)
             return
-        
+
         for nodename in node.names:
             if nodename.asname:
-                self.import_aliases[nodename.asname] = (
-                    module + "." + nodename.name
-                )
+                self.import_aliases[nodename.asname] = module + "." + nodename.name
             else:
                 # Even if import is not aliased we need an entry that maps
                 # name to module.name.  For example, with 'from a import b'
                 # b should be aliased to the qualified name a.b
-                self.import_aliases[nodename.name] = (
-                    module + '.' + nodename.name)
+                self.import_aliases[nodename.name] = module + "." + nodename.name
             self.imports.add(module + "." + nodename.name)
-            self.__context['module'] = module
-            self.__context['name'] = nodename.name
+            self.__context["module"] = module
+            self.__context["name"] = nodename.name
         self.__runChecks("ImportFrom")
-    
+
     def visit_Constant(self, node):
         """
         Public method defining a visitor for Constant nodes.
-        
+
         This calls the appropriate method for the node type.
         It maintains compatibility with <3.6 and 3.8+
-        
+
         @param node reference to the node being inspected
         @type ast.Constant
         """
@@ -192,16 +190,16 @@
     def visit_Str(self, node):
         """
         Public method defining a visitor for String nodes.
-        
+
         This adds relevant information about node to
         the context for use in tests which inspect strings.
-        
+
         @param node reference to the node being inspected
         @type ast.Str
         """
-        self.__context['str'] = node.s
+        self.__context["str"] = node.s
         if not isinstance(node._securityParent, ast.Expr):  # docstring
-            self.__context['linerange'] = SecurityUtils.linerange_fix(
+            self.__context["linerange"] = SecurityUtils.linerange_fix(
                 node._securityParent
             )
             self.__runChecks("Str")
@@ -209,64 +207,64 @@
     def visit_Bytes(self, node):
         """
         Public method defining a visitor for Bytes nodes.
-        
+
         This adds relevant information about node to
         the context for use in tests which inspect strings.
-        
+
         @param node reference to the node being inspected
         @type ast.Bytes
         """
-        self.__context['bytes'] = node.s
+        self.__context["bytes"] = node.s
         if not isinstance(node._securityParent, ast.Expr):  # docstring
-            self.__context['linerange'] = SecurityUtils.linerange_fix(
+            self.__context["linerange"] = SecurityUtils.linerange_fix(
                 node._securityParent
             )
             self.__runChecks("Bytes")
-    
+
     def __preVisit(self, node):
         """
         Private method to set up a context for the visit method.
-        
+
         @param node node to base the context on
         @type ast.AST
         @return flag indicating to visit the node
         @rtype bool
         """
         self.__context = {}
-        self.__context['imports'] = self.imports
-        self.__context['import_aliases'] = self.import_aliases
-        
-        if hasattr(node, 'lineno'):
-            self.__context['lineno'] = node.lineno
-        
-        self.__context['node'] = node
-        self.__context['linerange'] = SecurityUtils.linerange_fix(node)
-        self.__context['filename'] = self.filename
+        self.__context["imports"] = self.imports
+        self.__context["import_aliases"] = self.import_aliases
+
+        if hasattr(node, "lineno"):
+            self.__context["lineno"] = node.lineno
+
+        self.__context["node"] = node
+        self.__context["linerange"] = SecurityUtils.linerange_fix(node)
+        self.__context["filename"] = self.filename
 
         self.seen += 1
         self.depth += 1
-        
+
         return True
-    
+
     def visit(self, node):
         """
         Public method to inspected an AST node.
-        
+
         @param node AST node to be inspected
         @type ast.AST
         """
         name = node.__class__.__name__
-        method = 'visit_' + name
+        method = "visit_" + name
         visitor = getattr(self, method, None)
         if visitor is not None:
             visitor(node)
         else:
             self.__runChecks(name)
-    
+
     def __postVisit(self, node):
         """
         Private method to clean up after a node was visited.
-        
+
         @param node AST node that was visited
         @type ast.AST
         """
@@ -274,13 +272,12 @@
         # Clean up post-recursion stuff that gets setup in the visit methods
         # for these node types.
         if isinstance(node, (ast.FunctionDef, ast.ClassDef)):
-            self.namespace = SecurityUtils.namespacePathSplit(
-                self.namespace)[0]
-    
+            self.namespace = SecurityUtils.namespacePathSplit(self.namespace)[0]
+
     def generic_visit(self, node):
         """
         Public method to drive the node visitor.
-        
+
         @param node node to be inspected
         @type ast.AST
         """
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,6 +18,7 @@
     """
     Class defining an exception for invalid module paths.
     """
+
     pass
 
 
@@ -25,16 +26,16 @@
     """
     Function to get the module's qualified name by analysis of the
     path.
-    
+
     Resolve the absolute pathname and eliminate symlinks. This could result
     in an incorrect name if symlinks are used to restructure the python lib
     directory.
-    
+
     Starting from the right-most directory component look for __init__.py
     in the directory component. If it exists then the directory name is
     part of the module name. Move left to the subsequent directory
     components until a directory is found without __init__.py.
-    
+
     @param path path of the module to be analyzed
     @type str
     @return qualified name of the module
@@ -42,26 +43,27 @@
     @exception InvalidModulePath raised to indicate an invalid module path
     """
     (head, tail) = os.path.split(path)
-    if head == '' or tail == '':
-        raise InvalidModulePath('Invalid python file path: "{0}"'
-                                ' Missing path or file name'.format(path))
-    
+    if head == "" or tail == "":
+        raise InvalidModulePath(
+            'Invalid python file path: "{0}"' " Missing path or file name".format(path)
+        )
+
     qname = [os.path.splitext(tail)[0]]
-    while head not in ['/', '.', '']:
-        if os.path.isfile(os.path.join(head, '__init__.py')):
+    while head not in ["/", ".", ""]:
+        if os.path.isfile(os.path.join(head, "__init__.py")):
             (head, tail) = os.path.split(head)
             qname.insert(0, tail)
         else:
             break
 
-    qualname = '.'.join(qname)
+    qualname = ".".join(qname)
     return qualname
 
 
 def namespacePathJoin(namespace, name):
     """
     Function to extend a given namespace path.
-    
+
     @param namespace namespace to be extended
     @type str
     @param name node name to be appended
@@ -75,17 +77,17 @@
 def namespacePathSplit(path):
     """
     Function to split a namespace path into a head and tail.
-    
+
     Tail will be the last namespace path component and head will
     be everything leading up to that in the path. This is similar to
     os.path.split.
-    
+
     @param path namespace path to be split
     @type str
     @return tuple containing the namespace path head and tail
     @rtype tuple of (str, str)
     """
-    return tuple(path.rsplit('.', 1))
+    return tuple(path.rsplit(".", 1))
 
 
 def getAttrQualName(node, aliases):
@@ -99,7 +101,7 @@
     encounter a node without a static name we punt with an
     empty string. If this encounters something more complex, such as
     foo.mylist[0](a,b) we just return empty string.
-    
+
     @param node attribute node to be treated
     @type ast.Attribute
     @param aliases dictionary of import aliases
@@ -112,8 +114,7 @@
             return aliases[node.id]
         return node.id
     elif isinstance(node, ast.Attribute):
-        name = "{0}.{1}".format(getAttrQualName(node.value, aliases),
-                                node.attr)
+        name = "{0}.{1}".format(getAttrQualName(node.value, aliases), node.attr)
         if name in aliases:
             return aliases[name]
         return name
@@ -124,7 +125,7 @@
 def getCallName(node, aliases):
     """
     Function to extract the call name from an ast.Call node.
-    
+
     @param node node to extract information from
     @type ast.Call
     @param aliases dictionary of import aliases
@@ -133,9 +134,9 @@
     @rtype str
     """
     if isinstance(node.func, ast.Name):
-        if deepgetattr(node, 'func.id') in aliases:
-            return aliases[deepgetattr(node, 'func.id')]
-        return deepgetattr(node, 'func.id')
+        if deepgetattr(node, "func.id") in aliases:
+            return aliases[deepgetattr(node, "func.id")]
+        return deepgetattr(node, "func.id")
     elif isinstance(node.func, ast.Attribute):
         return getAttrQualName(node.func, aliases)
     else:
@@ -145,7 +146,7 @@
 def getQualAttr(node, aliases):
     """
     Function to extract the qualified name from an ast.Attribute node.
-    
+
     @param node node to extract information from
     @type ast.Attribute
     @param aliases dictionary of import aliases
@@ -156,14 +157,11 @@
     prefix = ""
     if isinstance(node, ast.Attribute):
         with contextlib.suppress(Exception):
-            val = deepgetattr(node, 'value.id')
-            prefix = (
-                aliases[val] if val in aliases
-                else deepgetattr(node, 'value.id')
-            )
+            val = deepgetattr(node, "value.id")
+            prefix = aliases[val] if val in aliases else deepgetattr(node, "value.id")
             # Id we can't get the fully qualified name for an attr, just return
             # its base name.
-        
+
         return "{0}.{1}".format(prefix, node.attr)
     else:
         return ""
@@ -172,7 +170,7 @@
 def deepgetattr(obj, attr):
     """
     Function to recurs through an attribute chain to get the ultimate value.
-    
+
     @param obj reference to the object to be recursed
     @type ast.Name or ast.Attribute
     @param attr attribute chain to be parsed
@@ -180,7 +178,7 @@
     @return ultimate value
     @rtype ast.AST
     """
-    for key in attr.split('.'):
+    for key in attr.split("."):
         obj = getattr(obj, key)
     return obj
 
@@ -188,37 +186,32 @@
 def linerange(node):
     """
     Function to get line number range from a node.
-    
+
     @param node node to extract a line range from
     @type ast.AST
     @return list containing the line number range
     @rtype list of int
     """
-    strip = {
-        "body": None,
-        "orelse": None,
-        "handlers": None,
-        "finalbody": None
-    }
+    strip = {"body": None, "orelse": None, "handlers": None, "finalbody": None}
     for key in strip:
         if hasattr(node, key):
             strip[key] = getattr(node, key)
             node.key = []
-    
+
     lines_min = 9999999999
     lines_max = -1
     for n in ast.walk(node):
-        if hasattr(n, 'lineno'):
+        if hasattr(n, "lineno"):
             lines_min = min(lines_min, n.lineno)
             lines_max = max(lines_max, n.lineno)
-    
+
     for key in strip:
         if strip[key] is not None:
             node.key = strip[key]
-    
+
     if lines_max > -1:
         return list(range(lines_min, lines_max + 1))
-    
+
     return [0, 1]
 
 
@@ -226,7 +219,7 @@
     """
     Function to get a line number range working around a known Python bug
     with multi-line strings.
-    
+
     @param node node to extract a line range from
     @type ast.AST
     @return list containing the line number range
@@ -234,35 +227,32 @@
     """
     # deal with multiline strings lineno behavior (Python issue #16806)
     lines = linerange(node)
-    if (
-        hasattr(node, '_securitySibling') and
-        hasattr(node._securitySibling, 'lineno')
-    ):
+    if hasattr(node, "_securitySibling") and hasattr(node._securitySibling, "lineno"):
         start = min(lines)
         delta = node._securitySibling.lineno - start
         if delta > 1:
             return list(range(start, node._securitySibling.lineno))
-    
+
     return lines
 
 
 def escapedBytesRepresentation(b):
     """
     Function to escape bytes for comparison with other strings.
-    
+
     In practice it turns control characters into acceptable codepoints then
     encodes them into bytes again to turn unprintable bytes into printable
     escape sequences.
 
     This is safe to do for the whole range 0..255 and result matches
     unicode_escape on a unicode string.
-    
+
     @param b bytes object to be escaped
     @type bytes
     @return escaped bytes object
     @rtype bytes
     """
-    return b.decode('unicode_escape').encode('unicode_escape')
+    return b.decode("unicode_escape").encode("unicode_escape")
 
 
 def concatString(node, stop=None):
@@ -272,7 +262,7 @@
     This will build a string from a series of ast.Str/ast.Constant nodes
     wrapped in ast.BinOp nodes. Something like "a" + "b" + "c" or "a %s" % val
     etc. The provided node can be any participant in the BinOp chain.
-    
+
     @param node node to be processed
     @type ast.BinOp or ast.Str/ast.Constant
     @param stop base node to stop at
@@ -281,6 +271,7 @@
         value
     @rtype tuple of (ast.AST, str)
     """
+
     def _get(node, bits, stop=None):
         if node != stop:
             bits.append(
@@ -293,27 +284,24 @@
                 if isinstance(node.right, ast.BinOp)
                 else node.right
             )
-    
+
     bits = [node]
     while isinstance(node._securityParent, ast.BinOp):
         node = node._securityParent
     if isinstance(node, ast.BinOp):
         _get(node, bits, stop)
-    
-    return (
-        node,
-        " ".join([x.s for x in bits if AstUtilities.isString(x)])
-    )
+
+    return (node, " ".join([x.s for x in bits if AstUtilities.isString(x)]))
 
 
 def getCalledName(node):
     """
     Function to get the function name from an ast.Call node.
-    
+
     An ast.Call node representing a method call will present differently to one
     wrapping a function call: thing.call() vs call(). This helper will grab the
     unqualified call name correctly in either case.
-    
+
     @param node reference to the call node
     @type ast.Call
     @return function name of the node
@@ -325,5 +313,6 @@
     except AttributeError:
         return ""
 
+
 #
 # eflag: noqa = M601
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,358 +16,375 @@
     "S101": QCoreApplication.translate(
         "Security",
         "Use of 'assert' detected. The enclosed code will be removed when"
-        " compiling to optimised byte code."),
-    
+        " compiling to optimised byte code.",
+    ),
     # exec used
-    "S102": QCoreApplication.translate(
-        "Security",
-        "Use of 'exec' detected."),
-    
+    "S102": QCoreApplication.translate("Security", "Use of 'exec' detected."),
     # bad file permissions
     "S103": QCoreApplication.translate(
-        "Security",
-        "'chmod' setting a permissive mask {0} on file ({1})."),
-    
+        "Security", "'chmod' setting a permissive mask {0} on file ({1})."
+    ),
     # bind to all interfaces
     "S104": QCoreApplication.translate(
-        "Security",
-        "Possible binding to all interfaces."),
-    
+        "Security", "Possible binding to all interfaces."
+    ),
     # hardcoded passwords
     "S105": QCoreApplication.translate(
-        "Security",
-        "Possible hardcoded password: '{0}'"),
+        "Security", "Possible hardcoded password: '{0}'"
+    ),
     "S106": QCoreApplication.translate(
-        "Security",
-        "Possible hardcoded password: '{0}'"),
+        "Security", "Possible hardcoded password: '{0}'"
+    ),
     "S107": QCoreApplication.translate(
-        "Security",
-        "Possible hardcoded password: '{0}'"),
-    
+        "Security", "Possible hardcoded password: '{0}'"
+    ),
     # hardcoded tmp directory
     "S108": QCoreApplication.translate(
-        "Security",
-        "Probable insecure usage of temp file/directory."),
-    
+        "Security", "Probable insecure usage of temp file/directory."
+    ),
     # try-except
-    "S110": QCoreApplication.translate(
-        "Security",
-        "Try, Except, Pass detected."),
-    "S112": QCoreApplication.translate(
-        "Security",
-        "Try, Except, Continue detected."),
-    
+    "S110": QCoreApplication.translate("Security", "Try, Except, Pass detected."),
+    "S112": QCoreApplication.translate("Security", "Try, Except, Continue detected."),
     # flask app
     "S201": QCoreApplication.translate(
         "Security",
         "A Flask app appears to be run with debug=True, which exposes the"
-        " Werkzeug debugger and allows the execution of arbitrary code."),
-    
+        " Werkzeug debugger and allows the execution of arbitrary code.",
+    ),
     # blacklisted calls
     "S301": QCoreApplication.translate(
         "Security",
         "Pickle and modules that wrap it can be unsafe when used to "
-        "deserialize untrusted data, possible security issue."),
+        "deserialize untrusted data, possible security issue.",
+    ),
     "S302": QCoreApplication.translate(
-        "Security",
-        "Deserialization with the marshal module is possibly dangerous."),
+        "Security", "Deserialization with the marshal module is possibly dangerous."
+    ),
     "S303": QCoreApplication.translate(
-        "Security",
-        "Use of insecure MD2, MD4, MD5, or SHA1 hash function."),
+        "Security", "Use of insecure MD2, MD4, MD5, or SHA1 hash function."
+    ),
     "S304": QCoreApplication.translate(
         "Security",
         "Use of insecure cipher '{0}'. Replace with a known secure cipher"
-        " such as AES."),
+        " such as AES.",
+    ),
     "S305": QCoreApplication.translate(
-        "Security",
-        "Use of insecure cipher mode '{0}'."),
+        "Security", "Use of insecure cipher mode '{0}'."
+    ),
     "S306": QCoreApplication.translate(
-        "Security",
-        "Use of insecure and deprecated function (mktemp)."),
+        "Security", "Use of insecure and deprecated function (mktemp)."
+    ),
     "S307": QCoreApplication.translate(
         "Security",
-        "Use of possibly insecure function - consider using safer"
-        " ast.literal_eval."),
+        "Use of possibly insecure function - consider using safer" " ast.literal_eval.",
+    ),
     "S308": QCoreApplication.translate(
         "Security",
         "Use of mark_safe() may expose cross-site scripting vulnerabilities"
-        " and should be reviewed."),
+        " and should be reviewed.",
+    ),
     "S309": QCoreApplication.translate(
         "Security",
         "Use of HTTPSConnection on older versions of Python prior to 2.7.9"
         " and 3.4.3 do not provide security, see"
-        " https://wiki.openstack.org/wiki/OSSN/OSSN-0033"),
+        " https://wiki.openstack.org/wiki/OSSN/OSSN-0033",
+    ),
     "S310": QCoreApplication.translate(
         "Security",
         "Audit url open for permitted schemes. Allowing use of file:/ or"
-        " custom schemes is often unexpected."),
+        " custom schemes is often unexpected.",
+    ),
     "S311": QCoreApplication.translate(
         "Security",
         "Standard pseudo-random generators are not suitable for"
-        " security/cryptographic purposes."),
+        " security/cryptographic purposes.",
+    ),
     "S312": QCoreApplication.translate(
         "Security",
         "Telnet-related functions are being called. Telnet is considered"
-        " insecure. Use SSH or some other encrypted protocol."),
+        " insecure. Use SSH or some other encrypted protocol.",
+    ),
     "S313": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S314": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S315": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S316": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S317": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S318": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S319": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent function"
-        " or make sure defusedxml.defuse_stdlib() is called."),
+        " or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S320": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable to"
         " XML attacks. Replace '{0}' with its defusedxml equivalent"
-        " function."),
+        " function.",
+    ),
     "S321": QCoreApplication.translate(
         "Security",
         "FTP-related functions are being called. FTP is considered insecure."
-        " Use SSH/SFTP/SCP or some other encrypted protocol."),
+        " Use SSH/SFTP/SCP or some other encrypted protocol.",
+    ),
     "S322": QCoreApplication.translate(
         "Security",
         "The input method in Python 2 will read from standard input, evaluate"
         " and run the resulting string as Python source code. This is"
         " similar, though in many ways worse, than using eval. On Python 2,"
-        " use raw_input instead, input is safe in Python 3."),
+        " use raw_input instead, input is safe in Python 3.",
+    ),
     "S323": QCoreApplication.translate(
         "Security",
         "By default, Python will create a secure, verified SSL context for"
         " use in such classes as HTTPSConnection. However, it still allows"
         " using an insecure context via the _create_unverified_context that"
         " reverts to the previous behavior that does not validate"
-        " certificates or perform hostname checks."),
+        " certificates or perform hostname checks.",
+    ),
     "S324": QCoreApplication.translate(
         "Security",
         "Use of os.tempnam() and os.tmpnam() is vulnerable to symlink"
-        " attacks. Consider using tmpfile() instead."),
-    
+        " attacks. Consider using tmpfile() instead.",
+    ),
     # hashlib.new
     "S331": QCoreApplication.translate(
-        "Security",
-        "Use of insecure {0} hash function."),
-    
+        "Security", "Use of insecure {0} hash function."
+    ),
     # blacklisted imports
     "S401": QCoreApplication.translate(
         "Security",
         "A telnet-related module is being imported.  Telnet is considered"
-        " insecure. Use SSH or some other encrypted protocol."),
+        " insecure. Use SSH or some other encrypted protocol.",
+    ),
     "S402": QCoreApplication.translate(
         "Security",
         "A FTP-related module is being imported.  FTP is considered"
-        " insecure. Use SSH/SFTP/SCP or some other encrypted protocol."),
+        " insecure. Use SSH/SFTP/SCP or some other encrypted protocol.",
+    ),
     "S403": QCoreApplication.translate(
         "Security",
-        "Consider possible security implications associated with the '{0}'"
-        " module."),
+        "Consider possible security implications associated with the '{0}'" " module.",
+    ),
     "S404": QCoreApplication.translate(
         "Security",
-        "Consider possible security implications associated with the '{0}'"
-        " module."),
+        "Consider possible security implications associated with the '{0}'" " module.",
+    ),
     "S405": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package, or make sure defusedxml.defuse_stdlib() is called."),
+        " package, or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S406": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package, or make sure defusedxml.defuse_stdlib() is called."),
+        " package, or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S407": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package, or make sure defusedxml.defuse_stdlib() is called."),
+        " package, or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S408": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package, or make sure defusedxml.defuse_stdlib() is called."),
+        " package, or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S409": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package, or make sure defusedxml.defuse_stdlib() is called."),
+        " package, or make sure defusedxml.defuse_stdlib() is called.",
+    ),
     "S410": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Replace '{0}' with the equivalent defusedxml"
-        " package."),
+        " package.",
+    ),
     "S411": QCoreApplication.translate(
         "Security",
         "Using '{0}' to parse untrusted XML data is known to be vulnerable"
         " to XML attacks. Use defused.xmlrpc.monkey_patch() function to"
-        " monkey-patch xmlrpclib and mitigate XML vulnerabilities."),
+        " monkey-patch xmlrpclib and mitigate XML vulnerabilities.",
+    ),
     "S412": QCoreApplication.translate(
         "Security",
-        "Consider possible security implications associated with '{0}'"
-        " module."),
+        "Consider possible security implications associated with '{0}'" " module.",
+    ),
     "S413": QCoreApplication.translate(
         "Security",
         "The pyCrypto library and its module '{0}' are no longer actively"
         " maintained and have been deprecated. Consider using"
-        " pyca/cryptography library."),
-    
+        " pyca/cryptography library.",
+    ),
     # insecure certificate usage
     "S501": QCoreApplication.translate(
         "Security",
         "'requests' call with verify=False disabling SSL certificate checks,"
-        " security issue."),
-    
+        " security issue.",
+    ),
     # insecure SSL/TLS protocol version
     "S502.1": QCoreApplication.translate(
         "Security",
         "'ssl.wrap_socket' call with insecure SSL/TLS protocol version"
-        " identified, security issue."),
+        " identified, security issue.",
+    ),
     "S502.2": QCoreApplication.translate(
         "Security",
         "'SSL.Context' call with insecure SSL/TLS protocol version identified,"
-        " security issue."),
+        " security issue.",
+    ),
     "S502.3": QCoreApplication.translate(
         "Security",
         "Function call with insecure SSL/TLS protocol version identified,"
-        " security issue."),
+        " security issue.",
+    ),
     "S503": QCoreApplication.translate(
         "Security",
         "Function definition identified with insecure SSL/TLS protocol"
-        " version by default, possible security issue."),
+        " version by default, possible security issue.",
+    ),
     "S504": QCoreApplication.translate(
         "Security",
         "'ssl.wrap_socket' call with no SSL/TLS protocol version specified,"
-        " the default 'SSLv23' could be insecure, possible security issue."),
-    
+        " the default 'SSLv23' could be insecure, possible security issue.",
+    ),
     # weak cryptographic keys
     "S505": QCoreApplication.translate(
-        "Security",
-        "{0} key sizes below {1:d} bits are considered breakable."),
-    
+        "Security", "{0} key sizes below {1:d} bits are considered breakable."
+    ),
     # YAML load
     "S506": QCoreApplication.translate(
         "Security",
         "Use of unsafe 'yaml.load()'. Allows instantiation of arbitrary"
-        " objects. Consider 'yaml.safe_load()'."),
-    
+        " objects. Consider 'yaml.safe_load()'.",
+    ),
     # SSH host key verification
     "S507": QCoreApplication.translate(
         "Security",
-        "Paramiko call with policy set to automatically trust the unknown"
-        " host key."),
-    
+        "Paramiko call with policy set to automatically trust the unknown" " host key.",
+    ),
     # Shell injection
     "S601": QCoreApplication.translate(
         "Security",
         "Possible shell injection via 'Paramiko' call, check inputs are"
-        " properly sanitized."),
+        " properly sanitized.",
+    ),
     "S602.L": QCoreApplication.translate(
         "Security",
         "'subprocess' call with shell=True seems safe, but may be changed"
-        " in the future, consider rewriting without shell"),
+        " in the future, consider rewriting without shell",
+    ),
     "S602.H": QCoreApplication.translate(
-        "Security",
-        "'subprocess' call with shell=True identified, security issue."),
+        "Security", "'subprocess' call with shell=True identified, security issue."
+    ),
     "S603": QCoreApplication.translate(
-        "Security",
-        "'subprocess' call - check for execution of untrusted input."),
+        "Security", "'subprocess' call - check for execution of untrusted input."
+    ),
     "S604": QCoreApplication.translate(
         "Security",
         "Function call with shell=True parameter identified, possible"
-        " security issue."),
+        " security issue.",
+    ),
     "S605.L": QCoreApplication.translate(
         "Security",
         "Starting a process with a shell: Seems safe, but may be changed in"
-        " the future, consider rewriting without shell"),
+        " the future, consider rewriting without shell",
+    ),
     "S605.H": QCoreApplication.translate(
         "Security",
         "Starting a process with a shell, possible injection detected,"
-        " security issue."),
+        " security issue.",
+    ),
     "S606": QCoreApplication.translate(
-        "Security",
-        "Starting a process without a shell."),
+        "Security", "Starting a process without a shell."
+    ),
     "S607": QCoreApplication.translate(
-        "Security",
-        "Starting a process with a partial executable path."),
-    
+        "Security", "Starting a process with a partial executable path."
+    ),
     # SQL injection
     "S608": QCoreApplication.translate(
         "Security",
-        "Possible SQL injection vector through string-based query"
-        " construction."),
-    
+        "Possible SQL injection vector through string-based query" " construction.",
+    ),
     # Wildcard injection
     "S609": QCoreApplication.translate(
-        "Security",
-        "Possible wildcard injection in call: {0}"),
-    
+        "Security", "Possible wildcard injection in call: {0}"
+    ),
     # Django SQL injection
     "S610": QCoreApplication.translate(
-        "Security",
-        "Use of 'extra()' opens a potential SQL attack vector."),
+        "Security", "Use of 'extra()' opens a potential SQL attack vector."
+    ),
     "S611": QCoreApplication.translate(
-        "Security",
-        "Use of 'RawSQL()' opens a potential SQL attack vector."),
-    
+        "Security", "Use of 'RawSQL()' opens a potential SQL attack vector."
+    ),
     # Jinja2 templates
     "S701.1": QCoreApplication.translate(
         "Security",
         "Using jinja2 templates with 'autoescape=False' is dangerous and can"
         " lead to XSS. Use 'autoescape=True' or use the 'select_autoescape'"
-        " function to mitigate XSS vulnerabilities."),
+        " function to mitigate XSS vulnerabilities.",
+    ),
     "S701.2": QCoreApplication.translate(
         "Security",
         "By default, jinja2 sets 'autoescape' to False. Consider using"
         " 'autoescape=True' or use the 'select_autoescape' function to"
-        " mitigate XSS vulnerabilities."),
-    
+        " mitigate XSS vulnerabilities.",
+    ),
     # Mako templates
     "S702": QCoreApplication.translate(
         "Security",
         "Mako templates allow HTML/JS rendering by default and are inherently"
         " open to XSS attacks. Ensure variables in all templates are properly"
         " sanitized via the 'n', 'h' or 'x' flags (depending on context). For"
-        " example, to HTML escape the variable 'data' do ${{ data |h }}."),
-    
+        " example, to HTML escape the variable 'data' do ${{ data |h }}.",
+    ),
     # Django XSS vulnerability
     "S703": QCoreApplication.translate(
-        "Security",
-        "Potential XSS on 'mark_safe()' function."),
-    
+        "Security", "Potential XSS on 'mark_safe()' function."
+    ),
     # hardcoded AWS passwords
     "S801": QCoreApplication.translate(
-        "Security",
-        "Possible hardcoded AWS access key ID: {0}"),
+        "Security", "Possible hardcoded AWS access key ID: {0}"
+    ),
     "S802": QCoreApplication.translate(
-        "Security",
-        "Possible hardcoded AWS secret access key: {0}"),
+        "Security", "Possible hardcoded AWS secret access key: {0}"
+    ),
 }
 
 _securityMessagesSampleArgs = {
@@ -375,7 +392,6 @@
     "S105": ["password"],
     "S106": ["password"],
     "S107": ["password"],
-    
     "S304": ["Crypto.Cipher.DES"],
     "S305": ["cryptography.hazmat.primitives.ciphers.modes.ECB"],
     "S313": ["xml.etree.cElementTree.parse"],
@@ -386,9 +402,7 @@
     "S318": ["xml.dom.minidom.parse"],
     "S319": ["xml.dom.pulldom.parse"],
     "S320": ["lxml.etree.parse"],
-    
     "S331": ["MD5"],
-    
     "S403": ["pickle"],
     "S404": ["subprocess"],
     "S405": ["xml.etree.ElementTree"],
@@ -400,11 +414,8 @@
     "S411": ["xmlrpclib"],
     "S412": ["wsgiref.handlers.CGIHandler"],
     "S413": ["Crypto.Cipher"],
-    
     "S505": ["RSA", 2048],
-    
     "S609": ["os.system"],
-    
-    "S801": ["A1B2C3D4E5F6G7H8I9J0"],                           # secok
-    "S802": ["aA1bB2cC3dD4/eE5fF6gG7+hH8iI9jJ0=kKlLM+="],       # secok
+    "S801": ["A1B2C3D4E5F6G7H8I9J0"],  # secok
+    "S802": ["aA1bB2cC3dD4/eE5fF6gG7+hH8iI9jJ0=kKlLM+="],  # secok
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,32 +17,61 @@
     """
     Class implementing a checker for to help simplifying Python code.
     """
+
     Codes = [
         # Python-specifics
-        "Y101", "Y102", "Y103", "Y104", "Y105", "Y106", "Y107", "Y108",
-        "Y109", "Y110", "Y111", "Y112", "Y113", "Y114", "Y115", "Y116",
-        "Y117", "Y118", "Y119", "Y120", "Y121", "Y122",
-       
+        "Y101",
+        "Y102",
+        "Y103",
+        "Y104",
+        "Y105",
+        "Y106",
+        "Y107",
+        "Y108",
+        "Y109",
+        "Y110",
+        "Y111",
+        "Y112",
+        "Y113",
+        "Y114",
+        "Y115",
+        "Y116",
+        "Y117",
+        "Y118",
+        "Y119",
+        "Y120",
+        "Y121",
+        "Y122",
         # Python-specifics not part of flake8-simplify
-        "Y181", "Y182",
-        
+        "Y181",
+        "Y182",
         # Comparations
-        "Y201", "Y202", "Y203", "Y204", "Y205", "Y206", "Y207", "Y208",
-        "Y211", "Y212", "Y213",
-        "Y221", "Y222", "Y223", "Y224",
-        
+        "Y201",
+        "Y202",
+        "Y203",
+        "Y204",
+        "Y205",
+        "Y206",
+        "Y207",
+        "Y208",
+        "Y211",
+        "Y212",
+        "Y213",
+        "Y221",
+        "Y222",
+        "Y223",
+        "Y224",
         # Opinionated
         "Y301",
-        
         # General Code Style
-        "Y401", "Y402",
+        "Y401",
+        "Y402",
     ]
-    
-    def __init__(self, source, filename, tree, selected, ignored, expected,
-                 repeat):
+
+    def __init__(self, source, filename, tree, selected, ignored, expected, repeat):
         """
         Constructor
-        
+
         @param source source code to be checked
         @type list of str
         @param filename name of the source file
@@ -59,22 +88,21 @@
         @type bool
         """
         self.__select = tuple(selected)
-        self.__ignore = ('',) if selected else tuple(ignored)
+        self.__ignore = ("",) if selected else tuple(ignored)
         self.__expected = expected[:]
         self.__repeat = repeat
         self.__filename = filename
         self.__source = source[:]
         self.__tree = copy.deepcopy(tree)
-        
+
         # statistics counters
         self.counters = {}
-        
+
         # collection of detected errors
         self.errors = []
-        
-        self.__checkCodes = (code for code in self.Codes
-                             if not self.__ignoreCode(code))
-    
+
+        self.__checkCodes = (code for code in self.Codes if not self.__ignoreCode(code))
+
     def __ignoreCode(self, code):
         """
         Private method to check if the message code should be ignored.
@@ -84,13 +112,12 @@
         @return flag indicating to ignore the given code
         @rtype bool
         """
-        return (code.startswith(self.__ignore) and
-                not code.startswith(self.__select))
-    
+        return code.startswith(self.__ignore) and not code.startswith(self.__select)
+
     def __error(self, lineNumber, offset, code, *args):
         """
         Private method to record an issue.
-        
+
         @param lineNumber line number of the issue
         @type int
         @param offset position within line of the issue
@@ -102,7 +129,7 @@
         """
         if self.__ignoreCode(code):
             return
-        
+
         # record the issue with one based line number
         errorInfo = {
             "file": self.__filename,
@@ -111,21 +138,21 @@
             "code": code,
             "args": args,
         }
-        
+
         if errorInfo not in self.errors:
             # this issue was not seen before
             if code in self.counters:
                 self.counters[code] += 1
             else:
                 self.counters[code] = 1
-            
+
             # Don't care about expected codes
             if code in self.__expected:
                 return
-            
+
             if code and (self.counters[code] == 1 or self.__repeat):
                 self.errors.append(errorInfo)
-    
+
     def run(self):
         """
         Public method to check the given source against functions
@@ -134,15 +161,15 @@
         if not self.__filename:
             # don't do anything, if essential data is missing
             return
-        
+
         if not self.__checkCodes:
             # don't do anything, if no codes were selected
             return
-        
+
         # Add parent information
         for node in ast.walk(self.__tree):
             for child in ast.iter_child_nodes(node):
                 child.parent = node  # type: ignore
-        
+
         visitor = SimplifyNodeVisitor(self.__error)
         visitor.visit(self.__tree)
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyNodeVisitor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/SimplifyNodeVisitor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -56,45 +56,46 @@
     Class to traverse the AST node tree and check for code that can be
     simplified.
     """
+
     def __init__(self, errorCallback):
         """
         Constructor
-        
+
         @param errorCallback callback function to register an error
         @type func
         """
         super().__init__()
-        
+
         self.__error = errorCallback
-        
+
         self.__classDefinitionStack = []
-    
+
     def visit_Expr(self, node):
         """
         Public method to process an Expr node.
-        
+
         @param node reference to the Expr node
         @type ast.Expr
         """
         self.__check112(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_Assign(self, node):
         """
         Public method to process an Assign node.
-        
+
         @param node reference to the Assign node
         @type ast.Assign
         """
         self.__check181(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_BoolOp(self, node):
         """
         Public method to process a BoolOp node.
-        
+
         @param node reference to the BoolOp node
         @type ast.BoolOp
         """
@@ -104,13 +105,13 @@
         self.__check222(node)
         self.__check223(node)
         self.__check224(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_If(self, node):
         """
         Public method to process an If node.
-        
+
         @param node reference to the If node
         @type ast.If
         """
@@ -121,26 +122,26 @@
         self.__check114(node)
         self.__check116(node)
         self.__check122(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_IfExp(self, node):
         """
         Public method to process an IfExp node.
-        
+
         @param node reference to the IfExp node
         @type ast.IfExp
         """
         self.__check211(node)
         self.__check212(node)
         self.__check213(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_For(self, node):
         """
         Public method to process a For node.
-        
+
         @param node reference to the For node
         @type ast.For
         """
@@ -148,25 +149,25 @@
         self.__check110_111(node)
         self.__check113(node)
         self.__check118(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_Try(self, node):
         """
         Public method to process a Try node.
-        
+
         @param node reference to the Try node
         @type ast.Try
         """
         self.__check105(node)
         self.__check107(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_Call(self, node):
         """
         Public method to process a Call node.
-        
+
         @param node reference to the Call node
         @type ast.Call
         """
@@ -174,53 +175,53 @@
         self.__check182(node)
         self.__check401(node)
         self.__check402(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_With(self, node):
         """
         Public method to process a With node.
-        
+
         @param node reference to the With node
         @type ast.With
         """
         self.__check117(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_Compare(self, node):
         """
         Public method to process a Compare node.
-        
+
         @param node reference to the Compare node
         @type ast.Compare
         """
         self.__check118(node)
         self.__check301(node)
-        
+
         self.generic_visit(node)
-    
+
     def visit_ClassDef(self, node):
         """
         Public method to process a ClassDef node.
-        
+
         @param node reference to the ClassDef node
         @type ast.ClassDef
         """
         # register the name of the class being defined
         self.__classDefinitionStack.append(node.name)
-        
+
         self.__check119(node)
         self.__check120_121(node)
-        
+
         self.generic_visit(node)
-        
+
         self.__classDefinitionStack.pop()
-    
+
     def visit_UnaryOp(self, node):
         """
         Public method to process a UnaryOp node.
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
@@ -232,25 +233,25 @@
         self.__check206(node)
         self.__check207(node)
         self.__check208(node)
-        
+
         self.generic_visit(node)
-    
+
     #############################################################
     ## Helper methods for the various checkers below
     #############################################################
-    
+
     def __getDuplicatedIsinstanceCall(self, node):
         """
         Private method to get a list of isinstance arguments which could
         be combined.
-        
+
         @param node reference to the AST node to be inspected
         @type ast.BoolOp
         @return list of variable names of duplicated isinstance calls
         @rtype list of str
         """
         counter = collections.defaultdict(int)
-        
+
         for call in node.values:
             # Ensure this is a call of the built-in isinstance() function.
             if not isinstance(call, ast.Call) or len(call.args) != 2:
@@ -258,35 +259,35 @@
             functionName = unparse(call.func)
             if functionName != "isinstance":
                 continue
-            
+
             arg0Name = unparse(call.args[0])
             counter[arg0Name] += 1
-        
+
         return [name for name, count in counter.items() if count > 1]
-    
+
     def __isConstantIncrease(self, expression):
         """
         Private method check the given expression for being a constant
         increase.
-        
+
         @param expression reference to the expression node
         @type ast.AugAssign
         @return flag indicating a constant increase
         @rtype bool
         """
-        return (
-            isinstance(expression.op, ast.Add) and (
-                (isinstance(expression.value, ast.Constant) and
-                 isinstance(expression.value.value, int)) or
-                isinstance(expression.value, ast.Num)
+        return isinstance(expression.op, ast.Add) and (
+            (
+                isinstance(expression.value, ast.Constant)
+                and isinstance(expression.value.value, int)
             )
+            or isinstance(expression.value, ast.Num)
         )
-    
+
     def __getIfBodyPairs(self, node):
         """
         Private method to extract a list of pairs of test and body for an
         If node.
-        
+
         @param node reference to the If node to be processed
         @type ast.If
         @return list of pairs of test and body
@@ -295,18 +296,18 @@
         pairs = [(node.test, node.body)]
         orelse = node.orelse
         while (
-            isinstance(orelse, list) and
-            len(orelse) == 1 and
-            isinstance(orelse[0], ast.If)
+            isinstance(orelse, list)
+            and len(orelse) == 1
+            and isinstance(orelse[0], ast.If)
         ):
             pairs.append((orelse[0].test, orelse[0].body))
             orelse = orelse[0].orelse
         return pairs
-    
+
     def __isSameBody(self, body1, body2):
         """
         Private method check, if the given bodies are equivalent.
-        
+
         @param body1 list of statements of the first body
         @type list of ast.stmt
         @param body2 list of statements of the second body
@@ -323,13 +324,13 @@
                 statementEqual = False
             if not statementEqual:
                 return False
-        
+
         return True
-    
+
     def __isSameExpression(self, a, b):
         """
         Private method to check, if two expressions are equal.
-        
+
         @param a first expression to be checked
         @type ast.expr
         @param b second expression to be checked
@@ -341,11 +342,11 @@
             return a.id == b.id
         else:
             return False
-    
+
     def __isStatementEqual(self, a, b):
         """
         Private method to check, if two statements are equal.
-        
+
         @param a reference to the first statement
         @type ast.stmt
         @param b reference to the second statement
@@ -355,11 +356,10 @@
         """
         if type(a) is not type(b):
             return False
-        
+
         if isinstance(a, ast.AST):
             for k, v in vars(a).items():
-                if k in ("lineno", "col_offset", "ctx", "end_lineno",
-                         "parent"):
+                if k in ("lineno", "col_offset", "ctx", "end_lineno", "parent"):
                     continue
                 if not self.__isStatementEqual(v, getattr(b, k)):
                     return False
@@ -368,24 +368,22 @@
             return all(itertools.starmap(self.__isStatementEqual, zip(a, b)))
         else:
             return a == b
-    
+
     def __isExceptionCheck(self, node):
         """
         Private method to check, if the node is checking an exception.
-        
+
         @param node reference to the node to be checked
         @type ast.If
         @return flag indicating an exception check
         @rtype bool
         """
-        return (
-            len(node.body) == 1 and isinstance(node.body[0], ast.Raise)
-        )
-    
+        return len(node.body) == 1 and isinstance(node.body[0], ast.Raise)
+
     def __negateTest(self, node):
         """
         Private method negate the given Compare node.
-        
+
         @param node reference to the node to be negated
         @type ast.Compare
         @return node with negated logic
@@ -415,50 +413,49 @@
             op = ast.In()
         newNode.ops = [op]
         return newNode
-    
+
     #############################################################
     ## Methods to check for possible code simplifications below
     #############################################################
-    
+
     def __check101(self, node):
         """
         Private method to check for duplicate isinstance() calls.
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
         if isinstance(node.op, ast.Or):
             for variable in self.__getDuplicatedIsinstanceCall(node):
-                self.__error(node.lineno - 1, node.col_offset, "Y101",
-                             variable)
-    
+                self.__error(node.lineno - 1, node.col_offset, "Y101", variable)
+
     def __check102(self, node):
         """
         Private method to check for nested if statements without else blocks.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
         # Don't treat 'if __name__ == "__main__":' as an issue.
         if (
-            isinstance(node.test, ast.Compare) and
-            isinstance(node.test.left, ast.Name) and
-            node.test.left.id == "__name__" and
-            isinstance(node.test.ops[0], ast.Eq) and
-            isinstance(node.test.comparators[0], ast.Constant) and
-            node.test.comparators[0].value == "__main__"
+            isinstance(node.test, ast.Compare)
+            and isinstance(node.test.left, ast.Name)
+            and node.test.left.id == "__name__"
+            and isinstance(node.test.ops[0], ast.Eq)
+            and isinstance(node.test.comparators[0], ast.Constant)
+            and node.test.comparators[0].value == "__main__"
         ):
             return
-        
+
         # ## Pattern 1
         # if a: <---
         #     if b: <---
         #         c
         isPattern1 = (
-            node.orelse == [] and
-            len(node.body) == 1 and
-            isinstance(node.body[0], ast.If) and
-            node.body[0].orelse == []
+            node.orelse == []
+            and len(node.body) == 1
+            and isinstance(node.body[0], ast.If)
+            and node.body[0].orelse == []
         )
         # ## Pattern 2
         # if a: < irrelevant for here
@@ -468,12 +465,12 @@
         #         d
         if isPattern1:
             self.__error(node.lineno - 1, node.col_offset, "Y102")
-    
+
     def __check103(self, node):
         """
         Private method to check for calls that wrap a condition to return
         a bool.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
@@ -482,49 +479,48 @@
         # else:
         #     return False
         if not (
-            len(node.body) != 1 or
-            not isinstance(node.body[0], ast.Return) or
-            not isinstance(node.body[0].value, BOOL_CONST_TYPES) or
-            not (
-                node.body[0].value.value is True or
-                node.body[0].value.value is False
-            ) or
-            len(node.orelse) != 1 or
-            not isinstance(node.orelse[0], ast.Return) or
-            not isinstance(node.orelse[0].value, BOOL_CONST_TYPES) or
-            not (
-                node.orelse[0].value.value is True or
-                node.orelse[0].value.value is False
+            len(node.body) != 1
+            or not isinstance(node.body[0], ast.Return)
+            or not isinstance(node.body[0].value, BOOL_CONST_TYPES)
+            or not (
+                node.body[0].value.value is True or node.body[0].value.value is False
+            )
+            or len(node.orelse) != 1
+            or not isinstance(node.orelse[0], ast.Return)
+            or not isinstance(node.orelse[0].value, BOOL_CONST_TYPES)
+            or not (
+                node.orelse[0].value.value is True
+                or node.orelse[0].value.value is False
             )
         ):
             condition = unparse(node.test)
             self.__error(node.lineno - 1, node.col_offset, "Y103", condition)
-    
+
     def __check104(self, node):
         """
         Private method to check for "iterate and yield" patterns.
-        
+
         @param node reference to the AST node to be checked
         @type ast.For
         """
         # for item in iterable:
         #     yield item
         if not (
-            len(node.body) != 1 or
-            not isinstance(node.body[0], ast.Expr) or
-            not isinstance(node.body[0].value, ast.Yield) or
-            not isinstance(node.target, ast.Name) or
-            not isinstance(node.body[0].value.value, ast.Name) or
-            node.target.id != node.body[0].value.value.id or
-            node.orelse != []
+            len(node.body) != 1
+            or not isinstance(node.body[0], ast.Expr)
+            or not isinstance(node.body[0].value, ast.Yield)
+            or not isinstance(node.target, ast.Name)
+            or not isinstance(node.body[0].value.value, ast.Name)
+            or node.target.id != node.body[0].value.value.id
+            or node.orelse != []
         ):
             iterable = unparse(node.iter)
             self.__error(node.lineno - 1, node.col_offset, "Y104", iterable)
-    
+
     def __check105(self, node):
         """
         Private method to check for "try-except-pass" patterns.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Try
         """
@@ -533,25 +529,24 @@
         # except ValueError:
         #     pass
         if not (
-            len(node.handlers) != 1 or
-            not isinstance(node.handlers[0], ast.ExceptHandler) or
-            len(node.handlers[0].body) != 1 or
-            not isinstance(node.handlers[0].body[0], ast.Pass) or
-            node.orelse != []
+            len(node.handlers) != 1
+            or not isinstance(node.handlers[0], ast.ExceptHandler)
+            or len(node.handlers[0].body) != 1
+            or not isinstance(node.handlers[0].body[0], ast.Pass)
+            or node.orelse != []
         ):
             if node.handlers[0].type is None:
                 exception = "Exception"
             elif isinstance(node.handlers[0].type, ast.Tuple):
-                exception = ", ".join(
-                    [unparse(n) for n in node.handlers[0].type.elts])
+                exception = ", ".join([unparse(n) for n in node.handlers[0].type.elts])
             else:
                 exception = unparse(node.handlers[0].type)
             self.__error(node.lineno - 1, node.col_offset, "Y105", exception)
-    
+
     def __check106(self, node):
         """
         Private method to check for calls where an exception is raised in else.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
@@ -560,25 +555,25 @@
         # else:
         #     raise Exception
         just_one = (
-            len(node.body) == 1 and
-            len(node.orelse) >= 1 and
-            isinstance(node.orelse[-1], ast.Raise) and
-            not isinstance(node.body[-1], ast.Raise)
+            len(node.body) == 1
+            and len(node.orelse) >= 1
+            and isinstance(node.orelse[-1], ast.Raise)
+            and not isinstance(node.body[-1], ast.Raise)
         )
         many = (
-            len(node.body) > 2 * len(node.orelse) and
-            len(node.orelse) >= 1 and
-            isinstance(node.orelse[-1], ast.Raise) and
-            not isinstance(node.body[-1], ast.Raise)
+            len(node.body) > 2 * len(node.orelse)
+            and len(node.orelse) >= 1
+            and isinstance(node.orelse[-1], ast.Raise)
+            and not isinstance(node.body[-1], ast.Raise)
         )
         if just_one or many:
             self.__error(node.lineno - 1, node.col_offset, "Y106")
-    
+
     def __check107(self, node):
         """
         Private method to check for calls where try/except and finally have
         'return'.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Try
         """
@@ -611,18 +606,17 @@
                 break
 
         if (
-            (tryHasReturn or exceptHasReturn) and
-            finallyHasReturn and
-            finallyReturn is not None
+            (tryHasReturn or exceptHasReturn)
+            and finallyHasReturn
+            and finallyReturn is not None
         ):
-            self.__error(finallyReturn.lineno - 1,
-                         finallyReturn.col_offset, "Y107")
-    
+            self.__error(finallyReturn.lineno - 1, finallyReturn.col_offset, "Y107")
+
     def __check108(self, node):
         """
         Private method to check for if-elses which could be a ternary
         operator assignment.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
@@ -639,30 +633,31 @@
         # else:
         #     b = d
         if (
-            len(node.body) == 1 and
-            len(node.orelse) == 1 and
-            isinstance(node.body[0], ast.Assign) and
-            isinstance(node.orelse[0], ast.Assign) and
-            len(node.body[0].targets) == 1 and
-            len(node.orelse[0].targets) == 1 and
-            isinstance(node.body[0].targets[0], ast.Name) and
-            isinstance(node.orelse[0].targets[0], ast.Name) and
-            node.body[0].targets[0].id == node.orelse[0].targets[0].id and
-            not isinstance(node.parent, ast.If)
+            len(node.body) == 1
+            and len(node.orelse) == 1
+            and isinstance(node.body[0], ast.Assign)
+            and isinstance(node.orelse[0], ast.Assign)
+            and len(node.body[0].targets) == 1
+            and len(node.orelse[0].targets) == 1
+            and isinstance(node.body[0].targets[0], ast.Name)
+            and isinstance(node.orelse[0].targets[0], ast.Name)
+            and node.body[0].targets[0].id == node.orelse[0].targets[0].id
+            and not isinstance(node.parent, ast.If)
         ):
             assign = unparse(node.body[0].targets[0])
             body = unparse(node.body[0].value)
             cond = unparse(node.test)
             orelse = unparse(node.orelse[0].value)
-            
-            self.__error(node.lineno - 1, node.col_offset, "Y108",
-                         assign, body, cond, orelse)
-    
+
+            self.__error(
+                node.lineno - 1, node.col_offset, "Y108", assign, body, cond, orelse
+            )
+
     def __check109(self, node):
         """
         Private method to check for multiple equalities with the same value
         are combined via "or".
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
@@ -672,18 +667,15 @@
             equalities = [
                 value
                 for value in node.values
-                if isinstance(value, ast.Compare) and
-                len(value.ops) == 1 and
-                isinstance(value.ops[0], ast.Eq)
+                if isinstance(value, ast.Compare)
+                and len(value.ops) == 1
+                and isinstance(value.ops[0], ast.Eq)
             ]
             ids = []  # (name, compared_to)
             for eq in equalities:
                 if isinstance(eq.left, ast.Name):
                     ids.append((eq.left, eq.comparators[0]))
-                if (
-                    len(eq.comparators) == 1 and
-                    isinstance(eq.comparators[0], ast.Name)
-                ):
+                if len(eq.comparators) == 1 and isinstance(eq.comparators[0], ast.Name):
                     ids.append((eq.comparators[0], eq.left))
 
             id2count = {}
@@ -694,15 +686,20 @@
             for value, values in id2count.items():
                 if len(values) == 1:
                     continue
-                
-                self.__error(node.lineno - 1, node.col_offset, "Y109",
-                             value, unparse(ast.Tuple(elts=values)),
-                             unparse(node))
-    
+
+                self.__error(
+                    node.lineno - 1,
+                    node.col_offset,
+                    "Y109",
+                    value,
+                    unparse(ast.Tuple(elts=values)),
+                    unparse(node),
+                )
+
     def __check110_111(self, node):
         """
         Private method to check if any / all could be used.
-        
+
         @param node reference to the AST node to be checked
         @type ast.For
         """
@@ -716,48 +713,50 @@
         #         return False
         # return True
         if (
-            len(node.body) == 1 and
-            isinstance(node.body[0], ast.If) and
-            len(node.body[0].body) == 1 and
-            isinstance(node.body[0].body[0], ast.Return) and
-            isinstance(node.body[0].body[0].value, BOOL_CONST_TYPES) and
-            hasattr(node.body[0].body[0].value, "value")
+            len(node.body) == 1
+            and isinstance(node.body[0], ast.If)
+            and len(node.body[0].body) == 1
+            and isinstance(node.body[0].body[0], ast.Return)
+            and isinstance(node.body[0].body[0].value, BOOL_CONST_TYPES)
+            and hasattr(node.body[0].body[0].value, "value")
         ):
             check = unparse(node.body[0].test)
             target = unparse(node.target)
             iterable = unparse(node.iter)
             if node.body[0].body[0].value.value is True:
-                self.__error(node.lineno - 1, node.col_offset, "Y110",
-                             check, target, iterable)
+                self.__error(
+                    node.lineno - 1, node.col_offset, "Y110", check, target, iterable
+                )
             elif node.body[0].body[0].value.value is False:
                 check = "not " + check
                 if check.startswith("not not "):
-                    check = check[len("not not "):]
-                self.__error(node.lineno - 1, node.col_offset, "Y111",
-                             check, target, iterable)
-    
+                    check = check[len("not not ") :]
+                self.__error(
+                    node.lineno - 1, node.col_offset, "Y111", check, target, iterable
+                )
+
     def __check112(self, node):
         """
         Private method to check for non-capitalized calls to environment
         variables.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Expr
         """
         # os.environ["foo"]
         # os.environ.get("bar")
         isIndexCall = (
-            isinstance(node.value, ast.Subscript) and
-            isinstance(node.value.value, ast.Attribute) and
-            isinstance(node.value.value.value, ast.Name) and
-            node.value.value.value.id == "os" and
-            node.value.value.attr == "environ" and
-            (
+            isinstance(node.value, ast.Subscript)
+            and isinstance(node.value.value, ast.Attribute)
+            and isinstance(node.value.value.value, ast.Name)
+            and node.value.value.value.id == "os"
+            and node.value.value.attr == "environ"
+            and (
                 (
-                    isinstance(node.value.slice, ast.Index) and
-                    isinstance(node.value.slice.value, STR_TYPES)
-                ) or
-                isinstance(node.value.slice, ast.Constant)
+                    isinstance(node.value.slice, ast.Index)
+                    and isinstance(node.value.slice.value, STR_TYPES)
+                )
+                or isinstance(node.value.slice, ast.Constant)
             )
         )
         if isIndexCall:
@@ -778,15 +777,15 @@
             hasChange = envName != envName.upper()
 
         isGetCall = (
-            isinstance(node.value, ast.Call) and
-            isinstance(node.value.func, ast.Attribute) and
-            isinstance(node.value.func.value, ast.Attribute) and
-            isinstance(node.value.func.value.value, ast.Name) and
-            node.value.func.value.value.id == "os" and
-            node.value.func.value.attr == "environ" and
-            node.value.func.attr == "get" and
-            len(node.value.args) in [1, 2] and
-            isinstance(node.value.args[0], STR_TYPES)
+            isinstance(node.value, ast.Call)
+            and isinstance(node.value.func, ast.Attribute)
+            and isinstance(node.value.func.value, ast.Attribute)
+            and isinstance(node.value.func.value.value, ast.Name)
+            and node.value.func.value.value.id == "os"
+            and node.value.func.value.attr == "environ"
+            and node.value.func.attr == "get"
+            and len(node.value.args) in [1, 2]
+            and isinstance(node.value.args[0], STR_TYPES)
         )
         if isGetCall:
             call = node.value
@@ -808,20 +807,17 @@
                 expected = f"os.environ.get('{envName.upper()}')"
             else:
                 defaultValue = unparse(node.value.args[1])
-                expected = (
-                    f"os.environ.get('{envName.upper()}', '{defaultValue}')"
-                )
+                expected = f"os.environ.get('{envName.upper()}', '{defaultValue}')"
         else:
             return
-        
-        self.__error(node.lineno - 1, node.col_offset, "Y112", expected,
-                     original)
-    
+
+        self.__error(node.lineno - 1, node.col_offset, "Y112", expected, original)
+
     def __check113(self, node):
         """
         Private method to check for loops in which "enumerate" should be
         used.
-        
+
         @param node reference to the AST node to be checked
         @type ast.For
         """
@@ -832,21 +828,22 @@
         variableCandidates = []
         for expression in node.body:
             if (
-                isinstance(expression, ast.AugAssign) and
-                self.__isConstantIncrease(expression) and
-                isinstance(expression.target, ast.Name)
+                isinstance(expression, ast.AugAssign)
+                and self.__isConstantIncrease(expression)
+                and isinstance(expression.target, ast.Name)
             ):
                 variableCandidates.append(expression.target)
 
         for candidate in variableCandidates:
-            self.__error(candidate.lineno - 1, candidate.col_offset, "Y113",
-                         unparse(candidate))
-    
+            self.__error(
+                candidate.lineno - 1, candidate.col_offset, "Y113", unparse(candidate)
+            )
+
     def __check114(self, node):
         """
         Private method to check for alternative if clauses with identical
         bodies.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
@@ -860,37 +857,42 @@
             if self.__isSameBody(ifbody1[1], ifbody2[1]):
                 errorPairs.append((ifbody1, ifbody2))
         for ifbody1, ifbody2 in errorPairs:
-            self.__error(ifbody1[0].lineno - 1, ifbody1[0].col_offset, "Y114",
-                         unparse(ifbody1[0]), unparse(ifbody2[0]))
-    
+            self.__error(
+                ifbody1[0].lineno - 1,
+                ifbody1[0].col_offset,
+                "Y114",
+                unparse(ifbody1[0]),
+                unparse(ifbody2[0]),
+            )
+
     def __check115(self, node):
         """
         Private method to to check for places where open() is called without
         a context handler.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Call
         """
         # f = open(...)
-        #. ..  # (do something with f)
+        # . ..  # (do something with f)
         # f.close()
         if (
-            isinstance(node.func, ast.Name) and
-            node.func.id == "open" and
-            not isinstance(node.parent, ast.withitem)
+            isinstance(node.func, ast.Name)
+            and node.func.id == "open"
+            and not isinstance(node.parent, ast.withitem)
         ):
             self.__error(node.lineno - 1, node.col_offset, "Y115")
-    
+
     def __check116(self, node):
         """
         Private method to check for places with 3 or more consecutive
         if-statements with direct returns.
-        
+
         * Each if-statement must be a check for equality with the
           same variable
         * Each if-statement must just have a "return"
         * Else must also just have a return
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
@@ -903,16 +905,16 @@
         # else:
         #    return 42
         if (
-            isinstance(node.test, ast.Compare) and
-            isinstance(node.test.left, ast.Name) and
-            len(node.test.ops) == 1 and
-            isinstance(node.test.ops[0], ast.Eq) and
-            len(node.test.comparators) == 1 and
-            isinstance(node.test.comparators[0], AST_CONST_TYPES) and
-            len(node.body) == 1 and
-            isinstance(node.body[0], ast.Return) and
-            len(node.orelse) == 1 and
-            isinstance(node.orelse[0], ast.If)
+            isinstance(node.test, ast.Compare)
+            and isinstance(node.test.left, ast.Name)
+            and len(node.test.ops) == 1
+            and isinstance(node.test.ops[0], ast.Eq)
+            and len(node.test.comparators) == 1
+            and isinstance(node.test.comparators[0], AST_CONST_TYPES)
+            and len(node.body) == 1
+            and isinstance(node.body[0], ast.Return)
+            and len(node.orelse) == 1
+            and isinstance(node.orelse[0], ast.If)
         ):
             variable = node.test.left
             child = node.orelse[0]
@@ -922,32 +924,28 @@
             else:
                 bodyValueStr = "None"
             if isinstance(node.test.comparators[0], ast.Str):
-                keyValuePairs = {
-                    node.test.comparators[0].s: bodyValueStr
-                }
+                keyValuePairs = {node.test.comparators[0].s: bodyValueStr}
             elif isinstance(node.test.comparators[0], ast.Num):
                 keyValuePairs = {
                     node.test.comparators[0].n: bodyValueStr,
                 }
             else:
-                keyValuePairs = {
-                    node.test.comparators[0].value: bodyValueStr
-                }
+                keyValuePairs = {node.test.comparators[0].value: bodyValueStr}
             while child:
                 if not (
-                    isinstance(child.test, ast.Compare) and
-                    isinstance(child.test.left, ast.Name) and
-                    child.test.left.id == variable.id and
-                    len(child.test.ops) == 1 and
-                    isinstance(child.test.ops[0], ast.Eq) and
-                    len(child.test.comparators) == 1 and
-                    isinstance(child.test.comparators[0], AST_CONST_TYPES) and
-                    len(child.body) == 1 and
-                    isinstance(child.body[0], ast.Return) and
-                    len(child.orelse) <= 1
+                    isinstance(child.test, ast.Compare)
+                    and isinstance(child.test.left, ast.Name)
+                    and child.test.left.id == variable.id
+                    and len(child.test.ops) == 1
+                    and isinstance(child.test.ops[0], ast.Eq)
+                    and len(child.test.comparators) == 1
+                    and isinstance(child.test.comparators[0], AST_CONST_TYPES)
+                    and len(child.body) == 1
+                    and isinstance(child.body[0], ast.Return)
+                    and len(child.orelse) <= 1
                 ):
                     return
-                
+
                 if isinstance(child.test.comparators[0], ast.Str):
                     key = child.test.comparators[0].s
                 elif isinstance(child.test.comparators[0], ast.Num):
@@ -965,41 +963,38 @@
                         return
                 else:
                     child = None
-            
+
             if len(keyValuePairs) < 3:
                 return
-            
+
             if elseValue:
                 ret = f"{keyValuePairs}.get({variable.id}, {elseValue})"
             else:
                 ret = f"{keyValuePairs}.get({variable.id})"
-            
+
             self.__error(node.lineno - 1, node.col_offset, "Y116", ret)
-    
+
     def __check117(self, node):
         """
         Private method to check for multiple with-statements with same scope.
-        
+
         @param node reference to the AST node to be checked
         @type ast.With
         """
         # with A() as a:
         #     with B() as b:
         #         print("hello")
-        if (
-            len(node.body) == 1 and
-            isinstance(node.body[0], ast.With)
-        ):
+        if len(node.body) == 1 and isinstance(node.body[0], ast.With):
             withItems = []
             for withitem in node.items + node.body[0].items:
                 withItems.append(f"{unparse(withitem)}")
             mergedWith = f"with {', '.join(withItems)}:"
             self.__error(node.lineno - 1, node.col_offset, "Y117", mergedWith)
-    
+
     def __check118(self, node):
         """
         Private method to check for usages of "key in dict.keys()".
-        
+
         @param node reference to the AST node to be checked
         @type ast.Compare or ast.For
         """
@@ -1013,47 +1008,41 @@
         # for key in dict.keys():
         #     # do something
         if (
-            isinstance(node, ast.Compare) and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], ast.In) and
-            len(node.comparators) == 1
+            isinstance(node, ast.Compare)
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], ast.In)
+            and len(node.comparators) == 1
         ):
             callNode = node.comparators[0]
-        elif (
-            isinstance(node, ast.For)
-        ):
+        elif isinstance(node, ast.For):
             callNode = node.iter
         else:
             callNode = None
-        
+
         if not isinstance(callNode, ast.Call):
             return
-        
+
         attrNode = callNode.func
         if (
-            isinstance(callNode.func, ast.Attribute) and
-            callNode.func.attr == "keys" and
-            isinstance(callNode.func.ctx, ast.Load)
+            isinstance(callNode.func, ast.Attribute)
+            and callNode.func.attr == "keys"
+            and isinstance(callNode.func.ctx, ast.Load)
         ):
             if isinstance(node, ast.Compare):
                 keyStr = unparse(node.left)
             else:
                 keyStr = unparse(node.target)
             dictStr = unparse(attrNode.value)
-            self.__error(node.lineno - 1, node.col_offset, "Y118",
-                         keyStr, dictStr)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y118", keyStr, dictStr)
+
     def __check119(self, node):
         """
         Private method to check for classes that should be "dataclasses".
-        
+
         @param node reference to the AST node to be checked
         @type ast.ClassDef
         """
-        if (
-            len(node.decorator_list) == 0 and
-            len(node.bases) == 0
-        ):
+        if len(node.decorator_list) == 0 and len(node.bases) == 0:
             dataclassFunctions = [
                 "__init__",
                 "__eq__",
@@ -1064,341 +1053,337 @@
             hasOnlyConstructorMethod = True
             for bodyElement in node.body:
                 if (
-                    isinstance(bodyElement, ast.FunctionDef) and
-                    bodyElement.name not in dataclassFunctions
+                    isinstance(bodyElement, ast.FunctionDef)
+                    and bodyElement.name not in dataclassFunctions
                 ):
                     hasOnlyConstructorMethod = False
                     break
 
             if (
-                hasOnlyConstructorMethod and
-                sum(1 for el in node.body
-                    if isinstance(el, ast.FunctionDef)) > 0
+                hasOnlyConstructorMethod
+                and sum(1 for el in node.body if isinstance(el, ast.FunctionDef)) > 0
             ):
-                self.__error(node.lineno - 1, node.col_offset, "Y119",
-                             node.name)
-    
+                self.__error(node.lineno - 1, node.col_offset, "Y119", node.name)
+
     def __check120_121(self, node):
         """
         Private method to check for classes that inherit from object.
-        
+
         @param node reference to the AST node to be checked
         @type ast.ClassDef
         """
         # class FooBar(object):
         #     ...
         if (
-            len(node.bases) == 1 and
-            isinstance(node.bases[0], ast.Name) and
-            node.bases[0].id == "object"
+            len(node.bases) == 1
+            and isinstance(node.bases[0], ast.Name)
+            and node.bases[0].id == "object"
         ):
-            self.__error(node.lineno - 1, node.col_offset, "Y120",
-                         node.name)
-        
+            self.__error(node.lineno - 1, node.col_offset, "Y120", node.name)
+
         elif (
-            len(node.bases) > 1 and
-            isinstance(node.bases[-1], ast.Name) and
-            node.bases[-1].id == "object"
+            len(node.bases) > 1
+            and isinstance(node.bases[-1], ast.Name)
+            and node.bases[-1].id == "object"
         ):
-            self.__error(node.lineno - 1, node.col_offset, "Y121",
-                         node.name, ", ".join(b.id for b in node.bases[:-1]))
-    
+            self.__error(
+                node.lineno - 1,
+                node.col_offset,
+                "Y121",
+                node.name,
+                ", ".join(b.id for b in node.bases[:-1]),
+            )
+
     def __check122(self, node):
         """
         Private method to check for all if-blocks which only check if a key
         is in a dictionary.
-        
+
         @param node reference to the AST node to be checked
         @type ast.If
         """
         if (
-            isinstance(node.test, ast.Compare) and
-            len(node.test.ops) == 1 and
-            isinstance(node.test.ops[0], ast.In) and
-            len(node.body) == 1 and
-            len(node.orelse) == 0
+            isinstance(node.test, ast.Compare)
+            and len(node.test.ops) == 1
+            and isinstance(node.test.ops[0], ast.In)
+            and len(node.body) == 1
+            and len(node.orelse) == 0
         ) and (
             # We might still be left with a check if a value is in a list or
             # in the body the developer might remove the element from the list.
             # We need to have a look at the body.
-            isinstance(node.body[0], ast.Assign) and
-            isinstance(node.body[0].value, ast.Subscript) and
-            len(node.body[0].targets) == 1 and
-            isinstance(node.body[0].targets[0], ast.Name) and
-            isinstance(node.body[0].value.value, ast.Name) and
-            isinstance(node.test.comparators[0], ast.Name) and
-            node.body[0].value.value.id == node.test.comparators[0].id
+            isinstance(node.body[0], ast.Assign)
+            and isinstance(node.body[0].value, ast.Subscript)
+            and len(node.body[0].targets) == 1
+            and isinstance(node.body[0].targets[0], ast.Name)
+            and isinstance(node.body[0].value.value, ast.Name)
+            and isinstance(node.test.comparators[0], ast.Name)
+            and node.body[0].value.value.id == node.test.comparators[0].id
         ):
             key = unparse(node.test.left)
             dictname = unparse(node.test.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y122",
-                         dictname, key)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y122", dictname, key)
+
     def __check181(self, node):
         """
         Private method to check for assignments that could be converted into
         an augmented assignment.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Assign
         """
         # a = a - b
         if (
-            len(node.targets) == 1 and
-            isinstance(node.targets[0], ast.Name) and
-            isinstance(node.value, ast.BinOp) and
-            isinstance(node.value.left, ast.Name) and
-            node.value.left.id == node.targets[0].id and
-            not isinstance(node.value.right, ast.Tuple)
+            len(node.targets) == 1
+            and isinstance(node.targets[0], ast.Name)
+            and isinstance(node.value, ast.BinOp)
+            and isinstance(node.value.left, ast.Name)
+            and node.value.left.id == node.targets[0].id
+            and not isinstance(node.value.right, ast.Tuple)
         ):
-            newNode = ast.AugAssign(node.targets[0], node.value.op,
-                                    node.value.right)
-            self.__error(node.lineno - 1, node.col_offset, "Y181",
-                         unparse(newNode), unparse(node))
-    
+            newNode = ast.AugAssign(node.targets[0], node.value.op, node.value.right)
+            self.__error(
+                node.lineno - 1,
+                node.col_offset,
+                "Y181",
+                unparse(newNode),
+                unparse(node),
+            )
+
     def __check182(self, node):
         """
         Private method to check for calls of type 'super()' that could
         be shortened to 'super()'.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Call
         """
         # super()
         if (
-            self.__classDefinitionStack and
-            isinstance(node.func, ast.Name) and
-            node.func.id == "super" and
-            len(node.args) == 2 and
-            all(isinstance(arg, ast.Name) for arg in node.args) and
-            node.args[0].id == self.__classDefinitionStack[-1] and
-            node.args[1].id == "self"
+            self.__classDefinitionStack
+            and isinstance(node.func, ast.Name)
+            and node.func.id == "super"
+            and len(node.args) == 2
+            and all(isinstance(arg, ast.Name) for arg in node.args)
+            and node.args[0].id == self.__classDefinitionStack[-1]
+            and node.args[1].id == "self"
         ):
-            self.__error(node.lineno - 1, node.col_offset, "Y182",
-                         unparse(node))
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y182", unparse(node))
+
     def __check201(self, node):
         """
         Private method to check for calls where an unary 'not' is used for
         an unequality.
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a == b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.Eq)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.Eq)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y201",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y201", left, right)
+
     def __check202(self, node):
         """
         Private method to check for calls where an unary 'not' is used for
         an equality.
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a != b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.NotEq)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.NotEq)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y202",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y202", left, right)
+
     def __check203(self, node):
         """
         Private method to check for calls where an unary 'not' is used for
         an in-check.
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a in b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.In)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.In)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y203",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y203", left, right)
+
     def __check204(self, node):
         """
         Private method to check for calls of the type "not (a < b)".
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a < b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.Lt)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.Lt)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y204",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y204", left, right)
+
     def __check205(self, node):
         """
         Private method to check for calls of the type "not (a <= b)".
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a <= b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.LtE)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.LtE)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y205",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y205", left, right)
+
     def __check206(self, node):
         """
         Private method to check for calls of the type "not (a > b)".
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a > b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.Gt)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.Gt)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y206",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y206", left, right)
+
     def __check207(self, node):
         """
         Private method to check for calls of the type "not (a >= b)".
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not a >= b
         if not (
             (
-                not isinstance(node.op, ast.Not) or
-                not isinstance(node.operand, ast.Compare) or
-                len(node.operand.ops) != 1 or
-                not isinstance(node.operand.ops[0], ast.GtE)
-            ) or
-            isinstance(node.parent, ast.If) and
-            self.__isExceptionCheck(node.parent)
+                not isinstance(node.op, ast.Not)
+                or not isinstance(node.operand, ast.Compare)
+                or len(node.operand.ops) != 1
+                or not isinstance(node.operand.ops[0], ast.GtE)
+            )
+            or isinstance(node.parent, ast.If)
+            and self.__isExceptionCheck(node.parent)
         ):
             comparison = node.operand
             left = unparse(comparison.left)
             right = unparse(comparison.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y207",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y207", left, right)
+
     def __check208(self, node):
         """
         Private method to check for calls of the type "not (not a)".
-        
+
         @param node reference to the UnaryOp node
         @type ast.UnaryOp
         """
         # not (not a)
         if (
-            isinstance(node.op, ast.Not) and
-            isinstance(node.operand, ast.UnaryOp) and
-            isinstance(node.operand.op, ast.Not)
+            isinstance(node.op, ast.Not)
+            and isinstance(node.operand, ast.UnaryOp)
+            and isinstance(node.operand.op, ast.Not)
         ):
             var = unparse(node.operand.operand)
             self.__error(node.lineno - 1, node.col_offset, "Y208", var)
-    
+
     def __check211(self, node):
         """
         Private method to check for calls of the type "True if a else False".
-        
+
         @param node reference to the AST node to be checked
         @type ast.IfExp
         """
         # True if a else False
         if (
-            isinstance(node.body, BOOL_CONST_TYPES) and
-            node.body.value is True and
-            isinstance(node.orelse, BOOL_CONST_TYPES) and
-            node.orelse.value is False
+            isinstance(node.body, BOOL_CONST_TYPES)
+            and node.body.value is True
+            and isinstance(node.orelse, BOOL_CONST_TYPES)
+            and node.orelse.value is False
         ):
             cond = unparse(node.test)
             if isinstance(node.test, ast.Name):
                 newCond = "bool({0})".format(cond)
             else:
                 newCond = cond
-            self.__error(node.lineno - 1, node.col_offset, "Y211",
-                         cond, newCond)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y211", cond, newCond)
+
     def __check212(self, node):
         """
         Private method to check for calls of the type "False if a else True".
-        
+
         @param node reference to the AST node to be checked
         @type ast.IfExp
         """
         # False if a else True
         if (
-            isinstance(node.body, BOOL_CONST_TYPES) and
-            node.body.value is False and
-            isinstance(node.orelse, BOOL_CONST_TYPES) and
-            node.orelse.value is True
+            isinstance(node.body, BOOL_CONST_TYPES)
+            and node.body.value is False
+            and isinstance(node.orelse, BOOL_CONST_TYPES)
+            and node.orelse.value is True
         ):
             cond = unparse(node.test)
             if isinstance(node.test, ast.Name):
@@ -1408,96 +1393,77 @@
                     newCond = unparse(self.__negateTest(node.test))
                 else:
                     newCond = "not ({0})".format(cond)
-            self.__error(node.lineno - 1, node.col_offset, "Y212",
-                         cond, newCond)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y212", cond, newCond)
+
     def __check213(self, node):
         """
         Private method to check for calls of the type "b if not a else a".
-        
+
         @param node reference to the AST node to be checked
         @type ast.IfExp
         """
         # b if not a else a
         if (
-            isinstance(node.test, ast.UnaryOp) and
-            isinstance(node.test.op, ast.Not) and
-            self.__isSameExpression(node.test.operand, node.orelse)
+            isinstance(node.test, ast.UnaryOp)
+            and isinstance(node.test.op, ast.Not)
+            and self.__isSameExpression(node.test.operand, node.orelse)
         ):
             a = unparse(node.test.operand)
             b = unparse(node.body)
             self.__error(node.lineno - 1, node.col_offset, "Y213", a, b)
-    
+
     def __check221(self, node):
         """
         Private method to check for calls of the type "a and not a".
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
         # a and not a
-        if (
-            isinstance(node.op, ast.And) and
-            len(node.values) >= 2
-        ):
+        if isinstance(node.op, ast.And) and len(node.values) >= 2:
             # We have a boolean And. Let's make sure there is two times the
             # same expression, but once with a "not"
             negatedExpressions = []
             nonNegatedExpressions = []
             for exp in node.values:
-                if (
-                    isinstance(exp, ast.UnaryOp) and
-                    isinstance(exp.op, ast.Not)
-                ):
+                if isinstance(exp, ast.UnaryOp) and isinstance(exp.op, ast.Not):
                     negatedExpressions.append(exp.operand)
                 else:
                     nonNegatedExpressions.append(exp)
             for negatedExpression in negatedExpressions:
                 for nonNegatedExpression in nonNegatedExpressions:
-                    if self.__isSameExpression(
-                        negatedExpression, nonNegatedExpression
-                    ):
+                    if self.__isSameExpression(negatedExpression, nonNegatedExpression):
                         negExp = unparse(negatedExpression)
-                        self.__error(node.lineno - 1, node.col_offset, "Y221",
-                                     negExp)
-    
+                        self.__error(node.lineno - 1, node.col_offset, "Y221", negExp)
+
     def __check222(self, node):
         """
         Private method to check for calls of the type "a or not a".
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
         # a or not a
-        if (
-            isinstance(node.op, ast.Or) and
-            len(node.values) >= 2
-        ):
+        if isinstance(node.op, ast.Or) and len(node.values) >= 2:
             # We have a boolean And. Let's make sure there is two times the
             # same expression, but once with a "not"
             negatedExpressions = []
             nonNegatedExpressions = []
             for exp in node.values:
-                if (
-                    isinstance(exp, ast.UnaryOp) and
-                    isinstance(exp.op, ast.Not)
-                ):
+                if isinstance(exp, ast.UnaryOp) and isinstance(exp.op, ast.Not):
                     negatedExpressions.append(exp.operand)
                 else:
                     nonNegatedExpressions.append(exp)
             for negatedExpression in negatedExpressions:
                 for nonNegatedExpression in nonNegatedExpressions:
-                    if self.__isSameExpression(
-                        negatedExpression, nonNegatedExpression
-                    ):
+                    if self.__isSameExpression(negatedExpression, nonNegatedExpression):
                         negExp = unparse(negatedExpression)
-                        self.__error(node.lineno - 1, node.col_offset, "Y222",
-                                     negExp)
-    
+                        self.__error(node.lineno - 1, node.col_offset, "Y222", negExp)
+
     def __check223(self, node):
         """
         Private method to check for calls of the type "... or True".
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
@@ -1506,11 +1472,11 @@
             for exp in node.values:
                 if isinstance(exp, BOOL_CONST_TYPES) and exp.value is True:
                     self.__error(node.lineno - 1, node.col_offset, "Y223")
-    
+
     def __check224(self, node):
         """
         Private method to check for calls of the type "... and False".
-        
+
         @param node reference to the AST node to be checked
         @type ast.BoolOp
         """
@@ -1519,79 +1485,70 @@
             for exp in node.values:
                 if isinstance(exp, BOOL_CONST_TYPES) and exp.value is False:
                     self.__error(node.lineno - 1, node.col_offset, "Y224")
-    
+
     def __check301(self, node):
         """
         Private method to check for Yoda conditions.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Compare
         """
         # 42 == age
         if (
-            isinstance(node.left, AST_CONST_TYPES) and
-            len(node.ops) == 1 and
-            isinstance(node.ops[0], ast.Eq)
+            isinstance(node.left, AST_CONST_TYPES)
+            and len(node.ops) == 1
+            and isinstance(node.ops[0], ast.Eq)
         ):
             left = unparse(node.left)
             isPy37Str = isinstance(node.left, ast.Str)
-            isPy38Str = (
-                isinstance(node.left, ast.Constant) and
-                isinstance(node.left.value, str)
+            isPy38Str = isinstance(node.left, ast.Constant) and isinstance(
+                node.left.value, str
             )
             if isPy37Str or isPy38Str:
                 left = f"'{left}'"
             right = unparse(node.comparators[0])
-            self.__error(node.lineno - 1, node.col_offset, "Y301",
-                         left, right)
-    
+            self.__error(node.lineno - 1, node.col_offset, "Y301", left, right)
+
     def __check401(self, node):
         """
         Private method to check for bare boolean function arguments.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Call
         """
         # foo(a, b, True)
         hasBareBool = any(
-            isinstance(callArg, ast.Constant) and
-            (callArg.value is True or callArg.value is False)
+            isinstance(callArg, ast.Constant)
+            and (callArg.value is True or callArg.value is False)
             for callArg in node.args
         )
 
-        isException = (
-            isinstance(node.func, ast.Attribute) and
-            node.func.attr in ["get"]
-        )
-        
+        isException = isinstance(node.func, ast.Attribute) and node.func.attr in ["get"]
+
         if hasBareBool and not isException:
             self.__error(node.lineno - 1, node.col_offset, "Y401")
-    
+
     def __check402(self, node):
         """
         Private method to check for bare numeric function arguments.
-        
+
         @param node reference to the AST node to be checked
         @type ast.Call
         """
         # foo(a, b, 123123)
         hasBareNumeric = any(
-            isinstance(callArg, ast.Constant) and
-            type(callArg.value) in (float, int)
+            isinstance(callArg, ast.Constant) and type(callArg.value) in (float, int)
             for callArg in node.args
         )
 
-        isException = (
-            isinstance(node.func, ast.Name) and
-            node.func.id == "range"
-        )
+        isException = isinstance(node.func, ast.Name) and node.func.id == "range"
         isException = isException or (
-            isinstance(node.func, ast.Attribute) and
-            node.func.attr in ("get", "insert")
+            isinstance(node.func, ast.Attribute) and node.func.attr in ("get", "insert")
         )
-        
+
         if hasBareNumeric and not isException:
             self.__error(node.lineno - 1, node.col_offset, "Y402")
 
+
 #
 # eflag: noqa = M891
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Simplify/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,143 +15,142 @@
     # Python-specifics
     "Y101": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Multiple "isinstance()" calls which can be merged into a single '''
-        '''call for variable "{0}"'''),
+        """Multiple "isinstance()" calls which can be merged into a single """
+        '''call for variable "{0}"''',
+    ),
     "Y102": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use a single if-statement instead of nested if-statements'''),
+        """Use a single if-statement instead of nested if-statements""",
+    ),
     "Y103": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Return the condition "{0}" directly'''),
-    "Y104": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "yield from {0}"'''),
+        "SimplifyChecker", """Return the condition "{0}" directly"""
+    ),
+    "Y104": QCoreApplication.translate("SimplifyChecker", '''Use "yield from {0}"'''),
     "Y105": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "with contextlib.suppress({0}):"'''),
+        "SimplifyChecker", '''Use "with contextlib.suppress({0}):"'''
+    ),
     "Y106": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Handle error-cases first'''),
+        "SimplifyChecker", """Handle error-cases first"""
+    ),
     "Y107": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Don't use return in try/except and finally'''),
+        "SimplifyChecker", """Don't use return in try/except and finally"""
+    ),
     "Y108": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use ternary operator "{0} = {1} if {2} else {3}" '''
-        '''instead of if-else-block'''),
+        """Use ternary operator "{0} = {1} if {2} else {3}" """
+        """instead of if-else-block""",
+    ),
     "Y109": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} in {1}" instead of "{2}"'''),
+        "SimplifyChecker", '''Use "{0} in {1}" instead of "{2}"'''
+    ),
     "Y110": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "any({0} for {1} in {2})"'''),
+        "SimplifyChecker", '''Use "any({0} for {1} in {2})"'''
+    ),
     "Y111": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "all({0} for {1} in {2})"'''),
+        "SimplifyChecker", '''Use "all({0} for {1} in {2})"'''
+    ),
     "Y112": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0}" instead of "{1}"'''),
+        "SimplifyChecker", '''Use "{0}" instead of "{1}"'''
+    ),
     "Y113": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use enumerate instead of "{0}"'''),
+        "SimplifyChecker", '''Use enumerate instead of "{0}"'''
+    ),
     "Y114": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use logical or ("({0}) or ({1})") and a single body'''),
+        "SimplifyChecker", """Use logical or ("({0}) or ({1})") and a single body"""
+    ),
     "Y115": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use context handler for opening files'''),
+        "SimplifyChecker", """Use context handler for opening files"""
+    ),
     "Y116": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use a dictionary lookup instead of 3+ if/elif-statements: '''
-        '''return {0}'''),
+        """Use a dictionary lookup instead of 3+ if/elif-statements: """
+        """return {0}""",
+    ),
     "Y117": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0}" instead of multiple with statements'''),
+        "SimplifyChecker", """Use "{0}" instead of multiple with statements"""
+    ),
     "Y118": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} in {1}" instead of "{0} in {1}.keys()"'''),
+        "SimplifyChecker", '''Use "{0} in {1}" instead of "{0} in {1}.keys()"'''
+    ),
     "Y119": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use a dataclass for "class {0}"'''),
+        "SimplifyChecker", '''Use a dataclass for "class {0}"'''
+    ),
     "Y120": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "class {0}:" instead of "class {0}(object):"'''),
+        "SimplifyChecker", '''Use "class {0}:" instead of "class {0}(object):"'''
+    ),
     "Y121": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use "class {0}({1}):" instead of "class {0}({1}, object):"'''),
+        '''Use "class {0}({1}):" instead of "class {0}({1}, object):"''',
+    ),
     "Y122": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0}.get({1})" instead of "if {1} in {0}: {0}[{1}]"'''),
-    
+        "SimplifyChecker", '''Use "{0}.get({1})" instead of "if {1} in {0}: {0}[{1}]"'''
+    ),
     # Python-specifics not part of flake8-simplify
     "Y181": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0}" instead of "{1}"'''),
+        "SimplifyChecker", '''Use "{0}" instead of "{1}"'''
+    ),
     "Y182": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "super()" instead of "{0}"'''),
-    
+        "SimplifyChecker", '''Use "super()" instead of "{0}"'''
+    ),
     # Comparations
     "Y201": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} != {1}" instead of "not {0} == {1}"'''),
+        "SimplifyChecker", '''Use "{0} != {1}" instead of "not {0} == {1}"'''
+    ),
     "Y202": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} == {1}" instead of "not {0} != {1}"'''),
+        "SimplifyChecker", '''Use "{0} == {1}" instead of "not {0} != {1}"'''
+    ),
     "Y203": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} not in {1}" instead of "not {0} in {1}"'''),
+        "SimplifyChecker", '''Use "{0} not in {1}" instead of "not {0} in {1}"'''
+    ),
     "Y204": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} >= {1}" instead of "not ({0} < {1})"'''),
+        "SimplifyChecker", '''Use "{0} >= {1}" instead of "not ({0} < {1})"'''
+    ),
     "Y205": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} > {1}" instead of "not ({0} <= {1})"'''),
+        "SimplifyChecker", '''Use "{0} > {1}" instead of "not ({0} <= {1})"'''
+    ),
     "Y206": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} <= {1}" instead of "not ({0} > {1})"'''),
+        "SimplifyChecker", '''Use "{0} <= {1}" instead of "not ({0} > {1})"'''
+    ),
     "Y207": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0} < {1}" instead of "not ({0} >= {1})"'''),
+        "SimplifyChecker", '''Use "{0} < {1}" instead of "not ({0} >= {1})"'''
+    ),
     "Y208": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{0}" instead of "not (not {0})"'''),
-    
+        "SimplifyChecker", '''Use "{0}" instead of "not (not {0})"'''
+    ),
     "Y211": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{1}" instead of "True if {0} else False"'''),
+        "SimplifyChecker", '''Use "{1}" instead of "True if {0} else False"'''
+    ),
     "Y212": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "{1}" instead of "False if {0} else True"'''),
+        "SimplifyChecker", '''Use "{1}" instead of "False if {0} else True"'''
+    ),
     "Y213": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use "{0} if {0} else {1}" instead of "{1} if not {0} else {0}"'''),
-    
+        '''Use "{0} if {0} else {1}" instead of "{1} if not {0} else {0}"''',
+    ),
     "Y221": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "False" instead of "{0} and not {0}"'''),
+        "SimplifyChecker", '''Use "False" instead of "{0} and not {0}"'''
+    ),
     "Y222": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "True" instead of "{0} or not {0}"'''),
+        "SimplifyChecker", '''Use "True" instead of "{0} or not {0}"'''
+    ),
     "Y223": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "True" instead of "... or True"'''),
+        "SimplifyChecker", '''Use "True" instead of "... or True"'''
+    ),
     "Y224": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use "False" instead of "... and False"'''),
-    
+        "SimplifyChecker", '''Use "False" instead of "... and False"'''
+    ),
     # Opinionated
     "Y301": QCoreApplication.translate(
         "SimplifyChecker",
-        '''Use "{1} == {0}" instead of "{0} == {1}" (Yoda-condition)'''),
-    
+        """Use "{1} == {0}" instead of "{0} == {1}" (Yoda-condition)""",
+    ),
     # General Code Style
     "Y401": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use keyword-argument instead of magic boolean'''),
+        "SimplifyChecker", """Use keyword-argument instead of magic boolean"""
+    ),
     "Y402": QCoreApplication.translate(
-        "SimplifyChecker",
-        '''Use keyword-argument instead of magic number'''),
+        "SimplifyChecker", """Use keyword-argument instead of magic number"""
+    ),
 }
 
 _simplifyMessagesSampleArgs = {
@@ -174,11 +173,9 @@
     "Y120": ["Foo"],
     "Y121": ["FooBar", "Foo"],
     "Y122": ["bar_dict", "'foo'"],
-    
     # Python-specifics not part of flake8-simplify
     "Y181": ["foo += 42", "foo = foo + 42"],
     "Y182": ["super()"],
-    
     # Comparations
     "Y201": ["foo", "bar"],
     "Y202": ["foo", "bar"],
@@ -188,16 +185,12 @@
     "Y206": ["foo", "bar"],
     "Y207": ["foo", "bar"],
     "Y208": ["foo"],
-    
     "Y211": ["foo", "bool(foo)"],
     "Y212": ["foo", "not foo"],
     "Y213": ["foo", "bar"],
-    
     "Y221": ["foo"],
     "Y222": ["foo"],
-    
     # Opinionated
     "Y301": ["42", "foo"],
-    
     # General Code Style
 }
--- a/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,28 +13,20 @@
 from PyQt6.QtCore import QCoreApplication
 
 from .Annotations.translations import (
-    _annotationsMessages, _annotationsMessagesSampleArgs
-)
-from .Complexity.translations import (
-    _complexityMessages, _complexityMessagesSampleArgs
+    _annotationsMessages,
+    _annotationsMessagesSampleArgs,
 )
-from .DocStyle.translations import (
-    _docStyleMessages, _docStyleMessagesSampleArgs
-)
-from .Imports.translations import (
-    _importsMessages, _importsMessagesSampleArgs
-)
+from .Complexity.translations import _complexityMessages, _complexityMessagesSampleArgs
+from .DocStyle.translations import _docStyleMessages, _docStyleMessagesSampleArgs
+from .Imports.translations import _importsMessages, _importsMessagesSampleArgs
 from .Miscellaneous.translations import (
-    _miscellaneousMessages, _miscellaneousMessagesSampleArgs
+    _miscellaneousMessages,
+    _miscellaneousMessagesSampleArgs,
 )
 from .Naming.translations import _namingStyleMessages
 from .PathLib.translations import _pathlibMessages
-from .Security.translations import (
-    _securityMessages, _securityMessagesSampleArgs
-)
-from .Simplify.translations import (
-    _simplifyMessages, _simplifyMessagesSampleArgs
-)
+from .Security.translations import _securityMessages, _securityMessagesSampleArgs
+from .Simplify.translations import _simplifyMessages, _simplifyMessagesSampleArgs
 
 ##################################################################
 ## pycodestyle error messages
@@ -42,226 +34,181 @@
 
 _pycodestyleErrorMessages = {
     "E101": QCoreApplication.translate(
-        "pycodestyle",
-        "indentation contains mixed spaces and tabs"),
+        "pycodestyle", "indentation contains mixed spaces and tabs"
+    ),
     "E111": QCoreApplication.translate(
-        "pycodestyle",
-        "indentation is not a multiple of four"),
-    "E112": QCoreApplication.translate(
-        "pycodestyle",
-        "expected an indented block"),
-    "E113": QCoreApplication.translate(
-        "pycodestyle",
-        "unexpected indentation"),
+        "pycodestyle", "indentation is not a multiple of four"
+    ),
+    "E112": QCoreApplication.translate("pycodestyle", "expected an indented block"),
+    "E113": QCoreApplication.translate("pycodestyle", "unexpected indentation"),
     "E114": QCoreApplication.translate(
-        "pycodestyle",
-        "indentation is not a multiple of four (comment)"),
+        "pycodestyle", "indentation is not a multiple of four (comment)"
+    ),
     "E115": QCoreApplication.translate(
-        "pycodestyle",
-        "expected an indented block (comment)"),
+        "pycodestyle", "expected an indented block (comment)"
+    ),
     "E116": QCoreApplication.translate(
-        "pycodestyle",
-        "unexpected indentation (comment)"),
-    "E117": QCoreApplication.translate(
-        "pycodestyle",
-        "over-indented"),
+        "pycodestyle", "unexpected indentation (comment)"
+    ),
+    "E117": QCoreApplication.translate("pycodestyle", "over-indented"),
     "E121": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line indentation is not a multiple of four"),
+        "pycodestyle", "continuation line indentation is not a multiple of four"
+    ),
     "E122": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line missing indentation or outdented"),
+        "pycodestyle", "continuation line missing indentation or outdented"
+    ),
     "E123": QCoreApplication.translate(
         "pycodestyle",
-        "closing bracket does not match indentation of opening"
-        " bracket's line"),
+        "closing bracket does not match indentation of opening" " bracket's line",
+    ),
     "E124": QCoreApplication.translate(
-        "pycodestyle",
-        "closing bracket does not match visual indentation"),
+        "pycodestyle", "closing bracket does not match visual indentation"
+    ),
     "E125": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line with same indent as next logical line"),
+        "pycodestyle", "continuation line with same indent as next logical line"
+    ),
     "E126": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line over-indented for hanging indent"),
+        "pycodestyle", "continuation line over-indented for hanging indent"
+    ),
     "E127": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line over-indented for visual indent"),
+        "pycodestyle", "continuation line over-indented for visual indent"
+    ),
     "E128": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line under-indented for visual indent"),
+        "pycodestyle", "continuation line under-indented for visual indent"
+    ),
     "E129": QCoreApplication.translate(
-        "pycodestyle",
-        "visually indented line with same indent as next logical line"),
+        "pycodestyle", "visually indented line with same indent as next logical line"
+    ),
     "E131": QCoreApplication.translate(
-        "pycodestyle",
-        "continuation line unaligned for hanging indent"),
+        "pycodestyle", "continuation line unaligned for hanging indent"
+    ),
     "E133": QCoreApplication.translate(
-        "pycodestyle",
-        "closing bracket is missing indentation"),
-    "E201": QCoreApplication.translate(
-        "pycodestyle",
-        "whitespace after '{0}'"),
-    "E202": QCoreApplication.translate(
-        "pycodestyle",
-        "whitespace before '{0}'"),
-    "E203": QCoreApplication.translate(
-        "pycodestyle",
-        "whitespace before '{0}'"),
-    "E211": QCoreApplication.translate(
-        "pycodestyle",
-        "whitespace before '{0}'"),
+        "pycodestyle", "closing bracket is missing indentation"
+    ),
+    "E201": QCoreApplication.translate("pycodestyle", "whitespace after '{0}'"),
+    "E202": QCoreApplication.translate("pycodestyle", "whitespace before '{0}'"),
+    "E203": QCoreApplication.translate("pycodestyle", "whitespace before '{0}'"),
+    "E211": QCoreApplication.translate("pycodestyle", "whitespace before '{0}'"),
     "E221": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple spaces before operator"),
-    "E222": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple spaces after operator"),
-    "E223": QCoreApplication.translate(
-        "pycodestyle",
-        "tab before operator"),
-    "E224": QCoreApplication.translate(
-        "pycodestyle",
-        "tab after operator"),
+        "pycodestyle", "multiple spaces before operator"
+    ),
+    "E222": QCoreApplication.translate("pycodestyle", "multiple spaces after operator"),
+    "E223": QCoreApplication.translate("pycodestyle", "tab before operator"),
+    "E224": QCoreApplication.translate("pycodestyle", "tab after operator"),
     "E225": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace around operator"),
+        "pycodestyle", "missing whitespace around operator"
+    ),
     "E226": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace around arithmetic operator"),
+        "pycodestyle", "missing whitespace around arithmetic operator"
+    ),
     "E227": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace around bitwise or shift operator"),
+        "pycodestyle", "missing whitespace around bitwise or shift operator"
+    ),
     "E228": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace around modulo operator"),
-    "E231": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace after '{0}'"),
-    "E241": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple spaces after '{0}'"),
-    "E242": QCoreApplication.translate(
-        "pycodestyle",
-        "tab after '{0}'"),
+        "pycodestyle", "missing whitespace around modulo operator"
+    ),
+    "E231": QCoreApplication.translate("pycodestyle", "missing whitespace after '{0}'"),
+    "E241": QCoreApplication.translate("pycodestyle", "multiple spaces after '{0}'"),
+    "E242": QCoreApplication.translate("pycodestyle", "tab after '{0}'"),
     "E251": QCoreApplication.translate(
-        "pycodestyle",
-        "unexpected spaces around keyword / parameter equals"),
+        "pycodestyle", "unexpected spaces around keyword / parameter equals"
+    ),
     "E252": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace around parameter equals"),
+        "pycodestyle", "missing whitespace around parameter equals"
+    ),
     "E261": QCoreApplication.translate(
-        "pycodestyle",
-        "at least two spaces before inline comment"),
+        "pycodestyle", "at least two spaces before inline comment"
+    ),
     "E262": QCoreApplication.translate(
-        "pycodestyle",
-        "inline comment should start with '# '"),
+        "pycodestyle", "inline comment should start with '# '"
+    ),
     "E265": QCoreApplication.translate(
-        "pycodestyle",
-        "block comment should start with '# '"),
+        "pycodestyle", "block comment should start with '# '"
+    ),
     "E266": QCoreApplication.translate(
-        "pycodestyle",
-        "too many leading '#' for block comment"),
-    "E271": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple spaces after keyword"),
-    "E272": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple spaces before keyword"),
-    "E273": QCoreApplication.translate(
-        "pycodestyle",
-        "tab after keyword"),
-    "E274": QCoreApplication.translate(
-        "pycodestyle",
-        "tab before keyword"),
+        "pycodestyle", "too many leading '#' for block comment"
+    ),
+    "E271": QCoreApplication.translate("pycodestyle", "multiple spaces after keyword"),
+    "E272": QCoreApplication.translate("pycodestyle", "multiple spaces before keyword"),
+    "E273": QCoreApplication.translate("pycodestyle", "tab after keyword"),
+    "E274": QCoreApplication.translate("pycodestyle", "tab before keyword"),
     "E275": QCoreApplication.translate(
-        "pycodestyle",
-        "missing whitespace after keyword"),
+        "pycodestyle", "missing whitespace after keyword"
+    ),
     "E301": QCoreApplication.translate(
-        "pycodestyle",
-        "expected {0} blank lines, found {1}"),
+        "pycodestyle", "expected {0} blank lines, found {1}"
+    ),
     "E302": QCoreApplication.translate(
-        "pycodestyle",
-        "expected {0} blank lines, found {1}"),
+        "pycodestyle", "expected {0} blank lines, found {1}"
+    ),
     "E303": QCoreApplication.translate(
-        "pycodestyle",
-        "too many blank lines ({0}), expected {1}"),
+        "pycodestyle", "too many blank lines ({0}), expected {1}"
+    ),
     "E304": QCoreApplication.translate(
-        "pycodestyle",
-        "blank lines found after function decorator"),
+        "pycodestyle", "blank lines found after function decorator"
+    ),
     "E305": QCoreApplication.translate(
         "pycodestyle",
-        "expected {0} blank lines after class or function definition,"
-        " found {1}"),
+        "expected {0} blank lines after class or function definition," " found {1}",
+    ),
     "E306": QCoreApplication.translate(
-        "pycodestyle",
-        "expected {0} blank lines before a nested definition, found {1}"),
+        "pycodestyle", "expected {0} blank lines before a nested definition, found {1}"
+    ),
     "E307": QCoreApplication.translate(
         "pycodestyle",
-        "too many blank lines ({0}) before a nested definition, expected {1}"),
-    "E308": QCoreApplication.translate(
-        "pycodestyle",
-        "too many blank lines ({0})"),
-    "E401": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple imports on one line"),
+        "too many blank lines ({0}) before a nested definition, expected {1}",
+    ),
+    "E308": QCoreApplication.translate("pycodestyle", "too many blank lines ({0})"),
+    "E401": QCoreApplication.translate("pycodestyle", "multiple imports on one line"),
     "E402": QCoreApplication.translate(
-        "pycodestyle",
-        "module level import not at top of file"),
+        "pycodestyle", "module level import not at top of file"
+    ),
     "E501": QCoreApplication.translate(
-        "pycodestyle",
-        "line too long ({0} > {1} characters)"),
+        "pycodestyle", "line too long ({0} > {1} characters)"
+    ),
     "E502": QCoreApplication.translate(
-        "pycodestyle",
-        "the backslash is redundant between brackets"),
+        "pycodestyle", "the backslash is redundant between brackets"
+    ),
     "E701": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple statements on one line (colon)"),
+        "pycodestyle", "multiple statements on one line (colon)"
+    ),
     "E702": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple statements on one line (semicolon)"),
+        "pycodestyle", "multiple statements on one line (semicolon)"
+    ),
     "E703": QCoreApplication.translate(
-        "pycodestyle",
-        "statement ends with a semicolon"),
+        "pycodestyle", "statement ends with a semicolon"
+    ),
     "E704": QCoreApplication.translate(
-        "pycodestyle",
-        "multiple statements on one line (def)"),
+        "pycodestyle", "multiple statements on one line (def)"
+    ),
     "E711": QCoreApplication.translate(
-        "pycodestyle",
-        "comparison to {0} should be {1}"),
+        "pycodestyle", "comparison to {0} should be {1}"
+    ),
     "E712": QCoreApplication.translate(
-        "pycodestyle",
-        "comparison to {0} should be {1}"),
+        "pycodestyle", "comparison to {0} should be {1}"
+    ),
     "E713": QCoreApplication.translate(
-        "pycodestyle",
-        "test for membership should be 'not in'"),
+        "pycodestyle", "test for membership should be 'not in'"
+    ),
     "E714": QCoreApplication.translate(
-        "pycodestyle",
-        "test for object identity should be 'is not'"),
+        "pycodestyle", "test for object identity should be 'is not'"
+    ),
     "E721": QCoreApplication.translate(
-        "pycodestyle",
-        "do not compare types, use 'isinstance()'"),
-    "E722": QCoreApplication.translate(
-        "pycodestyle",
-        "do not use bare except"),
+        "pycodestyle", "do not compare types, use 'isinstance()'"
+    ),
+    "E722": QCoreApplication.translate("pycodestyle", "do not use bare except"),
     "E731": QCoreApplication.translate(
-        "pycodestyle",
-        "do not assign a lambda expression, use a def"),
-    "E741": QCoreApplication.translate(
-        "pycodestyle",
-        "ambiguous variable name '{0}'"),
+        "pycodestyle", "do not assign a lambda expression, use a def"
+    ),
+    "E741": QCoreApplication.translate("pycodestyle", "ambiguous variable name '{0}'"),
     "E742": QCoreApplication.translate(
-        "pycodestyle",
-        "ambiguous class definition '{0}'"),
+        "pycodestyle", "ambiguous class definition '{0}'"
+    ),
     "E743": QCoreApplication.translate(
-        "pycodestyle",
-        "ambiguous function definition '{0}'"),
-    "E901": QCoreApplication.translate(
-        "pycodestyle",
-        "{0}: {1}"),
-    "E902": QCoreApplication.translate(
-        "pycodestyle",
-        "{0}"),
+        "pycodestyle", "ambiguous function definition '{0}'"
+    ),
+    "E901": QCoreApplication.translate("pycodestyle", "{0}: {1}"),
+    "E902": QCoreApplication.translate("pycodestyle", "{0}"),
 }
 
 ##################################################################
@@ -269,48 +216,37 @@
 ##################################################################
 
 _pycodestyleWarningMessages = {
-    "W191": QCoreApplication.translate(
-        "pycodestyle",
-        "indentation contains tabs"),
-    "W291": QCoreApplication.translate(
-        "pycodestyle",
-        "trailing whitespace"),
-    "W292": QCoreApplication.translate(
-        "pycodestyle",
-        "no newline at end of file"),
-    "W293": QCoreApplication.translate(
-        "pycodestyle",
-        "blank line contains whitespace"),
-    "W391": QCoreApplication.translate(
-        "pycodestyle",
-        "blank line at end of file"),
+    "W191": QCoreApplication.translate("pycodestyle", "indentation contains tabs"),
+    "W291": QCoreApplication.translate("pycodestyle", "trailing whitespace"),
+    "W292": QCoreApplication.translate("pycodestyle", "no newline at end of file"),
+    "W293": QCoreApplication.translate("pycodestyle", "blank line contains whitespace"),
+    "W391": QCoreApplication.translate("pycodestyle", "blank line at end of file"),
     "W503": QCoreApplication.translate(
-        "pycodestyle",
-        "line break before binary operator"),
+        "pycodestyle", "line break before binary operator"
+    ),
     "W504": QCoreApplication.translate(
-        "pycodestyle",
-        "line break after binary operator"),
+        "pycodestyle", "line break after binary operator"
+    ),
     "W505": QCoreApplication.translate(
-        "pycodestyle",
-        "doc line too long ({0} > {1} characters)"),
+        "pycodestyle", "doc line too long ({0} > {1} characters)"
+    ),
     "W601": QCoreApplication.translate(
-        "pycodestyle",
-        ".has_key() is deprecated, use 'in'"),
+        "pycodestyle", ".has_key() is deprecated, use 'in'"
+    ),
     "W602": QCoreApplication.translate(
-        "pycodestyle",
-        "deprecated form of raising exception"),
-    "W603": QCoreApplication.translate(
-        "pycodestyle",
-        "'<>' is deprecated, use '!='"),
+        "pycodestyle", "deprecated form of raising exception"
+    ),
+    "W603": QCoreApplication.translate("pycodestyle", "'<>' is deprecated, use '!='"),
     "W604": QCoreApplication.translate(
-        "pycodestyle",
-        "backticks are deprecated, use 'repr()'"),
+        "pycodestyle", "backticks are deprecated, use 'repr()'"
+    ),
     "W605": QCoreApplication.translate(
-        "pycodestyle",
-        "invalid escape sequence '\\{0}'"),
+        "pycodestyle", "invalid escape sequence '\\{0}'"
+    ),
     "W606": QCoreApplication.translate(
         "pycodestyle",
-        "'async' and 'await' are reserved keywords starting with Python 3.7"),
+        "'async' and 'await' are reserved keywords starting with Python 3.7",
+    ),
 }
 
 ##################################################################
@@ -319,152 +255,143 @@
 
 _fixMessages = {
     "FIXD111": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Triple single quotes converted to triple double quotes."),
-    'FIXD112': QCoreApplication.translate(
-        'CodeStyleFixer',
-        'Introductory quotes corrected to be {0}"""'),
+        "CodeStyleFixer", "Triple single quotes converted to triple double quotes."
+    ),
+    "FIXD112": QCoreApplication.translate(
+        "CodeStyleFixer", 'Introductory quotes corrected to be {0}"""'
+    ),
     "FIXD121": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Single line docstring put on one line."),
+        "CodeStyleFixer", "Single line docstring put on one line."
+    ),
     "FIXD131": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Period added to summary line."),
+        "CodeStyleFixer", "Period added to summary line."
+    ),
     "FIXD141": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line before function/method docstring removed."),
+        "CodeStyleFixer", "Blank line before function/method docstring removed."
+    ),
     "FIXD142": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line inserted before class docstring."),
+        "CodeStyleFixer", "Blank line inserted before class docstring."
+    ),
     "FIXD143": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line inserted after class docstring."),
+        "CodeStyleFixer", "Blank line inserted after class docstring."
+    ),
     "FIXD144": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line inserted after docstring summary."),
+        "CodeStyleFixer", "Blank line inserted after docstring summary."
+    ),
     "FIXD145": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line inserted after last paragraph of docstring."),
+        "CodeStyleFixer", "Blank line inserted after last paragraph of docstring."
+    ),
     "FIXD221": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Leading quotes put on separate line."),
+        "CodeStyleFixer", "Leading quotes put on separate line."
+    ),
     "FIXD222": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Trailing quotes put on separate line."),
+        "CodeStyleFixer", "Trailing quotes put on separate line."
+    ),
     "FIXD242": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line before class docstring removed."),
+        "CodeStyleFixer", "Blank line before class docstring removed."
+    ),
     "FIXD244": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line before function/method docstring removed."),
+        "CodeStyleFixer", "Blank line before function/method docstring removed."
+    ),
     "FIXD243": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line after class docstring removed."),
+        "CodeStyleFixer", "Blank line after class docstring removed."
+    ),
     "FIXD245": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line after function/method docstring removed."),
+        "CodeStyleFixer", "Blank line after function/method docstring removed."
+    ),
     "FIXD247": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Blank line after last paragraph removed."),
+        "CodeStyleFixer", "Blank line after last paragraph removed."
+    ),
     "FIXE101": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Tab converted to 4 spaces."),
+        "CodeStyleFixer", "Tab converted to 4 spaces."
+    ),
     "FIXE111": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Indentation adjusted to be a multiple of four."),
+        "CodeStyleFixer", "Indentation adjusted to be a multiple of four."
+    ),
     "FIXE121": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Indentation of continuation line corrected."),
+        "CodeStyleFixer", "Indentation of continuation line corrected."
+    ),
     "FIXE124": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Indentation of closing bracket corrected."),
+        "CodeStyleFixer", "Indentation of closing bracket corrected."
+    ),
     "FIXE122": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Missing indentation of continuation line corrected."),
+        "CodeStyleFixer", "Missing indentation of continuation line corrected."
+    ),
     "FIXE123": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Closing bracket aligned to opening bracket."),
+        "CodeStyleFixer", "Closing bracket aligned to opening bracket."
+    ),
     "FIXE125": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Indentation level changed."),
+        "CodeStyleFixer", "Indentation level changed."
+    ),
     "FIXE126": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Indentation level of hanging indentation changed."),
+        "CodeStyleFixer", "Indentation level of hanging indentation changed."
+    ),
     "FIXE127": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Visual indentation corrected."),
+        "CodeStyleFixer", "Visual indentation corrected."
+    ),
     "FIXE201": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Extraneous whitespace removed."),
+        "CodeStyleFixer", "Extraneous whitespace removed."
+    ),
     "FIXE225": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Missing whitespace added."),
+        "CodeStyleFixer", "Missing whitespace added."
+    ),
     "FIXE221": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Extraneous whitespace removed."),
+        "CodeStyleFixer", "Extraneous whitespace removed."
+    ),
     "FIXE231": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Missing whitespace added."),
+        "CodeStyleFixer", "Missing whitespace added."
+    ),
     "FIXE251": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Extraneous whitespace removed."),
+        "CodeStyleFixer", "Extraneous whitespace removed."
+    ),
     "FIXE261": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Whitespace around comment sign corrected."),
-    
+        "CodeStyleFixer", "Whitespace around comment sign corrected."
+    ),
     "FIXE302+": lambda n=1: QCoreApplication.translate(
-        'CodeStyleFixer',
-        "%n blank line(s) inserted.", '', n),
+        "CodeStyleFixer", "%n blank line(s) inserted.", "", n
+    ),
     "FIXE302-": lambda n=1: QCoreApplication.translate(
-        'CodeStyleFixer',
-        "%n superfluous lines removed", '', n),
-    
+        "CodeStyleFixer", "%n superfluous lines removed", "", n
+    ),
     "FIXE303": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Superfluous blank lines removed."),
+        "CodeStyleFixer", "Superfluous blank lines removed."
+    ),
     "FIXE304": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Superfluous blank lines after function decorator removed."),
+        "CodeStyleFixer", "Superfluous blank lines after function decorator removed."
+    ),
     "FIXE401": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Imports were put on separate lines."),
+        "CodeStyleFixer", "Imports were put on separate lines."
+    ),
     "FIXE501": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Long lines have been shortened."),
+        "CodeStyleFixer", "Long lines have been shortened."
+    ),
     "FIXE502": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Redundant backslash in brackets removed."),
+        "CodeStyleFixer", "Redundant backslash in brackets removed."
+    ),
     "FIXE701": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Compound statement corrected."),
+        "CodeStyleFixer", "Compound statement corrected."
+    ),
     "FIXE702": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Compound statement corrected."),
+        "CodeStyleFixer", "Compound statement corrected."
+    ),
     "FIXE711": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Comparison to None/True/False corrected."),
-    "FIXN804": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "'{0}' argument added."),
-    "FIXN806": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "'{0}' argument removed."),
+        "CodeStyleFixer", "Comparison to None/True/False corrected."
+    ),
+    "FIXN804": QCoreApplication.translate("CodeStyleFixer", "'{0}' argument added."),
+    "FIXN806": QCoreApplication.translate("CodeStyleFixer", "'{0}' argument removed."),
     "FIXW291": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Whitespace stripped from end of line."),
+        "CodeStyleFixer", "Whitespace stripped from end of line."
+    ),
     "FIXW292": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "newline added to end of file."),
+        "CodeStyleFixer", "newline added to end of file."
+    ),
     "FIXW391": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Superfluous trailing blank lines removed from end of file."),
-    "FIXW603": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "'<>' replaced by '!='."),
-        
+        "CodeStyleFixer", "Superfluous trailing blank lines removed from end of file."
+    ),
+    "FIXW603": QCoreApplication.translate("CodeStyleFixer", "'<>' replaced by '!='."),
     "FIXWRITE_ERROR": QCoreApplication.translate(
-        'CodeStyleFixer',
-        "Could not save the file! Skipping it. Reason: {0}"),
+        "CodeStyleFixer", "Could not save the file! Skipping it. Reason: {0}"
+    ),
 }
 
 _pycodestyleErrorMessagesSampleArgs = {
@@ -513,7 +440,6 @@
     "S": _securityMessages,
     "W": _pycodestyleWarningMessages,
     "Y": _simplifyMessages,
-    
     "FIX": _fixMessages,
 }
 
@@ -527,7 +453,6 @@
     "S": _securityMessagesSampleArgs,
     "W": _pycodestyleWarningMessagesSampleArgs,
     "Y": _simplifyMessagesSampleArgs,
-    
     "FIX": _fixMessagesSampleArgs,
 }
 
@@ -538,7 +463,7 @@
     """
     Module function to get a translated and formatted message for a
     given message ID.
-    
+
     @param messageCode the message code
     @type str
     @param messageArgs list of arguments or a single integer value to format
@@ -554,7 +479,7 @@
     if match:
         # the message code is OK
         messageCategory = match.group(1)
-        
+
         if example:
             try:
                 argsCatalog = messageSampleArgsCatalog[messageCategory]
@@ -566,7 +491,7 @@
                 args = None
         else:
             args = messageArgs
-        
+
         with contextlib.suppress(KeyError):
             catalog = messageCatalogs[messageCategory]
             with contextlib.suppress(KeyError):
@@ -578,20 +503,19 @@
                     return message(args)
                 else:
                     return message.format(*args)
-    
+
     if example:
         return None
     else:
         return QCoreApplication.translate(
-            "CodeStyleChecker",
-            "No message defined for code '{0}'."
+            "CodeStyleChecker", "No message defined for code '{0}'."
         ).format(messageCode)
 
 
 def getMessageCodes():
     """
     Module function to get a list of known message codes.
-    
+
     @return list of known message codes
     @rtype set of str
     """
@@ -600,5 +524,6 @@
         knownCodes += list(catalog.keys())
     return {c.split(".", 1)[0] for c in knownCodes}
 
+
 #
 # eflag: noqa = M201
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,19 +21,16 @@
 VcsConflictMarkerRegExpList = (
     re.compile(
         r"""^<<<<<<< .*?\|\|\|\|\|\|\| .*?=======.*?>>>>>>> .*?$""",
-        re.MULTILINE | re.DOTALL
+        re.MULTILINE | re.DOTALL,
     ),
-    re.compile(
-        r"""^<<<<<<< .*?=======.*?>>>>>>> .*?$""",
-        re.MULTILINE | re.DOTALL
-    ),
+    re.compile(r"""^<<<<<<< .*?=======.*?>>>>>>> .*?$""", re.MULTILINE | re.DOTALL),
 )
 
 
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     return syntaxAndPyflakesCheck
@@ -42,7 +39,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     return syntaxAndPyflakesBatchCheck
@@ -51,15 +48,15 @@
 def normalizeCode(codestring):
     """
     Function to normalize the given code.
-    
+
     @param codestring code to be normalized (string)
     @return normalized code (string)
     """
     codestring = codestring.replace("\r\n", "\n").replace("\r", "\n")
 
-    if codestring and codestring[-1] != '\n':
-        codestring += '\n'
-    
+    if codestring and codestring[-1] != "\n":
+        codestring += "\n"
+
     return codestring
 
 
@@ -67,7 +64,7 @@
     """
     Function to extract flags starting and ending with '__' from a line
     comment.
-    
+
     @param line line to extract flags from (string)
     @param startComment string identifying the start of the comment (string)
     @param endComment string identifying the end of a comment (string)
@@ -75,29 +72,33 @@
     @return list containing the extracted flags (list of strings)
     """
     flags = []
-    
-    if not flagsLine or (
-       flagsLine and line.strip().startswith(startComment)):
+
+    if not flagsLine or (flagsLine and line.strip().startswith(startComment)):
         pos = line.rfind(startComment)
         if pos >= 0:
-            comment = line[pos + len(startComment):].strip()
+            comment = line[pos + len(startComment) :].strip()
             if endComment:
                 endPos = line.rfind(endComment)
                 if endPos >= 0:
                     comment = comment[:endPos]
-            flags = [f.strip() for f in comment.split()
-                     if (f.startswith("__") and f.endswith("__"))]
-            flags += [f.strip().lower() for f in comment.split()
-                      if f in ("noqa", "NOQA")]
+            flags = [
+                f.strip()
+                for f in comment.split()
+                if (f.startswith("__") and f.endswith("__"))
+            ]
+            flags += [
+                f.strip().lower() for f in comment.split() if f in ("noqa", "NOQA")
+            ]
     return flags
 
 
-def syntaxAndPyflakesCheck(filename, codestring, checkFlakes=True,
-                           ignoreStarImportWarnings=False):
+def syntaxAndPyflakesCheck(
+    filename, codestring, checkFlakes=True, ignoreStarImportWarnings=False
+):
     """
     Function to compile one Python source file to Python bytecode
     and to perform a pyflakes check.
-    
+
     @param filename source filename (string)
     @param codestring string containing the code to compile (string)
     @param checkFlakes flag indicating to do a pyflakes check (boolean)
@@ -108,15 +109,15 @@
             (file name, line number, column, codestring (only at syntax
             errors), the message, a list with arguments for the message)
     """
-    return __syntaxAndPyflakesCheck(filename, codestring, checkFlakes,
-                                    ignoreStarImportWarnings)
+    return __syntaxAndPyflakesCheck(
+        filename, codestring, checkFlakes, ignoreStarImportWarnings
+    )
 
 
-def syntaxAndPyflakesBatchCheck(argumentsList, send, fx, cancelled,
-                                maxProcesses=0):
+def syntaxAndPyflakesBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check syntax for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for
         syntaxAndPyflakesCheck
     @type list
@@ -151,9 +152,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -163,7 +163,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -175,18 +175,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList[i + initialTasks])
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -195,23 +195,25 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the syntax check.
-    
+
     @param inputQueue input queue (multiprocessing.Queue)
     @param outputQueue output queue (multiprocessing.Queue)
     """
-    for filename, args in iter(inputQueue.get, 'STOP'):
+    for filename, args in iter(inputQueue.get, "STOP"):
         source, checkFlakes, ignoreStarImportWarnings = args
-        result = __syntaxAndPyflakesCheck(filename, source, checkFlakes,
-                                          ignoreStarImportWarnings)
+        result = __syntaxAndPyflakesCheck(
+            filename, source, checkFlakes, ignoreStarImportWarnings
+        )
         outputQueue.put((filename, result))
 
 
-def __syntaxAndPyflakesCheck(filename, codestring, checkFlakes=True,
-                             ignoreStarImportWarnings=False):
+def __syntaxAndPyflakesCheck(
+    filename, codestring, checkFlakes=True, ignoreStarImportWarnings=False
+):
     """
     Function to compile one Python source file to Python bytecode
     and to perform a pyflakes check.
-    
+
     @param filename source filename
     @type str
     @param codestring string containing the code to compile
@@ -228,55 +230,53 @@
     @rtype dict
     """
     import builtins
-    
+
     try:
         codestring = normalizeCode(codestring)
-        
+
         # Check for VCS conflict markers
         for conflictMarkerRe in VcsConflictMarkerRegExpList:
             conflict = conflictMarkerRe.search(codestring)
             if conflict is not None:
                 start, i = conflict.span()
                 lineindex = 1 + codestring.count("\n", 0, start)
-                return [{'error':
-                         (filename, lineindex, 0, "",
-                          "VCS conflict marker found")
-                         }]
-        
-        if filename.endswith('.ptl'):
+                return [
+                    {"error": (filename, lineindex, 0, "", "VCS conflict marker found")}
+                ]
+
+        if filename.endswith(".ptl"):
             try:
                 import quixote.ptl_compile
             except ImportError:
-                return [{'error': (filename, 0, 0, '',
-                        'Quixote plugin not found.')}]
+                return [{"error": (filename, 0, 0, "", "Quixote plugin not found.")}]
             template = quixote.ptl_compile.Template(codestring, filename)
             template.compile()
         else:
-            module = builtins.compile(
-                codestring, filename, 'exec', ast.PyCF_ONLY_AST)
+            module = builtins.compile(codestring, filename, "exec", ast.PyCF_ONLY_AST)
     except SyntaxError as detail:
         index = 0
         code = ""
         error = ""
         lines = traceback.format_exception_only(SyntaxError, detail)
-        match = re.match(r'\s*File "(.+)", line (\d+)',
-                         lines[0].replace('<string>', filename))
+        match = re.match(
+            r'\s*File "(.+)", line (\d+)', lines[0].replace("<string>", filename)
+        )
         if match is not None:
             fn, line = match.group(1, 2)
-            if lines[1].startswith('SyntaxError:'):
-                error = re.match('SyntaxError: (.+)', lines[1]).group(1)
+            if lines[1].startswith("SyntaxError:"):
+                error = re.match("SyntaxError: (.+)", lines[1]).group(1)
             else:
-                code = re.match('(.+)', lines[1]).group(1)
+                code = re.match("(.+)", lines[1]).group(1)
                 for seLine in lines[2:]:
-                    if seLine.startswith('SyntaxError:'):
-                        error = re.match('SyntaxError: (.+)', seLine).group(1)
-                    elif seLine.rstrip().endswith('^'):
+                    if seLine.startswith("SyntaxError:"):
+                        error = re.match("SyntaxError: (.+)", seLine).group(1)
+                    elif seLine.rstrip().endswith("^"):
                         index = len(seLine.rstrip()) - 4
         else:
             fn = detail.filename
             line = detail.lineno or 1
             error = detail.msg
-        return [{'error': (fn, int(line), index, code.strip(), error)}]
+        return [{"error": (fn, int(line), index, code.strip(), error)}]
     except ValueError as detail:
         try:
             fn = detail.filename
@@ -286,42 +286,37 @@
             fn = filename
             line = 1
             error = str(detail)
-        return [{'error': (fn, line, 0, "", error)}]
+        return [{"error": (fn, line, 0, "", error)}]
     except Exception as detail:
         with contextlib.suppress(Exception):
             fn = detail.filename
             line = detail.lineno
             error = detail.msg
-            return [{'error': (fn, line, 0, "", error)}]
-    
+            return [{"error": (fn, line, 0, "", error)}]
+
     # pyflakes
     if not checkFlakes:
         return [{}]
-    
+
     results = []
     lines = codestring.splitlines()
     try:
         warnings = Checker(module, filename, withDoctest=True)
         warnings.messages.sort(key=lambda a: a.lineno)
         for warning in warnings.messages:
-            if (
-                ignoreStarImportWarnings and
-                isinstance(warning, (ImportStarUsed, ImportStarUsage))
+            if ignoreStarImportWarnings and isinstance(
+                warning, (ImportStarUsed, ImportStarUsage)
             ):
                 continue
-            
+
             _fn, lineno, col, message, msg_args = warning.getMessageData()
             lineFlags = extractLineFlags(lines[lineno - 1].strip())
             with contextlib.suppress(IndexError):
-                lineFlags += extractLineFlags(lines[lineno].strip(),
-                                              flagsLine=True)
-            if (
-                "__IGNORE_WARNING__" not in lineFlags and
-                "noqa" not in lineFlags
-            ):
+                lineFlags += extractLineFlags(lines[lineno].strip(), flagsLine=True)
+            if "__IGNORE_WARNING__" not in lineFlags and "noqa" not in lineFlags:
                 results.append((_fn, lineno, col, "", message, msg_args))
     except SyntaxError as err:
         msg = err.text.strip() if err.text.strip() else err.msg
         results.append((filename, err.lineno, 0, "FLAKES_ERROR", msg, []))
-    
-    return [{'warnings': results}]
+
+    return [{"warnings": results}]
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,20 +18,21 @@
 class SyntaxCheckService(QObject):
     """
     Implement the syntax check service.
-    
+
     Plugins can add other languages to the syntax check by calling addLanguage
     and support of an extra checker module on the client side which has to
     connect directly to the background service.
-    
+
     @signal syntaxChecked(str, dict) emitted when the syntax check was done for
         one file
     @signal batchFinished() emitted when a syntax check batch is done
     @signal error(str, str) emitted in case of an error
     """
+
     syntaxChecked = pyqtSignal(str, dict)
     batchFinished = pyqtSignal()
     error = pyqtSignal(str, str)
-    
+
     def __init__(self):
         """
         Constructor
@@ -39,35 +40,32 @@
         super().__init__()
         self.backgroundService = ericApp().getObject("BackgroundService")
         self.__supportedLanguages = {}
-        
+
         self.queuedBatches = []
         self.batchesFinished = True
 
     def __determineLanguage(self, filename, source):
         """
         Private method to determine the language of the file.
-        
+
         @param filename of the sourcefile (str)
         @param source code of the file (str)
         @return language of the file or None if not found (str or None)
         """
         pyVer = determinePythonVersion(filename, source)
         if pyVer:
-            return 'Python{0}'.format(pyVer)
-        
-        for lang, (_env, _getArgs, getExt) in (
-                self.__supportedLanguages.items()
-        ):
+            return "Python{0}".format(pyVer)
+
+        for lang, (_env, _getArgs, getExt) in self.__supportedLanguages.items():
             if filename.endswith(tuple(getExt())):
                 return lang
-        
+
         return None
 
-    def addLanguage(
-            self, lang, env, path, module, getArgs, getExt, callback, onError):
+    def addLanguage(self, lang, env, path, module, getArgs, getExt, callback, onError):
         """
         Public method to register a new language to the supported languages.
-        
+
         @param lang new language to check syntax (str)
         @param env the environment in which the checker is implemented (str)
         @param path full path to the module (str)
@@ -83,13 +81,19 @@
         self.__supportedLanguages[lang] = env, getArgs, getExt
         # Connect to the background service
         self.backgroundService.serviceConnect(
-            '{0}Syntax'.format(lang), env, path, module, callback, onError,
-            onBatchDone=self.batchJobDone)
+            "{0}Syntax".format(lang),
+            env,
+            path,
+            module,
+            callback,
+            onError,
+            onBatchDone=self.batchJobDone,
+        )
 
     def getLanguages(self):
         """
         Public method to return the supported language names.
-        
+
         @return list of languanges supported (list of str)
         """
         return list(self.__supportedLanguages.keys()) + ["MicroPython"]
@@ -97,18 +101,17 @@
     def removeLanguage(self, lang):
         """
         Public method to remove the language from syntax check.
-        
+
         @param lang language to remove (str)
         """
         self.__supportedLanguages.pop(lang, None)
-        self.backgroundService.serviceDisconnect(
-            '{0}Syntax'.format(lang), lang)
+        self.backgroundService.serviceDisconnect("{0}Syntax".format(lang), lang)
 
     def getExtensions(self):
         """
         Public method to return all supported file extensions for the
         syntax checker dialog.
-        
+
         @return set of all supported file extensions (set of str)
         """
         extensions = set()
@@ -120,7 +123,7 @@
     def syntaxCheck(self, lang, filename, source):
         """
         Public method to prepare a syntax check of one source file.
-        
+
         @param lang language of the file or None to determine by internal
             algorithm (str or None)
         @param filename source filename (string)
@@ -132,26 +135,26 @@
             return
         if lang == "MicroPython":
             lang = "Python3"
-        
+
         data = [source]
         # Call the getArgs function to get the required arguments
         env, args, getExt = self.__supportedLanguages[lang]
         data.extend(args())
         self.backgroundService.enqueueRequest(
-            '{0}Syntax'.format(lang), env, filename, data)
-    
+            "{0}Syntax".format(lang), env, filename, data
+        )
+
     def syntaxBatchCheck(self, argumentsList):
         """
         Public method to prepare a syntax check on multiple source files.
-        
+
         @param argumentsList list of arguments tuples with each tuple
             containing filename and source (string, string)
         """
-        data = {
-        }
+        data = {}
         for lang in self.getLanguages():
             data[lang] = []
-        
+
         for filename, source in argumentsList:
             lang = self.__determineLanguage(filename, source)
             if lang not in self.getLanguages():
@@ -162,16 +165,17 @@
                 args = self.__supportedLanguages[lang][1]
                 jobData.extend(args())
                 data[lang].append((filename, jobData))
-        
+
         self.queuedBatches = []
         for lang in self.getLanguages():
             if data[lang]:
                 self.queuedBatches.append(lang)
                 env = self.__supportedLanguages[lang][0]
                 self.backgroundService.enqueueRequest(
-                    'batch_{0}Syntax'.format(lang), env, "", data[lang])
+                    "batch_{0}Syntax".format(lang), env, "", data[lang]
+                )
                 self.batchesFinished = False
-    
+
     def cancelSyntaxBatchCheck(self):
         """
         Public method to cancel all batch jobs.
@@ -180,112 +184,118 @@
             try:
                 env = self.__supportedLanguages[lang][0]
                 self.backgroundService.requestCancel(
-                    'batch_{0}Syntax'.format(lang), env)
+                    "batch_{0}Syntax".format(lang), env
+                )
             except KeyError:
                 continue
-    
+
     def __serviceError(self, fn, msg):
         """
         Private slot handling service errors.
-        
+
         @param fn file name (string)
         @param msg message text (string)
         """
         self.error.emit(fn, msg)
-    
+
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
         Public method handling service errors for Python 3.
-        
+
         @param fx service name (string)
         @param lang language (string)
         @param fn file name (string)
         @param msg message text (string)
         """
-        if fx in ['Python3Syntax', 'batch_Python3Syntax']:
-            if fx == 'Python3Syntax':
+        if fx in ["Python3Syntax", "batch_Python3Syntax"]:
+            if fx == "Python3Syntax":
                 self.__serviceError(fn, msg)
             else:
                 self.__serviceError(self.tr("Python 3 batch check"), msg)
                 self.batchJobDone(fx, lang)
-    
+
     def serviceErrorJavaScript(self, fx, lang, fn, msg):
         """
         Public method handling service errors for JavaScript.
-        
+
+        @param fx service name (string)
+        @param lang language (string)
+        @param fn file name (string)
+        @param msg message text (string)
+        """
+        if fx in ["JavaScriptSyntax", "batch_JavaScriptSyntax"]:
+            if fx == "JavaScriptSyntax":
+                self.__serviceError(fn, msg)
+            else:
+                self.__serviceError(self.tr("JavaScript batch check"), msg)
+                self.batchJobDone(fx, lang)
+
+    def serviceErrorYAML(self, fx, lang, fn, msg):
+        """
+        Public method handling service errors for YAML.
+
         @param fx service name (string)
         @param lang language (string)
         @param fn file name (string)
         @param msg message text (string)
         """
-        if fx in ['JavaScriptSyntax', 'batch_JavaScriptSyntax']:
-            if fx == 'JavaScriptSyntax':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("JavaScript batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
-    def serviceErrorYAML(self, fx, lang, fn, msg):
-        """
-        Public method handling service errors for YAML.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['YAMLSyntax', 'batch_YAMLSyntax']:
-            if fx == 'YAMLSyntax':
+        if fx in ["YAMLSyntax", "batch_YAMLSyntax"]:
+            if fx == "YAMLSyntax":
                 self.__serviceError(fn, msg)
             else:
                 self.__serviceError(self.tr("YAML batch check"), msg)
                 self.batchJobDone(fx, lang)
-    
+
     def serviceErrorJSON(self, fx, lang, fn, msg):
         """
         Public method handling service errors for JSON.
-        
+
         @param fx service name (string)
         @param lang language (string)
         @param fn file name (string)
         @param msg message text (string)
         """
-        if fx in ['JSONSyntax', 'batch_JSONSyntax']:
-            if fx == 'JSONSyntax':
+        if fx in ["JSONSyntax", "batch_JSONSyntax"]:
+            if fx == "JSONSyntax":
                 self.__serviceError(fn, msg)
             else:
                 self.__serviceError(self.tr("JSON batch check"), msg)
                 self.batchJobDone(fx, lang)
-    
+
     def serviceErrorTOML(self, fx, lang, fn, msg):
         """
         Public method handling service errors for TOML.
-        
+
         @param fx service name (string)
         @param lang language (string)
         @param fn file name (string)
         @param msg message text (string)
         """
-        if fx in ['TOMLSyntax', 'batch_TOMLSyntax']:
-            if fx == 'TOMLSyntax':
+        if fx in ["TOMLSyntax", "batch_TOMLSyntax"]:
+            if fx == "TOMLSyntax":
                 self.__serviceError(fn, msg)
             else:
                 self.__serviceError(self.tr("TOML batch check"), msg)
                 self.batchJobDone(fx, lang)
-    
+
     def batchJobDone(self, fx, lang):
         """
         Public slot handling the completion of a batch job.
-        
+
         @param fx service name (string)
         @param lang language (string)
         """
         if fx in [
-            'Python3Syntax', 'batch_Python3Syntax',
-            'JavaScriptSyntax', 'batch_JavaScriptSyntax',
-            'YAMLSyntax', 'batch_YAMLSyntax',
-            'JSONSyntax', 'batch_JSONSyntax',
-            'TOMLSyntax', 'batch_TOMLSyntax',
+            "Python3Syntax",
+            "batch_Python3Syntax",
+            "JavaScriptSyntax",
+            "batch_JavaScriptSyntax",
+            "YAMLSyntax",
+            "batch_YAMLSyntax",
+            "JSONSyntax",
+            "batch_JSONSyntax",
+            "TOMLSyntax",
+            "batch_TOMLSyntax",
         ]:
             if lang in self.queuedBatches:
                 self.queuedBatches.remove(lang)
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QTreeWidgetItem, QApplication, QHeaderView
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QApplication,
+    QHeaderView,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -28,35 +32,35 @@
     """
     Class implementing a dialog to display the results of a syntax check run.
     """
+
     filenameRole = Qt.ItemDataRole.UserRole + 1
     lineRole = Qt.ItemDataRole.UserRole + 2
     indexRole = Qt.ItemDataRole.UserRole + 3
     errorRole = Qt.ItemDataRole.UserRole + 4
     warningRole = Qt.ItemDataRole.UserRole + 5
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent The parent widget. (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.showButton = self.buttonBox.addButton(
-            self.tr("Show"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Show"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.showButton.setToolTip(
-            self.tr("Press to show all files containing an issue"))
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+            self.tr("Press to show all files containing an issue")
+        )
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
-        self.resultList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.resultList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.noResults = True
         self.cancelled = False
         self.__lastFileItem = None
@@ -64,59 +68,58 @@
         self.__finished = True
         self.__errorItem = None
         self.__timenow = time.monotonic()
-        
+
         self.__fileList = []
         self.__project = None
         self.filterFrame.setVisible(False)
-        
+
         self.checkProgress.setVisible(False)
         self.checkProgressLabel.setVisible(False)
         self.checkProgressLabel.setMaximumWidth(600)
-        
+
         try:
-            self.syntaxCheckService = ericApp().getObject('SyntaxCheckService')
+            self.syntaxCheckService = ericApp().getObject("SyntaxCheckService")
             self.syntaxCheckService.syntaxChecked.connect(self.__processResult)
             self.syntaxCheckService.batchFinished.connect(self.__batchFinished)
             self.syntaxCheckService.error.connect(self.__processError)
         except KeyError:
             self.syntaxCheckService = None
         self.filename = None
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
-        self.resultList.sortItems(self.resultList.sortColumn(),
-                                  self.resultList.header().sortIndicatorOrder()
-                                  )
-    
+        self.resultList.sortItems(
+            self.resultList.sortColumn(), self.resultList.header().sortIndicatorOrder()
+        )
+
     def __createErrorItem(self, filename, message):
         """
         Private slot to create a new error item in the result list.
-        
+
         @param filename name of the file
         @type str
         @param message error message
         @type str
         """
         if self.__errorItem is None:
-            self.__errorItem = QTreeWidgetItem(self.resultList, [
-                self.tr("Errors")])
+            self.__errorItem = QTreeWidgetItem(self.resultList, [self.tr("Errors")])
             self.__errorItem.setExpanded(True)
             self.__errorItem.setForeground(0, Qt.GlobalColor.red)
-        
-        msg = "{0} ({1})".format(self.__project.getRelativePath(filename),
-                                 message)
+
+        msg = "{0} ({1})".format(self.__project.getRelativePath(filename), message)
         if not self.resultList.findItems(msg, Qt.MatchFlag.MatchExactly):
             itm = QTreeWidgetItem(self.__errorItem, [msg])
             itm.setForeground(0, Qt.GlobalColor.red)
             itm.setFirstColumnSpanned(True)
-        
-    def __createResultItem(self, filename, line, index, error, sourcecode,
-                           isWarning=False):
+
+    def __createResultItem(
+        self, filename, line, index, error, sourcecode, isWarning=False
+    ):
         """
         Private method to create an entry in the result list.
-        
+
         @param filename file name of file (string)
         @param line line number of faulty source (integer or string)
         @param index index number of fault (integer)
@@ -125,16 +128,17 @@
         @param isWarning flag indicating a warning message (boolean)
         """
         if (
-            self.__lastFileItem is None or
-            self.__lastFileItem.data(0, self.filenameRole) != filename
+            self.__lastFileItem is None
+            or self.__lastFileItem.data(0, self.filenameRole) != filename
         ):
             # It's a new file
-            self.__lastFileItem = QTreeWidgetItem(self.resultList, [
-                self.__project.getRelativePath(filename)])
+            self.__lastFileItem = QTreeWidgetItem(
+                self.resultList, [self.__project.getRelativePath(filename)]
+            )
             self.__lastFileItem.setFirstColumnSpanned(True)
             self.__lastFileItem.setExpanded(True)
             self.__lastFileItem.setData(0, self.filenameRole, filename)
-        
+
         itm = QTreeWidgetItem(self.__lastFileItem)
         if isWarning:
             itm.setIcon(0, UI.PixmapCache.getIcon("warning"))
@@ -148,70 +152,71 @@
         itm.setData(0, self.indexRole, index)
         itm.setData(0, self.errorRole, error)
         itm.setData(0, self.warningRole, isWarning)
-        
+
     def prepare(self, fileList, project):
         """
         Public method to prepare the dialog with a list of filenames.
-        
+
         @param fileList list of filenames (list of strings)
         @param project reference to the project object (Project)
         """
         self.__fileList = fileList[:]
         self.__project = project
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.filterFrame.setVisible(True)
-        
+
         self.__data = self.__project.getData("CHECKERSPARMS", "SyntaxChecker")
         if self.__data is None or "ExcludeFiles" not in self.__data:
             self.__data = {"ExcludeFiles": ""}
         self.excludeFilesEdit.setText(self.__data["ExcludeFiles"])
-        
+
     def start(self, fn, codestring=""):
         """
         Public slot to start the syntax check.
-        
+
         @param fn file or list of files or directory to be checked
                 (string or list of strings)
         @param codestring string containing the code to be checked (string).
             If this is given, fn must be a single file name.
         """
         self.__batch = False
-        
+
         if self.syntaxCheckService is not None:
             if self.__project is None:
                 self.__project = ericApp().getObject("Project")
-            
+
             self.cancelled = False
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(
+                True
+            )
             self.showButton.setEnabled(False)
             self.checkProgress.setVisible(True)
             QApplication.processEvents()
-            
+
             if isinstance(fn, list):
                 self.files = fn
             elif os.path.isdir(fn):
                 self.files = []
                 for ext in self.syntaxCheckService.getExtensions():
                     self.files.extend(
-                        Utilities.direntries(fn, True, '*{0}'.format(ext), 0))
+                        Utilities.direntries(fn, True, "*{0}".format(ext), 0)
+                    )
             else:
                 self.files = [fn]
-            
+
             self.__errorItem = None
             self.__clearErrors(self.files)
-            
+
             if codestring or len(self.files) > 0:
                 self.checkProgress.setMaximum(max(1, len(self.files)))
                 self.checkProgress.setVisible(len(self.files) > 1)
@@ -228,13 +233,13 @@
                 else:
                     self.__batch = True
                     self.checkBatch()
-    
-    def check(self, codestring=''):
+
+    def check(self, codestring=""):
         """
         Public method to start a check for one file.
-        
+
         The results are reported to the __processResult slot.
-        
+
         @param codestring optional sourcestring (str)
         """
         if self.syntaxCheckService is None or not self.files:
@@ -243,18 +248,18 @@
             self.checkProgress.setValue(1)
             self.__finish()
             return
-        
+
         self.filename = self.files.pop(0)
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(self.filename)
         QApplication.processEvents()
         self.__resort()
-        
+
         if self.cancelled:
             return
-        
+
         self.__lastFileItem = None
-        
+
         if codestring:
             self.source = codestring
         else:
@@ -264,55 +269,61 @@
             except (UnicodeError, OSError) as msg:
                 self.noResults = False
                 self.__createResultItem(
-                    self.filename, 1, 0,
-                    self.tr("Error: {0}").format(str(msg))
-                    .rstrip(), "")
+                    self.filename,
+                    1,
+                    0,
+                    self.tr("Error: {0}").format(str(msg)).rstrip(),
+                    "",
+                )
                 self.progress += 1
                 # Continue with next file
                 self.check()
                 return
-        
+
         self.__finished = False
         self.syntaxCheckService.syntaxCheck(None, self.filename, self.source)
 
     def checkBatch(self):
         """
         Public method to start a style check batch job.
-        
+
         The results are reported to the __processResult slot.
         """
         self.__lastFileItem = None
-        
+
         self.checkProgressLabel.setPath(self.tr("Preparing files..."))
-        
+
         argumentsList = []
         for progress, filename in enumerate(self.files, start=1):
             self.checkProgress.setValue(progress)
             if time.monotonic() - self.__timenow > 0.01:
                 QApplication.processEvents()
                 self.__timenow = time.monotonic()
-            
+
             try:
                 source = Utilities.readEncodedFile(filename)[0]
                 source = Utilities.normalizeCode(source)
             except (UnicodeError, OSError) as msg:
                 self.noResults = False
                 self.__createResultItem(
-                    self.filename, 1, 0,
-                    self.tr("Error: {0}").format(str(msg))
-                    .rstrip(), "")
+                    self.filename,
+                    1,
+                    0,
+                    self.tr("Error: {0}").format(str(msg)).rstrip(),
+                    "",
+                )
                 continue
-            
+
             argumentsList.append((filename, source))
-        
+
         # reset the progress bar to the checked files
         self.checkProgress.setValue(self.progress)
         self.checkProgressLabel.setPath(self.tr("Transferring data..."))
         QApplication.processEvents()
-        
+
         self.__finished = False
         self.syntaxCheckService.syntaxBatchCheck(argumentsList)
-    
+
     def __batchFinished(self):
         """
         Private slot handling the completion of a batch job.
@@ -321,25 +332,25 @@
         self.checkProgress.setMaximum(1)
         self.checkProgress.setValue(1)
         self.__finish()
-    
+
     def __processError(self, fn, msg):
         """
         Private slot to process an error indication from the service.
-        
+
         @param fn filename of the file
         @type str
         @param msg error message
         @type str
         """
         self.__createErrorItem(fn, msg)
-        
+
         if not self.__batch:
             self.check()
-    
+
     def __processResult(self, fn, problems):
         """
         Private slot to display the reported messages.
-        
+
         @param fn filename of the checked file (str)
         @param problems dictionary with the keys 'error' and 'warnings' which
             hold a list containing details about the error/ warnings
@@ -348,19 +359,19 @@
         """
         if self.__finished:
             return
-        
+
         # Check if it's the requested file, otherwise ignore signal if not
         # in batch mode
         if not self.__batch and fn != self.filename:
             return
 
-        error = problems.get('error')
+        error = problems.get("error")
         if error:
             self.noResults = False
             _fn, lineno, col, code, msg = error
             self.__createResultItem(_fn, lineno, col, msg, code, False)
-        
-        warnings = problems.get('warnings', [])
+
+        warnings = problems.get("warnings", [])
         if warnings:
             if self.__batch:
                 try:
@@ -380,8 +391,7 @@
                         scr_line = ""
                 else:
                     scr_line = ""
-                self.__createResultItem(filename, lineno, col, msg, scr_line,
-                                        True)
+                self.__createResultItem(filename, lineno, col, msg, scr_line, True)
 
         self.progress += 1
         self.checkProgress.setValue(self.progress)
@@ -393,7 +403,7 @@
 
         if not self.__batch:
             self.check()
-        
+
     def __finish(self):
         """
         Private slot called when the syntax check finished or the user
@@ -401,41 +411,41 @@
         """
         if not self.__finished:
             self.__finished = True
-            
+
             self.cancelled = True
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setDefault(True)
-            
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(
+                True
+            )
+
             if self.noResults:
-                QTreeWidgetItem(self.resultList, [self.tr('No issues found.')])
+                QTreeWidgetItem(self.resultList, [self.tr("No issues found.")])
                 QApplication.processEvents()
                 self.showButton.setEnabled(False)
             else:
                 self.showButton.setEnabled(True)
             self.resultList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
+                QHeaderView.ResizeMode.ResizeToContents
+            )
             self.resultList.header().setStretchLastSection(True)
-            
+
             self.checkProgress.setVisible(False)
             self.checkProgressLabel.setVisible(False)
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             if self.__batch:
                 self.syntaxCheckService.cancelSyntaxBatchCheck()
                 QTimer.singleShot(1000, self.__finish)
@@ -443,56 +453,52 @@
                 self.__finish()
         elif button == self.showButton:
             self.on_showButton_clicked()
-        
+
     @pyqtSlot()
     def on_startButton_clicked(self):
         """
         Private slot to start a syntax check run.
         """
         fileList = self.__fileList[:]
-        
+
         filterString = self.excludeFilesEdit.text()
         if (
-            "ExcludeFiles" not in self.__data or
-            filterString != self.__data["ExcludeFiles"]
+            "ExcludeFiles" not in self.__data
+            or filterString != self.__data["ExcludeFiles"]
         ):
             self.__data["ExcludeFiles"] = filterString
-            self.__project.setData("CHECKERSPARMS", "SyntaxChecker",
-                                   self.__data)
-        filterList = [f.strip() for f in filterString.split(",")
-                      if f.strip()]
+            self.__project.setData("CHECKERSPARMS", "SyntaxChecker", self.__data)
+        filterList = [f.strip() for f in filterString.split(",") if f.strip()]
         if filterList:
             for fileFilter in filterList:
-                fileList = [
-                    f for f in fileList if not fnmatch.fnmatch(f, fileFilter)
-                ]
-        
+                fileList = [f for f in fileList if not fnmatch.fnmatch(f, fileFilter)]
+
         self.resultList.clear()
         self.noResults = True
         self.cancelled = False
         self.start(fileList)
-        
+
     def on_resultList_itemActivated(self, itm, col):
         """
         Private slot to handle the activation of an item.
-        
+
         @param itm reference to the activated item (QTreeWidgetItem)
         @param col column the item was activated in (integer)
         """
         if self.noResults:
             return
-        
+
         vm = ericApp().getObject("ViewManager")
-        
+
         if itm.parent():
             fn = os.path.abspath(itm.data(0, self.filenameRole))
             lineno = itm.data(0, self.lineRole)
             index = itm.data(0, self.indexRole)
             error = itm.data(0, self.errorRole)
-            
+
             vm.openSourceFile(fn, lineno)
             editor = vm.getOpenEditor(fn)
-            
+
             if itm.data(0, self.warningRole):
                 editor.toggleWarning(lineno, 0, True, error)
             else:
@@ -509,19 +515,18 @@
                 if citm.data(0, self.warningRole):
                     editor.toggleWarning(lineno, 0, True, error)
                 else:
-                    editor.toggleSyntaxError(
-                        lineno, index, True, error, show=True)
-        
+                    editor.toggleSyntaxError(lineno, index, True, error, show=True)
+
         editor = vm.activeWindow()
         editor.updateVerticalScrollBar()
-        
+
     @pyqtSlot()
     def on_showButton_clicked(self):
         """
         Private slot to handle the "Show" button press.
         """
         vm = ericApp().getObject("ViewManager")
-        
+
         selectedIndexes = []
         for index in range(self.resultList.topLevelItemCount()):
             if self.resultList.topLevelItem(index).isSelected():
@@ -543,31 +548,29 @@
                 if citm.data(0, self.warningRole):
                     editor.toggleWarning(lineno, 0, True, error)
                 else:
-                    editor.toggleSyntaxError(
-                        lineno, index, True, error, show=True)
-        
+                    editor.toggleSyntaxError(lineno, index, True, error, show=True)
+
         # go through the list again to clear syntax error and
         # flakes warning markers for files, that are ok
         openFiles = vm.getOpenFilenames()
         errorFiles = []
         for index in range(self.resultList.topLevelItemCount()):
             itm = self.resultList.topLevelItem(index)
-            errorFiles.append(
-                os.path.abspath(itm.data(0, self.filenameRole)))
+            errorFiles.append(os.path.abspath(itm.data(0, self.filenameRole)))
         for file in openFiles:
             if file not in errorFiles:
                 editor = vm.getOpenEditor(file)
                 editor.clearSyntaxError()
                 editor.clearFlakesWarnings()
-        
+
         editor = vm.activeWindow()
         editor.updateVerticalScrollBar()
-        
+
     def __clearErrors(self, files):
         """
         Private method to clear all error and warning markers of
         open editors to be checked.
-        
+
         @param files list of files to be checked (list of string)
         """
         vm = ericApp().getObject("ViewManager")
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsCheckSyntax.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsCheckSyntax.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,7 +16,7 @@
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     path = __file__
@@ -29,7 +29,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client (function)
     """
     return jsSyntaxBatchCheck
@@ -38,22 +38,22 @@
 def normalizeCode(codestring):
     """
     Function to normalize the given code.
-    
+
     @param codestring code to be normalized (string)
     @return normalized code (string)
     """
     codestring = codestring.replace("\r\n", "\n").replace("\r", "\n")
 
-    if codestring and codestring[-1] != '\n':
-        codestring += '\n'
-    
+    if codestring and codestring[-1] != "\n":
+        codestring += "\n"
+
     return codestring
 
 
 def jsSyntaxCheck(file, codestring):
     """
     Function to check a Javascript source file for syntax errors.
-    
+
     @param file source filename (string)
     @param codestring string containing the code to check (string)
     @return dictionary with the keys 'error' and 'warnings' which
@@ -67,7 +67,7 @@
 def jsSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check syntax for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for jsSyntaxCheck
     @type list
     @param send reference to send function
@@ -101,9 +101,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -113,7 +112,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -125,18 +124,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList[i + initialTasks])
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -145,11 +144,11 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the syntax check.
-    
+
     @param inputQueue input queue (multiprocessing.Queue)
     @param outputQueue output queue (multiprocessing.Queue)
     """
-    for filename, args in iter(inputQueue.get, 'STOP'):
+    for filename, args in iter(inputQueue.get, "STOP"):
         source = args[0]
         result = __jsSyntaxCheck(filename, source)
         outputQueue.put((filename, result))
@@ -158,7 +157,7 @@
 def __jsSyntaxCheck(file, codestring):
     """
     Function to check a Javascript source file for syntax errors.
-    
+
     @param file source filename (string)
     @param codestring string containing the code to check (string)
     @return dictionary with the keys 'error' and 'warnings' which
@@ -168,9 +167,9 @@
     """
     import jasy.script.parse.Parser as jsParser
     import jasy.script.tokenize.Tokenizer as jsTokenizer
-    
+
     codestring = normalizeCode(codestring)
-    
+
     try:
         jsParser.parse(codestring, file)
     except (jsParser.SyntaxError, jsTokenizer.ParseError) as exc:
@@ -178,14 +177,23 @@
         error, details = details.splitlines()
         fn, line = details.strip().rsplit(":", 1)
         error = error.split(":", 1)[1].strip()
-        
+
         cline = min(len(codestring.splitlines()), int(line)) - 1
         code = codestring.splitlines()[cline]
-        return [{'error': (fn, int(line), 0, code, error)}]
+        return [{"error": (fn, int(line), 0, code, error)}]
     except IndexError:
         error = "Incomplete source file"
         splittedCode = codestring.splitlines()
-        return [{'error': (file, len(splittedCode) + 1, len(splittedCode[-1]),
-                           splittedCode[-1], error)}]
-    
+        return [
+            {
+                "error": (
+                    file,
+                    len(splittedCode) + 1,
+                    len(splittedCode[-1]),
+                    splittedCode[-1],
+                    error,
+                )
+            }
+        ]
+
     return [{}]
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsonCheckSyntax.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/jsonCheckSyntax.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -24,7 +24,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -34,7 +34,7 @@
 def normalizeCode(codestring):
     """
     Function to normalize the given code.
-    
+
     @param codestring code to be normalized
     @type str
     @return normalized code
@@ -42,16 +42,16 @@
     """
     codestring = codestring.replace("\r\n", "\n").replace("\r", "\n")
 
-    if codestring and codestring[-1] != '\n':
-        codestring += '\n'
-    
+    if codestring and codestring[-1] != "\n":
+        codestring += "\n"
+
     return codestring
 
 
 def jsonSyntaxCheck(file, codestring):
     """
     Function to check a JSON source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -68,7 +68,7 @@
 def jsonSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check syntax for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for yamlSyntaxCheck
     @type list
     @param send reference to send function
@@ -102,9 +102,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -114,7 +113,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -126,18 +125,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList[i + initialTasks])
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -146,13 +145,13 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the syntax check.
-    
+
     @param inputQueue input queue
     @type multiprocessing.Queue
     @param outputQueue output queue
     @type multiprocessing.Queue
     """
-    for filename, args in iter(inputQueue.get, 'STOP'):
+    for filename, args in iter(inputQueue.get, "STOP"):
         source = args[0]
         result = __jsonSyntaxCheck(filename, source)
         outputQueue.put((filename, result))
@@ -161,7 +160,7 @@
 def __jsonSyntaxCheck(file, codestring):
     """
     Function to check a YAML source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -173,19 +172,19 @@
     @rtype dict
     """
     import json
-    
+
     codestring = normalizeCode(codestring)
-    
+
     try:
         json.loads(codestring)
     except json.JSONDecodeError as exc:
         line = exc.lineno
         column = exc.colno
         error = exc.msg
-        
+
         cline = min(len(codestring.splitlines()), int(line)) - 1
         code = codestring.splitlines()[cline]
-        
-        return [{'error': (file, line, column, code, error)}]
-    
+
+        return [{"error": (file, line, column, code, error)}]
+
     return [{}]
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,7 +31,7 @@
 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 """
 
-__version__ = '2.4.0'
+__version__ = "2.4.0"
 
 """
 pyflakes repository date: 2021-10-06.
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,60 +12,67 @@
 """
 
 
-class Message():
+class Message:
     """
     Class defining the base for all specific message classes.
     """
-    message_id = 'F00'
-    message = ''
+
+    message_id = "F00"
+    message = ""
     message_args = ()
 
     def __init__(self, filename, loc):
         """
         Constructor
-        
+
         @param filename name of the file
         @type str
         @param loc location of the issue
         """
         self.filename = filename
         self.lineno = loc.lineno
-        self.col = getattr(loc, 'col_offset', 0)
+        self.col = getattr(loc, "col_offset", 0)
 
     def __str__(self):
         """
         Special method return a string representation of the instance object.
-        
+
         @return string representation of the object
         @rtype str
         """
-        return '{0}:{1}:{2} {3}'.format(
-            self.filename, self.lineno, self.col + 1,
-            self.message % self.message_args)
-    
+        return "{0}:{1}:{2} {3}".format(
+            self.filename, self.lineno, self.col + 1, self.message % self.message_args
+        )
+
     def getMessageData(self):
         """
         Public method to get the individual message data elements.
-        
+
         @return tuple containing file name, line number, column, message ID
             and message arguments
         @rtype tuple of (str, int, int, str, list)
         """
-        return (self.filename, self.lineno, self.col, self.message_id,
-                self.message_args)
+        return (
+            self.filename,
+            self.lineno,
+            self.col,
+            self.message_id,
+            self.message_args,
+        )
 
 
 class UnusedImport(Message):
     """
     Class defining the "Unused Import" message.
     """
-    message_id = 'F01'
-    message = '%r imported but unused'
+
+    message_id = "F01"
+    message = "%r imported but unused"
 
     def __init__(self, filename, loc, name):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the unused import (string)
@@ -78,13 +85,14 @@
     """
     Class defining the "Redefined While Unused" message.
     """
-    message_id = 'F02'
-    message = 'redefinition of unused %r from line %r'
+
+    message_id = "F02"
+    message = "redefinition of unused %r from line %r"
 
     def __init__(self, filename, loc, name, orig_loc):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the redefined object (string)
@@ -98,13 +106,14 @@
     """
     Class defining the "Redefined In List Comprehension" message.
     """
-    message_id = 'F12'
-    message = 'list comprehension redefines %r from line %r'
+
+    message_id = "F12"
+    message = "list comprehension redefines %r from line %r"
 
     def __init__(self, filename, loc, name, orig_loc):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the redefined object (string)
@@ -118,13 +127,14 @@
     """
     Class defining the "Import Shadowed By Loop Var" message.
     """
-    message_id = 'F03'
-    message = 'import %r from line %r shadowed by loop variable'
+
+    message_id = "F03"
+    message = "import %r from line %r shadowed by loop variable"
 
     def __init__(self, filename, loc, name, orig_loc):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the shadowed import (string)
@@ -138,13 +148,14 @@
     """
     Class defining the "Import * not permitted" message.
     """
-    message_id = 'F16'
+
+    message_id = "F16"
     message = "'from %s import *' only allowed at module level"
 
     def __init__(self, filename, loc, modname):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param modname name of the module (string)
@@ -157,13 +168,14 @@
     """
     Class defining the "Import Star Used" message.
     """
-    message_id = 'F04'
+
+    message_id = "F04"
     message = "'from %s import *' used; unable to detect undefined names"
 
     def __init__(self, filename, loc, modname):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param modname name of the module imported using star import (string)
@@ -176,13 +188,14 @@
     """
     Class defining the "Import Star Usage" message.
     """
-    message_id = 'F17'
+
+    message_id = "F17"
     message = "%r may be undefined, or defined from star imports: %s"
 
     def __init__(self, filename, loc, name, from_list):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the variable (string)
@@ -196,13 +209,14 @@
     """
     Class defining the "Undefined Name" message.
     """
-    message_id = 'F05'
-    message = 'undefined name %r'
+
+    message_id = "F05"
+    message = "undefined name %r"
 
     def __init__(self, filename, loc, name):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name undefined name (string)
@@ -215,13 +229,14 @@
     """
     Class defining the "Doctest syntax Error" message.
     """
-    message_id = 'F13'
-    message = 'syntax error in doctest'
+
+    message_id = "F13"
+    message = "syntax error in doctest"
 
     def __init__(self, filename, loc, position=None):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param position position of the syntax error
@@ -236,13 +251,14 @@
     """
     Class defining the "Undefined Export" message.
     """
-    message_id = 'F06'
-    message = 'undefined name %r in __all__'
+
+    message_id = "F06"
+    message = "undefined name %r in __all__"
 
     def __init__(self, filename, loc, name):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name undefined exported name (string)
@@ -255,16 +271,17 @@
     """
     Class defining the "Undefined Local Variable" message.
     """
-    message_id = 'F07'
-    message = 'local variable %r {0} referenced before assignment'
 
-    default = 'defined in enclosing scope on line %r'
-    builtin = 'defined as a builtin'
+    message_id = "F07"
+    message = "local variable %r {0} referenced before assignment"
+
+    default = "defined in enclosing scope on line %r"
+    builtin = "defined as a builtin"
 
     def __init__(self, filename, loc, name, orig_loc):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the prematurely referenced variable (string)
@@ -274,24 +291,25 @@
         if orig_loc is None:
             self.message = self.message.format(self.builtin)
             self.message_args = (name,)
-            self.message_id = 'F07B'
+            self.message_id = "F07B"
         else:
             self.message = self.message.format(self.default)
             self.message_args = (name, orig_loc.lineno)
-            self.message_id = 'F07A'
+            self.message_id = "F07A"
 
 
 class DuplicateArgument(Message):
     """
     Class defining the "Duplicate Argument" message.
     """
-    message_id = 'F08'
-    message = 'duplicate argument %r in function definition'
+
+    message_id = "F08"
+    message = "duplicate argument %r in function definition"
 
     def __init__(self, filename, loc, name):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the duplicate argument (string)
@@ -304,13 +322,14 @@
     """
     Class defining the multiple used dictionary key message.
     """
-    message_id = 'F18'
-    message = 'dictionary key %r repeated with different values'
+
+    message_id = "F18"
+    message = "dictionary key %r repeated with different values"
 
     def __init__(self, filename, loc, key):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param key dictionary key (string)
@@ -323,13 +342,14 @@
     """
     Class defining the multiple used dictionary key variable message.
     """
-    message_id = 'F19'
-    message = 'dictionary key variable %s repeated with different values'
+
+    message_id = "F19"
+    message = "dictionary key variable %s repeated with different values"
 
     def __init__(self, filename, loc, key):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param key dictionary key variable (string)
@@ -342,13 +362,14 @@
     """
     Class defining the "Late Future Import" message.
     """
-    message_id = 'F10'
-    message = 'from __future__ imports must occur at the beginning of the file'
+
+    message_id = "F10"
+    message = "from __future__ imports must occur at the beginning of the file"
 
     def __init__(self, filename, loc, names):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param names names of the imported futures (string)
@@ -361,13 +382,14 @@
     """
     Class defining the undefined __future__ feature message.
     """
-    message_id = 'F20'
-    message = 'future feature %s is not defined'
+
+    message_id = "F20"
+    message = "future feature %s is not defined"
 
     def __init__(self, filename, loc, name):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param name name of the imported undefined future feature (string)
@@ -379,17 +401,18 @@
 class UnusedVariable(Message):
     """
     Class defining the "Unused Variable" message.
-    
+
     Indicates that a variable has been explicitly assigned to but not actually
     used.
     """
-    message_id = 'F11'
-    message = 'local variable %r is assigned to but never used'
+
+    message_id = "F11"
+    message = "local variable %r is assigned to but never used"
 
     def __init__(self, filename, loc, names):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param names names of unused variable (string)
@@ -401,31 +424,34 @@
 class ReturnWithArgsInsideGenerator(Message):
     """
     Class defining the "Return values in generator" message.
-    
+
     Indicates a return statement with arguments inside a generator.
     """
-    message_id = 'F14'
-    message = '\'return\' with argument inside generator'
+
+    message_id = "F14"
+    message = "'return' with argument inside generator"
 
 
 class ReturnOutsideFunction(Message):
     """
     Class defining the "Return outside function" message.
-    
+
     Indicates a return statement outside of a function/method.
     """
-    message_id = 'F15'
-    message = '\'return\' outside function'
+
+    message_id = "F15"
+    message = "'return' outside function"
 
 
 class YieldOutsideFunction(Message):
     """
     Class defining the "Yield outside function" message.
-    
+
     Indicates a yield or yield from statement outside of a function/method.
     """
-    message_id = 'F21'
-    message = '\'yield\' outside function'
+
+    message_id = "F21"
+    message = "'yield' outside function"
 
 
 # For whatever reason, Python gives different error messages for these two. We
@@ -433,98 +459,105 @@
 class ContinueOutsideLoop(Message):
     """
     Class defining the "Continue outside loop" message.
-    
+
     Indicates a continue statement outside of a while or for loop.
     """
-    message_id = 'F22'
-    message = '\'continue\' not properly in loop'
+
+    message_id = "F22"
+    message = "'continue' not properly in loop"
 
 
 class BreakOutsideLoop(Message):
     """
     Class defining the "Break outside loop" message.
-    
+
     Indicates a break statement outside of a while or for loop.
     """
-    message_id = 'F23'
-    message = '\'break\' outside loop'
+
+    message_id = "F23"
+    message = "'break' outside loop"
 
 
 class ContinueInFinally(Message):
     """
     Class defining the "Continue in finally block" message.
-    
+
     Indicates a continue statement in a finally block in a while or for loop.
     """
-    message_id = 'F24'
-    message = '\'continue\' not supported inside \'finally\' clause'
+
+    message_id = "F24"
+    message = "'continue' not supported inside 'finally' clause"
 
 
 class DefaultExceptNotLast(Message):
     """
     Class defining the "Default except not being the last" message.
-    
+
     Indicates an except: block as not the last exception handler.
     """
-    message_id = 'F25'
-    message = 'default \'except:\' must be last'
+
+    message_id = "F25"
+    message = "default 'except:' must be last"
 
 
 class TwoStarredExpressions(Message):
     """
     Class defining the "multiple starred expressions" message.
-    
+
     Two or more starred expressions in an assignment (a, *b, *c = d).
     """
-    message_id = 'F26'
-    message = 'two starred expressions in assignment'
+
+    message_id = "F26"
+    message = "two starred expressions in assignment"
 
 
 class TooManyExpressionsInStarredAssignment(Message):
     """
     Class defining the "too many starred expressions" message.
-    
+
     Too many expressions in an assignment with star-unpacking
     """
-    message_id = 'F27'
-    message = 'too many expressions in star-unpacking assignment'
+
+    message_id = "F27"
+    message = "too many expressions in star-unpacking assignment"
 
 
 class IfTuple(Message):
     """
     Class defining the "non-empty tuple literal" message.
-    
+
     Conditional test is a non-empty tuple literal, which are always True.
     """
-    message_id = 'F49'
-    message = (
-        '\'if tuple literal\' is always true, perhaps remove accidental comma?'
-    )
+
+    message_id = "F49"
+    message = "'if tuple literal' is always true, perhaps remove accidental comma?"
 
 
 class AssertTuple(Message):
     """
     Class defining the "tuple assertion" message.
-    
+
     Assertion test is a tuple, which are always True.
     """
-    message_id = 'F28'
-    message = 'assertion is always true, perhaps remove parentheses?'
+
+    message_id = "F28"
+    message = "assertion is always true, perhaps remove parentheses?"
 
 
 class ForwardAnnotationSyntaxError(Message):
     """
     Class defining the "forward annotation syntax error" message.
-    
+
     Found a syntax error in forward annotation.
     """
-    message_id = 'F29'
-    message = 'syntax error in forward annotation %r'
+
+    message_id = "F29"
+    message = "syntax error in forward annotation %r"
 
     def __init__(self, filename, loc, annotation):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param annotation erroneous forward annotation (string)
@@ -536,16 +569,17 @@
 class CommentAnnotationSyntaxError(Message):
     """
     Class defining the "Comment Annotation Syntax Error" message.
-    
+
     Indicates a syntax error in a type comment.
     """
-    message_id = 'F31'
-    message = 'syntax error in type comment %r'
+
+    message_id = "F31"
+    message = "syntax error in type comment %r"
 
     def __init__(self, filename, loc, annotation):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param annotation erroneous forward annotation (string)
@@ -557,56 +591,61 @@
 class RaiseNotImplemented(Message):
     """
     Class defining the "raise not implemented" message.
-    
+
     Use NotImplementedError instead of NotImplemented.
     """
-    message_id = 'F30'
+
+    message_id = "F30"
     message = "'raise NotImplemented' should be 'raise NotImplementedError'"
 
 
 class InvalidPrintSyntax(Message):
     """
     Class defining the "Invalid Print Syntax" message.
-    
+
     Indicates the use of >> with a print function.
     """
-    message_id = 'F32'
-    message = 'use of >> is invalid with print function'
+
+    message_id = "F32"
+    message = "use of >> is invalid with print function"
 
 
 class IsLiteral(Message):
     """
     Class defining the "Is Literal" message.
-    
+
     Indicates the use of "is" or "is not" against str, int and bytes.
     """
-    message_id = 'F33'
-    message = 'use ==/!= to compare str, bytes, and int literals'
+
+    message_id = "F33"
+    message = "use ==/!= to compare str, bytes, and int literals"
 
 
 class FStringMissingPlaceholders(Message):
     """
     Class defining the "Missing Placeholder" message.
-    
+
     Indicates that an f-string is missing some placeholders.
     """
-    message_id = 'F34'
-    message = 'f-string is missing placeholders'
+
+    message_id = "F34"
+    message = "f-string is missing placeholders"
 
 
 class StringDotFormatExtraPositionalArguments(Message):
     """
     Class defining the "Unused Arguments" message.
-    
+
     Indicates that an f-string has unused arguments.
     """
-    message_id = 'F35'
+
+    message_id = "F35"
     message = "'...'.format(...) has unused arguments at position(s): %s"
 
     def __init__(self, filename, loc, extra_positions):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param extra_positions indexes of unused arguments
@@ -618,16 +657,17 @@
 class StringDotFormatExtraNamedArguments(Message):
     """
     Class defining the "Unused Named Arguments" message.
-    
+
     Indicates that an f-string has unused named arguments.
     """
-    message_id = 'F36'
+
+    message_id = "F36"
     message = "'...'.format(...) has unused named argument(s): %s"
 
     def __init__(self, filename, loc, extra_keywords):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param extra_keywords index of unused named arguments
@@ -639,16 +679,17 @@
 class StringDotFormatMissingArgument(Message):
     """
     Class defining the "Missing Arguments" message.
-    
+
     Indicates that an f-string is missing some arguments.
     """
-    message_id = 'F37'
+
+    message_id = "F37"
     message = "'...'.format(...) is missing argument(s) for placeholder(s): %s"
 
     def __init__(self, filename, loc, missing_arguments):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param missing_arguments missing arguments
@@ -660,26 +701,28 @@
 class StringDotFormatMixingAutomatic(Message):
     """
     Class defining the "Mixing Automatic and Manual" message.
-    
+
     Indicates that an f-string mixes automatic and manual numbering.
     """
-    message_id = 'F38'
+
+    message_id = "F38"
     message = "'...'.format(...) mixes automatic and manual numbering"
 
 
 class StringDotFormatInvalidFormat(Message):
     """
     Class defining the "Invalid Format String" message.
-    
+
     Indicates that an f-string contains an invalid format string.
     """
-    message_id = 'F39'
+
+    message_id = "F39"
     message = "'...'.format(...) has invalid format string: %s"
 
     def __init__(self, filename, loc, error):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param error error details
@@ -693,16 +736,17 @@
 class PercentFormatInvalidFormat(Message):
     """
     Class defining the "Invalid Percent Format String" message.
-    
+
     Indicates that a percent format has an invalid format string.
     """
-    message_id = 'F40'
+
+    message_id = "F40"
     message = "'...' %% ... has invalid format string: %s"
 
     def __init__(self, filename, loc, error):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param error error details
@@ -714,27 +758,29 @@
 class PercentFormatMixedPositionalAndNamed(Message):
     """
     Class defining the "Mixed Positional and Named" message.
-    
+
     Indicates that a percent format has mixed positional and named
     placeholders.
     """
-    message_id = 'F41'
+
+    message_id = "F41"
     message = "'...' %% ... has mixed positional and named placeholders"
 
 
 class PercentFormatUnsupportedFormatCharacter(Message):
     """
     Class defining the "Unsupported Format Character" message.
-    
+
     Indicates that a percent format has an unsupported format character.
     """
-    message_id = 'F42'
+
+    message_id = "F42"
     message = "'...' %% ... has unsupported format character %r"
 
     def __init__(self, filename, loc, c):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param c unsupported format character
@@ -746,17 +792,18 @@
 class PercentFormatPositionalCountMismatch(Message):
     """
     Class defining the "Placeholder Substitution Mismatch" message.
-    
+
     Indicates that a percent format has a mismatching number of placeholders
     and substitutions.
     """
-    message_id = 'F43'
+
+    message_id = "F43"
     message = "'...' %% ... has %d placeholder(s) but %d substitution(s)"
 
     def __init__(self, filename, loc, n_placeholders, n_substitutions):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param n_placeholders number of placeholders (integer)
@@ -769,16 +816,17 @@
 class PercentFormatExtraNamedArguments(Message):
     """
     Class defining the "Unused Named Arguments" message.
-    
+
     Indicates that a percent format has unused named arguments.
     """
-    message_id = 'F44'
+
+    message_id = "F44"
     message = "'...' %% ... has unused named argument(s): %s"
 
     def __init__(self, filename, loc, extra_keywords):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param extra_keywords index of unused named arguments
@@ -790,16 +838,17 @@
 class PercentFormatMissingArgument(Message):
     """
     Class defining the "Missing Arguments" message.
-    
+
     Indicates that a percent format is missing arguments for some placeholders.
     """
-    message_id = 'F45'
+
+    message_id = "F45"
     message = "'...' %% ... is missing argument(s) for placeholder(s): %s"
 
     def __init__(self, filename, loc, missing_arguments):
         """
         Constructor
-        
+
         @param filename name of the file (string)
         @param loc location of the issue
         @param missing_arguments missing arguments
@@ -811,28 +860,31 @@
 class PercentFormatExpectedMapping(Message):
     """
     Class defining the "Sequence instead of Mapping" message.
-    
+
     Indicates that a percent format expected a mapping but got a sequence.
     """
-    message_id = 'F46'
+
+    message_id = "F46"
     message = "'...' %% ... expected mapping but got sequence"
 
 
 class PercentFormatExpectedSequence(Message):
     """
     Class defining the "Mapping instead of Sequence" message.
-    
+
     Indicates that a percent format expected a sequence but got a mapping.
     """
-    message_id = 'F47'
+
+    message_id = "F47"
     message = "'...' %% ... expected sequence but got mapping"
 
 
 class PercentFormatStarRequiresSequence(Message):
     """
     Class defining the "'*' Requires Sequence" message.
-    
+
     Indicates that a percent format expected a sequence.
     """
-    message_id = 'F48'
+
+    message_id = "F48"
     message = "'...' %% ... `*` specifier requires sequence"
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,158 +13,135 @@
 __all__ = ["getTranslatedFlakesMessage"]
 
 _messages = {
-    'F01': QCoreApplication.translate(
-        'pyFlakes',
-        '{0!r} imported but unused.'),
-    'F02': QCoreApplication.translate(
-        'pyFlakes',
-        'Redefinition of unused {0!r} from line {1!r}.'),
-    'F03': QCoreApplication.translate(
-        'pyFlakes',
-        'Import {0!r} from line {1!r} shadowed by loop variable.'),
-    'F04': QCoreApplication.translate(
-        'pyFlakes',
-        "'from {0} import *' used; unable to detect undefined names."),
-    'F05': QCoreApplication.translate(
-        'pyFlakes',
-        'Undefined name {0!r}.'),
-    'F06': QCoreApplication.translate(
-        'pyFlakes',
-        'Undefined name {0!r} in __all__.'),
-    'F07A': QCoreApplication.translate(
-        'pyFlakes',
+    "F01": QCoreApplication.translate("pyFlakes", "{0!r} imported but unused."),
+    "F02": QCoreApplication.translate(
+        "pyFlakes", "Redefinition of unused {0!r} from line {1!r}."
+    ),
+    "F03": QCoreApplication.translate(
+        "pyFlakes", "Import {0!r} from line {1!r} shadowed by loop variable."
+    ),
+    "F04": QCoreApplication.translate(
+        "pyFlakes", "'from {0} import *' used; unable to detect undefined names."
+    ),
+    "F05": QCoreApplication.translate("pyFlakes", "Undefined name {0!r}."),
+    "F06": QCoreApplication.translate("pyFlakes", "Undefined name {0!r} in __all__."),
+    "F07A": QCoreApplication.translate(
+        "pyFlakes",
         "Local variable {0!r} (defined in enclosing scope on line {1!r})"
-        " referenced before assignment."),
-    'F07B': QCoreApplication.translate(
-        'pyFlakes',
-        "Local variable {0!r} (defined as a builtin)"
-        " referenced before assignment."),
-    'F08': QCoreApplication.translate(
-        'pyFlakes',
-        'Duplicate argument {0!r} in function definition.'),
-    'F09': QCoreApplication.translate(
-        'pyFlakes',
-        'Redefinition of {0!r} from line {1!r}.'),
-    'F10': QCoreApplication.translate(
-        'pyFlakes',
-        'from __future__ imports must occur at the beginning of the file'),
-    'F11': QCoreApplication.translate(
-        'pyFlakes',
-        'Local variable {0!r} is assigned to but never used.'),
-    'F12': QCoreApplication.translate(
-        'pyFlakes',
-        'List comprehension redefines {0!r} from line {1!r}.'),
-    'F13': QCoreApplication.translate(
-        'pyFlakes',
-        'Syntax error detected in doctest.'),
-    'F14': QCoreApplication.translate(
-        'pyFlakes',
-        "'return' with argument inside generator"),
-    'F15': QCoreApplication.translate(
-        'pyFlakes',
-        "'return' outside function"),
-    'F16': QCoreApplication.translate(
-        'pyFlakes',
-        "'from {0} import *' only allowed at module level"),
-    'F17': QCoreApplication.translate(
-        'pyFlakes',
-        "{0!r} may be undefined, or defined from star imports: {1}"),
-    'F18': QCoreApplication.translate(
-        'pyFlakes',
-        "Dictionary key {0!r} repeated with different values"),
-    'F19': QCoreApplication.translate(
-        'pyFlakes',
-        "Dictionary key variable {0} repeated with different values"),
-    'F20': QCoreApplication.translate(
-        'pyFlakes',
-        "Future feature {0} is not defined"),
-    'F21': QCoreApplication.translate(
-        'pyFlakes',
-        "'yield' outside function"),
-    'F22': QCoreApplication.translate(
-        'pyFlakes',
-        "'continue' not properly in loop"),
-    'F23': QCoreApplication.translate(
-        'pyFlakes',
-        "'break' outside loop"),
-    'F24': QCoreApplication.translate(
-        'pyFlakes',
-        "'continue' not supported inside 'finally' clause"),
-    'F25': QCoreApplication.translate(
-        'pyFlakes',
-        "Default 'except:' must be last"),
-    'F26': QCoreApplication.translate(
-        'pyFlakes',
-        "Two starred expressions in assignment"),
-    'F27': QCoreApplication.translate(
-        'pyFlakes',
-        "Too many expressions in star-unpacking assignment"),
-    'F28': QCoreApplication.translate(
-        'pyFlakes',
-        "Assertion is always true, perhaps remove parentheses?"),
-    'F29': QCoreApplication.translate(
-        'pyFlakes',
-        "syntax error in forward annotation {0!r}"),
-    'F30': QCoreApplication.translate(
-        'pyFlakes',
-        "'raise NotImplemented' should be 'raise NotImplementedError'"),
-    'F31': QCoreApplication.translate(
-        'pyFlakes',
-        "syntax error in type comment {0!r}"),
-    'F32': QCoreApplication.translate(
-        'pyFlakes',
-        "use of >> is invalid with print function"),
-    'F33': QCoreApplication.translate(
-        'pyFlakes',
-        "use ==/!= to compare str, bytes, and int literals"),
-    'F34': QCoreApplication.translate(
-        'pyFlakes',
-        "f-string is missing placeholders"),
-    'F35': QCoreApplication.translate(
-        'pyFlakes',
-        "'...'.format(...) has unused arguments at position(s): {0}"),
-    'F36': QCoreApplication.translate(
-        'pyFlakes',
-        "'...'.format(...) has unused named argument(s): {0}"),
-    'F37': QCoreApplication.translate(
-        'pyFlakes',
-        "'...'.format(...) is missing argument(s) for placeholder(s): {0}"),
-    'F38': QCoreApplication.translate(
-        'pyFlakes',
-        "'...'.format(...) mixes automatic and manual numbering"),
-    'F39': QCoreApplication.translate(
-        'pyFlakes',
-        "'...'.format(...) has invalid format string: {0}"),
-    'F40': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... has invalid format string: {0}"),
-    'F41': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... has mixed positional and named placeholders"),
-    'F42': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... has unsupported format character {0!r}"),
-    'F43': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... has {0:d} placeholder(s) but {1:d} substitution(s)"),
-    'F44': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... has unused named argument(s): {0}"),
-    'F45': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... is missing argument(s) for placeholder(s): {0}"),
-    'F46': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... expected mapping but got sequence"),
-    'F47': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... expected sequence but got mapping"),
-    'F48': QCoreApplication.translate(
-        'pyFlakes',
-        "'...' % ... `*` specifier requires sequence"),
-    'F49': QCoreApplication.translate(
-        'pyFlakes',
-        "'if tuple literal' is always true, perhaps remove accidental comma?"
+        " referenced before assignment.",
+    ),
+    "F07B": QCoreApplication.translate(
+        "pyFlakes",
+        "Local variable {0!r} (defined as a builtin)" " referenced before assignment.",
+    ),
+    "F08": QCoreApplication.translate(
+        "pyFlakes", "Duplicate argument {0!r} in function definition."
+    ),
+    "F09": QCoreApplication.translate(
+        "pyFlakes", "Redefinition of {0!r} from line {1!r}."
+    ),
+    "F10": QCoreApplication.translate(
+        "pyFlakes", "from __future__ imports must occur at the beginning of the file"
+    ),
+    "F11": QCoreApplication.translate(
+        "pyFlakes", "Local variable {0!r} is assigned to but never used."
+    ),
+    "F12": QCoreApplication.translate(
+        "pyFlakes", "List comprehension redefines {0!r} from line {1!r}."
+    ),
+    "F13": QCoreApplication.translate("pyFlakes", "Syntax error detected in doctest."),
+    "F14": QCoreApplication.translate(
+        "pyFlakes", "'return' with argument inside generator"
+    ),
+    "F15": QCoreApplication.translate("pyFlakes", "'return' outside function"),
+    "F16": QCoreApplication.translate(
+        "pyFlakes", "'from {0} import *' only allowed at module level"
+    ),
+    "F17": QCoreApplication.translate(
+        "pyFlakes", "{0!r} may be undefined, or defined from star imports: {1}"
+    ),
+    "F18": QCoreApplication.translate(
+        "pyFlakes", "Dictionary key {0!r} repeated with different values"
+    ),
+    "F19": QCoreApplication.translate(
+        "pyFlakes", "Dictionary key variable {0} repeated with different values"
+    ),
+    "F20": QCoreApplication.translate("pyFlakes", "Future feature {0} is not defined"),
+    "F21": QCoreApplication.translate("pyFlakes", "'yield' outside function"),
+    "F22": QCoreApplication.translate("pyFlakes", "'continue' not properly in loop"),
+    "F23": QCoreApplication.translate("pyFlakes", "'break' outside loop"),
+    "F24": QCoreApplication.translate(
+        "pyFlakes", "'continue' not supported inside 'finally' clause"
+    ),
+    "F25": QCoreApplication.translate("pyFlakes", "Default 'except:' must be last"),
+    "F26": QCoreApplication.translate(
+        "pyFlakes", "Two starred expressions in assignment"
+    ),
+    "F27": QCoreApplication.translate(
+        "pyFlakes", "Too many expressions in star-unpacking assignment"
+    ),
+    "F28": QCoreApplication.translate(
+        "pyFlakes", "Assertion is always true, perhaps remove parentheses?"
+    ),
+    "F29": QCoreApplication.translate(
+        "pyFlakes", "syntax error in forward annotation {0!r}"
+    ),
+    "F30": QCoreApplication.translate(
+        "pyFlakes", "'raise NotImplemented' should be 'raise NotImplementedError'"
+    ),
+    "F31": QCoreApplication.translate("pyFlakes", "syntax error in type comment {0!r}"),
+    "F32": QCoreApplication.translate(
+        "pyFlakes", "use of >> is invalid with print function"
+    ),
+    "F33": QCoreApplication.translate(
+        "pyFlakes", "use ==/!= to compare str, bytes, and int literals"
+    ),
+    "F34": QCoreApplication.translate("pyFlakes", "f-string is missing placeholders"),
+    "F35": QCoreApplication.translate(
+        "pyFlakes", "'...'.format(...) has unused arguments at position(s): {0}"
+    ),
+    "F36": QCoreApplication.translate(
+        "pyFlakes", "'...'.format(...) has unused named argument(s): {0}"
+    ),
+    "F37": QCoreApplication.translate(
+        "pyFlakes", "'...'.format(...) is missing argument(s) for placeholder(s): {0}"
+    ),
+    "F38": QCoreApplication.translate(
+        "pyFlakes", "'...'.format(...) mixes automatic and manual numbering"
+    ),
+    "F39": QCoreApplication.translate(
+        "pyFlakes", "'...'.format(...) has invalid format string: {0}"
+    ),
+    "F40": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... has invalid format string: {0}"
+    ),
+    "F41": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... has mixed positional and named placeholders"
+    ),
+    "F42": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... has unsupported format character {0!r}"
+    ),
+    "F43": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... has {0:d} placeholder(s) but {1:d} substitution(s)"
+    ),
+    "F44": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... has unused named argument(s): {0}"
+    ),
+    "F45": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... is missing argument(s) for placeholder(s): {0}"
+    ),
+    "F46": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... expected mapping but got sequence"
+    ),
+    "F47": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... expected sequence but got mapping"
+    ),
+    "F48": QCoreApplication.translate(
+        "pyFlakes", "'...' % ... `*` specifier requires sequence"
+    ),
+    "F49": QCoreApplication.translate(
+        "pyFlakes",
+        "'if tuple literal' is always true, perhaps remove accidental comma?",
     ),
 }
 
@@ -173,7 +150,7 @@
     """
     Module function to get a translated and formatted message for a
     given pyflakes message ID.
-    
+
     @param message_id message ID (string)
     @param message_args arguments for a formatted message (list)
     @return translated and formatted message (string)
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/tomlCheckSyntax.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/tomlCheckSyntax.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -24,7 +24,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -34,7 +34,7 @@
 def normalizeCode(codestring):
     """
     Function to normalize the given code.
-    
+
     @param codestring code to be normalized
     @type str
     @return normalized code
@@ -42,16 +42,16 @@
     """
     codestring = codestring.replace("\r\n", "\n").replace("\r", "\n")
 
-    if codestring and codestring[-1] != '\n':
-        codestring += '\n'
-    
+    if codestring and codestring[-1] != "\n":
+        codestring += "\n"
+
     return codestring
 
 
 def tomlSyntaxCheck(file, codestring):
     """
     Function to check a TOML source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -68,7 +68,7 @@
 def tomlSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check syntax for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for tomlSyntaxCheck
     @type list
     @param send reference to send function
@@ -102,9 +102,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -114,7 +113,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -126,18 +125,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList[i + initialTasks])
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -146,13 +145,13 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the syntax check.
-    
+
     @param inputQueue input queue
     @type multiprocessing.Queue
     @param outputQueue output queue
     @type multiprocessing.Queue
     """
-    for filename, args in iter(inputQueue.get, 'STOP'):
+    for filename, args in iter(inputQueue.get, "STOP"):
         source = args[0]
         result = __tomlSyntaxCheck(filename, source)
         outputQueue.put((filename, result))
@@ -161,7 +160,7 @@
 def __tomlSyntaxCheck(file, codestring):
     """
     Function to check a TOML source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -177,10 +176,10 @@
         from tomlkit.exceptions import ParseError
     except ImportError:
         error = "tomlkit not available. Install it via the PyPI interface."
-        return [{'error': (file, 0, 0, '', error)}]
-    
+        return [{"error": (file, 0, 0, "", error)}]
+
     codestring = normalizeCode(codestring)
-    
+
     try:
         tomlkit.parse(codestring)
     except ParseError as exc:
@@ -188,10 +187,10 @@
         column = exc.col
         error = str(exc).split(" at ", 1)[0].strip()
         # get error message without location
-        
+
         cline = min(len(codestring.splitlines()), int(line)) - 1
         code = codestring.splitlines()[cline]
-        
-        return [{'error': (file, line, column, code, error)}]
-    
+
+        return [{"error": (file, line, column, code, error)}]
+
     return [{}]
--- a/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/yamlCheckSyntax.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/CheckerPlugins/SyntaxChecker/yamlCheckSyntax.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def initService():
     """
     Initialize the service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -24,7 +24,7 @@
 def initBatchService():
     """
     Initialize the batch service and return the entry point.
-    
+
     @return the entry point for the background client
     @rtype func
     """
@@ -34,7 +34,7 @@
 def normalizeCode(codestring):
     """
     Function to normalize the given code.
-    
+
     @param codestring code to be normalized
     @type str
     @return normalized code
@@ -42,16 +42,16 @@
     """
     codestring = codestring.replace("\r\n", "\n").replace("\r", "\n")
 
-    if codestring and codestring[-1] != '\n':
-        codestring += '\n'
-    
+    if codestring and codestring[-1] != "\n":
+        codestring += "\n"
+
     return codestring
 
 
 def yamlSyntaxCheck(file, codestring):
     """
     Function to check a YAML source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -68,7 +68,7 @@
 def yamlSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
     """
     Module function to check syntax for a batch of files.
-    
+
     @param argumentsList list of arguments tuples as given for yamlSyntaxCheck
     @type list
     @param send reference to send function
@@ -102,9 +102,8 @@
 
     # Start worker processes
     workers = [
-        multiprocessing.Process(
-            target=workerTask, args=(taskQueue, doneQueue)
-        ) for _ in range(NumberOfProcesses)
+        multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
+        for _ in range(NumberOfProcesses)
     ]
     for worker in workers:
         worker.start()
@@ -114,7 +113,7 @@
     for i in range(len(argumentsList)):
         resultSent = False
         wasCancelled = False
-        
+
         while not resultSent:
             try:
                 # get result (waiting max. 3 seconds and send it to frontend
@@ -126,18 +125,18 @@
                 if cancelled():
                     wasCancelled = True
                     break
-        
+
         if wasCancelled or cancelled():
             # just exit the loop ignoring the results of queued tasks
             break
-        
+
         if i < endIndex:
             taskQueue.put(argumentsList[i + initialTasks])
 
     # Tell child processes to stop
     for _ in range(NumberOfProcesses):
-        taskQueue.put('STOP')
-    
+        taskQueue.put("STOP")
+
     for worker in workers:
         worker.join()
         worker.close()
@@ -146,13 +145,13 @@
 def workerTask(inputQueue, outputQueue):
     """
     Module function acting as the parallel worker for the syntax check.
-    
+
     @param inputQueue input queue
     @type multiprocessing.Queue
     @param outputQueue output queue
     @type multiprocessing.Queue
     """
-    for filename, args in iter(inputQueue.get, 'STOP'):
+    for filename, args in iter(inputQueue.get, "STOP"):
         source = args[0]
         result = __yamlSyntaxCheck(filename, source)
         outputQueue.put((filename, result))
@@ -161,7 +160,7 @@
 def __yamlSyntaxCheck(file, codestring):
     """
     Function to check a YAML source file for syntax errors.
-    
+
     @param file source filename
     @type str
     @param codestring string containing the code to check
@@ -176,10 +175,10 @@
         from yaml import safe_load_all, MarkedYAMLError
     except ImportError:
         error = "pyyaml not available. Install it via the PyPI interface."
-        return [{'error': (file, 0, 0, '', error)}]
-    
+        return [{"error": (file, 0, 0, "", error)}]
+
     codestring = normalizeCode(codestring)
-    
+
     try:
         for _obj in safe_load_all(codestring):
             # do nothing with it, just to get parse errors
@@ -191,10 +190,10 @@
         else:
             line, column = 0, 0
         error = exc.problem
-        
+
         cline = min(len(codestring.splitlines()), int(line)) - 1
         code = codestring.splitlines()[cline]
-        
-        return [{'error': (file, line, column, code, error)}]
-    
+
+        return [{"error": (file, line, column, code, error)}]
+
     return [{}]
--- a/src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,192 +28,170 @@
     """
     Class implementing a dialog to enter the parameters for eric7_api.
     """
+
     def __init__(self, project, parms=None, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object (Project.Project)
         @param parms parameters to set in the dialog
         @param parent parent widget of this dialog
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.startDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.startDirPicker.setDefaultDirectory(project.getProjectPath())
-        
+
         self.outputFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.outputFilePicker.setDefaultDirectory(project.getProjectPath())
-        self.outputFilePicker.setFilters(self.tr(
-            "API files (*.api);;All files (*)"))
-        
+        self.outputFilePicker.setFilters(self.tr("API files (*.api);;All files (*)"))
+
         self.ignoreDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
         for language in sorted(
-                DocumentationTools.supportedExtensionsDictForApis.keys()):
+            DocumentationTools.supportedExtensionsDictForApis.keys()
+        ):
             self.languagesList.addItem(language)
-        
+
         self.ppath = project.getProjectPath()
         self.project = project
-        
+
         self.__initializeDefaults()
-        
+
         # get a copy of the defaults to store the user settings
         self.parameters = copy.deepcopy(self.defaults)
-        
+
         # combine it with the values of parms
         if parms is not None:
             self.parameters.update(parms)
         self.parameters["startDirectory"] = Utilities.toNativeSeparators(
-            self.parameters['startDirectory']
+            self.parameters["startDirectory"]
+        )
+        self.parameters["outputFile"] = Utilities.toNativeSeparators(
+            self.parameters["outputFile"]
         )
-        self.parameters['outputFile'] = Utilities.toNativeSeparators(
-            self.parameters['outputFile'])
-        
-        self.recursionCheckBox.setChecked(self.parameters['useRecursion'])
-        self.includePrivateCheckBox.setChecked(
-            self.parameters['includePrivate'])
-        self.startDirPicker.setText(self.parameters['startDirectory'])
-        self.outputFilePicker.setText(self.parameters['outputFile'])
-        self.baseEdit.setText(self.parameters['basePackage'])
+
+        self.recursionCheckBox.setChecked(self.parameters["useRecursion"])
+        self.includePrivateCheckBox.setChecked(self.parameters["includePrivate"])
+        self.startDirPicker.setText(self.parameters["startDirectory"])
+        self.outputFilePicker.setText(self.parameters["outputFile"])
+        self.baseEdit.setText(self.parameters["basePackage"])
         self.ignoreDirsList.clear()
-        for d in self.parameters['ignoreDirectories']:
+        for d in self.parameters["ignoreDirectories"]:
             self.ignoreDirsList.addItem(d)
-        self.sourceExtEdit.setText(
-            ", ".join(self.parameters['sourceExtensions']))
-        self.excludeFilesEdit.setText(
-            ", ".join(self.parameters['ignoreFilePatterns']))
-        for language in self.parameters['languages']:
+        self.sourceExtEdit.setText(", ".join(self.parameters["sourceExtensions"]))
+        self.excludeFilesEdit.setText(", ".join(self.parameters["ignoreFilePatterns"]))
+        for language in self.parameters["languages"]:
             if language == "Python":
                 # convert Python to the more specific Python3
                 language = "Python3"
-            items = self.languagesList.findItems(
-                language, Qt.MatchFlag.MatchExactly)
+            items = self.languagesList.findItems(language, Qt.MatchFlag.MatchExactly)
             items and items[0].setSelected(True)
-    
+
     def __initializeDefaults(self):
         """
         Private method to set the default values.
-        
+
         These are needed later on to generate the commandline
         parameters.
         """
         self.defaults = {
-            'useRecursion': False,
-            'includePrivate': False,
-            'startDirectory': '',
-            'outputFile': '',
-            'basePackage': '',
-            'ignoreDirectories': [],
-            'ignoreFilePatterns': [],
-            'sourceExtensions': [],
+            "useRecursion": False,
+            "includePrivate": False,
+            "startDirectory": "",
+            "outputFile": "",
+            "basePackage": "",
+            "ignoreDirectories": [],
+            "ignoreFilePatterns": [],
+            "sourceExtensions": [],
         }
-        
+
         lang = self.project.getProjectLanguage()
         if lang in DocumentationTools.supportedExtensionsDictForApis:
-            self.defaults['languages'] = [lang]
+            self.defaults["languages"] = [lang]
         else:
-            self.defaults['languages'] = ["Python3"]
-    
+            self.defaults["languages"] = ["Python3"]
+
     def generateParameters(self):
         """
         Public method that generates the command line parameters.
-        
+
         It generates a list of strings to be used
         to set the QProcess arguments for the ericapi call and
         a dictionary containing the non default parameters. This
         dictionary can be passed back upon object generation to overwrite
         the default settings.
-        
+
         @return a tuple containing the commandline parameters, non default
             parameters and the start directory
         @rtype tuple of (list of str, dict, str)
         """
         parms = {}
         args = []
-        
+
         # 1. the program name
         args.append(Globals.getPythonExecutable())
-        args.append(
-            Utilities.normabsjoinpath(getConfig('ericDir'), "eric7_api.py"))
-        
+        args.append(Utilities.normabsjoinpath(getConfig("ericDir"), "eric7_api.py"))
+
         # 2. the commandline options
-        if self.parameters['startDirectory'] != self.defaults['startDirectory']:
-            parms['startDirectory'] = self.project.getRelativeUniversalPath(
-                self.parameters['startDirectory']
-            )
-        else:
-            self.parameters['startDirectory'] = self.defaults['startDirectory']
-            parms['startDirectory'] = self.parameters['startDirectory']
-        if self.parameters['outputFile'] != self.defaults['outputFile']:
-            parms['outputFile'] = self.project.getRelativeUniversalPath(
-                self.parameters['outputFile']
-            )
-            args.append('-o')
-            args.append(
-                self.project.getAbsolutePath(self.parameters['outputFile'])
+        if self.parameters["startDirectory"] != self.defaults["startDirectory"]:
+            parms["startDirectory"] = self.project.getRelativeUniversalPath(
+                self.parameters["startDirectory"]
             )
         else:
-            self.parameters['outputFile'] = self.defaults['outputFile']
-        if self.parameters['basePackage'] != self.defaults['basePackage']:
-            parms['basePackage'] = self.parameters['basePackage']
-            args.append('-b')
-            args.append(self.parameters['basePackage'])
-        if (
-            self.parameters['ignoreDirectories'] !=
-            self.defaults['ignoreDirectories']
-        ):
-            parms['ignoreDirectories'] = (
-                self.parameters['ignoreDirectories'][:]
+            self.parameters["startDirectory"] = self.defaults["startDirectory"]
+            parms["startDirectory"] = self.parameters["startDirectory"]
+        if self.parameters["outputFile"] != self.defaults["outputFile"]:
+            parms["outputFile"] = self.project.getRelativeUniversalPath(
+                self.parameters["outputFile"]
             )
-            for d in self.parameters['ignoreDirectories']:
-                args.append('-x')
+            args.append("-o")
+            args.append(self.project.getAbsolutePath(self.parameters["outputFile"]))
+        else:
+            self.parameters["outputFile"] = self.defaults["outputFile"]
+        if self.parameters["basePackage"] != self.defaults["basePackage"]:
+            parms["basePackage"] = self.parameters["basePackage"]
+            args.append("-b")
+            args.append(self.parameters["basePackage"])
+        if self.parameters["ignoreDirectories"] != self.defaults["ignoreDirectories"]:
+            parms["ignoreDirectories"] = self.parameters["ignoreDirectories"][:]
+            for d in self.parameters["ignoreDirectories"]:
+                args.append("-x")
                 args.append(d)
-        if (
-            self.parameters['ignoreFilePatterns'] !=
-            self.defaults['ignoreFilePatterns']
-        ):
-            parms['ignoreFilePatterns'] = (
-                self.parameters['ignoreFilePatterns'][:]
-            )
-            for pattern in self.parameters['ignoreFilePatterns']:
+        if self.parameters["ignoreFilePatterns"] != self.defaults["ignoreFilePatterns"]:
+            parms["ignoreFilePatterns"] = self.parameters["ignoreFilePatterns"][:]
+            for pattern in self.parameters["ignoreFilePatterns"]:
                 args.append("--exclude-file={0}".format(pattern))
-        if self.parameters['useRecursion'] != self.defaults['useRecursion']:
-            parms['useRecursion'] = self.parameters['useRecursion']
-            args.append('-r')
-        if (
-            self.parameters['sourceExtensions'] !=
-            self.defaults['sourceExtensions']
-        ):
-            parms['sourceExtensions'] = self.parameters['sourceExtensions'][:]
-            for ext in self.parameters['sourceExtensions']:
-                args.append('-t')
+        if self.parameters["useRecursion"] != self.defaults["useRecursion"]:
+            parms["useRecursion"] = self.parameters["useRecursion"]
+            args.append("-r")
+        if self.parameters["sourceExtensions"] != self.defaults["sourceExtensions"]:
+            parms["sourceExtensions"] = self.parameters["sourceExtensions"][:]
+            for ext in self.parameters["sourceExtensions"]:
+                args.append("-t")
                 args.append(ext)
-        if (
-            self.parameters['includePrivate'] !=
-            self.defaults['includePrivate']
-        ):
-            parms['includePrivate'] = self.parameters['includePrivate']
-            args.append('-p')
-        parms['languages'] = self.parameters['languages'][:]
-        for lang in self.parameters['languages']:
-            args.append('--language={0}'.format(lang))
-        
+        if self.parameters["includePrivate"] != self.defaults["includePrivate"]:
+            parms["includePrivate"] = self.parameters["includePrivate"]
+            args.append("-p")
+        parms["languages"] = self.parameters["languages"][:]
+        for lang in self.parameters["languages"]:
+            args.append("--language={0}".format(lang))
+
         startDir = (
-            self.project.getAbsolutePath(self.parameters['startDirectory'])
-            if self.parameters['startDirectory'] else
-            ""
+            self.project.getAbsolutePath(self.parameters["startDirectory"])
+            if self.parameters["startDirectory"]
+            else ""
         )
         return args, parms, startDir
-    
+
     @pyqtSlot(str)
     def on_startDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a start directory.
-        
+
         @param path path of the start directory
         @type str
         """
@@ -222,7 +200,7 @@
         while dn.endswith(os.sep):
             dn = dn[:-1]
         self.startDirPicker.setText(dn)
-    
+
     @pyqtSlot()
     def on_outputFilePicker_aboutToShowPathPickerDialog(self):
         """
@@ -230,14 +208,13 @@
         """
         startFile = self.outputFilePicker.text()
         if not startFile:
-            self.outputFilePicker.setText(
-                self.project.getProjectName() + ".api")
-    
+            self.outputFilePicker.setText(self.project.getProjectName() + ".api")
+
     @pyqtSlot(str)
     def on_outputFilePicker_pathSelected(self, path):
         """
         Private slot handling the selection of an output file.
-        
+
         @param path path of the output file
         @type str
         """
@@ -248,17 +225,18 @@
     def on_outputFilePicker_textChanged(self, filename):
         """
         Private slot to enable/disable the "OK" button.
-        
+
         @param filename name of the file (string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(filename != "")
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            filename != ""
+        )
+
     @pyqtSlot(str)
     def on_ignoreDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a directory to be ignored.
-        
+
         @param path path of the directory to be ignored
         @type str
         """
@@ -267,12 +245,12 @@
         while dn.endswith(os.sep):
             dn = dn[:-1]
         self.ignoreDirPicker.setText(dn)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to add the directory displayed to the listview.
-        
+
         The directory in the ignore directories
         line edit is moved to the listbox above and the edit is cleared.
         """
@@ -292,43 +270,40 @@
     def accept(self):
         """
         Public slot called by the Ok button.
-        
+
         It saves the values in the parameters dictionary.
         """
-        self.parameters['useRecursion'] = self.recursionCheckBox.isChecked()
-        self.parameters['includePrivate'] = (
-            self.includePrivateCheckBox.isChecked()
-        )
-        
+        self.parameters["useRecursion"] = self.recursionCheckBox.isChecked()
+        self.parameters["includePrivate"] = self.includePrivateCheckBox.isChecked()
+
         startdir = self.startDirPicker.text()
         if startdir:
             startdir = os.path.normpath(startdir)
             if startdir.endswith(os.sep):
                 startdir = startdir[:-1]
         self.parameters["startDirectory"] = startdir
-        
+
         outfile = self.outputFilePicker.text()
-        if outfile != '':
+        if outfile != "":
             outfile = os.path.normpath(outfile)
-        self.parameters['outputFile'] = outfile
-        
-        self.parameters['basePackage'] = self.baseEdit.text()
-        self.parameters['ignoreDirectories'] = []
+        self.parameters["outputFile"] = outfile
+
+        self.parameters["basePackage"] = self.baseEdit.text()
+        self.parameters["ignoreDirectories"] = []
         for row in range(0, self.ignoreDirsList.count()):
             itm = self.ignoreDirsList.item(row)
-            self.parameters['ignoreDirectories'].append(
-                os.path.normpath(itm.text()))
-        extensions = self.sourceExtEdit.text().split(',')
-        self.parameters['sourceExtensions'] = [
+            self.parameters["ignoreDirectories"].append(os.path.normpath(itm.text()))
+        extensions = self.sourceExtEdit.text().split(",")
+        self.parameters["sourceExtensions"] = [
             ext.strip() for ext in extensions if len(ext) > 0
         ]
-        patterns = self.excludeFilesEdit.text().split(',')
-        self.parameters['ignoreFilePatterns'] = [
+        patterns = self.excludeFilesEdit.text().split(",")
+        self.parameters["ignoreFilePatterns"] = [
             pattern.strip() for pattern in patterns
         ]
-        self.parameters['languages'] = []
+        self.parameters["languages"] = []
         for itm in self.languagesList.selectedItems():
-            self.parameters['languages'].append(itm.text())
-        
+            self.parameters["languages"].append(itm.text())
+
         # call the accept slot of the base class
         super().accept()
--- a/src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,40 +22,39 @@
 class EricapiExecDialog(QDialog, Ui_EricapiExecDialog):
     """
     Class implementing a dialog to show the output of the ericapi process.
-    
+
     This class starts a QProcess and displays a dialog that
     shows the output of the documentation command process.
     """
+
     def __init__(self, cmdname, parent=None):
         """
         Constructor
-        
+
         @param cmdname name of the ericapi generator (string)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setModal(True)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = None
         self.cmdname = cmdname
-        
+
     def start(self, args, fn):
         """
         Public slot to start the ericapi command.
-        
+
         @param args commandline arguments for ericapi program (list of strings)
         @param fn filename or dirname to be processed by ericapi program
             (string)
         @return flag indicating the successful start of the process (boolean)
         """
         self.errorGroup.hide()
-        
+
         self.filename = fn
         if os.path.isdir(self.filename):
             dname = os.path.abspath(self.filename)
@@ -66,107 +65,99 @@
         else:
             dname = os.path.dirname(self.filename)
             fname = os.path.basename(self.filename)
-        
+
         self.contents.clear()
         self.errors.clear()
-        
+
         program = args[0]
         del args[0]
         args.append(fname)
-        
+
         self.process = QProcess()
         self.process.setWorkingDirectory(dname)
-        
+
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
         self.process.finished.connect(self.__finish)
-            
-        self.setWindowTitle(
-            self.tr('{0} - {1}').format(self.cmdname, self.filename))
+
+        self.setWindowTitle(self.tr("{0} - {1}").format(self.cmdname, self.filename))
         self.process.start(program, args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format(program))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format(program),
+            )
         return procStarted
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __finish(self):
         """
         Private slot called when the process finished.
-        
+
         It is called when the process finished or
         the user pressed the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.process = None
-        
-        self.contents.insertPlainText(
-            self.tr('\n{0} finished.\n').format(self.cmdname))
+
+        self.contents.insertPlainText(self.tr("\n{0} finished.\n").format(self.cmdname))
         self.contents.ensureCursorVisible()
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.contents.insertPlainText(s)
             self.contents.ensureCursorVisible()
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardError)
-        
+
         while self.process.canReadLine():
             self.errorGroup.show()
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
--- a/src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,9 +17,7 @@
 from EricWidgets.EricPathPicker import EricPathPickerModes
 
 from .Ui_EricdocConfigDialog import Ui_EricdocConfigDialog
-from DocumentationTools.Config import (
-    eric7docDefaultColors, eric7docColorParameterNames
-)
+from DocumentationTools.Config import eric7docDefaultColors, eric7docColorParameterNames
 
 import Globals
 import Utilities
@@ -31,63 +29,64 @@
     """
     Class implementing a dialog to enter the parameters for eric7_doc.
     """
+
     def __init__(self, project, parms=None, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object (Project.Project)
         @param parms parameters to set in the dialog
         @param parent parent widget of this dialog
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.startDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.startDirPicker.setDefaultDirectory(project.getProjectPath())
-        
+
         self.outputDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.outputDirPicker.setDefaultDirectory(project.getProjectPath())
-        
+
         self.ignoreDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath())
-        
+
         self.cssPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.cssPicker.setDefaultDirectory(getConfig('ericCSSDir'))
-        self.cssPicker.setFilters(self.tr(
-            "Cascading Style Sheets (*.css);;All files (*)"))
-        
+        self.cssPicker.setDefaultDirectory(getConfig("ericCSSDir"))
+        self.cssPicker.setFilters(
+            self.tr("Cascading Style Sheets (*.css);;All files (*)")
+        )
+
         self.qtHelpDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.qtHelpDirPicker.setDefaultDirectory(project.getProjectPath())
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         self.__initializeDefaults()
-        
+
         self.sampleText = self.tr(
-            '''<!DOCTYPE html'''
-            '''<html><head>'''
-            '''<title></title>'''
-            '''</head>'''
-            '''<body style="background-color:{BodyBgColor};'''
-            '''color:{BodyColor}">'''
-            '''<h1 style="background-color:{Level1HeaderBgColor};'''
-            '''color:{Level1HeaderColor}">'''
-            '''Level 1 Header</h1>'''
-            '''<h3 style="background-color:{Level2HeaderBgColor};'''
-            '''color:{Level2HeaderColor}">'''
-            '''Level 2 Header</h3>'''
-            '''<h2 style="background-color:{CFBgColor};color:{CFColor}">'''
-            '''Class and Function Header</h2>'''
-            '''Standard body text with '''
-            '''<a style="color:{LinkColor}">some links</a> embedded.'''
-            '''</body></html>'''
+            """<!DOCTYPE html"""
+            """<html><head>"""
+            """<title></title>"""
+            """</head>"""
+            """<body style="background-color:{BodyBgColor};"""
+            """color:{BodyColor}">"""
+            """<h1 style="background-color:{Level1HeaderBgColor};"""
+            """color:{Level1HeaderColor}">"""
+            """Level 1 Header</h1>"""
+            """<h3 style="background-color:{Level2HeaderBgColor};"""
+            """color:{Level2HeaderColor}">"""
+            """Level 2 Header</h3>"""
+            """<h2 style="background-color:{CFBgColor};color:{CFColor}">"""
+            """Class and Function Header</h2>"""
+            """Standard body text with """
+            """<a style="color:{LinkColor}">some links</a> embedded."""
+            """</body></html>"""
         )
-        
+
         # get a copy of the defaults to store the user settings
         self.parameters = copy.deepcopy(self.defaults)
         self.colors = eric7docDefaultColors.copy()
-        
+
         # combine it with the values of parms
         if parms is not None:
             for key in parms:
@@ -96,256 +95,239 @@
                 else:
                     self.parameters[key] = parms[key]
         self.parameters["startDirectory"] = Utilities.toNativeSeparators(
-            self.parameters['startDirectory']
+            self.parameters["startDirectory"]
         )
-        self.parameters['outputDirectory'] = Utilities.toNativeSeparators(
-            self.parameters['outputDirectory']
+        self.parameters["outputDirectory"] = Utilities.toNativeSeparators(
+            self.parameters["outputDirectory"]
+        )
+        self.parameters["qtHelpOutputDirectory"] = Utilities.toNativeSeparators(
+            self.parameters["qtHelpOutputDirectory"]
         )
-        self.parameters['qtHelpOutputDirectory'] = (
-            Utilities.toNativeSeparators(
-                self.parameters['qtHelpOutputDirectory'])
+        self.parameters["cssFile"] = Utilities.toNativeSeparators(
+            self.parameters["cssFile"]
         )
-        self.parameters['cssFile'] = Utilities.toNativeSeparators(
-            self.parameters['cssFile']
-        )
-        if self.parameters['cssFile'].startswith("%PYTHON%"):
-            self.parameters['cssFile'] = self.parameters['cssFile'].replace(
-                "%PYTHON%", Utilities.getPythonLibraryDirectory())
-        
+        if self.parameters["cssFile"].startswith("%PYTHON%"):
+            self.parameters["cssFile"] = self.parameters["cssFile"].replace(
+                "%PYTHON%", Utilities.getPythonLibraryDirectory()
+            )
+
         self.ppath = project.getProjectPath()
         self.project = project
-        
-        self.recursionCheckBox.setChecked(self.parameters['useRecursion'])
-        self.noindexCheckBox.setChecked(self.parameters['noindex'])
-        self.noemptyCheckBox.setChecked(self.parameters['noempty'])
-        self.startDirPicker.setText(self.parameters['startDirectory'])
-        self.outputDirPicker.setText(self.parameters['outputDirectory'])
+
+        self.recursionCheckBox.setChecked(self.parameters["useRecursion"])
+        self.noindexCheckBox.setChecked(self.parameters["noindex"])
+        self.noemptyCheckBox.setChecked(self.parameters["noempty"])
+        self.startDirPicker.setText(self.parameters["startDirectory"])
+        self.outputDirPicker.setText(self.parameters["outputDirectory"])
         self.ignoreDirsList.clear()
-        for d in self.parameters['ignoreDirectories']:
+        for d in self.parameters["ignoreDirectories"]:
             self.ignoreDirsList.addItem(d)
-        self.cssPicker.setText(self.parameters['cssFile'])
-        self.sourceExtEdit.setText(
-            ", ".join(self.parameters['sourceExtensions']))
-        self.excludeFilesEdit.setText(
-            ", ".join(self.parameters['ignoreFilePatterns']))
+        self.cssPicker.setText(self.parameters["cssFile"])
+        self.sourceExtEdit.setText(", ".join(self.parameters["sourceExtensions"]))
+        self.excludeFilesEdit.setText(", ".join(self.parameters["ignoreFilePatterns"]))
         self.sample.setHtml(self.sampleText.format(**self.colors))
-        
-        self.qtHelpGroup.setChecked(self.parameters['qtHelpEnabled'])
-        self.qtHelpDirPicker.setText(self.parameters['qtHelpOutputDirectory'])
-        self.qtHelpNamespaceEdit.setText(self.parameters['qtHelpNamespace'])
-        self.qtHelpFolderEdit.setText(self.parameters['qtHelpVirtualFolder'])
-        self.qtHelpFilterNameEdit.setText(self.parameters['qtHelpFilterName'])
+
+        self.qtHelpGroup.setChecked(self.parameters["qtHelpEnabled"])
+        self.qtHelpDirPicker.setText(self.parameters["qtHelpOutputDirectory"])
+        self.qtHelpNamespaceEdit.setText(self.parameters["qtHelpNamespace"])
+        self.qtHelpFolderEdit.setText(self.parameters["qtHelpVirtualFolder"])
+        self.qtHelpFilterNameEdit.setText(self.parameters["qtHelpFilterName"])
         self.qtHelpFilterAttributesEdit.setText(
-            self.parameters['qtHelpFilterAttributes'])
-        self.qtHelpTitleEdit.setText(self.parameters['qtHelpTitle'])
+            self.parameters["qtHelpFilterAttributes"]
+        )
+        self.qtHelpTitleEdit.setText(self.parameters["qtHelpTitle"])
         self.qtHelpGenerateCollectionCheckBox.setChecked(
-            self.parameters['qtHelpCreateCollection'])
-    
+            self.parameters["qtHelpCreateCollection"]
+        )
+
     def __initializeDefaults(self):
         """
         Private method to set the default values.
-        
+
         These are needed later on to generate the commandline
         parameters.
         """
         self.defaults = {
-            'useRecursion': False,
-            'noindex': False,
-            'noempty': False,
-            'startDirectory': '',
-            'outputDirectory': '',
-            'ignoreDirectories': [],
-            'ignoreFilePatterns': [],
-            'cssFile': '',
-            'sourceExtensions': [],
-            
-            'qtHelpEnabled': False,
-            'qtHelpOutputDirectory': '',
-            'qtHelpNamespace': '',
-            'qtHelpVirtualFolder': 'source',
-            'qtHelpFilterName': 'unknown',
-            'qtHelpFilterAttributes': '',
-            'qtHelpTitle': '',
-            'qtHelpCreateCollection': False,
+            "useRecursion": False,
+            "noindex": False,
+            "noempty": False,
+            "startDirectory": "",
+            "outputDirectory": "",
+            "ignoreDirectories": [],
+            "ignoreFilePatterns": [],
+            "cssFile": "",
+            "sourceExtensions": [],
+            "qtHelpEnabled": False,
+            "qtHelpOutputDirectory": "",
+            "qtHelpNamespace": "",
+            "qtHelpVirtualFolder": "source",
+            "qtHelpFilterName": "unknown",
+            "qtHelpFilterAttributes": "",
+            "qtHelpTitle": "",
+            "qtHelpCreateCollection": False,
         }
-    
+
     def generateParameters(self):
         """
         Public method that generates the commandline parameters.
-        
+
         It generates a list of strings to be used
         to set the QProcess arguments for the ericdoc call and
         a dictionary containing the non default parameters. This
         dictionary can be passed back upon object generation to overwrite
         the default settings.
-        
+
         @return a tuple containing the commandline parameters, non default
             parameters and the start directory
         @rtype tuple of (list of str, dict, str)
         """
         parms = {}
         args = []
-        
+
         # 1. the program name
         args.append(Globals.getPythonExecutable())
-        args.append(
-            Utilities.normabsjoinpath(getConfig('ericDir'), "eric7_doc.py"))
-        
+        args.append(Utilities.normabsjoinpath(getConfig("ericDir"), "eric7_doc.py"))
+
         # 2. the commandline options
         # 2a. general commandline options
-        if self.parameters['startDirectory'] != self.defaults['startDirectory']:
-            parms['startDirectory'] = self.project.getRelativeUniversalPath(
-                self.parameters['startDirectory']
+        if self.parameters["startDirectory"] != self.defaults["startDirectory"]:
+            parms["startDirectory"] = self.project.getRelativeUniversalPath(
+                self.parameters["startDirectory"]
             )
         else:
-            self.parameters['startDirectory'] = self.defaults['startDirectory']
-            parms['startDirectory'] = self.parameters['startDirectory']
-        if self.parameters['outputDirectory'] != self.defaults['outputDirectory']:
-            parms['outputDirectory'] = self.project.getRelativeUniversalPath(
-                self.parameters['outputDirectory']
+            self.parameters["startDirectory"] = self.defaults["startDirectory"]
+            parms["startDirectory"] = self.parameters["startDirectory"]
+        if self.parameters["outputDirectory"] != self.defaults["outputDirectory"]:
+            parms["outputDirectory"] = self.project.getRelativeUniversalPath(
+                self.parameters["outputDirectory"]
             )
-            args.append('-o')
+            args.append("-o")
             args.append(
-                self.project.getAbsolutePath(self.parameters['outputDirectory'])
+                self.project.getAbsolutePath(self.parameters["outputDirectory"])
             )
         else:
-            self.parameters['outputDirectory'] = self.defaults['outputDirectory']
-            parms['outputDirectory'] = self.parameters['outputDirectory']
-        if (
-            self.parameters['ignoreDirectories'] !=
-            self.defaults['ignoreDirectories']
-        ):
-            parms['ignoreDirectories'] = (
-                self.parameters['ignoreDirectories'][:]
-            )
-            for d in self.parameters['ignoreDirectories']:
-                args.append('-x')
+            self.parameters["outputDirectory"] = self.defaults["outputDirectory"]
+            parms["outputDirectory"] = self.parameters["outputDirectory"]
+        if self.parameters["ignoreDirectories"] != self.defaults["ignoreDirectories"]:
+            parms["ignoreDirectories"] = self.parameters["ignoreDirectories"][:]
+            for d in self.parameters["ignoreDirectories"]:
+                args.append("-x")
                 args.append(d)
-        if (
-            self.parameters['ignoreFilePatterns'] !=
-            self.defaults['ignoreFilePatterns']
-        ):
-            parms['ignoreFilePatterns'] = (
-                self.parameters['ignoreFilePatterns'][:]
-            )
-            for pattern in self.parameters['ignoreFilePatterns']:
+        if self.parameters["ignoreFilePatterns"] != self.defaults["ignoreFilePatterns"]:
+            parms["ignoreFilePatterns"] = self.parameters["ignoreFilePatterns"][:]
+            for pattern in self.parameters["ignoreFilePatterns"]:
                 if pattern.strip():
                     args.append("--exclude-file={0}".format(pattern.strip()))
-        if self.parameters['useRecursion'] != self.defaults['useRecursion']:
-            parms['useRecursion'] = self.parameters['useRecursion']
-            args.append('-r')
-        if self.parameters['noindex'] != self.defaults['noindex']:
-            parms['noindex'] = self.parameters['noindex']
-            args.append('-i')
-        if self.parameters['noempty'] != self.defaults['noempty']:
-            parms['noempty'] = self.parameters['noempty']
-            args.append('-e')
-        if (
-            self.parameters['sourceExtensions'] !=
-            self.defaults['sourceExtensions']
-        ):
-            parms['sourceExtensions'] = self.parameters['sourceExtensions'][:]
-            for ext in self.parameters['sourceExtensions']:
+        if self.parameters["useRecursion"] != self.defaults["useRecursion"]:
+            parms["useRecursion"] = self.parameters["useRecursion"]
+            args.append("-r")
+        if self.parameters["noindex"] != self.defaults["noindex"]:
+            parms["noindex"] = self.parameters["noindex"]
+            args.append("-i")
+        if self.parameters["noempty"] != self.defaults["noempty"]:
+            parms["noempty"] = self.parameters["noempty"]
+            args.append("-e")
+        if self.parameters["sourceExtensions"] != self.defaults["sourceExtensions"]:
+            parms["sourceExtensions"] = self.parameters["sourceExtensions"][:]
+            for ext in self.parameters["sourceExtensions"]:
                 if ext.strip():
                     args.append("--extension={0}".format(ext.strip()))
-        
+
         # 2b. style commandline options
-        if self.parameters['cssFile'] != self.defaults['cssFile']:
-            cssFile = self.project.getRelativePath(self.parameters['cssFile'])
+        if self.parameters["cssFile"] != self.defaults["cssFile"]:
+            cssFile = self.project.getRelativePath(self.parameters["cssFile"])
             if cssFile.startswith(Utilities.getPythonLibraryDirectory()):
                 cssFile = cssFile.replace(
-                    Utilities.getPythonLibraryDirectory(), "%PYTHON%")
-            parms['cssFile'] = Utilities.fromNativeSeparators(cssFile)
-            args.append('-c')
-            if os.path.isabs(self.parameters['cssFile']):
-                args.append(self.parameters['cssFile'])
+                    Utilities.getPythonLibraryDirectory(), "%PYTHON%"
+                )
+            parms["cssFile"] = Utilities.fromNativeSeparators(cssFile)
+            args.append("-c")
+            if os.path.isabs(self.parameters["cssFile"]):
+                args.append(self.parameters["cssFile"])
             else:
-                args.append(
-                    os.path.join(self.ppath, self.parameters['cssFile']))
+                args.append(os.path.join(self.ppath, self.parameters["cssFile"]))
         for key in self.colors:
             if self.colors[key] != eric7docDefaultColors[key]:
                 parms[key] = self.colors[key]
-                args.append("--{0}={1}".format(
-                    eric7docColorParameterNames[key], self.colors[key]))
-        
+                args.append(
+                    "--{0}={1}".format(
+                        eric7docColorParameterNames[key], self.colors[key]
+                    )
+                )
+
         # 2c. QtHelp commandline options
-        parms['qtHelpEnabled'] = self.parameters['qtHelpEnabled']
-        if self.parameters['qtHelpEnabled']:
-            args.append('--create-qhp')
+        parms["qtHelpEnabled"] = self.parameters["qtHelpEnabled"]
+        if self.parameters["qtHelpEnabled"]:
+            args.append("--create-qhp")
         if (
-            self.parameters['qtHelpOutputDirectory'] !=
-            self.defaults['qtHelpOutputDirectory']
+            self.parameters["qtHelpOutputDirectory"]
+            != self.defaults["qtHelpOutputDirectory"]
         ):
-            parms['qtHelpOutputDirectory'] = self.project.getRelativeUniversalPath(
-                self.parameters['qtHelpOutputDirectory']
+            parms["qtHelpOutputDirectory"] = self.project.getRelativeUniversalPath(
+                self.parameters["qtHelpOutputDirectory"]
             )
-            if os.path.isabs(self.parameters['outputDirectory']):
-                args.append("--qhp-outdir={0}".format(
-                    self.parameters['qtHelpOutputDirectory'])
+            if os.path.isabs(self.parameters["outputDirectory"]):
+                args.append(
+                    "--qhp-outdir={0}".format(self.parameters["qtHelpOutputDirectory"])
                 )
             else:
-                args.append("--qhp-outdir={0}".format(
-                    self.project.getAbsolutePath(
-                        self.parameters['qtHelpOutputDirectory']
+                args.append(
+                    "--qhp-outdir={0}".format(
+                        self.project.getAbsolutePath(
+                            self.parameters["qtHelpOutputDirectory"]
+                        )
                     )
-                ))
+                )
+        if self.parameters["qtHelpNamespace"] != self.defaults["qtHelpNamespace"]:
+            parms["qtHelpNamespace"] = self.parameters["qtHelpNamespace"]
+            args.append(
+                "--qhp-namespace={0}".format(self.parameters["qtHelpNamespace"])
+            )
         if (
-            self.parameters['qtHelpNamespace'] !=
-            self.defaults['qtHelpNamespace']
-        ):
-            parms['qtHelpNamespace'] = self.parameters['qtHelpNamespace']
-            args.append("--qhp-namespace={0}".format(
-                self.parameters['qtHelpNamespace']))
-        if (
-            self.parameters['qtHelpVirtualFolder'] !=
-            self.defaults['qtHelpVirtualFolder']
-        ):
-            parms['qtHelpVirtualFolder'] = (
-                self.parameters['qtHelpVirtualFolder']
-            )
-            args.append("--qhp-virtualfolder={0}".format(
-                self.parameters['qtHelpVirtualFolder']))
-        if (
-            self.parameters['qtHelpFilterName'] !=
-            self.defaults['qtHelpFilterName']
+            self.parameters["qtHelpVirtualFolder"]
+            != self.defaults["qtHelpVirtualFolder"]
         ):
-            parms['qtHelpFilterName'] = self.parameters['qtHelpFilterName']
-            args.append("--qhp-filtername={0}".format(
-                self.parameters['qtHelpFilterName']))
-        if (
-            self.parameters['qtHelpFilterAttributes'] !=
-            self.defaults['qtHelpFilterAttributes']
-        ):
-            parms['qtHelpFilterAttributes'] = (
-                self.parameters['qtHelpFilterAttributes']
+            parms["qtHelpVirtualFolder"] = self.parameters["qtHelpVirtualFolder"]
+            args.append(
+                "--qhp-virtualfolder={0}".format(self.parameters["qtHelpVirtualFolder"])
+            )
+        if self.parameters["qtHelpFilterName"] != self.defaults["qtHelpFilterName"]:
+            parms["qtHelpFilterName"] = self.parameters["qtHelpFilterName"]
+            args.append(
+                "--qhp-filtername={0}".format(self.parameters["qtHelpFilterName"])
             )
-            args.append("--qhp-filterattribs={0}".format(
-                self.parameters['qtHelpFilterAttributes']))
-        if self.parameters['qtHelpTitle'] != self.defaults['qtHelpTitle']:
-            parms['qtHelpTitle'] = self.parameters['qtHelpTitle']
-            args.append("--qhp-title={0}".format(
-                self.parameters['qtHelpTitle']))
         if (
-            self.parameters['qtHelpCreateCollection'] !=
-            self.defaults['qtHelpCreateCollection']
+            self.parameters["qtHelpFilterAttributes"]
+            != self.defaults["qtHelpFilterAttributes"]
         ):
-            parms['qtHelpCreateCollection'] = (
-                self.parameters['qtHelpCreateCollection']
+            parms["qtHelpFilterAttributes"] = self.parameters["qtHelpFilterAttributes"]
+            args.append(
+                "--qhp-filterattribs={0}".format(
+                    self.parameters["qtHelpFilterAttributes"]
+                )
             )
-            args.append('--create-qhc')
-        
+        if self.parameters["qtHelpTitle"] != self.defaults["qtHelpTitle"]:
+            parms["qtHelpTitle"] = self.parameters["qtHelpTitle"]
+            args.append("--qhp-title={0}".format(self.parameters["qtHelpTitle"]))
+        if (
+            self.parameters["qtHelpCreateCollection"]
+            != self.defaults["qtHelpCreateCollection"]
+        ):
+            parms["qtHelpCreateCollection"] = self.parameters["qtHelpCreateCollection"]
+            args.append("--create-qhc")
+
         startDir = (
-            self.project.getAbsolutePath(self.parameters['startDirectory'])
-            if self.parameters['startDirectory'] else
-            ""
+            self.project.getAbsolutePath(self.parameters["startDirectory"])
+            if self.parameters["startDirectory"]
+            else ""
         )
         return args, parms, startDir
-    
+
     @pyqtSlot(str)
     def on_startDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a start directory.
-        
+
         @param path path of the start directory
         @type str
         """
@@ -354,12 +336,12 @@
         while dn.endswith(os.sep):
             dn = dn[:-1]
         self.startDirPicker.setText(dn)
-    
+
     @pyqtSlot(str)
     def on_outputDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of an output directory.
-        
+
         @param path path of the output directory
         @type str
         """
@@ -368,12 +350,12 @@
         while dn.endswith(os.sep):
             dn = dn[:-1]
         self.outputDirPicker.setText(dn)
-    
+
     @pyqtSlot(str)
     def on_ignoreDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a directory to be ignored.
-        
+
         @param path path of the directory to be ignored
         @type str
         """
@@ -387,7 +369,7 @@
     def on_addButton_clicked(self):
         """
         Private slot to add the directory displayed to the listview.
-        
+
         The directory in the ignore directories
         line edit is moved to the listbox above and the edit is cleared.
         """
@@ -403,12 +385,12 @@
         """
         itm = self.ignoreDirsList.takeItem(self.ignoreDirsList.currentRow())
         del itm
-    
+
     @pyqtSlot(str)
     def on_cssPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a css style sheet.
-        
+
         @param path path of the css style sheet
         @type str
         """
@@ -419,7 +401,7 @@
     def __selectColor(self, colorKey):
         """
         Private method to select a color.
-        
+
         @param colorKey key of the color to select (string)
         """
         color = QColorDialog.getColor(QColor(self.colors[colorKey]))
@@ -432,64 +414,64 @@
         """
         Private slot to select the body foreground color.
         """
-        self.__selectColor('BodyColor')
-    
+        self.__selectColor("BodyColor")
+
     @pyqtSlot()
     def on_bodyBgButton_clicked(self):
         """
         Private slot to select the body background color.
         """
-        self.__selectColor('BodyBgColor')
-    
+        self.__selectColor("BodyBgColor")
+
     @pyqtSlot()
     def on_l1FgButton_clicked(self):
         """
         Private slot to select the level 1 header foreground color.
         """
-        self.__selectColor('Level1HeaderColor')
-    
+        self.__selectColor("Level1HeaderColor")
+
     @pyqtSlot()
     def on_l1BgButton_clicked(self):
         """
         Private slot to select the level 1 header background color.
         """
-        self.__selectColor('Level1HeaderBgColor')
-    
+        self.__selectColor("Level1HeaderBgColor")
+
     @pyqtSlot()
     def on_l2FgButton_clicked(self):
         """
         Private slot to select the level 2 header foreground color.
         """
-        self.__selectColor('Level2HeaderColor')
-    
+        self.__selectColor("Level2HeaderColor")
+
     @pyqtSlot()
     def on_l2BgButton_clicked(self):
         """
         Private slot to select the level 2 header background color.
         """
-        self.__selectColor('Level2HeaderBgColor')
-    
+        self.__selectColor("Level2HeaderBgColor")
+
     @pyqtSlot()
     def on_cfFgButton_clicked(self):
         """
         Private slot to select the class/function header foreground color.
         """
-        self.__selectColor('CFColor')
-    
+        self.__selectColor("CFColor")
+
     @pyqtSlot()
     def on_cfBgButton_clicked(self):
         """
         Private slot to select the class/function header background color.
         """
-        self.__selectColor('CFBgColor')
-    
+        self.__selectColor("CFBgColor")
+
     @pyqtSlot()
     def on_linkFgButton_clicked(self):
         """
         Private slot to select the foreground color of links.
         """
-        self.__selectColor('LinkColor')
-    
+        self.__selectColor("LinkColor")
+
     def __checkQtHelpOptions(self):
         """
         Private slot to check the QtHelp options and set the ok button
@@ -502,55 +484,55 @@
             if not self.qtHelpFolderEdit.text():
                 setOn = False
             else:
-                if '/' in self.qtHelpFolderEdit.text():
+                if "/" in self.qtHelpFolderEdit.text():
                     setOn = False
             if not self.qtHelpTitleEdit.text():
                 setOn = False
-        
+
         self.__okButton.setEnabled(setOn)
-    
+
     @pyqtSlot(bool)
     def on_qtHelpGroup_toggled(self, enabled):
         """
         Private slot to toggle the generation of QtHelp files.
-        
+
         @param enabled flag indicating the state (boolean)
         """
         self.__checkQtHelpOptions()
-    
+
     @pyqtSlot(str)
     def on_qtHelpNamespaceEdit_textChanged(self, txt):
         """
         Private slot to check the namespace.
-        
+
         @param txt text of the line edit (string)
         """
         self.__checkQtHelpOptions()
-    
+
     @pyqtSlot(str)
     def on_qtHelpFolderEdit_textChanged(self, txt):
         """
         Private slot to check the virtual folder.
-        
+
         @param txt text of the line edit (string)
         """
         self.__checkQtHelpOptions()
-    
+
     @pyqtSlot(str)
     def on_qtHelpTitleEdit_textChanged(self, txt):
         """
         Private slot to check the title.
-        
+
         @param txt text of the line edit (string)
         """
         self.__checkQtHelpOptions()
-    
+
     @pyqtSlot(str)
     def on_qtHelpDirPicker_pathSelected(self, path):
         """
         Private slot handling the selection of the output directory for the
         QtHelp files.
-        
+
         @param path path of the the output directory for the QtHelp files
         @type str
         """
@@ -559,61 +541,60 @@
         while dn.endswith(os.sep):
             dn = dn[:-1]
         self.qtHelpDirPicker.setText(dn)
-    
+
     def accept(self):
         """
         Public slot called by the Ok button.
-        
+
         It saves the values in the parameters dictionary.
         """
-        self.parameters['useRecursion'] = self.recursionCheckBox.isChecked()
-        self.parameters['noindex'] = self.noindexCheckBox.isChecked()
-        self.parameters['noempty'] = self.noemptyCheckBox.isChecked()
-        
+        self.parameters["useRecursion"] = self.recursionCheckBox.isChecked()
+        self.parameters["noindex"] = self.noindexCheckBox.isChecked()
+        self.parameters["noempty"] = self.noemptyCheckBox.isChecked()
+
         startdir = self.startDirPicker.text()
         if startdir:
             startdir = os.path.normpath(startdir)
             if startdir.endswith(os.sep):
                 startdir = startdir[:-1]
         self.parameters["startDirectory"] = startdir
-        
+
         outdir = self.outputDirPicker.text()
         if outdir:
             outdir = os.path.normpath(outdir)
             if outdir.endswith(os.sep):
                 outdir = outdir[:-1]
-        self.parameters['outputDirectory'] = outdir
-        
-        self.parameters['ignoreDirectories'] = []
+        self.parameters["outputDirectory"] = outdir
+
+        self.parameters["ignoreDirectories"] = []
         for row in range(0, self.ignoreDirsList.count()):
             itm = self.ignoreDirsList.item(row)
-            self.parameters['ignoreDirectories'].append(
-                os.path.normpath(itm.text()))
+            self.parameters["ignoreDirectories"].append(os.path.normpath(itm.text()))
         cssFile = self.cssPicker.text()
-        if cssFile != '':
+        if cssFile != "":
             cssFile = os.path.normpath(cssFile)
-        self.parameters['cssFile'] = cssFile
-        extensions = self.sourceExtEdit.text().split(',')
-        self.parameters['sourceExtensions'] = [
+        self.parameters["cssFile"] = cssFile
+        extensions = self.sourceExtEdit.text().split(",")
+        self.parameters["sourceExtensions"] = [
             ext.strip() for ext in extensions if ext.strip()
         ]
-        patterns = self.excludeFilesEdit.text().split(',')
-        self.parameters['ignoreFilePatterns'] = [
+        patterns = self.excludeFilesEdit.text().split(",")
+        self.parameters["ignoreFilePatterns"] = [
             pattern.strip() for pattern in patterns if pattern.strip()
         ]
-        
-        self.parameters['qtHelpEnabled'] = self.qtHelpGroup.isChecked()
-        self.parameters['qtHelpOutputDirectory'] = self.qtHelpDirPicker.text()
-        self.parameters['qtHelpNamespace'] = self.qtHelpNamespaceEdit.text()
-        self.parameters['qtHelpVirtualFolder'] = self.qtHelpFolderEdit.text()
-        self.parameters['qtHelpFilterName'] = self.qtHelpFilterNameEdit.text()
-        self.parameters['qtHelpFilterAttributes'] = (
-            self.qtHelpFilterAttributesEdit.text()
-        )
-        self.parameters['qtHelpTitle'] = self.qtHelpTitleEdit.text()
-        self.parameters['qtHelpCreateCollection'] = (
-            self.qtHelpGenerateCollectionCheckBox.isChecked()
-        )
-        
+
+        self.parameters["qtHelpEnabled"] = self.qtHelpGroup.isChecked()
+        self.parameters["qtHelpOutputDirectory"] = self.qtHelpDirPicker.text()
+        self.parameters["qtHelpNamespace"] = self.qtHelpNamespaceEdit.text()
+        self.parameters["qtHelpVirtualFolder"] = self.qtHelpFolderEdit.text()
+        self.parameters["qtHelpFilterName"] = self.qtHelpFilterNameEdit.text()
+        self.parameters[
+            "qtHelpFilterAttributes"
+        ] = self.qtHelpFilterAttributesEdit.text()
+        self.parameters["qtHelpTitle"] = self.qtHelpTitleEdit.text()
+        self.parameters[
+            "qtHelpCreateCollection"
+        ] = self.qtHelpGenerateCollectionCheckBox.isChecked()
+
         # call the accept slot of the base class
         super().accept()
--- a/src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,40 +22,39 @@
 class EricdocExecDialog(QDialog, Ui_EricdocExecDialog):
     """
     Class implementing a dialog to show the output of the ericdoc process.
-    
+
     This class starts a QProcess and displays a dialog that
     shows the output of the documentation command process.
     """
+
     def __init__(self, cmdname, parent=None):
         """
         Constructor
-        
+
         @param cmdname name of the documentation generator (string)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setModal(True)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = None
         self.cmdname = cmdname
-        
+
     def start(self, args, fn):
         """
         Public slot to start the ericdoc command.
-        
+
         @param args commandline arguments for ericdoc program (list of strings)
         @param fn filename or dirname to be processed by ericdoc program
             (string)
         @return flag indicating the successful start of the process (boolean)
         """
         self.errorGroup.hide()
-        
+
         self.filename = fn
         if os.path.isdir(self.filename):
             dname = os.path.abspath(self.filename)
@@ -66,54 +65,50 @@
         else:
             dname = os.path.dirname(self.filename)
             fname = os.path.basename(self.filename)
-        
+
         self.contents.clear()
         self.errors.clear()
-        
+
         program = args[0]
         del args[0]
         args.append(fname)
-        
+
         self.process = QProcess()
         self.process.setWorkingDirectory(dname)
-        
+
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
         self.process.finished.connect(self.__finish)
-        
-        self.setWindowTitle(
-            self.tr('{0} - {1}').format(self.cmdname, self.filename))
+
+        self.setWindowTitle(self.tr("{0} - {1}").format(self.cmdname, self.filename))
         self.process.start(program, args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format(program))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format(program),
+            )
         return procStarted
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __finish(self):
         """
         Private slot called when the process finished.
-        
+
         It is called when the process finished or
         the user pressed the button.
         """
@@ -124,50 +119,47 @@
                 self.process.waitForFinished(3000)
             if self.process.exitStatus() == QProcess.ExitStatus.CrashExit:
                 self.contents.insertPlainText(
-                    self.tr('\n{0} crashed.\n').format(self.cmdname))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+                    self.tr("\n{0} crashed.\n").format(self.cmdname)
+                )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.process = None
-        
-        self.contents.insertPlainText(
-            self.tr('\n{0} finished.\n').format(self.cmdname))
+
+        self.contents.insertPlainText(self.tr("\n{0} finished.\n").format(self.cmdname))
         self.contents.ensureCursorVisible()
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.contents.insertPlainText(s)
             self.contents.ensureCursorVisible()
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardError)
-        
+
         while self.process.canReadLine():
             self.errorGroup.show()
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
--- a/src/eric7/Plugins/PluginAbout.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginAbout.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,26 +36,27 @@
     """
     Class implementing the About plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         self.__aboutDialog = None
 
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initActions()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -67,44 +68,57 @@
             menu.removeAction(self.aboutAct)
             menu.removeAction(self.aboutQtAct)
         acts = [self.aboutAct, self.aboutQtAct]
-        self.__ui.removeEricActions(acts, 'ui')
-    
+        self.__ui.removeEricActions(acts, "ui")
+
     def __initActions(self):
         """
         Private method to initialize the actions.
         """
         acts = []
-        
+
         self.aboutAct = EricAction(
-            self.tr('About {0}').format(UI.Info.Program),
+            self.tr("About {0}").format(UI.Info.Program),
             UI.PixmapCache.getIcon("helpAbout"),
-            self.tr('&About {0}').format(UI.Info.Program),
-            0, 0, self, 'about_eric')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About {0}</b>"""
-            """<p>Display some information about this software.</p>"""
-        ).format(UI.Info.Program))
+            self.tr("&About {0}").format(UI.Info.Program),
+            0,
+            0,
+            self,
+            "about_eric",
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About {0}</b>"""
+                """<p>Display some information about this software.</p>"""
+            ).format(UI.Info.Program)
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.aboutAct.setMenuRole(QAction.MenuRole.AboutRole)
         acts.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
+            self.tr("About Qt"),
             UI.PixmapCache.getIcon("helpAboutQt"),
-            self.tr('About &Qt'), 0, 0, self, 'about_qt')
+            self.tr("About &Qt"),
+            0,
+            0,
+            self,
+            "about_qt",
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.aboutQtAct.setMenuRole(QAction.MenuRole.AboutQtRole)
         acts.append(self.aboutQtAct)
-        
-        self.__ui.addEricActions(acts, 'ui')
+
+        self.__ui.addEricActions(acts, "ui")
 
     def __initMenu(self):
         """
@@ -119,16 +133,17 @@
             else:
                 menu.addAction(self.aboutAct)
                 menu.addAction(self.aboutQtAct)
-    
+
     def __about(self):
         """
         Private slot to handle the About dialog.
         """
         from AboutPlugin.AboutDialog import AboutDialog
+
         if self.__aboutDialog is None:
             self.__aboutDialog = AboutDialog(self.__ui)
         self.__aboutDialog.show()
-        
+
     def __aboutQt(self):
         """
         Private slot to handle the About Qt dialog.
--- a/src/eric7/Plugins/PluginCodeStyleChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginCodeStyleChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -48,92 +48,98 @@
 class CodeStyleCheckerPlugin(QObject):
     """
     Class implementing the code style checker plug-in.
-    
+
     @signal styleChecked(str, dict, int, list) emitted when the style check was
         done for a file.
     @signal batchFinished() emitted when a style check batch is done
     @signal error(str, str) emitted in case of an error
     """
+
     styleChecked = pyqtSignal(str, dict, int, list)
     batchFinished = pyqtSignal()
     error = pyqtSignal(str, str)
-    
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
         self.backgroundService = ericApp().getObject("BackgroundService")
-        
+
         path = os.path.join(
-            os.path.dirname(__file__), 'CheckerPlugins', 'CodeStyleChecker')
+            os.path.dirname(__file__), "CheckerPlugins", "CodeStyleChecker"
+        )
         self.backgroundService.serviceConnect(
-            'style', 'Python3', path, 'CodeStyleChecker',
+            "style",
+            "Python3",
+            path,
+            "CodeStyleChecker",
             self.__translateStyleCheck,
             onErrorCallback=self.serviceErrorPy3,
-            onBatchDone=self.batchJobDone)
-        
+            onBatchDone=self.batchJobDone,
+        )
+
         self.queuedBatches = []
         self.batchesFinished = True
-        
+
         self.__wrapper = textwrap.TextWrapper(width=80)
-    
+
     def __serviceError(self, fn, msg):
         """
         Private slot handling service errors.
-        
+
         @param fn file name (string)
         @param msg message text (string)
         """
         self.error.emit(fn, msg)
-    
+
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
         Public slot handling service errors for Python 3.
-        
+
         @param fx service name (string)
         @param lang language (string)
         @param fn file name (string)
         @param msg message text (string)
         """
-        if fx in ['style', 'batch_style'] and lang == 'Python3':
-            if fx == 'style':
+        if fx in ["style", "batch_style"] and lang == "Python3":
+            if fx == "style":
                 self.__serviceError(fn, msg)
             else:
                 self.__serviceError(self.tr("Python 3 batch check"), msg)
                 self.batchJobDone(fx, lang)
-    
+
     def batchJobDone(self, fx, lang):
         """
         Public slot handling the completion of a batch job.
-        
+
         @param fx service name (string)
         @param lang language (string)
         """
-        if fx in ['style', 'batch_style']:
+        if fx in ["style", "batch_style"]:
             if lang in self.queuedBatches:
                 self.queuedBatches.remove(lang)
             # prevent sending the signal multiple times
             if len(self.queuedBatches) == 0 and not self.batchesFinished:
                 self.batchFinished.emit()
                 self.batchesFinished = True
-    
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plugin.
         """
         self.__projectAct = None
         self.__projectCodeStyleCheckerDialog = None
-        
+
         self.__projectBrowserAct = None
         self.__projectBrowserMenu = None
         self.__projectBrowserCodeStyleCheckerDialog = None
-        
+
         self.__editors = []
         self.__editorAct = None
         self.__editorCodeStyleCheckerDialog = None
@@ -158,17 +164,17 @@
             bool, str, dict, dict, list of str, str, str, bool)
         """
         if lang is None:
-            lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-        if lang != 'Python3':
+            lang = "Python{0}".format(determinePythonVersion(filename, source))
+        if lang != "Python3":
             return
-        
+
         data = [source, args]
-        self.backgroundService.enqueueRequest('style', lang, filename, data)
-    
+        self.backgroundService.enqueueRequest("style", lang, filename, data)
+
     def styleBatchCheck(self, argumentsList):
         """
         Public method to prepare a style check on multiple Python source files.
-        
+
         @param argumentsList list of arguments tuples with each tuple
             containing filename, source and args as given in styleCheck()
             method
@@ -178,29 +184,30 @@
             "Python3": [],
         }
         for filename, source, args in argumentsList:
-            lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-            if lang != 'Python3':
+            lang = "Python{0}".format(determinePythonVersion(filename, source))
+            if lang != "Python3":
                 continue
             else:
                 data[lang].append((filename, source, args))
-        
+
         self.queuedBatches = []
-        if data['Python3']:
-            self.queuedBatches.append('Python3')
-            self.backgroundService.enqueueRequest('batch_style', 'Python3', "",
-                                                  data['Python3'])
+        if data["Python3"]:
+            self.queuedBatches.append("Python3")
+            self.backgroundService.enqueueRequest(
+                "batch_style", "Python3", "", data["Python3"]
+            )
             self.batchesFinished = False
-    
+
     def cancelStyleBatchCheck(self):
         """
         Public method to cancel all batch jobs.
         """
-        self.backgroundService.requestCancel('batch_style', 'Python3')
-    
+        self.backgroundService.requestCancel("batch_style", "Python3")
+
     def __translateStyleCheck(self, fn, codeStyleCheckerStats, results):
         """
         Private slot called after performing a style check on one file.
-        
+
         @param fn filename of the just checked file
         @type str
         @param codeStyleCheckerStats stats of style and name check
@@ -209,144 +216,153 @@
             (see CodesStyleChecker.__checkCodeStyle for details)
         @type dict
         """
-        from CheckerPlugins.CodeStyleChecker.translations import (
-            getTranslatedMessage
-        )
-        
+        from CheckerPlugins.CodeStyleChecker.translations import getTranslatedMessage
+
         fixes = 0
         for result in results:
             msg = getTranslatedMessage(result["code"], result["args"])
-        
+
             if result["fixcode"]:
                 fixes += 1
-                trFixedMsg = getTranslatedMessage(result["fixcode"],
-                                                  result["fixargs"])
-                
+                trFixedMsg = getTranslatedMessage(result["fixcode"], result["fixargs"])
+
                 msg += "\n" + QCoreApplication.translate(
-                    'CodeStyleCheckerDialog', "Fix: {0}").format(trFixedMsg)
-            
+                    "CodeStyleCheckerDialog", "Fix: {0}"
+                ).format(trFixedMsg)
+
             result["display"] = "\n".join(self.__wrapper.wrap(msg))
         self.styleChecked.emit(fn, codeStyleCheckerStats, fixes, results)
 
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             self.__projectAct = EricAction(
-                self.tr('Check Code Style'),
-                self.tr('&Code Style...'), 0, 0,
-                self, 'project_check_pep8')
-            self.__projectAct.setStatusTip(
-                self.tr('Check code style.'))
-            self.__projectAct.setWhatsThis(self.tr(
+                self.tr("Check Code Style"),
+                self.tr("&Code Style..."),
+                0,
+                0,
+                self,
+                "project_check_pep8",
+            )
+            self.__projectAct.setStatusTip(self.tr("Check code style."))
+            self.__projectAct.setWhatsThis(
+                self.tr(
+                    """<b>Check Code Style...</b>"""
+                    """<p>This checks Python files for compliance to the"""
+                    """ code style conventions given in various PEPs.</p>"""
+                )
+            )
+            self.__projectAct.triggered.connect(self.__projectCodeStyleCheck)
+            ericApp().getObject("Project").addEricActions([self.__projectAct])
+            menu.addAction(self.__projectAct)
+
+        self.__editorAct = EricAction(
+            self.tr("Check Code Style"), self.tr("&Code Style..."), 0, 0, self, ""
+        )
+        self.__editorAct.setWhatsThis(
+            self.tr(
                 """<b>Check Code Style...</b>"""
                 """<p>This checks Python files for compliance to the"""
                 """ code style conventions given in various PEPs.</p>"""
-            ))
-            self.__projectAct.triggered.connect(
-                self.__projectCodeStyleCheck)
-            ericApp().getObject("Project").addEricActions([self.__projectAct])
-            menu.addAction(self.__projectAct)
-        
-        self.__editorAct = EricAction(
-            self.tr('Check Code Style'),
-            self.tr('&Code Style...'), 0, 0,
-            self, "")
-        self.__editorAct.setWhatsThis(self.tr(
-            """<b>Check Code Style...</b>"""
-            """<p>This checks Python files for compliance to the"""
-            """ code style conventions given in various PEPs.</p>"""
-        ))
+            )
+        )
         self.__editorAct.triggered.connect(self.__editorCodeStyleCheck)
-        
+
         ericApp().getObject("Project").showMenu.connect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.connect(self.__projectBrowserShowMenu)
-        ericApp().getObject("ViewManager").editorOpenedEd.connect(
-            self.__editorOpened)
-        ericApp().getObject("ViewManager").editorClosedEd.connect(
-            self.__editorClosed)
-        
+            "sources"
+        ).showMenu.connect(self.__projectBrowserShowMenu)
+        ericApp().getObject("ViewManager").editorOpenedEd.connect(self.__editorOpened)
+        ericApp().getObject("ViewManager").editorClosedEd.connect(self.__editorClosed)
+
         for editor in ericApp().getObject("ViewManager").getOpenEditors():
             self.__editorOpened(editor)
-        
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        ericApp().getObject("Project").showMenu.disconnect(
-            self.__projectShowMenu)
+        ericApp().getObject("Project").showMenu.disconnect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.disconnect(self.__projectBrowserShowMenu)
+            "sources"
+        ).showMenu.disconnect(self.__projectBrowserShowMenu)
         ericApp().getObject("ViewManager").editorOpenedEd.disconnect(
-            self.__editorOpened)
+            self.__editorOpened
+        )
         ericApp().getObject("ViewManager").editorClosedEd.disconnect(
-            self.__editorClosed)
-        
+            self.__editorClosed
+        )
+
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             menu.removeAction(self.__projectAct)
-        
+
         if self.__projectBrowserMenu and self.__projectBrowserAct:
-            self.__projectBrowserMenu.removeAction(
-                self.__projectBrowserAct)
-        
+            self.__projectBrowserMenu.removeAction(self.__projectBrowserAct)
+
         for editor in self.__editors:
             editor.showMenu.disconnect(self.__editorShowMenu)
             menu = editor.getMenu("Checks")
             if menu is not None:
                 menu.removeAction(self.__editorAct)
-        
+
         self.__initialize()
-    
+
     def __projectShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
-                ericApp().getObject("Project").getProjectLanguage() in
-                ["Python3", "MicroPython"])
-    
+                ericApp().getObject("Project").getProjectLanguage()
+                in ["Python3", "MicroPython"]
+            )
+
     def __projectBrowserShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project browser menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
-        if (
-            menuName == "Checks" and
-            ericApp().getObject("Project").getProjectLanguage() in
-                ["Python3", "MicroPython"]
-        ):
+        if menuName == "Checks" and ericApp().getObject(
+            "Project"
+        ).getProjectLanguage() in ["Python3", "MicroPython"]:
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
                 self.__projectBrowserAct = EricAction(
-                    self.tr('Check Code Style'),
-                    self.tr('&Code Style...'), 0, 0,
-                    self, "")
-                self.__projectBrowserAct.setWhatsThis(self.tr(
-                    """<b>Check Code Style...</b>"""
-                    """<p>This checks Python files for compliance to the"""
-                    """ code style conventions given in various PEPs.</p>"""
-                ))
+                    self.tr("Check Code Style"),
+                    self.tr("&Code Style..."),
+                    0,
+                    0,
+                    self,
+                    "",
+                )
+                self.__projectBrowserAct.setWhatsThis(
+                    self.tr(
+                        """<b>Check Code Style...</b>"""
+                        """<p>This checks Python files for compliance to the"""
+                        """ code style conventions given in various PEPs.</p>"""
+                    )
+                )
                 self.__projectBrowserAct.triggered.connect(
-                    self.__projectBrowserCodeStyleCheck)
+                    self.__projectBrowserCodeStyleCheck
+                )
             if self.__projectBrowserAct not in menu.actions():
                 menu.addAction(self.__projectBrowserAct)
-    
+
     def __projectCodeStyleCheck(self):
         """
         Private slot used to check the project files for code style.
@@ -354,26 +370,26 @@
         project = ericApp().getObject("Project")
         project.saveAllScripts()
         ppath = project.getProjectPath()
-        files = [os.path.join(ppath, file)
-                 for file in project.pdata["SOURCES"]
-                 if file.endswith(
-                     tuple(Preferences.getPython("Python3Extensions")))]
-        
+        files = [
+            os.path.join(ppath, file)
+            for file in project.pdata["SOURCES"]
+            if file.endswith(tuple(Preferences.getPython("Python3Extensions")))
+        ]
+
         from CheckerPlugins.CodeStyleChecker import CodeStyleCheckerDialog
+
         self.__projectCodeStyleCheckerDialog = (
             CodeStyleCheckerDialog.CodeStyleCheckerDialog(self)
         )
         self.__projectCodeStyleCheckerDialog.show()
         self.__projectCodeStyleCheckerDialog.prepare(files, project)
-    
+
     def __projectBrowserCodeStyleCheck(self):
         """
         Private method to handle the code style check context menu action of
         the project sources browser.
         """
-        browser = (
-            ericApp().getObject("ProjectBrowser").getProjectBrowser("sources")
-        )
+        browser = ericApp().getObject("ProjectBrowser").getProjectBrowser("sources")
         if browser.getSelectedItemsCount([ProjectBrowserFileItem]) > 1:
             fn = []
             for itm in browser.getSelectedItems([ProjectBrowserFileItem]):
@@ -387,23 +403,24 @@
             except AttributeError:
                 fn = itm.dirName()
                 isDir = True
-        
+
         from CheckerPlugins.CodeStyleChecker import CodeStyleCheckerDialog
+
         self.__projectBrowserCodeStyleCheckerDialog = (
             CodeStyleCheckerDialog.CodeStyleCheckerDialog(self)
         )
         self.__projectBrowserCodeStyleCheckerDialog.show()
         if isDir:
-            self.__projectBrowserCodeStyleCheckerDialog.start(
-                fn, save=True)
+            self.__projectBrowserCodeStyleCheckerDialog.start(fn, save=True)
         else:
             self.__projectBrowserCodeStyleCheckerDialog.start(
-                fn, save=True, repeat=True)
-    
+                fn, save=True, repeat=True
+            )
+
     def __editorOpened(self, editor):
         """
         Private slot called, when a new editor was opened.
-        
+
         @param editor reference to the new editor (QScintilla.Editor)
         """
         menu = editor.getMenu("Checks")
@@ -411,21 +428,21 @@
             menu.addAction(self.__editorAct)
             editor.showMenu.connect(self.__editorShowMenu)
             self.__editors.append(editor)
-    
+
     def __editorClosed(self, editor):
         """
         Private slot called, when an editor was closed.
-        
+
         @param editor reference to the editor (QScintilla.Editor)
         """
         with contextlib.suppress(ValueError):
             self.__editors.remove(editor)
-    
+
     def __editorShowMenu(self, menuName, menu, editor):
         """
         Private slot called, when the the editor context menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         @param editor reference to the editor
@@ -434,7 +451,7 @@
             if self.__editorAct not in menu.actions():
                 menu.addAction(self.__editorAct)
             self.__editorAct.setEnabled(editor.isPyFile())
-    
+
     def __editorCodeStyleCheck(self):
         """
         Private slot to handle the code style check context menu action
@@ -442,18 +459,16 @@
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
         if (
-            editor is not None and
-            editor.checkDirty() and
-            editor.getFileName() is not None
+            editor is not None
+            and editor.checkDirty()
+            and editor.getFileName() is not None
         ):
-            from CheckerPlugins.CodeStyleChecker import (
-                CodeStyleCheckerDialog
-            )
+            from CheckerPlugins.CodeStyleChecker import CodeStyleCheckerDialog
+
             self.__editorCodeStyleCheckerDialog = (
                 CodeStyleCheckerDialog.CodeStyleCheckerDialog(self)
             )
             self.__editorCodeStyleCheckerDialog.show()
             self.__editorCodeStyleCheckerDialog.start(
-                editor.getFileName(),
-                save=True,
-                repeat=True)
+                editor.getFileName(), save=True, repeat=True
+            )
--- a/src/eric7/Plugins/PluginEricapi.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginEricapi.py	Wed Jul 13 14:55:47 2022 +0200
@@ -45,11 +45,11 @@
 def exeDisplayData():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to query the presence of
         the executable
     """
-    exe = 'eric7_api'
+    exe = "eric7_api"
     if Utilities.isWindowsPlatform():
         for exepath in (
             getConfig("bindir"),
@@ -73,19 +73,20 @@
             if os.path.exists(exe_):
                 exe = exe_
                 break
-    
+
     data = {
         "programEntry": True,
         "header": QCoreApplication.translate(
-            "EricapiPlugin", "eric API File Generator"),
+            "EricapiPlugin", "eric API File Generator"
+        ),
         "exe": exe,
-        "versionCommand": '--version',
-        "versionStartsWith": 'eric7_',
+        "versionCommand": "--version",
+        "versionStartsWith": "eric7_",
         "versionPosition": -3,
         "version": "",
         "versionCleanup": None,
     }
-    
+
     return data
 
 
@@ -93,16 +94,17 @@
     """
     Class implementing the Ericapi plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plugin.
@@ -112,108 +114,110 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         menu = ericApp().getObject("Project").getMenu("Apidoc")
         if menu:
             self.__projectAct = EricAction(
-                self.tr('Generate API file (eric7_api)'),
-                self.tr('Generate &API file (eric7_api)'), 0, 0,
-                self, 'doc_eric7_api')
-            self.__projectAct.setStatusTip(self.tr(
-                'Generate an API file using eric7_api'))
-            self.__projectAct.setWhatsThis(self.tr(
-                """<b>Generate API file</b>"""
-                """<p>Generate an API file using eric7_api.</p>"""
-            ))
+                self.tr("Generate API file (eric7_api)"),
+                self.tr("Generate &API file (eric7_api)"),
+                0,
+                0,
+                self,
+                "doc_eric7_api",
+            )
+            self.__projectAct.setStatusTip(
+                self.tr("Generate an API file using eric7_api")
+            )
+            self.__projectAct.setWhatsThis(
+                self.tr(
+                    """<b>Generate API file</b>"""
+                    """<p>Generate an API file using eric7_api.</p>"""
+                )
+            )
             self.__projectAct.triggered.connect(self.__doEricapi)
             ericApp().getObject("Project").addEricActions([self.__projectAct])
             menu.addAction(self.__projectAct)
-        
+
         ericApp().getObject("Project").showMenu.connect(self.__projectShowMenu)
-        
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        ericApp().getObject("Project").showMenu.disconnect(
-            self.__projectShowMenu)
-        
+        ericApp().getObject("Project").showMenu.disconnect(self.__projectShowMenu)
+
         menu = ericApp().getObject("Project").getMenu("Apidoc")
         if menu:
             menu.removeAction(self.__projectAct)
-            ericApp().getObject("Project").removeEricActions(
-                [self.__projectAct])
+            ericApp().getObject("Project").removeEricActions([self.__projectAct])
         self.__initialize()
-    
+
     def __projectShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if menuName == "Apidoc" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
-                ericApp().getObject("Project").getProjectLanguage() in
-                ["Python", "Python3", "Ruby", "MicroPython"])
-    
+                ericApp().getObject("Project").getProjectLanguage()
+                in ["Python", "Python3", "Ruby", "MicroPython"]
+            )
+
     def __doEricapi(self):
         """
         Private slot to perform the eric7_api api generation.
         """
-        from DocumentationPlugins.Ericapi.EricapiConfigDialog import (
-            EricapiConfigDialog
-        )
+        from DocumentationPlugins.Ericapi.EricapiConfigDialog import EricapiConfigDialog
+
         eolTranslation = {
-            '\r': 'cr',
-            '\n': 'lf',
-            '\r\n': 'crlf',
+            "\r": "cr",
+            "\n": "lf",
+            "\r\n": "crlf",
         }
         project = ericApp().getObject("Project")
-        parms = project.getData('DOCUMENTATIONPARMS', "ERIC4API")
+        parms = project.getData("DOCUMENTATIONPARMS", "ERIC4API")
         dlg = EricapiConfigDialog(project, parms)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             args, parms, startDir = dlg.generateParameters()
-            project.setData('DOCUMENTATIONPARMS', "ERIC4API", parms)
-            
+            project.setData("DOCUMENTATIONPARMS", "ERIC4API", parms)
+
             if not startDir:
                 startDir = project.ppath
-            
+
             # add parameter for the eol setting
             if not project.useSystemEol():
-                args.append(
-                    "--eol={0}".format(eolTranslation[project.getEolString()]))
-            
+                args.append("--eol={0}".format(eolTranslation[project.getEolString()]))
+
             # now do the call
-            from DocumentationPlugins.Ericapi.EricapiExecDialog import (
-                EricapiExecDialog
-            )
+            from DocumentationPlugins.Ericapi.EricapiExecDialog import EricapiExecDialog
+
             dia = EricapiExecDialog("Ericapi")
             res = dia.start(args, startDir)
             if res:
                 dia.exec()
-            
-            outputFileName = Utilities.toNativeSeparators(parms['outputFile'])
-            
+
+            outputFileName = Utilities.toNativeSeparators(parms["outputFile"])
+
             # add output files to the project data, if they aren't in already
-            for progLanguage in parms['languages']:
+            for progLanguage in parms["languages"]:
                 if "%L" in outputFileName:
                     outfile = outputFileName.replace("%L", progLanguage)
                 else:
-                    if len(parms['languages']) == 1:
+                    if len(parms["languages"]) == 1:
                         outfile = outputFileName
                     else:
                         root, ext = os.path.splitext(outputFileName)
-                        outfile = "{0}-{1}{2}".format(
-                            root, progLanguage.lower(), ext)
-                
+                        outfile = "{0}-{1}{2}".format(root, progLanguage.lower(), ext)
+
                 outfile = project.getRelativePath(outfile)
-                if outfile not in project.pdata['OTHERS']:
-                    project.pdata['OTHERS'].append(outfile)
+                if outfile not in project.pdata["OTHERS"]:
+                    project.pdata["OTHERS"].append(outfile)
                     project.setDirty(True)
                     project.othersAdded(outfile)
--- a/src/eric7/Plugins/PluginEricdoc.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginEricdoc.py	Wed Jul 13 14:55:47 2022 +0200
@@ -45,14 +45,14 @@
 def exeDisplayDataList():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to query the presence of
         the executable
     """
     dataList = []
-    
+
     # 1. eric7_doc
-    exe = 'eric7_doc'
+    exe = "eric7_doc"
     if Utilities.isWindowsPlatform():
         for exepath in (
             getConfig("bindir"),
@@ -76,57 +76,61 @@
             if os.path.exists(exe_):
                 exe = exe_
                 break
-    
-    dataList.append({
-        "programEntry": True,
-        "header": QCoreApplication.translate(
-            "EricdocPlugin", "eric Documentation Generator"),
-        "exe": exe,
-        "versionCommand": '--version',
-        "versionStartsWith": 'eric7_',
-        "versionPosition": -3,
-        "version": "",
-        "versionCleanup": None,
-    })
-    
+
+    dataList.append(
+        {
+            "programEntry": True,
+            "header": QCoreApplication.translate(
+                "EricdocPlugin", "eric Documentation Generator"
+            ),
+            "exe": exe,
+            "versionCommand": "--version",
+            "versionStartsWith": "eric7_",
+            "versionPosition": -3,
+            "version": "",
+            "versionCleanup": None,
+        }
+    )
+
     # 2. Qt Help Generator
     # 2.1 location before 6.3 (Linux and macOS) and Windows
     exe = os.path.join(
-        Utilities.getQtBinariesPath(),
-        Utilities.generateQtToolName('qhelpgenerator')
+        Utilities.getQtBinariesPath(), Utilities.generateQtToolName("qhelpgenerator")
     )
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
+        exe += ".exe"
     if os.path.exists(exe):
-        dataList.append({
-            "programEntry": True,
-            "header": QCoreApplication.translate(
-                "EricdocPlugin", "Qt Help Tools"),
-            "exe": exe,
-            "versionCommand": '-v',
-            "versionStartsWith": 'Qt',
-            "versionPosition": -1,
-            "version": "",
-            "versionCleanup": (0, -1),
-        })
+        dataList.append(
+            {
+                "programEntry": True,
+                "header": QCoreApplication.translate("EricdocPlugin", "Qt Help Tools"),
+                "exe": exe,
+                "versionCommand": "-v",
+                "versionStartsWith": "Qt",
+                "versionPosition": -1,
+                "version": "",
+                "versionCleanup": (0, -1),
+            }
+        )
     else:
         # 2.2 location starting with 6.3.0 (Linux and macOS)
         exe = os.path.join(
             Utilities.getQtBinariesPath(libexec=True),
-            Utilities.generateQtToolName('qhelpgenerator')
+            Utilities.generateQtToolName("qhelpgenerator"),
         )
-        dataList.append({
-            "programEntry": True,
-            "header": QCoreApplication.translate(
-                "EricdocPlugin", "Qt Help Tools"),
-            "exe": exe,
-            "versionCommand": '-v',
-            "versionStartsWith": 'Qt',
-            "versionPosition": -1,
-            "version": "",
-            "versionCleanup": (0, -1),
-        })
-    
+        dataList.append(
+            {
+                "programEntry": True,
+                "header": QCoreApplication.translate("EricdocPlugin", "Qt Help Tools"),
+                "exe": exe,
+                "versionCommand": "-v",
+                "versionStartsWith": "Qt",
+                "versionPosition": -1,
+                "version": "",
+                "versionCleanup": (0, -1),
+            }
+        )
+
     return dataList
 
 
@@ -134,16 +138,17 @@
     """
     Class implementing the Ericdoc plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plugin.
@@ -153,113 +158,115 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         menu = ericApp().getObject("Project").getMenu("Apidoc")
         if menu:
             self.__projectAct = EricAction(
-                self.tr('Generate documentation (eric7_doc)'),
-                self.tr('Generate &documentation (eric7_doc)'), 0, 0,
-                self, 'doc_eric7_doc')
+                self.tr("Generate documentation (eric7_doc)"),
+                self.tr("Generate &documentation (eric7_doc)"),
+                0,
+                0,
+                self,
+                "doc_eric7_doc",
+            )
             self.__projectAct.setStatusTip(
-                self.tr('Generate API documentation using eric7_doc'))
-            self.__projectAct.setWhatsThis(self.tr(
-                """<b>Generate documentation</b>"""
-                """<p>Generate API documentation using eric7_doc.</p>"""
-            ))
+                self.tr("Generate API documentation using eric7_doc")
+            )
+            self.__projectAct.setWhatsThis(
+                self.tr(
+                    """<b>Generate documentation</b>"""
+                    """<p>Generate API documentation using eric7_doc.</p>"""
+                )
+            )
             self.__projectAct.triggered.connect(self.__doEricdoc)
             ericApp().getObject("Project").addEricActions([self.__projectAct])
             menu.addAction(self.__projectAct)
-        
+
         ericApp().getObject("Project").showMenu.connect(self.__projectShowMenu)
-        
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        ericApp().getObject("Project").showMenu.disconnect(
-            self.__projectShowMenu)
-        
+        ericApp().getObject("Project").showMenu.disconnect(self.__projectShowMenu)
+
         menu = ericApp().getObject("Project").getMenu("Apidoc")
         if menu:
             menu.removeAction(self.__projectAct)
-            ericApp().getObject("Project").removeEricActions(
-                [self.__projectAct])
+            ericApp().getObject("Project").removeEricActions([self.__projectAct])
         self.__initialize()
-    
+
     def __projectShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if menuName == "Apidoc" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
-                ericApp().getObject("Project").getProjectLanguage() in
-                ["Python", "Python3", "Ruby", "MicroPython"])
-    
+                ericApp().getObject("Project").getProjectLanguage()
+                in ["Python", "Python3", "Ruby", "MicroPython"]
+            )
+
     def __doEricdoc(self):
         """
         Private slot to perform the eric7_doc api documentation generation.
         """
-        from DocumentationPlugins.Ericdoc.EricdocConfigDialog import (
-            EricdocConfigDialog
-        )
+        from DocumentationPlugins.Ericdoc.EricdocConfigDialog import EricdocConfigDialog
+
         eolTranslation = {
-            '\r': 'cr',
-            '\n': 'lf',
-            '\r\n': 'crlf',
+            "\r": "cr",
+            "\n": "lf",
+            "\r\n": "crlf",
         }
         project = ericApp().getObject("Project")
-        parms = project.getData('DOCUMENTATIONPARMS', "ERIC4DOC")
+        parms = project.getData("DOCUMENTATIONPARMS", "ERIC4DOC")
         dlg = EricdocConfigDialog(project, parms)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             args, parms, startDir = dlg.generateParameters()
-            project.setData('DOCUMENTATIONPARMS', "ERIC4DOC", parms)
-            
+            project.setData("DOCUMENTATIONPARMS", "ERIC4DOC", parms)
+
             if not startDir:
                 startDir = project.ppath
-            
+
             # add parameter for the eol setting
             if not project.useSystemEol():
-                args.append(
-                    "--eol={0}".format(eolTranslation[project.getEolString()]))
-            
+                args.append("--eol={0}".format(eolTranslation[project.getEolString()]))
+
             # now do the call
-            from DocumentationPlugins.Ericdoc.EricdocExecDialog import (
-                EricdocExecDialog
-            )
+            from DocumentationPlugins.Ericdoc.EricdocExecDialog import EricdocExecDialog
+
             dia = EricdocExecDialog("Ericdoc")
             res = dia.start(args, startDir)
             if res:
                 dia.exec()
-            
-            outdir = Utilities.toNativeSeparators(parms['outputDirectory'])
-            if outdir == '':
-                outdir = 'doc'      # that is eric7_docs default output dir
-                
+
+            outdir = Utilities.toNativeSeparators(parms["outputDirectory"])
+            if outdir == "":
+                outdir = "doc"  # that is eric7_docs default output dir
+
             # add it to the project data, if it isn't in already
             outdir = project.getRelativePath(outdir)
-            if outdir not in project.pdata['OTHERS']:
-                project.pdata['OTHERS'].append(outdir)
+            if outdir not in project.pdata["OTHERS"]:
+                project.pdata["OTHERS"].append(outdir)
                 project.setDirty(True)
                 project.othersAdded(outdir)
-            
-            if parms['qtHelpEnabled']:
-                outdir = Utilities.toNativeSeparators(
-                    parms['qtHelpOutputDirectory'])
-                if outdir == '':
-                    outdir = 'help'
+
+            if parms["qtHelpEnabled"]:
+                outdir = Utilities.toNativeSeparators(parms["qtHelpOutputDirectory"])
+                if outdir == "":
+                    outdir = "help"
                     # that is eric7_docs default QtHelp output dir
-                    
+
                 # add it to the project data, if it isn't in already
                 outdir = project.getRelativePath(outdir)
-                if outdir not in project.pdata['OTHERS']:
-                    project.pdata['OTHERS'].append(outdir)
+                if outdir not in project.pdata["OTHERS"]:
+                    project.pdata["OTHERS"].append(outdir)
                     project.setDirty(True)
                     project.othersAdded(outdir)
--- a/src/eric7/Plugins/PluginSyntaxChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginSyntaxChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -45,71 +45,92 @@
     """
     Class implementing the Syntax Checker plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
         from Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService import (
-            SyntaxCheckService
+            SyntaxCheckService,
         )
+
         self.syntaxCheckService = SyntaxCheckService()
         ericApp().registerObject("SyntaxCheckService", self.syntaxCheckService)
 
-        ericPath = getConfig('ericDir')
-        path = os.path.join(ericPath, 'Plugins', 'CheckerPlugins',
-                            'SyntaxChecker')
-        
+        ericPath = getConfig("ericDir")
+        path = os.path.join(ericPath, "Plugins", "CheckerPlugins", "SyntaxChecker")
+
         self.syntaxCheckService.addLanguage(
-            'Python3', 'Python3', path, 'SyntaxCheck',
+            "Python3",
+            "Python3",
+            path,
+            "SyntaxCheck",
             self.__getPythonOptions,
             lambda: Preferences.getPython("Python3Extensions"),
             self.__translateSyntaxCheck,
-            self.syntaxCheckService.serviceErrorPy3)
-        
+            self.syntaxCheckService.serviceErrorPy3,
+        )
+
         self.syntaxCheckService.addLanguage(
-            'JavaScript', 'Python3', path,
-            'jsCheckSyntax',
+            "JavaScript",
+            "Python3",
+            path,
+            "jsCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.js'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorJavaScript)
-        
+            lambda: [".js"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorJavaScript,
+        )
+
         # YAML syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'YAML', 'Python3', path,
-            'yamlCheckSyntax',
+            "YAML",
+            "Python3",
+            path,
+            "yamlCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.yml', '.yaml'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorYAML)
-        
+            lambda: [".yml", ".yaml"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorYAML,
+        )
+
         # JSON syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'JSON', 'Python3', path,
-            'jsonCheckSyntax',
+            "JSON",
+            "Python3",
+            path,
+            "jsonCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.json'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorJSON)
-        
+            lambda: [".json"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorJSON,
+        )
+
         # TOML syntax check via Python3
         self.syntaxCheckService.addLanguage(
-            'TOML', 'Python3', path,
-            'tomlCheckSyntax',
+            "TOML",
+            "Python3",
+            path,
+            "tomlCheckSyntax",
             lambda: [],  # No options
-            lambda: ['.toml'],
-            lambda fn, problems:
-                self.syntaxCheckService.syntaxChecked.emit(fn, problems),
-            self.syntaxCheckService.serviceErrorTOML)
+            lambda: [".toml"],
+            lambda fn, problems: self.syntaxCheckService.syntaxChecked.emit(
+                fn, problems
+            ),
+            self.syntaxCheckService.serviceErrorTOML,
+        )
 
     def __initialize(self):
         """
@@ -117,11 +138,11 @@
         """
         self.__projectAct = None
         self.__projectSyntaxCheckerDialog = None
-        
+
         self.__projectBrowserAct = None
         self.__projectBrowserMenu = None
         self.__projectBrowserSyntaxCheckerDialog = None
-        
+
         self.__editors = []
         self.__editorAct = None
         self.__editorSyntaxCheckerDialog = None
@@ -129,22 +150,21 @@
     def __getPythonOptions(self):
         """
         Private method to determine the syntax check options.
-        
+
         @return state of checkFlakes and ignoreStarImportWarnings (bool, bool)
         """
         checkFlakes = Preferences.getFlakes("IncludeInSyntaxCheck")
-        ignoreStarImportWarnings = Preferences.getFlakes(
-            "IgnoreStarImportWarnings")
+        ignoreStarImportWarnings = Preferences.getFlakes("IgnoreStarImportWarnings")
         return checkFlakes, ignoreStarImportWarnings
 
     def __translateSyntaxCheck(self, fn, problems):
         """
         Private slot to translate the resulting messages.
-        
+
         If checkFlakes is True, warnings contains a list of strings containing
         the warnings (marker, file name, line number, message)
         The values are only valid, if nok is False.
-        
+
         @param fn filename of the checked file (str)
         @param problems dictionary with the keys 'error' and 'warnings' which
             hold a list containing details about the error/ warnings
@@ -152,132 +172,142 @@
             errors), the message, a list with arguments for the message)
         """
         from CheckerPlugins.SyntaxChecker.pyflakes.translations import (
-            getTranslatedFlakesMessage
+            getTranslatedFlakesMessage,
         )
-        warnings = problems.get('warnings', [])
+
+        warnings = problems.get("warnings", [])
         for warning in warnings:
             # Translate messages
             msg_args = warning.pop()
             warning[4] = getTranslatedFlakesMessage(warning[4], msg_args)
-        
-        problems['warnings'] = warnings
+
+        problems["warnings"] = warnings
         self.syntaxCheckService.syntaxChecked.emit(fn, problems)
 
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             self.__projectAct = EricAction(
-                self.tr('Check Syntax'),
-                self.tr('&Syntax...'), 0, 0,
-                self, 'project_check_syntax')
-            self.__projectAct.setStatusTip(
-                self.tr('Check syntax.'))
-            self.__projectAct.setWhatsThis(self.tr(
-                """<b>Check Syntax...</b>"""
-                """<p>This checks Python files for syntax errors.</p>"""
-            ))
+                self.tr("Check Syntax"),
+                self.tr("&Syntax..."),
+                0,
+                0,
+                self,
+                "project_check_syntax",
+            )
+            self.__projectAct.setStatusTip(self.tr("Check syntax."))
+            self.__projectAct.setWhatsThis(
+                self.tr(
+                    """<b>Check Syntax...</b>"""
+                    """<p>This checks Python files for syntax errors.</p>"""
+                )
+            )
             self.__projectAct.triggered.connect(self.__projectSyntaxCheck)
             ericApp().getObject("Project").addEricActions([self.__projectAct])
             menu.addAction(self.__projectAct)
-        
+
         self.__editorAct = EricAction(
-            self.tr('Check Syntax'),
-            self.tr('&Syntax...'), 0, 0,
-            self, "")
-        self.__editorAct.setWhatsThis(self.tr(
-            """<b>Check Syntax...</b>"""
-            """<p>This checks Python files for syntax errors.</p>"""
-        ))
+            self.tr("Check Syntax"), self.tr("&Syntax..."), 0, 0, self, ""
+        )
+        self.__editorAct.setWhatsThis(
+            self.tr(
+                """<b>Check Syntax...</b>"""
+                """<p>This checks Python files for syntax errors.</p>"""
+            )
+        )
         self.__editorAct.triggered.connect(self.__editorSyntaxCheck)
-        
+
         ericApp().getObject("Project").showMenu.connect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.connect(self.__projectBrowserShowMenu)
-        ericApp().getObject("ViewManager").editorOpenedEd.connect(
-            self.__editorOpened)
-        ericApp().getObject("ViewManager").editorClosedEd.connect(
-            self.__editorClosed)
-        
+            "sources"
+        ).showMenu.connect(self.__projectBrowserShowMenu)
+        ericApp().getObject("ViewManager").editorOpenedEd.connect(self.__editorOpened)
+        ericApp().getObject("ViewManager").editorClosedEd.connect(self.__editorClosed)
+
         for editor in ericApp().getObject("ViewManager").getOpenEditors():
             self.__editorOpened(editor)
-        
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        ericApp().getObject("Project").showMenu.disconnect(
-            self.__projectShowMenu)
+        ericApp().getObject("Project").showMenu.disconnect(self.__projectShowMenu)
         ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources").showMenu.disconnect(self.__projectBrowserShowMenu)
+            "sources"
+        ).showMenu.disconnect(self.__projectBrowserShowMenu)
         ericApp().getObject("ViewManager").editorOpenedEd.disconnect(
-            self.__editorOpened)
+            self.__editorOpened
+        )
         ericApp().getObject("ViewManager").editorClosedEd.disconnect(
-            self.__editorClosed)
-        
+            self.__editorClosed
+        )
+
         menu = ericApp().getObject("Project").getMenu("Checks")
         if menu:
             menu.removeAction(self.__projectAct)
-        
+
         if self.__projectBrowserMenu and self.__projectBrowserAct:
-            self.__projectBrowserMenu.removeAction(
-                self.__projectBrowserAct)
-        
+            self.__projectBrowserMenu.removeAction(self.__projectBrowserAct)
+
         for editor in self.__editors:
             editor.showMenu.disconnect(self.__editorShowMenu)
             menu = editor.getMenu("Checks")
             if menu is not None:
                 menu.removeAction(self.__editorAct)
-        
+
         self.__initialize()
-    
+
     def __projectShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
-                ericApp().getObject("Project").getProjectLanguage() in
-                self.syntaxCheckService.getLanguages())
-    
+                ericApp().getObject("Project").getProjectLanguage()
+                in self.syntaxCheckService.getLanguages()
+            )
+
     def __projectBrowserShowMenu(self, menuName, menu):
         """
         Private slot called, when the the project browser menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         """
         if (
-            menuName == "Checks" and
-            ericApp().getObject("Project").getProjectLanguage() in
-            self.syntaxCheckService.getLanguages()
+            menuName == "Checks"
+            and ericApp().getObject("Project").getProjectLanguage()
+            in self.syntaxCheckService.getLanguages()
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
                 self.__projectBrowserAct = EricAction(
-                    self.tr('Check Syntax'),
-                    self.tr('&Syntax...'), 0, 0,
-                    self, "")
-                self.__projectBrowserAct.setWhatsThis(self.tr(
-                    """<b>Check Syntax...</b>"""
-                    """<p>This checks Python files for syntax errors.</p>"""
-                ))
+                    self.tr("Check Syntax"), self.tr("&Syntax..."), 0, 0, self, ""
+                )
+                self.__projectBrowserAct.setWhatsThis(
+                    self.tr(
+                        """<b>Check Syntax...</b>"""
+                        """<p>This checks Python files for syntax errors.</p>"""
+                    )
+                )
                 self.__projectBrowserAct.triggered.connect(
-                    self.__projectBrowserSyntaxCheck)
+                    self.__projectBrowserSyntaxCheck
+                )
             if self.__projectBrowserAct not in menu.actions():
                 menu.addAction(self.__projectBrowserAct)
-    
+
     def __projectSyntaxCheck(self):
         """
         Private slot used to check the project files for syntax errors.
@@ -286,24 +316,24 @@
         project.saveAllScripts()
         ppath = project.getProjectPath()
         extensions = tuple(self.syntaxCheckService.getExtensions())
-        files = [os.path.join(ppath, file)
-                 for file in project.pdata["SOURCES"]
-                 if file.endswith(extensions)]
-        
-        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-            SyntaxCheckerDialog
-        )
+        files = [
+            os.path.join(ppath, file)
+            for file in project.pdata["SOURCES"]
+            if file.endswith(extensions)
+        ]
+
+        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import SyntaxCheckerDialog
+
         self.__projectSyntaxCheckerDialog = SyntaxCheckerDialog()
         self.__projectSyntaxCheckerDialog.show()
         self.__projectSyntaxCheckerDialog.prepare(files, project)
-    
+
     def __projectBrowserSyntaxCheck(self):
         """
         Private method to handle the syntax check context menu action of the
         project sources browser.
         """
-        browser = ericApp().getObject("ProjectBrowser").getProjectBrowser(
-            "sources")
+        browser = ericApp().getObject("ProjectBrowser").getProjectBrowser("sources")
         if browser.getSelectedItemsCount([ProjectBrowserFileItem]) > 1:
             fn = []
             for itm in browser.getSelectedItems([ProjectBrowserFileItem]):
@@ -314,18 +344,17 @@
                 fn = itm.fileName()
             except AttributeError:
                 fn = itm.dirName()
-        
-        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-            SyntaxCheckerDialog
-        )
+
+        from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import SyntaxCheckerDialog
+
         self.__projectBrowserSyntaxCheckerDialog = SyntaxCheckerDialog()
         self.__projectBrowserSyntaxCheckerDialog.show()
         self.__projectBrowserSyntaxCheckerDialog.start(fn)
-    
+
     def __editorOpened(self, editor):
         """
         Private slot called, when a new editor was opened.
-        
+
         @param editor reference to the new editor (QScintilla.Editor)
         """
         menu = editor.getMenu("Checks")
@@ -333,21 +362,21 @@
             menu.addAction(self.__editorAct)
             editor.showMenu.connect(self.__editorShowMenu)
             self.__editors.append(editor)
-    
+
     def __editorClosed(self, editor):
         """
         Private slot called, when an editor was closed.
-        
+
         @param editor reference to the editor (QScintilla.Editor)
         """
         with contextlib.suppress(ValueError):
             self.__editors.remove(editor)
-    
+
     def __editorShowMenu(self, menuName, menu, editor):
         """
         Private slot called, when the the editor context menu or a submenu is
         about to be shown.
-        
+
         @param menuName name of the menu to be shown (string)
         @param menu reference to the menu (QMenu)
         @param editor reference to the editor
@@ -356,8 +385,9 @@
             if self.__editorAct not in menu.actions():
                 menu.addAction(self.__editorAct)
             self.__editorAct.setEnabled(
-                editor.getLanguage() in self.syntaxCheckService.getLanguages())
-    
+                editor.getLanguage() in self.syntaxCheckService.getLanguages()
+            )
+
     def __editorSyntaxCheck(self):
         """
         Private slot to handle the syntax check context menu action of the
@@ -366,8 +396,9 @@
         editor = ericApp().getObject("ViewManager").activeWindow()
         if editor is not None:
             from CheckerPlugins.SyntaxChecker.SyntaxCheckerDialog import (
-                SyntaxCheckerDialog
+                SyntaxCheckerDialog,
             )
+
             self.__editorSyntaxCheckerDialog = SyntaxCheckerDialog()
             self.__editorSyntaxCheckerDialog.show()
             if editor.isJavascriptFile():
@@ -375,4 +406,5 @@
             else:
                 unnamed = "Unnamed.py"
             self.__editorSyntaxCheckerDialog.start(
-                editor.getFileName() or unnamed, editor.text())
+                editor.getFileName() or unnamed, editor.text()
+            )
--- a/src/eric7/Plugins/PluginTranslator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginTranslator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -39,39 +39,43 @@
 error = ""
 
 translatorPluginObject = None
-    
+
 
 def createTranslatorPage(configDlg):
     """
     Module function to create the Translator configuration page.
-    
+
     @param configDlg reference to the configuration dialog
     @type ConfigurationWidget
     @return reference to the configuration page
     @rtype TranslatorPage
     """
     from UiExtensionPlugins.Translator.ConfigurationPage import TranslatorPage
+
     page = TranslatorPage.TranslatorPage(translatorPluginObject)
     return page
-    
+
 
 def getConfigData():
     """
     Module function returning data as required by the configuration dialog.
-    
+
     @return dictionary containing the relevant data
     @rtype dict
     """
     icon = (
         os.path.join("UiExtensionPlugins", "Translator", "icons", "flag-dark")
-        if ericApp().usesDarkPalette() else
-        os.path.join("UiExtensionPlugins", "Translator", "icons", "flag-light")
+        if ericApp().usesDarkPalette()
+        else os.path.join("UiExtensionPlugins", "Translator", "icons", "flag-light")
     )
     return {
         "translatorPage": [
-            QCoreApplication.translate("TranslatorPlugin",
-                                       "Translator"),
-            icon, createTranslatorPage, None, None],
+            QCoreApplication.translate("TranslatorPlugin", "Translator"),
+            icon,
+            createTranslatorPage,
+            None,
+            None,
+        ],
     }
 
 
@@ -85,30 +89,41 @@
 class TranslatorPlugin(QObject):
     """
     Class implementing the Translator plug-in.
-    
+
     @signal updateLanguages() emitted to indicate a languages update
     """
+
     PreferencesKey = "Translator"
-    
+
     updateLanguages = pyqtSignal()
-    
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object
         @type UI.UserInterface
         """
         super().__init__(ui)
         self.__ui = ui
         self.__initialize()
-        
+
         self.__defaults = {
             "OriginalLanguage": "en",
             "TranslationLanguage": "de",
             "SelectedEngine": "deepl",
-            "EnabledLanguages": ["en", "de", "fr", "cs", "es", "pt",
-                                 "ru", "tr", "zh-CN", "zh-TW"],
+            "EnabledLanguages": [
+                "en",
+                "de",
+                "fr",
+                "cs",
+                "es",
+                "pt",
+                "ru",
+                "tr",
+                "zh-CN",
+                "zh-TW",
+            ],
             # service specific settings below
             # DeepL
             "DeeplKey": "",
@@ -128,57 +143,56 @@
             # Yandex
             "YandexKey": "",
         }
-    
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plugin.
         """
         self.__object = None
-    
+
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status
         @rtype tuple of (None, bool)
         """
         global error
-        error = ""     # clear previous error
-        
+        error = ""  # clear previous error
+
         global translatorPluginObject
         translatorPluginObject = self
-        
-        self.__object = Translator(
-            self, ericApp().usesDarkPalette(), self.__ui)
+
+        self.__object = Translator(self, ericApp().usesDarkPalette(), self.__ui)
         self.__object.activate()
         ericApp().registerPluginObject("Translator", self.__object)
-        
+
         return None, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
         ericApp().unregisterPluginObject("Translator")
         self.__object.deactivate()
-        
+
         self.__initialize()
-    
+
     def getPreferencesDefault(self, key):
         """
         Public method to retrieve the various default settings.
-        
+
         @param key the key of the value to get
         @type str
         @return the requested setting
         @rtype any
         """
         return self.__defaults[key]
-    
+
     def getPreferences(self, key):
         """
         Public method to retrieve the various settings.
-        
+
         @param key the key of the value to get
         @type str
         @return the requested setting
@@ -187,26 +201,30 @@
         if key in ["EnabledLanguages"]:
             return Preferences.toList(
                 Preferences.getSettings().value(
-                    self.PreferencesKey + "/" + key, self.__defaults[key]))
+                    self.PreferencesKey + "/" + key, self.__defaults[key]
+                )
+            )
         elif key in ["GoogleEnableDictionary"]:
             return Preferences.toBool(
                 Preferences.getSettings().value(
-                    self.PreferencesKey + "/" + key, self.__defaults[key]))
+                    self.PreferencesKey + "/" + key, self.__defaults[key]
+                )
+            )
         else:
             return Preferences.getSettings().value(
-                self.PreferencesKey + "/" + key, self.__defaults[key])
-    
+                self.PreferencesKey + "/" + key, self.__defaults[key]
+            )
+
     def setPreferences(self, key, value):
         """
         Public method to store the various settings.
-        
+
         @param key the key of the setting to be set
         @type str
         @param value the value to be set
         @type any
         """
-        Preferences.getSettings().setValue(
-            self.PreferencesKey + "/" + key, value)
-        
+        Preferences.getSettings().setValue(self.PreferencesKey + "/" + key, value)
+
         if key in ["EnabledLanguages"]:
             self.updateLanguages.emit()
--- a/src/eric7/Plugins/PluginVcsGit.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVcsGit.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,9 +33,7 @@
 className = "VcsGitPlugin"
 packageName = "__core__"
 shortDescription = "Implements the Git version control interface."
-longDescription = (
-    """This plugin provides the Git version control interface."""
-)
+longDescription = """This plugin provides the Git version control interface."""
 pyqtApi = 2
 # End-Of-Header
 
@@ -45,41 +43,40 @@
 def exeDisplayData():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to query the presence of
         the executable
     """
-    exe = 'git'
+    exe = "git"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
-    
+        exe += ".exe"
+
     data = {
         "programEntry": True,
-        "header": QCoreApplication.translate(
-            "VcsGitPlugin", "Version Control - Git"),
+        "header": QCoreApplication.translate("VcsGitPlugin", "Version Control - Git"),
         "exe": exe,
-        "versionCommand": 'version',
-        "versionStartsWith": 'git',
+        "versionCommand": "version",
+        "versionStartsWith": "git",
         "versionPosition": 2,
         "version": "",
         "versionCleanup": None,
     }
-    
+
     return data
 
 
 def getVcsSystemIndicator():
     """
     Public function to get the indicators for this version control system.
-    
+
     @return dictionary with indicator as key and a tuple with the vcs name
         (string) and vcs display string (string)
     """
     global pluginTypename
     data = {}
-    exe = 'git'
+    exe = "git"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
+        exe += ".exe"
     if Utilities.isinpath(exe):
         data[".git"] = (pluginTypename, displayString())
         data["_git"] = (pluginTypename, displayString())
@@ -89,14 +86,14 @@
 def displayString():
     """
     Public function to get the display string.
-    
+
     @return display string (string)
     """
-    exe = 'git'
+    exe = "git"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
+        exe += ".exe"
     if Utilities.isinpath(exe):
-        return QCoreApplication.translate('VcsGitPlugin', 'Git')
+        return QCoreApplication.translate("VcsGitPlugin", "Git")
     else:
         return ""
 
@@ -107,33 +104,34 @@
 def createConfigurationPage(configDlg):
     """
     Module function to create the configuration page.
-    
+
     @param configDlg reference to the configuration dialog (QDialog)
     @return reference to the configuration page
     """
     global gitCfgPluginObject
-    from VcsPlugins.vcsGit.ConfigurationPage.GitPage import (
-        GitPage
-    )
+    from VcsPlugins.vcsGit.ConfigurationPage.GitPage import GitPage
+
     if gitCfgPluginObject is None:
         gitCfgPluginObject = VcsGitPlugin(None)
     page = GitPage(gitCfgPluginObject)
     return page
-    
+
 
 def getConfigData():
     """
     Module function returning data as required by the configuration dialog.
-    
+
     @return dictionary with key "zzz_gitPage" containing the relevant
         data
     """
     return {
-        "zzz_gitPage":
-        [QCoreApplication.translate("VcsGitPlugin", "Git"),
-            os.path.join("VcsPlugins", "vcsGit", "icons",
-                         "preferences-git.svg"),
-            createConfigurationPage, "vcsPage", None],
+        "zzz_gitPage": [
+            QCoreApplication.translate("VcsGitPlugin", "Git"),
+            os.path.join("VcsPlugins", "vcsGit", "icons", "preferences-git.svg"),
+            createConfigurationPage,
+            "vcsPage",
+            None,
+        ],
     }
 
 
@@ -141,8 +139,7 @@
     """
     Module function to prepare for an uninstallation.
     """
-    if not ericApp().getObject("PluginManager").isPluginLoaded(
-            "PluginVcsGit"):
+    if not ericApp().getObject("PluginManager").isPluginLoaded("PluginVcsGit"):
         Preferences.getSettings().remove("Git")
 
 
@@ -152,25 +149,25 @@
     """
     for key in ["RepositoryUrlHistory"]:
         VcsGitPlugin.setPreferences(key, [])
-    
+
 
 class VcsGitPlugin(QObject):
     """
     Class implementing the Git version control plugin.
     """
+
     GitDefaults = {
-        "StopLogOnCopy": True,          # used in log browser
-        "ShowAuthorColumns": True,      # used in log browser
-        "ShowCommitterColumns": True,   # used in log browser
-        "ShowCommitIdColumn": True,     # used in log browser
-        "ShowBranchesColumn": True,     # used in log browser
-        "ShowTagsColumn": True,         # used in log browser
-        "FindCopiesHarder": False,      # used in log browser
+        "StopLogOnCopy": True,  # used in log browser
+        "ShowAuthorColumns": True,  # used in log browser
+        "ShowCommitterColumns": True,  # used in log browser
+        "ShowCommitIdColumn": True,  # used in log browser
+        "ShowBranchesColumn": True,  # used in log browser
+        "ShowTagsColumn": True,  # used in log browser
+        "FindCopiesHarder": False,  # used in log browser
         "LogLimit": 20,
         "LogSubjectColumnWidth": 30,
         "LogBrowserGeometry": QByteArray(),
-        "LogBrowserSplitterStates": [QByteArray(), QByteArray(),
-                                     QByteArray()],
+        "LogBrowserSplitterStates": [QByteArray(), QByteArray(), QByteArray()],
         # mainSplitter, detailsSplitter, diffSplitter
         "StatusDialogGeometry": QByteArray(),
         "StatusDialogSplitterStates": [QByteArray(), QByteArray()],
@@ -181,28 +178,30 @@
         "AggressiveGC": True,
         "RepositoryUrlHistory": [],
     }
-    
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         from VcsPlugins.vcsGit.ProjectHelper import GitProjectHelper
+
         self.__projectHelperObject = GitProjectHelper(None, None)
         with contextlib.suppress(KeyError):
             ericApp().registerPluginObject(
-                pluginTypename, self.__projectHelperObject, pluginType)
-        
+                pluginTypename, self.__projectHelperObject, pluginType
+            )
+
         readShortcuts(pluginName=pluginTypename)
-    
+
     def getProjectHelper(self):
         """
         Public method to get a reference to the project helper object.
-        
+
         @return reference to the project helper object
         """
         return self.__projectHelperObject
@@ -210,68 +209,77 @@
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.initToolbar(ui, toolbarManager)
-    
+
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from VcsPlugins.vcsGit.git import Git
+
         self.__object = Git(self, self.__ui)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("git")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-        
+
         return self.__object, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
         self.__object = None
-        
+
         tb = self.__ui.getToolbar("git")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-    
+
     @classmethod
     def getPreferences(cls, key):
         """
         Class method to retrieve the various settings.
-        
+
         @param key the key of the value to get
         @return the requested setting
         """
-        if key in ["StopLogOnCopy", "ShowReflogInfo", "ShowAuthorColumns",
-                   "ShowCommitterColumns", "ShowCommitIdColumn",
-                   "ShowBranchesColumn", "ShowTagsColumn", "FindCopiesHarder",
-                   "AggressiveGC"]:
-            return Preferences.toBool(Preferences.getSettings().value(
-                "Git/" + key, cls.GitDefaults[key]))
+        if key in [
+            "StopLogOnCopy",
+            "ShowReflogInfo",
+            "ShowAuthorColumns",
+            "ShowCommitterColumns",
+            "ShowCommitIdColumn",
+            "ShowBranchesColumn",
+            "ShowTagsColumn",
+            "FindCopiesHarder",
+            "AggressiveGC",
+        ]:
+            return Preferences.toBool(
+                Preferences.getSettings().value("Git/" + key, cls.GitDefaults[key])
+            )
         elif key in ["LogLimit", "CommitIdLength", "LogSubjectColumnWidth"]:
-            return int(Preferences.getSettings().value(
-                "Git/" + key, cls.GitDefaults[key]))
+            return int(
+                Preferences.getSettings().value("Git/" + key, cls.GitDefaults[key])
+            )
         elif key in ["Commits", "RepositoryUrlHistory"]:
-            return Preferences.toList(Preferences.getSettings().value(
-                "Git/" + key))
+            return Preferences.toList(Preferences.getSettings().value("Git/" + key))
         elif key in ["LogBrowserGeometry", "StatusDialogGeometry"]:
             v = Preferences.getSettings().value("Git/" + key)
             if v is not None:
@@ -285,14 +293,13 @@
             else:
                 return cls.GitDefaults[key]
         else:
-            return Preferences.getSettings().value(
-                "Git/" + key, cls.GitDefaults[key])
-    
+            return Preferences.getSettings().value("Git/" + key, cls.GitDefaults[key])
+
     @classmethod
     def setPreferences(cls, key, value):
         """
         Class method to store the various settings.
-        
+
         @param key the key of the setting to be set
         @param value the value to be set
         """
@@ -301,25 +308,27 @@
     def getConfigPath(self):
         """
         Public method to get the filename of the config file.
-        
+
         @return filename of the config file (string)
         """
         return getConfigPath()
-    
+
     def prepareUninstall(self):
         """
         Public method to prepare for an uninstallation.
         """
         ericApp().unregisterPluginObject(pluginTypename)
-    
+
     def prepareUnload(self):
         """
         Public method to prepare for an unload.
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.removeToolbar(
-                self.__ui, ericApp().getObject("ToolbarManager"))
+                self.__ui, ericApp().getObject("ToolbarManager")
+            )
         ericApp().unregisterPluginObject(pluginTypename)
 
+
 #
 # eflag: noqa = M801
--- a/src/eric7/Plugins/PluginVcsMercurial.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVcsMercurial.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,9 +33,7 @@
 className = "VcsMercurialPlugin"
 packageName = "__core__"
 shortDescription = "Implements the Mercurial version control interface."
-longDescription = (
-    """This plugin provides the Mercurial version control interface."""
-)
+longDescription = """This plugin provides the Mercurial version control interface."""
 pyqtApi = 2
 # End-Of-Header
 
@@ -45,29 +43,30 @@
 def exeDisplayData():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to query the presence of
         the executable
     """
     data = {
         "programEntry": True,
         "header": QCoreApplication.translate(
-            "VcsMercurialPlugin", "Version Control - Mercurial"),
+            "VcsMercurialPlugin", "Version Control - Mercurial"
+        ),
         "exe": getHgExecutable(),
-        "versionCommand": 'version',
-        "versionStartsWith": 'Mercurial',
+        "versionCommand": "version",
+        "versionStartsWith": "Mercurial",
         "versionPosition": -1,
         "version": "",
         "versionCleanup": (0, -1),
     }
-    
+
     return data
 
 
 def getVcsSystemIndicator():
     """
     Public function to get the indicators for this version control system.
-    
+
     @return dictionary with indicator as key and a tuple with the vcs name
         (string) and vcs display string (string)
     """
@@ -83,48 +82,52 @@
 def displayString():
     """
     Public function to get the display string.
-    
+
     @return display string (string)
     """
     exe = getHgExecutable()
     if Utilities.isinpath(exe):
-        return QCoreApplication.translate('VcsMercurialPlugin', 'Mercurial')
+        return QCoreApplication.translate("VcsMercurialPlugin", "Mercurial")
     else:
         return ""
 
+
 mercurialCfgPluginObject = None
 
 
 def createConfigurationPage(configDlg):
     """
     Module function to create the configuration page.
-    
+
     @param configDlg reference to the configuration dialog (QDialog)
     @return reference to the configuration page
     """
     global mercurialCfgPluginObject
-    from VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage import (
-        MercurialPage
-    )
+    from VcsPlugins.vcsMercurial.ConfigurationPage.MercurialPage import MercurialPage
+
     if mercurialCfgPluginObject is None:
         mercurialCfgPluginObject = VcsMercurialPlugin(None)
     page = MercurialPage(mercurialCfgPluginObject)
     return page
-    
+
 
 def getConfigData():
     """
     Module function returning data as required by the configuration dialog.
-    
+
     @return dictionary with key "zzz_mercurialPage" containing the relevant
         data
     """
     return {
-        "zzz_mercurialPage":
-        [QCoreApplication.translate("VcsMercurialPlugin", "Mercurial"),
-            os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                         "preferences-mercurial.svg"),
-            createConfigurationPage, "vcsPage", None],
+        "zzz_mercurialPage": [
+            QCoreApplication.translate("VcsMercurialPlugin", "Mercurial"),
+            os.path.join(
+                "VcsPlugins", "vcsMercurial", "icons", "preferences-mercurial.svg"
+            ),
+            createConfigurationPage,
+            "vcsPage",
+            None,
+        ],
     }
 
 
@@ -132,8 +135,7 @@
     """
     Module function to prepare for an uninstallation.
     """
-    if not ericApp().getObject("PluginManager").isPluginLoaded(
-            "PluginVcsMercurial"):
+    if not ericApp().getObject("PluginManager").isPluginLoaded("PluginVcsMercurial"):
         Preferences.getSettings().remove("Mercurial")
 
 
@@ -143,12 +145,13 @@
     """
     for key in ["RepositoryUrlHistory"]:
         VcsMercurialPlugin.setPreferences(key, [])
-    
+
 
 class VcsMercurialPlugin(QObject):
     """
     Class implementing the Mercurial version control plugin.
     """
+
     MercurialDefaults = {
         "StopLogOnCopy": True,  # used in log browser
         "LogLimit": 20,
@@ -168,8 +171,7 @@
         "LogMessageColumnWidth": 30,
         "LogBrowserShowFullLog": True,
         "LogBrowserGeometry": QByteArray(),
-        "LogBrowserSplitterStates": [QByteArray(), QByteArray(),
-                                     QByteArray()],
+        "LogBrowserSplitterStates": [QByteArray(), QByteArray(), QByteArray()],
         # mainSplitter, detailsSplitter, diffSplitter
         "StatusDialogGeometry": QByteArray(),
         "StatusDialogSplitterState": QByteArray(),
@@ -178,27 +180,29 @@
         "RepositoryUrlHistory": [],
         "MercurialExecutablePath": "",
     }
-    
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         from VcsPlugins.vcsMercurial.ProjectHelper import HgProjectHelper
+
         self.__projectHelperObject = HgProjectHelper(None, None)
         with contextlib.suppress(KeyError):
             ericApp().registerPluginObject(
-                pluginTypename, self.__projectHelperObject, pluginType)
+                pluginTypename, self.__projectHelperObject, pluginType
+            )
         readShortcuts(pluginName=pluginTypename)
-    
+
     def getProjectHelper(self):
         """
         Public method to get a reference to the project helper object.
-        
+
         @return reference to the project helper object
         """
         return self.__projectHelperObject
@@ -206,71 +210,95 @@
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.initToolbar(ui, toolbarManager)
-    
+
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from VcsPlugins.vcsMercurial.hg import Hg
+
         self.__object = Hg(self, self.__ui)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("mercurial")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-        
+
         return self.__object, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
         self.__object = None
-        
+
         tb = self.__ui.getToolbar("mercurial")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-    
+
     @classmethod
     def getPreferences(cls, key):
         """
         Class method to retrieve the various settings.
-        
+
         @param key the key of the value to get
         @return the requested setting
         """
-        if key in ["StopLogOnCopy", "PullUpdate", "PreferUnbundle",
-                   "CreateBackup", "InternalMerge", "ConsiderHidden",
-                   "LogBrowserShowFullLog"]:
-            return Preferences.toBool(Preferences.getSettings().value(
-                "Mercurial/" + key, cls.MercurialDefaults[key]))
-        elif key in ["LogLimit", "CommitAuthorsLimit", "ServerPort",
-                     "LogMessageColumnWidth"]:
-            return int(Preferences.getSettings().value(
-                "Mercurial/" + key, cls.MercurialDefaults[key]))
+        if key in [
+            "StopLogOnCopy",
+            "PullUpdate",
+            "PreferUnbundle",
+            "CreateBackup",
+            "InternalMerge",
+            "ConsiderHidden",
+            "LogBrowserShowFullLog",
+        ]:
+            return Preferences.toBool(
+                Preferences.getSettings().value(
+                    "Mercurial/" + key, cls.MercurialDefaults[key]
+                )
+            )
+        elif key in [
+            "LogLimit",
+            "CommitAuthorsLimit",
+            "ServerPort",
+            "LogMessageColumnWidth",
+        ]:
+            return int(
+                Preferences.getSettings().value(
+                    "Mercurial/" + key, cls.MercurialDefaults[key]
+                )
+            )
         elif key in ["Commits", "CommitAuthors", "RepositoryUrlHistory"]:
-            return Preferences.toList(Preferences.getSettings().value(
-                "Mercurial/" + key, cls.MercurialDefaults[key]))
-        elif key in ["LogBrowserGeometry", "StatusDialogGeometry",
-                     "StatusDialogSplitterState", "MqStatusDialogGeometry",
-                     "MqStatusDialogSplitterState"]:
+            return Preferences.toList(
+                Preferences.getSettings().value(
+                    "Mercurial/" + key, cls.MercurialDefaults[key]
+                )
+            )
+        elif key in [
+            "LogBrowserGeometry",
+            "StatusDialogGeometry",
+            "StatusDialogSplitterState",
+            "MqStatusDialogGeometry",
+            "MqStatusDialogSplitterState",
+        ]:
             # QByteArray values
             v = Preferences.getSettings().value("Mercurial/" + key)
             if v is not None:
@@ -286,13 +314,14 @@
                 return cls.MercurialDefaults[key]
         else:
             return Preferences.getSettings().value(
-                "Mercurial/" + key, cls.MercurialDefaults[key])
-    
+                "Mercurial/" + key, cls.MercurialDefaults[key]
+            )
+
     @classmethod
     def setPreferences(cls, key, value):
         """
         Class method to store the various settings.
-        
+
         @param key the key of the setting to be set
         @param value the value to be set
         """
@@ -301,45 +330,43 @@
     def getGlobalOptions(self):
         """
         Public method to build a list of global options.
-        
+
         @return list of global options (list of string)
         """
         args = []
-        if (
-            self.getPreferences("Encoding") !=
-            self.MercurialDefaults["Encoding"]
-        ):
+        if self.getPreferences("Encoding") != self.MercurialDefaults["Encoding"]:
             args.append("--encoding")
             args.append(self.getPreferences("Encoding"))
         if (
-            self.getPreferences("EncodingMode") !=
-            self.MercurialDefaults["EncodingMode"]
+            self.getPreferences("EncodingMode")
+            != self.MercurialDefaults["EncodingMode"]
         ):
             args.append("--encodingmode")
             args.append(self.getPreferences("EncodingMode"))
         if self.getPreferences("ConsiderHidden"):
             args.append("--hidden")
         return args
-    
+
     def getConfigPath(self):
         """
         Public method to get the filename of the config file.
-        
+
         @return filename of the config file (string)
         """
         return getConfigPath()
-    
+
     def prepareUninstall(self):
         """
         Public method to prepare for an uninstallation.
         """
         ericApp().unregisterPluginObject(pluginTypename)
-    
+
     def prepareUnload(self):
         """
         Public method to prepare for an unload.
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.removeToolbar(
-                self.__ui, ericApp().getObject("ToolbarManager"))
+                self.__ui, ericApp().getObject("ToolbarManager")
+            )
         ericApp().unregisterPluginObject(pluginTypename)
--- a/src/eric7/Plugins/PluginVcsPySvn.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVcsPySvn.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,9 +31,7 @@
 className = "VcsPySvnPlugin"
 packageName = "__core__"
 shortDescription = "Implements the PySvn version control interface."
-longDescription = (
-    """This plugin provides the PySvn version control interface."""
-)
+longDescription = """This plugin provides the PySvn version control interface."""
 pyqtApi = 2
 # End-Of-Header
 
@@ -43,11 +41,12 @@
 def exeDisplayData():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to be shown
     """
     try:
         import pysvn
+
         try:
             text = os.path.dirname(pysvn.__file__)
         except AttributeError:
@@ -56,22 +55,23 @@
     except ImportError:
         text = "PySvn"
         version = ""
-    
+
     data = {
         "programEntry": False,
         "header": QCoreApplication.translate(
-            "VcsPySvnPlugin", "Version Control - Subversion (pysvn)"),
+            "VcsPySvnPlugin", "Version Control - Subversion (pysvn)"
+        ),
         "text": text,
         "version": version,
     }
-    
+
     return data
 
 
 def getVcsSystemIndicator():
     """
     Public function to get the indicators for this version control system.
-    
+
     @return dictionary with indicator as key and a tuple with the vcs name
         (string) and vcs display string (string)
     """
@@ -85,49 +85,53 @@
 def displayString():
     """
     Public function to get the display string.
-    
+
     @return display string (string)
     """
     try:
-        import pysvn        # __IGNORE_WARNING__
-        return QCoreApplication.translate('VcsPySvnPlugin',
-                                          'Subversion (pysvn)')
+        import pysvn  # __IGNORE_WARNING__
+
+        return QCoreApplication.translate("VcsPySvnPlugin", "Subversion (pysvn)")
     except ImportError:
         return ""
 
+
 subversionCfgPluginObject = None
 
 
 def createConfigurationPage(configDlg):
     """
     Module function to create the configuration page.
-    
+
     @param configDlg reference to the configuration dialog (QDialog)
     @return reference to the configuration page
     """
     global subversionCfgPluginObject
-    from VcsPlugins.vcsPySvn.ConfigurationPage.SubversionPage import (
-        SubversionPage
-    )
+    from VcsPlugins.vcsPySvn.ConfigurationPage.SubversionPage import SubversionPage
+
     if subversionCfgPluginObject is None:
         subversionCfgPluginObject = VcsPySvnPlugin(None)
     page = SubversionPage(subversionCfgPluginObject)
     return page
-    
+
 
 def getConfigData():
     """
     Module function returning data as required by the configuration dialog.
-    
+
     @return dictionary with key "zzz_subversionPage" containing the relevant
     data
     """
     return {
-        "zzz_subversionPage":
-        [QCoreApplication.translate("VcsPySvnPlugin", "Subversion"),
-         os.path.join("VcsPlugins", "vcsPySvn", "icons",
-                      "preferences-subversion.svg"),
-         createConfigurationPage, "vcsPage", None],
+        "zzz_subversionPage": [
+            QCoreApplication.translate("VcsPySvnPlugin", "Subversion"),
+            os.path.join(
+                "VcsPlugins", "vcsPySvn", "icons", "preferences-subversion.svg"
+            ),
+            createConfigurationPage,
+            "vcsPage",
+            None,
+        ],
     }
 
 
@@ -135,40 +139,42 @@
     """
     Module function to prepare for an uninstallation.
     """
-    if not ericApp().getObject("PluginManager").isPluginLoaded(
-            "PluginVcsSubversion"):
+    if not ericApp().getObject("PluginManager").isPluginLoaded("PluginVcsSubversion"):
         Preferences.getSettings().remove("Subversion")
-    
+
 
 class VcsPySvnPlugin(QObject):
     """
     Class implementing the PySvn version control plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         self.__subversionDefaults = {
             "StopLogOnCopy": 1,
             "LogLimit": 20,
         }
-        
+
         from VcsPlugins.vcsPySvn.ProjectHelper import PySvnProjectHelper
+
         self.__projectHelperObject = PySvnProjectHelper(None, None)
         with contextlib.suppress(KeyError):
             ericApp().registerPluginObject(
-                pluginTypename, self.__projectHelperObject, pluginType)
+                pluginTypename, self.__projectHelperObject, pluginType
+            )
         readShortcuts(pluginName=pluginTypename)
-    
+
     def getProjectHelper(self):
         """
         Public method to get a reference to the project helper object.
-        
+
         @return reference to the project helper object
         """
         return self.__projectHelperObject
@@ -176,104 +182,112 @@
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.initToolbar(ui, toolbarManager)
-    
+
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from VcsPlugins.vcsPySvn.subversion import Subversion
+
         self.__object = Subversion(self, self.__ui)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("pysvn")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-        
+
         return self.__object, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
         self.__object = None
-        
+
         tb = self.__ui.getToolbar("pysvn")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-    
+
     def getPreferences(self, key):
         """
         Public method to retrieve the various settings.
-        
+
         @param key the key of the value to get
         @return the requested refactoring setting
         """
         if key in ["StopLogOnCopy"]:
-            return Preferences.toBool(Preferences.getSettings().value(
-                "Subversion/" + key, self.__subversionDefaults[key]))
+            return Preferences.toBool(
+                Preferences.getSettings().value(
+                    "Subversion/" + key, self.__subversionDefaults[key]
+                )
+            )
         elif key in ["LogLimit"]:
-            return int(Preferences.getSettings().value(
-                "Subversion/" + key,
-                self.__subversionDefaults[key]))
+            return int(
+                Preferences.getSettings().value(
+                    "Subversion/" + key, self.__subversionDefaults[key]
+                )
+            )
         elif key in ["Commits"]:
-            return Preferences.toList(Preferences.getSettings().value(
-                "Subversion/" + key))
+            return Preferences.toList(
+                Preferences.getSettings().value("Subversion/" + key)
+            )
         else:
             return Preferences.getSettings().value("Subversion/" + key)
-    
+
     def setPreferences(self, key, value):
         """
         Public method to store the various settings.
-        
+
         @param key the key of the setting to be set
         @param value the value to be set
         """
         Preferences.getSettings().setValue("Subversion/" + key, value)
-    
+
     def getServersPath(self):
         """
         Public method to get the filename of the servers file.
-        
+
         @return filename of the servers file (string)
         """
         return getServersPath()
-    
+
     def getConfigPath(self):
         """
         Public method to get the filename of the config file.
-        
+
         @return filename of the config file (string)
         """
         return getConfigPath()
-    
+
     def prepareUninstall(self):
         """
         Public method to prepare for an uninstallation.
         """
         ericApp().unregisterPluginObject(pluginTypename)
-    
+
     def prepareUnload(self):
         """
         Public method to prepare for an unload.
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.removeToolbar(
-                self.__ui, ericApp().getObject("ToolbarManager"))
+                self.__ui, ericApp().getObject("ToolbarManager")
+            )
         ericApp().unregisterPluginObject(pluginTypename)
--- a/src/eric7/Plugins/PluginVcsSubversion.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVcsSubversion.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,9 +33,7 @@
 className = "VcsSubversionPlugin"
 packageName = "__core__"
 shortDescription = "Implements the Subversion version control interface."
-longDescription = (
-    """This plugin provides the Subversion version control interface."""
-)
+longDescription = """This plugin provides the Subversion version control interface."""
 pyqtApi = 2
 # End-Of-Header
 
@@ -45,41 +43,42 @@
 def exeDisplayData():
     """
     Public method to support the display of some executable info.
-    
+
     @return dictionary containing the data to query the presence of
         the executable
     """
-    exe = 'svn'
+    exe = "svn"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
-    
+        exe += ".exe"
+
     data = {
         "programEntry": True,
         "header": QCoreApplication.translate(
-            "VcsSubversionPlugin", "Version Control - Subversion (svn)"),
+            "VcsSubversionPlugin", "Version Control - Subversion (svn)"
+        ),
         "exe": exe,
-        "versionCommand": '--version',
-        "versionStartsWith": 'svn',
+        "versionCommand": "--version",
+        "versionStartsWith": "svn",
         "versionPosition": 2,
         "version": "",
         "versionCleanup": None,
     }
-    
+
     return data
 
 
 def getVcsSystemIndicator():
     """
     Public function to get the indicators for this version control system.
-    
+
     @return dictionary with indicator as key and a tuple with the vcs name
         (string) and vcs display string (string)
     """
     global pluginTypename
     data = {}
-    exe = 'svn'
+    exe = "svn"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
+        exe += ".exe"
     if Utilities.isinpath(exe):
         data[".svn"] = (pluginTypename, displayString())
         data["_svn"] = (pluginTypename, displayString())
@@ -89,92 +88,97 @@
 def displayString():
     """
     Public function to get the display string.
-    
+
     @return display string (string)
     """
-    exe = 'svn'
+    exe = "svn"
     if Utilities.isWindowsPlatform():
-        exe += '.exe'
+        exe += ".exe"
     if Utilities.isinpath(exe):
-        return QCoreApplication.translate(
-            'VcsSubversionPlugin', 'Subversion (svn)')
+        return QCoreApplication.translate("VcsSubversionPlugin", "Subversion (svn)")
     else:
         return ""
 
+
 subversionCfgPluginObject = None
 
 
 def createConfigurationPage(configDlg):
     """
     Module function to create the configuration page.
-    
+
     @param configDlg reference to the configuration dialog (QDialog)
     @return reference to the configuration page
     """
     global subversionCfgPluginObject
-    from VcsPlugins.vcsSubversion.ConfigurationPage.SubversionPage import (
-        SubversionPage
-    )
+    from VcsPlugins.vcsSubversion.ConfigurationPage.SubversionPage import SubversionPage
+
     if subversionCfgPluginObject is None:
         subversionCfgPluginObject = VcsSubversionPlugin(None)
     page = SubversionPage(subversionCfgPluginObject)
     return page
-    
+
 
 def getConfigData():
     """
     Module function returning data as required by the configuration dialog.
-    
+
     @return dictionary with key "zzz_subversionPage" containing the relevant
     data
     """
     return {
-        "zzz_subversionPage":
-        [QCoreApplication.translate("VcsSubversionPlugin", "Subversion"),
-         os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                      "preferences-subversion.svg"),
-         createConfigurationPage, "vcsPage", None],
+        "zzz_subversionPage": [
+            QCoreApplication.translate("VcsSubversionPlugin", "Subversion"),
+            os.path.join(
+                "VcsPlugins", "vcsSubversion", "icons", "preferences-subversion.svg"
+            ),
+            createConfigurationPage,
+            "vcsPage",
+            None,
+        ],
     }
-    
+
 
 def prepareUninstall():
     """
     Module function to prepare for an uninstallation.
     """
-    if not ericApp().getObject("PluginManager").isPluginLoaded(
-            "PluginVcsSubversion"):
+    if not ericApp().getObject("PluginManager").isPluginLoaded("PluginVcsSubversion"):
         Preferences.getSettings().remove("Subversion")
-    
+
 
 class VcsSubversionPlugin(QObject):
     """
     Class implementing the Subversion version control plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         self.__subversionDefaults = {
             "StopLogOnCopy": True,
             "LogLimit": 20,
         }
-        
+
         from VcsPlugins.vcsSubversion.ProjectHelper import SvnProjectHelper
+
         self.__projectHelperObject = SvnProjectHelper(None, None)
         with contextlib.suppress(KeyError):
             ericApp().registerPluginObject(
-                pluginTypename, self.__projectHelperObject, pluginType)
+                pluginTypename, self.__projectHelperObject, pluginType
+            )
         readShortcuts(pluginName=pluginTypename)
-    
+
     def getProjectHelper(self):
         """
         Public method to get a reference to the project helper object.
-        
+
         @return reference to the project helper object
         """
         return self.__projectHelperObject
@@ -182,104 +186,112 @@
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.initToolbar(ui, toolbarManager)
-    
+
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from VcsPlugins.vcsSubversion.subversion import Subversion
+
         self.__object = Subversion(self, self.__ui)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("subversion")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-        
+
         return self.__object, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
         self.__object = None
-        
+
         tb = self.__ui.getToolbar("subversion")[1]
         tb.setVisible(False)
         tb.setEnabled(False)
-        
+
         tb = self.__ui.getToolbar("vcs")[1]
         tb.setVisible(Preferences.getVCS("ShowVcsToolbar"))
         tb.setEnabled(True)
-    
+
     def getPreferences(self, key):
         """
         Public method to retrieve the various settings.
-        
+
         @param key the key of the value to get
         @return the requested setting
         """
         if key in ["StopLogOnCopy"]:
-            return Preferences.toBool(Preferences.getSettings().value(
-                "Subversion/" + key, self.__subversionDefaults[key]))
+            return Preferences.toBool(
+                Preferences.getSettings().value(
+                    "Subversion/" + key, self.__subversionDefaults[key]
+                )
+            )
         elif key in ["LogLimit"]:
-            return int(Preferences.getSettings().value(
-                "Subversion/" + key,
-                self.__subversionDefaults[key]))
+            return int(
+                Preferences.getSettings().value(
+                    "Subversion/" + key, self.__subversionDefaults[key]
+                )
+            )
         elif key in ["Commits"]:
-            return Preferences.toList(Preferences.getSettings().value(
-                "Subversion/" + key))
+            return Preferences.toList(
+                Preferences.getSettings().value("Subversion/" + key)
+            )
         else:
             return Preferences.getSettings().value("Subversion/" + key)
-    
+
     def setPreferences(self, key, value):
         """
         Public method to store the various settings.
-        
+
         @param key the key of the setting to be set
         @param value the value to be set
         """
         Preferences.getSettings().setValue("Subversion/" + key, value)
-    
+
     def getServersPath(self):
         """
         Public method to get the filename of the servers file.
-        
+
         @return filename of the servers file (string)
         """
         return getServersPath()
-    
+
     def getConfigPath(self):
         """
         Public method to get the filename of the config file.
-        
+
         @return filename of the config file (string)
         """
         return getConfigPath()
-    
+
     def prepareUninstall(self):
         """
         Public method to prepare for an uninstallation.
         """
         ericApp().unregisterPluginObject(pluginTypename)
-    
+
     def prepareUnload(self):
         """
         Public method to prepare for an unload.
         """
         if self.__projectHelperObject:
             self.__projectHelperObject.removeToolbar(
-                self.__ui, ericApp().getObject("ToolbarManager"))
+                self.__ui, ericApp().getObject("ToolbarManager")
+            )
         ericApp().unregisterPluginObject(pluginTypename)
--- a/src/eric7/Plugins/PluginVmListspace.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVmListspace.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,7 @@
 version = UI.Info.VersionOnly
 pluginType = "viewmanager"
 pluginTypename = "listspace"
-displayString = QT_TRANSLATE_NOOP('VmListspacePlugin', 'Listspace')
+displayString = QT_TRANSLATE_NOOP("VmListspacePlugin", "Listspace")
 className = "VmListspacePlugin"
 packageName = "__core__"
 shortDescription = "Implements the Listspace view manager."
@@ -36,22 +36,24 @@
 def previewPix():
     """
     Module function to return a preview pixmap.
-    
+
     @return preview pixmap (QPixmap)
     """
-    fname = os.path.join(os.path.dirname(__file__),
-                         "ViewManagerPlugins", "Listspace", "preview.png")
+    fname = os.path.join(
+        os.path.dirname(__file__), "ViewManagerPlugins", "Listspace", "preview.png"
+    )
     return QPixmap(fname)
-    
+
 
 class VmListspacePlugin(QObject):
     """
     Class implementing the Listspace view manager plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -60,11 +62,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from ViewManagerPlugins.Listspace.Listspace import Listspace
+
         self.__object = Listspace(self.__ui)
         return self.__object, True
 
--- a/src/eric7/Plugins/PluginVmTabview.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginVmTabview.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,7 @@
 version = UI.Info.VersionOnly
 pluginType = "viewmanager"
 pluginTypename = "tabview"
-displayString = QT_TRANSLATE_NOOP('VmTabviewPlugin', 'Tabbed View')
+displayString = QT_TRANSLATE_NOOP("VmTabviewPlugin", "Tabbed View")
 className = "VmTabviewPlugin"
 packageName = "__core__"
 shortDescription = "Implements the Tabview view manager."
@@ -36,22 +36,24 @@
 def previewPix():
     """
     Module function to return a preview pixmap.
-    
+
     @return preview pixmap (QPixmap)
     """
-    fname = os.path.join(os.path.dirname(__file__),
-                         "ViewManagerPlugins", "Tabview", "preview.png")
+    fname = os.path.join(
+        os.path.dirname(__file__), "ViewManagerPlugins", "Tabview", "preview.png"
+    )
     return QPixmap(fname)
-    
+
 
 class VmTabviewPlugin(QObject):
     """
     Class implementing the Tabview view manager plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -60,11 +62,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of reference to instantiated viewmanager and
             activation status (boolean)
         """
         from ViewManagerPlugins.Tabview.Tabview import Tabview
+
         self.__object = Tabview(self.__ui)
         return self.__object, True
 
--- a/src/eric7/Plugins/PluginWizardDotDesktop.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardDotDesktop.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,8 +26,7 @@
 packageName = "__core__"
 shortDescription = "Wizard for the creation of a .desktop file."
 longDescription = (
-    """This plug-in implements a wizard to generate code for"""
-    """ a .desktop file."""
+    """This plug-in implements a wizard to generate code for""" """ a .desktop file."""
 )
 needsRestart = False
 pyqtApi = 2
@@ -40,33 +39,34 @@
     """
     Class implementing the .desktop wizard plug-in.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__action = None
-    
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plug-in.
         """
         self.__act = None
-    
+
     def activate(self):
         """
         Public method to activate this plug-in.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plug-in.
@@ -74,28 +74,33 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.__action)
-        self.__ui.removeEricActions([self.__action], 'wizards')
-    
+        self.__ui.removeEricActions([self.__action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.__action = EricAction(
-            self.tr('.desktop Wizard'),
-            self.tr('.desktop Wizard...'),
-            0, 0, self,
-            'wizards_dotdesktop')
-        self.__action.setStatusTip(self.tr('.desktop Wizard'))
-        self.__action.setWhatsThis(self.tr(
-            """<b>.desktop Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create the contents of a .desktop file. The"""
-            """ generated code replaces the text of the current editor."""
-            """ Alternatively a new editor is opened.</p>"""
-        ))
+            self.tr(".desktop Wizard"),
+            self.tr(".desktop Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_dotdesktop",
+        )
+        self.__action.setStatusTip(self.tr(".desktop Wizard"))
+        self.__action.setWhatsThis(
+            self.tr(
+                """<b>.desktop Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create the contents of a .desktop file. The"""
+                """ generated code replaces the text of the current editor."""
+                """ Alternatively a new editor is opened.</p>"""
+            )
+        )
         self.__action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.__action], 'wizards')
+
+        self.__ui.addEricActions([self.__action], "wizards")
 
     def __initMenu(self):
         """
@@ -104,33 +109,38 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.__action)
-    
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             if editor.text():
                 ok = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr(".desktop Wizard"),
-                    self.tr("""The current editor contains text."""
-                            """ Shall this be replaced?"""),
-                    icon=EricMessageBox.Critical)
+                    self.tr(
+                        """The current editor contains text."""
+                        """ Shall this be replaced?"""
+                    ),
+                    icon=EricMessageBox.Critical,
+                )
                 if not ok:
                     ericApp().getObject("ViewManager").newEditor()
                     editor = ericApp().getObject("ViewManager").activeWindow()
-            
+
             from WizardPlugins.DotDesktopWizard.DotDesktopWizardDialog import (
-                DotDesktopWizardDialog
+                DotDesktopWizardDialog,
             )
+
             dlg = DotDesktopWizardDialog(None)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 code = dlg.getCode()
@@ -140,8 +150,9 @@
                     editor.beginUndoAction()
                     editor.replaceSelectedText(code)
                     editor.endUndoAction()
-                    
+
                     editor.setLanguage("dummy.desktop")
 
+
 #
 # eflag: noqa = M801
--- a/src/eric7/Plugins/PluginWizardEricMessageBox.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardEricMessageBox.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the EricMessageBox wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('EricMessageBox Wizard'),
-            self.tr('EricMessageBox Wizard...'), 0, 0, self,
-            'wizards_e5messagebox')
-        self.action.setStatusTip(self.tr('EricMessageBox Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>EricMessageBox Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create an EricMessageBox. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("EricMessageBox Wizard"),
+            self.tr("EricMessageBox Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_e5messagebox",
+        )
+        self.action.setStatusTip(self.tr("EricMessageBox Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>EricMessageBox Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create an EricMessageBox. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,39 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
-        from WizardPlugins.EricMessageBoxWizard.EricMessageBoxWizardDialog \
-            import EricMessageBoxWizardDialog
+        from WizardPlugins.EricMessageBoxWizard.EricMessageBoxWizardDialog import (
+            EricMessageBoxWizardDialog,
+        )
+
         dlg = EricMessageBoxWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), True)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
@@ -133,5 +143,6 @@
                 editor.insertAt(code, line, index)
                 editor.endUndoAction()
 
+
 #
 # eflag: noqa = M841
--- a/src/eric7/Plugins/PluginWizardEricPlugin.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardEricPlugin.py	Wed Jul 13 14:55:47 2022 +0200
@@ -42,33 +42,34 @@
     """
     Class implementing the eric plug-in wizard plug-in.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
         self.__action = None
-    
+
     def __initialize(self):
         """
         Private slot to (re)initialize the plug-in.
         """
         self.__act = None
-    
+
     def activate(self):
         """
         Public method to activate this plug-in.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plug-in.
@@ -76,28 +77,33 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.__action)
-        self.__ui.removeEricActions([self.__action], 'wizards')
-    
+        self.__ui.removeEricActions([self.__action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.__action = EricAction(
-            self.tr('eric Plug-in Wizard'),
-            self.tr('eric Plug-in Wizard...'),
-            0, 0, self,
-            'wizards_eric_plugin')
-        self.__action.setStatusTip(self.tr('eric Plug-in Wizard'))
-        self.__action.setWhatsThis(self.tr(
-            """<b>eric Plug-in Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create the basic contents of an eric plug-in file."""
-            """ The generated code is inserted at the current cursor"""
-            """ position.</p>"""
-        ))
+            self.tr("eric Plug-in Wizard"),
+            self.tr("eric Plug-in Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_eric_plugin",
+        )
+        self.__action.setStatusTip(self.tr("eric Plug-in Wizard"))
+        self.__action.setWhatsThis(
+            self.tr(
+                """<b>eric Plug-in Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create the basic contents of an eric plug-in file."""
+                """ The generated code is inserted at the current cursor"""
+                """ position.</p>"""
+            )
+        )
         self.__action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.__action], 'wizards')
+
+        self.__ui.addEricActions([self.__action], "wizards")
 
     def __initMenu(self):
         """
@@ -106,35 +112,35 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.__action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return generated code (string), the plug-in package name (string)
             and a flag indicating success (boolean)
         """
-        from WizardPlugins.EricPluginWizard.PluginWizardDialog import (
-            PluginWizardDialog
-        )
+        from WizardPlugins.EricPluginWizard.PluginWizardDialog import PluginWizardDialog
+
         dlg = PluginWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             return (dlg.getCode(), dlg.packageName(), True)
         else:
             return (None, "", False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, packageName, ok = self.__callForm(editor)
             if ok:
@@ -145,11 +151,10 @@
                 editor.endUndoAction()
                 if not editor.getFileName():
                     editor.setLanguage("dummy.py")
-                
+
                 if packageName:
                     project = ericApp().getObject("Project")
-                    packagePath = os.path.join(project.getProjectPath(),
-                                               packageName)
+                    packagePath = os.path.join(project.getProjectPath(), packageName)
                     if not os.path.exists(packagePath):
                         try:
                             os.mkdir(packagePath)
@@ -160,8 +165,9 @@
                                 self.tr(
                                     """<p>The package directory <b>{0}</b>"""
                                     """ could not be created. Aborting..."""
-                                    """</p><p>Reason: {1}</p>""")
-                                .format(packagePath, str(err)))
+                                    """</p><p>Reason: {1}</p>"""
+                                ).format(packagePath, str(err)),
+                            )
                             return
                     packageFile = os.path.join(packagePath, "__init__.py")
                     if not os.path.exists(packageFile):
@@ -175,13 +181,14 @@
                                 self.tr(
                                     """<p>The package file <b>{0}</b> could"""
                                     """ not be created. Aborting...</p>"""
-                                    """<p>Reason: {1}</p>""")
-                                .format(packageFile, str(err)))
+                                    """<p>Reason: {1}</p>"""
+                                ).format(packageFile, str(err)),
+                            )
                             return
                     project.appendFile(packageFile)
                     project.saveProject()
-                    ericApp().getObject("ViewManager").openSourceFile(
-                        packageFile)
+                    ericApp().getObject("ViewManager").openSourceFile(packageFile)
+
 
 #
 # eflag: noqa = M801
--- a/src/eric7/Plugins/PluginWizardPyRegExp.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardPyRegExp.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the Python re wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('Python re Wizard'),
-            self.tr('Python re Wizard...'), 0, 0, self,
-            'wizards_python_re')
-        self.action.setStatusTip(self.tr('Python re Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>Python re Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a Python re string. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("Python re Wizard"),
+            self.tr("Python re Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_python_re",
+        )
+        self.action.setStatusTip(self.tr("Python re Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>Python re Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a Python re string. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,40 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
         from WizardPlugins.PyRegExpWizard.PyRegExpWizardDialog import (
-            PyRegExpWizardDialog
+            PyRegExpWizardDialog,
         )
+
         dlg = PyRegExpWizardDialog(None, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), 1)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardQColorDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQColorDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the QColorDialog wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('QColorDialog Wizard'),
-            self.tr('QColorDialog Wizard...'), 0, 0, self,
-            'wizards_qcolordialog')
-        self.action.setStatusTip(self.tr('QColorDialog Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>QColorDialog Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QColorDialog. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QColorDialog Wizard"),
+            self.tr("QColorDialog Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qcolordialog",
+        )
+        self.action.setStatusTip(self.tr("QColorDialog Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>QColorDialog Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QColorDialog. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,40 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string) and a success flag (boolean)
         """
         from WizardPlugins.ColorDialogWizard.ColorDialogWizardDialog import (
-            ColorDialogWizardDialog
+            ColorDialogWizardDialog,
         )
+
         dlg = ColorDialogWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), True)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardQFileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQFileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -38,27 +38,28 @@
     """
     Class implementing the QFileDialog wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
         self.__ui = ui
-        
+
         # PyQt5/PyQt6
         self.__pyqtRe = re.compile(r"(?:import|from)\s+PyQt([56])")
 
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initActions()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -70,44 +71,54 @@
             menu.removeAction(self.qFileDialogAction)
             menu.removeAction(self.ericFileDialogAction)
         self.__ui.removeEricActions(
-            [self.qFileDialogAction, self.ericFileDialogAction],
-            'wizards')
-    
+            [self.qFileDialogAction, self.ericFileDialogAction], "wizards"
+        )
+
     def __initActions(self):
         """
         Private method to initialize the actions.
         """
         self.qFileDialogAction = EricAction(
-            self.tr('QFileDialog Wizard'),
-            self.tr('Q&FileDialog Wizard...'), 0, 0, self,
-            'wizards_qfiledialog')
-        self.qFileDialogAction.setStatusTip(self.tr('QFileDialog Wizard'))
-        self.qFileDialogAction.setWhatsThis(self.tr(
-            """<b>QFileDialog Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QFileDialog. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QFileDialog Wizard"),
+            self.tr("Q&FileDialog Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qfiledialog",
+        )
+        self.qFileDialogAction.setStatusTip(self.tr("QFileDialog Wizard"))
+        self.qFileDialogAction.setWhatsThis(
+            self.tr(
+                """<b>QFileDialog Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QFileDialog. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.qFileDialogAction.triggered.connect(self.__handleQFileDialog)
-        
+
         self.ericFileDialogAction = EricAction(
-            self.tr('EricFileDialog Wizard'),
-            self.tr('EricFileDialog Wizard...'), 0, 0, self,
-            'wizards_e5filedialog')
-        self.ericFileDialogAction.setStatusTip(self.tr(
-            'EricFileDialog Wizard'))
-        self.ericFileDialogAction.setWhatsThis(self.tr(
-            """<b>EricFileDialog Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create an EricFileDialog. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
-        self.ericFileDialogAction.triggered.connect(
-            self.__handleEricFileDialog)
-        
+            self.tr("EricFileDialog Wizard"),
+            self.tr("EricFileDialog Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_e5filedialog",
+        )
+        self.ericFileDialogAction.setStatusTip(self.tr("EricFileDialog Wizard"))
+        self.ericFileDialogAction.setWhatsThis(
+            self.tr(
+                """<b>EricFileDialog Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create an EricFileDialog. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
+        self.ericFileDialogAction.triggered.connect(self.__handleEricFileDialog)
+
         self.__ui.addEricActions(
-            [self.qFileDialogAction, self.ericFileDialogAction],
-            'wizards')
+            [self.qFileDialogAction, self.ericFileDialogAction], "wizards"
+        )
 
     def __initMenu(self):
         """
@@ -117,11 +128,11 @@
         if menu:
             menu.addAction(self.ericFileDialogAction)
             menu.addAction(self.qFileDialogAction)
-    
+
     def __callForm(self, editor, variant):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @type Editor
         @param variant variant of code to be generated
@@ -130,40 +141,42 @@
         @return the generated code (string)
         """
         from WizardPlugins.FileDialogWizard.FileDialogWizardDialog import (
-            FileDialogWizardDialog
+            FileDialogWizardDialog,
         )
+
         dlg = FileDialogWizardDialog(variant, None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), 1)
         else:
             return (None, 0)
-        
+
     def __handle(self, variant):
         """
         Private method to handle the wizards action.
-        
+
         @param variant dialog variant to be generated
             (EricFileDialog or QFileDialog)
         @type str
         @exception ValueError raised to indicate an illegal file dialog variant
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             if variant not in ("QFileDialog", "EricFileDialog"):
                 raise ValueError("Illegal dialog variant given")
-            
+
             if variant == "QFileDialog":
                 match = self.__pyqtRe.search(editor.text())
                 if match is None:
@@ -175,7 +188,7 @@
             else:
                 # EricFileDialog
                 dialogVariant = -1
-            
+
             code, ok = self.__callForm(editor, dialogVariant)
             if ok:
                 line, index = editor.getCursorPosition()
@@ -183,13 +196,13 @@
                 editor.beginUndoAction()
                 editor.insertAt(code, line, index)
                 editor.endUndoAction()
-    
+
     def __handleQFileDialog(self):
         """
         Private slot to handle the wizard QFileDialog action.
         """
         self.__handle("QFileDialog")
-    
+
     def __handleEricFileDialog(self):
         """
         Private slot to handle the wizard EricFileDialog action.
--- a/src/eric7/Plugins/PluginWizardQFontDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQFontDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the QFontDialog wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('QFontDialog Wizard'),
-            self.tr('QFontDialog Wizard...'), 0, 0, self,
-            'wizards_qfontdialog')
-        self.action.setStatusTip(self.tr('QFontDialog Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>QFontDialog Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QFontDialog. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QFontDialog Wizard"),
+            self.tr("QFontDialog Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qfontdialog",
+        )
+        self.action.setStatusTip(self.tr("QFontDialog Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>QFontDialog Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QFontDialog. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,40 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
         from WizardPlugins.FontDialogWizard.FontDialogWizardDialog import (
-            FontDialogWizardDialog
+            FontDialogWizardDialog,
         )
+
         dlg = FontDialogWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), True)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardQInputDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQInputDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the QInputDialog wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('QInputDialog Wizard'),
-            self.tr('QInputDialog Wizard...'), 0, 0, self,
-            'wizards_qinputdialog')
-        self.action.setStatusTip(self.tr('QInputDialog Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>QInputDialog Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QInputDialog. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QInputDialog Wizard"),
+            self.tr("QInputDialog Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qinputdialog",
+        )
+        self.action.setStatusTip(self.tr("QInputDialog Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>QInputDialog Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QInputDialog. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,40 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
         from WizardPlugins.InputDialogWizard.InputDialogWizardDialog import (
-            InputDialogWizardDialog
+            InputDialogWizardDialog,
         )
+
         dlg = InputDialogWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), True)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardQMessageBox.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQMessageBox.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the QMessageBox wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('QMessageBox Wizard'),
-            self.tr('QMessageBox Wizard...'), 0, 0, self,
-            'wizards_qmessagebox')
-        self.action.setStatusTip(self.tr('QMessageBox Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>QMessageBox Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QMessageBox. The generated code is"""
-            """ inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QMessageBox Wizard"),
+            self.tr("QMessageBox Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qmessagebox",
+        )
+        self.action.setStatusTip(self.tr("QMessageBox Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>QMessageBox Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QMessageBox. The generated code is"""
+                """ inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,40 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
         from WizardPlugins.MessageBoxWizard.MessageBoxWizardDialog import (
-            MessageBoxWizardDialog
+            MessageBoxWizardDialog,
         )
+
         dlg = MessageBoxWizardDialog(None)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), True)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardQRegularExpression.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardQRegularExpression.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,10 +36,11 @@
     """
     Class implementing the QRegularExpression wizard plugin.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object (UI.UserInterface)
         """
         super().__init__(ui)
@@ -48,12 +49,12 @@
     def activate(self):
         """
         Public method to activate this plugin.
-        
+
         @return tuple of None and activation status (boolean)
         """
         self.__initAction()
         self.__initMenu()
-        
+
         return None, True
 
     def deactivate(self):
@@ -63,26 +64,32 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.removeAction(self.action)
-        self.__ui.removeEricActions([self.action], 'wizards')
-    
+        self.__ui.removeEricActions([self.action], "wizards")
+
     def __initAction(self):
         """
         Private method to initialize the action.
         """
         self.action = EricAction(
-            self.tr('QRegularExpression Wizard'),
-            self.tr('QRegularExpression Wizard...'), 0, 0, self,
-            'wizards_qregularexpression')
-        self.action.setStatusTip(self.tr('QRegularExpression Wizard'))
-        self.action.setWhatsThis(self.tr(
-            """<b>QRegularExpression Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create a QRegularExpression string. The generated"""
-            """ code is inserted at the current cursor position.</p>"""
-        ))
+            self.tr("QRegularExpression Wizard"),
+            self.tr("QRegularExpression Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_qregularexpression",
+        )
+        self.action.setStatusTip(self.tr("QRegularExpression Wizard"))
+        self.action.setWhatsThis(
+            self.tr(
+                """<b>QRegularExpression Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create a QRegularExpression string. The generated"""
+                """ code is inserted at the current cursor position.</p>"""
+            )
+        )
         self.action.triggered.connect(self.__handle)
-        
-        self.__ui.addEricActions([self.action], 'wizards')
+
+        self.__ui.addEricActions([self.action], "wizards")
 
     def __initMenu(self):
         """
@@ -91,41 +98,42 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addAction(self.action)
-    
+
     def __callForm(self, editor):
         """
         Private method to display a dialog and get the code.
-        
+
         @param editor reference to the current editor
         @return the generated code (string)
         """
         from WizardPlugins.QRegularExpressionWizard import (
-            QRegularExpressionWizardDialog
+            QRegularExpressionWizardDialog,
         )
-        dlg = QRegularExpressionWizardDialog.QRegularExpressionWizardDialog(
-            None, True)
+
+        dlg = QRegularExpressionWizardDialog.QRegularExpressionWizardDialog(None, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             line, index = editor.getCursorPosition()
             indLevel = editor.indentation(line) // editor.indentationWidth()
             if editor.indentationsUseTabs():
-                indString = '\t'
+                indString = "\t"
             else:
-                indString = editor.indentationWidth() * ' '
+                indString = editor.indentationWidth() * " "
             return (dlg.getCode(indLevel, indString), 1)
         else:
             return (None, False)
-        
+
     def __handle(self):
         """
         Private method to handle the wizards action.
         """
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             code, ok = self.__callForm(editor)
             if ok:
--- a/src/eric7/Plugins/PluginWizardSetup.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/PluginWizardSetup.py	Wed Jul 13 14:55:47 2022 +0200
@@ -41,29 +41,30 @@
     """
     Class implementing the setup.py wizard plug-in.
     """
+
     def __init__(self, ui):
         """
         Constructor
-        
+
         @param ui reference to the user interface object
         @type UI.UserInterface
         """
         super().__init__(ui)
         self.__ui = ui
         self.__actions = []
-    
+
     def activate(self):
         """
         Public method to activate this plug-in.
-        
+
         @return tuple of None and activation status
         @rtype tuple of (None, boolean)
         """
         self.__initActions()
         self.__initMenu()
-        
+
         return None, True
-    
+
     def deactivate(self):
         """
         Public method to deactivate this plug-in.
@@ -72,64 +73,79 @@
         if menu:
             for act in self.__actions:
                 menu.removeAction(act)
-        self.__ui.removeEricActions(self.__actions, 'wizards')
-    
+        self.__ui.removeEricActions(self.__actions, "wizards")
+
     def __initActions(self):
         """
         Private method to initialize the actions.
         """
         # 1. action for 'setup.py' creation
         act = EricAction(
-            self.tr('setup.py Wizard'),
-            self.tr('setup.py Wizard...'),
-            0, 0, self,
-            'wizards_setup_py')
-        act.setStatusTip(self.tr('setup.py Wizard'))
-        act.setWhatsThis(self.tr(
-            """<b>setup.py Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create the basic contents of a setup.py file. The"""
-            """ generated code is inserted at the current cursor position."""
-            """</p>"""
-        ))
+            self.tr("setup.py Wizard"),
+            self.tr("setup.py Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_setup_py",
+        )
+        act.setStatusTip(self.tr("setup.py Wizard"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>setup.py Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create the basic contents of a setup.py file. The"""
+                """ generated code is inserted at the current cursor position."""
+                """</p>"""
+            )
+        )
         act.triggered.connect(functools.partial(self.__handle, "setup.py"))
         self.__actions.append(act)
-        
+
         # 2. action for 'setup.cfg' creation
         act = EricAction(
-            self.tr('setup.cfg Wizard'),
-            self.tr('setup.cfg Wizard...'),
-            0, 0, self,
-            'wizards_setup_cfg')
-        act.setStatusTip(self.tr('setup.cfg Wizard'))
-        act.setWhatsThis(self.tr(
-            """<b>setup.cfg Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create the basic contents of a setup.cfg file. The"""
-            """ generated code is inserted at the current cursor position."""
-            """</p>"""
-        ))
+            self.tr("setup.cfg Wizard"),
+            self.tr("setup.cfg Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_setup_cfg",
+        )
+        act.setStatusTip(self.tr("setup.cfg Wizard"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>setup.cfg Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create the basic contents of a setup.cfg file. The"""
+                """ generated code is inserted at the current cursor position."""
+                """</p>"""
+            )
+        )
         act.triggered.connect(functools.partial(self.__handle, "setup.cfg"))
         self.__actions.append(act)
-        
+
         # 3. action for 'pyproject.toml' creation
         act = EricAction(
-            self.tr('pyproject.toml Wizard'),
-            self.tr('pyproject.toml Wizard...'),
-            0, 0, self,
-            'wizards_pyproject_toml')
-        act.setStatusTip(self.tr('pyproject.toml Wizard'))
-        act.setWhatsThis(self.tr(
-            """<b>pyproject.toml Wizard</b>"""
-            """<p>This wizard opens a dialog for entering all the parameters"""
-            """ needed to create the basic contents of a pyproject.toml file. The"""
-            """ generated code is inserted at the current cursor position."""
-            """</p>"""
-        ))
+            self.tr("pyproject.toml Wizard"),
+            self.tr("pyproject.toml Wizard..."),
+            0,
+            0,
+            self,
+            "wizards_pyproject_toml",
+        )
+        act.setStatusTip(self.tr("pyproject.toml Wizard"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>pyproject.toml Wizard</b>"""
+                """<p>This wizard opens a dialog for entering all the parameters"""
+                """ needed to create the basic contents of a pyproject.toml file. The"""
+                """ generated code is inserted at the current cursor position."""
+                """</p>"""
+            )
+        )
         act.triggered.connect(functools.partial(self.__handle, "pyproject.toml"))
         self.__actions.append(act)
-        
-        self.__ui.addEricActions(self.__actions, 'wizards')
+
+        self.__ui.addEricActions(self.__actions, "wizards")
 
     def __initMenu(self):
         """
@@ -138,28 +154,28 @@
         menu = self.__ui.getMenu("wizards")
         if menu:
             menu.addActions(self.__actions)
-    
+
     def __handle(self, category):
         """
         Private method to handle the wizards action.
-        
+
         @param category category of setup file to create
         @type str
         """
-        from WizardPlugins.SetupWizard.SetupWizardDialog import (
-            SetupWizardDialog
-        )
-        
+        from WizardPlugins.SetupWizard.SetupWizardDialog import SetupWizardDialog
+
         editor = ericApp().getObject("ViewManager").activeWindow()
-        
+
         if editor is None:
             EricMessageBox.critical(
                 self.__ui,
-                self.tr('No current editor'),
-                self.tr('Please open or create a file first.'))
+                self.tr("No current editor"),
+                self.tr("Please open or create a file first."),
+            )
         else:
             dlg = SetupWizardDialog(category, editor, self.__ui)
             dlg.show()
 
+
 #
 # eflag: noqa = M801
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 
 from EricWidgets import EricMessageBox
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_TranslatorPage import Ui_TranslatorPage
 
 from ..TranslatorLanguagesDb import TranslatorLanguagesDb
@@ -25,46 +23,59 @@
     """
     Class implementing the Time Tracker configuration page.
     """
+
     def __init__(self, plugin):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("TranslatorPage")
-        
+
         self.__plugin = plugin
         self.__enableLanguageWarning = True
-        
-        self.deeplLabel.setText(self.tr(
-            """<p>A key is <b>required</b> to use this service."""
-            """ <a href="{0}">Get a commercial or free API key.</a></p>"""
-        ).format(TranslatorEngines.getKeyUrl("deepl")))
-        self.googlev2Label.setText(self.tr(
-            """<p>A key is <b>required</b> to use this service."""
-            """ <a href="{0}">Get a commercial API key.</a></p>""").format(
-                TranslatorEngines.getKeyUrl("googlev2")))
-        self.ibmLabel.setText(self.tr(
-            """<p>A key is <b>required</b> to use this service."""
-            """ <a href="{0}">Register with IBM Cloud.</a></p>""").format(
-                TranslatorEngines.getKeyUrl("ibm_watson")))
-        self.msLabel.setText(self.tr(
-            """<p>A registration of the text translation service is"""
-            """ <b>required</b>. <a href="{0}">Register with Microsoft"""
-            """ Azure.</a></p>""").format(
-                TranslatorEngines.getKeyUrl("microsoft")))
-        self.mymemoryLabel.setText(self.tr(
-            """<p>A key is <b>optional</b> to use this service."""
-            """ <a href="{0}">Get a free API key.</a></p>""").format(
-                TranslatorEngines.getKeyUrl("mymemory")))
-        self.yandexLabel.setText(self.tr(
-            """<p>A key is <b>required</b> to use this service."""
-            """ <a href="{0}">Get a free API key.</a></p>""").format(
-                TranslatorEngines.getKeyUrl("yandex")))
-        
+
+        self.deeplLabel.setText(
+            self.tr(
+                """<p>A key is <b>required</b> to use this service."""
+                """ <a href="{0}">Get a commercial or free API key.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("deepl"))
+        )
+        self.googlev2Label.setText(
+            self.tr(
+                """<p>A key is <b>required</b> to use this service."""
+                """ <a href="{0}">Get a commercial API key.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("googlev2"))
+        )
+        self.ibmLabel.setText(
+            self.tr(
+                """<p>A key is <b>required</b> to use this service."""
+                """ <a href="{0}">Register with IBM Cloud.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("ibm_watson"))
+        )
+        self.msLabel.setText(
+            self.tr(
+                """<p>A registration of the text translation service is"""
+                """ <b>required</b>. <a href="{0}">Register with Microsoft"""
+                """ Azure.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("microsoft"))
+        )
+        self.mymemoryLabel.setText(
+            self.tr(
+                """<p>A key is <b>optional</b> to use this service."""
+                """ <a href="{0}">Get a free API key.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("mymemory"))
+        )
+        self.yandexLabel.setText(
+            self.tr(
+                """<p>A key is <b>required</b> to use this service."""
+                """ <a href="{0}">Get a free API key.</a></p>"""
+            ).format(TranslatorEngines.getKeyUrl("yandex"))
+        )
+
         # set initial values
         enabledLanguages = self.__plugin.getPreferences("EnabledLanguages")
         languages = TranslatorLanguagesDb()
@@ -79,74 +90,65 @@
                 itm.setCheckState(Qt.CheckState.Unchecked)
             self.languagesList.addItem(itm)
         self.languagesList.sortItems()
-        
+
         # DeepL settings
-        self.deeplKeyEdit.setText(
-            self.__plugin.getPreferences("DeeplKey"))
+        self.deeplKeyEdit.setText(self.__plugin.getPreferences("DeeplKey"))
         # Google settings
         self.dictionaryCheckBox.setChecked(
-            self.__plugin.getPreferences("GoogleEnableDictionary"))
-        self.googlev2KeyEdit.setText(
-            self.__plugin.getPreferences("GoogleV2Key"))
+            self.__plugin.getPreferences("GoogleEnableDictionary")
+        )
+        self.googlev2KeyEdit.setText(self.__plugin.getPreferences("GoogleV2Key"))
         # IBM Watson settings
-        self.ibmUrlEdit.setText(
-            self.__plugin.getPreferences("IbmUrl"))
-        self.ibmKeyEdit.setText(
-            self.__plugin.getPreferences("IbmKey"))
+        self.ibmUrlEdit.setText(self.__plugin.getPreferences("IbmUrl"))
+        self.ibmKeyEdit.setText(self.__plugin.getPreferences("IbmKey"))
         # Microsoft settings
         self.msSubscriptionKeyEdit.setText(
-            self.__plugin.getPreferences("MsTranslatorKey"))
+            self.__plugin.getPreferences("MsTranslatorKey")
+        )
         self.msSubscriptionRegionEdit.setText(
-            self.__plugin.getPreferences("MsTranslatorRegion"))
+            self.__plugin.getPreferences("MsTranslatorRegion")
+        )
         # MyMemory settings
-        self.mymemoryKeyEdit.setText(
-            self.__plugin.getPreferences("MyMemoryKey"))
-        self.mymemoryEmailEdit.setText(
-            self.__plugin.getPreferences("MyMemoryEmail"))
+        self.mymemoryKeyEdit.setText(self.__plugin.getPreferences("MyMemoryKey"))
+        self.mymemoryEmailEdit.setText(self.__plugin.getPreferences("MyMemoryEmail"))
         # Yandex settings
-        self.yandexKeyEdit.setText(
-            self.__plugin.getPreferences("YandexKey"))
-    
+        self.yandexKeyEdit.setText(self.__plugin.getPreferences("YandexKey"))
+
     def save(self):
         """
         Public slot to save the translators configuration.
         """
         enabledLanguages = [
-            itm.data(Qt.ItemDataRole.UserRole)
-            for itm in self.__checkedLanguageItems()
+            itm.data(Qt.ItemDataRole.UserRole) for itm in self.__checkedLanguageItems()
         ]
-        self.__plugin.setPreferences(
-            "EnabledLanguages", enabledLanguages)
-        
+        self.__plugin.setPreferences("EnabledLanguages", enabledLanguages)
+
         # DeepL settings
-        self.__plugin.setPreferences(
-            "DeeplKey", self.deeplKeyEdit.text())
+        self.__plugin.setPreferences("DeeplKey", self.deeplKeyEdit.text())
         # Google settings
         self.__plugin.setPreferences(
-            "GoogleEnableDictionary", self.dictionaryCheckBox.isChecked())
-        self.__plugin.setPreferences(
-            "GoogleV2Key", self.googlev2KeyEdit.text())
+            "GoogleEnableDictionary", self.dictionaryCheckBox.isChecked()
+        )
+        self.__plugin.setPreferences("GoogleV2Key", self.googlev2KeyEdit.text())
         # IBM Watson settings
-        self.__plugin.setPreferences(
-            "IbmUrl", self.ibmUrlEdit.text())
-        self.__plugin.setPreferences(
-            "IbmKey", self.ibmKeyEdit.text())
+        self.__plugin.setPreferences("IbmUrl", self.ibmUrlEdit.text())
+        self.__plugin.setPreferences("IbmKey", self.ibmKeyEdit.text())
         # Microsoft settings
         self.__plugin.setPreferences(
-            "MsTranslatorKey", self.msSubscriptionKeyEdit.text())
-        self.__plugin.setPreferences(
-            "MsTranslatorRegion", self.msSubscriptionRegionEdit.text())
-        # MyMemory settings
+            "MsTranslatorKey", self.msSubscriptionKeyEdit.text()
+        )
         self.__plugin.setPreferences(
-            "MyMemoryKey", self.mymemoryKeyEdit.text())
+            "MsTranslatorRegion", self.msSubscriptionRegionEdit.text()
+        )
+        # MyMemory settings
+        self.__plugin.setPreferences("MyMemoryKey", self.mymemoryKeyEdit.text())
         # Yandex settings
-        self.__plugin.setPreferences(
-            "YandexKey", self.yandexKeyEdit.text())
-    
+        self.__plugin.setPreferences("YandexKey", self.yandexKeyEdit.text())
+
     def __checkedLanguageItems(self):
         """
         Private method to get a list of checked language items.
-        
+
         @return list of checked language items
         @rtype list of QListWidgetItem
         """
@@ -155,16 +157,16 @@
             itm = self.languagesList.item(index)
             if itm.checkState() == Qt.CheckState.Checked:
                 items.append(itm)
-        
+
         return items
-    
+
     @pyqtSlot()
     def on_setButton_clicked(self):
         """
         Private slot to set or unset all items.
         """
         self.__enableLanguageWarning = False
-        
+
         unset = len(self.__checkedLanguageItems()) > 0
         for index in range(self.languagesList.count()):
             itm = self.languagesList.item(index)
@@ -172,16 +174,16 @@
                 itm.setCheckState(Qt.CheckState.Unchecked)
             else:
                 itm.setCheckState(Qt.CheckState.Checked)
-        
+
         self.__enableLanguageWarning = True
-    
+
     @pyqtSlot()
     def on_defaultButton_clicked(self):
         """
         Private slot to set the default languages.
         """
         self.__enableLanguageWarning = False
-        
+
         defaults = self.__plugin.getPreferencesDefault("EnabledLanguages")
         for index in range(self.languagesList.count()):
             itm = self.languagesList.item(index)
@@ -189,23 +191,23 @@
                 itm.setCheckState(Qt.CheckState.Checked)
             else:
                 itm.setCheckState(Qt.CheckState.Unchecked)
-        
+
         self.__enableLanguageWarning = True
-    
+
     @pyqtSlot(QListWidgetItem)
     def on_languagesList_itemChanged(self, item):
         """
         Private slot to handle the selection of an item.
-        
+
         @param item reference to the changed item
         @type QListWidgetItem
         """
-        if (
-            self.__enableLanguageWarning and
-            len(self.__checkedLanguageItems()) < 2
-        ):
+        if self.__enableLanguageWarning and len(self.__checkedLanguageItems()) < 2:
             EricMessageBox.warning(
                 self,
                 self.tr("Enabled Languages"),
-                self.tr("""At least two languages should be selected to"""
-                        """ work correctly."""))
+                self.tr(
+                    """At least two languages should be selected to"""
+                    """ work correctly."""
+                ),
+            )
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/Translator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/Translator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     """
     Class implementing the translator object.
     """
+
     def __init__(self, plugin, usesDarkPalette, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param usesDarkPalette flag indicating that the platform uses a palette
@@ -34,77 +35,88 @@
         @type QObject
         """
         QObject.__init__(self, parent)
-        
+
         self.__plugin = plugin
         self.__ui = parent
-        
+
         self.__widget = None
-        
+
         if usesDarkPalette:
             self.__iconSuffix = "dark"
         else:
             self.__iconSuffix = "light"
-    
+
     def activate(self):
         """
         Public method to activate the translator.
         """
         from .TranslatorWidget import TranslatorWidget
-        
+
         self.__widget = TranslatorWidget(self.__plugin, self)
         iconName = (
             "sbTranslator96"
-            if self.__ui.getLayoutType() == "Sidebars" else
-            "flag-{0}".format(self.__iconSuffix)
+            if self.__ui.getLayoutType() == "Sidebars"
+            else "flag-{0}".format(self.__iconSuffix)
         )
         self.__ui.addSideWidget(
-            self.__ui.BottomSide, self.__widget,
+            self.__ui.BottomSide,
+            self.__widget,
             UI.PixmapCache.getIcon(
-                os.path.join(os.path.dirname(__file__), "icons", iconName)),
-            self.tr("Translator"))
-        
+                os.path.join(os.path.dirname(__file__), "icons", iconName)
+            ),
+            self.tr("Translator"),
+        )
+
         self.__activateAct = EricAction(
-            self.tr('Translator'),
-            self.tr('T&ranslator'),
+            self.tr("Translator"),
+            self.tr("T&ranslator"),
             QKeySequence(self.tr("Alt+Shift+R")),
-            0, self,
-            'translator_activate')
-        self.__activateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Translator window."))
-        self.__activateAct.setWhatsThis(self.tr(
-            """<b>Activate Translator</b>"""
-            """<p>This switches the input focus to the Translator"""
-            """ window.</p>"""
-        ))
+            0,
+            self,
+            "translator_activate",
+        )
+        self.__activateAct.setStatusTip(
+            self.tr("Switch the input focus to the Translator window.")
+        )
+        self.__activateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Translator</b>"""
+                """<p>This switches the input focus to the Translator"""
+                """ window.</p>"""
+            )
+        )
         self.__activateAct.triggered.connect(self.__activateWidget)
-        
-        self.__ui.addEricActions([self.__activateAct], 'ui')
+
+        self.__ui.addEricActions([self.__activateAct], "ui")
         menu = self.__ui.getMenu("subwindow")
         menu.addAction(self.__activateAct)
-    
+
     def deactivate(self):
         """
         Public method to deactivate the time tracker.
         """
         menu = self.__ui.getMenu("subwindow")
         menu.removeAction(self.__activateAct)
-        self.__ui.removeEricActions([self.__activateAct], 'ui')
+        self.__ui.removeEricActions([self.__activateAct], "ui")
         self.__ui.removeSideWidget(self.__widget)
-    
+
     def getAppIcon(self, name):
         """
         Public method to get an icon.
-        
+
         @param name name of the icon file
         @type str
         @return icon
         @rtype QIcon
         """
-        return UI.PixmapCache.getIcon(os.path.join(
-            os.path.dirname(__file__), "icons",
-            "{0}-{1}".format(name, self.__iconSuffix)
-        ))
-    
+        return UI.PixmapCache.getIcon(
+            os.path.join(
+                os.path.dirname(__file__),
+                "icons",
+                "{0}-{1}".format(name, self.__iconSuffix),
+            )
+        )
+
     def __activateWidget(self):
         """
         Private slot to handle the activation of the project browser.
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,50 +21,77 @@
     Class implementing the translation engine for the DeepL
     translation service.
     """
+
     TranslatorUrls = {
         "pro": "https://api.deepl.com/v2/translate",
         "free": "https://api-free.deepl.com/v2/translate",
     }
     MaxTranslationTextLen = 30 * 1024
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "deepl"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["bg", "cs", "da", "de", "el", "en", "es", "et", "fi", "fr",
-                "hu", "id", "it", "ja", "lt", "lv", "nl", "pl", "pt", "ro",
-                "ru", "sk", "sl", "sv", "tr", "zh"]
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+        return [
+            "bg",
+            "cs",
+            "da",
+            "de",
+            "el",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "hu",
+            "id",
+            "it",
+            "ja",
+            "lt",
+            "lv",
+            "nl",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sv",
+            "tr",
+            "zh",
+        ]
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -78,29 +105,30 @@
         """
         if len(text) > self.MaxTranslationTextLen:
             return (
-                self.tr("DeepL: Text to be translated exceeds the translation"
-                        " limit of {0} characters.")
-                .format(self.MaxTranslationTextLen),
-                False
+                self.tr(
+                    "DeepL: Text to be translated exceeds the translation"
+                    " limit of {0} characters."
+                ).format(self.MaxTranslationTextLen),
+                False,
             )
-        
+
         apiKey = self.plugin.getPreferences("DeeplKey")
         if not apiKey:
             return self.tr("A valid DeepL Pro key is required."), False
-        
+
         params = QByteArray(
             "auth_key={0}&source_lang={1}&target_lang={2}&text=".format(
-                apiKey, originalLanguage.upper(), translationLanguage.upper())
-            .encode("utf-8"))
-        encodedText = (
-            QByteArray(Utilities.html_encode(text).encode("utf-8"))
-            .toPercentEncoding()
+                apiKey, originalLanguage.upper(), translationLanguage.upper()
+            ).encode("utf-8")
         )
+        encodedText = QByteArray(
+            Utilities.html_encode(text).encode("utf-8")
+        ).toPercentEncoding()
         request = params + encodedText
         translatorUrl = (
             DeepLEngine.TranslatorUrls["free"]
-            if apiKey.endswith(":fx") else
-            DeepLEngine.TranslatorUrls["pro"]
+            if apiKey.endswith(":fx")
+            else DeepLEngine.TranslatorUrls["pro"]
         )
         response, ok = requestObject.post(QUrl(translatorUrl), request)
         if ok:
@@ -108,21 +136,17 @@
                 responseDict = json.loads(response)
             except ValueError:
                 return self.tr("Invalid response received from DeepL"), False
-            
+
             if "translations" not in responseDict:
                 return self.tr("DeepL call returned an unknown result"), False
-            
+
             translations = responseDict["translations"]
             if len(translations) == 0:
                 return self.tr("<p>DeepL: No translation found</p>"), True
-            
+
             # show sentence by sentence separated by a line
-            result = (
-                "<p>" +
-                "<hr/>".join([t["text"] for t in translations]) +
-                "</p>"
-            )
-        
+            result = "<p>" + "<hr/>".join([t["text"] for t in translations]) + "</p>"
+
         else:
             result = response
         return result, ok
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,60 +22,106 @@
     Class implementing the translation engine for the old Google
     translation service.
     """
+
     TranslatorUrl = "https://translate.googleapis.com/translate_a/single"
     TextToSpeechUrl = "https://translate.google.com/translate_tts"
     TextToSpeechLimit = 100
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "googlev1"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["ar", "be", "bg", "bs", "ca", "cs", "da", "de", "el", "en",
-                "es", "et", "fi", "fr", "ga", "gl", "hi", "hr", "hu", "id",
-                "is", "it", "iw", "ja", "ka", "ko", "lt", "lv", "mk", "mt",
-                "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl", "sq", "sr",
-                "sv", "th", "tl", "tr", "uk", "vi", "zh-CN", "zh-TW",
-                ]
-    
+        return [
+            "ar",
+            "be",
+            "bg",
+            "bs",
+            "ca",
+            "cs",
+            "da",
+            "de",
+            "el",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "ga",
+            "gl",
+            "hi",
+            "hr",
+            "hu",
+            "id",
+            "is",
+            "it",
+            "iw",
+            "ja",
+            "ka",
+            "ko",
+            "lt",
+            "lv",
+            "mk",
+            "mt",
+            "nl",
+            "no",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sq",
+            "sr",
+            "sv",
+            "th",
+            "tl",
+            "tr",
+            "uk",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
+
     def hasTTS(self):
         """
         Public method indicating the Text-to-Speech capability.
-        
+
         @return flag indicating the Text-to-Speech capability
         @rtype bool
         """
         return True
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -89,52 +135,56 @@
         """
         params = QByteArray(
             "client=gtx&sl={0}&tl={1}&dt=t&dt=bd&ie=utf-8&oe=utf-8&q=".format(
-                originalLanguage, translationLanguage).encode("utf-8"))
-        encodedText = (
-            QByteArray(Utilities.html_encode(text).encode("utf-8"))
-            .toPercentEncoding()
+                originalLanguage, translationLanguage
+            ).encode("utf-8")
         )
+        encodedText = QByteArray(
+            Utilities.html_encode(text).encode("utf-8")
+        ).toPercentEncoding()
         request = params + encodedText
         response, ok = requestObject.post(QUrl(self.TranslatorUrl), request)
         if ok:
             try:
                 # clean up the response
-                response = re.sub(r',{2,}', ',', response)
+                response = re.sub(r",{2,}", ",", response)
                 responseDict = json.loads(response)
             except ValueError:
                 return self.tr("Google V1: Invalid response received"), False
-            
+
             if isinstance(responseDict, dict):
                 sentences = responseDict["sentences"]
                 result = ""
                 for sentence in sentences:
                     result += sentence["trans"].replace("\n", "<br/>")
-                
+
                 if (
-                    self.plugin.getPreferences("GoogleEnableDictionary") and
-                    "dict" in responseDict
+                    self.plugin.getPreferences("GoogleEnableDictionary")
+                    and "dict" in responseDict
                 ):
                     dictionary = responseDict["dict"]
                     for value in dictionary:
                         result += "<hr/><u><b>{0}</b> - {1}</u><br/>".format(
-                            text, value["pos"])
+                            text, value["pos"]
+                        )
                         for entry in value["entry"]:
-                            previous = (entry["previous_word"] + " "
-                                        if "previous_word" in entry else "")
+                            previous = (
+                                entry["previous_word"] + " "
+                                if "previous_word" in entry
+                                else ""
+                            )
                             word = entry["word"]
                             reverse = entry["reverse_translation"]
                             result += "<br/>{0}<b>{1}</b> - {2}".format(
-                                previous, word, ", ".join(reverse))
+                                previous, word, ", ".join(reverse)
+                            )
                         if value != dictionary[-1]:
                             result += "<br/>"
             elif isinstance(responseDict, list):
                 sentences = responseDict[0]
-                result = (
-                    "".join([s[0] for s in sentences]).replace("\n", "<br/>")
-                )
+                result = "".join([s[0] for s in sentences]).replace("\n", "<br/>")
                 if (
-                    self.plugin.getPreferences("GoogleEnableDictionary") and
-                    len(responseDict) > 2
+                    self.plugin.getPreferences("GoogleEnableDictionary")
+                    and len(responseDict) > 2
                 ):
                     if not responseDict[1]:
                         result = self.tr("Google V1: No translation found.")
@@ -142,22 +192,24 @@
                     else:
                         for wordTypeList in responseDict[1]:
                             result += "<hr/><u><b>{0}</b> - {1}</u>".format(
-                                wordTypeList[0], wordTypeList[-2])
+                                wordTypeList[0], wordTypeList[-2]
+                            )
                             for wordsList in wordTypeList[2]:
                                 reverse = wordsList[0]
                                 words = wordsList[1]
                                 result += "<br/><b>{0}</b> - {1}".format(
-                                    reverse, ", ".join(words))
+                                    reverse, ", ".join(words)
+                                )
             else:
                 result = responseDict
         else:
             result = response
         return result, ok
-    
+
     def getTextToSpeechData(self, requestObject, text, language):
         """
         Public method to pronounce the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be pronounced
@@ -169,11 +221,15 @@
         """
         text = text.split("\n\n", 1)[0]
         if len(text) > self.TextToSpeechLimit:
-            return (self.tr("Google V1: Only texts up to {0} characters are"
-                            " allowed.")
-                    .format(self.TextToSpeechLimit), False)
-        
-        url = QUrl(self.TextToSpeechUrl +
-                   "?client=tw-ob&ie=utf-8&tl={0}&q={1}".format(
-                       language, text))
+            return (
+                self.tr(
+                    "Google V1: Only texts up to {0} characters are" " allowed."
+                ).format(self.TextToSpeechLimit),
+                False,
+            )
+
+        url = QUrl(
+            self.TextToSpeechUrl
+            + "?client=tw-ob&ie=utf-8&tl={0}&q={1}".format(language, text)
+        )
         return requestObject.get(url)
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,49 +21,95 @@
     Class implementing the translation engine for the new Google
     translation service.
     """
+
     TranslatorUrl = "https://translation.googleapis.com/language/translate/v2"
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "googlev2"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["ar", "be", "bg", "bs", "ca", "cs", "da", "de", "el", "en",
-                "es", "et", "fi", "fr", "ga", "gl", "hi", "hr", "hu", "id",
-                "is", "it", "iw", "ja", "ka", "ko", "lt", "lv", "mk", "mt",
-                "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl", "sq", "sr",
-                "sv", "th", "tl", "tr", "uk", "vi", "zh-CN", "zh-TW",
-                ]
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+        return [
+            "ar",
+            "be",
+            "bg",
+            "bs",
+            "ca",
+            "cs",
+            "da",
+            "de",
+            "el",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "ga",
+            "gl",
+            "hi",
+            "hr",
+            "hu",
+            "id",
+            "is",
+            "it",
+            "iw",
+            "ja",
+            "ka",
+            "ko",
+            "lt",
+            "lv",
+            "mk",
+            "mt",
+            "nl",
+            "no",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sq",
+            "sr",
+            "sv",
+            "th",
+            "tl",
+            "tr",
+            "uk",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -77,16 +123,19 @@
         """
         apiKey = self.plugin.getPreferences("GoogleV2Key")
         if not apiKey:
-            return self.tr("Google V2: A valid Google Translate key is"
-                           " required."), False
-        
+            return (
+                self.tr("Google V2: A valid Google Translate key is" " required."),
+                False,
+            )
+
         params = QByteArray(
             "key={2}&source={0}&target={1}&format=text&q=".format(
-                originalLanguage, translationLanguage, apiKey).encode("utf-8"))
-        encodedText = (
-            QByteArray(Utilities.html_encode(text).encode("utf-8"))
-            .toPercentEncoding()
+                originalLanguage, translationLanguage, apiKey
+            ).encode("utf-8")
         )
+        encodedText = QByteArray(
+            Utilities.html_encode(text).encode("utf-8")
+        ).toPercentEncoding()
         request = params + encodedText
         response, ok = requestObject.post(QUrl(self.TranslatorUrl), request)
         if ok:
@@ -95,13 +144,10 @@
                 responseDict = json.loads(response)
             except ValueError:
                 return self.tr("Google V2: Invalid response received"), False
-            
-            if (
-                "data" not in responseDict or
-                "translations" not in responseDict["data"]
-            ):
+
+            if "data" not in responseDict or "translations" not in responseDict["data"]:
                 return self.tr("Google V2: No translation available."), False
-            
+
             result = ""
             translations = responseDict["data"]["translations"]
             for translation in translations:
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import json
 
 from PyQt6.QtCore import QUrl, QByteArray, QTimer
-from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply
-)
+from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
 
 from EricWidgets import EricMessageBox
 
@@ -26,59 +24,61 @@
     Class implementing the translation engine for the IBM Watson Language
     Translator service.
     """
+
     # Documentation:
     # https://www.ibm.com/watson/developercloud/language-translator
     #
     # Start page:
     # https://www.ibm.com/watson/services/language-translator/
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         self.__ui = parent
-        
+
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
-        
+            proxyAuthenticationRequired
+        )
+
         self.__availableTranslations = {}
         # dictionary of sets of available translations
-        
+
         self.__replies = []
-        
+
         QTimer.singleShot(0, self.__getTranslationModels)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "ibm_watson"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
         return list(self.__availableTranslations.keys())
-    
+
     def supportedTargetLanguages(self, original):
         """
         Public method to get a list of supported target languages for an
         original language.
-        
+
         @param original original language
         @type str
         @return list of supported target languages for the given original
@@ -86,21 +86,22 @@
         """
         targets = self.__availableTranslations.get(original, set())
         return list(targets)
-    
+
     def hasTTS(self):
         """
         Public method indicating the Text-to-Speech capability.
-        
+
         @return flag indicating the Text-to-Speech capability
         @rtype bool
         """
         return False
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -114,40 +115,46 @@
         """
         apiKey = self.plugin.getPreferences("IbmKey")
         if not apiKey:
-            return self.tr("IBM Watson: A valid Language Translator key is"
-                           " required."), False
+            return (
+                self.tr("IBM Watson: A valid Language Translator key is" " required."),
+                False,
+            )
         translatorUrl = self.plugin.getPreferences("IbmUrl")
         if not translatorUrl:
-            return self.tr("IBM Watson: A valid Language Translator URL is"
-                           " required."), False
-        
+            return (
+                self.tr("IBM Watson: A valid Language Translator URL is" " required."),
+                False,
+            )
+
         params = "?version=2018-05-01"
         url = QUrl(translatorUrl + "/v3/translate" + params)
-        
+
         requestDict = {
             "text": [text],
             "source": originalLanguage,
             "target": translationLanguage,
         }
         request = QByteArray(json.dumps(requestDict).encode("utf-8"))
-        
+
         extraHeaders = [
-            (b"Authorization",
-             b"Basic " + QByteArray(
-                 b"apikey:" + apiKey.encode("utf-8")).toBase64())
+            (
+                b"Authorization",
+                b"Basic " + QByteArray(b"apikey:" + apiKey.encode("utf-8")).toBase64(),
+            )
         ]
-        
-        response, ok = requestObject.post(url, request, dataType="json",
-                                          extraHeaders=extraHeaders)
+
+        response, ok = requestObject.post(
+            url, request, dataType="json", extraHeaders=extraHeaders
+        )
         if ok:
             try:
                 responseDict = json.loads(response)
             except ValueError:
                 return self.tr("IBM Watson: Invalid response received"), False
-            
+
             if "translations" not in responseDict:
                 return self.tr("IBM Watson: No translation available."), False
-            
+
             result = ""
             translations = responseDict["translations"]
             for translation in translations:
@@ -157,11 +164,11 @@
         else:
             result = response
         return result, ok
-    
+
     def __adjustLanguageCode(self, code):
         """
         Private method to adjust a given language code.
-        
+
         @param code code to be adjusted
         @type str
         @return adjusted language code
@@ -171,7 +178,7 @@
             return "zh-CN"
         else:
             return code
-    
+
     def __getTranslationModels(self):
         """
         Private method to get the translation models supported by IBM Watson
@@ -182,8 +189,7 @@
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Error Getting Available Translations"),
-                self.tr("IBM Watson: A valid Language Translator key is"
-                        " required.")
+                self.tr("IBM Watson: A valid Language Translator key is" " required."),
             )
             return
         translatorUrl = self.plugin.getPreferences("IbmUrl")
@@ -191,47 +197,48 @@
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Error Getting Available Translations"),
-                self.tr("IBM Watson: A valid Language Translator URL is"
-                        " required.")
+                self.tr("IBM Watson: A valid Language Translator URL is" " required."),
             )
             return
-        
+
         params = "?version=2018-05-01"
         url = QUrl(translatorUrl + "/v3/models" + params)
-        
+
         extraHeaders = [
-            (b"Authorization",
-             b"Basic " + QByteArray(
-                 b"apikey:" + apiKey.encode("utf-8")).toBase64())
+            (
+                b"Authorization",
+                b"Basic " + QByteArray(b"apikey:" + apiKey.encode("utf-8")).toBase64(),
+            )
         ]
-        
+
         request = QNetworkRequest(url)
         if extraHeaders:
             for name, value in extraHeaders:
                 request.setRawHeader(name, value)
         reply = self.__networkManager.get(request)
-        reply.finished.connect(
-            lambda: self.__getTranslationModelsReplyFinished(reply))
+        reply.finished.connect(lambda: self.__getTranslationModelsReplyFinished(reply))
         self.__replies.append(reply)
-    
+
     def __getTranslationModelsReplyFinished(self, reply):
         """
         Private slot handling the receipt of the available translations.
-        
+
         @param reply reference to the network reply object
         @type QNetworkReply
         """
         if reply in self.__replies:
             self.__replies.remove(reply)
             reply.deleteLater()
-            
+
             if reply.error() != QNetworkReply.NetworkError.NoError:
                 errorStr = reply.errorString()
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Error Getting Available Translations"),
-                    self.tr("IBM Watson: The server sent an error indication."
-                            "\n Error: {0}").format(errorStr)
+                    self.tr(
+                        "IBM Watson: The server sent an error indication."
+                        "\n Error: {0}"
+                    ).format(errorStr),
                 )
                 return
             else:
@@ -242,18 +249,18 @@
                     EricMessageBox.critical(
                         self.__ui,
                         self.tr("Error Getting Available Translations"),
-                        self.tr("IBM Watson: Invalid response received")
+                        self.tr("IBM Watson: Invalid response received"),
                     )
                     return
-                
+
                 if "models" not in responseDict:
                     EricMessageBox.critical(
                         self.__ui,
                         self.tr("Error Getting Available Translations"),
-                        self.tr("IBM Watson: No translation available.")
+                        self.tr("IBM Watson: No translation available."),
                     )
                     return
-                
+
                 for model in responseDict["models"]:
                     if model["status"] == "available":
                         source = self.__adjustLanguageCode(model["source"])
@@ -261,5 +268,5 @@
                         if source not in self.__availableTranslations:
                             self.__availableTranslations[source] = set()
                         self.__availableTranslations[source].add(target)
-                
+
                 self.availableTranslationsLoaded.emit()
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,56 +19,87 @@
     Class implementing the translation engine for the Microsoft
     translation service.
     """
+
     TranslatorUrl = (
-        "https://api.cognitive.microsofttranslator.com/translate"
-        "?api-version=3.0"
+        "https://api.cognitive.microsofttranslator.com/translate" "?api-version=3.0"
     )
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         self.__mappings = {
             "zh-CN": "zh-CHS",
             "zh-TW": "zh-CHT",
         }
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "microsoft"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["ar", "bg", "ca", "cs", "da", "de", "en",
-                "es", "et", "fi", "fr", "hi", "hu", "id",
-                "it", "ja", "ko", "lt", "lv", "mt",
-                "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl",
-                "sv", "th", "tr", "uk", "vi", "zh-CN", "zh-TW",
-                ]
-    
+        return [
+            "ar",
+            "bg",
+            "ca",
+            "cs",
+            "da",
+            "de",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "hi",
+            "hu",
+            "id",
+            "it",
+            "ja",
+            "ko",
+            "lt",
+            "lv",
+            "mt",
+            "nl",
+            "no",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sv",
+            "th",
+            "tr",
+            "uk",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
+
     def __mapLanguageCode(self, code):
         """
         Private method to map a language code to the Microsoft code.
-        
+
         @param code language code
         @type str
         @return mapped language code
@@ -78,11 +109,11 @@
             return self.__mapping[code]
         else:
             return code
-    
+
     def __getClientDataAzure(self):
         """
         Private method to retrieve the client data.
-        
+
         @return tuple giving the API subscription key, the API subscription
             region and a flag indicating validity
         @rtype tuple of (str, str, bool)
@@ -91,12 +122,13 @@
         subscriptionRegion = self.plugin.getPreferences("MsTranslatorRegion")
         valid = bool(subscriptionKey) and bool(subscriptionRegion)
         return subscriptionKey, subscriptionRegion, valid
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -108,27 +140,28 @@
         @return tuple of translated text and flag indicating success
         @rtype tuple of (str, bool)
         """
-        subscriptionKey, subscriptionRegion, valid = (
-            self.__getClientDataAzure()
-        )
+        subscriptionKey, subscriptionRegion, valid = self.__getClientDataAzure()
         if not valid:
-            return (self.tr("""You have not registered for the Microsoft"""
-                            """ Azure Translation service."""),
-                    False)
-        
+            return (
+                self.tr(
+                    """You have not registered for the Microsoft"""
+                    """ Azure Translation service."""
+                ),
+                False,
+            )
+
         params = "&from={0}&to={1}".format(
             self.__mapLanguageCode(originalLanguage),
             self.__mapLanguageCode(translationLanguage),
         )
         url = QUrl(self.TranslatorUrl + params)
-        
+
         requestList = [{"Text": text}]
         request = QByteArray(json.dumps(requestList).encode("utf-8"))
-        
+
         headers = [
             (b"Ocp-Apim-Subscription-Key", subscriptionKey.encode("utf8")),
-            (b"Ocp-Apim-Subscription-Region",
-             subscriptionRegion.encode("utf8")),
+            (b"Ocp-Apim-Subscription-Region", subscriptionRegion.encode("utf8")),
             (b"Content-Type", b"application/json; charset=UTF-8"),
             (b"Content-Length", str(len(request)).encode("utf-8")),
         ]
@@ -140,13 +173,11 @@
                 responseList = json.loads(response)
                 responseDict = responseList[0]
             except ValueError:
-                return (self.tr("MS Translator: Invalid response received"),
-                        False)
-            
+                return (self.tr("MS Translator: Invalid response received"), False)
+
             if "translations" not in responseDict:
-                return (self.tr("MS Translator: No translation available."),
-                        False)
-            
+                return (self.tr("MS Translator: No translation available."), False)
+
             result = ""
             translations = responseDict["translations"]
             for translation in translations:
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,50 +19,96 @@
     Class implementing the translation engine for the MyMemory
     translation service.
     """
+
     TranslatorUrl = "http://api.mymemory.translated.net/get"
     TranslatorLimit = 500
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "mymemory"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["ar", "be", "bg", "bs", "ca", "cs", "da", "de", "el", "en",
-                "es", "et", "fi", "fr", "ga", "gl", "hi", "hr", "hu", "id",
-                "is", "it", "iw", "ja", "ka", "ko", "lt", "lv", "mk", "mt",
-                "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl", "sq", "sr",
-                "sv", "th", "tl", "tr", "uk", "vi", "zh-CN", "zh-TW",
-                ]
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+        return [
+            "ar",
+            "be",
+            "bg",
+            "bs",
+            "ca",
+            "cs",
+            "da",
+            "de",
+            "el",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "ga",
+            "gl",
+            "hi",
+            "hr",
+            "hu",
+            "id",
+            "is",
+            "it",
+            "iw",
+            "ja",
+            "ka",
+            "ko",
+            "lt",
+            "lv",
+            "mk",
+            "mt",
+            "nl",
+            "no",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sq",
+            "sr",
+            "sv",
+            "th",
+            "tl",
+            "tr",
+            "uk",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -76,21 +122,21 @@
         """
         if len(text) > self.TranslatorLimit:
             return (
-                self.tr("MyMemory: Only texts up to {0} characters are"
-                        " allowed.")
-                .format(self.TranslatorLimit),
-                False
+                self.tr(
+                    "MyMemory: Only texts up to {0} characters are" " allowed."
+                ).format(self.TranslatorLimit),
+                False,
             )
-        
+
         myMemoryKey = self.plugin.getPreferences("MyMemoryKey")
         keyParam = "&key={0}".format(myMemoryKey) if myMemoryKey else ""
-        
+
         myMemoryEmail = self.plugin.getPreferences("MyMemoryEmail")
         emailParam = "&de={0}".format(myMemoryEmail) if myMemoryEmail else ""
-        
+
         params = "?of=json{3}{4}&langpair={0}|{1}&q={2}".format(
-            originalLanguage, translationLanguage, text,
-            keyParam, emailParam)
+            originalLanguage, translationLanguage, text, keyParam, emailParam
+        )
         url = QUrl(self.TranslatorUrl + params)
         response, ok = requestObject.get(url)
         if ok:
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,52 +16,53 @@
     """
     Class implementing the translation engine base class containing
     default methods.
-    
+
     @signal availableTranslationsLoaded() emitted to indicate the availability
         of the list of supported translation languages
     """
+
     availableTranslationsLoaded = pyqtSignal()
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.plugin = plugin
-    
+
     def engineName(self):
         """
         Public method to get the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return ""
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
         return []
-    
+
     def supportedTargetLanguages(self, original):
         """
         Public method to get a list of supported target languages for an
         original language.
-        
+
         Note: The default implementation return the list of supported languages
         (i.e. the same as those for the source) with the given original
         removed.
-        
+
         @param original original language
         @type str
         @return list of supported target languages for the given original
@@ -70,22 +71,22 @@
         targetLanguages = self.supportedLanguages()[:]
         with contextlib.suppress(ValueError):
             targetLanguages.remove(original)
-        
+
         return targetLanguages
-    
+
     def hasTTS(self):
         """
         Public method indicating the Text-to-Speech capability.
-        
+
         @return flag indicating the Text-to-Speech capability
         @rtype bool
         """
         return False
-    
+
     def getTextToSpeechData(self, requestObject, text, language):
         """
         Public method to pronounce the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be pronounced
@@ -96,12 +97,13 @@
         @rtype tuple of (QByteArray or str, bool)
         """
         return self.tr("No pronounce data available"), False
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,62 +21,110 @@
     Class implementing the translation engine for the Yandex
     translation service.
     """
+
     TranslatorUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate"
     TranslatorLimit = 10000
-    
+
     def __init__(self, plugin, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(plugin, parent)
-        
+
         self.__errors = {
             401: self.tr("Yandex: Invalid API key."),
             402: self.tr("Yandex: API key has been blocked."),
             403: self.tr("Yandex: Daily limit for requests has been reached."),
-            404: self.tr("Yandex: Daily limit for the volume of translated"
-                         " text reached."),
+            404: self.tr(
+                "Yandex: Daily limit for the volume of translated" " text reached."
+            ),
             413: self.tr("Yandex: Text size exceeds the maximum."),
             422: self.tr("Yandex: Text could not be translated."),
-            501: self.tr("Yandex: The specified translation direction is not"
-                         " supported."),
+            501: self.tr(
+                "Yandex: The specified translation direction is not" " supported."
+            ),
         }
-        
+
         QTimer.singleShot(0, self.availableTranslationsLoaded.emit)
-    
+
     def engineName(self):
         """
         Public method to return the name of the engine.
-        
+
         @return engine name
         @rtype str
         """
         return "yandex"
-    
+
     def supportedLanguages(self):
         """
         Public method to get the supported languages.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
-        return ["ar", "be", "bg", "bs", "ca", "cs", "da", "de", "el", "en",
-                "es", "et", "fi", "fr", "ga", "gl", "hi", "hr", "hu", "id",
-                "is", "it", "iw", "ja", "ka", "ko", "lt", "lv", "mk", "mt",
-                "nl", "no", "pl", "pt", "ro", "ru", "sk", "sl", "sq", "sr",
-                "sv", "th", "tl", "tr", "uk", "vi", "zh-CN", "zh-TW",
-                ]
-    
-    def getTranslation(self, requestObject, text, originalLanguage,
-                       translationLanguage):
+        return [
+            "ar",
+            "be",
+            "bg",
+            "bs",
+            "ca",
+            "cs",
+            "da",
+            "de",
+            "el",
+            "en",
+            "es",
+            "et",
+            "fi",
+            "fr",
+            "ga",
+            "gl",
+            "hi",
+            "hr",
+            "hu",
+            "id",
+            "is",
+            "it",
+            "iw",
+            "ja",
+            "ka",
+            "ko",
+            "lt",
+            "lv",
+            "mk",
+            "mt",
+            "nl",
+            "no",
+            "pl",
+            "pt",
+            "ro",
+            "ru",
+            "sk",
+            "sl",
+            "sq",
+            "sr",
+            "sv",
+            "th",
+            "tl",
+            "tr",
+            "uk",
+            "vi",
+            "zh-CN",
+            "zh-TW",
+        ]
+
+    def getTranslation(
+        self, requestObject, text, originalLanguage, translationLanguage
+    ):
         """
         Public method to translate the given text.
-        
+
         @param requestObject reference to the request object
         @type TranslatorRequest
         @param text text to be translated
@@ -90,22 +138,24 @@
         """
         if len(text) > self.TranslatorLimit:
             return (
-                self.tr("Yandex: Only texts up to {0} characters are allowed.")
-                .format(self.TranslatorLimit),
-                False
+                self.tr("Yandex: Only texts up to {0} characters are allowed.").format(
+                    self.TranslatorLimit
+                ),
+                False,
             )
-        
+
         apiKey = self.plugin.getPreferences("YandexKey")
         if not apiKey:
             return self.tr("Yandex: A valid key is required."), False
-        
+
         params = QByteArray(
             "key={0}&lang={1}-{2}&text=".format(
-                apiKey, originalLanguage, translationLanguage).encode("utf-8"))
-        encodedText = (
-            QByteArray(Utilities.html_encode(text).encode("utf-8"))
-            .toPercentEncoding()
+                apiKey, originalLanguage, translationLanguage
+            ).encode("utf-8")
         )
+        encodedText = QByteArray(
+            Utilities.html_encode(text).encode("utf-8")
+        ).toPercentEncoding()
         request = params + encodedText
         response, ok = requestObject.post(QUrl(self.TranslatorUrl), request)
         if ok:
@@ -113,7 +163,7 @@
                 responseDict = json.loads(response)
             except ValueError:
                 return self.tr("Yandex: Invalid response received"), False
-            
+
             if responseDict["code"] != 200:
                 try:
                     error = self.__errors[responseDict["code"]]
@@ -122,7 +172,7 @@
                         "Yandex: Unknown error code ({0}) received."
                     ).format(responseDict["code"])
                 return error, False
-            
+
             sentences = responseDict["text"]
             result = ""
             for sentence in sentences:
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,12 +20,17 @@
 def supportedEngineNames():
     """
     Module function to get the list of supported translation engines.
-    
+
     @return names of supported engines
     @rtype list of str
     """
     return [
-        "deepl", "googlev1", "googlev2", "ibm_watson", "microsoft", "mymemory",
+        "deepl",
+        "googlev1",
+        "googlev2",
+        "ibm_watson",
+        "microsoft",
+        "mymemory",
         "yandex",
     ]
 
@@ -33,39 +38,32 @@
 def engineDisplayName(name):
     """
     Module function to get a translated name for an engine.
-    
+
     @param name name of a translation engine
     @type str
     @return translated engine name
     @rtype str
     """
     return {
-        "deepl":
-            QCoreApplication.translate("TranslatorEngines", "DeepL"),
-        "googlev1":
-            QCoreApplication.translate("TranslatorEngines", "Google V.1"),
-        "googlev2":
-            QCoreApplication.translate("TranslatorEngines", "Google V.2"),
-        "ibm_watson":
-            QCoreApplication.translate("TranslatorEngines", "IBM Watson"),
-        "microsoft":
-            QCoreApplication.translate("TranslatorEngines", "Microsoft"),
-        "mymemory":
-            QCoreApplication.translate("TranslatorEngines", "MyMemory"),
-        "yandex":
-            QCoreApplication.translate("TranslatorEngines", "Yandex"),
+        "deepl": QCoreApplication.translate("TranslatorEngines", "DeepL"),
+        "googlev1": QCoreApplication.translate("TranslatorEngines", "Google V.1"),
+        "googlev2": QCoreApplication.translate("TranslatorEngines", "Google V.2"),
+        "ibm_watson": QCoreApplication.translate("TranslatorEngines", "IBM Watson"),
+        "microsoft": QCoreApplication.translate("TranslatorEngines", "Microsoft"),
+        "mymemory": QCoreApplication.translate("TranslatorEngines", "MyMemory"),
+        "yandex": QCoreApplication.translate("TranslatorEngines", "Yandex"),
     }.get(
         name,
         QCoreApplication.translate(
             "TranslatorEngines", "Unknow translation service name ({0})"
-        ).format(name)
+        ).format(name),
     )
 
 
 def getTranslationEngine(name, plugin, parent=None):
     """
     Module function to instantiate an engine object for the named service.
-    
+
     @param name name of the online translation service
     @type str
     @param plugin reference to the plugin object
@@ -77,24 +75,31 @@
     """
     if name == "deepl":
         from .DeepLEngine import DeepLEngine
+
         engine = DeepLEngine(plugin, parent)
     elif name == "googlev1":
         from .GoogleV1Engine import GoogleV1Engine
+
         engine = GoogleV1Engine(plugin, parent)
     elif name == "googlev2":
         from .GoogleV2Engine import GoogleV2Engine
+
         engine = GoogleV2Engine(plugin, parent)
     elif name == "ibm_watson":
         from .IbmWatsonEngine import IbmWatsonEngine
+
         engine = IbmWatsonEngine(plugin, parent)
     elif name == "microsoft":
         from .MicrosoftEngine import MicrosoftEngine
+
         engine = MicrosoftEngine(plugin, parent)
     elif name == "mymemory":
         from .MyMemoryEngine import MyMemoryEngine
+
         engine = MyMemoryEngine(plugin, parent)
     elif name == "yandex":
         from .YandexEngine import YandexEngine
+
         engine = YandexEngine(plugin, parent)
     else:
         engine = None
@@ -104,7 +109,7 @@
 def getEngineIcon(name):
     """
     Module function to get the icon of the named engine.
-    
+
     @param name name of the translation engine
     @type str
     @return engine icon
@@ -112,14 +117,26 @@
     """
     iconSuffix = "dark" if ericApp().usesDarkPalette() else "light"
     if name in supportedEngineNames():
-        icon = UI.PixmapCache.getIcon(os.path.join(
-            os.path.dirname(__file__), "..", "icons", "engines",
-            "{0}-{1}".format(name, iconSuffix)))
+        icon = UI.PixmapCache.getIcon(
+            os.path.join(
+                os.path.dirname(__file__),
+                "..",
+                "icons",
+                "engines",
+                "{0}-{1}".format(name, iconSuffix),
+            )
+        )
         if icon.isNull():
             # try variant without suffix
-            icon = UI.PixmapCache.getIcon(os.path.join(
-                os.path.dirname(__file__), "..", "icons", "engines",
-                "{0}".format(name)))
+            icon = UI.PixmapCache.getIcon(
+                os.path.join(
+                    os.path.dirname(__file__),
+                    "..",
+                    "icons",
+                    "engines",
+                    "{0}".format(name),
+                )
+            )
         return icon
     else:
         return QIcon()
@@ -128,23 +145,17 @@
 def getKeyUrl(name):
     """
     Module function to get an URL to request a user key.
-    
+
     @param name name of the online translation service
     @type str
     @return key request URL
     @rtype str
     """
     return {
-        "deepl":
-            "https://www.deepl.com/de/pro-api",
-        "googlev2":
-            "https://console.developers.google.com/",
-        "ibm_watson":
-            "https://www.ibm.com/watson/services/language-translator/",
-        "microsoft":
-            "https://portal.azure.com",
-        "mymemory":
-            "http://mymemory.translated.net/doc/keygen.php",
-        "yandex":
-            "http://api.yandex.com/key/form.xml?service=trnsl",
+        "deepl": "https://www.deepl.com/de/pro-api",
+        "googlev2": "https://console.developers.google.com/",
+        "ibm_watson": "https://www.ibm.com/watson/services/language-translator/",
+        "microsoft": "https://portal.azure.com",
+        "mymemory": "http://mymemory.translated.net/doc/keygen.php",
+        "yandex": "http://api.yandex.com/key/form.xml?service=trnsl",
     }.get(name, "")
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorLanguagesDb.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorLanguagesDb.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,15 +18,16 @@
     """
     Class implementing the translation languages database.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__languages = {
             "af": self.tr("Afrikaans"),
             "ar": self.tr("Arabic"),
@@ -80,7 +81,7 @@
             "zh-CN": self.tr("Chinese (China)"),
             "zh-TW": self.tr("Chinese (Taiwan)"),
         }
-        
+
         self.__toThreeCharacterCode = {
             "af": "afr",
             "ar": "ara",
@@ -134,24 +135,26 @@
             "zh-CN": "zho",
             "zh-TW": "zho",
         }
-    
+
     def getLanguageIcon(self, code):
         """
         Public method to get a language icon.
-        
+
         @param code language code
         @type str
         @return language icon
         @rtype QIcon
         """
-        return UI.PixmapCache.getIcon(os.path.join(
-            os.path.dirname(__file__), "icons", "flags",
-            "{0}".format(code)))
-    
+        return UI.PixmapCache.getIcon(
+            os.path.join(
+                os.path.dirname(__file__), "icons", "flags", "{0}".format(code)
+            )
+        )
+
     def getLanguage(self, code):
         """
         Public method to get a translated language.
-        
+
         @param code language code
         @type str
         @return translated language
@@ -161,21 +164,21 @@
             return self.__languages[code]
         except KeyError:
             return ""
-    
+
     def getAllLanguages(self):
         """
         Public method to get a list of the supported language codes.
-        
+
         @return list of supported language codes
         @rtype list of str
         """
         return list(self.__languages.keys())
-    
+
     def convertTwoToThree(self, code):
         """
         Public method to convert a two character language code to a
         thre character code.
-        
+
         @param code two character language code
         @type str
         @return three character language code
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 """
 
 from PyQt6.QtCore import QObject, QEventLoop, QByteArray
-from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply
-)
+from PyQt6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
 
 from EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired
 
@@ -21,31 +19,33 @@
     Class implementing a synchronous network request handler for translation
     requests.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__contentTypes = {
             "form": b"application/x-www-form-urlencoded",
             "json": b"application/json",
         }
-        
+
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
-        
+            proxyAuthenticationRequired
+        )
+
         self.__loop = QEventLoop()
         self.__networkManager.finished.connect(self.__loop.quit)
-    
+
     def get(self, requestUrl, extraHeaders=None):
         """
         Public method to issue a GET request.
-        
+
         @param requestUrl URL of the request
         @type QUrl
         @param extraHeaders list of tuples of additional headers giving
@@ -65,12 +65,11 @@
             return reply.errorString(), False
         else:
             return reply.readAll(), True
-    
-    def post(self, requestUrl, requestData, dataType="form",
-             extraHeaders=None):
+
+    def post(self, requestUrl, requestData, dataType="form", extraHeaders=None):
         """
         Public method to issue a POST request.
-        
+
         @param requestUrl URL of the request
         @type QUrl
         @param requestData data of the request
@@ -85,12 +84,9 @@
         @rtype tuple of (str, bool)
         """
         request = QNetworkRequest(requestUrl)
-        request.setRawHeader(b"User-Agent",
-                             b"Mozilla/5.0")
-        request.setRawHeader(b"Content-Type",
-                             self.__contentTypes[dataType])
-        request.setRawHeader(b"Content-Length",
-                             QByteArray.number(requestData.size()))
+        request.setRawHeader(b"User-Agent", b"Mozilla/5.0")
+        request.setRawHeader(b"Content-Type", self.__contentTypes[dataType])
+        request.setRawHeader(b"Content-Length", QByteArray.number(requestData.size()))
         if extraHeaders:
             for name, value in extraHeaders:
                 request.setRawHeader(name, value)
--- a/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,10 @@
 
 from PyQt6.QtCore import pyqtSlot, QTemporaryFile
 from PyQt6.QtWidgets import QWidget
+
 try:
     from PyQt6.QtMultimedia import QMediaFormat, QMediaPlayer, QAudioOutput
+
     MULTIMEDIA_AVAILABLE = True
 except ImportError:
     MULTIMEDIA_AVAILABLE = False
@@ -30,10 +32,11 @@
     """
     Class implementing the translator widget.
     """
+
     def __init__(self, plugin, translator, parent=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @type TranslatorPlugin
         @param translator reference to the translator object
@@ -43,57 +46,53 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__plugin = plugin
         self.__translator = translator
-        
+
         self.__languages = TranslatorLanguagesDb(self)
-        
+
         self.__translatorRequest = None
         self.__translationEngine = None
-        
+
         self.__audioOutput = None
         self.__mediaPlayer = None
         self.__mediaFile = None
-        
+
         audioAvailable = False
         if MULTIMEDIA_AVAILABLE:
             mediaFormat = QMediaFormat()
             audioAvailable = (
-                QMediaFormat.AudioCodec.MP3 in
-                mediaFormat.supportedAudioCodecs(
-                    QMediaFormat.ConversionMode.Decode)
+                QMediaFormat.AudioCodec.MP3
+                in mediaFormat.supportedAudioCodecs(QMediaFormat.ConversionMode.Decode)
             )
         self.pronounceOrigButton.setVisible(audioAvailable)
         self.pronounceTransButton.setVisible(audioAvailable)
-        
-        self.pronounceOrigButton.setIcon(
-            self.__translator.getAppIcon("pronounce"))
-        self.pronounceTransButton.setIcon(
-            self.__translator.getAppIcon("pronounce"))
-        self.swapButton.setIcon(
-            self.__translator.getAppIcon("swap"))
-        self.translateButton.setIcon(
-            self.__translator.getAppIcon("translate"))
+
+        self.pronounceOrigButton.setIcon(self.__translator.getAppIcon("pronounce"))
+        self.pronounceTransButton.setIcon(self.__translator.getAppIcon("pronounce"))
+        self.swapButton.setIcon(self.__translator.getAppIcon("swap"))
+        self.translateButton.setIcon(self.__translator.getAppIcon("translate"))
         self.clearButton.setIcon(UI.PixmapCache.getIcon("editDelete"))
         self.preferencesButton.setIcon(UI.PixmapCache.getIcon("configure"))
-        
+
         self.translateButton.setEnabled(False)
         self.clearButton.setEnabled(False)
         self.pronounceOrigButton.setEnabled(False)
         self.pronounceTransButton.setEnabled(False)
-        
+
         selectedEngine = self.__plugin.getPreferences("SelectedEngine")
-        
+
         self.__updateEngines()
         engineIndex = self.engineComboBox.findData(selectedEngine)
         self.engineComboBox.setCurrentIndex(engineIndex)
         self.__engineComboBoxCurrentIndexChanged(engineIndex)
-        
+
         self.engineComboBox.currentIndexChanged.connect(
-            self.__engineComboBoxCurrentIndexChanged)
+            self.__engineComboBoxCurrentIndexChanged
+        )
         self.__plugin.updateLanguages.connect(self.__updateLanguages)
-    
+
     def __updateLanguages(self):
         """
         Private slot to update the language combo boxes.
@@ -102,11 +101,12 @@
         if self.__translationEngine is not None:
             supportedCodes = self.__translationEngine.supportedLanguages()
             enabledCodes = self.__plugin.getPreferences("EnabledLanguages")
-            
+
             # 1. save current selections
             origLanguage = self.origLanguageComboBox.itemData(
-                self.origLanguageComboBox.currentIndex())
-            
+                self.origLanguageComboBox.currentIndex()
+            )
+
             # 2. reload the original language combo box
             self.origLanguageComboBox.blockSignals(True)
             self.origLanguageComboBox.clear()
@@ -115,52 +115,50 @@
                     language = self.__languages.getLanguage(code)
                     if language:
                         icon = self.__languages.getLanguageIcon(code)
-                        self.origLanguageComboBox.addItem(
-                            icon, language, code)
+                        self.origLanguageComboBox.addItem(icon, language, code)
             self.origLanguageComboBox.model().sort(0)
             origIndex = self.origLanguageComboBox.findData(origLanguage)
             if origIndex == -1:
                 origIndex = 0
             self.origLanguageComboBox.blockSignals(False)
             self.origLanguageComboBox.setCurrentIndex(origIndex)
-    
+
     def __updateEngines(self):
         """
         Private slot to update the engines combo box.
         """
-        currentEngine = self.engineComboBox.itemData(
-            self.engineComboBox.currentIndex())
+        currentEngine = self.engineComboBox.itemData(self.engineComboBox.currentIndex())
         self.engineComboBox.clear()
         for engineName in TranslatorEngines.supportedEngineNames():
             icon = TranslatorEngines.getEngineIcon(engineName)
             self.engineComboBox.addItem(
-                icon,
-                TranslatorEngines.engineDisplayName(engineName),
-                engineName)
+                icon, TranslatorEngines.engineDisplayName(engineName), engineName
+            )
         self.engineComboBox.model().sort(0)
-        self.engineComboBox.setCurrentIndex(
-            self.engineComboBox.findData(currentEngine))
-    
+        self.engineComboBox.setCurrentIndex(self.engineComboBox.findData(currentEngine))
+
     def __originalLanguage(self):
         """
         Private method to return the code of the selected original language.
-        
+
         @return code of the original language
         @rtype str
         """
         return self.origLanguageComboBox.itemData(
-            self.origLanguageComboBox.currentIndex())
-    
+            self.origLanguageComboBox.currentIndex()
+        )
+
     def __translationLanguage(self):
         """
         Private method to return the code of the selected translation language.
-        
+
         @return code of the translation language
         @rtype str
         """
         return self.transLanguageComboBox.itemData(
-            self.transLanguageComboBox.currentIndex())
-    
+            self.transLanguageComboBox.currentIndex()
+        )
+
     @pyqtSlot()
     def on_translateButton_clicked(self):
         """
@@ -170,31 +168,27 @@
         result, ok = self.__translate(
             self.origEdit.toPlainText(),
             self.__originalLanguage(),
-            self.__translationLanguage())
+            self.__translationLanguage(),
+        )
         if ok:
             self.transEdit.setHtml(result)
         else:
-            EricMessageBox.critical(
-                self,
-                self.tr("Translation Error"),
-                result)
-    
+            EricMessageBox.critical(self, self.tr("Translation Error"), result)
+
     @pyqtSlot()
     def on_pronounceOrigButton_clicked(self):
         """
         Private slot to pronounce the original text.
         """
-        self.__pronounce(
-            self.origEdit.toPlainText(), self.__originalLanguage())
-    
+        self.__pronounce(self.origEdit.toPlainText(), self.__originalLanguage())
+
     @pyqtSlot()
     def on_pronounceTransButton_clicked(self):
         """
         Private slot to pronounce the translated text.
         """
-        self.__pronounce(
-            self.transEdit.toPlainText(), self.__translationLanguage())
-    
+        self.__pronounce(self.transEdit.toPlainText(), self.__translationLanguage())
+
     @pyqtSlot()
     def on_swapButton_clicked(self):
         """
@@ -202,25 +196,27 @@
         """
         # save selected language codes
         oLanguage = self.origLanguageComboBox.itemData(
-            self.origLanguageComboBox.currentIndex())
-        
+            self.origLanguageComboBox.currentIndex()
+        )
+
         tLanguage = self.transLanguageComboBox.itemData(
-            self.transLanguageComboBox.currentIndex())
-        
+            self.transLanguageComboBox.currentIndex()
+        )
+
         oIdx = self.origLanguageComboBox.findData(tLanguage)
         if oIdx < 0:
             oIdx = 0
         self.origLanguageComboBox.setCurrentIndex(oIdx)
-        
+
         tIdx = self.transLanguageComboBox.findData(oLanguage)
         if tIdx < 0:
             tIdx = 0
         self.transLanguageComboBox.setCurrentIndex(tIdx)
-        
+
         origText = self.origEdit.toPlainText()
         self.origEdit.setPlainText(self.transEdit.toPlainText())
         self.transEdit.setPlainText(origText)
-    
+
     @pyqtSlot()
     def on_clearButton_clicked(self):
         """
@@ -228,7 +224,7 @@
         """
         self.origEdit.clear()
         self.transEdit.clear()
-    
+
     @pyqtSlot()
     def on_origEdit_textChanged(self):
         """
@@ -237,7 +233,7 @@
         self.__updatePronounceButtons()
         self.__updateClearButton()
         self.__updateTranslateButton()
-    
+
     @pyqtSlot()
     def on_transEdit_textChanged(self):
         """
@@ -245,27 +241,27 @@
         """
         self.__updatePronounceButtons()
         self.__updateClearButton()
-    
+
     @pyqtSlot(int)
     def on_origLanguageComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of the original language.
-        
+
         @param index current index
         @type int
         """
         self.__plugin.setPreferences(
-            "OriginalLanguage", self.origLanguageComboBox.itemData(index))
-        
-        supportedTargetCodes = (
-            self.__translationEngine.supportedTargetLanguages(
-                self.origLanguageComboBox.itemData(index)
-            )
+            "OriginalLanguage", self.origLanguageComboBox.itemData(index)
+        )
+
+        supportedTargetCodes = self.__translationEngine.supportedTargetLanguages(
+            self.origLanguageComboBox.itemData(index)
         )
         if supportedTargetCodes is not None:
             enabledCodes = self.__plugin.getPreferences("EnabledLanguages")
             transLanguage = self.transLanguageComboBox.itemData(
-                self.transLanguageComboBox.currentIndex())
+                self.transLanguageComboBox.currentIndex()
+            )
             self.transLanguageComboBox.clear()
             if len(supportedTargetCodes) > 0:
                 for code in enabledCodes:
@@ -273,27 +269,27 @@
                         language = self.__languages.getLanguage(code)
                         if language:
                             icon = self.__languages.getLanguageIcon(code)
-                            self.transLanguageComboBox.addItem(
-                                icon, language, code)
+                            self.transLanguageComboBox.addItem(icon, language, code)
                 self.transLanguageComboBox.model().sort(0)
                 index = self.transLanguageComboBox.findData(transLanguage)
                 if index == -1:
                     index = 0
                 self.transLanguageComboBox.setCurrentIndex(index)
-        
+
         self.__updateTranslateButton()
-    
+
     @pyqtSlot(int)
     def on_transLanguageComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of the translation language.
-        
+
         @param index current index
         @type int
         """
         self.__plugin.setPreferences(
-            "TranslationLanguage", self.transLanguageComboBox.itemData(index))
-    
+            "TranslationLanguage", self.transLanguageComboBox.itemData(index)
+        )
+
     @pyqtSlot()
     def __availableTranslationsLoaded(self):
         """
@@ -301,43 +297,46 @@
         """
         origLanguage = self.__plugin.getPreferences("OriginalLanguage")
         transLanguage = self.__plugin.getPreferences("TranslationLanguage")
-        
+
         self.__updateLanguages()
-        
+
         origIndex = self.origLanguageComboBox.findData(origLanguage)
         self.origLanguageComboBox.setCurrentIndex(origIndex)
         self.on_origLanguageComboBox_currentIndexChanged(origIndex)
         self.transLanguageComboBox.setCurrentIndex(
-            self.transLanguageComboBox.findData(transLanguage))
-    
+            self.transLanguageComboBox.findData(transLanguage)
+        )
+
     def __ensureTranslationEngineReady(self):
         """
         Private slot to ensure, that the currently selected translation engine
         is ready.
         """
-        engineName = self.engineComboBox.itemData(
-            self.engineComboBox.currentIndex())
+        engineName = self.engineComboBox.itemData(self.engineComboBox.currentIndex())
         if (
-            self.__translationEngine is not None and
-            self.__translationEngine.engineName() != engineName
+            self.__translationEngine is not None
+            and self.__translationEngine.engineName() != engineName
         ):
             self.__translationEngine.availableTranslationsLoaded.disconnect(
-                self.__availableTranslationsLoaded)
+                self.__availableTranslationsLoaded
+            )
             self.__translationEngine.deleteLater()
             self.__translationEngine = None
-        
+
         if self.__translationEngine is None:
             self.__translationEngine = TranslatorEngines.getTranslationEngine(
-                engineName, self.__plugin, self)
+                engineName, self.__plugin, self
+            )
             if self.__translationEngine is not None:
                 self.__translationEngine.availableTranslationsLoaded.connect(
-                    self.__availableTranslationsLoaded)
-    
+                    self.__availableTranslationsLoaded
+                )
+
     @pyqtSlot(int)
     def __engineComboBoxCurrentIndexChanged(self, index):
         """
         Private slot to handle the selection of a translation service.
-        
+
         @param index current index
         @type int
         """
@@ -345,30 +344,30 @@
         if self.__translationEngine is not None:
             self.__updateTranslateButton()
             self.__updatePronounceButtons()
-            
+
             self.__plugin.setPreferences(
-                "SelectedEngine", self.engineComboBox.itemData(index))
-    
+                "SelectedEngine", self.engineComboBox.itemData(index)
+            )
+
     def __updatePronounceButtons(self):
         """
         Private slot to set the state of the pronounce buttons.
         """
         hasTTS = self.__translationEngine and self.__translationEngine.hasTTS()
         self.pronounceOrigButton.setEnabled(
-            hasTTS and bool(self.origEdit.toPlainText()))
+            hasTTS and bool(self.origEdit.toPlainText())
+        )
         self.pronounceTransButton.setEnabled(
-            hasTTS and bool(self.transEdit.toPlainText()))
-    
+            hasTTS and bool(self.transEdit.toPlainText())
+        )
+
     def __updateClearButton(self):
         """
         Private slot to set the state of the clear button.
         """
-        enable = (
-            bool(self.origEdit.toPlainText()) or
-            bool(self.transEdit.toPlainText())
-        )
+        enable = bool(self.origEdit.toPlainText()) or bool(self.transEdit.toPlainText())
         self.clearButton.setEnabled(enable)
-    
+
     def __updateTranslateButton(self):
         """
         Private slot to set the state of the translate button.
@@ -377,11 +376,11 @@
         enable &= bool(self.__translationLanguage())
         enable &= bool(self.__originalLanguage())
         self.translateButton.setEnabled(enable)
-    
+
     def __translate(self, text, originalLanguage, translationLanguage):
         """
         Private method to translate the given text.
-        
+
         @param text text to be translated
         @type str
         @param originalLanguage language code of the original
@@ -393,22 +392,23 @@
         """
         if self.__translatorRequest is None:
             from .TranslatorRequest import TranslatorRequest
+
             self.__translatorRequest = TranslatorRequest(self)
-        
+
         self.__ensureTranslationEngineReady()
         if self.__translationEngine is None:
             return "", False
         else:
             result, ok = self.__translationEngine.getTranslation(
-                self.__translatorRequest, text, originalLanguage,
-                translationLanguage)
-            
+                self.__translatorRequest, text, originalLanguage, translationLanguage
+            )
+
             return result, ok
-    
+
     def __pronounce(self, text, language):
         """
         Private method to pronounce the given text.
-        
+
         @param text text to be pronounced
         @type str
         @param language language code of the text
@@ -416,60 +416,64 @@
         """
         if not text or not language:
             return
-        
+
         if self.__translatorRequest is None:
             from .TranslatorRequest import TranslatorRequest
+
             self.__translatorRequest = TranslatorRequest(self)
-        
+
         if self.__mediaPlayer is None:
             self.__mediaPlayer = QMediaPlayer(self)
             self.__audioOutput = QAudioOutput(self)
             self.__mediaPlayer.setAudioOutput(self.__audioOutput)
-            
+
             self.__mediaPlayer.playbackStateChanged.connect(
-                self.__mediaPlayerPlaybackStateChanged)
-            self.__mediaPlayer.errorOccurred.connect(
-                self.__mediaPlayerError)
-        
+                self.__mediaPlayerPlaybackStateChanged
+            )
+            self.__mediaPlayer.errorOccurred.connect(self.__mediaPlayerError)
+
         if (
-            self.__mediaPlayer.playbackState() ==
-            QMediaPlayer.PlaybackState.PlayingState
+            self.__mediaPlayer.playbackState()
+            == QMediaPlayer.PlaybackState.PlayingState
         ):
             return
-        
+
         self.__ensureTranslationEngineReady()
         if self.__translationEngine is not None:
             if not self.__translationEngine.hasTTS():
                 EricMessageBox.critical(
                     self,
                     self.tr("Translation Error"),
-                    self.tr("The selected translation service does not"
-                            " support the Text-to-Speech function."))
+                    self.tr(
+                        "The selected translation service does not"
+                        " support the Text-to-Speech function."
+                    ),
+                )
                 return
-            
+
             data, ok = self.__translationEngine.getTextToSpeechData(
-                self.__translatorRequest, text, language)
+                self.__translatorRequest, text, language
+            )
             if ok:
                 self.__mediaFile = QTemporaryFile(self)
                 self.__mediaFile.open()
                 self.__mediaFile.setAutoRemove(False)
                 self.__mediaFile.write(data)
                 self.__mediaFile.close()
-                
+
                 from PyQt6.QtCore import QUrl
+
                 self.__mediaPlayer.setSource(
-                    QUrl.fromLocalFile(self.__mediaFile.fileName()))
+                    QUrl.fromLocalFile(self.__mediaFile.fileName())
+                )
                 self.__mediaPlayer.play()
             else:
-                EricMessageBox.critical(
-                    self,
-                    self.tr("Translation Error"),
-                    data)
-    
+                EricMessageBox.critical(self, self.tr("Translation Error"), data)
+
     def __mediaPlayerPlaybackStateChanged(self, state):
         """
         Private slot handling changes of the media player state.
-        
+
         @param state media player state
         @type QMediaPlayer.PlaybackState
         """
@@ -477,11 +481,11 @@
             self.__mediaFile.close()
             self.__mediaFile.remove()
             self.__mediaFile = None
-    
+
     def __mediaPlayerError(self, error, errorString):
         """
         Private slot to handle errors during playback of the data.
-        
+
         @param error media player error condition
         @type QMediaPlayer.Error
         @param errorString string representation for the error
@@ -491,10 +495,12 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Error playing pronunciation"),
-                self.tr("<p>The received pronunciation could not be played."
-                        "</p><p>Reason: {0}</p>").format(errorString)
+                self.tr(
+                    "<p>The received pronunciation could not be played."
+                    "</p><p>Reason: {0}</p>"
+                ).format(errorString),
             )
-    
+
     @pyqtSlot()
     def on_preferencesButton_clicked(self):
         """
--- a/src/eric7/Plugins/UiExtensionPlugins/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/UiExtensionPlugins/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
- 
+
 # Copyright (c) 2017 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
 #
- 
+
 """
 Package containing the various interface extension plug-ins.
 """
--- a/src/eric7/Plugins/VcsPlugins/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
- 
+
 # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
 #
- 
+
 """
 Package containing the various version control system plugins.
 """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,13 +9,13 @@
 
 # Available protocols for the repository URL
 ConfigGitSchemes = [
-    'file',
-    'ftp',
-    'ftps',
-    'git',
-    'http',
-    'https',
-    'rsync',
-    'ssh',
-    'ssh+scp',
+    "file",
+    "ftp",
+    "ftps",
+    "git",
+    "http",
+    "https",
+    "rsync",
+    "ssh",
+    "ssh+scp",
 ]
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,9 +14,7 @@
 from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtWidgets import QDialog
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_GitPage import Ui_GitPage
 
 
@@ -24,72 +22,72 @@
     """
     Class implementing the Git configuration page.
     """
+
     def __init__(self, plugin):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("GitPage")
-        
+
         self.__plugin = plugin
-        
+
         # set initial values
         # log
-        self.logSpinBox.setValue(
-            self.__plugin.getPreferences("LogLimit"))
+        self.logSpinBox.setValue(self.__plugin.getPreferences("LogLimit"))
         self.logWidthSpinBox.setValue(
-            self.__plugin.getPreferences("LogSubjectColumnWidth"))
+            self.__plugin.getPreferences("LogSubjectColumnWidth")
+        )
         self.findHarderCheckBox.setChecked(
-            self.__plugin.getPreferences("FindCopiesHarder"))
+            self.__plugin.getPreferences("FindCopiesHarder")
+        )
         # commit
-        self.commitIdSpinBox.setValue(
-            self.__plugin.getPreferences("CommitIdLength"))
+        self.commitIdSpinBox.setValue(self.__plugin.getPreferences("CommitIdLength"))
         # cleanup
-        self.cleanupPatternEdit.setText(
-            self.__plugin.getPreferences("CleanupPatterns"))
+        self.cleanupPatternEdit.setText(self.__plugin.getPreferences("CleanupPatterns"))
         # repository optimization
-        self.aggressiveCheckBox.setChecked(
-            self.__plugin.getPreferences("AggressiveGC"))
-    
+        self.aggressiveCheckBox.setChecked(self.__plugin.getPreferences("AggressiveGC"))
+
     def save(self):
         """
         Public slot to save the Git configuration.
         """
         # log
+        self.__plugin.setPreferences("LogLimit", self.logSpinBox.value())
         self.__plugin.setPreferences(
-            "LogLimit", self.logSpinBox.value())
-        self.__plugin.setPreferences(
-            "LogSubjectColumnWidth", self.logWidthSpinBox.value())
+            "LogSubjectColumnWidth", self.logWidthSpinBox.value()
+        )
         self.__plugin.setPreferences(
-            "FindCopiesHarder", self.findHarderCheckBox.isChecked())
+            "FindCopiesHarder", self.findHarderCheckBox.isChecked()
+        )
         # commit
-        self.__plugin.setPreferences(
-            "CommitIdLength", self.commitIdSpinBox.value())
+        self.__plugin.setPreferences("CommitIdLength", self.commitIdSpinBox.value())
         # cleanup
-        self.__plugin.setPreferences(
-            "CleanupPatterns", self.cleanupPatternEdit.text())
+        self.__plugin.setPreferences("CleanupPatterns", self.cleanupPatternEdit.text())
         # repository optimization
         self.__plugin.setPreferences(
-            "AggressiveGC", self.aggressiveCheckBox.isChecked())
-    
+            "AggressiveGC", self.aggressiveCheckBox.isChecked()
+        )
+
     @pyqtSlot()
     def on_configButton_clicked(self):
         """
         Private slot to edit the (per user) Git configuration file.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         cfgFile = self.__plugin.getConfigPath()
         if not os.path.exists(cfgFile):
             from ..GitUserConfigDataDialog import GitUserConfigDataDialog
+
             dlg = GitUserConfigDataDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 firstName, lastName, email = dlg.getData()
             else:
-                firstName, lastName, email = (
-                    "Firstname", "Lastname", "email_address")
+                firstName, lastName, email = ("Firstname", "Lastname", "email_address")
             with contextlib.suppress(OSError), open(cfgFile, "w") as f:
                 f.write("[user]\n")
                 f.write("    name = {0} {1}\n".format(firstName, lastName))
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitAddRemoteDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitAddRemoteDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,63 +17,64 @@
     """
     Class implementing a dialog to enter the data of a remote repository.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__updateOK()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method to update the status of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.nameEdit.text() != "" and
-            self.urlEdit.text() != "")
-    
+            self.nameEdit.text() != "" and self.urlEdit.text() != ""
+        )
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered name.
-        
+
         @param txt current text
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_urlEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered URL.
-        
+
         @param txt current text
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_userEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered user name.
-        
+
         @param txt current text
         @type str
         """
         self.passwordEdit.setEnabled(bool(txt))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with name and URL of the remote repository
         @rtype tuple of (str, str)
         """
@@ -84,5 +85,5 @@
             password = self.passwordEdit.text()
             if password:
                 url.setPassword(password)
-        
+
         return self.nameEdit.text(), url.toString()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitApplyBundleDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitApplyBundleDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter the data for applying a bundle.
     """
+
     def __init__(self, bundleHeads, branches, parent=None):
         """
         Constructor
-        
+
         @param bundleHeads list of heads contained in a bundle
             (list of strings)
         @param branches list of available branch names (list of strings)
@@ -27,14 +28,14 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.headCombo.addItems(sorted(bundleHeads))
         self.branchCombo.addItems([""] + sorted(branches))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with the bundle head (string) and the local branch
             name (string)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitArchiveDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitArchiveDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,10 +25,11 @@
     Class implementing a dialog to enter the data for the creation of an
     archive.
     """
+
     def __init__(self, tagsList, branchesList, formatsList, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
         @param formatsList list of archive formats (list of strings)
@@ -36,21 +37,19 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
+
         self.fileButton.setIcon(UI.PixmapCache.getIcon("open"))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["master"] + sorted(branchesList))
         self.formatComboBox.addItems(sorted(formatsList))
-        self.formatComboBox.setCurrentIndex(
-            self.formatComboBox.findText("zip"))
-        
+        self.formatComboBox.setCurrentIndex(self.formatComboBox.findText("zip"))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -62,21 +61,20 @@
             enabled = self.tagCombo.currentText() != ""
         elif self.branchButton.isChecked():
             enabled = self.branchCombo.currentText() != ""
-        
+
         enabled &= bool(self.fileEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(str)
     def on_fileEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the file edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_fileButton_clicked(self):
         """
@@ -86,73 +84,74 @@
             self,
             self.tr("Select Archive File"),
             Utilities.fromNativeSeparators(self.fileEdit.text()),
-            "")
-            
+            "",
+        )
+
         if fileName:
             root, ext = os.path.splitext(fileName)
             if not ext:
                 ext = "." + self.formatComboBox.currentText()
             fileName = root + ext
             self.fileEdit.setText(Utilities.toNativeSeparators(fileName))
-    
+
     @pyqtSlot(bool)
     def on_revButton_toggled(self, checked):
         """
         Private slot to handle changes of the rev select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_revEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the rev edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tagButton_toggled(self, checked):
         """
         Private slot to handle changes of the Tag select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple of selected revision (string), archive format (string),
             archive file (string) and prefix (string)
         """
@@ -164,8 +163,10 @@
             rev = self.branchCombo.currentText()
         else:
             rev = "HEAD"
-        
-        return (rev, self.formatComboBox.currentText(),
-                Utilities.toNativeSeparators(self.fileEdit.text()),
-                self.prefixEdit.text()
-                )
+
+        return (
+            rev,
+            self.formatComboBox.currentText(),
+            Utilities.toNativeSeparators(self.fileEdit.text()),
+            self.prefixEdit.text(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectLogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectLogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint, QProcess, QTimer
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QApplication,
-    QLineEdit
+    QWidget,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,72 +32,71 @@
     """
     Class implementing a dialog to browse the bisect log history.
     """
+
     CommitIdColumn = 0
     OperationColumn = 1
     SubjectColumn = 2
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__position = QPoint()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.logTree.headerItem().setText(self.logTree.columnCount(), "")
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of commits"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of commits"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
-        
+
         self.repodir = ""
         self.__currentCommitId = ""
-        
+
         self.__initData()
         self.__resetUI()
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
         """
-        self.buf = []        # buffer for stdout
-    
+        self.buf = []  # buffer for stdout
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -101,27 +104,26 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
         self.logTree.clear()
-    
+
     def __resizeColumnsLog(self):
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __generateLogItem(self, commitId, operation, subject):
         """
         Private method to generate a bisect log tree entry.
-        
+
         @param commitId commit id info (string)
         @param operation bisect operation (string)
         @param subject subject of the bisect log entry (string)
@@ -134,115 +136,110 @@
         ]
         itm = QTreeWidgetItem(self.logTree, columnLabels)
         return itm
-    
+
     def __getLogEntries(self):
         """
         Private method to retrieve bisect log entries from the repository.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
         self.refreshButton.setEnabled(False)
-        
+
         self.buf = []
         self.cancelled = False
         self.errors.clear()
         self.intercept = False
-        
+
         args = self.vcs.initCommand("bisect")
         args.append("log")
-        
+
         self.__process.kill()
-        
+
         self.__process.setWorkingDirectory(self.repodir)
-        
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
-        
-        self.__process.start('git', args)
+
+        self.__process.start("git", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
+
     def start(self, projectdir):
         """
         Public slot to start the git bisect log command.
-        
+
         @param projectdir directory name of the project (string)
         """
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.__initData()
-        
+
         # find the root of the repo
         self.repodir = projectdir
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__getLogEntries()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__processBuffer()
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the git log command.
         """
         for line in self.buf:
             line = line.rstrip()
-            
+
             if line.startswith("# "):
                 operation, commitId, subject = line[2:].split(None, 2)
                 # commit is surrounded by [...], abbreviate to 20 chars
@@ -250,74 +247,74 @@
                 # operation is followed by ':'
                 operation = operation[:-1]
                 self.__generateLogItem(commitId, operation, subject)
-        
+
         self.__resizeColumnsLog()
         self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
-        
+
         # restore current item
         if self.__currentCommitId:
             items = self.logTree.findItems(
-                self.__currentCommitId, Qt.MatchFlag.MatchExactly,
-                self.CommitIdColumn)
+                self.__currentCommitId, Qt.MatchFlag.MatchExactly, self.CommitIdColumn
+            )
             if items:
                 self.logTree.setCurrentItem(items[0])
                 self.__currentCommitId = ""
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into a buffer.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            line = str(self.__process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            line = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.buf.append(line)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showError(s)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -329,20 +326,20 @@
             self.__currentCommitId = itm.text(self.CommitIdColumn)
         else:
             self.__currentCommitId = ""
-        
+
         self.start(self.repodir)
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -350,7 +347,7 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
@@ -358,23 +355,23 @@
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
         self.errorGroup.show()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectStartDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBisectStartDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,42 +17,42 @@
     """
     Class implementing a dialog to enter the data for an extended bisect start.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method used to enable/disable the OK-button.
         """
         enable = self.badEdit.text() != ""
         self.okButton.setEnabled(enable)
-    
+
     @pyqtSlot(str)
     def on_badEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the bad commit.
-        
+
         @param txt bad commit entered (string)
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing a bad commit (string), a list of good
             commits (list of strings) and a flag indicating to not
             checkout the working tree (boolean)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBlameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBlameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,11 @@
 
 from PyQt6.QtCore import pyqtSlot, QProcess, QTimer, Qt, QCoreApplication
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QLineEdit, QTreeWidgetItem
+    QDialog,
+    QDialogButtonBox,
+    QHeaderView,
+    QLineEdit,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -27,167 +31,160 @@
     """
     Class implementing a dialog to show the output of git blame.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.__blameRe = re.compile(
             r"""\^?([0-9a-fA-F]+)\s+\((.+)\s+(\d{4}-\d{2}-\d{2})\s+"""
-            r"""(\d{2}:\d{2}):\d{2}\s+[+-]\d{4}\s+(\d+)\)\s?(.*)""")
+            r"""(\d{2}:\d{2}):\d{2}\s+[+-]\d{4}\s+(\d+)\)\s?(.*)"""
+        )
         # commit - author - date - time - lineno. - text
-        
-        self.blameList.headerItem().setText(
-            self.blameList.columnCount(), "")
+
+        self.blameList.headerItem().setText(self.blameList.columnCount(), "")
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.blameList.setFont(font)
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-    
+
     def start(self, fn):
         """
         Public slot to start the blame command.
-        
+
         @param fn filename to show the blame for (string)
         """
         self.blameList.clear()
-        
+
         self.errorGroup.hide()
         self.intercept = False
         self.activateWindow()
-        
+
         dname, fname = self.vcs.splitPath(fn)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.vcs.initCommand("blame")
-        args.append('--abbrev={0}'.format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
-        args.append('--date=iso')
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
+        args.append("--date=iso")
         args.append(fn)
-        
+
         self.process.kill()
         self.process.setWorkingDirectory(repodir)
-        
-        self.process.start('git', args)
+
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-            Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__resizeColumns()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-    
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.blameList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-    
+        self.blameList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
+
     def __generateItem(self, commitId, author, date, time, lineno, text):
         """
         Private method to generate a blame item in the annotation list.
-        
+
         @param commitId commit identifier (string)
         @param author author of the change (string)
         @param date date of the change (string)
@@ -196,44 +193,46 @@
         @param text name (path) of the tag (string)
         """
         itm = QTreeWidgetItem(
-            self.blameList,
-            [commitId, author, date, time, lineno, text])
+            self.blameList, [commitId, author, date, time, lineno, text]
+        )
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignRight)
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the annotation list.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            line = str(self.process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace').strip()
+            line = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            ).strip()
             match = self.__blameRe.match(line)
             commitId, author, date, time, lineno, text = match.groups()
             self.__generateItem(commitId, author, date, time, lineno, text)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
-            
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
+
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -241,19 +240,19 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     @pyqtSlot()
     def on_input_returnPressed(self):
         """
@@ -261,23 +260,23 @@
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     @pyqtSlot(bool)
     def on_passwordCheckBox_toggled(self, checked):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param checked flag indicating the status of the check box (boolean)
         """
         if checked:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class implementing a dialog to enter the data for a branching operation.
     """
+
     CreateBranch = 1
     DeleteBranch = 2
     RenameBranch = 3
@@ -24,12 +25,13 @@
     CreateTrackingBranch = 5
     SetTrackingBranch = 6
     UnsetTrackingBranch = 7
-    
-    def __init__(self, branchlist, revision=None, branchName=None,
-                 branchOp=None, parent=None):
+
+    def __init__(
+        self, branchlist, revision=None, branchName=None, branchOp=None, parent=None
+    ):
         """
         Constructor
-        
+
         @param branchlist list of previously entered branches (list of strings)
         @param revision revision to set tag for (string)
         @param branchName name of the branch (string)
@@ -38,26 +40,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
-        self.__remoteBranches = [b for b in branchlist
-                                 if b.startswith("remotes/")]
-        self.__lokalBranches = [b for b in branchlist
-                                if not b.startswith("remotes/")]
-        
+
+        self.__remoteBranches = [b for b in branchlist if b.startswith("remotes/")]
+        self.__lokalBranches = [b for b in branchlist if not b.startswith("remotes/")]
+
         self.branchCombo.clear()
         self.branchCombo.addItem("")
         self.branchCombo.addItems(sorted(self.__lokalBranches))
-        
+
         self.remoteBranchCombo.clear()
         self.remoteBranchCombo.addItems(sorted(self.__remoteBranches))
-        
+
         if revision:
             self.revisionEdit.setText(revision)
-        
+
         if branchName:
             index = self.branchCombo.findText(branchName)
             if index > -1:
@@ -67,7 +66,7 @@
             else:
                 self.branchCombo.setEditText(branchName)
                 self.createBranchButton.setChecked(True)
-        
+
         if branchOp:
             if branchOp == GitBranchDialog.CreateBranch:
                 self.createBranchButton.setChecked(True)
@@ -86,31 +85,28 @@
             else:
                 # Oops, fall back to a save default
                 self.createBranchButton.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method used to enable/disable the OK-button.
         """
-        if (
-            self.setTrackingButton.isChecked() or
-            self.unsetTrackingButton.isChecked()
-        ):
+        if self.setTrackingButton.isChecked() or self.unsetTrackingButton.isChecked():
             enable = True
         else:
             enable = self.branchCombo.currentText() != ""
             if self.moveBranchButton.isChecked():
                 enable &= self.newBranchNameEdit.text() != ""
-        
+
         self.okButton.setEnabled(enable)
-    
+
     @pyqtSlot(bool)
     def on_createTrackingButton_toggled(self, checked):
         """
         Private slot to handle the selection of creating a tracking branch.
-        
+
         @param checked state of the selection (boolean)
         """
         self.branchCombo.setEditable(not checked)
@@ -121,53 +117,53 @@
             self.branchCombo.addItem("")
             self.branchCombo.addItems(sorted(self.__lokalBranches))
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_setTrackingButton_toggled(self, checked):
         """
         Private slot to handle the selection of setting a tracking branch.
-        
+
         @param checked state of the selection (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_unsetTrackingButton_toggled(self, checked):
         """
         Private slot to handle the selection of unsetting a tracking branch.
-        
+
         @param checked state of the selection (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, text):
         """
         Private slot to handle a change of the branch.
-        
+
         @param text branch name entered in the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_newBranchNameEdit_textChanged(self, text):
         """
         Private slot to handle a change of the new branch.
-        
+
         @param text new branch name entered (string)
         """
         self.__updateOK()
-    
+
     def getParameters(self):
         """
         Public method to retrieve the branch data.
-        
+
         @return tuple of an int, four strings and a boolean
             (branch operation, branch name, revision, new branch name,
             remote branch name, enforce operation)
         """
         branch = self.branchCombo.currentText().replace(" ", "_")
-        
+
         if self.createBranchButton.isChecked():
             branchOp = GitBranchDialog.CreateBranch
         elif self.deleteBranchButton.isChecked():
@@ -182,8 +178,12 @@
             branchOp = GitBranchDialog.SetTrackingBranch
         else:
             branchOp = GitBranchDialog.UnsetTrackingBranch
-        
-        return (branchOp, branch, self.revisionEdit.text(),
-                self.newBranchNameEdit.text(),
-                self.remoteBranchCombo.currentText(),
-                self.forceCheckBox.isChecked())
+
+        return (
+            branchOp,
+            branch,
+            self.revisionEdit.text(),
+            self.newBranchNameEdit.text(),
+            self.remoteBranchCombo.currentText(),
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchPushDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBranchPushDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to select the data for pushing a branch.
     """
+
     def __init__(self, branches, remotes, delete=False, parent=None):
         """
         Constructor
-        
+
         @param branches list of branch names (list of string)
         @param remotes list of remote names (list of string)
         @param delete flag indicating a delete branch action (boolean)
@@ -28,17 +29,16 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         self.__allBranches = self.tr("<all branches>")
-        
+
         if "origin" in remotes:
             self.remoteComboBox.addItem("origin")
             remotes.remove("origin")
         self.remoteComboBox.addItems(sorted(remotes))
-        
+
         if delete:
             self.branchComboBox.addItem("")
         else:
@@ -48,27 +48,29 @@
                 self.branchComboBox.addItem("master")
             branches.remove("master")
         self.branchComboBox.addItems(sorted(branches))
-        
+
         if delete:
             self.__okButton.setEnabled(False)
             self.branchComboBox.setEditable(True)
-    
+
     @pyqtSlot(str)
     def on_branchComboBox_editTextChanged(self, txt):
         """
         Private slot to handle a change of the branch name.
-        
+
         @param txt branch name (string)
         """
         self.__okButton.setEnabled(bool(txt))
-    
+
     def getData(self):
         """
         Public method to get the selected data.
-        
+
         @return tuple of selected branch name, remote name and a flag
             indicating all branches (tuple of two strings and a boolean)
         """
-        return (self.branchComboBox.currentText(),
-                self.remoteComboBox.currentText(),
-                self.branchComboBox.currentText() == self.__allBranches)
+        return (
+            self.branchComboBox.currentText(),
+            self.remoteComboBox.currentText(),
+            self.branchComboBox.currentText() == self.__allBranches,
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitBundleDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitBundleDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,23 +17,23 @@
     """
     Class implementing a dialog to enter the data for a bundle operation.
     """
+
     def __init__(self, tagsList, branchesList, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["master"] + sorted(branchesList))
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -45,68 +45,67 @@
             enabled = self.tagCombo.currentText() != ""
         elif self.branchButton.isChecked():
             enabled = self.branchCombo.currentText() != ""
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(bool)
     def on_revisionsButton_toggled(self, checked):
         """
         Private slot to handle changes of the revisions select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tagButton_toggled(self, checked):
         """
         Private slot to handle changes of the Tag select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_revisionsEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the Revisions edit.
-        
+
         @param txt text of the line edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to retrieve the bundle data.
-        
+
         @return list of revision expressions (list of strings)
         """
         if self.revisionsButton.isChecked():
@@ -117,5 +116,5 @@
             revs = [self.branchCombo.currentText()]
         else:
             revs = []
-        
+
         return revs
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitChangeRemoteUrlDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitChangeRemoteUrlDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to change the URL of a remote git repository.
     """
+
     def __init__(self, remoteName, remoteUrl, parent=None):
         """
         Constructor
-        
+
         @param remoteName name of the remote repository
         @type str
         @param remoteUrl URL of the remote repository
@@ -30,21 +31,20 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         url = QUrl(remoteUrl)
         self.__userInfo = url.userInfo()
-        
+
         self.nameEdit.setText(remoteName)
-        self.urlEdit.setText(
-            url.toString(QUrl.UrlFormattingOption.RemoveUserInfo))
-        
+        self.urlEdit.setText(url.toString(QUrl.UrlFormattingOption.RemoveUserInfo))
+
         self.__updateOK()
-        
+
         self.newUrlEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method to update the status of the OK button.
@@ -52,26 +52,26 @@
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
             bool(self.newUrlEdit.text())
         )
-    
+
     @pyqtSlot(str)
     def on_newUrlEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered URL.
-        
+
         @param txt current text
         @type str
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with name and new URL of the remote repository
         @rtype tuple of (str, str)
         """
         url = QUrl.fromUserInput(self.newUrlEdit.text())
         if self.__userInfo:
             url.setUserInfo(self.__userInfo)
-        
+
         return self.nameEdit.text(), url.toString()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitCherryPickDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitCherryPickDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,40 +17,44 @@
     """
     Class implementing a dialog to enter cherry-pick data.
     """
+
     def __init__(self, commits=None, parent=None):
         """
         Constructor
-        
+
         @param commits list of commits to show in the commits pane (list of
             strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if commits:
             self.commitsEdit.setPlainText("\n".join(commits))
-       
+
         self.on_commitsEdit_textChanged()
-    
+
     @pyqtSlot()
     def on_commitsEdit_textChanged(self):
         """
         Private slot to react upon changes of commits.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.commitsEdit.toPlainText() != "")
-    
+            self.commitsEdit.toPlainText() != ""
+        )
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple with list of commits, a flag indicating to append
             cherry-pick info to the commit message, a flag indicating to append
             a signed-off-by line to the commit message and a flag indicating to
             not commit the action (list of strings, boolean, boolean, boolean)
         """
-        return (self.commitsEdit.toPlainText().strip().splitlines(),
-                self.appendCheckBox.isChecked(),
-                self.signoffCheckBox.isChecked(),
-                self.nocommitCheckBox.isChecked())
+        return (
+            self.commitsEdit.toPlainText().strip().splitlines(),
+            self.appendCheckBox.isChecked(),
+            self.signoffCheckBox.isChecked(),
+            self.nocommitCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitCommandDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitCommandDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,54 +18,54 @@
 class GitCommandDialog(QDialog, Ui_GitCommandDialog):
     """
     Class implementing the Git command dialog.
-    
+
     It implements a dialog that is used to enter an
     arbitrary Git command. It asks the user to enter
     the commandline parameters.
     """
+
     def __init__(self, argvList, ppath, parent=None):
         """
         Constructor
-        
+
         @param argvList history list of commandline arguments (list of strings)
         @param ppath pathname of the project directory (string)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.commandCombo.clear()
         self.commandCombo.addItems(argvList)
         if len(argvList) > 0:
             self.commandCombo.setCurrentIndex(0)
         self.projectDirLabel.setText(ppath)
-        
+
         # modify some what's this help texts
         t = self.commandCombo.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.commandCombo.setWhatsThis(t)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_commandCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text ignored
         """
         self.okButton.setDisabled(self.commandCombo.currentText() == "")
-    
+
     def getData(self):
         """
         Public method to retrieve the data entered into this dialog.
-        
+
         @return commandline parameters (string)
         """
         return self.commandCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitCommitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitCommitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,17 +18,18 @@
 class GitCommitDialog(QWidget, Ui_GitCommitDialog):
     """
     Class implementing a dialog to enter the commit message.
-    
+
     @signal accepted() emitted, if the dialog was accepted
     @signal rejected() emitted, if the dialog was rejected
     """
+
     accepted = pyqtSignal()
     rejected = pyqtSignal()
-    
+
     def __init__(self, vcs, msg, amend, commitAll, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param msg initial message (string)
         @param amend flag indicating to amend the HEAD commit (boolean)
@@ -37,22 +38,22 @@
         """
         super().__init__(parent, Qt.WindowType.Window)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
         self.logEdit.setLanguageWithPWL(language, pwl or None, pel or None)
         self.logEdit.setPlainText(msg)
-        
+
         self.amendCheckBox.setChecked(amend)
         self.stagedCheckBox.setChecked(not commitAll)
-    
+
     def showEvent(self, evt):
         """
         Protected method called when the dialog is about to be shown.
-        
+
         @param evt the event (QShowEvent)
         """
         commitMessages = self.__vcs.vcsCommitMessages()
@@ -63,75 +64,73 @@
             if len(message) > 60:
                 abbrMsg += "..."
             self.recentComboBox.addItem(abbrMsg, message)
-        
+
         self.logEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def logMessage(self):
         """
         Public method to retrieve the log message.
-        
+
         @return the log message (string)
         """
         msg = self.logEdit.toPlainText()
         if msg:
             self.__vcs.vcsAddCommitMessage(msg)
-        
+
         return msg
-    
+
     def stagedOnly(self):
         """
         Public method to retrieve the state of the staged only flag.
-        
+
         @return state of the staged only flag (boolean)
         """
         return self.stagedCheckBox.isChecked()
-    
+
     def amend(self):
         """
         Public method to retrieve the state of the amend flag.
-        
+
         @return state of the amend flag (boolean)
         """
         return self.amendCheckBox.isChecked()
-    
+
     def resetAuthor(self):
         """
         Public method to retrieve the state of the reset author flag.
-        
+
         @return state of the reset author flag (boolean)
         """
         return self.resetAuthorCheckBox.isChecked()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.logEdit.clear()
-    
+
     def on_buttonBox_accepted(self):
         """
         Private slot called by the buttonBox accepted signal.
         """
         self.close()
         self.accepted.emit()
-    
+
     def on_buttonBox_rejected(self):
         """
         Private slot called by the buttonBox rejected signal.
         """
         self.close()
         self.rejected.emit()
-    
+
     @pyqtSlot(int)
     def on_recentComboBox_activated(self, index):
         """
         Private slot to select a commit message from recent ones.
-        
+
         @param index index of the selected entry
         @type int
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitCopyDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitCopyDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,42 +26,42 @@
     Class implementing a dialog to enter the data for a copy or rename
     operation.
     """
+
     def __init__(self, source, parent=None, move=False):
         """
         Constructor
-        
+
         @param source name of the source file/directory (string)
         @param parent parent widget (QWidget)
         @param move flag indicating a move operation (boolean)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.dirButton.setIcon(UI.PixmapCache.getIcon("open"))
-       
+
         self.source = source
         if os.path.isdir(self.source):
             self.targetCompleter = EricDirCompleter(self.targetEdit)
         else:
             self.targetCompleter = EricFileCompleter(self.targetEdit)
-        
+
         if move:
-            self.setWindowTitle(self.tr('Git Move'))
+            self.setWindowTitle(self.tr("Git Move"))
         else:
             self.forceCheckBox.setEnabled(False)
-        
+
         self.sourceEdit.setText(source)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to retrieve the copy data.
-        
+
         @return the target name (string) and a flag indicating
             the operation should be enforced (boolean)
         """
@@ -69,11 +69,8 @@
         if not os.path.isabs(target):
             sourceDir = os.path.dirname(self.sourceEdit.text())
             target = os.path.join(sourceDir, target)
-        return (
-            Utilities.toNativeSeparators(target),
-            self.forceCheckBox.isChecked()
-        )
-    
+        return (Utilities.toNativeSeparators(target), self.forceCheckBox.isChecked())
+
     @pyqtSlot()
     def on_dirButton_clicked(self):
         """
@@ -85,25 +82,28 @@
                 self,
                 self.tr("Select target"),
                 self.targetEdit.text(),
-                EricFileDialog.ShowDirsOnly)
-            if os.path.isdir(self.source) else
-            EricFileDialog.getSaveFileName(
+                EricFileDialog.ShowDirsOnly,
+            )
+            if os.path.isdir(self.source)
+            else EricFileDialog.getSaveFileName(
                 self,
                 self.tr("Select target"),
                 self.targetEdit.text(),
                 "",
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
         )
-        
+
         if target:
             self.targetEdit.setText(Utilities.toNativeSeparators(target))
-    
+
     @pyqtSlot(str)
     def on_targetEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the target.
-        
+
         @param txt contents of the target edit (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            os.path.isabs(txt) or os.path.dirname(txt) == "")
+            os.path.isabs(txt) or os.path.dirname(txt) == ""
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDescribeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDescribeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 
 from PyQt6.QtCore import pyqtSlot, QProcess, Qt, QTimer, QCoreApplication
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QLineEdit
+    QDialog,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -26,222 +30,216 @@
     """
     Class implementing a dialog to show the results of the git describe action.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = QProcess()
         self.vcs = vcs
-        
+
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(1, Qt.SortOrder.AscendingOrder)
-        
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-    
+
     def start(self, path, commits):
         """
         Public slot to start the tag/branch list command.
-        
+
         @param path name of directory to be listed (string)
         @param commits list of commits to be described (list of string)
         """
         self.tagList.clear()
         self.errorGroup.hide()
-        
+
         self.intercept = False
         self.activateWindow()
-        
+
         self.__commits = commits[:]
         self.__tagInfoLines = []
-        
+
         dname, fname = self.vcs.splitPath(path)
-        
+
         # find the root of the repo
         self.repodir = dname
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
+
         args = self.vcs.initCommand("describe")
-        args.append('--abbrev={0}'.format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
         if commits:
             args.extend(commits)
         else:
-            args.append('--dirty')
-        
+            args.append("--dirty")
+
         self.process.kill()
         self.process.setWorkingDirectory(self.repodir)
-        
-        self.process.start('git', args)
+
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__resizeColumns()
         self.__resort()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         if self.__tagInfoLines:
             if self.__commits:
-                for commit, tagInfo in zip(self.__commits,
-                                           self.__tagInfoLines):
+                for commit, tagInfo in zip(self.__commits, self.__tagInfoLines):
                     QTreeWidgetItem(self.tagList, [commit, tagInfo])
             else:
                 for tagInfo in self.__tagInfoLines:
                     QTreeWidgetItem(self.tagList, ["", tagInfo])
-        
+
         self.__finish()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.tagList.sortItems(
-            self.tagList.sortColumn(),
-            self.tagList.header().sortIndicatorOrder())
-    
+            self.tagList.sortColumn(), self.tagList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.tagList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tagList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.tagList.header().setStretchLastSection(True)
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.__tagInfoLines.append(s.strip())
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -249,35 +247,35 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
             self.intercept = False
             evt.accept()
             return
-        
+
         super().keyPressEvent(evt)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,12 @@
 import os
 
 from PyQt6.QtCore import (
-    QProcess, QTimer, pyqtSlot, Qt, QCoreApplication, QProcessEnvironment
+    QProcess,
+    QTimer,
+    pyqtSlot,
+    Qt,
+    QCoreApplication,
+    QProcessEnvironment,
 )
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QLineEdit
 
@@ -25,117 +30,105 @@
 class GitDialog(QDialog, Ui_GitDialog):
     """
     Class implementing a dialog starting a process and showing its output.
-    
+
     It starts a QProcess and displays a dialog that
     shows the output of the process. The dialog is modal,
     which causes a synchronized execution of the process.
     """
+
     def __init__(self, text, git=None, parent=None):
         """
         Constructor
-        
+
         @param text text to be shown by the label (string)
         @param git reference to the Git interface object (Git)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = None
-        self.username = ''
-        self.password = ''
+        self.username = ""
+        self.password = ""
         self.vcs = git
-        
+
         self.outputGroup.setTitle(text)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.process = None
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if self.normal and self.errors.toPlainText():
             self.errorGroup.setTitle(self.tr("Additional Output"))
-        
+
         if (
-            Preferences.getVCS("AutoClose") and
-            self.normal and
-            self.errors.toPlainText() == ""
+            Preferences.getVCS("AutoClose")
+            and self.normal
+            and self.errors.toPlainText() == ""
         ):
             self.accept()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.statusLabel.setText(self.tr("Process canceled."))
             self.__finish()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
-        self.normal = (
-            (exitStatus == QProcess.ExitStatus.NormalExit) and
-            (exitCode == 0)
-        )
+        self.normal = (exitStatus == QProcess.ExitStatus.NormalExit) and (exitCode == 0)
         if self.normal:
             self.statusLabel.setText(self.tr("Process finished successfully."))
         elif exitStatus == QProcess.ExitStatus.CrashExit:
             self.statusLabel.setText(self.tr("Process crashed."))
         else:
             self.statusLabel.setText(
-                self.tr("Process finished with exit code {0}")
-                .format(exitCode))
+                self.tr("Process finished with exit code {0}").format(exitCode)
+            )
         self.__finish()
-    
-    def startProcess(self, args, workingDir=None, showArgs=True,
-                     environment=None):
+
+    def startProcess(self, args, workingDir=None, showArgs=True, environment=None):
         """
         Public slot used to start the process.
-        
+
         @param args list of arguments for the process (list of strings)
         @param workingDir working directory for the process (string)
         @param showArgs flag indicating to show the arguments (boolean)
@@ -146,138 +139,148 @@
         self.errorGroup.hide()
         self.normal = False
         self.intercept = False
-        
+
         if environment is None:
             environment = {}
-        
+
         self.__hasAddOrDelete = False
-        if args[0] in ["checkout", "fetch", "pull", "rebase", "reset",
-                       "merge", "cherry-pick", "stash"]:
+        if args[0] in [
+            "checkout",
+            "fetch",
+            "pull",
+            "rebase",
+            "reset",
+            "merge",
+            "cherry-pick",
+            "stash",
+        ]:
             self.__updateCommand = True
         else:
             self.__updateCommand = False
-        
+
         if showArgs:
-            self.resultbox.append(' '.join(args))
-            self.resultbox.append('')
-        
+            self.resultbox.append(" ".join(args))
+            self.resultbox.append("")
+
         self.process = QProcess()
         if environment:
             env = QProcessEnvironment.systemEnvironment()
             for key, value in environment.items():
                 env.insert(key, value)
             self.process.setProcessEnvironment(env)
-        
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         if workingDir:
             self.process.setWorkingDirectory(workingDir)
-        self.process.start('git', args)
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.buttonBox.setFocus()
             self.inputGroup.setEnabled(False)
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
         return procStarted
-    
+
     def normalExit(self):
         """
         Public method to check for a normal process termination.
-        
+
         @return flag indicating normal process termination (boolean)
         """
         return self.normal
-    
+
     def normalExitWithoutErrors(self):
         """
         Public method to check for a normal process termination without
         error messages.
-        
+
         @return flag indicating normal process termination (boolean)
         """
         return self.normal and self.errors.toPlainText() == ""
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardOutput(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showOutput(s)
-    
+
     def __showOutput(self, out):
         """
         Private slot to show some output.
-        
+
         @param out output to be shown (string)
         """
         self.resultbox.insertPlainText(out)
         self.resultbox.ensureCursorVisible()
-        
+
         # check for a changed project file
         if self.__updateCommand:
             for line in out.splitlines():
-                if (
-                    '.epj' in line or
-                    '.e4p' in line
-                ):
+                if ".epj" in line or ".e4p" in line:
                     self.__hasAddOrDelete = True
                     break
-        
+
         QCoreApplication.processEvents()
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showError(s)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-        
+
         QCoreApplication.processEvents()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -285,30 +288,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -316,11 +319,11 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     def hasAddOrDelete(self):
         """
         Public method to check, if the last action contained an add or delete.
-        
+
         @return flag indicating the presence of an add or delete (boolean)
         """
         return self.__hasAddOrDelete
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,43 +31,41 @@
     Class implementing a dialog to show the output of the git diff command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         try:
             # insert the search widget if it is available
-            from EricWidgets.EricTextEditSearchWidget import (
-                EricTextEditSearchWidget
-            )
+            from EricWidgets.EricTextEditSearchWidget import EricTextEditSearchWidget
+
             self.searchWidget = EricTextEditSearchWidget(self.contentsGroup)
             self.searchWidget.setFocusPolicy(Qt.FocusPolicy.WheelFocus)
             self.searchWidget.setObjectName("searchWidget")
             self.contentsGroup.layout().insertWidget(1, self.searchWidget)
             self.searchWidget.attachTextEdit(self.contents)
-            
+
             self.searchWidget2 = EricTextEditSearchWidget(self.contentsGroup)
             self.searchWidget2.setFocusPolicy(Qt.FocusPolicy.WheelFocus)
             self.searchWidget2.setObjectName("searchWidget2")
             self.contentsGroup.layout().addWidget(self.searchWidget2)
             self.searchWidget2.attachTextEdit(self.contents2)
-            
+
             self.setTabOrder(self.filesCombo, self.searchWidget)
             self.setTabOrder(self.searchWidget, self.contents)
             self.setTabOrder(self.contents, self.contents2)
@@ -77,43 +75,45 @@
             # eric version without search widget
             self.searchWidget = None
             self.searchWidget2 = None
-        
+
         self.vcs = vcs
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.contents.document().setDefaultFont(font)
         self.contents2.document().setDefaultFont(font)
-        
+
         self.highlighter = GitDiffHighlighter(self.contents.document())
         self.highlighter2 = GitDiffHighlighter(self.contents2.document())
-        
+
         self.__diffGenerator = GitDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.__modeMessages = {
             "work2stage": self.tr("Working Tree to Staging Area"),
             "stage2repo": self.tr("Staging Area to HEAD Commit"),
             "work2repo": self.tr("Working Tree to HEAD Commit"),
-            "work2stage2repo": self.tr("Working to Staging (top)"
-                                       " and Staging to HEAD (bottom)"),
+            "work2stage2repo": self.tr(
+                "Working to Staging (top)" " and Staging to HEAD (bottom)"
+            ),
             "stash": self.tr("Stash Contents"),
             "stashName": self.tr("Stash Contents of {0}"),
         }
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         self.__diffGenerator.stopProcesses()
         e.accept()
-    
-    def start(self, fn, versions=None, diffMode="work2repo", stashName="",
-              refreshable=False):
+
+    def start(
+        self, fn, versions=None, diffMode="work2repo", stashName="", refreshable=False
+    ):
         """
         Public slot to start the git diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to 2 strings
             or None)
@@ -129,35 +129,39 @@
         @exception ValueError raised to indicate a bad value for the 'diffMode'
             parameter.
         """
-        if diffMode not in ["work2repo", "work2stage", "stage2repo",
-                            "work2stage2repo", "stash"]:
+        if diffMode not in [
+            "work2repo",
+            "work2stage",
+            "stage2repo",
+            "work2stage2repo",
+            "stash",
+        ]:
             raise ValueError("Bad value for 'diffMode' parameter.")
-        
+
         self.refreshButton.setVisible(refreshable)
-        
+
         self.__filename = fn
         self.__diffMode = diffMode
-        
+
         self.errorGroup.hide()
-        
+
         self.contents.clear()
         self.contents2.clear()
         self.contents2.setVisible(diffMode == "work2stage2repo")
         if self.searchWidget2:
             self.searchWidget2.setVisible(diffMode == "work2stage2repo")
-        
+
         self.filesCombo.clear()
-        
+
         with contextlib.suppress(AttributeError):
             self.highlighter.regenerateRules()
             self.highlighter2.regenerateRules()
-        
-        if diffMode in ["work2repo", "work2stage", "stage2repo",
-                        "work2stage2repo"]:
+
+        if diffMode in ["work2repo", "work2stage", "stage2repo", "work2stage2repo"]:
             self.contentsGroup.setTitle(
-                self.tr("Difference ({0})")
-                .format(self.__modeMessages[diffMode]))
-            
+                self.tr("Difference ({0})").format(self.__modeMessages[diffMode])
+            )
+
             if versions is not None:
                 self.raise_()
                 self.activateWindow()
@@ -166,76 +170,75 @@
                 msg = self.__modeMessages["stashName"].format(stashName)
             else:
                 msg = self.__modeMessages["stash"]
-            self.contentsGroup.setTitle(
-                self.tr("Difference ({0})").format(msg))
-        
+            self.contentsGroup.setTitle(self.tr("Difference ({0})").format(msg))
+
         procStarted = self.__diffGenerator.start(
-            fn, versions=versions, diffMode=diffMode, stashName=stashName)
+            fn, versions=versions, diffMode=diffMode, stashName=stashName
+        )
         if not procStarted:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
             return
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal.
         """
         self.refreshButton.setEnabled(True)
-        
+
         diff1, diff2, errors, fileSeparators = self.__diffGenerator.getResult()
-        
+
         if diff1:
             self.contents.setPlainText("".join(diff1))
         else:
-            self.contents.setPlainText(
-                self.tr('There is no difference.'))
-        
+            self.contents.setPlainText(self.tr("There is no difference."))
+
         if diff2:
             self.contents2.setPlainText("".join(diff2))
         else:
-            self.contents2.setPlainText(
-                self.tr('There is no difference.'))
-        
+            self.contents2.setPlainText(self.tr("There is no difference."))
+
         if errors:
             self.errorGroup.show()
             self.errors.setPlainText(errors)
             self.errors.ensureCursorVisible()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(bool(diff2))
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(
+            bool(diff2)
+        )
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         for contents in [self.contents, self.contents2]:
             tc = contents.textCursor()
             tc.movePosition(QTextCursor.MoveOperation.Start)
             contents.setTextCursor(tc)
             contents.ensureCursorVisible()
-        
+
         fileSeparators = self.__mergeFileSeparators(fileSeparators)
         self.filesCombo.addItem(self.tr("<Start>"), (0, 0))
         self.filesCombo.addItem(self.tr("<End>"), (-1, -1))
         for oldFile, newFile, pos1, pos2 in sorted(fileSeparators):
             if oldFile != newFile:
                 self.filesCombo.addItem(
-                    "{0} -- {1}".format(oldFile, newFile), (pos1, pos2))
+                    "{0} -- {1}".format(oldFile, newFile), (pos1, pos2)
+                )
             else:
                 self.filesCombo.addItem(oldFile, (pos1, pos2))
-    
+
     def __mergeFileSeparators(self, fileSeparators):
         """
         Private method to merge the file separator entries.
-        
+
         @param fileSeparators list of file separator entries to be merged
         @return merged list of file separator entries
         """
@@ -249,31 +252,28 @@
                 if pos2 != -2:
                     separators[(oldFile, newFile)][3] = pos2
         return list(separators.values())
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Save):
             self.on_saveButton_clicked()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(int)
     def on_filesCombo_activated(self, index):
         """
         Private slot to handle the selection of a file.
-        
+
         @param index activated row (integer)
         """
         para1, para2 = self.filesCombo.itemData(index)
-        
-        for para, contents in [(para1, self.contents),
-                               (para2, self.contents2)]:
+
+        for para, contents in [(para1, self.contents), (para2, self.contents2)]:
             if para == 0:
                 tc = contents.textCursor()
                 tc.movePosition(QTextCursor.MoveOperation.Start)
@@ -290,21 +290,23 @@
                 tc.movePosition(QTextCursor.MoveOperation.End)
                 contents.setTextCursor(tc)
                 contents.ensureCursorVisible()
-                
+
                 # step 2: move cursor to desired line
                 tc = contents.textCursor()
                 delta = tc.blockNumber() - para
-                tc.movePosition(QTextCursor.MoveOperation.PreviousBlock,
-                                QTextCursor.MoveMode.MoveAnchor,
-                                delta)
+                tc.movePosition(
+                    QTextCursor.MoveOperation.PreviousBlock,
+                    QTextCursor.MoveMode.MoveAnchor,
+                    delta,
+                )
                 contents.setTextCursor(tc)
                 contents.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to handle the Save button press.
-        
+
         It saves the diff shown in the dialog to a file in the local
         filesystem.
         """
@@ -313,24 +315,25 @@
                 fname = self.vcs.splitPathList(self.__filename)[0]
             else:
                 dname, fname = self.vcs.splitPath(self.__filename[0])
-                if fname != '.':
+                if fname != ".":
                     fname = "{0}.diff".format(self.__filename[0])
                 else:
                     fname = dname
         else:
             fname = self.vcs.splitPath(self.__filename)[0]
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -340,12 +343,14 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
@@ -353,22 +358,22 @@
                 f.write(eol)
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-    
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the display.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
         self.refreshButton.setEnabled(False)
-        
+
         self.start(self.__filename, diffMode=self.__diffMode, refreshable=True)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,53 +20,58 @@
 class GitDiffGenerator(QObject):
     """
     Class implementing the generation of output of the git diff command.
-    
+
     @signal finished() emitted when all processes have finished
     """
+
     finished = pyqtSignal()
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.vcs = vcs
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(
-            lambda: self.__readStdout(self.__process))
+            lambda: self.__readStdout(self.__process)
+        )
         self.__process.readyReadStandardError.connect(
-            lambda: self.__readStderr(self.__process))
-        
+            lambda: self.__readStderr(self.__process)
+        )
+
         self.__process2 = EricOverrideCursorProcess()
         self.__process2.finished.connect(self.__procFinished)
         self.__process2.readyReadStandardOutput.connect(
-            lambda: self.__readStdout(self.__process2))
+            lambda: self.__readStdout(self.__process2)
+        )
         self.__process2.readyReadStandardError.connect(
-            lambda: self.__readStderr(self.__process2))
-    
+            lambda: self.__readStderr(self.__process2)
+        )
+
     def stopProcesses(self):
         """
         Public slot to stop the diff processes.
         """
         for process in [self.__process, self.__process2]:
             if (
-                process is not None and
-                process.state() != QProcess.ProcessState.NotRunning
+                process is not None
+                and process.state() != QProcess.ProcessState.NotRunning
             ):
                 process.terminate()
                 QTimer.singleShot(2000, process.kill)
                 process.waitForFinished(3000)
-    
+
     def start(self, fn, versions=None, diffMode="work2repo", stashName=""):
         """
         Public slot to start the git diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to 2 strings
             or None)
@@ -82,24 +87,28 @@
         @exception ValueError raised to indicate a bad value for the 'diffMode'
             parameter.
         """
-        if diffMode not in ["work2repo", "work2stage", "stage2repo",
-                            "work2stage2repo", "stash"]:
+        if diffMode not in [
+            "work2repo",
+            "work2stage",
+            "stage2repo",
+            "work2stage2repo",
+            "stash",
+        ]:
             raise ValueError("Bad value for 'diffMode' parameter.")
-        
+
         self.__output1 = []
         self.__output2 = []
         self.__errors = []
         self.__fileSeparators = []
         args2 = []
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
-        if diffMode in ["work2repo", "work2stage", "stage2repo",
-                        "work2stage2repo"]:
+
+        if diffMode in ["work2repo", "work2stage", "stage2repo", "work2stage2repo"]:
             args = self.vcs.initCommand("diff")
             args.append("--patch")
             args.append("--find-copies-harder")
-            
+
             if versions is not None:
                 for version in versions:
                     if version:
@@ -113,7 +122,7 @@
                     args.append("--cached")
                 elif diffMode == "work2repo":
                     args.append("HEAD")
-            
+
             args.append("--")
             if isinstance(fn, list):
                 dname, fnames = self.vcs.splitPathList(fn)
@@ -132,60 +141,59 @@
             args.append("--patch")
             if stashName:
                 args.append(stashName)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         self.__process.kill()
         self.__process.setWorkingDirectory(repodir)
-        self.__process.start('git', args)
+        self.__process.start("git", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             return False
-        
+
         if diffMode == "work2stage2repo":
             self.__process2.kill()
             self.__process2.setWorkingDirectory(repodir)
-            self.__process2.start('git', args2)
+            self.__process2.start("git", args2)
             procStarted = self.__process2.waitForStarted(5000)
             if not procStarted:
                 return False
-        
+
         return True
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         if (
-            self.__process.state() == QProcess.ProcessState.NotRunning and
-            self.__process2.state() == QProcess.ProcessState.NotRunning
+            self.__process.state() == QProcess.ProcessState.NotRunning
+            and self.__process2.state() == QProcess.ProcessState.NotRunning
         ):
             self.finished.emit()
-    
+
     def getResult(self):
         """
         Public method to return the result data.
-        
+
         @return tuple of lists of string containing lines of the diff, the diff
             between stage and repo for 'work2stage2repo' mode (empty
             otherwise), the list of errors and a list of tuples of filenames
             and the line into the diff output.
         """
-        return (self.__output1, self.__output2, self.__errors,
-                self.__fileSeparators)
-    
+        return (self.__output1, self.__output2, self.__errors, self.__fileSeparators)
+
     def __processFileLine(self, line, isTopDiff):
         """
         Private slot to process a line giving the old/new file.
-        
+
         @param line line to be processed (string)
         @param isTopDiff flag indicating to show the output in the top
             output widget (boolean)
@@ -193,57 +201,57 @@
         prefix, filenames = line.split(" a/", 1)
         oldFile, newFile = filenames.split(" b/", 1)
         if isTopDiff:
-            self.__fileSeparators.append((oldFile.strip(), newFile.strip(),
-                                          len(self.__output1), -2))
+            self.__fileSeparators.append(
+                (oldFile.strip(), newFile.strip(), len(self.__output1), -2)
+            )
         else:
-            self.__fileSeparators.append((oldFile.strip(), newFile.strip(),
-                                          -2, len(self.__output2)))
-    
+            self.__fileSeparators.append(
+                (oldFile.strip(), newFile.strip(), -2, len(self.__output2))
+            )
+
     def __processLine(self, line, isTopDiff):
         """
         Private method to process one line of output.
-        
+
         @param line output line to process (string)
         @param isTopDiff flag indicating to show the output in the top
             output widget (boolean)
         """
         if line.startswith("diff --git"):
             self.__processFileLine(line, isTopDiff)
-        
+
         if isTopDiff:
             self.__output1.append(line)
         else:
             self.__output2.append(line)
-    
+
     def __readStdout(self, process):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
-        
+
         @param process reference to the process providing output
         @type QProcess
         """
         process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         isTopDiff = process == self.__process
-        
+
         while process.canReadLine():
-            line = str(process.readLine(), self.__ioEncoding,
-                       'replace')
+            line = str(process.readLine(), self.__ioEncoding, "replace")
             self.__processLine(line, isTopDiff)
-    
+
     def __readStderr(self, process):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
-        
+
         @param process reference to the process providing error output
         @type QProcess
         """
-        s = str(process.readAllStandardError(), self.__ioEncoding,
-                'replace')
+        s = str(process.readAllStandardError(), self.__ioEncoding, "replace")
         self.__errors.append(s)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,87 +9,83 @@
 
 from PyQt6.QtGui import QColor
 
-from EricGui.EricGenericDiffHighlighter import (
-    TERMINAL, EricGenericDiffHighlighter
-)
+from EricGui.EricGenericDiffHighlighter import TERMINAL, EricGenericDiffHighlighter
 
 
 class GitDiffHighlighter(EricGenericDiffHighlighter):
     """
     Class implementing a diff highlighter for Git.
     """
+
     def __init__(self, doc, whitespace=True):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         @param whitespace flag indicating to highlight whitespace
             at the end of a line (boolean)
         """
         self.whitespace = whitespace
-        
+
         super().__init__(doc)
 
     def generateRules(self):
         """
         Public method to generate the rule set.
         """
-        diffHeader = self.makeFormat(fg=self.textColor,
-                                     bg=self.headerColor)
-        diffHeaderBold = self.makeFormat(fg=self.textColor,
-                                         bg=self.headerColor,
-                                         bold=True)
-        diffContext = self.makeFormat(fg=self.textColor,
-                                      bg=self.contextColor)
+        diffHeader = self.makeFormat(fg=self.textColor, bg=self.headerColor)
+        diffHeaderBold = self.makeFormat(
+            fg=self.textColor, bg=self.headerColor, bold=True
+        )
+        diffContext = self.makeFormat(fg=self.textColor, bg=self.contextColor)
 
-        diffAdded = self.makeFormat(fg=self.textColor,
-                                    bg=self.addedColor)
-        diffRemoved = self.makeFormat(fg=self.textColor,
-                                      bg=self.removedColor)
+        diffAdded = self.makeFormat(fg=self.textColor, bg=self.addedColor)
+        diffRemoved = self.makeFormat(fg=self.textColor, bg=self.removedColor)
 
         if self.whitespace:
             try:
-                badWhitespace = self.makeFormat(fg=self.textColor,
-                                                bg=self.whitespaceColor)
+                badWhitespace = self.makeFormat(
+                    fg=self.textColor, bg=self.whitespaceColor
+                )
             except AttributeError:
-                badWhitespace = self.makeFormat(fg=self.textColor,
-                                                bg=QColor(255, 0, 0, 192))
+                badWhitespace = self.makeFormat(
+                    fg=self.textColor, bg=QColor(255, 0, 0, 192)
+                )
 
         # We specify the whitespace rule last so that it is
         # applied after the diff addition/removal rules.
-        diffOldRegex = TERMINAL(r'^--- ')
-        diffNewRegex = TERMINAL(r'^\+\+\+ ')
-        diffContextRegex = TERMINAL(r'^@@ ')
+        diffOldRegex = TERMINAL(r"^--- ")
+        diffNewRegex = TERMINAL(r"^\+\+\+ ")
+        diffContextRegex = TERMINAL(r"^@@ ")
+
+        diffHeader1Regex = TERMINAL(r"^diff --git a/.*b/.*")
+        diffHeader2Regex = TERMINAL(r"^index \S+\.\.\S+")
+        diffHeader3Regex = TERMINAL(r"^new file mode")
+        diffHeader4Regex = TERMINAL(r"^deleted file mode")
 
-        diffHeader1Regex = TERMINAL(r'^diff --git a/.*b/.*')
-        diffHeader2Regex = TERMINAL(r'^index \S+\.\.\S+')
-        diffHeader3Regex = TERMINAL(r'^new file mode')
-        diffHeader4Regex = TERMINAL(r'^deleted file mode')
-        
-        diffAddedRegex = TERMINAL(r'^\+')
-        diffRemovedRegex = TERMINAL(r'^-')
-        diffBarRegex = TERMINAL(r'^([ ]+.*)(\|[ ]+\d+[ ]+[+-]+)$')
-        diffStsRegex = (r'(.+\|.+?)(\d+)(.+?)([\+]*?)([-]*?)$')
-        diffSummaryRegex = (r'(\s+\d+ files changed[^\d]*)'
-                            r'(:?\d+ insertions[^\d]*)'
-                            r'(:?\d+ deletions.*)$')
+        diffAddedRegex = TERMINAL(r"^\+")
+        diffRemovedRegex = TERMINAL(r"^-")
+        diffBarRegex = TERMINAL(r"^([ ]+.*)(\|[ ]+\d+[ ]+[+-]+)$")
+        diffStsRegex = r"(.+\|.+?)(\d+)(.+?)([\+]*?)([-]*?)$"
+        diffSummaryRegex = (
+            r"(\s+\d+ files changed[^\d]*)"
+            r"(:?\d+ insertions[^\d]*)"
+            r"(:?\d+ deletions.*)$"
+        )
 
         if self.whitespace:
-            self.createRules((r'(..*?)(\s+)$', (None, badWhitespace)))
-        self.createRules((diffOldRegex, diffRemoved),
-                         (diffNewRegex, diffAdded),
-                         (diffContextRegex, diffContext),
-                         (diffBarRegex, (diffHeaderBold, diffHeader)),
-                         (diffHeader1Regex, diffHeader),
-                         (diffHeader2Regex, diffHeader),
-                         (diffHeader3Regex, diffHeader),
-                         (diffHeader4Regex, diffHeader),
-                         (diffAddedRegex, diffAdded),
-                         (diffRemovedRegex, diffRemoved),
-                         (diffStsRegex, (None, diffHeader,
-                                         None, diffHeader,
-                                         diffHeader)),
-                         (diffSummaryRegex, (diffHeader,
-                                             diffHeader,
-                                             diffHeader))
-                         )
+            self.createRules((r"(..*?)(\s+)$", (None, badWhitespace)))
+        self.createRules(
+            (diffOldRegex, diffRemoved),
+            (diffNewRegex, diffAdded),
+            (diffContextRegex, diffContext),
+            (diffBarRegex, (diffHeaderBold, diffHeader)),
+            (diffHeader1Regex, diffHeader),
+            (diffHeader2Regex, diffHeader),
+            (diffHeader3Regex, diffHeader),
+            (diffHeader4Regex, diffHeader),
+            (diffAddedRegex, diffAdded),
+            (diffRemovedRegex, diffRemoved),
+            (diffStsRegex, (None, diffHeader, None, diffHeader, diffHeader)),
+            (diffSummaryRegex, (diffHeader, diffHeader, diffHeader)),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffParser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitDiffParser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,26 +15,26 @@
     """
     Class implementing a class to store and parse diff output.
     """
-    HunkHeaderRegexp = re.compile(r'^@@ -([0-9,]+) \+([0-9,]+) @@(.*)',
-                                  re.DOTALL)
-    
+
+    HunkHeaderRegexp = re.compile(r"^@@ -([0-9,]+) \+([0-9,]+) @@(.*)", re.DOTALL)
+
     def __init__(self, diff):
         """
         Constructor
-        
+
         @param diff output of the diff command (list of string)
         """
         self.__diff = diff[:]
-        
+
         self.__headerLines = []
         self.__hunks = []
         self.__parsed = False
         # diff parsing is done on demand
-    
+
     def __initHunk(self):
         """
         Private method to initialize a hunk data structure.
-        
+
         @return hunk data structure (dictionary)
         """
         hunk = {
@@ -48,24 +48,24 @@
             "heading": "",
         }
         return hunk
-    
+
     def __parseRange(self, headerRange):
         """
         Private method to parse the hunk header range part.
-        
+
         @param headerRange hunk header range (string)
         @return tuple of hunk start and hunk length (integer, integer)
         """
-        if ',' in headerRange:
-            begin, end = headerRange.split(',', 1)
+        if "," in headerRange:
+            begin, end = headerRange.split(",", 1)
             return int(begin), int(end)
         else:
             return int(headerRange), 1
-    
+
     def __parseDiff(self):
         """
         Private method to parse the diff output.
-        
+
         @exception AssertionError raised when a malformed hunk header is
             encountered
         """
@@ -76,34 +76,34 @@
                     self.__headerLines.append(line)
                 else:
                     break
-            
+
             # step 2: break the rest into diff hunks
-            for lineIdx, line in enumerate(
-                    self.__diff[len(self.__headerLines):]):
+            for lineIdx, line in enumerate(self.__diff[len(self.__headerLines) :]):
                 # disect the hunk header line
                 m = self.HunkHeaderRegexp.match(line)
                 if m:
                     self.__hunks.append(self.__initHunk())
                     self.__hunks[-1]["start"] = lineIdx
-                    (self.__hunks[-1]["oldStart"],
-                     self.__hunks[-1]["oldCount"]) = self.__parseRange(
-                         m.group(1))
-                    (self.__hunks[-1]["newStart"],
-                     self.__hunks[-1]["newCount"]) = self.__parseRange(
-                         m.group(2))
+                    (
+                        self.__hunks[-1]["oldStart"],
+                        self.__hunks[-1]["oldCount"],
+                    ) = self.__parseRange(m.group(1))
+                    (
+                        self.__hunks[-1]["newStart"],
+                        self.__hunks[-1]["newCount"],
+                    ) = self.__parseRange(m.group(2))
                     self.__hunks[-1]["heading"] = m.group(3)
                 elif not self.__hunks:
-                    raise AssertionError("Malformed hunk header: '{0}'"
-                                         .format(line))
+                    raise AssertionError("Malformed hunk header: '{0}'".format(line))
                 self.__hunks[-1]["lines"].append(line)
             # step 3: calculate hunk end lines
             for hunk in self.__hunks:
                 hunk["end"] = hunk["start"] + len(hunk["lines"]) - 1
-    
+
     def __generateRange(self, start, count):
         """
         Private method to generate a hunk header range.
-        
+
         @param start start line (integer)
         @param count line count (integer)
         @return hunk header range (string)
@@ -112,12 +112,13 @@
             return "{0}".format(start)
         else:
             return "{0},{1}".format(start, count)
-    
-    def __generateHunkHeader(self, oldStart, oldCount, newStart, newCount,
-                             heading=os.linesep):
+
+    def __generateHunkHeader(
+        self, oldStart, oldCount, newStart, newCount, heading=os.linesep
+    ):
         """
         Private method to generate a hunk header line.
-        
+
         @param oldStart start line of the old part (integer)
         @param oldCount line count of the old part (integer)
         @param newStart start line of the new part (integer)
@@ -128,62 +129,63 @@
         return "@@ -{0} +{1} @@{2}".format(
             self.__generateRange(oldStart, oldCount),
             self.__generateRange(newStart, newCount),
-            heading)
-    
+            heading,
+        )
+
     def headerLength(self):
         """
         Public method to get the header length.
-        
+
         @return length of the header (integer)
         """
         self.__parseDiff()
         return len(self.__headerLines)
-    
+
     def createHunkPatch(self, lineIndex):
         """
         Public method to create a hunk based patch.
-        
+
         @param lineIndex line number of the hunk (integer)
         @return diff lines of the patch (string)
         """
         self.__parseDiff()
-        
+
         patch = self.__headerLines[:]
         for hunk in self.__hunks:
             if hunk["start"] <= lineIndex <= hunk["end"]:
                 patch.extend(hunk["lines"])
                 break
-        
+
         return "".join(patch)
-    
+
     def createLinesPatch(self, startIndex, endIndex, reverse=False):
         """
         Public method to create a selected lines based patch.
-        
+
         @param startIndex start line number (integer)
         @param endIndex end line number (integer)
         @param reverse flag indicating a reverse patch (boolean)
         @return diff lines of the patch (string)
         """
         self.__parseDiff()
-        
+
         ADDITION = "+"
         DELETION = "-"
         CONTEXT = " "
         NONEWLINE = "\\"
-        
+
         patch = []
         startOffset = 0
-        
+
         for hunk in self.__hunks:
             if hunk["end"] < startIndex:
                 # skip hunks before the selected lines
                 continue
-            
+
             if hunk["start"] > endIndex:
                 # done, exit the loop
                 break
-            
+
             counts = {
                 ADDITION: 0,
                 DELETION: 0,
@@ -191,37 +193,36 @@
             }
             previousLineSkipped = False
             processedLines = []
-            
-            for lineIndex, line in enumerate(hunk["lines"][1:],
-                                             start=hunk["start"] + 1):
+
+            for lineIndex, line in enumerate(
+                hunk["lines"][1:], start=hunk["start"] + 1
+            ):
                 lineType = line[0]
                 lineContent = line[1:]
-                
+
                 if not (startIndex <= lineIndex <= endIndex):
-                    if (
-                        (not reverse and lineType == ADDITION) or
-                        (reverse and lineType == DELETION)
+                    if (not reverse and lineType == ADDITION) or (
+                        reverse and lineType == DELETION
                     ):
                         previousLineSkipped = True
                         continue
-                    
-                    elif (
-                        (not reverse and lineType == DELETION) or
-                        (reverse and lineType == ADDITION)
+
+                    elif (not reverse and lineType == DELETION) or (
+                        reverse and lineType == ADDITION
                     ):
                         lineType = CONTEXT
-                
+
                 if lineType == NONEWLINE and previousLineSkipped:
                     continue
-                
+
                 processedLines.append(lineType + lineContent)
                 counts[lineType] += 1
                 previousLineSkipped = False
-            
+
             # hunks consisting of pure context lines are excluded
             if counts[ADDITION] == 0 and counts[DELETION] == 0:
                 continue
-            
+
             oldCount = counts[CONTEXT] + counts[DELETION]
             newCount = counts[CONTEXT] + counts[ADDITION]
             oldStart = hunk["oldStart"]
@@ -230,14 +231,16 @@
                 newStart += 1
             if newCount == 0:
                 newStart -= 1
-            
+
             startOffset += counts[ADDITION] - counts[DELETION]
-            
-            patch.append(self.__generateHunkHeader(oldStart, oldCount,
-                                                   newStart, newCount,
-                                                   hunk["heading"]))
+
+            patch.append(
+                self.__generateHunkHeader(
+                    oldStart, oldCount, newStart, newCount, hunk["heading"]
+                )
+            )
             patch.extend(processedLines)
-        
+
         if not patch:
             return ""
         else:
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitFetchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitFetchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,52 +17,51 @@
     """
     Class implementing a dialog to enter data for a Fetch operation.
     """
+
     def __init__(self, vcs, repodir, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the git object
         @param repodir directory name of the local repository (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
         self.__repodir = repodir
-        
+
         self.__all = self.tr("<All>")
         self.__custom = self.tr("<Custom>")
-        
+
         remoteUrlsList = self.__vcs.gitGetRemoteUrlsList(self.__repodir)
         self.__repos = {name: url for name, url in remoteUrlsList}
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         self.remotesComboBox.addItems(sorted(self.__repos.keys()))
         self.remotesComboBox.addItem(self.__all)
         self.remotesComboBox.addItem(self.__custom)
-        
+
         index = self.remotesComboBox.findText("origin")
         if index == -1:
             index = 0
         self.remotesComboBox.setCurrentIndex(index)
-        
-        localBranches = self.__vcs.gitGetBranchesList(
-            self.__repodir, withMaster=True)
+
+        localBranches = self.__vcs.gitGetBranchesList(self.__repodir, withMaster=True)
         self.localBranchComboBox.addItems([""] + sorted(localBranches))
         self.localBranchComboBox.setEnabled(False)
-    
+
     def __okButtonEnable(self):
         """
         Private slot to set the enabled state of the OK button.
         """
         self.__okButton.setEnabled(
-            self.remoteBranchesList.count() > 0 or
-            self.remotesComboBox.currentText() == self.__all
+            self.remoteBranchesList.count() > 0
+            or self.remotesComboBox.currentText() == self.__all
         )
-    
+
     def __updateButtonEnable(self):
         """
         Private slot to set the enabled state of the update button.
@@ -71,14 +70,14 @@
         enable = remote != self.__all
         if remote == self.__custom:
             enable = self.remoteEdit.text() != ""
-        
+
         self.updateButton.setEnabled(enable)
-    
+
     @pyqtSlot(str)
     def on_remotesComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle changes of the selected repository.
-        
+
         @param txt current text of the combo box (string)
         """
         self.remoteEdit.setReadOnly(txt != self.__custom)
@@ -87,35 +86,30 @@
         self.remoteBranchesList.clear()
         self.__updateButtonEnable()
         self.__okButtonEnable()
-        
+
         if txt not in [self.__all, self.__custom]:
-            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-                self.__repodir, txt)
+            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
             self.remoteBranchesList.addItems(sorted(remoteBranches))
-            
+
             if txt in self.__repos:
                 self.remoteEdit.setText(self.__repos[txt])
-    
+
     @pyqtSlot(str)
     def on_remoteEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the URL edit.
-        
+
         @param txt current text of the URL edit (string)
         """
         self.__updateButtonEnable()
-        
-        if (
-            self.remotesComboBox.currentText() == self.__custom and
-            txt != ""
-        ):
-            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-                self.__repodir, txt)
+
+        if self.remotesComboBox.currentText() == self.__custom and txt != "":
+            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
             self.remoteBranchesList.clear()
             self.remoteBranchesList.addItems(sorted(remoteBranches))
-        
+
         self.__okButtonEnable()
-    
+
     @pyqtSlot()
     def on_remoteBranchesList_itemSelectionChanged(self):
         """
@@ -124,16 +118,14 @@
         singleSelection = len(self.remoteBranchesList.selectedItems()) == 1
         self.localBranchComboBox.setEnabled(singleSelection)
         txt = (
-            self.remoteBranchesList.selectedItems()[0].text()
-            if singleSelection else
-            ""
+            self.remoteBranchesList.selectedItems()[0].text() if singleSelection else ""
         )
         index = self.localBranchComboBox.findText(txt)
         if index == -1:
             self.localBranchComboBox.setEditText(txt)
         else:
             self.localBranchComboBox.setCurrentIndex(index)
-    
+
     @pyqtSlot()
     def on_updateButton_clicked(self):
         """
@@ -143,24 +135,23 @@
         if remote == self.__all:
             # shouldn't happen
             return
-        
+
         if remote == self.__custom:
             remote = self.remoteEdit.text()
             if remote == "":
                 # shouldn't happen either
                 return
-        
-        remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-            self.__repodir, remote)
+
+        remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, remote)
         self.remoteBranchesList.clear()
         self.remoteBranchesList.addItems(sorted(remoteBranches))
-        
+
         self.__okButtonEnable()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple of remote name, remote url (for custom remotes),
             remote branches, local branch, a flag indicating to fetch from
             all repositories, a flag indicating to remove obsolete tracking
@@ -173,7 +164,7 @@
         remoteBranches = []
         allRepos = False
         localBranch = ""
-        
+
         remoteRepo = self.remotesComboBox.currentText()
         if remoteRepo == self.__all:
             allRepos = True
@@ -186,6 +177,13 @@
                 remoteBranches.append(itm.text())
             if len(remoteBranches) == 1:
                 localBranch = self.localBranchComboBox.currentText()
-        
-        return (remote, url, remoteBranches, localBranch, allRepos,
-                self.pruneCheckBox.isChecked(), self.tagsCheckBox.isChecked())
+
+        return (
+            remote,
+            url,
+            remoteBranches,
+            localBranch,
+            allRepos,
+            self.pruneCheckBox.isChecked(),
+            self.tagsCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,27 @@
     """
     Class implementing a dialog to select from a list.
     """
+
     def __init__(self, selections, parent=None):
         """
         Constructor
-        
+
         @param selections list of entries to select from (list of string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.selectionList.addItems(selections)
-    
+
     def getSelection(self):
         """
         Public method to return the selected entries.
-        
+
         @return list of selected entries (list of string)
         """
         selection = []
         for itm in self.selectionList.selectedItems():
             selection.append(itm.text())
-        
+
         return selection
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitLogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitLogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,15 +13,17 @@
 import contextlib
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSlot, Qt, QDate, QProcess, QTimer, QSize, QPoint
-)
-from PyQt6.QtGui import (
-    QColor, QPixmap, QPainter, QPen, QIcon, QTextCursor, QPalette
-)
+from PyQt6.QtCore import pyqtSlot, Qt, QDate, QProcess, QTimer, QSize, QPoint
+from PyQt6.QtGui import QColor, QPixmap, QPainter, QPen, QIcon, QTextCursor, QPalette
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QApplication,
-    QLineEdit, QMenu, QInputDialog
+    QWidget,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
+    QLineEdit,
+    QMenu,
+    QInputDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -38,21 +40,47 @@
 import UI.PixmapCache
 import Preferences
 
-COLORNAMES = ["red", "green", "purple", "cyan", "olive", "magenta",
-              "gray", "yellow", "darkred", "darkgreen", "darkblue",
-              "darkcyan", "darkmagenta", "blue"]
+COLORNAMES = [
+    "red",
+    "green",
+    "purple",
+    "cyan",
+    "olive",
+    "magenta",
+    "gray",
+    "yellow",
+    "darkred",
+    "darkgreen",
+    "darkblue",
+    "darkcyan",
+    "darkmagenta",
+    "blue",
+]
 COLORS = [str(QColor(x).name()) for x in COLORNAMES]
 
-LIGHTCOLORS = ["#aaaaff", "#7faa7f", "#ffaaaa", "#aaffaa", "#7f7faa",
-               "#ffaaff", "#aaffff", "#d5d579", "#ffaaff", "#d57979",
-               "#d579d5", "#79d5d5", "#d5d5d5", "#d5d500",
-               ]
+LIGHTCOLORS = [
+    "#aaaaff",
+    "#7faa7f",
+    "#ffaaaa",
+    "#aaffaa",
+    "#7f7faa",
+    "#ffaaff",
+    "#aaffff",
+    "#d5d579",
+    "#ffaaff",
+    "#d57979",
+    "#d579d5",
+    "#79d5d5",
+    "#d5d5d5",
+    "#d5d500",
+]
 
 
 class GitLogBrowserDialog(QWidget, Ui_GitLogBrowserDialog):
     """
     Class implementing a dialog to browse the log history.
     """
+
     IconColumn = 0
     CommitIdColumn = 1
     AuthorColumn = 2
@@ -62,73 +90,70 @@
     SubjectColumn = 6
     BranchColumn = 7
     TagsColumn = 8
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         windowFlags = self.windowFlags()
         windowFlags |= Qt.WindowType.WindowContextHelpButtonHint
         self.setWindowFlags(windowFlags)
-        
+
         self.mainSplitter.setSizes([300, 400])
         self.mainSplitter.setStretchFactor(0, 1)
         self.mainSplitter.setStretchFactor(1, 2)
         self.diffSplitter.setStretchFactor(0, 1)
         self.diffSplitter.setStretchFactor(1, 2)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
-        self.filesTree.header().setSortIndicator(
-            1, Qt.SortOrder.AscendingOrder)
-        
+        self.filesTree.header().setSortIndicator(1, Qt.SortOrder.AscendingOrder)
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of commits"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of commits"))
         self.refreshButton.setEnabled(False)
-        
+
         self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
         self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
         self.__findBackwards = False
-        
+
         self.modeComboBox.addItem(self.tr("Find"), "find")
         self.modeComboBox.addItem(self.tr("Filter"), "filter")
-        
+
         self.fieldCombo.addItem(self.tr("Commit ID"), "commitId")
         self.fieldCombo.addItem(self.tr("Author"), "author")
         self.fieldCombo.addItem(self.tr("Committer"), "committer")
         self.fieldCombo.addItem(self.tr("Subject"), "subject")
         self.fieldCombo.addItem(self.tr("File"), "file")
-        
+
         self.__logTreeNormalFont = self.logTree.font()
         self.__logTreeNormalFont.setBold(False)
         self.__logTreeBoldFont = self.logTree.font()
         self.__logTreeBoldFont.setBold(True)
         self.__logTreeHasDarkBackground = ericApp().usesDarkPalette()
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.document().setDefaultFont(font)
-        
+
         self.diffHighlighter = GitDiffHighlighter(self.diffEdit.document())
         self.__diffGenerator = GitDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.vcs = vcs
-        
+
         self.__detailsTemplate = self.tr(
             "<table>"
             "<tr><td><b>Commit ID</b></td><td>{0}</td></tr>"
@@ -141,50 +166,44 @@
             "{9}"
             "</table>"
         )
-        self.__parentsTemplate = self.tr(
-            "<tr><td><b>Parents</b></td><td>{0}</td></tr>"
-        )
+        self.__parentsTemplate = self.tr("<tr><td><b>Parents</b></td><td>{0}</td></tr>")
         self.__childrenTemplate = self.tr(
             "<tr><td><b>Children</b></td><td>{0}</td></tr>"
         )
         self.__branchesTemplate = self.tr(
             "<tr><td><b>Branches</b></td><td>{0}</td></tr>"
         )
-        self.__tagsTemplate = self.tr(
-            "<tr><td><b>Tags</b></td><td>{0}</td></tr>"
-        )
-        self.__mesageTemplate = self.tr(
-            "<tr><td><b>Message</b></td><td>{0}</td></tr>"
-        )
-        
+        self.__tagsTemplate = self.tr("<tr><td><b>Tags</b></td><td>{0}</td></tr>")
+        self.__mesageTemplate = self.tr("<tr><td><b>Message</b></td><td>{0}</td></tr>")
+
         self.__formatTemplate = (
-            'format:recordstart%n'
-            'commit|%h%n'
-            'parents|%p%n'
-            'author|%an%n'
-            'authormail|%ae%n'
-            'authordate|%ai%n'
-            'committer|%cn%n'
-            'committermail|%ce%n'
-            'committerdate|%ci%n'
-            'refnames|%d%n'
-            'subject|%s%n'
-            'bodystart%n'
-            '%b%n'
-            'bodyend%n'
+            "format:recordstart%n"
+            "commit|%h%n"
+            "parents|%p%n"
+            "author|%an%n"
+            "authormail|%ae%n"
+            "authordate|%ai%n"
+            "committer|%cn%n"
+            "committermail|%ce%n"
+            "committerdate|%ci%n"
+            "refnames|%d%n"
+            "subject|%s%n"
+            "bodystart%n"
+            "%b%n"
+            "bodyend%n"
         )
-        
+
         self.__filename = ""
         self.__isFile = False
         self.__selectedCommitIDs = []
         self.intercept = False
-        
+
         self.__initData()
-        
+
         self.fromDate.setDisplayFormat("yyyy-MM-dd")
         self.toDate.setDisplayFormat("yyyy-MM-dd")
         self.__resetUI()
-        
+
         # roles used in the log tree
         self.__subjectRole = Qt.ItemDataRole.UserRole
         self.__messageRole = Qt.ItemDataRole.UserRole + 1
@@ -194,120 +213,107 @@
         self.__branchesRole = Qt.ItemDataRole.UserRole + 5
         self.__authorMailRole = Qt.ItemDataRole.UserRole + 6
         self.__committerMailRole = Qt.ItemDataRole.UserRole + 7
-        
+
         # roles used in the file tree
         self.__diffFileLineRole = Qt.ItemDataRole.UserRole
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.flags = {
-            'A': self.tr('Added'),
-            'D': self.tr('Deleted'),
-            'M': self.tr('Modified'),
-            'C': self.tr('Copied'),
-            'R': self.tr('Renamed'),
-            'T': self.tr('Type changed'),
-            'U': self.tr('Unmerged'),
-            'X': self.tr('Unknown'),
+            "A": self.tr("Added"),
+            "D": self.tr("Deleted"),
+            "M": self.tr("Modified"),
+            "C": self.tr("Copied"),
+            "R": self.tr("Renamed"),
+            "T": self.tr("Type changed"),
+            "U": self.tr("Unmerged"),
+            "X": self.tr("Unknown"),
         }
-        
+
         self.__dotRadius = 8
         self.__rowHeight = 20
-        
-        self.logTree.setIconSize(
-            QSize(100 * self.__rowHeight, self.__rowHeight))
-        
+
+        self.logTree.setIconSize(QSize(100 * self.__rowHeight, self.__rowHeight))
+
         self.detailsEdit.anchorClicked.connect(self.__commitIdClicked)
-        
+
         self.__initLogTreeContextMenu()
         self.__initActionsMenu()
-        
+
         self.__finishCallbacks = []
-    
+
     def __addFinishCallback(self, callback):
         """
         Private method to add a method to be called once the process finished.
-        
+
         The callback methods are invoke in a FIFO style and are consumed. If
         a callback method needs to be called again, it must be added again.
-        
+
         @param callback callback method
         @type function
         """
         if callback not in self.__finishCallbacks:
             self.__finishCallbacks.append(callback)
-    
+
     def __initLogTreeContextMenu(self):
         """
         Private method to initialize the log tree context menu.
         """
         self.__logTreeMenu = QMenu()
-        
+
         # commit ID column
-        act = self.__logTreeMenu.addAction(
-            self.tr("Show Commit ID Column"))
-        act.setToolTip(self.tr(
-            "Press to show the commit ID column"))
+        act = self.__logTreeMenu.addAction(self.tr("Show Commit ID Column"))
+        act.setToolTip(self.tr("Press to show the commit ID column"))
         act.setCheckable(True)
-        act.setChecked(self.vcs.getPlugin().getPreferences(
-            "ShowCommitIdColumn"))
+        act.setChecked(self.vcs.getPlugin().getPreferences("ShowCommitIdColumn"))
         act.triggered.connect(self.__showCommitIdColumn)
-        
+
         # author and date columns
-        act = self.__logTreeMenu.addAction(
-            self.tr("Show Author Columns"))
-        act.setToolTip(self.tr(
-            "Press to show the author columns"))
+        act = self.__logTreeMenu.addAction(self.tr("Show Author Columns"))
+        act.setToolTip(self.tr("Press to show the author columns"))
         act.setCheckable(True)
-        act.setChecked(self.vcs.getPlugin().getPreferences(
-            "ShowAuthorColumns"))
+        act.setChecked(self.vcs.getPlugin().getPreferences("ShowAuthorColumns"))
         act.triggered.connect(self.__showAuthorColumns)
-        
+
         # committer and commit date columns
-        act = self.__logTreeMenu.addAction(
-            self.tr("Show Committer Columns"))
-        act.setToolTip(self.tr(
-            "Press to show the committer columns"))
+        act = self.__logTreeMenu.addAction(self.tr("Show Committer Columns"))
+        act.setToolTip(self.tr("Press to show the committer columns"))
         act.setCheckable(True)
-        act.setChecked(self.vcs.getPlugin().getPreferences(
-            "ShowCommitterColumns"))
+        act.setChecked(self.vcs.getPlugin().getPreferences("ShowCommitterColumns"))
         act.triggered.connect(self.__showCommitterColumns)
-        
+
         # branches column
-        act = self.__logTreeMenu.addAction(
-            self.tr("Show Branches Column"))
-        act.setToolTip(self.tr(
-            "Press to show the branches column"))
+        act = self.__logTreeMenu.addAction(self.tr("Show Branches Column"))
+        act.setToolTip(self.tr("Press to show the branches column"))
         act.setCheckable(True)
-        act.setChecked(self.vcs.getPlugin().getPreferences(
-            "ShowBranchesColumn"))
+        act.setChecked(self.vcs.getPlugin().getPreferences("ShowBranchesColumn"))
         act.triggered.connect(self.__showBranchesColumn)
-        
+
         # tags column
-        act = self.__logTreeMenu.addAction(
-            self.tr("Show Tags Column"))
-        act.setToolTip(self.tr(
-            "Press to show the Tags column"))
+        act = self.__logTreeMenu.addAction(self.tr("Show Tags Column"))
+        act.setToolTip(self.tr("Press to show the Tags column"))
         act.setCheckable(True)
-        act.setChecked(self.vcs.getPlugin().getPreferences(
-            "ShowTagsColumn"))
+        act.setChecked(self.vcs.getPlugin().getPreferences("ShowTagsColumn"))
         act.triggered.connect(self.__showTagsColumn)
-        
+
         # set column visibility as configured
-        self.__showCommitIdColumn(self.vcs.getPlugin().getPreferences(
-            "ShowCommitIdColumn"))
-        self.__showAuthorColumns(self.vcs.getPlugin().getPreferences(
-            "ShowAuthorColumns"))
-        self.__showCommitterColumns(self.vcs.getPlugin().getPreferences(
-            "ShowCommitterColumns"))
-        self.__showBranchesColumn(self.vcs.getPlugin().getPreferences(
-            "ShowBranchesColumn"))
-        self.__showTagsColumn(self.vcs.getPlugin().getPreferences(
-            "ShowTagsColumn"))
-    
+        self.__showCommitIdColumn(
+            self.vcs.getPlugin().getPreferences("ShowCommitIdColumn")
+        )
+        self.__showAuthorColumns(
+            self.vcs.getPlugin().getPreferences("ShowAuthorColumns")
+        )
+        self.__showCommitterColumns(
+            self.vcs.getPlugin().getPreferences("ShowCommitterColumns")
+        )
+        self.__showBranchesColumn(
+            self.vcs.getPlugin().getPreferences("ShowBranchesColumn")
+        )
+        self.__showTagsColumn(self.vcs.getPlugin().getPreferences("ShowTagsColumn"))
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -315,48 +321,62 @@
         self.__actionsMenu = QMenu()
         self.__actionsMenu.setTearOffEnabled(True)
         self.__actionsMenu.setToolTipsVisible(True)
-        
+
         self.__cherryAct = self.__actionsMenu.addAction(
-            self.tr("Copy Commits"), self.__cherryActTriggered)
-        self.__cherryAct.setToolTip(self.tr(
-            "Cherry-pick the selected commits to the current branch"))
-        
+            self.tr("Copy Commits"), self.__cherryActTriggered
+        )
+        self.__cherryAct.setToolTip(
+            self.tr("Cherry-pick the selected commits to the current branch")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__tagAct = self.__actionsMenu.addAction(
-            self.tr("Tag"), self.__tagActTriggered)
+            self.tr("Tag"), self.__tagActTriggered
+        )
         self.__tagAct.setToolTip(self.tr("Tag the selected commit"))
-        
+
         self.__branchAct = self.__actionsMenu.addAction(
-            self.tr("Branch"), self.__branchActTriggered)
-        self.__branchAct.setToolTip(self.tr(
-            "Create a new branch at the selected commit."))
+            self.tr("Branch"), self.__branchActTriggered
+        )
+        self.__branchAct.setToolTip(
+            self.tr("Create a new branch at the selected commit.")
+        )
         self.__branchSwitchAct = self.__actionsMenu.addAction(
-            self.tr("Branch && Switch"), self.__branchSwitchActTriggered)
-        self.__branchSwitchAct.setToolTip(self.tr(
-            "Create a new branch at the selected commit and switch"
-            " the work tree to it."))
-        
+            self.tr("Branch && Switch"), self.__branchSwitchActTriggered
+        )
+        self.__branchSwitchAct.setToolTip(
+            self.tr(
+                "Create a new branch at the selected commit and switch"
+                " the work tree to it."
+            )
+        )
+
         self.__switchAct = self.__actionsMenu.addAction(
-            self.tr("Switch"), self.__switchActTriggered)
-        self.__switchAct.setToolTip(self.tr(
-            "Switch the working directory to the selected commit"))
+            self.tr("Switch"), self.__switchActTriggered
+        )
+        self.__switchAct.setToolTip(
+            self.tr("Switch the working directory to the selected commit")
+        )
         self.__actionsMenu.addSeparator()
-        
+
         self.__shortlogAct = self.__actionsMenu.addAction(
-            self.tr("Show Short Log"), self.__shortlogActTriggered)
-        self.__shortlogAct.setToolTip(self.tr(
-            "Show a dialog with a log output for release notes"))
-        
+            self.tr("Show Short Log"), self.__shortlogActTriggered
+        )
+        self.__shortlogAct.setToolTip(
+            self.tr("Show a dialog with a log output for release notes")
+        )
+
         self.__describeAct = self.__actionsMenu.addAction(
-            self.tr("Describe"), self.__describeActTriggered)
-        self.__describeAct.setToolTip(self.tr(
-            "Show the most recent tag reachable from a commit"))
-        
-        self.actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
+            self.tr("Describe"), self.__describeActTriggered
+        )
+        self.__describeAct.setToolTip(
+            self.tr("Show the most recent tag reachable from a commit")
+        )
+
+        self.actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
         self.actionsButton.setMenu(self.__actionsMenu)
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
@@ -364,48 +384,48 @@
         self.__maxDate = QDate()
         self.__minDate = QDate()
         self.__filterLogsEnabled = True
-        
-        self.buf = []        # buffer for stdout
+
+        self.buf = []  # buffer for stdout
         self.diff = None
         self.__started = False
         self.__skipEntries = 0
         self.projectMode = False
-        
+
         # attributes to store log graph data
         self.__commitIds = []
         self.__commitColors = {}
         self.__commitColor = 0
-        
+
         self.__projectRevision = ""
-        
+
         self.__childrenInfo = collections.defaultdict(list)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
+        self.vcs.getPlugin().setPreferences("LogBrowserGeometry", self.saveGeometry())
         self.vcs.getPlugin().setPreferences(
-            "LogBrowserGeometry", self.saveGeometry())
-        self.vcs.getPlugin().setPreferences(
-            "LogBrowserSplitterStates", [
+            "LogBrowserSplitterStates",
+            [
                 self.mainSplitter.saveState(),
                 self.detailsSplitter.saveState(),
                 self.diffSplitter.saveState(),
-            ]
+            ],
         )
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -413,9 +433,9 @@
         self.__reloadGeometry()
         self.__restoreSplitterStates()
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __reloadGeometry(self):
         """
         Private method to restore the geometry.
@@ -426,19 +446,18 @@
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-    
+
     def __restoreSplitterStates(self):
         """
         Private method to restore the state of the various splitters.
         """
-        states = self.vcs.getPlugin().getPreferences(
-            "LogBrowserSplitterStates")
+        states = self.vcs.getPlugin().getPreferences("LogBrowserSplitterStates")
         if len(states) == 3:
             # we have three splitters
             self.mainSplitter.restoreState(states[0])
             self.detailsSplitter.restoreState(states[1])
             self.diffSplitter.restoreState(states[2])
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
@@ -446,29 +465,27 @@
         self.fromDate.setDate(QDate.currentDate())
         self.toDate.setDate(QDate.currentDate())
         self.fieldCombo.setCurrentIndex(self.fieldCombo.findData("subject"))
-        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
-            "LogLimit"))
-        self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences(
-            "StopLogOnCopy"))
-        
+        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit"))
+        self.stopCheckBox.setChecked(
+            self.vcs.getPlugin().getPreferences("StopLogOnCopy")
+        )
+
         self.logTree.clear()
-    
+
     def __resizeColumnsLog(self):
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __resizeColumnsFiles(self):
         """
         Private method to resize the changed files tree columns.
         """
-        self.filesTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.filesTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.filesTree.header().setStretchLastSection(True)
-    
+
     def __resortFiles(self):
         """
         Private method to resort the changed files tree.
@@ -476,11 +493,11 @@
         self.filesTree.setSortingEnabled(True)
         self.filesTree.sortItems(1, Qt.SortOrder.AscendingOrder)
         self.filesTree.setSortingEnabled(False)
-    
+
     def __getColor(self, n):
         """
         Private method to get the (rotating) name of the color given an index.
-        
+
         @param n color index
         @type int
         @return color name
@@ -490,11 +507,11 @@
             return LIGHTCOLORS[n % len(LIGHTCOLORS)]
         else:
             return COLORS[n % len(COLORS)]
-    
+
     def __generateEdges(self, commitId, parents):
         """
         Private method to generate edge info for the give data.
-        
+
         @param commitId commit id to calculate edge info for (string)
         @param parents list of parent commits (list of strings)
         @return tuple containing the column and color index for
@@ -507,15 +524,15 @@
             self.__commitIds.append(commitId)
             self.__commitColors[commitId] = self.__commitColor
             self.__commitColor += 1
-        
+
         col = self.__commitIds.index(commitId)
         color = self.__commitColors.pop(commitId)
         nextCommitIds = self.__commitIds[:]
-        
+
         # add parents to next
         addparents = [p for p in parents if p not in nextCommitIds]
-        nextCommitIds[col:col + 1] = addparents
-        
+        nextCommitIds[col : col + 1] = addparents
+
         # set colors for the parents
         for i, p in enumerate(addparents):
             if not i:
@@ -523,30 +540,35 @@
             else:
                 self.__commitColors[p] = self.__commitColor
                 self.__commitColor += 1
-        
+
         # add edges to the graph
         edges = []
         if parents:
             for ecol, ecommitId in enumerate(self.__commitIds):
                 if ecommitId in nextCommitIds:
                     edges.append(
-                        (ecol, nextCommitIds.index(ecommitId),
-                         self.__commitColors[ecommitId]))
+                        (
+                            ecol,
+                            nextCommitIds.index(ecommitId),
+                            self.__commitColors[ecommitId],
+                        )
+                    )
                 elif ecommitId == commitId:
                     for p in parents:
                         edges.append(
-                            (ecol, nextCommitIds.index(p),
-                             self.__commitColors[p]))
-        
+                            (ecol, nextCommitIds.index(p), self.__commitColors[p])
+                        )
+
         self.__commitIds = nextCommitIds
         return col, color, edges
-    
-    def __generateIcon(self, column, color, bottomedges, topedges, dotColor,
-                       currentCommit):
+
+    def __generateIcon(
+        self, column, color, bottomedges, topedges, dotColor, currentCommit
+    ):
         """
         Private method to generate an icon containing the revision tree for the
         given data.
-        
+
         @param column column index of the revision (integer)
         @param color color of the node (integer)
         @param bottomedges list of edges for the bottom of the node
@@ -558,30 +580,30 @@
             current commit (boolean)
         @return icon for the node (QIcon)
         """
+
         def col2x(col, radius):
             """
             Local function to calculate a x-position for a column.
-            
+
             @param col column number (integer)
             @param radius radius of the indicator circle (integer)
             """
             return int(1.2 * radius) * col + radius // 2 + 3
-        
+
         radius = self.__dotRadius
         w = len(bottomedges) * radius + 20
         h = self.__rowHeight
-        
+
         dot_x = col2x(column, radius) - radius // 2
         dot_y = h // 2
-        
+
         pix = QPixmap(w, h)
-        pix.fill(QColor(0, 0, 0, 0))        # draw transparent background
+        pix.fill(QColor(0, 0, 0, 0))  # draw transparent background
         painter = QPainter(pix)
         painter.setRenderHint(QPainter.RenderHint.Antialiasing)
-        
+
         # draw the revision history lines
-        for y1, y2, lines in ((0, h, bottomedges),
-                              (-h, 0, topedges)):
+        for y1, y2, lines in ((0, h, bottomedges), (-h, 0, topedges)):
             if lines:
                 for start, end, ecolor in lines:
                     lpen = QPen(QColor(self.__getColor(ecolor)))
@@ -590,12 +612,12 @@
                     x1 = col2x(start, radius)
                     x2 = col2x(end, radius)
                     painter.drawLine(x1, dot_y + y1, x2, dot_y + y2)
-        
+
         penradius = 1
         pencolor = self.logTree.palette().color(QPalette.ColorRole.Text)
-        
+
         dot_y = (h // 2) - radius // 2
-        
+
         # draw a dot for the revision
         if currentCommit:
             # enlarge dot for the current revision
@@ -610,53 +632,64 @@
         painter.drawEllipse(dot_x, dot_y, radius, radius)
         painter.end()
         return QIcon(pix)
-    
+
     def __identifyProject(self):
         """
         Private method to determine the revision of the project directory.
         """
         errMsg = ""
-        
+
         args = self.vcs.initCommand("show")
-        args.append("--abbrev={0}".format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
         args.append("--format=%h")
         args.append("--no-patch")
         args.append("HEAD")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
             else:
                 if not finished:
-                    errMsg = self.tr(
-                        "The git process did not finish within 30s.")
+                    errMsg = self.tr("The git process did not finish within 30s.")
         else:
             errMsg = self.tr("Could not start the git executable.")
-        
+
         if errMsg:
-            EricMessageBox.critical(
-                self,
-                self.tr("Git Error"),
-                errMsg)
-        
+            EricMessageBox.critical(self, self.tr("Git Error"), errMsg)
+
         if output:
             self.__projectRevision = output.strip()
-    
-    def __generateLogItem(self, author, date, committer, commitDate, subject,
-                          message, commitId, changedPaths, parents, refnames,
-                          authorMail, committerMail):
+
+    def __generateLogItem(
+        self,
+        author,
+        date,
+        committer,
+        commitDate,
+        subject,
+        message,
+        commitId,
+        changedPaths,
+        parents,
+        refnames,
+        authorMail,
+        committerMail,
+    ):
         """
         Private method to generate a log tree entry.
-        
+
         @param author author info (string)
         @param date date info (string)
         @param committer committer info (string)
@@ -692,9 +725,10 @@
                     else:
                         branches.append(name)
                     allBranches.append(name)
-        
+
         logMessageColumnWidth = self.vcs.getPlugin().getPreferences(
-            "LogSubjectColumnWidth")
+            "LogSubjectColumnWidth"
+        )
         msgtxt = subject
         if logMessageColumnWidth and len(msgtxt) > logMessageColumnWidth:
             msgtxt = "{0}...".format(msgtxt[:logMessageColumnWidth])
@@ -710,10 +744,10 @@
             ", ".join(tags),
         ]
         itm = QTreeWidgetItem(self.logTree, columnLabels)
-        
+
         parents = [p.strip() for p in parents.split()]
         column, color, edges = self.__generateEdges(commitId, parents)
-        
+
         itm.setData(0, self.__subjectRole, subject)
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changedPaths)
@@ -727,26 +761,31 @@
             itm.setData(0, self.__parentsRole, parents)
             for parent in parents:
                 self.__childrenInfo[parent].append(commitId)
-        
+
         topedges = (
-            self.logTree.topLevelItem(
-                self.logTree.indexOfTopLevelItem(itm) - 1
-            ).data(0, self.__edgesRole)
-            if self.logTree.topLevelItemCount() > 1 else
-            None
+            self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1).data(
+                0, self.__edgesRole
+            )
+            if self.logTree.topLevelItemCount() > 1
+            else None
         )
-        
-        icon = self.__generateIcon(column, color, edges, topedges,
-                                   QColor("blue"),
-                                   commitId == self.__projectRevision)
+
+        icon = self.__generateIcon(
+            column,
+            color,
+            edges,
+            topedges,
+            QColor("blue"),
+            commitId == self.__projectRevision,
+        )
         itm.setIcon(0, icon)
-        
+
         return itm
-    
+
     def __generateFileItem(self, action, path, copyfrom, additions, deletions):
         """
         Private method to generate a changed files tree entry.
-        
+
         @param action indicator for the change action ("A", "C", "D", "M",
             "R", "T", "U", "X")
         @param path path of the file in the repository (string)
@@ -759,174 +798,177 @@
             # includes confidence level
             confidence = int(action[1:])
             actionTxt = self.tr("{0} ({1}%)", "action, confidence").format(
-                self.flags[action[0]], confidence)
+                self.flags[action[0]], confidence
+            )
         else:
             actionTxt = self.flags[action]
-        itm = QTreeWidgetItem(self.filesTree, [
-            actionTxt,
-            path,
-            str(additions),
-            str(deletions),
-            copyfrom,
-        ])
-        
+        itm = QTreeWidgetItem(
+            self.filesTree,
+            [
+                actionTxt,
+                path,
+                str(additions),
+                str(deletions),
+                copyfrom,
+            ],
+        )
+
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignRight)
-        
+
         return itm
-    
+
     def __getLogEntries(self, skip=0, noEntries=0):
         """
         Private method to retrieve log entries from the repository.
-        
+
         @param skip number of log entries to skip (integer)
         @param noEntries number of entries to get (0 = default) (int)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         self.buf = []
         self.cancelled = False
         self.errors.clear()
         self.intercept = False
-        
+
         if noEntries == 0:
             noEntries = self.limitSpinBox.value()
-        
+
         args = self.vcs.initCommand("log")
-        args.append('--max-count={0}'.format(noEntries))
-        args.append('--numstat')
-        args.append('--abbrev={0}'.format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
+        args.append("--max-count={0}".format(noEntries))
+        args.append("--numstat")
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
         if self.vcs.getPlugin().getPreferences("FindCopiesHarder"):
-            args.append('--find-copies-harder')
-        args.append('--format={0}'.format(self.__formatTemplate))
-        args.append('--full-history')
-        args.append('--all')
-        args.append('--skip={0}'.format(skip))
+            args.append("--find-copies-harder")
+        args.append("--format={0}".format(self.__formatTemplate))
+        args.append("--full-history")
+        args.append("--all")
+        args.append("--skip={0}".format(skip))
         if not self.projectMode:
             if not self.stopCheckBox.isChecked():
-                args.append('--follow')
-            args.append('--')
+                args.append("--follow")
+            args.append("--")
             args.append(self.__filename)
-        
+
         self.__process.kill()
-        
+
         self.__process.setWorkingDirectory(self.repodir)
-        
-        self.__process.start('git', args)
+
+        self.__process.start("git", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
+
     def start(self, fn, isFile=False, noEntries=0):
         """
         Public slot to start the git log command.
-        
+
         @param fn filename to show the log for (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         @param noEntries number of entries to get (0 = default) (int)
         """
         self.__isFile = isFile
-        
+
         self.sbsSelectLabel.clear()
-        
+
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.__initData()
-        
+
         self.__filename = fn
         self.dname, self.fname = self.vcs.splitPath(fn)
-        
+
         # find the root of the repo
         self.repodir = self.dname
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
-        self.projectMode = (self.fname == "." and self.dname == self.repodir)
+
+        self.projectMode = self.fname == "." and self.dname == self.repodir
         self.stopCheckBox.setDisabled(self.projectMode or self.fname == ".")
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__started = True
         self.__identifyProject()
         self.__getLogEntries(noEntries=noEntries)
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__processBuffer()
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-        
+
         while self.__finishCallbacks:
             self.__finishCallbacks.pop(0)()
-    
+
     def __processBufferItem(self, logEntry):
         """
         Private method to process a log entry.
-        
+
         @param logEntry dictionary as generated by __processBuffer
         """
         self.__generateLogItem(
-            logEntry["author"], logEntry["authordate"],
-            logEntry["committer"], logEntry["committerdate"],
-            logEntry["subject"], logEntry["body"],
-            logEntry["commit"], logEntry["changed_files"],
-            logEntry["parents"], logEntry["refnames"],
-            logEntry["authormail"], logEntry["committermail"]
+            logEntry["author"],
+            logEntry["authordate"],
+            logEntry["committer"],
+            logEntry["committerdate"],
+            logEntry["subject"],
+            logEntry["body"],
+            logEntry["commit"],
+            logEntry["changed_files"],
+            logEntry["parents"],
+            logEntry["refnames"],
+            logEntry["authormail"],
+            logEntry["committermail"],
         )
         for date in [logEntry["authordate"], logEntry["committerdate"]]:
             dt = QDate.fromString(date, Qt.DateFormat.ISODate)
-            if (
-                not self.__maxDate.isValid() and
-                not self.__minDate.isValid()
-            ):
+            if not self.__maxDate.isValid() and not self.__minDate.isValid():
                 self.__maxDate = dt
                 self.__minDate = dt
             else:
@@ -934,7 +976,7 @@
                     self.__maxDate = dt
                 if self.__minDate > dt:
                     self.__minDate = dt
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the git log command.
@@ -942,7 +984,7 @@
         noEntries = 0
         logEntry = {"changed_files": []}
         descriptionBody = False
-        
+
         for line in self.buf:
             line = line.rstrip()
             if line == "recordstart":
@@ -980,46 +1022,63 @@
                             dst = head + middleDst.strip() + tail
                         else:
                             src, dst = changeInfo[2].split("=>")
-                        logEntry["changed_files"].append({
-                            "action": "C",
-                            "added": changeInfo[0].strip(),
-                            "deleted": changeInfo[1].strip(),
-                            "path": dst.strip(),
-                            "copyfrom": src.strip(),
-                        })
+                        logEntry["changed_files"].append(
+                            {
+                                "action": "C",
+                                "added": changeInfo[0].strip(),
+                                "deleted": changeInfo[1].strip(),
+                                "path": dst.strip(),
+                                "copyfrom": src.strip(),
+                            }
+                        )
                     else:
-                        logEntry["changed_files"].append({
-                            "action": "M",
-                            "added": changeInfo[0].strip(),
-                            "deleted": changeInfo[1].strip(),
-                            "path": changeInfo[2].strip(),
-                            "copyfrom": "",
-                        })
+                        logEntry["changed_files"].append(
+                            {
+                                "action": "M",
+                                "added": changeInfo[0].strip(),
+                                "deleted": changeInfo[1].strip(),
+                                "path": changeInfo[2].strip(),
+                                "copyfrom": "",
+                            }
+                        )
             else:
                 try:
                     key, value = line.split("|", 1)
                 except ValueError:
                     key = ""
                     value = line
-                if key in ("commit", "parents", "author", "authormail",
-                           "authordate", "committer", "committermail",
-                           "committerdate", "refnames", "subject"):
+                if key in (
+                    "commit",
+                    "parents",
+                    "author",
+                    "authormail",
+                    "authordate",
+                    "committer",
+                    "committermail",
+                    "committerdate",
+                    "refnames",
+                    "subject",
+                ):
                     logEntry[key] = value.strip()
         if len(logEntry) > 1:
             self.__processBufferItem(logEntry)
             noEntries += 1
-        
+
         self.__resizeColumnsLog()
-        
+
         if self.__started:
             if self.__selectedCommitIDs:
-                self.logTree.setCurrentItem(self.logTree.findItems(
-                    self.__selectedCommitIDs[0], Qt.MatchFlag.MatchExactly,
-                    self.CommitIdColumn)[0])
+                self.logTree.setCurrentItem(
+                    self.logTree.findItems(
+                        self.__selectedCommitIDs[0],
+                        Qt.MatchFlag.MatchExactly,
+                        self.CommitIdColumn,
+                    )[0]
+                )
             else:
                 self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             self.__started = False
-        
+
         self.__skipEntries += noEntries
         if noEntries < self.limitSpinBox.value() and not self.cancelled:
             self.nextButton.setEnabled(False)
@@ -1027,7 +1086,7 @@
         else:
             self.nextButton.setEnabled(True)
             self.limitSpinBox.setEnabled(True)
-        
+
         # update the log filters
         self.__filterLogsEnabled = False
         self.fromDate.setMinimumDate(self.__minDate)
@@ -1036,114 +1095,115 @@
         self.toDate.setMinimumDate(self.__minDate)
         self.toDate.setMaximumDate(self.__maxDate)
         self.toDate.setDate(self.__maxDate)
-        
+
         self.__filterLogsEnabled = True
         if self.__actionMode() == "filter":
             self.__filterLogs()
-        
+
         self.__updateToolMenuActions()
-        
+
         # restore selected items
         if self.__selectedCommitIDs:
             for commitID in self.__selectedCommitIDs:
                 items = self.logTree.findItems(
-                    commitID, Qt.MatchFlag.MatchExactly, self.CommitIdColumn)
+                    commitID, Qt.MatchFlag.MatchExactly, self.CommitIdColumn
+                )
                 if items:
                     items[0].setSelected(True)
             self.__selectedCommitIDs = []
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into a buffer.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            line = str(self.__process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            line = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.buf.append(line)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showError(s)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-        
+
         # show input in case the process asked for some input
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the log.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton.setEnabled(False)
-        
+
         # save the selected items commit IDs
         self.__selectedCommitIDs = []
         for item in self.logTree.selectedItems():
             self.__selectedCommitIDs.append(item.text(self.CommitIdColumn))
-        
-        self.start(self.__filename, isFile=self.__isFile,
-                   noEntries=self.logTree.topLevelItemCount())
-    
+
+        self.start(
+            self.__filename,
+            isFile=self.__isFile,
+            noEntries=self.logTree.topLevelItemCount(),
+        )
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -1151,7 +1211,7 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
@@ -1159,23 +1219,23 @@
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
         self.errorGroup.show()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -1183,11 +1243,11 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     def __prepareFieldSearch(self):
         """
         Private slot to prepare the filed search data.
-        
+
         @return tuple of field index, search expression and flag indicating
             that the field index is a data role (integer, string, boolean)
         """
@@ -1203,8 +1263,7 @@
             fieldIndex = self.CommitIdColumn
             txt = self.rxEdit.text()
             if txt.startswith("^"):
-                searchRx = re.compile(r"^\s*{0}".format(txt[1:]),
-                                      re.IGNORECASE)
+                searchRx = re.compile(r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
             else:
                 searchRx = re.compile(txt, re.IGNORECASE)
         elif txt == "file":
@@ -1215,9 +1274,9 @@
             fieldIndex = self.__subjectRole
             searchRx = re.compile(self.rxEdit.text(), re.IGNORECASE)
             indexIsRole = True
-        
+
         return fieldIndex, searchRx, indexIsRole
-    
+
     def __filterLogs(self):
         """
         Private method to filter the log entries.
@@ -1226,7 +1285,7 @@
             from_ = self.fromDate.date().toString("yyyy-MM-dd")
             to_ = self.toDate.date().addDays(1).toString("yyyy-MM-dd")
             fieldIndex, searchRx, indexIsRole = self.__prepareFieldSearch()
-            
+
             visibleItemCount = self.logTree.topLevelItemCount()
             currentItem = self.logTree.currentItem()
             for topIndex in range(self.logTree.topLevelItemCount()):
@@ -1235,8 +1294,8 @@
                     if fieldIndex == self.__changesRole:
                         changes = topItem.data(0, self.__changesRole)
                         txt = "\n".join(
-                            [c["path"] for c in changes] +
-                            [c["copyfrom"] for c in changes]
+                            [c["path"] for c in changes]
+                            + [c["copyfrom"] for c in changes]
                         )
                     else:
                         # Filter based on complete subject text
@@ -1244,9 +1303,9 @@
                 else:
                     txt = topItem.text(fieldIndex)
                 if (
-                    topItem.text(self.DateColumn) <= to_ and
-                    topItem.text(self.DateColumn) >= from_ and
-                    searchRx.search(txt) is not None
+                    topItem.text(self.DateColumn) <= to_
+                    and topItem.text(self.DateColumn) >= from_
+                    and searchRx.search(txt) is not None
                 ):
                     topItem.setHidden(False)
                     if topItem is currentItem:
@@ -1257,9 +1316,9 @@
                         self.filesTree.clear()
                     visibleItemCount -= 1
             self.logTree.header().setSectionHidden(
-                self.IconColumn,
-                visibleItemCount != self.logTree.topLevelItemCount())
-    
+                self.IconColumn, visibleItemCount != self.logTree.topLevelItemCount()
+            )
+
     def __updateSbsSelectLabel(self):
         """
         Private slot to update the enabled status of the diff buttons.
@@ -1275,24 +1334,30 @@
                     parentLinks = []
                     for index in range(len(parents)):
                         parentLinks.append(
-                            '<a href="sbsdiff:{0}_{1}">&nbsp;{2}&nbsp;</a>'
-                            .format(parents[index], commit2, index + 1))
+                            '<a href="sbsdiff:{0}_{1}">&nbsp;{2}&nbsp;</a>'.format(
+                                parents[index], commit2, index + 1
+                            )
+                        )
                     self.sbsSelectLabel.setText(
-                        self.tr('Side-by-Side Diff to Parent {0}').format(
-                            " ".join(parentLinks)))
+                        self.tr("Side-by-Side Diff to Parent {0}").format(
+                            " ".join(parentLinks)
+                        )
+                    )
             elif len(selectedItems) == 2:
                 commit2 = selectedItems[0].text(self.CommitIdColumn)
                 commit1 = selectedItems[1].text(self.CommitIdColumn)
                 index2 = self.logTree.indexOfTopLevelItem(selectedItems[0])
                 index1 = self.logTree.indexOfTopLevelItem(selectedItems[1])
-                
+
                 if index2 < index1:
                     # swap to always compare old to new
                     commit1, commit2 = commit2, commit1
-                self.sbsSelectLabel.setText(self.tr(
-                    '<a href="sbsdiff:{0}_{1}">Side-by-Side Compare</a>')
-                    .format(commit1, commit2))
-    
+                self.sbsSelectLabel.setText(
+                    self.tr(
+                        '<a href="sbsdiff:{0}_{1}">Side-by-Side Compare</a>'
+                    ).format(commit1, commit2)
+                )
+
     def __updateToolMenuActions(self):
         """
         Private slot to update the status of the tool menu actions and
@@ -1307,11 +1372,11 @@
             self.__branchAct.setEnabled(selectCount == 1)
             self.__branchSwitchAct.setEnabled(selectCount == 1)
             self.__shortlogAct.setEnabled(selectCount == 1)
-            
+
             self.actionsButton.setEnabled(True)
         else:
             self.actionsButton.setEnabled(False)
-    
+
     def __updateDetailsAndFiles(self):
         """
         Private slot to update the details and file changes panes.
@@ -1319,11 +1384,10 @@
         self.detailsEdit.clear()
         self.filesTree.clear()
         self.__diffUpdatesFiles = False
-        
+
         selectedItems = self.logTree.selectedItems()
         if len(selectedItems) == 1:
-            self.detailsEdit.setHtml(
-                self.__generateDetailsTableText(selectedItems[0]))
+            self.detailsEdit.setHtml(self.__generateDetailsTableText(selectedItems[0]))
             self.__updateFilesTree(self.filesTree, selectedItems[0])
             self.__resizeColumnsFiles()
             self.__resortFiles()
@@ -1337,7 +1401,8 @@
             if index1 > index2:
                 # Swap the entries
                 selectedItems[0], selectedItems[1] = (
-                    selectedItems[1], selectedItems[0]
+                    selectedItems[1],
+                    selectedItems[0],
                 )
             html = "{0}<hr/>{1}".format(
                 self.__generateDetailsTableText(selectedItems[0]),
@@ -1345,12 +1410,12 @@
             )
             self.detailsEdit.setHtml(html)
             # self.filesTree is updated by the diff
-    
+
     def __generateDetailsTableText(self, itm):
         """
         Private method to generate an HTML table with the details of the given
         changeset.
-        
+
         @param itm reference to the item the table should be based on
         @type QTreeWidgetItem
         @return HTML table containing details
@@ -1358,54 +1423,51 @@
         """
         if itm is not None:
             commitId = itm.text(self.CommitIdColumn)
-            
+
             parentLinks = []
             for parent in [str(x) for x in itm.data(0, self.__parentsRole)]:
                 parentLinks.append('<a href="rev:{0}">{0}</a>'.format(parent))
             if parentLinks:
-                parentsStr = self.__parentsTemplate.format(
-                    ", ".join(parentLinks))
+                parentsStr = self.__parentsTemplate.format(", ".join(parentLinks))
             else:
                 parentsStr = ""
-            
+
             childLinks = []
             for child in [str(x) for x in self.__childrenInfo[commitId]]:
                 childLinks.append('<a href="rev:{0}">{0}</a>'.format(child))
             if childLinks:
-                childrenStr = self.__childrenTemplate.format(
-                    ", ".join(childLinks))
+                childrenStr = self.__childrenTemplate.format(", ".join(childLinks))
             else:
                 childrenStr = ""
-            
+
             branchLinks = []
             for branch, branchHead in self.__getBranchesForCommit(commitId):
-                branchLinks.append('<a href="rev:{0}">{1}</a>'.format(
-                    branchHead, branch))
+                branchLinks.append(
+                    '<a href="rev:{0}">{1}</a>'.format(branchHead, branch)
+                )
             if branchLinks:
-                branchesStr = self.__branchesTemplate.format(
-                    ", ".join(branchLinks))
+                branchesStr = self.__branchesTemplate.format(", ".join(branchLinks))
             else:
                 branchesStr = ""
-            
+
             tagLinks = []
             for tag, tagCommit in self.__getTagsForCommit(commitId):
                 if tagCommit:
-                    tagLinks.append('<a href="rev:{0}">{1}</a>'.format(
-                        tagCommit, tag))
+                    tagLinks.append('<a href="rev:{0}">{1}</a>'.format(tagCommit, tag))
                 else:
                     tagLinks.append(tag)
             if tagLinks:
-                tagsStr = self.__tagsTemplate.format(
-                    ", ".join(tagLinks))
+                tagsStr = self.__tagsTemplate.format(", ".join(tagLinks))
             else:
                 tagsStr = ""
-            
+
             if itm.data(0, self.__messageRole):
                 messageStr = self.__mesageTemplate.format(
-                    "<br/>".join(itm.data(0, self.__messageRole)))
+                    "<br/>".join(itm.data(0, self.__messageRole))
+                )
             else:
                 messageStr = ""
-            
+
             html = self.__detailsTemplate.format(
                 commitId,
                 itm.text(self.DateColumn),
@@ -1420,13 +1482,13 @@
             )
         else:
             html = ""
-        
+
         return html
-    
+
     def __updateFilesTree(self, parent, itm):
         """
         Private method to update the files tree with changes of the given item.
-        
+
         @param parent parent for the items to be added
         @type QTreeWidget or QTreeWidgetItem
         @param itm reference to the item the update should be based on
@@ -1437,15 +1499,19 @@
             if len(changes) > 0:
                 for change in changes:
                     self.__generateFileItem(
-                        change["action"], change["path"], change["copyfrom"],
-                        change["added"], change["deleted"])
+                        change["action"],
+                        change["path"],
+                        change["copyfrom"],
+                        change["added"],
+                        change["deleted"],
+                    )
                 self.__resizeColumnsFiles()
                 self.__resortFiles()
-    
+
     def __getBranchesForCommit(self, commitId):
         """
         Private method to get all branches reachable from a commit ID.
-        
+
         @param commitId commit ID to get the branches for
         @type str
         @return list of tuples containing the branch name and the associated
@@ -1453,36 +1519,38 @@
         @rtype tuple of (str, str)
         """
         branches = []
-        
+
         args = self.vcs.initCommand("branch")
         args.append("--list")
         args.append("--verbose")
         args.append("--contains")
         args.append(commitId)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             for line in output.splitlines():
                 name, commitId = line[2:].split(None, 2)[:2]
                 branches.append((name, commitId))
-        
+
         return branches
-    
+
     def __getTagsForCommit(self, commitId):
         """
         Private method to get all tags reachable from a commit ID.
-        
+
         @param commitId commit ID to get the tags for
         @type str
         @return list of tuples containing the tag name and the associated
@@ -1490,105 +1558,113 @@
         @rtype tuple of (str, str)
         """
         tags = []
-        
+
         args = self.vcs.initCommand("tag")
         args.append("--list")
         args.append("--contains")
         args.append(commitId)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             tagNames = []
             for line in output.splitlines():
                 tagNames.append(line.strip())
-            
+
             # determine the commit IDs for the tags
             for tagName in tagNames:
                 commitId = self.__getCommitForTag(tagName)
                 tags.append((tagName, commitId))
-        
+
         return tags
-    
+
     def __getCommitForTag(self, tag):
         """
         Private method to get the commit id for a tag.
-        
+
         @param tag tag name (string)
         @return commit id shortened to 10 characters (string)
         """
         args = self.vcs.initCommand("show")
         args.append("--abbrev-commit")
-        args.append("--abbrev={0}".format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
         args.append("--no-patch")
         args.append(tag)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             for line in output.splitlines():
                 if line.startswith("commit "):
                     commitId = line.split()[1].strip()
                     return commitId
-        
+
         return ""
-    
+
     @pyqtSlot(QPoint)
     def on_logTree_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the log tree.
-        
+
         @param pos position of the mouse pointer (QPoint)
         """
         self.__logTreeMenu.popup(self.logTree.mapToGlobal(pos))
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_logTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the log tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
         self.__updateToolMenuActions()
-        
+
         # Highlight the current entry using a bold font
         for col in range(self.logTree.columnCount()):
             current and current.setFont(col, self.__logTreeBoldFont)
             previous and previous.setFont(col, self.__logTreeNormalFont)
-        
+
         # set the state of the up and down buttons
         self.upButton.setEnabled(
-            current is not None and
-            self.logTree.indexOfTopLevelItem(current) > 0)
+            current is not None and self.logTree.indexOfTopLevelItem(current) > 0
+        )
         self.downButton.setEnabled(
-            current is not None and
-            len(current.data(0, self.__parentsRole)) > 0 and
-            (self.logTree.indexOfTopLevelItem(current) <
-                self.logTree.topLevelItemCount() - 1 or
-             self.nextButton.isEnabled()))
-    
+            current is not None
+            and len(current.data(0, self.__parentsRole)) > 0
+            and (
+                self.logTree.indexOfTopLevelItem(current)
+                < self.logTree.topLevelItemCount() - 1
+                or self.nextButton.isEnabled()
+            )
+        )
+
     @pyqtSlot()
     def on_logTree_itemSelectionChanged(self):
         """
@@ -1598,7 +1674,7 @@
         self.__updateSbsSelectLabel()
         self.__updateToolMenuActions()
         self.__generateDiffs()
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -1607,7 +1683,7 @@
         itm = self.logTree.itemAbove(self.logTree.currentItem())
         if itm:
             self.logTree.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -1621,7 +1697,7 @@
             if self.nextButton.isEnabled():
                 self.__addFinishCallback(self.on_downButton_clicked)
                 self.on_nextButton_clicked()
-    
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
@@ -1629,50 +1705,50 @@
         """
         if self.__skipEntries > 0 and self.nextButton.isEnabled():
             self.__getLogEntries(skip=self.__skipEntries)
-    
+
     @pyqtSlot(QDate)
     def on_fromDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(QDate)
     def on_toDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(int)
     def on_fieldCombo_activated(self, index):
         """
         Private slot called, when a new filter field is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(str)
     def on_rxEdit_textChanged(self, txt):
         """
         Private slot called, when a filter expression is entered.
-        
+
         @param txt filter expression (string)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
         elif self.__actionMode() == "find":
             self.__findItem(self.__findBackwards, interactive=True)
-    
+
     @pyqtSlot()
     def on_rxEdit_returnPressed(self):
         """
@@ -1680,59 +1756,58 @@
         """
         if self.__actionMode() == "find":
             self.__findItem(self.__findBackwards, interactive=True)
-    
+
     @pyqtSlot(bool)
     def on_stopCheckBox_clicked(self, checked):
         """
         Private slot called, when the stop on copy/move checkbox is clicked.
-        
+
         @param checked flag indicating the state of the check box (boolean)
         """
-        self.vcs.getPlugin().setPreferences("StopLogOnCopy",
-                                            self.stopCheckBox.isChecked())
+        self.vcs.getPlugin().setPreferences(
+            "StopLogOnCopy", self.stopCheckBox.isChecked()
+        )
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
-    
+
     ##################################################################
     ## Tool button menu action methods below
     ##################################################################
-    
+
     @pyqtSlot()
     def __cherryActTriggered(self):
         """
         Private slot to handle the Copy Commits action.
         """
         commits = {}
-        
+
         for itm in self.logTree.selectedItems():
             index = self.logTree.indexOfTopLevelItem(itm)
             commits[index] = itm.text(self.CommitIdColumn)
-        
+
         if commits:
-            pfile = (
-                pathlib.Path(ericApp().getObject("Project").getProjectFile())
-            )
+            pfile = pathlib.Path(ericApp().getObject("Project").getProjectFile())
             lastModified = pfile.stat().st_mtime
             shouldReopen = (
                 self.vcs.gitCherryPick(
                     self.repodir,
-                    [commits[i] for i in sorted(commits.keys(), reverse=True)]
-                ) or
-                pfile.stat().st_mtime != lastModified
+                    [commits[i] for i in sorted(commits.keys(), reverse=True)],
+                )
+                or pfile.stat().st_mtime != lastModified
             )
             if shouldReopen:
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Copy Changesets"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __tagActTriggered(self):
         """
@@ -1745,7 +1820,7 @@
             res = self.vcs.vcsTag(self.repodir, revision=commit, tagName=tag)
             if res:
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __switchActTriggered(self):
         """
@@ -1755,8 +1830,9 @@
         if len(self.logTree.selectedItems()) == 1:
             itm = self.logTree.selectedItems()[0]
             commit = itm.text(self.CommitIdColumn)
-            branches = [b for b in itm.text(self.BranchColumn).split(", ")
-                        if "/" not in b]
+            branches = [
+                b for b in itm.text(self.BranchColumn).split(", ") if "/" not in b
+            ]
             if len(branches) == 1:
                 branch = branches[0]
             elif len(branches) > 1:
@@ -1765,7 +1841,9 @@
                     self.tr("Switch"),
                     self.tr("Select a branch"),
                     [""] + branches,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
@@ -1774,27 +1852,25 @@
                 rev = branch
             else:
                 rev = commit
-            pfile = (
-                pathlib.Path(ericApp().getObject("Project").getProjectFile())
-            )
+            pfile = pathlib.Path(ericApp().getObject("Project").getProjectFile())
             lastModified = pfile.stat().st_mtime
             shouldReopen = (
-                self.vcs.vcsUpdate(self.repodir, revision=rev) or
-                pfile.stat().st_mtime != lastModified
+                self.vcs.vcsUpdate(self.repodir, revision=rev)
+                or pfile.stat().st_mtime != lastModified
             )
             if shouldReopen:
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Switch"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __branchActTriggered(self):
         """
@@ -1802,10 +1878,12 @@
         """
         if len(self.logTree.selectedItems()) == 1:
             from .GitBranchDialog import GitBranchDialog
+
             itm = self.logTree.selectedItems()[0]
             commit = itm.text(self.CommitIdColumn)
-            branches = [b for b in itm.text(self.BranchColumn).split(", ")
-                        if "/" not in b]
+            branches = [
+                b for b in itm.text(self.BranchColumn).split(", ") if "/" not in b
+            ]
             if len(branches) == 1:
                 branch = branches[0]
             elif len(branches) > 1:
@@ -1814,17 +1892,22 @@
                     self.tr("Branch"),
                     self.tr("Select a default branch"),
                     [""] + branches,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 branch = ""
             res = self.vcs.gitBranch(
-                self.repodir, revision=commit, branchName=branch,
-                branchOp=GitBranchDialog.CreateBranch)
+                self.repodir,
+                revision=commit,
+                branchName=branch,
+                branchOp=GitBranchDialog.CreateBranch,
+            )
             if res:
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __branchSwitchActTriggered(self):
         """
@@ -1833,10 +1916,12 @@
         """
         if len(self.logTree.selectedItems()) == 1:
             from .GitBranchDialog import GitBranchDialog
+
             itm = self.logTree.selectedItems()[0]
             commit = itm.text(self.CommitIdColumn)
-            branches = [b for b in itm.text(self.BranchColumn).split(", ")
-                        if "/" not in b]
+            branches = [
+                b for b in itm.text(self.BranchColumn).split(", ") if "/" not in b
+            ]
             if len(branches) == 1:
                 branch = branches[0]
             elif len(branches) > 1:
@@ -1845,33 +1930,36 @@
                     self.tr("Branch & Switch"),
                     self.tr("Select a default branch"),
                     [""] + branches,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 branch = ""
-            pfile = (
-                pathlib.Path(ericApp().getObject("Project").getProjectFile())
-            )
+            pfile = pathlib.Path(ericApp().getObject("Project").getProjectFile())
             lastModified = pfile.stat().st_mtime
             res, shouldReopen = self.vcs.gitBranch(
-                self.repodir, revision=commit, branchName=branch,
-                branchOp=GitBranchDialog.CreateSwitchBranch)
+                self.repodir,
+                revision=commit,
+                branchName=branch,
+                branchOp=GitBranchDialog.CreateSwitchBranch,
+            )
             shouldReopen |= pfile.stat().st_mtime != lastModified
             if res:
                 if shouldReopen:
                     res = EricMessageBox.yesNo(
                         None,
                         self.tr("Switch"),
-                        self.tr(
-                            """The project should be reread. Do this now?"""),
-                        yesDefault=True)
+                        self.tr("""The project should be reread. Do this now?"""),
+                        yesDefault=True,
+                    )
                     if res:
                         ericApp().getObject("Project").reopenProject()
                         return
-                
+
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __shortlogActTriggered(self):
         """
@@ -1881,8 +1969,9 @@
             itm = self.logTree.selectedItems()[0]
             commit = itm.text(self.CommitIdColumn)
             branch = itm.text(self.BranchColumn).split(", ", 1)[0]
-            branches = [b for b in itm.text(self.BranchColumn).split(", ")
-                        if "/" not in b]
+            branches = [
+                b for b in itm.text(self.BranchColumn).split(", ") if "/" not in b
+            ]
             if len(branches) == 1:
                 branch = branches[0]
             elif len(branches) > 1:
@@ -1891,7 +1980,9 @@
                     self.tr("Show Short Log"),
                     self.tr("Select a branch"),
                     [""] + branches,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
@@ -1901,143 +1992,141 @@
             else:
                 rev = commit
             self.vcs.gitShortlog(self.repodir, commit=rev)
-    
+
     @pyqtSlot()
     def __describeActTriggered(self):
         """
         Private slot to show the most recent tag reachable from a commit.
         """
         commits = []
-        
+
         for itm in self.logTree.selectedItems():
             commits.append(itm.text(self.CommitIdColumn))
-        
+
         if commits:
             self.vcs.gitDescribe(self.repodir, commits)
-    
+
     ##################################################################
     ## Log context menu action methods below
     ##################################################################
-    
+
     @pyqtSlot(bool)
     def __showCommitterColumns(self, on):
         """
         Private slot to show/hide the committer columns.
-        
+
         @param on flag indicating the selection state (boolean)
         """
         self.logTree.setColumnHidden(self.CommitterColumn, not on)
         self.logTree.setColumnHidden(self.CommitDateColumn, not on)
         self.vcs.getPlugin().setPreferences("ShowCommitterColumns", on)
         self.__resizeColumnsLog()
-    
+
     @pyqtSlot(bool)
     def __showAuthorColumns(self, on):
         """
         Private slot to show/hide the committer columns.
-        
+
         @param on flag indicating the selection state (boolean)
         """
         self.logTree.setColumnHidden(self.AuthorColumn, not on)
         self.logTree.setColumnHidden(self.DateColumn, not on)
         self.vcs.getPlugin().setPreferences("ShowAuthorColumns", on)
         self.__resizeColumnsLog()
-    
+
     @pyqtSlot(bool)
     def __showCommitIdColumn(self, on):
         """
         Private slot to show/hide the commit ID column.
-        
+
         @param on flag indicating the selection state (boolean)
         """
         self.logTree.setColumnHidden(self.CommitIdColumn, not on)
         self.vcs.getPlugin().setPreferences("ShowCommitIdColumn", on)
         self.__resizeColumnsLog()
-    
+
     @pyqtSlot(bool)
     def __showBranchesColumn(self, on):
         """
         Private slot to show/hide the branches column.
-        
+
         @param on flag indicating the selection state (boolean)
         """
         self.logTree.setColumnHidden(self.BranchColumn, not on)
         self.vcs.getPlugin().setPreferences("ShowBranchesColumn", on)
         self.__resizeColumnsLog()
-    
+
     @pyqtSlot(bool)
     def __showTagsColumn(self, on):
         """
         Private slot to show/hide the tags column.
-        
+
         @param on flag indicating the selection state (boolean)
         """
         self.logTree.setColumnHidden(self.TagsColumn, not on)
         self.vcs.getPlugin().setPreferences("ShowTagsColumn", on)
         self.__resizeColumnsLog()
-    
+
     ##################################################################
     ## Search and filter methods below
     ##################################################################
-    
+
     def __actionMode(self):
         """
         Private method to get the selected action mode.
-        
+
         @return selected action mode (string, one of filter or find)
         """
-        return self.modeComboBox.itemData(
-            self.modeComboBox.currentIndex())
-    
+        return self.modeComboBox.itemData(self.modeComboBox.currentIndex())
+
     @pyqtSlot(int)
     def on_modeComboBox_currentIndexChanged(self, index):
         """
         Private slot to react on mode changes.
-        
+
         @param index index of the selected entry (integer)
         """
         mode = self.modeComboBox.itemData(index)
         findMode = mode == "find"
         filterMode = mode == "filter"
-        
+
         self.fromDate.setEnabled(filterMode)
         self.toDate.setEnabled(filterMode)
         self.findPrevButton.setVisible(findMode)
         self.findNextButton.setVisible(findMode)
-        
+
         if findMode:
             for topIndex in range(self.logTree.topLevelItemCount()):
                 self.logTree.topLevelItem(topIndex).setHidden(False)
             self.logTree.header().setSectionHidden(self.IconColumn, False)
         elif filterMode:
             self.__filterLogs()
-    
+
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
         """
         Private slot to find the previous item matching the entered criteria.
         """
         self.__findItem(True)
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next item matching the entered criteria.
         """
         self.__findItem(False)
-    
+
     def __findItem(self, backwards=False, interactive=False):
         """
         Private slot to find an item matching the entered criteria.
-        
+
         @param backwards flag indicating to search backwards (boolean)
         @param interactive flag indicating an interactive search (boolean)
         """
         self.__findBackwards = backwards
-        
+
         fieldIndex, searchRx, indexIsRole = self.__prepareFieldSearch()
-        currentIndex = self.logTree.indexOfTopLevelItem(
-            self.logTree.currentItem())
+        currentIndex = self.logTree.indexOfTopLevelItem(self.logTree.currentItem())
         if backwards:
             if interactive:
                 indexes = range(currentIndex, -1, -1)
@@ -2047,17 +2136,15 @@
             if interactive:
                 indexes = range(currentIndex, self.logTree.topLevelItemCount())
             else:
-                indexes = range(currentIndex + 1,
-                                self.logTree.topLevelItemCount())
-        
+                indexes = range(currentIndex + 1, self.logTree.topLevelItemCount())
+
         for index in indexes:
             topItem = self.logTree.topLevelItem(index)
             if indexIsRole:
                 if fieldIndex == self.__changesRole:
                     changes = topItem.data(0, self.__changesRole)
                     txt = "\n".join(
-                        [c["path"] for c in changes] +
-                        [c["copyfrom"] for c in changes]
+                        [c["path"] for c in changes] + [c["copyfrom"] for c in changes]
                     )
                 else:
                     # Filter based on complete subject text
@@ -2071,17 +2158,18 @@
             EricMessageBox.information(
                 self,
                 self.tr("Find Commit"),
-                self.tr("""'{0}' was not found.""").format(self.rxEdit.text()))
-    
+                self.tr("""'{0}' was not found.""").format(self.rxEdit.text()),
+            )
+
     ##################################################################
     ## Commit navigation methods below
     ##################################################################
-    
+
     def __commitIdClicked(self, url):
         """
         Private slot to handle the anchorClicked signal of the changeset
         details pane.
-        
+
         @param url URL that was clicked
         @type QUrl
         """
@@ -2089,7 +2177,8 @@
             # a commit ID was clicked, show the respective item
             commitId = url.path()
             items = self.logTree.findItems(
-                commitId, Qt.MatchFlag.MatchStartsWith, self.CommitIdColumn)
+                commitId, Qt.MatchFlag.MatchStartsWith, self.CommitIdColumn
+            )
             if items:
                 itm = items[0]
                 if itm.isHidden():
@@ -2098,18 +2187,17 @@
             else:
                 # load the next batch and try again
                 if self.nextButton.isEnabled():
-                    self.__addFinishCallback(
-                        lambda: self.__commitIdClicked(url))
+                    self.__addFinishCallback(lambda: self.__commitIdClicked(url))
                     self.on_nextButton_clicked()
-    
+
     ###########################################################################
     ## Diff handling methods below
     ###########################################################################
-    
+
     def __generateDiffs(self, parent=1):
         """
         Private slot to generate diff outputs for the selected item.
-        
+
         @param parent number of parent to diff against
         @type int
         """
@@ -2118,7 +2206,7 @@
         self.diffSelectLabel.clear()
         with contextlib.suppress(AttributeError):
             self.diffHighlighter.regenerateRules()
-        
+
         selectedItems = self.logTree.selectedItems()
         if len(selectedItems) == 1:
             currentItem = selectedItems[0]
@@ -2126,11 +2214,12 @@
             parents = currentItem.data(0, self.__parentsRole)
             if len(parents) >= parent:
                 self.diffLabel.setText(
-                    self.tr("Differences to Parent {0}").format(parent))
+                    self.tr("Differences to Parent {0}").format(parent)
+                )
                 commit1 = parents[parent - 1]
-                
+
                 self.__diffGenerator.start(self.__filename, [commit1, commit2])
-            
+
             if len(parents) > 1:
                 parentLinks = []
                 for index in range(1, len(parents) + 1):
@@ -2138,38 +2227,38 @@
                         parentLinks.append("&nbsp;{0}&nbsp;".format(index))
                     else:
                         parentLinks.append(
-                            '<a href="diff:{0}">&nbsp;{0}&nbsp;</a>'
-                            .format(index))
+                            '<a href="diff:{0}">&nbsp;{0}&nbsp;</a>'.format(index)
+                        )
                     self.diffSelectLabel.setText(
-                        self.tr('Diff to Parent {0}')
-                        .format(" ".join(parentLinks)))
+                        self.tr("Diff to Parent {0}").format(" ".join(parentLinks))
+                    )
         elif len(selectedItems) == 2:
             commit2 = selectedItems[0].text(self.CommitIdColumn)
             commit1 = selectedItems[1].text(self.CommitIdColumn)
             index2 = self.logTree.indexOfTopLevelItem(selectedItems[0])
             index1 = self.logTree.indexOfTopLevelItem(selectedItems[1])
-            
+
             if index2 < index1:
                 # swap to always compare old to new
                 commit1, commit2 = commit2, commit1
-            
+
             self.__diffGenerator.start(self.__filename, [commit1, commit2])
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal of the diff generator.
         """
         diff, _, errors, fileSeparators = self.__diffGenerator.getResult()
-        
+
         if diff:
             self.diffEdit.setPlainText("".join(diff))
         elif errors:
             self.diffEdit.setPlainText("".join(errors))
         else:
-            self.diffEdit.setPlainText(self.tr('There is no difference.'))
-        
+            self.diffEdit.setPlainText(self.tr("There is no difference."))
+
         self.saveLabel.setVisible(bool(diff))
-        
+
         fileSeparators = self.__mergeFileSeparators(fileSeparators)
         if self.__diffUpdatesFiles:
             for oldFileName, newFileName, lineNumber, _ in fileSeparators:
@@ -2179,7 +2268,8 @@
                     item = QTreeWidgetItem(self.filesTree, ["", newFileName])
                 else:
                     item = QTreeWidgetItem(
-                        self.filesTree, ["", newFileName, "", "", oldFileName])
+                        self.filesTree, ["", newFileName, "", "", oldFileName]
+                    )
                 item.setData(0, self.__diffFileLineRole, lineNumber)
             self.__resizeColumnsFiles()
             self.__resortFiles()
@@ -2188,20 +2278,20 @@
                 for fileName in (oldFileName, newFileName):
                     if fileName != "/dev/null":
                         items = self.filesTree.findItems(
-                            fileName, Qt.MatchFlag.MatchExactly, 1)
+                            fileName, Qt.MatchFlag.MatchExactly, 1
+                        )
                         for item in items:
-                            item.setData(0, self.__diffFileLineRole,
-                                         lineNumber)
-        
+                            item.setData(0, self.__diffFileLineRole, lineNumber)
+
         tc = self.diffEdit.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.diffEdit.setTextCursor(tc)
         self.diffEdit.ensureCursorVisible()
-    
+
     def __mergeFileSeparators(self, fileSeparators):
         """
         Private method to merge the file separator entries.
-        
+
         @param fileSeparators list of file separator entries to be merged
         @return merged list of file separator entries
         """
@@ -2215,12 +2305,12 @@
                 if pos2 != -2:
                     separators[(oldFile, newFile)][3] = pos2
         return list(separators.values())
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_filesTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the files tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -2243,20 +2333,23 @@
                     tc.movePosition(QTextCursor.MoveOperation.End)
                     self.diffEdit.setTextCursor(tc)
                     self.diffEdit.ensureCursorVisible()
-                    
+
                     # step 2: move cursor to desired line
                     tc = self.diffEdit.textCursor()
                     delta = tc.blockNumber() - para
-                    tc.movePosition(QTextCursor.MoveOperation.PreviousBlock,
-                                    QTextCursor.MoveMode.MoveAnchor, delta)
+                    tc.movePosition(
+                        QTextCursor.MoveOperation.PreviousBlock,
+                        QTextCursor.MoveMode.MoveAnchor,
+                        delta,
+                    )
                     self.diffEdit.setTextCursor(tc)
                     self.diffEdit.ensureCursorVisible()
-    
+
     @pyqtSlot(str)
     def on_diffSelectLabel_linkActivated(self, link):
         """
         Private slot to handle the selection of a diff target.
-        
+
         @param link activated link
         @type str
         """
@@ -2266,43 +2359,44 @@
                 with contextlib.suppress(ValueError):
                     parent = int(parent)
                     self.__generateDiffs(parent)
-    
+
     @pyqtSlot(str)
     def on_saveLabel_linkActivated(self, link):
         """
         Private slot to handle the selection of the save link.
-        
+
         @param link activated link
         @type str
         """
         if ":" not in link:
             return
-        
+
         scheme, rest = link.split(":", 1)
         if scheme != "save" or rest != "me":
             return
-        
+
         if self.projectMode:
             fname = self.vcs.splitPath(self.__filename)[0]
             fname += "/{0}.diff".format(os.path.split(fname)[-1])
         else:
             dname, fname = self.vcs.splitPath(self.__filename)
-            if fname != '.':
+            if fname != ".":
                 fname = "{0}.diff".format(self.__filename)
             else:
                 fname = dname
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2312,12 +2406,14 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
@@ -2325,17 +2421,19 @@
                 f.write(eol)
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-    
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot(str)
     def on_sbsSelectLabel_linkActivated(self, link):
         """
         Private slot to handle selection of a side-by-side link.
-        
+
         @param link text of the selected link
         @type str
         """
@@ -2343,5 +2441,4 @@
             scheme, path = link.split(":", 1)
             if scheme == "sbsdiff" and "_" in path:
                 commit1, commit2 = path.split("_", 1)
-                self.vcs.vcsSbsDiff(self.__filename,
-                                    revisions=(commit1, commit2))
+                self.vcs.vcsSbsDiff(self.__filename, revisions=(commit1, commit2))
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitMergeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitMergeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,13 @@
     """
     Class implementing a dialog to enter the merge data.
     """
-    def __init__(self, tagsList, branchesList, currentBranch,
-                 remoteBranchesList, parent=None):
+
+    def __init__(
+        self, tagsList, branchesList, currentBranch, remoteBranchesList, parent=None
+    ):
         """
         Constructor
-        
+
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
         @param currentBranch name of the current branch (string)
@@ -32,27 +34,25 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.commitMessageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-        
+        self.commitMessageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
         self.__currentBranch = currentBranch
-        
+
         self.tagCombo.addItems(sorted(tagsList))
         if currentBranch in branchesList:
             branchesList.remove(currentBranch)
         self.branchCombo.addItems(sorted(branchesList))
         self.remoteBranchCombo.addItems(sorted(remoteBranchesList))
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -66,13 +66,14 @@
             enabled = self.branchCombo.currentText() != ""
         elif self.remoteBranchButton.isChecked():
             enabled = self.remoteBranchCombo.currentText() != ""
-        
-        enabled &= (self.commitGroupBox.isChecked() and
-                    self.commitMessageEdit.toPlainText() != "")
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        enabled &= (
+            self.commitGroupBox.isChecked()
+            and self.commitMessageEdit.toPlainText() != ""
+        )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __generateDefaultCommitMessage(self):
         """
         Private slot to generate a default commit message based on the
@@ -81,132 +82,136 @@
         if self.commitGroupBox.isChecked():
             if self.idButton.isChecked():
                 msg = "Merged commit {0} into {1}.".format(
-                    self.idEdit.text(), self.__currentBranch)
+                    self.idEdit.text(), self.__currentBranch
+                )
             elif self.tagButton.isChecked():
                 msg = "Merged tag {0} into {1}.".format(
-                    self.tagCombo.currentText(), self.__currentBranch)
+                    self.tagCombo.currentText(), self.__currentBranch
+                )
             elif self.branchButton.isChecked():
                 msg = "Merged branch {0} into {1}.".format(
-                    self.branchCombo.currentText(), self.__currentBranch)
+                    self.branchCombo.currentText(), self.__currentBranch
+                )
             elif self.remoteBranchButton.isChecked():
                 msg = "Merged remote branch {0} into {1}.".format(
-                    self.remoteBranchCombo.currentText(), self.__currentBranch)
+                    self.remoteBranchCombo.currentText(), self.__currentBranch
+                )
             else:
                 msg = "Merged into {0}.".format(self.__currentBranch)
             self.commitMessageEdit.setPlainText(msg)
         else:
             self.commitMessageEdit.clear()
-    
+
     @pyqtSlot(bool)
     def on_idButton_toggled(self, checked):
         """
         Private slot to handle changes of the ID select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tagButton_toggled(self, checked):
         """
         Private slot to handle changes of the Tag select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_remoteBranchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Remote Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_noneButton_toggled(self, checked):
         """
         Private slot to handle changes of the None select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__generateDefaultCommitMessage()
-    
+
     @pyqtSlot(str)
     def on_idEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the Commit edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_remoteBranchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Remote Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_commitGroupBox_toggled(self, checked):
         """
         Private slot to handle changes of the Commit select group.
-        
+
         @param checked state of the group (boolean)
         """
         self.__generateDefaultCommitMessage()
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_commitMessageEdit_textChanged(self):
         """
         Private slot to handle changes of the commit message edit.
         """
         self.__updateOK()
-    
+
     def getParameters(self):
         """
         Public method to retrieve the merge data.
-        
+
         @return tuple naming the revision, a flag indicating that the merge
             shall be committed, the commit message, a flag indicating that a
             log summary shall be appended and a flag indicating to show diff
@@ -223,7 +228,7 @@
             rev = self.remoteBranchCombo.currentText()
         else:
             rev = ""
-        
+
         return (
             rev,
             self.commitGroupBox.isChecked(),
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitNewProjectOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitNewProjectOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,59 +27,55 @@
     Class implementing the Options Dialog for a new project from the
     repository.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
-        
+
         self.projectDirButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.vcsUrlButton.setIcon(UI.PixmapCache.getIcon("open"))
-        self.vcsUrlClearHistoryButton.setIcon(
-            UI.PixmapCache.getIcon("editDelete"))
-        
-        vcsUrlHistory = self.__vcs.getPlugin().getPreferences(
-            "RepositoryUrlHistory")
+        self.vcsUrlClearHistoryButton.setIcon(UI.PixmapCache.getIcon("editDelete"))
+
+        vcsUrlHistory = self.__vcs.getPlugin().getPreferences("RepositoryUrlHistory")
         self.vcsUrlCombo.addItems(vcsUrlHistory)
         self.vcsUrlCombo.setEditText("")
-        
+
         self.vcsDirectoryCompleter = EricDirCompleter(self.vcsUrlCombo)
         self.vcsProjectDirCompleter = EricDirCompleter(self.vcsProjectDirEdit)
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
         self.vcsProjectDirEdit.setText(
-            Utilities.toNativeSeparators(self.__initPaths[0]))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+            Utilities.toNativeSeparators(self.__initPaths[0])
+        )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_vcsProjectDirEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the project directory.
-        
+
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            Utilities.fromNativeSeparators(txt) not in self.__initPaths)
-    
+            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+        )
+
     @pyqtSlot()
     def on_vcsUrlButton_clicked(self):
         """
@@ -89,12 +85,12 @@
             self,
             self.tr("Select Repository-Directory"),
             self.vcsUrlCombo.currentText(),
-            EricFileDialog.ShowDirsOnly)
-        
+            EricFileDialog.ShowDirsOnly,
+        )
+
         if directory:
-            self.vcsUrlCombo.setEditText(
-                Utilities.toNativeSeparators(directory))
-    
+            self.vcsUrlCombo.setEditText(Utilities.toNativeSeparators(directory))
+
     @pyqtSlot()
     def on_projectDirButton_clicked(self):
         """
@@ -104,39 +100,38 @@
             self,
             self.tr("Select Project Directory"),
             self.vcsProjectDirEdit.text(),
-            EricFileDialog.ShowDirsOnly)
-        
+            EricFileDialog.ShowDirsOnly,
+        )
+
         if directory:
-            self.vcsProjectDirEdit.setText(
-                Utilities.toNativeSeparators(directory))
-    
+            self.vcsProjectDirEdit.setText(Utilities.toNativeSeparators(directory))
+
     @pyqtSlot(str)
     def on_vcsUrlCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the combo box
         @type str
         """
         enable = False
         vcsUrlEnable = False
-        
+
         if txt:
             url = QUrl.fromUserInput(txt)
             if url.isValid():
                 if url.scheme() in ConfigGitSchemes:
                     enable = True
                     vcsUrlEnable = url.scheme() == "file"
-            elif ':' in txt:
+            elif ":" in txt:
                 # assume scp like repository URL
                 enable = True
         else:
             vcsUrlEnable = True
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
         self.vcsUrlButton.setEnabled(vcsUrlEnable)
-    
+
     @pyqtSlot()
     def on_vcsUrlClearHistoryButton_clicked(self):
         """
@@ -145,23 +140,23 @@
         currentVcsUrl = self.vcsUrlCombo.currentText()
         self.vcsUrlCombo.clear()
         self.vcsUrlCombo.setEditText(currentVcsUrl)
-        
+
         self.__saveHistory()
-    
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a tuple of a string (project directory) and a dictionary
             containing the data entered.
         """
         self.__saveHistory()
-        
+
         vcsdatadict = {
             "url": self.vcsUrlCombo.currentText().replace("\\", "/"),
         }
         return (self.vcsProjectDirEdit.text(), vcsdatadict)
-    
+
     def __saveHistory(self):
         """
         Private method to save the repository URL history.
@@ -172,11 +167,10 @@
             vcsUrlHistory.append(self.vcsUrlCombo.itemText(index))
         if url not in vcsUrlHistory:
             vcsUrlHistory.insert(0, url)
-        
+
         # max. list sizes is hard coded to 20 entries
         newVcsUrlHistory = [url for url in vcsUrlHistory if url]
         if len(newVcsUrlHistory) > 20:
             newVcsUrlHistory = newVcsUrlHistory[:20]
-        
-        self.__vcs.getPlugin().setPreferences(
-            "RepositoryUrlHistory", newVcsUrlHistory)
+
+        self.__vcs.getPlugin().setPreferences("RepositoryUrlHistory", newVcsUrlHistory)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,24 +18,25 @@
     Class implementing a dialog to enter options used to start a project in the
     repository.
     """
+
     def __init__(self, vcs, project, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param project reference to the project object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a dictionary containing the data entered
         """
         vcsdatadict = {
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     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
@@ -33,27 +34,26 @@
         """
         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 = 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):
         """
@@ -61,19 +61,16 @@
         """
         selectedItems = self.patchFilesList.selectedItems()
         count = len(selectedItems)
-        isFirst = (
-            count == 1 and
-            self.patchFilesList.row(selectedItems[0]) == 0
-        )
+        isFirst = count == 1 and self.patchFilesList.row(selectedItems[0]) == 0
         isLast = (
-            count == 1 and
-            self.patchFilesList.row(selectedItems[0]) ==
-            self.patchFilesList.count() - 1
+            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):
         """
@@ -83,17 +80,18 @@
             self,
             self.tr("Patch Files"),
             self.__rootDir,
-            self.tr("Patch Files (*.diff *.patch);;All Files (*)"))
+            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):
         """
@@ -103,10 +101,10 @@
             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):
         """
@@ -116,7 +114,7 @@
         itm = self.patchFilesList.takeItem(row)
         self.patchFilesList.insertItem(row - 1, itm)
         itm.setSelected(True)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -126,29 +124,32 @@
         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())
+        return (
+            self.__getPatchFilesList(),
+            self.stripSpinBox.value(),
+            self.eofCheckBox.isChecked(),
+            self.lineCountsCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchStatisticsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitPatchStatisticsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,54 +23,55 @@
     """
     Class implementing a dialog to show some patch file statistics.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the VCS object (Git)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__vcs = vcs
-        
+
         self.changesTreeWidget.headerItem().setText(
-            self.changesTreeWidget.columnCount(), "")
-        self.changesTreeWidget.header().setSortIndicator(
-            2, Qt.SortOrder.AscendingOrder)
-    
+            self.changesTreeWidget.columnCount(), ""
+        )
+        self.changesTreeWidget.header().setSortIndicator(2, Qt.SortOrder.AscendingOrder)
+
     def start(self, projectDir, patchCheckData):
         """
         Public method to start the statistics process.
-        
+
         @param projectDir directory name of the project (string)
         @param patchCheckData tuple of data as returned by the
             GitPatchFilesDialog.getData() method
         """
         self.__patchCheckData = patchCheckData
-        
+
         self.changesTreeWidget.clear()
         self.summaryEdit.clear()
-        
+
         # find the root of the repo
         repodir = projectDir
         while not os.path.isdir(os.path.join(repodir, self.__vcs.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitPatchFilesDialog import GitPatchFilesDialog
+
         dlg = GitPatchFilesDialog(repodir, patchCheckData)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             patchFilesList, stripCount, inaccurateEof, recount = dlg.getData()
-            self.__patchCheckData = (patchFilesList, stripCount,
-                                     inaccurateEof, recount)
+            self.__patchCheckData = (patchFilesList, stripCount, inaccurateEof, recount)
             if patchFilesList:
                 process = QProcess()
                 process.setWorkingDirectory(repodir)
-                
+
                 # step 1: get the statistics
                 args = self.__vcs.initCommand("apply")
                 args.append("--numstat")
@@ -80,27 +81,30 @@
                     args.append("--recount")
                 args.append("-p{0}".format(stripCount))
                 args.extend(patchFilesList)
-                
-                process.start('git', args)
+
+                process.start("git", args)
                 procStarted = process.waitForStarted(5000)
                 if not procStarted:
                     EricMessageBox.critical(
                         self,
-                        self.tr('Process Generation Error'),
+                        self.tr("Process Generation Error"),
                         self.tr(
-                            'The process {0} could not be started. '
-                            'Ensure, that it is in the search path.'
-                        ).format('git'))
+                            "The process {0} could not be started. "
+                            "Ensure, that it is in the search path."
+                        ).format("git"),
+                    )
                     return
                 else:
                     finished = process.waitForFinished(30000)
                     if finished and process.exitCode() == 0:
-                        output = str(process.readAllStandardOutput(),
-                                     Preferences.getSystem("IOEncoding"),
-                                     'replace')
+                        output = str(
+                            process.readAllStandardOutput(),
+                            Preferences.getSystem("IOEncoding"),
+                            "replace",
+                        )
                         for line in output.splitlines():
                             self.__createStatisticsItem(line)
-                
+
                 # step 2: get the summary
                 args = self.__vcs.initCommand("apply")
                 args.append("--summary")
@@ -110,51 +114,54 @@
                     args.append("--recount")
                 args.append("-p{0}".format(stripCount))
                 args.extend(patchFilesList)
-                
-                process.start('git', args)
+
+                process.start("git", args)
                 procStarted = process.waitForStarted(5000)
                 if not procStarted:
                     EricMessageBox.critical(
                         self,
-                        self.tr('Process Generation Error'),
+                        self.tr("Process Generation Error"),
                         self.tr(
-                            'The process {0} could not be started. '
-                            'Ensure, that it is in the search path.'
-                        ).format('git'))
+                            "The process {0} could not be started. "
+                            "Ensure, that it is in the search path."
+                        ).format("git"),
+                    )
                     return
                 else:
                     finished = process.waitForFinished(30000)
                     if finished and process.exitCode() == 0:
-                        output = str(process.readAllStandardOutput(),
-                                     Preferences.getSystem("IOEncoding"),
-                                     'replace')
+                        output = str(
+                            process.readAllStandardOutput(),
+                            Preferences.getSystem("IOEncoding"),
+                            "replace",
+                        )
                         for line in output.splitlines():
                             self.summaryEdit.appendPlainText(line.strip())
-    
+
     def __createStatisticsItem(self, line):
         """
         Private method to create a file statistics entry.
-        
+
         @param line string with file statistics data (string)
         """
         insertions, deletions, filename = line.strip().split(None, 2)
-        itm = QTreeWidgetItem(self.changesTreeWidget,
-                              [insertions, deletions, filename])
+        itm = QTreeWidgetItem(self.changesTreeWidget, [insertions, deletions, filename])
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
-    
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.changesTreeWidget.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.changesTreeWidget.header().setStretchLastSection(True)
-    
+
     def getData(self):
         """
         Public method to get the data used to generate the statistics.
-        
+
         @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
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitPullDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitPullDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,47 +17,47 @@
     """
     Class implementing a dialog to enter data for a Pull operation.
     """
+
     def __init__(self, vcs, repodir, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the git object
         @param repodir directory name of the local repository (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
         self.__repodir = repodir
-        
+
         self.__all = self.tr("<All>")
         self.__custom = self.tr("<Custom>")
-        
+
         remoteUrlsList = self.__vcs.gitGetRemoteUrlsList(self.__repodir)
         self.__repos = {name: url for name, url in remoteUrlsList}
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         self.remotesComboBox.addItems(sorted(self.__repos.keys()))
         self.remotesComboBox.addItem(self.__all)
         self.remotesComboBox.addItem(self.__custom)
-        
+
         index = self.remotesComboBox.findText("origin")
         if index == -1:
             index = 0
         self.remotesComboBox.setCurrentIndex(index)
-    
+
     def __okButtonEnable(self):
         """
         Private slot to set the enabled state of the OK button.
         """
         self.__okButton.setEnabled(
-            self.remoteBranchesList.count() > 0 or
-            self.remotesComboBox.currentText() == self.__all
+            self.remoteBranchesList.count() > 0
+            or self.remotesComboBox.currentText() == self.__all
         )
-    
+
     def __updateButtonEnable(self):
         """
         Private slot to set the enabled state of the update button.
@@ -66,14 +66,14 @@
         enable = remote != self.__all
         if remote == self.__custom:
             enable = self.remoteEdit.text() != ""
-        
+
         self.updateButton.setEnabled(enable)
-    
+
     @pyqtSlot(str)
     def on_remotesComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle changes of the selected repository.
-        
+
         @param txt current text of the combo box (string)
         """
         self.remoteEdit.setReadOnly(txt != self.__custom)
@@ -82,35 +82,30 @@
         self.remoteBranchesList.clear()
         self.__updateButtonEnable()
         self.__okButtonEnable()
-        
+
         if txt not in [self.__all, self.__custom]:
-            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-                self.__repodir, txt)
+            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
             self.remoteBranchesList.addItems(sorted(remoteBranches))
-            
+
             if txt in self.__repos:
                 self.remoteEdit.setText(self.__repos[txt])
-    
+
     @pyqtSlot(str)
     def on_remoteEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the URL edit.
-        
+
         @param txt current text of the URL edit (string)
         """
         self.__updateButtonEnable()
-        
-        if (
-            self.remotesComboBox.currentText() == self.__custom and
-            txt != ""
-        ):
-            remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-                self.__repodir, txt)
+
+        if self.remotesComboBox.currentText() == self.__custom and txt != "":
+            remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, txt)
             self.remoteBranchesList.clear()
             self.remoteBranchesList.addItems(sorted(remoteBranches))
-        
+
         self.__okButtonEnable()
-    
+
     @pyqtSlot()
     def on_updateButton_clicked(self):
         """
@@ -120,24 +115,23 @@
         if remote == self.__all:
             # shouldn't happen
             return
-        
+
         if remote == self.__custom:
             remote = self.remoteEdit.text()
             if remote == "":
                 # shouldn't happen either
                 return
-        
-        remoteBranches = self.__vcs.gitGetRemoteBranchesList(
-            self.__repodir, remote)
+
+        remoteBranches = self.__vcs.gitGetRemoteBranchesList(self.__repodir, remote)
         self.remoteBranchesList.clear()
         self.remoteBranchesList.addItems(sorted(remoteBranches))
-        
+
         self.__okButtonEnable()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple of remote name, remote url (for custom remotes),
             remote branches, a flag indicating to pull from all repositories
             and a flag indicating to remove obsolete tracking references
@@ -147,7 +141,7 @@
         url = ""
         branches = []
         allRepos = False
-        
+
         remoteRepo = self.remotesComboBox.currentText()
         if remoteRepo == self.__all:
             allRepos = True
@@ -158,5 +152,5 @@
                 remote = remoteRepo
             for itm in self.remoteBranchesList.selectedItems():
                 branches.append(itm.text())
-        
+
         return remote, url, branches, allRepos, self.pruneCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitPushDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitPushDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,154 +17,143 @@
     """
     Class implementing a dialog to enter data for a Push operation.
     """
+
     PushColumn = 0
     LocalBranchColumn = 1
     RemoteBranchColumn = 2
     ForceColumn = 3
-    
+
     def __init__(self, vcs, repodir, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the git object
         @param repodir directory name of the local repository (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
         self.__repodir = repodir
-        
+
         remoteUrlsList = self.__vcs.gitGetRemoteUrlsList(self.__repodir)
         self.__repos = {name: url for name, url in remoteUrlsList}
-        
-        remoteBranches = self.__vcs.gitGetBranchesList(self.__repodir,
-                                                       remotes=True)
+
+        remoteBranches = self.__vcs.gitGetBranchesList(self.__repodir, remotes=True)
         self.__remotes = {}
         for remoteBranch in remoteBranches:
             repo, branch = remoteBranch.rsplit("/", 2)[-2:]
             if repo not in self.__remotes:
                 self.__remotes[repo] = []
             self.__remotes[repo].append(branch)
-        
-        self.__localBranches = self.__vcs.gitGetBranchesList(self.__repodir,
-                                                             withMaster=True)
-        
+
+        self.__localBranches = self.__vcs.gitGetBranchesList(
+            self.__repodir, withMaster=True
+        )
+
         self.remotesComboBox.addItems(sorted(self.__repos.keys()))
-        
+
         for localBranch in self.__localBranches:
             itm = QTreeWidgetItem(self.branchesTree, ["", localBranch, "", ""])
             combo = QComboBox()
             combo.setEditable(True)
-            combo.setSizeAdjustPolicy(
-                QComboBox.SizeAdjustPolicy.AdjustToContents)
+            combo.setSizeAdjustPolicy(QComboBox.SizeAdjustPolicy.AdjustToContents)
             self.branchesTree.setItemWidget(
-                itm, GitPushDialog.RemoteBranchColumn, combo)
-        
+                itm, GitPushDialog.RemoteBranchColumn, combo
+            )
+
         self.__resizeColumns()
-        
+
         self.branchesTree.header().setSortIndicator(
-            GitPushDialog.LocalBranchColumn, Qt.SortOrder.AscendingOrder)
-        
+            GitPushDialog.LocalBranchColumn, Qt.SortOrder.AscendingOrder
+        )
+
         self.forceWarningLabel.setVisible(False)
-        
+
         index = self.remotesComboBox.findText("origin")
         if index == -1:
             index = 0
         self.remotesComboBox.setCurrentIndex(index)
-    
+
     def __resizeColumns(self):
         """
         Private slot to adjust the column sizes.
         """
         for col in range(self.branchesTree.columnCount()):
             self.branchesTree.resizeColumnToContents(col)
-    
+
     @pyqtSlot(str)
     def on_remotesComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle changes of the selected repository.
-        
+
         @param txt current text of the combo box (string)
         """
         self.remoteEdit.setText(self.__repos[txt])
-        
+
         for row in range(self.branchesTree.topLevelItemCount()):
             itm = self.branchesTree.topLevelItem(row)
             localBranch = itm.text(GitPushDialog.LocalBranchColumn)
-            combo = self.branchesTree.itemWidget(
-                itm, GitPushDialog.RemoteBranchColumn)
+            combo = self.branchesTree.itemWidget(itm, GitPushDialog.RemoteBranchColumn)
             combo.clear()
             combo.addItems([""] + sorted(self.__remotes[txt]))
             index = combo.findText(localBranch)
             if index != -1:
                 combo.setCurrentIndex(index)
-                itm.setCheckState(GitPushDialog.PushColumn,
-                                  Qt.CheckState.Checked)
+                itm.setCheckState(GitPushDialog.PushColumn, Qt.CheckState.Checked)
             else:
-                itm.setCheckState(GitPushDialog.PushColumn,
-                                  Qt.CheckState.Unchecked)
-            itm.setCheckState(GitPushDialog.ForceColumn,
-                              Qt.CheckState.Unchecked)
-        
+                itm.setCheckState(GitPushDialog.PushColumn, Qt.CheckState.Unchecked)
+            itm.setCheckState(GitPushDialog.ForceColumn, Qt.CheckState.Unchecked)
+
         self.__resizeColumns()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_branchesTree_itemChanged(self, item, column):
         """
         Private slot handling changes of a branch item.
-        
+
         @param item reference to the changed item (QTreeWidgetItem)
         @param column changed column (integer)
         """
         if column == GitPushDialog.PushColumn:
             # step 1: set the item's remote branch, if it is empty
-            if (
-                item.checkState(GitPushDialog.PushColumn) ==
-                Qt.CheckState.Checked and
-                (self.branchesTree.itemWidget(
-                    item,
-                    GitPushDialog.RemoteBranchColumn
-                ).currentText() == "")
+            if item.checkState(GitPushDialog.PushColumn) == Qt.CheckState.Checked and (
+                self.branchesTree.itemWidget(
+                    item, GitPushDialog.RemoteBranchColumn
+                ).currentText()
+                == ""
             ):
                 self.branchesTree.itemWidget(
-                    item, GitPushDialog.RemoteBranchColumn).setEditText(
-                    item.text(GitPushDialog.LocalBranchColumn))
-            
+                    item, GitPushDialog.RemoteBranchColumn
+                ).setEditText(item.text(GitPushDialog.LocalBranchColumn))
+
             # step 2: count checked items
             checkedItemsCount = 0
             for row in range(self.branchesTree.topLevelItemCount()):
                 itm = self.branchesTree.topLevelItem(row)
-                if (
-                    itm.checkState(GitPushDialog.PushColumn) ==
-                    Qt.CheckState.Checked
-                ):
+                if itm.checkState(GitPushDialog.PushColumn) == Qt.CheckState.Checked:
                     checkedItemsCount += 1
             if checkedItemsCount == len(self.__localBranches):
                 self.selectAllCheckBox.setCheckState(Qt.CheckState.Checked)
             elif checkedItemsCount == 0:
                 self.selectAllCheckBox.setCheckState(Qt.CheckState.Unchecked)
             else:
-                self.selectAllCheckBox.setCheckState(
-                    Qt.CheckState.PartiallyChecked)
-        
+                self.selectAllCheckBox.setCheckState(Qt.CheckState.PartiallyChecked)
+
         elif column == GitPushDialog.ForceColumn:
             forceItemsCount = 0
             for row in range(self.branchesTree.topLevelItemCount()):
                 itm = self.branchesTree.topLevelItem(row)
-                if (
-                    itm.checkState(GitPushDialog.ForceColumn) ==
-                    Qt.CheckState.Checked
-                ):
+                if itm.checkState(GitPushDialog.ForceColumn) == Qt.CheckState.Checked:
                     forceItemsCount += 1
             self.forceWarningLabel.setVisible(forceItemsCount > 0)
-    
+
     @pyqtSlot(int)
     def on_selectAllCheckBox_stateChanged(self, state):
         """
         Private slot to select/deselect all branch items.
-        
+
         @param state check state of the check box (Qt.CheckState)
         """
         if state != Qt.CheckState.PartiallyChecked:
@@ -172,11 +161,11 @@
                 itm = self.branchesTree.topLevelItem(row)
                 if itm.checkState(GitPushDialog.PushColumn) != state:
                     itm.setCheckState(GitPushDialog.PushColumn, state)
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return remote name, list of branches to be pushed,
             a flag indicating to push tags as well, a flag indicating
             to set tracking information and the push method for submodules
@@ -185,20 +174,16 @@
         refspecs = []
         for row in range(self.branchesTree.topLevelItemCount()):
             itm = self.branchesTree.topLevelItem(row)
-            force = (
-                itm.checkState(GitPushDialog.ForceColumn) ==
-                Qt.CheckState.Checked
-            )
-            if (
-                itm.checkState(GitPushDialog.PushColumn) ==
-                Qt.CheckState.Checked
-            ):
+            force = itm.checkState(GitPushDialog.ForceColumn) == Qt.CheckState.Checked
+            if itm.checkState(GitPushDialog.PushColumn) == Qt.CheckState.Checked:
                 localBranch = itm.text(GitPushDialog.LocalBranchColumn)
                 remoteBranch = self.branchesTree.itemWidget(
-                    itm, GitPushDialog.RemoteBranchColumn).currentText()
-                refspecs.append("{0}{1}:{2}".format(
-                    "+" if force else "", localBranch, remoteBranch))
-        
+                    itm, GitPushDialog.RemoteBranchColumn
+                ).currentText()
+                refspecs.append(
+                    "{0}{1}:{2}".format("+" if force else "", localBranch, remoteBranch)
+                )
+
         # submodule stuff (--recurse-submodules=)
         if self.submodulesOnDemandButton.isChecked():
             submodulesPush = "on-demand"
@@ -208,7 +193,7 @@
             submodulesPush = "only"
         else:
             submodulesPush = "no"
-        
+
         return (
             self.remotesComboBox.currentText(),
             refspecs,
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitReflogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitReflogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QTimer, QPoint
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QApplication,
-    QLineEdit
+    QWidget,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,85 +32,84 @@
     """
     Class implementing a dialog to browse the reflog history.
     """
+
     CommitIdColumn = 0
     SelectorColumn = 1
     NameColumn = 2
     OperationColumn = 3
     SubjectColumn = 4
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__position = QPoint()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.logTree.headerItem().setText(self.logTree.columnCount(), "")
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of commits"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of commits"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
-        
+
         self.__formatTemplate = (
-            'format:recordstart%n'
-            'commit|%h%n'
-            'selector|%gd%n'
-            'name|%gn%n'
-            'subject|%gs%n'
-            'recordend%n'
+            "format:recordstart%n"
+            "commit|%h%n"
+            "selector|%gd%n"
+            "name|%gn%n"
+            "subject|%gs%n"
+            "recordend%n"
         )
-        
+
         self.repodir = ""
         self.__currentCommitId = ""
-        
+
         self.__initData()
         self.__resetUI()
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
         """
-        self.buf = []        # buffer for stdout
+        self.buf = []  # buffer for stdout
         self.__started = False
         self.__skipEntries = 0
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -114,30 +117,28 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
-        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
-            "LogLimit"))
-        
+        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit"))
+
         self.logTree.clear()
-    
+
     def __resizeColumnsLog(self):
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __generateReflogItem(self, commitId, selector, name, subject):
         """
         Private method to generate a reflog tree entry.
-        
+
         @param commitId commit id info (string)
         @param selector selector info (string)
         @param name name info (string)
@@ -154,120 +155,116 @@
         ]
         itm = QTreeWidgetItem(self.logTree, columnLabels)
         return itm
-    
+
     def __getReflogEntries(self, skip=0):
         """
         Private method to retrieve reflog entries from the repository.
-        
+
         @param skip number of reflog entries to skip (integer)
         """
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         self.buf = []
         self.cancelled = False
         self.errors.clear()
         self.intercept = False
-        
+
         args = self.vcs.initCommand("log")
         args.append("--walk-reflogs")
-        args.append('--max-count={0}'.format(self.limitSpinBox.value()))
-        args.append('--abbrev={0}'.format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
-        args.append('--format={0}'.format(self.__formatTemplate))
-        args.append('--skip={0}'.format(skip))
-        
+        args.append("--max-count={0}".format(self.limitSpinBox.value()))
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
+        args.append("--format={0}".format(self.__formatTemplate))
+        args.append("--skip={0}".format(skip))
+
         self.__process.kill()
-        
+
         self.__process.setWorkingDirectory(self.repodir)
-        
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
-        
-        self.__process.start('git', args)
+
+        self.__process.start("git", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
+
     def start(self, projectdir):
         """
         Public slot to start the git log command.
-        
+
         @param projectdir directory name of the project (string)
         """
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.__initData()
-        
+
         # find the root of the repo
         self.repodir = projectdir
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__started = True
         self.__getReflogEntries()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__processBuffer()
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the git log command.
         """
         noEntries = 0
-        
+
         for line in self.buf:
             line = line.rstrip()
             if line == "recordstart":
@@ -275,8 +272,10 @@
             elif line == "recordend":
                 if len(logEntry) > 1:
                     self.__generateReflogItem(
-                        logEntry["commit"], logEntry["selector"],
-                        logEntry["name"], logEntry["subject"],
+                        logEntry["commit"],
+                        logEntry["selector"],
+                        logEntry["name"],
+                        logEntry["subject"],
                     )
                     noEntries += 1
             else:
@@ -287,13 +286,13 @@
                     value = line
                 if key in ("commit", "selector", "name", "subject"):
                     logEntry[key] = value.strip()
-        
+
         self.__resizeColumnsLog()
-        
+
         if self.__started:
             self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             self.__started = False
-        
+
         self.__skipEntries += noEntries
         if noEntries < self.limitSpinBox.value() and not self.cancelled:
             self.nextButton.setEnabled(False)
@@ -301,71 +300,71 @@
         else:
             self.nextButton.setEnabled(True)
             self.limitSpinBox.setEnabled(True)
-        
+
         # restore current item
         if self.__currentCommitId:
             items = self.logTree.findItems(
-                self.__currentCommitId, Qt.MatchFlag.MatchExactly,
-                self.CommitIdColumn)
+                self.__currentCommitId, Qt.MatchFlag.MatchExactly, self.CommitIdColumn
+            )
             if items:
                 self.logTree.setCurrentItem(items[0])
                 self.__currentCommitId = ""
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into a buffer.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            line = str(self.__process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            line = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.buf.append(line)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showError(s)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -377,20 +376,20 @@
             self.__currentCommitId = itm.text(self.CommitIdColumn)
         else:
             self.__currentCommitId = ""
-        
+
         self.start(self.repodir)
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -398,7 +397,7 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
@@ -406,23 +405,23 @@
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
         self.errorGroup.show()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -430,7 +429,7 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteCredentialsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteCredentialsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter the data of a remote repository.
     """
+
     def __init__(self, remoteName, remoteUrl, parent=None):
         """
         Constructor
-        
+
         @param remoteName name of the remote repository
         @type str
         @param remoteUrl URL of the remote repository
@@ -30,34 +31,33 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         url = QUrl(remoteUrl)
-        
+
         self.nameEdit.setText(remoteName)
-        self.urlEdit.setText(
-            url.toString(QUrl.UrlFormattingOption.RemoveUserInfo))
+        self.urlEdit.setText(url.toString(QUrl.UrlFormattingOption.RemoveUserInfo))
         self.userEdit.setText(url.userName())
         self.passwordEdit.setText(url.password())
-        
+
         self.userEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_userEdit_textChanged(self, txt):
         """
         Private slot handling changes of the entered user name.
-        
+
         @param txt current text
         @type str
         """
         self.passwordEdit.setEnabled(bool(txt))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple with name and URL of the remote repository
         @rtype tuple of (str, str)
         """
@@ -68,5 +68,5 @@
             password = self.passwordEdit.text()
             if password:
                 url.setPassword(password)
-        
+
         return self.nameEdit.text(), url.toString()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteRepositoriesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitRemoteRepositoriesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QTimer
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QTreeWidgetItem, QDialogButtonBox, QLineEdit
+    QWidget,
+    QHeaderView,
+    QTreeWidgetItem,
+    QDialogButtonBox,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -26,246 +30,241 @@
     """
     Class implementing a dialog to show available remote repositories.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcs = vcs
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.refreshButton.setToolTip(
-            self.tr("Press to refresh the repositories display"))
+            self.tr("Press to refresh the repositories display")
+        )
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__lastColumn = self.repolist.columnCount()
-        
+
         self.repolist.headerItem().setText(self.__lastColumn, "")
         self.repolist.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-    
+
     def __resort(self):
         """
         Private method to resort the list.
         """
         self.repolist.sortItems(
-            self.repolist.sortColumn(),
-            self.repolist.header().sortIndicatorOrder())
-    
+            self.repolist.sortColumn(), self.repolist.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.repolist.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.repolist.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.repolist.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, name, url, oper):
         """
         Private method to generate a status item in the status list.
-        
+
         @param name name of the remote repository (string)
         @param url URL of the remote repository (string)
         @param oper operation the remote repository may be used for (string)
         """
-        foundItems = self.repolist.findItems(
-            name, Qt.MatchFlag.MatchExactly, 0)
+        foundItems = self.repolist.findItems(name, Qt.MatchFlag.MatchExactly, 0)
         if foundItems:
             # modify the operations column only
-            foundItems[0].setText(
-                2, "{0} + {1}".format(foundItems[0].text(2), oper))
+            foundItems[0].setText(2, "{0} + {1}".format(foundItems[0].text(2), oper))
         else:
             QTreeWidgetItem(self.repolist, [name, url, oper])
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-    
+
     def start(self, projectDir):
         """
         Public slot to start the git remote command.
-        
+
         @param projectDir name of the project directory (string)
         """
         self.repolist.clear()
-        
+
         self.errorGroup.hide()
         self.intercept = False
         self.projectDir = projectDir
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.removeButton.setEnabled(False)
         self.renameButton.setEnabled(False)
         self.pruneButton.setEnabled(False)
         self.showInfoButton.setEnabled(False)
-        
+
         args = self.vcs.initCommand("remote")
-        args.append('--verbose')
-        
+        args.append("--verbose")
+
         # find the root of the repo
         repodir = self.projectDir
         while not os.path.isdir(os.path.join(repodir, self.vcs.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         self.process.kill()
         self.process.setWorkingDirectory(repodir)
-        
-        self.process.start('git', args)
+
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-            
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(
+                True
+            )
+
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
             self.refreshButton.setEnabled(False)
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__resort()
         self.__resizeColumns()
-        
+
         self.__updateButtons()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
             self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-            
+
             while self.process.canReadLine():
-                line = str(self.process.readLine(), self.__ioEncoding,
-                           'replace').strip()
-                
+                line = str(
+                    self.process.readLine(), self.__ioEncoding, "replace"
+                ).strip()
+
                 name, line = line.split(None, 1)
                 url, oper = line.rsplit(None, 1)
-                oper = oper[1:-1]   # it is enclosed in ()
+                oper = oper[1:-1]  # it is enclosed in ()
                 self.__generateItem(name, url, oper)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    self.__ioEncoding, 'replace')
+            s = str(self.process.readAllStandardError(), self.__ioEncoding, "replace")
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -273,30 +272,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -304,34 +303,34 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.projectDir)
-    
+
     def __updateButtons(self):
         """
         Private method to update the buttons status.
         """
         enable = len(self.repolist.selectedItems()) == 1
-        
+
         self.removeButton.setEnabled(enable)
         self.pruneButton.setEnabled(enable)
         self.showInfoButton.setEnabled(enable)
         self.renameButton.setEnabled(enable)
         self.changeUrlButton.setEnabled(enable)
         self.credentialsButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_repolist_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -339,7 +338,7 @@
         """
         self.vcs.gitAddRemote(self.projectDir)
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -348,7 +347,7 @@
         remoteName = self.repolist.selectedItems()[0].text(0)
         self.vcs.gitRemoveRemote(self.projectDir, remoteName)
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_showInfoButton_clicked(self):
         """
@@ -356,7 +355,7 @@
         """
         remoteName = self.repolist.selectedItems()[0].text(0)
         self.vcs.gitShowRemote(self.projectDir, remoteName)
-    
+
     @pyqtSlot()
     def on_pruneButton_clicked(self):
         """
@@ -364,7 +363,7 @@
         """
         remoteName = self.repolist.selectedItems()[0].text(0)
         self.vcs.gitPruneRemote(self.projectDir, remoteName)
-    
+
     @pyqtSlot()
     def on_renameButton_clicked(self):
         """
@@ -373,7 +372,7 @@
         remoteName = self.repolist.selectedItems()[0].text(0)
         self.vcs.gitRenameRemote(self.projectDir, remoteName)
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_changeUrlButton_clicked(self):
         """
@@ -384,7 +383,7 @@
         remoteUrl = repositoryItem.text(1)
         self.vcs.gitChangeRemoteUrl(self.projectDir, remoteName, remoteUrl)
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_credentialsButton_clicked(self):
         """
@@ -393,6 +392,5 @@
         repositoryItem = self.repolist.selectedItems()[0]
         remoteName = repositoryItem.text(0)
         remoteUrl = repositoryItem.text(1)
-        self.vcs.gitChangeRemoteCredentials(self.projectDir, remoteName,
-                                            remoteUrl)
+        self.vcs.gitChangeRemoteCredentials(self.projectDir, remoteName, remoteUrl)
         self.on_refreshButton_clicked()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,20 @@
     """
     Class implementing a dialog to select a revision.
     """
-    def __init__(self, tagsList, branchesList, trackingBranchesList=None,
-                 noneLabel="", showBranches=True, showHead=True, parent=None):
+
+    def __init__(
+        self,
+        tagsList,
+        branchesList,
+        trackingBranchesList=None,
+        noneLabel="",
+        showBranches=True,
+        showHead=True,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
         @param trackingBranchesList list of remote branches (list of strings)
@@ -33,29 +42,28 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["master"] + sorted(branchesList))
-        
+
         self.tipButton.setVisible(showHead)
         self.branchButton.setVisible(showBranches)
         self.branchCombo.setVisible(showBranches)
-        
+
         if noneLabel:
             self.noneButton.setText(noneLabel)
-        
+
         if trackingBranchesList is not None:
             self.remoteBranchCombo.addItems(sorted(trackingBranchesList))
         else:
             self.remoteBranchButton.setVisible(False)
             self.remoteBranchCombo.setVisible(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -69,86 +77,85 @@
             enabled = self.branchCombo.currentText() != ""
         elif self.remoteBranchButton.isChecked():
             enabled = self.remoteBranchCombo.currentText() != ""
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(bool)
     def on_revButton_toggled(self, checked):
         """
         Private slot to handle changes of the rev select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tagButton_toggled(self, checked):
         """
         Private slot to handle changes of the Tag select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_remoteBranchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Remote Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_revEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the rev edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_remoteBranchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Remote Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     def getRevision(self):
         """
         Public method to retrieve the selected revision.
-        
+
         @return selected revision (string)
         """
         if self.revButton.isChecked():
@@ -163,5 +170,5 @@
             rev = "HEAD"
         else:
             rev = ""
-        
+
         return rev
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionsSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitRevisionsSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,28 +18,28 @@
     Class implementing a dialog to enter the revisions for the git diff
     command.
     """
+
     def __init__(self, tagsList, branchesList, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
         @param parent parent widget of the dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tag1Combo.addItems(sorted(tagsList))
         self.tag2Combo.addItems(sorted(tagsList))
         self.branch1Combo.addItems(["master"] + sorted(branchesList))
         self.branch2Combo.addItems(["master"] + sorted(branchesList))
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -51,129 +51,128 @@
             enabled = enabled and self.tag1Combo.currentText() != ""
         elif self.branch1Button.isChecked():
             enabled = enabled and self.branch1Combo.currentText() != ""
-        
+
         if self.rev2Button.isChecked():
             enabled = enabled and self.rev2Edit.text() != ""
         elif self.tag2Button.isChecked():
             enabled = enabled and self.tag2Combo.currentText() != ""
         elif self.branch2Button.isChecked():
             enabled = enabled and self.branch2Combo.currentText() != ""
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(bool)
     def on_rev1Button_toggled(self, checked):
         """
         Private slot to handle changes of the rev1 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_rev2Button_toggled(self, checked):
         """
         Private slot to handle changes of the rev2 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tag1Button_toggled(self, checked):
         """
         Private slot to handle changes of the Tag1 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tag2Button_toggled(self, checked):
         """
         Private slot to handle changes of the Tag2 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branch1Button_toggled(self, checked):
         """
         Private slot to handle changes of the Branch1 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branch2Button_toggled(self, checked):
         """
         Private slot to handle changes of the Branch2 select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_rev1Edit_textChanged(self, txt):
         """
         Private slot to handle changes of the rev1 edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_rev2Edit_textChanged(self, txt):
         """
         Private slot to handle changes of the rev2 edit.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tag1Combo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag1 combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tag2Combo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag2 combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branch1Combo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch1 combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branch2Combo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch2 combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     def __getRevision(self, no):
         """
         Private method to generate the revision.
-        
+
         @param no revision number to generate (1 or 2)
         @return revision (string)
         """
@@ -197,7 +196,7 @@
             tipButton = self.tip2Button
             prevButton = self.prev2Button
             noneButton = self.none2Button
-        
+
         if revButton.isChecked():
             return revEdit.text()
         elif tagButton.isChecked():
@@ -210,16 +209,16 @@
             return "HEAD^"
         elif noneButton.isChecked():
             return ""
-        
+
         return ""
-    
+
     def getRevisions(self):
         """
         Public method to get the revisions.
-        
+
         @return list of two revisions (list of strings)
         """
         rev1 = self.__getRevision(1)
         rev2 = self.__getRevision(2)
-        
+
         return [rev1, rev2]
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitStashBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitStashBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,14 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint, QProcess, QTimer
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QTreeWidgetItem, QAbstractButton, QMenu,
-    QHeaderView, QApplication, QLineEdit
+    QWidget,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QAbstractButton,
+    QMenu,
+    QHeaderView,
+    QApplication,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,89 +34,91 @@
     """
     Class implementing a dialog to show the stashes.
     """
+
     NameColumn = 0
     DateColumn = 1
     MessageColumn = 2
-    
+
     Separator = "@@||@@"
-    
+
     TotalStatisticsRole = Qt.ItemDataRole.UserRole
     FileStatisticsRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__position = QPoint()
-        
+
         self.__fileStatisticsRole = Qt.ItemDataRole.UserRole
         self.__totalStatisticsRole = Qt.ItemDataRole.UserRole + 1
-        
-        self.stashList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+
+        self.stashList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of stashes"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of stashes"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
         self.__resetUI()
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.__contextMenu = QMenu()
         self.__differencesAct = self.__contextMenu.addAction(
-            self.tr("Show"), self.__showPatch)
+            self.tr("Show"), self.__showPatch
+        )
         self.__contextMenu.addSeparator()
         self.__applyAct = self.__contextMenu.addAction(
-            self.tr("Restore && Keep"), self.__apply)
+            self.tr("Restore && Keep"), self.__apply
+        )
         self.__popAct = self.__contextMenu.addAction(
-            self.tr("Restore && Delete"), self.__pop)
+            self.tr("Restore && Delete"), self.__pop
+        )
         self.__contextMenu.addSeparator()
         self.__branchAct = self.__contextMenu.addAction(
-            self.tr("Create Branch"), self.__branch)
+            self.tr("Create Branch"), self.__branch
+        )
         self.__contextMenu.addSeparator()
-        self.__dropAct = self.__contextMenu.addAction(
-            self.tr("Delete"), self.__drop)
+        self.__dropAct = self.__contextMenu.addAction(self.tr("Delete"), self.__drop)
         self.__clearAct = self.__contextMenu.addAction(
-            self.tr("Delete All"), self.__clear)
-    
+            self.tr("Delete All"), self.__clear
+        )
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -118,135 +126,129 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
         self.stashList.clear()
-    
+
     def __resizeColumnsStashes(self):
         """
         Private method to resize the shelve list columns.
         """
-        self.stashList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.stashList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.stashList.header().setStretchLastSection(True)
-    
+
     def __generateStashEntry(self, name, date, message):
         """
         Private method to generate the stash items.
-        
+
         @param name name of the stash (string)
         @param date date the stash was created (string)
         @param message stash message (string)
         """
         QTreeWidgetItem(self.stashList, [name, date, message])
-    
+
     def __getStashEntries(self):
         """
         Private method to retrieve the list of stashes.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
         self.refreshButton.setEnabled(False)
-        
+
         self.buf = []
         self.errors.clear()
         self.intercept = False
-        
+
         args = self.vcs.initCommand("stash")
         args.append("list")
         args.append("--format=format:%gd{0}%ai{0}%gs%n".format(self.Separator))
-        
+
         self.__process.kill()
-        
+
         self.__process.setWorkingDirectory(self.repodir)
-        
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
-        
-        self.__process.start('git', args)
+
+        self.__process.start("git", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
+
     def start(self, projectDir):
         """
         Public slot to start the git stash command.
-        
+
         @param projectDir name of the project directory (string)
         """
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.__projectDir = projectDir
-        
+
         # find the root of the repo
         self.repodir = self.__projectDir
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.stashList.clear()
         self.__started = True
         self.__getStashEntries()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__processBuffer()
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the git stash command.
@@ -255,65 +257,59 @@
             name, date, message = line.split(self.Separator)
             date = date.strip().rsplit(":", 1)[0]
             self.__generateStashEntry(name, date, message.strip())
-        
+
         self.__resizeColumnsStashes()
-        
+
         if self.__started:
             self.stashList.setCurrentItem(self.stashList.topLevelItem(0))
             self.__started = False
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into a buffer.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            line = str(self.__process.readLine(), self.__ioEncoding,
-                       'replace').strip()
+            line = str(self.__process.readLine(), self.__ioEncoding, "replace").strip()
             if line:
                 self.buf.append(line)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    self.__ioEncoding, 'replace')
+            s = str(self.__process.readAllStandardError(), self.__ioEncoding, "replace")
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_stashList_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the stash list changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -321,71 +317,86 @@
         self.filesLabel.setText("")
         self.insertionsLabel.setText("")
         self.deletionsLabel.setText("")
-        
+
         if current:
             if current.data(0, self.TotalStatisticsRole) is None:
                 args = self.vcs.initCommand("stash")
                 args.append("show")
-                args.append('--numstat')
+                args.append("--numstat")
                 args.append(current.text(self.NameColumn))
-                
+
                 output = ""
                 process = QProcess()
                 process.setWorkingDirectory(self.repodir)
-                process.start('git', args)
+                process.start("git", args)
                 procStarted = process.waitForStarted(5000)
                 if procStarted:
                     finished = process.waitForFinished(30000)
                     if finished and process.exitCode() == 0:
-                        output = str(process.readAllStandardOutput(),
-                                     Preferences.getSystem("IOEncoding"),
-                                     'replace')
-                
+                        output = str(
+                            process.readAllStandardOutput(),
+                            Preferences.getSystem("IOEncoding"),
+                            "replace",
+                        )
+
                 if output:
                     totals = {"files": 0, "additions": 0, "deletions": 0}
                     fileData = []
                     for line in output.splitlines():
-                        additions, deletions, name = (
-                            line.strip().split(None, 2)
-                        )
+                        additions, deletions, name = line.strip().split(None, 2)
                         totals["files"] += 1
                         if additions != "-":
                             totals["additions"] += int(additions)
                         if deletions != "-":
                             totals["deletions"] += int(deletions)
-                        fileData.append({
-                            "file": name,
-                            "total": ("-" if additions == "-" else
-                                      str(int(additions) + int(deletions))),
-                            "added": additions,
-                            "deleted": deletions
-                        })
+                        fileData.append(
+                            {
+                                "file": name,
+                                "total": (
+                                    "-"
+                                    if additions == "-"
+                                    else str(int(additions) + int(deletions))
+                                ),
+                                "added": additions,
+                                "deleted": deletions,
+                            }
+                        )
                     current.setData(0, self.TotalStatisticsRole, totals)
                     current.setData(0, self.FileStatisticsRole, fileData)
                 else:
                     return
-            
+
             for dataDict in current.data(0, self.FileStatisticsRole):
-                QTreeWidgetItem(self.statisticsList, [
-                    dataDict["file"], dataDict["total"],
-                    dataDict["added"], dataDict["deleted"]])
+                QTreeWidgetItem(
+                    self.statisticsList,
+                    [
+                        dataDict["file"],
+                        dataDict["total"],
+                        dataDict["added"],
+                        dataDict["deleted"],
+                    ],
+                )
             self.statisticsList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
+                QHeaderView.ResizeMode.ResizeToContents
+            )
             self.statisticsList.header().setStretchLastSection(True)
-            
+
             totals = current.data(0, self.TotalStatisticsRole)
             self.filesLabel.setText(
-                self.tr("%n file(s) changed", None, totals["files"]))
+                self.tr("%n file(s) changed", None, totals["files"])
+            )
             self.insertionsLabel.setText(
-                self.tr("%n line(s) inserted", None, int(totals["additions"])))
+                self.tr("%n line(s) inserted", None, int(totals["additions"]))
+            )
             self.deletionsLabel.setText(
-                self.tr("%n line(s) deleted", None, int(totals["deletions"])))
-    
+                self.tr("%n line(s) deleted", None, int(totals["deletions"]))
+            )
+
     @pyqtSlot(QPoint)
     def on_stashList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the stash list.
-        
+
         @param pos position of the mouse pointer (QPoint)
         """
         enable = len(self.stashList.selectedItems()) == 1
@@ -395,16 +406,16 @@
         self.__branchAct.setEnabled(enable)
         self.__dropAct.setEnabled(enable)
         self.__clearAct.setEnabled(self.stashList.topLevelItemCount() > 0)
-        
+
         self.__contextMenu.popup(self.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the list of shelves.
         """
         self.start(self.__projectDir)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -412,7 +423,7 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
@@ -420,12 +431,12 @@
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
         self.errorGroup.show()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     @pyqtSlot()
     def on_input_returnPressed(self):
         """
@@ -433,23 +444,23 @@
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     @pyqtSlot(bool)
     def on_passwordCheckBox_toggled(self, checked):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param checked flag indicating the status of the check box (boolean)
         """
         if checked:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -457,21 +468,21 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     def __showPatch(self):
         """
         Private slot to show the contents of the selected stash.
         """
         stashName = self.stashList.selectedItems()[0].text(self.NameColumn)
         self.vcs.gitStashShowPatch(self.__projectDir, stashName)
-    
+
     def __apply(self):
         """
         Private slot to apply the selected stash but keep it.
         """
         stashName = self.stashList.selectedItems()[0].text(self.NameColumn)
         self.vcs.gitStashApply(self.__projectDir, stashName)
-    
+
     def __pop(self):
         """
         Private slot to apply the selected stash and delete it.
@@ -479,7 +490,7 @@
         stashName = self.stashList.selectedItems()[0].text(self.NameColumn)
         self.vcs.gitStashPop(self.__projectDir, stashName)
         self.on_refreshButton_clicked()
-    
+
     def __branch(self):
         """
         Private slot to create a branch from the selected stash.
@@ -487,7 +498,7 @@
         stashName = self.stashList.selectedItems()[0].text(self.NameColumn)
         self.vcs.gitStashBranch(self.__projectDir, stashName)
         self.on_refreshButton_clicked()
-    
+
     def __drop(self):
         """
         Private slot to delete the selected stash.
@@ -496,7 +507,7 @@
         res = self.vcs.gitStashDrop(self.__projectDir, stashName)
         if res:
             self.on_refreshButton_clicked()
-    
+
     def __clear(self):
         """
         Private slot to delete all stashes.
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitStashDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitStashDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,27 @@
     """
     Class implementing a dialog to enter the data for a stash operation.
     """
+
     NoUntracked = 0
     UntrackedOnly = 1
     UntrackedAndIgnored = 2
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the user data.
-        
+
         @return tuple containing the message (string), a flag indicating to
             keep changes in the staging area (boolean) and an indication to
             stash untracked and/or ignored files (integer)
@@ -46,6 +47,5 @@
             untracked = self.UntrackedOnly
         else:
             untracked = self.UntrackedAndIgnored
-        
-        return (self.messageEdit.text(), self.keepCheckBox.isChecked(),
-                untracked)
+
+        return (self.messageEdit.text(), self.keepCheckBox.isChecked(), untracked)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,8 +15,13 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QTimer, QSize
 from PyQt6.QtGui import QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem, QLineEdit,
-    QInputDialog
+    QWidget,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
+    QLineEdit,
+    QInputDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -40,36 +45,35 @@
     Class implementing a dialog to show the output of the git status command
     process.
     """
+
     ConflictStates = ["AA", "AU", "DD", "DU", "UA", "UD", "UU"]
-    
+
     ConflictRole = Qt.ItemDataRole.UserRole
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__toBeCommittedColumn = 0
         self.__statusWorkColumn = 1
         self.__statusIndexColumn = 2
         self.__pathColumn = 3
         self.__lastColumn = self.statusList.columnCount()
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the status display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the status display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.diff = None
         self.vcs = vcs
         self.vcs.committed.connect(self.__committed)
@@ -77,106 +81,111 @@
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.errorGroup.hide()
         self.inputGroup.hide()
-        
+
         self.vDiffSplitter.setStretchFactor(0, 2)
         self.vDiffSplitter.setStretchFactor(0, 2)
         self.vDiffSplitter.setSizes([400, 400])
         self.__hDiffSplitterState = None
         self.__vDiffSplitterState = None
-        
+
         self.statusList.headerItem().setText(self.__lastColumn, "")
         self.statusList.header().setSortIndicator(
-            self.__pathColumn, Qt.SortOrder.AscendingOrder)
-        
+            self.__pathColumn, Qt.SortOrder.AscendingOrder
+        )
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.lDiffEdit.document().setDefaultFont(font)
         self.rDiffEdit.document().setDefaultFont(font)
-        self.lDiffEdit.customContextMenuRequested.connect(
-            self.__showLDiffContextMenu)
-        self.rDiffEdit.customContextMenuRequested.connect(
-            self.__showRDiffContextMenu)
-        
+        self.lDiffEdit.customContextMenuRequested.connect(self.__showLDiffContextMenu)
+        self.rDiffEdit.customContextMenuRequested.connect(self.__showRDiffContextMenu)
+
         self.__lDiffMenu = QMenu()
         self.__stageLinesAct = self.__lDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
             self.tr("Stage Selected Lines"),
-            self.__stageHunkOrLines)
+            self.__stageHunkOrLines,
+        )
         self.__revertLinesAct = self.__lDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
             self.tr("Revert Selected Lines"),
-            self.__revertHunkOrLines)
+            self.__revertHunkOrLines,
+        )
         self.__stageHunkAct = self.__lDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
             self.tr("Stage Hunk"),
-            self.__stageHunkOrLines)
+            self.__stageHunkOrLines,
+        )
         self.__revertHunkAct = self.__lDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
             self.tr("Revert Hunk"),
-            self.__revertHunkOrLines)
-        
+            self.__revertHunkOrLines,
+        )
+
         self.__rDiffMenu = QMenu()
         self.__unstageLinesAct = self.__rDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
             self.tr("Unstage Selected Lines"),
-            self.__unstageHunkOrLines)
+            self.__unstageHunkOrLines,
+        )
         self.__unstageHunkAct = self.__rDiffMenu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
             self.tr("Unstage Hunk"),
-            self.__unstageHunkOrLines)
-        
+            self.__unstageHunkOrLines,
+        )
+
         self.lDiffHighlighter = GitDiffHighlighter(self.lDiffEdit.document())
         self.rDiffHighlighter = GitDiffHighlighter(self.rDiffEdit.document())
-        
+
         self.lDiffParser = None
         self.rDiffParser = None
-        
+
         self.__selectedName = ""
-        
+
         self.__diffGenerator = GitDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.modifiedIndicators = [
-            self.tr('added'),
-            self.tr('copied'),
-            self.tr('deleted'),
-            self.tr('modified'),
-            self.tr('renamed'),
+            self.tr("added"),
+            self.tr("copied"),
+            self.tr("deleted"),
+            self.tr("modified"),
+            self.tr("renamed"),
         ]
         self.modifiedOnlyIndicators = [
-            self.tr('modified'),
+            self.tr("modified"),
         ]
-        
+
         self.unversionedIndicators = [
-            self.tr('not tracked'),
+            self.tr("not tracked"),
         ]
-        
+
         self.missingIndicators = [
-            self.tr('deleted'),
+            self.tr("deleted"),
         ]
-        
+
         self.unmergedIndicators = [
-            self.tr('unmerged'),
+            self.tr("unmerged"),
         ]
 
         self.status = {
-            ' ': self.tr("unmodified"),
-            'A': self.tr('added'),
-            'C': self.tr('copied'),
-            'D': self.tr('deleted'),
-            'M': self.tr('modified'),
-            'R': self.tr('renamed'),
-            'U': self.tr('unmerged'),
-            '?': self.tr('not tracked'),
-            '!': self.tr('ignored'),
+            " ": self.tr("unmodified"),
+            "A": self.tr("added"),
+            "C": self.tr("copied"),
+            "D": self.tr("deleted"),
+            "M": self.tr("modified"),
+            "R": self.tr("renamed"),
+            "U": self.tr("unmerged"),
+            "?": self.tr("not tracked"),
+            "!": self.tr("ignored"),
         }
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.__initActionsMenu()
-    
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -185,209 +194,216 @@
         self.__actionsMenu.setTearOffEnabled(True)
         self.__actionsMenu.setToolTipsVisible(True)
         self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu)
-        
+
         self.__commitAct = self.__actionsMenu.addAction(
-            self.tr("Commit"), self.__commit)
+            self.tr("Commit"), self.__commit
+        )
         self.__commitAct.setToolTip(self.tr("Commit the selected changes"))
-        self.__amendAct = self.__actionsMenu.addAction(
-            self.tr("Amend"), self.__amend)
-        self.__amendAct.setToolTip(self.tr(
-            "Amend the latest commit with the selected changes"))
+        self.__amendAct = self.__actionsMenu.addAction(self.tr("Amend"), self.__amend)
+        self.__amendAct.setToolTip(
+            self.tr("Amend the latest commit with the selected changes")
+        )
         self.__commitSelectAct = self.__actionsMenu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll)
+            self.tr("Select all for commit"), self.__commitSelectAll
+        )
         self.__commitDeselectAct = self.__actionsMenu.addAction(
-            self.tr("Unselect all from commit"), self.__commitDeselectAll)
-        
+            self.tr("Unselect all from commit"), self.__commitDeselectAll
+        )
+
         self.__actionsMenu.addSeparator()
-        self.__addAct = self.__actionsMenu.addAction(
-            self.tr("Add"), self.__add)
+        self.__addAct = self.__actionsMenu.addAction(self.tr("Add"), self.__add)
         self.__addAct.setToolTip(self.tr("Add the selected files"))
         self.__stageAct = self.__actionsMenu.addAction(
-            self.tr("Stage changes"), self.__stage)
-        self.__stageAct.setToolTip(self.tr(
-            "Stages all changes of the selected files"))
+            self.tr("Stage changes"), self.__stage
+        )
+        self.__stageAct.setToolTip(self.tr("Stages all changes of the selected files"))
         self.__unstageAct = self.__actionsMenu.addAction(
-            self.tr("Unstage changes"), self.__unstage)
-        self.__unstageAct.setToolTip(self.tr(
-            "Unstages all changes of the selected files"))
-        
+            self.tr("Unstage changes"), self.__unstage
+        )
+        self.__unstageAct.setToolTip(
+            self.tr("Unstages all changes of the selected files")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__diffAct = self.__actionsMenu.addAction(
-            self.tr("Differences"), self.__diff)
-        self.__diffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry in a"
-            " separate dialog"))
+            self.tr("Differences"), self.__diff
+        )
+        self.__diffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry in a" " separate dialog"
+            )
+        )
         self.__sbsDiffAct = self.__actionsMenu.addAction(
-            self.tr("Differences Side-By-Side"), self.__sbsDiff)
-        self.__sbsDiffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry side-by-side in"
-            " a separate dialog"))
-        
-        self.__actionsMenu.addSeparator()
-        
-        self.__revertAct = self.__actionsMenu.addAction(
-            self.tr("Revert"), self.__revert)
-        self.__revertAct.setToolTip(self.tr(
-            "Reverts the changes of the selected files"))
-        
+            self.tr("Differences Side-By-Side"), self.__sbsDiff
+        )
+        self.__sbsDiffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry side-by-side in"
+                " a separate dialog"
+            )
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
+        self.__revertAct = self.__actionsMenu.addAction(
+            self.tr("Revert"), self.__revert
+        )
+        self.__revertAct.setToolTip(
+            self.tr("Reverts the changes of the selected files")
+        )
+
+        self.__actionsMenu.addSeparator()
+
         self.__forgetAct = self.__actionsMenu.addAction(
-            self.tr("Forget Missing"), self.__forget)
-        self.__forgetAct.setToolTip(self.tr(
-            "Forgets about the selected missing files"))
+            self.tr("Forget Missing"), self.__forget
+        )
+        self.__forgetAct.setToolTip(self.tr("Forgets about the selected missing files"))
         self.__restoreAct = self.__actionsMenu.addAction(
-            self.tr("Restore Missing"), self.__restoreMissing)
-        self.__restoreAct.setToolTip(self.tr(
-            "Restores the selected missing files"))
-        
+            self.tr("Restore Missing"), self.__restoreMissing
+        )
+        self.__restoreAct.setToolTip(self.tr("Restores the selected missing files"))
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__editAct = self.__actionsMenu.addAction(
-            self.tr("Edit Conflict"), self.__editConflict)
-        self.__editAct.setToolTip(self.tr(
-            "Edit the selected conflicting file"))
-        
+            self.tr("Edit Conflict"), self.__editConflict
+        )
+        self.__editAct.setToolTip(self.tr("Edit the selected conflicting file"))
+
         self.__actionsMenu.addSeparator()
-        
+
         act = self.__actionsMenu.addAction(
-            self.tr("Adjust column sizes"), self.__resizeColumns)
-        act.setToolTip(self.tr(
-            "Adjusts the width of all columns to their contents"))
-        
-        self.actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
+            self.tr("Adjust column sizes"), self.__resizeColumns
+        )
+        act.setToolTip(self.tr("Adjusts the width of all columns to their contents"))
+
+        self.actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
         self.actionsButton.setMenu(self.__actionsMenu)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.vcs.getPlugin().setPreferences(
-            "StatusDialogGeometry", self.saveGeometry())
+
+        self.vcs.getPlugin().setPreferences("StatusDialogGeometry", self.saveGeometry())
         self.vcs.getPlugin().setPreferences(
-            "StatusDialogSplitterStates", [
-                self.vDiffSplitter.saveState(),
-                self.hDiffSplitter.saveState()
-            ]
+            "StatusDialogSplitterStates",
+            [self.vDiffSplitter.saveState(), self.hDiffSplitter.saveState()],
         )
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
         """
         super().show()
-        
-        geom = self.vcs.getPlugin().getPreferences(
-            "StatusDialogGeometry")
+
+        geom = self.vcs.getPlugin().getPreferences("StatusDialogGeometry")
         if geom.isEmpty():
             s = QSize(900, 600)
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-        
-        states = self.vcs.getPlugin().getPreferences(
-            "StatusDialogSplitterStates")
+
+        states = self.vcs.getPlugin().getPreferences("StatusDialogSplitterStates")
         if len(states) == 2:
             # we have two splitters
             self.vDiffSplitter.restoreState(states[0])
             self.hDiffSplitter.restoreState(states[1])
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.statusList.sortItems(
-            self.statusList.sortColumn(),
-            self.statusList.header().sortIndicatorOrder())
-    
+            self.statusList.sortColumn(), self.statusList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.statusList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.statusList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, status, path):
         """
         Private method to generate a status item in the status list.
-        
+
         @param status status indicator (string)
         @param path path of the file or directory (string)
         """
         statusWorkText = self.status[status[1]]
         statusIndexText = self.status[status[0]]
-        itm = QTreeWidgetItem(self.statusList, [
-            "",
-            statusWorkText,
-            statusIndexText,
-            path,
-        ])
-        
-        itm.setTextAlignment(self.__statusWorkColumn,
-                             Qt.AlignmentFlag.AlignHCenter)
-        itm.setTextAlignment(self.__statusIndexColumn,
-                             Qt.AlignmentFlag.AlignHCenter)
-        itm.setTextAlignment(self.__pathColumn,
-                             Qt.AlignmentFlag.AlignLeft)
-    
+        itm = QTreeWidgetItem(
+            self.statusList,
+            [
+                "",
+                statusWorkText,
+                statusIndexText,
+                path,
+            ],
+        )
+
+        itm.setTextAlignment(self.__statusWorkColumn, Qt.AlignmentFlag.AlignHCenter)
+        itm.setTextAlignment(self.__statusIndexColumn, Qt.AlignmentFlag.AlignHCenter)
+        itm.setTextAlignment(self.__pathColumn, Qt.AlignmentFlag.AlignLeft)
+
         if (
-            status not in self.ConflictStates + ["??", "!!"] and
-            statusIndexText in self.modifiedIndicators
+            status not in self.ConflictStates + ["??", "!!"]
+            and statusIndexText in self.modifiedIndicators
         ):
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
-            itm.setCheckState(self.__toBeCommittedColumn,
-                              Qt.CheckState.Checked)
+            itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
         else:
             itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
-        
+
         if statusWorkText not in self.__statusFilters:
             self.__statusFilters.append(statusWorkText)
         if statusIndexText not in self.__statusFilters:
             self.__statusFilters.append(statusIndexText)
-        
+
         if status in self.ConflictStates:
-            itm.setIcon(self.__statusWorkColumn,
-                        UI.PixmapCache.getIcon(
-                            os.path.join("VcsPlugins", "vcsGit", "icons",
-                                         "conflict.svg")))
+            itm.setIcon(
+                self.__statusWorkColumn,
+                UI.PixmapCache.getIcon(
+                    os.path.join("VcsPlugins", "vcsGit", "icons", "conflict.svg")
+                ),
+            )
         itm.setData(0, self.ConflictRole, status in self.ConflictStates)
-    
+
     def start(self, fn):
         """
         Public slot to start the git status command.
-        
+
         @param fn filename(s)/directoryname(s) to show the status of
             (string or list of strings)
         """
         self.errorGroup.hide()
         self.intercept = False
         self.args = fn
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.statusFilterCombo.clear()
         self.__statusFilters = []
         self.statusList.clear()
-        
-        self.setWindowTitle(self.tr('Git Status'))
-        
+
+        self.setWindowTitle(self.tr("Git Status"))
+
         args = self.vcs.initCommand("status")
-        args.append('--porcelain')
+        args.append("--porcelain")
         args.append("--")
         if isinstance(fn, list):
             self.dname, fnames = self.vcs.splitPathList(fn)
@@ -395,149 +411,143 @@
         else:
             self.dname, fname = self.vcs.splitPath(fn)
             args.append(fn)
-        
+
         # find the root of the repo
         self.__repodir = self.dname
-        while not os.path.isdir(
-                os.path.join(self.__repodir, self.vcs.adminDir)):
+        while not os.path.isdir(os.path.join(self.__repodir, self.vcs.adminDir)):
             self.__repodir = os.path.dirname(self.__repodir)
             if os.path.splitdrive(self.__repodir)[1] == os.sep:
                 return
-        
+
         self.process.kill()
         self.process.setWorkingDirectory(self.__repodir)
-        
-        self.process.start('git', args)
+
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-            
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(
+                True
+            )
+
             self.refreshButton.setEnabled(False)
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__statusFilters.sort()
         self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
         self.__refreshDiff()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
             self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-            
+
             while self.process.canReadLine():
-                line = str(self.process.readLine(), self.__ioEncoding,
-                           'replace')
-                
+                line = str(self.process.readLine(), self.__ioEncoding, "replace")
+
                 status = line[:2]
                 path = line[3:].strip().split(" -> ")[-1].strip('"')
                 self.__generateItem(status, path)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    self.__ioEncoding, 'replace')
+            s = str(self.process.readAllStandardError(), self.__ioEncoding, "replace")
             self.errorGroup.show()
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-            
+
             # show input in case the process asked for some input
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -545,30 +555,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -576,7 +586,7 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -587,14 +597,14 @@
             self.__selectedName = selectedItems[0].text(self.__pathColumn)
         else:
             self.__selectedName = ""
-        
+
         self.start(self.args)
-    
+
     @pyqtSlot(int)
     def on_statusFilterCombo_activated(self, index):
         """
         Private slot to react to the selection of a status filter.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -607,21 +617,21 @@
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(
-                    topItem.text(self.__statusWorkColumn) != txt and
-                    topItem.text(self.__statusIndexColumn) != txt
+                    topItem.text(self.__statusWorkColumn) != txt
+                    and topItem.text(self.__statusIndexColumn) != txt
                 )
-    
+
     @pyqtSlot()
     def on_statusList_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__generateDiffs()
-    
+
     ###########################################################################
     ## Menu handling methods
     ###########################################################################
-    
+
     def __showActionsMenu(self):
         """
         Private slot to prepare the actions button menu before it is shown.
@@ -649,36 +659,38 @@
         self.__forgetAct.setEnabled(missing)
         self.__restoreAct.setEnabled(missing)
         self.__editAct.setEnabled(conflicting == 1)
-    
+
     def __amend(self):
         """
         Private slot to handle the Amend context menu entry.
         """
         self.__commit(amend=True)
-    
+
     def __commit(self, amend=False):
         """
         Private slot to handle the Commit context menu entry.
-        
+
         @param amend flag indicating to perform an amend operation (boolean)
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getCommitableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getCommitableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Commit"),
-                self.tr("""There are no entries selected to be"""
-                        """ committed."""))
+                self.tr("""There are no entries selected to be""" """ committed."""),
+            )
             return
-        
+
         if Preferences.getVCS("AutoSaveFiles"):
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
         self.vcs.vcsCommit(names, commitAll=False, amend=amend)
         # staged changes
-    
+
     def __committed(self):
         """
         Private slot called after the commit has finished.
@@ -686,97 +698,111 @@
         if self.isVisible():
             self.on_refreshButton_clicked()
             self.vcs.checkVCSStatus()
-    
+
     def __commitSelectAll(self):
         """
         Private slot to select all entries for commit.
         """
         self.__commitSelect(True)
-    
+
     def __commitDeselectAll(self):
         """
         Private slot to deselect all entries from commit.
         """
         self.__commitSelect(False)
-    
+
     def __add(self):
         """
         Private slot to handle the Add context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getUnversionedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsAdd(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __stage(self):
         """
         Private slot to handle the Stage context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getStageableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getStageableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Stage"),
-                self.tr("""There are no stageable entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no stageable entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsAdd(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __unstage(self):
         """
         Private slot to handle the Unstage context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getUnstageableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getUnstageableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Unstage"),
-                self.tr("""There are no unstageable entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unstageable entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.gitUnstage(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __forget(self):
         """
         Private slot to handle the Forget Missing context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Forget Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
 
         self.vcs.vcsRemove(names, stageOnly=True)
@@ -786,14 +812,19 @@
         """
         Private slot to handle the Revert context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getStageableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getStageableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no uncommitted, unstaged changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted, unstaged changes"""
+                    """ available/selected."""
+                ),
+            )
             return
 
         self.vcs.vcsRevert(names)
@@ -810,20 +841,22 @@
         """
         Private slot to handle the Restore Missing context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Restore Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
 
         self.vcs.vcsRevert(names)
         self.on_refreshButton_clicked()
         self.vcs.checkVCSStatus()
-    
+
     def __editConflict(self):
         """
         Private slot to handle the Edit Conflict context menu entry.
@@ -837,38 +870,45 @@
         """
         Private slot to handle the Diff context menu entry.
         """
-        namesW = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                  for itm in self.__getStageableItems()]
-        namesS = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                  for itm in self.__getUnstageableItems()]
+        namesW = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getStageableItems()
+        ]
+        namesS = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getUnstageableItems()
+        ]
         if not namesW and not namesS:
             EricMessageBox.information(
                 self,
                 self.tr("Differences"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         diffMode = "work2stage2repo"
         names = namesW + namesS
-        
+
         if self.diff is None:
             from .GitDiffDialog import GitDiffDialog
+
             self.diff = GitDiffDialog(self.vcs)
         self.diff.show()
         self.diff.start(names, diffMode=diffMode, refreshable=True)
-    
+
     def __sbsDiff(self):
         """
         Private slot to handle the Side-By-Side Diff context menu entry.
         """
         itm = self.__getModifiedOnlyItems()[0]
-        workModified = (itm.text(self.__statusWorkColumn) in
-                        self.modifiedOnlyIndicators)
-        stageModified = (itm.text(self.__statusIndexColumn) in
-                         self.modifiedOnlyIndicators)
+        workModified = itm.text(self.__statusWorkColumn) in self.modifiedOnlyIndicators
+        stageModified = (
+            itm.text(self.__statusIndexColumn) in self.modifiedOnlyIndicators
+        )
         names = [os.path.join(self.dname, itm.text(self.__pathColumn))]
-        
+
         if workModified and stageModified:
             # select from all three variants
             messages = [
@@ -881,10 +921,12 @@
                 self.tr("Differences Side-by-Side"),
                 self.tr("Select the compare method."),
                 messages,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return
-            
+
             if result == messages[0]:
                 revisions = ["", ""]
             elif result == messages[1]:
@@ -902,89 +944,86 @@
                 self.tr("Differences Side-by-Side"),
                 self.tr("Select the compare method."),
                 messages,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return
-            
+
             if result == messages[0]:
                 revisions = ["", ""]
             else:
                 revisions = ["HEAD", ""]
         else:
             revisions = ["HEAD", "Stage"]
-        
+
         self.vcs.vcsSbsDiff(names[0], revisions=revisions)
-    
+
     def __getCommitableItems(self):
         """
         Private method to retrieve all entries the user wants to commit.
-        
+
         @return list of all items, the user has checked
         """
         commitableItems = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
-            if (
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Checked
-            ):
+            if itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Checked:
                 commitableItems.append(itm)
         return commitableItems
-    
+
     def __getCommitableUnselectedItems(self):
         """
         Private method to retrieve all entries the user may commit but hasn't
         selected.
-        
+
         @return list of all items, the user has not checked
         """
         items = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                (itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                 Qt.ItemFlag.ItemIsUserCheckable) and
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Unchecked
-            ):
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
+            ) and itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Unchecked:
                 items.append(itm)
         return items
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
         for itm in self.statusList.selectedItems():
-            if (itm.text(self.__statusWorkColumn) in
-                    self.modifiedIndicators or
-                itm.text(self.__statusIndexColumn) in
-                    self.modifiedIndicators):
+            if (
+                itm.text(self.__statusWorkColumn) in self.modifiedIndicators
+                or itm.text(self.__statusIndexColumn) in self.modifiedIndicators
+            ):
                 modifiedItems.append(itm)
         return modifiedItems
-    
+
     def __getModifiedOnlyItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
         for itm in self.statusList.selectedItems():
-            if (itm.text(self.__statusWorkColumn) in
-                    self.modifiedOnlyIndicators or
-                itm.text(self.__statusIndexColumn) in
-                    self.modifiedOnlyIndicators):
+            if (
+                itm.text(self.__statusWorkColumn) in self.modifiedOnlyIndicators
+                or itm.text(self.__statusIndexColumn) in self.modifiedOnlyIndicators
+            ):
                 modifiedItems.append(itm)
         return modifiedItems
-    
+
     def __getUnversionedItems(self):
         """
         Private method to retrieve all entries, that have an unversioned
         status.
-        
+
         @return list of all items with an unversioned status
         """
         unversionedItems = []
@@ -992,28 +1031,28 @@
             if itm.text(self.__statusWorkColumn) in self.unversionedIndicators:
                 unversionedItems.append(itm)
         return unversionedItems
-    
+
     def __getStageableItems(self):
         """
         Private method to retrieve all entries, that have a stageable
         status.
-        
+
         @return list of all items with a stageable status
         """
         stageableItems = []
         for itm in self.statusList.selectedItems():
             if (
-                itm.text(self.__statusWorkColumn) in
-                self.modifiedIndicators + self.unmergedIndicators
+                itm.text(self.__statusWorkColumn)
+                in self.modifiedIndicators + self.unmergedIndicators
             ):
                 stageableItems.append(itm)
         return stageableItems
-    
+
     def __getUnstageableItems(self):
         """
         Private method to retrieve all entries, that have an unstageable
         status.
-        
+
         @return list of all items with an unstageable status
         """
         unstageableItems = []
@@ -1021,11 +1060,11 @@
             if itm.text(self.__statusIndexColumn) in self.modifiedIndicators:
                 unstageableItems.append(itm)
         return unstageableItems
-    
+
     def __getMissingItems(self):
         """
         Private method to retrieve all entries, that have a missing status.
-        
+
         @return list of all items with a missing status
         """
         missingItems = []
@@ -1033,11 +1072,11 @@
             if itm.text(self.__statusWorkColumn) in self.missingIndicators:
                 missingItems.append(itm)
         return missingItems
-    
+
     def __getConflictingItems(self):
         """
         Private method to retrieve all entries, that have a conflict status.
-        
+
         @return list of all items with a conflict status
         """
         conflictingItems = []
@@ -1045,30 +1084,30 @@
             if itm.data(0, self.ConflictRole):
                 conflictingItems.append(itm)
         return conflictingItems
-    
+
     def __commitSelect(self, selected):
         """
         Private slot to select or deselect all entries.
-        
+
         @param selected commit selection state to be set (boolean)
         """
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if selected:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Checked)
+                    itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
                 else:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Unchecked)
-    
+                    itm.setCheckState(
+                        self.__toBeCommittedColumn, Qt.CheckState.Unchecked
+                    )
+
     ###########################################################################
     ## Diff handling methods below
     ###########################################################################
-    
+
     def __generateDiffs(self):
         """
         Private slot to generate diff outputs for the selected item.
@@ -1078,19 +1117,18 @@
         with contextlib.suppress(AttributeError):
             self.lDiffHighlighter.regenerateRules()
             self.rDiffHighlighter.regenerateRules()
-        
+
         selectedItems = self.statusList.selectedItems()
         if len(selectedItems) == 1:
-            fn = os.path.join(self.dname,
-                              selectedItems[0].text(self.__pathColumn))
+            fn = os.path.join(self.dname, selectedItems[0].text(self.__pathColumn))
             self.__diffGenerator.start(fn, diffMode="work2stage2repo")
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal of the diff generator.
         """
         diff1, diff2 = self.__diffGenerator.getResult()[:2]
-        
+
         if diff1:
             self.lDiffParser = GitDiffParser(diff1)
             for line in diff1[:]:
@@ -1101,7 +1139,7 @@
             self.lDiffEdit.setPlainText("".join(diff1))
         else:
             self.lDiffParser = None
-        
+
         if diff2:
             self.rDiffParser = GitDiffParser(diff2)
             for line in diff2[:]:
@@ -1112,17 +1150,17 @@
             self.rDiffEdit.setPlainText("".join(diff2))
         else:
             self.rDiffParser = None
-        
+
         for diffEdit in [self.lDiffEdit, self.rDiffEdit]:
             tc = diffEdit.textCursor()
             tc.movePosition(QTextCursor.MoveOperation.Start)
             diffEdit.setTextCursor(tc)
             diffEdit.ensureCursorVisible()
-    
+
     def __showLDiffContextMenu(self, coord):
         """
         Private slot to show the context menu of the status list.
-        
+
         @param coord position of the mouse pointer (QPoint)
         """
         if bool(self.lDiffEdit.toPlainText()):
@@ -1137,16 +1175,16 @@
                 self.__revertLinesAct.setEnabled(False)
                 self.__stageHunkAct.setEnabled(True)
                 self.__revertHunkAct.setEnabled(True)
-                
+
                 cursor = self.lDiffEdit.cursorForPosition(coord)
                 self.lDiffEdit.setTextCursor(cursor)
-            
+
             self.__lDiffMenu.popup(self.lDiffEdit.mapToGlobal(coord))
-    
+
     def __showRDiffContextMenu(self, coord):
         """
         Private slot to show the context menu of the status list.
-        
+
         @param coord position of the mouse pointer (QPoint)
         """
         if bool(self.rDiffEdit.toPlainText()):
@@ -1157,12 +1195,12 @@
             else:
                 self.__unstageLinesAct.setEnabled(False)
                 self.__unstageHunkAct.setEnabled(True)
-                
+
                 cursor = self.rDiffEdit.cursorForPosition(coord)
                 self.rDiffEdit.setTextCursor(cursor)
-            
+
             self.__rDiffMenu.popup(self.rDiffEdit.mapToGlobal(coord))
-    
+
     def __stageHunkOrLines(self):
         """
         Private method to stage the selected lines or hunk.
@@ -1171,20 +1209,19 @@
         startIndex, endIndex = self.__selectedLinesIndexes(self.lDiffEdit)
         patch = (
             self.lDiffParser.createLinesPatch(startIndex, endIndex)
-            if cursor.hasSelection() else
-            self.lDiffParser.createHunkPatch(startIndex)
+            if cursor.hasSelection()
+            else self.lDiffParser.createHunkPatch(startIndex)
         )
         if patch:
             patchFile = self.__tmpPatchFileName()
             try:
                 with open(patchFile, "w") as f:
                     f.write(patch)
-                self.vcs.gitApply(self.dname, patchFile, cached=True,
-                                  noDialog=True)
+                self.vcs.gitApply(self.dname, patchFile, cached=True, noDialog=True)
                 self.on_refreshButton_clicked()
             finally:
                 os.remove(patchFile)
-    
+
     def __unstageHunkOrLines(self):
         """
         Private method to unstage the selected lines or hunk.
@@ -1192,22 +1229,22 @@
         cursor = self.rDiffEdit.textCursor()
         startIndex, endIndex = self.__selectedLinesIndexes(self.rDiffEdit)
         patch = (
-            self.rDiffParser.createLinesPatch(startIndex, endIndex,
-                                              reverse=True)
-            if cursor.hasSelection() else
-            self.rDiffParser.createHunkPatch(startIndex)
+            self.rDiffParser.createLinesPatch(startIndex, endIndex, reverse=True)
+            if cursor.hasSelection()
+            else self.rDiffParser.createHunkPatch(startIndex)
         )
         if patch:
             patchFile = self.__tmpPatchFileName()
             try:
                 with open(patchFile, "w") as f:
                     f.write(patch)
-                self.vcs.gitApply(self.dname, patchFile, cached=True,
-                                  reverse=True, noDialog=True)
+                self.vcs.gitApply(
+                    self.dname, patchFile, cached=True, reverse=True, noDialog=True
+                )
                 self.on_refreshButton_clicked()
             finally:
                 os.remove(patchFile)
-    
+
     def __revertHunkOrLines(self):
         """
         Private method to revert the selected lines or hunk.
@@ -1216,18 +1253,19 @@
         startIndex, endIndex = self.__selectedLinesIndexes(self.lDiffEdit)
         title = (
             self.tr("Revert selected lines")
-            if cursor.hasSelection() else
-            self.tr("Revert hunk")
+            if cursor.hasSelection()
+            else self.tr("Revert hunk")
         )
         res = EricMessageBox.yesNo(
             self,
             title,
-            self.tr("""Are you sure you want to revert the selected"""
-                    """ changes?"""))
+            self.tr("""Are you sure you want to revert the selected""" """ changes?"""),
+        )
         if res:
             if cursor.hasSelection():
-                patch = self.lDiffParser.createLinesPatch(startIndex, endIndex,
-                                                          reverse=True)
+                patch = self.lDiffParser.createLinesPatch(
+                    startIndex, endIndex, reverse=True
+                )
             else:
                 patch = self.lDiffParser.createHunkPatch(startIndex)
             if patch:
@@ -1235,16 +1273,17 @@
                 try:
                     with open(patchFile, "w") as f:
                         f.write(patch)
-                    self.vcs.gitApply(self.dname, patchFile, reverse=True,
-                                      noDialog=True)
+                    self.vcs.gitApply(
+                        self.dname, patchFile, reverse=True, noDialog=True
+                    )
                     self.on_refreshButton_clicked()
                 finally:
                     os.remove(patchFile)
-    
+
     def __selectedLinesIndexes(self, diffEdit):
         """
         Private method to extract the indexes of the selected lines.
-        
+
         @param diffEdit reference to the edit widget (QTextEdit)
         @return tuple of start and end indexes (integer, integer)
         """
@@ -1253,7 +1292,7 @@
         selectionEnd = cursor.selectionEnd()
 
         startIndex = -1
-        
+
         lineStart = 0
         for lineIdx, line in enumerate(diffEdit.toPlainText().splitlines()):
             lineEnd = lineStart + len(line)
@@ -1265,19 +1304,19 @@
             lineStart = lineEnd + 1
 
         return startIndex, endIndex
-    
+
     def __tmpPatchFileName(self):
         """
         Private method to generate a temporary patch file.
-        
+
         @return name of the temporary file (string)
         """
-        prefix = 'eric-git-{0}-'.format(os.getpid())
-        suffix = '-patch'
+        prefix = "eric-git-{0}-".format(os.getpid())
+        suffix = "-patch"
         fd, path = tempfile.mkstemp(suffix, prefix)
         os.close(fd)
         return path
-    
+
     def __refreshDiff(self):
         """
         Private method to refresh the diff output after a refresh.
@@ -1288,5 +1327,5 @@
                 if itm.text(self.__pathColumn) == self.__selectedName:
                     itm.setSelected(True)
                     break
-        
+
         self.__selectedName = ""
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,28 +18,29 @@
     """
     Class implementing the VCS status monitor thread class for Git.
     """
+
     ConflictStates = ["AA", "AU", "DD", "DU", "UA", "UD", "UU"]
-    
+
     def __init__(self, interval, project, vcs, parent=None):
         """
         Constructor
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object (Project)
         @param vcs reference to the version control object
         @param parent reference to the parent object (QObject)
         """
         VcsStatusMonitorThread.__init__(self, interval, project, vcs, parent)
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.__client = None
         self.__useCommandLine = False
-    
+
     def _performMonitor(self):
         """
         Protected method implementing the monitoring action.
-        
+
         This method populates the statusList member variable
         with a list of strings giving the status in the first column and the
         path relative to the project directory starting with the third column.
@@ -55,40 +56,42 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @return tuple of flag indicating successful operation (boolean) and
             a status message in case of non successful operation (string)
         """
         self.shouldUpdate = False
-        
+
         # step 1: get overall status
         args = self.vcs.initCommand("status")
-        args.append('--porcelain')
-        
+        args.append("--porcelain")
+
         output = ""
         error = ""
         process = QProcess()
         process.setWorkingDirectory(self.projectDir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(300000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             self.__ioEncoding, 'replace')
+                output = str(
+                    process.readAllStandardOutput(), self.__ioEncoding, "replace"
+                )
             else:
                 process.kill()
                 process.waitForFinished()
-                error = str(process.readAllStandardError(),
-                            self.__ioEncoding, 'replace')
+                error = str(
+                    process.readAllStandardError(), self.__ioEncoding, "replace"
+                )
         else:
             process.kill()
             process.waitForFinished()
             error = self.tr("Could not start the Git process.")
-        
+
         if error:
             return False, error
-        
+
         states = {}
         for line in output.splitlines():
             flags = line[:2]
@@ -111,32 +114,28 @@
                 states[name] = status
             elif flags == "??":
                 states[name] = "?"
-        
+
         # step 2: collect the status to be reported back
         for name in states:
             try:
                 if self.reportedStates[name] != states[name]:
-                    self.statusList.append(
-                        "{0} {1}".format(states[name], name))
+                    self.statusList.append("{0} {1}".format(states[name], name))
             except KeyError:
                 self.statusList.append("{0} {1}".format(states[name], name))
         for name in self.reportedStates:
             if name not in states:
                 self.statusList.append("  {0}".format(name))
         self.reportedStates = states
-        
-        return (
-            True,
-            self.tr("Git status checked successfully")
-        )
-    
+
+        return (True, self.tr("Git status checked successfully"))
+
     def _getInfo(self):
         """
         Protected method implementing the real info action.
-        
+
         This method should be overridden and create a short info message to be
         shown in the main window status bar right next to the status indicator.
-        
+
         @return short info message
         @rtype str
         """
@@ -144,19 +143,21 @@
         args.append("--abbrev-commit")
         args.append("--format=%h %D")
         args.append("--no-patch")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.projectDir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             commitId, refs = output.splitlines()[0].strip().split(None, 1)
             ref = refs.split(",", 1)[0]
@@ -164,12 +165,11 @@
                 branch = ref.split("->", 1)[1].strip()
             else:
                 branch = self.tr("<detached>")
-        
-            return self.tr("{0} / {1}", "branch, commit").format(
-                branch, commitId)
+
+            return self.tr("{0} / {1}", "branch, commit").format(branch, commitId)
         else:
             return ""
-    
+
     def _shutdown(self):
         """
         Protected method performing shutdown actions.
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,10 +25,11 @@
     """
     Class implementing a dialog to enter the data to add a submodule.
     """
+
     def __init__(self, vcs, repodir, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @type Git
         @param repodir directory containing the superproject
@@ -38,67 +39,62 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
         self.__repodir = repodir
-        
+
         self.submoduleDirButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.submoduleUrlButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.submoduleUrlClearHistoryButton.setIcon(
-            UI.PixmapCache.getIcon("editDelete"))
-        
+            UI.PixmapCache.getIcon("editDelete")
+        )
+
         submoduleUrlHistory = self.__vcs.getPlugin().getPreferences(
-            "RepositoryUrlHistory")
+            "RepositoryUrlHistory"
+        )
         self.submoduleUrlCombo.addItems(submoduleUrlHistory)
         self.submoduleUrlCombo.setEditText("")
-        
-        self.submoduleUrlDirCompleter = EricDirCompleter(
-            self.submoduleUrlCombo)
-        self.submoduleDirCompleter = EricDirCompleter(
-            self.submoduleDirEdit)
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+
+        self.submoduleUrlDirCompleter = EricDirCompleter(self.submoduleUrlCombo)
+        self.submoduleDirCompleter = EricDirCompleter(self.submoduleDirEdit)
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_submoduleUrlCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the submodule repository URL.
-        
+
         @param txt current text of the combo box
         @type str
         """
         enable = False
         vcsUrlEnable = False
-        
+
         if txt:
             url = QUrl.fromUserInput(txt)
             if url.isValid():
                 if url.scheme() in ConfigGitSchemes:
                     enable = True
                     vcsUrlEnable = url.scheme() == "file"
-            elif ':' in txt:
+            elif ":" in txt:
                 # assume scp like repository URL
                 enable = True
         else:
             vcsUrlEnable = True
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
         self.submoduleUrlButton.setEnabled(vcsUrlEnable)
-    
+
     @pyqtSlot()
     def on_submoduleUrlButton_clicked(self):
         """
@@ -108,12 +104,12 @@
             self,
             self.tr("Select Submodule Repository Directory"),
             self.submoduleUrlCombo.currentText(),
-            EricFileDialog.ShowDirsOnly)
-        
+            EricFileDialog.ShowDirsOnly,
+        )
+
         if directory:
-            self.submoduleUrlCombo.setEditText(
-                Utilities.toNativeSeparators(directory))
-    
+            self.submoduleUrlCombo.setEditText(Utilities.toNativeSeparators(directory))
+
     @pyqtSlot()
     def on_submoduleUrlClearHistoryButton_clicked(self):
         """
@@ -122,9 +118,9 @@
         currentUrl = self.submoduleUrlCombo.currentText()
         self.submoduleUrlCombo.clear()
         self.submoduleUrlCombo.setEditText(currentUrl)
-        
+
         self.__saveHistory()
-    
+
     @pyqtSlot()
     def on_submoduleDirButton_clicked(self):
         """
@@ -134,27 +130,27 @@
             self,
             self.tr("Select Submodule Directory"),
             self.submoduleDirEdit.text(),
-            EricFileDialog.ShowDirsOnly)
-        
+            EricFileDialog.ShowDirsOnly,
+        )
+
         if directory:
-            self.submoduleDirEdit.setText(
-                Utilities.toNativeSeparators(directory))
-    
+            self.submoduleDirEdit.setText(Utilities.toNativeSeparators(directory))
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the repository URL, optional branch name,
             optional logical name, optional submodule path and a flag
             indicating to enforce the operation
         @rtype tuple of (str, str, str, str, bool)
         """
         self.__saveHistory()
-        
+
         path = self.submoduleDirEdit.text()
         if path:
             path = self.__getRelativePath(path)
-        
+
         return (
             self.submoduleUrlCombo.currentText().replace("\\", "/"),
             self.branchEdit.text(),
@@ -162,7 +158,7 @@
             path,
             self.forceCheckBox.isChecked(),
         )
-    
+
     def __saveHistory(self):
         """
         Private method to save the repository URL history.
@@ -173,19 +169,20 @@
             submoduleUrlHistory.append(self.submoduleUrlCombo.itemText(index))
         if url not in submoduleUrlHistory:
             submoduleUrlHistory.insert(0, url)
-        
+
         # max. list sizes is hard coded to 20 entries
         newSubmoduleUrlHistory = [url for url in submoduleUrlHistory if url]
         if len(newSubmoduleUrlHistory) > 20:
             newSubmoduleUrlHistory = newSubmoduleUrlHistory[:20]
-        
+
         self.__vcs.getPlugin().setPreferences(
-            "RepositoryUrlHistory", newSubmoduleUrlHistory)
-    
+            "RepositoryUrlHistory", newSubmoduleUrlHistory
+        )
+
     def __getRelativePath(self, path):
         """
         Private method to convert a file path to a relative path.
-        
+
         @param path file or directory name to convert
         @type str
         @return relative path or unchanged path, if path doesn't
@@ -194,12 +191,10 @@
         """
         if path == self.__repodir:
             return ""
-        elif (
-            Utilities.normcasepath(Utilities.toNativeSeparators(path))
-            .startswith(Utilities.normcasepath(
-                Utilities.toNativeSeparators(self.__repodir + "/")))
+        elif Utilities.normcasepath(Utilities.toNativeSeparators(path)).startswith(
+            Utilities.normcasepath(Utilities.toNativeSeparators(self.__repodir + "/"))
         ):
-            relpath = path[len(self.__repodir):]
+            relpath = path[len(self.__repodir) :]
             if relpath.startswith(("/", "\\")):
                 relpath = relpath[1:]
             return relpath
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesDeinitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesDeinitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     Class implementing a dialog to get the data for a submodule deinit
     operation.
     """
+
     def __init__(self, submodulePaths, parent=None):
         """
         Constructor
-        
+
         @param submodulePaths list of submodule paths
         @type list of str
         @param parent reference to the parent widget
@@ -29,44 +30,41 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.submodulesList.addItems(sorted(submodulePaths))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def __updateOK(self):
         """
         Private slot to update the state of the OK button.
         """
         enable = (
-            self.allCheckBox.isChecked() or
-            len(self.submodulesList.selectedItems()) > 0
+            self.allCheckBox.isChecked() or len(self.submodulesList.selectedItems()) > 0
         )
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(bool)
     def on_allCheckBox_toggled(self, checked):
         """
         Private slot to react on changes of the all checkbox.
-        
+
         @param checked state of the checkbox
         @type bool
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_submodulesList_itemSelectionChanged(self):
         """
         Private slot to react on changes of the submodule selection.
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing a flag to indicate all submodules, a list of
             selected submodules and a flag indicating an enforced operation
         @rtype tuple of (bool, list of str, bool)
@@ -76,5 +74,5 @@
         if not deinitAll:
             for itm in self.submodulesList.selectedItems():
                 submodulePaths.append(itm.text())
-        
+
         return all, submodulePaths, self.forceCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to list the defined submodules.
     """
+
     def __init__(self, submodules, parent=None):
         """
         Constructor
-        
+
         @param submodules list of submodule data to be shown
         @type list of dictionaries with submodule name, path, URL and branch
         @param parent reference to the parent widget
@@ -28,18 +29,22 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for submodule in submodules:
-            QTreeWidgetItem(self.submodulesList, [
-                submodule["name"],
-                submodule["path"],
-                submodule["url"],
-                submodule["branch"]
-            ])
+            QTreeWidgetItem(
+                self.submodulesList,
+                [
+                    submodule["name"],
+                    submodule["path"],
+                    submodule["url"],
+                    submodule["branch"],
+                ],
+            )
         self.submodulesList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.submodulesList.header().setStretchLastSection(True)
-        
+
         self.submodulesList.setSortingEnabled(True)
         self.submodulesList.sortItems(0, Qt.SortOrder.AscendingOrder)
         self.submodulesList.setSortingEnabled(False)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QTreeWidgetItem, QHeaderView, QAbstractButton
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QHeaderView,
+    QAbstractButton,
 )
 
 from .Ui_GitSubmodulesStatusDialog import Ui_GitSubmodulesStatusDialog
@@ -25,10 +29,11 @@
     Class implementing a dialog to show the status of the submodules of the
     project.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @type Git
         @param parent reference to the parent widget
@@ -36,89 +41,92 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__statusCodes = {
             " ": self.tr("up-to-date"),
             "-": self.tr("not initialized"),
             "+": self.tr("different to index"),
-            "U": self.tr("merge conflicts")
+            "U": self.tr("merge conflicts"),
         }
-        
+
         self.__vcs = vcs
         self.__repodir = None
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the status display"))
-    
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the status display"))
+
     def start(self, projectDir):
         """
         Public method to populate the status list.
-        
+
         @param projectDir name of the project directory
         @type str
         """
         # find the root of the repo
         self.__repodir = projectDir
-        while not os.path.isdir(os.path.join(self.__repodir,
-                                             self.__vcs.adminDir)):
+        while not os.path.isdir(os.path.join(self.__repodir, self.__vcs.adminDir)):
             self.__repodir = os.path.dirname(self.__repodir)
             if os.path.splitdrive(self.__repodir)[1] == os.sep:
                 return
-        
+
         self.errorGroup.hide()
         self.errors.clear()
         self.statusList.clear()
         self.buttonBox.setEnabled(False)
-        
+
         args = self.__vcs.initCommand("submodule")
         args.append("status")
         if self.recursiveCheckBox.isChecked():
             args.append("--recursive")
         if self.indexCheckBox.isChecked():
             args.append("--cached")
-        
+
         process = QProcess()
         process.setWorkingDirectory(self.__repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
                 ioEncoding = Preferences.getSystem("IOEncoding")
-                output = str(process.readAllStandardOutput(),
-                             ioEncoding, 'replace')
-                error = str(process.readAllStandardError(),
-                            ioEncoding, 'replace')
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
+                error = str(process.readAllStandardError(), ioEncoding, "replace")
                 if error:
                     self.errors.setText(error)
                     self.errorGroup.show()
                 self.__processOutput(output)
             else:
                 if not finished:
-                    self.errors.setText(self.tr(
-                        "The process {0} did not finish within 30 seconds.")
-                        .format("git"))
+                    self.errors.setText(
+                        self.tr(
+                            "The process {0} did not finish within 30 seconds."
+                        ).format("git")
+                    )
                 else:
-                    self.errors.setText(self.tr(
-                        "The process {0} finished with an error.\n"
-                        "Error: {1}")
-                        .format("git", process.errorString()))
+                    self.errors.setText(
+                        self.tr(
+                            "The process {0} finished with an error.\n" "Error: {1}"
+                        ).format("git", process.errorString())
+                    )
                 self.errorGroup.show()
         else:
-            self.errors.setText(self.tr(
-                "The process {0} could not be started. "
-                "Ensure, that it is in the search path.").format("git"))
+            self.errors.setText(
+                self.tr(
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git")
+            )
             self.errorGroup.show()
-        
+
         self.buttonBox.setEnabled(True)
         self.buttonBox.setFocus()
-    
+
     def __processOutput(self, output):
         """
         Private method to process the output and populate the list.
-        
+
         @param output output of the submodule status command
         @type str
         """
@@ -131,56 +139,56 @@
             if len(lineParts) == 3 and lineParts[2][0] == "(":
                 # get rid of leading and trailing brackets
                 lineParts[2] = lineParts[2][1:-1]
-            QTreeWidgetItem(self.statusList, [
-                lineParts[1],       # submodule name
-                status,             # submodule status
-                lineParts[0],       # commit ID
-                lineParts[2],       # additional info
-            ])
-        
-        self.statusList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-        
+            QTreeWidgetItem(
+                self.statusList,
+                [
+                    lineParts[1],  # submodule name
+                    status,  # submodule status
+                    lineParts[0],  # commit ID
+                    lineParts[2],  # additional info
+                ],
+            )
+
+        self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
+
         self.statusList.setSortingEnabled(True)
         self.statusList.sortItems(0, Qt.SortOrder.AscendingOrder)
         self.statusList.setSortingEnabled(False)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.__repodir)
-    
+
     @pyqtSlot(bool)
     def on_indexCheckBox_toggled(self, checked):
         """
         Private slot handling a change of the index check box.
-        
+
         @param checked check state of the check box
         @type bool
         """
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(bool)
     def on_recursiveCheckBox_toggled(self, checked):
         """
         Private slot handling a change of the recursive check box.
-        
+
         @param checked check state of the check box
         @type bool
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSummaryOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSummaryOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,20 +9,18 @@
 
 from PyQt6.QtWidgets import QDialog
 
-from .Ui_GitSubmodulesSummaryOptionsDialog import (
-    Ui_GitSubmodulesSummaryOptionsDialog
-)
+from .Ui_GitSubmodulesSummaryOptionsDialog import Ui_GitSubmodulesSummaryOptionsDialog
 
 
-class GitSubmodulesSummaryOptionsDialog(QDialog,
-                                        Ui_GitSubmodulesSummaryOptionsDialog):
+class GitSubmodulesSummaryOptionsDialog(QDialog, Ui_GitSubmodulesSummaryOptionsDialog):
     """
     Class implementing a dialog to enter submodule summary options.
     """
+
     def __init__(self, submodulePaths, parent=None):
         """
         Constructor
-        
+
         @param submodulePaths list of submodule paths
         @type list of str
         @param parent reference to the parent widget
@@ -30,13 +28,13 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.submodulesList.addItems(sorted(submodulePaths))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing a list of selected submodules, a flag
             indicating to show summary for the superproject index, a flag
             indicating to show summary for the submodules index, an optional
@@ -46,12 +44,12 @@
         submodulePaths = []
         for itm in self.submodulesList.selectedItems():
             submodulePaths.append(itm.text())
-        
+
         limit = self.limitSpinBox.value()
         if limit == 0:
             # adjust for unlimited
             limit = -1
-        
+
         superProject = self.filesCheckBox.isChecked()
         if superProject:
             index = False
@@ -59,5 +57,5 @@
         else:
             index = self.indexCheckBox.isChecked()
             commit = self.commitEdit.text().strip()
-        
+
         return submodulePaths, superProject, index, commit, limit
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSyncDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesSyncDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter submodule synchronization options.
     """
+
     def __init__(self, submodulePaths, parent=None):
         """
         Constructor
-        
+
         @param submodulePaths list of submodule paths
         @type list of str
         @param parent reference to the parent widget
@@ -27,13 +28,13 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.submodulesList.addItems(sorted(submodulePaths))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing a list of selected submodules and a flag
             indicating a recursive operation
         @rtype tuple of (list of str, bool)
@@ -41,5 +42,5 @@
         submodulePaths = []
         for itm in self.submodulesList.selectedItems():
             submodulePaths.append(itm.text())
-        
+
         return submodulePaths, self.recursiveCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesUpdateOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitSubmodulesUpdateOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,21 +9,19 @@
 
 from PyQt6.QtWidgets import QDialog
 
-from .Ui_GitSubmodulesUpdateOptionsDialog import (
-    Ui_GitSubmodulesUpdateOptionsDialog
-)
+from .Ui_GitSubmodulesUpdateOptionsDialog import Ui_GitSubmodulesUpdateOptionsDialog
 
 
-class GitSubmodulesUpdateOptionsDialog(QDialog,
-                                       Ui_GitSubmodulesUpdateOptionsDialog):
+class GitSubmodulesUpdateOptionsDialog(QDialog, Ui_GitSubmodulesUpdateOptionsDialog):
     """
     Class implementing a dialog to enter options for a submodule update
     command.
     """
+
     def __init__(self, submodulePaths, parent=None):
         """
         Constructor
-        
+
         @param submodulePaths list of submodule paths
         @type list of str
         @param parent reference to the parent widget
@@ -31,13 +29,13 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.submodulesList.addItems(sorted(submodulePaths))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the update procedure, a flag indicating an
             init, a flag indicating an update with remote, a flag indicating
             not to fetch the remote, a flag indicating an enforced operation
@@ -47,17 +45,16 @@
         submodulePaths = []
         for itm in self.submodulesList.selectedItems():
             submodulePaths.append(itm.text())
-        
+
         if self.checkoutButton.isChecked():
             procedure = "--checkout"
         elif self.rebaseButton.isChecked():
             procedure = "--rebase"
         else:
             procedure = "--merge"
-        
-        nofetch = (self.remoteCheckBox.isChecked() and
-                   self.nofetchCheckBox.isChecked())
-        
+
+        nofetch = self.remoteCheckBox.isChecked() and self.nofetchCheckBox.isChecked()
+
         return (
             procedure,
             self.initCheckBox.isChecked(),
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitTagBranchListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitTagBranchListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 
 from PyQt6.QtCore import pyqtSlot, QProcess, Qt, QTimer, QCoreApplication
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QLineEdit
+    QDialog,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QLineEdit,
 )
 
 from EricWidgets import EricMessageBox
@@ -26,55 +30,54 @@
     """
     Class implementing a dialog to show a list of tags or branches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = QProcess()
         self.vcs = vcs
-        
+
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(1, Qt.SortOrder.AscendingOrder)
-        
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-    
+
     def start(self, path, tags, listAll=True, merged=True):
         """
         Public slot to start the tag/branch list command.
-        
+
         @param path name of directory to be listed (string)
         @param tags flag indicating a list of tags is requested
             (False = branches, True = tags)
@@ -83,137 +86,133 @@
             branches (boolean)
         """
         self.tagList.clear()
-        
+
         self.errorGroup.hide()
-        
+
         self.intercept = False
         self.tagsMode = tags
         if tags:
             self.tagList.setHeaderItem(
-                QTreeWidgetItem([self.tr("Commit"), self.tr("Name"),
-                                 self.tr("Annotation Message")]))
+                QTreeWidgetItem(
+                    [self.tr("Commit"), self.tr("Name"), self.tr("Annotation Message")]
+                )
+            )
         else:
             self.setWindowTitle(self.tr("Git Branches List"))
             self.tagList.setHeaderItem(
-                QTreeWidgetItem([self.tr("Commit"), self.tr("Name")]))
+                QTreeWidgetItem([self.tr("Commit"), self.tr("Name")])
+            )
         self.activateWindow()
-        
+
         dname, fname = self.vcs.splitPath(path)
-        
+
         # find the root of the repo
         self.repodir = dname
         while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)):
             self.repodir = os.path.dirname(self.repodir)
             if os.path.splitdrive(self.repodir)[1] == os.sep:
                 return
-        
+
         if self.tagsMode:
             args = self.vcs.initCommand("tag")
-            args.append('--list')
-            args.append('-n')
+            args.append("--list")
+            args.append("-n")
         else:
             args = self.vcs.initCommand("branch")
-            args.append('--list')
-            args.append('--all')
-            args.append('--verbose')
+            args.append("--list")
+            args.append("--all")
+            args.append("--verbose")
             if not listAll:
                 if merged:
                     args.append("--merged")
                 else:
                     args.append("--no-merged")
-        
+
         self.process.kill()
         self.process.setWorkingDirectory(self.repodir)
-        
-        self.process.start('git', args)
+
+        self.process.start("git", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__resizeColumns()
         self.__resort()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.tagList.sortItems(
-            self.tagList.sortColumn(),
-            self.tagList.header().sortIndicatorOrder())
-    
+            self.tagList.sortColumn(), self.tagList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.tagList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tagList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.tagList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, commit, name, msg="", bold=False, italic=False):
         """
         Private method to generate a tag item in the tag list.
-        
+
         @param commit commit id of the tag/branch (string)
         @param name name of the tag/branch (string)
         @param msg tag annotation message
@@ -233,60 +232,63 @@
             if italic:
                 font.setItalic(True)
             itm.setFont(1, font)
-    
+
     def __getCommit(self, tag):
         """
         Private method to get the commit id for a tag.
-        
+
         @param tag tag name (string)
         @return commit id shortened to 10 characters (string)
         """
         args = self.vcs.initCommand("show")
         args.append("--abbrev-commit")
-        args.append("--abbrev={0}".format(
-            self.vcs.getPlugin().getPreferences("CommitIdLength")))
+        args.append(
+            "--abbrev={0}".format(self.vcs.getPlugin().getPreferences("CommitIdLength"))
+        )
         args.append("--no-patch")
         args.append(tag)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(self.repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             for line in output.splitlines():
                 if line.startswith("commit "):
                     commitId = line.split()[1]
                     return commitId
-        
+
         return ""
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             self.__processOutputLine(s)
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         if self.tagsMode:
@@ -309,41 +311,43 @@
                     name = data[0]
             italic = name.startswith("remotes/")
             self.__generateItem(commit, name, bold=bold, italic=italic)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__showError(s)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -351,35 +355,35 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
             self.intercept = False
             evt.accept()
             return
-        
+
         super().keyPressEvent(evt)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitTagDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitTagDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,18 +17,19 @@
     """
     Class implementing a dialog to enter the data for a tagging operation.
     """
+
     CreateTag = 1
     DeleteTag = 2
     VerifyTag = 3
-    
+
     AnnotatedTag = 1
     SignedTag = 2
     LocalTag = 3
-    
+
     def __init__(self, taglist, revision=None, tagName=None, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param revision revision to set tag for (string)
         @param tagName name of the tag (string)
@@ -36,18 +37,17 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.tagCombo.clear()
         self.tagCombo.addItem("")
         self.tagCombo.addItems(sorted(taglist, reverse=True))
-        
+
         if revision:
             self.revisionEdit.setText(revision)
-        
+
         if tagName:
             index = self.tagCombo.findText(tagName)
             if index > -1:
@@ -57,41 +57,46 @@
             else:
                 self.tagCombo.setEditText(tagName)
                 self.createTagButton.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text tag name entered in the combo (string)
         """
         self.okButton.setDisabled(text == "")
-    
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple of two strings, two int and a boolean (tag, revision,
             tag operation, tag type, enforce operation)
         """
         tag = self.tagCombo.currentText().replace(" ", "_")
-        
+
         if self.createTagButton.isChecked():
             tagOp = GitTagDialog.CreateTag
         elif self.deleteTagButton.isChecked():
             tagOp = GitTagDialog.DeleteTag
         else:
             tagOp = GitTagDialog.VerifyTag
-        
+
         if self.globalTagButton.isChecked():
             tagType = GitTagDialog.AnnotatedTag
         elif self.signedTagButton.isChecked():
             tagType = GitTagDialog.SignedTag
         else:
             tagType = GitTagDialog.LocalTag
-        
-        return (tag, self.revisionEdit.text(), tagOp, tagType,
-                self.forceCheckBox.isChecked())
+
+        return (
+            tag,
+            self.revisionEdit.text(),
+            tagOp,
+            tagType,
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitUserConfigDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitUserConfigDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,23 +16,24 @@
     """
     Class implementing a dialog to enter some user data.
     """
+
     def __init__(self, version=(0, 0), parent=None):
         """
         Constructor
-        
+
         @param version Git version info (tuple of two integers)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple with user's first name, last name and email address
             (tuple of three strings)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/GitUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/GitUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,7 @@
 def getConfigPath():
     """
     Public function to get the filename of the config file.
-    
+
     @return filename of the config file (string)
     """
     if Utilities.isWindowsPlatform():
@@ -31,14 +31,14 @@
 def prepareProcess(proc, language=""):
     """
     Public function to prepare the given process.
-    
+
     @param proc reference to the process to be prepared (QProcess)
     @param language language to be set (string)
     """
     env = QProcessEnvironment.systemEnvironment()
-    
+
     # set the language for the process
     if language:
         env.insert("LANGUAGE", language)
-    
+
     proc.setProcessEnvironment(env)
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,19 @@
     """
     Class implementing the VCS project browser helper for Git.
     """
-    def __init__(self, vcsObject, browserObject, projectObject,
-                 isTranslationsBrowser, parent=None, name=None):
+
+    def __init__(
+        self,
+        vcsObject,
+        browserObject,
+        projectObject,
+        isTranslationsBrowser,
+        parent=None,
+        name=None,
+    ):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
@@ -37,17 +45,23 @@
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
-        VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject,
-                                         projectObject, isTranslationsBrowser,
-                                         parent, name)
-    
+        VcsProjectBrowserHelper.__init__(
+            self,
+            vcsObject,
+            browserObject,
+            projectObject,
+            isTranslationsBrowser,
+            parent,
+            name,
+        )
+
     def showContextMenu(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -62,15 +76,15 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuMulti(self, menu, standardItems):
         """
         Public slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -82,7 +96,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsMultiMenuActions:
@@ -97,14 +111,14 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDir(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -119,14 +133,14 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDirMulti(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -138,7 +152,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsDirMultiMenuActions:
@@ -153,448 +167,541 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     ###########################################################################
     ## Protected menu generation methods below
     ###########################################################################
-    
+
     def _addVCSMenu(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMenuActions = []
         self.vcsAddMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add/Stage to repository'),
-            self._VCSAdd)
+            self.tr("Add/Stage to repository"),
+            self._VCSAdd,
+        )
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Unstage changes'),
-            self.__GitUnstage)
+            self.tr("Unstage changes"),
+            self.__GitUnstage,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository only'),
-            self.__GitForget)
+            self.tr("Remove from repository only"),
+            self.__GitForget,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__GitCopy)
+        act = menu.addAction(self.tr("Copy"), self.__GitCopy)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__GitMove)
+        act = menu.addAction(self.tr("Move"), self.__GitMove)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side'), self.__GitSbsDiff)
+            self.tr("Show differences side-by-side"),
+            self.__GitSbsDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__GitExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__GitExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side (extended)'),
-            self.__GitSbsExtendedDiff)
+            self.tr("Show differences side-by-side (extended)"),
+            self.__GitSbsExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         self.annotateAct = menu.addAction(
-            self.tr('Show annotated file'),
-            self.__GitBlame)
+            self.tr("Show annotated file"), self.__GitBlame
+        )
         self.vcsMenuActions.append(self.annotateAct)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__GitRevert)
+            self.tr("Revert changes"),
+            self.__GitRevert,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__GitConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menu = menu
-    
+
     def _addVCSMenuMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu for multi selection to all
         project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add/Stage to repository'), self._VCSAdd)
+            self.tr("Add/Stage to repository"),
+            self._VCSAdd,
+        )
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Unstage changes'),
-            self.__GitUnstage)
+            self.tr("Unstage changes"),
+            self.__GitUnstage,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository only'),
-            self.__GitForget)
+            self.tr("Remove from repository only"),
+            self.__GitForget,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__GitExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__GitExtendedDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__GitRevert)
+            self.tr("Revert changes"),
+            self.__GitRevert,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        
+
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__GitConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuMulti = menu
-    
+
     def _addVCSMenuBack(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__GitConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuBack = menu
-    
+
     def _addVCSMenuDir(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMenuActions = []
         self.vcsAddDirMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add/Stage to repository'), self._VCSAdd)
+            self.tr("Add/Stage to repository"),
+            self._VCSAdd,
+        )
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Unstage changes'),
-            self.__GitUnstage)
+            self.tr("Unstage changes"),
+            self.__GitUnstage,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__GitCopy)
+        act = menu.addAction(self.tr("Copy"), self.__GitCopy)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__GitMove)
+        act = menu.addAction(self.tr("Move"), self.__GitMove)
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__GitExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__GitExtendedDiff,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__GitRevert)
+            self.tr("Revert changes"),
+            self.__GitRevert,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        
+
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__GitConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDir = menu
-    
+
     def _addVCSMenuDirMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add/Stage to repository'), self._VCSAdd)
+            self.tr("Add/Stage to repository"),
+            self._VCSAdd,
+        )
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Unstage changes'),
-            self.__GitUnstage)
+            self.tr("Unstage changes"),
+            self.__GitUnstage,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__GitExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__GitExtendedDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__GitRevert)
+            self.tr("Revert changes"),
+            self.__GitRevert,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
-        
+
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__GitConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDirMulti = menu
-    
+
     def __GitConfigure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("zzz_gitPage")
-    
+
     def __GitForget(self):
         """
         Private slot called by the context menu to remove the selected file
         from the Git repository leaving a copy in the project directory.
         """
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         if self.isTranslationsBrowser:
             items = self.browser.getSelectedItems([ProjectBrowserFileItem])
             names = [itm.fileName() for itm in items]
-            
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Remove from repository only"),
                 self.tr(
-                    "Do you really want to remove these files"
-                    " from the repository?"),
-                names)
+                    "Do you really want to remove these files" " from the repository?"
+                ),
+                names,
+            )
         else:
             items = self.browser.getSelectedItems()
             names = [itm.fileName() for itm in items]
-            files = [self.browser.project.getRelativePath(name)
-                     for name in names]
-            
+            files = [self.browser.project.getRelativePath(name) for name in names]
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Remove from repository only"),
                 self.tr(
-                    "Do you really want to remove these files"
-                    " from the repository?"),
-                files)
-        
+                    "Do you really want to remove these files" " from the repository?"
+                ),
+                files,
+            )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.vcs.vcsRemove(names, stageOnly=True)
-        
+
         for fn in names:
             self._updateVCSStatus(fn)
-    
+
     def __GitCopy(self):
         """
         Private slot called by the context menu to copy the selected file.
@@ -605,7 +712,7 @@
         except AttributeError:
             fn = itm.dirName()
         self.vcs.gitCopy(fn, self.project)
-    
+
     def __GitMove(self):
         """
         Private slot called by the context menu to move the selected file.
@@ -625,12 +732,12 @@
                 for mf in movefiles:
                     self.browser.closeSourceWindow.emit(mf)
         self.browser.project.startFileSystemMonitoring()
-    
+
     def __GitExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository.
-        
+
         This gives the chance to enter the revisions to compare.
         """
         names = []
@@ -640,7 +747,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.gitExtendedDiff(names)
-    
+
     def __GitSbsDiff(self):
         """
         Private slot called by the context menu to show the difference of a
@@ -649,18 +756,18 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn)
-    
+
     def __GitSbsExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository side-by-side.
-       
+
         It allows the selection of revisions to compare.
         """
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn, extended=True)
-    
+
     def __GitUnstage(self):
         """
         Private slot to unstage changes.
@@ -673,7 +780,7 @@
                 name = itm.dirName()
             names.append(name)
         self.vcs.gitUnstage(names)
-    
+
     def __GitRevert(self):
         """
         Private slot to revert changes of the working area.
@@ -686,7 +793,7 @@
                 name = itm.dirName()
             names.append(name)
         self.vcs.vcsRevert(names)
-    
+
     def __GitBlame(self):
         """
         Private slot called by the context menu to show the annotations of a
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,1349 +26,1716 @@
     """
     Class implementing the VCS project helper for Git.
     """
+
     def __init__(self, vcsObject, projectObject, parent=None, name=None):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VcsProjectHelper.__init__(self, vcsObject, projectObject, parent, name)
-    
+
     def setObjects(self, vcsObject, projectObject):
         """
         Public method to set references to the vcs and project objects.
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         """
         self.vcs = vcsObject
         self.project = projectObject
-    
+
     def getProject(self):
         """
         Public method to get a reference to the project object.
-        
+
         @return reference to the project object (Project)
         """
         return self.project
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         actions = self.actions[:]
         return actions
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.vcsNewAct = EricAction(
-            self.tr('New from repository'),
+            self.tr("New from repository"),
             UI.PixmapCache.getIcon("vcsCheckout"),
-            self.tr('&New from repository...'), 0, 0,
-            self, 'git_new')
-        self.vcsNewAct.setStatusTip(self.tr(
-            'Create (clone) a new project from a Git repository'
-        ))
-        self.vcsNewAct.setWhatsThis(self.tr(
-            """<b>New from repository</b>"""
-            """<p>This creates (clones) a new local project from """
-            """a Git repository.</p>"""
-        ))
+            self.tr("&New from repository..."),
+            0,
+            0,
+            self,
+            "git_new",
+        )
+        self.vcsNewAct.setStatusTip(
+            self.tr("Create (clone) a new project from a Git repository")
+        )
+        self.vcsNewAct.setWhatsThis(
+            self.tr(
+                """<b>New from repository</b>"""
+                """<p>This creates (clones) a new local project from """
+                """a Git repository.</p>"""
+            )
+        )
         self.vcsNewAct.triggered.connect(self._vcsCheckout)
         self.actions.append(self.vcsNewAct)
-        
+
         self.gitFetchAct = EricAction(
-            self.tr('Fetch changes'),
+            self.tr("Fetch changes"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Fetch changes'),
-            0, 0, self, 'git_fetch')
-        self.gitFetchAct.setStatusTip(self.tr(
-            'Fetch changes from a remote repository'
-        ))
-        self.gitFetchAct.setWhatsThis(self.tr(
-            """<b>Fetch changes</b>"""
-            """<p>This fetches changes from a remote repository into the """
-            """local repository.</p>"""
-        ))
+            self.tr("Fetch changes"),
+            0,
+            0,
+            self,
+            "git_fetch",
+        )
+        self.gitFetchAct.setStatusTip(self.tr("Fetch changes from a remote repository"))
+        self.gitFetchAct.setWhatsThis(
+            self.tr(
+                """<b>Fetch changes</b>"""
+                """<p>This fetches changes from a remote repository into the """
+                """local repository.</p>"""
+            )
+        )
         self.gitFetchAct.triggered.connect(self.__gitFetch)
         self.actions.append(self.gitFetchAct)
-        
+
         self.gitPullAct = EricAction(
-            self.tr('Pull changes'),
+            self.tr("Pull changes"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Pull changes'),
-            0, 0, self, 'git_pull')
-        self.gitPullAct.setStatusTip(self.tr(
-            'Pull changes from a remote repository and update the work area'
-        ))
-        self.gitPullAct.setWhatsThis(self.tr(
-            """<b>Pull changes</b>"""
-            """<p>This pulls changes from a remote repository into the """
-            """local repository and updates the work area.</p>"""
-        ))
+            self.tr("Pull changes"),
+            0,
+            0,
+            self,
+            "git_pull",
+        )
+        self.gitPullAct.setStatusTip(
+            self.tr("Pull changes from a remote repository and update the work area")
+        )
+        self.gitPullAct.setWhatsThis(
+            self.tr(
+                """<b>Pull changes</b>"""
+                """<p>This pulls changes from a remote repository into the """
+                """local repository and updates the work area.</p>"""
+            )
+        )
         self.gitPullAct.triggered.connect(self.__gitPull)
         self.actions.append(self.gitPullAct)
-        
+
         self.vcsCommitAct = EricAction(
-            self.tr('Commit changes to repository'),
+            self.tr("Commit changes to repository"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'), 0, 0, self,
-            'git_commit')
-        self.vcsCommitAct.setStatusTip(self.tr(
-            'Commit changes of the local project to the Git repository'
-        ))
-        self.vcsCommitAct.setWhatsThis(self.tr(
-            """<b>Commit changes to repository</b>"""
-            """<p>This commits changes of the local project to the """
-            """Git repository.</p>"""
-        ))
+            self.tr("Commit changes to repository..."),
+            0,
+            0,
+            self,
+            "git_commit",
+        )
+        self.vcsCommitAct.setStatusTip(
+            self.tr("Commit changes of the local project to the Git repository")
+        )
+        self.vcsCommitAct.setWhatsThis(
+            self.tr(
+                """<b>Commit changes to repository</b>"""
+                """<p>This commits changes of the local project to the """
+                """Git repository.</p>"""
+            )
+        )
         self.vcsCommitAct.triggered.connect(self._vcsCommit)
         self.actions.append(self.vcsCommitAct)
-        
+
         self.gitPushAct = EricAction(
-            self.tr('Push changes'),
+            self.tr("Push changes"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Push changes'),
-            0, 0, self, 'git_push')
-        self.gitPushAct.setStatusTip(self.tr(
-            'Push changes to a remote repository'
-        ))
-        self.gitPushAct.setWhatsThis(self.tr(
-            """<b>Push changes</b>"""
-            """<p>This pushes changes from the local repository to a """
-            """remote repository.</p>"""
-        ))
+            self.tr("Push changes"),
+            0,
+            0,
+            self,
+            "git_push",
+        )
+        self.gitPushAct.setStatusTip(self.tr("Push changes to a remote repository"))
+        self.gitPushAct.setWhatsThis(
+            self.tr(
+                """<b>Push changes</b>"""
+                """<p>This pushes changes from the local repository to a """
+                """remote repository.</p>"""
+            )
+        )
         self.gitPushAct.triggered.connect(self.__gitPush)
         self.actions.append(self.gitPushAct)
-        
+
         self.vcsExportAct = EricAction(
-            self.tr('Export from repository'),
+            self.tr("Export from repository"),
             UI.PixmapCache.getIcon("vcsExport"),
-            self.tr('&Export from repository...'),
-            0, 0, self, 'git_export_repo')
-        self.vcsExportAct.setStatusTip(self.tr(
-            'Export a project from the repository'
-        ))
-        self.vcsExportAct.setWhatsThis(self.tr(
-            """<b>Export from repository</b>"""
-            """<p>This exports a project from the repository.</p>"""
-        ))
+            self.tr("&Export from repository..."),
+            0,
+            0,
+            self,
+            "git_export_repo",
+        )
+        self.vcsExportAct.setStatusTip(self.tr("Export a project from the repository"))
+        self.vcsExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export from repository</b>"""
+                """<p>This exports a project from the repository.</p>"""
+            )
+        )
         self.vcsExportAct.triggered.connect(self._vcsExport)
         self.actions.append(self.vcsExportAct)
-        
+
         self.gitLogBrowserAct = EricAction(
-            self.tr('Show log browser'),
+            self.tr("Show log browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'),
-            0, 0, self, 'git_log_browser')
-        self.gitLogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the log of the local project'
-        ))
-        self.gitLogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show log browser</b>"""
-            """<p>This shows a dialog to browse the log of the local"""
-            """ project. A limited number of entries is shown first."""
-            """ More can be retrieved later on.</p>"""
-        ))
+            self.tr("Show log browser"),
+            0,
+            0,
+            self,
+            "git_log_browser",
+        )
+        self.gitLogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the log of the local project")
+        )
+        self.gitLogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show log browser</b>"""
+                """<p>This shows a dialog to browse the log of the local"""
+                """ project. A limited number of entries is shown first."""
+                """ More can be retrieved later on.</p>"""
+            )
+        )
         self.gitLogBrowserAct.triggered.connect(self._vcsLogBrowser)
         self.actions.append(self.gitLogBrowserAct)
-        
+
         self.gitReflogBrowserAct = EricAction(
-            self.tr('Show reflog browser'),
+            self.tr("Show reflog browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show reflog browser'),
-            0, 0, self, 'git_reflog_browser')
-        self.gitReflogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the reflog of the local project'
-        ))
-        self.gitReflogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show reflog browser</b>"""
-            """<p>This shows a dialog to browse the reflog of the local"""
-            """ project. A limited number of entries is shown first."""
-            """ More can be retrieved later on.</p>"""
-        ))
+            self.tr("Show reflog browser"),
+            0,
+            0,
+            self,
+            "git_reflog_browser",
+        )
+        self.gitReflogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the reflog of the local project")
+        )
+        self.gitReflogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show reflog browser</b>"""
+                """<p>This shows a dialog to browse the reflog of the local"""
+                """ project. A limited number of entries is shown first."""
+                """ More can be retrieved later on.</p>"""
+            )
+        )
         self.gitReflogBrowserAct.triggered.connect(self.__gitReflogBrowser)
         self.actions.append(self.gitReflogBrowserAct)
-        
+
         self.vcsDiffAct = EricAction(
-            self.tr('Show differences'),
+            self.tr("Show differences"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show &differences...'),
-            0, 0, self, 'git_diff')
-        self.vcsDiffAct.setStatusTip(self.tr(
-            'Show the differences of the local project to the repository'
-        ))
-        self.vcsDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences</b>"""
-            """<p>This shows differences of the local project to the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show &differences..."),
+            0,
+            0,
+            self,
+            "git_diff",
+        )
+        self.vcsDiffAct.setStatusTip(
+            self.tr("Show the differences of the local project to the repository")
+        )
+        self.vcsDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences</b>"""
+                """<p>This shows differences of the local project to the"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsDiffAct.triggered.connect(self._vcsDiff)
         self.actions.append(self.vcsDiffAct)
-        
+
         self.gitExtDiffAct = EricAction(
-            self.tr('Show differences (extended)'),
+            self.tr("Show differences (extended)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended) ...'),
-            0, 0, self, 'git_extendeddiff')
-        self.gitExtDiffAct.setStatusTip(self.tr(
-            'Show the difference of revisions of the project to the repository'
-        ))
-        self.gitExtDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (extended)</b>"""
-            """<p>This shows differences of selectable revisions of the"""
-            """ project.</p>"""
-        ))
+            self.tr("Show differences (extended) ..."),
+            0,
+            0,
+            self,
+            "git_extendeddiff",
+        )
+        self.gitExtDiffAct.setStatusTip(
+            self.tr("Show the difference of revisions of the project to the repository")
+        )
+        self.gitExtDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (extended)</b>"""
+                """<p>This shows differences of selectable revisions of the"""
+                """ project.</p>"""
+            )
+        )
         self.gitExtDiffAct.triggered.connect(self.__gitExtendedDiff)
         self.actions.append(self.gitExtDiffAct)
-        
+
         self.vcsStatusAct = EricAction(
-            self.tr('Show status'),
+            self.tr("Show status"),
             UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show &status...'),
-            0, 0, self, 'git_status')
-        self.vcsStatusAct.setStatusTip(self.tr(
-            'Show the status of the local project'
-        ))
-        self.vcsStatusAct.setWhatsThis(self.tr(
-            """<b>Show status</b>"""
-            """<p>This shows the status of the local project.</p>"""
-        ))
+            self.tr("Show &status..."),
+            0,
+            0,
+            self,
+            "git_status",
+        )
+        self.vcsStatusAct.setStatusTip(self.tr("Show the status of the local project"))
+        self.vcsStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show status</b>"""
+                """<p>This shows the status of the local project.</p>"""
+            )
+        )
         self.vcsStatusAct.triggered.connect(self._vcsStatus)
         self.actions.append(self.vcsStatusAct)
-        
+
         self.vcsSwitchAct = EricAction(
-            self.tr('Switch'),
+            self.tr("Switch"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('S&witch...'),
-            0, 0, self, 'git_switch')
-        self.vcsSwitchAct.setStatusTip(self.tr(
-            'Switch the working directory to another revision'
-        ))
-        self.vcsSwitchAct.setWhatsThis(self.tr(
-            """<b>Switch</b>"""
-            """<p>This switches the working directory to another"""
-            """ revision.</p>"""
-        ))
+            self.tr("S&witch..."),
+            0,
+            0,
+            self,
+            "git_switch",
+        )
+        self.vcsSwitchAct.setStatusTip(
+            self.tr("Switch the working directory to another revision")
+        )
+        self.vcsSwitchAct.setWhatsThis(
+            self.tr(
+                """<b>Switch</b>"""
+                """<p>This switches the working directory to another"""
+                """ revision.</p>"""
+            )
+        )
         self.vcsSwitchAct.triggered.connect(self._vcsSwitch)
         self.actions.append(self.vcsSwitchAct)
-        
+
         self.vcsTagAct = EricAction(
-            self.tr('Tag in repository'),
+            self.tr("Tag in repository"),
             UI.PixmapCache.getIcon("vcsTag"),
-            self.tr('&Tag in repository...'),
-            0, 0, self, 'git_tag')
-        self.vcsTagAct.setStatusTip(self.tr(
-            'Perform tag operations for the local project'
-        ))
-        self.vcsTagAct.setWhatsThis(self.tr(
-            """<b>Tag in repository</b>"""
-            """<p>This performs selectable tag operations for the local"""
-            """ project.</p>"""
-        ))
+            self.tr("&Tag in repository..."),
+            0,
+            0,
+            self,
+            "git_tag",
+        )
+        self.vcsTagAct.setStatusTip(
+            self.tr("Perform tag operations for the local project")
+        )
+        self.vcsTagAct.setWhatsThis(
+            self.tr(
+                """<b>Tag in repository</b>"""
+                """<p>This performs selectable tag operations for the local"""
+                """ project.</p>"""
+            )
+        )
         self.vcsTagAct.triggered.connect(self._vcsTag)
         self.actions.append(self.vcsTagAct)
-        
+
         self.gitTagListAct = EricAction(
-            self.tr('List tags'),
-            self.tr('&List tags...'),
-            0, 0, self, 'git_list_tags')
-        self.gitTagListAct.setStatusTip(self.tr(
-            'List tags of the project'
-        ))
-        self.gitTagListAct.setWhatsThis(self.tr(
-            """<b>List tags</b>"""
-            """<p>This lists the tags of the project.</p>"""
-        ))
+            self.tr("List tags"), self.tr("&List tags..."), 0, 0, self, "git_list_tags"
+        )
+        self.gitTagListAct.setStatusTip(self.tr("List tags of the project"))
+        self.gitTagListAct.setWhatsThis(
+            self.tr(
+                """<b>List tags</b>""" """<p>This lists the tags of the project.</p>"""
+            )
+        )
         self.gitTagListAct.triggered.connect(self.__gitTagList)
         self.actions.append(self.gitTagListAct)
-        
+
         self.gitDescribeTagAct = EricAction(
-            self.tr('Show most recent tag'),
-            self.tr('Show most recent tag'),
-            0, 0, self, 'git_describe_tag')
-        self.gitDescribeTagAct.setStatusTip(self.tr(
-            'Show the most recent tag reachable from the work tree'
-        ))
-        self.gitDescribeTagAct.setWhatsThis(self.tr(
-            """<b>Show most recent tag</b>"""
-            """<p>This shows the most recent tag reachable from the work"""
-            """ tree.</p>"""
-        ))
+            self.tr("Show most recent tag"),
+            self.tr("Show most recent tag"),
+            0,
+            0,
+            self,
+            "git_describe_tag",
+        )
+        self.gitDescribeTagAct.setStatusTip(
+            self.tr("Show the most recent tag reachable from the work tree")
+        )
+        self.gitDescribeTagAct.setWhatsThis(
+            self.tr(
+                """<b>Show most recent tag</b>"""
+                """<p>This shows the most recent tag reachable from the work"""
+                """ tree.</p>"""
+            )
+        )
         self.gitDescribeTagAct.triggered.connect(self.__gitDescribeTag)
         self.actions.append(self.gitDescribeTagAct)
-        
+
         self.gitBranchListAct = EricAction(
-            self.tr('List branches'),
-            self.tr('&List branches...'),
-            0, 0, self, 'git_list_branches')
-        self.gitBranchListAct.setStatusTip(self.tr(
-            'List branches of the project'
-        ))
-        self.gitBranchListAct.setWhatsThis(self.tr(
-            """<b>List branches</b>"""
-            """<p>This lists the branches of the project.</p>"""
-        ))
+            self.tr("List branches"),
+            self.tr("&List branches..."),
+            0,
+            0,
+            self,
+            "git_list_branches",
+        )
+        self.gitBranchListAct.setStatusTip(self.tr("List branches of the project"))
+        self.gitBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List branches</b>"""
+                """<p>This lists the branches of the project.</p>"""
+            )
+        )
         self.gitBranchListAct.triggered.connect(self.__gitBranchList)
         self.actions.append(self.gitBranchListAct)
-        
+
         self.gitMergedBranchListAct = EricAction(
-            self.tr('List merged branches'),
-            self.tr('List &merged branches...'),
-            0, 0, self, 'git_list_merged_branches')
-        self.gitMergedBranchListAct.setStatusTip(self.tr(
-            'List merged branches of the project'
-        ))
-        self.gitMergedBranchListAct.setWhatsThis(self.tr(
-            """<b>List merged branches</b>"""
-            """<p>This lists the merged branches of the project.</p>"""
-        ))
-        self.gitMergedBranchListAct.triggered.connect(
-            self.__gitMergedBranchList)
+            self.tr("List merged branches"),
+            self.tr("List &merged branches..."),
+            0,
+            0,
+            self,
+            "git_list_merged_branches",
+        )
+        self.gitMergedBranchListAct.setStatusTip(
+            self.tr("List merged branches of the project")
+        )
+        self.gitMergedBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List merged branches</b>"""
+                """<p>This lists the merged branches of the project.</p>"""
+            )
+        )
+        self.gitMergedBranchListAct.triggered.connect(self.__gitMergedBranchList)
         self.actions.append(self.gitMergedBranchListAct)
-        
+
         self.gitNotMergedBranchListAct = EricAction(
-            self.tr('List non-merged branches'),
-            self.tr('List &non-merged branches...'),
-            0, 0, self, 'git_list_non_merged_branches')
-        self.gitNotMergedBranchListAct.setStatusTip(self.tr(
-            'List non-merged branches of the project'
-        ))
-        self.gitNotMergedBranchListAct.setWhatsThis(self.tr(
-            """<b>List non-merged branches</b>"""
-            """<p>This lists the non-merged branches of the project.</p>"""
-        ))
-        self.gitNotMergedBranchListAct.triggered.connect(
-            self.__gitNotMergedBranchList)
+            self.tr("List non-merged branches"),
+            self.tr("List &non-merged branches..."),
+            0,
+            0,
+            self,
+            "git_list_non_merged_branches",
+        )
+        self.gitNotMergedBranchListAct.setStatusTip(
+            self.tr("List non-merged branches of the project")
+        )
+        self.gitNotMergedBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List non-merged branches</b>"""
+                """<p>This lists the non-merged branches of the project.</p>"""
+            )
+        )
+        self.gitNotMergedBranchListAct.triggered.connect(self.__gitNotMergedBranchList)
         self.actions.append(self.gitNotMergedBranchListAct)
-        
+
         self.gitBranchAct = EricAction(
-            self.tr('Branch in repository'),
+            self.tr("Branch in repository"),
             UI.PixmapCache.getIcon("vcsBranch"),
-            self.tr('&Branch in repository...'),
-            0, 0, self, 'git_branch')
-        self.gitBranchAct.setStatusTip(self.tr(
-            'Perform branch operations for the local project'
-        ))
-        self.gitBranchAct.setWhatsThis(self.tr(
-            """<b>Branch in repository</b>"""
-            """<p>This performs selectable branch operations for the local"""
-            """ project.</p>"""
-        ))
+            self.tr("&Branch in repository..."),
+            0,
+            0,
+            self,
+            "git_branch",
+        )
+        self.gitBranchAct.setStatusTip(
+            self.tr("Perform branch operations for the local project")
+        )
+        self.gitBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Branch in repository</b>"""
+                """<p>This performs selectable branch operations for the local"""
+                """ project.</p>"""
+            )
+        )
         self.gitBranchAct.triggered.connect(self.__gitBranch)
         self.actions.append(self.gitBranchAct)
-        
+
         self.gitDeleteRemoteBranchAct = EricAction(
-            self.tr('Delete Remote Branch'),
-            self.tr('&Delete Remote Branch...'),
-            0, 0, self, 'git_delete_remote_branch')
-        self.gitDeleteRemoteBranchAct.setStatusTip(self.tr(
-            'Delete a branch from a remote repository'
-        ))
-        self.gitDeleteRemoteBranchAct.setWhatsThis(self.tr(
-            """<b>Delete Remote Branch</b>"""
-            """<p>This deletes a branch from a remote repository.</p>"""
-        ))
+            self.tr("Delete Remote Branch"),
+            self.tr("&Delete Remote Branch..."),
+            0,
+            0,
+            self,
+            "git_delete_remote_branch",
+        )
+        self.gitDeleteRemoteBranchAct.setStatusTip(
+            self.tr("Delete a branch from a remote repository")
+        )
+        self.gitDeleteRemoteBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Delete Remote Branch</b>"""
+                """<p>This deletes a branch from a remote repository.</p>"""
+            )
+        )
         self.gitDeleteRemoteBranchAct.triggered.connect(self.__gitDeleteBranch)
         self.actions.append(self.gitDeleteRemoteBranchAct)
-        
+
         self.gitShowBranchAct = EricAction(
-            self.tr('Show current branch'),
-            self.tr('Show current branch'),
-            0, 0, self, 'git_show_branch')
-        self.gitShowBranchAct.setStatusTip(self.tr(
-            'Show the current branch of the project'
-        ))
-        self.gitShowBranchAct.setWhatsThis(self.tr(
-            """<b>Show current branch</b>"""
-            """<p>This shows the current branch of the project.</p>"""
-        ))
+            self.tr("Show current branch"),
+            self.tr("Show current branch"),
+            0,
+            0,
+            self,
+            "git_show_branch",
+        )
+        self.gitShowBranchAct.setStatusTip(
+            self.tr("Show the current branch of the project")
+        )
+        self.gitShowBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Show current branch</b>"""
+                """<p>This shows the current branch of the project.</p>"""
+            )
+        )
         self.gitShowBranchAct.triggered.connect(self.__gitShowBranch)
         self.actions.append(self.gitShowBranchAct)
-        
+
         self.vcsRevertAct = EricAction(
-            self.tr('Revert changes'),
+            self.tr("Revert changes"),
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Re&vert changes'),
-            0, 0, self, 'git_revert')
-        self.vcsRevertAct.setStatusTip(self.tr(
-            'Revert all changes made to the local project'
-        ))
-        self.vcsRevertAct.setWhatsThis(self.tr(
-            """<b>Revert changes</b>"""
-            """<p>This reverts all changes made to the local project.</p>"""
-        ))
+            self.tr("Re&vert changes"),
+            0,
+            0,
+            self,
+            "git_revert",
+        )
+        self.vcsRevertAct.setStatusTip(
+            self.tr("Revert all changes made to the local project")
+        )
+        self.vcsRevertAct.setWhatsThis(
+            self.tr(
+                """<b>Revert changes</b>"""
+                """<p>This reverts all changes made to the local project.</p>"""
+            )
+        )
         self.vcsRevertAct.triggered.connect(self.__gitRevert)
         self.actions.append(self.vcsRevertAct)
-        
+
         self.gitUnstageAct = EricAction(
-            self.tr('Unstage changes'),
+            self.tr("Unstage changes"),
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('&Unstage changes'),
-            0, 0, self, 'git_revert')
-        self.gitUnstageAct.setStatusTip(self.tr(
-            'Unstage all changes made to the local project'
-        ))
-        self.gitUnstageAct.setWhatsThis(self.tr(
-            """<b>Unstage changes</b>"""
-            """<p>This unstages all changes made to the local project.</p>"""
-        ))
+            self.tr("&Unstage changes"),
+            0,
+            0,
+            self,
+            "git_revert",
+        )
+        self.gitUnstageAct.setStatusTip(
+            self.tr("Unstage all changes made to the local project")
+        )
+        self.gitUnstageAct.setWhatsThis(
+            self.tr(
+                """<b>Unstage changes</b>"""
+                """<p>This unstages all changes made to the local project.</p>"""
+            )
+        )
         self.gitUnstageAct.triggered.connect(self.__gitUnstage)
         self.actions.append(self.gitUnstageAct)
-        
+
         self.vcsMergeAct = EricAction(
-            self.tr('Merge'),
+            self.tr("Merge"),
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Mer&ge changes...'),
-            0, 0, self, 'git_merge')
-        self.vcsMergeAct.setStatusTip(self.tr(
-            'Merge changes into the local project'
-        ))
-        self.vcsMergeAct.setWhatsThis(self.tr(
-            """<b>Merge</b>"""
-            """<p>This merges changes into the local project.</p>"""
-        ))
+            self.tr("Mer&ge changes..."),
+            0,
+            0,
+            self,
+            "git_merge",
+        )
+        self.vcsMergeAct.setStatusTip(self.tr("Merge changes into the local project"))
+        self.vcsMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Merge</b>"""
+                """<p>This merges changes into the local project.</p>"""
+            )
+        )
         self.vcsMergeAct.triggered.connect(self._vcsMerge)
         self.actions.append(self.vcsMergeAct)
-        
+
         self.gitCancelMergeAct = EricAction(
-            self.tr('Cancel uncommitted/failed merge'),
-            self.tr('Cancel uncommitted/failed merge'),
-            0, 0, self, 'git_cancel_merge')
-        self.gitCancelMergeAct.setStatusTip(self.tr(
-            'Cancel an uncommitted or failed merge and lose all changes'
-        ))
-        self.gitCancelMergeAct.setWhatsThis(self.tr(
-            """<b>Cancel uncommitted/failed merge</b>"""
-            """<p>This cancels an uncommitted or failed merge causing all"""
-            """ changes to be lost.</p>"""
-        ))
+            self.tr("Cancel uncommitted/failed merge"),
+            self.tr("Cancel uncommitted/failed merge"),
+            0,
+            0,
+            self,
+            "git_cancel_merge",
+        )
+        self.gitCancelMergeAct.setStatusTip(
+            self.tr("Cancel an uncommitted or failed merge and lose all changes")
+        )
+        self.gitCancelMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Cancel uncommitted/failed merge</b>"""
+                """<p>This cancels an uncommitted or failed merge causing all"""
+                """ changes to be lost.</p>"""
+            )
+        )
         self.gitCancelMergeAct.triggered.connect(self.__gitCancelMerge)
         self.actions.append(self.gitCancelMergeAct)
-        
+
         self.gitCommitMergeAct = EricAction(
-            self.tr('Commit failed merge'),
-            self.tr('Commit failed merge'),
-            0, 0, self, 'git_commit_merge')
-        self.gitCommitMergeAct.setStatusTip(self.tr(
-            'Commit a failed merge after conflicts have been resolved'
-        ))
-        self.gitCommitMergeAct.setWhatsThis(self.tr(
-            """<b>Commit failed merge</b>"""
-            """<p>This commits a failed merge after conflicts have been"""
-            """ resolved.</p>"""
-        ))
+            self.tr("Commit failed merge"),
+            self.tr("Commit failed merge"),
+            0,
+            0,
+            self,
+            "git_commit_merge",
+        )
+        self.gitCommitMergeAct.setStatusTip(
+            self.tr("Commit a failed merge after conflicts have been resolved")
+        )
+        self.gitCommitMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Commit failed merge</b>"""
+                """<p>This commits a failed merge after conflicts have been"""
+                """ resolved.</p>"""
+            )
+        )
         self.gitCommitMergeAct.triggered.connect(self.__gitCommitMerge)
         self.actions.append(self.gitCommitMergeAct)
-        
+
         self.vcsCleanupAct = EricAction(
-            self.tr('Cleanup'),
-            self.tr('Cleanu&p'),
-            0, 0, self, 'git_cleanup')
-        self.vcsCleanupAct.setStatusTip(self.tr(
-            'Cleanup the local project'
-        ))
-        self.vcsCleanupAct.setWhatsThis(self.tr(
-            """<b>Cleanup</b>"""
-            """<p>This performs a cleanup of the local project.</p>"""
-        ))
+            self.tr("Cleanup"), self.tr("Cleanu&p"), 0, 0, self, "git_cleanup"
+        )
+        self.vcsCleanupAct.setStatusTip(self.tr("Cleanup the local project"))
+        self.vcsCleanupAct.setWhatsThis(
+            self.tr(
+                """<b>Cleanup</b>"""
+                """<p>This performs a cleanup of the local project.</p>"""
+            )
+        )
         self.vcsCleanupAct.triggered.connect(self._vcsCleanup)
         self.actions.append(self.vcsCleanupAct)
-        
+
         self.vcsCommandAct = EricAction(
-            self.tr('Execute command'),
-            self.tr('E&xecute command...'),
-            0, 0, self, 'git_command')
-        self.vcsCommandAct.setStatusTip(self.tr(
-            'Execute an arbitrary Git command'
-        ))
-        self.vcsCommandAct.setWhatsThis(self.tr(
-            """<b>Execute command</b>"""
-            """<p>This opens a dialog to enter an arbitrary Git"""
-            """ command.</p>"""
-        ))
+            self.tr("Execute command"),
+            self.tr("E&xecute command..."),
+            0,
+            0,
+            self,
+            "git_command",
+        )
+        self.vcsCommandAct.setStatusTip(self.tr("Execute an arbitrary Git command"))
+        self.vcsCommandAct.setWhatsThis(
+            self.tr(
+                """<b>Execute command</b>"""
+                """<p>This opens a dialog to enter an arbitrary Git"""
+                """ command.</p>"""
+            )
+        )
         self.vcsCommandAct.triggered.connect(self._vcsCommand)
         self.actions.append(self.vcsCommandAct)
-        
+
         self.gitConfigAct = EricAction(
-            self.tr('Configure'),
-            self.tr('Configure...'),
-            0, 0, self, 'git_configure')
-        self.gitConfigAct.setStatusTip(self.tr(
-            'Show the configuration dialog with the Git page selected'
-        ))
-        self.gitConfigAct.setWhatsThis(self.tr(
-            """<b>Configure</b>"""
-            """<p>Show the configuration dialog with the Git page"""
-            """ selected.</p>"""
-        ))
+            self.tr("Configure"), self.tr("Configure..."), 0, 0, self, "git_configure"
+        )
+        self.gitConfigAct.setStatusTip(
+            self.tr("Show the configuration dialog with the Git page selected")
+        )
+        self.gitConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure</b>"""
+                """<p>Show the configuration dialog with the Git page"""
+                """ selected.</p>"""
+            )
+        )
         self.gitConfigAct.triggered.connect(self.__gitConfigure)
         self.actions.append(self.gitConfigAct)
-        
+
         self.gitRemotesShowAct = EricAction(
-            self.tr('Show Remotes'),
-            self.tr('Show Remotes...'),
-            0, 0, self, 'git_show_remotes')
-        self.gitRemotesShowAct.setStatusTip(self.tr(
-            'Show the available remote repositories'
-        ))
-        self.gitRemotesShowAct.setWhatsThis(self.tr(
-            """<b>Show Remotes</b>"""
-            """<p>This shows the remote repositories available for"""
-            """ pulling, fetching and pushing.</p>"""
-        ))
+            self.tr("Show Remotes"),
+            self.tr("Show Remotes..."),
+            0,
+            0,
+            self,
+            "git_show_remotes",
+        )
+        self.gitRemotesShowAct.setStatusTip(
+            self.tr("Show the available remote repositories")
+        )
+        self.gitRemotesShowAct.setWhatsThis(
+            self.tr(
+                """<b>Show Remotes</b>"""
+                """<p>This shows the remote repositories available for"""
+                """ pulling, fetching and pushing.</p>"""
+            )
+        )
         self.gitRemotesShowAct.triggered.connect(self.__gitShowRemotes)
         self.actions.append(self.gitRemotesShowAct)
-        
+
         self.gitRemoteShowAct = EricAction(
-            self.tr('Show Remote Info'),
-            self.tr('Show Remote Info...'),
-            0, 0, self, 'git_show_remote_info')
-        self.gitRemoteShowAct.setStatusTip(self.tr(
-            'Show information about a remote repository'
-        ))
-        self.gitRemoteShowAct.setWhatsThis(self.tr(
-            """<b>Show Remotes</b>"""
-            """<p>This shows the remote repositories available for"""
-            """ pulling, fetching and pushing.</p>"""
-        ))
+            self.tr("Show Remote Info"),
+            self.tr("Show Remote Info..."),
+            0,
+            0,
+            self,
+            "git_show_remote_info",
+        )
+        self.gitRemoteShowAct.setStatusTip(
+            self.tr("Show information about a remote repository")
+        )
+        self.gitRemoteShowAct.setWhatsThis(
+            self.tr(
+                """<b>Show Remotes</b>"""
+                """<p>This shows the remote repositories available for"""
+                """ pulling, fetching and pushing.</p>"""
+            )
+        )
         self.gitRemoteShowAct.triggered.connect(self.__gitShowRemote)
         self.actions.append(self.gitRemoteShowAct)
-        
+
         self.gitRemoteAddAct = EricAction(
-            self.tr('Add'),
-            self.tr('Add...'),
-            0, 0, self, 'git_add_remote')
-        self.gitRemoteAddAct.setStatusTip(self.tr(
-            'Add a remote repository'
-        ))
-        self.gitRemoteAddAct.setWhatsThis(self.tr(
-            """<b>Add</b>"""
-            """<p>This adds a remote repository.</p>"""
-        ))
+            self.tr("Add"), self.tr("Add..."), 0, 0, self, "git_add_remote"
+        )
+        self.gitRemoteAddAct.setStatusTip(self.tr("Add a remote repository"))
+        self.gitRemoteAddAct.setWhatsThis(
+            self.tr("""<b>Add</b>""" """<p>This adds a remote repository.</p>""")
+        )
         self.gitRemoteAddAct.triggered.connect(self.__gitAddRemote)
         self.actions.append(self.gitRemoteAddAct)
-        
+
         self.gitRemoteRemoveAct = EricAction(
-            self.tr('Remove'),
-            self.tr('Remove...'),
-            0, 0, self, 'git_remove_remote')
-        self.gitRemoteRemoveAct.setStatusTip(self.tr(
-            'Remove a remote repository'
-        ))
-        self.gitRemoteRemoveAct.setWhatsThis(self.tr(
-            """<b>Remove</b>"""
-            """<p>This removes a remote repository.</p>"""
-        ))
+            self.tr("Remove"), self.tr("Remove..."), 0, 0, self, "git_remove_remote"
+        )
+        self.gitRemoteRemoveAct.setStatusTip(self.tr("Remove a remote repository"))
+        self.gitRemoteRemoveAct.setWhatsThis(
+            self.tr("""<b>Remove</b>""" """<p>This removes a remote repository.</p>""")
+        )
         self.gitRemoteRemoveAct.triggered.connect(self.__gitRemoveRemote)
         self.actions.append(self.gitRemoteRemoveAct)
-        
+
         self.gitRemotePruneAct = EricAction(
-            self.tr('Prune'),
-            self.tr('Prune...'),
-            0, 0, self, 'git_prune_remote')
-        self.gitRemotePruneAct.setStatusTip(self.tr(
-            'Prune stale remote-tracking branches of a remote repository'
-        ))
-        self.gitRemotePruneAct.setWhatsThis(self.tr(
-            """<b>Prune</b>"""
-            """<p>This prunes stale remote-tracking branches of a remote"""
-            """ repository.</p>"""
-        ))
+            self.tr("Prune"), self.tr("Prune..."), 0, 0, self, "git_prune_remote"
+        )
+        self.gitRemotePruneAct.setStatusTip(
+            self.tr("Prune stale remote-tracking branches of a remote repository")
+        )
+        self.gitRemotePruneAct.setWhatsThis(
+            self.tr(
+                """<b>Prune</b>"""
+                """<p>This prunes stale remote-tracking branches of a remote"""
+                """ repository.</p>"""
+            )
+        )
         self.gitRemotePruneAct.triggered.connect(self.__gitPruneRemote)
         self.actions.append(self.gitRemotePruneAct)
-        
+
         self.gitRemoteRenameAct = EricAction(
-            self.tr('Rename'),
-            self.tr('Rename...'),
-            0, 0, self, 'git_rename_remote')
-        self.gitRemoteRenameAct.setStatusTip(self.tr(
-            'Rename a remote repository'
-        ))
-        self.gitRemoteRenameAct.setWhatsThis(self.tr(
-            """<b>Rename</b>"""
-            """<p>This renames a remote repository.</p>"""
-        ))
+            self.tr("Rename"), self.tr("Rename..."), 0, 0, self, "git_rename_remote"
+        )
+        self.gitRemoteRenameAct.setStatusTip(self.tr("Rename a remote repository"))
+        self.gitRemoteRenameAct.setWhatsThis(
+            self.tr("""<b>Rename</b>""" """<p>This renames a remote repository.</p>""")
+        )
         self.gitRemoteRenameAct.triggered.connect(self.__gitRenameRemote)
         self.actions.append(self.gitRemoteRenameAct)
-        
+
         self.gitRemoteChangeUrlAct = EricAction(
-            self.tr('Change URL'),
-            self.tr('Change URL...'),
-            0, 0, self, 'git_change_remote_url')
-        self.gitRemoteChangeUrlAct.setStatusTip(self.tr(
-            'Change the URL of a remote repository'
-        ))
-        self.gitRemoteChangeUrlAct.setWhatsThis(self.tr(
-            """<b>Change URL</b>"""
-            """<p>This changes the URL of a remote repository.</p>"""
-        ))
+            self.tr("Change URL"),
+            self.tr("Change URL..."),
+            0,
+            0,
+            self,
+            "git_change_remote_url",
+        )
+        self.gitRemoteChangeUrlAct.setStatusTip(
+            self.tr("Change the URL of a remote repository")
+        )
+        self.gitRemoteChangeUrlAct.setWhatsThis(
+            self.tr(
+                """<b>Change URL</b>"""
+                """<p>This changes the URL of a remote repository.</p>"""
+            )
+        )
         self.gitRemoteChangeUrlAct.triggered.connect(self.__gitChangeRemoteUrl)
         self.actions.append(self.gitRemoteChangeUrlAct)
-        
+
         self.gitRemoteCredentialsAct = EricAction(
-            self.tr('Credentials'),
-            self.tr('Credentials...'),
-            0, 0, self, 'git_remote_credentials')
-        self.gitRemoteCredentialsAct.setStatusTip(self.tr(
-            'Change or set the user credentials of a remote repository'
-        ))
-        self.gitRemoteCredentialsAct.setWhatsThis(self.tr(
-            """<b>Credentials</b>"""
-            """<p>This changes or sets the user credentials of a"""
-            """ remote repository.</p>"""
-        ))
-        self.gitRemoteCredentialsAct.triggered.connect(
-            self.__gitRemoteCredentials)
+            self.tr("Credentials"),
+            self.tr("Credentials..."),
+            0,
+            0,
+            self,
+            "git_remote_credentials",
+        )
+        self.gitRemoteCredentialsAct.setStatusTip(
+            self.tr("Change or set the user credentials of a remote repository")
+        )
+        self.gitRemoteCredentialsAct.setWhatsThis(
+            self.tr(
+                """<b>Credentials</b>"""
+                """<p>This changes or sets the user credentials of a"""
+                """ remote repository.</p>"""
+            )
+        )
+        self.gitRemoteCredentialsAct.triggered.connect(self.__gitRemoteCredentials)
         self.actions.append(self.gitRemoteCredentialsAct)
-        
+
         self.gitCherryPickAct = EricAction(
-            self.tr('Copy Commits'),
+            self.tr("Copy Commits"),
             UI.PixmapCache.getIcon("vcsGraft"),
-            self.tr('Copy Commits'),
-            0, 0, self, 'git_cherrypick')
-        self.gitCherryPickAct.setStatusTip(self.tr(
-            'Copies commits into the current branch'
-        ))
-        self.gitCherryPickAct.setWhatsThis(self.tr(
-            """<b>Copy Commits</b>"""
-            """<p>This copies commits on top of the current branch.</p>"""
-        ))
+            self.tr("Copy Commits"),
+            0,
+            0,
+            self,
+            "git_cherrypick",
+        )
+        self.gitCherryPickAct.setStatusTip(
+            self.tr("Copies commits into the current branch")
+        )
+        self.gitCherryPickAct.setWhatsThis(
+            self.tr(
+                """<b>Copy Commits</b>"""
+                """<p>This copies commits on top of the current branch.</p>"""
+            )
+        )
         self.gitCherryPickAct.triggered.connect(self.__gitCherryPick)
         self.actions.append(self.gitCherryPickAct)
-        
+
         self.gitCherryPickContinueAct = EricAction(
-            self.tr('Continue Copying Session'),
-            self.tr('Continue Copying Session'),
-            0, 0, self, 'git_cherrypick_continue')
-        self.gitCherryPickContinueAct.setStatusTip(self.tr(
-            'Continue the last copying session after conflicts were resolved'
-        ))
-        self.gitCherryPickContinueAct.setWhatsThis(self.tr(
-            """<b>Continue Copying Session</b>"""
-            """<p>This continues the last copying session after conflicts"""
-            """ were resolved.</p>"""
-        ))
-        self.gitCherryPickContinueAct.triggered.connect(
-            self.__gitCherryPickContinue)
+            self.tr("Continue Copying Session"),
+            self.tr("Continue Copying Session"),
+            0,
+            0,
+            self,
+            "git_cherrypick_continue",
+        )
+        self.gitCherryPickContinueAct.setStatusTip(
+            self.tr("Continue the last copying session after conflicts were resolved")
+        )
+        self.gitCherryPickContinueAct.setWhatsThis(
+            self.tr(
+                """<b>Continue Copying Session</b>"""
+                """<p>This continues the last copying session after conflicts"""
+                """ were resolved.</p>"""
+            )
+        )
+        self.gitCherryPickContinueAct.triggered.connect(self.__gitCherryPickContinue)
         self.actions.append(self.gitCherryPickContinueAct)
-        
+
         self.gitCherryPickQuitAct = EricAction(
-            self.tr('Quit Copying Session'),
-            self.tr('Quit Copying Session'),
-            0, 0, self, 'git_cherrypick_quit')
-        self.gitCherryPickQuitAct.setStatusTip(self.tr(
-            'Quit the current copying session'
-        ))
-        self.gitCherryPickQuitAct.setWhatsThis(self.tr(
-            """<b>Quit Copying Session</b>"""
-            """<p>This quits the current copying session.</p>"""
-        ))
+            self.tr("Quit Copying Session"),
+            self.tr("Quit Copying Session"),
+            0,
+            0,
+            self,
+            "git_cherrypick_quit",
+        )
+        self.gitCherryPickQuitAct.setStatusTip(
+            self.tr("Quit the current copying session")
+        )
+        self.gitCherryPickQuitAct.setWhatsThis(
+            self.tr(
+                """<b>Quit Copying Session</b>"""
+                """<p>This quits the current copying session.</p>"""
+            )
+        )
         self.gitCherryPickQuitAct.triggered.connect(self.__gitCherryPickQuit)
         self.actions.append(self.gitCherryPickQuitAct)
-        
+
         self.gitCherryPickAbortAct = EricAction(
-            self.tr('Cancel Copying Session'),
-            self.tr('Cancel Copying Session'),
-            0, 0, self, 'git_cherrypick_abort')
-        self.gitCherryPickAbortAct.setStatusTip(self.tr(
-            'Cancel the current copying session and return to the'
-            ' previous state'
-        ))
-        self.gitCherryPickAbortAct.setWhatsThis(self.tr(
-            """<b>Cancel Copying Session</b>"""
-            """<p>This cancels the current copying session and returns to"""
-            """ the previous state.</p>"""
-        ))
+            self.tr("Cancel Copying Session"),
+            self.tr("Cancel Copying Session"),
+            0,
+            0,
+            self,
+            "git_cherrypick_abort",
+        )
+        self.gitCherryPickAbortAct.setStatusTip(
+            self.tr(
+                "Cancel the current copying session and return to the" " previous state"
+            )
+        )
+        self.gitCherryPickAbortAct.setWhatsThis(
+            self.tr(
+                """<b>Cancel Copying Session</b>"""
+                """<p>This cancels the current copying session and returns to"""
+                """ the previous state.</p>"""
+            )
+        )
         self.gitCherryPickAbortAct.triggered.connect(self.__gitCherryPickAbort)
         self.actions.append(self.gitCherryPickAbortAct)
-        
+
         self.gitStashAct = EricAction(
-            self.tr('Stash changes'),
-            self.tr('Stash changes...'),
-            0, 0, self, 'git_stash')
-        self.gitStashAct.setStatusTip(self.tr(
-            'Stash all current changes of the project'
-        ))
-        self.gitStashAct.setWhatsThis(self.tr(
-            """<b>Stash changes</b>"""
-            """<p>This stashes all current changes of the project.</p>"""
-        ))
+            self.tr("Stash changes"),
+            self.tr("Stash changes..."),
+            0,
+            0,
+            self,
+            "git_stash",
+        )
+        self.gitStashAct.setStatusTip(
+            self.tr("Stash all current changes of the project")
+        )
+        self.gitStashAct.setWhatsThis(
+            self.tr(
+                """<b>Stash changes</b>"""
+                """<p>This stashes all current changes of the project.</p>"""
+            )
+        )
         self.gitStashAct.triggered.connect(self.__gitStashSave)
         self.actions.append(self.gitStashAct)
-        
+
         self.gitStashBrowserAct = EricAction(
-            self.tr('Show stash browser'),
-            self.tr('Show stash browser...'),
-            0, 0, self, 'git_stash_browser')
-        self.gitStashBrowserAct.setStatusTip(self.tr(
-            'Show a dialog with all stashes'
-        ))
-        self.gitStashBrowserAct.setWhatsThis(self.tr(
-            """<b>Show stash browser...</b>"""
-            """<p>This shows a dialog listing all available stashes."""
-            """ Actions on these stashes may be executed via the"""
-            """ context menu.</p>"""
-        ))
+            self.tr("Show stash browser"),
+            self.tr("Show stash browser..."),
+            0,
+            0,
+            self,
+            "git_stash_browser",
+        )
+        self.gitStashBrowserAct.setStatusTip(self.tr("Show a dialog with all stashes"))
+        self.gitStashBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show stash browser...</b>"""
+                """<p>This shows a dialog listing all available stashes."""
+                """ Actions on these stashes may be executed via the"""
+                """ context menu.</p>"""
+            )
+        )
         self.gitStashBrowserAct.triggered.connect(self.__gitStashBrowser)
         self.actions.append(self.gitStashBrowserAct)
-        
+
         self.gitStashShowAct = EricAction(
-            self.tr('Show stash'),
-            self.tr('Show stash...'),
-            0, 0, self, 'git_stash_show')
-        self.gitStashShowAct.setStatusTip(self.tr(
-            'Show a dialog with a patch of a stash'
-        ))
-        self.gitStashShowAct.setWhatsThis(self.tr(
-            """<b>Show stash...</b>"""
-            """<p>This shows a dialog with a patch of a selectable"""
-            """ stash.</p>"""
-        ))
+            self.tr("Show stash"),
+            self.tr("Show stash..."),
+            0,
+            0,
+            self,
+            "git_stash_show",
+        )
+        self.gitStashShowAct.setStatusTip(
+            self.tr("Show a dialog with a patch of a stash")
+        )
+        self.gitStashShowAct.setWhatsThis(
+            self.tr(
+                """<b>Show stash...</b>"""
+                """<p>This shows a dialog with a patch of a selectable"""
+                """ stash.</p>"""
+            )
+        )
         self.gitStashShowAct.triggered.connect(self.__gitStashShow)
         self.actions.append(self.gitStashShowAct)
-        
+
         self.gitStashApplyAct = EricAction(
-            self.tr('Restore && Keep'),
-            self.tr('Restore && Keep'),
-            0, 0, self, 'git_stash_apply')
-        self.gitStashApplyAct.setStatusTip(self.tr(
-            'Restore a stash but keep it'
-        ))
-        self.gitStashApplyAct.setWhatsThis(self.tr(
-            """<b>Restore &amp; Keep</b>"""
-            """<p>This restores a selectable stash and keeps it.</p>"""
-        ))
+            self.tr("Restore && Keep"),
+            self.tr("Restore && Keep"),
+            0,
+            0,
+            self,
+            "git_stash_apply",
+        )
+        self.gitStashApplyAct.setStatusTip(self.tr("Restore a stash but keep it"))
+        self.gitStashApplyAct.setWhatsThis(
+            self.tr(
+                """<b>Restore &amp; Keep</b>"""
+                """<p>This restores a selectable stash and keeps it.</p>"""
+            )
+        )
         self.gitStashApplyAct.triggered.connect(self.__gitStashApply)
         self.actions.append(self.gitStashApplyAct)
-        
+
         self.gitStashPopAct = EricAction(
-            self.tr('Restore && Delete'),
-            self.tr('Restore && Delete'),
-            0, 0, self, 'git_stash_pop')
-        self.gitStashPopAct.setStatusTip(self.tr(
-            'Restore a stash and delete it'
-        ))
-        self.gitStashPopAct.setWhatsThis(self.tr(
-            """<b>Restore &amp; Delete</b>"""
-            """<p>This restores a selectable stash and deletes it.</p>"""
-        ))
+            self.tr("Restore && Delete"),
+            self.tr("Restore && Delete"),
+            0,
+            0,
+            self,
+            "git_stash_pop",
+        )
+        self.gitStashPopAct.setStatusTip(self.tr("Restore a stash and delete it"))
+        self.gitStashPopAct.setWhatsThis(
+            self.tr(
+                """<b>Restore &amp; Delete</b>"""
+                """<p>This restores a selectable stash and deletes it.</p>"""
+            )
+        )
         self.gitStashPopAct.triggered.connect(self.__gitStashPop)
         self.actions.append(self.gitStashPopAct)
-        
+
         self.gitStashBranchAct = EricAction(
-            self.tr('Create Branch'),
-            self.tr('Create Branch'),
-            0, 0, self, 'git_stash_branch')
-        self.gitStashBranchAct.setStatusTip(self.tr(
-            'Create a new branch and restore a stash into it'
-        ))
-        self.gitStashBranchAct.setWhatsThis(self.tr(
-            """<b>Create Branch</b>"""
-            """<p>This creates a new branch and restores a stash into"""
-            """ it.</p>"""
-        ))
+            self.tr("Create Branch"),
+            self.tr("Create Branch"),
+            0,
+            0,
+            self,
+            "git_stash_branch",
+        )
+        self.gitStashBranchAct.setStatusTip(
+            self.tr("Create a new branch and restore a stash into it")
+        )
+        self.gitStashBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Create Branch</b>"""
+                """<p>This creates a new branch and restores a stash into"""
+                """ it.</p>"""
+            )
+        )
         self.gitStashBranchAct.triggered.connect(self.__gitStashBranch)
         self.actions.append(self.gitStashBranchAct)
-        
+
         self.gitStashDropAct = EricAction(
-            self.tr('Delete'),
-            self.tr('Delete'),
-            0, 0, self, 'git_stash_delete')
-        self.gitStashDropAct.setStatusTip(self.tr(
-            'Delete a stash'
-        ))
-        self.gitStashDropAct.setWhatsThis(self.tr(
-            """<b>Delete</b>"""
-            """<p>This deletes a stash.</p>"""
-        ))
+            self.tr("Delete"), self.tr("Delete"), 0, 0, self, "git_stash_delete"
+        )
+        self.gitStashDropAct.setStatusTip(self.tr("Delete a stash"))
+        self.gitStashDropAct.setWhatsThis(
+            self.tr("""<b>Delete</b>""" """<p>This deletes a stash.</p>""")
+        )
         self.gitStashDropAct.triggered.connect(self.__gitStashDrop)
         self.actions.append(self.gitStashDropAct)
-        
+
         self.gitStashClearAct = EricAction(
-            self.tr('Delete All'),
-            self.tr('Delete All'),
-            0, 0, self, 'git_stash_delete_all')
-        self.gitStashClearAct.setStatusTip(self.tr(
-            'Delete all stashes'
-        ))
-        self.gitStashClearAct.setWhatsThis(self.tr(
-            """<b>Delete All</b>"""
-            """<p>This deletes all stashes.</p>"""
-        ))
+            self.tr("Delete All"),
+            self.tr("Delete All"),
+            0,
+            0,
+            self,
+            "git_stash_delete_all",
+        )
+        self.gitStashClearAct.setStatusTip(self.tr("Delete all stashes"))
+        self.gitStashClearAct.setWhatsThis(
+            self.tr("""<b>Delete All</b>""" """<p>This deletes all stashes.</p>""")
+        )
         self.gitStashClearAct.triggered.connect(self.__gitStashClear)
         self.actions.append(self.gitStashClearAct)
-        
+
         self.gitEditUserConfigAct = EricAction(
-            self.tr('Edit user configuration'),
-            self.tr('Edit user configuration...'),
-            0, 0, self, 'git_user_configure')
-        self.gitEditUserConfigAct.setStatusTip(self.tr(
-            'Show an editor to edit the user configuration file'
-        ))
-        self.gitEditUserConfigAct.setWhatsThis(self.tr(
-            """<b>Edit user configuration</b>"""
-            """<p>Show an editor to edit the user configuration file.</p>"""
-        ))
+            self.tr("Edit user configuration"),
+            self.tr("Edit user configuration..."),
+            0,
+            0,
+            self,
+            "git_user_configure",
+        )
+        self.gitEditUserConfigAct.setStatusTip(
+            self.tr("Show an editor to edit the user configuration file")
+        )
+        self.gitEditUserConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Edit user configuration</b>"""
+                """<p>Show an editor to edit the user configuration file.</p>"""
+            )
+        )
         self.gitEditUserConfigAct.triggered.connect(self.__gitEditUserConfig)
         self.actions.append(self.gitEditUserConfigAct)
-        
+
         self.gitRepoConfigAct = EricAction(
-            self.tr('Edit repository configuration'),
-            self.tr('Edit repository configuration...'),
-            0, 0, self, 'git_repo_configure')
-        self.gitRepoConfigAct.setStatusTip(self.tr(
-            'Show an editor to edit the repository configuration file'
-        ))
-        self.gitRepoConfigAct.setWhatsThis(self.tr(
-            """<b>Edit repository configuration</b>"""
-            """<p>Show an editor to edit the repository configuration"""
-            """ file.</p>"""
-        ))
+            self.tr("Edit repository configuration"),
+            self.tr("Edit repository configuration..."),
+            0,
+            0,
+            self,
+            "git_repo_configure",
+        )
+        self.gitRepoConfigAct.setStatusTip(
+            self.tr("Show an editor to edit the repository configuration file")
+        )
+        self.gitRepoConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Edit repository configuration</b>"""
+                """<p>Show an editor to edit the repository configuration"""
+                """ file.</p>"""
+            )
+        )
         self.gitRepoConfigAct.triggered.connect(self.__gitEditRepoConfig)
         self.actions.append(self.gitRepoConfigAct)
-        
+
         self.gitCreateIgnoreAct = EricAction(
-            self.tr('Create .gitignore'),
-            self.tr('Create .gitignore'),
-            0, 0, self, 'git_create_ignore')
-        self.gitCreateIgnoreAct.setStatusTip(self.tr(
-            'Create a .gitignore file with default values'
-        ))
-        self.gitCreateIgnoreAct.setWhatsThis(self.tr(
-            """<b>Create .gitignore</b>"""
-            """<p>This creates a .gitignore file with default values.</p>"""
-        ))
+            self.tr("Create .gitignore"),
+            self.tr("Create .gitignore"),
+            0,
+            0,
+            self,
+            "git_create_ignore",
+        )
+        self.gitCreateIgnoreAct.setStatusTip(
+            self.tr("Create a .gitignore file with default values")
+        )
+        self.gitCreateIgnoreAct.setWhatsThis(
+            self.tr(
+                """<b>Create .gitignore</b>"""
+                """<p>This creates a .gitignore file with default values.</p>"""
+            )
+        )
         self.gitCreateIgnoreAct.triggered.connect(self.__gitCreateIgnore)
         self.actions.append(self.gitCreateIgnoreAct)
-        
+
         self.gitShowConfigAct = EricAction(
-            self.tr('Show combined configuration settings'),
-            self.tr('Show combined configuration settings...'),
-            0, 0, self, 'git_show_config')
-        self.gitShowConfigAct.setStatusTip(self.tr(
-            'Show the combined configuration settings from all configuration'
-            ' files'
-        ))
-        self.gitShowConfigAct.setWhatsThis(self.tr(
-            """<b>Show combined configuration settings</b>"""
-            """<p>This shows the combined configuration settings"""
-            """ from all configuration files.</p>"""
-        ))
+            self.tr("Show combined configuration settings"),
+            self.tr("Show combined configuration settings..."),
+            0,
+            0,
+            self,
+            "git_show_config",
+        )
+        self.gitShowConfigAct.setStatusTip(
+            self.tr(
+                "Show the combined configuration settings from all configuration"
+                " files"
+            )
+        )
+        self.gitShowConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Show combined configuration settings</b>"""
+                """<p>This shows the combined configuration settings"""
+                """ from all configuration files.</p>"""
+            )
+        )
         self.gitShowConfigAct.triggered.connect(self.__gitShowConfig)
         self.actions.append(self.gitShowConfigAct)
-        
+
         self.gitVerifyAct = EricAction(
-            self.tr('Verify repository'),
-            self.tr('Verify repository...'),
-            0, 0, self, 'git_verify')
-        self.gitVerifyAct.setStatusTip(self.tr(
-            'Verify the connectivity and validity of objects of the database'
-        ))
-        self.gitVerifyAct.setWhatsThis(self.tr(
-            """<b>Verify repository</b>"""
-            """<p>This verifies the connectivity and validity of objects"""
-            """ of the database.</p>"""
-        ))
+            self.tr("Verify repository"),
+            self.tr("Verify repository..."),
+            0,
+            0,
+            self,
+            "git_verify",
+        )
+        self.gitVerifyAct.setStatusTip(
+            self.tr("Verify the connectivity and validity of objects of the database")
+        )
+        self.gitVerifyAct.setWhatsThis(
+            self.tr(
+                """<b>Verify repository</b>"""
+                """<p>This verifies the connectivity and validity of objects"""
+                """ of the database.</p>"""
+            )
+        )
         self.gitVerifyAct.triggered.connect(self.__gitVerify)
         self.actions.append(self.gitVerifyAct)
-        
+
         self.gitHouseKeepingAct = EricAction(
-            self.tr('Optimize repository'),
-            self.tr('Optimize repository...'),
-            0, 0, self, 'git_housekeeping')
-        self.gitHouseKeepingAct.setStatusTip(self.tr(
-            'Cleanup and optimize the local repository'
-        ))
-        self.gitHouseKeepingAct.setWhatsThis(self.tr(
-            """<b>Optimize repository</b>"""
-            """<p>This cleans up and optimizes the local repository.</p>"""
-        ))
+            self.tr("Optimize repository"),
+            self.tr("Optimize repository..."),
+            0,
+            0,
+            self,
+            "git_housekeeping",
+        )
+        self.gitHouseKeepingAct.setStatusTip(
+            self.tr("Cleanup and optimize the local repository")
+        )
+        self.gitHouseKeepingAct.setWhatsThis(
+            self.tr(
+                """<b>Optimize repository</b>"""
+                """<p>This cleans up and optimizes the local repository.</p>"""
+            )
+        )
         self.gitHouseKeepingAct.triggered.connect(self.__gitHouseKeeping)
         self.actions.append(self.gitHouseKeepingAct)
-        
+
         self.gitStatisticsAct = EricAction(
-            self.tr('Repository Statistics'),
-            self.tr('Repository Statistics...'),
-            0, 0, self, 'git_statistics')
-        self.gitStatisticsAct.setStatusTip(self.tr(
-            'Show some statistics of the local repository'
-        ))
-        self.gitStatisticsAct.setWhatsThis(self.tr(
-            """<b>Repository Statistics</b>"""
-            """<p>This show some statistics of the local repository.</p>"""
-        ))
+            self.tr("Repository Statistics"),
+            self.tr("Repository Statistics..."),
+            0,
+            0,
+            self,
+            "git_statistics",
+        )
+        self.gitStatisticsAct.setStatusTip(
+            self.tr("Show some statistics of the local repository")
+        )
+        self.gitStatisticsAct.setWhatsThis(
+            self.tr(
+                """<b>Repository Statistics</b>"""
+                """<p>This show some statistics of the local repository.</p>"""
+            )
+        )
         self.gitStatisticsAct.triggered.connect(self.__gitStatistics)
         self.actions.append(self.gitStatisticsAct)
-        
+
         self.gitCreateArchiveAct = EricAction(
-            self.tr('Create Archive'),
-            self.tr('Create Archive'),
-            0, 0, self, 'git_create_archive')
-        self.gitCreateArchiveAct.setStatusTip(self.tr(
-            'Create an archive from the local repository'
-        ))
-        self.gitCreateArchiveAct.setWhatsThis(self.tr(
-            """<b>Create Archive</b>"""
-            """<p>This creates an archive from the local repository.</p>"""
-        ))
+            self.tr("Create Archive"),
+            self.tr("Create Archive"),
+            0,
+            0,
+            self,
+            "git_create_archive",
+        )
+        self.gitCreateArchiveAct.setStatusTip(
+            self.tr("Create an archive from the local repository")
+        )
+        self.gitCreateArchiveAct.setWhatsThis(
+            self.tr(
+                """<b>Create Archive</b>"""
+                """<p>This creates an archive from the local repository.</p>"""
+            )
+        )
         self.gitCreateArchiveAct.triggered.connect(self.__gitCreateArchive)
         self.actions.append(self.gitCreateArchiveAct)
-        
+
         self.gitBundleAct = EricAction(
-            self.tr('Create bundle'),
-            self.tr('Create bundle...'),
-            0, 0, self, 'mercurial_bundle_create')
-        self.gitBundleAct.setStatusTip(self.tr(
-            'Create bundle file collecting changesets'
-        ))
-        self.gitBundleAct.setWhatsThis(self.tr(
-            """<b>Create bundle</b>"""
-            """<p>This creates a bundle file collecting selected"""
-            """ changesets (git bundle create).</p>"""
-        ))
+            self.tr("Create bundle"),
+            self.tr("Create bundle..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle_create",
+        )
+        self.gitBundleAct.setStatusTip(
+            self.tr("Create bundle file collecting changesets")
+        )
+        self.gitBundleAct.setWhatsThis(
+            self.tr(
+                """<b>Create bundle</b>"""
+                """<p>This creates a bundle file collecting selected"""
+                """ changesets (git bundle create).</p>"""
+            )
+        )
         self.gitBundleAct.triggered.connect(self.__gitBundle)
         self.actions.append(self.gitBundleAct)
-        
+
         self.gitBundleVerifyAct = EricAction(
-            self.tr('Verify bundle'),
-            self.tr('Verify bundle...'),
-            0, 0, self, 'mercurial_bundle_verify')
-        self.gitBundleVerifyAct.setStatusTip(self.tr(
-            'Verify the validity and applicability of a bundle file'
-        ))
-        self.gitBundleVerifyAct.setWhatsThis(self.tr(
-            """<b>Verify bundle</b>"""
-            """<p>This verifies that a bundle file is valid and will"""
-            """ apply cleanly.</p>"""
-        ))
+            self.tr("Verify bundle"),
+            self.tr("Verify bundle..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle_verify",
+        )
+        self.gitBundleVerifyAct.setStatusTip(
+            self.tr("Verify the validity and applicability of a bundle file")
+        )
+        self.gitBundleVerifyAct.setWhatsThis(
+            self.tr(
+                """<b>Verify bundle</b>"""
+                """<p>This verifies that a bundle file is valid and will"""
+                """ apply cleanly.</p>"""
+            )
+        )
         self.gitBundleVerifyAct.triggered.connect(self.__gitVerifyBundle)
         self.actions.append(self.gitBundleVerifyAct)
-        
+
         self.gitBundleListHeadsAct = EricAction(
-            self.tr('List bundle heads'),
-            self.tr('List bundle heads...'),
-            0, 0, self, 'mercurial_bundle_list_heads')
-        self.gitBundleListHeadsAct.setStatusTip(self.tr(
-            'List all heads contained in a bundle file'
-        ))
-        self.gitBundleListHeadsAct.setWhatsThis(self.tr(
-            """<b>List bundle heads</b>"""
-            """<p>This lists all heads contained in a bundle file.</p>"""
-        ))
+            self.tr("List bundle heads"),
+            self.tr("List bundle heads..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle_list_heads",
+        )
+        self.gitBundleListHeadsAct.setStatusTip(
+            self.tr("List all heads contained in a bundle file")
+        )
+        self.gitBundleListHeadsAct.setWhatsThis(
+            self.tr(
+                """<b>List bundle heads</b>"""
+                """<p>This lists all heads contained in a bundle file.</p>"""
+            )
+        )
         self.gitBundleListHeadsAct.triggered.connect(self.__gitBundleListHeads)
         self.actions.append(self.gitBundleListHeadsAct)
-        
+
         self.gitBundleApplyFetchAct = EricAction(
-            self.tr('Apply Bundle (fetch)'),
-            self.tr('Apply Bundle (fetch)...'),
-            0, 0, self, 'mercurial_bundle_apply_fetch')
-        self.gitBundleApplyFetchAct.setStatusTip(self.tr(
-            'Apply a head of a bundle file using fetch'
-        ))
-        self.gitBundleApplyFetchAct.setWhatsThis(self.tr(
-            """<b>Apply Bundle (fetch)</b>"""
-            """<p>This applies a head of a bundle file using fetch.</p>"""
-        ))
+            self.tr("Apply Bundle (fetch)"),
+            self.tr("Apply Bundle (fetch)..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle_apply_fetch",
+        )
+        self.gitBundleApplyFetchAct.setStatusTip(
+            self.tr("Apply a head of a bundle file using fetch")
+        )
+        self.gitBundleApplyFetchAct.setWhatsThis(
+            self.tr(
+                """<b>Apply Bundle (fetch)</b>"""
+                """<p>This applies a head of a bundle file using fetch.</p>"""
+            )
+        )
         self.gitBundleApplyFetchAct.triggered.connect(self.__gitBundleFetch)
         self.actions.append(self.gitBundleApplyFetchAct)
-        
+
         self.gitBundleApplyPullAct = EricAction(
-            self.tr('Apply Bundle (pull)'),
-            self.tr('Apply Bundle (pull)...'),
-            0, 0, self, 'mercurial_bundle_apply_pull')
-        self.gitBundleApplyPullAct.setStatusTip(self.tr(
-            'Apply a head of a bundle file using pull'
-        ))
-        self.gitBundleApplyPullAct.setWhatsThis(self.tr(
-            """<b>Apply Bundle (pull)</b>"""
-            """<p>This applies a head of a bundle file using pull.</p>"""
-        ))
+            self.tr("Apply Bundle (pull)"),
+            self.tr("Apply Bundle (pull)..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle_apply_pull",
+        )
+        self.gitBundleApplyPullAct.setStatusTip(
+            self.tr("Apply a head of a bundle file using pull")
+        )
+        self.gitBundleApplyPullAct.setWhatsThis(
+            self.tr(
+                """<b>Apply Bundle (pull)</b>"""
+                """<p>This applies a head of a bundle file using pull.</p>"""
+            )
+        )
         self.gitBundleApplyPullAct.triggered.connect(self.__gitBundlePull)
         self.actions.append(self.gitBundleApplyPullAct)
-        
+
         self.gitBisectStartAct = EricAction(
-            self.tr('Start'),
-            self.tr('Start'),
-            0, 0, self, 'git_bisect_start')
-        self.gitBisectStartAct.setStatusTip(self.tr(
-            'Start a bisect session'
-        ))
-        self.gitBisectStartAct.setWhatsThis(self.tr(
-            """<b>Start</b>"""
-            """<p>This starts a bisect session.</p>"""
-        ))
+            self.tr("Start"), self.tr("Start"), 0, 0, self, "git_bisect_start"
+        )
+        self.gitBisectStartAct.setStatusTip(self.tr("Start a bisect session"))
+        self.gitBisectStartAct.setWhatsThis(
+            self.tr("""<b>Start</b>""" """<p>This starts a bisect session.</p>""")
+        )
         self.gitBisectStartAct.triggered.connect(self.__gitBisectStart)
         self.actions.append(self.gitBisectStartAct)
-        
+
         self.gitBisectStartExtendedAct = EricAction(
-            self.tr('Start (Extended)'),
-            self.tr('Start (Extended)'),
-            0, 0, self, 'git_bisect_start_extended')
-        self.gitBisectStartExtendedAct.setStatusTip(self.tr(
-            'Start a bisect session giving a bad and optionally good commits'
-        ))
-        self.gitBisectStartExtendedAct.setWhatsThis(self.tr(
-            """<b>Start (Extended)</b>"""
-            """<p>This starts a bisect session giving a bad and optionally"""
-            """ good commits.</p>"""
-        ))
-        self.gitBisectStartExtendedAct.triggered.connect(
-            self.__gitBisectStartExtended)
+            self.tr("Start (Extended)"),
+            self.tr("Start (Extended)"),
+            0,
+            0,
+            self,
+            "git_bisect_start_extended",
+        )
+        self.gitBisectStartExtendedAct.setStatusTip(
+            self.tr("Start a bisect session giving a bad and optionally good commits")
+        )
+        self.gitBisectStartExtendedAct.setWhatsThis(
+            self.tr(
+                """<b>Start (Extended)</b>"""
+                """<p>This starts a bisect session giving a bad and optionally"""
+                """ good commits.</p>"""
+            )
+        )
+        self.gitBisectStartExtendedAct.triggered.connect(self.__gitBisectStartExtended)
         self.actions.append(self.gitBisectStartExtendedAct)
-        
+
         self.gitBisectGoodAct = EricAction(
             self.tr('Mark as "good"'),
             self.tr('Mark as "good"...'),
-            0, 0, self, 'git_bisect_good')
-        self.gitBisectGoodAct.setStatusTip(self.tr(
-            'Mark a selectable revision as good'
-        ))
-        self.gitBisectGoodAct.setWhatsThis(self.tr(
-            """<b>Mark as "good"</b>"""
-            """<p>This marks a selectable revision as good.</p>"""
-        ))
+            0,
+            0,
+            self,
+            "git_bisect_good",
+        )
+        self.gitBisectGoodAct.setStatusTip(
+            self.tr("Mark a selectable revision as good")
+        )
+        self.gitBisectGoodAct.setWhatsThis(
+            self.tr(
+                """<b>Mark as "good"</b>"""
+                """<p>This marks a selectable revision as good.</p>"""
+            )
+        )
         self.gitBisectGoodAct.triggered.connect(self.__gitBisectGood)
         self.actions.append(self.gitBisectGoodAct)
-        
+
         self.gitBisectBadAct = EricAction(
             self.tr('Mark as "bad"'),
             self.tr('Mark as "bad"...'),
-            0, 0, self, 'git_bisect_bad')
-        self.gitBisectBadAct.setStatusTip(self.tr(
-            'Mark a selectable revision as bad'
-        ))
-        self.gitBisectBadAct.setWhatsThis(self.tr(
-            """<b>Mark as "bad"</b>"""
-            """<p>This marks a selectable revision as bad.</p>"""
-        ))
+            0,
+            0,
+            self,
+            "git_bisect_bad",
+        )
+        self.gitBisectBadAct.setStatusTip(self.tr("Mark a selectable revision as bad"))
+        self.gitBisectBadAct.setWhatsThis(
+            self.tr(
+                """<b>Mark as "bad"</b>"""
+                """<p>This marks a selectable revision as bad.</p>"""
+            )
+        )
         self.gitBisectBadAct.triggered.connect(self.__gitBisectBad)
         self.actions.append(self.gitBisectBadAct)
-        
+
         self.gitBisectSkipAct = EricAction(
-            self.tr('Skip'),
-            self.tr('Skip...'),
-            0, 0, self, 'git_bisect_skip')
-        self.gitBisectSkipAct.setStatusTip(self.tr(
-            'Skip a selectable revision'
-        ))
-        self.gitBisectSkipAct.setWhatsThis(self.tr(
-            """<b>Skip</b>"""
-            """<p>This skips a selectable revision.</p>"""
-        ))
+            self.tr("Skip"), self.tr("Skip..."), 0, 0, self, "git_bisect_skip"
+        )
+        self.gitBisectSkipAct.setStatusTip(self.tr("Skip a selectable revision"))
+        self.gitBisectSkipAct.setWhatsThis(
+            self.tr("""<b>Skip</b>""" """<p>This skips a selectable revision.</p>""")
+        )
         self.gitBisectSkipAct.triggered.connect(self.__gitBisectSkip)
         self.actions.append(self.gitBisectSkipAct)
-        
+
         self.gitBisectResetAct = EricAction(
-            self.tr('Reset'),
-            self.tr('Reset...'),
-            0, 0, self, 'git_bisect_reset')
-        self.gitBisectResetAct.setStatusTip(self.tr(
-            'Reset the bisect session'
-        ))
-        self.gitBisectResetAct.setWhatsThis(self.tr(
-            """<b>Reset</b>"""
-            """<p>This resets the bisect session.</p>"""
-        ))
+            self.tr("Reset"), self.tr("Reset..."), 0, 0, self, "git_bisect_reset"
+        )
+        self.gitBisectResetAct.setStatusTip(self.tr("Reset the bisect session"))
+        self.gitBisectResetAct.setWhatsThis(
+            self.tr("""<b>Reset</b>""" """<p>This resets the bisect session.</p>""")
+        )
         self.gitBisectResetAct.triggered.connect(self.__gitBisectReset)
         self.actions.append(self.gitBisectResetAct)
-        
+
         self.gitBisectLogBrowserAct = EricAction(
-            self.tr('Show bisect log browser'),
+            self.tr("Show bisect log browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show bisect log browser'),
-            0, 0, self, 'git_bisect_log_browser')
-        self.gitBisectLogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the bisect log of the local project'
-        ))
-        self.gitBisectLogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show bisect log browser</b>"""
-            """<p>This shows a dialog to browse the bisect log of the local"""
-            """ project.</p>"""
-        ))
-        self.gitBisectLogBrowserAct.triggered.connect(
-            self.__gitBisectLogBrowser)
+            self.tr("Show bisect log browser"),
+            0,
+            0,
+            self,
+            "git_bisect_log_browser",
+        )
+        self.gitBisectLogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the bisect log of the local project")
+        )
+        self.gitBisectLogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show bisect log browser</b>"""
+                """<p>This shows a dialog to browse the bisect log of the local"""
+                """ project.</p>"""
+            )
+        )
+        self.gitBisectLogBrowserAct.triggered.connect(self.__gitBisectLogBrowser)
         self.actions.append(self.gitBisectLogBrowserAct)
-        
+
         self.gitBisectCreateReplayAct = EricAction(
-            self.tr('Create replay file'),
-            self.tr('Create replay file'),
-            0, 0, self, 'git_bisect_create_replay')
-        self.gitBisectCreateReplayAct.setStatusTip(self.tr(
-            'Create a replay file to repeat the current bisect session'
-        ))
-        self.gitBisectCreateReplayAct.setWhatsThis(self.tr(
-            """<b>Create replay file</b>"""
-            """<p>This creates a replay file to repeat the current bisect"""
-            """ session.</p>"""
-        ))
-        self.gitBisectCreateReplayAct.triggered.connect(
-            self.__gitBisectCreateReplay)
+            self.tr("Create replay file"),
+            self.tr("Create replay file"),
+            0,
+            0,
+            self,
+            "git_bisect_create_replay",
+        )
+        self.gitBisectCreateReplayAct.setStatusTip(
+            self.tr("Create a replay file to repeat the current bisect session")
+        )
+        self.gitBisectCreateReplayAct.setWhatsThis(
+            self.tr(
+                """<b>Create replay file</b>"""
+                """<p>This creates a replay file to repeat the current bisect"""
+                """ session.</p>"""
+            )
+        )
+        self.gitBisectCreateReplayAct.triggered.connect(self.__gitBisectCreateReplay)
         self.actions.append(self.gitBisectCreateReplayAct)
-        
+
         self.gitBisectEditReplayAct = EricAction(
-            self.tr('Edit replay file'),
-            self.tr('Edit replay file'),
-            0, 0, self, 'git_bisect_edit_replay')
-        self.gitBisectEditReplayAct.setStatusTip(self.tr(
-            'Edit a bisect replay file'
-        ))
-        self.gitBisectEditReplayAct.setWhatsThis(self.tr(
-            """<b>Edit replay file</b>"""
-            """<p>This edits a bisect replay file.</p>"""
-        ))
-        self.gitBisectEditReplayAct.triggered.connect(
-            self.__gitBisectEditReplay)
+            self.tr("Edit replay file"),
+            self.tr("Edit replay file"),
+            0,
+            0,
+            self,
+            "git_bisect_edit_replay",
+        )
+        self.gitBisectEditReplayAct.setStatusTip(self.tr("Edit a bisect replay file"))
+        self.gitBisectEditReplayAct.setWhatsThis(
+            self.tr(
+                """<b>Edit replay file</b>"""
+                """<p>This edits a bisect replay file.</p>"""
+            )
+        )
+        self.gitBisectEditReplayAct.triggered.connect(self.__gitBisectEditReplay)
         self.actions.append(self.gitBisectEditReplayAct)
-        
+
         self.gitBisectReplayAct = EricAction(
-            self.tr('Replay session'),
-            self.tr('Replay session'),
-            0, 0, self, 'git_bisect_replay')
-        self.gitBisectReplayAct.setStatusTip(self.tr(
-            'Replay a bisect session from file'
-        ))
-        self.gitBisectReplayAct.setWhatsThis(self.tr(
-            """<b>Replay session</b>"""
-            """<p>This replays a bisect session from file.</p>"""
-        ))
+            self.tr("Replay session"),
+            self.tr("Replay session"),
+            0,
+            0,
+            self,
+            "git_bisect_replay",
+        )
+        self.gitBisectReplayAct.setStatusTip(
+            self.tr("Replay a bisect session from file")
+        )
+        self.gitBisectReplayAct.setWhatsThis(
+            self.tr(
+                """<b>Replay session</b>"""
+                """<p>This replays a bisect session from file.</p>"""
+            )
+        )
         self.gitBisectReplayAct.triggered.connect(self.__gitBisectReplay)
         self.actions.append(self.gitBisectReplayAct)
-        
+
         self.gitCheckPatchesAct = EricAction(
-            self.tr('Check patch files'),
-            self.tr('Check patch files'),
-            0, 0, self, 'git_check_patches')
-        self.gitCheckPatchesAct.setStatusTip(self.tr(
-            'Check a list of patch files, if they would apply cleanly'
-        ))
-        self.gitCheckPatchesAct.setWhatsThis(self.tr(
-            """<b>Check patch files</b>"""
-            """<p>This checks a list of patch files, if they would apply"""
-            """ cleanly.</p>"""
-        ))
+            self.tr("Check patch files"),
+            self.tr("Check patch files"),
+            0,
+            0,
+            self,
+            "git_check_patches",
+        )
+        self.gitCheckPatchesAct.setStatusTip(
+            self.tr("Check a list of patch files, if they would apply cleanly")
+        )
+        self.gitCheckPatchesAct.setWhatsThis(
+            self.tr(
+                """<b>Check patch files</b>"""
+                """<p>This checks a list of patch files, if they would apply"""
+                """ cleanly.</p>"""
+            )
+        )
         self.gitCheckPatchesAct.triggered.connect(self.__gitCheckPatches)
         self.actions.append(self.gitCheckPatchesAct)
-        
+
         self.gitApplyPatchesAct = EricAction(
-            self.tr('Apply patch files'),
-            self.tr('Apply patch files'),
-            0, 0, self, 'git_apply_patches')
-        self.gitApplyPatchesAct.setStatusTip(self.tr(
-            'Apply a list of patch files'
-        ))
-        self.gitApplyPatchesAct.setWhatsThis(self.tr(
-            """<b>Apply patch files</b>"""
-            """<p>This applies a list of patch files.</p>"""
-        ))
+            self.tr("Apply patch files"),
+            self.tr("Apply patch files"),
+            0,
+            0,
+            self,
+            "git_apply_patches",
+        )
+        self.gitApplyPatchesAct.setStatusTip(self.tr("Apply a list of patch files"))
+        self.gitApplyPatchesAct.setWhatsThis(
+            self.tr(
+                """<b>Apply patch files</b>"""
+                """<p>This applies a list of patch files.</p>"""
+            )
+        )
         self.gitApplyPatchesAct.triggered.connect(self.__gitApplyPatches)
         self.actions.append(self.gitApplyPatchesAct)
-        
+
         self.gitShowPatcheStatisticsAct = EricAction(
-            self.tr('Show patch statistics'),
-            self.tr('Show patch statistics'),
-            0, 0, self, 'git_show_patches_statistics')
-        self.gitShowPatcheStatisticsAct.setStatusTip(self.tr(
-            'Show some statistics for a list of patch files'
-        ))
-        self.gitShowPatcheStatisticsAct.setWhatsThis(self.tr(
-            """<b>Show patch statistics</b>"""
-            """<p>This shows some statistics for a list of patch files.</p>"""
-        ))
-        self.gitShowPatcheStatisticsAct.triggered.connect(
-            self.__gitShowPatchStatistics)
+            self.tr("Show patch statistics"),
+            self.tr("Show patch statistics"),
+            0,
+            0,
+            self,
+            "git_show_patches_statistics",
+        )
+        self.gitShowPatcheStatisticsAct.setStatusTip(
+            self.tr("Show some statistics for a list of patch files")
+        )
+        self.gitShowPatcheStatisticsAct.setWhatsThis(
+            self.tr(
+                """<b>Show patch statistics</b>"""
+                """<p>This shows some statistics for a list of patch files.</p>"""
+            )
+        )
+        self.gitShowPatcheStatisticsAct.triggered.connect(self.__gitShowPatchStatistics)
         self.actions.append(self.gitShowPatcheStatisticsAct)
-        
+
         self.gitSubmoduleAddAct = EricAction(
-            self.tr('Add'),
-            self.tr('Add'),
-            0, 0, self, 'git_submodule_add')
-        self.gitSubmoduleAddAct.setStatusTip(self.tr(
-            'Add a submodule to the current project'
-        ))
-        self.gitSubmoduleAddAct.setWhatsThis(self.tr(
-            """<b>Add</b>"""
-            """<p>This adds a submodule to the current project.</p>"""
-        ))
-        self.gitSubmoduleAddAct.triggered.connect(
-            self.__gitSubmoduleAdd)
+            self.tr("Add"), self.tr("Add"), 0, 0, self, "git_submodule_add"
+        )
+        self.gitSubmoduleAddAct.setStatusTip(
+            self.tr("Add a submodule to the current project")
+        )
+        self.gitSubmoduleAddAct.setWhatsThis(
+            self.tr(
+                """<b>Add</b>"""
+                """<p>This adds a submodule to the current project.</p>"""
+            )
+        )
+        self.gitSubmoduleAddAct.triggered.connect(self.__gitSubmoduleAdd)
         self.actions.append(self.gitSubmoduleAddAct)
-        
+
         self.gitSubmodulesListAct = EricAction(
-            self.tr('List'),
-            self.tr('List'),
-            0, 0, self, 'git_submodules_list')
-        self.gitSubmodulesListAct.setStatusTip(self.tr(
-            'List the submodule of the current project'
-        ))
-        self.gitSubmodulesListAct.setWhatsThis(self.tr(
-            """<b>List</b>"""
-            """<p>This lists the submodules of the current project.</p>"""
-        ))
-        self.gitSubmodulesListAct.triggered.connect(
-            self.__gitSubmodulesList)
+            self.tr("List"), self.tr("List"), 0, 0, self, "git_submodules_list"
+        )
+        self.gitSubmodulesListAct.setStatusTip(
+            self.tr("List the submodule of the current project")
+        )
+        self.gitSubmodulesListAct.setWhatsThis(
+            self.tr(
+                """<b>List</b>"""
+                """<p>This lists the submodules of the current project.</p>"""
+            )
+        )
+        self.gitSubmodulesListAct.triggered.connect(self.__gitSubmodulesList)
         self.actions.append(self.gitSubmodulesListAct)
-        
+
         self.gitSubmodulesInitAct = EricAction(
-            self.tr('Initialize'),
-            self.tr('Initialize'),
-            0, 0, self, 'git_submodules_init')
-        self.gitSubmodulesInitAct.setStatusTip(self.tr(
-            'Initialize the submodules of the current project'
-        ))
-        self.gitSubmodulesInitAct.setWhatsThis(self.tr(
-            """<b>Initialize</b>"""
-            """<p>This initializes the submodules of the current"""
-            """ project.</p>"""
-        ))
-        self.gitSubmodulesInitAct.triggered.connect(
-            self.__gitSubmodulesInit)
+            self.tr("Initialize"),
+            self.tr("Initialize"),
+            0,
+            0,
+            self,
+            "git_submodules_init",
+        )
+        self.gitSubmodulesInitAct.setStatusTip(
+            self.tr("Initialize the submodules of the current project")
+        )
+        self.gitSubmodulesInitAct.setWhatsThis(
+            self.tr(
+                """<b>Initialize</b>"""
+                """<p>This initializes the submodules of the current"""
+                """ project.</p>"""
+            )
+        )
+        self.gitSubmodulesInitAct.triggered.connect(self.__gitSubmodulesInit)
         self.actions.append(self.gitSubmodulesInitAct)
-        
+
         self.gitSubmodulesDeinitAct = EricAction(
-            self.tr('Unregister'),
-            self.tr('Unregister'),
-            0, 0, self, 'git_submodules_deinit')
-        self.gitSubmodulesDeinitAct.setStatusTip(self.tr(
-            'Unregister submodules of the current project'
-        ))
-        self.gitSubmodulesDeinitAct.setWhatsThis(self.tr(
-            """<b>Unregister</b>"""
-            """<p>This unregisters submodules of the current project.</p>"""
-        ))
-        self.gitSubmodulesDeinitAct.triggered.connect(
-            self.__gitSubmodulesDeinit)
+            self.tr("Unregister"),
+            self.tr("Unregister"),
+            0,
+            0,
+            self,
+            "git_submodules_deinit",
+        )
+        self.gitSubmodulesDeinitAct.setStatusTip(
+            self.tr("Unregister submodules of the current project")
+        )
+        self.gitSubmodulesDeinitAct.setWhatsThis(
+            self.tr(
+                """<b>Unregister</b>"""
+                """<p>This unregisters submodules of the current project.</p>"""
+            )
+        )
+        self.gitSubmodulesDeinitAct.triggered.connect(self.__gitSubmodulesDeinit)
         self.actions.append(self.gitSubmodulesDeinitAct)
-        
+
         self.gitSubmodulesUpdateAct = EricAction(
-            self.tr('Update'),
-            self.tr('Update'),
-            0, 0, self, 'git_submodules_update')
-        self.gitSubmodulesUpdateAct.setStatusTip(self.tr(
-            'Update submodules of the current project'
-        ))
-        self.gitSubmodulesUpdateAct.setWhatsThis(self.tr(
-            """<b>Update</b>"""
-            """<p>This updates submodules of the current project.</p>"""
-        ))
-        self.gitSubmodulesUpdateAct.triggered.connect(
-            self.__gitSubmodulesUpdate)
+            self.tr("Update"), self.tr("Update"), 0, 0, self, "git_submodules_update"
+        )
+        self.gitSubmodulesUpdateAct.setStatusTip(
+            self.tr("Update submodules of the current project")
+        )
+        self.gitSubmodulesUpdateAct.setWhatsThis(
+            self.tr(
+                """<b>Update</b>"""
+                """<p>This updates submodules of the current project.</p>"""
+            )
+        )
+        self.gitSubmodulesUpdateAct.triggered.connect(self.__gitSubmodulesUpdate)
         self.actions.append(self.gitSubmodulesUpdateAct)
-        
+
         self.gitSubmodulesUpdateInitAct = EricAction(
-            self.tr('Initialize and Update'),
-            self.tr('Initialize and Update'),
-            0, 0, self, 'git_submodules_update_init')
-        self.gitSubmodulesUpdateInitAct.setStatusTip(self.tr(
-            'Initialize and update submodules of the current project'
-        ))
-        self.gitSubmodulesUpdateInitAct.setWhatsThis(self.tr(
-            """<b>Initialize and Update</b>"""
-            """<p>This initializes and updates submodules of the current"""
-            """ project.</p>"""
-        ))
+            self.tr("Initialize and Update"),
+            self.tr("Initialize and Update"),
+            0,
+            0,
+            self,
+            "git_submodules_update_init",
+        )
+        self.gitSubmodulesUpdateInitAct.setStatusTip(
+            self.tr("Initialize and update submodules of the current project")
+        )
+        self.gitSubmodulesUpdateInitAct.setWhatsThis(
+            self.tr(
+                """<b>Initialize and Update</b>"""
+                """<p>This initializes and updates submodules of the current"""
+                """ project.</p>"""
+            )
+        )
         self.gitSubmodulesUpdateInitAct.triggered.connect(
-            self.__gitSubmodulesUpdateInit)
+            self.__gitSubmodulesUpdateInit
+        )
         self.actions.append(self.gitSubmodulesUpdateInitAct)
-        
+
         self.gitSubmodulesUpdateRemoteAct = EricAction(
-            self.tr('Fetch and Update'),
-            self.tr('Fetch and Update'),
-            0, 0, self, 'git_submodules_update_remote')
-        self.gitSubmodulesUpdateRemoteAct.setStatusTip(self.tr(
-            'Fetch and update submodules of the current project'
-        ))
-        self.gitSubmodulesUpdateRemoteAct.setWhatsThis(self.tr(
-            """<b>Fetch and Update</b>"""
-            """<p>This fetches and updates submodules of the current"""
-            """ project.</p>"""
-        ))
+            self.tr("Fetch and Update"),
+            self.tr("Fetch and Update"),
+            0,
+            0,
+            self,
+            "git_submodules_update_remote",
+        )
+        self.gitSubmodulesUpdateRemoteAct.setStatusTip(
+            self.tr("Fetch and update submodules of the current project")
+        )
+        self.gitSubmodulesUpdateRemoteAct.setWhatsThis(
+            self.tr(
+                """<b>Fetch and Update</b>"""
+                """<p>This fetches and updates submodules of the current"""
+                """ project.</p>"""
+            )
+        )
         self.gitSubmodulesUpdateRemoteAct.triggered.connect(
-            self.__gitSubmodulesUpdateRemote)
+            self.__gitSubmodulesUpdateRemote
+        )
         self.actions.append(self.gitSubmodulesUpdateRemoteAct)
-        
+
         self.gitSubmodulesUpdateOptionsAct = EricAction(
-            self.tr('Update with Options'),
-            self.tr('Update with Options'),
-            0, 0, self, 'git_submodules_update_options')
-        self.gitSubmodulesUpdateOptionsAct.setStatusTip(self.tr(
-            'Update submodules of the current project offering a dialog'
-            ' to enter options'
-        ))
-        self.gitSubmodulesUpdateOptionsAct.setWhatsThis(self.tr(
-            """<b>Update with Options</b>"""
-            """<p>This updates submodules of the current project"""
-            """ offering a dialog to enter update options.</p>"""
-        ))
+            self.tr("Update with Options"),
+            self.tr("Update with Options"),
+            0,
+            0,
+            self,
+            "git_submodules_update_options",
+        )
+        self.gitSubmodulesUpdateOptionsAct.setStatusTip(
+            self.tr(
+                "Update submodules of the current project offering a dialog"
+                " to enter options"
+            )
+        )
+        self.gitSubmodulesUpdateOptionsAct.setWhatsThis(
+            self.tr(
+                """<b>Update with Options</b>"""
+                """<p>This updates submodules of the current project"""
+                """ offering a dialog to enter update options.</p>"""
+            )
+        )
         self.gitSubmodulesUpdateOptionsAct.triggered.connect(
-            self.__gitSubmodulesUpdateOptions)
+            self.__gitSubmodulesUpdateOptions
+        )
         self.actions.append(self.gitSubmodulesUpdateOptionsAct)
-        
+
         self.gitSubmodulesSyncAct = EricAction(
-            self.tr('Synchronize URLs'),
-            self.tr('Synchronize URLs'),
-            0, 0, self, 'git_submodules_sync')
-        self.gitSubmodulesSyncAct.setStatusTip(self.tr(
-            'Synchronize URLs of submodules of the current project'
-        ))
-        self.gitSubmodulesSyncAct.setWhatsThis(self.tr(
-            """<b>Synchronize URLs</b>"""
-            """<p>This synchronizes URLs of submodules of the current"""
-            """ project.</p>"""
-        ))
-        self.gitSubmodulesSyncAct.triggered.connect(
-            self.__gitSubmodulesSync)
+            self.tr("Synchronize URLs"),
+            self.tr("Synchronize URLs"),
+            0,
+            0,
+            self,
+            "git_submodules_sync",
+        )
+        self.gitSubmodulesSyncAct.setStatusTip(
+            self.tr("Synchronize URLs of submodules of the current project")
+        )
+        self.gitSubmodulesSyncAct.setWhatsThis(
+            self.tr(
+                """<b>Synchronize URLs</b>"""
+                """<p>This synchronizes URLs of submodules of the current"""
+                """ project.</p>"""
+            )
+        )
+        self.gitSubmodulesSyncAct.triggered.connect(self.__gitSubmodulesSync)
         self.actions.append(self.gitSubmodulesSyncAct)
-        
+
         self.gitSubmodulesStatusAct = EricAction(
-            self.tr('Show Status'),
-            self.tr('Show Status'),
-            0, 0, self, 'git_submodules_status')
-        self.gitSubmodulesStatusAct.setStatusTip(self.tr(
-            'Show the status of submodules of the current project'
-        ))
-        self.gitSubmodulesStatusAct.setWhatsThis(self.tr(
-            """<b>Show Status</b>"""
-            """<p>This shows a dialog with the status of submodules of the"""
-            """ current project.</p>"""
-        ))
-        self.gitSubmodulesStatusAct.triggered.connect(
-            self.__gitSubmodulesStatus)
+            self.tr("Show Status"),
+            self.tr("Show Status"),
+            0,
+            0,
+            self,
+            "git_submodules_status",
+        )
+        self.gitSubmodulesStatusAct.setStatusTip(
+            self.tr("Show the status of submodules of the current project")
+        )
+        self.gitSubmodulesStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show Status</b>"""
+                """<p>This shows a dialog with the status of submodules of the"""
+                """ current project.</p>"""
+            )
+        )
+        self.gitSubmodulesStatusAct.triggered.connect(self.__gitSubmodulesStatus)
         self.actions.append(self.gitSubmodulesStatusAct)
-        
+
         self.gitSubmodulesSummaryAct = EricAction(
-            self.tr('Show Summary'),
-            self.tr('Show Summary'),
-            0, 0, self, 'git_submodules_summary')
-        self.gitSubmodulesSummaryAct.setStatusTip(self.tr(
-            'Show summary information for submodules of the current project'
-        ))
-        self.gitSubmodulesSummaryAct.setWhatsThis(self.tr(
-            """<b>Show Summary</b>"""
-            """<p>This shows some summary information for submodules of the"""
-            """ current project.</p>"""
-        ))
-        self.gitSubmodulesSummaryAct.triggered.connect(
-            self.__gitSubmodulesSummary)
+            self.tr("Show Summary"),
+            self.tr("Show Summary"),
+            0,
+            0,
+            self,
+            "git_submodules_summary",
+        )
+        self.gitSubmodulesSummaryAct.setStatusTip(
+            self.tr("Show summary information for submodules of the current project")
+        )
+        self.gitSubmodulesSummaryAct.setWhatsThis(
+            self.tr(
+                """<b>Show Summary</b>"""
+                """<p>This shows some summary information for submodules of the"""
+                """ current project.</p>"""
+            )
+        )
+        self.gitSubmodulesSummaryAct.triggered.connect(self.__gitSubmodulesSummary)
         self.actions.append(self.gitSubmodulesSummaryAct)
-    
+
     def initMenu(self, menu):
         """
         Public method to generate the VCS menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         self.subMenus = []
-        
+
         adminMenu = QMenu(self.tr("Administration"), menu)
         adminMenu.setTearOffEnabled(True)
         adminMenu.addAction(self.gitShowConfigAct)
@@ -1384,7 +1751,7 @@
         adminMenu.addAction(self.gitVerifyAct)
         adminMenu.addAction(self.gitHouseKeepingAct)
         self.subMenus.append(adminMenu)
-        
+
         bundleMenu = QMenu(self.tr("Bundle Management"), menu)
         bundleMenu.setTearOffEnabled(True)
         bundleMenu.addAction(self.gitBundleAct)
@@ -1395,7 +1762,7 @@
         bundleMenu.addAction(self.gitBundleApplyFetchAct)
         bundleMenu.addAction(self.gitBundleApplyPullAct)
         self.subMenus.append(bundleMenu)
-        
+
         patchMenu = QMenu(self.tr("Patch Management"), menu)
         patchMenu.setTearOffEnabled(True)
         patchMenu.addAction(self.gitCheckPatchesAct)
@@ -1403,7 +1770,7 @@
         patchMenu.addSeparator()
         patchMenu.addAction(self.gitShowPatcheStatisticsAct)
         self.subMenus.append(patchMenu)
-        
+
         bisectMenu = QMenu(self.tr("Bisect"), menu)
         bisectMenu.setTearOffEnabled(True)
         bisectMenu.addAction(self.gitBisectStartAct)
@@ -1421,7 +1788,7 @@
         bisectMenu.addAction(self.gitBisectEditReplayAct)
         bisectMenu.addAction(self.gitBisectReplayAct)
         self.subMenus.append(bisectMenu)
-        
+
         tagsMenu = QMenu(self.tr("Tags"), menu)
         tagsMenu.setIcon(UI.PixmapCache.getIcon("vcsTag"))
         tagsMenu.setTearOffEnabled(True)
@@ -1429,7 +1796,7 @@
         tagsMenu.addAction(self.gitTagListAct)
         tagsMenu.addAction(self.gitDescribeTagAct)
         self.subMenus.append(tagsMenu)
-        
+
         branchesMenu = QMenu(self.tr("Branches"), menu)
         branchesMenu.setIcon(UI.PixmapCache.getIcon("vcsBranch"))
         branchesMenu.setTearOffEnabled(True)
@@ -1442,7 +1809,7 @@
         branchesMenu.addSeparator()
         branchesMenu.addAction(self.gitDeleteRemoteBranchAct)
         self.subMenus.append(branchesMenu)
-        
+
         changesMenu = QMenu(self.tr("Manage Changes"), menu)
         changesMenu.setTearOffEnabled(True)
         changesMenu.addAction(self.gitUnstageAct)
@@ -1450,7 +1817,7 @@
         changesMenu.addAction(self.vcsMergeAct)
         changesMenu.addAction(self.gitCommitMergeAct)
         changesMenu.addAction(self.gitCancelMergeAct)
-        
+
         remotesMenu = QMenu(self.tr("Remote Repositories"), menu)
         remotesMenu.setTearOffEnabled(True)
         remotesMenu.addAction(self.gitRemotesShowAct)
@@ -1462,7 +1829,7 @@
         remotesMenu.addAction(self.gitRemoteCredentialsAct)
         remotesMenu.addAction(self.gitRemoteRemoveAct)
         remotesMenu.addAction(self.gitRemotePruneAct)
-        
+
         cherrypickMenu = QMenu(self.tr("Cherry-pick"), menu)
         cherrypickMenu.setIcon(UI.PixmapCache.getIcon("vcsGraft"))
         cherrypickMenu.setTearOffEnabled(True)
@@ -1470,7 +1837,7 @@
         cherrypickMenu.addAction(self.gitCherryPickContinueAct)
         cherrypickMenu.addAction(self.gitCherryPickQuitAct)
         cherrypickMenu.addAction(self.gitCherryPickAbortAct)
-        
+
         stashMenu = QMenu(self.tr("Stash"), menu)
         stashMenu.setTearOffEnabled(True)
         stashMenu.addAction(self.gitStashAct)
@@ -1485,7 +1852,7 @@
         stashMenu.addSeparator()
         stashMenu.addAction(self.gitStashDropAct)
         stashMenu.addAction(self.gitStashClearAct)
-        
+
         submodulesMenu = QMenu(self.tr("Submodules"), menu)
         submodulesMenu.setTearOffEnabled(True)
         submodulesMenu.addAction(self.gitSubmoduleAddAct)
@@ -1504,16 +1871,19 @@
         submodulesMenu.addSeparator()
         submodulesMenu.addAction(self.gitSubmodulesStatusAct)
         submodulesMenu.addAction(self.gitSubmodulesSummaryAct)
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")),
-            self.vcs.vcsName(), self._vcsInfoDisplay)
+                os.path.join("VcsPlugins", "vcsGit", "icons", "git.svg")
+            ),
+            self.vcs.vcsName(),
+            self._vcsInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         menu.addAction(self.gitFetchAct)
         menu.addAction(self.gitPullAct)
         menu.addSeparator()
@@ -1556,11 +1926,11 @@
         menu.addSeparator()
         menu.addAction(self.vcsNewAct)
         menu.addAction(self.vcsExportAct)
-    
+
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
@@ -1568,8 +1938,8 @@
         self.__toolbar = QToolBar(self.tr("Git"), ui)
         self.__toolbar.setIconSize(UI.Config.ToolBarIconSize)
         self.__toolbar.setObjectName("GitToolbar")
-        self.__toolbar.setToolTip(self.tr('Git'))
-        
+        self.__toolbar.setToolTip(self.tr("Git"))
+
         self.__toolbar.addAction(self.gitLogBrowserAct)
         self.__toolbar.addAction(self.vcsStatusAct)
         self.__toolbar.addSeparator()
@@ -1578,7 +1948,7 @@
         self.__toolbar.addAction(self.vcsNewAct)
         self.__toolbar.addAction(self.vcsExportAct)
         self.__toolbar.addSeparator()
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.addToolBar(self.__toolbar, title)
         toolbarManager.addAction(self.gitFetchAct, title)
@@ -1595,32 +1965,31 @@
         toolbarManager.addAction(self.vcsMergeAct, title)
         toolbarManager.addAction(self.gitCherryPickAct, title)
         toolbarManager.addAction(self.gitBisectLogBrowserAct, title)
-        
+
         self.__toolbar.setEnabled(False)
         self.__toolbar.setVisible(False)
-        
-        ui.registerToolbar("git", self.__toolbar.windowTitle(),
-                           self.__toolbar, "vcs")
+
+        ui.registerToolbar("git", self.__toolbar.windowTitle(), self.__toolbar, "vcs")
         ui.addToolBar(self.__toolbar)
-    
+
     def removeToolbar(self, ui, toolbarManager):
         """
         Public method to remove a toolbar created by initToolbar().
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         ui.removeToolBar(self.__toolbar)
         ui.unregisterToolbar("git")
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.removeCategoryActions(title)
         toolbarManager.removeToolBar(self.__toolbar)
-        
+
         self.__toolbar.deleteLater()
         self.__toolbar = None
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
@@ -1629,39 +1998,41 @@
         for menu in self.subMenus:
             if menu.isTearOffMenuVisible():
                 menu.hideTearOffMenu()
-    
+
     def __gitTagList(self):
         """
         Private slot used to list the tags of the project.
         """
         self.vcs.gitListTagBranch(self.project.getProjectPath(), True)
-    
+
     def __gitDescribeTag(self):
         """
         Private slot to show the most recent tag.
         """
         self.vcs.gitDescribe(self.project.getProjectPath(), [])
-    
+
     def __gitBranchList(self):
         """
         Private slot used to list the branches of the project.
         """
         self.vcs.gitListTagBranch(self.project.getProjectPath(), False)
-    
+
     def __gitMergedBranchList(self):
         """
         Private slot used to list the merged branches of the project.
         """
-        self.vcs.gitListTagBranch(self.project.getProjectPath(), False,
-                                  listAll=False, merged=True)
-    
+        self.vcs.gitListTagBranch(
+            self.project.getProjectPath(), False, listAll=False, merged=True
+        )
+
     def __gitNotMergedBranchList(self):
         """
         Private slot used to list the not merged branches of the project.
         """
-        self.vcs.gitListTagBranch(self.project.getProjectPath(), False,
-                                  listAll=False, merged=False)
-    
+        self.vcs.gitListTagBranch(
+            self.project.getProjectPath(), False, listAll=False, merged=False
+        )
+
     def __gitBranch(self):
         """
         Private slot used to perform branch operations for the project.
@@ -1669,43 +2040,44 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBranch(self.project.getProjectPath())[1] or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBranch(self.project.getProjectPath())[1]
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Branch"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitDeleteBranch(self):
         """
         Private slot used to delete a branch from a remote repository.
         """
         self.vcs.gitDeleteRemoteBranch(self.project.getProjectPath())
-    
+
     def __gitShowBranch(self):
         """
         Private slot used to show the current branch for the project.
         """
         self.vcs.gitShowBranch(self.project.getProjectPath())
-    
+
     def __gitExtendedDiff(self):
         """
         Private slot used to perform a git diff with the selection of
         revisions.
         """
         self.vcs.gitExtendedDiff(self.project.getProjectPath())
-    
+
     def __gitFetch(self):
         """
         Private slot used to fetch changes from a remote repository.
         """
         self.vcs.gitFetch(self.project.getProjectPath())
-    
+
     def __gitPull(self):
         """
         Private slot used to pull changes from a remote repository.
@@ -1713,24 +2085,25 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitPull(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitPull(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Pull"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitPush(self):
         """
         Private slot used to push changes to a remote repository.
         """
         self.vcs.gitPush(self.project.getProjectPath())
-    
+
     def __gitRevert(self):
         """
         Private slot used to revert changes made to the local project.
@@ -1738,18 +2111,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.vcsRevert(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.vcsRevert(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Revert Changes"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitUnstage(self):
         """
         Private slot used to unstage changes made to the local project.
@@ -1757,36 +2131,37 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitUnstage(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitUnstage(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Unstage Changes"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitCancelMerge(self):
         """
         Private slot used to cancel an uncommitted or failed merge.
         """
         self.vcs.gitCancelMerge(self.project.getProjectPath())
-    
+
     def __gitCommitMerge(self):
         """
         Private slot used to commit the ongoing merge.
         """
         self.vcs.gitCommitMerge(self.project.getProjectPath())
-    
+
     def __gitShowRemotes(self):
         """
         Private slot used to show the available remote repositories.
         """
         self.vcs.gitShowRemotes(self.project.getProjectPath())
-    
+
     def __gitShowRemote(self):
         """
         Private slot used to show information about a remote repository.
@@ -1797,16 +2172,18 @@
             self.tr("Show Remote Info"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             self.vcs.gitShowRemote(self.project.getProjectPath(), remote)
-    
+
     def __gitAddRemote(self):
         """
         Private slot to add a remote repository.
         """
         self.vcs.gitAddRemote(self.project.getProjectPath())
-    
+
     def __gitRemoveRemote(self):
         """
         Private slot to remove a remote repository.
@@ -1817,10 +2194,12 @@
             self.tr("Remove"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             self.vcs.gitRemoveRemote(self.project.getProjectPath(), remote)
-    
+
     def __gitPruneRemote(self):
         """
         Private slot to prune stale tracking branches of a remote repository.
@@ -1831,10 +2210,12 @@
             self.tr("Prune"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             self.vcs.gitPruneRemote(self.project.getProjectPath(), remote)
-    
+
     def __gitRenameRemote(self):
         """
         Private slot to rename a remote repository.
@@ -1845,10 +2226,12 @@
             self.tr("Rename"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             self.vcs.gitRenameRemote(self.project.getProjectPath(), remote)
-    
+
     def __gitChangeRemoteUrl(self):
         """
         Private slot to change the URL of a remote repository.
@@ -1859,10 +2242,12 @@
             self.tr("Rename"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
             self.vcs.gitChangeRemoteUrl(self.project.getProjectPath(), remote)
-    
+
     def __gitRemoteCredentials(self):
         """
         Private slot to change or set the user credentials for a remote
@@ -1874,11 +2259,12 @@
             self.tr("Rename"),
             self.tr("Select a remote repository:"),
             remotes,
-            0, False)
+            0,
+            False,
+        )
         if ok:
-            self.vcs.gitChangeRemoteCredentials(self.project.getProjectPath(),
-                                                remote)
-    
+            self.vcs.gitChangeRemoteCredentials(self.project.getProjectPath(), remote)
+
     def __gitCherryPick(self):
         """
         Private slot used to copy commits into the current branch.
@@ -1886,18 +2272,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitCherryPick(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitCherryPick(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Copy Commits"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitCherryPickContinue(self):
         """
         Private slot used to continue the last copying session after conflicts
@@ -1906,18 +2293,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitCherryPickContinue(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitCherryPickContinue(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Copy Commits (Continue)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitCherryPickQuit(self):
         """
         Private slot used to quit the current copying operation.
@@ -1925,18 +2313,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitCherryPickQuit(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitCherryPickQuit(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Copy Commits (Quit)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitCherryPickAbort(self):
         """
         Private slot used to cancel the last copying session and return to
@@ -1945,18 +2334,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitCherryPickAbort(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitCherryPickAbort(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Copy Commits (Cancel)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitStashSave(self):
         """
         Private slot to stash all current changes.
@@ -1964,30 +2354,31 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitStashSave(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitStashSave(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Save Stash"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitStashBrowser(self):
         """
         Private slot used to show the stash browser dialog.
         """
         self.vcs.gitStashBrowser(self.project.getProjectPath())
-    
+
     def __gitStashShow(self):
         """
         Private slot to show the contents of the selected stash.
         """
         self.vcs.gitStashShowPatch(self.project.getProjectPath())
-    
+
     def __gitStashApply(self):
         """
         Private slot to restore a stash and keep it.
@@ -1995,18 +2386,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitStashApply(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitStashApply(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Restore Stash"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitStashPop(self):
         """
         Private slot to restore a stash and delete it.
@@ -2014,18 +2406,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitStashPop(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitStashPop(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Restore Stash"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitStashBranch(self):
         """
         Private slot to create a new branch and restore a stash into it.
@@ -2033,116 +2426,116 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitStashBranch(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitStashBranch(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Create Branch"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitStashDrop(self):
         """
         Private slot to drop a stash.
         """
         self.vcs.gitStashDrop(self.project.getProjectPath())
-    
+
     def __gitStashClear(self):
         """
         Private slot to clear all stashes.
         """
         self.vcs.gitStashClear(self.project.getProjectPath())
-    
+
     def __gitConfigure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("zzz_gitPage")
-    
+
     def __gitEditUserConfig(self):
         """
         Private slot used to edit the user configuration file.
         """
         self.vcs.gitEditUserConfig()
-    
+
     def __gitEditRepoConfig(self):
         """
         Private slot used to edit the repository configuration file.
         """
         self.vcs.gitEditConfig(self.project.getProjectPath())
-    
+
     def __gitCreateIgnore(self):
         """
         Private slot used to create a .gitignore file for the project.
         """
-        self.vcs.gitCreateIgnoreFile(self.project.getProjectPath(),
-                                     autoAdd=True)
-    
+        self.vcs.gitCreateIgnoreFile(self.project.getProjectPath(), autoAdd=True)
+
     def __gitShowConfig(self):
         """
         Private slot used to show the combined configuration.
         """
         self.vcs.gitShowConfig(self.project.getProjectPath())
-    
+
     def __gitVerify(self):
         """
         Private slot used to verify the connectivity and validity of objects
         of the database.
         """
         self.vcs.gitVerify(self.project.getProjectPath())
-    
+
     def __gitHouseKeeping(self):
         """
         Private slot used to cleanup and optimize the local repository.
         """
         self.vcs.gitHouseKeeping(self.project.getProjectPath())
-    
+
     def __gitStatistics(self):
         """
         Private slot used to show some statistics of the local repository.
         """
         self.vcs.gitStatistics(self.project.getProjectPath())
-    
+
     def __gitCreateArchive(self):
         """
         Private slot used to create an archive from the local repository.
         """
         self.vcs.gitCreateArchive(self.project.getProjectPath())
-    
+
     def __gitReflogBrowser(self):
         """
         Private slot to show the reflog of the current project.
         """
         self.vcs.gitReflogBrowser(self.project.getProjectPath())
-    
+
     def __gitBundle(self):
         """
         Private slot used to create a bundle file.
         """
         self.vcs.gitBundle(self.project.getProjectPath())
-    
+
     def __gitVerifyBundle(self):
         """
         Private slot used to verify a bundle file.
         """
         self.vcs.gitVerifyBundle(self.project.getProjectPath())
-    
+
     def __gitBundleListHeads(self):
         """
         Private slot used to list the heads contained in a bundle file.
         """
         self.vcs.gitBundleListHeads(self.project.getProjectPath())
-    
+
     def __gitBundleFetch(self):
         """
         Private slot to apply a head of a bundle file using the fetch method.
         """
         self.vcs.gitBundleFetch(self.project.getProjectPath())
-    
+
     def __gitBundlePull(self):
         """
         Private slot to apply a head of a bundle file using the pull method.
@@ -2150,24 +2543,25 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBundlePull(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBundlePull(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Apply Bundle (pull)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectStart(self):
         """
         Private slot used to execute the bisect start command.
         """
         self.vcs.gitBisect(self.project.getProjectPath(), "start")
-    
+
     def __gitBisectStartExtended(self):
         """
         Private slot used to execute the bisect start command with options.
@@ -2175,19 +2569,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisect(self.project.getProjectPath(),
-                               "start_extended") or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisect(self.project.getProjectPath(), "start_extended")
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectGood(self):
         """
         Private slot used to execute the bisect good command.
@@ -2195,18 +2589,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisect(self.project.getProjectPath(), "good") or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisect(self.project.getProjectPath(), "good")
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectBad(self):
         """
         Private slot used to execute the bisect bad command.
@@ -2214,18 +2609,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisect(self.project.getProjectPath(), "bad") or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisect(self.project.getProjectPath(), "bad")
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectSkip(self):
         """
         Private slot used to execute the bisect skip command.
@@ -2233,18 +2629,19 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisect(self.project.getProjectPath(), "skip") or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisect(self.project.getProjectPath(), "skip")
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectReset(self):
         """
         Private slot used to execute the bisect reset command.
@@ -2252,37 +2649,38 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisect(self.project.getProjectPath(), "reset") or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisect(self.project.getProjectPath(), "reset")
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitBisectLogBrowser(self):
         """
         Private slot used to show the bisect log browser window.
         """
         self.vcs.gitBisectLogBrowser(self.project.getProjectPath())
-    
+
     def __gitBisectCreateReplay(self):
         """
         Private slot used to create a replay file for the current bisect
         session.
         """
         self.vcs.gitBisectCreateReplayFile(self.project.getProjectPath())
-    
+
     def __gitBisectEditReplay(self):
         """
         Private slot used to edit a bisect replay file.
         """
         self.vcs.gitBisectEditReplayFile(self.project.getProjectPath())
-    
+
     def __gitBisectReplay(self):
         """
         Private slot used to replay a bisect session.
@@ -2290,26 +2688,26 @@
         pfile = pathlib.Path(self.project.getProjectFile())
         lastModified = pfile.stat().st_mtime
         shouldReopen = (
-            self.vcs.gitBisectReplay(self.project.getProjectPath()) or
-            pfile.stat().st_mtime != lastModified
+            self.vcs.gitBisectReplay(self.project.getProjectPath())
+            or pfile.stat().st_mtime != lastModified
         )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 self.tr("Bisect"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitCheckPatches(self):
         """
         Private slot to check a list of patch files, if they would apply
         cleanly.
         """
-        self.vcs.gitApplyCheckPatches(self.project.getProjectPath(),
-                                      check=True)
-    
+        self.vcs.gitApplyCheckPatches(self.project.getProjectPath(), check=True)
+
     def __gitApplyPatches(self):
         """
         Private slot to apply a list of patch files.
@@ -2322,78 +2720,77 @@
                 self.parent(),
                 self.tr("Apply patch files"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __gitShowPatchStatistics(self):
         """
         Private slot to show some patch statistics.
         """
         self.vcs.gitShowPatchesStatistics(self.project.getProjectPath())
-    
+
     def __gitSubmoduleAdd(self):
         """
         Private slot to add a submodule to the current project.
         """
         self.vcs.gitSubmoduleAdd(self.project.getProjectPath())
-    
+
     def __gitSubmodulesList(self):
         """
         Private slot to list the submodules defined for the current project.
         """
         self.vcs.gitSubmoduleList(self.project.getProjectPath())
-    
+
     def __gitSubmodulesInit(self):
         """
         Private slot to initialize submodules of the project.
         """
         self.vcs.gitSubmoduleInit(self.project.getProjectPath())
-    
+
     def __gitSubmodulesDeinit(self):
         """
         Private slot to unregister submodules of the project.
         """
         self.vcs.gitSubmoduleDeinit(self.project.getProjectPath())
-    
+
     def __gitSubmodulesUpdate(self):
         """
         Private slot to update submodules of the project.
         """
         self.vcs.gitSubmoduleUpdate(self.project.getProjectPath())
-    
+
     def __gitSubmodulesUpdateInit(self):
         """
         Private slot to initialize and update submodules of the project.
         """
-        self.vcs.gitSubmoduleUpdate(self.project.getProjectPath(),
-                                    initialize=True)
-    
+        self.vcs.gitSubmoduleUpdate(self.project.getProjectPath(), initialize=True)
+
     def __gitSubmodulesUpdateRemote(self):
         """
         Private slot to fetch and update submodules of the project.
         """
-        self.vcs.gitSubmoduleUpdate(self.project.getProjectPath(),
-                                    remote=True)
-    
+        self.vcs.gitSubmoduleUpdate(self.project.getProjectPath(), remote=True)
+
     def __gitSubmodulesUpdateOptions(self):
         """
         Private slot to update submodules of the project with options.
         """
         self.vcs.gitSubmoduleUpdateWithOptions(self.project.getProjectPath())
-    
+
     def __gitSubmodulesSync(self):
         """
         Private slot to synchronize URLs of submodules of the project.
         """
         self.vcs.gitSubmoduleSync(self.project.getProjectPath())
-    
+
     def __gitSubmodulesStatus(self):
         """
         Private slot to show the status of submodules of the project.
         """
         self.vcs.gitSubmoduleStatus(self.project.getProjectPath())
-    
+
     def __gitSubmodulesSummary(self):
         """
         Private slot to show summary information for submodules of the project.
--- a/src/eric7/Plugins/VcsPlugins/vcsGit/git.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsGit/git.py	Wed Jul 13 14:55:47 2022 +0200
@@ -34,51 +34,52 @@
 class Git(VersionControl):
     """
     Class implementing the version control systems interface to Git.
-    
+
     @signal committed() emitted after the commit action has completed
     """
+
     committed = pyqtSignal()
-    
+
     IgnoreFileName = ".gitignore"
-    
+
     def __init__(self, plugin, parent=None, name=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VersionControl.__init__(self, parent, name)
         self.defaultOptions = {
-            'global': [''],
-            'commit': [''],
-            'checkout': [''],
-            'update': [''],
-            'add': [''],
-            'remove': [''],
-            'diff': [''],
-            'log': [''],
-            'history': [''],
-            'status': [''],
-            'tag': [''],
-            'export': ['']
+            "global": [""],
+            "commit": [""],
+            "checkout": [""],
+            "update": [""],
+            "add": [""],
+            "remove": [""],
+            "diff": [""],
+            "log": [""],
+            "history": [""],
+            "status": [""],
+            "tag": [""],
+            "export": [""],
         }
-        
+
         self.__plugin = plugin
         self.__ui = parent
-        
+
         self.options = self.defaultOptions
-        
+
         self.tagTypeList = [
-            'tags',
-            'branches',
+            "tags",
+            "branches",
         ]
-        
+
         self.commandHistory = []
-        
-        self.adminDir = '.git'
-        
+
+        self.adminDir = ".git"
+
         self.log = None
         self.logBrowser = None
         self.reflogBrowser = None
@@ -96,27 +97,27 @@
         self.bisectReplayEditor = None
         self.patchStatisticsDialog = None
         self.submoduleStatusDialog = None
-        
+
         self.__lastBundlePath = None
         self.__lastReplayPath = None
-        
+
         self.statusCache = {}
-        
+
         self.__commitData = {}
         self.__commitDialog = None
-        
+
         self.__patchCheckData = None
-        
+
         self.__projectHelper = None
-    
+
     def getPlugin(self):
         """
         Public method to get a reference to the plugin object.
-        
+
         @return reference to the plugin object (VcsGitPlugin)
         """
         return self.__plugin
-    
+
     def vcsShutdown(self):
         """
         Public method used to shutdown the Git interface.
@@ -155,44 +156,44 @@
             self.patchStatisticsDialog.close()
         if self.submoduleStatusDialog is not None:
             self.submoduleStatusDialog.close()
-        
+
         # shut down the project helpers
         if self.__projectHelper is not None:
             self.__projectHelper.shutdown()
-    
+
     def initCommand(self, command):
         """
         Public method to initialize a command arguments list.
-        
+
         @param command command name (string)
         @return list of command options (list of string)
         """
         args = [command]
         return args
-    
+
     def vcsExists(self):
         """
         Public method used to test for the presence of the git executable.
-        
+
         @return flag indicating the existance (boolean) and an error message
             (string)
         """
-        self.versionStr = ''
+        self.versionStr = ""
         errMsg = ""
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         args = self.initCommand("version")
         process = QProcess()
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             ioEncoding, 'replace')
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                 versionLine = output.splitlines()[0]
-                v = list(re.match(r'.*?(\d+)\.(\d+)\.?(\d+)?\.?(\d+)?',
-                                  versionLine).groups())
+                v = list(
+                    re.match(r".*?(\d+)\.(\d+)\.?(\d+)?\.?(\d+)?", versionLine).groups()
+                )
                 for i in range(4):
                     try:
                         v[i] = int(v[i])
@@ -201,7 +202,7 @@
                     except IndexError:
                         v.append(0)
                 self.version = tuple(v)
-                self.versionStr = '.'.join([str(v) for v in self.version])
+                self.versionStr = ".".join([str(v) for v in self.version])
                 return True, errMsg
             else:
                 if finished:
@@ -209,32 +210,31 @@
                         "The git process finished with the exit code {0}"
                     ).format(process.exitCode())
                 else:
-                    errMsg = self.tr(
-                        "The git process did not finish within 30s.")
+                    errMsg = self.tr("The git process did not finish within 30s.")
         else:
             errMsg = self.tr("Could not start the git executable.")
-        
+
         return False, errMsg
-    
+
     def vcsInit(self, vcsDir, noDialog=False):
         """
         Public method used to initialize the Git repository.
-        
+
         The initialization is done, when a project is converted into a
         Git controlled project. Therefore we always return TRUE without
         doing anything.
-        
+
         @param vcsDir name of the VCS directory (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return always TRUE
         """
         return True
-    
+
     def vcsConvertProject(self, vcsDataDict, project, addAll=True):
         """
         Public method to convert an uncontrolled project to a version
         controlled project.
-        
+
         @param vcsDataDict dictionary of data required for the conversion
         @type dict
         @param project reference to the project object
@@ -247,19 +247,19 @@
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Create project repository"),
-                self.tr(
-                    """The project repository could not be created."""))
+                self.tr("""The project repository could not be created."""),
+            )
         else:
             pfn = project.pfile
             if not os.path.isfile(pfn):
                 pfn += "z"
             project.closeProject()
             project.openProject(pfn)
-    
+
     def vcsImport(self, vcsDataDict, projectDir, noDialog=False, addAll=True):
         """
         Public method used to import the project into the Git repository.
-        
+
         @param vcsDataDict dictionary of data required for the import
         @type dict
         @param projectDir project directory (string)
@@ -274,51 +274,47 @@
         """
         msg = vcsDataDict["message"]
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         args = self.initCommand("init")
         args.append(projectDir)
-        dia = GitDialog(self.tr('Creating Git repository'), self)
+        dia = GitDialog(self.tr("Creating Git repository"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
         status = dia.normalExit()
-        
+
         if status:
             ignoreName = os.path.join(projectDir, Git.IgnoreFileName)
             if not os.path.exists(ignoreName):
                 status = self.gitCreateIgnoreFile(projectDir)
-            
+
             if status and addAll:
                 args = self.initCommand("add")
                 args.append("-v")
                 args.append(".")
-                dia = GitDialog(
-                    self.tr('Adding files to Git repository'),
-                    self)
+                dia = GitDialog(self.tr("Adding files to Git repository"), self)
                 res = dia.startProcess(args, projectDir)
                 if res:
                     dia.exec()
                 status = dia.normalExit()
-                
+
                 if status:
                     args = self.initCommand("commit")
-                    args.append('--message={0}'.format(msg))
-                    dia = GitDialog(
-                        self.tr('Initial commit to Git repository'),
-                        self)
+                    args.append("--message={0}".format(msg))
+                    dia = GitDialog(self.tr("Initial commit to Git repository"), self)
                     res = dia.startProcess(args, projectDir)
                     if res:
                         dia.exec()
                     status = dia.normalExit()
-        
+
         return status, False
-    
+
     def vcsCheckout(self, vcsDataDict, projectDir, noDialog=False):
         """
         Public method used to check the project out of a Git repository
         (clone).
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @param noDialog flag indicating quiet operations
@@ -326,26 +322,24 @@
         """
         noDialog = False
         vcsUrl = self.gitNormalizeURL(vcsDataDict["url"])
-        
+
         args = self.initCommand("clone")
         args.append(vcsUrl)
         args.append(projectDir)
-        
+
         if noDialog:
-            return self.startSynchronizedProcess(QProcess(), 'git', args)
+            return self.startSynchronizedProcess(QProcess(), "git", args)
         else:
-            dia = GitDialog(
-                self.tr('Cloning project from a Git repository'),
-                self)
+            dia = GitDialog(self.tr("Cloning project from a Git repository"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
             return dia.normalExit()
-    
+
     def vcsExport(self, vcsDataDict, projectDir):
         """
         Public method used to export a directory from the Git repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @return flag indicating an execution without errors (boolean)
@@ -355,13 +349,12 @@
         if os.path.exists(os.path.join(projectDir, Git.IgnoreFileName)):
             os.remove(os.path.join(projectDir, Git.IgnoreFileName))
         return status
-    
-    def vcsCommit(self, name, message="", noDialog=False, commitAll=True,
-                  amend=False):
+
+    def vcsCommit(self, name, message="", noDialog=False, commitAll=True, amend=False):
         """
         Public method used to make the change of a file/directory permanent
         in the Git repository.
-        
+
         @param name file/directory name to be committed (string or list of
             strings)
         @param message message for this operation (string)
@@ -373,21 +366,23 @@
             # call CommitDialog and get message from there
             if self.__commitDialog is None:
                 from .GitCommitDialog import GitCommitDialog
-                self.__commitDialog = GitCommitDialog(self, message, amend,
-                                                      commitAll, self.__ui)
+
+                self.__commitDialog = GitCommitDialog(
+                    self, message, amend, commitAll, self.__ui
+                )
                 self.__commitDialog.accepted.connect(self.__vcsCommit_Step2)
             self.__commitDialog.show()
             self.__commitDialog.raise_()
             self.__commitDialog.activateWindow()
-        
+
         self.__commitData["name"] = name
         self.__commitData["msg"] = message
         self.__commitData["noDialog"] = noDialog
         self.__commitData["all"] = commitAll
-        
+
         if noDialog:
             self.__vcsCommit_Step2()
-    
+
     def __vcsCommit_Step2(self):
         """
         Private slot performing the second step of the commit action.
@@ -396,7 +391,7 @@
         msg = self.__commitData["msg"]
         noDialog = self.__commitData["noDialog"]
         commitAll = self.__commitData["all"]
-        
+
         if not noDialog:
             # check, if there are unsaved changes, that should be committed
             if isinstance(name, list):
@@ -410,31 +405,30 @@
                     project = ericApp().getObject("Project")
                     if nam == project.getProjectPath():
                         ok &= (
-                            project.checkAllScriptsDirty(
-                                reportSyntaxErrors=True) and
-                            project.checkDirty()
+                            project.checkAllScriptsDirty(reportSyntaxErrors=True)
+                            and project.checkDirty()
                         )
                         continue
                 elif os.path.isfile(nam):
-                    editor = (
-                        ericApp().getObject("ViewManager").getOpenEditor(nam)
-                    )
+                    editor = ericApp().getObject("ViewManager").getOpenEditor(nam)
                     if editor:
                         ok &= editor.checkDirty()
                 if not ok:
                     break
-            
+
             if not ok:
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Commit Changes"),
                     self.tr(
                         """The commit affects files, that have unsaved"""
-                        """ changes. Shall the commit be continued?"""),
-                    icon=EricMessageBox.Warning)
+                        """ changes. Shall the commit be continued?"""
+                    ),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-        
+
         if self.__commitDialog is not None:
             msg = self.__commitDialog.logMessage()
             amend = self.__commitDialog.amend()
@@ -445,10 +439,10 @@
         else:
             amend = False
             resetAuthor = False
-        
+
         if not msg and not amend:
-            msg = '***'
-        
+            msg = "***"
+
         args = self.initCommand("commit")
         if amend:
             args.append("--amend")
@@ -457,19 +451,19 @@
         if msg:
             args.append("--message")
             args.append(msg)
-        
+
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
         else:
             dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         if isinstance(name, list):
             args.append("--")
             self.addArguments(args, fnames)
@@ -480,23 +474,21 @@
             else:
                 if commitAll:
                     args.append("--all")
-        
+
         if noDialog:
             self.startSynchronizedProcess(QProcess(), "git", args, dname)
         else:
-            dia = GitDialog(
-                self.tr('Committing changes to Git repository'),
-                self)
+            dia = GitDialog(self.tr("Committing changes to Git repository"), self)
             res = dia.startProcess(args, dname)
             if res:
                 dia.exec()
         self.committed.emit()
         self.checkVCSStatus()
-    
+
     def vcsCommitMessages(self):
         """
         Public method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         """
@@ -504,14 +496,14 @@
         messages = self._vcsProjectCommitMessages()
         if not messages:
             # empty list returned, try the vcs specific one
-            messages = self.getPlugin().getPreferences('Commits')
-        
+            messages = self.getPlugin().getPreferences("Commits")
+
         return messages
-    
+
     def vcsAddCommitMessage(self, message):
         """
         Public method to add a commit message to the list of saved messages.
-        
+
         @param message message to be added
         @type str
         """
@@ -522,20 +514,20 @@
             commitMessages.insert(0, message)
             no = Preferences.getVCS("CommitMessages")
             del commitMessages[no:]
-            self.getPlugin().setPreferences('Commits', commitMessages)
-    
+            self.getPlugin().setPreferences("Commits", commitMessages)
+
     def vcsClearCommitMessages(self):
         """
         Public method to clear the list of saved messages.
         """
         if not self._vcsClearProjectCommitMessages():
-            self.getPlugin().setPreferences('Commits', [])
-    
+            self.getPlugin().setPreferences("Commits", [])
+
     def vcsUpdate(self, name, noDialog=False, revision=None):
         """
         Public method used to update a file/directory with the Git
         repository.
-        
+
         @param name file/directory name to be updated (string or list of
             strings)
         @param noDialog flag indicating quiet operations (boolean)
@@ -548,13 +540,15 @@
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Switch"),
-                self.tr("""<p>Do you really want to switch to <b>{0}</b>?"""
-                        """</p>""").format(revision),
-                yesDefault=True)
+                self.tr(
+                    """<p>Do you really want to switch to <b>{0}</b>?""" """</p>"""
+                ).format(revision),
+                yesDefault=True,
+            )
             if not res:
                 return False
             args.append(revision)
-        
+
         if isinstance(name, list):
             args.append("--")
             dname, fnames = self.splitPathList(name)
@@ -564,39 +558,37 @@
             if fname != ".":
                 args.append("--")
                 args.append(fname)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         if noDialog:
-            self.startSynchronizedProcess(QProcess(), 'git', args, repodir)
+            self.startSynchronizedProcess(QProcess(), "git", args, repodir)
             res = False
         else:
-            dia = GitDialog(self.tr(
-                'Synchronizing with the Git repository'),
-                self)
+            dia = GitDialog(self.tr("Synchronizing with the Git repository"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def vcsAdd(self, name, isDir=False, noDialog=False):
         """
         Public method used to add a file/directory to the Git repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @param noDialog flag indicating quiet operations
         """
         args = self.initCommand("add")
         args.append("-v")
-        
+
         if isinstance(name, list):
             if isDir:
                 dname, fname = os.path.split(name[0])
@@ -607,57 +599,56 @@
                 dname, fname = os.path.split(name)
             else:
                 dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         if noDialog:
-            self.startSynchronizedProcess(QProcess(), 'git', args, repodir)
+            self.startSynchronizedProcess(QProcess(), "git", args, repodir)
         else:
             dia = GitDialog(
-                self.tr(
-                    'Adding files/directories to the Git repository'),
-                self)
+                self.tr("Adding files/directories to the Git repository"), self
+            )
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def vcsAddBinary(self, name, isDir=False):
         """
         Public method used to add a file/directory in binary mode to the
         Git repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         """
         self.vcsAdd(name, isDir)
-    
+
     def vcsAddTree(self, path):
         """
         Public method to add a directory tree rooted at path to the Git
         repository.
-        
+
         @param path root directory of the tree to be added (string or list of
             strings))
         """
         self.vcsAdd(path, isDir=False)
-    
+
     def vcsRemove(self, name, project=False, noDialog=False, stageOnly=False):
         """
         Public method used to remove a file/directory from the Git
         repository.
-        
+
         The default operation is to remove the local copy as well.
-        
+
         @param name file/directory name to be removed (string or list of
             strings))
         @param project flag indicating deletion of a project tree (boolean)
@@ -668,11 +659,11 @@
         @return flag indicating successful operation (boolean)
         """
         args = self.initCommand("rm")
-        if noDialog and '--force' not in args:
-            args.append('--force')
+        if noDialog and "--force" not in args:
+            args.append("--force")
         if stageOnly:
-            args.append('--cached')
-        
+            args.append("--cached")
+
         if isinstance(name, list):
             if os.path.isdir(name[0]):
                 args.append("-r")
@@ -685,45 +676,42 @@
             dname, fname = self.splitPath(name)
             args.append("--")
             args.append(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         if noDialog:
-            res = self.startSynchronizedProcess(
-                QProcess(), 'git', args, repodir)
+            res = self.startSynchronizedProcess(QProcess(), "git", args, repodir)
         else:
             dia = GitDialog(
-                self.tr(
-                    'Removing files/directories from the Git'
-                    ' repository'),
-                self)
+                self.tr("Removing files/directories from the Git" " repository"), self
+            )
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
                 res = dia.normalExitWithoutErrors()
-        
+
         return res
-    
+
     def vcsForget(self, name):
         """
         Public method used to remove a file from the Mercurial repository.
-        
+
         This will not remove the file from the project directory.
-        
+
         @param name file/directory name to be removed
         @type str or list of str
         """
         self.vcsRemove(name, stageOnly=True)
-    
+
     def vcsMove(self, name, project, target=None, noDialog=False):
         """
         Public method used to move a file/directory.
-        
+
         @param name file/directory name to be moved (string)
         @param project reference to the project object
         @param target new name of the file/directory (string)
@@ -731,7 +719,7 @@
         @return flag indicating successful operation (boolean)
         """
         isDir = os.path.isdir(name)
-        
+
         res = False
         if noDialog:
             if target is None:
@@ -740,19 +728,20 @@
             accepted = True
         else:
             from .GitCopyDialog import GitCopyDialog
+
             dlg = GitCopyDialog(name, None, True)
             accepted = dlg.exec() == QDialog.DialogCode.Accepted
             if accepted:
                 target, force = dlg.getData()
-        
+
         if accepted:
             args = self.initCommand("mv")
             args.append("-v")
             if force:
-                args.append('--force')
+                args.append("--force")
             args.append(name)
             args.append(target)
-            
+
             dname, fname = self.splitPath(name)
             # find the root of the repo
             repodir = dname
@@ -760,12 +749,11 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return False
-            
+
             if noDialog:
-                res = self.startSynchronizedProcess(
-                    QProcess(), 'git', args, repodir)
+                res = self.startSynchronizedProcess(QProcess(), "git", args, repodir)
             else:
-                dia = GitDialog(self.tr('Renaming {0}').format(name), self)
+                dia = GitDialog(self.tr("Renaming {0}").format(name), self)
                 res = dia.startProcess(args, repodir)
                 if res:
                     dia.exec()
@@ -782,46 +770,48 @@
                     else:
                         project.removeFile(name)
         return res
-    
+
     def vcsLogBrowser(self, name, isFile=False):
         """
         Public method used to browse the log of a file/directory from the
         Git repository.
-        
+
         @param name file/directory name to show the log of (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         """
         if self.logBrowser is None:
             from .GitLogBrowserDialog import GitLogBrowserDialog
+
             self.logBrowser = GitLogBrowserDialog(self)
         self.logBrowser.show()
         self.logBrowser.raise_()
         self.logBrowser.start(name, isFile=isFile)
-    
+
     def gitReflogBrowser(self, projectDir):
         """
         Public method used to browse the reflog of the project.
-        
+
         @param projectDir name of the project directory (string)
         """
         if self.reflogBrowser is None:
             from .GitReflogBrowserDialog import GitReflogBrowserDialog
+
             self.reflogBrowser = GitReflogBrowserDialog(self)
         self.reflogBrowser.show()
         self.reflogBrowser.raise_()
         self.reflogBrowser.start(projectDir)
-    
+
     def vcsDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Git repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -836,31 +826,33 @@
                     return
         if self.diff is None:
             from .GitDiffDialog import GitDiffDialog
+
             self.diff = GitDiffDialog(self)
         self.diff.show()
         self.diff.raise_()
         QApplication.processEvents()
         self.diff.start(name, diffMode="work2stage2repo", refreshable=True)
-    
+
     def vcsStatus(self, name):
         """
         Public method used to view the status of files/directories in the
         Git repository.
-        
+
         @param name file/directory name(s) to show the status of
             (string or list of strings)
         """
         if self.status is None:
             from .GitStatusDialog import GitStatusDialog
+
             self.status = GitStatusDialog(self)
         self.status.show()
         self.status.raise_()
         self.status.start(name)
-    
+
     def gitUnstage(self, name):
         """
         Public method used to unstage a file/directory.
-        
+
         @param name file/directory name to be reverted (string)
         @return flag indicating, that the update contained an add
             or delete (boolean)
@@ -869,14 +861,14 @@
             dname, fnames = self.splitPathList(name)
         else:
             dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         args = self.initCommand("reset")
         args.append("HEAD")
         args.append("--")
@@ -884,22 +876,20 @@
             self.addArguments(args, name)
         else:
             args.append(name)
-        
-        dia = GitDialog(
-            self.tr('Unstage files/directories'),
-            self)
+
+        dia = GitDialog(self.tr("Unstage files/directories"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
-        
+
         return res
-    
+
     def vcsRevert(self, name):
         """
         Public method used to revert changes made to a file/directory.
-        
+
         @param name file/directory name to be reverted
         @type str
         @return flag indicating, that the update contained an add
@@ -916,36 +906,40 @@
             dname, fname = self.splitPath(name)
             args.append(name)
             names = [name]
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         project = ericApp().getObject("Project")
         names = [project.getRelativePath(nam) for nam in names]
         if names[0]:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Revert changes"),
                 self.tr(
                     "Do you really want to revert all changes to these files"
-                    " or directories?"),
-                names)
+                    " or directories?"
+                ),
+                names,
+            )
             yes = dlg.exec() == QDialog.DialogCode.Accepted
         else:
             yes = EricMessageBox.yesNo(
                 None,
                 self.tr("Revert changes"),
-                self.tr("""Do you really want to revert all changes of"""
-                        """ the project?"""))
+                self.tr(
+                    """Do you really want to revert all changes of"""
+                    """ the project?"""
+                ),
+            )
         if yes:
-            dia = GitDialog(self.tr('Reverting changes'), self)
+            dia = GitDialog(self.tr("Reverting changes"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
@@ -953,33 +947,34 @@
             self.checkVCSStatus()
         else:
             res = False
-        
+
         return res
-    
+
     def vcsMerge(self, name):
         """
         Public method used to merge a URL/revision into the local project.
-        
+
         @param name file/directory name to be merged (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitMergeDialog import GitMergeDialog
-        dlg = GitMergeDialog(self.gitGetTagsList(repodir),
-                             self.gitGetBranchesList(repodir, withMaster=True),
-                             self.gitGetCurrentBranch(repodir),
-                             self.gitGetBranchesList(repodir, remotes=True))
+
+        dlg = GitMergeDialog(
+            self.gitGetTagsList(repodir),
+            self.gitGetBranchesList(repodir, withMaster=True),
+            self.gitGetCurrentBranch(repodir),
+            self.gitGetBranchesList(repodir, remotes=True),
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            commit, doCommit, commitMessage, addLog, diffStat = (
-                dlg.getParameters()
-            )
+            commit, doCommit, commitMessage, addLog, diffStat = dlg.getParameters()
             args = self.initCommand("merge")
             if doCommit:
                 args.append("--commit")
@@ -997,48 +992,49 @@
                 args.append("--no-stat")
             if commit:
                 args.append(commit)
-            
-            dia = GitDialog(self.tr('Merging').format(name), self)
+
+            dia = GitDialog(self.tr("Merging").format(name), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
             self.checkVCSStatus()
-    
+
     def vcsSwitch(self, name):
         """
         Public method used to switch a working directory to a different
         revision.
-        
+
         @param name directory name to be switched (string)
         @return flag indicating, that the switch contained an add
             or delete (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         from .GitRevisionSelectionDialog import GitRevisionSelectionDialog
+
         dlg = GitRevisionSelectionDialog(
             self.gitGetTagsList(repodir),
             self.gitGetBranchesList(repodir),
-            trackingBranchesList=self.gitGetBranchesList(
-                repodir, remotes=True),
-            noneLabel=self.tr("Master branch head"))
+            trackingBranchesList=self.gitGetBranchesList(repodir, remotes=True),
+            noneLabel=self.tr("Master branch head"),
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             rev = dlg.getRevision()
             return self.vcsUpdate(name, revision=rev)
-        
+
         return False
 
     def vcsRegisteredState(self, name):
         """
         Public method used to get the registered state of a file in the vcs.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
@@ -1046,36 +1042,35 @@
             name = name[:-1]
         name = os.path.normcase(name)
         dname, fname = self.splitPath(name)
-        
-        if fname == '.' and os.path.isdir(os.path.join(dname, self.adminDir)):
+
+        if fname == "." and os.path.isdir(os.path.join(dname, self.adminDir)):
             return self.canBeCommitted
-        
+
         if name in self.statusCache:
             return self.statusCache[name]
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return 0
-        
+
         args = self.initCommand("status")
-        args.append('--porcelain')
+        args.append("--porcelain")
         args.append(name)
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             ioEncoding, 'replace')
-        
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
+
         if output:
             for line in output.splitlines():
                 if line and line[0] in " MADRCU!?":
@@ -1085,7 +1080,7 @@
                     if absname.endswith(("/", "\\")):
                         absname = absname[:-1]
                     if flag not in "?!":
-                        if fname == '.':
+                        if fname == ".":
                             if absname.startswith(dname + os.path.sep):
                                 return self.canBeCommitted
                             if absname == dname:
@@ -1095,18 +1090,18 @@
                                 return self.canBeCommitted
         else:
             return self.canBeCommitted
-        
+
         return self.canBeAdded
-    
+
     def vcsAllRegisteredStates(self, names, dname, shortcut=True):
         """
         Public method used to get the registered states of a number of files
         in the vcs.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files have been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1116,17 +1111,17 @@
         if dname.endswith(os.sep):
             dname = dname[:-1]
         dname = os.path.normcase(dname)
-        
+
         # revert the logic because git status doesn't show unchanged files
         for name in names:
             names[name] = self.canBeCommitted
-        
+
         found = False
         for name in self.statusCache:
             if name in names:
                 found = True
                 names[name] = self.statusCache[name]
-        
+
         if not found:
             # find the root of the repo
             repodir = dname
@@ -1134,22 +1129,21 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return names
-        
+
             args = self.initCommand("status")
-            args.append('--porcelain')
-            
+            args.append("--porcelain")
+
             ioEncoding = Preferences.getSystem("IOEncoding")
             output = ""
             process = QProcess()
             process.setWorkingDirectory(dname)
-            process.start('git', args)
+            process.start("git", args)
             procStarted = process.waitForStarted(5000)
             if procStarted:
                 finished = process.waitForFinished(30000)
                 if finished and process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(),
-                                 ioEncoding, 'replace')
-            
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
+
             if output:
                 for line in output.splitlines():
                     if line and line[0] in " MADRCU!?":
@@ -1175,91 +1169,91 @@
                             self.statusCache[name] = self.canBeAdded
                             if dirName not in self.statusCache:
                                 self.statusCache[dirName] = self.canBeAdded
-        
+
         return names
-    
+
     def clearStatusCache(self):
         """
         Public method to clear the status cache.
         """
         self.statusCache = {}
-    
+
     def vcsName(self):
         """
         Public method returning the name of the vcs.
-        
+
         @return always 'Git' (string)
         """
         return "Git"
-    
+
     def vcsInitConfig(self, project):
         """
         Public method to initialize the VCS configuration.
-        
+
         This method ensures, that an ignore file exists.
-        
+
         @param project reference to the project (Project)
         """
         ppath = project.getProjectPath()
         if ppath:
             ignoreName = os.path.join(ppath, Git.IgnoreFileName)
             if not os.path.exists(ignoreName):
-                self.gitCreateIgnoreFile(project.getProjectPath(),
-                                         autoAdd=True)
-    
+                self.gitCreateIgnoreFile(project.getProjectPath(), autoAdd=True)
+
     def vcsCleanup(self, name):
         """
         Public method used to cleanup the working directory.
-        
+
         @param name directory name to be cleaned up (string)
         """
         patterns = self.__plugin.getPreferences("CleanupPatterns").split()
-        
+
         entries = []
         for pat in patterns:
             entries.extend(Utilities.direntries(name, True, pat))
-        
+
         for entry in entries:
             with contextlib.suppress(OSError):
                 os.remove(entry)
-    
+
     def vcsCommandLine(self, name):
         """
         Public method used to execute arbitrary Git commands.
-        
+
         @param name directory name of the working directory (string)
         """
         from .GitCommandDialog import GitCommandDialog
+
         dlg = GitCommandDialog(self.commandHistory, name)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             command = dlg.getData()
             commandList = Utilities.parseOptionString(command)
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             if command in self.commandHistory:
                 self.commandHistory.remove(command)
             self.commandHistory.insert(0, command)
-            
+
             args = []
             self.addArguments(args, commandList)
-            
+
             # find the root of the repo
             repodir = name
             while not os.path.isdir(os.path.join(repodir, self.adminDir)):
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return
-            
-            dia = GitDialog(self.tr('Git Command'), self)
+
+            dia = GitDialog(self.tr("Git Command"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def vcsOptionsDialog(self, project, archive, editable=False, parent=None):
         """
         Public method to get a dialog to enter repository info.
-        
+
         @param project reference to the project object
         @param archive name of the project in the repository (string)
         @param editable flag indicating that the project name is editable
@@ -1268,66 +1262,80 @@
         @return reference to the instantiated options dialog (GitOptionsDialog)
         """
         from .GitOptionsDialog import GitOptionsDialog
+
         return GitOptionsDialog(self, project, parent)
-    
+
     def vcsNewProjectOptionsDialog(self, parent=None):
         """
         Public method to get a dialog to enter repository info for getting a
         new project.
-        
+
         @param parent parent widget (QWidget)
         @return reference to the instantiated options dialog
             (GitNewProjectOptionsDialog)
         """
         from .GitNewProjectOptionsDialog import GitNewProjectOptionsDialog
+
         return GitNewProjectOptionsDialog(self, parent)
-    
+
     def vcsRepositoryInfos(self, ppath):
         """
         Public method to retrieve information about the repository.
-        
+
         @param ppath local path to get the repository infos (string)
         @return string with ready formated info for display (string)
         """
         formatTemplate = (
-            'format:'
-            '%h%n'
-            '%p%n'
-            '%an%n'
-            '%ae%n'
-            '%ai%n'
-            '%cn%n'
-            '%ce%n'
-            '%ci%n'
-            '%d%n'
-            '%s')
-        
+            "format:"
+            "%h%n"
+            "%p%n"
+            "%an%n"
+            "%ae%n"
+            "%ai%n"
+            "%cn%n"
+            "%ce%n"
+            "%ci%n"
+            "%d%n"
+            "%s"
+        )
+
         args = self.initCommand("show")
         args.append("--abbrev-commit")
-        args.append("--abbrev={0}".format(
-            self.__plugin.getPreferences("CommitIdLength")))
+        args.append(
+            "--abbrev={0}".format(self.__plugin.getPreferences("CommitIdLength"))
+        )
         args.append("--format={0}".format(formatTemplate))
         args.append("--no-patch")
         args.append("HEAD")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(ppath)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             info = []
-            (commit, parents, author, authorMail, authorDate,
-             committer, committerMail, committerDate, refs, subject) = (
-                output.splitlines()
-            )
+            (
+                commit,
+                parents,
+                author,
+                authorMail,
+                authorDate,
+                committer,
+                committerMail,
+                committerDate,
+                refs,
+                subject,
+            ) = output.splitlines()
             tags = []
             branches = []
             for name in refs.strip()[1:-1].split(","):
@@ -1337,41 +1345,55 @@
                         tags.append(name.split()[1])
                     elif name != "HEAD":
                         branches.append(name)
-            
-            info.append(self.tr(
-                "<tr><td><b>Commit</b></td><td>{0}</td></tr>").format(
-                commit))
+
+            info.append(
+                self.tr("<tr><td><b>Commit</b></td><td>{0}</td></tr>").format(commit)
+            )
             if parents:
-                info.append(self.tr(
-                    "<tr><td><b>Parents</b></td><td>{0}</td></tr>").format(
-                    '<br/>'.join(parents.strip().split())))
+                info.append(
+                    self.tr("<tr><td><b>Parents</b></td><td>{0}</td></tr>").format(
+                        "<br/>".join(parents.strip().split())
+                    )
+                )
             if tags:
-                info.append(self.tr(
-                    "<tr><td><b>Tags</b></td><td>{0}</td></tr>").format(
-                    '<br/>'.join(tags)))
+                info.append(
+                    self.tr("<tr><td><b>Tags</b></td><td>{0}</td></tr>").format(
+                        "<br/>".join(tags)
+                    )
+                )
             if branches:
-                info.append(self.tr(
-                    "<tr><td><b>Branches</b></td><td>{0}</td></tr>").format(
-                    '<br/>'.join(branches)))
-            info.append(self.tr(
-                "<tr><td><b>Author</b></td><td>{0} &lt;{1}&gt;</td></tr>")
-                .format(author, authorMail))
-            info.append(self.tr(
-                "<tr><td><b>Date</b></td><td>{0}</td></tr>").format(
-                authorDate.rsplit(":", 1)[0]))
-            info.append(self.tr(
-                "<tr><td><b>Committer</b></td><td>{0} &lt;{1}&gt;</td></tr>")
-                .format(committer, committerMail))
-            info.append(self.tr(
-                "<tr><td><b>Committed Date</b></td><td>{0}</td></tr>").format(
-                committerDate.rsplit(":", 1)[0]))
-            info.append(self.tr(
-                "<tr><td><b>Subject</b></td><td>{0}</td></tr>").format(
-                subject))
+                info.append(
+                    self.tr("<tr><td><b>Branches</b></td><td>{0}</td></tr>").format(
+                        "<br/>".join(branches)
+                    )
+                )
+            info.append(
+                self.tr(
+                    "<tr><td><b>Author</b></td><td>{0} &lt;{1}&gt;</td></tr>"
+                ).format(author, authorMail)
+            )
+            info.append(
+                self.tr("<tr><td><b>Date</b></td><td>{0}</td></tr>").format(
+                    authorDate.rsplit(":", 1)[0]
+                )
+            )
+            info.append(
+                self.tr(
+                    "<tr><td><b>Committer</b></td><td>{0} &lt;{1}&gt;</td></tr>"
+                ).format(committer, committerMail)
+            )
+            info.append(
+                self.tr("<tr><td><b>Committed Date</b></td><td>{0}</td></tr>").format(
+                    committerDate.rsplit(":", 1)[0]
+                )
+            )
+            info.append(
+                self.tr("<tr><td><b>Subject</b></td><td>{0}</td></tr>").format(subject)
+            )
             infoStr = "\n".join(info)
         else:
             infoStr = ""
-        
+
         return self.tr(
             """<h3>Repository information</h3>\n"""
             """<p><table>\n"""
@@ -1380,40 +1402,40 @@
             """{1}"""
             """</table></p>\n"""
         ).format(self.versionStr, infoStr)
-    
+
     def vcsSupportCommandOptions(self):
         """
         Public method to signal the support of user settable command options.
-        
+
         @return flag indicating the support  of user settable command options
             (boolean)
         """
         return False
-    
+
     ###########################################################################
     ## Git specific methods are below.
     ###########################################################################
-    
+
     def gitNormalizeURL(self, url):
         """
         Public method to normalize a url for Git.
-        
+
         @param url url string (string)
         @return properly normalized url for git (string)
         """
-        url = url.replace('\\', '/')
-        if url.endswith('/'):
+        url = url.replace("\\", "/")
+        if url.endswith("/"):
             url = url[:-1]
-        urll = url.split('//')
+        urll = url.split("//")
         if len(urll) > 1:
-            url = "{0}//{1}".format(urll[0], '/'.join(urll[1:]))
-        
+            url = "{0}//{1}".format(urll[0], "/".join(urll[1:]))
+
         return url
-    
+
     def gitCreateIgnoreFile(self, name, autoAdd=False):
         """
         Public method to create the ignore file.
-        
+
         @param name directory name to create the ignore file in (string)
         @param autoAdd flag indicating to add it automatically (boolean)
         @return flag indicating success
@@ -1436,17 +1458,20 @@
             "__pycache__/",
             "*.DS_Store",
         ]
-        
+
         ignoreName = os.path.join(name, Git.IgnoreFileName)
         res = (
             EricMessageBox.yesNo(
                 self.__ui,
                 self.tr("Create {0} file").format(ignoreName),
-                self.tr("""<p>The file <b>{0}</b> exists already."""
-                        """ Overwrite it?</p>""").format(ignoreName),
-                icon=EricMessageBox.Warning)
-            if os.path.exists(ignoreName) else
-            True
+                self.tr(
+                    """<p>The file <b>{0}</b> exists already."""
+                    """ Overwrite it?</p>"""
+                ).format(ignoreName),
+                icon=EricMessageBox.Warning,
+            )
+            if os.path.exists(ignoreName)
+            else True
         )
         if res:
             try:
@@ -1457,27 +1482,28 @@
                 status = True
             except OSError:
                 status = False
-            
+
             if status and autoAdd:
                 self.vcsAdd(ignoreName, noDialog=True)
                 project = ericApp().getObject("Project")
                 project.appendFile(ignoreName)
-        
+
         return status
-    
+
     def gitCopy(self, name, project):
         """
         Public method used to copy a file/directory.
-        
+
         @param name file/directory name to be copied (string)
         @param project reference to the project object
         @return flag indicating successful operation (boolean)
         """
         from .GitCopyDialog import GitCopyDialog
+
         dlg = GitCopyDialog(name)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             target, force = dlg.getData()
-            
+
             # step 1: copy the file/directory:
             if os.path.isdir(name):
                 try:
@@ -1486,9 +1512,11 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Git Copy"),
-                        self.tr("""<p>Copying the directory <b>{0}</b>"""
-                                """ failed.</p><p>Reason: {1}</p>""").format(
-                            name, str(why)))
+                        self.tr(
+                            """<p>Copying the directory <b>{0}</b>"""
+                            """ failed.</p><p>Reason: {1}</p>"""
+                        ).format(name, str(why)),
+                    )
                     return False
                 self.vcsAdd(target, isDir=True)
                 if target.startswith(project.getProjectPath()):
@@ -1501,41 +1529,44 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Git Copy"),
-                        self.tr("""<p>Copying the file <b>{0}</b>"""
-                                """ failed.</p><p>Reason: {1}</p>""").format(
-                            name, str(why)))
+                        self.tr(
+                            """<p>Copying the file <b>{0}</b>"""
+                            """ failed.</p><p>Reason: {1}</p>"""
+                        ).format(name, str(why)),
+                    )
                     return False
                 self.vcsAdd(target, isDir=False)
                 if target.startswith(project.getProjectPath()):
                     project.appendFile(target)
             self.checkVCSStatus()
         return True
-    
+
     def gitBlame(self, name):
         """
         Public method to show the output of the git blame command.
-        
+
         @param name file name to show the annotations for (string)
         """
         if self.blame is None:
             from .GitBlameDialog import GitBlameDialog
+
             self.blame = GitBlameDialog(self)
         self.blame.show()
         self.blame.raise_()
         self.blame.start(name)
-    
+
     def gitExtendedDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Git repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         if isinstance(name, list):
@@ -1553,31 +1584,34 @@
                 project = ericApp().getObject("Project")
                 if nam == project.ppath and not project.saveAllScripts():
                     return
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitRevisionsSelectionDialog import GitRevisionsSelectionDialog
-        dlg = GitRevisionsSelectionDialog(self.gitGetTagsList(repodir),
-                                          self.gitGetBranchesList(repodir))
+
+        dlg = GitRevisionsSelectionDialog(
+            self.gitGetTagsList(repodir), self.gitGetBranchesList(repodir)
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             revisions = dlg.getRevisions()
             if self.diff is None:
                 from .GitDiffDialog import GitDiffDialog
+
                 self.diff = GitDiffDialog(self)
             self.diff.show()
             self.diff.raise_()
             self.diff.start(name, revisions)
-    
+
     def __gitGetFileForRevision(self, name, rev=""):
         """
         Private method to get a file for a specific revision from the
         repository.
-        
+
         @param name file name to get from the repository (string)
         @param rev revision to retrieve (string)
         @return contents of the file (string) and an error message (string)
@@ -1588,45 +1622,49 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         args = self.initCommand("cat-file")
         args.append("blob")
         args.append("{0}:{1}".format(rev, name.replace(repodir + os.sep, "")))
-        
+
         output = ""
         error = ""
-        
+
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished:
                 if process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace')
+                    output = str(
+                        process.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    )
                 else:
-                    error = str(process.readAllStandardError(),
-                                Preferences.getSystem("IOEncoding"),
-                                'replace')
+                    error = str(
+                        process.readAllStandardError(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    )
             else:
-                error = self.tr(
-                    "The git process did not finish within 30s.")
+                error = self.tr("The git process did not finish within 30s.")
         else:
             error = self.tr(
-                'The process {0} could not be started. '
-                'Ensure, that it is in the search path.').format('git')
-        
+                "The process {0} could not be started. "
+                "Ensure, that it is in the search path."
+            ).format("git")
+
         # return file contents with 'universal newlines'
-        return output.replace('\r\n', '\n').replace('\r', '\n'), error
-    
+        return output.replace("\r\n", "\n").replace("\r", "\n"), error
+
     def vcsSbsDiff(self, name, extended=False, revisions=None):
         """
         Public method used to view the difference of a file to the Git
         repository side-by-side.
-        
+
         @param name file name to be diffed (string)
         @param extended flag indicating the extended variant (boolean)
         @param revisions tuple of two revisions (tuple of strings)
@@ -1634,7 +1672,7 @@
         """
         if isinstance(name, list):
             raise ValueError("Wrong parameter type")
-        
+
         if extended:
             # find the root of the repo
             repodir = self.splitPath(name)[0]
@@ -1642,37 +1680,35 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return
-            
-            from .GitRevisionsSelectionDialog import (
-                GitRevisionsSelectionDialog
+
+            from .GitRevisionsSelectionDialog import GitRevisionsSelectionDialog
+
+            dlg = GitRevisionsSelectionDialog(
+                self.gitGetTagsList(repodir), self.gitGetBranchesList(repodir)
             )
-            dlg = GitRevisionsSelectionDialog(self.gitGetTagsList(repodir),
-                                              self.gitGetBranchesList(repodir))
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev1, rev2 = dlg.getRevisions()
         elif revisions:
             rev1, rev2 = revisions[0], revisions[1]
         else:
             rev1, rev2 = "", ""
-        
+
         output1, error = self.__gitGetFileForRevision(name, rev=rev1)
         if error:
             EricMessageBox.critical(
-                self.__ui,
-                self.tr("Git Side-by-Side Difference"),
-                error)
+                self.__ui, self.tr("Git Side-by-Side Difference"), error
+            )
             return
         name1 = "{0} (rev. {1})".format(name, rev1 and rev1 or "Stage")
-        
+
         if rev2:
             if rev2 == "Stage":
                 rev2 = ""
             output2, error = self.__gitGetFileForRevision(name, rev=rev2)
             if error:
                 EricMessageBox.critical(
-                    self.__ui,
-                    self.tr("Git Side-by-Side Difference"),
-                    error)
+                    self.__ui, self.tr("Git Side-by-Side Difference"), error
+                )
                 return
             name2 = "{0} (rev. {1})".format(name, rev2)
         else:
@@ -1685,22 +1721,24 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Git Side-by-Side Difference"),
-                    self.tr(
-                        """<p>The file <b>{0}</b> could not be read.</p>""")
-                    .format(name))
+                    self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                        name
+                    ),
+                )
                 return
-        
+
         if self.sbsDiff is None:
             from UI.CompareDialog import CompareDialog
+
             self.sbsDiff = CompareDialog()
         self.sbsDiff.show()
         self.sbsDiff.raise_()
         self.sbsDiff.compare(output1, output2, name1, name2)
-    
+
     def gitFetch(self, name):
         """
         Public method to fetch changes from a remote repository.
-        
+
         @param name directory name (string)
         """
         # find the root of the repo
@@ -1709,39 +1747,46 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitFetchDialog import GitFetchDialog
+
         dlg = GitFetchDialog(self, repodir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (remote, url, remoteBranches, localBranch, fetchAll, prune,
-             includeTags) = dlg.getData()
-            
+            (
+                remote,
+                url,
+                remoteBranches,
+                localBranch,
+                fetchAll,
+                prune,
+                includeTags,
+            ) = dlg.getData()
+
             args = self.initCommand("fetch")
-            args.append('--verbose')
+            args.append("--verbose")
             if prune:
-                args.append('--prune')
+                args.append("--prune")
             if includeTags:
                 args.append("--tags")
             if fetchAll:
-                args.append('--all')
+                args.append("--all")
             else:
                 args.append(remote) if remote else args.append(url)
                 if len(remoteBranches) == 1 and localBranch:
                     args.append(remoteBranches[0] + ":" + localBranch)
                 else:
                     args.extend(remoteBranches)
-        
-            dia = GitDialog(self.tr('Fetching from a remote Git repository'),
-                            self)
+
+            dia = GitDialog(self.tr("Fetching from a remote Git repository"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
             self.checkVCSStatus()
-    
+
     def gitPull(self, name):
         """
         Public method used to pull changes from a remote Git repository.
-        
+
         @param name directory name of the project to be pulled to (string)
         @return flag indicating, that the update contained an add
             or delete (boolean)
@@ -1752,25 +1797,25 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         from .GitPullDialog import GitPullDialog
+
         dlg = GitPullDialog(self, repodir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             remote, url, branches, pullAll, prune = dlg.getData()
-            
-            args = self.initCommand('pull')
-            args.append('--no-commit')
-            args.append('--verbose')
+
+            args = self.initCommand("pull")
+            args.append("--no-commit")
+            args.append("--verbose")
             if prune:
-                args.append('--prune')
+                args.append("--prune")
             if pullAll:
-                args.append('--all')
+                args.append("--all")
             else:
                 args.append(remote) if remote else args.append(url)
                 args.extend(branches)
-            
-            dia = GitDialog(self.tr('Pulling from a remote Git repository'),
-                            self)
+
+            dia = GitDialog(self.tr("Pulling from a remote Git repository"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
@@ -1779,11 +1824,11 @@
             return res
         else:
             return False
-    
+
     def gitPush(self, name):
         """
         Public method used to push changes to a remote Git repository.
-        
+
         @param name directory name of the project to be pushed from (string)
         """
         # find the root of the repo
@@ -1792,15 +1837,16 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitPushDialog import GitPushDialog
+
         dlg = GitPushDialog(self, repodir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             remote, refspecs, tags, tracking, submodule = dlg.getData()
-            
+
             args = self.initCommand("push")
-            args.append('--verbose')
-            args.append('--porcelain')
+            args.append("--verbose")
+            args.append("--porcelain")
             if tags:
                 args.append("--tags")
             if tracking:
@@ -1809,78 +1855,74 @@
                 args.append("--recurse-submodules={0}".format(submodule))
             args.append(remote)
             args.extend(refspecs)
-            
-            dia = GitDialog(
-                self.tr('Pushing to a remote Git repository'), self)
+
+            dia = GitDialog(self.tr("Pushing to a remote Git repository"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
             self.checkVCSStatus()
-    
+
     def gitCommitMerge(self, name):
         """
         Public method to commit a failed merge.
-        
+
         @param name file/directory name (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         import sys
+
         editor = sys.argv[0].replace(".py", "_editor.py")
-        env = {"GIT_EDITOR": "{0} {1}".format(
-            Globals.getPythonExecutable(), editor)}
-        
+        env = {"GIT_EDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor)}
+
         args = self.initCommand("commit")
-        
-        dia = GitDialog(self.tr('Committing failed merge'), self)
+
+        dia = GitDialog(self.tr("Committing failed merge"), self)
         res = dia.startProcess(args, repodir, environment=env)
         if res:
             dia.exec()
         self.committed.emit()
         self.checkVCSStatus()
-    
+
     def gitCancelMerge(self, name):
         """
         Public method to cancel an uncommitted or failed merge.
-        
+
         @param name file/directory name (string)
         @return flag indicating, that the cancellation contained an add
             or delete (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         args = self.initCommand("merge")
         args.append("--abort")
-        
-        dia = GitDialog(
-            self.tr('Aborting uncommitted/failed merge'),
-            self)
+
+        dia = GitDialog(self.tr("Aborting uncommitted/failed merge"), self)
         res = dia.startProcess(args, repodir, False)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
-    def gitApply(self, repodir, patchFile, cached=False, reverse=False,
-                 noDialog=False):
+
+    def gitApply(self, repodir, patchFile, cached=False, reverse=False, noDialog=False):
         """
         Public method to apply a patch stored in a given file.
-        
+
         @param repodir directory name of the repository (string)
         @param patchFile name of the patch file (string)
         @param cached flag indicating to apply the patch to the staging area
@@ -1895,22 +1937,20 @@
         if reverse:
             args.append("--reverse")
         args.append(patchFile)
-        
+
         if noDialog:
             self.startSynchronizedProcess(QProcess(), "git", args, repodir)
         else:
-            dia = GitDialog(
-                self.tr('Applying patch'),
-                self)
+            dia = GitDialog(self.tr("Applying patch"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitApplyCheckPatches(self, projectDir, check=False):
         """
         Public method to apply a list of patch files or check, if they would
         apply cleanly.
-        
+
         @param projectDir directory name of the project (string)
         @param check flag indicating to perform a check operation (boolean)
         """
@@ -1920,8 +1960,9 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitPatchFilesDialog import GitPatchFilesDialog
+
         dlg = GitPatchFilesDialog(repodir, self.__patchCheckData)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             patchFilesList, stripCount, inaccurateEof, recount = dlg.getData()
@@ -1930,49 +1971,52 @@
                 if check:
                     args.append("--check")
                     self.__patchCheckData = (
-                        patchFilesList, stripCount, inaccurateEof, recount)
-                    title = self.tr('Check patch files')
+                        patchFilesList,
+                        stripCount,
+                        inaccurateEof,
+                        recount,
+                    )
+                    title = self.tr("Check patch files")
                 else:
                     self.__patchCheckData = None
-                    title = self.tr('Apply patch files')
+                    title = self.tr("Apply patch files")
                 if inaccurateEof:
                     args.append("--inaccurate-eof")
                 if recount:
                     args.append("--recount")
                 args.append("-p{0}".format(stripCount))
                 args.extend(patchFilesList)
-                
-                dia = GitDialog(
-                    title,
-                    self)
+
+                dia = GitDialog(title, self)
                 res = dia.startProcess(args, repodir)
                 if res:
                     dia.exec()
                     if not check:
                         self.checkVCSStatus()
-    
+
     def gitShowPatchesStatistics(self, projectDir):
         """
         Public method to show statistics for a set of patch files.
-        
+
         @param projectDir directory name of the project (string)
         """
         if self.patchStatisticsDialog is None:
             from .GitPatchStatisticsDialog import GitPatchStatisticsDialog
+
             self.patchStatisticsDialog = GitPatchStatisticsDialog(self)
         self.patchStatisticsDialog.show()
         self.patchStatisticsDialog.raise_()
         self.patchStatisticsDialog.start(projectDir, self.__patchCheckData)
         self.__patchCheckData = self.patchStatisticsDialog.getData()
-    
+
     ###########################################################################
     ## Methods for tag handling.
     ###########################################################################
-    
+
     def vcsTag(self, name, revision=None, tagName=None):
         """
         Public method used to set/remove a tag in the Git repository.
-        
+
         @param name file/directory name to determine the repo root from
             (string)
         @param revision revision to set tag for (string)
@@ -1980,21 +2024,22 @@
         @return flag indicating a performed tag action (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         from .GitTagDialog import GitTagDialog
+
         dlg = GitTagDialog(self.gitGetTagsList(repodir), revision, tagName)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, revision, tagOp, tagType, force = dlg.getParameters()
         else:
             return False
-        
+
         args = self.initCommand("tag")
         if tagOp == GitTagDialog.CreateTag:
             msg = "Created tag <{0}>.".format(tag)
@@ -2015,19 +2060,18 @@
         args.append(tag)
         if tagOp == GitTagDialog.CreateTag and revision:
             args.append(revision)
-        
-        dia = GitDialog(self.tr('Tagging in the Git repository'),
-                        self)
+
+        dia = GitDialog(self.tr("Tagging in the Git repository"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
-        
+
         return True
-    
+
     def gitGetTagsList(self, repodir, withType=False):
         """
         Public method to get the list of tags.
-        
+
         @param repodir directory name of the repository (string)
         @param withType flag indicating to get the tag type as well (boolean)
         @return list of tags (list of string) or list of tuples of
@@ -2035,32 +2079,34 @@
             and boolean), if withType is True
         """
         args = self.initCommand("tag")
-        args.append('--list')
-        
+        args.append("--list")
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         tagsList = []
         if output:
             for line in output.splitlines():
                 name = line.strip()
                 tagsList.append(name)
-        
+
         return tagsList
-    
+
     def gitListTagBranch(self, path, tags=True, listAll=True, merged=True):
         """
         Public method used to list the available tags or branches.
-        
+
         @param path directory name of the project (string)
         @param tags flag indicating listing of branches or tags
             (False = branches, True = tags)
@@ -2070,6 +2116,7 @@
         """
         if self.tagbranchList is None:
             from .GitTagBranchListDialog import GitTagBranchListDialog
+
             self.tagbranchList = GitTagBranchListDialog(self)
         self.tagbranchList.show()
         self.tagbranchList.raise_()
@@ -2077,16 +2124,17 @@
             self.tagbranchList.start(path, tags)
         else:
             self.tagbranchList.start(path, tags, listAll, merged)
-    
+
     ###########################################################################
     ## Methods for branch handling.
     ###########################################################################
-    
-    def gitGetBranchesList(self, repodir, withMaster=False, allBranches=False,
-                           remotes=False):
+
+    def gitGetBranchesList(
+        self, repodir, withMaster=False, allBranches=False, remotes=False
+    ):
         """
         Public method to get the list of branches.
-        
+
         @param repodir directory name of the repository (string)
         @param withMaster flag indicating to get 'master' as well (boolean)
         @param allBranches flag indicating to return all branches (boolean)
@@ -2094,61 +2142,65 @@
         @return list of branches (list of string)
         """
         args = self.initCommand("branch")
-        args.append('--list')
+        args.append("--list")
         if allBranches:
             args.append("--all")
         elif remotes:
             args.append("--remotes")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         branchesList = []
         if output:
             for line in output.splitlines():
                 name = line[2:].strip()
                 if (
-                    (name != "master" or withMaster) and
-                    "->" not in name and
-                    not name.startswith("(") and
-                    not name.endswith(")")
+                    (name != "master" or withMaster)
+                    and "->" not in name
+                    and not name.startswith("(")
+                    and not name.endswith(")")
                 ):
                     branchesList.append(name)
-        
+
         return branchesList
-    
+
     def gitGetCurrentBranch(self, repodir):
         """
         Public method used to show the current branch of the working directory.
-        
+
         @param repodir directory name of the repository (string)
         @return name of the current branch (string)
         """
         args = self.initCommand("branch")
-        args.append('--list')
-        
+        args.append("--list")
+
         branchName = ""
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             for line in output.splitlines():
                 if line.startswith("* "):
@@ -2157,14 +2209,14 @@
                         # not a valid branch name, probably detached head
                         branchName = ""
                     break
-        
+
         return branchName
-    
+
     def gitBranch(self, name, revision=None, branchName=None, branchOp=None):
         """
         Public method used to create, delete or move a branch in the Git
         repository.
-        
+
         @param name file/directory name to be branched (string)
         @param revision revision to set tag for (string)
         @param branchName name of the branch (string)
@@ -2174,30 +2226,41 @@
             or delete (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False, False
-        
+
         from .GitBranchDialog import GitBranchDialog
+
         dlg = GitBranchDialog(
             self.gitGetBranchesList(repodir, allBranches=True),
-            revision, branchName, branchOp)
+            revision,
+            branchName,
+            branchOp,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            branchOp, branch, revision, newBranch, remoteBranch, force = (
-                dlg.getParameters()
-            )
+            (
+                branchOp,
+                branch,
+                revision,
+                newBranch,
+                remoteBranch,
+                force,
+            ) = dlg.getParameters()
         else:
             return False, False
-        
-        if branchOp in [GitBranchDialog.CreateBranch,
-                        GitBranchDialog.DeleteBranch,
-                        GitBranchDialog.RenameBranch,
-                        GitBranchDialog.SetTrackingBranch,
-                        GitBranchDialog.UnsetTrackingBranch]:
+
+        if branchOp in [
+            GitBranchDialog.CreateBranch,
+            GitBranchDialog.DeleteBranch,
+            GitBranchDialog.RenameBranch,
+            GitBranchDialog.SetTrackingBranch,
+            GitBranchDialog.UnsetTrackingBranch,
+        ]:
             args = self.initCommand("branch")
             if branchOp == GitBranchDialog.CreateBranch:
                 if force:
@@ -2226,8 +2289,10 @@
                 args.append("--unset-upstream")
                 if branch:
                     args.append(branch)
-        elif branchOp in [GitBranchDialog.CreateSwitchBranch,
-                          GitBranchDialog.CreateTrackingBranch]:
+        elif branchOp in [
+            GitBranchDialog.CreateSwitchBranch,
+            GitBranchDialog.CreateTrackingBranch,
+        ]:
             args = self.initCommand("checkout")
             if branchOp == GitBranchDialog.CreateSwitchBranch:
                 if force:
@@ -2242,82 +2307,88 @@
                 args.append(branch)
         else:
             return False, False
-        
-        dia = GitDialog(self.tr('Branching in the Git repository'),
-                        self)
+
+        dia = GitDialog(self.tr("Branching in the Git repository"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
-            if branchOp in [GitBranchDialog.CreateSwitchBranch,
-                            GitBranchDialog.CreateTrackingBranch]:
+            if branchOp in [
+                GitBranchDialog.CreateSwitchBranch,
+                GitBranchDialog.CreateTrackingBranch,
+            ]:
                 update = dia.hasAddOrDelete()
                 self.checkVCSStatus()
             else:
                 update = False
-        
+
         return True, update
-    
+
     def gitDeleteRemoteBranch(self, name):
         """
         Public method to delete a branch from a remote repository.
-        
+
         @param name file/directory name (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitBranchPushDialog import GitBranchPushDialog
-        dlg = GitBranchPushDialog(self.gitGetBranchesList(repodir),
-                                  self.gitGetRemotesList(repodir),
-                                  delete=True)
+
+        dlg = GitBranchPushDialog(
+            self.gitGetBranchesList(repodir),
+            self.gitGetRemotesList(repodir),
+            delete=True,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             branchName, remoteName = dlg.getData()[:2]
-            
+
             args = self.initCommand("push")
             args.append(remoteName)
             args.append(":{0}".format(branchName))
-            
-            dia = GitDialog(self.tr('Delete Remote Branch'), self)
+
+            dia = GitDialog(self.tr("Delete Remote Branch"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitShowBranch(self, name):
         """
         Public method used to show the current branch of the working directory.
-        
+
         @param name file/directory name (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         # find the root of the repo
         repodir = dname
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         branchName = self.gitGetCurrentBranch(repodir)
         EricMessageBox.information(
             None,
             self.tr("Current Branch"),
-            self.tr("""<p>The current branch is <b>{0}</b>."""
-                    """</p>""").format(branchName))
-    
+            self.tr("""<p>The current branch is <b>{0}</b>.""" """</p>""").format(
+                branchName
+            ),
+        )
+
     ###########################################################################
     ## Methods for bundles handling.
     ###########################################################################
-    
+
     def gitBundle(self, projectDir):
         """
         Public method to create a bundle file.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2326,24 +2397,27 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitBundleDialog import GitBundleDialog
-        dlg = GitBundleDialog(self.gitGetTagsList(repodir),
-                              self.gitGetBranchesList(repodir))
+
+        dlg = GitBundleDialog(
+            self.gitGetTagsList(repodir), self.gitGetBranchesList(repodir)
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             revs = dlg.getData()
-            
+
             fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
                 None,
                 self.tr("Create Bundle"),
                 self.__lastBundlePath or repodir,
                 self.tr("Git Bundle Files (*.bundle)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
-            
+                EricFileDialog.DontConfirmOverwrite,
+            )
+
             if not fname:
                 return  # user aborted
-            
+
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2353,30 +2427,32 @@
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Create Bundle"),
-                    self.tr("<p>The Git bundle file <b>{0}</b> "
-                            "already exists. Overwrite it?</p>")
-                        .format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The Git bundle file <b>{0}</b> "
+                        "already exists. Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-            
+
             self.__lastBundlePath = str(fpath.parent)
-            
+
             args = self.initCommand("bundle")
             args.append("create")
             args.append(str(fpath))
             for rev in revs:
                 args.append(rev)
-            
-            dia = GitDialog(self.tr('Create Bundle'), self)
+
+            dia = GitDialog(self.tr("Create Bundle"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitVerifyBundle(self, projectDir):
         """
         Public method to verify a bundle file.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2385,28 +2461,29 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("Verify Bundle"),
             self.__lastBundlePath or repodir,
-            self.tr("Git Bundle Files (*.bundle);;All Files (*)"))
+            self.tr("Git Bundle Files (*.bundle);;All Files (*)"),
+        )
         if fname:
             self.__lastBundlePath = os.path.dirname(fname)
-            
+
             args = self.initCommand("bundle")
             args.append("verify")
             args.append(fname)
-            
-            dia = GitDialog(self.tr('Verify Bundle'), self)
+
+            dia = GitDialog(self.tr("Verify Bundle"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitBundleListHeads(self, projectDir):
         """
         Public method to list the heads contained in a bundle file.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2415,28 +2492,29 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("List Bundle Heads"),
             self.__lastBundlePath or repodir,
-            self.tr("Git Bundle Files (*.bundle);;All Files (*)"))
+            self.tr("Git Bundle Files (*.bundle);;All Files (*)"),
+        )
         if fname:
             self.__lastBundlePath = os.path.dirname(fname)
-            
+
             args = self.initCommand("bundle")
             args.append("list-heads")
             args.append(fname)
-            
-            dia = GitDialog(self.tr('List Bundle Heads'), self)
+
+            dia = GitDialog(self.tr("List Bundle Heads"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitGetBundleHeads(self, repodir, bundleFile):
         """
         Public method to get a list of heads contained in a bundle file.
-        
+
         @param repodir directory name of the repository (string)
         @param bundleFile file name of a git bundle file (string)
         @return list of heads (list of strings)
@@ -2444,32 +2522,34 @@
         args = self.initCommand("bundle")
         args.append("list-heads")
         args.append(bundleFile)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         heads = []
         if output:
             for line in output.splitlines():
                 head = line.strip().split(None, 1)[1]  # commit id, head
                 heads.append(head.replace("refs/heads/", ""))
-        
+
         return heads
-    
+
     def gitBundleFetch(self, projectDir):
         """
         Public method to fetch a head of a bundle file into the local
         repository.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2478,43 +2558,44 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("Apply Bundle"),
             self.__lastBundlePath or repodir,
-            self.tr("Git Bundle Files (*.bundle);;All Files (*)"))
+            self.tr("Git Bundle Files (*.bundle);;All Files (*)"),
+        )
         if fname:
             self.__lastBundlePath = os.path.dirname(fname)
-            
+
             from .GitApplyBundleDataDialog import GitApplyBundleDataDialog
+
             dlg = GitApplyBundleDataDialog(
-                self.gitGetBundleHeads(repodir, fname),
-                self.gitGetBranchesList(repodir))
+                self.gitGetBundleHeads(repodir, fname), self.gitGetBranchesList(repodir)
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 bundleHead, branch = dlg.getData()
-                
+
                 args = self.initCommand("fetch")
-                args.append('--verbose')
+                args.append("--verbose")
                 args.append(fname)
                 if branch:
                     args.append(bundleHead + ":" + branch)
                 else:
                     args.append(bundleHead)
-                
-                dia = GitDialog(self.tr('Applying a bundle file (fetch)'),
-                                self)
+
+                dia = GitDialog(self.tr("Applying a bundle file (fetch)"), self)
                 res = dia.startProcess(args, repodir)
                 if res:
                     dia.exec()
                     res = dia.hasAddOrDelete()
                 self.checkVCSStatus()
-    
+
     def gitBundlePull(self, projectDir):
         """
         Public method to pull a head of a bundle file into the local
         repository and working area.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating, that the update contained an add
             or delete (boolean)
@@ -2525,49 +2606,50 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = False
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("Apply Bundle"),
             self.__lastBundlePath or repodir,
-            self.tr("Git Bundle Files (*.bundle);;All Files (*)"))
+            self.tr("Git Bundle Files (*.bundle);;All Files (*)"),
+        )
         if fname:
             self.__lastBundlePath = os.path.dirname(fname)
-            
+
             from .GitApplyBundleDataDialog import GitApplyBundleDataDialog
+
             dlg = GitApplyBundleDataDialog(
-                self.gitGetBundleHeads(repodir, fname),
-                self.gitGetBranchesList(repodir))
+                self.gitGetBundleHeads(repodir, fname), self.gitGetBranchesList(repodir)
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 bundleHead, branch = dlg.getData()
-                
+
                 args = self.initCommand("pull")
-                args.append('--verbose')
+                args.append("--verbose")
                 args.append(fname)
                 if branch:
                     args.append(bundleHead + ":" + branch)
                 else:
                     args.append(bundleHead)
-                
-                dia = GitDialog(self.tr('Applying a bundle file (fetch)'),
-                                self)
+
+                dia = GitDialog(self.tr("Applying a bundle file (fetch)"), self)
                 res = dia.startProcess(args, repodir)
                 if res:
                     dia.exec()
                     res = dia.hasAddOrDelete()
                 self.checkVCSStatus()
-        
+
         return res
-    
+
     ###########################################################################
     ## Methods for bisect handling.
     ###########################################################################
-    
+
     def gitBisect(self, projectDir, subcommand):
         """
         Public method to perform bisect commands.
-        
+
         @param projectDir name of the project directory (string)
         @param subcommand name of the subcommand (string, one of 'start',
             'start_extended', 'good', 'bad', 'skip' or 'reset')
@@ -2575,37 +2657,47 @@
             or delete (boolean)
         @exception ValueError raised to indicate an invalid bisect subcommand
         """
-        if subcommand not in ("start", "start_extended", "good", "bad",
-                              "skip", "reset"):
+        if subcommand not in (
+            "start",
+            "start_extended",
+            "good",
+            "bad",
+            "skip",
+            "reset",
+        ):
             raise ValueError(
-                self.tr("Bisect subcommand ({0}) invalid.")
-                    .format(subcommand))
-        
+                self.tr("Bisect subcommand ({0}) invalid.").format(subcommand)
+            )
+
         # find the root of the repo
         repodir = projectDir
         while not os.path.isdir(os.path.join(repodir, self.adminDir)):
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = False
         rev = ""
         if subcommand in ("good", "bad", "skip", "reset"):
             showBranches = subcommand == "reset"
             showHead = subcommand == "reset"
             from .GitRevisionSelectionDialog import GitRevisionSelectionDialog
-            dlg = GitRevisionSelectionDialog(self.gitGetTagsList(repodir),
-                                             self.gitGetBranchesList(repodir),
-                                             showBranches=showBranches,
-                                             showHead=showHead)
+
+            dlg = GitRevisionSelectionDialog(
+                self.gitGetTagsList(repodir),
+                self.gitGetBranchesList(repodir),
+                showBranches=showBranches,
+                showHead=showHead,
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev = dlg.getRevision()
             else:
                 return False
-        
+
         args = self.initCommand("bisect")
         if subcommand == "start_extended":
             from .GitBisectStartDialog import GitBisectStartDialog
+
             dlg = GitBisectStartDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 bad, good, noCheckout = dlg.getData()
@@ -2622,34 +2714,34 @@
             if rev:
                 args.extend(rev.split())
                 # treat rev as a list separated by whitespace
-        
-        dia = GitDialog(
-            self.tr('Git Bisect ({0})').format(subcommand), self)
+
+        dia = GitDialog(self.tr("Git Bisect ({0})").format(subcommand), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.checkVCSStatus()
-        
+
         return res
-    
+
     def gitBisectLogBrowser(self, projectDir):
         """
         Public method used to browse the bisect log of the project.
-        
+
         @param projectDir name of the project directory (string)
         """
         if self.bisectlogBrowser is None:
             from .GitBisectLogBrowserDialog import GitBisectLogBrowserDialog
+
             self.bisectlogBrowser = GitBisectLogBrowserDialog(self)
         self.bisectlogBrowser.show()
         self.bisectlogBrowser.raise_()
         self.bisectlogBrowser.start(projectDir)
-    
+
     def gitBisectCreateReplayFile(self, projectDir):
         """
         Public method used to create a bisect replay file for the project.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2658,31 +2750,34 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("bisect")
         args.append("log")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('git'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("git"),
+            )
             return
-        
+
         if output:
             fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
                 None,
@@ -2690,11 +2785,12 @@
                 self.__lastBundlePath or repodir,
                 self.tr("Git Bisect Replay Files (*.replay)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite)
-            
+                EricFileDialog.DontConfirmOverwrite,
+            )
+
             if not fname:
                 return  # user aborted
-            
+
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2704,14 +2800,16 @@
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Create Bisect Replay File"),
-                    self.tr("<p>The Git bisect replay file <b>{0}</b> "
-                            "already exists. Overwrite it?</p>")
-                        .format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The Git bisect replay file <b>{0}</b> "
+                        "already exists. Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
             self.__lastReplayPath = str(fpath.parent)
-            
+
             try:
                 with fpath.open("w") as f:
                     f.write(output)
@@ -2721,13 +2819,14 @@
                     self.tr("Create Bisect Replay File"),
                     self.tr(
                         """<p>The file <b>{0}</b> could not be written.</p>"""
-                        """<p>Reason: {1}</p>""")
-                    .format(fpath, str(err)))
-    
+                        """<p>Reason: {1}</p>"""
+                    ).format(fpath, str(err)),
+                )
+
     def gitBisectEditReplayFile(self, projectDir):
         """
         Public method used to edit a bisect replay file.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2736,22 +2835,23 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("Edit Bisect Replay File"),
             self.__lastReplayPath or repodir,
-            self.tr("Git Bisect Replay Files (*.replay);;All Files (*)"))
+            self.tr("Git Bisect Replay Files (*.replay);;All Files (*)"),
+        )
         if fname:
             self.__lastReplayPath = os.path.dirname(fname)
-            
+
             self.bisectReplayEditor = MiniEditor(fname)
             self.bisectReplayEditor.show()
-    
+
     def gitBisectReplay(self, projectDir):
         """
         Public method to replay a bisect session.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating, that the update contained an add
             or delete (boolean)
@@ -2762,67 +2862,69 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = False
         fname = EricFileDialog.getOpenFileName(
             None,
             self.tr("Bisect Replay"),
             self.__lastReplayPath or repodir,
-            self.tr("Git Bisect Replay Files (*.replay);;All Files (*)"))
+            self.tr("Git Bisect Replay Files (*.replay);;All Files (*)"),
+        )
         if fname:
             self.__lastReplayPath = os.path.dirname(fname)
-            
+
             args = self.initCommand("bisect")
             args.append("replay")
             args.append(fname)
-            
-            dia = GitDialog(
-                self.tr('Git Bisect ({0})').format("replay"), self)
+
+            dia = GitDialog(self.tr("Git Bisect ({0})").format("replay"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
             self.checkVCSStatus()
-        
+
         return res
-    
+
     ###########################################################################
     ## Methods for remotes handling.
     ###########################################################################
-    
+
     def gitGetRemotesList(self, repodir):
         """
         Public method to get the list of remote repos.
-        
+
         @param repodir directory name of the repository (string)
         @return list of remote repos (list of string)
         """
         args = self.initCommand("remote")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         remotesList = []
         if output:
             for line in output.splitlines():
                 name = line.strip()
                 remotesList.append(name)
-        
+
         return remotesList
-    
+
     def gitGetRemoteUrlsList(self, repodir, forFetch=True):
         """
         Public method to get the list of remote repos and their URLs.
-        
+
         @param repodir directory name of the repository (string)
         @param forFetch flag indicating to get Fetch info (string)
         @return list of tuples of remote repo name and repo URL (list of
@@ -2830,36 +2932,37 @@
         """
         args = self.initCommand("remote")
         args.append("--verbose")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         remotesList = []
         if output:
             for line in output.splitlines():
                 name, urlmode = line.strip().split(None, 1)
                 url, mode = urlmode.rsplit(None, 1)
-                if (
-                    (forFetch and mode == "(fetch)") or
-                    ((not forFetch) and mode == "(push)")
+                if (forFetch and mode == "(fetch)") or (
+                    (not forFetch) and mode == "(push)"
                 ):
                     remotesList.append((name, url))
-        
+
         return remotesList
-    
+
     def gitGetRemoteUrl(self, repodir, remoteName):
         """
         Public method to get the URL of a remote repository.
-        
+
         @param repodir directory name of the repository
         @type str
         @param remoteName name of the remote repository
@@ -2870,25 +2973,27 @@
         args = self.initCommand("remote")
         args.append("get-url")
         args.append(remoteName)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace').strip()
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                ).strip()
+
         return output
-    
+
     def gitGetRemoteBranchesList(self, repodir, remote):
         """
         Public method to get the list of a remote repository branches.
-        
+
         @param repodir directory name of the repository (string)
         @param remote remote repository name (string)
         @return list of remote repository branches (list of string)
@@ -2896,31 +3001,33 @@
         args = self.initCommand("ls-remote")
         args.append("--heads")
         args.append(remote)
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         remoteBranches = []
         if output:
             for line in output.splitlines():
                 branch = line.strip().split()[-1].split("/")[-1]
                 remoteBranches.append(branch)
-        
+
         return remoteBranches
-    
+
     def gitShowRemote(self, projectDir, remoteName):
         """
         Public method to show information about a remote repository.
-        
+
         @param projectDir name of the project directory (string)
         @param remoteName name of the remote repository (string)
         """
@@ -2930,35 +3037,34 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("remote")
         args.append("show")
         args.append(remoteName)
-        
-        dia = GitDialog(self.tr('Show Remote Info'), self)
+
+        dia = GitDialog(self.tr("Show Remote Info"), self)
         res = dia.startProcess(args, repodir, showArgs=False)
         if res:
             dia.exec()
-    
+
     def gitShowRemotes(self, projectDir):
         """
         Public method to show available remote repositories.
-        
+
         @param projectDir name of the project directory (string)
         """
         if self.remotesDialog is None:
-            from .GitRemoteRepositoriesDialog import (
-                GitRemoteRepositoriesDialog
-            )
+            from .GitRemoteRepositoriesDialog import GitRemoteRepositoriesDialog
+
             self.remotesDialog = GitRemoteRepositoriesDialog(self)
         self.remotesDialog.show()
         self.remotesDialog.raise_()
         self.remotesDialog.start(projectDir)
-    
+
     def gitAddRemote(self, projectDir):
         """
         Public method to add a remote repository.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -2967,8 +3073,9 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitAddRemoteDialog import GitAddRemoteDialog
+
         dlg = GitAddRemoteDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, url = dlg.getData()
@@ -2976,14 +3083,13 @@
             args.append("add")
             args.append(name)
             args.append(url)
-            
-            self.startSynchronizedProcess(QProcess(), "git", args,
-                                          workingDir=repodir)
-    
+
+            self.startSynchronizedProcess(QProcess(), "git", args, workingDir=repodir)
+
     def gitRenameRemote(self, projectDir, remoteName):
         """
         Public method to rename a remote repository.
-        
+
         @param projectDir name of the project directory (string)
         @param remoteName name of the remote repository (string)
         """
@@ -2993,25 +3099,25 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         newName, ok = QInputDialog.getText(
             None,
             self.tr("Rename Remote Repository"),
             self.tr("Enter new name for remote repository:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and newName and newName != remoteName:
             args = self.initCommand("remote")
             args.append("rename")
             args.append(remoteName)
             args.append(newName)
-            
-            self.startSynchronizedProcess(QProcess(), "git", args,
-                                          workingDir=repodir)
-    
+
+            self.startSynchronizedProcess(QProcess(), "git", args, workingDir=repodir)
+
     def gitChangeRemoteUrl(self, projectDir, remoteName, remoteUrl=""):
         """
         Public method to change the URL of a remote repository.
-        
+
         @param projectDir name of the project directory
         @type str
         @param remoteName name of the remote repository
@@ -3025,11 +3131,12 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         if not remoteUrl:
             remoteUrl = self.gitGetRemoteUrl(repodir, remoteName)
-        
+
         from .GitChangeRemoteUrlDialog import GitChangeRemoteUrlDialog
+
         dlg = GitChangeRemoteUrlDialog(remoteName, remoteUrl)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, url = dlg.getData()
@@ -3038,14 +3145,15 @@
                 args.append("set-url")
                 args.append(name)
                 args.append(url)
-                
-                self.startSynchronizedProcess(QProcess(), "git", args,
-                                              workingDir=repodir)
-    
+
+                self.startSynchronizedProcess(
+                    QProcess(), "git", args, workingDir=repodir
+                )
+
     def gitChangeRemoteCredentials(self, projectDir, remoteName, remoteUrl=""):
         """
         Public method to change the user credentials of a remote repository.
-        
+
         @param projectDir name of the project directory
         @type str
         @param remoteName name of the remote repository
@@ -3059,11 +3167,12 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         if not remoteUrl:
             remoteUrl = self.gitGetRemoteUrl(repodir, remoteName)
-        
+
         from .GitRemoteCredentialsDialog import GitRemoteCredentialsDialog
+
         dlg = GitRemoteCredentialsDialog(remoteName, remoteUrl)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, url = dlg.getData()
@@ -3072,14 +3181,15 @@
                 args.append("set-url")
                 args.append(name)
                 args.append(url)
-                
-                self.startSynchronizedProcess(QProcess(), "git", args,
-                                              workingDir=repodir)
-    
+
+                self.startSynchronizedProcess(
+                    QProcess(), "git", args, workingDir=repodir
+                )
+
     def gitRemoveRemote(self, projectDir, remoteName):
         """
         Public method to remove a remote repository.
-        
+
         @param projectDir name of the project directory (string)
         @param remoteName name of the remote repository (string)
         """
@@ -3089,18 +3199,17 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("remote")
         args.append("remove")
         args.append(remoteName)
-        
-        self.startSynchronizedProcess(QProcess(), "git", args,
-                                      workingDir=repodir)
-    
+
+        self.startSynchronizedProcess(QProcess(), "git", args, workingDir=repodir)
+
     def gitPruneRemote(self, projectDir, remoteName):
         """
         Public method to prune stale remote-tracking branches.
-        
+
         @param projectDir name of the project directory (string)
         @param remoteName name of the remote repository (string)
         """
@@ -3110,21 +3219,21 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("remote")
         args.append("prune")
         args.append(remoteName)
-        
-        dia = GitDialog(self.tr('Show Remote Info'), self)
+
+        dia = GitDialog(self.tr("Show Remote Info"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
-    
+
     def gitShortlog(self, projectDir, commit):
         """
         Public method to show a short log suitable for inclusion in release
         announcements.
-        
+
         @param projectDir name of the project directory (string)
         @param commit commit to start the log at (strings)
         """
@@ -3134,40 +3243,41 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("shortlog")
         args.append("-w")
         args.append(commit)
-        
-        dia = GitDialog(self.tr('Show Shortlog'), self)
+
+        dia = GitDialog(self.tr("Show Shortlog"), self)
         res = dia.startProcess(args, repodir, showArgs=False)
         if res:
             dia.exec()
-    
+
     def gitDescribe(self, projectDir, commits):
         """
         Public method to find the most recent tag reachable from each commit.
-        
+
         @param projectDir name of the project directory (string)
         @param commits list of commits to start the search from
             (list of strings)
         """
         if self.describeDialog is None:
             from .GitDescribeDialog import GitDescribeDialog
+
             self.describeDialog = GitDescribeDialog(self)
         self.describeDialog.show()
         self.describeDialog.raise_()
         self.describeDialog.start(projectDir, commits)
-    
+
     ###########################################################################
     ## Methods for cherry-pick handling.
     ###########################################################################
-    
+
     def gitCherryPick(self, projectDir, commits=None):
         """
         Public method to cherry pick commits and apply them to the current
         branch.
-        
+
         @param projectDir name of the project directory (string)
         @param commits list of commits to be applied (list of strings)
         @return flag indicating that the project should be reread (boolean)
@@ -3178,16 +3288,15 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = False
-        
+
         from .GitCherryPickDialog import GitCherryPickDialog
+
         dlg = GitCherryPickDialog(commits)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            commits, cherrypickInfo, signoff, nocommit = (
-                dlg.getData()
-            )
-            
+            commits, cherrypickInfo, signoff, nocommit = dlg.getData()
+
             args = self.initCommand("cherry-pick")
             args.append("-Xpatience")
             if cherrypickInfo:
@@ -3197,20 +3306,20 @@
             if nocommit:
                 args.append("--no-commit")
             args.extend(commits)
-            
-            dia = GitDialog(self.tr('Cherry-pick'), self)
+
+            dia = GitDialog(self.tr("Cherry-pick"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.checkVCSStatus()
         return res
-    
+
     def gitCherryPickContinue(self, projectDir):
         """
         Public method to continue the last copying session after conflicts
         were resolved.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating that the project should be reread (boolean)
         """
@@ -3220,27 +3329,27 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         import sys
+
         editor = sys.argv[0].replace(".py", "_editor.py")
-        env = {"GIT_EDITOR": "{0} {1}".format(
-            Globals.getPythonExecutable(), editor)}
-        
+        env = {"GIT_EDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor)}
+
         args = self.initCommand("cherry-pick")
         args.append("--continue")
-        
-        dia = GitDialog(self.tr('Copy Changesets (Continue)'), self)
+
+        dia = GitDialog(self.tr("Copy Changesets (Continue)"), self)
         res = dia.startProcess(args, repodir, environment=env)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.checkVCSStatus()
         return res
-    
+
     def gitCherryPickQuit(self, projectDir):
         """
         Public method to quit the current copying operation.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating that the project should be reread (boolean)
         """
@@ -3250,23 +3359,23 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         args = self.initCommand("cherry-pick")
         args.append("--quit")
-        
-        dia = GitDialog(self.tr('Copy Changesets (Quit)'), self)
+
+        dia = GitDialog(self.tr("Copy Changesets (Quit)"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.checkVCSStatus()
         return res
-    
+
     def gitCherryPickAbort(self, projectDir):
         """
         Public method to cancel the last copying session and return to
         the previous state.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating that the project should be reread (boolean)
         """
@@ -3276,26 +3385,26 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         args = self.initCommand("cherry-pick")
         args.append("--abort")
-        
-        dia = GitDialog(self.tr('Copy Changesets (Cancel)'), self)
+
+        dia = GitDialog(self.tr("Copy Changesets (Cancel)"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.checkVCSStatus()
         return res
-    
+
     ###########################################################################
     ## Methods for stash handling.
     ###########################################################################
-    
+
     def __gitGetStashesList(self, projectDir):
         """
         Private method to get a list of stash names.
-        
+
         @param projectDir name of the project directory (string)
         @return list of available stashes (list of string)
         """
@@ -3305,33 +3414,35 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return []
-        
+
         args = self.initCommand("stash")
         args.append("list")
         args.append("--format=format:%gd")
-        
+
         stashesList = []
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         if output:
             stashesList = output.strip().splitlines()
-        
+
         return stashesList
-    
+
     def gitStashSave(self, projectDir):
         """
         Public method to save the current changes to a new stash.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating, that the save contained an add
             or delete (boolean)
@@ -3342,9 +3453,10 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = False
         from .GitStashDataDialog import GitStashDataDialog
+
         dlg = GitStashDataDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             message, keepIndex, untracked = dlg.getData()
@@ -3358,32 +3470,33 @@
                 args.append("--all")
             if message:
                 args.append(message)
-            
-            dia = GitDialog(self.tr('Saving stash'), self)
+
+            dia = GitDialog(self.tr("Saving stash"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
             self.checkVCSStatus()
         return res
-    
+
     def gitStashBrowser(self, projectDir):
         """
         Public method used to browse the stashed changes.
-        
+
         @param projectDir name of the project directory (string)
         """
         if self.stashBrowser is None:
             from .GitStashBrowserDialog import GitStashBrowserDialog
+
             self.stashBrowser = GitStashBrowserDialog(self)
         self.stashBrowser.show()
         self.stashBrowser.raise_()
         self.stashBrowser.start(projectDir)
-    
+
     def gitStashShowPatch(self, projectDir, stashName=""):
         """
         Public method to show the contents of a stash.
-        
+
         @param projectDir name of the project directory (string)
         @param stashName name of a stash (string)
         """
@@ -3393,7 +3506,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         if not stashName:
             availableStashes = self.__gitGetStashesList(repodir)
             stashName, ok = QInputDialog.getItem(
@@ -3401,21 +3514,24 @@
                 self.tr("Show Stash"),
                 self.tr("Select a stash (empty for latest stash):"),
                 [""] + availableStashes,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return
-        
+
         if self.diff is None:
             from .GitDiffDialog import GitDiffDialog
+
             self.diff = GitDiffDialog(self)
         self.diff.show()
         self.diff.raise_()
         self.diff.start(repodir, diffMode="stash", stashName=stashName)
-    
+
     def gitStashApply(self, projectDir, stashName=""):
         """
         Public method to apply a stash but keep it.
-        
+
         @param projectDir name of the project directory (string)
         @param stashName name of a stash (string)
         @return flag indicating, that the restore contained an add
@@ -3427,7 +3543,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         if not stashName:
             availableStashes = self.__gitGetStashesList(repodir)
             stashName, ok = QInputDialog.getItem(
@@ -3435,27 +3551,29 @@
                 self.tr("Restore Stash"),
                 self.tr("Select a stash (empty for latest stash):"),
                 [""] + availableStashes,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return False
-        
+
         args = self.initCommand("stash")
         args.append("apply")
         if stashName:
             args.append(stashName)
-        
-        dia = GitDialog(self.tr('Restoring stash'), self)
+
+        dia = GitDialog(self.tr("Restoring stash"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def gitStashPop(self, projectDir, stashName=""):
         """
         Public method to apply a stash and delete it.
-        
+
         @param projectDir name of the project directory (string)
         @param stashName name of a stash (string)
         @return flag indicating, that the restore contained an add
@@ -3467,7 +3585,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         if not stashName:
             availableStashes = self.__gitGetStashesList(repodir)
             stashName, ok = QInputDialog.getItem(
@@ -3475,27 +3593,29 @@
                 self.tr("Restore Stash"),
                 self.tr("Select a stash (empty for latest stash):"),
                 [""] + availableStashes,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return False
-        
+
         args = self.initCommand("stash")
         args.append("pop")
         if stashName:
             args.append(stashName)
-        
-        dia = GitDialog(self.tr('Restoring stash'), self)
+
+        dia = GitDialog(self.tr("Restoring stash"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def gitStashBranch(self, projectDir, stashName=""):
         """
         Public method to create a branch from a stash.
-        
+
         @param projectDir name of the project directory (string)
         @param stashName name of a stash (string)
         @return flag indicating, that the restore contained an add
@@ -3507,15 +3627,16 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         branchName, ok = QInputDialog.getText(
             None,
             self.tr("Create Branch"),
             self.tr("Enter a branch name to restore a stash to:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if not ok or branchName == "":
             return False
-        
+
         if not stashName:
             availableStashes = self.__gitGetStashesList(repodir)
             stashName, ok = QInputDialog.getItem(
@@ -3523,28 +3644,30 @@
                 self.tr("Create Branch"),
                 self.tr("Select a stash (empty for latest stash):"),
                 [""] + availableStashes,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return False
-        
+
         args = self.initCommand("stash")
         args.append("branch")
         args.append(branchName)
         if stashName:
             args.append(stashName)
-        
-        dia = GitDialog(self.tr('Creating branch'), self)
+
+        dia = GitDialog(self.tr("Creating branch"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def gitStashDrop(self, projectDir, stashName=""):
         """
         Public method to delete a stash.
-        
+
         @param projectDir name of the project directory (string)
         @param stashName name of a stash (string)
         @return flag indicating a successful deletion (boolean)
@@ -3555,7 +3678,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         if not stashName:
             availableStashes = self.__gitGetStashesList(repodir)
             stashName, ok = QInputDialog.getItem(
@@ -3563,31 +3686,35 @@
                 self.tr("Show Stash"),
                 self.tr("Select a stash (empty for latest stash):"),
                 [""] + availableStashes,
-                0, False)
+                0,
+                False,
+            )
             if not ok:
                 return False
-        
+
         res = EricMessageBox.yesNo(
             None,
             self.tr("Delete Stash"),
-            self.tr("""Do you really want to delete the stash <b>{0}</b>?""")
-            .format(stashName))
+            self.tr("""Do you really want to delete the stash <b>{0}</b>?""").format(
+                stashName
+            ),
+        )
         if res:
             args = self.initCommand("stash")
             args.append("drop")
             if stashName:
                 args.append(stashName)
-            
-            dia = GitDialog(self.tr('Deleting stash'), self)
+
+            dia = GitDialog(self.tr("Deleting stash"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
         return res
-    
+
     def gitStashClear(self, projectDir):
         """
         Public method to delete all stashes.
-        
+
         @param projectDir name of the project directory (string)
         @return flag indicating a successful deletion (boolean)
         """
@@ -3597,25 +3724,26 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return False
-        
+
         res = EricMessageBox.yesNo(
             None,
             self.tr("Delete All Stashes"),
-            self.tr("""Do you really want to delete all stashes?"""))
+            self.tr("""Do you really want to delete all stashes?"""),
+        )
         if res:
             args = self.initCommand("stash")
             args.append("clear")
-            
-            dia = GitDialog(self.tr('Deleting all stashes'), self)
+
+            dia = GitDialog(self.tr("Deleting all stashes"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
         return res
-    
+
     def gitEditConfig(self, projectDir):
         """
         Public method used to edit the repository configuration file.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3624,7 +3752,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         cfgFile = os.path.join(repodir, self.adminDir, "config")
         if not os.path.exists(cfgFile):
             # create an empty one
@@ -3632,32 +3760,33 @@
                 pass
         self.repoEditor = MiniEditor(cfgFile, "Properties")
         self.repoEditor.show()
-    
+
     def gitEditUserConfig(self):
         """
         Public method used to edit the user configuration file.
         """
         from .GitUtilities import getConfigPath
+
         cfgFile = getConfigPath()
         if not os.path.exists(cfgFile):
             from .GitUserConfigDataDialog import GitUserConfigDataDialog
+
             dlg = GitUserConfigDataDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 firstName, lastName, email = dlg.getData()
             else:
-                firstName, lastName, email = (
-                    "Firstname", "Lastname", "email_address")
+                firstName, lastName, email = ("Firstname", "Lastname", "email_address")
             with contextlib.suppress(OSError), open(cfgFile, "w") as f:
                 f.write("[user]\n")
                 f.write("    name = {0} {1}\n".format(firstName, lastName))
                 f.write("    email = {0}\n".format(email))
         self.userEditor = MiniEditor(cfgFile, "Properties")
         self.userEditor.show()
-    
+
     def gitShowConfig(self, projectDir):
         """
         Public method to show the combined configuration.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3666,22 +3795,20 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("config")
         args.append("--list")
-        
-        dia = GitDialog(
-            self.tr('Showing the combined configuration settings'),
-            self)
+
+        dia = GitDialog(self.tr("Showing the combined configuration settings"), self)
         res = dia.startProcess(args, repodir, False)
         if res:
             dia.exec()
-    
+
     def gitVerify(self, projectDir):
         """
         Public method to verify the connectivity and validity of objects
         of the database.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3690,23 +3817,21 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("fsck")
         args.append("--strict")
         args.append("--full")
         args.append("--cache")
-        
-        dia = GitDialog(
-            self.tr('Verifying the integrity of the Git repository'),
-            self)
+
+        dia = GitDialog(self.tr("Verifying the integrity of the Git repository"), self)
         res = dia.startProcess(args, repodir, False)
         if res:
             dia.exec()
-    
+
     def gitHouseKeeping(self, projectDir):
         """
         Public method to cleanup and optimize the local repository.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3715,23 +3840,21 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("gc")
         args.append("--prune")
         if self.__plugin.getPreferences("AggressiveGC"):
             args.append("--aggressive")
-        
-        dia = GitDialog(
-            self.tr('Performing Repository Housekeeping'),
-            self)
+
+        dia = GitDialog(self.tr("Performing Repository Housekeeping"), self)
         res = dia.startProcess(args, repodir)
         if res:
             dia.exec()
-    
+
     def gitStatistics(self, projectDir):
         """
         Public method to show some statistics of the local repository.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3740,103 +3863,120 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         args = self.initCommand("count-objects")
         args.append("-v")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         info = []
         if output:
             statistics = {}
             for line in output.splitlines():
                 key, value = line.strip().split(": ", 1)
                 statistics[key] = value
-            
+
             info.append("""<p><table>""")
             info.append(self.tr("""<tr><td><b>Statistics</b></td></tr>"""))
             info.append(
-                self.tr("""<tr><td>Number of loose objects: </td>"""
-                        """<td>{0}</td></tr>""")
-                    .format(statistics["count"]))
+                self.tr(
+                    """<tr><td>Number of loose objects: </td>""" """<td>{0}</td></tr>"""
+                ).format(statistics["count"])
+            )
             info.append(
-                self.tr("""<tr><td>Disk space used by loose objects: </td>"""
-                        """<td>{0} KiB</td></tr>""")
-                    .format(statistics["size"]))
+                self.tr(
+                    """<tr><td>Disk space used by loose objects: </td>"""
+                    """<td>{0} KiB</td></tr>"""
+                ).format(statistics["size"])
+            )
             info.append(
-                self.tr("""<tr><td>Number of packed objects: </td>"""
-                        """<td>{0}</td></tr>""")
-                    .format(statistics["in-pack"]))
+                self.tr(
+                    """<tr><td>Number of packed objects: </td>"""
+                    """<td>{0}</td></tr>"""
+                ).format(statistics["in-pack"])
+            )
             info.append(
-                self.tr("""<tr><td>Number of packs: </td>"""
-                        """<td>{0}</td></tr>""")
-                    .format(statistics["packs"]))
+                self.tr(
+                    """<tr><td>Number of packs: </td>""" """<td>{0}</td></tr>"""
+                ).format(statistics["packs"])
+            )
             info.append(
-                self.tr("""<tr><td>Disk space used by packed objects: </td>"""
-                        """<td>{0} KiB</td></tr>""")
-                    .format(statistics["size-pack"]))
-            info.append(
-                self.tr("""<tr><td>Packed objects waiting for pruning: </td>"""
-                        """<td>{0}</td></tr>""")
-                    .format(statistics["prune-packable"]))
+                self.tr(
+                    """<tr><td>Disk space used by packed objects: </td>"""
+                    """<td>{0} KiB</td></tr>"""
+                ).format(statistics["size-pack"])
+            )
             info.append(
-                self.tr("""<tr><td>Garbage files: </td>"""
-                        """<td>{0}</td></tr>""")
-                    .format(statistics["garbage"]))
+                self.tr(
+                    """<tr><td>Packed objects waiting for pruning: </td>"""
+                    """<td>{0}</td></tr>"""
+                ).format(statistics["prune-packable"])
+            )
             info.append(
-                self.tr("""<tr><td>Disk space used by garbage files: </td>"""
-                        """<td>{0} KiB</td></tr>""")
-                    .format(statistics["size-garbage"]))
+                self.tr(
+                    """<tr><td>Garbage files: </td>""" """<td>{0}</td></tr>"""
+                ).format(statistics["garbage"])
+            )
+            info.append(
+                self.tr(
+                    """<tr><td>Disk space used by garbage files: </td>"""
+                    """<td>{0} KiB</td></tr>"""
+                ).format(statistics["size-garbage"])
+            )
             info.append("""</table></p>""")
         else:
             info.append(self.tr("<p><b>No statistics available.</b></p>"))
         dlg = VcsRepositoryInfoDialog(None, "\n".join(info))
         dlg.exec()
-    
+
     def gitGetArchiveFormats(self, repodir):
         """
         Public method to get a list of supported archive formats.
-        
+
         @param repodir directory name of the repository (string)
         @return list of supported archive formats (list of strings)
         """
         args = self.initCommand("archive")
         args.append("--list")
-        
+
         output = ""
         process = QProcess()
         process.setWorkingDirectory(repodir)
-        process.start('git', args)
+        process.start("git", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-        
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
+
         archiveFormats = []
         if output:
             for line in output.splitlines():
                 archiveFormat = line.strip()
                 archiveFormats.append(archiveFormat)
-        
+
         return archiveFormats
-    
+
     def gitCreateArchive(self, projectDir):
         """
         Public method to show some statistics of the local repository.
-        
+
         @param projectDir name of the project directory (string)
         """
         # find the root of the repo
@@ -3845,12 +3985,13 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitArchiveDataDialog import GitArchiveDataDialog
+
         dlg = GitArchiveDataDialog(
             self.gitGetTagsList(repodir),
             self.gitGetBranchesList(repodir, withMaster=True),
-            self.gitGetArchiveFormats(repodir)
+            self.gitGetArchiveFormats(repodir),
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             commit, archiveFormat, fileName, prefix = dlg.getData()
@@ -3863,22 +4004,20 @@
                     prefix += "/"
                 args.append("--prefix={0}".format(prefix))
             args.append(commit)
-            
-            dia = GitDialog(
-                self.tr('Creating Archive'),
-                self)
+
+            dia = GitDialog(self.tr("Creating Archive"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     ###########################################################################
     ## Methods related to submodules.
     ###########################################################################
-    
+
     def gitSubmoduleAdd(self, projectDir):
         """
         Public method to add a submodule to the project.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -3888,8 +4027,9 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         from .GitSubmoduleAddDialog import GitSubmoduleAddDialog
+
         dlg = GitSubmoduleAddDialog(self, repodir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             repo, branch, name, path, force = dlg.getData()
@@ -3906,18 +4046,16 @@
             args.append(repo)
             if path:
                 args.append(path)
-            
-            dia = GitDialog(
-                self.tr("Add Submodule"),
-                self)
+
+            dia = GitDialog(self.tr("Add Submodule"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def __gitSubmodulesList(self, repodir):
         """
         Private method to get the data of defined submodules.
-        
+
         @param repodir name of the directory containing the repo subdirectory
         @type str
         @return list of dictionaries with submodule name, path, URL and branch
@@ -3926,14 +4064,14 @@
         submodulesFile = os.path.join(repodir, ".gitmodules")
         if not os.path.exists(submodulesFile):
             return []
-        
+
         try:
             with open(submodulesFile, "r") as modulesFile:
                 contents = modulesFile.readlines()
         except OSError:
             # silently ignore them
             return []
-        
+
         submodules = []
         submoduleDict = None
         for line in contents:
@@ -3951,13 +4089,13 @@
             if "branch" not in submoduleDict:
                 submoduleDict["branch"] = ""
             submodules.append(submoduleDict)
-        
+
         return submodules
-    
+
     def gitSubmoduleList(self, projectDir):
         """
         Public method to show a list of all submodules of the project.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -3967,22 +4105,24 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         submodulesList = self.__gitSubmodulesList(repodir)
         if submodulesList:
             from .GitSubmodulesListDialog import GitSubmodulesListDialog
+
             dlg = GitSubmodulesListDialog(submodulesList)
             dlg.exec()
         else:
             EricMessageBox.information(
                 None,
                 self.tr("List Submodules"),
-                self.tr("""No submodules defined for the project."""))
-    
+                self.tr("""No submodules defined for the project."""),
+            )
+
     def __selectSubmodulePath(self, repodir):
         """
         Private method to select a submodule path.
-        
+
         @param repodir name of the directory containing the repo subdirectory
         @type str
         @return tuple of selected submodule path and flag indicating
@@ -3990,44 +4130,45 @@
         @rtype tuple of (str, bool)
         """
         allEntry = self.tr("All")
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
         submodulePath, ok = QInputDialog.getItem(
             None,
             self.tr("Submodule Path"),
             self.tr("Select a submodule path:"),
             [allEntry] + sorted(paths),
-            0, False)
+            0,
+            False,
+        )
         if submodulePath == allEntry:
             submodulePath = ""
-        
+
         return submodulePath, ok
-    
+
     def __selectSubmodulePaths(self, repodir):
         """
         Private method to select a list of submodule paths.
-        
+
         @param repodir name of the directory containing the repo subdirectory
         @type str
         @return tuple of selected submodule paths and flag indicating
             a cancellation
         @rtype tuple of (list of str, bool)
         """
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
-        
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
+
         from .GitListDialog import GitListDialog
+
         dlg = GitListDialog(sorted(paths))
         if dlg.exec() == QDialog.DialogCode.Accepted:
             selectedPaths = dlg.getSelection()
             return selectedPaths, True
         else:
             return [], False
-    
+
     def gitSubmoduleInit(self, projectDir):
         """
         Public method to initialize one or all submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -4037,24 +4178,22 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         submodulePaths, ok = self.__selectSubmodulePaths(repodir)
         if ok:
             args = self.initCommand("submodule")
             args.append("init")
             args.extend(submodulePaths)
-            
-            dia = GitDialog(
-                self.tr("Initialize Submodules"),
-                self)
+
+            dia = GitDialog(self.tr("Initialize Submodules"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitSubmoduleDeinit(self, projectDir):
         """
         Public method to unregister submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -4064,11 +4203,11 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
-        
+
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
+
         from .GitSubmodulesDeinitDialog import GitSubmodulesDeinitDialog
+
         dlg = GitSubmodulesDeinitDialog(paths)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             deinitAll, submodulePaths, force = dlg.getData()
@@ -4080,18 +4219,16 @@
                 args.extend(submodulePaths)
             if force:
                 args.append("--force")
-            
-            dia = GitDialog(
-                self.tr("Unregister Submodules"),
-                self)
+
+            dia = GitDialog(self.tr("Unregister Submodules"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitSubmoduleUpdate(self, projectDir, initialize=False, remote=False):
         """
         Public method to update submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         @param initialize flag indicating an initialize and update operation
@@ -4105,7 +4242,7 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
+
         submodulePaths, ok = self.__selectSubmodulePaths(repodir)
         if ok:
             args = self.initCommand("submodule")
@@ -4115,19 +4252,17 @@
             if remote:
                 args.append("--remote")
             args.extend(submodulePaths)
-            
-            dia = GitDialog(
-                self.tr("Update Submodules"),
-                self)
+
+            dia = GitDialog(self.tr("Update Submodules"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitSubmoduleUpdateWithOptions(self, projectDir):
         """
         Public method to update submodules offering a dialog to select the
         update options.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -4137,19 +4272,15 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
-        
-        from .GitSubmodulesUpdateOptionsDialog import (
-            GitSubmodulesUpdateOptionsDialog
-        )
+
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
+
+        from .GitSubmodulesUpdateOptionsDialog import GitSubmodulesUpdateOptionsDialog
+
         dlg = GitSubmodulesUpdateOptionsDialog(paths)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            procedure, init, remote, noFetch, force, submodulePaths = (
-                dlg.getData()
-            )
-            
+            procedure, init, remote, noFetch, force, submodulePaths = dlg.getData()
+
             args = self.initCommand("submodule")
             args.append("update")
             args.append(procedure)
@@ -4162,18 +4293,16 @@
             if force:
                 args.append("--force")
             args.extend(submodulePaths)
-            
-            dia = GitDialog(
-                self.tr("Update Submodules"),
-                self)
+
+            dia = GitDialog(self.tr("Update Submodules"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitSubmoduleSync(self, projectDir):
         """
         Public method to synchronize submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -4183,11 +4312,11 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
-        
+
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
+
         from .GitSubmodulesSyncDialog import GitSubmodulesSyncDialog
+
         dlg = GitSubmodulesSyncDialog(paths)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             submodulePaths, recursive = dlg.getData()
@@ -4196,32 +4325,31 @@
             if recursive:
                 args.append("--recursive")
             args.extend(submodulePaths)
-            
-            dia = GitDialog(
-                self.tr("Synchronize Submodules"),
-                self)
+
+            dia = GitDialog(self.tr("Synchronize Submodules"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     def gitSubmoduleStatus(self, projectDir):
         """
         Public method to show the status of the submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         """
         if self.submoduleStatusDialog is None:
             from .GitSubmodulesStatusDialog import GitSubmodulesStatusDialog
+
             self.submoduleStatusDialog = GitSubmodulesStatusDialog(self)
         self.submoduleStatusDialog.show()
         self.submoduleStatusDialog.raise_()
         self.submoduleStatusDialog.start(projectDir)
-    
+
     def gitSubmoduleSummary(self, projectDir):
         """
         Public method to show the status of the submodules.
-        
+
         @param projectDir name of the project directory
         @type str
         """
@@ -4231,13 +4359,11 @@
             repodir = os.path.dirname(repodir)
             if os.path.splitdrive(repodir)[1] == os.sep:
                 return
-        
-        paths = [submodule["path"]
-                 for submodule in self.__gitSubmodulesList(repodir)]
-        
-        from .GitSubmodulesSummaryOptionsDialog import (
-            GitSubmodulesSummaryOptionsDialog
-        )
+
+        paths = [submodule["path"] for submodule in self.__gitSubmodulesList(repodir)]
+
+        from .GitSubmodulesSummaryOptionsDialog import GitSubmodulesSummaryOptionsDialog
+
         dlg = GitSubmodulesSummaryOptionsDialog(paths)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             submodulePaths, superProject, index, commit, limit = dlg.getData()
@@ -4255,24 +4381,21 @@
                 if submodulePaths:
                     args.append("--")
             args.extend(submodulePaths)
-            
-            dia = GitDialog(
-                self.tr("Submodules Summary"),
-                self)
+
+            dia = GitDialog(self.tr("Submodules Summary"), self)
             res = dia.startProcess(args, repodir)
             if res:
                 dia.exec()
-    
+
     ###########################################################################
     ## Methods to get the helper objects are below.
     ###########################################################################
-    
-    def vcsGetProjectBrowserHelper(self, browser, project,
-                                   isTranslationsBrowser=False):
+
+    def vcsGetProjectBrowserHelper(self, browser, project, isTranslationsBrowser=False):
         """
         Public method to instantiate a helper object for the different
         project browsers.
-        
+
         @param browser reference to the project browser object
         @param project reference to the project object
         @param isTranslationsBrowser flag indicating, the helper is requested
@@ -4280,13 +4403,13 @@
         @return the project browser helper object
         """
         from .ProjectBrowserHelper import GitProjectBrowserHelper
-        return GitProjectBrowserHelper(self, browser, project,
-                                       isTranslationsBrowser)
-        
+
+        return GitProjectBrowserHelper(self, browser, project, isTranslationsBrowser)
+
     def vcsGetProjectHelper(self, project):
         """
         Public method to instantiate a helper object for the project.
-        
+
         @param project reference to the project object
         @return the project helper object
         """
@@ -4302,11 +4425,12 @@
         """
         Protected method to create an instance of the VCS status monitor
         thread.
-        
+
         @param interval check interval for the monitor thread in seconds
             (integer)
         @param project reference to the project object (Project)
         @return reference to the monitor thread (QThread)
         """
         from .GitStatusMonitorThread import GitStatusMonitorThread
+
         return GitStatusMonitorThread(interval, project, self)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to select the heads to be closed.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the VCS object
         @type Hg
         @param parent reference to the parent widget
@@ -30,25 +31,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
         self.logEdit.setLanguageWithPWL(language, pwl or None, pel or None)
-        
+
         heads = self.__getHeads(vcs)
         for revision, branch in heads:
             QTreeWidgetItem(self.headsList, [revision, branch])
-    
+
     def __getHeads(self, vcs):
         """
         Private method to get the open heads.
-        
+
         @param vcs reference to the VCS object
         @type Hg
         @return list of tuples containing the revision and the corresponding
@@ -56,13 +55,13 @@
         @rtype list of tuples of (str, str)
         """
         args = vcs.initCommand("heads")
-        args.append('--template')
-        args.append('{node|short}@@@{branches}\n')
-        
+        args.append("--template")
+        args.append("{node|short}@@@{branches}\n")
+
         output = ""
         client = vcs.getClient()
         output, error = client.runcommand(args)
-        
+
         heads = []
         if output:
             for line in output.splitlines():
@@ -70,9 +69,9 @@
                 if line:
                     revision, branch = line.split("@@@")
                     heads.append((revision, branch))
-            
+
         return heads
-    
+
     @pyqtSlot()
     def on_headsList_itemSelectionChanged(self):
         """
@@ -81,16 +80,16 @@
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
             len(self.headsList.selectedItems()) > 0
         )
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple containing a list of selected revisions and the commit
             message
         @rtype tuple of (list of str, str)
         """
         revisions = [itm.text(0) for itm in self.headsList.selectedItems()]
         message = self.logEdit.toPlainText().strip()
-        
+
         return revisions, message
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,36 +20,43 @@
     """
     Class implementing the closehead extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgCloseheadAct = EricAction(
-            self.tr('Close Heads'),
+            self.tr("Close Heads"),
             UI.PixmapCache.getIcon("closehead"),
-            self.tr('Close Heads'),
-            0, 0, self, 'mercurial_closehead')
-        self.hgCloseheadAct.setStatusTip(self.tr(
-            'Close arbitrary heads without checking them out first'
-        ))
-        self.hgCloseheadAct.setWhatsThis(self.tr(
-            """<b>Close Heads</b>"""
-            """<p>This closes arbitrary heads without the need to check them"""
-            """ out first.</p>"""
-        ))
+            self.tr("Close Heads"),
+            0,
+            0,
+            self,
+            "mercurial_closehead",
+        )
+        self.hgCloseheadAct.setStatusTip(
+            self.tr("Close arbitrary heads without checking them out first")
+        )
+        self.hgCloseheadAct.setWhatsThis(
+            self.tr(
+                """<b>Close Heads</b>"""
+                """<p>This closes arbitrary heads without the need to check them"""
+                """ out first.</p>"""
+            )
+        )
         self.hgCloseheadAct.triggered.connect(self.__hgClosehead)
         self.actions.append(self.hgCloseheadAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu
         @type QMenu
         @return populated menu (QMenu)
@@ -57,20 +64,20 @@
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("closehead"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgCloseheadAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu
         @rtype str
         """
         return self.tr("Close Heads")
-    
+
     def __hgClosehead(self):
         """
         Private slot used to close arbitrary heads.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,45 +17,47 @@
     """
     Class implementing the strip extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         @type Hg
         """
         super().__init__(vcs)
-    
+
     def hgCloseheads(self, revisions=None):
         """
         Public method to close arbitrary heads.
-        
+
         @param revisions revisions of branch heads to be closed
         @type str
         """
         message = ""
         if not revisions:
             from .HgCloseHeadSelectionDialog import HgCloseHeadSelectionDialog
+
             dlg = HgCloseHeadSelectionDialog(self.vcs)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 revisions, message = dlg.getData()
-        
+
         if not revisions:
             # still no revisions given; abort...
             return
-        
+
         args = self.vcs.initCommand("close-head")
         if not message:
             if len(revisions) == 1:
-                message = self.tr("Revision <{0}> closed.").format(
-                    revisions[0])
+                message = self.tr("Revision <{0}> closed.").format(revisions[0])
             else:
                 message = self.tr("Revisions <{0}> closed.").format(
-                    ", ".join(revisions))
+                    ", ".join(revisions)
+                )
         args += ["--message", message]
         for revision in revisions:
             args += ["--rev", revision]
-        
+
         dia = HgDialog(self.tr("Closing Heads"), self.vcs)
         res = dia.startProcess(args)
         if res:
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,8 @@
 
 # Available protocols fpr the repository URL
 ConfigHgSchemes = (
-    'file',
-    'http',
-    'https',
-    'ssh',
+    "file",
+    "http",
+    "https",
+    "ssh",
 )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,9 +14,7 @@
 from EricWidgets.EricApplication import ericApp
 from EricWidgets.EricPathPicker import EricPathPickerModes
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_MercurialPage import Ui_MercurialPage
 from .. import HgUtilities
 
@@ -28,110 +26,112 @@
     """
     Class implementing the Mercurial configuration page.
     """
+
     def __init__(self, plugin):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("MercurialPage")
-        
+
         self.__plugin = plugin
-        
+
         self.hgPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         if Globals.isWindowsPlatform():
-            self.hgPicker.setFilters(self.tr(
-                "Executable Files (*.exe);;"
-                "All Files (*)"
-            ))
+            self.hgPicker.setFilters(
+                self.tr("Executable Files (*.exe);;" "All Files (*)")
+            )
         else:
             self.hgPicker.setFilters(self.tr("All Files (*)"))
-        
+
         self.encodingComboBox.addItems(sorted(supportedCodecs))
         self.encodingModeComboBox.addItems(["strict", "ignore", "replace"])
-        
+
         self.installButton.setEnabled(not self.__mercurialInstalled())
-        
+
         # set initial values
         # executable override
-        self.hgPicker.setText(
-            self.__plugin.getPreferences("MercurialExecutablePath"))
-        
+        self.hgPicker.setText(self.__plugin.getPreferences("MercurialExecutablePath"))
+
         # global options
-        index = self.encodingComboBox.findText(
-            self.__plugin.getPreferences("Encoding"))
+        index = self.encodingComboBox.findText(self.__plugin.getPreferences("Encoding"))
         self.encodingComboBox.setCurrentIndex(index)
         index = self.encodingModeComboBox.findText(
-            self.__plugin.getPreferences("EncodingMode"))
+            self.__plugin.getPreferences("EncodingMode")
+        )
         self.encodingModeComboBox.setCurrentIndex(index)
         self.hiddenChangesetsCheckBox.setChecked(
-            self.__plugin.getPreferences("ConsiderHidden"))
+            self.__plugin.getPreferences("ConsiderHidden")
+        )
         # log
-        self.logSpinBox.setValue(
-            self.__plugin.getPreferences("LogLimit"))
+        self.logSpinBox.setValue(self.__plugin.getPreferences("LogLimit"))
         self.logWidthSpinBox.setValue(
-            self.__plugin.getPreferences("LogMessageColumnWidth"))
+            self.__plugin.getPreferences("LogMessageColumnWidth")
+        )
         self.startFullLogCheckBox.setChecked(
-            self.__plugin.getPreferences("LogBrowserShowFullLog"))
+            self.__plugin.getPreferences("LogBrowserShowFullLog")
+        )
         # commit
         self.commitAuthorsSpinBox.setValue(
-            self.__plugin.getPreferences("CommitAuthorsLimit"))
+            self.__plugin.getPreferences("CommitAuthorsLimit")
+        )
         # pull
-        self.pullUpdateCheckBox.setChecked(
-            self.__plugin.getPreferences("PullUpdate"))
+        self.pullUpdateCheckBox.setChecked(self.__plugin.getPreferences("PullUpdate"))
         self.preferUnbundleCheckBox.setChecked(
-            self.__plugin.getPreferences("PreferUnbundle"))
+            self.__plugin.getPreferences("PreferUnbundle")
+        )
         # cleanup
-        self.cleanupPatternEdit.setText(
-            self.__plugin.getPreferences("CleanupPatterns"))
+        self.cleanupPatternEdit.setText(self.__plugin.getPreferences("CleanupPatterns"))
         # revert
-        self.backupCheckBox.setChecked(
-            self.__plugin.getPreferences("CreateBackup"))
+        self.backupCheckBox.setChecked(self.__plugin.getPreferences("CreateBackup"))
         # merge
         self.internalMergeCheckBox.setChecked(
-            self.__plugin.getPreferences("InternalMerge"))
-    
+            self.__plugin.getPreferences("InternalMerge")
+        )
+
     def save(self):
         """
         Public slot to save the Mercurial configuration.
         """
         # executable override
-        self.__plugin.setPreferences(
-            "MercurialExecutablePath", self.hgPicker.text())
+        self.__plugin.setPreferences("MercurialExecutablePath", self.hgPicker.text())
         # global options
+        self.__plugin.setPreferences("Encoding", self.encodingComboBox.currentText())
         self.__plugin.setPreferences(
-            "Encoding", self.encodingComboBox.currentText())
-        self.__plugin.setPreferences(
-            "EncodingMode", self.encodingModeComboBox.currentText())
+            "EncodingMode", self.encodingModeComboBox.currentText()
+        )
         self.__plugin.setPreferences(
-            "ConsiderHidden", self.hiddenChangesetsCheckBox.isChecked())
+            "ConsiderHidden", self.hiddenChangesetsCheckBox.isChecked()
+        )
         # log
+        self.__plugin.setPreferences("LogLimit", self.logSpinBox.value())
         self.__plugin.setPreferences(
-            "LogLimit", self.logSpinBox.value())
+            "LogMessageColumnWidth", self.logWidthSpinBox.value()
+        )
         self.__plugin.setPreferences(
-            "LogMessageColumnWidth", self.logWidthSpinBox.value())
-        self.__plugin.setPreferences(
-            "LogBrowserShowFullLog", self.startFullLogCheckBox.isChecked())
+            "LogBrowserShowFullLog", self.startFullLogCheckBox.isChecked()
+        )
         # commit
         self.__plugin.setPreferences(
-            "CommitAuthorsLimit", self.commitAuthorsSpinBox.value())
+            "CommitAuthorsLimit", self.commitAuthorsSpinBox.value()
+        )
         # pull
-        self.__plugin.setPreferences(
-            "PullUpdate", self.pullUpdateCheckBox.isChecked())
+        self.__plugin.setPreferences("PullUpdate", self.pullUpdateCheckBox.isChecked())
         self.__plugin.setPreferences(
-            "PreferUnbundle", self.preferUnbundleCheckBox.isChecked())
+            "PreferUnbundle", self.preferUnbundleCheckBox.isChecked()
+        )
         # cleanup
-        self.__plugin.setPreferences(
-            "CleanupPatterns", self.cleanupPatternEdit.text())
+        self.__plugin.setPreferences("CleanupPatterns", self.cleanupPatternEdit.text())
         # revert
-        self.__plugin.setPreferences(
-            "CreateBackup", self.backupCheckBox.isChecked())
+        self.__plugin.setPreferences("CreateBackup", self.backupCheckBox.isChecked())
         # merge
         self.__plugin.setPreferences(
-            "InternalMerge", self.internalMergeCheckBox.isChecked())
-    
+            "InternalMerge", self.internalMergeCheckBox.isChecked()
+        )
+
     @pyqtSlot()
     def on_configButton_clicked(self):
         """
@@ -139,24 +139,23 @@
         """
         from ..HgUserConfigDialog import HgUserConfigDialog
         from ..HgUtilities import hgVersion
-        
+
         dlg = HgUserConfigDialog(version=hgVersion(self.__plugin)[1])
         dlg.exec()
-    
+
     @pyqtSlot()
     def on_installButton_clicked(self):
         """
         Private slot to install Mercurial alongside eric7.
         """
         pip = ericApp().getObject("Pip")
-        pip.installPackages(["mercurial"],
-                            interpreter=Globals.getPythonExecutable())
+        pip.installPackages(["mercurial"], interpreter=Globals.getPythonExecutable())
         self.installButton.setEnabled(not self.__mercurialInstalled())
-    
+
     def __mercurialInstalled(self):
         """
         Private method to check, if Mercurial is installed alongside eric7.
-        
+
         @return flag indicating an installed Mercurial executable
         @rtype bool
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,11 @@
     """
     Class implementing a dialog to enter data for signing a revision.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,16 +35,14 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.messageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-        
+        self.messageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
@@ -52,21 +50,21 @@
         else:
             self.bookmarkButton.setHidden(True)
             self.bookmarkCombo.setHidden(True)
-        
+
         # connect various radio buttons and input fields
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
         self.branchButton.toggled.connect(self.__updateOK)
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -83,14 +81,13 @@
             enabled = enabled and self.bookmarkCombo.currentText() != ""
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple giving the revision, a flag indicating not to commit
             the signature, a commit message, an ID of the key to be used,
             a flag indicating a local signature and a flag indicating a forced
@@ -111,12 +108,12 @@
             rev = self.expressionEdit.text()
         else:
             rev = ""
-        
+
         return (
             rev,
             self.nocommitCheckBox.isChecked(),
             self.messageEdit.toPlainText(),
             self.keyEdit.text(),
             self.localCheckBox.isChecked(),
-            self.forceCheckBox.isChecked()
+            self.forceCheckBox.isChecked(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignaturesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignaturesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import re
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
 
 from .Ui_HgGpgSignaturesDialog import Ui_HgGpgSignaturesDialog
 
@@ -21,50 +19,49 @@
     """
     Class implementing a dialog showing signed changesets.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         self.errorGroup.hide()
-        
+
         self.intercept = False
         self.activateWindow()
-        
+
         args = self.vcs.initCommand("sigs")
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -74,63 +71,58 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if self.signaturesList.topLevelItemCount() == 0:
             # no patches present
             self.__generateItem("", "", self.tr("no signatures found"))
         self.__resizeColumns()
         self.__resort()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__hgClient.cancel()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.signaturesList.sortItems(
             self.signaturesList.sortColumn(),
-            self.signaturesList.header().sortIndicatorOrder())
-    
+            self.signaturesList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.signaturesList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.signaturesList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, revision, changeset, signature):
         """
         Private method to generate a patch item in the list of patches.
-        
+
         @param revision revision number (string)
         @param changeset changeset of the bookmark (string)
         @param signature signature of the changeset (string)
@@ -140,11 +132,13 @@
         else:
             revString = "{0:>7}:{1}".format(revision, changeset)
             topItems = self.signaturesList.findItems(
-                revString, Qt.MatchFlag.MatchExactly)
+                revString, Qt.MatchFlag.MatchExactly
+            )
             if len(topItems) == 0:
                 # first signature for this changeset
-                topItm = QTreeWidgetItem(self.signaturesList, [
-                    "{0:>7}:{1}".format(revision, changeset)])
+                topItm = QTreeWidgetItem(
+                    self.signaturesList, ["{0:>7}:{1}".format(revision, changeset)]
+                )
                 topItm.setExpanded(True)
                 font = topItm.font(0)
                 font.setBold(True)
@@ -152,11 +146,11 @@
             else:
                 topItm = topItems[0]
             QTreeWidgetItem(topItm, [signature])
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         li = line.split()
@@ -166,17 +160,17 @@
             del li[-1]
             signature = " ".join(li)
             self.__generateItem(rev, changeset, signature)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_signaturesList_itemSelectionChanged(self):
         """
@@ -184,43 +178,40 @@
         """
         selectedItems = self.signaturesList.selectedItems()
         if (
-            len(selectedItems) == 1 and
-            self.signaturesList.indexOfTopLevelItem(selectedItems[0]) != -1
+            len(selectedItems) == 1
+            and self.signaturesList.indexOfTopLevelItem(selectedItems[0]) != -1
         ):
             self.verifyButton.setEnabled(True)
         else:
             self.verifyButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def on_verifyButton_clicked(self):
         """
         Private slot to verify the signatures of the selected revision.
         """
-        rev = (
-            self.signaturesList.selectedItems()[0].text(0)
-            .split(":")[0].strip()
-        )
+        rev = self.signaturesList.selectedItems()[0].text(0).split(":")[0].strip()
         self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(rev)
-    
+
     @pyqtSlot(int)
     def on_categoryCombo_activated(self, index):
         """
         Private slot called, when a new filter category is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__filterSignatures()
-    
+
     @pyqtSlot(str)
     def on_rxEdit_textChanged(self, txt):
         """
         Private slot called, when a filter expression is entered.
-        
+
         @param txt filter expression (string)
         """
         self.__filterSignatures()
-    
+
     def __filterSignatures(self):
         """
         Private method to filter the log entries.
@@ -228,16 +219,14 @@
         searchRxText = self.rxEdit.text()
         filterTop = self.categoryCombo.currentText() == self.tr("Revision")
         searchRx = (
-            re.compile(
-                r"^\s*{0}".format(searchRxText[1:]), re.IGNORECASE)
-            if filterTop and searchRxText.startswith("^") else
-            re.compile(searchRxText, re.IGNORECASE)
+            re.compile(r"^\s*{0}".format(searchRxText[1:]), re.IGNORECASE)
+            if filterTop and searchRxText.startswith("^")
+            else re.compile(searchRxText, re.IGNORECASE)
         )
         for topIndex in range(self.signaturesList.topLevelItemCount()):
             topLevelItem = self.signaturesList.topLevelItem(topIndex)
             if filterTop:
-                topLevelItem.setHidden(
-                    searchRx.search(topLevelItem.text(0)) is None)
+                topLevelItem.setHidden(searchRx.search(topLevelItem.text(0)) is None)
             else:
                 visibleChildren = topLevelItem.childCount()
                 for childIndex in range(topLevelItem.childCount()):
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,99 +20,116 @@
     """
     Class implementing the gpg extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgGpgListAct = EricAction(
-            self.tr('List Signed Changesets'),
+            self.tr("List Signed Changesets"),
             UI.PixmapCache.getIcon("changesetSignList"),
-            self.tr('List Signed Changesets...'),
-            0, 0, self, 'mercurial_gpg_list')
-        self.hgGpgListAct.setStatusTip(self.tr(
-            'List signed changesets'
-        ))
-        self.hgGpgListAct.setWhatsThis(self.tr(
-            """<b>List Signed Changesets</b>"""
-            """<p>This opens a dialog listing all signed changesets.</p>"""
-        ))
+            self.tr("List Signed Changesets..."),
+            0,
+            0,
+            self,
+            "mercurial_gpg_list",
+        )
+        self.hgGpgListAct.setStatusTip(self.tr("List signed changesets"))
+        self.hgGpgListAct.setWhatsThis(
+            self.tr(
+                """<b>List Signed Changesets</b>"""
+                """<p>This opens a dialog listing all signed changesets.</p>"""
+            )
+        )
         self.hgGpgListAct.triggered.connect(self.__hgGpgSignatures)
         self.actions.append(self.hgGpgListAct)
-        
+
         self.hgGpgVerifyAct = EricAction(
-            self.tr('Verify Signatures'),
+            self.tr("Verify Signatures"),
             UI.PixmapCache.getIcon("changesetSignVerify"),
-            self.tr('Verify Signatures'),
-            0, 0, self, 'mercurial_gpg_verify')
-        self.hgGpgVerifyAct.setStatusTip(self.tr(
-            'Verify all signatures there may be for a particular revision'
-        ))
-        self.hgGpgVerifyAct.setWhatsThis(self.tr(
-            """<b>Verify Signatures</b>"""
-            """<p>This verifies all signatures there may be for a particular"""
-            """ revision.</p>"""
-        ))
+            self.tr("Verify Signatures"),
+            0,
+            0,
+            self,
+            "mercurial_gpg_verify",
+        )
+        self.hgGpgVerifyAct.setStatusTip(
+            self.tr("Verify all signatures there may be for a particular revision")
+        )
+        self.hgGpgVerifyAct.setWhatsThis(
+            self.tr(
+                """<b>Verify Signatures</b>"""
+                """<p>This verifies all signatures there may be for a particular"""
+                """ revision.</p>"""
+            )
+        )
         self.hgGpgVerifyAct.triggered.connect(self.__hgGpgVerifySignatures)
         self.actions.append(self.hgGpgVerifyAct)
-        
+
         self.hgGpgSignAct = EricAction(
-            self.tr('Sign Revision'),
+            self.tr("Sign Revision"),
             UI.PixmapCache.getIcon("changesetSign"),
-            self.tr('Sign Revision'),
-            0, 0, self, 'mercurial_gpg_sign')
-        self.hgGpgSignAct.setStatusTip(self.tr(
-            'Add a signature for a selected revision'
-        ))
-        self.hgGpgSignAct.setWhatsThis(self.tr(
-            """<b>Sign Revision</b>"""
-            """<p>This adds a signature for a selected revision.</p>"""
-        ))
+            self.tr("Sign Revision"),
+            0,
+            0,
+            self,
+            "mercurial_gpg_sign",
+        )
+        self.hgGpgSignAct.setStatusTip(
+            self.tr("Add a signature for a selected revision")
+        )
+        self.hgGpgSignAct.setWhatsThis(
+            self.tr(
+                """<b>Sign Revision</b>"""
+                """<p>This adds a signature for a selected revision.</p>"""
+            )
+        )
         self.hgGpgSignAct.triggered.connect(self.__hgGpgSign)
         self.actions.append(self.hgGpgSignAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("changesetSign"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgGpgListAct)
         menu.addAction(self.hgGpgVerifyAct)
         menu.addAction(self.hgGpgSignAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("GPG")
-    
+
     def __hgGpgSignatures(self):
         """
         Private slot used to list all signed changesets.
         """
         self.vcs.getExtensionObject("gpg").hgGpgSignatures()
-    
+
     def __hgGpgVerifySignatures(self):
         """
         Private slot used to verify the signatures of a revision.
         """
         self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures()
-    
+
     def __hgGpgSign(self):
         """
         Private slot used to sign a revision.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/gpg.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/GpgExtension/gpg.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,36 +18,38 @@
     """
     Class implementing the gpg extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-        
+
         self.gpgSignaturesDialog = None
-    
+
     def shutdown(self):
         """
         Public method used to shutdown the gpg interface.
         """
         if self.gpgSignaturesDialog is not None:
             self.gpgSignaturesDialog.close()
-    
+
     def hgGpgSignatures(self):
         """
         Public method used to list all signed changesets.
         """
         from .HgGpgSignaturesDialog import HgGpgSignaturesDialog
+
         self.gpgSignaturesDialog = HgGpgSignaturesDialog(self.vcs)
         self.gpgSignaturesDialog.show()
         self.gpgSignaturesDialog.start()
-    
+
     def hgGpgVerifySignatures(self, rev=None):
         """
         Public method used to verify the signatures of a revision.
-        
+
         @param rev revision to check (string)
         """
         if rev is None:
@@ -55,38 +57,39 @@
                 self.vcs.hgGetTagsList(),
                 self.vcs.hgGetBranchesList(),
                 bookmarksList=self.vcs.hgGetBookmarksList(),
-                revset=False
+                revset=False,
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev = dlg.getRevision()
-        
+
         if rev is not None:
             if rev == "":
                 rev = "tip"
             args = self.vcs.initCommand("sigcheck")
             args.append(rev)
-            
-            dia = HgDialog(self.tr('Verify Signatures'), self.vcs)
+
+            dia = HgDialog(self.tr("Verify Signatures"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgGpgSign(self, revisions=None):
         """
         Public method used to list the available bookmarks.
-        
+
         @param revisions list containing the revisions to be signed
         @type list of str
         """
         if revisions is None:
             from .HgGpgSignDialog import HgGpgSignDialog
-            dlg = HgGpgSignDialog(self.vcs.hgGetTagsList(),
-                                  self.vcs.hgGetBranchesList(),
-                                  self.vcs.hgGetBookmarksList())
+
+            dlg = HgGpgSignDialog(
+                self.vcs.hgGetTagsList(),
+                self.vcs.hgGetBranchesList(),
+                self.vcs.hgGetBookmarksList(),
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                revision, noCommit, message, keyId, local, force = (
-                    dlg.getData()
-                )
+                revision, noCommit, message, keyId, local, force = dlg.getData()
                 if revision:
                     revisions = [revision]
                 else:
@@ -99,7 +102,7 @@
             keyId = ""
             local = False
             force = False
-        
+
         args = self.vcs.initCommand("sign")
         if noCommit:
             args.append("--no-commit")
@@ -115,8 +118,8 @@
             args.append("--force")
         for rev in revisions:
             args.append(rev)
-        
-        dia = HgDialog(self.tr('Sign Revision'), self.vcs)
+
+        dia = HgDialog(self.tr("Sign Revision"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAddSubrepositoryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAddSubrepositoryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,67 +24,64 @@
     """
     Class implementing a dialog to add a sub-repository.
     """
+
     def __init__(self, projectPath, parent=None):
         """
         Constructor
-        
+
         @param projectPath project directory name (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.pathPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.pathPicker.setDefaultDirectory(projectPath)
-        
+
         self.__ok = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.__ok.setEnabled(False)
-        
+
         self.__projectPath = Utilities.toNativeSeparators(projectPath)
-        
+
         self.typeCombo.addItem("Mercurial", "hg")
         self.typeCombo.addItem("GIT", "git")
         self.typeCombo.addItem("Subversion", "svn")
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOk(self):
         """
         Private slot to update the state of the OK button.
         """
         path = self.pathPicker.text()
         url = self.urlEdit.text()
-        
-        self.__ok.setEnabled(
-            path != "" and
-            not os.path.isabs(path) and
-            url != ""
-        )
-    
+
+        self.__ok.setEnabled(path != "" and not os.path.isabs(path) and url != "")
+
     @pyqtSlot(str)
     def on_pathPicker_textChanged(self, p0):
         """
         Private slot to handle the update of the path.
-        
+
         @param p0 text of the path edit (string)
         """
         self.__updateOk()
-    
+
     @pyqtSlot(str)
     def on_urlEdit_textChanged(self, p0):
         """
         Private slot to handle the update of the URL.
-        
+
         @param p0 text of the URL edit (string)
         """
         self.__updateOk()
-    
+
     @pyqtSlot(str)
     def on_pathPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a subrepository path.
-        
+
         @param path path of the subrepository
         @type str
         """
@@ -95,14 +92,16 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Add Sub-repository"),
-                self.tr("""The sub-repository path must be inside"""
-                        """ the project."""))
+                self.tr(
+                    """The sub-repository path must be inside""" """ the project."""
+                ),
+            )
             self.pathPicker.setText("")
-    
+
     def getData(self):
         """
         Public method to get the data.
-        
+
         @return tuple containing the relative path within the project, the
             sub-repository type and the sub-repository URL (string, string,
             string)
@@ -110,5 +109,5 @@
         return (
             self.pathPicker.text(),
             self.typeCombo.itemData(self.typeCombo.currentIndex()),
-            self.urlEdit.text()
+            self.urlEdit.text(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAnnotateDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgAnnotateDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import re
 
 from PyQt6.QtCore import Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
 
 from .Ui_HgAnnotateDialog import Ui_HgAnnotateDialog
 
@@ -23,51 +21,50 @@
     """
     Class implementing a dialog to show the output of the hg annotate command.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
+
         self.__annotateRe = re.compile(
-            r"""(.+)\s+(\d+)\s+([0-9a-fA-F]+)\s+([0-9-]+)\s+(.+)""")
-        
-        self.annotateList.headerItem().setText(
-            self.annotateList.columnCount(), "")
+            r"""(.+)\s+(\d+)\s+([0-9a-fA-F]+)\s+([0-9-]+)\s+(.+)"""
+        )
+
+        self.annotateList.headerItem().setText(self.annotateList.columnCount(), "")
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.annotateList.setFont(font)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self, fn):
         """
         Public slot to start the annotate command.
-        
+
         @param fn filename to show the annotation for (string)
         """
         self.annotateList.clear()
@@ -75,16 +72,16 @@
         self.intercept = False
         self.activateWindow()
         self.lineno = 1
-        
+
         args = self.vcs.initCommand("annotate")
-        args.append('--follow')
-        args.append('--user')
-        args.append('--date')
-        args.append('--number')
-        args.append('--changeset')
-        args.append('--quiet')
+        args.append("--follow")
+        args.append("--user")
+        args.append("--date")
+        args.append("--number")
+        args.append("--changeset")
+        args.append("--quiet")
         args.append(fn)
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -94,53 +91,47 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__resizeColumns()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             if self.__hgClient:
                 self.__hgClient.cancel()
             else:
                 self.__finish()
-    
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.annotateList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-    
+            QHeaderView.ResizeMode.ResizeToContents
+        )
+
     def __generateItem(self, revision, changeset, author, date, text):
         """
         Private method to generate an annotate item in the annotation list.
-        
+
         @param revision revision string (string)
         @param changeset changeset string (string)
         @param author author of the change (string)
@@ -149,16 +140,16 @@
         """
         itm = QTreeWidgetItem(
             self.annotateList,
-            [revision, changeset, author, date, "{0:d}".format(self.lineno),
-             text])
+            [revision, changeset, author, date, "{0:d}".format(self.lineno), text],
+        )
         self.lineno += 1
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignRight)
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         try:
@@ -168,13 +159,14 @@
             text = ""
         match = self.__annotateRe.match(info)
         author, rev, changeset, date, file = match.groups()
-        self.__generateItem(rev.strip(), changeset.strip(), author.strip(),
-                            date.strip(), text)
-    
+        self.__generateItem(
+            rev.strip(), changeset.strip(), author.strip(), date.strip(), text
+        )
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgArchiveDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgArchiveDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,34 +21,27 @@
     """
     Class implementing a dialog to enter the archive data.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial object (Hg)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.archivePicker.setMode(
-            EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE)
-        
-        self.typeComboBox.addItem(
-            self.tr("Detect Automatically"), "")
-        self.typeComboBox.addItem(
-            self.tr("Directory of Files"), "files")
-        self.typeComboBox.addItem(
-            self.tr("Uncompressed TAR-Archive"), "tar")
-        self.typeComboBox.addItem(
-            self.tr("Bzip2 compressed TAR-Archive"), "tbz2")
-        self.typeComboBox.addItem(
-            self.tr("Gzip compressed TAR-Archive"), "tgz")
-        self.typeComboBox.addItem(
-            self.tr("Uncompressed ZIP-Archive"), "uzip")
-        self.typeComboBox.addItem(
-            self.tr("Compressed ZIP-Archive"), "zip")
-        
+
+        self.archivePicker.setMode(EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE)
+
+        self.typeComboBox.addItem(self.tr("Detect Automatically"), "")
+        self.typeComboBox.addItem(self.tr("Directory of Files"), "files")
+        self.typeComboBox.addItem(self.tr("Uncompressed TAR-Archive"), "tar")
+        self.typeComboBox.addItem(self.tr("Bzip2 compressed TAR-Archive"), "tbz2")
+        self.typeComboBox.addItem(self.tr("Gzip compressed TAR-Archive"), "tgz")
+        self.typeComboBox.addItem(self.tr("Uncompressed ZIP-Archive"), "uzip")
+        self.typeComboBox.addItem(self.tr("Compressed ZIP-Archive"), "zip")
+
         self.__unixFileFilters = [
             self.tr("Bzip2 compressed TAR-Archive (*.tar.bz2)"),
             self.tr("Gzip compressed TAR-Archive (*.tar.gz)"),
@@ -56,17 +49,17 @@
         ]
         self.__windowsFileFilters = [
             self.tr("Compressed ZIP-Archive (*.zip)"),
-            self.tr("Uncompressed ZIP-Archive (*.uzip)")
+            self.tr("Uncompressed ZIP-Archive (*.uzip)"),
         ]
         fileFilters = (
             ";;".join(self.__windowsFileFilters + self.__unixFileFilters)
-            if Utilities.isWindowsPlatform() else
-            ";;".join(self.__unixFileFilters + self.__windowsFileFilters)
+            if Utilities.isWindowsPlatform()
+            else ";;".join(self.__unixFileFilters + self.__windowsFileFilters)
         )
         fileFilters += ";;" + self.tr("All Files (*)")
-        
+
         self.archivePicker.setFilters(fileFilters)
-        
+
         self.__typeFilters = {
             "tar": ["*.tar"],
             "tbz2": ["*.tar.bz2", "*.tbz2"],
@@ -74,34 +67,34 @@
             "uzip": ["*.uzip", "*.zip"],
             "zip": ["*.zip"],
         }
-        
+
         self.subReposCheckBox.setEnabled(vcs.hasSubrepositories())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.__projectPath = (
             vcs.getPlugin().getProjectHelper().getProject().getProjectPath()
         )
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_archivePicker_textChanged(self, archive):
         """
         Private slot to handle changes of the archive name.
-        
+
         @param archive name of the archive (string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(archive != "")
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            archive != ""
+        )
+
     @pyqtSlot(int)
     def on_typeComboBox_activated(self, index):
         """
         Private slot to react on changes of the selected archive type.
-        
+
         @param index index of the selected type (integer)
         """
         type_ = self.typeComboBox.itemData(index)
@@ -109,17 +102,17 @@
             self.archivePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         else:
             self.archivePicker.setMode(
-                EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE)
+                EricPathPickerModes.SAVE_FILE_ENSURE_EXTENSION_MODE
+            )
             if type_ in self.__typeFilters:
-                self.archivePicker.setNameFilters(
-                    self.__typeFilters[type_])
+                self.archivePicker.setNameFilters(self.__typeFilters[type_])
             else:
                 self.archivePicker.setNameFilters([])
-    
+
     def getData(self):
         """
         Public method to retrieve the data.
-        
+
         @return tuple giving the archive name (string), the archive type
             (string), the directory prefix 8string) and a flag indicating
             to recurse into subrepositories (boolean)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBackoutDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBackoutDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,11 @@
     """
     Class implementing a dialog to enter the data for a backout operation.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,16 +35,14 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.messageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-        
+        self.messageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
@@ -52,7 +50,7 @@
         else:
             self.bookmarkButton.setHidden(True)
             self.bookmarkCombo.setHidden(True)
-        
+
         # connect various radio buttons and input fields
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
@@ -60,17 +58,17 @@
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
         self.noneButton.toggled.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-        
+
         self.__initDateTime = QDateTime.currentDateTime()
         self.dateEdit.setDateTime(self.__initDateTime)
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -89,14 +87,13 @@
             enabled = bool(self.bookmarkCombo.currentText())
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def getParameters(self):
         """
         Public method to retrieve the backout data.
-        
+
         @return tuple naming the revision, a flag indicating a
             merge, the commit date, the commit user and a commit message
         @rtype tuple of (str, bool, str, str, str)
@@ -115,22 +112,17 @@
             rev = self.expressionEdit.text()
         else:
             rev = ""
-        
+
         date = (
             self.dateEdit.dateTime().toString("yyyy-MM-dd hh:mm")
-            if self.dateEdit.dateTime() != self.__initDateTime else
-            ""
+            if self.dateEdit.dateTime() != self.__initDateTime
+            else ""
         )
-        
+
         msg = (
             self.messageEdit.toPlainText()
-            if self.messageEdit.toPlainText() else
-            self.tr("Backed out changeset <{0}>.").format(rev)
+            if self.messageEdit.toPlainText()
+            else self.tr("Backed out changeset <{0}>.").format(rev)
         )
-        
-        return (rev,
-                self.mergeCheckBox.isChecked,
-                date,
-                self.userEdit.text(),
-                msg
-                )
+
+        return (rev, self.mergeCheckBox.isChecked, date, self.userEdit.text(), msg)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,14 +17,14 @@
     """
     Class mplementing the bookmark dialog.
     """
+
     DEFINE_MODE = 0
     MOVE_MODE = 1
-    
-    def __init__(self, mode, tagsList, branchesList, bookmarksList,
-                 parent=None):
+
+    def __init__(self, mode, tagsList, branchesList, bookmarksList, parent=None):
         """
         Constructor
-        
+
         @param mode of the dialog
         @type int
         @param tagsList list of tags
@@ -38,10 +38,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.__mode = mode
         if mode == self.MOVE_MODE:
             self.nameEdit.hide()
@@ -50,34 +49,34 @@
         else:
             self.nameCombo.hide()
             self.setWindowTitle(self.tr("Define Bookmark"))
-        
+
         self.__bookmarksList = bookmarksList[:]
-        
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         self.bookmarkCombo.addItems(sorted(bookmarksList))
-        
+
         # connect various radio buttons and input fields
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
         self.branchButton.toggled.connect(self.__updateOK)
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.nameCombo.activated.connect(self.__updateOK)
         self.nameCombo.activated.connect(self.__updateBookmarksCombo)
-        
+
         self.nameEdit.textChanged.connect(self.__updateOK)
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -85,10 +84,10 @@
         """
         enabled = (
             bool(self.nameCombo.currentText())
-            if self.__mode == self.MOVE_MODE else
-            bool(self.nameEdit.text())
+            if self.__mode == self.MOVE_MODE
+            else bool(self.nameEdit.text())
         )
-        
+
         if self.idButton.isChecked():
             enabled = bool(self.idEdit.text())
         elif self.tagButton.isChecked():
@@ -99,10 +98,9 @@
             enabled = bool(self.bookmarkCombo.currentText())
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __updateBookmarksCombo(self):
         """
         Private slot to update the bookmarks combo.
@@ -120,11 +118,11 @@
                 index = self.bookmarkCombo.findText(selectedBookmark)
                 if index > -1:
                     self.bookmarkCombo.setCurrentIndex(index)
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple naming the revision and the bookmark name
         @rtype tuple of (str, str)
         """
@@ -142,11 +140,11 @@
             rev = self.expressionEdit.text()
         else:
             rev = ""
-        
+
         name = (
             self.nameCombo.currentText().replace(" ", "_")
-            if self.__mode == self.MOVE_MODE else
-            self.nameEdit.text().replace(" ", "_")
+            if self.__mode == self.MOVE_MODE
+            else self.nameEdit.text().replace(" ", "_")
         )
-        
+
         return rev, name
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkRenameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarkRenameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,55 +17,54 @@
     """
     Class implementing a dialog to get the data to rename a bookmark.
     """
+
     def __init__(self, bookmarksList, parent=None):
         """
         Constructor
-        
+
         @param bookmarksList list of bookmarks (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-       
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.bookmarkCombo.addItems(sorted(bookmarksList))
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateUI(self):
         """
         Private slot to update the UI.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.nameEdit.text() != "" and
-            self.bookmarkCombo.currentText() != ""
+            self.nameEdit.text() != "" and self.bookmarkCombo.currentText() != ""
         )
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the bookmark name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(str)
     def on_bookmarkCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the selected bookmark.
-        
+
         @param txt name of the selected bookmark (string)
         """
         self.__updateUI()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple naming the old and new bookmark names
             (string, string)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksInOutDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksInOutDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
 
 from .Ui_HgBookmarksInOutDialog import Ui_HgBookmarksInOutDialog
 
@@ -20,13 +18,14 @@
     Class implementing a dialog to show a list of incoming or outgoing
     bookmarks.
     """
+
     INCOMING = 0
     OUTGOING = 1
-    
+
     def __init__(self, vcs, mode, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param mode mode of the dialog (HgBookmarksInOutDialog.INCOMING,
             HgBookmarksInOutDialog.OUTGOING)
@@ -36,64 +35,60 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         if mode not in [self.INCOMING, self.OUTGOING]:
             raise ValueError("Bad value for mode")
         if mode == self.INCOMING:
             self.setWindowTitle(self.tr("Mercurial Incoming Bookmarks"))
         elif mode == self.OUTGOING:
             self.setWindowTitle(self.tr("Mercurial Outgoing Bookmarks"))
-        
+
         self.vcs = vcs
         self.mode = mode
         self.__hgClient = vcs.getClient()
-        
-        self.bookmarksList.headerItem().setText(
-            self.bookmarksList.columnCount(), "")
-        self.bookmarksList.header().setSortIndicator(
-            3, Qt.SortOrder.AscendingOrder)
-        
+
+        self.bookmarksList.headerItem().setText(self.bookmarksList.columnCount(), "")
+        self.bookmarksList.header().setSortIndicator(3, Qt.SortOrder.AscendingOrder)
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the bookmarks command.
-        
+
         @exception ValueError raised to indicate an invalid dialog mode
         """
         self.errorGroup.hide()
-        
+
         self.intercept = False
         self.activateWindow()
-        
+
         if self.mode not in (self.INCOMING, self.OUTGOING):
             raise ValueError("Bad value for mode")
-        
+
         args = (
             self.vcs.initCommand("incoming")
-            if self.mode == self.INCOMING else
-            self.vcs.initCommand("outgoing")
+            if self.mode == self.INCOMING
+            else self.vcs.initCommand("outgoing")
         )
-        
-        args.append('--bookmarks')
-        
+
+        args.append("--bookmarks")
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -103,77 +98,70 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if self.bookmarksList.topLevelItemCount() == 0:
             # no bookmarks defined
             self.__generateItem(self.tr("no bookmarks found"), "")
         self.__resizeColumns()
         self.__resort()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             if self.__hgClient:
                 self.__hgClient.cancel()
             else:
                 self.__finish()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.bookmarksList.sortItems(
             self.bookmarksList.sortColumn(),
-            self.bookmarksList.header().sortIndicatorOrder())
-    
+            self.bookmarksList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.bookmarksList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.bookmarksList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, changeset, name):
         """
         Private method to generate a bookmark item in the bookmarks list.
-        
+
         @param changeset changeset of the bookmark (string)
         @param name name of the bookmark (string)
         """
-        QTreeWidgetItem(self.bookmarksList, [
-            name,
-            changeset])
-    
+        QTreeWidgetItem(self.bookmarksList, [name, changeset])
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         if line.startswith(" "):
@@ -182,11 +170,11 @@
             del li[-1]
             name = " ".join(li)
             self.__generateItem(changeset, name)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBookmarksListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication, QPoint
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QLineEdit, QMenu,
-    QInputDialog
+    QDialog,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QLineEdit,
+    QMenu,
+    QInputDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -25,74 +30,71 @@
     """
     Class implementing a dialog to show a list of bookmarks.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the bookmarks display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the bookmarks display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.__bookmarksList = None
         self.__hgClient = vcs.getClient()
         self.__bookmarksDefined = False
         self.__currentRevision = ""
-        
-        self.bookmarksList.headerItem().setText(
-            self.bookmarksList.columnCount(), "")
-        self.bookmarksList.header().setSortIndicator(
-            3, Qt.SortOrder.AscendingOrder)
-        
+
+        self.bookmarksList.headerItem().setText(self.bookmarksList.columnCount(), "")
+        self.bookmarksList.header().setSortIndicator(3, Qt.SortOrder.AscendingOrder)
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self, bookmarksList):
         """
         Public slot to start the bookmarks command.
-        
+
         @param bookmarksList reference to string list receiving the bookmarks
             (list of strings)
         """
         self.bookmarksList.clear()
         self.__bookmarksDefined = False
-        
+
         self.errorGroup.hide()
-        
+
         self.intercept = False
         self.activateWindow()
-        
+
         self.__bookmarksList = bookmarksList
-        del self.__bookmarksList[:]     # clear the list
-        
+        del self.__bookmarksList[:]  # clear the list
+
         args = self.vcs.initCommand("bookmarks")
-        
+
         self.refreshButton.setEnabled(False)
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -102,84 +104,79 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         self.refreshButton.setEnabled(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if self.bookmarksList.topLevelItemCount() == 0:
             # no bookmarks defined
-            self.__generateItem(
-                self.tr("no bookmarks defined"), "", "", "")
+            self.__generateItem(self.tr("no bookmarks defined"), "", "", "")
             self.__bookmarksDefined = False
         else:
             self.__bookmarksDefined = True
-        
+
         self.__resizeColumns()
         self.__resort()
-        
+
         # restore current item
         if self.__currentRevision:
             items = self.bookmarksList.findItems(
-                self.__currentRevision, Qt.MatchFlag.MatchExactly, 0)
+                self.__currentRevision, Qt.MatchFlag.MatchExactly, 0
+            )
             if items:
                 self.bookmarksList.setCurrentItem(items[0])
                 self.__currentRevision = ""
                 self.bookmarksList.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             if self.__hgClient:
                 self.__hgClient.cancel()
             else:
                 self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.bookmarksList.sortItems(
             self.bookmarksList.sortColumn(),
-            self.bookmarksList.header().sortIndicatorOrder())
-    
+            self.bookmarksList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.bookmarksList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.bookmarksList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, revision, changeset, status, name):
         """
         Private method to generate a bookmark item in the bookmarks list.
-        
+
         @param revision revision of the bookmark (string)
         @param changeset changeset of the bookmark (string)
         @param status of the bookmark (string)
@@ -198,11 +195,11 @@
         else:
             # error message
             itm.setData(0, Qt.ItemDataRole.DisplayRole, revision)
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         li = line.split()
@@ -219,17 +216,17 @@
             self.__generateItem(rev, changeset, status, name)
             if self.__bookmarksList is not None:
                 self.__bookmarksList.append(name)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -241,14 +238,14 @@
             self.__currentRevision = itm.text(0)
         else:
             self.__currentRevision = ""
-        
+
         self.start(self.__bookmarksList)
-    
+
     @pyqtSlot(QPoint)
     def on_bookmarksList_customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request.
-        
+
         @param pos position the context menu was requetsed at
         @type QPoint
         """
@@ -257,36 +254,50 @@
             menu = QMenu(self.bookmarksList)
             menu.addAction(
                 UI.PixmapCache.getIcon("vcsSwitch"),
-                self.tr("Switch to"), self.__switchTo)
+                self.tr("Switch to"),
+                self.__switchTo,
+            )
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("deleteBookmark"),
-                self.tr("Delete"), self.__deleteBookmark)
+                self.tr("Delete"),
+                self.__deleteBookmark,
+            )
             menu.addAction(
                 UI.PixmapCache.getIcon("renameBookmark"),
-                self.tr("Rename"), self.__renameBookmark)
+                self.tr("Rename"),
+                self.__renameBookmark,
+            )
             menu.addSeparator()
             act = menu.addAction(
                 UI.PixmapCache.getIcon("pullBookmark"),
-                self.tr("Pull"), self.__pullBookmark)
+                self.tr("Pull"),
+                self.__pullBookmark,
+            )
             act.setEnabled(self.vcs.canPull())
             act = menu.addAction(
                 UI.PixmapCache.getIcon("pushBookmark"),
-                self.tr("Push"), self.__pushBookmark)
+                self.tr("Push"),
+                self.__pushBookmark,
+            )
             act.setEnabled(self.vcs.canPush())
             menu.addSeparator()
             act = menu.addAction(
                 UI.PixmapCache.getIcon("pushBookmark"),
-                self.tr("Push Current"), self.__pushCurrentBookmark)
+                self.tr("Push Current"),
+                self.__pushCurrentBookmark,
+            )
             act.setEnabled(self.vcs.canPush())
             if self.vcs.version >= (5, 7):
                 act = menu.addAction(
                     UI.PixmapCache.getIcon("pushBookmark"),
-                    self.tr("Push All"), self.__pushAllBookmarks)
+                    self.tr("Push All"),
+                    self.__pushAllBookmarks,
+                )
                 act.setEnabled(self.vcs.canPush())
-            
+
             menu.popup(self.bookmarksList.mapToGlobal(pos))
-    
+
     def __switchTo(self):
         """
         Private slot to switch the working directory to the selected revision.
@@ -299,15 +310,15 @@
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Switch"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.on_refreshButton_clicked()
-    
+
     def __deleteBookmark(self):
         """
         Private slot to delete the selected bookmark.
@@ -318,12 +329,14 @@
             yes = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Bookmark"),
-                self.tr("""<p>Shall the bookmark <b>{0}</b> really be"""
-                        """ deleted?</p>""").format(bookmark))
+                self.tr(
+                    """<p>Shall the bookmark <b>{0}</b> really be""" """ deleted?</p>"""
+                ).format(bookmark),
+            )
             if yes:
                 self.vcs.hgBookmarkDelete(bookmark=bookmark)
                 self.on_refreshButton_clicked()
-    
+
     def __renameBookmark(self):
         """
         Private slot to rename the selected bookmark.
@@ -334,13 +347,15 @@
             newName, ok = QInputDialog.getText(
                 self,
                 self.tr("Rename Bookmark"),
-                self.tr("<p>Enter the new name for bookmark <b>{0}</b>:</p>")
-                .format(bookmark),
-                QLineEdit.EchoMode.Normal)
+                self.tr("<p>Enter the new name for bookmark <b>{0}</b>:</p>").format(
+                    bookmark
+                ),
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and bool(newName):
                 self.vcs.hgBookmarkRename((bookmark, newName))
                 self.on_refreshButton_clicked()
-    
+
     def __pullBookmark(self):
         """
         Private slot to pull the selected bookmark.
@@ -350,7 +365,7 @@
         if bookmark:
             self.vcs.hgBookmarkPull(bookmark=bookmark)
             self.on_refreshButton_clicked()
-    
+
     def __pushBookmark(self):
         """
         Private slot to push the selected bookmark.
@@ -360,14 +375,14 @@
         if bookmark:
             self.vcs.hgBookmarkPush(bookmark=bookmark)
             self.on_refreshButton_clicked()
-    
+
     def __pushCurrentBookmark(self):
         """
         Private slot to push the current bookmark.
         """
         self.vcs.hgBookmarkPush(current=True)
         self.on_refreshButton_clicked()
-    
+
     def __pushAllBookmarks(self):
         """
         Private slot to push all bookmarks.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBranchInputDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBranchInputDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,44 +17,45 @@
     """
     Class implementing a dialog to enter the data for a branch operation.
     """
+
     def __init__(self, branches, parent=None):
         """
         Constructor
-        
+
         @param branches branch names to populate the branch list with
             (list of string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.branchComboBox.addItems(sorted(branches))
         self.branchComboBox.setEditText("")
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_branchComboBox_editTextChanged(self, txt):
         """
         Private slot handling a change of the branch name.
-        
+
         @param txt contents of the branch combo box (string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
+
     def getData(self):
         """
         Public method to get the data.
-        
+
         @return tuple of branch name, a flag indicating to commit the branch
             and a flag indicating to force the branch creation
         @rtype tuple of (str, bool, bool)
         """
-        return (self.branchComboBox.currentText().replace(" ", "_"),
-                self.commitCheckBox.isChecked(),
-                self.forceCheckBox.isChecked())
+        return (
+            self.branchComboBox.currentText().replace(" ", "_"),
+            self.commitCheckBox.isChecked(),
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBundleDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgBundleDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,13 @@
     """
     Class implementing a dialog to enter the data for a bundle operation.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 version=(0, 0, 0), parent=None):
+
+    def __init__(
+        self, tagsList, branchesList, bookmarksList=None, version=(0, 0, 0), parent=None
+    ):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,12 +37,11 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.__version = version
-        
+
         bundleTypes = ["", "bzip2", "gzip", "none"]
         if version >= (4, 1, 0):
             bundleTypes.insert(-1, "zstd")
@@ -52,7 +53,7 @@
         else:
             self.bookmarkButton.setHidden(True)
             self.bookmarkCombo.setHidden(True)
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -66,92 +67,93 @@
             enabled = self.branchCombo.currentText() != ""
         elif self.bookmarkButton.isChecked():
             enabled = self.bookmarkCombo.currentText() != ""
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(bool)
     def on_multipleButton_toggled(self, checked):
         """
         Private slot to handle changes of the Multiple select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_tagButton_toggled(self, checked):
         """
         Private slot to handle changes of the Tag select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_branchButton_toggled(self, checked):
         """
         Private slot to handle changes of the Branch select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_bookmarkButton_toggled(self, checked):
         """
         Private slot to handle changes of the Bookmark select button.
-        
+
         @param checked state of the button (boolean)
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_multipleEdit_textChanged(self):
         """
         Private slot to handle changes of the Multiple edit.
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Tag combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_branchCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Branch combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_bookmarkCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the Bookmark combo.
-        
+
         @param txt text of the combo (string)
         """
         self.__updateOK()
-    
+
     def getParameters(self):
         """
         Public method to retrieve the bundle data.
-        
+
         @return tuple naming the revisions, base revisions, the compression
             type and a flag indicating to bundle all changesets (string,
             string, boolean)
         """
         if self.multipleButton.isChecked():
-            revs = [rev.strip() for rev in
-                    self.multipleEdit.toPlainText().strip().splitlines()
-                    if rev.strip()]
+            revs = [
+                rev.strip()
+                for rev in self.multipleEdit.toPlainText().strip().splitlines()
+                if rev.strip()
+            ]
         elif self.tagButton.isChecked():
             revs = [self.tagCombo.currentText()]
         elif self.branchButton.isChecked():
@@ -160,13 +162,15 @@
             revs = [self.bookmarkCombo.currentText()]
         else:
             revs = []
-        
-        baseRevs = [rev.strip() for rev in
-                    self.baseRevisionsEdit.toPlainText().strip().splitlines()
-                    if rev.strip()]
-        
+
+        baseRevs = [
+            rev.strip()
+            for rev in self.baseRevisionsEdit.toPlainText().strip().splitlines()
+            if rev.strip()
+        ]
+
         bundleType = self.compressionCombo.currentText()
         if bundleType == "zstd":
             bundleType += "-v2"
-        
+
         return (revs, baseRevs, bundleType, self.allCheckBox.isChecked())
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import struct
 import io
 
-from PyQt6.QtCore import (
-    QProcess, QObject, QByteArray, QCoreApplication, QThread
-)
+from PyQt6.QtCore import QProcess, QObject, QByteArray, QCoreApplication, QThread
 from PyQt6.QtWidgets import QDialog
 
 from .HgUtilities import prepareProcess, getHgExecutable
@@ -22,17 +20,18 @@
     """
     Class implementing the Mercurial command server interface.
     """
+
     InputFormat = ">I"
     OutputFormat = ">cI"
     OutputFormatSize = struct.calcsize(OutputFormat)
     ReturnFormat = ">i"
-    
+
     Channels = (b"I", b"L", b"o", b"e", b"r", b"d")
-    
+
     def __init__(self, repoPath, encoding, vcs, parent=None):
         """
         Constructor
-        
+
         @param repoPath root directory of the repository
         @type str
         @param encoding encoding to be used by the command server
@@ -43,7 +42,7 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__server = None
         self.__started = False
         self.__version = None
@@ -51,7 +50,7 @@
         self.__cancel = False
         self.__commandRunning = False
         self.__repoPath = repoPath
-        
+
         # generate command line and environment
         self.__serverArgs = vcs.initCommand("serve")
         self.__serverArgs.append("--cmdserver")
@@ -61,44 +60,44 @@
         if repoPath:
             self.__serverArgs.append("--repository")
             self.__serverArgs.append(repoPath)
-        
+
         if encoding:
             self.__encoding = encoding
             if "--encoding" in self.__serverArgs:
                 # use the defined encoding via the environment
                 index = self.__serverArgs.index("--encoding")
-                del self.__serverArgs[index:index + 2]
-    
+                del self.__serverArgs[index : index + 2]
+
     def startServer(self):
         """
         Public method to start the command server.
-        
+
         @return tuple of flag indicating a successful start and an error
             message in case of failure
         @rtype tuple of (bool, str)
         """
         self.__server = QProcess()
         self.__server.setWorkingDirectory(self.__repoPath)
-        
+
         # connect signals
         self.__server.finished.connect(self.__serverFinished)
-        
+
         prepareProcess(self.__server, self.__encoding)
-        
+
         exe = getHgExecutable()
         self.__server.start(exe, self.__serverArgs)
         serverStarted = self.__server.waitForStarted(15000)
         if not serverStarted:
             return False, self.tr(
-                'The process {0} could not be started. '
-                'Ensure, that it is in the search path.'
+                "The process {0} could not be started. "
+                "Ensure, that it is in the search path."
             ).format(exe)
-        
+
         self.__server.setReadChannel(QProcess.ProcessChannel.StandardOutput)
         ok, error = self.__readHello()
         self.__started = ok
         return ok, error
-    
+
     def stopServer(self):
         """
         Public method to stop the command server.
@@ -112,26 +111,26 @@
                 if not res:
                     self.__server.kill()
                     self.__server.waitForFinished(3000)
-            
+
             self.__started = False
             self.__server.deleteLater()
             self.__server = None
-    
+
     def restartServer(self):
         """
         Public method to restart the command server.
-        
+
         @return tuple of flag indicating a successful start and an error
             message in case of failure
         @rtype tuple of (bool, str)
         """
         self.stopServer()
         return self.startServer()
-    
+
     def __readHello(self):
         """
         Private method to read the hello message sent by the command server.
-        
+
         @return tuple of flag indicating success and an error message in case
             of failure
         @rtype tuple of (bool, str)
@@ -141,70 +140,64 @@
             return False, self.tr("Did not receive the 'hello' message.")
         elif ch != "o":
             return False, self.tr("Received data on unexpected channel.")
-        
+
         msg = msg.split("\n")
-        
+
         if not msg[0].startswith("capabilities: "):
             return False, self.tr(
-                "Bad 'hello' message, expected 'capabilities: '"
-                " but got '{0}'.").format(msg[0])
-        self.__capabilities = msg[0][len('capabilities: '):]
+                "Bad 'hello' message, expected 'capabilities: '" " but got '{0}'."
+            ).format(msg[0])
+        self.__capabilities = msg[0][len("capabilities: ") :]
         if not self.__capabilities:
-            return False, self.tr("'capabilities' message did not contain"
-                                  " any capability.")
-        
+            return False, self.tr(
+                "'capabilities' message did not contain" " any capability."
+            )
+
         self.__capabilities = set(self.__capabilities.split())
         if "runcommand" not in self.__capabilities:
             return False, "'capabilities' did not contain 'runcommand'."
-        
+
         if not msg[1].startswith("encoding: "):
             return False, self.tr(
-                "Bad 'hello' message, expected 'encoding: '"
-                " but got '{0}'.").format(msg[1])
-        encoding = msg[1][len('encoding: '):]
+                "Bad 'hello' message, expected 'encoding: '" " but got '{0}'."
+            ).format(msg[1])
+        encoding = msg[1][len("encoding: ") :]
         if not encoding:
-            return False, self.tr("'encoding' message did not contain"
-                                  " any encoding.")
+            return False, self.tr("'encoding' message did not contain" " any encoding.")
         self.__encoding = encoding
-        
+
         return True, ""
-    
+
     def __serverFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
         @type QProcess.ExitStatus
         """
         self.__started = False
-    
+
     def __readChannel(self):
         """
         Private method to read data from the command server.
-        
+
         @return tuple of channel designator and channel data
         @rtype tuple of (str, int or str or bytes)
         """
-        if (
-            self.__server.bytesAvailable() > 0 or
-            self.__server.waitForReadyRead(10000)
-        ):
+        if self.__server.bytesAvailable() > 0 or self.__server.waitForReadyRead(10000):
             data = bytes(self.__server.peek(HgClient.OutputFormatSize))
             if not data or len(data) < HgClient.OutputFormatSize:
                 return "", ""
-            
+
             channel, length = struct.unpack(HgClient.OutputFormat, data)
             channel = channel.decode(self.__encoding)
             if channel in "IL":
                 self.__server.read(HgClient.OutputFormatSize)
                 return channel, length
             else:
-                if (
-                    self.__server.bytesAvailable() <
-                    HgClient.OutputFormatSize + length
-                ):
+                if self.__server.bytesAvailable() < HgClient.OutputFormatSize + length:
                     return "", ""
                 self.__server.read(HgClient.OutputFormatSize)
                 data = self.__server.read(length)
@@ -214,11 +207,11 @@
                     return (channel, str(data, self.__encoding, "replace"))
         else:
             return "", ""
-    
+
     def __writeDataBlock(self, data):
         """
         Private slot to write some data to the command server.
-        
+
         @param data data to be sent
         @type str
         """
@@ -227,11 +220,11 @@
         self.__server.write(struct.pack(HgClient.InputFormat, len(data)))
         self.__server.write(data)
         self.__server.waitForBytesWritten()
-    
+
     def __runcommand(self, args, inputChannels, outputChannels):
         """
         Private method to run a command in the server (low level).
-        
+
         @param args list of arguments for the command
         @type list of str
         @param inputChannels dictionary of input channels. The dictionary must
@@ -250,24 +243,24 @@
         """
         if not self.__started:
             return -1
-        
-        self.__server.write(QByteArray(b'runcommand\n'))
-        self.__writeDataBlock('\0'.join(args))
-        
+
+        self.__server.write(QByteArray(b"runcommand\n"))
+        self.__writeDataBlock("\0".join(args))
+
         while True:
             QCoreApplication.processEvents()
-            
+
             if self.__cancel:
                 return -10
-            
+
             if self.__server is None:
                 return -1
-            
+
             if self.__server.bytesAvailable() == 0:
                 QThread.msleep(50)
                 continue
             channel, data = self.__readChannel()
-            
+
             # input channels
             if channel in inputChannels:
                 if channel == "L":
@@ -278,28 +271,29 @@
                 else:
                     inputData = inputChannels[channel](data)
                 self.__writeDataBlock(inputData)
-            
+
             # output channels
             elif channel in outputChannels:
                 outputChannels[channel](data)
-            
+
             # result channel, command is finished
             elif channel == "r":
                 return struct.unpack(HgClient.ReturnFormat, data)[0]
-            
+
             # unexpected but required channel
             elif channel.isupper():
                 raise RuntimeError(
-                    "Unexpected but required channel '{0}'.".format(channel))
-            
+                    "Unexpected but required channel '{0}'.".format(channel)
+                )
+
             # optional channels or no channel at all
             else:
                 pass
-    
+
     def __prompt(self, size, message):
         """
         Private method to prompt the user for some input.
-        
+
         @param size maximum length of the requested input
         @type int
         @param message message sent by the server
@@ -309,19 +303,19 @@
         @rtype tuple of (str, bool)
         """
         from .HgClientPromptDialog import HgClientPromptDialog
+
         inputData = ""
         isPassword = False
         dlg = HgClientPromptDialog(size, message)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            inputData = dlg.getInput() + '\n'
+            inputData = dlg.getInput() + "\n"
             isPassword = dlg.isPassword()
         return inputData, isPassword
-    
-    def runcommand(self, args, prompt=None, inputData=None, output=None,
-                   error=None):
+
+    def runcommand(self, args, prompt=None, inputData=None, output=None, error=None):
         """
         Public method to execute a command via the command server.
-        
+
         @param args list of arguments for the command
         @type list of str
         @param prompt function to reply to prompts by the server. It
@@ -350,12 +344,12 @@
             ok, startError = self.startServer()
             if not ok:
                 return "", startError
-        
+
         self.__commandRunning = True
         outputChannels = {}
         outputBuffer = None
         errorBuffer = None
-        
+
         if output is None:
             outputBuffer = io.StringIO()
             outputChannels["o"] = outputBuffer.write
@@ -366,63 +360,70 @@
         else:
             errorBuffer = io.StringIO()
             outputChannels["e"] = errorBuffer.write
-        
+
         inputChannels = {}
         if prompt is not None:
+
             def func(size):
                 msg = "" if outputBuffer is None else outputBuffer.getvalue()
                 reply, isPassword = prompt(size, msg)
                 return reply, isPassword
+
             inputChannels["L"] = func
         else:
+
             def myprompt(size):
-                msg = (self.tr("For message see output dialog.")
-                       if outputBuffer is None else outputBuffer.getvalue())
+                msg = (
+                    self.tr("For message see output dialog.")
+                    if outputBuffer is None
+                    else outputBuffer.getvalue()
+                )
                 reply, isPassword = self.__prompt(size, msg)
                 return reply, isPassword
+
             inputChannels["L"] = myprompt
         if inputData is not None:
             inputChannels["I"] = inputData
-        
+
         self.__cancel = False
         self.__runcommand(args, inputChannels, outputChannels)
-        
+
         out = outputBuffer.getvalue() if outputBuffer else ""
         err = errorBuffer.getvalue() if errorBuffer else ""
-        
+
         self.__commandRunning = False
-        
+
         return out, err
-    
+
     def cancel(self):
         """
         Public method to cancel the running command.
         """
         self.__cancel = True
         self.restartServer()
-    
+
     def wasCanceled(self):
         """
         Public method to check, if the last command was canceled.
-        
+
         @return flag indicating the cancel state
         @rtype bool
         """
         return self.__cancel
-    
+
     def isExecuting(self):
         """
         Public method to check, if the server is executing a command.
-        
+
         @return flag indicating the execution of a command
         @rtype bool
         """
         return self.__commandRunning
-    
+
     def getRepository(self):
         """
         Public method to get the repository path this client is serving.
-        
+
         @return repository path
         @rtype str
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClientPromptDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgClientPromptDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,64 +18,63 @@
     """
     Class implementing a prompt dialog for the Mercurial command server.
     """
+
     def __init__(self, size, message, parent=None):
         """
         Constructor
-        
+
         @param size maximum length of the requested input (integer)
         @param message message sent by the server (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.inputEdit.setMaxLength(size)
         self.messageEdit.setPlainText(message)
-        
+
         tc = self.messageEdit.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.End)
         self.messageEdit.setTextCursor(tc)
         self.messageEdit.ensureCursorVisible()
-        
+
         self.inputEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     @pyqtSlot(str)
     def on_inputEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the user input.
-        
+
         @param txt text entered by the user (string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(bool(txt))
+
     @pyqtSlot(bool)
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.inputEdit.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.inputEdit.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     def getInput(self):
         """
         Public method to get the user input.
-        
+
         @return user input (string)
         """
         return self.inputEdit.text()
-    
+
     def isPassword(self):
         """
         Public method to check, if the input was a password.
-        
+
         @return flag indicating a password
         @rtype bool
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommandDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommandDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,54 +18,54 @@
 class HgCommandDialog(QDialog, Ui_HgCommandDialog):
     """
     Class implementing the Mercurial command dialog.
-    
+
     It implements a dialog that is used to enter an
     arbitrary Mercurial command. It asks the user to enter
     the commandline parameters.
     """
+
     def __init__(self, argvList, ppath, parent=None):
         """
         Constructor
-        
+
         @param argvList history list of commandline arguments (list of strings)
         @param ppath pathname of the project directory (string)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.commandCombo.clear()
         self.commandCombo.addItems(argvList)
         if len(argvList) > 0:
             self.commandCombo.setCurrentIndex(0)
         self.projectDirLabel.setText(ppath)
-        
+
         # modify some what's this help texts
         t = self.commandCombo.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.commandCombo.setWhatsThis(t)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_commandCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text ignored
         """
         self.okButton.setDisabled(self.commandCombo.currentText() == "")
-    
+
     def getData(self):
         """
         Public method to retrieve the data entered into this dialog.
-        
+
         @return commandline parameters (string)
         """
         return self.commandCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,17 +18,18 @@
 class HgCommitDialog(QWidget, Ui_HgCommitDialog):
     """
     Class implementing a dialog to enter the commit message.
-    
+
     @signal accepted() emitted, if the dialog was accepted
     @signal rejected() emitted, if the dialog was rejected
     """
+
     accepted = pyqtSignal()
     rejected = pyqtSignal()
-    
+
     def __init__(self, vcs, msg, mq, merge, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param msg initial message (string)
         @param mq flag indicating a queue commit (boolean)
@@ -37,25 +38,25 @@
         """
         super().__init__(parent, Qt.WindowType.Window)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
         self.logEdit.setLanguageWithPWL(language, pwl or None, pel or None)
         self.logEdit.setPlainText(msg)
-        
+
         if mq or merge:
             self.amendCheckBox.setVisible(False)
             self.subrepoCheckBox.setVisible(False)
         else:
             self.subrepoCheckBox.setVisible(vcs.hasSubrepositories())
-    
+
     def showEvent(self, evt):
         """
         Protected method called when the dialog is about to be shown.
-        
+
         @param evt the event (QShowEvent)
         """
         commitMessages = self.__vcs.vcsCommitMessages()
@@ -66,57 +67,55 @@
             if len(message) > 60:
                 abbrMsg += "..."
             self.recentComboBox.addItem(abbrMsg, message)
-        
-        commitAuthors = self.__vcs.getPlugin().getPreferences('CommitAuthors')
+
+        commitAuthors = self.__vcs.getPlugin().getPreferences("CommitAuthors")
         self.authorComboBox.clear()
         self.authorComboBox.addItem("")
         self.authorComboBox.addItems(commitAuthors)
-        
+
         self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())
-        
+
         self.logEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.logEdit.clear()
-    
+
     def on_buttonBox_accepted(self):
         """
         Private slot called by the buttonBox accepted signal.
         """
         self.close()
         self.accepted.emit()
-    
+
     def on_buttonBox_rejected(self):
         """
         Private slot called by the buttonBox rejected signal.
         """
         self.close()
         self.rejected.emit()
-    
+
     @pyqtSlot(int)
     def on_recentComboBox_activated(self, index):
         """
         Private slot to select a commit message from recent ones.
-        
+
         @param index index of the selected entry
         @type int
         """
         txt = self.recentComboBox.itemText(index)
         if txt:
             self.logEdit.setPlainText(self.recentComboBox.currentData())
-    
+
     def getCommitData(self):
         """
         Public method to retrieve the entered data for the commit.
-        
+
         @return tuple containing the log message, a flag indicating to amend
             the last commit, a flag indicating to commit subrepositories as
             well, name of the author and date/time of the commit
@@ -125,25 +124,23 @@
         msg = self.logEdit.toPlainText()
         if msg:
             self.__vcs.vcsAddCommitMessage(msg)
-        
+
         author = self.authorComboBox.currentText()
         if author:
-            commitAuthors = self.__vcs.getPlugin().getPreferences(
-                'CommitAuthors')
+            commitAuthors = self.__vcs.getPlugin().getPreferences("CommitAuthors")
             if author in commitAuthors:
                 commitAuthors.remove(author)
             commitAuthors.insert(0, author)
             no = self.__vcs.getPlugin().getPreferences("CommitAuthorsLimit")
             del commitAuthors[no:]
-            self.__vcs.getPlugin().setPreferences(
-                'CommitAuthors', commitAuthors)
-        
+            self.__vcs.getPlugin().setPreferences("CommitAuthors", commitAuthors)
+
         dateTime = (
             self.dateTimeEdit.dateTime().toString("yyyy-MM-dd hh:mm")
-            if self.dateTimeGroup.isChecked() else
-            ""
+            if self.dateTimeGroup.isChecked()
+            else ""
         )
-        
+
         return (
             msg,
             self.amendCheckBox.isChecked(),
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgConflictsListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgConflictsListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint
 from PyQt6.QtWidgets import (
-    QAbstractButton, QDialogButtonBox, QHeaderView, QTreeWidgetItem,
-    QApplication, QWidget
+    QAbstractButton,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
+    QWidget,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -26,87 +30,84 @@
     Class implementing a dialog to show a list of files which had or still
     have conflicts.
     """
+
     StatusRole = Qt.ItemDataRole.UserRole + 1
     FilenameRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__position = QPoint()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
-        self.conflictsList.headerItem().setText(
-            self.conflictsList.columnCount(), "")
-        self.conflictsList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.conflictsList.headerItem().setText(self.conflictsList.columnCount(), "")
+        self.conflictsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of conflicts"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of conflicts"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
         self.project = ericApp().getObject("Project")
-        
+
         self.__hgClient = vcs.getClient()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
         """
         if not self.__position.isNull():
             self.move(self.__position)
-        
+
         super().show()
-    
+
     def start(self):
         """
         Public slot to start the tags command.
         """
         self.errorGroup.hide()
         QApplication.processEvents()
-            
+
         self.intercept = False
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.conflictsList.clear()
         self.__started = True
         self.__getEntries()
-    
+
     def __getEntries(self):
         """
         Private method to get the conflict entries.
         """
         args = self.vcs.initCommand("resolve")
-        args.append('--list')
-        
+        args.append("--list")
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -122,57 +123,52 @@
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
-        
+
         self.__resizeColumns()
         self.__resort()
         self.on_conflictsList_itemSelectionChanged()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.conflictsList.sortItems(
             self.conflictsList.sortColumn(),
-            self.conflictsList.header().sortIndicatorOrder())
-    
+            self.conflictsList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.conflictsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.conflictsList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, status, name):
         """
         Private method to generate a tag item in the tag list.
-        
+
         @param status status of the file (string)
         @param name name of the file (string)
         """
@@ -184,54 +180,51 @@
         else:
             itm.setText(0, self.tr("Unknown Status"))
         itm.setText(1, name)
-        
+
         itm.setData(0, self.StatusRole, status)
         itm.setData(0, self.FilenameRole, self.project.getAbsolutePath(name))
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         status, filename = line.strip().split(None, 1)
         self.__generateItem(status, filename)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the log.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton.setEnabled(False)
         self.start()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_conflictsList_itemDoubleClicked(self, item, column):
         """
         Private slot to open the double clicked entry.
-        
+
         @param item reference to the double clicked item (QTreeWidgetItem)
         @param column column that was double clicked (integer)
         """
         self.on_editButton_clicked()
-    
+
     @pyqtSlot()
     def on_conflictsList_itemSelectionChanged(self):
         """
@@ -245,16 +238,17 @@
                 unresolved += 1
             elif status == "R":
                 resolved += 1
-        
+
         self.resolvedButton.setEnabled(unresolved > 0)
         self.unresolvedButton.setEnabled(resolved > 0)
         self.reMergeButton.setEnabled(unresolved > 0)
         self.editButton.setEnabled(
-            selectedCount == 1 and
-            Utilities.MimeTypes.isTextFile(
-                self.conflictsList.selectedItems()[0].data(
-                    0, self.FilenameRole)))
-    
+            selectedCount == 1
+            and Utilities.MimeTypes.isTextFile(
+                self.conflictsList.selectedItems()[0].data(0, self.FilenameRole)
+            )
+        )
+
     @pyqtSlot()
     def on_resolvedButton_clicked(self):
         """
@@ -268,7 +262,7 @@
         if names:
             self.vcs.vcsResolved(names)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_unresolvedButton_clicked(self):
         """
@@ -282,7 +276,7 @@
         if names:
             self.vcs.vcsResolved(names, unresolve=True)
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_reMergeButton_clicked(self):
         """
@@ -295,7 +289,7 @@
         ]
         if names:
             self.vcs.hgReMerge(names)
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCopyDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgCopyDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,40 +22,40 @@
     Class implementing a dialog to enter the data for a copy or rename
     operation.
     """
+
     def __init__(self, source, parent=None, move=False):
         """
         Constructor
-        
+
         @param source name of the source file/directory (string)
         @param parent parent widget (QWidget)
         @param move flag indicating a move operation (boolean)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.source = source
         if os.path.isdir(self.source):
             self.targetPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         else:
             self.targetPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
-        
+
         if move:
-            self.setWindowTitle(self.tr('Mercurial Move'))
+            self.setWindowTitle(self.tr("Mercurial Move"))
         else:
             self.forceCheckBox.setEnabled(False)
-        
+
         self.sourceEdit.setText(source)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to retrieve the copy data.
-        
+
         @return the target name (string) and a flag indicating
             the operation should be enforced (boolean)
         """
@@ -64,13 +64,14 @@
             sourceDir = os.path.dirname(self.sourceEdit.text())
             target = os.path.join(sourceDir, target)
         return target, self.forceCheckBox.isChecked()
-    
+
     @pyqtSlot(str)
     def on_targetPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the target.
-        
+
         @param txt contents of the target edit (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            os.path.isabs(txt) or os.path.dirname(txt) == "")
+            os.path.isabs(txt) or os.path.dirname(txt) == ""
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,15 +19,16 @@
 class HgDialog(QDialog, Ui_HgDialog):
     """
     Class implementing a dialog starting a process and showing its output.
-    
+
     It starts a QProcess and displays a dialog that
     shows the output of the process. The dialog is modal,
     which causes a synchronized execution of the process.
     """
+
     def __init__(self, text, hg=None, useClient=True, parent=None):
         """
         Constructor
-        
+
         @param text text to be shown by the label (string)
         @param hg reference to the Mercurial interface object (Hg)
         @param useClient flag indicating to use the command server client
@@ -37,62 +38,53 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
-        self.username = ''
-        self.password = ''
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.username = ""
+        self.password = ""
         self.vcs = hg
-        
+
         self.outputGroup.setTitle(text)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if (
-            Preferences.getVCS("AutoClose") and
-            self.normal and
-            self.errors.toPlainText() == ""
+            Preferences.getVCS("AutoClose")
+            and self.normal
+            and self.errors.toPlainText() == ""
         ):
             self.accept()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.vcs.getClient().cancel()
-    
+
     def startProcess(self, args, showArgs=True, environment=None, client=None):
         """
         Public slot used to start the process.
-        
+
         @param args list of arguments for the process
         @type list of str
         @param showArgs flag indicating to show the arguments
@@ -108,105 +100,112 @@
         self.errorGroup.hide()
         self.inputGroup.hide()
         self.normal = False
-        
+
         self.__hasAddOrDelete = False
-        if (
-            args[0] in ["qpush", "qpop", "qgoto", "rebase",
-                        "update", "import", "revert", "graft", "shelve",
-                        "unshelve", "strip", "histedit"] or
-            (args[0] in ["pull", "unbundle"] and
-             ("--update" in args[1:] or "--rebase" in args[1:]))
+        if args[0] in [
+            "qpush",
+            "qpop",
+            "qgoto",
+            "rebase",
+            "update",
+            "import",
+            "revert",
+            "graft",
+            "shelve",
+            "unshelve",
+            "strip",
+            "histedit",
+        ] or (
+            args[0] in ["pull", "unbundle"]
+            and ("--update" in args[1:] or "--rebase" in args[1:])
         ):
             self.__updateCommand = True
         else:
             self.__updateCommand = False
-        
+
         if showArgs:
-            self.resultbox.append(' '.join(args))
-            self.resultbox.append('')
-        
+            self.resultbox.append(" ".join(args))
+            self.resultbox.append("")
+
         if client is None:
             client = self.vcs.getClient()
         out, err = client.runcommand(
             args,
             prompt=self.__getInput,
             output=self.__showOutput,
-            error=self.__showError
+            error=self.__showError,
         )
-        
+
         if err:
             self.__showError(err)
         if out:
             self.__showOutput(out)
-        
+
         self.normal = True
-        
+
         self.__finish()
-        
+
         return True
-    
+
     def normalExit(self):
         """
         Public method to check for a normal process termination.
-        
+
         @return flag indicating normal process termination (boolean)
         """
         return self.normal
-    
+
     def normalExitWithoutErrors(self):
         """
         Public method to check for a normal process termination without
         error messages.
-        
+
         @return flag indicating normal process termination (boolean)
         """
         return self.normal and self.errors.toPlainText() == ""
-    
+
     def __showOutput(self, out):
         """
         Private slot to show some output.
-        
+
         @param out output to be shown (string)
         """
         self.resultbox.insertPlainText(Utilities.filterAnsiSequences(out))
         self.resultbox.ensureCursorVisible()
-        
+
         # check for a changed project file
         if self.__updateCommand:
             for line in out.splitlines():
-                if (
-                    '.epj' in line or
-                    '.e4p' in line
-                ):
+                if ".epj" in line or ".e4p" in line:
                     self.__hasAddOrDelete = True
                     break
-        
+
         QCoreApplication.processEvents()
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(Utilities.filterAnsiSequences(out))
         self.errors.ensureCursorVisible()
-        
+
         QCoreApplication.processEvents()
-    
+
     def hasAddOrDelete(self):
         """
         Public method to check, if the last action contained an add or delete.
-        
+
         @return flag indicating the presence of an add or delete (boolean)
         """
         return self.__hasAddOrDelete
-    
+
     def __getInput(self, size, message):
         """
         Private method to get some input from the user.
-        
+
         @param size maximum length of the requested input
         @type int
         @param message message sent by the server
@@ -221,16 +220,17 @@
 
         self.resultbox.ensureCursorVisible()
         self.errors.ensureCursorVisible()
-        
+
         from PyQt6.QtCore import QEventLoop
+
         loop = QEventLoop(self)
         self.sendButton.clicked[bool].connect(loop.quit)
         self.input.returnPressed.connect(loop.quit)
         loop.exec()
         message = self.input.text() + "\n"
         isPassword = self.passwordCheckBox.isChecked()
-        
+
         self.input.clear()
         self.inputGroup.hide()
-        
+
         return message, isPassword
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,52 +28,50 @@
     Class implementing a dialog to show the output of the hg diff command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.searchWidget.attachTextEdit(self.contents)
-        
+
         self.vcs = vcs
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.contents.document().setDefaultFont(font)
-        
+
         self.highlighter = HgDiffHighlighter(self.contents.document())
-        
+
         self.__diffGenerator = HgDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         self.__diffGenerator.stopProcess()
         e.accept()
-    
-    def start(self, fn, versions=None, bundle=None, qdiff=False,
-              refreshable=False):
+
+    def start(self, fn, versions=None, bundle=None, qdiff=False, refreshable=False):
         """
         Public slot to start the hg diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to
             2 strings or None)
@@ -82,98 +80,95 @@
         @param refreshable flag indicating a refreshable diff (boolean)
         """
         self.refreshButton.setVisible(refreshable)
-        
+
         self.errorGroup.hide()
         self.filename = fn
-        
+
         self.contents.clear()
         self.filesCombo.clear()
         self.highlighter.regenerateRules()
-        
+
         if qdiff:
             self.setWindowTitle(self.tr("Patch Contents"))
-        
+
         self.raise_()
         self.activateWindow()
-        
+
         procStarted = self.__diffGenerator.start(
-            fn, versions=versions, bundle=bundle, qdiff=qdiff)
+            fn, versions=versions, bundle=bundle, qdiff=qdiff
+        )
         if not procStarted:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('hg'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("hg"),
+            )
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal.
         """
         self.refreshButton.setEnabled(True)
-        
+
         diff, errors, fileSeparators = self.__diffGenerator.getResult()
-        
+
         if diff:
             self.contents.setPlainText("".join(diff))
         else:
-            self.contents.setPlainText(
-                self.tr('There is no difference.'))
-        
+            self.contents.setPlainText(self.tr("There is no difference."))
+
         if errors:
             self.errorGroup.show()
             self.errors.setPlainText("".join(errors))
             self.errors.ensureCursorVisible()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(bool(diff))
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(
+            bool(diff)
+        )
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.contents.setTextCursor(tc)
         self.contents.ensureCursorVisible()
-        
+
         self.filesCombo.addItem(self.tr("<Start>"), 0)
         self.filesCombo.addItem(self.tr("<End>"), -1)
         for oldFile, newFile, pos in sorted(fileSeparators):
             if not oldFile:
                 self.filesCombo.addItem(newFile, pos)
             elif oldFile != newFile:
-                self.filesCombo.addItem(
-                    "{0}\n{1}".format(oldFile, newFile), pos)
+                self.filesCombo.addItem("{0}\n{1}".format(oldFile, newFile), pos)
             else:
                 self.filesCombo.addItem(oldFile, pos)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Save):
             self.on_saveButton_clicked()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(int)
     def on_filesCombo_activated(self, index):
         """
         Private slot to handle the selection of a file.
-        
+
         @param index activated row (integer)
         """
         para = self.filesCombo.itemData(index)
-        
+
         if para == 0:
             tc = self.contents.textCursor()
             tc.movePosition(QTextCursor.MoveOperation.Start)
@@ -190,21 +185,23 @@
             tc.movePosition(QTextCursor.MoveOperation.End)
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-            
+
             # step 2: move cursor to desired line
             tc = self.contents.textCursor()
             delta = tc.blockNumber() - para
-            tc.movePosition(QTextCursor.MoveOperation.PreviousBlock,
-                            QTextCursor.MoveMode.MoveAnchor,
-                            delta)
+            tc.movePosition(
+                QTextCursor.MoveOperation.PreviousBlock,
+                QTextCursor.MoveMode.MoveAnchor,
+                delta,
+            )
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to handle the Save button press.
-        
+
         It saves the diff shown in the dialog to a file in the local
         filesystem.
         """
@@ -213,24 +210,25 @@
                 fname = self.vcs.splitPathList(self.filename)[0]
             else:
                 dname, fname = self.vcs.splitPath(self.filename[0])
-                if fname != '.':
+                if fname != ".":
                     fname = "{0}.diff".format(self.filename[0])
                 else:
                     fname = dname
         else:
             fname = self.vcs.splitPath(self.filename)[0]
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -240,34 +238,36 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
                 f.write(eol.join(self.contents.toPlainText().splitlines()))
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-    
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the display.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
         self.refreshButton.setEnabled(False)
-        
+
         self.start(self.filename, refreshable=True)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,35 +17,36 @@
 class HgDiffGenerator(QObject):
     """
     Class implementing the generation of output of the hg diff command.
-    
+
     @signal finished() emitted when all processes have finished
     """
+
     finished = pyqtSignal()
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.vcs = vcs
-        
+
         self.__hgClient = self.vcs.getClient()
-    
+
     def stopProcess(self):
         """
         Public slot to stop the diff process.
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-    
+
     def __getVersionArg(self, version):
         """
         Private method to get a hg revision argument for the given revision.
-        
+
         @param version revision (integer or string)
         @return version argument (string)
         """
@@ -53,11 +54,11 @@
             return None
         else:
             return str(version).strip()
-    
+
     def start(self, fn, versions=None, bundle=None, qdiff=False):
         """
         Public slot to start the hg diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to
             2 strings or None)
@@ -70,26 +71,23 @@
             args = self.vcs.initCommand("qdiff")
         else:
             args = self.vcs.initCommand("diff")
-            
+
             if self.vcs.hasSubrepositories():
                 args.append("--subrepos")
-            
+
             if bundle:
-                args.append('--repository')
+                args.append("--repository")
                 args.append(bundle)
-            elif (
-                self.vcs.bundleFile and
-                os.path.exists(self.vcs.bundleFile)
-            ):
-                args.append('--repository')
+            elif self.vcs.bundleFile and os.path.exists(self.vcs.bundleFile):
+                args.append("--repository")
                 args.append(self.vcs.bundleFile)
-            
+
             if versions is not None:
                 rev1 = self.__getVersionArg(versions[0])
                 rev2 = None
                 if len(versions) == 2:
                     rev2 = self.__getVersionArg(versions[1])
-                
+
                 if rev1 is not None or rev2 is not None:
                     if self.vcs.version >= (5, 7, 0):
                         if rev1 is not None:
@@ -97,32 +95,32 @@
                         if rev2 is not None:
                             args += ["--to", rev2]
                     else:
-                        args.append('-r')
+                        args.append("-r")
                         if rev1 is not None and rev2 is not None:
-                            args.append('{0}:{1}'.format(rev1, rev2))
+                            args.append("{0}:{1}".format(rev1, rev2))
                         elif rev2 is None:
                             args.append(rev1)
                         elif rev1 is None:
-                            args.append(':{0}'.format(rev2))
-        
+                            args.append(":{0}".format(rev2))
+
         if fn:
             if isinstance(fn, list):
                 self.vcs.addArguments(args, fn)
             else:
                 args.append(fn)
-        
+
         self.__oldFile = ""
         self.__oldFileLine = -1
         self.__fileSeparators = []
         self.__output = []
         self.__errors = []
-        
+
         with EricOverrideCursor():
             out, err = self.__hgClient.runcommand(args)
-            
+
             if err:
                 self.__errors = err.splitlines(True)
-            
+
             if out:
                 self.__output = out.splitlines(True)
                 for lineno, line in enumerate(self.__output):
@@ -130,32 +128,32 @@
                         self.__processFileLine(lineno, line)
                     if self.__hgClient.wasCanceled():
                         break
-        
+
         self.__finish()
-        
+
         return True
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         self.finished.emit()
-    
+
     def getResult(self):
         """
         Public method to return the result data.
-        
+
         @return tuple of lists of string containing lines of the diff, the
             list of errors and a list of tuples of filenames and the line
             into the diff output.
         """
         return (self.__output, self.__errors, self.__fileSeparators)
-    
+
     def __extractFileName(self, line):
         """
         Private method to extract the file name out of a file separator line.
-        
+
         @param line line to be processed (string)
         @return extracted file name (string)
         """
@@ -163,24 +161,24 @@
         f = f.rsplit(None, 6)[0]
         f = "__NULL__" if f == "/dev/null" else f.split("/", 1)[1]
         return f
-    
+
     def __processFileLine(self, lineno, line):
         """
         Private slot to process a line giving the old/new file.
-        
+
         @param lineno line number of line to be processed
         @type int
         @param line line to be processed
         @type str
         """
-        if line.startswith('---'):
+        if line.startswith("---"):
             self.__oldFileLine = lineno
             self.__oldFile = self.__extractFileName(line)
         else:
             newFile = self.__extractFileName(line)
             if self.__oldFile == "__NULL__":
-                self.__fileSeparators.append(
-                    (newFile, newFile, self.__oldFileLine))
+                self.__fileSeparators.append((newFile, newFile, self.__oldFileLine))
             else:
                 self.__fileSeparators.append(
-                    (self.__oldFile, newFile, self.__oldFileLine))
+                    (self.__oldFile, newFile, self.__oldFileLine)
+                )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgDiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,19 +7,18 @@
 Module implementing a syntax highlighter for unified and context diff outputs.
 """
 
-from EricGui.EricGenericDiffHighlighter import (
-    TERMINAL, EricGenericDiffHighlighter
-)
+from EricGui.EricGenericDiffHighlighter import TERMINAL, EricGenericDiffHighlighter
 
 
 class HgDiffHighlighter(EricGenericDiffHighlighter):
     """
     Class implementing a diff highlighter for Git.
     """
+
     def __init__(self, doc):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         """
         super().__init__(doc)
@@ -28,29 +27,26 @@
         """
         Public method to generate the rule set.
         """
-        diffHeader = self.makeFormat(fg=self.textColor,
-                                     bg=self.headerColor)
-        diffContext = self.makeFormat(fg=self.textColor,
-                                      bg=self.contextColor)
+        diffHeader = self.makeFormat(fg=self.textColor, bg=self.headerColor)
+        diffContext = self.makeFormat(fg=self.textColor, bg=self.contextColor)
+
+        diffAdded = self.makeFormat(fg=self.textColor, bg=self.addedColor)
+        diffRemoved = self.makeFormat(fg=self.textColor, bg=self.removedColor)
 
-        diffAdded = self.makeFormat(fg=self.textColor,
-                                    bg=self.addedColor)
-        diffRemoved = self.makeFormat(fg=self.textColor,
-                                      bg=self.removedColor)
-        
-        diffHeaderRegex = TERMINAL(r'^diff -r ')
+        diffHeaderRegex = TERMINAL(r"^diff -r ")
+
+        diffOldRegex = TERMINAL(r"^--- ")
+        diffNewRegex = TERMINAL(r"^\+\+\+ ")
+        diffContextRegex = TERMINAL(r"^@@ ")
 
-        diffOldRegex = TERMINAL(r'^--- ')
-        diffNewRegex = TERMINAL(r'^\+\+\+ ')
-        diffContextRegex = TERMINAL(r'^@@ ')
-        
-        diffAddedRegex = TERMINAL(r'^\+')
-        diffRemovedRegex = TERMINAL(r'^-')
-        
-        self.createRules((diffOldRegex, diffRemoved),
-                         (diffNewRegex, diffAdded),
-                         (diffContextRegex, diffContext),
-                         (diffHeaderRegex, diffHeader),
-                         (diffAddedRegex, diffAdded),
-                         (diffRemovedRegex, diffRemoved),
-                         )
+        diffAddedRegex = TERMINAL(r"^\+")
+        diffRemovedRegex = TERMINAL(r"^-")
+
+        self.createRules(
+            (diffOldRegex, diffRemoved),
+            (diffNewRegex, diffAdded),
+            (diffContextRegex, diffContext),
+            (diffHeaderRegex, diffHeader),
+            (diffAddedRegex, diffAdded),
+            (diffRemovedRegex, diffRemoved),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     """
     Class implementing a dialog to enter data for the Mercurial export command.
     """
+
     def __init__(self, bookmarksList, bookmarkAvailable, parent=None):
         """
         Constructor
-        
+
         @param bookmarksList list of defined bookmarks
         @type list of str
         @param bookmarkAvailable flag indicating the availability of the
@@ -35,66 +36,66 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.directoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         # set default values for directory and pattern
         self.patternEdit.setText("%b_%r_%h_%n_of_%N.diff")
         self.directoryPicker.setText(QDir.tempPath())
-        
+
         self.bookmarkCombo.addItem("")
         self.bookmarkCombo.addItems(sorted(bookmarksList))
         self.bookmarkCombo.setEnabled(bookmarkAvailable)
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
         """
         enabled = True
-        
+
         if (
-            self.directoryPicker.text() == "" or
-            self.patternEdit.text() == "" or
-            (self.changesetsEdit.toPlainText() == "" and
-             self.bookmarkCombo.currentText() == "")
+            self.directoryPicker.text() == ""
+            or self.patternEdit.text() == ""
+            or (
+                self.changesetsEdit.toPlainText() == ""
+                and self.bookmarkCombo.currentText() == ""
+            )
         ):
             enabled = False
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(str)
     def on_directoryPicker_textChanged(self, txt):
         """
         Private slot to react on changes of the export directory edit.
-        
+
         @param txt contents of the line edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_patternEdit_textChanged(self, txt):
         """
         Private slot to react on changes of the export file name pattern edit.
-        
+
         @param txt contents of the line edit (string)
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_changesetsEdit_textChanged(self):
         """
         Private slot to react on changes of the changesets edit.
         """
         self.__updateOK()
-    
+
     def getParameters(self):
         """
         Public method to retrieve the export data.
-        
+
         @return tuple naming the output file name, the list of revisions to
             export, the name of a bookmarked branch and flags indicating to
             compare against the second parent, to treat all files as text,
@@ -103,13 +104,11 @@
         @rtype tuple of (str, list of str, str, bool, bool, bool, bool)
         """
         return (
-            os.path.join(
-                self.directoryPicker.text(),
-                self.patternEdit.text()),
+            os.path.join(self.directoryPicker.text(), self.patternEdit.text()),
             self.changesetsEdit.toPlainText().splitlines(),
             self.bookmarkCombo.currentText(),
             self.switchParentCheckBox.isChecked(),
             self.textCheckBox.isChecked(),
             self.datesCheckBox.isChecked(),
-            self.gitCheckBox.isChecked()
+            self.gitCheckBox.isChecked(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtension.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtension.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,20 +14,21 @@
     """
     Class implementing the base class for Mercurial extension interfaces.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-        
+
         self.vcs = vcs
-    
+
     def shutdown(self):
         """
         Public method used to shutdown the extension interface.
-        
+
         The method of this base class does nothing.
         """
         pass
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,30 +16,31 @@
     """
     Class implementing the project browser helper base for Mercurial extension
     interfaces.
-    
+
     Note: The methods initMenus() and menuTitle() have to be reimplemented by
     derived classes.
     """
+
     def __init__(self, vcsObject, browserObject, projectObject):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
         """
         super().__init__()
-        
+
         self.vcs = vcsObject
         self.browser = browserObject
         self.project = projectObject
-    
+
     def initMenus(self):
         """
         Public method to generate the extension menus.
-        
+
         Note: Derived class must implement this method.
-        
+
         @return dictionary of populated menu (dict of QMenu). The dict
             must have the keys 'mainMenu', 'multiMenu', 'backMenu', 'dirMenu'
             and 'dirMultiMenu'.
@@ -47,36 +48,36 @@
             reimplemented
         """
         raise NotImplementedError
-        
+
         return {
-            'mainMenu': QMenu(),
-            'multiMenu': QMenu(),
-            'backMenu': QMenu(),
-            'dirMenu': QMenu(),
-            'dirMultiMenu': QMenu(),
+            "mainMenu": QMenu(),
+            "multiMenu": QMenu(),
+            "backMenu": QMenu(),
+            "dirMenu": QMenu(),
+            "dirMultiMenu": QMenu(),
         }
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         Note: Derived class must implement this method.
-        
+
         @return title of the menu (string)
         @exception NotImplementedError raised if the class has not been
             reimplemented
         """
         raise NotImplementedError
-        
+
         return ""
-    
+
     def showExtensionMenu(self, key, controlled):
         """
         Public method to prepare the extension menu for display.
-        
+
         Note: Derived class must implement this method to adjust the
         enabled states of its menus.
-        
+
         @param key menu key (string, one of 'mainMenu', 'multiMenu',
             'backMenu', 'dirMenu' or 'dirMultiMenu')
         @param controlled flag indicating to prepare the menu for a
@@ -90,7 +91,7 @@
     def _updateVCSStatus(self, name):
         """
         Protected method to update the VCS status of an item.
-        
+
         @param name filename or directoryname of the item to be updated
             (string)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,82 +15,83 @@
     """
     Class implementing the project helper base for Mercurial extension
     interfaces.
-    
+
     Note: The methods initActions(), initMenu(mainMenu) and menuTitle() have
     to be reimplemented by derived classes.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.actions = []
-        
+
         self.initActions()
-    
+
     def setObjects(self, vcsObject, projectObject):
         """
         Public method to set references to the vcs and project objects.
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         """
         self.vcs = vcsObject
         self.project = projectObject
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
-        
+
         Note: Derived class must implement this method.
-        
+
         @exception NotImplementedError raised if the class has not been
             reimplemented
         """
         raise NotImplementedError
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         Note: Derived class must implement this method.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         @exception NotImplementedError raised if the class has not been
             reimplemented
         """
         raise NotImplementedError
-        
+
         return QMenu()
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         Note: Derived class must implement this method.
-        
+
         @return title of the menu (string)
         @exception NotImplementedError raised if the class has not been
             reimplemented
         """
         raise NotImplementedError
-        
+
         return ""
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
-        
+
         Note: Derived class may implement this method if needed.
         """
         pass
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgGraftDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgGraftDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter the data for a graft session.
     """
+
     def __init__(self, vcs, revs=None, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the VCS object
         @type Hg
         @param revs list of revisions to show in the revisions pane
@@ -30,71 +31,68 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())
-        
+
         if revs:
             self.revisionsEdit.setPlainText("\n".join(sorted(revs)))
-        
+
         self.noCommitCheckBox.setEnabled(vcs.version >= (4, 7, 0))
-       
+
         self.__updateOk()
-    
+
     def __updateOk(self):
         """
         Private slot to update the state of the OK button.
         """
         enable = self.revisionsEdit.toPlainText() != ""
         if self.userGroup.isChecked():
-            enable = (
-                enable and
-                (self.currentUserCheckBox.isChecked() or
-                 self.userEdit.text() != "")
+            enable = enable and (
+                self.currentUserCheckBox.isChecked() or self.userEdit.text() != ""
             )
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot()
     def on_revisionsEdit_textChanged(self):
         """
         Private slot to react upon changes of revisions.
         """
         self.__updateOk()
-    
+
     @pyqtSlot(bool)
     def on_userGroup_toggled(self, checked):
         """
         Private slot to handle changes of the user group state.
-        
+
         @param checked flag giving the checked state
         @type bool
         """
         self.__updateOk()
-    
+
     @pyqtSlot(bool)
     def on_currentUserCheckBox_toggled(self, checked):
         """
         Private slot to handle changes of the current user state.
-        
+
         @param checked flag giving the checked state
         @type bool
         """
         self.__updateOk()
-    
+
     @pyqtSlot(str)
     def on_userEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the user name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateOk()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple with list of revisions, a tuple giving a
             flag indicating to set the user, a flag indicating to use the
             current user and the user name, another tuple giving a flag
@@ -110,13 +108,13 @@
             self.currentUserCheckBox.isChecked(),
             self.userEdit.text(),
         )
-        
+
         dateData = (
             self.dateGroup.isChecked(),
             self.currentDateCheckBox.isChecked(),
             self.dateTimeEdit.dateTime().toString("yyyy-MM-dd hh:mm"),
         )
-        
+
         return (
             self.revisionsEdit.toPlainText().strip().splitlines(),
             userData,
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgImportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgImportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing a dialog to enter data for the Mercurial import command.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the VCS object
         @type Hg
         @param parent reference to the parent widget
@@ -31,25 +32,24 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.patchFilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.patchFilePicker.setFilters(self.tr(
-            "Patch Files (*.diff *.patch);;All Files (*)"))
-        
+        self.patchFilePicker.setFilters(
+            self.tr("Patch Files (*.diff *.patch);;All Files (*)")
+        )
+
         self.secretCheckBox.setEnabled(vcs.version >= (5, 3, 0))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.messageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-        
+        self.messageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
         self.__initDateTime = QDateTime.currentDateTime()
         self.dateEdit.setDateTime(self.__initDateTime)
-    
+
     def __updateOK(self):
         """
         Private slot to update the OK button.
@@ -57,23 +57,22 @@
         enabled = True
         if self.patchFilePicker.text() == "":
             enabled = False
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(str)
     def on_patchFilePicker_textChanged(self, txt):
         """
         Private slot to react on changes of the patch file edit.
-        
+
         @param txt contents of the line edit (string)
         """
         self.__updateOK()
-    
+
     def getParameters(self):
         """
         Public method to retrieve the import data.
-        
+
         @return tuple naming the patch file, a flag indicating to not commit,
             a commit message, a commit date, a commit user, a flag indicating
             to commit with the secret phase, a strip count and a flag
@@ -82,11 +81,17 @@
         """
         date = (
             self.dateEdit.dateTime().toString("yyyy-MM-dd hh:mm")
-            if self.dateEdit.dateTime() != self.__initDateTime else
-            ""
+            if self.dateEdit.dateTime() != self.__initDateTime
+            else ""
         )
-        
-        return (self.patchFilePicker.text(), self.noCommitCheckBox.isChecked(),
-                self.messageEdit.toPlainText(), date, self.userEdit.text(),
-                self.secretCheckBox.isChecked(), self.stripSpinBox.value(),
-                self.forceCheckBox.isChecked())
+
+        return (
+            self.patchFilePicker.text(),
+            self.noCommitCheckBox.isChecked(),
+            self.messageEdit.toPlainText(),
+            date,
+            self.userEdit.text(),
+            self.secretCheckBox.isChecked(),
+            self.stripSpinBox.value(),
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,11 +15,24 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QDate, QSize, QPoint
 from PyQt6.QtGui import (
-    QColor, QPixmap, QPainter, QPen, QBrush, QIcon, QTextCursor, QPalette
+    QColor,
+    QPixmap,
+    QPainter,
+    QPen,
+    QBrush,
+    QIcon,
+    QTextCursor,
+    QPalette,
 )
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QApplication,
-    QLineEdit, QMenu, QInputDialog
+    QWidget,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QApplication,
+    QLineEdit,
+    QMenu,
+    QInputDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -35,21 +48,47 @@
 import Preferences
 import Utilities
 
-COLORNAMES = ["blue", "darkgreen", "red", "green", "darkblue", "purple",
-              "cyan", "olive", "magenta", "darkred", "darkmagenta",
-              "darkcyan", "gray", "yellow"]
+COLORNAMES = [
+    "blue",
+    "darkgreen",
+    "red",
+    "green",
+    "darkblue",
+    "purple",
+    "cyan",
+    "olive",
+    "magenta",
+    "darkred",
+    "darkmagenta",
+    "darkcyan",
+    "gray",
+    "yellow",
+]
 COLORS = [str(QColor(x).name()) for x in COLORNAMES]
 
-LIGHTCOLORS = ["#aaaaff", "#7faa7f", "#ffaaaa", "#aaffaa", "#7f7faa",
-               "#ffaaff", "#aaffff", "#d5d579", "#ffaaff", "#d57979",
-               "#d579d5", "#79d5d5", "#d5d5d5", "#d5d500",
-               ]
+LIGHTCOLORS = [
+    "#aaaaff",
+    "#7faa7f",
+    "#ffaaaa",
+    "#aaffaa",
+    "#7f7faa",
+    "#ffaaff",
+    "#aaffff",
+    "#d5d579",
+    "#ffaaff",
+    "#d57979",
+    "#d579d5",
+    "#79d5d5",
+    "#d5d5d5",
+    "#d5d500",
+]
 
 
 class HgLogBrowserDialog(QWidget, Ui_HgLogBrowserDialog):
     """
     Class implementing a dialog to browse the log history.
     """
+
     IconColumn = 0
     BranchColumn = 1
     RevisionColumn = 2
@@ -59,20 +98,20 @@
     MessageColumn = 6
     TagsColumn = 7
     BookmarksColumn = 8
-    
+
     LargefilesCacheL = ".hglf/"
     LargefilesCacheW = ".hglf\\"
     PathSeparatorRe = re.compile(r"/|\\")
-    
+
     GraftedRe = re.compile(r"\(grafted from ([0-9a-fA-F]+)\)")
     GraftedTemplate = '(grafted from <a href="chg:{0}">{0}</a>)'
-    
+
     ClosedIndicator = " \u2612"
-    
+
     def __init__(self, vcs, mode="", parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @type Hg
         @param mode mode of the dialog
@@ -82,23 +121,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         windowFlags = self.windowFlags()
         windowFlags |= Qt.WindowType.WindowContextHelpButtonHint
         self.setWindowFlags(windowFlags)
-        
+
         self.mainSplitter.setSizes([300, 400])
         self.mainSplitter.setStretchFactor(0, 1)
         self.mainSplitter.setStretchFactor(1, 2)
         self.diffSplitter.setStretchFactor(0, 1)
         self.diffSplitter.setStretchFactor(1, 2)
-        
+
         if not mode:
             if vcs.getPlugin().getPreferences("LogBrowserShowFullLog"):
                 mode = "full_log"
             else:
                 mode = "log"
-        
+
         if mode == "log":
             self.setWindowTitle(self.tr("Mercurial Log"))
         elif mode == "incoming":
@@ -107,45 +146,44 @@
             self.setWindowTitle(self.tr("Mercurial Log (Outgoing)"))
         elif mode == "full_log":
             self.setWindowTitle(self.tr("Mercurial Full Log"))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
-        self.filesTree.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.filesTree.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of changesets"))
+            self.tr("Press to refresh the list of changesets")
+        )
         self.refreshButton.setEnabled(False)
-        
+
         self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
         self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
         self.__findBackwards = False
-        
+
         self.modeComboBox.addItem(self.tr("Find"), "find")
         self.modeComboBox.addItem(self.tr("Filter"), "filter")
-        
+
         self.fieldCombo.addItem(self.tr("Revision"), "revision")
         self.fieldCombo.addItem(self.tr("Author"), "author")
         self.fieldCombo.addItem(self.tr("Message"), "message")
         self.fieldCombo.addItem(self.tr("File"), "file")
         self.fieldCombo.addItem(self.tr("Phase"), "phase")
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.document().setDefaultFont(font)
-        
+
         self.diffHighlighter = HgDiffHighlighter(self.diffEdit.document())
         self.__diffGenerator = HgDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.vcs = vcs
         if mode in ("log", "incoming", "outgoing", "full_log"):
             if mode == "full_log":
@@ -157,7 +195,7 @@
             self.commandMode = "log"
             self.initialCommandMode = "log"
         self.__hgClient = vcs.getClient()
-        
+
         self.__detailsTemplate = self.tr(
             "<table>"
             "<tr><td><b>Revision</b></td><td>{0}</td></tr>"
@@ -168,36 +206,32 @@
             "<tr><td><b>Message</b></td><td>{5}</td></tr>"
             "</table>"
         )
-        self.__parentsTemplate = self.tr(
-            "<tr><td><b>Parents</b></td><td>{0}</td></tr>"
-        )
+        self.__parentsTemplate = self.tr("<tr><td><b>Parents</b></td><td>{0}</td></tr>")
         self.__childrenTemplate = self.tr(
             "<tr><td><b>Children</b></td><td>{0}</td></tr>"
         )
-        self.__tagsTemplate = self.tr(
-            "<tr><td><b>Tags</b></td><td>{0}</td></tr>"
-        )
+        self.__tagsTemplate = self.tr("<tr><td><b>Tags</b></td><td>{0}</td></tr>")
         self.__latestTagTemplate = self.tr(
             "<tr><td><b>Latest Tag</b></td><td>{0}</td></tr>"
         )
         self.__bookmarksTemplate = self.tr(
             "<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>"
         )
-        
+
         self.__bundle = ""
         self.__filename = ""
         self.__isFile = False
         self.__selectedRevisions = []
         self.intercept = False
-        
+
         self.__initData()
-        
+
         self.__allBranchesFilter = self.tr("All")
-        
+
         self.fromDate.setDisplayFormat("yyyy-MM-dd")
         self.toDate.setDisplayFormat("yyyy-MM-dd")
         self.__resetUI()
-        
+
         # roles used in the log tree
         self.__messageRole = Qt.ItemDataRole.UserRole
         self.__changesRole = Qt.ItemDataRole.UserRole + 1
@@ -205,58 +239,56 @@
         self.__parentsRole = Qt.ItemDataRole.UserRole + 3
         self.__latestTagRole = Qt.ItemDataRole.UserRole + 4
         self.__incomingRole = Qt.ItemDataRole.UserRole + 5
-        
+
         # roles used in the file tree
         self.__diffFileLineRole = Qt.ItemDataRole.UserRole
-        
+
         self.flags = {
-            'A': self.tr('Added'),
-            'D': self.tr('Deleted'),
-            'M': self.tr('Modified'),
+            "A": self.tr("Added"),
+            "D": self.tr("Deleted"),
+            "M": self.tr("Modified"),
         }
-        
+
         self.phases = {
-            'draft': self.tr("Draft"),
-            'public': self.tr("Public"),
-            'secret': self.tr("Secret"),
+            "draft": self.tr("Draft"),
+            "public": self.tr("Public"),
+            "secret": self.tr("Secret"),
         }
-        
+
         self.__dotRadius = 8
         self.__rowHeight = 20
-        
-        self.logTree.setIconSize(
-            QSize(100 * self.__rowHeight, self.__rowHeight))
+
+        self.logTree.setIconSize(QSize(100 * self.__rowHeight, self.__rowHeight))
         self.BookmarksColumn = self.logTree.columnCount()
-        self.logTree.headerItem().setText(
-            self.BookmarksColumn, self.tr("Bookmarks"))
-        
+        self.logTree.headerItem().setText(self.BookmarksColumn, self.tr("Bookmarks"))
+
         self.__logTreeNormalFont = self.logTree.font()
         self.__logTreeNormalFont.setBold(False)
         self.__logTreeBoldFont = self.logTree.font()
         self.__logTreeBoldFont.setBold(True)
         self.__logTreeHasDarkBackground = ericApp().usesDarkPalette()
-        
+
         self.detailsEdit.anchorClicked.connect(self.__revisionClicked)
-        
+
         self.__initActionsMenu()
-        
+
         self.__finishCallbacks = []
         if self.initialCommandMode == "full_log":
             self.__addFinishCallback(self.on_nextButton_clicked)
-    
+
     def __addFinishCallback(self, callback):
         """
         Private method to add a method to be called once the process finished.
-        
+
         The callback methods are invoke in a FIFO style and are consumed. If
         a callback method needs to be called again, it must be added again.
-        
+
         @param callback callback method
         @type function
         """
         if callback not in self.__finishCallbacks:
             self.__finishCallbacks.append(callback)
-    
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -264,138 +296,181 @@
         self.__actionsMenu = QMenu()
         self.__actionsMenu.setTearOffEnabled(True)
         self.__actionsMenu.setToolTipsVisible(True)
-        
+
         self.__graftAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsGraft"),
-            self.tr("Copy Changesets"), self.__graftActTriggered)
-        self.__graftAct.setToolTip(self.tr(
-            "Copy the selected changesets to the current branch"))
-        
+            self.tr("Copy Changesets"),
+            self.__graftActTriggered,
+        )
+        self.__graftAct.setToolTip(
+            self.tr("Copy the selected changesets to the current branch")
+        )
+
         self.__mergeAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr("Merge with Changeset"), self.__mergeActTriggered)
-        self.__mergeAct.setToolTip(self.tr(
-            "Merge the working directory with the selected changeset"))
-        
+            self.tr("Merge with Changeset"),
+            self.__mergeActTriggered,
+        )
+        self.__mergeAct.setToolTip(
+            self.tr("Merge the working directory with the selected changeset")
+        )
+
         self.__phaseAct = self.__actionsMenu.addAction(
-            self.tr("Change Phase"), self.__phaseActTriggered)
-        self.__phaseAct.setToolTip(self.tr(
-            "Change the phase of the selected revisions"))
-        self.__phaseAct.setWhatsThis(self.tr(
-            """<b>Change Phase</b>\n<p>This changes the phase of the"""
-            """ selected revisions. The selected revisions have to have"""
-            """ the same current phase.</p>"""))
-        
+            self.tr("Change Phase"), self.__phaseActTriggered
+        )
+        self.__phaseAct.setToolTip(
+            self.tr("Change the phase of the selected revisions")
+        )
+        self.__phaseAct.setWhatsThis(
+            self.tr(
+                """<b>Change Phase</b>\n<p>This changes the phase of the"""
+                """ selected revisions. The selected revisions have to have"""
+                """ the same current phase.</p>"""
+            )
+        )
+
         self.__tagAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsTag"), self.tr("Tag"),
-            self.__tagActTriggered)
+            UI.PixmapCache.getIcon("vcsTag"), self.tr("Tag"), self.__tagActTriggered
+        )
         self.__tagAct.setToolTip(self.tr("Tag the selected revision"))
-        
+
         self.__closeHeadsAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("closehead"), self.tr("Close Heads"),
-            self.__closeHeadsActTriggered)
+            UI.PixmapCache.getIcon("closehead"),
+            self.tr("Close Heads"),
+            self.__closeHeadsActTriggered,
+        )
         self.__closeHeadsAct.setToolTip(self.tr("Close the selected heads"))
-        
+
         self.__switchAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsSwitch"), self.tr("Switch"),
-            self.__switchActTriggered)
-        self.__switchAct.setToolTip(self.tr(
-            "Switch the working directory to the selected revision"))
-        
+            UI.PixmapCache.getIcon("vcsSwitch"),
+            self.tr("Switch"),
+            self.__switchActTriggered,
+        )
+        self.__switchAct.setToolTip(
+            self.tr("Switch the working directory to the selected revision")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__bookmarkAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("addBookmark"),
-            self.tr("Define Bookmark..."), self.__bookmarkActTriggered)
-        self.__bookmarkAct.setToolTip(
-            self.tr("Bookmark the selected revision"))
+            self.tr("Define Bookmark..."),
+            self.__bookmarkActTriggered,
+        )
+        self.__bookmarkAct.setToolTip(self.tr("Bookmark the selected revision"))
         self.__bookmarkMoveAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("moveBookmark"),
-            self.tr("Move Bookmark..."), self.__bookmarkMoveActTriggered)
+            self.tr("Move Bookmark..."),
+            self.__bookmarkMoveActTriggered,
+        )
         self.__bookmarkMoveAct.setToolTip(
-            self.tr("Move bookmark to the selected revision"))
-        
+            self.tr("Move bookmark to the selected revision")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__pullAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsUpdate"), self.tr("Pull Changes"),
-            self.__pullActTriggered)
-        self.__pullAct.setToolTip(self.tr(
-            "Pull changes from a remote repository"))
+            UI.PixmapCache.getIcon("vcsUpdate"),
+            self.tr("Pull Changes"),
+            self.__pullActTriggered,
+        )
+        self.__pullAct.setToolTip(self.tr("Pull changes from a remote repository"))
         self.__lfPullAct = self.__actionsMenu.addAction(
-            self.tr("Pull Large Files"), self.__lfPullActTriggered)
-        self.__lfPullAct.setToolTip(self.tr(
-            "Pull large files for selected revisions"))
-        
+            self.tr("Pull Large Files"), self.__lfPullActTriggered
+        )
+        self.__lfPullAct.setToolTip(self.tr("Pull large files for selected revisions"))
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__pushAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr("Push Selected Changes"), self.__pushActTriggered)
-        self.__pushAct.setToolTip(self.tr(
-            "Push changes of the selected changeset and its ancestors"
-            " to a remote repository"))
+            self.tr("Push Selected Changes"),
+            self.__pushActTriggered,
+        )
+        self.__pushAct.setToolTip(
+            self.tr(
+                "Push changes of the selected changeset and its ancestors"
+                " to a remote repository"
+            )
+        )
         self.__pushAllAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr("Push All Changes"), self.__pushAllActTriggered)
-        self.__pushAllAct.setToolTip(self.tr(
-            "Push all changes to a remote repository"))
-        
+            self.tr("Push All Changes"),
+            self.__pushAllActTriggered,
+        )
+        self.__pushAllAct.setToolTip(self.tr("Push all changes to a remote repository"))
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__bundleAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsCreateChangegroup"),
-            self.tr("Create Changegroup"), self.__bundleActTriggered)
-        self.__bundleAct.setToolTip(self.tr(
-            "Create a changegroup file containing the selected changesets"))
-        self.__bundleAct.setWhatsThis(self.tr(
-            """<b>Create Changegroup</b>\n<p>This creates a changegroup"""
-            """ file containing the selected revisions. If no revisions"""
-            """ are selected, all changesets will be bundled. If one"""
-            """ revision is selected, it will be interpreted as the base"""
-            """ revision. Otherwise the lowest revision will be used as"""
-            """ the base revision and all other revision will be bundled."""
-            """ If the dialog is showing outgoing changesets, all"""
-            """ selected changesets will be bundled.</p>"""))
+            self.tr("Create Changegroup"),
+            self.__bundleActTriggered,
+        )
+        self.__bundleAct.setToolTip(
+            self.tr("Create a changegroup file containing the selected changesets")
+        )
+        self.__bundleAct.setWhatsThis(
+            self.tr(
+                """<b>Create Changegroup</b>\n<p>This creates a changegroup"""
+                """ file containing the selected revisions. If no revisions"""
+                """ are selected, all changesets will be bundled. If one"""
+                """ revision is selected, it will be interpreted as the base"""
+                """ revision. Otherwise the lowest revision will be used as"""
+                """ the base revision and all other revision will be bundled."""
+                """ If the dialog is showing outgoing changesets, all"""
+                """ selected changesets will be bundled.</p>"""
+            )
+        )
         self.__unbundleAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsApplyChangegroup"),
-            self.tr("Apply Changegroup"), self.__unbundleActTriggered)
-        self.__unbundleAct.setToolTip(self.tr(
-            "Apply the currently viewed changegroup file"))
-        
+            self.tr("Apply Changegroup"),
+            self.__unbundleActTriggered,
+        )
+        self.__unbundleAct.setToolTip(
+            self.tr("Apply the currently viewed changegroup file")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__gpgSignAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("changesetSign"),
-            self.tr("Sign Revisions"), self.__gpgSignActTriggered)
-        self.__gpgSignAct.setToolTip(self.tr(
-            "Add a signature for the selected revisions"))
+            self.tr("Sign Revisions"),
+            self.__gpgSignActTriggered,
+        )
+        self.__gpgSignAct.setToolTip(
+            self.tr("Add a signature for the selected revisions")
+        )
         self.__gpgVerifyAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("changesetSignVerify"),
-            self.tr("Verify Signatures"), self.__gpgVerifyActTriggered)
-        self.__gpgVerifyAct.setToolTip(self.tr(
-            "Verify all signatures there may be for the selected revision"))
-        
+            self.tr("Verify Signatures"),
+            self.__gpgVerifyActTriggered,
+        )
+        self.__gpgVerifyAct.setToolTip(
+            self.tr("Verify all signatures there may be for the selected revision")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__stripAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("fileDelete"),
-            self.tr("Strip Changesets"), self.__stripActTriggered)
-        self.__stripAct.setToolTip(self.tr(
-            "Strip changesets from a repository"))
-        
+            self.tr("Strip Changesets"),
+            self.__stripActTriggered,
+        )
+        self.__stripAct.setToolTip(self.tr("Strip changesets from a repository"))
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__selectAllAct = self.__actionsMenu.addAction(
-            self.tr("Select All Entries"), self.__selectAllActTriggered)
+            self.tr("Select All Entries"), self.__selectAllActTriggered
+        )
         self.__unselectAllAct = self.__actionsMenu.addAction(
-            self.tr("Deselect All Entries"),
-            lambda: self.__selectAllActTriggered(False))
-        
-        self.actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
+            self.tr("Deselect All Entries"), lambda: self.__selectAllActTriggered(False)
+        )
+
+        self.actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
         self.actionsButton.setMenu(self.__actionsMenu)
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
@@ -403,46 +478,46 @@
         self.__maxDate = QDate()
         self.__minDate = QDate()
         self.__filterLogsEnabled = True
-        
-        self.buf = []        # buffer for stdout
+
+        self.buf = []  # buffer for stdout
         self.diff = None
         self.__started = False
         self.__lastRev = 0
         self.projectMode = False
-        
+
         # attributes to store log graph data
         self.__revs = []
         self.__revColors = {}
         self.__revColor = 0
-        
+
         self.__branchColors = {}
-        
+
         self.__projectWorkingDirParents = []
         self.__projectBranch = ""
-        
+
         self.__childrenInfo = collections.defaultdict(list)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
+        self.vcs.getPlugin().setPreferences("LogBrowserGeometry", self.saveGeometry())
         self.vcs.getPlugin().setPreferences(
-            "LogBrowserGeometry", self.saveGeometry())
-        self.vcs.getPlugin().setPreferences(
-            "LogBrowserSplitterStates", [
+            "LogBrowserSplitterStates",
+            [
                 self.mainSplitter.saveState(),
                 self.detailsSplitter.saveState(),
                 self.diffSplitter.saveState(),
-            ]
+            ],
         )
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -450,7 +525,7 @@
         self.__reloadGeometry()
         self.__restoreSplitterStates()
         self.__resetUI()
-        
+
         super().show()
 
     def __reloadGeometry(self):
@@ -463,19 +538,18 @@
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-    
+
     def __restoreSplitterStates(self):
         """
         Private method to restore the state of the various splitters.
         """
-        states = self.vcs.getPlugin().getPreferences(
-            "LogBrowserSplitterStates")
+        states = self.vcs.getPlugin().getPreferences("LogBrowserSplitterStates")
         if len(states) == 3:
             # we have three splitters
             self.mainSplitter.restoreState(states[0])
             self.detailsSplitter.restoreState(states[1])
             self.diffSplitter.restoreState(states[2])
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
@@ -484,55 +558,53 @@
         self.fromDate.setDate(QDate.currentDate())
         self.toDate.setDate(QDate.currentDate())
         self.fieldCombo.setCurrentIndex(self.fieldCombo.findData("message"))
-        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
-            "LogLimit"))
-        self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences(
-            "StopLogOnCopy"))
-        
+        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit"))
+        self.stopCheckBox.setChecked(
+            self.vcs.getPlugin().getPreferences("StopLogOnCopy")
+        )
+
         if self.initialCommandMode in ("incoming", "outgoing"):
             self.nextButton.setEnabled(False)
             self.limitSpinBox.setEnabled(False)
         else:
             self.nextButton.setEnabled(True)
             self.limitSpinBox.setEnabled(True)
-        
+
         self.logTree.clear()
-        
+
         if self.initialCommandMode == "full_log":
             self.commandMode = "incoming"
         else:
             self.commandMode = self.initialCommandMode
-    
+
     def __resizeColumnsLog(self):
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __resizeColumnsFiles(self):
         """
         Private method to resize the changed files tree columns.
         """
-        self.filesTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.filesTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.filesTree.header().setStretchLastSection(True)
-    
+
     def __resortFiles(self):
         """
         Private method to resort the changed files tree.
         """
         sortColumn = self.filesTree.sortColumn()
-        self.filesTree.sortItems(
-            1, self.filesTree.header().sortIndicatorOrder())
+        self.filesTree.sortItems(1, self.filesTree.header().sortIndicatorOrder())
         self.filesTree.sortItems(
-            sortColumn, self.filesTree.header().sortIndicatorOrder())
-    
+            sortColumn, self.filesTree.header().sortIndicatorOrder()
+        )
+
     def __getColor(self, n):
         """
         Private method to get the (rotating) name of the color given an index.
-        
+
         @param n color index
         @type int
         @return color name
@@ -542,23 +614,22 @@
             return LIGHTCOLORS[n % len(LIGHTCOLORS)]
         else:
             return COLORS[n % len(COLORS)]
-    
+
     def __branchColor(self, branchName):
         """
         Private method to calculate a color for a given branch name.
-        
+
         @param branchName name of the branch (string)
         @return name of the color to use (string)
         """
         if branchName not in self.__branchColors:
-            self.__branchColors[branchName] = self.__getColor(
-                len(self.__branchColors))
+            self.__branchColors[branchName] = self.__getColor(len(self.__branchColors))
         return self.__branchColors[branchName]
-    
+
     def __generateEdges(self, rev, parents):
         """
         Private method to generate edge info for the give data.
-        
+
         @param rev revision to calculate edge info for (integer)
         @param parents list of parent revisions (list of integers)
         @return tuple containing the column and color index for
@@ -571,15 +642,15 @@
             self.__revs.append(rev)
             self.__revColors[rev] = self.__revColor
             self.__revColor += 1
-        
+
         col = self.__revs.index(rev)
         color = self.__revColors.pop(rev)
         nextRevs = self.__revs[:]
-        
+
         # add parents to next
         addparents = [p for p in parents if p not in nextRevs]
-        nextRevs[col:col + 1] = addparents
-        
+        nextRevs[col : col + 1] = addparents
+
         # set colors for the parents
         for i, p in enumerate(addparents):
             if not i:
@@ -587,28 +658,35 @@
             else:
                 self.__revColors[p] = self.__revColor
                 self.__revColor += 1
-        
+
         # add edges to the graph
         edges = []
         if parents[0] != -1:
             for ecol, erev in enumerate(self.__revs):
                 if erev in nextRevs:
-                    edges.append(
-                        (ecol, nextRevs.index(erev), self.__revColors[erev]))
+                    edges.append((ecol, nextRevs.index(erev), self.__revColors[erev]))
                 elif erev == rev:
                     for p in parents:
-                        edges.append(
-                            (ecol, nextRevs.index(p), self.__revColors[p]))
-        
+                        edges.append((ecol, nextRevs.index(p), self.__revColors[p]))
+
         self.__revs = nextRevs
         return col, color, edges
-    
-    def __generateIcon(self, column, color, bottomedges, topedges, dotColor,
-                       currentRev, closed, isPushableDraft):
+
+    def __generateIcon(
+        self,
+        column,
+        color,
+        bottomedges,
+        topedges,
+        dotColor,
+        currentRev,
+        closed,
+        isPushableDraft,
+    ):
         """
         Private method to generate an icon containing the revision tree for the
         given data.
-        
+
         @param column column index of the revision
         @type int
         @param color color of the node
@@ -631,32 +709,32 @@
         @return icon for the node
         @rtype QIcon
         """
+
         def col2x(col, radius):
             """
             Local function to calculate a x-position for a column.
-            
+
             @param col column number (integer)
             @param radius radius of the indicator circle (integer)
             """
             return int(1.2 * radius) * col + radius // 2 + 3
-        
+
         textColor = self.logTree.palette().color(QPalette.ColorRole.Text)
-        
+
         radius = self.__dotRadius
         w = len(bottomedges) * radius + 20
         h = self.__rowHeight
-        
+
         dot_x = col2x(column, radius) - radius // 2
         dot_y = h // 2
-        
+
         pix = QPixmap(w, h)
-        pix.fill(QColor(0, 0, 0, 0))        # draw transparent background
+        pix.fill(QColor(0, 0, 0, 0))  # draw transparent background
         painter = QPainter(pix)
         painter.setRenderHint(QPainter.RenderHint.Antialiasing)
-        
+
         # draw the revision history lines
-        for y1, y2, lines in ((0, h, bottomedges),
-                              (-h, 0, topedges)):
+        for y1, y2, lines in ((0, h, bottomedges), (-h, 0, topedges)):
             if lines:
                 for start, end, ecolor in lines:
                     lpen = QPen(QColor(self.__getColor(ecolor)))
@@ -665,12 +743,12 @@
                     x1 = col2x(start, radius)
                     x2 = col2x(end, radius)
                     painter.drawLine(x1, dot_y + y1, x2, dot_y + y2)
-        
+
         penradius = 1
         pencolor = textColor
-        
+
         dot_y = (h // 2) - radius // 2
-        
+
         # draw an indicator for the revision
         if currentRev:
             # enlarge for the current revision
@@ -684,8 +762,7 @@
         pen.setWidth(penradius)
         painter.setPen(pen)
         if closed:
-            painter.drawRect(dot_x - 2, dot_y + 1,
-                             radius + 4, radius - 2)
+            painter.drawRect(dot_x - 2, dot_y + 1, radius + 4, radius - 2)
         elif self.commandMode in ("incoming", "outgoing"):
             offset = radius // 2
             if self.commandMode == "incoming":
@@ -693,14 +770,14 @@
                 painter.drawConvexPolygon(
                     QPoint(dot_x, dot_y),
                     QPoint(dot_x + 2 * offset, dot_y),
-                    QPoint(dot_x + offset, dot_y + 2 * offset)
+                    QPoint(dot_x + offset, dot_y + 2 * offset),
                 )
             else:
                 # outgoing: draw an up arrow
                 painter.drawConvexPolygon(
                     QPoint(dot_x + offset, dot_y),
                     QPoint(dot_x, dot_y + 2 * offset),
-                    QPoint(dot_x + 2 * offset, dot_y + 2 * offset)
+                    QPoint(dot_x + 2 * offset, dot_y + 2 * offset),
                 )
         else:
             if isPushableDraft:
@@ -710,34 +787,31 @@
                 painter.drawConvexPolygon(
                     QPoint(dot_x + offset, dot_y),
                     QPoint(dot_x, dot_y + 2 * offset),
-                    QPoint(dot_x + 2 * offset, dot_y + 2 * offset)
+                    QPoint(dot_x + 2 * offset, dot_y + 2 * offset),
                 )
             else:
                 painter.drawEllipse(dot_x, dot_y, radius, radius)
         painter.end()
         return QIcon(pix)
-    
+
     def __getParents(self, rev):
         """
         Private method to get the parents of the currently viewed
         file/directory.
-        
+
         @param rev revision number to get parents for (string)
         @return list of parent revisions (list of integers)
         """
         errMsg = ""
         parents = [-1]
-        
+
         if int(rev) > 0:
             args = self.vcs.initCommand("parents")
             if self.commandMode == "incoming":
                 if self.__bundle:
                     args.append("--repository")
                     args.append(self.__bundle)
-                elif (
-                    self.vcs.bundleFile and
-                    os.path.exists(self.vcs.bundleFile)
-                ):
+                elif self.vcs.bundleFile and os.path.exists(self.vcs.bundleFile):
                     args.append("--repository")
                     args.append(self.vcs.bundleFile)
             args.append("--template")
@@ -746,114 +820,101 @@
             args.append(rev)
             if not self.projectMode:
                 args.append(self.__filename)
-            
+
             output, errMsg = self.__hgClient.runcommand(args)
-            
+
             if output:
                 parents = [int(p) for p in output.strip().splitlines()]
-        
+
         return parents
-    
+
     def __identifyProject(self):
         """
         Private method to determine the revision of the project directory.
         """
         errMsg = ""
-        
+
         args = self.vcs.initCommand("identify")
         args.append("-nb")
-        
+
         output, errMsg = self.__hgClient.runcommand(args)
-        
+
         if errMsg:
-            EricMessageBox.critical(
-                self,
-                self.tr("Mercurial Error"),
-                errMsg)
-        
+            EricMessageBox.critical(self, self.tr("Mercurial Error"), errMsg)
+
         if output:
             outputList = output.strip().split(None, 1)
             if len(outputList) == 2:
                 outputRevs = outputList[0].strip()
                 if outputRevs.endswith("+"):
                     outputRevs = outputRevs[:-1]
-                    self.__projectWorkingDirParents = outputRevs.split('+')
+                    self.__projectWorkingDirParents = outputRevs.split("+")
                 else:
                     self.__projectWorkingDirParents = [outputRevs]
                 self.__projectBranch = outputList[1].strip()
-    
+
     def __getClosedBranches(self):
         """
         Private method to get the list of closed branches.
         """
         self.__closedBranchesRevs = []
         errMsg = ""
-        
+
         args = self.vcs.initCommand("branches")
         args.append("--closed")
-        
+
         output, errMsg = self.__hgClient.runcommand(args)
-        
+
         if errMsg:
-            EricMessageBox.critical(
-                self,
-                self.tr("Mercurial Error"),
-                errMsg)
-        
+            EricMessageBox.critical(self, self.tr("Mercurial Error"), errMsg)
+
         if output:
             for line in output.splitlines():
                 if line.strip().endswith("(closed)"):
                     parts = line.split()
-                    self.__closedBranchesRevs.append(
-                        parts[-2].split(":", 1)[0])
-    
+                    self.__closedBranchesRevs.append(parts[-2].split(":", 1)[0])
+
     def __getHeads(self):
         """
         Private method to get the list of all heads.
         """
         self.__headRevisions = []
         errMsg = ""
-        
+
         args = self.vcs.initCommand("heads")
         args.append("--closed")
         args.append("--template")
         args.append("{rev}\n")
-        
+
         output, errMsg = self.__hgClient.runcommand(args)
-        
+
         if errMsg:
-            EricMessageBox.critical(
-                self,
-                self.tr("Mercurial Error"),
-                errMsg)
-        
+            EricMessageBox.critical(self, self.tr("Mercurial Error"), errMsg)
+
         if output:
             for line in output.splitlines():
                 line = line.strip()
                 if line:
                     self.__headRevisions.append(line)
-    
+
     def __getRevisionOfTag(self, tag):
         """
         Private method to get the revision of a tag.
-        
+
         @param tag tag name
         @type str
         @return tuple containing the revision and changeset ID
         @rtype tuple of (str, str)
         """
         errMsg = ""
-        
+
         args = self.vcs.initCommand("tags")
-        
+
         output, errMsg = self.__hgClient.runcommand(args)
-        
+
         if errMsg:
-            EricMessageBox.critical(
-                self,
-                self.tr("Mercurial Error"),
-                errMsg)
-        
+            EricMessageBox.critical(self, self.tr("Mercurial Error"), errMsg)
+
         res = ("", "")
         if output:
             for line in output.splitlines():
@@ -863,15 +924,27 @@
                         if name == tag:
                             res = tuple(rev.split(":", 1))
                             break
-        
+
         return res
-    
-    def __generateLogItem(self, author, date, message, revision, changedPaths,
-                          parents, branches, tags, phase, bookmarks,
-                          latestTag, canPush=False):
+
+    def __generateLogItem(
+        self,
+        author,
+        date,
+        message,
+        revision,
+        changedPaths,
+        parents,
+        branches,
+        tags,
+        phase,
+        bookmarks,
+        latestTag,
+        canPush=False,
+    ):
         """
         Private method to generate a log tree entry.
-        
+
         @param author author info
         @type str
         @param date date info
@@ -901,7 +974,8 @@
         @rtype QTreeWidgetItem
         """
         logMessageColumnWidth = self.vcs.getPlugin().getPreferences(
-            "LogMessageColumnWidth")
+            "LogMessageColumnWidth"
+        )
         msgtxt = ""
         for line in message:
             if ". " in line:
@@ -911,10 +985,9 @@
                 msgtxt += " " + line.strip()
         if len(msgtxt) > logMessageColumnWidth:
             msgtxt = "{0}...".format(msgtxt[:logMessageColumnWidth])
-        
+
         rev, node = revision.split(":")
-        closedStr = (self.ClosedIndicator
-                     if rev in self.__closedBranchesRevs else "")
+        closedStr = self.ClosedIndicator if rev in self.__closedBranchesRevs else ""
         phaseStr = self.phases.get(phase, phase)
         columnLabels = [
             "",
@@ -929,16 +1002,17 @@
         if bookmarks is not None:
             columnLabels.append(", ".join(bookmarks))
         itm = QTreeWidgetItem(self.logTree, columnLabels)
-        
-        itm.setForeground(self.BranchColumn,
-                          QBrush(QColor(self.__branchColor(branches[0]))))
-        
+
+        itm.setForeground(
+            self.BranchColumn, QBrush(QColor(self.__branchColor(branches[0])))
+        )
+
         if not self.projectMode:
             parents = self.__getParents(rev)
         if not parents:
             parents = [int(rev) - 1]
         column, color, edges = self.__generateEdges(int(rev), parents)
-        
+
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changedPaths)
         itm.setData(0, self.__edgesRole, edges)
@@ -950,112 +1024,115 @@
             for parent in parents:
                 self.__childrenInfo[parent].append(int(rev))
         itm.setData(0, self.__incomingRole, self.commandMode == "incoming")
-        
+
         topedges = (
-            self.logTree.topLevelItem(
-                self.logTree.indexOfTopLevelItem(itm) - 1
-            ).data(0, self.__edgesRole)
-            if self.logTree.topLevelItemCount() > 1 else
-            None
+            self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1).data(
+                0, self.__edgesRole
+            )
+            if self.logTree.topLevelItemCount() > 1
+            else None
         )
-        
-        icon = self.__generateIcon(column, color, edges, topedges,
-                                   QColor(self.__branchColor(branches[0])),
-                                   rev in self.__projectWorkingDirParents,
-                                   rev in self.__closedBranchesRevs,
-                                   phase == "draft" and canPush)
+
+        icon = self.__generateIcon(
+            column,
+            color,
+            edges,
+            topedges,
+            QColor(self.__branchColor(branches[0])),
+            rev in self.__projectWorkingDirParents,
+            rev in self.__closedBranchesRevs,
+            phase == "draft" and canPush,
+        )
         itm.setIcon(0, icon)
-        
+
         try:
             self.__lastRev = int(revision.split(":")[0])
         except ValueError:
             self.__lastRev = 0
-        
+
         return itm
-    
+
     def __getLogEntries(self, startRev=None, noEntries=0):
         """
         Private method to retrieve log entries from the repository.
-        
+
         @param startRev revision number to start from (integer, string)
         @param noEntries number of entries to get (0 = default) (int)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         with EricOverrideCursor():
             self.buf = []
             self.cancelled = False
             self.errors.clear()
             self.intercept = False
-            
+
             if noEntries == 0:
                 noEntries = self.limitSpinBox.value()
-            
+
             preargs = []
             args = self.vcs.initCommand(self.commandMode)
-            args.append('--verbose')
+            args.append("--verbose")
             if self.commandMode not in ("incoming", "outgoing"):
-                args.append('--limit')
+                args.append("--limit")
                 args.append(str(noEntries))
             if self.commandMode in ("incoming", "outgoing"):
                 args.append("--newest-first")
                 if self.vcs.hasSubrepositories():
                     args.append("--subrepos")
             if startRev is not None:
-                args.append('--rev')
-                args.append('{0}:0'.format(startRev))
-            if (
-                not self.projectMode and
-                not self.stopCheckBox.isChecked()
-            ):
-                args.append('--follow')
+                args.append("--rev")
+                args.append("{0}:0".format(startRev))
+            if not self.projectMode and not self.stopCheckBox.isChecked():
+                args.append("--follow")
             if self.commandMode == "log":
-                args.append('--copies')
-            args.append('--template')
-            args.append(os.path.join(os.path.dirname(__file__),
-                                     "templates",
-                                     "logBrowserBookmarkPhase.tmpl"))
+                args.append("--copies")
+            args.append("--template")
+            args.append(
+                os.path.join(
+                    os.path.dirname(__file__),
+                    "templates",
+                    "logBrowserBookmarkPhase.tmpl",
+                )
+            )
             if self.commandMode == "incoming":
                 if self.__bundle:
                     args.append(self.__bundle)
                 elif not self.vcs.hasSubrepositories():
                     project = ericApp().getObject("Project")
                     self.vcs.bundleFile = os.path.join(
-                        project.getProjectManagementDir(), "hg-bundle.hg")
+                        project.getProjectManagementDir(), "hg-bundle.hg"
+                    )
                     if os.path.exists(self.vcs.bundleFile):
                         os.remove(self.vcs.bundleFile)
                     preargs = args[:]
                     preargs.append("--quiet")
-                    preargs.append('--bundle')
+                    preargs.append("--bundle")
                     preargs.append(self.vcs.bundleFile)
                     args.append(self.vcs.bundleFile)
             if not self.projectMode:
                 args.append(self.__filename)
-            
+
             if preargs:
                 out, err = self.__hgClient.runcommand(preargs)
             else:
                 err = ""
             if err:
                 if (
-                    self.commandMode == "incoming" and
-                    self.initialCommandMode == "full_log"
+                    self.commandMode == "incoming"
+                    and self.initialCommandMode == "full_log"
                 ):
                     # ignore the error
                     self.commandMode = "log"
                 else:
                     self.__showError(err)
             elif (
-                self.commandMode != "incoming" or
-                (self.vcs.bundleFile and
-                 os.path.exists(self.vcs.bundleFile)) or
-                self.__bundle
+                self.commandMode != "incoming"
+                or (self.vcs.bundleFile and os.path.exists(self.vcs.bundleFile))
+                or self.__bundle
             ):
                 out, err = self.__hgClient.runcommand(args)
                 self.buf = out.splitlines(True)
@@ -1063,17 +1140,16 @@
                     self.__showError(err)
                 self.__processBuffer()
             elif (
-                self.commandMode == "incoming" and
-                self.initialCommandMode == "full_log"
+                self.commandMode == "incoming" and self.initialCommandMode == "full_log"
             ):
                 # no incoming changesets, just switch to log mode
                 self.commandMode = "log"
         self.__finish()
-    
+
     def start(self, name=None, bundle=None, isFile=False, noEntries=0):
         """
         Public slot to start the hg log command.
-        
+
         @param name file/directory name to show the log for
         @type str
         @param bundle name of a bundle file
@@ -1085,7 +1161,7 @@
         """
         self.__bundle = bundle
         self.__isFile = isFile
-        
+
         if self.initialCommandMode == "full_log":
             if isFile:
                 self.commandMode = "log"
@@ -1093,59 +1169,57 @@
             else:
                 self.commandMode = "incoming"
                 self.__addFinishCallback(self.on_nextButton_clicked)
-        
+
         self.sbsSelectLabel.clear()
-        
+
         self.errorGroup.hide()
         self.errors.clear()
         QApplication.processEvents()
-        
+
         self.__initData()
-        
+
         self.__filename = name
-        
+
         self.projectMode = name is None
         self.stopCheckBox.setDisabled(self.projectMode)
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__started = True
         self.__identifyProject()
         self.__getClosedBranches()
         self.__getHeads()
         self.__getLogEntries(noEntries=noEntries)
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
-        
+
         while self.__finishCallbacks:
             self.__finishCallbacks.pop(0)()
-    
+
     def __modifyForLargeFiles(self, filename):
         """
         Private method to convert the displayed file name for a large file.
-        
+
         @param filename file name to be processed (string)
         @return processed file name (string)
         """
         if filename.startswith((self.LargefilesCacheL, self.LargefilesCacheW)):
             return self.tr("{0} (large file)").format(
-                self.PathSeparatorRe.split(filename, 1)[1])
+                self.PathSeparatorRe.split(filename, 1)[1]
+            )
         else:
             return filename
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the hg log command.
@@ -1170,8 +1244,7 @@
                     log["author"] = value.strip()
                 elif key == "parents":
                     log["parents"] = [
-                        int(x.split(":", 1)[0])
-                        for x in value.strip().split()
+                        int(x.split(":", 1)[0]) for x in value.strip().split()
                     ]
                 elif key == "date":
                     log["date"] = " ".join(value.strip().split()[:2])
@@ -1181,34 +1254,43 @@
                     if value.strip():
                         for f in value.strip().split(", "):
                             if f in fileCopies:
-                                changedPaths.append({
-                                    "action": "A",
-                                    "path": self.__modifyForLargeFiles(f),
-                                    "copyfrom": self.__modifyForLargeFiles(
-                                        fileCopies[f]),
-                                })
+                                changedPaths.append(
+                                    {
+                                        "action": "A",
+                                        "path": self.__modifyForLargeFiles(f),
+                                        "copyfrom": self.__modifyForLargeFiles(
+                                            fileCopies[f]
+                                        ),
+                                    }
+                                )
                             else:
-                                changedPaths.append({
-                                    "action": "A",
-                                    "path": self.__modifyForLargeFiles(f),
-                                    "copyfrom": "",
-                                })
+                                changedPaths.append(
+                                    {
+                                        "action": "A",
+                                        "path": self.__modifyForLargeFiles(f),
+                                        "copyfrom": "",
+                                    }
+                                )
                 elif key == "files_mods":
                     if value.strip():
                         for f in value.strip().split(", "):
-                            changedPaths.append({
-                                "action": "M",
-                                "path": self.__modifyForLargeFiles(f),
-                                "copyfrom": "",
-                            })
+                            changedPaths.append(
+                                {
+                                    "action": "M",
+                                    "path": self.__modifyForLargeFiles(f),
+                                    "copyfrom": "",
+                                }
+                            )
                 elif key == "file_dels":
                     if value.strip():
                         for f in value.strip().split(", "):
-                            changedPaths.append({
-                                "action": "D",
-                                "path": self.__modifyForLargeFiles(f),
-                                "copyfrom": "",
-                            })
+                            changedPaths.append(
+                                {
+                                    "action": "D",
+                                    "path": self.__modifyForLargeFiles(f),
+                                    "copyfrom": "",
+                                }
+                            )
                 elif key == "file_copies":
                     if value.strip():
                         for entry in value.strip().split(", "):
@@ -1231,7 +1313,8 @@
                         log["latesttag"] = []
                     elif ":" in tag:
                         log["latesttag"] = [
-                            t.strip() for t in tag.split(":") if t.strip()]
+                            t.strip() for t in tag.split(":") if t.strip()
+                        ]
                     else:
                         log["latesttag"] = [tag]
                 else:
@@ -1242,16 +1325,21 @@
             else:
                 if len(log) > 1:
                     self.__generateLogItem(
-                        log["author"], log["date"],
-                        log["message"], log["revision"], changedPaths,
-                        log["parents"], log["branches"], log["tags"],
-                        log["phase"], log["bookmarks"], log["latesttag"],
-                        canPush=canPush)
+                        log["author"],
+                        log["date"],
+                        log["message"],
+                        log["revision"],
+                        changedPaths,
+                        log["parents"],
+                        log["branches"],
+                        log["tags"],
+                        log["phase"],
+                        log["bookmarks"],
+                        log["latesttag"],
+                        canPush=canPush,
+                    )
                     dt = QDate.fromString(log["date"], Qt.DateFormat.ISODate)
-                    if (
-                        not self.__maxDate.isValid() and
-                        not self.__minDate.isValid()
-                    ):
+                    if not self.__maxDate.isValid() and not self.__minDate.isValid():
                         self.__maxDate = dt
                         self.__minDate = dt
                     else:
@@ -1263,20 +1351,21 @@
                     log = {"message": [], "bookmarks": None, "phase": ""}
                     changedPaths = []
                     fileCopies = {}
-        
+
         self.__resizeColumnsLog()
-        
+
         if self.__started and not self.__finishCallbacks:
             # we are really done
             if self.__selectedRevisions:
                 foundItems = self.logTree.findItems(
-                    self.__selectedRevisions[0], Qt.MatchFlag.MatchExactly,
-                    self.RevisionColumn)
+                    self.__selectedRevisions[0],
+                    Qt.MatchFlag.MatchExactly,
+                    self.RevisionColumn,
+                )
                 if foundItems:
                     self.logTree.setCurrentItem(foundItems[0])
                 else:
-                    self.logTree.setCurrentItem(
-                        self.logTree.topLevelItem(0))
+                    self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             elif self.__projectWorkingDirParents:
                 for rev in self.__projectWorkingDirParents:
                     # rev string format must match with the format of the
@@ -1284,19 +1373,19 @@
                     items = self.logTree.findItems(
                         "{0:>7}:".format(rev),
                         Qt.MatchFlag.MatchStartsWith,
-                        self.RevisionColumn)
+                        self.RevisionColumn,
+                    )
                     if items:
                         self.logTree.setCurrentItem(items[0])
                         break
                 else:
-                    self.logTree.setCurrentItem(
-                        self.logTree.topLevelItem(0))
+                    self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             else:
                 self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             self.__started = False
-        
+
         if self.commandMode in ("incoming", "outgoing"):
-            self.commandMode = "log"    # switch to log mode
+            self.commandMode = "log"  # switch to log mode
             if self.__lastRev > 0:
                 self.nextButton.setEnabled(True)
                 self.limitSpinBox.setEnabled(True)
@@ -1304,7 +1393,7 @@
             if noEntries < self.limitSpinBox.value() and not self.cancelled:
                 self.nextButton.setEnabled(False)
                 self.limitSpinBox.setEnabled(False)
-        
+
         # update the log filters
         self.__filterLogsEnabled = False
         self.fromDate.setMinimumDate(self.__minDate)
@@ -1313,59 +1402,56 @@
         self.toDate.setMinimumDate(self.__minDate)
         self.toDate.setMaximumDate(self.__maxDate)
         self.toDate.setDate(self.__maxDate)
-        
+
         branchFilter = self.branchCombo.currentText()
         if not branchFilter:
             branchFilter = self.__allBranchesFilter
         self.branchCombo.clear()
         self.branchCombo.addItems(
-            [self.__allBranchesFilter] + sorted(self.__branchColors.keys()))
-        self.branchCombo.setCurrentIndex(
-            self.branchCombo.findText(branchFilter))
-        
+            [self.__allBranchesFilter] + sorted(self.__branchColors.keys())
+        )
+        self.branchCombo.setCurrentIndex(self.branchCombo.findText(branchFilter))
+
         self.__filterLogsEnabled = True
         if self.__actionMode() == "filter":
             self.__filterLogs()
         self.__updateToolMenuActions()
-        
+
         # restore selected item
         if self.__selectedRevisions and not self.__finishCallbacks:
             # we are really done
             for revision in self.__selectedRevisions:
                 items = self.logTree.findItems(
-                    revision, Qt.MatchFlag.MatchExactly, self.RevisionColumn)
+                    revision, Qt.MatchFlag.MatchExactly, self.RevisionColumn
+                )
                 if items:
                     items[0].setSelected(True)
             self.__selectedRevisions = []
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __updateSbsSelectLabel(self):
         """
         Private slot to update the enabled status of the diff buttons.
@@ -1375,32 +1461,33 @@
             selectedItems = self.logTree.selectedItems()
             if len(selectedItems) == 1:
                 currentItem = selectedItems[0]
-                rev2 = (
-                    currentItem.text(self.RevisionColumn).split(":", 1)[0]
-                    .strip()
-                )
+                rev2 = currentItem.text(self.RevisionColumn).split(":", 1)[0].strip()
                 parents = currentItem.data(0, self.__parentsRole)
                 if parents:
                     parentLinks = []
                     for index in range(len(parents)):
                         parentLinks.append(
-                            '<a href="sbsdiff:{0}_{1}">&nbsp;{2}&nbsp;</a>'
-                            .format(parents[index], rev2, index + 1))
+                            '<a href="sbsdiff:{0}_{1}">&nbsp;{2}&nbsp;</a>'.format(
+                                parents[index], rev2, index + 1
+                            )
+                        )
                     self.sbsSelectLabel.setText(
-                        self.tr('Side-by-Side Diff to Parent {0}').format(
-                            " ".join(parentLinks)))
+                        self.tr("Side-by-Side Diff to Parent {0}").format(
+                            " ".join(parentLinks)
+                        )
+                    )
             elif len(selectedItems) == 2:
-                rev1 = int(selectedItems[0].text(self.RevisionColumn)
-                           .split(":", 1)[0])
-                rev2 = int(selectedItems[1].text(self.RevisionColumn)
-                           .split(":", 1)[0])
+                rev1 = int(selectedItems[0].text(self.RevisionColumn).split(":", 1)[0])
+                rev2 = int(selectedItems[1].text(self.RevisionColumn).split(":", 1)[0])
                 if rev1 > rev2:
                     # Swap the entries, so that rev1 < rev2
                     rev1, rev2 = rev2, rev1
-                self.sbsSelectLabel.setText(self.tr(
-                    '<a href="sbsdiff:{0}_{1}">Side-by-Side Compare</a>')
-                    .format(rev1, rev2))
-    
+                self.sbsSelectLabel.setText(
+                    self.tr(
+                        '<a href="sbsdiff:{0}_{1}">Side-by-Side Compare</a>'
+                    ).format(rev1, rev2)
+                )
+
     def __updateToolMenuActions(self):
         """
         Private slot to update the status of the tool menu actions and
@@ -1412,8 +1499,11 @@
             secret = 0
             draft = 0
             public = 0
-            for itm in [item for item in self.logTree.selectedItems()
-                        if not item.data(0, self.__incomingRole)]:
+            for itm in [
+                item
+                for item in self.logTree.selectedItems()
+                if not item.data(0, self.__incomingRole)
+            ]:
                 # count phase for local items only
                 phase = itm.text(self.PhaseColumn)
                 if phase == self.phases["draft"]:
@@ -1422,46 +1512,53 @@
                     secret += 1
                 else:
                     public += 1
-            
+
             # step 2: set the status of the phase action
-            if (
-                public == 0 and
-                ((secret > 0 and draft == 0) or
-                 (secret == 0 and draft > 0))
+            if public == 0 and (
+                (secret > 0 and draft == 0) or (secret == 0 and draft > 0)
             ):
                 self.__phaseAct.setEnabled(True)
             else:
                 self.__phaseAct.setEnabled(False)
-            
+
             # do the graft action
             # step 1: count selected entries not belonging to the
             #         current branch
             otherBranches = 0
-            for itm in [item for item in self.logTree.selectedItems()
-                        if not item.data(0, self.__incomingRole)]:
+            for itm in [
+                item
+                for item in self.logTree.selectedItems()
+                if not item.data(0, self.__incomingRole)
+            ]:
                 # for local items only
                 branch = itm.text(self.BranchColumn)
                 if branch != self.__projectBranch:
                     otherBranches += 1
-            
+
             # step 2: set the status of the graft action
             self.__graftAct.setEnabled(otherBranches > 0)
-            
-            selectedItemsCount = len([
-                itm for itm in self.logTree.selectedItems()
-                if not itm.data(0, self.__incomingRole)
-            ])
-            selectedIncomingItemsCount = len([
-                itm for itm in self.logTree.selectedItems()
-                if itm.data(0, self.__incomingRole)
-            ])
-            
+
+            selectedItemsCount = len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
+            )
+            selectedIncomingItemsCount = len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if itm.data(0, self.__incomingRole)
+                ]
+            )
+
             self.__mergeAct.setEnabled(selectedItemsCount == 1)
             self.__tagAct.setEnabled(selectedItemsCount == 1)
             self.__switchAct.setEnabled(selectedItemsCount == 1)
             self.__bookmarkAct.setEnabled(selectedItemsCount == 1)
             self.__bookmarkMoveAct.setEnabled(selectedItemsCount == 1)
-            
+
             if selectedIncomingItemsCount > 0:
                 self.__pullAct.setText(self.tr("Pull Selected Changes"))
             else:
@@ -1469,35 +1566,34 @@
             if self.vcs.canPull():
                 self.__pullAct.setEnabled(True)
                 self.__lfPullAct.setEnabled(
-                    self.vcs.isExtensionActive("largefiles") and
-                    selectedItemsCount > 0)
+                    self.vcs.isExtensionActive("largefiles") and selectedItemsCount > 0
+                )
             else:
                 self.__pullAct.setEnabled(False)
                 self.__lfPullAct.setEnabled(False)
-            
+
             if self.vcs.canPush():
                 self.__pushAct.setEnabled(
-                    selectedItemsCount == 1 and
-                    not self.logTree.selectedItems()[0].data(
-                        0, self.__incomingRole) and
-                    self.logTree.selectedItems()[0].text(self.PhaseColumn) ==
-                    self.phases["draft"])
+                    selectedItemsCount == 1
+                    and not self.logTree.selectedItems()[0].data(0, self.__incomingRole)
+                    and self.logTree.selectedItems()[0].text(self.PhaseColumn)
+                    == self.phases["draft"]
+                )
                 self.__pushAllAct.setEnabled(True)
             else:
                 self.__pushAct.setEnabled(False)
                 self.__pushAllAct.setEnabled(False)
-            
+
             self.__stripAct.setEnabled(
-                self.vcs.isExtensionActive("strip") and
-                selectedItemsCount == 1)
-            
+                self.vcs.isExtensionActive("strip") and selectedItemsCount == 1
+            )
+
             # count incoming items for 'full_log'
             if self.initialCommandMode == "full_log":
                 # incoming items are at the top
                 incomingCount = 0
                 for row in range(self.logTree.topLevelItemCount()):
-                    if self.logTree.topLevelItem(row).data(
-                            0, self.__incomingRole):
+                    if self.logTree.topLevelItem(row).data(0, self.__incomingRole):
                         incomingCount += 1
                     else:
                         break
@@ -1506,76 +1602,103 @@
                 localCount = self.logTree.topLevelItemCount()
             self.__bundleAct.setEnabled(localCount > 0)
             self.__unbundleAct.setEnabled(False)
-            
+
             self.__gpgSignAct.setEnabled(
-                self.vcs.isExtensionActive("gpg") and
-                selectedItemsCount > 0)
+                self.vcs.isExtensionActive("gpg") and selectedItemsCount > 0
+            )
             self.__gpgVerifyAct.setEnabled(
-                self.vcs.isExtensionActive("gpg") and
-                selectedItemsCount == 1)
-            
+                self.vcs.isExtensionActive("gpg") and selectedItemsCount == 1
+            )
+
             if self.vcs.isExtensionActive("closehead"):
-                revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
-                        for itm in self.logTree.selectedItems()
-                        if not itm.data(0, self.__incomingRole)]
+                revs = [
+                    itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
                 revs = [rev for rev in revs if rev in self.__headRevisions]
                 self.__closeHeadsAct.setEnabled(len(revs) > 0)
             else:
                 self.__closeHeadsAct.setEnabled(False)
             self.actionsButton.setEnabled(True)
-        
+
         elif self.initialCommandMode == "incoming" and self.projectMode:
-            for act in [self.__phaseAct, self.__graftAct, self.__mergeAct,
-                        self.__tagAct, self.__closeHeadsAct, self.__switchAct,
-                        self.__bookmarkAct, self.__bookmarkMoveAct,
-                        self.__pushAct, self.__pushAllAct, self.__stripAct,
-                        self.__bundleAct, self.__gpgSignAct,
-                        self.__gpgVerifyAct]:
+            for act in [
+                self.__phaseAct,
+                self.__graftAct,
+                self.__mergeAct,
+                self.__tagAct,
+                self.__closeHeadsAct,
+                self.__switchAct,
+                self.__bookmarkAct,
+                self.__bookmarkMoveAct,
+                self.__pushAct,
+                self.__pushAllAct,
+                self.__stripAct,
+                self.__bundleAct,
+                self.__gpgSignAct,
+                self.__gpgVerifyAct,
+            ]:
                 act.setEnabled(False)
-            
+
             self.__pullAct.setText(self.tr("Pull Selected Changes"))
             if self.vcs.canPull() and not bool(self.__bundle):
-                selectedIncomingItemsCount = len([
-                    itm for itm in self.logTree.selectedItems()
-                    if itm.data(0, self.__incomingRole)
-                ])
+                selectedIncomingItemsCount = len(
+                    [
+                        itm
+                        for itm in self.logTree.selectedItems()
+                        if itm.data(0, self.__incomingRole)
+                    ]
+                )
                 self.__pullAct.setEnabled(selectedIncomingItemsCount > 0)
                 self.__lfPullAct.setEnabled(
-                    self.vcs.isExtensionActive("largefiles") and
-                    selectedIncomingItemsCount > 0)
+                    self.vcs.isExtensionActive("largefiles")
+                    and selectedIncomingItemsCount > 0
+                )
             else:
                 self.__pullAct.setEnabled(False)
                 self.__lfPullAct.setEnabled(False)
-            
+
             self.__unbundleAct.setEnabled(bool(self.__bundle))
-            
+
             self.actionsButton.setEnabled(True)
-        
+
         elif self.initialCommandMode == "outgoing" and self.projectMode:
-            for act in [self.__phaseAct, self.__graftAct, self.__mergeAct,
-                        self.__tagAct, self.__closeHeadsAct, self.__switchAct,
-                        self.__bookmarkAct, self.__bookmarkMoveAct,
-                        self.__pullAct, self.__lfPullAct,
-                        self.__stripAct, self.__gpgSignAct,
-                        self.__gpgVerifyAct, self.__unbundleAct]:
+            for act in [
+                self.__phaseAct,
+                self.__graftAct,
+                self.__mergeAct,
+                self.__tagAct,
+                self.__closeHeadsAct,
+                self.__switchAct,
+                self.__bookmarkAct,
+                self.__bookmarkMoveAct,
+                self.__pullAct,
+                self.__lfPullAct,
+                self.__stripAct,
+                self.__gpgSignAct,
+                self.__gpgVerifyAct,
+                self.__unbundleAct,
+            ]:
                 act.setEnabled(False)
-            
+
             selectedItemsCount = len(self.logTree.selectedItems())
             if self.vcs.canPush():
                 self.__pushAct.setEnabled(
-                    selectedItemsCount == 1 and
-                    self.logTree.selectedItems()[0].text(self.PhaseColumn) ==
-                    self.phases["draft"])
+                    selectedItemsCount == 1
+                    and self.logTree.selectedItems()[0].text(self.PhaseColumn)
+                    == self.phases["draft"]
+                )
                 self.__pushAllAct.setEnabled(True)
             else:
                 self.__pushAct.setEnabled(False)
                 self.__pushAllAct.setEnabled(False)
-            
+
             self.__bundleAct.setEnabled(selectedItemsCount > 0)
-        
+
         else:
             self.actionsButton.setEnabled(False)
-    
+
     def __updateDetailsAndFiles(self):
         """
         Private slot to update the details and file changes panes.
@@ -1583,11 +1706,10 @@
         self.detailsEdit.clear()
         self.filesTree.clear()
         self.__diffUpdatesFiles = False
-        
+
         selectedItems = self.logTree.selectedItems()
         if len(selectedItems) == 1:
-            self.detailsEdit.setHtml(
-                self.__generateDetailsTableText(selectedItems[0]))
+            self.detailsEdit.setHtml(self.__generateDetailsTableText(selectedItems[0]))
             self.__updateFilesTree(self.filesTree, selectedItems[0])
             self.__resizeColumnsFiles()
             self.__resortFiles()
@@ -1598,7 +1720,8 @@
             if index1 > index2:
                 # Swap the entries
                 selectedItems[0], selectedItems[1] = (
-                    selectedItems[1], selectedItems[0]
+                    selectedItems[1],
+                    selectedItems[0],
                 )
             html = "{0}<hr/>{1}".format(
                 self.__generateDetailsTableText(selectedItems[0]),
@@ -1606,12 +1729,12 @@
             )
             self.detailsEdit.setHtml(html)
             # self.filesTree is updated by the diff
-    
+
     def __generateDetailsTableText(self, itm):
         """
         Private method to generate an HTML table with the details of the given
         changeset.
-        
+
         @param itm reference to the item the table should be based on
         @type QTreeWidgetItem
         @return HTML table containing details
@@ -1622,76 +1745,74 @@
                 tagsStr = self.__tagsTemplate.format(itm.text(self.TagsColumn))
             else:
                 tagsStr = ""
-            
+
             if itm.text(self.BookmarksColumn):
                 bookmarksStr = self.__bookmarksTemplate.format(
-                    itm.text(self.BookmarksColumn))
+                    itm.text(self.BookmarksColumn)
+                )
             else:
                 bookmarksStr = ""
-            
+
             if self.projectMode and itm.data(0, self.__latestTagRole):
                 latestTagLinks = []
                 for tag in itm.data(0, self.__latestTagRole):
-                    latestTagLinks.append('<a href="rev:{0}">{1}</a>'.format(
-                        self.__getRevisionOfTag(tag)[0], tag))
+                    latestTagLinks.append(
+                        '<a href="rev:{0}">{1}</a>'.format(
+                            self.__getRevisionOfTag(tag)[0], tag
+                        )
+                    )
                 latestTagStr = self.__latestTagTemplate.format(
-                    ", ".join(latestTagLinks))
+                    ", ".join(latestTagLinks)
+                )
             else:
                 latestTagStr = ""
-            
+
             rev = int(itm.text(self.RevisionColumn).split(":", 1)[0])
-            
+
             if itm.data(0, self.__parentsRole):
                 parentLinks = []
-                for parent in [str(x) for x in
-                               itm.data(0, self.__parentsRole)]:
-                    parentLinks.append(
-                        '<a href="rev:{0}">{0}</a>'.format(parent))
-                parentsStr = self.__parentsTemplate.format(
-                    ", ".join(parentLinks))
+                for parent in [str(x) for x in itm.data(0, self.__parentsRole)]:
+                    parentLinks.append('<a href="rev:{0}">{0}</a>'.format(parent))
+                parentsStr = self.__parentsTemplate.format(", ".join(parentLinks))
             else:
                 parentsStr = ""
-            
+
             if self.__childrenInfo[rev]:
                 childLinks = []
                 for child in [str(x) for x in self.__childrenInfo[rev]]:
-                    childLinks.append(
-                        '<a href="rev:{0}">{0}</a>'.format(child))
-                childrenStr = self.__childrenTemplate.format(
-                    ", ".join(childLinks))
+                    childLinks.append('<a href="rev:{0}">{0}</a>'.format(child))
+                childrenStr = self.__childrenTemplate.format(", ".join(childLinks))
             else:
                 childrenStr = ""
-            
+
             messagesList = []
             for line in itm.data(0, self.__messageRole):
                 match = HgLogBrowserDialog.GraftedRe.fullmatch(line)
                 if match:
                     messagesList.append(
-                        HgLogBrowserDialog.GraftedTemplate.format(
-                            match.group(1)))
+                        HgLogBrowserDialog.GraftedTemplate.format(match.group(1))
+                    )
                 else:
                     messagesList.append(Utilities.html_encode(line.strip()))
             messageStr = "<br />\n".join(messagesList)
-            
+
             html = self.__detailsTemplate.format(
                 itm.text(self.RevisionColumn),
                 itm.text(self.DateColumn),
                 itm.text(self.AuthorColumn),
-                itm.text(self.BranchColumn).replace(
-                    self.ClosedIndicator, ""),
-                parentsStr + childrenStr + tagsStr + latestTagStr +
-                bookmarksStr,
+                itm.text(self.BranchColumn).replace(self.ClosedIndicator, ""),
+                parentsStr + childrenStr + tagsStr + latestTagStr + bookmarksStr,
                 messageStr,
             )
         else:
             html = ""
-        
+
         return html
-    
+
     def __updateFilesTree(self, parent, itm):
         """
         Private method to update the files tree with changes of the given item.
-        
+
         @param parent parent for the items to be added
         @type QTreeWidget or QTreeWidgetItem
         @param itm reference to the item the update should be based on
@@ -1701,38 +1822,44 @@
             changes = itm.data(0, self.__changesRole)
             if len(changes) > 0:
                 for change in changes:
-                    QTreeWidgetItem(parent, [
-                        self.flags[change["action"]],
-                        change["path"].strip(),
-                        change["copyfrom"].strip(),
-                    ])
-    
+                    QTreeWidgetItem(
+                        parent,
+                        [
+                            self.flags[change["action"]],
+                            change["path"].strip(),
+                            change["copyfrom"].strip(),
+                        ],
+                    )
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_logTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the log tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
         self.__updateToolMenuActions()
-        
+
         # Highlight the current entry using a bold font
         for col in range(self.logTree.columnCount()):
             current and current.setFont(col, self.__logTreeBoldFont)
             previous and previous.setFont(col, self.__logTreeNormalFont)
-        
+
         # set the state of the up and down buttons
         self.upButton.setEnabled(
-            current is not None and
-            self.logTree.indexOfTopLevelItem(current) > 0)
+            current is not None and self.logTree.indexOfTopLevelItem(current) > 0
+        )
         self.downButton.setEnabled(
-            current is not None and
-            int(current.text(self.RevisionColumn).split(":")[0]) > 0 and
-            (self.logTree.indexOfTopLevelItem(current) <
-                self.logTree.topLevelItemCount() - 1 or
-             self.nextButton.isEnabled()))
-    
+            current is not None
+            and int(current.text(self.RevisionColumn).split(":")[0]) > 0
+            and (
+                self.logTree.indexOfTopLevelItem(current)
+                < self.logTree.topLevelItemCount() - 1
+                or self.nextButton.isEnabled()
+            )
+        )
+
     @pyqtSlot()
     def on_logTree_itemSelectionChanged(self):
         """
@@ -1742,7 +1869,7 @@
         self.__updateSbsSelectLabel()
         self.__updateToolMenuActions()
         self.__generateDiffs()
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -1751,7 +1878,7 @@
         itm = self.logTree.itemAbove(self.logTree.currentItem())
         if itm:
             self.logTree.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -1765,7 +1892,7 @@
             if self.nextButton.isEnabled():
                 self.__addFinishCallback(self.on_downButton_clicked)
                 self.on_nextButton_clicked()
-    
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
@@ -1776,61 +1903,61 @@
                 self.__getLogEntries(startRev=self.__lastRev - 1)
             else:
                 self.__getLogEntries()
-    
+
     @pyqtSlot(QDate)
     def on_fromDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(QDate)
     def on_toDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(int)
     def on_branchCombo_activated(self, index):
         """
         Private slot called, when a new branch is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(int)
     def on_fieldCombo_activated(self, index):
         """
         Private slot called, when a new filter field is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
-    
+
     @pyqtSlot(str)
     def on_rxEdit_textChanged(self, txt):
         """
         Private slot called, when a filter expression is entered.
-        
+
         @param txt filter expression (string)
         """
         if self.__actionMode() == "filter":
             self.__filterLogs()
         elif self.__actionMode() == "find":
             self.__findItem(self.__findBackwards, interactive=True)
-    
+
     @pyqtSlot()
     def on_rxEdit_returnPressed(self):
         """
@@ -1838,7 +1965,7 @@
         """
         if self.__actionMode() == "find":
             self.__findItem(self.__findBackwards, interactive=True)
-    
+
     def __filterLogs(self):
         """
         Private method to filter the log entries.
@@ -1847,9 +1974,9 @@
             from_ = self.fromDate.date().toString("yyyy-MM-dd")
             to_ = self.toDate.date().addDays(1).toString("yyyy-MM-dd")
             branch = self.branchCombo.currentText()
-            closedBranch = branch + '--'
+            closedBranch = branch + "--"
             fieldIndex, searchRx, indexIsRole = self.__prepareFieldSearch()
-            
+
             visibleItemCount = self.logTree.topLevelItemCount()
             currentItem = self.logTree.currentItem()
             for topIndex in range(self.logTree.topLevelItemCount()):
@@ -1858,8 +1985,8 @@
                     if fieldIndex == self.__changesRole:
                         changes = topItem.data(0, self.__changesRole)
                         txt = "\n".join(
-                            [c["path"] for c in changes] +
-                            [c["copyfrom"] for c in changes]
+                            [c["path"] for c in changes]
+                            + [c["copyfrom"] for c in changes]
                         )
                     else:
                         # Find based on complete message text
@@ -1867,12 +1994,13 @@
                 else:
                     txt = topItem.text(fieldIndex)
                 if (
-                    topItem.text(self.DateColumn) <= to_ and
-                    topItem.text(self.DateColumn) >= from_ and
-                    (branch == self.__allBranchesFilter or
-                     topItem.text(self.BranchColumn) in
-                        [branch, closedBranch]) and
-                    searchRx.search(txt) is not None
+                    topItem.text(self.DateColumn) <= to_
+                    and topItem.text(self.DateColumn) >= from_
+                    and (
+                        branch == self.__allBranchesFilter
+                        or topItem.text(self.BranchColumn) in [branch, closedBranch]
+                    )
+                    and searchRx.search(txt) is not None
                 ):
                     topItem.setHidden(False)
                     if topItem is currentItem:
@@ -1883,13 +2011,13 @@
                         self.filesTree.clear()
                     visibleItemCount -= 1
             self.logTree.header().setSectionHidden(
-                self.IconColumn,
-                visibleItemCount != self.logTree.topLevelItemCount())
-    
+                self.IconColumn, visibleItemCount != self.logTree.topLevelItemCount()
+            )
+
     def __prepareFieldSearch(self):
         """
         Private slot to prepare the filed search data.
-        
+
         @return tuple of field index, search expression and flag indicating
             that the field index is a data role (integer, string, boolean)
         """
@@ -1902,8 +2030,7 @@
             fieldIndex = self.RevisionColumn
             txt = self.rxEdit.text()
             if txt.startswith("^"):
-                searchRx = re.compile(r"^\s*{0}".format(txt[1:]),
-                                      re.IGNORECASE)
+                searchRx = re.compile(r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
             else:
                 searchRx = re.compile(txt, re.IGNORECASE)
         elif txt == "file":
@@ -1917,44 +2044,42 @@
             fieldIndex = self.__messageRole
             searchRx = re.compile(self.rxEdit.text(), re.IGNORECASE)
             indexIsRole = True
-        
+
         return fieldIndex, searchRx, indexIsRole
-    
+
     @pyqtSlot(bool)
     def on_stopCheckBox_clicked(self, checked):
         """
         Private slot called, when the stop on copy/move checkbox is clicked.
-        
+
         @param checked flag indicating the state of the check box (boolean)
         """
-        self.vcs.getPlugin().setPreferences("StopLogOnCopy",
-                                            self.stopCheckBox.isChecked())
+        self.vcs.getPlugin().setPreferences(
+            "StopLogOnCopy", self.stopCheckBox.isChecked()
+        )
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self, addNext=False):
         """
         Private slot to refresh the log.
-        
+
         @param addNext flag indicating to get a second batch of log entries as
             well
         @type bool
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton.setEnabled(False)
-        
+
         # save the selected items commit IDs
         self.__selectedRevisions = []
         for item in self.logTree.selectedItems():
             self.__selectedRevisions.append(item.text(self.RevisionColumn))
-        
+
         if self.initialCommandMode in ("incoming", "outgoing"):
             self.nextButton.setEnabled(False)
             self.limitSpinBox.setEnabled(False)
@@ -1963,15 +2088,19 @@
         else:
             self.nextButton.setEnabled(True)
             self.limitSpinBox.setEnabled(True)
-        
+
         if self.initialCommandMode == "full_log":
             self.commandMode = "incoming"
             self.__addFinishCallback(self.on_nextButton_clicked)
         else:
             self.commandMode = self.initialCommandMode
-        self.start(self.__filename, bundle=self.__bundle, isFile=self.__isFile,
-                   noEntries=self.logTree.topLevelItemCount())
-    
+        self.start(
+            self.__filename,
+            bundle=self.__bundle,
+            isFile=self.__isFile,
+            noEntries=self.logTree.topLevelItemCount(),
+        )
+
     @pyqtSlot()
     def __phaseActTriggered(self):
         """
@@ -1983,13 +2112,12 @@
             revs = []
             for itm in self.logTree.selectedItems():
                 if itm.text(self.PhaseColumn) == currentPhase:
-                    revs.append(
-                        itm.text(self.RevisionColumn).split(":")[0].strip())
-            
+                    revs.append(itm.text(self.RevisionColumn).split(":")[0].strip())
+
             if not revs:
                 self.__phaseAct.setEnabled(False)
                 return
-            
+
             if currentPhase == self.phases["draft"]:
                 newPhase = self.phases["secret"]
                 data = (revs, "s", True)
@@ -2000,88 +2128,113 @@
             if res:
                 for itm in self.logTree.selectedItems():
                     itm.setText(self.PhaseColumn, newPhase)
-    
+
     @pyqtSlot()
     def __graftActTriggered(self):
         """
         Private slot to handle the Copy Changesets action.
         """
         revs = []
-        
-        for itm in [item for item in self.logTree.selectedItems()
-                    if not item.data(0, self.__incomingRole)]:
+
+        for itm in [
+            item
+            for item in self.logTree.selectedItems()
+            if not item.data(0, self.__incomingRole)
+        ]:
             branch = itm.text(self.BranchColumn)
             if branch != self.__projectBranch:
-                revs.append(
-                    itm.text(self.RevisionColumn).strip().split(":", 1)[0])
-        
+                revs.append(itm.text(self.RevisionColumn).strip().split(":", 1)[0])
+
         if revs:
             shouldReopen = self.vcs.hgGraft(revs)
             if shouldReopen:
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Copy Changesets"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __tagActTriggered(self):
         """
         Private slot to tag the selected revision.
         """
-        if len([itm for itm in self.logTree.selectedItems()
-                if not itm.data(0, self.__incomingRole)]) == 1:
+        if (
+            len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
+            )
+            == 1
+        ):
             itm = self.logTree.selectedItems()[0]
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
             tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0]
             res = self.vcs.vcsTag(revision=rev, tagName=tag)
             if res:
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __closeHeadsActTriggered(self):
         """
         Private slot to close the selected head revisions.
         """
         if self.vcs.isExtensionActive("closehead"):
-            revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
-                    for itm in self.logTree.selectedItems()
-                    if not itm.data(0, self.__incomingRole)]
+            revs = [
+                itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)
+            ]
             revs = [rev for rev in revs if rev in self.__headRevisions]
             if revs:
                 closeheadExtension = self.vcs.getExtensionObject("closehead")
                 if closeheadExtension is not None:
                     closeheadExtension.hgCloseheads(revisions=revs)
-                    
+
                     self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __switchActTriggered(self):
         """
         Private slot to switch the working directory to the
         selected revision.
         """
-        if len([itm for itm in self.logTree.selectedItems()
-                if not itm.data(0, self.__incomingRole)]) == 1:
+        if (
+            len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
+            )
+            == 1
+        ):
             itm = self.logTree.selectedItems()[0]
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
-            bookmarks = [bm.strip() for bm in
-                         itm.text(self.BookmarksColumn).strip().split(",")
-                         if bm.strip()]
+            bookmarks = [
+                bm.strip()
+                for bm in itm.text(self.BookmarksColumn).strip().split(",")
+                if bm.strip()
+            ]
             if bookmarks:
                 bookmark, ok = QInputDialog.getItem(
                     self,
                     self.tr("Switch"),
-                    self.tr("Select bookmark to switch to (leave empty to"
-                            " use revision):"),
+                    self.tr(
+                        "Select bookmark to switch to (leave empty to" " use revision):"
+                    ),
                     [""] + bookmarks,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
                 if bookmark:
@@ -2092,78 +2245,96 @@
                     res = EricMessageBox.yesNo(
                         None,
                         self.tr("Switch"),
-                        self.tr(
-                            """The project should be reread. Do this now?"""),
-                        yesDefault=True)
+                        self.tr("""The project should be reread. Do this now?"""),
+                        yesDefault=True,
+                    )
                     if res:
                         ericApp().getObject("Project").reopenProject()
                         return
-                
+
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __bookmarkActTriggered(self):
         """
         Private slot to bookmark the selected revision.
         """
-        if len([itm for itm in self.logTree.selectedItems()
-                if not itm.data(0, self.__incomingRole)]) == 1:
+        if (
+            len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
+            )
+            == 1
+        ):
             itm = self.logTree.selectedItems()[0]
-            rev, changeset = (
-                itm.text(self.RevisionColumn).strip().split(":", 1)
-            )
+            rev, changeset = itm.text(self.RevisionColumn).strip().split(":", 1)
             bookmark, ok = QInputDialog.getText(
                 self,
                 self.tr("Define Bookmark"),
-                self.tr('Enter bookmark name for changeset "{0}":').format(
-                    changeset),
-                QLineEdit.EchoMode.Normal)
+                self.tr('Enter bookmark name for changeset "{0}":').format(changeset),
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and bool(bookmark):
                 self.vcs.hgBookmarkDefine(
-                    revision="rev({0})".format(rev),
-                    bookmark=bookmark)
+                    revision="rev({0})".format(rev), bookmark=bookmark
+                )
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __bookmarkMoveActTriggered(self):
         """
         Private slot to move a bookmark to the selected revision.
         """
-        if len([itm for itm in self.logTree.selectedItems()
-                if not itm.data(0, self.__incomingRole)]) == 1:
+        if (
+            len(
+                [
+                    itm
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)
+                ]
+            )
+            == 1
+        ):
             itm = self.logTree.selectedItems()[0]
-            rev, changeset = (
-                itm.text(self.RevisionColumn).strip().split(":", 1)
-            )
+            rev, changeset = itm.text(self.RevisionColumn).strip().split(":", 1)
             bookmarksList = self.vcs.hgGetBookmarksList()
             bookmark, ok = QInputDialog.getItem(
                 self,
                 self.tr("Move Bookmark"),
-                self.tr('Select the bookmark to be moved  to changeset'
-                        ' "{0}":').format(changeset),
+                self.tr(
+                    "Select the bookmark to be moved  to changeset" ' "{0}":'
+                ).format(changeset),
                 [""] + bookmarksList,
-                0, False)
+                0,
+                False,
+            )
             if ok and bool(bookmark):
                 self.vcs.hgBookmarkMove(
-                    revision="rev({0})".format(rev),
-                    bookmark=bookmark)
+                    revision="rev({0})".format(rev), bookmark=bookmark
+                )
                 self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __lfPullActTriggered(self):
         """
         Private slot to pull large files of selected revisions.
         """
         revs = []
-        for itm in [item for item in self.logTree.selectedItems()
-                    if not item.data(0, self.__incomingRole)]:
+        for itm in [
+            item
+            for item in self.logTree.selectedItems()
+            if not item.data(0, self.__incomingRole)
+        ]:
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0]
             if rev:
                 revs.append(rev)
-        
+
         if revs:
             self.vcs.getExtensionObject("largefiles").hgLfPull(revisions=revs)
-    
+
     @pyqtSlot()
     def __pullActTriggered(self):
         """
@@ -2172,11 +2343,14 @@
         shouldReopen = False
         refresh = False
         addNext = False
-        
+
         if self.initialCommandMode in ("log", "full_log", "incoming"):
             revs = []
-            for itm in [item for item in self.logTree.selectedItems()
-                        if item.data(0, self.__incomingRole)]:
+            for itm in [
+                item
+                for item in self.logTree.selectedItems()
+                if item.data(0, self.__incomingRole)
+            ]:
                 rev = itm.text(self.RevisionColumn).split(":")[1].strip()
                 if rev:
                     revs.append(rev)
@@ -2184,21 +2358,21 @@
             refresh = True
             if self.initialCommandMode == "incoming":
                 addNext = True
-        
+
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Pull Changes"),
-                self.tr(
-                    """The project should be reread. Do this now?"""),
-                yesDefault=True)
+                self.tr("""The project should be reread. Do this now?"""),
+                yesDefault=True,
+            )
             if res:
                 ericApp().getObject("Project").reopenProject()
                 return
-        
+
         if refresh:
             self.on_refreshButton_clicked(addNext=addNext)
-    
+
     @pyqtSlot()
     def __pushActTriggered(self):
         """
@@ -2211,8 +2385,9 @@
             if rev:
                 self.vcs.hgPush(rev=rev)
                 self.on_refreshButton_clicked(
-                    addNext=self.initialCommandMode == "outgoing")
-    
+                    addNext=self.initialCommandMode == "outgoing"
+                )
+
     @pyqtSlot()
     def __pushAllActTriggered(self):
         """
@@ -2220,7 +2395,7 @@
         """
         self.vcs.hgPush()
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __stripActTriggered(self):
         """
@@ -2229,21 +2404,20 @@
         itm = self.logTree.selectedItems()[0]
         if not itm.data(0, self.__incomingRole):
             rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1]
-            shouldReopen = self.vcs.getExtensionObject("strip").hgStrip(
-                rev=rev)
+            shouldReopen = self.vcs.getExtensionObject("strip").hgStrip(rev=rev)
             if shouldReopen:
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Strip Changesets"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def __mergeActTriggered(self):
         """
@@ -2253,17 +2427,21 @@
         itm = self.logTree.selectedItems()[0]
         if not itm.data(0, self.__incomingRole):
             rev = "rev({0})".format(
-                itm.text(self.RevisionColumn).strip().split(":", 1)[0])
+                itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+            )
             self.vcs.vcsMerge("", rev=rev)
-    
+
     @pyqtSlot()
     def __bundleActTriggered(self):
         """
         Private slot to create a changegroup file.
         """
         if self.initialCommandMode in ("log", "full_log"):
-            selectedItems = [itm for itm in self.logTree.selectedItems()
-                             if not itm.data(0, self.__incomingRole)]
+            selectedItems = [
+                itm
+                for itm in self.logTree.selectedItems()
+                if not itm.data(0, self.__incomingRole)
+            ]
             if len(selectedItems) == 0:
                 # all revisions of the local repository will be bundled
                 bundleData = {
@@ -2273,8 +2451,9 @@
                 }
             elif len(selectedItems) == 1:
                 # the selected changeset is the base
-                rev = selectedItems[0].text(self.RevisionColumn).split(
-                    ":", 1)[0].strip()
+                rev = (
+                    selectedItems[0].text(self.RevisionColumn).split(":", 1)[0].strip()
+                )
                 bundleData = {
                     "revs": [],
                     "base": rev,
@@ -2290,7 +2469,7 @@
                 baseRev = min(revs)
                 while baseRev in revs:
                     revs.remove(baseRev)
-                
+
                 bundleData = {
                     "revs": [str(rev) for rev in revs],
                     "base": str(baseRev),
@@ -2303,15 +2482,15 @@
                 for itm in selectedItems:
                     rev = itm.text(self.RevisionColumn).split(":", 1)[0]
                     revs.append(rev.strip())
-                
+
                 bundleData = {
                     "revs": revs,
                     "base": "",
                     "all": False,
                 }
-        
+
         self.vcs.hgBundle(bundleData=bundleData)
-    
+
     @pyqtSlot()
     def __unbundleActTriggered(self):
         """
@@ -2324,29 +2503,33 @@
                     None,
                     self.tr("Apply Changegroup"),
                     self.tr("""The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.vcs.vcsLogBrowser()
             self.close()
-    
+
     @pyqtSlot()
     def __gpgSignActTriggered(self):
         """
         Private slot to sign the selected revisions.
         """
         revs = []
-        for itm in [item for item in self.logTree.selectedItems()
-                    if not item.data(0, self.__incomingRole)]:
+        for itm in [
+            item
+            for item in self.logTree.selectedItems()
+            if not item.data(0, self.__incomingRole)
+        ]:
             rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip()
             if rev:
                 revs.append(rev)
-        
+
         if revs:
             self.vcs.getExtensionObject("gpg").hgGpgSign(revisions=revs)
-    
+
     @pyqtSlot()
     def __gpgVerifyActTriggered(self):
         """
@@ -2356,13 +2539,12 @@
         if not itm.data(0, self.__incomingRole):
             rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip()
             if rev:
-                self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(
-                    rev=rev)
-    
+                self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures(rev=rev)
+
     def __selectAllActTriggered(self, select=True):
         """
         Private method to select or unselect all log entries.
-        
+
         @param select flag indicating to select all entries
         @type bool
         """
@@ -2371,66 +2553,64 @@
             self.logTree.topLevelItem(row).setSelected(select)
         self.logTree.blockSignals(blocked)
         self.on_logTree_itemSelectionChanged()
-    
+
     def __actionMode(self):
         """
         Private method to get the selected action mode.
-        
+
         @return selected action mode (string, one of filter or find)
         """
-        return self.modeComboBox.itemData(
-            self.modeComboBox.currentIndex())
-    
+        return self.modeComboBox.itemData(self.modeComboBox.currentIndex())
+
     @pyqtSlot(int)
     def on_modeComboBox_currentIndexChanged(self, index):
         """
         Private slot to react on mode changes.
-        
+
         @param index index of the selected entry (integer)
         """
         mode = self.modeComboBox.itemData(index)
         findMode = mode == "find"
         filterMode = mode == "filter"
-        
+
         self.fromDate.setEnabled(filterMode)
         self.toDate.setEnabled(filterMode)
         self.branchCombo.setEnabled(filterMode)
         self.findPrevButton.setVisible(findMode)
         self.findNextButton.setVisible(findMode)
-        
+
         if findMode:
             for topIndex in range(self.logTree.topLevelItemCount()):
                 self.logTree.topLevelItem(topIndex).setHidden(False)
             self.logTree.header().setSectionHidden(self.IconColumn, False)
         elif filterMode:
             self.__filterLogs()
-    
+
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
         """
         Private slot to find the previous item matching the entered criteria.
         """
         self.__findItem(True)
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next item matching the entered criteria.
         """
         self.__findItem(False)
-    
+
     def __findItem(self, backwards=False, interactive=False):
         """
         Private slot to find an item matching the entered criteria.
-        
+
         @param backwards flag indicating to search backwards (boolean)
         @param interactive flag indicating an interactive search (boolean)
         """
         self.__findBackwards = backwards
-        
+
         fieldIndex, searchRx, indexIsRole = self.__prepareFieldSearch()
-        currentIndex = self.logTree.indexOfTopLevelItem(
-            self.logTree.currentItem())
+        currentIndex = self.logTree.indexOfTopLevelItem(self.logTree.currentItem())
         if backwards:
             if interactive:
                 indexes = range(currentIndex, -1, -1)
@@ -2440,17 +2620,15 @@
             if interactive:
                 indexes = range(currentIndex, self.logTree.topLevelItemCount())
             else:
-                indexes = range(currentIndex + 1,
-                                self.logTree.topLevelItemCount())
-        
+                indexes = range(currentIndex + 1, self.logTree.topLevelItemCount())
+
         for index in indexes:
             topItem = self.logTree.topLevelItem(index)
             if indexIsRole:
                 if fieldIndex == self.__changesRole:
                     changes = topItem.data(0, self.__changesRole)
                     txt = "\n".join(
-                        [c["path"] for c in changes] +
-                        [c["copyfrom"] for c in changes]
+                        [c["path"] for c in changes] + [c["copyfrom"] for c in changes]
                     )
                 else:
                     # Find based on complete message text
@@ -2464,13 +2642,14 @@
             EricMessageBox.information(
                 self,
                 self.tr("Find Commit"),
-                self.tr("""'{0}' was not found.""").format(self.rxEdit.text()))
-    
+                self.tr("""'{0}' was not found.""").format(self.rxEdit.text()),
+            )
+
     def __revisionClicked(self, url):
         """
         Private slot to handle the anchorClicked signal of the changeset
         details pane.
-        
+
         @param url URL that was clicked
         @type QUrl
         """
@@ -2487,8 +2666,7 @@
                 searchStr = ":{0}".format(changeset[:12])  # max. 12 hash chars
                 # format must be in sync with item generation format
                 searchFlags = Qt.MatchFlag.MatchContains
-            items = self.logTree.findItems(
-                searchStr, searchFlags, self.RevisionColumn)
+            items = self.logTree.findItems(searchStr, searchFlags, self.RevisionColumn)
             if items:
                 itm = items[0]
                 if itm.isHidden():
@@ -2497,18 +2675,17 @@
             else:
                 # load the next batch and try again
                 if not self.cancelled and self.nextButton.isEnabled():
-                    self.__addFinishCallback(
-                        lambda: self.__revisionClicked(url))
+                    self.__addFinishCallback(lambda: self.__revisionClicked(url))
                     self.on_nextButton_clicked()
-    
+
     ###########################################################################
     ## Diff handling methods below
     ###########################################################################
-    
+
     def __generateDiffs(self, parent=1):
         """
         Private slot to generate diff outputs for the selected item.
-        
+
         @param parent number of parent to diff against
         @type int
         """
@@ -2516,7 +2693,7 @@
         self.diffLabel.setText(self.tr("Differences"))
         self.diffSelectLabel.clear()
         self.diffHighlighter.regenerateRules()
-        
+
         selectedItems = self.logTree.selectedItems()
         if len(selectedItems) == 1:
             currentItem = selectedItems[0]
@@ -2524,12 +2701,12 @@
             parents = currentItem.data(0, self.__parentsRole)
             if len(parents) >= parent:
                 self.diffLabel.setText(
-                    self.tr("Differences to Parent {0}").format(parent))
+                    self.tr("Differences to Parent {0}").format(parent)
+                )
                 rev1 = parents[parent - 1]
-                
-                self.__diffGenerator.start(self.__filename, [rev1, rev2],
-                                           self.__bundle)
-            
+
+                self.__diffGenerator.start(self.__filename, [rev1, rev2], self.__bundle)
+
             if len(parents) > 1:
                 if parent == 1:
                     par1 = "&nbsp;1&nbsp;"
@@ -2540,34 +2717,33 @@
                 else:
                     par2 = '<a href="diff:2">&nbsp;2&nbsp;</a>'
                 self.diffSelectLabel.setText(
-                    self.tr('Diff to Parent {0}{1}').format(par1, par2))
+                    self.tr("Diff to Parent {0}{1}").format(par1, par2)
+                )
         elif len(selectedItems) == 2:
-            rev2 = int(selectedItems[0].text(
-                self.RevisionColumn).split(":")[0])
-            rev1 = int(selectedItems[1].text(
-                self.RevisionColumn).split(":")[0])
-            
-            self.__diffGenerator.start(self.__filename,
-                                       [min(rev1, rev2), max(rev1, rev2)],
-                                       self.__bundle)
+            rev2 = int(selectedItems[0].text(self.RevisionColumn).split(":")[0])
+            rev1 = int(selectedItems[1].text(self.RevisionColumn).split(":")[0])
+
+            self.__diffGenerator.start(
+                self.__filename, [min(rev1, rev2), max(rev1, rev2)], self.__bundle
+            )
         else:
             self.diffEdit.clear()
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal of the diff generator.
         """
         diff, errors, fileSeparators = self.__diffGenerator.getResult()
-        
+
         if diff:
             self.diffEdit.setPlainText("".join(diff))
         elif errors:
             self.diffEdit.setPlainText("".join(errors))
         else:
-            self.diffEdit.setPlainText(self.tr('There is no difference.'))
-        
+            self.diffEdit.setPlainText(self.tr("There is no difference."))
+
         self.saveLabel.setVisible(bool(diff))
-        
+
         if self.__diffUpdatesFiles:
             for oldFileName, newFileName, lineNumber in fileSeparators:
                 if oldFileName == newFileName:
@@ -2585,21 +2761,21 @@
                 for fileName in (oldFileName, newFileName):
                     if fileName != "__NULL__":
                         items = self.filesTree.findItems(
-                            fileName, Qt.MatchFlag.MatchExactly, 1)
+                            fileName, Qt.MatchFlag.MatchExactly, 1
+                        )
                         for item in items:
-                            item.setData(0, self.__diffFileLineRole,
-                                         lineNumber)
-        
+                            item.setData(0, self.__diffFileLineRole, lineNumber)
+
         tc = self.diffEdit.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.diffEdit.setTextCursor(tc)
         self.diffEdit.ensureCursorVisible()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_filesTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the files tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -2622,20 +2798,23 @@
                     tc.movePosition(QTextCursor.MoveOperation.End)
                     self.diffEdit.setTextCursor(tc)
                     self.diffEdit.ensureCursorVisible()
-                    
+
                     # step 2: move cursor to desired line
                     tc = self.diffEdit.textCursor()
                     delta = tc.blockNumber() - para
-                    tc.movePosition(QTextCursor.MoveOperation.PreviousBlock,
-                                    QTextCursor.MoveMode.MoveAnchor, delta)
+                    tc.movePosition(
+                        QTextCursor.MoveOperation.PreviousBlock,
+                        QTextCursor.MoveMode.MoveAnchor,
+                        delta,
+                    )
                     self.diffEdit.setTextCursor(tc)
                     self.diffEdit.ensureCursorVisible()
-    
+
     @pyqtSlot(str)
     def on_diffSelectLabel_linkActivated(self, link):
         """
         Private slot to handle the selection of a diff target.
-        
+
         @param link activated link
         @type str
         """
@@ -2645,47 +2824,49 @@
                 with contextlib.suppress(ValueError):
                     parent = int(parent)
                     self.__generateDiffs(parent)
-    
+
     @pyqtSlot(str)
     def on_saveLabel_linkActivated(self, link):
         """
         Private slot to handle the selection of the save link.
-        
+
         @param link activated link
         @type str
         """
         if ":" not in link:
             return
-        
+
         scheme, rest = link.split(":", 1)
         if scheme != "save" or rest != "me":
             return
-        
+
         if self.projectMode:
             if self.__filename is None:
-                fname = "{0}.diff".format(os.path.splitext(
-                    ericApp().getObject("Project").getProjectFile())[0])
+                fname = "{0}.diff".format(
+                    os.path.splitext(ericApp().getObject("Project").getProjectFile())[0]
+                )
             else:
                 fname = self.vcs.splitPath(self.__filename)[0]
                 fname += "/{0}.diff".format(os.path.split(fname)[-1])
         else:
             dname, fname = self.vcs.splitPath(self.__filename)
-            if fname != '.':
+            if fname != ".":
                 fname = "{0}.diff".format(self.__filename)
             else:
                 fname = dname
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2695,29 +2876,33 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
                 f.write(eol.join(self.diffEdit.toPlainText().splitlines()))
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-    
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot(str)
     def on_sbsSelectLabel_linkActivated(self, link):
         """
         Private slot to handle selection of a side-by-side link.
-        
+
         @param link text of the selected link
         @type str
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgMergeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgMergeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter the data for a merge operation.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -33,10 +33,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
@@ -44,24 +43,24 @@
         else:
             self.bookmarkButton.setHidden(True)
             self.bookmarkCombo.setHidden(True)
-        
+
         # connect various radio buttons and input fields
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
         self.branchButton.toggled.connect(self.__updateOK)
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -78,14 +77,13 @@
             enabled = self.bookmarkCombo.currentText() != ""
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def getParameters(self):
         """
         Public method to retrieve the merge data.
-        
+
         @return tuple naming the revision and a flag indicating a
             forced merge
         @rtype tuple of (str, bool)
@@ -104,5 +102,5 @@
             rev = self.expressionEdit.text()
         else:
             rev = ""
-        
+
         return rev, self.forceCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgNewProjectOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgNewProjectOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,78 +26,70 @@
     Class implementing the Options Dialog for a new project from the
     repository.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcsProjectDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.__vcs = vcs
-        
-        vcsUrlHistory = self.__vcs.getPlugin().getPreferences(
-            "RepositoryUrlHistory")
+
+        vcsUrlHistory = self.__vcs.getPlugin().getPreferences("RepositoryUrlHistory")
         self.vcsUrlPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.vcsUrlPicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.vcsUrlPicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
         self.vcsUrlPicker.setPathsList(vcsUrlHistory)
-        self.vcsUrlClearHistoryButton.setIcon(
-            UI.PixmapCache.getIcon("editDelete"))
+        self.vcsUrlClearHistoryButton.setIcon(UI.PixmapCache.getIcon("editDelete"))
         self.vcsUrlPicker.setText("")
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
         self.vcsProjectDirPicker.setText(self.__initPaths[0])
-        
-        self.lfNoteLabel.setVisible(
-            self.__vcs.isExtensionActive("largefiles"))
-        self.largeCheckBox.setVisible(
-            self.__vcs.isExtensionActive("largefiles"))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.lfNoteLabel.setVisible(self.__vcs.isExtensionActive("largefiles"))
+        self.largeCheckBox.setVisible(self.__vcs.isExtensionActive("largefiles"))
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_vcsProjectDirPicker_textChanged(self, txt):
         """
         Private slot to handle a change of the project directory.
-        
+
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            Utilities.fromNativeSeparators(txt) not in self.__initPaths)
-    
+            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+        )
+
     @pyqtSlot(str)
     def on_vcsUrlPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the line edit (string)
         """
         url = QUrl.fromUserInput(txt)
         enable = url.isValid() and url.scheme() in ConfigHgSchemes
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-        
-        self.vcsUrlPicker.setPickerEnabled(url.scheme() == "file" or
-                                           len(txt) == 0)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
+        self.vcsUrlPicker.setPickerEnabled(url.scheme() == "file" or len(txt) == 0)
+
     @pyqtSlot()
     def on_vcsUrlClearHistoryButton_clicked(self):
         """
@@ -106,19 +98,19 @@
         currentVcsUrl = self.vcsUrlPicker.text()
         self.vcsUrlPicker.clear()
         self.vcsUrlPicker.setText(currentVcsUrl)
-        
+
         self.__saveHistory()
-    
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog and to
         save the history of entered repository URLs.
-        
+
         @return a tuple of a string (project directory) and a dictionary
             containing the data entered.
         """
         self.__saveHistory()
-        
+
         url = QUrl.fromUserInput(self.vcsUrlPicker.text().replace("\\", "/"))
         vcsdatadict = {
             "url": url.toString(QUrl.UrlFormattingOption.None_),
@@ -126,7 +118,7 @@
             "largefiles": self.largeCheckBox.isChecked(),
         }
         return (self.vcsProjectDirPicker.text(), vcsdatadict)
-    
+
     def __saveHistory(self):
         """
         Private method to save the repository URL history.
@@ -135,11 +127,10 @@
         vcsUrlHistory = self.vcsUrlPicker.getPathItems()
         if url not in vcsUrlHistory:
             vcsUrlHistory.insert(0, url)
-        
+
         # max. list sizes is hard coded to 20 entries
         newVcsUrlHistory = [url for url in vcsUrlHistory if url]
         if len(newVcsUrlHistory) > 20:
             newVcsUrlHistory = newVcsUrlHistory[:20]
-        
-        self.__vcs.getPlugin().setPreferences(
-            "RepositoryUrlHistory", newVcsUrlHistory)
+
+        self.__vcs.getPlugin().setPreferences("RepositoryUrlHistory", newVcsUrlHistory)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,24 +18,25 @@
     Class implementing a dialog to enter options used to start a project in the
     repository.
     """
+
     def __init__(self, vcs, project, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param project reference to the project object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a dictionary containing the data entered
         """
         vcsdatadict = {
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgPhaseDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgPhaseDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,57 +18,58 @@
     Class dimplementing a dialog to enter data for the Mercurial Phase
     operation.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.phaseCombo.addItem("", "")
         self.phaseCombo.addItem(self.tr("Public"), "p")
         self.phaseCombo.addItem(self.tr("Draft"), "d")
         self.phaseCombo.addItem(self.tr("Secret"), "s")
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def __updateOk(self):
         """
         Private slot to update the state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.revisionsEdit.toPlainText().strip() != "" and
-            self.phaseCombo.currentText().strip() != "")
-    
+            self.revisionsEdit.toPlainText().strip() != ""
+            and self.phaseCombo.currentText().strip() != ""
+        )
+
     @pyqtSlot()
     def on_revisionsEdit_textChanged(self):
         """
         Private slot to react upon changes of revisions.
         """
         self.__updateOk()
-    
+
     @pyqtSlot(int)
     def on_phaseCombo_activated(self, index):
         """
         Private slot to react upon changes of the phase.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__updateOk()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple with list of revisions, phase and a flag indicating
             a forced operation (list of strings, string, boolean)
         """
         return (
             self.revisionsEdit.toPlainText().strip().splitlines(),
             self.phaseCombo.itemData(self.phaseCombo.currentIndex()),
-            self.forceCheckBox.isChecked()
+            self.forceCheckBox.isChecked(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRemoveSubrepositoriesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRemoveSubrepositoriesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,27 +17,27 @@
     """
     Class implementing a dialog to remove sub-repositories.
     """
+
     def __init__(self, subrepositories, parent=None):
         """
         Constructor
-        
+
         @param subrepositories list of sub-repository entries (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.subrepositories.addItems(subrepositories)
         self.__removed = []
-    
+
     @pyqtSlot()
     def on_subrepositories_itemSelectionChanged(self):
         """
         Private slot handling the selection of entries.
         """
-        self.removeButton.setEnabled(
-            len(self.subrepositories.selectedItems()) > 0)
-    
+        self.removeButton.setEnabled(len(self.subrepositories.selectedItems()) > 0)
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -48,18 +48,20 @@
             row = self.subrepositories.row(itm)
             self.subrepositories.takeItem(row)
             del itm
-    
+
     def getData(self):
         """
         Public method to retrieve the data.
-        
+
         @return tuple giving the remaining sub-repositories, the removed ones
             and a flag indicating to delete the removed ones from disc (list
             of strings, list of strings, boolean)
         """
         return (
-            [self.subrepositories.item(row).text()
-             for row in range(self.subrepositories.count())],
+            [
+                self.subrepositories.item(row).text()
+                for row in range(self.subrepositories.count())
+            ],
             self.__removed,
-            self.deleteCheckBox.isChecked()
+            self.deleteCheckBox.isChecked(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRepoConfigDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRepoConfigDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     Class implementing a dialog to enter data needed for the initial creation
     of a repository configuration file (hgrc).
     """
+
     def __init__(self, withLargefiles=False, largefilesData=None, parent=None):
         """
         Constructor
-        
+
         @param withLargefiles flag indicating to configure the largefiles
             section (boolean)
         @param largefilesData dictionary with data for the largefiles
@@ -35,56 +36,53 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.defaultShowPasswordButton.setIcon(
-            UI.PixmapCache.getIcon("showPassword"))
+
+        self.defaultShowPasswordButton.setIcon(UI.PixmapCache.getIcon("showPassword"))
         self.defaultPushShowPasswordButton.setIcon(
-            UI.PixmapCache.getIcon("showPassword"))
-        
+            UI.PixmapCache.getIcon("showPassword")
+        )
+
         self.__withLargefiles = withLargefiles
         if withLargefiles:
             if largefilesData is None:
                 largefilesData = getLargefilesDefaults()
             self.lfFileSizeSpinBox.setValue(largefilesData["minsize"])
-            self.lfFilePatternsEdit.setText(
-                " ".join(largefilesData["pattern"]))
+            self.lfFilePatternsEdit.setText(" ".join(largefilesData["pattern"]))
         else:
             self.largefilesGroup.setVisible(False)
-        
+
         self.resize(self.width(), self.minimumSizeHint().height())
-    
+
     @pyqtSlot(bool)
     def on_defaultShowPasswordButton_clicked(self, checked):
         """
         Private slot to switch the default password visibility
         of the default password.
-        
+
         @param checked state of the push button (boolean)
         """
         if checked:
             self.defaultPasswordEdit.setEchoMode(QLineEdit.EchoMode.Normal)
         else:
             self.defaultPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password)
-    
+
     @pyqtSlot(bool)
     def on_defaultPushShowPasswordButton_clicked(self, checked):
         """
         Private slot to switch the default password visibility
         of the default push password.
-        
+
         @param checked state of the push button (boolean)
         """
         if checked:
-            self.defaultPushPasswordEdit.setEchoMode(
-                QLineEdit.EchoMode.Normal)
+            self.defaultPushPasswordEdit.setEchoMode(QLineEdit.EchoMode.Normal)
         else:
-            self.defaultPushPasswordEdit.setEchoMode(
-                QLineEdit.EchoMode.Password)
-    
+            self.defaultPushPasswordEdit.setEchoMode(QLineEdit.EchoMode.Password)
+
     def getData(self):
         """
         Public method to get the data entered into the dialog.
-        
+
         @return tuple giving the default and default push URLs (tuple of
             two strings)
         """
@@ -96,7 +94,7 @@
         if password:
             defaultUrl.setPassword(password)
         defaultUrl = defaultUrl.toString() if defaultUrl.isValid() else ""
-        
+
         defaultPushUrl = QUrl.fromUserInput(self.defaultPushUrlEdit.text())
         username = self.defaultPushUserEdit.text()
         password = self.defaultPushPasswordEdit.text()
@@ -104,18 +102,14 @@
             defaultPushUrl.setUserName(username)
         if password:
             defaultPushUrl.setPassword(password)
-        defaultPushUrl = (
-            defaultPushUrl.toString()
-            if defaultPushUrl.isValid() else
-            ""
-        )
-        
+        defaultPushUrl = defaultPushUrl.toString() if defaultPushUrl.isValid() else ""
+
         return defaultUrl, defaultPushUrl
-    
+
     def getLargefilesData(self):
         """
         Public method to get the data for the largefiles extension.
-        
+
         @return tuple with the minimum file size (integer) and file patterns
             (list of string). None as value denote to use the default value.
         """
@@ -128,7 +122,7 @@
             patterns = self.lfFilePatternsEdit.text().split()
             if set(patterns) == set(lfDefaults["pattern"]):
                 patterns = None
-            
+
             return minsize, patterns
         else:
             return None, None
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,19 @@
     """
     Class implementing a dialog to select a revision.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 noneLabel="", revset=True, parent=None):
+
+    def __init__(
+        self,
+        tagsList,
+        branchesList,
+        bookmarksList=None,
+        noneLabel="",
+        revset=True,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -38,10 +46,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
@@ -49,30 +56,30 @@
         else:
             self.bookmarkButton.setHidden(True)
             self.bookmarkCombo.setHidden(True)
-        
+
         if noneLabel:
             self.noneButton.setText(noneLabel)
-        
+
         self.__revset = revset
         self.expressionButton.setEnabled(revset)
-        
+
         # connect various radio buttons and input fields
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
         self.branchButton.toggled.connect(self.__updateOK)
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -89,14 +96,13 @@
             enabled = bool(self.bookmarkCombo.currentText())
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def getRevision(self):
         """
         Public method to retrieve the selected revision.
-        
+
         @return selected revision
         @rtype str
         """
@@ -122,5 +128,5 @@
             rev = "tip"
         else:
             rev = ""
-        
+
         return rev
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionsSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgRevisionsSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter the revisions for the hg diff command.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None,
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -33,10 +33,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.tag1Combo.addItems(sorted(tagsList))
         self.tag2Combo.addItems(sorted(tagsList))
         self.branch1Combo.addItems(["default"] + sorted(branchesList))
@@ -49,7 +48,7 @@
             self.bookmark1Combo.setHidden(True)
             self.bookmark2Button.setHidden(True)
             self.bookmark2Combo.setHidden(True)
-        
+
         # connect various radio buttons and input fields
         self.id1Button.toggled.connect(self.__updateOK)
         self.id2Button.toggled.connect(self.__updateOK)
@@ -61,22 +60,22 @@
         self.bookmark2Button.toggled.connect(self.__updateOK)
         self.expression1Button.toggled.connect(self.__updateOK)
         self.expression2Button.toggled.connect(self.__updateOK)
-        
+
         self.id1Edit.textChanged.connect(self.__updateOK)
         self.id2Edit.textChanged.connect(self.__updateOK)
         self.expression1Edit.textChanged.connect(self.__updateOK)
         self.expression2Edit.textChanged.connect(self.__updateOK)
-        
+
         self.tag1Combo.editTextChanged.connect(self.__updateOK)
         self.tag2Combo.editTextChanged.connect(self.__updateOK)
         self.branch1Combo.editTextChanged.connect(self.__updateOK)
         self.branch2Combo.editTextChanged.connect(self.__updateOK)
         self.bookmark1Combo.editTextChanged.connect(self.__updateOK)
         self.bookmark2Combo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -93,7 +92,7 @@
             enabled = enabled and bool(self.bookmark1Combo.currentText())
         elif self.expression1Button.isChecked():
             enabled = enabled and bool(self.expression1Edit.text())
-        
+
         if self.id2Button.isChecked():
             enabled = enabled and bool(self.id2Edit.text())
         elif self.tag2Button.isChecked():
@@ -104,14 +103,13 @@
             enabled = enabled and bool(self.bookmark2Combo.currentText())
         elif self.expression2Button.isChecked():
             enabled = enabled and bool(self.expression2Edit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __getRevision(self, no):
         """
         Private method to generate the revision.
-        
+
         @param no revision number to generate (1 or 2)
         @type int
         @return revision
@@ -149,7 +147,7 @@
             tipButton = self.tip2Button
             prevButton = self.prev2Button
             noneButton = self.none2Button
-        
+
         if numberButton.isChecked():
             return "rev({0})".format(numberSpinBox.value())
         elif idButton.isChecked():
@@ -168,17 +166,17 @@
             return "."
         elif noneButton.isChecked():
             return ""
-        
+
         return ""
-    
+
     def getRevisions(self):
         """
         Public method to get the revisions.
-        
+
         @return list of two revisions
         @rtype list of [str, str]
         """
         rev1 = self.__getRevision(1)
         rev2 = self.__getRevision(2)
-        
+
         return [rev1, rev2]
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgServeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgServeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 
 from PyQt6.QtCore import QProcess, Qt, QSize
 from PyQt6.QtGui import QAction, QTextCursor, QBrush
-from PyQt6.QtWidgets import (
-    QToolBar, QPlainTextEdit, QSpinBox, QComboBox
-)
+from PyQt6.QtWidgets import QToolBar, QPlainTextEdit, QSpinBox, QComboBox
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox
@@ -29,10 +27,11 @@
     """
     Class implementing a dialog for the Mercurial server.
     """
+
     def __init__(self, vcs, path, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @type Hg
         @param path path of the repository to serve
@@ -41,62 +40,84 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.vcs = vcs
         self.__repoPath = path
-        
-        self.__styles = ["paper", "coal", "gitweb", "monoblue", "spartan", ]
-        
+
+        self.__styles = [
+            "paper",
+            "coal",
+            "gitweb",
+            "monoblue",
+            "spartan",
+        ]
+
         self.setWindowTitle(self.tr("Mercurial Server"))
-        
+
         iconSuffix = "dark" if ericApp().usesDarkPalette() else "light"
-        
+
         self.__startAct = QAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "startServer-{0}.svg".format(iconSuffix))),
-            self.tr("Start Server"), self)
+                os.path.join(
+                    "VcsPlugins",
+                    "vcsMercurial",
+                    "icons",
+                    "startServer-{0}.svg".format(iconSuffix),
+                )
+            ),
+            self.tr("Start Server"),
+            self,
+        )
         self.__startAct.triggered.connect(self.__startServer)
         self.__stopAct = QAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "stopServer-{0}.svg".format(iconSuffix))),
-            self.tr("Stop Server"), self)
+                os.path.join(
+                    "VcsPlugins",
+                    "vcsMercurial",
+                    "icons",
+                    "stopServer-{0}.svg".format(iconSuffix),
+                )
+            ),
+            self.tr("Stop Server"),
+            self,
+        )
         self.__stopAct.triggered.connect(self.__stopServer)
         self.__browserAct = QAction(
-            UI.PixmapCache.getIcon("home"),
-            self.tr("Start Browser"), self)
+            UI.PixmapCache.getIcon("home"), self.tr("Start Browser"), self
+        )
         self.__browserAct.triggered.connect(self.__startBrowser)
-        
+
         self.__portSpin = QSpinBox(self)
         self.__portSpin.setMinimum(2048)
         self.__portSpin.setMaximum(65535)
         self.__portSpin.setToolTip(self.tr("Enter the server port"))
-        self.__portSpin.setValue(
-            self.vcs.getPlugin().getPreferences("ServerPort"))
-        
+        self.__portSpin.setValue(self.vcs.getPlugin().getPreferences("ServerPort"))
+
         self.__styleCombo = QComboBox(self)
         self.__styleCombo.addItems(self.__styles)
         self.__styleCombo.setToolTip(self.tr("Select the style to use"))
-        self.__styleCombo.setCurrentIndex(self.__styleCombo.findText(
-            self.vcs.getPlugin().getPreferences("ServerStyle")))
-        
+        self.__styleCombo.setCurrentIndex(
+            self.__styleCombo.findText(
+                self.vcs.getPlugin().getPreferences("ServerStyle")
+            )
+        )
+
         self.__serverToolbar = QToolBar(self.tr("Server"), self)
         self.__serverToolbar.addAction(self.__startAct)
         self.__serverToolbar.addAction(self.__stopAct)
         self.__serverToolbar.addSeparator()
         self.__serverToolbar.addWidget(self.__portSpin)
         self.__serverToolbar.addWidget(self.__styleCombo)
-        
+
         self.__browserToolbar = QToolBar(self.tr("Browser"), self)
         self.__browserToolbar.addAction(self.__browserAct)
-        
+
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.__serverToolbar)
         self.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.__browserToolbar)
-        
+
         self.__log = QPlainTextEdit(self)
         self.setCentralWidget(self.__log)
-        
+
         # polish up the dialog
         self.__startAct.setEnabled(True)
         self.__stopAct.setEnabled(False)
@@ -104,35 +125,34 @@
         self.__portSpin.setEnabled(True)
         self.__styleCombo.setEnabled(True)
         self.resize(QSize(800, 600).expandedTo(self.minimumSizeHint()))
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.cNormalFormat = self.__log.currentCharFormat()
         self.cErrorFormat = self.__log.currentCharFormat()
-        self.cErrorFormat.setForeground(
-            QBrush(Preferences.getUI("LogStdErrColour")))
-    
+        self.cErrorFormat.setForeground(QBrush(Preferences.getUI("LogStdErrColour")))
+
     def __startServer(self):
         """
         Private slot to start the Mercurial server.
         """
         port = self.__portSpin.value()
         style = self.__styleCombo.currentText()
-        
+
         exe = getHgExecutable()
-        
+
         args = self.vcs.initCommand("serve")
         args.append("-v")
         args.append("--port")
         args.append(str(port))
         args.append("--style")
         args.append(style)
-        
+
         self.process.setWorkingDirectory(self.__repoPath)
-        
+
         self.process.start(exe, args)
         procStarted = self.process.waitForStarted(5000)
         if procStarted:
@@ -146,85 +166,87 @@
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format(exe))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format(exe),
+            )
+
     def __stopServer(self):
         """
         Private slot to stop the Mercurial server.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             self.process.waitForFinished(5000)
             if self.process.state() != QProcess.ProcessState.NotRunning:
                 self.process.kill()
-        
+
         self.__startAct.setEnabled(True)
         self.__stopAct.setEnabled(False)
         self.__browserAct.setEnabled(False)
         self.__portSpin.setEnabled(True)
         self.__styleCombo.setEnabled(True)
-    
+
     def __startBrowser(self):
         """
         Private slot to start a browser for the served repository.
         """
         ui = ericApp().getObject("UserInterface")
-        ui.launchHelpViewer(
-            "http://localhost:{0}".format(self.__portSpin.value()))
-    
+        ui.launchHelpViewer("http://localhost:{0}".format(self.__portSpin.value()))
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event
         @type QCloseEvent
         """
         self.__stopServer()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
         @type QProcess.ExitStatus
         """
         self.__stopServer()
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into the log.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardOutput(),
-                    self.vcs.getEncoding(), 'replace')
+            s = str(
+                self.process.readAllStandardOutput(), self.vcs.getEncoding(), "replace"
+            )
             self.__appendText(s, False)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the log.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardError(),
-                    self.vcs.getEncoding(), 'replace')
+            s = str(
+                self.process.readAllStandardError(), self.vcs.getEncoding(), "replace"
+            )
             self.__appendText(s, True)
-    
+
     def __appendText(self, txt, error=False):
         """
         Private method to append text to the end.
-        
+
         @param txt text to insert
         @type str
         @param error flag indicating to insert error text
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,11 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QSize
 from PyQt6.QtGui import QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem
+    QWidget,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -33,77 +37,75 @@
     Class implementing a dialog to show the output of the hg status command
     process.
     """
+
     def __init__(self, vcs, mq=False, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param mq flag indicating to show a queue repo status (boolean)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__toBeCommittedColumn = 0
         self.__statusColumn = 1
         self.__pathColumn = 2
         self.__lastColumn = self.statusList.columnCount()
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the status display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the status display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.diff = None
         self.vcs = vcs
         self.vcs.committed.connect(self.__committed)
         self.__hgClient = self.vcs.getClient()
         self.__mq = mq
-        
+
         self.statusList.headerItem().setText(self.__lastColumn, "")
         self.statusList.header().setSortIndicator(
-            self.__pathColumn, Qt.SortOrder.AscendingOrder)
-        
+            self.__pathColumn, Qt.SortOrder.AscendingOrder
+        )
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.document().setDefaultFont(font)
-        
+
         self.diffHighlighter = HgDiffHighlighter(self.diffEdit.document())
         self.__diffGenerator = HgDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.__selectedName = ""
-        
+
         self.modifiedIndicators = [
-            self.tr('added'),
-            self.tr('modified'),
-            self.tr('removed'),
+            self.tr("added"),
+            self.tr("modified"),
+            self.tr("removed"),
         ]
-        
+
         self.unversionedIndicators = [
-            self.tr('not tracked'),
+            self.tr("not tracked"),
         ]
-        
-        self.missingIndicators = [
-            self.tr('missing')
-        ]
-        
+
+        self.missingIndicators = [self.tr("missing")]
+
         self.status = {
-            'A': self.tr('added'),
-            'C': self.tr('normal'),
-            'I': self.tr('ignored'),
-            'M': self.tr('modified'),
-            'R': self.tr('removed'),
-            '?': self.tr('not tracked'),
-            '!': self.tr('missing'),
+            "A": self.tr("added"),
+            "C": self.tr("normal"),
+            "I": self.tr("ignored"),
+            "M": self.tr("modified"),
+            "R": self.tr("removed"),
+            "?": self.tr("not tracked"),
+            "!": self.tr("missing"),
         }
-        
+
         self.__initActionsMenu()
-        
+
         if mq:
             self.diffLabel.setVisible(False)
             self.diffEdit.setVisible(False)
@@ -111,7 +113,7 @@
             self.diffSplitter.setSizes([600, 0])
         else:
             self.diffSplitter.setSizes([300, 300])
-    
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -120,213 +122,237 @@
         self.__actionsMenu.setTearOffEnabled(True)
         self.__actionsMenu.setToolTipsVisible(True)
         self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu)
-        
+
         self.__commitAct = self.__actionsMenu.addAction(
-            self.tr("Commit"), self.__commit)
+            self.tr("Commit"), self.__commit
+        )
         self.__commitAct.setToolTip(self.tr("Commit the selected changes"))
         self.__commitSelectAct = self.__actionsMenu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll)
+            self.tr("Select all for commit"), self.__commitSelectAll
+        )
         self.__commitDeselectAct = self.__actionsMenu.addAction(
-            self.tr("Unselect all from commit"), self.__commitDeselectAll)
-        
+            self.tr("Unselect all from commit"), self.__commitDeselectAll
+        )
+
         self.__actionsMenu.addSeparator()
-        
-        self.__addAct = self.__actionsMenu.addAction(
-            self.tr("Add"), self.__add)
+
+        self.__addAct = self.__actionsMenu.addAction(self.tr("Add"), self.__add)
         self.__addAct.setToolTip(self.tr("Add the selected files"))
         self.__lfAddLargeAct = self.__actionsMenu.addAction(
-            self.tr("Add as Large Files"), lambda: self.__lfAdd("large"))
-        self.__lfAddLargeAct.setToolTip(self.tr(
-            "Add the selected files as a large files using the 'Large Files'"
-            " extension"))
+            self.tr("Add as Large Files"), lambda: self.__lfAdd("large")
+        )
+        self.__lfAddLargeAct.setToolTip(
+            self.tr(
+                "Add the selected files as a large files using the 'Large Files'"
+                " extension"
+            )
+        )
         self.__lfAddNormalAct = self.__actionsMenu.addAction(
-            self.tr("Add as Normal Files"), lambda: self.__lfAdd("normal"))
-        self.__lfAddNormalAct.setToolTip(self.tr(
-            "Add the selected files as a normal files using the 'Large Files'"
-            " extension"))
-        
+            self.tr("Add as Normal Files"), lambda: self.__lfAdd("normal")
+        )
+        self.__lfAddNormalAct.setToolTip(
+            self.tr(
+                "Add the selected files as a normal files using the 'Large Files'"
+                " extension"
+            )
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__diffAct = self.__actionsMenu.addAction(
-            self.tr("Differences"), self.__diff)
-        self.__diffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry in a"
-            " separate dialog"))
+            self.tr("Differences"), self.__diff
+        )
+        self.__diffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry in a" " separate dialog"
+            )
+        )
         self.__sbsDiffAct = self.__actionsMenu.addAction(
-            self.tr("Differences Side-By-Side"), self.__sbsDiff)
-        self.__sbsDiffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry side-by-side in"
-            " a separate dialog"))
-        
+            self.tr("Differences Side-By-Side"), self.__sbsDiff
+        )
+        self.__sbsDiffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry side-by-side in"
+                " a separate dialog"
+            )
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__revertAct = self.__actionsMenu.addAction(
-            self.tr("Revert"), self.__revert)
-        self.__revertAct.setToolTip(self.tr(
-            "Reverts the changes of the selected files"))
-        
+            self.tr("Revert"), self.__revert
+        )
+        self.__revertAct.setToolTip(
+            self.tr("Reverts the changes of the selected files")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__forgetAct = self.__actionsMenu.addAction(
-            self.tr("Forget Missing"), self.__forget)
-        self.__forgetAct.setToolTip(self.tr(
-            "Forgets about the selected missing files"))
+            self.tr("Forget Missing"), self.__forget
+        )
+        self.__forgetAct.setToolTip(self.tr("Forgets about the selected missing files"))
         self.__restoreAct = self.__actionsMenu.addAction(
-            self.tr("Restore Missing"), self.__restoreMissing)
-        self.__restoreAct.setToolTip(self.tr(
-            "Restores the selected missing files"))
-        
+            self.tr("Restore Missing"), self.__restoreMissing
+        )
+        self.__restoreAct.setToolTip(self.tr("Restores the selected missing files"))
+
         self.__actionsMenu.addSeparator()
 
         self.__commitMergeAct = self.__actionsMenu.addAction(
-            self.tr("Commit Merge"), self.__commitMerge)
-        self.__commitMergeAct.setToolTip(self.tr("Commit all the merged"
-                                                 " changes."))
+            self.tr("Commit Merge"), self.__commitMerge
+        )
+        self.__commitMergeAct.setToolTip(self.tr("Commit all the merged" " changes."))
         self.__abortMergeAct = self.__actionsMenu.addAction(
-            self.tr("Abort Merge"), self.__abortMerge)
-        self.__commitMergeAct.setToolTip(self.tr("Abort an uncommitted merge "
-                                                 "and lose all changes"))
+            self.tr("Abort Merge"), self.__abortMerge
+        )
+        self.__commitMergeAct.setToolTip(
+            self.tr("Abort an uncommitted merge " "and lose all changes")
+        )
 
         self.__actionsMenu.addSeparator()
-        
+
         act = self.__actionsMenu.addAction(
-            self.tr("Adjust column sizes"), self.__resizeColumns)
-        act.setToolTip(self.tr(
-            "Adjusts the width of all columns to their contents"))
-        
-        self.actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
+            self.tr("Adjust column sizes"), self.__resizeColumns
+        )
+        act.setToolTip(self.tr("Adjusts the width of all columns to their contents"))
+
+        self.actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
         self.actionsButton.setMenu(self.__actionsMenu)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         if self.__mq:
             self.vcs.getPlugin().setPreferences(
-                "MqStatusDialogGeometry", self.saveGeometry())
+                "MqStatusDialogGeometry", self.saveGeometry()
+            )
             self.vcs.getPlugin().setPreferences(
-                "MqStatusDialogSplitterState", self.diffSplitter.saveState())
+                "MqStatusDialogSplitterState", self.diffSplitter.saveState()
+            )
         else:
             self.vcs.getPlugin().setPreferences(
-                "StatusDialogGeometry", self.saveGeometry())
+                "StatusDialogGeometry", self.saveGeometry()
+            )
             self.vcs.getPlugin().setPreferences(
-                "StatusDialogSplitterState", self.diffSplitter.saveState())
-        
+                "StatusDialogSplitterState", self.diffSplitter.saveState()
+            )
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
         """
         super().show()
-        
+
         geom = (
             self.vcs.getPlugin().getPreferences("MqStatusDialogGeometry")
-            if self.__mq else
-            self.vcs.getPlugin().getPreferences("StatusDialogGeometry")
+            if self.__mq
+            else self.vcs.getPlugin().getPreferences("StatusDialogGeometry")
         )
         if geom.isEmpty():
             s = QSize(800, 600)
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-        
+
         diffSplitterState = (
             self.vcs.getPlugin().getPreferences("MqStatusDialogSplitterState")
-            if self.__mq else
-            self.vcs.getPlugin().getPreferences("StatusDialogSplitterState")
+            if self.__mq
+            else self.vcs.getPlugin().getPreferences("StatusDialogSplitterState")
         )
         if diffSplitterState is not None:
             self.diffSplitter.restoreState(diffSplitterState)
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.statusList.sortItems(
-            self.statusList.sortColumn(),
-            self.statusList.header().sortIndicatorOrder())
-    
+            self.statusList.sortColumn(), self.statusList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.statusList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.statusList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, status, path):
         """
         Private method to generate a status item in the status list.
-        
+
         @param status status indicator (string)
         @param path path of the file or directory (string)
         """
         statusText = self.status[status]
-        itm = QTreeWidgetItem(self.statusList, [
-            "",
-            statusText,
-            path,
-        ])
-        
+        itm = QTreeWidgetItem(
+            self.statusList,
+            [
+                "",
+                statusText,
+                path,
+            ],
+        )
+
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
-    
+
         if status in "AMR":
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
-            itm.setCheckState(self.__toBeCommittedColumn,
-                              Qt.CheckState.Checked)
+            itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
         else:
             itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
-        
+
         if statusText not in self.__statusFilters:
             self.__statusFilters.append(statusText)
-        
+
     def start(self, fn):
         """
         Public slot to start the hg status command.
-        
+
         @param fn filename(s)/directoryname(s) to show the status of
             (string or list of strings)
         """
         self.errorGroup.hide()
         self.intercept = False
         self.args = fn
-        
+
         self.actionsButton.setEnabled(False)
-        
+
         self.statusFilterCombo.clear()
         self.__statusFilters = []
         self.statusList.clear()
-        
+
         if self.__mq:
-            self.setWindowTitle(
-                self.tr("Mercurial Queue Repository Status"))
+            self.setWindowTitle(self.tr("Mercurial Queue Repository Status"))
         else:
-            self.setWindowTitle(self.tr('Mercurial Status'))
-        
+            self.setWindowTitle(self.tr("Mercurial Status"))
+
         args = self.vcs.initCommand("status")
         if self.__mq:
-            args.append('--mq')
+            args.append("--mq")
         else:
             if self.vcs.hasSubrepositories():
                 args.append("--subrepos")
-            
+
             if isinstance(fn, list):
                 self.vcs.addArguments(args, fn)
             else:
                 args.append(fn)
-        
+
         self.refreshButton.setEnabled(False)
-        
+
         self.__repoPath = self.__hgClient.getRepository()
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -336,73 +362,66 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         self.refreshButton.setEnabled(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.__statusFilters.sort()
         self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
-        
+
         if not self.__mq:
             self.actionsButton.setEnabled(True)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
         self.__refreshDiff()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         if line[0] in "ACIMR?!" and line[1] == " ":
             status, path = line.strip().split(" ", 1)
             self.__generateItem(status, path)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -413,14 +432,14 @@
             self.__selectedName = selectedItems[0].text(self.__pathColumn)
         else:
             self.__selectedName = ""
-        
+
         self.start(self.args)
-    
+
     @pyqtSlot(int)
     def on_statusFilterCombo_activated(self, index):
         """
         Private slot to react to the selection of a status filter.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -433,18 +452,18 @@
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(topItem.text(self.__statusColumn) != txt)
-    
+
     @pyqtSlot()
     def on_statusList_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__generateDiffs()
-    
+
     ###########################################################################
     ## Menu handling methods
     ###########################################################################
-    
+
     def __showActionsMenu(self):
         """
         Private slot to prepare the actions button menu before it is shown.
@@ -475,7 +494,7 @@
             missing = len(self.__getMissingItems())
             commitable = len(self.__getCommitableItems())
             commitableUnselected = len(self.__getCommitableUnselectedItems())
-    
+
             self.__addAct.setEnabled(unversioned)
             self.__diffAct.setEnabled(modified)
             self.__sbsDiffAct.setEnabled(modified == 1)
@@ -485,14 +504,14 @@
             self.__commitAct.setEnabled(commitable)
             self.__commitSelectAct.setEnabled(commitableUnselected)
             self.__commitDeselectAct.setEnabled(commitable)
-            
+
             if self.vcs.isExtensionActive("largefiles"):
                 enable = bool(unversioned)
             else:
                 enable = False
             self.__lfAddLargeAct.setEnabled(enable)
             self.__lfAddNormalAct.setEnabled(enable)
-    
+
     def __commit(self):
         """
         Private slot to handle the Commit context menu entry.
@@ -500,22 +519,26 @@
         if self.__mq:
             self.vcs.vcsCommit(self.__repoPath, "", mq=True)
         else:
-            names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                     for itm in self.__getCommitableItems()]
+            names = [
+                os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+                for itm in self.__getCommitableItems()
+            ]
             if not names:
                 EricMessageBox.information(
                     self,
                     self.tr("Commit"),
-                    self.tr("""There are no entries selected to be"""
-                            """ committed."""))
+                    self.tr(
+                        """There are no entries selected to be""" """ committed."""
+                    ),
+                )
                 return
-            
+
             if Preferences.getVCS("AutoSaveFiles"):
                 vm = ericApp().getObject("ViewManager")
                 for name in names:
                     vm.saveEditor(name)
-            self.vcs.vcsCommit(names, '')
-    
+            self.vcs.vcsCommit(names, "")
+
     def __committed(self):
         """
         Private slot called after the commit has finished.
@@ -523,207 +546,229 @@
         if self.isVisible():
             self.on_refreshButton_clicked()
             self.vcs.checkVCSStatus()
-    
+
     def __commitSelectAll(self):
         """
         Private slot to select all entries for commit.
         """
         self.__commitSelect(True)
-    
+
     def __commitDeselectAll(self):
         """
         Private slot to deselect all entries from commit.
         """
         self.__commitSelect(False)
-    
+
     def __add(self):
         """
         Private slot to handle the Add context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getUnversionedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsAdd(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __lfAdd(self, mode):
         """
         Private slot to add a file to the repository.
-        
+
         @param mode add mode (string one of 'normal' or 'large')
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getUnversionedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
-        self.vcs.getExtensionObject("largefiles").hgAdd(
-            names, mode)
+
+        self.vcs.getExtensionObject("largefiles").hgAdd(names, mode)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __forget(self):
         """
         Private slot to handle the Forget Missing context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Forget Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.vcsForget(names)
         self.on_refreshButton_clicked()
-    
+
     def __revert(self):
         """
         Private slot to handle the Revert context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.raise_()
         self.activateWindow()
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __restoreMissing(self):
         """
         Private slot to handle the Restore Missing context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Restore Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.on_refreshButton_clicked()
         self.vcs.checkVCSStatus()
-        
+
     def __diff(self):
         """
         Private slot to handle the Diff context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         if self.diff is None:
             from .HgDiffDialog import HgDiffDialog
+
             self.diff = HgDiffDialog(self.vcs)
         self.diff.show()
         self.diff.start(names, refreshable=True)
-    
+
     def __sbsDiff(self):
         """
         Private slot to handle the Side-By-Side Diff context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences Side-By-Side"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
         elif len(names) > 1:
             EricMessageBox.information(
                 self,
                 self.tr("Differences Side-By-Side"),
-                self.tr("""Only one file with uncommitted changes"""
-                        """ must be selected."""))
+                self.tr(
+                    """Only one file with uncommitted changes"""
+                    """ must be selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsSbsDiff(names[0])
-    
+
     def __getCommitableItems(self):
         """
         Private method to retrieve all entries the user wants to commit.
-        
+
         @return list of all items, the user has checked
         """
         commitableItems = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
-            if (
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Checked
-            ):
+            if itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Checked:
                 commitableItems.append(itm)
         return commitableItems
-    
+
     def __getCommitableUnselectedItems(self):
         """
         Private method to retrieve all entries the user may commit but hasn't
         selected.
-        
+
         @return list of all items, the user has checked
         """
         items = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                (itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                 Qt.ItemFlag.ItemIsUserCheckable) and
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Unchecked
-            ):
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
+            ) and itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Unchecked:
                 items.append(itm)
         return items
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
@@ -731,12 +776,12 @@
             if itm.text(self.__statusColumn) in self.modifiedIndicators:
                 modifiedItems.append(itm)
         return modifiedItems
-    
+
     def __getUnversionedItems(self):
         """
         Private method to retrieve all entries, that have an unversioned
         status.
-        
+
         @return list of all items with an unversioned status
         """
         unversionedItems = []
@@ -744,11 +789,11 @@
             if itm.text(self.__statusColumn) in self.unversionedIndicators:
                 unversionedItems.append(itm)
         return unversionedItems
-    
+
     def __getMissingItems(self):
         """
         Private method to retrieve all entries, that have a missing status.
-        
+
         @return list of all items with a missing status
         """
         missingItems = []
@@ -756,31 +801,31 @@
             if itm.text(self.__statusColumn) in self.missingIndicators:
                 missingItems.append(itm)
         return missingItems
-    
+
     def __commitSelect(self, selected):
         """
         Private slot to select or deselect all entries.
-        
+
         @param selected commit selection state to be set (boolean)
         """
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if selected:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Checked)
+                    itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
                 else:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Unchecked)
-    
+                    itm.setCheckState(
+                        self.__toBeCommittedColumn, Qt.CheckState.Unchecked
+                    )
+
     def __commitMerge(self):
         """
         Private slot to handle the Commit Merge context menu entry.
         """
-        self.vcs.vcsCommit(self.__repoPath, self.tr('Merge'), merge=True)
+        self.vcs.vcsCommit(self.__repoPath, self.tr("Merge"), merge=True)
         self.__committed()
 
     def __abortMerge(self):
@@ -793,27 +838,28 @@
     ###########################################################################
     ## Diff handling methods below
     ###########################################################################
-    
+
     def __generateDiffs(self):
         """
         Private slot to generate diff outputs for the selected item.
         """
         self.diffEdit.clear()
         self.diffHighlighter.regenerateRules()
-        
+
         if not self.__mq:
             selectedItems = self.statusList.selectedItems()
             if len(selectedItems) == 1:
-                fn = os.path.join(self.__repoPath,
-                                  selectedItems[0].text(self.__pathColumn))
+                fn = os.path.join(
+                    self.__repoPath, selectedItems[0].text(self.__pathColumn)
+                )
                 self.__diffGenerator.start(fn)
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal of the diff generator.
         """
         diff = self.__diffGenerator.getResult()[0]
-        
+
         if diff:
             for line in diff[:]:
                 if line.startswith("@@ "):
@@ -821,12 +867,12 @@
                 else:
                     diff.pop(0)
             self.diffEdit.setPlainText("".join(diff))
-        
+
         tc = self.diffEdit.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.diffEdit.setTextCursor(tc)
         self.diffEdit.ensureCursorVisible()
-    
+
     def __refreshDiff(self):
         """
         Private method to refresh the diff output after a refresh.
@@ -837,5 +883,5 @@
                 if itm.text(self.__pathColumn) == self.__selectedName:
                     itm.setSelected(True)
                     break
-        
+
         self.__selectedName = ""
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,23 +14,24 @@
     """
     Class implementing the VCS status monitor thread class for Mercurial.
     """
+
     def __init__(self, interval, project, vcs, parent=None):
         """
         Constructor
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object (Project)
         @param vcs reference to the version control object
         @param parent reference to the parent object (QObject)
         """
         VcsStatusMonitorThread.__init__(self, interval, project, vcs, parent)
-        
+
         self.__client = None
-    
+
     def _performMonitor(self):
         """
         Protected method implementing the monitoring action.
-        
+
         This method populates the statusList member variable with a list of
         strings giving the status in the first column and the path relative
         to the project directory starting with the third column. The allowed
@@ -46,29 +47,29 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @return tuple of flag indicating successful operation and a status
             message in case of non successful operation
         @rtype tuple of (bool, str)
         """
         self.shouldUpdate = False
-        
+
         ok, err = self.__initClient()
         if not ok:
             return False, err
-        
+
         # step 1: get overall status
         args = self.vcs.initCommand("status")
-        args.append('--noninteractive')
-        args.append('--all')
+        args.append("--noninteractive")
+        args.append("--all")
         if self.vcs.hasSubrepositories():
             args.append("--subrepos")
-        
+
         output, error = self.__client.runcommand(args)
-        
+
         if error:
             return False, error
-        
+
         states = {}
         for line in output.splitlines():
             if not line.startswith("  "):
@@ -79,67 +80,64 @@
                     else:
                         status = flag
                     states[name] = status
-        
+
         # step 2: get conflicting changes
         args = self.vcs.initCommand("resolve")
-        args.append('--list')
-        
+        args.append("--list")
+
         output, error = self.__client.runcommand(args)
-        
+
         for line in output.splitlines():
             flag, name = line.split(" ", 1)
             if flag == "U":
                 states[name] = "Z"  # conflict
-        
+
         # step 3: collect the status to be reported back
         for name in states:
             try:
                 if self.reportedStates[name] != states[name]:
-                    self.statusList.append(
-                        "{0} {1}".format(states[name], name))
+                    self.statusList.append("{0} {1}".format(states[name], name))
             except KeyError:
                 self.statusList.append("{0} {1}".format(states[name], name))
         for name in self.reportedStates:
             if name not in states:
                 self.statusList.append("  {0}".format(name))
         self.reportedStates = states
-        
-        return (
-            True,
-            self.tr("Mercurial status checked successfully")
-        )
-    
+
+        return (True, self.tr("Mercurial status checked successfully"))
+
     def _getInfo(self):
         """
         Protected method implementing the real info action.
-        
+
         @return short info message
         @rtype str
         """
         ok, err = self.__initClient()
         if not ok:
             return ""
-        
+
         args = self.vcs.initCommand("identify")
-        args.append('--num')
-        args.append('--id')
-        args.append('--branch')
-        
+        args.append("--num")
+        args.append("--id")
+        args.append("--branch")
+
         output, error = self.__client.runcommand(args)
-        
+
         if error:
             # ignore errors
             return ""
-        
+
         globalRev, localRev, branch = output.splitlines()[0].split(None, 2)
         if globalRev.endswith("+"):
             globalRev = globalRev[:-1]
         if localRev.endswith("+"):
             localRev = localRev[:-1]
-        
+
         return self.tr("{0} / {1}:{2}", "branch, local id, global id").format(
-            branch, localRev, globalRev)
-    
+            branch, localRev, globalRev
+        )
+
     def _shutdown(self):
         """
         Protected method performing shutdown actions.
@@ -150,12 +148,13 @@
     def __initClient(self):
         """
         Private method to initialize the Mercurial client.
-        
+
         @return tuple containing an OK flag and potentially an error message
         @rtype tuple of (bool, str)
         """
         if self.__client is None:
             from .HgClient import HgClient
+
             client = HgClient(self.projectDir, "utf-8", self.vcs)
             ok, err = client.startServer()
             if ok:
@@ -163,5 +162,5 @@
         else:
             ok = True
             err = ""
-        
+
         return ok, err
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgSummaryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgSummaryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,29 +19,30 @@
     Class implementing a dialog to show some summary information of the working
     directory state.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the summary display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the summary display"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
         self.vcs.committed.connect(self.__committed)
-    
+
     def start(self, mq=False, largefiles=False):
         """
         Public slot to start the hg summary command.
-        
+
         @param mq flag indicating to show the queue status as well (boolean)
         @param largefiles flag indicating to show the largefiles status as
             well (boolean)
@@ -49,10 +50,10 @@
         self.errorGroup.hide()
         self.refreshButton.setEnabled(False)
         self.summary.clear()
-        
+
         self.__mq = mq
         self.__largefiles = largefiles
-        
+
         args = self.vcs.initCommand("summary")
         if self.vcs.canPull():
             args.append("--remote")
@@ -60,69 +61,67 @@
             args.append("--mq")
         if self.__largefiles:
             args.append("--large")
-        
+
         client = self.vcs.getClient()
         output, error = client.runcommand(args)
         if error:
             self.__showError(error)
         else:
             self.__processOutput(output.splitlines())
-        
+
         self.refreshButton.setEnabled(True)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(mq=self.__mq)
-    
+
     def __committed(self):
         """
         Private slot called after the commit has finished.
         """
         if self.isVisible():
             self.on_refreshButton_clicked()
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def __processOutput(self, output):
         """
         Private method to process the output into nice readable text.
-        
+
         @param output output from the summary command (string)
         """
         infoDict = {}
-        
+
         # step 1: parse the output
         while output:
             line = output.pop(0)
-            if ':' not in line:
+            if ":" not in line:
                 continue
             name, value = line.split(": ", 1)
             value = value.strip()
-            
+
             if name == "parent":
                 if " " in value:
                     parent, tags = value.split(" ", 1)
@@ -130,7 +129,7 @@
                     parent = value
                     tags = ""
                 rev, node = parent.split(":")
-                
+
                 remarks = []
                 if tags:
                     if " (empty repository)" in tags:
@@ -141,9 +140,9 @@
                         tags = tags.replace(" (no revision checked out)", "")
                 else:
                     tags = None
-                
+
                 value = infoDict.get(name, [])
-                
+
                 if rev == "-1":
                     value.append((int(rev), node, tags, None, remarks))
                 else:
@@ -176,8 +175,11 @@
                     value = ("@UPDATE@", int(value.split(" ", 1)[0]), 0)
                 elif value.endswith("(merge)"):
                     parts = value.split(", ")
-                    value = ("@MERGE@", int(parts[0].split(" ", 1)[0]),
-                             int(parts[1].split(" ", 1)[0]))
+                    value = (
+                        "@MERGE@",
+                        int(parts[0].split(" ", 1)[0]),
+                        int(parts[1].split(" ", 1)[0]),
+                    )
                 else:
                     value = ("@UNKNOWN@", 0, 0)
             elif name == "remote":
@@ -216,9 +218,9 @@
             else:
                 # ignore unknown entries
                 continue
-            
+
             infoDict[name] = value
-        
+
         # step 2: build the output
         if infoDict:
             info = ["<table>"]
@@ -227,42 +229,56 @@
             ):
                 changeset = "{0}:{1}".format(rev, node)
                 if len(infoDict["parent"]) > 1:
-                    info.append(self.tr(
-                        "<tr><td><b>Parent #{0}</b></td><td>{1}</td></tr>")
-                        .format(pindex, changeset))
+                    info.append(
+                        self.tr(
+                            "<tr><td><b>Parent #{0}</b></td><td>{1}</td></tr>"
+                        ).format(pindex, changeset)
+                    )
                 else:
-                    info.append(self.tr(
-                        "<tr><td><b>Parent</b></td><td>{0}</td></tr>")
-                        .format(changeset))
+                    info.append(
+                        self.tr("<tr><td><b>Parent</b></td><td>{0}</td></tr>").format(
+                            changeset
+                        )
+                    )
                 if tags:
-                    info.append(self.tr(
-                        "<tr><td><b>Tags</b></td><td>{0}</td></tr>")
-                        .format('<br/>'.join(tags.split())))
+                    info.append(
+                        self.tr("<tr><td><b>Tags</b></td><td>{0}</td></tr>").format(
+                            "<br/>".join(tags.split())
+                        )
+                    )
                 if message:
-                    info.append(self.tr(
-                        "<tr><td><b>Commit Message</b></td><td>{0}</td></tr>")
-                        .format(message))
+                    info.append(
+                        self.tr(
+                            "<tr><td><b>Commit Message</b></td><td>{0}</td></tr>"
+                        ).format(message)
+                    )
                 if remarks:
                     rem = []
                     if "@EMPTY@" in remarks:
                         rem.append(self.tr("empty repository"))
                     if "@NO_REVISION@" in remarks:
                         rem.append(self.tr("no revision checked out"))
-                    info.append(self.tr(
-                        "<tr><td><b>Remarks</b></td><td>{0}</td></tr>")
-                        .format(", ".join(rem)))
+                    info.append(
+                        self.tr("<tr><td><b>Remarks</b></td><td>{0}</td></tr>").format(
+                            ", ".join(rem)
+                        )
+                    )
             if "branch" in infoDict:
-                info.append(self.tr(
-                    "<tr><td><b>Branch</b></td><td>{0}</td></tr>")
-                    .format(infoDict["branch"]))
+                info.append(
+                    self.tr("<tr><td><b>Branch</b></td><td>{0}</td></tr>").format(
+                        infoDict["branch"]
+                    )
+                )
             if "bookmarks" in infoDict:
                 bookmarks = infoDict["bookmarks"].split()
                 for i in range(len(bookmarks)):
                     if bookmarks[i].startswith("*"):
                         bookmarks[i] = "<b>{0}</b>".format(bookmarks[i])
-                info.append(self.tr(
-                    "<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>")
-                    .format('<br/>'.join(bookmarks)))
+                info.append(
+                    self.tr("<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>").format(
+                        "<br/>".join(bookmarks)
+                    )
+                )
             if "commit" in infoDict:
                 cinfo = []
                 for category, count in infoDict["commit"][0].items():
@@ -283,8 +299,7 @@
                     elif category == "ignored":
                         cinfo.append(self.tr("{0} ignored").format(count))
                     elif category == "unresolved":
-                        cinfo.append(
-                            self.tr("{0} unresolved").format(count))
+                        cinfo.append(self.tr("{0} unresolved").format(count))
                     elif category == "subrepos":
                         cinfo.append(self.tr("{0} subrepos").format(count))
                 remark = infoDict["commit"][1]
@@ -298,30 +313,34 @@
                     cinfo.append(self.tr("No commit required"))
                 elif remark == "new branch head":
                     cinfo.append(self.tr("New Branch Head"))
-                info.append(self.tr(
-                    "<tr><td><b>Commit Status</b></td><td>{0}</td></tr>")
-                    .format("<br/>".join(cinfo)))
+                info.append(
+                    self.tr(
+                        "<tr><td><b>Commit Status</b></td><td>{0}</td></tr>"
+                    ).format("<br/>".join(cinfo))
+                )
             if "update" in infoDict:
                 if infoDict["update"][0] == "@CURRENT@":
                     uinfo = self.tr("current")
                 elif infoDict["update"][0] == "@UPDATE@":
                     uinfo = self.tr(
-                        "%n new changeset(s)<br/>Update required", "",
-                        infoDict["update"][1])
+                        "%n new changeset(s)<br/>Update required",
+                        "",
+                        infoDict["update"][1],
+                    )
                 elif infoDict["update"][0] == "@MERGE@":
-                    uinfo1 = self.tr(
-                        "%n new changeset(s)", "", infoDict["update"][1])
-                    uinfo2 = self.tr(
-                        "%n branch head(s)", "", infoDict["update"][2])
+                    uinfo1 = self.tr("%n new changeset(s)", "", infoDict["update"][1])
+                    uinfo2 = self.tr("%n branch head(s)", "", infoDict["update"][2])
                     uinfo = self.tr(
                         "{0}<br/>{1}<br/>Merge required",
-                        "0 is changesets, 1 is branch heads"
+                        "0 is changesets, 1 is branch heads",
                     ).format(uinfo1, uinfo2)
                 else:
                     uinfo = self.tr("unknown status")
-                info.append(self.tr(
-                    "<tr><td><b>Update Status</b></td><td>{0}</td></tr>")
-                    .format(uinfo))
+                info.append(
+                    self.tr(
+                        "<tr><td><b>Update Status</b></td><td>{0}</td></tr>"
+                    ).format(uinfo)
+                )
             if "remote" in infoDict:
                 if infoDict["remote"] == (0, 0, 0, 0):
                     rinfo = self.tr("synched")
@@ -330,44 +349,56 @@
                     if infoDict["remote"][0]:
                         li.append(self.tr("1 or more incoming changesets"))
                     if infoDict["remote"][1]:
-                        li.append(self.tr("%n outgoing changeset(s)", "",
-                                  infoDict["remote"][1]))
+                        li.append(
+                            self.tr(
+                                "%n outgoing changeset(s)", "", infoDict["remote"][1]
+                            )
+                        )
                     if infoDict["remote"][2]:
-                        li.append(self.tr("%n incoming bookmark(s)", "",
-                                  infoDict["remote"][2]))
+                        li.append(
+                            self.tr(
+                                "%n incoming bookmark(s)", "", infoDict["remote"][2]
+                            )
+                        )
                     if infoDict["remote"][3]:
-                        li.append(self.tr("%n outgoing bookmark(s)", "",
-                                  infoDict["remote"][3]))
+                        li.append(
+                            self.tr(
+                                "%n outgoing bookmark(s)", "", infoDict["remote"][3]
+                            )
+                        )
                     rinfo = "<br/>".join(li)
-                info.append(self.tr(
-                    "<tr><td><b>Remote Status</b></td><td>{0}</td></tr>")
-                    .format(rinfo))
+                info.append(
+                    self.tr(
+                        "<tr><td><b>Remote Status</b></td><td>{0}</td></tr>"
+                    ).format(rinfo)
+                )
             if "mq" in infoDict:
                 if infoDict["mq"] == (0, 0):
                     qinfo = self.tr("empty queue")
                 else:
                     li = []
                     if infoDict["mq"][0]:
-                        li.append(self.tr("{0} applied")
-                                  .format(infoDict["mq"][0]))
+                        li.append(self.tr("{0} applied").format(infoDict["mq"][0]))
                     if infoDict["mq"][1]:
-                        li.append(self.tr("{0} unapplied")
-                                  .format(infoDict["mq"][1]))
+                        li.append(self.tr("{0} unapplied").format(infoDict["mq"][1]))
                     qinfo = "<br/>".join(li)
-                info.append(self.tr(
-                    "<tr><td><b>Queues Status</b></td><td>{0}</td></tr>")
-                    .format(qinfo))
+                info.append(
+                    self.tr(
+                        "<tr><td><b>Queues Status</b></td><td>{0}</td></tr>"
+                    ).format(qinfo)
+                )
             if "largefiles" in infoDict:
                 if infoDict["largefiles"] == 0:
                     lfInfo = self.tr("No files to upload")
                 else:
-                    lfInfo = self.tr("%n file(s) to upload", "",
-                                     infoDict["largefiles"])
-                info.append(self.tr(
-                    "<tr><td><b>Large Files</b></td><td>{0}</td></tr>")
-                    .format(lfInfo))
+                    lfInfo = self.tr("%n file(s) to upload", "", infoDict["largefiles"])
+                info.append(
+                    self.tr("<tr><td><b>Large Files</b></td><td>{0}</td></tr>").format(
+                        lfInfo
+                    )
+                )
             info.append("</table>")
         else:
             info = [self.tr("<p>No status information available.</p>")]
-        
+
         self.summary.insertHtml("\n".join(info))
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication, QPoint
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem, QMenu,
-    QAbstractItemView
+    QDialog,
+    QDialogButtonBox,
+    QHeaderView,
+    QTreeWidgetItem,
+    QMenu,
+    QAbstractItemView,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -25,56 +29,55 @@
     """
     Class implementing a dialog to show a list of tags or branches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
         self.tagsList = None
         self.allTagsList = None
         self.__hgClient = vcs.getClient()
         self.__currentRevision = ""
         self.__currentBranch = ""
-        
+
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(3, Qt.SortOrder.AscendingOrder)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self, tags, tagsList, allTagsList):
         """
         Public slot to start the tags command.
-        
+
         @param tags flag indicating a list of tags is requested
             (False = branches, True = tags)
         @param tagsList reference to string list receiving the tags
@@ -83,7 +86,7 @@
         """
         self.errorGroup.hide()
         self.tagList.clear()
-        
+
         self.intercept = False
         self.tagsMode = tags
         if not tags:
@@ -91,19 +94,20 @@
             self.tagList.headerItem().setText(2, self.tr("Status"))
             if self.vcs.isExtensionActive("closehead"):
                 self.tagList.setSelectionMode(
-                    QAbstractItemView.SelectionMode.ExtendedSelection)
+                    QAbstractItemView.SelectionMode.ExtendedSelection
+                )
         self.activateWindow()
-        
+
         self.tagsList = tagsList
         self.allTagsList = allTagsList
-        
+
         if self.tagsMode:
             args = self.vcs.initCommand("tags")
-            args.append('--verbose')
+            args.append("--verbose")
         else:
             args = self.vcs.initCommand("branches")
-            args.append('--closed')
-        
+            args.append("--closed")
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -113,75 +117,68 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         self.refreshButton.setEnabled(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if not self.tagsMode:
             self.__highlightCurrentBranch()
         self.__resizeColumns()
         self.__resort()
-        
+
         # restore current item
         if self.__currentRevision:
             items = self.tagList.findItems(
-                self.__currentRevision, Qt.MatchFlag.MatchExactly, 0)
+                self.__currentRevision, Qt.MatchFlag.MatchExactly, 0
+            )
             if items:
                 self.tagList.setCurrentItem(items[0])
                 self.__currentRevision = ""
                 self.tagList.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.tagList.sortItems(
-            self.tagList.sortColumn(),
-            self.tagList.header().sortIndicatorOrder())
-    
+            self.tagList.sortColumn(), self.tagList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.tagList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tagList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.tagList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, revision, changeset, status, name):
         """
         Private method to generate a tag item in the tag list.
-        
+
         @param revision revision of the tag/branch (string)
         @param changeset changeset of the tag/branch (string)
         @param status of the tag/branch (string)
@@ -195,11 +192,11 @@
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         li = line.split()
@@ -225,17 +222,17 @@
                 self.tagsList.append(name)
             if self.allTagsList is not None:
                 self.allTagsList.append(name)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     def __highlightCurrentBranch(self):
         """
         Private method to highlight the current branch with a bold font.
@@ -243,41 +240,39 @@
         self.__currentBranch = self.vcs.hgGetCurrentBranch()
         if self.__currentBranch:
             items = self.tagList.findItems(
-                self.__currentBranch, Qt.MatchFlag.MatchCaseSensitive, 3)
+                self.__currentBranch, Qt.MatchFlag.MatchCaseSensitive, 3
+            )
             if len(items) == 1:
                 font = items[0].font(3)
                 font.setBold(True)
                 for column in range(4):
                     items[0].setFont(column, font)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the log.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton.setEnabled(False)
-        
+
         # save the current items commit ID
         itm = self.tagList.currentItem()
         if itm is not None:
             self.__currentRevision = itm.text(0)
         else:
             self.__currentRevision = ""
-        
+
         self.start(self.tagsMode, self.tagsList, self.allTagsList)
-    
+
     @pyqtSlot(QPoint)
     def on_tagList_customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request.
-        
+
         @param pos position the context menu was requested at
         @type QPoint
         """
@@ -287,28 +282,42 @@
             if self.tagsMode:
                 menu.addAction(
                     UI.PixmapCache.getIcon("vcsSwitch"),
-                    self.tr("Switch to"), self.__switchTo)
+                    self.tr("Switch to"),
+                    self.__switchTo,
+                )
             else:
                 act = menu.addAction(
                     UI.PixmapCache.getIcon("vcsSwitch"),
-                    self.tr("Switch to"), self.__switchTo)
+                    self.tr("Switch to"),
+                    self.__switchTo,
+                )
                 act.setEnabled(itm.text(3) != self.__currentBranch)
                 menu.addSeparator()
                 if self.vcs.isExtensionActive("closehead"):
                     act = menu.addAction(
                         UI.PixmapCache.getIcon("closehead"),
-                        self.tr("Close Branches"), self.__closeBranchHeads)
-                    act.setEnabled(len([
-                        itm for itm in self.tagList.selectedItems()
-                        if itm.text(3) != "default"
-                    ]) > 0)
+                        self.tr("Close Branches"),
+                        self.__closeBranchHeads,
+                    )
+                    act.setEnabled(
+                        len(
+                            [
+                                itm
+                                for itm in self.tagList.selectedItems()
+                                if itm.text(3) != "default"
+                            ]
+                        )
+                        > 0
+                    )
                 else:
                     act = menu.addAction(
                         UI.PixmapCache.getIcon("closehead"),
-                        self.tr("Close Branch"), self.__closeBranch)
+                        self.tr("Close Branch"),
+                        self.__closeBranch,
+                    )
                     act.setEnabled(itm.text(3) != "default")
             menu.popup(self.tagList.mapToGlobal(pos))
-    
+
     def __switchTo(self):
         """
         Private slot to switch the working directory to the selected revision.
@@ -321,15 +330,15 @@
                 res = EricMessageBox.yesNo(
                     None,
                     self.tr("Switch"),
-                    self.tr(
-                        """The project should be reread. Do this now?"""),
-                    yesDefault=True)
+                    self.tr("""The project should be reread. Do this now?"""),
+                    yesDefault=True,
+                )
                 if res:
                     ericApp().getObject("Project").reopenProject()
                     return
-            
+
             self.on_refreshButton_clicked()
-    
+
     def __closeBranch(self):
         """
         Private slot to close the selected branch.
@@ -340,49 +349,57 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Close Branch"),
-                self.tr("""The branch "default" cannot be closed."""
-                        """ Aborting..."""))
+                self.tr(
+                    """The branch "default" cannot be closed.""" """ Aborting..."""
+                ),
+            )
             return
-        
+
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Close Branch"),
-            self.tr("""<p>Shall the branch <b>{0}</b> really be closed?"""
-                    """</p>""").format(branch))
+            self.tr(
+                """<p>Shall the branch <b>{0}</b> really be closed?""" """</p>"""
+            ).format(branch),
+        )
         if yes:
             switched = False
             currentBranch = self.vcs.hgGetCurrentBranch()
             if currentBranch != branch:
                 # step 1: switch to branch to be closed
                 switched = True
-                self.vcs.vcsUpdate(noDialog=True,
-                                   revision=branch)
-            
+                self.vcs.vcsUpdate(noDialog=True, revision=branch)
+
             ppath = ericApp().getObject("Project").getProjectPath()
-            self.vcs.vcsCommit(ppath, "Branch <{0}> closed.".format(branch),
-                               noDialog=True,
-                               closeBranch=True)
+            self.vcs.vcsCommit(
+                ppath,
+                "Branch <{0}> closed.".format(branch),
+                noDialog=True,
+                closeBranch=True,
+            )
             if switched:
                 self.vcs.vcsUpdate(noDialog=True, revision=currentBranch)
-            
+
             self.on_refreshButton_clicked()
-    
+
     def __closeBranchHeads(self):
         """
         Private slot to close the selected branches.
         """
-        branches = [itm.text(3) for itm in self.tagsList.selectedItems()
-                    if itm.text(3) != "default"]
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+        branches = [
+            itm.text(3)
+            for itm in self.tagsList.selectedItems()
+            if itm.text(3) != "default"
+        ]
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Close Branches"),
-            self.tr(
-                "Do you really want to close all listed branches?"),
-            branches)
+            self.tr("Do you really want to close all listed branches?"),
+            branches,
+        )
         yes = dlg.exec() == QDialog.DialogCode.Accepted
         if yes:
             self.vcs.getExtensionObject("closehead").hgCloseheads(branches)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgTagDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,15 +19,16 @@
     """
     Class implementing a dialog to enter the data for a tagging operation.
     """
+
     CreateGlobalTag = 1
     CreateLocalTag = 2
     DeleteGlobalTag = 3
     DeleteLocalTag = 4
-    
+
     def __init__(self, taglist, revision=None, tagName=None, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param revision revision to set tag for (string)
         @param tagName name of the tag (string)
@@ -35,24 +36,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.tagCombo.clear()
         self.tagCombo.addItem("", False)
         for tag, isLocal in sorted(taglist, reverse=True):
             icon = (
                 UI.PixmapCache.getIcon("vcsTagLocal")
-                if isLocal else
-                UI.PixmapCache.getIcon("vcsTagGlobal")
+                if isLocal
+                else UI.PixmapCache.getIcon("vcsTagGlobal")
             )
             self.tagCombo.addItem(icon, tag, isLocal)
-        
+
         if revision:
             self.revisionEdit.setText(revision)
-        
+
         if tagName:
             index = self.tagCombo.findText(tagName)
             if index > -1:
@@ -61,24 +61,24 @@
                 self.deleteTagButton.setChecked(True)
             else:
                 self.tagCombo.setEditText(tagName)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text tag name entered in the combo (string)
         """
         self.okButton.setDisabled(text == "")
-    
+
     @pyqtSlot(int)
     def on_tagCombo_currentIndexChanged(self, index):
         """
         Private slot setting the local status of the selected entry.
-        
+
         @param index index of the selected entrie (integer)
         """
         isLocal = self.tagCombo.itemData(index)
@@ -86,11 +86,11 @@
             self.localTagButton.setChecked(True)
         else:
             self.globalTagButton.setChecked(True)
-    
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple containing the tag, revision, tag operation and a flag
             indicating to enforce the operation
         @rtype tuple of str, str, int,bool
@@ -107,5 +107,4 @@
                 tagOp = HgTagDialog.DeleteGlobalTag
             else:
                 tagOp = HgTagDialog.DeleteLocalTag
-        return (tag, self.revisionEdit.text(), tagOp,
-                self.forceCheckBox.isChecked)
+        return (tag, self.revisionEdit.text(), tagOp, self.forceCheckBox.isChecked)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,12 +20,8 @@
 import Globals
 
 from .HgUtilities import getConfigPath
-from .HgUserConfigHostFingerprintDialog import (
-    HgUserConfigHostFingerprintDialog
-)
-from .HgUserConfigHostMinimumProtocolDialog import (
-    HgUserConfigHostMinimumProtocolDialog
-)
+from .HgUserConfigHostFingerprintDialog import HgUserConfigHostFingerprintDialog
+from .HgUserConfigHostMinimumProtocolDialog import HgUserConfigHostMinimumProtocolDialog
 
 from .Ui_HgUserConfigDialog import Ui_HgUserConfigDialog
 
@@ -36,10 +32,11 @@
     """
     Class implementing a dialog to enter some user data.
     """
+
     def __init__(self, version=(0, 0, 0), parent=None):
         """
         Constructor
-        
+
         @param version Mercurial version info
         @type tuple of three integers
         @param parent reference to the parent widget
@@ -47,66 +44,70 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__version = version
-        
+
         self.__minimumProtocols = {
             "tls1.0": self.tr("TLS 1.0"),
             "tls1.1": self.tr("TLS 1.1"),
             "tls1.2": self.tr("TLS 1.2"),
         }
-        
+
         self.lfUserCachePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         if Globals.isLinuxPlatform():
-            self.lfUserCachePicker.setDefaultDirectory(os.path.expanduser(
-                "~/.cache/largefiles"))
+            self.lfUserCachePicker.setDefaultDirectory(
+                os.path.expanduser("~/.cache/largefiles")
+            )
         elif Globals.isMacPlatform():
-            self.lfUserCachePicker.setDefaultDirectory(os.path.expanduser(
-                "~/Library/Caches/largefiles"))
+            self.lfUserCachePicker.setDefaultDirectory(
+                os.path.expanduser("~/Library/Caches/largefiles")
+            )
         else:
-            self.lfUserCachePicker.setDefaultDirectory(os.path.expanduser(
-                "~\\AppData\\Local\\largefiles"))
-        
+            self.lfUserCachePicker.setDefaultDirectory(
+                os.path.expanduser("~\\AppData\\Local\\largefiles")
+            )
+
         self.fpAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.fpDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.fpEditButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
+
         self.protocolAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.protocolDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.protocolEditButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
+
         self.minimumProtocolComboBox.addItem(self.tr("Default"), "")
         for protocol in sorted(self.__minimumProtocols.keys()):
             self.minimumProtocolComboBox.addItem(
-                self.__minimumProtocols[protocol], protocol)
-        
+                self.__minimumProtocols[protocol], protocol
+            )
+
         self.fingerprintsList.headerItem().setText(
-            self.fingerprintsList.columnCount(), "")
-        self.protocolsList.headerItem().setText(
-            self.protocolsList.columnCount(), "")
-        
+            self.fingerprintsList.columnCount(), ""
+        )
+        self.protocolsList.headerItem().setText(self.protocolsList.columnCount(), "")
+
         if self.__version < (3, 9, 0):
             self.disableTls10WarningCheckBox.setEnabled(False)
             self.minimumProtocolComboBox.setEnabled(False)
             self.minimumProtcolGroupBox.setEnabled(False)
-        
+
         self.tabWidget.setCurrentIndex(0)
-        
+
         self.__editor = None
-        
+
         self.__config = None
         self.readUserConfig()
-    
+
         self.__updateFingerprintsButtons()
         self.__updateProtocolsButtons()
-    
+
     def writeUserConfig(self):
         """
         Public method to write the user configuration file.
         """
         if self.__config is None:
             self.__config = ConfigParser()
-        
+
         ###################################################################
         ## ui section
         ###################################################################
@@ -121,56 +122,56 @@
         ###################################################################
         if "extensions" not in self.__config:
             self.__config["extensions"] = {}
-        
+
         if self.gpgCheckBox.isChecked():
             self.__config["extensions"]["gpg"] = ""
         else:
             if "gpg" in self.__config["extensions"]:
                 del self.__config["extensions"]["gpg"]
             self.__config["extensions"]["#gpg"] = ""
-        
+
         if self.purgeCheckBox.isChecked():
             self.__config["extensions"]["purge"] = ""
         else:
             if "purge" in self.__config["extensions"]:
                 del self.__config["extensions"]["purge"]
             self.__config["extensions"]["#purge"] = ""
-        
+
         if self.queuesCheckBox.isChecked():
             self.__config["extensions"]["mq"] = ""
         else:
             if "mq" in self.__config["extensions"]:
                 del self.__config["extensions"]["mq"]
             self.__config["extensions"]["#mq"] = ""
-        
+
         if self.rebaseCheckBox.isChecked():
             self.__config["extensions"]["rebase"] = ""
         else:
             if "rebase" in self.__config["extensions"]:
                 del self.__config["extensions"]["rebase"]
             self.__config["extensions"]["#rebase"] = ""
-        
+
         if self.shelveCheckBox.isChecked():
             self.__config["extensions"]["shelve"] = ""
         else:
             if "shelve" in self.__config["extensions"]:
                 del self.__config["extensions"]["shelve"]
             self.__config["extensions"]["#shelve"] = ""
-        
+
         if self.stripCheckBox.isChecked():
             self.__config["extensions"]["strip"] = ""
         else:
             if "strip" in self.__config["extensions"]:
                 del self.__config["extensions"]["strip"]
             self.__config["extensions"]["#strip"] = ""
-        
+
         if self.histeditCheckBox.isChecked():
             self.__config["extensions"]["histedit"] = ""
         else:
             if "histedit" in self.__config["extensions"]:
                 del self.__config["extensions"]["histedit"]
             self.__config["extensions"]["#histedit"] = ""
-        
+
         if self.largefilesCheckBox.isChecked():
             self.__config["extensions"]["largefiles"] = ""
             ###############################################################
@@ -178,9 +179,7 @@
             ###############################################################
             if "largefiles" not in self.__config:
                 self.__config["largefiles"] = {}
-            self.__config["largefiles"]["minsize"] = (
-                str(self.lfFileSizeSpinBox.value())
-            )
+            self.__config["largefiles"]["minsize"] = str(self.lfFileSizeSpinBox.value())
             lfFilePatterns = self.lfFilePatternsEdit.text()
             if lfFilePatterns:
                 self.__config["largefiles"]["patterns"] = lfFilePatterns
@@ -195,7 +194,7 @@
             if "largefiles" in self.__config["extensions"]:
                 del self.__config["extensions"]["largefiles"]
             self.__config["extensions"]["#largefiles"] = ""
-        
+
         if self.closeheadCheckBox.isChecked() and self.__version >= (4, 8, 0):
             self.__config["extensions"]["closehead"] = ""
         else:
@@ -209,12 +208,10 @@
             self.__config["http_proxy"] = {
                 "host": self.proxyHostEdit.text(),
                 "user": self.proxyUserEdit.text(),
-                "passwd": self.proxyPasswordEdit.text()
+                "passwd": self.proxyPasswordEdit.text(),
             }
             if self.proxyBypassEdit.text():
-                self.__config["http_proxy"]["no"] = (
-                    self.proxyBypassEdit.text()
-                )
+                self.__config["http_proxy"]["no"] = self.proxyBypassEdit.text()
         else:
             if "http_proxy" in self.__config:
                 del self.__config["http_proxy"]
@@ -227,7 +224,7 @@
             #
             if "hostsecurity" in self.__config:
                 del self.__config["hostsecurity"]
-            
+
             #
             # hostfingerprints section
             #
@@ -238,9 +235,7 @@
                     fingerprint = itm.text(1)
                     if fingerprint.startswith("sha1:"):
                         fingerprint = fingerprint[5:]
-                    self.__config["hostfingerprints"][itm.text(0)] = (
-                        fingerprint
-                    )
+                    self.__config["hostfingerprints"][itm.text(0)] = fingerprint
             else:
                 if "hostfingerprints" in self.__config:
                     del self.__config["hostfingerprints"]
@@ -250,41 +245,36 @@
             #
             if "hostfingerprints" in self.__config:
                 del self.__config["hostfingerprints"]
-            
+
             #
             # hostsecurity section
             #
             if "hostsecurity" not in self.__config:
                 self.__config["hostsecurity"] = {}
-            
+
             if self.fingerprintsList.topLevelItemCount() > 0:
                 self.__clearFingerprints()
                 fingerprints = self.__assembleFingerprints()
                 for host in fingerprints:
                     key = "{0}:fingerprints".format(host)
-                    self.__config["hostsecurity"][key] = (
-                        ", ".join(fingerprints[host])
-                    )
+                    self.__config["hostsecurity"][key] = ", ".join(fingerprints[host])
             else:
                 self.__clearFingerprints()
-            
+
             if self.disableTls10WarningCheckBox.isChecked():
                 disabletls10warning = "true"
             else:
                 disabletls10warning = "false"
-            self.__config["hostsecurity"]["disabletls10warning"] = (
-                disabletls10warning
-            )
-            
+            self.__config["hostsecurity"]["disabletls10warning"] = disabletls10warning
+
             if self.minimumProtocolComboBox.currentIndex() == 0:
                 self.__config.remove_option("hostsecurity", "minimumprotocol")
             else:
                 minimumProtocol = self.minimumProtocolComboBox.itemData(
-                    self.minimumProtocolComboBox.currentIndex())
-                self.__config["hostsecurity"]["minimumprotocol"] = (
-                    minimumProtocol
+                    self.minimumProtocolComboBox.currentIndex()
                 )
-            
+                self.__config["hostsecurity"]["minimumprotocol"] = minimumProtocol
+
             if self.protocolsList.topLevelItemCount() > 0:
                 self.__clearMinimumProtocols()
                 minimumProtocols = self.__assembleMinimumProtocols()
@@ -293,21 +283,21 @@
                     self.__config["hostsecurity"][key] = minimumProtocols[host]
             else:
                 self.__clearMinimumProtocols()
-            
+
             if len(self.__config.options("hostsecurity")) == 0:
                 del self.__config["hostsecurity"]
         ###################################################################
-        
+
         cfgFile = getConfigPath()
         with open(cfgFile, "w") as configFile:
             self.__config.write(configFile)
-    
+
     def readUserConfig(self):
         """
         Public method to read the user configuration file.
         """
         cfgFile = getConfigPath()
-        
+
         self.__config = ConfigParser(delimiters=("=",))
         if self.__config.read(cfgFile):
             # step 1: extract user name and email
@@ -320,79 +310,75 @@
                     email = ""
                 self.userNameEdit.setText(name.strip()),
                 self.emailEdit.setText(email.strip()),
-            
+
             # step 2: extract extensions information
             if "extensions" in self.__config:
-                self.gpgCheckBox.setChecked(
-                    "gpg" in self.__config["extensions"])
-                self.purgeCheckBox.setChecked(
-                    "purge" in self.__config["extensions"])
-                self.queuesCheckBox.setChecked(
-                    "mq" in self.__config["extensions"])
-                self.rebaseCheckBox.setChecked(
-                    "rebase" in self.__config["extensions"])
-                self.shelveCheckBox.setChecked(
-                    "shelve" in self.__config["extensions"])
+                self.gpgCheckBox.setChecked("gpg" in self.__config["extensions"])
+                self.purgeCheckBox.setChecked("purge" in self.__config["extensions"])
+                self.queuesCheckBox.setChecked("mq" in self.__config["extensions"])
+                self.rebaseCheckBox.setChecked("rebase" in self.__config["extensions"])
+                self.shelveCheckBox.setChecked("shelve" in self.__config["extensions"])
                 self.largefilesCheckBox.setChecked(
-                    "largefiles" in self.__config["extensions"])
-                self.stripCheckBox.setChecked(
-                    "strip" in self.__config["extensions"])
+                    "largefiles" in self.__config["extensions"]
+                )
+                self.stripCheckBox.setChecked("strip" in self.__config["extensions"])
                 self.histeditCheckBox.setChecked(
-                    "histedit" in self.__config["extensions"])
+                    "histedit" in self.__config["extensions"]
+                )
                 self.closeheadCheckBox.setChecked(
-                    "closehead" in self.__config["extensions"])
+                    "closehead" in self.__config["extensions"]
+                )
             self.closeheadCheckBox.setEnabled(self.__version >= (4, 8, 0))
-            
+
             # step 3: extract large files information
             if "largefiles" in self.__config:
                 if "minsize" in self.__config["largefiles"]:
                     self.lfFileSizeSpinBox.setValue(
-                        self.__config.getint("largefiles", "minsize"))
+                        self.__config.getint("largefiles", "minsize")
+                    )
                 if "patterns" in self.__config["largefiles"]:
                     self.lfFilePatternsEdit.setText(
-                        self.__config["largefiles"]["patterns"])
+                        self.__config["largefiles"]["patterns"]
+                    )
                 if "usercache" in self.__config["largefiles"]:
                     self.lfUserCachePicker.setText(
-                        self.__config["largefiles"]["usercache"])
-            
+                        self.__config["largefiles"]["usercache"]
+                    )
+
             # step 4: extract http proxy information
             if "http_proxy" in self.__config:
                 if "host" in self.__config["http_proxy"]:
-                    self.proxyHostEdit.setText(
-                        self.__config["http_proxy"]["host"])
+                    self.proxyHostEdit.setText(self.__config["http_proxy"]["host"])
                 if "user" in self.__config["http_proxy"]:
-                    self.proxyUserEdit.setText(
-                        self.__config["http_proxy"]["user"])
+                    self.proxyUserEdit.setText(self.__config["http_proxy"]["user"])
                 if "passwd" in self.__config["http_proxy"]:
                     self.proxyPasswordEdit.setText(
-                        self.__config["http_proxy"]["passwd"])
+                        self.__config["http_proxy"]["passwd"]
+                    )
                 if "no" in self.__config["http_proxy"]:
-                    self.proxyBypassEdit.setText(
-                        self.__config["http_proxy"]["no"])
-            
+                    self.proxyBypassEdit.setText(self.__config["http_proxy"]["no"])
+
             # step 5a: extract host fingerprints
             if "hostfingerprints" in self.__config:
                 for host in self.__config.options("hostfingerprints"):
                     if self.__version < (3, 9, 0):
-                        QTreeWidgetItem(self.fingerprintsList, [
-                            host,
-                            self.__config["hostfingerprints"][host]
-                        ])
+                        QTreeWidgetItem(
+                            self.fingerprintsList,
+                            [host, self.__config["hostfingerprints"][host]],
+                        )
                     else:
                         # convert to hostsecurity fingerprint
-                        QTreeWidgetItem(self.fingerprintsList, [
-                            host,
-                            "sha1:" + self.__config["hostfingerprints"][host]
-                        ])
-            
+                        QTreeWidgetItem(
+                            self.fingerprintsList,
+                            [host, "sha1:" + self.__config["hostfingerprints"][host]],
+                        )
+
             # step 5b: extract hostsecurity fingerprints
             if "hostsecurity" in self.__config:
                 for key in self.__config.options("hostsecurity"):
                     if key.endswith(":fingerprints"):
                         host = key.replace(":fingerprints", "")
-                        fingerprints = (
-                            self.__config["hostsecurity"][key].split(",")
-                        )
+                        fingerprints = self.__config["hostsecurity"][key].split(",")
                         for fingerprint in fingerprints:
                             if self.__version < (3, 9, 0):
                                 # downgrade from a newer version
@@ -402,53 +388,54 @@
                                     # Mercurial < 3.9.0 supports sha1
                                     # fingerprints only
                                     continue
-                            QTreeWidgetItem(self.fingerprintsList, [
-                                host,
-                                fingerprint.replace("\\", "").strip()
-                            ])
-                    
+                            QTreeWidgetItem(
+                                self.fingerprintsList,
+                                [host, fingerprint.replace("\\", "").strip()],
+                            )
+
                     elif key == "disabletls10warning":
                         self.disableTls10WarningCheckBox.setChecked(
                             self.__config.getboolean(
-                                "hostsecurity", "disabletls10warning"))
-                    
+                                "hostsecurity", "disabletls10warning"
+                            )
+                        )
+
                     elif key == "minimumprotocol":
                         minimumProtocol = self.__config["hostsecurity"][key]
-                        index = self.minimumProtocolComboBox.findData(
-                            minimumProtocol)
+                        index = self.minimumProtocolComboBox.findData(minimumProtocol)
                         if index == -1:
                             index = 0
                         self.minimumProtocolComboBox.setCurrentIndex(index)
-                    
+
                     elif key.endswith(":minimumprotocol"):
                         host = key.replace(":minimumprotocol", "")
                         protocol = self.__config["hostsecurity"][key].strip()
                         if protocol in self.__minimumProtocols:
-                            itm = QTreeWidgetItem(self.protocolsList, [
-                                host,
-                                self.__minimumProtocols[protocol]
-                            ])
+                            itm = QTreeWidgetItem(
+                                self.protocolsList,
+                                [host, self.__minimumProtocols[protocol]],
+                            )
                             itm.setData(1, Qt.ItemDataRole.UserRole, protocol)
-            
+
             self.__finalizeFingerprintsColumns()
             self.__finalizeProtocolsColumns()
-    
+
     @pyqtSlot()
     def accept(self):
         """
         Public slot to accept the dialog.
         """
         self.writeUserConfig()
-        
+
         super().accept()
-    
+
     def __clearDialog(self):
         """
         Private method to clear the data of the dialog.
         """
         self.userNameEdit.clear()
         self.emailEdit.clear()
-        
+
         self.gpgCheckBox.setChecked(False)
         self.purgeCheckBox.setChecked(False)
         self.queuesCheckBox.setChecked(False)
@@ -459,24 +446,24 @@
         self.lfFileSizeSpinBox.setValue(10)
         self.lfFilePatternsEdit.clear()
         self.lfUserCachePicker.clear()
-        
+
         self.proxyHostEdit.clear()
         self.proxyUserEdit.clear()
         self.proxyPasswordEdit.clear()
         self.proxyBypassEdit.clear()
-        
+
         self.fingerprintsList.clear()
         self.__finalizeFingerprintsColumns()
         self.__updateFingerprintsButtons()
-        
+
         self.protocolsList.clear()
         self.__finalizeProtocolsColumns()
         self.__updateProtocolsButtons()
-    
+
     #######################################################################
     ## Methods and slots for the host fingerprint handling below
     #######################################################################
-    
+
     def __clearFingerprints(self):
         """
         Private method to clear the fingerprints from the hostsecurity section.
@@ -485,11 +472,11 @@
             for key in self.__config.options("hostsecurity"):
                 if key.endswith(":fingerprints"):
                     self.__config.remove_option("hostsecurity", key)
-    
+
     def __assembleFingerprints(self):
         """
         Private method to assemble a list of host fingerprints.
-        
+
         @return dictionary with list of fingerprints per host
         @rtype dict with str as key and list of str as value
         """
@@ -503,19 +490,19 @@
             else:
                 hostFingerprints[host] = [fingerprint]
         return hostFingerprints
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_fingerprintsList_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current fingerprints item.
-        
+
         @param current reference to the current item
         @type QTreeWidgetItem
         @param previous reference to the previous current item
         @type QTreeWidgetItem
         """
         self.__updateFingerprintsButtons()
-    
+
     @pyqtSlot()
     def on_fpAddButton_clicked(self):
         """
@@ -528,7 +515,7 @@
             self.__finalizeFingerprintsColumns()
             self.fingerprintsList.setCurrentItem(itm)
             self.fingerprintsList.scrollToItem(itm)
-    
+
     @pyqtSlot()
     def on_fpDeleteButton_clicked(self):
         """
@@ -540,14 +527,18 @@
             yes = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Host Fingerprint"),
-                self.tr("""<p>Shall the fingerprint for host <b>{0}</b>"""
-                        """ really be deleted?</p>""").format(host))
+                self.tr(
+                    """<p>Shall the fingerprint for host <b>{0}</b>"""
+                    """ really be deleted?</p>"""
+                ).format(host),
+            )
             if yes:
                 self.fingerprintsList.takeTopLevelItem(
-                    self.fingerprintsList.indexOfTopLevelItem(itm))
+                    self.fingerprintsList.indexOfTopLevelItem(itm)
+                )
                 del itm
                 self.__finalizeFingerprintsColumns()
-    
+
     @pyqtSlot()
     def on_fpEditButton_clicked(self):
         """
@@ -557,15 +548,16 @@
         if itm is not None:
             host = itm.text(0)
             fingerprint = itm.text(1)
-            dlg = HgUserConfigHostFingerprintDialog(self, host, fingerprint,
-                                                    version=self.__version)
+            dlg = HgUserConfigHostFingerprintDialog(
+                self, host, fingerprint, version=self.__version
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 host, fingerprint = dlg.getData()
                 itm.setText(0, host)
                 itm.setText(1, fingerprint)
                 self.__finalizeFingerprintsColumns()
                 self.fingerprintsList.scrollToItem(itm)
-    
+
     def __finalizeFingerprintsColumns(self):
         """
         Private method to resize and sort the host fingerprints columns.
@@ -573,7 +565,7 @@
         for col in range(self.fingerprintsList.columnCount()):
             self.fingerprintsList.resizeColumnToContents(col)
         self.fingerprintsList.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __updateFingerprintsButtons(self):
         """
         Private slot to update the host fingerprints edit buttons.
@@ -581,11 +573,11 @@
         enable = self.fingerprintsList.currentItem() is not None
         self.fpDeleteButton.setEnabled(enable)
         self.fpEditButton.setEnabled(enable)
-    
+
     #######################################################################
     ## Methods and slots for the host minimum protocol handling below
     #######################################################################
-    
+
     def __clearMinimumProtocols(self):
         """
         Private method to clear the minimum protocols from the hostsecurity
@@ -595,11 +587,11 @@
             for key in self.__config.options("hostsecurity"):
                 if key.endswith(":minimumprotocol"):
                     self.__config.remove_option("hostsecurity", key)
-    
+
     def __assembleMinimumProtocols(self):
         """
         Private method to assemble a list of host minimum protocols.
-        
+
         @return dictionary with list of minimum protocol per host
         @rtype dict with str as key and str as value
         """
@@ -610,37 +602,35 @@
             minimumProtocol = itm.data(1, Qt.ItemDataRole.UserRole)
             minimumProtocols[host] = minimumProtocol
         return minimumProtocols
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_protocolsList_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current minimum protocol item.
-        
+
         @param current reference to the current item
         @type QTreeWidgetItem
         @param previous reference to the previous current item
         @type QTreeWidgetItem
         """
         self.__updateProtocolsButtons()
-    
+
     @pyqtSlot()
     def on_protocolAddButton_clicked(self):
         """
         Private slot to add a minimum protocol entry.
         """
-        dlg = HgUserConfigHostMinimumProtocolDialog(self.__minimumProtocols,
-                                                    self)
+        dlg = HgUserConfigHostMinimumProtocolDialog(self.__minimumProtocols, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             host, protocol = dlg.getData()
-            itm = QTreeWidgetItem(self.protocolsList, [
-                host,
-                self.__minimumProtocols[protocol]
-            ])
+            itm = QTreeWidgetItem(
+                self.protocolsList, [host, self.__minimumProtocols[protocol]]
+            )
             itm.setData(1, Qt.ItemDataRole.UserRole, protocol)
             self.__finalizeProtocolsColumns()
             self.protocolsList.setCurrentItem(itm)
             self.protocolsList.scrollToItem(itm)
-    
+
     @pyqtSlot()
     def on_protocolDeleteButton_clicked(self):
         """
@@ -652,14 +642,18 @@
             yes = EricMessageBox.yesNo(
                 self,
                 self.tr("Delete Host Minimum Protocol"),
-                self.tr("""<p>Shall the minimum protocol entry for host"""
-                        """ <b>{0}</b> really be deleted?</p>""").format(host))
+                self.tr(
+                    """<p>Shall the minimum protocol entry for host"""
+                    """ <b>{0}</b> really be deleted?</p>"""
+                ).format(host),
+            )
             if yes:
                 self.protocolsList.takeTopLevelItem(
-                    self.protocolsList.indexOfTopLevelItem(itm))
+                    self.protocolsList.indexOfTopLevelItem(itm)
+                )
                 del itm
                 self.__finalizeProtocolsColumns()
-    
+
     @pyqtSlot()
     def on_protocolEditButton_clicked(self):
         """
@@ -670,7 +664,8 @@
             host = itm.text(0)
             protocol = itm.data(1, Qt.ItemDataRole.UserRole)
             dlg = HgUserConfigHostMinimumProtocolDialog(
-                self.__minimumProtocols, self, host, protocol)
+                self.__minimumProtocols, self, host, protocol
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 host, protocol = dlg.getData()
                 itm.setText(0, host)
@@ -678,7 +673,7 @@
                 itm.setData(1, Qt.ItemDataRole.UserRole, protocol)
                 self.__finalizeProtocolsColumns()
                 self.protocolsList.scrollToItem(itm)
-    
+
     def __finalizeProtocolsColumns(self):
         """
         Private method to resize and sort the host fingerprints columns.
@@ -686,7 +681,7 @@
         for col in range(self.protocolsList.columnCount()):
             self.protocolsList.resizeColumnToContents(col)
         self.protocolsList.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __updateProtocolsButtons(self):
         """
         Private slot to update the host minimum protocol edit buttons.
@@ -694,38 +689,42 @@
         enable = self.protocolsList.currentItem() is not None
         self.protocolDeleteButton.setEnabled(enable)
         self.protocolEditButton.setEnabled(enable)
-    
+
     #######################################################################
     ## Slot to edit the user configuration in an editor below
     #######################################################################
-    
+
     @pyqtSlot()
     def on_editorButton_clicked(self):
         """
         Private slot to open the user configuration file in a text editor.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         cfgFile = getConfigPath()
-        
+
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Edit User Configuration"),
-            self.tr("""You will loose all changes made in this dialog."""
-                    """ Shall the data be saved first?"""),
+            self.tr(
+                """You will loose all changes made in this dialog."""
+                """ Shall the data be saved first?"""
+            ),
             icon=EricMessageBox.Warning,
-            yesDefault=True)
+            yesDefault=True,
+        )
         if yes:
             self.writeUserConfig()
-        
+
         self.__editor = MiniEditor(cfgFile, "Properties", self)
         self.__editor.setWindowModality(Qt.WindowModality.WindowModal)
         self.__editor.installEventFilter(self)
         self.__editor.show()
-    
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched reference to the object being watched
         @type QObject
         @param event event to be handled
@@ -739,5 +738,5 @@
                 self.__clearDialog()
                 self.readUserConfig()
                 return True
-        
+
         return False
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostFingerprintDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostFingerprintDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,28 +10,25 @@
 from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
-from .Ui_HgUserConfigHostFingerprintDialog import (
-    Ui_HgUserConfigHostFingerprintDialog
-)
+from .Ui_HgUserConfigHostFingerprintDialog import Ui_HgUserConfigHostFingerprintDialog
 
 
-class HgUserConfigHostFingerprintDialog(
-        QDialog, Ui_HgUserConfigHostFingerprintDialog):
+class HgUserConfigHostFingerprintDialog(QDialog, Ui_HgUserConfigHostFingerprintDialog):
     """
     Class implementing a dialog to edit a host fingerprint.
     """
+
     supportedHashes = ("sha1", "sha256", "sha512")
     fingerprintLength = {
         "sha1": 40,
         "sha256": 64,
         "sha512": 128,
     }
-    
-    def __init__(self, parent=None, host="", fingerprint="",
-                 version=(0, 0, 0)):
+
+    def __init__(self, parent=None, host="", fingerprint="", version=(0, 0, 0)):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param host host name
@@ -43,12 +40,11 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__version = version
-        
+
         self.hashComboBox.addItem("")
-        self.hashComboBox.addItems(
-            HgUserConfigHostFingerprintDialog.supportedHashes)
+        self.hashComboBox.addItems(HgUserConfigHostFingerprintDialog.supportedHashes)
         if self.__version < (3, 9, 0):
             self.hashLabel.setEnabled(False)
             self.hashComboBox.setEnabled(False)
@@ -58,62 +54,58 @@
                 hashType, fingerprint = fingerprint.split(":", 1)
             else:
                 hashType = ""
-        
+
         index = self.hashComboBox.findText(hashType)
         self.hashComboBox.setCurrentIndex(index)
         self.hostEdit.setText(host)
         self.fingerprintEdit.setText(fingerprint)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOkButton()
-    
+
     def __updateOkButton(self):
         """
         Private method to update the status of the Ok button.
         """
-        enabled = (
-            bool(self.hostEdit.text()) and
-            bool(self.fingerprintEdit.text())
-        )
+        enabled = bool(self.hostEdit.text()) and bool(self.fingerprintEdit.text())
         if self.__version >= (3, 9, 0):
             hashType = self.hashComboBox.currentText()
             enabled &= bool(hashType)
             if hashType:
                 enabled &= (
-                    len(self.fingerprintEdit.text().replace(":", "")) ==
-                    HgUserConfigHostFingerprintDialog.fingerprintLength[
-                        hashType])
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+                    len(self.fingerprintEdit.text().replace(":", ""))
+                    == HgUserConfigHostFingerprintDialog.fingerprintLength[hashType]
+                )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(str)
     def on_hostEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the host edit.
-        
+
         @param txt current text
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(int)
     def on_hashComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle changes of the hash combo.
-        
+
         @param index current index
         @type int
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_fingerprintEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the fingerprint edit.
-        
+
         @param txt current text
         @type str
         """
@@ -121,31 +113,32 @@
             # get rid of whitespace
             txt = txt.strip()
             self.fingerprintEdit.setText(txt)
-        
-        if txt.startswith(tuple(
-            h + ":" for h in
-                HgUserConfigHostFingerprintDialog.supportedHashes)):
+
+        if txt.startswith(
+            tuple(h + ":" for h in HgUserConfigHostFingerprintDialog.supportedHashes)
+        ):
             parts = txt.split(":", 1)
             if len(parts) == 2:
                 self.fingerprintEdit.setText(parts[1])
                 hashIndex = self.hashComboBox.findText(parts[0].strip())
                 if hashIndex > -1:
                     self.hashComboBox.setCurrentIndex(hashIndex)
-        
+
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to retrieve the data.
-        
+
         @return tuple containig the host name and the fingerprint
         @rtype tuple of two str
         """
         fingerprint = (
             self.fingerprintEdit.text()
-            if self.__version < (3, 9, 0) else
-            "{0}:{1}".format(self.hashComboBox.currentText(),
-                             self.fingerprintEdit.text().strip())
+            if self.__version < (3, 9, 0)
+            else "{0}:{1}".format(
+                self.hashComboBox.currentText(), self.fingerprintEdit.text().strip()
+            )
         )
-        
+
         return self.hostEdit.text().strip(), fingerprint
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostMinimumProtocolDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostMinimumProtocolDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,19 +11,21 @@
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
 from .Ui_HgUserConfigHostMinimumProtocolDialog import (
-    Ui_HgUserConfigHostMinimumProtocolDialog
+    Ui_HgUserConfigHostMinimumProtocolDialog,
 )
 
 
 class HgUserConfigHostMinimumProtocolDialog(
-        QDialog, Ui_HgUserConfigHostMinimumProtocolDialog):
+    QDialog, Ui_HgUserConfigHostMinimumProtocolDialog
+):
     """
     Class implementing a dialog to enter the minimum protocol for a host.
     """
+
     def __init__(self, allowedProtocols, parent=None, host="", protocol=""):
         """
         Constructor
-        
+
         @param allowedProtocols dictionary containing the allowed protocols
             with the value as key and the display string as value
         @type dict
@@ -36,63 +38,64 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.minimumProtocolComboBox.addItem("", "")
         for minimumProtocol in sorted(allowedProtocols.keys()):
             self.minimumProtocolComboBox.addItem(
-                allowedProtocols[minimumProtocol], minimumProtocol)
-        
+                allowedProtocols[minimumProtocol], minimumProtocol
+            )
+
         self.hostEdit.setText(host)
         index = self.minimumProtocolComboBox.findData(protocol)
         if index == -1:
             index = 0
         self.minimumProtocolComboBox.setCurrentIndex(index)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOkButton()
-    
+
     def __updateOkButton(self):
         """
         Private method to update the status of the Ok button.
         """
         enabled = (
-            bool(self.hostEdit.text()) and
-            self.minimumProtocolComboBox.currentIndex() > 0
+            bool(self.hostEdit.text())
+            and self.minimumProtocolComboBox.currentIndex() > 0
         )
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     @pyqtSlot(str)
     def on_hostEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the host edit.
-        
+
         @param txt current text
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(int)
     def on_minimumProtocolComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a minimum protocol.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to retrieve the data.
-        
+
         @return tuple containig the host name and the minimum protocol
         @rtype tuple of two str
         """
         return (
             self.hostEdit.text().strip(),
             self.minimumProtocolComboBox.itemData(
-                self.minimumProtocolComboBox.currentIndex())
+                self.minimumProtocolComboBox.currentIndex()
+            ),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,12 +20,12 @@
 def getHgExecutable():
     """
     Function to get the full path of the Mercurial executable.
-    
+
     @return path of the Mercurial executable
     @rtype str
     """
     from Plugins.PluginVcsMercurial import VcsMercurialPlugin
-    
+
     exe = VcsMercurialPlugin.getPreferences("MercurialExecutablePath")
     if not exe:
         program = "hg"
@@ -40,17 +40,17 @@
             dirName = os.path.dirname(sys.executable)
             if os.path.exists(os.path.join(dirName, program)):
                 exe = os.path.join(dirName, program)
-    
+
     if not exe:
         exe = program
-    
+
     return exe
 
 
 def getConfigPath():
     """
     Function to get the filename of the config file.
-    
+
     @return filename of the config file
     @rtype str
     """
@@ -65,7 +65,7 @@
 def prepareProcess(proc, encoding="", language=""):
     """
     Function to prepare the given process.
-    
+
     @param proc reference to the process to be prepared
     @type QProcess
     @param encoding encoding to be used by the process
@@ -74,23 +74,23 @@
     @type str
     """
     env = QProcessEnvironment.systemEnvironment()
-    env.insert("HGPLAIN", '1')
-    
+    env.insert("HGPLAIN", "1")
+
     # set the encoding for the process
     if encoding:
         env.insert("HGENCODING", encoding)
-    
+
     # set the language for the process
     if language:
         env.insert("LANGUAGE", language)
-    
+
     proc.setProcessEnvironment(env)
 
 
 def hgVersion(plugin):
     """
     Public method to determine the Mercurial version.
-    
+
     @param plugin reference to the plugin object
     @type VcsMercurialPlugin
     @return tuple containing the Mercurial version as a string and as a tuple
@@ -100,9 +100,9 @@
     versionStr = ""
     version = ()
     errorMsg = ""
-    
+
     exe = getHgExecutable()
-    
+
     args = ["version"]
     args.extend(plugin.getGlobalOptions())
     process = QProcess()
@@ -111,11 +111,17 @@
     if procStarted:
         finished = process.waitForFinished(30000)
         if finished and process.exitCode() == 0:
-            output = str(process.readAllStandardOutput(),
-                         plugin.getPreferences("Encoding"), 'replace')
+            output = str(
+                process.readAllStandardOutput(),
+                plugin.getPreferences("Encoding"),
+                "replace",
+            )
             versionStr = output.splitlines()[0].split()[-1][0:-1]
-            v = list(re.match(r'.*?(\d+)\.(\d+)\.?(\d+)?(\+[0-9a-f-]+)?',
-                              versionStr).groups())
+            v = list(
+                re.match(
+                    r".*?(\d+)\.(\d+)\.?(\d+)?(\+[0-9a-f-]+)?", versionStr
+                ).groups()
+            )
             if v[-1] is None:
                 del v[-1]
             for i in range(3):
@@ -129,16 +135,15 @@
         else:
             if finished:
                 errorMsg = QCoreApplication.translate(
-                    "HgUtilities",
-                    "The hg process finished with the exit code {0}"
+                    "HgUtilities", "The hg process finished with the exit code {0}"
                 ).format(process.exitCode())
             else:
                 errorMsg = QCoreApplication.translate(
-                    "HgUtilities",
-                    "The hg process did not finish within 30s.")
+                    "HgUtilities", "The hg process did not finish within 30s."
+                )
     else:
         errorMsg = QCoreApplication.translate(
-            "HgUtilities",
-            "Could not start the hg executable.")
-    
+            "HgUtilities", "Could not start the hg executable."
+        )
+
     return versionStr, version, errorMsg
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditCommitEditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditCommitEditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,10 +21,11 @@
     """
     Class implementing a dialog to edit the commit message of a revision.
     """
+
     def __init__(self, fileName, parent=None):
         """
         Constructor
-        
+
         @param fileName name of the file containing the commit message
             to be edited
         @type str
@@ -33,16 +34,17 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__fileName = fileName
         self.__readFile()
-        
+
         self.recentCommitMessages = Preferences.toList(
-            Preferences.getSettings().value('Mercurial/Commits'))
+            Preferences.getSettings().value("Mercurial/Commits")
+        )
         self.recentComboBox.clear()
         self.recentComboBox.addItem("")
         self.recentComboBox.addItems(self.recentCommitMessages)
-    
+
     def __readFile(self):
         """
         Private method to read the file containing the commit message and
@@ -55,12 +57,14 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Commit Message"),
-                self.tr("""<p>The file <b>{0}</b> could not be read.</p>"""
-                        """<p>Reason: {1}</p>""").format(
-                    self.__fileName, str(err)))
+                self.tr(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(self.__fileName, str(err)),
+            )
             self.on_buttonBox_rejected()
             return
-        
+
         msgLines = []
         infoLines = []
         for line in txt.splitlines():
@@ -70,17 +74,17 @@
                 infoLines.append(line[3:].lstrip())
             else:
                 msgLines.append(line)
-        
+
         # remove empty lines at end of message
         for row in range(len(msgLines) - 1, -1, -1):
             if msgLines[row] == "":
                 del msgLines[row]
             else:
                 break
-        
+
         self.messageEdit.setPlainText("\n".join(msgLines))
         self.infoEdit.setPlainText("\n".join(infoLines))
-    
+
     @pyqtSlot()
     def on_buttonBox_accepted(self):
         """
@@ -94,15 +98,17 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Commit Message"),
-                self.tr("""<p>The file <b>{0}</b> could not be read.</p>"""
-                        """<p>Reason: {1}</p>""").format(
-                    self.__fileName, str(err)))
+                self.tr(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(self.__fileName, str(err)),
+            )
             self.on_buttonBox_rejected()
             return
-        
+
         self.close()
         QCoreApplication.exit(0)
-    
+
     @pyqtSlot()
     def on_buttonBox_rejected(self):
         """
@@ -110,12 +116,12 @@
         """
         self.close()
         QCoreApplication.exit(1)
-    
+
     @pyqtSlot(int)
     def on_recentComboBox_activated(self, index):
         """
         Private slot to select a commit message from recent ones.
-        
+
         @param index index of the selected entry
         @type int
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter the histedit parameters.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None, rev="",
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, rev="", parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,17 +35,17 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__sourceRevisionButtonGroup = QButtonGroup(self)
         self.__sourceRevisionButtonGroup.addButton(self.defaultButton)
         self.__sourceRevisionButtonGroup.addButton(self.outgoingButton)
         self.__sourceRevisionButtonGroup.addButton(self.revisionButton)
-        
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
             self.bookmarkCombo.addItems(sorted(bookmarksList))
-        
+
         # connect various radio buttons and input fields
         self.defaultButton.toggled.connect(self.__updateOK)
         self.outgoingButton.toggled.connect(self.__updateOK)
@@ -55,34 +55,34 @@
         self.branchButton.toggled.connect(self.__updateOK)
         self.bookmarkButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
         self.bookmarkCombo.editTextChanged.connect(self.__updateOK)
-        
+
         self.numberSpinBox.valueChanged.connect(self.__updateOK)
-        
+
         self.idEdit.setText(rev)
         if rev:
             self.revisionButton.setChecked(True)
         else:
             self.defaultButton.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOK()
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
         Private slot to update the OK button.
         """
         enabled = True
-        
+
         if self.revisionButton.isChecked():
             if self.idButton.isChecked():
                 enabled = enabled and bool(self.idEdit.text())
@@ -94,14 +94,13 @@
                 enabled = enabled and bool(self.bookmarkCombo.currentText())
             elif self.expressionButton.isChecked():
                 enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __getRevision(self):
         """
         Private method to generate the revision.
-        
+
         @return revision
         @rtype str
         """
@@ -122,13 +121,13 @@
                 return self.bookmarkCombo.currentText()
             elif self.expressionButton.isChecked():
                 return self.expressionEdit.text()
-        
+
         return ""
-    
+
     def getData(self):
         """
         Public method to retrieve the data for the strip action.
-        
+
         @return tuple with the revision, a flag indicating to to outgoing and a
             flag indicating to keep old nodes
         @rtype tuple (str, bool, bool)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditEditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditEditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,23 +14,25 @@
 import sys
 import os
 
-sys.path.insert(1, os.path.join(
-    os.path.dirname(__file__), "..", "..", "..", ".."))
+sys.path.insert(1, os.path.join(os.path.dirname(__file__), "..", "..", "..", ".."))
 # four times up is the eric7 package directory
 
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -41,7 +43,7 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters
     @type list of str
     @return reference to the main widget or None in case of an error
@@ -51,11 +53,13 @@
         fileName = os.path.basename(argv[1])
         if fileName.startswith("hg-histedit-"):
             from HgHisteditPlanEditor import HgHisteditPlanEditor
+
             return HgHisteditPlanEditor(argv[1])
         elif fileName.startswith("hg-editor-"):
             from HgHisteditCommitEditor import HgHisteditCommitEditor
+
             return HgHisteditCommitEditor(argv[1])
-    
+
     return None
 
 
@@ -64,21 +68,26 @@
     Main entry point into the application.
     """
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("", "name of file to edit")
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("", "name of file to edit"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "Mercurial Histedit Editor",
-                                  "",
-                                  "Editor for the Mercurial histedit command",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "Mercurial Histedit Editor",
+        "",
+        "Editor for the Mercurial histedit command",
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditPlanEditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditPlanEditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,47 +21,48 @@
     """
     Class implementing a combo box to select the action in the plan tree.
     """
+
     def __init__(self, item, column):
         """
         Constructor
-        
+
         @param item reference to the item
         @type QTreeWidgetItem
         @param column column number inside the tree widget item
         @type int
         """
         super().__init__()
-        
+
         self.__item = item
         self.__column = column
-        
+
         self.addItems(["pick", "drop", "mess", "fold", "roll", "edit"])
         txt = self.__item.text(self.__column)
         index = self.findText(txt)
         if index > -1:
             self.setCurrentIndex(index)
-        
+
         self.currentIndexChanged.connect(self.__changeItem)
-    
+
     @pyqtSlot(int)
     def __changeItem(self, index):
         """
         Private slot to handle the selection of a plan action.
-        
+
         This method sets the text of the associated item for the specified
         cell in order to be able to retrieve it with a call of the text()
         method of the item.
-        
+
         @param index index of the selected action
         @type int
         """
         self.__item.setText(self.__column, self.currentText())
         self.__item.treeWidget().setCurrentItem(self.__item)
-    
+
     def showPopup(self):
         """
         Public method to show the list of items of the combo box.
-        
+
         This is reimplemented in order to set the associated item as the
         current item of the tree widget.
         """
@@ -73,10 +74,11 @@
     """
     Class implementing a dialog to edit the history modification plan.
     """
+
     def __init__(self, fileName, parent=None):
         """
         Constructor
-        
+
         @param fileName name of the file containing the history edit plan
             to be edited
         @type str
@@ -85,18 +87,17 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
-        self.planTreeWidget.headerItem().setText(
-            self.planTreeWidget.columnCount(), "")
-        
+
+        self.planTreeWidget.headerItem().setText(self.planTreeWidget.columnCount(), "")
+
         self.__fileName = fileName
         self.__readFile()
-        
+
         self.__updateButtons()
-    
+
     def __readFile(self):
         """
         Private method to read the file containing the edit plan and
@@ -109,12 +110,14 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Plan"),
-                self.tr("""<p>The file <b>{0}</b> could not be read.</p>"""
-                        """<p>Reason: {1}</p>""").format(
-                    self.__fileName, str(err)))
+                self.tr(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(self.__fileName, str(err)),
+            )
             self.on_buttonBox_rejected()
             return
-        
+
         infoLines = []
         for line in txt.splitlines():
             if line.startswith("#"):
@@ -122,30 +125,30 @@
             else:
                 self.__createPlanItem(line)
         self.infoEdit.setPlainText("\n".join(infoLines))
-        
+
         self.__resizeSections()
-    
+
     def __addActionCombo(self, item):
         """
         Private method to add an edit action combo to an item.
-        
+
         @param item reference to the tree widget item
         @type QTreeWidgetItem
         """
         actionCombo = HgHisteditPlanActionComboBox(item, 0)
         self.planTreeWidget.setItemWidget(item, 0, actionCombo)
         item.setSizeHint(0, actionCombo.sizeHint())
-    
+
     def __createPlanItem(self, text):
         """
         Private method to create an edit plan tree item.
-        
+
         @param text line of text to be parsed
         @type str
         """
         if not text.lstrip():
             return
-        
+
         parts = text.split(" ", 3)
         action = parts[0]
         try:
@@ -154,16 +157,18 @@
         except ValueError:
             rev = -1
             summary = " ".join(parts[2:])
-        revision = ("{0:>7}:{1}".format(rev, parts[1])
-                    if rev > -1 else parts[1])
-        
-        itm = QTreeWidgetItem(self.planTreeWidget, [
-            action,
-            revision,
-            summary,
-        ])
+        revision = "{0:>7}:{1}".format(rev, parts[1]) if rev > -1 else parts[1]
+
+        itm = QTreeWidgetItem(
+            self.planTreeWidget,
+            [
+                action,
+                revision,
+                summary,
+            ],
+        )
         self.__addActionCombo(itm)
-    
+
     def __resizeSections(self):
         """
         Private method to resize the tree widget sections.
@@ -171,7 +176,7 @@
         for column in range(self.planTreeWidget.columnCount()):
             self.planTreeWidget.resizeColumnToContents(column)
         self.planTreeWidget.header().setStretchLastSection(True)
-    
+
     def __updateButtons(self):
         """
         Private method to set the enabled state of the up and down buttons.
@@ -181,51 +186,51 @@
             self.downButton.setEnabled(False)
         else:
             row = self.planTreeWidget.indexOfTopLevelItem(
-                self.planTreeWidget.currentItem())
+                self.planTreeWidget.currentItem()
+            )
             self.upButton.setEnabled(row > 0)
             self.downButton.setEnabled(
-                row < self.planTreeWidget.topLevelItemCount() - 1)
-    
+                row < self.planTreeWidget.topLevelItemCount() - 1
+            )
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_planTreeWidget_currentItemChanged(self, current, previous):
         """
         Private slot handling the change of the current edit plan item.
-        
+
         @param current reference to the current edit plan item
         @type QTreeWidgetItem
         @param previous reference to the previous current edit plan item
         @type QTreeWidgetItem
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
         Private slot to move the current entry up one line.
         """
-        row = self.planTreeWidget.indexOfTopLevelItem(
-            self.planTreeWidget.currentItem())
+        row = self.planTreeWidget.indexOfTopLevelItem(self.planTreeWidget.currentItem())
         if row > 0:
             targetRow = row - 1
             itm = self.planTreeWidget.takeTopLevelItem(row)
             self.planTreeWidget.insertTopLevelItem(targetRow, itm)
             self.__addActionCombo(itm)
             self.planTreeWidget.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
         Private slot to move the current entry down one line.
         """
-        row = self.planTreeWidget.indexOfTopLevelItem(
-            self.planTreeWidget.currentItem())
+        row = self.planTreeWidget.indexOfTopLevelItem(self.planTreeWidget.currentItem())
         if row < self.planTreeWidget.topLevelItemCount() - 1:
             targetRow = row + 1
             itm = self.planTreeWidget.takeTopLevelItem(row)
             self.planTreeWidget.insertTopLevelItem(targetRow, itm)
             self.__addActionCombo(itm)
             self.planTreeWidget.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_buttonBox_accepted(self):
         """
@@ -239,15 +244,17 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Edit Plan"),
-                self.tr("""<p>The file <b>{0}</b> could not be read.</p>"""
-                        """<p>Reason: {1}</p>""").format(
-                    self.__fileName, str(err)))
+                self.tr(
+                    """<p>The file <b>{0}</b> could not be read.</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(self.__fileName, str(err)),
+            )
             self.on_buttonBox_rejected()
             return
-        
+
         self.close()
         QCoreApplication.exit(0)
-    
+
     @pyqtSlot()
     def on_buttonBox_rejected(self):
         """
@@ -255,12 +262,12 @@
         """
         self.close()
         QCoreApplication.exit(1)
-    
+
     def __assembleEditPlan(self):
         """
         Private method to assemble the edit plan into text suitable for the
         histedit file.
-        
+
         @return assembled edit plan text
         @rtype str
         """
@@ -272,8 +279,7 @@
                 rev = "{0} {1}".format(changeset.strip(), rev.strip())
             else:
                 rev = itm.text(1).strip()
-            
-            lines.append("{0} {1} {2}".format(itm.text(0).strip(), rev,
-                                              itm.text(2)))
-        
+
+            lines.append("{0} {1} {2}".format(itm.text(0).strip(), rev, itm.text(2)))
+
         return "\n".join(lines)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,79 +21,99 @@
     """
     Class implementing the histedit extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgHisteditStartAct = EricAction(
-            self.tr('Start'),
+            self.tr("Start"),
             UI.PixmapCache.getIcon("vcsEditHistory"),
-            self.tr('Start'),
-            0, 0, self, 'mercurial_histedit_start')
-        self.hgHisteditStartAct.setStatusTip(self.tr(
-            'Start a new changeset history editing session'
-        ))
-        self.hgHisteditStartAct.setWhatsThis(self.tr(
-            """<b>Start</b>"""
-            """<p>This starts a new history editing session. A dialog"""
-            """ will be presented to modify the edit plan.</p>"""
-        ))
+            self.tr("Start"),
+            0,
+            0,
+            self,
+            "mercurial_histedit_start",
+        )
+        self.hgHisteditStartAct.setStatusTip(
+            self.tr("Start a new changeset history editing session")
+        )
+        self.hgHisteditStartAct.setWhatsThis(
+            self.tr(
+                """<b>Start</b>"""
+                """<p>This starts a new history editing session. A dialog"""
+                """ will be presented to modify the edit plan.</p>"""
+            )
+        )
         self.hgHisteditStartAct.triggered.connect(self.__hgHisteditStart)
         self.actions.append(self.hgHisteditStartAct)
-        
+
         self.hgHisteditContinueAct = EricAction(
-            self.tr('Continue'),
-            self.tr('Continue'),
-            0, 0, self, 'mercurial_histedit_continue')
-        self.hgHisteditContinueAct.setStatusTip(self.tr(
-            'Continue an interrupted changeset history editing session'
-        ))
-        self.hgHisteditContinueAct.setWhatsThis(self.tr(
-            """<b>Continue</b>"""
-            """<p>This continues an interrupted history editing session.</p>"""
-        ))
+            self.tr("Continue"),
+            self.tr("Continue"),
+            0,
+            0,
+            self,
+            "mercurial_histedit_continue",
+        )
+        self.hgHisteditContinueAct.setStatusTip(
+            self.tr("Continue an interrupted changeset history editing session")
+        )
+        self.hgHisteditContinueAct.setWhatsThis(
+            self.tr(
+                """<b>Continue</b>"""
+                """<p>This continues an interrupted history editing session.</p>"""
+            )
+        )
         self.hgHisteditContinueAct.triggered.connect(self.__hgHisteditContinue)
         self.actions.append(self.hgHisteditContinueAct)
-        
+
         self.hgHisteditAbortAct = EricAction(
-            self.tr('Abort'),
-            self.tr('Abort'),
-            0, 0, self, 'mercurial_histedit_abort')
-        self.hgHisteditAbortAct.setStatusTip(self.tr(
-            'Abort an interrupted changeset history editing session'
-        ))
-        self.hgHisteditAbortAct.setWhatsThis(self.tr(
-            """<b>Abort</b>"""
-            """<p>This aborts an interrupted history editing session.</p>"""
-        ))
+            self.tr("Abort"), self.tr("Abort"), 0, 0, self, "mercurial_histedit_abort"
+        )
+        self.hgHisteditAbortAct.setStatusTip(
+            self.tr("Abort an interrupted changeset history editing session")
+        )
+        self.hgHisteditAbortAct.setWhatsThis(
+            self.tr(
+                """<b>Abort</b>"""
+                """<p>This aborts an interrupted history editing session.</p>"""
+            )
+        )
         self.hgHisteditAbortAct.triggered.connect(self.__hgHisteditAbort)
         self.actions.append(self.hgHisteditAbortAct)
-        
+
         self.hgHisteditEditPlanAct = EricAction(
-            self.tr('Edit Plan'),
-            self.tr('Edit Plan'),
-            0, 0, self, 'mercurial_histedit_edit_plan')
-        self.hgHisteditEditPlanAct.setStatusTip(self.tr(
-            'Edit the remaining actions list'
-        ))
-        self.hgHisteditEditPlanAct.setWhatsThis(self.tr(
-            """<b>Edit Plan</b>"""
-            """<p>This opens an editor to edit the remaining actions list"""
-            """ of an interrupted history editing session.</p>"""
-        ))
+            self.tr("Edit Plan"),
+            self.tr("Edit Plan"),
+            0,
+            0,
+            self,
+            "mercurial_histedit_edit_plan",
+        )
+        self.hgHisteditEditPlanAct.setStatusTip(
+            self.tr("Edit the remaining actions list")
+        )
+        self.hgHisteditEditPlanAct.setWhatsThis(
+            self.tr(
+                """<b>Edit Plan</b>"""
+                """<p>This opens an editor to edit the remaining actions list"""
+                """ of an interrupted history editing session.</p>"""
+            )
+        )
         self.hgHisteditEditPlanAct.triggered.connect(self.__hgHisteditEditPlan)
         self.actions.append(self.hgHisteditEditPlanAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu
         @type QMenu
         @return populated menu (QMenu)
@@ -101,86 +121,82 @@
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("vcsEditHistory"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgHisteditStartAct)
         menu.addSeparator()
         menu.addAction(self.hgHisteditContinueAct)
         menu.addAction(self.hgHisteditAbortAct)
         menu.addSeparator()
         menu.addAction(self.hgHisteditEditPlanAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu
         @rtype str
         """
         return self.tr("Edit History")
-    
+
     def __hgHisteditStart(self):
         """
         Private slot used to start a history editing session.
         """
-        shouldReopen = (
-            self.vcs.getExtensionObject("histedit").hgHisteditStart()
-        )
+        shouldReopen = self.vcs.getExtensionObject("histedit").hgHisteditStart()
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Start History Editing"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgHisteditContinue(self):
         """
         Private slot used to continue an interrupted history editing session.
         """
-        shouldReopen = (
-            self.vcs.getExtensionObject("histedit").hgHisteditContinue()
-        )
+        shouldReopen = self.vcs.getExtensionObject("histedit").hgHisteditContinue()
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Continue History Editing"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgHisteditAbort(self):
         """
         Private slot used to abort an interrupted history editing session.
         """
-        shouldReopen = (
-            self.vcs.getExtensionObject("histedit").hgHisteditAbort()
-        )
+        shouldReopen = self.vcs.getExtensionObject("histedit").hgHisteditAbort()
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Abort History Editing"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgHisteditEditPlan(self):
         """
         Private slot used to edit the remaining actions list of an interrupted
         history editing session.
         """
-        shouldReopen = (
-            self.vcs.getExtensionObject("histedit").hgHisteditEditPlan()
-        )
+        shouldReopen = self.vcs.getExtensionObject("histedit").hgHisteditEditPlan()
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Edit Plan"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,42 +21,44 @@
     """
     Class implementing the histedit extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         @type Hg
         """
         super().__init__(vcs)
-    
+
     def hgHisteditStart(self, rev=""):
         """
         Public method to start a histedit session.
-        
+
         @param rev revision to start histedit at
         @type str
         @return flag indicating that the project should be reread
         @rtype bool
         """
         from .HgHisteditConfigDialog import HgHisteditConfigDialog
+
         res = False
-        dlg = HgHisteditConfigDialog(self.vcs.hgGetTagsList(),
-                                     self.vcs.hgGetBranchesList(),
-                                     self.vcs.hgGetBookmarksList(),
-                                     rev)
+        dlg = HgHisteditConfigDialog(
+            self.vcs.hgGetTagsList(),
+            self.vcs.hgGetBranchesList(),
+            self.vcs.hgGetBookmarksList(),
+            rev,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             rev, force, keep = dlg.getData()
-            
-            editor = os.path.join(
-                os.path.dirname(__file__), "HgHisteditEditor.py")
-            
+
+            editor = os.path.join(os.path.dirname(__file__), "HgHisteditEditor.py")
+
             args = self.vcs.initCommand("histedit")
             args.append("-v")
-            args.extend([
-                "--config",
-                f"ui.editor={Globals.getPythonExecutable()} {editor}"
-            ])
+            args.extend(
+                ["--config", f"ui.editor={Globals.getPythonExecutable()} {editor}"]
+            )
             if keep:
                 args.append("--keep")
             if rev:
@@ -66,56 +68,48 @@
                 else:
                     args.append("--rev")
                 args.append(rev)
-            
+
             env = {
-                "HGEDITOR": "{0} {1}".format(
-                    Globals.getPythonExecutable(), editor),
-                "EDITOR": "{0} {1}".format(
-                    Globals.getPythonExecutable(), editor),
+                "HGEDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor),
+                "EDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor),
             }
-            
+
             dia = HgDialog(
-                self.tr("Starting histedit session"),
-                self.vcs,
-                useClient=False)
+                self.tr("Starting histedit session"), self.vcs, useClient=False
+            )
             res = dia.startProcess(args, environment=env)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.vcs.checkVCSStatus()
         return res
-    
+
     def hgHisteditContinue(self):
         """
         Public method to continue an interrupted histedit session.
-        
+
         @return flag indicating that the project should be reread
         @rtype bool
         """
         args = self.vcs.initCommand("histedit")
         args.append("--continue")
         args.append("-v")
-        
-        editor = os.path.join(
-            os.path.dirname(__file__), "HgHisteditEditor.py")
-        env = {"HGEDITOR": "{0} {1}".format(
-            Globals.getPythonExecutable(), editor)}
-        
-        dia = HgDialog(
-            self.tr("Continue histedit session"),
-            self.vcs,
-            useClient=False)
+
+        editor = os.path.join(os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor)}
+
+        dia = HgDialog(self.tr("Continue histedit session"), self.vcs, useClient=False)
         res = dia.startProcess(args, environment=env)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgHisteditAbort(self, name):
         """
         Public method to abort an interrupted histedit session.
-        
+
         @param name file/directory name
         @type str
         @return flag indicating that the project should be reread
@@ -124,44 +118,34 @@
         args = self.vcs.initCommand("histedit")
         args.append("--abort")
         args.append("-v")
-        
-        editor = os.path.join(
-            os.path.dirname(__file__), "HgHisteditEditor.py")
-        env = {"HGEDITOR": "{0} {1}".format(
-            Globals.getPythonExecutable(), editor)}
-        
-        dia = HgDialog(
-            self.tr("Abort histedit session"),
-            self.vcs,
-            useClient=False)
+
+        editor = os.path.join(os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor)}
+
+        dia = HgDialog(self.tr("Abort histedit session"), self.vcs, useClient=False)
         res = dia.startProcess(args, environment=env)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgHisteditEditPlan(self):
         """
         Public method to edit the remaining actions list of an interrupted
         histedit session.
-        
+
         @return flag indicating that the project should be reread
         @rtype bool
         """
         args = self.vcs.initCommand("histedit")
         args.append("--edit-plan")
         args.append("-v")
-        
-        editor = os.path.join(
-            os.path.dirname(__file__), "HgHisteditEditor.py")
-        env = {"HGEDITOR": "{0} {1}".format(
-            Globals.getPythonExecutable(), editor)}
-        
-        dia = HgDialog(
-            self.tr("Edit Plan"),
-            self.vcs,
-            useClient=False)
+
+        editor = os.path.join(os.path.dirname(__file__), "HgHisteditEditor.py")
+        env = {"HGEDITOR": "{0} {1}".format(Globals.getPythonExecutable(), editor)}
+
+        dia = HgDialog(self.tr("Edit Plan"), self.vcs, useClient=False)
         res = dia.startProcess(args, environment=env)
         if res:
             dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfConvertDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfConvertDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,57 +25,59 @@
     """
     Class implementing a dialog to enter the data for the repo conversion.
     """
+
     def __init__(self, currentPath, mode, parent=None):
         """
         Constructor
-        
+
         @param currentPath directory name of the current project (string)
         @param mode dialog mode (string, one of 'largefiles' or 'normal')
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.newProjectPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.__defaults = getDefaults()
         self.__currentPath = Utilities.toNativeSeparators(currentPath)
-        
+
         self.currentProjectLabel.setPath(currentPath)
         self.newProjectPicker.setText(os.path.dirname(currentPath))
-        
+
         self.lfFileSizeSpinBox.setValue(self.__defaults["minsize"])
         self.lfFilePatternsEdit.setText(" ".join(self.__defaults["pattern"]))
-        
-        if mode == 'normal':
+
+        if mode == "normal":
             self.lfFileSizeSpinBox.setEnabled(False)
             self.lfFilePatternsEdit.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_newProjectPicker_textChanged(self, txt):
         """
         Private slot to handle editing of the new project directory.
-        
+
         @param txt new project directory name (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            txt and Utilities.toNativeSeparators(txt) != os.path.dirname(
-                self.__currentPath))
-    
+            txt
+            and Utilities.toNativeSeparators(txt) != os.path.dirname(self.__currentPath)
+        )
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple containing the new project directory name (string),
             minimum file size (integer) and file patterns (list of string)
         """
         patterns = self.lfFilePatternsEdit.text().split()
         if set(patterns) == set(self.__defaults["pattern"]):
             patterns = []
-        
+
         return (
             self.newProjectPicker.text(),
             self.lfFileSizeSpinBox.value(),
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfRevisionsInputDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfRevisionsInputDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,30 +17,31 @@
     """
     Class implementing a dialog to enter a series of revisions.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     @pyqtSlot()
     def on_revisionsEdit_textChanged(self):
         """
         Private slot handling a change of revisions.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.revisionsEdit.toPlainText()))
-    
+            bool(self.revisionsEdit.toPlainText())
+        )
+
     def getRevisions(self):
         """
         Public method to retrieve the entered revisions.
-        
+
         @return list of revisions (list of string)
         """
         return self.revisionsEdit.toPlainText().splitlines()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,23 +18,23 @@
     """
     Class implementing the largefiles extension project browser helper.
     """
+
     def __init__(self, vcsObject, browserObject, projectObject):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
         """
-        super().__init__(
-            vcsObject, browserObject, projectObject)
-    
+        super().__init__(vcsObject, browserObject, projectObject)
+
     def initMenus(self):
         """
         Public method to generate the extension menus.
-        
+
         Note: Derived class must implement this method.
-        
+
         @return dictionary of populated menu (dict of QMenu). The dict
             must have the keys 'mainMenu', 'multiMenu', 'backMenu', 'dirMenu'
             and 'dirMultiMenu'.
@@ -42,51 +42,55 @@
         self.__menus = {}
         self.__addSingleActs = []
         self.__addMultiActs = []
-        
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add as Large File'),
-            lambda: self.__hgAddLargefiles("large"))
+            self.tr("Add as Large File"),
+            lambda: self.__hgAddLargefiles("large"),
+        )
         self.__addSingleActs.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add as Normal File'),
-            lambda: self.__hgAddLargefiles("normal"))
+            self.tr("Add as Normal File"),
+            lambda: self.__hgAddLargefiles("normal"),
+        )
         self.__addSingleActs.append(act)
-        self.__menus['mainMenu'] = menu
-        
+        self.__menus["mainMenu"] = menu
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add as Large Files'),
-            lambda: self.__hgAddLargefiles("large"))
+            self.tr("Add as Large Files"),
+            lambda: self.__hgAddLargefiles("large"),
+        )
         self.__addMultiActs.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add as Normal Files'),
-            lambda: self.__hgAddLargefiles("normal"))
+            self.tr("Add as Normal Files"),
+            lambda: self.__hgAddLargefiles("normal"),
+        )
         self.__addMultiActs.append(act)
-        self.__menus['multiMenu'] = menu
-        
+        self.__menus["multiMenu"] = menu
+
         return self.__menus
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         Note: Derived class must implement this method.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Large Files")
-    
+
     def showExtensionMenu(self, key, controlled):
         """
         Public method to prepare the extension menu for display.
-        
+
         @param key menu key (string, one of 'mainMenu', 'multiMenu',
             'backMenu', 'dirMenu' or 'dirMultiMenu')
         @param controlled flag indicating to prepare the menu for a
@@ -99,11 +103,11 @@
         elif key == "multiMenu":
             for act in self.__addMultiActs:
                 act.setEnabled(not controlled)
-    
+
     def __hgAddLargefiles(self, mode):
         """
         Private slot to add the selected files as large files.
-        
+
         @param mode add mode (string one of 'normal' or 'large')
         """
         names = []
@@ -113,7 +117,7 @@
             except AttributeError:
                 continue
             names.append(name)
-        
+
         if names:
             if len(names) == 1:
                 self.vcs.getExtensionObject("largefiles").hgAdd(names[0], mode)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,145 +20,187 @@
     """
     Class implementing the queues extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgConvertToLargefilesAct = EricAction(
-            self.tr('Convert repository to largefiles'),
-            self.tr('Convert repository to largefiles...'),
-            0, 0, self, 'mercurial_convert_to_largefiles')
-        self.hgConvertToLargefilesAct.setStatusTip(self.tr(
-            'Convert the repository of the project to a largefiles repository.'
-        ))
-        self.hgConvertToLargefilesAct.setWhatsThis(self.tr(
-            """<b>Convert repository to largefiles</b>"""
-            """<p>This converts the repository of the project to a"""
-            """ largefiles repository. A new project  is created. The"""
-            """ current one is kept as a backup.</p>"""
-        ))
+            self.tr("Convert repository to largefiles"),
+            self.tr("Convert repository to largefiles..."),
+            0,
+            0,
+            self,
+            "mercurial_convert_to_largefiles",
+        )
+        self.hgConvertToLargefilesAct.setStatusTip(
+            self.tr("Convert the repository of the project to a largefiles repository.")
+        )
+        self.hgConvertToLargefilesAct.setWhatsThis(
+            self.tr(
+                """<b>Convert repository to largefiles</b>"""
+                """<p>This converts the repository of the project to a"""
+                """ largefiles repository. A new project  is created. The"""
+                """ current one is kept as a backup.</p>"""
+            )
+        )
         self.hgConvertToLargefilesAct.triggered.connect(
-            lambda: self.__hgLfconvert("largefiles"))
+            lambda: self.__hgLfconvert("largefiles")
+        )
         self.actions.append(self.hgConvertToLargefilesAct)
-        
+
         self.hgConvertToNormalAct = EricAction(
-            self.tr('Convert repository to normal'),
-            self.tr('Convert repository to normal...'),
-            0, 0, self, 'mercurial_convert_to_normal')
-        self.hgConvertToNormalAct.setStatusTip(self.tr(
-            'Convert the repository of the project to a normal repository.'
-        ))
-        self.hgConvertToNormalAct.setWhatsThis(self.tr(
-            """<b>Convert repository to normal</b>"""
-            """<p>This converts the repository of the project to a"""
-            """ normal repository. A new project is created. The current"""
-            """ one is kept as a backup.</p>"""
-        ))
+            self.tr("Convert repository to normal"),
+            self.tr("Convert repository to normal..."),
+            0,
+            0,
+            self,
+            "mercurial_convert_to_normal",
+        )
+        self.hgConvertToNormalAct.setStatusTip(
+            self.tr("Convert the repository of the project to a normal repository.")
+        )
+        self.hgConvertToNormalAct.setWhatsThis(
+            self.tr(
+                """<b>Convert repository to normal</b>"""
+                """<p>This converts the repository of the project to a"""
+                """ normal repository. A new project is created. The current"""
+                """ one is kept as a backup.</p>"""
+            )
+        )
         self.hgConvertToNormalAct.triggered.connect(
-            lambda: self.__hgLfconvert("normal"))
+            lambda: self.__hgLfconvert("normal")
+        )
         self.actions.append(self.hgConvertToNormalAct)
-        
+
         self.hgLfPullAct = EricAction(
-            self.tr('Pull Large Files'),
+            self.tr("Pull Large Files"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Pull Large Files'),
-            0, 0, self, 'mercurial_pull_largefiles')
-        self.hgLfPullAct.setStatusTip(self.tr(
-            'Pull large files from a remote repository'
-        ))
-        self.hgLfPullAct.setWhatsThis(self.tr(
-            """<b>Pull Large Files</b>"""
-            """<p>This pulls missing large files from a remote repository"""
-            """ into the local repository.</p>"""
-        ))
+            self.tr("Pull Large Files"),
+            0,
+            0,
+            self,
+            "mercurial_pull_largefiles",
+        )
+        self.hgLfPullAct.setStatusTip(
+            self.tr("Pull large files from a remote repository")
+        )
+        self.hgLfPullAct.setWhatsThis(
+            self.tr(
+                """<b>Pull Large Files</b>"""
+                """<p>This pulls missing large files from a remote repository"""
+                """ into the local repository.</p>"""
+            )
+        )
         self.hgLfPullAct.triggered.connect(self.__hgLfPull)
         self.actions.append(self.hgLfPullAct)
-        
+
         self.hgLfSummaryAct = EricAction(
-            self.tr('Show Summary'),
+            self.tr("Show Summary"),
             UI.PixmapCache.getIcon("vcsSummary"),
-            self.tr('Show summary...'),
-            0, 0, self, 'mercurial_summary_largefiles')
-        self.hgLfSummaryAct.setStatusTip(self.tr(
-            'Show summary information of the working directory status'
-        ))
-        self.hgLfSummaryAct.setWhatsThis(self.tr(
-            """<b>Show summary</b>"""
-            """<p>This shows some summary information of the working"""
-            """ directory status.</p>"""
-        ))
+            self.tr("Show summary..."),
+            0,
+            0,
+            self,
+            "mercurial_summary_largefiles",
+        )
+        self.hgLfSummaryAct.setStatusTip(
+            self.tr("Show summary information of the working directory status")
+        )
+        self.hgLfSummaryAct.setWhatsThis(
+            self.tr(
+                """<b>Show summary</b>"""
+                """<p>This shows some summary information of the working"""
+                """ directory status.</p>"""
+            )
+        )
         self.hgLfSummaryAct.triggered.connect(self.__hgLfSummary)
         self.actions.append(self.hgLfSummaryAct)
-        
+
         self.hgVerifyLargeAct = EricAction(
-            self.tr('Verify large files of current revision'),
-            self.tr('Verify large files of current revision...'),
-            0, 0, self, 'mercurial_verify_large')
-        self.hgVerifyLargeAct.setStatusTip(self.tr(
-            'Verify that all large files in the current revision exist'
-        ))
-        self.hgVerifyLargeAct.setWhatsThis(self.tr(
-            """<b>Verify large files of current revision</b>"""
-            """<p>This verifies that all large files in the current"""
-            """ revision exist.</p>"""
-        ))
-        self.hgVerifyLargeAct.triggered.connect(
-            lambda: self.__hgLfVerify("large"))
+            self.tr("Verify large files of current revision"),
+            self.tr("Verify large files of current revision..."),
+            0,
+            0,
+            self,
+            "mercurial_verify_large",
+        )
+        self.hgVerifyLargeAct.setStatusTip(
+            self.tr("Verify that all large files in the current revision exist")
+        )
+        self.hgVerifyLargeAct.setWhatsThis(
+            self.tr(
+                """<b>Verify large files of current revision</b>"""
+                """<p>This verifies that all large files in the current"""
+                """ revision exist.</p>"""
+            )
+        )
+        self.hgVerifyLargeAct.triggered.connect(lambda: self.__hgLfVerify("large"))
         self.actions.append(self.hgVerifyLargeAct)
-        
+
         self.hgVerifyLfaAct = EricAction(
-            self.tr('Verify large files of all revision'),
-            self.tr('Verify large files of all revision...'),
-            0, 0, self, 'mercurial_verify_lfa')
-        self.hgVerifyLfaAct.setStatusTip(self.tr(
-            'Verify that all large files in all revisions exist'
-        ))
-        self.hgVerifyLfaAct.setWhatsThis(self.tr(
-            """<b>Verify large files of all revision</b>"""
-            """<p>This verifies that all large files in all"""
-            """ revisions exist.</p>"""
-        ))
-        self.hgVerifyLfaAct.triggered.connect(
-            lambda: self.__hgLfVerify("lfa"))
+            self.tr("Verify large files of all revision"),
+            self.tr("Verify large files of all revision..."),
+            0,
+            0,
+            self,
+            "mercurial_verify_lfa",
+        )
+        self.hgVerifyLfaAct.setStatusTip(
+            self.tr("Verify that all large files in all revisions exist")
+        )
+        self.hgVerifyLfaAct.setWhatsThis(
+            self.tr(
+                """<b>Verify large files of all revision</b>"""
+                """<p>This verifies that all large files in all"""
+                """ revisions exist.</p>"""
+            )
+        )
+        self.hgVerifyLfaAct.triggered.connect(lambda: self.__hgLfVerify("lfa"))
         self.actions.append(self.hgVerifyLfaAct)
-        
+
         self.hgVerifyLfcAct = EricAction(
-            self.tr('Verify large files contents'),
-            self.tr('Verify large files contents...'),
-            0, 0, self, 'mercurial_verify_lfc')
-        self.hgVerifyLfcAct.setStatusTip(self.tr(
-            'Verify the contents of all large files'
-        ))
-        self.hgVerifyLfcAct.setWhatsThis(self.tr(
-            """<b>Verify large files contents</b>"""
-            """<p>This verifies the contents of all large files.</p>"""
-        ))
-        self.hgVerifyLfcAct.triggered.connect(
-            lambda: self.__hgLfVerify("lfc"))
+            self.tr("Verify large files contents"),
+            self.tr("Verify large files contents..."),
+            0,
+            0,
+            self,
+            "mercurial_verify_lfc",
+        )
+        self.hgVerifyLfcAct.setStatusTip(
+            self.tr("Verify the contents of all large files")
+        )
+        self.hgVerifyLfcAct.setWhatsThis(
+            self.tr(
+                """<b>Verify large files contents</b>"""
+                """<p>This verifies the contents of all large files.</p>"""
+            )
+        )
+        self.hgVerifyLfcAct.triggered.connect(lambda: self.__hgLfVerify("lfc"))
         self.actions.append(self.hgVerifyLfcAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setTearOffEnabled(True)
-        
+
         self.__adminMenu = QMenu(self.tr("Administration"), menu)
         self.__adminMenu.setTearOffEnabled(True)
         self.__adminMenu.addAction(self.hgVerifyLargeAct)
         self.__adminMenu.addAction(self.hgVerifyLfaAct)
         self.__adminMenu.addAction(self.hgVerifyLfcAct)
-        
+
         menu.addAction(self.hgConvertToLargefilesAct)
         menu.addAction(self.hgConvertToNormalAct)
         menu.addSeparator()
@@ -167,30 +209,30 @@
         menu.addAction(self.hgLfSummaryAct)
         menu.addSeparator()
         menu.addMenu(self.__adminMenu)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Large Files")
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
-        
+
         Note: Derived class may implement this method if needed.
         """
         if self.__adminMenu.isTearOffMenuVisible():
             self.__adminMenu.hideTearOffMenu()
-    
+
     def __hgLfconvert(self, direction):
         """
         Private slot to convert the repository format of the current project.
-        
+
         @param direction direction of the conversion (string; one of
             'largefiles' or 'normal')
         @exception ValueError raised to indicate a bad value for the
@@ -198,31 +240,32 @@
         """
         if direction not in ["largefiles", "normal"]:
             raise ValueError("Bad value for 'direction' parameter.")
-        
+
         self.vcs.getExtensionObject("largefiles").hgLfconvert(
-            direction, self.project.getProjectFile())
-    
+            direction, self.project.getProjectFile()
+        )
+
     def __hgLfPull(self):
         """
         Private slot to pull missing large files into the local repository.
         """
         self.vcs.getExtensionObject("largefiles").hgLfPull()
-    
+
     def __hgLfSummary(self):
         """
         Private slot to show a working directory summary.
         """
         self.vcs.hgSummary(largefiles=True)
-    
+
     def __hgLfVerify(self, mode):
         """
         Private slot to verify large files integrity.
-        
+
         @param mode verify mode (string; one of 'large', 'lfa' or 'lfc')
         @exception ValueError raised to indicate a bad value for the
             'mode' parameter.
         """
-        if mode not in ['large', 'lfa', 'lfc']:
+        if mode not in ["large", "lfa", "lfc"]:
             raise ValueError("Bad value for 'mode' parameter.")
-        
+
         self.vcs.getExtensionObject("largefiles").hgLfVerify(mode)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,10 +11,10 @@
 def getDefaults():
     """
     Function to get the default values of the extension.
-    
+
     @return dictionary with default values and parameter as key (dict)
     """
     return {
-        'minsize': 10,      # minimum size in MB
-        'pattern': [],      # file name patterns
+        "minsize": 10,  # minimum size in MB
+        "pattern": [],  # file name patterns
     }
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,18 +24,19 @@
     """
     Class implementing the largefiles extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-    
+
     def hgLfconvert(self, direction, projectFile):
         """
         Public slot to convert the repository format of the current project.
-        
+
         @param direction direction of the conversion (string, one of
             'largefiles' or 'normal')
         @param projectFile file name of the current project file (string)
@@ -44,35 +45,36 @@
         """
         if direction not in ["largefiles", "normal"]:
             raise ValueError("Bad value for 'direction' parameter.")
-        
+
         projectDir = os.path.dirname(projectFile)
-        
+
         from .LfConvertDataDialog import LfConvertDataDialog
+
         dlg = LfConvertDataDialog(projectDir, direction)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             newName, minSize, patterns = dlg.getData()
-            newProjectFile = os.path.join(
-                newName, os.path.basename(projectFile))
-            
+            newProjectFile = os.path.join(newName, os.path.basename(projectFile))
+
             # step 1: convert the current project to new project
             args = self.vcs.initCommand("lfconvert")
-            if direction == 'normal':
-                args.append('--to-normal')
+            if direction == "normal":
+                args.append("--to-normal")
             else:
                 args.append("--size")
                 args.append(str(minSize))
             args.append(projectDir)
             args.append(newName)
-            if direction == 'largefiles' and patterns:
+            if direction == "largefiles" and patterns:
                 args.extend(patterns)
-            
-            dia = HgDialog(self.tr('Convert Project - Converting'), self.vcs)
+
+            dia = HgDialog(self.tr("Convert Project - Converting"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.normalExit() and os.path.isdir(
-                    os.path.join(newName, self.vcs.adminDir))
-            
+                    os.path.join(newName, self.vcs.adminDir)
+                )
+
             # step 2: create working directory contents
             if res:
                 # step 2.1: start a command server client for the new repo
@@ -84,43 +86,43 @@
                         self.tr("Mercurial Command Server"),
                         self.tr(
                             """<p>The Mercurial Command Server could not be"""
-                            """ started.</p><p>Reason: {0}</p>""").format(err))
+                            """ started.</p><p>Reason: {0}</p>"""
+                        ).format(err),
+                    )
                     return
-                
+
                 # step 2.2: create working directory contents
                 args = self.vcs.initCommand("update")
                 args.append("--verbose")
-                dia = HgDialog(self.tr('Convert Project - Extracting'),
-                               self.vcs, client=client)
+                dia = HgDialog(
+                    self.tr("Convert Project - Extracting"), self.vcs, client=client
+                )
                 res = dia.startProcess(args)
                 if res:
                     dia.exec()
                     res = dia.normalExit() and os.path.isfile(newProjectFile)
-                
+
                 # step 2.3: stop the command server client for the new repo
                 client.stopServer()
-            
+
             # step 3: close current project and open new one
             if res:
-                if direction == 'largefiles':
+                if direction == "largefiles":
                     self.vcs.hgEditConfig(
                         repoName=newName,
-                        largefilesData={"minsize": minSize,
-                                        "pattern": patterns}
+                        largefilesData={"minsize": minSize, "pattern": patterns},
                     )
                 else:
-                    self.vcs.hgEditConfig(
-                        repoName=newName,
-                        withLargefiles=False
-                    )
+                    self.vcs.hgEditConfig(repoName=newName, withLargefiles=False)
                 QTimer.singleShot(
-                    0, lambda: ericApp().getObject("Project").openProject(
-                        newProjectFile))
-    
+                    0,
+                    lambda: ericApp().getObject("Project").openProject(newProjectFile),
+                )
+
     def hgAdd(self, names, mode):
         """
         Public method used to add a file to the Mercurial repository.
-        
+
         @param names file name(s) to be added (string or list of string)
         @param mode add mode (string one of 'normal' or 'large')
         """
@@ -130,23 +132,21 @@
             args.append("--large")
         else:
             args.append("--normal")
-        
+
         if isinstance(names, list):
             self.vcs.addArguments(args, names)
         else:
             args.append(names)
-        
-        dia = HgDialog(
-            self.tr('Adding files to the Mercurial repository'),
-            self.vcs)
+
+        dia = HgDialog(self.tr("Adding files to the Mercurial repository"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def hgLfPull(self, revisions=None):
         """
         Public method to pull missing large files into the local repository.
-        
+
         @param revisions list of revisions to pull (list of string)
         """
         revs = []
@@ -154,26 +154,27 @@
             revs = revisions
         else:
             from .LfRevisionsInputDialog import LfRevisionsInputDialog
+
             dlg = LfRevisionsInputDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 revs = dlg.getRevisions()
-        
+
         if revs:
             args = self.vcs.initCommand("lfpull")
             args.append("-v")
             for rev in revs:
                 args.append("--rev")
                 args.append(rev)
-            
+
             dia = HgDialog(self.tr("Pulling large files"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgLfVerify(self, mode):
         """
         Public method to verify large files integrity.
-        
+
         @param mode verify mode (string; one of 'large', 'lfa' or 'lfc')
         """
         args = self.vcs.initCommand("verify")
@@ -185,10 +186,8 @@
             args.append("--lfc")
         else:
             return
-        
-        dia = HgDialog(
-            self.tr('Verifying the integrity of large files'),
-            self.vcs)
+
+        dia = HgDialog(self.tr("Verifying the integrity of large files"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,19 @@
     """
     Class implementing the VCS project browser helper for Mercurial.
     """
-    def __init__(self, vcsObject, browserObject, projectObject,
-                 isTranslationsBrowser, parent=None, name=None):
+
+    def __init__(
+        self,
+        vcsObject,
+        browserObject,
+        projectObject,
+        isTranslationsBrowser,
+        parent=None,
+        name=None,
+    ):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
@@ -37,38 +45,44 @@
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
-        VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject,
-                                         projectObject, isTranslationsBrowser,
-                                         parent, name)
-        
+        VcsProjectBrowserHelper.__init__(
+            self,
+            vcsObject,
+            browserObject,
+            projectObject,
+            isTranslationsBrowser,
+            parent,
+            name,
+        )
+
         # instantiate the extensions
-        from .ShelveExtension.ProjectBrowserHelper import (
-            ShelveProjectBrowserHelper
+        from .ShelveExtension.ProjectBrowserHelper import ShelveProjectBrowserHelper
+        from .LargefilesExtension.ProjectBrowserHelper import (
+            LargefilesProjectBrowserHelper,
         )
-        from .LargefilesExtension.ProjectBrowserHelper import (
-            LargefilesProjectBrowserHelper
-        )
+
         self.__extensions = {
             "shelve": ShelveProjectBrowserHelper(
-                vcsObject, browserObject, projectObject),
+                vcsObject, browserObject, projectObject
+            ),
             "largefiles": LargefilesProjectBrowserHelper(
-                vcsObject, browserObject, projectObject),
+                vcsObject, browserObject, projectObject
+            ),
         }
-        
+
         self.__extensionMenuTitles = {}
         for extension in self.__extensions:
             self.__extensionMenuTitles[
-                self.__extensions[extension].menuTitle()] = extension
+                self.__extensions[extension].menuTitle()
+            ] = extension
         self.__extensionMenus = {}
         for extension in self.__extensions:
-            self.__extensionMenus[extension] = (
-                self.__extensions[extension].initMenus()
-            )
-    
+            self.__extensionMenus[extension] = self.__extensions[extension].initMenus()
+
     def __showExtensionMenu(self, key, controlled):
         """
         Private slot showing the extensions menu.
-        
+
         @param key menu key (string, one of 'mainMenu', 'multiMenu',
             'backMenu', 'dirMenu' or 'dirMultiMenu')
         @param controlled flag indicating to show the menu for a
@@ -78,23 +92,24 @@
         for extensionName in self.__extensionMenus:
             if key in self.__extensionMenus[extensionName]:
                 self.__extensionMenus[extensionName][key].setEnabled(
-                    self.vcs.isExtensionActive(extensionName))
+                    self.vcs.isExtensionActive(extensionName)
+                )
                 if self.__extensionMenus[extensionName][key].isEnabled():
                     # adjust individual extension menu entries
-                    self.__extensions[extensionName].showExtensionMenu(
-                        key, controlled)
-                if (not self.__extensionMenus[extensionName][key]
-                    .isEnabled() and self.__extensionMenus[extensionName][key]
-                        .isTearOffMenuVisible()):
+                    self.__extensions[extensionName].showExtensionMenu(key, controlled)
+                if (
+                    not self.__extensionMenus[extensionName][key].isEnabled()
+                    and self.__extensionMenus[extensionName][key].isTearOffMenuVisible()
+                ):
                     self.__extensionMenus[extensionName][key].hideTearOffMenu()
-    
+
     def showContextMenu(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -107,7 +122,7 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(False)
-            if not hasattr(self.browser.currentItem(), 'fileName'):
+            if not hasattr(self.browser.currentItem(), "fileName"):
                 self.annotateAct.setEnabled(False)
         else:
             controlled = False
@@ -118,15 +133,15 @@
             for act in standardItems:
                 act.setEnabled(True)
         self.__showExtensionMenu("mainMenu", controlled)
-    
+
     def showContextMenuMulti(self, menu, standardItems):
         """
         Public slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -138,7 +153,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             controlled = True
             if vcsItems != len(items):
@@ -160,14 +175,14 @@
             for act in standardItems:
                 act.setEnabled(True)
         self.__showExtensionMenu("multiMenu", controlled)
-    
+
     def showContextMenuDir(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -189,14 +204,14 @@
             for act in standardItems:
                 act.setEnabled(True)
         self.__showExtensionMenu("dirMenu", controlled)
-    
+
     def showContextMenuDirMulti(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -208,7 +223,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             controlled = True
             if vcsItems != len(items):
@@ -230,456 +245,518 @@
             for act in standardItems:
                 act.setEnabled(True)
         self.__showExtensionMenu("dirMultiMenu", controlled)
-    
+
     ###########################################################################
     ## Private menu generation methods below
     ###########################################################################
-    
+
     def __addExtensionsMenu(self, menu, key):
         """
         Private method to add an extension menu entry.
-        
+
         @param menu menu to add it to (QMenu)
         @param key menu key (string, one of 'mainMenu', 'multiMenu',
             'backMenu', 'dirMenu' or 'dirMultiMenu')
         @return reference to the menu action (QAction)
         """
         act = None
-        if key in ['mainMenu', 'multiMenu', 'backMenu', 'dirMenu',
-                   'dirMultiMenu']:
+        if key in ["mainMenu", "multiMenu", "backMenu", "dirMenu", "dirMultiMenu"]:
             extensionsMenu = QMenu(self.tr("Extensions"), menu)
             extensionsMenu.setTearOffEnabled(True)
             for extensionMenuTitle in sorted(self.__extensionMenuTitles):
                 extensionName = self.__extensionMenuTitles[extensionMenuTitle]
                 if key in self.__extensionMenus[extensionName]:
-                    extensionsMenu.addMenu(
-                        self.__extensionMenus[extensionName][key])
+                    extensionsMenu.addMenu(self.__extensionMenus[extensionName][key])
             if not extensionsMenu.isEmpty():
                 if not menu.isEmpty():
                     menu.addSeparator()
                 act = menu.addMenu(extensionsMenu)
         return act
-    
+
     ###########################################################################
     ## Protected menu generation methods below
     ###########################################################################
-    
+
     def _addVCSMenu(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMenuActions = []
         self.vcsAddMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMenuActions.append(act)
-        self.__addExtensionsMenu(menu, 'mainMenu')
+        self.__addExtensionsMenu(menu, "mainMenu")
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'),
-            self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository only'),
-            self.__HgForget)
+            self.tr("Remove from repository only"),
+            self.__HgForget,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__HgCopy)
+        act = menu.addAction(self.tr("Copy"), self.__HgCopy)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__HgMove)
+        act = menu.addAction(self.tr("Move"), self.__HgMove)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side'), self.__HgSbsDiff)
+            self.tr("Show differences side-by-side"),
+            self.__HgSbsDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__HgExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__HgExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side (extended)'),
-            self.__HgSbsExtendedDiff)
+            self.tr("Show differences side-by-side (extended)"),
+            self.__HgSbsExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         self.annotateAct = menu.addAction(
-            self.tr('Show annotated file'),
-            self.__HgAnnotate)
+            self.tr("Show annotated file"), self.__HgAnnotate
+        )
         self.vcsMenuActions.append(self.annotateAct)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__HgRevert)
-        self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__HgResolved)
+            self.tr("Revert changes"),
+            self.__HgRevert,
+        )
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts unresolved'), self.__HgUnresolved)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__HgResolved)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Re-Merge'), self.__HgReMerge)
+        act = menu.addAction(self.tr("Conflicts unresolved"), self.__HgUnresolved)
+        self.vcsMenuActions.append(act)
+        act = menu.addAction(self.tr("Re-Merge"), self.__HgReMerge)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__HgConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menu = menu
-    
+
     def _addVCSMenuMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu for multi selection to all
         project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMultiMenuActions = []
         self.vcsAddMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMultiMenuActions.append(act)
-        self.__addExtensionsMenu(menu, 'multiMenu')
+        self.__addExtensionsMenu(menu, "multiMenu")
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository only'),
-            self.__HgForget)
+            self.tr("Remove from repository only"),
+            self.__HgForget,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__HgExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__HgExtendedDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__HgRevert)
-        self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__HgResolved)
+            self.tr("Revert changes"),
+            self.__HgRevert,
+        )
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts unresolved'), self.__HgUnresolved)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__HgResolved)
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Re-Merge'), self.__HgReMerge)
+        act = menu.addAction(self.tr("Conflicts unresolved"), self.__HgUnresolved)
+        self.vcsMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Re-Merge"), self.__HgReMerge)
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__HgConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuMulti = menu
-    
+
     def _addVCSMenuBack(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__HgConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuBack = menu
-    
+
     def _addVCSMenuDir(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMenuActions = []
         self.vcsAddDirMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMenuActions.append(act)
-        self.__addExtensionsMenu(menu, 'dirMenu')
+        self.__addExtensionsMenu(menu, "dirMenu")
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__HgCopy)
+        act = menu.addAction(self.tr("Copy"), self.__HgCopy)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__HgMove)
+        act = menu.addAction(self.tr("Move"), self.__HgMove)
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__HgExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__HgExtendedDiff,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__HgRevert)
-        self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__HgResolved)
+            self.tr("Revert changes"),
+            self.__HgRevert,
+        )
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts unresolved'), self.__HgUnresolved)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__HgResolved)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Re-Merge'), self.__HgReMerge)
+        act = menu.addAction(self.tr("Conflicts unresolved"), self.__HgUnresolved)
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("Re-Merge"), self.__HgReMerge)
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__HgConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDir = menu
-    
+
     def _addVCSMenuDirMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMultiMenuActions = []
         self.vcsAddDirMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMultiMenuActions.append(act)
-        self.__addExtensionsMenu(menu, 'dirMultiMenu')
+        self.__addExtensionsMenu(menu, "dirMultiMenu")
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__HgExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__HgExtendedDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self.__HgRevert)
-        self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__HgResolved)
+            self.tr("Revert changes"),
+            self.__HgRevert,
+        )
         self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts unresolved'), self.__HgUnresolved)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__HgResolved)
         self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Re-Merge'), self.__HgReMerge)
+        act = menu.addAction(self.tr("Conflicts unresolved"), self.__HgUnresolved)
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Re-Merge"), self.__HgReMerge)
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__HgConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDirMulti = menu
-    
+
     ###########################################################################
     ## Menu handling methods below
     ###########################################################################
-    
+
     def __HgRevert(self):
         """
         Private slot called by the context menu to revert changes made.
@@ -692,7 +769,7 @@
                 name = itm.dirName()
             names.append(name)
         self.vcs.vcsRevert(names)
-    
+
     def __HgCopy(self):
         """
         Private slot called by the context menu to copy the selected file.
@@ -703,7 +780,7 @@
         except AttributeError:
             fn = itm.dirName()
         self.vcs.hgCopy(fn, self.project)
-    
+
     def __HgMove(self):
         """
         Private slot called by the context menu to move the selected file.
@@ -723,12 +800,12 @@
                 for mf in movefiles:
                     self.browser.closeSourceWindow.emit(mf)
         self.browser.project.startFileSystemMonitoring()
-    
+
     def __HgExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository.
-        
+
         This gives the chance to enter the revisions to compare.
         """
         names = []
@@ -738,7 +815,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.hgExtendedDiff(names)
-    
+
     def __HgSbsDiff(self):
         """
         Private slot called by the context menu to show the difference of a
@@ -747,18 +824,18 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn)
-    
+
     def __HgSbsExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository side-by-side.
-       
+
         It allows the selection of revisions to compare.
         """
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn, extended=True)
-    
+
     def __HgAnnotate(self):
         """
         Private slot called by the context menu to show the annotations of a
@@ -767,7 +844,7 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.hgAnnotate(fn)
-    
+
     def __HgResolved(self):
         """
         Private slot called by the context menu to mark conflicts of a file
@@ -780,7 +857,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.vcsResolved(names)
-    
+
     def __HgUnresolved(self):
         """
         Private slot called by the context menu to mark conflicts of a file
@@ -793,7 +870,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.vcsResolved(names, unresolve=True)
-    
+
     def __HgReMerge(self):
         """
         Private slot called by the context menu to re-merge a file.
@@ -805,49 +882,48 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.hgReMerge(names)
-    
+
     def __HgForget(self):
         """
         Private slot called by the context menu to remove the selected file
         from the Mercurial repository leaving a copy in the project directory.
         """
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         if self.isTranslationsBrowser:
             items = self.browser.getSelectedItems([ProjectBrowserFileItem])
             names = [itm.fileName() for itm in items]
-            
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Remove from repository only"),
                 self.tr(
-                    "Do you really want to remove these files"
-                    " from the repository?"),
-                names)
+                    "Do you really want to remove these files" " from the repository?"
+                ),
+                names,
+            )
         else:
             items = self.browser.getSelectedItems()
             names = [itm.fileName() for itm in items]
-            files = [self.browser.project.getRelativePath(name)
-                     for name in names]
-            
+            files = [self.browser.project.getRelativePath(name) for name in names]
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Remove from repository only"),
                 self.tr(
-                    "Do you really want to remove these files"
-                    " from the repository?"),
-                files)
-        
+                    "Do you really want to remove these files" " from the repository?"
+                ),
+                files,
+            )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.vcs.vcsForget(names)
-        
+
         for fn in names:
             self._updateVCSStatus(fn)
-    
+
     def __HgConfigure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_mercurialPage")
+        ericApp().getObject("UserInterface").showPreferences("zzz_mercurialPage")
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,17 +26,18 @@
     """
     Class implementing the VCS project helper for Mercurial.
     """
+
     def __init__(self, vcsObject, projectObject, parent=None, name=None):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VcsProjectHelper.__init__(self, vcsObject, projectObject, parent, name)
-        
+
         # instantiate the extensions
         from .QueuesExtension.ProjectHelper import QueuesProjectHelper
         from .PurgeExtension.ProjectHelper import PurgeProjectHelper
@@ -47,6 +48,7 @@
         from .StripExtension.ProjectHelper import StripProjectHelper
         from .HisteditExtension.ProjectHelper import HisteditProjectHelper
         from .CloseheadExtension.ProjectHelper import CloseheadProjectHelper
+
         self.__extensions = {
             "mq": QueuesProjectHelper(),
             "purge": PurgeProjectHelper(),
@@ -58,1248 +60,1610 @@
             "histedit": HisteditProjectHelper(),
             "closehead": CloseheadProjectHelper(),
         }
-        
+
         self.__extensionMenuTitles = {}
         for extension in self.__extensions:
             self.__extensionMenuTitles[
-                self.__extensions[extension].menuTitle()] = extension
-        
+                self.__extensions[extension].menuTitle()
+            ] = extension
+
         self.__toolbarManager = None
-    
+
     def setObjects(self, vcsObject, projectObject):
         """
         Public method to set references to the vcs and project objects.
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         """
         self.vcs = vcsObject
         self.project = projectObject
-        
+
         for extension in self.__extensions.values():
             extension.setObjects(vcsObject, projectObject)
-        
+
         self.vcs.iniFileChanged.connect(self.__checkActions)
-        
+
         # add Mercurial version dependent actions here
         title = self.__toolbar.windowTitle()
         if self.vcs.version >= (5, 7):
             self.actions.append(self.hgBookmarkPushAllAct)
             self.__toolbarManager.addAction(self.hgBookmarkPushAllAct, title)
-        
+
         if self.vcs.version < (4, 7, 0):
             self.hgGraftStopAct.setEnabled(False)
             self.hgGraftAbortAct.setEnabled(False)
-    
+
     def getProject(self):
         """
         Public method to get a reference to the project object.
-        
+
         @return reference to the project object (Project)
         """
         return self.project
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         actions = self.actions[:]
         for extension in self.__extensions.values():
             actions.extend(extension.getActions())
         return actions
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.vcsNewAct = EricAction(
-            self.tr('New from repository'),
+            self.tr("New from repository"),
             UI.PixmapCache.getIcon("vcsCheckout"),
-            self.tr('&New from repository...'), 0, 0,
-            self, 'mercurial_new')
-        self.vcsNewAct.setStatusTip(self.tr(
-            'Create (clone) a new project from a Mercurial repository'
-        ))
-        self.vcsNewAct.setWhatsThis(self.tr(
-            """<b>New from repository</b>"""
-            """<p>This creates (clones) a new local project from """
-            """a Mercurial repository.</p>"""
-        ))
+            self.tr("&New from repository..."),
+            0,
+            0,
+            self,
+            "mercurial_new",
+        )
+        self.vcsNewAct.setStatusTip(
+            self.tr("Create (clone) a new project from a Mercurial repository")
+        )
+        self.vcsNewAct.setWhatsThis(
+            self.tr(
+                """<b>New from repository</b>"""
+                """<p>This creates (clones) a new local project from """
+                """a Mercurial repository.</p>"""
+            )
+        )
         self.vcsNewAct.triggered.connect(self._vcsCheckout)
         self.actions.append(self.vcsNewAct)
-        
+
         self.hgIncomingAct = EricAction(
-            self.tr('Show incoming log'),
+            self.tr("Show incoming log"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Show incoming log'),
-            0, 0, self, 'mercurial_incoming')
-        self.hgIncomingAct.setStatusTip(self.tr(
-            'Show the log of incoming changes'
-        ))
-        self.hgIncomingAct.setWhatsThis(self.tr(
-            """<b>Show incoming log</b>"""
-            """<p>This shows the log of changes coming into the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show incoming log"),
+            0,
+            0,
+            self,
+            "mercurial_incoming",
+        )
+        self.hgIncomingAct.setStatusTip(self.tr("Show the log of incoming changes"))
+        self.hgIncomingAct.setWhatsThis(
+            self.tr(
+                """<b>Show incoming log</b>"""
+                """<p>This shows the log of changes coming into the"""
+                """ repository.</p>"""
+            )
+        )
         self.hgIncomingAct.triggered.connect(self.__hgIncoming)
         self.actions.append(self.hgIncomingAct)
-        
+
         self.hgPullAct = EricAction(
-            self.tr('Pull changes'),
+            self.tr("Pull changes"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Pull changes'),
-            0, 0, self, 'mercurial_pull')
-        self.hgPullAct.setStatusTip(self.tr(
-            'Pull changes from a remote repository'
-        ))
-        self.hgPullAct.setWhatsThis(self.tr(
-            """<b>Pull changes</b>"""
-            """<p>This pulls changes from a remote repository into the """
-            """local repository.</p>"""
-        ))
+            self.tr("Pull changes"),
+            0,
+            0,
+            self,
+            "mercurial_pull",
+        )
+        self.hgPullAct.setStatusTip(self.tr("Pull changes from a remote repository"))
+        self.hgPullAct.setWhatsThis(
+            self.tr(
+                """<b>Pull changes</b>"""
+                """<p>This pulls changes from a remote repository into the """
+                """local repository.</p>"""
+            )
+        )
         self.hgPullAct.triggered.connect(self.__hgPull)
         self.actions.append(self.hgPullAct)
-        
+
         self.vcsUpdateAct = EricAction(
-            self.tr('Update from repository'),
+            self.tr("Update from repository"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('&Update from repository'), 0, 0, self,
-            'mercurial_update')
-        self.vcsUpdateAct.setStatusTip(self.tr(
-            'Update the local project from the Mercurial repository'
-        ))
-        self.vcsUpdateAct.setWhatsThis(self.tr(
-            """<b>Update from repository</b>"""
-            """<p>This updates the local project from the Mercurial"""
-            """ repository.</p>"""
-        ))
+            self.tr("&Update from repository"),
+            0,
+            0,
+            self,
+            "mercurial_update",
+        )
+        self.vcsUpdateAct.setStatusTip(
+            self.tr("Update the local project from the Mercurial repository")
+        )
+        self.vcsUpdateAct.setWhatsThis(
+            self.tr(
+                """<b>Update from repository</b>"""
+                """<p>This updates the local project from the Mercurial"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsUpdateAct.triggered.connect(self._vcsUpdate)
         self.actions.append(self.vcsUpdateAct)
-        
+
         self.vcsCommitAct = EricAction(
-            self.tr('Commit changes to repository'),
+            self.tr("Commit changes to repository"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('&Commit changes to repository...'), 0, 0, self,
-            'mercurial_commit')
-        self.vcsCommitAct.setStatusTip(self.tr(
-            'Commit changes to the local project to the Mercurial repository'
-        ))
-        self.vcsCommitAct.setWhatsThis(self.tr(
-            """<b>Commit changes to repository</b>"""
-            """<p>This commits changes to the local project to the """
-            """Mercurial repository.</p>"""
-        ))
+            self.tr("&Commit changes to repository..."),
+            0,
+            0,
+            self,
+            "mercurial_commit",
+        )
+        self.vcsCommitAct.setStatusTip(
+            self.tr("Commit changes to the local project to the Mercurial repository")
+        )
+        self.vcsCommitAct.setWhatsThis(
+            self.tr(
+                """<b>Commit changes to repository</b>"""
+                """<p>This commits changes to the local project to the """
+                """Mercurial repository.</p>"""
+            )
+        )
         self.vcsCommitAct.triggered.connect(self._vcsCommit)
         self.actions.append(self.vcsCommitAct)
-        
+
         self.hgOutgoingAct = EricAction(
-            self.tr('Show outgoing log'),
+            self.tr("Show outgoing log"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Show outgoing log'),
-            0, 0, self, 'mercurial_outgoing')
-        self.hgOutgoingAct.setStatusTip(self.tr(
-            'Show the log of outgoing changes'
-        ))
-        self.hgOutgoingAct.setWhatsThis(self.tr(
-            """<b>Show outgoing log</b>"""
-            """<p>This shows the log of changes outgoing out of the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show outgoing log"),
+            0,
+            0,
+            self,
+            "mercurial_outgoing",
+        )
+        self.hgOutgoingAct.setStatusTip(self.tr("Show the log of outgoing changes"))
+        self.hgOutgoingAct.setWhatsThis(
+            self.tr(
+                """<b>Show outgoing log</b>"""
+                """<p>This shows the log of changes outgoing out of the"""
+                """ repository.</p>"""
+            )
+        )
         self.hgOutgoingAct.triggered.connect(self.__hgOutgoing)
         self.actions.append(self.hgOutgoingAct)
-        
+
         self.hgPushAct = EricAction(
-            self.tr('Push changes'),
+            self.tr("Push changes"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Push changes'),
-            0, 0, self, 'mercurial_push')
-        self.hgPushAct.setStatusTip(self.tr(
-            'Push changes to a remote repository'
-        ))
-        self.hgPushAct.setWhatsThis(self.tr(
-            """<b>Push changes</b>"""
-            """<p>This pushes changes from the local repository to a """
-            """remote repository.</p>"""
-        ))
+            self.tr("Push changes"),
+            0,
+            0,
+            self,
+            "mercurial_push",
+        )
+        self.hgPushAct.setStatusTip(self.tr("Push changes to a remote repository"))
+        self.hgPushAct.setWhatsThis(
+            self.tr(
+                """<b>Push changes</b>"""
+                """<p>This pushes changes from the local repository to a """
+                """remote repository.</p>"""
+            )
+        )
         self.hgPushAct.triggered.connect(self.__hgPush)
         self.actions.append(self.hgPushAct)
-        
+
         self.hgPushForcedAct = EricAction(
-            self.tr('Push changes (force)'),
+            self.tr("Push changes (force)"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Push changes (force)'),
-            0, 0, self, 'mercurial_push_forced')
-        self.hgPushForcedAct.setStatusTip(self.tr(
-            'Push changes to a remote repository with force option'
-        ))
-        self.hgPushForcedAct.setWhatsThis(self.tr(
-            """<b>Push changes (force)</b>"""
-            """<p>This pushes changes from the local repository to a """
-            """remote repository using the 'force' option.</p>"""
-        ))
+            self.tr("Push changes (force)"),
+            0,
+            0,
+            self,
+            "mercurial_push_forced",
+        )
+        self.hgPushForcedAct.setStatusTip(
+            self.tr("Push changes to a remote repository with force option")
+        )
+        self.hgPushForcedAct.setWhatsThis(
+            self.tr(
+                """<b>Push changes (force)</b>"""
+                """<p>This pushes changes from the local repository to a """
+                """remote repository using the 'force' option.</p>"""
+            )
+        )
         self.hgPushForcedAct.triggered.connect(self.__hgPushForced)
         self.actions.append(self.hgPushForcedAct)
-        
+
         self.vcsExportAct = EricAction(
-            self.tr('Export from repository'),
+            self.tr("Export from repository"),
             UI.PixmapCache.getIcon("vcsExport"),
-            self.tr('&Export from repository...'),
-            0, 0, self, 'mercurial_export_repo')
-        self.vcsExportAct.setStatusTip(self.tr(
-            'Export a project from the repository'
-        ))
-        self.vcsExportAct.setWhatsThis(self.tr(
-            """<b>Export from repository</b>"""
-            """<p>This exports a project from the repository.</p>"""
-        ))
+            self.tr("&Export from repository..."),
+            0,
+            0,
+            self,
+            "mercurial_export_repo",
+        )
+        self.vcsExportAct.setStatusTip(self.tr("Export a project from the repository"))
+        self.vcsExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export from repository</b>"""
+                """<p>This exports a project from the repository.</p>"""
+            )
+        )
         self.vcsExportAct.triggered.connect(self._vcsExport)
         self.actions.append(self.vcsExportAct)
-        
+
         self.hgLogBrowserAct = EricAction(
-            self.tr('Show log browser'),
+            self.tr("Show log browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'),
-            0, 0, self, 'mercurial_log_browser')
-        self.hgLogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the log of the local project'
-        ))
-        self.hgLogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show log browser</b>"""
-            """<p>This shows a dialog to browse the log of the local"""
-            """ project. A limited number of entries is shown first."""
-            """ More can be retrieved later on.</p>"""
-        ))
+            self.tr("Show log browser"),
+            0,
+            0,
+            self,
+            "mercurial_log_browser",
+        )
+        self.hgLogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the log of the local project")
+        )
+        self.hgLogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show log browser</b>"""
+                """<p>This shows a dialog to browse the log of the local"""
+                """ project. A limited number of entries is shown first."""
+                """ More can be retrieved later on.</p>"""
+            )
+        )
         self.hgLogBrowserAct.triggered.connect(self._vcsLogBrowser)
         self.actions.append(self.hgLogBrowserAct)
-        
+
         self.vcsDiffAct = EricAction(
-            self.tr('Show differences'),
+            self.tr("Show differences"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show &difference'),
-            0, 0, self, 'mercurial_diff')
-        self.vcsDiffAct.setStatusTip(self.tr(
-            'Show the difference of the local project to the repository'
-        ))
-        self.vcsDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences</b>"""
-            """<p>This shows differences of the local project to the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show &difference"),
+            0,
+            0,
+            self,
+            "mercurial_diff",
+        )
+        self.vcsDiffAct.setStatusTip(
+            self.tr("Show the difference of the local project to the repository")
+        )
+        self.vcsDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences</b>"""
+                """<p>This shows differences of the local project to the"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsDiffAct.triggered.connect(self._vcsDiff)
         self.actions.append(self.vcsDiffAct)
-        
+
         self.hgExtDiffAct = EricAction(
-            self.tr('Show differences (extended)'),
+            self.tr("Show differences (extended)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            0, 0, self, 'mercurial_extendeddiff')
-        self.hgExtDiffAct.setStatusTip(self.tr(
-            'Show the difference of revisions of the project to the repository'
-        ))
-        self.hgExtDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (extended)</b>"""
-            """<p>This shows differences of selectable revisions of the"""
-            """ project.</p>"""
-        ))
+            self.tr("Show differences (extended)"),
+            0,
+            0,
+            self,
+            "mercurial_extendeddiff",
+        )
+        self.hgExtDiffAct.setStatusTip(
+            self.tr("Show the difference of revisions of the project to the repository")
+        )
+        self.hgExtDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (extended)</b>"""
+                """<p>This shows differences of selectable revisions of the"""
+                """ project.</p>"""
+            )
+        )
         self.hgExtDiffAct.triggered.connect(self.__hgExtendedDiff)
         self.actions.append(self.hgExtDiffAct)
-        
+
         self.vcsStatusAct = EricAction(
-            self.tr('Show status'),
+            self.tr("Show status"),
             UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show &status...'),
-            0, 0, self, 'mercurial_status')
-        self.vcsStatusAct.setStatusTip(self.tr(
-            'Show the status of the local project'
-        ))
-        self.vcsStatusAct.setWhatsThis(self.tr(
-            """<b>Show status</b>"""
-            """<p>This shows the status of the local project.</p>"""
-        ))
+            self.tr("Show &status..."),
+            0,
+            0,
+            self,
+            "mercurial_status",
+        )
+        self.vcsStatusAct.setStatusTip(self.tr("Show the status of the local project"))
+        self.vcsStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show status</b>"""
+                """<p>This shows the status of the local project.</p>"""
+            )
+        )
         self.vcsStatusAct.triggered.connect(self._vcsStatus)
         self.actions.append(self.vcsStatusAct)
-        
+
         self.hgSummaryAct = EricAction(
-            self.tr('Show Summary'),
+            self.tr("Show Summary"),
             UI.PixmapCache.getIcon("vcsSummary"),
-            self.tr('Show summary...'),
-            0, 0, self, 'mercurial_summary')
-        self.hgSummaryAct.setStatusTip(self.tr(
-            'Show summary information of the working directory status'
-        ))
-        self.hgSummaryAct.setWhatsThis(self.tr(
-            """<b>Show summary</b>"""
-            """<p>This shows some summary information of the working"""
-            """ directory status.</p>"""
-        ))
+            self.tr("Show summary..."),
+            0,
+            0,
+            self,
+            "mercurial_summary",
+        )
+        self.hgSummaryAct.setStatusTip(
+            self.tr("Show summary information of the working directory status")
+        )
+        self.hgSummaryAct.setWhatsThis(
+            self.tr(
+                """<b>Show summary</b>"""
+                """<p>This shows some summary information of the working"""
+                """ directory status.</p>"""
+            )
+        )
         self.hgSummaryAct.triggered.connect(self.__hgSummary)
         self.actions.append(self.hgSummaryAct)
-        
+
         self.hgHeadsAct = EricAction(
-            self.tr('Show heads'),
-            self.tr('Show heads'),
-            0, 0, self, 'mercurial_heads')
-        self.hgHeadsAct.setStatusTip(self.tr(
-            'Show the heads of the repository'
-        ))
-        self.hgHeadsAct.setWhatsThis(self.tr(
-            """<b>Show heads</b>"""
-            """<p>This shows the heads of the repository.</p>"""
-        ))
+            self.tr("Show heads"), self.tr("Show heads"), 0, 0, self, "mercurial_heads"
+        )
+        self.hgHeadsAct.setStatusTip(self.tr("Show the heads of the repository"))
+        self.hgHeadsAct.setWhatsThis(
+            self.tr(
+                """<b>Show heads</b>"""
+                """<p>This shows the heads of the repository.</p>"""
+            )
+        )
         self.hgHeadsAct.triggered.connect(self.__hgHeads)
         self.actions.append(self.hgHeadsAct)
-        
+
         self.hgParentsAct = EricAction(
-            self.tr('Show parents'),
-            self.tr('Show parents'),
-            0, 0, self, 'mercurial_parents')
-        self.hgParentsAct.setStatusTip(self.tr(
-            'Show the parents of the repository'
-        ))
-        self.hgParentsAct.setWhatsThis(self.tr(
-            """<b>Show parents</b>"""
-            """<p>This shows the parents of the repository.</p>"""
-        ))
+            self.tr("Show parents"),
+            self.tr("Show parents"),
+            0,
+            0,
+            self,
+            "mercurial_parents",
+        )
+        self.hgParentsAct.setStatusTip(self.tr("Show the parents of the repository"))
+        self.hgParentsAct.setWhatsThis(
+            self.tr(
+                """<b>Show parents</b>"""
+                """<p>This shows the parents of the repository.</p>"""
+            )
+        )
         self.hgParentsAct.triggered.connect(self.__hgParents)
         self.actions.append(self.hgParentsAct)
-        
+
         self.hgTipAct = EricAction(
-            self.tr('Show tip'),
-            self.tr('Show tip'),
-            0, 0, self, 'mercurial_tip')
-        self.hgTipAct.setStatusTip(self.tr(
-            'Show the tip of the repository'
-        ))
-        self.hgTipAct.setWhatsThis(self.tr(
-            """<b>Show tip</b>"""
-            """<p>This shows the tip of the repository.</p>"""
-        ))
+            self.tr("Show tip"), self.tr("Show tip"), 0, 0, self, "mercurial_tip"
+        )
+        self.hgTipAct.setStatusTip(self.tr("Show the tip of the repository"))
+        self.hgTipAct.setWhatsThis(
+            self.tr(
+                """<b>Show tip</b>""" """<p>This shows the tip of the repository.</p>"""
+            )
+        )
         self.hgTipAct.triggered.connect(self.__hgTip)
         self.actions.append(self.hgTipAct)
-        
+
         self.vcsRevertAct = EricAction(
-            self.tr('Revert changes'),
+            self.tr("Revert changes"),
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Re&vert changes'),
-            0, 0, self, 'mercurial_revert')
-        self.vcsRevertAct.setStatusTip(self.tr(
-            'Revert all changes made to the local project'
-        ))
-        self.vcsRevertAct.setWhatsThis(self.tr(
-            """<b>Revert changes</b>"""
-            """<p>This reverts all changes made to the local project.</p>"""
-        ))
+            self.tr("Re&vert changes"),
+            0,
+            0,
+            self,
+            "mercurial_revert",
+        )
+        self.vcsRevertAct.setStatusTip(
+            self.tr("Revert all changes made to the local project")
+        )
+        self.vcsRevertAct.setWhatsThis(
+            self.tr(
+                """<b>Revert changes</b>"""
+                """<p>This reverts all changes made to the local project.</p>"""
+            )
+        )
         self.vcsRevertAct.triggered.connect(self.__hgRevert)
         self.actions.append(self.vcsRevertAct)
-        
+
         self.vcsMergeAct = EricAction(
-            self.tr('Merge'),
+            self.tr("Merge"),
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Mer&ge changes...'),
-            0, 0, self, 'mercurial_merge')
-        self.vcsMergeAct.setStatusTip(self.tr(
-            'Merge changes of a revision into the local project'
-        ))
-        self.vcsMergeAct.setWhatsThis(self.tr(
-            """<b>Merge</b>"""
-            """<p>This merges changes of a revision into the local"""
-            """ project.</p>"""
-        ))
+            self.tr("Mer&ge changes..."),
+            0,
+            0,
+            self,
+            "mercurial_merge",
+        )
+        self.vcsMergeAct.setStatusTip(
+            self.tr("Merge changes of a revision into the local project")
+        )
+        self.vcsMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Merge</b>"""
+                """<p>This merges changes of a revision into the local"""
+                """ project.</p>"""
+            )
+        )
         self.vcsMergeAct.triggered.connect(self._vcsMerge)
         self.actions.append(self.vcsMergeAct)
-        
+
         self.hgCommitMergeAct = EricAction(
-            self.tr('Commit Merge'),
-            self.tr('Commit Merge'),
-            0, 0, self, 'mercurial_commit_merge')
-        self.hgCommitMergeAct.setStatusTip(self.tr(
-            'Commit all the merged changes.'
-        ))
-        self.hgCommitMergeAct.setWhatsThis(self.tr(
-            """<b>Commit a merge</b>"""
-            """<p>This commits a merge working directory</p>"""
-        ))
+            self.tr("Commit Merge"),
+            self.tr("Commit Merge"),
+            0,
+            0,
+            self,
+            "mercurial_commit_merge",
+        )
+        self.hgCommitMergeAct.setStatusTip(self.tr("Commit all the merged changes."))
+        self.hgCommitMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Commit a merge</b>"""
+                """<p>This commits a merge working directory</p>"""
+            )
+        )
         self.hgCommitMergeAct.triggered.connect(self.__hgCommitMerge)
         self.actions.append(self.hgCommitMergeAct)
-        
+
         self.hgAbortMergeAct = EricAction(
-            self.tr('Abort Merge'),
-            self.tr('Abort Merge'),
-            0, 0, self, 'mercurial_cancel_merge')
-        self.hgAbortMergeAct.setStatusTip(self.tr(
-            'Abort an uncommitted merge and lose all changes'
-        ))
-        self.hgAbortMergeAct.setWhatsThis(self.tr(
-            """<b>Abort uncommitted merge</b>"""
-            """<p>This aborts an uncommitted merge causing all changes"""
-            """ to be lost.</p>"""
-        ))
+            self.tr("Abort Merge"),
+            self.tr("Abort Merge"),
+            0,
+            0,
+            self,
+            "mercurial_cancel_merge",
+        )
+        self.hgAbortMergeAct.setStatusTip(
+            self.tr("Abort an uncommitted merge and lose all changes")
+        )
+        self.hgAbortMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Abort uncommitted merge</b>"""
+                """<p>This aborts an uncommitted merge causing all changes"""
+                """ to be lost.</p>"""
+            )
+        )
         self.hgAbortMergeAct.triggered.connect(self.__hgAbortMerge)
         self.actions.append(self.hgAbortMergeAct)
-        
+
         self.hgReMergeAct = EricAction(
-            self.tr('Re-Merge'),
+            self.tr("Re-Merge"),
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Re-Merge'),
-            0, 0, self, 'mercurial_remerge')
-        self.hgReMergeAct.setStatusTip(self.tr(
-            'Re-Merge all conflicting, unresolved files of the project'
-        ))
-        self.hgReMergeAct.setWhatsThis(self.tr(
-            """<b>Re-Merge</b>"""
-            """<p>This re-merges all conflicting, unresolved files of the"""
-            """ project discarding any previous merge attempt.</p>"""
-        ))
+            self.tr("Re-Merge"),
+            0,
+            0,
+            self,
+            "mercurial_remerge",
+        )
+        self.hgReMergeAct.setStatusTip(
+            self.tr("Re-Merge all conflicting, unresolved files of the project")
+        )
+        self.hgReMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Re-Merge</b>"""
+                """<p>This re-merges all conflicting, unresolved files of the"""
+                """ project discarding any previous merge attempt.</p>"""
+            )
+        )
         self.hgReMergeAct.triggered.connect(self.__hgReMerge)
         self.actions.append(self.hgReMergeAct)
-        
+
         self.hgShowConflictsAct = EricAction(
-            self.tr('Show conflicts'),
-            self.tr('Show conflicts...'),
-            0, 0, self, 'mercurial_show_conflicts')
-        self.hgShowConflictsAct.setStatusTip(self.tr(
-            'Show a dialog listing all files with conflicts'
-        ))
-        self.hgShowConflictsAct.setWhatsThis(self.tr(
-            """<b>Show conflicts</b>"""
-            """<p>This shows a dialog listing all files which had or still"""
-            """ have conflicts.</p>"""
-        ))
+            self.tr("Show conflicts"),
+            self.tr("Show conflicts..."),
+            0,
+            0,
+            self,
+            "mercurial_show_conflicts",
+        )
+        self.hgShowConflictsAct.setStatusTip(
+            self.tr("Show a dialog listing all files with conflicts")
+        )
+        self.hgShowConflictsAct.setWhatsThis(
+            self.tr(
+                """<b>Show conflicts</b>"""
+                """<p>This shows a dialog listing all files which had or still"""
+                """ have conflicts.</p>"""
+            )
+        )
         self.hgShowConflictsAct.triggered.connect(self.__hgShowConflicts)
         self.actions.append(self.hgShowConflictsAct)
-        
+
         self.vcsResolveAct = EricAction(
-            self.tr('Conflicts resolved'),
-            self.tr('Con&flicts resolved'),
-            0, 0, self, 'mercurial_resolve')
-        self.vcsResolveAct.setStatusTip(self.tr(
-            'Mark all conflicts of the local project as resolved'
-        ))
-        self.vcsResolveAct.setWhatsThis(self.tr(
-            """<b>Conflicts resolved</b>"""
-            """<p>This marks all conflicts of the local project as"""
-            """ resolved.</p>"""
-        ))
+            self.tr("Conflicts resolved"),
+            self.tr("Con&flicts resolved"),
+            0,
+            0,
+            self,
+            "mercurial_resolve",
+        )
+        self.vcsResolveAct.setStatusTip(
+            self.tr("Mark all conflicts of the local project as resolved")
+        )
+        self.vcsResolveAct.setWhatsThis(
+            self.tr(
+                """<b>Conflicts resolved</b>"""
+                """<p>This marks all conflicts of the local project as"""
+                """ resolved.</p>"""
+            )
+        )
         self.vcsResolveAct.triggered.connect(self.__hgResolved)
         self.actions.append(self.vcsResolveAct)
-        
+
         self.hgUnresolveAct = EricAction(
-            self.tr('Conflicts unresolved'),
-            self.tr('Conflicts unresolved'),
-            0, 0, self, 'mercurial_unresolve')
-        self.hgUnresolveAct.setStatusTip(self.tr(
-            'Mark all conflicts of the local project as unresolved'
-        ))
-        self.hgUnresolveAct.setWhatsThis(self.tr(
-            """<b>Conflicts unresolved</b>"""
-            """<p>This marks all conflicts of the local project as"""
-            """ unresolved.</p>"""
-        ))
+            self.tr("Conflicts unresolved"),
+            self.tr("Conflicts unresolved"),
+            0,
+            0,
+            self,
+            "mercurial_unresolve",
+        )
+        self.hgUnresolveAct.setStatusTip(
+            self.tr("Mark all conflicts of the local project as unresolved")
+        )
+        self.hgUnresolveAct.setWhatsThis(
+            self.tr(
+                """<b>Conflicts unresolved</b>"""
+                """<p>This marks all conflicts of the local project as"""
+                """ unresolved.</p>"""
+            )
+        )
         self.hgUnresolveAct.triggered.connect(self.__hgUnresolved)
         self.actions.append(self.hgUnresolveAct)
-        
+
         self.vcsTagAct = EricAction(
-            self.tr('Tag in repository'),
+            self.tr("Tag in repository"),
             UI.PixmapCache.getIcon("vcsTag"),
-            self.tr('&Tag in repository...'),
-            0, 0, self, 'mercurial_tag')
-        self.vcsTagAct.setStatusTip(self.tr(
-            'Tag the local project in the repository'
-        ))
-        self.vcsTagAct.setWhatsThis(self.tr(
-            """<b>Tag in repository</b>"""
-            """<p>This tags the local project in the repository.</p>"""
-        ))
+            self.tr("&Tag in repository..."),
+            0,
+            0,
+            self,
+            "mercurial_tag",
+        )
+        self.vcsTagAct.setStatusTip(self.tr("Tag the local project in the repository"))
+        self.vcsTagAct.setWhatsThis(
+            self.tr(
+                """<b>Tag in repository</b>"""
+                """<p>This tags the local project in the repository.</p>"""
+            )
+        )
         self.vcsTagAct.triggered.connect(self._vcsTag)
         self.actions.append(self.vcsTagAct)
-        
+
         self.hgTagListAct = EricAction(
-            self.tr('List tags'),
-            self.tr('List tags...'),
-            0, 0, self, 'mercurial_list_tags')
-        self.hgTagListAct.setStatusTip(self.tr(
-            'List tags of the project'
-        ))
-        self.hgTagListAct.setWhatsThis(self.tr(
-            """<b>List tags</b>"""
-            """<p>This lists the tags of the project.</p>"""
-        ))
+            self.tr("List tags"),
+            self.tr("List tags..."),
+            0,
+            0,
+            self,
+            "mercurial_list_tags",
+        )
+        self.hgTagListAct.setStatusTip(self.tr("List tags of the project"))
+        self.hgTagListAct.setWhatsThis(
+            self.tr(
+                """<b>List tags</b>""" """<p>This lists the tags of the project.</p>"""
+            )
+        )
         self.hgTagListAct.triggered.connect(self.__hgTagList)
         self.actions.append(self.hgTagListAct)
-        
+
         self.hgBranchListAct = EricAction(
-            self.tr('List branches'),
-            self.tr('List branches...'),
-            0, 0, self, 'mercurial_list_branches')
-        self.hgBranchListAct.setStatusTip(self.tr(
-            'List branches of the project'
-        ))
-        self.hgBranchListAct.setWhatsThis(self.tr(
-            """<b>List branches</b>"""
-            """<p>This lists the branches of the project.</p>"""
-        ))
+            self.tr("List branches"),
+            self.tr("List branches..."),
+            0,
+            0,
+            self,
+            "mercurial_list_branches",
+        )
+        self.hgBranchListAct.setStatusTip(self.tr("List branches of the project"))
+        self.hgBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List branches</b>"""
+                """<p>This lists the branches of the project.</p>"""
+            )
+        )
         self.hgBranchListAct.triggered.connect(self.__hgBranchList)
         self.actions.append(self.hgBranchListAct)
-        
+
         self.hgBranchAct = EricAction(
-            self.tr('Create branch'),
+            self.tr("Create branch"),
             UI.PixmapCache.getIcon("vcsBranch"),
-            self.tr('Create &branch...'),
-            0, 0, self, 'mercurial_branch')
-        self.hgBranchAct.setStatusTip(self.tr(
-            'Create a new branch for the local project in the repository'
-        ))
-        self.hgBranchAct.setWhatsThis(self.tr(
-            """<b>Create branch</b>"""
-            """<p>This creates a new branch for the local project """
-            """in the repository.</p>"""
-        ))
+            self.tr("Create &branch..."),
+            0,
+            0,
+            self,
+            "mercurial_branch",
+        )
+        self.hgBranchAct.setStatusTip(
+            self.tr("Create a new branch for the local project in the repository")
+        )
+        self.hgBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Create branch</b>"""
+                """<p>This creates a new branch for the local project """
+                """in the repository.</p>"""
+            )
+        )
         self.hgBranchAct.triggered.connect(self.__hgBranch)
         self.actions.append(self.hgBranchAct)
-        
+
         self.hgPushBranchAct = EricAction(
-            self.tr('Push new branch'),
+            self.tr("Push new branch"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Push new branch'),
-            0, 0, self, 'mercurial_push_branch')
-        self.hgPushBranchAct.setStatusTip(self.tr(
-            'Push the current branch of the local project as a new named'
-            ' branch'
-        ))
-        self.hgPushBranchAct.setWhatsThis(self.tr(
-            """<b>Push new branch</b>"""
-            """<p>This pushes the current branch of the local project"""
-            """ as a new named branch.</p>"""
-        ))
+            self.tr("Push new branch"),
+            0,
+            0,
+            self,
+            "mercurial_push_branch",
+        )
+        self.hgPushBranchAct.setStatusTip(
+            self.tr(
+                "Push the current branch of the local project as a new named" " branch"
+            )
+        )
+        self.hgPushBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Push new branch</b>"""
+                """<p>This pushes the current branch of the local project"""
+                """ as a new named branch.</p>"""
+            )
+        )
         self.hgPushBranchAct.triggered.connect(self.__hgPushNewBranch)
         self.actions.append(self.hgPushBranchAct)
-        
+
         self.hgCloseBranchAct = EricAction(
-            self.tr('Close branch'),
+            self.tr("Close branch"),
             UI.PixmapCache.getIcon("closehead"),
-            self.tr('Close branch'),
-            0, 0, self, 'mercurial_close_branch')
-        self.hgCloseBranchAct.setStatusTip(self.tr(
-            'Close the current branch of the local project'
-        ))
-        self.hgCloseBranchAct.setWhatsThis(self.tr(
-            """<b>Close branch</b>"""
-            """<p>This closes the current branch of the local project.</p>"""
-        ))
+            self.tr("Close branch"),
+            0,
+            0,
+            self,
+            "mercurial_close_branch",
+        )
+        self.hgCloseBranchAct.setStatusTip(
+            self.tr("Close the current branch of the local project")
+        )
+        self.hgCloseBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Close branch</b>"""
+                """<p>This closes the current branch of the local project.</p>"""
+            )
+        )
         self.hgCloseBranchAct.triggered.connect(self.__hgCloseBranch)
         self.actions.append(self.hgCloseBranchAct)
-        
+
         self.hgShowBranchAct = EricAction(
-            self.tr('Show current branch'),
-            self.tr('Show current branch'),
-            0, 0, self, 'mercurial_show_branch')
-        self.hgShowBranchAct.setStatusTip(self.tr(
-            'Show the current branch of the project'
-        ))
-        self.hgShowBranchAct.setWhatsThis(self.tr(
-            """<b>Show current branch</b>"""
-            """<p>This shows the current branch of the project.</p>"""
-        ))
+            self.tr("Show current branch"),
+            self.tr("Show current branch"),
+            0,
+            0,
+            self,
+            "mercurial_show_branch",
+        )
+        self.hgShowBranchAct.setStatusTip(
+            self.tr("Show the current branch of the project")
+        )
+        self.hgShowBranchAct.setWhatsThis(
+            self.tr(
+                """<b>Show current branch</b>"""
+                """<p>This shows the current branch of the project.</p>"""
+            )
+        )
         self.hgShowBranchAct.triggered.connect(self.__hgShowBranch)
         self.actions.append(self.hgShowBranchAct)
-        
+
         self.vcsSwitchAct = EricAction(
-            self.tr('Switch'),
+            self.tr("Switch"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('S&witch...'),
-            0, 0, self, 'mercurial_switch')
-        self.vcsSwitchAct.setStatusTip(self.tr(
-            'Switch the working directory to another revision'
-        ))
-        self.vcsSwitchAct.setWhatsThis(self.tr(
-            """<b>Switch</b>"""
-            """<p>This switches the working directory to another"""
-            """ revision.</p>"""
-        ))
+            self.tr("S&witch..."),
+            0,
+            0,
+            self,
+            "mercurial_switch",
+        )
+        self.vcsSwitchAct.setStatusTip(
+            self.tr("Switch the working directory to another revision")
+        )
+        self.vcsSwitchAct.setWhatsThis(
+            self.tr(
+                """<b>Switch</b>"""
+                """<p>This switches the working directory to another"""
+                """ revision.</p>"""
+            )
+        )
         self.vcsSwitchAct.triggered.connect(self._vcsSwitch)
         self.actions.append(self.vcsSwitchAct)
-        
+
         self.vcsCleanupAct = EricAction(
-            self.tr('Cleanup'),
-            self.tr('Cleanu&p'),
-            0, 0, self, 'mercurial_cleanup')
-        self.vcsCleanupAct.setStatusTip(self.tr(
-            'Cleanup the local project'
-        ))
-        self.vcsCleanupAct.setWhatsThis(self.tr(
-            """<b>Cleanup</b>"""
-            """<p>This performs a cleanup of the local project.</p>"""
-        ))
+            self.tr("Cleanup"), self.tr("Cleanu&p"), 0, 0, self, "mercurial_cleanup"
+        )
+        self.vcsCleanupAct.setStatusTip(self.tr("Cleanup the local project"))
+        self.vcsCleanupAct.setWhatsThis(
+            self.tr(
+                """<b>Cleanup</b>"""
+                """<p>This performs a cleanup of the local project.</p>"""
+            )
+        )
         self.vcsCleanupAct.triggered.connect(self._vcsCleanup)
         self.actions.append(self.vcsCleanupAct)
-        
+
         self.vcsCommandAct = EricAction(
-            self.tr('Execute command'),
-            self.tr('E&xecute command...'),
-            0, 0, self, 'mercurial_command')
-        self.vcsCommandAct.setStatusTip(self.tr(
-            'Execute an arbitrary Mercurial command'
-        ))
-        self.vcsCommandAct.setWhatsThis(self.tr(
-            """<b>Execute command</b>"""
-            """<p>This opens a dialog to enter an arbitrary Mercurial"""
-            """ command.</p>"""
-        ))
+            self.tr("Execute command"),
+            self.tr("E&xecute command..."),
+            0,
+            0,
+            self,
+            "mercurial_command",
+        )
+        self.vcsCommandAct.setStatusTip(
+            self.tr("Execute an arbitrary Mercurial command")
+        )
+        self.vcsCommandAct.setWhatsThis(
+            self.tr(
+                """<b>Execute command</b>"""
+                """<p>This opens a dialog to enter an arbitrary Mercurial"""
+                """ command.</p>"""
+            )
+        )
         self.vcsCommandAct.triggered.connect(self._vcsCommand)
         self.actions.append(self.vcsCommandAct)
-        
+
         self.hgConfigAct = EricAction(
-            self.tr('Configure'),
-            self.tr('Configure...'),
-            0, 0, self, 'mercurial_configure')
-        self.hgConfigAct.setStatusTip(self.tr(
-            'Show the configuration dialog with the Mercurial page selected'
-        ))
-        self.hgConfigAct.setWhatsThis(self.tr(
-            """<b>Configure</b>"""
-            """<p>Show the configuration dialog with the Mercurial page"""
-            """ selected.</p>"""
-        ))
+            self.tr("Configure"),
+            self.tr("Configure..."),
+            0,
+            0,
+            self,
+            "mercurial_configure",
+        )
+        self.hgConfigAct.setStatusTip(
+            self.tr("Show the configuration dialog with the Mercurial page selected")
+        )
+        self.hgConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure</b>"""
+                """<p>Show the configuration dialog with the Mercurial page"""
+                """ selected.</p>"""
+            )
+        )
         self.hgConfigAct.triggered.connect(self.__hgConfigure)
         self.actions.append(self.hgConfigAct)
-        
+
         self.hgEditUserConfigAct = EricAction(
-            self.tr('Edit user configuration'),
-            self.tr('Edit user configuration...'),
-            0, 0, self, 'mercurial_user_configure')
-        self.hgEditUserConfigAct.setStatusTip(self.tr(
-            'Show an editor to edit the user configuration file'
-        ))
-        self.hgEditUserConfigAct.setWhatsThis(self.tr(
-            """<b>Edit user configuration</b>"""
-            """<p>Show an editor to edit the user configuration file.</p>"""
-        ))
+            self.tr("Edit user configuration"),
+            self.tr("Edit user configuration..."),
+            0,
+            0,
+            self,
+            "mercurial_user_configure",
+        )
+        self.hgEditUserConfigAct.setStatusTip(
+            self.tr("Show an editor to edit the user configuration file")
+        )
+        self.hgEditUserConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Edit user configuration</b>"""
+                """<p>Show an editor to edit the user configuration file.</p>"""
+            )
+        )
         self.hgEditUserConfigAct.triggered.connect(self.__hgEditUserConfig)
         self.actions.append(self.hgEditUserConfigAct)
-        
+
         self.hgRepoConfigAct = EricAction(
-            self.tr('Edit repository configuration'),
-            self.tr('Edit repository configuration...'),
-            0, 0, self, 'mercurial_repo_configure')
-        self.hgRepoConfigAct.setStatusTip(self.tr(
-            'Show an editor to edit the repository configuration file'
-        ))
-        self.hgRepoConfigAct.setWhatsThis(self.tr(
-            """<b>Edit repository configuration</b>"""
-            """<p>Show an editor to edit the repository configuration"""
-            """ file.</p>"""
-        ))
+            self.tr("Edit repository configuration"),
+            self.tr("Edit repository configuration..."),
+            0,
+            0,
+            self,
+            "mercurial_repo_configure",
+        )
+        self.hgRepoConfigAct.setStatusTip(
+            self.tr("Show an editor to edit the repository configuration file")
+        )
+        self.hgRepoConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Edit repository configuration</b>"""
+                """<p>Show an editor to edit the repository configuration"""
+                """ file.</p>"""
+            )
+        )
         self.hgRepoConfigAct.triggered.connect(self.__hgEditRepoConfig)
         self.actions.append(self.hgRepoConfigAct)
-        
+
         self.hgShowConfigAct = EricAction(
-            self.tr('Show combined configuration settings'),
-            self.tr('Show combined configuration settings...'),
-            0, 0, self, 'mercurial_show_config')
-        self.hgShowConfigAct.setStatusTip(self.tr(
-            'Show the combined configuration settings from all configuration'
-            ' files'
-        ))
-        self.hgShowConfigAct.setWhatsThis(self.tr(
-            """<b>Show combined configuration settings</b>"""
-            """<p>This shows the combined configuration settings"""
-            """ from all configuration files.</p>"""
-        ))
+            self.tr("Show combined configuration settings"),
+            self.tr("Show combined configuration settings..."),
+            0,
+            0,
+            self,
+            "mercurial_show_config",
+        )
+        self.hgShowConfigAct.setStatusTip(
+            self.tr(
+                "Show the combined configuration settings from all configuration"
+                " files"
+            )
+        )
+        self.hgShowConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Show combined configuration settings</b>"""
+                """<p>This shows the combined configuration settings"""
+                """ from all configuration files.</p>"""
+            )
+        )
         self.hgShowConfigAct.triggered.connect(self.__hgShowConfig)
         self.actions.append(self.hgShowConfigAct)
-        
+
         self.hgShowPathsAct = EricAction(
-            self.tr('Show paths'),
-            self.tr('Show paths...'),
-            0, 0, self, 'mercurial_show_paths')
-        self.hgShowPathsAct.setStatusTip(self.tr(
-            'Show the aliases for remote repositories'
-        ))
-        self.hgShowPathsAct.setWhatsThis(self.tr(
-            """<b>Show paths</b>"""
-            """<p>This shows the aliases for remote repositories.</p>"""
-        ))
+            self.tr("Show paths"),
+            self.tr("Show paths..."),
+            0,
+            0,
+            self,
+            "mercurial_show_paths",
+        )
+        self.hgShowPathsAct.setStatusTip(
+            self.tr("Show the aliases for remote repositories")
+        )
+        self.hgShowPathsAct.setWhatsThis(
+            self.tr(
+                """<b>Show paths</b>"""
+                """<p>This shows the aliases for remote repositories.</p>"""
+            )
+        )
         self.hgShowPathsAct.triggered.connect(self.__hgShowPaths)
         self.actions.append(self.hgShowPathsAct)
-        
+
         self.hgVerifyAct = EricAction(
-            self.tr('Verify repository'),
-            self.tr('Verify repository...'),
-            0, 0, self, 'mercurial_verify')
-        self.hgVerifyAct.setStatusTip(self.tr(
-            'Verify the integrity of the repository'
-        ))
-        self.hgVerifyAct.setWhatsThis(self.tr(
-            """<b>Verify repository</b>"""
-            """<p>This verifies the integrity of the repository.</p>"""
-        ))
+            self.tr("Verify repository"),
+            self.tr("Verify repository..."),
+            0,
+            0,
+            self,
+            "mercurial_verify",
+        )
+        self.hgVerifyAct.setStatusTip(self.tr("Verify the integrity of the repository"))
+        self.hgVerifyAct.setWhatsThis(
+            self.tr(
+                """<b>Verify repository</b>"""
+                """<p>This verifies the integrity of the repository.</p>"""
+            )
+        )
         self.hgVerifyAct.triggered.connect(self.__hgVerify)
         self.actions.append(self.hgVerifyAct)
-        
+
         self.hgRecoverAct = EricAction(
-            self.tr('Recover'),
-            self.tr('Recover...'),
-            0, 0, self, 'mercurial_recover')
-        self.hgRecoverAct.setStatusTip(self.tr(
-            'Recover from an interrupted transaction'
-        ))
-        self.hgRecoverAct.setWhatsThis(self.tr(
-            """<b>Recover</b>"""
-            """<p>This recovers from an interrupted transaction.</p>"""
-        ))
+            self.tr("Recover"), self.tr("Recover..."), 0, 0, self, "mercurial_recover"
+        )
+        self.hgRecoverAct.setStatusTip(
+            self.tr("Recover from an interrupted transaction")
+        )
+        self.hgRecoverAct.setWhatsThis(
+            self.tr(
+                """<b>Recover</b>"""
+                """<p>This recovers from an interrupted transaction.</p>"""
+            )
+        )
         self.hgRecoverAct.triggered.connect(self.__hgRecover)
         self.actions.append(self.hgRecoverAct)
-        
+
         self.hgIdentifyAct = EricAction(
-            self.tr('Identify'),
-            self.tr('Identify...'),
-            0, 0, self, 'mercurial_identify')
-        self.hgIdentifyAct.setStatusTip(self.tr(
-            'Identify the project directory'
-        ))
-        self.hgIdentifyAct.setWhatsThis(self.tr(
-            """<b>Identify</b>"""
-            """<p>This identifies the project directory.</p>"""
-        ))
+            self.tr("Identify"),
+            self.tr("Identify..."),
+            0,
+            0,
+            self,
+            "mercurial_identify",
+        )
+        self.hgIdentifyAct.setStatusTip(self.tr("Identify the project directory"))
+        self.hgIdentifyAct.setWhatsThis(
+            self.tr(
+                """<b>Identify</b>"""
+                """<p>This identifies the project directory.</p>"""
+            )
+        )
         self.hgIdentifyAct.triggered.connect(self.__hgIdentify)
         self.actions.append(self.hgIdentifyAct)
-        
+
         self.hgCreateIgnoreAct = EricAction(
-            self.tr('Create .hgignore'),
-            self.tr('Create .hgignore'),
-            0, 0, self, 'mercurial_create ignore')
-        self.hgCreateIgnoreAct.setStatusTip(self.tr(
-            'Create a .hgignore file with default values'
-        ))
-        self.hgCreateIgnoreAct.setWhatsThis(self.tr(
-            """<b>Create .hgignore</b>"""
-            """<p>This creates a .hgignore file with default values.</p>"""
-        ))
+            self.tr("Create .hgignore"),
+            self.tr("Create .hgignore"),
+            0,
+            0,
+            self,
+            "mercurial_create ignore",
+        )
+        self.hgCreateIgnoreAct.setStatusTip(
+            self.tr("Create a .hgignore file with default values")
+        )
+        self.hgCreateIgnoreAct.setWhatsThis(
+            self.tr(
+                """<b>Create .hgignore</b>"""
+                """<p>This creates a .hgignore file with default values.</p>"""
+            )
+        )
         self.hgCreateIgnoreAct.triggered.connect(self.__hgCreateIgnore)
         self.actions.append(self.hgCreateIgnoreAct)
-        
+
         self.hgBundleAct = EricAction(
-            self.tr('Create changegroup'),
+            self.tr("Create changegroup"),
             UI.PixmapCache.getIcon("vcsCreateChangegroup"),
-            self.tr('Create changegroup...'),
-            0, 0, self, 'mercurial_bundle')
-        self.hgBundleAct.setStatusTip(self.tr(
-            'Create changegroup file collecting changesets'
-        ))
-        self.hgBundleAct.setWhatsThis(self.tr(
-            """<b>Create changegroup</b>"""
-            """<p>This creates a changegroup file collecting selected"""
-            """ changesets (hg bundle).</p>"""
-        ))
+            self.tr("Create changegroup..."),
+            0,
+            0,
+            self,
+            "mercurial_bundle",
+        )
+        self.hgBundleAct.setStatusTip(
+            self.tr("Create changegroup file collecting changesets")
+        )
+        self.hgBundleAct.setWhatsThis(
+            self.tr(
+                """<b>Create changegroup</b>"""
+                """<p>This creates a changegroup file collecting selected"""
+                """ changesets (hg bundle).</p>"""
+            )
+        )
         self.hgBundleAct.triggered.connect(self.__hgBundle)
         self.actions.append(self.hgBundleAct)
-        
+
         self.hgPreviewBundleAct = EricAction(
-            self.tr('Preview changegroup'),
+            self.tr("Preview changegroup"),
             UI.PixmapCache.getIcon("vcsPreviewChangegroup"),
-            self.tr('Preview changegroup...'),
-            0, 0, self, 'mercurial_preview_bundle')
-        self.hgPreviewBundleAct.setStatusTip(self.tr(
-            'Preview a changegroup file containing a collection of changesets'
-        ))
-        self.hgPreviewBundleAct.setWhatsThis(self.tr(
-            """<b>Preview changegroup</b>"""
-            """<p>This previews a changegroup file containing a collection"""
-            """ of changesets.</p>"""
-        ))
+            self.tr("Preview changegroup..."),
+            0,
+            0,
+            self,
+            "mercurial_preview_bundle",
+        )
+        self.hgPreviewBundleAct.setStatusTip(
+            self.tr("Preview a changegroup file containing a collection of changesets")
+        )
+        self.hgPreviewBundleAct.setWhatsThis(
+            self.tr(
+                """<b>Preview changegroup</b>"""
+                """<p>This previews a changegroup file containing a collection"""
+                """ of changesets.</p>"""
+            )
+        )
         self.hgPreviewBundleAct.triggered.connect(self.__hgPreviewBundle)
         self.actions.append(self.hgPreviewBundleAct)
-        
+
         self.hgUnbundleAct = EricAction(
-            self.tr('Apply changegroups'),
+            self.tr("Apply changegroups"),
             UI.PixmapCache.getIcon("vcsApplyChangegroup"),
-            self.tr('Apply changegroups...'),
-            0, 0, self, 'mercurial_unbundle')
-        self.hgUnbundleAct.setStatusTip(self.tr(
-            'Apply one or several changegroup files'
-        ))
-        self.hgUnbundleAct.setWhatsThis(self.tr(
-            """<b>Apply changegroups</b>"""
-            """<p>This applies one or several changegroup files generated by"""
-            """ the 'Create changegroup' action (hg unbundle).</p>"""
-        ))
+            self.tr("Apply changegroups..."),
+            0,
+            0,
+            self,
+            "mercurial_unbundle",
+        )
+        self.hgUnbundleAct.setStatusTip(
+            self.tr("Apply one or several changegroup files")
+        )
+        self.hgUnbundleAct.setWhatsThis(
+            self.tr(
+                """<b>Apply changegroups</b>"""
+                """<p>This applies one or several changegroup files generated by"""
+                """ the 'Create changegroup' action (hg unbundle).</p>"""
+            )
+        )
         self.hgUnbundleAct.triggered.connect(self.__hgUnbundle)
         self.actions.append(self.hgUnbundleAct)
-        
+
         self.hgBisectGoodAct = EricAction(
             self.tr('Mark as "good"'),
             self.tr('Mark as "good"...'),
-            0, 0, self, 'mercurial_bisect_good')
-        self.hgBisectGoodAct.setStatusTip(self.tr(
-            'Mark a selectable changeset as good'
-        ))
-        self.hgBisectGoodAct.setWhatsThis(self.tr(
-            """<b>Mark as good</b>"""
-            """<p>This marks a selectable changeset as good.</p>"""
-        ))
+            0,
+            0,
+            self,
+            "mercurial_bisect_good",
+        )
+        self.hgBisectGoodAct.setStatusTip(
+            self.tr("Mark a selectable changeset as good")
+        )
+        self.hgBisectGoodAct.setWhatsThis(
+            self.tr(
+                """<b>Mark as good</b>"""
+                """<p>This marks a selectable changeset as good.</p>"""
+            )
+        )
         self.hgBisectGoodAct.triggered.connect(self.__hgBisectGood)
         self.actions.append(self.hgBisectGoodAct)
-        
+
         self.hgBisectBadAct = EricAction(
             self.tr('Mark as "bad"'),
             self.tr('Mark as "bad"...'),
-            0, 0, self, 'mercurial_bisect_bad')
-        self.hgBisectBadAct.setStatusTip(self.tr(
-            'Mark a selectable changeset as bad'
-        ))
-        self.hgBisectBadAct.setWhatsThis(self.tr(
-            """<b>Mark as bad</b>"""
-            """<p>This marks a selectable changeset as bad.</p>"""
-        ))
+            0,
+            0,
+            self,
+            "mercurial_bisect_bad",
+        )
+        self.hgBisectBadAct.setStatusTip(self.tr("Mark a selectable changeset as bad"))
+        self.hgBisectBadAct.setWhatsThis(
+            self.tr(
+                """<b>Mark as bad</b>"""
+                """<p>This marks a selectable changeset as bad.</p>"""
+            )
+        )
         self.hgBisectBadAct.triggered.connect(self.__hgBisectBad)
         self.actions.append(self.hgBisectBadAct)
-        
+
         self.hgBisectSkipAct = EricAction(
-            self.tr('Skip'),
-            self.tr('Skip...'),
-            0, 0, self, 'mercurial_bisect_skip')
-        self.hgBisectSkipAct.setStatusTip(self.tr(
-            'Skip a selectable changeset'
-        ))
-        self.hgBisectSkipAct.setWhatsThis(self.tr(
-            """<b>Skip</b>"""
-            """<p>This skips a selectable changeset.</p>"""
-        ))
+            self.tr("Skip"), self.tr("Skip..."), 0, 0, self, "mercurial_bisect_skip"
+        )
+        self.hgBisectSkipAct.setStatusTip(self.tr("Skip a selectable changeset"))
+        self.hgBisectSkipAct.setWhatsThis(
+            self.tr("""<b>Skip</b>""" """<p>This skips a selectable changeset.</p>""")
+        )
         self.hgBisectSkipAct.triggered.connect(self.__hgBisectSkip)
         self.actions.append(self.hgBisectSkipAct)
-        
+
         self.hgBisectResetAct = EricAction(
-            self.tr('Reset'),
-            self.tr('Reset'),
-            0, 0, self, 'mercurial_bisect_reset')
-        self.hgBisectResetAct.setStatusTip(self.tr(
-            'Reset the bisect search data'
-        ))
-        self.hgBisectResetAct.setWhatsThis(self.tr(
-            """<b>Reset</b>"""
-            """<p>This resets the bisect search data.</p>"""
-        ))
+            self.tr("Reset"), self.tr("Reset"), 0, 0, self, "mercurial_bisect_reset"
+        )
+        self.hgBisectResetAct.setStatusTip(self.tr("Reset the bisect search data"))
+        self.hgBisectResetAct.setWhatsThis(
+            self.tr("""<b>Reset</b>""" """<p>This resets the bisect search data.</p>""")
+        )
         self.hgBisectResetAct.triggered.connect(self.__hgBisectReset)
         self.actions.append(self.hgBisectResetAct)
-        
+
         self.hgBackoutAct = EricAction(
-            self.tr('Back out changeset'),
-            self.tr('Back out changeset'),
-            0, 0, self, 'mercurial_backout')
-        self.hgBackoutAct.setStatusTip(self.tr(
-            'Back out changes of an earlier changeset'
-        ))
-        self.hgBackoutAct.setWhatsThis(self.tr(
-            """<b>Back out changeset</b>"""
-            """<p>This backs out changes of an earlier changeset.</p>"""
-        ))
+            self.tr("Back out changeset"),
+            self.tr("Back out changeset"),
+            0,
+            0,
+            self,
+            "mercurial_backout",
+        )
+        self.hgBackoutAct.setStatusTip(
+            self.tr("Back out changes of an earlier changeset")
+        )
+        self.hgBackoutAct.setWhatsThis(
+            self.tr(
+                """<b>Back out changeset</b>"""
+                """<p>This backs out changes of an earlier changeset.</p>"""
+            )
+        )
         self.hgBackoutAct.triggered.connect(self.__hgBackout)
         self.actions.append(self.hgBackoutAct)
-        
+
         self.hgRollbackAct = EricAction(
-            self.tr('Rollback last transaction'),
-            self.tr('Rollback last transaction'),
-            0, 0, self, 'mercurial_rollback')
-        self.hgRollbackAct.setStatusTip(self.tr(
-            'Rollback the last transaction'
-        ))
-        self.hgRollbackAct.setWhatsThis(self.tr(
-            """<b>Rollback last transaction</b>"""
-            """<p>This performs a rollback of the last transaction."""
-            """ Transactions are used to encapsulate the effects of all"""
-            """ commands that create new changesets or propagate existing"""
-            """ changesets into a repository. For example, the following"""
-            """ commands are transactional, and their effects can be"""
-            """ rolled back:<ul>"""
-            """<li>commit</li>"""
-            """<li>import</li>"""
-            """<li>pull</li>"""
-            """<li>push (with this repository as the destination)</li>"""
-            """<li>unbundle</li>"""
-            """</ul>"""
-            """</p><p><strong>This command is dangerous. Please use with"""
-            """ care. </strong></p>"""
-        ))
+            self.tr("Rollback last transaction"),
+            self.tr("Rollback last transaction"),
+            0,
+            0,
+            self,
+            "mercurial_rollback",
+        )
+        self.hgRollbackAct.setStatusTip(self.tr("Rollback the last transaction"))
+        self.hgRollbackAct.setWhatsThis(
+            self.tr(
+                """<b>Rollback last transaction</b>"""
+                """<p>This performs a rollback of the last transaction."""
+                """ Transactions are used to encapsulate the effects of all"""
+                """ commands that create new changesets or propagate existing"""
+                """ changesets into a repository. For example, the following"""
+                """ commands are transactional, and their effects can be"""
+                """ rolled back:<ul>"""
+                """<li>commit</li>"""
+                """<li>import</li>"""
+                """<li>pull</li>"""
+                """<li>push (with this repository as the destination)</li>"""
+                """<li>unbundle</li>"""
+                """</ul>"""
+                """</p><p><strong>This command is dangerous. Please use with"""
+                """ care. </strong></p>"""
+            )
+        )
         self.hgRollbackAct.triggered.connect(self.__hgRollback)
         self.actions.append(self.hgRollbackAct)
-        
+
         self.hgServeAct = EricAction(
-            self.tr('Serve project repository'),
-            self.tr('Serve project repository...'),
-            0, 0, self, 'mercurial_serve')
-        self.hgServeAct.setStatusTip(self.tr(
-            'Serve the project repository'
-        ))
-        self.hgServeAct.setWhatsThis(self.tr(
-            """<b>Serve project repository</b>"""
-            """<p>This serves the project repository.</p>"""
-        ))
+            self.tr("Serve project repository"),
+            self.tr("Serve project repository..."),
+            0,
+            0,
+            self,
+            "mercurial_serve",
+        )
+        self.hgServeAct.setStatusTip(self.tr("Serve the project repository"))
+        self.hgServeAct.setWhatsThis(
+            self.tr(
+                """<b>Serve project repository</b>"""
+                """<p>This serves the project repository.</p>"""
+            )
+        )
         self.hgServeAct.triggered.connect(self.__hgServe)
         self.actions.append(self.hgServeAct)
-        
+
         self.hgImportAct = EricAction(
-            self.tr('Import Patch'),
+            self.tr("Import Patch"),
             UI.PixmapCache.getIcon("vcsImportPatch"),
-            self.tr('Import Patch...'),
-            0, 0, self, 'mercurial_import')
-        self.hgImportAct.setStatusTip(self.tr(
-            'Import a patch from a patch file'
-        ))
-        self.hgImportAct.setWhatsThis(self.tr(
-            """<b>Import Patch</b>"""
-            """<p>This imports a patch from a patch file into the"""
-            """ project.</p>"""
-        ))
+            self.tr("Import Patch..."),
+            0,
+            0,
+            self,
+            "mercurial_import",
+        )
+        self.hgImportAct.setStatusTip(self.tr("Import a patch from a patch file"))
+        self.hgImportAct.setWhatsThis(
+            self.tr(
+                """<b>Import Patch</b>"""
+                """<p>This imports a patch from a patch file into the"""
+                """ project.</p>"""
+            )
+        )
         self.hgImportAct.triggered.connect(self.__hgImport)
         self.actions.append(self.hgImportAct)
-        
+
         self.hgExportAct = EricAction(
-            self.tr('Export Patches'),
+            self.tr("Export Patches"),
             UI.PixmapCache.getIcon("vcsExportPatch"),
-            self.tr('Export Patches...'),
-            0, 0, self, 'mercurial_export')
-        self.hgExportAct.setStatusTip(self.tr(
-            'Export revisions to patch files'
-        ))
-        self.hgExportAct.setWhatsThis(self.tr(
-            """<b>Export Patches</b>"""
-            """<p>This exports revisions of the project to patch files.</p>"""
-        ))
+            self.tr("Export Patches..."),
+            0,
+            0,
+            self,
+            "mercurial_export",
+        )
+        self.hgExportAct.setStatusTip(self.tr("Export revisions to patch files"))
+        self.hgExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export Patches</b>"""
+                """<p>This exports revisions of the project to patch files.</p>"""
+            )
+        )
         self.hgExportAct.triggered.connect(self.__hgExport)
         self.actions.append(self.hgExportAct)
-        
+
         self.hgPhaseAct = EricAction(
-            self.tr('Change Phase'),
-            self.tr('Change Phase...'),
-            0, 0, self, 'mercurial_change_phase')
-        self.hgPhaseAct.setStatusTip(self.tr(
-            'Change the phase of revisions'
-        ))
-        self.hgPhaseAct.setWhatsThis(self.tr(
-            """<b>Change Phase</b>"""
-            """<p>This changes the phase of revisions.</p>"""
-        ))
+            self.tr("Change Phase"),
+            self.tr("Change Phase..."),
+            0,
+            0,
+            self,
+            "mercurial_change_phase",
+        )
+        self.hgPhaseAct.setStatusTip(self.tr("Change the phase of revisions"))
+        self.hgPhaseAct.setWhatsThis(
+            self.tr(
+                """<b>Change Phase</b>"""
+                """<p>This changes the phase of revisions.</p>"""
+            )
+        )
         self.hgPhaseAct.triggered.connect(self.__hgPhase)
         self.actions.append(self.hgPhaseAct)
-        
+
         self.hgGraftAct = EricAction(
-            self.tr('Copy Changesets'),
+            self.tr("Copy Changesets"),
             UI.PixmapCache.getIcon("vcsGraft"),
-            self.tr('Copy Changesets'),
-            0, 0, self, 'mercurial_graft')
-        self.hgGraftAct.setStatusTip(self.tr(
-            'Copies changesets from another branch'
-        ))
-        self.hgGraftAct.setWhatsThis(self.tr(
-            """<b>Copy Changesets</b>"""
-            """<p>This copies changesets from another branch on top of the"""
-            """ current working directory with the user, date and"""
-            """ description of the original changeset.</p>"""
-        ))
+            self.tr("Copy Changesets"),
+            0,
+            0,
+            self,
+            "mercurial_graft",
+        )
+        self.hgGraftAct.setStatusTip(self.tr("Copies changesets from another branch"))
+        self.hgGraftAct.setWhatsThis(
+            self.tr(
+                """<b>Copy Changesets</b>"""
+                """<p>This copies changesets from another branch on top of the"""
+                """ current working directory with the user, date and"""
+                """ description of the original changeset.</p>"""
+            )
+        )
         self.hgGraftAct.triggered.connect(self.__hgGraft)
         self.actions.append(self.hgGraftAct)
-        
+
         self.hgGraftContinueAct = EricAction(
-            self.tr('Continue Copying Session'),
-            self.tr('Continue Copying Session'),
-            0, 0, self, 'mercurial_graft_continue')
-        self.hgGraftContinueAct.setStatusTip(self.tr(
-            'Continue the last copying session after conflicts were resolved'
-        ))
-        self.hgGraftContinueAct.setWhatsThis(self.tr(
-            """<b>Continue Copying Session</b>"""
-            """<p>This continues the last copying session after conflicts"""
-            """ were resolved.</p>"""
-        ))
+            self.tr("Continue Copying Session"),
+            self.tr("Continue Copying Session"),
+            0,
+            0,
+            self,
+            "mercurial_graft_continue",
+        )
+        self.hgGraftContinueAct.setStatusTip(
+            self.tr("Continue the last copying session after conflicts were resolved")
+        )
+        self.hgGraftContinueAct.setWhatsThis(
+            self.tr(
+                """<b>Continue Copying Session</b>"""
+                """<p>This continues the last copying session after conflicts"""
+                """ were resolved.</p>"""
+            )
+        )
         self.hgGraftContinueAct.triggered.connect(self.__hgGraftContinue)
         self.actions.append(self.hgGraftContinueAct)
-        
+
         self.hgGraftStopAct = EricAction(
-            self.tr('Stop Copying Session'),
-            self.tr('Stop Copying Session'),
-            0, 0, self, 'mercurial_graft_stop')
-        self.hgGraftStopAct.setStatusTip(self.tr(
-            'Stop the interrupted copying session'
-        ))
-        self.hgGraftStopAct.setWhatsThis(self.tr(
-            """<b>Stop Copying Session</b>"""
-            """<p>This stops the interrupted copying session.</p>"""
-        ))
+            self.tr("Stop Copying Session"),
+            self.tr("Stop Copying Session"),
+            0,
+            0,
+            self,
+            "mercurial_graft_stop",
+        )
+        self.hgGraftStopAct.setStatusTip(
+            self.tr("Stop the interrupted copying session")
+        )
+        self.hgGraftStopAct.setWhatsThis(
+            self.tr(
+                """<b>Stop Copying Session</b>"""
+                """<p>This stops the interrupted copying session.</p>"""
+            )
+        )
         self.hgGraftStopAct.triggered.connect(self.__hgGraftStop)
         self.actions.append(self.hgGraftStopAct)
-        
+
         self.hgGraftAbortAct = EricAction(
-            self.tr('Abort Copying Session'),
-            self.tr('Abort Copying Session'),
-            0, 0, self, 'mercurial_graft_abort')
-        self.hgGraftAbortAct.setStatusTip(self.tr(
-            'Abort the interrupted copying session and rollback'
-        ))
-        self.hgGraftAbortAct.setWhatsThis(self.tr(
-            """<b>Abort Copying Session</b>"""
-            """<p>This aborts the interrupted copying session and"""
-            """ rollbacks to the state before the copy.</p>"""
-        ))
+            self.tr("Abort Copying Session"),
+            self.tr("Abort Copying Session"),
+            0,
+            0,
+            self,
+            "mercurial_graft_abort",
+        )
+        self.hgGraftAbortAct.setStatusTip(
+            self.tr("Abort the interrupted copying session and rollback")
+        )
+        self.hgGraftAbortAct.setWhatsThis(
+            self.tr(
+                """<b>Abort Copying Session</b>"""
+                """<p>This aborts the interrupted copying session and"""
+                """ rollbacks to the state before the copy.</p>"""
+            )
+        )
         self.hgGraftAbortAct.triggered.connect(self.__hgGraftAbort)
         self.actions.append(self.hgGraftAbortAct)
-        
+
         self.hgAddSubrepoAct = EricAction(
-            self.tr('Add'),
+            self.tr("Add"),
             UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add...'),
-            0, 0, self, 'mercurial_add_subrepo')
-        self.hgAddSubrepoAct.setStatusTip(self.tr(
-            'Add a sub-repository'
-        ))
-        self.hgAddSubrepoAct.setWhatsThis(self.tr(
-            """<b>Add...</b>"""
-            """<p>Add a sub-repository to the project.</p>"""
-        ))
+            self.tr("Add..."),
+            0,
+            0,
+            self,
+            "mercurial_add_subrepo",
+        )
+        self.hgAddSubrepoAct.setStatusTip(self.tr("Add a sub-repository"))
+        self.hgAddSubrepoAct.setWhatsThis(
+            self.tr(
+                """<b>Add...</b>""" """<p>Add a sub-repository to the project.</p>"""
+            )
+        )
         self.hgAddSubrepoAct.triggered.connect(self.__hgAddSubrepository)
         self.actions.append(self.hgAddSubrepoAct)
-        
+
         self.hgRemoveSubreposAct = EricAction(
-            self.tr('Remove'),
+            self.tr("Remove"),
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove...'),
-            0, 0, self, 'mercurial_remove_subrepos')
-        self.hgRemoveSubreposAct.setStatusTip(self.tr(
-            'Remove sub-repositories'
-        ))
-        self.hgRemoveSubreposAct.setWhatsThis(self.tr(
-            """<b>Remove...</b>"""
-            """<p>Remove sub-repositories from the project.</p>"""
-        ))
-        self.hgRemoveSubreposAct.triggered.connect(
-            self.__hgRemoveSubrepositories)
+            self.tr("Remove..."),
+            0,
+            0,
+            self,
+            "mercurial_remove_subrepos",
+        )
+        self.hgRemoveSubreposAct.setStatusTip(self.tr("Remove sub-repositories"))
+        self.hgRemoveSubreposAct.setWhatsThis(
+            self.tr(
+                """<b>Remove...</b>"""
+                """<p>Remove sub-repositories from the project.</p>"""
+            )
+        )
+        self.hgRemoveSubreposAct.triggered.connect(self.__hgRemoveSubrepositories)
         self.actions.append(self.hgRemoveSubreposAct)
-        
+
         self.hgArchiveAct = EricAction(
-            self.tr('Create unversioned archive'),
+            self.tr("Create unversioned archive"),
             UI.PixmapCache.getIcon("vcsExport"),
-            self.tr('Create unversioned archive...'),
-            0, 0, self, 'mercurial_archive')
-        self.hgArchiveAct.setStatusTip(self.tr(
-            'Create an unversioned archive from the repository'
-        ))
-        self.hgArchiveAct.setWhatsThis(self.tr(
-            """<b>Create unversioned archive...</b>"""
-            """<p>This creates an unversioned archive from the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Create unversioned archive..."),
+            0,
+            0,
+            self,
+            "mercurial_archive",
+        )
+        self.hgArchiveAct.setStatusTip(
+            self.tr("Create an unversioned archive from the repository")
+        )
+        self.hgArchiveAct.setWhatsThis(
+            self.tr(
+                """<b>Create unversioned archive...</b>"""
+                """<p>This creates an unversioned archive from the"""
+                """ repository.</p>"""
+            )
+        )
         self.hgArchiveAct.triggered.connect(self.__hgArchive)
         self.actions.append(self.hgArchiveAct)
-        
+
         self.hgBookmarksListAct = EricAction(
-            self.tr('List bookmarks'),
+            self.tr("List bookmarks"),
             UI.PixmapCache.getIcon("listBookmarks"),
-            self.tr('List bookmarks...'),
-            0, 0, self, 'mercurial_list_bookmarks')
-        self.hgBookmarksListAct.setStatusTip(self.tr(
-            'List bookmarks of the project'
-        ))
-        self.hgBookmarksListAct.setWhatsThis(self.tr(
-            """<b>List bookmarks</b>"""
-            """<p>This lists the bookmarks of the project.</p>"""
-        ))
+            self.tr("List bookmarks..."),
+            0,
+            0,
+            self,
+            "mercurial_list_bookmarks",
+        )
+        self.hgBookmarksListAct.setStatusTip(self.tr("List bookmarks of the project"))
+        self.hgBookmarksListAct.setWhatsThis(
+            self.tr(
+                """<b>List bookmarks</b>"""
+                """<p>This lists the bookmarks of the project.</p>"""
+            )
+        )
         self.hgBookmarksListAct.triggered.connect(self.__hgBookmarksList)
         self.actions.append(self.hgBookmarksListAct)
-    
+
         self.hgBookmarkDefineAct = EricAction(
-            self.tr('Define bookmark'),
+            self.tr("Define bookmark"),
             UI.PixmapCache.getIcon("addBookmark"),
-            self.tr('Define bookmark...'),
-            0, 0, self, 'mercurial_define_bookmark')
-        self.hgBookmarkDefineAct.setStatusTip(self.tr(
-            'Define a bookmark for the project'
-        ))
-        self.hgBookmarkDefineAct.setWhatsThis(self.tr(
-            """<b>Define bookmark</b>"""
-            """<p>This defines a bookmark for the project.</p>"""
-        ))
+            self.tr("Define bookmark..."),
+            0,
+            0,
+            self,
+            "mercurial_define_bookmark",
+        )
+        self.hgBookmarkDefineAct.setStatusTip(
+            self.tr("Define a bookmark for the project")
+        )
+        self.hgBookmarkDefineAct.setWhatsThis(
+            self.tr(
+                """<b>Define bookmark</b>"""
+                """<p>This defines a bookmark for the project.</p>"""
+            )
+        )
         self.hgBookmarkDefineAct.triggered.connect(self.__hgBookmarkDefine)
         self.actions.append(self.hgBookmarkDefineAct)
-    
+
         self.hgBookmarkDeleteAct = EricAction(
-            self.tr('Delete bookmark'),
+            self.tr("Delete bookmark"),
             UI.PixmapCache.getIcon("deleteBookmark"),
-            self.tr('Delete bookmark...'),
-            0, 0, self, 'mercurial_delete_bookmark')
-        self.hgBookmarkDeleteAct.setStatusTip(self.tr(
-            'Delete a bookmark of the project'
-        ))
-        self.hgBookmarkDeleteAct.setWhatsThis(self.tr(
-            """<b>Delete bookmark</b>"""
-            """<p>This deletes a bookmark of the project.</p>"""
-        ))
+            self.tr("Delete bookmark..."),
+            0,
+            0,
+            self,
+            "mercurial_delete_bookmark",
+        )
+        self.hgBookmarkDeleteAct.setStatusTip(
+            self.tr("Delete a bookmark of the project")
+        )
+        self.hgBookmarkDeleteAct.setWhatsThis(
+            self.tr(
+                """<b>Delete bookmark</b>"""
+                """<p>This deletes a bookmark of the project.</p>"""
+            )
+        )
         self.hgBookmarkDeleteAct.triggered.connect(self.__hgBookmarkDelete)
         self.actions.append(self.hgBookmarkDeleteAct)
-    
+
         self.hgBookmarkRenameAct = EricAction(
-            self.tr('Rename bookmark'),
+            self.tr("Rename bookmark"),
             UI.PixmapCache.getIcon("renameBookmark"),
-            self.tr('Rename bookmark...'),
-            0, 0, self, 'mercurial_rename_bookmark')
-        self.hgBookmarkRenameAct.setStatusTip(self.tr(
-            'Rename a bookmark of the project'
-        ))
-        self.hgBookmarkRenameAct.setWhatsThis(self.tr(
-            """<b>Rename bookmark</b>"""
-            """<p>This renames a bookmark of the project.</p>"""
-        ))
+            self.tr("Rename bookmark..."),
+            0,
+            0,
+            self,
+            "mercurial_rename_bookmark",
+        )
+        self.hgBookmarkRenameAct.setStatusTip(
+            self.tr("Rename a bookmark of the project")
+        )
+        self.hgBookmarkRenameAct.setWhatsThis(
+            self.tr(
+                """<b>Rename bookmark</b>"""
+                """<p>This renames a bookmark of the project.</p>"""
+            )
+        )
         self.hgBookmarkRenameAct.triggered.connect(self.__hgBookmarkRename)
         self.actions.append(self.hgBookmarkRenameAct)
-    
+
         self.hgBookmarkMoveAct = EricAction(
-            self.tr('Move bookmark'),
+            self.tr("Move bookmark"),
             UI.PixmapCache.getIcon("moveBookmark"),
-            self.tr('Move bookmark...'),
-            0, 0, self, 'mercurial_move_bookmark')
-        self.hgBookmarkMoveAct.setStatusTip(self.tr(
-            'Move a bookmark of the project'
-        ))
-        self.hgBookmarkMoveAct.setWhatsThis(self.tr(
-            """<b>Move bookmark</b>"""
-            """<p>This moves a bookmark of the project to another"""
-            """ changeset.</p>"""
-        ))
+            self.tr("Move bookmark..."),
+            0,
+            0,
+            self,
+            "mercurial_move_bookmark",
+        )
+        self.hgBookmarkMoveAct.setStatusTip(self.tr("Move a bookmark of the project"))
+        self.hgBookmarkMoveAct.setWhatsThis(
+            self.tr(
+                """<b>Move bookmark</b>"""
+                """<p>This moves a bookmark of the project to another"""
+                """ changeset.</p>"""
+            )
+        )
         self.hgBookmarkMoveAct.triggered.connect(self.__hgBookmarkMove)
         self.actions.append(self.hgBookmarkMoveAct)
-        
+
         self.hgBookmarkIncomingAct = EricAction(
-            self.tr('Show incoming bookmarks'),
+            self.tr("Show incoming bookmarks"),
             UI.PixmapCache.getIcon("incomingBookmark"),
-            self.tr('Show incoming bookmarks'),
-            0, 0, self, 'mercurial_incoming_bookmarks')
-        self.hgBookmarkIncomingAct.setStatusTip(self.tr(
-            'Show a list of incoming bookmarks'
-        ))
-        self.hgBookmarkIncomingAct.setWhatsThis(self.tr(
-            """<b>Show incoming bookmarks</b>"""
-            """<p>This shows a list of new bookmarks available at the remote"""
-            """ repository.</p>"""
-        ))
-        self.hgBookmarkIncomingAct.triggered.connect(
-            self.__hgBookmarkIncoming)
+            self.tr("Show incoming bookmarks"),
+            0,
+            0,
+            self,
+            "mercurial_incoming_bookmarks",
+        )
+        self.hgBookmarkIncomingAct.setStatusTip(
+            self.tr("Show a list of incoming bookmarks")
+        )
+        self.hgBookmarkIncomingAct.setWhatsThis(
+            self.tr(
+                """<b>Show incoming bookmarks</b>"""
+                """<p>This shows a list of new bookmarks available at the remote"""
+                """ repository.</p>"""
+            )
+        )
+        self.hgBookmarkIncomingAct.triggered.connect(self.__hgBookmarkIncoming)
         self.actions.append(self.hgBookmarkIncomingAct)
-        
+
         self.hgBookmarkPullAct = EricAction(
-            self.tr('Pull bookmark'),
+            self.tr("Pull bookmark"),
             UI.PixmapCache.getIcon("pullBookmark"),
-            self.tr('Pull bookmark'),
-            0, 0, self, 'mercurial_pull_bookmark')
-        self.hgBookmarkPullAct.setStatusTip(self.tr(
-            'Pull a bookmark from a remote repository'
-        ))
-        self.hgBookmarkPullAct.setWhatsThis(self.tr(
-            """<b>Pull bookmark</b>"""
-            """<p>This pulls a bookmark from a remote repository into the """
-            """local repository.</p>"""
-        ))
+            self.tr("Pull bookmark"),
+            0,
+            0,
+            self,
+            "mercurial_pull_bookmark",
+        )
+        self.hgBookmarkPullAct.setStatusTip(
+            self.tr("Pull a bookmark from a remote repository")
+        )
+        self.hgBookmarkPullAct.setWhatsThis(
+            self.tr(
+                """<b>Pull bookmark</b>"""
+                """<p>This pulls a bookmark from a remote repository into the """
+                """local repository.</p>"""
+            )
+        )
         self.hgBookmarkPullAct.triggered.connect(self.__hgBookmarkPull)
         self.actions.append(self.hgBookmarkPullAct)
-        
+
         self.hgBookmarkPullCurrentAct = EricAction(
-            self.tr('Pull current bookmark'),
+            self.tr("Pull current bookmark"),
             UI.PixmapCache.getIcon("pullBookmark"),
-            self.tr('Pull current bookmark'),
-            0, 0, self, 'mercurial_pull_current_bookmark')
-        self.hgBookmarkPullCurrentAct.setStatusTip(self.tr(
-            'Pull the current bookmark from a remote repository'
-        ))
-        self.hgBookmarkPullCurrentAct.setWhatsThis(self.tr(
-            """<b>Pull current bookmark</b>"""
-            """<p>This pulls the current bookmark from a remote"""
-            """ repository into the local repository.</p>"""
-        ))
-        self.hgBookmarkPullCurrentAct.triggered.connect(
-            self.__hgBookmarkPullCurrent)
-        
+            self.tr("Pull current bookmark"),
+            0,
+            0,
+            self,
+            "mercurial_pull_current_bookmark",
+        )
+        self.hgBookmarkPullCurrentAct.setStatusTip(
+            self.tr("Pull the current bookmark from a remote repository")
+        )
+        self.hgBookmarkPullCurrentAct.setWhatsThis(
+            self.tr(
+                """<b>Pull current bookmark</b>"""
+                """<p>This pulls the current bookmark from a remote"""
+                """ repository into the local repository.</p>"""
+            )
+        )
+        self.hgBookmarkPullCurrentAct.triggered.connect(self.__hgBookmarkPullCurrent)
+
         self.hgBookmarkOutgoingAct = EricAction(
-            self.tr('Show outgoing bookmarks'),
+            self.tr("Show outgoing bookmarks"),
             UI.PixmapCache.getIcon("outgoingBookmark"),
-            self.tr('Show outgoing bookmarks'),
-            0, 0, self, 'mercurial_outgoing_bookmarks')
-        self.hgBookmarkOutgoingAct.setStatusTip(self.tr(
-            'Show a list of outgoing bookmarks'
-        ))
-        self.hgBookmarkOutgoingAct.setWhatsThis(self.tr(
-            """<b>Show outgoing bookmarks</b>"""
-            """<p>This shows a list of new bookmarks available at the local"""
-            """ repository.</p>"""
-        ))
-        self.hgBookmarkOutgoingAct.triggered.connect(
-            self.__hgBookmarkOutgoing)
+            self.tr("Show outgoing bookmarks"),
+            0,
+            0,
+            self,
+            "mercurial_outgoing_bookmarks",
+        )
+        self.hgBookmarkOutgoingAct.setStatusTip(
+            self.tr("Show a list of outgoing bookmarks")
+        )
+        self.hgBookmarkOutgoingAct.setWhatsThis(
+            self.tr(
+                """<b>Show outgoing bookmarks</b>"""
+                """<p>This shows a list of new bookmarks available at the local"""
+                """ repository.</p>"""
+            )
+        )
+        self.hgBookmarkOutgoingAct.triggered.connect(self.__hgBookmarkOutgoing)
         self.actions.append(self.hgBookmarkOutgoingAct)
-        
+
         self.hgBookmarkPushAct = EricAction(
-            self.tr('Push bookmark'),
+            self.tr("Push bookmark"),
             UI.PixmapCache.getIcon("pushBookmark"),
-            self.tr('Push bookmark'),
-            0, 0, self, 'mercurial_push_bookmark')
-        self.hgBookmarkPushAct.setStatusTip(self.tr(
-            'Push a bookmark to a remote repository'
-        ))
-        self.hgBookmarkPushAct.setWhatsThis(self.tr(
-            """<b>Push bookmark</b>"""
-            """<p>This pushes a bookmark from the local repository to a """
-            """remote repository.</p>"""
-        ))
+            self.tr("Push bookmark"),
+            0,
+            0,
+            self,
+            "mercurial_push_bookmark",
+        )
+        self.hgBookmarkPushAct.setStatusTip(
+            self.tr("Push a bookmark to a remote repository")
+        )
+        self.hgBookmarkPushAct.setWhatsThis(
+            self.tr(
+                """<b>Push bookmark</b>"""
+                """<p>This pushes a bookmark from the local repository to a """
+                """remote repository.</p>"""
+            )
+        )
         self.hgBookmarkPushAct.triggered.connect(self.__hgBookmarkPush)
         self.actions.append(self.hgBookmarkPushAct)
-    
+
         self.hgBookmarkPushCurrentAct = EricAction(
-            self.tr('Push current bookmark'),
+            self.tr("Push current bookmark"),
             UI.PixmapCache.getIcon("pushBookmark"),
-            self.tr('Push current bookmark'),
-            0, 0, self, 'mercurial_push_current_bookmark')
-        self.hgBookmarkPushCurrentAct.setStatusTip(self.tr(
-            'Push the current bookmark to a remote repository'
-        ))
-        self.hgBookmarkPushCurrentAct.setWhatsThis(self.tr(
-            """<b>Push current bookmark</b>"""
-            """<p>This pushes the current bookmark from the local"""
-            """ repository to a remote repository.</p>"""
-        ))
-        self.hgBookmarkPushCurrentAct.triggered.connect(
-            self.__hgBookmarkPushCurrent)
+            self.tr("Push current bookmark"),
+            0,
+            0,
+            self,
+            "mercurial_push_current_bookmark",
+        )
+        self.hgBookmarkPushCurrentAct.setStatusTip(
+            self.tr("Push the current bookmark to a remote repository")
+        )
+        self.hgBookmarkPushCurrentAct.setWhatsThis(
+            self.tr(
+                """<b>Push current bookmark</b>"""
+                """<p>This pushes the current bookmark from the local"""
+                """ repository to a remote repository.</p>"""
+            )
+        )
+        self.hgBookmarkPushCurrentAct.triggered.connect(self.__hgBookmarkPushCurrent)
         self.actions.append(self.hgBookmarkPushCurrentAct)
-        
+
         self.hgBookmarkPushAllAct = EricAction(
-            self.tr('Push all bookmarks'),
+            self.tr("Push all bookmarks"),
             UI.PixmapCache.getIcon("pushBookmark"),
-            self.tr('Push all bookmarks'),
-            0, 0, self, 'mercurial_push_all_bookmarks')
-        self.hgBookmarkPushAllAct.setStatusTip(self.tr(
-            'Push all bookmarks to a remote repository'
-        ))
-        self.hgBookmarkPushAllAct.setWhatsThis(self.tr(
-            """<b>Push all bookmarks</b>"""
-            """<p>This pushes all bookmark from the local"""
-            """ repository to a remote repository.</p>"""
-        ))
-        self.hgBookmarkPushAllAct.triggered.connect(
-            self.__hgBookmarkPushAll)
-        
+            self.tr("Push all bookmarks"),
+            0,
+            0,
+            self,
+            "mercurial_push_all_bookmarks",
+        )
+        self.hgBookmarkPushAllAct.setStatusTip(
+            self.tr("Push all bookmarks to a remote repository")
+        )
+        self.hgBookmarkPushAllAct.setWhatsThis(
+            self.tr(
+                """<b>Push all bookmarks</b>"""
+                """<p>This pushes all bookmark from the local"""
+                """ repository to a remote repository.</p>"""
+            )
+        )
+        self.hgBookmarkPushAllAct.triggered.connect(self.__hgBookmarkPushAll)
+
         self.hgDeleteBackupsAct = EricAction(
-            self.tr('Delete all backups'),
+            self.tr("Delete all backups"),
             UI.PixmapCache.getIcon("clearPrivateData"),
-            self.tr('Delete all backups'),
-            0, 0, self, 'mercurial_delete_all_backups')
-        self.hgDeleteBackupsAct.setStatusTip(self.tr(
-            'Delete all backup bundles stored in the backup area'
-        ))
-        self.hgDeleteBackupsAct.setWhatsThis(self.tr(
-            """<b>Delete all backups</b>"""
-            """<p>This deletes all backup bundles stored in the backup"""
-            """ area of the repository.</p>"""
-        ))
-        self.hgDeleteBackupsAct.triggered.connect(
-            self.__hgDeleteBackups)
+            self.tr("Delete all backups"),
+            0,
+            0,
+            self,
+            "mercurial_delete_all_backups",
+        )
+        self.hgDeleteBackupsAct.setStatusTip(
+            self.tr("Delete all backup bundles stored in the backup area")
+        )
+        self.hgDeleteBackupsAct.setWhatsThis(
+            self.tr(
+                """<b>Delete all backups</b>"""
+                """<p>This deletes all backup bundles stored in the backup"""
+                """ area of the repository.</p>"""
+            )
+        )
+        self.hgDeleteBackupsAct.triggered.connect(self.__hgDeleteBackups)
         self.actions.append(self.hgDeleteBackupsAct)
-    
+
     def __checkActions(self):
         """
         Private slot to set the enabled status of actions.
@@ -1309,7 +1673,7 @@
         self.hgBookmarkPullAct.setEnabled(self.vcs.canPull())
         self.hgBookmarkIncomingAct.setEnabled(self.vcs.canPull())
         self.hgBookmarkPullCurrentAct.setEnabled(self.vcs.canPull())
-        
+
         self.hgPushAct.setEnabled(self.vcs.canPush())
         self.hgPushBranchAct.setEnabled(self.vcs.canPush())
         self.hgPushForcedAct.setEnabled(self.vcs.canPush())
@@ -1319,19 +1683,19 @@
         self.hgBookmarkPushCurrentAct.setEnabled(self.vcs.canPush())
         if self.vcs.version >= (5, 7):
             self.hgBookmarkPushAllAct.setEnabled(self.vcs.canPush())
-        
+
         self.hgCommitMergeAct.setEnabled(self.vcs.canCommitMerge())
-    
+
     def initMenu(self, menu):
         """
         Public method to generate the VCS menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         self.subMenus = []
-        
+
         adminMenu = QMenu(self.tr("Administration"), menu)
         adminMenu.setTearOffEnabled(True)
         adminMenu.addAction(self.hgHeadsAct)
@@ -1356,7 +1720,7 @@
         adminMenu.addSeparator()
         adminMenu.addAction(self.hgDeleteBackupsAct)
         self.subMenus.append(adminMenu)
-        
+
         specialsMenu = QMenu(self.tr("Specials"), menu)
         specialsMenu.setTearOffEnabled(True)
         specialsMenu.addAction(self.hgArchiveAct)
@@ -1365,20 +1729,20 @@
         specialsMenu.addSeparator()
         specialsMenu.addAction(self.hgServeAct)
         self.subMenus.append(specialsMenu)
-        
+
         bundleMenu = QMenu(self.tr("Changegroup Management"), menu)
         bundleMenu.setTearOffEnabled(True)
         bundleMenu.addAction(self.hgBundleAct)
         bundleMenu.addAction(self.hgPreviewBundleAct)
         bundleMenu.addAction(self.hgUnbundleAct)
         self.subMenus.append(bundleMenu)
-        
+
         patchMenu = QMenu(self.tr("Patch Management"), menu)
         patchMenu.setTearOffEnabled(True)
         patchMenu.addAction(self.hgImportAct)
         patchMenu.addAction(self.hgExportAct)
         self.subMenus.append(patchMenu)
-        
+
         bisectMenu = QMenu(self.tr("Bisect"), menu)
         bisectMenu.setTearOffEnabled(True)
         bisectMenu.addAction(self.hgBisectGoodAct)
@@ -1386,14 +1750,14 @@
         bisectMenu.addAction(self.hgBisectSkipAct)
         bisectMenu.addAction(self.hgBisectResetAct)
         self.subMenus.append(bisectMenu)
-        
+
         tagsMenu = QMenu(self.tr("Tags"), menu)
         tagsMenu.setIcon(UI.PixmapCache.getIcon("vcsTag"))
         tagsMenu.setTearOffEnabled(True)
         tagsMenu.addAction(self.vcsTagAct)
         tagsMenu.addAction(self.hgTagListAct)
         self.subMenus.append(tagsMenu)
-        
+
         branchesMenu = QMenu(self.tr("Branches"), menu)
         branchesMenu.setIcon(UI.PixmapCache.getIcon("vcsBranch"))
         branchesMenu.setTearOffEnabled(True)
@@ -1402,7 +1766,7 @@
         branchesMenu.addAction(self.hgCloseBranchAct)
         branchesMenu.addAction(self.hgBranchListAct)
         self.subMenus.append(branchesMenu)
-        
+
         bookmarksMenu = QMenu(self.tr("Bookmarks"), menu)
         bookmarksMenu.setIcon(UI.PixmapCache.getIcon("bookmark22"))
         bookmarksMenu.setTearOffEnabled(True)
@@ -1423,7 +1787,7 @@
         if self.vcs.version >= (5, 7):
             bookmarksMenu.addAction(self.hgBookmarkPushAllAct)
         self.subMenus.append(bookmarksMenu)
-        
+
         self.__extensionsMenu = QMenu(self.tr("Extensions"), menu)
         self.__extensionsMenu.setTearOffEnabled(True)
         self.__extensionsMenu.aboutToShow.connect(self.__showExtensionMenu)
@@ -1431,11 +1795,12 @@
         for extensionMenuTitle in sorted(self.__extensionMenuTitles):
             extensionName = self.__extensionMenuTitles[extensionMenuTitle]
             extensionMenu = self.__extensions[extensionName].initMenu(
-                self.__extensionsMenu)
+                self.__extensionsMenu
+            )
             self.__extensionMenus[extensionName] = extensionMenu
             self.__extensionsMenu.addMenu(extensionMenu)
         self.vcs.activeExtensionsChanged.connect(self.__showExtensionMenu)
-        
+
         graftMenu = QMenu(self.tr("Copy Changesets"), menu)
         graftMenu.setIcon(UI.PixmapCache.getIcon("vcsGraft"))
         graftMenu.setTearOffEnabled(True)
@@ -1444,12 +1809,12 @@
         if self.vcs.version >= (4, 7, 0):
             graftMenu.addAction(self.hgGraftStopAct)
             graftMenu.addAction(self.hgGraftAbortAct)
-        
+
         subrepoMenu = QMenu(self.tr("Sub-Repository"), menu)
         subrepoMenu.setTearOffEnabled(True)
         subrepoMenu.addAction(self.hgAddSubrepoAct)
         subrepoMenu.addAction(self.hgRemoveSubreposAct)
-        
+
         mergeMenu = QMenu(self.tr("Merge Changesets"), menu)
         mergeMenu.setIcon(UI.PixmapCache.getIcon("vcsMerge"))
         mergeMenu.setTearOffEnabled(True)
@@ -1460,17 +1825,19 @@
         mergeMenu.addAction(self.hgReMergeAct)
         mergeMenu.addAction(self.hgCommitMergeAct)
         mergeMenu.addAction(self.hgAbortMergeAct)
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsMercurial", "icons",
-                             "mercurial.svg")),
-            self.vcs.vcsName(), self._vcsInfoDisplay)
+                os.path.join("VcsPlugins", "vcsMercurial", "icons", "mercurial.svg")
+            ),
+            self.vcs.vcsName(),
+            self._vcsInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         menu.addAction(self.hgIncomingAct)
         menu.addAction(self.hgPullAct)
         menu.addAction(self.vcsUpdateAct)
@@ -1519,22 +1886,22 @@
         menu.addSeparator()
         menu.addAction(self.vcsNewAct)
         menu.addAction(self.vcsExportAct)
-    
+
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         self.__toolbarManager = toolbarManager
-        
+
         self.__toolbar = QToolBar(self.tr("Mercurial"), ui)
         self.__toolbar.setIconSize(UI.Config.ToolBarIconSize)
         self.__toolbar.setObjectName("MercurialToolbar")
-        self.__toolbar.setToolTip(self.tr('Mercurial'))
-        
+        self.__toolbar.setToolTip(self.tr("Mercurial"))
+
         self.__toolbar.addAction(self.hgLogBrowserAct)
         self.__toolbar.addAction(self.vcsStatusAct)
         self.__toolbar.addSeparator()
@@ -1543,7 +1910,7 @@
         self.__toolbar.addAction(self.vcsNewAct)
         self.__toolbar.addAction(self.vcsExportAct)
         self.__toolbar.addSeparator()
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.addToolBar(self.__toolbar, title)
         toolbarManager.addAction(self.hgIncomingAct, title)
@@ -1583,62 +1950,63 @@
         toolbarManager.addAction(self.hgPreviewBundleAct, title)
         toolbarManager.addAction(self.hgUnbundleAct, title)
         toolbarManager.addAction(self.hgDeleteBackupsAct, title)
-        
+
         self.__toolbar.setEnabled(False)
         self.__toolbar.setVisible(False)
-        
-        ui.registerToolbar("mercurial", self.__toolbar.windowTitle(),
-                           self.__toolbar, "vcs")
+
+        ui.registerToolbar(
+            "mercurial", self.__toolbar.windowTitle(), self.__toolbar, "vcs"
+        )
         ui.addToolBar(self.__toolbar)
-    
+
     def removeToolbar(self, ui, toolbarManager):
         """
         Public method to remove a toolbar created by initToolbar().
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         ui.removeToolBar(self.__toolbar)
         ui.unregisterToolbar("mercurial")
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.removeCategoryActions(title)
         toolbarManager.removeToolBar(self.__toolbar)
-        
+
         self.__toolbar.deleteLater()
         self.__toolbar = None
-    
+
     def showMenu(self):
         """
         Public slot called before the vcs menu is shown.
         """
         super().showMenu()
-        
+
         self.__checkActions()
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         self.vcs.activeExtensionsChanged.disconnect(self.__showExtensionMenu)
         self.vcs.iniFileChanged.disconnect(self.__checkActions)
-        
+
         # close torn off sub menus
         for menu in self.subMenus:
             if menu.isTearOffMenuVisible():
                 menu.hideTearOffMenu()
-        
+
         # close torn off extension menus
         for extensionName in self.__extensionMenus:
             self.__extensions[extensionName].shutdown()
             menu = self.__extensionMenus[extensionName]
             if menu.isTearOffMenuVisible():
                 menu.hideTearOffMenu()
-        
+
         if self.__extensionsMenu.isTearOffMenuVisible():
             self.__extensionsMenu.hideTearOffMenu()
-    
+
     def __showExtensionMenu(self):
         """
         Private slot showing the extensions menu.
@@ -1646,33 +2014,34 @@
         for extensionName in self.__extensionMenus:
             extensionMenu = self.__extensionMenus[extensionName]
             extensionMenu.menuAction().setEnabled(
-                self.vcs.isExtensionActive(extensionName))
+                self.vcs.isExtensionActive(extensionName)
+            )
             if (
-                not extensionMenu.menuAction().isEnabled() and
-                extensionMenu.isTearOffMenuVisible()
+                not extensionMenu.menuAction().isEnabled()
+                and extensionMenu.isTearOffMenuVisible()
             ):
                 extensionMenu.hideTearOffMenu()
-    
+
     def __hgExtendedDiff(self):
         """
         Private slot used to perform a hg diff with the selection of revisions.
         """
         self.vcs.hgExtendedDiff(self.project.ppath)
-    
+
     def __hgIncoming(self):
         """
         Private slot used to show the log of changes coming into the
         repository.
         """
         self.vcs.hgIncoming()
-    
+
     def __hgOutgoing(self):
         """
         Private slot used to show the log of changes going out of the
         repository.
         """
         self.vcs.hgOutgoing()
-    
+
     def __hgPull(self):
         """
         Private slot used to pull changes from a remote repository.
@@ -1683,48 +2052,49 @@
                 self.parent(),
                 self.tr("Pull"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgPush(self):
         """
         Private slot used to push changes to a remote repository.
         """
         self.vcs.hgPush()
-    
+
     def __hgPushForced(self):
         """
         Private slot used to push changes to a remote repository using
         the force option.
         """
         self.vcs.hgPush(force=True)
-    
+
     def __hgHeads(self):
         """
         Private slot used to show the heads of the repository.
         """
         self.vcs.hgInfo(mode="heads")
-    
+
     def __hgParents(self):
         """
         Private slot used to show the parents of the repository.
         """
         self.vcs.hgInfo(mode="parents")
-    
+
     def __hgTip(self):
         """
         Private slot used to show the tip of the repository.
         """
         self.vcs.hgInfo(mode="tip")
-    
+
     def __hgResolved(self):
         """
         Private slot used to mark conflicts of the local project as being
         resolved.
         """
         self.vcs.vcsResolved(self.project.ppath)
-    
+
     def __hgUnresolved(self):
         """
         Private slot used to mark conflicts of the local project as being
@@ -1736,57 +2106,56 @@
         """
         Private slot used to commit a merge.
         """
-        self.vcs.vcsCommit(self.project.ppath, self.tr('Merge'), merge=True)
-    
+        self.vcs.vcsCommit(self.project.ppath, self.tr("Merge"), merge=True)
+
     def __hgAbortMerge(self):
         """
         Private slot used to abort an uncommitted merge.
         """
         self.vcs.hgAbortMerge()
-    
+
     def __hgShowConflicts(self):
         """
         Private slot used to list all files with conflicts.
         """
         self.vcs.hgConflicts()
-    
+
     def __hgReMerge(self):
         """
         Private slot used to list all files with conflicts.
         """
         self.vcs.hgReMerge(self.project.ppath)
-    
+
     def __hgTagList(self):
         """
         Private slot used to list the tags of the project.
         """
         self.vcs.hgListTagBranch(True)
-    
+
     def __hgBranchList(self):
         """
         Private slot used to list the branches of the project.
         """
         self.vcs.hgListTagBranch(False)
-    
+
     def __hgBranch(self):
         """
         Private slot used to create a new branch for the project.
         """
         self.vcs.hgBranch()
-    
+
     def __hgShowBranch(self):
         """
         Private slot used to show the current branch for the project.
         """
         self.vcs.hgShowBranch()
-    
+
     def __hgConfigure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_mercurialPage")
-    
+        ericApp().getObject("UserInterface").showPreferences("zzz_mercurialPage")
+
     def __hgCloseBranch(self):
         """
         Private slot used to close the current branch of the local project.
@@ -1795,74 +2164,74 @@
             self.project.saveProject()
         if Preferences.getVCS("AutoSaveFiles"):
             self.project.saveAllScripts()
-        self.vcs.vcsCommit(self.project.ppath, '', closeBranch=True)
-    
+        self.vcs.vcsCommit(self.project.ppath, "", closeBranch=True)
+
     def __hgPushNewBranch(self):
         """
         Private slot to push a new named branch.
         """
         self.vcs.hgPush(newBranch=True)
-    
+
     def __hgEditUserConfig(self):
         """
         Private slot used to edit the user configuration file.
         """
         self.vcs.hgEditUserConfig()
-    
+
     def __hgEditRepoConfig(self):
         """
         Private slot used to edit the repository configuration file.
         """
         self.vcs.hgEditConfig()
-    
+
     def __hgShowConfig(self):
         """
         Private slot used to show the combined configuration.
         """
         self.vcs.hgShowConfig()
-    
+
     def __hgVerify(self):
         """
         Private slot used to verify the integrity of the repository.
         """
         self.vcs.hgVerify()
-    
+
     def __hgShowPaths(self):
         """
         Private slot used to show the aliases for remote repositories.
         """
         self.vcs.hgShowPaths()
-    
+
     def __hgRecover(self):
         """
         Private slot used to recover from an interrupted transaction.
         """
         self.vcs.hgRecover()
-    
+
     def __hgIdentify(self):
         """
         Private slot used to identify the project directory.
         """
         self.vcs.hgIdentify()
-    
+
     def __hgCreateIgnore(self):
         """
         Private slot used to create a .hgignore file for the project.
         """
         self.vcs.hgCreateIgnoreFile(self.project.ppath, autoAdd=True)
-    
+
     def __hgBundle(self):
         """
         Private slot used to create a changegroup file.
         """
         self.vcs.hgBundle()
-    
+
     def __hgPreviewBundle(self):
         """
         Private slot used to preview a changegroup file.
         """
         self.vcs.hgPreviewBundle()
-    
+
     def __hgUnbundle(self):
         """
         Private slot used to apply changegroup files.
@@ -1873,52 +2242,53 @@
                 self.parent(),
                 self.tr("Apply changegroups"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgBisectGood(self):
         """
         Private slot used to execute the bisect --good command.
         """
         self.vcs.hgBisect("good")
-    
+
     def __hgBisectBad(self):
         """
         Private slot used to execute the bisect --bad command.
         """
         self.vcs.hgBisect("bad")
-    
+
     def __hgBisectSkip(self):
         """
         Private slot used to execute the bisect --skip command.
         """
         self.vcs.hgBisect("skip")
-    
+
     def __hgBisectReset(self):
         """
         Private slot used to execute the bisect --reset command.
         """
         self.vcs.hgBisect("reset")
-    
+
     def __hgBackout(self):
         """
         Private slot used to back out changes of a changeset.
         """
         self.vcs.hgBackout()
-    
+
     def __hgRollback(self):
         """
         Private slot used to rollback the last transaction.
         """
         self.vcs.hgRollback()
-    
+
     def __hgServe(self):
         """
         Private slot used to serve the project.
         """
         self.vcs.hgServe(self.project.ppath)
-    
+
     def __hgImport(self):
         """
         Private slot used to import a patch file.
@@ -1929,16 +2299,17 @@
                 self.parent(),
                 self.tr("Import Patch"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgExport(self):
         """
         Private slot used to export revisions to patch files.
         """
         self.vcs.hgExport()
-    
+
     def __hgRevert(self):
         """
         Private slot used to revert changes made to the local project.
@@ -1949,16 +2320,17 @@
                 self.parent(),
                 self.tr("Revert Changes"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgPhase(self):
         """
         Private slot used to change the phase of revisions.
         """
         self.vcs.hgPhase()
-    
+
     def __hgGraft(self):
         """
         Private slot used to copy changesets from another branch.
@@ -1969,10 +2341,11 @@
                 None,
                 self.tr("Copy Changesets"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgGraftContinue(self):
         """
         Private slot used to continue the last copying session after conflicts
@@ -1984,10 +2357,11 @@
                 None,
                 self.tr("Copy Changesets (Continue)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgGraftStop(self):
         """
         Private slot used to stop an interrupted copying session.
@@ -1998,10 +2372,11 @@
                 None,
                 self.tr("Copy Changesets (Stop)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgGraftAbort(self):
         """
         Private slot used to abort an interrupted copying session and perform
@@ -2013,107 +2388,108 @@
                 None,
                 self.tr("Copy Changesets (Abort)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgAddSubrepository(self):
         """
         Private slot used to add a sub-repository.
         """
         self.vcs.hgAddSubrepository()
-    
+
     def __hgRemoveSubrepositories(self):
         """
         Private slot used to remove sub-repositories.
         """
         self.vcs.hgRemoveSubrepositories()
-    
+
     def __hgSummary(self):
         """
         Private slot to show a working directory summary.
         """
         self.vcs.hgSummary()
-    
+
     def __hgArchive(self):
         """
         Private slot to create an unversioned archive from the repository.
         """
         self.vcs.hgArchive()
-    
+
     def __hgBookmarksList(self):
         """
         Private slot used to list the bookmarks.
         """
         self.vcs.hgListBookmarks()
-    
+
     def __hgBookmarkDefine(self):
         """
         Private slot used to define a bookmark.
         """
         self.vcs.hgBookmarkDefine()
-    
+
     def __hgBookmarkDelete(self):
         """
         Private slot used to delete a bookmark.
         """
         self.vcs.hgBookmarkDelete()
-    
+
     def __hgBookmarkRename(self):
         """
         Private slot used to rename a bookmark.
         """
         self.vcs.hgBookmarkRename()
-    
+
     def __hgBookmarkMove(self):
         """
         Private slot used to move a bookmark.
         """
         self.vcs.hgBookmarkMove()
-    
+
     def __hgBookmarkIncoming(self):
         """
         Private slot used to show a list of incoming bookmarks.
         """
         self.vcs.hgBookmarkIncoming()
-    
+
     def __hgBookmarkOutgoing(self):
         """
         Private slot used to show a list of outgoing bookmarks.
         """
         self.vcs.hgBookmarkOutgoing()
-    
+
     def __hgBookmarkPull(self):
         """
         Private slot used to pull a bookmark from a remote repository.
         """
         self.vcs.hgBookmarkPull()
-    
+
     def __hgBookmarkPullCurrent(self):
         """
         Private slot used to pull the current bookmark from a remote
         repository.
         """
         self.vcs.hgBookmarkPull(current=True)
-    
+
     def __hgBookmarkPush(self):
         """
         Private slot used to push a bookmark to a remote repository.
         """
         self.vcs.hgBookmarkPush()
-    
+
     def __hgBookmarkPushCurrent(self):
         """
         Private slot used to push the current bookmark to a remote repository.
         """
         self.vcs.hgBookmarkPush(current=True)
-    
+
     def __hgBookmarkPushAll(self):
         """
         Private slot to push all bookmarks to a remote repository.
         """
         self.vcs.hgBookmarkPush(allBookmarks=True)
-    
+
     def __hgDeleteBackups(self):
         """
         Private slot used to delete all backup bundles.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/HgPurgeListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/HgPurgeListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,15 +17,16 @@
     """
     Class implementing a dialog to list all files not tracked by Mercurial.
     """
+
     def __init__(self, entries, parent=None):
         """
         Constructor
-        
+
         @param entries list of entries to be shown (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.purgeList.addItems(sorted(entries))
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,135 +20,164 @@
     """
     Class implementing the purge extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgPurgeAct = EricAction(
-            self.tr('Purge Files'),
+            self.tr("Purge Files"),
             UI.PixmapCache.getIcon("fileDelete"),
-            self.tr('Purge Files'),
-            0, 0, self, 'mercurial_purge')
-        self.hgPurgeAct.setStatusTip(self.tr(
-            'Delete files and directories not known to Mercurial'
-        ))
-        self.hgPurgeAct.setWhatsThis(self.tr(
-            """<b>Purge Files</b>"""
-            """<p>This deletes files and directories not known to Mercurial."""
-            """ That means that purge will delete:<ul>"""
-            """<li>unknown files (marked with "not tracked" in the status"""
-            """ dialog)</li>"""
-            """<li>empty directories</li>"""
-            """</ul>Note that ignored files will be left untouched.</p>"""
-        ))
+            self.tr("Purge Files"),
+            0,
+            0,
+            self,
+            "mercurial_purge",
+        )
+        self.hgPurgeAct.setStatusTip(
+            self.tr("Delete files and directories not known to Mercurial")
+        )
+        self.hgPurgeAct.setWhatsThis(
+            self.tr(
+                """<b>Purge Files</b>"""
+                """<p>This deletes files and directories not known to Mercurial."""
+                """ That means that purge will delete:<ul>"""
+                """<li>unknown files (marked with "not tracked" in the status"""
+                """ dialog)</li>"""
+                """<li>empty directories</li>"""
+                """</ul>Note that ignored files will be left untouched.</p>"""
+            )
+        )
         self.hgPurgeAct.triggered.connect(self.__hgPurge)
         self.actions.append(self.hgPurgeAct)
-        
+
         self.hgPurgeAllAct = EricAction(
-            self.tr('Purge All Files'),
-            self.tr('Purge All Files'),
-            0, 0, self, 'mercurial_purge_all')
-        self.hgPurgeAllAct.setStatusTip(self.tr(
-            'Delete files and directories not known to Mercurial including'
-            ' ignored ones'
-        ))
-        self.hgPurgeAllAct.setWhatsThis(self.tr(
-            """<b>Purge All Files</b>"""
-            """<p>This deletes files and directories not known to Mercurial."""
-            """ That means that purge will delete:<ul>"""
-            """<li>unknown files (marked with "not tracked" in the status"""
-            """ dialog)</li>"""
-            """<li>empty directories</li>"""
-            """<li>ignored files and directories</li>"""
-            """</ul></p>"""
-        ))
+            self.tr("Purge All Files"),
+            self.tr("Purge All Files"),
+            0,
+            0,
+            self,
+            "mercurial_purge_all",
+        )
+        self.hgPurgeAllAct.setStatusTip(
+            self.tr(
+                "Delete files and directories not known to Mercurial including"
+                " ignored ones"
+            )
+        )
+        self.hgPurgeAllAct.setWhatsThis(
+            self.tr(
+                """<b>Purge All Files</b>"""
+                """<p>This deletes files and directories not known to Mercurial."""
+                """ That means that purge will delete:<ul>"""
+                """<li>unknown files (marked with "not tracked" in the status"""
+                """ dialog)</li>"""
+                """<li>empty directories</li>"""
+                """<li>ignored files and directories</li>"""
+                """</ul></p>"""
+            )
+        )
         self.hgPurgeAllAct.triggered.connect(self.__hgPurgeAll)
         self.actions.append(self.hgPurgeAllAct)
-        
+
         self.hgPurgeListAct = EricAction(
-            self.tr('List Files to be Purged'),
+            self.tr("List Files to be Purged"),
             UI.PixmapCache.getIcon("fileDeleteList"),
-            self.tr('List Files to be Purged...'),
-            0, 0, self, 'mercurial_purge_list')
-        self.hgPurgeListAct.setStatusTip(self.tr(
-            'List files and directories not known to Mercurial'
-        ))
-        self.hgPurgeListAct.setWhatsThis(self.tr(
-            """<b>List Files to be Purged</b>"""
-            """<p>This lists files and directories not known to Mercurial."""
-            """ These would be deleted by the "Purge Files" menu entry.</p>"""
-        ))
+            self.tr("List Files to be Purged..."),
+            0,
+            0,
+            self,
+            "mercurial_purge_list",
+        )
+        self.hgPurgeListAct.setStatusTip(
+            self.tr("List files and directories not known to Mercurial")
+        )
+        self.hgPurgeListAct.setWhatsThis(
+            self.tr(
+                """<b>List Files to be Purged</b>"""
+                """<p>This lists files and directories not known to Mercurial."""
+                """ These would be deleted by the "Purge Files" menu entry.</p>"""
+            )
+        )
         self.hgPurgeListAct.triggered.connect(self.__hgPurgeList)
         self.actions.append(self.hgPurgeListAct)
-        
+
         self.hgPurgeAllListAct = EricAction(
-            self.tr('List All Files to be Purged'),
-            self.tr('List All Files to be Purged...'),
-            0, 0, self, 'mercurial_purge_all_list')
-        self.hgPurgeAllListAct.setStatusTip(self.tr(
-            'List files and directories not known to Mercurial including'
-            ' ignored ones'
-        ))
-        self.hgPurgeAllListAct.setWhatsThis(self.tr(
-            """<b>List All Files to be Purged</b>"""
-            """<p>This lists files and directories not known to Mercurial"""
-            """ including ignored ones. These would be deleted by the"""
-            """ "Purge All Files" menu entry.</p>"""
-        ))
+            self.tr("List All Files to be Purged"),
+            self.tr("List All Files to be Purged..."),
+            0,
+            0,
+            self,
+            "mercurial_purge_all_list",
+        )
+        self.hgPurgeAllListAct.setStatusTip(
+            self.tr(
+                "List files and directories not known to Mercurial including"
+                " ignored ones"
+            )
+        )
+        self.hgPurgeAllListAct.setWhatsThis(
+            self.tr(
+                """<b>List All Files to be Purged</b>"""
+                """<p>This lists files and directories not known to Mercurial"""
+                """ including ignored ones. These would be deleted by the"""
+                """ "Purge All Files" menu entry.</p>"""
+            )
+        )
         self.hgPurgeAllListAct.triggered.connect(self.__hgPurgeAllList)
         self.actions.append(self.hgPurgeAllListAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("fileDelete"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgPurgeAct)
         menu.addAction(self.hgPurgeAllAct)
         menu.addSeparator()
         menu.addAction(self.hgPurgeListAct)
         menu.addAction(self.hgPurgeAllListAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Purge")
-    
+
     def __hgPurge(self):
         """
         Private slot used to remove files not tracked by Mercurial.
         """
         self.vcs.getExtensionObject("purge").hgPurge(deleteAll=False)
-    
+
     def __hgPurgeAll(self):
         """
         Private slot used to remove all files not tracked by Mercurial.
         """
         self.vcs.getExtensionObject("purge").hgPurge(deleteAll=True)
-    
+
     def __hgPurgeList(self):
         """
         Private slot used to list files not tracked by Mercurial.
         """
         self.vcs.getExtensionObject("purge").hgPurgeList(deleteAll=False)
-    
+
     def __hgPurgeAllList(self):
         """
         Private slot used to list all files not tracked by Mercurial.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/purge.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/purge.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,27 +17,28 @@
     """
     Class implementing the purge extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-        
+
         self.purgeListDialog = None
-    
+
     def shutdown(self):
         """
         Public method used to shutdown the purge interface.
         """
         if self.purgeListDialog is not None:
             self.purgeListDialog.close()
-    
+
     def __getEntries(self, deleteAll):
         """
         Private method to get a list of files/directories being purged.
-        
+
         @param deleteAll flag indicating to delete all files including ignored
             ones
         @type bool
@@ -45,23 +46,23 @@
         @rtype str
         """
         purgeEntries = []
-        
+
         args = self.vcs.initCommand("purge")
         args.append("--print")
         if deleteAll:
             args.append("--all")
-        
+
         client = self.vcs.getClient()
         out, err = client.runcommand(args)
         if out:
             purgeEntries = out.strip().split()
-        
+
         return purgeEntries
-    
+
     def hgPurge(self, deleteAll=False):
         """
         Public method to purge files and directories not tracked by Mercurial.
-        
+
         @param deleteAll flag indicating to delete all files including ignored
             ones
         @type bool
@@ -70,35 +71,37 @@
             title = self.tr("Purge All Files")
             message = self.tr(
                 """Do really want to delete all files not tracked by"""
-                """ Mercurial (including ignored ones)?""")
+                """ Mercurial (including ignored ones)?"""
+            )
         else:
             title = self.tr("Purge Files")
             message = self.tr(
-                """Do really want to delete files not tracked by Mercurial?""")
+                """Do really want to delete files not tracked by Mercurial?"""
+            )
         entries = self.__getEntries(deleteAll)
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(None, title, message, entries)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             args = self.vcs.initCommand("purge")
             if deleteAll:
                 args.append("--all")
             args.append("-v")
-            
+
             dia = HgDialog(title, self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgPurgeList(self, deleteAll=False):
         """
         Public method to list files and directories not tracked by Mercurial.
-        
+
         @param deleteAll flag indicating to list all files including ignored
             ones (boolean)
         """
         entries = self.__getEntries(deleteAll)
         from .HgPurgeListDialog import HgPurgeListDialog
+
         self.purgeListDialog = HgPurgeListDialog(entries)
         self.purgeListDialog.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesDefineGuardsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesDefineGuardsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton, QListWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, QListWidgetItem
 
 from EricWidgets import EricMessageBox
 
@@ -23,10 +21,11 @@
     """
     Class implementing a dialog to define guards for patches.
     """
+
     def __init__(self, vcs, extension, patchesList, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param extension reference to the extension module (Queues)
         @param patchesList list of patches (list of strings)
@@ -35,59 +34,62 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.vcs = vcs
         self.extension = extension
         self.__hgClient = vcs.getClient()
-        
+
         self.__patches = patchesList[:]
         self.patchSelector.addItems([""] + self.__patches)
-        
+
         self.plusButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.minusButton.setIcon(UI.PixmapCache.getIcon("minus"))
-        
+
         self.__dirtyList = False
         self.__currentPatch = ""
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         if self.__dirtyList:
             res = EricMessageBox.question(
                 self,
                 self.tr("Unsaved Changes"),
-                self.tr("""The guards list has been changed."""
-                        """ Shall the changes be applied?"""),
+                self.tr(
+                    """The guards list has been changed."""
+                    """ Shall the changes be applied?"""
+                ),
                 EricMessageBox.Apply | EricMessageBox.Discard,
-                EricMessageBox.Apply)
+                EricMessageBox.Apply,
+            )
             if res == EricMessageBox.Apply:
                 self.__applyGuards()
             else:
                 self.__dirtyList = False
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         self.on_patchSelector_activated(0)
-    
+
     @pyqtSlot(int)
     def on_patchSelector_activated(self, index):
         """
         Private slot to get the list of guards defined for the given patch
         name.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -96,29 +98,32 @@
             res = EricMessageBox.question(
                 self,
                 self.tr("Unsaved Changes"),
-                self.tr("""The guards list has been changed."""
-                        """ Shall the changes be applied?"""),
+                self.tr(
+                    """The guards list has been changed."""
+                    """ Shall the changes be applied?"""
+                ),
                 EricMessageBox.Apply | EricMessageBox.Discard,
-                EricMessageBox.Apply)
+                EricMessageBox.Apply,
+            )
             if res == EricMessageBox.Apply:
                 self.__applyGuards()
             else:
                 self.__dirtyList = False
-        
+
         self.guardsList.clear()
         self.patchNameLabel.setText("")
-        
+
         self.guardCombo.clear()
         guardsList = self.extension.getGuardsList()
         self.guardCombo.addItems(guardsList)
         self.guardCombo.setEditText("")
-        
+
         args = self.vcs.initCommand("qguard")
         if patch:
             args.append(patch)
-        
+
         output = self.__hgClient.runcommand(args)[0]
-        
+
         if output:
             patchName, guards = output.split(":", 1)
             self.patchNameLabel.setText(patchName)
@@ -136,40 +141,38 @@
                     continue
                 itm = QListWidgetItem(icon, guard, self.guardsList)
                 itm.setData(Qt.ItemDataRole.UserRole, sign)
-        
+
         self.on_guardsList_itemSelectionChanged()
-    
+
     @pyqtSlot()
     def on_guardsList_itemSelectionChanged(self):
         """
         Private slot to handle changes of the selection of guards.
         """
-        self.removeButton.setEnabled(
-            len(self.guardsList.selectedItems()) > 0)
-    
+        self.removeButton.setEnabled(len(self.guardsList.selectedItems()) > 0)
+
     def __getGuard(self, guard):
         """
         Private method to get a reference to a named guard.
-        
+
         @param guard name of the guard (string)
         @return reference to the guard item (QListWidgetItem)
         """
-        items = self.guardsList.findItems(
-            guard, Qt.MatchFlag.MatchCaseSensitive)
+        items = self.guardsList.findItems(guard, Qt.MatchFlag.MatchCaseSensitive)
         if items:
             return items[0]
         else:
             return None
-    
+
     @pyqtSlot(str)
     def on_guardCombo_editTextChanged(self, txt):
         """
         Private slot to handle changes of the text of the guard combo.
-        
+
         @param txt contents of the guard combo line edit (string)
         """
         self.addButton.setEnabled(txt != "")
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -182,20 +185,20 @@
         else:
             sign = "-"
             icon = UI.PixmapCache.getIcon("minus")
-        
+
         guardItem = self.__getGuard(guard)
         if guardItem:
             # guard already exists, remove it first
             row = self.guardsList.row(guardItem)
             itm = self.guardsList.takeItem(row)
             del itm
-        
+
         itm = QListWidgetItem(icon, guard, self.guardsList)
         itm.setData(Qt.ItemDataRole.UserRole, sign)
         self.guardsList.sortItems()
-        
+
         self.__dirtyList = True
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -204,32 +207,28 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Remove Guards"),
-            self.tr(
-                """Do you really want to remove the selected guards?"""))
+            self.tr("""Do you really want to remove the selected guards?"""),
+        )
         if res:
             for guardItem in self.guardsList.selectedItems():
                 row = self.guardsList.row(guardItem)
-                itm = self.guardsList.takeItem(row)        # __IGNORE_WARNING__
+                itm = self.guardsList.takeItem(row)  # __IGNORE_WARNING__
                 del itm
-        
+
         self.__dirtyList = True
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Apply
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Apply):
             self.__applyGuards()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-    
+
     @pyqtSlot()
     def __applyGuards(self):
         """
@@ -241,7 +240,7 @@
                 itm = self.guardsList.item(row)
                 guard = itm.data(Qt.ItemDataRole.UserRole) + itm.text()
                 guardsList.append(guard)
-            
+
             args = self.vcs.initCommand("qguard")
             args.append(self.patchNameLabel.text())
             if guardsList:
@@ -249,16 +248,18 @@
                 args.extend(guardsList)
             else:
                 args.append("--none")
-            
+
             error = self.__hgClient.runcommand(args)[1]
-            
+
             if error:
                 EricMessageBox.warning(
                     self,
                     self.tr("Apply Guard Definitions"),
-                    self.tr("""<p>The defined guards could not be"""
-                            """ applied.</p><p>Reason: {0}</p>""")
-                    .format(error))
+                    self.tr(
+                        """<p>The defined guards could not be"""
+                        """ applied.</p><p>Reason: {0}</p>"""
+                    ).format(error),
+                )
             else:
                 self.__dirtyList = False
                 index = self.patchSelector.findText(self.patchNameLabel.text())
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesFoldDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesFoldDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,135 +21,136 @@
     """
     Class implementing a dialog to enter data to fold patches.
     """
+
     def __init__(self, patchesList, parent=None):
         """
         Constructor
-        
+
         @param patchesList list of patches to select from (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.removeButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.messageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-        
+        self.messageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
         for patch in patchesList:
             name, summary = patch.split("@@")
             QTreeWidgetItem(self.sourcePatches, [name, summary])
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def __updateOkButton(self):
         """
         Private slot to update the status of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.selectedPatches.topLevelItemCount() != 0)
-    
+            self.selectedPatches.topLevelItemCount() != 0
+        )
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to add a patch to the list of selected patches.
         """
-        row = self.sourcePatches.indexOfTopLevelItem(
-            self.sourcePatches.currentItem())
+        row = self.sourcePatches.indexOfTopLevelItem(self.sourcePatches.currentItem())
         itm = self.sourcePatches.takeTopLevelItem(row)
-        
+
         curItm = self.selectedPatches.currentItem()
         if curItm is not None:
             row = self.selectedPatches.indexOfTopLevelItem(curItm) + 1
             self.selectedPatches.insertTopLevelItem(row, itm)
         else:
             self.selectedPatches.addTopLevelItem(itm)
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
         Private slot to remove a patch from the list of selected patches.
         """
         row = self.selectedPatches.indexOfTopLevelItem(
-            self.selectedPatches.currentItem())
+            self.selectedPatches.currentItem()
+        )
         itm = self.selectedPatches.takeTopLevelItem(row)
         self.sourcePatches.addTopLevelItem(itm)
         self.sourcePatches.sortItems(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
         Private slot to move a patch up in the list.
         """
         row = self.selectedPatches.indexOfTopLevelItem(
-            self.selectedPatches.currentItem())
+            self.selectedPatches.currentItem()
+        )
         if row > 0:
             targetRow = row - 1
             itm = self.selectedPatches.takeTopLevelItem(row)
             self.selectedPatches.insertTopLevelItem(targetRow, itm)
             self.selectedPatches.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
         Private slot to move a patch down in the list.
         """
         row = self.selectedPatches.indexOfTopLevelItem(
-            self.selectedPatches.currentItem())
+            self.selectedPatches.currentItem()
+        )
         if row < self.selectedPatches.topLevelItemCount() - 1:
             targetRow = row + 1
             itm = self.selectedPatches.takeTopLevelItem(row)
             self.selectedPatches.insertTopLevelItem(targetRow, itm)
             self.selectedPatches.setCurrentItem(itm)
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_sourcePatches_currentItemChanged(self, current, previous):
         """
         Private slot to react on changes of the current item of source patches.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the previous current item
             (QTreeWidgetItem)
         """
         self.addButton.setEnabled(current is not None)
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_selectedPatches_currentItemChanged(self, current, previous):
         """
         Private slot to react on changes of the current item of selected
         patches.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the previous current item
             (QTreeWidgetItem)
         """
         self.removeButton.setEnabled(current is not None)
-        
+
         row = self.selectedPatches.indexOfTopLevelItem(current)
         self.upButton.setEnabled(row > 0)
-        self.downButton.setEnabled(
-            row < self.selectedPatches.topLevelItemCount() - 1)
-    
+        self.downButton.setEnabled(row < self.selectedPatches.topLevelItemCount() - 1)
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple of commit message and list of selected patches
             (string, list of strings)
         """
         patchesList = []
         for row in range(self.selectedPatches.topLevelItemCount()):
             patchesList.append(self.selectedPatches.topLevelItem(row).text(0))
-        
+
         return self.messageEdit.toPlainText(), patchesList
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesGuardsSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesGuardsSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,7 +8,10 @@
 """
 
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QListWidgetItem, QAbstractItemView
+    QDialog,
+    QDialogButtonBox,
+    QListWidgetItem,
+    QAbstractItemView,
 )
 
 from .Ui_HgQueuesGuardsSelectionDialog import Ui_HgQueuesGuardsSelectionDialog
@@ -18,10 +21,11 @@
     """
     Class implementing a dialog to select a list of guards.
     """
+
     def __init__(self, guards, activeGuards=None, listOnly=False, parent=None):
         """
         Constructor
-        
+
         @param guards list of guards to select from (list of strings)
         @param activeGuards list of active guards (list of strings)
         @param listOnly flag indicating to only list the guards (boolean)
@@ -29,7 +33,7 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for guard in guards:
             itm = QListWidgetItem(guard, self.guardsList)
             if activeGuards is not None and guard in activeGuards:
@@ -37,23 +41,23 @@
                 font.setBold(True)
                 itm.setFont(font)
         self.guardsList.sortItems()
-        
+
         if listOnly:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).hide()
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).hide()
             self.guardsList.setSelectionMode(
-                QAbstractItemView.SelectionMode.NoSelection)
+                QAbstractItemView.SelectionMode.NoSelection
+            )
             self.setWindowTitle(self.tr("Active Guards"))
-    
+
     def getData(self):
         """
         Public method to retrieve the data.
-        
+
         @return list of selected guards (list of strings)
         """
         guardsList = []
-        
+
         for itm in self.guardsList.selectedItems():
             guardsList.append(itm.text())
-        
+
         return guardsList
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesHeaderDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesHeaderDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,99 +20,92 @@
     Class implementing a dialog to show the commit message of the current
     patch.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         self.activateWindow()
-        
+
         args = self.vcs.initCommand("qheader")
-        
+
         out, err = self.__hgClient.runcommand(
-            args, output=self.__showOutput, error=self.__showError)
+            args, output=self.__showOutput, error=self.__showError
+        )
         if err:
             self.__showError(err)
         if out:
             self.__showOutPut(out)
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             if self.__hgClient:
                 self.__hgClient.cancel()
             else:
                 self.__finish()
-    
+
     def __showOutput(self, out):
         """
         Private slot to show some output.
-        
+
         @param out output to be shown (string)
         """
         self.messageEdit.appendPlainText(Utilities.filterAnsiSequences(out))
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.messageEdit.appendPlainText(self.tr("Error: "))
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListAllGuardsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListAllGuardsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,32 +19,33 @@
     """
     Class implementing a dialog to show all guards for all patches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the VCS object (Hg)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         args = self.vcs.initCommand("qguard")
         args.append("--list")
-        
+
         output = self.__hgClient.runcommand(args)[0]
-        
+
         if output:
             guardsDict = {}
             for line in output.splitlines():
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QHeaderView, QTreeWidgetItem
 
 from .Ui_HgQueuesListDialog import Ui_HgQueuesListDialog
 
@@ -20,63 +18,61 @@
     Class implementing a dialog to show a list of applied and unapplied
     patches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
-        self.patchesList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+
+        self.patchesList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.__statusDict = {
             "A": self.tr("applied"),
             "U": self.tr("not applied"),
             "G": self.tr("guarded"),
             "D": self.tr("missing"),
         }
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         self.errorGroup.hide()
         self.activateWindow()
-        
+
         self.__getSeries()
-    
+
     def __getSeries(self, missing=False):
         """
         Private slot to get the list of applied, unapplied and guarded patches
         and patches missing in the series file.
-        
+
         @param missing flag indicating to get the patches missing in the
             series file (boolean)
         """
@@ -84,13 +80,13 @@
             self.__mode = "missing"
         else:
             self.__mode = "qseries"
-        
+
         args = self.vcs.initCommand("qseries")
-        args.append('--summary')
-        args.append('--verbose')
+        args.append("--summary")
+        args.append("--verbose")
         if missing:
-            args.append('--missing')
-        
+            args.append("--missing")
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -106,15 +102,15 @@
             self.__getTop()
         else:
             self.__finish()
-    
+
     def __getTop(self):
         """
         Private slot to get patch at the top of the stack.
         """
         self.__mode = "qtop"
-        
+
         args = self.vcs.initCommand("qtop")
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -124,65 +120,59 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if self.patchesList.topLevelItemCount() == 0:
             # no patches present
-            self.__generateItem(
-                0, "", self.tr("no patches found"), "", True)
+            self.__generateItem(0, "", self.tr("no patches found"), "", True)
         self.__resizeColumns()
         self.__resort()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__mode = ""
             self.__hgClient.cancel()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.patchesList.sortItems(
             self.patchesList.sortColumn(),
-            self.patchesList.header().sortIndicatorOrder())
-    
+            self.patchesList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.patchesList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.patchesList.header().setStretchLastSection(True)
-    
+
     def __generateItem(self, index, status, name, summary, error=False):
         """
         Private method to generate a patch item in the list of patches.
-        
+
         @param index index of the patch (integer, -1 for missing)
         @param status status of the patch (string)
         @param name name of the patch (string)
@@ -190,12 +180,7 @@
         @param error flag indicating an error entry (boolean)
         """
         if error:
-            itm = QTreeWidgetItem(self.patchesList, [
-                "",
-                name,
-                "",
-                summary
-            ])
+            itm = QTreeWidgetItem(self.patchesList, ["", name, "", summary])
         else:
             if index == -1:
                 index = ""
@@ -216,29 +201,28 @@
                 # missing
                 for column in range(itm.columnCount()):
                     itm.setForeground(column, Qt.GlobalColor.red)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
-    
+
     def __markTopItem(self, name):
         """
         Private slot to mark the top patch entry.
-        
+
         @param name name of the patch (string)
         """
-        items = self.patchesList.findItems(
-            name, Qt.MatchFlag.MatchCaseSensitive, 1)
+        items = self.patchesList.findItems(name, Qt.MatchFlag.MatchCaseSensitive, 1)
         if items:
             itm = items[0]
             for column in range(itm.columnCount()):
                 font = itm.font(column)
                 font.setBold(True)
                 itm.setFont(column, font)
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         if self.__mode == "qtop":
@@ -258,11 +242,11 @@
             else:
                 return
             self.__generateItem(index, status, name, summary)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListGuardsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListGuardsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to show the guards of a selected patch.
     """
+
     def __init__(self, vcs, patchesList, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param patchesList list of patches (list of strings)
         @param parent reference to the parent widget (QWidget)
@@ -30,50 +31,50 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
-        
+
         self.patchSelector.addItems([""] + patchesList)
-        
+
         self.show()
         QCoreApplication.processEvents()
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         e.accept()
-    
+
     def start(self):
         """
         Public slot to start the list command.
         """
         self.on_patchSelector_activated(0)
-    
+
     @pyqtSlot(int)
     def on_patchSelector_activated(self, index):
         """
         Private slot to get the list of guards for the given patch name.
-        
+
         @param index index of the selected entry
         @type int
         """
         patch = self.patchSelector.itemText(index)
         self.guardsList.clear()
         self.patchNameLabel.setText("")
-        
+
         args = self.vcs.initCommand("qguard")
         if patch:
             args.append(patch)
-        
+
         output = self.__hgClient.runcommand(args)[0].strip()
-        
+
         if output:
             patchName, guards = output.split(":", 1)
             self.patchNameLabel.setText(patchName)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesNewPatchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesNewPatchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,13 +19,14 @@
     """
     Class implementing a dialog to get the data for a new patch.
     """
+
     NEW_MODE = 0
     REFRESH_MODE = 1
-    
+
     def __init__(self, mode, message="", parent=None):
         """
         Constructor
-        
+
         @param mode mode of the dialog (HgQueuesNewPatchDialog.NEW_MODE,
             HgQueuesNewPatchDialog.REFRESH_MODE)
         @param message text to set as the commit message (string)
@@ -34,95 +35,92 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        if mode not in (HgQueuesNewPatchDialog.REFRESH_MODE,
-                        HgQueuesNewPatchDialog.NEW_MODE):
+
+        if mode not in (
+            HgQueuesNewPatchDialog.REFRESH_MODE,
+            HgQueuesNewPatchDialog.NEW_MODE,
+        ):
             raise ValueError("invalid value for mode")
-        
+
         self.__mode = mode
         if self.__mode == HgQueuesNewPatchDialog.REFRESH_MODE:
             self.nameLabel.hide()
             self.nameEdit.hide()
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
-        self.messageEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
+        self.messageEdit.setLanguageWithPWL(language, pwl or None, pel or None)
         if message:
             self.messageEdit.setPlainText(message)
-        
+
         self.dateTimeEdit.setDateTime(QDateTime.currentDateTime())
-        
+
         self.__updateUI()
-    
+
     def __updateUI(self):
         """
         Private slot to update the UI.
         """
         enable = (
             self.messageEdit.toPlainText() != ""
-            if self.__mode == HgQueuesNewPatchDialog.REFRESH_MODE else
-            (self.nameEdit.text() != "" and
-             self.messageEdit.toPlainText() != "")
+            if self.__mode == HgQueuesNewPatchDialog.REFRESH_MODE
+            else (self.nameEdit.text() != "" and self.messageEdit.toPlainText() != "")
         )
         if self.userGroup.isChecked():
-            enable = (
-                enable and
-                (self.currentUserCheckBox.isChecked() or
-                 self.userEdit.text() != "")
+            enable = enable and (
+                self.currentUserCheckBox.isChecked() or self.userEdit.text() != ""
             )
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the patch name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUI()
-    
+
     @pyqtSlot()
     def on_messageEdit_textChanged(self):
         """
         Private slot to handle changes of the patch message.
         """
         self.__updateUI()
-    
+
     @pyqtSlot(bool)
     def on_userGroup_toggled(self, checked):
         """
         Private slot to handle changes of the user group state.
-        
+
         @param checked flag giving the checked state (boolean)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(bool)
     def on_currentUserCheckBox_toggled(self, checked):
         """
         Private slot to handle changes of the currentuser state.
-        
+
         @param checked flag giving the checked state (boolean)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(str)
     def on_userEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the user name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUI()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple giving the patch name and message, a tuple giving a
             flag indicating to set the user, a flag indicating to use the
             current user and the user name and another tuple giving a flag
@@ -130,11 +128,19 @@
             current date and the date (string, string, (boolean, boolean,
             string), (boolean, boolean, string))
         """
-        userData = (self.userGroup.isChecked(),
-                    self.currentUserCheckBox.isChecked(),
-                    self.userEdit.text())
-        dateData = (self.dateGroup.isChecked(),
-                    self.currentDateCheckBox.isChecked(),
-                    self.dateTimeEdit.dateTime().toString("yyyy-MM-dd hh:mm"))
-        return (self.nameEdit.text().replace(" ", "_"),
-                self.messageEdit.toPlainText(), userData, dateData)
+        userData = (
+            self.userGroup.isChecked(),
+            self.currentUserCheckBox.isChecked(),
+            self.userEdit.text(),
+        )
+        dateData = (
+            self.dateGroup.isChecked(),
+            self.currentDateCheckBox.isChecked(),
+            self.dateTimeEdit.dateTime().toString("yyyy-MM-dd hh:mm"),
+        )
+        return (
+            self.nameEdit.text().replace(" ", "_"),
+            self.messageEdit.toPlainText(),
+            userData,
+            dateData,
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication
 from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractItemView, QListWidgetItem,
-    QAbstractButton
+    QDialog,
+    QDialogButtonBox,
+    QAbstractItemView,
+    QListWidgetItem,
+    QAbstractButton,
 )
 
 from .Ui_HgQueuesQueueManagementDialog import Ui_HgQueuesQueueManagementDialog
@@ -20,14 +23,15 @@
     """
     Class implementing a dialog used by the queue management functions.
     """
+
     NO_INPUT = 0
     NAME_INPUT = 1
     QUEUE_INPUT = 2
-    
+
     def __init__(self, mode, title, suppressActive, vcs, parent=None):
         """
         Constructor
-        
+
         @param mode mode of the dialog (HgQueuesQueueManagementDialog.NO_INPUT
             HgQueuesQueueManagementDialog.NAME_INPUT,
             HgQueuesQueueManagementDialog.QUEUE_INPUT)
@@ -41,114 +45,117 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        if mode not in (HgQueuesQueueManagementDialog.NO_INPUT,
-                        HgQueuesQueueManagementDialog.NAME_INPUT,
-                        HgQueuesQueueManagementDialog.QUEUE_INPUT):
+
+        if mode not in (
+            HgQueuesQueueManagementDialog.NO_INPUT,
+            HgQueuesQueueManagementDialog.NAME_INPUT,
+            HgQueuesQueueManagementDialog.QUEUE_INPUT,
+        ):
             raise ValueError("illegal value for mode")
-        
+
         self.__mode = mode
         self.__suppressActive = suppressActive
         self.__hgClient = vcs.getClient()
         self.vcs = vcs
-        
-        self.inputFrame.setHidden(
-            mode != HgQueuesQueueManagementDialog.NAME_INPUT)
-        self.selectLabel.setHidden(
-            mode != HgQueuesQueueManagementDialog.QUEUE_INPUT)
+
+        self.inputFrame.setHidden(mode != HgQueuesQueueManagementDialog.NAME_INPUT)
+        self.selectLabel.setHidden(mode != HgQueuesQueueManagementDialog.QUEUE_INPUT)
         if mode != HgQueuesQueueManagementDialog.QUEUE_INPUT:
             self.queuesList.setSelectionMode(
-                QAbstractItemView.SelectionMode.NoSelection)
-        
+                QAbstractItemView.SelectionMode.NoSelection
+            )
+
         if mode == HgQueuesQueueManagementDialog.NO_INPUT:
             self.buttonBox.removeButton(
-                self.buttonBox.button(QDialogButtonBox.StandardButton.Ok))
+                self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+            )
             self.buttonBox.removeButton(
-                self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel))
+                self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel)
+            )
             self.refreshButton = self.buttonBox.addButton(
-                self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-            self.refreshButton.setToolTip(
-                self.tr("Press to refresh the queues list"))
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setDefault(True)
+                self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+            )
+            self.refreshButton.setToolTip(self.tr("Press to refresh the queues list"))
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(
+                True
+            )
         else:
             self.buttonBox.removeButton(
-                self.buttonBox.button(QDialogButtonBox.StandardButton.Close))
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+                self.buttonBox.button(QDialogButtonBox.StandardButton.Close)
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
             self.refreshButton = None
-        
+
         self.setWindowTitle(title)
-        
+
         self.show()
         QCoreApplication.processEvents()
-        
+
         self.refresh()
-    
+
     def __getQueuesList(self):
         """
         Private method to get a list of all queues and the name of the active
         queue.
-        
+
         @return tuple with a list of all queues and the name of the active
             queue (list of strings, string)
         """
         queuesList = []
         activeQueue = ""
-        
+
         args = self.vcs.initCommand("qqueue")
         args.append("--list")
-        
+
         output = self.__hgClient.runcommand(args)[0]
-        
+
         for queue in output.splitlines():
             queue = queue.strip()
             if queue.endswith(")"):
                 queue = queue.rsplit(None, 1)[0]
                 activeQueue = queue
             queuesList.append(queue)
-        
+
         if self.__suppressActive:
             if activeQueue in queuesList:
                 queuesList.remove(activeQueue)
             activeQueue = ""
         return queuesList, activeQueue
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the entered queue name.
-        
+
         @param txt text of the edit (string)
         """
         if self.__mode == HgQueuesQueueManagementDialog.NAME_INPUT:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(txt != "")
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                txt != ""
+            )
+
     @pyqtSlot()
     def on_queuesList_itemSelectionChanged(self):
         """
         Private slot to handle changes of selected queue names.
         """
         if self.__mode == HgQueuesQueueManagementDialog.QUEUE_INPUT:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(
-                    len(self.queuesList.selectedItems()) > 0)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                len(self.queuesList.selectedItems()) > 0
+            )
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.refreshButton:
             self.refresh()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-    
+
     def refresh(self):
         """
         Public slot to refresh the list of queues.
@@ -161,11 +168,11 @@
                 font = itm.font()
                 font.setBold(True)
                 itm.setFont(font)
-    
+
     def getData(self):
         """
         Public slot to get the data.
-        
+
         @return queue name (string)
         """
         name = ""
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesRenamePatchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesRenamePatchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,27 +17,26 @@
     """
     Class implementing a dialog to enter the data to rename a patch.
     """
+
     def __init__(self, currentPatch, patchesList, parent=None):
         """
         Constructor
-        
+
         @param currentPatch name of the current patch (string)
         @param patchesList list of patches to select from (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.currentButton.setText(
-            self.tr("Current Patch ({0})").format(currentPatch))
+
+        self.currentButton.setText(self.tr("Current Patch ({0})").format(currentPatch))
         self.nameCombo.addItems([""] + patchesList)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateUI(self):
         """
         Private slot to update the UI.
@@ -45,46 +44,45 @@
         enable = self.nameEdit.text() != ""
         if self.namedButton.isChecked():
             enable = enable and self.nameCombo.currentText() != ""
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the new name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(bool)
     def on_namedButton_toggled(self, checked):
         """
         Private slot to handle changes of the selection method.
-        
+
         @param checked state of the check box (boolean)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(int)
     def on_nameCombo_currentIndexChanged(self, index):
         """
         Private slot to handle changes of the selected patch name.
-        
+
         @param index current index
         @type int
         """
         self.__updateUI()
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple of new name and selected patch (string, string)
         """
         selectedPatch = ""
         if self.namedButton.isChecked():
             selectedPatch = self.nameCombo.currentText()
-        
+
         return self.nameEdit.text().replace(" ", "_"), selectedPatch
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,675 +21,869 @@
     """
     Class implementing the queues extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgQueueInitAct = EricAction(
-            self.tr('Init Queue Repository'),
-            self.tr('Init Queue Repository'),
-            0, 0, self, 'mercurial_queues_init')
-        self.hgQueueInitAct.setStatusTip(self.tr(
-            'Initialize a new versioned queue repository'
-        ))
-        self.hgQueueInitAct.setWhatsThis(self.tr(
-            """<b>Init Queue Repository</b>"""
-            """<p>This initializes a new versioned queue repository inside"""
-            """ the current repository.</p>"""
-        ))
+            self.tr("Init Queue Repository"),
+            self.tr("Init Queue Repository"),
+            0,
+            0,
+            self,
+            "mercurial_queues_init",
+        )
+        self.hgQueueInitAct.setStatusTip(
+            self.tr("Initialize a new versioned queue repository")
+        )
+        self.hgQueueInitAct.setWhatsThis(
+            self.tr(
+                """<b>Init Queue Repository</b>"""
+                """<p>This initializes a new versioned queue repository inside"""
+                """ the current repository.</p>"""
+            )
+        )
         self.hgQueueInitAct.triggered.connect(self.__hgQueueInit)
         self.actions.append(self.hgQueueInitAct)
-        
+
         self.hgQueueCommitAct = EricAction(
-            self.tr('Commit changes'),
-            self.tr('Commit changes...'),
-            0, 0, self, 'mercurial_queues_commit')
-        self.hgQueueCommitAct.setStatusTip(self.tr(
-            'Commit changes in the queue repository'
-        ))
-        self.hgQueueCommitAct.setWhatsThis(self.tr(
-            """<b>Commit changes...</b>"""
-            """<p>This commits changes in the queue repository.</p>"""
-        ))
+            self.tr("Commit changes"),
+            self.tr("Commit changes..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_commit",
+        )
+        self.hgQueueCommitAct.setStatusTip(
+            self.tr("Commit changes in the queue repository")
+        )
+        self.hgQueueCommitAct.setWhatsThis(
+            self.tr(
+                """<b>Commit changes...</b>"""
+                """<p>This commits changes in the queue repository.</p>"""
+            )
+        )
         self.hgQueueCommitAct.triggered.connect(self.__hgQueueCommit)
         self.actions.append(self.hgQueueCommitAct)
-        
+
         self.hgQueueNewAct = EricAction(
-            self.tr('New Patch'),
-            self.tr('New Patch...'),
-            0, 0, self, 'mercurial_queues_new')
-        self.hgQueueNewAct.setStatusTip(self.tr(
-            'Create a new patch'
-        ))
-        self.hgQueueNewAct.setWhatsThis(self.tr(
-            """<b>New Patch</b>"""
-            """<p>This creates a new named patch.</p>"""
-        ))
+            self.tr("New Patch"),
+            self.tr("New Patch..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_new",
+        )
+        self.hgQueueNewAct.setStatusTip(self.tr("Create a new patch"))
+        self.hgQueueNewAct.setWhatsThis(
+            self.tr("""<b>New Patch</b>""" """<p>This creates a new named patch.</p>""")
+        )
         self.hgQueueNewAct.triggered.connect(self.__hgQueueNewPatch)
         self.actions.append(self.hgQueueNewAct)
-        
+
         self.hgQueueRefreshAct = EricAction(
-            self.tr('Update Current Patch'),
-            self.tr('Update Current Patch'),
-            0, 0, self, 'mercurial_queues_refresh')
-        self.hgQueueRefreshAct.setStatusTip(self.tr(
-            'Update the current patch'
-        ))
-        self.hgQueueRefreshAct.setWhatsThis(self.tr(
-            """<b>Update Current Patch</b>"""
-            """<p>This updates the current patch.</p>"""
-        ))
-        self.hgQueueRefreshAct.triggered.connect(
-            self.__hgQueueRefreshPatch)
+            self.tr("Update Current Patch"),
+            self.tr("Update Current Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_refresh",
+        )
+        self.hgQueueRefreshAct.setStatusTip(self.tr("Update the current patch"))
+        self.hgQueueRefreshAct.setWhatsThis(
+            self.tr(
+                """<b>Update Current Patch</b>"""
+                """<p>This updates the current patch.</p>"""
+            )
+        )
+        self.hgQueueRefreshAct.triggered.connect(self.__hgQueueRefreshPatch)
         self.actions.append(self.hgQueueRefreshAct)
-        
+
         self.hgQueueRefreshMessageAct = EricAction(
-            self.tr('Update Current Patch (with Message)'),
-            self.tr('Update Current Patch (with Message)'),
-            0, 0, self, 'mercurial_queues_refresh_message')
-        self.hgQueueRefreshMessageAct.setStatusTip(self.tr(
-            'Update the current patch and edit commit message'
-        ))
-        self.hgQueueRefreshMessageAct.setWhatsThis(self.tr(
-            """<b>Update Current Patch (with Message)</b>"""
-            """<p>This updates the current patch after giving the chance"""
-            """ to change the current commit message.</p>"""
-        ))
+            self.tr("Update Current Patch (with Message)"),
+            self.tr("Update Current Patch (with Message)"),
+            0,
+            0,
+            self,
+            "mercurial_queues_refresh_message",
+        )
+        self.hgQueueRefreshMessageAct.setStatusTip(
+            self.tr("Update the current patch and edit commit message")
+        )
+        self.hgQueueRefreshMessageAct.setWhatsThis(
+            self.tr(
+                """<b>Update Current Patch (with Message)</b>"""
+                """<p>This updates the current patch after giving the chance"""
+                """ to change the current commit message.</p>"""
+            )
+        )
         self.hgQueueRefreshMessageAct.triggered.connect(
-            self.__hgQueueRefreshPatchMessage)
+            self.__hgQueueRefreshPatchMessage
+        )
         self.actions.append(self.hgQueueRefreshMessageAct)
-        
+
         self.hgQueueDiffAct = EricAction(
-            self.tr('Show Current Patch'),
-            self.tr('Show Current Patch...'),
-            0, 0, self, 'mercurial_queues_show')
-        self.hgQueueDiffAct.setStatusTip(self.tr(
-            'Show the contents the current patch'
-        ))
-        self.hgQueueDiffAct.setWhatsThis(self.tr(
-            """<b>Show Current Patch</b>"""
-            """<p>This shows the contents of the current patch including"""
-            """ any changes which have been made in the working directory"""
-            """ since the last refresh.</p>"""
-        ))
+            self.tr("Show Current Patch"),
+            self.tr("Show Current Patch..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_show",
+        )
+        self.hgQueueDiffAct.setStatusTip(self.tr("Show the contents the current patch"))
+        self.hgQueueDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show Current Patch</b>"""
+                """<p>This shows the contents of the current patch including"""
+                """ any changes which have been made in the working directory"""
+                """ since the last refresh.</p>"""
+            )
+        )
         self.hgQueueDiffAct.triggered.connect(self.__hgQueueShowPatch)
         self.actions.append(self.hgQueueDiffAct)
-        
+
         self.hgQueueHeaderAct = EricAction(
-            self.tr('Show Current Message'),
-            self.tr('Show Current Message...'),
-            0, 0, self, 'mercurial_queues_show_message')
-        self.hgQueueHeaderAct.setStatusTip(self.tr(
-            'Show the commit message of the current patch'
-        ))
-        self.hgQueueHeaderAct.setWhatsThis(self.tr(
-            """<b>Show Current Message</b>"""
-            """<p>This shows the commit message of the current patch.</p>"""
-        ))
+            self.tr("Show Current Message"),
+            self.tr("Show Current Message..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_show_message",
+        )
+        self.hgQueueHeaderAct.setStatusTip(
+            self.tr("Show the commit message of the current patch")
+        )
+        self.hgQueueHeaderAct.setWhatsThis(
+            self.tr(
+                """<b>Show Current Message</b>"""
+                """<p>This shows the commit message of the current patch.</p>"""
+            )
+        )
         self.hgQueueHeaderAct.triggered.connect(self.__hgQueueShowHeader)
         self.actions.append(self.hgQueueHeaderAct)
-        
+
         self.hgQueueListAct = EricAction(
-            self.tr('List Patches'),
-            self.tr('List Patches...'),
-            0, 0, self, 'mercurial_queues_list')
-        self.hgQueueListAct.setStatusTip(self.tr(
-            'List applied and unapplied patches'
-        ))
-        self.hgQueueListAct.setWhatsThis(self.tr(
-            """<b>List Patches</b>"""
-            """<p>This lists all applied and unapplied patches.</p>"""
-        ))
+            self.tr("List Patches"),
+            self.tr("List Patches..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_list",
+        )
+        self.hgQueueListAct.setStatusTip(self.tr("List applied and unapplied patches"))
+        self.hgQueueListAct.setWhatsThis(
+            self.tr(
+                """<b>List Patches</b>"""
+                """<p>This lists all applied and unapplied patches.</p>"""
+            )
+        )
         self.hgQueueListAct.triggered.connect(self.__hgQueueListPatches)
         self.actions.append(self.hgQueueListAct)
-        
+
         self.hgQueueFinishAct = EricAction(
-            self.tr('Finish Applied Patches'),
-            self.tr('Finish Applied Patches'),
-            0, 0, self, 'mercurial_queues_finish_applied')
-        self.hgQueueFinishAct.setStatusTip(self.tr(
-            'Finish applied patches'
-        ))
-        self.hgQueueFinishAct.setWhatsThis(self.tr(
-            """<b>Finish Applied Patches</b>"""
-            """<p>This finishes the applied patches by moving them out of"""
-            """ mq control into regular repository history.</p>"""
-        ))
-        self.hgQueueFinishAct.triggered.connect(
-            self.__hgQueueFinishAppliedPatches)
+            self.tr("Finish Applied Patches"),
+            self.tr("Finish Applied Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_finish_applied",
+        )
+        self.hgQueueFinishAct.setStatusTip(self.tr("Finish applied patches"))
+        self.hgQueueFinishAct.setWhatsThis(
+            self.tr(
+                """<b>Finish Applied Patches</b>"""
+                """<p>This finishes the applied patches by moving them out of"""
+                """ mq control into regular repository history.</p>"""
+            )
+        )
+        self.hgQueueFinishAct.triggered.connect(self.__hgQueueFinishAppliedPatches)
         self.actions.append(self.hgQueueFinishAct)
-        
+
         self.hgQueueRenameAct = EricAction(
-            self.tr('Rename Patch'),
-            self.tr('Rename Patch'),
-            0, 0, self, 'mercurial_queues_rename')
-        self.hgQueueRenameAct.setStatusTip(self.tr(
-            'Rename a patch'
-        ))
-        self.hgQueueRenameAct.setWhatsThis(self.tr(
-            """<b>Rename Patch</b>"""
-            """<p>This renames the current or a named patch.</p>"""
-        ))
+            self.tr("Rename Patch"),
+            self.tr("Rename Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_rename",
+        )
+        self.hgQueueRenameAct.setStatusTip(self.tr("Rename a patch"))
+        self.hgQueueRenameAct.setWhatsThis(
+            self.tr(
+                """<b>Rename Patch</b>"""
+                """<p>This renames the current or a named patch.</p>"""
+            )
+        )
         self.hgQueueRenameAct.triggered.connect(self.__hgQueueRenamePatch)
         self.actions.append(self.hgQueueRenameAct)
-        
+
         self.hgQueueDeleteAct = EricAction(
-            self.tr('Delete Patch'),
-            self.tr('Delete Patch'),
-            0, 0, self, 'mercurial_queues_delete')
-        self.hgQueueDeleteAct.setStatusTip(self.tr(
-            'Delete unapplied patch'
-        ))
-        self.hgQueueDeleteAct.setWhatsThis(self.tr(
-            """<b>Delete Patch</b>"""
-            """<p>This deletes an unapplied patch.</p>"""
-        ))
+            self.tr("Delete Patch"),
+            self.tr("Delete Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_delete",
+        )
+        self.hgQueueDeleteAct.setStatusTip(self.tr("Delete unapplied patch"))
+        self.hgQueueDeleteAct.setWhatsThis(
+            self.tr(
+                """<b>Delete Patch</b>""" """<p>This deletes an unapplied patch.</p>"""
+            )
+        )
         self.hgQueueDeleteAct.triggered.connect(self.__hgQueueDeletePatch)
         self.actions.append(self.hgQueueDeleteAct)
-        
+
         self.hgQueueFoldAct = EricAction(
-            self.tr('Fold Patches'),
-            self.tr('Fold Patches'),
-            0, 0, self, 'mercurial_queues_fold')
-        self.hgQueueFoldAct.setStatusTip(self.tr(
-            'Fold unapplied patches into the current patch'
-        ))
-        self.hgQueueFoldAct.setWhatsThis(self.tr(
-            """<b>Fold Patches</b>"""
-            """<p>This folds unapplied patches into the current patch.</p>"""
-        ))
-        self.hgQueueFoldAct.triggered.connect(
-            self.__hgQueueFoldUnappliedPatches)
+            self.tr("Fold Patches"),
+            self.tr("Fold Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_fold",
+        )
+        self.hgQueueFoldAct.setStatusTip(
+            self.tr("Fold unapplied patches into the current patch")
+        )
+        self.hgQueueFoldAct.setWhatsThis(
+            self.tr(
+                """<b>Fold Patches</b>"""
+                """<p>This folds unapplied patches into the current patch.</p>"""
+            )
+        )
+        self.hgQueueFoldAct.triggered.connect(self.__hgQueueFoldUnappliedPatches)
         self.actions.append(self.hgQueueFoldAct)
-        
+
         self.hgQueueStatusAct = EricAction(
-            self.tr('Show Status'),
-            self.tr('Show &Status...'),
-            0, 0, self, 'mercurial_queues_status')
-        self.hgQueueStatusAct.setStatusTip(self.tr(
-            'Show the status of the queue repository'
-        ))
-        self.hgQueueStatusAct.setWhatsThis(self.tr(
-            """<b>Show Status</b>"""
-            """<p>This shows the status of the queue repository.</p>"""
-        ))
+            self.tr("Show Status"),
+            self.tr("Show &Status..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_status",
+        )
+        self.hgQueueStatusAct.setStatusTip(
+            self.tr("Show the status of the queue repository")
+        )
+        self.hgQueueStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show Status</b>"""
+                """<p>This shows the status of the queue repository.</p>"""
+            )
+        )
         self.hgQueueStatusAct.triggered.connect(self.__hgQueueStatus)
         self.actions.append(self.hgQueueStatusAct)
-        
+
         self.hgQueueSummaryAct = EricAction(
-            self.tr('Show Summary'),
-            self.tr('Show summary...'),
-            0, 0, self, 'mercurial_queues_summary')
-        self.hgQueueSummaryAct.setStatusTip(self.tr(
-            'Show summary information of the queue repository'
-        ))
-        self.hgQueueSummaryAct.setWhatsThis(self.tr(
-            """<b>Show summary</b>"""
-            """<p>This shows some summary information of the queue"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show Summary"),
+            self.tr("Show summary..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_summary",
+        )
+        self.hgQueueSummaryAct.setStatusTip(
+            self.tr("Show summary information of the queue repository")
+        )
+        self.hgQueueSummaryAct.setWhatsThis(
+            self.tr(
+                """<b>Show summary</b>"""
+                """<p>This shows some summary information of the queue"""
+                """ repository.</p>"""
+            )
+        )
         self.hgQueueSummaryAct.triggered.connect(self.__hgQueueSummary)
         self.actions.append(self.hgQueueSummaryAct)
-        
+
         self.__initPushPopActions()
         self.__initPushPopForceActions()
         self.__initGuardsActions()
         self.__initQueuesMgmtActions()
-    
+
     def __initPushPopActions(self):
         """
         Private method to generate the push and pop action objects.
         """
         self.hgQueuePushAct = EricAction(
-            self.tr('Push Next Patch'),
-            self.tr('Push Next Patch'),
-            0, 0, self, 'mercurial_queues_push_next')
-        self.hgQueuePushAct.setStatusTip(self.tr(
-            'Push the next patch onto the stack'
-        ))
-        self.hgQueuePushAct.setWhatsThis(self.tr(
-            """<b>Push Next Patch</b>"""
-            """<p>This pushes the next patch onto the stack of applied"""
-            """ patches.</p>"""
-        ))
+            self.tr("Push Next Patch"),
+            self.tr("Push Next Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_next",
+        )
+        self.hgQueuePushAct.setStatusTip(self.tr("Push the next patch onto the stack"))
+        self.hgQueuePushAct.setWhatsThis(
+            self.tr(
+                """<b>Push Next Patch</b>"""
+                """<p>This pushes the next patch onto the stack of applied"""
+                """ patches.</p>"""
+            )
+        )
         self.hgQueuePushAct.triggered.connect(self.__hgQueuePushPatch)
         self.actions.append(self.hgQueuePushAct)
-        
+
         self.hgQueuePushAllAct = EricAction(
-            self.tr('Push All Patches'),
-            self.tr('Push All Patches'),
-            0, 0, self, 'mercurial_queues_push_all')
-        self.hgQueuePushAllAct.setStatusTip(self.tr(
-            'Push all patches onto the stack'
-        ))
-        self.hgQueuePushAllAct.setWhatsThis(self.tr(
-            """<b>Push All Patches</b>"""
-            """<p>This pushes all patches onto the stack of applied"""
-            """ patches.</p>"""
-        ))
-        self.hgQueuePushAllAct.triggered.connect(
-            self.__hgQueuePushAllPatches)
+            self.tr("Push All Patches"),
+            self.tr("Push All Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_all",
+        )
+        self.hgQueuePushAllAct.setStatusTip(self.tr("Push all patches onto the stack"))
+        self.hgQueuePushAllAct.setWhatsThis(
+            self.tr(
+                """<b>Push All Patches</b>"""
+                """<p>This pushes all patches onto the stack of applied"""
+                """ patches.</p>"""
+            )
+        )
+        self.hgQueuePushAllAct.triggered.connect(self.__hgQueuePushAllPatches)
         self.actions.append(self.hgQueuePushAllAct)
-        
+
         self.hgQueuePushUntilAct = EricAction(
-            self.tr('Push Patches'),
-            self.tr('Push Patches'),
-            0, 0, self, 'mercurial_queues_push_until')
-        self.hgQueuePushUntilAct.setStatusTip(self.tr(
-            'Push patches onto the stack'
-        ))
-        self.hgQueuePushUntilAct.setWhatsThis(self.tr(
-            """<b>Push Patches</b>"""
-            """<p>This pushes patches onto the stack of applied patches"""
-            """ until a named patch is at the top of the stack.</p>"""
-        ))
-        self.hgQueuePushUntilAct.triggered.connect(
-            self.__hgQueuePushPatches)
+            self.tr("Push Patches"),
+            self.tr("Push Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_until",
+        )
+        self.hgQueuePushUntilAct.setStatusTip(self.tr("Push patches onto the stack"))
+        self.hgQueuePushUntilAct.setWhatsThis(
+            self.tr(
+                """<b>Push Patches</b>"""
+                """<p>This pushes patches onto the stack of applied patches"""
+                """ until a named patch is at the top of the stack.</p>"""
+            )
+        )
+        self.hgQueuePushUntilAct.triggered.connect(self.__hgQueuePushPatches)
         self.actions.append(self.hgQueuePushUntilAct)
-        
+
         self.hgQueuePopAct = EricAction(
-            self.tr('Pop Current Patch'),
-            self.tr('Pop Current Patch'),
-            0, 0, self, 'mercurial_queues_pop_current')
-        self.hgQueuePopAct.setStatusTip(self.tr(
-            'Pop the current patch off the stack'
-        ))
-        self.hgQueuePopAct.setWhatsThis(self.tr(
-            """<b>Pop Current Patch</b>"""
-            """<p>This pops the current patch off the stack of applied"""
-            """ patches.</p>"""
-        ))
+            self.tr("Pop Current Patch"),
+            self.tr("Pop Current Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_current",
+        )
+        self.hgQueuePopAct.setStatusTip(self.tr("Pop the current patch off the stack"))
+        self.hgQueuePopAct.setWhatsThis(
+            self.tr(
+                """<b>Pop Current Patch</b>"""
+                """<p>This pops the current patch off the stack of applied"""
+                """ patches.</p>"""
+            )
+        )
         self.hgQueuePopAct.triggered.connect(self.__hgQueuePopPatch)
         self.actions.append(self.hgQueuePopAct)
-        
+
         self.hgQueuePopAllAct = EricAction(
-            self.tr('Pop All Patches'),
-            self.tr('Pop All Patches'),
-            0, 0, self, 'mercurial_queues_pop_all')
-        self.hgQueuePopAllAct.setStatusTip(self.tr(
-            'Pop all patches off the stack'
-        ))
-        self.hgQueuePopAllAct.setWhatsThis(self.tr(
-            """<b>Pop All Patches</b>"""
-            """<p>This pops all patches off the stack of applied"""
-            """ patches.</p>"""
-        ))
-        self.hgQueuePopAllAct.triggered.connect(
-            self.__hgQueuePopAllPatches)
+            self.tr("Pop All Patches"),
+            self.tr("Pop All Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_all",
+        )
+        self.hgQueuePopAllAct.setStatusTip(self.tr("Pop all patches off the stack"))
+        self.hgQueuePopAllAct.setWhatsThis(
+            self.tr(
+                """<b>Pop All Patches</b>"""
+                """<p>This pops all patches off the stack of applied"""
+                """ patches.</p>"""
+            )
+        )
+        self.hgQueuePopAllAct.triggered.connect(self.__hgQueuePopAllPatches)
         self.actions.append(self.hgQueuePopAllAct)
-        
+
         self.hgQueuePopUntilAct = EricAction(
-            self.tr('Pop Patches'),
-            self.tr('Pop Patches'),
-            0, 0, self, 'mercurial_queues_pop_until')
-        self.hgQueuePopUntilAct.setStatusTip(self.tr(
-            'Pop patches off the stack'
-        ))
-        self.hgQueuePopUntilAct.setWhatsThis(self.tr(
-            """<b>Pop Patches</b>"""
-            """<p>This pops patches off the stack of applied patches"""
-            """ until a named patch is at the top of the stack.</p>"""
-        ))
+            self.tr("Pop Patches"),
+            self.tr("Pop Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_until",
+        )
+        self.hgQueuePopUntilAct.setStatusTip(self.tr("Pop patches off the stack"))
+        self.hgQueuePopUntilAct.setWhatsThis(
+            self.tr(
+                """<b>Pop Patches</b>"""
+                """<p>This pops patches off the stack of applied patches"""
+                """ until a named patch is at the top of the stack.</p>"""
+            )
+        )
         self.hgQueuePopUntilAct.triggered.connect(self.__hgQueuePopPatches)
         self.actions.append(self.hgQueuePopUntilAct)
-        
+
         self.hgQueueGotoAct = EricAction(
-            self.tr('Go to Patch'),
-            self.tr('Go to Patch'),
-            0, 0, self, 'mercurial_queues_goto')
-        self.hgQueueGotoAct.setStatusTip(self.tr(
-            'Push or pop patches until named patch is at top of stack'
-        ))
-        self.hgQueueGotoAct.setWhatsThis(self.tr(
-            """<b>Go to Patch</b>"""
-            """<p>This pushes or pops patches until a named patch is at the"""
-            """ top of the stack.</p>"""
-        ))
+            self.tr("Go to Patch"),
+            self.tr("Go to Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_goto",
+        )
+        self.hgQueueGotoAct.setStatusTip(
+            self.tr("Push or pop patches until named patch is at top of stack")
+        )
+        self.hgQueueGotoAct.setWhatsThis(
+            self.tr(
+                """<b>Go to Patch</b>"""
+                """<p>This pushes or pops patches until a named patch is at the"""
+                """ top of the stack.</p>"""
+            )
+        )
         self.hgQueueGotoAct.triggered.connect(self.__hgQueueGotoPatch)
         self.actions.append(self.hgQueueGotoAct)
-    
+
     def __initPushPopForceActions(self):
         """
         Private method to generate the push and pop (force) action objects.
         """
         self.hgQueuePushForceAct = EricAction(
-            self.tr('Push Next Patch'),
-            self.tr('Push Next Patch'),
-            0, 0, self, 'mercurial_queues_push_next_force')
-        self.hgQueuePushForceAct.setStatusTip(self.tr(
-            'Push the next patch onto the stack on top of local changes'
-        ))
-        self.hgQueuePushForceAct.setWhatsThis(self.tr(
-            """<b>Push Next Patch</b>"""
-            """<p>This pushes the next patch onto the stack of applied"""
-            """ patches on top of local changes.</p>"""
-        ))
-        self.hgQueuePushForceAct.triggered.connect(
-            self.__hgQueuePushPatchForced)
+            self.tr("Push Next Patch"),
+            self.tr("Push Next Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_next_force",
+        )
+        self.hgQueuePushForceAct.setStatusTip(
+            self.tr("Push the next patch onto the stack on top of local changes")
+        )
+        self.hgQueuePushForceAct.setWhatsThis(
+            self.tr(
+                """<b>Push Next Patch</b>"""
+                """<p>This pushes the next patch onto the stack of applied"""
+                """ patches on top of local changes.</p>"""
+            )
+        )
+        self.hgQueuePushForceAct.triggered.connect(self.__hgQueuePushPatchForced)
         self.actions.append(self.hgQueuePushForceAct)
-        
+
         self.hgQueuePushAllForceAct = EricAction(
-            self.tr('Push All Patches'),
-            self.tr('Push All Patches'),
-            0, 0, self, 'mercurial_queues_push_all_force')
-        self.hgQueuePushAllForceAct.setStatusTip(self.tr(
-            'Push all patches onto the stack on top of local changes'
-        ))
-        self.hgQueuePushAllForceAct.setWhatsThis(self.tr(
-            """<b>Push All Patches</b>"""
-            """<p>This pushes all patches onto the stack of applied patches"""
-            """ on top of local changes.</p>"""
-        ))
+            self.tr("Push All Patches"),
+            self.tr("Push All Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_all_force",
+        )
+        self.hgQueuePushAllForceAct.setStatusTip(
+            self.tr("Push all patches onto the stack on top of local changes")
+        )
+        self.hgQueuePushAllForceAct.setWhatsThis(
+            self.tr(
+                """<b>Push All Patches</b>"""
+                """<p>This pushes all patches onto the stack of applied patches"""
+                """ on top of local changes.</p>"""
+            )
+        )
         self.hgQueuePushAllForceAct.triggered.connect(
-            self.__hgQueuePushAllPatchesForced)
+            self.__hgQueuePushAllPatchesForced
+        )
         self.actions.append(self.hgQueuePushAllForceAct)
-        
+
         self.hgQueuePushUntilForceAct = EricAction(
-            self.tr('Push Patches'),
-            self.tr('Push Patches'),
-            0, 0, self, 'mercurial_queues_push_until_force')
-        self.hgQueuePushUntilForceAct.setStatusTip(self.tr(
-            'Push patches onto the stack on top of local changes'
-        ))
-        self.hgQueuePushUntilForceAct.setWhatsThis(self.tr(
-            """<b>Push Patches</b>"""
-            """<p>This pushes patches onto the stack  of applied patches"""
-            """ until a named patch is at the top of the stack on top of"""
-            """ local changes.</p>"""
-        ))
-        self.hgQueuePushUntilForceAct.triggered.connect(
-            self.__hgQueuePushPatchesForced)
+            self.tr("Push Patches"),
+            self.tr("Push Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_push_until_force",
+        )
+        self.hgQueuePushUntilForceAct.setStatusTip(
+            self.tr("Push patches onto the stack on top of local changes")
+        )
+        self.hgQueuePushUntilForceAct.setWhatsThis(
+            self.tr(
+                """<b>Push Patches</b>"""
+                """<p>This pushes patches onto the stack  of applied patches"""
+                """ until a named patch is at the top of the stack on top of"""
+                """ local changes.</p>"""
+            )
+        )
+        self.hgQueuePushUntilForceAct.triggered.connect(self.__hgQueuePushPatchesForced)
         self.actions.append(self.hgQueuePushUntilForceAct)
-        
+
         self.hgQueuePopForceAct = EricAction(
-            self.tr('Pop Current Patch'),
-            self.tr('Pop Current Patch'),
-            0, 0, self, 'mercurial_queues_pop_current_force')
-        self.hgQueuePopForceAct.setStatusTip(self.tr(
-            'Pop the current patch off the stack forgetting local changes'
-        ))
-        self.hgQueuePopForceAct.setWhatsThis(self.tr(
-            """<b>Pop Current Patch</b>"""
-            """<p>This pops the current patch off the stack of applied"""
-            """ patches"""
-            """ forgetting local changes.</p>"""
-        ))
-        self.hgQueuePopForceAct.triggered.connect(
-            self.__hgQueuePopPatchForced)
+            self.tr("Pop Current Patch"),
+            self.tr("Pop Current Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_current_force",
+        )
+        self.hgQueuePopForceAct.setStatusTip(
+            self.tr("Pop the current patch off the stack forgetting local changes")
+        )
+        self.hgQueuePopForceAct.setWhatsThis(
+            self.tr(
+                """<b>Pop Current Patch</b>"""
+                """<p>This pops the current patch off the stack of applied"""
+                """ patches"""
+                """ forgetting local changes.</p>"""
+            )
+        )
+        self.hgQueuePopForceAct.triggered.connect(self.__hgQueuePopPatchForced)
         self.actions.append(self.hgQueuePopForceAct)
-        
+
         self.hgQueuePopAllForceAct = EricAction(
-            self.tr('Pop All Patches'),
-            self.tr('Pop All Patches'),
-            0, 0, self, 'mercurial_queues_pop_all_force')
-        self.hgQueuePopAllForceAct.setStatusTip(self.tr(
-            'Pop all patches off the stack forgetting local changes'
-        ))
-        self.hgQueuePopAllForceAct.setWhatsThis(self.tr(
-            """<b>Pop All Patches</b>"""
-            """<p>This pops all patches off the stack of applied patches"""
-            """  forgetting local changes.</p>"""
-        ))
-        self.hgQueuePopAllForceAct.triggered.connect(
-            self.__hgQueuePopAllPatchesForced)
+            self.tr("Pop All Patches"),
+            self.tr("Pop All Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_all_force",
+        )
+        self.hgQueuePopAllForceAct.setStatusTip(
+            self.tr("Pop all patches off the stack forgetting local changes")
+        )
+        self.hgQueuePopAllForceAct.setWhatsThis(
+            self.tr(
+                """<b>Pop All Patches</b>"""
+                """<p>This pops all patches off the stack of applied patches"""
+                """  forgetting local changes.</p>"""
+            )
+        )
+        self.hgQueuePopAllForceAct.triggered.connect(self.__hgQueuePopAllPatchesForced)
         self.actions.append(self.hgQueuePopAllForceAct)
-        
+
         self.hgQueuePopUntilForceAct = EricAction(
-            self.tr('Pop Patches'),
-            self.tr('Pop Patches'),
-            0, 0, self, 'mercurial_queues_pop_until_force')
-        self.hgQueuePopUntilForceAct.setStatusTip(self.tr(
-            'Pop patches off the stack forgetting local changes'
-        ))
-        self.hgQueuePopUntilForceAct.setWhatsThis(self.tr(
-            """<b>Pop Patches</b>"""
-            """<p>This pops patches off the stack of applied patches until"""
-            """ a named patch is at the top of the stack forgetting local"""
-            """ changes.</p>"""
-        ))
-        self.hgQueuePopUntilForceAct.triggered.connect(
-            self.__hgQueuePopPatchesForced)
+            self.tr("Pop Patches"),
+            self.tr("Pop Patches"),
+            0,
+            0,
+            self,
+            "mercurial_queues_pop_until_force",
+        )
+        self.hgQueuePopUntilForceAct.setStatusTip(
+            self.tr("Pop patches off the stack forgetting local changes")
+        )
+        self.hgQueuePopUntilForceAct.setWhatsThis(
+            self.tr(
+                """<b>Pop Patches</b>"""
+                """<p>This pops patches off the stack of applied patches until"""
+                """ a named patch is at the top of the stack forgetting local"""
+                """ changes.</p>"""
+            )
+        )
+        self.hgQueuePopUntilForceAct.triggered.connect(self.__hgQueuePopPatchesForced)
         self.actions.append(self.hgQueuePopUntilForceAct)
-        
+
         self.hgQueueGotoForceAct = EricAction(
-            self.tr('Go to Patch'),
-            self.tr('Go to Patch'),
-            0, 0, self, 'mercurial_queues_goto_force')
-        self.hgQueueGotoForceAct.setStatusTip(self.tr(
-            'Push or pop patches until named patch is at top of stack'
-            ' overwriting any local changes'
-        ))
-        self.hgQueueGotoForceAct.setWhatsThis(self.tr(
-            """<b>Go to Patch</b>"""
-            """<p>This pushes or pops patches until a named patch is at the"""
-            """ top of the stack overwriting any local changes.</p>"""
-        ))
-        self.hgQueueGotoForceAct.triggered.connect(
-            self.__hgQueueGotoPatchForced)
+            self.tr("Go to Patch"),
+            self.tr("Go to Patch"),
+            0,
+            0,
+            self,
+            "mercurial_queues_goto_force",
+        )
+        self.hgQueueGotoForceAct.setStatusTip(
+            self.tr(
+                "Push or pop patches until named patch is at top of stack"
+                " overwriting any local changes"
+            )
+        )
+        self.hgQueueGotoForceAct.setWhatsThis(
+            self.tr(
+                """<b>Go to Patch</b>"""
+                """<p>This pushes or pops patches until a named patch is at the"""
+                """ top of the stack overwriting any local changes.</p>"""
+            )
+        )
+        self.hgQueueGotoForceAct.triggered.connect(self.__hgQueueGotoPatchForced)
         self.actions.append(self.hgQueueGotoForceAct)
-    
+
     def __initGuardsActions(self):
         """
         Private method to generate the guards action objects.
         """
         self.hgQueueDefineGuardsAct = EricAction(
-            self.tr('Define Guards'),
-            self.tr('Define Guards...'),
-            0, 0, self, 'mercurial_queues_guards_define')
-        self.hgQueueDefineGuardsAct.setStatusTip(self.tr(
-            'Define guards for the current or a named patch'
-        ))
-        self.hgQueueDefineGuardsAct.setWhatsThis(self.tr(
-            """<b>Define Guards</b>"""
-            """<p>This opens a dialog to define guards for the current"""
-            """ or a named patch.</p>"""
-        ))
-        self.hgQueueDefineGuardsAct.triggered.connect(
-            self.__hgQueueGuardsDefine)
+            self.tr("Define Guards"),
+            self.tr("Define Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_define",
+        )
+        self.hgQueueDefineGuardsAct.setStatusTip(
+            self.tr("Define guards for the current or a named patch")
+        )
+        self.hgQueueDefineGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>Define Guards</b>"""
+                """<p>This opens a dialog to define guards for the current"""
+                """ or a named patch.</p>"""
+            )
+        )
+        self.hgQueueDefineGuardsAct.triggered.connect(self.__hgQueueGuardsDefine)
         self.actions.append(self.hgQueueDefineGuardsAct)
-        
+
         self.hgQueueDropAllGuardsAct = EricAction(
-            self.tr('Drop All Guards'),
-            self.tr('Drop All Guards...'),
-            0, 0, self, 'mercurial_queues_guards_drop_all')
-        self.hgQueueDropAllGuardsAct.setStatusTip(self.tr(
-            'Drop all guards of the current or a named patch'
-        ))
-        self.hgQueueDropAllGuardsAct.setWhatsThis(self.tr(
-            """<b>Drop All Guards</b>"""
-            """<p>This drops all guards of the current or a named patch.</p>"""
-        ))
-        self.hgQueueDropAllGuardsAct.triggered.connect(
-            self.__hgQueueGuardsDropAll)
+            self.tr("Drop All Guards"),
+            self.tr("Drop All Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_drop_all",
+        )
+        self.hgQueueDropAllGuardsAct.setStatusTip(
+            self.tr("Drop all guards of the current or a named patch")
+        )
+        self.hgQueueDropAllGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>Drop All Guards</b>"""
+                """<p>This drops all guards of the current or a named patch.</p>"""
+            )
+        )
+        self.hgQueueDropAllGuardsAct.triggered.connect(self.__hgQueueGuardsDropAll)
         self.actions.append(self.hgQueueDropAllGuardsAct)
-        
+
         self.hgQueueListGuardsAct = EricAction(
-            self.tr('List Guards'),
-            self.tr('List Guards...'),
-            0, 0, self, 'mercurial_queues_guards_list')
-        self.hgQueueListGuardsAct.setStatusTip(self.tr(
-            'List guards of the current or a named patch'
-        ))
-        self.hgQueueListGuardsAct.setWhatsThis(self.tr(
-            """<b>List Guards</b>"""
-            """<p>This lists the guards of the current or a named patch.</p>"""
-        ))
-        self.hgQueueListGuardsAct.triggered.connect(
-            self.__hgQueueGuardsList)
+            self.tr("List Guards"),
+            self.tr("List Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_list",
+        )
+        self.hgQueueListGuardsAct.setStatusTip(
+            self.tr("List guards of the current or a named patch")
+        )
+        self.hgQueueListGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>List Guards</b>"""
+                """<p>This lists the guards of the current or a named patch.</p>"""
+            )
+        )
+        self.hgQueueListGuardsAct.triggered.connect(self.__hgQueueGuardsList)
         self.actions.append(self.hgQueueListGuardsAct)
-        
+
         self.hgQueueListAllGuardsAct = EricAction(
-            self.tr('List All Guards'),
-            self.tr('List All Guards...'),
-            0, 0, self, 'mercurial_queues_guards_list_all')
-        self.hgQueueListAllGuardsAct.setStatusTip(self.tr(
-            'List all guards of all patches'
-        ))
-        self.hgQueueListAllGuardsAct.setWhatsThis(self.tr(
-            """<b>List All Guards</b>"""
-            """<p>This lists all guards of all patches.</p>"""
-        ))
-        self.hgQueueListAllGuardsAct.triggered.connect(
-            self.__hgQueueGuardsListAll)
+            self.tr("List All Guards"),
+            self.tr("List All Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_list_all",
+        )
+        self.hgQueueListAllGuardsAct.setStatusTip(
+            self.tr("List all guards of all patches")
+        )
+        self.hgQueueListAllGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>List All Guards</b>"""
+                """<p>This lists all guards of all patches.</p>"""
+            )
+        )
+        self.hgQueueListAllGuardsAct.triggered.connect(self.__hgQueueGuardsListAll)
         self.actions.append(self.hgQueueListAllGuardsAct)
-        
+
         self.hgQueueActivateGuardsAct = EricAction(
-            self.tr('Set Active Guards'),
-            self.tr('Set Active Guards...'),
-            0, 0, self, 'mercurial_queues_guards_set_active')
-        self.hgQueueActivateGuardsAct.setStatusTip(self.tr(
-            'Set the list of active guards'
-        ))
-        self.hgQueueActivateGuardsAct.setWhatsThis(self.tr(
-            """<b>Set Active Guards</b>"""
-            """<p>This opens a dialog to set the active guards.</p>"""
-        ))
-        self.hgQueueActivateGuardsAct.triggered.connect(
-            self.__hgQueueGuardsSetActive)
+            self.tr("Set Active Guards"),
+            self.tr("Set Active Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_set_active",
+        )
+        self.hgQueueActivateGuardsAct.setStatusTip(
+            self.tr("Set the list of active guards")
+        )
+        self.hgQueueActivateGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>Set Active Guards</b>"""
+                """<p>This opens a dialog to set the active guards.</p>"""
+            )
+        )
+        self.hgQueueActivateGuardsAct.triggered.connect(self.__hgQueueGuardsSetActive)
         self.actions.append(self.hgQueueActivateGuardsAct)
-        
+
         self.hgQueueDeactivateGuardsAct = EricAction(
-            self.tr('Deactivate Guards'),
-            self.tr('Deactivate Guards...'),
-            0, 0, self, 'mercurial_queues_guards_deactivate')
-        self.hgQueueDeactivateGuardsAct.setStatusTip(self.tr(
-            'Deactivate all active guards'
-        ))
-        self.hgQueueDeactivateGuardsAct.setWhatsThis(self.tr(
-            """<b>Deactivate Guards</b>"""
-            """<p>This deactivates all active guards.</p>"""
-        ))
+            self.tr("Deactivate Guards"),
+            self.tr("Deactivate Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_deactivate",
+        )
+        self.hgQueueDeactivateGuardsAct.setStatusTip(
+            self.tr("Deactivate all active guards")
+        )
+        self.hgQueueDeactivateGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>Deactivate Guards</b>"""
+                """<p>This deactivates all active guards.</p>"""
+            )
+        )
         self.hgQueueDeactivateGuardsAct.triggered.connect(
-            self.__hgQueueGuardsDeactivate)
+            self.__hgQueueGuardsDeactivate
+        )
         self.actions.append(self.hgQueueDeactivateGuardsAct)
-        
+
         self.hgQueueIdentifyActiveGuardsAct = EricAction(
-            self.tr('Identify Active Guards'),
-            self.tr('Identify Active Guards...'),
-            0, 0, self, 'mercurial_queues_guards_identify_active')
-        self.hgQueueIdentifyActiveGuardsAct.setStatusTip(self.tr(
-            'Show a list of active guards'
-        ))
-        self.hgQueueIdentifyActiveGuardsAct.setWhatsThis(self.tr(
-            """<b>Identify Active Guards</b>"""
-            """<p>This opens a dialog showing a list of active guards.</p>"""
-        ))
+            self.tr("Identify Active Guards"),
+            self.tr("Identify Active Guards..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_guards_identify_active",
+        )
+        self.hgQueueIdentifyActiveGuardsAct.setStatusTip(
+            self.tr("Show a list of active guards")
+        )
+        self.hgQueueIdentifyActiveGuardsAct.setWhatsThis(
+            self.tr(
+                """<b>Identify Active Guards</b>"""
+                """<p>This opens a dialog showing a list of active guards.</p>"""
+            )
+        )
         self.hgQueueIdentifyActiveGuardsAct.triggered.connect(
-            self.__hgQueueGuardsIdentifyActive)
+            self.__hgQueueGuardsIdentifyActive
+        )
         self.actions.append(self.hgQueueIdentifyActiveGuardsAct)
-    
+
     def __initQueuesMgmtActions(self):
         """
         Private method to generate the queues management action objects.
         """
         self.hgQueueCreateQueueAct = EricAction(
-            self.tr('Create Queue'),
-            self.tr('Create Queue'),
-            0, 0, self, 'mercurial_queues_create_queue')
-        self.hgQueueCreateQueueAct.setStatusTip(self.tr(
-            'Create a new patch queue'
-        ))
-        self.hgQueueCreateQueueAct.setWhatsThis(self.tr(
-            """<b>Create Queue</b>"""
-            """<p>This creates a new patch queue.</p>"""
-        ))
-        self.hgQueueCreateQueueAct.triggered.connect(
-            self.__hgQueueCreateQueue)
+            self.tr("Create Queue"),
+            self.tr("Create Queue"),
+            0,
+            0,
+            self,
+            "mercurial_queues_create_queue",
+        )
+        self.hgQueueCreateQueueAct.setStatusTip(self.tr("Create a new patch queue"))
+        self.hgQueueCreateQueueAct.setWhatsThis(
+            self.tr(
+                """<b>Create Queue</b>""" """<p>This creates a new patch queue.</p>"""
+            )
+        )
+        self.hgQueueCreateQueueAct.triggered.connect(self.__hgQueueCreateQueue)
         self.actions.append(self.hgQueueCreateQueueAct)
-        
+
         self.hgQueueRenameQueueAct = EricAction(
-            self.tr('Rename Queue'),
-            self.tr('Rename Queue'),
-            0, 0, self, 'mercurial_queues_rename_queue')
-        self.hgQueueRenameQueueAct.setStatusTip(self.tr(
-            'Rename the active patch queue'
-        ))
-        self.hgQueueRenameQueueAct.setWhatsThis(self.tr(
-            """<b>Rename Queue</b>"""
-            """<p>This renames the active patch queue.</p>"""
-        ))
-        self.hgQueueRenameQueueAct.triggered.connect(
-            self.__hgQueueRenameQueue)
+            self.tr("Rename Queue"),
+            self.tr("Rename Queue"),
+            0,
+            0,
+            self,
+            "mercurial_queues_rename_queue",
+        )
+        self.hgQueueRenameQueueAct.setStatusTip(
+            self.tr("Rename the active patch queue")
+        )
+        self.hgQueueRenameQueueAct.setWhatsThis(
+            self.tr(
+                """<b>Rename Queue</b>"""
+                """<p>This renames the active patch queue.</p>"""
+            )
+        )
+        self.hgQueueRenameQueueAct.triggered.connect(self.__hgQueueRenameQueue)
         self.actions.append(self.hgQueueRenameQueueAct)
-        
+
         self.hgQueueDeleteQueueAct = EricAction(
-            self.tr('Delete Queue'),
-            self.tr('Delete Queue'),
-            0, 0, self, 'mercurial_queues_delete_queue')
-        self.hgQueueDeleteQueueAct.setStatusTip(self.tr(
-            'Delete the reference to a patch queue'
-        ))
-        self.hgQueueDeleteQueueAct.setWhatsThis(self.tr(
-            """<b>Delete Queue</b>"""
-            """<p>This deletes the reference to a patch queue.</p>"""
-        ))
-        self.hgQueueDeleteQueueAct.triggered.connect(
-            self.__hgQueueDeleteQueue)
+            self.tr("Delete Queue"),
+            self.tr("Delete Queue"),
+            0,
+            0,
+            self,
+            "mercurial_queues_delete_queue",
+        )
+        self.hgQueueDeleteQueueAct.setStatusTip(
+            self.tr("Delete the reference to a patch queue")
+        )
+        self.hgQueueDeleteQueueAct.setWhatsThis(
+            self.tr(
+                """<b>Delete Queue</b>"""
+                """<p>This deletes the reference to a patch queue.</p>"""
+            )
+        )
+        self.hgQueueDeleteQueueAct.triggered.connect(self.__hgQueueDeleteQueue)
         self.actions.append(self.hgQueueDeleteQueueAct)
-        
+
         self.hgQueuePurgeQueueAct = EricAction(
-            self.tr('Purge Queue'),
-            self.tr('Purge Queue'),
-            0, 0, self, 'mercurial_queues_purge_queue')
-        self.hgQueuePurgeQueueAct.setStatusTip(self.tr(
-            'Delete the reference to a patch queue and remove the patch'
-            ' directory'
-        ))
-        self.hgQueuePurgeQueueAct.setWhatsThis(self.tr(
-            """<b>Purge Queue</b>"""
-            """<p>This deletes the reference to a patch queue and removes"""
-            """ the patch directory.</p>"""
-        ))
-        self.hgQueuePurgeQueueAct.triggered.connect(
-            self.__hgQueuePurgeQueue)
+            self.tr("Purge Queue"),
+            self.tr("Purge Queue"),
+            0,
+            0,
+            self,
+            "mercurial_queues_purge_queue",
+        )
+        self.hgQueuePurgeQueueAct.setStatusTip(
+            self.tr(
+                "Delete the reference to a patch queue and remove the patch"
+                " directory"
+            )
+        )
+        self.hgQueuePurgeQueueAct.setWhatsThis(
+            self.tr(
+                """<b>Purge Queue</b>"""
+                """<p>This deletes the reference to a patch queue and removes"""
+                """ the patch directory.</p>"""
+            )
+        )
+        self.hgQueuePurgeQueueAct.triggered.connect(self.__hgQueuePurgeQueue)
         self.actions.append(self.hgQueuePurgeQueueAct)
-        
+
         self.hgQueueActivateQueueAct = EricAction(
-            self.tr('Activate Queue'),
-            self.tr('Activate Queue'),
-            0, 0, self, 'mercurial_queues_activate_queue')
-        self.hgQueueActivateQueueAct.setStatusTip(self.tr(
-            'Set the active queue'
-        ))
-        self.hgQueueActivateQueueAct.setWhatsThis(self.tr(
-            """<b>Activate Queue</b>"""
-            """<p>This sets the active queue.</p>"""
-        ))
-        self.hgQueueActivateQueueAct.triggered.connect(
-            self.__hgQueueActivateQueue)
+            self.tr("Activate Queue"),
+            self.tr("Activate Queue"),
+            0,
+            0,
+            self,
+            "mercurial_queues_activate_queue",
+        )
+        self.hgQueueActivateQueueAct.setStatusTip(self.tr("Set the active queue"))
+        self.hgQueueActivateQueueAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Queue</b>""" """<p>This sets the active queue.</p>"""
+            )
+        )
+        self.hgQueueActivateQueueAct.triggered.connect(self.__hgQueueActivateQueue)
         self.actions.append(self.hgQueueActivateQueueAct)
-        
+
         self.hgQueueListQueuesAct = EricAction(
-            self.tr('List Queues'),
-            self.tr('List Queues...'),
-            0, 0, self, 'mercurial_queues_list_queues')
-        self.hgQueueListQueuesAct.setStatusTip(self.tr(
-            'List the available queues'
-        ))
-        self.hgQueueListQueuesAct.setWhatsThis(self.tr(
-            """<b>List Queues</b>"""
-            """<p>This opens a dialog showing all available queues.</p>"""
-        ))
-        self.hgQueueListQueuesAct.triggered.connect(
-            self.__hgQueueListQueues)
+            self.tr("List Queues"),
+            self.tr("List Queues..."),
+            0,
+            0,
+            self,
+            "mercurial_queues_list_queues",
+        )
+        self.hgQueueListQueuesAct.setStatusTip(self.tr("List the available queues"))
+        self.hgQueueListQueuesAct.setWhatsThis(
+            self.tr(
+                """<b>List Queues</b>"""
+                """<p>This opens a dialog showing all available queues.</p>"""
+            )
+        )
+        self.hgQueueListQueuesAct.triggered.connect(self.__hgQueueListQueues)
         self.actions.append(self.hgQueueListQueuesAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setTearOffEnabled(True)
-        
+
         pushPopMenu = QMenu(self.tr("Push/Pop"), menu)
         pushPopMenu.setTearOffEnabled(True)
         pushPopMenu.addAction(self.hgQueuePushAct)
@@ -701,7 +895,7 @@
         pushPopMenu.addAction(self.hgQueuePopAllAct)
         pushPopMenu.addSeparator()
         pushPopMenu.addAction(self.hgQueueGotoAct)
-        
+
         pushPopForceMenu = QMenu(self.tr("Push/Pop (force)"), menu)
         pushPopForceMenu.setTearOffEnabled(True)
         pushPopForceMenu.addAction(self.hgQueuePushForceAct)
@@ -713,7 +907,7 @@
         pushPopForceMenu.addAction(self.hgQueuePopAllForceAct)
         pushPopForceMenu.addSeparator()
         pushPopForceMenu.addAction(self.hgQueueGotoForceAct)
-        
+
         guardsMenu = QMenu(self.tr("Guards"), menu)
         guardsMenu.setTearOffEnabled(True)
         guardsMenu.addAction(self.hgQueueDefineGuardsAct)
@@ -726,7 +920,7 @@
         guardsMenu.addAction(self.hgQueueDeactivateGuardsAct)
         guardsMenu.addSeparator()
         guardsMenu.addAction(self.hgQueueIdentifyActiveGuardsAct)
-        
+
         queuesMenu = QMenu(self.tr("Queue Management"), menu)
         queuesMenu.setTearOffEnabled(True)
         queuesMenu.addAction(self.hgQueueCreateQueueAct)
@@ -737,7 +931,7 @@
         queuesMenu.addAction(self.hgQueueActivateQueueAct)
         queuesMenu.addSeparator()
         queuesMenu.addAction(self.hgQueueListQueuesAct)
-        
+
         menu.addAction(self.hgQueueInitAct)
         menu.addAction(self.hgQueueCommitAct)
         menu.addSeparator()
@@ -765,54 +959,54 @@
         menu.addMenu(guardsMenu)
         menu.addSeparator()
         menu.addMenu(queuesMenu)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Queues")
-    
+
     def __hgQueueNewPatch(self):
         """
         Private slot used to create a new named patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueNewPatch()
-    
+
     def __hgQueueRefreshPatch(self):
         """
         Private slot used to refresh the current patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueRefreshPatch()
-    
+
     def __hgQueueRefreshPatchMessage(self):
         """
         Private slot used to refresh the current patch and its commit message.
         """
         self.vcs.getExtensionObject("mq").hgQueueRefreshPatch(editMessage=True)
-    
+
     def __hgQueueShowPatch(self):
         """
         Private slot used to show the contents of the current patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueShowPatch(
-            self.project.getProjectPath())
-    
+            self.project.getProjectPath()
+        )
+
     def __hgQueueShowHeader(self):
         """
         Private slot used to show the commit message of the current patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueShowHeader()
-    
-    def __hgQueuePushPopPatches(self, operation, doAll=False,
-                                named=False, force=False):
+
+    def __hgQueuePushPopPatches(self, operation, doAll=False, named=False, force=False):
         """
         Private method to push patches onto the stack or pop patches off the
         stack.
-        
+
         @param operation operation type to be performed (Queues.POP,
             Queues.PUSH, Queues.GOTO)
         @param doAll flag indicating to push/pop all (boolean)
@@ -821,256 +1015,259 @@
         @param force flag indicating a forceful pop (boolean)
         """
         shouldReopen = self.vcs.getExtensionObject("mq").hgQueuePushPopPatches(
-            operation=operation, doAll=doAll, named=named, force=force)
+            operation=operation, doAll=doAll, named=named, force=force
+        )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Changing Applied Patches"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgQueuePushPatch(self):
         """
         Private slot used to push the next patch onto the stack.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=False, named=False)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.PUSH, doAll=False, named=False)
+
     def __hgQueuePushPatchForced(self):
         """
         Private slot used to push the next patch onto the stack on top
         of local changes.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=False, named=False, force=True)
-    
+            operation=Queues.PUSH, doAll=False, named=False, force=True
+        )
+
     def __hgQueuePushAllPatches(self):
         """
         Private slot used to push all patches onto the stack.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=True, named=False)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.PUSH, doAll=True, named=False)
+
     def __hgQueuePushAllPatchesForced(self):
         """
         Private slot used to push all patches onto the stack on top
         of local changes.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=True, named=False, force=True)
-    
+            operation=Queues.PUSH, doAll=True, named=False, force=True
+        )
+
     def __hgQueuePushPatches(self):
         """
         Private slot used to push patches onto the stack until a named
         one is at the top.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=False, named=True)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.PUSH, doAll=False, named=True)
+
     def __hgQueuePushPatchesForced(self):
         """
         Private slot used to push patches onto the stack until a named
         one is at the top on top of local changes.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.PUSH, doAll=False, named=True, force=True)
-    
+            operation=Queues.PUSH, doAll=False, named=True, force=True
+        )
+
     def __hgQueuePopPatch(self):
         """
         Private slot used to pop the current patch off the stack.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=False, named=False)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.POP, doAll=False, named=False)
+
     def __hgQueuePopPatchForced(self):
         """
         Private slot used to pop the current patch off the stack forgetting
         any local changes to patched files.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=False, named=False, force=True)
-    
+            operation=Queues.POP, doAll=False, named=False, force=True
+        )
+
     def __hgQueuePopAllPatches(self):
         """
         Private slot used to pop all patches off the stack.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=True, named=False)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.POP, doAll=True, named=False)
+
     def __hgQueuePopAllPatchesForced(self):
         """
         Private slot used to pop all patches off the stack forgetting
         any local changes to patched files.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=True, named=False, force=True)
-    
+            operation=Queues.POP, doAll=True, named=False, force=True
+        )
+
     def __hgQueuePopPatches(self):
         """
         Private slot used to pop patches off the stack until a named
         one is at the top.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=False, named=True)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.POP, doAll=False, named=True)
+
     def __hgQueuePopPatchesForced(self):
         """
         Private slot used to pop patches off the stack until a named
         one is at the top forgetting any local changes to patched files.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.POP, doAll=False, named=True, force=True)
-    
+            operation=Queues.POP, doAll=False, named=True, force=True
+        )
+
     def __hgQueueGotoPatch(self):
         """
         Private slot used to push or pop patches until the a named one
         is at the top of the stack.
         """
-        self.__hgQueuePushPopPatches(
-            operation=Queues.GOTO, doAll=False, named=True)
-    
+        self.__hgQueuePushPopPatches(operation=Queues.GOTO, doAll=False, named=True)
+
     def __hgQueueGotoPatchForced(self):
         """
         Private slot used to push or pop patches until the a named one
         is at the top of the stack overwriting local changes.
         """
         self.__hgQueuePushPopPatches(
-            operation=Queues.GOTO, doAll=False, named=True, force=True)
-    
+            operation=Queues.GOTO, doAll=False, named=True, force=True
+        )
+
     def __hgQueueListPatches(self):
         """
         Private slot used to show a list of applied and unapplied patches.
         """
         self.vcs.getExtensionObject("mq").hgQueueListPatches()
-    
+
     def __hgQueueFinishAppliedPatches(self):
         """
         Private slot used to finish all applied patches.
         """
         self.vcs.getExtensionObject("mq").hgQueueFinishAppliedPatches()
-    
+
     def __hgQueueRenamePatch(self):
         """
         Private slot used to rename a patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueRenamePatch()
-    
+
     def __hgQueueDeletePatch(self):
         """
         Private slot used to delete a patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueDeletePatch()
-    
+
     def __hgQueueFoldUnappliedPatches(self):
         """
         Private slot used to fold patches into the current patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueFoldUnappliedPatches()
-    
+
     def __hgQueueGuardsDefine(self):
         """
         Private slot used to define guards for the current or a named patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsDefine()
-    
+
     def __hgQueueGuardsDropAll(self):
         """
         Private slot used to drop all guards of the current or a named patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsDropAll()
-    
+
     def __hgQueueGuardsList(self):
         """
         Private slot used to list the guards for the current or a named patch.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsList()
-    
+
     def __hgQueueGuardsListAll(self):
         """
         Private slot used to list all guards of all patches.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsListAll()
-    
+
     def __hgQueueGuardsSetActive(self):
         """
         Private slot used to set the active guards.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsSetActive()
-    
+
     def __hgQueueGuardsDeactivate(self):
         """
         Private slot used to deactivate all active guards.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsDeactivate()
-    
+
     def __hgQueueGuardsIdentifyActive(self):
         """
         Private slot used to list all active guards.
         """
         self.vcs.getExtensionObject("mq").hgQueueGuardsIdentifyActive()
-    
+
     def __hgQueueCreateQueue(self):
         """
         Private slot used to create a new queue.
         """
         self.vcs.getExtensionObject("mq").hgQueueCreateRenameQueue(True)
-    
+
     def __hgQueueRenameQueue(self):
         """
         Private slot used to rename the active queue.
         """
         self.vcs.getExtensionObject("mq").hgQueueCreateRenameQueue(False)
-    
+
     def __hgQueueDeleteQueue(self):
         """
         Private slot used to delete the reference to a queue.
         """
         self.vcs.getExtensionObject("mq").hgQueueDeletePurgeActivateQueue(
-            Queues.QUEUE_DELETE)
-    
+            Queues.QUEUE_DELETE
+        )
+
     def __hgQueuePurgeQueue(self):
         """
         Private slot used to delete the reference to a queue and remove
         the patch directory.
         """
         self.vcs.getExtensionObject("mq").hgQueueDeletePurgeActivateQueue(
-            Queues.QUEUE_PURGE)
-    
+            Queues.QUEUE_PURGE
+        )
+
     def __hgQueueActivateQueue(self):
         """
         Private slot used to set the active queue.
         """
         self.vcs.getExtensionObject("mq").hgQueueDeletePurgeActivateQueue(
-            Queues.QUEUE_ACTIVATE)
-    
+            Queues.QUEUE_ACTIVATE
+        )
+
     def __hgQueueListQueues(self):
         """
         Private slot used to list available queues.
         """
         self.vcs.getExtensionObject("mq").hgQueueListQueues()
-    
+
     def __hgQueueInit(self):
         """
         Private slot to initialize a new queue repository.
         """
-        self.vcs.getExtensionObject("mq").hgQueueInit(
-            self.project.getProjectPath())
-    
+        self.vcs.getExtensionObject("mq").hgQueueInit(self.project.getProjectPath())
+
     def __hgQueueCommit(self):
         """
         Private slot to commit changes in the queue repository.
         """
         self.vcs.vcsCommit(self.project.getProjectPath(), "", mq=True)
-    
+
     def __hgQueueStatus(self):
         """
         Private slot to show the status of the queue repository.
         """
-        self.vcs.getExtensionObject("mq").hgQueueStatus(
-            self.project.getProjectPath())
-    
+        self.vcs.getExtensionObject("mq").hgQueueStatus(self.project.getProjectPath())
+
     def __hgQueueSummary(self):
         """
         Private slot to show a summary of the queue repository.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,26 +19,27 @@
     """
     Class implementing the queues extension interface.
     """
+
     APPLIED_LIST = 0
     UNAPPLIED_LIST = 1
     SERIES_LIST = 2
-    
+
     POP = 0
     PUSH = 1
     GOTO = 2
-    
+
     QUEUE_DELETE = 0
     QUEUE_PURGE = 1
     QUEUE_ACTIVATE = 2
-    
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-        
+
         self.qdiffDialog = None
         self.qheaderDialog = None
         self.queuesListDialog = None
@@ -47,7 +48,7 @@
         self.queuesDefineGuardsDialog = None
         self.queuesListQueuesDialog = None
         self.queueStatusDialog = None
-    
+
     def shutdown(self):
         """
         Public method used to shutdown the queues interface.
@@ -68,11 +69,11 @@
             self.queuesListQueuesDialog.close()
         if self.queueStatusDialog is not None:
             self.queueStatusDialog.close()
-    
+
     def __getPatchesList(self, listType, withSummary=False):
         """
         Private method to get a list of patches of a given type.
-        
+
         @param listType type of patches list to get
             (Queues.APPLIED_LIST, Queues.UNAPPLIED_LIST, Queues.SERIES_LIST)
         @param withSummary flag indicating to get a summary as well (boolean)
@@ -80,24 +81,27 @@
         @exception ValueError raised to indicate an invalid patch list type
         """
         patchesList = []
-        
-        if listType not in (Queues.APPLIED_LIST, Queues.UNAPPLIED_LIST,
-                            Queues.SERIES_LIST):
+
+        if listType not in (
+            Queues.APPLIED_LIST,
+            Queues.UNAPPLIED_LIST,
+            Queues.SERIES_LIST,
+        ):
             raise ValueError("illegal value for listType")
-        
+
         if listType == Queues.APPLIED_LIST:
             args = self.vcs.initCommand("qapplied")
         elif listType == Queues.UNAPPLIED_LIST:
             args = self.vcs.initCommand("qunapplied")
         else:
             args = self.vcs.initCommand("qseries")
-        
+
         if withSummary:
             args.append("--summary")
-        
+
         client = self.vcs.getClient()
         output = client.runcommand(args)[0]
-        
+
         for line in output.splitlines():
             if withSummary:
                 li = line.strip().split(": ")
@@ -108,75 +112,79 @@
                 patchesList.append("{0}@@{1}".format(patch, summary))
             else:
                 patchesList.append(line.strip())
-        
+
         return patchesList
-    
+
     def __getCurrentPatch(self):
         """
         Private method to get the name of the current patch.
-        
+
         @return name of the current patch (string)
         """
         currentPatch = ""
-        
+
         args = self.vcs.initCommand("qtop")
-        
+
         client = self.vcs.getClient()
         currentPatch = client.runcommand(args)[0].strip()
-        
+
         return currentPatch
-    
+
     def __getCommitMessage(self):
         """
         Private method to get the commit message of the current patch.
-        
+
         @return name of the current patch (string)
         """
         message = ""
-        
+
         args = self.vcs.initCommand("qheader")
-        
+
         client = self.vcs.getClient()
         message = client.runcommand(args)[0]
-        
+
         return message
-    
+
     def getGuardsList(self, allGuards=True):
         """
         Public method to get a list of all guards defined.
-        
+
         @param allGuards flag indicating to get all guards (boolean)
         @return sorted list of guards (list of strings)
         """
         guardsList = []
-        
+
         args = self.vcs.initCommand("qselect")
         if allGuards:
             args.append("--series")
-        
+
         client = self.vcs.getClient()
         output = client.runcommand(args)[0]
-        
+
         for guard in output.splitlines():
             guard = guard.strip()
             if allGuards:
                 guard = guard[1:]
             if guard not in guardsList:
                 guardsList.append(guard)
-        
+
         return sorted(guardsList)
-    
+
     def hgQueueNewPatch(self):
         """
         Public method to create a new named patch.
         """
         from .HgQueuesNewPatchDialog import HgQueuesNewPatchDialog
+
         dlg = HgQueuesNewPatchDialog(HgQueuesNewPatchDialog.NEW_MODE)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (name, message,
-             (userData, currentUser, userName),
-             (dateData, currentDate, dateStr)) = dlg.getData()
-            
+            (
+                name,
+                message,
+                (userData, currentUser, userName),
+                (dateData, currentDate, dateStr),
+            ) = dlg.getData()
+
             args = self.vcs.initCommand("qnew")
             if message != "":
                 args.append("--message")
@@ -194,31 +202,36 @@
                     args.append("--date")
                     args.append(dateStr)
             args.append(name)
-            
-            dia = HgDialog(self.tr('New Patch'), self.vcs)
+
+            dia = HgDialog(self.tr("New Patch"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 self.vcs.checkVCSStatus()
-    
+
     def hgQueueRefreshPatch(self, editMessage=False):
         """
         Public method to refresh the current patch.
-        
+
         @param editMessage flag indicating to edit the current
             commit message (boolean)
         """
         args = self.vcs.initCommand("qrefresh")
-        
+
         if editMessage:
             currentMessage = self.__getCommitMessage()
             from .HgQueuesNewPatchDialog import HgQueuesNewPatchDialog
-            dlg = HgQueuesNewPatchDialog(HgQueuesNewPatchDialog.REFRESH_MODE,
-                                         currentMessage)
+
+            dlg = HgQueuesNewPatchDialog(
+                HgQueuesNewPatchDialog.REFRESH_MODE, currentMessage
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                (name, message,
-                 (userData, currentUser, userName),
-                 (dateData, currentDate, dateStr)) = dlg.getData()
+                (
+                    name,
+                    message,
+                    (userData, currentUser, userName),
+                    (dateData, currentDate, dateStr),
+                ) = dlg.getData()
                 if message != "" and message != currentMessage:
                     args.append("--message")
                     args.append(message)
@@ -236,41 +249,42 @@
                         args.append(dateStr)
             else:
                 return
-        
-        dia = HgDialog(self.tr('Update Current Patch'), self.vcs)
+
+        dia = HgDialog(self.tr("Update Current Patch"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             self.vcs.checkVCSStatus()
-    
+
     def hgQueueShowPatch(self, name):
         """
         Public method to show the contents of the current patch.
-        
+
         @param name file/directory name (string)
         """
         from ..HgDiffDialog import HgDiffDialog
+
         self.qdiffDialog = HgDiffDialog(self.vcs)
         self.qdiffDialog.show()
         QApplication.processEvents()
         self.qdiffDialog.start(name, qdiff=True)
-    
+
     def hgQueueShowHeader(self):
         """
         Public method to show the commit message of the current patch.
         """
         from .HgQueuesHeaderDialog import HgQueuesHeaderDialog
+
         self.qheaderDialog = HgQueuesHeaderDialog(self.vcs)
         self.qheaderDialog.show()
         QApplication.processEvents()
         self.qheaderDialog.start()
-    
-    def hgQueuePushPopPatches(self, operation, doAll=False, named=False,
-                              force=False):
+
+    def hgQueuePushPopPatches(self, operation, doAll=False, named=False, force=False):
         """
         Public method to push patches onto the stack or pop patches off the
         stack.
-        
+
         @param operation operation type to be performed (Queues.POP,
             Queues.PUSH, Queues.GOTO)
         @param doAll flag indicating to push/pop all (boolean)
@@ -282,7 +296,7 @@
         """
         if operation not in (Queues.POP, Queues.PUSH, Queues.GOTO):
             raise ValueError("illegal value for operation")
-        
+
         if operation == Queues.POP:
             args = self.vcs.initCommand("qpop")
             title = self.tr("Pop Patches")
@@ -295,7 +309,7 @@
             args = self.vcs.initCommand("qgoto")
             title = self.tr("Go to Patch")
             listType = Queues.SERIES_LIST
-        
+
         args.append("-v")
         if force:
             args.append("--force")
@@ -309,7 +323,9 @@
                     self.tr("Select Patch"),
                     self.tr("Select the target patch name:"),
                     patchnames,
-                    0, False)
+                    0,
+                    False,
+                )
                 if ok and patch:
                     args.append(patch)
                 else:
@@ -318,9 +334,10 @@
                 EricMessageBox.information(
                     None,
                     self.tr("Select Patch"),
-                    self.tr("""No patches to select from."""))
+                    self.tr("""No patches to select from."""),
+                )
                 return False
-        
+
         dia = HgDialog(title, self.vcs)
         res = dia.startProcess(args)
         if res:
@@ -328,29 +345,30 @@
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgQueueListPatches(self):
         """
         Public method to show a list of all patches.
         """
         from .HgQueuesListDialog import HgQueuesListDialog
+
         self.queuesListDialog = HgQueuesListDialog(self.vcs)
         self.queuesListDialog.show()
         self.queuesListDialog.start()
-    
+
     def hgQueueFinishAppliedPatches(self):
         """
         Public method to finish all applied patches.
         """
         args = self.vcs.initCommand("qfinish")
         args.append("--applied")
-        
-        dia = HgDialog(self.tr('Finish Applied Patches'), self.vcs)
+
+        dia = HgDialog(self.tr("Finish Applied Patches"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             self.vcs.checkVCSStatus()
-    
+
     def hgQueueRenamePatch(self):
         """
         Public method to rename the current or a selected patch.
@@ -360,21 +378,20 @@
         if patchnames:
             currentPatch = self.__getCurrentPatch()
             if currentPatch:
-                from .HgQueuesRenamePatchDialog import (
-                    HgQueuesRenamePatchDialog
-                )
+                from .HgQueuesRenamePatchDialog import HgQueuesRenamePatchDialog
+
                 dlg = HgQueuesRenamePatchDialog(currentPatch, patchnames)
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     newName, selectedPatch = dlg.getData()
                     if selectedPatch:
                         args.append(selectedPatch)
                     args.append(newName)
-                    
+
                     dia = HgDialog(self.tr("Rename Patch"), self.vcs)
                     res = dia.startProcess(args)
                     if res:
                         dia.exec()
-    
+
     def hgQueueDeletePatch(self):
         """
         Public method to delete a selected unapplied patch.
@@ -387,29 +404,32 @@
                 self.tr("Select Patch"),
                 self.tr("Select the patch to be deleted:"),
                 patchnames,
-                0, False)
+                0,
+                False,
+            )
             if ok and patch:
                 args.append(patch)
-                
+
                 dia = HgDialog(self.tr("Delete Patch"), self.vcs)
                 res = dia.startProcess(args)
                 if res:
                     dia.exec()
         else:
             EricMessageBox.information(
-                None,
-                self.tr("Select Patch"),
-                self.tr("""No patches to select from."""))
-    
+                None, self.tr("Select Patch"), self.tr("""No patches to select from.""")
+            )
+
     def hgQueueFoldUnappliedPatches(self):
         """
         Public method to fold patches into the current patch.
         """
         args = self.vcs.initCommand("qfold")
         patchnames = sorted(
-            self.__getPatchesList(Queues.UNAPPLIED_LIST, withSummary=True))
+            self.__getPatchesList(Queues.UNAPPLIED_LIST, withSummary=True)
+        )
         if patchnames:
             from .HgQueuesFoldDialog import HgQueuesFoldDialog
+
             dlg = HgQueuesFoldDialog(patchnames)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 message, patchesList = dlg.getData()
@@ -418,7 +438,7 @@
                     args.append(message)
                 if patchesList:
                     args.extend(patchesList)
-                    
+
                     dia = HgDialog(self.tr("Fold Patches"), self.vcs)
                     res = dia.startProcess(args)
                     if res:
@@ -427,13 +447,15 @@
                     EricMessageBox.information(
                         None,
                         self.tr("Fold Patches"),
-                        self.tr("""No patches selected."""))
+                        self.tr("""No patches selected."""),
+                    )
         else:
             EricMessageBox.information(
                 None,
                 self.tr("Fold Patches"),
-                self.tr("""No patches available to be folded."""))
-    
+                self.tr("""No patches available to be folded."""),
+            )
+
     def hgQueueGuardsList(self):
         """
         Public method to list the guards for the current or a named patch.
@@ -441,25 +463,27 @@
         patchnames = sorted(self.__getPatchesList(Queues.SERIES_LIST))
         if patchnames:
             from .HgQueuesListGuardsDialog import HgQueuesListGuardsDialog
-            self.queuesListGuardsDialog = HgQueuesListGuardsDialog(
-                self.vcs, patchnames)
+
+            self.queuesListGuardsDialog = HgQueuesListGuardsDialog(self.vcs, patchnames)
             self.queuesListGuardsDialog.show()
             self.queuesListGuardsDialog.start()
         else:
             EricMessageBox.information(
                 None,
                 self.tr("List Guards"),
-                self.tr("""No patches available to list guards for."""))
-    
+                self.tr("""No patches available to list guards for."""),
+            )
+
     def hgQueueGuardsListAll(self):
         """
         Public method to list all guards of all patches.
         """
         from .HgQueuesListAllGuardsDialog import HgQueuesListAllGuardsDialog
+
         self.queuesListAllGuardsDialog = HgQueuesListAllGuardsDialog(self.vcs)
         self.queuesListAllGuardsDialog.show()
         self.queuesListAllGuardsDialog.start()
-    
+
     def hgQueueGuardsDefine(self):
         """
         Public method to define guards for the current or a named patch.
@@ -467,44 +491,51 @@
         patchnames = sorted(self.__getPatchesList(Queues.SERIES_LIST))
         if patchnames:
             from .HgQueuesDefineGuardsDialog import HgQueuesDefineGuardsDialog
+
             self.queuesDefineGuardsDialog = HgQueuesDefineGuardsDialog(
-                self.vcs, self, patchnames)
+                self.vcs, self, patchnames
+            )
             self.queuesDefineGuardsDialog.show()
             self.queuesDefineGuardsDialog.start()
         else:
             EricMessageBox.information(
                 None,
                 self.tr("Define Guards"),
-                self.tr("""No patches available to define guards for."""))
-    
+                self.tr("""No patches available to define guards for."""),
+            )
+
     def hgQueueGuardsDropAll(self):
         """
         Public method to drop all guards of the current or a named patch.
         """
-        patchnames = sorted(
-            self.__getPatchesList(Queues.SERIES_LIST))
+        patchnames = sorted(self.__getPatchesList(Queues.SERIES_LIST))
         if patchnames:
             patch, ok = QInputDialog.getItem(
                 None,
                 self.tr("Drop All Guards"),
-                self.tr("Select the patch to drop guards for"
-                        " (leave empty for the current patch):"),
+                self.tr(
+                    "Select the patch to drop guards for"
+                    " (leave empty for the current patch):"
+                ),
                 [""] + patchnames,
-                0, False)
+                0,
+                False,
+            )
             if ok:
                 args = self.vcs.initCommand("qguard")
                 if patch:
                     args.append(patch)
                 args.append("--none")
-                
+
                 client = self.vcs.getClient()
                 client.runcommand(args)
         else:
             EricMessageBox.information(
                 None,
                 self.tr("Drop All Guards"),
-                self.tr("""No patches available to define guards for."""))
-    
+                self.tr("""No patches available to define guards for."""),
+            )
+
     def hgQueueGuardsSetActive(self):
         """
         Public method to set the active guards.
@@ -512,18 +543,18 @@
         guardsList = self.getGuardsList()
         if guardsList:
             activeGuardsList = self.getGuardsList(allGuards=False)
-            from .HgQueuesGuardsSelectionDialog import (
-                HgQueuesGuardsSelectionDialog
+            from .HgQueuesGuardsSelectionDialog import HgQueuesGuardsSelectionDialog
+
+            dlg = HgQueuesGuardsSelectionDialog(
+                guardsList, activeGuards=activeGuardsList, listOnly=False
             )
-            dlg = HgQueuesGuardsSelectionDialog(
-                guardsList, activeGuards=activeGuardsList, listOnly=False)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 guards = dlg.getData()
                 if guards:
                     args = self.vcs.initCommand("qselect")
                     args.extend(guards)
-                    
-                    dia = HgDialog(self.tr('Set Active Guards'), self.vcs)
+
+                    dia = HgDialog(self.tr("Set Active Guards"), self.vcs)
                     res = dia.startProcess(args)
                     if res:
                         dia.exec()
@@ -531,51 +562,47 @@
             EricMessageBox.information(
                 None,
                 self.tr("Set Active Guards"),
-                self.tr("""No guards available to select from."""))
+                self.tr("""No guards available to select from."""),
+            )
             return
-    
+
     def hgQueueGuardsDeactivate(self):
         """
         Public method to deactivate all active guards.
         """
         args = self.vcs.initCommand("qselect")
         args.append("--none")
-        
-        dia = HgDialog(self.tr('Deactivate Guards'), self.vcs)
+
+        dia = HgDialog(self.tr("Deactivate Guards"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def hgQueueGuardsIdentifyActive(self):
         """
         Public method to list all active guards.
         """
         guardsList = self.getGuardsList(allGuards=False)
         if guardsList:
-            from .HgQueuesGuardsSelectionDialog import (
-                HgQueuesGuardsSelectionDialog
-            )
+            from .HgQueuesGuardsSelectionDialog import HgQueuesGuardsSelectionDialog
+
             dlg = HgQueuesGuardsSelectionDialog(guardsList, listOnly=True)
             dlg.exec()
-    
+
     def hgQueueCreateRenameQueue(self, isCreate):
         """
         Public method to create a new queue or rename the active queue.
-        
+
         @param isCreate flag indicating to create a new queue (boolean)
         """
-        from .HgQueuesQueueManagementDialog import (
-            HgQueuesQueueManagementDialog
-        )
-        
+        from .HgQueuesQueueManagementDialog import HgQueuesQueueManagementDialog
+
         title = (
-            self.tr("Create New Queue")
-            if isCreate else
-            self.tr("Rename Active Queue")
+            self.tr("Create New Queue") if isCreate else self.tr("Rename Active Queue")
         )
         dlg = HgQueuesQueueManagementDialog(
-            HgQueuesQueueManagementDialog.NAME_INPUT,
-            title, False, self.vcs)
+            HgQueuesQueueManagementDialog.NAME_INPUT, title, False, self.vcs
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             queueName = dlg.getData()
             if queueName:
@@ -585,54 +612,53 @@
                 else:
                     args.append("--rename")
                 args.append(queueName)
-                
+
                 client = self.vcs.getClient()
                 error = client.runcommand(args)[1]
-                
+
                 if error:
                     if isCreate:
-                        errMsg = self.tr(
-                            "Error while creating a new queue.")
+                        errMsg = self.tr("Error while creating a new queue.")
                     else:
-                        errMsg = self.tr(
-                            "Error while renaming the active queue.")
+                        errMsg = self.tr("Error while renaming the active queue.")
                     EricMessageBox.warning(
-                        None,
-                        title,
-                        """<p>{0}</p><p>{1}</p>""".format(errMsg, error))
+                        None, title, """<p>{0}</p><p>{1}</p>""".format(errMsg, error)
+                    )
                 else:
                     if (
-                        self.queuesListQueuesDialog is not None and
-                        self.queuesListQueuesDialog.isVisible()
+                        self.queuesListQueuesDialog is not None
+                        and self.queuesListQueuesDialog.isVisible()
                     ):
                         self.queuesListQueuesDialog.refresh()
-    
+
     def hgQueueDeletePurgeActivateQueue(self, operation):
         """
         Public method to delete the reference to a queue and optionally
         remove the patch directory or set the active queue.
-        
+
         @param operation operation to be performed (Queues.QUEUE_DELETE,
             Queues.QUEUE_PURGE, Queues.QUEUE_ACTIVATE)
         @exception ValueError raised to indicate an invalid operation
         """
-        if operation not in (Queues.QUEUE_PURGE, Queues.QUEUE_DELETE,
-                             Queues.QUEUE_ACTIVATE):
+        if operation not in (
+            Queues.QUEUE_PURGE,
+            Queues.QUEUE_DELETE,
+            Queues.QUEUE_ACTIVATE,
+        ):
             raise ValueError("illegal value for operation")
-        
+
         if operation == Queues.QUEUE_PURGE:
             title = self.tr("Purge Queue")
         elif operation == Queues.QUEUE_DELETE:
             title = self.tr("Delete Queue")
         else:
             title = self.tr("Activate Queue")
-        
-        from .HgQueuesQueueManagementDialog import (
-            HgQueuesQueueManagementDialog
+
+        from .HgQueuesQueueManagementDialog import HgQueuesQueueManagementDialog
+
+        dlg = HgQueuesQueueManagementDialog(
+            HgQueuesQueueManagementDialog.QUEUE_INPUT, title, True, self.vcs
         )
-        dlg = HgQueuesQueueManagementDialog(
-            HgQueuesQueueManagementDialog.QUEUE_INPUT,
-            title, True, self.vcs)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             queueName = dlg.getData()
             if queueName:
@@ -642,65 +668,64 @@
                 elif operation == Queues.QUEUE_DELETE:
                     args.append("--delete")
                 args.append(queueName)
-                
+
                 client = self.vcs.getClient()
                 error = client.runcommand(args)[1]
-                
+
                 if error:
                     if operation == Queues.QUEUE_PURGE:
                         errMsg = self.tr("Error while purging the queue.")
                     elif operation == Queues.QUEUE_DELETE:
                         errMsg = self.tr("Error while deleting the queue.")
                     elif operation == Queues.QUEUE_ACTIVATE:
-                        errMsg = self.tr(
-                            "Error while setting the active queue.")
+                        errMsg = self.tr("Error while setting the active queue.")
                     EricMessageBox.warning(
-                        None,
-                        title,
-                        """<p>{0}</p><p>{1}</p>""".format(errMsg, error))
+                        None, title, """<p>{0}</p><p>{1}</p>""".format(errMsg, error)
+                    )
                 else:
                     if (
-                        self.queuesListQueuesDialog is not None and
-                        self.queuesListQueuesDialog.isVisible()
+                        self.queuesListQueuesDialog is not None
+                        and self.queuesListQueuesDialog.isVisible()
                     ):
                         self.queuesListQueuesDialog.refresh()
-    
+
     def hgQueueListQueues(self):
         """
         Public method to list available queues.
         """
-        from .HgQueuesQueueManagementDialog import (
-            HgQueuesQueueManagementDialog
-        )
+        from .HgQueuesQueueManagementDialog import HgQueuesQueueManagementDialog
+
         self.queuesListQueuesDialog = HgQueuesQueueManagementDialog(
             HgQueuesQueueManagementDialog.NO_INPUT,
             self.tr("Available Queues"),
-            False, self.vcs)
+            False,
+            self.vcs,
+        )
         self.queuesListQueuesDialog.show()
-    
+
     def hgQueueInit(self, name):
         """
         Public method to initialize a new queue repository.
-        
+
         @param name directory name (string)
         """
         args = self.vcs.initCommand("init")
-        args.append('--mq')
+        args.append("--mq")
         args.append(self.vcs.getClient().getRepository())
         # init is not possible with the command server
-        dia = HgDialog(
-            self.tr('Initializing new queue repository'), self.vcs)
+        dia = HgDialog(self.tr("Initializing new queue repository"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def hgQueueStatus(self, name):
         """
         Public method used to view the status of a queue repository.
-        
+
         @param name directory name (string)
         """
         from ..HgStatusDialog import HgStatusDialog
+
         self.queueStatusDialog = HgStatusDialog(self.vcs, mq=True)
         self.queueStatusDialog.show()
         self.queueStatusDialog.start(name)
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/HgRebaseDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/HgRebaseDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter the data for a rebase session.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList, version,
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList, version, parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,21 +35,21 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__sourceRevisionButtonGroup = QButtonGroup(self)
         self.__sourceRevisionButtonGroup.addButton(self.parentButton)
         self.__sourceRevisionButtonGroup.addButton(self.sourceButton)
         self.__sourceRevisionButtonGroup.addButton(self.baseButton)
-        
+
         self.tag1Combo.addItems(sorted(tagsList))
         self.tag2Combo.addItems(sorted(tagsList))
         self.branch1Combo.addItems(["default"] + sorted(branchesList))
         self.branch2Combo.addItems(["default"] + sorted(branchesList))
         self.bookmark1Combo.addItems(sorted(bookmarksList))
         self.bookmark2Combo.addItems(sorted(bookmarksList))
-        
+
         self.dryRunGroup.setEnabled(version >= (4, 7, 0))
-        
+
         # connect various radio buttons and input fields
         self.id1Button.toggled.connect(self.__updateOK)
         self.tag1Button.toggled.connect(self.__updateOK)
@@ -61,22 +61,22 @@
         self.branch2Button.toggled.connect(self.__updateOK)
         self.bookmark2Button.toggled.connect(self.__updateOK)
         self.expression2Button.toggled.connect(self.__updateOK)
-        
+
         self.id1Edit.textChanged.connect(self.__updateOK)
         self.expression1Edit.textChanged.connect(self.__updateOK)
         self.id2Edit.textChanged.connect(self.__updateOK)
         self.expression2Edit.textChanged.connect(self.__updateOK)
-        
+
         self.tag1Combo.editTextChanged.connect(self.__updateOK)
         self.branch1Combo.editTextChanged.connect(self.__updateOK)
         self.bookmark1Combo.editTextChanged.connect(self.__updateOK)
         self.tag2Combo.editTextChanged.connect(self.__updateOK)
         self.branch2Combo.editTextChanged.connect(self.__updateOK)
         self.bookmark2Combo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -94,7 +94,7 @@
                 enabled = enabled and bool(self.bookmark1Combo.currentText())
             elif self.expression1Button.isChecked():
                 enabled = enabled and bool(self.expression1Edit.text())
-        
+
         if self.id2Button.isChecked():
             enabled = enabled and bool(self.id2Edit.text())
         elif self.tag2Button.isChecked():
@@ -105,14 +105,13 @@
             enabled = enabled and bool(self.bookmark2Combo.currentText())
         elif self.expression2Button.isChecked():
             enabled = enabled and bool(self.expression2Edit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __getRevision(self, no):
         """
         Private method to generate the revision.
-        
+
         @param no revision number to generate (1 or 2)
         @type int
         @return revision
@@ -146,7 +145,7 @@
             expressionButton = self.expression2Button
             expressionEdit = self.expression2Edit
             tipButton = self.tip2Button
-        
+
         if numberButton.isChecked():
             return "rev({0})".format(numberSpinBox.value())
         elif idButton.isChecked():
@@ -161,13 +160,13 @@
             return expressionEdit.text()
         elif tipButton and tipButton.isChecked():
             return ""
-        
+
         return ""
-    
+
     def getData(self):
         """
         Public method to retrieve the data for the rebase session.
-        
+
         @return tuple with a source indicator of "S" or "B", the source
             revision, the destination revision, a flag indicating to collapse,
             a flag indicating to keep the original changesets, a flag
@@ -184,7 +183,7 @@
         else:
             indicator = ""
         rev1 = self.__getRevision(1) if indicator else ""
-        
+
         return (
             indicator,
             rev1,
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,84 +21,99 @@
     """
     Class implementing the rebase extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgRebaseAct = EricAction(
-            self.tr('Rebase Changesets'),
+            self.tr("Rebase Changesets"),
             UI.PixmapCache.getIcon("vcsRebase"),
-            self.tr('Rebase Changesets'),
-            0, 0, self, 'mercurial_rebase')
-        self.hgRebaseAct.setStatusTip(self.tr(
-            'Rebase changesets to another branch'
-        ))
-        self.hgRebaseAct.setWhatsThis(self.tr(
-            """<b>Rebase Changesets</b>"""
-            """<p>This rebases changesets to another branch.</p>"""
-        ))
+            self.tr("Rebase Changesets"),
+            0,
+            0,
+            self,
+            "mercurial_rebase",
+        )
+        self.hgRebaseAct.setStatusTip(self.tr("Rebase changesets to another branch"))
+        self.hgRebaseAct.setWhatsThis(
+            self.tr(
+                """<b>Rebase Changesets</b>"""
+                """<p>This rebases changesets to another branch.</p>"""
+            )
+        )
         self.hgRebaseAct.triggered.connect(self.__hgRebase)
         self.actions.append(self.hgRebaseAct)
-        
+
         self.hgRebaseContinueAct = EricAction(
-            self.tr('Continue Rebase Session'),
-            self.tr('Continue Rebase Session'),
-            0, 0, self, 'mercurial_rebase_continue')
-        self.hgRebaseContinueAct.setStatusTip(self.tr(
-            'Continue the last rebase session after repair'
-        ))
-        self.hgRebaseContinueAct.setWhatsThis(self.tr(
-            """<b>Continue Rebase Session</b>"""
-            """<p>This continues the last rebase session after repair.</p>"""
-        ))
+            self.tr("Continue Rebase Session"),
+            self.tr("Continue Rebase Session"),
+            0,
+            0,
+            self,
+            "mercurial_rebase_continue",
+        )
+        self.hgRebaseContinueAct.setStatusTip(
+            self.tr("Continue the last rebase session after repair")
+        )
+        self.hgRebaseContinueAct.setWhatsThis(
+            self.tr(
+                """<b>Continue Rebase Session</b>"""
+                """<p>This continues the last rebase session after repair.</p>"""
+            )
+        )
         self.hgRebaseContinueAct.triggered.connect(self.__hgRebaseContinue)
         self.actions.append(self.hgRebaseContinueAct)
-        
+
         self.hgRebaseAbortAct = EricAction(
-            self.tr('Abort Rebase Session'),
-            self.tr('Abort Rebase Session'),
-            0, 0, self, 'mercurial_rebase_abort')
-        self.hgRebaseAbortAct.setStatusTip(self.tr(
-            'Abort the last rebase session'
-        ))
-        self.hgRebaseAbortAct.setWhatsThis(self.tr(
-            """<b>Abort Rebase Session</b>"""
-            """<p>This aborts the last rebase session.</p>"""
-        ))
+            self.tr("Abort Rebase Session"),
+            self.tr("Abort Rebase Session"),
+            0,
+            0,
+            self,
+            "mercurial_rebase_abort",
+        )
+        self.hgRebaseAbortAct.setStatusTip(self.tr("Abort the last rebase session"))
+        self.hgRebaseAbortAct.setWhatsThis(
+            self.tr(
+                """<b>Abort Rebase Session</b>"""
+                """<p>This aborts the last rebase session.</p>"""
+            )
+        )
         self.hgRebaseAbortAct.triggered.connect(self.__hgRebaseAbort)
         self.actions.append(self.hgRebaseAbortAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("vcsRebase"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgRebaseAct)
         menu.addAction(self.hgRebaseContinueAct)
         menu.addAction(self.hgRebaseAbortAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Rebase")
-    
+
     def __hgRebase(self):
         """
         Private slot used to rebase changesets to another branch.
@@ -109,10 +124,11 @@
                 None,
                 self.tr("Rebase Changesets"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgRebaseContinue(self):
         """
         Private slot used to continue the last rebase session after repair.
@@ -123,10 +139,11 @@
                 None,
                 self.tr("Rebase Changesets (Continue)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgRebaseAbort(self):
         """
         Private slot used to abort the last rebase session.
@@ -137,6 +154,7 @@
                 None,
                 self.tr("Rebase Changesets (Abort)"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/rebase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/rebase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,30 +17,43 @@
     """
     Class implementing the rebase extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-    
+
     def hgRebase(self):
         """
         Public method to rebase changesets to a different branch.
-        
+
         @return flag indicating that the project should be reread (boolean)
         """
         res = False
         from .HgRebaseDialog import HgRebaseDialog
-        dlg = HgRebaseDialog(self.vcs.hgGetTagsList(),
-                             self.vcs.hgGetBranchesList(),
-                             self.vcs.hgGetBookmarksList(),
-                             self.vcs.version)
+
+        dlg = HgRebaseDialog(
+            self.vcs.hgGetTagsList(),
+            self.vcs.hgGetBranchesList(),
+            self.vcs.hgGetBookmarksList(),
+            self.vcs.version,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (indicator, sourceRev, destRev, collapse, keep, keepBranches,
-             detach, dryRunOnly, dryRunConfirm) = dlg.getData()
-            
+            (
+                indicator,
+                sourceRev,
+                destRev,
+                collapse,
+                keep,
+                keepBranches,
+                detach,
+                dryRunOnly,
+                dryRunConfirm,
+            ) = dlg.getData()
+
             args = self.vcs.initCommand("rebase")
             if indicator == "S":
                 args.append("--source")
@@ -64,44 +77,44 @@
             elif dryRunConfirm:
                 args.append("--confirm")
             args.append("--verbose")
-            
-            dia = HgDialog(self.tr('Rebase Changesets'), self.vcs)
+
+            dia = HgDialog(self.tr("Rebase Changesets"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.vcs.checkVCSStatus()
         return res
-    
+
     def hgRebaseContinue(self):
         """
         Public method to continue rebasing changesets from another branch.
-        
+
         @return flag indicating that the project should be reread (boolean)
         """
         args = self.vcs.initCommand("rebase")
         args.append("--continue")
         args.append("--verbose")
-        
-        dia = HgDialog(self.tr('Rebase Changesets (Continue)'), self.vcs)
+
+        dia = HgDialog(self.tr("Rebase Changesets (Continue)"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgRebaseAbort(self):
         """
         Public method to abort rebasing changesets from another branch.
-        
+
         @return flag indicating that the project should be reread (boolean)
         """
         args = self.vcs.initCommand("rebase")
         args.append("--abort")
         args.append("--verbose")
-        
-        dia = HgDialog(self.tr('Rebase Changesets (Abort)'), self.vcs)
+
+        dia = HgDialog(self.tr("Rebase Changesets (Abort)"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QTreeWidgetItem, QAbstractButton, QMenu,
-    QHeaderView, QApplication
+    QWidget,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QAbstractButton,
+    QMenu,
+    QHeaderView,
+    QApplication,
 )
 
 from EricGui.EricOverrideCursor import EricOverrideCursor
@@ -22,64 +27,65 @@
     """
     Class implementing Mercurial shelve browser dialog.
     """
+
     NameColumn = 0
     AgeColumn = 1
     MessageColumn = 2
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__position = QPoint()
-        
+
         self.__fileStatisticsRole = Qt.ItemDataRole.UserRole
         self.__totalStatisticsRole = Qt.ItemDataRole.UserRole + 1
-        
-        self.shelveList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+
+        self.shelveList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the list of shelves"))
+            self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the list of shelves"))
         self.refreshButton.setEnabled(False)
-        
+
         self.vcs = vcs
         self.__hgClient = vcs.getClient()
         self.__resetUI()
-        
+
         self.__contextMenu = QMenu()
         self.__unshelveAct = self.__contextMenu.addAction(
-            self.tr("Restore selected shelve"), self.__unshelve)
+            self.tr("Restore selected shelve"), self.__unshelve
+        )
         self.__deleteAct = self.__contextMenu.addAction(
-            self.tr("Delete selected shelves"), self.__deleteShelves)
+            self.tr("Delete selected shelves"), self.__deleteShelves
+        )
         self.__contextMenu.addAction(
-            self.tr("Delete all shelves"), self.__cleanupShelves)
-    
+            self.tr("Delete all shelves"), self.__cleanupShelves
+        )
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -87,28 +93,26 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
         self.shelveList.clear()
-    
+
     def __resizeColumnsShelves(self):
         """
         Private method to resize the shelve list columns.
         """
-        self.shelveList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.shelveList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.shelveList.header().setStretchLastSection(True)
-    
-    def __generateShelveEntry(self, name, age, message, fileStatistics,
-                              totals):
+
+    def __generateShelveEntry(self, name, age, message, fileStatistics, totals):
         """
         Private method to generate the shelve items.
-        
+
         @param name name of the shelve (string)
         @param age age of the shelve (string)
         @param message shelve message (string)
@@ -122,27 +126,24 @@
         itm = QTreeWidgetItem(self.shelveList, [name, age, message])
         itm.setData(0, self.__fileStatisticsRole, fileStatistics)
         itm.setData(0, self.__totalStatisticsRole, totals)
-    
+
     def __getShelveEntries(self):
         """
         Private method to retrieve the list of shelves.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         self.buf = []
         self.errors.clear()
         self.intercept = False
-        
+
         args = self.vcs.initCommand("shelve")
         args.append("--list")
         args.append("--stat")
-        
+
         with EricOverrideCursor():
             out, err = self.__hgClient.runcommand(args)
             self.buf = out.splitlines(True)
@@ -150,35 +151,32 @@
                 self.__showError(err)
             self.__processBuffer()
         self.__finish()
-    
+
     def start(self):
         """
         Public slot to start the hg shelve command.
         """
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.shelveList.clear()
         self.__started = True
         self.__getShelveEntries()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the hg shelve command.
@@ -195,7 +193,7 @@
                 itemData["message"] = message.strip()
                 itemData["files"] = []
                 firstLine = False
-            elif '|' in line:
+            elif "|" in line:
                 # file stats: foo.py |  3 ++-
                 file, changes = line.strip().split("|", 1)
                 if changes.strip().endswith(("+", "-")):
@@ -204,8 +202,8 @@
                     deletions = str(addDelete.count("-"))
                 else:
                     total = changes.strip()
-                    additions = '0'
-                    deletions = '0'
+                    additions = "0"
+                    deletions = "0"
                 itemData["files"].append((file, total, additions, deletions))
                 lastWasFileStats = True
             elif lastWasFileStats:
@@ -216,55 +214,55 @@
                 added = added.split()[0]
                 deleted = deleted.split()[0]
                 itemData["summary"] = (total, added, deleted)
-                
+
                 self.__generateShelveEntry(
-                    itemData["name"], itemData["age"], itemData["message"],
-                    itemData["files"], itemData["summary"])
-                
+                    itemData["name"],
+                    itemData["age"],
+                    itemData["message"],
+                    itemData["files"],
+                    itemData["summary"],
+                )
+
                 lastWasFileStats = False
                 firstLine = True
                 itemData = {}
-        
+
         self.__resizeColumnsShelves()
-        
+
         if self.__started:
             self.shelveList.setCurrentItem(self.shelveList.topLevelItem(0))
             self.__started = False
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_shelveList_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the shelve list changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -273,50 +271,49 @@
             for dataSet in current.data(0, self.__fileStatisticsRole):
                 QTreeWidgetItem(self.statisticsList, list(dataSet))
             self.statisticsList.header().resizeSections(
-                QHeaderView.ResizeMode.ResizeToContents)
+                QHeaderView.ResizeMode.ResizeToContents
+            )
             self.statisticsList.header().setStretchLastSection(True)
-            
+
             totals = current.data(0, self.__totalStatisticsRole)
-            self.filesLabel.setText(
-                self.tr("%n file(s) changed", None, int(totals[0])))
+            self.filesLabel.setText(self.tr("%n file(s) changed", None, int(totals[0])))
             self.insertionsLabel.setText(
-                self.tr("%n line(s) inserted", None, int(totals[1])))
+                self.tr("%n line(s) inserted", None, int(totals[1]))
+            )
             self.deletionsLabel.setText(
-                self.tr("%n line(s) deleted", None, int(totals[2])))
+                self.tr("%n line(s) deleted", None, int(totals[2]))
+            )
         else:
             self.filesLabel.setText("")
             self.insertionsLabel.setText("")
             self.deletionsLabel.setText("")
-    
+
     @pyqtSlot(QPoint)
     def on_shelveList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu of the shelve list.
-        
+
         @param pos position of the mouse pointer (QPoint)
         """
         selectedItemsCount = len(self.shelveList.selectedItems())
         self.__unshelveAct.setEnabled(selectedItemsCount == 1)
         self.__deleteAct.setEnabled(selectedItemsCount > 0)
-        
+
         self.__contextMenu.popup(self.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the list of shelves.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.refreshButton.setEnabled(False)
-        
+
         self.start()
-    
+
     def __unshelve(self):
         """
         Private slot to restore the selected shelve of changes.
@@ -326,7 +323,7 @@
             name = itm.text(self.NameColumn)
             self.vcs.getExtensionObject("shelve").hgUnshelve(shelveName=name)
             self.on_refreshButton_clicked()
-    
+
     def __deleteShelves(self):
         """
         Private slot to delete the selected shelves.
@@ -336,9 +333,10 @@
             shelveNames.append(itm.text(self.NameColumn))
         if shelveNames:
             self.vcs.getExtensionObject("shelve").hgDeleteShelves(
-                shelveNames=shelveNames)
+                shelveNames=shelveNames
+            )
             self.on_refreshButton_clicked()
-    
+
     def __cleanupShelves(self):
         """
         Private slot to delete all shelves.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter the data for a shelve operation.
     """
+
     def __init__(self, version, parent=None):
         """
         Constructor
-        
+
         @param version Mercurial version
         @type tuple of three int
         @param parent reference to the parent widget
@@ -28,21 +29,21 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__initialDateTime = QDateTime.currentDateTime()
         self.dateTimeEdit.setDateTime(self.__initialDateTime)
-        
+
         if version < (5, 0, 0):
             self.keepCheckBox.setChecked(False)
             self.keepCheckBox.hide()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the user data.
-        
+
         @return tuple containing the name, date, message, a flag indicating
             to add/remove new/missing files and a flag indicating to keep the
             shelved changes in the working directory
@@ -50,8 +51,8 @@
         """
         dateTime = (
             self.dateTimeEdit.dateTime()
-            if self.dateTimeEdit.dateTime() != self.__initialDateTime else
-            QDateTime()
+            if self.dateTimeEdit.dateTime() != self.__initialDateTime
+            else QDateTime()
         )
         return (
             self.nameEdit.text().replace(" ", "_"),
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelvesSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelvesSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,39 +17,40 @@
     """
     Class implementing a dialog to select multiple shelve names.
     """
+
     def __init__(self, message, shelveNames, parent=None):
         """
         Constructor
-        
+
         @param message message to be shown (string)
         @param shelveNames list of shelve names (list of string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.message.setText(message)
         self.shelvesList.addItems(shelveNames)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     @pyqtSlot()
     def on_shelvesList_itemSelectionChanged(self):
         """
         Private slot to enabled the OK button if items have been selected.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            len(self.shelvesList.selectedItems()) > 0)
-    
+            len(self.shelvesList.selectedItems()) > 0
+        )
+
     def getSelectedShelves(self):
         """
         Public method to retrieve the selected shelve names.
-        
+
         @return selected shelve names (list of string)
         """
         names = []
         for itm in self.shelvesList.selectedItems():
             names.append(itm.text())
-        
+
         return names
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgUnshelveDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgUnshelveDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,35 +16,35 @@
     """
     Class implementing a dialog to enter the data for an unshelve operation.
     """
+
     def __init__(self, shelveNames, shelveName="", parent=None):
         """
         Constructor
-        
+
         @param shelveNames list of available shelves (list of string)
         @param shelveName name of the shelve to restore (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.nameComboBox.addItem("")
         self.nameComboBox.addItems(sorted(shelveNames))
-        
+
         if shelveName and shelveName in shelveNames:
-            self.nameComboBox.setCurrentIndex(
-                self.nameComboBox.findText(shelveName))
-        
+            self.nameComboBox.setCurrentIndex(self.nameComboBox.findText(shelveName))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the user data.
-        
+
         @return tuple containing the name (string) and a flag indicating
             to keep the shelved change (boolean)
         """
         return (
             self.nameComboBox.currentText().replace(" ", "_"),
-            self.keepCheckBox.isChecked()
+            self.keepCheckBox.isChecked(),
         )
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,61 +18,61 @@
     """
     Class implementing the shelve extension project browser helper.
     """
+
     def __init__(self, vcsObject, browserObject, projectObject):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
         """
-        super().__init__(
-            vcsObject, browserObject, projectObject)
-    
+        super().__init__(vcsObject, browserObject, projectObject)
+
     def initMenus(self):
         """
         Public method to generate the extension menus.
-        
+
         @return dictionary of populated menu (dict of QMenu). The dict
             must have the keys 'mainMenu', 'multiMenu', 'backMenu', 'dirMenu'
             and 'dirMultiMenu'.
         """
         self.__menus = {}
-        
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         menu.addAction(self.tr("Shelve changes"), self.__hgShelve)
-        self.__menus['mainMenu'] = menu
-        
+        self.__menus["mainMenu"] = menu
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         menu.addAction(self.tr("Shelve changes"), self.__hgShelve)
-        self.__menus['multiMenu'] = menu
-        
+        self.__menus["multiMenu"] = menu
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         menu.addAction(self.tr("Shelve changes"), self.__hgShelve)
-        self.__menus['dirMenu'] = menu
-        
+        self.__menus["dirMenu"] = menu
+
         menu = QMenu(self.menuTitle())
         menu.setTearOffEnabled(True)
         menu.addAction(self.tr("Shelve changes"), self.__hgShelve)
-        self.__menus['dirMultiMenu'] = menu
-        
+        self.__menus["dirMultiMenu"] = menu
+
         return self.__menus
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Shelve")
-    
+
     def showExtensionMenu(self, key, controlled):
         """
         Public method to prepare the extension menu for display.
-        
+
         @param key menu key (string, one of 'mainMenu', 'multiMenu',
             'backMenu', 'dirMenu' or 'dirMultiMenu')
         @param controlled flag indicating to prepare the menu for a
@@ -81,11 +81,11 @@
         """
         if key in self.__menus:
             self.__menus[key].setEnabled(controlled)
-    
+
     def __reopenProject(self, shouldReopen, title):
         """
         Private method to reopen the project if needed and wanted.
-        
+
         @param shouldReopen flag indicating that the project should
             be reopened (boolean)
         @param title title of the message box (string)
@@ -95,10 +95,11 @@
                 None,
                 title,
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgShelve(self):
         """
         Private slot used to shelve all current changes.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,127 +19,164 @@
     """
     Class implementing the shelve extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgShelveAct = EricAction(
-            self.tr('Shelve changes'),
-            self.tr('Shelve changes...'),
-            0, 0, self, 'mercurial_shelve')
-        self.hgShelveAct.setStatusTip(self.tr(
-            'Shelve all current changes of the project'
-        ))
-        self.hgShelveAct.setWhatsThis(self.tr(
-            """<b>Shelve changes</b>"""
-            """<p>This shelves all current changes of the project.</p>"""
-        ))
+            self.tr("Shelve changes"),
+            self.tr("Shelve changes..."),
+            0,
+            0,
+            self,
+            "mercurial_shelve",
+        )
+        self.hgShelveAct.setStatusTip(
+            self.tr("Shelve all current changes of the project")
+        )
+        self.hgShelveAct.setWhatsThis(
+            self.tr(
+                """<b>Shelve changes</b>"""
+                """<p>This shelves all current changes of the project.</p>"""
+            )
+        )
         self.hgShelveAct.triggered.connect(self.__hgShelve)
         self.actions.append(self.hgShelveAct)
-        
+
         self.hgShelveBrowserAct = EricAction(
-            self.tr('Show shelve browser'),
-            self.tr('Show shelve browser...'),
-            0, 0, self, 'mercurial_shelve_browser')
-        self.hgShelveBrowserAct.setStatusTip(self.tr(
-            'Show a dialog with all shelves'
-        ))
-        self.hgShelveBrowserAct.setWhatsThis(self.tr(
-            """<b>Show shelve browser...</b>"""
-            """<p>This shows a dialog listing all available shelves."""
-            """ Actions on these shelves may be executed via the"""
-            """ context menu.</p>"""
-        ))
-        self.hgShelveBrowserAct.triggered.connect(
-            self.__hgShelveBrowser)
+            self.tr("Show shelve browser"),
+            self.tr("Show shelve browser..."),
+            0,
+            0,
+            self,
+            "mercurial_shelve_browser",
+        )
+        self.hgShelveBrowserAct.setStatusTip(self.tr("Show a dialog with all shelves"))
+        self.hgShelveBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show shelve browser...</b>"""
+                """<p>This shows a dialog listing all available shelves."""
+                """ Actions on these shelves may be executed via the"""
+                """ context menu.</p>"""
+            )
+        )
+        self.hgShelveBrowserAct.triggered.connect(self.__hgShelveBrowser)
         self.actions.append(self.hgShelveBrowserAct)
-        
+
         self.hgUnshelveAct = EricAction(
-            self.tr('Restore shelved change'),
-            self.tr('Restore shelved change...'),
-            0, 0, self, 'mercurial_unshelve')
-        self.hgUnshelveAct.setStatusTip(self.tr(
-            'Restore a shelved change to the project directory'
-        ))
-        self.hgUnshelveAct.setWhatsThis(self.tr(
-            """<b>Restore shelved change</b>"""
-            """<p>This restore a shelved change to the project directory."""
-            """</p>"""
-        ))
+            self.tr("Restore shelved change"),
+            self.tr("Restore shelved change..."),
+            0,
+            0,
+            self,
+            "mercurial_unshelve",
+        )
+        self.hgUnshelveAct.setStatusTip(
+            self.tr("Restore a shelved change to the project directory")
+        )
+        self.hgUnshelveAct.setWhatsThis(
+            self.tr(
+                """<b>Restore shelved change</b>"""
+                """<p>This restore a shelved change to the project directory."""
+                """</p>"""
+            )
+        )
         self.hgUnshelveAct.triggered.connect(self.__hgUnshelve)
         self.actions.append(self.hgUnshelveAct)
-        
+
         self.hgUnshelveAbortAct = EricAction(
-            self.tr('Abort restore'),
-            self.tr('Abort restore...'),
-            0, 0, self, 'mercurial_unshelve_abort')
-        self.hgUnshelveAbortAct.setStatusTip(self.tr(
-            'Abort the restore operation in progress'
-        ))
-        self.hgUnshelveAbortAct.setWhatsThis(self.tr(
-            """<b>Abort restore</b>"""
-            """<p>This aborts the restore operation in progress and reverts"""
-            """ already applied changes.</p>"""
-        ))
+            self.tr("Abort restore"),
+            self.tr("Abort restore..."),
+            0,
+            0,
+            self,
+            "mercurial_unshelve_abort",
+        )
+        self.hgUnshelveAbortAct.setStatusTip(
+            self.tr("Abort the restore operation in progress")
+        )
+        self.hgUnshelveAbortAct.setWhatsThis(
+            self.tr(
+                """<b>Abort restore</b>"""
+                """<p>This aborts the restore operation in progress and reverts"""
+                """ already applied changes.</p>"""
+            )
+        )
         self.hgUnshelveAbortAct.triggered.connect(self.__hgUnshelveAbort)
         self.actions.append(self.hgUnshelveAbortAct)
-        
+
         self.hgUnshelveContinueAct = EricAction(
-            self.tr('Continue restore'),
-            self.tr('Continue restore...'),
-            0, 0, self, 'mercurial_unshelve_continue')
-        self.hgUnshelveContinueAct.setStatusTip(self.tr(
-            'Continue the restore operation in progress'
-        ))
-        self.hgUnshelveContinueAct.setWhatsThis(self.tr(
-            """<b>Continue restore</b>"""
-            """<p>This continues the restore operation in progress.</p>"""
-        ))
-        self.hgUnshelveContinueAct.triggered.connect(
-            self.__hgUnshelveContinue)
+            self.tr("Continue restore"),
+            self.tr("Continue restore..."),
+            0,
+            0,
+            self,
+            "mercurial_unshelve_continue",
+        )
+        self.hgUnshelveContinueAct.setStatusTip(
+            self.tr("Continue the restore operation in progress")
+        )
+        self.hgUnshelveContinueAct.setWhatsThis(
+            self.tr(
+                """<b>Continue restore</b>"""
+                """<p>This continues the restore operation in progress.</p>"""
+            )
+        )
+        self.hgUnshelveContinueAct.triggered.connect(self.__hgUnshelveContinue)
         self.actions.append(self.hgUnshelveContinueAct)
-        
+
         self.hgShelveDeleteAct = EricAction(
-            self.tr('Delete shelved changes'),
-            self.tr('Delete shelved changes...'),
-            0, 0, self, 'mercurial_shelve_delete')
-        self.hgShelveDeleteAct.setWhatsThis(self.tr(
-            """<b>Delete shelved changes...</b>"""
-            """<p>This opens a dialog to select the shelved changes to"""
-            """ delete and deletes the selected ones.</p>"""
-        ))
-        self.hgShelveDeleteAct.triggered.connect(
-            self.__hgDeleteShelves)
+            self.tr("Delete shelved changes"),
+            self.tr("Delete shelved changes..."),
+            0,
+            0,
+            self,
+            "mercurial_shelve_delete",
+        )
+        self.hgShelveDeleteAct.setWhatsThis(
+            self.tr(
+                """<b>Delete shelved changes...</b>"""
+                """<p>This opens a dialog to select the shelved changes to"""
+                """ delete and deletes the selected ones.</p>"""
+            )
+        )
+        self.hgShelveDeleteAct.triggered.connect(self.__hgDeleteShelves)
         self.actions.append(self.hgShelveDeleteAct)
-        
+
         self.hgShelveCleanupAct = EricAction(
-            self.tr('Delete ALL shelved changes'),
-            self.tr('Delete ALL shelved changes'),
-            0, 0, self, 'mercurial_shelve_cleanup')
-        self.hgShelveCleanupAct.setWhatsThis(self.tr(
-            """<b>Delete ALL shelved changes</b>"""
-            """<p>This deletes all shelved changes.</p>"""
-        ))
-        self.hgShelveCleanupAct.triggered.connect(
-            self.__hgCleanupShelves)
+            self.tr("Delete ALL shelved changes"),
+            self.tr("Delete ALL shelved changes"),
+            0,
+            0,
+            self,
+            "mercurial_shelve_cleanup",
+        )
+        self.hgShelveCleanupAct.setWhatsThis(
+            self.tr(
+                """<b>Delete ALL shelved changes</b>"""
+                """<p>This deletes all shelved changes.</p>"""
+            )
+        )
+        self.hgShelveCleanupAct.triggered.connect(self.__hgCleanupShelves)
         self.actions.append(self.hgShelveCleanupAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu (QMenu)
         @return populated menu (QMenu)
         """
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgShelveAct)
         menu.addSeparator()
         menu.addAction(self.hgShelveBrowserAct)
@@ -150,21 +187,21 @@
         menu.addSeparator()
         menu.addAction(self.hgShelveDeleteAct)
         menu.addAction(self.hgShelveCleanupAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu (string)
         """
         return self.tr("Shelve")
-    
+
     def __reopenProject(self, shouldReopen, title):
         """
         Private method to reopen the project if needed and wanted.
-        
+
         @param shouldReopen flag indicating that the project should
             be reopened (boolean)
         @param title title of the message box (string)
@@ -174,53 +211,53 @@
                 None,
                 title,
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-    
+
     def __hgShelve(self):
         """
         Private slot used to shelve all current changes.
         """
         shouldReopen = self.vcs.getExtensionObject("shelve").hgShelve(
-            self.project.getProjectPath())
+            self.project.getProjectPath()
+        )
         self.__reopenProject(shouldReopen, self.tr("Shelve"))
-    
+
     def __hgShelveBrowser(self):
         """
         Private slot to show the shelve browser dialog.
         """
         self.vcs.getExtensionObject("shelve").hgShelveBrowser()
-    
+
     def __hgUnshelve(self):
         """
         Private slot used to restore a shelved change.
         """
         shouldReopen = self.vcs.getExtensionObject("shelve").hgUnshelve()
         self.__reopenProject(shouldReopen, self.tr("Unshelve"))
-    
+
     def __hgUnshelveAbort(self):
         """
         Private slot used to abort an ongoing restore operation.
         """
         shouldReopen = self.vcs.getExtensionObject("shelve").hgUnshelveAbort()
         self.__reopenProject(shouldReopen, self.tr("Abort Unshelve"))
-    
+
     def __hgUnshelveContinue(self):
         """
         Private slot used to continue an ongoing restore operation.
         """
-        shouldReopen = (
-            self.vcs.getExtensionObject("shelve").hgUnshelveContinue()
-        )
+        shouldReopen = self.vcs.getExtensionObject("shelve").hgUnshelveContinue()
         self.__reopenProject(shouldReopen, self.tr("Continue Unshelve"))
-    
+
     def __hgDeleteShelves(self):
         """
         Private slot to delete selected shelves.
         """
         self.vcs.getExtensionObject("shelve").hgDeleteShelves()
-    
+
     def __hgCleanupShelves(self):
         """
         Private slot to delete all shelves.
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,58 +19,60 @@
     """
     Class implementing the shelve extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         """
         super().__init__(vcs)
-        
+
         self.__unshelveKeep = False
-        
+
         self.__shelveBrowserDialog = None
-    
+
     def shutdown(self):
         """
         Public method used to shutdown the shelve interface.
         """
         if self.__shelveBrowserDialog is not None:
             self.__shelveBrowserDialog.close()
-    
+
     def __hgGetShelveNamesList(self):
         """
         Private method to get the list of shelved changes.
-        
+
         @return list of shelved changes (list of string)
         """
         args = self.vcs.initCommand("shelve")
-        args.append('--list')
-        args.append('--quiet')
-        
+        args.append("--list")
+        args.append("--quiet")
+
         client = self.vcs.getClient()
         output = client.runcommand(args)[0]
-        
+
         shelveNamesList = []
         for line in output.splitlines():
             shelveNamesList.append(line.strip())
-        
+
         return shelveNamesList[:]
-    
+
     def hgShelve(self, name):
         """
         Public method to shelve current changes of files or directories.
-        
+
         @param name directory or file name (string) or list of directory
             or file names (list of string)
         @return flag indicating that the project should be reread (boolean)
         """
         res = False
         from .HgShelveDataDialog import HgShelveDataDialog
+
         dlg = HgShelveDataDialog(self.vcs.version)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             shelveName, dateTime, message, addRemove, keep = dlg.getData()
-            
+
             args = self.vcs.initCommand("shelve")
             if shelveName:
                 args.append("--name")
@@ -86,130 +88,132 @@
             if self.vcs.version >= (5, 0, 0) and keep:
                 args.append("--keep")
             args.append("-v")
-            
+
             if isinstance(name, list):
                 self.vcs.addArguments(args, name)
             else:
                 args.append(name)
-            
-            dia = HgDialog(self.tr('Shelve current changes'), self.vcs)
+
+            dia = HgDialog(self.tr("Shelve current changes"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.vcs.checkVCSStatus()
         return res
-    
+
     def hgShelveBrowser(self):
         """
         Public method to show the shelve browser dialog.
         """
         if self.__shelveBrowserDialog is None:
             from .HgShelveBrowserDialog import HgShelveBrowserDialog
-            self.__shelveBrowserDialog = HgShelveBrowserDialog(
-                self.vcs)
+
+            self.__shelveBrowserDialog = HgShelveBrowserDialog(self.vcs)
         self.__shelveBrowserDialog.show()
         self.__shelveBrowserDialog.start()
-    
+
     def hgUnshelve(self, shelveName=""):
         """
         Public method to restore shelved changes to the project directory.
-        
+
         @param shelveName name of the shelve to restore (string)
         @return flag indicating that the project should be reread (boolean)
         """
         res = False
         from .HgUnshelveDataDialog import HgUnshelveDataDialog
-        dlg = HgUnshelveDataDialog(self.__hgGetShelveNamesList(),
-                                   shelveName=shelveName)
+
+        dlg = HgUnshelveDataDialog(self.__hgGetShelveNamesList(), shelveName=shelveName)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             shelveName, keep = dlg.getData()
             self.__unshelveKeep = keep  # store for potential continue
-            
+
             args = self.vcs.initCommand("unshelve")
             if keep:
                 args.append("--keep")
             if shelveName:
                 args.append(shelveName)
-            
-            dia = HgDialog(self.tr('Restore shelved changes'), self.vcs)
+
+            dia = HgDialog(self.tr("Restore shelved changes"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.vcs.checkVCSStatus()
         return res
-    
+
     def hgUnshelveAbort(self):
         """
         Public method to abort the ongoing restore operation.
-        
+
         @return flag indicating that the project should be reread (boolean)
         """
         args = self.vcs.initCommand("unshelve")
         args.append("--abort")
-        
-        dia = HgDialog(self.tr('Abort restore operation'), self.vcs)
+
+        dia = HgDialog(self.tr("Abort restore operation"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgUnshelveContinue(self):
         """
         Public method to continue the ongoing restore operation.
-        
+
         @return flag indicating that the project should be reread (boolean)
         """
         args = self.vcs.initCommand("unshelve")
         if self.__unshelveKeep:
             args.append("--keep")
         args.append("--continue")
-        
-        dia = HgDialog(self.tr('Continue restore operation'), self.vcs)
+
+        dia = HgDialog(self.tr("Continue restore operation"), self.vcs)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
             self.vcs.checkVCSStatus()
         return res
-    
+
     def hgDeleteShelves(self, shelveNames=None):
         """
         Public method to delete named shelves.
-        
+
         @param shelveNames name of shelves to delete (list of string)
         """
         if not shelveNames:
             from .HgShelvesSelectionDialog import HgShelvesSelectionDialog
+
             dlg = HgShelvesSelectionDialog(
                 self.tr("Select the shelves to be deleted:"),
-                self.__hgGetShelveNamesList())
+                self.__hgGetShelveNamesList(),
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 shelveNames = dlg.getSelectedShelves()
             else:
                 return
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             None,
             self.tr("Delete shelves"),
             self.tr("Do you really want to delete these shelves?"),
-            shelveNames)
+            shelveNames,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             args = self.vcs.initCommand("shelve")
             args.append("--delete")
             args.extend(shelveNames)
-            
-            dia = HgDialog(self.tr('Delete shelves'), self.vcs)
+
+            dia = HgDialog(self.tr("Delete shelves"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgCleanupShelves(self):
         """
         Public method to delete all shelves.
@@ -217,12 +221,13 @@
         res = EricMessageBox.yesNo(
             None,
             self.tr("Delete all shelves"),
-            self.tr("""Do you really want to delete all shelved changes?"""))
+            self.tr("""Do you really want to delete all shelved changes?"""),
+        )
         if res:
             args = self.vcs.initCommand("shelve")
             args.append("--cleanup")
-            
-            dia = HgDialog(self.tr('Delete all shelves'), self.vcs)
+
+            dia = HgDialog(self.tr("Delete all shelves"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/HgStripDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/HgStripDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter the data to strip changesets.
     """
-    def __init__(self, tagsList, branchesList, bookmarksList=None, rev="",
-                 parent=None):
+
+    def __init__(self, tagsList, branchesList, bookmarksList=None, rev="", parent=None):
         """
         Constructor
-        
+
         @param tagsList list of tags
         @type list of str
         @param branchesList list of branches
@@ -35,35 +35,35 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.tagCombo.addItems(sorted(tagsList))
         self.branchCombo.addItems(["default"] + sorted(branchesList))
         if bookmarksList is not None:
             self.bookmarkCombo.addItems([""] + sorted(bookmarksList))
         self.idEdit.setText(rev)
-        
+
         # connect various radio buttons and input fields
         self.numberButton.toggled.connect(self.__updateOK)
         self.idButton.toggled.connect(self.__updateOK)
         self.tagButton.toggled.connect(self.__updateOK)
         self.branchButton.toggled.connect(self.__updateOK)
         self.expressionButton.toggled.connect(self.__updateOK)
-        
+
         self.numberSpinBox.valueChanged.connect(self.__updateOK)
-        
+
         self.idEdit.textChanged.connect(self.__updateOK)
         self.expressionEdit.textChanged.connect(self.__updateOK)
-        
+
         self.tagCombo.editTextChanged.connect(self.__updateOK)
         self.branchCombo.editTextChanged.connect(self.__updateOK)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOK()
-        
+
         self.idEdit.setFocus()
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
@@ -80,14 +80,13 @@
             enabled = enabled and bool(self.branchCombo.currentText())
         elif self.expressionButton.isChecked():
             enabled = enabled and bool(self.expressionEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enabled)
+
     def __getRevision(self):
         """
         Private method to generate the revision.
-        
+
         @return revision
         @rtype str
         """
@@ -104,11 +103,11 @@
         else:
             # should not happen
             return ""
-    
+
     def getData(self):
         """
         Public method to retrieve the data for the strip action.
-        
+
         @return tuple with the revision, a bookmark name, a flag indicating
             to enforce the strip action, a flag indicating to omit the creation
             of backup bundles and a flag indicating to not modify the working
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,37 +21,42 @@
     """
     Class implementing the strip extension project helper.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.hgStripAct = EricAction(
-            self.tr('Strip changesets'),
+            self.tr("Strip changesets"),
             UI.PixmapCache.getIcon("fileDelete"),
-            self.tr('Strip changesets'),
-            0, 0, self, 'mercurial_strip')
-        self.hgStripAct.setStatusTip(self.tr(
-            'Strip changesets from a repository'
-        ))
-        self.hgStripAct.setWhatsThis(self.tr(
-            """<b>Strip changesets</b>"""
-            """<p>This deletes a changeset and all its descendants"""
-            """ from a repository. Each removed changeset will be"""
-            """ stored in .hg/strip-backup as a bundle file.</p>"""
-        ))
+            self.tr("Strip changesets"),
+            0,
+            0,
+            self,
+            "mercurial_strip",
+        )
+        self.hgStripAct.setStatusTip(self.tr("Strip changesets from a repository"))
+        self.hgStripAct.setWhatsThis(
+            self.tr(
+                """<b>Strip changesets</b>"""
+                """<p>This deletes a changeset and all its descendants"""
+                """ from a repository. Each removed changeset will be"""
+                """ stored in .hg/strip-backup as a bundle file.</p>"""
+            )
+        )
         self.hgStripAct.triggered.connect(self.__hgStrip)
         self.actions.append(self.hgStripAct)
-    
+
     def initMenu(self, mainMenu):
         """
         Public method to generate the extension menu.
-        
+
         @param mainMenu reference to the main menu
         @type QMenu
         @return populated menu (QMenu)
@@ -59,31 +64,33 @@
         menu = QMenu(self.menuTitle(), mainMenu)
         menu.setIcon(UI.PixmapCache.getIcon("fileDelete"))
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.hgStripAct)
-        
+
         return menu
-    
+
     def menuTitle(self):
         """
         Public method to get the menu title.
-        
+
         @return title of the menu
         @rtype str
         """
         return self.tr("Strip")
-    
+
     def __hgStrip(self):
         """
         Private slot used to strip revisions from a repository.
         """
         shouldReopen = self.vcs.getExtensionObject("strip").hgStrip(
-            self.project.getProjectPath())
+            self.project.getProjectPath()
+        )
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 None,
                 self.tr("Strip"),
                 self.tr("""The project should be reread. Do this now?"""),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/strip.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/StripExtension/strip.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,33 +17,37 @@
     """
     Class implementing the strip extension interface.
     """
+
     def __init__(self, vcs):
         """
         Constructor
-        
+
         @param vcs reference to the Mercurial vcs object
         @type Hg
         """
         super().__init__(vcs)
-    
+
     def hgStrip(self, rev=""):
         """
         Public method to strip revisions from a repository.
-        
+
         @param rev revision to strip from
         @type str
         @return flag indicating that the project should be reread
         @rtype bool
         """
         from .HgStripDialog import HgStripDialog
+
         res = False
-        dlg = HgStripDialog(self.vcs.hgGetTagsList(),
-                            self.vcs.hgGetBranchesList(),
-                            self.vcs.hgGetBookmarksList(),
-                            rev)
+        dlg = HgStripDialog(
+            self.vcs.hgGetTagsList(),
+            self.vcs.hgGetBranchesList(),
+            self.vcs.hgGetBookmarksList(),
+            rev,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             rev, bookmark, force, noBackup, keep = dlg.getData()
-            
+
             args = self.vcs.initCommand("strip")
             if bookmark:
                 args.append("--bookmark")
@@ -56,10 +60,8 @@
                 args.append("--keep")
             args.append("-v")
             args.append(rev)
-            
-            dia = HgDialog(
-                self.tr("Stripping changesets from repository"),
-                self.vcs)
+
+            dia = HgDialog(self.tr("Stripping changesets from repository"), self.vcs)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/hg.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/hg.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,46 +33,47 @@
 class Hg(VersionControl):
     """
     Class implementing the version control systems interface to Mercurial.
-    
+
     @signal committed() emitted after the commit action has completed
     @signal activeExtensionsChanged() emitted when the list of active
         extensions has changed
     @signal iniFileChanged() emitted when a Mercurial/repo configuration file
         has changed
     """
+
     committed = pyqtSignal()
     activeExtensionsChanged = pyqtSignal()
     iniFileChanged = pyqtSignal()
-    
+
     IgnoreFileName = ".hgignore"
-    
+
     def __init__(self, plugin, parent=None, name=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VersionControl.__init__(self, parent, name)
         self.defaultOptions = {
-            'global': [''],
-            'commit': [''],
-            'checkout': [''],
-            'update': [''],
-            'add': [''],
-            'remove': [''],
-            'diff': [''],
-            'log': [''],
-            'history': [''],
-            'status': [''],
-            'tag': [''],
-            'export': ['']
+            "global": [""],
+            "commit": [""],
+            "checkout": [""],
+            "update": [""],
+            "add": [""],
+            "remove": [""],
+            "diff": [""],
+            "log": [""],
+            "history": [""],
+            "status": [""],
+            "tag": [""],
+            "export": [""],
         }
-        
+
         self.__plugin = plugin
         self.__ui = parent
-        
+
         self.options = self.defaultOptions
         self.tagsList = []
         self.branchesList = []
@@ -80,19 +81,19 @@
         self.bookmarksList = []
         self.showedTags = False
         self.showedBranches = False
-        
+
         self.tagTypeList = [
-            'tags',
-            'branches',
+            "tags",
+            "branches",
         ]
-        
+
         self.commandHistory = []
-        
+
         if "HG_ASP_DOT_NET_HACK" in os.environ:
-            self.adminDir = '_hg'
+            self.adminDir = "_hg"
         else:
-            self.adminDir = '.hg'
-        
+            self.adminDir = ".hg"
+
         self.logBrowser = None
         self.logBrowserIncoming = None
         self.logBrowserOutgoing = None
@@ -107,35 +108,36 @@
         self.bookmarksListDlg = None
         self.bookmarksInOutDlg = None
         self.conflictsDlg = None
-        
+
         self.bundleFile = None
         self.__lastChangeGroupPath = None
-        
+
         self.statusCache = {}
-        
+
         self.__commitData = {}
         self.__commitDialog = None
-        
+
         self.__forgotNames = []
-        
+
         self.__activeExtensions = []
-        
+
         from .HgUtilities import getConfigPath
+
         self.__iniWatcher = QFileSystemWatcher(self)
         self.__iniWatcher.fileChanged.connect(self.__iniFileChanged)
         cfgFile = getConfigPath()
         if os.path.exists(cfgFile):
             self.__iniWatcher.addPath(cfgFile)
-        
+
         self.__client = None
         self.__createClient()
         self.__projectHelper = None
-        
+
         self.__repoDir = ""
         self.__repoIniFile = ""
         self.__defaultConfigured = False
         self.__defaultPushConfigured = False
-        
+
         # instantiate the extensions
         from .QueuesExtension.queues import Queues
         from .PurgeExtension.purge import Purge
@@ -146,6 +148,7 @@
         from .StripExtension.strip import Strip
         from .HisteditExtension.histedit import Histedit
         from .CloseheadExtension.closehead import Closehead
+
         self.__extensions = {
             "mq": Queues(self),
             "purge": Purge(self),
@@ -157,23 +160,23 @@
             "histedit": Histedit(self),
             "closehead": Closehead(self),
         }
-    
+
     def getPlugin(self):
         """
         Public method to get a reference to the plugin object.
-        
+
         @return reference to the plugin object (VcsMercurialPlugin)
         """
         return self.__plugin
-    
+
     def getEncoding(self):
         """
         Public method to get the encoding to be used by Mercurial.
-        
+
         @return encoding (string)
         """
         return self.__plugin.getPreferences("Encoding")
-    
+
     def vcsShutdown(self):
         """
         Public method used to shutdown the Mercurial interface.
@@ -198,74 +201,74 @@
             self.annotate.close()
         if self.serveDlg is not None:
             self.serveDlg.close()
-        
+
         if self.bookmarksListDlg is not None:
             self.bookmarksListDlg.close()
         if self.bookmarksInOutDlg is not None:
             self.bookmarksInOutDlg.close()
-        
+
         if self.conflictsDlg is not None:
             self.conflictsDlg.close()
-        
+
         if self.bundleFile and os.path.exists(self.bundleFile):
             os.remove(self.bundleFile)
-        
+
         # shut down the project helpers
         if self.__projectHelper is not None:
             self.__projectHelper.shutdown()
-        
+
         # shut down the extensions
         for extension in self.__extensions.values():
             extension.shutdown()
-        
+
         # shut down the client
         self.__client and self.__client.stopServer()
-    
+
     def initCommand(self, command):
         """
         Public method to initialize a command arguments list.
-        
+
         @param command command name (string)
         @return list of command options (list of string)
         """
         args = [command]
         self.addArguments(args, self.__plugin.getGlobalOptions())
         return args
-    
+
     def vcsExists(self):
         """
         Public method used to test for the presence of the hg executable.
-        
+
         @return flag indicating the existence (boolean) and an error message
             (string)
         """
         from .HgUtilities import hgVersion
-        
+
         self.versionStr, self.version, errMsg = hgVersion(self.__plugin)
         hgExists = errMsg == ""
         if hgExists:
             self.__getExtensionsInfo()
         return hgExists, errMsg
-    
+
     def vcsInit(self, vcsDir, noDialog=False):
         """
         Public method used to initialize the mercurial repository.
-        
+
         The initialization is done, when a project is converted into a
         Mercurial controlled project. Therefore we always return TRUE without
         doing anything.
-        
+
         @param vcsDir name of the VCS directory (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return always TRUE
         """
         return True
-    
+
     def vcsConvertProject(self, vcsDataDict, project, addAll=True):
         """
         Public method to convert an uncontrolled project to a version
         controlled project.
-        
+
         @param vcsDataDict dictionary of data required for the conversion
         @type dict
         @param project reference to the project object
@@ -278,19 +281,19 @@
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Create project repository"),
-                self.tr(
-                    """The project repository could not be created."""))
+                self.tr("""The project repository could not be created."""),
+            )
         else:
             pfn = project.pfile
             if not os.path.isfile(pfn):
                 pfn += "z"
             project.closeProject()
             project.openProject(pfn)
-    
+
     def vcsImport(self, vcsDataDict, projectDir, noDialog=False, addAll=True):
         """
         Public method used to import the project into the Mercurial repository.
-        
+
         @param vcsDataDict dictionary of data required for the import
         @type dict
         @param projectDir project directory (string)
@@ -305,44 +308,42 @@
         """
         msg = vcsDataDict["message"]
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         args = self.initCommand("init")
         args.append(projectDir)
-        dia = HgDialog(self.tr('Creating Mercurial repository'), self)
+        dia = HgDialog(self.tr("Creating Mercurial repository"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
         status = dia.normalExit()
-        
+
         if status:
             self.stopClient()
             self.__repoDir = projectDir
-            
+
             ignoreName = os.path.join(projectDir, Hg.IgnoreFileName)
             if not os.path.exists(ignoreName):
                 status = self.hgCreateIgnoreFile(projectDir)
-            
+
             if status and addAll:
                 args = self.initCommand("commit")
-                args.append('--addremove')
-                args.append('--message')
+                args.append("--addremove")
+                args.append("--message")
                 args.append(msg)
-                dia = HgDialog(
-                    self.tr('Initial commit to Mercurial repository'),
-                    self)
+                dia = HgDialog(self.tr("Initial commit to Mercurial repository"), self)
                 res = dia.startProcess(args)
                 if res:
                     dia.exec()
                 status = dia.normalExit()
-        
+
         return status, False
-    
+
     def vcsCheckout(self, vcsDataDict, projectDir, noDialog=False):
         """
         Public method used to check the project out of a Mercurial repository
         (clone).
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @param noDialog flag indicating quiet operations
@@ -354,7 +355,7 @@
         except KeyError:
             rev = None
         vcsUrl = self.hgNormalizeURL(vcsDataDict["url"])
-        
+
         args = self.initCommand("clone")
         if rev:
             args.append("--rev")
@@ -363,23 +364,21 @@
             args.append("--all-largefiles")
         args.append(vcsUrl)
         args.append(projectDir)
-        
+
         if noDialog:
             out, err = self.__client.runcommand(args)
             return err == ""
         else:
-            dia = HgDialog(
-                self.tr('Cloning project from a Mercurial repository'),
-                self)
+            dia = HgDialog(self.tr("Cloning project from a Mercurial repository"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
             return dia.normalExit()
-    
+
     def vcsExport(self, vcsDataDict, projectDir):
         """
         Public method used to export a directory from the Mercurial repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @return flag indicating an execution without errors (boolean)
@@ -389,13 +388,14 @@
         if os.path.exists(os.path.join(projectDir, Hg.IgnoreFileName)):
             os.remove(os.path.join(projectDir, Hg.IgnoreFileName))
         return status
-    
-    def vcsCommit(self, name, message, noDialog=False, closeBranch=False,
-                  mq=False, merge=False):
+
+    def vcsCommit(
+        self, name, message, noDialog=False, closeBranch=False, mq=False, merge=False
+    ):
         """
         Public method used to make the change of a file/directory permanent
         in the Mercurial repository.
-        
+
         @param name file/directory name to be committed (string or list of
             strings)
         @param message message for this operation (string)
@@ -405,32 +405,32 @@
         @param merge flag indicating a merge commit (boolean)
         """
         msg = message
-        
+
         if mq or merge:
             # ensure dialog is shown for a queue commit
             noDialog = False
-        
+
         if not noDialog:
             # call CommitDialog and get message from there
             if self.__commitDialog is None:
                 from .HgCommitDialog import HgCommitDialog
-                self.__commitDialog = HgCommitDialog(self, msg, mq, merge,
-                                                     self.__ui)
+
+                self.__commitDialog = HgCommitDialog(self, msg, mq, merge, self.__ui)
                 self.__commitDialog.accepted.connect(self.__vcsCommit_Step2)
             self.__commitDialog.show()
             self.__commitDialog.raise_()
             self.__commitDialog.activateWindow()
-        
+
         self.__commitData["name"] = name
         self.__commitData["msg"] = msg
         self.__commitData["noDialog"] = noDialog
         self.__commitData["closeBranch"] = closeBranch
         self.__commitData["mq"] = mq
         self.__commitData["merge"] = merge
-        
+
         if noDialog:
             self.__vcsCommit_Step2()
-    
+
     def __vcsCommit_Step2(self):
         """
         Private slot performing the second step of the commit action.
@@ -441,7 +441,7 @@
         closeBranch = self.__commitData["closeBranch"]
         mq = self.__commitData["mq"]
         merge = self.__commitData["merge"]
-        
+
         if not noDialog:
             # check, if there are unsaved changes, that should be committed
             if isinstance(name, list):
@@ -455,34 +455,38 @@
                     project = ericApp().getObject("Project")
                     if nam == project.getProjectPath():
                         ok &= (
-                            project.checkAllScriptsDirty(
-                                reportSyntaxErrors=True) and
-                            project.checkDirty()
+                            project.checkAllScriptsDirty(reportSyntaxErrors=True)
+                            and project.checkDirty()
                         )
                         continue
                 elif os.path.isfile(nam):
-                    editor = (
-                        ericApp().getObject("ViewManager").getOpenEditor(nam)
-                    )
+                    editor = ericApp().getObject("ViewManager").getOpenEditor(nam)
                     if editor:
                         ok &= editor.checkDirty()
                 if not ok:
                     break
-            
+
             if not ok:
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Commit Changes"),
                     self.tr(
                         """The commit affects files, that have unsaved"""
-                        """ changes. Shall the commit be continued?"""),
-                    icon=EricMessageBox.Warning)
+                        """ changes. Shall the commit be continued?"""
+                    ),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-        
+
         if self.__commitDialog is not None:
-            (msg, amend, commitSubrepositories, author,
-             dateTime) = self.__commitDialog.getCommitData()
+            (
+                msg,
+                amend,
+                commitSubrepositories,
+                author,
+                dateTime,
+            ) = self.__commitDialog.getCommitData()
             self.__commitDialog.deleteLater()
             self.__commitDialog = None
             if amend and not msg:
@@ -492,10 +496,10 @@
             commitSubrepositories = False
             author = ""
             dateTime = ""
-        
+
         if not msg and not amend:
-            msg = '***'
-        
+            msg = "***"
+
         args = self.initCommand("commit")
         args.append("-v")
         if mq:
@@ -527,10 +531,8 @@
             self.addArguments(args, name)
         else:
             args.append(name)
-        
-        dia = HgDialog(
-            self.tr('Committing changes to Mercurial repository'),
-            self)
+
+        dia = HgDialog(self.tr("Committing changes to Mercurial repository"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
@@ -541,11 +543,11 @@
                 model.updateVCSStatus(name)
             self.__forgotNames = []
         self.checkVCSStatus()
-    
+
     def vcsCommitMessages(self):
         """
         Public method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         """
@@ -553,14 +555,14 @@
         messages = self._vcsProjectCommitMessages()
         if not messages:
             # empty list returned, try the vcs specific one
-            messages = self.getPlugin().getPreferences('Commits')
-        
+            messages = self.getPlugin().getPreferences("Commits")
+
         return messages
-    
+
     def vcsAddCommitMessage(self, message):
         """
         Public method to add a commit message to the list of saved messages.
-        
+
         @param message message to be added
         @type str
         """
@@ -571,40 +573,40 @@
             commitMessages.insert(0, message)
             no = Preferences.getVCS("CommitMessages")
             del commitMessages[no:]
-            self.getPlugin().setPreferences('Commits', commitMessages)
-    
+            self.getPlugin().setPreferences("Commits", commitMessages)
+
     def vcsClearCommitMessages(self):
         """
         Public method to clear the list of saved messages.
         """
         if not self._vcsClearProjectCommitMessages():
-            self.getPlugin().setPreferences('Commits', [])
-    
+            self.getPlugin().setPreferences("Commits", [])
+
     def __getMostRecentCommitMessage(self):
         """
         Private method to get the most recent commit message.
-        
+
         Note: This message is extracted from the parent commit of the
         working directory.
-        
+
         @return most recent commit message
         @rtype str
         """
         args = self.initCommand("log")
         args.append("--rev")
         args.append(".")
-        args.append('--template')
-        args.append('{desc}')
-        
+        args.append("--template")
+        args.append("{desc}")
+
         output, error = self.__client.runcommand(args)
-        
+
         return output
-    
+
     def vcsUpdate(self, name=None, noDialog=False, revision=None):
         """
         Public method used to update a file/directory with the Mercurial
         repository.
-        
+
         @param name file/directory name to be updated (not used)
         @param noDialog flag indicating quiet operations (boolean)
         @param revision revision to update to (string)
@@ -617,75 +619,72 @@
         if revision:
             args.append("-r")
             args.append(revision)
-        
+
         if noDialog:
             out, err = self.__client.runcommand(args)
             res = False
         else:
-            dia = HgDialog(self.tr(
-                'Synchronizing with the Mercurial repository'),
-                self)
+            dia = HgDialog(self.tr("Synchronizing with the Mercurial repository"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def vcsAdd(self, name, isDir=False, noDialog=False):
         """
         Public method used to add a file/directory to the Mercurial repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @param noDialog flag indicating quiet operations
         """
         args = self.initCommand("add")
         args.append("-v")
-        
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         if noDialog:
             out, err = self.__client.runcommand(args)
         else:
             dia = HgDialog(
-                self.tr(
-                    'Adding files/directories to the Mercurial repository'),
-                self)
+                self.tr("Adding files/directories to the Mercurial repository"), self
+            )
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def vcsAddBinary(self, name, isDir=False):
         """
         Public method used to add a file/directory in binary mode to the
         Mercurial repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         """
         self.vcsAdd(name, isDir)
-    
+
     def vcsAddTree(self, path):
         """
         Public method to add a directory tree rooted at path to the Mercurial
         repository.
-        
+
         @param path root directory of the tree to be added (string or list of
             strings))
         """
         self.vcsAdd(path, isDir=False)
-    
+
     def vcsRemove(self, name, project=False, noDialog=False):
         """
         Public method used to remove a file/directory from the Mercurial
         repository.
-        
+
         The default operation is to remove the local copy as well.
-        
+
         @param name file/directory name to be removed (string or list of
             strings))
         @param project flag indicating deletion of a project tree (boolean)
@@ -695,34 +694,33 @@
         """
         args = self.initCommand("remove")
         args.append("-v")
-        if noDialog and '--force' not in args:
-            args.append('--force')
-        
+        if noDialog and "--force" not in args:
+            args.append("--force")
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         if noDialog:
             out, err = self.__client.runcommand(args)
             res = err == ""
         else:
             dia = HgDialog(
-                self.tr(
-                    'Removing files/directories from the Mercurial'
-                    ' repository'),
-                self)
+                self.tr("Removing files/directories from the Mercurial" " repository"),
+                self,
+            )
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.normalExitWithoutErrors()
-        
+
         return res
-    
+
     def vcsMove(self, name, project, target=None, noDialog=False):
         """
         Public method used to move a file/directory.
-        
+
         @param name file/directory name to be moved (string)
         @param project reference to the project object
         @param target new name of the file/directory (string)
@@ -730,7 +728,7 @@
         @return flag indicating successfull operation (boolean)
         """
         isDir = os.path.isdir(name)
-        
+
         res = False
         if noDialog:
             if target is None:
@@ -739,24 +737,25 @@
             accepted = True
         else:
             from .HgCopyDialog import HgCopyDialog
+
             dlg = HgCopyDialog(name, None, True)
             accepted = dlg.exec() == QDialog.DialogCode.Accepted
             if accepted:
                 target, force = dlg.getData()
-        
+
         if accepted:
             args = self.initCommand("rename")
             args.append("-v")
             if force:
-                args.append('--force')
+                args.append("--force")
             args.append(name)
             args.append(target)
-            
+
             if noDialog:
                 out, err = self.__client.runcommand(args)
                 res = err == ""
             else:
-                dia = HgDialog(self.tr('Renaming {0}').format(name), self)
+                dia = HgDialog(self.tr("Renaming {0}").format(name), self)
                 res = dia.startProcess(args)
                 if res:
                     dia.exec()
@@ -773,17 +772,17 @@
                     else:
                         project.removeFile(name)
         return res
-    
+
     def vcsDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Mercurial repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -798,47 +797,50 @@
                     return
         if self.diff is None:
             from .HgDiffDialog import HgDiffDialog
+
             self.diff = HgDiffDialog(self)
         self.diff.show()
         self.diff.raise_()
         QApplication.processEvents()
         self.diff.start(name, refreshable=True)
-    
+
     def vcsStatus(self, name):
         """
         Public method used to view the status of files/directories in the
         Mercurial repository.
-        
+
         @param name file/directory name(s) to show the status of
             (string or list of strings)
         """
         if self.status is None:
             from .HgStatusDialog import HgStatusDialog
+
             self.status = HgStatusDialog(self)
         self.status.show()
         self.status.raise_()
         self.status.start(name)
-    
+
     def hgSummary(self, mq=False, largefiles=False):
         """
         Public method used to show some summary information of the
         working directory state.
-        
+
         @param mq flag indicating to show the queue status as well (boolean)
         @param largefiles flag indicating to show the largefiles status as
             well (boolean)
         """
         if self.summary is None:
             from .HgSummaryDialog import HgSummaryDialog
+
             self.summary = HgSummaryDialog(self)
         self.summary.show()
         self.summary.raise_()
         self.summary.start(mq=mq, largefiles=largefiles)
-    
+
     def vcsTag(self, name=None, revision=None, tagName=None):
         """
         Public method used to set/remove a tag in the Mercurial repository.
-        
+
         @param name file/directory name to determine the repo root from
             (string)
         @param revision revision to set tag for (string)
@@ -846,51 +848,49 @@
         @return flag indicating a performed tag action (boolean)
         """
         from .HgTagDialog import HgTagDialog
-        dlg = HgTagDialog(self.hgGetTagsList(withType=True),
-                          revision, tagName)
+
+        dlg = HgTagDialog(self.hgGetTagsList(withType=True), revision, tagName)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, revision, tagOp, force = dlg.getParameters()
         else:
             return False
-        
+
         args = self.initCommand("tag")
         msgPart = ""
         if tagOp in [HgTagDialog.CreateLocalTag, HgTagDialog.DeleteLocalTag]:
-            args.append('--local')
+            args.append("--local")
             msgPart = "local "
         else:
             msgPart = "global "
         if tagOp in [HgTagDialog.DeleteGlobalTag, HgTagDialog.DeleteLocalTag]:
-            args.append('--remove')
+            args.append("--remove")
         if (
-            tagOp in [
-                HgTagDialog.CreateGlobalTag, HgTagDialog.CreateLocalTag] and
-            revision
+            tagOp in [HgTagDialog.CreateGlobalTag, HgTagDialog.CreateLocalTag]
+            and revision
         ):
             args.append("--rev")
             args.append(revision)
         if force:
             args.append("--force")
-        args.append('--message')
+        args.append("--message")
         if tagOp in [HgTagDialog.CreateGlobalTag, HgTagDialog.CreateLocalTag]:
             tag = tag.strip().replace(" ", "_")
             args.append("Created {1}tag <{0}>.".format(tag, msgPart))
         else:
             args.append("Removed {1}tag <{0}>.".format(tag, msgPart))
         args.append(tag)
-        
-        dia = HgDialog(self.tr('Tagging in the Mercurial repository'),
-                       self)
+
+        dia = HgDialog(self.tr("Tagging in the Mercurial repository"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-        
+
         return True
-    
+
     def vcsRevert(self, name):
         """
         Public method used to revert changes made to a file/directory.
-        
+
         @param name file/directory name to be reverted
         @type str
         @return flag indicating, that the update contained an add
@@ -907,29 +907,33 @@
         else:
             args.append(name)
             names = [name]
-        
+
         project = ericApp().getObject("Project")
         names = [project.getRelativePath(nam) for nam in names]
         if names[0]:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Revert changes"),
                 self.tr(
                     "Do you really want to revert all changes to these files"
-                    " or directories?"),
-                names)
+                    " or directories?"
+                ),
+                names,
+            )
             yes = dlg.exec() == QDialog.DialogCode.Accepted
         else:
             yes = EricMessageBox.yesNo(
                 None,
                 self.tr("Revert changes"),
-                self.tr("""Do you really want to revert all changes of"""
-                        """ the project?"""))
+                self.tr(
+                    """Do you really want to revert all changes of"""
+                    """ the project?"""
+                ),
+            )
         if yes:
-            dia = HgDialog(self.tr('Reverting changes'), self)
+            dia = HgDialog(self.tr("Reverting changes"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
@@ -937,13 +941,13 @@
             self.checkVCSStatus()
         else:
             res = False
-        
+
         return res
-    
+
     def vcsMerge(self, name, rev=""):
         """
         Public method used to merge a URL/revision into the local project.
-        
+
         @param name file/directory name to be merged
         @type str
         @param rev revision to merge with
@@ -951,16 +955,19 @@
         """
         if not rev:
             from .HgMergeDialog import HgMergeDialog
-            dlg = HgMergeDialog(self.hgGetTagsList(),
-                                self.hgGetBranchesList(),
-                                self.hgGetBookmarksList())
+
+            dlg = HgMergeDialog(
+                self.hgGetTagsList(),
+                self.hgGetBranchesList(),
+                self.hgGetBookmarksList(),
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev, force = dlg.getParameters()
             else:
                 return
         else:
             force = False
-        
+
         args = self.initCommand("merge")
         if force:
             args.append("--force")
@@ -970,17 +977,17 @@
         if rev:
             args.append("--rev")
             args.append(rev)
-        
-        dia = HgDialog(self.tr('Merging'), self)
+
+        dia = HgDialog(self.tr("Merging"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
         self.checkVCSStatus()
-    
+
     def hgReMerge(self, name):
         """
         Public method used to merge a URL/revision into the local project.
-        
+
         @param name file/directory name to be merged (string)
         """
         args = self.initCommand("resolve")
@@ -993,59 +1000,61 @@
         else:
             args.append(name)
             names = [name]
-        
+
         project = ericApp().getObject("Project")
         names = [project.getRelativePath(nam) for nam in names]
         if names[0]:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Re-Merge"),
                 self.tr(
-                    "Do you really want to re-merge these files"
-                    " or directories?"),
-                names)
+                    "Do you really want to re-merge these files" " or directories?"
+                ),
+                names,
+            )
             yes = dlg.exec() == QDialog.DialogCode.Accepted
         else:
             yes = EricMessageBox.yesNo(
                 None,
                 self.tr("Re-Merge"),
-                self.tr("""Do you really want to re-merge the project?"""))
+                self.tr("""Do you really want to re-merge the project?"""),
+            )
         if yes:
-            dia = HgDialog(self.tr('Re-Merging').format(name), self)
+            dia = HgDialog(self.tr("Re-Merging").format(name), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
             self.checkVCSStatus()
-    
+
     def vcsSwitch(self, name):
         """
         Public method used to switch a working directory to a different
         revision.
-        
+
         @param name directory name to be switched (string)
         @return flag indicating, that the switch contained an add
             or delete (boolean)
         """
         from .HgRevisionSelectionDialog import HgRevisionSelectionDialog
+
         dlg = HgRevisionSelectionDialog(
             self.hgGetTagsList(),
             self.hgGetBranchesList(),
             bookmarksList=self.hgGetBookmarksList(),
-            noneLabel=self.tr("Current branch tip")
+            noneLabel=self.tr("Current branch tip"),
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             rev = dlg.getRevision()
             return self.vcsUpdate(name, revision=rev)
-        
+
         return False
 
     def vcsRegisteredState(self, name):
         """
         Public method used to get the registered state of a file in the vcs.
-        
+
         @param name file or directory name to check
         @type str
         @return a combination of canBeCommited and canBeAdded
@@ -1054,42 +1063,38 @@
         if name.endswith(os.sep):
             name = name[:-1]
         name = os.path.normcase(name)
-        
-        if (
-            os.path.isdir(name) and
-            os.path.isdir(os.path.join(name, self.adminDir))
-        ):
+
+        if os.path.isdir(name) and os.path.isdir(os.path.join(name, self.adminDir)):
             return self.canBeCommitted
-        
+
         if name in self.statusCache:
             return self.statusCache[name]
         args = self.initCommand("status")
-        args.append('--all')
-        args.append('--noninteractive')
-        
+        args.append("--all")
+        args.append("--noninteractive")
+
         output, error = self.__client.runcommand(args)
-        
+
         if output:
             repodir = self.getClient().getRepository()
             for line in output.splitlines():
                 if len(line) > 2 and line[0] in "MARC!?I" and line[1] == " ":
                     flag, path = line.split(" ", 1)
-                    absname = Utilities.normcasepath(
-                        os.path.join(repodir, path))
+                    absname = Utilities.normcasepath(os.path.join(repodir, path))
                     if flag not in "?I" and absname == name:
                         return self.canBeCommitted
-        
+
         return self.canBeAdded
-    
+
     def vcsAllRegisteredStates(self, names, dname, shortcut=True):
         """
         Public method used to get the registered states of a number of files
         in the vcs.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files have been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1099,20 +1104,20 @@
         if dname.endswith(os.sep):
             dname = dname[:-1]
         dname = os.path.normcase(dname)
-        
+
         found = False
         for name in list(self.statusCache.keys()):
             if name in names:
                 found = True
                 names[name] = self.statusCache[name]
-        
+
         if not found:
             args = self.initCommand("status")
-            args.append('--all')
-            args.append('--noninteractive')
-            
+            args.append("--all")
+            args.append("--noninteractive")
+
             output, error = self.__client.runcommand(args)
-            
+
             if output:
                 repoPath = self.getClient().getRepository()
                 dirs = [x for x in names.keys() if os.path.isdir(x)]
@@ -1139,29 +1144,29 @@
                             self.statusCache[name] = self.canBeAdded
                             if dirName not in self.statusCache:
                                 self.statusCache[dirName] = self.canBeAdded
-        
+
         return names
-    
+
     def clearStatusCache(self):
         """
         Public method to clear the status cache.
         """
         self.statusCache = {}
-    
+
     def vcsName(self):
         """
         Public method returning the name of the vcs.
-        
+
         @return always 'Mercurial' (string)
         """
         return "Mercurial"
-    
+
     def vcsInitConfig(self, project):
         """
         Public method to initialize the VCS configuration.
-        
+
         This method ensures, that an ignore file exists.
-        
+
         @param project reference to the project (Project)
         """
         ppath = project.getProjectPath()
@@ -1169,53 +1174,54 @@
             ignoreName = os.path.join(ppath, Hg.IgnoreFileName)
             if not os.path.exists(ignoreName):
                 self.hgCreateIgnoreFile(project.getProjectPath(), autoAdd=True)
-    
+
     def vcsCleanup(self, name):
         """
         Public method used to cleanup the working directory.
-        
+
         @param name directory name to be cleaned up (string)
         """
         patterns = self.getPlugin().getPreferences("CleanupPatterns").split()
-        
+
         entries = []
         for pat in patterns:
             entries.extend(Utilities.direntries(name, True, pat))
-        
+
         for entry in entries:
             with contextlib.suppress(OSError):
                 os.remove(entry)
-    
+
     def vcsCommandLine(self, name):
         """
         Public method used to execute arbitrary mercurial commands.
-        
+
         @param name directory name of the working directory (string)
         """
         from .HgCommandDialog import HgCommandDialog
+
         dlg = HgCommandDialog(self.commandHistory, name)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             command = dlg.getData()
             commandList = Utilities.parseOptionString(command)
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             if command in self.commandHistory:
                 self.commandHistory.remove(command)
             self.commandHistory.insert(0, command)
-            
+
             args = []
             self.addArguments(args, commandList)
-            
-            dia = HgDialog(self.tr('Mercurial command'), self)
+
+            dia = HgDialog(self.tr("Mercurial command"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def vcsOptionsDialog(self, project, archive, editable=False, parent=None):
         """
         Public method to get a dialog to enter repository info.
-        
+
         @param project reference to the project object
         @param archive name of the project in the repository (string)
         @param editable flag indicating that the project name is editable
@@ -1224,167 +1230,174 @@
         @return reference to the instantiated options dialog (HgOptionsDialog)
         """
         from .HgOptionsDialog import HgOptionsDialog
+
         return HgOptionsDialog(self, project, parent)
-    
+
     def vcsNewProjectOptionsDialog(self, parent=None):
         """
         Public method to get a dialog to enter repository info for getting a
         new project.
-        
+
         @param parent parent widget (QWidget)
         @return reference to the instantiated options dialog
             (HgNewProjectOptionsDialog)
         """
         from .HgNewProjectOptionsDialog import HgNewProjectOptionsDialog
+
         return HgNewProjectOptionsDialog(self, parent)
-    
+
     def vcsRepositoryInfos(self, ppath):
         """
         Public method to retrieve information about the repository.
-        
+
         @param ppath local path to get the repository infos (string)
         @return string with ready formated info for display (string)
         """
         args = self.initCommand("parents")
-        args.append('--template')
-        args.append('{rev}:{node|short}@@@{tags}@@@{author|xmlescape}@@@'
-                    '{date|isodate}@@@{branches}@@@{bookmarks}\n')
-        
+        args.append("--template")
+        args.append(
+            "{rev}:{node|short}@@@{tags}@@@{author|xmlescape}@@@"
+            "{date|isodate}@@@{branches}@@@{bookmarks}\n"
+        )
+
         output, error = self.__client.runcommand(args)
-        
+
         infoBlock = []
         if output:
             for index, line in enumerate(output.splitlines(), start=1):
-                (changeset, tags, author, date, branches,
-                 bookmarks) = line.split("@@@")
+                (changeset, tags, author, date, branches, bookmarks) = line.split("@@@")
                 cdate, ctime = date.split()[:2]
                 info = []
-                info.append(QCoreApplication.translate(
-                    "mercurial",
-                    """<tr><td><b>Parent #{0}</b></td><td></td></tr>\n"""
-                    """<tr><td><b>Changeset</b></td><td>{1}</td></tr>""")
-                    .format(index, changeset))
-                if tags:
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Tags</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(tags.split())))
-                if bookmarks:
-                    info.append(QCoreApplication.translate(
+                info.append(
+                    QCoreApplication.translate(
                         "mercurial",
-                        """<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(bookmarks.split())))
+                        """<tr><td><b>Parent #{0}</b></td><td></td></tr>\n"""
+                        """<tr><td><b>Changeset</b></td><td>{1}</td></tr>""",
+                    ).format(index, changeset)
+                )
+                if tags:
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial", """<tr><td><b>Tags</b></td><td>{0}</td></tr>"""
+                        ).format("<br/>".join(tags.split()))
+                    )
+                if bookmarks:
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>""",
+                        ).format("<br/>".join(bookmarks.split()))
+                    )
                 if branches:
-                    info.append(QCoreApplication.translate(
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Branches</b></td><td>{0}</td></tr>""",
+                        ).format("<br/>".join(branches.split()))
+                    )
+                info.append(
+                    QCoreApplication.translate(
                         "mercurial",
-                        """<tr><td><b>Branches</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(branches.split())))
-                info.append(QCoreApplication.translate(
-                    "mercurial",
-                    """<tr><td><b>Last author</b></td><td>{0}</td></tr>\n"""
-                    """<tr><td><b>Committed date</b></td><td>{1}</td></tr>\n"""
-                    """<tr><td><b>Committed time</b></td><td>{2}</td></tr>""")
-                    .format(author, cdate, ctime))
+                        """<tr><td><b>Last author</b></td><td>{0}</td></tr>\n"""
+                        """<tr><td><b>Committed date</b></td><td>{1}</td></tr>\n"""
+                        """<tr><td><b>Committed time</b></td><td>{2}</td></tr>""",
+                    ).format(author, cdate, ctime)
+                )
                 infoBlock.append("\n".join(info))
         infoStr = (
-            """<tr></tr>{0}""".format("<tr></tr>".join(infoBlock))
-            if infoBlock else
-            ""
+            """<tr></tr>{0}""".format("<tr></tr>".join(infoBlock)) if infoBlock else ""
         )
-        
+
         url = ""
         args = self.initCommand("showconfig")
-        args.append('paths.default')
-        
+        args.append("paths.default")
+
         output, error = self.__client.runcommand(args)
         url = output.splitlines()[0].strip() if output else ""
-        
+
         return QCoreApplication.translate(
-            'mercurial',
+            "mercurial",
             """<h3>Repository information</h3>\n"""
             """<p><table>\n"""
             """<tr><td><b>Mercurial V.</b></td><td>{0}</td></tr>\n"""
             """<tr></tr>\n"""
             """<tr><td><b>URL</b></td><td>{1}</td></tr>\n"""
             """{2}"""
-            """</table></p>\n"""
+            """</table></p>\n""",
         ).format(self.versionStr, url, infoStr)
-    
+
     def vcsSupportCommandOptions(self):
         """
         Public method to signal the support of user settable command options.
-        
+
         @return flag indicating the support  of user settable command options
             (boolean)
         """
         return False
-    
+
     ###########################################################################
     ## Private Mercurial specific methods are below.
     ###########################################################################
-    
+
     def hgNormalizeURL(self, url):
         """
         Public method to normalize a url for Mercurial.
-        
+
         @param url url string (string)
         @return properly normalized url for mercurial (string)
         """
-        url = url.replace('\\', '/')
-        if url.endswith('/'):
+        url = url.replace("\\", "/")
+        if url.endswith("/"):
             url = url[:-1]
-        urll = url.split('//')
-        return "{0}//{1}".format(urll[0], '/'.join(urll[1:]))
-    
+        urll = url.split("//")
+        return "{0}//{1}".format(urll[0], "/".join(urll[1:]))
+
     def hgCopy(self, name, project):
         """
         Public method used to copy a file/directory.
-        
+
         @param name file/directory name to be copied (string)
         @param project reference to the project object
         @return flag indicating successful operation (boolean)
         """
         from .HgCopyDialog import HgCopyDialog
+
         dlg = HgCopyDialog(name)
         res = False
         if dlg.exec() == QDialog.DialogCode.Accepted:
             target, force = dlg.getData()
-            
+
             args = self.initCommand("copy")
             args.append("-v")
             args.append(name)
             args.append(target)
-            
-            dia = HgDialog(
-                self.tr('Copying {0}').format(name), self)
+
+            dia = HgDialog(self.tr("Copying {0}").format(name), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.normalExit()
-                if (
-                    res and
-                    target.startswith(project.getProjectPath())
-                ):
+                if res and target.startswith(project.getProjectPath()):
                     if os.path.isdir(name):
                         project.copyDirectory(name, target)
                     else:
                         project.appendFile(target)
         return res
-    
+
     def hgGetTagsList(self, withType=False):
         """
         Public method to get the list of tags.
-        
+
         @param withType flag indicating to get the tag type as well (boolean)
         @return list of tags (list of string) or list of tuples of
             tag name and flag indicating a local tag (list of tuple of string
             and boolean), if withType is True
         """
         args = self.initCommand("tags")
-        args.append('--verbose')
-        
+        args.append("--verbose")
+
         output, error = self.__client.runcommand(args)
-        
+
         tagsList = []
         if output:
             for line in output.splitlines():
@@ -1402,25 +1415,25 @@
                         tagsList.append((name, isLocal))
                     else:
                         tagsList.append(name)
-        
+
         if withType:
             return tagsList
         else:
             if tagsList:
                 self.tagsList = tagsList
             return self.tagsList[:]
-    
+
     def hgGetBranchesList(self):
         """
         Public method to get the list of branches.
-        
+
         @return list of branches (list of string)
         """
         args = self.initCommand("branches")
-        args.append('--closed')
-        
+        args.append("--closed")
+
         output, error = self.__client.runcommand(args)
-        
+
         if output:
             self.branchesList = []
             for line in output.splitlines():
@@ -1433,17 +1446,18 @@
                 name = " ".join(li)
                 if name not in ["tip", "default"]:
                     self.branchesList.append(name)
-        
+
         return self.branchesList[:]
-    
+
     def hgListTagBranch(self, tags=True):
         """
         Public method used to list the available tags or branches.
-        
+
         @param tags flag indicating listing of branches or tags
                 (False = branches, True = tags)
         """
         from .HgTagBranchListDialog import HgTagBranchListDialog
+
         self.tagbranchList = HgTagBranchListDialog(self)
         self.tagbranchList.show()
         if tags:
@@ -1453,8 +1467,7 @@
             else:
                 self.tagsList = []
                 allTagsBranchesList = None
-            self.tagbranchList.start(
-                tags, self.tagsList, allTagsBranchesList)
+            self.tagbranchList.start(tags, self.tagsList, allTagsBranchesList)
         else:
             if not self.showedBranches:
                 self.showedBranches = True
@@ -1462,34 +1475,34 @@
             else:
                 self.branchesList = []
                 allTagsBranchesList = None
-            self.tagbranchList.start(
-                tags, self.branchesList, self.allTagsBranchesList)
-    
+            self.tagbranchList.start(tags, self.branchesList, self.allTagsBranchesList)
+
     def hgAnnotate(self, name):
         """
         Public method to show the output of the hg annotate command.
-        
+
         @param name file name to show the annotations for (string)
         """
         if self.annotate is None:
             from .HgAnnotateDialog import HgAnnotateDialog
+
             self.annotate = HgAnnotateDialog(self)
         self.annotate.show()
         self.annotate.raise_()
         self.annotate.start(name)
-    
+
     def hgExtendedDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Mercurial repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -1502,27 +1515,29 @@
                 project = ericApp().getObject("Project")
                 if nam == project.ppath and not project.saveAllScripts():
                     return
-        
+
         from .HgRevisionsSelectionDialog import HgRevisionsSelectionDialog
+
         dlg = HgRevisionsSelectionDialog(
             self.hgGetTagsList(),
             self.hgGetBranchesList(),
-            bookmarksList=self.hgGetBookmarksList()
+            bookmarksList=self.hgGetBookmarksList(),
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             revisions = dlg.getRevisions()
             if self.diff is None:
                 from .HgDiffDialog import HgDiffDialog
+
                 self.diff = HgDiffDialog(self)
             self.diff.show()
             self.diff.raise_()
             self.diff.start(name, revisions)
-    
+
     def __hgGetFileForRevision(self, name, rev=""):
         """
         Private method to get a file for a specific revision from the
         repository.
-        
+
         @param name file name to get from the repository (string)
         @param rev revision to retrieve (string)
         @return contents of the file (string) and an error message (string)
@@ -1532,17 +1547,17 @@
             args.append("--rev")
             args.append(rev)
         args.append(name)
-        
+
         output, error = self.__client.runcommand(args)
-        
+
         # return file contents with 'universal newlines'
-        return output.replace('\r\n', '\n').replace('\r', '\n'), error
-    
+        return output.replace("\r\n", "\n").replace("\r", "\n"), error
+
     def vcsSbsDiff(self, name, extended=False, revisions=None):
         """
         Public method used to view the difference of a file to the Mercurial
         repository side-by-side.
-        
+
         @param name file name to be diffed (string)
         @param extended flag indicating the extended variant (boolean)
         @param revisions tuple of two revisions (tuple of strings)
@@ -1550,13 +1565,14 @@
         """
         if isinstance(name, list):
             raise ValueError("Wrong parameter type")
-        
+
         if extended:
             from .HgRevisionsSelectionDialog import HgRevisionsSelectionDialog
+
             dlg = HgRevisionsSelectionDialog(
                 self.hgGetTagsList(),
                 self.hgGetBranchesList(),
-                bookmarksList=self.hgGetBookmarksList()
+                bookmarksList=self.hgGetBookmarksList(),
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev1, rev2 = dlg.getRevisions()
@@ -1566,23 +1582,21 @@
             rev1, rev2 = revisions[0], revisions[1]
         else:
             rev1, rev2 = "", ""
-        
+
         output1, error = self.__hgGetFileForRevision(name, rev=rev1)
         if error:
             EricMessageBox.critical(
-                self.__ui,
-                self.tr("Mercurial Side-by-Side Difference"),
-                error)
+                self.__ui, self.tr("Mercurial Side-by-Side Difference"), error
+            )
             return
         name1 = "{0} (rev. {1})".format(name, rev1 and rev1 or ".")
-        
+
         if rev2:
             output2, error = self.__hgGetFileForRevision(name, rev=rev2)
             if error:
                 EricMessageBox.critical(
-                    self.__ui,
-                    self.tr("Mercurial Side-by-Side Difference"),
-                    error)
+                    self.__ui, self.tr("Mercurial Side-by-Side Difference"), error
+                )
                 return
             name2 = "{0} (rev. {1})".format(name, rev2)
         else:
@@ -1594,37 +1608,40 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Mercurial Side-by-Side Difference"),
-                    self.tr(
-                        """<p>The file <b>{0}</b> could not be read.</p>""")
-                    .format(name))
+                    self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                        name
+                    ),
+                )
                 return
-        
+
         if self.sbsDiff is None:
             from UI.CompareDialog import CompareDialog
+
             self.sbsDiff = CompareDialog()
         self.sbsDiff.show()
         self.sbsDiff.raise_()
         self.sbsDiff.compare(output1, output2, name1, name2)
-    
+
     def vcsLogBrowser(self, name=None, isFile=False):
         """
         Public method used to browse the log of a file/directory from the
         Mercurial repository.
-        
+
         @param name file/directory name to show the log of (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         """
         if name == self.getClient().getRepository():
             name = None
-        
+
         if self.logBrowser is None:
             from .HgLogBrowserDialog import HgLogBrowserDialog
+
             self.logBrowser = HgLogBrowserDialog(self)
         self.logBrowser.show()
         self.logBrowser.raise_()
         self.logBrowser.start(name=name, isFile=isFile)
-    
+
     def hgIncoming(self):
         """
         Public method used to view the log of incoming changes from the
@@ -1632,12 +1649,12 @@
         """
         if self.logBrowserIncoming is None:
             from .HgLogBrowserDialog import HgLogBrowserDialog
-            self.logBrowserIncoming = HgLogBrowserDialog(
-                self, mode="incoming")
+
+            self.logBrowserIncoming = HgLogBrowserDialog(self, mode="incoming")
         self.logBrowserIncoming.show()
         self.logBrowserIncoming.raise_()
         self.logBrowserIncoming.start()
-    
+
     def hgOutgoing(self):
         """
         Public method used to view the log of outgoing changes from the
@@ -1645,16 +1662,16 @@
         """
         if self.logBrowserOutgoing is None:
             from .HgLogBrowserDialog import HgLogBrowserDialog
-            self.logBrowserOutgoing = HgLogBrowserDialog(
-                self, mode="outgoing")
+
+            self.logBrowserOutgoing = HgLogBrowserDialog(self, mode="outgoing")
         self.logBrowserOutgoing.show()
         self.logBrowserOutgoing.raise_()
         self.logBrowserOutgoing.start()
-    
+
     def hgPull(self, revisions=None):
         """
         Public method used to pull changes from a remote Mercurial repository.
-        
+
         @param revisions list of revisions to be pulled
         @type list of str
         @return flag indicating, that the update contained an add
@@ -1662,156 +1679,179 @@
         @rtype bool
         """
         if (
-            self.getPlugin().getPreferences("PreferUnbundle") and
-            self.bundleFile and
-            os.path.exists(self.bundleFile) and
-            revisions is None
+            self.getPlugin().getPreferences("PreferUnbundle")
+            and self.bundleFile
+            and os.path.exists(self.bundleFile)
+            and revisions is None
         ):
             command = "unbundle"
-            title = self.tr('Apply changegroups')
+            title = self.tr("Apply changegroups")
         else:
             command = "pull"
-            title = self.tr('Pulling from a remote Mercurial repository')
-        
+            title = self.tr("Pulling from a remote Mercurial repository")
+
         args = self.initCommand(command)
-        args.append('-v')
+        args.append("-v")
         if self.getPlugin().getPreferences("PullUpdate"):
-            args.append('--update')
+            args.append("--update")
         if command == "unbundle":
             args.append(self.bundleFile)
         if revisions:
             for rev in revisions:
                 args.append("--rev")
                 args.append(rev)
-        
+
         dia = HgDialog(title, self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
-        if (
-            self.bundleFile and
-            os.path.exists(self.bundleFile)
-        ):
+        if self.bundleFile and os.path.exists(self.bundleFile):
             os.remove(self.bundleFile)
             self.bundleFile = None
         self.checkVCSStatus()
         return res
-    
+
     def hgPush(self, force=False, newBranch=False, rev=None):
         """
         Public method used to push changes to a remote Mercurial repository.
-        
+
         @param force flag indicating a forced push (boolean)
         @param newBranch flag indicating to push a new branch (boolean)
         @param rev revision to be pushed (including all ancestors) (string)
         """
         args = self.initCommand("push")
-        args.append('-v')
+        args.append("-v")
         if force:
-            args.append('-f')
+            args.append("-f")
         if newBranch:
-            args.append('--new-branch')
+            args.append("--new-branch")
         if rev:
-            args.append('--rev')
+            args.append("--rev")
             args.append(rev)
-        
-        dia = HgDialog(
-            self.tr('Pushing to a remote Mercurial repository'), self)
+
+        dia = HgDialog(self.tr("Pushing to a remote Mercurial repository"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
         self.checkVCSStatus()
-    
+
     def hgInfo(self, mode="heads"):
         """
         Public method to show information about the heads of the repository.
-        
+
         @param mode mode of the operation (string, one of heads, parents,
             tip)
         """
         if mode not in ("heads", "parents", "tip"):
             mode = "heads"
-        
+
         info = []
-        
+
         args = self.initCommand(mode)
-        args.append('--template')
-        args.append('{rev}:{node|short}@@@{tags}@@@{author|xmlescape}@@@'
-                    '{date|isodate}@@@{branches}@@@{parents}@@@{bookmarks}\n')
-        
+        args.append("--template")
+        args.append(
+            "{rev}:{node|short}@@@{tags}@@@{author|xmlescape}@@@"
+            "{date|isodate}@@@{branches}@@@{parents}@@@{bookmarks}\n"
+        )
+
         output, error = self.__client.runcommand(args)
-        
+
         if output:
             for index, line in enumerate(output.splitlines(), start=1):
-                (changeset, tags, author, date, branches, parents,
-                 bookmarks) = line.split("@@@")
+                (
+                    changeset,
+                    tags,
+                    author,
+                    date,
+                    branches,
+                    parents,
+                    bookmarks,
+                ) = line.split("@@@")
                 cdate, ctime = date.split()[:2]
                 info.append("""<p><table>""")
                 if mode == "heads":
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Head #{0}</b></td><td></td></tr>\n""")
-                        .format(index))
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Head #{0}</b></td><td></td></tr>\n""",
+                        ).format(index)
+                    )
                 elif mode == "parents":
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Parent #{0}</b></td><td></td></tr>\n""")
-                        .format(index))
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Parent #{0}</b></td><td></td></tr>\n""",
+                        ).format(index)
+                    )
                 elif mode == "tip":
-                    info.append(QCoreApplication.translate(
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial", """<tr><td><b>Tip</b></td><td></td></tr>\n"""
+                        )
+                    )
+                info.append(
+                    QCoreApplication.translate(
                         "mercurial",
-                        """<tr><td><b>Tip</b></td><td></td></tr>\n"""))
-                info.append(QCoreApplication.translate(
-                    "mercurial",
-                    """<tr><td><b>Changeset</b></td><td>{0}</td></tr>""")
-                    .format(changeset))
+                        """<tr><td><b>Changeset</b></td><td>{0}</td></tr>""",
+                    ).format(changeset)
+                )
                 if tags:
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Tags</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(tags.split())))
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial", """<tr><td><b>Tags</b></td><td>{0}</td></tr>"""
+                        ).format("<br/>".join(tags.split()))
+                    )
                 if bookmarks:
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(bookmarks.split())))
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>""",
+                        ).format("<br/>".join(bookmarks.split()))
+                    )
                 if branches:
-                    info.append(QCoreApplication.translate(
-                        "mercurial",
-                        """<tr><td><b>Branches</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(branches.split())))
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Branches</b></td><td>{0}</td></tr>""",
+                        ).format("<br/>".join(branches.split()))
+                    )
                 if parents:
-                    info.append(QCoreApplication.translate(
+                    info.append(
+                        QCoreApplication.translate(
+                            "mercurial",
+                            """<tr><td><b>Parents</b></td><td>{0}</td></tr>""",
+                        ).format("<br/>".join(parents.split()))
+                    )
+                info.append(
+                    QCoreApplication.translate(
                         "mercurial",
-                        """<tr><td><b>Parents</b></td><td>{0}</td></tr>""")
-                        .format('<br/>'.join(parents.split())))
-                info.append(QCoreApplication.translate(
-                    "mercurial",
-                    """<tr><td><b>Last author</b></td><td>{0}</td></tr>\n"""
-                    """<tr><td><b>Committed date</b></td><td>{1}</td></tr>\n"""
-                    """<tr><td><b>Committed time</b></td><td>{2}</td></tr>\n"""
-                    """</table></p>""")
-                    .format(author, cdate, ctime))
-            
+                        """<tr><td><b>Last author</b></td><td>{0}</td></tr>\n"""
+                        """<tr><td><b>Committed date</b></td><td>{1}</td></tr>\n"""
+                        """<tr><td><b>Committed time</b></td><td>{2}</td></tr>\n"""
+                        """</table></p>""",
+                    ).format(author, cdate, ctime)
+                )
+
             dlg = VcsRepositoryInfoDialog(None, "\n".join(info))
             dlg.exec()
-    
+
     def hgConflicts(self):
         """
         Public method used to show a list of files containing conflicts.
         """
         if self.conflictsDlg is None:
             from .HgConflictsListDialog import HgConflictsListDialog
+
             self.conflictsDlg = HgConflictsListDialog(self)
         self.conflictsDlg.show()
         self.conflictsDlg.raise_()
         self.conflictsDlg.start()
-    
+
     def vcsResolved(self, name, unresolve=False):
         """
         Public method used to resolve conflicts of a file/directory.
-        
+
         @param name file/directory name to be resolved (string)
         @param unresolve flag indicating to mark the file/directory as
             unresolved (boolean)
@@ -1821,27 +1861,27 @@
             args.append("--unmark")
         else:
             args.append("--mark")
-        
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         title = (
             self.tr("Marking as 'unresolved'")
-            if unresolve else
-            self.tr("Marking as 'resolved'")
+            if unresolve
+            else self.tr("Marking as 'resolved'")
         )
         dia = HgDialog(title, self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
         self.checkVCSStatus()
-    
+
     def hgAbortMerge(self):
         """
         Public method to abort an uncommitted merge.
-        
+
         @return flag indicating, that the abortion contained an add
             or delete (boolean)
         """
@@ -1851,22 +1891,21 @@
         else:
             args = self.initCommand("update")
             args.append("--clean")
-        
-        dia = HgDialog(
-            self.tr('Aborting uncommitted merge'),
-            self)
+
+        dia = HgDialog(self.tr("Aborting uncommitted merge"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-    
+
     def hgBranch(self):
         """
         Public method used to create a branch in the Mercurial repository.
         """
         from .HgBranchInputDialog import HgBranchInputDialog
+
         dlg = HgBranchInputDialog(self.hgGetBranchesList())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, commit, force = dlg.getData()
@@ -1875,10 +1914,8 @@
             if force:
                 args.append("--force")
             args.append(name)
-            
-            dia = HgDialog(
-                self.tr('Creating branch in the Mercurial repository'),
-                self)
+
+            dia = HgDialog(self.tr("Creating branch in the Mercurial repository"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
@@ -1886,46 +1923,46 @@
                     project = ericApp().getObject("Project")
                     self.vcsCommit(
                         project.getProjectPath(),
-                        self.tr("Created new branch <{0}>.").format(
-                            name))
-    
+                        self.tr("Created new branch <{0}>.").format(name),
+                    )
+
     def hgShowBranch(self):
         """
         Public method used to show the current branch of the working directory.
         """
         args = self.initCommand("branch")
-        
-        dia = HgDialog(self.tr('Showing current branch'), self)
+
+        dia = HgDialog(self.tr("Showing current branch"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
-    
+
     def hgGetCurrentBranch(self):
         """
         Public method to get the current branch of the working directory.
-        
+
         @return name of the current branch
         @rtype str
         """
         args = self.initCommand("branch")
-        
+
         output, error = self.__client.runcommand(args)
-        
+
         return output.strip()
-    
+
     def hgEditUserConfig(self):
         """
         Public method used to edit the user configuration file.
         """
         from .HgUserConfigDialog import HgUserConfigDialog
+
         dlg = HgUserConfigDialog(version=self.version)
         dlg.exec()
-    
-    def hgEditConfig(self, repoName=None,
-                     withLargefiles=True, largefilesData=None):
+
+    def hgEditConfig(self, repoName=None, withLargefiles=True, largefilesData=None):
         """
         Public method used to edit the repository configuration file.
-        
+
         @param repoName directory name containing the repository
         @type str
         @param withLargefiles flag indicating to configure the largefiles
@@ -1937,15 +1974,16 @@
         """
         if repoName is None:
             repoName = self.getClient().getRepository()
-        
+
         cfgFile = os.path.join(repoName, self.adminDir, "hgrc")
         if not os.path.exists(cfgFile):
             # open dialog to enter the initial data
-            withLargefiles = (self.isExtensionActive("largefiles") and
-                              withLargefiles)
+            withLargefiles = self.isExtensionActive("largefiles") and withLargefiles
             from .HgRepoConfigDataDialog import HgRepoConfigDataDialog
-            dlg = HgRepoConfigDataDialog(withLargefiles=withLargefiles,
-                                         largefilesData=largefilesData)
+
+            dlg = HgRepoConfigDataDialog(
+                withLargefiles=withLargefiles, largefilesData=largefilesData
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 createContents = True
                 defaultUrl, defaultPushUrl = dlg.getData()
@@ -1961,92 +1999,81 @@
                         if defaultUrl:
                             cfg.write("default = {0}\n".format(defaultUrl))
                         if defaultPushUrl:
-                            cfg.write("default-push = {0}\n".format(
-                                defaultPushUrl))
-                        if (
-                            withLargefiles and
-                            (lfMinSize, lfPattern) != (None, None)
-                        ):
+                            cfg.write("default-push = {0}\n".format(defaultPushUrl))
+                        if withLargefiles and (lfMinSize, lfPattern) != (None, None):
                             cfg.write("\n[largefiles]\n")
                             if lfMinSize is not None:
                                 cfg.write("minsize = {0}\n".format(lfMinSize))
                             if lfPattern is not None:
                                 cfg.write("patterns =\n")
-                                cfg.write("  {0}\n".format(
-                                    "\n  ".join(lfPattern)))
+                                cfg.write("  {0}\n".format("\n  ".join(lfPattern)))
                 self.__monitorRepoIniFile(repoName)
                 self.__iniFileChanged(cfgFile)
         self.repoEditor = MiniEditor(cfgFile, "Properties")
         self.repoEditor.show()
-    
+
     def hgVerify(self):
         """
         Public method to verify the integrity of the repository.
         """
         args = self.initCommand("verify")
-        
+
         dia = HgDialog(
-            self.tr('Verifying the integrity of the Mercurial repository'),
-            self)
+            self.tr("Verifying the integrity of the Mercurial repository"), self
+        )
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def hgShowConfig(self):
         """
         Public method to show the combined configuration.
         """
         args = self.initCommand("showconfig")
         args.append("--untrusted")
-        
-        dia = HgDialog(
-            self.tr('Showing the combined configuration settings'),
-            self)
+
+        dia = HgDialog(self.tr("Showing the combined configuration settings"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
-    
+
     def hgShowPaths(self):
         """
         Public method to show the path aliases for remote repositories.
         """
         args = self.initCommand("paths")
-        
-        dia = HgDialog(
-            self.tr('Showing aliases for remote repositories'),
-            self)
+
+        dia = HgDialog(self.tr("Showing aliases for remote repositories"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
-    
+
     def hgRecover(self):
         """
         Public method to recover an interrupted transaction.
         """
         args = self.initCommand("recover")
-        
-        dia = HgDialog(
-            self.tr('Recovering from interrupted transaction'),
-            self)
+
+        dia = HgDialog(self.tr("Recovering from interrupted transaction"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
-    
+
     def hgIdentify(self):
         """
         Public method to identify the current working directory.
         """
         args = self.initCommand("identify")
-        
-        dia = HgDialog(self.tr('Identifying project directory'), self)
+
+        dia = HgDialog(self.tr("Identifying project directory"), self)
         res = dia.startProcess(args, showArgs=False)
         if res:
             dia.exec()
-    
+
     def hgCreateIgnoreFile(self, name, autoAdd=False):
         """
         Public method to create the ignore file.
-        
+
         @param name directory name to create the ignore file in (string)
         @param autoAdd flag indicating to add it automatically (boolean)
         @return flag indicating success
@@ -2069,17 +2096,20 @@
             "glob:__pycache__",
             "glob:**.DS_Store",
         ]
-        
+
         ignoreName = os.path.join(name, Hg.IgnoreFileName)
         res = (
             EricMessageBox.yesNo(
                 self.__ui,
                 self.tr("Create .hgignore file"),
-                self.tr("""<p>The file <b>{0}</b> exists already."""
-                        """ Overwrite it?</p>""").format(ignoreName),
-                icon=EricMessageBox.Warning)
-            if os.path.exists(ignoreName) else
-            True
+                self.tr(
+                    """<p>The file <b>{0}</b> exists already."""
+                    """ Overwrite it?</p>"""
+                ).format(ignoreName),
+                icon=EricMessageBox.Warning,
+            )
+            if os.path.exists(ignoreName)
+            else True
         )
         if res:
             try:
@@ -2090,30 +2120,33 @@
                 status = True
             except OSError:
                 status = False
-            
+
             if status and autoAdd:
                 self.vcsAdd(ignoreName, noDialog=True)
                 project = ericApp().getObject("Project")
                 project.appendFile(ignoreName)
-        
+
         return status
-    
+
     def hgBundle(self, bundleData=None):
         """
         Public method to create a changegroup file.
-        
+
         @param bundleData dictionary containing the bundle creation information
         @type dict
         """
         if bundleData is None:
             from .HgBundleDialog import HgBundleDialog
-            dlg = HgBundleDialog(self.hgGetTagsList(),
-                                 self.hgGetBranchesList(),
-                                 self.hgGetBookmarksList(),
-                                 version=self.version)
+
+            dlg = HgBundleDialog(
+                self.hgGetTagsList(),
+                self.hgGetBranchesList(),
+                self.hgGetBookmarksList(),
+                version=self.version,
+            )
             if dlg.exec() != QDialog.DialogCode.Accepted:
                 return
-            
+
             revs, baseRevs, compression, bundleAll = dlg.getParameters()
         else:
             revs = bundleData["revs"]
@@ -2123,18 +2156,19 @@
                 baseRevs = []
             compression = ""
             bundleAll = bundleData["all"]
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             None,
             self.tr("Create changegroup"),
             self.__lastChangeGroupPath,
             self.tr("Mercurial Changegroup Files (*.hg)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2144,15 +2178,17 @@
             res = EricMessageBox.yesNo(
                 self.__ui,
                 self.tr("Create changegroup"),
-                self.tr("<p>The Mercurial changegroup file <b>{0}</b> "
-                        "already exists. Overwrite it?</p>")
-                    .format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The Mercurial changegroup file <b>{0}</b> "
+                    "already exists. Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         self.__lastChangeGroupPath = str(fpath.parent)
-        
+
         args = self.initCommand("bundle")
         if bundleAll:
             args.append("--all")
@@ -2166,12 +2202,12 @@
             args.append("--type")
             args.append(compression)
         args.append(str(fpath))
-        
-        dia = HgDialog(self.tr('Create changegroup'), self)
+
+        dia = HgDialog(self.tr("Create changegroup"), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def hgPreviewBundle(self):
         """
         Public method used to view the log of incoming changes from a
@@ -2181,22 +2217,23 @@
             None,
             self.tr("Preview changegroup"),
             self.__lastChangeGroupPath,
-            self.tr("Mercurial Changegroup Files (*.hg);;All Files (*)"))
+            self.tr("Mercurial Changegroup Files (*.hg);;All Files (*)"),
+        )
         if file:
             self.__lastChangeGroupPath = os.path.dirname(file)
-            
+
             if self.logBrowserIncoming is None:
                 from .HgLogBrowserDialog import HgLogBrowserDialog
-                self.logBrowserIncoming = HgLogBrowserDialog(
-                    self, mode="incoming")
+
+                self.logBrowserIncoming = HgLogBrowserDialog(self, mode="incoming")
             self.logBrowserIncoming.show()
             self.logBrowserIncoming.raise_()
             self.logBrowserIncoming.start(bundle=file)
-    
+
     def hgUnbundle(self, files=None):
         """
         Public method to apply changegroup files.
-        
+
         @param files list of bundle files to be applied
         @type list of str
         @return flag indicating, that the update contained an add
@@ -2209,36 +2246,38 @@
                 None,
                 self.tr("Apply changegroups"),
                 self.__lastChangeGroupPath,
-                self.tr("Mercurial Changegroup Files (*.hg);;All Files (*)"))
-        
+                self.tr("Mercurial Changegroup Files (*.hg);;All Files (*)"),
+            )
+
         if files:
             self.__lastChangeGroupPath = os.path.dirname(files[0])
-            
+
             update = EricMessageBox.yesNo(
                 self.__ui,
                 self.tr("Apply changegroups"),
                 self.tr("""Shall the working directory be updated?"""),
-                yesDefault=True)
-            
+                yesDefault=True,
+            )
+
             args = self.initCommand("unbundle")
             if update:
                 args.append("--update")
                 args.append("--verbose")
             args.extend(files)
-            
-            dia = HgDialog(self.tr('Apply changegroups'), self)
+
+            dia = HgDialog(self.tr("Apply changegroups"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
             self.checkVCSStatus()
-        
+
         return res
-    
+
     def hgBisect(self, subcommand):
         """
         Public method to perform bisect commands.
-        
+
         @param subcommand name of the subcommand (one of 'good', 'bad',
             'skip' or 'reset')
         @type str
@@ -2246,53 +2285,53 @@
         """
         if subcommand not in ("good", "bad", "skip", "reset"):
             raise ValueError(
-                self.tr("Bisect subcommand ({0}) invalid.")
-                    .format(subcommand))
-        
+                self.tr("Bisect subcommand ({0}) invalid.").format(subcommand)
+            )
+
         rev = ""
         if subcommand in ("good", "bad", "skip"):
             from .HgRevisionSelectionDialog import HgRevisionSelectionDialog
+
             dlg = HgRevisionSelectionDialog(
                 self.hgGetTagsList(),
                 self.hgGetBranchesList(),
-                bookmarksList=self.hgGetBookmarksList()
+                bookmarksList=self.hgGetBookmarksList(),
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev = dlg.getRevision()
             else:
                 return
-        
+
         args = self.initCommand("bisect")
         args.append("--{0}".format(subcommand))
         if rev:
             args.append(rev)
-        
-        dia = HgDialog(
-            self.tr('Mercurial Bisect ({0})').format(subcommand), self)
+
+        dia = HgDialog(self.tr("Mercurial Bisect ({0})").format(subcommand), self)
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def vcsForget(self, name):
         """
         Public method used to remove a file from the Mercurial repository.
-        
+
         This will not remove the file from the project directory.
-        
+
         @param name file/directory name to be removed
         @type str or list of str
         """
         args = self.initCommand("forget")
-        args.append('-v')
-        
+        args.append("-v")
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         dia = HgDialog(
-            self.tr('Removing files from the Mercurial repository only'),
-            self)
+            self.tr("Removing files from the Mercurial repository only"), self
+        )
         res = dia.startProcess(args)
         if res:
             dia.exec()
@@ -2300,44 +2339,46 @@
                 self.__forgotNames.extend(name)
             else:
                 self.__forgotNames.append(name)
-    
+
     def hgBackout(self):
         """
         Public method used to backout an earlier changeset from the Mercurial
         repository.
         """
         from .HgBackoutDialog import HgBackoutDialog
-        dlg = HgBackoutDialog(self.hgGetTagsList(),
-                              self.hgGetBranchesList(),
-                              self.hgGetBookmarksList())
+
+        dlg = HgBackoutDialog(
+            self.hgGetTagsList(), self.hgGetBranchesList(), self.hgGetBookmarksList()
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             rev, merge, date, user, message = dlg.getParameters()
             if not rev:
                 EricMessageBox.warning(
                     self.__ui,
                     self.tr("Backing out changeset"),
-                    self.tr("""No revision given. Aborting..."""))
+                    self.tr("""No revision given. Aborting..."""),
+                )
                 return
-            
+
             args = self.initCommand("backout")
-            args.append('-v')
+            args.append("-v")
             if merge:
-                args.append('--merge')
+                args.append("--merge")
             if date:
-                args.append('--date')
+                args.append("--date")
                 args.append(date)
             if user:
-                args.append('--user')
+                args.append("--user")
                 args.append(user)
-            args.append('--message')
+            args.append("--message")
             args.append(message)
             args.append(rev)
-            
-            dia = HgDialog(self.tr('Backing out changeset'), self)
+
+            dia = HgDialog(self.tr("Backing out changeset"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgRollback(self):
         """
         Public method used to rollback the last transaction.
@@ -2345,11 +2386,13 @@
         res = EricMessageBox.yesNo(
             None,
             self.tr("Rollback last transaction"),
-            self.tr("""Are you sure you want to rollback the last"""
-                    """ transaction?"""),
-            icon=EricMessageBox.Warning)
+            self.tr(
+                """Are you sure you want to rollback the last""" """ transaction?"""
+            ),
+            icon=EricMessageBox.Warning,
+        )
         if res:
-            dia = HgDialog(self.tr('Rollback last transaction'), self)
+            dia = HgDialog(self.tr("Rollback last transaction"), self)
             res = dia.startProcess(["rollback"])
             if res:
                 dia.exec()
@@ -2357,40 +2400,50 @@
     def hgServe(self, repoPath):
         """
         Public method used to serve the project.
-        
+
         @param repoPath directory containing the repository
         @type str
         """
         from .HgServeDialog import HgServeDialog
+
         self.serveDlg = HgServeDialog(self, repoPath)
         self.serveDlg.show()
-    
+
     def hgImport(self):
         """
         Public method to import a patch file.
-        
+
         @return flag indicating, that the import contained an add, a delete
             or a change to the project file (boolean)
         """
         from .HgImportDialog import HgImportDialog
+
         dlg = HgImportDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (patchFile, noCommit, message, date, user, withSecret, stripCount,
-             force) = dlg.getParameters()
-            
+            (
+                patchFile,
+                noCommit,
+                message,
+                date,
+                user,
+                withSecret,
+                stripCount,
+                force,
+            ) = dlg.getParameters()
+
             args = self.initCommand("import")
             args.append("--verbose")
             if noCommit:
                 args.append("--no-commit")
             else:
                 if message:
-                    args.append('--message')
+                    args.append("--message")
                     args.append(message)
                 if date:
-                    args.append('--date')
+                    args.append("--date")
                     args.append(date)
                 if user:
-                    args.append('--user')
+                    args.append("--user")
                     args.append(user)
             if stripCount != 1:
                 args.append("--strip")
@@ -2400,7 +2453,7 @@
             if withSecret:
                 args.append("--secret")
             args.append(patchFile)
-            
+
             dia = HgDialog(self.tr("Import Patch"), self)
             res = dia.startProcess(args)
             if res:
@@ -2409,20 +2462,27 @@
             self.checkVCSStatus()
         else:
             res = False
-        
+
         return res
-    
+
     def hgExport(self):
         """
         Public method to export patches to files.
         """
         from .HgExportDialog import HgExportDialog
-        dlg = HgExportDialog(self.hgGetBookmarksList(),
-                             self.version >= (4, 7, 0))
+
+        dlg = HgExportDialog(self.hgGetBookmarksList(), self.version >= (4, 7, 0))
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (filePattern, revisions, bookmark, switchParent, allText,
-             noDates, git) = dlg.getParameters()
-            
+            (
+                filePattern,
+                revisions,
+                bookmark,
+                switchParent,
+                allText,
+                noDates,
+                git,
+            ) = dlg.getParameters()
+
             args = self.initCommand("export")
             args.append("--output")
             args.append(filePattern)
@@ -2441,16 +2501,16 @@
             else:
                 for rev in revisions:
                     args.append(rev)
-            
+
             dia = HgDialog(self.tr("Export Patches"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgPhase(self, data=None):
         """
         Public method to change the phase of revisions.
-        
+
         @param data tuple giving phase data (list of revisions, phase, flag
             indicating a forced operation) (list of strings, string, boolean)
         @return flag indicating success (boolean)
@@ -2458,16 +2518,17 @@
         """
         if data is None:
             from .HgPhaseDialog import HgPhaseDialog
+
             dlg = HgPhaseDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 data = dlg.getData()
-        
+
         if data:
             revs, phase, force = data
-            
+
             if phase not in ("p", "d", "s"):
                 raise ValueError("Invalid phase given.")
-            
+
             args = self.initCommand("phase")
             if phase == "p":
                 args.append("--public")
@@ -2475,12 +2536,12 @@
                 args.append("--draft")
             else:
                 args.append("--secret")
-            
+
             if force:
                 args.append("--force")
             for rev in revs:
                 args.append(rev)
-            
+
             dia = HgDialog(self.tr("Change Phase"), self)
             res = dia.startProcess(args)
             if res:
@@ -2488,26 +2549,31 @@
                 res = dia.normalExitWithoutErrors()
         else:
             res = False
-        
+
         return res
-    
+
     def hgGraft(self, revs=None):
         """
         Public method to copy changesets from another branch.
-        
+
         @param revs list of revisions to show in the revisions pane (list of
             strings)
         @return flag indicating that the project should be reread (boolean)
         """
         from .HgGraftDialog import HgGraftDialog
+
         res = False
         dlg = HgGraftDialog(self, revs)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (revs,
-             (userData, currentUser, userName),
-             (dateData, currentDate, dateStr),
-             log, dryrun, noCommit) = dlg.getData()
-            
+            (
+                revs,
+                (userData, currentUser, userName),
+                (dateData, currentDate, dateStr),
+                log,
+                dryrun,
+                noCommit,
+            ) = dlg.getData()
+
             args = self.initCommand("graft")
             args.append("--verbose")
             if userData:
@@ -2529,19 +2595,19 @@
             if noCommit:
                 args.append("--no-commit")
             args.extend(revs)
-            
-            dia = HgDialog(self.tr('Copy Changesets'), self)
+
+            dia = HgDialog(self.tr("Copy Changesets"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
                 self.checkVCSStatus()
         return res
-    
+
     def __hgGraftSubCommand(self, subcommand, title):
         """
         Private method to perform a Mercurial graft subcommand.
-        
+
         @param subcommand subcommand flag
         @type str
         @param title tirle of the dialog
@@ -2552,7 +2618,7 @@
         args = self.initCommand("graft")
         args.append(subcommand)
         args.append("--verbose")
-        
+
         dia = HgDialog(title, self)
         res = dia.startProcess(args)
         if res:
@@ -2560,53 +2626,53 @@
             res = dia.hasAddOrDelete()
             self.checkVCSStatus()
         return res
-    
+
     def hgGraftContinue(self, path):
         """
         Public method to continue copying changesets from another branch.
-        
-        @param path directory name of the project
-        @type str
-        @return flag indicating that the project should be reread
-        @rtype bool
-        """
-        return self.__hgGraftSubCommand(
-            "--continue", self.tr('Copy Changesets (Continue)'))
-    
-    def hgGraftStop(self, path):
-        """
-        Public method to stop an interrupted copying session.
-        
+
         @param path directory name of the project
         @type str
         @return flag indicating that the project should be reread
         @rtype bool
         """
         return self.__hgGraftSubCommand(
-            "--stop", self.tr('Copy Changesets (Stop)'))
-    
-    def hgGraftAbort(self, path):
+            "--continue", self.tr("Copy Changesets (Continue)")
+        )
+
+    def hgGraftStop(self, path):
         """
-        Public method to abort an interrupted copying session and perform
-        a rollback.
-        
+        Public method to stop an interrupted copying session.
+
         @param path directory name of the project
         @type str
         @return flag indicating that the project should be reread
         @rtype bool
         """
-        return self.__hgGraftSubCommand(
-            "--abort", self.tr('Copy Changesets (Abort)'))
-    
+        return self.__hgGraftSubCommand("--stop", self.tr("Copy Changesets (Stop)"))
+
+    def hgGraftAbort(self, path):
+        """
+        Public method to abort an interrupted copying session and perform
+        a rollback.
+
+        @param path directory name of the project
+        @type str
+        @return flag indicating that the project should be reread
+        @rtype bool
+        """
+        return self.__hgGraftSubCommand("--abort", self.tr("Copy Changesets (Abort)"))
+
     def hgArchive(self):
         """
         Public method to create an unversioned archive from the repository.
         """
         from .HgArchiveDialog import HgArchiveDialog
+
         dlg = HgArchiveDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             archive, type_, prefix, subrepos = dlg.getData()
-            
+
             args = self.initCommand("archive")
             if type_:
                 args.append("--type")
@@ -2617,57 +2683,59 @@
             if subrepos:
                 args.append("--subrepos")
             args.append(archive)
-            
+
             dia = HgDialog(self.tr("Create Unversioned Archive"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgDeleteBackups(self):
         """
         Public method to delete all backup bundles in the backup area.
         """
-        backupdir = os.path.join(self.getClient().getRepository(),
-                                 self.adminDir, "strip-backup")
+        backupdir = os.path.join(
+            self.getClient().getRepository(), self.adminDir, "strip-backup"
+        )
         yes = EricMessageBox.yesNo(
             self.__ui,
             self.tr("Delete All Backups"),
             self.tr(
                 """<p>Do you really want to delete all backup bundles"""
                 """ stored in the backup area?<br/><b>{0}</b></p>"""
-            ).format(backupdir)
+            ).format(backupdir),
         )
         if yes:
             shutil.rmtree(backupdir, True)
-    
+
     ###########################################################################
     ## Methods to deal with sub-repositories are below.
     ###########################################################################
-    
+
     def getHgSubPath(self):
         """
         Public method to get the path to the .hgsub file containing the
         definitions of sub-repositories.
-        
+
         @return full path of the .hgsub file (string)
         """
         ppath = self.__projectHelper.getProject().getProjectPath()
         return os.path.join(ppath, ".hgsub")
-    
+
     def hasSubrepositories(self):
         """
         Public method to check, if the project might have sub-repositories.
-        
+
         @return flag indicating the existence of sub-repositories (boolean)
         """
         hgsub = self.getHgSubPath()
         return os.path.isfile(hgsub) and os.stat(hgsub).st_size > 0
-    
+
     def hgAddSubrepository(self):
         """
         Public method to add a sub-repository.
         """
         from .HgAddSubrepositoryDialog import HgAddSubrepositoryDialog
+
         ppath = self.__projectHelper.getProject().getProjectPath()
         hgsub = self.getHgSubPath()
         dlg = HgAddSubrepositoryDialog(ppath)
@@ -2678,7 +2746,7 @@
             else:
                 url = "[{0}]{1}".format(subrepoType, subrepoUrl)
             entry = "{0} = {1}\n".format(relPath, url)
-            
+
             contents = []
             if os.path.isfile(hgsub):
                 # file exists; check, if such an entry exists already
@@ -2692,10 +2760,11 @@
                         self.tr("Add Sub-repository"),
                         self.tr(
                             """<p>The sub-repositories file .hgsub could not"""
-                            """ be read.</p><p>Reason: {0}</p>""")
-                        .format(str(err)))
+                            """ be read.</p><p>Reason: {0}</p>"""
+                        ).format(str(err)),
+                    )
                     return
-                
+
                 if entry in contents:
                     EricMessageBox.critical(
                         self.__ui,
@@ -2703,11 +2772,13 @@
                         self.tr(
                             """<p>The sub-repositories file .hgsub already"""
                             """ contains an entry <b>{0}</b>."""
-                            """ Aborting...</p>""").format(entry))
+                            """ Aborting...</p>"""
+                        ).format(entry),
+                    )
                     return
             else:
                 needsAdd = True
-            
+
             if contents and not contents[-1].endswith("\n"):
                 contents[-1] = contents[-1] + "\n"
             contents.append(entry)
@@ -2720,29 +2791,33 @@
                     self.tr("Add Sub-repository"),
                     self.tr(
                         """<p>The sub-repositories file .hgsub could not"""
-                        """ be written to.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
+                        """ be written to.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
                 return
-            
+
             if needsAdd:
                 self.vcsAdd(hgsub)
                 self.__projectHelper.getProject().appendFile(hgsub)
-    
+
     def hgRemoveSubrepositories(self):
         """
         Public method to remove sub-repositories.
         """
         hgsub = self.getHgSubPath()
-        
+
         subrepositories = []
         if not os.path.isfile(hgsub):
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Remove Sub-repositories"),
-                self.tr("""<p>The sub-repositories file .hgsub does not"""
-                        """ exist. Aborting...</p>"""))
+                self.tr(
+                    """<p>The sub-repositories file .hgsub does not"""
+                    """ exist. Aborting...</p>"""
+                ),
+            )
             return
-            
+
         try:
             with open(hgsub, "r") as f:
                 subrepositories = [line.strip() for line in f.readlines()]
@@ -2750,14 +2825,15 @@
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Remove Sub-repositories"),
-                self.tr("""<p>The sub-repositories file .hgsub could not"""
-                        """ be read.</p><p>Reason: {0}</p>""")
-                .format(str(err)))
+                self.tr(
+                    """<p>The sub-repositories file .hgsub could not"""
+                    """ be read.</p><p>Reason: {0}</p>"""
+                ).format(str(err)),
+            )
             return
-        
-        from .HgRemoveSubrepositoriesDialog import (
-            HgRemoveSubrepositoriesDialog
-        )
+
+        from .HgRemoveSubrepositoriesDialog import HgRemoveSubrepositoriesDialog
+
         dlg = HgRemoveSubrepositoriesDialog(subrepositories)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             subrepositories, removedSubrepos, deleteSubrepos = dlg.getData()
@@ -2771,81 +2847,76 @@
                     self.tr("Remove Sub-repositories"),
                     self.tr(
                         """<p>The sub-repositories file .hgsub could not"""
-                        """ be written to.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
+                        """ be written to.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
                 return
-            
+
             if deleteSubrepos:
                 ppath = self.__projectHelper.getProject().getProjectPath()
                 for removedSubrepo in removedSubrepos:
                     subrepoPath = removedSubrepo.split("=", 1)[0].strip()
                     subrepoAbsPath = os.path.join(ppath, subrepoPath)
                     shutil.rmtree(subrepoAbsPath, True)
-    
+
     ###########################################################################
     ## Methods to handle configuration dependent stuff are below.
     ###########################################################################
-    
+
     def __checkDefaults(self):
         """
         Private method to check, if the default and default-push URLs
         have been configured.
         """
         args = self.initCommand("showconfig")
-        args.append('paths')
-        
+        args.append("paths")
+
         output, error = self.__client.runcommand(args)
-        
+
         self.__defaultConfigured = False
         self.__defaultPushConfigured = False
         if output:
             for line in output.splitlines():
                 line = line.strip()
-                if (
-                    line.startswith("paths.default=") and
-                    not line.endswith("=")
-                ):
+                if line.startswith("paths.default=") and not line.endswith("="):
                     self.__defaultConfigured = True
-                if (
-                    line.startswith("paths.default-push=") and
-                    not line.endswith("=")
-                ):
+                if line.startswith("paths.default-push=") and not line.endswith("="):
                     self.__defaultPushConfigured = True
-    
+
     def canCommitMerge(self):
         """
         Public method to check, if the working directory is an uncommitted
         merge.
- 
+
         @return flag indicating commit merge capability
         @rtype bool
         """
         args = self.initCommand("identify")
-        
+
         output, error = self.__client.runcommand(args)
-        
-        return output.count('+') == 2
+
+        return output.count("+") == 2
 
     def canPull(self):
         """
         Public method to check, if pull is possible.
-        
+
         @return flag indicating pull capability (boolean)
         """
         return self.__defaultConfigured
-    
+
     def canPush(self):
         """
         Public method to check, if push is possible.
-        
+
         @return flag indicating push capability (boolean)
         """
         return self.__defaultPushConfigured or self.__defaultConfigured
-    
+
     def __iniFileChanged(self, path):
         """
         Private slot to handle a change of the Mercurial configuration file.
-        
+
         @param path name of the changed file (string)
         """
         if self.__client:
@@ -2856,20 +2927,22 @@
                     self.tr("Mercurial Command Server"),
                     self.tr(
                         """<p>The Mercurial Command Server could not be"""
-                        """ restarted.</p><p>Reason: {0}</p>""").format(err))
-        
+                        """ restarted.</p><p>Reason: {0}</p>"""
+                    ).format(err),
+                )
+
         self.__getExtensionsInfo()
-        
+
         if self.__repoIniFile and path == self.__repoIniFile:
             self.__checkDefaults()
-        
+
         self.iniFileChanged.emit()
-    
+
     def __monitorRepoIniFile(self, repodir):
         """
         Private slot to add a repository configuration file to the list of
         monitored files.
-        
+
         @param repodir directory name of the repository
         @type str
         """
@@ -2878,66 +2951,63 @@
             self.__iniWatcher.addPath(cfgFile)
             self.__repoIniFile = cfgFile
             self.__checkDefaults()
-    
+
     ###########################################################################
     ## Methods to handle extensions are below.
     ###########################################################################
-    
+
     def __getExtensionsInfo(self):
         """
         Private method to get the active extensions from Mercurial.
         """
         activeExtensions = sorted(self.__activeExtensions)
         self.__activeExtensions = []
-        
+
         args = self.initCommand("showconfig")
-        args.append('extensions')
-        
+        args.append("extensions")
+
         output, error = self.__client.runcommand(args)
-        
+
         if output:
             for line in output.splitlines():
-                extensionName = (
-                    line.split("=", 1)[0].strip().split(".")[-1].strip()
-                )
+                extensionName = line.split("=", 1)[0].strip().split(".")[-1].strip()
                 self.__activeExtensions.append(extensionName)
         if self.version < (4, 8, 0) and "closehead" in self.__activeExtensions:
             self.__activeExtensions.remove["closehead"]
-        
+
         if activeExtensions != sorted(self.__activeExtensions):
             self.activeExtensionsChanged.emit()
-    
+
     def isExtensionActive(self, extensionName):
         """
         Public method to check, if an extension is active.
-        
+
         @param extensionName name of the extension to check for (string)
         @return flag indicating an active extension (boolean)
         """
         extensionName = extensionName.strip()
         isActive = extensionName in self.__activeExtensions
-        
+
         return isActive
-    
+
     def getExtensionObject(self, extensionName):
         """
         Public method to get a reference to an extension object.
-        
+
         @param extensionName name of the extension (string)
         @return reference to the extension object (boolean)
         """
         return self.__extensions[extensionName]
-    
+
     ###########################################################################
     ## Methods to get the helper objects are below.
     ###########################################################################
-    
-    def vcsGetProjectBrowserHelper(self, browser, project,
-                                   isTranslationsBrowser=False):
+
+    def vcsGetProjectBrowserHelper(self, browser, project, isTranslationsBrowser=False):
         """
         Public method to instantiate a helper object for the different
         project browsers.
-        
+
         @param browser reference to the project browser object
         @param project reference to the project object
         @param isTranslationsBrowser flag indicating, the helper is requested
@@ -2945,13 +3015,13 @@
         @return the project browser helper object
         """
         from .ProjectBrowserHelper import HgProjectBrowserHelper
-        return HgProjectBrowserHelper(self, browser, project,
-                                      isTranslationsBrowser)
-        
+
+        return HgProjectBrowserHelper(self, browser, project, isTranslationsBrowser)
+
     def vcsGetProjectHelper(self, project):
         """
         Public method to instantiate a helper object for the project.
-        
+
         @param project reference to the project object
         @return the project helper object
         """
@@ -2962,30 +3032,30 @@
             if not repodir or os.path.splitdrive(repodir)[1] == os.sep:
                 repodir = ""
                 break
-        
+
         self.__projectHelper = self.__plugin.getProjectHelper()
         self.__projectHelper.setObjects(self, project)
-        
+
         if repodir:
             self.__repoDir = repodir
             self.__createClient(repodir)
             self.__monitorRepoIniFile(repodir)
-        
+
         return self.__projectHelper
-    
+
     ###########################################################################
     ## Methods to handle the Mercurial command server are below.
     ###########################################################################
-    
+
     def __createClient(self, repodir=""):
         """
         Private method to create a Mercurial command server client.
-        
+
         @param repodir path of the local repository
         @type str
         """
         self.stopClient()
-        
+
         self.__client = HgClient(repodir, "utf-8", self)
         ok, err = self.__client.startServer()
         if not ok:
@@ -2994,19 +3064,21 @@
                 self.tr("Mercurial Command Server"),
                 self.tr(
                     """<p>The Mercurial Command Server could not be"""
-                    """ started.</p><p>Reason: {0}</p>""").format(err))
-    
+                    """ started.</p><p>Reason: {0}</p>"""
+                ).format(err),
+            )
+
     def getClient(self):
         """
         Public method to get a reference to the command server interface.
-        
+
         @return reference to the client (HgClient)
         """
         if self.__client is None:
             self.__createClient(self.__repoDir)
-        
+
         return self.__client
-    
+
     def stopClient(self):
         """
         Public method to stop the command server client.
@@ -3014,7 +3086,7 @@
         if self.__client is not None:
             self.__client.stopServer()
             self.__client = None
-    
+
     ###########################################################################
     ## Status Monitor Thread methods
     ###########################################################################
@@ -3023,13 +3095,14 @@
         """
         Protected method to create an instance of the VCS status monitor
         thread.
-        
+
         @param interval check interval for the monitor thread in seconds
             (integer)
         @param project reference to the project object (Project)
         @return reference to the monitor thread (QThread)
         """
         from .HgStatusMonitorThread import HgStatusMonitorThread
+
         return HgStatusMonitorThread(interval, project, self)
 
     ###########################################################################
@@ -3041,25 +3114,26 @@
         Public method used to list the available bookmarks.
         """
         self.bookmarksList = []
-        
+
         if self.bookmarksListDlg is None:
             from .HgBookmarksListDialog import HgBookmarksListDialog
+
             self.bookmarksListDlg = HgBookmarksListDialog(self)
         self.bookmarksListDlg.show()
         self.bookmarksListDlg.raise_()
         self.bookmarksListDlg.start(self.bookmarksList)
-    
+
     def hgGetBookmarksList(self):
         """
         Public method to get the list of bookmarks.
-        
+
         @return list of bookmarks (list of string)
         """
         args = self.initCommand("bookmarks")
-        
+
         client = self.getClient()
         output = client.runcommand(args)[0]
-        
+
         self.bookmarksList = []
         for line in output.splitlines():
             li = line.strip().split()
@@ -3070,13 +3144,13 @@
                     del li[0]
                 name = " ".join(li)
                 self.bookmarksList.append(name)
-        
+
         return self.bookmarksList[:]
-    
+
     def hgBookmarkDefine(self, revision=None, bookmark=None):
         """
         Public method to define a bookmark.
-        
+
         @param revision revision to set bookmark for (string)
         @param bookmark name of the bookmark (string)
         """
@@ -3084,32 +3158,35 @@
             ok = True
         else:
             from .HgBookmarkDialog import HgBookmarkDialog
-            dlg = HgBookmarkDialog(HgBookmarkDialog.DEFINE_MODE,
-                                   self.hgGetTagsList(),
-                                   self.hgGetBranchesList(),
-                                   self.hgGetBookmarksList())
+
+            dlg = HgBookmarkDialog(
+                HgBookmarkDialog.DEFINE_MODE,
+                self.hgGetTagsList(),
+                self.hgGetBranchesList(),
+                self.hgGetBookmarksList(),
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 revision, bookmark = dlg.getData()
                 ok = True
             else:
                 ok = False
-        
+
         if ok:
             args = self.initCommand("bookmarks")
             if revision:
                 args.append("--rev")
                 args.append(revision)
             args.append(bookmark)
-            
-            dia = HgDialog(self.tr('Mercurial Bookmark'), self)
+
+            dia = HgDialog(self.tr("Mercurial Bookmark"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgBookmarkDelete(self, bookmark=None):
         """
         Public method to delete a bookmark.
-        
+
         @param bookmark name of the bookmark (string)
         """
         if bookmark:
@@ -3120,45 +3197,48 @@
                 self.tr("Delete Bookmark"),
                 self.tr("Select the bookmark to be deleted:"),
                 [""] + sorted(self.hgGetBookmarksList()),
-                0, True)
+                0,
+                True,
+            )
         if ok and bookmark:
             args = self.initCommand("bookmarks")
             args.append("--delete")
             args.append(bookmark)
-            
-            dia = HgDialog(self.tr('Delete Mercurial Bookmark'), self)
+
+            dia = HgDialog(self.tr("Delete Mercurial Bookmark"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgBookmarkRename(self, renameInfo=None):
         """
         Public method to rename a bookmark.
-        
+
         @param renameInfo old and new names of the bookmark
         @type tuple of str and str
         """
         if not renameInfo:
             from .HgBookmarkRenameDialog import HgBookmarkRenameDialog
+
             dlg = HgBookmarkRenameDialog(self.hgGetBookmarksList())
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 renameInfo = dlg.getData()
-        
+
         if renameInfo:
             args = self.initCommand("bookmarks")
             args.append("--rename")
             args.append(renameInfo[0])
             args.append(renameInfo[1])
-            
-            dia = HgDialog(self.tr('Rename Mercurial Bookmark'), self)
+
+            dia = HgDialog(self.tr("Rename Mercurial Bookmark"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgBookmarkMove(self, revision=None, bookmark=None):
         """
         Public method to move a bookmark.
-        
+
         @param revision revision to set bookmark for (string)
         @param bookmark name of the bookmark (string)
         """
@@ -3166,16 +3246,19 @@
             ok = True
         else:
             from .HgBookmarkDialog import HgBookmarkDialog
-            dlg = HgBookmarkDialog(HgBookmarkDialog.MOVE_MODE,
-                                   self.hgGetTagsList(),
-                                   self.hgGetBranchesList(),
-                                   self.hgGetBookmarksList())
+
+            dlg = HgBookmarkDialog(
+                HgBookmarkDialog.MOVE_MODE,
+                self.hgGetTagsList(),
+                self.hgGetBranchesList(),
+                self.hgGetBookmarksList(),
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 revision, bookmark = dlg.getData()
                 ok = True
             else:
                 ok = False
-        
+
         if ok:
             args = self.initCommand("bookmarks")
             args.append("--force")
@@ -3183,64 +3266,66 @@
                 args.append("--rev")
                 args.append(revision)
             args.append(bookmark)
-            
-            dia = HgDialog(self.tr('Move Mercurial Bookmark'), self)
+
+            dia = HgDialog(self.tr("Move Mercurial Bookmark"), self)
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgBookmarkIncoming(self):
         """
         Public method to show a list of incoming bookmarks.
         """
         from .HgBookmarksInOutDialog import HgBookmarksInOutDialog
+
         self.bookmarksInOutDlg = HgBookmarksInOutDialog(
-            self, HgBookmarksInOutDialog.INCOMING)
+            self, HgBookmarksInOutDialog.INCOMING
+        )
         self.bookmarksInOutDlg.show()
         self.bookmarksInOutDlg.start()
-    
+
     def hgBookmarkOutgoing(self):
         """
         Public method to show a list of outgoing bookmarks.
         """
         from .HgBookmarksInOutDialog import HgBookmarksInOutDialog
+
         self.bookmarksInOutDlg = HgBookmarksInOutDialog(
-            self, HgBookmarksInOutDialog.OUTGOING)
+            self, HgBookmarksInOutDialog.OUTGOING
+        )
         self.bookmarksInOutDlg.show()
         self.bookmarksInOutDlg.start()
-    
+
     def __getInOutBookmarks(self, incoming):
         """
         Private method to get the list of incoming or outgoing bookmarks.
-        
+
         @param incoming flag indicating to get incoming bookmarks (boolean)
         @return list of bookmarks (list of string)
         """
         bookmarksList = []
-        
+
         args = (
-            self.initCommand("incoming")
-            if incoming else
-            self.initCommand("outgoing")
+            self.initCommand("incoming") if incoming else self.initCommand("outgoing")
         )
-        args.append('--bookmarks')
-        
+        args.append("--bookmarks")
+
         client = self.getClient()
         output = client.runcommand(args)[0]
-        
+
         for line in output.splitlines():
             if line.startswith(" "):
                 li = line.strip().split()
                 del li[-1]
                 name = " ".join(li)
                 bookmarksList.append(name)
-        
+
         return bookmarksList
-    
+
     def hgBookmarkPull(self, current=False, bookmark=None):
         """
         Public method to pull a bookmark from a remote repository.
-        
+
         @param current flag indicating to pull the current bookmark
         @type bool
         @param bookmark name of the bookmark
@@ -3258,24 +3343,26 @@
                 self.tr("Pull Bookmark"),
                 self.tr("Select the bookmark to be pulled:"),
                 [""] + sorted(bookmarks),
-                0, True)
-        
+                0,
+                True,
+            )
+
         if ok and bookmark:
             args = self.initCommand("pull")
-            args.append('--bookmark')
+            args.append("--bookmark")
             args.append(bookmark)
-            
-            dia = HgDialog(self.tr(
-                'Pulling bookmark from a remote Mercurial repository'),
-                self)
+
+            dia = HgDialog(
+                self.tr("Pulling bookmark from a remote Mercurial repository"), self
+            )
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-    
+
     def hgBookmarkPush(self, current=False, bookmark=None, allBookmarks=False):
         """
         Public method to push a bookmark to a remote repository.
-        
+
         @param current flag indicating to push the current bookmark
         @type bool
         @param bookmark name of the bookmark
@@ -3295,19 +3382,21 @@
                 self.tr("Push Bookmark"),
                 self.tr("Select the bookmark to be push:"),
                 [""] + sorted(bookmarks),
-                0, True)
-        
+                0,
+                True,
+            )
+
         if ok and (bool(bookmark) or all):
             args = self.initCommand("push")
             if allBookmarks:
-                args.append('--all-bookmarks')
+                args.append("--all-bookmarks")
             else:
-                args.append('--bookmark')
+                args.append("--bookmark")
                 args.append(bookmark)
-            
-            dia = HgDialog(self.tr(
-                'Pushing bookmark to a remote Mercurial repository'),
-                self)
+
+            dia = HgDialog(
+                self.tr("Pushing bookmark to a remote Mercurial repository"), self
+            )
             res = dia.startProcess(args)
             if res:
                 dia.exec()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,166 +9,168 @@
 
 # Available protocols for the repository URL
 ConfigSvnProtocols = [
-    'file://',
-    'http://',
-    'https://',
-    'svn://',
-    'svn+ssh://',
+    "file://",
+    "http://",
+    "https://",
+    "svn://",
+    "svn+ssh://",
 ]
 
 
-DefaultConfig = "\n".join([
-    "### This file configures various client-side behaviors.",
-    "###",
-    "### The commented-out examples below are intended to demonstrate",
-    "### how to use this file.",
-    "",
-    "### Section for authentication and authorization customizations.",
-    "[auth]",
-    "### Set password stores used by Subversion. They should be",
-    "### delimited by spaces or commas. The order of values determines",
-    "### the order in which password stores are used.",
-    "### Valid password stores:",
-    "###   gnome-keyring        (Unix-like systems)",
-    "###   kwallet              (Unix-like systems)",
-    "###   keychain             (Mac OS X)",
-    "###   windows-cryptoapi    (Windows)",
-    "# password-stores = keychain",
-    "# password-stores = windows-cryptoapi",
-    "# password-stores = gnome-keyring,kwallet",
-    "### To disable all password stores, use an empty list:",
-    "# password-stores =",
-    "###",
-    "### Set KWallet wallet used by Subversion. If empty or unset,",
-    "### then the default network wallet will be used.",
-    "# kwallet-wallet =",
-    "###",
-    "### Include PID (Process ID) in Subversion application name when",
-    "### using KWallet. It defaults to 'no'.",
-    "# kwallet-svn-application-name-with-pid = yes",
-    "###",
-    "### The rest of the [auth] section in this file has been deprecated.",
-    "### Both 'store-passwords' and 'store-auth-creds' can now be",
-    "### specified in the 'servers' file in your config directory",
-    "### and are documented there. Anything specified in this section ",
-    "### is overridden by settings specified in the 'servers' file.",
-    "# store-passwords = no",
-    "# store-auth-creds = no",
-    "",
-    "### Section for configuring external helper applications.",
-    "[helpers]",
-    "### Set editor-cmd to the command used to invoke your text editor.",
-    "###   This will override the environment variables that Subversion",
-    "###   examines by default to find this information ($EDITOR, ",
-    "###   et al).",
-    "# editor-cmd = editor (vi, emacs, notepad, etc.)",
-    "### Set diff-cmd to the absolute path of your 'diff' program.",
-    "###   This will override the compile-time default, which is to use",
-    "###   Subversion's internal diff implementation.",
-    "# diff-cmd = diff_program (diff, gdiff, etc.)",
-    "### Diff-extensions are arguments passed to an external diff",
-    "### program or to Subversion's internal diff implementation.",
-    "### Set diff-extensions to override the default arguments ('-u').",
-    "# diff-extensions = -u -p",
-    "### Set diff3-cmd to the absolute path of your 'diff3' program.",
-    "###   This will override the compile-time default, which is to use",
-    "###   Subversion's internal diff3 implementation.",
-    "# diff3-cmd = diff3_program (diff3, gdiff3, etc.)",
-    "### Set diff3-has-program-arg to 'yes' if your 'diff3' program",
-    "###   accepts the '--diff-program' option.",
-    "# diff3-has-program-arg = [yes | no]",
-    "### Set merge-tool-cmd to the command used to invoke your external",
-    "### merging tool of choice. Subversion will pass 5 arguments to",
-    "### the specified command: base theirs mine merged wcfile",
-    "# merge-tool-cmd = merge_command",
-    "",
-    "### Section for configuring tunnel agents.",
-    "[tunnels]",
-    "### Configure svn protocol tunnel schemes here.  By default, only",
-    "### the 'ssh' scheme is defined.  You can define other schemes to",
-    "### be used with 'svn+scheme://hostname/path' URLs.  A scheme",
-    "### definition is simply a command, optionally prefixed by an",
-    "### environment variable name which can override the command if it",
-    "### is defined.  The command (or environment variable) may contain",
-    "### arguments, using standard shell quoting for arguments with",
-    "### spaces.  The command will be invoked as:",
-    "###   <command> <hostname> svnserve -t",
-    "### (If the URL includes a username, then the hostname will be",
-    "### passed to the tunnel agent as <user>@<hostname>.)  If the",
-    "### built-in ssh scheme were not predefined, it could be defined",
-    "### as:",
-    "# ssh = $SVN_SSH ssh -q",
-    "### If you wanted to define a new 'rsh' scheme, to be used with",
-    "### 'svn+rsh:' URLs, you could do so as follows:",
-    "# rsh = rsh",
-    "### Or, if you wanted to specify a full path and arguments:",
-    "# rsh = /path/to/rsh -l myusername",
-    "### On Windows, if you are specifying a full path to a command,",
-    "### use a forward slash (/) or a paired backslash (\\\\) as the",
-    "### path separator.  A single backslash will be treated as an",
-    "### escape for the following character.",
-    "",
-    "### Section for configuring miscelleneous Subversion options.",
-    "[miscellany]",
-    "### Set global-ignores to a set of whitespace-delimited globs",
-    "### which Subversion will ignore in its 'status' output, and",
-    "### while importing or adding files and directories.",
-    "### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.",
-    "global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc",
-    "  *.pyo .*.rej *.rej .*~ *~ #*# .#* .*.swp .DS_Store",
-    "  *.orig *.bak cur tmp __pycache__ .directory",
-    "  .ropeproject .eric6project .eric7project",
-    "### Set log-encoding to the default encoding for log messages",
-    "# log-encoding = latin1",
-    "### Set use-commit-times to make checkout/update/switch/revert",
-    "### put last-committed timestamps on every file touched.",
-    "# use-commit-times = yes",
-    "### Set no-unlock to prevent 'svn commit' from automatically",
-    "### releasing locks on files.",
-    "# no-unlock = yes",
-    "### Set mime-types-file to a MIME type registry file, used to",
-    "### provide hints to Subversion's MIME type auto-detection",
-    "### algorithm.",
-    "# mime-types-file = /path/to/mime.types",
-    "### Set preserved-conflict-file-exts to a whitespace-delimited",
-    "### list of patterns matching file extensions which should be",
-    "### preserved in generated conflict file names.  By default,",
-    "### conflict files use custom extensions.",
-    "# preserved-conflict-file-exts = doc ppt xls od?",
-    "### Set enable-auto-props to 'yes' to enable automatic properties",
-    "### for 'svn add' and 'svn import', it defaults to 'no'.",
-    "### Automatic properties are defined in the section 'auto-props'.",
-    "# enable-auto-props = yes",
-    "### Set interactive-conflicts to 'no' to disable interactive",
-    "### conflict resolution prompting.  It defaults to 'yes'.",
-    "# interactive-conflicts = no",
-    "### Set memory-cache-size to define the size of the memory cache",
-    "### used by the client when accessing a FSFS repository via",
-    "### ra_local (the file:// scheme). The value represents the number",
-    "### of MB used by the cache.",
-    "# memory-cache-size = 16",
-    "",
-    "### Section for configuring automatic properties.",
-    "[auto-props]",
-    "### The format of the entries is:",
-    "###   file-name-pattern = propname[=value][;propname[=value]...]",
-    "### The file-name-pattern can contain wildcards (such as '*' and",
-    "### '?').  All entries which match (case-insensitively) will be",
-    "### applied to the file.  Note that auto-props functionality",
-    "### must be enabled, which is typically done by setting the",
-    "### 'enable-auto-props' option.",
-    "# *.c = svn:eol-style=native",
-    "# *.cpp = svn:eol-style=native",
-    "# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native",
-    "# *.dsp = svn:eol-style=CRLF",
-    "# *.dsw = svn:eol-style=CRLF",
-    "# *.sh = svn:eol-style=native;svn:executable",
-    "# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;",
-    "# *.png = svn:mime-type=image/png",
-    "# *.jpg = svn:mime-type=image/jpeg",
-    "# Makefile = svn:eol-style=native",
-    "",
-])
+DefaultConfig = "\n".join(
+    [
+        "### This file configures various client-side behaviors.",
+        "###",
+        "### The commented-out examples below are intended to demonstrate",
+        "### how to use this file.",
+        "",
+        "### Section for authentication and authorization customizations.",
+        "[auth]",
+        "### Set password stores used by Subversion. They should be",
+        "### delimited by spaces or commas. The order of values determines",
+        "### the order in which password stores are used.",
+        "### Valid password stores:",
+        "###   gnome-keyring        (Unix-like systems)",
+        "###   kwallet              (Unix-like systems)",
+        "###   keychain             (Mac OS X)",
+        "###   windows-cryptoapi    (Windows)",
+        "# password-stores = keychain",
+        "# password-stores = windows-cryptoapi",
+        "# password-stores = gnome-keyring,kwallet",
+        "### To disable all password stores, use an empty list:",
+        "# password-stores =",
+        "###",
+        "### Set KWallet wallet used by Subversion. If empty or unset,",
+        "### then the default network wallet will be used.",
+        "# kwallet-wallet =",
+        "###",
+        "### Include PID (Process ID) in Subversion application name when",
+        "### using KWallet. It defaults to 'no'.",
+        "# kwallet-svn-application-name-with-pid = yes",
+        "###",
+        "### The rest of the [auth] section in this file has been deprecated.",
+        "### Both 'store-passwords' and 'store-auth-creds' can now be",
+        "### specified in the 'servers' file in your config directory",
+        "### and are documented there. Anything specified in this section ",
+        "### is overridden by settings specified in the 'servers' file.",
+        "# store-passwords = no",
+        "# store-auth-creds = no",
+        "",
+        "### Section for configuring external helper applications.",
+        "[helpers]",
+        "### Set editor-cmd to the command used to invoke your text editor.",
+        "###   This will override the environment variables that Subversion",
+        "###   examines by default to find this information ($EDITOR, ",
+        "###   et al).",
+        "# editor-cmd = editor (vi, emacs, notepad, etc.)",
+        "### Set diff-cmd to the absolute path of your 'diff' program.",
+        "###   This will override the compile-time default, which is to use",
+        "###   Subversion's internal diff implementation.",
+        "# diff-cmd = diff_program (diff, gdiff, etc.)",
+        "### Diff-extensions are arguments passed to an external diff",
+        "### program or to Subversion's internal diff implementation.",
+        "### Set diff-extensions to override the default arguments ('-u').",
+        "# diff-extensions = -u -p",
+        "### Set diff3-cmd to the absolute path of your 'diff3' program.",
+        "###   This will override the compile-time default, which is to use",
+        "###   Subversion's internal diff3 implementation.",
+        "# diff3-cmd = diff3_program (diff3, gdiff3, etc.)",
+        "### Set diff3-has-program-arg to 'yes' if your 'diff3' program",
+        "###   accepts the '--diff-program' option.",
+        "# diff3-has-program-arg = [yes | no]",
+        "### Set merge-tool-cmd to the command used to invoke your external",
+        "### merging tool of choice. Subversion will pass 5 arguments to",
+        "### the specified command: base theirs mine merged wcfile",
+        "# merge-tool-cmd = merge_command",
+        "",
+        "### Section for configuring tunnel agents.",
+        "[tunnels]",
+        "### Configure svn protocol tunnel schemes here.  By default, only",
+        "### the 'ssh' scheme is defined.  You can define other schemes to",
+        "### be used with 'svn+scheme://hostname/path' URLs.  A scheme",
+        "### definition is simply a command, optionally prefixed by an",
+        "### environment variable name which can override the command if it",
+        "### is defined.  The command (or environment variable) may contain",
+        "### arguments, using standard shell quoting for arguments with",
+        "### spaces.  The command will be invoked as:",
+        "###   <command> <hostname> svnserve -t",
+        "### (If the URL includes a username, then the hostname will be",
+        "### passed to the tunnel agent as <user>@<hostname>.)  If the",
+        "### built-in ssh scheme were not predefined, it could be defined",
+        "### as:",
+        "# ssh = $SVN_SSH ssh -q",
+        "### If you wanted to define a new 'rsh' scheme, to be used with",
+        "### 'svn+rsh:' URLs, you could do so as follows:",
+        "# rsh = rsh",
+        "### Or, if you wanted to specify a full path and arguments:",
+        "# rsh = /path/to/rsh -l myusername",
+        "### On Windows, if you are specifying a full path to a command,",
+        "### use a forward slash (/) or a paired backslash (\\\\) as the",
+        "### path separator.  A single backslash will be treated as an",
+        "### escape for the following character.",
+        "",
+        "### Section for configuring miscelleneous Subversion options.",
+        "[miscellany]",
+        "### Set global-ignores to a set of whitespace-delimited globs",
+        "### which Subversion will ignore in its 'status' output, and",
+        "### while importing or adding files and directories.",
+        "### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.",
+        "global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc",
+        "  *.pyo .*.rej *.rej .*~ *~ #*# .#* .*.swp .DS_Store",
+        "  *.orig *.bak cur tmp __pycache__ .directory",
+        "  .ropeproject .eric6project .eric7project",
+        "### Set log-encoding to the default encoding for log messages",
+        "# log-encoding = latin1",
+        "### Set use-commit-times to make checkout/update/switch/revert",
+        "### put last-committed timestamps on every file touched.",
+        "# use-commit-times = yes",
+        "### Set no-unlock to prevent 'svn commit' from automatically",
+        "### releasing locks on files.",
+        "# no-unlock = yes",
+        "### Set mime-types-file to a MIME type registry file, used to",
+        "### provide hints to Subversion's MIME type auto-detection",
+        "### algorithm.",
+        "# mime-types-file = /path/to/mime.types",
+        "### Set preserved-conflict-file-exts to a whitespace-delimited",
+        "### list of patterns matching file extensions which should be",
+        "### preserved in generated conflict file names.  By default,",
+        "### conflict files use custom extensions.",
+        "# preserved-conflict-file-exts = doc ppt xls od?",
+        "### Set enable-auto-props to 'yes' to enable automatic properties",
+        "### for 'svn add' and 'svn import', it defaults to 'no'.",
+        "### Automatic properties are defined in the section 'auto-props'.",
+        "# enable-auto-props = yes",
+        "### Set interactive-conflicts to 'no' to disable interactive",
+        "### conflict resolution prompting.  It defaults to 'yes'.",
+        "# interactive-conflicts = no",
+        "### Set memory-cache-size to define the size of the memory cache",
+        "### used by the client when accessing a FSFS repository via",
+        "### ra_local (the file:// scheme). The value represents the number",
+        "### of MB used by the cache.",
+        "# memory-cache-size = 16",
+        "",
+        "### Section for configuring automatic properties.",
+        "[auto-props]",
+        "### The format of the entries is:",
+        "###   file-name-pattern = propname[=value][;propname[=value]...]",
+        "### The file-name-pattern can contain wildcards (such as '*' and",
+        "### '?').  All entries which match (case-insensitively) will be",
+        "### applied to the file.  Note that auto-props functionality",
+        "### must be enabled, which is typically done by setting the",
+        "### 'enable-auto-props' option.",
+        "# *.c = svn:eol-style=native",
+        "# *.cpp = svn:eol-style=native",
+        "# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native",
+        "# *.dsp = svn:eol-style=CRLF",
+        "# *.dsw = svn:eol-style=CRLF",
+        "# *.sh = svn:eol-style=native;svn:executable",
+        "# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;",
+        "# *.png = svn:mime-type=image/png",
+        "# *.jpg = svn:mime-type=image/jpeg",
+        "# Makefile = svn:eol-style=native",
+        "",
+    ]
+)
 
 
 DefaultIgnores = [
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/SubversionPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/SubversionPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 
 from PyQt6.QtCore import pyqtSlot
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_SubversionPage import Ui_SubversionPage
 
 
@@ -19,33 +17,35 @@
     """
     Class implementing the Subversion configuration page.
     """
+
     def __init__(self, plugin):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("SubversionPage")
-        
+
         self.__plugin = plugin
-        
+
         # set initial values
         self.logSpinBox.setValue(self.__plugin.getPreferences("LogLimit"))
-        
+
     def save(self):
         """
         Public slot to save the Subversion configuration.
         """
         self.__plugin.setPreferences("LogLimit", self.logSpinBox.value())
-    
+
     @pyqtSlot()
     def on_configButton_clicked(self):
         """
         Private slot to edit the Subversion config file.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         cfgFile = self.__plugin.getConfigPath()
         editor = MiniEditor(cfgFile, "Properties", self)
         editor.show()
@@ -56,6 +56,7 @@
         Private slot to edit the Subversion servers file.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         serversFile = self.__plugin.getServersPath()
         editor = MiniEditor(serversFile, "Properties", self)
         editor.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,11 +26,19 @@
     """
     Class implementing the VCS project browser helper for subversion.
     """
-    def __init__(self, vcsObject, browserObject, projectObject,
-                 isTranslationsBrowser, parent=None, name=None):
+
+    def __init__(
+        self,
+        vcsObject,
+        browserObject,
+        projectObject,
+        isTranslationsBrowser,
+        parent=None,
+        name=None,
+    ):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
@@ -39,17 +47,23 @@
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
-        VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject,
-                                         projectObject, isTranslationsBrowser,
-                                         parent, name)
-    
+        VcsProjectBrowserHelper.__init__(
+            self,
+            vcsObject,
+            browserObject,
+            projectObject,
+            isTranslationsBrowser,
+            parent,
+            name,
+        )
+
     def showContextMenu(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -61,7 +75,7 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(False)
-            if not hasattr(self.browser.currentItem(), 'fileName'):
+            if not hasattr(self.browser.currentItem(), "fileName"):
                 self.blameAct.setEnabled(False)
         else:
             for act in self.vcsMenuActions:
@@ -77,15 +91,15 @@
                     self.vcsMenuAddTree.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuMulti(self, menu, standardItems):
         """
         Public slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -97,7 +111,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsMultiMenuActions:
@@ -114,21 +128,18 @@
                 act.setEnabled(False)
             for act in self.vcsAddMultiMenuActions:
                 act.setEnabled(True)
-            if (
-                1 in self.browser.specialMenuEntries and
-                self.__itemsHaveFiles(items)
-            ):
+            if 1 in self.browser.specialMenuEntries and self.__itemsHaveFiles(items):
                 self.vcsMultiMenuAddTree.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDir(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -147,14 +158,14 @@
                 act.setEnabled(True)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDirMulti(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -166,7 +177,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsDirMultiMenuActions:
@@ -193,550 +204,645 @@
     def _addVCSMenu(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMenuActions = []
         self.vcsAddMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'),
-            self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMenuActions.append(act)
         if 1 in self.browser.specialMenuEntries:
             self.vcsMenuAddTree = menu.addAction(
                 UI.PixmapCache.getIcon("vcsAdd"),
-                self.tr('Add tree to repository'),
-                self._VCSAddTree)
+                self.tr("Add tree to repository"),
+                self._VCSAddTree,
+            )
             self.vcsAddMenuActions.append(self.vcsMenuAddTree)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(
-            self.tr('Copy'), self.__SVNCopy)
+        act = menu.addAction(self.tr("Copy"), self.__SVNCopy)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__SVNMove)
+        act = menu.addAction(self.tr("Move"), self.__SVNMove)
         self.vcsMenuActions.append(act)
         if pysvn.svn_version >= (1, 5, 0) and pysvn.version >= (1, 6, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRepo"),
-            self.tr('Show repository info'), self.__SVNInfo)
+            self.tr("Show repository info"),
+            self.__SVNInfo,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side'), self.__SVNSbsDiff)
+            self.tr("Show differences side-by-side"),
+            self.__SVNSbsDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side (extended)'),
-            self.__SVNSbsExtendedDiff)
+            self.tr("Show differences side-by-side (extended)"),
+            self.__SVNSbsExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsMenuActions.append(act)
-        self.blameAct = menu.addAction(
-            self.tr('Show annotated file'),
-            self.__SVNBlame)
+        self.blameAct = menu.addAction(self.tr("Show annotated file"), self.__SVNBlame)
         self.vcsMenuActions.append(self.blameAct)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsLock"),
-            self.tr('Lock'), self.__SVNLock)
+            UI.PixmapCache.getIcon("vcsLock"), self.tr("Lock"), self.__SVNLock
+        )
+        self.vcsMenuActions.append(act)
+        act = menu.addAction(
+            UI.PixmapCache.getIcon("vcsUnlock"), self.tr("Unlock"), self.__SVNUnlock
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Unlock'), self.__SVNUnlock)
-        self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Break Lock'), self.__SVNBreakLock)
+            self.tr("Break Lock"),
+            self.__SVNBreakLock,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Steal Lock'), self.__SVNStealLock)
+            self.tr("Steal Lock"),
+            self.__SVNStealLock,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menu = menu
-        
+
     def _addVCSMenuMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu for multi selection to all
         project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMultiMenuActions = []
         self.vcsAddMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMultiMenuActions.append(act)
         if 1 in self.browser.specialMenuEntries:
             self.vcsMultiMenuAddTree = menu.addAction(
                 UI.PixmapCache.getIcon("vcsAdd"),
-                self.tr('Add tree to repository'), self._VCSAddTree)
+                self.tr("Add tree to repository"),
+                self._VCSAddTree,
+            )
             self.vcsAddMultiMenuActions.append(self.vcsMultiMenuAddTree)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMultiMenuActions.append(act)
         if pysvn.svn_version >= (1, 5, 0) and pysvn.version >= (1, 6, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsLock"),
-            self.tr('Lock'), self.__SVNLock)
+            UI.PixmapCache.getIcon("vcsLock"), self.tr("Lock"), self.__SVNLock
+        )
+        self.vcsMultiMenuActions.append(act)
+        act = menu.addAction(
+            UI.PixmapCache.getIcon("vcsUnlock"), self.tr("Unlock"), self.__SVNUnlock
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Unlock'), self.__SVNUnlock)
-        self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Break Lock'), self.__SVNBreakLock)
+            self.tr("Break Lock"),
+            self.__SVNBreakLock,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUnlock"),
-            self.tr('Steal Lock'), self.__SVNStealLock)
+            self.tr("Steal Lock"),
+            self.__SVNStealLock,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuMulti = menu
-        
+
     def _addVCSMenuBack(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuBack = menu
-        
+
     def _addVCSMenuDir(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMenuActions = []
         self.vcsAddDirMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__SVNCopy)
+        act = menu.addAction(self.tr("Copy"), self.__SVNCopy)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__SVNMove)
+        act = menu.addAction(self.tr("Move"), self.__SVNMove)
         self.vcsDirMenuActions.append(act)
         if pysvn.svn_version >= (1, 5, 0) and pysvn.version >= (1, 6, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRepo"),
-            self.tr('Show repository info'), self.__SVNInfo)
+            self.tr("Show repository info"),
+            self.__SVNInfo,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
-        self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
-        self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
-        self.vcsDirMenuActions.append(act)
-        menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        menu.addSeparator()
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDir = menu
-        
+
     def _addVCSMenuDirMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMultiMenuActions = []
         self.vcsAddDirMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMultiMenuActions.append(act)
         if pysvn.svn_version >= (1, 5, 0) and pysvn.version >= (1, 6, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
-        self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
-        self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
-        self.vcsDirMultiMenuActions.append(act)
-        menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        menu.addSeparator()
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDirMulti = menu
-    
+
     ###########################################################################
     # Menu handling methods below
     ###########################################################################
-    
+
     def __SVNCopy(self):
         """
         Private slot called by the context menu to copy the selected file.
@@ -747,7 +853,7 @@
         except AttributeError:
             fn = itm.dirName()
         self.vcs.svnCopy(fn, self.project)
-        
+
     def __SVNMove(self):
         """
         Private slot called by the context menu to move the selected file.
@@ -767,7 +873,7 @@
                 for mf in movefiles:
                     self.browser.closeSourceWindow.emit(mf)
         self.browser.project.startFileSystemMonitoring()
-    
+
     def __SVNResolve(self):
         """
         Private slot called by the context menu to resolve conflicts of a file.
@@ -779,7 +885,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.vcsResolved(names)
-        
+
     def __SVNListProps(self):
         """
         Private slot called by the context menu to list the subversion
@@ -792,7 +898,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnListProps(names)
-        
+
     def __SVNSetProp(self):
         """
         Private slot called by the context menu to set a subversion
@@ -805,7 +911,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnSetProp(names)
-        
+
     def __SVNDelProp(self):
         """
         Private slot called by the context menu to delete a subversion
@@ -818,12 +924,12 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnDelProp(names)
-        
+
     def __SVNExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository.
-        
+
         This gives the chance to enter the revisions to compare.
         """
         names = []
@@ -833,12 +939,12 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnExtendedDiff(names)
-        
+
     def __SVNUrlDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file of two repository URLs.
-        
+
         This gives the chance to enter the repository URLs to compare.
         """
         names = []
@@ -848,7 +954,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUrlDiff(names)
-        
+
     def __SVNSbsDiff(self):
         """
         Private slot called by the context menu to show the difference of a
@@ -857,18 +963,18 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn)
-    
+
     def __SVNSbsExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository side-by-side.
-       
+
         It allows the selection of revisions to compare.
         """
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn, extended=True)
-    
+
     def __SVNBlame(self):
         """
         Private slot called by the context menu to show the blame of a file.
@@ -876,7 +982,7 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.svnBlame(fn)
-        
+
     def __SVNLock(self):
         """
         Private slot called by the context menu to lock files in the
@@ -889,7 +995,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnLock(names)
-        
+
     def __SVNUnlock(self):
         """
         Private slot called by the context menu to unlock files in the
@@ -902,7 +1008,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUnlock(names)
-        
+
     def __SVNBreakLock(self):
         """
         Private slot called by the context menu to break lock files in the
@@ -915,7 +1021,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUnlock(names, breakIt=True)
-        
+
     def __SVNStealLock(self):
         """
         Private slot called by the context menu to steal lock files in the
@@ -928,7 +1034,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnLock(names, stealIt=True)
-        
+
     def __SVNInfo(self):
         """
         Private slot called by the context menu to show repository information
@@ -940,14 +1046,13 @@
             name = self.browser.currentItem().dirName()
         name = self.project.getRelativePath(name)
         self.vcs.svnInfo(self.project.ppath, name)
-        
+
     def __SVNConfigure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_subversionPage")
-        
+        ericApp().getObject("UserInterface").showPreferences("zzz_subversionPage")
+
     def __SVNAddToChangelist(self):
         """
         Private slot called by the context menu to add files to a changelist.
@@ -959,7 +1064,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnAddToChangelist(names)
-        
+
     def __SVNRemoveFromChangelist(self):
         """
         Private slot called by the context menu to remove files from their
@@ -976,11 +1081,11 @@
     ###########################################################################
     # Some private utility methods below
     ###########################################################################
-    
+
     def __itemsHaveFiles(self, items):
         """
         Private method to check, if items contain file type items.
-        
+
         @param items items to check (list of QTreeWidgetItems)
         @return flag indicating items contain file type items (boolean)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,482 +23,620 @@
     """
     Class implementing the VCS project helper for Subversion.
     """
+
     def __init__(self, vcsObject, projectObject, parent=None, name=None):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VcsProjectHelper.__init__(self, vcsObject, projectObject, parent, name)
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.vcsNewAct = EricAction(
-            self.tr('New from repository'),
+            self.tr("New from repository"),
             UI.PixmapCache.getIcon("vcsCheckout"),
-            self.tr('&New from repository...'), 0, 0, self,
-            'pysvn_new')
-        self.vcsNewAct.setStatusTip(self.tr(
-            'Create a new project from the VCS repository'
-        ))
-        self.vcsNewAct.setWhatsThis(self.tr(
-            """<b>New from repository</b>"""
-            """<p>This creates a new local project from the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&New from repository..."),
+            0,
+            0,
+            self,
+            "pysvn_new",
+        )
+        self.vcsNewAct.setStatusTip(
+            self.tr("Create a new project from the VCS repository")
+        )
+        self.vcsNewAct.setWhatsThis(
+            self.tr(
+                """<b>New from repository</b>"""
+                """<p>This creates a new local project from the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsNewAct.triggered.connect(self._vcsCheckout)
         self.actions.append(self.vcsNewAct)
-        
+
         self.vcsUpdateAct = EricAction(
-            self.tr('Update from repository'),
+            self.tr("Update from repository"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('&Update from repository'), 0, 0, self,
-            'pysvn_update')
-        self.vcsUpdateAct.setStatusTip(self.tr(
-            'Update the local project from the VCS repository'
-        ))
-        self.vcsUpdateAct.setWhatsThis(self.tr(
-            """<b>Update from repository</b>"""
-            """<p>This updates the local project from the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&Update from repository"),
+            0,
+            0,
+            self,
+            "pysvn_update",
+        )
+        self.vcsUpdateAct.setStatusTip(
+            self.tr("Update the local project from the VCS repository")
+        )
+        self.vcsUpdateAct.setWhatsThis(
+            self.tr(
+                """<b>Update from repository</b>"""
+                """<p>This updates the local project from the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsUpdateAct.triggered.connect(self._vcsUpdate)
         self.actions.append(self.vcsUpdateAct)
-        
+
         self.vcsCommitAct = EricAction(
-            self.tr('Commit changes to repository'),
+            self.tr("Commit changes to repository"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('&Commit changes to repository...'), 0, 0, self,
-            'pysvn_commit')
-        self.vcsCommitAct.setStatusTip(self.tr(
-            'Commit changes to the local project to the VCS repository'
-        ))
-        self.vcsCommitAct.setWhatsThis(self.tr(
-            """<b>Commit changes to repository</b>"""
-            """<p>This commits changes to the local project to the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&Commit changes to repository..."),
+            0,
+            0,
+            self,
+            "pysvn_commit",
+        )
+        self.vcsCommitAct.setStatusTip(
+            self.tr("Commit changes to the local project to the VCS repository")
+        )
+        self.vcsCommitAct.setWhatsThis(
+            self.tr(
+                """<b>Commit changes to repository</b>"""
+                """<p>This commits changes to the local project to the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsCommitAct.triggered.connect(self._vcsCommit)
         self.actions.append(self.vcsCommitAct)
-        
+
         self.svnLogBrowserAct = EricAction(
-            self.tr('Show log browser'),
+            self.tr("Show log browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'),
-            0, 0, self, 'pysvn_log_browser')
-        self.svnLogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the log of the local project'
-        ))
-        self.svnLogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show log browser</b>"""
-            """<p>This shows a dialog to browse the log of the local"""
-            """ project. A limited number of entries is shown first. More"""
-            """ can be retrieved later on.</p>"""
-        ))
+            self.tr("Show log browser"),
+            0,
+            0,
+            self,
+            "pysvn_log_browser",
+        )
+        self.svnLogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the log of the local project")
+        )
+        self.svnLogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show log browser</b>"""
+                """<p>This shows a dialog to browse the log of the local"""
+                """ project. A limited number of entries is shown first. More"""
+                """ can be retrieved later on.</p>"""
+            )
+        )
         self.svnLogBrowserAct.triggered.connect(self._vcsLogBrowser)
         self.actions.append(self.svnLogBrowserAct)
-        
+
         self.vcsDiffAct = EricAction(
-            self.tr('Show differences'),
+            self.tr("Show differences"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show &difference'),
-            0, 0, self, 'pysvn_diff')
-        self.vcsDiffAct.setStatusTip(self.tr(
-            'Show the difference of the local project to the repository'
-        ))
-        self.vcsDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences</b>"""
-            """<p>This shows differences of the local project to the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show &difference"),
+            0,
+            0,
+            self,
+            "pysvn_diff",
+        )
+        self.vcsDiffAct.setStatusTip(
+            self.tr("Show the difference of the local project to the repository")
+        )
+        self.vcsDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences</b>"""
+                """<p>This shows differences of the local project to the"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsDiffAct.triggered.connect(self._vcsDiff)
         self.actions.append(self.vcsDiffAct)
-        
+
         self.svnExtDiffAct = EricAction(
-            self.tr('Show differences (extended)'),
+            self.tr("Show differences (extended)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            0, 0, self, 'pysvn_extendeddiff')
-        self.svnExtDiffAct.setStatusTip(self.tr(
-            'Show the difference of revisions of the project to the repository'
-        ))
-        self.svnExtDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (extended)</b>"""
-            """<p>This shows differences of selectable revisions of"""
-            """ the project.</p>"""
-        ))
+            self.tr("Show differences (extended)"),
+            0,
+            0,
+            self,
+            "pysvn_extendeddiff",
+        )
+        self.svnExtDiffAct.setStatusTip(
+            self.tr("Show the difference of revisions of the project to the repository")
+        )
+        self.svnExtDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (extended)</b>"""
+                """<p>This shows differences of selectable revisions of"""
+                """ the project.</p>"""
+            )
+        )
         self.svnExtDiffAct.triggered.connect(self.__svnExtendedDiff)
         self.actions.append(self.svnExtDiffAct)
-        
+
         self.svnUrlDiffAct = EricAction(
-            self.tr('Show differences (URLs)'),
+            self.tr("Show differences (URLs)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            0, 0, self, 'pysvn_urldiff')
-        self.svnUrlDiffAct.setStatusTip(self.tr(
-            'Show the difference of the project between two repository URLs'
-        ))
-        self.svnUrlDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (URLs)</b>"""
-            """<p>This shows differences of the project between"""
-            """ two repository URLs.</p>"""
-        ))
+            self.tr("Show differences (URLs)"),
+            0,
+            0,
+            self,
+            "pysvn_urldiff",
+        )
+        self.svnUrlDiffAct.setStatusTip(
+            self.tr("Show the difference of the project between two repository URLs")
+        )
+        self.svnUrlDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (URLs)</b>"""
+                """<p>This shows differences of the project between"""
+                """ two repository URLs.</p>"""
+            )
+        )
         self.svnUrlDiffAct.triggered.connect(self.__svnUrlDiff)
         self.actions.append(self.svnUrlDiffAct)
-        
+
         self.vcsStatusAct = EricAction(
-            self.tr('Show status'),
+            self.tr("Show status"),
             UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show &status'),
-            0, 0, self, 'pysvn_status')
-        self.vcsStatusAct.setStatusTip(self.tr(
-            'Show the status of the local project'
-        ))
-        self.vcsStatusAct.setWhatsThis(self.tr(
-            """<b>Show status</b>"""
-            """<p>This shows the status of the local project.</p>"""
-        ))
+            self.tr("Show &status"),
+            0,
+            0,
+            self,
+            "pysvn_status",
+        )
+        self.vcsStatusAct.setStatusTip(self.tr("Show the status of the local project"))
+        self.vcsStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show status</b>"""
+                """<p>This shows the status of the local project.</p>"""
+            )
+        )
         self.vcsStatusAct.triggered.connect(self._vcsStatus)
         self.actions.append(self.vcsStatusAct)
-        
+
         self.svnChangeListsAct = EricAction(
-            self.tr('Show change lists'),
+            self.tr("Show change lists"),
             UI.PixmapCache.getIcon("vcsChangeLists"),
-            self.tr('Show change lists'),
-            0, 0, self, 'pysvn_changelists')
-        self.svnChangeListsAct.setStatusTip(self.tr(
-            'Show the change lists and associated files of the local project'
-        ))
-        self.svnChangeListsAct.setWhatsThis(self.tr(
-            """<b>Show change lists</b>"""
-            """<p>This shows the change lists and associated files of the"""
-            """ local project.</p>"""
-        ))
+            self.tr("Show change lists"),
+            0,
+            0,
+            self,
+            "pysvn_changelists",
+        )
+        self.svnChangeListsAct.setStatusTip(
+            self.tr("Show the change lists and associated files of the local project")
+        )
+        self.svnChangeListsAct.setWhatsThis(
+            self.tr(
+                """<b>Show change lists</b>"""
+                """<p>This shows the change lists and associated files of the"""
+                """ local project.</p>"""
+            )
+        )
         self.svnChangeListsAct.triggered.connect(self.__svnChangeLists)
         self.actions.append(self.svnChangeListsAct)
-        
+
         self.svnRepoInfoAct = EricAction(
-            self.tr('Show repository info'),
+            self.tr("Show repository info"),
             UI.PixmapCache.getIcon("vcsRepo"),
-            self.tr('Show repository info'),
-            0, 0, self, 'pysvn_repoinfo')
-        self.svnRepoInfoAct.setStatusTip(self.tr(
-            'Show some repository related information for the local project'
-        ))
-        self.svnRepoInfoAct.setWhatsThis(self.tr(
-            """<b>Show repository info</b>"""
-            """<p>This shows some repository related information for"""
-            """ the local project.</p>"""
-        ))
+            self.tr("Show repository info"),
+            0,
+            0,
+            self,
+            "pysvn_repoinfo",
+        )
+        self.svnRepoInfoAct.setStatusTip(
+            self.tr("Show some repository related information for the local project")
+        )
+        self.svnRepoInfoAct.setWhatsThis(
+            self.tr(
+                """<b>Show repository info</b>"""
+                """<p>This shows some repository related information for"""
+                """ the local project.</p>"""
+            )
+        )
         self.svnRepoInfoAct.triggered.connect(self.__svnInfo)
         self.actions.append(self.svnRepoInfoAct)
-        
+
         self.vcsTagAct = EricAction(
-            self.tr('Tag in repository'),
+            self.tr("Tag in repository"),
             UI.PixmapCache.getIcon("vcsTag"),
-            self.tr('&Tag in repository...'),
-            0, 0, self, 'pysvn_tag')
-        self.vcsTagAct.setStatusTip(self.tr(
-            'Tag the local project in the repository'
-        ))
-        self.vcsTagAct.setWhatsThis(self.tr(
-            """<b>Tag in repository</b>"""
-            """<p>This tags the local project in the repository.</p>"""
-        ))
+            self.tr("&Tag in repository..."),
+            0,
+            0,
+            self,
+            "pysvn_tag",
+        )
+        self.vcsTagAct.setStatusTip(self.tr("Tag the local project in the repository"))
+        self.vcsTagAct.setWhatsThis(
+            self.tr(
+                """<b>Tag in repository</b>"""
+                """<p>This tags the local project in the repository.</p>"""
+            )
+        )
         self.vcsTagAct.triggered.connect(self._vcsTag)
         self.actions.append(self.vcsTagAct)
-        
+
         self.vcsExportAct = EricAction(
-            self.tr('Export from repository'),
+            self.tr("Export from repository"),
             UI.PixmapCache.getIcon("vcsExport"),
-            self.tr('&Export from repository...'),
-            0, 0, self, 'pysvn_export')
-        self.vcsExportAct.setStatusTip(self.tr(
-            'Export a project from the repository'
-        ))
-        self.vcsExportAct.setWhatsThis(self.tr(
-            """<b>Export from repository</b>"""
-            """<p>This exports a project from the repository.</p>"""
-        ))
+            self.tr("&Export from repository..."),
+            0,
+            0,
+            self,
+            "pysvn_export",
+        )
+        self.vcsExportAct.setStatusTip(self.tr("Export a project from the repository"))
+        self.vcsExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export from repository</b>"""
+                """<p>This exports a project from the repository.</p>"""
+            )
+        )
         self.vcsExportAct.triggered.connect(self._vcsExport)
         self.actions.append(self.vcsExportAct)
-        
+
         self.vcsPropsAct = EricAction(
-            self.tr('Command options'),
-            self.tr('Command &options...'), 0, 0, self,
-            'pysvn_options')
-        self.vcsPropsAct.setStatusTip(self.tr(
-            'Show the VCS command options'))
-        self.vcsPropsAct.setWhatsThis(self.tr(
-            """<b>Command options...</b>"""
-            """<p>This shows a dialog to edit the VCS command options.</p>"""
-        ))
+            self.tr("Command options"),
+            self.tr("Command &options..."),
+            0,
+            0,
+            self,
+            "pysvn_options",
+        )
+        self.vcsPropsAct.setStatusTip(self.tr("Show the VCS command options"))
+        self.vcsPropsAct.setWhatsThis(
+            self.tr(
+                """<b>Command options...</b>"""
+                """<p>This shows a dialog to edit the VCS command options.</p>"""
+            )
+        )
         self.vcsPropsAct.triggered.connect(self._vcsCommandOptions)
         self.actions.append(self.vcsPropsAct)
-        
+
         self.vcsRevertAct = EricAction(
-            self.tr('Revert changes'),
+            self.tr("Revert changes"),
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Re&vert changes'),
-            0, 0, self, 'pysvn_revert')
-        self.vcsRevertAct.setStatusTip(self.tr(
-            'Revert all changes made to the local project'
-        ))
-        self.vcsRevertAct.setWhatsThis(self.tr(
-            """<b>Revert changes</b>"""
-            """<p>This reverts all changes made to the local project.</p>"""
-        ))
+            self.tr("Re&vert changes"),
+            0,
+            0,
+            self,
+            "pysvn_revert",
+        )
+        self.vcsRevertAct.setStatusTip(
+            self.tr("Revert all changes made to the local project")
+        )
+        self.vcsRevertAct.setWhatsThis(
+            self.tr(
+                """<b>Revert changes</b>"""
+                """<p>This reverts all changes made to the local project.</p>"""
+            )
+        )
         self.vcsRevertAct.triggered.connect(self._vcsRevert)
         self.actions.append(self.vcsRevertAct)
-        
+
         self.vcsMergeAct = EricAction(
-            self.tr('Merge'),
+            self.tr("Merge"),
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Mer&ge changes...'),
-            0, 0, self, 'pysvn_merge')
-        self.vcsMergeAct.setStatusTip(self.tr(
-            'Merge changes of a tag/revision into the local project'
-        ))
-        self.vcsMergeAct.setWhatsThis(self.tr(
-            """<b>Merge</b>"""
-            """<p>This merges changes of a tag/revision into the local"""
-            """ project.</p>"""
-        ))
+            self.tr("Mer&ge changes..."),
+            0,
+            0,
+            self,
+            "pysvn_merge",
+        )
+        self.vcsMergeAct.setStatusTip(
+            self.tr("Merge changes of a tag/revision into the local project")
+        )
+        self.vcsMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Merge</b>"""
+                """<p>This merges changes of a tag/revision into the local"""
+                """ project.</p>"""
+            )
+        )
         self.vcsMergeAct.triggered.connect(self._vcsMerge)
         self.actions.append(self.vcsMergeAct)
-        
+
         self.vcsSwitchAct = EricAction(
-            self.tr('Switch'),
+            self.tr("Switch"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('S&witch...'),
-            0, 0, self, 'pysvn_switch')
-        self.vcsSwitchAct.setStatusTip(self.tr(
-            'Switch the local copy to another tag/branch'
-        ))
-        self.vcsSwitchAct.setWhatsThis(self.tr(
-            """<b>Switch</b>"""
-            """<p>This switches the local copy to another tag/branch.</p>"""
-        ))
+            self.tr("S&witch..."),
+            0,
+            0,
+            self,
+            "pysvn_switch",
+        )
+        self.vcsSwitchAct.setStatusTip(
+            self.tr("Switch the local copy to another tag/branch")
+        )
+        self.vcsSwitchAct.setWhatsThis(
+            self.tr(
+                """<b>Switch</b>"""
+                """<p>This switches the local copy to another tag/branch.</p>"""
+            )
+        )
         self.vcsSwitchAct.triggered.connect(self._vcsSwitch)
         self.actions.append(self.vcsSwitchAct)
-        
+
         self.vcsResolveAct = EricAction(
-            self.tr('Conflicts resolved'),
-            self.tr('Con&flicts resolved'),
-            0, 0, self, 'pysvn_resolve')
-        self.vcsResolveAct.setStatusTip(self.tr(
-            'Mark all conflicts of the local project as resolved'
-        ))
-        self.vcsResolveAct.setWhatsThis(self.tr(
-            """<b>Conflicts resolved</b>"""
-            """<p>This marks all conflicts of the local project as"""
-            """ resolved.</p>"""
-        ))
+            self.tr("Conflicts resolved"),
+            self.tr("Con&flicts resolved"),
+            0,
+            0,
+            self,
+            "pysvn_resolve",
+        )
+        self.vcsResolveAct.setStatusTip(
+            self.tr("Mark all conflicts of the local project as resolved")
+        )
+        self.vcsResolveAct.setWhatsThis(
+            self.tr(
+                """<b>Conflicts resolved</b>"""
+                """<p>This marks all conflicts of the local project as"""
+                """ resolved.</p>"""
+            )
+        )
         self.vcsResolveAct.triggered.connect(self.__svnResolve)
         self.actions.append(self.vcsResolveAct)
-        
+
         self.vcsCleanupAct = EricAction(
-            self.tr('Cleanup'),
-            self.tr('Cleanu&p'),
-            0, 0, self, 'pysvn_cleanup')
-        self.vcsCleanupAct.setStatusTip(self.tr(
-            'Cleanup the local project'
-        ))
-        self.vcsCleanupAct.setWhatsThis(self.tr(
-            """<b>Cleanup</b>"""
-            """<p>This performs a cleanup of the local project.</p>"""
-        ))
+            self.tr("Cleanup"), self.tr("Cleanu&p"), 0, 0, self, "pysvn_cleanup"
+        )
+        self.vcsCleanupAct.setStatusTip(self.tr("Cleanup the local project"))
+        self.vcsCleanupAct.setWhatsThis(
+            self.tr(
+                """<b>Cleanup</b>"""
+                """<p>This performs a cleanup of the local project.</p>"""
+            )
+        )
         self.vcsCleanupAct.triggered.connect(self._vcsCleanup)
         self.actions.append(self.vcsCleanupAct)
-        
+
         self.vcsCommandAct = EricAction(
-            self.tr('Execute command'),
-            self.tr('E&xecute command...'),
-            0, 0, self, 'pysvn_command')
-        self.vcsCommandAct.setStatusTip(self.tr(
-            'Execute an arbitrary VCS command'
-        ))
-        self.vcsCommandAct.setWhatsThis(self.tr(
-            """<b>Execute command</b>"""
-            """<p>This opens a dialog to enter an arbitrary VCS command.</p>"""
-        ))
+            self.tr("Execute command"),
+            self.tr("E&xecute command..."),
+            0,
+            0,
+            self,
+            "pysvn_command",
+        )
+        self.vcsCommandAct.setStatusTip(self.tr("Execute an arbitrary VCS command"))
+        self.vcsCommandAct.setWhatsThis(
+            self.tr(
+                """<b>Execute command</b>"""
+                """<p>This opens a dialog to enter an arbitrary VCS command.</p>"""
+            )
+        )
         self.vcsCommandAct.triggered.connect(self._vcsCommand)
         self.actions.append(self.vcsCommandAct)
-        
+
         self.svnTagListAct = EricAction(
-            self.tr('List tags'),
-            self.tr('List tags...'),
-            0, 0, self, 'pysvn_list_tags')
-        self.svnTagListAct.setStatusTip(self.tr(
-            'List tags of the project'
-        ))
-        self.svnTagListAct.setWhatsThis(self.tr(
-            """<b>List tags</b>"""
-            """<p>This lists the tags of the project.</p>"""
-        ))
+            self.tr("List tags"), self.tr("List tags..."), 0, 0, self, "pysvn_list_tags"
+        )
+        self.svnTagListAct.setStatusTip(self.tr("List tags of the project"))
+        self.svnTagListAct.setWhatsThis(
+            self.tr(
+                """<b>List tags</b>""" """<p>This lists the tags of the project.</p>"""
+            )
+        )
         self.svnTagListAct.triggered.connect(self.__svnTagList)
         self.actions.append(self.svnTagListAct)
-        
+
         self.svnBranchListAct = EricAction(
-            self.tr('List branches'),
-            self.tr('List branches...'),
-            0, 0, self, 'pysvn_list_branches')
-        self.svnBranchListAct.setStatusTip(self.tr(
-            'List branches of the project'
-        ))
-        self.svnBranchListAct.setWhatsThis(self.tr(
-            """<b>List branches</b>"""
-            """<p>This lists the branches of the project.</p>"""
-        ))
+            self.tr("List branches"),
+            self.tr("List branches..."),
+            0,
+            0,
+            self,
+            "pysvn_list_branches",
+        )
+        self.svnBranchListAct.setStatusTip(self.tr("List branches of the project"))
+        self.svnBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List branches</b>"""
+                """<p>This lists the branches of the project.</p>"""
+            )
+        )
         self.svnBranchListAct.triggered.connect(self.__svnBranchList)
         self.actions.append(self.svnBranchListAct)
-        
+
         self.svnListAct = EricAction(
-            self.tr('List repository contents'),
-            self.tr('List repository contents...'),
-            0, 0, self, 'pysvn_contents')
-        self.svnListAct.setStatusTip(self.tr(
-            'Lists the contents of the repository'
-        ))
-        self.svnListAct.setWhatsThis(self.tr(
-            """<b>List repository contents</b>"""
-            """<p>This lists the contents of the repository.</p>"""
-        ))
+            self.tr("List repository contents"),
+            self.tr("List repository contents..."),
+            0,
+            0,
+            self,
+            "pysvn_contents",
+        )
+        self.svnListAct.setStatusTip(self.tr("Lists the contents of the repository"))
+        self.svnListAct.setWhatsThis(
+            self.tr(
+                """<b>List repository contents</b>"""
+                """<p>This lists the contents of the repository.</p>"""
+            )
+        )
         self.svnListAct.triggered.connect(self.__svnTagList)
         self.actions.append(self.svnListAct)
-        
+
         self.svnPropSetAct = EricAction(
-            self.tr('Set Property'),
-            self.tr('Set Property...'),
-            0, 0, self, 'pysvn_property_set')
-        self.svnPropSetAct.setStatusTip(self.tr(
-            'Set a property for the project files'
-        ))
-        self.svnPropSetAct.setWhatsThis(self.tr(
-            """<b>Set Property</b>"""
-            """<p>This sets a property for the project files.</p>"""
-        ))
+            self.tr("Set Property"),
+            self.tr("Set Property..."),
+            0,
+            0,
+            self,
+            "pysvn_property_set",
+        )
+        self.svnPropSetAct.setStatusTip(self.tr("Set a property for the project files"))
+        self.svnPropSetAct.setWhatsThis(
+            self.tr(
+                """<b>Set Property</b>"""
+                """<p>This sets a property for the project files.</p>"""
+            )
+        )
         self.svnPropSetAct.triggered.connect(self.__svnPropSet)
         self.actions.append(self.svnPropSetAct)
-        
+
         self.svnPropListAct = EricAction(
-            self.tr('List Properties'),
-            self.tr('List Properties...'),
-            0, 0, self, 'pysvn_property_list')
-        self.svnPropListAct.setStatusTip(self.tr(
-            'List properties of the project files'
-        ))
-        self.svnPropListAct.setWhatsThis(self.tr(
-            """<b>List Properties</b>"""
-            """<p>This lists the properties of the project files.</p>"""
-        ))
+            self.tr("List Properties"),
+            self.tr("List Properties..."),
+            0,
+            0,
+            self,
+            "pysvn_property_list",
+        )
+        self.svnPropListAct.setStatusTip(
+            self.tr("List properties of the project files")
+        )
+        self.svnPropListAct.setWhatsThis(
+            self.tr(
+                """<b>List Properties</b>"""
+                """<p>This lists the properties of the project files.</p>"""
+            )
+        )
         self.svnPropListAct.triggered.connect(self.__svnPropList)
         self.actions.append(self.svnPropListAct)
-        
+
         self.svnPropDelAct = EricAction(
-            self.tr('Delete Property'),
-            self.tr('Delete Property...'),
-            0, 0, self, 'pysvn_property_delete')
-        self.svnPropDelAct.setStatusTip(self.tr(
-            'Delete a property for the project files'
-        ))
-        self.svnPropDelAct.setWhatsThis(self.tr(
-            """<b>Delete Property</b>"""
-            """<p>This deletes a property for the project files.</p>"""
-        ))
+            self.tr("Delete Property"),
+            self.tr("Delete Property..."),
+            0,
+            0,
+            self,
+            "pysvn_property_delete",
+        )
+        self.svnPropDelAct.setStatusTip(
+            self.tr("Delete a property for the project files")
+        )
+        self.svnPropDelAct.setWhatsThis(
+            self.tr(
+                """<b>Delete Property</b>"""
+                """<p>This deletes a property for the project files.</p>"""
+            )
+        )
         self.svnPropDelAct.triggered.connect(self.__svnPropDel)
         self.actions.append(self.svnPropDelAct)
-        
+
         self.svnRelocateAct = EricAction(
-            self.tr('Relocate'),
+            self.tr("Relocate"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('Relocate...'),
-            0, 0, self, 'pysvn_relocate')
-        self.svnRelocateAct.setStatusTip(self.tr(
-            'Relocate the working copy to a new repository URL'
-        ))
-        self.svnRelocateAct.setWhatsThis(self.tr(
-            """<b>Relocate</b>"""
-            """<p>This relocates the working copy to a new repository"""
-            """ URL.</p>"""
-        ))
+            self.tr("Relocate..."),
+            0,
+            0,
+            self,
+            "pysvn_relocate",
+        )
+        self.svnRelocateAct.setStatusTip(
+            self.tr("Relocate the working copy to a new repository URL")
+        )
+        self.svnRelocateAct.setWhatsThis(
+            self.tr(
+                """<b>Relocate</b>"""
+                """<p>This relocates the working copy to a new repository"""
+                """ URL.</p>"""
+            )
+        )
         self.svnRelocateAct.triggered.connect(self.__svnRelocate)
         self.actions.append(self.svnRelocateAct)
-        
+
         self.svnRepoBrowserAct = EricAction(
-            self.tr('Repository Browser'),
+            self.tr("Repository Browser"),
             UI.PixmapCache.getIcon("vcsRepoBrowser"),
-            self.tr('Repository Browser...'),
-            0, 0, self, 'pysvn_repo_browser')
-        self.svnRepoBrowserAct.setStatusTip(self.tr(
-            'Show the Repository Browser dialog'
-        ))
-        self.svnRepoBrowserAct.setWhatsThis(self.tr(
-            """<b>Repository Browser</b>"""
-            """<p>This shows the Repository Browser dialog.</p>"""
-        ))
+            self.tr("Repository Browser..."),
+            0,
+            0,
+            self,
+            "pysvn_repo_browser",
+        )
+        self.svnRepoBrowserAct.setStatusTip(
+            self.tr("Show the Repository Browser dialog")
+        )
+        self.svnRepoBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Repository Browser</b>"""
+                """<p>This shows the Repository Browser dialog.</p>"""
+            )
+        )
         self.svnRepoBrowserAct.triggered.connect(self.__svnRepoBrowser)
         self.actions.append(self.svnRepoBrowserAct)
-        
+
         self.svnConfigAct = EricAction(
-            self.tr('Configure'),
-            self.tr('Configure...'),
-            0, 0, self, 'pysvn_configure')
-        self.svnConfigAct.setStatusTip(self.tr(
-            'Show the configuration dialog with the Subversion page selected'
-        ))
-        self.svnConfigAct.setWhatsThis(self.tr(
-            """<b>Configure</b>"""
-            """<p>Show the configuration dialog with the Subversion page"""
-            """ selected.</p>"""
-        ))
+            self.tr("Configure"), self.tr("Configure..."), 0, 0, self, "pysvn_configure"
+        )
+        self.svnConfigAct.setStatusTip(
+            self.tr("Show the configuration dialog with the Subversion page selected")
+        )
+        self.svnConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure</b>"""
+                """<p>Show the configuration dialog with the Subversion page"""
+                """ selected.</p>"""
+            )
+        )
         self.svnConfigAct.triggered.connect(self.__svnConfigure)
         self.actions.append(self.svnConfigAct)
-        
+
         self.svnUpgradeAct = EricAction(
-            self.tr('Upgrade'),
-            self.tr('Upgrade...'),
-            0, 0, self, 'pysvn_upgrade')
-        self.svnUpgradeAct.setStatusTip(self.tr(
-            'Upgrade the working copy to the current format'
-        ))
-        self.svnUpgradeAct.setWhatsThis(self.tr(
-            """<b>Upgrade</b>"""
-            """<p>Upgrades the working copy to the current format.</p>"""
-        ))
+            self.tr("Upgrade"), self.tr("Upgrade..."), 0, 0, self, "pysvn_upgrade"
+        )
+        self.svnUpgradeAct.setStatusTip(
+            self.tr("Upgrade the working copy to the current format")
+        )
+        self.svnUpgradeAct.setWhatsThis(
+            self.tr(
+                """<b>Upgrade</b>"""
+                """<p>Upgrades the working copy to the current format.</p>"""
+            )
+        )
         self.svnUpgradeAct.triggered.connect(self.__svnUpgrade)
         self.actions.append(self.svnUpgradeAct)
-    
+
     def initMenu(self, menu):
         """
         Public method to generate the VCS menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")),
-            self.vcs.vcsName(), self._vcsInfoDisplay)
+                os.path.join("VcsPlugins", "vcsPySvn", "icons", "pysvn.svg")
+            ),
+            self.vcs.vcsName(),
+            self._vcsInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         menu.addAction(self.vcsUpdateAct)
         menu.addAction(self.vcsCommitAct)
         menu.addSeparator()
@@ -542,11 +680,11 @@
         menu.addSeparator()
         menu.addAction(self.vcsNewAct)
         menu.addAction(self.vcsExportAct)
-    
+
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
@@ -554,8 +692,8 @@
         self.__toolbar = QToolBar(self.tr("Subversion (pysvn)"), ui)
         self.__toolbar.setIconSize(UI.Config.ToolBarIconSize)
         self.__toolbar.setObjectName("PySvnToolbar")
-        self.__toolbar.setToolTip(self.tr('Subversion (pysvn)'))
-        
+        self.__toolbar.setToolTip(self.tr("Subversion (pysvn)"))
+
         self.__toolbar.addAction(self.svnLogBrowserAct)
         self.__toolbar.addAction(self.vcsStatusAct)
         self.__toolbar.addSeparator()
@@ -565,7 +703,7 @@
         self.__toolbar.addAction(self.vcsNewAct)
         self.__toolbar.addAction(self.vcsExportAct)
         self.__toolbar.addSeparator()
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.addToolBar(self.__toolbar, title)
         toolbarManager.addAction(self.vcsUpdateAct, title)
@@ -579,113 +717,111 @@
         toolbarManager.addAction(self.vcsMergeAct, title)
         toolbarManager.addAction(self.vcsSwitchAct, title)
         toolbarManager.addAction(self.svnRelocateAct, title)
-        
+
         self.__toolbar.setEnabled(False)
         self.__toolbar.setVisible(False)
-        
-        ui.registerToolbar("pysvn", self.__toolbar.windowTitle(),
-                           self.__toolbar, "vcs")
+
+        ui.registerToolbar("pysvn", self.__toolbar.windowTitle(), self.__toolbar, "vcs")
         ui.addToolBar(self.__toolbar)
-    
+
     def removeToolbar(self, ui, toolbarManager):
         """
         Public method to remove a toolbar created by initToolbar().
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         ui.removeToolBar(self.__toolbar)
         ui.unregisterToolbar("pysvn")
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.removeCategoryActions(title)
         toolbarManager.removeToolBar(self.__toolbar)
-        
+
         self.__toolbar.deleteLater()
         self.__toolbar = None
-    
+
     def __svnResolve(self):
         """
         Private slot used to resolve conflicts of the local project.
         """
         self.vcs.vcsResolved(self.project.ppath)
-        
+
     def __svnPropList(self):
         """
         Private slot used to list the properties of the project files.
         """
         self.vcs.svnListProps(self.project.ppath, True)
-        
+
     def __svnPropSet(self):
         """
         Private slot used to set a property for the project files.
         """
         self.vcs.svnSetProp(self.project.ppath, True)
-        
+
     def __svnPropDel(self):
         """
         Private slot used to delete a property for the project files.
         """
         self.vcs.svnDelProp(self.project.ppath, True)
-        
+
     def __svnTagList(self):
         """
         Private slot used to list the tags of the project.
         """
         self.vcs.svnListTagBranch(self.project.ppath, True)
-        
+
     def __svnBranchList(self):
         """
         Private slot used to list the branches of the project.
         """
         self.vcs.svnListTagBranch(self.project.ppath, False)
-        
+
     def __svnExtendedDiff(self):
         """
         Private slot used to perform a svn diff with the selection of
         revisions.
         """
         self.vcs.svnExtendedDiff(self.project.ppath)
-        
+
     def __svnUrlDiff(self):
         """
         Private slot used to perform a svn diff with the selection of
         repository URLs.
         """
         self.vcs.svnUrlDiff(self.project.ppath)
-        
+
     def __svnInfo(self):
         """
         Private slot used to show repository information for the local project.
         """
         self.vcs.svnInfo(self.project.ppath, ".")
-        
+
     def __svnRelocate(self):
         """
         Private slot used to relocate the working copy to a new repository URL.
         """
         self.vcs.svnRelocate(self.project.ppath)
-        
+
     def __svnRepoBrowser(self):
         """
         Private slot to open the repository browser.
         """
         self.vcs.svnRepoBrowser(projectPath=self.project.ppath)
-        
+
     def __svnConfigure(self):
         """
         Private slot to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_subversionPage")
-    
+        ericApp().getObject("UserInterface").showPreferences("zzz_subversionPage")
+
     def __svnChangeLists(self):
         """
         Private slot used to show a list of change lists.
         """
         self.vcs.svnShowChangelists(self.project.ppath)
-    
+
     def __svnUpgrade(self):
         """
         Private slot used to upgrade the working copy format.
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,7 @@
 import pysvn
 
 from PyQt6.QtCore import Qt
-from PyQt6.QtWidgets import (
-    QHeaderView, QDialog, QDialogButtonBox, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QHeaderView, QDialog, QDialogButtonBox, QTreeWidgetItem
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
 
@@ -28,10 +26,11 @@
     """
     Class implementing a dialog to show the output of the svn blame command.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
@@ -39,37 +38,35 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.blameList.headerItem().setText(self.blameList.columnCount(), "")
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.blameList.setFont(font)
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
     def start(self, fn):
         """
         Public slot to start the svn blame command.
-        
+
         @param fn filename to show the blame for (string)
         """
         self.blameList.clear()
         self.errorGroup.hide()
         self.activateWindow()
-        
+
         dname, fname = self.vcs.splitPath(fn)
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
         try:
@@ -79,55 +76,50 @@
                 author = annotation["author"]
                 line = annotation["line"]
                 self.__generateItem(
-                    annotation["revision"].number, author,
-                    annotation["number"] + 1, line)
+                    annotation["revision"].number,
+                    author,
+                    annotation["number"] + 1,
+                    line,
+                )
         except pysvn.ClientError as e:
-            self.__showError(e.args[0] + '\n')
+            self.__showError(e.args[0] + "\n")
         self.__finish()
         os.chdir(cwd)
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.__resizeColumns()
-        
+
         self._cancel()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.blameList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-        
+        self.blameList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
+
     def __generateItem(self, revision, author, lineno, text):
         """
         Private method to generate a blame item in the blame list.
-        
+
         @param revision revision string (string)
         @param author author of the change (string)
         @param lineno linenumber (string)
@@ -135,14 +127,15 @@
         """
         itm = QTreeWidgetItem(
             self.blameList,
-            ["{0:d}".format(revision), author, "{0:d}".format(lineno), text])
+            ["{0:d}".format(revision), author, "{0:d}".format(lineno), text],
+        )
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignRight)
-        
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,10 +27,11 @@
     """
     Class implementing a dialog to browse the change lists.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
@@ -38,26 +39,24 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-    
+
     @pyqtSlot(QListWidgetItem, QListWidgetItem)
     def on_changeLists_currentItemChanged(self, current, previous):
         """
         Private slot to handle the selection of a new item.
-        
+
         @param current current item (QListWidgetItem)
         @param previous previous current item (QListWidgetItem)
         """
@@ -65,26 +64,25 @@
         if current is not None:
             changelist = current.text()
             if changelist in self.changeListsDict:
-                self.filesList.addItems(
-                    sorted(self.changeListsDict[changelist]))
-    
+                self.filesList.addItems(sorted(self.changeListsDict[changelist]))
+
     def start(self, path):
         """
         Public slot to populate the data.
-        
+
         @param path directory name to show change lists for (string)
         """
         self.changeListsDict = {}
         self.cancelled = False
-        
-        self.filesLabel.setText(
-            self.tr("Files (relative to {0}):").format(path))
-        
+
+        self.filesLabel.setText(self.tr("Files (relative to {0}):").format(path))
+
         with EricOverrideCursor():
             try:
                 with EricMutexLocker(self.vcs.vcsExecutionMutex):
                     entries = self.client.get_changelist(
-                        path, depth=pysvn.depth.infinity)
+                        path, depth=pysvn.depth.infinity
+                    )
                 for entry in entries:
                     file = entry[0]
                     changelist = entry[1]
@@ -96,41 +94,34 @@
             except pysvn.ClientError as e:
                 self.__showError(e.args[0])
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the user pressed the button.
         """
         self.changeLists.addItems(sorted(self.changeListsDict.keys()))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         if len(self.changeListsDict) == 0:
             self.changeLists.addItem(self.tr("No changelists found"))
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setFocus(
-                    Qt.FocusReason.OtherFocusReason)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+                Qt.FocusReason.OtherFocusReason
+            )
         else:
             self.changeLists.setCurrentRow(0)
             self.changeLists.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommandDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommandDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,15 +19,16 @@
 class SvnCommandDialog(QDialog, Ui_SvnCommandDialog):
     """
     Class implementing the Subversion command dialog.
-    
+
     It implements a dialog that is used to enter an
     arbitrary subversion command. It asks the user to enter
     the commandline parameters and the working directory.
     """
+
     def __init__(self, argvList, wdList, ppath, parent=None):
         """
         Constructor
-        
+
         @param argvList history list of commandline arguments (list of strings)
         @param wdList history list of working directories (list of strings)
         @param ppath pathname of the project directory (string)
@@ -35,13 +36,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.workdirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.commandCombo.clear()
         self.commandCombo.addItems(argvList)
         if len(argvList) > 0:
@@ -51,29 +51,28 @@
         if len(wdList) > 0:
             self.workdirPicker.setCurrentIndex(0)
         self.projectDirLabel.setText(ppath)
-        
+
         # modify some what's this help texts
         t = self.commandCombo.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.commandCombo.setWhatsThis(t)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_commandCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text ignored
         """
         self.okButton.setDisabled(self.commandCombo.currentText() == "")
-    
+
     def getData(self):
         """
         Public method to retrieve the data entered into this dialog.
-        
+
         @return a tuple of argv, workdir
         """
-        return (self.commandCombo.currentText(),
-                self.workdirPicker.currentText())
+        return (self.commandCombo.currentText(), self.workdirPicker.currentText())
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,116 +20,117 @@
 class SvnCommitDialog(QWidget, Ui_SvnCommitDialog):
     """
     Class implementing a dialog to enter the commit message.
-    
+
     @signal accepted() emitted, if the dialog was accepted
     @signal rejected() emitted, if the dialog was rejected
     """
+
     accepted = pyqtSignal()
     rejected = pyqtSignal()
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent, Qt.WindowType.Window)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
         self.logEdit.setLanguageWithPWL(language, pwl or None, pel or None)
-        
+
         if pysvn.svn_version < (1, 5, 0) or pysvn.version < (1, 6, 0):
             self.changeListsGroup.hide()
         else:
             self.changeLists.addItems(sorted(vcs.svnGetChangelists()))
-        
+
     def showEvent(self, evt):
         """
         Protected method called when the dialog is about to be shown.
-        
+
         @param evt the event (QShowEvent)
         """
         commitMessages = self.__vcs.vcsCommitMessages()
         self.recentComboBox.clear()
         self.recentComboBox.addItem("")
         self.recentComboBox.addItems(commitMessages)
-        
+
         self.logEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
     def logMessage(self):
         """
         Public method to retrieve the log message.
-        
+
         This method has the side effect of saving the 20 most recent
         commit messages for reuse.
-        
+
         @return the log message (string)
         """
         msg = self.logEdit.toPlainText()
         if msg:
             self.__vcs.vcsAddCommitMessage(msg)
         return msg
-        
+
     def hasChangelists(self):
         """
         Public method to check, if the user entered some changelists.
-        
+
         @return flag indicating availability of changelists (boolean)
         """
         return len(self.changeLists.selectedItems()) > 0
-        
+
     def changelistsData(self):
         """
         Public method to retrieve the changelists data.
-        
+
         @return tuple containing the changelists (list of strings) and a flag
             indicating to keep changelists (boolean)
         """
-        slists = [line.text().strip()
-                  for line in self.changeLists.selectedItems()
-                  if line.text().strip() != ""]
-        
+        slists = [
+            line.text().strip()
+            for line in self.changeLists.selectedItems()
+            if line.text().strip() != ""
+        ]
+
         if len(slists) == 0:
             return [], False
-        
+
         return slists, self.keepChangeListsCheckBox.isChecked()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.logEdit.clear()
-        
+
     def on_buttonBox_accepted(self):
         """
         Private slot called by the buttonBox accepted signal.
         """
         self.close()
         self.accepted.emit()
-        
+
     def on_buttonBox_rejected(self):
         """
         Private slot called by the buttonBox rejected signal.
         """
         self.close()
         self.rejected.emit()
-    
+
     @pyqtSlot(int)
     def on_recentComboBox_activated(self, index):
         """
         Private slot to select a commit message from recent ones.
-        
+
         @param index index of the selected entry
         @type int
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnConst.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnConst.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,97 +12,69 @@
 import pysvn
 
 svnNotifyActionMap = {
-    pysvn.wc_notify_action.add:
-    QT_TRANSLATE_NOOP('Subversion', 'Add'),
-    pysvn.wc_notify_action.commit_added:
-    QT_TRANSLATE_NOOP('Subversion', 'Add'),
-    pysvn.wc_notify_action.commit_deleted:
-    QT_TRANSLATE_NOOP('Subversion', 'Delete'),
-    pysvn.wc_notify_action.commit_modified:
-    QT_TRANSLATE_NOOP('Subversion', 'Modify'),
+    pysvn.wc_notify_action.add: QT_TRANSLATE_NOOP("Subversion", "Add"),
+    pysvn.wc_notify_action.commit_added: QT_TRANSLATE_NOOP("Subversion", "Add"),
+    pysvn.wc_notify_action.commit_deleted: QT_TRANSLATE_NOOP("Subversion", "Delete"),
+    pysvn.wc_notify_action.commit_modified: QT_TRANSLATE_NOOP("Subversion", "Modify"),
     pysvn.wc_notify_action.commit_postfix_txdelta: None,
-    pysvn.wc_notify_action.commit_replaced:
-    QT_TRANSLATE_NOOP('Subversion', 'Replace'),
-    pysvn.wc_notify_action.copy:
-    QT_TRANSLATE_NOOP('Subversion', 'Copy'),
-    pysvn.wc_notify_action.delete:
-    QT_TRANSLATE_NOOP('Subversion', 'Delete'),
-    pysvn.wc_notify_action.failed_revert:
-    QT_TRANSLATE_NOOP('Subversion', 'Failed revert'),
-    pysvn.wc_notify_action.resolved:
-    QT_TRANSLATE_NOOP('Subversion', 'Resolve'),
-    pysvn.wc_notify_action.restore:
-    QT_TRANSLATE_NOOP('Subversion', 'Restore'),
-    pysvn.wc_notify_action.revert:
-    QT_TRANSLATE_NOOP('Subversion', 'Revert'),
-    pysvn.wc_notify_action.skip:
-    QT_TRANSLATE_NOOP('Subversion', 'Skip'),
+    pysvn.wc_notify_action.commit_replaced: QT_TRANSLATE_NOOP("Subversion", "Replace"),
+    pysvn.wc_notify_action.copy: QT_TRANSLATE_NOOP("Subversion", "Copy"),
+    pysvn.wc_notify_action.delete: QT_TRANSLATE_NOOP("Subversion", "Delete"),
+    pysvn.wc_notify_action.failed_revert: QT_TRANSLATE_NOOP(
+        "Subversion", "Failed revert"
+    ),
+    pysvn.wc_notify_action.resolved: QT_TRANSLATE_NOOP("Subversion", "Resolve"),
+    pysvn.wc_notify_action.restore: QT_TRANSLATE_NOOP("Subversion", "Restore"),
+    pysvn.wc_notify_action.revert: QT_TRANSLATE_NOOP("Subversion", "Revert"),
+    pysvn.wc_notify_action.skip: QT_TRANSLATE_NOOP("Subversion", "Skip"),
     pysvn.wc_notify_action.status_completed: None,
-    pysvn.wc_notify_action.status_external:
-    QT_TRANSLATE_NOOP('Subversion', 'External'),
-    pysvn.wc_notify_action.update_add:
-    QT_TRANSLATE_NOOP('Subversion', 'Add'),
+    pysvn.wc_notify_action.status_external: QT_TRANSLATE_NOOP("Subversion", "External"),
+    pysvn.wc_notify_action.update_add: QT_TRANSLATE_NOOP("Subversion", "Add"),
     pysvn.wc_notify_action.update_completed: None,
-    pysvn.wc_notify_action.update_delete:
-    QT_TRANSLATE_NOOP('Subversion', 'Delete'),
-    pysvn.wc_notify_action.update_external:
-    QT_TRANSLATE_NOOP('Subversion', 'External'),
-    pysvn.wc_notify_action.update_update:
-    QT_TRANSLATE_NOOP('Subversion', 'Update'),
-    pysvn.wc_notify_action.annotate_revision:
-    QT_TRANSLATE_NOOP('Subversion', 'Annotate'),
+    pysvn.wc_notify_action.update_delete: QT_TRANSLATE_NOOP("Subversion", "Delete"),
+    pysvn.wc_notify_action.update_external: QT_TRANSLATE_NOOP("Subversion", "External"),
+    pysvn.wc_notify_action.update_update: QT_TRANSLATE_NOOP("Subversion", "Update"),
+    pysvn.wc_notify_action.annotate_revision: QT_TRANSLATE_NOOP(
+        "Subversion", "Annotate"
+    ),
 }
-if hasattr(pysvn.wc_notify_action, 'locked'):
-    svnNotifyActionMap[pysvn.wc_notify_action.locked] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Locking')
+if hasattr(pysvn.wc_notify_action, "locked"):
+    svnNotifyActionMap[pysvn.wc_notify_action.locked] = QT_TRANSLATE_NOOP(
+        "Subversion", "Locking"
     )
-    svnNotifyActionMap[pysvn.wc_notify_action.unlocked] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Unlocking')
+    svnNotifyActionMap[pysvn.wc_notify_action.unlocked] = QT_TRANSLATE_NOOP(
+        "Subversion", "Unlocking"
     )
-    svnNotifyActionMap[pysvn.wc_notify_action.failed_lock] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Failed lock')
+    svnNotifyActionMap[pysvn.wc_notify_action.failed_lock] = QT_TRANSLATE_NOOP(
+        "Subversion", "Failed lock"
     )
-    svnNotifyActionMap[pysvn.wc_notify_action.failed_unlock] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Failed unlock')
+    svnNotifyActionMap[pysvn.wc_notify_action.failed_unlock] = QT_TRANSLATE_NOOP(
+        "Subversion", "Failed unlock"
     )
-if hasattr(pysvn.wc_notify_action, 'changelist_clear'):
-    svnNotifyActionMap[pysvn.wc_notify_action.changelist_clear] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Changelist clear')
+if hasattr(pysvn.wc_notify_action, "changelist_clear"):
+    svnNotifyActionMap[pysvn.wc_notify_action.changelist_clear] = QT_TRANSLATE_NOOP(
+        "Subversion", "Changelist clear"
     )
-    svnNotifyActionMap[pysvn.wc_notify_action.changelist_set] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Changelist set')
+    svnNotifyActionMap[pysvn.wc_notify_action.changelist_set] = QT_TRANSLATE_NOOP(
+        "Subversion", "Changelist set"
     )
-    svnNotifyActionMap[pysvn.wc_notify_action.changelist_moved] = (
-        QT_TRANSLATE_NOOP('Subversion', 'Changelist moved')
+    svnNotifyActionMap[pysvn.wc_notify_action.changelist_moved] = QT_TRANSLATE_NOOP(
+        "Subversion", "Changelist moved"
     )
 
 svnStatusMap = {
-    pysvn.wc_status_kind.added:
-    QT_TRANSLATE_NOOP('Subversion', 'added'),
-    pysvn.wc_status_kind.conflicted:
-    QT_TRANSLATE_NOOP('Subversion', 'conflict'),
-    pysvn.wc_status_kind.deleted:
-    QT_TRANSLATE_NOOP('Subversion', 'deleted'),
-    pysvn.wc_status_kind.external:
-    QT_TRANSLATE_NOOP('Subversion', 'external'),
-    pysvn.wc_status_kind.ignored:
-    QT_TRANSLATE_NOOP('Subversion', 'ignored'),
-    pysvn.wc_status_kind.incomplete:
-    QT_TRANSLATE_NOOP('Subversion', 'incomplete'),
-    pysvn.wc_status_kind.missing:
-    QT_TRANSLATE_NOOP('Subversion', 'missing'),
-    pysvn.wc_status_kind.merged:
-    QT_TRANSLATE_NOOP('Subversion', 'merged'),
-    pysvn.wc_status_kind.modified:
-    QT_TRANSLATE_NOOP('Subversion', 'modified'),
-    pysvn.wc_status_kind.none:
-    QT_TRANSLATE_NOOP('Subversion', 'normal'),
-    pysvn.wc_status_kind.normal:
-    QT_TRANSLATE_NOOP('Subversion', 'normal'),
-    pysvn.wc_status_kind.obstructed:
-    QT_TRANSLATE_NOOP('Subversion', 'type error'),
-    pysvn.wc_status_kind.replaced:
-    QT_TRANSLATE_NOOP('Subversion', 'replaced'),
-    pysvn.wc_status_kind.unversioned:
-    QT_TRANSLATE_NOOP('Subversion', 'unversioned'),
+    pysvn.wc_status_kind.added: QT_TRANSLATE_NOOP("Subversion", "added"),
+    pysvn.wc_status_kind.conflicted: QT_TRANSLATE_NOOP("Subversion", "conflict"),
+    pysvn.wc_status_kind.deleted: QT_TRANSLATE_NOOP("Subversion", "deleted"),
+    pysvn.wc_status_kind.external: QT_TRANSLATE_NOOP("Subversion", "external"),
+    pysvn.wc_status_kind.ignored: QT_TRANSLATE_NOOP("Subversion", "ignored"),
+    pysvn.wc_status_kind.incomplete: QT_TRANSLATE_NOOP("Subversion", "incomplete"),
+    pysvn.wc_status_kind.missing: QT_TRANSLATE_NOOP("Subversion", "missing"),
+    pysvn.wc_status_kind.merged: QT_TRANSLATE_NOOP("Subversion", "merged"),
+    pysvn.wc_status_kind.modified: QT_TRANSLATE_NOOP("Subversion", "modified"),
+    pysvn.wc_status_kind.none: QT_TRANSLATE_NOOP("Subversion", "normal"),
+    pysvn.wc_status_kind.normal: QT_TRANSLATE_NOOP("Subversion", "normal"),
+    pysvn.wc_status_kind.obstructed: QT_TRANSLATE_NOOP("Subversion", "type error"),
+    pysvn.wc_status_kind.replaced: QT_TRANSLATE_NOOP("Subversion", "replaced"),
+    pysvn.wc_status_kind.unversioned: QT_TRANSLATE_NOOP("Subversion", "unversioned"),
 }
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCopyDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnCopyDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     Class implementing a dialog to enter the data for a copy or rename
     operation.
     """
+
     def __init__(self, source, parent=None, move=False, force=False):
         """
         Constructor
-        
+
         @param source name of the source file/directory (string)
         @param parent parent widget (QWidget)
         @param move flag indicating a move operation (boolean)
@@ -33,31 +34,30 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.source = source
         if os.path.isdir(self.source):
             self.targetPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         else:
             self.targetPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
-        
+
         if move:
-            self.setWindowTitle(self.tr('Subversion Move'))
+            self.setWindowTitle(self.tr("Subversion Move"))
         else:
             self.forceCheckBox.setEnabled(False)
         self.forceCheckBox.setChecked(force)
-        
+
         self.sourceEdit.setText(source)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public method to retrieve the copy data.
-        
+
         @return the target name (string) and a flag indicating
             the operation should be enforced (boolean)
         """
@@ -66,13 +66,14 @@
             sourceDir = os.path.dirname(self.sourceEdit.text())
             target = os.path.join(sourceDir, target)
         return (target, self.forceCheckBox.isChecked())
-    
+
     @pyqtSlot(str)
     def on_targetPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the target.
-        
+
         @param txt contents of the target edit (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            os.path.isabs(txt) or os.path.dirname(txt) == "")
+            os.path.isabs(txt) or os.path.dirname(txt) == ""
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog to show the output of a pysvn action.
     """
+
     def __init__(self, text, command, pysvnClient, parent=None, log=""):
         """
         Constructor
-        
+
         @param text text to be shown by the label (string)
         @param command svn command to be executed (display purposes only)
             (string)
@@ -39,128 +40,119 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self, log)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.outputGroup.setTitle(text)
         self.errorGroup.hide()
-        
+
         pysvnClient.callback_cancel = self._clientCancelCallback
-        
+
         pysvnClient.callback_notify = self._clientNotifyCallback
         pysvnClient.callback_get_login = self._clientLoginCallback
         pysvnClient.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
         pysvnClient.callback_get_log_message = self._clientLogCallback
-        
+
         self.__hasAddOrDelete = False
-        
+
         if command:
             self.resultbox.append(command)
-            self.resultbox.append('')
-        
+            self.resultbox.append("")
+
         self.show()
         QApplication.processEvents()
-        
+
     def _clientNotifyCallback(self, eventDict):
         """
         Protected method called by the client to send events.
-        
+
         @param eventDict dictionary containing the notification event
         """
         msg = ""
         if eventDict["action"] == pysvn.wc_notify_action.update_completed:
-            msg = self.tr("Revision {0}.\n").format(
-                eventDict["revision"].number)
+            msg = self.tr("Revision {0}.\n").format(eventDict["revision"].number)
         elif (
-            eventDict["path"] != "" and
-            eventDict["action"] in svnNotifyActionMap and
-            svnNotifyActionMap[eventDict["action"]] is not None
+            eventDict["path"] != ""
+            and eventDict["action"] in svnNotifyActionMap
+            and svnNotifyActionMap[eventDict["action"]] is not None
         ):
             mime = (
-                eventDict["mime_type"] == "application/octet-stream" and
-                self.tr(" (binary)") or ""
+                eventDict["mime_type"] == "application/octet-stream"
+                and self.tr(" (binary)")
+                or ""
             )
             msg = self.tr("{0} {1}{2}\n").format(
                 self.tr(svnNotifyActionMap[eventDict["action"]]),
                 eventDict["path"],
-                mime)
-            if (
-                '.epj' in eventDict["path"] or
-                '.e4p' in eventDict["path"]
-            ):
+                mime,
+            )
+            if ".epj" in eventDict["path"] or ".e4p" in eventDict["path"]:
                 self.__hasAddOrDelete = True
-            if eventDict["action"] in [pysvn.wc_notify_action.add,
-                                       pysvn.wc_notify_action.commit_added,
-                                       pysvn.wc_notify_action.commit_deleted,
-                                       pysvn.wc_notify_action.delete,
-                                       pysvn.wc_notify_action.update_add,
-                                       pysvn.wc_notify_action.update_delete]:
+            if eventDict["action"] in [
+                pysvn.wc_notify_action.add,
+                pysvn.wc_notify_action.commit_added,
+                pysvn.wc_notify_action.commit_deleted,
+                pysvn.wc_notify_action.delete,
+                pysvn.wc_notify_action.update_add,
+                pysvn.wc_notify_action.update_delete,
+            ]:
                 self.__hasAddOrDelete = True
         if msg:
             self.showMessage(msg)
-        
+
     def showMessage(self, msg):
         """
         Public slot to show a message.
-        
+
         @param msg message to show (string)
         """
         self.resultbox.insertPlainText(msg)
         self.resultbox.ensureCursorVisible()
         QApplication.processEvents()
-        
+
     def showError(self, msg):
         """
         Public slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(msg)
         self.errors.ensureCursorVisible()
         QApplication.processEvents()
-        
+
     def finish(self):
         """
         Public slot called when the process finished or the user pressed the
         button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self._cancel()
-        
+
         if Preferences.getVCS("AutoClose"):
             self.accept()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.finish()
-        
+
     def hasAddOrDelete(self):
         """
         Public method to check, if the last action contained an add or delete.
-        
+
         @return flag indicating the presence of an add or delete (boolean)
         """
         return self.__hasAddOrDelete
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialogMixin.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDialogMixin.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,40 +18,41 @@
     Class implementing a dialog mixin providing common callback methods for
     the pysvn client.
     """
+
     def __init__(self, log=""):
         """
         Constructor
-        
+
         @param log optional log message (string)
         """
         self.shouldCancel = False
         self.logMessage = log
-        
+
     def _cancel(self):
         """
         Protected method to request a cancellation of the current action.
         """
         self.shouldCancel = True
-        
+
     def _reset(self):
         """
         Protected method to reset the internal state of the dialog.
         """
         self.shouldCancel = False
-        
+
     def _clientCancelCallback(self):
         """
         Protected method called by the client to check for cancellation.
-        
+
         @return flag indicating a cancellation
         """
         QApplication.processEvents()
         return self.shouldCancel
-        
+
     def _clientLoginCallback(self, realm, username, may_save):
         """
         Protected method called by the client to get login information.
-        
+
         @param realm name of the realm of the requested credentials (string)
         @param username username as supplied by subversion (string)
         @param may_save flag indicating, that subversion is willing to save
@@ -63,23 +64,23 @@
             password should be saved.
         """
         from .SvnLoginDialog import SvnLoginDialog
-        
+
         with EricOverridenCursor():
             parent = isinstance(self, QWidget) and self or None
             dlg = SvnLoginDialog(realm, username, may_save, parent)
             res = dlg.exec()
-        
+
         if res == QDialog.DialogCode.Accepted:
             loginData = dlg.getData()
             return (True, loginData[0], loginData[1], loginData[2])
         else:
             return (False, "", "", False)
-        
+
     def _clientSslServerTrustPromptCallback(self, trust_dict):
         """
         Protected method called by the client to request acceptance for a
         ssl server certificate.
-        
+
         @param trust_dict dictionary containing the trust data
         @return tuple of three values (retcode, acceptedFailures, save).
             Retcode should be true, if the certificate should be accepted,
@@ -93,43 +94,51 @@
             msgBox = EricMessageBox.EricMessageBox(
                 EricMessageBox.Question,
                 self.tr("Subversion SSL Server Certificate"),
-                self.tr("""<p>Accept the following SSL certificate?</p>"""
-                        """<table>"""
-                        """<tr><td>Realm:</td><td>{0}</td></tr>"""
-                        """<tr><td>Hostname:</td><td>{1}</td></tr>"""
-                        """<tr><td>Fingerprint:</td><td>{2}</td></tr>"""
-                        """<tr><td>Valid from:</td><td>{3}</td></tr>"""
-                        """<tr><td>Valid until:</td><td>{4}</td></tr>"""
-                        """<tr><td>Issuer name:</td><td>{5}</td></tr>"""
-                        """</table>""")
-                    .format(trust_dict["realm"],
-                            trust_dict["hostname"],
-                            trust_dict["finger_print"],
-                            trust_dict["valid_from"],
-                            trust_dict["valid_until"],
-                            trust_dict["issuer_dname"]),
-                modal=True, parent=parent)
-            permButton = msgBox.addButton(self.tr("&Permanent accept"),
-                                          EricMessageBox.AcceptRole)
-            tempButton = msgBox.addButton(self.tr("&Temporary accept"),
-                                          EricMessageBox.AcceptRole)
+                self.tr(
+                    """<p>Accept the following SSL certificate?</p>"""
+                    """<table>"""
+                    """<tr><td>Realm:</td><td>{0}</td></tr>"""
+                    """<tr><td>Hostname:</td><td>{1}</td></tr>"""
+                    """<tr><td>Fingerprint:</td><td>{2}</td></tr>"""
+                    """<tr><td>Valid from:</td><td>{3}</td></tr>"""
+                    """<tr><td>Valid until:</td><td>{4}</td></tr>"""
+                    """<tr><td>Issuer name:</td><td>{5}</td></tr>"""
+                    """</table>"""
+                ).format(
+                    trust_dict["realm"],
+                    trust_dict["hostname"],
+                    trust_dict["finger_print"],
+                    trust_dict["valid_from"],
+                    trust_dict["valid_until"],
+                    trust_dict["issuer_dname"],
+                ),
+                modal=True,
+                parent=parent,
+            )
+            permButton = msgBox.addButton(
+                self.tr("&Permanent accept"), EricMessageBox.AcceptRole
+            )
+            tempButton = msgBox.addButton(
+                self.tr("&Temporary accept"), EricMessageBox.AcceptRole
+            )
             msgBox.addButton(self.tr("&Reject"), EricMessageBox.RejectRole)
             msgBox.exec()
-        
+
         if msgBox.clickedButton() == permButton:
             return (True, trust_dict["failures"], True)
         elif msgBox.clickedButton() == tempButton:
             return (True, trust_dict["failures"], False)
         else:
             return (False, 0, False)
-        
+
     def _clientLogCallback(self):
         """
         Protected method called by the client to request a log message.
-        
+
         @return a flag indicating success and the log message (string)
         """
         from .SvnCommitDialog import SvnCommitDialog
+
         if self.logMessage:
             return True, self.logMessage
         else:
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -35,50 +35,48 @@
     """
     Class implementing a dialog to show the output of the svn diff command.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.searchWidget.attachTextEdit(self.contents)
-        
+
         self.vcs = vcs
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.contents.document().setDefaultFont(font)
-        
+
         self.highlighter = SvnDiffHighlighter(self.contents.document())
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
     def __getVersionArg(self, version):
         """
         Private method to get a pysvn revision object for the given version
         number.
-        
+
         @param version revision (integer or string)
         @return revision object (pysvn.Revision)
         """
@@ -86,8 +84,7 @@
             return pysvn.Revision(pysvn.opt_revision_kind.number, version)
         elif version.startswith("{"):
             dateStr = version[1:-1]
-            secs = QDateTime.fromString(
-                dateStr, Qt.DateFormat.ISODate).toTime_t()
+            secs = QDateTime.fromString(dateStr, Qt.DateFormat.ISODate).toTime_t()
             return pysvn.Revision(pysvn.opt_revision_kind.date, secs)
         else:
             return {
@@ -97,11 +94,11 @@
                 "WORKING": pysvn.Revision(pysvn.opt_revision_kind.working),
                 "PREV": pysvn.Revision(pysvn.opt_revision_kind.previous),
             }.get(version, pysvn.Revision(pysvn.opt_revision_kind.unspecified))
-    
+
     def __getDiffSummaryKind(self, summaryKind):
         """
         Private method to get a string descripion of the diff summary.
-        
+
         @param summaryKind (pysvn.diff_summarize.summarize_kind)
         @return one letter string indicating the change type (string)
         """
@@ -115,12 +112,19 @@
             return "N"
         else:
             return " "
-        
-    def start(self, fn, versions=None, urls=None, summary=False, pegRev=None,
-              refreshable=False):
+
+    def start(
+        self,
+        fn,
+        versions=None,
+        urls=None,
+        summary=False,
+        pegRev=None,
+        refreshable=False,
+    ):
         """
         Public slot to start the svn diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to 2 integer
             or None)
@@ -131,57 +135,54 @@
         @param refreshable flag indicating a refreshable diff (boolean)
         """
         self.refreshButton.setVisible(refreshable)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self._reset()
         self.errorGroup.hide()
-        
+
         self.filename = fn
-        
+
         self.contents.clear()
         self.highlighter.regenerateRules()
         self.paras = 0
-        
+
         self.filesCombo.clear()
-        
+
         self.__oldFile = ""
         self.__oldFileLine = -1
         self.__fileSeparators = []
-        
-        if Utilities.hasEnvironmentEntry('TEMP'):
-            tmpdir = Utilities.getEnvironmentEntry('TEMP')
-        elif Utilities.hasEnvironmentEntry('TMPDIR'):
-            tmpdir = Utilities.getEnvironmentEntry('TMPDIR')
-        elif Utilities.hasEnvironmentEntry('TMP'):
-            tmpdir = Utilities.getEnvironmentEntry('TMP')
-        elif os.path.exists('/var/tmp'):    # secok
-            tmpdir = '/var/tmp'             # secok
-        elif os.path.exists('/usr/tmp'):
-            tmpdir = '/usr/tmp'
-        elif os.path.exists('/tmp'):        # secok
-            tmpdir = '/tmp'                 # secok
+
+        if Utilities.hasEnvironmentEntry("TEMP"):
+            tmpdir = Utilities.getEnvironmentEntry("TEMP")
+        elif Utilities.hasEnvironmentEntry("TMPDIR"):
+            tmpdir = Utilities.getEnvironmentEntry("TMPDIR")
+        elif Utilities.hasEnvironmentEntry("TMP"):
+            tmpdir = Utilities.getEnvironmentEntry("TMP")
+        elif os.path.exists("/var/tmp"):  # secok
+            tmpdir = "/var/tmp"  # secok
+        elif os.path.exists("/usr/tmp"):
+            tmpdir = "/usr/tmp"
+        elif os.path.exists("/tmp"):  # secok
+            tmpdir = "/tmp"  # secok
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Subversion Diff"),
-                self.tr("""There is no temporary directory available."""))
+                self.tr("""There is no temporary directory available."""),
+            )
             return
-        
-        tmpdir = os.path.join(tmpdir, 'svn_tmp')
+
+        tmpdir = os.path.join(tmpdir, "svn_tmp")
         if not os.path.exists(tmpdir):
             os.mkdir(tmpdir)
-        
-        opts = self.vcs.options['global'] + self.vcs.options['diff']
+
+        opts = self.vcs.options["global"] + self.vcs.options["diff"]
         recurse = "--non-recursive" not in opts
-        
+
         if versions is not None:
             self.raise_()
             self.activateWindow()
@@ -193,75 +194,85 @@
         else:
             rev1 = self.__getVersionArg("BASE")
             rev2 = self.__getVersionArg("WORKING")
-        
+
         if urls is not None:
             rev1 = self.__getVersionArg("HEAD")
             rev2 = self.__getVersionArg("HEAD")
-        
+
         if isinstance(fn, list):
             dname, fnames = self.vcs.splitPathList(fn)
         else:
             dname, fname = self.vcs.splitPath(fn)
             fnames = [fname]
-        
+
         with EricOverrideCursor():
             cwd = os.getcwd()
             os.chdir(dname)
             try:
-                dname = ericApp().getObject('Project').getRelativePath(dname)
+                dname = ericApp().getObject("Project").getRelativePath(dname)
                 if dname:
                     dname += "/"
                 with EricMutexLocker(self.vcs.vcsExecutionMutex):
                     for name in fnames:
                         self.__showError(
-                            self.tr("Processing file '{0}'...\n").format(name))
+                            self.tr("Processing file '{0}'...\n").format(name)
+                        )
                         if urls is not None:
                             url1 = "{0}/{1}{2}".format(urls[0], dname, name)
                             url2 = "{0}/{1}{2}".format(urls[1], dname, name)
                             if summary:
                                 diff_summary = self.client.diff_summarize(
-                                    url1, revision1=rev1,
-                                    url_or_path2=url2, revision2=rev2,
-                                    recurse=recurse)
+                                    url1,
+                                    revision1=rev1,
+                                    url_or_path2=url2,
+                                    revision2=rev2,
+                                    recurse=recurse,
+                                )
                                 diff_list = []
                                 for diff_sum in diff_summary:
-                                    path = diff_sum['path']
-                                    diff_list.append("{0} {1}".format(
-                                        self.__getDiffSummaryKind(
-                                            diff_sum['summarize_kind']),
-                                        path))
+                                    path = diff_sum["path"]
+                                    diff_list.append(
+                                        "{0} {1}".format(
+                                            self.__getDiffSummaryKind(
+                                                diff_sum["summarize_kind"]
+                                            ),
+                                            path,
+                                        )
+                                    )
                                 diffText = os.linesep.join(diff_list)
                             else:
                                 diffText = self.client.diff(
                                     tmpdir,
-                                    url1, revision1=rev1,
-                                    url_or_path2=url2, revision2=rev2,
-                                    recurse=recurse)
+                                    url1,
+                                    revision1=rev1,
+                                    url_or_path2=url2,
+                                    revision2=rev2,
+                                    recurse=recurse,
+                                )
                         else:
                             if pegRev is not None:
                                 diffText = self.client.diff_peg(
-                                    tmpdir, name,
+                                    tmpdir,
+                                    name,
                                     peg_revision=self.__getVersionArg(pegRev),
-                                    revision_start=rev1, revision_end=rev2,
-                                    recurse=recurse)
+                                    revision_start=rev1,
+                                    revision_end=rev2,
+                                    recurse=recurse,
+                                )
                             else:
                                 diffText = self.client.diff(
-                                    tmpdir, name,
-                                    revision1=rev1, revision2=rev2,
-                                    recurse=recurse)
+                                    tmpdir,
+                                    name,
+                                    revision1=rev1,
+                                    revision2=rev2,
+                                    recurse=recurse,
+                                )
                         for counter, line in enumerate(diffText.splitlines()):
-                            if (
-                                line.startswith("--- ") or
-                                line.startswith("+++ ")
-                            ):
+                            if line.startswith("--- ") or line.startswith("+++ "):
                                 self.__processFileLine(line)
-                            
-                            self.__appendText(
-                                "{0}{1}".format(line, os.linesep))
-                            if (
-                                counter % 30 == 0 and
-                                self._clientCancelCallback()
-                            ):
+
+                            self.__appendText("{0}{1}".format(line, os.linesep))
+                            if counter % 30 == 0 and self._clientCancelCallback():
                                 # check for cancel every 30 lines
                                 break
                         if self._clientCancelCallback():
@@ -270,17 +281,18 @@
                 self.__showError(e.args[0])
             os.chdir(cwd)
         self.__finish()
-        
+
         if self.paras == 0:
-            self.contents.setPlainText(self.tr('There is no difference.'))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(self.paras > 0)
-        
+            self.contents.setPlainText(self.tr("There is no difference."))
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(
+            self.paras > 0
+        )
+
     def __appendText(self, line):
         """
         Private method to append text to the end of the contents pane.
-        
+
         @param line line of text to insert (string)
         """
         tc = self.contents.textCursor()
@@ -288,92 +300,81 @@
         self.contents.setTextCursor(tc)
         self.contents.insertPlainText(line)
         self.paras += 1
-        
+
     def __extractFileName(self, line):
         """
         Private method to extract the file name out of a file separator line.
-        
+
         @param line line to be processed (string)
         @return extracted file name (string)
         """
         f = line.split(None, 1)[1]
         f = f.rsplit(None, 2)[0]
         return f
-    
+
     def __processFileLine(self, line):
         """
         Private slot to process a line giving the old/new file.
-        
+
         @param line line to be processed (string)
         """
-        if line.startswith('---'):
+        if line.startswith("---"):
             self.__oldFileLine = self.paras
             self.__oldFile = self.__extractFileName(line)
         else:
             self.__fileSeparators.append(
-                (self.__oldFile, self.__extractFileName(line),
-                 self.__oldFileLine))
-    
+                (self.__oldFile, self.__extractFileName(line), self.__oldFileLine)
+            )
+
     def __finish(self):
         """
         Private slot called when the user pressed the button.
         """
         self.refreshButton.setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.contents.setTextCursor(tc)
         self.contents.ensureCursorVisible()
-        
+
         self.filesCombo.addItem(self.tr("<Start>"), 0)
         self.filesCombo.addItem(self.tr("<End>"), -1)
         for oldFile, newFile, pos in sorted(self.__fileSeparators):
             if oldFile != newFile:
-                self.filesCombo.addItem(
-                    "{0}\n{1}".format(oldFile, newFile), pos)
+                self.filesCombo.addItem("{0}\n{1}".format(oldFile, newFile), pos)
             else:
                 self.filesCombo.addItem(oldFile, pos)
-        
+
         self._cancel()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Save):
             self.on_saveButton_clicked()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(int)
     def on_filesCombo_activated(self, index):
         """
         Private slot to handle the selection of a file.
-        
+
         @param index activated row (integer)
         """
         para = self.filesCombo.itemData(index)
-        
+
         if para == 0:
             tc = self.contents.textCursor()
             tc.movePosition(QTextCursor.MoveOperation.Start)
@@ -390,22 +391,23 @@
             tc.movePosition(QTextCursor.MoveOperation.End)
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-            
+
             # step 2: move cursor to desired line
             tc = self.contents.textCursor()
             delta = tc.blockNumber() - para
             tc.movePosition(
                 QTextCursor.MoveOperation.PreviousBlock,
                 QTextCursor.MoveMode.MoveAnchor,
-                delta)
+                delta,
+            )
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to handle the Save button press.
-        
+
         It saves the diff shown in the dialog to a file in the local
         filesystem.
         """
@@ -414,24 +416,25 @@
                 fname = self.vcs.splitPathList(self.filename)[0]
             else:
                 dname, fname = self.vcs.splitPath(self.filename[0])
-                if fname != '.':
+                if fname != ".":
                     fname = "{0}.diff".format(self.filename[0])
                 else:
                     fname = dname
         else:
             fname = self.vcs.splitPath(self.filename)[0]
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -441,42 +444,44 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
                 f.write(eol.join(self.contents.toPlainText().splitlines()))
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-        
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the display.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
         self.refreshButton.setEnabled(False)
-        
+
         self.start(self.filename, refreshable=True)
-    
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,19 +7,18 @@
 Module implementing a syntax highlighter for unified and context diff outputs.
 """
 
-from EricGui.EricGenericDiffHighlighter import (
-    TERMINAL, EricGenericDiffHighlighter
-)
+from EricGui.EricGenericDiffHighlighter import TERMINAL, EricGenericDiffHighlighter
 
 
 class SvnDiffHighlighter(EricGenericDiffHighlighter):
     """
     Class implementing a diff highlighter for Git.
     """
+
     def __init__(self, doc):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         """
         super().__init__(doc)
@@ -28,35 +27,32 @@
         """
         Public method to generate the rule set.
         """
-        diffHeader = self.makeFormat(fg=self.textColor,
-                                     bg=self.headerColor)
-        diffHeaderBold = self.makeFormat(fg=self.textColor,
-                                         bg=self.headerColor,
-                                         bold=True)
-        diffContext = self.makeFormat(fg=self.textColor,
-                                      bg=self.contextColor)
+        diffHeader = self.makeFormat(fg=self.textColor, bg=self.headerColor)
+        diffHeaderBold = self.makeFormat(
+            fg=self.textColor, bg=self.headerColor, bold=True
+        )
+        diffContext = self.makeFormat(fg=self.textColor, bg=self.contextColor)
 
-        diffAdded = self.makeFormat(fg=self.textColor,
-                                    bg=self.addedColor)
-        diffRemoved = self.makeFormat(fg=self.textColor,
-                                      bg=self.removedColor)
-        
-        diffBarRegex = TERMINAL(r'^=+$')
+        diffAdded = self.makeFormat(fg=self.textColor, bg=self.addedColor)
+        diffRemoved = self.makeFormat(fg=self.textColor, bg=self.removedColor)
+
+        diffBarRegex = TERMINAL(r"^=+$")
+
+        diffHeaderRegex = TERMINAL(r"^[iI]ndex: \S+")
 
-        diffHeaderRegex = TERMINAL(r'^[iI]ndex: \S+')
-        
-        diffOldRegex = TERMINAL(r'^--- ')
-        diffNewRegex = TERMINAL(r'^\+\+\+')
-        diffContextRegex = TERMINAL(r'^@@ ')
-        
-        diffAddedRegex = TERMINAL(r'^[+>]|^A ')
-        diffRemovedRegex = TERMINAL(r'^[-<]|^D ')
-        
-        self.createRules((diffOldRegex, diffRemoved),
-                         (diffNewRegex, diffAdded),
-                         (diffContextRegex, diffContext),
-                         (diffHeaderRegex, diffHeader),
-                         (diffBarRegex, diffHeaderBold),
-                         (diffAddedRegex, diffAdded),
-                         (diffRemovedRegex, diffRemoved),
-                         )
+        diffOldRegex = TERMINAL(r"^--- ")
+        diffNewRegex = TERMINAL(r"^\+\+\+")
+        diffContextRegex = TERMINAL(r"^@@ ")
+
+        diffAddedRegex = TERMINAL(r"^[+>]|^A ")
+        diffRemovedRegex = TERMINAL(r"^[-<]|^D ")
+
+        self.createRules(
+            (diffOldRegex, diffRemoved),
+            (diffNewRegex, diffAdded),
+            (diffContextRegex, diffContext),
+            (diffHeaderRegex, diffHeader),
+            (diffBarRegex, diffHeaderBold),
+            (diffAddedRegex, diffAdded),
+            (diffRemovedRegex, diffRemoved),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,10 +27,11 @@
     Class implementing a dialog to show repository related information
     for a file/directory.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
@@ -38,23 +39,23 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.vcs = vcs
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
         self.show()
         QApplication.processEvents()
-        
+
     def start(self, projectPath, fn):
         """
         Public slot to start the svn info command.
-        
+
         @param projectPath path name of the project (string)
         @param fn file or directory name relative to the project (string)
         """
@@ -67,123 +68,114 @@
             for path, info in entries:
                 infoStr += self.tr(
                     "<tr><td><b>Path (relative to project):</b></td>"
-                    "<td>{0}</td></tr>").format(path)
-                if info['URL']:
+                    "<td>{0}</td></tr>"
+                ).format(path)
+                if info["URL"]:
                     infoStr += self.tr(
                         "<tr><td><b>Url:</b></td><td>{0}</td></tr>"
-                    ).format(info['URL'])
-                if info['rev']:
+                    ).format(info["URL"])
+                if info["rev"]:
                     infoStr += self.tr(
                         "<tr><td><b>Revision:</b></td><td>{0}</td></tr>"
-                    ).format(info['rev'].number)
-                if info['repos_root_URL']:
+                    ).format(info["rev"].number)
+                if info["repos_root_URL"]:
                     infoStr += self.tr(
-                        "<tr><td><b>Repository root URL:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(info['repos_root_URL'])
-                if info['repos_UUID']:
-                    infoStr += self.tr(
-                        "<tr><td><b>Repository UUID:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(info['repos_UUID'])
-                if info['last_changed_author']:
+                        "<tr><td><b>Repository root URL:</b></td>" "<td>{0}</td></tr>"
+                    ).format(info["repos_root_URL"])
+                if info["repos_UUID"]:
                     infoStr += self.tr(
-                        "<tr><td><b>Last changed author:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(info['last_changed_author'])
-                if info['last_changed_date']:
+                        "<tr><td><b>Repository UUID:</b></td>" "<td>{0}</td></tr>"
+                    ).format(info["repos_UUID"])
+                if info["last_changed_author"]:
                     infoStr += self.tr(
-                        "<tr><td><b>Last Changed Date:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(formatTime(info['last_changed_date']))
+                        "<tr><td><b>Last changed author:</b></td>" "<td>{0}</td></tr>"
+                    ).format(info["last_changed_author"])
+                if info["last_changed_date"]:
+                    infoStr += self.tr(
+                        "<tr><td><b>Last Changed Date:</b></td>" "<td>{0}</td></tr>"
+                    ).format(formatTime(info["last_changed_date"]))
                 if (
-                    info['last_changed_rev'] and
-                    info['last_changed_rev'].kind ==
-                        pysvn.opt_revision_kind.number
+                    info["last_changed_rev"]
+                    and info["last_changed_rev"].kind == pysvn.opt_revision_kind.number
                 ):
                     infoStr += self.tr(
-                        "<tr><td><b>Last changed revision:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(info['last_changed_rev'].number)
-                if info['kind']:
-                    if info['kind'] == pysvn.node_kind.file:
+                        "<tr><td><b>Last changed revision:</b></td>" "<td>{0}</td></tr>"
+                    ).format(info["last_changed_rev"].number)
+                if info["kind"]:
+                    if info["kind"] == pysvn.node_kind.file:
                         nodeKind = self.tr("file")
-                    elif info['kind'] == pysvn.node_kind.dir:
+                    elif info["kind"] == pysvn.node_kind.dir:
                         nodeKind = self.tr("directory")
-                    elif info['kind'] == pysvn.node_kind.none:
+                    elif info["kind"] == pysvn.node_kind.none:
                         nodeKind = self.tr("none")
                     else:
                         nodeKind = self.tr("unknown")
                     infoStr += self.tr(
                         "<tr><td><b>Node kind:</b></td><td>{0}</td></tr>"
                     ).format(nodeKind)
-                if info['lock']:
-                    lockInfo = info['lock']
+                if info["lock"]:
+                    lockInfo = info["lock"]
                     infoStr += self.tr(
                         "<tr><td><b>Lock Owner:</b></td><td>{0}</td></tr>"
-                    ).format(lockInfo['owner'])
+                    ).format(lockInfo["owner"])
                     infoStr += self.tr(
-                        "<tr><td><b>Lock Creation Date:</b></td>"
-                        "<td>{0}</td></tr>"
-                    ).format(formatTime(lockInfo['creation_date']))
-                    if lockInfo['expiration_date'] is not None:
+                        "<tr><td><b>Lock Creation Date:</b></td>" "<td>{0}</td></tr>"
+                    ).format(formatTime(lockInfo["creation_date"]))
+                    if lockInfo["expiration_date"] is not None:
                         infoStr += self.tr(
                             "<tr><td><b>Lock Expiration Date:</b></td>"
                             "<td>{0}</td></tr>"
-                        ).format(formatTime(lockInfo['expiration_date']))
+                        ).format(formatTime(lockInfo["expiration_date"]))
                     infoStr += self.tr(
                         "<tr><td><b>Lock Token:</b></td><td>{0}</td></tr>"
-                    ).format(lockInfo['token'])
+                    ).format(lockInfo["token"])
                     infoStr += self.tr(
                         "<tr><td><b>Lock Comment:</b></td><td>{0}</td></tr>"
-                    ).format(lockInfo['comment'])
-                if info['wc_info']:
-                    wcInfo = info['wc_info']
-                    if wcInfo['schedule']:
-                        if wcInfo['schedule'] == pysvn.wc_schedule.normal:
+                    ).format(lockInfo["comment"])
+                if info["wc_info"]:
+                    wcInfo = info["wc_info"]
+                    if wcInfo["schedule"]:
+                        if wcInfo["schedule"] == pysvn.wc_schedule.normal:
                             schedule = self.tr("normal")
-                        elif wcInfo['schedule'] == pysvn.wc_schedule.add:
+                        elif wcInfo["schedule"] == pysvn.wc_schedule.add:
                             schedule = self.tr("add")
-                        elif wcInfo['schedule'] == pysvn.wc_schedule.delete:
+                        elif wcInfo["schedule"] == pysvn.wc_schedule.delete:
                             schedule = self.tr("delete")
-                        elif wcInfo['schedule'] == pysvn.wc_schedule.replace:
+                        elif wcInfo["schedule"] == pysvn.wc_schedule.replace:
                             schedule = self.tr("replace")
                         infoStr += self.tr(
                             "<tr><td><b>Schedule:</b></td><td>{0}</td></tr>"
                         ).format(schedule)
-                    if wcInfo['copyfrom_url']:
+                    if wcInfo["copyfrom_url"]:
                         infoStr += self.tr(
-                            "<tr><td><b>Copied From URL:</b></td>"
-                            "<td>{0}</td></tr>"
-                        ).format(wcInfo['copyfrom_url'])
+                            "<tr><td><b>Copied From URL:</b></td>" "<td>{0}</td></tr>"
+                        ).format(wcInfo["copyfrom_url"])
                         infoStr += self.tr(
-                            "<tr><td><b>Copied From Rev:</b></td>"
-                            "<td>{0}</td></tr>"
-                        ).format(wcInfo['copyfrom_rev'].number)
-                    if wcInfo['text_time']:
+                            "<tr><td><b>Copied From Rev:</b></td>" "<td>{0}</td></tr>"
+                        ).format(wcInfo["copyfrom_rev"].number)
+                    if wcInfo["text_time"]:
                         infoStr += self.tr(
-                            "<tr><td><b>Text Last Updated:</b></td>"
-                            "<td>{0}</td></tr>"
-                        ).format(formatTime(wcInfo['text_time']))
-                    if wcInfo['prop_time']:
+                            "<tr><td><b>Text Last Updated:</b></td>" "<td>{0}</td></tr>"
+                        ).format(formatTime(wcInfo["text_time"]))
+                    if wcInfo["prop_time"]:
                         infoStr += self.tr(
                             "<tr><td><b>Properties Last Updated:</b></td>"
                             "<td>{0}</td></tr>"
-                        ).format(formatTime(wcInfo['prop_time']))
-                    if wcInfo['checksum']:
+                        ).format(formatTime(wcInfo["prop_time"]))
+                    if wcInfo["checksum"]:
                         infoStr += self.tr(
                             "<tr><td><b>Checksum:</b></td><td>{0}</td></tr>"
-                        ).format(wcInfo['checksum'])
+                        ).format(wcInfo["checksum"])
             infoStr += "</table>"
             self.infoBrowser.setHtml(infoStr)
         except pysvn.ClientError as e:
             self.__showError(e.args[0])
         os.chdir(cwd)
-        
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         infoStr = "<p>{0}</p>".format(msg)
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,11 @@
 
 from PyQt6.QtCore import Qt, QDate, pyqtSlot, QPoint
 from PyQt6.QtWidgets import (
-    QHeaderView, QWidget, QApplication, QDialogButtonBox, QTreeWidgetItem
+    QHeaderView,
+    QWidget,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -34,61 +38,59 @@
     """
     Class implementing a dialog to browse the log history.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
-        
+
         self.__position = QPoint()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
+
         self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
-        self.filesTree.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.filesTree.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.vcs = vcs
-        
+
         self.__initData()
-        
+
         self.fromDate.setDisplayFormat("yyyy-MM-dd")
         self.toDate.setDisplayFormat("yyyy-MM-dd")
         self.__resetUI()
-        
+
         self.__messageRole = Qt.ItemDataRole.UserRole
         self.__changesRole = Qt.ItemDataRole.UserRole + 1
-        
+
         self.flags = {
-            'A': self.tr('Added'),
-            'D': self.tr('Deleted'),
-            'M': self.tr('Modified'),
-            'R': self.tr('Replaced'),
+            "A": self.tr("Added"),
+            "D": self.tr("Deleted"),
+            "M": self.tr("Modified"),
+            "R": self.tr("Replaced"),
         }
-        
+
         self.__logTreeNormalFont = self.logTree.font()
         self.__logTreeNormalFont.setBold(False)
         self.__logTreeBoldFont = self.logTree.font()
         self.__logTreeBoldFont.setBold(True)
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
@@ -96,20 +98,20 @@
         self.__maxDate = QDate()
         self.__minDate = QDate()
         self.__filterLogsEnabled = True
-        
+
         self.diff = None
         self.__lastRev = 0
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         self.__position = self.pos()
-        
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -117,24 +119,23 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
         self.fromDate.setDate(QDate.currentDate())
         self.toDate.setDate(QDate.currentDate())
-        self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(
-            self.tr("Message")))
-        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
-            "LogLimit"))
-        self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences(
-            "StopLogOnCopy"))
-        
+        self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(self.tr("Message")))
+        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit"))
+        self.stopCheckBox.setChecked(
+            self.vcs.getPlugin().getPreferences("StopLogOnCopy")
+        )
+
         self.logTree.clear()
-        
+
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
 
@@ -143,55 +144,50 @@
         Protected method to reset the internal state of the dialog.
         """
         SvnDialogMixin._reset(self)
-        
+
         self.cancelled = False
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-    
+
     def __resizeColumnsLog(self):
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __resortLog(self):
         """
         Private method to resort the log tree.
         """
         self.logTree.sortItems(
-            self.logTree.sortColumn(),
-            self.logTree.header().sortIndicatorOrder())
-    
+            self.logTree.sortColumn(), self.logTree.header().sortIndicatorOrder()
+        )
+
     def __resizeColumnsFiles(self):
         """
         Private method to resize the changed files tree columns.
         """
-        self.filesTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.filesTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.filesTree.header().setStretchLastSection(True)
-    
+
     def __resortFiles(self):
         """
         Private method to resort the changed files tree.
         """
         sortColumn = self.filesTree.sortColumn()
-        self.filesTree.sortItems(
-            1, self.filesTree.header().sortIndicatorOrder())
+        self.filesTree.sortItems(1, self.filesTree.header().sortIndicatorOrder())
         self.filesTree.sortItems(
-            sortColumn, self.filesTree.header().sortIndicatorOrder())
-    
+            sortColumn, self.filesTree.header().sortIndicatorOrder()
+        )
+
     def __generateLogItem(self, author, date, message, revision, changedPaths):
         """
         Private method to generate a log tree entry.
-        
+
         @param author author info (string)
         @param date date info (integer)
         @param message text of the log message (string)
@@ -207,25 +203,24 @@
             rev = revision.number
             self.__lastRev = revision.number
         dt = formatTime(date) if date else ""
-        
+
         itm = QTreeWidgetItem(self.logTree)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, rev)
         itm.setData(1, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, dt)
-        itm.setData(3, Qt.ItemDataRole.DisplayRole,
-                    " ".join(message.splitlines()))
-        
+        itm.setData(3, Qt.ItemDataRole.DisplayRole, " ".join(message.splitlines()))
+
         changes = []
         for changedPath in changedPaths:
             copyPath = (
                 ""
-                if changedPath["copyfrom_path"] is None else
-                changedPath["copyfrom_path"]
+                if changedPath["copyfrom_path"] is None
+                else changedPath["copyfrom_path"]
             )
             copyRev = (
                 ""
-                if changedPath["copyfrom_revision"] is None else
-                "{0:7d}".format(changedPath["copyfrom_revision"].number)
+                if changedPath["copyfrom_revision"] is None
+                else "{0:7d}".format(changedPath["copyfrom_revision"].number)
             )
             change = {
                 "action": changedPath["action"],
@@ -236,19 +231,19 @@
             changes.append(change)
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changes)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignLeft)
-        
+
         return itm
-    
+
     def __generateFileItem(self, action, path, copyFrom, copyRev):
         """
         Private method to generate a changed files tree entry.
-        
+
         @param action indicator for the change action ("A", "D" or "M")
         @param path path of the file in the repository (string)
         @param copyFrom path the file was copied from (None, string)
@@ -256,33 +251,31 @@
         @return reference to the generated item (QTreeWidgetItem)
         """
         itm = QTreeWidgetItem(
-            self.filesTree,
-            [self.flags[action], path, copyFrom, copyRev]
+            self.filesTree, [self.flags[action], path, copyFrom, copyRev]
         )
-        
+
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignRight)
-        
+
         return itm
-    
+
     def __getLogEntries(self, startRev=None):
         """
         Private method to retrieve log entries from the repository.
-        
+
         @param startRev revision number to start from (integer, string)
         """
         fetchLimit = 10
         self._reset()
-        
+
         limit = self.limitSpinBox.value()
         if startRev is None:
             start = pysvn.Revision(pysvn.opt_revision_kind.head)
         else:
             try:
-                start = pysvn.Revision(pysvn.opt_revision_kind.number,
-                                       int(startRev))
+                start = pysvn.Revision(pysvn.opt_revision_kind.number, int(startRev))
             except TypeError:
                 start = pysvn.Revision(pysvn.opt_revision_kind.head)
-        
+
         with EricOverrideCursor():
             cwd = os.getcwd()
             os.chdir(self.dname)
@@ -295,36 +288,36 @@
                         flimit = min(fetchLimit, limit - fetched)
                         revstart = (
                             start
-                            if fetched == 0 else
-                            pysvn.Revision(pysvn.opt_revision_kind.number,
-                                           nextRev)
+                            if fetched == 0
+                            else pysvn.Revision(pysvn.opt_revision_kind.number, nextRev)
                         )
                         allLogs = self.client.log(
-                            self.fname, revision_start=revstart,
-                            discover_changed_paths=True, limit=flimit + 1,
-                            strict_node_history=self.stopCheckBox.isChecked())
-                        if (
-                            len(allLogs) <= flimit or
-                            self._clientCancelCallback()
-                        ):
+                            self.fname,
+                            revision_start=revstart,
+                            discover_changed_paths=True,
+                            limit=flimit + 1,
+                            strict_node_history=self.stopCheckBox.isChecked(),
+                        )
+                        if len(allLogs) <= flimit or self._clientCancelCallback():
                             logs.extend(allLogs)
                             break
                         else:
                             logs.extend(allLogs[:-1])
                             nextRev = allLogs[-1]["revision"].number
                             fetched += fetchLimit
-                
+
                 for log in logs:
                     author = log["author"]
                     message = log["message"]
                     self.__generateLogItem(
-                        author, log["date"], message,
-                        log["revision"], log['changed_paths'])
+                        author,
+                        log["date"],
+                        message,
+                        log["revision"],
+                        log["changed_paths"],
+                    )
                     dt = dateFromTime_t(log["date"])
-                    if (
-                        not self.__maxDate.isValid() and
-                        not self.__minDate.isValid()
-                    ):
+                    if not self.__maxDate.isValid() and not self.__minDate.isValid():
                         self.__maxDate = dt
                         self.__minDate = dt
                     else:
@@ -343,7 +336,7 @@
                 self.toDate.setMaximumDate(self.__maxDate)
                 self.toDate.setDate(self.__maxDate)
                 self.__filterLogsEnabled = True
-                
+
                 self.__resizeColumnsLog()
                 self.__resortLog()
                 self.__filterLogs()
@@ -351,125 +344,118 @@
                 self.__showError(e.args[0])
             os.chdir(cwd)
         self.__finish()
-    
+
     def start(self, fn, isFile=False):
         """
         Public slot to start the svn log command.
-        
+
         @param fn filename to show the log for (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         """
         self.sbsCheckBox.setEnabled(isFile)
         self.sbsCheckBox.setVisible(isFile)
-        
+
         self.__initData()
-        
+
         self.filename = fn
         self.dname, self.fname = self.vcs.splitPath(fn)
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__getLogEntries()
         self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
-    
+
     def __finish(self):
         """
         Private slot called when the user pressed the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self._cancel()
-    
+
     def __diffRevisions(self, rev1, rev2, peg_rev):
         """
         Private method to do a diff of two revisions.
-        
+
         @param rev1 first revision number (integer)
         @param rev2 second revision number (integer)
         @param peg_rev revision number to use as a reference (integer)
         """
         if self.sbsCheckBox.isEnabled() and self.sbsCheckBox.isChecked():
-            self.vcs.vcsSbsDiff(self.filename,
-                                revisions=(str(rev1), str(rev2)))
+            self.vcs.vcsSbsDiff(self.filename, revisions=(str(rev1), str(rev2)))
         else:
             if self.diff is None:
                 from .SvnDiffDialog import SvnDiffDialog
+
                 self.diff = SvnDiffDialog(self.vcs)
             self.diff.show()
             self.diff.raise_()
             QApplication.processEvents()
             self.diff.start(self.filename, [rev1, rev2], pegRev=peg_rev)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_logTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the log tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
         if current is not None:
             self.messageEdit.setPlainText(current.data(0, self.__messageRole))
-            
+
             self.filesTree.clear()
             changes = current.data(0, self.__changesRole)
             if len(changes) > 0:
                 for change in changes:
                     self.__generateFileItem(
-                        change["action"], change["path"],
-                        change["copyfrom_path"], change["copyfrom_revision"])
+                        change["action"],
+                        change["path"],
+                        change["copyfrom_path"],
+                        change["copyfrom_revision"],
+                    )
                 self.__resizeColumnsFiles()
                 self.__resortFiles()
-        
+
         self.diffPreviousButton.setEnabled(
-            current != self.logTree.topLevelItem(
-                self.logTree.topLevelItemCount() - 1))
-        
+            current != self.logTree.topLevelItem(self.logTree.topLevelItemCount() - 1)
+        )
+
         # Highlight the current entry using a bold font
         for col in range(self.logTree.columnCount()):
             current and current.setFont(col, self.__logTreeBoldFont)
             previous and previous.setFont(col, self.__logTreeNormalFont)
-        
+
         # set the state of the up and down buttons
         self.upButton.setEnabled(
-            current is not None and
-            self.logTree.indexOfTopLevelItem(current) > 0)
-        self.downButton.setEnabled(
-            current is not None and
-            int(current.text(0)) > 1)
-    
+            current is not None and self.logTree.indexOfTopLevelItem(current) > 0
+        )
+        self.downButton.setEnabled(current is not None and int(current.text(0)) > 1)
+
     @pyqtSlot()
     def on_logTree_itemSelectionChanged(self):
         """
         Private slot called, when the selection has changed.
         """
-        self.diffRevisionsButton.setEnabled(
-            len(self.logTree.selectedItems()) == 2)
-    
+        self.diffRevisionsButton.setEnabled(len(self.logTree.selectedItems()) == 2)
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
@@ -477,7 +463,7 @@
         """
         if self.__lastRev > 1:
             self.__getLogEntries(self.__lastRev - 1)
-    
+
     @pyqtSlot()
     def on_diffPreviousButton_clicked(self):
         """
@@ -488,22 +474,21 @@
             self.diffPreviousButton.setEnabled(False)
             return
         peg_rev = int(itm.text(0))
-        
+
         itm = self.logTree.currentItem()
         if itm is None:
             self.diffPreviousButton.setEnabled(False)
             return
         rev2 = int(itm.text(0))
-        
-        itm = self.logTree.topLevelItem(
-            self.logTree.indexOfTopLevelItem(itm) + 1)
+
+        itm = self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) + 1)
         if itm is None:
             self.diffPreviousButton.setEnabled(False)
             return
         rev1 = int(itm.text(0))
-        
+
         self.__diffRevisions(rev1, rev2, peg_rev)
-    
+
     @pyqtSlot()
     def on_diffRevisionsButton_clicked(self):
         """
@@ -513,66 +498,63 @@
         if len(items) != 2:
             self.diffRevisionsButton.setEnabled(False)
             return
-        
+
         rev2 = int(items[0].text(0))
         rev1 = int(items[1].text(0))
-        
+
         itm = self.logTree.topLevelItem(0)
         if itm is None:
             self.diffPreviousButton.setEnabled(False)
             return
         peg_rev = int(itm.text(0))
-        
+
         self.__diffRevisions(min(rev1, rev2), max(rev1, rev2), peg_rev)
-    
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
-        EricMessageBox.critical(
-            self,
-            self.tr("Subversion Error"),
-            msg)
-    
+        EricMessageBox.critical(self, self.tr("Subversion Error"), msg)
+
     @pyqtSlot(QDate)
     def on_fromDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(QDate)
     def on_toDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(int)
     def on_fieldCombo_activated(self, index):
         """
         Private slot called, when a new filter field is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(str)
     def on_rxEdit_textChanged(self, txt):
         """
         Private slot called, when a filter expression is entered.
-        
+
         @param txt filter expression (string)
         """
         self.__filterLogs()
-    
+
     def __filterLogs(self):
         """
         Private method to filter the log entries.
@@ -588,21 +570,20 @@
                 fieldIndex = 0
                 txt = self.rxEdit.text()
                 if txt.startswith("^"):
-                    searchRx = re.compile(
-                        r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
+                    searchRx = re.compile(r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
                 else:
                     searchRx = re.compile(txt, re.IGNORECASE)
             else:
                 fieldIndex = 3
                 searchRx = re.compile(self.rxEdit.text(), re.IGNORECASE)
-            
+
             currentItem = self.logTree.currentItem()
             for topIndex in range(self.logTree.topLevelItemCount()):
                 topItem = self.logTree.topLevelItem(topIndex)
                 if (
-                    topItem.text(2) <= to_ and
-                    topItem.text(2) >= from_ and
-                    searchRx.search(topItem.text(fieldIndex)) is not None
+                    topItem.text(2) <= to_
+                    and topItem.text(2) >= from_
+                    and searchRx.search(topItem.text(fieldIndex)) is not None
                 ):
                     topItem.setHidden(False)
                     if topItem is currentItem:
@@ -612,19 +593,20 @@
                     if topItem is currentItem:
                         self.messageEdit.clear()
                         self.filesTree.clear()
-    
+
     @pyqtSlot(bool)
     def on_stopCheckBox_clicked(self, checked):
         """
         Private slot called, when the stop on copy/move checkbox is clicked.
-        
+
         @param checked flag indicating the check box state (boolean)
         """
-        self.vcs.getPlugin().setPreferences("StopLogOnCopy",
-                                            int(self.stopCheckBox.isChecked()))
+        self.vcs.getPlugin().setPreferences(
+            "StopLogOnCopy", int(self.stopCheckBox.isChecked())
+        )
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -633,7 +615,7 @@
         itm = self.logTree.itemAbove(self.logTree.currentItem())
         if itm:
             self.logTree.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLoginDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnLoginDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing the login dialog for pysvn.
     """
+
     def __init__(self, realm, username, may_save, parent=None):
         """
         Constructor
-        
+
         @param realm name of the realm of the requested credentials (string)
         @param username username as supplied by subversion (string)
         @param may_save flag indicating, that subversion is willing to save
@@ -28,24 +29,26 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.realmLabel.setText(
-            self.tr("<b>Enter login data for realm {0}.</b>")
-            .format(realm))
+            self.tr("<b>Enter login data for realm {0}.</b>").format(realm)
+        )
         self.usernameEdit.setText(username)
         self.saveCheckBox.setEnabled(may_save)
         if not may_save:
             self.saveCheckBox.setChecked(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public method to retrieve the login data.
-        
+
         @return tuple of three values (username, password, save)
         """
-        return (self.usernameEdit.text(),
-                self.passwordEdit.text(),
-                self.saveCheckBox.isChecked())
+        return (
+            self.usernameEdit.text(),
+            self.passwordEdit.text(),
+            self.saveCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnMergeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnMergeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,11 +18,11 @@
     """
     Class implementing a dialog to enter the data for a merge operation.
     """
-    def __init__(self, mergelist1, mergelist2, targetlist, force=False,
-                 parent=None):
+
+    def __init__(self, mergelist1, mergelist2, targetlist, force=False, parent=None):
         """
         Constructor
-        
+
         @param mergelist1 list of previously entered URLs/revisions
             (list of strings)
         @param mergelist2 list of previously entered URLs/revisions
@@ -33,65 +33,70 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
+
         self.forceCheckBox.setChecked(force)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
-        self.rx_url = re.compile('(?:file:|svn:|svn+ssh:|http:|https:)//.+')
-        self.rx_rev = re.compile('\\d+')
-        
+
+        self.rx_url = re.compile("(?:file:|svn:|svn+ssh:|http:|https:)//.+")
+        self.rx_rev = re.compile("\\d+")
+
         self.tag1Combo.clear()
         self.tag1Combo.addItems(mergelist1)
         self.tag2Combo.clear()
         self.tag2Combo.addItems(mergelist2)
         self.targetCombo.clear()
         self.targetCombo.addItems(targetlist)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __enableOkButton(self):
         """
         Private method used to enable/disable the OK-button.
         """
         self.okButton.setDisabled(
-            self.tag1Combo.currentText() == "" or
-            self.tag2Combo.currentText() == "" or
-            not (
-                (bool(self.rx_url.fullmatch(self.tag1Combo.currentText())) and
-                 bool(self.rx_url.fullmatch(self.tag2Combo.currentText()))) or
-                (bool(self.rx_rev.fullmatch(self.tag1Combo.currentText())) and
-                 bool(self.rx_rev.fullmatch(self.tag2Combo.currentText())))
+            self.tag1Combo.currentText() == ""
+            or self.tag2Combo.currentText() == ""
+            or not (
+                (
+                    bool(self.rx_url.fullmatch(self.tag1Combo.currentText()))
+                    and bool(self.rx_url.fullmatch(self.tag2Combo.currentText()))
+                )
+                or (
+                    bool(self.rx_rev.fullmatch(self.tag1Combo.currentText()))
+                    and bool(self.rx_rev.fullmatch(self.tag2Combo.currentText()))
+                )
             )
         )
-        
+
     def on_tag1Combo_editTextChanged(self, text):
         """
         Private slot to handle the tag1Combo editTextChanged signal.
-        
+
         @param text text of the combo (string)
         """
         self.__enableOkButton()
-        
+
     def on_tag2Combo_editTextChanged(self, text):
         """
         Private slot to handle the tag2Combo editTextChanged signal.
-        
+
         @param text text of the combo (string)
         """
         self.__enableOkButton()
-        
+
     def getParameters(self):
         """
         Public method to retrieve the merge data.
-        
+
         @return tuple naming two tag names or two revisions, a target and
             a flag indicating a forced merge (string, string, string, boolean)
         """
-        return (self.tag1Combo.currentText(),
-                self.tag2Combo.currentText(),
-                self.targetCombo.currentText(),
-                self.forceCheckBox.isChecked())
+        return (
+            self.tag1Combo.currentText(),
+            self.tag2Combo.currentText(),
+            self.targetCombo.currentText(),
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnNewProjectOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnNewProjectOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,94 +27,92 @@
     Class implementing the Options Dialog for a new project from the
     repository.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcsProjectDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.vcsUrlPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.protocolCombo.addItems(ConfigSvnProtocols)
-        
+
         hd = Utilities.toNativeSeparators(QDir.homePath())
-        hd = os.path.join(hd, 'subversionroot')
+        hd = os.path.join(hd, "subversionroot")
         self.vcsUrlPicker.setText(hd)
-        
+
         self.vcs = vcs
-        
+
         self.localPath = hd
         self.networkPath = "localhost/"
         self.localProtocol = True
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
         self.vcsProjectDirPicker.setText(self.__initPaths[0])
-        
+
         self.resize(self.width(), self.minimumSizeHint().height())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_vcsProjectDirPicker_textChanged(self, txt):
         """
         Private slot to handle a change of the project directory.
-        
+
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            Utilities.fromNativeSeparators(txt) not in self.__initPaths)
-        
+            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+        )
+
     @pyqtSlot()
     def on_vcsUrlPicker_pickerButtonClicked(self):
         """
         Private slot to display a repository browser dialog.
         """
         from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
         dlg = SvnRepoBrowserDialog(self.vcs, mode="select", parent=self)
-        dlg.start(
-            self.protocolCombo.currentText() + self.vcsUrlPicker.text())
+        dlg.start(self.protocolCombo.currentText() + self.vcsUrlPicker.text())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             url = dlg.getSelectedUrl()
             if url:
                 protocol = url.split("://")[0]
                 path = url.split("://")[1]
                 self.protocolCombo.setCurrentIndex(
-                    self.protocolCombo.findText(protocol + "://"))
+                    self.protocolCombo.findText(protocol + "://")
+                )
                 self.vcsUrlPicker.setText(path)
-        
+
     def on_layoutCheckBox_toggled(self, checked):
         """
         Private slot to handle the change of the layout checkbox.
-        
+
         @param checked flag indicating the state of the checkbox (boolean)
         """
         self.vcsTagLabel.setEnabled(checked)
         self.vcsTagEdit.setEnabled(checked)
         if not checked:
             self.vcsTagEdit.clear()
-        
+
     @pyqtSlot(int)
     def on_protocolCombo_activated(self, index):
         """
         Private slot to switch the status of the directory selection button.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -132,29 +130,28 @@
                 self.vcsUrlLabel.setText(self.tr("&URL:"))
                 self.localProtocol = False
                 self.vcsUrlPicker.setMode(EricPathPickerModes.CUSTOM_MODE)
-    
+
     @pyqtSlot(str)
     def on_vcsUrlPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the line edit (string)
         """
         enable = "://" not in txt
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a tuple of a string (project directory) and a dictionary
             containing the data entered.
         """
         scheme = self.protocolCombo.currentText()
         url = self.vcsUrlPicker.text()
         vcsdatadict = {
-            "url": '{0}{1}'.format(scheme, url),
+            "url": "{0}{1}".format(scheme, url),
             "tag": self.vcsTagEdit.text(),
             "standardLayout": self.layoutCheckBox.isChecked(),
         }
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,59 +26,61 @@
     Class implementing a dialog to enter options used to start a project in the
     repository.
     """
+
     def __init__(self, vcs, project, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param project reference to the project object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcsUrlPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.project = project
-        
+
         self.protocolCombo.addItems(ConfigSvnProtocols)
-        
+
         hd = Utilities.toNativeSeparators(QDir.homePath())
-        hd = os.path.join(hd, 'subversionroot')
+        hd = os.path.join(hd, "subversionroot")
         self.vcsUrlPicker.setText(hd)
-        
+
         self.vcs = vcs
-        
+
         self.localPath = hd
         self.networkPath = "localhost/"
         self.localProtocol = True
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot()
     def on_vcsUrlPicker_pickerButtonClicked(self):
         """
         Private slot to display a repository browser dialog.
         """
         from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
         dlg = SvnRepoBrowserDialog(self.vcs, mode="select", parent=self)
-        dlg.start(
-            self.protocolCombo.currentText() + self.vcsUrlPicker.text())
+        dlg.start(self.protocolCombo.currentText() + self.vcsUrlPicker.text())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             url = dlg.getSelectedUrl()
             if url:
                 protocol = url.split("://")[0]
                 path = url.split("://")[1]
                 self.protocolCombo.setCurrentIndex(
-                    self.protocolCombo.findText(protocol + "://"))
+                    self.protocolCombo.findText(protocol + "://")
+                )
                 self.vcsUrlPicker.setText(path)
-        
+
     @pyqtSlot(int)
     def on_protocolCombo_activated(self, index):
         """
         Private slot to switch the status of the directory selection button.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -94,28 +96,27 @@
                 self.vcsUrlPicker.setText(self.networkPath)
                 self.vcsUrlLabel.setText(self.tr("&URL:"))
                 self.localProtocol = False
-    
+
     @pyqtSlot(str)
     def on_vcsUrlPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the line edit (string)
         """
         enable = "://" not in txt
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a dictionary containing the data entered
         """
         scheme = self.protocolCombo.currentText()
         url = self.vcsUrlPicker.text()
         vcsdatadict = {
-            "url": '{0}{1}'.format(scheme, url),
+            "url": "{0}{1}".format(scheme, url),
             "message": self.vcsLogEdit.text(),
             "standardLayout": self.layoutCheckBox.isChecked(),
         }
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropDelDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropDelDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,40 +16,39 @@
     """
     Class implementing a dialog to enter the data for a new property.
     """
+
     def __init__(self, recursive, parent=None):
         """
         Constructor
-        
+
         @param recursive flag indicating a recursive set is requested
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.recurseCheckBox.setChecked(recursive)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_propNameEdit_textChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text ignored
         """
         self.okButton.setDisabled(text == "")
-    
+
     def getData(self):
         """
         Public slot used to retrieve the data entered into the dialog.
-        
+
         @return tuple of two values giving the property name and a flag
             indicating, that this property should be applied recursively.
             (string, boolean)
         """
-        return (self.propNameEdit.text(),
-                self.recurseCheckBox.isChecked())
+        return (self.propNameEdit.text(), self.recurseCheckBox.isChecked())
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QApplication, QDialogButtonBox, QTreeWidgetItem
+    QWidget,
+    QHeaderView,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
@@ -28,88 +32,84 @@
     Class implementing a dialog to show the output of the svn proplist command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.refreshButton.setToolTip(
-            self.tr("Press to refresh the properties display"))
+            self.tr("Press to refresh the properties display")
+        )
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.propsList.headerItem().setText(self.propsList.columnCount(), "")
-        self.propsList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.propsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.propsList.sortItems(
-            self.propsList.sortColumn(),
-            self.propsList.header().sortIndicatorOrder())
-        
+            self.propsList.sortColumn(), self.propsList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.propsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.propsList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.propsList.header().setStretchLastSection(True)
-        
+
     def __generateItem(self, path, propName, propValue):
         """
         Private method to generate a properties item in the properties list.
-        
+
         @param path file/directory name the property applies to (string)
         @param propName name of the property (string)
         @param propValue value of the property (string)
         """
         QTreeWidgetItem(self.propsList, [path, propName, propValue])
-        
+
     def start(self, fn, recursive=False):
         """
         Public slot to start the svn status command.
-        
+
         @param fn filename(s) (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
         self.errorGroup.hide()
-        
+
         self.propsList.clear()
-        
+
         self.__args = fn
         self.__recursive = recursive
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         self.refreshButton.setEnabled(False)
-        
+
         QApplication.processEvents()
         self.propsFound = False
         if isinstance(fn, list):
@@ -117,7 +117,7 @@
         else:
             dname, fname = self.vcs.splitPath(fn)
             fnames = [fname]
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
         with EricMutexLocker(self.vcs.vcsExecutionMutex):
@@ -128,20 +128,17 @@
                         for propName, propVal in list(prop.items()):
                             self.__generateItem(path, propName, propVal)
                             self.propsFound = True
-                        if (
-                            counter % 30 == 0 and
-                            self._clientCancelCallback()
-                        ):
+                        if counter % 30 == 0 and self._clientCancelCallback():
                             # check for cancel every 30 items
                             break
                     if self._clientCancelCallback():
                         break
             except pysvn.ClientError as e:
                 self.__showError(e.args[0])
-        
+
         self.__finish()
         os.chdir(cwd)
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
@@ -149,49 +146,42 @@
         """
         if not self.propsFound:
             self.__generateItem("", self.tr("None"), "")
-        
+
         self.__resort()
         self.__resizeColumns()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
-        
+
         self._cancel()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-        
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.__args, recursive=self.__recursive)
-        
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropSetDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropSetDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,29 @@
     """
     Class implementing a dialog to enter the data for a new property.
     """
+
     def __init__(self, recursive, parent=None):
         """
         Constructor
-        
+
         @param recursive flag indicating a recursive set is requested
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.recurseCheckBox.setChecked(recursive)
-        
+
     def getData(self):
         """
         Public slot used to retrieve the data entered into the dialog.
-        
+
         @return tuple of three values giving the property name, the text
             of the property and a flag indicating, that this property
             should be applied recursively. (string, string, boolean)
         """
-        return (self.propNameEdit.text(),
-                self.propTextEdit.toPlainText(),
-                self.recurseCheckBox.isChecked())
+        return (
+            self.propNameEdit.text(),
+            self.propTextEdit.toPlainText(),
+            self.recurseCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRelocateDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRelocateDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,27 @@
     """
     Class implementing a dialog to enter the data to relocate the workspace.
     """
+
     def __init__(self, currUrl, parent=None):
         """
         Constructor
-        
+
         @param currUrl current repository URL (string)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.currUrlLabel.setText(currUrl)
         self.newUrlEdit.setText(currUrl)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public slot used to retrieve the data entered into the dialog.
-        
+
         @return the new repository URL (string) and an indication, if
             the relocate is inside the repository (boolean)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 
 from PyQt6.QtCore import Qt, pyqtSlot
 from PyQt6.QtWidgets import (
-    QHeaderView, QDialog, QApplication, QDialogButtonBox, QTreeWidgetItem
+    QHeaderView,
+    QDialog,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -31,10 +35,11 @@
     """
     Class implementing the subversion repository browser dialog.
     """
+
     def __init__(self, vcs, mode="browse", parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param mode mode of the dialog (string, "browse" or "select")
         @param parent parent widget (QWidget)
@@ -43,59 +48,57 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.repoTree.headerItem().setText(self.repoTree.columnCount(), "")
         self.repoTree.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.vcs = vcs
         self.mode = mode
-        
+
         if self.mode == "select":
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
             self.buttonBox.button(QDialogButtonBox.StandardButton.Close).hide()
         else:
             self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).hide()
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).hide()
-        
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).hide()
+
         self.__dirIcon = UI.PixmapCache.getIcon("dirClosed")
         self.__fileIcon = UI.PixmapCache.getIcon("fileMisc")
-        
+
         self.__urlRole = Qt.ItemDataRole.UserRole
         self.__ignoreExpand = False
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
         self.show()
         QApplication.processEvents()
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.repoTree.sortItems(
-            self.repoTree.sortColumn(),
-            self.repoTree.header().sortIndicatorOrder())
-    
+            self.repoTree.sortColumn(), self.repoTree.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the tree columns.
         """
-        self.repoTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.repoTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.repoTree.header().setStretchLastSection(True)
-    
-    def __generateItem(self, parent, repopath, revision, author, size, date,
-                       nodekind, url):
+
+    def __generateItem(
+        self, parent, repopath, revision, author, size, date, nodekind, url
+    ):
         """
         Private method to generate a tree item in the repository tree.
-        
+
         @param parent parent of the item to be created (QTreeWidget or
             QTreeWidgetItem)
         @param repopath path of the item (string)
@@ -108,128 +111,138 @@
         @return reference to the generated item (QTreeWidgetItem)
         """
         path = url if repopath == "/" else url.split("/")[-1]
-        
+
         rev = revision.number if revision else ""
         dt = formatTime(date) if date else ""
         if author is None:
             author = ""
-        
+
         itm = QTreeWidgetItem(parent)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, path)
         itm.setData(1, Qt.ItemDataRole.DisplayRole, rev)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(3, Qt.ItemDataRole.DisplayRole, size)
         itm.setData(4, Qt.ItemDataRole.DisplayRole, dt)
-        
+
         if nodekind == pysvn.node_kind.dir:
             itm.setIcon(0, self.__dirIcon)
             itm.setChildIndicatorPolicy(
-                QTreeWidgetItem.ChildIndicatorPolicy.ShowIndicator)
+                QTreeWidgetItem.ChildIndicatorPolicy.ShowIndicator
+            )
         elif nodekind == pysvn.node_kind.file:
             itm.setIcon(0, self.__fileIcon)
-        
+
         itm.setData(0, self.__urlRole, url)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignLeft)
-        
+
         return itm
-    
+
     def __listRepo(self, url, parent=None):
         """
         Private method to perform the svn list command.
-        
+
         @param url the repository URL to browser (string)
         @param parent reference to the item, the data should be appended to
             (QTreeWidget or QTreeWidgetItem)
         """
         if parent is None:
             parent = self.repoTree
-        
+
         with EricOverrideCursor():
             try:
                 with EricMutexLocker(self.vcs.vcsExecutionMutex):
                     entries = self.client.list(url, recurse=False)
                 firstTime = parent == self.repoTree
                 for dirent, _lock in entries:
-                    if (
-                        (firstTime and dirent["path"] != url) or
-                        (parent != self.repoTree and dirent["path"] == url)
+                    if (firstTime and dirent["path"] != url) or (
+                        parent != self.repoTree and dirent["path"] == url
                     ):
                         continue
                     if firstTime:
                         if dirent["repos_path"] != "/":
-                            repoUrl = dirent["path"].replace(
-                                dirent["repos_path"], "")
+                            repoUrl = dirent["path"].replace(dirent["repos_path"], "")
                         else:
                             repoUrl = dirent["path"]
                         if repoUrl != url:
                             self.__ignoreExpand = True
                             itm = self.__generateItem(
-                                parent, "/", "", "", 0, "",
-                                pysvn.node_kind.dir, repoUrl)
+                                parent, "/", "", "", 0, "", pysvn.node_kind.dir, repoUrl
+                            )
                             itm.setExpanded(True)
                             parent = itm
                             urlPart = repoUrl
-                            for element in (
-                                dirent["repos_path"].split("/")[:-1]
-                            ):
+                            for element in dirent["repos_path"].split("/")[:-1]:
                                 if element:
-                                    urlPart = "{0}/{1}".format(urlPart,
-                                                               element)
+                                    urlPart = "{0}/{1}".format(urlPart, element)
                                     itm = self.__generateItem(
-                                        parent, element, "", "", 0, "",
-                                        pysvn.node_kind.dir, urlPart)
+                                        parent,
+                                        element,
+                                        "",
+                                        "",
+                                        0,
+                                        "",
+                                        pysvn.node_kind.dir,
+                                        urlPart,
+                                    )
                                     itm.setExpanded(True)
                                     parent = itm
                             self.__ignoreExpand = False
                     itm = self.__generateItem(
-                        parent, dirent["repos_path"],
-                        dirent["created_rev"], dirent["last_author"],
-                        dirent["size"], dirent["time"], dirent["kind"],
-                        dirent["path"])
+                        parent,
+                        dirent["repos_path"],
+                        dirent["created_rev"],
+                        dirent["last_author"],
+                        dirent["size"],
+                        dirent["time"],
+                        dirent["kind"],
+                        dirent["path"],
+                    )
                 self.__resort()
                 self.__resizeColumns()
             except pysvn.ClientError as e:
                 self.__showError(e.args[0])
             except AttributeError:
                 self.__showError(
-                    self.tr("The installed version of PySvn should be "
-                            "1.4.0 or better."))
-    
+                    self.tr(
+                        "The installed version of PySvn should be " "1.4.0 or better."
+                    )
+                )
+
     def __normalizeUrl(self, url):
         """
         Private method to normalite the url.
-        
+
         @param url the url to normalize (string)
         @return normalized URL (string)
         """
         if url.endswith("/"):
             return url[:-1]
         return url
-    
+
     def start(self, url):
         """
         Public slot to start the svn info command.
-        
+
         @param url the repository URL to browser (string)
         """
         self.repoTree.clear()
-        
+
         self.url = ""
-        
+
         url = self.__normalizeUrl(url)
         if self.urlCombo.findText(url) == -1:
             self.urlCombo.addItem(url)
-    
+
     @pyqtSlot(int)
     def on_urlCombo_currentIndexChanged(self, index):
         """
         Private slot called, when a new repository URL is entered or selected.
-        
+
         @param index of the current item
         @type int
         """
@@ -239,61 +252,57 @@
             self.url = url
             self.repoTree.clear()
             self.__listRepo(url)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_repoTree_itemExpanded(self, item):
         """
         Private slot called when an item is expanded.
-        
+
         @param item reference to the item to be expanded (QTreeWidgetItem)
         """
         if not self.__ignoreExpand:
             url = item.data(0, self.__urlRole)
             self.__listRepo(url, item)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_repoTree_itemCollapsed(self, item):
         """
         Private slot called when an item is collapsed.
-        
+
         @param item reference to the item to be collapsed (QTreeWidgetItem)
         """
         for child in item.takeChildren():
             del child
-    
+
     @pyqtSlot()
     def on_repoTree_itemSelectionChanged(self):
         """
         Private slot called when the selection changes.
         """
         if self.mode == "select":
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(True)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(True)
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
-        EricMessageBox.critical(
-            self,
-            self.tr("Subversion Error"),
-            msg)
-    
+        EricMessageBox.critical(self, self.tr("Subversion Error"), msg)
+
     def accept(self):
         """
         Public slot called when the dialog is accepted.
         """
         if self.focusWidget() == self.urlCombo:
             return
-        
+
         super().accept()
-    
+
     def getSelectedUrl(self):
         """
         Public method to retrieve the selected repository URL.
-        
+
         @return the selected repository URL (string)
         """
         items = self.repoTree.selectedItems()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRevisionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnRevisionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,25 +18,26 @@
     Class implementing a dialog to enter the revisions for the svn diff
     command.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of the dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.date1Edit.setDate(QDate.currentDate())
         self.date2Edit.setDate(QDate.currentDate())
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __getRevision(self, no):
         """
         Private method to generate the revision.
-        
+
         @param no revision number to generate (1 or 2)
         @return revision (integer or string)
         """
@@ -62,13 +63,15 @@
             baseButton = self.base2Button
             committedButton = self.committed2Button
             prevButton = self.prev2Button
-        
+
         if numberButton.isChecked():
             return numberSpinBox.value()
         elif dateButton.isChecked():
             return "{{{0}}}".format(
-                QDateTime(dateEdit.date(), timeEdit.time())
-                .toString(Qt.DateFormat.ISODate))
+                QDateTime(dateEdit.date(), timeEdit.time()).toString(
+                    Qt.DateFormat.ISODate
+                )
+            )
         elif headButton.isChecked():
             return "HEAD"
         elif workingButton.isChecked():
@@ -79,16 +82,16 @@
             return "COMMITTED"
         elif prevButton.isChecked():
             return "PREV"
-        
+
         return ""
-        
+
     def getRevisions(self):
         """
         Public method to get the revisions.
-        
+
         @return list two integers or strings
         """
         rev1 = self.__getRevision(1)
         rev2 = self.__getRevision(2)
-        
+
         return [rev1, rev2]
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,8 +14,12 @@
 
 from PyQt6.QtCore import Qt, pyqtSlot
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QApplication, QMenu, QDialogButtonBox,
-    QTreeWidgetItem
+    QWidget,
+    QHeaderView,
+    QApplication,
+    QMenu,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -38,17 +42,18 @@
     Class implementing a dialog to show the output of the svn status command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
-        
+
         self.__toBeCommittedColumn = 0
         self.__changelistColumn = 1
         self.__statusColumn = 2
@@ -60,149 +65,178 @@
         self.__upToDateColumn = 8
         self.__pathColumn = 12
         self.__lastColumn = self.statusList.columnCount()
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the status display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the status display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.diff = None
         self.vcs = vcs
         self.vcs.committed.connect(self.__committed)
-        
+
         self.statusList.headerItem().setText(self.__lastColumn, "")
-        self.statusList.header().setSortIndicator(self.__pathColumn,
-                                                  Qt.SortOrder.AscendingOrder)
+        self.statusList.header().setSortIndicator(
+            self.__pathColumn, Qt.SortOrder.AscendingOrder
+        )
         if pysvn.svn_version < (1, 5, 0) or pysvn.version < (1, 6, 0):
             self.statusList.header().hideSection(self.__changelistColumn)
-        
+
         self.menuactions = []
         self.menu = QMenu()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Commit changes to repository..."), self.__commit))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Deselect all from commit"), self.__commitDeselectAll))
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Commit changes to repository..."), self.__commit
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Select all for commit"), self.__commitSelectAll
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Deselect all from commit"), self.__commitDeselectAll
+            )
+        )
         self.menu.addSeparator()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Add to repository"), self.__add))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Show differences"), self.__diff))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Show differences side-by-side"), self.__sbsDiff))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Revert changes"), self.__revert))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Restore Missing"), self.__restoreMissing))
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Add to repository"), self.__add)
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Show differences"), self.__diff)
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Show differences side-by-side"), self.__sbsDiff
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Revert changes"), self.__revert)
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Restore Missing"), self.__restoreMissing)
+        )
         if pysvn.svn_version >= (1, 5, 0) and pysvn.version >= (1, 6, 0):
             self.menu.addSeparator()
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Add to Changelist"), self.__addToChangelist))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__removeFromChangelist))
+            self.menuactions.append(
+                self.menu.addAction(
+                    self.tr("Add to Changelist"), self.__addToChangelist
+                )
+            )
+            self.menuactions.append(
+                self.menu.addAction(
+                    self.tr("Remove from Changelist"), self.__removeFromChangelist
+                )
+            )
         if self.vcs.version >= (1, 2, 0):
             self.menu.addSeparator()
+            self.menuactions.append(self.menu.addAction(self.tr("Lock"), self.__lock))
             self.menuactions.append(
-                self.menu.addAction(self.tr("Lock"), self.__lock))
+                self.menu.addAction(self.tr("Unlock"), self.__unlock)
+            )
             self.menuactions.append(
-                self.menu.addAction(self.tr("Unlock"), self.__unlock))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Break lock"),
-                self.__breakLock))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Steal lock"),
-                self.__stealLock))
+                self.menu.addAction(self.tr("Break lock"), self.__breakLock)
+            )
+            self.menuactions.append(
+                self.menu.addAction(self.tr("Steal lock"), self.__stealLock)
+            )
         self.menu.addSeparator()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Adjust column sizes"),
-            self.__resizeColumns))
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Adjust column sizes"), self.__resizeColumns)
+        )
         for act in self.menuactions:
             act.setEnabled(False)
-        
-        self.statusList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.statusList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+
+        self.statusList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.statusList.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.modifiedIndicators = [
             self.tr(svnStatusMap[pysvn.wc_status_kind.added]),
             self.tr(svnStatusMap[pysvn.wc_status_kind.deleted]),
-            self.tr(svnStatusMap[pysvn.wc_status_kind.modified])
+            self.tr(svnStatusMap[pysvn.wc_status_kind.modified]),
         ]
-        
+
         self.missingIndicators = [
             self.tr(svnStatusMap[pysvn.wc_status_kind.missing]),
         ]
-        
+
         self.unversionedIndicators = [
             self.tr(svnStatusMap[pysvn.wc_status_kind.unversioned]),
         ]
-        
+
         self.lockedIndicators = [
-            self.tr('locked'),
+            self.tr("locked"),
         ]
-        
+
         self.stealBreakLockIndicators = [
-            self.tr('other lock'),
-            self.tr('stolen lock'),
-            self.tr('broken lock'),
+            self.tr("other lock"),
+            self.tr("stolen lock"),
+            self.tr("broken lock"),
         ]
-        
+
         self.unlockedIndicators = [
-            self.tr('not locked'),
+            self.tr("not locked"),
         ]
-        
+
         self.lockinfo = {
-            ' ': self.tr('not locked'),
-            'L': self.tr('locked'),
-            'O': self.tr('other lock'),
-            'S': self.tr('stolen lock'),
-            'B': self.tr('broken lock'),
+            " ": self.tr("not locked"),
+            "L": self.tr("locked"),
+            "O": self.tr("other lock"),
+            "S": self.tr("stolen lock"),
+            "B": self.tr("broken lock"),
         }
         self.yesno = [
-            self.tr('no'),
-            self.tr('yes'),
+            self.tr("no"),
+            self.tr("yes"),
         ]
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
         self.show()
         QApplication.processEvents()
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.statusList.sortItems(
-            self.statusList.sortColumn(),
-            self.statusList.header().sortIndicatorOrder())
-        
+            self.statusList.sortColumn(), self.statusList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.statusList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.statusList.header().setStretchLastSection(True)
-        
-    def __generateItem(self, changelist, status, propStatus, locked, history,
-                       switched, lockinfo, uptodate, revision, change, author,
-                       path):
+
+    def __generateItem(
+        self,
+        changelist,
+        status,
+        propStatus,
+        locked,
+        history,
+        switched,
+        lockinfo,
+        uptodate,
+        revision,
+        change,
+        author,
+        path,
+    ):
         """
         Private method to generate a status item in the status list.
-        
+
         @param changelist name of the changelist (string)
         @param status text status (pysvn.wc_status_kind)
         @param propStatus property status (pysvn.wc_status_kind)
@@ -221,8 +255,7 @@
         itm.setData(0, Qt.ItemDataRole.DisplayRole, "")
         itm.setData(1, Qt.ItemDataRole.DisplayRole, changelist)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, statusText)
-        itm.setData(3, Qt.ItemDataRole.DisplayRole,
-                    self.tr(svnStatusMap[propStatus]))
+        itm.setData(3, Qt.ItemDataRole.DisplayRole, self.tr(svnStatusMap[propStatus]))
         itm.setData(4, Qt.ItemDataRole.DisplayRole, self.yesno[locked])
         itm.setData(5, Qt.ItemDataRole.DisplayRole, self.yesno[history])
         itm.setData(6, Qt.ItemDataRole.DisplayRole, self.yesno[switched])
@@ -232,7 +265,7 @@
         itm.setData(10, Qt.ItemDataRole.DisplayRole, change)
         itm.setData(11, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(12, Qt.ItemDataRole.DisplayRole, path)
-        
+
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignHCenter)
@@ -245,36 +278,36 @@
         itm.setTextAlignment(10, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(11, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(12, Qt.AlignmentFlag.AlignLeft)
-        
-        if (
-            status in [pysvn.wc_status_kind.added,
-                       pysvn.wc_status_kind.deleted,
-                       pysvn.wc_status_kind.modified] or
-            propStatus in [pysvn.wc_status_kind.added,
-                           pysvn.wc_status_kind.deleted,
-                           pysvn.wc_status_kind.modified]
-        ):
+
+        if status in [
+            pysvn.wc_status_kind.added,
+            pysvn.wc_status_kind.deleted,
+            pysvn.wc_status_kind.modified,
+        ] or propStatus in [
+            pysvn.wc_status_kind.added,
+            pysvn.wc_status_kind.deleted,
+            pysvn.wc_status_kind.modified,
+        ]:
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
-            itm.setCheckState(self.__toBeCommittedColumn,
-                              Qt.CheckState.Checked)
+            itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
         else:
             itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
-        
+
         if statusText not in self.__statusFilters:
             self.__statusFilters.append(statusText)
-        
+
     def start(self, fn):
         """
         Public slot to start the svn status command.
-        
+
         @param fn filename(s)/directoryname(s) to show the status of
             (string or list of strings)
         """
         self.errorGroup.hide()
-        
+
         for act in self.menuactions:
             act.setEnabled(False)
-        
+
         self.addButton.setEnabled(False)
         self.commitButton.setEnabled(False)
         self.diffButton.setEnabled(False)
@@ -286,39 +319,36 @@
         self.__statusFilters = []
         self.statusList.clear()
         self.shouldCancel = False
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         self.refreshButton.setEnabled(False)
-        
+
         self.args = fn
-        
-        self.setWindowTitle(self.tr('Subversion Status'))
+
+        self.setWindowTitle(self.tr("Subversion Status"))
         self.activateWindow()
         self.raise_()
-        
+
         if isinstance(fn, list):
             self.dname, fnames = self.vcs.splitPathList(fn)
         else:
             self.dname, fname = self.vcs.splitPath(fn)
             fnames = [fname]
-        
-        opts = self.vcs.options['global'] + self.vcs.options['status']
+
+        opts = self.vcs.options["global"] + self.vcs.options["status"]
         verbose = "--verbose" in opts
         recurse = "--non-recursive" not in opts
         update = "--show-updates" in opts
-        
+
         hideChangelistColumn = True
         hidePropertyStatusColumn = True
         hideLockColumns = True
         hideUpToDateColumn = True
         hideHistoryColumn = True
         hideSwitchedColumn = True
-        
+
         with EricOverrideCursor():
             cwd = os.getcwd()
             os.chdir(self.dname)
@@ -327,100 +357,90 @@
                     for name in fnames:
                         # step 1: determine changelists and their files
                         changelistsDict = {}
-                        if hasattr(self.client, 'get_changelist'):
+                        if hasattr(self.client, "get_changelist"):
                             if recurse:
                                 depth = pysvn.depth.infinity
                             else:
                                 depth = pysvn.depth.immediate
-                            changelists = self.client.get_changelist(
-                                name, depth=depth)
+                            changelists = self.client.get_changelist(name, depth=depth)
                             for fpath, changelist in changelists:
                                 fpath = Utilities.normcasepath(fpath)
                                 changelistsDict[fpath] = changelist
                         hideChangelistColumn = (
                             hideChangelistColumn and len(changelistsDict) == 0
                         )
-                        
+
                         # step 2: determine status of files
                         allFiles = self.client.status(
-                            name, recurse=recurse, get_all=verbose,
-                            ignore=True, update=update)
+                            name,
+                            recurse=recurse,
+                            get_all=verbose,
+                            ignore=True,
+                            update=update,
+                        )
                         for counter, file in enumerate(allFiles):
                             uptodate = True
-                            if (
-                                file.repos_text_status !=
-                                pysvn.wc_status_kind.none
-                            ):
+                            if file.repos_text_status != pysvn.wc_status_kind.none:
                                 uptodate = (
-                                    uptodate and
-                                    file.repos_text_status !=
-                                    pysvn.wc_status_kind.modified
+                                    uptodate
+                                    and file.repos_text_status
+                                    != pysvn.wc_status_kind.modified
                                 )
-                            if (
-                                file.repos_prop_status !=
-                                pysvn.wc_status_kind.none
-                            ):
+                            if file.repos_prop_status != pysvn.wc_status_kind.none:
                                 uptodate = (
-                                    uptodate and
-                                    file.repos_prop_status !=
-                                    pysvn.wc_status_kind.modified
+                                    uptodate
+                                    and file.repos_prop_status
+                                    != pysvn.wc_status_kind.modified
                                 )
-                            
+
                             lockState = " "
                             if (
-                                file.entry is not None and
-                                hasattr(file.entry, 'lock_token') and
-                                file.entry.lock_token is not None
+                                file.entry is not None
+                                and hasattr(file.entry, "lock_token")
+                                and file.entry.lock_token is not None
                             ):
                                 lockState = "L"
-                            if hasattr(file, 'repos_lock') and update:
-                                if (
-                                    lockState == "L" and
-                                    file.repos_lock is None
-                                ):
+                            if hasattr(file, "repos_lock") and update:
+                                if lockState == "L" and file.repos_lock is None:
                                     lockState = "B"
-                                elif (
-                                    lockState == " " and
-                                    file.repos_lock is not None
-                                ):
+                                elif lockState == " " and file.repos_lock is not None:
                                     lockState = "O"
                                 elif (
-                                    lockState == "L" and
-                                    file.repos_lock is not None and
-                                    file.entry.lock_token !=
-                                        file.repos_lock["token"]
+                                    lockState == "L"
+                                    and file.repos_lock is not None
+                                    and file.entry.lock_token
+                                    != file.repos_lock["token"]
                                 ):
                                     lockState = "S"
-                            
+
                             fpath = Utilities.normcasepath(
-                                os.path.join(self.dname, file.path))
-                            changelist = (changelistsDict[fpath]
-                                          if fpath in changelistsDict else "")
-                            
+                                os.path.join(self.dname, file.path)
+                            )
+                            changelist = (
+                                changelistsDict[fpath]
+                                if fpath in changelistsDict
+                                else ""
+                            )
+
                             hidePropertyStatusColumn = (
-                                hidePropertyStatusColumn and
-                                file.prop_status in [
+                                hidePropertyStatusColumn
+                                and file.prop_status
+                                in [
                                     pysvn.wc_status_kind.none,
-                                    pysvn.wc_status_kind.normal
+                                    pysvn.wc_status_kind.normal,
                                 ]
                             )
                             hideLockColumns = (
-                                hideLockColumns and
-                                not file.is_locked and
-                                lockState == " "
-                            )
-                            hideUpToDateColumn = (
-                                hideUpToDateColumn and uptodate
+                                hideLockColumns
+                                and not file.is_locked
+                                and lockState == " "
                             )
-                            hideHistoryColumn = (
-                                hideHistoryColumn and
-                                not file.is_copied
-                            )
+                            hideUpToDateColumn = hideUpToDateColumn and uptodate
+                            hideHistoryColumn = hideHistoryColumn and not file.is_copied
                             hideSwitchedColumn = (
-                                hideSwitchedColumn and
-                                not file.is_switched
+                                hideSwitchedColumn and not file.is_switched
                             )
-                            
+
                             self.__generateItem(
                                 changelist,
                                 file.text_status,
@@ -430,103 +450,88 @@
                                 file.is_switched,
                                 lockState,
                                 uptodate,
-                                file.entry.revision.number if file.entry
-                                else "",
-                                file.entry.commit_revision.number
-                                if file.entry else "",
+                                file.entry.revision.number if file.entry else "",
+                                file.entry.commit_revision.number if file.entry else "",
                                 file.entry.commit_author if file.entry else "",
-                                file.path
+                                file.path,
                             )
-                            if (
-                                counter % 30 == 0 and
-                                self._clientCancelCallback()
-                            ):
+                            if counter % 30 == 0 and self._clientCancelCallback():
                                 # check for cancel every 30 items
                                 break
                         if self._clientCancelCallback():
                             break
             except pysvn.ClientError as e:
-                self.__showError(e.args[0] + '\n')
-            
-            self.statusList.setColumnHidden(self.__propStatusColumn,
-                                            hidePropertyStatusColumn)
-            self.statusList.setColumnHidden(self.__lockedColumn,
-                                            hideLockColumns)
-            self.statusList.setColumnHidden(self.__lockinfoColumn,
-                                            hideLockColumns)
-            self.statusList.setColumnHidden(self.__upToDateColumn,
-                                            hideUpToDateColumn)
-            self.statusList.setColumnHidden(self.__historyColumn,
-                                            hideHistoryColumn)
-            self.statusList.setColumnHidden(self.__switchedColumn,
-                                            hideSwitchedColumn)
-            self.statusList.setColumnHidden(self.__changelistColumn,
-                                            hideChangelistColumn)
+                self.__showError(e.args[0] + "\n")
+
+            self.statusList.setColumnHidden(
+                self.__propStatusColumn, hidePropertyStatusColumn
+            )
+            self.statusList.setColumnHidden(self.__lockedColumn, hideLockColumns)
+            self.statusList.setColumnHidden(self.__lockinfoColumn, hideLockColumns)
+            self.statusList.setColumnHidden(self.__upToDateColumn, hideUpToDateColumn)
+            self.statusList.setColumnHidden(self.__historyColumn, hideHistoryColumn)
+            self.statusList.setColumnHidden(self.__switchedColumn, hideSwitchedColumn)
+            self.statusList.setColumnHidden(
+                self.__changelistColumn, hideChangelistColumn
+            )
         self.__finish()
         os.chdir(cwd)
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
         self.__updateButtons()
         self.__updateCommitButton()
-        
+
         self.__statusFilters.sort()
         self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
-        
+
         for act in self.menuactions:
             act.setEnabled(True)
-        
+
         self.__resizeColumns()
         self.__resort()
-        
+
         self._cancel()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-        
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.args)
-        
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(msg)
         self.errors.ensureCursorVisible()
-    
+
     def __updateButtons(self):
         """
         Private method to update the VCS buttons status.
@@ -540,19 +545,19 @@
         self.sbsDiffButton.setEnabled(modified == 1)
         self.revertButton.setEnabled(modified)
         self.restoreButton.setEnabled(missing)
-    
+
     def __updateCommitButton(self):
         """
         Private method to update the Commit button status.
         """
         commitable = len(self.__getCommitableItems())
         self.commitButton.setEnabled(commitable)
-    
+
     @pyqtSlot(int)
     def on_statusFilterCombo_activated(self, index):
         """
         Private slot to react to the selection of a status filter.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -565,99 +570,101 @@
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(topItem.text(self.__statusColumn) != txt)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_statusList_itemChanged(self, item, column):
         """
         Private slot to act upon item changes.
-        
+
         @param item reference to the changed item (QTreeWidgetItem)
         @param column index of column that changed (integer)
         """
         if column == self.__toBeCommittedColumn:
             self.__updateCommitButton()
-    
+
     @pyqtSlot()
     def on_statusList_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_commitButton_clicked(self):
         """
         Private slot to handle the press of the Commit button.
         """
         self.__commit()
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to handle the press of the Add button.
         """
         self.__add()
-    
+
     @pyqtSlot()
     def on_diffButton_clicked(self):
         """
         Private slot to handle the press of the Differences button.
         """
         self.__diff()
-    
+
     @pyqtSlot()
     def on_sbsDiffButton_clicked(self):
         """
         Private slot to handle the press of the Side-by-Side Diff button.
         """
         self.__sbsDiff()
-    
+
     @pyqtSlot()
     def on_revertButton_clicked(self):
         """
         Private slot to handle the press of the Revert button.
         """
         self.__revert()
-    
+
     @pyqtSlot()
     def on_restoreButton_clicked(self):
         """
         Private slot to handle the press of the Restore button.
         """
         self.__restoreMissing()
-    
+
     ###########################################################################
     ## Context menu handling methods
     ###########################################################################
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the status list.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         self.menu.popup(self.statusList.mapToGlobal(coord))
-        
+
     def __commit(self):
         """
         Private slot to handle the Commit context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getCommitableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getCommitableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Commit"),
-                self.tr("""There are no entries selected to be"""
-                        """ committed."""))
+                self.tr("""There are no entries selected to be""" """ committed."""),
+            )
             return
-        
+
         if Preferences.getVCS("AutoSaveFiles"):
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
-        self.vcs.vcsCommit(names, '')
-       
+        self.vcs.vcsCommit(names, "")
+
     def __committed(self):
         """
         Private slot called after the commit has finished.
@@ -665,36 +672,40 @@
         if self.isVisible():
             self.on_refreshButton_clicked()
             self.vcs.checkVCSStatus()
-        
+
     def __commitSelectAll(self):
         """
         Private slot to select all entries for commit.
         """
         self.__commitSelect(True)
-    
+
     def __commitDeselectAll(self):
         """
         Private slot to deselect all entries from commit.
         """
         self.__commitSelect(False)
-    
+
     def __add(self):
         """
         Private slot to handle the Add context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getUnversionedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsAdd(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
@@ -704,137 +715,160 @@
         """
         Private slot to handle the Revert context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.raise_()
         self.activateWindow()
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-        
+
     def __restoreMissing(self):
         """
         Private slot to handle the Restore Missing context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Restore Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.on_refreshButton_clicked()
         self.vcs.checkVCSStatus()
-        
+
     def __diff(self):
         """
         Private slot to handle the Diff context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         if self.diff is None:
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self.vcs)
         self.diff.show()
         QApplication.processEvents()
         self.diff.start(names, refreshable=True)
-    
+
     def __sbsDiff(self):
         """
         Private slot to handle the Side-by-Side Diff context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Side-by-Side Diff"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
         elif len(names) > 1:
             EricMessageBox.information(
                 self,
                 self.tr("Side-by-Side Diff"),
-                self.tr("""Only one file with uncommitted changes"""
-                        """ must be selected."""))
+                self.tr(
+                    """Only one file with uncommitted changes"""
+                    """ must be selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsSbsDiff(names[0])
-    
+
     def __lock(self):
         """
         Private slot to handle the Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(self.unlockedIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.unlockedIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Lock"),
-                self.tr("""There are no unlocked files"""
-                        """ available/selected."""))
+                self.tr("""There are no unlocked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnLock(names, parent=self)
         self.on_refreshButton_clicked()
-        
+
     def __unlock(self):
         """
         Private slot to handle the Unlock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(self.lockedIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.lockedIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Unlock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnUnlock(names, parent=self)
         self.on_refreshButton_clicked()
-        
+
     def __breakLock(self):
         """
         Private slot to handle the Break Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(
-                     self.stealBreakLockIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.stealBreakLockIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Break Lock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnUnlock(names, parent=self, breakIt=True)
         self.on_refreshButton_clicked()
 
@@ -842,17 +876,18 @@
         """
         Private slot to handle the Break Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(
-                     self.stealBreakLockIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.stealBreakLockIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Steal Lock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnLock(names, parent=self, stealIt=True)
         self.on_refreshButton_clicked()
 
@@ -860,8 +895,10 @@
         """
         Private slot to add entries to a changelist.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getNonChangelistItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getNonChangelistItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
@@ -869,7 +906,7 @@
                 self.tr(
                     """There are no files available/selected not """
                     """belonging to a changelist."""
-                )
+                ),
             )
             return
         self.vcs.svnAddToChangelist(names)
@@ -879,8 +916,10 @@
         """
         Private slot to remove entries from their changelists.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getChangelistItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getChangelistItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
@@ -888,7 +927,7 @@
                 self.tr(
                     """There are no files available/selected belonging"""
                     """ to a changelist."""
-                )
+                ),
             )
             return
         self.vcs.svnRemoveFromChangelist(names)
@@ -897,39 +936,36 @@
     def __getCommitableItems(self):
         """
         Private method to retrieve all entries the user wants to commit.
-        
+
         @return list of all items, the user has checked
         """
         commitableItems = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
-            if (
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Checked
-            ):
+            if itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Checked:
                 commitableItems.append(itm)
         return commitableItems
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
         for itm in self.statusList.selectedItems():
             if (
-                itm.text(self.__statusColumn) in self.modifiedIndicators or
-                itm.text(self.__propStatusColumn) in self.modifiedIndicators
+                itm.text(self.__statusColumn) in self.modifiedIndicators
+                or itm.text(self.__propStatusColumn) in self.modifiedIndicators
             ):
                 modifiedItems.append(itm)
         return modifiedItems
-        
+
     def __getUnversionedItems(self):
         """
         Private method to retrieve all entries, that have an
         unversioned status.
-        
+
         @return list of all items with an unversioned status
         """
         unversionedItems = []
@@ -937,11 +973,11 @@
             if itm.text(self.__statusColumn) in self.unversionedIndicators:
                 unversionedItems.append(itm)
         return unversionedItems
-        
+
     def __getMissingItems(self):
         """
         Private method to retrieve all entries, that have a missing status.
-        
+
         @return list of all items with a missing status
         """
         missingItems = []
@@ -949,11 +985,11 @@
             if itm.text(self.__statusColumn) in self.missingIndicators:
                 missingItems.append(itm)
         return missingItems
-        
+
     def __getLockActionItems(self, indicators):
         """
         Private method to retrieve all entries, that have a locked status.
-        
+
         @param indicators list of indicators to check against (list of strings)
         @return list of all items with a locked status
         """
@@ -962,12 +998,12 @@
             if itm.text(self.__lockinfoColumn) in indicators:
                 lockitems.append(itm)
         return lockitems
-        
+
     def __getChangelistItems(self):
         """
         Private method to retrieve all entries, that are members of
         a changelist.
-        
+
         @return list of all items belonging to a changelist
         """
         clitems = []
@@ -975,12 +1011,12 @@
             if itm.text(self.__changelistColumn):
                 clitems.append(itm)
         return clitems
-        
+
     def __getNonChangelistItems(self):
         """
         Private method to retrieve all entries, that are not members of
         a changelist.
-        
+
         @return list of all items not belonging to a changelist
         """
         clitems = []
@@ -988,22 +1024,22 @@
             if not itm.text(self.__changelistColumn):
                 clitems.append(itm)
         return clitems
-    
+
     def __commitSelect(self, selected):
         """
         Private slot to select or deselect all entries.
-        
+
         @param selected commit selection state to be set (boolean)
         """
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if selected:
-                    itm.setCheckState(
-                        self.__toBeCommittedColumn, Qt.CheckState.Checked)
+                    itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
                 else:
                     itm.setCheckState(
-                        self.__toBeCommittedColumn, Qt.CheckState.Unchecked)
+                        self.__toBeCommittedColumn, Qt.CheckState.Unchecked
+                    )
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,21 +20,22 @@
     """
     Class implementing the VCS status monitor thread class for Subversion.
     """
+
     def __init__(self, interval, project, vcs, parent=None):
         """
         Constructor
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object (Project)
         @param vcs reference to the version control object
         @param parent reference to the parent object (QObject)
         """
         VcsStatusMonitorThread.__init__(self, interval, project, vcs, parent)
-    
+
     def _performMonitor(self):
         """
         Protected method implementing the monitoring action.
-        
+
         This method populates the statusList member variable
         with a list of strings giving the status in the first column and the
         path relative to the project directory starting with the third column.
@@ -50,104 +51,105 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @return tuple of flag indicating successful operation (boolean) and
             a status message in case of non successful operation (string)
         """
         self.shouldUpdate = False
-        
+
         client = pysvn.Client()
         client.exception_style = 1
         client.callback_get_login = self.__clientLoginCallback
         client.callback_ssl_server_trust_prompt = (
             self.__clientSslServerTrustPromptCallback
         )
-        
+
         cwd = os.getcwd()
         os.chdir(self.projectDir)
         try:
             allFiles = client.status(
-                '.', recurse=True, get_all=True, ignore=True,
-                update=not Preferences.getVCS("MonitorLocalStatus"))
+                ".",
+                recurse=True,
+                get_all=True,
+                ignore=True,
+                update=not Preferences.getVCS("MonitorLocalStatus"),
+            )
             states = {}
             for file in allFiles:
                 uptodate = True
                 if file.repos_text_status != pysvn.wc_status_kind.none:
                     uptodate = (
-                        uptodate and
-                        file.repos_text_status != pysvn.wc_status_kind.modified
+                        uptodate
+                        and file.repos_text_status != pysvn.wc_status_kind.modified
                     )
                 if file.repos_prop_status != pysvn.wc_status_kind.none:
                     uptodate = (
-                        uptodate and
-                        file.repos_prop_status != pysvn.wc_status_kind.modified
+                        uptodate
+                        and file.repos_prop_status != pysvn.wc_status_kind.modified
                     )
-                
+
                 status = ""
                 if not uptodate:
                     status = "U"
                     self.shouldUpdate = True
                 elif (
-                    file.text_status == pysvn.wc_status_kind.conflicted or
-                    file.prop_status == pysvn.wc_status_kind.conflicted
+                    file.text_status == pysvn.wc_status_kind.conflicted
+                    or file.prop_status == pysvn.wc_status_kind.conflicted
                 ):
                     status = "Z"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.deleted or
-                    file.prop_status == pysvn.wc_status_kind.deleted
+                    file.text_status == pysvn.wc_status_kind.deleted
+                    or file.prop_status == pysvn.wc_status_kind.deleted
                 ):
                     status = "O"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.modified or
-                    file.prop_status == pysvn.wc_status_kind.modified
+                    file.text_status == pysvn.wc_status_kind.modified
+                    or file.prop_status == pysvn.wc_status_kind.modified
                 ):
                     status = "M"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.added or
-                    file.prop_status == pysvn.wc_status_kind.added
+                    file.text_status == pysvn.wc_status_kind.added
+                    or file.prop_status == pysvn.wc_status_kind.added
                 ):
                     status = "A"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.replaced or
-                    file.prop_status == pysvn.wc_status_kind.replaced
+                    file.text_status == pysvn.wc_status_kind.replaced
+                    or file.prop_status == pysvn.wc_status_kind.replaced
                 ):
                     status = "R"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.unversioned or
-                    file.prop_status == pysvn.wc_status_kind.unversioned
+                    file.text_status == pysvn.wc_status_kind.unversioned
+                    or file.prop_status == pysvn.wc_status_kind.unversioned
                 ):
                     status = "?"
                 elif (
-                    file.text_status == pysvn.wc_status_kind.missing or
-                    file.prop_status == pysvn.wc_status_kind.missing
+                    file.text_status == pysvn.wc_status_kind.missing
+                    or file.prop_status == pysvn.wc_status_kind.missing
                 ):
                     status = "!"
                 if status:
                     states[file.path] = status
                     try:
                         if self.reportedStates[file.path] != status:
-                            self.statusList.append(
-                                "{0} {1}".format(status, file.path))
+                            self.statusList.append("{0} {1}".format(status, file.path))
                     except KeyError:
-                        self.statusList.append(
-                            "{0} {1}".format(status, file.path))
+                        self.statusList.append("{0} {1}".format(status, file.path))
             for name in list(self.reportedStates.keys()):
                 if name not in states:
                     self.statusList.append("  {0}".format(name))
             self.reportedStates = states
             res = True
-            statusStr = self.tr(
-                "Subversion status checked successfully (using pysvn)")
+            statusStr = self.tr("Subversion status checked successfully (using pysvn)")
         except pysvn.ClientError as e:
             res = False
             statusStr = e.args[0]
         os.chdir(cwd)
         return res, statusStr
-    
+
     def __clientLoginCallback(self, realm, username, may_save):
         """
         Private method called by the client to get login information.
-        
+
         @param realm name of the realm of the requested credentials (string)
         @param username username as supplied by subversion (string)
         @param may_save flag indicating, that subversion is willing to save
@@ -159,12 +161,12 @@
             password should be saved. Always returns (False, "", "", False).
         """
         return (False, "", "", False)
-    
+
     def __clientSslServerTrustPromptCallback(self, trust_dict):
         """
         Private method called by the client to request acceptance for a
         ssl server certificate.
-        
+
         @param trust_dict dictionary containing the trust data
         @return tuple of three values (retcode, acceptedFailures, save).
             Retcode should be true, if the certificate should be accepted,
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnSwitchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnSwitchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter the data for a switch operation.
     """
+
     def __init__(self, taglist, reposURL, standardLayout, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param reposURL repository path (string) or None
         @param standardLayout flag indicating the layout of the
@@ -28,23 +29,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
+
         self.tagCombo.clear()
         self.tagCombo.addItems(sorted(taglist))
-        
+
         if reposURL is not None and reposURL != "":
             self.tagCombo.setEditText(reposURL)
-            
+
         if not standardLayout:
             self.TagTypeGroup.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple of string and int (tag, tag type)
         """
         tag = self.tagCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,8 +14,13 @@
 
 from PyQt6.QtCore import Qt
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QDialog, QInputDialog, QApplication,
-    QDialogButtonBox, QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,15 +33,15 @@
 from .Ui_SvnTagBranchListDialog import Ui_SvnTagBranchListDialog
 
 
-class SvnTagBranchListDialog(QDialog, SvnDialogMixin,
-                             Ui_SvnTagBranchListDialog):
+class SvnTagBranchListDialog(QDialog, SvnDialogMixin, Ui_SvnTagBranchListDialog):
     """
     Class implementing a dialog to show a list of tags or branches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
@@ -44,44 +49,42 @@
         self.setupUi(self)
         SvnDialogMixin.__init__(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(3, Qt.SortOrder.AscendingOrder)
-        
+
         self.client = self.vcs.getClient()
         self.client.callback_cancel = self._clientCancelCallback
         self.client.callback_get_login = self._clientLoginCallback
         self.client.callback_ssl_server_trust_prompt = (
             self._clientSslServerTrustPromptCallback
         )
-        
+
     def start(self, path, tags=True):
         """
         Public slot to start the svn status command.
-        
+
         @param path name of directory to be listed (string)
         @param tags flag indicating a list of tags is requested
                 (False = branches, True = tags)
         @return flag indicating success (boolean)
         """
         self.errorGroup.hide()
-        
+
         self.tagList.clear()
-        
+
         if not tags:
             self.setWindowTitle(self.tr("Subversion Branches List"))
         self.activateWindow()
         QApplication.processEvents()
-        
+
         dname, fname = self.vcs.splitPath(path)
-        
+
         reposURL = self.vcs.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -90,13 +93,15 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The list operation"""
-                    """ will be aborted"""))
+                    """ will be aborted"""
+                ),
+            )
             self.close()
             return False
-        
+
         if self.vcs.otherData["standardLayout"]:
             # determine the base path of the project in the repository
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -105,11 +110,13 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The list operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return False
-            
+
             reposRoot = match.group(1)
-            
+
             if tags:
                 path = "{0}/tags".format(reposRoot)
             else:
@@ -118,10 +125,10 @@
             reposPath, ok = QInputDialog.getText(
                 self,
                 self.tr("Subversion List"),
-                self.tr("Enter the repository URL containing the"
-                        " tags or branches"),
+                self.tr("Enter the repository URL containing the" " tags or branches"),
                 QLineEdit.EchoMode.Normal,
-                self.vcs.svnNormalizeURL(reposURL))
+                self.vcs.svnNormalizeURL(reposURL),
+            )
             if not ok:
                 self.close()
                 return False
@@ -129,12 +136,12 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Subversion List"),
-                    self.tr(
-                        """The repository URL is empty. Aborting..."""))
+                    self.tr("""The repository URL is empty. Aborting..."""),
+                )
                 self.close()
                 return False
             path = reposPath
-        
+
         self.tagsList = []
         cwd = os.getcwd()
         os.chdir(dname)
@@ -143,15 +150,17 @@
                 entries = self.client.list(path, recurse=False)
             for dirent, _lock in entries:
                 if dirent["path"] != path:
-                    name = dirent["path"].replace(path + '/', "")
-                    self.__generateItem(dirent["created_rev"].number,
-                                        dirent["last_author"],
-                                        formatTime(dirent["time"]),
-                                        name)
+                    name = dirent["path"].replace(path + "/", "")
+                    self.__generateItem(
+                        dirent["created_rev"].number,
+                        dirent["last_author"],
+                        formatTime(dirent["time"]),
+                        name,
+                    )
                     if self.vcs.otherData["standardLayout"]:
                         self.tagsList.append(name)
                     else:
-                        self.tagsList.append(path + '/' + name)
+                        self.tagsList.append(path + "/" + name)
                     if self._clientCancelCallback():
                         break
             res = True
@@ -160,75 +169,67 @@
             res = False
         except AttributeError:
             self.__showError(
-                self.tr("The installed version of PySvn should be"
-                        " 1.4.0 or better."))
+                self.tr("The installed version of PySvn should be" " 1.4.0 or better.")
+            )
             res = False
         self.__finish()
         os.chdir(cwd)
         return res
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.__resizeColumns()
         self.__resort()
-        
+
         self._cancel()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __showError(self, msg):
         """
         Private slot to show an error message.
-        
+
         @param msg error message to show (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(msg)
         self.errors.ensureCursorVisible()
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.tagList.sortItems(
-            self.tagList.sortColumn(),
-            self.tagList.header().sortIndicatorOrder())
-        
+            self.tagList.sortColumn(), self.tagList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.tagList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tagList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.tagList.header().setStretchLastSection(True)
-        
+
     def __generateItem(self, revision, author, date, name):
         """
         Private method to generate a tag item in the taglist.
-        
+
         @param revision revision number (integer)
         @param author author of the tag (string)
         @param date date of the tag (string)
@@ -240,11 +241,11 @@
         itm.setData(2, Qt.ItemDataRole.DisplayRole, date)
         itm.setData(3, Qt.ItemDataRole.DisplayRole, name)
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
-        
+
     def getTagList(self):
         """
         Public method to get the taglist of the last run.
-        
+
         @return list of tags (list of strings)
         """
         return self.tagsList
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter the data for a tagging operation.
     """
+
     def __init__(self, taglist, reposURL, standardLayout, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param reposURL repository path (string) or None
         @param standardLayout flag indicating the layout of the
@@ -29,36 +30,35 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.tagCombo.clear()
         self.tagCombo.addItems(sorted(taglist, reverse=True))
-        
+
         if reposURL is not None and reposURL != "":
             self.tagCombo.setEditText(reposURL)
-        
+
         if not standardLayout:
             self.TagActionGroup.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot(str)
     def on_tagCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text tag name entered in the combo (string)
         """
         self.okButton.setDisabled(text == "")
-    
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple of string and int (tag, tag operation)
         """
         tag = self.tagCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUrlSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUrlSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class implementing a dialog to enter the URLs for the svn diff command.
     """
+
     def __init__(self, vcs, tagsList, branchesList, path, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
@@ -38,18 +39,18 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        if not hasattr(pysvn.Client(), 'diff_summarize'):
+
+        if not hasattr(pysvn.Client(), "diff_summarize"):
             self.summaryCheckBox.setEnabled(False)
             self.summaryCheckBox.setChecked(False)
-        
+
         self.vcs = vcs
         self.tagsList = tagsList
         self.branchesList = branchesList
-        
+
         self.typeCombo1.addItems(["trunk/", "tags/", "branches/"])
         self.typeCombo2.addItems(["trunk/", "tags/", "branches/"])
-        
+
         reposURL = self.vcs.svnGetReposName(path)
         if reposURL is None:
             EricMessageBox.critical(
@@ -58,13 +59,15 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The operation will"""
-                    """ be aborted"""))
+                    """ be aborted"""
+                ),
+            )
             self.reject()
             return
-        
+
         if self.vcs.otherData["standardLayout"]:
             # determine the base path of the project in the repository
-            rx_base = re.compile('(.+/)(trunk|tags|branches).*')
+            rx_base = re.compile("(.+/)(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -73,21 +76,22 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 self.reject()
                 return
-            
+
             reposRoot = match.group(1)
             self.repoRootLabel1.setText(reposRoot)
             self.repoRootLabel2.setText(reposRoot)
         else:
-            project = ericApp().getObject('Project')
-            if (
-                Utilities.normcasepath(path) !=
-                Utilities.normcasepath(project.getProjectPath())
+            project = ericApp().getObject("Project")
+            if Utilities.normcasepath(path) != Utilities.normcasepath(
+                project.getProjectPath()
             ):
                 path = project.getRelativePath(path)
-                reposURL = reposURL.replace(path, '')
+                reposURL = reposURL.replace(path, "")
             self.repoRootLabel1.hide()
             self.typeCombo1.hide()
             self.labelCombo1.addItems([reposURL] + sorted(self.vcs.tagsList))
@@ -96,15 +100,15 @@
             self.typeCombo2.hide()
             self.labelCombo2.addItems([reposURL] + sorted(self.vcs.tagsList))
             self.labelCombo2.setEnabled(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __changeLabelCombo(self, labelCombo, type_):
         """
         Private method used to change the label combo depending on the
         selected type.
-        
+
         @param labelCombo reference to the labelCombo object (QComboBox)
         @param type_ type string (string)
         """
@@ -122,49 +126,49 @@
             labelCombo.clearEditText()
             labelCombo.addItems(sorted(self.branchesList))
             labelCombo.setEnabled(True)
-        
+
     @pyqtSlot(int)
     def on_typeCombo1_currentIndexChanged(self, index):
         """
         Private slot called when the selected type was changed.
-        
+
         @param index index of the current item
         @type int
         """
         type_ = self.typeCombo1.itemText(index)
         self.__changeLabelCombo(self.labelCombo1, type_)
-        
+
     @pyqtSlot(int)
     def on_typeCombo2_currentIndexChanged(self, index):
         """
         Private slot called when the selected type was changed.
-        
+
         @param index index of the current item
         @type int
         """
         type_ = self.typeCombo2.itemText(index)
         self.__changeLabelCombo(self.labelCombo2, type_)
-        
+
     def getURLs(self):
         """
         Public method to get the entered URLs.
-        
+
         @return tuple of list of two URL strings (list of strings) and
             a flag indicating a diff summary (boolean)
         """
         if self.vcs.otherData["standardLayout"]:
             url1 = (
-                self.repoRootLabel1.text() +
-                self.typeCombo1.currentText() +
-                self.labelCombo1.currentText()
+                self.repoRootLabel1.text()
+                + self.typeCombo1.currentText()
+                + self.labelCombo1.currentText()
             )
             url2 = (
-                self.repoRootLabel2.text() +
-                self.typeCombo2.currentText() +
-                self.labelCombo2.currentText()
+                self.repoRootLabel2.text()
+                + self.typeCombo2.currentText()
+                + self.labelCombo2.currentText()
             )
         else:
             url1 = self.labelCombo1.currentText()
             url2 = self.labelCombo2.currentText()
-        
+
         return [url1, url2], self.summaryCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/SvnUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 def formatTime(seconds):
     """
     Module function to return a formatted time string.
-    
+
     @param seconds time in seconds since epoch to be formatted (float or long)
     @return formatted time string (string)
     """
@@ -34,18 +34,21 @@
 def dateFromTime_t(seconds):
     """
     Module function to return the date.
-    
+
     @param seconds time in seconds since epoch to be formatted (float or long)
     @return date (QDate)
     """
-    return QDateTime.fromSecsSinceEpoch(int(seconds)).toTimeSpec(
-        Qt.TimeSpec.LocalTime).date()
+    return (
+        QDateTime.fromSecsSinceEpoch(int(seconds))
+        .toTimeSpec(Qt.TimeSpec.LocalTime)
+        .date()
+    )
 
 
 def getServersPath():
     """
     Module function to get the filename of the servers file.
-    
+
     @return filename of the servers file (string)
     """
     if Utilities.isWindowsPlatform():
@@ -59,7 +62,7 @@
 def getConfigPath():
     """
     Module function to get the filename of the config file.
-    
+
     @return filename of the config file (string)
     """
     if Utilities.isWindowsPlatform():
@@ -91,7 +94,7 @@
             configList = f.read().splitlines()
     except OSError:
         return
-    
+
     newConfig = []
     ignoresFound = False
     amendList = []
@@ -121,7 +124,7 @@
                     amendList.append(amend)
         else:
             newConfig.append(line)
-    
+
     if newConfig != configList:
         with contextlib.suppress(OSError), open(config, "w") as f:
             f.write("\n".join(newConfig))
--- a/src/eric7/Plugins/VcsPlugins/vcsPySvn/subversion.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsPySvn/subversion.py	Wed Jul 13 14:55:47 2022 +0200
@@ -36,41 +36,42 @@
 class Subversion(VersionControl):
     """
     Class implementing the version control systems interface to Subversion.
-    
+
     @signal committed() emitted after the commit action has completed
     """
+
     committed = pyqtSignal()
-    
+
     def __init__(self, plugin, parent=None, name=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VersionControl.__init__(self, parent, name)
         self.defaultOptions = {
-            'global': [''],
-            'commit': [''],
-            'checkout': [''],
-            'update': [''],
-            'add': [''],
-            'remove': [''],
-            'diff': [''],
-            'log': [''],
-            'history': [''],
-            'status': [''],
-            'tag': [''],
-            'export': ['']
+            "global": [""],
+            "commit": [""],
+            "checkout": [""],
+            "update": [""],
+            "add": [""],
+            "remove": [""],
+            "diff": [""],
+            "log": [""],
+            "history": [""],
+            "status": [""],
+            "tag": [""],
+            "export": [""],
         }
         self.interestingDataKeys = [
             "standardLayout",
         ]
-        
+
         self.__plugin = plugin
         self.__ui = parent
-        
+
         self.options = self.defaultOptions
         self.otherData["standardLayout"] = True
         self.tagsList = []
@@ -79,23 +80,17 @@
         self.mergeList = [[], [], []]
         self.showedTags = False
         self.showedBranches = False
-        
-        self.tagTypeList = [
-            'tags',
-            'branches'
-        ]
-        
+
+        self.tagTypeList = ["tags", "branches"]
+
         self.commandHistory = []
         self.wdHistory = []
-        
-        if (
-            pysvn.version >= (1, 4, 3, 0) and
-            "SVN_ASP_DOT_NET_HACK" in os.environ
-        ):
-            self.adminDir = '_svn'
+
+        if pysvn.version >= (1, 4, 3, 0) and "SVN_ASP_DOT_NET_HACK" in os.environ:
+            self.adminDir = "_svn"
         else:
-            self.adminDir = '.svn'
-        
+            self.adminDir = ".svn"
+
         self.log = None
         self.diff = None
         self.sbsDiff = None
@@ -105,47 +100,47 @@
         self.blame = None
         self.repoBrowser = None
         self.logBrowser = None
-        
+
         self.statusCache = {}
-        
+
         self.__commitData = {}
         self.__commitDialog = None
-        
+
         self.__wcng = True
         # assume new generation working copy metadata format
-    
+
     def getPlugin(self):
         """
         Public method to get a reference to the plugin object.
-        
+
         @return reference to the plugin object (VcsPySvnPlugin)
         """
         return self.__plugin
-    
+
     def getClient(self):
         """
         Public method to create and initialize the pysvn client object.
-        
+
         @return the pysvn client object (pysvn.Client)
         """
         configDir = ""
         authCache = True
-        for arg in self.options['global']:
+        for arg in self.options["global"]:
             if arg.startswith("--config-dir"):
                 configDir = arg.split("=", 1)[1]
             if arg.startswith("--no-auth-cache"):
                 authCache = False
-        
+
         client = pysvn.Client(configDir)
         client.exception_style = 1
         client.set_auth_cache(authCache)
-        
+
         return client
-    
+
     ###########################################################################
     ## Methods of the VCS interface
     ###########################################################################
-    
+
     def vcsShutdown(self):
         """
         Public method used to shutdown the Subversion interface.
@@ -168,37 +163,37 @@
             self.repoBrowser.close()
         if self.logBrowser is not None:
             self.logBrowser.close()
-        
+
     def vcsExists(self):
         """
         Public method used to test for the presence of the svn executable.
-        
+
         @return flag indicating the existance (boolean) and an error message
             (string)
         """
         self.versionStr = ".".join([str(v) for v in pysvn.svn_version[:-1]])
         self.version = pysvn.svn_version[:-1]
         return True, ""
-        
+
     def vcsInit(self, vcsDir, noDialog=False):
         """
         Public method used to initialize the subversion repository.
-        
+
         The subversion repository has to be initialized from outside eric
         because the respective command always works locally. Therefore we
         always return TRUE without doing anything.
-        
+
         @param vcsDir name of the VCS directory (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return always TRUE
         """
         return True
-        
+
     def vcsConvertProject(self, vcsDataDict, project, addAll=True):
         """
         Public method to convert an uncontrolled project to a version
         controlled project.
-        
+
         @param vcsDataDict dictionary of data required for the conversion
         @type dict
         @param project reference to the project object
@@ -214,7 +209,9 @@
                 self.tr(
                     """The project could not be created in the repository."""
                     """ Maybe the given repository doesn't exist or the"""
-                    """ repository server is down."""))
+                    """ repository server is down."""
+                ),
+            )
         else:
             cwdIsPpath = False
             if os.getcwd() == project.ppath:
@@ -238,7 +235,9 @@
                     self.tr(
                         """The project could not be checked out of the"""
                         """ repository.<br />"""
-                        """Restoring the original contents."""))
+                        """Restoring the original contents."""
+                    ),
+                )
                 if os.getcwd() == project.ppath:
                     os.chdir(os.path.dirname(project.ppath))
                     cwdIsPpath = True
@@ -246,7 +245,7 @@
                     cwdIsPpath = False
                 shutil.rmtree(project.ppath, True)
                 os.rename(tmpProjectDir, project.ppath)
-                project.pdata["VCS"] = 'None'
+                project.pdata["VCS"] = "None"
                 project.vcs = None
                 project.setDirty(True)
                 project.saveProject()
@@ -255,12 +254,12 @@
             shutil.rmtree(tmpProjectDir, True)
             project.closeProject(noSave=True)
             project.openProject(pfn)
-        
+
     def vcsImport(self, vcsDataDict, projectDir, noDialog=False, addAll=True):
         """
         Public method used to import the project into the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the import
         @type dict
         @param projectDir project directory (string)
@@ -276,45 +275,46 @@
         noDialog = False
         msg = vcsDataDict["message"]
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/'):
-            vcsDir = 'file://{0}'.format(vcsDir)
-        elif vcsDir[1] in ['|', ':']:
-            vcsDir = 'file:///{0}'.format(vcsDir)
-        
-        project = vcsDir[vcsDir.rfind('/') + 1:]
-        
+        if vcsDir.startswith("/"):
+            vcsDir = "file://{0}".format(vcsDir)
+        elif vcsDir[1] in ["|", ":"]:
+            vcsDir = "file:///{0}".format(vcsDir)
+
+        project = vcsDir[vcsDir.rfind("/") + 1 :]
+
         # create the dir structure to be imported into the repository
-        tmpDir = '{0}_tmp'.format(projectDir)
+        tmpDir = "{0}_tmp".format(projectDir)
         try:
             os.makedirs(tmpDir)
             if self.otherData["standardLayout"]:
                 os.mkdir(os.path.join(tmpDir, project))
-                os.mkdir(os.path.join(tmpDir, project, 'branches'))
-                os.mkdir(os.path.join(tmpDir, project, 'tags'))
-                shutil.copytree(
-                    projectDir, os.path.join(tmpDir, project, 'trunk'))
+                os.mkdir(os.path.join(tmpDir, project, "branches"))
+                os.mkdir(os.path.join(tmpDir, project, "tags"))
+                shutil.copytree(projectDir, os.path.join(tmpDir, project, "trunk"))
             else:
                 shutil.copytree(projectDir, os.path.join(tmpDir, project))
         except OSError:
             if os.path.isdir(tmpDir):
                 shutil.rmtree(tmpDir, True)
             return False, False
-        
+
         cwd = os.getcwd()
         os.chdir(os.path.join(tmpDir, project))
-        opts = self.options['global']
+        opts = self.options["global"]
         recurse = "--non-recursive" not in opts
         url = self.__svnURL(vcsDir)
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Importing project into Subversion repository'),
+                self.tr("Importing project into Subversion repository"),
                 "import{0} --message {1} .".format(
-                    (not recurse) and " --non-recursive" or "", msg),
-                client)
+                    (not recurse) and " --non-recursive" or "", msg
+                ),
+                client,
+            )
             QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -326,20 +326,21 @@
             if not noDialog:
                 dlg.showError(e.args[0])
         if not noDialog:
-            rev and dlg.showMessage(self.tr("Imported revision {0}.\n")
-                                    .format(rev.number))
+            rev and dlg.showMessage(
+                self.tr("Imported revision {0}.\n").format(rev.number)
+            )
             dlg.finish()
             dlg.exec()
         os.chdir(cwd)
-        
+
         shutil.rmtree(tmpDir, True)
         return status, False
-        
+
     def vcsCheckout(self, vcsDataDict, projectDir, noDialog=False):
         """
         Public method used to check the project out of the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @param noDialog flag indicating quiet operations
@@ -351,46 +352,47 @@
         except KeyError:
             tag = None
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/'):
-            vcsDir = 'file://{0}'.format(vcsDir)
-        elif vcsDir[1] in ['|', ':']:
-            vcsDir = 'file:///{0}'.format(vcsDir)
-            
+        if vcsDir.startswith("/"):
+            vcsDir = "file://{0}".format(vcsDir)
+        elif vcsDir[1] in ["|", ":"]:
+            vcsDir = "file:///{0}".format(vcsDir)
+
         if self.otherData["standardLayout"]:
-            if tag is None or tag == '':
-                svnUrl = '{0}/trunk'.format(vcsDir)
+            if tag is None or tag == "":
+                svnUrl = "{0}/trunk".format(vcsDir)
             else:
-                if (
-                    not tag.startswith('tags') and
-                    not tag.startswith('branches')
-                ):
+                if not tag.startswith("tags") and not tag.startswith("branches"):
                     type_, ok = QInputDialog.getItem(
                         None,
                         self.tr("Subversion Checkout"),
                         self.tr(
                             "The tag must be a normal tag (tags) or"
                             " a branch tag (branches)."
-                            " Please select from the list."),
+                            " Please select from the list."
+                        ),
                         self.tagTypeList,
-                        0, False)
+                        0,
+                        False,
+                    )
                     if not ok:
                         return False
-                    tag = '{0}/{1}'.format(type_, tag)
-                svnUrl = '{0}/{1}'.format(vcsDir, tag)
+                    tag = "{0}/{1}".format(type_, tag)
+                svnUrl = "{0}/{1}".format(vcsDir, tag)
         else:
             svnUrl = vcsDir
-        
-        opts = self.options['global'] + self.options['checkout']
+
+        opts = self.options["global"] + self.options["checkout"]
         recurse = "--non-recursive" not in opts
         url = self.__svnURL(svnUrl)
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Checking project out of Subversion repository'),
+                self.tr("Checking project out of Subversion repository"),
                 "checkout{0} {1} {2}".format(
-                    (not recurse) and " --non-recursive" or "",
-                    url, projectDir),
-                client)
+                    (not recurse) and " --non-recursive" or "", url, projectDir
+                ),
+                client,
+            )
             QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -404,12 +406,12 @@
             dlg.finish()
             dlg.exec()
         return status
-        
+
     def vcsExport(self, vcsDataDict, projectDir):
         """
         Public method used to export a directory from the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @return flag indicating an execution without errors (boolean)
@@ -419,43 +421,44 @@
         except KeyError:
             tag = None
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/') or vcsDir[1] == '|':
-            vcsDir = 'file://{0}'.format(vcsDir)
-            
+        if vcsDir.startswith("/") or vcsDir[1] == "|":
+            vcsDir = "file://{0}".format(vcsDir)
+
         if self.otherData["standardLayout"]:
-            if tag is None or tag == '':
-                svnUrl = '{0}/trunk'.format(vcsDir)
+            if tag is None or tag == "":
+                svnUrl = "{0}/trunk".format(vcsDir)
             else:
-                if (
-                    not tag.startswith('tags') and
-                    not tag.startswith('branches')
-                ):
+                if not tag.startswith("tags") and not tag.startswith("branches"):
                     type_, ok = QInputDialog.getItem(
                         None,
                         self.tr("Subversion Export"),
                         self.tr(
                             "The tag must be a normal tag (tags) or"
                             " a branch tag (branches)."
-                            " Please select from the list."),
+                            " Please select from the list."
+                        ),
                         self.tagTypeList,
-                        0, False)
+                        0,
+                        False,
+                    )
                     if not ok:
                         return False
-                    tag = '{0}/{1}'.format(type_, tag)
-                svnUrl = '{0}/{1}'.format(vcsDir, tag)
+                    tag = "{0}/{1}".format(type_, tag)
+                svnUrl = "{0}/{1}".format(vcsDir, tag)
         else:
             svnUrl = vcsDir
-        
-        opts = self.options['global']
+
+        opts = self.options["global"]
         recurse = "--non-recursive" not in opts
         url = self.__svnURL(svnUrl)
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Exporting project from Subversion repository'),
+            self.tr("Exporting project from Subversion repository"),
             "export --force{0} {1} {2}".format(
-                (not recurse) and " --non-recursive" or "",
-                url, projectDir),
-            client)
+                (not recurse) and " --non-recursive" or "", url, projectDir
+            ),
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -467,12 +470,12 @@
         dlg.finish()
         dlg.exec()
         return status
-        
+
     def vcsCommit(self, name, message, noDialog=False):
         """
         Public method used to make the change of a file/directory permanent
         in the Subversion repository.
-        
+
         @param name file/directory name to be committed (string or
         list of strings)
         @param message message for this operation (string)
@@ -482,19 +485,20 @@
             # call CommitDialog and get message from there
             if self.__commitDialog is None:
                 from .SvnCommitDialog import SvnCommitDialog
+
                 self.__commitDialog = SvnCommitDialog(self, self.__ui)
                 self.__commitDialog.accepted.connect(self.__vcsCommit_Step2)
             self.__commitDialog.show()
             self.__commitDialog.raise_()
             self.__commitDialog.activateWindow()
-        
+
         self.__commitData["name"] = name
         self.__commitData["msg"] = message
         self.__commitData["noDialog"] = noDialog
-        
+
         if noDialog:
             self.__vcsCommit_Step2()
-        
+
     def __vcsCommit_Step2(self):
         """
         Private slot performing the second step of the commit action.
@@ -502,7 +506,7 @@
         name = self.__commitData["name"]
         msg = self.__commitData["msg"]
         noDialog = self.__commitData["noDialog"]
-        
+
         if not noDialog:
             # check, if there are unsaved changes, that should be committed
             if isinstance(name, list):
@@ -515,102 +519,110 @@
                 if os.path.isdir(nam):
                     project = ericApp().getObject("Project")
                     if nam == project.getProjectPath():
-                        ok &= project.checkAllScriptsDirty(
-                            reportSyntaxErrors=True) and project.checkDirty()
+                        ok &= (
+                            project.checkAllScriptsDirty(reportSyntaxErrors=True)
+                            and project.checkDirty()
+                        )
                         continue
                 elif os.path.isfile(nam):
-                    editor = ericApp().getObject("ViewManager").getOpenEditor(
-                        nam)
+                    editor = ericApp().getObject("ViewManager").getOpenEditor(nam)
                     if editor:
                         ok &= editor.checkDirty()
                 if not ok:
                     break
-            
+
             if not ok:
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Commit Changes"),
                     self.tr(
                         """The commit affects files, that have unsaved"""
-                        """ changes. Shall the commit be continued?"""),
-                    icon=EricMessageBox.Warning)
+                        """ changes. Shall the commit be continued?"""
+                    ),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-        
+
         if self.__commitDialog is not None:
             msg = self.__commitDialog.logMessage()
             if self.__commitDialog.hasChangelists():
-                changelists, keepChangelists = (
-                    self.__commitDialog.changelistsData()
-                )
+                changelists, keepChangelists = self.__commitDialog.changelistsData()
             else:
                 changelists, keepChangelists = [], False
             self.__commitDialog.deleteLater()
             self.__commitDialog = None
         else:
             changelists, keepChangelists = [], False
-        
+
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
         else:
             dname, fname = self.splitPath(name)
             fnames = [fname]
-        
-        if (
-            self.svnGetReposName(dname).startswith('http') or
-            self.svnGetReposName(dname).startswith('svn')
-        ):
+
+        if self.svnGetReposName(dname).startswith("http") or self.svnGetReposName(
+            dname
+        ).startswith("svn"):
             noDialog = False
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
-        opts = self.options['global'] + self.options['commit']
+        opts = self.options["global"] + self.options["commit"]
         recurse = "--non-recursive" not in opts
         keeplocks = "--keep-locks" in opts
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Commiting changes to Subversion repository'),
+                self.tr("Commiting changes to Subversion repository"),
                 "commit{0}{1}{2}{3} --message {4} {5}".format(
                     (not recurse) and " --non-recursive" or "",
                     keeplocks and " --keep-locks" or "",
                     keepChangelists and " --keep-changelists" or "",
-                    changelists and
-                    " --changelist ".join([""] + changelists) or "",
-                    msg, " ".join(fnames)),
-                client)
+                    changelists and " --changelist ".join([""] + changelists) or "",
+                    msg,
+                    " ".join(fnames),
+                ),
+                client,
+            )
             QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
                 rev = (
                     client.checkin(
-                        fnames, msg, recurse=recurse, keep_locks=keeplocks,
+                        fnames,
+                        msg,
+                        recurse=recurse,
+                        keep_locks=keeplocks,
                         keep_changelist=keepChangelists,
-                        changelists=changelists)
-                    if changelists else
-                    client.checkin(
-                        fnames, msg, recurse=recurse, keep_locks=keeplocks)
+                        changelists=changelists,
+                    )
+                    if changelists
+                    else client.checkin(
+                        fnames, msg, recurse=recurse, keep_locks=keeplocks
+                    )
                 )
         except pysvn.ClientError as e:
             rev = None
             if not noDialog:
                 dlg.showError(e.args[0])
         if not noDialog:
-            rev and dlg.showMessage(self.tr("Committed revision {0}.")
-                                    .format(rev.number))
+            rev and dlg.showMessage(
+                self.tr("Committed revision {0}.").format(rev.number)
+            )
             dlg.finish()
             dlg.exec()
         os.chdir(cwd)
         self.committed.emit()
         self.checkVCSStatus()
-    
+
     def vcsCommitMessages(self):
         """
         Public method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         """
@@ -619,13 +631,13 @@
         if not messages:
             # empty list returned, try the vcs specific one
             messages = self.getPlugin().getPreferences("Commits")
-        
+
         return messages
-    
+
     def vcsAddCommitMessage(self, message):
         """
         Public method to add a commit message to the list of saved messages.
-        
+
         @param message message to be added
         @type str
         """
@@ -637,19 +649,19 @@
             no = Preferences.getVCS("CommitMessages")
             del commitMessages[no:]
             self.getPlugin().setPreferences("Commits", commitMessages)
-    
+
     def vcsClearCommitMessages(self):
         """
         Public method to clear the list of saved messages.
         """
         if not self._vcsClearProjectCommitMessages():
-            self.getPlugin().setPreferences('Commits', [])
-    
+            self.getPlugin().setPreferences("Commits", [])
+
     def vcsUpdate(self, name, noDialog=False):
         """
         Public method used to update a file/directory with the Subversion
         repository.
-        
+
         @param name file/directory name to be updated (string or list of
             strings)
         @param noDialog flag indicating quiet operations (boolean)
@@ -661,19 +673,20 @@
         else:
             dname, fname = self.splitPath(name)
             fnames = [fname]
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
-        opts = self.options['global'] + self.options['update']
+        opts = self.options["global"] + self.options["update"]
         recurse = "--non-recursive" not in opts
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Synchronizing with the Subversion repository'),
+                self.tr("Synchronizing with the Subversion repository"),
                 "update{0} {1}".format(
-                    (not recurse) and " --non-recursive" or "",
-                    " ".join(fnames)),
-                client)
+                    (not recurse) and " --non-recursive" or "", " ".join(fnames)
+                ),
+                client,
+            )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -689,12 +702,12 @@
         os.chdir(cwd)
         self.checkVCSStatus()
         return res
-        
+
     def vcsAdd(self, name, isDir=False, noDialog=False):
         """
         Public method used to add a file/directory to the Subversion
         repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @param noDialog flag indicating quiet operations (boolean)
@@ -718,11 +731,9 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return  # oops, project is not version controlled
-            while (
-                os.path.normcase(dname) != os.path.normcase(repodir) and
-                (os.path.normcase(dname) not in self.statusCache or
-                 self.statusCache[os.path.normcase(dname)] ==
-                    self.canBeAdded)
+            while os.path.normcase(dname) != os.path.normcase(repodir) and (
+                os.path.normcase(dname) not in self.statusCache
+                or self.statusCache[os.path.normcase(dname)] == self.canBeAdded
             ):
                 # add directories recursively, if they aren't in the
                 # repository already
@@ -737,24 +748,24 @@
                 dname = os.path.dirname(dname)
                 wdir = dname
         names.extend(tree)
-        
+
         if isinstance(name, list):
             tree2 = []
             for n in name:
                 d = os.path.dirname(n)
                 if self.__wcng:
                     repodir = d
-                    while not os.path.isdir(
-                            os.path.join(repodir, self.adminDir)):
+                    while not os.path.isdir(os.path.join(repodir, self.adminDir)):
                         repodir = os.path.dirname(repodir)
                         if os.path.splitdrive(repodir)[1] == os.sep:
                             return  # oops, project is not version controlled
                     while (
-                        (os.path.normcase(d) != os.path.normcase(repodir)) and
-                        (d not in tree2 + tree) and
-                        (os.path.normcase(d) not in self.statusCache or
-                         self.statusCache[os.path.normcase(d)] ==
-                            self.canBeAdded)
+                        (os.path.normcase(d) != os.path.normcase(repodir))
+                        and (d not in tree2 + tree)
+                        and (
+                            os.path.normcase(d) not in self.statusCache
+                            or self.statusCache[os.path.normcase(d)] == self.canBeAdded
+                        )
                     ):
                         tree2.append(d)
                         d = os.path.dirname(d)
@@ -769,28 +780,28 @@
             names.extend(name)
         else:
             names.append(name)
-        
+
         cwd = os.getcwd()
         os.chdir(wdir)
-        opts = self.options['global'] + self.options['add']
+        opts = self.options["global"] + self.options["add"]
         recurse = False
         force = "--force" in opts or noDialog
         noignore = "--no-ignore" in opts
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Adding files/directories to the Subversion'
-                        ' repository'),
+                self.tr("Adding files/directories to the Subversion" " repository"),
                 "add --non-recursive{0}{1} {2}".format(
                     force and " --force" or "",
                     noignore and " --no-ignore" or "",
-                    " ".join(names)),
-                client)
+                    " ".join(names),
+                ),
+                client,
+            )
             QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
-                client.add(names, recurse=recurse, force=force,
-                           ignore=not noignore)
+                client.add(names, recurse=recurse, force=force, ignore=not noignore)
         except pysvn.ClientError as e:
             if not noDialog:
                 dlg.showError(e.args[0])
@@ -798,22 +809,22 @@
             dlg.finish()
             dlg.exec()
         os.chdir(cwd)
-        
+
     def vcsAddBinary(self, name, isDir=False):
         """
         Public method used to add a file/directory in binary mode to the
         Subversion repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         """
         self.vcsAdd(name, isDir)
-        
+
     def vcsAddTree(self, path):
         """
         Public method to add a directory tree rooted at path to the Subversion
         repository.
-        
+
         @param path root directory of the tree to be added (string or list of
             strings))
         """
@@ -824,17 +835,17 @@
                 d = os.path.dirname(n)
                 if self.__wcng:
                     repodir = d
-                    while not os.path.isdir(
-                            os.path.join(repodir, self.adminDir)):
+                    while not os.path.isdir(os.path.join(repodir, self.adminDir)):
                         repodir = os.path.dirname(repodir)
                         if os.path.splitdrive(repodir)[1] == os.sep:
                             return  # oops, project is not version controlled
                     while (
-                        (os.path.normcase(d) != os.path.normcase(repodir)) and
-                        (d not in tree) and
-                        (os.path.normcase(d) not in self.statusCache or
-                         self.statusCache[os.path.normcase(d)] ==
-                            self.canBeAdded)
+                        (os.path.normcase(d) != os.path.normcase(repodir))
+                        and (d not in tree)
+                        and (
+                            os.path.normcase(d) not in self.statusCache
+                            or self.statusCache[os.path.normcase(d)] == self.canBeAdded
+                        )
                     ):
                         tree.append(d)
                         d = os.path.dirname(d)
@@ -855,11 +866,9 @@
                     repodir = os.path.dirname(repodir)
                     if os.path.splitdrive(repodir)[1] == os.sep:
                         return  # oops, project is not version controlled
-                while (
-                    (os.path.normcase(dname) != os.path.normcase(repodir)) and
-                    (os.path.normcase(dname) not in self.statusCache or
-                     self.statusCache[os.path.normcase(dname)] ==
-                        self.canBeAdded)
+                while (os.path.normcase(dname) != os.path.normcase(repodir)) and (
+                    os.path.normcase(dname) not in self.statusCache
+                    or self.statusCache[os.path.normcase(dname)] == self.canBeAdded
                 ):
                     # add directories recursively, if they aren't in the
                     # repository already
@@ -873,27 +882,29 @@
                     dname = os.path.dirname(dname)
         if tree:
             self.vcsAdd(tree, True)
-        
+
         names = []
         if isinstance(path, list):
             names.extend(path)
         else:
             names.append(path)
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
-        opts = self.options['global'] + self.options['add']
+        opts = self.options["global"] + self.options["add"]
         recurse = True
         force = "--force" in opts
         ignore = "--ignore" in opts
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Adding directory trees to the Subversion repository'),
+            self.tr("Adding directory trees to the Subversion repository"),
             "add{0}{1} {2}".format(
                 force and " --force" or "",
                 ignore and " --ignore" or "",
-                " ".join(names)),
-            client)
+                " ".join(names),
+            ),
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -903,14 +914,14 @@
         dlg.finish()
         dlg.exec()
         os.chdir(cwd)
-        
+
     def vcsRemove(self, name, project=False, noDialog=False):
         """
         Public method used to remove a file/directory from the Subversion
         repository.
-        
+
         The default operation is to remove the local copy as well.
-        
+
         @param name file/directory name to be removed (string or list of
             strings))
         @param project flag indicating deletion of a project tree (boolean)
@@ -920,17 +931,15 @@
         """
         if not isinstance(name, list):
             name = [name]
-        opts = self.options['global'] + self.options['remove']
+        opts = self.options["global"] + self.options["remove"]
         force = "--force" in opts or noDialog
         client = self.getClient()
         if not noDialog:
             dlg = SvnDialog(
-                self.tr('Removing files/directories from the Subversion'
-                        ' repository'),
-                "remove{0} {1}".format(
-                    force and " --force" or "",
-                    " ".join(name)),
-                client)
+                self.tr("Removing files/directories from the Subversion" " repository"),
+                "remove{0} {1}".format(force and " --force" or "", " ".join(name)),
+                client,
+            )
             QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -943,23 +952,23 @@
         if not noDialog:
             dlg.finish()
             dlg.exec()
-        
+
         return res
-        
+
     def vcsMove(self, name, project, target=None, noDialog=False):
         """
         Public method used to move a file/directory.
-        
+
         @param name file/directory name to be moved (string)
         @param project reference to the project object
         @param target new name of the file/directory (string)
         @param noDialog flag indicating quiet operations
         @return flag indicating successfull operation (boolean)
         """
-        rx_prot = re.compile('(file:|svn:|svn+ssh:|http:|https:).+')
-        opts = self.options['global']
+        rx_prot = re.compile("(file:|svn:|svn+ssh:|http:|https:).+")
+        opts = self.options["global"]
         res = False
-        
+
         if noDialog:
             if target is None:
                 return False
@@ -967,16 +976,16 @@
             accepted = True
         else:
             from .SvnCopyDialog import SvnCopyDialog
+
             dlg = SvnCopyDialog(name, None, True, "--force" in opts)
-            accepted = (dlg.exec() == QDialog.DialogCode.Accepted)
+            accepted = dlg.exec() == QDialog.DialogCode.Accepted
             if accepted:
                 target, force = dlg.getData()
             if not target:
                 return False
-        
-        isDir = (os.path.isdir(name) if rx_prot.fullmatch(target) is None
-                 else False)
-        
+
+        isDir = os.path.isdir(name) if rx_prot.fullmatch(target) is None else False
+
         if accepted:
             client = self.getClient()
             if rx_prot.fullmatch(target) is not None:
@@ -987,12 +996,16 @@
                 target = target
             if not noDialog:
                 dlg = SvnDialog(
-                    self.tr('Moving {0}').format(name),
+                    self.tr("Moving {0}").format(name),
                     "move{0}{1} {2} {3}".format(
                         force and " --force" or "",
                         log and (" --message {0}".format(log)) or "",
-                        name, target),
-                    client, log=log)
+                        name,
+                        target,
+                    ),
+                    client,
+                    log=log,
+                )
                 QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
@@ -1017,17 +1030,17 @@
                     else:
                         project.removeFile(name)
         return res
-        
+
     def vcsDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Subversion repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -1042,37 +1055,39 @@
                     return
         if self.diff is None:
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self)
         self.diff.show()
         self.diff.raise_()
         QApplication.processEvents()
         self.diff.start(name, refreshable=True)
-        
+
     def vcsStatus(self, name):
         """
         Public method used to view the status of files/directories in the
         Subversion repository.
-        
+
         @param name file/directory name(s) to show the status of
             (string or list of strings)
         """
         if self.status is None:
             from .SvnStatusDialog import SvnStatusDialog
+
             self.status = SvnStatusDialog(self)
         self.status.show()
         self.status.raise_()
         QApplication.processEvents()
         self.status.start(name)
-        
+
     def vcsTag(self, name):
         """
         Public method used to set the tag of a file/directory in the
         Subversion repository.
-        
+
         @param name file/directory name to be tagged (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         reposURL = self.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -1081,17 +1096,19 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The tag operation"""
-                    """ will be aborted"""))
+                    """ will be aborted"""
+                ),
+            )
             return
-        
+
         url = (
-            None
-            if self.otherData["standardLayout"] else
-            self.svnNormalizeURL(reposURL)
+            None if self.otherData["standardLayout"] else self.svnNormalizeURL(reposURL)
         )
         from .SvnTagDialog import SvnTagDialog
-        dlg = SvnTagDialog(self.allTagsBranchesList, url,
-                           self.otherData["standardLayout"])
+
+        dlg = SvnTagDialog(
+            self.allTagsBranchesList, url, self.otherData["standardLayout"]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, tagOp = dlg.getParameters()
             if tag in self.allTagsBranchesList:
@@ -1099,10 +1116,10 @@
             self.allTagsBranchesList.insert(0, tag)
         else:
             return
-        
+
         if self.otherData["standardLayout"]:
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
-            
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
+
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -1111,27 +1128,30 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The tag operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return
-            
+
             reposRoot = match.group(1)
             if tagOp in [1, 4]:
-                url = '{0}/tags/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/tags/{1}".format(reposRoot, quote(tag))
             elif tagOp in [2, 8]:
-                url = '{0}/branches/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/branches/{1}".format(reposRoot, quote(tag))
         else:
             url = self.__svnURL(tag)
-        
+
         self.tagName = tag
         client = self.getClient()
         rev = None
         if tagOp in [1, 2]:
-            log = 'Created tag <{0}>'.format(self.tagName)
+            log = "Created tag <{0}>".format(self.tagName)
             dlg = SvnDialog(
-                self.tr('Tagging {0} in the Subversion repository')
-                    .format(name),
+                self.tr("Tagging {0} in the Subversion repository").format(name),
                 "copy --message {0} {1} {2}".format(log, reposURL, url),
-                client, log=log)
+                client,
+                log=log,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
@@ -1139,27 +1159,27 @@
             except pysvn.ClientError as e:
                 dlg.showError(e.args[0])
         else:
-            log = 'Deleted tag <{0}>'.format(self.tagName)
+            log = "Deleted tag <{0}>".format(self.tagName)
             dlg = SvnDialog(
-                self.tr('Tagging {0} in the Subversion repository')
-                    .format(name),
+                self.tr("Tagging {0} in the Subversion repository").format(name),
                 "remove --message {0} {1}".format(log, url),
-                client, log=log)
+                client,
+                log=log,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
                     rev = client.remove(url)
             except pysvn.ClientError as e:
                 dlg.showError(e.args[0])
-        rev and dlg.showMessage(
-            self.tr("Revision {0}.\n").format(rev.number))
+        rev and dlg.showMessage(self.tr("Revision {0}.\n").format(rev.number))
         dlg.finish()
         dlg.exec()
-        
+
     def vcsRevert(self, name):
         """
         Public method used to revert changes made to a file/directory.
-        
+
         @param name file/directory name to be reverted
         @type str
         @return flag indicating, that the update contained an add
@@ -1171,35 +1191,40 @@
             name = [name]
             if os.path.isdir(name[0]):
                 recurse = True
-        
+
         project = ericApp().getObject("Project")
         names = [project.getRelativePath(nam) for nam in name]
         if names[0]:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dia = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Revert changes"),
                 self.tr(
                     "Do you really want to revert all changes to these files"
-                    " or directories?"),
-                name)
+                    " or directories?"
+                ),
+                name,
+            )
             yes = dia.exec() == QDialog.DialogCode.Accepted
         else:
             yes = EricMessageBox.yesNo(
                 None,
                 self.tr("Revert changes"),
-                self.tr("""Do you really want to revert all changes of"""
-                        """ the project?"""))
+                self.tr(
+                    """Do you really want to revert all changes of"""
+                    """ the project?"""
+                ),
+            )
         if yes:
             client = self.getClient()
             dlg = SvnDialog(
-                self.tr('Reverting changes'),
+                self.tr("Reverting changes"),
                 "revert {0} {1}".format(
-                    (not recurse) and " --non-recursive" or "",
-                    " ".join(name)),
-                client)
+                    (not recurse) and " --non-recursive" or "", " ".join(name)
+                ),
+                client,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
@@ -1209,31 +1234,31 @@
             dlg.finish()
             dlg.exec()
             self.checkVCSStatus()
-        
+
         return False
-    
+
     def vcsForget(self, name):
         """
         Public method used to remove a file from the repository.
-        
+
         Note: svn does not support this operation. The method is implemented
         as a NoOp.
-        
+
         @param name file/directory name to be removed
         @type str or list of str
         """
         pass
-    
+
     def vcsSwitch(self, name):
         """
         Public method used to switch a directory to a different tag/branch.
-        
+
         @param name directory name to be switched (string)
         @return flag indicating, that the switch contained an add
             or delete (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         reposURL = self.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -1242,17 +1267,19 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The switch"""
-                    """ operation will be aborted"""))
+                    """ operation will be aborted"""
+                ),
+            )
             return False
-        
+
         url = (
-            None
-            if self.otherData["standardLayout"] else
-            self.svnNormalizeURL(reposURL)
+            None if self.otherData["standardLayout"] else self.svnNormalizeURL(reposURL)
         )
         from .SvnSwitchDialog import SvnSwitchDialog
-        dlg = SvnSwitchDialog(self.allTagsBranchesList, url,
-                              self.otherData["standardLayout"])
+
+        dlg = SvnSwitchDialog(
+            self.allTagsBranchesList, url, self.otherData["standardLayout"]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, tagType = dlg.getParameters()
             if tag in self.allTagsBranchesList:
@@ -1260,9 +1287,9 @@
             self.allTagsBranchesList.insert(0, tag)
         else:
             return False
-        
+
         if self.otherData["standardLayout"]:
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -1271,26 +1298,30 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The switch operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return False
-            
+
             reposRoot = match.group(1)
             tn = tag
             if tagType == 1:
-                url = '{0}/tags/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/tags/{1}".format(reposRoot, quote(tag))
             elif tagType == 2:
-                url = '{0}/branches/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/branches/{1}".format(reposRoot, quote(tag))
             elif tagType == 4:
-                url = '{0}/trunk'.format(reposRoot)
-                tn = 'HEAD'
+                url = "{0}/trunk".format(reposRoot)
+                tn = "HEAD"
         else:
             url = self.__svnURL(tag)
             tn = url
-        
+
         client = self.getClient()
-        dlg = SvnDialog(self.tr('Switching to {0}').format(tn),
-                        "switch {0} {1}".format(url, name),
-                        client)
+        dlg = SvnDialog(
+            self.tr("Switching to {0}").format(tn),
+            "switch {0} {1}".format(url, name),
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -1303,24 +1334,26 @@
         res = dlg.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-        
+
     def vcsMerge(self, name):
         """
         Public method used to merge a URL/revision into the local project.
-        
+
         @param name file/directory name to be merged (string)
         """
         dname, fname = self.splitPath(name)
-        
-        opts = self.options['global']
+
+        opts = self.options["global"]
         from .SvnMergeDialog import SvnMergeDialog
-        dlg = SvnMergeDialog(self.mergeList[0], self.mergeList[1],
-                             self.mergeList[2], "--force" in opts)
+
+        dlg = SvnMergeDialog(
+            self.mergeList[0], self.mergeList[1], self.mergeList[2], "--force" in opts
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             urlrev1, urlrev2, target, force = dlg.getParameters()
         else:
             return
-        
+
         # remember URL or revision
         if urlrev1 in self.mergeList[0]:
             self.mergeList[0].remove(urlrev1)
@@ -1328,9 +1361,9 @@
         if urlrev2 in self.mergeList[1]:
             self.mergeList[1].remove(urlrev2)
         self.mergeList[1].insert(0, urlrev2)
-        
-        rx_rev = re.compile('\\d+|HEAD|head')
-        
+
+        rx_rev = re.compile("\\d+|HEAD|head")
+
         cwd = os.getcwd()
         os.chdir(dname)
         recurse = "--non-recursive" not in opts
@@ -1339,15 +1372,13 @@
                 revision1 = pysvn.Revision(pysvn.opt_revision_kind.head)
                 rev1 = "HEAD"
             else:
-                revision1 = pysvn.Revision(
-                    pysvn.opt_revision_kind.number, int(urlrev1))
+                revision1 = pysvn.Revision(pysvn.opt_revision_kind.number, int(urlrev1))
                 rev1 = urlrev1
             if urlrev2 in ["HEAD", "head"]:
                 revision2 = pysvn.Revision(pysvn.opt_revision_kind.head)
                 rev2 = "HEAD"
             else:
-                revision2 = pysvn.Revision(
-                    pysvn.opt_revision_kind.number, int(urlrev2))
+                revision2 = pysvn.Revision(pysvn.opt_revision_kind.number, int(urlrev2))
                 rev2 = urlrev2
             if not target:
                 url1 = name
@@ -1355,7 +1386,7 @@
             else:
                 url1 = target
                 url2 = target
-                
+
             # remember target
             if target in self.mergeList[2]:
                 self.mergeList[2].remove(target)
@@ -1367,8 +1398,7 @@
                     revision1 = pysvn.Revision(pysvn.opt_revision_kind.head)
                     rev1 = "HEAD"
                 else:
-                    revision1 = pysvn.Revision(
-                        pysvn.opt_revision_kind.number, int(rev))
+                    revision1 = pysvn.Revision(pysvn.opt_revision_kind.number, int(rev))
                     rev1 = rev
             else:
                 url1 = urlrev1
@@ -1380,8 +1410,7 @@
                     revision2 = pysvn.Revision(pysvn.opt_revision_kind.head)
                     rev2 = "HEAD"
                 else:
-                    revision2 = pysvn.Revision(
-                        pysvn.opt_revision_kind.number, int(rev))
+                    revision2 = pysvn.Revision(pysvn.opt_revision_kind.number, int(rev))
                     rev2 = rev
             else:
                 url2 = urlrev2
@@ -1389,29 +1418,38 @@
                 rev2 = ""
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Merging {0}').format(name),
+            self.tr("Merging {0}").format(name),
             "merge{0}{1} {2} {3} {4}".format(
                 (not recurse) and " --non-recursive" or "",
                 force and " --force" or "",
                 "{0}{1}".format(url1, rev1 and ("@" + rev1) or ""),
                 "{0}{1}".format(url2, rev2 and ("@" + rev2) or ""),
-                fname),
-            client)
+                fname,
+            ),
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
-                client.merge(url1, revision1, url2, revision2, fname,
-                             recurse=recurse, force=force)
+                client.merge(
+                    url1,
+                    revision1,
+                    url2,
+                    revision2,
+                    fname,
+                    recurse=recurse,
+                    force=force,
+                )
         except pysvn.ClientError as e:
             dlg.showError(e.args[0])
         dlg.finish()
         dlg.exec()
         os.chdir(cwd)
-        
+
     def vcsRegisteredState(self, name):
         """
         Public method used to get the registered state of a file in the vcs.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
@@ -1419,14 +1457,14 @@
             return self.__vcsRegisteredState_wcng(name)
         else:
             return self.__vcsRegisteredState_wc(name)
-        
+
     def __vcsRegisteredState_wcng(self, name):
         """
         Private method used to get the registered state of a file in the vcs.
-        
+
         This is the variant for subversion installations using the new
         working copy meta-data format.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
@@ -1434,13 +1472,13 @@
             name = name[:-1]
         name = os.path.normcase(name)
         dname, fname = self.splitPath(name)
-        
-        if fname == '.' and os.path.isdir(os.path.join(dname, self.adminDir)):
+
+        if fname == "." and os.path.isdir(os.path.join(dname, self.adminDir)):
             return self.canBeCommitted
-        
+
         if name in self.statusCache:
             return self.statusCache[name]
-        
+
         name = os.path.normcase(name)
         states = {name: 0}
         states = self.vcsAllRegisteredStates(states, dname, False)
@@ -1448,25 +1486,25 @@
             return self.canBeCommitted
         else:
             return self.canBeAdded
-        
+
     def __vcsRegisteredState_wc(self, name):
         """
         Private method used to get the registered state of a file in the vcs.
-        
+
         This is the variant for subversion installations using the old working
         copy meta-data format.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
         dname, fname = self.splitPath(name)
-        
-        if fname == '.':
+
+        if fname == ".":
             if os.path.isdir(os.path.join(dname, self.adminDir)):
                 return self.canBeCommitted
             else:
                 return self.canBeAdded
-        
+
         name = os.path.normcase(name)
         states = {name: 0}
         states = self.vcsAllRegisteredStates(states, dname, False)
@@ -1474,16 +1512,16 @@
             return self.canBeCommitted
         else:
             return self.canBeAdded
-        
+
     def vcsAllRegisteredStates(self, names, dname, shortcut=True):
         """
         Public method used to get the registered states of a number of files
         in the vcs.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files has been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1494,19 +1532,19 @@
             return self.__vcsAllRegisteredStates_wcng(names, dname, shortcut)
         else:
             return self.__vcsAllRegisteredStates_wc(names, dname, shortcut)
-        
+
     def __vcsAllRegisteredStates_wcng(self, names, dname, shortcut=True):
         """
         Private method used to get the registered states of a number of files
         in the vcs.
-        
+
         This is the variant for subversion installations using the new working
         copy meta-data format.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files has been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1516,13 +1554,13 @@
         if dname.endswith(os.sep):
             dname = dname[:-1]
         dname = os.path.normcase(dname)
-        
+
         found = False
         for name in self.statusCache:
             if name in names:
                 found = True
                 names[name] = self.statusCache[name]
-        
+
         if not found:
             # find the root of the repo
             repodir = dname
@@ -1530,19 +1568,21 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return names
-            
+
             from .SvnDialogMixin import SvnDialogMixin
+
             mixin = SvnDialogMixin()
             client = self.getClient()
             client.callback_get_login = mixin._clientLoginCallback
             client.callback_ssl_server_trust_prompt = (
                 mixin._clientSslServerTrustPromptCallback
             )
-            
+
             with contextlib.suppress(pysvn.ClientError):
                 with EricMutexLocker(self.vcsExecutionMutex):
-                    allFiles = client.status(dname, recurse=True, get_all=True,
-                                             ignore=True, update=False)
+                    allFiles = client.status(
+                        dname, recurse=True, get_all=True, ignore=True, update=False
+                    )
                 dirs = [x for x in names.keys() if os.path.isdir(x)]
                 for file in allFiles:
                     name = os.path.normcase(file.path)
@@ -1550,15 +1590,11 @@
                         if name in names:
                             names[name] = self.canBeCommitted
                             dn = name
-                            while (
-                                os.path.splitdrive(dn)[1] != os.sep and
-                                dn != repodir
-                            ):
+                            while os.path.splitdrive(dn)[1] != os.sep and dn != repodir:
                                 dn = os.path.dirname(dn)
                                 if (
-                                    dn in self.statusCache and
-                                    self.statusCache[dn] ==
-                                        self.canBeCommitted
+                                    dn in self.statusCache
+                                    and self.statusCache[dn] == self.canBeCommitted
                                 ):
                                     break
                                 self.statusCache[dn] = self.canBeCommitted
@@ -1572,21 +1608,21 @@
                                     break
                     else:
                         self.statusCache[name] = self.canBeAdded
-        
+
         return names
-        
+
     def __vcsAllRegisteredStates_wc(self, names, dname, shortcut=True):
         """
         Private method used to get the registered states of a number of files
         in the VCS.
-        
+
         This is the variant for subversion installations using the old working
         copy meta-data format.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files has been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1596,7 +1632,7 @@
         if not os.path.isdir(os.path.join(dname, self.adminDir)):
             # not under version control -> do nothing
             return names
-        
+
         found = False
         for name in self.statusCache:
             if os.path.dirname(name) == dname:
@@ -1606,20 +1642,22 @@
                 if name in names:
                     found = True
                     names[name] = self.statusCache[name]
-        
+
         if not found:
             from .SvnDialogMixin import SvnDialogMixin
+
             mixin = SvnDialogMixin()
             client = self.getClient()
             client.callback_get_login = mixin._clientLoginCallback
             client.callback_ssl_server_trust_prompt = (
                 mixin._clientSslServerTrustPromptCallback
             )
-            
+
             with contextlib.suppress(pysvn.ClientError):
                 with EricMutexLocker(self.vcsExecutionMutex):
-                    allFiles = client.status(dname, recurse=True, get_all=True,
-                                             ignore=True, update=False)
+                    allFiles = client.status(
+                        dname, recurse=True, get_all=True, ignore=True, update=False
+                    )
                 for file in allFiles:
                     name = os.path.normcase(file.path)
                     if self.__isVersioned(file):
@@ -1628,14 +1666,14 @@
                         self.statusCache[name] = self.canBeCommitted
                     else:
                         self.statusCache[name] = self.canBeAdded
-        
+
         return names
-        
+
     def __isVersioned(self, status):
         """
         Private method to check, if the given status indicates a
         versioned state.
-        
+
         @param status status object to check (pysvn.PysvnStatus)
         @return flag indicating a versioned state (boolean)
         """
@@ -1649,20 +1687,20 @@
             pysvn.wc_status_kind.merged,
             pysvn.wc_status_kind.conflicted,
         ]
-        
+
     def clearStatusCache(self):
         """
         Public method to clear the status cache.
         """
         self.statusCache = {}
-        
+
     def vcsInitConfig(self, project):
         """
         Public method to initialize the VCS configuration.
-        
+
         This method ensures, that eric specific files and directories are
         ignored.
-        
+
         @param project reference to the project (Project)
         """
         configPath = getConfigPath()
@@ -1670,11 +1708,11 @@
             amendConfig()
         else:
             createDefaultConfig()
-    
+
     def vcsName(self):
         """
         Public method returning the name of the vcs.
-        
+
         @return always 'Subversion' (string)
         """
         return "Subversion"
@@ -1682,13 +1720,13 @@
     def vcsCleanup(self, name):
         """
         Public method used to cleanup the working copy.
-        
+
         @param name directory name to be cleaned up (string)
         """
         client = self.getClient()
-        dlg = SvnDialog(self.tr('Cleaning up {0}').format(name),
-                        "cleanup {0}".format(name),
-                        client)
+        dlg = SvnDialog(
+            self.tr("Cleaning up {0}").format(name), "cleanup {0}".format(name), client
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -1697,19 +1735,20 @@
             dlg.showError(e.args[0])
         dlg.finish()
         dlg.exec()
-    
+
     def vcsCommandLine(self, name):
         """
         Public method used to execute arbitrary subversion commands.
-        
+
         @param name directory name of the working directory (string)
         """
         from .SvnCommandDialog import SvnCommandDialog
+
         dlg = SvnCommandDialog(self.commandHistory, self.wdHistory, name)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             command, wd = dlg.getData()
             commandList = Utilities.parseOptionString(command)
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             if command in self.commandHistory:
@@ -1718,22 +1757,23 @@
             if wd in self.wdHistory:
                 self.wdHistory.remove(wd)
             self.wdHistory.insert(0, wd)
-            
+
             args = []
             self.addArguments(args, commandList)
-            
+
             from Plugins.VcsPlugins.vcsSubversion.SvnDialog import (
-                SvnDialog as SvnProcessDialog
+                SvnDialog as SvnProcessDialog,
             )
-            dia = SvnProcessDialog(self.tr('Subversion command'))
+
+            dia = SvnProcessDialog(self.tr("Subversion command"))
             res = dia.startProcess(args, wd)
             if res:
                 dia.exec()
-        
+
     def vcsOptionsDialog(self, project, archive, editable=False, parent=None):
         """
         Public method to get a dialog to enter repository info.
-        
+
         @param project reference to the project object
         @param archive name of the project in the repository (string)
         @param editable flag indicating that the project name is editable
@@ -1742,24 +1782,26 @@
         @return reference to the instantiated options dialog (SvnOptionsDialog)
         """
         from .SvnOptionsDialog import SvnOptionsDialog
+
         return SvnOptionsDialog(self, project, parent)
-        
+
     def vcsNewProjectOptionsDialog(self, parent=None):
         """
         Public method to get a dialog to enter repository info for getting a
         new project.
-        
+
         @param parent parent widget (QWidget)
         @return reference to the instantiated options dialog
             (SvnNewProjectOptionsDialog)
         """
         from .SvnNewProjectOptionsDialog import SvnNewProjectOptionsDialog
+
         return SvnNewProjectOptionsDialog(self, parent)
-        
+
     def vcsRepositoryInfos(self, ppath):
         """
         Public method to retrieve information about the repository.
-        
+
         @param ppath local path to get the repository infos (string)
         @return string with ready formated info for display (string)
         """
@@ -1767,18 +1809,19 @@
             entry = self.getClient().info(ppath)
         except pysvn.ClientError as e:
             return e.args[0]
-        
+
         apiVersion = (
             "{0} {1}".format(
                 ".".join([str(v) for v in pysvn.svn_api_version[:3]]),
-                pysvn.svn_api_version[3])
-            if hasattr(pysvn, 'svn_api_version') else
-            QCoreApplication.translate('subversion', "unknown")
+                pysvn.svn_api_version[3],
+            )
+            if hasattr(pysvn, "svn_api_version")
+            else QCoreApplication.translate("subversion", "unknown")
         )
-        
+
         hmsz = time.strftime("%H:%M:%S %Z", time.localtime(entry.commit_time))
         return QCoreApplication.translate(
-            'subversion',
+            "subversion",
             """<h3>Repository information</h3>"""
             """<table>"""
             """<tr><td><b>PySvn V.</b></td><td>{0}</td></tr>"""
@@ -1790,7 +1833,7 @@
             """<tr><td><b>Committed date</b></td><td>{6}</td></tr>"""
             """<tr><td><b>Comitted time</b></td><td>{7}</td></tr>"""
             """<tr><td><b>Last author</b></td><td>{8}</td></tr>"""
-            """</table>"""
+            """</table>""",
         ).format(
             ".".join([str(v) for v in pysvn.version]),
             ".".join([str(v) for v in pysvn.svn_version[:3]]),
@@ -1798,21 +1841,20 @@
             entry.url,
             entry.revision.number,
             entry.commit_revision.number,
-            time.strftime(
-                "%Y-%m-%d", time.localtime(entry.commit_time)),
+            time.strftime("%Y-%m-%d", time.localtime(entry.commit_time)),
             hmsz,
-            entry.commit_author
+            entry.commit_author,
         )
-    
+
     ###########################################################################
     ## Public Subversion specific methods are below.
     ###########################################################################
-    
+
     def svnGetReposName(self, path):
         """
         Public method used to retrieve the URL of the subversion repository
         path.
-        
+
         @param path local path to get the svn repository path for (string)
         @return string with the repository path URL
         """
@@ -1828,7 +1870,7 @@
     def vcsResolved(self, name):
         """
         Public method used to resolve conflicts of a file/directory.
-        
+
         @param name file/directory name to be resolved (string)
         """
         if isinstance(name, list):
@@ -1836,17 +1878,19 @@
         else:
             dname, fname = self.splitPath(name)
             fnames = [fname]
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
-        opts = self.options['global']
+        opts = self.options["global"]
         recurse = "--non-recursive" not in opts
         client = self.getClient()
-        dlg = SvnDialog(self.tr('Resolving conficts'),
-                        "resolved{0} {1}".format(
-                            (not recurse) and " --non-recursive" or "",
-                            " ".join(fnames)),
-                        client)
+        dlg = SvnDialog(
+            self.tr("Resolving conficts"),
+            "resolved{0} {1}".format(
+                (not recurse) and " --non-recursive" or "", " ".join(fnames)
+            ),
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -1858,22 +1902,23 @@
         dlg.exec()
         os.chdir(cwd)
         self.checkVCSStatus()
-    
+
     def svnCopy(self, name, project):
         """
         Public method used to copy a file/directory.
-        
+
         @param name file/directory name to be copied (string)
         @param project reference to the project object
         @return flag indicating successfull operation (boolean)
         """
         from .SvnCopyDialog import SvnCopyDialog
-        rx_prot = re.compile('(file:|svn:|svn+ssh:|http:|https:).+')
+
+        rx_prot = re.compile("(file:|svn:|svn+ssh:|http:|https:).+")
         dlg = SvnCopyDialog(name)
         res = False
         if dlg.exec() == QDialog.DialogCode.Accepted:
             target, force = dlg.getData()
-            
+
             client = self.getClient()
             if bool(rx_prot.fullmatch(target)):
                 target = self.__svnURL(target)
@@ -1882,11 +1927,13 @@
                 log = ""
                 target = target
             dlg = SvnDialog(
-                self.tr('Copying {0}').format(name),
+                self.tr("Copying {0}").format(name),
                 "copy{0} {1} {2}".format(
-                    log and (" --message {0}".format(log)) or "",
-                    name, target),
-                client, log=log)
+                    log and (" --message {0}".format(log)) or "", name, target
+                ),
+                client,
+                log=log,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
@@ -1898,39 +1945,41 @@
             dlg.finish()
             dlg.exec()
             if (
-                res and
-                not bool(rx_prot.fullmatch(target)) and
-                target.startswith(project.getProjectPath())
+                res
+                and not bool(rx_prot.fullmatch(target))
+                and target.startswith(project.getProjectPath())
             ):
                 if os.path.isdir(name):
                     project.copyDirectory(name, target)
                 else:
                     project.appendFile(target)
         return res
-    
+
     def svnListProps(self, name, recursive=False):
         """
         Public method used to list the properties of a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
         if self.propList is None:
             from .SvnPropListDialog import SvnPropListDialog
+
             self.propList = SvnPropListDialog(self)
         self.propList.show()
         self.propList.raise_()
         QApplication.processEvents()
         self.propList.start(name, recursive)
-        
+
     def svnSetProp(self, name, recursive=False):
         """
         Public method used to add a property to a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive set is requested
         """
         from .SvnPropSetDialog import SvnPropSetDialog
+
         dlg = SvnPropSetDialog(recursive)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             propName, propValue, recurse = dlg.getData()
@@ -1938,103 +1987,117 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Subversion Set Property"),
-                    self.tr(
-                        """You have to supply a property name. Aborting."""))
+                    self.tr("""You have to supply a property name. Aborting."""),
+                )
                 return
-            
+
             if isinstance(name, list):
                 dname, fnames = self.splitPathList(name)
             else:
                 dname, fname = self.splitPath(name)
                 fnames = [fname]
-            
+
             cwd = os.getcwd()
             os.chdir(dname)
-            opts = self.options['global']
+            opts = self.options["global"]
             skipchecks = "--skip-checks" in opts
             client = self.getClient()
             dlg = SvnDialog(
-                self.tr('Subversion Set Property'),
+                self.tr("Subversion Set Property"),
                 "propset{0}{1} {2} {3} {4}".format(
                     recurse and " --recurse" or "",
                     skipchecks and " --skip-checks" or "",
-                    propName, propValue,
-                    " ".join(fnames)),
-                client)
+                    propName,
+                    propValue,
+                    " ".join(fnames),
+                ),
+                client,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
                     for name in fnames:
-                        client.propset(propName, propValue, name,
-                                       recurse=recurse, skip_checks=skipchecks)
+                        client.propset(
+                            propName,
+                            propValue,
+                            name,
+                            recurse=recurse,
+                            skip_checks=skipchecks,
+                        )
             except pysvn.ClientError as e:
                 dlg.showError(e.args[0])
             dlg.showMessage(self.tr("Property set."))
             dlg.finish()
             dlg.exec()
             os.chdir(cwd)
-        
+
     def svnDelProp(self, name, recursive=False):
         """
         Public method used to delete a property of a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
         from .SvnPropDelDialog import SvnPropDelDialog
+
         dlg = SvnPropDelDialog(recursive)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             propName, recurse = dlg.getData()
-            
+
             if not propName:
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Subversion Delete Property"),
-                    self.tr(
-                        """You have to supply a property name. Aborting."""))
+                    self.tr("""You have to supply a property name. Aborting."""),
+                )
                 return
-            
+
             if isinstance(name, list):
                 dname, fnames = self.splitPathList(name)
             else:
                 dname, fname = self.splitPath(name)
                 fnames = [fname]
-            
+
             cwd = os.getcwd()
             os.chdir(dname)
-            opts = self.options['global']
+            opts = self.options["global"]
             skipchecks = "--skip-checks" in opts
             client = self.getClient()
             dlg = SvnDialog(
-                self.tr('Subversion Delete Property'),
+                self.tr("Subversion Delete Property"),
                 "propdel{0}{1} {2} {3}".format(
                     recurse and " --recurse" or "",
                     skipchecks and " --skip-checks" or "",
-                    propName, " ".join(fnames)),
-                client)
+                    propName,
+                    " ".join(fnames),
+                ),
+                client,
+            )
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
                     for name in fnames:
-                        client.propdel(propName, name,
-                                       recurse=recurse, skip_checks=skipchecks)
+                        client.propdel(
+                            propName, name, recurse=recurse, skip_checks=skipchecks
+                        )
             except pysvn.ClientError as e:
                 dlg.showError(e.args[0])
             dlg.showMessage(self.tr("Property deleted."))
             dlg.finish()
             dlg.exec()
             os.chdir(cwd)
-        
+
     def svnListTagBranch(self, path, tags=True):
         """
         Public method used to list the available tags or branches.
-        
+
         @param path directory name of the project (string)
         @param tags flag indicating listing of branches or tags
                 (False = branches, True = tags)
         """
         if self.tagbranchList is None:
             from .SvnTagBranchListDialog import SvnTagBranchListDialog
+
             self.tagbranchList = SvnTagBranchListDialog(self)
         self.tagbranchList.show()
         self.tagbranchList.raise_()
@@ -2044,46 +2107,43 @@
             if tags:
                 self.tagsList = self.tagbranchList.getTagList()
                 if not self.showedTags:
-                    self.allTagsBranchesList = (
-                        self.allTagsBranchesList +
-                        self.tagsList
-                    )
+                    self.allTagsBranchesList = self.allTagsBranchesList + self.tagsList
                     self.showedTags = True
             elif not tags:
                 self.branchesList = self.tagbranchList.getTagList()
                 if not self.showedBranches:
                     self.allTagsBranchesList = (
-                        self.allTagsBranchesList +
-                        self.branchesList
+                        self.allTagsBranchesList + self.branchesList
                     )
                     self.showedBranches = True
-        
+
     def svnBlame(self, name):
         """
         Public method to show the output of the svn blame command.
-        
+
         @param name file name to show the blame for (string)
         """
         if self.blame is None:
             from .SvnBlameDialog import SvnBlameDialog
+
             self.blame = SvnBlameDialog(self)
         self.blame.show()
         self.blame.raise_()
         QApplication.processEvents()
         self.blame.start(name)
-        
+
     def svnExtendedDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Subversion repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -2097,29 +2157,31 @@
                 if nam == project.ppath and not project.saveAllScripts():
                     return
         from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
+
         dlg = SvnRevisionSelectionDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             revisions = dlg.getRevisions()
             if self.diff is None:
                 from .SvnDiffDialog import SvnDiffDialog
+
                 self.diff = SvnDiffDialog(self)
             self.diff.show()
             self.diff.raise_()
             QApplication.processEvents()
             self.diff.start(name, revisions)
-        
+
     def svnUrlDiff(self, name):
         """
         Public method used to view the difference of a file/directory of two
         repository URLs.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -2132,44 +2194,45 @@
                 project = ericApp().getObject("Project")
                 if nam == project.ppath and not project.saveAllScripts():
                     return
-        
+
         dname = self.splitPath(names[0])[0]
-        
+
         from .SvnUrlSelectionDialog import SvnUrlSelectionDialog
-        dlg = SvnUrlSelectionDialog(self, self.tagsList, self.branchesList,
-                                    dname)
+
+        dlg = SvnUrlSelectionDialog(self, self.tagsList, self.branchesList, dname)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             urls, summary = dlg.getURLs()
             if self.diff is None:
                 from .SvnDiffDialog import SvnDiffDialog
+
                 self.diff = SvnDiffDialog(self)
             self.diff.show()
             self.diff.raise_()
             QApplication.processEvents()
             self.diff.start(name, urls=urls, summary=summary)
-        
+
     def __svnGetFileForRevision(self, name, rev=""):
         """
         Private method to get a file for a specific revision from the
         repository.
-        
+
         @param name file name to get from the repository (string)
         @param rev revision to retrieve (integer or string)
         @return contents of the file (string) and an error message (string)
         """
         output = ""
         error = ""
-        
+
         client = self.getClient()
         try:
             if rev:
                 if isinstance(rev, int) or rev.isdecimal():
-                    rev = pysvn.Revision(
-                        pysvn.opt_revision_kind.number, int(rev))
+                    rev = pysvn.Revision(pysvn.opt_revision_kind.number, int(rev))
                 elif rev.startswith("{"):
                     dateStr = rev[1:-1]
                     secs = QDateTime.fromString(
-                        dateStr, Qt.DateFormat.ISODate).toTime_t()
+                        dateStr, Qt.DateFormat.ISODate
+                    ).toTime_t()
                     rev = pysvn.Revision(pysvn.opt_revision_kind.date, secs)
                 elif rev == "HEAD":
                     rev = pysvn.Revision(pysvn.opt_revision_kind.head)
@@ -2186,17 +2249,17 @@
                 output = client.cat(name, revision=rev)
             else:
                 output = client.cat(name)
-            output = output.decode('utf-8')
+            output = output.decode("utf-8")
         except pysvn.ClientError as e:
             error = str(e)
-        
+
         return output, error
-    
+
     def vcsSbsDiff(self, name, extended=False, revisions=None):
         """
         Public method used to view the difference of a file to the Mercurial
         repository side-by-side.
-        
+
         @param name file name to be diffed (string)
         @param extended flag indicating the extended variant (boolean)
         @param revisions tuple of two revisions (tuple of strings)
@@ -2204,9 +2267,10 @@
         """
         if isinstance(name, list):
             raise ValueError("Wrong parameter type")
-        
+
         if extended:
             from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
+
             dlg = SvnRevisionSelectionDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev1, rev2 = dlg.getRevisions()
@@ -2220,23 +2284,21 @@
             rev1, rev2 = revisions[0], revisions[1]
         else:
             rev1, rev2 = "", ""
-        
+
         output1, error = self.__svnGetFileForRevision(name, rev=rev1)
         if error:
             EricMessageBox.critical(
-                self.__ui,
-                self.tr("Subversion Side-by-Side Difference"),
-                error)
+                self.__ui, self.tr("Subversion Side-by-Side Difference"), error
+            )
             return
         name1 = "{0} (rev. {1})".format(name, rev1 and rev1 or ".")
-        
+
         if rev2:
             output2, error = self.__svnGetFileForRevision(name, rev=rev2)
             if error:
                 EricMessageBox.critical(
-                    self.__ui,
-                    self.tr("Subversion Side-by-Side Difference"),
-                    error)
+                    self.__ui, self.tr("Subversion Side-by-Side Difference"), error
+                )
                 return
             name2 = "{0} (rev. {1})".format(name, rev2)
         else:
@@ -2248,38 +2310,41 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Subversion Side-by-Side Difference"),
-                    self.tr(
-                        """<p>The file <b>{0}</b> could not be read.</p>""")
-                    .format(name))
+                    self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                        name
+                    ),
+                )
                 return
-        
+
         if self.sbsDiff is None:
             from UI.CompareDialog import CompareDialog
+
             self.sbsDiff = CompareDialog()
         self.sbsDiff.show()
         self.sbsDiff.raise_()
         self.sbsDiff.compare(output1, output2, name1, name2)
-    
+
     def vcsLogBrowser(self, name, isFile=False):
         """
         Public method used to browse the log of a file/directory from the
         Subversion repository.
-        
+
         @param name file/directory name to show the log of (string)
         @param isFile flag indicating log for a file is to be shown (boolean)
         """
         if self.logBrowser is None:
             from .SvnLogBrowserDialog import SvnLogBrowserDialog
+
             self.logBrowser = SvnLogBrowserDialog(self)
         self.logBrowser.show()
         self.logBrowser.raise_()
         QApplication.processEvents()
         self.logBrowser.start(name, isFile=isFile)
-        
+
     def svnLock(self, name, stealIt=False, parent=None):
         """
         Public method used to lock a file in the Subversion repository.
-        
+
         @param name file/directory name to be locked (string or list of
             strings)
         @param stealIt flag indicating a forced operation (boolean)
@@ -2290,27 +2355,31 @@
             None,
             self.tr("Subversion Lock"),
             self.tr("Enter lock comment"),
-            QLineEdit.EchoMode.Normal)
-        
+            QLineEdit.EchoMode.Normal,
+        )
+
         if not ok:
             return
-        
+
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
         else:
             dname, fname = self.splitPath(name)
             fnames = [fname]
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Locking in the Subversion repository'),
+            self.tr("Locking in the Subversion repository"),
             "lock{0}{1} {2}".format(
                 stealIt and " --force" or "",
                 comment and (" --message {0}".format(comment)) or "",
-                " ".join(fnames)),
-            client, parent=parent)
+                " ".join(fnames),
+            ),
+            client,
+            parent=parent,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -2322,11 +2391,11 @@
         dlg.finish()
         dlg.exec()
         os.chdir(cwd)
-        
+
     def svnUnlock(self, name, breakIt=False, parent=None):
         """
         Public method used to unlock a file in the Subversion repository.
-        
+
         @param name file/directory name to be unlocked (string or list of
             strings)
         @param breakIt flag indicating a forced operation (boolean)
@@ -2338,15 +2407,16 @@
         else:
             dname, fname = self.splitPath(name)
             fnames = [fname]
-        
+
         cwd = os.getcwd()
         os.chdir(dname)
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Unlocking in the Subversion repository'),
-            "unlock{0} {1}".format(breakIt and " --force" or "",
-                                   " ".join(fnames)),
-            client, parent=parent)
+            self.tr("Unlocking in the Subversion repository"),
+            "unlock{0} {1}".format(breakIt and " --force" or "", " ".join(fnames)),
+            client,
+            parent=parent,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -2358,26 +2428,28 @@
         dlg.finish()
         dlg.exec()
         os.chdir(cwd)
-        
+
     def svnInfo(self, projectPath, name):
         """
         Public method to show repository information about a file or directory.
-        
+
         @param projectPath path name of the project (string)
         @param name file/directory name relative to the project (string)
         """
         from .SvnInfoDialog import SvnInfoDialog
+
         dlg = SvnInfoDialog(self)
         dlg.start(projectPath, name)
         dlg.exec()
-        
+
     def svnRelocate(self, projectPath):
         """
         Public method to relocate the working copy to a new repository URL.
-        
+
         @param projectPath path name of the project (string)
         """
         from .SvnRelocateDialog import SvnRelocateDialog
+
         currUrl = self.svnGetReposName(projectPath)
         dlg = SvnRelocateDialog(currUrl)
         if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -2385,27 +2457,25 @@
             if inside:
                 msg = "switch {0} {1}".format(newUrl, projectPath)
             else:
-                msg = "relocate {0} {1} {2}".format(currUrl, newUrl,
-                                                    projectPath)
+                msg = "relocate {0} {1} {2}".format(currUrl, newUrl, projectPath)
             client = self.getClient()
-            dlg = SvnDialog(self.tr('Relocating'), msg, client)
+            dlg = SvnDialog(self.tr("Relocating"), msg, client)
             QApplication.processEvents()
             try:
                 with EricMutexLocker(self.vcsExecutionMutex):
                     if inside:
                         client.switch(projectPath, newUrl)
                     else:
-                        client.relocate(currUrl, newUrl, projectPath,
-                                        recurse=True)
+                        client.relocate(currUrl, newUrl, projectPath, recurse=True)
             except pysvn.ClientError as e:
                 dlg.showError(e.args[0])
             dlg.finish()
             dlg.exec()
-        
+
     def svnRepoBrowser(self, projectPath=None):
         """
         Public method to open the repository browser.
-        
+
         @param projectPath path name of the project (string)
         """
         url = self.svnGetReposName(projectPath) if projectPath else None
@@ -2414,23 +2484,25 @@
                 None,
                 self.tr("Repository Browser"),
                 self.tr("Enter the repository URL."),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if not ok or not url:
                 return
-        
+
         if self.repoBrowser is None:
             from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
             self.repoBrowser = SvnRepoBrowserDialog(self)
         self.repoBrowser.start(url)
         self.repoBrowser.show()
         self.repoBrowser.raise_()
-        
+
     def svnRemoveFromChangelist(self, names):
         """
         Public method to remove a file or directory from its changelist.
-        
+
         Note: Directories will be removed recursively.
-        
+
         @param names name or list of names of file or directory to remove
             (string)
         """
@@ -2438,9 +2510,10 @@
             names = [names]
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Remove from changelist'),
+            self.tr("Remove from changelist"),
             "changelist --remove {0}".format(" ".join(names)),
-            client)
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -2450,88 +2523,87 @@
             dlg.showError(e.args[0])
         dlg.finish()
         dlg.exec()
-        
+
     def svnAddToChangelist(self, names):
         """
         Public method to add a file or directory to a changelist.
-        
+
         Note: Directories will be added recursively.
-        
+
         @param names name or list of names of file or directory to add
             (string)
         """
         if not isinstance(names, list):
             names = [names]
-        
+
         clname, ok = QInputDialog.getItem(
             None,
             self.tr("Add to changelist"),
             self.tr("Enter name of the changelist:"),
             sorted(self.svnGetChangelists()),
-            0, True)
+            0,
+            True,
+        )
         if not ok or not clname:
             return
 
         client = self.getClient()
         dlg = SvnDialog(
-            self.tr('Add to changelist'),
+            self.tr("Add to changelist"),
             "changelist {0}".format(" ".join(names)),
-            client)
+            client,
+        )
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
                 for name in names:
-                    client.add_to_changelist(
-                        name, clname, depth=pysvn.depth.infinity)
+                    client.add_to_changelist(name, clname, depth=pysvn.depth.infinity)
         except pysvn.ClientError as e:
             dlg.showError(e.args[0])
         dlg.finish()
         dlg.exec()
-    
+
     def svnShowChangelists(self, path):
         """
         Public method used to inspect the change lists defined for the project.
-        
+
         @param path directory name to show change lists for (string)
         """
         from .SvnChangeListsDialog import SvnChangeListsDialog
+
         self.changeLists = SvnChangeListsDialog(self)
         self.changeLists.show()
         QApplication.processEvents()
         self.changeLists.start(path)
-        
+
     def svnGetChangelists(self):
         """
         Public method to get a list of all defined change lists.
-        
+
         @return list of defined change list names (list of strings)
         """
         changelists = []
         client = self.getClient()
-        if hasattr(client, 'get_changelist'):
+        if hasattr(client, "get_changelist"):
             ppath = ericApp().getObject("Project").getProjectPath()
             with contextlib.suppress(pysvn.ClientError):
                 with EricMutexLocker(self.vcsExecutionMutex):
-                    entries = client.get_changelist(
-                        ppath, depth=pysvn.depth.infinity)
+                    entries = client.get_changelist(ppath, depth=pysvn.depth.infinity)
                 for entry in entries:
                     changelist = entry[1]
                     if changelist not in changelists:
                         changelists.append(changelist)
-        
+
         return changelists
-        
+
     def svnUpgrade(self, path):
         """
         Public method to upgrade the working copy format.
-        
+
         @param path directory name to show change lists for (string)
         """
         client = self.getClient()
-        dlg = SvnDialog(
-            self.tr('Upgrade'),
-            "upgrade {0}".format(path),
-            client)
+        dlg = SvnDialog(self.tr("Upgrade"), "upgrade {0}".format(path), client)
         QApplication.processEvents()
         try:
             with EricMutexLocker(self.vcsExecutionMutex):
@@ -2544,16 +2616,16 @@
     ###########################################################################
     ## Private Subversion specific methods are below.
     ###########################################################################
-    
+
     def __svnURL(self, url):
         """
         Private method to format a url for subversion.
-        
+
         @param url unformatted url string (string)
         @return properly formated url for subversion (string)
         """
         url = self.svnNormalizeURL(url)
-        url = url.split(':', 2)
+        url = url.split(":", 2)
         if len(url) == 3:
             scheme = url[0]
             host = url[1]
@@ -2574,7 +2646,7 @@
     def svnNormalizeURL(self, url):
         """
         Public method to normalize a url for subversion.
-        
+
         @param url url string (string)
         @return properly normalized url for subversion (string)
         """
@@ -2585,8 +2657,8 @@
             url = os.path.normcase(url)
             if url[1] == ":":
                 url = url.replace(":", "|", 1)
-        url = url.replace('\\', '/')
-        if url.endswith('/'):
+        url = url.replace("\\", "/")
+        if url.endswith("/"):
             url = url[:-1]
         if not url.startswith("/") and url[1] in [":", "|"]:
             url = "/{0}".format(url)
@@ -2595,13 +2667,12 @@
     ###########################################################################
     ## Methods to get the helper objects are below.
     ###########################################################################
-    
-    def vcsGetProjectBrowserHelper(self, browser, project,
-                                   isTranslationsBrowser=False):
+
+    def vcsGetProjectBrowserHelper(self, browser, project, isTranslationsBrowser=False):
         """
         Public method to instanciate a helper object for the different
         project browsers.
-        
+
         @param browser reference to the project browser object
         @param project reference to the project object
         @param isTranslationsBrowser flag indicating, the helper is requested
@@ -2609,27 +2680,23 @@
         @return the project browser helper object
         """
         from .ProjectBrowserHelper import SvnProjectBrowserHelper
-        return SvnProjectBrowserHelper(self, browser, project,
-                                       isTranslationsBrowser)
-        
+
+        return SvnProjectBrowserHelper(self, browser, project, isTranslationsBrowser)
+
     def vcsGetProjectHelper(self, project):
         """
         Public method to instanciate a helper object for the project.
-        
+
         @param project reference to the project object
         @return the project helper object
         """
         helper = self.__plugin.getProjectHelper()
         helper.setObjects(self, project)
         self.__wcng = (
-            os.path.exists(
-                os.path.join(project.getProjectPath(), ".svn", "format")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), "_svn", "format")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), ".svn", "wc.db")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), "_svn", "wc.db"))
+            os.path.exists(os.path.join(project.getProjectPath(), ".svn", "format"))
+            or os.path.exists(os.path.join(project.getProjectPath(), "_svn", "format"))
+            or os.path.exists(os.path.join(project.getProjectPath(), ".svn", "wc.db"))
+            or os.path.exists(os.path.join(project.getProjectPath(), "_svn", "wc.db"))
         )
         return helper
 
@@ -2641,11 +2708,12 @@
         """
         Protected method to create an instance of the VCS status monitor
         thread.
-        
+
         @param interval check interval for the monitor thread in seconds
             (integer)
         @param project reference to the project object
         @return reference to the monitor thread (QThread)
         """
         from .SvnStatusMonitorThread import SvnStatusMonitorThread
+
         return SvnStatusMonitorThread(interval, project, self)
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/Config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/Config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,166 +9,168 @@
 
 # Available protocols for the repository URL
 ConfigSvnProtocols = [
-    'file://',
-    'http://',
-    'https://',
-    'svn://',
-    'svn+ssh://',
+    "file://",
+    "http://",
+    "https://",
+    "svn://",
+    "svn+ssh://",
 ]
 
 
-DefaultConfig = "\n".join([
-    "### This file configures various client-side behaviors.",
-    "###",
-    "### The commented-out examples below are intended to demonstrate",
-    "### how to use this file.",
-    "",
-    "### Section for authentication and authorization customizations.",
-    "[auth]",
-    "### Set password stores used by Subversion. They should be",
-    "### delimited by spaces or commas. The order of values determines",
-    "### the order in which password stores are used.",
-    "### Valid password stores:",
-    "###   gnome-keyring        (Unix-like systems)",
-    "###   kwallet              (Unix-like systems)",
-    "###   keychain             (Mac OS X)",
-    "###   windows-cryptoapi    (Windows)",
-    "# password-stores = keychain",
-    "# password-stores = windows-cryptoapi",
-    "# password-stores = gnome-keyring,kwallet",
-    "### To disable all password stores, use an empty list:",
-    "# password-stores =",
-    "###",
-    "### Set KWallet wallet used by Subversion. If empty or unset,",
-    "### then the default network wallet will be used.",
-    "# kwallet-wallet =",
-    "###",
-    "### Include PID (Process ID) in Subversion application name when",
-    "### using KWallet. It defaults to 'no'.",
-    "# kwallet-svn-application-name-with-pid = yes",
-    "###",
-    "### The rest of the [auth] section in this file has been deprecated.",
-    "### Both 'store-passwords' and 'store-auth-creds' can now be",
-    "### specified in the 'servers' file in your config directory",
-    "### and are documented there. Anything specified in this section ",
-    "### is overridden by settings specified in the 'servers' file.",
-    "# store-passwords = no",
-    "# store-auth-creds = no",
-    "",
-    "### Section for configuring external helper applications.",
-    "[helpers]",
-    "### Set editor-cmd to the command used to invoke your text editor.",
-    "###   This will override the environment variables that Subversion",
-    "###   examines by default to find this information ($EDITOR, ",
-    "###   et al).",
-    "# editor-cmd = editor (vi, emacs, notepad, etc.)",
-    "### Set diff-cmd to the absolute path of your 'diff' program.",
-    "###   This will override the compile-time default, which is to use",
-    "###   Subversion's internal diff implementation.",
-    "# diff-cmd = diff_program (diff, gdiff, etc.)",
-    "### Diff-extensions are arguments passed to an external diff",
-    "### program or to Subversion's internal diff implementation.",
-    "### Set diff-extensions to override the default arguments ('-u').",
-    "# diff-extensions = -u -p",
-    "### Set diff3-cmd to the absolute path of your 'diff3' program.",
-    "###   This will override the compile-time default, which is to use",
-    "###   Subversion's internal diff3 implementation.",
-    "# diff3-cmd = diff3_program (diff3, gdiff3, etc.)",
-    "### Set diff3-has-program-arg to 'yes' if your 'diff3' program",
-    "###   accepts the '--diff-program' option.",
-    "# diff3-has-program-arg = [yes | no]",
-    "### Set merge-tool-cmd to the command used to invoke your external",
-    "### merging tool of choice. Subversion will pass 5 arguments to",
-    "### the specified command: base theirs mine merged wcfile",
-    "# merge-tool-cmd = merge_command",
-    "",
-    "### Section for configuring tunnel agents.",
-    "[tunnels]",
-    "### Configure svn protocol tunnel schemes here.  By default, only",
-    "### the 'ssh' scheme is defined.  You can define other schemes to",
-    "### be used with 'svn+scheme://hostname/path' URLs.  A scheme",
-    "### definition is simply a command, optionally prefixed by an",
-    "### environment variable name which can override the command if it",
-    "### is defined.  The command (or environment variable) may contain",
-    "### arguments, using standard shell quoting for arguments with",
-    "### spaces.  The command will be invoked as:",
-    "###   <command> <hostname> svnserve -t",
-    "### (If the URL includes a username, then the hostname will be",
-    "### passed to the tunnel agent as <user>@<hostname>.)  If the",
-    "### built-in ssh scheme were not predefined, it could be defined",
-    "### as:",
-    "# ssh = $SVN_SSH ssh -q",
-    "### If you wanted to define a new 'rsh' scheme, to be used with",
-    "### 'svn+rsh:' URLs, you could do so as follows:",
-    "# rsh = rsh",
-    "### Or, if you wanted to specify a full path and arguments:",
-    "# rsh = /path/to/rsh -l myusername",
-    "### On Windows, if you are specifying a full path to a command,",
-    "### use a forward slash (/) or a paired backslash (\\\\) as the",
-    "### path separator.  A single backslash will be treated as an",
-    "### escape for the following character.",
-    "",
-    "### Section for configuring miscelleneous Subversion options.",
-    "[miscellany]",
-    "### Set global-ignores to a set of whitespace-delimited globs",
-    "### which Subversion will ignore in its 'status' output, and",
-    "### while importing or adding files and directories.",
-    "### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.",
-    "global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc",
-    "  *.pyo .*.rej *.rej .*~ *~ #*# .#* .*.swp .DS_Store",
-    "  *.orig *.bak cur tmp __pycache__ .directory",
-    "  .ropeproject .eric6project .eric7project",
-    "### Set log-encoding to the default encoding for log messages",
-    "# log-encoding = latin1",
-    "### Set use-commit-times to make checkout/update/switch/revert",
-    "### put last-committed timestamps on every file touched.",
-    "# use-commit-times = yes",
-    "### Set no-unlock to prevent 'svn commit' from automatically",
-    "### releasing locks on files.",
-    "# no-unlock = yes",
-    "### Set mime-types-file to a MIME type registry file, used to",
-    "### provide hints to Subversion's MIME type auto-detection",
-    "### algorithm.",
-    "# mime-types-file = /path/to/mime.types",
-    "### Set preserved-conflict-file-exts to a whitespace-delimited",
-    "### list of patterns matching file extensions which should be",
-    "### preserved in generated conflict file names.  By default,",
-    "### conflict files use custom extensions.",
-    "# preserved-conflict-file-exts = doc ppt xls od?",
-    "### Set enable-auto-props to 'yes' to enable automatic properties",
-    "### for 'svn add' and 'svn import', it defaults to 'no'.",
-    "### Automatic properties are defined in the section 'auto-props'.",
-    "# enable-auto-props = yes",
-    "### Set interactive-conflicts to 'no' to disable interactive",
-    "### conflict resolution prompting.  It defaults to 'yes'.",
-    "# interactive-conflicts = no",
-    "### Set memory-cache-size to define the size of the memory cache",
-    "### used by the client when accessing a FSFS repository via",
-    "### ra_local (the file:// scheme). The value represents the number",
-    "### of MB used by the cache.",
-    "# memory-cache-size = 16",
-    "",
-    "### Section for configuring automatic properties.",
-    "[auto-props]",
-    "### The format of the entries is:",
-    "###   file-name-pattern = propname[=value][;propname[=value]...]",
-    "### The file-name-pattern can contain wildcards (such as '*' and",
-    "### '?').  All entries which match (case-insensitively) will be",
-    "### applied to the file.  Note that auto-props functionality",
-    "### must be enabled, which is typically done by setting the",
-    "### 'enable-auto-props' option.",
-    "# *.c = svn:eol-style=native",
-    "# *.cpp = svn:eol-style=native",
-    "# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native",
-    "# *.dsp = svn:eol-style=CRLF",
-    "# *.dsw = svn:eol-style=CRLF",
-    "# *.sh = svn:eol-style=native;svn:executable",
-    "# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;",
-    "# *.png = svn:mime-type=image/png",
-    "# *.jpg = svn:mime-type=image/jpeg",
-    "# Makefile = svn:eol-style=native",
-    "",
-])
+DefaultConfig = "\n".join(
+    [
+        "### This file configures various client-side behaviors.",
+        "###",
+        "### The commented-out examples below are intended to demonstrate",
+        "### how to use this file.",
+        "",
+        "### Section for authentication and authorization customizations.",
+        "[auth]",
+        "### Set password stores used by Subversion. They should be",
+        "### delimited by spaces or commas. The order of values determines",
+        "### the order in which password stores are used.",
+        "### Valid password stores:",
+        "###   gnome-keyring        (Unix-like systems)",
+        "###   kwallet              (Unix-like systems)",
+        "###   keychain             (Mac OS X)",
+        "###   windows-cryptoapi    (Windows)",
+        "# password-stores = keychain",
+        "# password-stores = windows-cryptoapi",
+        "# password-stores = gnome-keyring,kwallet",
+        "### To disable all password stores, use an empty list:",
+        "# password-stores =",
+        "###",
+        "### Set KWallet wallet used by Subversion. If empty or unset,",
+        "### then the default network wallet will be used.",
+        "# kwallet-wallet =",
+        "###",
+        "### Include PID (Process ID) in Subversion application name when",
+        "### using KWallet. It defaults to 'no'.",
+        "# kwallet-svn-application-name-with-pid = yes",
+        "###",
+        "### The rest of the [auth] section in this file has been deprecated.",
+        "### Both 'store-passwords' and 'store-auth-creds' can now be",
+        "### specified in the 'servers' file in your config directory",
+        "### and are documented there. Anything specified in this section ",
+        "### is overridden by settings specified in the 'servers' file.",
+        "# store-passwords = no",
+        "# store-auth-creds = no",
+        "",
+        "### Section for configuring external helper applications.",
+        "[helpers]",
+        "### Set editor-cmd to the command used to invoke your text editor.",
+        "###   This will override the environment variables that Subversion",
+        "###   examines by default to find this information ($EDITOR, ",
+        "###   et al).",
+        "# editor-cmd = editor (vi, emacs, notepad, etc.)",
+        "### Set diff-cmd to the absolute path of your 'diff' program.",
+        "###   This will override the compile-time default, which is to use",
+        "###   Subversion's internal diff implementation.",
+        "# diff-cmd = diff_program (diff, gdiff, etc.)",
+        "### Diff-extensions are arguments passed to an external diff",
+        "### program or to Subversion's internal diff implementation.",
+        "### Set diff-extensions to override the default arguments ('-u').",
+        "# diff-extensions = -u -p",
+        "### Set diff3-cmd to the absolute path of your 'diff3' program.",
+        "###   This will override the compile-time default, which is to use",
+        "###   Subversion's internal diff3 implementation.",
+        "# diff3-cmd = diff3_program (diff3, gdiff3, etc.)",
+        "### Set diff3-has-program-arg to 'yes' if your 'diff3' program",
+        "###   accepts the '--diff-program' option.",
+        "# diff3-has-program-arg = [yes | no]",
+        "### Set merge-tool-cmd to the command used to invoke your external",
+        "### merging tool of choice. Subversion will pass 5 arguments to",
+        "### the specified command: base theirs mine merged wcfile",
+        "# merge-tool-cmd = merge_command",
+        "",
+        "### Section for configuring tunnel agents.",
+        "[tunnels]",
+        "### Configure svn protocol tunnel schemes here.  By default, only",
+        "### the 'ssh' scheme is defined.  You can define other schemes to",
+        "### be used with 'svn+scheme://hostname/path' URLs.  A scheme",
+        "### definition is simply a command, optionally prefixed by an",
+        "### environment variable name which can override the command if it",
+        "### is defined.  The command (or environment variable) may contain",
+        "### arguments, using standard shell quoting for arguments with",
+        "### spaces.  The command will be invoked as:",
+        "###   <command> <hostname> svnserve -t",
+        "### (If the URL includes a username, then the hostname will be",
+        "### passed to the tunnel agent as <user>@<hostname>.)  If the",
+        "### built-in ssh scheme were not predefined, it could be defined",
+        "### as:",
+        "# ssh = $SVN_SSH ssh -q",
+        "### If you wanted to define a new 'rsh' scheme, to be used with",
+        "### 'svn+rsh:' URLs, you could do so as follows:",
+        "# rsh = rsh",
+        "### Or, if you wanted to specify a full path and arguments:",
+        "# rsh = /path/to/rsh -l myusername",
+        "### On Windows, if you are specifying a full path to a command,",
+        "### use a forward slash (/) or a paired backslash (\\\\) as the",
+        "### path separator.  A single backslash will be treated as an",
+        "### escape for the following character.",
+        "",
+        "### Section for configuring miscelleneous Subversion options.",
+        "[miscellany]",
+        "### Set global-ignores to a set of whitespace-delimited globs",
+        "### which Subversion will ignore in its 'status' output, and",
+        "### while importing or adding files and directories.",
+        "### '*' matches leading dots, e.g. '*.rej' matches '.foo.rej'.",
+        "global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc",
+        "  *.pyo .*.rej *.rej .*~ *~ #*# .#* .*.swp .DS_Store",
+        "  *.orig *.bak cur tmp __pycache__ .directory",
+        "  .ropeproject .eric6project .eric7project",
+        "### Set log-encoding to the default encoding for log messages",
+        "# log-encoding = latin1",
+        "### Set use-commit-times to make checkout/update/switch/revert",
+        "### put last-committed timestamps on every file touched.",
+        "# use-commit-times = yes",
+        "### Set no-unlock to prevent 'svn commit' from automatically",
+        "### releasing locks on files.",
+        "# no-unlock = yes",
+        "### Set mime-types-file to a MIME type registry file, used to",
+        "### provide hints to Subversion's MIME type auto-detection",
+        "### algorithm.",
+        "# mime-types-file = /path/to/mime.types",
+        "### Set preserved-conflict-file-exts to a whitespace-delimited",
+        "### list of patterns matching file extensions which should be",
+        "### preserved in generated conflict file names.  By default,",
+        "### conflict files use custom extensions.",
+        "# preserved-conflict-file-exts = doc ppt xls od?",
+        "### Set enable-auto-props to 'yes' to enable automatic properties",
+        "### for 'svn add' and 'svn import', it defaults to 'no'.",
+        "### Automatic properties are defined in the section 'auto-props'.",
+        "# enable-auto-props = yes",
+        "### Set interactive-conflicts to 'no' to disable interactive",
+        "### conflict resolution prompting.  It defaults to 'yes'.",
+        "# interactive-conflicts = no",
+        "### Set memory-cache-size to define the size of the memory cache",
+        "### used by the client when accessing a FSFS repository via",
+        "### ra_local (the file:// scheme). The value represents the number",
+        "### of MB used by the cache.",
+        "# memory-cache-size = 16",
+        "",
+        "### Section for configuring automatic properties.",
+        "[auto-props]",
+        "### The format of the entries is:",
+        "###   file-name-pattern = propname[=value][;propname[=value]...]",
+        "### The file-name-pattern can contain wildcards (such as '*' and",
+        "### '?').  All entries which match (case-insensitively) will be",
+        "### applied to the file.  Note that auto-props functionality",
+        "### must be enabled, which is typically done by setting the",
+        "### 'enable-auto-props' option.",
+        "# *.c = svn:eol-style=native",
+        "# *.cpp = svn:eol-style=native",
+        "# *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native",
+        "# *.dsp = svn:eol-style=CRLF",
+        "# *.dsw = svn:eol-style=CRLF",
+        "# *.sh = svn:eol-style=native;svn:executable",
+        "# *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;",
+        "# *.png = svn:mime-type=image/png",
+        "# *.jpg = svn:mime-type=image/jpeg",
+        "# Makefile = svn:eol-style=native",
+        "",
+    ]
+)
 
 
 DefaultIgnores = [
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/SubversionPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/SubversionPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 
 from PyQt6.QtCore import pyqtSlot
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_SubversionPage import Ui_SubversionPage
 
 
@@ -19,43 +17,46 @@
     """
     Class implementing the Subversion configuration page.
     """
+
     def __init__(self, plugin):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("SubversionPage")
-        
+
         self.__plugin = plugin
-        
+
         # set initial values
         self.logSpinBox.setValue(self.__plugin.getPreferences("LogLimit"))
-        
+
     def save(self):
         """
         Public slot to save the Subversion configuration.
         """
         self.__plugin.setPreferences("LogLimit", self.logSpinBox.value())
-    
+
     @pyqtSlot()
     def on_configButton_clicked(self):
         """
         Private slot to edit the Subversion config file.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         cfgFile = self.__plugin.getConfigPath()
         editor = MiniEditor(cfgFile, "Properties", self)
         editor.show()
-    
+
     @pyqtSlot()
     def on_serversButton_clicked(self):
         """
         Private slot to edit the Subversion servers file.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         serversFile = self.__plugin.getServersPath()
         editor = MiniEditor(serversFile, "Properties", self)
         editor.show()
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,11 +23,19 @@
     """
     Class implementing the VCS project browser helper for subversion.
     """
-    def __init__(self, vcsObject, browserObject, projectObject,
-                 isTranslationsBrowser, parent=None, name=None):
+
+    def __init__(
+        self,
+        vcsObject,
+        browserObject,
+        projectObject,
+        isTranslationsBrowser,
+        parent=None,
+        name=None,
+    ):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
@@ -36,17 +44,23 @@
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
-        VcsProjectBrowserHelper.__init__(self, vcsObject, browserObject,
-                                         projectObject, isTranslationsBrowser,
-                                         parent, name)
-    
+        VcsProjectBrowserHelper.__init__(
+            self,
+            vcsObject,
+            browserObject,
+            projectObject,
+            isTranslationsBrowser,
+            parent,
+            name,
+        )
+
     def showContextMenu(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -58,7 +72,7 @@
                 act.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(False)
-            if not hasattr(self.browser.currentItem(), 'fileName'):
+            if not hasattr(self.browser.currentItem(), "fileName"):
                 self.blameAct.setEnabled(False)
         else:
             for act in self.vcsMenuActions:
@@ -74,15 +88,15 @@
                     self.vcsMenuAddTree.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuMulti(self, menu, standardItems):
         """
         Public slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -94,7 +108,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsMultiMenuActions:
@@ -111,21 +125,18 @@
                 act.setEnabled(False)
             for act in self.vcsAddMultiMenuActions:
                 act.setEnabled(True)
-            if (
-                1 in self.browser.specialMenuEntries and
-                self.__itemsHaveFiles(items)
-            ):
+            if 1 in self.browser.specialMenuEntries and self.__itemsHaveFiles(items):
                 self.vcsMultiMenuAddTree.setEnabled(False)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDir(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -144,14 +155,14 @@
                 act.setEnabled(True)
             for act in standardItems:
                 act.setEnabled(True)
-    
+
     def showContextMenuDirMulti(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
@@ -163,7 +174,7 @@
         for itm in items:
             if itm.data(1) == vcsName:
                 vcsItems += 1
-        
+
         if vcsItems > 0:
             if vcsItems != len(items):
                 for act in self.vcsDirMultiMenuActions:
@@ -190,548 +201,635 @@
     def _addVCSMenu(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMenuActions = []
         self.vcsAddMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'),
-            self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMenuActions.append(act)
         if 1 in self.browser.specialMenuEntries:
             self.vcsMenuAddTree = menu.addAction(
                 UI.PixmapCache.getIcon("vcsAdd"),
-                self.tr('Add tree to repository'),
-                self._VCSAddTree)
+                self.tr("Add tree to repository"),
+                self._VCSAddTree,
+            )
             self.vcsAddMenuActions.append(self.vcsMenuAddTree)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__SVNCopy)
+        act = menu.addAction(self.tr("Copy"), self.__SVNCopy)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__SVNMove)
+        act = menu.addAction(self.tr("Move"), self.__SVNMove)
         self.vcsMenuActions.append(act)
         if self.vcs.version >= (1, 5, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side'), self.__SVNSbsDiff)
+            self.tr("Show differences side-by-side"),
+            self.__SVNSbsDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr('Show differences side-by-side (extended)'),
-            self.__SVNSbsExtendedDiff)
+            self.tr("Show differences side-by-side (extended)"),
+            self.__SVNSbsExtendedDiff,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsMenuActions.append(act)
-        self.blameAct = menu.addAction(
-            self.tr('Show annotated file'),
-            self.__SVNBlame)
+        self.blameAct = menu.addAction(self.tr("Show annotated file"), self.__SVNBlame)
         self.vcsMenuActions.append(self.blameAct)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsMenuActions.append(act)
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsMenuActions.append(act)
         if self.vcs.version >= (1, 2, 0):
             menu.addSeparator()
             act = menu.addAction(
-                UI.PixmapCache.getIcon("vcsLock"),
-                self.tr('Lock'), self.__SVNLock)
+                UI.PixmapCache.getIcon("vcsLock"), self.tr("Lock"), self.__SVNLock
+            )
+            self.vcsMenuActions.append(act)
+            act = menu.addAction(
+                UI.PixmapCache.getIcon("vcsUnlock"), self.tr("Unlock"), self.__SVNUnlock
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
                 UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Unlock'), self.__SVNUnlock)
-            self.vcsMenuActions.append(act)
-            act = menu.addAction(
-                UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Break Lock'), self.__SVNBreakLock)
+                self.tr("Break Lock"),
+                self.__SVNBreakLock,
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
                 UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Steal Lock'), self.__SVNStealLock)
+                self.tr("Steal Lock"),
+                self.__SVNStealLock,
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
         self.vcsMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menu = menu
-        
+
     def _addVCSMenuMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu for multi selection to all
         project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         self.vcsMultiMenuActions = []
         self.vcsAddMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddMultiMenuActions.append(act)
         if 1 in self.browser.specialMenuEntries:
             self.vcsMultiMenuAddTree = menu.addAction(
                 UI.PixmapCache.getIcon("vcsAdd"),
-                self.tr('Add tree to repository'), self._VCSAddTree)
+                self.tr("Add tree to repository"),
+                self._VCSAddTree,
+            )
             self.vcsAddMultiMenuActions.append(self.vcsMultiMenuAddTree)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsMultiMenuActions.append(act)
         if self.vcs.version >= (1, 5, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsMultiMenuActions.append(act)
         if self.vcs.version >= (1, 2, 0):
             menu.addSeparator()
             act = menu.addAction(
-                UI.PixmapCache.getIcon("vcsLock"),
-                self.tr('Lock'), self.__SVNLock)
+                UI.PixmapCache.getIcon("vcsLock"), self.tr("Lock"), self.__SVNLock
+            )
+            self.vcsMultiMenuActions.append(act)
+            act = menu.addAction(
+                UI.PixmapCache.getIcon("vcsUnlock"), self.tr("Unlock"), self.__SVNUnlock
+            )
             self.vcsMultiMenuActions.append(act)
             act = menu.addAction(
                 UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Unlock'), self.__SVNUnlock)
-            self.vcsMultiMenuActions.append(act)
-            act = menu.addAction(
-                UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Break Lock'), self.__SVNBreakLock)
+                self.tr("Break Lock"),
+                self.__SVNBreakLock,
+            )
             self.vcsMultiMenuActions.append(act)
             act = menu.addAction(
                 UI.PixmapCache.getIcon("vcsUnlock"),
-                self.tr('Steal Lock'), self.__SVNStealLock)
+                self.tr("Steal Lock"),
+                self.__SVNStealLock,
+            )
             self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
         self.vcsMultiMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuMulti = menu
-        
+
     def _addVCSMenuBack(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuBack = menu
-        
+
     def _addVCSMenuDir(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMenuActions = []
         self.vcsAddDirMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        act = menu.addAction(self.tr('Copy'), self.__SVNCopy)
+        act = menu.addAction(self.tr("Copy"), self.__SVNCopy)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Move'), self.__SVNMove)
+        act = menu.addAction(self.tr("Move"), self.__SVNMove)
         self.vcsDirMenuActions.append(act)
         if self.vcs.version >= (1, 5, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'), self._VCSLogBrowser)
+            self.tr("Show log browser"),
+            self._VCSLogBrowser,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
-        self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
-        self.vcsDirMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
-        self.vcsDirMenuActions.append(act)
-        menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsDirMenuActions.append(act)
         act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsDirMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        menu.addSeparator()
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
+        self.vcsDirMenuActions.append(act)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsDirMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDir = menu
-        
+
     def _addVCSMenuDirMulti(self, mainMenu):
         """
         Protected method used to add the VCS menu to all project browsers.
-        
+
         @param mainMenu reference to the menu to be amended
         """
         if mainMenu is None:
             return
-        
+
         self.vcsDirMultiMenuActions = []
         self.vcsAddDirMultiMenuActions = []
-        
+
         menu = QMenu(self.tr("Version Control"))
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._VCSInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._VCSInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('Update from repository'), self._VCSUpdate)
+            self.tr("Update from repository"),
+            self._VCSUpdate,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('Commit changes to repository...'),
-            self._VCSCommit)
+            self.tr("Commit changes to repository..."),
+            self._VCSCommit,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr('Add to repository'), self._VCSAdd)
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add to repository"), self._VCSAdd
+        )
         self.vcsAddDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRemove"),
-            self.tr('Remove from repository (and disk)'),
-            self._VCSRemove)
+            self.tr("Remove from repository (and disk)"),
+            self._VCSRemove,
+        )
         self.vcsDirMultiMenuActions.append(act)
         if self.vcs.version >= (1, 5, 0):
             menu.addSeparator()
             act = menu.addAction(
-                self.tr("Add to Changelist"),
-                self.__SVNAddToChangelist)
+                self.tr("Add to Changelist"), self.__SVNAddToChangelist
+            )
             self.vcsMenuActions.append(act)
             act = menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__SVNRemoveFromChangelist)
+                self.tr("Remove from Changelist"), self.__SVNRemoveFromChangelist
+            )
             self.vcsMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show status'), self._VCSStatus)
+            UI.PixmapCache.getIcon("vcsStatus"), self.tr("Show status"), self._VCSStatus
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences'), self._VCSDiff)
+            self.tr("Show differences"),
+            self._VCSDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            self.__SVNExtendedDiff)
+            self.tr("Show differences (extended)"),
+            self.__SVNExtendedDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            self.__SVNUrlDiff)
+            self.tr("Show differences (URLs)"),
+            self.__SVNUrlDiff,
+        )
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
         act = menu.addAction(
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Revert changes'), self._VCSRevert)
-        self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Merge changes'), self._VCSMerge)
-        self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(
-            self.tr('Conflicts resolved'), self.__SVNResolve)
-        self.vcsDirMultiMenuActions.append(act)
-        menu.addSeparator()
-        act = menu.addAction(self.tr('Set Property'), self.__SVNSetProp)
+            self.tr("Revert changes"),
+            self._VCSRevert,
+        )
         self.vcsDirMultiMenuActions.append(act)
         act = menu.addAction(
-            self.tr('List Properties'), self.__SVNListProps)
+            UI.PixmapCache.getIcon("vcsMerge"), self.tr("Merge changes"), self._VCSMerge
+        )
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Conflicts resolved"), self.__SVNResolve)
         self.vcsDirMultiMenuActions.append(act)
-        act = menu.addAction(self.tr('Delete Property'), self.__SVNDelProp)
+        menu.addSeparator()
+        act = menu.addAction(self.tr("Set Property"), self.__SVNSetProp)
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("List Properties"), self.__SVNListProps)
+        self.vcsDirMultiMenuActions.append(act)
+        act = menu.addAction(self.tr("Delete Property"), self.__SVNDelProp)
         self.vcsDirMultiMenuActions.append(act)
         menu.addSeparator()
-        menu.addAction(self.tr('Select all local file entries'),
-                       self.browser.selectLocalEntries)
-        menu.addAction(self.tr('Select all versioned file entries'),
-                       self.browser.selectVCSEntries)
-        menu.addAction(self.tr('Select all local directory entries'),
-                       self.browser.selectLocalDirEntries)
-        menu.addAction(self.tr('Select all versioned directory entries'),
-                       self.browser.selectVCSDirEntries)
+        menu.addAction(
+            self.tr("Select all local file entries"), self.browser.selectLocalEntries
+        )
+        menu.addAction(
+            self.tr("Select all versioned file entries"), self.browser.selectVCSEntries
+        )
+        menu.addAction(
+            self.tr("Select all local directory entries"),
+            self.browser.selectLocalDirEntries,
+        )
+        menu.addAction(
+            self.tr("Select all versioned directory entries"),
+            self.browser.selectVCSDirEntries,
+        )
         menu.addSeparator()
         menu.addAction(self.tr("Configure..."), self.__SVNConfigure)
-        
+
         mainMenu.addSeparator()
         mainMenu.addMenu(menu)
         self.menuDirMulti = menu
-    
+
     ###########################################################################
     # Menu handling methods below
     ###########################################################################
-    
+
     def __SVNCopy(self):
         """
         Private slot called by the context menu to copy the selected file.
@@ -742,7 +840,7 @@
         except AttributeError:
             fn = itm.dirName()
         self.vcs.svnCopy(fn, self.project)
-        
+
     def __SVNMove(self):
         """
         Private slot called by the context menu to move the selected file.
@@ -762,7 +860,7 @@
                 for mf in movefiles:
                     self.browser.closeSourceWindow.emit(mf)
         self.browser.project.startFileSystemMonitoring()
-    
+
     def __SVNResolve(self):
         """
         Private slot called by the context menu to resolve conflicts of a file.
@@ -774,7 +872,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.vcsResolved(names)
-        
+
     def __SVNListProps(self):
         """
         Private slot called by the context menu to list the subversion
@@ -787,7 +885,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnListProps(names)
-        
+
     def __SVNSetProp(self):
         """
         Private slot called by the context menu to set a subversion property
@@ -800,7 +898,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnSetProp(names)
-        
+
     def __SVNDelProp(self):
         """
         Private slot called by the context menu to delete a subversion
@@ -813,12 +911,12 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnDelProp(names)
-        
+
     def __SVNExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository.
-        
+
         This gives the chance to enter the revisions to compare.
         """
         names = []
@@ -828,12 +926,12 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnExtendedDiff(names)
-        
+
     def __SVNUrlDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file of two repository URLs.
-        
+
         This gives the chance to enter the repository URLs to compare.
         """
         names = []
@@ -843,7 +941,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUrlDiff(names)
-        
+
     def __SVNSbsDiff(self):
         """
         Private slot called by the context menu to show the difference of a
@@ -852,18 +950,18 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn)
-    
+
     def __SVNSbsExtendedDiff(self):
         """
         Private slot called by the context menu to show the difference of a
         file to the repository side-by-side.
-       
+
         It allows the selection of revisions to compare.
         """
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.vcsSbsDiff(fn, extended=True)
-    
+
     def __SVNBlame(self):
         """
         Private slot called by the context menu to show the blame of a file.
@@ -871,7 +969,7 @@
         itm = self.browser.currentItem()
         fn = itm.fileName()
         self.vcs.svnBlame(fn)
-        
+
     def __SVNLock(self):
         """
         Private slot called by the context menu to lock files in the
@@ -884,7 +982,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnLock(names)
-        
+
     def __SVNUnlock(self):
         """
         Private slot called by the context menu to unlock files in the
@@ -897,7 +995,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUnlock(names)
-        
+
     def __SVNBreakLock(self):
         """
         Private slot called by the context menu to break lock files in the
@@ -910,7 +1008,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnUnlock(names, breakIt=True)
-        
+
     def __SVNStealLock(self):
         """
         Private slot called by the context menu to steal lock files in the
@@ -923,14 +1021,13 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnLock(names, stealIt=True)
-        
+
     def __SVNConfigure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_subversionPage")
-        
+        ericApp().getObject("UserInterface").showPreferences("zzz_subversionPage")
+
     def __SVNAddToChangelist(self):
         """
         Private slot called by the context menu to add files to a changelist.
@@ -942,7 +1039,7 @@
             except AttributeError:
                 names.append(itm.dirName())
         self.vcs.svnAddToChangelist(names)
-        
+
     def __SVNRemoveFromChangelist(self):
         """
         Private slot called by the context menu to remove files from their
@@ -959,11 +1056,11 @@
     ###########################################################################
     # Some private utility methods below
     ###########################################################################
-    
+
     def __itemsHaveFiles(self, items):
         """
         Private method to check, if items contain file type items.
-        
+
         @param items items to check (list of QTreeWidgetItems)
         @return flag indicating items contain file type items (boolean)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,467 +23,608 @@
     """
     Class implementing the VCS project helper for Subversion.
     """
+
     def __init__(self, vcsObject, projectObject, parent=None, name=None):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VcsProjectHelper.__init__(self, vcsObject, projectObject, parent, name)
-        
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-        
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.vcsNewAct = EricAction(
-            self.tr('New from repository'),
+            self.tr("New from repository"),
             UI.PixmapCache.getIcon("vcsCheckout"),
-            self.tr('&New from repository...'), 0, 0, self,
-            'subversion_new')
-        self.vcsNewAct.setStatusTip(self.tr(
-            'Create a new project from the VCS repository'
-        ))
-        self.vcsNewAct.setWhatsThis(self.tr(
-            """<b>New from repository</b>"""
-            """<p>This creates a new local project from the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&New from repository..."),
+            0,
+            0,
+            self,
+            "subversion_new",
+        )
+        self.vcsNewAct.setStatusTip(
+            self.tr("Create a new project from the VCS repository")
+        )
+        self.vcsNewAct.setWhatsThis(
+            self.tr(
+                """<b>New from repository</b>"""
+                """<p>This creates a new local project from the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsNewAct.triggered.connect(self._vcsCheckout)
         self.actions.append(self.vcsNewAct)
-        
+
         self.vcsUpdateAct = EricAction(
-            self.tr('Update from repository'),
+            self.tr("Update from repository"),
             UI.PixmapCache.getIcon("vcsUpdate"),
-            self.tr('&Update from repository'), 0, 0, self,
-            'subversion_update')
-        self.vcsUpdateAct.setStatusTip(self.tr(
-            'Update the local project from the VCS repository'
-        ))
-        self.vcsUpdateAct.setWhatsThis(self.tr(
-            """<b>Update from repository</b>"""
-            """<p>This updates the local project from the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&Update from repository"),
+            0,
+            0,
+            self,
+            "subversion_update",
+        )
+        self.vcsUpdateAct.setStatusTip(
+            self.tr("Update the local project from the VCS repository")
+        )
+        self.vcsUpdateAct.setWhatsThis(
+            self.tr(
+                """<b>Update from repository</b>"""
+                """<p>This updates the local project from the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsUpdateAct.triggered.connect(self._vcsUpdate)
         self.actions.append(self.vcsUpdateAct)
-        
+
         self.vcsCommitAct = EricAction(
-            self.tr('Commit changes to repository'),
+            self.tr("Commit changes to repository"),
             UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr('&Commit changes to repository...'), 0, 0, self,
-            'subversion_commit')
-        self.vcsCommitAct.setStatusTip(self.tr(
-            'Commit changes to the local project to the VCS repository'
-        ))
-        self.vcsCommitAct.setWhatsThis(self.tr(
-            """<b>Commit changes to repository</b>"""
-            """<p>This commits changes to the local project to the VCS"""
-            """ repository.</p>"""
-        ))
+            self.tr("&Commit changes to repository..."),
+            0,
+            0,
+            self,
+            "subversion_commit",
+        )
+        self.vcsCommitAct.setStatusTip(
+            self.tr("Commit changes to the local project to the VCS repository")
+        )
+        self.vcsCommitAct.setWhatsThis(
+            self.tr(
+                """<b>Commit changes to repository</b>"""
+                """<p>This commits changes to the local project to the VCS"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsCommitAct.triggered.connect(self._vcsCommit)
         self.actions.append(self.vcsCommitAct)
-        
+
         self.svnLogBrowserAct = EricAction(
-            self.tr('Show log browser'),
+            self.tr("Show log browser"),
             UI.PixmapCache.getIcon("vcsLog"),
-            self.tr('Show log browser'),
-            0, 0, self, 'subversion_log_browser')
-        self.svnLogBrowserAct.setStatusTip(self.tr(
-            'Show a dialog to browse the log of the local project'
-        ))
-        self.svnLogBrowserAct.setWhatsThis(self.tr(
-            """<b>Show log browser</b>"""
-            """<p>This shows a dialog to browse the log of the local"""
-            """ project. A limited number of entries is shown first. More"""
-            """ can be retrieved later on.</p>"""
-        ))
+            self.tr("Show log browser"),
+            0,
+            0,
+            self,
+            "subversion_log_browser",
+        )
+        self.svnLogBrowserAct.setStatusTip(
+            self.tr("Show a dialog to browse the log of the local project")
+        )
+        self.svnLogBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Show log browser</b>"""
+                """<p>This shows a dialog to browse the log of the local"""
+                """ project. A limited number of entries is shown first. More"""
+                """ can be retrieved later on.</p>"""
+            )
+        )
         self.svnLogBrowserAct.triggered.connect(self._vcsLogBrowser)
         self.actions.append(self.svnLogBrowserAct)
-        
+
         self.vcsDiffAct = EricAction(
-            self.tr('Show differences'),
+            self.tr("Show differences"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show &difference'),
-            0, 0, self, 'subversion_diff')
-        self.vcsDiffAct.setStatusTip(self.tr(
-            'Show the difference of the local project to the repository'
-        ))
-        self.vcsDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences</b>"""
-            """<p>This shows differences of the local project to the"""
-            """ repository.</p>"""
-        ))
+            self.tr("Show &difference"),
+            0,
+            0,
+            self,
+            "subversion_diff",
+        )
+        self.vcsDiffAct.setStatusTip(
+            self.tr("Show the difference of the local project to the repository")
+        )
+        self.vcsDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences</b>"""
+                """<p>This shows differences of the local project to the"""
+                """ repository.</p>"""
+            )
+        )
         self.vcsDiffAct.triggered.connect(self._vcsDiff)
         self.actions.append(self.vcsDiffAct)
-        
+
         self.svnExtDiffAct = EricAction(
-            self.tr('Show differences (extended)'),
+            self.tr("Show differences (extended)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (extended)'),
-            0, 0, self, 'subversion_extendeddiff')
-        self.svnExtDiffAct.setStatusTip(self.tr(
-            'Show the difference of revisions of the project to the repository'
-        ))
-        self.svnExtDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (extended)</b>"""
-            """<p>This shows differences of selectable revisions of"""
-            """ the project.</p>"""
-        ))
+            self.tr("Show differences (extended)"),
+            0,
+            0,
+            self,
+            "subversion_extendeddiff",
+        )
+        self.svnExtDiffAct.setStatusTip(
+            self.tr("Show the difference of revisions of the project to the repository")
+        )
+        self.svnExtDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (extended)</b>"""
+                """<p>This shows differences of selectable revisions of"""
+                """ the project.</p>"""
+            )
+        )
         self.svnExtDiffAct.triggered.connect(self.__svnExtendedDiff)
         self.actions.append(self.svnExtDiffAct)
-        
+
         self.svnUrlDiffAct = EricAction(
-            self.tr('Show differences (URLs)'),
+            self.tr("Show differences (URLs)"),
             UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr('Show differences (URLs)'),
-            0, 0, self, 'subversion_urldiff')
-        self.svnUrlDiffAct.setStatusTip(self.tr(
-            'Show the difference of the project between two repository URLs'
-        ))
-        self.svnUrlDiffAct.setWhatsThis(self.tr(
-            """<b>Show differences (URLs)</b>"""
-            """<p>This shows differences of the project between"""
-            """ two repository URLs.</p>"""
-        ))
+            self.tr("Show differences (URLs)"),
+            0,
+            0,
+            self,
+            "subversion_urldiff",
+        )
+        self.svnUrlDiffAct.setStatusTip(
+            self.tr("Show the difference of the project between two repository URLs")
+        )
+        self.svnUrlDiffAct.setWhatsThis(
+            self.tr(
+                """<b>Show differences (URLs)</b>"""
+                """<p>This shows differences of the project between"""
+                """ two repository URLs.</p>"""
+            )
+        )
         self.svnUrlDiffAct.triggered.connect(self.__svnUrlDiff)
         self.actions.append(self.svnUrlDiffAct)
-        
+
         self.vcsStatusAct = EricAction(
-            self.tr('Show status'),
+            self.tr("Show status"),
             UI.PixmapCache.getIcon("vcsStatus"),
-            self.tr('Show &status'),
-            0, 0, self, 'subversion_status')
-        self.vcsStatusAct.setStatusTip(self.tr(
-            'Show the status of the local project'
-        ))
-        self.vcsStatusAct.setWhatsThis(self.tr(
-            """<b>Show status</b>"""
-            """<p>This shows the status of the local project.</p>"""
-        ))
+            self.tr("Show &status"),
+            0,
+            0,
+            self,
+            "subversion_status",
+        )
+        self.vcsStatusAct.setStatusTip(self.tr("Show the status of the local project"))
+        self.vcsStatusAct.setWhatsThis(
+            self.tr(
+                """<b>Show status</b>"""
+                """<p>This shows the status of the local project.</p>"""
+            )
+        )
         self.vcsStatusAct.triggered.connect(self._vcsStatus)
         self.actions.append(self.vcsStatusAct)
-        
+
         self.svnChangeListsAct = EricAction(
-            self.tr('Show change lists'),
+            self.tr("Show change lists"),
             UI.PixmapCache.getIcon("vcsChangeLists"),
-            self.tr('Show change lists'),
-            0, 0, self, 'subversion_changelists')
-        self.svnChangeListsAct.setStatusTip(self.tr(
-            'Show the change lists and associated files of the local project'
-        ))
-        self.svnChangeListsAct.setWhatsThis(self.tr(
-            """<b>Show change lists</b>"""
-            """<p>This shows the change lists and associated files of the"""
-            """ local project.</p>"""
-        ))
+            self.tr("Show change lists"),
+            0,
+            0,
+            self,
+            "subversion_changelists",
+        )
+        self.svnChangeListsAct.setStatusTip(
+            self.tr("Show the change lists and associated files of the local project")
+        )
+        self.svnChangeListsAct.setWhatsThis(
+            self.tr(
+                """<b>Show change lists</b>"""
+                """<p>This shows the change lists and associated files of the"""
+                """ local project.</p>"""
+            )
+        )
         self.svnChangeListsAct.triggered.connect(self.__svnChangeLists)
         self.actions.append(self.svnChangeListsAct)
-        
+
         self.vcsTagAct = EricAction(
-            self.tr('Tag in repository'),
+            self.tr("Tag in repository"),
             UI.PixmapCache.getIcon("vcsTag"),
-            self.tr('&Tag in repository...'),
-            0, 0, self, 'subversion_tag')
-        self.vcsTagAct.setStatusTip(self.tr(
-            'Tag the local project in the repository'
-        ))
-        self.vcsTagAct.setWhatsThis(self.tr(
-            """<b>Tag in repository</b>"""
-            """<p>This tags the local project in the repository.</p>"""
-        ))
+            self.tr("&Tag in repository..."),
+            0,
+            0,
+            self,
+            "subversion_tag",
+        )
+        self.vcsTagAct.setStatusTip(self.tr("Tag the local project in the repository"))
+        self.vcsTagAct.setWhatsThis(
+            self.tr(
+                """<b>Tag in repository</b>"""
+                """<p>This tags the local project in the repository.</p>"""
+            )
+        )
         self.vcsTagAct.triggered.connect(self._vcsTag)
         self.actions.append(self.vcsTagAct)
-        
+
         self.vcsExportAct = EricAction(
-            self.tr('Export from repository'),
+            self.tr("Export from repository"),
             UI.PixmapCache.getIcon("vcsExport"),
-            self.tr('&Export from repository...'),
-            0, 0, self, 'subversion_export')
-        self.vcsExportAct.setStatusTip(self.tr(
-            'Export a project from the repository'
-        ))
-        self.vcsExportAct.setWhatsThis(self.tr(
-            """<b>Export from repository</b>"""
-            """<p>This exports a project from the repository.</p>"""
-        ))
+            self.tr("&Export from repository..."),
+            0,
+            0,
+            self,
+            "subversion_export",
+        )
+        self.vcsExportAct.setStatusTip(self.tr("Export a project from the repository"))
+        self.vcsExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export from repository</b>"""
+                """<p>This exports a project from the repository.</p>"""
+            )
+        )
         self.vcsExportAct.triggered.connect(self._vcsExport)
         self.actions.append(self.vcsExportAct)
-        
+
         self.vcsPropsAct = EricAction(
-            self.tr('Command options'),
-            self.tr('Command &options...'), 0, 0, self,
-            'subversion_options')
-        self.vcsPropsAct.setStatusTip(self.tr(
-            'Show the VCS command options'))
-        self.vcsPropsAct.setWhatsThis(self.tr(
-            """<b>Command options...</b>"""
-            """<p>This shows a dialog to edit the VCS command options.</p>"""
-        ))
+            self.tr("Command options"),
+            self.tr("Command &options..."),
+            0,
+            0,
+            self,
+            "subversion_options",
+        )
+        self.vcsPropsAct.setStatusTip(self.tr("Show the VCS command options"))
+        self.vcsPropsAct.setWhatsThis(
+            self.tr(
+                """<b>Command options...</b>"""
+                """<p>This shows a dialog to edit the VCS command options.</p>"""
+            )
+        )
         self.vcsPropsAct.triggered.connect(self._vcsCommandOptions)
         self.actions.append(self.vcsPropsAct)
-        
+
         self.vcsRevertAct = EricAction(
-            self.tr('Revert changes'),
+            self.tr("Revert changes"),
             UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr('Re&vert changes'),
-            0, 0, self, 'subversion_revert')
-        self.vcsRevertAct.setStatusTip(self.tr(
-            'Revert all changes made to the local project'
-        ))
-        self.vcsRevertAct.setWhatsThis(self.tr(
-            """<b>Revert changes</b>"""
-            """<p>This reverts all changes made to the local project.</p>"""
-        ))
+            self.tr("Re&vert changes"),
+            0,
+            0,
+            self,
+            "subversion_revert",
+        )
+        self.vcsRevertAct.setStatusTip(
+            self.tr("Revert all changes made to the local project")
+        )
+        self.vcsRevertAct.setWhatsThis(
+            self.tr(
+                """<b>Revert changes</b>"""
+                """<p>This reverts all changes made to the local project.</p>"""
+            )
+        )
         self.vcsRevertAct.triggered.connect(self._vcsRevert)
         self.actions.append(self.vcsRevertAct)
-        
+
         self.vcsMergeAct = EricAction(
-            self.tr('Merge'),
+            self.tr("Merge"),
             UI.PixmapCache.getIcon("vcsMerge"),
-            self.tr('Mer&ge changes...'),
-            0, 0, self, 'subversion_merge')
-        self.vcsMergeAct.setStatusTip(self.tr(
-            'Merge changes of a tag/revision into the local project'
-        ))
-        self.vcsMergeAct.setWhatsThis(self.tr(
-            """<b>Merge</b>"""
-            """<p>This merges changes of a tag/revision into the local"""
-            """ project.</p>"""
-        ))
+            self.tr("Mer&ge changes..."),
+            0,
+            0,
+            self,
+            "subversion_merge",
+        )
+        self.vcsMergeAct.setStatusTip(
+            self.tr("Merge changes of a tag/revision into the local project")
+        )
+        self.vcsMergeAct.setWhatsThis(
+            self.tr(
+                """<b>Merge</b>"""
+                """<p>This merges changes of a tag/revision into the local"""
+                """ project.</p>"""
+            )
+        )
         self.vcsMergeAct.triggered.connect(self._vcsMerge)
         self.actions.append(self.vcsMergeAct)
-        
+
         self.vcsSwitchAct = EricAction(
-            self.tr('Switch'),
+            self.tr("Switch"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('S&witch...'),
-            0, 0, self, 'subversion_switch')
-        self.vcsSwitchAct.setStatusTip(self.tr(
-            'Switch the local copy to another tag/branch'
-        ))
-        self.vcsSwitchAct.setWhatsThis(self.tr(
-            """<b>Switch</b>"""
-            """<p>This switches the local copy to another tag/branch.</p>"""
-        ))
+            self.tr("S&witch..."),
+            0,
+            0,
+            self,
+            "subversion_switch",
+        )
+        self.vcsSwitchAct.setStatusTip(
+            self.tr("Switch the local copy to another tag/branch")
+        )
+        self.vcsSwitchAct.setWhatsThis(
+            self.tr(
+                """<b>Switch</b>"""
+                """<p>This switches the local copy to another tag/branch.</p>"""
+            )
+        )
         self.vcsSwitchAct.triggered.connect(self._vcsSwitch)
         self.actions.append(self.vcsSwitchAct)
-        
+
         self.vcsResolveAct = EricAction(
-            self.tr('Conflicts resolved'),
-            self.tr('Con&flicts resolved'),
-            0, 0, self, 'subversion_resolve')
-        self.vcsResolveAct.setStatusTip(self.tr(
-            'Mark all conflicts of the local project as resolved'
-        ))
-        self.vcsResolveAct.setWhatsThis(self.tr(
-            """<b>Conflicts resolved</b>"""
-            """<p>This marks all conflicts of the local project as"""
-            """ resolved.</p>"""
-        ))
+            self.tr("Conflicts resolved"),
+            self.tr("Con&flicts resolved"),
+            0,
+            0,
+            self,
+            "subversion_resolve",
+        )
+        self.vcsResolveAct.setStatusTip(
+            self.tr("Mark all conflicts of the local project as resolved")
+        )
+        self.vcsResolveAct.setWhatsThis(
+            self.tr(
+                """<b>Conflicts resolved</b>"""
+                """<p>This marks all conflicts of the local project as"""
+                """ resolved.</p>"""
+            )
+        )
         self.vcsResolveAct.triggered.connect(self.__svnResolve)
         self.actions.append(self.vcsResolveAct)
-        
+
         self.vcsCleanupAct = EricAction(
-            self.tr('Cleanup'),
-            self.tr('Cleanu&p'),
-            0, 0, self, 'subversion_cleanup')
-        self.vcsCleanupAct.setStatusTip(self.tr(
-            'Cleanup the local project'
-        ))
-        self.vcsCleanupAct.setWhatsThis(self.tr(
-            """<b>Cleanup</b>"""
-            """<p>This performs a cleanup of the local project.</p>"""
-        ))
+            self.tr("Cleanup"), self.tr("Cleanu&p"), 0, 0, self, "subversion_cleanup"
+        )
+        self.vcsCleanupAct.setStatusTip(self.tr("Cleanup the local project"))
+        self.vcsCleanupAct.setWhatsThis(
+            self.tr(
+                """<b>Cleanup</b>"""
+                """<p>This performs a cleanup of the local project.</p>"""
+            )
+        )
         self.vcsCleanupAct.triggered.connect(self._vcsCleanup)
         self.actions.append(self.vcsCleanupAct)
-        
+
         self.vcsCommandAct = EricAction(
-            self.tr('Execute command'),
-            self.tr('E&xecute command...'),
-            0, 0, self, 'subversion_command')
-        self.vcsCommandAct.setStatusTip(self.tr(
-            'Execute an arbitrary VCS command'
-        ))
-        self.vcsCommandAct.setWhatsThis(self.tr(
-            """<b>Execute command</b>"""
-            """<p>This opens a dialog to enter an arbitrary VCS command.</p>"""
-        ))
+            self.tr("Execute command"),
+            self.tr("E&xecute command..."),
+            0,
+            0,
+            self,
+            "subversion_command",
+        )
+        self.vcsCommandAct.setStatusTip(self.tr("Execute an arbitrary VCS command"))
+        self.vcsCommandAct.setWhatsThis(
+            self.tr(
+                """<b>Execute command</b>"""
+                """<p>This opens a dialog to enter an arbitrary VCS command.</p>"""
+            )
+        )
         self.vcsCommandAct.triggered.connect(self._vcsCommand)
         self.actions.append(self.vcsCommandAct)
-        
+
         self.svnTagListAct = EricAction(
-            self.tr('List tags'),
-            self.tr('List tags...'),
-            0, 0, self, 'subversion_list_tags')
-        self.svnTagListAct.setStatusTip(self.tr(
-            'List tags of the project'
-        ))
-        self.svnTagListAct.setWhatsThis(self.tr(
-            """<b>List tags</b>"""
-            """<p>This lists the tags of the project.</p>"""
-        ))
+            self.tr("List tags"),
+            self.tr("List tags..."),
+            0,
+            0,
+            self,
+            "subversion_list_tags",
+        )
+        self.svnTagListAct.setStatusTip(self.tr("List tags of the project"))
+        self.svnTagListAct.setWhatsThis(
+            self.tr(
+                """<b>List tags</b>""" """<p>This lists the tags of the project.</p>"""
+            )
+        )
         self.svnTagListAct.triggered.connect(self.__svnTagList)
         self.actions.append(self.svnTagListAct)
-        
+
         self.svnBranchListAct = EricAction(
-            self.tr('List branches'),
-            self.tr('List branches...'),
-            0, 0, self, 'subversion_list_branches')
-        self.svnBranchListAct.setStatusTip(self.tr(
-            'List branches of the project'
-        ))
-        self.svnBranchListAct.setWhatsThis(self.tr(
-            """<b>List branches</b>"""
-            """<p>This lists the branches of the project.</p>"""
-        ))
+            self.tr("List branches"),
+            self.tr("List branches..."),
+            0,
+            0,
+            self,
+            "subversion_list_branches",
+        )
+        self.svnBranchListAct.setStatusTip(self.tr("List branches of the project"))
+        self.svnBranchListAct.setWhatsThis(
+            self.tr(
+                """<b>List branches</b>"""
+                """<p>This lists the branches of the project.</p>"""
+            )
+        )
         self.svnBranchListAct.triggered.connect(self.__svnBranchList)
         self.actions.append(self.svnBranchListAct)
-        
+
         self.svnListAct = EricAction(
-            self.tr('List repository contents'),
-            self.tr('List repository contents...'),
-            0, 0, self, 'subversion_contents')
-        self.svnListAct.setStatusTip(self.tr(
-            'Lists the contents of the repository'
-        ))
-        self.svnListAct.setWhatsThis(self.tr(
-            """<b>List repository contents</b>"""
-            """<p>This lists the contents of the repository.</p>"""
-        ))
+            self.tr("List repository contents"),
+            self.tr("List repository contents..."),
+            0,
+            0,
+            self,
+            "subversion_contents",
+        )
+        self.svnListAct.setStatusTip(self.tr("Lists the contents of the repository"))
+        self.svnListAct.setWhatsThis(
+            self.tr(
+                """<b>List repository contents</b>"""
+                """<p>This lists the contents of the repository.</p>"""
+            )
+        )
         self.svnListAct.triggered.connect(self.__svnTagList)
         self.actions.append(self.svnListAct)
-        
+
         self.svnPropSetAct = EricAction(
-            self.tr('Set Property'),
-            self.tr('Set Property...'),
-            0, 0, self, 'subversion_property_set')
-        self.svnPropSetAct.setStatusTip(self.tr(
-            'Set a property for the project files'
-        ))
-        self.svnPropSetAct.setWhatsThis(self.tr(
-            """<b>Set Property</b>"""
-            """<p>This sets a property for the project files.</p>"""
-        ))
+            self.tr("Set Property"),
+            self.tr("Set Property..."),
+            0,
+            0,
+            self,
+            "subversion_property_set",
+        )
+        self.svnPropSetAct.setStatusTip(self.tr("Set a property for the project files"))
+        self.svnPropSetAct.setWhatsThis(
+            self.tr(
+                """<b>Set Property</b>"""
+                """<p>This sets a property for the project files.</p>"""
+            )
+        )
         self.svnPropSetAct.triggered.connect(self.__svnPropSet)
         self.actions.append(self.svnPropSetAct)
-        
+
         self.svnPropListAct = EricAction(
-            self.tr('List Properties'),
-            self.tr('List Properties...'),
-            0, 0, self, 'subversion_property_list')
-        self.svnPropListAct.setStatusTip(self.tr(
-            'List properties of the project files'
-        ))
-        self.svnPropListAct.setWhatsThis(self.tr(
-            """<b>List Properties</b>"""
-            """<p>This lists the properties of the project files.</p>"""
-        ))
+            self.tr("List Properties"),
+            self.tr("List Properties..."),
+            0,
+            0,
+            self,
+            "subversion_property_list",
+        )
+        self.svnPropListAct.setStatusTip(
+            self.tr("List properties of the project files")
+        )
+        self.svnPropListAct.setWhatsThis(
+            self.tr(
+                """<b>List Properties</b>"""
+                """<p>This lists the properties of the project files.</p>"""
+            )
+        )
         self.svnPropListAct.triggered.connect(self.__svnPropList)
         self.actions.append(self.svnPropListAct)
-        
+
         self.svnPropDelAct = EricAction(
-            self.tr('Delete Property'),
-            self.tr('Delete Property...'),
-            0, 0, self, 'subversion_property_delete')
-        self.svnPropDelAct.setStatusTip(self.tr(
-            'Delete a property for the project files'
-        ))
-        self.svnPropDelAct.setWhatsThis(self.tr(
-            """<b>Delete Property</b>"""
-            """<p>This deletes a property for the project files.</p>"""
-        ))
+            self.tr("Delete Property"),
+            self.tr("Delete Property..."),
+            0,
+            0,
+            self,
+            "subversion_property_delete",
+        )
+        self.svnPropDelAct.setStatusTip(
+            self.tr("Delete a property for the project files")
+        )
+        self.svnPropDelAct.setWhatsThis(
+            self.tr(
+                """<b>Delete Property</b>"""
+                """<p>This deletes a property for the project files.</p>"""
+            )
+        )
         self.svnPropDelAct.triggered.connect(self.__svnPropDel)
         self.actions.append(self.svnPropDelAct)
-        
+
         self.svnRelocateAct = EricAction(
-            self.tr('Relocate'),
+            self.tr("Relocate"),
             UI.PixmapCache.getIcon("vcsSwitch"),
-            self.tr('Relocate...'),
-            0, 0, self, 'subversion_relocate')
-        self.svnRelocateAct.setStatusTip(self.tr(
-            'Relocate the working copy to a new repository URL'
-        ))
-        self.svnRelocateAct.setWhatsThis(self.tr(
-            """<b>Relocate</b>"""
-            """<p>This relocates the working copy to a new repository"""
-            """ URL.</p>"""
-        ))
+            self.tr("Relocate..."),
+            0,
+            0,
+            self,
+            "subversion_relocate",
+        )
+        self.svnRelocateAct.setStatusTip(
+            self.tr("Relocate the working copy to a new repository URL")
+        )
+        self.svnRelocateAct.setWhatsThis(
+            self.tr(
+                """<b>Relocate</b>"""
+                """<p>This relocates the working copy to a new repository"""
+                """ URL.</p>"""
+            )
+        )
         self.svnRelocateAct.triggered.connect(self.__svnRelocate)
         self.actions.append(self.svnRelocateAct)
-        
+
         self.svnRepoBrowserAct = EricAction(
-            self.tr('Repository Browser'),
+            self.tr("Repository Browser"),
             UI.PixmapCache.getIcon("vcsRepoBrowser"),
-            self.tr('Repository Browser...'),
-            0, 0, self, 'subversion_repo_browser')
-        self.svnRepoBrowserAct.setStatusTip(self.tr(
-            'Show the Repository Browser dialog'
-        ))
-        self.svnRepoBrowserAct.setWhatsThis(self.tr(
-            """<b>Repository Browser</b>"""
-            """<p>This shows the Repository Browser dialog.</p>"""
-        ))
+            self.tr("Repository Browser..."),
+            0,
+            0,
+            self,
+            "subversion_repo_browser",
+        )
+        self.svnRepoBrowserAct.setStatusTip(
+            self.tr("Show the Repository Browser dialog")
+        )
+        self.svnRepoBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>Repository Browser</b>"""
+                """<p>This shows the Repository Browser dialog.</p>"""
+            )
+        )
         self.svnRepoBrowserAct.triggered.connect(self.__svnRepoBrowser)
         self.actions.append(self.svnRepoBrowserAct)
-        
+
         self.svnConfigAct = EricAction(
-            self.tr('Configure'),
-            self.tr('Configure...'),
-            0, 0, self, 'subversion_configure')
-        self.svnConfigAct.setStatusTip(self.tr(
-            'Show the configuration dialog with the Subversion page selected'
-        ))
-        self.svnConfigAct.setWhatsThis(self.tr(
-            """<b>Configure</b>"""
-            """<p>Show the configuration dialog with the Subversion page"""
-            """ selected.</p>"""
-        ))
+            self.tr("Configure"),
+            self.tr("Configure..."),
+            0,
+            0,
+            self,
+            "subversion_configure",
+        )
+        self.svnConfigAct.setStatusTip(
+            self.tr("Show the configuration dialog with the Subversion page selected")
+        )
+        self.svnConfigAct.setWhatsThis(
+            self.tr(
+                """<b>Configure</b>"""
+                """<p>Show the configuration dialog with the Subversion page"""
+                """ selected.</p>"""
+            )
+        )
         self.svnConfigAct.triggered.connect(self.__svnConfigure)
         self.actions.append(self.svnConfigAct)
-        
+
         self.svnUpgradeAct = EricAction(
-            self.tr('Upgrade'),
-            self.tr('Upgrade...'),
-            0, 0, self, 'subversion_upgrade')
-        self.svnUpgradeAct.setStatusTip(self.tr(
-            'Upgrade the working copy to the current format'
-        ))
-        self.svnUpgradeAct.setWhatsThis(self.tr(
-            """<b>Upgrade</b>"""
-            """<p>Upgrades the working copy to the current format.</p>"""
-        ))
+            self.tr("Upgrade"), self.tr("Upgrade..."), 0, 0, self, "subversion_upgrade"
+        )
+        self.svnUpgradeAct.setStatusTip(
+            self.tr("Upgrade the working copy to the current format")
+        )
+        self.svnUpgradeAct.setWhatsThis(
+            self.tr(
+                """<b>Upgrade</b>"""
+                """<p>Upgrades the working copy to the current format.</p>"""
+            )
+        )
         self.svnUpgradeAct.triggered.connect(self.__svnUpgrade)
         self.actions.append(self.svnUpgradeAct)
-    
+
     def initMenu(self, menu):
         """
         Public method to generate the VCS menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon(
-                os.path.join("VcsPlugins", "vcsSubversion", "icons",
-                             "subversion.svg")),
-            self.vcs.vcsName(), self._vcsInfoDisplay)
+                os.path.join("VcsPlugins", "vcsSubversion", "icons", "subversion.svg")
+            ),
+            self.vcs.vcsName(),
+            self._vcsInfoDisplay,
+        )
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         menu.addSeparator()
-        
+
         menu.addAction(self.vcsUpdateAct)
         menu.addAction(self.vcsCommitAct)
         menu.addSeparator()
@@ -526,11 +667,11 @@
         menu.addSeparator()
         menu.addAction(self.vcsNewAct)
         menu.addAction(self.vcsExportAct)
-    
+
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
@@ -538,8 +679,8 @@
         self.__toolbar = QToolBar(self.tr("Subversion (svn)"), ui)
         self.__toolbar.setIconSize(UI.Config.ToolBarIconSize)
         self.__toolbar.setObjectName("SubversionToolbar")
-        self.__toolbar.setToolTip(self.tr('Subversion (svn)'))
-        
+        self.__toolbar.setToolTip(self.tr("Subversion (svn)"))
+
         self.__toolbar.addAction(self.svnLogBrowserAct)
         self.__toolbar.addAction(self.vcsStatusAct)
         self.__toolbar.addSeparator()
@@ -549,7 +690,7 @@
         self.__toolbar.addAction(self.vcsNewAct)
         self.__toolbar.addAction(self.vcsExportAct)
         self.__toolbar.addSeparator()
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.addToolBar(self.__toolbar, title)
         toolbarManager.addAction(self.vcsUpdateAct, title)
@@ -562,107 +703,107 @@
         toolbarManager.addAction(self.vcsMergeAct, title)
         toolbarManager.addAction(self.vcsSwitchAct, title)
         toolbarManager.addAction(self.svnRelocateAct, title)
-        
+
         self.__toolbar.setEnabled(False)
         self.__toolbar.setVisible(False)
-        
-        ui.registerToolbar("subversion", self.__toolbar.windowTitle(),
-                           self.__toolbar, "vcs")
+
+        ui.registerToolbar(
+            "subversion", self.__toolbar.windowTitle(), self.__toolbar, "vcs"
+        )
         ui.addToolBar(self.__toolbar)
-    
+
     def removeToolbar(self, ui, toolbarManager):
         """
         Public method to remove a toolbar created by initToolbar().
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         """
         ui.removeToolBar(self.__toolbar)
         ui.unregisterToolbar("subversion")
-        
+
         title = self.__toolbar.windowTitle()
         toolbarManager.removeCategoryActions(title)
         toolbarManager.removeToolBar(self.__toolbar)
-        
+
         self.__toolbar.deleteLater()
         self.__toolbar = None
-    
+
     def __svnResolve(self):
         """
         Private slot used to resolve conflicts of the local project.
         """
         self.vcs.vcsResolved(self.project.ppath)
-        
+
     def __svnPropList(self):
         """
         Private slot used to list the properties of the project files.
         """
         self.vcs.svnListProps(self.project.ppath, True)
-        
+
     def __svnPropSet(self):
         """
         Private slot used to set a property for the project files.
         """
         self.vcs.svnSetProp(self.project.ppath, True)
-        
+
     def __svnPropDel(self):
         """
         Private slot used to delete a property for the project files.
         """
         self.vcs.svnDelProp(self.project.ppath, True)
-        
+
     def __svnTagList(self):
         """
         Private slot used to list the tags of the project.
         """
         self.vcs.svnListTagBranch(self.project.ppath, True)
-        
+
     def __svnBranchList(self):
         """
         Private slot used to list the branches of the project.
         """
         self.vcs.svnListTagBranch(self.project.ppath, False)
-        
+
     def __svnExtendedDiff(self):
         """
         Private slot used to perform a svn diff with the selection of
         revisions.
         """
         self.vcs.svnExtendedDiff(self.project.ppath)
-        
+
     def __svnUrlDiff(self):
         """
         Private slot used to perform a svn diff with the selection of
         repository URLs.
         """
         self.vcs.svnUrlDiff(self.project.ppath)
-        
+
     def __svnRelocate(self):
         """
         Private slot used to relocate the working copy to a new repository URL.
         """
         self.vcs.svnRelocate(self.project.ppath)
-        
+
     def __svnRepoBrowser(self):
         """
         Private slot to open the repository browser.
         """
         self.vcs.svnRepoBrowser(projectPath=self.project.ppath)
-        
+
     def __svnConfigure(self):
         """
         Private slot to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "zzz_subversionPage")
-    
+        ericApp().getObject("UserInterface").showPreferences("zzz_subversionPage")
+
     def __svnChangeLists(self):
         """
         Private slot used to show a list of change lists.
         """
         self.vcs.svnShowChangelists(self.project.ppath)
-    
+
     def __svnUpgrade(self):
         """
         Private slot used to upgrade the working copy format.
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnBlameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnBlameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 
 from PyQt6.QtCore import QTimer, QProcess, Qt, pyqtSlot
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QDialog, QDialogButtonBox, QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -26,55 +30,54 @@
     """
     Class implementing a dialog to show the output of the svn blame command.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.blameList.headerItem().setText(self.blameList.columnCount(), "")
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.blameList.setFont(font)
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def start(self, fn):
         """
         Public slot to start the svn blame command.
-        
+
         @param fn filename to show the blame for (string)
         """
         self.blameList.clear()
@@ -82,154 +85,148 @@
         self.intercept = False
         self.activateWindow()
         self.lineno = 1
-        
+
         dname, fname = self.vcs.splitPath(fn)
-        
+
         self.process.kill()
-        
+
         args = []
-        args.append('blame')
-        self.vcs.addArguments(args, self.vcs.options['global'])
+        args.append("blame")
+        self.vcs.addArguments(args, self.vcs.options["global"])
         args.append(fname)
-        
+
         self.process.setWorkingDirectory(dname)
-        
-        self.process.start('svn', args)
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.__resizeColumns()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-        
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.blameList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
-        
+        self.blameList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
+
     def __generateItem(self, revision, author, text):
         """
         Private method to generate a blame item in the blame list.
-        
+
         @param revision revision string (string)
         @param author author of the change (string)
         @param text line of text from the annotated file (string)
         """
         itm = QTreeWidgetItem(
-            self.blameList,
-            [revision, author, "{0:d}".format(self.lineno), text])
+            self.blameList, [revision, author, "{0:d}".format(self.lineno), text]
+        )
         self.lineno += 1
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignRight)
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(
-                self.process.readLine(), self.__ioEncoding, 'replace').strip()
+            s = str(self.process.readLine(), self.__ioEncoding, "replace").strip()
             rev, s = s.split(None, 1)
             try:
-                author, text = s.split(' ', 1)
+                author, text = s.split(" ", 1)
             except ValueError:
                 author = s.strip()
                 text = ""
             self.__generateItem(rev, author, text)
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -237,30 +234,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnChangeListsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnChangeListsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QTimer
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QListWidgetItem, QLineEdit
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QListWidgetItem, QLineEdit
 
 from EricWidgets import EricMessageBox
 
@@ -27,43 +25,43 @@
     """
     Class implementing a dialog to browse the change lists.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.rx_status = re.compile(
-            '(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*')
+            "(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*"
+        )
         # flags (8 or 9 anything), revision, changed rev, author, path
-        self.rx_status2 = re.compile('(.{8,9})\\s+(.+)\\s*')
+        self.rx_status2 = re.compile("(.{8,9})\\s+(.+)\\s*")
         # flags (8 or 9 anything), path
-        self.rx_changelist = re.compile('--- \\S+ .([\\w\\s]+).:\\s+')
+        self.rx_changelist = re.compile("--- \\S+ .([\\w\\s]+).:\\s+")
         # three dashes, Changelist (translated), quote,
         # changelist name, quote, :
-    
+
     @pyqtSlot(QListWidgetItem, QListWidgetItem)
     def on_changeLists_currentItemChanged(self, current, previous):
         """
         Private slot to handle the selection of a new item.
-        
+
         @param current current item (QListWidgetItem)
         @param previous previous current item (QListWidgetItem)
         """
@@ -71,185 +69,176 @@
         if current is not None:
             changelist = current.text()
             if changelist in self.changeListsDict:
-                self.filesList.addItems(
-                    sorted(self.changeListsDict[changelist]))
-    
+                self.filesList.addItems(sorted(self.changeListsDict[changelist]))
+
     def start(self, path):
         """
         Public slot to populate the data.
-        
+
         @param path directory name to show change lists for (string)
         """
         self.changeListsDict = {}
-        
-        self.filesLabel.setText(
-            self.tr("Files (relative to {0}):").format(path))
-        
+
+        self.filesLabel.setText(self.tr("Files (relative to {0}):").format(path))
+
         self.errorGroup.hide()
         self.intercept = False
-        
+
         self.path = path
         self.currentChangelist = ""
-        
+
         args = []
-        args.append('status')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        self.vcs.addArguments(args, self.vcs.options['status'])
+        args.append("status")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        self.vcs.addArguments(args, self.vcs.options["status"])
         if (
-            '--verbose' not in self.vcs.options['global'] and
-            '--verbose' not in self.vcs.options['status']
+            "--verbose" not in self.vcs.options["global"]
+            and "--verbose" not in self.vcs.options["status"]
         ):
-            args.append('--verbose')
+            args.append("--verbose")
         if isinstance(path, list):
             self.dname, fnames = self.vcs.splitPathList(path)
             self.vcs.addArguments(args, fnames)
         else:
             self.dname, fname = self.vcs.splitPath(path)
             args.append(fname)
-        
+
         self.process.setWorkingDirectory(self.dname)
-        
-        self.process.start('svn', args)
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         if len(self.changeListsDict) == 0:
             self.changeLists.addItem(self.tr("No changelists found"))
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setFocus(
-                    Qt.FocusReason.OtherFocusReason)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+                Qt.FocusReason.OtherFocusReason
+            )
         else:
             self.changeLists.addItems(sorted(self.changeListsDict.keys()))
             self.changeLists.setCurrentRow(0)
             self.changeLists.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
             self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-            
+
             while self.process.canReadLine():
-                s = str(self.process.readLine(),
-                        Preferences.getSystem("IOEncoding"),
-                        'replace')
-                match = (
-                    self.rx_status.fullmatch(s) or
-                    self.rx_status2.fullmatch(s)
+                s = str(
+                    self.process.readLine(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
                 )
+                match = self.rx_status.fullmatch(s) or self.rx_status2.fullmatch(s)
                 if self.currentChangelist != "" and match is not None:
                     if match.re is self.rx_status:
                         file = match.group(5).strip()
                         filename = file.replace(self.path + os.sep, "")
-                        if filename not in self.changeListsDict[
-                            self.currentChangelist
-                        ]:
-                            self.changeListsDict[
-                                self.currentChangelist].append(filename)
+                        if filename not in self.changeListsDict[self.currentChangelist]:
+                            self.changeListsDict[self.currentChangelist].append(
+                                filename
+                            )
                     else:
                         file = match.group(2).strip()
                         filename = file.replace(self.path + os.sep, "")
-                        if filename not in self.changeListsDict[
-                            self.currentChangelist
-                        ]:
-                            self.changeListsDict[
-                                self.currentChangelist].append(filename)
+                        if filename not in self.changeListsDict[self.currentChangelist]:
+                            self.changeListsDict[self.currentChangelist].append(
+                                filename
+                            )
                 else:
                     match = self.rx_changelist.fullmatch(s)
                     if match is not None:
                         self.currentChangelist = match.group(1)
                         if self.currentChangelist not in self.changeListsDict:
                             self.changeListsDict[self.currentChangelist] = []
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -257,30 +246,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommandDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommandDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,15 +19,16 @@
 class SvnCommandDialog(QDialog, Ui_SvnCommandDialog):
     """
     Class implementing the Subversion command dialog.
-    
+
     It implements a dialog that is used to enter an
     arbitrary subversion command. It asks the user to enter
     the commandline parameters and the working directory.
     """
+
     def __init__(self, argvList, wdList, ppath, parent=None):
         """
         Constructor
-        
+
         @param argvList history list of commandline arguments (list of strings)
         @param wdList history list of working directories (list of strings)
         @param ppath pathname of the project directory (string)
@@ -35,13 +36,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.workdirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.commandCombo.clear()
         self.commandCombo.addItems(argvList)
         if len(argvList) > 0:
@@ -51,29 +51,28 @@
         if len(wdList) > 0:
             self.workdirPicker.setCurrentIndex(0)
         self.projectDirLabel.setText(ppath)
-        
+
         # modify some what's this help texts
         t = self.commandCombo.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.commandCombo.setWhatsThis(t)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_commandCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text ignored
         """
         self.okButton.setDisabled(self.commandCombo.currentText() == "")
-    
+
     def getData(self):
         """
         Public method to retrieve the data entered into this dialog.
-        
+
         @return a tuple of argv, workdir
         """
-        return (self.commandCombo.currentText(),
-                self.workdirPicker.currentText())
+        return (self.commandCombo.currentText(), self.workdirPicker.currentText())
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,113 +18,114 @@
 class SvnCommitDialog(QWidget, Ui_SvnCommitDialog):
     """
     Class implementing a dialog to enter the commit message.
-    
+
     @signal accepted() emitted, if the dialog was accepted
     @signal rejected() emitted, if the dialog was rejected
     """
+
     accepted = pyqtSignal()
     rejected = pyqtSignal()
-    
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent, Qt.WindowType.Window)
         self.setupUi(self)
-        
+
         self.__vcs = vcs
-        
+
         project = ericApp().getObject("Project")
         pwl, pel = project.getProjectDictionaries()
         language = project.getProjectSpellLanguage()
         self.logEdit.setLanguageWithPWL(language, pwl or None, pel or None)
-        
+
         if vcs.version < (1, 5, 0):
             self.changeListsGroup.hide()
         else:
             self.changeLists.addItems(sorted(vcs.svnGetChangelists()))
-        
+
     def showEvent(self, evt):
         """
         Protected method called when the dialog is about to be shown.
-        
+
         @param evt the event (QShowEvent)
         """
         commitMessages = self.__vcs.vcsCommitMessages()
         self.recentComboBox.clear()
         self.recentComboBox.addItem("")
         self.recentComboBox.addItems(commitMessages)
-        
+
         self.logEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
     def logMessage(self):
         """
         Public method to retrieve the log message.
-        
+
         @return the log message (string)
         """
         msg = self.logEdit.toPlainText()
         if msg:
             self.__vcs.vcsAddCommitMessage(msg)
         return msg
-        
+
     def hasChangelists(self):
         """
         Public method to check, if the user entered some changelists.
-        
+
         @return flag indicating availability of changelists (boolean)
         """
         return len(self.changeLists.selectedItems()) > 0
-        
+
     def changelistsData(self):
         """
         Public method to retrieve the changelists data.
-        
+
         @return tuple containing the changelists (list of strings) and a flag
             indicating to keep changelists (boolean)
         """
-        slists = [line.text().strip()
-                  for line in self.changeLists.selectedItems()
-                  if line.text().strip() != ""]
-        
+        slists = [
+            line.text().strip()
+            for line in self.changeLists.selectedItems()
+            if line.text().strip() != ""
+        ]
+
         if len(slists) == 0:
             return [], False
-        
+
         return slists, self.keepChangeListsCheckBox.isChecked()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.logEdit.clear()
-        
+
     def on_buttonBox_accepted(self):
         """
         Private slot called by the buttonBox accepted signal.
         """
         self.close()
         self.accepted.emit()
-        
+
     def on_buttonBox_rejected(self):
         """
         Private slot called by the buttonBox rejected signal.
         """
         self.close()
         self.rejected.emit()
-    
+
     @pyqtSlot(int)
     def on_recentComboBox_activated(self, index):
         """
         Private slot to select a commit message from recent ones.
-        
+
         @param index index of the selected entry
         @type int
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCopyDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnCopyDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     Class implementing a dialog to enter the data for a copy or rename
     operation.
     """
+
     def __init__(self, source, parent=None, move=False, force=False):
         """
         Constructor
-        
+
         @param source name of the source file/directory (string)
         @param parent parent widget (QWidget)
         @param move flag indicating a move operation (boolean)
@@ -33,31 +34,30 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.source = source
         if os.path.isdir(self.source):
             self.targetPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         else:
             self.targetPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
-        
+
         if move:
-            self.setWindowTitle(self.tr('Subversion Move'))
+            self.setWindowTitle(self.tr("Subversion Move"))
         else:
             self.forceCheckBox.setEnabled(False)
         self.forceCheckBox.setChecked(force)
-        
+
         self.sourceEdit.setText(source)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public method to retrieve the copy data.
-        
+
         @return the target name (string) and a flag indicating
             the operation should be enforced (boolean)
         """
@@ -66,13 +66,14 @@
             sourceDir = os.path.dirname(self.sourceEdit.text())
             target = os.path.join(sourceDir, target)
         return (target, self.forceCheckBox.isChecked())
-    
+
     @pyqtSlot(str)
     def on_targetPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the target.
-        
+
         @param txt contents of the target edit (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            os.path.isabs(txt) or os.path.dirname(txt) == "")
+            os.path.isabs(txt) or os.path.dirname(txt) == ""
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,107 +23,93 @@
 class SvnDialog(QDialog, Ui_SvnDialog):
     """
     Class implementing a dialog starting a process and showing its output.
-    
+
     It starts a QProcess and displays a dialog that
     shows the output of the process. The dialog is modal,
     which causes a synchronized execution of the process.
     """
+
     def __init__(self, text, parent=None):
         """
         Constructor
-        
+
         @param text text to be shown by the label (string)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = None
-        self.username = ''
-        self.password = ''
-        
+        self.username = ""
+        self.password = ""
+
         self.outputGroup.setTitle(text)
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.process = None
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         if (
-            Preferences.getVCS("AutoClose") and
-            self.normal and
-            self.errors.toPlainText() == ""
+            Preferences.getVCS("AutoClose")
+            and self.normal
+            and self.errors.toPlainText() == ""
         ):
             self.accept()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
-        self.normal = (
-            exitStatus == QProcess.ExitStatus.NormalExit and
-            exitCode == 0
-        )
+        self.normal = exitStatus == QProcess.ExitStatus.NormalExit and exitCode == 0
         self.__finish()
-        
+
     def startProcess(self, args, workingDir=None, setLanguage=False):
         """
         Public slot used to start the process.
-        
+
         @param args list of arguments for the process (list of strings)
         @param workingDir working directory for the process (string)
         @param setLanguage flag indicating to set the language to "C" (boolean)
@@ -132,9 +118,9 @@
         self.errorGroup.hide()
         self.normal = False
         self.intercept = False
-        
+
         self.__hasAddOrDelete = False
-        
+
         self.process = QProcess()
         if setLanguage:
             env = QProcessEnvironment.systemEnvironment()
@@ -147,20 +133,20 @@
                 lastWasPwd = True
                 continue
             nargs.append(arg)
-            if arg == '--password':
+            if arg == "--password":
                 lastWasPwd = True
-                nargs.append('*****')
-            
-        self.resultbox.append(' '.join(nargs))
-        self.resultbox.append('')
-        
+                nargs.append("*****")
+
+        self.resultbox.append(" ".join(nargs))
+        self.resultbox.append("")
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         if workingDir:
             self.process.setWorkingDirectory(workingDir)
-        self.process.start('svn', args)
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.buttonBox.setFocus()
@@ -168,76 +154,78 @@
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
         return procStarted
-        
+
     def normalExit(self):
         """
         Public method to check for a normal process termination.
-        
+
         @return flag indicating normal process termination (boolean)
         """
         return self.normal
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
-            s = str(self.process.readAllStandardOutput(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.resultbox.insertPlainText(s)
             self.resultbox.ensureCursorVisible()
             if not self.__hasAddOrDelete and len(s) > 0:
                 # check the output
                 for line in s.split(os.linesep):
-                    if (
-                        '.epj' in line or
-                        '.e4p' in line
-                    ):
+                    if ".epj" in line or ".e4p" in line:
                         self.__hasAddOrDelete = True
                         break
-                    if line and line[0:2].strip() in ['A', 'D']:
+                    if line and line[0:2].strip() in ["A", "D"]:
                         self.__hasAddOrDelete = True
                         break
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -245,30 +233,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -276,11 +264,11 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-        
+
     def hasAddOrDelete(self):
         """
         Public method to check, if the last action contained an add or delete.
-        
+
         @return flag indicating the presence of an add or delete (boolean)
         """
         return self.__hasAddOrDelete
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,60 +30,59 @@
     Class implementing a dialog to show the output of the svn diff command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.searchWidget.attachTextEdit(self.contents)
-        
+
         self.process = QProcess()
         self.vcs = vcs
-        
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.contents.document().setDefaultFont(font)
-        
+
         self.highlighter = SvnDiffHighlighter(self.contents.document())
-        
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def __getVersionArg(self, version):
         """
         Private method to get a svn revision argument for the given revision.
-        
+
         @param version revision (integer or string)
         @return version argument (string)
         """
@@ -91,12 +90,11 @@
             return None
         else:
             return str(version)
-        
-    def start(self, fn, versions=None, urls=None, summary=False,
-              refreshable=False):
+
+    def start(self, fn, versions=None, urls=None, summary=False, refreshable=False):
         """
         Public slot to start the svn diff command.
-        
+
         @param fn filename to be diffed (string)
         @param versions list of versions to be diffed (list of up to 2 strings
             or None)
@@ -106,50 +104,50 @@
         @param refreshable flag indicating a refreshable diff (boolean)
         """
         self.refreshButton.setVisible(refreshable)
-        
+
         self.errorGroup.hide()
         self.inputGroup.show()
         self.inputGroup.setEnabled(True)
         self.intercept = False
         self.filename = fn
-        
+
         self.process.kill()
-        
+
         self.contents.clear()
         self.highlighter.regenerateRules()
         self.paras = 0
-        
+
         self.filesCombo.clear()
-        
+
         self.__oldFile = ""
         self.__oldFileLine = -1
         self.__fileSeparators = []
-        
+
         args = []
-        args.append('diff')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        self.vcs.addArguments(args, self.vcs.options['diff'])
-        if '--diff-cmd' in self.vcs.options['diff']:
+        args.append("diff")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        self.vcs.addArguments(args, self.vcs.options["diff"])
+        if "--diff-cmd" in self.vcs.options["diff"]:
             self.buttonBox.button(QDialogButtonBox.StandardButton.Save).hide()
-        
+
         if versions is not None:
             self.raise_()
             self.activateWindow()
-            
+
             rev1 = self.__getVersionArg(versions[0])
             rev2 = None
             if len(versions) == 2:
                 rev2 = self.__getVersionArg(versions[1])
-            
+
             if rev1 is not None or rev2 is not None:
-                args.append('-r')
+                args.append("-r")
                 if rev1 is not None and rev2 is not None:
-                    args.append('{0}:{1}'.format(rev1, rev2))
+                    args.append("{0}:{1}".format(rev1, rev2))
                 elif rev2 is None:
                     args.append(rev1)
                 elif rev1 is None:
                     args.append(rev2)
-        
+
         self.summaryPath = None
         if urls is not None:
             if summary:
@@ -162,7 +160,7 @@
             else:
                 dname, fname = self.vcs.splitPath(fn)
                 fnames = [fname]
-            project = ericApp().getObject('Project')
+            project = ericApp().getObject("Project")
             if dname == project.getProjectPath():
                 path = ""
             else:
@@ -178,155 +176,154 @@
             else:
                 dname, fname = self.vcs.splitPath(fn)
                 args.append(fname)
-        
+
         self.process.setWorkingDirectory(dname)
-        
-        self.process.start('svn', args)
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
-        
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-        
+
         if self.paras == 0:
-            self.contents.setPlainText(self.tr('There is no difference.'))
-            
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(self.paras > 0)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+            self.contents.setPlainText(self.tr("There is no difference."))
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(
+            self.paras > 0
+        )
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.contents.setTextCursor(tc)
         self.contents.ensureCursorVisible()
-        
+
         self.filesCombo.addItem(self.tr("<Start>"), 0)
         self.filesCombo.addItem(self.tr("<End>"), -1)
         for oldFile, newFile, pos in sorted(self.__fileSeparators):
             if oldFile != newFile:
-                self.filesCombo.addItem(
-                    "{0}\n{1}".format(oldFile, newFile), pos)
+                self.filesCombo.addItem("{0}\n{1}".format(oldFile, newFile), pos)
             else:
                 self.filesCombo.addItem(oldFile, pos)
-        
+
     def __appendText(self, txt):
         """
         Private method to append text to the end of the contents pane.
-        
+
         @param txt text to insert (string)
         """
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.End)
         self.contents.setTextCursor(tc)
         self.contents.insertPlainText(txt)
-        
+
     def __extractFileName(self, line):
         """
         Private method to extract the file name out of a file separator line.
-        
+
         @param line line to be processed (string)
         @return extracted file name (string)
         """
         f = line.split(None, 1)[1]
         f = f.rsplit(None, 2)[0]
         return f
-    
+
     def __processFileLine(self, line):
         """
         Private slot to process a line giving the old/new file.
-        
+
         @param line line to be processed (string)
         """
-        if line.startswith('---'):
+        if line.startswith("---"):
             self.__oldFileLine = self.paras
             self.__oldFile = self.__extractFileName(line)
         else:
             self.__fileSeparators.append(
-                (self.__oldFile, self.__extractFileName(line),
-                 self.__oldFileLine))
-    
+                (self.__oldFile, self.__extractFileName(line), self.__oldFileLine)
+            )
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            line = str(self.process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            line = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             if self.summaryPath:
-                line = line.replace(self.summaryPath + '/', '')
+                line = line.replace(self.summaryPath + "/", "")
                 line = " ".join(line.split())
             if line.startswith("--- ") or line.startswith("+++ "):
                 self.__processFileLine(line)
-                
+
             self.__appendText(line)
             self.paras += 1
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Save):
             self.on_saveButton_clicked()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     @pyqtSlot(int)
     def on_filesCombo_activated(self, index):
         """
         Private slot to handle the selection of a file.
-        
+
         @param index activated row (integer)
         """
         para = self.filesCombo.itemData(index)
-        
+
         if para == 0:
             tc = self.contents.textCursor()
             tc.movePosition(QTextCursor.MoveOperation.Start)
@@ -343,22 +340,23 @@
             tc.movePosition(QTextCursor.MoveOperation.End)
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-            
+
             # step 2: move cursor to desired line
             tc = self.contents.textCursor()
             delta = tc.blockNumber() - para
             tc.movePosition(
                 QTextCursor.MoveOperation.PreviousBlock,
                 QTextCursor.MoveMode.MoveAnchor,
-                delta)
+                delta,
+            )
             self.contents.setTextCursor(tc)
             self.contents.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to handle the Save button press.
-        
+
         It saves the diff shown in the dialog to a file in the local
         filesystem.
         """
@@ -367,24 +365,25 @@
                 fname = self.vcs.splitPathList(self.filename)[0]
             else:
                 dname, fname = self.vcs.splitPath(self.filename[0])
-                if fname != '.':
+                if fname != ".":
                     fname = "{0}.diff".format(self.filename[0])
                 else:
                     fname = dname
         else:
             fname = self.vcs.splitPath(self.filename)[0]
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -394,49 +393,51 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         eol = ericApp().getObject("Project").getEolString()
         try:
             with fpath.open("w", encoding="utf-8", newline="") as f:
                 f.write(eol.join(self.contents.toPlainText().splitlines()))
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.'
-                    '<br>Reason: {1}</p>')
-                .format(fpath, str(why)))
-        
+                    "<p>The patch file <b>{0}</b> could not be saved."
+                    "<br>Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the display.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Save).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Save).setEnabled(False)
         self.refreshButton.setEnabled(False)
-        
+
         self.start(self.filename, refreshable=True)
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -444,30 +445,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnDiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,19 +7,18 @@
 Module implementing a syntax highlighter for unified and context diff outputs.
 """
 
-from EricGui.EricGenericDiffHighlighter import (
-    TERMINAL, EricGenericDiffHighlighter
-)
+from EricGui.EricGenericDiffHighlighter import TERMINAL, EricGenericDiffHighlighter
 
 
 class SvnDiffHighlighter(EricGenericDiffHighlighter):
     """
     Class implementing a diff highlighter for Git.
     """
+
     def __init__(self, doc):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         """
         super().__init__(doc)
@@ -28,35 +27,32 @@
         """
         Public method to generate the rule set.
         """
-        diffHeader = self.makeFormat(fg=self.textColor,
-                                     bg=self.headerColor)
-        diffHeaderBold = self.makeFormat(fg=self.textColor,
-                                         bg=self.headerColor,
-                                         bold=True)
-        diffContext = self.makeFormat(fg=self.textColor,
-                                      bg=self.contextColor)
+        diffHeader = self.makeFormat(fg=self.textColor, bg=self.headerColor)
+        diffHeaderBold = self.makeFormat(
+            fg=self.textColor, bg=self.headerColor, bold=True
+        )
+        diffContext = self.makeFormat(fg=self.textColor, bg=self.contextColor)
 
-        diffAdded = self.makeFormat(fg=self.textColor,
-                                    bg=self.addedColor)
-        diffRemoved = self.makeFormat(fg=self.textColor,
-                                      bg=self.removedColor)
-        
-        diffBarRegex = TERMINAL(r'^=+$')
+        diffAdded = self.makeFormat(fg=self.textColor, bg=self.addedColor)
+        diffRemoved = self.makeFormat(fg=self.textColor, bg=self.removedColor)
+
+        diffBarRegex = TERMINAL(r"^=+$")
+
+        diffHeaderRegex = TERMINAL(r"^[iI]ndex: \S+")
 
-        diffHeaderRegex = TERMINAL(r'^[iI]ndex: \S+')
-        
-        diffOldRegex = TERMINAL(r'^--- ')
-        diffNewRegex = TERMINAL(r'^\+\+\+')
-        diffContextRegex = TERMINAL(r'^@@ ')
-        
-        diffAddedRegex = TERMINAL(r'^[+>]|^A ')
-        diffRemovedRegex = TERMINAL(r'^[-<]|^D ')
-        
-        self.createRules((diffOldRegex, diffRemoved),
-                         (diffNewRegex, diffAdded),
-                         (diffContextRegex, diffContext),
-                         (diffHeaderRegex, diffHeader),
-                         (diffBarRegex, diffHeaderBold),
-                         (diffAddedRegex, diffAdded),
-                         (diffRemovedRegex, diffRemoved),
-                         )
+        diffOldRegex = TERMINAL(r"^--- ")
+        diffNewRegex = TERMINAL(r"^\+\+\+")
+        diffContextRegex = TERMINAL(r"^@@ ")
+
+        diffAddedRegex = TERMINAL(r"^[+>]|^A ")
+        diffRemovedRegex = TERMINAL(r"^[-<]|^D ")
+
+        self.createRules(
+            (diffOldRegex, diffRemoved),
+            (diffNewRegex, diffAdded),
+            (diffContextRegex, diffContext),
+            (diffHeaderRegex, diffHeader),
+            (diffBarRegex, diffHeaderBold),
+            (diffAddedRegex, diffAdded),
+            (diffRemovedRegex, diffRemoved),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnLogBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnLogBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QDate, QProcess, QPoint
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QWidget, QApplication, QDialogButtonBox,
-    QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QWidget,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -30,93 +34,90 @@
     """
     Class implementing a dialog to browse the log history.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__position = QPoint()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-        
+
         self.filesTree.headerItem().setText(self.filesTree.columnCount(), "")
-        self.filesTree.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.filesTree.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.vcs = vcs
-        
+
         self.__initData()
-        
+
         self.fromDate.setDisplayFormat("yyyy-MM-dd")
         self.toDate.setDisplayFormat("yyyy-MM-dd")
         self.__resetUI()
-        
+
         self.__messageRole = Qt.ItemDataRole.UserRole
         self.__changesRole = Qt.ItemDataRole.UserRole + 1
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-        
-        self.rx_sep1 = re.compile('\\-+\\s*')
-        self.rx_sep2 = re.compile('=+\\s*')
-        self.rx_rev1 = re.compile(
-            r'rev ([0-9]+):  ([^|]*) \| ([^|]*) \| ([0-9]+) .*')
+
+        self.rx_sep1 = re.compile("\\-+\\s*")
+        self.rx_sep2 = re.compile("=+\\s*")
+        self.rx_rev1 = re.compile(r"rev ([0-9]+):  ([^|]*) \| ([^|]*) \| ([0-9]+) .*")
         # "rev" followed by one or more decimals followed by a colon followed
         # anything up to " | " (twice) followed by one or more decimals
         # followed by anything
-        self.rx_rev2 = re.compile(
-            r'r([0-9]+) \| ([^|]*) \| ([^|]*) \| ([0-9]+) .*')
+        self.rx_rev2 = re.compile(r"r([0-9]+) \| ([^|]*) \| ([^|]*) \| ([0-9]+) .*")
         # "r" followed by one or more decimals followed by " | " followed
         # anything up to " | " (twice) followed by one or more decimals
         # followed by anything
         self.rx_flags1 = re.compile(
-            r"""   ([ADM])\s(.*)\s+\(\w+\s+(.*):([0-9]+)\)\s*""")
+            r"""   ([ADM])\s(.*)\s+\(\w+\s+(.*):([0-9]+)\)\s*"""
+        )
         # three blanks followed by A or D or M followed by path followed by
         # path copied from followed by copied from revision
-        self.rx_flags2 = re.compile('   ([ADM]) (.*)\\s*')
+        self.rx_flags2 = re.compile("   ([ADM]) (.*)\\s*")
         # three blanks followed by A or D or M followed by path
-        
+
         self.flags = {
-            'A': self.tr('Added'),
-            'D': self.tr('Deleted'),
-            'M': self.tr('Modified'),
-            'R': self.tr('Replaced'),
+            "A": self.tr("Added"),
+            "D": self.tr("Deleted"),
+            "M": self.tr("Modified"),
+            "R": self.tr("Replaced"),
         }
         self.intercept = False
-        
+
         self.__logTreeNormalFont = self.logTree.font()
         self.__logTreeNormalFont.setBold(False)
         self.__logTreeBoldFont = self.logTree.font()
         self.__logTreeBoldFont.setBold(True)
-        
+
         self.__finishCallbacks = []
-    
+
     def __addFinishCallback(self, callback):
         """
         Private method to add a method to be called once the process finished.
-        
+
         The callback methods are invoke in a FIFO style and are consumed. If
         a callback method needs to be called again, it must be added again.
-        
+
         @param callback callback method
         @type function
         """
         if callback not in self.__finishCallbacks:
             self.__finishCallbacks.append(callback)
-    
+
     def __initData(self):
         """
         Private method to (re-)initialize some data.
@@ -124,30 +125,30 @@
         self.__maxDate = QDate()
         self.__minDate = QDate()
         self.__filterLogsEnabled = True
-        
-        self.buf = []        # buffer for stdout
+
+        self.buf = []  # buffer for stdout
         self.diff = None
         self.__started = False
         self.__lastRev = 0
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.__position = self.pos()
-        
+
         e.accept()
-        
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -155,24 +156,23 @@
         if not self.__position.isNull():
             self.move(self.__position)
         self.__resetUI()
-        
+
         super().show()
-    
+
     def __resetUI(self):
         """
         Private method to reset the user interface.
         """
         self.fromDate.setDate(QDate.currentDate())
         self.toDate.setDate(QDate.currentDate())
-        self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(
-            self.tr("Message")))
-        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences(
-            "LogLimit"))
-        self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences(
-            "StopLogOnCopy"))
-        
+        self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(self.tr("Message")))
+        self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit"))
+        self.stopCheckBox.setChecked(
+            self.vcs.getPlugin().getPreferences("StopLogOnCopy")
+        )
+
         self.logTree.clear()
-        
+
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
 
@@ -180,40 +180,38 @@
         """
         Private method to resize the log tree columns.
         """
-        self.logTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.logTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.logTree.header().setStretchLastSection(True)
-    
+
     def __resortLog(self):
         """
         Private method to resort the log tree.
         """
         self.logTree.sortItems(
-            self.logTree.sortColumn(),
-            self.logTree.header().sortIndicatorOrder())
-    
+            self.logTree.sortColumn(), self.logTree.header().sortIndicatorOrder()
+        )
+
     def __resizeColumnsFiles(self):
         """
         Private method to resize the changed files tree columns.
         """
-        self.filesTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.filesTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.filesTree.header().setStretchLastSection(True)
-    
+
     def __resortFiles(self):
         """
         Private method to resort the changed files tree.
         """
         sortColumn = self.filesTree.sortColumn()
-        self.filesTree.sortItems(
-            1, self.filesTree.header().sortIndicatorOrder())
+        self.filesTree.sortItems(1, self.filesTree.header().sortIndicatorOrder())
         self.filesTree.sortItems(
-            sortColumn, self.filesTree.header().sortIndicatorOrder())
-    
+            sortColumn, self.filesTree.header().sortIndicatorOrder()
+        )
+
     def __generateLogItem(self, author, date, message, revision, changedPaths):
         """
         Private method to generate a log tree entry.
-        
+
         @param author author info (string)
         @param date date info (string)
         @param message text of the log message (list of strings)
@@ -225,165 +223,163 @@
         msg = []
         for line in message:
             msg.append(line.strip())
-        
+
         itm = QTreeWidgetItem(self.logTree)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, int(revision))
         itm.setData(1, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, date)
         itm.setData(3, Qt.ItemDataRole.DisplayRole, " ".join(msg))
-        
+
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changedPaths)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignLeft)
-        
+
         try:
             self.__lastRev = int(revision)
         except ValueError:
             self.__lastRev = 0
-        
+
         return itm
-    
+
     def __generateFileItem(self, action, path, copyFrom, copyRev):
         """
         Private method to generate a changed files tree entry.
-        
+
         @param action indicator for the change action ("A", "D" or "M")
         @param path path of the file in the repository (string)
         @param copyFrom path the file was copied from (None, string)
         @param copyRev revision the file was copied from (None, string)
         @return reference to the generated item (QTreeWidgetItem)
         """
-        itm = QTreeWidgetItem(self.filesTree, [
-            self.flags[action],
-            path,
-            copyFrom,
-            copyRev,
-        ])
-        
+        itm = QTreeWidgetItem(
+            self.filesTree,
+            [
+                self.flags[action],
+                path,
+                copyFrom,
+                copyRev,
+            ],
+        )
+
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignRight)
-        
+
         return itm
-    
+
     def __getLogEntries(self, startRev=None):
         """
         Private method to retrieve log entries from the repository.
-        
+
         @param startRev revision number to start from (integer, string)
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         QApplication.processEvents()
-        
+
         self.intercept = False
         self.__process.kill()
-        
+
         self.buf = []
         self.cancelled = False
         self.errors.clear()
-        
+
         args = []
-        args.append('log')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        self.vcs.addArguments(args, self.vcs.options['log'])
-        args.append('--verbose')
-        args.append('--limit')
-        args.append('{0:d}'.format(self.limitSpinBox.value()))
+        args.append("log")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        self.vcs.addArguments(args, self.vcs.options["log"])
+        args.append("--verbose")
+        args.append("--limit")
+        args.append("{0:d}".format(self.limitSpinBox.value()))
         if startRev is not None:
-            args.append('--revision')
-            args.append('{0}:0'.format(startRev))
+            args.append("--revision")
+            args.append("{0}:0".format(startRev))
         if self.stopCheckBox.isChecked():
-            args.append('--stop-on-copy')
+            args.append("--stop-on-copy")
         args.append(self.fname)
-        
+
         self.__process.setWorkingDirectory(self.dname)
-        
+
         self.inputGroup.setEnabled(True)
         self.inputGroup.show()
-        
-        self.__process.start('svn', args)
+
+        self.__process.start("svn", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
-    
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
+
     def start(self, fn, isFile=False):
         """
         Public slot to start the svn log command.
-        
+
         @param fn filename to show the log for (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         """
         self.sbsCheckBox.setEnabled(isFile)
         self.sbsCheckBox.setVisible(isFile)
-        
+
         self.errorGroup.hide()
         QApplication.processEvents()
-        
+
         self.__initData()
-        
+
         self.filename = fn
         self.dname, self.fname = self.vcs.splitPath(fn)
-        
+
         self.activateWindow()
         self.raise_()
-        
+
         self.logTree.clear()
         self.__started = True
         self.__getLogEntries()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__processBuffer()
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         while self.__finishCallbacks:
             self.__finishCallbacks.pop(0)()
-    
+
     def __processBuffer(self):
         """
         Private method to process the buffered output of the svn log command.
@@ -393,12 +389,12 @@
         changedPaths = []
         for s in self.buf:
             match = (
-                self.rx_rev1.fullmatch(s) or
-                self.rx_rev2.fullmatch(s) or
-                self.rx_flags1.fullmatch(s) or
-                self.rx_flags2.fullmatch(s) or
-                self.rx_sep1.fullmatch(s) or
-                self.rx_sep2.fullmatch(s)
+                self.rx_rev1.fullmatch(s)
+                or self.rx_rev2.fullmatch(s)
+                or self.rx_flags1.fullmatch(s)
+                or self.rx_flags2.fullmatch(s)
+                or self.rx_sep1.fullmatch(s)
+                or self.rx_sep2.fullmatch(s)
             )
             if match is None:
                 if s.strip().endswith(":") or not s.strip():
@@ -416,31 +412,35 @@
                 log["date"] = " ".join(match.group(3).split()[:2])
                 # number of lines is ignored
             elif match.re is self.rx_flags1:
-                changedPaths.append({
-                    "action": match.group(1).strip(),
-                    "path": match.group(2).strip(),
-                    "copyfrom_path": match.group(3).strip(),
-                    "copyfrom_revision": match.group(4).strip(),
-                })
+                changedPaths.append(
+                    {
+                        "action": match.group(1).strip(),
+                        "path": match.group(2).strip(),
+                        "copyfrom_path": match.group(3).strip(),
+                        "copyfrom_revision": match.group(4).strip(),
+                    }
+                )
             elif match.re is self.rx_flags2:
-                changedPaths.append({
-                    "action": match.group(1).strip(),
-                    "path": match.group(2).strip(),
-                    "copyfrom_path": "",
-                    "copyfrom_revision": "",
-                })
-            elif (
-                (match.re is self.rx_sep1 or match.re is self.rx_sep2) and
-                len(log) > 1
-            ):
+                changedPaths.append(
+                    {
+                        "action": match.group(1).strip(),
+                        "path": match.group(2).strip(),
+                        "copyfrom_path": "",
+                        "copyfrom_revision": "",
+                    }
+                )
+            elif (match.re is self.rx_sep1 or match.re is self.rx_sep2) and len(
+                log
+            ) > 1:
                 self.__generateLogItem(
-                    log["author"], log["date"], log["message"],
-                    log["revision"], changedPaths)
+                    log["author"],
+                    log["date"],
+                    log["message"],
+                    log["revision"],
+                    changedPaths,
+                )
                 dt = QDate.fromString(log["date"], Qt.DateFormat.ISODate)
-                if (
-                    not self.__maxDate.isValid() and
-                    not self.__minDate.isValid()
-                ):
+                if not self.__maxDate.isValid() and not self.__minDate.isValid():
                     self.__maxDate = dt
                     self.__minDate = dt
                 else:
@@ -451,18 +451,18 @@
                 noEntries += 1
                 log = {"message": []}
                 changedPaths = []
-        
+
         self.__resizeColumnsLog()
         self.__resortLog()
-        
+
         if self.__started:
             self.logTree.setCurrentItem(self.logTree.topLevelItem(0))
             self.__started = False
-        
+
         if noEntries < self.limitSpinBox.value() and not self.cancelled:
             self.nextButton.setEnabled(False)
             self.limitSpinBox.setEnabled(False)
-        
+
         self.__filterLogsEnabled = False
         self.fromDate.setMinimumDate(self.__minDate)
         self.fromDate.setMaximumDate(self.__maxDate)
@@ -472,75 +472,75 @@
         self.toDate.setDate(self.__maxDate)
         self.__filterLogsEnabled = True
         self.__filterLogs()
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process and inserts it into a buffer.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            line = str(self.__process.readLine(),
-                       Preferences.getSystem("IOEncoding"),
-                       'replace')
+            line = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.buf.append(line)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
             self.errorGroup.show()
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-    
+
     def __diffRevisions(self, rev1, rev2):
         """
         Private method to do a diff of two revisions.
-        
+
         @param rev1 first revision number (integer)
         @param rev2 second revision number (integer)
         """
         if self.sbsCheckBox.isEnabled() and self.sbsCheckBox.isChecked():
-            self.vcs.vcsSbsDiff(self.filename,
-                                revisions=(str(rev1), str(rev2)))
+            self.vcs.vcsSbsDiff(self.filename, revisions=(str(rev1), str(rev2)))
         else:
             if self.diff is None:
                 from .SvnDiffDialog import SvnDiffDialog
+
                 self.diff = SvnDiffDialog(self.vcs)
             self.diff.show()
             self.diff.raise_()
             self.diff.start(self.filename, [rev1, rev2])
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.cancelled = True
             self.__finish()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_logTree_currentItemChanged(self, current, previous):
         """
         Private slot called, when the current item of the log tree changes.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the old current item (QTreeWidgetItem)
         """
@@ -548,43 +548,42 @@
             self.messageEdit.clear()
             for line in current.data(0, self.__messageRole):
                 self.messageEdit.append(line.strip())
-            
+
             self.filesTree.clear()
             changes = current.data(0, self.__changesRole)
             if len(changes) > 0:
                 for change in changes:
                     self.__generateFileItem(
-                        change["action"], change["path"],
+                        change["action"],
+                        change["path"],
                         change["copyfrom_path"],
-                        change["copyfrom_revision"])
+                        change["copyfrom_revision"],
+                    )
                 self.__resizeColumnsFiles()
             self.__resortFiles()
-        
+
         self.diffPreviousButton.setEnabled(
-            current != self.logTree.topLevelItem(
-                self.logTree.topLevelItemCount() - 1))
-        
+            current != self.logTree.topLevelItem(self.logTree.topLevelItemCount() - 1)
+        )
+
         # Highlight the current entry using a bold font
         for col in range(self.logTree.columnCount()):
             current and current.setFont(col, self.__logTreeBoldFont)
             previous and previous.setFont(col, self.__logTreeNormalFont)
-        
+
         # set the state of the up and down buttons
         self.upButton.setEnabled(
-            current is not None and
-            self.logTree.indexOfTopLevelItem(current) > 0)
-        self.downButton.setEnabled(
-            current is not None and
-            int(current.text(0)) > 1)
-    
+            current is not None and self.logTree.indexOfTopLevelItem(current) > 0
+        )
+        self.downButton.setEnabled(current is not None and int(current.text(0)) > 1)
+
     @pyqtSlot()
     def on_logTree_itemSelectionChanged(self):
         """
         Private slot called, when the selection has changed.
         """
-        self.diffRevisionsButton.setEnabled(
-            len(self.logTree.selectedItems()) == 2)
-    
+        self.diffRevisionsButton.setEnabled(len(self.logTree.selectedItems()) == 2)
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
@@ -592,7 +591,7 @@
         """
         if self.__lastRev > 1:
             self.__getLogEntries(self.__lastRev - 1)
-    
+
     @pyqtSlot()
     def on_diffPreviousButton_clicked(self):
         """
@@ -603,16 +602,15 @@
             self.diffPreviousButton.setEnabled(False)
             return
         rev2 = int(itm.text(0))
-        
-        itm = self.logTree.topLevelItem(
-            self.logTree.indexOfTopLevelItem(itm) + 1)
+
+        itm = self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) + 1)
         if itm is None:
             self.diffPreviousButton.setEnabled(False)
             return
         rev1 = int(itm.text(0))
-        
+
         self.__diffRevisions(rev1, rev2)
-    
+
     @pyqtSlot()
     def on_diffRevisionsButton_clicked(self):
         """
@@ -622,49 +620,49 @@
         if len(items) != 2:
             self.diffRevisionsButton.setEnabled(False)
             return
-        
+
         rev2 = int(items[0].text(0))
         rev1 = int(items[1].text(0))
-        
+
         self.__diffRevisions(min(rev1, rev2), max(rev1, rev2))
-    
+
     @pyqtSlot(QDate)
     def on_fromDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(QDate)
     def on_toDate_dateChanged(self, date):
         """
         Private slot called, when the from date changes.
-        
+
         @param date new date (QDate)
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(int)
     def on_fieldCombo_activated(self, index):
         """
         Private slot called, when a new filter field is selected.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__filterLogs()
-    
+
     @pyqtSlot(str)
     def on_rxEdit_textChanged(self, txt):
         """
         Private slot called, when a filter expression is entered.
-        
+
         @param txt filter expression (string)
         """
         self.__filterLogs()
-    
+
     def __filterLogs(self):
         """
         Private method to filter the log entries.
@@ -680,21 +678,20 @@
                 fieldIndex = 0
                 txt = self.rxEdit.text()
                 if txt.startswith("^"):
-                    searchRx = re.compile(
-                        r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
+                    searchRx = re.compile(r"^\s*{0}".format(txt[1:]), re.IGNORECASE)
                 else:
                     searchRx = re.compile(txt, re.IGNORECASE)
             else:
                 fieldIndex = 3
                 searchRx = re.compile(self.rxEdit.text(), re.IGNORECASE)
-            
+
             currentItem = self.logTree.currentItem()
             for topIndex in range(self.logTree.topLevelItemCount()):
                 topItem = self.logTree.topLevelItem(topIndex)
                 if (
-                    topItem.text(2) <= to_ and
-                    topItem.text(2) >= from_ and
-                    searchRx.match(topItem.text(fieldIndex)) is not None
+                    topItem.text(2) <= to_
+                    and topItem.text(2) >= from_
+                    and searchRx.match(topItem.text(fieldIndex)) is not None
                 ):
                     topItem.setHidden(False)
                     if topItem is currentItem:
@@ -704,19 +701,20 @@
                     if topItem is currentItem:
                         self.messageEdit.clear()
                         self.filesTree.clear()
-    
+
     @pyqtSlot(bool)
     def on_stopCheckBox_clicked(self, checked):
         """
         Private slot called, when the stop on copy/move checkbox is clicked.
-        
+
         @param checked flag indicating the checked state (boolean)
         """
-        self.vcs.getPlugin().setPreferences("StopLogOnCopy",
-                                            self.stopCheckBox.isChecked())
+        self.vcs.getPlugin().setPreferences(
+            "StopLogOnCopy", self.stopCheckBox.isChecked()
+        )
         self.nextButton.setEnabled(True)
         self.limitSpinBox.setEnabled(True)
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -725,7 +723,7 @@
         itm = self.logTree.itemAbove(self.logTree.currentItem())
         if itm:
             self.logTree.setCurrentItem(itm)
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -738,18 +736,18 @@
             # load the next bunch and try again
             self.__addFinishCallback(self.on_downButton_clicked)
             self.on_nextButton_clicked()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -757,7 +755,7 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
@@ -765,23 +763,23 @@
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
         self.errorGroup.show()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnMergeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnMergeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,11 +18,11 @@
     """
     Class implementing a dialog to enter the data for a merge operation.
     """
-    def __init__(self, mergelist1, mergelist2, targetlist, force=False,
-                 parent=None):
+
+    def __init__(self, mergelist1, mergelist2, targetlist, force=False, parent=None):
         """
         Constructor
-        
+
         @param mergelist1 list of previously entered URLs/revisions
             (list of strings)
         @param mergelist2 list of previously entered URLs/revisions
@@ -33,65 +33,70 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
+
         self.forceCheckBox.setChecked(force)
-        
-        self.rx_url = re.compile('(?:file:|svn:|svn+ssh:|http:|https:)//.+')
-        self.rx_rev = re.compile('\\d+')
-        
+
+        self.rx_url = re.compile("(?:file:|svn:|svn+ssh:|http:|https:)//.+")
+        self.rx_rev = re.compile("\\d+")
+
         self.tag1Combo.clear()
         self.tag1Combo.addItems(mergelist1)
         self.tag2Combo.clear()
         self.tag2Combo.addItems(mergelist2)
         self.targetCombo.clear()
         self.targetCombo.addItems(targetlist)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __enableOkButton(self):
         """
         Private method used to enable/disable the OK-button.
         """
         self.okButton.setDisabled(
-            self.tag1Combo.currentText() != "" or
-            self.tag2Combo.currentText() != "" or
-            not (
-                (bool(self.rx_url.fullmatch(self.tag1Combo.currentText())) and
-                 bool(self.rx_url.fullmatch(self.tag2Combo.currentText()))) or
-                (bool(self.rx_rev.fullmatch(self.tag1Combo.currentText())) and
-                 bool(self.rx_rev.fullmatch(self.tag2Combo.currentText())))
+            self.tag1Combo.currentText() != ""
+            or self.tag2Combo.currentText() != ""
+            or not (
+                (
+                    bool(self.rx_url.fullmatch(self.tag1Combo.currentText()))
+                    and bool(self.rx_url.fullmatch(self.tag2Combo.currentText()))
+                )
+                or (
+                    bool(self.rx_rev.fullmatch(self.tag1Combo.currentText()))
+                    and bool(self.rx_rev.fullmatch(self.tag2Combo.currentText()))
+                )
             )
         )
-        
+
     def on_tag1Combo_editTextChanged(self, text):
         """
         Private slot to handle the tag1Combo editTextChanged signal.
-        
+
         @param text text of the combo (string)
         """
         self.__enableOkButton()
-        
+
     def on_tag2Combo_editTextChanged(self, text):
         """
         Private slot to handle the tag2Combo editTextChanged signal.
-        
+
         @param text text of the combo (string)
         """
         self.__enableOkButton()
-        
+
     def getParameters(self):
         """
         Public method to retrieve the merge data.
-        
+
         @return tuple naming two tag names or two revisions, a target and
             a flag indicating a forced merge (string, string, string, boolean)
         """
-        return (self.tag1Combo.currentText(),
-                self.tag2Combo.currentText(),
-                self.targetCombo.currentText(),
-                self.forceCheckBox.isChecked())
+        return (
+            self.tag1Combo.currentText(),
+            self.tag2Combo.currentText(),
+            self.targetCombo.currentText(),
+            self.forceCheckBox.isChecked(),
+        )
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnNewProjectOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnNewProjectOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,93 +27,91 @@
     Class implementing the Options Dialog for a new project from the
     repository.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcsProjectDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.vcsUrlPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.protocolCombo.addItems(ConfigSvnProtocols)
-        
+
         self.vcs = vcs
-        
+
         hd = Utilities.toNativeSeparators(QDir.homePath())
-        hd = os.path.join(hd, 'subversionroot')
+        hd = os.path.join(hd, "subversionroot")
         self.vcsUrlPicker.setText(hd)
-        
+
         self.localPath = hd
         self.networkPath = "localhost/"
         self.localProtocol = True
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
         self.vcsProjectDirPicker.setText(self.__initPaths[0])
-        
+
         self.resize(self.width(), self.minimumSizeHint().height())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_vcsProjectDirPicker_textChanged(self, txt):
         """
         Private slot to handle a change of the project directory.
-        
+
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            Utilities.fromNativeSeparators(txt) not in self.__initPaths)
-        
+            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+        )
+
     def on_vcsUrlPicker_pickerButtonClicked(self):
         """
         Private slot to display a repository browser dialog.
         """
         from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
         dlg = SvnRepoBrowserDialog(self.vcs, mode="select", parent=self)
-        dlg.start(
-            self.protocolCombo.currentText() + self.vcsUrlPicker.text())
+        dlg.start(self.protocolCombo.currentText() + self.vcsUrlPicker.text())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             url = dlg.getSelectedUrl()
             if url:
                 protocol = url.split("://")[0]
                 path = url.split("://")[1]
                 self.protocolCombo.setCurrentIndex(
-                    self.protocolCombo.findText(protocol + "://"))
+                    self.protocolCombo.findText(protocol + "://")
+                )
                 self.vcsUrlPicker.setText(path)
-        
+
     def on_layoutCheckBox_toggled(self, checked):
         """
         Private slot to handle the change of the layout checkbox.
-        
+
         @param checked flag indicating the state of the checkbox (boolean)
         """
         self.vcsTagLabel.setEnabled(checked)
         self.vcsTagEdit.setEnabled(checked)
         if not checked:
             self.vcsTagEdit.clear()
-        
+
     @pyqtSlot(int)
     def on_protocolCombo_activated(self, index):
         """
         Private slot to switch the status of the directory selection button.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -131,29 +129,28 @@
                 self.vcsUrlLabel.setText(self.tr("&URL:"))
                 self.localProtocol = False
                 self.vcsUrlPicker.setMode(EricPathPickerModes.CUSTOM_MODE)
-    
+
     @pyqtSlot(str)
     def on_vcsUrlPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the line edit (string)
         """
         enable = "://" not in txt
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a tuple of a string (project directory) and a dictionary
             containing the data entered.
         """
         scheme = self.protocolCombo.currentText()
         url = self.vcsUrlPicker.text()
         vcsdatadict = {
-            "url": '{0}{1}'.format(scheme, url),
+            "url": "{0}{1}".format(scheme, url),
             "tag": self.vcsTagEdit.text(),
             "standardLayout": self.layoutCheckBox.isChecked(),
         }
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,59 +26,61 @@
     Class implementing a dialog to enter options used to start a project in the
     repository.
     """
+
     def __init__(self, vcs, project, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the version control object
         @param project reference to the project object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.vcsUrlPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.project = project
-        
+
         self.protocolCombo.addItems(ConfigSvnProtocols)
-        
+
         hd = Utilities.toNativeSeparators(QDir.homePath())
-        hd = os.path.join(hd, 'subversionroot')
+        hd = os.path.join(hd, "subversionroot")
         self.vcsUrlPicker.setText(hd)
-        
+
         self.vcs = vcs
-        
+
         self.localPath = hd
         self.networkPath = "localhost/"
         self.localProtocol = True
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot()
     def on_vcsUrlPicker_pickerButtonClicked(self):
         """
         Private slot to display a repository browser dialog.
         """
         from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
         dlg = SvnRepoBrowserDialog(self.vcs, mode="select", parent=self)
-        dlg.start(
-            self.protocolCombo.currentText() + self.vcsUrlPicker.text())
+        dlg.start(self.protocolCombo.currentText() + self.vcsUrlPicker.text())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             url = dlg.getSelectedUrl()
             if url:
                 protocol = url.split("://")[0]
                 path = url.split("://")[1]
                 self.protocolCombo.setCurrentIndex(
-                    self.protocolCombo.findText(protocol + "://"))
+                    self.protocolCombo.findText(protocol + "://")
+                )
                 self.vcsUrlPicker.setText(path)
-        
+
     @pyqtSlot(int)
     def on_protocolCombo_activated(self, index):
         """
         Private slot to switch the status of the directory selection button.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -94,28 +96,27 @@
                 self.vcsUrlPicker.setText(self.networkPath)
                 self.vcsUrlLabel.setText(self.tr("&URL:"))
                 self.localProtocol = False
-    
+
     @pyqtSlot(str)
     def on_vcsUrlPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the URL.
-        
+
         @param txt current text of the line edit (string)
         """
         enable = "://" not in txt
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     def getData(self):
         """
         Public slot to retrieve the data entered into the dialog.
-        
+
         @return a dictionary containing the data entered
         """
         scheme = self.protocolCombo.currentText()
         url = self.vcsUrlPicker.text()
         vcsdatadict = {
-            "url": '{0}{1}'.format(scheme, url),
+            "url": "{0}{1}".format(scheme, url),
             "message": self.vcsLogEdit.text(),
             "standardLayout": self.layoutCheckBox.isChecked(),
         }
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 import re
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QProcess, QProcessEnvironment
-from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QDialogButtonBox, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QWidget, QHeaderView, QDialogButtonBox, QTreeWidgetItem
 
 from EricWidgets import EricMessageBox
 
@@ -27,244 +25,234 @@
     Class implementing a dialog to show the output of the svn proplist command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.refreshButton.setToolTip(
-            self.tr("Press to refresh the properties display"))
+            self.tr("Press to refresh the properties display")
+        )
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.process = QProcess()
         env = QProcessEnvironment.systemEnvironment()
         env.insert("LANG", "C")
         self.process.setProcessEnvironment(env)
         self.vcs = vcs
-        
+
         self.propsList.headerItem().setText(self.propsList.columnCount(), "")
-        self.propsList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+        self.propsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.rx_path = re.compile(r"Properties on '([^']+)':\s*")
         self.rx_prop = re.compile(r"  (.*) *: *(.*)[\r\n]")
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.propsList.sortItems(
-            self.propsList.sortColumn(),
-            self.propsList.header().sortIndicatorOrder())
-        
+            self.propsList.sortColumn(), self.propsList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.propsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.propsList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.propsList.header().setStretchLastSection(True)
-        
+
     def __generateItem(self, path, propName, propValue):
         """
         Private method to generate a properties item in the properties list.
-        
+
         @param path file/directory name the property applies to (string)
         @param propName name of the property (string)
         @param propValue value of the property (string)
         """
         QTreeWidgetItem(self.propsList, [path, propName, propValue.strip()])
-        
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def start(self, fn, recursive=False):
         """
         Public slot to start the svn status command.
-        
+
         @param fn filename(s) (string or list of string)
         @param recursive flag indicating a recursive list is requested
         """
         self.errorGroup.hide()
-        
+
         self.propsList.clear()
         self.lastPath = None
         self.lastProp = None
         self.propBuffer = ""
-        
+
         self.__args = fn
         self.__recursive = recursive
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         self.refreshButton.setEnabled(False)
-        
+
         self.process.kill()
-        
+
         args = []
-        args.append('proplist')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        args.append('--verbose')
+        args.append("proplist")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        args.append("--verbose")
         if recursive:
-            args.append('--recursive')
+            args.append("--recursive")
         if isinstance(fn, list):
             dname, fnames = self.vcs.splitPathList(fn)
             self.vcs.addArguments(args, fnames)
         else:
             dname, fname = self.vcs.splitPath(fn)
             args.append(fname)
-        
+
         self.process.setWorkingDirectory(dname)
-        
-        self.process.start('svn', args)
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
-        
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         self.refreshButton.setEnabled(True)
-        
+
         if self.lastProp:
             self.__generateItem(self.lastPath, self.lastProp, self.propBuffer)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-        
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.__args, recursive=self.__recursive)
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         if self.lastPath is None:
-            self.__generateItem('', 'None', '')
-        
+            self.__generateItem("", "None", "")
+
         self.__finish()
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             match = self.rx_path.fullmatch(s) or self.rx_prop.fullmatch(s)
             if match is None:
-                self.propBuffer += ' '
+                self.propBuffer += " "
                 self.propBuffer += s
             elif match.re is self.rx_path:
                 if self.lastProp:
-                    self.__generateItem(
-                        self.lastPath, self.lastProp, self.propBuffer)
+                    self.__generateItem(self.lastPath, self.lastProp, self.propBuffer)
                 self.lastPath = match.group(1)
                 self.lastProp = None
                 self.propBuffer = ""
             elif match.re is self.rx_prop:
                 if self.lastProp:
-                    self.__generateItem(
-                        self.lastPath, self.lastProp, self.propBuffer)
+                    self.__generateItem(self.lastPath, self.lastProp, self.propBuffer)
                 self.lastProp = match.group(1)
                 self.propBuffer = match.group(2)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropSetDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnPropSetDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,21 +18,22 @@
     """
     Class implementing a dialog to enter the data for a new property.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.propFilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
     def getData(self):
         """
         Public slot used to retrieve the data entered into the dialog.
-        
+
         @return tuple of three values giving the property name, a flag
             indicating a file was selected and the text of the property
             or the selected filename. (string, boolean, string)
@@ -40,5 +41,4 @@
         if self.fileRadioButton.isChecked():
             return (self.propNameEdit.text(), True, self.propFilePicker.text())
         else:
-            return (self.propNameEdit.text(), False,
-                    self.propTextEdit.toPlainText())
+            return (self.propNameEdit.text(), False, self.propTextEdit.toPlainText())
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRelocateDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRelocateDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,26 +16,27 @@
     """
     Class implementing a dialog to enter the data to relocate the workspace.
     """
+
     def __init__(self, currUrl, parent=None):
         """
         Constructor
-        
+
         @param currUrl current repository URL (string)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.currUrlLabel.setText(currUrl)
         self.newUrlEdit.setText(currUrl)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getData(self):
         """
         Public slot used to retrieve the data entered into the dialog.
-        
+
         @return the new repository URL (string) and an indication, if
             the relocate is inside the repository (boolean)
         """
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRepoBrowserDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRepoBrowserDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QProcess
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QDialog, QDialogButtonBox, QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -30,10 +34,11 @@
     """
     Class implementing the subversion repository browser dialog.
     """
+
     def __init__(self, vcs, mode="browse", parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param mode mode of the dialog (string, "browse" or "select")
         @param parent parent widget (QWidget)
@@ -41,78 +46,76 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.repoTree.headerItem().setText(self.repoTree.columnCount(), "")
         self.repoTree.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.vcs = vcs
         self.mode = mode
-        
+
         self.__process = EricOverrideCursorProcess()
         self.__process.finished.connect(self.__procFinished)
         self.__process.readyReadStandardOutput.connect(self.__readStdout)
         self.__process.readyReadStandardError.connect(self.__readStderr)
-        
+
         if self.mode == "select":
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
             self.buttonBox.button(QDialogButtonBox.StandardButton.Close).hide()
         else:
             self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).hide()
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).hide()
-        
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).hide()
+
         self.__dirIcon = UI.PixmapCache.getIcon("dirClosed")
         self.__fileIcon = UI.PixmapCache.getIcon("fileMisc")
-        
+
         self.__urlRole = Qt.ItemDataRole.UserRole
         self.__ignoreExpand = False
         self.intercept = False
-        
+
         self.__rx_dir = re.compile(
             r"""\s*([0-9]+)\s+(\w+)\s+"""
-            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)\s*""")
+            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)\s*"""
+        )
         self.__rx_file = re.compile(
             r"""\s*([0-9]+)\s+(\w+)\s+([0-9]+)\s"""
-            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)\s*""")
-    
+            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)\s*"""
+        )
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.repoTree.sortItems(
-            self.repoTree.sortColumn(),
-            self.repoTree.header().sortIndicatorOrder())
-    
+            self.repoTree.sortColumn(), self.repoTree.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the tree columns.
         """
-        self.repoTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.repoTree.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.repoTree.header().setStretchLastSection(True)
-    
-    def __generateItem(self, repopath, revision, author, size, date,
-                       nodekind, url):
+
+    def __generateItem(self, repopath, revision, author, size, date, nodekind, url):
         """
         Private method to generate a tree item in the repository tree.
-        
+
         @param repopath path of the item (string)
         @param revision revision info (string)
         @param author author info (string)
@@ -124,133 +127,131 @@
         """
         rev = "" if revision == "" else int(revision)
         sz = "" if size == "" else int(size)
-        
+
         itm = QTreeWidgetItem(self.parentItem)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, repopath)
         itm.setData(1, Qt.ItemDataRole.DisplayRole, rev)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(3, Qt.ItemDataRole.DisplayRole, sz)
         itm.setData(4, Qt.ItemDataRole.DisplayRole, date)
-        
+
         if nodekind == "dir":
             itm.setIcon(0, self.__dirIcon)
             itm.setChildIndicatorPolicy(
-                QTreeWidgetItem.ChildIndicatorPolicy.ShowIndicator)
+                QTreeWidgetItem.ChildIndicatorPolicy.ShowIndicator
+            )
         elif nodekind == "file":
             itm.setIcon(0, self.__fileIcon)
-        
+
         itm.setData(0, self.__urlRole, url)
-        
+
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(4, Qt.AlignmentFlag.AlignLeft)
-        
+
         return itm
-    
+
     def __repoRoot(self, url):
         """
         Private method to get the repository root using the svn info command.
-        
+
         @param url the repository URL to browser (string)
         @return repository root (string)
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
         repoRoot = None
-        
+
         process = QProcess()
-        
+
         args = []
-        args.append('info')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        args.append('--xml')
+        args.append("info")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        args.append("--xml")
         args.append(url)
-        
-        process.start('svn', args)
+
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished:
                 if process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(), ioEncoding,
-                                 'replace')
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                     for line in output.splitlines():
                         line = line.strip()
-                        if line.startswith('<root>'):
-                            repoRoot = (
-                                line.replace('<root>', '')
-                                .replace('</root>', '')
-                            )
+                        if line.startswith("<root>"):
+                            repoRoot = line.replace("<root>", "").replace("</root>", "")
                             break
                 else:
-                    error = str(process.readAllStandardError(),
-                                Preferences.getSystem("IOEncoding"),
-                                'replace')
+                    error = str(
+                        process.readAllStandardError(),
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    )
                     self.errors.insertPlainText(error)
                     self.errors.ensureCursorVisible()
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         return repoRoot
-    
+
     def __listRepo(self, url, parent=None):
         """
         Private method to perform the svn list command.
-        
+
         @param url the repository URL to browse (string)
         @param parent reference to the item, the data should be appended to
             (QTreeWidget or QTreeWidgetItem)
         """
         self.errorGroup.hide()
-        
+
         self.repoUrl = url
-        
+
         if parent is None:
             self.parentItem = self.repoTree
         else:
             self.parentItem = parent
-        
+
         if self.parentItem == self.repoTree:
             repoRoot = self.__repoRoot(url)
             if repoRoot is None:
                 self.__finish()
                 return
             self.__ignoreExpand = True
-            itm = self.__generateItem(
-                repoRoot, "", "", "", "", "dir", repoRoot)
+            itm = self.__generateItem(repoRoot, "", "", "", "", "dir", repoRoot)
             itm.setExpanded(True)
             self.parentItem = itm
             urlPart = repoRoot
             for element in url.replace(repoRoot, "").split("/"):
                 if element:
                     urlPart = "{0}/{1}".format(urlPart, element)
-                    itm = self.__generateItem(
-                        element, "", "", "", "", "dir", urlPart)
+                    itm = self.__generateItem(element, "", "", "", "", "dir", urlPart)
                     itm.setExpanded(True)
                     self.parentItem = itm
             itm.setExpanded(False)
             self.__ignoreExpand = False
             self.__finish()
             return
-        
+
         self.intercept = False
-        
+
         self.__process.kill()
-        
+
         args = []
-        args.append('list')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        if '--verbose' not in self.vcs.options['global']:
-            args.append('--verbose')
+        args.append("list")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        if "--verbose" not in self.vcs.options["global"]:
+            args.append("--verbose")
         args.append(url)
-        
-        self.__process.start('svn', args)
+
+        self.__process.start("svn", args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.__finish()
@@ -258,45 +259,46 @@
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-    
+
     def __normalizeUrl(self, url):
         """
         Private method to normalite the url.
-        
+
         @param url the url to normalize (string)
         @return normalized URL (string)
         """
         if url.endswith("/"):
             return url[:-1]
         return url
-    
+
     def start(self, url):
         """
         Public slot to start the svn info command.
-        
+
         @param url the repository URL to browser (string)
         """
         self.repoTree.clear()
-        
+
         self.url = ""
-        
+
         url = self.__normalizeUrl(url)
         if self.urlCombo.findText(url) == -1:
             self.urlCombo.addItem(url)
-    
+
     @pyqtSlot(int)
     def on_urlCombo_currentIndexChanged(self, index):
         """
         Private slot called, when a new repository URL is entered or selected.
-        
+
         @param index index of the current item
         @type int
         """
@@ -306,50 +308,49 @@
             self.url = url
             self.repoTree.clear()
             self.__listRepo(url)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_repoTree_itemExpanded(self, item):
         """
         Private slot called when an item is expanded.
-        
+
         @param item reference to the item to be expanded (QTreeWidgetItem)
         """
         if not self.__ignoreExpand:
             url = item.data(0, self.__urlRole)
             self.__listRepo(url, item)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_repoTree_itemCollapsed(self, item):
         """
         Private slot called when an item is collapsed.
-        
+
         @param item reference to the item to be collapsed (QTreeWidgetItem)
         """
         for child in item.takeChildren():
             del child
-    
+
     @pyqtSlot()
     def on_repoTree_itemSelectionChanged(self):
         """
         Private slot called when the selection changes.
         """
         if self.mode == "select":
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(True)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(True)
+
     def accept(self):
         """
         Public slot called when the dialog is accepted.
         """
         if self.focusWidget() == self.urlCombo:
             return
-        
+
         super().accept()
-    
+
     def getSelectedUrl(self):
         """
         Public method to retrieve the selected repository URL.
-        
+
         @return the selected repository URL (string)
         """
         items = self.repoTree.selectedItems()
@@ -357,54 +358,52 @@
             return items[0].data(0, self.__urlRole)
         else:
             return ""
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.__resizeColumns()
         self.__resort()
-    
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.__process is not None:
-            self.__process.setReadChannel(
-                QProcess.ProcessChannel.StandardOutput)
-            
+            self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
+
             while self.__process.canReadLine():
-                s = str(self.__process.readLine(),
-                        Preferences.getSystem("IOEncoding"),
-                        'replace')
-                match = (
-                    self.__rx_dir.fullmatch(s) or
-                    self.__rx_file.fullmatch(s)
+                s = str(
+                    self.__process.readLine(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
                 )
+                match = self.__rx_dir.fullmatch(s) or self.__rx_file.fullmatch(s)
                 if match is None:
                     continue
                 elif match.re is self.__rx_dir:
@@ -425,37 +424,38 @@
                     date = match.group(4)
                     name = match.group(5).strip()
                     nodekind = "file"
-                
+
                 url = "{0}/{1}".format(self.repoUrl, name)
-                self.__generateItem(
-                    name, revision, author, size, date, nodekind, url)
-   
+                self.__generateItem(name, revision, author, size, date, nodekind, url)
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.__process is not None:
-            s = str(self.__process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
             self.errorGroup.show()
-    
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -463,30 +463,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.__process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-    
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRevisionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnRevisionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,25 +18,26 @@
     Class implementing a dialog to enter the revisions for the svn diff
     command.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of the dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.date1Edit.setDate(QDate.currentDate())
         self.date2Edit.setDate(QDate.currentDate())
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __getRevision(self, no):
         """
         Private method to generate the revision.
-        
+
         @param no revision number to generate (1 or 2)
         @return revision (integer or string)
         """
@@ -62,13 +63,15 @@
             baseButton = self.base2Button
             committedButton = self.committed2Button
             prevButton = self.prev2Button
-        
+
         if numberButton.isChecked():
             return numberSpinBox.value()
         elif dateButton.isChecked():
             return "{{{0}}}".format(
-                QDateTime(dateEdit.date(), timeEdit.time())
-                .toString(Qt.DateFormat.ISODate))
+                QDateTime(dateEdit.date(), timeEdit.time()).toString(
+                    Qt.DateFormat.ISODate
+                )
+            )
         elif headButton.isChecked():
             return "HEAD"
         elif workingButton.isChecked():
@@ -79,16 +82,16 @@
             return "COMMITTED"
         elif prevButton.isChecked():
             return "PREV"
-        
+
         return ""
-        
+
     def getRevisions(self):
         """
         Public method to get the revisions.
-        
+
         @return list two integers or strings
         """
         rev1 = self.__getRevision(1)
         rev2 = self.__getRevision(2)
-        
+
         return [rev1, rev2]
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QProcess
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QLineEdit, QApplication, QMenu, QDialogButtonBox,
-    QTreeWidgetItem
+    QWidget,
+    QHeaderView,
+    QLineEdit,
+    QApplication,
+    QMenu,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -31,16 +36,17 @@
     Class implementing a dialog to show the output of the svn status command
     process.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__toBeCommittedColumn = 0
         self.__changelistColumn = 1
         self.__statusColumn = 2
@@ -52,185 +58,215 @@
         self.__upToDateColumn = 8
         self.__pathColumn = 12
         self.__lastColumn = self.statusList.columnCount()
-        
+
         self.refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.refreshButton.setToolTip(
-            self.tr("Press to refresh the status display"))
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.refreshButton.setToolTip(self.tr("Press to refresh the status display"))
         self.refreshButton.setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.diff = None
         self.vcs = vcs
         self.vcs.committed.connect(self.__committed)
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.statusList.headerItem().setText(self.__lastColumn, "")
-        self.statusList.header().setSortIndicator(self.__pathColumn,
-                                                  Qt.SortOrder.AscendingOrder)
+        self.statusList.header().setSortIndicator(
+            self.__pathColumn, Qt.SortOrder.AscendingOrder
+        )
         if self.vcs.version < (1, 5, 0):
             self.statusList.header().hideSection(self.__changelistColumn)
-        
+
         self.menuactions = []
         self.menu = QMenu()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Commit changes to repository..."), self.__commit))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Deselect all from commit"), self.__commitDeselectAll))
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Commit changes to repository..."), self.__commit
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Select all for commit"), self.__commitSelectAll
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Deselect all from commit"), self.__commitDeselectAll
+            )
+        )
         self.menu.addSeparator()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Add to repository"), self.__add))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Show differences"), self.__diff))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Show differences side-by-side"), self.__sbsDiff))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Revert changes"), self.__revert))
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Restore missing"), self.__restoreMissing))
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Add to repository"), self.__add)
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Show differences"), self.__diff)
+        )
+        self.menuactions.append(
+            self.menu.addAction(
+                self.tr("Show differences side-by-side"), self.__sbsDiff
+            )
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Revert changes"), self.__revert)
+        )
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Restore missing"), self.__restoreMissing)
+        )
         if self.vcs.version >= (1, 5, 0):
             self.menu.addSeparator()
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Add to Changelist"), self.__addToChangelist))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Remove from Changelist"),
-                self.__removeFromChangelist))
+            self.menuactions.append(
+                self.menu.addAction(
+                    self.tr("Add to Changelist"), self.__addToChangelist
+                )
+            )
+            self.menuactions.append(
+                self.menu.addAction(
+                    self.tr("Remove from Changelist"), self.__removeFromChangelist
+                )
+            )
         if self.vcs.version >= (1, 2, 0):
             self.menu.addSeparator()
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Lock"), self.__lock))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Unlock"), self.__unlock))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Break lock"),
-                self.__breakLock))
-            self.menuactions.append(self.menu.addAction(
-                self.tr("Steal lock"),
-                self.__stealLock))
+            self.menuactions.append(self.menu.addAction(self.tr("Lock"), self.__lock))
+            self.menuactions.append(
+                self.menu.addAction(self.tr("Unlock"), self.__unlock)
+            )
+            self.menuactions.append(
+                self.menu.addAction(self.tr("Break lock"), self.__breakLock)
+            )
+            self.menuactions.append(
+                self.menu.addAction(self.tr("Steal lock"), self.__stealLock)
+            )
         self.menu.addSeparator()
-        self.menuactions.append(self.menu.addAction(
-            self.tr("Adjust column sizes"),
-            self.__resizeColumns))
+        self.menuactions.append(
+            self.menu.addAction(self.tr("Adjust column sizes"), self.__resizeColumns)
+        )
         for act in self.menuactions:
             act.setEnabled(False)
-        
-        self.statusList.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.statusList.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        
+
+        self.statusList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.statusList.customContextMenuRequested.connect(self.__showContextMenu)
+
         self.modifiedIndicators = [
-            self.tr('added'),
-            self.tr('deleted'),
-            self.tr('modified'),
+            self.tr("added"),
+            self.tr("deleted"),
+            self.tr("modified"),
         ]
-        
+
         self.missingIndicators = [
-            self.tr('missing'),
+            self.tr("missing"),
         ]
-        
+
         self.unversionedIndicators = [
-            self.tr('unversioned'),
+            self.tr("unversioned"),
         ]
-        
+
         self.lockedIndicators = [
-            self.tr('locked'),
+            self.tr("locked"),
         ]
-        
+
         self.stealBreakLockIndicators = [
-            self.tr('other lock'),
-            self.tr('stolen lock'),
-            self.tr('broken lock'),
+            self.tr("other lock"),
+            self.tr("stolen lock"),
+            self.tr("broken lock"),
         ]
-        
+
         self.unlockedIndicators = [
-            self.tr('not locked'),
+            self.tr("not locked"),
         ]
-        
+
         self.status = {
-            ' ': self.tr('normal'),
-            'A': self.tr('added'),
-            'C': self.tr('conflict'),
-            'D': self.tr('deleted'),
-            'I': self.tr('ignored'),
-            'M': self.tr('modified'),
-            'R': self.tr('replaced'),
-            'X': self.tr('external'),
-            '?': self.tr('unversioned'),
-            '!': self.tr('missing'),
-            '~': self.tr('type error'),
+            " ": self.tr("normal"),
+            "A": self.tr("added"),
+            "C": self.tr("conflict"),
+            "D": self.tr("deleted"),
+            "I": self.tr("ignored"),
+            "M": self.tr("modified"),
+            "R": self.tr("replaced"),
+            "X": self.tr("external"),
+            "?": self.tr("unversioned"),
+            "!": self.tr("missing"),
+            "~": self.tr("type error"),
         }
         self.propStatus = {
-            ' ': self.tr('normal'),
-            'M': self.tr('modified'),
-            'C': self.tr('conflict'),
+            " ": self.tr("normal"),
+            "M": self.tr("modified"),
+            "C": self.tr("conflict"),
         }
         self.locked = {
-            ' ': self.tr('no'),
-            'L': self.tr('yes'),
+            " ": self.tr("no"),
+            "L": self.tr("yes"),
         }
         self.history = {
-            ' ': self.tr('no'),
-            '+': self.tr('yes'),
+            " ": self.tr("no"),
+            "+": self.tr("yes"),
         }
         self.switched = {
-            ' ': self.tr('no'),
-            'S': self.tr('yes'),
-            'X': self.tr('external')
+            " ": self.tr("no"),
+            "S": self.tr("yes"),
+            "X": self.tr("external"),
         }
         self.lockinfo = {
-            ' ': self.tr('not locked'),
-            'K': self.tr('locked'),
-            'O': self.tr('other lock'),
-            'T': self.tr('stolen lock'),
-            'B': self.tr('broken lock'),
+            " ": self.tr("not locked"),
+            "K": self.tr("locked"),
+            "O": self.tr("other lock"),
+            "T": self.tr("stolen lock"),
+            "B": self.tr("broken lock"),
         }
         self.uptodate = {
-            ' ': self.tr('yes'),
-            '*': self.tr('no'),
+            " ": self.tr("yes"),
+            "*": self.tr("no"),
         }
-        
+
         self.rx_status = re.compile(
-            '(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*')
+            "(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*"
+        )
         # flags (8 or 9 anything), revision, changed rev, author, path
-        self.rx_status2 = re.compile('(.{8,9})\\s+(.+)\\s*')
+        self.rx_status2 = re.compile("(.{8,9})\\s+(.+)\\s*")
         # flags (8 or 9 anything), path
-        self.rx_changelist = re.compile('--- \\S+ .([\\w\\s]+).:\\s+')
+        self.rx_changelist = re.compile("--- \\S+ .([\\w\\s]+).:\\s+")
         # three dashes, Changelist (translated), quote,
         # changelist name, quote, :
-        
+
         self.__nonverbose = True
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.statusList.sortItems(
-            self.statusList.sortColumn(),
-            self.statusList.header().sortIndicatorOrder())
-        
+            self.statusList.sortColumn(), self.statusList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.statusList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.statusList.header().setStretchLastSection(True)
-        
-    def __generateItem(self, status, propStatus, locked, history, switched,
-                       lockinfo, uptodate, revision, change, author, path):
+
+    def __generateItem(
+        self,
+        status,
+        propStatus,
+        locked,
+        history,
+        switched,
+        lockinfo,
+        uptodate,
+        revision,
+        change,
+        author,
+        path,
+    ):
         """
         Private method to generate a status item in the status list.
-        
+
         @param status status indicator (string)
         @param propStatus property status indicator (string)
         @param locked locked indicator (string)
@@ -244,18 +280,18 @@
         @param path path of the file or directory (string)
         """
         if (
-            self.__nonverbose and
-            status == " " and
-            propStatus == " " and
-            locked == " " and
-            history == " " and
-            switched == " " and
-            lockinfo == " " and
-            uptodate == " " and
-            self.currentChangelist == ""
+            self.__nonverbose
+            and status == " "
+            and propStatus == " "
+            and locked == " "
+            and history == " "
+            and switched == " "
+            and lockinfo == " "
+            and uptodate == " "
+            and self.currentChangelist == ""
         ):
             return
-        
+
         if revision == "":
             rev = ""
         else:
@@ -271,13 +307,12 @@
             except ValueError:
                 chg = change
         statusText = self.status[status]
-        
+
         itm = QTreeWidgetItem(self.statusList)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, "")
         itm.setData(1, Qt.ItemDataRole.DisplayRole, self.currentChangelist)
         itm.setData(2, Qt.ItemDataRole.DisplayRole, statusText)
-        itm.setData(3, Qt.ItemDataRole.DisplayRole,
-                    self.propStatus[propStatus])
+        itm.setData(3, Qt.ItemDataRole.DisplayRole, self.propStatus[propStatus])
         itm.setData(4, Qt.ItemDataRole.DisplayRole, self.locked[locked])
         itm.setData(5, Qt.ItemDataRole.DisplayRole, self.history[history])
         itm.setData(6, Qt.ItemDataRole.DisplayRole, self.switched[switched])
@@ -287,7 +322,7 @@
         itm.setData(10, Qt.ItemDataRole.DisplayRole, chg)
         itm.setData(11, Qt.ItemDataRole.DisplayRole, author)
         itm.setData(12, Qt.ItemDataRole.DisplayRole, path)
-        
+
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
         itm.setTextAlignment(3, Qt.AlignmentFlag.AlignHCenter)
@@ -300,97 +335,93 @@
         itm.setTextAlignment(10, Qt.AlignmentFlag.AlignRight)
         itm.setTextAlignment(11, Qt.AlignmentFlag.AlignLeft)
         itm.setTextAlignment(12, Qt.AlignmentFlag.AlignLeft)
-        
+
         if status in "ADM" or propStatus in "M":
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
-            itm.setCheckState(self.__toBeCommittedColumn,
-                              Qt.CheckState.Checked)
+            itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
         else:
             itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
-        
+
         self.hidePropertyStatusColumn = (
-            self.hidePropertyStatusColumn and
-            propStatus == " "
+            self.hidePropertyStatusColumn and propStatus == " "
         )
         self.hideLockColumns = (
-            self.hideLockColumns and
-            locked == " " and
-            lockinfo == " "
+            self.hideLockColumns and locked == " " and lockinfo == " "
         )
         self.hideUpToDateColumn = self.hideUpToDateColumn and uptodate == " "
         self.hideHistoryColumn = self.hideHistoryColumn and history == " "
         self.hideSwitchedColumn = self.hideSwitchedColumn and switched == " "
-        
+
         if statusText not in self.__statusFilters:
             self.__statusFilters.append(statusText)
-        
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def start(self, fn):
         """
         Public slot to start the svn status command.
-        
+
         @param fn filename(s)/directoryname(s) to show the status of
             (string or list of strings)
         """
         self.errorGroup.hide()
         self.intercept = False
         self.args = fn
-        
+
         for act in self.menuactions:
             act.setEnabled(False)
-        
+
         self.addButton.setEnabled(False)
         self.commitButton.setEnabled(False)
         self.diffButton.setEnabled(False)
         self.sbsDiffButton.setEnabled(False)
         self.revertButton.setEnabled(False)
         self.restoreButton.setEnabled(False)
-        
+
         self.statusFilterCombo.clear()
         self.__statusFilters = []
         self.statusList.clear()
-        
+
         self.currentChangelist = ""
         self.changelistFound = False
-        
+
         self.hidePropertyStatusColumn = True
         self.hideLockColumns = True
         self.hideUpToDateColumn = True
         self.hideHistoryColumn = True
         self.hideSwitchedColumn = True
-        
+
         self.process.kill()
-        
+
         args = []
-        args.append('status')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        self.vcs.addArguments(args, self.vcs.options['status'])
+        args.append("status")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        self.vcs.addArguments(args, self.vcs.options["status"])
         if (
-            '--verbose' not in self.vcs.options['global'] and
-            '--verbose' not in self.vcs.options['status']
+            "--verbose" not in self.vcs.options["global"]
+            and "--verbose" not in self.vcs.options["status"]
         ):
-            args.append('--verbose')
+            args.append("--verbose")
             self.__nonverbose = True
         else:
             self.__nonverbose = False
         if (
-            '--show-updates' in self.vcs.options['status'] or
-            '-u' in self.vcs.options['status']
+            "--show-updates" in self.vcs.options["status"]
+            or "-u" in self.vcs.options["status"]
         ):
             self.activateWindow()
             self.raise_()
@@ -400,134 +431,130 @@
         else:
             self.dname, fname = self.vcs.splitPath(fn)
             args.append(fname)
-        
+
         self.process.setWorkingDirectory(self.dname)
-        
-        self.setWindowTitle(self.tr('Subversion Status'))
-        
-        self.process.start('svn', args)
+
+        self.setWindowTitle(self.tr("Subversion Status"))
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Close).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-            
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(
+                True
+            )
+
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
             self.refreshButton.setEnabled(False)
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         self.refreshButton.setEnabled(True)
-        
+
         self.__statusFilters.sort()
         self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
-        
+
         for act in self.menuactions:
             act.setEnabled(True)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
-        self.statusList.setColumnHidden(self.__changelistColumn,
-                                        not self.changelistFound)
-        self.statusList.setColumnHidden(self.__propStatusColumn,
-                                        self.hidePropertyStatusColumn)
-        self.statusList.setColumnHidden(self.__lockedColumn,
-                                        self.hideLockColumns)
-        self.statusList.setColumnHidden(self.__lockinfoColumn,
-                                        self.hideLockColumns)
-        self.statusList.setColumnHidden(self.__upToDateColumn,
-                                        self.hideUpToDateColumn)
-        self.statusList.setColumnHidden(self.__historyColumn,
-                                        self.hideHistoryColumn)
-        self.statusList.setColumnHidden(self.__switchedColumn,
-                                        self.hideSwitchedColumn)
-        
+
+        self.statusList.setColumnHidden(
+            self.__changelistColumn, not self.changelistFound
+        )
+        self.statusList.setColumnHidden(
+            self.__propStatusColumn, self.hidePropertyStatusColumn
+        )
+        self.statusList.setColumnHidden(self.__lockedColumn, self.hideLockColumns)
+        self.statusList.setColumnHidden(self.__lockinfoColumn, self.hideLockColumns)
+        self.statusList.setColumnHidden(self.__upToDateColumn, self.hideUpToDateColumn)
+        self.statusList.setColumnHidden(self.__historyColumn, self.hideHistoryColumn)
+        self.statusList.setColumnHidden(self.__switchedColumn, self.hideSwitchedColumn)
+
         self.__updateButtons()
         self.__updateCommitButton()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         if self.process is not None:
             self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-            
+
             while self.process.canReadLine():
-                s = str(self.process.readLine(),
-                        Preferences.getSystem("IOEncoding"),
-                        'replace')
+                s = str(
+                    self.process.readLine(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
                 match = (
-                    self.rx_status.fullmatch(s) or
-                    self.rx_status2.fullmatch(s) or
-                    self.rx_changelist.fullmatch(s)
+                    self.rx_status.fullmatch(s)
+                    or self.rx_status2.fullmatch(s)
+                    or self.rx_changelist.fullmatch(s)
                 )
                 if match.re is self.rx_status:
                     flags = match.group(1)
@@ -535,48 +562,70 @@
                     change = match.group(3)
                     author = match.group(4)
                     path = match.group(5).strip()
-                    
-                    self.__generateItem(flags[0], flags[1], flags[2], flags[3],
-                                        flags[4], flags[5], flags[-1], rev,
-                                        change, author, path)
+
+                    self.__generateItem(
+                        flags[0],
+                        flags[1],
+                        flags[2],
+                        flags[3],
+                        flags[4],
+                        flags[5],
+                        flags[-1],
+                        rev,
+                        change,
+                        author,
+                        path,
+                    )
                 elif match.re is self.rx_status2:
                     flags = match.group(1)
                     path = match.group(2).strip()
-                    
+
                     if flags[-1] in self.uptodate:
-                        self.__generateItem(flags[0], flags[1], flags[2],
-                                            flags[3], flags[4], flags[5],
-                                            flags[-1], "", "", "", path)
+                        self.__generateItem(
+                            flags[0],
+                            flags[1],
+                            flags[2],
+                            flags[3],
+                            flags[4],
+                            flags[5],
+                            flags[-1],
+                            "",
+                            "",
+                            "",
+                            path,
+                        )
                 elif match.re is self.rx_changelist:
                     self.currentChangelist = match.group(1)
                     self.changelistFound = True
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -584,30 +633,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
@@ -615,14 +664,14 @@
             evt.accept()
             return
         super().keyPressEvent(evt)
-        
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot to refresh the status display.
         """
         self.start(self.args)
-        
+
     def __updateButtons(self):
         """
         Private method to update the VCS buttons status.
@@ -636,19 +685,19 @@
         self.sbsDiffButton.setEnabled(modified == 1)
         self.revertButton.setEnabled(modified)
         self.restoreButton.setEnabled(missing)
-    
+
     def __updateCommitButton(self):
         """
         Private method to update the Commit button status.
         """
         commitable = len(self.__getCommitableItems())
         self.commitButton.setEnabled(commitable)
-    
+
     @pyqtSlot(int)
     def on_statusFilterCombo_activated(self, index):
         """
         Private slot to react to the selection of a status filter.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -661,99 +710,101 @@
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(topItem.text(self.__statusColumn) != txt)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_statusList_itemChanged(self, item, column):
         """
         Private slot to act upon item changes.
-        
+
         @param item reference to the changed item (QTreeWidgetItem)
         @param column index of column that changed (integer)
         """
         if column == self.__toBeCommittedColumn:
             self.__updateCommitButton()
-    
+
     @pyqtSlot()
     def on_statusList_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_commitButton_clicked(self):
         """
         Private slot to handle the press of the Commit button.
         """
         self.__commit()
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to handle the press of the Add button.
         """
         self.__add()
-    
+
     @pyqtSlot()
     def on_diffButton_clicked(self):
         """
         Private slot to handle the press of the Differences button.
         """
         self.__diff()
-    
+
     @pyqtSlot()
     def on_sbsDiffButton_clicked(self):
         """
         Private slot to handle the press of the Side-by-Side Diff button.
         """
         self.__sbsDiff()
-    
+
     @pyqtSlot()
     def on_revertButton_clicked(self):
         """
         Private slot to handle the press of the Revert button.
         """
         self.__revert()
-    
+
     @pyqtSlot()
     def on_restoreButton_clicked(self):
         """
         Private slot to handle the press of the Restore button.
         """
         self.__restoreMissing()
-    
+
     ###########################################################################
     ## Context menu handling methods
     ###########################################################################
-    
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the status list.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         self.menu.popup(self.statusList.mapToGlobal(coord))
-        
+
     def __commit(self):
         """
         Private slot to handle the Commit context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getCommitableItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getCommitableItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Commit"),
-                self.tr("""There are no entries selected to be"""
-                        """ committed."""))
+                self.tr("""There are no entries selected to be""" """ committed."""),
+            )
             return
-        
+
         if Preferences.getVCS("AutoSaveFiles"):
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
-        self.vcs.vcsCommit(names, '')
-       
+        self.vcs.vcsCommit(names, "")
+
     def __committed(self):
         """
         Private slot called after the commit has finished.
@@ -761,176 +812,203 @@
         if self.isVisible():
             self.on_refreshButton_clicked()
             self.vcs.checkVCSStatus()
-        
+
     def __commitSelectAll(self):
         """
         Private slot to select all entries for commit.
         """
         self.__commitSelect(True)
-    
+
     def __commitDeselectAll(self):
         """
         Private slot to deselect all entries from commit.
         """
         self.__commitSelect(False)
-    
+
     def __add(self):
         """
         Private slot to handle the Add context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getUnversionedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsAdd(names)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-        
+
     def __revert(self):
         """
         Private slot to handle the Revert context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.raise_()
         self.activateWindow()
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-        
+
     def __restoreMissing(self):
         """
         Private slot to handle the Restore Missing context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.vcsRevert(names)
         self.on_refreshButton_clicked()
         self.vcs.checkVCSStatus()
-        
+
     def __diff(self):
         """
         Private slot to handle the Diff context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         if self.diff is None:
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self.vcs)
         self.diff.show()
         QApplication.processEvents()
         self.diff.start(names, refreshable=True)
-    
+
     def __sbsDiff(self):
         """
         Private slot to handle the Side-by-Side Diff context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Side-by-Side Diff"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
         elif len(names) > 1:
             EricMessageBox.information(
                 self,
                 self.tr("Side-by-Side Diff"),
-                self.tr("""Only one file with uncommitted changes"""
-                        """ must be selected."""))
+                self.tr(
+                    """Only one file with uncommitted changes"""
+                    """ must be selected."""
+                ),
+            )
             return
-        
+
         self.vcs.vcsSbsDiff(names[0])
-    
+
     def __lock(self):
         """
         Private slot to handle the Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(self.unlockedIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.unlockedIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Lock"),
-                self.tr("""There are no unlocked files"""
-                        """ available/selected."""))
+                self.tr("""There are no unlocked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnLock(names, parent=self)
         self.on_refreshButton_clicked()
-        
+
     def __unlock(self):
         """
         Private slot to handle the Unlock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(self.lockedIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.lockedIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Unlock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnUnlock(names, parent=self)
         self.on_refreshButton_clicked()
-        
+
     def __breakLock(self):
         """
         Private slot to handle the Break Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(
-                     self.stealBreakLockIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.stealBreakLockIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Break Lock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnUnlock(names, parent=self, breakIt=True)
         self.on_refreshButton_clicked()
 
@@ -938,17 +1016,18 @@
         """
         Private slot to handle the Break Lock context menu entry.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getLockActionItems(
-                     self.stealBreakLockIndicators)]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getLockActionItems(self.stealBreakLockIndicators)
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Steal Lock"),
-                self.tr("""There are no locked files"""
-                        """ available/selected."""))
+                self.tr("""There are no locked files""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.svnLock(names, parent=self, stealIt=True)
         self.on_refreshButton_clicked()
 
@@ -956,8 +1035,10 @@
         """
         Private slot to add entries to a changelist.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getNonChangelistItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getNonChangelistItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
@@ -965,7 +1046,7 @@
                 self.tr(
                     """There are no files available/selected not """
                     """belonging to a changelist."""
-                )
+                ),
             )
             return
         self.vcs.svnAddToChangelist(names)
@@ -975,8 +1056,10 @@
         """
         Private slot to remove entries from their changelists.
         """
-        names = [os.path.join(self.dname, itm.text(self.__pathColumn))
-                 for itm in self.__getChangelistItems()]
+        names = [
+            os.path.join(self.dname, itm.text(self.__pathColumn))
+            for itm in self.__getChangelistItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
@@ -984,7 +1067,7 @@
                 self.tr(
                     """There are no files available/selected belonging"""
                     """ to a changelist."""
-                )
+                ),
             )
             return
         self.vcs.svnRemoveFromChangelist(names)
@@ -993,39 +1076,36 @@
     def __getCommitableItems(self):
         """
         Private method to retrieve all entries the user wants to commit.
-        
+
         @return list of all items, the user has checked
         """
         commitableItems = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
-            if (
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Checked
-            ):
+            if itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Checked:
                 commitableItems.append(itm)
         return commitableItems
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
         for itm in self.statusList.selectedItems():
             if (
-                itm.text(self.__statusColumn) in self.modifiedIndicators or
-                itm.text(self.__propStatusColumn) in self.modifiedIndicators
+                itm.text(self.__statusColumn) in self.modifiedIndicators
+                or itm.text(self.__propStatusColumn) in self.modifiedIndicators
             ):
                 modifiedItems.append(itm)
         return modifiedItems
-        
+
     def __getUnversionedItems(self):
         """
         Private method to retrieve all entries, that have an unversioned
         status.
-        
+
         @return list of all items with an unversioned status
         """
         unversionedItems = []
@@ -1033,11 +1113,11 @@
             if itm.text(self.__statusColumn) in self.unversionedIndicators:
                 unversionedItems.append(itm)
         return unversionedItems
-        
+
     def __getMissingItems(self):
         """
         Private method to retrieve all entries, that have a missing status.
-        
+
         @return list of all items with a missing status
         """
         missingItems = []
@@ -1045,11 +1125,11 @@
             if itm.text(self.__statusColumn) in self.missingIndicators:
                 missingItems.append(itm)
         return missingItems
-        
+
     def __getLockActionItems(self, indicators):
         """
         Private method to retrieve all emtries, that have a locked status.
-        
+
         @param indicators list of indicators to check against (list of strings)
         @return list of all items with a locked status
         """
@@ -1058,12 +1138,12 @@
             if itm.text(self.__lockinfoColumn) in indicators:
                 lockitems.append(itm)
         return lockitems
-        
+
     def __getChangelistItems(self):
         """
         Private method to retrieve all entries, that are members of
         a changelist.
-        
+
         @return list of all items belonging to a changelist
         """
         clitems = []
@@ -1071,12 +1151,12 @@
             if itm.text(self.__changelistColumn) != "":
                 clitems.append(itm)
         return clitems
-        
+
     def __getNonChangelistItems(self):
         """
         Private method to retrieve all entries, that are not members of
         a changelist.
-        
+
         @return list of all items not belonging to a changelist
         """
         clitems = []
@@ -1084,22 +1164,22 @@
             if itm.text(self.__changelistColumn) == "":
                 clitems.append(itm)
         return clitems
-    
+
     def __commitSelect(self, selected):
         """
         Private slot to select or deselect all entries.
-        
+
         @param selected commit selection state to be set (boolean)
         """
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if selected:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Checked)
+                    itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked)
                 else:
-                    itm.setCheckState(self.__toBeCommittedColumn,
-                                      Qt.CheckState.Unchecked)
+                    itm.setCheckState(
+                        self.__toBeCommittedColumn, Qt.CheckState.Unchecked
+                    )
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,27 +20,29 @@
     """
     Class implementing the VCS status monitor thread class for Subversion.
     """
+
     def __init__(self, interval, project, vcs, parent=None):
         """
         Constructor
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object (Project)
         @param vcs reference to the version control object
         @param parent reference to the parent object (QObject)
         """
         VcsStatusMonitorThread.__init__(self, interval, project, vcs, parent)
-        
+
         self.__ioEncoding = Preferences.getSystem("IOEncoding")
-        
-        self.rx_status1 = re.compile('(.{8,9})\\s+([0-9-]+)\\s+(.+)\\s*')
+
+        self.rx_status1 = re.compile("(.{8,9})\\s+([0-9-]+)\\s+(.+)\\s*")
         self.rx_status2 = re.compile(
-            '(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*')
-    
+            "(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*"
+        )
+
     def _performMonitor(self):
         """
         Protected method implementing the monitoring action.
-        
+
         This method populates the statusList member variable
         with a list of strings giving the status in the first column and the
         path relative to the project directory starting with the third column.
@@ -56,33 +58,33 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @return tuple of flag indicating successful operation (boolean) and
             a status message in case of non successful operation (string)
         """
         self.shouldUpdate = False
-        
+
         process = QProcess()
         args = []
-        args.append('status')
+        args.append("status")
         if not Preferences.getVCS("MonitorLocalStatus"):
-            args.append('--show-updates')
-        args.append('--non-interactive')
-        args.append('.')
+            args.append("--show-updates")
+        args.append("--non-interactive")
+        args.append(".")
         process.setWorkingDirectory(self.projectDir)
-        process.start('svn', args)
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(300000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             self.__ioEncoding, 'replace')
+                output = str(
+                    process.readAllStandardOutput(), self.__ioEncoding, "replace"
+                )
                 states = {}
                 for line in output.splitlines():
-                    match = (
-                        self.rx_status1.fullmatch(line) or
-                        self.rx_status2.fullmatch(line)
-                    )
+                    match = self.rx_status1.fullmatch(
+                        line
+                    ) or self.rx_status2.fullmatch(line)
                     if match is None:
                         continue
                     elif match.re is self.rx_status1:
@@ -92,16 +94,16 @@
                         flags = match.group(1)
                         path = match.group(5).strip()
                     if (
-                        flags[0] in "ACDMR?!" or
-                        (flags[0] == " " and flags[-1] == "*") or
-                        flags[1] in "CM"
+                        flags[0] in "ACDMR?!"
+                        or (flags[0] == " " and flags[-1] == "*")
+                        or flags[1] in "CM"
                     ):
                         if flags[-1] == "*":
                             status = "U"
                         else:
                             status = flags[0]
                         if status == "C" or flags[1] == "C":
-                            status = "Z"    # give it highest priority
+                            status = "Z"  # give it highest priority
                         elif status == "D":
                             status = "O"
                         if status == "U":
@@ -112,28 +114,28 @@
                         states[name] = status
                         try:
                             if self.reportedStates[name] != status:
-                                self.statusList.append(
-                                    "{0} {1}".format(status, name))
+                                self.statusList.append("{0} {1}".format(status, name))
                         except KeyError:
-                            self.statusList.append(
-                                "{0} {1}".format(status, name))
+                            self.statusList.append("{0} {1}".format(status, name))
                 for name in list(self.reportedStates.keys()):
                     if name not in states:
                         self.statusList.append("  {0}".format(name))
                 self.reportedStates = states
                 return True, self.tr(
-                    "Subversion status checked successfully (using svn)")
+                    "Subversion status checked successfully (using svn)"
+                )
             else:
                 process.kill()
                 process.waitForFinished()
                 return (
                     False,
-                    str(process.readAllStandardError(),
+                    str(
+                        process.readAllStandardError(),
                         Preferences.getSystem("IOEncoding"),
-                        'replace')
+                        "replace",
+                    ),
                 )
         else:
             process.kill()
             process.waitForFinished()
-            return False, self.tr(
-                "Could not start the Subversion process.")
+            return False, self.tr("Could not start the Subversion process.")
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnSwitchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnSwitchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter the data for a switch operation.
     """
+
     def __init__(self, taglist, reposURL, standardLayout, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param reposURL repository path (string) or None
         @param standardLayout flag indicating the layout of the
@@ -28,23 +29,23 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-       
+
         self.tagCombo.clear()
         self.tagCombo.addItems(sorted(taglist))
-        
+
         if reposURL is not None and reposURL != "":
             self.tagCombo.setEditText(reposURL)
-            
+
         if not standardLayout:
             self.TagTypeGroup.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple of string and int (tag, tag type)
         """
         tag = self.tagCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagBranchListDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagBranchListDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QProcess
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QDialog, QInputDialog, QDialogButtonBox,
-    QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QDialog,
+    QInputDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox
@@ -28,58 +32,58 @@
     """
     Class implementing a dialog to show a list of tags or branches.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.vcs = vcs
         self.tagsList = None
         self.allTagsList = None
-        
+
         self.tagList.headerItem().setText(self.tagList.columnCount(), "")
         self.tagList.header().setSortIndicator(3, Qt.SortOrder.AscendingOrder)
-        
+
         self.process = QProcess()
         self.process.finished.connect(self.__procFinished)
         self.process.readyReadStandardOutput.connect(self.__readStdout)
         self.process.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.rx_list = re.compile(
             r"""\w*\s*(\d+)\s+(\w+)\s+\d*\s*"""
-            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)/\s*""")
-        
+            r"""((?:\w+\s+\d+|[0-9.]+\s+\w+)\s+[0-9:]+)\s+(.+)/\s*"""
+        )
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
+
         e.accept()
-        
+
     def start(self, path, tags, tagsList, allTagsList):
         """
         Public slot to start the svn status command.
-        
+
         @param path name of directory to be listed (string)
         @param tags flag indicating a list of tags is requested
             (False = branches, True = tags)
@@ -88,20 +92,20 @@
         @param allTagsList reference to string list all tags (list of strings)
         """
         self.errorGroup.hide()
-        
+
         self.tagList.clear()
-        
+
         self.intercept = False
         if not tags:
             self.setWindowTitle(self.tr("Subversion Branches List"))
         self.activateWindow()
-        
+
         self.tagsList = tagsList
         self.allTagsList = allTagsList
         dname, fname = self.vcs.splitPath(path)
-        
+
         self.process.kill()
-        
+
         reposURL = self.vcs.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -110,18 +114,20 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The list operation"""
-                    """ will be aborted"""))
+                    """ will be aborted"""
+                ),
+            )
             self.close()
             return
-        
+
         args = []
-        args.append('list')
-        self.vcs.addArguments(args, self.vcs.options['global'])
-        args.append('--verbose')
-        
+        args.append("list")
+        self.vcs.addArguments(args, self.vcs.options["global"])
+        args.append("--verbose")
+
         if self.vcs.otherData["standardLayout"]:
             # determine the base path of the project in the repository
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -130,11 +136,13 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The list operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return
-            
+
             reposRoot = match.group(1)
-            
+
             if tags:
                 args.append("{0}/tags".format(reposRoot))
             else:
@@ -144,10 +152,10 @@
             reposPath, ok = QInputDialog.getText(
                 self,
                 self.tr("Subversion List"),
-                self.tr("Enter the repository URL containing the tags"
-                        " or branches"),
+                self.tr("Enter the repository URL containing the tags" " or branches"),
                 QLineEdit.EchoMode.Normal,
-                self.vcs.svnNormalizeURL(reposURL))
+                self.vcs.svnNormalizeURL(reposURL),
+            )
             if not ok:
                 self.close()
                 return
@@ -155,104 +163,97 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Subversion List"),
-                    self.tr("""The repository URL is empty."""
-                            """ Aborting..."""))
+                    self.tr("""The repository URL is empty.""" """ Aborting..."""),
+                )
                 self.close()
                 return
             args.append(reposPath)
             self.path = reposPath
-        
+
         self.process.setWorkingDirectory(dname)
-        
-        self.process.start('svn', args)
+
+        self.process.start("svn", args)
         procStarted = self.process.waitForStarted(5000)
         if not procStarted:
             self.inputGroup.setEnabled(False)
             self.inputGroup.hide()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('svn'))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path."
+                ).format("svn"),
+            )
         else:
             self.inputGroup.setEnabled(True)
             self.inputGroup.show()
-        
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed the
         button.
         """
         if (
-            self.process is not None and
-            self.process.state() != QProcess.ProcessState.NotRunning
+            self.process is not None
+            and self.process.state() != QProcess.ProcessState.NotRunning
         ):
             self.process.terminate()
             QTimer.singleShot(2000, self.process.kill)
             self.process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
-        
+
         self.__resizeColumns()
         self.__resort()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish()
-        
+
     def __procFinished(self, exitCode, exitStatus):
         """
         Private slot connected to the finished signal.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.__finish()
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.tagList.sortItems(
-            self.tagList.sortColumn(),
-            self.tagList.header().sortIndicatorOrder())
-        
+            self.tagList.sortColumn(), self.tagList.header().sortIndicatorOrder()
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
-        self.tagList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tagList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.tagList.header().setStretchLastSection(True)
-        
+
     def __generateItem(self, revision, author, date, name):
         """
         Private method to generate a tag item in the taglist.
-        
+
         @param revision revision string (string)
         @param author author of the tag (string)
         @param date date of the tag (string)
@@ -264,20 +265,20 @@
         itm.setData(2, Qt.ItemDataRole.DisplayRole, date)
         itm.setData(3, Qt.ItemDataRole.DisplayRole, name)
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
-        
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStdout signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.process.canReadLine():
-            s = str(self.process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readLine(), Preferences.getSystem("IOEncoding"), "replace"
+            )
             match = self.rx_list.fullmatch(s)
             if match is not None:
                 rev = "{0:6}".format(match.group(1))
@@ -288,38 +289,40 @@
                     continue
                 self.__generateItem(rev, author, date, path)
                 if not self.vcs.otherData["standardLayout"]:
-                    path = self.path + '/' + path
+                    path = self.path + "/" + path
                 if self.tagsList is not None:
                     self.tagsList.append(path)
                 if self.allTagsList is not None:
                     self.allTagsList.append(path)
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStderr signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         if self.process is not None:
             self.errorGroup.show()
-            s = str(self.process.readAllStandardError(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.process.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.errors.insertPlainText(s)
             self.errors.ensureCursorVisible()
-        
+
     def on_passwordCheckBox_toggled(self, isOn):
         """
         Private slot to handle the password checkbox toggled.
-        
+
         @param isOn flag indicating the status of the check box (boolean)
         """
         if isOn:
             self.input.setEchoMode(QLineEdit.EchoMode.Password)
         else:
             self.input.setEchoMode(QLineEdit.EchoMode.Normal)
-        
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -327,30 +330,30 @@
         """
         inputTxt = self.input.text()
         inputTxt += os.linesep
-        
+
         if self.passwordCheckBox.isChecked():
             self.errors.insertPlainText(os.linesep)
             self.errors.ensureCursorVisible()
         else:
             self.errors.insertPlainText(inputTxt)
             self.errors.ensureCursorVisible()
-        
+
         self.process.write(strToQByteArray(inputTxt))
-        
+
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
-        
+
     def on_input_returnPressed(self):
         """
         Private slot to handle the press of the return key in the input field.
         """
         self.intercept = True
         self.on_sendButton_clicked()
-        
+
     def keyPressEvent(self, evt):
         """
         Protected slot to handle a key press event.
-        
+
         @param evt the key press event (QKeyEvent)
         """
         if self.intercept:
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnTagDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter the data for a tagging operation.
     """
+
     def __init__(self, taglist, reposURL, standardLayout, parent=None):
         """
         Constructor
-        
+
         @param taglist list of previously entered tags (list of strings)
         @param reposURL repository path (string) or None
         @param standardLayout flag indicating the layout of the
@@ -28,35 +29,34 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-       
+
         self.tagCombo.clear()
         self.tagCombo.addItems(sorted(taglist, reverse=True))
-        
+
         if reposURL is not None and reposURL != "":
             self.tagCombo.setEditText(reposURL)
-        
+
         if not standardLayout:
             self.TagActionGroup.setEnabled(False)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_tagCombo_editTextChanged(self, text):
         """
         Private method used to enable/disable the OK-button.
-        
+
         @param text text of the tag combobox (string)
         """
         self.okButton.setDisabled(text == "")
-    
+
     def getParameters(self):
         """
         Public method to retrieve the tag data.
-        
+
         @return tuple of string and int (tag, tag operation)
         """
         tag = self.tagCombo.currentText()
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUrlSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUrlSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog to enter the URLs for the svn diff command.
     """
+
     def __init__(self, vcs, tagsList, branchesList, path, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param tagsList list of tags (list of strings)
         @param branchesList list of branches (list of strings)
@@ -36,18 +37,18 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if vcs.version < (1, 4, 0):
             self.summaryCheckBox.setEnabled(False)
             self.summaryCheckBox.setChecked(False)
-        
+
         self.vcs = vcs
         self.tagsList = tagsList
         self.branchesList = branchesList
-        
+
         self.typeCombo1.addItems(["trunk/", "tags/", "branches/"])
         self.typeCombo2.addItems(["trunk/", "tags/", "branches/"])
-        
+
         reposURL = self.vcs.svnGetReposName(path)
         if reposURL is None:
             EricMessageBox.critical(
@@ -56,13 +57,15 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The operation will"""
-                    """ be aborted"""))
+                    """ be aborted"""
+                ),
+            )
             self.reject()
             return
-        
+
         if self.vcs.otherData["standardLayout"]:
             # determine the base path of the project in the repository
-            rx_base = re.compile('(.+/)(trunk|tags|branches).*')
+            rx_base = re.compile("(.+/)(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -71,21 +74,22 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The list operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 self.reject()
                 return
-            
+
             reposRoot = match.group(1)
             self.repoRootLabel1.setText(reposRoot)
             self.repoRootLabel2.setText(reposRoot)
         else:
-            project = ericApp().getObject('Project')
-            if (
-                Utilities.normcasepath(path) !=
-                Utilities.normcasepath(project.getProjectPath())
+            project = ericApp().getObject("Project")
+            if Utilities.normcasepath(path) != Utilities.normcasepath(
+                project.getProjectPath()
             ):
                 path = project.getRelativePath(path)
-                reposURL = reposURL.replace(path, '')
+                reposURL = reposURL.replace(path, "")
             self.repoRootLabel1.hide()
             self.typeCombo1.hide()
             self.labelCombo1.addItems([reposURL] + sorted(self.vcs.tagsList))
@@ -94,15 +98,15 @@
             self.typeCombo2.hide()
             self.labelCombo2.addItems([reposURL] + sorted(self.vcs.tagsList))
             self.labelCombo2.setEnabled(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __changeLabelCombo(self, labelCombo, type_):
         """
         Private method used to change the label combo depending on the
         selected type.
-        
+
         @param labelCombo reference to the labelCombo object (QComboBox)
         @param type_ type string (string)
         """
@@ -120,49 +124,49 @@
             labelCombo.clearEditText()
             labelCombo.addItems(sorted(self.branchesList))
             labelCombo.setEnabled(True)
-        
+
     @pyqtSlot(int)
     def on_typeCombo1_currentIndexChanged(self, index):
         """
         Private slot called when the selected type was changed.
-        
+
         @param index index of the current item
         @type int
         """
         type_ = self.typeCombo1.itemText(index)
         self.__changeLabelCombo(self.labelCombo1, type_)
-        
+
     @pyqtSlot(int)
     def on_typeCombo2_currentIndexChanged(self, index):
         """
         Private slot called when the selected type was changed.
-        
+
         @param index index of the current item
         @type int
         """
         type_ = self.typeCombo2.itemText(index)
         self.__changeLabelCombo(self.labelCombo2, type_)
-        
+
     def getURLs(self):
         """
         Public method to get the entered URLs.
-        
+
         @return tuple of list of two URL strings (list of strings) and
             a flag indicating a diff summary (boolean)
         """
         if self.vcs.otherData["standardLayout"]:
             url1 = (
-                self.repoRootLabel1.text() +
-                self.typeCombo1.currentText() +
-                self.labelCombo1.currentText()
+                self.repoRootLabel1.text()
+                + self.typeCombo1.currentText()
+                + self.labelCombo1.currentText()
             )
             url2 = (
-                self.repoRootLabel2.text() +
-                self.typeCombo2.currentText() +
-                self.labelCombo2.currentText()
+                self.repoRootLabel2.text()
+                + self.typeCombo2.currentText()
+                + self.labelCombo2.currentText()
             )
         else:
             url1 = self.labelCombo1.currentText()
             url2 = self.labelCombo2.currentText()
-        
+
         return [url1, url2], self.summaryCheckBox.isChecked()
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,7 @@
 def getServersPath():
     """
     Module function to get the filename of the servers file.
-    
+
     @return filename of the servers file (string)
     """
     if Utilities.isWindowsPlatform():
@@ -32,7 +32,7 @@
 def getConfigPath():
     """
     Module function to get the filename of the config file.
-    
+
     @return filename of the config file (string)
     """
     if Utilities.isWindowsPlatform():
@@ -64,7 +64,7 @@
             configList = f.read().splitlines()
     except OSError:
         return
-    
+
     newConfig = []
     ignoresFound = False
     amendList = []
@@ -94,7 +94,7 @@
                     amendList.append(amend)
         else:
             newConfig.append(line)
-    
+
     if newConfig != configList:
         with contextlib.suppress(OSError), open(config, "w") as f:
             f.write("\n".join(newConfig))
--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/subversion.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/subversion.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,41 +30,42 @@
 class Subversion(VersionControl):
     """
     Class implementing the version control systems interface to Subversion.
-    
+
     @signal committed() emitted after the commit action has completed
     """
+
     committed = pyqtSignal()
-    
+
     def __init__(self, plugin, parent=None, name=None):
         """
         Constructor
-        
+
         @param plugin reference to the plugin object
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
         VersionControl.__init__(self, parent, name)
         self.defaultOptions = {
-            'global': [''],
-            'commit': [''],
-            'checkout': [''],
-            'update': [''],
-            'add': [''],
-            'remove': [''],
-            'diff': [''],
-            'log': [''],
-            'history': [''],
-            'status': [''],
-            'tag': [''],
-            'export': ['']
+            "global": [""],
+            "commit": [""],
+            "checkout": [""],
+            "update": [""],
+            "add": [""],
+            "remove": [""],
+            "diff": [""],
+            "log": [""],
+            "history": [""],
+            "status": [""],
+            "tag": [""],
+            "export": [""],
         }
         self.interestingDataKeys = [
             "standardLayout",
         ]
-        
+
         self.__plugin = plugin
         self.__ui = parent
-        
+
         self.options = self.defaultOptions
         self.otherData["standardLayout"] = True
         self.tagsList = []
@@ -73,20 +74,20 @@
         self.mergeList = [[], [], []]
         self.showedTags = False
         self.showedBranches = False
-        
+
         self.tagTypeList = [
-            'tags',
-            'branches',
+            "tags",
+            "branches",
         ]
-        
+
         self.commandHistory = []
         self.wdHistory = []
-        
+
         if "SVN_ASP_DOT_NET_HACK" in os.environ:
-            self.adminDir = '_svn'
+            self.adminDir = "_svn"
         else:
-            self.adminDir = '.svn'
-        
+            self.adminDir = ".svn"
+
         self.log = None
         self.diff = None
         self.sbsDiff = None
@@ -96,27 +97,28 @@
         self.blame = None
         self.repoBrowser = None
         self.logBrowser = None
-        
+
         # regular expression object for evaluation of the status output
         self.rx_status1 = re.compile(
-            '(.{8})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)')
-        self.rx_status2 = re.compile('(.{8})\\s+(.+)\\s*')
+            "(.{8})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)"
+        )
+        self.rx_status2 = re.compile("(.{8})\\s+(.+)\\s*")
         self.statusCache = {}
-        
+
         self.__commitData = {}
         self.__commitDialog = None
-        
+
         self.__wcng = True
         # assume new generation working copy metadata format
-        
+
     def getPlugin(self):
         """
         Public method to get a reference to the plugin object.
-        
+
         @return reference to the plugin object (VcsSubversionPlugin)
         """
         return self.__plugin
-        
+
     def vcsShutdown(self):
         """
         Public method used to shutdown the Subversion interface.
@@ -139,30 +141,29 @@
             self.repoBrowser.close()
         if self.logBrowser is not None:
             self.logBrowser.close()
-        
+
     def vcsExists(self):
         """
         Public method used to test for the presence of the svn executable.
-        
+
         @return flag indicating the existance (boolean) and an error message
             (string)
         """
-        self.versionStr = ''
+        self.versionStr = ""
         errMsg = ""
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         process = QProcess()
-        process.start('svn', ['--version'])
+        process.start("svn", ["--version"])
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             ioEncoding,
-                             'replace')
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                 self.versionStr = output.split()[2]
-                v = list(re.match(r'.*?(\d+)\.(\d+)\.?(\d+)?', self.versionStr)
-                         .groups())
+                v = list(
+                    re.match(r".*?(\d+)\.(\d+)\.?(\d+)?", self.versionStr).groups()
+                )
                 for i in range(3):
                     try:
                         v[i] = int(v[i])
@@ -178,32 +179,31 @@
                         "The svn process finished with the exit code {0}"
                     ).format(process.exitCode())
                 else:
-                    errMsg = self.tr(
-                        "The svn process did not finish within 30s.")
+                    errMsg = self.tr("The svn process did not finish within 30s.")
         else:
             errMsg = self.tr("Could not start the svn executable.")
-        
+
         return False, errMsg
-        
+
     def vcsInit(self, vcsDir, noDialog=False):
         """
         Public method used to initialize the subversion repository.
-        
+
         The subversion repository has to be initialized from outside eric
         because the respective command always works locally. Therefore we
         always return TRUE without doing anything.
-        
+
         @param vcsDir name of the VCS directory (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return always TRUE
         """
         return True
-        
+
     def vcsConvertProject(self, vcsDataDict, project, addAll=True):
         """
         Public method to convert an uncontrolled project to a version
         controlled project.
-        
+
         @param vcsDataDict dictionary of data required for the conversion
         @type dict
         @param project reference to the project object
@@ -219,7 +219,9 @@
                 self.tr(
                     """The project could not be created in the repository."""
                     """ Maybe the given repository doesn't exist or the"""
-                    """ repository server is down."""))
+                    """ repository server is down."""
+                ),
+            )
         else:
             cwdIsPpath = False
             if os.getcwd() == project.ppath:
@@ -243,7 +245,9 @@
                     self.tr(
                         """The project could not be checked out of the"""
                         """ repository.<br />"""
-                        """Restoring the original contents."""))
+                        """Restoring the original contents."""
+                    ),
+                )
                 if os.getcwd() == project.ppath:
                     os.chdir(os.path.dirname(project.ppath))
                     cwdIsPpath = True
@@ -251,7 +255,7 @@
                     cwdIsPpath = False
                 shutil.rmtree(project.ppath, True)
                 os.rename(tmpProjectDir, project.ppath)
-                project.pdata["VCS"] = 'None'
+                project.pdata["VCS"] = "None"
                 project.vcs = None
                 project.setDirty(True)
                 project.saveProject()
@@ -260,12 +264,12 @@
             shutil.rmtree(tmpProjectDir, True)
             project.closeProject(noSave=True)
             project.openProject(pfn)
-        
+
     def vcsImport(self, vcsDataDict, projectDir, noDialog=False, addAll=True):
         """
         Public method used to import the project into the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the import
         @type dict
         @param projectDir project directory (string)
@@ -281,59 +285,58 @@
         noDialog = False
         msg = vcsDataDict["message"]
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/'):
-            vcsDir = 'file://{0}'.format(vcsDir)
-        elif vcsDir[1] in ['|', ':']:
-            vcsDir = 'file:///{0}'.format(vcsDir)
-        
-        project = vcsDir[vcsDir.rfind('/') + 1:]
-        
+        if vcsDir.startswith("/"):
+            vcsDir = "file://{0}".format(vcsDir)
+        elif vcsDir[1] in ["|", ":"]:
+            vcsDir = "file:///{0}".format(vcsDir)
+
+        project = vcsDir[vcsDir.rfind("/") + 1 :]
+
         # create the dir structure to be imported into the repository
-        tmpDir = '{0}_tmp'.format(projectDir)
+        tmpDir = "{0}_tmp".format(projectDir)
         try:
             os.makedirs(tmpDir)
             if self.otherData["standardLayout"]:
                 os.mkdir(os.path.join(tmpDir, project))
-                os.mkdir(os.path.join(tmpDir, project, 'branches'))
-                os.mkdir(os.path.join(tmpDir, project, 'tags'))
-                shutil.copytree(
-                    projectDir, os.path.join(tmpDir, project, 'trunk'))
+                os.mkdir(os.path.join(tmpDir, project, "branches"))
+                os.mkdir(os.path.join(tmpDir, project, "tags"))
+                shutil.copytree(projectDir, os.path.join(tmpDir, project, "trunk"))
             else:
                 shutil.copytree(projectDir, os.path.join(tmpDir, project))
         except OSError:
             if os.path.isdir(tmpDir):
                 shutil.rmtree(tmpDir, True)
             return False, False
-        
+
         args = []
-        args.append('import')
-        self.addArguments(args, self.options['global'])
-        args.append('-m')
+        args.append("import")
+        self.addArguments(args, self.options["global"])
+        args.append("-m")
         args.append(msg)
         args.append(self.__svnURL(vcsDir))
-        
+
         if noDialog:
             status = self.startSynchronizedProcess(
-                QProcess(), "svn", args, os.path.join(tmpDir, project))
+                QProcess(), "svn", args, os.path.join(tmpDir, project)
+            )
         else:
-            dia = SvnDialog(
-                self.tr('Importing project into Subversion repository'))
+            dia = SvnDialog(self.tr("Importing project into Subversion repository"))
             res = dia.startProcess(args, os.path.join(tmpDir, project))
             if res:
                 dia.exec()
             status = dia.normalExit()
-        
+
         shutil.rmtree(tmpDir, True)
         return status, False
-        
+
     def vcsCheckout(self, vcsDataDict, projectDir, noDialog=False):
         """
         Public method used to check the project out of the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @param noDialog flag indicating quiet operations
@@ -345,57 +348,56 @@
         except KeyError:
             tag = None
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/'):
-            vcsDir = 'file://{0}'.format(vcsDir)
-        elif vcsDir[1] in ['|', ':']:
-            vcsDir = 'file:///{0}'.format(vcsDir)
-            
+        if vcsDir.startswith("/"):
+            vcsDir = "file://{0}".format(vcsDir)
+        elif vcsDir[1] in ["|", ":"]:
+            vcsDir = "file:///{0}".format(vcsDir)
+
         if self.otherData["standardLayout"]:
-            if tag is None or tag == '':
-                svnUrl = '{0}/trunk'.format(vcsDir)
+            if tag is None or tag == "":
+                svnUrl = "{0}/trunk".format(vcsDir)
             else:
-                if (
-                    not tag.startswith('tags') and
-                    not tag.startswith('branches')
-                ):
+                if not tag.startswith("tags") and not tag.startswith("branches"):
                     tagType, ok = QInputDialog.getItem(
                         None,
                         self.tr("Subversion Checkout"),
                         self.tr(
                             "The tag must be a normal tag (tags) or"
                             " a branch tag (branches)."
-                            " Please select from the list."),
+                            " Please select from the list."
+                        ),
                         self.tagTypeList,
-                        0, False)
+                        0,
+                        False,
+                    )
                     if not ok:
                         return False
-                    tag = '{0}/{1}'.format(tagType, tag)
-                svnUrl = '{0}/{1}'.format(vcsDir, tag)
+                    tag = "{0}/{1}".format(tagType, tag)
+                svnUrl = "{0}/{1}".format(vcsDir, tag)
         else:
             svnUrl = vcsDir
-        
+
         args = []
-        args.append('checkout')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['checkout'])
+        args.append("checkout")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["checkout"])
         args.append(self.__svnURL(svnUrl))
         args.append(projectDir)
-        
+
         if noDialog:
-            return self.startSynchronizedProcess(QProcess(), 'svn', args)
+            return self.startSynchronizedProcess(QProcess(), "svn", args)
         else:
-            dia = SvnDialog(
-                self.tr('Checking project out of Subversion repository'))
+            dia = SvnDialog(self.tr("Checking project out of Subversion repository"))
             res = dia.startProcess(args)
             if res:
                 dia.exec()
             return dia.normalExit()
-        
+
     def vcsExport(self, vcsDataDict, projectDir):
         """
         Public method used to export a directory from the Subversion
         repository.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @return flag indicating an execution without errors (boolean)
@@ -405,76 +407,76 @@
         except KeyError:
             tag = None
         vcsDir = self.svnNormalizeURL(vcsDataDict["url"])
-        if vcsDir.startswith('/') or vcsDir[1] == '|':
-            vcsDir = 'file://{0}'.format(vcsDir)
-            
+        if vcsDir.startswith("/") or vcsDir[1] == "|":
+            vcsDir = "file://{0}".format(vcsDir)
+
         if self.otherData["standardLayout"]:
-            if tag is None or tag == '':
-                svnUrl = '{0}/trunk'.format(vcsDir)
+            if tag is None or tag == "":
+                svnUrl = "{0}/trunk".format(vcsDir)
             else:
-                if (
-                    not tag.startswith('tags') and
-                    not tag.startswith('branches')
-                ):
+                if not tag.startswith("tags") and not tag.startswith("branches"):
                     tagType, ok = QInputDialog.getItem(
                         None,
                         self.tr("Subversion Export"),
                         self.tr(
                             "The tag must be a normal tag (tags) or"
                             " a branch tag (branches)."
-                            " Please select from the list."),
+                            " Please select from the list."
+                        ),
                         self.tagTypeList,
-                        0, False)
+                        0,
+                        False,
+                    )
                     if not ok:
                         return False
-                    tag = '{0}/{1}'.format(tagType, tag)
-                svnUrl = '{0}/{1}'.format(vcsDir, tag)
+                    tag = "{0}/{1}".format(tagType, tag)
+                svnUrl = "{0}/{1}".format(vcsDir, tag)
         else:
             svnUrl = vcsDir
-        
+
         args = []
-        args.append('export')
-        self.addArguments(args, self.options['global'])
+        args.append("export")
+        self.addArguments(args, self.options["global"])
         args.append("--force")
         args.append(self.__svnURL(svnUrl))
         args.append(projectDir)
-        
-        dia = SvnDialog(
-            self.tr('Exporting project from Subversion repository'))
+
+        dia = SvnDialog(self.tr("Exporting project from Subversion repository"))
         res = dia.startProcess(args)
         if res:
             dia.exec()
         return dia.normalExit()
-        
+
     def vcsCommit(self, name, message, noDialog=False):
         """
         Public method used to make the change of a file/directory permanent
         in the Subversion repository.
-        
+
         @param name file/directory name to be committed (string or list of
             strings)
         @param message message for this operation (string)
         @param noDialog flag indicating quiet operations
         """
         msg = message
-        
+
         if not noDialog and not msg:
             # call CommitDialog and get message from there
             if self.__commitDialog is None:
                 from .SvnCommitDialog import SvnCommitDialog
+
                 self.__commitDialog = SvnCommitDialog(self, self.__ui)
                 self.__commitDialog.accepted.connect(self.__vcsCommit_Step2)
             self.__commitDialog.show()
             self.__commitDialog.raise_()
             self.__commitDialog.activateWindow()
-        
+
         self.__commitData["name"] = name
         self.__commitData["msg"] = msg
         self.__commitData["noDialog"] = noDialog
-        
+
         if noDialog:
             self.__vcsCommit_Step2()
-        
+
     def __vcsCommit_Step2(self):
         """
         Private slot performing the second step of the commit action.
@@ -482,7 +484,7 @@
         name = self.__commitData["name"]
         msg = self.__commitData["msg"]
         noDialog = self.__commitData["noDialog"]
-        
+
         if not noDialog:
             # check, if there are unsaved changes, that should be committed
             if isinstance(name, list):
@@ -496,50 +498,48 @@
                     project = ericApp().getObject("Project")
                     if nam == project.getProjectPath():
                         ok &= (
-                            project.checkAllScriptsDirty(
-                                reportSyntaxErrors=True) and
-                            project.checkDirty()
+                            project.checkAllScriptsDirty(reportSyntaxErrors=True)
+                            and project.checkDirty()
                         )
                         continue
                 elif os.path.isfile(nam):
-                    editor = ericApp().getObject("ViewManager").getOpenEditor(
-                        nam)
+                    editor = ericApp().getObject("ViewManager").getOpenEditor(nam)
                     if editor:
                         ok &= editor.checkDirty()
                 if not ok:
                     break
-            
+
             if not ok:
                 res = EricMessageBox.yesNo(
                     self.__ui,
                     self.tr("Commit Changes"),
                     self.tr(
                         """The commit affects files, that have unsaved"""
-                        """ changes. Shall the commit be continued?"""),
-                    icon=EricMessageBox.Warning)
+                        """ changes. Shall the commit be continued?"""
+                    ),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-        
+
         if self.__commitDialog is not None:
             msg = self.__commitDialog.logMessage()
             if self.__commitDialog.hasChangelists():
-                changelists, keepChangelists = (
-                    self.__commitDialog.changelistsData()
-                )
+                changelists, keepChangelists = self.__commitDialog.changelistsData()
             else:
                 changelists, keepChangelists = [], False
             self.__commitDialog.deleteLater()
             self.__commitDialog = None
         else:
             changelists, keepChangelists = [], False
-        
+
         if not msg:
-            msg = '***'
-        
+            msg = "***"
+
         args = []
-        args.append('commit')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['commit'])
+        args.append("commit")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["commit"])
         if keepChangelists:
             args.append("--keep-changelists")
         for changelist in changelists:
@@ -553,28 +553,26 @@
         else:
             dname, fname = self.splitPath(name)
             args.append(fname)
-        
-        if (
-            self.svnGetReposName(dname).startswith('http') or
-            self.svnGetReposName(dname).startswith('svn')
-        ):
+
+        if self.svnGetReposName(dname).startswith("http") or self.svnGetReposName(
+            dname
+        ).startswith("svn"):
             noDialog = False
-        
+
         if noDialog:
             self.startSynchronizedProcess(QProcess(), "svn", args, dname)
         else:
-            dia = SvnDialog(
-                self.tr('Commiting changes to Subversion repository'))
+            dia = SvnDialog(self.tr("Commiting changes to Subversion repository"))
             res = dia.startProcess(args, dname)
             if res:
                 dia.exec()
         self.committed.emit()
         self.checkVCSStatus()
-    
+
     def vcsCommitMessages(self):
         """
         Public method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         """
@@ -583,13 +581,13 @@
         if not messages:
             # empty list returned, try the vcs specific one
             messages = self.getPlugin().getPreferences("Commits")
-        
+
         return messages
-    
+
     def vcsAddCommitMessage(self, message):
         """
         Public method to add a commit message to the list of saved messages.
-        
+
         @param message message to be added
         @type str
         """
@@ -601,19 +599,19 @@
             no = Preferences.getVCS("CommitMessages")
             del commitMessages[no:]
             self.getPlugin().setPreferences("Commits", commitMessages)
-    
+
     def vcsClearCommitMessages(self):
         """
         Public method to clear the list of saved messages.
         """
         if not self._vcsClearProjectCommitMessages():
-            self.getPlugin().setPreferences('Commits', [])
-    
+            self.getPlugin().setPreferences("Commits", [])
+
     def vcsUpdate(self, name, noDialog=False):
         """
         Public method used to update a file/directory with the Subversion
         repository.
-        
+
         @param name file/directory name to be updated (string or list of
             strings)
         @param noDialog flag indicating quiet operations (boolean)
@@ -621,49 +619,48 @@
             or delete (boolean)
         """
         args = []
-        args.append('update')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['update'])
+        args.append("update")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["update"])
         if self.version >= (1, 5, 0):
-            args.append('--accept')
-            args.append('postpone')
+            args.append("--accept")
+            args.append("postpone")
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
             self.addArguments(args, fnames)
         else:
             dname, fname = self.splitPath(name)
             args.append(fname)
-        
+
         if noDialog:
             self.startSynchronizedProcess(QProcess(), "svn", args, dname)
             res = False
         else:
-            dia = SvnDialog(
-                self.tr('Synchronizing with the Subversion repository'))
+            dia = SvnDialog(self.tr("Synchronizing with the Subversion repository"))
             res = dia.startProcess(args, dname, True)
             if res:
                 dia.exec()
                 res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-        
+
     def vcsAdd(self, name, isDir=False, noDialog=False):
         """
         Public method used to add a file/directory to the Subversion
         repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @param noDialog flag indicating quiet operations
         """
         args = []
-        args.append('add')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['add'])
-        args.append('--non-recursive')
-        if noDialog and '--force' not in args:
-            args.append('--force')
-        
+        args.append("add")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["add"])
+        args.append("--non-recursive")
+        if noDialog and "--force" not in args:
+            args.append("--force")
+
         if isinstance(name, list):
             if isDir:
                 dname, fname = os.path.split(name[0])
@@ -682,11 +679,9 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return  # oops, project is not version controlled
-            while (
-                os.path.normcase(dname) != os.path.normcase(repodir) and
-                (os.path.normcase(dname) not in self.statusCache or
-                 self.statusCache[os.path.normcase(dname)] ==
-                 self.canBeAdded)
+            while os.path.normcase(dname) != os.path.normcase(repodir) and (
+                os.path.normcase(dname) not in self.statusCache
+                or self.statusCache[os.path.normcase(dname)] == self.canBeAdded
             ):
                 # add directories recursively, if they aren't in the
                 # repository already
@@ -701,24 +696,24 @@
                 dname = os.path.dirname(dname)
                 wdir = dname
         self.addArguments(args, tree)
-        
+
         if isinstance(name, list):
             tree2 = []
             for n in name:
                 d = os.path.dirname(n)
                 if self.__wcng:
                     repodir = d
-                    while not os.path.isdir(
-                            os.path.join(repodir, self.adminDir)):
+                    while not os.path.isdir(os.path.join(repodir, self.adminDir)):
                         repodir = os.path.dirname(repodir)
                         if os.path.splitdrive(repodir)[1] == os.sep:
                             return  # oops, project is not version controlled
                     while (
-                        os.path.normcase(d) != os.path.normcase(repodir) and
-                        (d not in tree2 + tree) and
-                        (os.path.normcase(d) not in self.statusCache or
-                         self.statusCache[os.path.normcase(d)] ==
-                         self.canBeAdded)
+                        os.path.normcase(d) != os.path.normcase(repodir)
+                        and (d not in tree2 + tree)
+                        and (
+                            os.path.normcase(d) not in self.statusCache
+                            or self.statusCache[os.path.normcase(d)] == self.canBeAdded
+                        )
                     ):
                         tree2.append(d)
                         d = os.path.dirname(d)
@@ -733,40 +728,40 @@
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         if noDialog:
             self.startSynchronizedProcess(QProcess(), "svn", args, wdir)
         else:
             dia = SvnDialog(
-                self.tr('Adding files/directories to the Subversion'
-                        ' repository'))
+                self.tr("Adding files/directories to the Subversion" " repository")
+            )
             res = dia.startProcess(args, wdir)
             if res:
                 dia.exec()
-        
+
     def vcsAddBinary(self, name, isDir=False):
         """
         Public method used to add a file/directory in binary mode to the
         Subversion repository.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         """
         self.vcsAdd(name, isDir)
-        
+
     def vcsAddTree(self, path):
         """
         Public method to add a directory tree rooted at path to the Subversion
         repository.
-        
+
         @param path root directory of the tree to be added (string or list of
             strings))
         """
         args = []
-        args.append('add')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['add'])
-        
+        args.append("add")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["add"])
+
         tree = []
         if isinstance(path, list):
             dname, fnames = self.splitPathList(path)
@@ -774,17 +769,17 @@
                 d = os.path.dirname(n)
                 if self.__wcng:
                     repodir = d
-                    while not os.path.isdir(
-                            os.path.join(repodir, self.adminDir)):
+                    while not os.path.isdir(os.path.join(repodir, self.adminDir)):
                         repodir = os.path.dirname(repodir)
                         if os.path.splitdrive(repodir)[1] == os.sep:
                             return  # oops, project is not version controlled
                     while (
-                        os.path.normcase(d) != os.path.normcase(repodir) and
-                        (d not in tree) and
-                        (os.path.normcase(d) not in self.statusCache or
-                         self.statusCache[os.path.normcase(d)] ==
-                         self.canBeAdded)
+                        os.path.normcase(d) != os.path.normcase(repodir)
+                        and (d not in tree)
+                        and (
+                            os.path.normcase(d) not in self.statusCache
+                            or self.statusCache[os.path.normcase(d)] == self.canBeAdded
+                        )
                     ):
                         tree.append(d)
                         d = os.path.dirname(d)
@@ -805,11 +800,9 @@
                     repodir = os.path.dirname(repodir)
                     if os.path.splitdrive(repodir)[1] == os.sep:
                         return  # oops, project is not version controlled
-                while (
-                    os.path.normcase(dname) != os.path.normcase(repodir) and
-                    (os.path.normcase(dname) not in self.statusCache or
-                     self.statusCache[os.path.normcase(dname)] ==
-                     self.canBeAdded)
+                while os.path.normcase(dname) != os.path.normcase(repodir) and (
+                    os.path.normcase(dname) not in self.statusCache
+                    or self.statusCache[os.path.normcase(dname)] == self.canBeAdded
                 ):
                     # add directories recursively, if they aren't in the
                     # repository already
@@ -823,25 +816,24 @@
                     dname = os.path.dirname(dname)
         if tree:
             self.vcsAdd(tree, True)
-        
+
         if isinstance(path, list):
             self.addArguments(args, path)
         else:
             args.append(path)
-        
-        dia = SvnDialog(
-            self.tr('Adding directory trees to the Subversion repository'))
+
+        dia = SvnDialog(self.tr("Adding directory trees to the Subversion repository"))
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def vcsRemove(self, name, project=False, noDialog=False):
         """
         Public method used to remove a file/directory from the Subversion
         repository.
-        
+
         The default operation is to remove the local copy as well.
-        
+
         @param name file/directory name to be removed (string or list of
             strings))
         @param project flag indicating deletion of a project tree (boolean)
@@ -850,46 +842,46 @@
         @return flag indicating successfull operation (boolean)
         """
         args = []
-        args.append('delete')
-        self.addArguments(args, self.options['global'])
-        self.addArguments(args, self.options['remove'])
-        if noDialog and '--force' not in args:
-            args.append('--force')
-        
+        args.append("delete")
+        self.addArguments(args, self.options["global"])
+        self.addArguments(args, self.options["remove"])
+        if noDialog and "--force" not in args:
+            args.append("--force")
+
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             args.append(name)
-        
+
         if noDialog:
             res = self.startSynchronizedProcess(QProcess(), "svn", args)
         else:
             dia = SvnDialog(
-                self.tr('Removing files/directories from the Subversion'
-                        ' repository'))
+                self.tr("Removing files/directories from the Subversion" " repository")
+            )
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.normalExit()
-        
+
         return res
-        
+
     def vcsMove(self, name, project, target=None, noDialog=False):
         """
         Public method used to move a file/directory.
-        
+
         @param name file/directory name to be moved (string)
         @param project reference to the project object
         @param target new name of the file/directory (string)
         @param noDialog flag indicating quiet operations
         @return flag indicating successfull operation (boolean)
         """
-        rx_prot = re.compile('(file:|svn:|svn+ssh:|http:|https:).+')
-        opts = self.options['global'][:]
-        force = '--force' in opts
+        rx_prot = re.compile("(file:|svn:|svn+ssh:|http:|https:).+")
+        opts = self.options["global"][:]
+        force = "--force" in opts
         if force:
-            del opts[opts.index('--force')]
-        
+            del opts[opts.index("--force")]
+
         res = False
         if noDialog:
             if target is None:
@@ -898,34 +890,33 @@
             accepted = True
         else:
             from .SvnCopyDialog import SvnCopyDialog
+
             dlg = SvnCopyDialog(name, None, True, force)
-            accepted = (dlg.exec() == QDialog.DialogCode.Accepted)
+            accepted = dlg.exec() == QDialog.DialogCode.Accepted
             if accepted:
                 target, force = dlg.getData()
             if not target:
                 return False
-        
-        isDir = (os.path.isdir(name) if rx_prot.fullmatch(target) is None
-                 else False)
-        
+
+        isDir = os.path.isdir(name) if rx_prot.fullmatch(target) is None else False
+
         if accepted:
             args = []
-            args.append('move')
+            args.append("move")
             self.addArguments(args, opts)
             if force:
-                args.append('--force')
+                args.append("--force")
             if rx_prot.fullmatch(target) is not None:
-                args.append('--message')
-                args.append('Moving {0} to {1}'.format(name, target))
+                args.append("--message")
+                args.append("Moving {0} to {1}".format(name, target))
                 target = self.__svnURL(target)
             args.append(name)
             args.append(target)
-            
+
             if noDialog:
                 res = self.startSynchronizedProcess(QProcess(), "svn", args)
             else:
-                dia = SvnDialog(self.tr('Moving {0}')
-                                .format(name))
+                dia = SvnDialog(self.tr("Moving {0}").format(name))
                 res = dia.startProcess(args)
                 if res:
                     dia.exec()
@@ -942,17 +933,17 @@
                     else:
                         project.removeFile(name)
         return res
-        
+
     def vcsDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Subversion repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -967,36 +958,38 @@
                     return
         if self.diff is None:
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self)
         self.diff.show()
         self.diff.raise_()
         QApplication.processEvents()
         self.diff.start(name, refreshable=True)
-        
+
     def vcsStatus(self, name):
         """
         Public method used to view the status of files/directories in the
         Subversion repository.
-        
+
         @param name file/directory name(s) to show the status of
             (string or list of strings)
         """
         if self.status is None:
             from .SvnStatusDialog import SvnStatusDialog
+
             self.status = SvnStatusDialog(self)
         self.status.show()
         self.status.raise_()
         self.status.start(name)
-        
+
     def vcsTag(self, name):
         """
         Public method used to set the tag of a file/directory in the
         Subversion repository.
-        
+
         @param name file/directory name to be tagged (string)
         """
         dname, fname = self.splitPath(name)
-        
+
         reposURL = self.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -1005,17 +998,19 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The tag operation"""
-                    """ will be aborted"""))
+                    """ will be aborted"""
+                ),
+            )
             return
-        
+
         url = (
-            None
-            if self.otherData["standardLayout"] else
-            self.svnNormalizeURL(reposURL)
+            None if self.otherData["standardLayout"] else self.svnNormalizeURL(reposURL)
         )
         from .SvnTagDialog import SvnTagDialog
-        dlg = SvnTagDialog(self.allTagsBranchesList, url,
-                           self.otherData["standardLayout"])
+
+        dlg = SvnTagDialog(
+            self.allTagsBranchesList, url, self.otherData["standardLayout"]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, tagOp = dlg.getParameters()
             if tag in self.allTagsBranchesList:
@@ -1023,9 +1018,9 @@
             self.allTagsBranchesList.insert(0, tag)
         else:
             return
-        
+
         if self.otherData["standardLayout"]:
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -1034,44 +1029,47 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The tag operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return
-            
+
             reposRoot = match.group(1)
             if tagOp in [1, 4]:
-                url = '{0}/tags/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/tags/{1}".format(reposRoot, quote(tag))
             elif tagOp in [2, 8]:
-                url = '{0}/branches/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/branches/{1}".format(reposRoot, quote(tag))
         else:
             url = self.__svnURL(tag)
-        
+
         args = []
         if tagOp in [1, 2]:
-            args.append('copy')
-            self.addArguments(args, self.options['global'])
-            self.addArguments(args, self.options['tag'])
-            args.append('--message')
-            args.append('Created tag <{0}>'.format(tag))
+            args.append("copy")
+            self.addArguments(args, self.options["global"])
+            self.addArguments(args, self.options["tag"])
+            args.append("--message")
+            args.append("Created tag <{0}>".format(tag))
             args.append(reposURL)
             args.append(url)
         else:
-            args.append('delete')
-            self.addArguments(args, self.options['global'])
-            self.addArguments(args, self.options['tag'])
-            args.append('--message')
-            args.append('Deleted tag <{0}>'.format(tag))
+            args.append("delete")
+            self.addArguments(args, self.options["global"])
+            self.addArguments(args, self.options["tag"])
+            args.append("--message")
+            args.append("Deleted tag <{0}>".format(tag))
             args.append(url)
-        
-        dia = SvnDialog(self.tr('Tagging {0} in the Subversion repository')
-                        .format(name))
+
+        dia = SvnDialog(
+            self.tr("Tagging {0} in the Subversion repository").format(name)
+        )
         res = dia.startProcess(args)
         if res:
             dia.exec()
-        
+
     def vcsRevert(self, name):
         """
         Public method used to revert changes made to a file/directory.
-        
+
         @param name file/directory name to be reverted
         @type str
         @return flag indicating, that the update contained an add
@@ -1079,66 +1077,71 @@
         @rtype bool
         """
         args = []
-        args.append('revert')
-        self.addArguments(args, self.options['global'])
+        args.append("revert")
+        self.addArguments(args, self.options["global"])
         if isinstance(name, list):
             self.addArguments(args, name)
             names = name[:]
         else:
             if os.path.isdir(name):
-                args.append('--recursive')
+                args.append("--recursive")
             args.append(name)
             names = [name]
-        
+
         project = ericApp().getObject("Project")
         names = [project.getRelativePath(nam) for nam in names]
         if names[0]:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 self.tr("Revert changes"),
-                self.tr("Do you really want to revert all changes to"
-                        " these files or directories?"),
-                names)
+                self.tr(
+                    "Do you really want to revert all changes to"
+                    " these files or directories?"
+                ),
+                names,
+            )
             yes = dlg.exec() == QDialog.DialogCode.Accepted
         else:
             yes = EricMessageBox.yesNo(
                 None,
                 self.tr("Revert changes"),
-                self.tr("""Do you really want to revert all changes of"""
-                        """ the project?"""))
+                self.tr(
+                    """Do you really want to revert all changes of"""
+                    """ the project?"""
+                ),
+            )
         if yes:
-            dia = SvnDialog(self.tr('Reverting changes'))
+            dia = SvnDialog(self.tr("Reverting changes"))
             res = dia.startProcess(args)
             if res:
                 dia.exec()
             self.checkVCSStatus()
-        
+
         return False
-    
+
     def vcsForget(self, name):
         """
         Public method used to remove a file from the repository.
-        
+
         Note: svn does not support this operation. The method is implemented
         as a NoOp.
-        
+
         @param name file/directory name to be removed
         @type str or list of str
         """
         pass
-    
+
     def vcsSwitch(self, name):
         """
         Public method used to switch a directory to a different tag/branch.
-        
+
         @param name directory name to be switched (string)
         @return flag indicating added or changed files (boolean)
         """
         dname, fname = self.splitPath(name)
-        
+
         reposURL = self.svnGetReposName(dname)
         if reposURL is None:
             EricMessageBox.critical(
@@ -1147,17 +1150,19 @@
                 self.tr(
                     """The URL of the project repository could not be"""
                     """ retrieved from the working copy. The switch"""
-                    """ operation will be aborted"""))
+                    """ operation will be aborted"""
+                ),
+            )
             return False
-        
+
         url = (
-            None
-            if self.otherData["standardLayout"] else
-            self.svnNormalizeURL(reposURL)
+            None if self.otherData["standardLayout"] else self.svnNormalizeURL(reposURL)
         )
         from .SvnSwitchDialog import SvnSwitchDialog
-        dlg = SvnSwitchDialog(self.allTagsBranchesList, url,
-                              self.otherData["standardLayout"])
+
+        dlg = SvnSwitchDialog(
+            self.allTagsBranchesList, url, self.otherData["standardLayout"]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             tag, tagType = dlg.getParameters()
             if tag in self.allTagsBranchesList:
@@ -1165,9 +1170,9 @@
             self.allTagsBranchesList.insert(0, tag)
         else:
             return False
-        
+
         if self.otherData["standardLayout"]:
-            rx_base = re.compile('(.+)/(trunk|tags|branches).*')
+            rx_base = re.compile("(.+)/(trunk|tags|branches).*")
             match = rx_base.fullmatch(reposURL)
             if match is None:
                 EricMessageBox.critical(
@@ -1176,60 +1181,63 @@
                     self.tr(
                         """The URL of the project repository has an"""
                         """ invalid format. The switch operation will"""
-                        """ be aborted"""))
+                        """ be aborted"""
+                    ),
+                )
                 return False
-            
+
             reposRoot = match.group(1)
             tn = tag
             if tagType == 1:
-                url = '{0}/tags/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/tags/{1}".format(reposRoot, quote(tag))
             elif tagType == 2:
-                url = '{0}/branches/{1}'.format(reposRoot, quote(tag))
+                url = "{0}/branches/{1}".format(reposRoot, quote(tag))
             elif tagType == 4:
-                url = '{0}/trunk'.format(reposRoot)
-                tn = 'HEAD'
+                url = "{0}/trunk".format(reposRoot)
+                tn = "HEAD"
         else:
             url = self.__svnURL(tag)
             tn = url
-        
+
         args = []
-        args.append('switch')
+        args.append("switch")
         if self.version >= (1, 5, 0):
-            args.append('--accept')
-            args.append('postpone')
+            args.append("--accept")
+            args.append("postpone")
         args.append(url)
         args.append(name)
-        
-        dia = SvnDialog(self.tr('Switching to {0}')
-                        .format(tn))
+
+        dia = SvnDialog(self.tr("Switching to {0}").format(tn))
         res = dia.startProcess(args, setLanguage=True)
         if res:
             dia.exec()
             res = dia.hasAddOrDelete()
         self.checkVCSStatus()
         return res
-        
+
     def vcsMerge(self, name):
         """
         Public method used to merge a URL/revision into the local project.
-        
+
         @param name file/directory name to be merged (string)
         """
         dname, fname = self.splitPath(name)
-        
-        opts = self.options['global'][:]
-        force = '--force' in opts
+
+        opts = self.options["global"][:]
+        force = "--force" in opts
         if force:
-            del opts[opts.index('--force')]
-        
+            del opts[opts.index("--force")]
+
         from .SvnMergeDialog import SvnMergeDialog
+
         dlg = SvnMergeDialog(
-            self.mergeList[0], self.mergeList[1], self.mergeList[2], force)
+            self.mergeList[0], self.mergeList[1], self.mergeList[2], force
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             urlrev1, urlrev2, target, force = dlg.getParameters()
         else:
             return
-        
+
         # remember URL or revision
         if urlrev1 in self.mergeList[0]:
             self.mergeList[0].remove(urlrev1)
@@ -1237,25 +1245,25 @@
         if urlrev2 in self.mergeList[1]:
             self.mergeList[1].remove(urlrev2)
         self.mergeList[1].insert(0, urlrev2)
-        
-        rx_rev = re.compile('\\d+|HEAD')
-        
+
+        rx_rev = re.compile("\\d+|HEAD")
+
         args = []
-        args.append('merge')
+        args.append("merge")
         self.addArguments(args, opts)
         if self.version >= (1, 5, 0):
-            args.append('--accept')
-            args.append('postpone')
+            args.append("--accept")
+            args.append("postpone")
         if force:
-            args.append('--force')
+            args.append("--force")
         if rx_rev.fullmatch(urlrev1) is not None:
-            args.append('-r')
-            args.append('{0}:{1}'.format(urlrev1, urlrev2))
+            args.append("-r")
+            args.append("{0}:{1}".format(urlrev1, urlrev2))
             if not target:
                 args.append(name)
             else:
                 args.append(target)
-                
+
             # remember target
             if target in self.mergeList[2]:
                 self.mergeList[2].remove(target)
@@ -1264,16 +1272,16 @@
             args.append(self.__svnURL(urlrev1))
             args.append(self.__svnURL(urlrev2))
         args.append(fname)
-        
-        dia = SvnDialog(self.tr('Merging {0}').format(name))
+
+        dia = SvnDialog(self.tr("Merging {0}").format(name))
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def vcsRegisteredState(self, name):
         """
         Public method used to get the registered state of a file in the vcs.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
@@ -1281,14 +1289,14 @@
             return self.__vcsRegisteredState_wcng(name)
         else:
             return self.__vcsRegisteredState_wc(name)
-        
+
     def __vcsRegisteredState_wcng(self, name):
         """
         Private method used to get the registered state of a file in the vcs.
-        
+
         This is the variant for subversion installations using the new
         working copy meta-data format.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
@@ -1296,13 +1304,13 @@
             name = name[:-1]
         name = os.path.normcase(name)
         dname, fname = self.splitPath(name)
-        
-        if fname == '.' and os.path.isdir(os.path.join(dname, self.adminDir)):
+
+        if fname == "." and os.path.isdir(os.path.join(dname, self.adminDir)):
             return self.canBeCommitted
-        
+
         if name in self.statusCache:
             return self.statusCache[name]
-        
+
         name = os.path.normcase(name)
         states = {name: 0}
         states = self.vcsAllRegisteredStates(states, dname, False)
@@ -1310,25 +1318,25 @@
             return self.canBeCommitted
         else:
             return self.canBeAdded
-        
+
     def __vcsRegisteredState_wc(self, name):
         """
         Private method used to get the registered state of a file in the VCS.
-        
+
         This is the variant for subversion installations using the old working
         copy meta-data format.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded
         """
         dname, fname = self.splitPath(name)
-        
-        if fname == '.':
+
+        if fname == ".":
             if os.path.isdir(os.path.join(dname, self.adminDir)):
                 return self.canBeCommitted
             else:
                 return self.canBeAdded
-        
+
         name = os.path.normcase(name)
         states = {name: 0}
         states = self.vcsAllRegisteredStates(states, dname, False)
@@ -1336,16 +1344,16 @@
             return self.canBeCommitted
         else:
             return self.canBeAdded
-        
+
     def vcsAllRegisteredStates(self, names, dname, shortcut=True):
         """
         Public method used to get the registered states of a number of files
         in the VCS.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files have been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1356,19 +1364,19 @@
             return self.__vcsAllRegisteredStates_wcng(names, dname, shortcut)
         else:
             return self.__vcsAllRegisteredStates_wc(names, dname, shortcut)
-        
+
     def __vcsAllRegisteredStates_wcng(self, names, dname, shortcut=True):
         """
         Private method used to get the registered states of a number of files
         in the VCS.
-        
+
         This is the variant for subversion installations using the new working
         copy meta-data format.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files has been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1378,13 +1386,13 @@
         if dname.endswith(os.sep):
             dname = dname[:-1]
         dname = os.path.normcase(dname)
-        
+
         found = False
         for name in self.statusCache:
             if name in names:
                 found = True
                 names[name] = self.statusCache[name]
-        
+
         if not found:
             # find the root of the repo
             repodir = dname
@@ -1392,21 +1400,20 @@
                 repodir = os.path.dirname(repodir)
                 if os.path.splitdrive(repodir)[1] == os.sep:
                     return names
-            
+
             ioEncoding = str(Preferences.getSystem("IOEncoding"))
             process = QProcess()
             args = []
-            args.append('status')
-            args.append('--verbose')
-            args.append('--non-interactive')
+            args.append("status")
+            args.append("--verbose")
+            args.append("--non-interactive")
             args.append(dname)
-            process.start('svn', args)
+            process.start("svn", args)
             procStarted = process.waitForStarted(5000)
             if procStarted:
                 finished = process.waitForFinished(30000)
                 if finished and process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(), ioEncoding,
-                                 'replace')
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                     for line in output.splitlines():
                         match = self.rx_status1.fullmatch(line)
                         if match is not None:
@@ -1426,21 +1433,21 @@
                             self.statusCache[name] = self.canBeCommitted
                         else:
                             self.statusCache[name] = self.canBeAdded
-        
+
         return names
-        
+
     def __vcsAllRegisteredStates_wc(self, names, dname, shortcut=True):
         """
         Private method used to get the registered states of a number of files
         in the VCS.
-        
+
         This is the variant for subversion installations using the old working
         copy meta-data format.
-        
+
         <b>Note:</b> If a shortcut is to be taken, the code will only check,
         if the named directory has been scanned already. If so, it is assumed,
         that the states for all files has been populated by the previous run.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @param shortcut flag indicating a shortcut should be taken (boolean)
@@ -1450,7 +1457,7 @@
         if not os.path.isdir(os.path.join(dname, self.adminDir)):
             # not under version control -> do nothing
             return names
-        
+
         found = False
         for name in list(self.statusCache.keys()):
             if os.path.dirname(name) == dname:
@@ -1460,22 +1467,21 @@
                 if name in names:
                     found = True
                     names[name] = self.statusCache[name]
-        
+
         if not found:
             ioEncoding = Preferences.getSystem("IOEncoding")
             process = QProcess()
             args = []
-            args.append('status')
-            args.append('--verbose')
-            args.append('--non-interactive')
+            args.append("status")
+            args.append("--verbose")
+            args.append("--non-interactive")
             args.append(dname)
-            process.start('svn', args)
+            process.start("svn", args)
             procStarted = process.waitForStarted(5000)
             if procStarted:
                 finished = process.waitForFinished(30000)
                 if finished and process.exitCode() == 0:
-                    output = str(process.readAllStandardOutput(), ioEncoding,
-                                 'replace')
+                    output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                     for line in output.splitlines():
                         match = self.rx_status1.fullmatch(line)
                         if match is not None:
@@ -1495,21 +1501,21 @@
                             self.statusCache[name] = self.canBeCommitted
                         else:
                             self.statusCache[name] = self.canBeAdded
-        
+
         return names
-        
+
     def clearStatusCache(self):
         """
         Public method to clear the status cache.
         """
         self.statusCache = {}
-        
+
     def vcsInitConfig(self, project):
         """
         Public method to initialize the VCS configuration.
-        
+
         This method ensures, that an ignore file exists.
-        
+
         @param project reference to the project (Project)
         """
         configPath = getConfigPath()
@@ -1517,11 +1523,11 @@
             amendConfig()
         else:
             createDefaultConfig()
-    
+
     def vcsName(self):
         """
         Public method returning the name of the vcs.
-        
+
         @return always 'Subversion' (string)
         """
         return "Subversion"
@@ -1529,32 +1535,32 @@
     def vcsCleanup(self, name):
         """
         Public method used to cleanup the working copy.
-        
+
         @param name directory name to be cleaned up (string)
         """
         args = []
-        args.append('cleanup')
-        self.addArguments(args, self.options['global'])
+        args.append("cleanup")
+        self.addArguments(args, self.options["global"])
         args.append(name)
-        
-        dia = SvnDialog(self.tr('Cleaning up {0}')
-                        .format(name))
+
+        dia = SvnDialog(self.tr("Cleaning up {0}").format(name))
         res = dia.startProcess(args)
         if res:
             dia.exec()
-    
+
     def vcsCommandLine(self, name):
         """
         Public method used to execute arbitrary subversion commands.
-        
+
         @param name directory name of the working directory (string)
         """
         from .SvnCommandDialog import SvnCommandDialog
+
         dlg = SvnCommandDialog(self.commandHistory, self.wdHistory, name)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             command, wd = dlg.getData()
             commandList = Utilities.parseOptionString(command)
-            
+
             # This moves any previous occurrence of these arguments to the head
             # of the list.
             if command in self.commandHistory:
@@ -1563,19 +1569,19 @@
             if wd in self.wdHistory:
                 self.wdHistory.remove(wd)
             self.wdHistory.insert(0, wd)
-            
+
             args = []
             self.addArguments(args, commandList)
-            
-            dia = SvnDialog(self.tr('Subversion command'))
+
+            dia = SvnDialog(self.tr("Subversion command"))
             res = dia.startProcess(args, wd)
             if res:
                 dia.exec()
-        
+
     def vcsOptionsDialog(self, project, archive, editable=False, parent=None):
         """
         Public method to get a dialog to enter repository info.
-        
+
         @param project reference to the project object
         @param archive name of the project in the repository (string)
         @param editable flag indicating that the project name is editable
@@ -1584,88 +1590,85 @@
         @return reference to the instantiated options dialog (SvnOptionsDialog)
         """
         from .SvnOptionsDialog import SvnOptionsDialog
+
         return SvnOptionsDialog(self, project, parent)
-        
+
     def vcsNewProjectOptionsDialog(self, parent=None):
         """
         Public method to get a dialog to enter repository info for getting
         a new project.
-        
+
         @param parent parent widget (QWidget)
         @return reference to the instantiated options dialog
             (SvnNewProjectOptionsDialog)
         """
         from .SvnNewProjectOptionsDialog import SvnNewProjectOptionsDialog
+
         return SvnNewProjectOptionsDialog(self, parent)
-        
+
     def vcsRepositoryInfos(self, ppath):
         """
         Public method to retrieve information about the repository.
-        
+
         @param ppath local path to get the repository infos (string)
         @return string with ready formated info for display (string)
         """
         info = {
-            'committed-rev': '',
-            'committed-date': '',
-            'committed-time': '',
-            'url': '',
-            'last-author': '',
-            'revision': ''
+            "committed-rev": "",
+            "committed-date": "",
+            "committed-time": "",
+            "url": "",
+            "last-author": "",
+            "revision": "",
         }
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         process = QProcess()
         args = []
-        args.append('info')
-        args.append('--non-interactive')
-        args.append('--xml')
+        args.append("info")
+        args.append("--non-interactive")
+        args.append("--xml")
         args.append(ppath)
-        process.start('svn', args)
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(), ioEncoding,
-                             'replace')
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                 entryFound = False
                 commitFound = False
                 for line in output.splitlines():
                     line = line.strip()
-                    if line.startswith('<entry'):
+                    if line.startswith("<entry"):
                         entryFound = True
-                    elif line.startswith('<commit'):
+                    elif line.startswith("<commit"):
                         commitFound = True
-                    elif line.startswith('</commit>'):
+                    elif line.startswith("</commit>"):
                         commitFound = False
                     elif line.startswith("revision="):
-                        rev = line[line.find('"') + 1:line.rfind('"')]
+                        rev = line[line.find('"') + 1 : line.rfind('"')]
                         if entryFound:
-                            info['revision'] = rev
+                            info["revision"] = rev
                             entryFound = False
                         elif commitFound:
-                            info['committed-rev'] = rev
-                    elif line.startswith('<url>'):
-                        info['url'] = (
-                            line.replace('<url>', '').replace('</url>', '')
-                        )
-                    elif line.startswith('<author>'):
-                        info['last-author'] = (
-                            line.replace('<author>', '')
-                            .replace('</author>', '')
+                            info["committed-rev"] = rev
+                    elif line.startswith("<url>"):
+                        info["url"] = line.replace("<url>", "").replace("</url>", "")
+                    elif line.startswith("<author>"):
+                        info["last-author"] = line.replace("<author>", "").replace(
+                            "</author>", ""
                         )
-                    elif line.startswith('<date>'):
-                        value = (
-                            line.replace('<date>', '').replace('</date>', '')
+                    elif line.startswith("<date>"):
+                        value = line.replace("<date>", "").replace("</date>", "")
+                        date, time = value.split("T")
+                        info["committed-date"] = date
+                        info["committed-time"] = "{0}{1}".format(
+                            time.split(".")[0], time[-1]
                         )
-                        date, time = value.split('T')
-                        info['committed-date'] = date
-                        info['committed-time'] = "{0}{1}".format(
-                            time.split('.')[0], time[-1])
-        
+
         return QCoreApplication.translate(
-            'subversion',
+            "subversion",
             """<h3>Repository information</h3>"""
             """<table>"""
             """<tr><td><b>Subversion V.</b></td><td>{0}</td></tr>"""
@@ -1675,144 +1678,145 @@
             """<tr><td><b>Committed date</b></td><td>{4}</td></tr>"""
             """<tr><td><b>Comitted time</b></td><td>{5}</td></tr>"""
             """<tr><td><b>Last author</b></td><td>{6}</td></tr>"""
-            """</table>"""
-        ).format(self.versionStr,
-                 info['url'],
-                 info['revision'],
-                 info['committed-rev'],
-                 info['committed-date'],
-                 info['committed-time'],
-                 info['last-author'])
-    
+            """</table>""",
+        ).format(
+            self.versionStr,
+            info["url"],
+            info["revision"],
+            info["committed-rev"],
+            info["committed-date"],
+            info["committed-time"],
+            info["last-author"],
+        )
+
     ###########################################################################
     ## Public Subversion specific methods are below.
     ###########################################################################
-    
+
     def svnGetReposName(self, path):
         """
         Public method used to retrieve the URL of the subversion repository
         path.
-        
+
         @param path local path to get the svn repository path for (string)
         @return string with the repository path URL
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         process = QProcess()
         args = []
-        args.append('info')
-        args.append('--xml')
-        args.append('--non-interactive')
+        args.append("info")
+        args.append("--xml")
+        args.append("--non-interactive")
         args.append(path)
-        process.start('svn', args)
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(), ioEncoding,
-                             'replace')
+                output = str(process.readAllStandardOutput(), ioEncoding, "replace")
                 for line in output.splitlines():
                     line = line.strip()
-                    if line.startswith('<url>'):
-                        reposURL = (
-                            line.replace('<url>', '').replace('</url>', '')
-                        )
+                    if line.startswith("<url>"):
+                        reposURL = line.replace("<url>", "").replace("</url>", "")
                         return reposURL
-        
+
         return ""
 
     def vcsResolved(self, name):
         """
         Public method used to resolve conflicts of a file/directory.
-        
+
         @param name file/directory name to be resolved (string)
         """
         args = []
         if self.version >= (1, 5, 0):
-            args.append('resolve')
-            args.append('--accept')
-            args.append('working')
+            args.append("resolve")
+            args.append("--accept")
+            args.append("working")
         else:
-            args.append('resolved')
-        self.addArguments(args, self.options['global'])
+            args.append("resolved")
+        self.addArguments(args, self.options["global"])
         if isinstance(name, list):
             self.addArguments(args, name)
         else:
             if os.path.isdir(name):
-                args.append('--recursive')
+                args.append("--recursive")
             args.append(name)
-        
-        dia = SvnDialog(self.tr('Resolving conficts'))
+
+        dia = SvnDialog(self.tr("Resolving conficts"))
         res = dia.startProcess(args)
         if res:
             dia.exec()
         self.checkVCSStatus()
-    
+
     def svnCopy(self, name, project):
         """
         Public method used to copy a file/directory.
-        
+
         @param name file/directory name to be copied (string)
         @param project reference to the project object
         @return flag indicating successfull operation (boolean)
         """
         from .SvnCopyDialog import SvnCopyDialog
-        rx_prot = re.compile('(file:|svn:|svn+ssh:|http:|https:).+')
+
+        rx_prot = re.compile("(file:|svn:|svn+ssh:|http:|https:).+")
         dlg = SvnCopyDialog(name)
         res = False
         if dlg.exec() == QDialog.DialogCode.Accepted:
             target, force = dlg.getData()
-            
+
             args = []
-            args.append('copy')
-            self.addArguments(args, self.options['global'])
+            args.append("copy")
+            self.addArguments(args, self.options["global"])
             match = rx_prot.fullmatch(target)
             if match is not None:
-                args.append('--message')
-                args.append('Copying {0} to {1}'.format(name, target))
+                args.append("--message")
+                args.append("Copying {0} to {1}".format(name, target))
                 target = self.__svnURL(target)
             args.append(name)
             args.append(target)
-            
-            dia = SvnDialog(self.tr('Copying {0}')
-                            .format(name))
+
+            dia = SvnDialog(self.tr("Copying {0}").format(name))
             res = dia.startProcess(args)
             if res:
                 dia.exec()
                 res = dia.normalExit()
                 if (
-                    res and
-                    match is None and
-                    target.startswith(project.getProjectPath())
+                    res
+                    and match is None
+                    and target.startswith(project.getProjectPath())
                 ):
                     if os.path.isdir(name):
                         project.copyDirectory(name, target)
                     else:
                         project.appendFile(target)
         return res
-    
+
     def svnListProps(self, name, recursive=False):
         """
         Public method used to list the properties of a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
         if self.propList is None:
             from .SvnPropListDialog import SvnPropListDialog
+
             self.propList = SvnPropListDialog(self)
         self.propList.show()
         self.propList.raise_()
         self.propList.start(name, recursive)
-        
+
     def svnSetProp(self, name, recursive=False):
         """
         Public method used to add a property to a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
         from .SvnPropSetDialog import SvnPropSetDialog
+
         dlg = SvnPropSetDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             propName, fileFlag, propValue = dlg.getData()
@@ -1820,18 +1824,18 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Subversion Set Property"),
-                    self.tr("""You have to supply a property name."""
-                            """ Aborting."""))
+                    self.tr("""You have to supply a property name.""" """ Aborting."""),
+                )
                 return
-            
+
             args = []
-            args.append('propset')
-            self.addArguments(args, self.options['global'])
+            args.append("propset")
+            self.addArguments(args, self.options["global"])
             if recursive:
-                args.append('--recursive')
+                args.append("--recursive")
             args.append(propName)
             if fileFlag:
-                args.append('--file')
+                args.append("--file")
             args.append(propValue)
             if isinstance(name, list):
                 dname, fnames = self.splitPathList(name)
@@ -1839,16 +1843,16 @@
             else:
                 dname, fname = self.splitPath(name)
                 args.append(fname)
-            
-            dia = SvnDialog(self.tr('Subversion Set Property'))
+
+            dia = SvnDialog(self.tr("Subversion Set Property"))
             res = dia.startProcess(args, dname)
             if res:
                 dia.exec()
-        
+
     def svnDelProp(self, name, recursive=False):
         """
         Public method used to delete a property of a file/directory.
-        
+
         @param name file/directory name (string or list of strings)
         @param recursive flag indicating a recursive list is requested
         """
@@ -1856,24 +1860,25 @@
             None,
             self.tr("Subversion Delete Property"),
             self.tr("Enter property name"),
-            QLineEdit.EchoMode.Normal)
-        
+            QLineEdit.EchoMode.Normal,
+        )
+
         if not ok:
             return
-        
+
         if not propName:
             EricMessageBox.critical(
                 self.__ui,
                 self.tr("Subversion Delete Property"),
-                self.tr("""You have to supply a property name."""
-                        """ Aborting."""))
+                self.tr("""You have to supply a property name.""" """ Aborting."""),
+            )
             return
-        
+
         args = []
-        args.append('propdel')
-        self.addArguments(args, self.options['global'])
+        args.append("propdel")
+        self.addArguments(args, self.options["global"])
         if recursive:
-            args.append('--recursive')
+            args.append("--recursive")
         args.append(propName)
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
@@ -1881,22 +1886,23 @@
         else:
             dname, fname = self.splitPath(name)
             args.append(fname)
-        
-        dia = SvnDialog(self.tr('Subversion Delete Property'))
+
+        dia = SvnDialog(self.tr("Subversion Delete Property"))
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def svnListTagBranch(self, path, tags=True):
         """
         Public method used to list the available tags or branches.
-        
+
         @param path directory name of the project (string)
         @param tags flag indicating listing of branches or tags
                 (False = branches, True = tags)
         """
         if self.tagbranchList is None:
             from .SvnTagBranchListDialog import SvnTagBranchListDialog
+
             self.tagbranchList = SvnTagBranchListDialog(self)
         self.tagbranchList.show()
         self.tagbranchList.raise_()
@@ -1907,8 +1913,7 @@
             else:
                 self.tagsList = []
                 allTagsBranchesList = None
-            self.tagbranchList.start(path, tags,
-                                     self.tagsList, allTagsBranchesList)
+            self.tagbranchList.start(path, tags, self.tagsList, allTagsBranchesList)
         elif not tags:
             if not self.showedBranches:
                 self.showedBranches = True
@@ -1917,33 +1922,35 @@
                 self.branchesList = []
                 allTagsBranchesList = None
             self.tagbranchList.start(
-                path, tags, self.branchesList, self.allTagsBranchesList)
-        
+                path, tags, self.branchesList, self.allTagsBranchesList
+            )
+
     def svnBlame(self, name):
         """
         Public method to show the output of the svn blame command.
-        
+
         @param name file name to show the blame for (string)
         """
         if self.blame is None:
             from .SvnBlameDialog import SvnBlameDialog
+
             self.blame = SvnBlameDialog(self)
         self.blame.show()
         self.blame.raise_()
         self.blame.start(name)
-        
+
     def svnExtendedDiff(self, name):
         """
         Public method used to view the difference of a file/directory to the
         Subversion repository.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -1957,10 +1964,12 @@
                 if nam == project.ppath and not project.saveAllScripts():
                     return
         from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
+
         dlg = SvnRevisionSelectionDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             revisions = dlg.getRevisions()
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self)
             self.diff.show()
             self.diff.start(name, revisions)
@@ -1969,14 +1978,14 @@
         """
         Public method used to view the difference of a file/directory of two
         repository URLs.
-        
+
         If name is a directory and is the project directory, all project files
         are saved first. If name is a file (or list of files), which is/are
         being edited and has unsaved modification, they can be saved or the
         operation may be aborted.
-        
+
         This method gives the chance to enter the revisions to be compared.
-        
+
         @param name file/directory name to be diffed (string)
         """
         names = name[:] if isinstance(name, list) else [name]
@@ -1989,25 +1998,26 @@
                 project = ericApp().getObject("Project")
                 if nam == project.ppath and not project.saveAllScripts():
                     return
-        
+
         dname = self.splitPath(names[0])[0]
-        
+
         from .SvnUrlSelectionDialog import SvnUrlSelectionDialog
-        dlg = SvnUrlSelectionDialog(self, self.tagsList, self.branchesList,
-                                    dname)
+
+        dlg = SvnUrlSelectionDialog(self, self.tagsList, self.branchesList, dname)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             urls, summary = dlg.getURLs()
             from .SvnDiffDialog import SvnDiffDialog
+
             self.diff = SvnDiffDialog(self)
             self.diff.show()
             QApplication.processEvents()
             self.diff.start(name, urls=urls, summary=summary)
-        
+
     def __svnGetFileForRevision(self, name, rev=""):
         """
         Private method to get a file for a specific revision from the
         repository.
-        
+
         @param name file name to get from the repository (string)
         @param rev revision to retrieve (integer or string)
         @return contents of the file (string) and an error message (string)
@@ -2018,12 +2028,12 @@
             args.append("--revision")
             args.append(str(rev))
         args.append(name)
-        
+
         output = ""
         error = ""
-        
+
         process = QProcess()
-        process.start('svn', args)
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
@@ -2031,26 +2041,30 @@
                 if process.exitCode() == 0:
                     output = str(
                         process.readAllStandardOutput(),
-                        Preferences.getSystem("IOEncoding"), 'replace')
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    )
                 else:
                     error = str(
                         process.readAllStandardError(),
-                        Preferences.getSystem("IOEncoding"), 'replace')
+                        Preferences.getSystem("IOEncoding"),
+                        "replace",
+                    )
             else:
-                error = self.tr(
-                    "The svn process did not finish within 30s.")
+                error = self.tr("The svn process did not finish within 30s.")
         else:
             error = self.tr(
-                'The process {0} could not be started. '
-                'Ensure, that it is in the search path.').format('svn')
-        
+                "The process {0} could not be started. "
+                "Ensure, that it is in the search path."
+            ).format("svn")
+
         return output, error
-    
+
     def vcsSbsDiff(self, name, extended=False, revisions=None):
         """
         Public method used to view the difference of a file to the Mercurial
         repository side-by-side.
-        
+
         @param name file name to be diffed (string)
         @param extended flag indicating the extended variant (boolean)
         @param revisions tuple of two revisions (tuple of strings)
@@ -2058,9 +2072,10 @@
         """
         if isinstance(name, list):
             raise ValueError("Wrong parameter type")
-        
+
         if extended:
             from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
+
             dlg = SvnRevisionSelectionDialog()
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 rev1, rev2 = dlg.getRevisions()
@@ -2074,23 +2089,21 @@
             rev1, rev2 = revisions[0], revisions[1]
         else:
             rev1, rev2 = "", ""
-        
+
         output1, error = self.__svnGetFileForRevision(name, rev=rev1)
         if error:
             EricMessageBox.critical(
-                self.__ui,
-                self.tr("Subversion Side-by-Side Difference"),
-                error)
+                self.__ui, self.tr("Subversion Side-by-Side Difference"), error
+            )
             return
         name1 = "{0} (rev. {1})".format(name, rev1 and rev1 or ".")
-        
+
         if rev2:
             output2, error = self.__svnGetFileForRevision(name, rev=rev2)
             if error:
                 EricMessageBox.critical(
-                    self.__ui,
-                    self.tr("Subversion Side-by-Side Difference"),
-                    error)
+                    self.__ui, self.tr("Subversion Side-by-Side Difference"), error
+                )
                 return
             name2 = "{0} (rev. {1})".format(name, rev2)
         else:
@@ -2102,37 +2115,40 @@
                 EricMessageBox.critical(
                     self.__ui,
                     self.tr("Subversion Side-by-Side Difference"),
-                    self.tr(
-                        """<p>The file <b>{0}</b> could not be read.</p>""")
-                    .format(name))
+                    self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                        name
+                    ),
+                )
                 return
-        
+
         if self.sbsDiff is None:
             from UI.CompareDialog import CompareDialog
+
             self.sbsDiff = CompareDialog()
         self.sbsDiff.show()
         self.sbsDiff.raise_()
         self.sbsDiff.compare(output1, output2, name1, name2)
-    
+
     def vcsLogBrowser(self, name, isFile=False):
         """
         Public method used to browse the log of a file/directory from the
         Subversion repository.
-        
+
         @param name file/directory name to show the log of (string)
         @param isFile flag indicating log for a file is to be shown (boolean)
         """
         if self.logBrowser is None:
             from .SvnLogBrowserDialog import SvnLogBrowserDialog
+
             self.logBrowser = SvnLogBrowserDialog(self)
         self.logBrowser.show()
         self.logBrowser.raise_()
         self.logBrowser.start(name, isFile=isFile)
-        
+
     def svnLock(self, name, stealIt=False, parent=None):
         """
         Public method used to lock a file in the Subversion repository.
-        
+
         @param name file/directory name to be locked (string or list of
             strings)
         @param stealIt flag indicating a forced operation (boolean)
@@ -2140,27 +2156,26 @@
             (QWidget)
         """
         args = []
-        args.append('lock')
-        self.addArguments(args, self.options['global'])
+        args.append("lock")
+        self.addArguments(args, self.options["global"])
         if stealIt:
-            args.append('--force')
+            args.append("--force")
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
             self.addArguments(args, fnames)
         else:
             dname, fname = self.splitPath(name)
             args.append(fname)
-        
-        dia = SvnDialog(
-            self.tr('Locking in the Subversion repository'), parent)
+
+        dia = SvnDialog(self.tr("Locking in the Subversion repository"), parent)
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def svnUnlock(self, name, breakIt=False, parent=None):
         """
         Public method used to unlock a file in the Subversion repository.
-        
+
         @param name file/directory name to be unlocked (string or list of
             strings)
         @param breakIt flag indicating a forced operation (boolean)
@@ -2168,103 +2183,105 @@
             (QWidget)
         """
         args = []
-        args.append('unlock')
-        self.addArguments(args, self.options['global'])
+        args.append("unlock")
+        self.addArguments(args, self.options["global"])
         if breakIt:
-            args.append('--force')
+            args.append("--force")
         if isinstance(name, list):
             dname, fnames = self.splitPathList(name)
             self.addArguments(args, fnames)
         else:
             dname, fname = self.splitPath(name)
             args.append(fname)
-        
-        dia = SvnDialog(
-            self.tr('Unlocking in the Subversion repository'), parent)
+
+        dia = SvnDialog(self.tr("Unlocking in the Subversion repository"), parent)
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def svnRelocate(self, projectPath):
         """
         Public method to relocate the working copy to a new repository URL.
-        
+
         @param projectPath path name of the project (string)
         """
         from .SvnRelocateDialog import SvnRelocateDialog
+
         currUrl = self.svnGetReposName(projectPath)
         dlg = SvnRelocateDialog(currUrl)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             newUrl, inside = dlg.getData()
             args = []
-            args.append('switch')
+            args.append("switch")
             if not inside:
-                args.append('--relocate')
+                args.append("--relocate")
                 args.append(currUrl)
             args.append(newUrl)
             args.append(projectPath)
-            
-            dia = SvnDialog(self.tr('Relocating'))
+
+            dia = SvnDialog(self.tr("Relocating"))
             res = dia.startProcess(args)
             if res:
                 dia.exec()
-        
+
     def svnRepoBrowser(self, projectPath=None):
         """
         Public method to open the repository browser.
-        
+
         @param projectPath path name of the project (string)
         """
         url = self.svnGetReposName(projectPath) if projectPath else None
-        
+
         if url is None:
             url, ok = QInputDialog.getText(
                 None,
                 self.tr("Repository Browser"),
                 self.tr("Enter the repository URL."),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if not ok or not url:
                 return
-        
+
         if self.repoBrowser is None:
             from .SvnRepoBrowserDialog import SvnRepoBrowserDialog
+
             self.repoBrowser = SvnRepoBrowserDialog(self)
         self.repoBrowser.show()
         self.repoBrowser.raise_()
         self.repoBrowser.start(url)
-        
+
     def svnRemoveFromChangelist(self, names):
         """
         Public method to remove a file or directory from its changelist.
-        
+
         Note: Directories will be removed recursively.
-        
+
         @param names name or list of names of file or directory to remove
             (string)
         """
         args = []
-        args.append('changelist')
-        self.addArguments(args, self.options['global'])
-        args.append('--remove')
-        args.append('--recursive')
+        args.append("changelist")
+        self.addArguments(args, self.options["global"])
+        args.append("--remove")
+        args.append("--recursive")
         if isinstance(names, list):
             dname, fnames = self.splitPathList(names)
             self.addArguments(args, fnames)
         else:
             dname, fname = self.splitPath(names)
             args.append(fname)
-        
-        dia = SvnDialog(self.tr('Remove from changelist'))
+
+        dia = SvnDialog(self.tr("Remove from changelist"))
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def svnAddToChangelist(self, names):
         """
         Public method to add a file or directory to a changelist.
-        
+
         Note: Directories will be added recursively.
-        
+
         @param names name or list of names of file or directory to add
             (string)
         """
@@ -2273,14 +2290,16 @@
             self.tr("Add to changelist"),
             self.tr("Enter name of the changelist:"),
             sorted(self.svnGetChangelists()),
-            0, True)
+            0,
+            True,
+        )
         if not ok or not clname:
             return
 
         args = []
-        args.append('changelist')
-        self.addArguments(args, self.options['global'])
-        args.append('--recursive')
+        args.append("changelist")
+        self.addArguments(args, self.options["global"])
+        args.append("--recursive")
         args.append(clname)
         if isinstance(names, list):
             dname, fnames = self.splitPathList(names)
@@ -2288,51 +2307,54 @@
         else:
             dname, fname = self.splitPath(names)
             args.append(fname)
-        
-        dia = SvnDialog(self.tr('Remove from changelist'))
+
+        dia = SvnDialog(self.tr("Remove from changelist"))
         res = dia.startProcess(args, dname)
         if res:
             dia.exec()
-        
+
     def svnShowChangelists(self, path):
         """
         Public method used to inspect the change lists defined for the project.
-        
+
         @param path directory name to show change lists for (string)
         """
         from .SvnChangeListsDialog import SvnChangeListsDialog
+
         self.changeLists = SvnChangeListsDialog(self)
         self.changeLists.show()
         QApplication.processEvents()
         self.changeLists.start(path)
-        
+
     def svnGetChangelists(self):
         """
         Public method to get a list of all defined change lists.
-        
+
         @return list of defined change list names (list of strings)
         """
         changelists = []
-        rx_changelist = re.compile('--- \\S+ .([\\w\\s]+).:\\s*')
+        rx_changelist = re.compile("--- \\S+ .([\\w\\s]+).:\\s*")
         # three dashes, Changelist (translated), quote,
         # changelist name, quote, :
-        
+
         args = []
         args.append("status")
         args.append("--non-interactive")
         args.append(".")
-        
+
         ppath = ericApp().getObject("Project").getProjectPath()
         process = QProcess()
         process.setWorkingDirectory(ppath)
-        process.start('svn', args)
+        process.start("svn", args)
         procStarted = process.waitForStarted(5000)
         if procStarted:
             finished = process.waitForFinished(30000)
             if finished and process.exitCode() == 0:
-                output = str(process.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
+                output = str(
+                    process.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
                 if output:
                     for line in output.splitlines():
                         match = rx_changelist.fullmatch(line)
@@ -2340,20 +2362,20 @@
                             changelist = match.group(1)
                             if changelist not in changelists:
                                 changelists.append(changelist)
-        
+
         return changelists
-        
+
     def svnUpgrade(self, path):
         """
         Public method to upgrade the working copy format.
-        
+
         @param path directory name to show change lists for (string)
         """
         args = []
         args.append("upgrade")
         args.append(".")
-        
-        dia = SvnDialog(self.tr('Upgrade'))
+
+        dia = SvnDialog(self.tr("Upgrade"))
         res = dia.startProcess(args, path)
         if res:
             dia.exec()
@@ -2361,16 +2383,16 @@
     ###########################################################################
     ## Private Subversion specific methods are below.
     ###########################################################################
-    
+
     def __svnURL(self, url):
         """
         Private method to format a url for subversion.
-        
+
         @param url unformatted url string (string)
         @return properly formated url for subversion (string)
         """
         url = self.svnNormalizeURL(url)
-        url = url.split(':', 2)
+        url = url.split(":", 2)
         if len(url) == 3:
             scheme = url[0]
             host = url[1]
@@ -2391,7 +2413,7 @@
     def svnNormalizeURL(self, url):
         """
         Public method to normalize a url for subversion.
-        
+
         @param url url string (string)
         @return properly normalized url for subversion (string)
         """
@@ -2400,8 +2422,8 @@
             url = url[2:]
         if protocol == "file":
             url = os.path.normcase(url)
-        url = url.replace('\\', '/')
-        if url.endswith('/'):
+        url = url.replace("\\", "/")
+        if url.endswith("/"):
             url = url[:-1]
         if not url.startswith("/") and url[1] in [":", "|"]:
             url = "/{0}".format(url)
@@ -2410,13 +2432,12 @@
     ###########################################################################
     ## Methods to get the helper objects are below.
     ###########################################################################
-    
-    def vcsGetProjectBrowserHelper(self, browser, project,
-                                   isTranslationsBrowser=False):
+
+    def vcsGetProjectBrowserHelper(self, browser, project, isTranslationsBrowser=False):
         """
         Public method to instanciate a helper object for the different
         project browsers.
-        
+
         @param browser reference to the project browser object
         @param project reference to the project object
         @param isTranslationsBrowser flag indicating, the helper is requested
@@ -2424,27 +2445,23 @@
         @return the project browser helper object
         """
         from .ProjectBrowserHelper import SvnProjectBrowserHelper
-        return SvnProjectBrowserHelper(self, browser, project,
-                                       isTranslationsBrowser)
-        
+
+        return SvnProjectBrowserHelper(self, browser, project, isTranslationsBrowser)
+
     def vcsGetProjectHelper(self, project):
         """
         Public method to instanciate a helper object for the project.
-        
+
         @param project reference to the project object
         @return the project helper object
         """
         helper = self.__plugin.getProjectHelper()
         helper.setObjects(self, project)
         self.__wcng = (
-            os.path.exists(
-                os.path.join(project.getProjectPath(), ".svn", "format")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), "_svn", "format")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), ".svn", "wc.db")) or
-            os.path.exists(
-                os.path.join(project.getProjectPath(), "_svn", "wc.db"))
+            os.path.exists(os.path.join(project.getProjectPath(), ".svn", "format"))
+            or os.path.exists(os.path.join(project.getProjectPath(), "_svn", "format"))
+            or os.path.exists(os.path.join(project.getProjectPath(), ".svn", "wc.db"))
+            or os.path.exists(os.path.join(project.getProjectPath(), "_svn", "wc.db"))
         )
         return helper
 
@@ -2456,11 +2473,12 @@
         """
         Protected method to create an instance of the VCS status monitor
         thread.
-        
+
         @param interval check interval for the monitor thread in seconds
             (integer)
         @param project reference to the project object
         @return reference to the monitor thread (QThread)
         """
         from .SvnStatusMonitorThread import SvnStatusMonitorThread
+
         return SvnStatusMonitorThread(interval, project, self)
--- a/src/eric7/Plugins/ViewManagerPlugins/Listspace/Listspace.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/ViewManagerPlugins/Listspace/Listspace.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,13 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, QEvent, Qt
 from PyQt6.QtWidgets import (
-    QStackedWidget, QSplitter, QListWidget, QListWidgetItem, QSizePolicy,
-    QMenu, QApplication
+    QStackedWidget,
+    QSplitter,
+    QListWidget,
+    QListWidgetItem,
+    QSizePolicy,
+    QMenu,
+    QApplication,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -31,21 +36,22 @@
     """
     Class implementing a custimized StackedWidget.
     """
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.editors = []
-        
+
     def addWidget(self, assembly):
         """
         Public method to add a new widget.
-        
+
         @param assembly editor assembly object to be added
         @type QScintilla.EditorAssembly.EditorAssembly
         """
@@ -53,11 +59,11 @@
         super().addWidget(assembly)
         if editor not in self.editors:
             self.editors.append(editor)
-        
+
     def removeWidget(self, widget):
         """
         Public method to remove a widget.
-        
+
         @param widget widget to be removed
         @type QWidget
         """
@@ -65,11 +71,11 @@
             self.editors.remove(widget)
             widget = widget.parent()
         super().removeWidget(widget)
-        
+
     def currentWidget(self):
         """
         Public method to get a reference to the current editor.
-        
+
         @return reference to the current editor
         @rtype Editor
         """
@@ -77,11 +83,11 @@
         if widget is not None:
             widget = widget.getEditor()
         return widget
-        
+
     def setCurrentWidget(self, widget):
         """
         Public method to set the current widget.
-        
+
         @param widget widget to be made current
         @type QWidget
         """
@@ -91,18 +97,18 @@
                 self.editors.insert(0, widget)
                 widget = widget.parent()
             super().setCurrentWidget(widget)
-        
+
     def setCurrentIndex(self, index):
         """
         Public method to set the current widget by its index.
-        
+
         @param index index of widget to be made current
         @type int
         """
         widget = self.widget(index)
         if widget is not None:
             self.setCurrentWidget(widget)
-        
+
     def nextTab(self):
         """
         Public slot used to show the next tab.
@@ -110,7 +116,7 @@
         ind = self.currentIndex() + 1
         if ind == self.count():
             ind = 0
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
 
@@ -121,14 +127,14 @@
         ind = self.currentIndex() - 1
         if ind == -1:
             ind = self.count() - 1
-            
+
         self.setCurrentIndex(ind)
         self.currentWidget().setFocus()
 
     def hasEditor(self, editor):
         """
         Public method to check for an editor.
-        
+
         @param editor editor object to check for
         @type Editor
         @return flag indicating, whether the editor to be checked belongs
@@ -136,12 +142,12 @@
         @rtype bool
         """
         return editor in self.editors
-        
+
     def firstEditor(self):
         """
         Public method to retrieve the first editor in the list of managed
             editors.
-        
+
         @return first editor in list
         @rtype QScintilla.Editor.Editor
         """
@@ -151,7 +157,7 @@
 class Listspace(ViewManager):
     """
     Class implementing the listspace viewmanager class.
-    
+
     @signal changeCaption(str) emitted if a change of the caption is necessary
     @signal editorChanged(str) emitted when the current editor has changed
     @signal editorChangedEd(Editor) emitted when the current editor has changed
@@ -187,6 +193,7 @@
     @signal editorLineChangedEd(Editor,int) emitted to signal a change of an
         editor's current line (line is given one based)
     """
+
     changeCaption = pyqtSignal(str)
     editorChanged = pyqtSignal(str)
     editorChangedEd = pyqtSignal(Editor)
@@ -210,30 +217,29 @@
     editorTextChanged = pyqtSignal(Editor)
     editorLineChanged = pyqtSignal(str, int)
     editorLineChangedEd = pyqtSignal(Editor, int)
-    
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent parent widget
         @type QWidget
         """
         self.stacks = []
-        
+
         self.__splitter = QSplitter(parent)
         ViewManager.__init__(self)
         self.__splitter.setChildrenCollapsible(False)
-        
+
         self.viewlist = QListWidget(self)
         policy = self.viewlist.sizePolicy()
         policy.setHorizontalPolicy(QSizePolicy.Policy.Ignored)
         self.viewlist.setSizePolicy(policy)
         self.__splitter.addWidget(self.viewlist)
-        self.viewlist.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.viewlist.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.viewlist.currentRowChanged.connect(self.__showSelectedView)
         self.viewlist.customContextMenuRequested.connect(self.__showMenu)
-        
+
         self.stackArea = QSplitter(self)
         self.stackArea.setChildrenCollapsible(False)
         self.__splitter.addWidget(self.stackArea)
@@ -244,15 +250,14 @@
         self.currentStack = stack
         stack.currentChanged.connect(self.__currentChanged)
         stack.installEventFilter(self)
-        self.__splitter.setSizes(
-            [int(self.width() * 0.2), int(self.width() * 0.8)])
+        self.__splitter.setSizes([int(self.width() * 0.2), int(self.width() * 0.8)])
         # 20% for viewlist, 80% for the editors
         self.__inRemoveView = False
-        
+
         self.__initMenu()
         self.contextMenuEditor = None
         self.contextMenuIndex = -1
-        
+
     def __initMenu(self):
         """
         Private method to initialize the viewlist context menu.
@@ -260,64 +265,78 @@
         self.__startMenu = QMenu(self.tr("Start"), self)
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("runScript"),
-            self.tr('Run Script...'),
-            self.__contextMenuRunScript)
+            self.tr("Run Script..."),
+            self.__contextMenuRunScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("debugScript"),
-            self.tr('Debug Script...'),
-            self.__contextMenuDebugScript)
+            self.tr("Debug Script..."),
+            self.__contextMenuDebugScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("profileScript"),
-            self.tr('Profile Script...'),
-            self.__contextMenuProfileScript)
+            self.tr("Profile Script..."),
+            self.__contextMenuProfileScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("coverageScript"),
-            self.tr('Coverage run of Script...'),
-            self.__contextMenuCoverageScript)
-        
+            self.tr("Coverage run of Script..."),
+            self.__contextMenuCoverageScript,
+        )
+
         self.__menu = QMenu(self)
         self.__menu.addAction(
             UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'), self.__contextMenuClose)
+            self.tr("Close"),
+            self.__contextMenuClose,
+        )
         self.closeOthersMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
             self.tr("Close Others"),
-            self.__contextMenuCloseOthers)
-        self.__menu.addAction(
-            self.tr('Close All'), self.__contextMenuCloseAll)
+            self.__contextMenuCloseOthers,
+        )
+        self.__menu.addAction(self.tr("Close All"), self.__contextMenuCloseAll)
         self.__menu.addSeparator()
         self.saveMenuAct = self.__menu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr('Save'), self.__contextMenuSave)
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__contextMenuSave
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save As...'), self.__contextMenuSaveAs)
+            self.tr("Save As..."),
+            self.__contextMenuSaveAs,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("fileSaveAll"),
-            self.tr('Save All'), self.__contextMenuSaveAll)
+            self.tr("Save All"),
+            self.__contextMenuSaveAll,
+        )
         self.__menu.addSeparator()
         self.openRejectionsMenuAct = self.__menu.addAction(
-            self.tr("Open 'rejection' file"),
-            self.__contextMenuOpenRejections)
+            self.tr("Open 'rejection' file"), self.__contextMenuOpenRejections
+        )
         self.__menu.addSeparator()
         self.__startAct = self.__menu.addMenu(self.__startMenu)
         self.__menu.addSeparator()
         self.__menu.addAction(
             UI.PixmapCache.getIcon("printPreview"),
-            self.tr("Print Preview"), self.__contextMenuPrintPreviewFile)
+            self.tr("Print Preview"),
+            self.__contextMenuPrintPreviewFile,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("print"),
-            self.tr('Print'), self.__contextMenuPrintFile)
+            self.tr("Print"),
+            self.__contextMenuPrintFile,
+        )
         self.__menu.addSeparator()
         self.copyPathAct = self.__menu.addAction(
-            self.tr("Copy Path to Clipboard"),
-            self.__contextMenuCopyPathToClipboard)
-        
+            self.tr("Copy Path to Clipboard"), self.__contextMenuCopyPathToClipboard
+        )
+
     def __showMenu(self, point):
         """
         Private slot to handle the customContextMenuRequested signal of
         the viewlist.
-        
+
         @param point position to open the menu at
         @type QPoint
         """
@@ -328,78 +347,74 @@
                 self.contextMenuEditor = self.editors[row]
                 self.contextMenuIndex = row
                 if self.contextMenuEditor:
-                    self.saveMenuAct.setEnabled(
-                        self.contextMenuEditor.isModified())
+                    self.saveMenuAct.setEnabled(self.contextMenuEditor.isModified())
                     fileName = self.contextMenuEditor.getFileName()
                     self.copyPathAct.setEnabled(bool(fileName))
                     if fileName:
                         rej = "{0}.rej".format(fileName)
-                        self.openRejectionsMenuAct.setEnabled(
-                            os.path.exists(rej))
-                        
+                        self.openRejectionsMenuAct.setEnabled(os.path.exists(rej))
+
                         ext = os.path.splitext(fileName)[1]
                         self.__startAct.setEnabled(
-                            ext in Preferences.getDebugger(
-                                "Python3Extensions").split()
+                            ext in Preferences.getDebugger("Python3Extensions").split()
                         )
                     else:
                         self.openRejectionsMenuAct.setEnabled(False)
                         self.__startAct.setEnabled(False)
-                    
-                    self.closeOthersMenuAct.setEnabled(
-                        self.viewlist.count() > 1)
-                    
+
+                    self.closeOthersMenuAct.setEnabled(self.viewlist.count() > 1)
+
                     self.__menu.popup(self.viewlist.mapToGlobal(point))
-    
+
     def mainWidget(self):
         """
         Public method to return a reference to the main Widget of a
         specific view manager subclass.
-        
+
         @return reference to the main widget
         @rtype QWidget
         """
         return self.__splitter
-        
+
     def canCascade(self):
         """
         Public method to signal if cascading of managed windows is available.
-        
+
         @return flag indicating cascading of windows is available
         @rtype bool
         """
         return False
-        
+
     def canTile(self):
         """
         Public method to signal if tiling of managed windows is available.
-        
+
         @return flag indicating tiling of windows is available
         @rtype bool
         """
         return False
-    
+
     def canSplit(self):
         """
         public method to signal if splitting of the view is available.
-        
+
         @return flag indicating splitting of the view is available
         @rtype bool
         """
         return True
-        
+
     def tile(self):
         """
         Public method to tile the managed windows.
         """
         pass
-        
+
     def cascade(self):
         """
         Public method to cascade the managed windows.
         """
         pass
-        
+
     def _removeAllViews(self):
         """
         Protected method to remove all views (i.e. windows).
@@ -411,11 +426,11 @@
                     stack.removeWidget(win)
                     break
             win.closeIt()
-        
+
     def _removeView(self, win):
         """
         Protected method to remove a view (i.e. window).
-        
+
         @param win editor window to be removed
         @type Editor
         """
@@ -439,7 +454,7 @@
                 return
         stack.setCurrentWidget(stack.firstEditor())
         self._showView(self.editors[ind].parent())
-        
+
         aw = self.activeWindow()
         fn = aw and aw.getFileName() or None
         if fn:
@@ -449,11 +464,11 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(aw)
-        
+
     def _addView(self, win, fn=None, noName="", addNext=False, indexes=None):
         """
         Protected method to add a view (i.e. window).
-        
+
         @param win editor assembly to be added
         @type EditorAssembly
         @param fn filename of this editor
@@ -492,8 +507,9 @@
             self.currentStack.setCurrentWidget(win)
         editor.captionChanged.connect(self.__captionChange)
         editor.cursorLineChanged.connect(
-            lambda lineno: self.__cursorLineChanged(lineno, editor))
-        
+            lambda lineno: self.__cursorLineChanged(lineno, editor)
+        )
+
         index = self.editors.index(editor)
         self.viewlist.setCurrentRow(index)
         editor.setFocus()
@@ -504,13 +520,13 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
     def __captionChange(self, cap, editor):
         """
         Private method to handle caption change signals from the editor.
-        
+
         Updates the listwidget text to reflect the new caption information.
-        
+
         @param cap Caption for the editor
         @type str
         @param editor Editor to update the caption for
@@ -519,11 +535,11 @@
         fn = editor.getFileName()
         if fn:
             self.setEditorName(editor, fn)
-        
+
     def __cursorLineChanged(self, lineno, editor):
         """
         Private slot to handle a change of the current editor's cursor line.
-        
+
         @param lineno line number of the editor's cursor (zero based)
         @type int
         @param editor reference to the editor
@@ -534,11 +550,11 @@
             if fn:
                 self.editorLineChanged.emit(fn, lineno + 1)
             self.editorLineChangedEd.emit(editor, lineno + 1)
-        
+
     def _showView(self, win, fn=None):
         """
         Protected method to show a view (i.e. window).
-        
+
         @param win editor assembly to be shown
         @type EditorAssembly
         @param fn filename of this editor
@@ -561,47 +577,47 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
     def __showSelectedView(self, row):
         """
         Private slot called to show a view selected in the list.
-        
+
         @param row row number of the item clicked on
         @type int
         """
         if row != -1:
             self._showView(self.editors[row].parent())
             self._checkActions(self.editors[row])
-        
+
     def activeWindow(self):
         """
         Public method to return the active (i.e. current) window.
-        
+
         @return reference to the active editor
         @rtype EditorAssembly
         """
         return self.currentStack.currentWidget()
-        
+
     def showWindowMenu(self, windowMenu):
         """
         Public method to set up the viewmanager part of the Window menu.
-        
+
         @param windowMenu reference to the window menu
         @type QMenu
         """
         pass
-        
+
     def _initWindowActions(self):
         """
         Protected method to define the user interface actions for window
         handling.
         """
         pass
-        
+
     def setEditorName(self, editor, newName):
         """
         Public method to change the displayed name of the editor.
-        
+
         @param editor editor window to be changed
         @type Editor
         @param newName new name to be shown
@@ -619,11 +635,11 @@
                 itm.setToolTip(newName)
             self.viewlist.setCurrentRow(currentRow)
             self.changeCaption.emit(newName)
-            
+
     def _modificationStatusChanged(self, m, editor):
         """
         Protected slot to handle the modificationStatusChanged signal.
-        
+
         @param m flag indicating the modification status
         @type bool
         @param editor editor window changed
@@ -645,11 +661,11 @@
             item.setIcon(UI.PixmapCache.getCombinedIcon(keys))
         self.viewlist.setCurrentRow(currentRow)
         self._checkActions(editor)
-        
+
     def _syntaxErrorToggled(self, editor):
         """
         Protected slot to handle the syntaxerrorToggled signal.
-        
+
         @param editor editor that sent the signal
         @type Editor
         """
@@ -668,9 +684,9 @@
         if item:
             item.setIcon(UI.PixmapCache.getCombinedIcon(keys))
         self.viewlist.setCurrentRow(currentRow)
-        
+
         ViewManager._syntaxErrorToggled(self, editor)
-        
+
     def addSplit(self):
         """
         Public method used to split the current view.
@@ -684,21 +700,20 @@
         stack.installEventFilter(self)
         size = (
             self.stackArea.width()
-            if self.stackArea.orientation() == Qt.Orientation.Horizontal else
-            self.stackArea.height()
+            if self.stackArea.orientation() == Qt.Orientation.Horizontal
+            else self.stackArea.height()
         )
-        self.stackArea.setSizes(
-            [int(size / len(self.stacks))] * len(self.stacks))
+        self.stackArea.setSizes([int(size / len(self.stacks))] * len(self.stacks))
         self.splitRemoveAct.setEnabled(True)
         self.nextSplitAct.setEnabled(True)
         self.prevSplitAct.setEnabled(True)
-        
+
     @pyqtSlot()
     def removeSplit(self, index=-1):
         """
         Public method used to remove the current split view or a split view
         by index.
-        
+
         @param index index of the split to be removed (-1 means to
             delete the current split)
         @type int
@@ -732,22 +747,22 @@
                     self.nextSplitAct.setEnabled(False)
                     self.prevSplitAct.setEnabled(False)
                 return True
-        
+
         return False
-        
+
     def splitCount(self):
         """
         Public method to get the number of splitted views.
-        
+
         @return number of splitted views
         @rtype int
         """
         return len(self.stacks)
-        
+
     def setSplitCount(self, count):
         """
         Public method to set the number of split views.
-        
+
         @param count number of split views
         @type int
         """
@@ -758,25 +773,25 @@
             while self.splitCount() > count:
                 # use an arbitrarily large index to remove the last one
                 self.removeSplit(index=100)
-        
+
     def getSplitOrientation(self):
         """
         Public method to get the orientation of the split view.
-        
+
         @return orientation of the split
         @rtype Qt.Orientation.Horizontal or Qt.Orientation.Vertical
         """
         return self.stackArea.orientation()
-        
+
     def setSplitOrientation(self, orientation):
         """
         Public method used to set the orientation of the split view.
-        
+
         @param orientation orientation of the split
         @type Qt.Orientation.Horizontal or Qt.Orientation.Vertical
         """
         self.stackArea.setOrientation(orientation)
-        
+
     def nextSplit(self):
         """
         Public slot used to move to the next split.
@@ -786,18 +801,18 @@
         ind = self.stacks.index(self.currentStack) + 1
         if ind == len(self.stacks):
             ind = 0
-        
+
         self.currentStack = self.stacks[ind]
         if _hasFocus:
             aw = self.activeWindow()
             if aw:
                 aw.setFocus()
-        
+
         cw = self.currentStack.currentWidget()
         if cw:
             index = self.editors.index(cw)
             self.viewlist.setCurrentRow(index)
-        
+
     def prevSplit(self):
         """
         Public slot used to move to the previous split.
@@ -807,37 +822,36 @@
         ind = self.stacks.index(self.currentStack) - 1
         if ind == -1:
             ind = len(self.stacks) - 1
-        
+
         self.currentStack = self.stacks[ind]
         if _hasFocus:
             aw = self.activeWindow()
             if aw:
                 aw.setFocus()
-        
+
         cw = self.currentStack.currentWidget()
         if cw:
             index = self.editors.index(cw)
             self.viewlist.setCurrentRow(index)
-        
+
     def __contextMenuClose(self):
         """
         Private method to close the selected editor.
         """
         if self.contextMenuEditor:
             self.closeEditorWindow(self.contextMenuEditor)
-        
+
     def __contextMenuCloseOthers(self):
         """
         Private method to close the other editors.
         """
         index = self.contextMenuIndex
-        for i in (
-            list(range(self.viewlist.count() - 1, index, -1)) +
-            list(range(index - 1, -1, -1))
+        for i in list(range(self.viewlist.count() - 1, index, -1)) + list(
+            range(index - 1, -1, -1)
         ):
             editor = self.editors[i]
             self.closeEditorWindow(editor)
-        
+
     def __contextMenuCloseAll(self):
         """
         Private method to close all editors.
@@ -845,27 +859,27 @@
         savedEditors = self.editors[:]
         for editor in savedEditors:
             self.closeEditorWindow(editor)
-        
+
     def __contextMenuSave(self):
         """
         Private method to save the selected editor.
         """
         if self.contextMenuEditor:
             self.saveEditorEd(self.contextMenuEditor)
-        
+
     def __contextMenuSaveAs(self):
         """
         Private method to save the selected editor to a new file.
         """
         if self.contextMenuEditor:
             self.saveAsEditorEd(self.contextMenuEditor)
-        
+
     def __contextMenuSaveAll(self):
         """
         Private method to save all editors.
         """
         self.saveEditorsList(self.editors)
-        
+
     def __contextMenuOpenRejections(self):
         """
         Private slot to open a rejections file associated with the selected
@@ -877,21 +891,21 @@
                 rej = "{0}.rej".format(fileName)
                 if os.path.exists(rej):
                     self.openSourceFile(rej)
-        
+
     def __contextMenuPrintFile(self):
         """
         Private method to print the selected editor.
         """
         if self.contextMenuEditor:
             self.printEditor(self.contextMenuEditor)
-    
+
     def __contextMenuPrintPreviewFile(self):
         """
         Private method to show a print preview of the selected editor.
         """
         if self.contextMenuEditor:
             self.printPreviewEditor(self.contextMenuEditor)
-    
+
     def __contextMenuCopyPathToClipboard(self):
         """
         Private method to copy the file name of the selected editor to the
@@ -902,7 +916,7 @@
             if fn:
                 cb = QApplication.clipboard()
                 cb.setText(fn)
-    
+
     def __contextMenuRunScript(self):
         """
         Private method to run the editor script.
@@ -911,7 +925,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doRun(False, script=fn)
-    
+
     def __contextMenuDebugScript(self):
         """
         Private method to debug the editor script.
@@ -920,7 +934,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doDebug(False, script=fn)
-    
+
     def __contextMenuProfileScript(self):
         """
         Private method to profile the editor script.
@@ -929,7 +943,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doProfile(False, script=fn)
-    
+
     def __contextMenuCoverageScript(self):
         """
         Private method to run a coverage test of the editor script.
@@ -938,21 +952,21 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doCoverage(False, script=fn)
-    
+
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged signal.
-        
+
         @param index index of the current editor
         @type int
         """
         if index == -1 or not self.editors:
             return
-        
+
         editor = self.activeWindow()
         if editor is None:
             return
-        
+
         self._checkActions(editor)
         editor.setFocus()
         fn = editor.getFileName()
@@ -960,19 +974,18 @@
             self.changeCaption.emit(fn)
             if not self.__inRemoveView:
                 self.editorChanged.emit(fn)
-                self.editorLineChanged.emit(
-                    fn, editor.getCursorPosition()[0] + 1)
+                self.editorLineChanged.emit(fn, editor.getCursorPosition()[0] + 1)
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
         cindex = self.editors.index(editor)
         self.viewlist.setCurrentRow(cindex)
-        
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched the QObject being watched
         @type QObject
         @param event the event that occurred
@@ -981,8 +994,8 @@
         @rtype bool
         """
         if (
-            event.type() == QEvent.Type.MouseButtonPress and
-            event.button() != Qt.MouseButton.RightButton
+            event.type() == QEvent.Type.MouseButtonPress
+            and event.button() != Qt.MouseButton.RightButton
         ):
             switched = True
             if isinstance(watched, QStackedWidget):
@@ -998,7 +1011,7 @@
             if currentWidget:
                 index = self.editors.index(currentWidget)
                 self.viewlist.setCurrentRow(index)
-            
+
             aw = self.activeWindow()
             if aw is not None:
                 self._checkActions(aw)
@@ -1008,21 +1021,20 @@
                     self.changeCaption.emit(fn)
                     if switched:
                         self.editorChanged.emit(fn)
-                        self.editorLineChanged.emit(
-                            fn, aw.getCursorPosition()[0] + 1)
+                        self.editorLineChanged.emit(fn, aw.getCursorPosition()[0] + 1)
                 else:
                     self.changeCaption.emit("")
                 self.editorChangedEd.emit(aw)
-        
+
         return False
-        
+
     def getOpenEditorsForSession(self):
         """
         Public method to get a lists of all open editors.
-        
+
         The returned list contains one list per split view. If the view manager
         cannot split the view, only one list of editors is returned.
-        
+
         @return list of list of editor references
         @rtype list of list of Editor
         """
--- a/src/eric7/Plugins/ViewManagerPlugins/Listspace/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/ViewManagerPlugins/Listspace/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
- 
+
 # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
 #
- 
+
 """
 Package containing the listspace view manager plugin.
 """
--- a/src/eric7/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/ViewManagerPlugins/Tabview/Tabview.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,12 +10,25 @@
 import os
 
 from PyQt6.QtCore import (
-    pyqtSlot, QPoint, pyqtSignal, QEvent, QByteArray, QMimeData, Qt, QSize
+    pyqtSlot,
+    QPoint,
+    pyqtSignal,
+    QEvent,
+    QByteArray,
+    QMimeData,
+    Qt,
+    QSize,
 )
 from PyQt6.QtGui import QColor, QDrag, QPixmap, QMouseEvent
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QSplitter, QTabBar, QApplication, QToolButton,
-    QMenu, QLabel
+    QWidget,
+    QHBoxLayout,
+    QSplitter,
+    QTabBar,
+    QApplication,
+    QToolButton,
+    QMenu,
+    QLabel,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -40,7 +53,7 @@
 class TabBar(EricWheelTabBar):
     """
     Class implementing a customized tab bar supporting drag & drop.
-    
+
     @signal tabMoveRequested(int, int) emitted to signal a tab move request
         giving the old and new index position
     @signal tabRelocateRequested(str, int, int) emitted to signal a tab
@@ -52,44 +65,45 @@
     @signal tabCopyRequested(int, int) emitted to signal a clone request giving
         the old and new index position
     """
+
     tabMoveRequested = pyqtSignal(int, int)
     tabRelocateRequested = pyqtSignal(str, int, int)
     tabCopyRequested = pyqtSignal((str, int, int), (int, int))
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setAcceptDrops(True)
-        
+
         self.__dragStartPos = QPoint()
-    
+
     def mousePressEvent(self, event):
         """
         Protected method to handle mouse press events.
-        
+
         @param event reference to the mouse press event
         @type QMouseEvent
         """
         if event.button() == Qt.MouseButton.LeftButton:
             self.__dragStartPos = QPoint(event.position().toPoint())
         super().mousePressEvent(event)
-    
+
     def mouseMoveEvent(self, event):
         """
         Protected method to handle mouse move events.
-        
+
         @param event reference to the mouse move event
         @type QMouseEvent
         """
         if (
-            event.buttons() == Qt.MouseButton.LeftButton and
-            (event.position().toPoint() - self.__dragStartPos)
-            .manhattanLength() > QApplication.startDragDistance()
+            event.buttons() == Qt.MouseButton.LeftButton
+            and (event.position().toPoint() - self.__dragStartPos).manhattanLength()
+            > QApplication.startDragDistance()
         ):
             drag = QDrag(self)
             mimeData = QMimeData()
@@ -98,41 +112,41 @@
             mimeData.setData("action", b"tab-reordering")
             mimeData.setData("tabbar-id", str(id(self)).encode("utf-8"))
             mimeData.setData(
-                "source-index",
-                QByteArray.number(self.tabAt(self.__dragStartPos)))
+                "source-index", QByteArray.number(self.tabAt(self.__dragStartPos))
+            )
             mimeData.setData(
-                "tabwidget-id",
-                str(id(self.parentWidget())).encode("utf-8"))
+                "tabwidget-id", str(id(self.parentWidget())).encode("utf-8")
+            )
             drag.setMimeData(mimeData)
             if event.modifiers() == Qt.KeyboardModifier.ShiftModifier:
                 drag.exec(Qt.DropAction.CopyAction)
             elif event.modifiers() == Qt.KeyboardModifier.NoModifier:
                 drag.exec(Qt.DropAction.MoveAction)
         super().mouseMoveEvent(event)
-    
+
     def dragEnterEvent(self, event):
         """
         Protected method to handle drag enter events.
-        
+
         @param event reference to the drag enter event
         @type QDragEnterEvent
         """
         mimeData = event.mimeData()
         formats = mimeData.formats()
         if (
-            "action" in formats and
-            mimeData.data("action") == b"tab-reordering" and
-            "tabbar-id" in formats and
-            "source-index" in formats and
-            "tabwidget-id" in formats
+            "action" in formats
+            and mimeData.data("action") == b"tab-reordering"
+            and "tabbar-id" in formats
+            and "source-index" in formats
+            and "tabwidget-id" in formats
         ):
             event.acceptProposedAction()
         super().dragEnterEvent(event)
-    
+
     def dropEvent(self, event):
         """
         Protected method to handle drop events.
-        
+
         @param event reference to the drop event
         @type QDropEvent
         """
@@ -143,12 +157,12 @@
         if oldID != id(self):
             parentID = int(mimeData.data("tabwidget-id"))
             if event.proposedAction() == Qt.DropAction.MoveAction:
-                self.tabRelocateRequested.emit(
-                    str(parentID), fromIndex, toIndex)
+                self.tabRelocateRequested.emit(str(parentID), fromIndex, toIndex)
                 event.acceptProposedAction()
             elif event.proposedAction() == Qt.DropAction.CopyAction:
                 self.tabCopyRequested[str, int, int].emit(
-                    str(parentID), fromIndex, toIndex)
+                    str(parentID), fromIndex, toIndex
+                )
                 event.acceptProposedAction()
         else:
             if fromIndex != toIndex:
@@ -165,77 +179,73 @@
     """
     Class implementing a custimized tab widget.
     """
+
     def __init__(self, vm):
         """
         Constructor
-        
+
         @param vm view manager widget
         @type Tabview
         """
         super().__init__()
-        
+
         self.__tabBar = TabBar(self)
         self.setTabBar(self.__tabBar)
         iconSize = self.__tabBar.iconSize()
-        self.__tabBar.setIconSize(
-            QSize(2 * iconSize.width(), iconSize.height()))
-        
+        self.__tabBar.setIconSize(QSize(2 * iconSize.width(), iconSize.height()))
+
         self.setUsesScrollButtons(True)
         self.setElideMode(Qt.TextElideMode.ElideNone)
         if isMacPlatform():
             self.setDocumentMode(True)
-        
+
         self.__tabBar.tabMoveRequested.connect(self.moveTab)
         self.__tabBar.tabRelocateRequested.connect(self.__relocateTab)
-        self.__tabBar.tabCopyRequested[str, int, int].connect(
-            self.__copyTabOther)
+        self.__tabBar.tabCopyRequested[str, int, int].connect(self.__copyTabOther)
         self.__tabBar.tabCopyRequested[int, int].connect(self.__copyTab)
-        
+
         self.vm = vm
         self.editors = []
-        
+
         self.indicator = EricLed(self)
         self.setCornerWidget(self.indicator, Qt.Corner.TopLeftCorner)
-        
+
         self.rightCornerWidget = QWidget(self)
         self.rightCornerWidgetLayout = QHBoxLayout(self.rightCornerWidget)
         self.rightCornerWidgetLayout.setContentsMargins(0, 0, 0, 0)
         self.rightCornerWidgetLayout.setSpacing(0)
-        
+
         self.__navigationMenu = QMenu(self)
         self.__navigationMenu.aboutToShow.connect(self.__showNavigationMenu)
         self.__navigationMenu.triggered.connect(self.__navigationMenuTriggered)
-        
+
         self.navigationButton = QToolButton(self)
         self.navigationButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
         self.navigationButton.setToolTip(self.tr("Show a navigation menu"))
-        self.navigationButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.navigationButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
         self.navigationButton.setMenu(self.__navigationMenu)
         self.navigationButton.setEnabled(False)
         self.rightCornerWidgetLayout.addWidget(self.navigationButton)
-        
+
         self.tabCloseRequested.connect(self.__closeRequested)
-        
+
         self.setCornerWidget(self.rightCornerWidget, Qt.Corner.TopRightCorner)
-        
+
         self.__initMenu()
         self.contextMenuEditor = None
         self.contextMenuIndex = -1
-        
+
         self.setTabContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customTabContextMenuRequested.connect(self.__showContextMenu)
-        
-        ericPic = QPixmap(
-            os.path.join(getConfig('ericPixDir'), 'eric_small.png'))
+
+        ericPic = QPixmap(os.path.join(getConfig("ericPixDir"), "eric_small.png"))
         self.emptyLabel = QLabel()
         self.emptyLabel.setPixmap(ericPic)
         self.emptyLabel.setAlignment(
-            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignHCenter)
-        super().addTab(
-            self.emptyLabel,
-            UI.PixmapCache.getIcon("empty"), "")
-        
+            Qt.AlignmentFlag.AlignVCenter | Qt.AlignmentFlag.AlignHCenter
+        )
+        super().addTab(self.emptyLabel, UI.PixmapCache.getIcon("empty"), "")
+
     def __initMenu(self):
         """
         Private method to initialize the tab context menu.
@@ -243,75 +253,98 @@
         self.__startMenu = QMenu(self.tr("Start"), self)
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("runScript"),
-            self.tr('Run Script...'),
-            self.__contextMenuRunScript)
+            self.tr("Run Script..."),
+            self.__contextMenuRunScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("debugScript"),
-            self.tr('Debug Script...'),
-            self.__contextMenuDebugScript)
+            self.tr("Debug Script..."),
+            self.__contextMenuDebugScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("profileScript"),
-            self.tr('Profile Script...'),
-            self.__contextMenuProfileScript)
+            self.tr("Profile Script..."),
+            self.__contextMenuProfileScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("coverageScript"),
-            self.tr('Coverage run of Script...'),
-            self.__contextMenuCoverageScript)
-        
+            self.tr("Coverage run of Script..."),
+            self.__contextMenuCoverageScript,
+        )
+
         self.__menu = QMenu(self)
         self.leftMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("1leftarrow"),
-            self.tr('Move Left'), self.__contextMenuMoveLeft)
+            self.tr("Move Left"),
+            self.__contextMenuMoveLeft,
+        )
         self.rightMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("1rightarrow"),
-            self.tr('Move Right'), self.__contextMenuMoveRight)
+            self.tr("Move Right"),
+            self.__contextMenuMoveRight,
+        )
         self.firstMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("2leftarrow"),
-            self.tr('Move First'), self.__contextMenuMoveFirst)
+            self.tr("Move First"),
+            self.__contextMenuMoveFirst,
+        )
         self.lastMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("2rightarrow"),
-            self.tr('Move Last'), self.__contextMenuMoveLast)
+            self.tr("Move Last"),
+            self.__contextMenuMoveLast,
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
             UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'), self.__contextMenuClose)
+            self.tr("Close"),
+            self.__contextMenuClose,
+        )
         self.closeOthersMenuAct = self.__menu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
-            self.tr("Close Others"), self.__contextMenuCloseOthers)
-        self.__menu.addAction(
-            self.tr('Close All'), self.__contextMenuCloseAll)
+            self.tr("Close Others"),
+            self.__contextMenuCloseOthers,
+        )
+        self.__menu.addAction(self.tr("Close All"), self.__contextMenuCloseAll)
         self.__menu.addSeparator()
         self.saveMenuAct = self.__menu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr('Save'), self.__contextMenuSave)
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__contextMenuSave
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save As...'), self.__contextMenuSaveAs)
+            self.tr("Save As..."),
+            self.__contextMenuSaveAs,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("fileSaveAll"),
-            self.tr('Save All'), self.__contextMenuSaveAll)
+            self.tr("Save All"),
+            self.__contextMenuSaveAll,
+        )
         self.__menu.addSeparator()
         self.openRejectionsMenuAct = self.__menu.addAction(
-            self.tr("Open 'rejection' file"),
-            self.__contextMenuOpenRejections)
+            self.tr("Open 'rejection' file"), self.__contextMenuOpenRejections
+        )
         self.__menu.addSeparator()
         self.__startAct = self.__menu.addMenu(self.__startMenu)
         self.__menu.addSeparator()
         self.__menu.addAction(
             UI.PixmapCache.getIcon("printPreview"),
-            self.tr("Print Preview"), self.__contextMenuPrintPreviewFile)
+            self.tr("Print Preview"),
+            self.__contextMenuPrintPreviewFile,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("print"),
-            self.tr('Print'), self.__contextMenuPrintFile)
+            self.tr("Print"),
+            self.__contextMenuPrintFile,
+        )
         self.__menu.addSeparator()
         self.copyPathAct = self.__menu.addAction(
-            self.tr("Copy Path to Clipboard"),
-            self.__contextMenuCopyPathToClipboard)
-        
+            self.tr("Copy Path to Clipboard"), self.__contextMenuCopyPathToClipboard
+        )
+
     def __showContextMenu(self, coord, index):
         """
         Private slot to show the tab context menu.
-        
+
         @param coord the position of the mouse pointer
         @type QPoint
         @param index index of the tab the menu is requested for
@@ -322,60 +355,58 @@
             if widget is not None:
                 self.contextMenuEditor = widget.getEditor()
                 if self.contextMenuEditor:
-                    self.saveMenuAct.setEnabled(
-                        self.contextMenuEditor.isModified())
+                    self.saveMenuAct.setEnabled(self.contextMenuEditor.isModified())
                     fileName = self.contextMenuEditor.getFileName()
                     self.copyPathAct.setEnabled(bool(fileName))
                     if fileName:
                         rej = "{0}.rej".format(fileName)
-                        self.openRejectionsMenuAct.setEnabled(
-                            os.path.exists(rej))
-                        
+                        self.openRejectionsMenuAct.setEnabled(os.path.exists(rej))
+
                         ext = os.path.splitext(fileName)[1]
                         self.__startAct.setEnabled(
-                            ext in Preferences.getDebugger(
-                                "Python3Extensions").split()
+                            ext in Preferences.getDebugger("Python3Extensions").split()
                         )
                     else:
                         self.openRejectionsMenuAct.setEnabled(False)
                         self.__startAct.setEnabled(False)
-                
+
                 self.contextMenuIndex = index
                 self.leftMenuAct.setEnabled(index > 0)
                 self.rightMenuAct.setEnabled(index < self.count() - 1)
                 self.firstMenuAct.setEnabled(index > 0)
                 self.lastMenuAct.setEnabled(index < self.count() - 1)
-                
+
                 self.closeOthersMenuAct.setEnabled(self.count() > 1)
-                
+
                 coord = self.mapToGlobal(coord)
                 self.__menu.popup(coord)
-        
+
     def __showNavigationMenu(self):
         """
         Private slot to show the navigation button menu.
         """
         self.__navigationMenu.clear()
         for index in range(self.count()):
-            act = self.__navigationMenu.addAction(self.tabIcon(index),
-                                                  self.tabText(index))
+            act = self.__navigationMenu.addAction(
+                self.tabIcon(index), self.tabText(index)
+            )
             act.setData(index)
-        
+
     def __navigationMenuTriggered(self, act):
         """
         Private slot called to handle the navigation button menu selection.
-        
+
         @param act reference to the selected action
         @type QAction
         """
         index = act.data()
         if index is not None:
             self.setCurrentIndex(index)
-        
+
     def showIndicator(self, on):
         """
         Public slot to set the indicator on or off.
-        
+
         @param on flag indicating the state of the indicator
         @type bool
         """
@@ -383,36 +414,36 @@
             self.indicator.setColor(QColor("green"))
         else:
             self.indicator.setColor(QColor("red"))
-        
+
     def addTab(self, assembly, title):
         """
         Public method to add a new tab.
-        
+
         @param assembly editor assembly object to be added
         @type QScintilla.EditorAssembly.EditorAssembly
         @param title title for the new tab
         @type str
         """
         editor = assembly.getEditor()
-        super().addTab(
-            assembly, UI.PixmapCache.getIcon("empty"), title)
+        super().addTab(assembly, UI.PixmapCache.getIcon("empty"), title)
         self.setTabsClosable(True)
         self.navigationButton.setEnabled(True)
-        
+
         if editor not in self.editors:
             self.editors.append(editor)
             editor.captionChanged.connect(self.__captionChange)
             editor.cursorLineChanged.connect(
-                lambda lineno: self.__cursorLineChanged(lineno, editor))
-        
+                lambda lineno: self.__cursorLineChanged(lineno, editor)
+            )
+
         emptyIndex = self.indexOf(self.emptyLabel)
         if emptyIndex > -1:
             self.removeTab(emptyIndex)
-        
+
     def insertWidget(self, index, assembly, title):
         """
         Public method to insert a new tab.
-        
+
         @param index index position for the new tab
         @type int
         @param assembly editor assembly object to be added
@@ -424,30 +455,30 @@
         """
         editor = assembly.getEditor()
         newIndex = super().insertTab(
-            index, assembly,
-            UI.PixmapCache.getIcon("empty"),
-            title)
+            index, assembly, UI.PixmapCache.getIcon("empty"), title
+        )
         self.setTabsClosable(True)
         self.navigationButton.setEnabled(True)
-        
+
         if editor not in self.editors:
             self.editors.append(editor)
             editor.captionChanged.connect(self.__captionChange)
             editor.cursorLineChanged.connect(
-                lambda lineno: self.__cursorLineChanged(lineno, editor))
+                lambda lineno: self.__cursorLineChanged(lineno, editor)
+            )
         emptyIndex = self.indexOf(self.emptyLabel)
         if emptyIndex > -1:
             self.removeTab(emptyIndex)
-        
+
         return newIndex
-        
+
     def __captionChange(self, cap, editor):
         """
         Private slot to handle Caption change signals from the editor.
-        
+
         Updates the tab text and tooltip text to reflect the new caption
         information.
-        
+
         @param cap Caption for the editor
         @type str
         @param editor Editor to update the caption for
@@ -459,24 +490,23 @@
                 txt = os.path.basename(fn)
             else:
                 txt = ericApp().getObject("Project").getRelativePath(fn)
-            
-            maxFileNameChars = Preferences.getUI(
-                "TabViewManagerFilenameLength")
+
+            maxFileNameChars = Preferences.getUI("TabViewManagerFilenameLength")
             if len(txt) > maxFileNameChars:
                 txt = "...{0}".format(txt[-maxFileNameChars:])
             if editor.isReadOnly():
                 txt = self.tr("{0} (ro)").format(txt)
-            
+
             assembly = editor.parent()
             index = self.indexOf(assembly)
             if index > -1:
                 self.setTabText(index, txt)
                 self.setTabToolTip(index, fn)
-        
+
     def __cursorLineChanged(self, lineno, editor):
         """
         Private slot to handle a change of the current editor's cursor line.
-        
+
         @param lineno line number of the editor's cursor (zero based)
         @type int
         @param editor reference to the editor
@@ -487,11 +517,11 @@
             if fn:
                 self.vm.editorLineChanged.emit(fn, lineno + 1)
             self.vm.editorLineChangedEd.emit(editor, lineno + 1)
-        
+
     def removeWidget(self, widget):
         """
         Public method to remove a widget.
-        
+
         @param widget widget to be removed
         @type QWidget
         """
@@ -504,18 +534,17 @@
             index = self.indexOf(widget)
         if index > -1:
             self.removeTab(index)
-        
+
         if not self.editors:
-            super().addTab(
-                self.emptyLabel, UI.PixmapCache.getIcon("empty"), "")
+            super().addTab(self.emptyLabel, UI.PixmapCache.getIcon("empty"), "")
             self.emptyLabel.show()
             self.setTabsClosable(False)
             self.navigationButton.setEnabled(False)
-        
+
     def __relocateTab(self, sourceId, sourceIndex, targetIndex):
         """
         Private method to relocate an editor from another TabWidget.
-        
+
         @param sourceId id of the TabWidget to get the editor from
         @type str
         @param sourceIndex index of the tab in the old tab widget
@@ -531,23 +560,23 @@
             icon = tw.tabIcon(sourceIndex)
             whatsThis = tw.tabWhatsThis(sourceIndex)
             assembly = tw.widget(sourceIndex)
-            
+
             # step 2: relocate the tab
             tw.removeWidget(assembly.getEditor())
             self.insertWidget(targetIndex, assembly, text)
-            
+
             # step 3: set the tab data again
             self.setTabIcon(targetIndex, icon)
             self.setTabToolTip(targetIndex, toolTip)
             self.setTabWhatsThis(targetIndex, whatsThis)
-            
+
             # step 4: set current widget
             self.setCurrentIndex(targetIndex)
-        
+
     def __copyTabOther(self, sourceId, sourceIndex, targetIndex):
         """
         Private method to copy an editor from another TabWidget.
-        
+
         @param sourceId id of the TabWidget to get the editor from
         @type str
         @param sourceIndex index of the tab in the old tab widget
@@ -559,14 +588,16 @@
         if tw is not None:
             editor = tw.widget(sourceIndex).getEditor()
             newEditor, assembly = self.vm.cloneEditor(
-                editor, editor.getFileType(), editor.getFileName())
-            self.vm.insertView(assembly, self, targetIndex,
-                               editor.getFileName(), editor.getNoName())
-        
+                editor, editor.getFileType(), editor.getFileName()
+            )
+            self.vm.insertView(
+                assembly, self, targetIndex, editor.getFileName(), editor.getNoName()
+            )
+
     def __copyTab(self, sourceIndex, targetIndex):
         """
         Private method to copy an editor.
-        
+
         @param sourceIndex index of the tab
         @type int
         @param targetIndex index position to place it to
@@ -574,14 +605,16 @@
         """
         editor = self.widget(sourceIndex).getEditor()
         newEditor, assembly = self.vm.cloneEditor(
-            editor, editor.getFileType(), editor.getFileName())
-        self.vm.insertView(assembly, self, targetIndex,
-                           editor.getFileName(), editor.getNoName())
-        
+            editor, editor.getFileType(), editor.getFileName()
+        )
+        self.vm.insertView(
+            assembly, self, targetIndex, editor.getFileName(), editor.getNoName()
+        )
+
     def currentWidget(self):
         """
         Public method to return a reference to the current page.
-        
+
         @return reference to the current page
         @rtype Editor
         """
@@ -589,20 +622,20 @@
             return None
         else:
             return super().currentWidget()
-        
+
     def setCurrentWidget(self, assembly):
         """
         Public method to set the current tab by the given editor assembly.
-        
+
         @param assembly editor assembly to determine current tab from
         @type EditorAssembly.EditorAssembly
         """
         super().setCurrentWidget(assembly)
-        
+
     def indexOf(self, widget):
         """
         Public method to get the tab index of the given editor.
-        
+
         @param widget widget to get the index for
         @type QLabel or Editor
         @return tab index of the editor
@@ -611,11 +644,11 @@
         if isinstance(widget, QScintilla.Editor.Editor):
             widget = widget.parent()
         return super().indexOf(widget)
-        
+
     def hasEditor(self, editor):
         """
         Public method to check for an editor.
-        
+
         @param editor editor object to check for
         @type Editor
         @return flag indicating, whether the editor to be checked belongs
@@ -623,35 +656,34 @@
         @rtype bool
         """
         return editor in self.editors
-        
+
     def hasEditors(self):
         """
         Public method to test, if any editor is managed.
-        
+
         @return flag indicating editors are managed
         @rtype bool
         """
         return len(self.editors) > 0
-        
+
     def __contextMenuClose(self):
         """
         Private method to close the selected tab.
         """
         if self.contextMenuEditor:
             self.vm.closeEditorWindow(self.contextMenuEditor)
-        
+
     def __contextMenuCloseOthers(self):
         """
         Private method to close the other tabs.
         """
         index = self.contextMenuIndex
-        for i in (
-            list(range(self.count() - 1, index, -1)) +
-            list(range(index - 1, -1, -1))
+        for i in list(range(self.count() - 1, index, -1)) + list(
+            range(index - 1, -1, -1)
         ):
             editor = self.widget(i).getEditor()
             self.vm.closeEditorWindow(editor)
-        
+
     def __contextMenuCloseAll(self):
         """
         Private method to close all tabs.
@@ -659,27 +691,27 @@
         savedEditors = self.editors[:]
         for editor in savedEditors:
             self.vm.closeEditorWindow(editor)
-        
+
     def __contextMenuSave(self):
         """
         Private method to save the selected tab.
         """
         if self.contextMenuEditor:
             self.vm.saveEditorEd(self.contextMenuEditor)
-        
+
     def __contextMenuSaveAs(self):
         """
         Private method to save the selected tab to a new file.
         """
         if self.contextMenuEditor:
             self.vm.saveAsEditorEd(self.contextMenuEditor)
-        
+
     def __contextMenuSaveAll(self):
         """
         Private method to save all tabs.
         """
         self.vm.saveEditorsList(self.editors)
-        
+
     def __contextMenuOpenRejections(self):
         """
         Private slot to open a rejections file associated with the selected
@@ -691,21 +723,21 @@
                 rej = "{0}.rej".format(fileName)
                 if os.path.exists(rej):
                     self.vm.openSourceFile(rej)
-        
+
     def __contextMenuPrintFile(self):
         """
         Private method to print the selected tab.
         """
         if self.contextMenuEditor:
             self.vm.printEditor(self.contextMenuEditor)
-    
+
     def __contextMenuPrintPreviewFile(self):
         """
         Private method to show a print preview of the selected tab.
         """
         if self.contextMenuEditor:
             self.vm.printPreviewEditor(self.contextMenuEditor)
-    
+
     def __contextMenuCopyPathToClipboard(self):
         """
         Private method to copy the file name of the selected tab to the
@@ -716,31 +748,31 @@
             if fn:
                 cb = QApplication.clipboard()
                 cb.setText(fn)
-        
+
     def __contextMenuMoveLeft(self):
         """
         Private method to move a tab one position to the left.
         """
         self.moveTab(self.contextMenuIndex, self.contextMenuIndex - 1)
-        
+
     def __contextMenuMoveRight(self):
         """
         Private method to move a tab one position to the right.
         """
         self.moveTab(self.contextMenuIndex, self.contextMenuIndex + 1)
-        
+
     def __contextMenuMoveFirst(self):
         """
         Private method to move a tab to the first position.
         """
         self.moveTab(self.contextMenuIndex, 0)
-        
+
     def __contextMenuMoveLast(self):
         """
         Private method to move a tab to the last position.
         """
         self.moveTab(self.contextMenuIndex, self.count() - 1)
-        
+
     def __contextMenuRunScript(self):
         """
         Private method to run the editor script.
@@ -749,7 +781,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doRun(False, script=fn)
-        
+
     def __contextMenuDebugScript(self):
         """
         Private method to debug the editor script.
@@ -758,7 +790,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doDebug(False, script=fn)
-        
+
     def __contextMenuProfileScript(self):
         """
         Private method to profile the editor script.
@@ -767,7 +799,7 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doProfile(False, script=fn)
-        
+
     def __contextMenuCoverageScript(self):
         """
         Private method to run a coverage test of the editor script.
@@ -776,26 +808,26 @@
             fn = self.contextMenuEditor.getFileName()
             if fn:
                 ericApp().getObject("DebugUI").doCoverage(False, script=fn)
-        
+
     def __closeButtonClicked(self):
         """
         Private method to handle the press of the close button.
         """
         self.vm.closeEditorWindow(self.currentWidget().getEditor())
-        
+
     def __closeRequested(self, index):
         """
         Private method to handle the press of the individual tab close button.
-        
+
         @param index index of the tab (integer)
         """
         if index >= 0:
             self.vm.closeEditorWindow(self.widget(index).getEditor())
-        
+
     def mouseDoubleClickEvent(self, event):
         """
         Protected method handling double click events.
-        
+
         @param event reference to the event object (QMouseEvent)
         """
         self.vm.newEditor()
@@ -804,7 +836,7 @@
 class Tabview(ViewManager):
     """
     Class implementing a tabbed viewmanager class embedded in a splitter.
-    
+
     @signal changeCaption(str) emitted if a change of the caption is necessary
     @signal editorChanged(str) emitted when the current editor has changed
     @signal editorChangedEd(Editor) emitted when the current editor has changed
@@ -840,6 +872,7 @@
     @signal editorLineChangedEd(Editor,int) emitted to signal a change of an
         editor's current line (line is given one based)
     """
+
     changeCaption = pyqtSignal(str)
     editorChanged = pyqtSignal(str)
     editorChangedEd = pyqtSignal(Editor)
@@ -863,20 +896,20 @@
     editorTextChanged = pyqtSignal(Editor)
     editorLineChanged = pyqtSignal(str, int)
     editorLineChangedEd = pyqtSignal(Editor, int)
-    
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent parent widget
         @type QWidget
         """
         self.tabWidgets = []
-        
+
         self.__splitter = QSplitter(parent)
         ViewManager.__init__(self)
         self.__splitter.setChildrenCollapsible(False)
-        
+
         tw = TabWidget(self)
         self.__splitter.addWidget(tw)
         self.tabWidgets.append(tw)
@@ -887,71 +920,70 @@
         tw.tabBar().installEventFilter(self)
         self.__splitter.setOrientation(Qt.Orientation.Vertical)
         self.__inRemoveView = False
-        
-        self.maxFileNameChars = Preferences.getUI(
-            "TabViewManagerFilenameLength")
+
+        self.maxFileNameChars = Preferences.getUI("TabViewManagerFilenameLength")
         self.filenameOnly = Preferences.getUI("TabViewManagerFilenameOnly")
-    
+
     def mainWidget(self):
         """
         Public method to return a reference to the main Widget of a
         specific view manager subclass.
-        
+
         @return reference to the main widget
         @rtype QWidget
         """
         return self.__splitter
-        
+
     def canCascade(self):
         """
         Public method to signal if cascading of managed windows is available.
-        
+
         @return flag indicating cascading of windows is available
         @rtype bool
         """
         return False
-        
+
     def canTile(self):
         """
         Public method to signal if tiling of managed windows is available.
-        
+
         @return flag indicating tiling of windows is available
         @rtype bool
         """
         return False
-        
+
     def canSplit(self):
         """
         public method to signal if splitting of the view is available.
-        
+
         @return flag indicating splitting of the view is available.
         @rtype bool
         """
         return True
-        
+
     def tile(self):
         """
         Public method to tile the managed windows.
         """
         pass
-        
+
     def cascade(self):
         """
         Public method to cascade the managed windows.
         """
         pass
-        
+
     def _removeAllViews(self):
         """
         Protected method to remove all views (i.e. windows).
         """
         for win in self.editors:
             self._removeView(win)
-        
+
     def _removeView(self, win):
         """
         Protected method to remove a view (i.e. window).
-        
+
         @param win editor window to be removed
         @type Editor
         """
@@ -962,13 +994,11 @@
                 break
         win.closeIt()
         self.__inRemoveView = False
-        
+
         # if this was the last editor in this view, switch to the next, that
         # still has open editors
-        for i in (
-            list(range(self.tabWidgets.index(tw), -1, -1)) +
-            list(range(self.tabWidgets.index(tw) + 1,
-                 len(self.tabWidgets)))
+        for i in list(range(self.tabWidgets.index(tw), -1, -1)) + list(
+            range(self.tabWidgets.index(tw) + 1, len(self.tabWidgets))
         ):
             if self.tabWidgets[i].hasEditors():
                 self.currentTabWidget.showIndicator(False)
@@ -976,7 +1006,7 @@
                 self.currentTabWidget.showIndicator(True)
                 self.activeWindow().setFocus()
                 break
-        
+
         aw = self.activeWindow()
         fn = aw and aw.getFileName() or None
         if fn:
@@ -986,11 +1016,11 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(aw)
-        
+
     def _addView(self, win, fn=None, noName="", addNext=False, indexes=None):
         """
         Protected method to add a view (i.e. window).
-        
+
         @param win editor assembly to be added
         @type EditorAssembly
         @param fn filename of this editor
@@ -1027,7 +1057,7 @@
             else:
                 txt = ericApp().getObject("Project").getRelativePath(fn)
             if len(txt) > self.maxFileNameChars:
-                txt = "...{0}".format(txt[-self.maxFileNameChars:])
+                txt = "...{0}".format(txt[-self.maxFileNameChars :])
             if not os.access(fn, os.W_OK):
                 txt = self.tr("{0} (ro)").format(txt)
             if addNext:
@@ -1053,11 +1083,11 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
     def insertView(self, win, tabWidget, index, fn=None, noName=""):
         """
         Public method to add a view (i.e. window).
-        
+
         @param win editor assembly to be inserted
         @type EditorAssembly
         @param tabWidget reference to the tab widget to insert the editor into
@@ -1082,7 +1112,7 @@
             else:
                 txt = ericApp().getObject("Project").getRelativePath(fn)
             if len(txt) > self.maxFileNameChars:
-                txt = "...{0}".format(txt[-self.maxFileNameChars:])
+                txt = "...{0}".format(txt[-self.maxFileNameChars :])
             if not os.access(fn, os.W_OK):
                 txt = self.tr("{0} (ro)").format(txt)
             nindex = tabWidget.insertWidget(index, win, txt)
@@ -1097,14 +1127,14 @@
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
         self._modificationStatusChanged(editor.isModified(), editor)
         self._checkActions(editor)
-        
+
     def _showView(self, win, fn=None):
         """
         Protected method to show a view (i.e. window).
-        
+
         @param win editor assembly to be shown
         @type EditorAssembly
         @param fn filename of this editor
@@ -1120,11 +1150,11 @@
                 self.currentTabWidget.showIndicator(True)
                 break
         editor.setFocus()
-        
+
     def activeWindow(self):
         """
         Public method to return the active (i.e. current) window.
-        
+
         @return reference to the active editor
         @rtype Editor
         """
@@ -1133,27 +1163,27 @@
             return cw.getEditor()
         else:
             return None
-        
+
     def showWindowMenu(self, windowMenu):
         """
         Public method to set up the viewmanager part of the Window menu.
-        
+
         @param windowMenu reference to the window menu
         @type QMenu
         """
         pass
-        
+
     def _initWindowActions(self):
         """
         Protected method to define the user interface actions for window
         handling.
         """
         pass
-        
+
     def setEditorName(self, editor, newName):
         """
         Public method to change the displayed name of the editor.
-        
+
         @param editor editor window to be changed
         @type Editor
         @param newName new name to be shown
@@ -1163,10 +1193,9 @@
             if self.filenameOnly:
                 tabName = os.path.basename(newName)
             else:
-                tabName = ericApp().getObject("Project").getRelativePath(
-                    newName)
+                tabName = ericApp().getObject("Project").getRelativePath(newName)
             if len(tabName) > self.maxFileNameChars:
-                tabName = "...{0}".format(tabName[-self.maxFileNameChars:])
+                tabName = "...{0}".format(tabName[-self.maxFileNameChars :])
             index = self.currentTabWidget.indexOf(editor)
             self.currentTabWidget.setTabText(index, tabName)
             self.currentTabWidget.setTabToolTip(index, newName)
@@ -1175,7 +1204,7 @@
     def _modificationStatusChanged(self, m, editor):
         """
         Protected slot to handle the modificationStatusChanged signal.
-        
+
         @param m flag indicating the modification status
         @type bool
         @param editor editor window changed
@@ -1196,11 +1225,11 @@
             keys.append("empty")
         tw.setTabIcon(index, UI.PixmapCache.getCombinedIcon(keys))
         self._checkActions(editor)
-        
+
     def _syntaxErrorToggled(self, editor):
         """
         Protected slot to handle the syntaxerrorToggled signal.
-        
+
         @param editor editor that sent the signal
         @type Editor
         """
@@ -1218,9 +1247,9 @@
         if not keys:
             keys.append("empty")
         tw.setTabIcon(index, UI.PixmapCache.getCombinedIcon(keys))
-        
+
         ViewManager._syntaxErrorToggled(self, editor)
-        
+
     def addSplit(self):
         """
         Public method used to split the current view.
@@ -1237,21 +1266,22 @@
         tw.tabBar().installEventFilter(self)
         size = (
             self.width()
-            if self.__splitter.orientation() == Qt.Orientation.Horizontal else
-            self.height()
+            if self.__splitter.orientation() == Qt.Orientation.Horizontal
+            else self.height()
         )
         self.__splitter.setSizes(
-            [int(size / len(self.tabWidgets))] * len(self.tabWidgets))
+            [int(size / len(self.tabWidgets))] * len(self.tabWidgets)
+        )
         self.splitRemoveAct.setEnabled(True)
         self.nextSplitAct.setEnabled(True)
         self.prevSplitAct.setEnabled(True)
-        
+
     @pyqtSlot()
     def removeSplit(self, index=-1):
         """
         Public method used to remove the current split view or a split view
         by index.
-        
+
         @param index index of the split to be removed (-1 means to
             delete the current split)
         @type int
@@ -1293,22 +1323,22 @@
                     self.nextSplitAct.setEnabled(False)
                     self.prevSplitAct.setEnabled(False)
                 return True
-        
+
         return False
-        
+
     def splitCount(self):
         """
         Public method to get the number of splitted views.
-        
+
         @return number of splitted views
         @rtype int
         """
         return len(self.tabWidgets)
-        
+
     def setSplitCount(self, count):
         """
         Public method to set the number of split views.
-        
+
         @param count number of split views
         @type int
         """
@@ -1319,25 +1349,25 @@
             while self.splitCount() > count:
                 # use an arbitrarily large index to remove the last one
                 self.removeSplit(index=100)
-        
+
     def getSplitOrientation(self):
         """
         Public method to get the orientation of the split view.
-        
+
         @return orientation of the split
         @rtype Qt.Orientation.Horizontal or Qt.Orientation.Vertical
         """
         return self.__splitter.orientation()
-        
+
     def setSplitOrientation(self, orientation):
         """
         Public method used to set the orientation of the split view.
-        
+
         @param orientation orientation of the split
         @type Qt.Orientation.Horizontal or Qt.Orientation.Vertical
         """
         self.__splitter.setOrientation(orientation)
-        
+
     def nextSplit(self):
         """
         Public slot used to move to the next split.
@@ -1347,7 +1377,7 @@
         ind = self.tabWidgets.index(self.currentTabWidget) + 1
         if ind == len(self.tabWidgets):
             ind = 0
-        
+
         self.currentTabWidget.showIndicator(False)
         self.currentTabWidget = self.tabWidgets[ind]
         self.currentTabWidget.showIndicator(True)
@@ -1355,7 +1385,7 @@
             aw = self.activeWindow()
             if aw:
                 aw.setFocus()
-        
+
     def prevSplit(self):
         """
         Public slot used to move to the previous split.
@@ -1365,7 +1395,7 @@
         ind = self.tabWidgets.index(self.currentTabWidget) - 1
         if ind == -1:
             ind = len(self.tabWidgets) - 1
-        
+
         self.currentTabWidget.showIndicator(False)
         self.currentTabWidget = self.tabWidgets[ind]
         self.currentTabWidget.showIndicator(True)
@@ -1373,21 +1403,21 @@
             aw = self.activeWindow()
             if aw:
                 aw.setFocus()
-        
+
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged signal.
-        
+
         @param index index of the current tab
         @type int
         """
         if index == -1 or not self.editors:
             return
-        
+
         editor = self.activeWindow()
         if editor is None:
             return
-        
+
         self._checkActions(editor)
         editor.setFocus()
         fn = editor.getFileName()
@@ -1395,16 +1425,15 @@
             self.changeCaption.emit(fn)
             if not self.__inRemoveView:
                 self.editorChanged.emit(fn)
-                self.editorLineChanged.emit(
-                    fn, editor.getCursorPosition()[0] + 1)
+                self.editorLineChanged.emit(fn, editor.getCursorPosition()[0] + 1)
         else:
             self.changeCaption.emit("")
         self.editorChangedEd.emit(editor)
-        
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched the QObject being watched
         @type QObject
         @param event the event that occurred
@@ -1413,9 +1442,9 @@
         @rtype bool
         """
         if (
-            event.type() == QEvent.Type.MouseButtonPress and
-            isinstance(event, QMouseEvent) and
-            event.button() != Qt.MouseButton.RightButton
+            event.type() == QEvent.Type.MouseButtonPress
+            and isinstance(event, QMouseEvent)
+            and event.button() != Qt.MouseButton.RightButton
         ):
             switched = True
             self.currentTabWidget.showIndicator(False)
@@ -1426,11 +1455,9 @@
                 switched = watched.parent() is not self.currentTabWidget
                 self.currentTabWidget = watched.parent()
                 if switched:
-                    index = self.currentTabWidget.selectTab(
-                        event.position().toPoint())
+                    index = self.currentTabWidget.selectTab(event.position().toPoint())
                     switched = (
-                        self.currentTabWidget.widget(index) is
-                        self.activeWindow()
+                        self.currentTabWidget.widget(index) is self.activeWindow()
                     )
             elif isinstance(watched, QScintilla.Editor.Editor):
                 for tw in self.tabWidgets:
@@ -1439,7 +1466,7 @@
                         self.currentTabWidget = tw
                         break
             self.currentTabWidget.showIndicator(True)
-            
+
             aw = self.activeWindow()
             if aw is not None:
                 self._checkActions(aw)
@@ -1449,24 +1476,22 @@
                     self.changeCaption.emit(fn)
                     if switched:
                         self.editorChanged.emit(fn)
-                        self.editorLineChanged.emit(
-                            fn, aw.getCursorPosition()[0] + 1)
+                        self.editorLineChanged.emit(fn, aw.getCursorPosition()[0] + 1)
                 else:
                     self.changeCaption.emit("")
                 self.editorChangedEd.emit(aw)
-        
+
         return False
-        
+
     def preferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
         """
         ViewManager.preferencesChanged(self)
-        
-        self.maxFileNameChars = Preferences.getUI(
-            "TabViewManagerFilenameLength")
+
+        self.maxFileNameChars = Preferences.getUI("TabViewManagerFilenameLength")
         self.filenameOnly = Preferences.getUI("TabViewManagerFilenameOnly")
-        
+
         for tabWidget in self.tabWidgets:
             for index in range(tabWidget.count()):
                 editor = tabWidget.widget(index)
@@ -1476,18 +1501,17 @@
                         if self.filenameOnly:
                             txt = os.path.basename(fn)
                         else:
-                            txt = ericApp().getObject(
-                                "Project").getRelativePath(fn)
+                            txt = ericApp().getObject("Project").getRelativePath(fn)
                         if len(txt) > self.maxFileNameChars:
-                            txt = "...{0}".format(txt[-self.maxFileNameChars:])
+                            txt = "...{0}".format(txt[-self.maxFileNameChars :])
                         if not os.access(fn, os.W_OK):
                             txt = self.tr("{0} (ro)").format(txt)
                         tabWidget.setTabText(index, txt)
-        
+
     def getTabWidgetById(self, id_):
         """
         Public method to get a reference to a tab widget knowing its ID.
-        
+
         @param id_ id of the tab widget
         @type int
         @return reference to the tab widget
@@ -1497,14 +1521,14 @@
             if id(tw) == id_:
                 return tw
         return None
-        
+
     def getOpenEditorsForSession(self):
         """
         Public method to get a lists of all open editors.
-        
+
         The returned list contains one list per split view. If the view manager
         cannot split the view, only one list of editors is returned.
-        
+
         @return list of list of editor references
         @rtype list of list of Editor
         """
--- a/src/eric7/Plugins/ViewManagerPlugins/Tabview/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/ViewManagerPlugins/Tabview/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
- 
+
 # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
 #
- 
+
 """
 Package containing the tabview view manager plugin.
 """
--- a/src/eric7/Plugins/ViewManagerPlugins/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/ViewManagerPlugins/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
- 
+
 # Copyright (c) 2007 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
 #
- 
+
 """
 Package containing the various view manager plugins.
 """
--- a/src/eric7/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,34 +21,36 @@
 class ColorDialogWizardDialog(QDialog, Ui_ColorDialogWizardDialog):
     """
     Class implementing the color dialog wizard dialog.
-    
+
     It displays a dialog for entering the parameters
     for the QColorDialog code generator.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
@@ -59,33 +61,43 @@
                 QColorDialog.getColor()
             else:
                 coStr = self.eColor.currentText()
-                if coStr.startswith('#'):
+                if coStr.startswith("#"):
                     coStr = "QColor('{0}')".format(coStr)
                 else:
                     coStr = "QColor({0})".format(coStr)
                 try:
-                    exec('from PyQt6.QtCore import Qt;'             # secok
-                         ' QColorDialog.getColor({0}, None, "{1}")'.format(
-                             coStr, self.eTitle.text()))
+                    exec(
+                        "from PyQt6.QtCore import Qt;"  # secok
+                        ' QColorDialog.getColor({0}, None, "{1}")'.format(
+                            coStr, self.eTitle.text()
+                        )
+                    )
                 except Exception:
                     EricMessageBox.critical(
                         self,
                         self.tr("QColorDialog Wizard Error"),
-                        self.tr(
-                            """<p>The color <b>{0}</b> is not valid.</p>""")
-                        .format(coStr))
-            
+                        self.tr("""<p>The color <b>{0}</b> is not valid.</p>""").format(
+                            coStr
+                        ),
+                    )
+
         elif self.rRGBA.isChecked():
             QColorDialog.getColor(
-                QColor(self.sRed.value(), self.sGreen.value(),
-                       self.sBlue.value(), self.sAlpha.value()),
-                None, self.eTitle.text(),
-                QColorDialog.ColorDialogOption.ShowAlphaChannel)
-        
+                QColor(
+                    self.sRed.value(),
+                    self.sGreen.value(),
+                    self.sBlue.value(),
+                    self.sAlpha.value(),
+                ),
+                None,
+                self.eTitle.text(),
+                QColorDialog.ColorDialogOption.ShowAlphaChannel,
+            )
+
     def on_eRGB_textChanged(self, text):
         """
         Private slot to handle the textChanged signal of eRGB.
-        
+
         @param text the new text (string)
         """
         if not text:
@@ -104,18 +116,18 @@
     def on_eColor_editTextChanged(self, text):
         """
         Private slot to handle the editTextChanged signal of eColor.
-        
+
         @param text the new text (string)
         """
-        if not text or text.startswith('Qt.') or text.startswith('#'):
+        if not text or text.startswith("Qt.") or text.startswith("#"):
             self.bTest.setEnabled(True)
         else:
             self.bTest.setEnabled(False)
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -124,7 +136,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.parentSelf.isChecked():
             parent = "self"
@@ -134,48 +146,47 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
+
         resvar = self.eResultVar.text()
         if not resvar:
             resvar = "color"
-        code = '{0} = QColorDialog.'.format(resvar)
+        code = "{0} = QColorDialog.".format(resvar)
         if self.rColor.isChecked():
-            code += 'getColor({0}'.format(os.linesep)
+            code += "getColor({0}".format(os.linesep)
             if self.eColor.currentText():
                 col = self.eColor.currentText()
-                if col.startswith('#'):
-                    code += '{0}QColor("{1}"),{2}'.format(
-                        istring, col, os.linesep)
+                if col.startswith("#"):
+                    code += '{0}QColor("{1}"),{2}'.format(istring, col, os.linesep)
                 else:
-                    code += '{0}QColor({1}),{2}'.format(
-                        istring, col, os.linesep)
+                    code += "{0}QColor({1}),{2}".format(istring, col, os.linesep)
             else:
-                code += '{0}QColor(Qt.GlobalColor.white),{1}'.format(
-                    istring, os.linesep)
-            code += '{0}{1},{2}'.format(istring, parent, os.linesep)
+                code += "{0}QColor(Qt.GlobalColor.white),{1}".format(
+                    istring, os.linesep
+                )
+            code += "{0}{1},{2}".format(istring, parent, os.linesep)
             code += '{0}self.tr("{1}"),{2}'.format(
-                istring, self.eTitle.text(), os.linesep)
-            code += (
-                '{0}QColorDialog.ColorDialogOption.ShowAlphaChannel'
-                .format(istring)
+                istring, self.eTitle.text(), os.linesep
             )
-            code += '{0}){0}'.format(estring)
+            code += "{0}QColorDialog.ColorDialogOption.ShowAlphaChannel".format(istring)
+            code += "{0}){0}".format(estring)
         elif self.rRGBA.isChecked():
-            code += 'getColor({0}'.format(os.linesep)
+            code += "getColor({0}".format(os.linesep)
             if not self.eRGB.text():
-                code += '{0}QColor({1:d}, {2:d}, {3:d}, {4:d}),{5}'.format(
-                    istring, self.sRed.value(), self.sGreen.value(),
-                    self.sBlue.value(), self.sAlpha.value(), os.linesep)
+                code += "{0}QColor({1:d}, {2:d}, {3:d}, {4:d}),{5}".format(
+                    istring,
+                    self.sRed.value(),
+                    self.sGreen.value(),
+                    self.sBlue.value(),
+                    self.sAlpha.value(),
+                    os.linesep,
+                )
             else:
-                code += '{0}{1},{2}'.format(
-                    istring, self.eRGB.text(), os.linesep)
-            code += '{0}{1},{2}'.format(istring, parent, os.linesep)
+                code += "{0}{1},{2}".format(istring, self.eRGB.text(), os.linesep)
+            code += "{0}{1},{2}".format(istring, parent, os.linesep)
             code += '{0}self.tr("{1}"),{2}'.format(
-                istring, self.eTitle.text(), os.linesep)
-            code += (
-                '{0}QColorDialog.ColorDialogOption.ShowAlphaChannel'
-                .format(istring)
+                istring, self.eTitle.text(), os.linesep
             )
-            code += '{0}){0}'.format(estring)
-        
+            code += "{0}QColorDialog.ColorDialogOption.ShowAlphaChannel".format(istring)
+            code += "{0}){0}".format(estring)
+
         return code
--- a/src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopListSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopListSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,11 +16,20 @@
     """
     Class implementing a dialog to select multiple entries from a list.
     """
-    def __init__(self, entries, selectedEntries, separator, subEntries=None,
-                 allowMultiMain=True, allowMultiSub=True, parent=None):
+
+    def __init__(
+        self,
+        entries,
+        selectedEntries,
+        separator,
+        subEntries=None,
+        allowMultiMain=True,
+        allowMultiSub=True,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param entries list of entries to be shown (list of string)
         @param selectedEntries list of entries to be selected (list of string
             or string of entries separated by separator)
@@ -34,22 +43,24 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if isinstance(selectedEntries, str):
             selectedEntries = selectedEntries.split(separator)
-        
+
         if not allowMultiMain:
             self.entriesList.setSelectionMode(
-                QAbstractItemView.SelectionMode.SingleSelection)
+                QAbstractItemView.SelectionMode.SingleSelection
+            )
         if not allowMultiSub:
             self.subList.setSelectionMode(
-                QAbstractItemView.SelectionMode.SingleSelection)
-        
+                QAbstractItemView.SelectionMode.SingleSelection
+            )
+
         for entry in entries:
             itm = QListWidgetItem(entry, self.entriesList)
             if entry in selectedEntries:
                 itm.setSelected(True)
-        
+
         if subEntries:
             for entry in subEntries:
                 itm = QListWidgetItem(entry, self.subList)
@@ -57,12 +68,12 @@
                     itm.setSelected(True)
         else:
             self.subList.setVisible(False)
-    
+
     def getData(self, separator=None, separatorAtEnd=False):
         """
         Public method to extract the selected entries as a list
         or a string.
-        
+
         @param separator separator string (string)
         @param separatorAtEnd flag indicating to append the separator (boolean)
         @return list of selected entries (list of string) if the separator is
@@ -73,7 +84,7 @@
             entries.append(itm.text())
         for itm in self.subList.selectedItems():
             entries.append(itm.text())
-        
+
         if separator is None:
             return entries
         else:
--- a/src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,90 +25,230 @@
     """
     Class implementing the .desktop wizard dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.__mainCategories = [
-            'AudioVideo', 'Audio', 'Video', 'Development', 'Education',
-            'Game', 'Graphics', 'Network', 'Office', 'Science', 'Settings',
-            'System', 'Utility',
+            "AudioVideo",
+            "Audio",
+            "Video",
+            "Development",
+            "Education",
+            "Game",
+            "Graphics",
+            "Network",
+            "Office",
+            "Science",
+            "Settings",
+            "System",
+            "Utility",
         ]
-        
+
         self.__subCategories = [
-            'Building', 'Debugger', 'IDE', 'GUIDesigner', 'Profiling',
-            'RevisionControl', 'Translation', 'Calendar', 'ContactManagement',
-            'Database', 'Dictionary', 'Chart', 'Email', 'Finance', 'FlowChart',
-            'PDA', 'ProjectManagement', 'Presentation', 'Spreadsheet',
-            'WordProcessor', '2DGraphics', 'VectorGraphics', 'RasterGraphics',
-            '3DGraphics', 'Scanning', 'OCR', 'Photography', 'Publishing',
-            'Viewer', 'TextTools', 'DesktopSettings', 'HardwareSettings',
-            'Printing', 'PackageManager', 'Dialup', 'InstantMessaging', 'Chat',
-            'IRCClient', 'Feed', 'FileTransfer', 'HamRadio', 'News', 'P2P',
-            'RemoteAccess', 'Telephony', 'TelephonyTools', 'VideoConference',
-            'WebBrowser', 'WebDevelopment', 'Midi', 'Mixer', 'Sequencer',
-            'Tuner', 'TV', 'AudioVideoEditing', 'Player', 'Recorder',
-            'DiscBurning', 'ActionGame', 'AdventureGame', 'ArcadeGame',
-            'BoardGame', 'BlocksGame', 'CardGame', 'KidsGame', 'LogicGame',
-            'RolePlaying', 'Shooter', 'Simulation', 'SportsGame',
-            'StrategyGame', 'Art', 'Construction', 'Music', 'Languages',
-            'ArtificialIntelligence', 'Astronomy', 'Biology', 'Chemistry',
-            'ComputerScience', 'DataVisualization', 'Economy', 'Electricity',
-            'Geography', 'Geology', 'Geoscience', 'History', 'Humanities',
-            'ImageProcessing', 'Literature', 'Maps', 'Math',
-            'NumericalAnalysis', 'MedicalSoftware', 'Physics', 'Robotics',
-            'Spirituality', 'Sports', 'ParallelComputing', 'Amusement',
-            'Archiving', 'Compression', 'Electronics', 'Emulator',
-            'Engineering', 'FileTools', 'FileManager', 'TerminalEmulator',
-            'Filesystem', 'Monitor', 'Security', 'Accessibility', 'Calculator',
-            'Clock', 'TextEditor', 'Documentation', 'Adult', 'Core', 'KDE',
-            'GNOME', 'XFCE', 'GTK', 'Qt', 'Motif', 'Java', 'ConsoleOnly',
+            "Building",
+            "Debugger",
+            "IDE",
+            "GUIDesigner",
+            "Profiling",
+            "RevisionControl",
+            "Translation",
+            "Calendar",
+            "ContactManagement",
+            "Database",
+            "Dictionary",
+            "Chart",
+            "Email",
+            "Finance",
+            "FlowChart",
+            "PDA",
+            "ProjectManagement",
+            "Presentation",
+            "Spreadsheet",
+            "WordProcessor",
+            "2DGraphics",
+            "VectorGraphics",
+            "RasterGraphics",
+            "3DGraphics",
+            "Scanning",
+            "OCR",
+            "Photography",
+            "Publishing",
+            "Viewer",
+            "TextTools",
+            "DesktopSettings",
+            "HardwareSettings",
+            "Printing",
+            "PackageManager",
+            "Dialup",
+            "InstantMessaging",
+            "Chat",
+            "IRCClient",
+            "Feed",
+            "FileTransfer",
+            "HamRadio",
+            "News",
+            "P2P",
+            "RemoteAccess",
+            "Telephony",
+            "TelephonyTools",
+            "VideoConference",
+            "WebBrowser",
+            "WebDevelopment",
+            "Midi",
+            "Mixer",
+            "Sequencer",
+            "Tuner",
+            "TV",
+            "AudioVideoEditing",
+            "Player",
+            "Recorder",
+            "DiscBurning",
+            "ActionGame",
+            "AdventureGame",
+            "ArcadeGame",
+            "BoardGame",
+            "BlocksGame",
+            "CardGame",
+            "KidsGame",
+            "LogicGame",
+            "RolePlaying",
+            "Shooter",
+            "Simulation",
+            "SportsGame",
+            "StrategyGame",
+            "Art",
+            "Construction",
+            "Music",
+            "Languages",
+            "ArtificialIntelligence",
+            "Astronomy",
+            "Biology",
+            "Chemistry",
+            "ComputerScience",
+            "DataVisualization",
+            "Economy",
+            "Electricity",
+            "Geography",
+            "Geology",
+            "Geoscience",
+            "History",
+            "Humanities",
+            "ImageProcessing",
+            "Literature",
+            "Maps",
+            "Math",
+            "NumericalAnalysis",
+            "MedicalSoftware",
+            "Physics",
+            "Robotics",
+            "Spirituality",
+            "Sports",
+            "ParallelComputing",
+            "Amusement",
+            "Archiving",
+            "Compression",
+            "Electronics",
+            "Emulator",
+            "Engineering",
+            "FileTools",
+            "FileManager",
+            "TerminalEmulator",
+            "Filesystem",
+            "Monitor",
+            "Security",
+            "Accessibility",
+            "Calculator",
+            "Clock",
+            "TextEditor",
+            "Documentation",
+            "Adult",
+            "Core",
+            "KDE",
+            "GNOME",
+            "XFCE",
+            "GTK",
+            "Qt",
+            "Motif",
+            "Java",
+            "ConsoleOnly",
         ]
-        
+
         self.__showinEnvironments = [
-            'GNOME', 'KDE', 'LXDE', 'LXQt', 'MATE', 'Razor', 'ROX', 'TDE',
-            'Unity', 'XFCE', 'EDE', 'Cinnamon', 'Pantheon', 'Old',
+            "GNOME",
+            "KDE",
+            "LXDE",
+            "LXQt",
+            "MATE",
+            "Razor",
+            "ROX",
+            "TDE",
+            "Unity",
+            "XFCE",
+            "EDE",
+            "Cinnamon",
+            "Pantheon",
+            "Old",
         ]
-        
-        self.typeComboBox.addItems([
-            self.tr("FreeDesktop Standard .desktop"),
-            self.tr("KDE Plasma MetaData .desktop"),
-            self.tr("Ubuntu Unity QuickList .desktop"),
-        ])
-        
-        self.kdeCategoryComboBox.addItems([
-            '', 'Application Launchers', 'Accessibility', 'Astronomy',
-            'Date and Time', 'Development Tools', 'Education', 'Environment',
-            'Examples', 'File System', 'Fun and Games', 'Graphics',
-            'Language', 'Mapping', 'Multimedia', 'Online Services',
-            'System Information', 'Utilities', 'Windows and Tasks',
-            'Miscelaneous',
-        ])
-        
-        self.kdeApiComboBox.addItems([
-            'Python', 'Javascript', 'Ruby', 'C++', 'HTML5', 'QML'
-        ])
-        
+
+        self.typeComboBox.addItems(
+            [
+                self.tr("FreeDesktop Standard .desktop"),
+                self.tr("KDE Plasma MetaData .desktop"),
+                self.tr("Ubuntu Unity QuickList .desktop"),
+            ]
+        )
+
+        self.kdeCategoryComboBox.addItems(
+            [
+                "",
+                "Application Launchers",
+                "Accessibility",
+                "Astronomy",
+                "Date and Time",
+                "Development Tools",
+                "Education",
+                "Environment",
+                "Examples",
+                "File System",
+                "Fun and Games",
+                "Graphics",
+                "Language",
+                "Mapping",
+                "Multimedia",
+                "Online Services",
+                "System Information",
+                "Utilities",
+                "Windows and Tasks",
+                "Miscelaneous",
+            ]
+        )
+
+        self.kdeApiComboBox.addItems(
+            ["Python", "Javascript", "Ruby", "C++", "HTML5", "QML"]
+        )
+
         self.kdeEncodingComboBox.addItems(sorted(Utilities.supportedCodecs))
         self.kdeEncodingComboBox.setCurrentIndex(
-            self.kdeEncodingComboBox.findText("utf-8"))
-        
+            self.kdeEncodingComboBox.findText("utf-8")
+        )
+
         projectOpen = ericApp().getObject("Project").isOpen()
         self.projectButton.setEnabled(projectOpen)
-        
+
         icon = UI.PixmapCache.getIcon("listSelection")
         self.categoriesButton.setIcon(icon)
         self.onlyShowButton.setIcon(icon)
         self.notShowButton.setIcon(icon)
-    
+
     def getCode(self):
         """
         Public method to get the source code.
@@ -117,100 +257,87 @@
         """
         # step 1: standard desktop entries
         code = [
-            '[Desktop Entry]',
-            'Type=' + self.typeEdit.text(),
+            "[Desktop Entry]",
+            "Type=" + self.typeEdit.text(),
         ]
         if self.versionEdit.text():
-            code.append('Version=' + self.versionEdit.text())
-        code.append('Name=' + self.nameEdit.text())
+            code.append("Version=" + self.versionEdit.text())
+        code.append("Name=" + self.nameEdit.text())
         if self.genericNameEdit.text():
-            code.append('GenericName=' + self.genericNameEdit.text())
+            code.append("GenericName=" + self.genericNameEdit.text())
         if self.commentEdit.text():
-            code.append('Comment=' + self.commentEdit.text())
+            code.append("Comment=" + self.commentEdit.text())
         if self.iconFileEdit.text():
-            code.append('Icon=' + self.iconFileEdit.text())
+            code.append("Icon=" + self.iconFileEdit.text())
         if self.onlyShowEdit.text():
-            code.append('OnlyShowIn=' + self.onlyShowEdit.text())
+            code.append("OnlyShowIn=" + self.onlyShowEdit.text())
         if self.notShowEdit.text():
-            code.append('NotShowIn=' + self.notShowEdit.text())
+            code.append("NotShowIn=" + self.notShowEdit.text())
         if self.tryExecEdit.text():
-            code.append('TryExec=' + self.tryExecEdit.text())
+            code.append("TryExec=" + self.tryExecEdit.text())
         if self.execEdit.text():
-            code.append('Exec=' + self.execEdit.text())
+            code.append("Exec=" + self.execEdit.text())
         if self.pathEdit.text():
-            code.append('Path=' + self.pathEdit.text())
+            code.append("Path=" + self.pathEdit.text())
         if self.terminalCheckBox.isChecked():
-            code.append('Terminal=true')
+            code.append("Terminal=true")
         if self.actionsEdit.text():
-            code.append('Actions=' + self.actionsEdit.text())
+            code.append("Actions=" + self.actionsEdit.text())
         if self.mimetypeEdit.text():
-            code.append('MimeType=' + self.mimetypeEdit.text())
+            code.append("MimeType=" + self.mimetypeEdit.text())
         if self.categoriesEdit.text():
-            code.append('Categories=' + self.categoriesEdit.text())
-        
+            code.append("Categories=" + self.categoriesEdit.text())
+
         # step 2a: KDE Plasma entries
         if self.typeComboBox.currentIndex() == 1:
             if self.kdeEncodingComboBox.currentText():
-                code.append('Encoding=' +
-                            self.kdeEncodingComboBox.currentText())
+                code.append("Encoding=" + self.kdeEncodingComboBox.currentText())
             if self.kdeServiceTypeEdit.text():
-                code.append('ServiceTypes=' +
-                            self.kdeServiceTypeEdit.text())
+                code.append("ServiceTypes=" + self.kdeServiceTypeEdit.text())
             if self.kdeApiComboBox.currentText():
-                code.append('X-Plasma-API=' +
-                            self.kdeApiComboBox.currentText())
+                code.append("X-Plasma-API=" + self.kdeApiComboBox.currentText())
             if self.kdeMainScriptEdit.text():
-                code.append('X-Plasma-MainScript=' +
-                            self.kdeMainScriptEdit.text())
+                code.append("X-Plasma-MainScript=" + self.kdeMainScriptEdit.text())
             if self.kdeAuthorEdit.text():
-                code.append('X-KDE-PluginInfo-Author=' +
-                            self.kdeAuthorEdit.text())
+                code.append("X-KDE-PluginInfo-Author=" + self.kdeAuthorEdit.text())
             if self.kdeEmailEdit.text():
-                code.append('X-KDE-PluginInfo-Email=' +
-                            self.kdeEmailEdit.text())
+                code.append("X-KDE-PluginInfo-Email=" + self.kdeEmailEdit.text())
             if self.kdeNameEdit.text():
-                code.append('X-KDE-PluginInfo-Name=' +
-                            self.kdeNameEdit.text())
+                code.append("X-KDE-PluginInfo-Name=" + self.kdeNameEdit.text())
             if self.kdeVersionEdit.text():
-                code.append('X-KDE-PluginInfo-Version=' +
-                            self.kdeVersionEdit.text())
+                code.append("X-KDE-PluginInfo-Version=" + self.kdeVersionEdit.text())
             if self.kdeWebsiteEdit.text():
-                code.append('X-KDE-PluginInfo-Website=' +
-                            self.kdeWebsiteEdit.text())
+                code.append("X-KDE-PluginInfo-Website=" + self.kdeWebsiteEdit.text())
             if self.kdeCategoryComboBox.currentText():
-                code.append('X-KDE-PluginInfo-Category=' +
-                            self.kdeCategoryComboBox.currentText())
+                code.append(
+                    "X-KDE-PluginInfo-Category="
+                    + self.kdeCategoryComboBox.currentText()
+                )
             if self.kdeDependsEdit.text():
-                code.append('X-KDE-PluginInfo-Depends=' +
-                            self.kdeDependsEdit.text())
+                code.append("X-KDE-PluginInfo-Depends=" + self.kdeDependsEdit.text())
             if self.kdeLicensEdit.text():
-                code.append('X-KDE-PluginInfo-License=' +
-                            self.kdeLicensEdit.text())
+                code.append("X-KDE-PluginInfo-License=" + self.kdeLicensEdit.text())
             if self.kdeEnabledDefaultCheckBox.isChecked():
-                code.append('X-KDE-PluginInfo-EnabledByDefault=true')
-        
+                code.append("X-KDE-PluginInfo-EnabledByDefault=true")
+
         # step 2b: Unity entries
-        if (
-            self.typeComboBox.currentIndex() == 2 and
-            self.unityShortcutsEdit.text()
-        ):
-            code.append('X-Ayatana-Desktop-Shortcuts=' +
-                        self.unityShortcutsEdit.text())
-        
+        if self.typeComboBox.currentIndex() == 2 and self.unityShortcutsEdit.text():
+            code.append("X-Ayatana-Desktop-Shortcuts=" + self.unityShortcutsEdit.text())
+
         # step 3: action entries
         actions = [act for act in self.actionsEdit.text().split(";") if act]
         for act in actions:
-            code.append('')
-            code.append('[Desktop Action {0}]'.format(act))
-            code.append('Name={0}'.format(act))
-            code.append('Icon=<Icon Path>')
-            code.append('Exec=<Executable command>')
-        
+            code.append("")
+            code.append("[Desktop Action {0}]".format(act))
+            code.append("Name={0}".format(act))
+            code.append("Icon=<Icon Path>")
+            code.append("Exec=<Executable command>")
+
         # step 4: add empty last line
-        code.append('')
-        
+        code.append("")
+
         return os.linesep.join(code)
-    
+
     def __checkOK(self):
         """
         Private slot to check, if the OK button should be enabled.
@@ -218,19 +345,18 @@
         enable = bool(self.nameEdit.text()) and bool(self.typeEdit.text())
         if bool(self.onlyShowEdit.text()) and bool(self.notShowEdit.text()):
             enable = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(int)
     def on_typeComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle a change of the .desktop type.
-        
+
         @param index index of the selected entry (integer)
         """
         self.dataTabWidget.setTabEnabled(1, index == 1)
         self.dataTabWidget.setTabEnabled(2, index == 2)
-    
+
     @pyqtSlot()
     def on_projectButton_clicked(self):
         """
@@ -238,7 +364,7 @@
         current project.
         """
         project = ericApp().getObject("Project")
-        
+
         self.nameEdit.setText(project.getProjectName())
         self.genericNameEdit.setText(project.getProjectName())
         self.kdeNameEdit.setText(project.getProjectName())
@@ -255,32 +381,33 @@
             self.kdeMainScriptEdit.setText(mainscript)
             self.execEdit.setText(mainscript)
             self.tryExecEdit.setText(mainscript)
-        
+
         # prevent overwriting of entries by disabling the button
         self.projectButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def on_categoriesButton_clicked(self):
         """
         Private slot to select the categories.
         """
-        from .DotDesktopListSelectionDialog import (
-            DotDesktopListSelectionDialog
-        )
+        from .DotDesktopListSelectionDialog import DotDesktopListSelectionDialog
+
         dlg = DotDesktopListSelectionDialog(
             self.__mainCategories,
-            self.categoriesEdit.text(), ";",
+            self.categoriesEdit.text(),
+            ";",
             subEntries=self.__subCategories,
-            allowMultiMain=False)
+            allowMultiMain=False,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             categories = dlg.getData(";", True)
             self.categoriesEdit.setText(categories)
-    
+
     @pyqtSlot(str)
     def on_onlyShowEdit_textChanged(self, txt):
         """
         Private slot to check the contents of the onlyShowEdit field.
-        
+
         @param txt text of the entry field (string)
         """
         self.__checkOK()
@@ -288,29 +415,30 @@
             EricMessageBox.critical(
                 self,
                 self.tr(".desktop Wizard"),
-                self.tr("""Only one of 'Only Show In' or """
-                        """ 'Not Show In' allowed."""))
-    
+                self.tr(
+                    """Only one of 'Only Show In' or """ """ 'Not Show In' allowed."""
+                ),
+            )
+
     @pyqtSlot()
     def on_onlyShowButton_clicked(self):
         """
         Private slot to select the OnlyShowIn environments.
         """
-        from .DotDesktopListSelectionDialog import (
-            DotDesktopListSelectionDialog
+        from .DotDesktopListSelectionDialog import DotDesktopListSelectionDialog
+
+        dlg = DotDesktopListSelectionDialog(
+            self.__showinEnvironments, self.onlyShowEdit.text(), ";"
         )
-        dlg = DotDesktopListSelectionDialog(
-            self.__showinEnvironments,
-            self.onlyShowEdit.text(), ";")
         if dlg.exec() == QDialog.DialogCode.Accepted:
             environments = dlg.getData(";", True)
             self.onlyShowEdit.setText(environments)
-    
+
     @pyqtSlot(str)
     def on_notShowEdit_textChanged(self, txt):
         """
         Private slot to check the contents of the notShowEdit field.
-        
+
         @param txt text of the entry field (string)
         """
         self.__checkOK()
@@ -318,38 +446,39 @@
             EricMessageBox.critical(
                 self,
                 self.tr(".desktop Wizard"),
-                self.tr("""Only one of 'Only Show In' or """
-                        """ 'Not Show In' allowed."""))
-    
+                self.tr(
+                    """Only one of 'Only Show In' or """ """ 'Not Show In' allowed."""
+                ),
+            )
+
     @pyqtSlot()
     def on_notShowButton_clicked(self):
         """
         Private slot to select the NotShowIn environments.
         """
-        from .DotDesktopListSelectionDialog import (
-            DotDesktopListSelectionDialog
+        from .DotDesktopListSelectionDialog import DotDesktopListSelectionDialog
+
+        dlg = DotDesktopListSelectionDialog(
+            self.__showinEnvironments, self.notShowEdit.text(), ";"
         )
-        dlg = DotDesktopListSelectionDialog(
-            self.__showinEnvironments,
-            self.notShowEdit.text(), ";")
         if dlg.exec() == QDialog.DialogCode.Accepted:
             environments = dlg.getData(";", True)
             self.notShowEdit.setText(environments)
-    
+
     @pyqtSlot(str)
     def on_typeEdit_textChanged(self, txt):
         """
         Private slot to check, if the typeEdit field is empty.
-        
+
         @param txt text of the entry field (string)
         """
         self.__checkOK()
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to check, if the nameEdit field is empty.
-        
+
         @param txt text of the entry field (string)
         """
         self.__checkOK()
--- a/src/eric7/Plugins/WizardPlugins/EricMessageBoxWizard/EricMessageBoxWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/EricMessageBoxWizard/EricMessageBoxWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,20 +20,21 @@
 class EricMessageBoxWizardDialog(QDialog, Ui_EricMessageBoxWizardDialog):
     """
     Class implementing the eric message box wizard dialog.
-    
+
     It displays a dialog for entering the parameters
     for the EricMessageBox code generator.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # keep the following three lists in sync
         self.buttonsList = [
             self.tr("No button"),
@@ -98,12 +99,13 @@
             "EricMessageBox.Yes",
             "EricMessageBox.YesToAll",
         ]
-        
+
         self.defaultCombo.addItems(self.buttonsList)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.__enabledGroups()
 
     def __enabledGroups(self):
@@ -111,151 +113,151 @@
         Private method to enable/disable some group boxes.
         """
         self.standardButtons.setEnabled(
-            self.rInformation.isChecked() or
-            self.rQuestion.isChecked() or
-            self.rWarning.isChecked() or
-            self.rCritical.isChecked() or
-            self.rStandard.isChecked()
+            self.rInformation.isChecked()
+            or self.rQuestion.isChecked()
+            or self.rWarning.isChecked()
+            or self.rCritical.isChecked()
+            or self.rStandard.isChecked()
         )
-        
+
         self.defaultButton.setEnabled(
-            self.rInformation.isChecked() or
-            self.rQuestion.isChecked() or
-            self.rWarning.isChecked() or
-            self.rCritical.isChecked()
+            self.rInformation.isChecked()
+            or self.rQuestion.isChecked()
+            or self.rWarning.isChecked()
+            or self.rCritical.isChecked()
         )
-        
+
         self.iconBox.setEnabled(
-            self.rYesNo.isChecked() or
-            self.rRetryAbort.isChecked() or
-            self.rStandard.isChecked()
+            self.rYesNo.isChecked()
+            or self.rRetryAbort.isChecked()
+            or self.rStandard.isChecked()
         )
-        
+
         self.bTest.setEnabled(not self.rStandard.isChecked())
-        
+
         self.eMessage.setEnabled(not self.rAboutQt.isChecked())
-    
+
     @pyqtSlot(bool)
     def on_rInformation_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rInformation
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rQuestion_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rQuestion
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rWarning_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rWarning
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rCritical_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rCritical
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rYesNo_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rYesNo
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rRetryAbort_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rRetryAbort
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rOkToClearData_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rOkToClearData
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rAbout_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rAbout
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rAboutQt_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rAboutQt
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(bool)
     def on_rStandard_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rStandard
         radio button.
-        
+
         @param on toggle state (ignored)
         @type bool
         """
         self.__enabledGroups()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
@@ -263,19 +265,15 @@
         """
         if self.rAbout.isChecked():
             EricMessageBox.about(
-                None,
-                self.eCaption.text(),
-                self.eMessage.toPlainText()
+                None, self.eCaption.text(), self.eMessage.toPlainText()
             )
         elif self.rAboutQt.isChecked():
-            EricMessageBox.aboutQt(
-                None, self.eCaption.text()
-            )
+            EricMessageBox.aboutQt(None, self.eCaption.text())
         elif (
-            self.rInformation.isChecked() or
-            self.rQuestion.isChecked() or
-            self.rWarning.isChecked() or
-            self.rCritical.isChecked()
+            self.rInformation.isChecked()
+            or self.rQuestion.isChecked()
+            or self.rWarning.isChecked()
+            or self.rCritical.isChecked()
         ):
             buttons = EricMessageBox.NoButton
             if self.abortCheck.isChecked():
@@ -316,17 +314,16 @@
                 buttons |= EricMessageBox.YesToAll
             if buttons == EricMessageBox.NoButton:
                 buttons = EricMessageBox.Ok
-            
-            defaultButton = self.buttonsCodeListBinary[
-                self.defaultCombo.currentIndex()]
-            
+
+            defaultButton = self.buttonsCodeListBinary[self.defaultCombo.currentIndex()]
+
             if self.rInformation.isChecked():
                 EricMessageBox.information(
                     self,
                     self.eCaption.text(),
                     self.eMessage.toPlainText(),
                     buttons,
-                    defaultButton
+                    defaultButton,
                 )
             elif self.rQuestion.isChecked():
                 EricMessageBox.question(
@@ -334,7 +331,7 @@
                     self.eCaption.text(),
                     self.eMessage.toPlainText(),
                     buttons,
-                    defaultButton
+                    defaultButton,
                 )
             elif self.rWarning.isChecked():
                 EricMessageBox.warning(
@@ -342,7 +339,7 @@
                     self.eCaption.text(),
                     self.eMessage.toPlainText(),
                     buttons,
-                    defaultButton
+                    defaultButton,
                 )
             elif self.rCritical.isChecked():
                 EricMessageBox.critical(
@@ -350,12 +347,9 @@
                     self.eCaption.text(),
                     self.eMessage.toPlainText(),
                     buttons,
-                    defaultButton
+                    defaultButton,
                 )
-        elif (
-            self.rYesNo.isChecked() or
-            self.rRetryAbort.isChecked()
-        ):
+        elif self.rYesNo.isChecked() or self.rRetryAbort.isChecked():
             if self.iconInformation.isChecked():
                 icon = EricMessageBox.Information
             elif self.iconQuestion.isChecked():
@@ -364,34 +358,28 @@
                 icon = EricMessageBox.Warning
             elif self.iconCritical.isChecked():
                 icon = EricMessageBox.Critical
-            
+
             if self.rYesNo.isChecked():
                 EricMessageBox.yesNo(
                     self,
                     self.eCaption.text(),
                     self.eMessage.toPlainText(),
                     icon=icon,
-                    yesDefault=self.yesDefaultCheck.isChecked()
+                    yesDefault=self.yesDefaultCheck.isChecked(),
                 )
             elif self.rRetryAbort.isChecked():
                 EricMessageBox.retryAbort(
-                    self,
-                    self.eCaption.text(),
-                    self.eMessage.toPlainText(),
-                    icon=icon
+                    self, self.eCaption.text(), self.eMessage.toPlainText(), icon=icon
                 )
         elif self.rOkToClearData.isChecked():
             EricMessageBox.okToClearData(
-                self,
-                self.eCaption.text(),
-                self.eMessage.toPlainText(),
-                lambda: True
+                self, self.eCaption.text(), self.eMessage.toPlainText(), lambda: True
             )
-    
+
     def __getStandardButtonCode(self, istring, withIntro=True):
         """
         Private method to generate the button code for the standard buttons.
-        
+
         @param istring indentation string
         @type str
         @param withIntro flag indicating to generate a first line
@@ -439,18 +427,19 @@
             buttons.append("EricMessageBox.YesToAll")
         if len(buttons) == 0:
             return ""
-        
-        joinstring = ' |{0}{1}'.format(os.linesep, istring)
-        intro = ',' if withIntro else ''
-        btnCode = '{0}{1}{2}{3}'.format(
-            intro, os.linesep, istring, joinstring.join(buttons))
-        
+
+        joinstring = " |{0}{1}".format(os.linesep, istring)
+        intro = "," if withIntro else ""
+        btnCode = "{0}{1}{2}{3}".format(
+            intro, os.linesep, istring, joinstring.join(buttons)
+        )
+
         return btnCode
-    
+
     def __getDefaultButtonCode(self, istring):
         """
         Private method to generate the button code for the default button.
-        
+
         @param istring indentation string
         @type str
         @return the button code
@@ -459,15 +448,15 @@
         btnCode = ""
         defaultIndex = self.defaultCombo.currentIndex()
         if defaultIndex:
-            btnCode = ',{0}{1}{2}'.format(
-                os.linesep, istring,
-                self.buttonsCodeListText[defaultIndex])
+            btnCode = ",{0}{1}{2}".format(
+                os.linesep, istring, self.buttonsCodeListText[defaultIndex]
+            )
         return btnCode
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level
         @type int
         @param indString string used for indentation (space or tab)
@@ -479,7 +468,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.parentSelf.isChecked():
             parent = "self"
@@ -489,7 +478,7 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
+
         if self.iconInformation.isChecked():
             icon = "EricMessageBox.Information"
         elif self.iconQuestion.isChecked():
@@ -498,92 +487,86 @@
             icon = "EricMessageBox.Warning"
         elif self.iconCritical.isChecked():
             icon = "EricMessageBox.Critical"
-        
+
         if not self.rStandard.isChecked():
             resvar = self.eResultVar.text()
             if not resvar:
                 resvar = "res"
-            
+
             if self.rAbout.isChecked():
                 msgdlg = "EricMessageBox.about({0}".format(os.linesep)
             elif self.rAboutQt.isChecked():
                 msgdlg = "EricMessageBox.aboutQt({0}".format(os.linesep)
             elif self.rInformation.isChecked():
                 msgdlg = "{0} = EricMessageBox.information({1}".format(
-                    resvar, os.linesep)
+                    resvar, os.linesep
+                )
             elif self.rQuestion.isChecked():
-                msgdlg = "{0} = EricMessageBox.question({1}".format(
-                    resvar, os.linesep)
+                msgdlg = "{0} = EricMessageBox.question({1}".format(resvar, os.linesep)
             elif self.rWarning.isChecked():
-                msgdlg = "{0} = EricMessageBox.warning({1}".format(
-                    resvar, os.linesep)
+                msgdlg = "{0} = EricMessageBox.warning({1}".format(resvar, os.linesep)
             elif self.rCritical.isChecked():
-                msgdlg = "{0} = EricMessageBox.critical({1}".format(
-                    resvar, os.linesep)
+                msgdlg = "{0} = EricMessageBox.critical({1}".format(resvar, os.linesep)
             elif self.rYesNo.isChecked():
-                msgdlg = "{0} = EricMessageBox.yesNo({1}".format(
-                    resvar, os.linesep)
+                msgdlg = "{0} = EricMessageBox.yesNo({1}".format(resvar, os.linesep)
             elif self.rRetryAbort.isChecked():
                 msgdlg = "{0} = EricMessageBox.retryAbort({1}".format(
-                    resvar, os.linesep)
+                    resvar, os.linesep
+                )
             elif self.rOkToClearData.isChecked():
                 msgdlg = "{0} = EricMessageBox.okToClearData({1}".format(
-                    resvar, os.linesep)
-            
-            msgdlg += '{0}{1},{2}'.format(istring, parent, os.linesep)
-            msgdlg += '{0}self.tr("{1}")'.format(
-                istring, self.eCaption.text())
-            
+                    resvar, os.linesep
+                )
+
+            msgdlg += "{0}{1},{2}".format(istring, parent, os.linesep)
+            msgdlg += '{0}self.tr("{1}")'.format(istring, self.eCaption.text())
+
             if not self.rAboutQt.isChecked():
                 msgdlg += ',{0}{1}self.tr("""{2}""")'.format(
-                    os.linesep, istring, self.eMessage.toPlainText())
-            
+                    os.linesep, istring, self.eMessage.toPlainText()
+                )
+
             if (
-                self.rInformation.isChecked() or
-                self.rQuestion.isChecked() or
-                self.rWarning.isChecked() or
-                self.rCritical.isChecked()
+                self.rInformation.isChecked()
+                or self.rQuestion.isChecked()
+                or self.rWarning.isChecked()
+                or self.rCritical.isChecked()
             ):
                 msgdlg += self.__getStandardButtonCode(istring)
                 msgdlg += self.__getDefaultButtonCode(istring)
             elif self.rYesNo.isChecked():
                 if not self.iconQuestion.isChecked():
-                    msgdlg += ',{0}{1}icon={2}'.format(
-                        os.linesep, istring, icon)
+                    msgdlg += ",{0}{1}icon={2}".format(os.linesep, istring, icon)
                 if self.yesDefaultCheck.isChecked():
-                    msgdlg += ',{0}{1}yesDefault=True'.format(
-                        os.linesep, istring)
+                    msgdlg += ",{0}{1}yesDefault=True".format(os.linesep, istring)
             elif self.rRetryAbort.isChecked():
                 if not self.iconQuestion.isChecked():
-                    msgdlg += ',{0}{1}icon={2}'.format(
-                        os.linesep, istring, icon)
+                    msgdlg += ",{0}{1}icon={2}".format(os.linesep, istring, icon)
             elif self.rOkToClearData.isChecked():
                 saveFunc = self.saveFuncEdit.text()
                 if saveFunc == "":
                     saveFunc = "lambda: True"
-                msgdlg += ',{0}{1}{2}'.format(os.linesep, istring, saveFunc)
+                msgdlg += ",{0}{1}{2}".format(os.linesep, istring, saveFunc)
         else:
             resvar = self.eResultVar.text()
             if not resvar:
                 resvar = "dlg"
-            
+
             msgdlg = "{0} = EricMessageBox.EricMessageBox({1}".format(
-                resvar, os.linesep)
-            msgdlg += '{0}{1},{2}'.format(istring, icon, os.linesep)
-            msgdlg += '{0}self.tr("{1}")'.format(
-                istring, self.eCaption.text())
+                resvar, os.linesep
+            )
+            msgdlg += "{0}{1},{2}".format(istring, icon, os.linesep)
+            msgdlg += '{0}self.tr("{1}")'.format(istring, self.eCaption.text())
             msgdlg += ',{0}{1}self.tr("""{2}""")'.format(
-                os.linesep, istring, self.eMessage.toPlainText())
+                os.linesep, istring, self.eMessage.toPlainText()
+            )
             if self.modalCheck.isChecked():
-                msgdlg += ',{0}{1}modal=True'.format(os.linesep, istring)
-            btnCode = self.__getStandardButtonCode(
-                istring, withIntro=False)
+                msgdlg += ",{0}{1}modal=True".format(os.linesep, istring)
+            btnCode = self.__getStandardButtonCode(istring, withIntro=False)
             if btnCode:
-                msgdlg += ',{0}{1}buttons={2}'.format(
-                    os.linesep, istring, btnCode)
+                msgdlg += ",{0}{1}buttons={2}".format(os.linesep, istring, btnCode)
             if not self.parentNone.isChecked():
-                msgdlg += ',{0}{1}parent={2}'.format(
-                    os.linesep, istring, parent)
-        
-        msgdlg += '{0}){0}'.format(estring)
+                msgdlg += ",{0}{1}parent={2}".format(os.linesep, istring, parent)
+
+        msgdlg += "{0}){0}".format(estring)
         return msgdlg
--- a/src/eric7/Plugins/WizardPlugins/EricPluginWizard/PluginWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/EricPluginWizard/PluginWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,10 +15,18 @@
 from .Ui_PluginWizardDialog import Ui_PluginWizardDialog
 
 from .Templates import (
-    mainTemplate, configTemplate0, configTemplate1, configTemplate2,
-    configTemplate3, onDemandTemplate, previewPixmapTemplate,
-    moduleSetupTemplate, exeDisplayDataTemplate, exeDisplayDataInfoTemplate,
-    exeDisplayDataListTemplate, apiFilesTemplate
+    mainTemplate,
+    configTemplate0,
+    configTemplate1,
+    configTemplate2,
+    configTemplate3,
+    onDemandTemplate,
+    previewPixmapTemplate,
+    moduleSetupTemplate,
+    exeDisplayDataTemplate,
+    exeDisplayDataInfoTemplate,
+    exeDisplayDataListTemplate,
+    apiFilesTemplate,
 )
 
 
@@ -26,24 +34,24 @@
     """
     Class implementing the eric plug-in wizard dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.dataTabWidget.setCurrentIndex(0)
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.__okButton.setEnabled(False)
-        
+
         projectOpen = ericApp().getObject("Project").isOpen()
         self.projectButton.setEnabled(projectOpen)
-        
+
         self.nameEdit.textChanged.connect(self.__enableOkButton)
         self.versionEdit.textChanged.connect(self.__enableOkButton)
         self.authorEdit.textChanged.connect(self.__enableOkButton)
@@ -57,33 +65,34 @@
         self.autoActivateCheckBox.toggled.connect(self.__enableOkButton)
         self.pluginTypeCombo.currentIndexChanged.connect(self.__enableOkButton)
         self.pluginTypeNameEdit.textChanged.connect(self.__enableOkButton)
-        
+
         self.pluginTypeCombo.addItems(["", "viewmanager", "version_control"])
-    
+
     def __enableOkButton(self):
         """
         Private slot to set the state of the OK button.
         """
         enable = (
-            bool(self.nameEdit.text()) and
-            bool(self.versionEdit.text()) and
-            bool(self.authorEdit.text()) and
-            bool(self.authorEmailEdit.text()) and
-            bool(self.classNameEdit.text()) and
-            bool(self.packageNameEdit.text()) and
-            bool(self.shortDescriptionEdit.text()) and
-            bool(self.longDescriptionEdit.toPlainText())
+            bool(self.nameEdit.text())
+            and bool(self.versionEdit.text())
+            and bool(self.authorEdit.text())
+            and bool(self.authorEmailEdit.text())
+            and bool(self.classNameEdit.text())
+            and bool(self.packageNameEdit.text())
+            and bool(self.shortDescriptionEdit.text())
+            and bool(self.longDescriptionEdit.toPlainText())
         )
         if self.configurationGroup.isChecked():
             enable = enable and bool(self.preferencesKeyEdit.text())
         if not self.autoActivateCheckBox.isChecked():
-            enable = (enable and
-                      bool(self.pluginTypeCombo.currentText()) and
-                      bool(self.pluginTypeNameEdit.text())
-                      )
-        
+            enable = (
+                enable
+                and bool(self.pluginTypeCombo.currentText())
+                and bool(self.pluginTypeNameEdit.text())
+            )
+
         self.__okButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_projectButton_clicked(self):
         """
@@ -91,7 +100,7 @@
         current project.
         """
         project = ericApp().getObject("Project")
-        
+
         try:
             self.versionEdit.setText(project.getProjectVersion())
             self.authorEdit.setText(project.getProjectAuthor())
@@ -102,20 +111,21 @@
             self.authorEdit.setText(project.pdata["AUTHOR"][0])
             self.authorEmailEdit.setText(project.pdata["EMAIL"][0])
             description = project.pdata["DESCRIPTION"][0]
-        
+
         # summary is max. 55 characters long
-        summary = (description.split(".", 1)[0]
-                   .replace("\r", "").replace("\n", "") + ".")[:55]
+        summary = (
+            description.split(".", 1)[0].replace("\r", "").replace("\n", "") + "."
+        )[:55]
         self.shortDescriptionEdit.setText(summary)
         self.longDescriptionEdit.setPlainText(description)
-        
+
         # prevent overwriting of entries by disabling the button
         self.projectButton.setEnabled(False)
-    
+
     def getCode(self):
         """
         Public method to get the source code.
-        
+
         @return generated code (string)
         """
         templateData = {
@@ -132,38 +142,40 @@
             "longDescription": self.longDescriptionEdit.toPlainText(),
             "needsRestart": self.restartCheckBox.isChecked(),
         }
-        
+
         if self.configurationGroup.isChecked():
             templateData["config0"] = configTemplate0
             templateData["config1"] = configTemplate1.format(
-                className=self.classNameEdit.text())
+                className=self.classNameEdit.text()
+            )
             templateData["config2"] = configTemplate2.format(
-                preferencesKey=self.preferencesKeyEdit.text())
+                preferencesKey=self.preferencesKeyEdit.text()
+            )
             templateData["config3"] = configTemplate3
         else:
             templateData["config0"] = ""
             templateData["config1"] = ""
             templateData["config2"] = ""
             templateData["config3"] = ""
-        
+
         if self.autoActivateCheckBox.isChecked():
             templateData["onDemand"] = ""
         else:
             templateData["onDemand"] = onDemandTemplate.format(
                 pluginType=self.pluginTypeCombo.currentText(),
-                pluginTypename=self.pluginTypeNameEdit.text()
+                pluginTypename=self.pluginTypeNameEdit.text(),
             )
-        
+
         if self.pixmapCheckBox.isChecked():
             templateData["preview"] = previewPixmapTemplate
         else:
             templateData["preview"] = ""
-        
+
         if self.moduleSetupCheckBox.isChecked():
             templateData["modulesetup"] = moduleSetupTemplate
         else:
             templateData["modulesetup"] = ""
-        
+
         templateData["exeData"] = ""
         if self.exeGroup.isChecked():
             if self.exeRadioButton.isChecked():
@@ -172,30 +184,30 @@
                 templateData["exeData"] = exeDisplayDataInfoTemplate
             elif self.exeListRadioButton.isChecked():
                 templateData["exeData"] = exeDisplayDataListTemplate
-        
+
         if self.apiFilesCheckBox.isChecked():
             templateData["apiFiles"] = apiFilesTemplate
         else:
             templateData["apiFiles"] = ""
-        
+
         return mainTemplate.format(**templateData)
-    
+
     def packageName(self):
         """
         Public method to retrieve the plug-in package name.
-        
+
         @return plug-in package name (string)
         """
         if self.createPackageCheckBox.isChecked():
             return self.packageNameEdit.text()
         else:
             return ""
-    
+
     @pyqtSlot(str)
     def on_pluginTypeCombo_currentTextChanged(self, txt):
         """
         Private slot to react upon the selection of a plug-in type.
-        
+
         @param txt selected plug-in type (string)
         """
         self.pixmapCheckBox.setChecked(txt == "viewmanager")
--- a/src/eric7/Plugins/WizardPlugins/EricPluginWizard/Templates.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/EricPluginWizard/Templates.py	Wed Jul 13 14:55:47 2022 +0200
@@ -78,9 +78,9 @@
         pass
 {config3}'''
 
-configTemplate0 = '''import Preferences
+configTemplate0 = """import Preferences
 
-'''
+"""
 
 configTemplate1 = '''def getConfigData():
     """
@@ -104,9 +104,9 @@
 
 '''
 
-configTemplate2 = '''    PreferencesKey = "{preferencesKey}"
+configTemplate2 = """    PreferencesKey = "{preferencesKey}"
     
-'''
+"""
 
 configTemplate3 = '''\
     
@@ -133,9 +133,9 @@
         pass
 '''
 
-onDemandTemplate = '''pluginType = "{pluginType}"
+onDemandTemplate = """pluginType = "{pluginType}"
 pluginTypename = "{pluginTypename}"
-'''
+"""
 
 previewPixmapTemplate = '''def previewPix():
     """
--- a/src/eric7/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSlot, QUrl
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QFileDialog, QButtonGroup
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QFileDialog, QButtonGroup
 
 from EricWidgets.EricCompleters import EricFileCompleter, EricDirCompleter
 
@@ -24,14 +22,15 @@
 class FileDialogWizardDialog(QDialog, Ui_FileDialogWizardDialog):
     """
     Class implementing the color dialog wizard dialog.
-    
+
     It displays a dialog for entering the parameters for the
     EricFileDialog or QFileDialog code generator.
     """
+
     def __init__(self, dialogVariant, parent=None):
         """
         Constructor
-        
+
         @param dialogVariant variant of the file dialog to be generated
             (-1 = EricFileDialog, 0 = unknown, 5 = PyQt5, 6 = PyQt6)
         @type int
@@ -40,12 +39,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.eStartWithCompleter = EricFileCompleter(self.eStartWith)
         self.eWorkDirCompleter = EricDirCompleter(self.eWorkDir)
-        
+
         self.__dialogVariant = dialogVariant
-        
+
         self.__typeButtonsGroup = QButtonGroup(self)
         self.__typeButtonsGroup.setExclusive(True)
         self.__typeButtonsGroup.addButton(self.rOpenFile, 1)
@@ -59,10 +58,9 @@
         self.__typeButtonsGroup.addButton(self.rSaveFileUrl, 23)
         self.__typeButtonsGroup.addButton(self.rDirectory, 30)
         self.__typeButtonsGroup.addButton(self.rDirectoryUrl, 31)
-        self.__typeButtonsGroup.idClicked.connect(
-            self.__toggleInitialFilterAndResult)
+        self.__typeButtonsGroup.idClicked.connect(self.__toggleInitialFilterAndResult)
         self.__toggleInitialFilterAndResult(1)
-        
+
         if self.__dialogVariant == -1:
             self.pyqtComboBox.addItems(["eric"])
             self.setWindowTitle(self.tr("EricFileDialog Wizard"))
@@ -77,7 +75,7 @@
                 self.pyqtComboBox.setCurrentIndex(1)
             else:
                 self.pyqtComboBox.setCurrentIndex(0)
-        
+
         self.rSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox)
         self.rfSaveFile.toggled[bool].connect(self.__toggleConfirmCheckBox)
         self.rSaveFileUrl.toggled[bool].connect(self.__toggleConfirmCheckBox)
@@ -86,29 +84,30 @@
         self.cStartWith.toggled[bool].connect(self.__toggleGroupsAndTest)
         self.cWorkDir.toggled[bool].connect(self.__toggleGroupsAndTest)
         self.cFilters.toggled[bool].connect(self.__toggleGroupsAndTest)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __adjustOptions(self, options):
         """
         Private method to adjust the file dialog options.
-        
+
         @param options file dialog options (QFileDialog.Option)
         @return modified options (QFileDialog.Option)
         """
         if Globals.isLinuxPlatform():
             options |= QFileDialog.Option.DontUseNativeDialog
         return options
-    
+
     @pyqtSlot(int)
     def on_pyqtComboBox_currentIndexChanged(self, index):
         """
         Private slot to setup the dialog for the selected PyQt variant.
-        
+
         @param index index of the current item
         @type int
         """
@@ -116,12 +115,12 @@
         self.rfOpenFile.setEnabled(txt == "eric")
         self.rfOpenFiles.setEnabled(txt == "eric")
         self.rfSaveFile.setEnabled(txt == "eric")
-        
+
         self.rOpenFileUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
         self.rOpenFileUrls.setEnabled(txt in ["PyQt5", "PyQt6"])
         self.rSaveFileUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
         self.rDirectoryUrl.setEnabled(txt in ["PyQt5", "PyQt6"])
-        
+
         if txt in ["PyQt5", "PyQt6"]:
             if self.rfOpenFile.isChecked():
                 self.rOpenFile.setChecked(True)
@@ -138,7 +137,7 @@
                 self.rSaveFile.setChecked(True)
             if self.rDirectoryUrl.isChecked():
                 self.rDirectory.setChecked(True)
-        
+
         if txt == "eric":
             self.__dialogVariant = -1
         elif txt == "PyQt5":
@@ -148,19 +147,18 @@
         else:
             # default is PyQt6
             self.__dialogVariant = 6
-        
-        self.__toggleInitialFilterAndResult(
-            self.__typeButtonsGroup.checkedId())
-    
+
+        self.__toggleInitialFilterAndResult(self.__typeButtonsGroup.checkedId())
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
@@ -178,7 +176,8 @@
                 self.eStartWith.text(),
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
-                options)
+                options,
+            )
         elif self.rOpenFileUrl.isChecked():
             if not self.cSymlinks.isChecked():
                 options = QFileDialog.Option.DontResolveSymlinks
@@ -192,7 +191,8 @@
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
                 options,
-                self.schemesEdit.text().split())
+                self.schemesEdit.text().split(),
+            )
         elif self.rOpenFiles.isChecked() or self.rfOpenFiles.isChecked():
             if not self.cSymlinks.isChecked():
                 options = QFileDialog.Option.DontResolveSymlinks
@@ -205,7 +205,8 @@
                 self.eStartWith.text(),
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
-                options)
+                options,
+            )
         elif self.rOpenFileUrls.isChecked():
             if not self.cSymlinks.isChecked():
                 options = QFileDialog.Option.DontResolveSymlinks
@@ -219,7 +220,8 @@
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
                 options,
-                self.schemesEdit.text().split())
+                self.schemesEdit.text().split(),
+            )
         elif self.rSaveFile.isChecked() or self.rfSaveFile.isChecked():
             if not self.cSymlinks.isChecked():
                 options = QFileDialog.Option.DontResolveSymlinks
@@ -232,7 +234,8 @@
                 self.eStartWith.text(),
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
-                options)
+                options,
+            )
         elif self.rSaveFileUrl.isChecked():
             if not self.cSymlinks.isChecked():
                 options = QFileDialog.Option.DontResolveSymlinks
@@ -246,7 +249,8 @@
                 self.eFilters.text(),
                 self.eInitialFilter.text(),
                 options,
-                self.schemesEdit.text().split())
+                self.schemesEdit.text().split(),
+            )
         elif self.rDirectory.isChecked():
             options = QFileDialog.Option(0)
             if not self.cSymlinks.isChecked():
@@ -257,10 +261,8 @@
                 options |= QFileDialog.Option(0)
             options = self.__adjustOptions(options)
             QFileDialog.getExistingDirectory(
-                None,
-                self.eCaption.text(),
-                self.eWorkDir.text(),
-                options)
+                None, self.eCaption.text(), self.eWorkDir.text(), options
+            )
         elif self.rDirectoryUrl.isChecked():
             options = QFileDialog.Option(0)
             if not self.cSymlinks.isChecked():
@@ -275,16 +277,19 @@
                 self.eCaption.text(),
                 QUrl(self.eWorkDir.text()),
                 options,
-                self.schemesEdit.text().split())
-    
+                self.schemesEdit.text().split(),
+            )
+
     def __toggleConfirmCheckBox(self):
         """
         Private slot to enable/disable the confirmation check box.
         """
         self.cConfirmOverwrite.setEnabled(
-            self.rSaveFile.isChecked() or self.rfSaveFile.isChecked() or
-            self.rSaveFileUrl.isChecked())
-    
+            self.rSaveFile.isChecked()
+            or self.rfSaveFile.isChecked()
+            or self.rSaveFileUrl.isChecked()
+        )
+
     def __toggleGroupsAndTest(self):
         """
         Private slot to enable/disable certain groups and the test button.
@@ -297,34 +302,33 @@
             self.filePropertiesGroup.setEnabled(True)
             self.dirPropertiesGroup.setEnabled(False)
             self.bTest.setDisabled(
-                self.cStartWith.isChecked() or self.cFilters.isChecked())
-    
+                self.cStartWith.isChecked() or self.cFilters.isChecked()
+            )
+
     def __toggleInitialFilterAndResult(self, checkedId):
         """
         Private slot to enable/disable the initial filter elements and the
         results entries.
-        
+
         @param checkedId id of the clicked button (integer)
         """
-        enable = (
-            (self.__dialogVariant in (-1, ) and checkedId in [11, 12, 13]) or
-            (self.__dialogVariant in (5, 6) and
-             checkedId in [1, 2, 3, 21, 22, 23])
+        enable = (self.__dialogVariant in (-1,) and checkedId in [11, 12, 13]) or (
+            self.__dialogVariant in (5, 6) and checkedId in [1, 2, 3, 21, 22, 23]
         )
-        
+
         self.lInitialFilter.setEnabled(enable)
         self.eInitialFilter.setEnabled(enable)
         self.cInitialFilter.setEnabled(enable)
-        
+
         self.lFilterVariable.setEnabled(enable)
         self.eFilterVariable.setEnabled(enable)
-        
+
         self.urlPropertiesGroup.setEnabled(checkedId in (21, 22, 23, 31))
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code for Qt6.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -333,7 +337,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.parentSelf.isChecked():
             parent = "self"
@@ -343,16 +347,21 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
+
         # prepare the result variables
         nameVariable = self.eNameVariable.text()
         if not nameVariable:
             if self.__typeButtonsGroup.checkedButton() in [
-                    self.rOpenFile, self.rfOpenFile,
-                    self.rSaveFile, self.rfSaveFile]:
+                self.rOpenFile,
+                self.rfOpenFile,
+                self.rSaveFile,
+                self.rfSaveFile,
+            ]:
                 nameVariable = "fileName"
             elif self.__typeButtonsGroup.checkedButton() in [
-                    self.rOpenFiles, self.rfOpenFiles]:
+                self.rOpenFiles,
+                self.rfOpenFiles,
+            ]:
                 nameVariable = "fileNames"
             elif self.__typeButtonsGroup.checkedButton() == self.rDirectory:
                 nameVariable = "dirName"
@@ -361,70 +370,69 @@
         filterVariable = self.eFilterVariable.text()
         if not filterVariable:
             if (
-                (self.__dialogVariant in (-1, ) and
-                 self.__typeButtonsGroup.checkedButton() in [
-                    self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]) or
-                (self.__dialogVariant in (5, 6) and
-                 self.__typeButtonsGroup.checkedButton() in [
-                    self.rOpenFile, self.rOpenFiles, self.rSaveFile])
+                self.__dialogVariant in (-1,)
+                and self.__typeButtonsGroup.checkedButton()
+                in [self.rfOpenFile, self.rfOpenFiles, self.rfSaveFile]
+            ) or (
+                self.__dialogVariant in (5, 6)
+                and self.__typeButtonsGroup.checkedButton()
+                in [self.rOpenFile, self.rOpenFiles, self.rSaveFile]
             ):
                 filterVariable = ", selectedFilter"
             else:
                 filterVariable = ""
         else:
             filterVariable = ", " + filterVariable
-        
+
         if self.__dialogVariant == -1:
             dialogType = "EricFileDialog"
             optionStr = ""
         else:
             dialogType = "QFileDialog"
             optionStr = ".Option"
-        
-        code = '{0}{1} = {2}.'.format(nameVariable, filterVariable, dialogType)
+
+        code = "{0}{1} = {2}.".format(nameVariable, filterVariable, dialogType)
         if (
-            self.rOpenFile.isChecked() or
-            self.rfOpenFile.isChecked() or
-            self.rOpenFileUrl.isChecked()
+            self.rOpenFile.isChecked()
+            or self.rfOpenFile.isChecked()
+            or self.rOpenFileUrl.isChecked()
         ):
             if self.rOpenFile.isChecked():
-                code += 'getOpenFileName({0}{1}'.format(os.linesep, istring)
+                code += "getOpenFileName({0}{1}".format(os.linesep, istring)
             elif self.rOpenFileUrl.isChecked():
-                code += 'getOpenFileUrl({0}{1}'.format(os.linesep, istring)
+                code += "getOpenFileUrl({0}{1}".format(os.linesep, istring)
             else:
-                code += 'getOpenFileNameAndFilter({0}{1}'.format(
-                    os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+                code += "getOpenFileNameAndFilter({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             if not self.eCaption.text():
                 code += '"",{0}{1}'.format(os.linesep, istring)
             else:
                 code += 'self.tr("{0}"),{1}{2}'.format(
-                    self.eCaption.text(), os.linesep, istring)
+                    self.eCaption.text(), os.linesep, istring
+                )
             if self.rOpenFileUrl.isChecked():
                 if not self.eStartWith.text():
-                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
+                    code += "QUrl(),{0}{1}".format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = 'QUrl("{0}"),{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             else:
                 if not self.eStartWith.text():
                     code += '"",{0}{1}'.format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = '"{0}",{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             if self.eFilters.text() == "":
                 code += '""'
             else:
                 if self.cFilters.isChecked():
-                    fmt = '{0}'
+                    fmt = "{0}"
                 else:
                     fmt = 'self.tr("{0}")'
                 code += fmt.format(self.eFilters.text())
@@ -433,63 +441,61 @@
                     initialFilter = "None"
                 else:
                     if self.cInitialFilter.isChecked():
-                        fmt = '{0}'
+                        fmt = "{0}"
                     else:
                         fmt = 'self.tr("{0}")'
                     initialFilter = fmt.format(self.eInitialFilter.text())
-                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
+                code += ",{0}{1}{2}".format(os.linesep, istring, initialFilter)
             if not self.cSymlinks.isChecked():
-                code += (
-                    ',{0}{1}{2}{3}.DontResolveSymlinks'
-                    .format(os.linesep, istring, dialogType, optionStr)
+                code += ",{0}{1}{2}{3}.DontResolveSymlinks".format(
+                    os.linesep, istring, dialogType, optionStr
                 )
             if self.rOpenFileUrl.isChecked() and bool(self.schemesEdit.text()):
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, self.__prepareSchemesList())
-            code += '{0}){0}'.format(estring)
+                code += ",{0}{1}{2}".format(
+                    os.linesep, istring, self.__prepareSchemesList()
+                )
+            code += "{0}){0}".format(estring)
         elif (
-            self.rOpenFiles.isChecked() or
-            self.rfOpenFiles.isChecked() or
-            self.rOpenFileUrls.isChecked()
+            self.rOpenFiles.isChecked()
+            or self.rfOpenFiles.isChecked()
+            or self.rOpenFileUrls.isChecked()
         ):
             if self.rOpenFiles.isChecked():
-                code += 'getOpenFileNames({0}{1}'.format(os.linesep, istring)
+                code += "getOpenFileNames({0}{1}".format(os.linesep, istring)
             elif self.rOpenFileUrls.isChecked():
-                code += 'getOpenFileUrls({0}{1}'.format(os.linesep, istring)
+                code += "getOpenFileUrls({0}{1}".format(os.linesep, istring)
             else:
-                code += 'getOpenFileNamesAndFilter({0}{1}'.format(
-                    os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+                code += "getOpenFileNamesAndFilter({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             if not self.eCaption.text():
                 code += '"",{0}{1}'.format(os.linesep, istring)
             else:
                 code += 'self.tr("{0}"),{1}{2}'.format(
-                    self.eCaption.text(), os.linesep, istring)
+                    self.eCaption.text(), os.linesep, istring
+                )
             if self.rOpenFileUrls.isChecked():
                 if not self.eStartWith.text():
-                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
+                    code += "QUrl(),{0}{1}".format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = 'QUrl("{0}"),{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             else:
                 if not self.eStartWith.text():
                     code += '"",{0}{1}'.format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = '"{0}",{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             if not self.eFilters.text():
                 code += '""'
             else:
                 if self.cFilters.isChecked():
-                    fmt = '{0}'
+                    fmt = "{0}"
                 else:
                     fmt = 'self.tr("{0}")'
                 code += fmt.format(self.eFilters.text())
@@ -498,66 +504,61 @@
                     initialFilter = "None"
                 else:
                     if self.cInitialFilter.isChecked():
-                        fmt = '{0}'
+                        fmt = "{0}"
                     else:
                         fmt = 'self.tr("{0}")'
                     initialFilter = fmt.format(self.eInitialFilter.text())
-                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
+                code += ",{0}{1}{2}".format(os.linesep, istring, initialFilter)
             if not self.cSymlinks.isChecked():
-                code += (
-                    ',{0}{1}{2}{3}.DontResolveSymlinks'
-                    .format(os.linesep, istring, dialogType, optionStr)
+                code += ",{0}{1}{2}{3}.DontResolveSymlinks".format(
+                    os.linesep, istring, dialogType, optionStr
                 )
-            if (
-                self.rOpenFileUrls.isChecked() and
-                bool(self.schemesEdit.text())
-            ):
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, self.__prepareSchemesList())
-            code += '{0}){0}'.format(estring)
+            if self.rOpenFileUrls.isChecked() and bool(self.schemesEdit.text()):
+                code += ",{0}{1}{2}".format(
+                    os.linesep, istring, self.__prepareSchemesList()
+                )
+            code += "{0}){0}".format(estring)
         elif (
-            self.rSaveFile.isChecked() or
-            self.rfSaveFile.isChecked() or
-            self.rSaveFileUrl.isChecked()
+            self.rSaveFile.isChecked()
+            or self.rfSaveFile.isChecked()
+            or self.rSaveFileUrl.isChecked()
         ):
             if self.rSaveFile.isChecked():
-                code += 'getSaveFileName({0}{1}'.format(os.linesep, istring)
+                code += "getSaveFileName({0}{1}".format(os.linesep, istring)
             elif self.rSaveFileUrl.isChecked():
-                code += 'getSaveFileUrl({0}{1}'.format(os.linesep, istring)
+                code += "getSaveFileUrl({0}{1}".format(os.linesep, istring)
             else:
-                code += 'getSaveFileNameAndFilter({0}{1}'.format(
-                    os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+                code += "getSaveFileNameAndFilter({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             if not self.eCaption.text():
                 code += '"",{0}{1}'.format(os.linesep, istring)
             else:
                 code += 'self.tr("{0}"),{1}{2}'.format(
-                    self.eCaption.text(), os.linesep, istring)
+                    self.eCaption.text(), os.linesep, istring
+                )
             if self.rSaveFileUrl.isChecked():
                 if not self.eStartWith.text():
-                    code += 'QUrl(),{0}{1}'.format(os.linesep, istring)
+                    code += "QUrl(),{0}{1}".format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = 'QUrl("{0}"),{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             else:
                 if not self.eStartWith.text():
                     code += '"",{0}{1}'.format(os.linesep, istring)
                 else:
                     if self.cStartWith.isChecked():
-                        fmt = '{0},{1}{2}'
+                        fmt = "{0},{1}{2}"
                     else:
                         fmt = '"{0}",{1}{2}'
-                    code += fmt.format(self.eStartWith.text(), os.linesep,
-                                       istring)
+                    code += fmt.format(self.eStartWith.text(), os.linesep, istring)
             if not self.eFilters.text():
                 code += '""'
             else:
                 if self.cFilters.isChecked():
-                    fmt = '{0}'
+                    fmt = "{0}"
                 else:
                     fmt = 'self.tr("{0}")'
                 code += fmt.format(self.eFilters.text())
@@ -566,54 +567,47 @@
                     initialFilter = "None"
                 else:
                     if self.cInitialFilter.isChecked():
-                        fmt = '{0}'
+                        fmt = "{0}"
                     else:
                         fmt = 'self.tr("{0}")'
                     initialFilter = fmt.format(self.eInitialFilter.text())
-                code += ',{0}{1}{2}'.format(os.linesep, istring, initialFilter)
-            if (
-                (not self.cSymlinks.isChecked()) or
-                (not self.cConfirmOverwrite.isChecked())
+                code += ",{0}{1}{2}".format(os.linesep, istring, initialFilter)
+            if (not self.cSymlinks.isChecked()) or (
+                not self.cConfirmOverwrite.isChecked()
             ):
-                code += ',{0}{1}'.format(os.linesep, istring)
+                code += ",{0}{1}".format(os.linesep, istring)
                 if not self.cSymlinks.isChecked():
-                    code += '{0}{1}.DontResolveSymlinks'.format(
-                        dialogType, optionStr)
-                if (
-                    (not self.cSymlinks.isChecked()) and
-                    (not self.cConfirmOverwrite.isChecked())
+                    code += "{0}{1}.DontResolveSymlinks".format(dialogType, optionStr)
+                if (not self.cSymlinks.isChecked()) and (
+                    not self.cConfirmOverwrite.isChecked()
                 ):
-                    code += ' | '
+                    code += " | "
                 if not self.cConfirmOverwrite.isChecked():
-                    code += '{0}{1}.DontConfirmOverwrite'.format(
-                        dialogType, optionStr)
-            if (
-                self.rSaveFileUrl.isChecked() and
-                bool(self.schemesEdit.text())
-            ):
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, self.__prepareSchemesList())
-                            
-            code += '{0}){0}'.format(estring)
+                    code += "{0}{1}.DontConfirmOverwrite".format(dialogType, optionStr)
+            if self.rSaveFileUrl.isChecked() and bool(self.schemesEdit.text()):
+                code += ",{0}{1}{2}".format(
+                    os.linesep, istring, self.__prepareSchemesList()
+                )
+
+            code += "{0}){0}".format(estring)
         elif self.rDirectory.isChecked() or self.rDirectoryUrl.isChecked():
             if self.rDirectory.isChecked():
-                code += 'getExistingDirectory({0}{1}'.format(
-                    os.linesep, istring)
+                code += "getExistingDirectory({0}{1}".format(os.linesep, istring)
             else:
-                code += 'getExistingDirectoryUrl({0}{1}'.format(
-                    os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+                code += "getExistingDirectoryUrl({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             if not self.eCaption.text():
                 code += '"",{0}{1}'.format(os.linesep, istring)
             else:
                 code += 'self.tr("{0}"),{1}{2}'.format(
-                    self.eCaption.text(), os.linesep, istring)
+                    self.eCaption.text(), os.linesep, istring
+                )
             if self.rDirectoryUrl.isChecked():
                 if not self.eWorkDir.text():
-                    code += 'QUrl()'
+                    code += "QUrl()"
                 else:
                     if self.cWorkDir.isChecked():
-                        fmt = '{0}'
+                        fmt = "{0}"
                     else:
                         fmt = 'QUrl("{0}")'
                     code += fmt.format(self.eWorkDir.text())
@@ -622,39 +616,32 @@
                     code += '""'
                 else:
                     if self.cWorkDir.isChecked():
-                        fmt = '{0}'
+                        fmt = "{0}"
                     else:
                         fmt = '"{0}"'
                     code += fmt.format(self.eWorkDir.text())
-            code += ',{0}{1}'.format(os.linesep, istring)
-            if (
-                (not self.cSymlinks.isChecked()) or
-                self.cDirOnly.isChecked()
-            ):
+            code += ",{0}{1}".format(os.linesep, istring)
+            if (not self.cSymlinks.isChecked()) or self.cDirOnly.isChecked():
                 if not self.cSymlinks.isChecked():
-                    code += '{0}{1}.DontResolveSymlinks'.format(
-                        dialogType, optionStr)
-                if (
-                    (not self.cSymlinks.isChecked()) and
-                    self.cDirOnly.isChecked()
-                ):
-                    code += ' | '
+                    code += "{0}{1}.DontResolveSymlinks".format(dialogType, optionStr)
+                if (not self.cSymlinks.isChecked()) and self.cDirOnly.isChecked():
+                    code += " | "
                 if self.cDirOnly.isChecked():
-                    code += '{0}{1}.ShowDirsOnly'.format(
-                        dialogType, optionStr)
+                    code += "{0}{1}.ShowDirsOnly".format(dialogType, optionStr)
             else:
-                code += '{0}.Option(0)'.format(dialogType)
+                code += "{0}.Option(0)".format(dialogType)
             if self.rDirectoryUrl.isChecked():
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, self.__prepareSchemesList())
-            code += '{0}){0}'.format(estring)
-            
+                code += ",{0}{1}{2}".format(
+                    os.linesep, istring, self.__prepareSchemesList()
+                )
+            code += "{0}){0}".format(estring)
+
         return code
-    
+
     def __prepareSchemesList(self):
         """
         Private method to prepare the list of supported schemes.
-        
+
         @return string representation of the supported schemes
         @rtype str
         """
--- a/src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to select the applicable font dialog options.
     """
+
     def __init__(self, options, parent=None):
         """
         Constructor
-        
+
         @param options dictionary with flags for the various dialog options
         @type dict
         @param parent reference to the parent widget (defaults to None)
@@ -27,17 +28,17 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.noNativeDialogCheckBox.setChecked(options["noNativeDialog"])
         self.scalableCheckBox.setChecked(options["scalableFonts"])
         self.nonScalableCheckBox.setChecked(options["nonScalableFonts"])
         self.monospacedCheckBox.setChecked(options["monospacedFonts"])
         self.proportionalCheckBox.setChecked(options["proportionalFonts"])
-    
+
     def getOptions(self):
         """
         Public method to get the selected font dialog options.
-        
+
         @return dictionary with flags for the various dialog options
         @rtype dict
         """
--- a/src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
 class FontDialogWizardDialog(QDialog, Ui_FontDialogWizardDialog):
     """
     Class implementing the font dialog wizard dialog.
-    
+
     It displays a dialog for entering the parameters
     for the QFontDialog code generator.
     """
+
     FontWeight2Code = {
         100: "Thin",
         200: "ExtraLight",
@@ -33,19 +34,20 @@
         800: "ExtraBold",
         900: "Black",
     }
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         self.font = None
         self.fontOptions = {
             "noNativeDialog": False,
@@ -54,19 +56,19 @@
             "monospacedFonts": False,
             "proportionalFonts": False,
         }
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
@@ -87,24 +89,19 @@
                     options |= QFontDialog.FontDialogOption.MonospacedFonts
                 if self.fontOptions["proportionalFonts"]:
                     options |= QFontDialog.FontDialogOption.ProportionalFonts
-            QFontDialog.getFont(
-                self.font,
-                self,
-                self.eCaption.text(),
-                options
-            )
-    
+            QFontDialog.getFont(self.font, self, self.eCaption.text(), options)
+
     def on_eVariable_textChanged(self, text):
         """
         Private slot to handle the textChanged signal of eVariable.
-        
+
         @param text the new text (string)
         """
         if not text:
             self.bTest.setEnabled(True)
         else:
             self.bTest.setEnabled(False)
-        
+
     @pyqtSlot()
     def on_fontButton_clicked(self):
         """
@@ -119,21 +116,22 @@
             self.font = font
         else:
             self.font = None
-    
+
     @pyqtSlot()
     def on_optionsButton_clicked(self):
         """
         Private slot to handle the selection of font dialog options.
         """
         from .FontDialogOptionsDialog import FontDialogOptionsDialog
+
         dlg = FontDialogOptionsDialog(self.fontOptions, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.fontOptions = dlg.getOptions()
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -142,7 +140,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # generate the code
         resvar = self.eResultVar.text()
         if not resvar:
@@ -156,54 +154,40 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
-        code = '{0}, ok = QFontDialog.getFont('.format(resvar)
+
+        code = "{0}, ok = QFontDialog.getFont(".format(resvar)
         if self.eVariable.text() or self.font is not None:
             if title or parent != "None":
-                code += '{0}{1}'.format(os.linesep, istring)
+                code += "{0}{1}".format(os.linesep, istring)
             if not self.eVariable.text():
                 if self.font is not None:
-                    code += (
-                        'QFont(["{0}"], {1:d}, QFont.Weight.{2}, {3})'
-                        .format(
-                            self.font.family(),
-                            self.font.pointSize(),
-                            FontDialogWizardDialog.FontWeight2Code[
-                                self.font.weight()],
-                            "True" if self.font.italic() else "False")
+                    code += 'QFont(["{0}"], {1:d}, QFont.Weight.{2}, {3})'.format(
+                        self.font.family(),
+                        self.font.pointSize(),
+                        FontDialogWizardDialog.FontWeight2Code[self.font.weight()],
+                        "True" if self.font.italic() else "False",
                     )
             else:
                 code += self.eVariable.text()
             if title:
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, parent)
-                code += ',{0}{1}self.tr("{2}")'.format(
-                    os.linesep, istring, title)
+                code += ",{0}{1}{2}".format(os.linesep, istring, parent)
+                code += ',{0}{1}self.tr("{2}")'.format(os.linesep, istring, title)
             elif parent != "None":
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, parent)
+                code += ",{0}{1}{2}".format(os.linesep, istring, parent)
             if any(self.fontOptions.values()):
                 options = []
                 if self.fontOptions["noNativeDialog"]:
-                    options.append(
-                        "QFontDialog.FontDialogOption.DontUseNativeDialog")
+                    options.append("QFontDialog.FontDialogOption.DontUseNativeDialog")
                 if self.fontOptions["scalableFonts"]:
-                    options.append(
-                        "QFontDialog.FontDialogOption.ScalableFonts")
+                    options.append("QFontDialog.FontDialogOption.ScalableFonts")
                 if self.fontOptions["nonScalableFonts"]:
-                    options.append(
-                        "QFontDialog.FontDialogOption.NonScalableFonts")
+                    options.append("QFontDialog.FontDialogOption.NonScalableFonts")
                 if self.fontOptions["monospacedFonts"]:
-                    options.append(
-                        "QFontDialog.FontDialogOption.MonospacedFonts")
+                    options.append("QFontDialog.FontDialogOption.MonospacedFonts")
                 if self.fontOptions["proportionalFonts"]:
-                    options.append(
-                        "QFontDialog.FontDialogOption.ProportionalFonts")
-                fontOptionsString = (
-                    ' |{0}{1}'.format(os.linesep, istring).join(options)
-                )
-                code += ',{0}{1}{2}'.format(
-                    os.linesep, istring, fontOptionsString)
-        code += '{0}){0}'.format(estring)
-        
+                    options.append("QFontDialog.FontDialogOption.ProportionalFonts")
+                fontOptionsString = " |{0}{1}".format(os.linesep, istring).join(options)
+                code += ",{0}{1}{2}".format(os.linesep, istring, fontOptionsString)
+        code += "{0}){0}".format(estring)
+
         return code
--- a/src/eric7/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,50 +19,55 @@
 class InputDialogWizardDialog(QDialog, Ui_InputDialogWizardDialog):
     """
     Class implementing the input dialog wizard dialog.
-    
+
     It displays a dialog for entering the parameters
     for the QInputDialog code generator.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # set the validators for the double line edits
         self.eDoubleDefault.setValidator(
-            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleDefault))
+            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleDefault)
+        )
         self.eDoubleFrom.setValidator(
-            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleFrom))
+            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleFrom)
+        )
         self.eDoubleTo.setValidator(
-            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleTo))
-        
+            QDoubleValidator(-2147483647, 2147483647, 99, self.eDoubleTo)
+        )
+
         self.rText.toggled.connect(self.__typeSelectButtonToggled)
         self.rMultiLineText.toggled.connect(self.__typeSelectButtonToggled)
         self.rInteger.toggled.connect(self.__typeSelectButtonToggled)
         self.rDouble.toggled.connect(self.__typeSelectButtonToggled)
         self.rItem.toggled.connect(self.__typeSelectButtonToggled)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         # simulate a dialog type selection
         self.__typeSelectButtonToggled(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(bool)
     def __typeSelectButtonToggled(self, checked):
         """
         Private slot to modify the dialog according to the selected type.
-        
+
         Note: This is a multiplexed slot. Therefore it just reacts upon a
         positive check state (i.e. checked == True).
-        
+
         @param checked flag indicating the checked state
         @type bool
         """
@@ -79,16 +84,16 @@
             elif self.rItem.isChecked():
                 self.specificsStack.setCurrentWidget(self.itemPage)
                 self.bTest.setEnabled(False)
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
@@ -106,13 +111,15 @@
                 self.eCaption.text(),
                 self.eLabel.text(),
                 echomode,
-                self.eTextDefault.text())
+                self.eTextDefault.text(),
+            )
         elif self.rMultiLineText.isChecked():
             QInputDialog.getMultiLineText(
                 None,
                 self.eCaption.text(),
                 self.eLabel.text(),
-                self.eMultiTextDefault.toPlainText())
+                self.eMultiTextDefault.toPlainText(),
+            )
         elif self.rInteger.isChecked():
             QInputDialog.getInt(
                 None,
@@ -121,7 +128,8 @@
                 self.sIntDefault.value(),
                 self.sIntFrom.value(),
                 self.sIntTo.value(),
-                self.sIntStep.value())
+                self.sIntStep.value(),
+            )
         elif self.rDouble.isChecked():
             try:
                 doubleDefault = float(self.eDoubleDefault.text())
@@ -142,12 +150,13 @@
                 doubleDefault,
                 doubleFrom,
                 doubleTo,
-                self.sDoubleDecimals.value())
-        
+                self.sDoubleDecimals.value(),
+            )
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code for Qt6.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -156,7 +165,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.parentSelf.isChecked():
             parent = "self"
@@ -166,62 +175,66 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
+
         resvar = self.eResultVar.text()
         if not resvar:
             resvar = "result"
-        code = '{0}, ok = QInputDialog.'.format(resvar)
+        code = "{0}, ok = QInputDialog.".format(resvar)
         if self.rText.isChecked():
-            code += 'getText({0}{1}'.format(os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+            code += "getText({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eCaption.text(), os.linesep, istring)
+                self.eCaption.text(), os.linesep, istring
+            )
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eLabel.text(), os.linesep, istring)
+                self.eLabel.text(), os.linesep, istring
+            )
             if self.rEchoNormal.isChecked():
-                code += 'QLineEdit.EchoMode.Normal'
+                code += "QLineEdit.EchoMode.Normal"
             elif self.rEchoNoEcho.isChecked():
-                code += 'QLineEdit.EchoMode.NoEcho'
+                code += "QLineEdit.EchoMode.NoEcho"
             else:
-                code += 'QLineEdit.EchoMode.Password'
+                code += "QLineEdit.EchoMode.Password"
             if self.eTextDefault.text():
                 if self.cTranslateTextDefault.isChecked():
                     code += ',{0}{1}self.tr("{2}")'.format(
-                        os.linesep, istring, self.eTextDefault.text())
+                        os.linesep, istring, self.eTextDefault.text()
+                    )
                 else:
                     code += ',{0}{1}"{2}"'.format(
-                        os.linesep, istring, self.eTextDefault.text())
-            code += '{0}){0}'.format(estring)
+                        os.linesep, istring, self.eTextDefault.text()
+                    )
+            code += "{0}){0}".format(estring)
         elif self.rMultiLineText.isChecked():
-            code += 'getMultiLineText({0}{1}'.format(os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+            code += "getMultiLineText({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eCaption.text(), os.linesep, istring)
+                self.eCaption.text(), os.linesep, istring
+            )
             code += 'self.tr("{0}")'.format(self.eLabel.text())
             if self.eMultiTextDefault.toPlainText():
-                defTxt = "\\n".join(
-                    self.eMultiTextDefault.toPlainText().splitlines()
-                )
+                defTxt = "\\n".join(self.eMultiTextDefault.toPlainText().splitlines())
                 if self.cTranslateMultiTextDefault.isChecked():
-                    code += ',{0}{1}self.tr("{2}")'.format(
-                        os.linesep, istring,
-                        defTxt)
+                    code += ',{0}{1}self.tr("{2}")'.format(os.linesep, istring, defTxt)
                 else:
-                    code += ',{0}{1}"{2}"'.format(
-                        os.linesep, istring,
-                        defTxt)
-            code += '{0}){0}'.format(estring)
+                    code += ',{0}{1}"{2}"'.format(os.linesep, istring, defTxt)
+            code += "{0}){0}".format(estring)
         elif self.rInteger.isChecked():
-            code += 'getInt({0}{1}'.format(os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+            code += "getInt({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
+            code += 'self.tr("{0}"),{1}{2}'.format(
+                self.eCaption.text(), os.linesep, istring
+            )
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eCaption.text(), os.linesep, istring)
-            code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eLabel.text(), os.linesep, istring)
-            code += '{0:d}, {1:d}, {2:d}, {3:d}'.format(
-                self.sIntDefault.value(), self.sIntFrom.value(),
-                self.sIntTo.value(), self.sIntStep.value())
-            code += '{0}){0}'.format(estring)
+                self.eLabel.text(), os.linesep, istring
+            )
+            code += "{0:d}, {1:d}, {2:d}, {3:d}".format(
+                self.sIntDefault.value(),
+                self.sIntFrom.value(),
+                self.sIntTo.value(),
+                self.sIntStep.value(),
+            )
+            code += "{0}){0}".format(estring)
         elif self.rDouble.isChecked():
             try:
                 doubleDefault = float(self.eDoubleDefault.text())
@@ -235,27 +248,31 @@
                 doubleTo = float(self.eDoubleTo.text())
             except ValueError:
                 doubleTo = 2147483647
-            code += 'getDouble({0}{1}'.format(os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+            code += "getDouble({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eCaption.text(), os.linesep, istring)
+                self.eCaption.text(), os.linesep, istring
+            )
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eLabel.text(), os.linesep, istring)
-            code += '{0}, {1}, {2}, {3:d}'.format(
-                doubleDefault, doubleFrom, doubleTo,
-                self.sDoubleDecimals.value())
-            code += '{0}){0}'.format(estring)
+                self.eLabel.text(), os.linesep, istring
+            )
+            code += "{0}, {1}, {2}, {3:d}".format(
+                doubleDefault, doubleFrom, doubleTo, self.sDoubleDecimals.value()
+            )
+            code += "{0}){0}".format(estring)
         elif self.rItem.isChecked():
-            code += 'getItem({0}{1}'.format(os.linesep, istring)
-            code += '{0},{1}{2}'.format(parent, os.linesep, istring)
+            code += "getItem({0}{1}".format(os.linesep, istring)
+            code += "{0},{1}{2}".format(parent, os.linesep, istring)
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eCaption.text(), os.linesep, istring)
+                self.eCaption.text(), os.linesep, istring
+            )
             code += 'self.tr("{0}"),{1}{2}'.format(
-                self.eLabel.text(), os.linesep, istring)
-            code += '{0},{1}{2}'.format(
-                self.eVariable.text(), os.linesep, istring)
-            code += '{0:d}, {1}'.format(
-                self.sCurrentItem.value(), self.cEditable.isChecked())
-            code += '{0}){0}'.format(estring)
-            
+                self.eLabel.text(), os.linesep, istring
+            )
+            code += "{0},{1}{2}".format(self.eVariable.text(), os.linesep, istring)
+            code += "{0:d}, {1}".format(
+                self.sCurrentItem.value(), self.cEditable.isChecked()
+            )
+            code += "{0}){0}".format(estring)
+
         return code
--- a/src/eric7/Plugins/WizardPlugins/MessageBoxWizard/MessageBoxWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/MessageBoxWizard/MessageBoxWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,19 +18,20 @@
 class MessageBoxWizardDialog(QDialog, Ui_MessageBoxWizardDialog):
     """
     Class implementing the message box wizard dialog.
-    
+
     It displays a dialog for entering the parameters
     for the QMessageBox code generator.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # keep the following three lists in sync
         self.buttonsList = [
             self.tr("No button"),
@@ -95,12 +96,13 @@
             "QMessageBox.StandardButton.Yes",
             "QMessageBox.StandardButton.YesToAll",
         ]
-        
+
         self.defaultCombo.addItems(self.buttonsList)
-        
+
         self.bTest = self.buttonBox.addButton(
-            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole)
-    
+            self.tr("Test"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
     def __testSelectedOptions(self):
         """
         Private method to test the selected options.
@@ -144,17 +146,16 @@
             buttons |= QMessageBox.StandardButton.YesToAll
         if buttons == QMessageBox.StandardButton.NoButton:
             buttons = QMessageBox.StandardButton.Ok
-        
-        defaultButton = self.buttonsCodeListBinary[
-            self.defaultCombo.currentIndex()]
-        
+
+        defaultButton = self.buttonsCodeListBinary[self.defaultCombo.currentIndex()]
+
         if self.rInformation.isChecked():
             QMessageBox.information(
                 self,
                 self.eCaption.text(),
                 self.eMessage.toPlainText(),
                 buttons,
-                defaultButton
+                defaultButton,
             )
         elif self.rQuestion.isChecked():
             QMessageBox.question(
@@ -162,7 +163,7 @@
                 self.eCaption.text(),
                 self.eMessage.toPlainText(),
                 buttons,
-                defaultButton
+                defaultButton,
             )
         elif self.rWarning.isChecked():
             QMessageBox.warning(
@@ -170,7 +171,7 @@
                 self.eCaption.text(),
                 self.eMessage.toPlainText(),
                 buttons,
-                defaultButton
+                defaultButton,
             )
         elif self.rCritical.isChecked():
             QMessageBox.critical(
@@ -178,37 +179,30 @@
                 self.eCaption.text(),
                 self.eMessage.toPlainText(),
                 buttons,
-                defaultButton
+                defaultButton,
             )
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.bTest:
             self.on_bTest_clicked()
-    
+
     @pyqtSlot()
     def on_bTest_clicked(self):
         """
         Private method to test the selected options.
         """
         if self.rAbout.isChecked():
-            QMessageBox.about(
-                None,
-                self.eCaption.text(),
-                self.eMessage.toPlainText()
-            )
+            QMessageBox.about(None, self.eCaption.text(), self.eMessage.toPlainText())
         elif self.rAboutQt.isChecked():
-            QMessageBox.aboutQt(
-                None,
-                self.eCaption.text()
-            )
+            QMessageBox.aboutQt(None, self.eCaption.text())
         else:
             self.__testSelectedOptions()
-    
+
     def __enabledGroups(self):
         """
         Private method to enable/disable some group boxes.
@@ -217,29 +211,29 @@
         self.standardButtons.setEnabled(enable)
         self.lResultVar.setEnabled(enable)
         self.eResultVar.setEnabled(enable)
-        
+
         self.eMessage.setEnabled(not self.rAboutQt.isChecked())
-    
+
     def on_rAbout_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rAbout radio button.
-        
+
         @param on toggle state (boolean) (ignored)
         """
         self.__enabledGroups()
-    
+
     def on_rAboutQt_toggled(self, on):
         """
         Private slot to handle the toggled signal of the rAboutQt radio button.
-        
+
         @param on toggle state (boolean) (ignored)
         """
         self.__enabledGroups()
-    
+
     def __getButtonCode(self, istring, indString):
         """
         Private method to generate the button code.
-        
+
         @param istring indentation string (string)
         @param indString string used for indentation (space or tab) (string)
         @return the button code (string)
@@ -283,24 +277,22 @@
             buttons.append("QMessageBox.StandardButton.YesToAll")
         if len(buttons) == 0:
             return ""
-        
+
         istring2 = istring + indString
-        joinstring = ' |{0}{1}'.format(os.linesep, istring2)
-        btnCode = ',{0}{1}('.format(
-            os.linesep, istring)
-        btnCode += '{0}{1}{2})'.format(
-            os.linesep, istring2, joinstring.join(buttons))
+        joinstring = " |{0}{1}".format(os.linesep, istring2)
+        btnCode = ",{0}{1}(".format(os.linesep, istring)
+        btnCode += "{0}{1}{2})".format(os.linesep, istring2, joinstring.join(buttons))
         defaultIndex = self.defaultCombo.currentIndex()
         if defaultIndex:
-            btnCode += ',{0}{1}{2}'.format(
-                os.linesep, istring,
-                self.buttonsCodeListText[defaultIndex])
+            btnCode += ",{0}{1}{2}".format(
+                os.linesep, istring, self.buttonsCodeListText[defaultIndex]
+            )
         return btnCode
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -309,7 +301,7 @@
         il = indLevel + 1
         istring = il * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.parentSelf.isChecked():
             parent = "self"
@@ -319,11 +311,11 @@
             parent = self.parentEdit.text()
             if parent == "":
                 parent = "None"
-        
+
         resvar = self.eResultVar.text()
         if not resvar:
             resvar = "res"
-        
+
         if self.rAbout.isChecked():
             msgdlg = "QMessageBox.about("
         elif self.rAboutQt.isChecked():
@@ -336,21 +328,24 @@
             msgdlg = "{0} = QMessageBox.warning(".format(resvar)
         else:
             msgdlg = "{0} = QMessageBox.critical(".format(resvar)
-        
+
         if self.rAboutQt.isChecked():
             if self.eCaption.text():
-                msgdlg += '{0}{1}{2}'.format(os.linesep, istring, parent)
+                msgdlg += "{0}{1}{2}".format(os.linesep, istring, parent)
                 msgdlg += ',{0}{1}self.tr("{2}")'.format(
-                    os.linesep, istring, self.eCaption.text())
+                    os.linesep, istring, self.eCaption.text()
+                )
             else:
                 msgdlg += parent
         else:
-            msgdlg += '{0}{1}{2}'.format(os.linesep, istring, parent)
+            msgdlg += "{0}{1}{2}".format(os.linesep, istring, parent)
             msgdlg += ',{0}{1}self.tr("{2}")'.format(
-                os.linesep, istring, self.eCaption.text())
+                os.linesep, istring, self.eCaption.text()
+            )
             msgdlg += ',{0}{1}self.tr("""{2}""")'.format(
-                os.linesep, istring, self.eMessage.toPlainText())
+                os.linesep, istring, self.eMessage.toPlainText()
+            )
             if not self.rAbout.isChecked() and not self.rAboutQt.isChecked():
                 msgdlg += self.__getButtonCode(istring, indString)
-        msgdlg += '{0}){0}'.format(estring)
+        msgdlg += "{0}){0}".format(estring)
         return msgdlg
--- a/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,47 +10,45 @@
 from PyQt6.QtCore import QRegularExpression
 from PyQt6.QtGui import QRegularExpressionValidator
 from PyQt6.QtWidgets import (
-    QSizePolicy, QSpacerItem, QWidget, QHBoxLayout, QLineEdit, QPushButton,
-    QDialog, QScrollArea, QComboBox, QVBoxLayout, QLabel
+    QSizePolicy,
+    QSpacerItem,
+    QWidget,
+    QHBoxLayout,
+    QLineEdit,
+    QPushButton,
+    QDialog,
+    QScrollArea,
+    QComboBox,
+    QVBoxLayout,
+    QLabel,
 )
 
-from .Ui_PyRegExpWizardCharactersDialog import (
-    Ui_PyRegExpWizardCharactersDialog
-)
+from .Ui_PyRegExpWizardCharactersDialog import Ui_PyRegExpWizardCharactersDialog
 
 
-class PyRegExpWizardCharactersDialog(
-        QDialog, Ui_PyRegExpWizardCharactersDialog):
+class PyRegExpWizardCharactersDialog(QDialog, Ui_PyRegExpWizardCharactersDialog):
     """
     Class implementing a dialog for entering character classes.
     """
-    specialChars = {
-        4: "\\a",
-        5: "\\f",
-        6: "\\n",
-        7: "\\r",
-        8: "\\t",
-        9: "\\v"
-    }
-    
+
+    specialChars = {4: "\\a", 5: "\\f", 6: "\\n", 7: "\\r", 8: "\\t", 9: "\\v"}
+
     predefinedClasses = ["\\s", "\\S", "\\w", "\\W", "\\d", "\\D"]
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.comboItems = []
-        self.singleComboItems = []      # these are in addition to the above
+        self.singleComboItems = []  # these are in addition to the above
         self.comboItems.append(self.tr("Normal character"))
-        self.comboItems.append(
-            self.tr("Unicode character in hexadecimal notation"))
-        self.comboItems.append(
-            self.tr("Unicode character in octal notation"))
+        self.comboItems.append(self.tr("Unicode character in hexadecimal notation"))
+        self.comboItems.append(self.tr("Unicode character in octal notation"))
         self.singleComboItems.append(self.tr("---"))
         self.singleComboItems.append(self.tr("Bell character (\\a)"))
         self.singleComboItems.append(self.tr("Page break (\\f)"))
@@ -58,14 +56,17 @@
         self.singleComboItems.append(self.tr("Carriage return (\\r)"))
         self.singleComboItems.append(self.tr("Horizontal tabulator (\\t)"))
         self.singleComboItems.append(self.tr("Vertical tabulator (\\v)"))
-        
+
         self.charValidator = QRegularExpressionValidator(
-            QRegularExpression(".{0,1}"), self)
+            QRegularExpression(".{0,1}"), self
+        )
         self.hexValidator = QRegularExpressionValidator(
-            QRegularExpression("[0-9a-fA-F]{0,4}"), self)
+            QRegularExpression("[0-9a-fA-F]{0,4}"), self
+        )
         self.octValidator = QRegularExpressionValidator(
-            QRegularExpression("[0-3]?[0-7]{0,2}"), self)
-        
+            QRegularExpression("[0-3]?[0-7]{0,2}"), self
+        )
+
         # generate dialog part for single characters
         self.singlesBoxLayout = QVBoxLayout(self.singlesBox)
         self.singlesBoxLayout.setObjectName("singlesBoxLayout")
@@ -75,7 +76,7 @@
         self.singlesView = QScrollArea(self.singlesBox)
         self.singlesView.setObjectName("singlesView")
         self.singlesBoxLayout.addWidget(self.singlesView)
-        
+
         self.singlesItemsBox = QWidget(self)
         self.singlesView.setWidget(self.singlesItemsBox)
         self.singlesItemsBox.setObjectName("singlesItemsBox")
@@ -85,21 +86,23 @@
         self.singlesItemsBox.setLayout(self.singlesItemsBoxLayout)
         self.singlesEntries = []
         self.__addSinglesLine()
-        
+
         hlayout0 = QHBoxLayout()
         hlayout0.setContentsMargins(0, 0, 0, 0)
         hlayout0.setSpacing(6)
         hlayout0.setObjectName("hlayout0")
         self.moreSinglesButton = QPushButton(
-            self.tr("Additional Entries"), self.singlesBox)
+            self.tr("Additional Entries"), self.singlesBox
+        )
         self.moreSinglesButton.setObjectName("moreSinglesButton")
         hlayout0.addWidget(self.moreSinglesButton)
         hspacer0 = QSpacerItem(
-            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         hlayout0.addItem(hspacer0)
         self.singlesBoxLayout.addLayout(hlayout0)
         self.moreSinglesButton.clicked.connect(self.__addSinglesLine)
-        
+
         # generate dialog part for character ranges
         self.rangesBoxLayout = QVBoxLayout(self.rangesBox)
         self.rangesBoxLayout.setObjectName("rangesBoxLayout")
@@ -109,7 +112,7 @@
         self.rangesView = QScrollArea(self.rangesBox)
         self.rangesView.setObjectName("rangesView")
         self.rangesBoxLayout.addWidget(self.rangesView)
-        
+
         self.rangesItemsBox = QWidget(self)
         self.rangesView.setWidget(self.rangesItemsBox)
         self.rangesItemsBox.setObjectName("rangesItemsBox")
@@ -119,21 +122,23 @@
         self.rangesItemsBox.setLayout(self.rangesItemsBoxLayout)
         self.rangesEntries = []
         self.__addRangesLine()
-        
+
         hlayout1 = QHBoxLayout()
         hlayout1.setContentsMargins(0, 0, 0, 0)
         hlayout1.setSpacing(6)
         hlayout1.setObjectName("hlayout1")
         self.moreRangesButton = QPushButton(
-            self.tr("Additional Entries"), self.rangesBox)
+            self.tr("Additional Entries"), self.rangesBox
+        )
         self.moreSinglesButton.setObjectName("moreRangesButton")
         hlayout1.addWidget(self.moreRangesButton)
         hspacer1 = QSpacerItem(
-            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         hlayout1.addItem(hspacer1)
         self.rangesBoxLayout.addLayout(hlayout1)
         self.moreRangesButton.clicked.connect(self.__addRangesLine)
-        
+
     def __addSinglesLine(self):
         """
         Private slot to add a line of entry widgets for single characters.
@@ -160,18 +165,16 @@
         le2.setValidator(self.charValidator)
         hboxLayout.addWidget(le2)
         self.singlesItemsBoxLayout.addWidget(hbox)
-        
-        cb1.activated[int].connect(
-            lambda i: self.__singlesCharTypeSelected(i, cb1))
-        cb2.activated[int].connect(
-            lambda i: self.__singlesCharTypeSelected(i, cb2))
+
+        cb1.activated[int].connect(lambda i: self.__singlesCharTypeSelected(i, cb1))
+        cb2.activated[int].connect(lambda i: self.__singlesCharTypeSelected(i, cb2))
         hbox.show()
-        
+
         self.singlesItemsBox.adjustSize()
-        
+
         self.singlesEntries.append([cb1, le1])
         self.singlesEntries.append([cb2, le2])
-        
+
     def __addRangesLine(self):
         """
         Private slot to add a line of entry widgets for character ranges.
@@ -196,20 +199,19 @@
         le2.setValidator(self.charValidator)
         hboxLayout.addWidget(le2)
         self.rangesItemsBoxLayout.addWidget(hbox)
-        
-        cb1.activated[int].connect(
-            lambda i: self.__rangesCharTypeSelected(i, cb1))
-        
+
+        cb1.activated[int].connect(lambda i: self.__rangesCharTypeSelected(i, cb1))
+
         hbox.show()
-        
+
         self.rangesItemsBox.adjustSize()
-        
+
         self.rangesEntries.append([cb1, le1, le2])
-        
+
     def __performSelectedAction(self, index, lineedit):
         """
         Private method performing some actions depending on the input.
-        
+
         @param index selected list index (integer)
         @param lineedit line edit widget to act on (QLineEdit)
         """
@@ -224,12 +226,12 @@
         elif index > 3:
             lineedit.setEnabled(False)
         lineedit.clear()
-        
+
     def __singlesCharTypeSelected(self, index, combo):
         """
         Private slot to handle the activated(int) signal of the single chars
         combo boxes.
-        
+
         @param index selected list index
         @type int
         @param combo reference to the combo box
@@ -239,12 +241,12 @@
             if combo == entriesList[0]:
                 self.__performSelectedAction(index, entriesList[1])
                 break
-        
+
     def __rangesCharTypeSelected(self, index, combo):
         """
         Private slot to handle the activated(int) signal of the char ranges
         combo boxes.
-        
+
         @param index selected list index
         @type int
         @param combo reference to the combo box
@@ -255,11 +257,11 @@
                 self.__performSelectedAction(index, entriesList[1])
                 self.__performSelectedAction(index, entriesList[2])
                 break
-        
+
     def __formatCharacter(self, index, char):
         """
         Private method to format the characters entered into the dialog.
-        
+
         @param index selected list index (integer)
         @param char character string enetered into the dialog (string)
         @return formated character string (string)
@@ -275,19 +277,19 @@
                 return self.specialChars[index]
             except KeyError:
                 return ""
-        
+
     def getCharacters(self):
         """
         Public method to return the character string assembled via the dialog.
-        
+
         @return formatted string for character classes (string)
         """
         regexp = ""
-        
+
         # negative character range
         if self.negativeCheckBox.isChecked():
             regexp += "^"
-            
+
         # predefined character ranges
         if self.wordCharCheckBox.isChecked():
             regexp += "\\w"
@@ -301,34 +303,30 @@
             regexp += "\\s"
         if self.nonWhitespaceCheckBox.isChecked():
             regexp += "\\S"
-            
+
         # single characters
         for entrieslist in self.singlesEntries:
             index = entrieslist[0].currentIndex()
             char = entrieslist[1].text()
             regexp += self.__formatCharacter(index, char)
-        
+
         # character ranges
         for entrieslist in self.rangesEntries:
-            if (
-                entrieslist[1].text() == "" or
-                entrieslist[2].text() == ""
-            ):
+            if entrieslist[1].text() == "" or entrieslist[2].text() == "":
                 continue
             index = entrieslist[0].currentIndex()
             char1 = entrieslist[1].text()
             char2 = entrieslist[2].text()
             regexp += "{0}-{1}".format(
                 self.__formatCharacter(index, char1),
-                self.__formatCharacter(index, char2))
-        
+                self.__formatCharacter(index, char2),
+            )
+
         if regexp:
             if (
-                (len(regexp) == 2 and
-                 (regexp in self.predefinedClasses or
-                  regexp in self.specialChars)) or
-                len(regexp) == 1
-            ):
+                len(regexp) == 2
+                and (regexp in self.predefinedClasses or regexp in self.specialChars)
+            ) or len(regexp) == 1:
                 return regexp
             else:
                 return "[{0}]".format(regexp)
--- a/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,8 +14,13 @@
 from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtGui import QClipboard, QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QDialog, QInputDialog, QApplication, QDialogButtonBox,
-    QVBoxLayout, QTableWidgetItem
+    QWidget,
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QDialogButtonBox,
+    QVBoxLayout,
+    QTableWidgetItem,
 )
 
 from EricWidgets import EricMessageBox, EricFileDialog
@@ -33,16 +38,17 @@
     """
     Class implementing the Python re wizard dialog.
     """
+
     def __init__(self, parent=None, fromEric=True):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         @param fromEric flag indicating a call from within eric
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # initialize icons of the tool buttons
         self.commentButton.setIcon(UI.PixmapCache.getIcon("comment"))
         self.charButton.setIcon(UI.PixmapCache.getIcon("characters"))
@@ -51,62 +57,59 @@
         self.nonGroupButton.setIcon(UI.PixmapCache.getIcon("nongroup"))
         self.groupButton.setIcon(UI.PixmapCache.getIcon("group"))
         self.namedGroupButton.setIcon(UI.PixmapCache.getIcon("namedgroup"))
-        self.namedReferenceButton.setIcon(
-            UI.PixmapCache.getIcon("namedreference"))
+        self.namedReferenceButton.setIcon(UI.PixmapCache.getIcon("namedreference"))
         self.altnButton.setIcon(UI.PixmapCache.getIcon("altn"))
         self.beglineButton.setIcon(UI.PixmapCache.getIcon("begline"))
         self.endlineButton.setIcon(UI.PixmapCache.getIcon("endline"))
-        self.wordboundButton.setIcon(
-            UI.PixmapCache.getIcon("wordboundary"))
-        self.nonwordboundButton.setIcon(
-            UI.PixmapCache.getIcon("nonwordboundary"))
-        self.poslookaheadButton.setIcon(
-            UI.PixmapCache.getIcon("poslookahead"))
-        self.neglookaheadButton.setIcon(
-            UI.PixmapCache.getIcon("neglookahead"))
-        self.poslookbehindButton.setIcon(
-            UI.PixmapCache.getIcon("poslookbehind"))
-        self.neglookbehindButton.setIcon(
-            UI.PixmapCache.getIcon("neglookbehind"))
+        self.wordboundButton.setIcon(UI.PixmapCache.getIcon("wordboundary"))
+        self.nonwordboundButton.setIcon(UI.PixmapCache.getIcon("nonwordboundary"))
+        self.poslookaheadButton.setIcon(UI.PixmapCache.getIcon("poslookahead"))
+        self.neglookaheadButton.setIcon(UI.PixmapCache.getIcon("neglookahead"))
+        self.poslookbehindButton.setIcon(UI.PixmapCache.getIcon("poslookbehind"))
+        self.neglookbehindButton.setIcon(UI.PixmapCache.getIcon("neglookbehind"))
         self.undoButton.setIcon(UI.PixmapCache.getIcon("editUndo"))
         self.redoButton.setIcon(UI.PixmapCache.getIcon("editRedo"))
-        
+
         self.namedGroups = re.compile(r"""\(?P<([^>]+)>""").findall
-        
+
         self.saveButton = self.buttonBox.addButton(
-            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.saveButton.setToolTip(
-            self.tr("Save the regular expression to a file"))
+            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.saveButton.setToolTip(self.tr("Save the regular expression to a file"))
         self.loadButton = self.buttonBox.addButton(
-            self.tr("Load"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.loadButton.setToolTip(
-            self.tr("Load a regular expression from a file"))
+            self.tr("Load"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.loadButton.setToolTip(self.tr("Load a regular expression from a file"))
         self.validateButton = self.buttonBox.addButton(
-            self.tr("Validate"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.validateButton.setToolTip(
-            self.tr("Validate the regular expression"))
+            self.tr("Validate"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.validateButton.setToolTip(self.tr("Validate the regular expression"))
         self.executeButton = self.buttonBox.addButton(
-            self.tr("Execute"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.executeButton.setToolTip(
-            self.tr("Execute the regular expression"))
+            self.tr("Execute"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.executeButton.setToolTip(self.tr("Execute the regular expression"))
         self.nextButton = self.buttonBox.addButton(
-            self.tr("Next match"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Next match"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.nextButton.setToolTip(
-            self.tr("Show the next match of the regular expression"))
+            self.tr("Show the next match of the regular expression")
+        )
         self.nextButton.setEnabled(False)
-        
+
         if fromEric:
             self.buttonBox.setStandardButtons(
-                QDialogButtonBox.StandardButton.Cancel |
-                QDialogButtonBox.StandardButton.Ok)
+                QDialogButtonBox.StandardButton.Cancel
+                | QDialogButtonBox.StandardButton.Ok
+            )
             self.copyButton = None
         else:
             self.copyButton = self.buttonBox.addButton(
-                self.tr("Copy"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Copy"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.copyButton.setToolTip(
-                self.tr("Copy the regular expression to the clipboard"))
-            self.buttonBox.setStandardButtons(
-                QDialogButtonBox.StandardButton.Close)
+                self.tr("Copy the regular expression to the clipboard")
+            )
+            self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close)
             self.variableLabel.hide()
             self.variableLineEdit.hide()
             self.variableLine.hide()
@@ -116,7 +119,7 @@
     def __insertString(self, s, steps=0):
         """
         Private method to insert a string into line edit and move cursor.
-        
+
         @param s string to be inserted into the regexp line edit
             (string)
         @param steps number of characters to move the cursor (integer).
@@ -133,42 +136,42 @@
             for _ in range(steps):
                 tc.movePosition(act)
         self.regexpTextEdit.setTextCursor(tc)
-        
+
     @pyqtSlot()
     def on_commentButton_clicked(self):
         """
         Private slot to handle the comment toolbutton.
         """
         self.__insertString("(?#)", -1)
-        
+
     @pyqtSlot()
     def on_anycharButton_clicked(self):
         """
         Private slot to handle the any character toolbutton.
         """
         self.__insertString(".")
-        
+
     @pyqtSlot()
     def on_nonGroupButton_clicked(self):
         """
         Private slot to handle the non group toolbutton.
         """
         self.__insertString("(?:)", -1)
-        
+
     @pyqtSlot()
     def on_groupButton_clicked(self):
         """
         Private slot to handle the group toolbutton.
         """
         self.__insertString("()", -1)
-        
+
     @pyqtSlot()
     def on_namedGroupButton_clicked(self):
         """
         Private slot to handle the named group toolbutton.
         """
         self.__insertString("(?P<>)", -2)
-        
+
     @pyqtSlot()
     def on_namedReferenceButton_clicked(self):
         """
@@ -176,7 +179,7 @@
         """
         # determine cursor position as length into text
         length = self.regexpTextEdit.textCursor().position()
-        
+
         # only present group names that occur before the
         # current cursor position
         regex = self.regexpTextEdit.toPlainText()[:length]
@@ -185,121 +188,124 @@
             EricMessageBox.information(
                 self,
                 self.tr("Named reference"),
-                self.tr("""No named groups have been defined yet."""))
+                self.tr("""No named groups have been defined yet."""),
+            )
             return
-        
+
         groupName, ok = QInputDialog.getItem(
             self,
             self.tr("Named reference"),
             self.tr("Select group name:"),
             names,
-            0, True)
+            0,
+            True,
+        )
         if ok and groupName:
             self.__insertString("(?P={0})".format(groupName))
-        
+
     @pyqtSlot()
     def on_altnButton_clicked(self):
         """
         Private slot to handle the alternatives toolbutton.
         """
         self.__insertString("(|)", -2)
-        
+
     @pyqtSlot()
     def on_beglineButton_clicked(self):
         """
         Private slot to handle the begin line toolbutton.
         """
         self.__insertString("^")
-        
+
     @pyqtSlot()
     def on_endlineButton_clicked(self):
         """
         Private slot to handle the end line toolbutton.
         """
         self.__insertString("$")
-        
+
     @pyqtSlot()
     def on_wordboundButton_clicked(self):
         """
         Private slot to handle the word boundary toolbutton.
         """
         self.__insertString("\\b")
-        
+
     @pyqtSlot()
     def on_nonwordboundButton_clicked(self):
         """
         Private slot to handle the non word boundary toolbutton.
         """
         self.__insertString("\\B")
-        
+
     @pyqtSlot()
     def on_poslookaheadButton_clicked(self):
         """
         Private slot to handle the positive lookahead toolbutton.
         """
         self.__insertString("(?=)", -1)
-        
+
     @pyqtSlot()
     def on_neglookaheadButton_clicked(self):
         """
         Private slot to handle the negative lookahead toolbutton.
         """
         self.__insertString("(?!)", -1)
-        
+
     @pyqtSlot()
     def on_poslookbehindButton_clicked(self):
         """
         Private slot to handle the positive lookbehind toolbutton.
         """
         self.__insertString("(?<=)", -1)
-        
+
     @pyqtSlot()
     def on_neglookbehindButton_clicked(self):
         """
         Private slot to handle the negative lookbehind toolbutton.
         """
         self.__insertString("(?<!)", -1)
-        
+
     @pyqtSlot()
     def on_repeatButton_clicked(self):
         """
         Private slot to handle the repeat toolbutton.
         """
         from .PyRegExpWizardRepeatDialog import PyRegExpWizardRepeatDialog
+
         dlg = PyRegExpWizardRepeatDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__insertString(dlg.getRepeat())
-        
+
     @pyqtSlot()
     def on_charButton_clicked(self):
         """
         Private slot to handle the characters toolbutton.
         """
-        from .PyRegExpWizardCharactersDialog import (
-            PyRegExpWizardCharactersDialog
-        )
+        from .PyRegExpWizardCharactersDialog import PyRegExpWizardCharactersDialog
+
         dlg = PyRegExpWizardCharactersDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__insertString(dlg.getCharacters())
-        
+
     @pyqtSlot()
     def on_undoButton_clicked(self):
         """
         Private slot to handle the undo action.
         """
         self.regexpTextEdit.document().undo()
-        
+
     @pyqtSlot()
     def on_redoButton_clicked(self):
         """
         Private slot to handle the redo action.
         """
         self.regexpTextEdit.document().redo()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.validateButton:
@@ -314,7 +320,7 @@
             self.on_nextButton_clicked()
         elif self.copyButton and button == self.copyButton:
             self.on_copyButton_clicked()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -326,7 +332,8 @@
             "",
             self.tr("RegExp Files (*.rx);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if fname:
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
@@ -337,12 +344,14 @@
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-            
+
             try:
                 with fpath.open("w", encoding="utf-8") as f:
                     f.write(self.regexpTextEdit.toPlainText())
@@ -350,10 +359,12 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("""<p>The regular expression could not"""
-                            """ be saved.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
-    
+                    self.tr(
+                        """<p>The regular expression could not"""
+                        """ be saved.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
+
     @pyqtSlot()
     def on_loadButton_clicked(self):
         """
@@ -363,7 +374,8 @@
             self,
             self.tr("Load regular expression"),
             "",
-            self.tr("RegExp Files (*.rx);;All Files (*)"))
+            self.tr("RegExp Files (*.rx);;All Files (*)"),
+        )
         if fname:
             fname = Utilities.toNativeSeparators(fname)
             try:
@@ -374,15 +386,17 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("""<p>The regular expression could not"""
-                            """ be saved.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
+                    self.tr(
+                        """<p>The regular expression could not"""
+                        """ be saved.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
 
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
         Private slot to copy the regexp string into the clipboard.
-        
+
         This slot is only available, if not called from within eric.
         """
         escaped = self.regexpTextEdit.toPlainText()
@@ -416,35 +430,39 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Validation"),
-                    self.tr("""The regular expression is valid."""))
+                    self.tr("""The regular expression is valid."""),
+                )
             except re.error as e:
                 EricMessageBox.critical(
                     self,
                     self.tr("Error"),
-                    self.tr("""Invalid regular expression: {0}""")
-                    .format(str(e)))
+                    self.tr("""Invalid regular expression: {0}""").format(str(e)),
+                )
                 return
             except IndexError:
                 EricMessageBox.critical(
                     self,
                     self.tr("Error"),
-                    self.tr("""Invalid regular expression: missing"""
-                            """ group name"""))
+                    self.tr(
+                        """Invalid regular expression: missing""" """ group name"""
+                    ),
+                )
                 return
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Error"),
-                self.tr("""A regular expression must be given."""))
+                self.tr("""A regular expression must be given."""),
+            )
 
     @pyqtSlot()
     def on_executeButton_clicked(self, startpos=0):
         """
         Private slot to execute the entered regexp on the test text.
-        
+
         This slot will execute the entered regexp on the entered test
         data and will display the result in the table part of the dialog.
-        
+
         @param startpos starting position for the regexp matching
         """
         regex = self.regexpTextEdit.toPlainText()
@@ -472,74 +490,72 @@
                     captures = 0
                 row = 0
                 OFFSET = 5
-                
+
                 self.resultTable.setColumnCount(0)
                 self.resultTable.setColumnCount(3)
                 self.resultTable.setRowCount(0)
                 self.resultTable.setRowCount(OFFSET)
-                self.resultTable.setItem(
-                    row, 0, QTableWidgetItem(self.tr("Regexp")))
-                self.resultTable.setItem(
-                    row, 1, QTableWidgetItem(regex))
-                
+                self.resultTable.setItem(row, 0, QTableWidgetItem(self.tr("Regexp")))
+                self.resultTable.setItem(row, 1, QTableWidgetItem(regex))
+
                 if matchobj is not None:
                     offset = matchobj.start()
                     self.lastMatchEnd = matchobj.end()
                     self.nextButton.setEnabled(True)
                     row += 1
                     self.resultTable.setItem(
-                        row, 0,
-                        QTableWidgetItem(self.tr("Offset")))
+                        row, 0, QTableWidgetItem(self.tr("Offset"))
+                    )
                     self.resultTable.setItem(
-                        row, 1,
-                        QTableWidgetItem("{0:d}".format(matchobj.start(0))))
-                    
-                    row += 1
-                    self.resultTable.setItem(
-                        row, 0,
-                        QTableWidgetItem(self.tr("Captures")))
-                    self.resultTable.setItem(
-                        row, 1,
-                        QTableWidgetItem("{0:d}".format(captures)))
+                        row, 1, QTableWidgetItem("{0:d}".format(matchobj.start(0)))
+                    )
+
                     row += 1
                     self.resultTable.setItem(
-                        row, 1,
-                        QTableWidgetItem(self.tr("Text")))
+                        row, 0, QTableWidgetItem(self.tr("Captures"))
+                    )
                     self.resultTable.setItem(
-                        row, 2,
-                        QTableWidgetItem(self.tr("Characters")))
-                    
+                        row, 1, QTableWidgetItem("{0:d}".format(captures))
+                    )
                     row += 1
+                    self.resultTable.setItem(row, 1, QTableWidgetItem(self.tr("Text")))
                     self.resultTable.setItem(
-                        row, 0,
-                        QTableWidgetItem(self.tr("Match")))
+                        row, 2, QTableWidgetItem(self.tr("Characters"))
+                    )
+
+                    row += 1
+                    self.resultTable.setItem(row, 0, QTableWidgetItem(self.tr("Match")))
                     self.resultTable.setItem(
-                        row, 1,
-                        QTableWidgetItem(matchobj.group(0)))
+                        row, 1, QTableWidgetItem(matchobj.group(0))
+                    )
                     self.resultTable.setItem(
-                        row, 2,
-                        QTableWidgetItem(
-                            "{0:d}".format(len(matchobj.group(0)))))
-                    
+                        row, 2, QTableWidgetItem("{0:d}".format(len(matchobj.group(0))))
+                    )
+
                     for i in range(1, captures + 1):
                         if matchobj.group(i) is not None:
                             row += 1
                             self.resultTable.insertRow(row)
                             self.resultTable.setItem(
-                                row, 0,
-                                QTableWidgetItem(
-                                    self.tr("Capture #{0}").format(i)))
+                                row,
+                                0,
+                                QTableWidgetItem(self.tr("Capture #{0}").format(i)),
+                            )
+                            self.resultTable.setItem(
+                                row, 1, QTableWidgetItem(matchobj.group(i))
+                            )
                             self.resultTable.setItem(
-                                row, 1, QTableWidgetItem(matchobj.group(i)))
-                            self.resultTable.setItem(
-                                row, 2, QTableWidgetItem(
-                                    "{0:d}".format(len(matchobj.group(i)))))
-                    
+                                row,
+                                2,
+                                QTableWidgetItem(
+                                    "{0:d}".format(len(matchobj.group(i)))
+                                ),
+                            )
+
                     # highlight the matched text
                     tc = self.textTextEdit.textCursor()
                     tc.setPosition(offset)
-                    tc.setPosition(self.lastMatchEnd,
-                                   QTextCursor.MoveMode.KeepAnchor)
+                    tc.setPosition(self.lastMatchEnd, QTextCursor.MoveMode.KeepAnchor)
                     self.textTextEdit.setTextCursor(tc)
                 else:
                     self.nextButton.setEnabled(False)
@@ -547,18 +563,18 @@
                     row += 1
                     if startpos > 0:
                         self.resultTable.setItem(
-                            row, 0,
-                            QTableWidgetItem(self.tr("No more matches")))
+                            row, 0, QTableWidgetItem(self.tr("No more matches"))
+                        )
                     else:
                         self.resultTable.setItem(
-                            row, 0,
-                            QTableWidgetItem(self.tr("No matches")))
-                    
+                            row, 0, QTableWidgetItem(self.tr("No matches"))
+                        )
+
                     # remove the highlight
                     tc = self.textTextEdit.textCursor()
                     tc.setPosition(0)
                     self.textTextEdit.setTextCursor(tc)
-                
+
                 self.resultTable.resizeColumnsToContents()
                 self.resultTable.resizeRowsToContents()
                 self.resultTable.verticalHeader().hide()
@@ -567,41 +583,43 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Error"),
-                    self.tr("""Invalid regular expression: {0}""")
-                    .format(str(e)))
+                    self.tr("""Invalid regular expression: {0}""").format(str(e)),
+                )
                 return
             except IndexError:
                 EricMessageBox.critical(
                     self,
                     self.tr("Error"),
-                    self.tr("""Invalid regular expression: missing"""
-                            """ group name"""))
+                    self.tr(
+                        """Invalid regular expression: missing""" """ group name"""
+                    ),
+                )
                 return
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Error"),
-                self.tr("""A regular expression and a text must be"""
-                        """ given."""))
-        
+                self.tr("""A regular expression and a text must be""" """ given."""),
+            )
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
         Private slot to find the next match.
         """
         self.on_executeButton_clicked(self.lastMatchEnd)
-        
+
     @pyqtSlot()
     def on_regexpTextEdit_textChanged(self):
         """
         Private slot called when the regexp changes.
         """
         self.nextButton.setEnabled(False)
-        
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -610,36 +628,37 @@
         istring = indLevel * indString
         i1string = (indLevel + 1) * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         reVar = self.variableLineEdit.text()
         if not reVar:
             reVar = "regexp"
-            
+
         regexp = self.regexpTextEdit.toPlainText()
-        
+
         flags = []
         if not self.caseSensitiveCheckBox.isChecked():
-            flags.append('re.IGNORECASE')
+            flags.append("re.IGNORECASE")
         if self.multilineCheckBox.isChecked():
-            flags.append('re.MULTILINE')
+            flags.append("re.MULTILINE")
         if self.dotallCheckBox.isChecked():
-            flags.append('re.DOTALL')
+            flags.append("re.DOTALL")
         if self.verboseCheckBox.isChecked():
-            flags.append('re.VERBOSE')
+            flags.append("re.VERBOSE")
         if self.unicodeCheckBox.isChecked():
-            flags.append('re.ASCII')
+            flags.append("re.ASCII")
         flags = " | ".join(flags)
-        
-        code = ''
+
+        code = ""
         if self.importCheckBox.isChecked():
-            code += 'import re{0}{1}'.format(os.linesep, istring)
-        code += '{0} = re.compile('.format(reVar)
+            code += "import re{0}{1}".format(os.linesep, istring)
+        code += "{0} = re.compile(".format(reVar)
         code += '{0}{1}r"""{2}"""'.format(
-            os.linesep, i1string, regexp.replace('"', '\\"'))
+            os.linesep, i1string, regexp.replace('"', '\\"')
+        )
         if flags:
-            code += ',{0}{1}{2}'.format(os.linesep, i1string, flags)
-        code += '{0}){0}'.format(estring)
+            code += ",{0}{1}{2}".format(os.linesep, i1string, flags)
+        code += "{0}){0}".format(estring)
         return code
 
 
@@ -647,34 +666,35 @@
     """
     Class for the dialog variant.
     """
+
     def __init__(self, parent=None, fromEric=True):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         @param fromEric flag indicating a call from within eric
         """
         super().__init__(parent)
         self.setModal(fromEric)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.cw = PyRegExpWizardWidget(self, fromEric)
         size = self.cw.size()
         self.__layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.buttonBox.accepted.connect(self.accept)
         self.cw.buttonBox.rejected.connect(self.reject)
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -686,10 +706,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
@@ -698,9 +719,8 @@
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(
-            Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.buttonBox.accepted.connect(self.close)
         self.cw.buttonBox.rejected.connect(self.close)
--- a/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardRepeatDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardRepeatDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,48 +17,49 @@
     """
     Class implementing a dialog for entering repeat counts.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.unlimitedButton.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot(int)
     def on_lowerSpin_valueChanged(self, value):
         """
         Private slot to handle the lowerSpin valueChanged signal.
-        
+
         @param value value of the spinbox (integer)
         """
         if self.upperSpin.value() < value:
             self.upperSpin.setValue(value)
-        
+
     @pyqtSlot(int)
     def on_upperSpin_valueChanged(self, value):
         """
         Private slot to handle the upperSpin valueChanged signal.
-        
+
         @param value value of the spinbox (integer)
         """
         if self.lowerSpin.value() > value:
             self.lowerSpin.setValue(value)
-        
+
     def getRepeat(self):
         """
         Public method to retrieve the dialog's result.
-        
+
         @return ready formatted repeat string (string)
         """
         minimal = "?" if self.minimalCheckBox.isChecked() else ""
-        
+
         if self.unlimitedButton.isChecked():
             return "*" + minimal
         elif self.minButton.isChecked():
@@ -80,5 +81,5 @@
             repsMin = self.lowerSpin.value()
             repsMax = self.upperSpin.value()
             return "{{{0:d},{1:d}}}{2}".format(repsMin, repsMax, minimal)
-        
+
         return ""
--- a/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,64 +10,82 @@
 from PyQt6.QtCore import QRegularExpression
 from PyQt6.QtGui import QRegularExpressionValidator
 from PyQt6.QtWidgets import (
-    QWidget, QDialog, QVBoxLayout, QHBoxLayout, QScrollArea, QPushButton,
-    QSpacerItem, QSizePolicy, QComboBox, QLineEdit, QLabel
+    QWidget,
+    QDialog,
+    QVBoxLayout,
+    QHBoxLayout,
+    QScrollArea,
+    QPushButton,
+    QSpacerItem,
+    QSizePolicy,
+    QComboBox,
+    QLineEdit,
+    QLabel,
 )
 
 from .Ui_QRegularExpressionWizardCharactersDialog import (
-    Ui_QRegularExpressionWizardCharactersDialog
+    Ui_QRegularExpressionWizardCharactersDialog,
 )
 
 
 class QRegularExpressionWizardCharactersDialog(
-        QDialog, Ui_QRegularExpressionWizardCharactersDialog):
+    QDialog, Ui_QRegularExpressionWizardCharactersDialog
+):
     """
     Class implementing a dialog for entering character classes.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__initCharacterSelectors()
-        
+
         self.comboItems = []
-        self.singleComboItems = []      # these are in addition to the above
+        self.singleComboItems = []  # these are in addition to the above
         self.comboItems.append((self.tr("Normal character"), "-c"))
-        self.comboItems.append((self.tr(
-            "Unicode character in hexadecimal notation"), "-h"))
-        self.comboItems.append((self.tr(
-            "ASCII/Latin1 character in octal notation"), "-o"))
-        self.singleComboItems.extend([
-            ("---", "-i"),
-            (self.tr("Bell character (\\a)"), "\\a"),
-            (self.tr("Escape character (\\e)"), "\\e"),
-            (self.tr("Page break (\\f)"), "\\f"),
-            (self.tr("Line feed (\\n)"), "\\n"),
-            (self.tr("Carriage return (\\r)"), "\\r"),
-            (self.tr("Horizontal tabulator (\\t)"), "\\t"),
-            ("---", "-i"),
-            (self.tr("Character Category"), "-ccp"),
-            (self.tr("Special Character Category"), "-csp"),
-            (self.tr("Character Block"), "-cbp"),
-            (self.tr("POSIX Named Set"), "-psp"),
-            (self.tr("Not Character Category"), "-ccn"),
-            (self.tr("Not Character Block"), "-cbn"),
-            (self.tr("Not Special Character Category"), "-csn"),
-            (self.tr("Not POSIX Named Set"), "-psn"),
-        ])
-        
+        self.comboItems.append(
+            (self.tr("Unicode character in hexadecimal notation"), "-h")
+        )
+        self.comboItems.append(
+            (self.tr("ASCII/Latin1 character in octal notation"), "-o")
+        )
+        self.singleComboItems.extend(
+            [
+                ("---", "-i"),
+                (self.tr("Bell character (\\a)"), "\\a"),
+                (self.tr("Escape character (\\e)"), "\\e"),
+                (self.tr("Page break (\\f)"), "\\f"),
+                (self.tr("Line feed (\\n)"), "\\n"),
+                (self.tr("Carriage return (\\r)"), "\\r"),
+                (self.tr("Horizontal tabulator (\\t)"), "\\t"),
+                ("---", "-i"),
+                (self.tr("Character Category"), "-ccp"),
+                (self.tr("Special Character Category"), "-csp"),
+                (self.tr("Character Block"), "-cbp"),
+                (self.tr("POSIX Named Set"), "-psp"),
+                (self.tr("Not Character Category"), "-ccn"),
+                (self.tr("Not Character Block"), "-cbn"),
+                (self.tr("Not Special Character Category"), "-csn"),
+                (self.tr("Not POSIX Named Set"), "-psn"),
+            ]
+        )
+
         self.charValidator = QRegularExpressionValidator(
-            QRegularExpression(".{0,1}"), self)
+            QRegularExpression(".{0,1}"), self
+        )
         self.hexValidator = QRegularExpressionValidator(
-            QRegularExpression("[0-9a-fA-F]{0,4}"), self)
+            QRegularExpression("[0-9a-fA-F]{0,4}"), self
+        )
         self.octValidator = QRegularExpressionValidator(
-            QRegularExpression("[0-3]?[0-7]{0,2}"), self)
-        
+            QRegularExpression("[0-3]?[0-7]{0,2}"), self
+        )
+
         # generate dialog part for single characters
         self.singlesBoxLayout = QVBoxLayout(self.singlesBox)
         self.singlesBoxLayout.setObjectName("singlesBoxLayout")
@@ -77,7 +95,7 @@
         self.singlesView = QScrollArea(self.singlesBox)
         self.singlesView.setObjectName("singlesView")
         self.singlesBoxLayout.addWidget(self.singlesView)
-        
+
         self.singlesItemsBox = QWidget(self)
         self.singlesView.setWidget(self.singlesItemsBox)
         self.singlesItemsBox.setObjectName("singlesItemsBox")
@@ -88,21 +106,23 @@
         self.singlesItemsBox.setLayout(self.singlesItemsBoxLayout)
         self.singlesEntries = []
         self.__addSinglesLine()
-        
+
         hlayout0 = QHBoxLayout()
         hlayout0.setContentsMargins(0, 0, 0, 0)
         hlayout0.setSpacing(6)
         hlayout0.setObjectName("hlayout0")
         self.moreSinglesButton = QPushButton(
-            self.tr("Additional Entries"), self.singlesBox)
+            self.tr("Additional Entries"), self.singlesBox
+        )
         self.moreSinglesButton.setObjectName("moreSinglesButton")
         hlayout0.addWidget(self.moreSinglesButton)
         hspacer0 = QSpacerItem(
-            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         hlayout0.addItem(hspacer0)
         self.singlesBoxLayout.addLayout(hlayout0)
         self.moreSinglesButton.clicked.connect(self.__addSinglesLine)
-        
+
         # generate dialog part for character ranges
         self.rangesBoxLayout = QVBoxLayout(self.rangesBox)
         self.rangesBoxLayout.setObjectName("rangesBoxLayout")
@@ -112,7 +132,7 @@
         self.rangesView = QScrollArea(self.rangesBox)
         self.rangesView.setObjectName("rangesView")
         self.rangesBoxLayout.addWidget(self.rangesView)
-        
+
         self.rangesItemsBox = QWidget(self)
         self.rangesView.setWidget(self.rangesItemsBox)
         self.rangesItemsBox.setObjectName("rangesItemsBox")
@@ -123,21 +143,23 @@
         self.rangesItemsBox.setLayout(self.rangesItemsBoxLayout)
         self.rangesEntries = []
         self.__addRangesLine()
-        
+
         hlayout1 = QHBoxLayout()
         hlayout1.setContentsMargins(0, 0, 0, 0)
         hlayout1.setSpacing(6)
         hlayout1.setObjectName("hlayout1")
         self.moreRangesButton = QPushButton(
-            self.tr("Additional Entries"), self.rangesBox)
+            self.tr("Additional Entries"), self.rangesBox
+        )
         self.moreSinglesButton.setObjectName("moreRangesButton")
         hlayout1.addWidget(self.moreRangesButton)
         hspacer1 = QSpacerItem(
-            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            30, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         hlayout1.addItem(hspacer1)
         self.rangesBoxLayout.addLayout(hlayout1)
         self.moreRangesButton.clicked.connect(self.__addRangesLine)
-    
+
     def __initCharacterSelectors(self):
         """
         Private method to initialize the W3C character selector entries.
@@ -183,7 +205,7 @@
             (self.tr("Other, Private Use"), "Co"),
             (self.tr("Other, Surrogat"), "Cn"),
         )
-        
+
         self.__specialCharacterCategories = (
             # display name                           code
             (self.tr("Alphanumeric"), "Xan"),
@@ -192,7 +214,7 @@
             (self.tr("Universal Character"), "Xuc"),
             (self.tr("Perl Word"), "Xan"),
         )
-        
+
         self.__characterBlocks = (
             # display name                           code
             (self.tr("Arabic"), "Arabic"),
@@ -298,7 +320,7 @@
             (self.tr("Vai"), "Vai"),
             (self.tr("Yi"), "Yi"),
         )
-        
+
         self.__posixNamedSets = (
             # display name                                  code
             (self.tr("Alphanumeric"), "alnum"),
@@ -316,11 +338,11 @@
             (self.tr("Printing (excl. alphanumeric)"), "punct"),
             (self.tr("Control Character"), "cntrl"),
         )
-    
+
     def __populateCharTypeCombo(self, combo, isSingle):
         """
         Private method to populate a given character type selection combo box.
-        
+
         @param combo reference to the combo box to be populated (QComboBox)
         @param isSingle flag indicating a singles combo (boolean)
         """
@@ -364,18 +386,16 @@
         hboxLayout.addWidget(cb2a)
         cb2a.hide()
         self.singlesItemsBoxLayout.addWidget(hbox)
-        
-        cb1.activated[int].connect(
-            lambda i: self.__singlesCharTypeSelected(i, cb1))
-        cb2.activated[int].connect(
-            lambda i: self.__singlesCharTypeSelected(i, cb2))
+
+        cb1.activated[int].connect(lambda i: self.__singlesCharTypeSelected(i, cb1))
+        cb2.activated[int].connect(lambda i: self.__singlesCharTypeSelected(i, cb2))
         hbox.show()
-        
+
         self.singlesItemsBox.adjustSize()
-        
+
         self.singlesEntries.append([cb1, le1, cb1a])
         self.singlesEntries.append([cb2, le2, cb2a])
-    
+
     def __addRangesLine(self):
         """
         Private slot to add a line of entry widgets for character ranges.
@@ -400,26 +420,25 @@
         le2.setValidator(self.charValidator)
         hboxLayout.addWidget(le2)
         self.rangesItemsBoxLayout.addWidget(hbox)
-        
-        cb1.activated[int].connect(
-            lambda i: self.__rangesCharTypeSelected(i, cb1))
-        
+
+        cb1.activated[int].connect(lambda i: self.__rangesCharTypeSelected(i, cb1))
+
         hbox.show()
-        
+
         self.rangesItemsBox.adjustSize()
-        
+
         self.rangesEntries.append([cb1, le1, le2])
-    
+
     def __populateCharacterCombo(self, combo, formatIdentifier):
         """
         Private method to populate a character selection combo.
-        
+
         @param combo combo box to be populated (QComboBox)
         @param formatIdentifier format identifier (one of "-ccp", "-ccn",
             "-cbp", "-cbn", "-csp", "-csn", "-psp", "-psn")
         """
         combo.clear()
-        
+
         if formatIdentifier in ["-ccp", "-ccn"]:
             items = self.__characterCategories
         elif formatIdentifier in ["-csp", "-csn"]:
@@ -428,24 +447,24 @@
             items = self.__characterBlocks
         elif formatIdentifier in ["-psp", "-psn"]:
             items = self.__posixNamedSets
-        
+
         comboLen = 0
         for txt, code in items:
             combo.addItem(txt, code)
             comboLen = max(comboLen, len(txt))
         combo.setMinimumContentsLength(comboLen)
-    
+
     def __performSelectedAction(self, formatIdentifier, lineedit, combo):
         """
         Private method performing some actions depending on the input.
-        
+
         @param formatIdentifier format of the selected entry (string)
         @param lineedit line edit widget to act on (QLineEdit)
         @param combo combo box widget to act on (QComboBox)
         """
         if formatIdentifier == "-i":
             return
-        
+
         if formatIdentifier in ["-c", "-h", "-o"]:
             lineedit.show()
             lineedit.setEnabled(True)
@@ -457,8 +476,16 @@
                 lineedit.setValidator(self.hexValidator)
             elif formatIdentifier == "-o":
                 lineedit.setValidator(self.octValidator)
-        elif formatIdentifier in ["-ccp", "-ccn", "-cbp", "-cbn", "-csp",
-                                  "-csn", "-psp", "-psn"]:
+        elif formatIdentifier in [
+            "-ccp",
+            "-ccn",
+            "-cbp",
+            "-cbn",
+            "-csp",
+            "-csn",
+            "-psp",
+            "-psn",
+        ]:
             lineedit.setEnabled(False)
             lineedit.hide()
             if combo is not None:
@@ -470,12 +497,12 @@
             if combo is not None:
                 combo.hide()
         lineedit.clear()
-    
+
     def __singlesCharTypeSelected(self, index, combo):
         """
         Private slot to handle the activated(int) signal of the single chars
         combo boxes.
-        
+
         @param index selected list index
         @type int
         @param combo reference to the combo box
@@ -485,14 +512,15 @@
             if combo == entriesList[0]:
                 formatIdentifier = combo.itemData(index)
                 self.__performSelectedAction(
-                    formatIdentifier, entriesList[1], entriesList[2])
+                    formatIdentifier, entriesList[1], entriesList[2]
+                )
                 break
-    
+
     def __rangesCharTypeSelected(self, index, combo):
         """
         Private slot to handle the activated(int) signal of the char ranges
         combo boxes.
-        
+
         @param index selected list index
         @type int
         @param combo reference to the combo box
@@ -501,16 +529,14 @@
         for entriesList in self.rangesEntries:
             if combo == entriesList[0]:
                 formatIdentifier = combo.itemData(index)
-                self.__performSelectedAction(formatIdentifier, entriesList[1],
-                                             None)
-                self.__performSelectedAction(formatIdentifier, entriesList[2],
-                                             None)
+                self.__performSelectedAction(formatIdentifier, entriesList[1], None)
+                self.__performSelectedAction(formatIdentifier, entriesList[2], None)
                 break
-    
+
     def __formatCharacter(self, char, formatIdentifier):
         """
         Private method to format the characters entered into the dialog.
-        
+
         @param char character string entered into the dialog (string)
         @param formatIdentifier string giving a special format (-c, -h, -i or
             -o) or the already formatted character (string)
@@ -520,7 +546,7 @@
             return char
         elif formatIdentifier == "-i":
             return ""
-        
+
         if formatIdentifier == "-h":
             while len(char) < 2:
                 char = "0" + char
@@ -544,19 +570,19 @@
             return "[:^{0}:]".format(char)
         else:
             return formatIdentifier
-    
+
     def getCharacters(self):
         """
         Public method to return the character string assembled via the dialog.
-        
+
         @return formatted string for character classes (string)
         """
         regexp = ""
-        
+
         # negative character range
         if self.negativeCheckBox.isChecked():
             regexp += "^"
-            
+
         # predefined character ranges
         if self.wordCharCheckBox.isChecked():
             regexp += "\\w"
@@ -582,41 +608,36 @@
             regexp += "\\v"
         if self.nonVerticalWhitespaceCheckBox.isChecked():
             regexp += "\\V"
-        
+
         # single characters
         for entrieslist in self.singlesEntries:
-            formatIdentifier = entrieslist[0].itemData(
-                entrieslist[0].currentIndex())
+            formatIdentifier = entrieslist[0].itemData(entrieslist[0].currentIndex())
             char = (
                 entrieslist[2].itemData(entrieslist[2].currentIndex())
-                if formatIdentifier in ["-ccp", "-ccn", "-cbp", "-cbn", "-csp",
-                                        "-csn", "-psp", "-psn"] else
-                entrieslist[1].text()
+                if formatIdentifier
+                in ["-ccp", "-ccn", "-cbp", "-cbn", "-csp", "-csn", "-psp", "-psn"]
+                else entrieslist[1].text()
             )
             regexp += self.__formatCharacter(char, formatIdentifier)
-        
+
         # character ranges
         for entrieslist in self.rangesEntries:
-            if (
-                not entrieslist[1].text() or
-                not entrieslist[2].text()
-            ):
+            if not entrieslist[1].text() or not entrieslist[2].text():
                 continue
-            formatIdentifier = entrieslist[0].itemData(
-                entrieslist[0].currentIndex())
+            formatIdentifier = entrieslist[0].itemData(entrieslist[0].currentIndex())
             char1 = entrieslist[1].text()
             char2 = entrieslist[2].text()
             regexp += "{0}-{1}".format(
                 self.__formatCharacter(char1, formatIdentifier),
-                self.__formatCharacter(char2, formatIdentifier))
-        
+                self.__formatCharacter(char2, formatIdentifier),
+            )
+
         if regexp:
             if (
-                (regexp.startswith("\\") and
-                 regexp.count("\\") == 1 and
-                 "-" not in regexp) or
-                len(regexp) == 1
-            ):
+                regexp.startswith("\\")
+                and regexp.count("\\") == 1
+                and "-" not in regexp
+            ) or len(regexp) == 1:
                 return regexp
             else:
                 return "[{0}]".format(regexp)
--- a/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,16 +15,19 @@
 from PyQt6.QtCore import pyqtSlot, QProcess, QByteArray
 from PyQt6.QtGui import QClipboard, QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QDialog, QInputDialog, QApplication, QDialogButtonBox,
-    QVBoxLayout, QTableWidgetItem
+    QWidget,
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QDialogButtonBox,
+    QVBoxLayout,
+    QTableWidgetItem,
 )
 
 from EricWidgets import EricMessageBox, EricFileDialog
 from EricWidgets.EricMainWindow import EricMainWindow
 
-from .Ui_QRegularExpressionWizardDialog import (
-    Ui_QRegularExpressionWizardDialog
-)
+from .Ui_QRegularExpressionWizardDialog import Ui_QRegularExpressionWizardDialog
 
 import UI.PixmapCache
 
@@ -33,116 +36,115 @@
 import Preferences
 
 
-class QRegularExpressionWizardWidget(QWidget,
-                                     Ui_QRegularExpressionWizardDialog):
+class QRegularExpressionWizardWidget(QWidget, Ui_QRegularExpressionWizardDialog):
     """
     Class implementing the QRegularExpression wizard dialog.
     """
+
     def __init__(self, parent=None, fromEric=True):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         @param fromEric flag indicating a call from within eric
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # initialize icons of the tool buttons
         self.commentButton.setIcon(UI.PixmapCache.getIcon("comment"))
         self.charButton.setIcon(UI.PixmapCache.getIcon("characters"))
         self.anycharButton.setIcon(UI.PixmapCache.getIcon("anychar"))
         self.repeatButton.setIcon(UI.PixmapCache.getIcon("repeat"))
         self.nonGroupButton.setIcon(UI.PixmapCache.getIcon("nongroup"))
-        self.atomicGroupButton.setIcon(
-            UI.PixmapCache.getIcon("atomicgroup"))
+        self.atomicGroupButton.setIcon(UI.PixmapCache.getIcon("atomicgroup"))
         self.groupButton.setIcon(UI.PixmapCache.getIcon("group"))
         self.namedGroupButton.setIcon(UI.PixmapCache.getIcon("namedgroup"))
-        self.namedReferenceButton.setIcon(
-            UI.PixmapCache.getIcon("namedreference"))
+        self.namedReferenceButton.setIcon(UI.PixmapCache.getIcon("namedreference"))
         self.altnButton.setIcon(UI.PixmapCache.getIcon("altn"))
         self.beglineButton.setIcon(UI.PixmapCache.getIcon("begline"))
         self.endlineButton.setIcon(UI.PixmapCache.getIcon("endline"))
-        self.wordboundButton.setIcon(
-            UI.PixmapCache.getIcon("wordboundary"))
-        self.nonwordboundButton.setIcon(
-            UI.PixmapCache.getIcon("nonwordboundary"))
-        self.poslookaheadButton.setIcon(
-            UI.PixmapCache.getIcon("poslookahead"))
-        self.neglookaheadButton.setIcon(
-            UI.PixmapCache.getIcon("neglookahead"))
-        self.poslookbehindButton.setIcon(
-            UI.PixmapCache.getIcon("poslookbehind"))
-        self.neglookbehindButton.setIcon(
-            UI.PixmapCache.getIcon("neglookbehind"))
+        self.wordboundButton.setIcon(UI.PixmapCache.getIcon("wordboundary"))
+        self.nonwordboundButton.setIcon(UI.PixmapCache.getIcon("nonwordboundary"))
+        self.poslookaheadButton.setIcon(UI.PixmapCache.getIcon("poslookahead"))
+        self.neglookaheadButton.setIcon(UI.PixmapCache.getIcon("neglookahead"))
+        self.poslookbehindButton.setIcon(UI.PixmapCache.getIcon("poslookbehind"))
+        self.neglookbehindButton.setIcon(UI.PixmapCache.getIcon("neglookbehind"))
         self.undoButton.setIcon(UI.PixmapCache.getIcon("editUndo"))
         self.redoButton.setIcon(UI.PixmapCache.getIcon("editRedo"))
-        
+
         self.namedGroups = re.compile(r"""\(?P<([^>]+)>""").findall
-        
+
         # start the PyQt6 server part
         self.__pyqt6Available = False
         self.__pyqt6Server = QProcess(self)
         self.__pyqt6Server.start(
-            Globals.getPythonExecutable(), [os.path.join(
-                os.path.dirname(__file__), "QRegularExpressionWizardServer.py")
-            ])
+            Globals.getPythonExecutable(),
+            [
+                os.path.join(
+                    os.path.dirname(__file__), "QRegularExpressionWizardServer.py"
+                )
+            ],
+        )
         if self.__pyqt6Server.waitForStarted(5000):
-            self.__pyqt6Server.setReadChannel(
-                QProcess.ProcessChannel.StandardOutput)
+            self.__pyqt6Server.setReadChannel(QProcess.ProcessChannel.StandardOutput)
             if self.__sendCommand("available"):
                 response = self.__receiveResponse()
                 if response and response["available"]:
                     self.__pyqt6Available = True
-        
+
         self.saveButton = self.buttonBox.addButton(
-            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.saveButton.setToolTip(
-            self.tr("Save the regular expression to a file"))
+            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.saveButton.setToolTip(self.tr("Save the regular expression to a file"))
         self.loadButton = self.buttonBox.addButton(
-            self.tr("Load"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.loadButton.setToolTip(
-            self.tr("Load a regular expression from a file"))
+            self.tr("Load"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.loadButton.setToolTip(self.tr("Load a regular expression from a file"))
         if self.__pyqt6Available:
             self.validateButton = self.buttonBox.addButton(
-                self.tr("Validate"), QDialogButtonBox.ButtonRole.ActionRole)
-            self.validateButton.setToolTip(
-                self.tr("Validate the regular expression"))
+                self.tr("Validate"), QDialogButtonBox.ButtonRole.ActionRole
+            )
+            self.validateButton.setToolTip(self.tr("Validate the regular expression"))
             self.executeButton = self.buttonBox.addButton(
-                self.tr("Execute"), QDialogButtonBox.ButtonRole.ActionRole)
-            self.executeButton.setToolTip(
-                self.tr("Execute the regular expression"))
+                self.tr("Execute"), QDialogButtonBox.ButtonRole.ActionRole
+            )
+            self.executeButton.setToolTip(self.tr("Execute the regular expression"))
             self.nextButton = self.buttonBox.addButton(
-                self.tr("Next match"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Next match"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.nextButton.setToolTip(
-                self.tr("Show the next match of the regular expression"))
+                self.tr("Show the next match of the regular expression")
+            )
             self.nextButton.setEnabled(False)
         else:
             self.validateButton = None
             self.executeButton = None
             self.nextButton = None
-        
+
         if fromEric:
             self.buttonBox.setStandardButtons(
-                QDialogButtonBox.StandardButton.Cancel |
-                QDialogButtonBox.StandardButton.Ok)
+                QDialogButtonBox.StandardButton.Cancel
+                | QDialogButtonBox.StandardButton.Ok
+            )
             self.copyButton = None
         else:
             self.copyButton = self.buttonBox.addButton(
-                self.tr("Copy"), QDialogButtonBox.ButtonRole.ActionRole)
+                self.tr("Copy"), QDialogButtonBox.ButtonRole.ActionRole
+            )
             self.copyButton.setToolTip(
-                self.tr("Copy the regular expression to the clipboard"))
-            self.buttonBox.setStandardButtons(
-                QDialogButtonBox.StandardButton.Close)
+                self.tr("Copy the regular expression to the clipboard")
+            )
+            self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close)
             self.variableLabel.hide()
             self.variableLineEdit.hide()
             self.variableLine.hide()
             self.regexpTextEdit.setFocus()
-    
+
     def __sendCommand(self, command, **kw):
         """
         Private method to send a command to the server.
-        
+
         @param command dictionary with command string and related
             data (dict)
         @keyparam kw parameters for the command
@@ -157,11 +159,11 @@
             self.__pyqt6Server.write(data)
             result = self.__pyqt6Server.waitForBytesWritten(10000)
         return result
-    
+
     def __receiveResponse(self):
         """
         Private method to receive a response from the server.
-        
+
         @return response dictionary (dict)
         """
         responseDict = {}
@@ -173,24 +175,25 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Communication Error"),
-                    self.tr("""<p>The backend reported an error.</p>"""
-                            """<p>{0}</p>""")
-                    .format(responseDict["error"]))
+                    self.tr(
+                        """<p>The backend reported an error.</p>""" """<p>{0}</p>"""
+                    ).format(responseDict["error"]),
+                )
                 responseDict = {}
-        
+
         return responseDict
-    
+
     def shutdown(self):
         """
         Public method to shut down the server part.
         """
         self.__sendCommand("exit")
         self.__pyqt6Server.waitForFinished(5000)
-    
+
     def __insertString(self, s, steps=0):
         """
         Private method to insert a string into line edit and move cursor.
-        
+
         @param s string to be inserted into the regexp line edit
             (string)
         @param steps number of characters to move the cursor (integer).
@@ -207,73 +210,75 @@
             for _ in range(steps):
                 tc.movePosition(act)
         self.regexpTextEdit.setTextCursor(tc)
-    
+
     @pyqtSlot()
     def on_commentButton_clicked(self):
         """
         Private slot to handle the comment toolbutton.
         """
         self.__insertString("(?#)", -1)
-    
+
     @pyqtSlot()
     def on_charButton_clicked(self):
         """
         Private slot to handle the characters toolbutton.
         """
         from .QRegularExpressionWizardCharactersDialog import (
-            QRegularExpressionWizardCharactersDialog
+            QRegularExpressionWizardCharactersDialog,
         )
+
         dlg = QRegularExpressionWizardCharactersDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__insertString(dlg.getCharacters())
-    
+
     @pyqtSlot()
     def on_anycharButton_clicked(self):
         """
         Private slot to handle the any character toolbutton.
         """
         self.__insertString(".")
-    
+
     @pyqtSlot()
     def on_repeatButton_clicked(self):
         """
         Private slot to handle the repeat toolbutton.
         """
         from .QRegularExpressionWizardRepeatDialog import (
-            QRegularExpressionWizardRepeatDialog
+            QRegularExpressionWizardRepeatDialog,
         )
+
         dlg = QRegularExpressionWizardRepeatDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__insertString(dlg.getRepeat())
-    
+
     @pyqtSlot()
     def on_nonGroupButton_clicked(self):
         """
         Private slot to handle the non group toolbutton.
         """
         self.__insertString("(?:)", -1)
-    
+
     @pyqtSlot()
     def on_atomicGroupButton_clicked(self):
         """
         Private slot to handle the atomic non group toolbutton.
         """
         self.__insertString("(?>)", -1)
-    
+
     @pyqtSlot()
     def on_groupButton_clicked(self):
         """
         Private slot to handle the group toolbutton.
         """
         self.__insertString("()", -1)
-    
+
     @pyqtSlot()
     def on_namedGroupButton_clicked(self):
         """
         Private slot to handle the named group toolbutton.
         """
         self.__insertString("(?P<>)", -2)
-    
+
     @pyqtSlot()
     def on_namedReferenceButton_clicked(self):
         """
@@ -281,7 +286,7 @@
         """
         # determine cursor position as length into text
         length = self.regexpTextEdit.textCursor().position()
-        
+
         # only present group names that occur before the current
         # cursor position
         regex = self.regexpTextEdit.toPlainText()[:length]
@@ -290,99 +295,102 @@
             EricMessageBox.information(
                 self,
                 self.tr("Named reference"),
-                self.tr("""No named groups have been defined yet."""))
+                self.tr("""No named groups have been defined yet."""),
+            )
             return
-        
+
         groupName, ok = QInputDialog.getItem(
             self,
             self.tr("Named reference"),
             self.tr("Select group name:"),
             names,
-            0, True)
+            0,
+            True,
+        )
         if ok and groupName:
             self.__insertString("(?P={0})".format(groupName))
-    
+
     @pyqtSlot()
     def on_altnButton_clicked(self):
         """
         Private slot to handle the alternatives toolbutton.
         """
         self.__insertString("(|)", -2)
-    
+
     @pyqtSlot()
     def on_beglineButton_clicked(self):
         """
         Private slot to handle the begin line toolbutton.
         """
         self.__insertString("^")
-    
+
     @pyqtSlot()
     def on_endlineButton_clicked(self):
         """
         Private slot to handle the end line toolbutton.
         """
         self.__insertString("$")
-    
+
     @pyqtSlot()
     def on_wordboundButton_clicked(self):
         """
         Private slot to handle the word boundary toolbutton.
         """
         self.__insertString("\\b")
-    
+
     @pyqtSlot()
     def on_nonwordboundButton_clicked(self):
         """
         Private slot to handle the non word boundary toolbutton.
         """
         self.__insertString("\\B")
-    
+
     @pyqtSlot()
     def on_poslookaheadButton_clicked(self):
         """
         Private slot to handle the positive lookahead toolbutton.
         """
         self.__insertString("(?=)", -1)
-    
+
     @pyqtSlot()
     def on_neglookaheadButton_clicked(self):
         """
         Private slot to handle the negative lookahead toolbutton.
         """
         self.__insertString("(?!)", -1)
-    
+
     @pyqtSlot()
     def on_poslookbehindButton_clicked(self):
         """
         Private slot to handle the positive lookbehind toolbutton.
         """
         self.__insertString("(?<=)", -1)
-    
+
     @pyqtSlot()
     def on_neglookbehindButton_clicked(self):
         """
         Private slot to handle the negative lookbehind toolbutton.
         """
         self.__insertString("(?<!)", -1)
-    
+
     @pyqtSlot()
     def on_undoButton_clicked(self):
         """
         Private slot to handle the undo action.
         """
         self.regexpTextEdit.document().undo()
-    
+
     @pyqtSlot()
     def on_redoButton_clicked(self):
         """
         Private slot to handle the redo action.
         """
         self.regexpTextEdit.document().redo()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.validateButton:
@@ -397,7 +405,7 @@
             self.on_nextButton_clicked()
         elif self.copyButton and button == self.copyButton:
             self.on_copyButton_clicked()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -409,7 +417,8 @@
             "",
             self.tr("RegExp Files (*.rx);;All Files (*)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if fname:
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
@@ -420,12 +429,14 @@
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return
-            
+
             try:
                 with fpath.open("w", encoding="utf-8") as f:
                     f.write(self.regexpTextEdit.toPlainText())
@@ -433,10 +444,12 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("""<p>The regular expression could not"""
-                            """ be saved.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
-    
+                    self.tr(
+                        """<p>The regular expression could not"""
+                        """ be saved.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
+
     @pyqtSlot()
     def on_loadButton_clicked(self):
         """
@@ -446,7 +459,8 @@
             self,
             self.tr("Load regular expression"),
             "",
-            self.tr("RegExp Files (*.rx);;All Files (*)"))
+            self.tr("RegExp Files (*.rx);;All Files (*)"),
+        )
         if fname:
             fname = Utilities.toNativeSeparators(fname)
             try:
@@ -457,15 +471,17 @@
                 EricMessageBox.information(
                     self,
                     self.tr("Save regular expression"),
-                    self.tr("""<p>The regular expression could not"""
-                            """ be saved.</p><p>Reason: {0}</p>""")
-                    .format(str(err)))
+                    self.tr(
+                        """<p>The regular expression could not"""
+                        """ be saved.</p><p>Reason: {0}</p>"""
+                    ).format(str(err)),
+                )
 
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
         Private slot to copy the QRegularExpression string into the clipboard.
-        
+
         This slot is only available, if not called from within eric.
         """
         escaped = self.regexpTextEdit.toPlainText()
@@ -484,7 +500,7 @@
         if not self.__pyqt6Available:
             # only available for PyQt6
             return
-        
+
         regexp = self.regexpTextEdit.toPlainText()
         if regexp:
             options = []
@@ -502,7 +518,7 @@
                 options.append("UseUnicodePropertiesOption")
             if self.captureCheckBox.isChecked():
                 options.append("DontCaptureOption")
-            
+
             if self.__sendCommand("validate", options=options, regexp=regexp):
                 response = self.__receiveResponse()
                 if response and "valid" in response:
@@ -510,14 +526,16 @@
                         EricMessageBox.information(
                             self,
                             self.tr("Validation"),
-                            self.tr(
-                                """The regular expression is valid."""))
+                            self.tr("""The regular expression is valid."""),
+                        )
                     else:
                         EricMessageBox.critical(
                             self,
                             self.tr("Error"),
-                            self.tr("""Invalid regular expression: {0}""")
-                            .format(response["errorMessage"]))
+                            self.tr("""Invalid regular expression: {0}""").format(
+                                response["errorMessage"]
+                            ),
+                        )
                         # move cursor to error offset
                         offset = response["errorOffset"]
                         tc = self.regexpTextEdit.textCursor()
@@ -529,33 +547,36 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Communication Error"),
-                        self.tr("""Invalid response received from backend."""))
+                        self.tr("""Invalid response received from backend."""),
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Communication Error"),
-                    self.tr("""Communication with backend failed."""))
+                    self.tr("""Communication with backend failed."""),
+                )
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Error"),
-                self.tr("""A regular expression must be given."""))
+                self.tr("""A regular expression must be given."""),
+            )
 
     @pyqtSlot()
     def on_executeButton_clicked(self, startpos=0):
         """
         Private slot to execute the entered QRegularExpression on the test
         text.
-        
+
         This slot will execute the entered QRegularExpression on the entered
         test data and will display the result in the table part of the dialog.
-        
+
         @param startpos starting position for the QRegularExpression matching
         """
         if not self.__pyqt6Available:
             # only available for PyQt6
             return
-        
+
         regexp = self.regexpTextEdit.toPlainText()
         text = self.textTextEdit.toPlainText()
         if regexp and text:
@@ -574,17 +595,20 @@
                 options.append("UseUnicodePropertiesOption")
             if self.captureCheckBox.isChecked():
                 options.append("DontCaptureOption")
-            
-            if self.__sendCommand("execute", options=options, regexp=regexp,
-                                  text=text, startpos=startpos):
+
+            if self.__sendCommand(
+                "execute", options=options, regexp=regexp, text=text, startpos=startpos
+            ):
                 response = self.__receiveResponse()
                 if response and ("valid" in response or "matched" in response):
                     if "valid" in response:
                         EricMessageBox.critical(
                             self,
                             self.tr("Error"),
-                            self.tr("""Invalid regular expression: {0}""")
-                            .format(response["errorMessage"]))
+                            self.tr("""Invalid regular expression: {0}""").format(
+                                response["errorMessage"]
+                            ),
+                        )
                         # move cursor to error offset
                         offset = response["errorOffset"]
                         tc = self.regexpTextEdit.textCursor()
@@ -595,15 +619,15 @@
                     else:
                         row = 0
                         OFFSET = 5
-                        
+
                         self.resultTable.setColumnCount(0)
                         self.resultTable.setColumnCount(3)
                         self.resultTable.setRowCount(0)
                         self.resultTable.setRowCount(OFFSET)
                         self.resultTable.setItem(
-                            row, 0, QTableWidgetItem(self.tr("Regexp")))
-                        self.resultTable.setItem(
-                            row, 1, QTableWidgetItem(regexp))
+                            row, 0, QTableWidgetItem(self.tr("Regexp"))
+                        )
+                        self.resultTable.setItem(row, 1, QTableWidgetItem(regexp))
                         if response["matched"]:
                             captures = response["captures"]
                             # index 0 is the complete match
@@ -612,63 +636,68 @@
                             self.nextButton.setEnabled(True)
                             row += 1
                             self.resultTable.setItem(
-                                row, 0,
-                                QTableWidgetItem(self.tr("Offset")))
+                                row, 0, QTableWidgetItem(self.tr("Offset"))
+                            )
                             self.resultTable.setItem(
-                                row, 1,
-                                QTableWidgetItem("{0:d}".format(offset)))
-                            
+                                row, 1, QTableWidgetItem("{0:d}".format(offset))
+                            )
+
                             row += 1
                             self.resultTable.setItem(
-                                row, 0,
-                                QTableWidgetItem(self.tr("Captures")))
+                                row, 0, QTableWidgetItem(self.tr("Captures"))
+                            )
                             self.resultTable.setItem(
-                                row, 1,
-                                QTableWidgetItem(
-                                    "{0:d}".format(len(captures) - 1)))
+                                row,
+                                1,
+                                QTableWidgetItem("{0:d}".format(len(captures) - 1)),
+                            )
                             row += 1
                             self.resultTable.setItem(
-                                row, 1,
-                                QTableWidgetItem(self.tr("Text")))
+                                row, 1, QTableWidgetItem(self.tr("Text"))
+                            )
                             self.resultTable.setItem(
-                                row, 2,
-                                QTableWidgetItem(self.tr("Characters")))
-                            
+                                row, 2, QTableWidgetItem(self.tr("Characters"))
+                            )
+
                             row += 1
                             self.resultTable.setItem(
-                                row, 0,
-                                QTableWidgetItem(self.tr("Match")))
+                                row, 0, QTableWidgetItem(self.tr("Match"))
+                            )
                             self.resultTable.setItem(
-                                row, 1,
-                                QTableWidgetItem(captures[0][0]))
+                                row, 1, QTableWidgetItem(captures[0][0])
+                            )
                             self.resultTable.setItem(
-                                row, 2,
-                                QTableWidgetItem(
-                                    "{0:d}".format(captures[0][3])))
-                            
+                                row, 2, QTableWidgetItem("{0:d}".format(captures[0][3]))
+                            )
+
                             for i in range(1, len(captures)):
                                 if captures[i][0]:
                                     row += 1
                                     self.resultTable.insertRow(row)
                                     self.resultTable.setItem(
-                                        row, 0,
+                                        row,
+                                        0,
                                         QTableWidgetItem(
-                                            self.tr("Capture #{0}")
-                                            .format(i)))
+                                            self.tr("Capture #{0}").format(i)
+                                        ),
+                                    )
                                     self.resultTable.setItem(
-                                        row, 1,
-                                        QTableWidgetItem(captures[i][0]))
+                                        row, 1, QTableWidgetItem(captures[i][0])
+                                    )
                                     self.resultTable.setItem(
-                                        row, 2,
+                                        row,
+                                        2,
                                         QTableWidgetItem(
-                                            "{0:d}".format(captures[i][3])))
-                            
+                                            "{0:d}".format(captures[i][3])
+                                        ),
+                                    )
+
                             # highlight the matched text
                             tc = self.textTextEdit.textCursor()
                             tc.setPosition(offset)
                             tc.setPosition(
-                                self.lastMatchEnd,
-                                QTextCursor.MoveMode.KeepAnchor)
+                                self.lastMatchEnd, QTextCursor.MoveMode.KeepAnchor
+                            )
                             self.textTextEdit.setTextCursor(tc)
                         else:
                             self.nextButton.setEnabled(False)
@@ -676,20 +705,18 @@
                             row += 1
                             if startpos > 0:
                                 self.resultTable.setItem(
-                                    row, 0,
-                                    QTableWidgetItem(
-                                        self.tr("No more matches")))
+                                    row, 0, QTableWidgetItem(self.tr("No more matches"))
+                                )
                             else:
                                 self.resultTable.setItem(
-                                    row, 0,
-                                    QTableWidgetItem(
-                                        self.tr("No matches")))
-                            
+                                    row, 0, QTableWidgetItem(self.tr("No matches"))
+                                )
+
                             # remove the highlight
                             tc = self.textTextEdit.textCursor()
                             tc.setPosition(0)
                             self.textTextEdit.setTextCursor(tc)
-                        
+
                         self.resultTable.resizeColumnsToContents()
                         self.resultTable.resizeRowsToContents()
                         self.resultTable.verticalHeader().hide()
@@ -698,26 +725,28 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Communication Error"),
-                        self.tr("""Invalid response received from backend."""))
+                        self.tr("""Invalid response received from backend."""),
+                    )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Communication Error"),
-                    self.tr("""Communication with  backend failed."""))
+                    self.tr("""Communication with  backend failed."""),
+                )
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Error"),
-                self.tr("""A regular expression and a text must"""
-                        """ be given."""))
-    
+                self.tr("""A regular expression and a text must""" """ be given."""),
+            )
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
         Private slot to find the next match.
         """
         self.on_executeButton_clicked(self.lastMatchEnd)
-    
+
     @pyqtSlot()
     def on_regexpTextEdit_textChanged(self):
         """
@@ -725,11 +754,11 @@
         """
         if self.nextButton:
             self.nextButton.setEnabled(False)
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
@@ -737,46 +766,46 @@
         # calculate the indentation string
         i1string = (indLevel + 1) * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         reVar = self.variableLineEdit.text()
         if not reVar:
             reVar = "regexp"
-        
+
         regexp = self.regexpTextEdit.toPlainText()
-        
+
         options = []
         if self.caseInsensitiveCheckBox.isChecked():
-            options.append(
-                "QRegularExpression.PatternOption.CaseInsensitiveOption")
+            options.append("QRegularExpression.PatternOption.CaseInsensitiveOption")
         if self.multilineCheckBox.isChecked():
-            options.append(
-                "QRegularExpression.PatternOption.MultilineOption")
+            options.append("QRegularExpression.PatternOption.MultilineOption")
         if self.dotallCheckBox.isChecked():
             options.append(
-                "QRegularExpression.PatternOption.DotMatchesEverythingOption")
+                "QRegularExpression.PatternOption.DotMatchesEverythingOption"
+            )
         if self.extendedCheckBox.isChecked():
             options.append(
-                "QRegularExpression.PatternOption.ExtendedPatternSyntaxOption")
+                "QRegularExpression.PatternOption.ExtendedPatternSyntaxOption"
+            )
         if self.greedinessCheckBox.isChecked():
-            options.append(
-                "QRegularExpression.PatternOption.InvertedGreedinessOption")
+            options.append("QRegularExpression.PatternOption.InvertedGreedinessOption")
         if self.unicodeCheckBox.isChecked():
             options.append(
-                "QRegularExpression.PatternOption.UseUnicodePropertiesOption")
+                "QRegularExpression.PatternOption.UseUnicodePropertiesOption"
+            )
         if self.captureCheckBox.isChecked():
-            options.append(
-                "QRegularExpression.PatternOption.DontCaptureOption")
+            options.append("QRegularExpression.PatternOption.DontCaptureOption")
         options = " |{0}{1}".format(os.linesep, i1string).join(options)
-        
-        code = '{0} = QRegularExpression('.format(reVar)
+
+        code = "{0} = QRegularExpression(".format(reVar)
         if options:
             code += '{0}{1}r"""{2}""",'.format(
-                os.linesep, i1string, regexp.replace('"', '\\"'))
-            code += '{0}{1}{2}'.format(os.linesep, i1string, options)
+                os.linesep, i1string, regexp.replace('"', '\\"')
+            )
+            code += "{0}{1}{2}".format(os.linesep, i1string, options)
         else:
             code += 'r"""{0}"""'.format(regexp.replace('"', '\\"'))
-        code += '{0}){0}'.format(estring)
+        code += "{0}){0}".format(estring)
         return code
 
 
@@ -784,47 +813,48 @@
     """
     Class for the dialog variant.
     """
+
     def __init__(self, parent=None, fromEric=True):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         @param fromEric flag indicating a call from within eric
         """
         super().__init__(parent)
         self.setModal(fromEric)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.cw = QRegularExpressionWizardWidget(self, fromEric)
         size = self.cw.size()
         self.__layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.buttonBox.accepted.connect(self.accept)
         self.cw.buttonBox.rejected.connect(self.reject)
-    
+
     def getCode(self, indLevel, indString):
         """
         Public method to get the source code.
-        
+
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
         @return generated code (string)
         """
         return self.cw.getCode(indLevel, indString)
-    
+
     def accept(self):
         """
         Public slot to hide the dialog and set the result code to Accepted.
         """
         self.cw.shutdown()
         super().accept()
-    
+
     def reject(self):
         """
         Public slot to hide the dialog and set the result code to Rejected.
@@ -837,10 +867,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
@@ -849,17 +880,16 @@
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(
-            Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.buttonBox.accepted.connect(self.close)
         self.cw.buttonBox.rejected.connect(self.close)
-    
+
     def closeEvent(self, evt):
         """
         Protected method handling the close event.
-        
+
         @param evt close event (QCloseEvent)
         """
         self.cw.shutdown()
--- a/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardRepeatDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardRepeatDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,54 +11,56 @@
 from PyQt6.QtWidgets import QDialog
 
 from .Ui_QRegularExpressionWizardRepeatDialog import (
-    Ui_QRegularExpressionWizardRepeatDialog
+    Ui_QRegularExpressionWizardRepeatDialog,
 )
 
 
 class QRegularExpressionWizardRepeatDialog(
-        QDialog, Ui_QRegularExpressionWizardRepeatDialog):
+    QDialog, Ui_QRegularExpressionWizardRepeatDialog
+):
     """
     Class implementing a dialog for entering repeat counts.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.unlimitedButton.setChecked(True)
         self.greedyButton.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(int)
     def on_lowerSpin_valueChanged(self, value):
         """
         Private slot to handle the lowerSpin valueChanged signal.
-        
+
         @param value value of the spinbox (integer)
         """
         if self.upperSpin.value() < value:
             self.upperSpin.setValue(value)
-    
+
     @pyqtSlot(int)
     def on_upperSpin_valueChanged(self, value):
         """
         Private slot to handle the upperSpin valueChanged signal.
-        
+
         @param value value of the spinbox (integer)
         """
         if self.lowerSpin.value() > value:
             self.lowerSpin.setValue(value)
-    
+
     def getRepeat(self):
         """
         Public method to retrieve the dialog's result.
-        
+
         @return ready formatted repeat string (string)
         """
         if self.possessiveButton.isChecked():
@@ -67,7 +69,7 @@
             greedy = "?"
         else:
             greedy = ""
-            
+
         if self.unlimitedButton.isChecked():
             return "*" + greedy
         elif self.minButton.isChecked():
@@ -89,5 +91,5 @@
             repsMin = self.lowerSpin.value()
             repsMax = self.upperSpin.value()
             return "{{{0:d},{1:d}}}{2}".format(repsMin, repsMax, greedy)
-        
+
         return ""
--- a/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardServer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardServer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def rxValidate(regexp, options):
     """
     Function to validate the given regular expression.
-    
+
     @param regexp regular expression to validate (string)
     @param options list of options (list of string)
     @return tuple of flag indicating validity (boolean), error
@@ -22,30 +22,23 @@
     """
     try:
         from PyQt6.QtCore import QRegularExpression
+
         rxOptions = QRegularExpression.PatternOption.NoPatternOption
         if "CaseInsensitiveOption" in options:
             rxOptions |= QRegularExpression.PatternOption.CaseInsensitiveOption
         if "MultilineOption" in options:
             rxOptions |= QRegularExpression.PatternOption.MultilineOption
         if "DotMatchesEverythingOption" in options:
-            rxOptions |= (
-                QRegularExpression.PatternOption.DotMatchesEverythingOption
-            )
+            rxOptions |= QRegularExpression.PatternOption.DotMatchesEverythingOption
         if "ExtendedPatternSyntaxOption" in options:
-            rxOptions |= (
-                QRegularExpression.PatternOption.ExtendedPatternSyntaxOption
-            )
+            rxOptions |= QRegularExpression.PatternOption.ExtendedPatternSyntaxOption
         if "InvertedGreedinessOption" in options:
-            rxOptions |= (
-                QRegularExpression.PatternOption.InvertedGreedinessOption
-            )
+            rxOptions |= QRegularExpression.PatternOption.InvertedGreedinessOption
         if "UseUnicodePropertiesOption" in options:
-            rxOptions |= (
-                QRegularExpression.PatternOption.UseUnicodePropertiesOption
-            )
+            rxOptions |= QRegularExpression.PatternOption.UseUnicodePropertiesOption
         if "DontCaptureOption" in options:
             rxOptions |= QRegularExpression.PatternOption.DontCaptureOption
-        
+
         error = ""
         errorOffset = -1
         re = QRegularExpression(regexp, rxOptions)
@@ -57,14 +50,14 @@
         valid = False
         error = "ImportError"
         errorOffset = 0
-    
+
     return valid, error, errorOffset
 
 
 def rxExecute(regexp, options, text, startpos):
     """
     Function to execute the given regular expression for a given text.
-    
+
     @param regexp regular expression to validate (string)
     @param options list of options (list of string)
     @param text text to execute on (string)
@@ -77,30 +70,25 @@
     valid, error, errorOffset = rxValidate(regexp, options)
     if not valid:
         return valid, error, errorOffset
-    
+
     from PyQt6.QtCore import QRegularExpression
+
     rxOptions = QRegularExpression.PatternOption.NoPatternOption
     if "CaseInsensitiveOption" in options:
         rxOptions |= QRegularExpression.PatternOption.CaseInsensitiveOption
     if "MultilineOption" in options:
         rxOptions |= QRegularExpression.PatternOption.MultilineOption
     if "DotMatchesEverythingOption" in options:
-        rxOptions |= (
-            QRegularExpression.PatternOption.DotMatchesEverythingOption
-        )
+        rxOptions |= QRegularExpression.PatternOption.DotMatchesEverythingOption
     if "ExtendedPatternSyntaxOption" in options:
-        rxOptions |= (
-            QRegularExpression.PatternOption.ExtendedPatternSyntaxOption
-        )
+        rxOptions |= QRegularExpression.PatternOption.ExtendedPatternSyntaxOption
     if "InvertedGreedinessOption" in options:
         rxOptions |= QRegularExpression.PatternOption.InvertedGreedinessOption
     if "UseUnicodePropertiesOption" in options:
-        rxOptions |= (
-            QRegularExpression.PatternOption.UseUnicodePropertiesOption
-        )
+        rxOptions |= QRegularExpression.PatternOption.UseUnicodePropertiesOption
     if "DontCaptureOption" in options:
         rxOptions |= QRegularExpression.PatternOption.DontCaptureOption
-    
+
     matched = False
     captures = []
     re = QRegularExpression(regexp, rxOptions)
@@ -108,13 +96,15 @@
     if match.hasMatch():
         matched = True
         for index in range(match.lastCapturedIndex() + 1):
-            captures.append([
-                match.captured(index),
-                match.capturedStart(index),
-                match.capturedEnd(index),
-                match.capturedLength(index)
-            ])
-    
+            captures.append(
+                [
+                    match.captured(index),
+                    match.capturedStart(index),
+                    match.capturedEnd(index),
+                    match.capturedLength(index),
+                ]
+            )
+
     return matched, captures
 
 
@@ -133,27 +123,33 @@
                     break
                 elif command == "available":
                     try:
-                        import PyQt6    # __IGNORE_WARNING__
+                        import PyQt6  # __IGNORE_WARNING__
+
                         responseDict["available"] = True
                     except ImportError:
                         responseDict["available"] = False
                 elif command == "validate":
                     valid, error, errorOffset = rxValidate(
-                        commandDict["regexp"], commandDict["options"])
+                        commandDict["regexp"], commandDict["options"]
+                    )
                     responseDict["valid"] = valid
                     responseDict["errorMessage"] = error
                     responseDict["errorOffset"] = errorOffset
                 elif command == "execute":
                     valid, error, errorOffset = rxValidate(
-                        commandDict["regexp"], commandDict["options"])
+                        commandDict["regexp"], commandDict["options"]
+                    )
                     if not valid:
                         responseDict["valid"] = valid
                         responseDict["errorMessage"] = error
                         responseDict["errorOffset"] = errorOffset
                     else:
                         matched, captures = rxExecute(
-                            commandDict["regexp"], commandDict["options"],
-                            commandDict["text"], commandDict["startpos"])
+                            commandDict["regexp"],
+                            commandDict["options"],
+                            commandDict["text"],
+                            commandDict["startpos"],
+                        )
                         responseDict["matched"] = matched
                         responseDict["captures"] = captures
         except ValueError as err:
@@ -163,7 +159,7 @@
         responseStr = json.dumps(responseDict)
         sys.stdout.write(responseStr)
         sys.stdout.flush()
-    
+
     sys.exit(0)
 
 
--- a/src/eric7/Plugins/WizardPlugins/SetupWizard/AddEntryPointDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/SetupWizard/AddEntryPointDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     """
     Class implementing a dialog to enter the data for an entry point.
     """
+
     def __init__(self, rootDirectory, epType="", name="", script="", parent=None):
         """
         Constructor
-        
+
         @param rootDirectory root directory for selecting script modules via
             a file selection dialog
         @type str
@@ -41,42 +42,42 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for typeStr, category in (
             ("", ""),
             (self.tr("Console"), "console_scripts"),
             (self.tr("GUI"), "gui_scripts"),
         ):
             self.typeComboBox.addItem(typeStr, category)
-        
+
         self.scriptButton.setIcon(UI.PixmapCache.getIcon("open"))
-        
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
         self.__rootDirectory = rootDirectory
-        
+
         self.typeComboBox.currentTextChanged.connect(self.__updateOK)
         self.nameEdit.textChanged.connect(self.__updateOK)
         self.scriptEdit.textChanged.connect(self.__updateOK)
-        
+
         self.typeComboBox.setCurrentText(epType)
         self.nameEdit.setText(name)
         self.scriptEdit.setText(script)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
         Private slot to update the enabled state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.typeComboBox.currentText()) and
-            bool(self.nameEdit.text()) and
-            bool(self.scriptEdit.text())
+            bool(self.typeComboBox.currentText())
+            and bool(self.nameEdit.text())
+            and bool(self.scriptEdit.text())
         )
-    
+
     @pyqtSlot()
     def on_scriptButton_clicked(self):
         """
@@ -93,31 +94,33 @@
         else:
             root = self.__rootDirectory
             scriptFunction = "main"
-        
+
         script = EricFileDialog.getOpenFileName(
             self,
             self.tr("Select Script File"),
             root,
-            self.tr("Python Files (*.py);;All Files (*)")
+            self.tr("Python Files (*.py);;All Files (*)"),
         )
-        
+
         if script:
             scriptPath = pathlib.Path(script)
             try:
                 relativeScriptPath = scriptPath.relative_to(self.__rootDirectory)
             except ValueError:
                 relativeScriptPath = scriptPath
-            self.scriptEdit.setText("{0}:{1}".format(
-                str(relativeScriptPath.with_suffix(""))
-                .replace("/", ".")
-                .replace("\\", "."),
-                scriptFunction
-            ))
-    
+            self.scriptEdit.setText(
+                "{0}:{1}".format(
+                    str(relativeScriptPath.with_suffix(""))
+                    .replace("/", ".")
+                    .replace("\\", "."),
+                    scriptFunction,
+                )
+            )
+
     def getEntryPoint(self):
         """
         Public method to get the data for the entry point.
-        
+
         @return tuple containing the entry point type, category, name and
             script function
         @rtype tuple of (str, str, str)
--- a/src/eric7/Plugins/WizardPlugins/SetupWizard/AddProjectUrlDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/SetupWizard/AddProjectUrlDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to enter the data for a project URL.
     """
+
     def __init__(self, name="", url="", parent=None):
         """
         Constructor
-        
+
         @param name name of the project URL (defaults to "")
         @type str (optional)
         @param url address of the project URL (defaults to "")
@@ -30,48 +31,50 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
         self.nameComboBox.lineEdit().setClearButtonEnabled(True)
-        self.nameComboBox.addItems([
-            "",
-            "Bug Tracker",
-            "Change Log",
-            "Documentation",
-            "Donation",
-            "Download",
-            "Funding",
-            "Homepage",
-            "Issues Tracker",
-            "News",
-            "Release Notes",
-        ])
-        
+        self.nameComboBox.addItems(
+            [
+                "",
+                "Bug Tracker",
+                "Change Log",
+                "Documentation",
+                "Donation",
+                "Download",
+                "Funding",
+                "Homepage",
+                "Issues Tracker",
+                "News",
+                "Release Notes",
+            ]
+        )
+
         self.nameComboBox.editTextChanged.connect(self.__updateOK)
         self.urlEdit.textChanged.connect(self.__updateOK)
-        
+
         self.nameComboBox.setEditText(name)
         self.urlEdit.setText(url)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def __updateOK(self):
         """
         Private slot to update the enabled state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.nameComboBox.currentText()) and
-            bool(self.urlEdit.text()) and
-            self.urlEdit.text().startswith(("http://", "https://"))
+            bool(self.nameComboBox.currentText())
+            and bool(self.urlEdit.text())
+            and self.urlEdit.text().startswith(("http://", "https://"))
         )
-    
+
     def getUrl(self):
         """
         Public method to get the data for the project URL.
-        
+
         @return tuple containing the name and address of the project URL
         @rtype tuple of (str, str)
         """
--- a/src/eric7/Plugins/WizardPlugins/SetupWizard/SetupCfgUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/SetupWizard/SetupCfgUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def _bool2string(value):
     """
     Function to convert a bool value to a setup.cfg string.
-    
+
     @param value bool value to be converted
     @type bool
     @return setup.cfg string
@@ -33,7 +33,7 @@
 def _list2string(value):
     """
     Function to convert a list value to a setup.cfg string.
-    
+
     @param value list value to be converted
     @type list
     @return setup.cfg string
@@ -41,14 +41,14 @@
     """
     if value:
         return "\n{0}".format("\n".join(sorted(filter(None, value))))
-    
+
     return ""
 
 
 def _dict2list(value):
     """
     Function to convert a dict value to a setup.cfg list string.
-    
+
     @param value dict value to be converted
     @type dict
     @yield setup.cfg string
@@ -61,7 +61,7 @@
 def _dict2string(value):
     """
     Function to convert a dict value to a setup.cfg string.
-    
+
     @param value dict value to be converted
     @type dict
     @return setup.cfg string
@@ -73,7 +73,7 @@
 def toString(value):
     """
     Function to convert a value to a setup.cfg string.
-    
+
     @param value value to be converted
     @type bool, list, set, tuple or dict
     @return setup.cfg string
--- a/src/eric7/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,9 +18,7 @@
 import trove_classifiers
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QTreeWidgetItem, QListWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem, QListWidgetItem
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricFileDialog
@@ -37,14 +35,15 @@
 class SetupWizardDialog(QDialog, Ui_SetupWizardDialog):
     """
     Class implementing the setup.py wizard dialog.
-    
+
     It displays a dialog for entering the parameters for the setup.py code
     generator.
     """
+
     def __init__(self, category, editor, parent=None):
         """
         Constructor
-        
+
         @param category category of setup file to create
         @type str
         @param editor reference to the editor object to receive the code
@@ -55,58 +54,63 @@
         """
         if category not in ("setup.py", "setup.cfg", "pyproject.toml"):
             raise ValueError("illegal setup file category given")
-        
+
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowTitle(self.tr("{0} Wizard").format(category))
-        
+
         self.__replies = []
         self.__category = category
         self.__editor = editor
-        
+
         if category != "setup.py":
             self.introCheckBox.setVisible(False)
             self.importCheckBox.setVisible(False)
             self.metaDataCheckBox.setVisible(False)
-        
+
         self.dataTabWidget.setCurrentIndex(0)
-        
+
         self.packageRootPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.sourceDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.__mandatoryStyleSheet = (
             "QLineEdit {border: 2px solid; border-color: #dd8888}"
-            if ericApp().usesDarkPalette() else
-            "QLineEdit {border: 2px solid; border-color: #800000}"
+            if ericApp().usesDarkPalette()
+            else "QLineEdit {border: 2px solid; border-color: #800000}"
         )
-        for lineEdit in [self.nameEdit, self.versionEdit,
-                         self.homePageUrlEdit, self.authorEdit,
-                         self.authorEmailEdit, self.maintainerEdit,
-                         self.maintainerEmailEdit]:
+        for lineEdit in [
+            self.nameEdit,
+            self.versionEdit,
+            self.homePageUrlEdit,
+            self.authorEdit,
+            self.authorEmailEdit,
+            self.maintainerEdit,
+            self.maintainerEmailEdit,
+        ]:
             lineEdit.setStyleSheet(self.__mandatoryStyleSheet)
-        
+
         self.__populateClassifiers()
-        
-        self.__okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.__okButton.setEnabled(False)
-        
+
         projectOpen = ericApp().getObject("Project").isOpen()
         self.projectButton.setEnabled(projectOpen)
-        
+
         self.projectUrlsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         self.entryPointsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.descriptionContentTypeComboBox.addItem("", "")
-        for contentType, mimetype in sorted([
-            (self.tr("Plain Text"), "text/plain"),
-            (self.tr("Markdown"), "text/markdown"),
-            (self.tr("reStructuredText"), "text/x-rst")
-            
-        ]):
+        for contentType, mimetype in sorted(
+            [
+                (self.tr("Plain Text"), "text/plain"),
+                (self.tr("Markdown"), "text/markdown"),
+                (self.tr("reStructuredText"), "text/x-rst"),
+            ]
+        ):
             self.descriptionContentTypeComboBox.addItem(contentType, mimetype)
-        
+
         self.homePageUrlEdit.textChanged.connect(self.__enableOkButton)
         self.nameEdit.textChanged.connect(self.__enableOkButton)
         self.versionEdit.textChanged.connect(self.__enableOkButton)
@@ -114,24 +118,27 @@
         self.authorEmailEdit.textChanged.connect(self.__enableOkButton)
         self.maintainerEdit.textChanged.connect(self.__enableOkButton)
         self.maintainerEmailEdit.textChanged.connect(self.__enableOkButton)
-    
+
     def __enableOkButton(self):
         """
         Private slot to set the state of the OK button.
         """
         enable = (
-            bool(self.nameEdit.text()) and
-            bool(self.versionEdit.text()) and
-            bool(self.homePageUrlEdit.text()) and
-            ((bool(self.authorEdit.text()) and
-                bool(self.authorEmailEdit.text())) or
-             (bool(self.maintainerEdit.text()) and
-              bool(self.maintainerEmailEdit.text()))) and
-            self.homePageUrlEdit.text().startswith(("http://", "https://"))
+            bool(self.nameEdit.text())
+            and bool(self.versionEdit.text())
+            and bool(self.homePageUrlEdit.text())
+            and (
+                (bool(self.authorEdit.text()) and bool(self.authorEmailEdit.text()))
+                or (
+                    bool(self.maintainerEdit.text())
+                    and bool(self.maintainerEmailEdit.text())
+                )
+            )
+            and self.homePageUrlEdit.text().startswith(("http://", "https://"))
         )
-        
+
         self.__okButton.setEnabled(enable)
-    
+
     def __populateClassifiers(self):
         """
         Private method to populate the classifiers.
@@ -139,34 +146,33 @@
         self.licenseClassifierComboBox.clear()
         self.classifiersList.clear()
         self.developmentStatusComboBox.clear()
-        
+
         self.developmentStatusComboBox.addItem("", "")
-        
+
         self.__classifiersDict = {}
         for classifier in trove_classifiers.sorted_classifiers:
             if classifier.startswith("License ::"):
                 self.licenseClassifierComboBox.addItem(
-                    "/".join(classifier.split(" :: ")[1:]),
-                    classifier
+                    "/".join(classifier.split(" :: ")[1:]), classifier
                 )
             elif classifier.startswith("Development Status ::"):
                 self.developmentStatusComboBox.addItem(
-                    classifier.split(" :: ")[1], classifier)
+                    classifier.split(" :: ")[1], classifier
+                )
             else:
                 self.__addClassifierEntry(classifier)
         self.__classifiersDict = {}
-        
+
         self.licenseClassifierComboBox.setCurrentIndex(
             self.licenseClassifierComboBox.findText(
-                "(GPLv3)",
-                Qt.MatchFlag.MatchContains | Qt.MatchFlag.MatchCaseSensitive
+                "(GPLv3)", Qt.MatchFlag.MatchContains | Qt.MatchFlag.MatchCaseSensitive
             )
         )
-    
+
     def __addClassifierEntry(self, classifier):
         """
         Private method to add a new entry to the list of trove classifiers.
-        
+
         @param classifier classifier containing the data for the entry
         @type str
         """
@@ -174,11 +180,10 @@
         pitm = None
         dataList = classifier.split(" :: ")
         for index in range(len(dataList)):
-            key = " :: ".join(dataList[:index + 1])
+            key = " :: ".join(dataList[: index + 1])
             if key not in self.__classifiersDict:
                 if pitm is None:
-                    itm = QTreeWidgetItem(
-                        self.classifiersList, [dataList[index]])
+                    itm = QTreeWidgetItem(self.classifiersList, [dataList[index]])
                     pitm = itm
                 else:
                     itm = QTreeWidgetItem(pitm, [dataList[index]])
@@ -188,11 +193,11 @@
                 pitm = self.__classifiersDict[key]
         itm.setCheckState(0, Qt.CheckState.Unchecked)
         itm.setData(0, Qt.ItemDataRole.UserRole, classifier)
-    
+
     def __getLicenseText(self):
         """
         Private method to get the license text.
-        
+
         @return license text
         @rtype str
         """
@@ -203,11 +208,11 @@
             if "(" in lic:
                 lic = lic.rsplit("(", 1)[1].split(")", 1)[0]
             return lic
-    
+
     def __getSetupPyCode(self, indLevel, indString):
         """
         Private method to get the source code for a 'setup.py' file.
-        
+
         @param indLevel indentation level
         @type int
         @param indString string used for indentation (space or tab)
@@ -216,201 +221,226 @@
         @rtype str
         """
         # Note: all paths are created with '/'; setup will do the right thing
-        
+
         # calculate our indentation level and the indentation string
         il = indLevel + 1
         istring = il * indString
         i1string = (il + 1) * indString
         i2string = (il + 2) * indString
         estring = os.linesep + indLevel * indString
-        
+
         # now generate the code
         if self.introCheckBox.isChecked():
             sourceCode = "#!/usr/bin/env python3{0}".format(os.linesep)
             sourceCode += "# -*- coding: utf-8 -*-{0}{0}".format(os.linesep)
         else:
             sourceCode = ""
-        
+
         if self.metaDataCheckBox.isChecked():
-            sourceCode += '# metadata{0}'.format(os.linesep)
+            sourceCode += "# metadata{0}".format(os.linesep)
             sourceCode += '"{0}"{1}'.format(
-                self.summaryEdit.text() or "Setup routine",
-                os.linesep
+                self.summaryEdit.text() or "Setup routine", os.linesep
             )
             sourceCode += '__version__ = "{0}"{1}'.format(
-                self.versionEdit.text(), os.linesep)
+                self.versionEdit.text(), os.linesep
+            )
             sourceCode += '__license__ = "{0}"{1}'.format(
-                self.__getLicenseText(), os.linesep)
+                self.__getLicenseText(), os.linesep
+            )
             sourceCode += '__author__ = "{0}"{1}'.format(
-                self.authorEdit.text() or self.maintainerEdit.text(),
-                os.linesep)
+                self.authorEdit.text() or self.maintainerEdit.text(), os.linesep
+            )
             sourceCode += '__email__ = "{0}"{1}'.format(
                 self.authorEmailEdit.text() or self.maintainerEmailEdit.text(),
-                os.linesep)
+                os.linesep,
+            )
             sourceCode += '__url__ = "{0}"{1}'.format(
-                self.homePageUrlEdit.text(), os.linesep)
+                self.homePageUrlEdit.text(), os.linesep
+            )
             sourceCode += '__date__ = "{0}"{1}'.format(
-                datetime.datetime.now().isoformat().split('.')[0], os.linesep)
-            sourceCode += '__prj__ = "{0}"{1}'.format(
-                self.nameEdit.text(), os.linesep)
+                datetime.datetime.now().isoformat().split(".")[0], os.linesep
+            )
+            sourceCode += '__prj__ = "{0}"{1}'.format(self.nameEdit.text(), os.linesep)
             sourceCode += os.linesep
-        
+
         if self.importCheckBox.isChecked():
             additionalImport = ", find_packages"
             sourceCode += "from setuptools import setup{0}{1}".format(
-                additionalImport, os.linesep)
+                additionalImport, os.linesep
+            )
         if sourceCode:
             sourceCode += "{0}{0}".format(os.linesep)
-        
+
         if self.descriptionFromFilesCheckBox.isChecked():
-            sourceCode += 'def get_long_description():{0}'.format(os.linesep)
-            sourceCode += '{0}descr = []{1}'.format(istring, os.linesep)
+            sourceCode += "def get_long_description():{0}".format(os.linesep)
+            sourceCode += "{0}descr = []{1}".format(istring, os.linesep)
             sourceCode += '{0}for fname in ("{1}"):{2}'.format(
                 istring,
                 '", "'.join(self.descriptionEdit.toPlainText().splitlines()),
-                os.linesep)
+                os.linesep,
+            )
             sourceCode += (
                 '{0}with open(fname, "r", encoding="utf-8") as f:{1}'
             ).format(i1string, os.linesep)
-            sourceCode += '{0}descr.append(f.read()){1}'.format(
-                i2string, os.linesep)
+            sourceCode += "{0}descr.append(f.read()){1}".format(i2string, os.linesep)
             sourceCode += '{0}return "\\n\\n".join(descr){1}'.format(
-                istring, os.linesep)
+                istring, os.linesep
+            )
             sourceCode += "{0}{0}".format(os.linesep)
-        
-        sourceCode += 'setup({0}'.format(os.linesep)
+
+        sourceCode += "setup({0}".format(os.linesep)
         sourceCode += '{0}name="{1}",{2}'.format(
-            istring, self.nameEdit.text(), os.linesep)
+            istring, self.nameEdit.text(), os.linesep
+        )
         sourceCode += '{0}version="{1}",{2}'.format(
-            istring, self.versionEdit.text(), os.linesep)
-        
+            istring, self.versionEdit.text(), os.linesep
+        )
+
         if self.summaryEdit.text():
             sourceCode += '{0}description="{1}",{2}'.format(
-                istring, self.summaryEdit.text(), os.linesep)
-        
+                istring, self.summaryEdit.text(), os.linesep
+            )
+
         if self.descriptionFromFilesCheckBox.isChecked():
-            sourceCode += '{0}long_description=get_long_description(),{1}'.format(
-                istring, os.linesep)
+            sourceCode += "{0}long_description=get_long_description(),{1}".format(
+                istring, os.linesep
+            )
         elif self.descriptionEdit.toPlainText():
             sourceCode += '{0}long_description="""{1}""",{2}'.format(
-                istring, self.descriptionEdit.toPlainText(), os.linesep)
-        
+                istring, self.descriptionEdit.toPlainText(), os.linesep
+            )
+
         if self.descriptionContentTypeComboBox.currentData():
             sourceCode += '{0}long_description_content_type="{1}",{2}'.format(
-                istring, self.descriptionContentTypeComboBox.currentData(), os.linesep)
-        
+                istring, self.descriptionContentTypeComboBox.currentData(), os.linesep
+            )
+
         if self.authorEdit.text():
             sourceCode += '{0}author="{1}",{2}'.format(
-                istring, self.authorEdit.text(), os.linesep)
+                istring, self.authorEdit.text(), os.linesep
+            )
             sourceCode += '{0}author_email="{1}",{2}'.format(
-                istring, self.authorEmailEdit.text(), os.linesep)
-        
+                istring, self.authorEmailEdit.text(), os.linesep
+            )
+
         if self.maintainerEdit.text():
             sourceCode += '{0}maintainer="{1}",{2}'.format(
-                istring, self.maintainerEdit.text(), os.linesep)
+                istring, self.maintainerEdit.text(), os.linesep
+            )
             sourceCode += '{0}maintainer_email="{1}",{2}'.format(
-                istring, self.maintainerEmailEdit.text(), os.linesep)
-        
+                istring, self.maintainerEmailEdit.text(), os.linesep
+            )
+
         sourceCode += '{0}url="{1}",{2}'.format(
-            istring, self.homePageUrlEdit.text(), os.linesep)
+            istring, self.homePageUrlEdit.text(), os.linesep
+        )
         if self.downloadUrlEdit.text():
             sourceCode += '{0}download_url="{1}",{2}'.format(
-                istring, self.downloadUrlEdit.text(), os.linesep)
-        
+                istring, self.downloadUrlEdit.text(), os.linesep
+            )
+
         if self.projectUrlsList.topLevelItemCount():
-            sourceCode += '{0}project_urls={{{1}'.format(istring, os.linesep)
+            sourceCode += "{0}project_urls={{{1}".format(istring, os.linesep)
             for row in range(self.projectUrlsList.topLevelItemCount()):
                 urlItem = self.projectUrlsList.topLevelItem(row)
                 sourceCode += '{0}"{1}": "{2}",{3}'.format(
-                    i1string, urlItem.text(0), urlItem.text(1), os.linesep)
-            sourceCode += '{0}}},{1}'.format(istring, os.linesep)
-        
+                    i1string, urlItem.text(0), urlItem.text(1), os.linesep
+                )
+            sourceCode += "{0}}},{1}".format(istring, os.linesep)
+
         classifiers = []
         if not self.licenseClassifierCheckBox.isChecked():
             sourceCode += '{0}license="{1}",{2}'.format(
-                istring, self.licenseEdit.text(), os.linesep)
+                istring, self.licenseEdit.text(), os.linesep
+            )
         else:
             classifiers.append(
                 self.licenseClassifierComboBox.itemData(
-                    self.licenseClassifierComboBox.currentIndex()))
-        
+                    self.licenseClassifierComboBox.currentIndex()
+                )
+            )
+
         platforms = self.platformsEdit.toPlainText().splitlines()
         if platforms:
-            sourceCode += '{0}platforms=[{1}'.format(istring, os.linesep)
+            sourceCode += "{0}platforms=[{1}".format(istring, os.linesep)
             sourceCode += '{0}"{1}"{2}'.format(
                 i1string,
                 '",{0}{1}"'.format(os.linesep, i1string).join(platforms),
-                os.linesep)
-            sourceCode += '{0}],{1}'.format(istring, os.linesep)
-        
+                os.linesep,
+            )
+            sourceCode += "{0}],{1}".format(istring, os.linesep)
+
         if self.developmentStatusComboBox.currentIndex() != 0:
             classifiers.append(self.developmentStatusComboBox.currentData())
-        
+
         itm = self.classifiersList.topLevelItem(0)
         while itm:
             itm.setExpanded(True)
             if itm.checkState(0) == Qt.CheckState.Checked:
                 classifiers.append(itm.data(0, Qt.ItemDataRole.UserRole))
             itm = self.classifiersList.itemBelow(itm)
-        
+
         # cleanup classifiers list - remove all invalid entries
         classifiers = [c for c in classifiers if bool(c)]
         if classifiers:
-            sourceCode += '{0}classifiers=[{1}'.format(istring, os.linesep)
+            sourceCode += "{0}classifiers=[{1}".format(istring, os.linesep)
             sourceCode += '{0}"{1}"{2}'.format(
                 i1string,
                 '",{0}{1}"'.format(os.linesep, i1string).join(classifiers),
-                os.linesep)
-            sourceCode += '{0}],{1}'.format(istring, os.linesep)
+                os.linesep,
+            )
+            sourceCode += "{0}],{1}".format(istring, os.linesep)
         del classifiers
-        
+
         if self.keywordsEdit.text():
             sourceCode += '{0}keywords="{1}",{2}'.format(
-                istring, self.keywordsEdit.text(), os.linesep)
-        
+                istring, self.keywordsEdit.text(), os.linesep
+            )
+
         if self.pyVersionEdit.text():
             sourceCode += '{0}python_requires="{1}",{2}'.format(
-                istring, self.pyVersionEdit.text(), os.linesep)
-        
-        sourceCode += '{0}packages=find_packages('.format(istring)
-        src = Utilities.fromNativeSeparators(
-            self.sourceDirectoryPicker.text())
+                istring, self.pyVersionEdit.text(), os.linesep
+            )
+
+        sourceCode += "{0}packages=find_packages(".format(istring)
+        src = Utilities.fromNativeSeparators(self.sourceDirectoryPicker.text())
         excludePatterns = []
         for row in range(self.excludePatternList.count()):
-            excludePatterns.append(
-                self.excludePatternList.item(row).text())
+            excludePatterns.append(self.excludePatternList.item(row).text())
         if src:
             sourceCode += '{0}{1}"{2}"'.format(os.linesep, i1string, src)
             if excludePatterns:
-                sourceCode += ','
+                sourceCode += ","
             else:
-                sourceCode += '{0}{1}'.format(os.linesep, istring)
+                sourceCode += "{0}{1}".format(os.linesep, istring)
         if excludePatterns:
-            sourceCode += '{0}{1}exclude=[{0}'.format(os.linesep, i1string)
+            sourceCode += "{0}{1}exclude=[{0}".format(os.linesep, i1string)
             sourceCode += '{0}"{1}"{2}'.format(
                 i2string,
-                '",{0}{1}"'.format(os.linesep, i2string)
-                .join(excludePatterns),
-                os.linesep)
-            sourceCode += '{0}]{1}{2}'.format(i1string, os.linesep, istring)
-        sourceCode += '),{0}'.format(os.linesep)
-        
+                '",{0}{1}"'.format(os.linesep, i2string).join(excludePatterns),
+                os.linesep,
+            )
+            sourceCode += "{0}]{1}{2}".format(i1string, os.linesep, istring)
+        sourceCode += "),{0}".format(os.linesep)
+
         if self.includePackageDataCheckBox.isChecked():
-            sourceCode += '{0}include_package_data = True,{1}'.format(
-                istring, os.linesep)
-        
+            sourceCode += "{0}include_package_data = True,{1}".format(
+                istring, os.linesep
+            )
+
         modules = []
         for row in range(self.modulesList.count()):
             modules.append(self.modulesList.item(row).text())
         if modules:
-            sourceCode += '{0}py_modules=[{1}'.format(istring, os.linesep)
+            sourceCode += "{0}py_modules=[{1}".format(istring, os.linesep)
             sourceCode += '{0}"{1}"{2}'.format(
                 i1string,
                 '",{0}{1}"'.format(os.linesep, i1string).join(modules),
-                os.linesep)
-            sourceCode += '{0}],{1}'.format(istring, os.linesep)
+                os.linesep,
+            )
+            sourceCode += "{0}],{1}".format(istring, os.linesep)
         del modules
-        
+
         if self.entryPointsList.topLevelItemCount():
             entryPoints = {
                 "console_scripts": [],
@@ -421,131 +451,134 @@
                 entryPoints[itm.data(0, Qt.ItemDataRole.UserRole)].append(
                     "{0} = {1}".format(itm.text(1), itm.text(2))
                 )
-            sourceCode += '{0}entry_points={{{1}'.format(istring, os.linesep)
+            sourceCode += "{0}entry_points={{{1}".format(istring, os.linesep)
             for epCategory in entryPoints:
                 if entryPoints[epCategory]:
                     sourceCode += '{0}"{1}": [{2}'.format(
-                        i1string, epCategory, os.linesep)
+                        i1string, epCategory, os.linesep
+                    )
                     for entryPoint in entryPoints[epCategory]:
                         sourceCode += '{0}"{1}",{2}'.format(
-                            i2string, entryPoint, os.linesep)
-                    sourceCode += '{0}],{1}'.format(i1string, os.linesep)
-            sourceCode += '{0}}},{1}'.format(istring, os.linesep)
-        
+                            i2string, entryPoint, os.linesep
+                        )
+                    sourceCode += "{0}],{1}".format(i1string, os.linesep)
+            sourceCode += "{0}}},{1}".format(istring, os.linesep)
+
         sourceCode += "){0}".format(estring)
         return sourceCode
-    
+
     def __getSetupCfgCode(self):
         """
         Private method to get the source code for a 'setup.cfg' file.
-        
+
         @return generated code
         @rtype str
         """
         from . import SetupCfgUtilities
+
         metadata = {
             "name": self.nameEdit.text(),
             "version": self.versionEdit.text(),
         }
-        
+
         if self.summaryEdit.text():
             metadata["description"] = self.summaryEdit.text()
-        
+
         if self.descriptionEdit.toPlainText():
             metadata["long_description"] = (
                 "file: {0}".format(
                     ", ".join(self.descriptionEdit.toPlainText().splitlines())
                 )
-                if self.descriptionFromFilesCheckBox.isChecked() else
-                self.descriptionEdit.toPlainText()
+                if self.descriptionFromFilesCheckBox.isChecked()
+                else self.descriptionEdit.toPlainText()
             )
-        
+
         if self.descriptionContentTypeComboBox.currentData():
-            metadata["long_description_content_type"] = (
-                self.descriptionContentTypeComboBox.currentData()
-            )
-        
+            metadata[
+                "long_description_content_type"
+            ] = self.descriptionContentTypeComboBox.currentData()
+
         if self.authorEdit.text():
             metadata["author"] = self.authorEdit.text()
             metadata["author_email"] = self.authorEmailEdit.text()
-        
+
         if self.maintainerEdit.text():
             metadata["maintainer"] = self.maintainerEdit.text()
             metadata["maintainer_email"] = self.maintainerEmailEdit.text()
-        
+
         metadata["url"] = self.homePageUrlEdit.text()
         if self.downloadUrlEdit.text():
             metadata["download_url"] = self.downloadUrlEdit.text()
-        
+
         if self.projectUrlsList.topLevelItemCount():
             projectURLs = {}
             for row in range(self.projectUrlsList.topLevelItemCount()):
                 urlItem = self.projectUrlsList.topLevelItem(row)
                 projectURLs[urlItem.text(0)] = urlItem.text(1)
             metadata["project_urls"] = SetupCfgUtilities.toString(projectURLs)
-        
+
         classifiers = []
         if not self.licenseClassifierCheckBox.isChecked():
             metadata["license"] = self.licenseEdit.text()
         else:
             classifiers.append(
                 self.licenseClassifierComboBox.itemData(
-                    self.licenseClassifierComboBox.currentIndex()))
-        
+                    self.licenseClassifierComboBox.currentIndex()
+                )
+            )
+
         platforms = self.platformsEdit.toPlainText().splitlines()
         if platforms:
             metadata["platforms"] = SetupCfgUtilities.toString(platforms)
-        
+
         if self.developmentStatusComboBox.currentIndex() != 0:
             classifiers.append(self.developmentStatusComboBox.currentData())
-        
+
         itm = self.classifiersList.topLevelItem(0)
         while itm:
             itm.setExpanded(True)
             if itm.checkState(0) == Qt.CheckState.Checked:
                 classifiers.append(itm.data(0, Qt.ItemDataRole.UserRole))
             itm = self.classifiersList.itemBelow(itm)
-        
+
         # cleanup classifiers list - remove all invalid entries
         classifiers = [c for c in classifiers if bool(c)]
         if classifiers:
             metadata["classifiers"] = SetupCfgUtilities.toString(classifiers)
-        
+
         if self.keywordsEdit.text():
             metadata["keywords"] = SetupCfgUtilities.toString(
-                self.keywordsEdit.text().split())
-        
-        options = {
-            "packages": "find:"
-        }
-        
+                self.keywordsEdit.text().split()
+            )
+
+        options = {"packages": "find:"}
+
         if self.pyVersionEdit.text():
             options["python_requires"] = self.pyVersionEdit.text()
-        
+
         findOptions = {}
         src = Utilities.fromNativeSeparators(self.sourceDirectoryPicker.text())
         excludePatterns = []
         for row in range(self.excludePatternList.count()):
-            excludePatterns.append(
-                self.excludePatternList.item(row).text())
+            excludePatterns.append(self.excludePatternList.item(row).text())
         if src:
             options["package_dir"] = SetupCfgUtilities.toString({"": src})
             findOptions["where"] = src
         if excludePatterns:
             findOptions["exclude"] = SetupCfgUtilities.toString(excludePatterns)
-        
+
         if self.includePackageDataCheckBox.isChecked():
             options["include_package_data"] = SetupCfgUtilities.toString(True)
-            packageData = {}    # placeholder section
+            packageData = {}  # placeholder section
         else:
             packageData = None
-        
+
         modules = []
         for row in range(self.modulesList.count()):
             modules.append(self.modulesList.item(row).text())
         if modules:
             options["py_modules"] = SetupCfgUtilities.toString(modules)
-        
+
         if self.entryPointsList.topLevelItemCount():
             entryPoints = {
                 "console_scripts": {},
@@ -554,16 +587,18 @@
             for row in range(self.entryPointsList.topLevelItemCount()):
                 itm = self.entryPointsList.topLevelItem(row)
                 entryPoints[itm.data(0, Qt.ItemDataRole.UserRole)][
-                    itm.text(1)] = itm.text(2)
+                    itm.text(1)
+                ] = itm.text(2)
             for epType in list(entryPoints.keys()):
                 if entryPoints[epType]:
                     entryPoints[epType] = SetupCfgUtilities.toString(
-                        entryPoints[epType])
+                        entryPoints[epType]
+                    )
                 else:
                     del entryPoints[epType]
         else:
             entryPoints = {}
-        
+
         configDict = {
             "metadata": metadata,
             "options": options,
@@ -573,46 +608,46 @@
             configDict["options.package_data"] = packageData
         if entryPoints:
             configDict["options.entry_points"] = entryPoints
-        
+
         cparser = configparser.ConfigParser()
         cparser.read_dict(configDict)
         sio = io.StringIO()
         cparser.write(sio)
         sourceCode = sio.getvalue()
         return sourceCode
-    
+
     def __getPyprojectCode(self):
         """
         Private method to get the source code for a 'pyproject.toml' file.
-        
+
         @return generated code
         @rtype str
         """
         doc = tomlkit.document()
-        
+
         buildSystem = tomlkit.table()
         buildSystem["requires"] = ["setuptools>=61.0.0", "wheel"]
         buildSystem["build-backend"] = "setuptools.build_meta"
         doc["build-system"] = buildSystem
-        
+
         project = tomlkit.table()
         project["name"] = self.nameEdit.text()
         project["version"] = self.versionEdit.text()
-        
+
         if self.summaryEdit.text():
             project["description"] = self.summaryEdit.text()
-        
+
         if self.descriptionEdit.toPlainText():
             if self.descriptionFromFilesCheckBox.isChecked():
                 project["readme"] = self.descriptionEdit.toPlainText().splitlines()[0]
             else:
                 readme = tomlkit.table()
                 readme["text"] = self.descriptionEdit.toPlainText()
-                readme["content-type"] = (
-                    self.descriptionContentTypeComboBox.currentData()
-                )
+                readme[
+                    "content-type"
+                ] = self.descriptionContentTypeComboBox.currentData()
                 project["readme"] = readme
-        
+
         if self.authorEdit.text():
             authors = tomlkit.array()
             author = tomlkit.inline_table()
@@ -620,7 +655,7 @@
             author["email"] = self.authorEmailEdit.text()
             authors.append(author)
             project["authors"] = authors
-        
+
         if self.maintainerEdit.text():
             maintainers = tomlkit.array()
             maintainer = tomlkit.inline_table()
@@ -628,18 +663,18 @@
             maintainer["email"] = self.maintainerEmailEdit.text()
             maintainers.append(maintainer)
             project["maintainers"] = maintainers
-        
+
         urls = tomlkit.table()
         urls["Homepage"] = self.homePageUrlEdit.text()
         if self.downloadUrlEdit.text():
             urls["Download"] = self.downloadUrlEdit.text()
-        
+
         if self.projectUrlsList.topLevelItemCount():
             for row in range(self.projectUrlsList.topLevelItemCount()):
                 urlItem = self.projectUrlsList.topLevelItem(row)
                 urls[urlItem.text(0)] = urlItem.text(1)
         project["urls"] = urls
-        
+
         classifiers = []
         if not self.licenseClassifierCheckBox.isChecked():
             licenseTbl = tomlkit.table()
@@ -648,18 +683,20 @@
         else:
             classifiers.append(
                 self.licenseClassifierComboBox.itemData(
-                    self.licenseClassifierComboBox.currentIndex()))
-        
+                    self.licenseClassifierComboBox.currentIndex()
+                )
+            )
+
         if self.developmentStatusComboBox.currentIndex() != 0:
             classifiers.append(self.developmentStatusComboBox.currentData())
-        
+
         itm = self.classifiersList.topLevelItem(0)
         while itm:
             itm.setExpanded(True)
             if itm.checkState(0) == Qt.CheckState.Checked:
                 classifiers.append(itm.data(0, Qt.ItemDataRole.UserRole))
             itm = self.classifiersList.itemBelow(itm)
-        
+
         # cleanup classifiers list - remove all invalid entries
         classifiers = [c for c in classifiers if bool(c)]
         if classifiers:
@@ -668,17 +705,17 @@
                 classifiersArray.add_line(classifier)
             classifiersArray.append(tomlkit.nl())
             project["classifiers"] = classifiersArray
-        
+
         if self.keywordsEdit.text():
             keywords = tomlkit.array()
             for kw in self.keywordsEdit.text().split():
                 keywords.add_line(kw)
             keywords.append(tomlkit.nl())
             project["keywords"] = keywords
-        
+
         if self.pyVersionEdit.text():
             project["requires-python"] = self.pyVersionEdit.text()
-        
+
         if self.entryPointsList.topLevelItemCount():
             entryPoints = {
                 "console_scripts": {},
@@ -687,31 +724,32 @@
             for row in range(self.entryPointsList.topLevelItemCount()):
                 itm = self.entryPointsList.topLevelItem(row)
                 entryPoints[itm.data(0, Qt.ItemDataRole.UserRole)][
-                    itm.text(1)] = itm.text(2)
-            
+                    itm.text(1)
+                ] = itm.text(2)
+
             if entryPoints["console_scripts"]:
                 scripts = tomlkit.table()
                 for name, function in entryPoints["console_scripts"].items():
                     scripts[name] = function
                 project["scripts"] = scripts
-            
+
             if entryPoints["gui_scripts"]:
                 guiScripts = tomlkit.table()
                 for name, function in entryPoints["gui_scripts"].items():
                     guiScripts[name] = function
                 project["gui-scripts"] = guiScripts
-        
+
         # placeholder
         dependencies = tomlkit.array()
-        dependencies.append(tomlkit.comment(
-            "TODO: enter project dependencies "                 # __NO-TASK__
-        ))
+        dependencies.append(
+            tomlkit.comment("TODO: enter project dependencies ")  # __NO-TASK__
+        )
         project["dependencies"] = dependencies
-        
+
         doc["project"] = project
-        
+
         setuptools = tomlkit.table()
-        
+
         platforms = self.platformsEdit.toPlainText().splitlines()
         if platforms:
             platformsArray = tomlkit.array()
@@ -719,28 +757,27 @@
                 platformsArray.add_line(plt)
             platformsArray.append(tomlkit.nl())
             setuptools["platforms"] = platformsArray
-        
+
         setuptools["include-package-data"] = self.includePackageDataCheckBox.isChecked()
         if self.includePackageDataCheckBox.isChecked():
             # placeholder
             setuptools["package-data"] = tomlkit.table()
-            setuptools["package-data"].add(tomlkit.comment(
-                "TODO: enter package data patterns"             # __NO-TASK__
-            ))
-        
+            setuptools["package-data"].add(
+                tomlkit.comment("TODO: enter package data patterns")  # __NO-TASK__
+            )
+
         if self.modulesList.count():
             modulesArray = tomlkit.array()
             for row in range(self.modulesList.count()):
                 modulesArray.add_line(self.modulesList.item(row).text())
             modulesArray.append(tomlkit.nl())
             setuptools["py-modules"] = modulesArray
-        
+
         findspec = tomlkit.table()
         src = Utilities.fromNativeSeparators(self.sourceDirectoryPicker.text())
         excludePatterns = []
         for row in range(self.excludePatternList.count()):
-            excludePatterns.append(
-                self.excludePatternList.item(row).text())
+            excludePatterns.append(self.excludePatternList.item(row).text())
         if src:
             findspec["where"] = [ericApp().getObject("Project").getRelativePath(src)]
         if excludePatterns:
@@ -749,17 +786,17 @@
                 excludePatternsArray.add_line(pattern)
             excludePatternsArray.append(tomlkit.nl())
             findspec["exclude"] = excludePatternsArray
-        
+
         if bool(findspec):
             setuptools["packages"] = tomlkit.table(is_super_table=True)
             setuptools["packages"]["find"] = findspec
-        
+
         doc["tool"] = tomlkit.table(is_super_table=True)
         doc["tool"]["setuptools"] = setuptools
-        
+
         sourceCode = tomlkit.dumps(doc)
         return sourceCode
-    
+
     @pyqtSlot()
     def accept(self):
         """
@@ -768,11 +805,11 @@
         line, index = self.__editor.getCursorPosition()
         indLevel = self.__editor.indentation(line) // self.__editor.indentationWidth()
         indString = (
-            '\t'
-            if self.__editor.indentationsUseTabs() else
-            self.__editor.indentationWidth() * ' '
+            "\t"
+            if self.__editor.indentationsUseTabs()
+            else self.__editor.indentationWidth() * " "
         )
-        
+
         if self.__category == "setup.py":
             sourceCode = self.__getSetupPyCode(indLevel, indString)
         elif self.__category == "setup.cfg":
@@ -782,16 +819,16 @@
         else:
             # should not happen, but play it safe
             sourceCode = ""
-        
+
         if sourceCode:
             line, index = self.__editor.getCursorPosition()
             # It should be done this way to allow undo
             self.__editor.beginUndoAction()
             self.__editor.insertAt(sourceCode, line, index)
             self.__editor.endUndoAction()
-        
+
         super().accept()
-    
+
     @pyqtSlot()
     def on_projectButton_clicked(self):
         """
@@ -799,7 +836,7 @@
         current project.
         """
         project = ericApp().getObject("Project")
-        
+
         self.nameEdit.setText(project.getProjectName())
         try:
             self.versionEdit.setText(project.getProjectVersion())
@@ -811,29 +848,25 @@
             self.authorEdit.setText(project.pdata["AUTHOR"][0])
             self.authorEmailEdit.setText(project.pdata["EMAIL"][0])
             description = project.pdata["DESCRIPTION"][0]
-        
-        summary = (
-            description.split(".", 1)[0].replace("\r", "").replace("\n", "") +
-            "."
-        )
+
+        summary = description.split(".", 1)[0].replace("\r", "").replace("\n", "") + "."
         self.summaryEdit.setText(summary)
         self.descriptionEdit.setPlainText(description)
-        
+
         self.packageRootPicker.setText(project.getProjectPath())
-        
+
         # prevent overwriting of entries by disabling the button
         self.projectButton.setEnabled(False)
-    
+
     def __getStartDir(self):
         """
         Private method to get the start directory for selection dialogs.
-        
+
         @return start directory
         @rtype str
         """
-        return (Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir())
-    
+        return Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
+
     @pyqtSlot()
     def on_entryPointsList_itemSelectionChanged(self):
         """
@@ -841,10 +874,12 @@
         entry points list.
         """
         self.deleteEntryPointButton.setEnabled(
-            bool(self.entryPointsList.selectedItems()))
+            bool(self.entryPointsList.selectedItems())
+        )
         self.editEntryPointButton.setEnabled(
-            len(self.entryPointsList.selectedItems()) == 1)
-    
+            len(self.entryPointsList.selectedItems()) == 1
+        )
+
     @pyqtSlot()
     def on_deleteEntryPointButton_clicked(self):
         """
@@ -853,54 +888,50 @@
         for itm in self.entryPointsList.selectedItems():
             self.entryPointsList.takeTopLevelItem(self.entryPointsList.row(itm))
             del itm
-    
+
     @pyqtSlot()
     def on_addEntryPointButton_clicked(self):
         """
         Private slot to add an entry point to the list.
         """
         project = ericApp().getObject("Project")
-        rootDir = (
-            project.getProjectPath()
-            if project.isOpen() else
-            ""
-        )
+        rootDir = project.getProjectPath() if project.isOpen() else ""
         dlg = AddEntryPointDialog(rootDir, parent=self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             epType, epCategory, name, script = dlg.getEntryPoint()
             itm = QTreeWidgetItem(self.entryPointsList, [epType, name, script])
             itm.setData(0, Qt.ItemDataRole.UserRole, epCategory)
-    
+
     @pyqtSlot()
     def on_editEntryPointButton_clicked(self):
         """
         Private slot to edit the selected entry point.
         """
         project = ericApp().getObject("Project")
-        rootDir = (
-            project.getProjectPath()
-            if project.isOpen() else
-            ""
+        rootDir = project.getProjectPath() if project.isOpen() else ""
+        itm = self.entryPointsList.selectedItems()[0]
+        dlg = AddEntryPointDialog(
+            rootDir,
+            epType=itm.text(0),
+            name=itm.text(1),
+            script=itm.text(2),
+            parent=self,
         )
-        itm = self.entryPointsList.selectedItems()[0]
-        dlg = AddEntryPointDialog(rootDir, epType=itm.text(0), name=itm.text(1),
-                                  script=itm.text(2), parent=self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             epType, epCategory, name, script = dlg.getEntryPoint()
             itm.setText(0, epType)
             itm.setText(1, name)
             itm.setText(2, script)
             itm.setData(0, Qt.ItemDataRole.UserRole, epCategory)
-    
+
     @pyqtSlot()
     def on_modulesList_itemSelectionChanged(self):
         """
         Private slot to handle a change of selected items of the
         modules list.
         """
-        self.deleteModuleButton.setEnabled(
-            bool(self.modulesList.selectedItems()))
-    
+        self.deleteModuleButton.setEnabled(bool(self.modulesList.selectedItems()))
+
     @pyqtSlot()
     def on_deleteModuleButton_clicked(self):
         """
@@ -909,7 +940,7 @@
         for itm in self.modulesList.selectedItems():
             self.modulesList.takeItem(self.modulesList.row(itm))
             del itm
-    
+
     @pyqtSlot()
     def on_addModuleButton_clicked(self):
         """
@@ -920,10 +951,10 @@
             self,
             self.tr("Add Python Modules"),
             startDir,
-            self.tr("Python Files (*.py)"))
+            self.tr("Python Files (*.py)"),
+        )
         for module in modulesList:
-            module = module.replace(
-                Utilities.toNativeSeparators(startDir), "")
+            module = module.replace(Utilities.toNativeSeparators(startDir), "")
             if module.startswith(("\\", "/")):
                 module = module[1:]
             if module:
@@ -931,9 +962,9 @@
                     str(pathlib.Path(module).with_suffix(""))
                     .replace("\\", ".")
                     .replace("/", "."),
-                    self.modulesList
+                    self.modulesList,
                 )
-    
+
     @pyqtSlot()
     def on_excludePatternList_itemSelectionChanged(self):
         """
@@ -941,42 +972,39 @@
         exclude pattern list.
         """
         self.deleteExcludePatternButton.setEnabled(
-            bool(self.excludePatternList.selectedItems()))
-    
+            bool(self.excludePatternList.selectedItems())
+        )
+
     @pyqtSlot()
     def on_deleteExcludePatternButton_clicked(self):
         """
         Private slot to delete the selected exclude pattern items.
         """
         for itm in self.excludePatternList.selectedItems():
-            self.excludePatternList.takeItem(
-                self.excludePatternList.row(itm))
+            self.excludePatternList.takeItem(self.excludePatternList.row(itm))
             del itm
-    
+
     @pyqtSlot()
     def on_addExludePatternButton_clicked(self):
         """
         Private slot to add an exclude pattern to the list.
         """
-        pattern = (
-            self.excludePatternEdit.text().replace("\\", ".").replace("/", ".")
-        )
+        pattern = self.excludePatternEdit.text().replace("\\", ".").replace("/", ".")
         if not self.excludePatternList.findItems(
-            pattern,
-            Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
+            pattern, Qt.MatchFlag.MatchExactly | Qt.MatchFlag.MatchCaseSensitive
         ):
             QListWidgetItem(pattern, self.excludePatternList)
-    
+
     @pyqtSlot(str)
     def on_excludePatternEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the exclude pattern text.
-        
+
         @param txt text of the line edit
         @type str
         """
         self.addExludePatternButton.setEnabled(bool(txt))
-    
+
     @pyqtSlot()
     def on_excludePatternEdit_returnPressed(self):
         """
@@ -984,7 +1012,7 @@
         exclude pattern edit.
         """
         self.on_addExludePatternButton_clicked()
-    
+
     @pyqtSlot()
     def on_urlDeleteButton_clicked(self):
         """
@@ -993,7 +1021,7 @@
         for itm in self.projectUrlsList.selectedItems():
             self.projectUrlsList.takeTopLevelItem(self.projectUrlsList.row(itm))
             del itm
-    
+
     @pyqtSlot()
     def on_urlAddButton_clicked(self):
         """
@@ -1003,7 +1031,7 @@
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, url = dlg.getUrl()
             QTreeWidgetItem(self.projectUrlsList, [name, url])
-    
+
     @pyqtSlot()
     def on_urlEditButton_clicked(self):
         """
@@ -1015,7 +1043,7 @@
             name, url = dlg.getUrl()
             itm.setText(0, name)
             itm.setText(1, url)
-    
+
     @pyqtSlot()
     def on_projectUrlsList_itemSelectionChanged(self):
         """
--- a/src/eric7/Preferences/ConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,9 +16,22 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QMetaObject, QRect
 from PyQt6.QtGui import QPixmap
 from PyQt6.QtWidgets import (
-    QSizePolicy, QSpacerItem, QWidget, QTreeWidget, QStackedWidget, QDialog,
-    QSplitter, QScrollArea, QApplication, QDialogButtonBox, QFrame,
-    QVBoxLayout, QTreeWidgetItem, QLabel, QAbstractScrollArea, QLineEdit
+    QSizePolicy,
+    QSpacerItem,
+    QWidget,
+    QTreeWidget,
+    QStackedWidget,
+    QDialog,
+    QSplitter,
+    QScrollArea,
+    QApplication,
+    QDialogButtonBox,
+    QFrame,
+    QVBoxLayout,
+    QTreeWidgetItem,
+    QLabel,
+    QAbstractScrollArea,
+    QLineEdit,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -38,10 +51,11 @@
     """
     Class implementing a QTreeWidgetItem holding the configuration page data.
     """
+
     def __init__(self, parent, text, pageName, iconFile):
         """
         Constructor
-        
+
         @param parent parent widget of the item (QTreeWidget or
             QTreeWidgetItem)
         @param text text to be displayed (string)
@@ -50,13 +64,13 @@
         """
         super().__init__(parent, [text])
         self.setIcon(0, UI.PixmapCache.getIcon(iconFile))
-        
+
         self.__pageName = pageName
-        
+
     def getPageName(self):
         """
         Public method to get the name of the associated configuration page.
-        
+
         @return name of the configuration page (string)
         """
         return self.__pageName
@@ -66,6 +80,7 @@
     """
     Class defining the various modes of the configuration widget.
     """
+
     DEFAULTMODE = 0
     TRAYSTARTERMODE = 1
     HEXEDITORMODE = 2
@@ -76,24 +91,29 @@
 class ConfigurationWidget(QWidget):
     """
     Class implementing a dialog for the configuration of eric.
-    
+
     @signal preferencesChanged() emitted after settings have been changed
     @signal masterPasswordChanged(str, str) emitted after the master
         password has been changed with the old and the new password
     @signal accepted() emitted to indicate acceptance of the changes
     @signal rejected() emitted to indicate rejection of the changes
     """
+
     preferencesChanged = pyqtSignal()
     masterPasswordChanged = pyqtSignal(str, str)
     accepted = pyqtSignal()
     rejected = pyqtSignal()
-    
-    def __init__(self, parent=None, fromEric=True,
-                 displayMode=ConfigurationMode.DEFAULTMODE,
-                 expandedEntries=None):
+
+    def __init__(
+        self,
+        parent=None,
+        fromEric=True,
+        displayMode=ConfigurationMode.DEFAULTMODE,
+        expandedEntries=None,
+    ):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param fromEric flag indicating a dialog generation from within the
@@ -105,33 +125,33 @@
         @type list of str
         """
         super().__init__(parent)
-        
+
         self.fromEric = fromEric
         self.displayMode = displayMode
         self.__webEngine = getWebBrowserSupport() == "QtWebEngine"
         expandedEntries = [] if expandedEntries is None else expandedEntries[:]
-        
+
         self.__setupUi()
-        
+
         self.itmDict = {}
-        
+
         if not fromEric:
             from PluginManager.PluginManager import PluginManager
+
             try:
                 self.pluginManager = ericApp().getObject("PluginManager")
             except KeyError:
                 self.pluginManager = PluginManager(self)
                 ericApp().registerObject("PluginManager", self.pluginManager)
-            
+
             from VirtualEnv.VirtualenvManager import VirtualenvManager
+
             try:
-                self.virtualenvManager = ericApp().getObject(
-                    "VirtualEnvManager")
+                self.virtualenvManager = ericApp().getObject("VirtualEnvManager")
             except KeyError:
                 self.virtualenvManager = VirtualenvManager(self)
-                ericApp().registerObject("VirtualEnvManager",
-                                         self.virtualenvManager)
-        
+                ericApp().registerObject("VirtualEnvManager", self.virtualenvManager)
+
         if displayMode == ConfigurationMode.DEFAULTMODE:
             self.configItems = {
                 # key : [display string, pixmap name, dialog module name or
@@ -140,248 +160,470 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "applicationPage":
-                [self.tr("Application"), "preferences-application",
-                 "ApplicationPage", None, None],
-                "condaPage":
-                [self.tr("Conda"), "miniconda",
-                 "CondaPage", None, None],
-                "cooperationPage":
-                [self.tr("Cooperation"), "preferences-cooperation",
-                 "CooperationPage", None, None],
-                "corbaPage":
-                [self.tr("CORBA"), "preferences-orbit",
-                 "CorbaPage", None, None],
-                "diffPage":
-                [self.tr("Diff"), "diffFiles",
-                 "DiffColoursPage", None, None],
-                "emailPage":
-                [self.tr("Email"), "preferences-mail_generic",
-                 "EmailPage", None, None],
-                "graphicsPage":
-                [self.tr("Graphics"), "preferences-graphics",
-                 "GraphicsPage", None, None],
-                "hexEditorPage":
-                [self.tr("Hex Editor"), "hexEditor",
-                 "HexEditorPage", None, None],
-                "iconsPage":
-                [self.tr("Icons"), "preferences-icons",
-                 "IconsPage", None, None],
-                "ircPage":
-                [self.tr("IRC"), "irc",
-                 "IrcPage", None, None],
-                "logViewerPage":
-                [self.tr("Log-Viewer"), "preferences-logviewer",
-                 "LogViewerPage", None, None],
-                "microPythonPage":
-                [self.tr("MicroPython"), "micropython",
-                 "MicroPythonPage", None, None],
-                "mimeTypesPage":
-                [self.tr("Mimetypes"), "preferences-mimetypes",
-                 "MimeTypesPage", None, None],
-                "networkPage":
-                [self.tr("Network"), "preferences-network",
-                 "NetworkPage", None, None],
-                "notificationsPage":
-                [self.tr("Notifications"),
-                 "preferences-notifications",
-                 "NotificationsPage", None, None],
-                "pipPage":
-                [self.tr("Python Package Management"), "pypi",
-                 "PipPage", None, None],
-                "pluginManagerPage":
-                [self.tr("Plugin Manager"),
-                 "preferences-pluginmanager",
-                 "PluginManagerPage", None, None],
-                "printerPage":
-                [self.tr("Printer"), "preferences-printer",
-                 "PrinterPage", None, None],
-                "protobufPage":
-                [self.tr("Protobuf"), "protobuf",
-                 "ProtobufPage", None, None],
-                "pythonPage":
-                [self.tr("Python"), "preferences-python",
-                 "PythonPage", None, None],
-                "qtPage":
-                [self.tr("Qt"), "preferences-qtlogo",
-                 "QtPage", None, None],
-                "securityPage":
-                [self.tr("Security"), "preferences-security",
-                 "SecurityPage", None, None],
-                "shellPage":
-                [self.tr("Shell"), "preferences-shell",
-                 "ShellPage", None, None],
-                "tasksPage":
-                [self.tr("Tasks"), "task",
-                 "TasksPage", None, None],
-                "templatesPage":
-                [self.tr("Templates"), "preferences-template",
-                 "TemplatesPage", None, None],
-                "trayStarterPage":
-                [self.tr("Tray Starter"), "erict",
-                 "TrayStarterPage", None, None],
-                "vcsPage":
-                [self.tr("Version Control Systems"),
-                 "preferences-vcs",
-                 "VcsPage", None, None],
-                
-                "0debuggerPage":
-                [self.tr("Debugger"), "preferences-debugger",
-                 None, None, None],
-                "debuggerGeneralPage":
-                [self.tr("General"), "preferences-debugger",
-                 "DebuggerGeneralPage", "0debuggerPage", None],
-                "debuggerPython3Page":
-                [self.tr("Python3"), "preferences-pyDebugger",
-                 "DebuggerPython3Page", "0debuggerPage", None],
-                
-                "0editorPage":
-                [self.tr("Editor"), "preferences-editor",
-                 None, None, None],
-                "editorAPIsPage":
-                [self.tr("APIs"), "preferences-api",
-                 "EditorAPIsPage", "0editorPage", None],
-                "editorDocViewerPage":
-                [self.tr("Documentation Viewer"), "codeDocuViewer",
-                 "EditorDocViewerPage", "0editorPage", None],
-                "editorGeneralPage":
-                [self.tr("General"), "preferences-general",
-                 "EditorGeneralPage", "0editorPage", None],
-                "editorFilePage":
-                [self.tr("Filehandling"),
-                 "preferences-filehandling",
-                 "EditorFilePage", "0editorPage", None],
-                "editorSearchPage":
-                [self.tr("Searching"), "preferences-search",
-                 "EditorSearchPage", "0editorPage", None],
-                "editorSpellCheckingPage":
-                [self.tr("Spell checking"),
-                 "preferences-spellchecking",
-                 "EditorSpellCheckingPage", "0editorPage", None],
-                "editorStylesPage":
-                [self.tr("Style"), "preferences-styles",
-                 "EditorStylesPage", "0editorPage", None],
-                "editorSyntaxPage":
-                [self.tr("Code Checkers"), "preferences-debugger",
-                 "EditorSyntaxPage", "0editorPage", None],
-                "editorTypingPage":
-                [self.tr("Typing"), "preferences-typing",
-                 "EditorTypingPage", "0editorPage", None],
-                "editorExportersPage":
-                [self.tr("Exporters"), "preferences-exporters",
-                 "EditorExportersPage", "0editorPage", None],
-                
-                "1editorAutocompletionPage":
-                [self.tr("Autocompletion"),
-                 "preferences-autocompletion",
-                 "EditorAutocompletionPage", "0editorPage", None],
-                "editorAutocompletionQScintillaPage":
-                [self.tr("QScintilla"), "qscintilla",
-                 "EditorAutocompletionQScintillaPage",
-                 "1editorAutocompletionPage", None],
-                "editorAutocompletionJediPage":
-                [self.tr("Jedi"), "jedi",
-                 "EditorAutoCompletionJediPage",
-                 "1editorAutocompletionPage", None],
-                
-                "1editorCalltipsPage":
-                [self.tr("Calltips"), "preferences-calltips",
-                 "EditorCalltipsPage", "0editorPage", None],
-                "editorCalltipsQScintillaPage":
-                [self.tr("QScintilla"), "qscintilla",
-                 "EditorCalltipsQScintillaPage", "1editorCalltipsPage", None],
-                "editorCalltipsJediPage":
-                [self.tr("Jedi"), "jedi",
-                 "EditorCallTipsJediPage", "1editorCalltipsPage", None],
-                
-                "1editorLexerPage":
-                [self.tr("Highlighters"),
-                 "preferences-highlighting-styles",
-                 None, "0editorPage", None],
-                "editorHighlightersPage":
-                [self.tr("Filetype Associations"),
-                 "preferences-highlighter-association",
-                 "EditorHighlightersPage", "1editorLexerPage", None],
-                "editorHighlightingStylesPage":
-                [self.tr("Styles"),
-                 "preferences-highlighting-styles",
-                 "EditorHighlightingStylesPage", "1editorLexerPage", None],
-                "editorKeywordsPage":
-                [self.tr("Keywords"), "preferences-keywords",
-                 "EditorKeywordsPage", "1editorLexerPage", None],
-                "editorPropertiesPage":
-                [self.tr("Properties"), "preferences-properties",
-                 "EditorPropertiesPage", "1editorLexerPage", None],
-                
-                "1editorMouseClickHandlers":
-                [self.tr("Mouse Click Handlers"),
-                 "preferences-mouse-click-handler",
-                 "EditorMouseClickHandlerPage", "0editorPage", None],
-                "editorMouseClickHandlerJediPage":
-                [self.tr("Jedi"), "jedi",
-                 "EditorMouseClickHandlerJediPage",
-                 "1editorMouseClickHandlers", None],
-                
-                "0helpPage":
-                [self.tr("Help"), "preferences-help",
-                 None, None, None],
-                "helpDocumentationPage":
-                [self.tr("Help Documentation"),
-                 "preferences-helpdocumentation",
-                 "HelpDocumentationPage", "0helpPage", None],
-                "helpViewersPage":
-                [self.tr("Help Viewers"),
-                 "preferences-helpviewers",
-                 "HelpViewersPage", "0helpPage", None],
-                
-                "0projectPage":
-                [self.tr("Project"), "preferences-project",
-                 None, None, None],
-                "projectBrowserPage":
-                [self.tr("Project Viewer"), "preferences-project",
-                 "ProjectBrowserPage", "0projectPage", None],
-                "projectPage":
-                [self.tr("Project"), "preferences-project",
-                 "ProjectPage", "0projectPage", None],
-                "multiProjectPage":
-                [self.tr("Multiproject"),
-                 "preferences-multiproject",
-                 "MultiProjectPage", "0projectPage", None],
-                
-                "0interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 None, None, None],
-                "interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 "InterfacePage", "0interfacePage", None],
-                "viewmanagerPage":
-                [self.tr("Viewmanager"), "preferences-viewmanager",
-                 "ViewmanagerPage", "0interfacePage", None],
+                "applicationPage": [
+                    self.tr("Application"),
+                    "preferences-application",
+                    "ApplicationPage",
+                    None,
+                    None,
+                ],
+                "condaPage": [self.tr("Conda"), "miniconda", "CondaPage", None, None],
+                "cooperationPage": [
+                    self.tr("Cooperation"),
+                    "preferences-cooperation",
+                    "CooperationPage",
+                    None,
+                    None,
+                ],
+                "corbaPage": [
+                    self.tr("CORBA"),
+                    "preferences-orbit",
+                    "CorbaPage",
+                    None,
+                    None,
+                ],
+                "diffPage": [
+                    self.tr("Diff"),
+                    "diffFiles",
+                    "DiffColoursPage",
+                    None,
+                    None,
+                ],
+                "emailPage": [
+                    self.tr("Email"),
+                    "preferences-mail_generic",
+                    "EmailPage",
+                    None,
+                    None,
+                ],
+                "graphicsPage": [
+                    self.tr("Graphics"),
+                    "preferences-graphics",
+                    "GraphicsPage",
+                    None,
+                    None,
+                ],
+                "hexEditorPage": [
+                    self.tr("Hex Editor"),
+                    "hexEditor",
+                    "HexEditorPage",
+                    None,
+                    None,
+                ],
+                "iconsPage": [
+                    self.tr("Icons"),
+                    "preferences-icons",
+                    "IconsPage",
+                    None,
+                    None,
+                ],
+                "ircPage": [self.tr("IRC"), "irc", "IrcPage", None, None],
+                "logViewerPage": [
+                    self.tr("Log-Viewer"),
+                    "preferences-logviewer",
+                    "LogViewerPage",
+                    None,
+                    None,
+                ],
+                "microPythonPage": [
+                    self.tr("MicroPython"),
+                    "micropython",
+                    "MicroPythonPage",
+                    None,
+                    None,
+                ],
+                "mimeTypesPage": [
+                    self.tr("Mimetypes"),
+                    "preferences-mimetypes",
+                    "MimeTypesPage",
+                    None,
+                    None,
+                ],
+                "networkPage": [
+                    self.tr("Network"),
+                    "preferences-network",
+                    "NetworkPage",
+                    None,
+                    None,
+                ],
+                "notificationsPage": [
+                    self.tr("Notifications"),
+                    "preferences-notifications",
+                    "NotificationsPage",
+                    None,
+                    None,
+                ],
+                "pipPage": [
+                    self.tr("Python Package Management"),
+                    "pypi",
+                    "PipPage",
+                    None,
+                    None,
+                ],
+                "pluginManagerPage": [
+                    self.tr("Plugin Manager"),
+                    "preferences-pluginmanager",
+                    "PluginManagerPage",
+                    None,
+                    None,
+                ],
+                "printerPage": [
+                    self.tr("Printer"),
+                    "preferences-printer",
+                    "PrinterPage",
+                    None,
+                    None,
+                ],
+                "protobufPage": [
+                    self.tr("Protobuf"),
+                    "protobuf",
+                    "ProtobufPage",
+                    None,
+                    None,
+                ],
+                "pythonPage": [
+                    self.tr("Python"),
+                    "preferences-python",
+                    "PythonPage",
+                    None,
+                    None,
+                ],
+                "qtPage": [self.tr("Qt"), "preferences-qtlogo", "QtPage", None, None],
+                "securityPage": [
+                    self.tr("Security"),
+                    "preferences-security",
+                    "SecurityPage",
+                    None,
+                    None,
+                ],
+                "shellPage": [
+                    self.tr("Shell"),
+                    "preferences-shell",
+                    "ShellPage",
+                    None,
+                    None,
+                ],
+                "tasksPage": [self.tr("Tasks"), "task", "TasksPage", None, None],
+                "templatesPage": [
+                    self.tr("Templates"),
+                    "preferences-template",
+                    "TemplatesPage",
+                    None,
+                    None,
+                ],
+                "trayStarterPage": [
+                    self.tr("Tray Starter"),
+                    "erict",
+                    "TrayStarterPage",
+                    None,
+                    None,
+                ],
+                "vcsPage": [
+                    self.tr("Version Control Systems"),
+                    "preferences-vcs",
+                    "VcsPage",
+                    None,
+                    None,
+                ],
+                "0debuggerPage": [
+                    self.tr("Debugger"),
+                    "preferences-debugger",
+                    None,
+                    None,
+                    None,
+                ],
+                "debuggerGeneralPage": [
+                    self.tr("General"),
+                    "preferences-debugger",
+                    "DebuggerGeneralPage",
+                    "0debuggerPage",
+                    None,
+                ],
+                "debuggerPython3Page": [
+                    self.tr("Python3"),
+                    "preferences-pyDebugger",
+                    "DebuggerPython3Page",
+                    "0debuggerPage",
+                    None,
+                ],
+                "0editorPage": [
+                    self.tr("Editor"),
+                    "preferences-editor",
+                    None,
+                    None,
+                    None,
+                ],
+                "editorAPIsPage": [
+                    self.tr("APIs"),
+                    "preferences-api",
+                    "EditorAPIsPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorDocViewerPage": [
+                    self.tr("Documentation Viewer"),
+                    "codeDocuViewer",
+                    "EditorDocViewerPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorGeneralPage": [
+                    self.tr("General"),
+                    "preferences-general",
+                    "EditorGeneralPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorFilePage": [
+                    self.tr("Filehandling"),
+                    "preferences-filehandling",
+                    "EditorFilePage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorSearchPage": [
+                    self.tr("Searching"),
+                    "preferences-search",
+                    "EditorSearchPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorSpellCheckingPage": [
+                    self.tr("Spell checking"),
+                    "preferences-spellchecking",
+                    "EditorSpellCheckingPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorStylesPage": [
+                    self.tr("Style"),
+                    "preferences-styles",
+                    "EditorStylesPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorSyntaxPage": [
+                    self.tr("Code Checkers"),
+                    "preferences-debugger",
+                    "EditorSyntaxPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorTypingPage": [
+                    self.tr("Typing"),
+                    "preferences-typing",
+                    "EditorTypingPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorExportersPage": [
+                    self.tr("Exporters"),
+                    "preferences-exporters",
+                    "EditorExportersPage",
+                    "0editorPage",
+                    None,
+                ],
+                "1editorAutocompletionPage": [
+                    self.tr("Autocompletion"),
+                    "preferences-autocompletion",
+                    "EditorAutocompletionPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorAutocompletionQScintillaPage": [
+                    self.tr("QScintilla"),
+                    "qscintilla",
+                    "EditorAutocompletionQScintillaPage",
+                    "1editorAutocompletionPage",
+                    None,
+                ],
+                "editorAutocompletionJediPage": [
+                    self.tr("Jedi"),
+                    "jedi",
+                    "EditorAutoCompletionJediPage",
+                    "1editorAutocompletionPage",
+                    None,
+                ],
+                "1editorCalltipsPage": [
+                    self.tr("Calltips"),
+                    "preferences-calltips",
+                    "EditorCalltipsPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorCalltipsQScintillaPage": [
+                    self.tr("QScintilla"),
+                    "qscintilla",
+                    "EditorCalltipsQScintillaPage",
+                    "1editorCalltipsPage",
+                    None,
+                ],
+                "editorCalltipsJediPage": [
+                    self.tr("Jedi"),
+                    "jedi",
+                    "EditorCallTipsJediPage",
+                    "1editorCalltipsPage",
+                    None,
+                ],
+                "1editorLexerPage": [
+                    self.tr("Highlighters"),
+                    "preferences-highlighting-styles",
+                    None,
+                    "0editorPage",
+                    None,
+                ],
+                "editorHighlightersPage": [
+                    self.tr("Filetype Associations"),
+                    "preferences-highlighter-association",
+                    "EditorHighlightersPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorHighlightingStylesPage": [
+                    self.tr("Styles"),
+                    "preferences-highlighting-styles",
+                    "EditorHighlightingStylesPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorKeywordsPage": [
+                    self.tr("Keywords"),
+                    "preferences-keywords",
+                    "EditorKeywordsPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorPropertiesPage": [
+                    self.tr("Properties"),
+                    "preferences-properties",
+                    "EditorPropertiesPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "1editorMouseClickHandlers": [
+                    self.tr("Mouse Click Handlers"),
+                    "preferences-mouse-click-handler",
+                    "EditorMouseClickHandlerPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorMouseClickHandlerJediPage": [
+                    self.tr("Jedi"),
+                    "jedi",
+                    "EditorMouseClickHandlerJediPage",
+                    "1editorMouseClickHandlers",
+                    None,
+                ],
+                "0helpPage": [self.tr("Help"), "preferences-help", None, None, None],
+                "helpDocumentationPage": [
+                    self.tr("Help Documentation"),
+                    "preferences-helpdocumentation",
+                    "HelpDocumentationPage",
+                    "0helpPage",
+                    None,
+                ],
+                "helpViewersPage": [
+                    self.tr("Help Viewers"),
+                    "preferences-helpviewers",
+                    "HelpViewersPage",
+                    "0helpPage",
+                    None,
+                ],
+                "0projectPage": [
+                    self.tr("Project"),
+                    "preferences-project",
+                    None,
+                    None,
+                    None,
+                ],
+                "projectBrowserPage": [
+                    self.tr("Project Viewer"),
+                    "preferences-project",
+                    "ProjectBrowserPage",
+                    "0projectPage",
+                    None,
+                ],
+                "projectPage": [
+                    self.tr("Project"),
+                    "preferences-project",
+                    "ProjectPage",
+                    "0projectPage",
+                    None,
+                ],
+                "multiProjectPage": [
+                    self.tr("Multiproject"),
+                    "preferences-multiproject",
+                    "MultiProjectPage",
+                    "0projectPage",
+                    None,
+                ],
+                "0interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    None,
+                    None,
+                    None,
+                ],
+                "interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    "InterfacePage",
+                    "0interfacePage",
+                    None,
+                ],
+                "viewmanagerPage": [
+                    self.tr("Viewmanager"),
+                    "preferences-viewmanager",
+                    "ViewmanagerPage",
+                    "0interfacePage",
+                    None,
+                ],
             }
             if self.__webEngine:
-                self.configItems.update({
-                    "0webBrowserPage":
-                    [self.tr("Web Browser"), "ericWeb",
-                     None, None, None],
-                    "webBrowserAppearancePage":
-                    [self.tr("Appearance"), "preferences-styles",
-                     "WebBrowserAppearancePage", "0webBrowserPage", None],
-                    "webBrowserPage":
-                    [self.tr("eric Web Browser"), "ericWeb",
-                     "WebBrowserPage", "0webBrowserPage", None],
-                    "webBrowserVirusTotalPage":
-                    [self.tr("VirusTotal Interface"), "virustotal",
-                     "WebBrowserVirusTotalPage", "0webBrowserPage", None],
-                    "webBrowserSpellCheckingPage":
-                    [self.tr("Spell checking"),
-                     "preferences-spellchecking",
-                     "WebBrowserSpellCheckingPage", "0webBrowserPage",
-                     None],
-                })
-            
+                self.configItems.update(
+                    {
+                        "0webBrowserPage": [
+                            self.tr("Web Browser"),
+                            "ericWeb",
+                            None,
+                            None,
+                            None,
+                        ],
+                        "webBrowserAppearancePage": [
+                            self.tr("Appearance"),
+                            "preferences-styles",
+                            "WebBrowserAppearancePage",
+                            "0webBrowserPage",
+                            None,
+                        ],
+                        "webBrowserPage": [
+                            self.tr("eric Web Browser"),
+                            "ericWeb",
+                            "WebBrowserPage",
+                            "0webBrowserPage",
+                            None,
+                        ],
+                        "webBrowserVirusTotalPage": [
+                            self.tr("VirusTotal Interface"),
+                            "virustotal",
+                            "WebBrowserVirusTotalPage",
+                            "0webBrowserPage",
+                            None,
+                        ],
+                        "webBrowserSpellCheckingPage": [
+                            self.tr("Spell checking"),
+                            "preferences-spellchecking",
+                            "WebBrowserSpellCheckingPage",
+                            "0webBrowserPage",
+                            None,
+                        ],
+                    }
+                )
+
             self.configItems.update(
-                ericApp().getObject("PluginManager").getPluginConfigData())
-        
+                ericApp().getObject("PluginManager").getPluginConfigData()
+            )
+
         elif displayMode == ConfigurationMode.EDITORMODE:
             self.configItems = {
                 # key : [display string, pixmap name, dialog module name or
@@ -390,60 +632,113 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "iconsPage":
-                [self.tr("Icons"), "preferences-icons",
-                 "IconsPage", None, None],
-                "interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 "InterfaceLightPage", None, None],
-                "printerPage":
-                [self.tr("Printer"), "preferences-printer",
-                 "PrinterPage", None, None],
-                
-                "0editorPage":
-                [self.tr("Editor"), "preferences-editor",
-                 None, None, None],
-                "editorGeneralPage":
-                [self.tr("General"), "preferences-general",
-                 "EditorGeneralPage", "0editorPage", None],
-                "editorFilePage":
-                [self.tr("Filehandling"),
-                 "preferences-filehandling",
-                 "EditorFilePage", "0editorPage", None],
-                "editorSearchPage":
-                [self.tr("Searching"), "preferences-search",
-                 "EditorSearchPage", "0editorPage", None],
-                "editorSpellCheckingPage":
-                [self.tr("Spell checking"),
-                 "preferences-spellchecking",
-                 "EditorSpellCheckingPage", "0editorPage", None],
-                "editorStylesPage":
-                [self.tr("Style"), "preferences-styles",
-                 "EditorStylesPage", "0editorPage", None],
-                "editorTypingPage":
-                [self.tr("Typing"), "preferences-typing",
-                 "EditorTypingPage", "0editorPage", None],
-                
-                "1editorLexerPage":
-                [self.tr("Highlighters"),
-                 "preferences-highlighting-styles",
-                 None, "0editorPage", None],
-                "editorHighlightersPage":
-                [self.tr("Filetype Associations"),
-                 "preferences-highlighter-association",
-                 "EditorHighlightersPage", "1editorLexerPage", None],
-                "editorHighlightingStylesPage":
-                [self.tr("Styles"),
-                 "preferences-highlighting-styles",
-                 "EditorHighlightingStylesPage", "1editorLexerPage", None],
-                "editorKeywordsPage":
-                [self.tr("Keywords"), "preferences-keywords",
-                 "EditorKeywordsPage", "1editorLexerPage", None],
-                "editorPropertiesPage":
-                [self.tr("Properties"), "preferences-properties",
-                 "EditorPropertiesPage", "1editorLexerPage", None],
+                "iconsPage": [
+                    self.tr("Icons"),
+                    "preferences-icons",
+                    "IconsPage",
+                    None,
+                    None,
+                ],
+                "interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    "InterfaceLightPage",
+                    None,
+                    None,
+                ],
+                "printerPage": [
+                    self.tr("Printer"),
+                    "preferences-printer",
+                    "PrinterPage",
+                    None,
+                    None,
+                ],
+                "0editorPage": [
+                    self.tr("Editor"),
+                    "preferences-editor",
+                    None,
+                    None,
+                    None,
+                ],
+                "editorGeneralPage": [
+                    self.tr("General"),
+                    "preferences-general",
+                    "EditorGeneralPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorFilePage": [
+                    self.tr("Filehandling"),
+                    "preferences-filehandling",
+                    "EditorFilePage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorSearchPage": [
+                    self.tr("Searching"),
+                    "preferences-search",
+                    "EditorSearchPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorSpellCheckingPage": [
+                    self.tr("Spell checking"),
+                    "preferences-spellchecking",
+                    "EditorSpellCheckingPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorStylesPage": [
+                    self.tr("Style"),
+                    "preferences-styles",
+                    "EditorStylesPage",
+                    "0editorPage",
+                    None,
+                ],
+                "editorTypingPage": [
+                    self.tr("Typing"),
+                    "preferences-typing",
+                    "EditorTypingPage",
+                    "0editorPage",
+                    None,
+                ],
+                "1editorLexerPage": [
+                    self.tr("Highlighters"),
+                    "preferences-highlighting-styles",
+                    None,
+                    "0editorPage",
+                    None,
+                ],
+                "editorHighlightersPage": [
+                    self.tr("Filetype Associations"),
+                    "preferences-highlighter-association",
+                    "EditorHighlightersPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorHighlightingStylesPage": [
+                    self.tr("Styles"),
+                    "preferences-highlighting-styles",
+                    "EditorHighlightingStylesPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorKeywordsPage": [
+                    self.tr("Keywords"),
+                    "preferences-keywords",
+                    "EditorKeywordsPage",
+                    "1editorLexerPage",
+                    None,
+                ],
+                "editorPropertiesPage": [
+                    self.tr("Properties"),
+                    "preferences-properties",
+                    "EditorPropertiesPage",
+                    "1editorLexerPage",
+                    None,
+                ],
             }
-        
+
         elif displayMode == ConfigurationMode.WEBBROWSERMODE:
             self.configItems = {
                 # key : [display string, pixmap name, dialog module name or
@@ -452,44 +747,78 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "iconsPage":
-                [self.tr("Icons"), "preferences-icons",
-                 "IconsPage", None, None],
-                "interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 "InterfaceLightPage", None, None],
-                "networkPage":
-                [self.tr("Network"), "preferences-network",
-                 "NetworkPage", None, None],
-                "printerPage":
-                [self.tr("Printer"), "preferences-printer",
-                 "PrinterPage", None, None],
-                "securityPage":
-                [self.tr("Security"), "preferences-security",
-                 "SecurityPage", None, None],
-                
-                "helpDocumentationPage":
-                [self.tr("Help Documentation"),
-                 "preferences-helpdocumentation",
-                 "HelpDocumentationPage", None, None],
-                
-                "webBrowserAppearancePage":
-                [self.tr("Appearance"), "preferences-styles",
-                 "WebBrowserAppearancePage", None, None],
-                "webBrowserPage":
-                [self.tr("eric Web Browser"), "ericWeb",
-                 "WebBrowserPage", None, None],
-                
-                "webBrowserVirusTotalPage":
-                [self.tr("VirusTotal Interface"), "virustotal",
-                 "WebBrowserVirusTotalPage", None, None],
-                
-                "webBrowserSpellCheckingPage":
-                [self.tr("Spell checking"),
-                 "preferences-spellchecking",
-                 "WebBrowserSpellCheckingPage", None, None],
+                "iconsPage": [
+                    self.tr("Icons"),
+                    "preferences-icons",
+                    "IconsPage",
+                    None,
+                    None,
+                ],
+                "interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    "InterfaceLightPage",
+                    None,
+                    None,
+                ],
+                "networkPage": [
+                    self.tr("Network"),
+                    "preferences-network",
+                    "NetworkPage",
+                    None,
+                    None,
+                ],
+                "printerPage": [
+                    self.tr("Printer"),
+                    "preferences-printer",
+                    "PrinterPage",
+                    None,
+                    None,
+                ],
+                "securityPage": [
+                    self.tr("Security"),
+                    "preferences-security",
+                    "SecurityPage",
+                    None,
+                    None,
+                ],
+                "helpDocumentationPage": [
+                    self.tr("Help Documentation"),
+                    "preferences-helpdocumentation",
+                    "HelpDocumentationPage",
+                    None,
+                    None,
+                ],
+                "webBrowserAppearancePage": [
+                    self.tr("Appearance"),
+                    "preferences-styles",
+                    "WebBrowserAppearancePage",
+                    None,
+                    None,
+                ],
+                "webBrowserPage": [
+                    self.tr("eric Web Browser"),
+                    "ericWeb",
+                    "WebBrowserPage",
+                    None,
+                    None,
+                ],
+                "webBrowserVirusTotalPage": [
+                    self.tr("VirusTotal Interface"),
+                    "virustotal",
+                    "WebBrowserVirusTotalPage",
+                    None,
+                    None,
+                ],
+                "webBrowserSpellCheckingPage": [
+                    self.tr("Spell checking"),
+                    "preferences-spellchecking",
+                    "WebBrowserSpellCheckingPage",
+                    None,
+                    None,
+                ],
             }
-        
+
         elif displayMode == ConfigurationMode.TRAYSTARTERMODE:
             self.configItems = {
                 # key : [display string, pixmap name, dialog module name or
@@ -498,11 +827,15 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "trayStarterPage":
-                [self.tr("Tray Starter"), "erict",
-                 "TrayStarterPage", None, None],
+                "trayStarterPage": [
+                    self.tr("Tray Starter"),
+                    "erict",
+                    "TrayStarterPage",
+                    None,
+                    None,
+                ],
             }
-        
+
         elif displayMode == ConfigurationMode.HEXEDITORMODE:
             self.configItems = {
                 # key : [display string, pixmap name, dialog module name or
@@ -511,17 +844,29 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "iconsPage":
-                [self.tr("Icons"), "preferences-icons",
-                 "IconsPage", None, None],
-                "interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 "InterfaceLightPage", None, None],
-                "hexEditorPage":
-                [self.tr("Hex Editor"), "hexEditor",
-                 "HexEditorPage", None, None],
+                "iconsPage": [
+                    self.tr("Icons"),
+                    "preferences-icons",
+                    "IconsPage",
+                    None,
+                    None,
+                ],
+                "interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    "InterfaceLightPage",
+                    None,
+                    None,
+                ],
+                "hexEditorPage": [
+                    self.tr("Hex Editor"),
+                    "hexEditor",
+                    "HexEditorPage",
+                    None,
+                    None,
+                ],
             }
-        
+
         else:
             # display mode for generic use
             self.configItems = {
@@ -531,14 +876,22 @@
                 # The dialog module must have the module function 'create' to
                 # create the configuration page. This must have the method
                 # 'save' to save the settings.
-                "iconsPage":
-                [self.tr("Icons"), "preferences-icons",
-                 "IconsPage", None, None],
-                "interfacePage":
-                [self.tr("Interface"), "preferences-interface",
-                 "InterfaceLightPage", None, None],
+                "iconsPage": [
+                    self.tr("Icons"),
+                    "preferences-icons",
+                    "IconsPage",
+                    None,
+                    None,
+                ],
+                "interfacePage": [
+                    self.tr("Interface"),
+                    "preferences-interface",
+                    "InterfaceLightPage",
+                    None,
+                    None,
+                ],
             }
-        
+
         # generate the list entries
         self.__expandedEntries = []
         for key in sorted(self.configItems.keys()):
@@ -550,35 +903,40 @@
                     continue
             else:
                 pitm = self.configList
-            self.itmDict[key] = ConfigurationPageItem(pitm, pageData[0], key,
-                                                      pageData[1])
+            self.itmDict[key] = ConfigurationPageItem(
+                pitm, pageData[0], key, pageData[1]
+            )
             self.itmDict[key].setData(0, Qt.ItemDataRole.UserRole, key)
             if (
-                not self.fromEric or
-                displayMode != ConfigurationMode.DEFAULTMODE or
-                key in expandedEntries
+                not self.fromEric
+                or displayMode != ConfigurationMode.DEFAULTMODE
+                or key in expandedEntries
             ):
                 self.itmDict[key].setExpanded(True)
         self.configList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
         # set the initial size of the splitter
         self.configSplitter.setSizes([200, 600])
         self.configSplitter.splitterMoved.connect(self.__resizeConfigStack)
-        
+
         self.configList.itemActivated.connect(self.__showConfigurationPage)
         self.configList.itemClicked.connect(self.__showConfigurationPage)
         self.buttonBox.accepted.connect(self.accept)
         self.buttonBox.rejected.connect(self.rejected)
-        
-        if displayMode in [ConfigurationMode.TRAYSTARTERMODE,
-                           ConfigurationMode.HEXEDITORMODE,
-                           ConfigurationMode.WEBBROWSERMODE]:
+
+        if displayMode in [
+            ConfigurationMode.TRAYSTARTERMODE,
+            ConfigurationMode.HEXEDITORMODE,
+            ConfigurationMode.WEBBROWSERMODE,
+        ]:
             self.configListSearch.hide()
-        
-        if displayMode not in [ConfigurationMode.TRAYSTARTERMODE,
-                               ConfigurationMode.HEXEDITORMODE]:
+
+        if displayMode not in [
+            ConfigurationMode.TRAYSTARTERMODE,
+            ConfigurationMode.HEXEDITORMODE,
+        ]:
             self.__initLexers()
-        
+
     def accept(self):
         """
         Public slot to accept the buttonBox accept signal.
@@ -587,9 +945,9 @@
             wdg = self.focusWidget()
             if wdg == self.configList:
                 return
-        
+
         self.accepted.emit()
-        
+
     def __setupUi(self):
         """
         Private method to perform the general setup of the configuration
@@ -601,19 +959,18 @@
         self.verticalLayout_2.setSpacing(6)
         self.verticalLayout_2.setContentsMargins(6, 6, 6, 6)
         self.verticalLayout_2.setObjectName("verticalLayout_2")
-        
+
         self.configSplitter = QSplitter(self)
         self.configSplitter.setOrientation(Qt.Orientation.Horizontal)
         self.configSplitter.setObjectName("configSplitter")
-        
+
         self.configListWidget = QWidget(self.configSplitter)
         self.leftVBoxLayout = QVBoxLayout(self.configListWidget)
         self.leftVBoxLayout.setContentsMargins(0, 0, 0, 0)
         self.leftVBoxLayout.setSpacing(0)
         self.leftVBoxLayout.setObjectName("leftVBoxLayout")
         self.configListSearch = QLineEdit(self)
-        self.configListSearch.setPlaceholderText(
-            self.tr("Enter search text..."))
+        self.configListSearch.setPlaceholderText(self.tr("Enter search text..."))
         self.configListSearch.setClearButtonEnabled(True)
         self.configListSearch.setObjectName("configListSearch")
         self.configListSearch.setClearButtonEnabled(True)
@@ -622,24 +979,25 @@
         self.configList.setObjectName("configList")
         self.leftVBoxLayout.addWidget(self.configList)
         self.configListSearch.textChanged.connect(self.__searchTextChanged)
-        
+
         self.scrollArea = QScrollArea(self.configSplitter)
         self.scrollArea.setFrameShape(QFrame.Shape.NoFrame)
-        self.scrollArea.setVerticalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
+        self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
         self.scrollArea.setHorizontalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOn)
+            Qt.ScrollBarPolicy.ScrollBarAlwaysOn
+        )
         self.scrollArea.setWidgetResizable(False)
         self.scrollArea.setSizeAdjustPolicy(
-            QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents)
+            QAbstractScrollArea.SizeAdjustPolicy.AdjustToContents
+        )
         self.scrollArea.setObjectName("scrollArea")
-        
+
         self.configStack = QStackedWidget()
         self.configStack.setFrameShape(QFrame.Shape.Box)
         self.configStack.setFrameShadow(QFrame.Shadow.Sunken)
         self.configStack.setObjectName("configStack")
         self.scrollArea.setWidget(self.configStack)
-        
+
         self.emptyPage = QWidget()
         self.emptyPage.setGeometry(QRect(0, 0, 372, 591))
         self.emptyPage.setObjectName("emptyPage")
@@ -648,74 +1006,74 @@
         self.vboxlayout.setContentsMargins(6, 6, 6, 6)
         self.vboxlayout.setObjectName("vboxlayout")
         spacerItem = QSpacerItem(
-            20, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+            20, 20, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.vboxlayout.addItem(spacerItem)
         self.emptyPagePixmap = QLabel(self.emptyPage)
         self.emptyPagePixmap.setAlignment(Qt.AlignmentFlag.AlignCenter)
         self.emptyPagePixmap.setObjectName("emptyPagePixmap")
         self.emptyPagePixmap.setPixmap(
-            QPixmap(os.path.join(getConfig('ericPixDir'), 'eric.png')))
+            QPixmap(os.path.join(getConfig("ericPixDir"), "eric.png"))
+        )
         self.vboxlayout.addWidget(self.emptyPagePixmap)
         self.textLabel1 = QLabel(self.emptyPage)
         self.textLabel1.setAlignment(Qt.AlignmentFlag.AlignCenter)
         self.textLabel1.setObjectName("textLabel1")
         self.vboxlayout.addWidget(self.textLabel1)
         spacerItem1 = QSpacerItem(
-            20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+            20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.vboxlayout.addItem(spacerItem1)
         self.configStack.addWidget(self.emptyPage)
-        
+
         self.verticalLayout_2.addWidget(self.configSplitter)
-        
+
         self.buttonBox = QDialogButtonBox(self)
         self.buttonBox.setOrientation(Qt.Orientation.Horizontal)
         self.buttonBox.setStandardButtons(
-            QDialogButtonBox.StandardButton.Apply |
-            QDialogButtonBox.StandardButton.Cancel |
-            QDialogButtonBox.StandardButton.Ok |
-            QDialogButtonBox.StandardButton.Reset
+            QDialogButtonBox.StandardButton.Apply
+            | QDialogButtonBox.StandardButton.Cancel
+            | QDialogButtonBox.StandardButton.Ok
+            | QDialogButtonBox.StandardButton.Reset
         )
         self.buttonBox.setObjectName("buttonBox")
-        if (
-            not self.fromEric and
-            self.displayMode == ConfigurationMode.DEFAULTMODE
-        ):
+        if not self.fromEric and self.displayMode == ConfigurationMode.DEFAULTMODE:
             self.buttonBox.button(QDialogButtonBox.StandardButton.Apply).hide()
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Apply).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Reset).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Apply).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Reset).setEnabled(False)
         self.verticalLayout_2.addWidget(self.buttonBox)
 
         self.setWindowTitle(self.tr("Preferences"))
-        
+
         self.configList.header().hide()
-        self.configList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
+        self.configList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         self.configList.setSortingEnabled(True)
         self.textLabel1.setText(
-            self.tr("Please select an entry of the list \n"
-                    "to display the configuration page."))
-        
+            self.tr(
+                "Please select an entry of the list \n"
+                "to display the configuration page."
+            )
+        )
+
         QMetaObject.connectSlotsByName(self)
         self.setTabOrder(self.configList, self.configStack)
-        
+
         self.configStack.setCurrentWidget(self.emptyPage)
-        
+
         self.configList.setFocus()
-    
+
     def __searchTextChanged(self, text):
         """
         Private slot to handle a change of the search text.
-        
+
         @param text text to search for (string)
         """
         self.__searchChildItems(self.configList.invisibleRootItem(), text)
-    
+
     def __searchChildItems(self, parent, text):
         """
         Private method to enable child items based on a search string.
-        
+
         @param parent reference to the parent item (QTreeWidgetItem)
         @param text text to search for (string)
         @return flag indicating an enabled child item (boolean)
@@ -725,44 +1083,44 @@
         for index in range(parent.childCount()):
             itm = parent.child(index)
             enable = (
-                (self.__searchChildItems(itm, text) or
-                 text == "" or
-                 text in itm.text(0).lower())
-                if itm.childCount() > 0 else
-                (text == "" or text in itm.text(0).lower())
+                (
+                    self.__searchChildItems(itm, text)
+                    or text == ""
+                    or text in itm.text(0).lower()
+                )
+                if itm.childCount() > 0
+                else (text == "" or text in itm.text(0).lower())
             )
             if enable:
                 childEnabled = True
             itm.setDisabled(not enable)
-        
+
         return childEnabled
-    
+
     def __initLexers(self):
         """
         Private method to initialize the dictionary of preferences lexers.
         """
         import QScintilla.Lexers
-        from .PreferencesLexer import (
-            PreferencesLexer, PreferencesLexerLanguageError
-        )
-        
+        from .PreferencesLexer import PreferencesLexer, PreferencesLexerLanguageError
+
         self.lexers = {}
         for language in QScintilla.Lexers.getSupportedLanguages():
             if language not in self.lexers:
                 with contextlib.suppress(PreferencesLexerLanguageError):
                     self.lexers[language] = PreferencesLexer(language, self)
-        
+
     def __importConfigurationPage(self, name):
         """
         Private method to import a configuration page module.
-        
+
         @param name name of the configuration page module (string)
         @return reference to the configuration page module
         """
         modName = "Preferences.ConfigurationPages.{0}".format(name)
         try:
             mod = __import__(modName)
-            components = modName.split('.')
+            components = modName.split(".")
             for comp in components[1:]:
                 mod = getattr(mod, comp)
             return mod
@@ -770,24 +1128,27 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Configuration Page Error"),
-                self.tr("""<p>The configuration page <b>{0}</b>"""
-                        """ could not be loaded.</p>""").format(name))
+                self.tr(
+                    """<p>The configuration page <b>{0}</b>"""
+                    """ could not be loaded.</p>"""
+                ).format(name),
+            )
             return None
-        
+
     def __showConfigurationPage(self, itm, column):
         """
         Private slot to show a selected configuration page.
-        
+
         @param itm reference to the selected item (QTreeWidgetItem)
         @param column column that was selected (integer) (ignored)
         """
         pageName = itm.getPageName()
         self.showConfigurationPageByName(pageName, setCurrent=False)
-        
+
     def __initPage(self, pageData):
         """
         Private method to initialize a configuration page.
-        
+
         @param pageData data structure for the page to initialize
         @return reference to the initialized page
         """
@@ -804,11 +1165,11 @@
             with contextlib.suppress(AttributeError):
                 page.setMode(self.displayMode)
         return page
-        
+
     def showConfigurationPageByName(self, pageName, setCurrent=True):
         """
         Public slot to show a named configuration page.
-        
+
         @param pageName name of the configuration page to show (string)
         @param setCurrent flag indicating to set the current item (boolean)
         """
@@ -826,43 +1187,49 @@
             elif setCurrent:
                 items = self.configList.findItems(
                     pageData[0],
-                    Qt.MatchFlag.MatchFixedString |
-                    Qt.MatchFlag.MatchRecursive)
+                    Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchRecursive,
+                )
                 for item in items:
                     if item.data(0, Qt.ItemDataRole.UserRole) == pageName:
                         self.configList.setCurrentItem(item)
         self.configStack.setCurrentWidget(page)
         self.__resizeConfigStack()
-        
+
         if page != self.emptyPage:
             page.polishPage()
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Apply).setEnabled(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Reset).setEnabled(True)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Apply).setEnabled(
+                True
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Reset).setEnabled(
+                True
+            )
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Apply).setEnabled(False)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Reset).setEnabled(False)
-        
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Apply).setEnabled(
+                False
+            )
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Reset).setEnabled(
+                False
+            )
+
         # reset scrollbars
-        for sb in [self.scrollArea.horizontalScrollBar(),
-                   self.scrollArea.verticalScrollBar()]:
+        for sb in [
+            self.scrollArea.horizontalScrollBar(),
+            self.scrollArea.verticalScrollBar(),
+        ]:
             if sb:
                 sb.setValue(0)
-        
+
         self.__currentConfigurationPageName = pageName
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle the resizing of the widget.
-        
+
         @param evt reference to the event object
         @type QResizeEvent
         """
         self.__resizeConfigStack()
-    
+
     def __resizeConfigStack(self):
         """
         Private method to resize the stack of configuration pages.
@@ -870,50 +1237,51 @@
         ssize = self.scrollArea.size()
         if self.scrollArea.horizontalScrollBar():
             ssize.setHeight(
-                ssize.height() -
-                self.scrollArea.horizontalScrollBar().height() - 2)
+                ssize.height() - self.scrollArea.horizontalScrollBar().height() - 2
+            )
         if self.scrollArea.verticalScrollBar():
             ssize.setWidth(
-                ssize.width() -
-                self.scrollArea.verticalScrollBar().width() - 2)
+                ssize.width() - self.scrollArea.verticalScrollBar().width() - 2
+            )
         psize = self.configStack.currentWidget().minimumSizeHint()
-        self.configStack.resize(max(ssize.width(), psize.width()),
-                                max(ssize.height(), psize.height()))
-    
+        self.configStack.resize(
+            max(ssize.width(), psize.width()), max(ssize.height(), psize.height())
+        )
+
     def getConfigurationPageName(self):
         """
         Public method to get the page name of the current page.
-        
+
         @return page name of the current page (string)
         """
         return self.__currentConfigurationPageName
-        
+
     def calledFromEric(self):
         """
         Public method to check, if invoked from within eric.
-        
+
         @return flag indicating invocation from within eric (boolean)
         """
         return self.fromEric
-        
+
     def getPage(self, pageName):
         """
         Public method to get a reference to the named page.
-        
+
         @param pageName name of the configuration page (string)
         @return reference to the page or None, indicating page was
             not loaded yet
         """
         return self.configItems[pageName][-1]
-        
+
     def getLexers(self):
         """
         Public method to get a reference to the lexers dictionary.
-        
+
         @return reference to the lexers dictionary
         """
         return self.lexers
-        
+
     def setPreferences(self):
         """
         Public method called to store the selected values into the preferences
@@ -925,24 +1293,20 @@
                 pageData[-1].save()
                 # page was loaded (and possibly modified)
                 if time.monotonic() - now > 0.01:
-                    QApplication.processEvents()    # ensure HMI is responsive
+                    QApplication.processEvents()  # ensure HMI is responsive
                     now = time.monotonic()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Apply
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Apply):
             self.on_applyButton_clicked()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Reset
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Reset):
             self.on_resetButton_clicked()
-        
+
     @pyqtSlot()
     def on_applyButton_clicked(self):
         """
@@ -956,7 +1320,7 @@
             if savedState is not None:
                 page.setState(savedState)
             page.polishPage()
-        
+
     @pyqtSlot()
     def on_resetButton_clicked(self):
         """
@@ -970,72 +1334,75 @@
             if pageName == "editorHighlightingStylesPage":
                 self.__initLexers()
             self.configItems[pageName][-1] = None
-            
+
             self.showConfigurationPageByName(pageName)
             if savedState is not None:
                 self.configStack.currentWidget().setState(savedState)
-        
+
     def getExpandedEntries(self):
         """
         Public method to get a list of expanded entries.
-        
+
         @return list of expanded entries (list of string)
         """
         return self.__expandedEntries
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_configList_itemCollapsed(self, item):
         """
         Private slot handling a list entry being collapsed.
-        
+
         @param item reference to the collapsed item (QTreeWidgetItem)
         """
         pageName = item.data(0, Qt.ItemDataRole.UserRole)
         if pageName in self.__expandedEntries:
             self.__expandedEntries.remove(pageName)
-    
+
     @pyqtSlot(QTreeWidgetItem)
     def on_configList_itemExpanded(self, item):
         """
         Private slot handling a list entry being expanded.
-        
+
         @param item reference to the expanded item (QTreeWidgetItem)
         """
         pageName = item.data(0, Qt.ItemDataRole.UserRole)
         if pageName not in self.__expandedEntries:
             self.__expandedEntries.append(pageName)
-    
+
     def isUsingWebEngine(self):
         """
         Public method to get an indication, if QtWebEngine is being used.
-        
+
         @return flag indicating the use of QtWebEngine
         @rtype bool
         """
-        return (
-            self.__webEngine or
-            self.displayMode == ConfigurationMode.WEBBROWSERMODE
-        )
+        return self.__webEngine or self.displayMode == ConfigurationMode.WEBBROWSERMODE
 
 
 class ConfigurationDialog(QDialog):
     """
     Class for the dialog variant.
-    
+
     @signal preferencesChanged() emitted after settings have been changed
     @signal masterPasswordChanged(str, str) emitted after the master
         password has been changed with the old and the new password
     """
+
     preferencesChanged = pyqtSignal()
     masterPasswordChanged = pyqtSignal(str, str)
-    
-    def __init__(self, parent=None, name=None, modal=False,
-                 fromEric=True,
-                 displayMode=ConfigurationMode.DEFAULTMODE,
-                 expandedEntries=None):
+
+    def __init__(
+        self,
+        parent=None,
+        name=None,
+        modal=False,
+        fromEric=True,
+        displayMode=ConfigurationMode.DEFAULTMODE,
+        expandedEntries=None,
+    ):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param name name of the dialog
@@ -1055,70 +1422,73 @@
             self.setObjectName(name)
         self.setModal(modal)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.layout = QVBoxLayout(self)
         self.layout.setContentsMargins(0, 0, 0, 0)
         self.layout.setSpacing(0)
-        
-        self.cw = ConfigurationWidget(self, fromEric=fromEric,
-                                      displayMode=displayMode,
-                                      expandedEntries=expandedEntries)
+
+        self.cw = ConfigurationWidget(
+            self,
+            fromEric=fromEric,
+            displayMode=displayMode,
+            expandedEntries=expandedEntries,
+        )
         size = self.cw.size()
         self.layout.addWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
+
         self.cw.accepted.connect(self.accept)
         self.cw.rejected.connect(self.reject)
         self.cw.preferencesChanged.connect(self.__preferencesChanged)
         self.cw.masterPasswordChanged.connect(self.__masterPasswordChanged)
-        
+
     def __preferencesChanged(self):
         """
         Private slot to handle a change of the preferences.
         """
         self.preferencesChanged.emit()
-        
+
     def __masterPasswordChanged(self, oldPassword, newPassword):
         """
         Private slot to handle the change of the master password.
-        
+
         @param oldPassword current master password (string)
         @param newPassword new master password (string)
         """
         self.masterPasswordChanged.emit(oldPassword, newPassword)
-        
+
     def showConfigurationPageByName(self, pageName):
         """
         Public slot to show a named configuration page.
-        
+
         @param pageName name of the configuration page to show (string)
         """
         self.cw.showConfigurationPageByName(pageName)
-        
+
     def getConfigurationPageName(self):
         """
         Public method to get the page name of the current page.
-        
+
         @return page name of the current page (string)
         """
         return self.cw.getConfigurationPageName()
-        
+
     def getExpandedEntries(self):
         """
         Public method to get a list of expanded entries.
-        
+
         @return list of expanded entries (list of string)
         """
         return self.cw.getExpandedEntries()
-        
+
     def setPreferences(self):
         """
         Public method called to store the selected values into the preferences
         storage.
         """
         self.cw.setPreferences()
-    
+
     def accept(self):
         """
         Public method to accept the dialog.
@@ -1130,34 +1500,34 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.cw = ConfigurationWidget(self, fromEric=False)
         size = self.cw.size()
         self.setCentralWidget(self.cw)
         self.resize(size)
         self.setWindowTitle(self.cw.windowTitle())
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw.accepted.connect(self.accept)
         self.cw.rejected.connect(self.close)
-        
+
     def showConfigurationPageByName(self, pageName):
         """
         Public slot to show a named configuration page.
-        
+
         @param pageName name of the configuration page to show (string)
         """
         self.cw.showConfigurationPageByName(pageName)
-        
+
     def accept(self):
         """
         Public slot called by the Ok button.
--- a/src/eric7/Preferences/ConfigurationPages/ApplicationPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ApplicationPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Application configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,33 +28,35 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ApplicationPage")
-        
-        self.backgroundServicesLabel.setText(self.tr(
-            "<p>eric is using background services for certain things like"
-            " syntax checks or code style checks. Per default the number"
-            " of processes to use for these checks is determined"
-            " automatically based on the number of CPUs. Please note, that"
-            " this is an advanced setting.</p>"
-            "<p>Available CPUs: <b>{0}</b></p>"
-        ).format(multiprocessing.cpu_count()))
-        
+
+        self.backgroundServicesLabel.setText(
+            self.tr(
+                "<p>eric is using background services for certain things like"
+                " syntax checks or code style checks. Per default the number"
+                " of processes to use for these checks is determined"
+                " automatically based on the number of CPUs. Please note, that"
+                " this is an advanced setting.</p>"
+                "<p>Available CPUs: <b>{0}</b></p>"
+            ).format(multiprocessing.cpu_count())
+        )
+
         self.msgSeverityComboBox.addItem(self.tr("Debug"), 0)
         self.msgSeverityComboBox.addItem(self.tr("Warning"), 1)
         self.msgSeverityComboBox.addItem(self.tr("Critical"), 2)
         self.msgSeverityComboBox.addItem(self.tr("Fatal Error"), 3)
-        
+
         # set initial values
         self.singleApplicationCheckBox.setChecked(
-            Preferences.getUI("SingleApplicationMode"))
-        self.splashScreenCheckBox.setChecked(
-            Preferences.getUI("ShowSplash"))
+            Preferences.getUI("SingleApplicationMode")
+        )
+        self.splashScreenCheckBox.setChecked(Preferences.getUI("ShowSplash"))
         self.crashSessionEnabledCheckBox.setChecked(
-            Preferences.getUI("CrashSessionEnabled"))
-        self.globalMenuCheckBox.setChecked(
-            Preferences.getUI("UseNativeMenuBar"))
+            Preferences.getUI("CrashSessionEnabled")
+        )
+        self.globalMenuCheckBox.setChecked(Preferences.getUI("UseNativeMenuBar"))
         if not Globals.isLinuxPlatform():
             self.globalMenuCheckBox.hide()
-        
+
         openOnStartup = Preferences.getUI("OpenOnStartup")
         if openOnStartup == 0:
             self.noOpenRadioButton.setChecked(True)
@@ -66,8 +69,9 @@
         elif openOnStartup == 4:
             self.globalSessionRadioButton.setChecked(True)
         self.openCrashSessionCheckBox.setChecked(
-            Preferences.getUI("OpenCrashSessionOnStartup"))
-        
+            Preferences.getUI("OpenCrashSessionOnStartup")
+        )
+
         period = Preferences.getUI("PerformVersionCheck")
         if period == 0:
             self.noCheckRadioButton.setChecked(True)
@@ -79,43 +83,39 @@
             self.weeklyCheckRadioButton.setChecked(True)
         elif period == 4:
             self.monthlyCheckRadioButton.setChecked(True)
-        
+
         self.systemEmailClientCheckBox.setChecked(
-            Preferences.getUser("UseSystemEmailClient"))
-        
-        self.errorlogCheckBox.setChecked(
-            Preferences.getUI("CheckErrorLog"))
+            Preferences.getUser("UseSystemEmailClient")
+        )
+
+        self.errorlogCheckBox.setChecked(Preferences.getUI("CheckErrorLog"))
         severityIndex = self.msgSeverityComboBox.findData(
-            Preferences.getUI("MinimumMessageTypeSeverity"))
+            Preferences.getUI("MinimumMessageTypeSeverity")
+        )
         self.msgSeverityComboBox.setCurrentIndex(severityIndex)
-        
-        self.intervalSpinBox.setValue(
-            Preferences.getUI("KeyboardInputInterval"))
-        
+
+        self.intervalSpinBox.setValue(Preferences.getUI("KeyboardInputInterval"))
+
         self.backgroundServicesSpinBox.setValue(
-            Preferences.getUI("BackgroundServiceProcesses"))
-        
-        self.upgraderDelaySpinBox.setValue(
-            Preferences.getUI("UpgraderDelay"))
-    
+            Preferences.getUI("BackgroundServiceProcesses")
+        )
+
+        self.upgraderDelaySpinBox.setValue(Preferences.getUI("UpgraderDelay"))
+
     def save(self):
         """
         Public slot to save the Application configuration.
         """
         Preferences.setUI(
-            "SingleApplicationMode",
-            self.singleApplicationCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowSplash",
-            self.splashScreenCheckBox.isChecked())
+            "SingleApplicationMode", self.singleApplicationCheckBox.isChecked()
+        )
+        Preferences.setUI("ShowSplash", self.splashScreenCheckBox.isChecked())
         Preferences.setUI(
-            "CrashSessionEnabled",
-            self.crashSessionEnabledCheckBox.isChecked())
+            "CrashSessionEnabled", self.crashSessionEnabledCheckBox.isChecked()
+        )
         if Globals.isLinuxPlatform():
-            Preferences.setUI(
-                "UseNativeMenuBar",
-                self.globalMenuCheckBox.isChecked())
-        
+            Preferences.setUI("UseNativeMenuBar", self.globalMenuCheckBox.isChecked())
+
         if self.noOpenRadioButton.isChecked():
             openOnStartup = 0
         elif self.lastFileRadioButton.isChecked():
@@ -127,9 +127,10 @@
         elif self.globalSessionRadioButton.isChecked():
             openOnStartup = 4
         Preferences.setUI("OpenOnStartup", openOnStartup)
-        Preferences.setUI("OpenCrashSessionOnStartup",
-                          self.openCrashSessionCheckBox.isChecked())
-        
+        Preferences.setUI(
+            "OpenCrashSessionOnStartup", self.openCrashSessionCheckBox.isChecked()
+        )
+
         if self.noCheckRadioButton.isChecked():
             period = 0
         elif self.alwaysCheckRadioButton.isChecked():
@@ -141,35 +142,29 @@
         elif self.monthlyCheckRadioButton.isChecked():
             period = 4
         Preferences.setUI("PerformVersionCheck", period)
-        
+
         Preferences.setUser(
-            "UseSystemEmailClient",
-            self.systemEmailClientCheckBox.isChecked())
-        
-        Preferences.setUI(
-            "CheckErrorLog",
-            self.errorlogCheckBox.isChecked())
+            "UseSystemEmailClient", self.systemEmailClientCheckBox.isChecked()
+        )
+
+        Preferences.setUI("CheckErrorLog", self.errorlogCheckBox.isChecked())
         Preferences.setUI(
-            "MinimumMessageTypeSeverity",
-            self.msgSeverityComboBox.currentData())
-        
+            "MinimumMessageTypeSeverity", self.msgSeverityComboBox.currentData()
+        )
+
+        Preferences.setUI("KeyboardInputInterval", self.intervalSpinBox.value())
+
         Preferences.setUI(
-            "KeyboardInputInterval",
-            self.intervalSpinBox.value())
-        
-        Preferences.setUI(
-            "BackgroundServiceProcesses",
-            self.backgroundServicesSpinBox.value())
-        
-        Preferences.setUI(
-            "UpgraderDelay",
-            self.upgraderDelaySpinBox.value())
+            "BackgroundServiceProcesses", self.backgroundServicesSpinBox.value()
+        )
+
+        Preferences.setUI("UpgraderDelay", self.upgraderDelaySpinBox.value())
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/CondaPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/CondaPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the conda configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,16 +27,18 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("CondaPage")
-        
+
         self.condaExePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.condaExePicker.setToolTip(self.tr(
-            "Press to select the conda executable via a file selection"
-            " dialog."))
-        
+        self.condaExePicker.setToolTip(
+            self.tr(
+                "Press to select the conda executable via a file selection" " dialog."
+            )
+        )
+
         # set initial values
         self.__condaExecutable = Preferences.getConda("CondaExecutable")
         self.condaExePicker.setText(self.__condaExecutable)
-        
+
     def save(self):
         """
         Public slot to save the conda configuration.
@@ -43,15 +46,16 @@
         condaExecutable = self.condaExePicker.text()
         if condaExecutable != self.__condaExecutable:
             Preferences.setConda("CondaExecutable", condaExecutable)
-            
+
             import CondaInterface
+
             CondaInterface.resetInterface()
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ConfigurationPageBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ConfigurationPageBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,44 +15,44 @@
 class ConfigurationPageBase(QWidget):
     """
     Class implementing the base class for all configuration pages.
-    
+
     @signal colourChanged(str, QColor) To inform about a new colour selection
     """
+
     colourChanged = pyqtSignal(str, QColor)
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__coloursDict = {}
-        
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
         """
         return
-        
+
     def saveState(self):
         """
         Public method to save the current state of the widget.
         """
         return
-        
+
     def setState(self, state):
         """
         Public method to set the state of the widget.
-        
+
         @param state state data generated by saveState
         """
         return
-        
-    def initColour(self, colourKey, button, prefMethod, byName=False,
-                   hasAlpha=False):
+
+    def initColour(self, colourKey, button, prefMethod, byName=False, hasAlpha=False):
         """
         Public method to initialize a colour selection button.
-        
+
         @param colourKey key of the colour resource (string)
         @param button reference to a button to show the colour on (QPushButton)
         @param prefMethod preferences method to get the colour
@@ -71,27 +71,28 @@
         button.clicked.connect(lambda: self.__selectColourSlot(button))
         self.__coloursDict[colourKey] = [colour, byName]
         self.colourChanged.emit(colourKey, colour)
-        
+
     @pyqtSlot()
     def __selectColourSlot(self, button):
         """
         Private slot to select a color.
-        
+
         @param button reference to the button been pressed
         @type QPushButton
         """
         colorKey = button.property("colorKey")
         hasAlpha = button.property("hasAlpha")
-        
+
         colDlg = QColorDialog(self)
         if hasAlpha:
             colDlg.setOptions(QColorDialog.ColorDialogOption.ShowAlphaChannel)
         # Set current color last to avoid conflicts with alpha channel
         colDlg.setCurrentColor(self.__coloursDict[colorKey][0])
         colDlg.currentColorChanged.connect(
-            lambda col: self.colourChanged.emit(colorKey, col))
+            lambda col: self.colourChanged.emit(colorKey, col)
+        )
         colDlg.exec()
-        
+
         if colDlg.result() == QDialog.DialogCode.Accepted:
             colour = colDlg.selectedColor()
             size = button.iconSize()
@@ -99,14 +100,14 @@
             pm.fill(colour)
             button.setIcon(QIcon(pm))
             self.__coloursDict[colorKey][0] = colour
-        
+
         # Update color selection
         self.colourChanged.emit(colorKey, self.__coloursDict[colorKey][0])
-        
+
     def saveColours(self, prefMethod):
         """
         Public method to save the colour selections.
-        
+
         @param prefMethod preferences method to set the colour
         """
         for key in self.__coloursDict:
@@ -114,12 +115,11 @@
                 prefMethod(key, self.__coloursDict[key][0].name())
             else:
                 prefMethod(key, self.__coloursDict[key][0])
-        
-    def selectFont(self, fontSample, fontVar, showFontInfo=False,
-                   options=None):
+
+    def selectFont(self, fontSample, fontVar, showFontInfo=False, options=None):
         """
         Public method used by the font selection buttons.
-        
+
         @param fontSample reference to the font sample widget (QLineEdit)
         @param fontVar reference to the variable containing the font (QFont)
         @param showFontInfo flag indicating to show some font info
@@ -134,8 +134,7 @@
         if ok:
             fontSample.setFont(font)
             if showFontInfo:
-                fontSample.setText(
-                    "{0} {1}".format(font.family(), font.pointSize()))
+                fontSample.setText("{0} {1}".format(font.family(), font.pointSize()))
         else:
             font = fontVar
         return font  # __IGNORE_WARNING_M834__
--- a/src/eric7/Preferences/ConfigurationPages/CooperationPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/CooperationPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Cooperation configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,74 +28,68 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("CooperationPage")
-        
+
         self.__bannedUserValidator = QRegularExpressionValidator(
             QRegularExpression(
                 r"[a-zA-Z0-9.-]+@"
                 r"(?:(?:2(?:[0-4][0-9]|5[0-5])|[01]?[0-9]{1,2})\.){3}"
-                r"(?:2(?:[0-4][0-9]|5[0-5])|[01]?[0-9]{1,2})"),
-            self.bannedUserEdit)
+                r"(?:2(?:[0-4][0-9]|5[0-5])|[01]?[0-9]{1,2})"
+            ),
+            self.bannedUserEdit,
+        )
         self.bannedUserEdit.setValidator(self.__bannedUserValidator)
-        
+
         # set initial values
-        self.autostartCheckBox.setChecked(
-            Preferences.getCooperation("AutoStartServer"))
-        self.otherPortsCheckBox.setChecked(
-            Preferences.getCooperation("TryOtherPorts"))
-        self.serverPortSpin.setValue(
-            Preferences.getCooperation("ServerPort"))
-        self.portToTrySpin.setValue(
-            Preferences.getCooperation("MaxPortsToTry"))
+        self.autostartCheckBox.setChecked(Preferences.getCooperation("AutoStartServer"))
+        self.otherPortsCheckBox.setChecked(Preferences.getCooperation("TryOtherPorts"))
+        self.serverPortSpin.setValue(Preferences.getCooperation("ServerPort"))
+        self.portToTrySpin.setValue(Preferences.getCooperation("MaxPortsToTry"))
         self.autoAcceptCheckBox.setChecked(
-            Preferences.getCooperation("AutoAcceptConnections"))
-        
-        self.bannedUsersList.addItems(sorted(
-            Preferences.getCooperation("BannedUsers")))
-    
+            Preferences.getCooperation("AutoAcceptConnections")
+        )
+
+        self.bannedUsersList.addItems(sorted(Preferences.getCooperation("BannedUsers")))
+
     def save(self):
         """
         Public slot to save the Cooperation configuration.
         """
         Preferences.setCooperation(
-            "AutoStartServer",
-            self.autostartCheckBox.isChecked())
-        Preferences.setCooperation(
-            "TryOtherPorts",
-            self.otherPortsCheckBox.isChecked())
+            "AutoStartServer", self.autostartCheckBox.isChecked()
+        )
+        Preferences.setCooperation("TryOtherPorts", self.otherPortsCheckBox.isChecked())
         Preferences.setCooperation(
-            "AutoAcceptConnections",
-            self.autoAcceptCheckBox.isChecked())
-        Preferences.setCooperation(
-            "ServerPort",
-            self.serverPortSpin.value())
-        Preferences.setCooperation(
-            "MaxPortsToTry",
-            self.portToTrySpin.value())
-        
+            "AutoAcceptConnections", self.autoAcceptCheckBox.isChecked()
+        )
+        Preferences.setCooperation("ServerPort", self.serverPortSpin.value())
+        Preferences.setCooperation("MaxPortsToTry", self.portToTrySpin.value())
+
         bannedUsers = []
         for row in range(self.bannedUsersList.count()):
             bannedUsers.append(self.bannedUsersList.item(row).text())
         Preferences.setCooperation("BannedUsers", bannedUsers)
-    
+
     @pyqtSlot()
     def on_bannedUsersList_itemSelectionChanged(self):
         """
         Private slot to react on changes of selected banned users.
         """
         self.deleteBannedUsersButton.setEnabled(
-            len(self.bannedUsersList.selectedItems()) > 0)
-    
+            len(self.bannedUsersList.selectedItems()) > 0
+        )
+
     @pyqtSlot(str)
     def on_bannedUserEdit_textChanged(self, txt):
         """
         Private slot to handle the user entering a banned user.
-        
+
         @param txt text entered by the user (string)
         """
         self.addBannedUserButton.setEnabled(
-            self.__bannedUserValidator.validate(txt, len(txt))[0] ==
-            QValidator.State.Acceptable)
-    
+            self.__bannedUserValidator.validate(txt, len(txt))[0]
+            == QValidator.State.Acceptable
+        )
+
     @pyqtSlot()
     def on_deleteBannedUsersButton_clicked(self):
         """
@@ -105,7 +100,7 @@
             row = self.bannedUsersList.row(itm)
             itm = self.bannedUsersList.takeItem(row)
             del itm
-    
+
     @pyqtSlot()
     def on_addBannedUserButton_clicked(self):
         """
@@ -113,12 +108,12 @@
         """
         self.bannedUsersList.addItem(self.bannedUserEdit.text())
         self.bannedUserEdit.clear()
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/CorbaPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/CorbaPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Corba configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,25 +27,26 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("CorbaPage")
-        
+
         self.idlPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.idlPicker.setToolTip(self.tr(
-            "Press to select the IDL compiler via a file selection dialog."))
-        
+        self.idlPicker.setToolTip(
+            self.tr("Press to select the IDL compiler via a file selection dialog.")
+        )
+
         # set initial values
         self.idlPicker.setText(Preferences.getCorba("omniidl"))
-        
+
     def save(self):
         """
         Public slot to save the Corba configuration.
         """
         Preferences.setCorba("omniidl", self.idlPicker.text())
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/DebuggerGeneralPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/DebuggerGeneralPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,6 +30,7 @@
     """
     Class implementing the Debugger General configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -37,30 +38,29 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("DebuggerGeneralPage")
-        
+
         t = self.execLineEdit.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.execLineEdit.setWhatsThis(t)
-        
+
         try:
-            backends = (
-                ericApp().getObject("DebugServer").getSupportedLanguages()
-            )
+            backends = ericApp().getObject("DebugServer").getSupportedLanguages()
             for backend in sorted(backends):
                 self.passiveDbgBackendCombo.addItem(backend)
         except KeyError:
             self.passiveDbgGroup.setEnabled(False)
-        
+
         t = self.consoleDbgEdit.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.consoleDbgEdit.setWhatsThis(t)
-        
+
         self.consoleDbgCompleter = EricFileCompleter(self.consoleDbgEdit)
         self.dbgTranslationLocalCompleter = EricDirCompleter(
-            self.dbgTranslationLocalEdit)
-        
+            self.dbgTranslationLocalEdit
+        )
+
         # set initial values
         interfaces = []
         networkInterfaces = QNetworkInterface.allInterfaces()
@@ -68,15 +68,14 @@
             addressEntries = networkInterface.addressEntries()
             if len(addressEntries) > 0:
                 for addressEntry in addressEntries:
-                    if (
-                        ":" in addressEntry.ip().toString() and
-                        not socket.has_ipv6
-                    ):
-                        continue    # IPv6 not supported by Python
+                    if ":" in addressEntry.ip().toString() and not socket.has_ipv6:
+                        continue  # IPv6 not supported by Python
                     interfaces.append(
                         "{0} ({1})".format(
                             networkInterface.humanReadableName(),
-                            addressEntry.ip().toString()))
+                            addressEntry.ip().toString(),
+                        )
+                    )
         self.interfacesCombo.addItems(interfaces)
         interface = Preferences.getDebugger("NetworkInterface")
         if not socket.has_ipv6:
@@ -92,102 +91,108 @@
             self.selectedInterfaceButton.setChecked(True)
             index = -1
             for i in range(len(interfaces)):
-                if (
-                    re.fullmatch(".*{0}.*".format(interface), interfaces[i])
-                ):
+                if re.fullmatch(".*{0}.*".format(interface), interfaces[i]):
                     index = i
                     break
             self.interfacesCombo.setCurrentIndex(index)
-        
-        self.allowedHostsList.addItems(
-            Preferences.getDebugger("AllowedHosts"))
-        
-        self.remoteDebuggerGroup.setChecked(
-            Preferences.getDebugger("RemoteDbgEnabled"))
-        self.hostLineEdit.setText(
-            Preferences.getDebugger("RemoteHost"))
-        self.execLineEdit.setText(
-            Preferences.getDebugger("RemoteExecution"))
-        
+
+        self.allowedHostsList.addItems(Preferences.getDebugger("AllowedHosts"))
+
+        self.remoteDebuggerGroup.setChecked(Preferences.getDebugger("RemoteDbgEnabled"))
+        self.hostLineEdit.setText(Preferences.getDebugger("RemoteHost"))
+        self.execLineEdit.setText(Preferences.getDebugger("RemoteExecution"))
+
         if self.passiveDbgGroup.isEnabled():
             self.passiveDbgCheckBox.setChecked(
-                Preferences.getDebugger("PassiveDbgEnabled"))
+                Preferences.getDebugger("PassiveDbgEnabled")
+            )
             self.passiveDbgPortSpinBox.setValue(
-                Preferences.getDebugger("PassiveDbgPort"))
+                Preferences.getDebugger("PassiveDbgPort")
+            )
             index = self.passiveDbgBackendCombo.findText(
-                Preferences.getDebugger("PassiveDbgType"))
+                Preferences.getDebugger("PassiveDbgType")
+            )
             if index == -1:
                 index = 0
             self.passiveDbgBackendCombo.setCurrentIndex(index)
-        
+
         self.debugEnvironReplaceCheckBox.setChecked(
-            Preferences.getDebugger("DebugEnvironmentReplace"))
-        self.debugEnvironEdit.setText(
-            Preferences.getDebugger("DebugEnvironment"))
+            Preferences.getDebugger("DebugEnvironmentReplace")
+        )
+        self.debugEnvironEdit.setText(Preferences.getDebugger("DebugEnvironment"))
         self.automaticResetCheckBox.setChecked(
-            Preferences.getDebugger("AutomaticReset"))
+            Preferences.getDebugger("AutomaticReset")
+        )
         self.debugAutoSaveScriptsCheckBox.setChecked(
-            Preferences.getDebugger("Autosave"))
+            Preferences.getDebugger("Autosave")
+        )
         self.consoleDebuggerGroup.setChecked(
-            Preferences.getDebugger("ConsoleDbgEnabled"))
-        self.consoleDbgEdit.setText(
-            Preferences.getDebugger("ConsoleDbgCommand"))
+            Preferences.getDebugger("ConsoleDbgEnabled")
+        )
+        self.consoleDbgEdit.setText(Preferences.getDebugger("ConsoleDbgCommand"))
         self.dbgPathTranslationGroup.setChecked(
-            Preferences.getDebugger("PathTranslation"))
+            Preferences.getDebugger("PathTranslation")
+        )
         self.dbgTranslationRemoteEdit.setText(
-            Preferences.getDebugger("PathTranslationRemote"))
+            Preferences.getDebugger("PathTranslationRemote")
+        )
         self.dbgTranslationLocalEdit.setText(
-            Preferences.getDebugger("PathTranslationLocal"))
+            Preferences.getDebugger("PathTranslationLocal")
+        )
         self.multiprocessCheckBox.setChecked(
-            Preferences.getDebugger("MultiProcessEnabled"))
+            Preferences.getDebugger("MultiProcessEnabled")
+        )
         self.debugThreeStateBreakPoint.setChecked(
-            Preferences.getDebugger("ThreeStateBreakPoints"))
+            Preferences.getDebugger("ThreeStateBreakPoints")
+        )
         self.intelligentBreakPointCheckBox.setChecked(
-            Preferences.getDebugger("IntelligentBreakpoints"))
-        self.recentFilesSpinBox.setValue(
-            Preferences.getDebugger("RecentNumber"))
-        self.exceptionBreakCheckBox.setChecked(
-            Preferences.getDebugger("BreakAlways"))
+            Preferences.getDebugger("IntelligentBreakpoints")
+        )
+        self.recentFilesSpinBox.setValue(Preferences.getDebugger("RecentNumber"))
+        self.exceptionBreakCheckBox.setChecked(Preferences.getDebugger("BreakAlways"))
         self.exceptionShellCheckBox.setChecked(
-            Preferences.getDebugger("ShowExceptionInShell"))
-        self.maxSizeSpinBox.setValue(
-            Preferences.getDebugger("MaxVariableSize"))
+            Preferences.getDebugger("ShowExceptionInShell")
+        )
+        self.maxSizeSpinBox.setValue(Preferences.getDebugger("MaxVariableSize"))
         # Set the colours for debug viewer backgrounds
         self.previewMdl = PreviewModel()
         self.preView.setModel(self.previewMdl)
         self.colourChanged.connect(self.previewMdl.setColor)
-        self.initColour("BgColorNew", self.backgroundNewButton,
-                        Preferences.getDebugger, hasAlpha=True)
-        self.initColour("BgColorChanged", self.backgroundChangedButton,
-                        Preferences.getDebugger, hasAlpha=True)
-        
+        self.initColour(
+            "BgColorNew",
+            self.backgroundNewButton,
+            Preferences.getDebugger,
+            hasAlpha=True,
+        )
+        self.initColour(
+            "BgColorChanged",
+            self.backgroundChangedButton,
+            Preferences.getDebugger,
+            hasAlpha=True,
+        )
+
         self.autoViewSourcecodeCheckBox.setChecked(
-            Preferences.getDebugger("AutoViewSourceCode"))
-    
+            Preferences.getDebugger("AutoViewSourceCode")
+        )
+
     def save(self):
         """
         Public slot to save the Debugger General (1) configuration.
         """
         Preferences.setDebugger(
-            "RemoteDbgEnabled",
-            self.remoteDebuggerGroup.isChecked())
-        Preferences.setDebugger(
-            "RemoteHost",
-            self.hostLineEdit.text())
-        Preferences.setDebugger(
-            "RemoteExecution",
-            self.execLineEdit.text())
-        
+            "RemoteDbgEnabled", self.remoteDebuggerGroup.isChecked()
+        )
+        Preferences.setDebugger("RemoteHost", self.hostLineEdit.text())
+        Preferences.setDebugger("RemoteExecution", self.execLineEdit.text())
+
         Preferences.setDebugger(
-            "PassiveDbgEnabled",
-            self.passiveDbgCheckBox.isChecked())
+            "PassiveDbgEnabled", self.passiveDbgCheckBox.isChecked()
+        )
+        Preferences.setDebugger("PassiveDbgPort", self.passiveDbgPortSpinBox.value())
         Preferences.setDebugger(
-            "PassiveDbgPort",
-            self.passiveDbgPortSpinBox.value())
-        Preferences.setDebugger(
-            "PassiveDbgType",
-            self.passiveDbgBackendCombo.currentText())
-        
+            "PassiveDbgType", self.passiveDbgBackendCombo.currentText()
+        )
+
         if self.allInterfacesButton.isChecked():
             Preferences.setDebugger("NetworkInterface", "all")
         elif self.all6InterfacesButton.isChecked():
@@ -199,77 +204,67 @@
                 Preferences.setDebugger("NetworkInterface", "all")
             else:
                 Preferences.setDebugger("NetworkInterface", interface)
-        
+
         allowedHosts = []
         for row in range(self.allowedHostsList.count()):
             allowedHosts.append(self.allowedHostsList.item(row).text())
         Preferences.setDebugger("AllowedHosts", allowedHosts)
-        
-        Preferences.setDebugger(
-            "DebugEnvironmentReplace",
-            self.debugEnvironReplaceCheckBox.isChecked())
+
         Preferences.setDebugger(
-            "DebugEnvironment",
-            self.debugEnvironEdit.text())
+            "DebugEnvironmentReplace", self.debugEnvironReplaceCheckBox.isChecked()
+        )
+        Preferences.setDebugger("DebugEnvironment", self.debugEnvironEdit.text())
         Preferences.setDebugger(
-            "AutomaticReset",
-            self.automaticResetCheckBox.isChecked())
+            "AutomaticReset", self.automaticResetCheckBox.isChecked()
+        )
         Preferences.setDebugger(
-            "Autosave",
-            self.debugAutoSaveScriptsCheckBox.isChecked())
-        Preferences.setDebugger(
-            "ConsoleDbgEnabled",
-            self.consoleDebuggerGroup.isChecked())
+            "Autosave", self.debugAutoSaveScriptsCheckBox.isChecked()
+        )
         Preferences.setDebugger(
-            "ConsoleDbgCommand",
-            self.consoleDbgEdit.text())
+            "ConsoleDbgEnabled", self.consoleDebuggerGroup.isChecked()
+        )
+        Preferences.setDebugger("ConsoleDbgCommand", self.consoleDbgEdit.text())
         Preferences.setDebugger(
-            "PathTranslation",
-            self.dbgPathTranslationGroup.isChecked())
+            "PathTranslation", self.dbgPathTranslationGroup.isChecked()
+        )
         Preferences.setDebugger(
-            "PathTranslationRemote",
-            self.dbgTranslationRemoteEdit.text())
-        Preferences.setDebugger(
-            "PathTranslationLocal",
-            self.dbgTranslationLocalEdit.text())
+            "PathTranslationRemote", self.dbgTranslationRemoteEdit.text()
+        )
         Preferences.setDebugger(
-            "MultiProcessEnabled",
-            self.multiprocessCheckBox.isChecked())
+            "PathTranslationLocal", self.dbgTranslationLocalEdit.text()
+        )
         Preferences.setDebugger(
-            "ThreeStateBreakPoints",
-            self.debugThreeStateBreakPoint.isChecked())
+            "MultiProcessEnabled", self.multiprocessCheckBox.isChecked()
+        )
         Preferences.setDebugger(
-            "IntelligentBreakpoints",
-            self.intelligentBreakPointCheckBox.isChecked())
-        Preferences.setDebugger(
-            "RecentNumber",
-            self.recentFilesSpinBox.value())
+            "ThreeStateBreakPoints", self.debugThreeStateBreakPoint.isChecked()
+        )
         Preferences.setDebugger(
-            "BreakAlways",
-            self.exceptionBreakCheckBox.isChecked())
+            "IntelligentBreakpoints", self.intelligentBreakPointCheckBox.isChecked()
+        )
+        Preferences.setDebugger("RecentNumber", self.recentFilesSpinBox.value())
+        Preferences.setDebugger("BreakAlways", self.exceptionBreakCheckBox.isChecked())
         Preferences.setDebugger(
-            "ShowExceptionInShell",
-            self.exceptionShellCheckBox.isChecked())
-        Preferences.setDebugger(
-            "MaxVariableSize",
-            self.maxSizeSpinBox.value())
+            "ShowExceptionInShell", self.exceptionShellCheckBox.isChecked()
+        )
+        Preferences.setDebugger("MaxVariableSize", self.maxSizeSpinBox.value())
         # Store background colors for debug viewer
         self.saveColours(Preferences.setDebugger)
-        
+
         Preferences.setDebugger(
-            "AutoViewSourceCode",
-            self.autoViewSourcecodeCheckBox.isChecked())
-        
+            "AutoViewSourceCode", self.autoViewSourcecodeCheckBox.isChecked()
+        )
+
     def on_allowedHostsList_currentItemChanged(self, current, previous):
         """
         Private method set the state of the edit and delete button.
-        
+
         @param current new current item (QListWidgetItem)
         @param previous previous current item (QListWidgetItem)
         """
         self.editAllowedHostButton.setEnabled(current is not None)
         self.deleteAllowedHostButton.setEnabled(current is not None)
-        
+
     @pyqtSlot()
     def on_addAllowedHostButton_clicked(self):
         """
@@ -279,11 +274,12 @@
             None,
             self.tr("Add allowed host"),
             self.tr("Enter the IP address of an allowed host"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and allowedHost:
             if QHostAddress(allowedHost).protocol() in [
                 QAbstractSocket.NetworkLayerProtocol.IPv4Protocol,
-                QAbstractSocket.NetworkLayerProtocol.IPv6Protocol
+                QAbstractSocket.NetworkLayerProtocol.IPv6Protocol,
             ]:
                 self.allowedHostsList.addItem(allowedHost)
             else:
@@ -293,16 +289,17 @@
                     self.tr(
                         """<p>The entered address <b>{0}</b> is not"""
                         """ a valid IP v4 or IP v6 address."""
-                        """ Aborting...</p>""")
-                    .format(allowedHost))
-        
+                        """ Aborting...</p>"""
+                    ).format(allowedHost),
+                )
+
     @pyqtSlot()
     def on_deleteAllowedHostButton_clicked(self):
         """
         Private slot called to delete an allowed host.
         """
         self.allowedHostsList.takeItem(self.allowedHostsList.currentRow())
-        
+
     @pyqtSlot()
     def on_editAllowedHostButton_clicked(self):
         """
@@ -314,11 +311,12 @@
             self.tr("Edit allowed host"),
             self.tr("Enter the IP address of an allowed host"),
             QLineEdit.EchoMode.Normal,
-            allowedHost)
+            allowedHost,
+        )
         if ok and allowedHost:
             if QHostAddress(allowedHost).protocol() in [
                 QAbstractSocket.NetworkLayerProtocol.IPv4Protocol,
-                QAbstractSocket.NetworkLayerProtocol.IPv6Protocol
+                QAbstractSocket.NetworkLayerProtocol.IPv6Protocol,
             ]:
                 self.allowedHostsList.currentItem().setText(allowedHost)
             else:
@@ -328,8 +326,9 @@
                     self.tr(
                         """<p>The entered address <b>{0}</b> is not"""
                         """ a valid IP v4 or IP v6 address."""
-                        """ Aborting...</p>""")
-                    .format(allowedHost))
+                        """ Aborting...</p>"""
+                    ).format(allowedHost),
+                )
 
 
 class PreviewModel(QAbstractItemModel):
@@ -337,37 +336,38 @@
     Class to show an example of the selected background colours for the debug
     viewer.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        self.bgColorNew = QBrush(QColor('#FFFFFF'))
-        self.bgColorChanged = QBrush(QColor('#FFFFFF'))
-    
+        self.bgColorNew = QBrush(QColor("#FFFFFF"))
+        self.bgColorChanged = QBrush(QColor("#FFFFFF"))
+
     def setColor(self, key, bgcolour):
         """
         Public slot to update the background colour indexed by key.
-        
+
         @param key the name of background
         @type str
         @param bgcolour the new background colour
         @type QColor
         """
-        if key == 'BgColorNew':
+        if key == "BgColorNew":
             self.bgColorNew = QBrush(bgcolour)
         else:
             self.bgColorChanged = QBrush(bgcolour)
-        
+
         # Force update of preview view
         idxStart = self.index(0, 0, QModelIndex())
         idxEnd = self.index(0, 2, QModelIndex())
         self.dataChanged.emit(idxStart, idxEnd)
-    
+
     def index(self, row, column, parent=QModelIndex()):
         """
         Public Qt slot to get the index of item at row:column of parent.
-        
+
         @param row number of rows
         @type int
         @param column number of columns
@@ -379,57 +379,57 @@
         """
         if not self.hasIndex(row, column, parent):
             return QModelIndex()
-        
+
         return self.createIndex(row, column, None)
-    
+
     def parent(self, child):
         """
         Public Qt slot to get the parent of the given child.
-        
+
         @param child the model child node
         @type QModelIndex
         @return new model index for parent
         @rtype QModelIndex
         """
         return QModelIndex()
-    
+
     def columnCount(self, parent=QModelIndex()):
         """
         Public Qt slot to get the column count.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return number of columns
         @rtype int
         """
         return 1
-    
+
     def rowCount(self, parent=QModelIndex()):
         """
         Public Qt slot to get the row count.
-        
+
         @param parent the model parent
         @type QModelIndex
         @return number of rows
         @rtype int
         """
         return 4
-    
+
     def flags(self, index):
         """
         Public Qt slot to get the item flags.
-        
+
         @param index of item
         @type QModelIndex
         @return item flags
         @rtype QtCore.Qt.ItemFlag
         """
         return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public Qt slot get the role data of item.
-        
+
         @param index the model index
         @type QModelIndex
         @param role the requested data role
@@ -444,18 +444,19 @@
                 return self.bgColorChanged
             else:
                 return self.bgColorNew
-        
+
         return None
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
     return DebuggerGeneralPage()
 
+
 #
 # eflag: noqa = M822
--- a/src/eric7/Preferences/ConfigurationPages/DebuggerPython3Page.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/DebuggerPython3Page.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,6 +23,7 @@
     """
     Class implementing the Debugger Python3 configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -30,28 +31,30 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("DebuggerPython3Page")
-        
+
         try:
             self.__virtualenvManager = ericApp().getObject("VirtualEnvManager")
             self.__standalone = False
         except KeyError:
             from VirtualEnv.VirtualenvManager import VirtualenvManager
+
             self.__virtualenvManager = VirtualenvManager()
             self.__standalone = True
-        
+
         self.venvDlgButton.setVisible(self.__standalone)
         self.venvDlgButton.setIcon(UI.PixmapCache.getIcon("virtualenv"))
-        
+
         self.venvRefreshButton.setVisible(not self.__standalone)
         self.venvRefreshButton.setIcon(UI.PixmapCache.getIcon("reload"))
-        
+
         self.debugClientPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.debugClientPicker.setToolTip(self.tr(
-            "Press to select the Debug Client via a file selection dialog"))
+        self.debugClientPicker.setToolTip(
+            self.tr("Press to select the Debug Client via a file selection dialog")
+        )
         self.debugClientPicker.setFilters(self.tr("Python Files (*.py *.py3)"))
-        
+
         self.__populateAndSetVenvComboBox()
-        
+
         # set initial values
         dct = Preferences.getDebugger("DebugClientType3")
         if dct == "standard":
@@ -59,43 +62,38 @@
         else:
             self.customButton.setChecked(True)
         self.debugClientPicker.setText(
-            Preferences.getDebugger("DebugClient3"), toNative=False)
-        self.pyRedirectCheckBox.setChecked(
-            Preferences.getDebugger("Python3Redirect"))
+            Preferences.getDebugger("DebugClient3"), toNative=False
+        )
+        self.pyRedirectCheckBox.setChecked(Preferences.getDebugger("Python3Redirect"))
         self.pyNoEncodingCheckBox.setChecked(
-            Preferences.getDebugger("Python3NoEncoding"))
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("Python3Extensions"))
-    
+            Preferences.getDebugger("Python3NoEncoding")
+        )
+        self.sourceExtensionsEdit.setText(Preferences.getDebugger("Python3Extensions"))
+
     def save(self):
         """
         Public slot to save the Debugger Python configuration.
         """
-        Preferences.setDebugger(
-            "Python3VirtualEnv",
-            self.venvComboBox.currentText())
+        Preferences.setDebugger("Python3VirtualEnv", self.venvComboBox.currentText())
         dct = "standard" if self.standardButton.isChecked() else "custom"
         Preferences.setDebugger("DebugClientType3", dct)
         Preferences.setDebugger(
-            "DebugClient3",
-            self.debugClientPicker.text(toNative=False))
+            "DebugClient3", self.debugClientPicker.text(toNative=False)
+        )
+        Preferences.setDebugger("Python3Redirect", self.pyRedirectCheckBox.isChecked())
         Preferences.setDebugger(
-            "Python3Redirect",
-            self.pyRedirectCheckBox.isChecked())
-        Preferences.setDebugger(
-            "Python3NoEncoding",
-            self.pyNoEncodingCheckBox.isChecked())
-    
+            "Python3NoEncoding", self.pyNoEncodingCheckBox.isChecked()
+        )
+
     def __populateAndSetVenvComboBox(self):
         """
         Private method to populate and set the virtual environment combo box.
         """
         self.venvComboBox.clear()
         self.venvComboBox.addItems(
-            [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNames())
+            [""] + sorted(self.__virtualenvManager.getVirtualenvNames())
         )
-        
+
         # set initial value
         venvName = Preferences.getDebugger("Python3VirtualEnv")
         if venvName:
@@ -103,15 +101,14 @@
             if index < 0:
                 index = 0
             self.venvComboBox.setCurrentIndex(index)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot handling a click of the refresh button.
         """
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("Python3Extensions"))
-    
+        self.sourceExtensionsEdit.setText(Preferences.getDebugger("Python3Extensions"))
+
     @pyqtSlot()
     def on_venvDlgButton_clicked(self):
         """
@@ -122,19 +119,19 @@
             self.__populateAndSetVenvComboBox()
             self.activateWindow()
             self.raise_()
-    
+
     @pyqtSlot()
     def on_venvRefreshButton_clicked(self):
         """
         Private slot to reload the list of virtual environments.
         """
         self.__populateAndSetVenvComboBox()
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/DiffColoursPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/DiffColoursPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Diff colours configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,9 +28,9 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("DiffColoursPage")
-        
+
         self.__coloursDict = {}
-        
+
         monospacedFont = Preferences.getEditorOtherFonts("MonospacedFont")
         self.__allSamples = (
             self.textSample,
@@ -38,67 +39,73 @@
             self.replacedSample,
             self.contextSample,
             self.headerSample,
-            self.whitespaceSample
+            self.whitespaceSample,
         )
         for sample in self.__allSamples:
             sample.setFont(monospacedFont)
-        
+
         # set initial values
         self.__initColour(
             "TextColor",
             self.textButton,
             self.__updateSampleTextColour,
             lambda: self.__selectTextColour(self.textButton),
-            self.textSample)
+            self.textSample,
+        )
         self.__initColour(
             "AddedColor",
             self.addedButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.addedButton),
-            self.addedSample)
+            self.addedSample,
+        )
         self.__initColour(
             "RemovedColor",
             self.removedButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.removedButton),
-            self.removedSample)
+            self.removedSample,
+        )
         self.__initColour(
             "ReplacedColor",
             self.replacedButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.replacedButton),
-            self.replacedSample)
+            self.replacedSample,
+        )
         self.__initColour(
             "ContextColor",
             self.contextButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.contextButton),
-            self.contextSample)
+            self.contextSample,
+        )
         self.__initColour(
             "HeaderColor",
             self.headerButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.headerButton),
-            self.headerSample)
+            self.headerSample,
+        )
         self.__initColour(
             "BadWhitespaceColor",
             self.whitespaceButton,
             self.__updateSampleBackgroundColour,
             lambda: self.__selectBackgroundColour(self.whitespaceButton),
-            self.whitespaceSample)
-    
+            self.whitespaceSample,
+        )
+
     def save(self):
         """
         Public slot to save the Diff colours configuration.
         """
         for key in self.__coloursDict:
             Preferences.setDiffColour(key, self.__coloursDict[key][0])
-    
-    def __initColour(self, colourKey, button, initSlot, selectSlot,
-                     sampleWidget):
+
+    def __initColour(self, colourKey, button, initSlot, selectSlot, sampleWidget):
         """
         Private method to initialize a colour selection button.
-        
+
         @param colourKey key of the diff colour
         @type str
         @param button reference to the button
@@ -116,44 +123,47 @@
         self.__coloursDict[colourKey] = [colour, sampleWidget]
         if initSlot:
             initSlot(colourKey)
-    
+
     @pyqtSlot()
     def __selectTextColour(self, button):
         """
         Private slot to select the text colour.
-        
+
         @param button reference to the button been pressed
         @type QPushButton
         """
         colorKey = button.property("colorKey")
-        
+
         colour = QColorDialog.getColor(self.__coloursDict[colorKey][0], self)
         if colour.isValid():
             self.__coloursDict[colorKey][0] = colour
             self.__updateSampleTextColour(colorKey)
-    
+
     @pyqtSlot()
     def __selectBackgroundColour(self, button):
         """
         Private slot to select a background colour.
-        
+
         @param button reference to the button been pressed
         @type QPushButton
         """
         colorKey = button.property("colorKey")
-        
+
         colour = QColorDialog.getColor(
-            self.__coloursDict[colorKey][0], self, "",
-            QColorDialog.ColorDialogOption.ShowAlphaChannel)
+            self.__coloursDict[colorKey][0],
+            self,
+            "",
+            QColorDialog.ColorDialogOption.ShowAlphaChannel,
+        )
         if colour.isValid():
             self.__coloursDict[colorKey][0] = colour
             self.__updateSampleBackgroundColour(colorKey)
-    
+
     @pyqtSlot()
     def __updateSampleTextColour(self, colourKey):
         """
         Private slot to update the text colour of all samples.
-        
+
         @param colourKey key of the diff colour
         @type str
         """
@@ -165,14 +175,15 @@
                 )
             else:
                 self.__coloursDict[key][1].setStyleSheet(
-                    "QLineEdit {{ color: {0}; background-color: {1}; }}"
-                    .format(colour.name(), self.__coloursDict[key][0].name())
+                    "QLineEdit {{ color: {0}; background-color: {1}; }}".format(
+                        colour.name(), self.__coloursDict[key][0].name()
+                    )
                 )
-    
+
     def __updateSampleBackgroundColour(self, colourKey):
         """
         Private slot to update the background colour of a sample.
-        
+
         @param colourKey key of the diff colour
         @type str
         """
@@ -180,16 +191,16 @@
         if sample:
             colour = self.__coloursDict[colourKey][0]
             sample.setStyleSheet(
-                "QLineEdit {{ color: {0}; background-color: {1}; }}"
-                .format(self.__coloursDict["TextColor"][0].name(),
-                        colour.name())
+                "QLineEdit {{ color: {0}; background-color: {1}; }}".format(
+                    self.__coloursDict["TextColor"][0].name(), colour.name()
+                )
             )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorAPIsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorAPIsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -29,6 +29,7 @@
     """
     Class implementing the Editor APIs configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -36,37 +37,36 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorAPIsPage")
-        
+
         self.apiFilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.apiFilePicker.setToolTip(self.tr(
-            "Press to select an API file via a selection dialog"))
-        self.apiFilePicker.setFilters(self.tr(
-            "API File (*.api);;All Files (*)"))
-        
+        self.apiFilePicker.setToolTip(
+            self.tr("Press to select an API file via a selection dialog")
+        )
+        self.apiFilePicker.setFilters(self.tr("API File (*.api);;All Files (*)"))
+
         self.prepareApiButton.setText(self.tr("Compile APIs"))
         self.__currentAPI = None
         self.__inPreparation = False
-        
+
         # set initial values
         self.pluginManager = ericApp().getObject("PluginManager")
-        self.apiAutoPrepareCheckBox.setChecked(
-            Preferences.getEditor("AutoPrepareAPIs"))
-        
+        self.apiAutoPrepareCheckBox.setChecked(Preferences.getEditor("AutoPrepareAPIs"))
+
         import QScintilla.Lexers
+
         self.apis = {}
-        apiLanguages = sorted(
-            [''] + list(QScintilla.Lexers.getSupportedApiLanguages()))
+        apiLanguages = sorted([""] + list(QScintilla.Lexers.getSupportedApiLanguages()))
         for lang in apiLanguages:
             self.apiLanguageComboBox.addItem(
-                QScintilla.Lexers.getLanguageIcon(lang, False),
-                lang)
+                QScintilla.Lexers.getLanguageIcon(lang, False), lang
+            )
         self.__currentApiLanguage = ""
         self.on_apiLanguageComboBox_activated(0)
-    
+
     def __apiKey(self, language, projectType):
         """
         Private method to generate a key for the apis dictionary.
-        
+
         @param language programming language of the API
         @type str
         @param projectType project type of the API
@@ -76,143 +76,151 @@
         """
         key = (language, projectType) if projectType else (language, "")
         return key
-    
+
     def save(self):
         """
         Public slot to save the Editor APIs configuration.
         """
         Preferences.setEditor(
-            "AutoPrepareAPIs",
-            self.apiAutoPrepareCheckBox.isChecked())
-        
+            "AutoPrepareAPIs", self.apiAutoPrepareCheckBox.isChecked()
+        )
+
         language = self.apiLanguageComboBox.currentText()
         projectType = self.projectTypeComboBox.itemData(
-            self.projectTypeComboBox.currentIndex())
+            self.projectTypeComboBox.currentIndex()
+        )
         key = self.__apiKey(language, projectType)
         self.apis[key] = self.__editorGetApisFromApiList()
-        
+
         for (language, projectType), apis in self.apis.items():
             Preferences.setEditorAPI(language, projectType, apis)
-    
+
     @pyqtSlot(int)
     def on_projectTypeComboBox_activated(self, index):
         """
         Private slot to handle the selection of a project type.
-        
+
         @param index index of the selected entry
         @type str
         """
         if self.__currentApiProjectTypeIndex == index:
             return
-        
+
         self.__currentApiProjectTypeIndex = index
         self.__fillApisList()
-        
+
     @pyqtSlot(int)
     def on_apiLanguageComboBox_activated(self, index):
         """
         Private slot to fill the api listbox of the api page.
-        
+
         @param index index of the selected entry
         @type int
         """
         language = self.apiLanguageComboBox.itemText(index)
-        
+
         if self.__currentApiLanguage == language:
             return
-        
+
         self.__fillProjectTypeComboBox(language)
-    
+
     def __fillProjectTypeComboBox(self, language):
         """
         Private slot to fill the selection of available project types for the
         given language.
-        
+
         @param language selected API language
         @type str
         """
         self.projectTypeComboBox.clear()
-        
+
         apiProjectTypes = [("", "")]
         with contextlib.suppress(KeyError):
             apiProjectTypes += sorted(
-                (trans, ptype) for ptype, trans in
-                ericApp().getObject("Project").getProjectTypes(language).items()
+                (trans, ptype)
+                for ptype, trans in ericApp()
+                .getObject("Project")
+                .getProjectTypes(language)
+                .items()
             )
         for projectTypeStr, projectType in apiProjectTypes:
             self.projectTypeComboBox.addItem(projectTypeStr, projectType)
-    
+
         self.__currentApiProjectTypeIndex = -1
         self.__currentApiProjectType = ""
-        
+
         self.on_projectTypeComboBox_activated(0)
-    
+
     def __fillApisList(self):
         """
         Private slot to fill the list of API files.
         """
         self.apis[
-            self.__apiKey(self.__currentApiLanguage,
-                          self.__currentApiProjectType)
+            self.__apiKey(self.__currentApiLanguage, self.__currentApiProjectType)
         ] = self.__editorGetApisFromApiList()
-        
+
         self.__currentApiLanguage = self.apiLanguageComboBox.currentText()
         self.__currentApiProjectType = self.projectTypeComboBox.itemData(
-            self.projectTypeComboBox.currentIndex())
+            self.projectTypeComboBox.currentIndex()
+        )
         self.apiList.clear()
-        
+
         if not self.__currentApiLanguage:
             self.apiGroup.setEnabled(False)
             return
-            
+
         self.apiGroup.setEnabled(True)
         self.deleteApiFileButton.setEnabled(False)
         self.addApiFileButton.setEnabled(False)
         self.apiFilePicker.clear()
-        
-        key = self.__apiKey(self.__currentApiLanguage,
-                            self.__currentApiProjectType)
+
+        key = self.__apiKey(self.__currentApiLanguage, self.__currentApiProjectType)
         if key not in self.apis:
             # populate on demand
             self.apis[key] = Preferences.getEditorAPI(
-                self.__currentApiLanguage,
-                projectType=self.__currentApiProjectType)[:]
+                self.__currentApiLanguage, projectType=self.__currentApiProjectType
+            )[:]
         for api in self.apis[key]:
             if api:
                 self.apiList.addItem(api)
         self.prepareApiButton.setEnabled(self.apiList.count() > 0)
-        
+
         from QScintilla.APIsManager import APIsManager
+
         self.__currentAPI = APIsManager().getAPIs(
-            self.__currentApiLanguage,
-            projectType=self.__currentApiProjectType)
+            self.__currentApiLanguage, projectType=self.__currentApiProjectType
+        )
         if self.__currentAPI is not None:
             self.__currentAPI.apiPreparationFinished.connect(
-                self.__apiPreparationFinished)
+                self.__apiPreparationFinished
+            )
             self.__currentAPI.apiPreparationCancelled.connect(
-                self.__apiPreparationCancelled)
+                self.__apiPreparationCancelled
+            )
             self.__currentAPI.apiPreparationStarted.connect(
-                self.__apiPreparationStarted)
+                self.__apiPreparationStarted
+            )
             self.addInstalledApiFileButton.setEnabled(
-                len(self.__currentAPI.installedAPIFiles()) > 0)
+                len(self.__currentAPI.installedAPIFiles()) > 0
+            )
         else:
             self.addInstalledApiFileButton.setEnabled(False)
-        
+
         self.addPluginApiFileButton.setEnabled(
-            len(self.pluginManager.getPluginApiFiles(
-                self.__currentApiLanguage)) > 0)
-        
+            len(self.pluginManager.getPluginApiFiles(self.__currentApiLanguage)) > 0
+        )
+
     def __editorGetApisFromApiList(self):
         """
         Private slot to retrieve the api filenames from the list.
-        
+
         @return list of api filenames (list of strings)
         """
         apis = []
         for row in range(self.apiList.count()):
             apis.append(self.apiList.item(row).text())
         return apis
-        
+
     @pyqtSlot()
     def on_addApiFileButton_clicked(self):
         """
@@ -223,7 +231,7 @@
             self.apiList.addItem(Utilities.toNativeSeparators(file))
             self.apiFilePicker.clear()
         self.prepareApiButton.setEnabled(self.apiList.count() > 0)
-        
+
     @pyqtSlot()
     def on_deleteApiFileButton_clicked(self):
         """
@@ -231,10 +239,10 @@
         """
         crow = self.apiList.currentRow()
         if crow >= 0:
-            itm = self.apiList.takeItem(crow)       # __IGNORE_WARNING__
+            itm = self.apiList.takeItem(crow)  # __IGNORE_WARNING__
             del itm
         self.prepareApiButton.setEnabled(self.apiList.count() > 0)
-        
+
     @pyqtSlot()
     def on_addInstalledApiFileButton_clicked(self):
         """
@@ -244,54 +252,53 @@
         installedAPIFiles = self.__currentAPI.installedAPIFiles()
         if installedAPIFiles:
             installedAPIFilesPath = pathlib.Path(installedAPIFiles[0]).parent
-            installedAPIFilesShort = [
-                pathlib.Path(f).name for f in installedAPIFiles
-            ]
+            installedAPIFilesShort = [pathlib.Path(f).name for f in installedAPIFiles]
             dlg = EricListSelectionDialog(
                 sorted(installedAPIFilesShort),
                 title=self.tr("Add from installed APIs"),
                 message=self.tr("Select from the list of installed API files"),
                 checkBoxSelection=True,
-                parent=self
+                parent=self,
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                self.apiList.addItems([
-                    str(installedAPIFilesPath / s) for s in dlg.getSelection()
-                ])
+                self.apiList.addItems(
+                    [str(installedAPIFilesPath / s) for s in dlg.getSelection()]
+                )
         else:
             EricMessageBox.warning(
                 self,
                 self.tr("Add from installed APIs"),
-                self.tr("""There are no APIs installed yet."""
-                        """ Selection is not available."""))
+                self.tr(
+                    """There are no APIs installed yet."""
+                    """ Selection is not available."""
+                ),
+            )
             self.addInstalledApiFileButton.setEnabled(False)
         self.prepareApiButton.setEnabled(self.apiList.count() > 0)
-        
+
     @pyqtSlot()
     def on_addPluginApiFileButton_clicked(self):
         """
         Private slot to add an API file from the list of API files installed
         by plugins for the selected lexer language.
         """
-        pluginAPIFiles = self.pluginManager.getPluginApiFiles(
-            self.__currentApiLanguage)
+        pluginAPIFiles = self.pluginManager.getPluginApiFiles(self.__currentApiLanguage)
         pluginAPIFilesDict = {
             pathlib.Path(f).name: pathlib.Path(f) for f in pluginAPIFiles
         }
         dlg = EricListSelectionDialog(
             sorted(pluginAPIFilesDict.keys()),
             title=self.tr("Add from Plugin APIs"),
-            message=self.tr(
-                "Select from the list of API files installed by plugins"),
+            message=self.tr("Select from the list of API files installed by plugins"),
             checkBoxSelection=True,
-            parent=self
+            parent=self,
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            self.apiList.addItems([
-                str(pluginAPIFilesDict[s]) for s in dlg.getSelection()
-            ])
+            self.apiList.addItems(
+                [str(pluginAPIFilesDict[s]) for s in dlg.getSelection()]
+            )
         self.prepareApiButton.setEnabled(self.apiList.count() > 0)
-        
+
     @pyqtSlot()
     def on_prepareApiButton_clicked(self):
         """
@@ -303,9 +310,9 @@
         else:
             if self.__currentAPI is not None:
                 self.__currentAPI.prepareAPIs(
-                    ondemand=True,
-                    rawList=self.__editorGetApisFromApiList())
-        
+                    ondemand=True, rawList=self.__editorGetApisFromApiList()
+                )
+
     def __apiPreparationFinished(self):
         """
         Private method called after the API preparation has finished.
@@ -315,13 +322,13 @@
         self.prepareApiProgressBar.setValue(0)
         self.prepareApiButton.setText(self.tr("Compile APIs"))
         self.__inPreparation = False
-    
+
     def __apiPreparationCancelled(self):
         """
         Private slot called after the API preparation has been cancelled.
         """
         self.__apiPreparationFinished()
-    
+
     def __apiPreparationStarted(self):
         """
         Private method called after the API preparation has started.
@@ -330,64 +337,62 @@
         self.prepareApiProgressBar.setValue(0)
         self.prepareApiButton.setText(self.tr("Cancel compilation"))
         self.__inPreparation = True
-        
+
     def saveState(self):
         """
         Public method to save the current state of the widget.
-        
+
         @return tuple containing the index of the selected lexer language
             and the index of the selected project type
         @rtype tuple of int and int
         """
         return (
             self.apiLanguageComboBox.currentIndex(),
-            self.projectTypeComboBox.currentIndex()
+            self.projectTypeComboBox.currentIndex(),
         )
-        
+
     def setState(self, state):
         """
         Public method to set the state of the widget.
-        
+
         @param state state data generated by saveState
         """
         self.apiLanguageComboBox.setCurrentIndex(state[0])
-        self.on_apiLanguageComboBox_activated(
-            self.apiLanguageComboBox.currentIndex())
-        
+        self.on_apiLanguageComboBox_activated(self.apiLanguageComboBox.currentIndex())
+
         self.projectTypeComboBox.setCurrentIndex(state[1])
         self.on_projectTypeComboBox_activated(state[1])
-    
+
     @pyqtSlot()
     def on_apiList_itemSelectionChanged(self):
         """
         Private slot to react on changes of API selections.
         """
-        self.deleteApiFileButton.setEnabled(
-            len(self.apiList.selectedItems()) > 0)
-    
+        self.deleteApiFileButton.setEnabled(len(self.apiList.selectedItems()) > 0)
+
     @pyqtSlot(str)
     def on_apiFilePicker_textChanged(self, txt):
         """
         Private slot to handle the entering of an API file name.
-        
+
         @param txt text of the line edit (string)
         """
         enable = txt != ""
-        
+
         if enable:
             # check for already added file
             for row in range(self.apiList.count()):
                 if txt == self.apiList.item(row).text():
                     enable = False
                     break
-        
+
         self.addApiFileButton.setEnabled(enable)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorAutoCompletionJediPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorAutoCompletionJediPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,19 +7,19 @@
 Module implementing the Jedi Auto-completion configuration page.
 """
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EditorAutoCompletionJediPage import Ui_EditorAutoCompletionJediPage
 
 import Preferences
 
 
-class EditorAutoCompletionJediPage(ConfigurationPageBase,
-                                   Ui_EditorAutoCompletionJediPage):
+class EditorAutoCompletionJediPage(
+    ConfigurationPageBase, Ui_EditorAutoCompletionJediPage
+):
     """
     Class implementing the Jedi Auto-completion configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,29 +27,32 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorAutoCompletionJediPage")
-        
+
         # set initial values
         self.jediAutocompletionCheckBox.setChecked(
-            Preferences.getJedi("JediCompletionsEnabled"))
+            Preferences.getJedi("JediCompletionsEnabled")
+        )
         self.jediFuzzyAutocompletionCheckBox.setChecked(
-            Preferences.getJedi("JediFuzzyCompletionsEnabled"))
-    
+            Preferences.getJedi("JediFuzzyCompletionsEnabled")
+        )
+
     def save(self):
         """
         Public slot to save the Jedi Auto-completion configuration.
         """
         Preferences.setJedi(
-            "JediCompletionsEnabled",
-            self.jediAutocompletionCheckBox.isChecked())
+            "JediCompletionsEnabled", self.jediAutocompletionCheckBox.isChecked()
+        )
         Preferences.setJedi(
             "JediFuzzyCompletionsEnabled",
-            self.jediFuzzyAutocompletionCheckBox.isChecked())
+            self.jediFuzzyAutocompletionCheckBox.isChecked(),
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorAutocompletionPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorAutocompletionPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,11 +13,11 @@
 import Preferences
 
 
-class EditorAutocompletionPage(ConfigurationPageBase,
-                               Ui_EditorAutocompletionPage):
+class EditorAutocompletionPage(ConfigurationPageBase, Ui_EditorAutocompletionPage):
     """
     Class implementing the Editor Autocompletion configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -25,85 +25,84 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorAutocompletionPage")
-        
+
         # set initial values
         self.acEnabledGroupBox.setChecked(
-            Preferences.getEditor("AutoCompletionEnabled"))
+            Preferences.getEditor("AutoCompletionEnabled")
+        )
         self.acCaseSensitivityCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionCaseSensitivity"))
+            Preferences.getEditor("AutoCompletionCaseSensitivity")
+        )
         self.acReversedCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionReversedList"))
+            Preferences.getEditor("AutoCompletionReversedList")
+        )
         self.acReplaceWordCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionReplaceWord"))
+            Preferences.getEditor("AutoCompletionReplaceWord")
+        )
         self.acThresholdSlider.setValue(
-            Preferences.getEditor("AutoCompletionThreshold"))
+            Preferences.getEditor("AutoCompletionThreshold")
+        )
         self.acScintillaCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionScintillaOnFail"))
-        self.acTimeoutSpinBox.setValue(
-            Preferences.getEditor("AutoCompletionTimeout"))
+            Preferences.getEditor("AutoCompletionScintillaOnFail")
+        )
+        self.acTimeoutSpinBox.setValue(Preferences.getEditor("AutoCompletionTimeout"))
         self.acCacheGroup.setChecked(
-            Preferences.getEditor("AutoCompletionCacheEnabled"))
+            Preferences.getEditor("AutoCompletionCacheEnabled")
+        )
         self.acCacheSizeSpinBox.setValue(
-            Preferences.getEditor("AutoCompletionCacheSize"))
+            Preferences.getEditor("AutoCompletionCacheSize")
+        )
         self.acCacheTimeSpinBox.setValue(
-            Preferences.getEditor("AutoCompletionCacheTime"))
+            Preferences.getEditor("AutoCompletionCacheTime")
+        )
         self.acWatchdogDoubleSpinBox.setValue(
-            Preferences.getEditor("AutoCompletionWatchdogTime") / 1000.0)
-        self.acLinesSlider.setValue(
-            Preferences.getEditor("AutoCompletionMaxLines"))
-        self.acCharSlider.setValue(
-            Preferences.getEditor("AutoCompletionMaxChars"))
-        
+            Preferences.getEditor("AutoCompletionWatchdogTime") / 1000.0
+        )
+        self.acLinesSlider.setValue(Preferences.getEditor("AutoCompletionMaxLines"))
+        self.acCharSlider.setValue(Preferences.getEditor("AutoCompletionMaxChars"))
+
     def save(self):
         """
         Public slot to save the Editor Autocompletion configuration.
         """
         Preferences.setEditor(
-            "AutoCompletionEnabled",
-            self.acEnabledGroupBox.isChecked())
+            "AutoCompletionEnabled", self.acEnabledGroupBox.isChecked()
+        )
         Preferences.setEditor(
-            "AutoCompletionCaseSensitivity",
-            self.acCaseSensitivityCheckBox.isChecked())
-            
+            "AutoCompletionCaseSensitivity", self.acCaseSensitivityCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "AutoCompletionReversedList",
-            self.acReversedCheckBox.isChecked())
-        Preferences.setEditor(
-            "AutoCompletionReplaceWord",
-            self.acReplaceWordCheckBox.isChecked())
+            "AutoCompletionReversedList", self.acReversedCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "AutoCompletionThreshold",
-            self.acThresholdSlider.value())
-        Preferences.setEditor(
-            "AutoCompletionScintillaOnFail",
-            self.acScintillaCheckBox.isChecked())
+            "AutoCompletionReplaceWord", self.acReplaceWordCheckBox.isChecked()
+        )
+        Preferences.setEditor("AutoCompletionThreshold", self.acThresholdSlider.value())
         Preferences.setEditor(
-            "AutoCompletionTimeout",
-            self.acTimeoutSpinBox.value())
+            "AutoCompletionScintillaOnFail", self.acScintillaCheckBox.isChecked()
+        )
+        Preferences.setEditor("AutoCompletionTimeout", self.acTimeoutSpinBox.value())
         Preferences.setEditor(
-            "AutoCompletionCacheEnabled",
-            self.acCacheGroup.isChecked())
-        Preferences.setEditor(
-            "AutoCompletionCacheSize",
-            self.acCacheSizeSpinBox.value())
+            "AutoCompletionCacheEnabled", self.acCacheGroup.isChecked()
+        )
         Preferences.setEditor(
-            "AutoCompletionCacheTime",
-            self.acCacheTimeSpinBox.value())
+            "AutoCompletionCacheSize", self.acCacheSizeSpinBox.value()
+        )
         Preferences.setEditor(
-            "AutoCompletionWatchdogTime",
-            self.acWatchdogDoubleSpinBox.value() * 1000)
+            "AutoCompletionCacheTime", self.acCacheTimeSpinBox.value()
+        )
         Preferences.setEditor(
-            "AutoCompletionMaxLines",
-            self.acLinesSlider.value())
-        Preferences.setEditor(
-            "AutoCompletionMaxChars",
-            self.acCharSlider.value())
-    
+            "AutoCompletionWatchdogTime", self.acWatchdogDoubleSpinBox.value() * 1000
+        )
+        Preferences.setEditor("AutoCompletionMaxLines", self.acLinesSlider.value())
+        Preferences.setEditor("AutoCompletionMaxChars", self.acCharSlider.value())
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorAutocompletionQScintillaPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorAutocompletionQScintillaPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,18 +10,18 @@
 from PyQt6.Qsci import QsciScintilla
 
 from .ConfigurationPageBase import ConfigurationPageBase
-from .Ui_EditorAutocompletionQScintillaPage import (
-    Ui_EditorAutocompletionQScintillaPage
-)
+from .Ui_EditorAutocompletionQScintillaPage import Ui_EditorAutocompletionQScintillaPage
 
 import Preferences
 
 
 class EditorAutocompletionQScintillaPage(
-        ConfigurationPageBase, Ui_EditorAutocompletionQScintillaPage):
+    ConfigurationPageBase, Ui_EditorAutocompletionQScintillaPage
+):
     """
     Class implementing the QScintilla Autocompletion configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -29,13 +29,15 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorAutocompletionQScintillaPage")
-        
+
         # set initial values
         self.acShowSingleCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionShowSingle"))
+            Preferences.getEditor("AutoCompletionShowSingle")
+        )
         self.acFillupsCheckBox.setChecked(
-            Preferences.getEditor("AutoCompletionFillups"))
-        
+            Preferences.getEditor("AutoCompletionFillups")
+        )
+
         acSource = Preferences.getEditor("AutoCompletionSource")
         if acSource == QsciScintilla.AutoCompletionSource.AcsDocument:
             self.acSourceDocumentRadioButton.setChecked(True)
@@ -43,35 +45,35 @@
             self.acSourceAPIsRadioButton.setChecked(True)
         elif acSource == QsciScintilla.AutoCompletionSource.AcsAll:
             self.acSourceAllRadioButton.setChecked(True)
-        
+
     def save(self):
         """
         Public slot to save the Editor Autocompletion configuration.
         """
         Preferences.setEditor(
-            "AutoCompletionShowSingle",
-            self.acShowSingleCheckBox.isChecked())
+            "AutoCompletionShowSingle", self.acShowSingleCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "AutoCompletionFillups",
-            self.acFillupsCheckBox.isChecked())
+            "AutoCompletionFillups", self.acFillupsCheckBox.isChecked()
+        )
         if self.acSourceDocumentRadioButton.isChecked():
             Preferences.setEditor(
-                "AutoCompletionSource",
-                QsciScintilla.AutoCompletionSource.AcsDocument)
+                "AutoCompletionSource", QsciScintilla.AutoCompletionSource.AcsDocument
+            )
         elif self.acSourceAPIsRadioButton.isChecked():
             Preferences.setEditor(
-                "AutoCompletionSource",
-                QsciScintilla.AutoCompletionSource.AcsAPIs)
+                "AutoCompletionSource", QsciScintilla.AutoCompletionSource.AcsAPIs
+            )
         elif self.acSourceAllRadioButton.isChecked():
             Preferences.setEditor(
-                "AutoCompletionSource",
-                QsciScintilla.AutoCompletionSource.AcsAll)
+                "AutoCompletionSource", QsciScintilla.AutoCompletionSource.AcsAll
+            )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorCallTipsJediPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorCallTipsJediPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,9 +7,7 @@
 Module implementing the Jedi Calltips configuration page.
 """
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EditorCallTipsJediPage import Ui_EditorCallTipsJediPage
 
 import Preferences
@@ -19,6 +17,7 @@
     """
     Class implementing the Jedi Calltips configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,23 +25,23 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorCallTipsJediPage")
-        
+
         # set initial values
-        self.jediCalltipsCheckBox.setChecked(
-            Preferences.getJedi("JediCalltipsEnabled"))
-        
+        self.jediCalltipsCheckBox.setChecked(Preferences.getJedi("JediCalltipsEnabled"))
+
     def save(self):
         """
         Public slot to save the Jedi Calltips configuration.
         """
         Preferences.setJedi(
-            "JediCalltipsEnabled", self.jediCalltipsCheckBox.isChecked())
+            "JediCalltipsEnabled", self.jediCalltipsCheckBox.isChecked()
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorCalltipsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorCalltipsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Editor Calltips configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,63 +27,67 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorCalltipsPage")
-        
+
         self.positionComboBox.addItem(
-            self.tr("Below Text"),
-            QsciScintilla.CallTipsPosition.CallTipsBelowText)
+            self.tr("Below Text"), QsciScintilla.CallTipsPosition.CallTipsBelowText
+        )
         self.positionComboBox.addItem(
-            self.tr("Above Text"),
-            QsciScintilla.CallTipsPosition.CallTipsAboveText)
-        
+            self.tr("Above Text"), QsciScintilla.CallTipsPosition.CallTipsAboveText
+        )
+
         # set initial values
-        self.ctEnabledCheckBox.setChecked(
-            Preferences.getEditor("CallTipsEnabled"))
-        
-        self.ctVisibleSlider.setValue(
-            Preferences.getEditor("CallTipsVisible"))
-        
-        self.initColour("CallTipsBackground", self.calltipsBackgroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("CallTipsForeground", self.calltipsForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("CallTipsHighlight", self.calltipsHighlightButton,
-                        Preferences.getEditorColour)
-        
+        self.ctEnabledCheckBox.setChecked(Preferences.getEditor("CallTipsEnabled"))
+
+        self.ctVisibleSlider.setValue(Preferences.getEditor("CallTipsVisible"))
+
+        self.initColour(
+            "CallTipsBackground",
+            self.calltipsBackgroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "CallTipsForeground",
+            self.calltipsForegroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "CallTipsHighlight",
+            self.calltipsHighlightButton,
+            Preferences.getEditorColour,
+        )
+
         self.ctScintillaCheckBox.setChecked(
-            Preferences.getEditor("CallTipsScintillaOnFail"))
-        
+            Preferences.getEditor("CallTipsScintillaOnFail")
+        )
+
         self.positionComboBox.setCurrentIndex(
-            self.positionComboBox.findData(
-                Preferences.getEditor("CallTipsPosition")))
-        
+            self.positionComboBox.findData(Preferences.getEditor("CallTipsPosition"))
+        )
+
     def save(self):
         """
         Public slot to save the EditorCalltips configuration.
         """
-        Preferences.setEditor(
-            "CallTipsEnabled",
-            self.ctEnabledCheckBox.isChecked())
-        
+        Preferences.setEditor("CallTipsEnabled", self.ctEnabledCheckBox.isChecked())
+
+        Preferences.setEditor("CallTipsVisible", self.ctVisibleSlider.value())
+
+        self.saveColours(Preferences.setEditorColour)
+
         Preferences.setEditor(
-            "CallTipsVisible",
-            self.ctVisibleSlider.value())
-        
-        self.saveColours(Preferences.setEditorColour)
-        
-        Preferences.setEditor(
-            "CallTipsScintillaOnFail",
-            self.ctScintillaCheckBox.isChecked())
-        
+            "CallTipsScintillaOnFail", self.ctScintillaCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
             "CallTipsPosition",
-            self.positionComboBox.itemData(
-                self.positionComboBox.currentIndex()))
+            self.positionComboBox.itemData(self.positionComboBox.currentIndex()),
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorCalltipsQScintillaPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorCalltipsQScintillaPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,11 +15,13 @@
 import Preferences
 
 
-class EditorCalltipsQScintillaPage(ConfigurationPageBase,
-                                   Ui_EditorCalltipsQScintillaPage):
+class EditorCalltipsQScintillaPage(
+    ConfigurationPageBase, Ui_EditorCalltipsQScintillaPage
+):
     """
     Class implementing the QScintilla Calltips configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,41 +29,39 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorCalltipsQScintillaPage")
-        
+
         # set initial values
         ctContext = Preferences.getEditor("CallTipsStyle")
         if ctContext == QsciScintilla.CallTipsStyle.CallTipsNoContext:
             self.ctNoContextButton.setChecked(True)
-        elif (
-            ctContext ==
-            QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
-        ):
+        elif ctContext == QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext:
             self.ctNoAutoCompletionButton.setChecked(True)
         elif ctContext == QsciScintilla.CallTipsStyle.CallTipsContext:
             self.ctContextButton.setChecked(True)
-        
+
     def save(self):
         """
         Public slot to save the EditorCalltips configuration.
         """
         if self.ctNoContextButton.isChecked():
             Preferences.setEditor(
-                "CallTipsStyle",
-                QsciScintilla.CallTipsStyle.CallTipsNoContext)
+                "CallTipsStyle", QsciScintilla.CallTipsStyle.CallTipsNoContext
+            )
         elif self.ctNoAutoCompletionButton.isChecked():
             Preferences.setEditor(
                 "CallTipsStyle",
-                QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext)
+                QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext,
+            )
         elif self.ctContextButton.isChecked():
             Preferences.setEditor(
-                "CallTipsStyle",
-                QsciScintilla.CallTipsStyle.CallTipsContext)
+                "CallTipsStyle", QsciScintilla.CallTipsStyle.CallTipsContext
+            )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorDocViewerPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorDocViewerPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Editor Documentation Viewer configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,21 +27,22 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorExportersPage")
-        
+
         try:
             providers = ericApp().getObject("DocuViewer").getProviders()
             for provider, text in providers:
                 self.providerComboBox.addItem(text, provider)
-            
+
             self.infoLabel.clear()
-            
+
             # set initial values
             self.parenthesisCheckBox.setChecked(
-                Preferences.getDocuViewer("ShowInfoOnOpenParenthesis"))
-            
+                Preferences.getDocuViewer("ShowInfoOnOpenParenthesis")
+            )
+
             provider = Preferences.getDocuViewer("Provider")
             self.viewerGroupBox.setChecked(provider != "disabled")
-                
+
             index = self.providerComboBox.findData(provider)
             if index >= 0:
                 self.providerComboBox.setCurrentIndex(index)
@@ -48,11 +50,14 @@
             # documentation viewer is globally disabled
             self.viewerGroupBox.setChecked(False)
             self.viewerGroupBox.setEnabled(False)
-            self.infoLabel.setText(self.tr(
-                "The Documentation Viewer is disabled globally. Re-enable it"
-                " on the Interface/Interface configuration page and restart"
-                " the eric."))
-    
+            self.infoLabel.setText(
+                self.tr(
+                    "The Documentation Viewer is disabled globally. Re-enable it"
+                    " on the Interface/Interface configuration page and restart"
+                    " the eric."
+                )
+            )
+
     def save(self):
         """
         Public slot to save the Editor Typing configuration.
@@ -60,12 +65,11 @@
         enabled = self.viewerGroupBox.isChecked()
         if enabled:
             Preferences.setDocuViewer(
-                "ShowInfoOnOpenParenthesis",
-                self.parenthesisCheckBox.isChecked())
+                "ShowInfoOnOpenParenthesis", self.parenthesisCheckBox.isChecked()
+            )
             Preferences.setDocuViewer(
                 "Provider",
-                self.providerComboBox.itemData(
-                    self.providerComboBox.currentIndex())
+                self.providerComboBox.itemData(self.providerComboBox.currentIndex()),
             )
         else:
             Preferences.setDocuViewer("Provider", "disabled")
@@ -74,7 +78,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorExportersPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorExportersPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Editor Typing configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,158 +28,151 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorExportersPage")
-        
+
         # set initial values
         self.pageIds = {}
-        self.pageIds[' '] = self.stackedWidget.indexOf(self.emptyPage)
-        self.pageIds['HTML'] = self.stackedWidget.indexOf(self.htmlPage)
-        self.pageIds['ODT'] = self.stackedWidget.indexOf(self.odtPage)
-        self.pageIds['PDF'] = self.stackedWidget.indexOf(self.pdfPage)
-        self.pageIds['RTF'] = self.stackedWidget.indexOf(self.rtfPage)
-        self.pageIds['TeX'] = self.stackedWidget.indexOf(self.texPage)
+        self.pageIds[" "] = self.stackedWidget.indexOf(self.emptyPage)
+        self.pageIds["HTML"] = self.stackedWidget.indexOf(self.htmlPage)
+        self.pageIds["ODT"] = self.stackedWidget.indexOf(self.odtPage)
+        self.pageIds["PDF"] = self.stackedWidget.indexOf(self.pdfPage)
+        self.pageIds["RTF"] = self.stackedWidget.indexOf(self.rtfPage)
+        self.pageIds["TeX"] = self.stackedWidget.indexOf(self.texPage)
         exporters = sorted(self.pageIds.keys())
         for exporter in exporters:
             self.exportersCombo.addItem(exporter, self.pageIds[exporter])
-        
+
         self.pdfFontCombo.addItem(self.tr("Courier"), "Courier")
         self.pdfFontCombo.addItem(self.tr("Helvetica"), "Helvetica")
         self.pdfFontCombo.addItem(self.tr("Times"), "Times")
-        
+
         self.pdfPageSizeCombo.addItem(self.tr("A4"), "A4")
         self.pdfPageSizeCombo.addItem(self.tr("Letter"), "Letter")
-        
+
         # HTML
         self.htmlWysiwygCheckBox.setChecked(
-            Preferences.getEditorExporter("HTML/WYSIWYG"))
+            Preferences.getEditorExporter("HTML/WYSIWYG")
+        )
         self.htmlFoldingCheckBox.setChecked(
-            Preferences.getEditorExporter("HTML/Folding"))
+            Preferences.getEditorExporter("HTML/Folding")
+        )
         self.htmlStylesCheckBox.setChecked(
-            Preferences.getEditorExporter("HTML/OnlyStylesUsed"))
+            Preferences.getEditorExporter("HTML/OnlyStylesUsed")
+        )
         self.htmlTitleCheckBox.setChecked(
-            Preferences.getEditorExporter("HTML/FullPathAsTitle"))
-        self.htmlTabsCheckBox.setChecked(
-            Preferences.getEditorExporter("HTML/UseTabs"))
-        
+            Preferences.getEditorExporter("HTML/FullPathAsTitle")
+        )
+        self.htmlTabsCheckBox.setChecked(Preferences.getEditorExporter("HTML/UseTabs"))
+
         # ODT
-        self.odtWysiwygCheckBox.setChecked(
-            Preferences.getEditorExporter("ODT/WYSIWYG"))
+        self.odtWysiwygCheckBox.setChecked(Preferences.getEditorExporter("ODT/WYSIWYG"))
         self.odtStylesCheckBox.setChecked(
-            Preferences.getEditorExporter("ODT/OnlyStylesUsed"))
-        self.odtTabsCheckBox.setChecked(
-            Preferences.getEditorExporter("ODT/UseTabs"))
-        
+            Preferences.getEditorExporter("ODT/OnlyStylesUsed")
+        )
+        self.odtTabsCheckBox.setChecked(Preferences.getEditorExporter("ODT/UseTabs"))
+
         # PDF
         self.pdfMagnificationSlider.setValue(
-            Preferences.getEditorExporter("PDF/Magnification"))
-        ind = self.pdfFontCombo.findData(
-            Preferences.getEditorExporter("PDF/Font"))
+            Preferences.getEditorExporter("PDF/Magnification")
+        )
+        ind = self.pdfFontCombo.findData(Preferences.getEditorExporter("PDF/Font"))
         self.pdfFontCombo.setCurrentIndex(ind)
         ind = self.pdfPageSizeCombo.findData(
-            Preferences.getEditorExporter("PDF/PageSize"))
+            Preferences.getEditorExporter("PDF/PageSize")
+        )
         self.pdfPageSizeCombo.setCurrentIndex(ind)
-        self.pdfMarginTopSpin.setValue(
-            Preferences.getEditorExporter("PDF/MarginTop"))
+        self.pdfMarginTopSpin.setValue(Preferences.getEditorExporter("PDF/MarginTop"))
         self.pdfMarginBottomSpin.setValue(
-            Preferences.getEditorExporter("PDF/MarginBottom"))
-        self.pdfMarginLeftSpin.setValue(
-            Preferences.getEditorExporter("PDF/MarginLeft"))
+            Preferences.getEditorExporter("PDF/MarginBottom")
+        )
+        self.pdfMarginLeftSpin.setValue(Preferences.getEditorExporter("PDF/MarginLeft"))
         self.pdfMarginRightSpin.setValue(
-            Preferences.getEditorExporter("PDF/MarginRight"))
-        
+            Preferences.getEditorExporter("PDF/MarginRight")
+        )
+
         # RTF
-        self.rtfWysiwygCheckBox.setChecked(
-            Preferences.getEditorExporter("RTF/WYSIWYG"))
-        self.rtfTabsCheckBox.setChecked(
-            Preferences.getEditorExporter("RTF/UseTabs"))
+        self.rtfWysiwygCheckBox.setChecked(Preferences.getEditorExporter("RTF/WYSIWYG"))
+        self.rtfTabsCheckBox.setChecked(Preferences.getEditorExporter("RTF/UseTabs"))
         self.rtfFont = Preferences.getEditorExporter("RTF/Font")
         self.rtfFontSample.setFont(self.rtfFont)
-        
+
         # TeX
         self.texStylesCheckBox.setChecked(
-            Preferences.getEditorExporter("TeX/OnlyStylesUsed"))
+            Preferences.getEditorExporter("TeX/OnlyStylesUsed")
+        )
         self.texTitleCheckBox.setChecked(
-            Preferences.getEditorExporter("TeX/FullPathAsTitle"))
-        
+            Preferences.getEditorExporter("TeX/FullPathAsTitle")
+        )
+
         self.on_exportersCombo_activated(0)
-    
+
     def save(self):
         """
         Public slot to save the Editor Typing configuration.
         """
         # HTML
         Preferences.setEditorExporter(
-            "HTML/WYSIWYG",
-            self.htmlWysiwygCheckBox.isChecked())
+            "HTML/WYSIWYG", self.htmlWysiwygCheckBox.isChecked()
+        )
         Preferences.setEditorExporter(
-            "HTML/Folding",
-            self.htmlFoldingCheckBox.isChecked())
+            "HTML/Folding", self.htmlFoldingCheckBox.isChecked()
+        )
         Preferences.setEditorExporter(
-            "HTML/OnlyStylesUsed",
-            self.htmlStylesCheckBox.isChecked())
+            "HTML/OnlyStylesUsed", self.htmlStylesCheckBox.isChecked()
+        )
         Preferences.setEditorExporter(
-            "HTML/FullPathAsTitle",
-            self.htmlTitleCheckBox.isChecked())
-        Preferences.setEditorExporter(
-            "HTML/UseTabs",
-            self.htmlTabsCheckBox.isChecked())
-        
+            "HTML/FullPathAsTitle", self.htmlTitleCheckBox.isChecked()
+        )
+        Preferences.setEditorExporter("HTML/UseTabs", self.htmlTabsCheckBox.isChecked())
+
         # ODT
         Preferences.setEditorExporter(
-            "ODT/WYSIWYG",
-            self.odtWysiwygCheckBox.isChecked())
+            "ODT/WYSIWYG", self.odtWysiwygCheckBox.isChecked()
+        )
         Preferences.setEditorExporter(
-            "ODT/OnlyStylesUsed",
-            self.odtStylesCheckBox.isChecked())
-        Preferences.setEditorExporter(
-            "ODT/UseTabs",
-            self.odtTabsCheckBox.isChecked())
-        
+            "ODT/OnlyStylesUsed", self.odtStylesCheckBox.isChecked()
+        )
+        Preferences.setEditorExporter("ODT/UseTabs", self.odtTabsCheckBox.isChecked())
+
         # PDF
         Preferences.setEditorExporter(
-            "PDF/Magnification",
-            self.pdfMagnificationSlider.value())
+            "PDF/Magnification", self.pdfMagnificationSlider.value()
+        )
         Preferences.setEditorExporter(
-            "PDF/Font",
-            self.pdfFontCombo.itemData(self.pdfFontCombo.currentIndex()))
+            "PDF/Font", self.pdfFontCombo.itemData(self.pdfFontCombo.currentIndex())
+        )
         Preferences.setEditorExporter(
             "PDF/PageSize",
-            self.pdfPageSizeCombo.itemData(
-                self.pdfPageSizeCombo.currentIndex()))
-        Preferences.setEditorExporter(
-            "PDF/MarginTop",
-            self.pdfMarginTopSpin.value())
+            self.pdfPageSizeCombo.itemData(self.pdfPageSizeCombo.currentIndex()),
+        )
+        Preferences.setEditorExporter("PDF/MarginTop", self.pdfMarginTopSpin.value())
         Preferences.setEditorExporter(
-            "PDF/MarginBottom",
-            self.pdfMarginBottomSpin.value())
+            "PDF/MarginBottom", self.pdfMarginBottomSpin.value()
+        )
+        Preferences.setEditorExporter("PDF/MarginLeft", self.pdfMarginLeftSpin.value())
         Preferences.setEditorExporter(
-            "PDF/MarginLeft",
-            self.pdfMarginLeftSpin.value())
-        Preferences.setEditorExporter(
-            "PDF/MarginRight",
-            self.pdfMarginRightSpin.value())
-        
+            "PDF/MarginRight", self.pdfMarginRightSpin.value()
+        )
+
         # RTF
         Preferences.setEditorExporter(
-            "RTF/WYSIWYG",
-            self.rtfWysiwygCheckBox.isChecked())
-        Preferences.setEditorExporter(
-            "RTF/UseTabs",
-            self.rtfTabsCheckBox.isChecked())
+            "RTF/WYSIWYG", self.rtfWysiwygCheckBox.isChecked()
+        )
+        Preferences.setEditorExporter("RTF/UseTabs", self.rtfTabsCheckBox.isChecked())
         Preferences.setEditorExporter("RTF/Font", self.rtfFont)
-        
+
         # TeX
         Preferences.setEditorExporter(
-            "TeX/OnlyStylesUsed",
-            self.texStylesCheckBox.isChecked())
+            "TeX/OnlyStylesUsed", self.texStylesCheckBox.isChecked()
+        )
         Preferences.setEditorExporter(
-            "TeX/FullPathAsTitle",
-            self.texTitleCheckBox.isChecked())
-    
+            "TeX/FullPathAsTitle", self.texTitleCheckBox.isChecked()
+        )
+
     @pyqtSlot(int)
     def on_exportersCombo_activated(self, index):
         """
         Private slot to select the page related to the selected exporter.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -186,9 +180,9 @@
         try:
             index = self.pageIds[exporter]
         except KeyError:
-            index = self.pageIds[' ']
+            index = self.pageIds[" "]
         self.stackedWidget.setCurrentIndex(index)
-    
+
     @pyqtSlot()
     def on_rtfFontButton_clicked(self):
         """
@@ -203,7 +197,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorFilePage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorFilePage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,6 +28,7 @@
     """
     Class implementing the Editor File Handling configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -35,52 +36,57 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorFilePage")
-        
+
         self.__showsOpenFilters = True
-        self.openFileFilters = Preferences.getEditor(
-            "AdditionalOpenFilters")[:]
-        self.saveFileFilters = Preferences.getEditor(
-            "AdditionalSaveFilters")[:]
+        self.openFileFilters = Preferences.getEditor("AdditionalOpenFilters")[:]
+        self.saveFileFilters = Preferences.getEditor("AdditionalSaveFilters")[:]
         self.fileFiltersList.addItems(self.openFileFilters)
-        
+
         self.__setDefaultFiltersLists()
-        
+
         self.defaultEncodingComboBox.addItems(sorted(supportedCodecs))
-        
-        self.previewMarkdownHTMLFormatComboBox.addItems(
-            ["XHTML1", "HTML4", "HTML5"])
-        self.previewRestDocutilsHTMLFormatComboBox.addItems(
-            ["HTML4", "HTML5"])
-        
+
+        self.previewMarkdownHTMLFormatComboBox.addItems(["XHTML1", "HTML4", "HTML5"])
+        self.previewRestDocutilsHTMLFormatComboBox.addItems(["HTML4", "HTML5"])
+
         # set initial values
-        self.autosaveSlider.setValue(
-            Preferences.getEditor("AutosaveInterval"))
+        self.autosaveSlider.setValue(Preferences.getEditor("AutosaveInterval"))
         self.createBackupFileCheckBox.setChecked(
-            Preferences.getEditor("CreateBackupFile"))
+            Preferences.getEditor("CreateBackupFile")
+        )
         self.defaultEncodingComboBox.setCurrentIndex(
             self.defaultEncodingComboBox.findText(
-                Preferences.getEditor("DefaultEncoding")))
+                Preferences.getEditor("DefaultEncoding")
+            )
+        )
         self.advEncodingCheckBox.setChecked(
-            Preferences.getEditor("AdvancedEncodingDetection"))
-        self.warnFilesizeSpinBox.setValue(
-            Preferences.getEditor("WarnFilesize"))
+            Preferences.getEditor("AdvancedEncodingDetection")
+        )
+        self.warnFilesizeSpinBox.setValue(Preferences.getEditor("WarnFilesize"))
         self.clearBreakpointsCheckBox.setChecked(
-            Preferences.getEditor("ClearBreaksOnClose"))
-        self.automaticReopenCheckBox.setChecked(
-            Preferences.getEditor("AutoReopen"))
+            Preferences.getEditor("ClearBreaksOnClose")
+        )
+        self.automaticReopenCheckBox.setChecked(Preferences.getEditor("AutoReopen"))
         self.stripWhitespaceCheckBox.setChecked(
-            Preferences.getEditor("StripTrailingWhitespace"))
+            Preferences.getEditor("StripTrailingWhitespace")
+        )
         self.openFilesFilterComboBox.setCurrentIndex(
             self.openFilesFilterComboBox.findText(
-                Preferences.getEditor("DefaultOpenFilter")))
+                Preferences.getEditor("DefaultOpenFilter")
+            )
+        )
         self.saveFilesFilterComboBox.setCurrentIndex(
             self.saveFilesFilterComboBox.findText(
-                Preferences.getEditor("DefaultSaveFilter")))
+                Preferences.getEditor("DefaultSaveFilter")
+            )
+        )
         self.automaticEolConversionCheckBox.setChecked(
-            Preferences.getEditor("AutomaticEOLConversion"))
+            Preferences.getEditor("AutomaticEOLConversion")
+        )
         self.insertFinalNewlineCheckBox.setChecked(
-            Preferences.getEditor("InsertFinalNewline"))
-        
+            Preferences.getEditor("InsertFinalNewline")
+        )
+
         eolMode = Preferences.getEditor("EOLMode")
         if eolMode == QsciScintilla.EolMode.EolWindows:
             self.crlfRadioButton.setChecked(True)
@@ -88,166 +94,181 @@
             self.crRadioButton.setChecked(True)
         elif eolMode == QsciScintilla.EolMode.EolUnix:
             self.lfRadioButton.setChecked(True)
-        
+
         self.previewRefreshTimeoutSpinBox.setValue(
-            Preferences.getEditor("PreviewRefreshWaitTimer"))
-        
+            Preferences.getEditor("PreviewRefreshWaitTimer")
+        )
+
         self.previewHtmlExtensionsEdit.setText(
-            " ".join(Preferences.getEditor("PreviewHtmlFileNameExtensions")))
-        
+            " ".join(Preferences.getEditor("PreviewHtmlFileNameExtensions"))
+        )
+
         self.previewMarkdownExtensionsEdit.setText(
-            " ".join(
-                Preferences.getEditor("PreviewMarkdownFileNameExtensions")))
+            " ".join(Preferences.getEditor("PreviewMarkdownFileNameExtensions"))
+        )
         self.previewRestSphinxCheckBox.setChecked(
-            Preferences.getEditor("PreviewRestUseSphinx"))
+            Preferences.getEditor("PreviewRestUseSphinx")
+        )
         self.previewMarkdownNLtoBreakCheckBox.setChecked(
-            Preferences.getEditor("PreviewMarkdownNLtoBR"))
+            Preferences.getEditor("PreviewMarkdownNLtoBR")
+        )
         self.previewMarkdownPyMdownCheckBox.setChecked(
-            Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions"))
+            Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions")
+        )
         self.previewMarkdownMathJaxCheckBox.setChecked(
-            Preferences.getEditor("PreviewMarkdownMathJax"))
+            Preferences.getEditor("PreviewMarkdownMathJax")
+        )
         self.previewMarkdownMermaidCheckBox.setChecked(
-            Preferences.getEditor("PreviewMarkdownMermaid"))
+            Preferences.getEditor("PreviewMarkdownMermaid")
+        )
         index = self.previewMarkdownHTMLFormatComboBox.findText(
-            Preferences.getEditor("PreviewMarkdownHTMLFormat"))
+            Preferences.getEditor("PreviewMarkdownHTMLFormat")
+        )
         self.previewMarkdownHTMLFormatComboBox.setCurrentIndex(index)
-        
+
         self.previewRestExtensionsEdit.setText(
-            " ".join(Preferences.getEditor("PreviewRestFileNameExtensions")))
+            " ".join(Preferences.getEditor("PreviewRestFileNameExtensions"))
+        )
         index = self.previewRestDocutilsHTMLFormatComboBox.findText(
-            Preferences.getEditor("PreviewRestDocutilsHTMLFormat"))
+            Preferences.getEditor("PreviewRestDocutilsHTMLFormat")
+        )
         self.previewRestDocutilsHTMLFormatComboBox.setCurrentIndex(index)
-        
+
         self.previewQssExtensionsEdit.setText(
-            " ".join(Preferences.getEditor("PreviewQssFileNameExtensions")))
-        
+            " ".join(Preferences.getEditor("PreviewQssFileNameExtensions"))
+        )
+
     def save(self):
         """
         Public slot to save the Editor File Handling configuration.
         """
+        Preferences.setEditor("AutosaveInterval", self.autosaveSlider.value())
         Preferences.setEditor(
-            "AutosaveInterval",
-            self.autosaveSlider.value())
-        Preferences.setEditor(
-            "CreateBackupFile",
-            self.createBackupFileCheckBox.isChecked())
+            "CreateBackupFile", self.createBackupFileCheckBox.isChecked()
+        )
         enc = self.defaultEncodingComboBox.currentText()
         if not enc:
             enc = "utf-8"
         Preferences.setEditor("DefaultEncoding", enc)
         Preferences.setEditor(
-            "AdvancedEncodingDetection",
-            self.advEncodingCheckBox.isChecked())
-        Preferences.setEditor(
-            "WarnFilesize",
-            self.warnFilesizeSpinBox.value())
+            "AdvancedEncodingDetection", self.advEncodingCheckBox.isChecked()
+        )
+        Preferences.setEditor("WarnFilesize", self.warnFilesizeSpinBox.value())
         Preferences.setEditor(
-            "ClearBreaksOnClose",
-            self.clearBreakpointsCheckBox.isChecked())
+            "ClearBreaksOnClose", self.clearBreakpointsCheckBox.isChecked()
+        )
+        Preferences.setEditor("AutoReopen", self.automaticReopenCheckBox.isChecked())
         Preferences.setEditor(
-            "AutoReopen",
-            self.automaticReopenCheckBox.isChecked())
+            "StripTrailingWhitespace", self.stripWhitespaceCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "StripTrailingWhitespace",
-            self.stripWhitespaceCheckBox.isChecked())
+            "DefaultOpenFilter", self.openFilesFilterComboBox.currentText()
+        )
         Preferences.setEditor(
-            "DefaultOpenFilter",
-            self.openFilesFilterComboBox.currentText())
+            "DefaultSaveFilter", self.saveFilesFilterComboBox.currentText()
+        )
         Preferences.setEditor(
-            "DefaultSaveFilter",
-            self.saveFilesFilterComboBox.currentText())
+            "AutomaticEOLConversion", self.automaticEolConversionCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "AutomaticEOLConversion",
-            self.automaticEolConversionCheckBox.isChecked())
-        Preferences.setEditor(
-            "InsertFinalNewline",
-            self.insertFinalNewlineCheckBox.isChecked())
-        
+            "InsertFinalNewline", self.insertFinalNewlineCheckBox.isChecked()
+        )
+
         if self.crlfRadioButton.isChecked():
             Preferences.setEditor("EOLMode", QsciScintilla.EolMode.EolWindows)
         elif self.crRadioButton.isChecked():
             Preferences.setEditor("EOLMode", QsciScintilla.EolMode.EolMac)
         elif self.lfRadioButton.isChecked():
             Preferences.setEditor("EOLMode", QsciScintilla.EolMode.EolUnix)
-        
+
         self.__extractFileFilters()
         Preferences.setEditor("AdditionalOpenFilters", self.openFileFilters)
         Preferences.setEditor("AdditionalSaveFilters", self.saveFileFilters)
-        
+
         Preferences.setEditor(
-            "PreviewRefreshWaitTimer",
-            self.previewRefreshTimeoutSpinBox.value())
-        
+            "PreviewRefreshWaitTimer", self.previewRefreshTimeoutSpinBox.value()
+        )
+
         Preferences.setEditor(
             "PreviewHtmlFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewHtmlExtensionsEdit.text().split()])
-        
+            [ext.strip() for ext in self.previewHtmlExtensionsEdit.text().split()],
+        )
+
         Preferences.setEditor(
             "PreviewMarkdownFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewMarkdownExtensionsEdit.text().split()])
+            [ext.strip() for ext in self.previewMarkdownExtensionsEdit.text().split()],
+        )
         Preferences.setEditor(
-            "PreviewRestUseSphinx",
-            self.previewRestSphinxCheckBox.isChecked())
+            "PreviewRestUseSphinx", self.previewRestSphinxCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PreviewMarkdownNLtoBR",
-            self.previewMarkdownNLtoBreakCheckBox.isChecked())
+            "PreviewMarkdownNLtoBR", self.previewMarkdownNLtoBreakCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "PreviewMarkdownUsePyMdownExtensions",
-            self.previewMarkdownPyMdownCheckBox.isChecked())
+            self.previewMarkdownPyMdownCheckBox.isChecked(),
+        )
         Preferences.setEditor(
-            "PreviewMarkdownMathJax",
-            self.previewMarkdownMathJaxCheckBox.isChecked())
+            "PreviewMarkdownMathJax", self.previewMarkdownMathJaxCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PreviewMarkdownMermaid",
-            self.previewMarkdownMermaidCheckBox.isChecked())
+            "PreviewMarkdownMermaid", self.previewMarkdownMermaidCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "PreviewMarkdownHTMLFormat",
-            self.previewMarkdownHTMLFormatComboBox.currentText())
-        
+            self.previewMarkdownHTMLFormatComboBox.currentText(),
+        )
+
         Preferences.setEditor(
             "PreviewRestFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewRestExtensionsEdit.text().split()])
+            [ext.strip() for ext in self.previewRestExtensionsEdit.text().split()],
+        )
         Preferences.setEditor(
             "PreviewRestDocutilsHTMLFormat",
-            self.previewRestDocutilsHTMLFormatComboBox.currentText())
-        
+            self.previewRestDocutilsHTMLFormatComboBox.currentText(),
+        )
+
         Preferences.setEditor(
             "PreviewQssFileNameExtensions",
-            [ext.strip() for ext in
-             self.previewQssExtensionsEdit.text().split()])
-    
+            [ext.strip() for ext in self.previewQssExtensionsEdit.text().split()],
+        )
+
     def __setDefaultFiltersLists(self, keepSelection=False):
         """
         Private slot to set the default file filter combo boxes.
-        
+
         @param keepSelection flag indicating to keep the current selection
             if possible (boolean)
         """
         if keepSelection:
             selectedOpenFilter = self.openFilesFilterComboBox.currentText()
             selectedSaveFilter = self.saveFilesFilterComboBox.currentText()
-        
+
         import QScintilla.Lexers
-        openFileFiltersList = QScintilla.Lexers.getOpenFileFiltersList(
-            False, withAdditional=False) + self.openFileFilters
+
+        openFileFiltersList = (
+            QScintilla.Lexers.getOpenFileFiltersList(False, withAdditional=False)
+            + self.openFileFilters
+        )
         openFileFiltersList.sort()
         self.openFilesFilterComboBox.clear()
         self.openFilesFilterComboBox.addItems(openFileFiltersList)
-        saveFileFiltersList = QScintilla.Lexers.getSaveFileFiltersList(
-            False, withAdditional=False) + self.saveFileFilters
+        saveFileFiltersList = (
+            QScintilla.Lexers.getSaveFileFiltersList(False, withAdditional=False)
+            + self.saveFileFilters
+        )
         saveFileFiltersList.sort()
         self.saveFilesFilterComboBox.clear()
         self.saveFilesFilterComboBox.addItems(saveFileFiltersList)
-        
+
         if keepSelection:
             self.openFilesFilterComboBox.setCurrentIndex(
-                self.openFilesFilterComboBox.findText(selectedOpenFilter))
+                self.openFilesFilterComboBox.findText(selectedOpenFilter)
+            )
             self.saveFilesFilterComboBox.setCurrentIndex(
-                self.saveFilesFilterComboBox.findText(selectedSaveFilter))
-    
+                self.saveFilesFilterComboBox.findText(selectedSaveFilter)
+            )
+
     def __extractFileFilters(self):
         """
         Private method to extract the file filters.
@@ -259,36 +280,38 @@
             self.openFileFilters = filters
         else:
             self.saveFileFilters = filters
-    
+
     def __checkFileFilter(self, fileFilter):
         """
         Private method to check a file filter for validity.
-        
+
         @param fileFilter file filter pattern to check (string)
         @return flag indicating validity (boolean)
         """
-        if (
-            not self.__showsOpenFilters and
-            fileFilter.count("*") != 1
-        ):
+        if not self.__showsOpenFilters and fileFilter.count("*") != 1:
             EricMessageBox.critical(
                 self,
                 self.tr("Add File Filter"),
-                self.tr("""A Save File Filter must contain exactly one"""
-                        """ wildcard pattern. Yours contains {0}.""")
-                .format(fileFilter.count("*")))
+                self.tr(
+                    """A Save File Filter must contain exactly one"""
+                    """ wildcard pattern. Yours contains {0}."""
+                ).format(fileFilter.count("*")),
+            )
             return False
-        
+
         if fileFilter.count("*") == 0:
             EricMessageBox.critical(
                 self,
                 self.tr("Add File Filter"),
-                self.tr("""A File Filter must contain at least one"""
-                        """ wildcard pattern."""))
+                self.tr(
+                    """A File Filter must contain at least one"""
+                    """ wildcard pattern."""
+                ),
+            )
             return False
-        
+
         return True
-    
+
     @pyqtSlot()
     def on_addFileFilterButton_clicked(self):
         """
@@ -298,12 +321,13 @@
             self,
             self.tr("Add File Filter"),
             self.tr("Enter the file filter entry:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and fileFilter and self.__checkFileFilter(fileFilter):
             self.fileFiltersList.addItem(fileFilter)
             self.__extractFileFilters()
             self.__setDefaultFiltersLists(keepSelection=True)
-    
+
     @pyqtSlot()
     def on_editFileFilterButton_clicked(self):
         """
@@ -315,12 +339,13 @@
             self.tr("Add File Filter"),
             self.tr("Enter the file filter entry:"),
             QLineEdit.EchoMode.Normal,
-            fileFilter)
+            fileFilter,
+        )
         if ok and fileFilter and self.__checkFileFilter(fileFilter):
             self.fileFiltersList.currentItem().setText(fileFilter)
             self.__extractFileFilters()
             self.__setDefaultFiltersLists(keepSelection=True)
-    
+
     @pyqtSlot()
     def on_deleteFileFilterButton_clicked(self):
         """
@@ -329,12 +354,12 @@
         self.fileFiltersList.takeItem(self.fileFiltersList.currentRow())
         self.__extractFileFilters()
         self.__setDefaultFiltersLists(keepSelection=True)
-    
+
     @pyqtSlot(bool)
     def on_openFiltersButton_toggled(self, checked):
         """
         Private slot to switch the list of file filters.
-        
+
         @param checked flag indicating the check state of the button (boolean)
         """
         self.__extractFileFilters()
@@ -344,34 +369,36 @@
             self.fileFiltersList.addItems(self.openFileFilters)
         else:
             self.fileFiltersList.addItems(self.saveFileFilters)
-    
+
     @pyqtSlot(QListWidgetItem, QListWidgetItem)
     def on_fileFiltersList_currentItemChanged(self, current, previous):
         """
         Private slot to set the state of the edit and delete buttons.
-        
+
         @param current new current item (QListWidgetItem)
         @param previous previous current item (QListWidgetItem)
         """
         self.editFileFilterButton.setEnabled(current is not None)
         self.deleteFileFilterButton.setEnabled(current is not None)
-    
+
     @pyqtSlot()
     def on_previewMarkdownPyMdownInstallPushButton_clicked(self):
         """
         Private slot to install the pymdown extensions package via pip.
         """
         pip = ericApp().getObject("Pip")
-        pip.installPackages(["pymdown-extensions"],
-                            interpreter=Globals.getPythonExecutable())
+        pip.installPackages(
+            ["pymdown-extensions"], interpreter=Globals.getPythonExecutable()
+        )
         self.polishPage()
-        
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
         """
         try:
-            import pymdownx     # __IGNORE_WARNING__
+            import pymdownx  # __IGNORE_WARNING__
+
             self.previewMarkdownPyMdownInstallPushButton.setEnabled(False)
             del sys.modules["pymdownx"]
         except ImportError:
@@ -381,7 +408,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorGeneralPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorGeneralPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,9 +15,7 @@
 
 from .ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EditorGeneralPage import Ui_EditorGeneralPage
-from .EditorLanguageTabIndentOverrideDialog import (
-    EditorLanguageTabIndentOverrideDialog
-)
+from .EditorLanguageTabIndentOverrideDialog import EditorLanguageTabIndentOverrideDialog
 
 from QScintilla.DocstringGenerator import getSupportedDocstringTypes
 
@@ -29,6 +27,7 @@
     """
     Class implementing the Editor General configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -36,132 +35,115 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorGeneralPage")
-        
+
         self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.deleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.editButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
-        for docstringType, docstringStyle in sorted(
-            getSupportedDocstringTypes()
-        ):
+
+        for docstringType, docstringStyle in sorted(getSupportedDocstringTypes()):
             self.docstringStyleComboBox.addItem(docstringStyle, docstringType)
-        
+
         # set initial values
-        self.tabwidthSlider.setValue(
-            Preferences.getEditor("TabWidth"))
-        self.indentwidthSlider.setValue(
-            Preferences.getEditor("IndentWidth"))
+        self.tabwidthSlider.setValue(Preferences.getEditor("TabWidth"))
+        self.indentwidthSlider.setValue(Preferences.getEditor("IndentWidth"))
         self.tabforindentationCheckBox.setChecked(
-            Preferences.getEditor("TabForIndentation"))
-        self.tabindentsCheckBox.setChecked(
-            Preferences.getEditor("TabIndents"))
-        self.converttabsCheckBox.setChecked(
-            Preferences.getEditor("ConvertTabsOnLoad"))
-        self.autoindentCheckBox.setChecked(
-            Preferences.getEditor("AutoIndentation"))
-        self.comment0CheckBox.setChecked(
-            Preferences.getEditor("CommentColumn0"))
-        
+            Preferences.getEditor("TabForIndentation")
+        )
+        self.tabindentsCheckBox.setChecked(Preferences.getEditor("TabIndents"))
+        self.converttabsCheckBox.setChecked(Preferences.getEditor("ConvertTabsOnLoad"))
+        self.autoindentCheckBox.setChecked(Preferences.getEditor("AutoIndentation"))
+        self.comment0CheckBox.setChecked(Preferences.getEditor("CommentColumn0"))
+
         self.sourceOutlineGroupBox.setChecked(
-            Preferences.getEditor("ShowSourceOutline"))
+            Preferences.getEditor("ShowSourceOutline")
+        )
         self.sourceOutlineWidthSpinBox.setValue(
-            Preferences.getEditor("SourceOutlineWidth"))
+            Preferences.getEditor("SourceOutlineWidth")
+        )
         self.sourceOutlineWidthStepSpinBox.setValue(
-            Preferences.getEditor("SourceOutlineStepSize"))
+            Preferences.getEditor("SourceOutlineStepSize")
+        )
         self.sourceOutlineShowCodingCheckBox.setChecked(
-            Preferences.getEditor("SourceOutlineShowCoding"))
-        
+            Preferences.getEditor("SourceOutlineShowCoding")
+        )
+
         index = self.docstringStyleComboBox.findData(
-            Preferences.getEditor("DocstringType"))
+            Preferences.getEditor("DocstringType")
+        )
         self.docstringStyleComboBox.setCurrentIndex(index)
         self.docstringCompletionCheckBox.setChecked(
-            Preferences.getEditor("DocstringAutoGenerate"))
-        
-        self.mouseHoverHelpGroupBox.setChecked(
-            Preferences.getEditor("MouseHoverHelp"))
-        self.mouseDwellTimeSpinBox.setValue(
-            Preferences.getEditor("MouseHoverTimeout"))
-        
+            Preferences.getEditor("DocstringAutoGenerate")
+        )
+
+        self.mouseHoverHelpGroupBox.setChecked(Preferences.getEditor("MouseHoverHelp"))
+        self.mouseDwellTimeSpinBox.setValue(Preferences.getEditor("MouseHoverTimeout"))
+
         virtualSpaceOptions = Preferences.getEditor("VirtualSpaceOptions")
         self.vsSelectionCheckBox.setChecked(
-            virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION)
+            virtualSpaceOptions & QsciScintillaBase.SCVS_RECTANGULARSELECTION
+        )
         self.vsUserCheckBox.setChecked(
-            virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE)
-        
+            virtualSpaceOptions & QsciScintillaBase.SCVS_USERACCESSIBLE
+        )
+
         self.__populateLanguageOverrideWidget()
-    
+
     def save(self):
         """
         Public slot to save the Editor General configuration.
         """
-        Preferences.setEditor(
-            "TabWidth",
-            self.tabwidthSlider.value())
-        Preferences.setEditor(
-            "IndentWidth",
-            self.indentwidthSlider.value())
-        Preferences.setEditor(
-            "TabForIndentation",
-            self.tabforindentationCheckBox.isChecked())
+        Preferences.setEditor("TabWidth", self.tabwidthSlider.value())
+        Preferences.setEditor("IndentWidth", self.indentwidthSlider.value())
         Preferences.setEditor(
-            "TabIndents",
-            self.tabindentsCheckBox.isChecked())
-        Preferences.setEditor(
-            "ConvertTabsOnLoad",
-            self.converttabsCheckBox.isChecked())
+            "TabForIndentation", self.tabforindentationCheckBox.isChecked()
+        )
+        Preferences.setEditor("TabIndents", self.tabindentsCheckBox.isChecked())
+        Preferences.setEditor("ConvertTabsOnLoad", self.converttabsCheckBox.isChecked())
+        Preferences.setEditor("AutoIndentation", self.autoindentCheckBox.isChecked())
+        Preferences.setEditor("CommentColumn0", self.comment0CheckBox.isChecked())
+
         Preferences.setEditor(
-            "AutoIndentation",
-            self.autoindentCheckBox.isChecked())
+            "ShowSourceOutline", self.sourceOutlineGroupBox.isChecked()
+        )
         Preferences.setEditor(
-            "CommentColumn0",
-            self.comment0CheckBox.isChecked())
-        
+            "SourceOutlineWidth", self.sourceOutlineWidthSpinBox.value()
+        )
         Preferences.setEditor(
-            "ShowSourceOutline",
-            self.sourceOutlineGroupBox.isChecked())
-        Preferences.setEditor(
-            "SourceOutlineWidth",
-            self.sourceOutlineWidthSpinBox.value())
+            "SourceOutlineStepSize", self.sourceOutlineWidthStepSpinBox.value()
+        )
         Preferences.setEditor(
-            "SourceOutlineStepSize",
-            self.sourceOutlineWidthStepSpinBox.value())
-        Preferences.setEditor(
-            "SourceOutlineShowCoding",
-            self.sourceOutlineShowCodingCheckBox.isChecked())
-        
+            "SourceOutlineShowCoding", self.sourceOutlineShowCodingCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "DocstringType",
-            self.docstringStyleComboBox.currentData())
-        Preferences.setEditor(
-            "DocstringAutoGenerate",
-            self.docstringCompletionCheckBox.isChecked())
-        
+            "DocstringType", self.docstringStyleComboBox.currentData()
+        )
         Preferences.setEditor(
-            "MouseHoverHelp",
-            self.mouseHoverHelpGroupBox.isChecked())
-        Preferences.setEditor(
-            "MouseHoverTimeout",
-            self.mouseDwellTimeSpinBox.value())
-        
+            "DocstringAutoGenerate", self.docstringCompletionCheckBox.isChecked()
+        )
+
+        Preferences.setEditor("MouseHoverHelp", self.mouseHoverHelpGroupBox.isChecked())
+        Preferences.setEditor("MouseHoverTimeout", self.mouseDwellTimeSpinBox.value())
+
         virtualSpaceOptions = QsciScintillaBase.SCVS_NONE
         if self.vsSelectionCheckBox.isChecked():
             virtualSpaceOptions |= QsciScintillaBase.SCVS_RECTANGULARSELECTION
         if self.vsUserCheckBox.isChecked():
             virtualSpaceOptions |= QsciScintillaBase.SCVS_USERACCESSIBLE
         Preferences.setEditor("VirtualSpaceOptions", virtualSpaceOptions)
-        
+
         self.__saveLanguageOverrides()
-        
+
     def on_tabforindentationCheckBox_toggled(self, checked):
         """
         Private slot used to set the tab conversion check box.
-        
+
         @param checked flag received from the signal (boolean)
         """
         if checked and self.converttabsCheckBox.isChecked():
             self.converttabsCheckBox.setChecked(not checked)
         self.converttabsCheckBox.setEnabled(not checked)
-    
+
     def __populateLanguageOverrideWidget(self):
         """
         Private method to populate the language specific indentation and tab
@@ -173,11 +155,11 @@
         self.languageOverrideWidget.sortItems(0, Qt.SortOrder.AscendingOrder)
         self.__resizeOverrideColumns()
         self.on_languageOverrideWidget_itemSelectionChanged()
-    
+
     def __createOverrideItem(self, language, tabWidth, indentWidth):
         """
         Private method to create an entry for a language override.
-        
+
         @param language name of the language
         @type str
         @param tabWidth tabulator width
@@ -185,21 +167,22 @@
         @param indentWidth indentation width
         @type int
         """
-        itm = QTreeWidgetItem(self.languageOverrideWidget, [
-            language,
-            "{0:2d}".format(tabWidth),
-            "{0:2d}".format(indentWidth)])
+        itm = QTreeWidgetItem(
+            self.languageOverrideWidget,
+            [language, "{0:2d}".format(tabWidth), "{0:2d}".format(indentWidth)],
+        )
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter)
-        
+
     def __resizeOverrideColumns(self):
         """
         Private method to resize the list columns.
         """
         self.languageOverrideWidget.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.languageOverrideWidget.header().setStretchLastSection(True)
-    
+
     def __saveLanguageOverrides(self):
         """
         Private method to save the language specific indentation and tab width
@@ -213,19 +196,21 @@
                 int(itm.text(1)),
                 int(itm.text(2)),
             ]
-        
+
         Preferences.setEditor("TabIndentOverride", overrides)
-    
+
     @pyqtSlot()
     def on_languageOverrideWidget_itemSelectionChanged(self):
         """
         Private slot handling a change of the override selection.
         """
         self.deleteButton.setEnabled(
-            len(self.languageOverrideWidget.selectedItems()) > 0)
+            len(self.languageOverrideWidget.selectedItems()) > 0
+        )
         self.editButton.setEnabled(
-            len(self.languageOverrideWidget.selectedItems()) == 1)
-    
+            len(self.languageOverrideWidget.selectedItems()) == 1
+        )
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -244,10 +229,9 @@
         if dlg.exec() == QDialog.DialogCode.Accepted:
             language, tabWidth, indentWidth = dlg.getData()
             self.__createOverrideItem(language, tabWidth, indentWidth)
-            self.languageOverrideWidget.sortItems(
-                0, Qt.SortOrder.AscendingOrder)
+            self.languageOverrideWidget.sortItems(0, Qt.SortOrder.AscendingOrder)
             self.__resizeOverrideColumns()
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -256,13 +240,14 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Tab and Indent Override"),
-            self.tr("""Shall the selected entries really be removed?"""))
+            self.tr("""Shall the selected entries really be removed?"""),
+        )
         if ok:
             for itm in self.languageOverrideWidget.selectedItems():
                 index = self.languageOverrideWidget.indexOfTopLevelItem(itm)
                 self.languageOverrideWidget.takeTopLevelItem(index)
                 del itm
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -284,7 +269,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorHighlightersPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorHighlightersPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,61 +25,59 @@
     """
     Class implementing the Editor Highlighter Associations configuration page.
     """
+
     def __init__(self, lexers):
         """
         Constructor
-        
+
         @param lexers reference to the lexers dictionary
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorHighlightersPage")
-        
+
         self.editorLexerList.headerItem().setText(
-            self.editorLexerList.columnCount(), "")
+            self.editorLexerList.columnCount(), ""
+        )
         header = self.editorLexerList.header()
         header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         try:
             self.extsep = os.extsep
         except AttributeError:
             self.extsep = "."
-        
+
         import QScintilla.Lexers
+
         self.extras = ["-----------", self.tr("Alternative")]
         self.editorLexerCombo.addItem("")
-        self.editorLexerCombo.addItem(
-            UI.PixmapCache.getIcon("fileText"),
-            "Text"
-        )
+        self.editorLexerCombo.addItem(UI.PixmapCache.getIcon("fileText"), "Text")
         for lang in sorted(lexers.keys()):
             self.editorLexerCombo.addItem(
-                QScintilla.Lexers.getLanguageIcon(lang, False),
-                lang
+                QScintilla.Lexers.getLanguageIcon(lang, False), lang
             )
         self.editorLexerCombo.addItems(self.extras)
-        
-        pygmentsLexers = [''] + sorted(lex[0] for lex in get_all_lexers())
+
+        pygmentsLexers = [""] + sorted(lex[0] for lex in get_all_lexers())
         self.pygmentsLexerCombo.addItems(pygmentsLexers)
-        
+
         # set initial values
         lexerAssocs = Preferences.getEditorLexerAssocs()
         for ext in lexerAssocs:
             QTreeWidgetItem(self.editorLexerList, [ext, lexerAssocs[ext]])
         self.editorLexerList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
     def save(self):
         """
         Public slot to save the Editor Highlighter Associations configuration.
         """
         lexerAssocs = {}
-        for index in range(
-                self.editorLexerList.topLevelItemCount()):
+        for index in range(self.editorLexerList.topLevelItemCount()):
             itm = self.editorLexerList.topLevelItem(index)
             lexerAssocs[itm.text(0)] = itm.text(1)
         Preferences.setEditorLexerAssocs(lexerAssocs)
-        
+
     @pyqtSlot()
     def on_addLexerButton_clicked(self):
         """
@@ -96,8 +94,7 @@
             else:
                 lexer = "Pygments|{0}".format(pygmentsLexer)
         if ext and lexer:
-            itmList = self.editorLexerList.findItems(
-                ext, Qt.MatchFlag.MatchExactly, 0)
+            itmList = self.editorLexerList.findItems(ext, Qt.MatchFlag.MatchExactly, 0)
             if itmList:
                 index = self.editorLexerList.indexOfTopLevelItem(itmList[0])
                 itm = self.editorLexerList.takeTopLevelItem(index)
@@ -109,8 +106,9 @@
             self.pygmentsLexerCombo.setCurrentIndex(0)
             self.editorLexerList.sortItems(
                 self.editorLexerList.sortColumn(),
-                self.editorLexerList.header().sortIndicatorOrder())
-        
+                self.editorLexerList.header().sortIndicatorOrder(),
+            )
+
     @pyqtSlot()
     def on_deleteLexerButton_clicked(self):
         """
@@ -123,16 +121,16 @@
             itm = self.editorLexerList.takeTopLevelItem(index)
             # __IGNORE_WARNING__
             del itm
-            
+
             self.editorLexerList.clearSelection()
             self.editorFileExtEdit.clear()
             self.editorLexerCombo.setCurrentIndex(0)
-        
+
     def on_editorLexerList_itemClicked(self, itm, column):
         """
         Private slot to handle the clicked signal of the lexer association
         list.
-        
+
         @param itm reference to the selecte item (QTreeWidgetItem)
         @param column column the item was clicked or activated (integer)
             (ignored)
@@ -153,23 +151,23 @@
             index = self.editorLexerCombo.findText(lexer)
             self.editorLexerCombo.setCurrentIndex(index)
             self.pygmentsLexerCombo.setCurrentIndex(pygmentsIndex)
-        
+
     def on_editorLexerList_itemActivated(self, itm, column):
         """
         Private slot to handle the activated signal of the lexer association
         list.
-        
+
         @param itm reference to the selecte item (QTreeWidgetItem)
         @param column column the item was clicked or activated (integer)
             (ignored)
         """
         self.on_editorLexerList_itemClicked(itm, column)
-    
+
     @pyqtSlot(int)
     def on_editorLexerCombo_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a lexer.
-        
+
         @param index index of the current item
         @type int
         """
@@ -185,7 +183,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,12 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QFile, QIODevice
 from PyQt6.QtGui import QFont, QColor
 from PyQt6.QtWidgets import (
-    QColorDialog, QFontDialog, QInputDialog, QMenu, QTreeWidgetItem, QDialog
+    QColorDialog,
+    QFontDialog,
+    QInputDialog,
+    QMenu,
+    QTreeWidgetItem,
+    QDialog,
 )
 
 from .ConfigurationPageBase import ConfigurationPageBase
@@ -24,41 +29,42 @@
 import UI.PixmapCache
 
 
-class EditorHighlightingStylesPage(ConfigurationPageBase,
-                                   Ui_EditorHighlightingStylesPage):
+class EditorHighlightingStylesPage(
+    ConfigurationPageBase, Ui_EditorHighlightingStylesPage
+):
     """
     Class implementing the Editor Highlighting Styles configuration page.
     """
+
     FAMILYONLY = 0
     SIZEONLY = 1
     FAMILYANDSIZE = 2
     FONT = 99
-    
+
     StyleRole = Qt.ItemDataRole.UserRole + 1
     SubstyleRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, lexers):
         """
         Constructor
-        
+
         @param lexers reference to the lexers dictionary
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorHighlightingStylesPage")
-        
+
         self.defaultSubstylesButton.setIcon(UI.PixmapCache.getIcon("editUndo"))
         self.addSubstyleButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.deleteSubstyleButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.editSubstyleButton.setIcon(UI.PixmapCache.getIcon("edit"))
         self.copySubstyleButton.setIcon(UI.PixmapCache.getIcon("editCopy"))
-        
+
         self.__fontButtonMenu = QMenu()
         act = self.__fontButtonMenu.addAction(self.tr("Font"))
         act.setData(self.FONT)
         self.__fontButtonMenu.addSeparator()
-        act = self.__fontButtonMenu.addAction(
-            self.tr("Family and Size only"))
+        act = self.__fontButtonMenu.addAction(self.tr("Family and Size only"))
         act.setData(self.FAMILYANDSIZE)
         act = self.__fontButtonMenu.addAction(self.tr("Family only"))
         act.setData(self.FAMILYONLY)
@@ -66,69 +72,68 @@
         act.setData(self.SIZEONLY)
         self.__fontButtonMenu.triggered.connect(self.__fontButtonMenuTriggered)
         self.fontButton.setMenu(self.__fontButtonMenu)
-        
+
         self.__allFontsButtonMenu = QMenu()
         act = self.__allFontsButtonMenu.addAction(self.tr("Font"))
         act.setData(self.FONT)
         self.__allFontsButtonMenu.addSeparator()
-        act = self.__allFontsButtonMenu.addAction(
-            self.tr("Family and Size only"))
+        act = self.__allFontsButtonMenu.addAction(self.tr("Family and Size only"))
         act.setData(self.FAMILYANDSIZE)
         act = self.__allFontsButtonMenu.addAction(self.tr("Family only"))
         act.setData(self.FAMILYONLY)
         act = self.__allFontsButtonMenu.addAction(self.tr("Size only"))
         act.setData(self.SIZEONLY)
-        self.__allFontsButtonMenu.triggered.connect(
-            self.__allFontsButtonMenuTriggered)
+        self.__allFontsButtonMenu.triggered.connect(self.__allFontsButtonMenuTriggered)
         self.allFontsButton.setMenu(self.__allFontsButtonMenu)
-        
+
         self.lexer = None
         self.lexers = lexers
-        
+
         # set initial values
         import QScintilla.Lexers
-        languages = sorted([''] + list(self.lexers.keys()))
+
+        languages = sorted([""] + list(self.lexers.keys()))
         for language in languages:
             self.lexerLanguageComboBox.addItem(
-                QScintilla.Lexers.getLanguageIcon(language, False),
-                language)
+                QScintilla.Lexers.getLanguageIcon(language, False), language
+            )
         self.on_lexerLanguageComboBox_activated(0)
-    
+
     def save(self):
         """
         Public slot to save the Editor Highlighting Styles configuration.
         """
         for lexer in list(self.lexers.values()):
             lexer.writeSettings()
-    
+
     @pyqtSlot(int)
     def on_lexerLanguageComboBox_activated(self, index):
         """
         Private slot to fill the style combo of the source page.
-        
+
         @param index index of the selected entry
         @type int
         """
         language = self.lexerLanguageComboBox.itemText(index)
-        
+
         self.styleElementList.clear()
         self.styleGroup.setEnabled(False)
         self.lexer = None
-        
+
         if not language:
             return
-        
+
         try:
             self.lexer = self.lexers[language]
         except KeyError:
             return
-        
+
         self.styleGroup.setEnabled(True)
         for description, styleNo, subStyleNo in self.lexer.getStyles():
             if subStyleNo >= 0:
                 parent = self.styleElementList.findItems(
-                    self.lexer.description(styleNo),
-                    Qt.MatchFlag.MatchExactly)[0]
+                    self.lexer.description(styleNo), Qt.MatchFlag.MatchExactly
+                )[0]
                 parent.setExpanded(True)
             else:
                 parent = self.styleElementList
@@ -136,13 +141,12 @@
             itm.setData(0, self.StyleRole, styleNo)
             itm.setData(0, self.SubstyleRole, subStyleNo)
         self.__styleAllItems()
-        self.styleElementList.setCurrentItem(
-            self.styleElementList.topLevelItem(0))
-    
+        self.styleElementList.setCurrentItem(self.styleElementList.topLevelItem(0))
+
     def __stylesForItem(self, itm):
         """
         Private method to get the style and sub-style number of the given item.
-        
+
         @param itm reference to the item to extract the styles from
         @type QTreeWidgetItem
         @return tuple containing the style and sub-style numbers
@@ -152,24 +156,24 @@
         substyle = itm.data(0, self.SubstyleRole)
 
         return (style, substyle)
-    
+
     def __currentStyles(self):
         """
         Private method to get the styles of the current item.
-        
+
         @return tuple containing the style and sub-style numbers
         @rtype tuple of (int, int)
         """
         itm = self.styleElementList.currentItem()
         # return default style, if no current item
         styles = (0, -1) if itm is None else self.__stylesForItem(itm)
-        
+
         return styles
-    
+
     def __styleOneItem(self, item, style, substyle):
         """
         Private method to style one item of the style element list.
-        
+
         @param item reference to the item to be styled
         @type QTreeWidgetItem
         @param style base style number
@@ -181,7 +185,7 @@
         paper = self.lexer.paper(style, substyle)
         font = self.lexer.font(style, substyle)
         eolfill = self.lexer.eolFill(style, substyle)
-        
+
         item.setFont(0, font)
         item.setBackground(0, paper)
         item.setForeground(0, colour)
@@ -189,7 +193,7 @@
             item.setCheckState(0, Qt.CheckState.Checked)
         else:
             item.setCheckState(0, Qt.CheckState.Unchecked)
-    
+
     def __styleAllItems(self):
         """
         Private method to style all items of the style element list.
@@ -199,11 +203,11 @@
             style, substyle = self.__stylesForItem(itm)
             self.__styleOneItem(itm, style, substyle)
             itm = self.styleElementList.itemBelow(itm)
-    
+
     def __styleSample(self, color, paper, font=None):
         """
         Private method to style the sample text.
-        
+
         @param color foreground color for the sample
         @type QColor
         @param paper background color for the sample
@@ -213,18 +217,18 @@
         """
         if font:
             self.sampleText.setFont(font)
-        
+
         self.sampleText.setStyleSheet(
             "QLineEdit {{ color: {0}; background-color: {1}; }}".format(
                 color.name(), paper.name()
             )
         )
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_styleElementList_currentItemChanged(self, current, previous):
         """
         Private method to handle a change of the current row.
-        
+
         @param current reference to the current item
         @type QTreeWidgetItem
         @param previous reference to the previous item
@@ -232,25 +236,27 @@
         """
         if current is None:
             return
-        
+
         style, substyle = self.__stylesForItem(current)
         colour = self.lexer.color(style, substyle)
         paper = self.lexer.paper(style, substyle)
         eolfill = self.lexer.eolFill(style, substyle)
         font = self.lexer.font(style, substyle)
-        
+
         self.__styleSample(colour, paper, font=font)
         self.eolfillCheckBox.setChecked(eolfill)
-        
+
         selectedOne = len(self.styleElementList.selectedItems()) == 1
         self.defaultSubstylesButton.setEnabled(
-            selectedOne and substyle < 0 and self.lexer.isBaseStyle(style))
+            selectedOne and substyle < 0 and self.lexer.isBaseStyle(style)
+        )
         self.addSubstyleButton.setEnabled(
-            selectedOne and substyle < 0 and self.lexer.isBaseStyle(style))
+            selectedOne and substyle < 0 and self.lexer.isBaseStyle(style)
+        )
         self.deleteSubstyleButton.setEnabled(selectedOne and substyle >= 0)
         self.editSubstyleButton.setEnabled(selectedOne and substyle >= 0)
         self.copySubstyleButton.setEnabled(selectedOne and substyle >= 0)
-    
+
     @pyqtSlot()
     def on_foregroundButton_clicked(self):
         """
@@ -266,7 +272,7 @@
                 style, substyle = self.__stylesForItem(selItem)
                 self.lexer.setColor(colour, style, substyle)
                 selItem.setForeground(0, colour)
-    
+
     @pyqtSlot()
     def on_backgroundButton_clicked(self):
         """
@@ -282,7 +288,7 @@
                 style, substyle = self.__stylesForItem(selItem)
                 self.lexer.setPaper(paper, style, substyle)
                 selItem.setBackground(0, paper)
-    
+
     @pyqtSlot()
     def on_allBackgroundColoursButton_clicked(self):
         """
@@ -294,27 +300,28 @@
         if paper.isValid():
             colour = self.lexer.color(style, substyle)
             self.__styleSample(colour, paper)
-            
+
             itm = self.styleElementList.topLevelItem(0)
             while itm is not None:
                 style, substyle = self.__stylesForItem(itm)
                 self.lexer.setPaper(paper, style, substyle)
                 itm = self.styleElementList.itemBelow(itm)
             self.__styleAllItems()
-    
+
     def __changeFont(self, doAll, familyOnly, sizeOnly):
         """
         Private slot to change the highlighter font.
-        
+
         @param doAll flag indicating to change the font for all styles
             (boolean)
         @param familyOnly flag indicating to set the font family only (boolean)
         @param sizeOnly flag indicating to set the font size only (boolean
         """
+
         def setFont(font, style, substyle, familyOnly, sizeOnly):
             """
             Local function to set the font.
-            
+
             @param font font to be set
             @type QFont
             @param style style number
@@ -335,11 +342,11 @@
                 self.lexer.setFont(newFont, style, substyle)
             else:
                 self.lexer.setFont(font, style, substyle)
-        
+
         def setSampleFont(font, familyOnly, sizeOnly):
             """
             Local function to set the font of the sample text.
-            
+
             @param font font to be set (QFont)
             @param familyOnly flag indicating to set the font family only
                 (boolean)
@@ -355,15 +362,16 @@
                 self.sampleText.setFont(newFont)
             else:
                 self.sampleText.setFont(font)
-        
+
         style, substyle = self.__currentStyles()
         options = (
             QFontDialog.FontDialogOption.MonospacedFonts
-            if self.monospacedButton.isChecked() else
-            QFontDialog.FontDialogOption(0)
+            if self.monospacedButton.isChecked()
+            else QFontDialog.FontDialogOption(0)
         )
-        font, ok = QFontDialog.getFont(self.lexer.font(style, substyle), self,
-                                       "", options)
+        font, ok = QFontDialog.getFont(
+            self.lexer.font(style, substyle), self, "", options
+        )
         if ok:
             setSampleFont(font, familyOnly, sizeOnly)
             if doAll:
@@ -379,39 +387,39 @@
                     setFont(font, style, substyle, familyOnly, sizeOnly)
                     itmFont = self.lexer.font(style, substyle)
                     selItem.setFont(0, itmFont)
-    
+
     def __fontButtonMenuTriggered(self, act):
         """
         Private slot used to select the font of the selected style and lexer.
-        
+
         @param act reference to the triggering action (QAction)
         """
         if act is None:
             return
-        
+
         familyOnly = act.data() in [self.FAMILYANDSIZE, self.FAMILYONLY]
         sizeOnly = act.data() in [self.FAMILYANDSIZE, self.SIZEONLY]
         self.__changeFont(False, familyOnly, sizeOnly)
-    
+
     def __allFontsButtonMenuTriggered(self, act):
         """
         Private slot used to change the font of all styles of a selected lexer.
-        
+
         @param act reference to the triggering action (QAction)
         """
         if act is None:
             return
-        
+
         familyOnly = act.data() in [self.FAMILYANDSIZE, self.FAMILYONLY]
         sizeOnly = act.data() in [self.FAMILYANDSIZE, self.SIZEONLY]
         self.__changeFont(True, familyOnly, sizeOnly)
-    
+
     @pyqtSlot(bool)
     def on_eolfillCheckBox_clicked(self, on):
         """
         Private method used to set the eolfill for the selected style and
         lexer.
-        
+
         @param on flag indicating enabled or disabled state (boolean)
         """
         style, substyle = self.__currentStyles()
@@ -420,7 +428,7 @@
             style, substyle = self.__stylesForItem(selItem)
             self.lexer.setEolFill(on, style, substyle)
             selItem.setCheckState(0, checkState)
-    
+
     @pyqtSlot()
     def on_allEolFillButton_clicked(self):
         """
@@ -434,18 +442,20 @@
             self.tr("Fill to end of line"),
             self.tr("Select fill to end of line for all styles"),
             [on, off],
-            0, False)
+            0,
+            False,
+        )
         if ok:
             enabled = selection == on
             self.eolfillCheckBox.setChecked(enabled)
-            
+
             itm = self.styleElementList.topLevelItem(0)
             while itm is not None:
                 style, substyle = self.__stylesForItem(itm)
                 self.lexer.setEolFill(enabled, style, substyle)
                 itm = self.styleElementList.itemBelow(itm)
             self.__styleAllItems()
-    
+
     @pyqtSlot()
     def on_defaultButton_clicked(self):
         """
@@ -455,9 +465,10 @@
             style, substyle = self.__stylesForItem(selItem)
             self.__setToDefault(style, substyle)
         self.on_styleElementList_currentItemChanged(
-            self.styleElementList.currentItem(), None)
+            self.styleElementList.currentItem(), None
+        )
         self.__styleAllItems()
-    
+
     @pyqtSlot()
     def on_allDefaultButton_clicked(self):
         """
@@ -469,70 +480,70 @@
             self.__setToDefault(style, substyle)
             itm = self.styleElementList.itemBelow(itm)
         self.on_styleElementList_currentItemChanged(
-            self.styleElementList.currentItem(), None)
+            self.styleElementList.currentItem(), None
+        )
         self.__styleAllItems()
-    
+
     def __setToDefault(self, style, substyle):
         """
         Private method to set a specific style to its default values.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
         @type int
         """
-        self.lexer.setColor(self.lexer.defaultColor(style, substyle),
-                            style, substyle)
-        self.lexer.setPaper(self.lexer.defaultPaper(style, substyle),
-                            style, substyle)
-        self.lexer.setFont(self.lexer.defaultFont(style, substyle),
-                           style, substyle)
-        self.lexer.setEolFill(self.lexer.defaultEolFill(style, substyle),
-                              style, substyle)
-    
+        self.lexer.setColor(self.lexer.defaultColor(style, substyle), style, substyle)
+        self.lexer.setPaper(self.lexer.defaultPaper(style, substyle), style, substyle)
+        self.lexer.setFont(self.lexer.defaultFont(style, substyle), style, substyle)
+        self.lexer.setEolFill(
+            self.lexer.defaultEolFill(style, substyle), style, substyle
+        )
+
     #######################################################################
     ## Importing and exporting of styles
     #######################################################################
-    
+
     @pyqtSlot()
     def on_importButton_clicked(self):
         """
         Private slot to import styles to be selected.
         """
         self.__importStyles(importAll=False)
-    
+
     @pyqtSlot()
     def on_exportButton_clicked(self):
         """
         Private slot to export styles to be selected.
         """
         self.__exportStyles(exportAll=False)
-    
+
     @pyqtSlot()
     def on_importAllButton_clicked(self):
         """
         Private slot to import the styles of all lexers.
         """
         self.__importStyles(importAll=True)
-    
+
     @pyqtSlot()
     def on_exportAllButton_clicked(self):
         """
         Private slot to export the styles of all lexers.
         """
         self.__exportStyles(exportAll=True)
-    
+
     def __exportStyles(self, exportAll=False):
         """
         Private method to export the styles of selectable lexers.
-        
+
         @param exportAll flag indicating to export all styles without asking
             (defaults to False)
         @type bool (optional)
         """
         from eric7config import getConfig
+
         stylesDir = getConfig("ericStylesDir")
-        
+
         lexerNames = list(self.lexers.keys())
         if not exportAll:
             if self.lexer:
@@ -540,77 +551,86 @@
             else:
                 preselect = []
             from .EditorHighlightingStylesSelectionDialog import (
-                EditorHighlightingStylesSelectionDialog)
+                EditorHighlightingStylesSelectionDialog,
+            )
+
             dlg = EditorHighlightingStylesSelectionDialog(
-                lexerNames, forImport=False, preselect=preselect)
+                lexerNames, forImport=False, preselect=preselect
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 lexerNames = dlg.getLexerNames()
             else:
                 # Cancelled by user
                 return
-        
+
         lexers = [self.lexers[name] for name in lexerNames]
-        
+
         fn, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Export Highlighting Styles"),
             stylesDir,
             self.tr("Highlighting Styles File (*.ehj)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fn:
             return
-        
+
         fpath = pathlib.Path(fn)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fpath = fpath.with_suffix(ex)
-        
+
         ok = (
             EricMessageBox.yesNo(
                 self,
                 self.tr("Export Highlighting Styles"),
-                self.tr("""<p>The highlighting styles file <b>{0}</b> exists"""
-                        """ already. Overwrite it?</p>""").format(fpath))
-            if fpath.exists() else
-            True
+                self.tr(
+                    """<p>The highlighting styles file <b>{0}</b> exists"""
+                    """ already. Overwrite it?</p>"""
+                ).format(fpath),
+            )
+            if fpath.exists()
+            else True
         )
-        
+
         if ok:
-            from Preferences.HighlightingStylesFile import (
-                HighlightingStylesFile
-            )
+            from Preferences.HighlightingStylesFile import HighlightingStylesFile
+
             highlightingStylesFile = HighlightingStylesFile()
             highlightingStylesFile.writeFile(str(fpath), lexers)
-    
+
     def __importStyles(self, importAll=False):
         """
         Private method to import the styles of lexers to be selected.
-        
+
         @param importAll flag indicating to import all styles without asking
             (defaults to False)
         @type bool (optional)
         """
         from eric7config import getConfig
+
         stylesDir = getConfig("ericStylesDir")
-        
+
         fn = EricFileDialog.getOpenFileName(
             self,
             self.tr("Import Highlighting Styles"),
             stylesDir,
-            self.tr("Highlighting Styles File (*.ehj);;"
-                    "XML Highlighting Styles File (*.e6h *.e4h)"))
-        
+            self.tr(
+                "Highlighting Styles File (*.ehj);;"
+                "XML Highlighting Styles File (*.e6h *.e4h)"
+            ),
+        )
+
         if not fn:
             return
-        
+
         if fn.endswith(".ehj"):
             # new JSON based file
-            from Preferences.HighlightingStylesFile import (
-                HighlightingStylesFile
-            )
+            from Preferences.HighlightingStylesFile import HighlightingStylesFile
+
             highlightingStylesFile = HighlightingStylesFile()
             styles = highlightingStylesFile.readFile(fn)
             if not styles:
@@ -619,9 +639,8 @@
             # old XML based file
             f = QFile(fn)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
-                from EricXML.HighlightingStylesReader import (
-                    HighlightingStylesReader
-                )
+                from EricXML.HighlightingStylesReader import HighlightingStylesReader
+
                 reader = HighlightingStylesReader(f, self.lexers)
                 styles = reader.readXML()
                 f.close()
@@ -634,39 +653,39 @@
                     self.tr(
                         "<p>The highlighting styles file <b>{0}</b> could not"
                         " be read.</p><p>Reason: {1}</p>"
-                    ).format(fn, f.errorString())
+                    ).format(fn, f.errorString()),
                 )
                 return
-        
+
         self.__applyStyles(styles, importAll=importAll)
         self.on_lexerLanguageComboBox_activated(
-            self.lexerLanguageComboBox.currentIndex())
-    
+            self.lexerLanguageComboBox.currentIndex()
+        )
+
     def __applyStyles(self, stylesList, importAll=False):
         """
         Private method to apply the imported styles to this dialog.
-        
+
         @param stylesList list of imported lexer styles
         @type list of dict
         @param importAll flag indicating to import all styles without asking
             (defaults to False)
         @type bool (optional)
         """
-        lexerNames = [d["name"]
-                      for d in stylesList
-                      if d["name"] in self.lexers]
-        
+        lexerNames = [d["name"] for d in stylesList if d["name"] in self.lexers]
+
         if not importAll:
             from .EditorHighlightingStylesSelectionDialog import (
-                EditorHighlightingStylesSelectionDialog)
-            dlg = EditorHighlightingStylesSelectionDialog(
-                lexerNames, forImport=True)
+                EditorHighlightingStylesSelectionDialog,
+            )
+
+            dlg = EditorHighlightingStylesSelectionDialog(lexerNames, forImport=True)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 lexerNames = dlg.getLexerNames()
             else:
                 # Cancelled by user
                 return
-        
+
         for lexerDict in stylesList:
             if lexerDict["name"] in lexerNames:
                 lexer = self.lexers[lexerDict["name"]]
@@ -681,18 +700,17 @@
                     lexer.setEolFill(styleDict["eolfill"], style, substyle)
                     if substyle >= 0:
                         # description and words can only be set for sub-styles
-                        lexer.setDescription(styleDict["description"],
-                                             style, substyle)
+                        lexer.setDescription(styleDict["description"], style, substyle)
                         lexer.setWords(styleDict["words"], style, substyle)
-    
+
     #######################################################################
     ## Methods to save and restore the state
     #######################################################################
-    
+
     def saveState(self):
         """
         Public method to save the current state of the widget.
-        
+
         @return list containing the index of the selected lexer language
             and a tuple containing the index of the parent selected lexer
             entry and the index of the selected entry
@@ -702,14 +720,13 @@
         if itm:
             parent = itm.parent()
             if parent is None:
-                currentData = (
-                    None, self.styleElementList.indexOfTopLevelItem(itm))
+                currentData = (None, self.styleElementList.indexOfTopLevelItem(itm))
             else:
                 currentData = (
                     self.styleElementList.indexOfTopLevelItem(parent),
-                    parent.indexOfChild(itm)
+                    parent.indexOfChild(itm),
                 )
-            
+
             savedState = [
                 self.lexerLanguageComboBox.currentIndex(),
                 currentData,
@@ -717,18 +734,19 @@
         else:
             savedState = []
         return savedState
-    
+
     def setState(self, state):
         """
         Public method to set the state of the widget.
-        
+
         @param state state data generated by saveState
         """
         if state:
             self.lexerLanguageComboBox.setCurrentIndex(state[0])
             self.on_lexerLanguageComboBox_activated(
-                self.lexerLanguageComboBox.currentIndex())
-            
+                self.lexerLanguageComboBox.currentIndex()
+            )
+
             parentIndex, index = state[1]
             if parentIndex is None:
                 itm = self.styleElementList.topLevelItem(index)
@@ -736,33 +754,33 @@
                 parent = self.styleElementList.topLevelItem(parentIndex)
                 itm = parent.child(index)
             self.styleElementList.setCurrentItem(itm)
-    
+
     #######################################################################
     ## Methods to add, delete and edit sub-styles and their definitions
     #######################################################################
-    
+
     @pyqtSlot()
     def on_addSubstyleButton_clicked(self):
         """
         Private slot to add a new sub-style.
         """
         style, substyle = self.__currentStyles()
-        dlg = SubstyleDefinitionDialog(
-            self.lexer, style, substyle, parent=self)
+        dlg = SubstyleDefinitionDialog(self.lexer, style, substyle, parent=self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             description, words = dlg.getData()
             substyle = self.lexer.addSubstyle(style)
             self.lexer.setDescription(description, style, substyle)
             self.lexer.setWords(words, style, substyle)
-            
+
             parent = self.styleElementList.findItems(
-                self.lexer.description(style), Qt.MatchFlag.MatchExactly)[0]
+                self.lexer.description(style), Qt.MatchFlag.MatchExactly
+            )[0]
             parent.setExpanded(True)
             itm = QTreeWidgetItem(parent, [description])
             itm.setData(0, self.StyleRole, style)
             itm.setData(0, self.SubstyleRole, substyle)
             self.__styleOneItem(itm, style, substyle)
-    
+
     @pyqtSlot()
     def on_deleteSubstyleButton_clicked(self):
         """
@@ -772,35 +790,34 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Delete Sub-Style"),
-            self.tr("""<p>Shall the sub-style <b>{0}</b> really be"""
-                    """ deleted?</p>""").format(
-                self.lexer.description(style, substyle))
+            self.tr(
+                """<p>Shall the sub-style <b>{0}</b> really be""" """ deleted?</p>"""
+            ).format(self.lexer.description(style, substyle)),
         )
         if ok:
             self.lexer.delSubstyle(style, substyle)
-            
+
             itm = self.styleElementList.currentItem()
             parent = itm.parent()
             index = parent.indexOfChild(itm)
             parent.takeChild(index)
             del itm
-    
+
     @pyqtSlot()
     def on_editSubstyleButton_clicked(self):
         """
         Private slot to edit the selected sub-style entry.
         """
         style, substyle = self.__currentStyles()
-        dlg = SubstyleDefinitionDialog(
-            self.lexer, style, substyle, parent=self)
+        dlg = SubstyleDefinitionDialog(self.lexer, style, substyle, parent=self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             description, words = dlg.getData()
             self.lexer.setDescription(description, style, substyle)
             self.lexer.setWords(words, style, substyle)
-            
+
             itm = self.styleElementList.currentItem()
             itm.setText(0, description)
-    
+
     @pyqtSlot()
     def on_copySubstyleButton_clicked(self):
         """
@@ -808,29 +825,26 @@
         """
         style, substyle = self.__currentStyles()
         newSubstyle = self.lexer.addSubstyle(style)
-        
+
         description = self.tr("{0} - Copy").format(
-            self.lexer.description(style, substyle))
+            self.lexer.description(style, substyle)
+        )
         self.lexer.setDescription(description, style, newSubstyle)
-        self.lexer.setWords(self.lexer.words(style, substyle),
-                            style, newSubstyle)
-        self.lexer.setColor(self.lexer.color(style, substyle),
-                            style, newSubstyle)
-        self.lexer.setPaper(self.lexer.paper(style, substyle),
-                            style, newSubstyle)
-        self.lexer.setFont(self.lexer.font(style, substyle),
-                           style, newSubstyle)
-        self.lexer.setEolFill(self.lexer.eolFill(style, substyle),
-                              style, newSubstyle)
-        
+        self.lexer.setWords(self.lexer.words(style, substyle), style, newSubstyle)
+        self.lexer.setColor(self.lexer.color(style, substyle), style, newSubstyle)
+        self.lexer.setPaper(self.lexer.paper(style, substyle), style, newSubstyle)
+        self.lexer.setFont(self.lexer.font(style, substyle), style, newSubstyle)
+        self.lexer.setEolFill(self.lexer.eolFill(style, substyle), style, newSubstyle)
+
         parent = self.styleElementList.findItems(
-            self.lexer.description(style), Qt.MatchFlag.MatchExactly)[0]
+            self.lexer.description(style), Qt.MatchFlag.MatchExactly
+        )[0]
         parent.setExpanded(True)
         itm = QTreeWidgetItem(parent, [description])
         itm.setData(0, self.StyleRole, style)
         itm.setData(0, self.SubstyleRole, newSubstyle)
         self.__styleOneItem(itm, style, newSubstyle)
-    
+
     @pyqtSlot()
     def on_defaultSubstylesButton_clicked(self):
         """
@@ -840,20 +854,22 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Reset Sub-Styles to Default"),
-            self.tr("<p>Do you really want to reset all defined sub-styles of"
-                    " <b>{0}</b> to the default values?</p>""")
-            .format(self.lexer.description(style, substyle))
+            self.tr(
+                "<p>Do you really want to reset all defined sub-styles of"
+                " <b>{0}</b> to the default values?</p>"
+                ""
+            ).format(self.lexer.description(style, substyle)),
         )
         if ok:
             # 1. reset sub-styles
             self.lexer.loadDefaultSubStyles(style)
-            
+
             # 2. delete all existing sub-style items
             parent = self.styleElementList.currentItem()
             while parent.childCount() > 0:
-                itm = parent.takeChild(0)     # __IGNORE_WARNING__
+                itm = parent.takeChild(0)  # __IGNORE_WARNING__
                 del itm
-            
+
             # 3. create the new list of sub-style items
             for description, _, substyle in self.lexer.getSubStyles(style):
                 itm = QTreeWidgetItem(parent, [description])
@@ -865,7 +881,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,12 +8,10 @@
 """
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QListWidgetItem, QAbstractButton
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QListWidgetItem, QAbstractButton
 
 from .Ui_EditorHighlightingStylesSelectionDialog import (
-    Ui_EditorHighlightingStylesSelectionDialog
+    Ui_EditorHighlightingStylesSelectionDialog,
 )
 
 
@@ -23,10 +21,11 @@
     """
     Class implementing a dialog to select the styles to be imported/exported.
     """
+
     def __init__(self, lexerNames, forImport, preselect=None, parent=None):
         """
         Constructor
-        
+
         @param lexerNames list of lexer names to select from
         @type list of str
         @param forImport flag indicating a dialog for importing styles
@@ -38,33 +37,35 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__selectAllButton = self.buttonBox.addButton(
-            self.tr("Select All"), QDialogButtonBox.ButtonRole.ActionRole)
-        
+            self.tr("Select All"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
         if forImport:
             self.setWindowTitle(self.tr("Import Highlighting Styles"))
-            self.infoLabel.setText(self.tr(
-                "Select the highlighting styles to be imported"))
+            self.infoLabel.setText(
+                self.tr("Select the highlighting styles to be imported")
+            )
         else:
             self.setWindowTitle(self.tr("Export Highlighting Styles"))
-            self.infoLabel.setText(self.tr(
-                "Select the highlighting styles to be exported"))
-        
+            self.infoLabel.setText(
+                self.tr("Select the highlighting styles to be exported")
+            )
+
         if preselect is None:
             preselect = []
-        
+
         for name in lexerNames:
             itm = QListWidgetItem(name, self.lexersList)
-            itm.setFlags(
-                Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsEnabled)
+            itm.setFlags(Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsEnabled)
             if name in preselect:
                 itm.setCheckState(Qt.CheckState.Checked)
             else:
                 itm.setCheckState(Qt.CheckState.Unchecked)
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot()
     def __updateOkButton(self):
         """
@@ -77,24 +78,23 @@
                 break
         else:
             enable = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(QListWidgetItem)
     def on_lexersList_itemChanged(self, item):
         """
         Private slot to react on changes in check state.
-        
+
         @param item reference to the changed item
         @type QListWidgetItem
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the user pressing a button.
-        
+
         @param button reference to the button pressed
         @type QAbstractButton
         """
@@ -102,11 +102,11 @@
             for row in range(self.lexersList.count()):
                 itm = self.lexersList.item(row)
                 itm.setCheckState(Qt.CheckState.Checked)
-    
+
     def getLexerNames(self):
         """
         Public method to get the selected lexer names.
-        
+
         @return list of selected lexer names
         @rtype list of str
         """
@@ -115,5 +115,5 @@
             itm = self.lexersList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
                 lexerNames.append(itm.text())
-        
+
         return lexerNames
--- a/src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorKeywordsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,8 +21,9 @@
     """
     Class implementing the editor highlighter keywords configuration page.
     """
-    MaxKeywordSets = 8          # max. 8 sets are allowed
-    
+
+    MaxKeywordSets = 8  # max. 8 sets are allowed
+
     def __init__(self):
         """
         Constructor
@@ -30,11 +31,11 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorKeywordsPage")
-        
+
         # set initial values
         import QScintilla.Lexers
         from QScintilla.Lexers.LexerContainer import LexerContainer
-        
+
         self.__keywords = {
             "": {
                 "Sets": [""] * (self.MaxKeywordSets + 1),
@@ -42,9 +43,10 @@
                 "MaxSets": 0,
             }
         }
-        
+
         languages = sorted(
-            [''] + list(QScintilla.Lexers.getSupportedLanguages().keys()))
+            [""] + list(QScintilla.Lexers.getSupportedLanguages().keys())
+        )
         for lang in languages:
             if lang:
                 lex = QScintilla.Lexers.getLexer(lang)
@@ -84,13 +86,13 @@
                     "MaxSets": lex.maximumKeywordSet(),
                 }
             self.languageCombo.addItem(
-                QScintilla.Lexers.getLanguageIcon(lang, False),
-                lang)
-        
-        self.currentLanguage = ''
+                QScintilla.Lexers.getLanguageIcon(lang, False), lang
+            )
+
+        self.currentLanguage = ""
         self.currentSet = 1
         self.on_languageCombo_activated(0)
-    
+
     def save(self):
         """
         Public slot to save the editor highlighter keywords configuration.
@@ -98,26 +100,26 @@
         lang = self.languageCombo.currentText()
         kwSet = self.setSpinBox.value()
         self.__keywords[lang]["Sets"][kwSet] = self.keywordsEdit.toPlainText()
-        
+
         for lang, keywords in self.__keywords.items():
             Preferences.setEditorKeywords(lang, keywords["Sets"])
-        
+
     @pyqtSlot(int)
     def on_languageCombo_activated(self, index):
         """
         Private slot to fill the keywords edit.
-        
+
         @param index index of the selected entry
         @type int
         """
         language = self.languageCombo.itemText(index)
-        
+
         self.defaultButton.setEnabled(bool(language))
         self.allDefaultButton.setEnabled(bool(language))
-        
+
         if self.currentLanguage == language:
             return
-        
+
         if self.setSpinBox.value() == 1:
             self.on_setSpinBox_valueChanged(1)
         if self.__keywords[language]["MaxSets"]:
@@ -129,10 +131,8 @@
                 if self.__keywords[language]["Descriptions"][kwSet] != "":
                     first = min(first, kwSet)
                     last = max(last, kwSet)
-        self.setSpinBox.setEnabled(language != "" and
-                                   first <= self.MaxKeywordSets)
-        self.keywordsEdit.setEnabled(language != "" and
-                                     first <= self.MaxKeywordSets)
+        self.setSpinBox.setEnabled(language != "" and first <= self.MaxKeywordSets)
+        self.keywordsEdit.setEnabled(language != "" and first <= self.MaxKeywordSets)
         if first <= self.MaxKeywordSets:
             self.setSpinBox.setMinimum(first)
             self.setSpinBox.setMaximum(last)
@@ -141,30 +141,30 @@
             self.setSpinBox.setMinimum(0)
             self.setSpinBox.setMaximum(0)
             self.setSpinBox.setValue(0)
-    
+
     @pyqtSlot(int)
     def on_setSpinBox_valueChanged(self, kwSet):
         """
         Private slot to fill the keywords edit.
-        
+
         @param kwSet number of the selected keyword set
         @type int
         """
         language = self.languageCombo.currentText()
         if self.currentLanguage == language and self.currentSet == kwSet:
             return
-        
-        self.__keywords[self.currentLanguage]["Sets"][self.currentSet] = (
-            self.keywordsEdit.toPlainText()
-        )
-        
+
+        self.__keywords[self.currentLanguage]["Sets"][
+            self.currentSet
+        ] = self.keywordsEdit.toPlainText()
+
         self.currentLanguage = language
         self.currentSet = kwSet
-        self.setDescriptionLabel.setText("<b>{0}</b>".format(
-            self.__keywords[language]["Descriptions"][kwSet]))
-        self.keywordsEdit.setPlainText(
-            self.__keywords[language]["Sets"][kwSet])
-    
+        self.setDescriptionLabel.setText(
+            "<b>{0}</b>".format(self.__keywords[language]["Descriptions"][kwSet])
+        )
+        self.keywordsEdit.setPlainText(self.__keywords[language]["Sets"][kwSet])
+
     @pyqtSlot()
     def on_defaultButton_clicked(self):
         """
@@ -174,20 +174,22 @@
             EricMessageBox.yesNo(
                 self,
                 self.tr("Reset to Default"),
-                self.tr("Shall the current keyword set really be reset to"
-                        " default values?"))
-            if bool(self.keywordsEdit.toPlainText()) else
-            True
+                self.tr(
+                    "Shall the current keyword set really be reset to"
+                    " default values?"
+                ),
+            )
+            if bool(self.keywordsEdit.toPlainText())
+            else True
         )
         if ok:
             language = self.languageCombo.currentText()
             kwSet = self.setSpinBox.value()
-            self.__keywords[language]["Sets"][kwSet] = (
-                self.__keywords[language]["DefaultSets"][kwSet]
-            )
-            self.keywordsEdit.setPlainText(
-                self.__keywords[language]["Sets"][kwSet])
-    
+            self.__keywords[language]["Sets"][kwSet] = self.__keywords[language][
+                "DefaultSets"
+            ][kwSet]
+            self.keywordsEdit.setPlainText(self.__keywords[language]["Sets"][kwSet])
+
     @pyqtSlot()
     def on_allDefaultButton_clicked(self):
         """
@@ -197,22 +199,24 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Reset All to Default"),
-            self.tr("Shall all keyword sets of the current language really be"
-                    " reset to default values?"))
+            self.tr(
+                "Shall all keyword sets of the current language really be"
+                " reset to default values?"
+            ),
+        )
         if ok:
             language = self.languageCombo.currentText()
             kwSet = self.setSpinBox.value()
-            self.__keywords[language]["Sets"] = (
-                self.__keywords[language]["DefaultSets"][:]
-            )
-            self.keywordsEdit.setPlainText(
-                self.__keywords[language]["Sets"][kwSet])
+            self.__keywords[language]["Sets"] = self.__keywords[language][
+                "DefaultSets"
+            ][:]
+            self.keywordsEdit.setPlainText(self.__keywords[language]["Sets"][kwSet])
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @type ConfigurationWidget
     @return reference to the instantiated page
--- a/src/eric7/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
 from .Ui_EditorLanguageTabIndentOverrideDialog import (
-    Ui_EditorLanguageTabIndentOverrideDialog
+    Ui_EditorLanguageTabIndentOverrideDialog,
 )
 
 
@@ -25,13 +25,15 @@
     Class implementing a dialog to set the tab and indentation width override
     for a language.
     """
+
     PygmentsMarker = "Pygments|"
-    
-    def __init__(self, *, editMode=False, languages=None, tabWidth=0,
-                 indentWidth=0, parent=None):
+
+    def __init__(
+        self, *, editMode=False, languages=None, tabWidth=0, indentWidth=0, parent=None
+    ):
         """
         Constructor
-        
+
         @keyparam editMode flag indicating the edit mode (Note: in edit mode
             the language is fixed)
         @type bool
@@ -47,32 +49,31 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__extras = ["-----------", self.tr("Alternative")]
-        
+
         if editMode:
             self.languageComboBox.addItems(languages)
         else:
             self.__populateLanguages(languages)
         self.tabWidthSpinBox.setValue(tabWidth)
         self.indentWidthSpinBox.setValue(indentWidth)
-    
+
     def __populateLanguages(self, filterLanguages):
         """
         Private method to populate the language combo boxes.
-        
+
         @param filterLanguages list of languages to be filtered out
         @type list of str
         """
         import QScintilla.Lexers
-        languages = list(
-            QScintilla.Lexers.getSupportedLanguages().keys())
+
+        languages = list(QScintilla.Lexers.getSupportedLanguages().keys())
         for lang in filterLanguages:
             if lang in languages:
                 languages.remove(lang)
-        self.languageComboBox.addItems(
-            [""] + sorted(languages) + self.__extras)
-        
+        self.languageComboBox.addItems([""] + sorted(languages) + self.__extras)
+
         pygmentsLanguages = [lex[0] for lex in get_all_lexers()]
         for lang in filterLanguages:
             if lang.startswith(self.PygmentsMarker):
@@ -80,11 +81,11 @@
                 if lang in pygmentsLanguages:
                     pygmentsLanguages.remove(lang)
         self.pygmentsLexerCombo.addItems([""] + sorted(pygmentsLanguages))
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the language, the tab width and the
             indentation width
         @rtype tuple of (str, int, int)
@@ -98,26 +99,26 @@
             self.tabWidthSpinBox.value(),
             self.indentWidthSpinBox.value(),
         )
-    
+
     def __updateOkButton(self):
         """
         Private method to set the enabled status of the OK button.
         """
         lang = self.languageComboBox.currentText()
         if lang in self.__extras:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(
-                    bool(self.pygmentsLexerCombo.currentText()))
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                bool(self.pygmentsLexerCombo.currentText())
+            )
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(
-                    bool(lang))
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+                bool(lang)
+            )
+
     @pyqtSlot(int)
     def on_languageComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a language.
-        
+
         @param index index of the current item
         @type int
         """
@@ -128,14 +129,14 @@
         else:
             self.pygmentsLexerCombo.setEnabled(False)
             self.pygmentsLabel.setEnabled(False)
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot(int)
     def on_pygmentsLexerCombo_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a language.
-        
+
         @param index index of the current item
         @type int
         """
--- a/src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerJediPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerJediPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,13 +10,9 @@
 from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtWidgets import QDialog
 
-from Preferences.ConfigurationPages.ConfigurationPageBase import (
-    ConfigurationPageBase
-)
+from Preferences.ConfigurationPages.ConfigurationPageBase import ConfigurationPageBase
 
-from .Ui_EditorMouseClickHandlerJediPage import (
-    Ui_EditorMouseClickHandlerJediPage
-)
+from .Ui_EditorMouseClickHandlerJediPage import Ui_EditorMouseClickHandlerJediPage
 
 from Utilities import MouseUtilities
 
@@ -24,11 +20,13 @@
 from Preferences.MouseClickDialog import MouseClickDialog
 
 
-class EditorMouseClickHandlerJediPage(ConfigurationPageBase,
-                                      Ui_EditorMouseClickHandlerJediPage):
+class EditorMouseClickHandlerJediPage(
+    ConfigurationPageBase, Ui_EditorMouseClickHandlerJediPage
+):
     """
     Class implementing the Jedi Mouse Click Handler configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -36,31 +34,32 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("MouseClickHandlerJediPage")
-        
+
         # set initial values
         self.__modifiers = {
             "goto": (
                 Preferences.getJedi("MouseClickGotoModifiers"),
-                Preferences.getJedi("MouseClickGotoButton")
+                Preferences.getJedi("MouseClickGotoButton"),
             )
         }
-        
+
         self.jediClickHandlerCheckBox.setChecked(
-            Preferences.getJedi("MouseClickEnabled"))
-        self.gotoClickEdit.setText(MouseUtilities.MouseButtonModifier2String(
-            *self.__modifiers["goto"]))
-    
+            Preferences.getJedi("MouseClickEnabled")
+        )
+        self.gotoClickEdit.setText(
+            MouseUtilities.MouseButtonModifier2String(*self.__modifiers["goto"])
+        )
+
     def save(self):
         """
         Public slot to save the Jedi Mouse Click Handler configuration.
         """
         Preferences.setJedi(
-            "MouseClickEnabled", self.jediClickHandlerCheckBox.isChecked())
-        Preferences.setJedi(
-            "MouseClickGotoModifiers", self.__modifiers["goto"][0])
-        Preferences.setJedi(
-            "MouseClickGotoButton", self.__modifiers["goto"][1])
-    
+            "MouseClickEnabled", self.jediClickHandlerCheckBox.isChecked()
+        )
+        Preferences.setJedi("MouseClickGotoModifiers", self.__modifiers["goto"][0])
+        Preferences.setJedi("MouseClickGotoButton", self.__modifiers["goto"][1])
+
     @pyqtSlot()
     def on_changeGotoButton_clicked(self):
         """
@@ -70,14 +69,14 @@
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__modifiers["goto"] = dlg.getClick()
             self.gotoClickEdit.setText(
-                MouseUtilities.MouseButtonModifier2String(
-                    *self.__modifiers["goto"]))
+                MouseUtilities.MouseButtonModifier2String(*self.__modifiers["goto"])
+            )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,11 +13,13 @@
 import Preferences
 
 
-class EditorMouseClickHandlerPage(ConfigurationPageBase,
-                                  Ui_EditorMouseClickHandlerPage):
+class EditorMouseClickHandlerPage(
+    ConfigurationPageBase, Ui_EditorMouseClickHandlerPage
+):
     """
     Class implementing the Editor Mouse Click Handlers configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -25,24 +27,25 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorMouseClickHandlerPage")
-        
+
         # set initial values
         self.mcEnabledCheckBox.setChecked(
-            Preferences.getEditor("MouseClickHandlersEnabled"))
-        
+            Preferences.getEditor("MouseClickHandlersEnabled")
+        )
+
     def save(self):
         """
         Public slot to save the Editor Mouse Click Handlers configuration.
         """
         Preferences.setEditor(
-            "MouseClickHandlersEnabled",
-            self.mcEnabledCheckBox.isChecked())
-    
+            "MouseClickHandlersEnabled", self.mcEnabledCheckBox.isChecked()
+        )
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorPropertiesPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorPropertiesPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,534 +19,546 @@
     """
     Class implementing the Editor Properties configuration page.
     """
+
     def __init__(self, lexers):
         """
         Constructor
-        
+
         @param lexers reference to the lexers dictionary
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorPropertiesPage")
-        
+
         self.languages = sorted(list(lexers.keys())[:])
-        
+
         # set initial values
         # All
-        self.allFoldCompactCheckBox.setChecked(
-            Preferences.getEditor("AllFoldCompact"))
-        
+        self.allFoldCompactCheckBox.setChecked(Preferences.getEditor("AllFoldCompact"))
+
         # Bash
         self.foldBashCommentCheckBox.setChecked(
-            Preferences.getEditor("BashFoldComment"))
-        
+            Preferences.getEditor("BashFoldComment")
+        )
+
         # C++
-        self.foldCppCommentCheckBox.setChecked(
-            Preferences.getEditor("CppFoldComment"))
+        self.foldCppCommentCheckBox.setChecked(Preferences.getEditor("CppFoldComment"))
         self.foldCppPreprocessorCheckBox.setChecked(
-            Preferences.getEditor("CppFoldPreprocessor"))
-        self.foldCppAtElseCheckBox.setChecked(
-            Preferences.getEditor("CppFoldAtElse"))
+            Preferences.getEditor("CppFoldPreprocessor")
+        )
+        self.foldCppAtElseCheckBox.setChecked(Preferences.getEditor("CppFoldAtElse"))
         self.cppIndentOpeningBraceCheckBox.setChecked(
-            Preferences.getEditor("CppIndentOpeningBrace"))
+            Preferences.getEditor("CppIndentOpeningBrace")
+        )
         self.cppIndentClosingBraceCheckBox.setChecked(
-            Preferences.getEditor("CppIndentClosingBrace"))
+            Preferences.getEditor("CppIndentClosingBrace")
+        )
         self.cppCaseInsensitiveCheckBox.setChecked(
-            Preferences.getEditor("CppCaseInsensitiveKeywords"))
+            Preferences.getEditor("CppCaseInsensitiveKeywords")
+        )
         self.cppDollarAllowedCheckBox.setChecked(
-            Preferences.getEditor("CppDollarsAllowed"))
+            Preferences.getEditor("CppDollarsAllowed")
+        )
         self.cppStylePreprocessorCheckBox.setChecked(
-            Preferences.getEditor("CppStylePreprocessor"))
+            Preferences.getEditor("CppStylePreprocessor")
+        )
         self.cppHighlightTripleQuotedCheckBox.setChecked(
-            Preferences.getEditor("CppHighlightTripleQuotedStrings"))
+            Preferences.getEditor("CppHighlightTripleQuotedStrings")
+        )
         self.cppHighlightHashQuotedCheckBox.setChecked(
-            Preferences.getEditor("CppHighlightHashQuotedStrings"))
+            Preferences.getEditor("CppHighlightHashQuotedStrings")
+        )
         self.cppHighlightBackQuotedCheckBox.setChecked(
-            Preferences.getEditor("CppHighlightBackQuotedStrings"))
+            Preferences.getEditor("CppHighlightBackQuotedStrings")
+        )
         self.cppHighlightEsacepSequencesCheckBox.setChecked(
-            Preferences.getEditor("CppHighlightEscapeSequences"))
+            Preferences.getEditor("CppHighlightEscapeSequences")
+        )
         self.cppVerbatimStringEscapeAllowedCheckBox.setChecked(
-            Preferences.getEditor(
-                "CppVerbatimStringEscapeSequencesAllowed"))
-        
+            Preferences.getEditor("CppVerbatimStringEscapeSequencesAllowed")
+        )
+
         # CMake
         self.cmakeFoldAtElseCheckBox.setChecked(
-            Preferences.getEditor("CMakeFoldAtElse"))
-        
+            Preferences.getEditor("CMakeFoldAtElse")
+        )
+
         # CoffeeScript
         if "CoffeeScript" in self.languages:
             self.foldCoffeeScriptCommentCheckBox.setChecked(
-                Preferences.getEditor("CoffeScriptFoldComment"))
+                Preferences.getEditor("CoffeScriptFoldComment")
+            )
             self.coffeeScriptDollarAllowedCheckBox.setChecked(
-                Preferences.getEditor("CoffeeScriptDollarsAllowed"))
+                Preferences.getEditor("CoffeeScriptDollarsAllowed")
+            )
             self.coffeeScriptStylePreprocessorCheckBox.setChecked(
-                Preferences.getEditor("CoffeeScriptStylePreprocessor"))
+                Preferences.getEditor("CoffeeScriptStylePreprocessor")
+            )
         else:
             self.coffeeScriptGroup.setEnabled(False)
-        
+
         # CSS
-        self.foldCssCommentCheckBox.setChecked(
-            Preferences.getEditor("CssFoldComment"))
-        self.cssHssCheckBox.setChecked(
-            Preferences.getEditor("CssHssSupport"))
-        self.cssLessCheckBox.setChecked(
-            Preferences.getEditor("CssLessSupport"))
-        self.cssSassyCheckBox.setChecked(
-            Preferences.getEditor("CssSassySupport"))
-        
+        self.foldCssCommentCheckBox.setChecked(Preferences.getEditor("CssFoldComment"))
+        self.cssHssCheckBox.setChecked(Preferences.getEditor("CssHssSupport"))
+        self.cssLessCheckBox.setChecked(Preferences.getEditor("CssLessSupport"))
+        self.cssSassyCheckBox.setChecked(Preferences.getEditor("CssSassySupport"))
+
         # D
-        self.foldDCommentCheckBox.setChecked(
-            Preferences.getEditor("DFoldComment"))
-        self.foldDAtElseCheckBox.setChecked(
-            Preferences.getEditor("DFoldAtElse"))
+        self.foldDCommentCheckBox.setChecked(Preferences.getEditor("DFoldComment"))
+        self.foldDAtElseCheckBox.setChecked(Preferences.getEditor("DFoldAtElse"))
         self.dIndentOpeningBraceCheckBox.setChecked(
-            Preferences.getEditor("DIndentOpeningBrace"))
+            Preferences.getEditor("DIndentOpeningBrace")
+        )
         self.dIndentClosingBraceCheckBox.setChecked(
-            Preferences.getEditor("DIndentClosingBrace"))
-        
+            Preferences.getEditor("DIndentClosingBrace")
+        )
+
         # Gettext
         if "Gettext" in self.languages:
             self.foldPoCommentCheckBox.setChecked(
-                Preferences.getEditor("PoFoldComment"))
+                Preferences.getEditor("PoFoldComment")
+            )
         else:
             self.gettextGroup.setEnabled(False)
-        
+
         # HTML
         self.foldHtmlPreprocessorCheckBox.setChecked(
-            Preferences.getEditor("HtmlFoldPreprocessor"))
+            Preferences.getEditor("HtmlFoldPreprocessor")
+        )
         self.htmlCaseSensitiveTagsCheckBox.setChecked(
-            Preferences.getEditor("HtmlCaseSensitiveTags"))
+            Preferences.getEditor("HtmlCaseSensitiveTags")
+        )
         self.foldHtmlScriptCommentsCheckBox.setChecked(
-            Preferences.getEditor("HtmlFoldScriptComments"))
+            Preferences.getEditor("HtmlFoldScriptComments")
+        )
         self.foldHtmlScriptHereDocsCheckBox.setChecked(
-            Preferences.getEditor("HtmlFoldScriptHeredocs"))
-        self.htmlDjangoCheckBox.setChecked(
-            Preferences.getEditor("HtmlDjangoTemplates"))
-        self.htmlMakoCheckBox.setChecked(
-            Preferences.getEditor("HtmlMakoTemplates"))
-        
+            Preferences.getEditor("HtmlFoldScriptHeredocs")
+        )
+        self.htmlDjangoCheckBox.setChecked(Preferences.getEditor("HtmlDjangoTemplates"))
+        self.htmlMakoCheckBox.setChecked(Preferences.getEditor("HtmlMakoTemplates"))
+
         # JSON
         if "JSON" in self.languages:
             self.jsonHighlightCommentsCheckBox.setChecked(
-                Preferences.getEditor("JSONHightlightComments"))
+                Preferences.getEditor("JSONHightlightComments")
+            )
             self.jsonHighlightEscapeCheckBox.setChecked(
-                Preferences.getEditor("JSONHighlightEscapeSequences"))
+                Preferences.getEditor("JSONHighlightEscapeSequences")
+            )
         else:
             self.jsonGroup.setEnabled(False)
-        
+
         # Pascal
         self.pascalGroup.setEnabled(True)
         self.foldPascalCommentCheckBox.setChecked(
-            Preferences.getEditor("PascalFoldComment"))
+            Preferences.getEditor("PascalFoldComment")
+        )
         self.foldPascalPreprocessorCheckBox.setChecked(
-            Preferences.getEditor("PascalFoldPreprocessor"))
+            Preferences.getEditor("PascalFoldPreprocessor")
+        )
         self.pascalSmartHighlightingCheckBox.setChecked(
-            Preferences.getEditor("PascalSmartHighlighting"))
-        
+            Preferences.getEditor("PascalSmartHighlighting")
+        )
+
         # Perl
         self.foldPerlCommentCheckBox.setChecked(
-            Preferences.getEditor("PerlFoldComment"))
+            Preferences.getEditor("PerlFoldComment")
+        )
         self.foldPerlPackagesCheckBox.setChecked(
-            Preferences.getEditor("PerlFoldPackages"))
+            Preferences.getEditor("PerlFoldPackages")
+        )
         self.foldPerlPODBlocksCheckBox.setChecked(
-            Preferences.getEditor("PerlFoldPODBlocks"))
-        self.foldPerlAtElseCheckBox.setChecked(
-            Preferences.getEditor("PerlFoldAtElse"))
-        
+            Preferences.getEditor("PerlFoldPODBlocks")
+        )
+        self.foldPerlAtElseCheckBox.setChecked(Preferences.getEditor("PerlFoldAtElse"))
+
         # PostScript
         self.postscriptGroup.setEnabled(True)
         self.psFoldAtElseCheckBox.setChecked(
-            Preferences.getEditor("PostScriptFoldAtElse"))
+            Preferences.getEditor("PostScriptFoldAtElse")
+        )
         self.psMarkTokensCheckBox.setChecked(
-            Preferences.getEditor("PostScriptTokenize"))
-        self.psLevelSpinBox.setValue(
-            Preferences.getEditor("PostScriptLevel"))
-        
+            Preferences.getEditor("PostScriptTokenize")
+        )
+        self.psLevelSpinBox.setValue(Preferences.getEditor("PostScriptLevel"))
+
         # Povray
         self.foldPovrayCommentCheckBox.setChecked(
-            Preferences.getEditor("PovFoldComment"))
+            Preferences.getEditor("PovFoldComment")
+        )
         self.foldPovrayDirectivesCheckBox.setChecked(
-            Preferences.getEditor("PovFoldDirectives"))
-        
+            Preferences.getEditor("PovFoldDirectives")
+        )
+
         # Properties
         self.propertiesInitialSpacesCheckBox.setChecked(
-            Preferences.getEditor("PropertiesInitialSpaces"))
-        
+            Preferences.getEditor("PropertiesInitialSpaces")
+        )
+
         # Python
-        self.pythonBadIndentationComboBox.addItems([
-            self.tr("No Warning"),
-            self.tr("Inconsistent"),
-            self.tr("Tabs after Spaces"),
-            self.tr("Spaces"),
-            self.tr("Tabs"),
-        ])
+        self.pythonBadIndentationComboBox.addItems(
+            [
+                self.tr("No Warning"),
+                self.tr("Inconsistent"),
+                self.tr("Tabs after Spaces"),
+                self.tr("Spaces"),
+                self.tr("Tabs"),
+            ]
+        )
         self.pythonBadIndentationComboBox.setCurrentIndex(
-            Preferences.getEditor("PythonBadIndentation").value)
+            Preferences.getEditor("PythonBadIndentation").value
+        )
         self.foldPythonCommentCheckBox.setChecked(
-            Preferences.getEditor("PythonFoldComment"))
+            Preferences.getEditor("PythonFoldComment")
+        )
         self.foldPythonStringCheckBox.setChecked(
-            Preferences.getEditor("PythonFoldString"))
+            Preferences.getEditor("PythonFoldString")
+        )
         self.pythonAutoindentCheckBox.setChecked(
-            Preferences.getEditor("PythonAutoIndent"))
+            Preferences.getEditor("PythonAutoIndent")
+        )
         self.pythonV2UnicodeAllowedCheckBox.setChecked(
-            Preferences.getEditor("PythonAllowV2Unicode"))
+            Preferences.getEditor("PythonAllowV2Unicode")
+        )
         self.pythonV3BinaryAllowedCheckBox.setChecked(
-            Preferences.getEditor("PythonAllowV3Binary"))
+            Preferences.getEditor("PythonAllowV3Binary")
+        )
         self.pythonV3BytesAllowedCheckBox.setChecked(
-            Preferences.getEditor("PythonAllowV3Bytes"))
+            Preferences.getEditor("PythonAllowV3Bytes")
+        )
         self.foldPythonQuotesCheckBox.setChecked(
-            Preferences.getEditor("PythonFoldQuotes"))
+            Preferences.getEditor("PythonFoldQuotes")
+        )
         self.pythonStringsOverNewlineCheckBox.setChecked(
-            Preferences.getEditor("PythonStringsOverNewLineAllowed"))
+            Preferences.getEditor("PythonStringsOverNewLineAllowed")
+        )
         self.pythonHighlightSubidentifierCheckBox.setChecked(
-            Preferences.getEditor("PythonHighlightSubidentifier"))
-        
+            Preferences.getEditor("PythonHighlightSubidentifier")
+        )
+
         # Ruby
         self.foldRubyCommentCheckBox.setChecked(
-            Preferences.getEditor("RubyFoldComment"))
-        
+            Preferences.getEditor("RubyFoldComment")
+        )
+
         # SQL
-        self.foldSqlCommentCheckBox.setChecked(
-            Preferences.getEditor("SqlFoldComment"))
+        self.foldSqlCommentCheckBox.setChecked(Preferences.getEditor("SqlFoldComment"))
         self.sqlBackslashEscapesCheckBox.setChecked(
-            Preferences.getEditor("SqlBackslashEscapes"))
-        self.sqlFoldAtElseCheckBox.setChecked(
-            Preferences.getEditor("SqlFoldAtElse"))
+            Preferences.getEditor("SqlBackslashEscapes")
+        )
+        self.sqlFoldAtElseCheckBox.setChecked(Preferences.getEditor("SqlFoldAtElse"))
         self.sqlFoldOnlyBeginCheckBox.setChecked(
-            Preferences.getEditor("SqlFoldOnlyBegin"))
-        self.sqlDottedWordsCheckBox.setChecked(
-            Preferences.getEditor("SqlDottedWords"))
+            Preferences.getEditor("SqlFoldOnlyBegin")
+        )
+        self.sqlDottedWordsCheckBox.setChecked(Preferences.getEditor("SqlDottedWords"))
         self.sqlHashCommentsCheckBox.setChecked(
-            Preferences.getEditor("SqlHashComments"))
+            Preferences.getEditor("SqlHashComments")
+        )
         self.sqlQuotedIdentifiersCheckBox.setChecked(
-            Preferences.getEditor("SqlQuotedIdentifiers"))
-        
+            Preferences.getEditor("SqlQuotedIdentifiers")
+        )
+
         # TCL
-        self.foldTclCommentCheckBox.setChecked(
-            Preferences.getEditor("TclFoldComment"))
-        
+        self.foldTclCommentCheckBox.setChecked(Preferences.getEditor("TclFoldComment"))
+
         # TeX
-        self.foldTexCommentCheckBox.setChecked(
-            Preferences.getEditor("TexFoldComment"))
+        self.foldTexCommentCheckBox.setChecked(Preferences.getEditor("TexFoldComment"))
         self.texProcessCommentsCheckBox.setChecked(
-            Preferences.getEditor("TexProcessComments"))
-        self.texProcessIfCheckBox.setChecked(
-            Preferences.getEditor("TexProcessIf"))
-        
+            Preferences.getEditor("TexProcessComments")
+        )
+        self.texProcessIfCheckBox.setChecked(Preferences.getEditor("TexProcessIf"))
+
         # VHDL
         self.vhdlFoldCommentCheckBox.setChecked(
-            Preferences.getEditor("VHDLFoldComment"))
-        self.vhdlFoldAtElseCheckBox.setChecked(
-            Preferences.getEditor("VHDLFoldAtElse"))
+            Preferences.getEditor("VHDLFoldComment")
+        )
+        self.vhdlFoldAtElseCheckBox.setChecked(Preferences.getEditor("VHDLFoldAtElse"))
         self.vhdlFoldAtBeginCheckBox.setChecked(
-            Preferences.getEditor("VHDLFoldAtBegin"))
+            Preferences.getEditor("VHDLFoldAtBegin")
+        )
         self.vhdlFoldAtParenthesisCheckBox.setChecked(
-            Preferences.getEditor("VHDLFoldAtParenthesis"))
-        
+            Preferences.getEditor("VHDLFoldAtParenthesis")
+        )
+
         # XML
-        self.xmlSyleScriptsCheckBox.setChecked(
-            Preferences.getEditor("XMLStyleScripts"))
-        
+        self.xmlSyleScriptsCheckBox.setChecked(Preferences.getEditor("XMLStyleScripts"))
+
         # YAML
         self.yamlGroup.setEnabled(True)
         self.foldYamlCommentCheckBox.setChecked(
-            Preferences.getEditor("YAMLFoldComment"))
-        
+            Preferences.getEditor("YAMLFoldComment")
+        )
+
     def save(self):
         """
         Public slot to save the Editor Properties (1) configuration.
         """
         # All
-        Preferences.setEditor(
-            "AllFoldCompact",
-            self.allFoldCompactCheckBox.isChecked())
-        
+        Preferences.setEditor("AllFoldCompact", self.allFoldCompactCheckBox.isChecked())
+
         # Bash
         Preferences.setEditor(
-            "BashFoldComment",
-            self.foldBashCommentCheckBox.isChecked())
-        
+            "BashFoldComment", self.foldBashCommentCheckBox.isChecked()
+        )
+
         # CMake
         Preferences.setEditor(
-            "CMakeFoldAtElse",
-            self.cmakeFoldAtElseCheckBox.isChecked())
-        
+            "CMakeFoldAtElse", self.cmakeFoldAtElseCheckBox.isChecked()
+        )
+
         # C++
+        Preferences.setEditor("CppFoldComment", self.foldCppCommentCheckBox.isChecked())
         Preferences.setEditor(
-            "CppFoldComment",
-            self.foldCppCommentCheckBox.isChecked())
-        Preferences.setEditor(
-            "CppFoldPreprocessor",
-            self.foldCppPreprocessorCheckBox.isChecked())
-        Preferences.setEditor(
-            "CppFoldAtElse",
-            self.foldCppAtElseCheckBox.isChecked())
+            "CppFoldPreprocessor", self.foldCppPreprocessorCheckBox.isChecked()
+        )
+        Preferences.setEditor("CppFoldAtElse", self.foldCppAtElseCheckBox.isChecked())
         Preferences.setEditor(
-            "CppIndentOpeningBrace",
-            self.cppIndentOpeningBraceCheckBox.isChecked())
+            "CppIndentOpeningBrace", self.cppIndentOpeningBraceCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CppIndentClosingBrace",
-            self.cppIndentClosingBraceCheckBox.isChecked())
+            "CppIndentClosingBrace", self.cppIndentClosingBraceCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CppCaseInsensitiveKeywords",
-            self.cppCaseInsensitiveCheckBox.isChecked())
+            "CppCaseInsensitiveKeywords", self.cppCaseInsensitiveCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CppDollarsAllowed",
-            self.cppDollarAllowedCheckBox.isChecked())
+            "CppDollarsAllowed", self.cppDollarAllowedCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CppStylePreprocessor",
-            self.cppStylePreprocessorCheckBox.isChecked())
+            "CppStylePreprocessor", self.cppStylePreprocessorCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "CppHighlightTripleQuotedStrings",
-            self.cppHighlightTripleQuotedCheckBox.isChecked())
+            self.cppHighlightTripleQuotedCheckBox.isChecked(),
+        )
         Preferences.setEditor(
             "CppHighlightHashQuotedStrings",
-            self.cppHighlightHashQuotedCheckBox.isChecked())
+            self.cppHighlightHashQuotedCheckBox.isChecked(),
+        )
         Preferences.setEditor(
             "CppHighlightBackQuotedStrings",
-            self.cppHighlightBackQuotedCheckBox.isChecked())
+            self.cppHighlightBackQuotedCheckBox.isChecked(),
+        )
         Preferences.setEditor(
             "CppHighlightEscapeSequences",
-            self.cppHighlightEsacepSequencesCheckBox.isChecked())
+            self.cppHighlightEsacepSequencesCheckBox.isChecked(),
+        )
         Preferences.setEditor(
             "CppVerbatimStringEscapeSequencesAllowed",
-            self.cppVerbatimStringEscapeAllowedCheckBox.isChecked())
-        
+            self.cppVerbatimStringEscapeAllowedCheckBox.isChecked(),
+        )
+
         # CMake
         Preferences.setEditor(
-            "CMakeFoldAtElse",
-            self.cmakeFoldAtElseCheckBox.isChecked())
-        
+            "CMakeFoldAtElse", self.cmakeFoldAtElseCheckBox.isChecked()
+        )
+
         # CoffeeScript
         if "CoffeeScript" in self.languages:
             Preferences.setEditor(
                 "CoffeScriptFoldComment",
-                self.foldCoffeeScriptCommentCheckBox.isChecked())
+                self.foldCoffeeScriptCommentCheckBox.isChecked(),
+            )
             Preferences.setEditor(
                 "CoffeeScriptDollarsAllowed",
-                self.coffeeScriptDollarAllowedCheckBox.isChecked())
+                self.coffeeScriptDollarAllowedCheckBox.isChecked(),
+            )
             Preferences.setEditor(
                 "CoffeeScriptStylePreprocessor",
-                self.coffeeScriptStylePreprocessorCheckBox.isChecked())
-        
+                self.coffeeScriptStylePreprocessorCheckBox.isChecked(),
+            )
+
         # CSS
-        Preferences.setEditor(
-            "CssFoldComment",
-            self.foldCssCommentCheckBox.isChecked())
-        Preferences.setEditor(
-            "CssHssSupport",
-            self.cssHssCheckBox.isChecked())
-        Preferences.setEditor(
-            "CssLessSupport",
-            self.cssLessCheckBox.isChecked())
+        Preferences.setEditor("CssFoldComment", self.foldCssCommentCheckBox.isChecked())
+        Preferences.setEditor("CssHssSupport", self.cssHssCheckBox.isChecked())
+        Preferences.setEditor("CssLessSupport", self.cssLessCheckBox.isChecked())
+        Preferences.setEditor("CssSassySupport", self.cssSassyCheckBox.isChecked())
+
+        # D
+        Preferences.setEditor("DFoldComment", self.foldDCommentCheckBox.isChecked())
+        Preferences.setEditor("DFoldAtElse", self.foldDAtElseCheckBox.isChecked())
         Preferences.setEditor(
-            "CssSassySupport",
-            self.cssSassyCheckBox.isChecked())
-        
-        # D
-        Preferences.setEditor(
-            "DFoldComment",
-            self.foldDCommentCheckBox.isChecked())
+            "DIndentOpeningBrace", self.dIndentOpeningBraceCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "DFoldAtElse",
-            self.foldDAtElseCheckBox.isChecked())
-        Preferences.setEditor(
-            "DIndentOpeningBrace",
-            self.dIndentOpeningBraceCheckBox.isChecked())
-        Preferences.setEditor(
-            "DIndentClosingBrace",
-            self.dIndentClosingBraceCheckBox.isChecked())
-        
+            "DIndentClosingBrace", self.dIndentClosingBraceCheckBox.isChecked()
+        )
+
         # Gettext
         if "Gettext" in self.languages:
             Preferences.setEditor(
-                "PoFoldComment",
-                self.foldPoCommentCheckBox.isChecked())
-        
+                "PoFoldComment", self.foldPoCommentCheckBox.isChecked()
+            )
+
         # HTML
         Preferences.setEditor(
-            "HtmlFoldPreprocessor",
-            self.foldHtmlPreprocessorCheckBox.isChecked())
+            "HtmlFoldPreprocessor", self.foldHtmlPreprocessorCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "HtmlCaseSensitiveTags",
-            self.htmlCaseSensitiveTagsCheckBox.isChecked())
-        Preferences.setEditor(
-            "HtmlFoldScriptComments",
-            self.foldHtmlScriptCommentsCheckBox.isChecked())
+            "HtmlCaseSensitiveTags", self.htmlCaseSensitiveTagsCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "HtmlFoldScriptHeredocs",
-            self.foldHtmlScriptHereDocsCheckBox.isChecked())
+            "HtmlFoldScriptComments", self.foldHtmlScriptCommentsCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "HtmlDjangoTemplates",
-            self.htmlDjangoCheckBox.isChecked())
+            "HtmlFoldScriptHeredocs", self.foldHtmlScriptHereDocsCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "HtmlMakoTemplates",
-            self.htmlMakoCheckBox.isChecked())
-        
+            "HtmlDjangoTemplates", self.htmlDjangoCheckBox.isChecked()
+        )
+        Preferences.setEditor("HtmlMakoTemplates", self.htmlMakoCheckBox.isChecked())
+
         # JSON
         if "JSON" in self.languages:
             Preferences.setEditor(
-                "JSONHightlightComments",
-                self.jsonHighlightCommentsCheckBox.isChecked())
+                "JSONHightlightComments", self.jsonHighlightCommentsCheckBox.isChecked()
+            )
             Preferences.setEditor(
                 "JSONHighlightEscapeSequences",
-                self.jsonHighlightEscapeCheckBox.isChecked())
-        
+                self.jsonHighlightEscapeCheckBox.isChecked(),
+            )
+
         # Pascal
         Preferences.setEditor(
-            "PascalFoldComment",
-            self.foldPascalCommentCheckBox.isChecked())
+            "PascalFoldComment", self.foldPascalCommentCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PascalFoldPreprocessor",
-            self.foldPascalPreprocessorCheckBox.isChecked())
+            "PascalFoldPreprocessor", self.foldPascalPreprocessorCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PascalSmartHighlighting",
-            self.pascalSmartHighlightingCheckBox.isChecked())
-        
+            "PascalSmartHighlighting", self.pascalSmartHighlightingCheckBox.isChecked()
+        )
+
         # Perl
         Preferences.setEditor(
-            "PerlFoldComment",
-            self.foldPerlCommentCheckBox.isChecked())
-        Preferences.setEditor(
-            "PerlFoldPackages",
-            self.foldPerlPackagesCheckBox.isChecked())
+            "PerlFoldComment", self.foldPerlCommentCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PerlFoldPODBlocks",
-            self.foldPerlPODBlocksCheckBox.isChecked())
+            "PerlFoldPackages", self.foldPerlPackagesCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PerlFoldAtElse",
-            self.foldPerlAtElseCheckBox.isChecked())
-        
+            "PerlFoldPODBlocks", self.foldPerlPODBlocksCheckBox.isChecked()
+        )
+        Preferences.setEditor("PerlFoldAtElse", self.foldPerlAtElseCheckBox.isChecked())
+
         # PostScript
         Preferences.setEditor(
-            "PostScriptFoldAtElse",
-            self.psFoldAtElseCheckBox.isChecked())
+            "PostScriptFoldAtElse", self.psFoldAtElseCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PostScriptTokenize",
-            self.psMarkTokensCheckBox.isChecked())
-        Preferences.setEditor(
-            "PostScriptLevel",
-            self.psLevelSpinBox.value())
-        
+            "PostScriptTokenize", self.psMarkTokensCheckBox.isChecked()
+        )
+        Preferences.setEditor("PostScriptLevel", self.psLevelSpinBox.value())
+
         # Povray
         Preferences.setEditor(
-            "PovFoldComment",
-            self.foldPovrayCommentCheckBox.isChecked())
+            "PovFoldComment", self.foldPovrayCommentCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PovFoldDirectives",
-            self.foldPovrayDirectivesCheckBox.isChecked())
-        
+            "PovFoldDirectives", self.foldPovrayDirectivesCheckBox.isChecked()
+        )
+
         # Properties
         Preferences.setEditor(
-            "PropertiesInitialSpaces",
-            self.propertiesInitialSpacesCheckBox.isChecked())
-        
+            "PropertiesInitialSpaces", self.propertiesInitialSpacesCheckBox.isChecked()
+        )
+
         # Python
         Preferences.setEditor(
-            "PythonFoldComment",
-            self.foldPythonCommentCheckBox.isChecked())
+            "PythonFoldComment", self.foldPythonCommentCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PythonFoldString",
-            self.foldPythonStringCheckBox.isChecked())
+            "PythonFoldString", self.foldPythonStringCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "PythonBadIndentation",
             QsciLexerPython.IndentationWarning(
-                self.pythonBadIndentationComboBox.currentIndex()))
+                self.pythonBadIndentationComboBox.currentIndex()
+            ),
+        )
         Preferences.setEditor(
-            "PythonAutoIndent",
-            self.pythonAutoindentCheckBox.isChecked())
-        Preferences.setEditor(
-            "PythonAllowV2Unicode",
-            self.pythonV2UnicodeAllowedCheckBox.isChecked())
+            "PythonAutoIndent", self.pythonAutoindentCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PythonAllowV3Binary",
-            self.pythonV3BinaryAllowedCheckBox.isChecked())
+            "PythonAllowV2Unicode", self.pythonV2UnicodeAllowedCheckBox.isChecked()
+        )
+        Preferences.setEditor(
+            "PythonAllowV3Binary", self.pythonV3BinaryAllowedCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PythonAllowV3Bytes",
-            self.pythonV3BytesAllowedCheckBox.isChecked())
+            "PythonAllowV3Bytes", self.pythonV3BytesAllowedCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "PythonFoldQuotes",
-            self.foldPythonQuotesCheckBox.isChecked())
+            "PythonFoldQuotes", self.foldPythonQuotesCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "PythonStringsOverNewLineAllowed",
-            self.pythonStringsOverNewlineCheckBox.isChecked())
+            self.pythonStringsOverNewlineCheckBox.isChecked(),
+        )
         Preferences.setEditor(
             "PythonHighlightSubidentifier",
-            self.pythonHighlightSubidentifierCheckBox.isChecked())
-        
+            self.pythonHighlightSubidentifierCheckBox.isChecked(),
+        )
+
         # Ruby
         Preferences.setEditor(
-            "RubyFoldComment",
-            self.foldRubyCommentCheckBox.isChecked())
-        
+            "RubyFoldComment", self.foldRubyCommentCheckBox.isChecked()
+        )
+
         # SQL
-        Preferences.setEditor(
-            "SqlFoldComment",
-            self.foldSqlCommentCheckBox.isChecked())
+        Preferences.setEditor("SqlFoldComment", self.foldSqlCommentCheckBox.isChecked())
         Preferences.setEditor(
-            "SqlBackslashEscapes",
-            self.sqlBackslashEscapesCheckBox.isChecked())
-        Preferences.setEditor(
-            "SqlFoldAtElse",
-            self.sqlFoldAtElseCheckBox.isChecked())
+            "SqlBackslashEscapes", self.sqlBackslashEscapesCheckBox.isChecked()
+        )
+        Preferences.setEditor("SqlFoldAtElse", self.sqlFoldAtElseCheckBox.isChecked())
         Preferences.setEditor(
-            "SqlFoldOnlyBegin",
-            self.sqlFoldOnlyBeginCheckBox.isChecked())
-        Preferences.setEditor(
-            "SqlDottedWords",
-            self.sqlDottedWordsCheckBox.isChecked())
+            "SqlFoldOnlyBegin", self.sqlFoldOnlyBeginCheckBox.isChecked()
+        )
+        Preferences.setEditor("SqlDottedWords", self.sqlDottedWordsCheckBox.isChecked())
         Preferences.setEditor(
-            "SqlHashComments",
-            self.sqlHashCommentsCheckBox.isChecked())
-        Preferences.setEditor(
-            "SqlQuotedIdentifiers",
-            self.sqlQuotedIdentifiersCheckBox.isChecked())
-        
-        # TCL
+            "SqlHashComments", self.sqlHashCommentsCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "TclFoldComment",
-            self.foldTclCommentCheckBox.isChecked())
-        
+            "SqlQuotedIdentifiers", self.sqlQuotedIdentifiersCheckBox.isChecked()
+        )
+
+        # TCL
+        Preferences.setEditor("TclFoldComment", self.foldTclCommentCheckBox.isChecked())
+
         # TeX
+        Preferences.setEditor("TexFoldComment", self.foldTexCommentCheckBox.isChecked())
         Preferences.setEditor(
-            "TexFoldComment",
-            self.foldTexCommentCheckBox.isChecked())
-        Preferences.setEditor(
-            "TexProcessComments",
-            self.texProcessCommentsCheckBox.isChecked())
-        Preferences.setEditor(
-            "TexProcessIf",
-            self.texProcessIfCheckBox.isChecked())
-        
+            "TexProcessComments", self.texProcessCommentsCheckBox.isChecked()
+        )
+        Preferences.setEditor("TexProcessIf", self.texProcessIfCheckBox.isChecked())
+
         # VHDL
         Preferences.setEditor(
-            "VHDLFoldComment",
-            self.vhdlFoldCommentCheckBox.isChecked())
-        Preferences.setEditor(
-            "VHDLFoldAtElse",
-            self.vhdlFoldAtElseCheckBox.isChecked())
+            "VHDLFoldComment", self.vhdlFoldCommentCheckBox.isChecked()
+        )
+        Preferences.setEditor("VHDLFoldAtElse", self.vhdlFoldAtElseCheckBox.isChecked())
         Preferences.setEditor(
-            "VHDLFoldAtBegin",
-            self.vhdlFoldAtBeginCheckBox.isChecked())
+            "VHDLFoldAtBegin", self.vhdlFoldAtBeginCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "VHDLFoldAtParenthesis",
-            self.vhdlFoldAtParenthesisCheckBox.isChecked())
-        
+            "VHDLFoldAtParenthesis", self.vhdlFoldAtParenthesisCheckBox.isChecked()
+        )
+
         # XML
         Preferences.setEditor(
-            "XMLStyleScripts",
-            self.xmlSyleScriptsCheckBox.isChecked())
-        
+            "XMLStyleScripts", self.xmlSyleScriptsCheckBox.isChecked()
+        )
+
         # YAML
         Preferences.setEditor(
-            "YAMLFoldComment",
-            self.foldYamlCommentCheckBox.isChecked())
+            "YAMLFoldComment", self.foldYamlCommentCheckBox.isChecked()
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorSearchPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorSearchPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class implementing the Editor Search configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -24,58 +25,65 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorSearchPage")
-        
+
         self.editorColours = {}
-        
+
         # set initial values
         self.searchMarkersEnabledCheckBox.setChecked(
-            Preferences.getEditor("SearchMarkersEnabled"))
+            Preferences.getEditor("SearchMarkersEnabled")
+        )
         self.quicksearchMarkersEnabledCheckBox.setChecked(
-            Preferences.getEditor("QuickSearchMarkersEnabled"))
+            Preferences.getEditor("QuickSearchMarkersEnabled")
+        )
         self.occurrencesMarkersEnabledCheckBox.setChecked(
-            Preferences.getEditor("MarkOccurrencesEnabled"))
-        
+            Preferences.getEditor("MarkOccurrencesEnabled")
+        )
+
         self.markOccurrencesTimeoutSpinBox.setValue(
-            Preferences.getEditor("MarkOccurrencesTimeout"))
-        
+            Preferences.getEditor("MarkOccurrencesTimeout")
+        )
+
         if Preferences.getEditor("SearchRegexpMode") == 0:
             self.regexpPosixButton.setChecked(True)
         else:
             self.regexpCxx11Button.setChecked(True)
-        
+
         self.initColour(
-            "SearchMarkers", self.searchMarkerButton,
-            Preferences.getEditorColour, hasAlpha=True)
-        
+            "SearchMarkers",
+            self.searchMarkerButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+
     def save(self):
         """
         Public slot to save the Editor Search configuration.
         """
         Preferences.setEditor(
-            "SearchMarkersEnabled",
-            self.searchMarkersEnabledCheckBox.isChecked())
+            "SearchMarkersEnabled", self.searchMarkersEnabledCheckBox.isChecked()
+        )
         Preferences.setEditor(
             "QuickSearchMarkersEnabled",
-            self.quicksearchMarkersEnabledCheckBox.isChecked())
+            self.quicksearchMarkersEnabledCheckBox.isChecked(),
+        )
         Preferences.setEditor(
-            "MarkOccurrencesEnabled",
-            self.occurrencesMarkersEnabledCheckBox.isChecked())
-        
+            "MarkOccurrencesEnabled", self.occurrencesMarkersEnabledCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "MarkOccurrencesTimeout",
-            self.markOccurrencesTimeoutSpinBox.value())
-        
+            "MarkOccurrencesTimeout", self.markOccurrencesTimeoutSpinBox.value()
+        )
+
         mode = 0 if self.regexpPosixButton.isChecked() else 1
-        Preferences.setEditor(
-            "SearchRegexpMode", mode)
-        
+        Preferences.setEditor("SearchRegexpMode", mode)
+
         self.saveColours(Preferences.setEditorColour)
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorSpellCheckingPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorSpellCheckingPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,11 +15,11 @@
 import Preferences
 
 
-class EditorSpellCheckingPage(ConfigurationPageBase,
-                              Ui_EditorSpellCheckingPage):
+class EditorSpellCheckingPage(ConfigurationPageBase, Ui_EditorSpellCheckingPage):
     """
     Class implementing the Editor Spellchecking configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,97 +27,107 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorSpellCheckingPage")
-        
+
         self.pwlPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pwlPicker.setFilters(self.tr(
-            "Dictionary File (*.dic);;All Files (*)"))
-        
+        self.pwlPicker.setFilters(self.tr("Dictionary File (*.dic);;All Files (*)"))
+
         self.pelPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pelPicker.setFilters(self.tr(
-            "Dictionary File (*.dic);;All Files (*)"))
-        
+        self.pelPicker.setFilters(self.tr("Dictionary File (*.dic);;All Files (*)"))
+
         from QScintilla.SpellChecker import SpellChecker
+
         languages = sorted(SpellChecker.getAvailableLanguages())
         self.defaultLanguageCombo.addItems(languages)
         if languages:
             self.errorLabel.hide()
         else:
             self.spellingFrame.setEnabled(False)
-        
+
         # set initial values
         self.checkingEnabledCheckBox.setChecked(
-            Preferences.getEditor("SpellCheckingEnabled"))
-        
+            Preferences.getEditor("SpellCheckingEnabled")
+        )
+
         self.defaultLanguageCombo.setCurrentIndex(
             self.defaultLanguageCombo.findText(
-                Preferences.getEditor("SpellCheckingDefaultLanguage")))
-        
+                Preferences.getEditor("SpellCheckingDefaultLanguage")
+            )
+        )
+
         self.stringsOnlyCheckBox.setChecked(
-            Preferences.getEditor("SpellCheckStringsOnly"))
+            Preferences.getEditor("SpellCheckStringsOnly")
+        )
         self.fullCheckUnknownCheckBox.setChecked(
-            Preferences.getEditor("FullSpellCheckUnknown"))
+            Preferences.getEditor("FullSpellCheckUnknown")
+        )
         self.minimumWordSizeSlider.setValue(
-            Preferences.getEditor("SpellCheckingMinWordSize"))
+            Preferences.getEditor("SpellCheckingMinWordSize")
+        )
         self.spellCheckTextFilesLineEdit.setText(
-            " ".join(Preferences.getEditor("FullSpellCheckExtensions")))
-        
+            " ".join(Preferences.getEditor("FullSpellCheckExtensions"))
+        )
+
         self.initColour(
-            "SpellingMarkers", self.spellingMarkerButton,
-            Preferences.getEditorColour, hasAlpha=True)
-        
-        self.pwlPicker.setText(
-            Preferences.getEditor("SpellCheckingPersonalWordList"))
+            "SpellingMarkers",
+            self.spellingMarkerButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+
+        self.pwlPicker.setText(Preferences.getEditor("SpellCheckingPersonalWordList"))
         self.pelPicker.setText(
-            Preferences.getEditor("SpellCheckingPersonalExcludeList"))
-        
+            Preferences.getEditor("SpellCheckingPersonalExcludeList")
+        )
+
         if self.spellingFrame.isEnabled():
             self.enabledCheckBox.setChecked(
-                Preferences.getEditor("AutoSpellCheckingEnabled"))
+                Preferences.getEditor("AutoSpellCheckingEnabled")
+            )
         else:
             self.enabledCheckBox.setChecked(False)  # not available
-        self.chunkSizeSpinBox.setValue(
-            Preferences.getEditor("AutoSpellCheckChunkSize"))
-        
+        self.chunkSizeSpinBox.setValue(Preferences.getEditor("AutoSpellCheckChunkSize"))
+
     def save(self):
         """
         Public slot to save the Editor Search configuration.
         """
         Preferences.setEditor(
-            "SpellCheckingEnabled", self.checkingEnabledCheckBox.isChecked())
-        
+            "SpellCheckingEnabled", self.checkingEnabledCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "SpellCheckingDefaultLanguage",
-            self.defaultLanguageCombo.currentText())
-        
+            "SpellCheckingDefaultLanguage", self.defaultLanguageCombo.currentText()
+        )
+
         Preferences.setEditor(
-            "SpellCheckStringsOnly", self.stringsOnlyCheckBox.isChecked())
+            "SpellCheckStringsOnly", self.stringsOnlyCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "FullSpellCheckUnknown",
-            self.fullCheckUnknownCheckBox.isChecked())
+            "FullSpellCheckUnknown", self.fullCheckUnknownCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "SpellCheckingMinWordSize", self.minimumWordSizeSlider.value())
+            "SpellCheckingMinWordSize", self.minimumWordSizeSlider.value()
+        )
         Preferences.setEditor(
             "FullSpellCheckExtensions",
-            [ext.strip() for ext in
-             self.spellCheckTextFilesLineEdit.text().split()])
-        
+            [ext.strip() for ext in self.spellCheckTextFilesLineEdit.text().split()],
+        )
+
         self.saveColours(Preferences.setEditorColour)
-        
+
+        Preferences.setEditor("SpellCheckingPersonalWordList", self.pwlPicker.text())
+        Preferences.setEditor("SpellCheckingPersonalExcludeList", self.pelPicker.text())
+
         Preferences.setEditor(
-            "SpellCheckingPersonalWordList", self.pwlPicker.text())
-        Preferences.setEditor(
-            "SpellCheckingPersonalExcludeList", self.pelPicker.text())
-        
-        Preferences.setEditor(
-            "AutoSpellCheckingEnabled", self.enabledCheckBox.isChecked())
-        Preferences.setEditor(
-            "AutoSpellCheckChunkSize", self.chunkSizeSpinBox.value())
+            "AutoSpellCheckingEnabled", self.enabledCheckBox.isChecked()
+        )
+        Preferences.setEditor("AutoSpellCheckChunkSize", self.chunkSizeSpinBox.value())
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorStylesPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorStylesPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,6 +22,7 @@
     """
     Class implementing the Editor Styles configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -29,9 +30,9 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorStylesPage")
-        
+
         from QScintilla.QsciScintillaCompat import QsciScintillaCompat
-        
+
         self.foldStyles = [
             QsciScintilla.FoldStyle.PlainFoldStyle.value,
             QsciScintilla.FoldStyle.CircledFoldStyle.value,
@@ -42,50 +43,56 @@
             QsciScintillaCompat.ArrowFoldStyle,
             QsciScintillaCompat.ArrowTreeFoldStyle,
         ]
-        
+
         self.edgeModes = [
             QsciScintilla.EdgeMode.EdgeNone,
             QsciScintilla.EdgeMode.EdgeLine,
-            QsciScintilla.EdgeMode.EdgeBackground
+            QsciScintilla.EdgeMode.EdgeBackground,
         ]
-        
+
         self.wrapModeComboBox.addItem(
-            self.tr("Disabled"),
-            QsciScintilla.WrapMode.WrapNone)
+            self.tr("Disabled"), QsciScintilla.WrapMode.WrapNone
+        )
         self.wrapModeComboBox.addItem(
-            self.tr("Word Boundary"),
-            QsciScintilla.WrapMode.WrapWord)
+            self.tr("Word Boundary"), QsciScintilla.WrapMode.WrapWord
+        )
         self.wrapModeComboBox.addItem(
-            self.tr("Character Boundary"),
-            QsciScintilla.WrapMode.WrapCharacter)
+            self.tr("Character Boundary"), QsciScintilla.WrapMode.WrapCharacter
+        )
         self.wrapVisualComboBox.addItem(
-            self.tr("No Indicator"),
-            QsciScintilla.WrapVisualFlag.WrapFlagNone)
+            self.tr("No Indicator"), QsciScintilla.WrapVisualFlag.WrapFlagNone
+        )
         self.wrapVisualComboBox.addItem(
-            self.tr("Indicator by Text"),
-            QsciScintilla.WrapVisualFlag.WrapFlagByText)
+            self.tr("Indicator by Text"), QsciScintilla.WrapVisualFlag.WrapFlagByText
+        )
         self.wrapVisualComboBox.addItem(
             self.tr("Indicator by Margin"),
-            QsciScintilla.WrapVisualFlag.WrapFlagByBorder)
+            QsciScintilla.WrapVisualFlag.WrapFlagByBorder,
+        )
         self.wrapVisualComboBox.addItem(
             self.tr("Indicator in Line Number Margin"),
-            QsciScintilla.WrapVisualFlag.WrapFlagInMargin)
-        
-        self.wrapIndentComboBox.addItem(
-            self.tr("Fixed"), QsciScintilla.WrapIndentMode.WrapIndentFixed)
+            QsciScintilla.WrapVisualFlag.WrapFlagInMargin,
+        )
+
         self.wrapIndentComboBox.addItem(
-            self.tr("Aligned"), QsciScintilla.WrapIndentMode.WrapIndentSame)
+            self.tr("Fixed"), QsciScintilla.WrapIndentMode.WrapIndentFixed
+        )
         self.wrapIndentComboBox.addItem(
-            self.tr("Aligned plus One"),
-            QsciScintilla.WrapIndentMode.WrapIndentIndented)
+            self.tr("Aligned"), QsciScintilla.WrapIndentMode.WrapIndentSame
+        )
+        self.wrapIndentComboBox.addItem(
+            self.tr("Aligned plus One"), QsciScintilla.WrapIndentMode.WrapIndentIndented
+        )
         self.wrapIndentComboBox.addItem(
             self.tr("Aligned plus Two"),
-            QsciScintilla.WrapIndentMode.WrapIndentDeeplyIndented)
-        
+            QsciScintilla.WrapIndentMode.WrapIndentDeeplyIndented,
+        )
+
         # set initial values
         try:
             self.foldingStyleComboBox.setCurrentIndex(
-                self.foldStyles.index(Preferences.getEditor("FoldingStyle")))
+                self.foldStyles.index(Preferences.getEditor("FoldingStyle"))
+            )
         except ValueError:
             self.foldingStyleComboBox.setCurrentIndex(0)
         self.marginsFont = Preferences.getEditorOtherFonts("MarginsFont")
@@ -94,330 +101,399 @@
         self.defaultFontSample.setFont(self.defaultFont)
         self.monospacedFont = Preferences.getEditorOtherFonts("MonospacedFont")
         self.monospacedFontSample.setFont(self.monospacedFont)
-        self.monospacedCheckBox.setChecked(
-            Preferences.getEditor("UseMonospacedFont"))
-        self.linenoCheckBox.setChecked(
-            Preferences.getEditor("LinenoMargin"))
-        self.foldingCheckBox.setChecked(
-            Preferences.getEditor("FoldingMargin"))
-        
+        self.monospacedCheckBox.setChecked(Preferences.getEditor("UseMonospacedFont"))
+        self.linenoCheckBox.setChecked(Preferences.getEditor("LinenoMargin"))
+        self.foldingCheckBox.setChecked(Preferences.getEditor("FoldingMargin"))
+
         self.caretlineVisibleCheckBox.setChecked(
-            Preferences.getEditor("CaretLineVisible"))
+            Preferences.getEditor("CaretLineVisible")
+        )
         self.caretlineAlwaysVisibleCheckBox.setChecked(
-            Preferences.getEditor("CaretLineAlwaysVisible"))
-        self.caretWidthSpinBox.setValue(
-            Preferences.getEditor("CaretWidth"))
+            Preferences.getEditor("CaretLineAlwaysVisible")
+        )
+        self.caretWidthSpinBox.setValue(Preferences.getEditor("CaretWidth"))
         self.caretlineFrameWidthSpinBox.setValue(
-            Preferences.getEditor("CaretLineFrameWidth"))
+            Preferences.getEditor("CaretLineFrameWidth")
+        )
         self.colourizeSelTextCheckBox.setChecked(
-            Preferences.getEditor("ColourizeSelText"))
+            Preferences.getEditor("ColourizeSelText")
+        )
         self.customSelColourCheckBox.setChecked(
-            Preferences.getEditor("CustomSelectionColours"))
+            Preferences.getEditor("CustomSelectionColours")
+        )
         self.extentSelEolCheckBox.setChecked(
-            Preferences.getEditor("ExtendSelectionToEol"))
+            Preferences.getEditor("ExtendSelectionToEol")
+        )
         self.debugMarkerBackgroundCheckBox.setChecked(
-            Preferences.getEditor("LineMarkersBackground"))
-        
-        self.initColour("CaretForeground", self.caretForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("CaretLineBackground", self.caretlineBackgroundButton,
-                        Preferences.getEditorColour, hasAlpha=True)
-        self.initColour("SelectionForeground", self.selectionForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("SelectionBackground", self.selectionBackgroundButton,
-                        Preferences.getEditorColour, hasAlpha=True)
-        self.initColour("CurrentMarker", self.currentLineMarkerButton,
-                        Preferences.getEditorColour, hasAlpha=True)
-        self.initColour("ErrorMarker", self.errorMarkerButton,
-                        Preferences.getEditorColour, hasAlpha=True)
-        self.initColour("MarginsForeground", self.marginsForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("MarginsBackground", self.marginsBackgroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("FoldmarginBackground",
-                        self.foldmarginBackgroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("FoldMarkersForeground",
-                        self.foldmarkersForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("FoldMarkersBackground",
-                        self.foldmarkersBackgroundButton,
-                        Preferences.getEditorColour)
-        
+            Preferences.getEditor("LineMarkersBackground")
+        )
+
+        self.initColour(
+            "CaretForeground", self.caretForegroundButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "CaretLineBackground",
+            self.caretlineBackgroundButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+        self.initColour(
+            "SelectionForeground",
+            self.selectionForegroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "SelectionBackground",
+            self.selectionBackgroundButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+        self.initColour(
+            "CurrentMarker",
+            self.currentLineMarkerButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+        self.initColour(
+            "ErrorMarker",
+            self.errorMarkerButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+        self.initColour(
+            "MarginsForeground",
+            self.marginsForegroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "MarginsBackground",
+            self.marginsBackgroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "FoldmarginBackground",
+            self.foldmarginBackgroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "FoldMarkersForeground",
+            self.foldmarkersForegroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "FoldMarkersBackground",
+            self.foldmarkersBackgroundButton,
+            Preferences.getEditorColour,
+        )
+
         self.editorColours = {}
         self.editorColours["AnnotationsWarningForeground"] = QColor(
-            Preferences.getEditorColour("AnnotationsWarningForeground"))
+            Preferences.getEditorColour("AnnotationsWarningForeground")
+        )
         self.editorColours["AnnotationsWarningBackground"] = QColor(
-            Preferences.getEditorColour("AnnotationsWarningBackground"))
+            Preferences.getEditorColour("AnnotationsWarningBackground")
+        )
         self.editorColours["AnnotationsErrorForeground"] = QColor(
-            Preferences.getEditorColour("AnnotationsErrorForeground"))
+            Preferences.getEditorColour("AnnotationsErrorForeground")
+        )
         self.editorColours["AnnotationsErrorBackground"] = QColor(
-            Preferences.getEditorColour("AnnotationsErrorBackground"))
+            Preferences.getEditorColour("AnnotationsErrorBackground")
+        )
         self.editorColours["AnnotationsStyleForeground"] = QColor(
-            Preferences.getEditorColour("AnnotationsStyleForeground"))
+            Preferences.getEditorColour("AnnotationsStyleForeground")
+        )
         self.editorColours["AnnotationsStyleBackground"] = QColor(
-            Preferences.getEditorColour("AnnotationsStyleBackground"))
-        
+            Preferences.getEditorColour("AnnotationsStyleBackground")
+        )
+
         self.eolCheckBox.setChecked(Preferences.getEditor("ShowEOL"))
-        self.wrapModeComboBox.setCurrentIndex(self.wrapModeComboBox.findData(
-            Preferences.getEditor("WrapLongLinesMode")))
+        self.wrapModeComboBox.setCurrentIndex(
+            self.wrapModeComboBox.findData(Preferences.getEditor("WrapLongLinesMode"))
+        )
         self.wrapVisualComboBox.setCurrentIndex(
-            self.wrapVisualComboBox.findData(
-                Preferences.getEditor("WrapVisualFlag")))
+            self.wrapVisualComboBox.findData(Preferences.getEditor("WrapVisualFlag"))
+        )
         self.wrapIndentComboBox.setCurrentIndex(
-            self.wrapIndentComboBox.findData(
-                Preferences.getEditor("WrapIndentMode")))
-        self.wrapStartIndentSpinBox.setValue(
-            Preferences.getEditor("WrapStartIndent"))
-        
+            self.wrapIndentComboBox.findData(Preferences.getEditor("WrapIndentMode"))
+        )
+        self.wrapStartIndentSpinBox.setValue(Preferences.getEditor("WrapStartIndent"))
+
         self.edgeModeCombo.setCurrentIndex(
-            self.edgeModes.index(Preferences.getEditor("EdgeMode")))
-        self.edgeLineColumnSlider.setValue(
-            Preferences.getEditor("EdgeColumn"))
+            self.edgeModes.index(Preferences.getEditor("EdgeMode"))
+        )
+        self.edgeLineColumnSlider.setValue(Preferences.getEditor("EdgeColumn"))
         self.initColour(
-            "Edge", self.edgeBackgroundColorButton,
-            Preferences.getEditorColour)
-        
+            "Edge", self.edgeBackgroundColorButton, Preferences.getEditorColour
+        )
+
         self.bracehighlightingCheckBox.setChecked(
-            Preferences.getEditor("BraceHighlighting"))
-        self.initColour("MatchingBrace", self.matchingBracesButton,
-                        Preferences.getEditorColour)
-        self.initColour("MatchingBraceBack", self.matchingBracesBackButton,
-                        Preferences.getEditorColour)
-        self.initColour("NonmatchingBrace", self.nonmatchingBracesButton,
-                        Preferences.getEditorColour)
-        self.initColour("NonmatchingBraceBack",
-                        self.nonmatchingBracesBackButton,
-                        Preferences.getEditorColour)
-        
-        self.zoomfactorSlider.setValue(
-            Preferences.getEditor("ZoomFactor"))
-        
-        self.whitespaceCheckBox.setChecked(
-            Preferences.getEditor("ShowWhitespace"))
-        self.whitespaceSizeSpinBox.setValue(
-            Preferences.getEditor("WhitespaceSize"))
-        self.initColour("WhitespaceForeground",
-                        self.whitespaceForegroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("WhitespaceBackground",
-                        self.whitespaceBackgroundButton,
-                        Preferences.getEditorColour)
+            Preferences.getEditor("BraceHighlighting")
+        )
+        self.initColour(
+            "MatchingBrace", self.matchingBracesButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "MatchingBraceBack",
+            self.matchingBracesBackButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "NonmatchingBrace",
+            self.nonmatchingBracesButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "NonmatchingBraceBack",
+            self.nonmatchingBracesBackButton,
+            Preferences.getEditorColour,
+        )
+
+        self.zoomfactorSlider.setValue(Preferences.getEditor("ZoomFactor"))
+
+        self.whitespaceCheckBox.setChecked(Preferences.getEditor("ShowWhitespace"))
+        self.whitespaceSizeSpinBox.setValue(Preferences.getEditor("WhitespaceSize"))
+        self.initColour(
+            "WhitespaceForeground",
+            self.whitespaceForegroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "WhitespaceBackground",
+            self.whitespaceBackgroundButton,
+            Preferences.getEditorColour,
+        )
         if not hasattr(QsciScintilla, "setWhitespaceForegroundColor"):
             self.whitespaceSizeSpinBox.setEnabled(False)
             self.whitespaceForegroundButton.setEnabled(False)
             self.whitespaceBackgroundButton.setEnabled(False)
-        
-        self.miniMenuCheckBox.setChecked(
-            Preferences.getEditor("MiniContextMenu"))
+
+        self.miniMenuCheckBox.setChecked(Preferences.getEditor("MiniContextMenu"))
         self.hideFormatButtonsCheckBox.setChecked(
-            Preferences.getEditor("HideFormatButtons"))
-        
+            Preferences.getEditor("HideFormatButtons")
+        )
+
         self.enableAnnotationsCheckBox.setChecked(
-            Preferences.getEditor("AnnotationsEnabled"))
-        
+            Preferences.getEditor("AnnotationsEnabled")
+        )
+
         self.editAreaOverrideCheckBox.setChecked(
-            Preferences.getEditor("OverrideEditAreaColours"))
+            Preferences.getEditor("OverrideEditAreaColours")
+        )
         self.initColour(
-            "EditAreaForeground", self.editAreaForegroundButton,
-            Preferences.getEditorColour)
+            "EditAreaForeground",
+            self.editAreaForegroundButton,
+            Preferences.getEditorColour,
+        )
         self.initColour(
-            "EditAreaBackground", self.editAreaBackgroundButton,
-            Preferences.getEditorColour)
-        
+            "EditAreaBackground",
+            self.editAreaBackgroundButton,
+            Preferences.getEditorColour,
+        )
+
         self.enableChangeTraceCheckBox.setChecked(
-            Preferences.getEditor("OnlineChangeTrace"))
+            Preferences.getEditor("OnlineChangeTrace")
+        )
         self.changeTraceTimeoutSpinBox.setValue(
-            Preferences.getEditor("OnlineChangeTraceInterval"))
-        self.initColour("OnlineChangeTraceMarkerUnsaved",
-                        self.changeMarkerUnsavedColorButton,
-                        Preferences.getEditorColour)
-        self.initColour("OnlineChangeTraceMarkerSaved",
-                        self.changeMarkerSavedColorButton,
-                        Preferences.getEditorColour)
-        
+            Preferences.getEditor("OnlineChangeTraceInterval")
+        )
+        self.initColour(
+            "OnlineChangeTraceMarkerUnsaved",
+            self.changeMarkerUnsavedColorButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "OnlineChangeTraceMarkerSaved",
+            self.changeMarkerSavedColorButton,
+            Preferences.getEditorColour,
+        )
+
         self.markerMapRightCheckBox.setChecked(
-            Preferences.getEditor("ShowMarkerMapOnRight"))
-        self.initColour("BookmarksMap",
-                        self.bookmarksMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("ErrorsMap",
-                        self.errorsMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("WarningsMap",
-                        self.warningsMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("BreakpointsMap",
-                        self.breakpointsMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("TasksMap",
-                        self.tasksMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("CoverageMap",
-                        self.coverageMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("ChangesMap",
-                        self.changesMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("CurrentMap",
-                        self.currentMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("SearchMarkersMap",
-                        self.searchMarkerMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("VcsConflictMarkersMap",
-                        self.conflictMarkerMapButton,
-                        Preferences.getEditorColour)
-        self.initColour("MarkerMapBackground",
-                        self.markerMapBackgroundButton,
-                        Preferences.getEditorColour)
+            Preferences.getEditor("ShowMarkerMapOnRight")
+        )
+        self.initColour(
+            "BookmarksMap", self.bookmarksMapButton, Preferences.getEditorColour
+        )
+        self.initColour("ErrorsMap", self.errorsMapButton, Preferences.getEditorColour)
+        self.initColour(
+            "WarningsMap", self.warningsMapButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "BreakpointsMap", self.breakpointsMapButton, Preferences.getEditorColour
+        )
+        self.initColour("TasksMap", self.tasksMapButton, Preferences.getEditorColour)
+        self.initColour(
+            "CoverageMap", self.coverageMapButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "ChangesMap", self.changesMapButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "CurrentMap", self.currentMapButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "SearchMarkersMap", self.searchMarkerMapButton, Preferences.getEditorColour
+        )
+        self.initColour(
+            "VcsConflictMarkersMap",
+            self.conflictMarkerMapButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "MarkerMapBackground",
+            self.markerMapBackgroundButton,
+            Preferences.getEditorColour,
+        )
         self.changesMarkerCheckBox.setChecked(
-            Preferences.getEditor("ShowMarkerChanges"))
+            Preferences.getEditor("ShowMarkerChanges")
+        )
         self.coverageMarkerCheckBox.setChecked(
-            Preferences.getEditor("ShowMarkerCoverage"))
-        self.searchMarkerCheckBox.setChecked(
-            Preferences.getEditor("ShowMarkerSearch"))
-        
-        self.indentguidesCheckBox.setChecked(
-            Preferences.getEditor("IndentationGuides"))
-        self.initColour("IndentationGuidesBackground",
-                        self.indentationGuidesBackgroundButton,
-                        Preferences.getEditorColour)
-        self.initColour("IndentationGuidesForeground",
-                        self.indentationGuidesForegroundButton,
-                        Preferences.getEditorColour)
-        
-        self.initColour("HighlightMarker",
-                        self.highlightingBackgroundButton,
-                        Preferences.getEditorColour,
-                        hasAlpha=True)
-    
+            Preferences.getEditor("ShowMarkerCoverage")
+        )
+        self.searchMarkerCheckBox.setChecked(Preferences.getEditor("ShowMarkerSearch"))
+
+        self.indentguidesCheckBox.setChecked(Preferences.getEditor("IndentationGuides"))
+        self.initColour(
+            "IndentationGuidesBackground",
+            self.indentationGuidesBackgroundButton,
+            Preferences.getEditorColour,
+        )
+        self.initColour(
+            "IndentationGuidesForeground",
+            self.indentationGuidesForegroundButton,
+            Preferences.getEditorColour,
+        )
+
+        self.initColour(
+            "HighlightMarker",
+            self.highlightingBackgroundButton,
+            Preferences.getEditorColour,
+            hasAlpha=True,
+        )
+
     def save(self):
         """
         Public slot to save the Editor Styles configuration.
         """
         Preferences.setEditor(
-            "FoldingStyle",
-            self.foldStyles[self.foldingStyleComboBox.currentIndex()])
-        Preferences.setEditorOtherFonts(
-            "MarginsFont", self.marginsFont)
-        Preferences.setEditorOtherFonts(
-            "DefaultFont", self.defaultFont)
-        Preferences.setEditorOtherFonts(
-            "MonospacedFont", self.monospacedFont)
-        Preferences.setEditor(
-            "UseMonospacedFont", self.monospacedCheckBox.isChecked())
-        
+            "FoldingStyle", self.foldStyles[self.foldingStyleComboBox.currentIndex()]
+        )
+        Preferences.setEditorOtherFonts("MarginsFont", self.marginsFont)
+        Preferences.setEditorOtherFonts("DefaultFont", self.defaultFont)
+        Preferences.setEditorOtherFonts("MonospacedFont", self.monospacedFont)
+        Preferences.setEditor("UseMonospacedFont", self.monospacedCheckBox.isChecked())
+
+        Preferences.setEditor("LinenoMargin", self.linenoCheckBox.isChecked())
+        Preferences.setEditor("FoldingMargin", self.foldingCheckBox.isChecked())
+
         Preferences.setEditor(
-            "LinenoMargin", self.linenoCheckBox.isChecked())
+            "CaretLineVisible", self.caretlineVisibleCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "FoldingMargin", self.foldingCheckBox.isChecked())
-        
+            "CaretLineAlwaysVisible", self.caretlineAlwaysVisibleCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CaretLineVisible", self.caretlineVisibleCheckBox.isChecked())
+            "ColourizeSelText", self.colourizeSelTextCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CaretLineAlwaysVisible",
-            self.caretlineAlwaysVisibleCheckBox.isChecked())
-        Preferences.setEditor(
-            "ColourizeSelText", self.colourizeSelTextCheckBox.isChecked())
+            "CustomSelectionColours", self.customSelColourCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "CustomSelectionColours", self.customSelColourCheckBox.isChecked())
-        Preferences.setEditor(
-            "ExtendSelectionToEol", self.extentSelEolCheckBox.isChecked())
+            "ExtendSelectionToEol", self.extentSelEolCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "LineMarkersBackground",
-            self.debugMarkerBackgroundCheckBox.isChecked())
-        
+            "LineMarkersBackground", self.debugMarkerBackgroundCheckBox.isChecked()
+        )
+
+        Preferences.setEditor("CaretWidth", self.caretWidthSpinBox.value())
         Preferences.setEditor(
-            "CaretWidth", self.caretWidthSpinBox.value())
-        Preferences.setEditor(
-            "CaretLineFrameWidth", self.caretlineFrameWidthSpinBox.value())
-        
+            "CaretLineFrameWidth", self.caretlineFrameWidthSpinBox.value()
+        )
+
+        Preferences.setEditor("ShowEOL", self.eolCheckBox.isChecked())
         Preferences.setEditor(
-            "ShowEOL", self.eolCheckBox.isChecked())
-        Preferences.setEditor(
-            "WrapLongLinesMode", self.wrapModeComboBox.itemData(
-                self.wrapModeComboBox.currentIndex()))
+            "WrapLongLinesMode",
+            self.wrapModeComboBox.itemData(self.wrapModeComboBox.currentIndex()),
+        )
         Preferences.setEditor(
-            "WrapVisualFlag", self.wrapVisualComboBox.itemData(
-                self.wrapVisualComboBox.currentIndex()))
+            "WrapVisualFlag",
+            self.wrapVisualComboBox.itemData(self.wrapVisualComboBox.currentIndex()),
+        )
         Preferences.setEditor(
-            "WrapIndentMode", self.wrapIndentComboBox.itemData(
-                self.wrapIndentComboBox.currentIndex()))
-        Preferences.setEditor(
-            "WrapStartIndent", self.wrapStartIndentSpinBox.value())
+            "WrapIndentMode",
+            self.wrapIndentComboBox.itemData(self.wrapIndentComboBox.currentIndex()),
+        )
+        Preferences.setEditor("WrapStartIndent", self.wrapStartIndentSpinBox.value())
         Preferences.setEditor(
-            "EdgeMode", self.edgeModes[self.edgeModeCombo.currentIndex()])
-        Preferences.setEditor(
-            "EdgeColumn", self.edgeLineColumnSlider.value())
-        
-        Preferences.setEditor(
-            "BraceHighlighting", self.bracehighlightingCheckBox.isChecked())
-        
-        Preferences.setEditor(
-            "ZoomFactor", self.zoomfactorSlider.value())
-        
+            "EdgeMode", self.edgeModes[self.edgeModeCombo.currentIndex()]
+        )
+        Preferences.setEditor("EdgeColumn", self.edgeLineColumnSlider.value())
+
         Preferences.setEditor(
-            "ShowWhitespace", self.whitespaceCheckBox.isChecked())
-        Preferences.setEditor(
-            "WhitespaceSize", self.whitespaceSizeSpinBox.value())
-        
+            "BraceHighlighting", self.bracehighlightingCheckBox.isChecked()
+        )
+
+        Preferences.setEditor("ZoomFactor", self.zoomfactorSlider.value())
+
+        Preferences.setEditor("ShowWhitespace", self.whitespaceCheckBox.isChecked())
+        Preferences.setEditor("WhitespaceSize", self.whitespaceSizeSpinBox.value())
+
+        Preferences.setEditor("MiniContextMenu", self.miniMenuCheckBox.isChecked())
         Preferences.setEditor(
-            "MiniContextMenu", self.miniMenuCheckBox.isChecked())
+            "HideFormatButtons", self.hideFormatButtonsCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "HideFormatButtons", self.hideFormatButtonsCheckBox.isChecked())
-        
-        Preferences.setEditor(
-            "AnnotationsEnabled", self.enableAnnotationsCheckBox.isChecked())
-        
+            "AnnotationsEnabled", self.enableAnnotationsCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "OverrideEditAreaColours",
-            self.editAreaOverrideCheckBox.isChecked())
-        
+            "OverrideEditAreaColours", self.editAreaOverrideCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "OnlineChangeTrace", self.enableChangeTraceCheckBox.isChecked())
+            "OnlineChangeTrace", self.enableChangeTraceCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "OnlineChangeTraceInterval",
-            self.changeTraceTimeoutSpinBox.value())
-        
+            "OnlineChangeTraceInterval", self.changeTraceTimeoutSpinBox.value()
+        )
+
         Preferences.setEditor(
-            "IndentationGuides",
-            self.indentguidesCheckBox.isChecked())
-        
+            "IndentationGuides", self.indentguidesCheckBox.isChecked()
+        )
+
         Preferences.setEditor(
-            "ShowMarkerMapOnRight",
-            self.markerMapRightCheckBox.isChecked())
+            "ShowMarkerMapOnRight", self.markerMapRightCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "ShowMarkerChanges",
-            self.changesMarkerCheckBox.isChecked())
+            "ShowMarkerChanges", self.changesMarkerCheckBox.isChecked()
+        )
         Preferences.setEditor(
-            "ShowMarkerCoverage",
-            self.coverageMarkerCheckBox.isChecked())
-        Preferences.setEditor(
-            "ShowMarkerSearch",
-            self.searchMarkerCheckBox.isChecked())
-        
+            "ShowMarkerCoverage", self.coverageMarkerCheckBox.isChecked()
+        )
+        Preferences.setEditor("ShowMarkerSearch", self.searchMarkerCheckBox.isChecked())
+
         self.saveColours(Preferences.setEditorColour)
         for key in list(self.editorColours.keys()):
             Preferences.setEditorColour(key, self.editorColours[key])
-        
+
     @pyqtSlot()
     def on_linenumbersFontButton_clicked(self):
         """
         Private method used to select the font for the editor margins.
         """
         self.marginsFont = self.selectFont(
-            self.marginsFontSample, self.marginsFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-        
+            self.marginsFontSample,
+            self.marginsFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
     @pyqtSlot()
     def on_defaultFontButton_clicked(self):
         """
         Private method used to select the default font for the editor.
         """
-        self.defaultFont = self.selectFont(
-            self.defaultFontSample, self.defaultFont)
-        
+        self.defaultFont = self.selectFont(self.defaultFontSample, self.defaultFont)
+
     @pyqtSlot()
     def on_monospacedFontButton_clicked(self):
         """
@@ -425,14 +501,16 @@
         font.
         """
         self.monospacedFont = self.selectFont(
-            self.monospacedFontSample, self.monospacedFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-    
+            self.monospacedFontSample,
+            self.monospacedFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
     def __setSampleStyleSheet(self, sampleLineEdit, color, background):
         """
         Private method to colorize a sample with given foreground and
         background colors.
-        
+
         @param sampleLineEdit line edit element to be colorized
         @type QLineEdit
         @param color text color to be shown
@@ -441,10 +519,11 @@
         @type QColor
         """
         sampleLineEdit.setStyleSheet(
-            "QLineEdit {{ color: {0}; background-color: {1}; }}"
-            .format(color.name(), background.name())
+            "QLineEdit {{ color: {0}; background-color: {1}; }}".format(
+                color.name(), background.name()
+            )
         )
-    
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
@@ -452,111 +531,118 @@
         self.marginsFontSample.setFont(self.marginsFont)
         self.defaultFontSample.setFont(self.defaultFont)
         self.monospacedFontSample.setFont(self.monospacedFont)
-        
+
         self.__setSampleStyleSheet(
             self.annotationsWarningSample,
             self.editorColours["AnnotationsWarningForeground"],
-            self.editorColours["AnnotationsWarningBackground"])
-        
+            self.editorColours["AnnotationsWarningBackground"],
+        )
+
         self.__setSampleStyleSheet(
             self.annotationsErrorSample,
             self.editorColours["AnnotationsErrorForeground"],
-            self.editorColours["AnnotationsErrorBackground"])
-        
+            self.editorColours["AnnotationsErrorBackground"],
+        )
+
         self.__setSampleStyleSheet(
             self.annotationsStyleWarningSample,
             self.editorColours["AnnotationsStyleForeground"],
-            self.editorColours["AnnotationsStyleBackground"])
-    
+            self.editorColours["AnnotationsStyleBackground"],
+        )
+
     @pyqtSlot()
     def on_annotationsWarningFgButton_clicked(self):
         """
         Private slot to set the foreground colour of the warning annotations.
         """
         colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsWarningForeground"])
+            self.editorColours["AnnotationsWarningForeground"]
+        )
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsWarningSample,
                 colour,
-                self.editorColours["AnnotationsWarningBackground"])
+                self.editorColours["AnnotationsWarningBackground"],
+            )
             self.editorColours["AnnotationsWarningForeground"] = colour
-    
+
     @pyqtSlot()
     def on_annotationsWarningBgButton_clicked(self):
         """
         Private slot to set the background colour of the warning annotations.
         """
         colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsWarningBackground"])
+            self.editorColours["AnnotationsWarningBackground"]
+        )
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsWarningSample,
                 self.editorColours["AnnotationsWarningForeground"],
-                colour)
+                colour,
+            )
             self.editorColours["AnnotationsWarningBackground"] = colour
-    
+
     @pyqtSlot()
     def on_annotationsErrorFgButton_clicked(self):
         """
         Private slot to set the foreground colour of the error annotations.
         """
-        colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsErrorForeground"])
+        colour = QColorDialog.getColor(self.editorColours["AnnotationsErrorForeground"])
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsErrorSample,
                 colour,
-                self.editorColours["AnnotationsErrorBackground"])
+                self.editorColours["AnnotationsErrorBackground"],
+            )
             self.editorColours["AnnotationsErrorForeground"] = colour
-    
+
     @pyqtSlot()
     def on_annotationsErrorBgButton_clicked(self):
         """
         Private slot to set the background colour of the error annotations.
         """
-        colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsErrorBackground"])
+        colour = QColorDialog.getColor(self.editorColours["AnnotationsErrorBackground"])
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsErrorSample,
                 self.editorColours["AnnotationsErrorForeground"],
-                colour)
+                colour,
+            )
             self.editorColours["AnnotationsErrorBackground"] = colour
-    
+
     @pyqtSlot()
     def on_annotationsStyleWarningFgButton_clicked(self):
         """
         Private slot to set the foreground colour of the style annotations.
         """
-        colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsStyleForeground"])
+        colour = QColorDialog.getColor(self.editorColours["AnnotationsStyleForeground"])
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsStyleWarningSample,
                 colour,
-                self.editorColours["AnnotationsStyleBackground"])
+                self.editorColours["AnnotationsStyleBackground"],
+            )
             self.editorColours["AnnotationsStyleForeground"] = colour
-    
+
     @pyqtSlot()
     def on_annotationsStyleWarningBgButton_clicked(self):
         """
         Private slot to set the background colour of the style annotations.
         """
-        colour = QColorDialog.getColor(
-            self.editorColours["AnnotationsStyleBackground"])
+        colour = QColorDialog.getColor(self.editorColours["AnnotationsStyleBackground"])
         if colour.isValid():
             self.__setSampleStyleSheet(
                 self.annotationsStyleWarningSample,
                 self.editorColours["AnnotationsStyleForeground"],
-                colour)
+                colour,
+            )
             self.editorColours["AnnotationsStyleBackground"] = colour
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorSyntaxPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorSyntaxPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class implementing the Editor Syntax Checker configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -24,48 +25,45 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorSyntaxPage")
-        
+
         # set initial values
-        self.onlineCheckBox.setChecked(
-            Preferences.getEditor("OnlineSyntaxCheck"))
+        self.onlineCheckBox.setChecked(Preferences.getEditor("OnlineSyntaxCheck"))
         self.onlineTimeoutSpinBox.setValue(
-            Preferences.getEditor("OnlineSyntaxCheckInterval"))
+            Preferences.getEditor("OnlineSyntaxCheckInterval")
+        )
         self.automaticSyntaxCheckCheckBox.setChecked(
-            Preferences.getEditor("AutoCheckSyntax"))
-        
+            Preferences.getEditor("AutoCheckSyntax")
+        )
+
         # pyflakes related stuff
-        self.includeCheckBox.setChecked(
-            Preferences.getFlakes("IncludeInSyntaxCheck"))
+        self.includeCheckBox.setChecked(Preferences.getFlakes("IncludeInSyntaxCheck"))
         self.ignoreStarImportCheckBox.setChecked(
-            Preferences.getFlakes("IgnoreStarImportWarnings"))
-    
+            Preferences.getFlakes("IgnoreStarImportWarnings")
+        )
+
     def save(self):
         """
         Public slot to save the Editor Syntax Checker configuration.
         """
+        Preferences.setEditor("OnlineSyntaxCheck", self.onlineCheckBox.isChecked())
         Preferences.setEditor(
-            "OnlineSyntaxCheck",
-            self.onlineCheckBox.isChecked())
-        Preferences.setEditor(
-            "OnlineSyntaxCheckInterval",
-            self.onlineTimeoutSpinBox.value())
+            "OnlineSyntaxCheckInterval", self.onlineTimeoutSpinBox.value()
+        )
         Preferences.setEditor(
-            "AutoCheckSyntax",
-            self.automaticSyntaxCheckCheckBox.isChecked())
-        
+            "AutoCheckSyntax", self.automaticSyntaxCheckCheckBox.isChecked()
+        )
+
         # pyflakes related stuff
+        Preferences.setFlakes("IncludeInSyntaxCheck", self.includeCheckBox.isChecked())
         Preferences.setFlakes(
-            "IncludeInSyntaxCheck",
-            self.includeCheckBox.isChecked())
-        Preferences.setFlakes(
-            "IgnoreStarImportWarnings",
-            self.ignoreStarImportCheckBox.isChecked())
+            "IgnoreStarImportWarnings", self.ignoreStarImportCheckBox.isChecked()
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EditorTypingPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Editor Typing configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,196 +27,224 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EditorTypingPage")
-        
+
         # set initial values
         self.pageIds = {
-            ' ': self.stackedWidget.indexOf(self.emptyPage),
-            'Python': self.stackedWidget.indexOf(self.pythonPage),
-            'Ruby': self.stackedWidget.indexOf(self.rubyPage),
-            'YAML': self.stackedWidget.indexOf(self.yamlPage),
+            " ": self.stackedWidget.indexOf(self.emptyPage),
+            "Python": self.stackedWidget.indexOf(self.pythonPage),
+            "Ruby": self.stackedWidget.indexOf(self.rubyPage),
+            "YAML": self.stackedWidget.indexOf(self.yamlPage),
         }
         languages = sorted(self.pageIds.keys())
         for language in languages:
             self.languageCombo.addItem(language, self.pageIds[language])
-        
+
         # Python
         self.pythonGroup.setChecked(
-            Preferences.getEditorTyping("Python/EnabledTypingAids"))
+            Preferences.getEditorTyping("Python/EnabledTypingAids")
+        )
         self.pythonInsertClosingBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/InsertClosingBrace"))
+            Preferences.getEditorTyping("Python/InsertClosingBrace")
+        )
         self.pythonSkipBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/SkipBrace"))
+            Preferences.getEditorTyping("Python/SkipBrace")
+        )
         self.pythonIndentBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/IndentBrace"))
+            Preferences.getEditorTyping("Python/IndentBrace")
+        )
         self.pythonInsertQuoteCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/InsertQuote"))
+            Preferences.getEditorTyping("Python/InsertQuote")
+        )
         self.pythonDedentElseCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/DedentElse"))
+            Preferences.getEditorTyping("Python/DedentElse")
+        )
         self.pythonDedentExceptCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/DedentExcept"))
+            Preferences.getEditorTyping("Python/DedentExcept")
+        )
         self.pythonInsertImportCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/InsertImport"))
+            Preferences.getEditorTyping("Python/InsertImport")
+        )
         self.pythonImportBraceTypeCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/ImportBraceType"))
+            Preferences.getEditorTyping("Python/ImportBraceType")
+        )
         self.pythonInsertSelfCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/InsertSelf"))
+            Preferences.getEditorTyping("Python/InsertSelf")
+        )
         self.pythonInsertBlankCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/InsertBlank"))
+            Preferences.getEditorTyping("Python/InsertBlank")
+        )
         self.pythonColonDetectionCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/ColonDetection"))
+            Preferences.getEditorTyping("Python/ColonDetection")
+        )
         self.pythonDedentDefCheckBox.setChecked(
-            Preferences.getEditorTyping("Python/DedentDef"))
-        
+            Preferences.getEditorTyping("Python/DedentDef")
+        )
+
         # Ruby
-        self.rubyGroup.setChecked(
-            Preferences.getEditorTyping("Ruby/EnabledTypingAids"))
+        self.rubyGroup.setChecked(Preferences.getEditorTyping("Ruby/EnabledTypingAids"))
         self.rubyInsertClosingBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/InsertClosingBrace"))
+            Preferences.getEditorTyping("Ruby/InsertClosingBrace")
+        )
         self.rubySkipBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/SkipBrace"))
+            Preferences.getEditorTyping("Ruby/SkipBrace")
+        )
         self.rubyIndentBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/IndentBrace"))
+            Preferences.getEditorTyping("Ruby/IndentBrace")
+        )
         self.rubyInsertQuoteCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/InsertQuote"))
+            Preferences.getEditorTyping("Ruby/InsertQuote")
+        )
         self.rubyInsertBlankCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/InsertBlank"))
+            Preferences.getEditorTyping("Ruby/InsertBlank")
+        )
         self.rubyInsertHereDocCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/InsertHereDoc"))
+            Preferences.getEditorTyping("Ruby/InsertHereDoc")
+        )
         self.rubyInsertInlineDocCheckBox.setChecked(
-            Preferences.getEditorTyping("Ruby/InsertInlineDoc"))
-        
+            Preferences.getEditorTyping("Ruby/InsertInlineDoc")
+        )
+
         # YAML
-        self.yamlGroup.setChecked(
-            Preferences.getEditorTyping("Yaml/EnabledTypingAids"))
+        self.yamlGroup.setChecked(Preferences.getEditorTyping("Yaml/EnabledTypingAids"))
         self.yamlInsertClosingBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertClosingBrace"))
+            Preferences.getEditorTyping("Yaml/InsertClosingBrace")
+        )
         self.yamlSkipBraceCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/SkipBrace"))
+            Preferences.getEditorTyping("Yaml/SkipBrace")
+        )
         self.yamlInsertQuoteCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertQuote"))
+            Preferences.getEditorTyping("Yaml/InsertQuote")
+        )
         self.yamlAutoIndentationCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/AutoIndentation"))
+            Preferences.getEditorTyping("Yaml/AutoIndentation")
+        )
         self.yamlColonDetectionCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/ColonDetection"))
+            Preferences.getEditorTyping("Yaml/ColonDetection")
+        )
         self.yamlInsertBlankDashCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertBlankDash"))
+            Preferences.getEditorTyping("Yaml/InsertBlankDash")
+        )
         self.yamlInsertBlankColonCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertBlankColon"))
+            Preferences.getEditorTyping("Yaml/InsertBlankColon")
+        )
         self.yamlInsertBlankQuestionCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertBlankQuestion"))
+            Preferences.getEditorTyping("Yaml/InsertBlankQuestion")
+        )
         self.yamlInsertBlankCommaCheckBox.setChecked(
-            Preferences.getEditorTyping("Yaml/InsertBlankComma"))
-        
+            Preferences.getEditorTyping("Yaml/InsertBlankComma")
+        )
+
         self.on_languageCombo_activated(0)
-    
+
     def save(self):
         """
         Public slot to save the Editor Typing configuration.
         """
         # Python
         Preferences.setEditorTyping(
-            "Python/EnabledTypingAids",
-            self.pythonGroup.isChecked())
+            "Python/EnabledTypingAids", self.pythonGroup.isChecked()
+        )
         Preferences.setEditorTyping(
             "Python/InsertClosingBrace",
-            self.pythonInsertClosingBraceCheckBox.isChecked())
+            self.pythonInsertClosingBraceCheckBox.isChecked(),
+        )
         Preferences.setEditorTyping(
-            "Python/SkipBrace",
-            self.pythonSkipBraceCheckBox.isChecked())
+            "Python/SkipBrace", self.pythonSkipBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/IndentBrace",
-            self.pythonIndentBraceCheckBox.isChecked())
+            "Python/IndentBrace", self.pythonIndentBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/InsertQuote",
-            self.pythonInsertQuoteCheckBox.isChecked())
+            "Python/InsertQuote", self.pythonInsertQuoteCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/DedentElse",
-            self.pythonDedentElseCheckBox.isChecked())
+            "Python/DedentElse", self.pythonDedentElseCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/DedentExcept",
-            self.pythonDedentExceptCheckBox.isChecked())
+            "Python/DedentExcept", self.pythonDedentExceptCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/InsertImport",
-            self.pythonInsertImportCheckBox.isChecked())
+            "Python/InsertImport", self.pythonInsertImportCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/ImportBraceType",
-            self.pythonImportBraceTypeCheckBox.isChecked())
+            "Python/ImportBraceType", self.pythonImportBraceTypeCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/InsertSelf",
-            self.pythonInsertSelfCheckBox.isChecked())
+            "Python/InsertSelf", self.pythonInsertSelfCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/InsertBlank",
-            self.pythonInsertBlankCheckBox.isChecked())
+            "Python/InsertBlank", self.pythonInsertBlankCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/ColonDetection",
-            self.pythonColonDetectionCheckBox.isChecked())
+            "Python/ColonDetection", self.pythonColonDetectionCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Python/DedentDef",
-            self.pythonDedentDefCheckBox.isChecked())
-        
+            "Python/DedentDef", self.pythonDedentDefCheckBox.isChecked()
+        )
+
         # Ruby
         Preferences.setEditorTyping(
-            "Ruby/EnabledTypingAids",
-            self.rubyGroup.isChecked())
+            "Ruby/EnabledTypingAids", self.rubyGroup.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/InsertClosingBrace",
-            self.rubyInsertClosingBraceCheckBox.isChecked())
+            "Ruby/InsertClosingBrace", self.rubyInsertClosingBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/SkipBrace",
-            self.rubySkipBraceCheckBox.isChecked())
+            "Ruby/SkipBrace", self.rubySkipBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/IndentBrace",
-            self.rubyIndentBraceCheckBox.isChecked())
+            "Ruby/IndentBrace", self.rubyIndentBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/InsertQuote",
-            self.rubyInsertQuoteCheckBox.isChecked())
+            "Ruby/InsertQuote", self.rubyInsertQuoteCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/InsertBlank",
-            self.rubyInsertBlankCheckBox.isChecked())
+            "Ruby/InsertBlank", self.rubyInsertBlankCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/InsertHereDoc",
-            self.rubyInsertHereDocCheckBox.isChecked())
+            "Ruby/InsertHereDoc", self.rubyInsertHereDocCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Ruby/InsertInlineDoc",
-            self.rubyInsertInlineDocCheckBox.isChecked())
-        
+            "Ruby/InsertInlineDoc", self.rubyInsertInlineDocCheckBox.isChecked()
+        )
+
         # YAML
         Preferences.setEditorTyping(
-            "Yaml/EnabledTypingAids",
-            self.yamlGroup.isChecked())
+            "Yaml/EnabledTypingAids", self.yamlGroup.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertClosingBrace",
-            self.yamlInsertClosingBraceCheckBox.isChecked())
+            "Yaml/InsertClosingBrace", self.yamlInsertClosingBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/SkipBrace",
-            self.yamlSkipBraceCheckBox.isChecked())
+            "Yaml/SkipBrace", self.yamlSkipBraceCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertQuote",
-            self.yamlInsertQuoteCheckBox.isChecked())
+            "Yaml/InsertQuote", self.yamlInsertQuoteCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/AutoIndentation",
-            self.yamlAutoIndentationCheckBox.isChecked())
+            "Yaml/AutoIndentation", self.yamlAutoIndentationCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/ColonDetection",
-            self.yamlColonDetectionCheckBox.isChecked())
+            "Yaml/ColonDetection", self.yamlColonDetectionCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertBlankDash",
-            self.yamlInsertBlankDashCheckBox.isChecked())
+            "Yaml/InsertBlankDash", self.yamlInsertBlankDashCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertBlankColon",
-            self.yamlInsertBlankColonCheckBox.isChecked())
+            "Yaml/InsertBlankColon", self.yamlInsertBlankColonCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertBlankQuestion",
-            self.yamlInsertBlankQuestionCheckBox.isChecked())
+            "Yaml/InsertBlankQuestion", self.yamlInsertBlankQuestionCheckBox.isChecked()
+        )
         Preferences.setEditorTyping(
-            "Yaml/InsertBlankComma",
-            self.yamlInsertBlankCommaCheckBox.isChecked())
-    
+            "Yaml/InsertBlankComma", self.yamlInsertBlankCommaCheckBox.isChecked()
+        )
+
     @pyqtSlot(int)
     def on_languageCombo_activated(self, index):
         """
         Private slot to select the page related to the selected language.
-        
+
         @param index index of the selected entry
         @type int
         """
@@ -223,14 +252,14 @@
         try:
             index = self.pageIds[language]
         except KeyError:
-            index = self.pageIds[' ']
+            index = self.pageIds[" "]
         self.stackedWidget.setCurrentIndex(index)
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/EmailPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/EmailPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,9 +16,7 @@
 from EricWidgets.EricApplication import ericApp
 from EricGui.EricOverrideCursor import EricOverrideCursor
 
-from EricNetwork.EricGoogleMailHelpers import (
-    getInstallCommand, RequiredPackages
-)
+from EricNetwork.EricGoogleMailHelpers import getInstallCommand, RequiredPackages
 
 from .ConfigurationPageBase import ConfigurationPageBase
 from .Ui_EmailPage import Ui_EmailPage
@@ -31,6 +29,7 @@
     """
     Class implementing the Email configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -38,28 +37,27 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("EmailPage")
-        
+
         self.__helpDialog = None
-        
+
         pipPackages = [
             "google-api-python-client",
             "google-auth-oauthlib",
         ]
-        self.__pipCommand = "pip install --upgrade {0}".format(
-            " ".join(pipPackages))
-        
+        self.__pipCommand = "pip install --upgrade {0}".format(" ".join(pipPackages))
+
         # set initial values
         self.__checkGoogleMail()
-        
+
         self.mailServerEdit.setText(Preferences.getUser("MailServer"))
         self.portSpin.setValue(Preferences.getUser("MailServerPort"))
         self.emailEdit.setText(Preferences.getUser("Email"))
         self.signatureEdit.setPlainText(Preferences.getUser("Signature"))
         self.mailAuthenticationGroup.setChecked(
-            Preferences.getUser("MailServerAuthentication"))
+            Preferences.getUser("MailServerAuthentication")
+        )
         self.mailUserEdit.setText(Preferences.getUser("MailServerUser"))
-        self.mailPasswordEdit.setText(
-            Preferences.getUser("MailServerPassword"))
+        self.mailPasswordEdit.setText(Preferences.getUser("MailServerPassword"))
         encryption = Preferences.getUser("MailServerEncryption")
         if encryption == "TLS":
             self.useTlsButton.setChecked(True)
@@ -67,35 +65,21 @@
             self.useSslButton.setChecked(True)
         else:
             self.noEncryptionButton.setChecked(True)
-    
+
     def save(self):
         """
         Public slot to save the Email configuration.
         """
-        Preferences.setUser(
-            "UseGoogleMailOAuth2",
-            self.googleMailCheckBox.isChecked())
-        Preferences.setUser(
-            "MailServer",
-            self.mailServerEdit.text())
-        Preferences.setUser(
-            "MailServerPort",
-            self.portSpin.value())
+        Preferences.setUser("UseGoogleMailOAuth2", self.googleMailCheckBox.isChecked())
+        Preferences.setUser("MailServer", self.mailServerEdit.text())
+        Preferences.setUser("MailServerPort", self.portSpin.value())
+        Preferences.setUser("Email", self.emailEdit.text())
+        Preferences.setUser("Signature", self.signatureEdit.toPlainText())
         Preferences.setUser(
-            "Email",
-            self.emailEdit.text())
-        Preferences.setUser(
-            "Signature",
-            self.signatureEdit.toPlainText())
-        Preferences.setUser(
-            "MailServerAuthentication",
-            self.mailAuthenticationGroup.isChecked())
-        Preferences.setUser(
-            "MailServerUser",
-            self.mailUserEdit.text())
-        Preferences.setUser(
-            "MailServerPassword",
-            self.mailPasswordEdit.text())
+            "MailServerAuthentication", self.mailAuthenticationGroup.isChecked()
+        )
+        Preferences.setUser("MailServerUser", self.mailUserEdit.text())
+        Preferences.setUser("MailServerPassword", self.mailPasswordEdit.text())
         if self.useTlsButton.isChecked():
             encryption = "TLS"
         elif self.useSslButton.isChecked():
@@ -103,7 +87,7 @@
         else:
             encryption = "No"
         Preferences.setUser("MailServerEncryption", encryption)
-    
+
     def __updatePortSpin(self):
         """
         Private slot to set the value of the port spin box depending upon
@@ -115,86 +99,86 @@
             self.portSpin.setValue(587)
         else:
             self.portSpin.setValue(25)
-    
+
     @pyqtSlot(bool)
     def on_noEncryptionButton_toggled(self, checked):
         """
         Private slot handling a change of no encryption button.
-        
+
         @param checked current state of the button
         @type bool
         """
         self.__updatePortSpin()
-    
+
     @pyqtSlot(bool)
     def on_useSslButton_toggled(self, checked):
         """
         Private slot handling a change of SSL encryption button.
-        
+
         @param checked current state of the button
         @type bool
         """
         self.__updatePortSpin()
-    
+
     @pyqtSlot(bool)
     def on_useTlsButton_toggled(self, checked):
         """
         Private slot handling a change of TLS encryption button.
-        
+
         @param checked current state of the button
         @type bool
         """
         self.__updatePortSpin()
-    
+
     def __updateTestButton(self):
         """
         Private slot to update the enabled state of the test button.
         """
         self.testButton.setEnabled(
-            self.mailAuthenticationGroup.isChecked() and
-            self.mailUserEdit.text() != "" and
-            self.mailPasswordEdit.text() != "" and
-            self.mailServerEdit.text() != ""
+            self.mailAuthenticationGroup.isChecked()
+            and self.mailUserEdit.text() != ""
+            and self.mailPasswordEdit.text() != ""
+            and self.mailServerEdit.text() != ""
         )
-    
+
     @pyqtSlot(str)
     def on_mailServerEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the text of the mail server edit.
-        
+
         @param txt current text of the edit (string)
         @type str
         """
         self.__updateTestButton()
-    
+
     @pyqtSlot(bool)
     def on_mailAuthenticationGroup_toggled(self, checked):
         """
         Private slot to handle a change of the state of the authentication
         group.
-        
+
         @param checked state of the group (boolean)
         """
         self.__updateTestButton()
-    
+
     @pyqtSlot(str)
     def on_mailUserEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the text of the user edit.
-        
+
         @param txt current text of the edit (string)
         """
         self.__updateTestButton()
-    
+
     @pyqtSlot(str)
     def on_mailPasswordEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the text of the user edit.
-        
+
         @param txt current text of the edit (string)
         """
         self.__updateTestButton()
-    
+
     @pyqtSlot()
     def on_testButton_clicked(self):
         """
@@ -203,22 +187,20 @@
         try:
             with EricOverrideCursor():
                 if self.useSslButton.isChecked():
-                    server = smtplib.SMTP_SSL(self.mailServerEdit.text(),
-                                              self.portSpin.value(),
-                                              timeout=10)
+                    server = smtplib.SMTP_SSL(
+                        self.mailServerEdit.text(), self.portSpin.value(), timeout=10
+                    )
                 else:
-                    server = smtplib.SMTP(self.mailServerEdit.text(),
-                                          self.portSpin.value(),
-                                          timeout=10)
+                    server = smtplib.SMTP(
+                        self.mailServerEdit.text(), self.portSpin.value(), timeout=10
+                    )
                     if self.useTlsButton.isChecked():
                         server.starttls()
-                server.login(self.mailUserEdit.text(),
-                             self.mailPasswordEdit.text())
+                server.login(self.mailUserEdit.text(), self.mailPasswordEdit.text())
                 server.quit()
             EricMessageBox.information(
-                self,
-                self.tr("Login Test"),
-                self.tr("""The login test succeeded."""))
+                self, self.tr("Login Test"), self.tr("""The login test succeeded.""")
+            )
         except (smtplib.SMTPException, OSError) as e:
             if isinstance(e, smtplib.SMTPResponseException):
                 errorStr = e.smtp_error.decode()
@@ -234,10 +216,11 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Login Test"),
-                self.tr(
-                    """<p>The login test failed.<br>Reason: {0}</p>""")
-                .format(errorStr))
-    
+                self.tr("""<p>The login test failed.<br>Reason: {0}</p>""").format(
+                    errorStr
+                ),
+            )
+
     @pyqtSlot()
     def on_googleHelpButton_clicked(self):
         """
@@ -246,37 +229,38 @@
         if self.__helpDialog is None:
             try:
                 from EricNetwork.EricGoogleMail import GoogleMailHelp
+
                 helpStr = GoogleMailHelp()
             except ImportError:
                 helpStr = self.tr(
                     "<p>The Google Mail Client API is not installed."
                     " Use <code>{0}</code> to install it.</p>"
                 ).format(getInstallCommand())
-            
+
             from EricWidgets.EricSimpleHelpDialog import EricSimpleHelpDialog
+
             self.__helpDialog = EricSimpleHelpDialog(
-                title=self.tr("Gmail API Help"),
-                helpStr=helpStr, parent=self)
-        
+                title=self.tr("Gmail API Help"), helpStr=helpStr, parent=self
+            )
+
         self.__helpDialog.show()
-    
+
     @pyqtSlot()
     def on_googleInstallButton_clicked(self):
         """
         Private slot to install the required packages for use of Google Mail.
         """
         pip = ericApp().getObject("Pip")
-        pip.installPackages(RequiredPackages,
-                            interpreter=Globals.getPythonExecutable())
+        pip.installPackages(RequiredPackages, interpreter=Globals.getPythonExecutable())
         self.__checkGoogleMail()
-    
+
     @pyqtSlot()
     def on_googleCheckAgainButton_clicked(self):
         """
         Private slot to check again the availability of Google Mail.
         """
         self.__checkGoogleMail()
-    
+
     def __checkGoogleMail(self):
         """
         Private method to check the Google Mail availability and set the
@@ -287,36 +271,40 @@
         self.googleCheckAgainButton.show()
         self.googleHelpButton.setEnabled(True)
         self.googleMailCheckBox.setEnabled(True)
-        
+
         try:
-            import EricNetwork.EricGoogleMail      # __IGNORE_WARNING__
-            from EricNetwork.EricGoogleMailHelpers import (
-                isClientSecretFileAvailable
-            )
-            
+            import EricNetwork.EricGoogleMail  # __IGNORE_WARNING__
+            from EricNetwork.EricGoogleMailHelpers import isClientSecretFileAvailable
+
             self.googleInstallButton.hide()
             if not isClientSecretFileAvailable():
                 # secrets file is not installed
                 self.googleMailCheckBox.setChecked(False)
                 self.googleMailCheckBox.setEnabled(False)
-                self.googleMailInfoLabel.setText(self.tr(
-                    "<p>The client secrets file is not present."
-                    " Has the Gmail API been enabled?</p>"))
+                self.googleMailInfoLabel.setText(
+                    self.tr(
+                        "<p>The client secrets file is not present."
+                        " Has the Gmail API been enabled?</p>"
+                    )
+                )
                 self.googleMailInfoLabel.show()
                 Preferences.setUser("UseGoogleMailOAuth2", False)
             else:
                 self.googleMailCheckBox.setChecked(
-                    Preferences.getUser("UseGoogleMailOAuth2"))
+                    Preferences.getUser("UseGoogleMailOAuth2")
+                )
                 self.googleMailInfoLabel.hide()
                 self.googleCheckAgainButton.hide()
         except ImportError:
             # missing libraries, disable Google Mail
             self.googleMailCheckBox.setChecked(False)
             self.googleMailCheckBox.setEnabled(False)
-            self.googleMailInfoLabel.setText(self.tr(
-                "<p>The Google Mail Client API is not installed."
-                " Use <code>{0}</code> to install it.</p>"
-            ).format(getInstallCommand()))
+            self.googleMailInfoLabel.setText(
+                self.tr(
+                    "<p>The Google Mail Client API is not installed."
+                    " Use <code>{0}</code> to install it.</p>"
+                ).format(getInstallCommand())
+            )
             self.googleMailInfoLabel.show()
             self.googleHelpButton.setEnabled(False)
             Preferences.setUser("UseGoogleMailOAuth2", False)
@@ -325,7 +313,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/GraphicsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/GraphicsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Printer configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,11 +27,11 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("GraphicsPage")
-        
+
         # set initial values
         self.graphicsFont = Preferences.getGraphics("Font")
         self.graphicsFontSample.setFont(self.graphicsFont)
-        
+
         drawingMode = Preferences.getGraphics("DrawingMode")
         if drawingMode == "black_white":
             self.blackWhiteButton.setChecked(True)
@@ -38,13 +39,13 @@
             self.whiteBlackButton.setChecked(True)
         else:
             self.automaticButton.setChecked(True)
-    
+
     def save(self):
         """
         Public slot to save the Printer configuration.
         """
         Preferences.setGraphics("Font", self.graphicsFont)
-        
+
         if self.blackWhiteButton.isChecked():
             drawingMode = "black_white"
         elif self.whiteBlackButton.isChecked():
@@ -53,26 +54,25 @@
             # default is automatic
             drawingMode = "automatic"
         Preferences.setGraphics("DrawingMode", drawingMode)
-    
+
     @pyqtSlot()
     def on_graphicsFontButton_clicked(self):
         """
         Private method used to select the font for the graphics items.
         """
-        self.graphicsFont = self.selectFont(self.graphicsFontSample,
-                                            self.graphicsFont)
-        
+        self.graphicsFont = self.selectFont(self.graphicsFontSample, self.graphicsFont)
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
         """
         self.graphicsFontSample.setFont(self.graphicsFont)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/HelpDocumentationPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/HelpDocumentationPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Help Documentation configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,86 +27,88 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("HelpDocumentationPage")
-        
+
         self.ericDocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.ericDocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.ericDocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.pythonDocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pythonDocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;"
-            "Compressed Help Files (*.chm);;"
-            "All Files (*)"))
+        self.pythonDocDirPicker.setFilters(
+            self.tr(
+                "HTML Files (*.html *.htm);;"
+                "Compressed Help Files (*.chm);;"
+                "All Files (*)"
+            )
+        )
         self.qt5DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.qt5DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.qt5DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.qt6DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.qt6DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.qt6DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.pyqt5DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pyqt5DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.pyqt5DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.pyqt6DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pyqt6DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.pyqt6DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.pyside2DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pyside2DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
+        self.pyside2DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
         self.pyside6DocDirPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pyside6DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
-        
+        self.pyside6DocDirPicker.setFilters(
+            self.tr("HTML Files (*.html *.htm);;All Files (*)")
+        )
+
         # set initial values
-        self.ericDocDirPicker.setText(
-            Preferences.getHelp("EricDocDir"), toNative=False)
+        self.ericDocDirPicker.setText(Preferences.getHelp("EricDocDir"), toNative=False)
         self.pythonDocDirPicker.setText(
-            Preferences.getHelp("PythonDocDir"), toNative=False)
-        self.qt5DocDirPicker.setText(
-            Preferences.getHelp("Qt5DocDir"), toNative=False)
-        self.qt6DocDirPicker.setText(
-            Preferences.getHelp("Qt6DocDir"), toNative=False)
+            Preferences.getHelp("PythonDocDir"), toNative=False
+        )
+        self.qt5DocDirPicker.setText(Preferences.getHelp("Qt5DocDir"), toNative=False)
+        self.qt6DocDirPicker.setText(Preferences.getHelp("Qt6DocDir"), toNative=False)
         self.pyqt5DocDirPicker.setText(
-            Preferences.getHelp("PyQt5DocDir"), toNative=False)
+            Preferences.getHelp("PyQt5DocDir"), toNative=False
+        )
         self.pyqt6DocDirPicker.setText(
-            Preferences.getHelp("PyQt6DocDir"), toNative=False)
+            Preferences.getHelp("PyQt6DocDir"), toNative=False
+        )
         self.pyside2DocDirPicker.setText(
-            Preferences.getHelp("PySide2DocDir"), toNative=False)
+            Preferences.getHelp("PySide2DocDir"), toNative=False
+        )
         self.pyside6DocDirPicker.setText(
-            Preferences.getHelp("PySide6DocDir"), toNative=False)
-        
+            Preferences.getHelp("PySide6DocDir"), toNative=False
+        )
+
     def save(self):
         """
         Public slot to save the Help Documentation configuration.
         """
-        Preferences.setHelp(
-            "EricDocDir",
-            self.ericDocDirPicker.text(toNative=False))
-        Preferences.setHelp(
-            "PythonDocDir",
-            self.pythonDocDirPicker.text(toNative=False))
-        Preferences.setHelp(
-            "Qt5DocDir",
-            self.qt5DocDirPicker.text(toNative=False))
+        Preferences.setHelp("EricDocDir", self.ericDocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "Qt6DocDir",
-            self.qt6DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
-            "PyQt5DocDir",
-            self.pyqt5DocDirPicker.text(toNative=False))
+            "PythonDocDir", self.pythonDocDirPicker.text(toNative=False)
+        )
+        Preferences.setHelp("Qt5DocDir", self.qt5DocDirPicker.text(toNative=False))
+        Preferences.setHelp("Qt6DocDir", self.qt6DocDirPicker.text(toNative=False))
+        Preferences.setHelp("PyQt5DocDir", self.pyqt5DocDirPicker.text(toNative=False))
+        Preferences.setHelp("PyQt6DocDir", self.pyqt6DocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "PyQt6DocDir",
-            self.pyqt6DocDirPicker.text(toNative=False))
+            "PySide2DocDir", self.pyside2DocDirPicker.text(toNative=False)
+        )
         Preferences.setHelp(
-            "PySide2DocDir",
-            self.pyside2DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
-            "PySide6DocDir",
-            self.pyside6DocDirPicker.text(toNative=False))
+            "PySide6DocDir", self.pyside6DocDirPicker.text(toNative=False)
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/HelpViewersPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/HelpViewersPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,6 +23,7 @@
     """
     Class implementing the Help Viewers configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -30,16 +31,16 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("HelpViewersPage")
-        
+
         self.customViewerPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.helpViewerGroup = QButtonGroup()
         self.helpViewerGroup.addButton(self.internalViewerButton, 0)
         self.helpViewerGroup.addButton(self.helpBrowserButton, 1)
         self.helpViewerGroup.addButton(self.qtAssistantButton, 2)
         self.helpViewerGroup.addButton(self.webBrowserButton, 3)
         self.helpViewerGroup.addButton(self.customViewerButton, 4)
-        
+
         # set initial values
         hvId = Preferences.getHelp("HelpViewerType")
         webBrowserVariant = getWebBrowserSupport()
@@ -47,27 +48,22 @@
             if hvId == 1:
                 hvId = 0
             self.helpBrowserButton.setEnabled(False)
-        
+
         self.helpViewerGroup.button(hvId).setChecked(True)
-        self.customViewerPicker.setText(
-            Preferences.getHelp("CustomViewer"))
-        
+        self.customViewerPicker.setText(Preferences.getHelp("CustomViewer"))
+
     def save(self):
         """
         Public slot to save the Help Viewers configuration.
         """
-        Preferences.setHelp(
-            "HelpViewerType",
-            self.helpViewerGroup.checkedId())
-        Preferences.setHelp(
-            "CustomViewer",
-            self.customViewerPicker.text())
-    
+        Preferences.setHelp("HelpViewerType", self.helpViewerGroup.checkedId())
+        Preferences.setHelp("CustomViewer", self.customViewerPicker.text())
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/HexEditorPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/HexEditorPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class implementing the Hex Editor configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,57 +29,58 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("HexEditorPage")
-        
+
         # set initial values
-        self.readOnlyCheckBox.setChecked(Preferences.getHexEditor(
-            "OpenReadOnly"))
-        self.overwriteCheckBox.setChecked(Preferences.getHexEditor(
-            "OpenInOverwriteMode"))
-        self.addressAreaCheckBox.setChecked(Preferences.getHexEditor(
-            "ShowAddressArea"))
-        self.addressAreaWidthSpinBox.setValue(Preferences.getHexEditor(
-            "AddressAreaWidth"))
-        self.asciiAreaCheckBox.setChecked(Preferences.getHexEditor(
-            "ShowAsciiArea"))
-        self.highlightingCheckBox.setChecked(Preferences.getHexEditor(
-            "HighlightChanges"))
-        self.recentFilesSpinBox.setValue(Preferences.getHexEditor(
-            "RecentNumber"))
-        
+        self.readOnlyCheckBox.setChecked(Preferences.getHexEditor("OpenReadOnly"))
+        self.overwriteCheckBox.setChecked(
+            Preferences.getHexEditor("OpenInOverwriteMode")
+        )
+        self.addressAreaCheckBox.setChecked(Preferences.getHexEditor("ShowAddressArea"))
+        self.addressAreaWidthSpinBox.setValue(
+            Preferences.getHexEditor("AddressAreaWidth")
+        )
+        self.asciiAreaCheckBox.setChecked(Preferences.getHexEditor("ShowAsciiArea"))
+        self.highlightingCheckBox.setChecked(
+            Preferences.getHexEditor("HighlightChanges")
+        )
+        self.recentFilesSpinBox.setValue(Preferences.getHexEditor("RecentNumber"))
+
         # font
         self.monospacedFont = Preferences.getHexEditor("Font")
         self.monospacedFontSample.setFont(self.monospacedFont)
-    
+
     def save(self):
         """
         Public slot to save the IRC configuration.
         """
-        Preferences.setHexEditor(
-            "OpenReadOnly", self.readOnlyCheckBox.isChecked())
+        Preferences.setHexEditor("OpenReadOnly", self.readOnlyCheckBox.isChecked())
         Preferences.setHexEditor(
-            "OpenInOverwriteMode", self.overwriteCheckBox.isChecked())
+            "OpenInOverwriteMode", self.overwriteCheckBox.isChecked()
+        )
         Preferences.setHexEditor(
-            "ShowAddressArea", self.addressAreaCheckBox.isChecked())
-        Preferences.setHexEditor(
-            "AddressAreaWidth", self.addressAreaWidthSpinBox.value())
+            "ShowAddressArea", self.addressAreaCheckBox.isChecked()
+        )
         Preferences.setHexEditor(
-            "ShowAsciiArea", self.asciiAreaCheckBox.isChecked())
-        Preferences.setHexEditor(
-            "HighlightChanges", self.highlightingCheckBox.isChecked())
+            "AddressAreaWidth", self.addressAreaWidthSpinBox.value()
+        )
+        Preferences.setHexEditor("ShowAsciiArea", self.asciiAreaCheckBox.isChecked())
         Preferences.setHexEditor(
-            "Font", self.monospacedFont)
-        Preferences.setHexEditor(
-            "RecentNumber", self.recentFilesSpinBox.value())
-    
+            "HighlightChanges", self.highlightingCheckBox.isChecked()
+        )
+        Preferences.setHexEditor("Font", self.monospacedFont)
+        Preferences.setHexEditor("RecentNumber", self.recentFilesSpinBox.value())
+
     @pyqtSlot()
     def on_monospacedFontButton_clicked(self):
         """
         Private method used to select the font to be used.
         """
         self.monospacedFont = self.selectFont(
-            self.monospacedFontSample, self.monospacedFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-    
+            self.monospacedFontSample,
+            self.monospacedFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
@@ -89,7 +91,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/IconsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/IconsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,6 +27,7 @@
     """
     Class implementing the Icons configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -34,9 +35,9 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("IconsPage")
-        
+
         self.iconDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         # set initial values
         defaultIconsPath = Preferences.getIcons("DefaultIconsPath")
         if defaultIconsPath == "automatic":
@@ -47,28 +48,27 @@
             self.defaultBreezeDarkButton.setChecked(True)
         else:
             self.defaultOxygenButton.setChecked(True)
-        
+
         dirList = Preferences.getIcons("Path")[:]
         for directory in dirList:
             if directory:
                 QListWidgetItem(directory, self.iconDirectoryList)
-        
+
     def save(self):
         """
         Public slot to save the Icons configuration.
         """
-        Preferences.setIcons("DefaultIconsPath",
-                             self.__getSelectedDefaultIconsPath())
-        
+        Preferences.setIcons("DefaultIconsPath", self.__getSelectedDefaultIconsPath())
+
         dirList = []
         for i in range(self.iconDirectoryList.count()):
             dirList.append(self.iconDirectoryList.item(i).text())
         Preferences.setIcons("Path", dirList)
-    
+
     def __getSelectedDefaultIconsPath(self):
         """
         Private method to determine the selected default icons path.
-        
+
         @return selected default icons path
         @rtype str
         """
@@ -80,38 +80,37 @@
             return "breeze-dark"
         else:
             return "oxygen"
-    
+
     def on_iconDirectoryList_currentRowChanged(self, row):
         """
         Private slot to handle the currentRowChanged signal of the icons
         directory list.
-        
+
         @param row the current row (integer)
         """
         if row == -1:
             self.deleteIconDirectoryButton.setEnabled(False)
             self.upButton.setEnabled(False)
             self.downButton.setEnabled(False)
-            self.showIconsButton.setEnabled(
-                self.iconDirectoryPicker.text() != "")
+            self.showIconsButton.setEnabled(self.iconDirectoryPicker.text() != "")
         else:
             maxIndex = self.iconDirectoryList.count() - 1
             self.upButton.setEnabled(row != 0)
             self.downButton.setEnabled(row != maxIndex)
             self.deleteIconDirectoryButton.setEnabled(True)
             self.showIconsButton.setEnabled(True)
-        
+
     def on_iconDirectoryPicker_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of the directory picker.
-        
+
         @param txt the text of the directory picker (string)
         """
         self.addIconDirectoryButton.setEnabled(txt != "")
         self.showIconsButton.setEnabled(
-            txt != "" or
-            self.iconDirectoryList.currentRow() != -1)
-        
+            txt != "" or self.iconDirectoryList.currentRow() != -1
+        )
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -121,7 +120,7 @@
         if row == 0:
             # we're already at the top
             return
-        
+
         itm = self.iconDirectoryList.takeItem(row)
         self.iconDirectoryList.insertItem(row - 1, itm)
         self.iconDirectoryList.setCurrentItem(itm)
@@ -130,7 +129,7 @@
         else:
             self.upButton.setEnabled(True)
         self.downButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -141,7 +140,7 @@
         if row == rows - 1:
             # we're already at the end
             return
-        
+
         itm = self.iconDirectoryList.takeItem(row)
         self.iconDirectoryList.insertItem(row + 1, itm)
         self.iconDirectoryList.setCurrentItem(itm)
@@ -150,7 +149,7 @@
             self.downButton.setEnabled(False)
         else:
             self.downButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_addIconDirectoryButton_clicked(self):
         """
@@ -162,7 +161,7 @@
             self.iconDirectoryPicker.clear()
         row = self.iconDirectoryList.currentRow()
         self.on_iconDirectoryList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_deleteIconDirectoryButton_clicked(self):
         """
@@ -173,7 +172,7 @@
         del itm
         row = self.iconDirectoryList.currentRow()
         self.on_iconDirectoryList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_showIconsButton_clicked(self):
         """
@@ -188,9 +187,10 @@
                 directories.append(self.iconDirectoryList.item(row).text())
         if directories:
             from .IconsPreviewDialog import IconsPreviewDialog
+
             dlg = IconsPreviewDialog(directories, self)
             dlg.exec()
-    
+
     @pyqtSlot()
     def on_showDefaultIconsButton_clicked(self):
         """
@@ -202,20 +202,23 @@
                 defaultIconsPath = "breeze-dark"
             else:
                 defaultIconsPath = "breeze-light"
-        
+
         from .IconsPreviewDialog import IconsPreviewDialog
-        dlg = IconsPreviewDialog([
-            os.path.join(getConfig('ericIconDir'), defaultIconsPath),
-            os.path.join(getConfig('ericIconDir'), defaultIconsPath,
-                         "languages"),
-        ], self)
+
+        dlg = IconsPreviewDialog(
+            [
+                os.path.join(getConfig("ericIconDir"), defaultIconsPath),
+                os.path.join(getConfig("ericIconDir"), defaultIconsPath, "languages"),
+            ],
+            self,
+        )
         dlg.exec()
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/IconsPreviewDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/IconsPreviewDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing a dialog to preview the contents of an icon directory.
     """
+
     def __init__(self, directories, parent=None):
         """
         Constructor
-        
+
         @param directories list of directories to be shown
         @type list of str
         @param parent parent widget
@@ -31,19 +32,19 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         palette = self.iconView.palette()
         self.__backgroundColor = palette.color(QPalette.ColorRole.Window)
         self.__foregroundColor = palette.color(QPalette.ColorRole.WindowText)
         self.__inverted = False
-        
+
         self.directoryCombo.addItems(sorted(directories))
-    
+
     @pyqtSlot(str)
     def on_directoryCombo_currentTextChanged(self, dirName):
         """
         Private slot to show the icons of the selected icon directory.
-        
+
         @param dirName selected icon directory
         @type str
         """
@@ -51,34 +52,34 @@
         directory = QDir(dirName)
         for icon in directory.entryList(["*.svg", "*.svgz", "*.png"]):
             itm = QListWidgetItem(
-                QIcon(os.path.join(dirName, icon)),
-                icon, self.iconView)
+                QIcon(os.path.join(dirName, icon)), icon, self.iconView
+            )
             if self.__inverted:
                 itm.setForeground(self.__backgroundColor)
             else:
                 itm.setForeground(self.__foregroundColor)
-    
+
     @pyqtSlot(bool)
     def on_invertButton_toggled(self, checked):
         """
         Private slot to show the icons on an inverted background.
-        
+
         @param checked state of the button
         @type bool
         """
         self.__inverted = checked
-        
+
         styleSheet = (
             f"color: {self.__backgroundColor.name()};"
             f"background-color: {self.__foregroundColor.name()}"
-            if self.__inverted else
-            f"color: {self.__foregroundColor.name()};"
+            if self.__inverted
+            else f"color: {self.__foregroundColor.name()};"
             f"background-color: {self.__backgroundColor.name()}"
         )
         self.iconView.viewport().setStyleSheet(styleSheet)
-        
+
         self.on_refreshButton_clicked()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
--- a/src/eric7/Preferences/ConfigurationPages/InterfaceLightPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/InterfaceLightPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,6 +30,7 @@
     Class implementing the Interface configuration page (variant for generic
     use).
     """
+
     def __init__(self):
         """
         Constructor
@@ -37,25 +38,27 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("InterfacePage")
-        
+
         self.styleSheetPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.styleSheetPicker.setFilters(self.tr(
-            "Qt Style Sheets (*.qss);;Cascading Style Sheets (*.css);;"
-            "All files (*)"))
+        self.styleSheetPicker.setFilters(
+            self.tr(
+                "Qt Style Sheets (*.qss);;Cascading Style Sheets (*.css);;"
+                "All files (*)"
+            )
+        )
         self.styleSheetPicker.setDefaultDirectory(getConfig("ericStylesDir"))
-        
+
         styleIconsPath = ericApp().getStyleIconsPath()
-        self.styleIconsPathPicker.setMode(
-            EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
+        self.styleIconsPathPicker.setMode(EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
         self.styleIconsPathPicker.setDefaultDirectory(styleIconsPath)
-        
+
         # set initial values
         self.__populateStyleCombo()
         self.__populateLanguageCombo()
-        
+
         self.styleSheetPicker.setText(Preferences.getUI("StyleSheet"))
         self.styleIconsPathPicker.setText(Preferences.getUI("StyleIconsPath"))
-    
+
     def save(self):
         """
         Public slot to save the Interface configuration.
@@ -64,47 +67,40 @@
         styleIndex = self.styleComboBox.currentIndex()
         style = self.styleComboBox.itemData(styleIndex)
         Preferences.setUI("Style", style)
-        Preferences.setUI(
-            "StyleSheet",
-            self.styleSheetPicker.text())
-        Preferences.setUI(
-            "StyleIconsPath",
-            self.styleIconsPathPicker.text())
-        
+        Preferences.setUI("StyleSheet", self.styleSheetPicker.text())
+        Preferences.setUI("StyleIconsPath", self.styleIconsPathPicker.text())
+
         # save the language settings
         uiLanguageIndex = self.languageComboBox.currentIndex()
         uiLanguage = (
-            self.languageComboBox.itemData(uiLanguageIndex)
-            if uiLanguageIndex else
-            None
+            self.languageComboBox.itemData(uiLanguageIndex) if uiLanguageIndex else None
         )
         Preferences.setUILanguage(uiLanguage)
-    
+
     def __populateStyleCombo(self):
         """
         Private method to populate the style combo box.
         """
         curStyle = Preferences.getUI("Style")
         styles = sorted(QStyleFactory.keys())
-        self.styleComboBox.addItem(self.tr('System'), "System")
+        self.styleComboBox.addItem(self.tr("System"), "System")
         for style in styles:
             self.styleComboBox.addItem(style, style)
         currentIndex = self.styleComboBox.findData(curStyle)
         if currentIndex == -1:
             currentIndex = 0
         self.styleComboBox.setCurrentIndex(currentIndex)
-    
+
     def __populateLanguageCombo(self):
         """
         Private method to initialize the language combo box.
         """
         self.languageComboBox.clear()
-        
+
         fnlist = (
-            glob.glob("eric7_*.qm") +
-            glob.glob(os.path.join(
-                getConfig('ericTranslationsDir'), "eric7_*.qm")) +
-            glob.glob(os.path.join(Utilities.getConfigDir(), "eric7_*.qm"))
+            glob.glob("eric7_*.qm")
+            + glob.glob(os.path.join(getConfig("ericTranslationsDir"), "eric7_*.qm"))
+            + glob.glob(os.path.join(Utilities.getConfigDir(), "eric7_*.qm"))
         )
         locales = {}
         for fn in fnlist:
@@ -112,12 +108,9 @@
             if locale not in locales:
                 translator = QTranslator()
                 translator.load(fn)
-                locales[locale] = (
-                    translator.translate(
-                        "InterfacePage", "English",
-                        "Translate this with your language") +
-                    " ({0})".format(locale)
-                )
+                locales[locale] = translator.translate(
+                    "InterfacePage", "English", "Translate this with your language"
+                ) + " ({0})".format(locale)
         localeList = sorted(locales.keys())
         try:
             uiLanguage = Preferences.getUILanguage()
@@ -130,9 +123,9 @@
         except ValueError:
             currentIndex = 0
         self.languageComboBox.clear()
-        
+
         self.languageComboBox.addItem("English (default)", "None")
-        self.languageComboBox.addItem(self.tr('System'), "System")
+        self.languageComboBox.addItem(self.tr("System"), "System")
         for locale in localeList:
             self.languageComboBox.addItem(locales[locale], locale)
         self.languageComboBox.setCurrentIndex(currentIndex)
@@ -141,7 +134,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/InterfacePage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/InterfacePage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,6 +31,7 @@
     """
     Class implementing the Interface configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -38,96 +39,94 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("InterfacePage")
-        
+
         self.styleSheetPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.styleSheetPicker.setFilters(self.tr(
-            "Qt Style Sheets (*.qss);;Cascading Style Sheets (*.css);;"
-            "All files (*)"))
+        self.styleSheetPicker.setFilters(
+            self.tr(
+                "Qt Style Sheets (*.qss);;Cascading Style Sheets (*.css);;"
+                "All files (*)"
+            )
+        )
         self.styleSheetPicker.setDefaultDirectory(getConfig("ericStylesDir"))
-        
+
         styleIconsPath = ericApp().getStyleIconsPath()
-        self.styleIconsPathPicker.setMode(
-            EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
+        self.styleIconsPathPicker.setMode(EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
         self.styleIconsPathPicker.setDefaultDirectory(styleIconsPath)
-        
+
         for iconBarSize in EricIconBar.BarSizes:
             self.iconSizeComboBox.addItem(
-                EricIconBar.BarSizes[iconBarSize][2], iconBarSize)
-        
+                EricIconBar.BarSizes[iconBarSize][2], iconBarSize
+            )
+
         # set initial values
         self.__populateStyleCombo()
         self.__populateLanguageCombo()
-        
+
         self.uiBrowsersListFoldersFirstCheckBox.setChecked(
-            Preferences.getUI("BrowsersListFoldersFirst"))
+            Preferences.getUI("BrowsersListFoldersFirst")
+        )
         self.uiBrowsersHideNonPublicCheckBox.setChecked(
-            Preferences.getUI("BrowsersHideNonPublic"))
+            Preferences.getUI("BrowsersHideNonPublic")
+        )
         self.uiBrowsersSortByOccurrenceCheckBox.setChecked(
-            Preferences.getUI("BrowsersListContentsByOccurrence"))
+            Preferences.getUI("BrowsersListContentsByOccurrence")
+        )
         self.browserShowCodingCheckBox.setChecked(
-            Preferences.getUI("BrowserShowCoding"))
-        self.fileFiltersEdit.setText(
-            Preferences.getUI("BrowsersFileFilters"))
-        
+            Preferences.getUI("BrowserShowCoding")
+        )
+        self.fileFiltersEdit.setText(Preferences.getUI("BrowsersFileFilters"))
+
         self.uiCaptionShowsFilenameGroupBox.setChecked(
-            Preferences.getUI("CaptionShowsFilename"))
-        self.filenameLengthSpinBox.setValue(
-            Preferences.getUI("CaptionFilenameLength"))
+            Preferences.getUI("CaptionShowsFilename")
+        )
+        self.filenameLengthSpinBox.setValue(Preferences.getUI("CaptionFilenameLength"))
         self.styleSheetPicker.setText(Preferences.getUI("StyleSheet"))
         self.styleIconsPathPicker.setText(Preferences.getUI("StyleIconsPath"))
-        
+
         layoutType = Preferences.getUI("LayoutType")
         if layoutType == "Sidebars":
             index = 0
         elif layoutType == "Toolboxes":
             index = 1
         else:
-            index = 0   # default for bad values
+            index = 0  # default for bad values
         self.layoutComboBox.setCurrentIndex(index)
-        
+
         # integrated tools activation
         # left side
-        self.findReplaceCheckBox.setChecked(
-            Preferences.getUI("ShowFindFileWidget"))
+        self.findReplaceCheckBox.setChecked(Preferences.getUI("ShowFindFileWidget"))
         self.findLocationCheckBox.setChecked(
-            Preferences.getUI("ShowFindLocationWidget"))
-        self.templateViewerCheckBox.setChecked(
-            Preferences.getUI("ShowTemplateViewer"))
-        self.fileBrowserCheckBox.setChecked(
-            Preferences.getUI("ShowFileBrowser"))
-        self.symbolsCheckBox.setChecked(
-            Preferences.getUI("ShowSymbolsViewer"))
+            Preferences.getUI("ShowFindLocationWidget")
+        )
+        self.templateViewerCheckBox.setChecked(Preferences.getUI("ShowTemplateViewer"))
+        self.fileBrowserCheckBox.setChecked(Preferences.getUI("ShowFileBrowser"))
+        self.symbolsCheckBox.setChecked(Preferences.getUI("ShowSymbolsViewer"))
         # right side
         self.codeDocumentationViewerCheckBox.setChecked(
-            Preferences.getUI("ShowCodeDocumentationViewer"))
-        self.helpViewerCheckBox.setChecked(
-            Preferences.getUI("ShowInternalHelpViewer"))
-        self.condaCheckBox.setChecked(
-            Preferences.getUI("ShowCondaPackageManager"))
-        self.pypiCheckBox.setChecked(
-            Preferences.getUI("ShowPyPIPackageManager"))
-        self.cooperationCheckBox.setChecked(
-            Preferences.getUI("ShowCooperation"))
-        self.ircCheckBox.setChecked(
-            Preferences.getUI("ShowIrc"))
-        self.microPythonCheckBox.setChecked(
-            Preferences.getUI("ShowMicroPython"))
+            Preferences.getUI("ShowCodeDocumentationViewer")
+        )
+        self.helpViewerCheckBox.setChecked(Preferences.getUI("ShowInternalHelpViewer"))
+        self.condaCheckBox.setChecked(Preferences.getUI("ShowCondaPackageManager"))
+        self.pypiCheckBox.setChecked(Preferences.getUI("ShowPyPIPackageManager"))
+        self.cooperationCheckBox.setChecked(Preferences.getUI("ShowCooperation"))
+        self.ircCheckBox.setChecked(Preferences.getUI("ShowIrc"))
+        self.microPythonCheckBox.setChecked(Preferences.getUI("ShowMicroPython"))
         # bottom side
-        self.numbersCheckBox.setChecked(
-            Preferences.getUI("ShowNumbersViewer"))
-        
+        self.numbersCheckBox.setChecked(Preferences.getUI("ShowNumbersViewer"))
+
         self.iconSizeComboBox.setCurrentIndex(
-            self.iconSizeComboBox.findData(Preferences.getUI("IconBarSize")))
+            self.iconSizeComboBox.findData(Preferences.getUI("IconBarSize"))
+        )
         self.__iconBarColor = Preferences.getUI("IconBarColor")
         self.__setIconBarSamples()
-        
+
         self.combinedLeftRightSidebarCheckBox.setChecked(
-            Preferences.getUI("CombinedLeftRightSidebar"))
-        
+            Preferences.getUI("CombinedLeftRightSidebar")
+        )
+
         # connect the icon size combo box after initialization is complete
-        self.iconSizeComboBox.currentIndexChanged.connect(
-            self.__setIconBarSamples)
-        
+        self.iconSizeComboBox.currentIndexChanged.connect(self.__setIconBarSamples)
+
     def save(self):
         """
         Public slot to save the Interface configuration.
@@ -136,134 +135,101 @@
         styleIndex = self.styleComboBox.currentIndex()
         style = self.styleComboBox.itemData(styleIndex)
         Preferences.setUI("Style", style)
-        
+
         # save the other UI related settings
         Preferences.setUI(
             "BrowsersListFoldersFirst",
-            self.uiBrowsersListFoldersFirstCheckBox.isChecked())
+            self.uiBrowsersListFoldersFirstCheckBox.isChecked(),
+        )
         Preferences.setUI(
-            "BrowsersHideNonPublic",
-            self.uiBrowsersHideNonPublicCheckBox.isChecked())
+            "BrowsersHideNonPublic", self.uiBrowsersHideNonPublicCheckBox.isChecked()
+        )
         Preferences.setUI(
             "BrowsersListContentsByOccurrence",
-            self.uiBrowsersSortByOccurrenceCheckBox.isChecked())
-        Preferences.setUI(
-            "BrowserShowCoding",
-            self.browserShowCodingCheckBox.isChecked())
-        Preferences.setUI(
-            "BrowsersFileFilters",
-            self.fileFiltersEdit.text())
-        
+            self.uiBrowsersSortByOccurrenceCheckBox.isChecked(),
+        )
         Preferences.setUI(
-            "CaptionShowsFilename",
-            self.uiCaptionShowsFilenameGroupBox.isChecked())
-        Preferences.setUI(
-            "CaptionFilenameLength",
-            self.filenameLengthSpinBox.value())
+            "BrowserShowCoding", self.browserShowCodingCheckBox.isChecked()
+        )
+        Preferences.setUI("BrowsersFileFilters", self.fileFiltersEdit.text())
+
         Preferences.setUI(
-            "StyleSheet",
-            self.styleSheetPicker.text())
-        Preferences.setUI(
-            "StyleIconsPath",
-            self.styleIconsPathPicker.text())
-        
+            "CaptionShowsFilename", self.uiCaptionShowsFilenameGroupBox.isChecked()
+        )
+        Preferences.setUI("CaptionFilenameLength", self.filenameLengthSpinBox.value())
+        Preferences.setUI("StyleSheet", self.styleSheetPicker.text())
+        Preferences.setUI("StyleIconsPath", self.styleIconsPathPicker.text())
+
         # save the language settings
         uiLanguageIndex = self.languageComboBox.currentIndex()
         uiLanguage = (
-            self.languageComboBox.itemData(uiLanguageIndex)
-            if uiLanguageIndex else
-            None
+            self.languageComboBox.itemData(uiLanguageIndex) if uiLanguageIndex else None
         )
         Preferences.setUILanguage(uiLanguage)
-        
+
         # save the interface layout settings
         if self.layoutComboBox.currentIndex() == 0:
             layoutType = "Sidebars"
         elif self.layoutComboBox.currentIndex() == 1:
             layoutType = "Toolboxes"
         else:
-            layoutType = "Sidebars"    # just in case
+            layoutType = "Sidebars"  # just in case
         Preferences.setUI("LayoutType", layoutType)
-        
+
         # save the integrated tools activation
         # left side
-        Preferences.setUI(
-            "ShowFindFileWidget",
-            self.findReplaceCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowFindLocationWidget",
-            self.findLocationCheckBox.isChecked())
+        Preferences.setUI("ShowFindFileWidget", self.findReplaceCheckBox.isChecked())
         Preferences.setUI(
-            "ShowTemplateViewer",
-            self.templateViewerCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowFileBrowser",
-            self.fileBrowserCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowSymbolsViewer",
-            self.symbolsCheckBox.isChecked())
+            "ShowFindLocationWidget", self.findLocationCheckBox.isChecked()
+        )
+        Preferences.setUI("ShowTemplateViewer", self.templateViewerCheckBox.isChecked())
+        Preferences.setUI("ShowFileBrowser", self.fileBrowserCheckBox.isChecked())
+        Preferences.setUI("ShowSymbolsViewer", self.symbolsCheckBox.isChecked())
         # right side
         Preferences.setUI(
             "ShowCodeDocumentationViewer",
-            self.codeDocumentationViewerCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowInternalHelpViewer",
-            self.helpViewerCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowCondaPackageManager",
-            self.condaCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowPyPIPackageManager",
-            self.pypiCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowCooperation",
-            self.cooperationCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowIrc",
-            self.ircCheckBox.isChecked())
-        Preferences.setUI(
-            "ShowMicroPython",
-            self.microPythonCheckBox.isChecked())
+            self.codeDocumentationViewerCheckBox.isChecked(),
+        )
+        Preferences.setUI("ShowInternalHelpViewer", self.helpViewerCheckBox.isChecked())
+        Preferences.setUI("ShowCondaPackageManager", self.condaCheckBox.isChecked())
+        Preferences.setUI("ShowPyPIPackageManager", self.pypiCheckBox.isChecked())
+        Preferences.setUI("ShowCooperation", self.cooperationCheckBox.isChecked())
+        Preferences.setUI("ShowIrc", self.ircCheckBox.isChecked())
+        Preferences.setUI("ShowMicroPython", self.microPythonCheckBox.isChecked())
         # bottom side
-        Preferences.setUI(
-            "ShowNumbersViewer",
-            self.numbersCheckBox.isChecked())
-        
-        Preferences.setUI(
-            "IconBarSize",
-            self.iconSizeComboBox.currentData())
-        Preferences.setUI(
-            "IconBarColor",
-            self.__iconBarColor)
+        Preferences.setUI("ShowNumbersViewer", self.numbersCheckBox.isChecked())
+
+        Preferences.setUI("IconBarSize", self.iconSizeComboBox.currentData())
+        Preferences.setUI("IconBarColor", self.__iconBarColor)
         Preferences.setUI(
             "CombinedLeftRightSidebar",
-            self.combinedLeftRightSidebarCheckBox.isChecked())
-        
+            self.combinedLeftRightSidebarCheckBox.isChecked(),
+        )
+
     def __populateStyleCombo(self):
         """
         Private method to populate the style combo box.
         """
         curStyle = Preferences.getUI("Style")
         styles = sorted(QStyleFactory.keys())
-        self.styleComboBox.addItem(self.tr('System'), "System")
+        self.styleComboBox.addItem(self.tr("System"), "System")
         for style in styles:
             self.styleComboBox.addItem(style, style)
         currentIndex = self.styleComboBox.findData(curStyle)
         if currentIndex == -1:
             currentIndex = 0
         self.styleComboBox.setCurrentIndex(currentIndex)
-        
+
     def __populateLanguageCombo(self):
         """
         Private method to initialize the language combo box.
         """
         self.languageComboBox.clear()
-        
+
         fnlist = (
-            glob.glob("eric7_*.qm") +
-            glob.glob(os.path.join(
-                getConfig('ericTranslationsDir'), "eric7_*.qm")) +
-            glob.glob(os.path.join(Utilities.getConfigDir(), "eric7_*.qm"))
+            glob.glob("eric7_*.qm")
+            + glob.glob(os.path.join(getConfig("ericTranslationsDir"), "eric7_*.qm"))
+            + glob.glob(os.path.join(Utilities.getConfigDir(), "eric7_*.qm"))
         )
         locales = {}
         for fn in fnlist:
@@ -271,12 +237,9 @@
             if locale not in locales:
                 translator = QTranslator()
                 translator.load(fn)
-                locales[locale] = (
-                    translator.translate(
-                        "InterfacePage", "English",
-                        "Translate this with your language") +
-                    " ({0})".format(locale)
-                )
+                locales[locale] = translator.translate(
+                    "InterfacePage", "English", "Translate this with your language"
+                ) + " ({0})".format(locale)
         localeList = sorted(locales.keys())
         try:
             uiLanguage = Preferences.getUILanguage()
@@ -289,20 +252,20 @@
         except ValueError:
             currentIndex = 0
         self.languageComboBox.clear()
-        
+
         self.languageComboBox.addItem("English (default)", "None")
-        self.languageComboBox.addItem(self.tr('System'), "System")
+        self.languageComboBox.addItem(self.tr("System"), "System")
         for locale in localeList:
             self.languageComboBox.addItem(locales[locale], locale)
         self.languageComboBox.setCurrentIndex(currentIndex)
-    
+
     @pyqtSlot()
     def on_resetLayoutButton_clicked(self):
         """
         Private method to reset layout to factory defaults.
         """
         Preferences.resetLayout()
-    
+
     @pyqtSlot()
     def __setIconBarSamples(self):
         """
@@ -311,25 +274,25 @@
         iconBarSize = self.iconSizeComboBox.currentData()
         iconSize, borderSize = EricIconBar.BarSizes[iconBarSize][:2]
         size = iconSize + 2 * borderSize
-        
+
         self.sampleLabel.setFixedSize(size, size)
         self.sampleLabel.setStyleSheet(
-            EricIconBar.LabelStyleSheetTemplate
-            .format(self.__iconBarColor.name()))
+            EricIconBar.LabelStyleSheetTemplate.format(self.__iconBarColor.name())
+        )
         self.sampleLabel.setPixmap(
-            UI.PixmapCache.getIcon("sbDebugViewer96")
-            .pixmap(iconSize, iconSize)
+            UI.PixmapCache.getIcon("sbDebugViewer96").pixmap(iconSize, iconSize)
         )
-        
+
         self.highlightedSampleLabel.setFixedSize(size, size)
         self.highlightedSampleLabel.setStyleSheet(
-            EricIconBar.LabelStyleSheetTemplate
-            .format(self.__iconBarColor.darker().name()))
+            EricIconBar.LabelStyleSheetTemplate.format(
+                self.__iconBarColor.darker().name()
+            )
+        )
         self.highlightedSampleLabel.setPixmap(
-            UI.PixmapCache.getIcon("sbDebugViewer96")
-            .pixmap(iconSize, iconSize)
+            UI.PixmapCache.getIcon("sbDebugViewer96").pixmap(iconSize, iconSize)
         )
-    
+
     @pyqtSlot()
     def on_iconBarButton_clicked(self):
         """
@@ -341,26 +304,24 @@
         if colDlg.exec() == QDialog.DialogCode.Accepted:
             self.__iconBarColor = colDlg.selectedColor()
             self.__setIconBarSamples()
-    
+
     @pyqtSlot(bool)
     def on_combinedLeftRightSidebarCheckBox_toggled(self, checked):
         """
         Private slot handling a change of the combined sidebars checkbox.
-        
+
         @param checked state of the checkbox
         @type bool
         """
         self.leftRightGroupBox.setTitle(
-            self.tr("Combined Left Side")
-            if checked else
-            self.tr("Right Side")
+            self.tr("Combined Left Side") if checked else self.tr("Right Side")
         )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/IrcPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/IrcPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,17 @@
     """
     Class implementing the IRC configuration page.
     """
+
     TimeFormats = ["hh:mm", "hh:mm:ss", "h:mm ap", "h:mm:ss ap"]
-    DateFormats = ["yyyy-MM-dd", "dd.MM.yyyy", "MM/dd/yyyy",
-                   "yyyy MMM. dd", "dd MMM. yyyy", "MMM. dd, yyyy"]
-    
+    DateFormats = [
+        "yyyy-MM-dd",
+        "dd.MM.yyyy",
+        "MM/dd/yyyy",
+        "yyyy MMM. dd",
+        "dd MMM. yyyy",
+        "MMM. dd, yyyy",
+    ]
+
     def __init__(self):
         """
         Constructor
@@ -28,139 +35,164 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("IrcPage")
-        
+
         self.timeFormatCombo.addItems(IrcPage.TimeFormats)
         self.dateFormatCombo.addItems(IrcPage.DateFormats)
-        
+
         # set initial values
         # timestamps
         self.timestampGroup.setChecked(Preferences.getIrc("ShowTimestamps"))
-        self.showDateCheckBox.setChecked(
-            Preferences.getIrc("TimestampIncludeDate"))
+        self.showDateCheckBox.setChecked(Preferences.getIrc("TimestampIncludeDate"))
         self.timeFormatCombo.setCurrentIndex(
-            self.timeFormatCombo.findText(Preferences.getIrc("TimeFormat")))
+            self.timeFormatCombo.findText(Preferences.getIrc("TimeFormat"))
+        )
         self.dateFormatCombo.setCurrentIndex(
-            self.dateFormatCombo.findText(Preferences.getIrc("DateFormat")))
-        
+            self.dateFormatCombo.findText(Preferences.getIrc("DateFormat"))
+        )
+
         # colours
-        self.initColour("NetworkMessageColour", self.networkButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("ServerMessageColour", self.serverButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("ErrorMessageColour", self.errorButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("TimestampColour", self.timestampButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("HyperlinkColour", self.hyperlinkButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("ChannelMessageColour", self.channelButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("OwnNickColour", self.ownNickButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("NickColour", self.nickButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("JoinChannelColour", self.joinButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("LeaveChannelColour", self.leaveButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("ChannelInfoColour", self.infoButton,
-                        Preferences.getIrc, byName=True)
-        
+        self.initColour(
+            "NetworkMessageColour", self.networkButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "ServerMessageColour", self.serverButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "ErrorMessageColour", self.errorButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "TimestampColour", self.timestampButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "HyperlinkColour", self.hyperlinkButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "ChannelMessageColour", self.channelButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "OwnNickColour", self.ownNickButton, Preferences.getIrc, byName=True
+        )
+        self.initColour("NickColour", self.nickButton, Preferences.getIrc, byName=True)
+        self.initColour(
+            "JoinChannelColour", self.joinButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "LeaveChannelColour", self.leaveButton, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "ChannelInfoColour", self.infoButton, Preferences.getIrc, byName=True
+        )
+
         # notifications
-        self.notificationsGroup.setChecked(
-            Preferences.getIrc("ShowNotifications"))
+        self.notificationsGroup.setChecked(Preferences.getIrc("ShowNotifications"))
         self.joinLeaveCheckBox.setChecked(Preferences.getIrc("NotifyJoinPart"))
         self.messageCheckBox.setChecked(Preferences.getIrc("NotifyMessage"))
         self.ownNickCheckBox.setChecked(Preferences.getIrc("NotifyNick"))
-        
+
         # IRC text colors
-        self.initColour("IrcColor0", self.ircColor0Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor1", self.ircColor1Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor2", self.ircColor2Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor3", self.ircColor3Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor4", self.ircColor4Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor5", self.ircColor5Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor6", self.ircColor6Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor7", self.ircColor7Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor8", self.ircColor8Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor9", self.ircColor9Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor10", self.ircColor10Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor11", self.ircColor11Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor12", self.ircColor12Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor13", self.ircColor13Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor14", self.ircColor14Button,
-                        Preferences.getIrc, byName=True)
-        self.initColour("IrcColor15", self.ircColor15Button,
-                        Preferences.getIrc, byName=True)
-        
+        self.initColour(
+            "IrcColor0", self.ircColor0Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor1", self.ircColor1Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor2", self.ircColor2Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor3", self.ircColor3Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor4", self.ircColor4Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor5", self.ircColor5Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor6", self.ircColor6Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor7", self.ircColor7Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor8", self.ircColor8Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor9", self.ircColor9Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor10", self.ircColor10Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor11", self.ircColor11Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor12", self.ircColor12Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor13", self.ircColor13Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor14", self.ircColor14Button, Preferences.getIrc, byName=True
+        )
+        self.initColour(
+            "IrcColor15", self.ircColor15Button, Preferences.getIrc, byName=True
+        )
+
         # Automatic User Information Lookup
         self.whoGroup.setChecked(Preferences.getIrc("AutoUserInfoLookup"))
         self.whoUsersSpinBox.setValue(Preferences.getIrc("AutoUserInfoMax"))
-        self.whoIntervalSpinBox.setValue(
-            Preferences.getIrc("AutoUserInfoInterval"))
-        
+        self.whoIntervalSpinBox.setValue(Preferences.getIrc("AutoUserInfoInterval"))
+
         # Markers
         self.markWhenHiddenCheckBox.setChecked(
-            Preferences.getIrc("MarkPositionWhenHidden"))
-        self.initColour("MarkerLineForegroundColour",
-                        self.markerForegroundButton,
-                        Preferences.getIrc, byName=True)
-        self.initColour("MarkerLineBackgroundColour",
-                        self.markerBackgroundButton,
-                        Preferences.getIrc, byName=True)
-        
+            Preferences.getIrc("MarkPositionWhenHidden")
+        )
+        self.initColour(
+            "MarkerLineForegroundColour",
+            self.markerForegroundButton,
+            Preferences.getIrc,
+            byName=True,
+        )
+        self.initColour(
+            "MarkerLineBackgroundColour",
+            self.markerBackgroundButton,
+            Preferences.getIrc,
+            byName=True,
+        )
+
         # Shutdown
-        self.confirmShutdownCheckBox.setChecked(
-            Preferences.getIrc("AskOnShutdown"))
-    
+        self.confirmShutdownCheckBox.setChecked(Preferences.getIrc("AskOnShutdown"))
+
     def save(self):
         """
         Public slot to save the IRC configuration.
         """
         # timestamps
         Preferences.setIrc("ShowTimestamps", self.timestampGroup.isChecked())
-        Preferences.setIrc(
-            "TimestampIncludeDate", self.showDateCheckBox.isChecked())
+        Preferences.setIrc("TimestampIncludeDate", self.showDateCheckBox.isChecked())
         Preferences.setIrc("TimeFormat", self.timeFormatCombo.currentText())
         Preferences.setIrc("DateFormat", self.dateFormatCombo.currentText())
-        
+
         # notifications
-        Preferences.setIrc(
-            "ShowNotifications", self.notificationsGroup.isChecked())
-        Preferences.setIrc(
-            "NotifyJoinPart", self.joinLeaveCheckBox.isChecked())
+        Preferences.setIrc("ShowNotifications", self.notificationsGroup.isChecked())
+        Preferences.setIrc("NotifyJoinPart", self.joinLeaveCheckBox.isChecked())
         Preferences.setIrc("NotifyMessage", self.messageCheckBox.isChecked())
         Preferences.setIrc("NotifyNick", self.ownNickCheckBox.isChecked())
-        
+
         # Automatic User Information Lookup
         Preferences.setIrc("AutoUserInfoLookup", self.whoGroup.isChecked())
         Preferences.setIrc("AutoUserInfoMax", self.whoUsersSpinBox.value())
-        Preferences.setIrc(
-            "AutoUserInfoInterval", self.whoIntervalSpinBox.value())
-        
+        Preferences.setIrc("AutoUserInfoInterval", self.whoIntervalSpinBox.value())
+
         # Markers
         Preferences.setIrc(
-            "MarkPositionWhenHidden",
-            self.markWhenHiddenCheckBox.isChecked())
-        
+            "MarkPositionWhenHidden", self.markWhenHiddenCheckBox.isChecked()
+        )
+
         # Shutdown
-        Preferences.setIrc(
-            "AskOnShutdown", self.confirmShutdownCheckBox.isChecked())
-        
+        Preferences.setIrc("AskOnShutdown", self.confirmShutdownCheckBox.isChecked())
+
         # colours
         self.saveColours(Preferences.setIrc)
 
@@ -168,7 +200,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/LogViewerPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/LogViewerPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,74 +20,69 @@
     """
     Class implementing the Log Viewer configuration page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("LogViewerPage")
-        
-        self.stdoutFilterEdit.setListWhatsThis(self.tr(
-            "<b>Message Filters for Standard Output</b>"
-            "<p>This list shows the configured message filters used to"
-            " suppress messages received via stdout.</p>"
-        ))
-        self.stderrFilterEdit.setListWhatsThis(self.tr(
-            "<b>Message Filters for Standard Error </b>"
-            "<p>This list shows the configured message filters used to"
-            " suppress messages received via stderr.</p>"
-        ))
-        self.stdxxxFilterEdit.setListWhatsThis(self.tr(
-            "<b>Message Filters for both</b>"
-            "<p>This list shows the configured message filters used to"
-            " suppress messages received via stdout or stderr.</p>"
-        ))
-        
+
+        self.stdoutFilterEdit.setListWhatsThis(
+            self.tr(
+                "<b>Message Filters for Standard Output</b>"
+                "<p>This list shows the configured message filters used to"
+                " suppress messages received via stdout.</p>"
+            )
+        )
+        self.stderrFilterEdit.setListWhatsThis(
+            self.tr(
+                "<b>Message Filters for Standard Error </b>"
+                "<p>This list shows the configured message filters used to"
+                " suppress messages received via stderr.</p>"
+            )
+        )
+        self.stdxxxFilterEdit.setListWhatsThis(
+            self.tr(
+                "<b>Message Filters for both</b>"
+                "<p>This list shows the configured message filters used to"
+                " suppress messages received via stdout or stderr.</p>"
+            )
+        )
+
         self.colourChanged.connect(self.__colorChanged)
-        
+
         # set initial values
-        self.lvAutoRaiseCheckBox.setChecked(
-            Preferences.getUI("LogViewerAutoRaise"))
-        
+        self.lvAutoRaiseCheckBox.setChecked(Preferences.getUI("LogViewerAutoRaise"))
+
         self.initColour(
-            "LogStdErrColour", self.stderrTextColourButton,
-            Preferences.getUI)
-        
-        self.stdoutFilterEdit.setList(
-            Preferences.getUI("LogViewerStdoutFilter"))
-        self.stderrFilterEdit.setList(
-            Preferences.getUI("LogViewerStderrFilter"))
-        self.stdxxxFilterEdit.setList(
-            Preferences.getUI("LogViewerStdxxxFilter"))
-    
+            "LogStdErrColour", self.stderrTextColourButton, Preferences.getUI
+        )
+
+        self.stdoutFilterEdit.setList(Preferences.getUI("LogViewerStdoutFilter"))
+        self.stderrFilterEdit.setList(Preferences.getUI("LogViewerStderrFilter"))
+        self.stdxxxFilterEdit.setList(Preferences.getUI("LogViewerStdxxxFilter"))
+
     def save(self):
         """
         Public slot to save the Interface configuration.
         """
-        Preferences.setUI(
-            "LogViewerAutoRaise",
-            self.lvAutoRaiseCheckBox.isChecked())
-        
+        Preferences.setUI("LogViewerAutoRaise", self.lvAutoRaiseCheckBox.isChecked())
+
         self.saveColours(Preferences.setUI)
-        
-        Preferences.setUI(
-            "LogViewerStdoutFilter",
-            self.stdoutFilterEdit.getList())
-        Preferences.setUI(
-            "LogViewerStderrFilter",
-            self.stderrFilterEdit.getList())
-        Preferences.setUI(
-            "LogViewerStdxxxFilter",
-            self.stdxxxFilterEdit.getList())
-    
+
+        Preferences.setUI("LogViewerStdoutFilter", self.stdoutFilterEdit.getList())
+        Preferences.setUI("LogViewerStderrFilter", self.stderrFilterEdit.getList())
+        Preferences.setUI("LogViewerStdxxxFilter", self.stdxxxFilterEdit.getList())
+
     @pyqtSlot(str, QColor)
     def __colorChanged(self, colorKey, color):
         """
         Private slot handling the selection of a color.
-        
+
         @param colorKey key of the color entry
         @type str
         @param color selected color
@@ -100,7 +95,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/MasterPasswordEntryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/MasterPasswordEntryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,27 @@
     """
     Class implementing a dialog to enter or change the master password.
     """
+
     def __init__(self, oldPasswordHash, parent=None):
         """
         Constructor
-        
+
         @param oldPasswordHash hash of the current password (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__oldPasswordHash = oldPasswordHash
         if self.__oldPasswordHash == "":
             self.currentPasswordEdit.setEnabled(False)
             if hasattr(self.currentPasswordEdit, "setPlaceholderText"):
                 self.currentPasswordEdit.setPlaceholderText(
-                    self.tr("(not defined yet)"))
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+                    self.tr("(not defined yet)")
+                )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def __updateUI(self):
         """
         Private slot to update the variable parts of the UI.
@@ -45,74 +46,74 @@
         error = ""
         if self.currentPasswordEdit.isEnabled():
             from Utilities.crypto.py3PBKDF2 import verifyPassword
+
             enable = verifyPassword(
-                self.currentPasswordEdit.text(), self.__oldPasswordHash)
+                self.currentPasswordEdit.text(), self.__oldPasswordHash
+            )
             if not enable:
                 error = error or self.tr("Wrong password entered.")
-        
+
         if self.newPasswordEdit.text() == "":
             enable = False
             error = error or self.tr("New password must not be empty.")
-        
+
         if (
-            self.newPasswordEdit.text() != "" and
-            self.newPasswordEdit.text() != self.newPasswordAgainEdit.text()
+            self.newPasswordEdit.text() != ""
+            and self.newPasswordEdit.text() != self.newPasswordAgainEdit.text()
         ):
             enable = False
             error = error or self.tr("Repeated password is wrong.")
-        
+
         if (
-            self.currentPasswordEdit.isEnabled() and
-            self.newPasswordEdit.text() == self.currentPasswordEdit.text()
+            self.currentPasswordEdit.isEnabled()
+            and self.newPasswordEdit.text() == self.currentPasswordEdit.text()
         ):
             enable = False
-            error = error or self.tr(
-                "Old and new password must not be the same.")
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+            error = error or self.tr("Old and new password must not be the same.")
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
         self.errorLabel.setText(error)
-    
+
     @pyqtSlot(str)
     def on_currentPasswordEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the current password.
-        
+
         @param txt content of the edit widget (string)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(str)
     def on_newPasswordEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the new password.
-        
+
         @param txt content of the edit widget (string)
         """
         self.passwordMeter.checkPasswordStrength(txt)
         self.__updateUI()
-    
+
     @pyqtSlot(str)
     def on_newPasswordAgainEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the new again password.
-        
+
         @param txt content of the edit widget (string)
         """
         self.__updateUI()
-    
+
     def getMasterPassword(self):
         """
         Public method to get the new master password.
-        
+
         @return new master password (string)
         """
         return self.newPasswordEdit.text()
-    
+
     def getCurrentPassword(self):
         """
         Public method to get the current master password.
-        
+
         @return current master password (string)
         """
         return self.currentPasswordEdit.text()
--- a/src/eric7/Preferences/ConfigurationPages/MicroPythonPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/MicroPythonPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,218 +22,221 @@
     """
     Class implementing the MicroPython configuration page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("MicroPythonPage")
-        
+
         self.workspacePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.colorSchemeComboBox.addItems(sorted(AnsiColorSchemes.keys()))
-        
+
         # populate the chart theme combobox
         try:
             from PyQt6.QtCharts import QChart
-            
+
+            self.chartThemeComboBox.addItem(self.tr("Automatic"), -1)
             self.chartThemeComboBox.addItem(
-                self.tr("Automatic"), -1)
+                self.tr("Light"), QChart.ChartTheme.ChartThemeLight
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Light"),
-                QChart.ChartTheme.ChartThemeLight)
+                self.tr("Dark"), QChart.ChartTheme.ChartThemeDark
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Dark"),
-                QChart.ChartTheme.ChartThemeDark)
-            self.chartThemeComboBox.addItem(
-                self.tr("Blue Cerulean"),
-                QChart.ChartTheme.ChartThemeBlueCerulean)
+                self.tr("Blue Cerulean"), QChart.ChartTheme.ChartThemeBlueCerulean
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Brown Sand"),
-                QChart.ChartTheme.ChartThemeBrownSand)
+                self.tr("Brown Sand"), QChart.ChartTheme.ChartThemeBrownSand
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Blue NCS"),
-                QChart.ChartTheme.ChartThemeBlueNcs)
+                self.tr("Blue NCS"), QChart.ChartTheme.ChartThemeBlueNcs
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("High Contrast"),
-                QChart.ChartTheme.ChartThemeHighContrast)
+                self.tr("High Contrast"), QChart.ChartTheme.ChartThemeHighContrast
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Blue Icy"),
-                QChart.ChartTheme.ChartThemeBlueIcy)
+                self.tr("Blue Icy"), QChart.ChartTheme.ChartThemeBlueIcy
+            )
             self.chartThemeComboBox.addItem(
-                self.tr("Qt"),
-                QChart.ChartTheme.ChartThemeQt)
+                self.tr("Qt"), QChart.ChartTheme.ChartThemeQt
+            )
         except ImportError:
             self.chartThemeComboBox.setEnabled(False)
-        
+
         self.mpyCrossPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.mpyCrossPicker.setFilters(self.tr("All Files (*)"))
-        
+
         self.dfuUtilPathPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.dfuUtilPathPicker.setFilters(self.tr("All Files (*)"))
-        
+
         # set initial values
         # workspace
         self.workspacePicker.setText(
             Utilities.toNativeSeparators(
-                Preferences.getMicroPython("MpyWorkspace") or
-                Utilities.getHomeDir()))
-        
+                Preferences.getMicroPython("MpyWorkspace") or Utilities.getHomeDir()
+            )
+        )
+
         # serial link parameters
         self.timeoutSpinBox.setValue(
-            Preferences.getMicroPython("SerialTimeout") // 1000)
+            Preferences.getMicroPython("SerialTimeout") // 1000
+        )
         # converted to seconds
         self.syncTimeCheckBox.setChecked(
-            Preferences.getMicroPython("SyncTimeAfterConnect"))
-        
+            Preferences.getMicroPython("SyncTimeAfterConnect")
+        )
+
         # REPL Pane
         self.colorSchemeComboBox.setCurrentIndex(
-            self.colorSchemeComboBox.findText(
-                Preferences.getMicroPython("ColorScheme")))
-        self.replWrapCheckBox.setChecked(
-            Preferences.getMicroPython("ReplLineWrap"))
-        
+            self.colorSchemeComboBox.findText(Preferences.getMicroPython("ColorScheme"))
+        )
+        self.replWrapCheckBox.setChecked(Preferences.getMicroPython("ReplLineWrap"))
+
         # Chart Pane
         index = self.chartThemeComboBox.findData(
-            Preferences.getMicroPython("ChartColorTheme"))
+            Preferences.getMicroPython("ChartColorTheme")
+        )
         if index < 0:
             index = 0
         self.chartThemeComboBox.setCurrentIndex(index)
-        
+
         # MPY Cross Compiler
-        self.mpyCrossPicker.setText(
-            Preferences.getMicroPython("MpyCrossCompiler"))
-        
+        self.mpyCrossPicker.setText(Preferences.getMicroPython("MpyCrossCompiler"))
+
         # PyBoard specifics
-        self.dfuUtilPathPicker.setText(
-            Preferences.getMicroPython("DfuUtilPath"))
-        
+        self.dfuUtilPathPicker.setText(Preferences.getMicroPython("DfuUtilPath"))
+
         # MicroPython URLs
         self.micropythonFirmwareUrlLineEdit.setText(
-            Preferences.getMicroPython("MicroPythonFirmwareUrl"))
+            Preferences.getMicroPython("MicroPythonFirmwareUrl")
+        )
         self.micropythonDocuUrlLineEdit.setText(
-            Preferences.getMicroPython("MicroPythonDocuUrl"))
-        
+            Preferences.getMicroPython("MicroPythonDocuUrl")
+        )
+
         # CircuitPython URLs
         self.circuitpythonFirmwareUrlLineEdit.setText(
-            Preferences.getMicroPython("CircuitPythonFirmwareUrl"))
+            Preferences.getMicroPython("CircuitPythonFirmwareUrl")
+        )
         self.circuitpythonLibrariesUrlLineEdit.setText(
-            Preferences.getMicroPython("CircuitPythonLibrariesUrl"))
+            Preferences.getMicroPython("CircuitPythonLibrariesUrl")
+        )
         self.circuitpythonDocuUrlLineEdit.setText(
-            Preferences.getMicroPython("CircuitPythonDocuUrl"))
-        
+            Preferences.getMicroPython("CircuitPythonDocuUrl")
+        )
+
         # BBC micro:bit URLs
         self.microbitFirmwareUrlLineEdit.setText(
-            Preferences.getMicroPython("MicrobitFirmwareUrl"))
+            Preferences.getMicroPython("MicrobitFirmwareUrl")
+        )
         self.microbitV1MicroPythonUrlLineEdit.setText(
-            Preferences.getMicroPython("MicrobitMicroPythonUrl"))
+            Preferences.getMicroPython("MicrobitMicroPythonUrl")
+        )
         self.microbitV2MicroPythonUrlLineEdit.setText(
-            Preferences.getMicroPython("MicrobitV2MicroPythonUrl"))
+            Preferences.getMicroPython("MicrobitV2MicroPythonUrl")
+        )
         self.microbitDocuUrlLineEdit.setText(
-            Preferences.getMicroPython("MicrobitDocuUrl"))
-        
+            Preferences.getMicroPython("MicrobitDocuUrl")
+        )
+
         # Calliope mini URLs
         self.calliopeFirmwareUrlLineEdit.setText(
-            Preferences.getMicroPython("CalliopeDAPLinkUrl"))
+            Preferences.getMicroPython("CalliopeDAPLinkUrl")
+        )
         self.calliopeMicroPythonUrlLineEdit.setText(
-            Preferences.getMicroPython("CalliopeMicroPythonUrl"))
+            Preferences.getMicroPython("CalliopeMicroPythonUrl")
+        )
         self.calliopeDocuUrlLineEdit.setText(
-            Preferences.getMicroPython("CalliopeDocuUrl"))
-    
+            Preferences.getMicroPython("CalliopeDocuUrl")
+        )
+
     def save(self):
         """
         Public slot to save the MicroPython configuration.
         """
         # workspace
-        Preferences.setMicroPython(
-            "MpyWorkspace",
-            self.workspacePicker.text())
-        
+        Preferences.setMicroPython("MpyWorkspace", self.workspacePicker.text())
+
         # serial link parameters
-        Preferences.setMicroPython(
-            "SerialTimeout",
-            self.timeoutSpinBox.value() * 1000)
+        Preferences.setMicroPython("SerialTimeout", self.timeoutSpinBox.value() * 1000)
         # converted to milliseconds
         Preferences.setMicroPython(
-            "SyncTimeAfterConnect",
-            self.syncTimeCheckBox.isChecked())
-        
+            "SyncTimeAfterConnect", self.syncTimeCheckBox.isChecked()
+        )
+
         # REPL Pane
         Preferences.setMicroPython(
-            "ColorScheme",
-            self.colorSchemeComboBox.currentText())
-        Preferences.setMicroPython(
-            "ReplLineWrap",
-            self.replWrapCheckBox.isChecked())
-        
+            "ColorScheme", self.colorSchemeComboBox.currentText()
+        )
+        Preferences.setMicroPython("ReplLineWrap", self.replWrapCheckBox.isChecked())
+
         # Chart Pane
         Preferences.setMicroPython(
-            "ChartColorTheme",
-            self.chartThemeComboBox.currentData())
-        
+            "ChartColorTheme", self.chartThemeComboBox.currentData()
+        )
+
         # MPY Cross Compiler
-        Preferences.setMicroPython(
-            "MpyCrossCompiler",
-            self.mpyCrossPicker.text())
-        
+        Preferences.setMicroPython("MpyCrossCompiler", self.mpyCrossPicker.text())
+
         # PyBoard specifics
-        Preferences.setMicroPython(
-            "DfuUtilPath",
-            self.dfuUtilPathPicker.text())
-        
+        Preferences.setMicroPython("DfuUtilPath", self.dfuUtilPathPicker.text())
+
         # MicroPython URLs
         Preferences.setMicroPython(
-            "MicroPythonFirmwareUrl",
-            self.micropythonFirmwareUrlLineEdit.text())
+            "MicroPythonFirmwareUrl", self.micropythonFirmwareUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "MicroPythonDocuUrl",
-            self.micropythonDocuUrlLineEdit.text())
-        
+            "MicroPythonDocuUrl", self.micropythonDocuUrlLineEdit.text()
+        )
+
         # CircuitPython URLs
         Preferences.setMicroPython(
-            "CircuitPythonFirmwareUrl",
-            self.circuitpythonFirmwareUrlLineEdit.text())
+            "CircuitPythonFirmwareUrl", self.circuitpythonFirmwareUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "CircuitPythonLibrariesUrl",
-            self.circuitpythonLibrariesUrlLineEdit.text())
+            "CircuitPythonLibrariesUrl", self.circuitpythonLibrariesUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "CircuitPythonDocuUrl",
-            self.circuitpythonDocuUrlLineEdit.text())
-        
+            "CircuitPythonDocuUrl", self.circuitpythonDocuUrlLineEdit.text()
+        )
+
         # BBC micro:bit URLs
         Preferences.setMicroPython(
-            "MicrobitFirmwareUrl",
-            self.microbitFirmwareUrlLineEdit.text())
+            "MicrobitFirmwareUrl", self.microbitFirmwareUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "MicrobitMicroPythonUrl",
-            self.microbitV1MicroPythonUrlLineEdit.text())
+            "MicrobitMicroPythonUrl", self.microbitV1MicroPythonUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "MicrobitV2MicroPythonUrl",
-            self.microbitV2MicroPythonUrlLineEdit.text())
+            "MicrobitV2MicroPythonUrl", self.microbitV2MicroPythonUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "MicrobitDocuUrl",
-            self.microbitDocuUrlLineEdit.text())
-        
+            "MicrobitDocuUrl", self.microbitDocuUrlLineEdit.text()
+        )
+
         # Calliope mini URLs
         Preferences.setMicroPython(
-            "CalliopeDAPLinkUrl",
-            self.calliopeFirmwareUrlLineEdit.text())
+            "CalliopeDAPLinkUrl", self.calliopeFirmwareUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "CalliopeMicroPythonUrl",
-            self.calliopeMicroPythonUrlLineEdit.text())
+            "CalliopeMicroPythonUrl", self.calliopeMicroPythonUrlLineEdit.text()
+        )
         Preferences.setMicroPython(
-            "CalliopeDocuUrl",
-            self.calliopeDocuUrlLineEdit.text())
+            "CalliopeDocuUrl", self.calliopeDocuUrlLineEdit.text()
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/MimeTypesPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/MimeTypesPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class implementing the Text Mime Types configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,28 +29,26 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("MimeTypesPage")
-        
+
         self.textMimeTypesList.setDefaultVisible(True)
         self.textMimeTypesList.setToDefault.connect(self.__setToDefault)
-        
+
         # set initial values
-        self.textMimeTypesList.setList(
-            Preferences.getUI("TextMimeTypes"))
-    
+        self.textMimeTypesList.setList(Preferences.getUI("TextMimeTypes"))
+
     def save(self):
         """
         Public slot to save the Interface configuration.
         """
         Preferences.setUI("TextMimeTypes", self.textMimeTypesList.getList())
-    
+
     @pyqtSlot()
     def __setToDefault(self):
         """
         Private slot to set the message list to the default values.
         """
-        self.textMimeTypesList.setList(
-            Preferences.Prefs.uiDefaults["TextMimeTypes"])
-    
+        self.textMimeTypesList.setList(Preferences.Prefs.uiDefaults["TextMimeTypes"])
+
     @pyqtSlot()
     def on_resetButton_clicked(self):
         """
@@ -58,17 +57,21 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Reset Mime Types"),
-            self.tr("""Do you really want to reset the configured list of"""
-                    """ mime types?"""))
+            self.tr(
+                """Do you really want to reset the configured list of"""
+                """ mime types?"""
+            ),
+        )
         if ok:
             self.textMimeTypesList.setList(
-                Preferences.Prefs.uiDefaults["TextMimeTypes"])
-    
+                Preferences.Prefs.uiDefaults["TextMimeTypes"]
+            )
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/MultiProjectPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/MultiProjectPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Multi Project configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,43 +28,45 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("MultiProjectPage")
-        
+
         self.workspacePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         # set initial values
         self.openMasterAutomaticallyCheckBox.setChecked(
-            Preferences.getMultiProject("OpenMasterAutomatically"))
+            Preferences.getMultiProject("OpenMasterAutomatically")
+        )
         self.multiProjectTimestampCheckBox.setChecked(
-            Preferences.getMultiProject("TimestampFile"))
+            Preferences.getMultiProject("TimestampFile")
+        )
         self.multiProjectRecentSpinBox.setValue(
-            Preferences.getMultiProject("RecentNumber"))
+            Preferences.getMultiProject("RecentNumber")
+        )
         self.workspacePicker.setText(
             Utilities.toNativeSeparators(
-                Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir()))
-        
+                Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
+            )
+        )
+
     def save(self):
         """
         Public slot to save the Project configuration.
         """
         Preferences.setMultiProject(
-            "OpenMasterAutomatically",
-            self.openMasterAutomaticallyCheckBox.isChecked())
-        Preferences.setMultiProject(
-            "TimestampFile",
-            self.multiProjectTimestampCheckBox.isChecked())
+            "OpenMasterAutomatically", self.openMasterAutomaticallyCheckBox.isChecked()
+        )
         Preferences.setMultiProject(
-            "RecentNumber",
-            self.multiProjectRecentSpinBox.value())
+            "TimestampFile", self.multiProjectTimestampCheckBox.isChecked()
+        )
         Preferences.setMultiProject(
-            "Workspace",
-            self.workspacePicker.text())
-    
+            "RecentNumber", self.multiProjectRecentSpinBox.value()
+        )
+        Preferences.setMultiProject("Workspace", self.workspacePicker.text())
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/NetworkPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/NetworkPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,119 +23,110 @@
     """
     Class implementing the Network configuration page.
     """
+
     def __init__(self, configDialog):
         """
         Constructor
-        
+
         @param configDialog reference to the configuration dialog
             (ConfigurationDialog)
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("NetworkPage")
-        
+
         self.__configDlg = configDialog
         self.__displayMode = None
         self.__webEngine = False
-        
+
         self.downloadDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.ftpProxyTypeCombo.addItem(
-            self.tr("No FTP Proxy"),
-            EricFtpProxyType.NO_PROXY.value)
+            self.tr("No FTP Proxy"), EricFtpProxyType.NO_PROXY.value
+        )
         self.ftpProxyTypeCombo.addItem(
             self.tr("No Proxy Authentication required"),
-            EricFtpProxyType.NON_AUTHORIZING.value)
-        self.ftpProxyTypeCombo.addItem(
-            self.tr("User@Server"),
-            EricFtpProxyType.USER_SERVER.value)
+            EricFtpProxyType.NON_AUTHORIZING.value,
+        )
         self.ftpProxyTypeCombo.addItem(
-            self.tr("SITE"),
-            EricFtpProxyType.SITE.value)
-        self.ftpProxyTypeCombo.addItem(
-            self.tr("OPEN"),
-            EricFtpProxyType.OPEN.value)
+            self.tr("User@Server"), EricFtpProxyType.USER_SERVER.value
+        )
+        self.ftpProxyTypeCombo.addItem(self.tr("SITE"), EricFtpProxyType.SITE.value)
+        self.ftpProxyTypeCombo.addItem(self.tr("OPEN"), EricFtpProxyType.OPEN.value)
         self.ftpProxyTypeCombo.addItem(
             self.tr("User@Proxyuser@Server"),
-            EricFtpProxyType.USER_PROXYUSER_SERVER.value)
+            EricFtpProxyType.USER_PROXYUSER_SERVER.value,
+        )
         self.ftpProxyTypeCombo.addItem(
-            self.tr("Proxyuser@Server"),
-            EricFtpProxyType.PROXYUSER_SERVER.value)
-        self.ftpProxyTypeCombo.addItem(
-            self.tr("AUTH and RESP"),
-            EricFtpProxyType.AUTH_RESP.value)
+            self.tr("Proxyuser@Server"), EricFtpProxyType.PROXYUSER_SERVER.value
+        )
         self.ftpProxyTypeCombo.addItem(
-            self.tr("Bluecoat Proxy"),
-            EricFtpProxyType.BLUECOAT.value)
-        
+            self.tr("AUTH and RESP"), EricFtpProxyType.AUTH_RESP.value
+        )
+        self.ftpProxyTypeCombo.addItem(
+            self.tr("Bluecoat Proxy"), EricFtpProxyType.BLUECOAT.value
+        )
+
         # set initial values
-        self.dynamicOnlineCheckBox.setChecked(
-            Preferences.getUI("DynamicOnlineCheck"))
-        
+        self.dynamicOnlineCheckBox.setChecked(Preferences.getUI("DynamicOnlineCheck"))
+
         self.downloadDirPicker.setText(Preferences.getUI("DownloadPath"))
         self.requestFilenameCheckBox.setChecked(
-            Preferences.getUI("RequestDownloadFilename"))
-        
+            Preferences.getUI("RequestDownloadFilename")
+        )
+
         # HTTP proxy
-        self.httpProxyHostEdit.setText(
-            Preferences.getUI("ProxyHost/Http"))
-        self.httpProxyPortSpin.setValue(
-            Preferences.getUI("ProxyPort/Http"))
-        
+        self.httpProxyHostEdit.setText(Preferences.getUI("ProxyHost/Http"))
+        self.httpProxyPortSpin.setValue(Preferences.getUI("ProxyPort/Http"))
+
         # HTTPS proxy
-        self.httpsProxyHostEdit.setText(
-            Preferences.getUI("ProxyHost/Https"))
-        self.httpsProxyPortSpin.setValue(
-            Preferences.getUI("ProxyPort/Https"))
-        
+        self.httpsProxyHostEdit.setText(Preferences.getUI("ProxyHost/Https"))
+        self.httpsProxyPortSpin.setValue(Preferences.getUI("ProxyPort/Https"))
+
         # FTP proxy
-        self.ftpProxyHostEdit.setText(
-            Preferences.getUI("ProxyHost/Ftp"))
-        self.ftpProxyPortSpin.setValue(
-            Preferences.getUI("ProxyPort/Ftp"))
+        self.ftpProxyHostEdit.setText(Preferences.getUI("ProxyHost/Ftp"))
+        self.ftpProxyPortSpin.setValue(Preferences.getUI("ProxyPort/Ftp"))
         self.ftpProxyTypeCombo.setCurrentIndex(
-            self.ftpProxyTypeCombo.findData(
-                Preferences.getUI("ProxyType/Ftp").value))
-        self.ftpProxyUserEdit.setText(
-            Preferences.getUI("ProxyUser/Ftp"))
-        self.ftpProxyPasswordEdit.setText(
-            Preferences.getUI("ProxyPassword/Ftp"))
-        self.ftpProxyAccountEdit.setText(
-            Preferences.getUI("ProxyAccount/Ftp"))
-        
-        self.httpProxyForAllCheckBox.setChecked(
-            Preferences.getUI("UseHttpProxyForAll"))
+            self.ftpProxyTypeCombo.findData(Preferences.getUI("ProxyType/Ftp").value)
+        )
+        self.ftpProxyUserEdit.setText(Preferences.getUI("ProxyUser/Ftp"))
+        self.ftpProxyPasswordEdit.setText(Preferences.getUI("ProxyPassword/Ftp"))
+        self.ftpProxyAccountEdit.setText(Preferences.getUI("ProxyAccount/Ftp"))
+
+        self.httpProxyForAllCheckBox.setChecked(Preferences.getUI("UseHttpProxyForAll"))
         if not Preferences.getUI("UseProxy"):
             self.noProxyButton.setChecked(True)
         elif Preferences.getUI("UseSystemProxy"):
             self.systemProxyButton.setChecked(True)
         else:
             self.manualProxyButton.setChecked(True)
-        
+
         self.exceptionsEdit.setText(
-            ", ".join(Preferences.getUI("ProxyExceptions").split(",")))
-    
+            ", ".join(Preferences.getUI("ProxyExceptions").split(","))
+        )
+
     def setMode(self, displayMode):
         """
         Public method to perform mode dependent setups.
-        
+
         @param displayMode mode of the configuration dialog
             (ConfigurationMode.DEFAULTMODE,
              ConfigurationMode.WEBBROWSERMODE)
         """
         from ..ConfigurationDialog import ConfigurationMode
+
         if displayMode in (
             ConfigurationMode.DEFAULTMODE,
-            ConfigurationMode.WEBBROWSERMODE
+            ConfigurationMode.WEBBROWSERMODE,
         ):
             self.__displayMode = displayMode
             if not self.__configDlg.isUsingWebEngine():
                 self.cleanupGroup.hide()
                 self.displayGroup.hide()
             else:
-                policy = Preferences.getWebBrowser(
-                    "DownloadManagerRemovePolicy")
+                policy = Preferences.getWebBrowser("DownloadManagerRemovePolicy")
                 from WebBrowser.Download.DownloadManager import DownloadManager
+
                 if policy == DownloadManager.RemoveNever:
                     self.cleanupNeverButton.setChecked(True)
                 elif policy == DownloadManager.RemoveExit:
@@ -143,26 +134,25 @@
                 else:
                     self.cleanupSuccessfulButton.setChecked(True)
                 self.openOnStartCheckBox.setChecked(
-                    Preferences.getWebBrowser("DownloadManagerAutoOpen"))
+                    Preferences.getWebBrowser("DownloadManagerAutoOpen")
+                )
                 self.closeOnFinishedCheckBox.setChecked(
-                    Preferences.getWebBrowser("DownloadManagerAutoClose"))
+                    Preferences.getWebBrowser("DownloadManagerAutoClose")
+                )
                 self.__webEngine = True
-    
+
     def save(self):
         """
         Public slot to save the Networj configuration.
         """
-        Preferences.setUI(
-            "DynamicOnlineCheck",
-            self.dynamicOnlineCheckBox.isChecked())
+        Preferences.setUI("DynamicOnlineCheck", self.dynamicOnlineCheckBox.isChecked())
+        Preferences.setUI("DownloadPath", self.downloadDirPicker.text())
         Preferences.setUI(
-            "DownloadPath",
-            self.downloadDirPicker.text())
-        Preferences.setUI(
-            "RequestDownloadFilename",
-            self.requestFilenameCheckBox.isChecked())
+            "RequestDownloadFilename", self.requestFilenameCheckBox.isChecked()
+        )
         if self.__webEngine:
             from WebBrowser.Download.DownloadManager import DownloadManager
+
             if self.cleanupNeverButton.isChecked():
                 policy = DownloadManager.RemoveNever
             elif self.cleanupExitButton.isChecked():
@@ -171,63 +161,41 @@
                 policy = DownloadManager.RemoveSuccessFullDownload
             Preferences.setWebBrowser("DownloadManagerRemovePolicy", policy)
             Preferences.setWebBrowser(
-                "DownloadManagerAutoOpen",
-                self.openOnStartCheckBox.isChecked())
+                "DownloadManagerAutoOpen", self.openOnStartCheckBox.isChecked()
+            )
             Preferences.setWebBrowser(
-                "DownloadManagerAutoClose",
-                self.closeOnFinishedCheckBox.isChecked())
-        
+                "DownloadManagerAutoClose", self.closeOnFinishedCheckBox.isChecked()
+            )
+
+        Preferences.setUI("UseProxy", not self.noProxyButton.isChecked())
+        Preferences.setUI("UseSystemProxy", self.systemProxyButton.isChecked())
         Preferences.setUI(
-            "UseProxy",
-            not self.noProxyButton.isChecked())
-        Preferences.setUI(
-            "UseSystemProxy",
-            self.systemProxyButton.isChecked())
-        Preferences.setUI(
-            "UseHttpProxyForAll",
-            self.httpProxyForAllCheckBox.isChecked())
-        
+            "UseHttpProxyForAll", self.httpProxyForAllCheckBox.isChecked()
+        )
+
         Preferences.setUI(
             "ProxyExceptions",
-            ",".join(
-                [h.strip() for h in self.exceptionsEdit.text().split(",")]))
-        
+            ",".join([h.strip() for h in self.exceptionsEdit.text().split(",")]),
+        )
+
         # HTTP proxy
-        Preferences.setUI(
-            "ProxyHost/Http",
-            self.httpProxyHostEdit.text())
-        Preferences.setUI(
-            "ProxyPort/Http",
-            self.httpProxyPortSpin.value())
-        
+        Preferences.setUI("ProxyHost/Http", self.httpProxyHostEdit.text())
+        Preferences.setUI("ProxyPort/Http", self.httpProxyPortSpin.value())
+
         # HTTPS proxy
-        Preferences.setUI(
-            "ProxyHost/Https",
-            self.httpsProxyHostEdit.text())
-        Preferences.setUI(
-            "ProxyPort/Https",
-            self.httpsProxyPortSpin.value())
-        
+        Preferences.setUI("ProxyHost/Https", self.httpsProxyHostEdit.text())
+        Preferences.setUI("ProxyPort/Https", self.httpsProxyPortSpin.value())
+
         # FTP proxy
-        Preferences.setUI(
-            "ProxyHost/Ftp",
-            self.ftpProxyHostEdit.text())
-        Preferences.setUI(
-            "ProxyPort/Ftp",
-            self.ftpProxyPortSpin.value())
-        Preferences.setUI(
-            "ProxyType/Ftp",
-            EricFtpProxyType(self.ftpProxyTypeCombo.currentData()))
+        Preferences.setUI("ProxyHost/Ftp", self.ftpProxyHostEdit.text())
+        Preferences.setUI("ProxyPort/Ftp", self.ftpProxyPortSpin.value())
         Preferences.setUI(
-            "ProxyUser/Ftp",
-            self.ftpProxyUserEdit.text())
-        Preferences.setUI(
-            "ProxyPassword/Ftp",
-            self.ftpProxyPasswordEdit.text())
-        Preferences.setUI(
-            "ProxyAccount/Ftp",
-            self.ftpProxyAccountEdit.text())
-    
+            "ProxyType/Ftp", EricFtpProxyType(self.ftpProxyTypeCombo.currentData())
+        )
+        Preferences.setUI("ProxyUser/Ftp", self.ftpProxyUserEdit.text())
+        Preferences.setUI("ProxyPassword/Ftp", self.ftpProxyPasswordEdit.text())
+        Preferences.setUI("ProxyAccount/Ftp", self.ftpProxyAccountEdit.text())
+
     @pyqtSlot()
     def on_clearProxyPasswordsButton_clicked(self):
         """
@@ -235,34 +203,35 @@
         """
         Preferences.setUI("ProxyPassword/Http", "")
         Preferences.setUI("ProxyPassword/Https", "")
-    
+
     @pyqtSlot(int)
     def on_ftpProxyTypeCombo_currentIndexChanged(self, index):
         """
         Private slot handling the selection of a proxy type.
-        
+
         @param index index of the selected item (integer)
         """
         proxyType = EricFtpProxyType(self.ftpProxyTypeCombo.itemData(index))
-        self.ftpProxyHostEdit.setEnabled(
-            proxyType != EricFtpProxyType.NO_PROXY)
-        self.ftpProxyPortSpin.setEnabled(
-            proxyType != EricFtpProxyType.NO_PROXY)
+        self.ftpProxyHostEdit.setEnabled(proxyType != EricFtpProxyType.NO_PROXY)
+        self.ftpProxyPortSpin.setEnabled(proxyType != EricFtpProxyType.NO_PROXY)
         self.ftpProxyUserEdit.setEnabled(
-            proxyType not in [EricFtpProxyType.NO_PROXY,
-                              EricFtpProxyType.NON_AUTHORIZING])
+            proxyType
+            not in [EricFtpProxyType.NO_PROXY, EricFtpProxyType.NON_AUTHORIZING]
+        )
         self.ftpProxyPasswordEdit.setEnabled(
-            proxyType not in [EricFtpProxyType.NO_PROXY,
-                              EricFtpProxyType.NON_AUTHORIZING])
+            proxyType
+            not in [EricFtpProxyType.NO_PROXY, EricFtpProxyType.NON_AUTHORIZING]
+        )
         self.ftpProxyAccountEdit.setEnabled(
-            proxyType not in [EricFtpProxyType.NO_PROXY,
-                              EricFtpProxyType.NON_AUTHORIZING])
-    
+            proxyType
+            not in [EricFtpProxyType.NO_PROXY, EricFtpProxyType.NON_AUTHORIZING]
+        )
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/NotificationsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/NotificationsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,6 +23,7 @@
     """
     Class implementing the Notifications configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -30,90 +31,100 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("NotificationsPage")
-        
+
         geom = QApplication.screens()[0].availableVirtualGeometry()
         self.xSpinBox.setMinimum(geom.x())
         self.xSpinBox.setMaximum(geom.width())
         self.ySpinBox.setMinimum(geom.y())
         self.ySpinBox.setMaximum(geom.height())
-        
-        self.warningIcon.setPixmap(
-            NotificationFrame.getIcon(NotificationTypes.WARNING))
+
+        self.warningIcon.setPixmap(NotificationFrame.getIcon(NotificationTypes.WARNING))
         self.criticalIcon.setPixmap(
-            NotificationFrame.getIcon(NotificationTypes.CRITICAL))
-        
+            NotificationFrame.getIcon(NotificationTypes.CRITICAL)
+        )
+
         self.__notification = None
         self.__firstTime = True
-        
+
         # set initial values
         self.timeoutSpinBox.setValue(Preferences.getUI("NotificationTimeout"))
         point = Preferences.getUI("NotificationPosition")
         self.xSpinBox.setValue(point.x())
         self.ySpinBox.setValue(point.y())
-        
+
         self.xSpinBox.valueChanged.connect(self.__moveNotification)
         self.ySpinBox.valueChanged.connect(self.__moveNotification)
-        
+
         self.__colors = {}
         self.__colors["NotificationWarningForeground"] = Preferences.getUI(
-            "NotificationWarningForeground")
+            "NotificationWarningForeground"
+        )
         self.__colors["NotificationWarningBackground"] = Preferences.getUI(
-            "NotificationWarningBackground")
+            "NotificationWarningBackground"
+        )
         self.__colors["NotificationCriticalForeground"] = Preferences.getUI(
-            "NotificationCriticalForeground")
+            "NotificationCriticalForeground"
+        )
         self.__colors["NotificationCriticalBackground"] = Preferences.getUI(
-            "NotificationCriticalBackground")
-        
+            "NotificationCriticalBackground"
+        )
+
         self.warningFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationWarningForeground"],
-                self.__colors["NotificationWarningBackground"]
+                self.__colors["NotificationWarningBackground"],
             )
         )
         self.criticalFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationCriticalForeground"],
-                self.__colors["NotificationCriticalBackground"]
+                self.__colors["NotificationCriticalBackground"],
             )
         )
-    
+
     def save(self):
         """
         Public slot to save the Notifications configuration.
         """
         Preferences.setUI("NotificationTimeout", self.timeoutSpinBox.value())
-        Preferences.setUI("NotificationPosition", QPoint(
-            self.xSpinBox.value(), self.ySpinBox.value()))
-        
+        Preferences.setUI(
+            "NotificationPosition", QPoint(self.xSpinBox.value(), self.ySpinBox.value())
+        )
+
         for key in self.__colors:
             Preferences.setUI(key, self.__colors[key])
-    
+
     @pyqtSlot(bool)
     def on_visualButton_clicked(self, checked):
         """
         Private slot to select the position visually.
-        
+
         @param checked state of the button (boolean)
         """
         if checked:
             from UI.NotificationWidget import NotificationWidget
-            self.__notification = NotificationWidget(
-                parent=self, setPosition=True)
+
+            self.__notification = NotificationWidget(parent=self, setPosition=True)
             self.__notification.showNotification(
                 NotificationFrame.getIcon(NotificationTypes.OTHER),
                 self.tr("Visual Selection"),
-                self.tr("Drag the notification window to"
-                        " the desired place and release the button."),
-                timeout=0
+                self.tr(
+                    "Drag the notification window to"
+                    " the desired place and release the button."
+                ),
+                timeout=0,
             )
             self.__notification.move(
-                QPoint(self.xSpinBox.value(), self.ySpinBox.value()))
+                QPoint(self.xSpinBox.value(), self.ySpinBox.value())
+            )
             if self.__firstTime:
                 # adjust the maximum values to the width of the notification
                 self.xSpinBox.setMaximum(
-                    self.xSpinBox.maximum() - self.__notification.width())
+                    self.xSpinBox.maximum() - self.__notification.width()
+                )
                 self.ySpinBox.setMaximum(
-                    self.ySpinBox.maximum() - self.__notification.height())
+                    self.ySpinBox.maximum() - self.__notification.height()
+                )
                 self.__firstTime = False
         else:
             # retrieve the position
@@ -122,54 +133,53 @@
             self.ySpinBox.setValue(point.y())
             self.__notification.close()
             self.__notification = None
-    
+
     @pyqtSlot()
     def __moveNotification(self):
         """
         Private slot to move the notification widget.
         """
         if self.visualButton.isChecked():
-            self.__notification.move(
-                self.xSpinBox.value(),
-                self.ySpinBox.value()
-            )
-    
+            self.__notification.move(self.xSpinBox.value(), self.ySpinBox.value())
+
     ##################################################################
     ## colors for warning notifications
     ##################################################################
-    
+
     @pyqtSlot()
     def on_warningFgButton_clicked(self):
         """
         Private slot to set the foreground color of the warning notifications.
         """
         color = QColorDialog.getColor(
-            QColor(self.__colors["NotificationWarningForeground"]))
+            QColor(self.__colors["NotificationWarningForeground"])
+        )
         if color.isValid():
             self.__colors["NotificationWarningForeground"] = color.name()
             self.warningFrame.setStyleSheet(
                 NotificationFrame.NotificationStyleSheetTemplate.format(
                     self.__colors["NotificationWarningForeground"],
-                    self.__colors["NotificationWarningBackground"]
+                    self.__colors["NotificationWarningBackground"],
                 )
             )
-    
+
     @pyqtSlot()
     def on_warningBgButton_clicked(self):
         """
         Private slot to set the background color of the warning notifications.
         """
         color = QColorDialog.getColor(
-            QColor(self.__colors["NotificationWarningBackground"]))
+            QColor(self.__colors["NotificationWarningBackground"])
+        )
         if color.isValid():
             self.__colors["NotificationWarningBackground"] = color.name()
             self.warningFrame.setStyleSheet(
                 NotificationFrame.NotificationStyleSheetTemplate.format(
                     self.__colors["NotificationWarningForeground"],
-                    self.__colors["NotificationWarningBackground"]
+                    self.__colors["NotificationWarningBackground"],
                 )
             )
-    
+
     @pyqtSlot()
     def on_warningResetButton_clicked(self):
         """
@@ -177,69 +187,75 @@
         current values.
         """
         self.__colors["NotificationWarningForeground"] = Preferences.getUI(
-            "NotificationWarningForeground")
+            "NotificationWarningForeground"
+        )
         self.__colors["NotificationWarningBackground"] = Preferences.getUI(
-            "NotificationWarningBackground")
+            "NotificationWarningBackground"
+        )
         self.warningFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationWarningForeground"],
-                self.__colors["NotificationWarningBackground"]
+                self.__colors["NotificationWarningBackground"],
             )
         )
-    
+
     @pyqtSlot()
     def on_warningDefaultButton_clicked(self):
         """
         Private slot to reset the colors for warning notifications to their
         default values.
         """
-        self.__colors["NotificationWarningForeground"] = (
-            Preferences.Prefs.uiDefaults["NotificationWarningForeground"])
-        self.__colors["NotificationWarningBackground"] = (
-            Preferences.Prefs.uiDefaults["NotificationWarningBackground"])
+        self.__colors["NotificationWarningForeground"] = Preferences.Prefs.uiDefaults[
+            "NotificationWarningForeground"
+        ]
+        self.__colors["NotificationWarningBackground"] = Preferences.Prefs.uiDefaults[
+            "NotificationWarningBackground"
+        ]
         self.warningFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationWarningForeground"],
-                self.__colors["NotificationWarningBackground"]
+                self.__colors["NotificationWarningBackground"],
             )
         )
-    
+
     ##################################################################
     ## colors for critical notifications
     ##################################################################
-    
+
     @pyqtSlot()
     def on_criticalFgButton_clicked(self):
         """
         Private slot to set the foreground color of the critical notifications.
         """
         color = QColorDialog.getColor(
-            QColor(self.__colors["NotificationCriticalForeground"]))
+            QColor(self.__colors["NotificationCriticalForeground"])
+        )
         if color.isValid():
             self.__colors["NotificationCriticalForeground"] = color.name()
             self.criticalFrame.setStyleSheet(
                 NotificationFrame.NotificationStyleSheetTemplate.format(
                     self.__colors["NotificationCriticalForeground"],
-                    self.__colors["NotificationCriticalBackground"]
+                    self.__colors["NotificationCriticalBackground"],
                 )
             )
-    
+
     @pyqtSlot()
     def on_criticalBgButton_clicked(self):
         """
         Private slot to set the background color of the critical notifications.
         """
         color = QColorDialog.getColor(
-            QColor(self.__colors["NotificationCriticalBackground"]))
+            QColor(self.__colors["NotificationCriticalBackground"])
+        )
         if color.isValid():
             self.__colors["NotificationCriticalBackground"] = color.name()
             self.criticalFrame.setStyleSheet(
                 NotificationFrame.NotificationStyleSheetTemplate.format(
                     self.__colors["NotificationCriticalForeground"],
-                    self.__colors["NotificationCriticalBackground"]
+                    self.__colors["NotificationCriticalBackground"],
                 )
             )
-    
+
     @pyqtSlot()
     def on_criticalResetButton_clicked(self):
         """
@@ -247,30 +263,34 @@
         current values.
         """
         self.__colors["NotificationCriticalForeground"] = Preferences.getUI(
-            "NotificationCriticalForeground")
+            "NotificationCriticalForeground"
+        )
         self.__colors["NotificationCriticalBackground"] = Preferences.getUI(
-            "NotificationCriticalBackground")
+            "NotificationCriticalBackground"
+        )
         self.criticalFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationCriticalForeground"],
-                self.__colors["NotificationCriticalBackground"]
+                self.__colors["NotificationCriticalBackground"],
             )
         )
-    
+
     @pyqtSlot()
     def on_criticalDefaultButton_clicked(self):
         """
         Private slot to reset the colors for critical notifications to their
         default values.
         """
-        self.__colors["NotificationCriticalForeground"] = (
-            Preferences.Prefs.uiDefaults["NotificationCriticalForeground"])
-        self.__colors["NotificationCriticalBackground"] = (
-            Preferences.Prefs.uiDefaults["NotificationCriticalBackground"])
+        self.__colors["NotificationCriticalForeground"] = Preferences.Prefs.uiDefaults[
+            "NotificationCriticalForeground"
+        ]
+        self.__colors["NotificationCriticalBackground"] = Preferences.Prefs.uiDefaults[
+            "NotificationCriticalBackground"
+        ]
         self.criticalFrame.setStyleSheet(
             NotificationFrame.NotificationStyleSheetTemplate.format(
                 self.__colors["NotificationCriticalForeground"],
-                self.__colors["NotificationCriticalBackground"]
+                self.__colors["NotificationCriticalBackground"],
             )
         )
 
@@ -278,7 +298,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/PipPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/PipPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the pip configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,60 +27,59 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("PipPage")
-        
-        self.indexLabel.setText(self.tr(
-            '<b>Note:</b> Leave empty to use the default index URL ('
-            '<a href="{0}">{0}</a>).'
-        ).format(Pip.DefaultPyPiUrl))
-        self.safetyDbMirrorLabel.setText(self.tr(
-            '<b>Note:</b> Leave empty to use the default Safety DB URL ({0}).'
-        ).format(Preferences.Prefs.pipDefaults["VulnerabilityDbMirror"]))
-        
+
+        self.indexLabel.setText(
+            self.tr(
+                "<b>Note:</b> Leave empty to use the default index URL ("
+                '<a href="{0}">{0}</a>).'
+            ).format(Pip.DefaultPyPiUrl)
+        )
+        self.safetyDbMirrorLabel.setText(
+            self.tr(
+                "<b>Note:</b> Leave empty to use the default Safety DB URL ({0})."
+            ).format(Preferences.Prefs.pipDefaults["VulnerabilityDbMirror"])
+        )
+
         # set initial values
         self.indexEdit.setText(Preferences.getPip("PipSearchIndex"))
-        
+
         safetyDbUrl = Preferences.getPip("VulnerabilityDbMirror")
-        if (
-            safetyDbUrl ==
-            Preferences.Prefs.pipDefaults["VulnerabilityDbMirror"]
-        ):
+        if safetyDbUrl == Preferences.Prefs.pipDefaults["VulnerabilityDbMirror"]:
             safetyDbUrl = ""
         self.safetyDbMirrorEdit.setText(safetyDbUrl)
         self.validitySpinBox.setValue(
-            Preferences.getPip("VulnerabilityDbCacheValidity") // 3600)
+            Preferences.getPip("VulnerabilityDbCacheValidity") // 3600
+        )
         # seconds converted to hours
-        
-        self.noCondaCheckBox.setChecked(
-            Preferences.getPip("ExcludeCondaEnvironments"))
-    
+
+        self.noCondaCheckBox.setChecked(Preferences.getPip("ExcludeCondaEnvironments"))
+
     def save(self):
         """
         Public slot to save the pip configuration.
         """
         safetyDbUrl = self.safetyDbMirrorEdit.text().strip()
         if not safetyDbUrl:
-            safetyDbUrl = Preferences.Prefs.pipDefaults[
-                "VulnerabilityDbMirror"]
+            safetyDbUrl = Preferences.Prefs.pipDefaults["VulnerabilityDbMirror"]
         safetyDbUrl = safetyDbUrl.replace("\\", "/")
         if not safetyDbUrl.endswith("/"):
             safetyDbUrl += "/"
-        
-        Preferences.setPip("PipSearchIndex",
-                           self.indexEdit.text().strip())
-        
+
+        Preferences.setPip("PipSearchIndex", self.indexEdit.text().strip())
+
         Preferences.setPip("VulnerabilityDbMirror", safetyDbUrl)
-        Preferences.setPip("VulnerabilityDbCacheValidity",
-                           self.validitySpinBox.value() * 3600)
+        Preferences.setPip(
+            "VulnerabilityDbCacheValidity", self.validitySpinBox.value() * 3600
+        )
         # hours converted to seconds
-        
-        Preferences.setPip("ExcludeCondaEnvironments",
-                           self.noCondaCheckBox.isChecked())
+
+        Preferences.setPip("ExcludeCondaEnvironments", self.noCondaCheckBox.isChecked())
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/PluginManagerPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/PluginManagerPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class implementing the Plugin Manager configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,21 +29,22 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("PluginManagerPage")
-        
+
         self.downloadDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         # set initial values
         self.activateExternalPluginsCheckBox.setChecked(
-            Preferences.getPluginManager("ActivateExternal"))
-        self.downloadDirPicker.setText(
-            Preferences.getPluginManager("DownloadPath"))
+            Preferences.getPluginManager("ActivateExternal")
+        )
+        self.downloadDirPicker.setText(Preferences.getPluginManager("DownloadPath"))
         self.generationsSpinBox.setValue(
-            Preferences.getPluginManager("KeepGenerations"))
-        self.keepHiddenCheckBox.setChecked(
-            Preferences.getPluginManager("KeepHidden"))
+            Preferences.getPluginManager("KeepGenerations")
+        )
+        self.keepHiddenCheckBox.setChecked(Preferences.getPluginManager("KeepHidden"))
         self.startupCleanupCheckBox.setChecked(
-            Preferences.getPluginManager("StartupCleanup"))
-        
+            Preferences.getPluginManager("StartupCleanup")
+        )
+
         period = Preferences.getPluginManager("UpdatesCheckInterval")
         if period == 0:
             self.noCheckRadioButton.setChecked(True)
@@ -57,36 +59,32 @@
         else:
             # invalid value, default to daily
             self.dailyCheckRadioButton.setChecked(True)
-        
+
         self.downloadedOnlyCheckBox.setChecked(
-            Preferences.getPluginManager("CheckInstalledOnly"))
-        
+            Preferences.getPluginManager("CheckInstalledOnly")
+        )
+
         self.__repositoryUrl = Preferences.getUI("PluginRepositoryUrl7")
         self.repositoryUrlEdit.setText(self.__repositoryUrl)
-        
+
         self.autoInstallCheckBox.setChecked(
-            Preferences.getPluginManager("AutoInstallDependencies"))
-    
+            Preferences.getPluginManager("AutoInstallDependencies")
+        )
+
     def save(self):
         """
         Public slot to save the Viewmanager configuration.
         """
         Preferences.setPluginManager(
-            "ActivateExternal",
-            self.activateExternalPluginsCheckBox.isChecked())
-        Preferences.setPluginManager(
-            "DownloadPath",
-            self.downloadDirPicker.text())
+            "ActivateExternal", self.activateExternalPluginsCheckBox.isChecked()
+        )
+        Preferences.setPluginManager("DownloadPath", self.downloadDirPicker.text())
+        Preferences.setPluginManager("KeepGenerations", self.generationsSpinBox.value())
+        Preferences.setPluginManager("KeepHidden", self.keepHiddenCheckBox.isChecked())
         Preferences.setPluginManager(
-            "KeepGenerations",
-            self.generationsSpinBox.value())
-        Preferences.setPluginManager(
-            "KeepHidden",
-            self.keepHiddenCheckBox.isChecked())
-        Preferences.setPluginManager(
-            "StartupCleanup",
-            self.startupCleanupCheckBox.isChecked())
-        
+            "StartupCleanup", self.startupCleanupCheckBox.isChecked()
+        )
+
         if self.noCheckRadioButton.isChecked():
             period = 0
         elif self.dailyCheckRadioButton.isChecked():
@@ -98,34 +96,33 @@
         elif self.alwaysCheckRadioButton.isChecked():
             period = 4
         Preferences.setPluginManager("UpdatesCheckInterval", period)
-        
+
         Preferences.setPluginManager(
-            "CheckInstalledOnly",
-            self.downloadedOnlyCheckBox.isChecked())
-        
+            "CheckInstalledOnly", self.downloadedOnlyCheckBox.isChecked()
+        )
+
         if self.repositoryUrlEdit.text() != self.__repositoryUrl:
-            Preferences.setUI(
-                "PluginRepositoryUrl7", self.repositoryUrlEdit.text())
-        
+            Preferences.setUI("PluginRepositoryUrl7", self.repositoryUrlEdit.text())
+
         Preferences.setPluginManager(
-            "AutoInstallDependencies",
-            self.autoInstallCheckBox.isChecked())
-    
+            "AutoInstallDependencies", self.autoInstallCheckBox.isChecked()
+        )
+
     @pyqtSlot(bool)
     def on_repositoryUrlEditButton_toggled(self, checked):
         """
         Private slot to set the read only status of the repository URL line
         edit.
-        
+
         @param checked state of the push button (boolean)
         """
         self.repositoryUrlEdit.setReadOnly(not checked)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/PrinterPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/PrinterPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the Printer configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,10 +27,9 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("PrinterPage")
-        
+
         # set initial values
-        self.printerNameEdit.setText(
-            Preferences.getPrinter("PrinterName"))
+        self.printerNameEdit.setText(Preferences.getPrinter("PrinterName"))
         if Preferences.getPrinter("ColorMode"):
             self.printerColorButton.setChecked(True)
         else:
@@ -38,28 +38,20 @@
             self.printFirstPageFirstButton.setChecked(True)
         else:
             self.printFirstPageLastButton.setChecked(True)
-        self.printMagnificationSpinBox.setValue(
-            Preferences.getPrinter("Magnification"))
+        self.printMagnificationSpinBox.setValue(Preferences.getPrinter("Magnification"))
         self.printheaderFont = Preferences.getPrinter("HeaderFont")
         self.printheaderFontSample.setFont(self.printheaderFont)
-        self.leftMarginSpinBox.setValue(
-            Preferences.getPrinter("LeftMargin"))
-        self.rightMarginSpinBox.setValue(
-            Preferences.getPrinter("RightMargin"))
-        self.topMarginSpinBox.setValue(
-            Preferences.getPrinter("TopMargin"))
-        self.bottomMarginSpinBox.setValue(
-            Preferences.getPrinter("BottomMargin"))
-        self.resolutionSpinBox.setValue(
-            Preferences.getPrinter("Resolution"))
-        
+        self.leftMarginSpinBox.setValue(Preferences.getPrinter("LeftMargin"))
+        self.rightMarginSpinBox.setValue(Preferences.getPrinter("RightMargin"))
+        self.topMarginSpinBox.setValue(Preferences.getPrinter("TopMargin"))
+        self.bottomMarginSpinBox.setValue(Preferences.getPrinter("BottomMargin"))
+        self.resolutionSpinBox.setValue(Preferences.getPrinter("Resolution"))
+
     def save(self):
         """
         Public slot to save the Printer configuration.
         """
-        Preferences.setPrinter(
-            "PrinterName",
-            self.printerNameEdit.text())
+        Preferences.setPrinter("PrinterName", self.printerNameEdit.text())
         if self.printerColorButton.isChecked():
             Preferences.setPrinter("ColorMode", 1)
         else:
@@ -68,45 +60,34 @@
             Preferences.setPrinter("FirstPageFirst", 1)
         else:
             Preferences.setPrinter("FirstPageFirst", 0)
-        Preferences.setPrinter(
-            "Magnification",
-            self.printMagnificationSpinBox.value())
+        Preferences.setPrinter("Magnification", self.printMagnificationSpinBox.value())
         Preferences.setPrinter("HeaderFont", self.printheaderFont)
-        Preferences.setPrinter(
-            "LeftMargin",
-            self.leftMarginSpinBox.value())
-        Preferences.setPrinter(
-            "RightMargin",
-            self.rightMarginSpinBox.value())
-        Preferences.setPrinter(
-            "TopMargin",
-            self.topMarginSpinBox.value())
-        Preferences.setPrinter(
-            "BottomMargin",
-            self.bottomMarginSpinBox.value())
-        Preferences.setPrinter(
-            "Resolution",
-            self.resolutionSpinBox.value())
-        
+        Preferences.setPrinter("LeftMargin", self.leftMarginSpinBox.value())
+        Preferences.setPrinter("RightMargin", self.rightMarginSpinBox.value())
+        Preferences.setPrinter("TopMargin", self.topMarginSpinBox.value())
+        Preferences.setPrinter("BottomMargin", self.bottomMarginSpinBox.value())
+        Preferences.setPrinter("Resolution", self.resolutionSpinBox.value())
+
     @pyqtSlot()
     def on_printheaderFontButton_clicked(self):
         """
         Private method used to select the font for the page header.
         """
-        self.printheaderFont = self.selectFont(self.printheaderFontSample,
-                                               self.printheaderFont)
-        
+        self.printheaderFont = self.selectFont(
+            self.printheaderFontSample, self.printheaderFont
+        )
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
         """
         self.printheaderFontSample.setFont(self.printheaderFont)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ProjectBrowserPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class implementing the Project Browser configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,87 +29,92 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ProjectBrowserPage")
-        
+
         self.__currentProjectTypeIndex = 0
-        
+
         # set initial values
-        self.projectTypeCombo.addItem('', '')
-        self.__projectBrowserFlags = {'': 0}
+        self.projectTypeCombo.addItem("", "")
+        self.__projectBrowserFlags = {"": 0}
         try:
             projectTypes = ericApp().getObject("Project").getProjectTypes()
             for projectType in sorted(projectTypes.keys()):
-                self.projectTypeCombo.addItem(projectTypes[projectType],
-                                              projectType)
-                self.__projectBrowserFlags[projectType] = (
-                    Preferences.getProjectBrowserFlags(projectType)
-                )
+                self.projectTypeCombo.addItem(projectTypes[projectType], projectType)
+                self.__projectBrowserFlags[
+                    projectType
+                ] = Preferences.getProjectBrowserFlags(projectType)
         except KeyError:
             self.pbGroup.setEnabled(False)
-        
+
         self.initColour(
-            "Highlighted", self.pbHighlightedButton,
-            Preferences.getProjectBrowserColour)
-        
-        self.followEditorCheckBox.setChecked(
-            Preferences.getProject("FollowEditor"))
+            "Highlighted", self.pbHighlightedButton, Preferences.getProjectBrowserColour
+        )
+
+        self.followEditorCheckBox.setChecked(Preferences.getProject("FollowEditor"))
         self.followCursorLineCheckBox.setChecked(
-            Preferences.getProject("FollowCursorLine"))
+            Preferences.getProject("FollowCursorLine")
+        )
         self.autoPopulateCheckBox.setChecked(
-            Preferences.getProject("AutoPopulateItems"))
+            Preferences.getProject("AutoPopulateItems")
+        )
         self.hideGeneratedCheckBox.setChecked(
-            Preferences.getProject("HideGeneratedForms"))
+            Preferences.getProject("HideGeneratedForms")
+        )
         self.showHiddenCheckBox.setChecked(
-            Preferences.getProject("BrowsersListHiddenFiles"))
-        
+            Preferences.getProject("BrowsersListHiddenFiles")
+        )
+
     def save(self):
         """
         Public slot to save the Project Browser configuration.
         """
         self.saveColours(Preferences.setProjectBrowserColour)
-        
+
+        Preferences.setProject("FollowEditor", self.followEditorCheckBox.isChecked())
         Preferences.setProject(
-            "FollowEditor",
-            self.followEditorCheckBox.isChecked())
-        Preferences.setProject(
-            "FollowCursorLine",
-            self.followCursorLineCheckBox.isChecked())
+            "FollowCursorLine", self.followCursorLineCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoPopulateItems",
-            self.autoPopulateCheckBox.isChecked())
+            "AutoPopulateItems", self.autoPopulateCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "HideGeneratedForms",
-            self.hideGeneratedCheckBox.isChecked())
+            "HideGeneratedForms", self.hideGeneratedCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "BrowsersListHiddenFiles",
-            self.showHiddenCheckBox.isChecked())
-        
+            "BrowsersListHiddenFiles", self.showHiddenCheckBox.isChecked()
+        )
+
         if self.pbGroup.isEnabled():
             self.__storeProjectBrowserFlags(
-                self.projectTypeCombo.itemData(self.__currentProjectTypeIndex))
+                self.projectTypeCombo.itemData(self.__currentProjectTypeIndex)
+            )
             for projectType, flags in list(self.__projectBrowserFlags.items()):
-                if projectType != '':
+                if projectType != "":
                     Preferences.setProjectBrowserFlags(projectType, flags)
-        
+
     def __storeProjectBrowserFlags(self, projectType):
         """
         Private method to store the flags for the selected project type.
-        
+
         @param projectType type of the selected project (string)
         """
         from Project.ProjectBrowserFlags import (
-            SourcesBrowserFlag, FormsBrowserFlag, ResourcesBrowserFlag,
-            TranslationsBrowserFlag, InterfacesBrowserFlag, OthersBrowserFlag,
-            ProtocolsBrowserFlag
+            SourcesBrowserFlag,
+            FormsBrowserFlag,
+            ResourcesBrowserFlag,
+            TranslationsBrowserFlag,
+            InterfacesBrowserFlag,
+            OthersBrowserFlag,
+            ProtocolsBrowserFlag,
         )
-        
+
         flags = 0
         if self.sourcesBrowserCheckBox.isChecked():
             flags |= SourcesBrowserFlag
         if self.formsBrowserCheckBox.isChecked():
             flags |= FormsBrowserFlag
-        if (
-            self.resourcesBrowserCheckBox.isChecked() and
-            projectType not in ("PyQt6", "PyQt6C")
+        if self.resourcesBrowserCheckBox.isChecked() and projectType not in (
+            "PyQt6",
+            "PyQt6C",
         ):
             flags |= ResourcesBrowserFlag
         if self.translationsBrowserCheckBox.isChecked():
@@ -119,82 +125,84 @@
             flags |= OthersBrowserFlag
         if self.protocolsBrowserCheckBox.isChecked():
             flags |= ProtocolsBrowserFlag
-        
+
         self.__projectBrowserFlags[projectType] = flags
-    
+
     def __setProjectBrowsersCheckBoxes(self, projectType):
         """
         Private method to set the checkboxes according to the selected project
         type.
-        
+
         @param projectType type of the selected project (string)
         """
         from Project.ProjectBrowserFlags import (
-            SourcesBrowserFlag, FormsBrowserFlag, ResourcesBrowserFlag,
-            TranslationsBrowserFlag, InterfacesBrowserFlag, OthersBrowserFlag,
-            ProtocolsBrowserFlag
+            SourcesBrowserFlag,
+            FormsBrowserFlag,
+            ResourcesBrowserFlag,
+            TranslationsBrowserFlag,
+            InterfacesBrowserFlag,
+            OthersBrowserFlag,
+            ProtocolsBrowserFlag,
         )
-        
+
         flags = self.__projectBrowserFlags[projectType]
-        
+
         self.sourcesBrowserCheckBox.setChecked(flags & SourcesBrowserFlag)
         self.formsBrowserCheckBox.setChecked(flags & FormsBrowserFlag)
         self.resourcesBrowserCheckBox.setEnabled(
-            projectType not in ("PyQt6", "PyQt6C", "E7Plugin"))
+            projectType not in ("PyQt6", "PyQt6C", "E7Plugin")
+        )
         if projectType in ("PyQt6", "PyQt6C", "E7Plugin"):
             self.resourcesBrowserCheckBox.setChecked(False)
         else:
-            self.resourcesBrowserCheckBox.setChecked(
-                flags & ResourcesBrowserFlag)
-        self.translationsBrowserCheckBox.setChecked(
-            flags & TranslationsBrowserFlag)
-        self.interfacesBrowserCheckBox.setChecked(
-            flags & InterfacesBrowserFlag)
+            self.resourcesBrowserCheckBox.setChecked(flags & ResourcesBrowserFlag)
+        self.translationsBrowserCheckBox.setChecked(flags & TranslationsBrowserFlag)
+        self.interfacesBrowserCheckBox.setChecked(flags & InterfacesBrowserFlag)
         self.othersBrowserCheckBox.setChecked(flags & OthersBrowserFlag)
         self.protocolsBrowserCheckBox.setChecked(flags & ProtocolsBrowserFlag)
-    
+
     @pyqtSlot(int)
     def on_projectTypeCombo_activated(self, index):
         """
         Private slot to set the browser checkboxes according to the selected
         project type.
-        
+
         @param index index of the selected project type (integer)
         """
         if self.__currentProjectTypeIndex == index:
             return
-        
+
         self.__storeProjectBrowserFlags(
-            self.projectTypeCombo.itemData(self.__currentProjectTypeIndex))
-        self.__setProjectBrowsersCheckBoxes(
-            self.projectTypeCombo.itemData(index))
+            self.projectTypeCombo.itemData(self.__currentProjectTypeIndex)
+        )
+        self.__setProjectBrowsersCheckBoxes(self.projectTypeCombo.itemData(index))
         self.__currentProjectTypeIndex = index
-    
+
     @pyqtSlot(bool)
     def on_followEditorCheckBox_toggled(self, checked):
         """
         Private slot to handle the change of the 'Follow Editor' checkbox.
-        
+
         @param checked flag indicating the state of the checkbox
         """
         if not checked:
             self.followCursorLineCheckBox.setChecked(False)
-    
+
     @pyqtSlot(bool)
     def on_followCursorLineCheckBox_toggled(self, checked):
         """
         Private slot to handle the change of the 'Follow Cursor Line' checkbox.
-        
+
         @param checked flag indicating the state of the checkbox
         """
         if checked:
             self.followEditorCheckBox.setChecked(True)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ProjectPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ProjectPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class implementing the Project configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -24,104 +25,118 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ProjectPage")
-        
+
         # set initial values
         self.projectSearchNewFilesRecursiveCheckBox.setChecked(
-            Preferences.getProject("SearchNewFilesRecursively"))
+            Preferences.getProject("SearchNewFilesRecursively")
+        )
         self.projectSearchNewFilesCheckBox.setChecked(
-            Preferences.getProject("SearchNewFiles"))
+            Preferences.getProject("SearchNewFiles")
+        )
         self.projectAutoIncludeNewFilesCheckBox.setChecked(
-            Preferences.getProject("AutoIncludeNewFiles"))
+            Preferences.getProject("AutoIncludeNewFiles")
+        )
         self.projectLoadSessionCheckBox.setChecked(
-            Preferences.getProject("AutoLoadSession"))
+            Preferences.getProject("AutoLoadSession")
+        )
         self.projectSaveSessionCheckBox.setChecked(
-            Preferences.getProject("AutoSaveSession"))
+            Preferences.getProject("AutoSaveSession")
+        )
         self.projectSessionAllBpCheckBox.setChecked(
-            Preferences.getProject("SessionAllBreakpoints"))
+            Preferences.getProject("SessionAllBreakpoints")
+        )
         self.projectLoadDebugPropertiesCheckBox.setChecked(
-            Preferences.getProject("AutoLoadDbgProperties"))
+            Preferences.getProject("AutoLoadDbgProperties")
+        )
         self.projectSaveDebugPropertiesCheckBox.setChecked(
-            Preferences.getProject("AutoSaveDbgProperties"))
+            Preferences.getProject("AutoSaveDbgProperties")
+        )
         self.projectAutoCompileFormsCheckBox.setChecked(
-            Preferences.getProject("AutoCompileForms"))
+            Preferences.getProject("AutoCompileForms")
+        )
         self.projectAutoCompileResourcesCheckBox.setChecked(
-            Preferences.getProject("AutoCompileResources"))
+            Preferences.getProject("AutoCompileResources")
+        )
         self.projectAutoMakeCheckBox.setChecked(
-            Preferences.getProject("AutoExecuteMake"))
+            Preferences.getProject("AutoExecuteMake")
+        )
         self.projectTimestampCheckBox.setChecked(
-            Preferences.getProject("TimestampFile"))
-        self.projectRecentSpinBox.setValue(
-            Preferences.getProject("RecentNumber"))
+            Preferences.getProject("TimestampFile")
+        )
+        self.projectRecentSpinBox.setValue(Preferences.getProject("RecentNumber"))
         self.pythonVariantCheckBox.setChecked(
-            Preferences.getProject("DeterminePyFromProject"))
+            Preferences.getProject("DeterminePyFromProject")
+        )
         self.autosaveTasksCheckBox.setChecked(
-            Preferences.getProject("TasksProjectAutoSave"))
+            Preferences.getProject("TasksProjectAutoSave")
+        )
         self.rescanTasksCheckBox.setChecked(
-            Preferences.getProject("TasksProjectRescanOnOpen"))
+            Preferences.getProject("TasksProjectRescanOnOpen")
+        )
         self.restartShellCheckBox.setChecked(
-            Preferences.getProject("RestartShellForProject"))
-        
+            Preferences.getProject("RestartShellForProject")
+        )
+
     def save(self):
         """
         Public slot to save the Project configuration.
         """
         Preferences.setProject(
             "SearchNewFilesRecursively",
-            self.projectSearchNewFilesRecursiveCheckBox.isChecked())
+            self.projectSearchNewFilesRecursiveCheckBox.isChecked(),
+        )
         Preferences.setProject(
-            "SearchNewFiles",
-            self.projectSearchNewFilesCheckBox.isChecked())
+            "SearchNewFiles", self.projectSearchNewFilesCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoIncludeNewFiles",
-            self.projectAutoIncludeNewFilesCheckBox.isChecked())
+            "AutoIncludeNewFiles", self.projectAutoIncludeNewFilesCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoLoadSession",
-            self.projectLoadSessionCheckBox.isChecked())
+            "AutoLoadSession", self.projectLoadSessionCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoSaveSession",
-            self.projectSaveSessionCheckBox.isChecked())
+            "AutoSaveSession", self.projectSaveSessionCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "SessionAllBreakpoints",
-            self.projectSessionAllBpCheckBox.isChecked())
+            "SessionAllBreakpoints", self.projectSessionAllBpCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoLoadDbgProperties",
-            self.projectLoadDebugPropertiesCheckBox.isChecked())
+            "AutoLoadDbgProperties", self.projectLoadDebugPropertiesCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoSaveDbgProperties",
-            self.projectSaveDebugPropertiesCheckBox.isChecked())
+            "AutoSaveDbgProperties", self.projectSaveDebugPropertiesCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoCompileForms",
-            self.projectAutoCompileFormsCheckBox.isChecked())
-        Preferences.setProject(
-            "AutoCompileResources",
-            self.projectAutoCompileResourcesCheckBox.isChecked())
+            "AutoCompileForms", self.projectAutoCompileFormsCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "AutoExecuteMake",
-            self.projectAutoMakeCheckBox.isChecked())
+            "AutoCompileResources", self.projectAutoCompileResourcesCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "TimestampFile",
-            self.projectTimestampCheckBox.isChecked())
+            "AutoExecuteMake", self.projectAutoMakeCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "RecentNumber",
-            self.projectRecentSpinBox.value())
+            "TimestampFile", self.projectTimestampCheckBox.isChecked()
+        )
+        Preferences.setProject("RecentNumber", self.projectRecentSpinBox.value())
         Preferences.setProject(
-            "DeterminePyFromProject",
-            self.pythonVariantCheckBox.isChecked())
+            "DeterminePyFromProject", self.pythonVariantCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "TasksProjectAutoSave",
-            self.autosaveTasksCheckBox.isChecked())
+            "TasksProjectAutoSave", self.autosaveTasksCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "TasksProjectRescanOnOpen",
-            self.rescanTasksCheckBox.isChecked())
+            "TasksProjectRescanOnOpen", self.rescanTasksCheckBox.isChecked()
+        )
         Preferences.setProject(
-            "RestartShellForProject",
-            self.restartShellCheckBox.isChecked())
+            "RestartShellForProject", self.restartShellCheckBox.isChecked()
+        )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ProtobufPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ProtobufPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,6 +19,7 @@
     """
     Class implementing the protobuf configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -26,33 +27,38 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ProtobufPage")
-        
+
         self.protocPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.protocPicker.setToolTip(self.tr(
-            "Press to select the Protobuf compiler via a file selection"
-            " dialog."))
-        
+        self.protocPicker.setToolTip(
+            self.tr(
+                "Press to select the Protobuf compiler via a file selection" " dialog."
+            )
+        )
+
         self.grpcPythonPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.grpcPythonPicker.setToolTip(self.tr(
-            "Press to select the Python interpreter containing the gRPC"
-            " compiler via a file selection dialog."))
-        
+        self.grpcPythonPicker.setToolTip(
+            self.tr(
+                "Press to select the Python interpreter containing the gRPC"
+                " compiler via a file selection dialog."
+            )
+        )
+
         # set initial values
         self.protocPicker.setText(Preferences.getProtobuf("protoc"))
         self.grpcPythonPicker.setText(Preferences.getProtobuf("grpcPython"))
-        
+
     def save(self):
         """
         Public slot to save the protobuf configuration.
         """
         Preferences.setProtobuf("protoc", self.protocPicker.text())
         Preferences.setProtobuf("grpcPython", self.grpcPythonPicker.text())
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/PythonPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/PythonPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Python configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,42 +28,45 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("PythonPage")
-        
+
         self.stringEncodingComboBox.addItems(sorted(supportedCodecs))
         self.ioEncodingComboBox.addItems(sorted(supportedCodecs))
-        
+
         # set initial values
         index = self.stringEncodingComboBox.findText(
-            Preferences.getSystem("StringEncoding"))
+            Preferences.getSystem("StringEncoding")
+        )
         self.stringEncodingComboBox.setCurrentIndex(index)
-        index = self.ioEncodingComboBox.findText(
-            Preferences.getSystem("IOEncoding"))
+        index = self.ioEncodingComboBox.findText(Preferences.getSystem("IOEncoding"))
         self.ioEncodingComboBox.setCurrentIndex(index)
-        
+
         self.showCodeInfoDetailsCeckBox.setChecked(
-            Preferences.getPython("DisViewerExpandCodeInfoDetails"))
-        
+            Preferences.getPython("DisViewerExpandCodeInfoDetails")
+        )
+
         # these are the same as in the debugger pages
-        self.py3ExtensionsEdit.setText(
-            Preferences.getDebugger("Python3Extensions"))
-        
-        self.py3EnvironmentEdit.setText(
-            Preferences.getDebugger("Python3VirtualEnv"))
-        
+        self.py3ExtensionsEdit.setText(Preferences.getDebugger("Python3Extensions"))
+
+        self.py3EnvironmentEdit.setText(Preferences.getDebugger("Python3VirtualEnv"))
+
         # colours
-        self.initColour("ASTViewerErrorColor",
-                        self.astErrorItemButton,
-                        Preferences.getPython)
-        self.initColour("DisViewerErrorColor",
-                        self.disErrorItemButton,
-                        Preferences.getPython)
-        self.initColour("DisViewerCurrentColor",
-                        self.disCurrentInstructionButton,
-                        Preferences.getPython)
-        self.initColour("DisViewerLabeledColor",
-                        self.disLabeledInstructionButton,
-                        Preferences.getPython)
-    
+        self.initColour(
+            "ASTViewerErrorColor", self.astErrorItemButton, Preferences.getPython
+        )
+        self.initColour(
+            "DisViewerErrorColor", self.disErrorItemButton, Preferences.getPython
+        )
+        self.initColour(
+            "DisViewerCurrentColor",
+            self.disCurrentInstructionButton,
+            Preferences.getPython,
+        )
+        self.initColour(
+            "DisViewerLabeledColor",
+            self.disLabeledInstructionButton,
+            Preferences.getPython,
+        )
+
     def save(self):
         """
         Public slot to save the Python configuration.
@@ -71,36 +75,34 @@
         if not enc:
             enc = "utf-8"
         Preferences.setSystem("StringEncoding", enc)
-        
+
         enc = self.ioEncodingComboBox.currentText()
         if not enc:
             enc = "utf-8"
         Preferences.setSystem("IOEncoding", enc)
-        
-        Preferences.setDebugger(
-            "Python3Extensions",
-            self.py3ExtensionsEdit.text())
-        
+
+        Preferences.setDebugger("Python3Extensions", self.py3ExtensionsEdit.text())
+
         Preferences.setPython(
             "DisViewerExpandCodeInfoDetails",
-            self.showCodeInfoDetailsCeckBox.isChecked())
-        
+            self.showCodeInfoDetailsCeckBox.isChecked(),
+        )
+
         # colours
         self.saveColours(Preferences.setPython)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
         Private slot handling a click of the refresh button.
         """
-        self.py3EnvironmentEdit.setText(
-            Preferences.getDebugger("Python3VirtualEnv"))
-    
+        self.py3EnvironmentEdit.setText(Preferences.getDebugger("Python3VirtualEnv"))
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/QtPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/QtPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,6 +23,7 @@
     """
     Class implementing the Qt configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -30,31 +31,36 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("QtPage")
-        
+
         try:
             self.__virtualenvManager = ericApp().getObject("VirtualEnvManager")
             self.__standalone = False
         except KeyError:
             from VirtualEnv.VirtualenvManager import VirtualenvManager
+
             self.__virtualenvManager = VirtualenvManager()
             self.__standalone = True
-        
+
         for button in (
-            self.pyqt5VenvDlgButton, self.pyqt6VenvDlgButton,
-            self.pyside2VenvDlgButton, self.pyside6VenvDlgButton,
+            self.pyqt5VenvDlgButton,
+            self.pyqt6VenvDlgButton,
+            self.pyside2VenvDlgButton,
+            self.pyside6VenvDlgButton,
         ):
             button.setIcon(UI.PixmapCache.getIcon("virtualenv"))
             button.clicked.connect(self.__showVirtualEnvManager)
             button.setVisible(self.__standalone)
-        
+
         for button in (
-            self.pyqt5VenvRefreshButton, self.pyqt6VenvRefreshButton,
-            self.pyside2VenvRefreshButton, self.pyside6VenvRefreshButton,
+            self.pyqt5VenvRefreshButton,
+            self.pyqt6VenvRefreshButton,
+            self.pyside2VenvRefreshButton,
+            self.pyside6VenvRefreshButton,
         ):
             button.setIcon(UI.PixmapCache.getIcon("reload"))
             button.clicked.connect(self.__populateAndSetVenvComboBoxes)
             button.setVisible(not self.__standalone)
-        
+
         self.qtTransPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         for picker in (
             self.qtToolsDirPicker,
@@ -64,45 +70,41 @@
             self.pyside6ToolsDirPicker,
         ):
             picker.setMode(EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
-        
+
         self.__populateAndSetVenvComboBoxes(True)
-        
+
         # set initial values
-        self.qtTransPicker.setText(
-            Preferences.getQt("Qt6TranslationsDir"))
-        
+        self.qtTransPicker.setText(Preferences.getQt("Qt6TranslationsDir"))
+
         # Qt
         self.qtToolsDirPicker.setText(Preferences.getQt("QtToolsDir"))
         self.qtPrefixEdit.setText(Preferences.getQt("QtToolsPrefix"))
         self.qtPostfixEdit.setText(Preferences.getQt("QtToolsPostfix"))
         self.__updateQtSample()
-        
+
         # PyQt 5
         self.pyqtToolsDirPicker.setText(Preferences.getQt("PyQtToolsDir"))
         self.pyuicIndentSpinBox.setValue(Preferences.getQt("PyuicIndent"))
-        self.pyuicImportsCheckBox.setChecked(
-            Preferences.getQt("PyuicFromImports"))
-        self.pyuicExecuteCheckBox.setChecked(
-            Preferences.getQt("PyuicExecute"))
-        
+        self.pyuicImportsCheckBox.setChecked(Preferences.getQt("PyuicFromImports"))
+        self.pyuicExecuteCheckBox.setChecked(Preferences.getQt("PyuicExecute"))
+
         # PyQt 6
         self.pyqt6ToolsDirPicker.setText(Preferences.getQt("PyQt6ToolsDir"))
         self.pyuic6IndentSpinBox.setValue(Preferences.getQt("Pyuic6Indent"))
-        self.pyuic6ExecuteCheckBox.setChecked(
-            Preferences.getQt("Pyuic6Execute"))
-        
+        self.pyuic6ExecuteCheckBox.setChecked(Preferences.getQt("Pyuic6Execute"))
+
         # PySide 2
-        self.pyside2ToolsDirPicker.setText(
-            Preferences.getQt("PySide2ToolsDir"))
+        self.pyside2ToolsDirPicker.setText(Preferences.getQt("PySide2ToolsDir"))
         self.pyside2uicImportsCheckBox.setChecked(
-            Preferences.getQt("PySide2FromImports"))
-        
+            Preferences.getQt("PySide2FromImports")
+        )
+
         # PySide 6
-        self.pyside6ToolsDirPicker.setText(
-            Preferences.getQt("PySide6ToolsDir"))
+        self.pyside6ToolsDirPicker.setText(Preferences.getQt("PySide6ToolsDir"))
         self.pyside6uicImportsCheckBox.setChecked(
-            Preferences.getQt("PySide6FromImports"))
-    
+            Preferences.getQt("PySide6FromImports")
+        )
+
     def save(self):
         """
         Public slot to save the Qt configuration.
@@ -111,64 +113,62 @@
         Preferences.setQt("QtToolsDir", self.qtToolsDirPicker.text())
         Preferences.setQt("QtToolsPrefix", self.qtPrefixEdit.text())
         Preferences.setQt("QtToolsPostfix", self.qtPostfixEdit.text())
-        
+
         Preferences.setQt("PyQtVenvName", self.pyqt5VenvComboBox.currentText())
         Preferences.setQt("PyQtToolsDir", self.pyqtToolsDirPicker.text())
         Preferences.setQt("PyuicIndent", self.pyuicIndentSpinBox.value())
-        Preferences.setQt("PyuicFromImports",
-                          self.pyuicImportsCheckBox.isChecked())
-        Preferences.setQt("PyuicExecute",
-                          self.pyuicExecuteCheckBox.isChecked())
-        
-        Preferences.setQt("PyQt6VenvName",
-                          self.pyqt6VenvComboBox.currentText())
+        Preferences.setQt("PyuicFromImports", self.pyuicImportsCheckBox.isChecked())
+        Preferences.setQt("PyuicExecute", self.pyuicExecuteCheckBox.isChecked())
+
+        Preferences.setQt("PyQt6VenvName", self.pyqt6VenvComboBox.currentText())
         Preferences.setQt("PyQt6ToolsDir", self.pyqt6ToolsDirPicker.text())
         Preferences.setQt("Pyuic6Indent", self.pyuic6IndentSpinBox.value())
-        Preferences.setQt("Pyuic6Execute",
-                          self.pyuic6ExecuteCheckBox.isChecked())
-        
-        Preferences.setQt("PySide2VenvName",
-                          self.pyside2VenvComboBox.currentText())
+        Preferences.setQt("Pyuic6Execute", self.pyuic6ExecuteCheckBox.isChecked())
+
+        Preferences.setQt("PySide2VenvName", self.pyside2VenvComboBox.currentText())
         Preferences.setQt("PySide2ToolsDir", self.pyside2ToolsDirPicker.text())
-        Preferences.setQt("PySide2FromImports",
-                          self.pyside2uicImportsCheckBox.isChecked())
-        
-        Preferences.setQt("PySide6VenvName",
-                          self.pyside6VenvComboBox.currentText())
+        Preferences.setQt(
+            "PySide2FromImports", self.pyside2uicImportsCheckBox.isChecked()
+        )
+
+        Preferences.setQt("PySide6VenvName", self.pyside6VenvComboBox.currentText())
         Preferences.setQt("PySide6ToolsDir", self.pyside6ToolsDirPicker.text())
-        Preferences.setQt("PySide6FromImports",
-                          self.pyside6uicImportsCheckBox.isChecked())
-    
+        Preferences.setQt(
+            "PySide6FromImports", self.pyside6uicImportsCheckBox.isChecked()
+        )
+
     def __updateQtSample(self):
         """
         Private slot to update the Qt tools sample label.
         """
         self.qtSampleLabel.setText(
             self.tr("Sample: {0}designer{1}").format(
-                self.qtPrefixEdit.text(), self.qtPostfixEdit.text()))
-    
+                self.qtPrefixEdit.text(), self.qtPostfixEdit.text()
+            )
+        )
+
     @pyqtSlot(str)
     def on_qtPrefixEdit_textChanged(self, txt):
         """
         Private slot to handle a change in the entered Qt directory.
-        
+
         @param txt the entered string (string)
         """
         self.__updateQtSample()
-    
+
     @pyqtSlot(str)
     def on_qtPostfixEdit_textChanged(self, txt):
         """
         Private slot to handle a change in the entered Qt directory.
-        
+
         @param txt the entered string (string)
         """
         self.__updateQtSample()
-    
+
     def __populateAndSetVenvComboBox(self, comboBox, envKey, initial):
         """
         Private method to populate and set the virtual environment combo boxes.
-        
+
         @param comboBox reference to the combo box to be populated
         @type QComboBox
         @param envKey preferences key for the environment
@@ -176,37 +176,37 @@
         @param initial flag indicating an initial population
         @type bool
         """
-        venvName = (Preferences.getQt(envKey) if initial
-                    else comboBox.currentText())
-        
+        venvName = Preferences.getQt(envKey) if initial else comboBox.currentText()
+
         comboBox.clear()
-        comboBox.addItems(
-            [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNames())
-        )
-        
+        comboBox.addItems([""] + sorted(self.__virtualenvManager.getVirtualenvNames()))
+
         if venvName:
             index = comboBox.findText(venvName)
             if index < 0:
                 index = 0
             comboBox.setCurrentIndex(index)
-    
+
     def __populateAndSetVenvComboBoxes(self, initial):
         """
         Private method to populate the virtual environment combo boxes.
-        
+
         @param initial flag indicating an initial population
         @type bool
         """
         self.__populateAndSetVenvComboBox(
-            self.pyqt5VenvComboBox, "PyQtVenvName", initial)
+            self.pyqt5VenvComboBox, "PyQtVenvName", initial
+        )
         self.__populateAndSetVenvComboBox(
-            self.pyqt6VenvComboBox, "PyQt6VenvName", initial)
+            self.pyqt6VenvComboBox, "PyQt6VenvName", initial
+        )
         self.__populateAndSetVenvComboBox(
-            self.pyside2VenvComboBox, "PySide2VenvName", initial)
+            self.pyside2VenvComboBox, "PySide2VenvName", initial
+        )
         self.__populateAndSetVenvComboBox(
-            self.pyside6VenvComboBox, "PySide6VenvName", initial)
-    
+            self.pyside6VenvComboBox, "PySide6VenvName", initial
+        )
+
     def __showVirtualEnvManager(self):
         """
         Private method to show the virtual environment manager dialog.
@@ -220,7 +220,7 @@
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/SecurityPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/SecurityPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,88 +20,82 @@
     """
     Class implementing the Security configuration page.
     """
+
     def __init__(self, configDialog):
         """
         Constructor
-        
+
         @param configDialog reference to the configuration dialog
             (ConfigurationDialog)
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("SecurityPage")
-        
+
         self.__configDlg = configDialog
         self.__displayMode = None
-        
+
         # set initial values
-        self.savePasswordsCheckBox.setChecked(
-            Preferences.getUser("SavePasswords"))
-        self.masterPasswordCheckBox.setChecked(
-            Preferences.getUser("UseMasterPassword"))
-        self.masterPasswordButton.setEnabled(
-            Preferences.getUser("UseMasterPassword"))
-        
+        self.savePasswordsCheckBox.setChecked(Preferences.getUser("SavePasswords"))
+        self.masterPasswordCheckBox.setChecked(Preferences.getUser("UseMasterPassword"))
+        self.masterPasswordButton.setEnabled(Preferences.getUser("UseMasterPassword"))
+
         self.__newPassword = ""
         self.__oldUseMasterPassword = Preferences.getUser("UseMasterPassword")
-        
+
         self.alwaysRejectCheckBox.setChecked(
-            Preferences.getWebBrowser("AlwaysRejectFaultyCertificates"))
-    
+            Preferences.getWebBrowser("AlwaysRejectFaultyCertificates")
+        )
+
     def setMode(self, displayMode):
         """
         Public method to perform mode dependent setups.
-        
+
         @param displayMode mode of the configuration dialog
             (ConfigurationMode.DEFAULTMODE,
              ConfigurationMode.WEBBROWSERMODE)
         """
         from ..ConfigurationDialog import ConfigurationMode
+
         if displayMode in (
             ConfigurationMode.DEFAULTMODE,
-            ConfigurationMode.WEBBROWSERMODE
+            ConfigurationMode.WEBBROWSERMODE,
         ):
             self.__displayMode = displayMode
-            
+
             self.certificateErrorsGroup.setVisible(
                 displayMode == ConfigurationMode.WEBBROWSERMODE
             )
-    
+
     def save(self):
         """
         Public slot to save the Help Viewers configuration.
         """
-        Preferences.setUser(
-            "SavePasswords",
-            self.savePasswordsCheckBox.isChecked())
+        Preferences.setUser("SavePasswords", self.savePasswordsCheckBox.isChecked())
         Preferences.setUser(
-            "UseMasterPassword",
-            self.masterPasswordCheckBox.isChecked())
-        
-        if (
-            self.__oldUseMasterPassword !=
-            self.masterPasswordCheckBox.isChecked()
-        ):
+            "UseMasterPassword", self.masterPasswordCheckBox.isChecked()
+        )
+
+        if self.__oldUseMasterPassword != self.masterPasswordCheckBox.isChecked():
             self.__configDlg.masterPasswordChanged.emit("", self.__newPassword)
-        
+
         Preferences.setWebBrowser(
-            "AlwaysRejectFaultyCertificates",
-            self.alwaysRejectCheckBox.isChecked())
-    
+            "AlwaysRejectFaultyCertificates", self.alwaysRejectCheckBox.isChecked()
+        )
+
     @pyqtSlot(bool)
     def on_masterPasswordCheckBox_clicked(self, checked):
         """
         Private slot to handle the use of a master password.
-        
+
         @param checked flag indicating the state of the check box (boolean)
         """
         if checked:
             from .MasterPasswordEntryDialog import MasterPasswordEntryDialog
+
             dlg = MasterPasswordEntryDialog("", self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                Preferences.setUser(
-                    "MasterPassword",
-                    dlg.getMasterPassword())
+                Preferences.setUser("MasterPassword", dlg.getMasterPassword())
                 self.masterPasswordButton.setEnabled(True)
                 self.__newPassword = dlg.getMasterPassword()
             else:
@@ -109,36 +103,32 @@
         else:
             self.masterPasswordButton.setEnabled(False)
             self.__newPassword = ""
-    
+
     @pyqtSlot()
     def on_masterPasswordButton_clicked(self):
         """
         Private slot to change the master password.
         """
         from .MasterPasswordEntryDialog import MasterPasswordEntryDialog
-        dlg = MasterPasswordEntryDialog(
-            Preferences.getUser("MasterPassword"), self)
+
+        dlg = MasterPasswordEntryDialog(Preferences.getUser("MasterPassword"), self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            Preferences.setUser(
-                "MasterPassword",
-                dlg.getMasterPassword())
-            
-            if (
-                self.__oldUseMasterPassword !=
-                self.masterPasswordCheckBox.isChecked()
-            ):
+            Preferences.setUser("MasterPassword", dlg.getMasterPassword())
+
+            if self.__oldUseMasterPassword != self.masterPasswordCheckBox.isChecked():
                 # the user is about to change the use of a master password
                 # just save the changed password
                 self.__newPassword = dlg.getMasterPassword()
             else:
                 self.__configDlg.masterPasswordChanged.emit(
-                    dlg.getCurrentPassword(), dlg.getMasterPassword())
+                    dlg.getCurrentPassword(), dlg.getMasterPassword()
+                )
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ShellPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ShellPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,6 +22,7 @@
     """
     Class implementing the Shell configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -29,90 +30,79 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ShellPage")
-        
+
         self.shellHistoryStyleComboBox.addItem(
-            self.tr("Disabled"), ShellHistoryStyle.DISABLED.value)
-        self.shellHistoryStyleComboBox.addItem(
-            self.tr("Linux Style"), ShellHistoryStyle.LINUXSTYLE.value)
+            self.tr("Disabled"), ShellHistoryStyle.DISABLED.value
+        )
         self.shellHistoryStyleComboBox.addItem(
-            self.tr("Windows Style"), ShellHistoryStyle.WINDOWSSTYLE.value)
-        
+            self.tr("Linux Style"), ShellHistoryStyle.LINUXSTYLE.value
+        )
+        self.shellHistoryStyleComboBox.addItem(
+            self.tr("Windows Style"), ShellHistoryStyle.WINDOWSSTYLE.value
+        )
+
         # set initial values
-        self.shellLinenoCheckBox.setChecked(
-            Preferences.getShell("LinenoMargin"))
-        self.shellWordWrapCheckBox.setChecked(
-            Preferences.getShell("WrapEnabled"))
+        self.shellLinenoCheckBox.setChecked(Preferences.getShell("LinenoMargin"))
+        self.shellWordWrapCheckBox.setChecked(Preferences.getShell("WrapEnabled"))
         self.shellACEnabledCheckBox.setChecked(
-            Preferences.getShell("AutoCompletionEnabled"))
-        self.shellCTEnabledCheckBox.setChecked(
-            Preferences.getShell("CallTipsEnabled"))
+            Preferences.getShell("AutoCompletionEnabled")
+        )
+        self.shellCTEnabledCheckBox.setChecked(Preferences.getShell("CallTipsEnabled"))
         self.shellSyntaxHighlightingCheckBox.setChecked(
-            Preferences.getShell("SyntaxHighlightingEnabled"))
+            Preferences.getShell("SyntaxHighlightingEnabled")
+        )
         self.rememberCheckBox.setChecked(
-            Preferences.getShell("StartWithMostRecentlyUsedEnvironment"))
-        self.shellHistorySpinBox.setValue(
-            Preferences.getShell("MaxHistoryEntries"))
+            Preferences.getShell("StartWithMostRecentlyUsedEnvironment")
+        )
+        self.shellHistorySpinBox.setValue(Preferences.getShell("MaxHistoryEntries"))
         index = self.shellHistoryStyleComboBox.findData(
-            Preferences.getShell("HistoryStyle").value)
+            Preferences.getShell("HistoryStyle").value
+        )
         self.shellHistoryStyleComboBox.setCurrentIndex(index)
-        self.shellHistoryWrapCheckBox.setChecked(
-            Preferences.getShell("HistoryWrap"))
+        self.shellHistoryWrapCheckBox.setChecked(Preferences.getShell("HistoryWrap"))
         self.shellHistoryCursorKeysCheckBox.setChecked(
-            Preferences.getShell("HistoryNavigateByCursor"))
-        self.stdOutErrCheckBox.setChecked(
-            Preferences.getShell("ShowStdOutErr"))
-        
+            Preferences.getShell("HistoryNavigateByCursor")
+        )
+        self.stdOutErrCheckBox.setChecked(Preferences.getShell("ShowStdOutErr"))
+
         self.monospacedFont = Preferences.getShell("MonospacedFont")
         self.monospacedFontSample.setFont(self.monospacedFont)
-        self.monospacedCheckBox.setChecked(
-            Preferences.getShell("UseMonospacedFont"))
+        self.monospacedCheckBox.setChecked(Preferences.getShell("UseMonospacedFont"))
         self.marginsFont = Preferences.getShell("MarginsFont")
         self.marginsFontSample.setFont(self.marginsFont)
-        
+
     def save(self):
         """
         Public slot to save the Shell configuration.
         """
-        Preferences.setShell(
-            "LinenoMargin",
-            self.shellLinenoCheckBox.isChecked())
+        Preferences.setShell("LinenoMargin", self.shellLinenoCheckBox.isChecked())
+        Preferences.setShell("WrapEnabled", self.shellWordWrapCheckBox.isChecked())
         Preferences.setShell(
-            "WrapEnabled",
-            self.shellWordWrapCheckBox.isChecked())
-        Preferences.setShell(
-            "AutoCompletionEnabled",
-            self.shellACEnabledCheckBox.isChecked())
-        Preferences.setShell(
-            "CallTipsEnabled",
-            self.shellCTEnabledCheckBox.isChecked())
+            "AutoCompletionEnabled", self.shellACEnabledCheckBox.isChecked()
+        )
+        Preferences.setShell("CallTipsEnabled", self.shellCTEnabledCheckBox.isChecked())
         Preferences.setShell(
             "SyntaxHighlightingEnabled",
-            self.shellSyntaxHighlightingCheckBox.isChecked())
+            self.shellSyntaxHighlightingCheckBox.isChecked(),
+        )
         Preferences.setShell(
-            "StartWithMostRecentlyUsedEnvironment",
-            self.rememberCheckBox.isChecked())
-        Preferences.setShell(
-            "MaxHistoryEntries",
-            self.shellHistorySpinBox.value())
+            "StartWithMostRecentlyUsedEnvironment", self.rememberCheckBox.isChecked()
+        )
+        Preferences.setShell("MaxHistoryEntries", self.shellHistorySpinBox.value())
         Preferences.setShell(
             "HistoryStyle",
-            ShellHistoryStyle(self.shellHistoryStyleComboBox.currentData()))
-        Preferences.setShell(
-            "HistoryWrap",
-            self.shellHistoryWrapCheckBox.isChecked())
-        Preferences.setShell(
-            "HistoryNavigateByCursor",
-            self.shellHistoryCursorKeysCheckBox.isChecked())
+            ShellHistoryStyle(self.shellHistoryStyleComboBox.currentData()),
+        )
+        Preferences.setShell("HistoryWrap", self.shellHistoryWrapCheckBox.isChecked())
         Preferences.setShell(
-            "ShowStdOutErr",
-            self.stdOutErrCheckBox.isChecked())
-        
+            "HistoryNavigateByCursor", self.shellHistoryCursorKeysCheckBox.isChecked()
+        )
+        Preferences.setShell("ShowStdOutErr", self.stdOutErrCheckBox.isChecked())
+
         Preferences.setShell("MonospacedFont", self.monospacedFont)
-        Preferences.setShell(
-            "UseMonospacedFont",
-            self.monospacedCheckBox.isChecked())
+        Preferences.setShell("UseMonospacedFont", self.monospacedCheckBox.isChecked())
         Preferences.setShell("MarginsFont", self.marginsFont)
-        
+
     @pyqtSlot()
     def on_monospacedFontButton_clicked(self):
         """
@@ -120,30 +110,34 @@
         font.
         """
         self.monospacedFont = self.selectFont(
-            self.monospacedFontSample, self.monospacedFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-        
+            self.monospacedFontSample,
+            self.monospacedFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
     @pyqtSlot()
     def on_linenumbersFontButton_clicked(self):
         """
         Private method used to select the font for the editor margins.
         """
         self.marginsFont = self.selectFont(
-            self.marginsFontSample, self.marginsFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-        
+            self.marginsFontSample,
+            self.marginsFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
     def polishPage(self):
         """
         Public slot to perform some polishing actions.
         """
         self.monospacedFontSample.setFont(self.monospacedFont)
         self.marginsFontSample.setFont(self.marginsFont)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/TasksPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/TasksPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Tasks configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,99 +28,82 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("TasksPage")
-        
+
         self.colourChanged.connect(self.__colorChanged)
-        
+
         # set initial values
-        self.tasksMarkerFixmeEdit.setText(
-            Preferences.getTasks("TasksFixmeMarkers"))
-        self.tasksMarkerWarningEdit.setText(
-            Preferences.getTasks("TasksWarningMarkers"))
-        self.tasksMarkerTodoEdit.setText(
-            Preferences.getTasks("TasksTodoMarkers"))
-        self.tasksMarkerNoteEdit.setText(
-            Preferences.getTasks("TasksNoteMarkers"))
-        self.tasksMarkerTestEdit.setText(
-            Preferences.getTasks("TasksTestMarkers"))
-        self.tasksMarkerDocuEdit.setText(
-            Preferences.getTasks("TasksDocuMarkers"))
-        
+        self.tasksMarkerFixmeEdit.setText(Preferences.getTasks("TasksFixmeMarkers"))
+        self.tasksMarkerWarningEdit.setText(Preferences.getTasks("TasksWarningMarkers"))
+        self.tasksMarkerTodoEdit.setText(Preferences.getTasks("TasksTodoMarkers"))
+        self.tasksMarkerNoteEdit.setText(Preferences.getTasks("TasksNoteMarkers"))
+        self.tasksMarkerTestEdit.setText(Preferences.getTasks("TasksTestMarkers"))
+        self.tasksMarkerDocuEdit.setText(Preferences.getTasks("TasksDocuMarkers"))
+
+        self.initColour(
+            "TasksFixmeColor", self.tasksFixmeColourButton, Preferences.getTasks
+        )
         self.initColour(
-            "TasksFixmeColor", self.tasksFixmeColourButton,
-            Preferences.getTasks)
+            "TasksWarningColor", self.tasksWarningColourButton, Preferences.getTasks
+        )
         self.initColour(
-            "TasksWarningColor", self.tasksWarningColourButton,
-            Preferences.getTasks)
+            "TasksTodoColor", self.tasksTodoColourButton, Preferences.getTasks
+        )
         self.initColour(
-            "TasksTodoColor", self.tasksTodoColourButton,
-            Preferences.getTasks)
+            "TasksNoteColor", self.tasksNoteColourButton, Preferences.getTasks
+        )
         self.initColour(
-            "TasksNoteColor", self.tasksNoteColourButton,
-            Preferences.getTasks)
-        self.initColour(
-            "TasksTestColor", self.tasksTestColourButton,
-            Preferences.getTasks)
+            "TasksTestColor", self.tasksTestColourButton, Preferences.getTasks
+        )
         self.initColour(
-            "TasksDocuColor", self.tasksDocuColourButton,
-            Preferences.getTasks)
-        
+            "TasksDocuColor", self.tasksDocuColourButton, Preferences.getTasks
+        )
+
         self.clearCheckBox.setChecked(Preferences.getTasks("ClearOnFileClose"))
-        
+
     def save(self):
         """
         Public slot to save the Tasks configuration.
         """
-        Preferences.setTasks(
-            "TasksFixmeMarkers", self.tasksMarkerFixmeEdit.text())
-        Preferences.setTasks(
-            "TasksWarningMarkers", self.tasksMarkerWarningEdit.text())
-        Preferences.setTasks(
-            "TasksTodoMarkers", self.tasksMarkerTodoEdit.text())
-        Preferences.setTasks(
-            "TasksNoteMarkers", self.tasksMarkerNoteEdit.text())
-        Preferences.setTasks(
-            "TasksTestMarkers", self.tasksMarkerTestEdit.text())
-        Preferences.setTasks(
-            "TasksDocuMarkers", self.tasksMarkerDocuEdit.text())
-        Preferences.setTasks(
-            "ClearOnFileClose", self.clearCheckBox.isChecked())
-        
+        Preferences.setTasks("TasksFixmeMarkers", self.tasksMarkerFixmeEdit.text())
+        Preferences.setTasks("TasksWarningMarkers", self.tasksMarkerWarningEdit.text())
+        Preferences.setTasks("TasksTodoMarkers", self.tasksMarkerTodoEdit.text())
+        Preferences.setTasks("TasksNoteMarkers", self.tasksMarkerNoteEdit.text())
+        Preferences.setTasks("TasksTestMarkers", self.tasksMarkerTestEdit.text())
+        Preferences.setTasks("TasksDocuMarkers", self.tasksMarkerDocuEdit.text())
+        Preferences.setTasks("ClearOnFileClose", self.clearCheckBox.isChecked())
+
         self.saveColours(Preferences.setTasks)
-    
+
     @pyqtSlot(str, QColor)
     def __colorChanged(self, colorKey, color):
         """
         Private slot handling the selection of a color.
-        
+
         @param colorKey key of the color entry
         @type str
         @param color selected color
         @type QColor
         """
         if colorKey == "TasksFixmeColor":
-            self.tasksMarkerFixmeEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+            self.tasksMarkerFixmeEdit.setStyleSheet(f"background-color: {color.name()}")
         elif colorKey == "TasksWarningColor":
             self.tasksMarkerWarningEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+                f"background-color: {color.name()}"
+            )
         elif colorKey == "TasksTodoColor":
-            self.tasksMarkerTodoEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+            self.tasksMarkerTodoEdit.setStyleSheet(f"background-color: {color.name()}")
         elif colorKey == "TasksNoteColor":
-            self.tasksMarkerNoteEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+            self.tasksMarkerNoteEdit.setStyleSheet(f"background-color: {color.name()}")
         elif colorKey == "TasksTestColor":
-            self.tasksMarkerTestEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+            self.tasksMarkerTestEdit.setStyleSheet(f"background-color: {color.name()}")
         elif colorKey == "TasksDocuColor":
-            self.tasksMarkerDocuEdit.setStyleSheet(
-                f"background-color: {color.name()}")
+            self.tasksMarkerDocuEdit.setStyleSheet(f"background-color: {color.name()}")
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/TemplatesPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/TemplatesPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the Templates configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,53 +28,58 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("TemplatesPage")
-        
+
         # set initial values
         self.templatesAutoOpenGroupsCheckBox.setChecked(
-            Preferences.getTemplates("AutoOpenGroups"))
+            Preferences.getTemplates("AutoOpenGroups")
+        )
         self.templatesSeparatorCharEdit.setText(
-            Preferences.getTemplates("SeparatorChar"))
+            Preferences.getTemplates("SeparatorChar")
+        )
         if Preferences.getTemplates("SingleDialog"):
             self.templatesSingleDialogButton.setChecked(True)
         else:
             self.templatesMultiDialogButton.setChecked(True)
         self.templatesToolTipCheckBox.setChecked(
-            Preferences.getTemplates("ShowTooltip"))
+            Preferences.getTemplates("ShowTooltip")
+        )
         self.editorFont = Preferences.getTemplates("EditorFont")
         self.editorFontSample.setFont(self.editorFont)
-        
+
     def save(self):
         """
         Public slot to save the Templates configuration.
         """
         Preferences.setTemplates(
-            "AutoOpenGroups",
-            self.templatesAutoOpenGroupsCheckBox.isChecked())
+            "AutoOpenGroups", self.templatesAutoOpenGroupsCheckBox.isChecked()
+        )
         sepChar = self.templatesSeparatorCharEdit.text()
         if sepChar:
             Preferences.setTemplates("SeparatorChar", sepChar)
         Preferences.setTemplates(
-            "SingleDialog",
-            self.templatesSingleDialogButton.isChecked())
+            "SingleDialog", self.templatesSingleDialogButton.isChecked()
+        )
         Preferences.setTemplates(
-            "ShowTooltip",
-            self.templatesToolTipCheckBox.isChecked())
+            "ShowTooltip", self.templatesToolTipCheckBox.isChecked()
+        )
         Preferences.setTemplates("EditorFont", self.editorFont)
-    
+
     @pyqtSlot()
     def on_editorFontButton_clicked(self):
         """
         Private method used to select the font to be used by the code editor.
         """
         self.editorFont = self.selectFont(
-            self.editorFontSample, self.editorFont,
-            options=QFontDialog.FontDialogOption.MonospacedFonts)
-    
+            self.editorFontSample,
+            self.editorFont,
+            options=QFontDialog.FontDialogOption.MonospacedFonts,
+        )
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/TrayStarterPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/TrayStarterPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,6 +20,7 @@
     """
     Class implementing the tray starter configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,16 +28,14 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("TrayStarterPage")
-        
+
         self.standardButton.setIcon(UI.PixmapCache.getIcon("erict"))
         self.highContrastButton.setIcon(UI.PixmapCache.getIcon("erict-hc"))
         self.blackWhiteButton.setIcon(UI.PixmapCache.getIcon("erict-bw"))
-        self.blackWhiteInverseButton.setIcon(
-            UI.PixmapCache.getIcon("erict-bwi"))
-        
+        self.blackWhiteInverseButton.setIcon(UI.PixmapCache.getIcon("erict-bwi"))
+
         # set initial values
-        iconName = os.path.splitext(
-            Preferences.getTrayStarter("TrayStarterIcon"))[0]
+        iconName = os.path.splitext(Preferences.getTrayStarter("TrayStarterIcon"))[0]
         if iconName == "erict":
             self.standardButton.setChecked(True)
         elif iconName == "erict-hc":
@@ -45,7 +44,7 @@
             self.blackWhiteButton.setChecked(True)
         elif iconName == "erict-bwi":
             self.blackWhiteInverseButton.setChecked(True)
-    
+
     def save(self):
         """
         Public slot to save the Python configuration.
@@ -59,12 +58,12 @@
         elif self.blackWhiteInverseButton.isChecked():
             iconName = "erict-bwi"
         Preferences.setTrayStarter("TrayStarterIcon", iconName)
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/VcsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/VcsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
     """
     Class implementing the VCS configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -24,84 +25,74 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("VcsPage")
-        
+
         # set initial values
         self.vcsAutoCloseCheckBox.setChecked(Preferences.getVCS("AutoClose"))
-        self.vcsAutoSaveCheckBox.setChecked(
-            Preferences.getVCS("AutoSaveFiles"))
+        self.vcsAutoSaveCheckBox.setChecked(Preferences.getVCS("AutoSaveFiles"))
         self.vcsAutoSaveProjectCheckBox.setChecked(
-            Preferences.getVCS("AutoSaveProject"))
-        self.commitSpinBox.setValue(
-            Preferences.getVCS("CommitMessages"))
+            Preferences.getVCS("AutoSaveProject")
+        )
+        self.commitSpinBox.setValue(Preferences.getVCS("CommitMessages"))
         self.perProjectCommitHistoryCheckBox.setChecked(
-            Preferences.getVCS("PerProjectCommitHistory"))
+            Preferences.getVCS("PerProjectCommitHistory")
+        )
         self.vcsStatusMonitorIntervalSpinBox.setValue(
-            Preferences.getVCS("StatusMonitorInterval"))
+            Preferences.getVCS("StatusMonitorInterval")
+        )
         self.vcsMonitorLocalStatusCheckBox.setChecked(
-            Preferences.getVCS("MonitorLocalStatus"))
-        self.autoUpdateCheckBox.setChecked(
-            Preferences.getVCS("AutoUpdate"))
-        self.vcsToolbarCheckBox.setChecked(
-            Preferences.getVCS("ShowVcsToolbar"))
-        
+            Preferences.getVCS("MonitorLocalStatus")
+        )
+        self.autoUpdateCheckBox.setChecked(Preferences.getVCS("AutoUpdate"))
+        self.vcsToolbarCheckBox.setChecked(Preferences.getVCS("ShowVcsToolbar"))
+
         self.initColour(
-            "VcsAdded", self.pbVcsAddedButton,
-            Preferences.getProjectBrowserColour)
+            "VcsAdded", self.pbVcsAddedButton, Preferences.getProjectBrowserColour
+        )
         self.initColour(
-            "VcsConflict", self.pbVcsConflictButton,
-            Preferences.getProjectBrowserColour)
+            "VcsConflict", self.pbVcsConflictButton, Preferences.getProjectBrowserColour
+        )
         self.initColour(
-            "VcsModified", self.pbVcsModifiedButton,
-            Preferences.getProjectBrowserColour)
+            "VcsModified", self.pbVcsModifiedButton, Preferences.getProjectBrowserColour
+        )
         self.initColour(
-            "VcsReplaced", self.pbVcsReplacedButton,
-            Preferences.getProjectBrowserColour)
+            "VcsReplaced", self.pbVcsReplacedButton, Preferences.getProjectBrowserColour
+        )
         self.initColour(
-            "VcsUpdate", self.pbVcsUpdateButton,
-            Preferences.getProjectBrowserColour)
+            "VcsUpdate", self.pbVcsUpdateButton, Preferences.getProjectBrowserColour
+        )
         self.initColour(
-            "VcsRemoved", self.pbVcsRemovedButton,
-            Preferences.getProjectBrowserColour)
-    
+            "VcsRemoved", self.pbVcsRemovedButton, Preferences.getProjectBrowserColour
+        )
+
     def save(self):
         """
         Public slot to save the VCS configuration.
         """
-        Preferences.setVCS(
-            "AutoClose",
-            self.vcsAutoCloseCheckBox.isChecked())
+        Preferences.setVCS("AutoClose", self.vcsAutoCloseCheckBox.isChecked())
+        Preferences.setVCS("AutoSaveFiles", self.vcsAutoSaveCheckBox.isChecked())
         Preferences.setVCS(
-            "AutoSaveFiles",
-            self.vcsAutoSaveCheckBox.isChecked())
-        Preferences.setVCS(
-            "AutoSaveProject",
-            self.vcsAutoSaveProjectCheckBox.isChecked())
-        Preferences.setVCS(
-            "CommitMessages",
-            self.commitSpinBox.value())
+            "AutoSaveProject", self.vcsAutoSaveProjectCheckBox.isChecked()
+        )
+        Preferences.setVCS("CommitMessages", self.commitSpinBox.value())
         Preferences.setVCS(
-            "PerProjectCommitHistory",
-            self.perProjectCommitHistoryCheckBox.isChecked())
+            "PerProjectCommitHistory", self.perProjectCommitHistoryCheckBox.isChecked()
+        )
         Preferences.setVCS(
-            "StatusMonitorInterval",
-            self.vcsStatusMonitorIntervalSpinBox.value())
+            "StatusMonitorInterval", self.vcsStatusMonitorIntervalSpinBox.value()
+        )
         Preferences.setVCS(
-            "MonitorLocalStatus",
-            self.vcsMonitorLocalStatusCheckBox.isChecked())
-        Preferences.setVCS(
-            "AutoUpdate",
-            self.autoUpdateCheckBox.isChecked())
-        Preferences.setVCS(
-            "ShowVcsToolbar",
-            self.vcsToolbarCheckBox.isChecked())
-    
+            "MonitorLocalStatus", self.vcsMonitorLocalStatusCheckBox.isChecked()
+        )
+        Preferences.setVCS("AutoUpdate", self.autoUpdateCheckBox.isChecked())
+        Preferences.setVCS("ShowVcsToolbar", self.vcsToolbarCheckBox.isChecked())
+
         self.saveColours(Preferences.setProjectBrowserColour)
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/ViewmanagerPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/ViewmanagerPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class implementing the Viewmanager configuration page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -28,70 +29,64 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("ViewmanagerPage")
-        
+
         # set initial values
         self.pluginManager = ericApp().getObject("PluginManager")
-        self.viewmanagers = self.pluginManager.getPluginDisplayStrings(
-            "viewmanager")
+        self.viewmanagers = self.pluginManager.getPluginDisplayStrings("viewmanager")
         self.windowComboBox.clear()
         currentVm = Preferences.getViewManager()
-        
+
         keys = sorted(self.viewmanagers.keys())
         for key in keys:
-            self.windowComboBox.addItem(
-                self.tr(self.viewmanagers[key]), key)
+            self.windowComboBox.addItem(self.tr(self.viewmanagers[key]), key)
         currentIndex = self.windowComboBox.findText(
-            self.tr(self.viewmanagers[currentVm]))
+            self.tr(self.viewmanagers[currentVm])
+        )
         self.windowComboBox.setCurrentIndex(currentIndex)
         self.on_windowComboBox_activated(currentIndex)
-        
-        self.tabViewGroupBox.setTitle(
-            self.tr(self.viewmanagers["tabview"]))
-        
+
+        self.tabViewGroupBox.setTitle(self.tr(self.viewmanagers["tabview"]))
+
         self.filenameLengthSpinBox.setValue(
-            Preferences.getUI("TabViewManagerFilenameLength"))
+            Preferences.getUI("TabViewManagerFilenameLength")
+        )
         self.filenameOnlyCheckBox.setChecked(
-            Preferences.getUI("TabViewManagerFilenameOnly"))
-        self.recentFilesSpinBox.setValue(
-            Preferences.getUI("RecentNumber"))
-        
+            Preferences.getUI("TabViewManagerFilenameOnly")
+        )
+        self.recentFilesSpinBox.setValue(Preferences.getUI("RecentNumber"))
+
     def save(self):
         """
         Public slot to save the Viewmanager configuration.
         """
-        vm = self.windowComboBox.itemData(
-            self.windowComboBox.currentIndex())
+        vm = self.windowComboBox.itemData(self.windowComboBox.currentIndex())
         Preferences.setViewManager(vm)
         Preferences.setUI(
-            "TabViewManagerFilenameLength",
-            self.filenameLengthSpinBox.value())
+            "TabViewManagerFilenameLength", self.filenameLengthSpinBox.value()
+        )
         Preferences.setUI(
-            "TabViewManagerFilenameOnly",
-            self.filenameOnlyCheckBox.isChecked())
-        Preferences.setUI(
-            "RecentNumber",
-            self.recentFilesSpinBox.value())
-        
+            "TabViewManagerFilenameOnly", self.filenameOnlyCheckBox.isChecked()
+        )
+        Preferences.setUI("RecentNumber", self.recentFilesSpinBox.value())
+
     @pyqtSlot(int)
     def on_windowComboBox_activated(self, index):
         """
         Private slot to show a preview of the selected workspace view type.
-        
+
         @param index index of selected workspace view type (integer)
         """
-        workspace = self.windowComboBox.itemData(
-            self.windowComboBox.currentIndex())
-        pixmap = self.pluginManager.getPluginPreviewPixmap(
-            "viewmanager", workspace)
-        
+        workspace = self.windowComboBox.itemData(self.windowComboBox.currentIndex())
+        pixmap = self.pluginManager.getPluginPreviewPixmap("viewmanager", workspace)
+
         self.previewPixmap.setPixmap(pixmap)
         self.tabViewGroupBox.setEnabled(workspace == "tabview")
-    
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/WebBrowserAppearancePage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/WebBrowserAppearancePage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
 import Preferences
 
 
-class WebBrowserAppearancePage(ConfigurationPageBase,
-                               Ui_WebBrowserAppearancePage):
+class WebBrowserAppearancePage(ConfigurationPageBase, Ui_WebBrowserAppearancePage):
     """
     Class implementing the Web Browser Appearance page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -29,155 +29,185 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("WebBrowserAppearancePage")
-        
+
         self.styleSheetPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.styleSheetPicker.setFilters(self.tr(
-            "Cascading Style Sheets (*.css);;All files (*)"))
-        
+        self.styleSheetPicker.setFilters(
+            self.tr("Cascading Style Sheets (*.css);;All files (*)")
+        )
+
         self.__displayMode = None
-        
+
         # set initial values
         defaultFontSize = Preferences.getWebBrowser("DefaultFontSize")
         fixedFontSize = Preferences.getWebBrowser("DefaultFixedFontSize")
         self.defaultSizeSpinBox.setValue(defaultFontSize)
         self.fixedSizeSpinBox.setValue(fixedFontSize)
-        self.minSizeSpinBox.setValue(
-            Preferences.getWebBrowser("MinimumFontSize"))
+        self.minSizeSpinBox.setValue(Preferences.getWebBrowser("MinimumFontSize"))
         self.minLogicalSizeSpinBox.setValue(
-            Preferences.getWebBrowser("MinimumLogicalFontSize"))
-        
+            Preferences.getWebBrowser("MinimumLogicalFontSize")
+        )
+
         self.standardFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("StandardFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, False))
+            QFont(
+                [Preferences.getWebBrowser("StandardFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
         self.fixedFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("FixedFontFamily")],
-                  fixedFontSize, QFont.Weight.Normal, False))
+            QFont(
+                [Preferences.getWebBrowser("FixedFontFamily")],
+                fixedFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
         self.serifFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("SerifFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, False))
+            QFont(
+                [Preferences.getWebBrowser("SerifFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
         self.sansSerifFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("SansSerifFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, False))
+            QFont(
+                [Preferences.getWebBrowser("SansSerifFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
         self.cursiveFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("CursiveFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, True))
+            QFont(
+                [Preferences.getWebBrowser("CursiveFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                True,
+            )
+        )
         self.fantasyFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("FantasyFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, False))
+            QFont(
+                [Preferences.getWebBrowser("FantasyFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
         self.pictographFontCombo.setCurrentFont(
-            QFont([Preferences.getWebBrowser("PictographFontFamily")],
-                  defaultFontSize, QFont.Weight.Normal, False))
-        
-        self.initColour("SecureUrlColor",
-                        self.secureURLsColourButton,
-                        Preferences.getWebBrowser)
-        self.initColour("InsecureUrlColor",
-                        self.insecureURLsColourButton,
-                        Preferences.getWebBrowser)
-        self.initColour("MaliciousUrlColor",
-                        self.maliciousURLsColourButton,
-                        Preferences.getWebBrowser)
-        self.initColour("PrivateModeUrlColor",
-                        self.privateModeURLsColourButton,
-                        Preferences.getWebBrowser)
-        
+            QFont(
+                [Preferences.getWebBrowser("PictographFontFamily")],
+                defaultFontSize,
+                QFont.Weight.Normal,
+                False,
+            )
+        )
+
+        self.initColour(
+            "SecureUrlColor", self.secureURLsColourButton, Preferences.getWebBrowser
+        )
+        self.initColour(
+            "InsecureUrlColor", self.insecureURLsColourButton, Preferences.getWebBrowser
+        )
+        self.initColour(
+            "MaliciousUrlColor",
+            self.maliciousURLsColourButton,
+            Preferences.getWebBrowser,
+        )
+        self.initColour(
+            "PrivateModeUrlColor",
+            self.privateModeURLsColourButton,
+            Preferences.getWebBrowser,
+        )
+
         self.autoLoadImagesCheckBox.setChecked(
-            Preferences.getWebBrowser("AutoLoadImages"))
-        
-        self.styleSheetPicker.setText(
-            Preferences.getWebBrowser("UserStyleSheet"))
-        
+            Preferences.getWebBrowser("AutoLoadImages")
+        )
+
+        self.styleSheetPicker.setText(Preferences.getWebBrowser("UserStyleSheet"))
+
         self.warnOnMultipleCloseCheckBox.setChecked(
-            Preferences.getWebBrowser("WarnOnMultipleClose"))
-        
-        self.scrollbarsCheckBox.setChecked(
-            Preferences.getWebBrowser("ShowScrollBars"))
-        self.toolbarsCheckBox.setChecked(
-            Preferences.getWebBrowser("ShowToolbars"))
-    
+            Preferences.getWebBrowser("WarnOnMultipleClose")
+        )
+
+        self.scrollbarsCheckBox.setChecked(Preferences.getWebBrowser("ShowScrollBars"))
+        self.toolbarsCheckBox.setChecked(Preferences.getWebBrowser("ShowToolbars"))
+
     def setMode(self, displayMode):
         """
         Public method to perform mode dependent setups.
-        
+
         @param displayMode mode of the configuration dialog
             (ConfigurationMode.DEFAULTMODE,
              ConfigurationMode.WEBBROWSERMODE)
         """
         from ..ConfigurationDialog import ConfigurationMode
+
         if displayMode in (
             ConfigurationMode.DEFAULTMODE,
             ConfigurationMode.WEBBROWSERMODE,
         ):
             self.__displayMode = displayMode
-    
+
     def save(self):
         """
         Public slot to save the Help Viewers configuration.
         """
         Preferences.setWebBrowser(
-            "StandardFontFamily",
-            self.standardFontCombo.currentFont().family())
+            "StandardFontFamily", self.standardFontCombo.currentFont().family()
+        )
         Preferences.setWebBrowser(
-            "FixedFontFamily",
-            self.fixedFontCombo.currentFont().family())
+            "FixedFontFamily", self.fixedFontCombo.currentFont().family()
+        )
         Preferences.setWebBrowser(
-            "SerifFontFamily",
-            self.serifFontCombo.currentFont().family())
+            "SerifFontFamily", self.serifFontCombo.currentFont().family()
+        )
         Preferences.setWebBrowser(
-            "SansSerifFontFamily",
-            self.sansSerifFontCombo.currentFont().family())
+            "SansSerifFontFamily", self.sansSerifFontCombo.currentFont().family()
+        )
         Preferences.setWebBrowser(
-            "CursiveFontFamily",
-            self.cursiveFontCombo.currentFont().family())
+            "CursiveFontFamily", self.cursiveFontCombo.currentFont().family()
+        )
         Preferences.setWebBrowser(
-            "FantasyFontFamily",
-            self.fantasyFontCombo.currentFont().family())
+            "FantasyFontFamily", self.fantasyFontCombo.currentFont().family()
+        )
         if self.pictographFontCombo.isEnabled():
             Preferences.setWebBrowser(
-                "PictographFontFamily",
-                self.pictographFontCombo.currentFont().family())
-        
+                "PictographFontFamily", self.pictographFontCombo.currentFont().family()
+            )
+
+        Preferences.setWebBrowser("DefaultFontSize", self.defaultSizeSpinBox.value())
+        Preferences.setWebBrowser("DefaultFixedFontSize", self.fixedSizeSpinBox.value())
+        Preferences.setWebBrowser("MinimumFontSize", self.minSizeSpinBox.value())
         Preferences.setWebBrowser(
-            "DefaultFontSize",
-            self.defaultSizeSpinBox.value())
-        Preferences.setWebBrowser(
-            "DefaultFixedFontSize",
-            self.fixedSizeSpinBox.value())
-        Preferences.setWebBrowser(
-            "MinimumFontSize",
-            self.minSizeSpinBox.value())
+            "MinimumLogicalFontSize", self.minLogicalSizeSpinBox.value()
+        )
+
         Preferences.setWebBrowser(
-            "MinimumLogicalFontSize",
-            self.minLogicalSizeSpinBox.value())
-        
-        Preferences.setWebBrowser(
-            "AutoLoadImages",
-            self.autoLoadImagesCheckBox.isChecked())
-        
+            "AutoLoadImages", self.autoLoadImagesCheckBox.isChecked()
+        )
+
+        Preferences.setWebBrowser("UserStyleSheet", self.styleSheetPicker.text())
+
+        self.saveColours(Preferences.setWebBrowser)
+
         Preferences.setWebBrowser(
-            "UserStyleSheet",
-            self.styleSheetPicker.text())
-        
-        self.saveColours(Preferences.setWebBrowser)
-        
-        Preferences.setWebBrowser(
-            "WarnOnMultipleClose",
-            self.warnOnMultipleCloseCheckBox.isChecked())
-        
+            "WarnOnMultipleClose", self.warnOnMultipleCloseCheckBox.isChecked()
+        )
+
         if self.scrollbarsCheckBox.isEnabled():
             Preferences.setWebBrowser(
-                "ShowScrollBars",
-                self.scrollbarsCheckBox.isChecked())
-        
-        Preferences.setWebBrowser(
-            "ShowToolbars",
-            self.toolbarsCheckBox.isChecked())
-    
+                "ShowScrollBars", self.scrollbarsCheckBox.isChecked()
+            )
+
+        Preferences.setWebBrowser("ShowToolbars", self.toolbarsCheckBox.isChecked())
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/WebBrowserPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/WebBrowserPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,17 +20,18 @@
     """
     Class implementing the  Web Browser configuration page.
     """
+
     def __init__(self, configDialog):
         """
         Constructor
-        
+
         @param configDialog reference to the configuration dialog
             (ConfigurationDialog)
         """
         super().__init__()
         self.setupUi(self)
         self.setObjectName("WebBrowserPage")
-        
+
         self.__configDlg = configDialog
         mw = configDialog.parent().parent()
         if hasattr(mw, "helpWindow") and mw.helpWindow is not None:
@@ -43,91 +44,98 @@
             self.__browserWindow = None
         self.setCurrentPageButton.setEnabled(self.__browserWindow is not None)
         self.imageSearchGroup.setEnabled(self.__browserWindow is not None)
-        
+
         defaultSchemes = ["file://", "http://", "https://"]
         self.defaultSchemeCombo.addItems(defaultSchemes)
-        
+
         # set initial values
         self.singleHelpWindowCheckBox.setChecked(
-            Preferences.getWebBrowser("SingleWebBrowserWindow"))
-        self.saveGeometryCheckBox.setChecked(
-            Preferences.getWebBrowser("SaveGeometry"))
+            Preferences.getWebBrowser("SingleWebBrowserWindow")
+        )
+        self.saveGeometryCheckBox.setChecked(Preferences.getWebBrowser("SaveGeometry"))
         self.webSuggestionsCheckBox.setChecked(
-            Preferences.getWebBrowser("WebSearchSuggestions"))
-        self.showTabPreviews.setChecked(
-            Preferences.getWebBrowser("ShowPreview"))
-        self.errorPageCheckBox.setChecked(
-            Preferences.getWebBrowser("ErrorPageEnabled"))
+            Preferences.getWebBrowser("WebSearchSuggestions")
+        )
+        self.showTabPreviews.setChecked(Preferences.getWebBrowser("ShowPreview"))
+        self.errorPageCheckBox.setChecked(Preferences.getWebBrowser("ErrorPageEnabled"))
         self.scrollingCheckBox.setChecked(
-            Preferences.getWebBrowser("ScrollAnimatorEnabled"))
+            Preferences.getWebBrowser("ScrollAnimatorEnabled")
+        )
         self.fullscreenCheckBox.setChecked(
-            Preferences.getWebBrowser("FullScreenSupportEnabled"))
+            Preferences.getWebBrowser("FullScreenSupportEnabled")
+        )
         self.screenCaptureCheckBox.setChecked(
-            Preferences.getWebBrowser("ScreenCaptureEnabled"))
-        self.webGLCheckBox.setChecked(
-            Preferences.getWebBrowser("WebGLEnabled"))
+            Preferences.getWebBrowser("ScreenCaptureEnabled")
+        )
+        self.webGLCheckBox.setChecked(Preferences.getWebBrowser("WebGLEnabled"))
         self.accelerated2dCanvasCheckBox.setChecked(
-            Preferences.getWebBrowser("Accelerated2dCanvasEnabled"))
+            Preferences.getWebBrowser("Accelerated2dCanvasEnabled")
+        )
         self.autoloadIconsCheckBox.setChecked(
-            Preferences.getWebBrowser("AutoLoadIconsForPage"))
+            Preferences.getWebBrowser("AutoLoadIconsForPage")
+        )
         self.autoplayMediaCheckBox.setChecked(
-            Preferences.getWebBrowser("PlaybackRequiresUserGesture"))
+            Preferences.getWebBrowser("PlaybackRequiresUserGesture")
+        )
         self.webRtcPublicOnlyCheckBox.setChecked(
-            Preferences.getWebBrowser("WebRTCPublicInterfacesOnly"))
+            Preferences.getWebBrowser("WebRTCPublicInterfacesOnly")
+        )
         self.dnsPrefetchCheckBox.setChecked(
-            Preferences.getWebBrowser("DnsPrefetchEnabled"))
-        
-        self.javaScriptGroup.setChecked(
-            Preferences.getWebBrowser("JavaScriptEnabled"))
+            Preferences.getWebBrowser("DnsPrefetchEnabled")
+        )
+
+        self.javaScriptGroup.setChecked(Preferences.getWebBrowser("JavaScriptEnabled"))
         self.jsOpenWindowsCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanOpenWindows"))
+            Preferences.getWebBrowser("JavaScriptCanOpenWindows")
+        )
         self.jsActivateWindowsCheckBox.setChecked(
-            Preferences.getWebBrowser("AllowWindowActivationFromJavaScript"))
+            Preferences.getWebBrowser("AllowWindowActivationFromJavaScript")
+        )
         self.jsClipboardCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"))
-        self.jsPasteCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanPaste"))
-        self.doNotTrackCheckBox.setChecked(
-            Preferences.getWebBrowser("DoNotTrack"))
+            Preferences.getWebBrowser("JavaScriptCanAccessClipboard")
+        )
+        self.jsPasteCheckBox.setChecked(Preferences.getWebBrowser("JavaScriptCanPaste"))
+        self.doNotTrackCheckBox.setChecked(Preferences.getWebBrowser("DoNotTrack"))
         self.refererSendComboBox.setCurrentIndex(
-            Preferences.getWebBrowser("RefererSendReferer"))
+            Preferences.getWebBrowser("RefererSendReferer")
+        )
         self.refererDefaultPolicyCcomboBox.setCurrentIndex(
-            Preferences.getWebBrowser("RefererDefaultPolicy"))
+            Preferences.getWebBrowser("RefererDefaultPolicy")
+        )
         self.refererTrimmingPolicyComboBox.setCurrentIndex(
-            Preferences.getWebBrowser("RefererTrimmingPolicy"))
-        
-        self.pluginsGroup.setChecked(
-            Preferences.getWebBrowser("PluginsEnabled"))
+            Preferences.getWebBrowser("RefererTrimmingPolicy")
+        )
+
+        self.pluginsGroup.setChecked(Preferences.getWebBrowser("PluginsEnabled"))
         try:
             # Qt 5.13
             self.pdfViewerCheckBox.setChecked(
-                Preferences.getWebBrowser("PdfViewerEnabled"))
+                Preferences.getWebBrowser("PdfViewerEnabled")
+            )
         except KeyError:
             self.pdfViewerCheckBox.setEnabled(False)
-        
-        self.diskCacheCheckBox.setChecked(
-            Preferences.getWebBrowser("DiskCacheEnabled"))
-        self.cacheSizeSpinBox.setValue(
-            Preferences.getWebBrowser("DiskCacheSize"))
-        
-        self.startupCombo.setCurrentIndex(
-            Preferences.getWebBrowser("StartupBehavior"))
-        self.newTabCombo.setCurrentIndex(
-            Preferences.getWebBrowser("NewTabBehavior"))
-        self.homePageEdit.setText(
-            Preferences.getWebBrowser("HomePage"))
+
+        self.diskCacheCheckBox.setChecked(Preferences.getWebBrowser("DiskCacheEnabled"))
+        self.cacheSizeSpinBox.setValue(Preferences.getWebBrowser("DiskCacheSize"))
+
+        self.startupCombo.setCurrentIndex(Preferences.getWebBrowser("StartupBehavior"))
+        self.newTabCombo.setCurrentIndex(Preferences.getWebBrowser("NewTabBehavior"))
+        self.homePageEdit.setText(Preferences.getWebBrowser("HomePage"))
         self.loadTabOnActivationCheckBox.setChecked(
-            Preferences.getWebBrowser("LoadTabOnActivation"))
-        
+            Preferences.getWebBrowser("LoadTabOnActivation")
+        )
+
         self.saveSessionCheckBox.setChecked(
-            Preferences.getWebBrowser("SessionAutoSave"))
+            Preferences.getWebBrowser("SessionAutoSave")
+        )
         self.sessionTimerSpinBox.setValue(
-            Preferences.getWebBrowser("SessionAutoSaveInterval"))
-        
+            Preferences.getWebBrowser("SessionAutoSaveInterval")
+        )
+
         self.defaultSchemeCombo.setCurrentIndex(
-            self.defaultSchemeCombo.findText(
-                Preferences.getWebBrowser("DefaultScheme")))
-        
+            self.defaultSchemeCombo.findText(Preferences.getWebBrowser("DefaultScheme"))
+        )
+
         historyLimit = Preferences.getWebBrowser("HistoryLimit")
         idx = 0
         if historyLimit == 1:
@@ -147,188 +155,178 @@
         else:
             idx = 5
         self.expireHistory.setCurrentIndex(idx)
-        
+
         for language in QLocale.Language:
             if language == QLocale.Language.C:
                 continue
-            
+
             countries = [
                 loc.country()
                 for loc in QLocale.matchingLocales(
-                    language, QLocale.Script.AnyScript,
-                    QLocale.Country.AnyCountry
+                    language, QLocale.Script.AnyScript, QLocale.Country.AnyCountry
                 )
             ]
             if len(countries) > 0:
-                self.languageCombo.addItem(
-                    QLocale.languageToString(language), language)
+                self.languageCombo.addItem(QLocale.languageToString(language), language)
         self.languageCombo.model().sort(0)
         self.languageCombo.insertSeparator(0)
         self.languageCombo.insertItem(
-            0, QLocale.languageToString(QLocale.Language.AnyLanguage), 0)
-        index = self.languageCombo.findData(
-            Preferences.getWebBrowser("SearchLanguage"))
+            0, QLocale.languageToString(QLocale.Language.AnyLanguage), 0
+        )
+        index = self.languageCombo.findData(Preferences.getWebBrowser("SearchLanguage"))
         if index > -1:
             self.languageCombo.setCurrentIndex(index)
-        
+
         if self.__browserWindow:
-            for engineName in (
-                self.__browserWindow.imageSearchEngine().searchEngineNames()
-            ):
+            for (
+                engineName
+            ) in self.__browserWindow.imageSearchEngine().searchEngineNames():
                 self.imageSearchComboBox.addItem(
-                    UI.PixmapCache.getIcon(
-                        "{0}".format(engineName.lower())),
-                    engineName)
+                    UI.PixmapCache.getIcon("{0}".format(engineName.lower())), engineName
+                )
             index = self.imageSearchComboBox.findText(
-                Preferences.getWebBrowser("ImageSearchEngine"))
+                Preferences.getWebBrowser("ImageSearchEngine")
+            )
             if index > -1:
                 self.imageSearchComboBox.setCurrentIndex(index)
-        
+
         self.spatialCheckBox.setChecked(
-            Preferences.getWebBrowser("SpatialNavigationEnabled"))
+            Preferences.getWebBrowser("SpatialNavigationEnabled")
+        )
         self.linksInFocusChainCheckBox.setChecked(
-            Preferences.getWebBrowser("LinksIncludedInFocusChain"))
+            Preferences.getWebBrowser("LinksIncludedInFocusChain")
+        )
         self.focusOnNavigationCheckBox.setChecked(
-            Preferences.getWebBrowser("FocusOnNavigationEnabled"))
-        
+            Preferences.getWebBrowser("FocusOnNavigationEnabled")
+        )
+
         self.xssAuditingCheckBox.setChecked(
-            Preferences.getWebBrowser("XSSAuditingEnabled"))
+            Preferences.getWebBrowser("XSSAuditingEnabled")
+        )
         self.insecureContentsCheckBox.setChecked(
-            Preferences.getWebBrowser("AllowRunningInsecureContent"))
+            Preferences.getWebBrowser("AllowRunningInsecureContent")
+        )
         self.insecureGeolocationCheckBox.setChecked(
-            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins"))
-        
+            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins")
+        )
+
         self.printBackgroundCheckBox.setChecked(
-            Preferences.getWebBrowser("PrintElementBackgrounds"))
-        
+            Preferences.getWebBrowser("PrintElementBackgrounds")
+        )
+
         self.autoScrollGroupBox.setChecked(
-            Preferences.getWebBrowser("AutoScrollEnabled"))
+            Preferences.getWebBrowser("AutoScrollEnabled")
+        )
         self.autoScrollDividerSpinBox.setValue(
-            Preferences.getWebBrowser("AutoScrollDivider"))
-        
+            Preferences.getWebBrowser("AutoScrollDivider")
+        )
+
         self.protocolHandlerComboBox.setCurrentIndex(
-            Preferences.getWebBrowser("AcceptProtocolHandlerRequest"))
+            Preferences.getWebBrowser("AcceptProtocolHandlerRequest")
+        )
         self.requestQuotaComboBox.setCurrentIndex(
-            Preferences.getWebBrowser("AcceptQuotaRequest"))
-    
+            Preferences.getWebBrowser("AcceptQuotaRequest")
+        )
+
     def save(self):
         """
         Public slot to save the Help Viewers configuration.
         """
         Preferences.setWebBrowser(
-            "SingleWebBrowserWindow",
-            self.singleHelpWindowCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SaveGeometry",
-            self.saveGeometryCheckBox.isChecked())
+            "SingleWebBrowserWindow", self.singleHelpWindowCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("SaveGeometry", self.saveGeometryCheckBox.isChecked())
         Preferences.setWebBrowser(
-            "WebSearchSuggestions",
-            self.webSuggestionsCheckBox.isChecked())
+            "WebSearchSuggestions", self.webSuggestionsCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("ShowPreview", self.showTabPreviews.isChecked())
         Preferences.setWebBrowser(
-            "ShowPreview",
-            self.showTabPreviews.isChecked())
+            "ErrorPageEnabled", self.errorPageCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "ErrorPageEnabled",
-            self.errorPageCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "ScrollAnimatorEnabled",
-            self.scrollingCheckBox.isChecked())
+            "ScrollAnimatorEnabled", self.scrollingCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "FullScreenSupportEnabled",
-            self.fullscreenCheckBox.isChecked())
-        
+            "FullScreenSupportEnabled", self.fullscreenCheckBox.isChecked()
+        )
+
         Preferences.setWebBrowser(
-            "ScreenCaptureEnabled",
-            self.screenCaptureCheckBox.isChecked())
+            "ScreenCaptureEnabled", self.screenCaptureCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("WebGLEnabled", self.webGLCheckBox.isChecked())
         Preferences.setWebBrowser(
-            "WebGLEnabled",
-            self.webGLCheckBox.isChecked())
+            "Accelerated2dCanvasEnabled", self.accelerated2dCanvasCheckBox.isChecked()
+        ),
+
         Preferences.setWebBrowser(
-            "Accelerated2dCanvasEnabled",
-            self.accelerated2dCanvasCheckBox.isChecked()),
-        
+            "AutoLoadIconsForPage", self.autoloadIconsCheckBox.isChecked()
+        ),
         Preferences.setWebBrowser(
-            "AutoLoadIconsForPage",
-            self.autoloadIconsCheckBox.isChecked()),
-        Preferences.setWebBrowser(
-            "PlaybackRequiresUserGesture",
-            self.autoplayMediaCheckBox.isChecked())
+            "PlaybackRequiresUserGesture", self.autoplayMediaCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "WebRTCPublicInterfacesOnly",
-            self.webRtcPublicOnlyCheckBox.isChecked())
-        
+            "WebRTCPublicInterfacesOnly", self.webRtcPublicOnlyCheckBox.isChecked()
+        )
+
         Preferences.setWebBrowser(
-            "DnsPrefetchEnabled",
-            self.dnsPrefetchCheckBox.isChecked())
-        
+            "DnsPrefetchEnabled", self.dnsPrefetchCheckBox.isChecked()
+        )
+
+        Preferences.setWebBrowser("JavaScriptEnabled", self.javaScriptGroup.isChecked())
         Preferences.setWebBrowser(
-            "JavaScriptEnabled",
-            self.javaScriptGroup.isChecked())
-        Preferences.setWebBrowser(
-            "JavaScriptCanOpenWindows",
-            self.jsOpenWindowsCheckBox.isChecked())
+            "JavaScriptCanOpenWindows", self.jsOpenWindowsCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
             "AllowWindowActivationFromJavaScript",
-            self.jsActivateWindowsCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "JavaScriptCanAccessClipboard",
-            self.jsClipboardCheckBox.isChecked())
+            self.jsActivateWindowsCheckBox.isChecked(),
+        )
         Preferences.setWebBrowser(
-            "JavaScriptCanPaste",
-            self.jsPasteCheckBox.isChecked())
-        
+            "JavaScriptCanAccessClipboard", self.jsClipboardCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "PluginsEnabled",
-            self.pluginsGroup.isChecked())
+            "JavaScriptCanPaste", self.jsPasteCheckBox.isChecked()
+        )
+
+        Preferences.setWebBrowser("PluginsEnabled", self.pluginsGroup.isChecked())
         if self.pdfViewerCheckBox.isEnabled():
             Preferences.setWebBrowser(
-                "PdfViewerEnabled",
-                self.pdfViewerCheckBox.isChecked())
-        
-        Preferences.setWebBrowser(
-            "DoNotTrack",
-            self.doNotTrackCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "RefererSendReferer",
-            self.refererSendComboBox.currentIndex())
+                "PdfViewerEnabled", self.pdfViewerCheckBox.isChecked()
+            )
+
+        Preferences.setWebBrowser("DoNotTrack", self.doNotTrackCheckBox.isChecked())
         Preferences.setWebBrowser(
-            "RefererDefaultPolicy",
-            self.refererDefaultPolicyCcomboBox.currentIndex())
-        Preferences.setWebBrowser(
-            "RefererTrimmingPolicy",
-            self.refererTrimmingPolicyComboBox.currentIndex())
-        
+            "RefererSendReferer", self.refererSendComboBox.currentIndex()
+        )
         Preferences.setWebBrowser(
-            "DiskCacheEnabled",
-            self.diskCacheCheckBox.isChecked())
+            "RefererDefaultPolicy", self.refererDefaultPolicyCcomboBox.currentIndex()
+        )
         Preferences.setWebBrowser(
-            "DiskCacheSize",
-            self.cacheSizeSpinBox.value())
-        
+            "RefererTrimmingPolicy", self.refererTrimmingPolicyComboBox.currentIndex()
+        )
+
         Preferences.setWebBrowser(
-            "StartupBehavior",
-            self.startupCombo.currentIndex())
-        Preferences.setWebBrowser(
-            "NewTabBehavior",
-            self.newTabCombo.currentIndex())
-        Preferences.setWebBrowser(
-            "HomePage",
-            self.homePageEdit.text())
+            "DiskCacheEnabled", self.diskCacheCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("DiskCacheSize", self.cacheSizeSpinBox.value())
+
+        Preferences.setWebBrowser("StartupBehavior", self.startupCombo.currentIndex())
+        Preferences.setWebBrowser("NewTabBehavior", self.newTabCombo.currentIndex())
+        Preferences.setWebBrowser("HomePage", self.homePageEdit.text())
         Preferences.setWebBrowser(
-            "LoadTabOnActivation",
-            self.loadTabOnActivationCheckBox.isChecked())
-        
+            "LoadTabOnActivation", self.loadTabOnActivationCheckBox.isChecked()
+        )
+
         Preferences.setWebBrowser(
-            "SessionAutoSave",
-            self.saveSessionCheckBox.isChecked())
+            "SessionAutoSave", self.saveSessionCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "SessionAutoSaveInterval",
-            self.sessionTimerSpinBox.value())
-        
+            "SessionAutoSaveInterval", self.sessionTimerSpinBox.value()
+        )
+
         Preferences.setWebBrowser(
-            "DefaultScheme",
-            self.defaultSchemeCombo.currentText())
-        
+            "DefaultScheme", self.defaultSchemeCombo.currentText()
+        )
+
         idx = self.expireHistory.currentIndex()
         if idx == 0:
             historyLimit = 1
@@ -345,58 +343,60 @@
         elif idx == 6:
             historyLimit = -2
         Preferences.setWebBrowser("HistoryLimit", historyLimit)
-        
+
         languageIndex = self.languageCombo.currentIndex()
         language = (
             self.languageCombo.itemData(languageIndex)
-            if languageIndex > -1 else
+            if languageIndex > -1
+            else
             # fall back to system default
             QLocale.system().language()
         )
         Preferences.setWebBrowser("SearchLanguage", language)
-        
+
         Preferences.setWebBrowser(
-            "ImageSearchEngine",
-            self.imageSearchComboBox.currentText())
-        
+            "ImageSearchEngine", self.imageSearchComboBox.currentText()
+        )
+
         Preferences.setWebBrowser(
-            "SpatialNavigationEnabled",
-            self.spatialCheckBox.isChecked())
+            "SpatialNavigationEnabled", self.spatialCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "LinksIncludedInFocusChain",
-            self.linksInFocusChainCheckBox.isChecked())
+            "LinksIncludedInFocusChain", self.linksInFocusChainCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "FocusOnNavigationEnabled",
-            self.focusOnNavigationCheckBox.isChecked())
-        
+            "FocusOnNavigationEnabled", self.focusOnNavigationCheckBox.isChecked()
+        )
+
         Preferences.setWebBrowser(
-            "XSSAuditingEnabled",
-            self.xssAuditingCheckBox.isChecked())
+            "XSSAuditingEnabled", self.xssAuditingCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "AllowRunningInsecureContent",
-            self.insecureContentsCheckBox.isChecked())
+            "AllowRunningInsecureContent", self.insecureContentsCheckBox.isChecked()
+        )
         Preferences.setWebBrowser(
             "AllowGeolocationOnInsecureOrigins",
-            self.insecureGeolocationCheckBox.isChecked())
-        
+            self.insecureGeolocationCheckBox.isChecked(),
+        )
+
         Preferences.setWebBrowser(
-            "PrintElementBackgrounds",
-            self.printBackgroundCheckBox.isChecked())
-        
+            "PrintElementBackgrounds", self.printBackgroundCheckBox.isChecked()
+        )
+
         Preferences.setWebBrowser(
-            "AutoScrollEnabled",
-            self.autoScrollGroupBox.isChecked())
+            "AutoScrollEnabled", self.autoScrollGroupBox.isChecked()
+        )
         Preferences.setWebBrowser(
-            "AutoScrollDivider",
-            self.autoScrollDividerSpinBox.value())
-        
+            "AutoScrollDivider", self.autoScrollDividerSpinBox.value()
+        )
+
         Preferences.setWebBrowser(
-            "AcceptProtocolHandlerRequest",
-            self.protocolHandlerComboBox.currentIndex())
+            "AcceptProtocolHandlerRequest", self.protocolHandlerComboBox.currentIndex()
+        )
         Preferences.setWebBrowser(
-            "AcceptQuotaRequest",
-            self.requestQuotaComboBox.currentIndex())
-    
+            "AcceptQuotaRequest", self.requestQuotaComboBox.currentIndex()
+        )
+
     @pyqtSlot()
     def on_setCurrentPageButton_clicked(self):
         """
@@ -404,48 +404,48 @@
         """
         url = self.__browserWindow.currentBrowser().url()
         self.homePageEdit.setText(bytes(url.toEncoded()).decode())
-    
+
     @pyqtSlot()
     def on_defaultHomeButton_clicked(self):
         """
         Private slot to set the default home page.
         """
         self.homePageEdit.setText(Preferences.Prefs.helpDefaults["HomePage"])
-    
+
     @pyqtSlot()
     def on_setSpeedDialPageButton_clicked(self):
         """
         Private slot documentation goes here.
         """
         self.homePageEdit.setText("eric:speeddial")
-    
+
     @pyqtSlot(int)
     def on_startupCombo_currentIndexChanged(self, index):
         """
         Private slot to enable elements depending on the selected startup
         entry.
-        
+
         @param index index of the selected entry (integer)
         """
         # set state of the session related items
-        self.loadTabOnActivationCheckBox.setEnabled(
-            index in [3, 4])
-    
+        self.loadTabOnActivationCheckBox.setEnabled(index in [3, 4])
+
     @pyqtSlot()
     def on_refererWhitelistButton_clicked(self):
         """
         Private slot to edit the referer whitelist.
         """
         from WebBrowser.Network.SendRefererWhitelistDialog import (
-            SendRefererWhitelistDialog
+            SendRefererWhitelistDialog,
         )
+
         SendRefererWhitelistDialog(self).exec()
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 import contextlib
 
-from PyQt6.QtCore import (
-    pyqtSlot, Qt, QCoreApplication, QDir, QLibraryInfo, QLocale
-)
+from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication, QDir, QLibraryInfo, QLocale
 from PyQt6.QtWidgets import QListWidgetItem
 
 from .ConfigurationPageBase import ConfigurationPageBase
@@ -22,11 +20,13 @@
 import Globals
 
 
-class WebBrowserSpellCheckingPage(ConfigurationPageBase,
-                                  Ui_WebBrowserSpellCheckingPage):
+class WebBrowserSpellCheckingPage(
+    ConfigurationPageBase, Ui_WebBrowserSpellCheckingPage
+):
     """
     Class implementing the Web Browser Spell Checking page.
     """
+
     def __init__(self):
         """
         Constructor
@@ -34,56 +34,58 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("WebBrowserSpellCheckingPage")
-        
+
         # set initial values
         self.spellCheckEnabledCheckBox.setChecked(
-            Preferences.getWebBrowser("SpellCheckEnabled"))
+            Preferences.getWebBrowser("SpellCheckEnabled")
+        )
         self.on_spellCheckEnabledCheckBox_clicked()
-        
+
         if Globals.isMacPlatform():
             self.__dictionaryDirectories = {
                 QDir.cleanPath(
-                    QCoreApplication.applicationDirPath() +
-                    "/../Resources/qtwebengine_dictionaries"),
+                    QCoreApplication.applicationDirPath()
+                    + "/../Resources/qtwebengine_dictionaries"
+                ),
                 QDir.cleanPath(
-                    QCoreApplication.applicationDirPath() +
-                    "/../Frameworks/QtWebEngineCore.framework"
-                    "/Resources/qtwebengine_dictionaries"),
+                    QCoreApplication.applicationDirPath()
+                    + "/../Frameworks/QtWebEngineCore.framework"
+                    "/Resources/qtwebengine_dictionaries"
+                ),
             }
         else:
             self.__dictionaryDirectories = {
                 QDir.cleanPath(
-                    QCoreApplication.applicationDirPath() +
-                    "/qtwebengine_dictionaries"),
+                    QCoreApplication.applicationDirPath() + "/qtwebengine_dictionaries"
+                ),
                 QDir.cleanPath(
-                    QLibraryInfo.path(
-                        QLibraryInfo.LibraryPath.DataPath) +
-                    "/qtwebengine_dictionaries"
+                    QLibraryInfo.path(QLibraryInfo.LibraryPath.DataPath)
+                    + "/qtwebengine_dictionaries"
                 ),
             }
         self.spellCheckDictionaryDirectoriesEdit.setPlainText(
-            "\n".join(self.__dictionaryDirectories))
+            "\n".join(self.__dictionaryDirectories)
+        )
         # try to create these directories, if they don't exist
         for directory in self.__dictionaryDirectories:
             if not os.path.exists(directory):
                 with contextlib.suppress(os.error):
                     os.makedirs(directory)
-        
+
         self.__writeableDirectories = []
         for directory in self.__dictionaryDirectories:
             if os.access(directory, os.W_OK):
                 self.__writeableDirectories.append(directory)
-        self.manageDictionariesButton.setEnabled(
-            bool(self.__writeableDirectories))
-        
+        self.manageDictionariesButton.setEnabled(bool(self.__writeableDirectories))
+
         self.__populateDictionariesList()
-    
+
     def __populateDictionariesList(self):
         """
         Private method to populate the spell checking dictionaries list.
         """
         self.spellCheckLanguagesList.clear()
-        
+
         for path in self.__dictionaryDirectories:
             directory = QDir(path)
             fileNames = directory.entryList(["*.bdic"])
@@ -94,26 +96,28 @@
                     langStr, Qt.MatchFlag.MatchExactly
                 ):
                     continue
-                
+
                 itm = QListWidgetItem(langStr, self.spellCheckLanguagesList)
                 itm.setData(Qt.ItemDataRole.UserRole, lang)
                 itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
                 itm.setCheckState(Qt.CheckState.Unchecked)
         self.spellCheckLanguagesList.sortItems(Qt.SortOrder.AscendingOrder)
-        
+
         spellCheckLanguages = Preferences.getWebBrowser("SpellCheckLanguages")
         topIndex = 0
         for lang in spellCheckLanguages:
             items = self.spellCheckLanguagesList.findItems(
-                self.__createLanguageString(lang), Qt.MatchFlag.MatchExactly)
+                self.__createLanguageString(lang), Qt.MatchFlag.MatchExactly
+            )
             if items:
                 itm = items[0]
                 self.spellCheckLanguagesList.takeItem(
-                    self.spellCheckLanguagesList.row(itm))
+                    self.spellCheckLanguagesList.row(itm)
+                )
                 self.spellCheckLanguagesList.insertItem(topIndex, itm)
                 itm.setCheckState(Qt.CheckState.Checked)
                 topIndex += 1
-        
+
         if self.spellCheckLanguagesList.count():
             self.noLanguagesLabel.hide()
             self.spellCheckLanguagesList.show()
@@ -122,7 +126,7 @@
             self.noLanguagesLabel.show()
             self.spellCheckLanguagesList.hide()
             self.spellCheckEnabledCheckBox.setChecked(False)
-    
+
     def save(self):
         """
         Public slot to save the Help Viewers configuration.
@@ -132,14 +136,12 @@
             itm = self.spellCheckLanguagesList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
                 languages.append(itm.data(Qt.ItemDataRole.UserRole))
-        
+
         Preferences.setWebBrowser(
-            "SpellCheckEnabled",
-            self.spellCheckEnabledCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SpellCheckLanguages",
-            languages)
-    
+            "SpellCheckEnabled", self.spellCheckEnabledCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("SpellCheckLanguages", languages)
+
     @pyqtSlot()
     def on_spellCheckEnabledCheckBox_clicked(self):
         """
@@ -148,44 +150,45 @@
         enable = self.spellCheckEnabledCheckBox.isChecked()
         self.noLanguagesLabel.setEnabled(enable)
         self.spellCheckLanguagesList.setEnabled(enable)
-    
+
     def __createLanguageString(self, language):
         """
         Private method to create a language string given a language identifier.
-        
+
         @param language language identifier
         @type str
         @return language string
         @rtype str
         """
         loc = QLocale(language)
-        
+
         if loc.language() == QLocale.Language.C:
             return language
-        
+
         country = QLocale.countryToString(loc.country())
         lang = QLocale.languageToString(loc.language())
         languageString = "{0}/{1} [{2}]".format(lang, country, language)
         return languageString
-    
+
     @pyqtSlot()
     def on_manageDictionariesButton_clicked(self):
         """
         Private slot to manage spell checking dictionaries.
         """
         from WebBrowser.SpellCheck.ManageDictionariesDialog import (
-            ManageDictionariesDialog
+            ManageDictionariesDialog,
         )
+
         dlg = ManageDictionariesDialog(self.__writeableDirectories, self)
         dlg.exec()
-        
+
         self.__populateDictionariesList()
 
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @type Configuration
     @return reference to the instantiated page
--- a/src/eric7/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,11 +15,11 @@
 import Preferences
 
 
-class WebBrowserVirusTotalPage(ConfigurationPageBase,
-                               Ui_WebBrowserVirusTotalPage):
+class WebBrowserVirusTotalPage(ConfigurationPageBase, Ui_WebBrowserVirusTotalPage):
     """
     Class implementing VirusTotal configuration page (web browser variant).
     """
+
     def __init__(self):
         """
         Constructor
@@ -27,83 +27,79 @@
         super().__init__()
         self.setupUi(self)
         self.setObjectName("HelpVirusTotalPage")
-        
+
         self.testResultLabel.setHidden(True)
-        
+
         from WebBrowser.VirusTotal.VirusTotalApi import VirusTotalAPI
+
         self.__vt = VirusTotalAPI(self)
-        self.__vt.checkServiceKeyFinished.connect(
-            self.__checkServiceKeyFinished)
-        
+        self.__vt.checkServiceKeyFinished.connect(self.__checkServiceKeyFinished)
+
         # set initial values
         self.vtEnabledCheckBox.setChecked(
-            Preferences.getWebBrowser("VirusTotalEnabled"))
-        self.vtSecureCheckBox.setChecked(
-            Preferences.getWebBrowser("VirusTotalSecure"))
-        self.vtServiceKeyEdit.setText(
-            Preferences.getWebBrowser("VirusTotalServiceKey"))
-    
+            Preferences.getWebBrowser("VirusTotalEnabled")
+        )
+        self.vtSecureCheckBox.setChecked(Preferences.getWebBrowser("VirusTotalSecure"))
+        self.vtServiceKeyEdit.setText(Preferences.getWebBrowser("VirusTotalServiceKey"))
+
     def save(self):
         """
         Public slot to save the VirusTotal configuration.
         """
         Preferences.setWebBrowser(
-            "VirusTotalEnabled",
-            self.vtEnabledCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "VirusTotalSecure",
-            self.vtSecureCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "VirusTotalServiceKey",
-            self.vtServiceKeyEdit.text())
-    
+            "VirusTotalEnabled", self.vtEnabledCheckBox.isChecked()
+        )
+        Preferences.setWebBrowser("VirusTotalSecure", self.vtSecureCheckBox.isChecked())
+        Preferences.setWebBrowser("VirusTotalServiceKey", self.vtServiceKeyEdit.text())
+
     @pyqtSlot(str)
     def on_vtServiceKeyEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the service key.
-        
+
         @param txt entered service key (string)
         """
         self.testButton.setEnabled(txt != "")
-    
+
     @pyqtSlot()
     def on_testButton_clicked(self):
         """
         Private slot to test the entered service key.
         """
         self.testResultLabel.setHidden(False)
-        self.testResultLabel.setText(
-            self.tr("Checking validity of the service key..."))
+        self.testResultLabel.setText(self.tr("Checking validity of the service key..."))
         protocol = "https" if self.vtSecureCheckBox.isChecked() else "http"
-        self.__vt.checkServiceKeyValidity(
-            self.vtServiceKeyEdit.text(), protocol)
-    
+        self.__vt.checkServiceKeyValidity(self.vtServiceKeyEdit.text(), protocol)
+
     @pyqtSlot(bool, str)
     def __checkServiceKeyFinished(self, result, msg):
         """
         Private slot to receive the result of the service key check.
-        
+
         @param result flag indicating a successful check (boolean)
         @param msg network error message (str)
         """
         if result:
-            self.testResultLabel.setText(
-                self.tr("The service key is valid."))
+            self.testResultLabel.setText(self.tr("The service key is valid."))
         else:
             if msg == "":
-                self.testResultLabel.setText(self.tr(
-                    '<font color="#FF0000">The service key is'
-                    ' not valid.</font>'))
+                self.testResultLabel.setText(
+                    self.tr(
+                        '<font color="#FF0000">The service key is' " not valid.</font>"
+                    )
+                )
             else:
-                self.testResultLabel.setText(self.tr(
-                    '<font color="#FF0000"><b>Error:</b> {0}</font>')
-                    .format(msg))
-    
+                self.testResultLabel.setText(
+                    self.tr('<font color="#FF0000"><b>Error:</b> {0}</font>').format(
+                        msg
+                    )
+                )
+
 
 def create(dlg):
     """
     Module function to create the configuration page.
-    
+
     @param dlg reference to the configuration dialog
     @return reference to the instantiated page (ConfigurationPageBase)
     """
--- a/src/eric7/Preferences/HighlightingStylesFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/HighlightingStylesFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,25 +22,26 @@
     """
     Class representing the highlighting styles JSON file.
     """
+
     def __init__(self, parent: QObject = None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (defaults to None)
         @type QObject (optional)
         """
         super().__init__(parent)
-        
+
         self.__lexerAliases = {
             "PO": "Gettext",
             "POV": "Povray",
         }
-    
+
     def writeFile(self, filename: str, lexers: list) -> bool:
         """
         Public method to write the highlighting styles data to a highlighting
         styles JSON file.
-        
+
         @param filename name of the highlighting styles file
         @type str
         @param lexers list of lexers for which to export the styles
@@ -52,10 +53,10 @@
         # step 0: header
         stylesDict["header"] = {
             "comment": "eric highlighting styles file",
-            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "saved": time.strftime("%Y-%m-%d, %H:%M:%S"),
             "author": Preferences.getUser("Email"),
         }
-        
+
         # step 1: add the lexer style data
         stylesDict["lexers"] = []
         for lexer in lexers:
@@ -67,18 +68,20 @@
                 "styles": [],
             }
             for description, style, substyle in lexer.getStyles():
-                lexerDict["styles"].append({
-                    "description": description,
-                    "style": style,
-                    "substyle": substyle,
-                    "color": lexer.color(style, substyle).name(),
-                    "paper": lexer.paper(style, substyle).name(),
-                    "font": lexer.font(style, substyle).toString(),
-                    "eolfill": lexer.eolFill(style, substyle),
-                    "words": lexer.words(style, substyle).strip(),
-                })
+                lexerDict["styles"].append(
+                    {
+                        "description": description,
+                        "style": style,
+                        "substyle": substyle,
+                        "color": lexer.color(style, substyle).name(),
+                        "paper": lexer.paper(style, substyle).name(),
+                        "font": lexer.font(style, substyle).toString(),
+                        "eolfill": lexer.eolFill(style, substyle),
+                        "words": lexer.words(style, substyle).strip(),
+                    }
+                )
             stylesDict["lexers"].append(lexerDict)
-        
+
         try:
             jsonString = json.dumps(stylesDict, indent=2)
             with open(filename, "w") as f:
@@ -91,17 +94,17 @@
                     self.tr(
                         "<p>The highlighting styles file <b>{0}</b> could not"
                         " be written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> list:
         """
         Public method to read the highlighting styles data from a highlighting
         styles JSON file.
-        
+
         @param filename name of the highlighting styles file
         @type str
         @return list of read lexer style definitions
@@ -118,8 +121,8 @@
                 self.tr(
                     "<p>The highlighting styles file <b>{0}</b> could not be"
                     " read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return []
-        
+
         return stylesDict["lexers"]
--- a/src/eric7/Preferences/MouseClickDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/MouseClickDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     Class implementing a dialog for the configuration of a mouse click
     sequence.
     """
+
     def __init__(self, modifiers, button, parent=None):
         """
         Constructor
-        
+
         @param modifiers keyboard modifiers of the handler
         @type Qt.KeyboardModifiers
         @param button mouse button of the handler
@@ -34,24 +35,26 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setModal(True)
-        
+
         self.clickGroup.installEventFilter(self)
         self.clearButton.installEventFilter(self)
         self.clickEdit.installEventFilter(self)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).installEventFilter(
+            self
+        )
         self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).installEventFilter(self)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).installEventFilter(self)
-        
+            QDialogButtonBox.StandardButton.Cancel
+        ).installEventFilter(self)
+
         self.__modifiers = modifiers
         self.__button = button
-        
+
         self.__showClickText()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def on_clearButton_clicked(self):
         """
@@ -60,7 +63,7 @@
         self.__modifiers = Qt.KeyboardModifier.NoModifier
         self.__button = Qt.MouseButton.NoButton
         self.__showClickText()
-    
+
     def __showClickText(self):
         """
         Private method to show a string representing the entered mouse click
@@ -69,13 +72,16 @@
         if self.__button == Qt.MouseButton.NoButton:
             self.clickEdit.setText("")
         else:
-            self.clickEdit.setText(MouseUtilities.MouseButtonModifier2String(
-                self.__modifiers, self.__button))
-    
+            self.clickEdit.setText(
+                MouseUtilities.MouseButtonModifier2String(
+                    self.__modifiers, self.__button
+                )
+            )
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched reference to the watched object
         @type QObject
         @param event reference to the event that occurred
@@ -83,21 +89,18 @@
         @return flag indicating a handled event
         @rtype bool
         """
-        if (
-            event.type() == QEvent.Type.MouseButtonRelease and
-            watched == self.clickEdit
-        ):
+        if event.type() == QEvent.Type.MouseButtonRelease and watched == self.clickEdit:
             self.__modifiers = event.modifiers()
             self.__button = event.button()
             self.__showClickText()
             return True
-            
+
         return False
-    
+
     def getClick(self):
         """
         Public method to get the entered mouse click sequence.
-        
+
         @return tuple containing the modifiers and the mouse button
         @rtype tuple of Qt.KeyboardModifiers and Qt.MouseButton
         """
--- a/src/eric7/Preferences/PreferencesLexer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/PreferencesLexer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,27 +18,28 @@
     """
     Class defining a special error for the PreferencesLexer class.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self._errorMessage = QCoreApplication.translate(
-            "PreferencesLexerError",
-            "Unspecific PreferencesLexer error.")
-        
+            "PreferencesLexerError", "Unspecific PreferencesLexer error."
+        )
+
     def __repr__(self):
         """
         Special method returning a representation of the exception.
-        
+
         @return string representing the error message
         @rtype str
         """
         return repr(self._errorMessage)
-        
+
     def __str__(self):
         """
         Special method returning a string representation of the exception.
-        
+
         @return string representing the error message
         @rtype str
         """
@@ -49,17 +50,18 @@
     """
     Class defining a special error for the PreferencesLexer class.
     """
+
     def __init__(self, language):
         """
         Constructor
-        
+
         @param language lexer language
         @type str
         """
         PreferencesLexerError.__init__(self)
         self._errorMessage = QCoreApplication.translate(
-            "PreferencesLexerError",
-            'Unsupported Lexer Language: {0}').format(language)
+            "PreferencesLexerError", "Unsupported Lexer Language: {0}"
+        ).format(language)
 
 
 class PreferencesLexer(QObject):
@@ -67,10 +69,11 @@
     Class implementing a Lexer facade for the highlighting styles
     configuration.
     """
+
     def __init__(self, language, parent=None):
         """
         Constructor
-        
+
         @param language language of the lexer
         @type str
         @param parent parent widget of this lexer (QWidget)
@@ -78,7 +81,7 @@
             lexer language
         """
         super().__init__(parent)
-        
+
         # These default font families are taken from QScintilla
         if Globals.isWindowsPlatform():
             self.__defaultFontFamily = "Courier New"
@@ -86,18 +89,19 @@
             self.__defaultFontFamily = "Courier"
         else:
             self.__defaultFontFamily = "Bitstream Vera Sans Mono"
-        
+
         # instantiate a lexer object for the given language
         import QScintilla.Lexers
+
         self.__lex = QScintilla.Lexers.getLexer(language)
         if self.__lex is None:
             raise PreferencesLexerLanguageError(language)
-        
+
         # read the last stored values from preferences file
         self.__lex.readSettings(Preferences.getSettings(), "Scintilla")
         if self.__lex.hasSubstyles():
             self.__lex.loadSubstyles()
-    
+
     def writeSettings(self):
         """
         Public method to write the lexer settings.
@@ -105,17 +109,17 @@
         self.__lex.writeSettings(Preferences.getSettings(), "Scintilla")
         if self.__lex.hasSubstyles():
             self.__lex.writeSubstyles()
-    
+
     def getStyles(self):
         """
         Public method to get a list of all supported styles.
-        
+
         @return list of tuples each containing the description of the style,
             style number and sub-style number (or -1 for no sub-style)
         @rtype list of tuples of (str, int, int)
         """
         styles = []
-        
+
         for i in range(QsciScintillaBase.STYLE_MAX):
             desc = self.__lex.description(i)
             if desc:
@@ -125,13 +129,13 @@
                 for subStyle in range(self.__lex.substylesCount(baseStyle)):
                     desc = self.__lex.substyleDescription(baseStyle, subStyle)
                     styles.append((desc, baseStyle, subStyle))
-        
+
         return styles
-    
+
     def getSubStyles(self, style):
         """
         Public method to get a list of all sub-styles of a style.
-        
+
         @param style style number
         @type int
         @return list of tuples each containing the description of the style,
@@ -139,18 +143,18 @@
         @rtype list of tuples of (str, int, int)
         """
         styles = []
-        
+
         if self.isBaseStyle(style):
             for subStyle in range(self.__lex.substylesCount(style)):
                 desc = self.__lex.substyleDescription(style, subStyle)
                 styles.append((desc, style, subStyle))
-        
+
         return styles
-    
+
     def defaultColor(self, style, substyle=-1):
         """
         Public method to get the default color of a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -160,16 +164,16 @@
         """
         color = (
             self.__lex.substyleDefaultColor(style, substyle)
-            if substyle >= 0 else
-            self.__lex.defaultColor(style)
+            if substyle >= 0
+            else self.__lex.defaultColor(style)
         )
-        
+
         return color
-    
+
     def color(self, style, substyle=-1):
         """
         Public method to get the color of a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -179,16 +183,16 @@
         """
         color = (
             self.__lex.substyleColor(style, substyle)
-            if substyle >= 0 else
-            self.__lex.color(style)
+            if substyle >= 0
+            else self.__lex.color(style)
         )
-        
+
         return color
-    
+
     def setColor(self, c, style, substyle=-1):
         """
         Public method to set the color for a style.
-        
+
         @param c color
         @type QColor
         @param style style number
@@ -200,11 +204,11 @@
             self.__lex.setSubstyleColor(c, style, substyle)
         else:
             self.__lex.setColor(c, style)
-    
+
     def defaultPaper(self, style, substyle=-1):
         """
         Public method to get the default background for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -214,16 +218,16 @@
         """
         color = (
             self.__lex.substyleDefaultPaper(style, substyle)
-            if substyle >= 0 else
-            self.__lex.defaultPaper(style)
+            if substyle >= 0
+            else self.__lex.defaultPaper(style)
         )
-        
+
         return color
-    
+
     def paper(self, style, substyle=-1):
         """
         Public method to get the background for a style.
-        
+
         @param style the style number
         @type int
         @param substyle sub-style number
@@ -233,16 +237,16 @@
         """
         color = (
             self.__lex.substylePaper(style, substyle)
-            if substyle >= 0 else
-            self.__lex.paper(style)
+            if substyle >= 0
+            else self.__lex.paper(style)
         )
-        
+
         return color
-    
+
     def setPaper(self, c, style, substyle=-1):
         """
         Public method to set the background for a style.
-        
+
         @param c background color
         @type QColor
         @param style style number
@@ -254,11 +258,11 @@
             self.__lex.setSubstylePaper(c, style, substyle)
         else:
             self.__lex.setPaper(c, style)
-    
+
     def defaultEolFill(self, style, substyle=-1):
         """
         Public method to get the default eolFill flag for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -268,16 +272,16 @@
         """
         eolFill = (
             self.__lex.substyleDefaultEolFill(style, substyle)
-            if substyle >= 0 else
-            self.__lex.defaultEolFill(style)
+            if substyle >= 0
+            else self.__lex.defaultEolFill(style)
         )
-        
+
         return eolFill
-    
+
     def eolFill(self, style, substyle=-1):
         """
         Public method to get the eolFill flag for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -287,16 +291,16 @@
         """
         eolFill = (
             self.__lex.substyleEolFill(style, substyle)
-            if substyle >= 0 else
-            self.__lex.eolFill(style)
+            if substyle >= 0
+            else self.__lex.eolFill(style)
         )
-        
+
         return eolFill
-    
+
     def setEolFill(self, eolfill, style, substyle=-1):
         """
         Public method to set the eolFill flag for a style.
-        
+
         @param eolfill eolFill flag
         @type bool
         @param style style number
@@ -308,11 +312,11 @@
             self.__lex.setSubstyleEolFill(eolfill, style, substyle)
         else:
             self.__lex.setEolFill(eolfill, style)
-    
+
     def defaultFont(self, style, substyle=-1):
         """
         Public method to get the default font for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -322,16 +326,16 @@
         """
         font = (
             self.__lex.substyleDefaultFont(style, substyle)
-            if substyle >= 0 else
-            self.__lex.defaultFont(style)
+            if substyle >= 0
+            else self.__lex.defaultFont(style)
         )
-        
+
         return font
-    
+
     def font(self, style, substyle=-1):
         """
         Public method to get the font for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -341,16 +345,16 @@
         """
         font = (
             self.__lex.substyleFont(style, substyle)
-            if substyle >= 0 else
-            self.__lex.font(style)
+            if substyle >= 0
+            else self.__lex.font(style)
         )
-        
+
         return font
-    
+
     def setFont(self, f, style, substyle=-1):
         """
         Public method to set the font for a style.
-        
+
         @param f font
         @type QFont
         @param style style number
@@ -362,11 +366,11 @@
             self.__lex.setSubstyleFont(f, style, substyle)
         else:
             self.__lex.setFont(f, style)
-    
+
     def defaultWords(self, style, substyle=-1):
         """
         Public method to get the default list of words for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -375,17 +379,15 @@
         @rtype str
         """
         words = (
-            self.__lex.substyleDefaultWords(style, substyle)
-            if substyle >= 0 else
-            ""
+            self.__lex.substyleDefaultWords(style, substyle) if substyle >= 0 else ""
         )
-        
+
         return words
-    
+
     def words(self, style, substyle=-1):
         """
         Public method to get the list of words for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -393,15 +395,14 @@
         @return whitespace separated list of words
         @rtype str
         """
-        words = (self.__lex.substyleWords(style, substyle) if substyle >= 0
-                 else "")
-        
+        words = self.__lex.substyleWords(style, substyle) if substyle >= 0 else ""
+
         return words
-    
+
     def setWords(self, words, style, substyle=-1):
         """
         Public method to set the list of words for a style.
-        
+
         @param words whitespace separated list of words
         @type str
         @param style style number
@@ -412,11 +413,11 @@
         if substyle >= 0:
             # only supported for sub-styles
             self.__lex.setSubstyleWords(words, style, substyle)
-    
+
     def defaultDescription(self, style, substyle=-1):
         """
         Public method to get the default descriptive string for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -426,17 +427,18 @@
         """
         desc = (
             self.__lex.substyleDefaultDescription(style, substyle)
-            if substyle >= 0 else
+            if substyle >= 0
+            else
             # for base styles return the hard coded description
             self.__lex.description(style)
         )
-        
+
         return desc
-    
+
     def description(self, style, substyle=-1):
         """
         Public method to get a descriptive string for a style.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -446,16 +448,16 @@
         """
         desc = (
             self.__lex.substyleDescription(style, substyle)
-            if substyle >= 0 else
-            self.__lex.description(style)
+            if substyle >= 0
+            else self.__lex.description(style)
         )
-        
+
         return desc
-    
+
     def setDescription(self, description, style, substyle=-1):
         """
         Public method to set a descriptive string for a style.
-        
+
         @param description description for the style
         @type str
         @param style style number
@@ -466,20 +468,20 @@
         if substyle >= 0:
             # only supported for sub-styles
             self.__lex.setSubstyleDescription(description, style, substyle)
-    
+
     def language(self):
         """
         Public method to get the lexers programming language.
-        
+
         @return lexer programming language
         @rtype str
         """
         return self.__lex.language()
-    
+
     def hasStyle(self, style, substyle):
         """
         Public method to test for a given style definition.
-        
+
         @param style style number
         @type int
         @param substyle sub-style number
@@ -487,37 +489,36 @@
         @return flag indicating the existence of a style definition
         @rtype bool
         """
-        ok = (self.__lex.hasSubstyle(style, substyle) if substyle >= 0
-              else True)
-        
+        ok = self.__lex.hasSubstyle(style, substyle) if substyle >= 0 else True
+
         return ok
-    
+
     def isBaseStyle(self, style):
         """
         Public method to test, if a given style may have sub-styles.
-        
+
         @param style base style number
         @type int
         @return flag indicating that the style may have sub-styles
         @rtype bool
         """
         return self.__lex.hasSubstyles() and self.__lex.isBaseStyle(style)
-    
+
     def addSubstyle(self, style):
         """
         Public method to add an empty sub-style to a given style.
-        
+
         @param style style number
         @type int
         @return allocated sub-style number or -1 to indicate an error
         @rtype int
         """
         return self.__lex.addSubstyle(style)
-    
+
     def delSubstyle(self, style, substyle):
         """
         Public method to delete a given sub-style definition.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -526,11 +527,11 @@
         @rtype bool
         """
         return self.__lex.delSubstyle(style, substyle)
-    
+
     def loadDefaultSubStyles(self, style):
         """
         Public method to load the default sub-styles for a given base style.
-        
+
         @param style style number
         @type int
         """
--- a/src/eric7/Preferences/ProgramsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ProgramsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,11 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QProcess
 from PyQt6.QtWidgets import (
-    QApplication, QTreeWidgetItem, QHeaderView, QDialog, QDialogButtonBox
+    QApplication,
+    QTreeWidgetItem,
+    QHeaderView,
+    QDialog,
+    QDialogButtonBox,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -29,35 +33,37 @@
     """
     Class implementing the Programs page.
     """
+
     ToolAvailableRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent The parent widget of this dialog. (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setObjectName("ProgramsDialog")
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__hasSearched = False
-        
-        self.programsList.headerItem().setText(
-            self.programsList.columnCount(), "")
-        
+
+        self.programsList.headerItem().setText(self.programsList.columnCount(), "")
+
         self.searchButton = self.buttonBox.addButton(
-            self.tr("Search"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.searchButton.setToolTip(
-            self.tr("Press to search for programs"))
-        
-        self.showComboBox.addItems([
-            self.tr("All Supported Tools"),
-            self.tr("Available Tools Only"),
-            self.tr("Unavailable Tools Only"),
-        ])
-        
+            self.tr("Search"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.searchButton.setToolTip(self.tr("Press to search for programs"))
+
+        self.showComboBox.addItems(
+            [
+                self.tr("All Supported Tools"),
+                self.tr("Available Tools Only"),
+                self.tr("Unavailable Tools Only"),
+            ]
+        )
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -65,16 +71,16 @@
         QDialog.show(self)
         if not self.__hasSearched:
             self.on_programsSearchButton_clicked()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.searchButton:
             self.on_programsSearchButton_clicked()
-        
+
     @pyqtSlot()
     def on_programsSearchButton_clicked(self):
         """
@@ -84,124 +90,164 @@
         header = self.programsList.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(False)
-        
+
         with EricOverrideCursor():
             # 1. do the Qt programs
             # 1a. Translation Converter
             exe = (
-                Utilities.isWindowsPlatform() and
-                "{0}.exe".format(Utilities.generateQtToolName("lrelease")) or
-                Utilities.generateQtToolName("lrelease")
+                Utilities.isWindowsPlatform()
+                and "{0}.exe".format(Utilities.generateQtToolName("lrelease"))
+                or Utilities.generateQtToolName("lrelease")
             )
             exe = os.path.join(Utilities.getQtBinariesPath(), exe)
             version = self.__createProgramEntry(
-                self.tr("Translation Converter (Qt)"), exe, '-version',
-                'lrelease', -1)
+                self.tr("Translation Converter (Qt)"), exe, "-version", "lrelease", -1
+            )
             # 1b. Qt Designer
             if Utilities.isWindowsPlatform():
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    "{0}.exe".format(Utilities.generateQtToolName("designer")))
+                    "{0}.exe".format(Utilities.generateQtToolName("designer")),
+                )
             elif Utilities.isMacPlatform():
                 exe = Utilities.getQtMacBundle("designer")
             else:
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    Utilities.generateQtToolName("designer"))
-            self.__createProgramEntry(
-                self.tr("Qt Designer"), exe, version=version)
+                    Utilities.generateQtToolName("designer"),
+                )
+            self.__createProgramEntry(self.tr("Qt Designer"), exe, version=version)
             # 1c. Qt Linguist
             if Utilities.isWindowsPlatform():
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    "{0}.exe".format(Utilities.generateQtToolName("linguist")))
+                    "{0}.exe".format(Utilities.generateQtToolName("linguist")),
+                )
             elif Utilities.isMacPlatform():
                 exe = Utilities.getQtMacBundle("linguist")
             else:
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    Utilities.generateQtToolName("linguist"))
-            self.__createProgramEntry(
-                self.tr("Qt Linguist"), exe, version=version)
+                    Utilities.generateQtToolName("linguist"),
+                )
+            self.__createProgramEntry(self.tr("Qt Linguist"), exe, version=version)
             # 1d. Qt Assistant
             if Utilities.isWindowsPlatform():
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    "{0}.exe".format(
-                        Utilities.generateQtToolName("assistant")))
+                    "{0}.exe".format(Utilities.generateQtToolName("assistant")),
+                )
             elif Utilities.isMacPlatform():
                 exe = Utilities.getQtMacBundle("assistant")
             else:
                 exe = os.path.join(
                     Utilities.getQtBinariesPath(),
-                    Utilities.generateQtToolName("assistant"))
-            self.__createProgramEntry(
-                self.tr("Qt Assistant"), exe, version=version)
-            
+                    Utilities.generateQtToolName("assistant"),
+                )
+            self.__createProgramEntry(self.tr("Qt Assistant"), exe, version=version)
+
             # 2. do the PyQt programs
             # 2.1 do the PyQt5 programs
             # 2.1a. Translation Extractor PyQt5
             self.__createProgramEntry(
                 self.tr("Translation Extractor (Python, PyQt5)"),
                 Utilities.generatePyQtToolPath("pylupdate5"),
-                '-version', 'pylupdate', -1)
+                "-version",
+                "pylupdate",
+                -1,
+            )
             # 2.1b. Forms Compiler PyQt5
             self.__createProgramEntry(
                 self.tr("Forms Compiler (Python, PyQt5)"),
                 Utilities.generatePyQtToolPath("pyuic5", ["py3uic5"]),
-                '--version', 'Python User', 4)
+                "--version",
+                "Python User",
+                4,
+            )
             # 2.1c. Resource Compiler PyQt5
             self.__createProgramEntry(
                 self.tr("Resource Compiler (Python, PyQt5)"),
                 Utilities.generatePyQtToolPath("pyrcc5"),
-                '-version', '', -1, versionRe='Resource Compiler|pyrcc5')
-            
+                "-version",
+                "",
+                -1,
+                versionRe="Resource Compiler|pyrcc5",
+            )
+
             # 2.2 do the PyQt6 programs
             # 2.2a. Translation Extractor PyQt6
             self.__createProgramEntry(
                 self.tr("Translation Extractor (Python, PyQt6)"),
                 Utilities.generatePyQtToolPath("pylupdate6"),
-                '--version', versionPosition=0)
+                "--version",
+                versionPosition=0,
+            )
             # 2.2b. Forms Compiler PyQt6
             self.__createProgramEntry(
                 self.tr("Forms Compiler (Python, PyQt6)"),
                 Utilities.generatePyQtToolPath("pyuic6"),
-                '--version', versionPosition=0)
-            
+                "--version",
+                versionPosition=0,
+            )
+
             # 3. do the PySide programs
             # 3.1 do the PySide2 programs
             # 3.1a. Translation Extractor PySide2
             self.__createProgramEntry(
                 self.tr("Translation Extractor (Python, PySide2)"),
                 Utilities.generatePySideToolPath("pyside2-lupdate", variant=2),
-                '-version', '', -1, versionRe='lupdate')
+                "-version",
+                "",
+                -1,
+                versionRe="lupdate",
+            )
             # 3.1b. Forms Compiler PySide2
             self.__createProgramEntry(
                 self.tr("Forms Compiler (Python, PySide2)"),
                 Utilities.generatePySideToolPath("pyside2-uic", variant=2),
-                '--version', '', -1, versionRe='uic')
+                "--version",
+                "",
+                -1,
+                versionRe="uic",
+            )
             # 3.1c Resource Compiler PySide2
             self.__createProgramEntry(
                 self.tr("Resource Compiler (Python, PySide2)"),
                 Utilities.generatePySideToolPath("pyside2-rcc", variant=2),
-                '-version', '', -1, versionRe='rcc')
+                "-version",
+                "",
+                -1,
+                versionRe="rcc",
+            )
             # 3.2 do the PySide5 programs
             # 3.2a. Translation Extractor PySide6
             self.__createProgramEntry(
                 self.tr("Translation Extractor (Python, PySide6)"),
                 Utilities.generatePySideToolPath("pyside6-lupdate", variant=6),
-                '-version', '', -1, versionRe='lupdate')
+                "-version",
+                "",
+                -1,
+                versionRe="lupdate",
+            )
             # 3.2b. Forms Compiler PySide6
             self.__createProgramEntry(
                 self.tr("Forms Compiler (Python, PySide6)"),
                 Utilities.generatePySideToolPath("pyside6-uic", variant=6),
-                '--version', '', -1, versionRe='uic')
+                "--version",
+                "",
+                -1,
+                versionRe="uic",
+            )
             # 3.2c Resource Compiler PySide6
             self.__createProgramEntry(
                 self.tr("Resource Compiler (Python, PySide6)"),
                 Utilities.generatePySideToolPath("pyside6-rcc", variant=6),
-                '--version', '', -1, versionRe='rcc')
-            
+                "--version",
+                "",
+                -1,
+                versionRe="rcc",
+            )
+
             # 4. do the Conda program(s)
             exe = Preferences.getConda("CondaExecutable")
             if not exe:
@@ -209,17 +255,22 @@
                 if Utilities.isWindowsPlatform():
                     exe += ".exe"
             self.__createProgramEntry(
-                self.tr("conda Manager"), exe, '--version', 'conda', -1)
-            
+                self.tr("conda Manager"), exe, "--version", "conda", -1
+            )
+
             # 5. do the pip program(s)
             virtualenvManager = ericApp().getObject("VirtualEnvManager")
             for venvName in virtualenvManager.getVirtualenvNames():
-                interpreter = virtualenvManager.getVirtualenvInterpreter(
-                    venvName)
+                interpreter = virtualenvManager.getVirtualenvInterpreter(venvName)
                 self.__createProgramEntry(
-                    self.tr("PyPI Package Management"), interpreter,
-                    '--version', 'pip', 1, exeModule=["-m", "pip"])
-            
+                    self.tr("PyPI Package Management"),
+                    interpreter,
+                    "--version",
+                    "pip",
+                    1,
+                    exeModule=["-m", "pip"],
+                )
+
             # 6. do the CORBA and Protobuf programs
             # 6a. omniORB
             exe = Preferences.getCorba("omniidl")
@@ -228,7 +279,8 @@
                 if Utilities.isWindowsPlatform():
                     exe += ".exe"
             self.__createProgramEntry(
-                self.tr("CORBA IDL Compiler"), exe, '-V', 'omniidl', -1)
+                self.tr("CORBA IDL Compiler"), exe, "-V", "omniidl", -1
+            )
             # 6b. protobuf
             exe = Preferences.getProtobuf("protoc")
             if not exe:
@@ -236,19 +288,25 @@
                 if Utilities.isWindowsPlatform():
                     exe += ".exe"
             self.__createProgramEntry(
-                self.tr("Protobuf Compiler"), exe, '--version', 'libprotoc',
-                -1)
+                self.tr("Protobuf Compiler"), exe, "--version", "libprotoc", -1
+            )
             # 6c. grpc
             exe = Preferences.getProtobuf("grpcPython")
             if not exe:
                 exe = Globals.getPythonExecutable()
             self.__createProgramEntry(
-                self.tr("gRPC Compiler"), exe, '--version', 'libprotoc', -1,
-                exeModule=['-m', 'grpc_tools.protoc'])
-            
+                self.tr("gRPC Compiler"),
+                exe,
+                "--version",
+                "libprotoc",
+                -1,
+                exeModule=["-m", "grpc_tools.protoc"],
+            )
+
             # 7. do the spell checking entry
             try:
                 import enchant
+
                 try:
                     text = os.path.dirname(enchant.__file__)
                 except AttributeError:
@@ -260,12 +318,12 @@
             except (ImportError, AttributeError, OSError):
                 text = "enchant"
                 version = ""
-            self.__createEntry(
-                self.tr("Spell Checker - PyEnchant"), text, version)
-            
+            self.__createEntry(self.tr("Spell Checker - PyEnchant"), text, version)
+
             # 8. do the pygments entry
             try:
                 import pygments
+
                 try:
                     text = os.path.dirname(pygments.__file__)
                 except AttributeError:
@@ -277,30 +335,42 @@
             except (ImportError, AttributeError, OSError):
                 text = "pygments"
                 version = ""
-            self.__createEntry(
-                self.tr("Source Highlighter - Pygments"), text, version)
-            
+            self.__createEntry(self.tr("Source Highlighter - Pygments"), text, version)
+
             # 9. do the MicroPython related entries
             exe = Preferences.getMicroPython("MpyCrossCompiler")
             if not exe:
                 exe = "mpy-cross"
             self.__createProgramEntry(
-                self.tr("MicroPython - MPY Cross Compiler"), exe, '--version',
-                'MicroPython', 1)
+                self.tr("MicroPython - MPY Cross Compiler"),
+                exe,
+                "--version",
+                "MicroPython",
+                1,
+            )
             self.__createProgramEntry(
                 self.tr("MicroPython - ESP Tool"),
-                Globals.getPythonExecutable(), 'version',
-                'esptool', -1, exeModule=['-m', 'esptool'])
+                Globals.getPythonExecutable(),
+                "version",
+                "esptool",
+                -1,
+                exeModule=["-m", "esptool"],
+            )
             exe = Preferences.getMicroPython("DfuUtilPath")
             if not exe:
                 exe = "dfu-util"
             self.__createProgramEntry(
-                self.tr("MicroPython - PyBoard Flasher"), exe, '--version',
-                'dfu-util', -1)
-            
+                self.tr("MicroPython - PyBoard Flasher"),
+                exe,
+                "--version",
+                "dfu-util",
+                -1,
+            )
+
             # 10. do the jedi related entries
             try:
                 import jedi
+
                 try:
                     text = os.path.dirname(jedi.__file__)
                 except AttributeError:
@@ -312,9 +382,8 @@
             except (ImportError, AttributeError, OSError):
                 text = "jedi"
                 version = ""
-            self.__createEntry(
-                self.tr("Code Assistant - Jedi"), text, version)
-            
+            self.__createEntry(self.tr("Code Assistant - Jedi"), text, version)
+
             # 11. do the plugin related programs
             pm = ericApp().getObject("PluginManager")
             for info in pm.getPluginExeDisplayData():
@@ -335,26 +404,28 @@
                         exeModule=info["exeModule"],
                     )
                 else:
-                    self.__createEntry(
-                        info["header"],
-                        info["text"],
-                        info["version"]
-                    )
-            
+                    self.__createEntry(info["header"], info["text"], info["version"])
+
             self.programsList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-            self.on_showComboBox_currentIndexChanged(
-                self.showComboBox.currentIndex())
-        
+            self.on_showComboBox_currentIndexChanged(self.showComboBox.currentIndex())
+
         self.__hasSearched = True
 
-    def __createProgramEntry(self, description, exe,
-                             versionCommand="", versionStartsWith="",
-                             versionPosition=None, version="",
-                             versionCleanup=None, versionRe=None,
-                             exeModule=None):
+    def __createProgramEntry(
+        self,
+        description,
+        exe,
+        versionCommand="",
+        versionStartsWith="",
+        versionPosition=None,
+        version="",
+        versionCleanup=None,
+        versionRe=None,
+        exeModule=None,
+    ):
         """
         Private method to generate a program entry.
-        
+
         @param description descriptive text (string)
         @param exe name of the executable program (string)
         @param versionCommand command line switch to get the version info
@@ -374,11 +445,10 @@
         @return version string of detected or given version (string)
         """
         itmList = self.programsList.findItems(
-            description, Qt.MatchFlag.MatchCaseSensitive)
+            description, Qt.MatchFlag.MatchCaseSensitive
+        )
         itm = (
-            itmList[0]
-            if itmList else
-            QTreeWidgetItem(self.programsList, [description])
+            itmList[0] if itmList else QTreeWidgetItem(self.programsList, [description])
         )
         font = itm.font(0)
         font.setBold(True)
@@ -397,7 +467,8 @@
                 if versionCommand and versionPosition is not None:
                     proc = QProcess()
                     proc.setProcessChannelMode(
-                        QProcess.ProcessChannelMode.MergedChannels)
+                        QProcess.ProcessChannelMode.MergedChannels
+                    )
                     if exeModule:
                         args = exeModule[:] + [versionCommand]
                     else:
@@ -405,36 +476,36 @@
                     proc.start(exe, args)
                     finished = proc.waitForFinished(10000)
                     if finished:
-                        output = str(proc.readAllStandardOutput(),
-                                     Preferences.getSystem("IOEncoding"),
-                                     'replace')
+                        output = str(
+                            proc.readAllStandardOutput(),
+                            Preferences.getSystem("IOEncoding"),
+                            "replace",
+                        )
                         if (
-                            exeModule and
-                            exeModule[0] == "-m" and
-                            ("ImportError:" in output or
-                             "ModuleNotFoundError:" in output or
-                             proc.exitCode() != 0)
+                            exeModule
+                            and exeModule[0] == "-m"
+                            and (
+                                "ImportError:" in output
+                                or "ModuleNotFoundError:" in output
+                                or proc.exitCode() != 0
+                            )
                         ):
                             version = self.tr("(module not found)")
                             available = False
                         elif not versionStartsWith and not versionRe:
                             # assume output is just one line
                             try:
-                                version = (
-                                    output.strip().split()[versionPosition]
-                                )
+                                version = output.strip().split()[versionPosition]
                                 if versionCleanup:
                                     version = version[
-                                        versionCleanup[0]:
-                                        versionCleanup[1]
+                                        versionCleanup[0] : versionCleanup[1]
                                     ]
                             except IndexError:
                                 version = self.tr("(unknown)")
                                 available = False
                         else:
                             if versionRe is None:
-                                versionRe = "^{0}".format(
-                                    re.escape(versionStartsWith))
+                                versionRe = "^{0}".format(re.escape(versionStartsWith))
                             versionRe = re.compile(versionRe, re.UNICODE)
                             for line in output.splitlines():
                                 if versionRe.search(line):
@@ -442,8 +513,7 @@
                                         version = line.split()[versionPosition]
                                         if versionCleanup:
                                             version = version[
-                                                versionCleanup[0]:
-                                                versionCleanup[1]
+                                                versionCleanup[0] : versionCleanup[1]
                                             ]
                                         break
                                     except IndexError:
@@ -456,9 +526,9 @@
                         version = self.tr("(not executable)")
                         available = False
                 if exeModule:
-                    citm = QTreeWidgetItem(itm, [
-                        "{0} {1}".format(exe, " ".join(exeModule)),
-                        version])
+                    citm = QTreeWidgetItem(
+                        itm, ["{0} {1}".format(exe, " ".join(exeModule)), version]
+                    )
                 else:
                     citm = QTreeWidgetItem(itm, [exe, version])
                 citm.setData(0, self.ToolAvailableRole, available)
@@ -467,20 +537,20 @@
                 if itm.childCount() == 0:
                     itm.setText(1, self.tr("(not found)"))
                 else:
-                    citm = QTreeWidgetItem(
-                        itm, [rememberedExe, self.tr("(not found)")])
+                    citm = QTreeWidgetItem(itm, [rememberedExe, self.tr("(not found)")])
                     citm.setData(0, self.ToolAvailableRole, False)
                     itm.setExpanded(True)
         QApplication.processEvents()
         self.programsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.programsList.header().setStretchLastSection(True)
         return version
-        
+
     def __createEntry(self, description, entryText, entryVersion):
         """
         Private method to generate a program entry.
-        
+
         @param description descriptive text (string)
         @param entryText text to show (string)
         @param entryVersion version string to show (string).
@@ -489,25 +559,25 @@
         font = itm.font(0)
         font.setBold(True)
         itm.setFont(0, font)
-        
+
         if len(entryVersion):
             citm = QTreeWidgetItem(itm, [entryText, entryVersion])
             itm.setExpanded(True)
-            citm.setData(0, self.ToolAvailableRole,
-                         not entryVersion.startswith("("))
+            citm.setData(0, self.ToolAvailableRole, not entryVersion.startswith("("))
             # assume version starting with '(' is an unavailability
         else:
             itm.setText(1, self.tr("(not found)"))
         QApplication.processEvents()
         self.programsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.programsList.header().setStretchLastSection(True)
-    
+
     @pyqtSlot(int)
     def on_showComboBox_currentIndexChanged(self, index):
         """
         Private slot to apply the selected show criteria.
-        
+
         @param index index of the show criterium
         @type int
         """
--- a/src/eric7/Preferences/ShortcutDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ShortcutDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,16 +17,17 @@
 class ShortcutDialog(QDialog, Ui_ShortcutDialog):
     """
     Class implementing a dialog for the configuration of a keyboard shortcut.
-    
+
     @signal shortcutChanged(QKeySequence, QKeySequence, bool, string) emitted
         after the OK button was pressed
     """
+
     shortcutChanged = pyqtSignal(QKeySequence, QKeySequence, bool, str)
-    
+
     def __init__(self, parent=None, name=None, modal=False):
         """
         Constructor
-        
+
         @param parent The parent widget of this dialog. (QWidget)
         @param name The name of this dialog. (string)
         @param modal Flag indicating a modal dialog. (boolean)
@@ -37,17 +38,17 @@
         self.setModal(modal)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__clearKeys()
-        
+
         self.noCheck = False
         self.objectType = ""
-        
+
         self.primaryClearButton.clicked.connect(self.__clear)
         self.alternateClearButton.clicked.connect(self.__clear)
         self.primaryButton.clicked.connect(self.__typeChanged)
         self.alternateButton.clicked.connect(self.__typeChanged)
-        
+
         self.shortcutsGroup.installEventFilter(self)
         self.primaryButton.installEventFilter(self)
         self.alternateButton.installEventFilter(self)
@@ -55,15 +56,17 @@
         self.alternateClearButton.installEventFilter(self)
         self.keyEdit.installEventFilter(self)
         self.alternateKeyEdit.installEventFilter(self)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).installEventFilter(
+            self
+        )
         self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).installEventFilter(self)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).installEventFilter(self)
-        
+            QDialogButtonBox.StandardButton.Cancel
+        ).installEventFilter(self)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __clearKeys(self):
         """
         Private method to clear the list of recorded keys.
@@ -73,13 +76,13 @@
             QKeyCombination(),
             QKeyCombination(),
             QKeyCombination(),
-            QKeyCombination()
+            QKeyCombination(),
         ]
-    
+
     def setKeys(self, key, alternateKey, noCheck, objectType):
         """
         Public method to set the key to be configured.
-        
+
         @param key key sequence to be changed (QKeySequence)
         @param alternateKey alternate key sequence to be changed (QKeySequence)
         @param noCheck flag indicating that no uniqueness check should
@@ -87,13 +90,13 @@
         @param objectType type of the object (string).
         """
         self.__clearKeys()
-        
+
         self.keyEdit.setText(key.toString())
         self.alternateKeyEdit.setText(alternateKey.toString())
         self.primaryButton.setChecked(True)
         self.noCheck = noCheck
         self.objectType = objectType
-        
+
     def on_buttonBox_accepted(self):
         """
         Private slot to handle the OK button press.
@@ -102,7 +105,9 @@
         self.shortcutChanged.emit(
             QKeySequence(self.keyEdit.text()),
             QKeySequence(self.alternateKeyEdit.text()),
-            self.noCheck, self.objectType)
+            self.noCheck,
+            self.objectType,
+        )
 
     def __clear(self):
         """
@@ -110,28 +115,28 @@
         """
         self.__clearKeys()
         self.__setKeyEditText("")
-        
+
     def __typeChanged(self):
         """
         Private slot to handle the change of the shortcuts type.
         """
         self.__clearKeys()
-        
+
     def __setKeyEditText(self, txt):
         """
         Private method to set the text of a key edit.
-        
+
         @param txt text to be set (string)
         """
         if self.primaryButton.isChecked():
             self.keyEdit.setText(txt)
         else:
             self.alternateKeyEdit.setText(txt)
-        
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched the QObject being watched
         @param event the event that occurred
         @return always False
@@ -139,38 +144,43 @@
         if event.type() == QEvent.Type.KeyPress:
             self.keyPressEvent(event)
             return True
-            
+
         return False
-        
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle a key press event.
-        
+
         @param evt the key event (QKeyEvent)
         """
         if evt.key() in [
-            Qt.Key.Key_Control, Qt.Key.Key_Meta, Qt.Key.Key_Shift,
-            Qt.Key.Key_Alt, Qt.Key.Key_Menu,
-            Qt.Key.Key_Hyper_L, Qt.Key.Key_Hyper_R,
-            Qt.Key.Key_Super_L, Qt.Key.Key_Super_R
+            Qt.Key.Key_Control,
+            Qt.Key.Key_Meta,
+            Qt.Key.Key_Shift,
+            Qt.Key.Key_Alt,
+            Qt.Key.Key_Menu,
+            Qt.Key.Key_Hyper_L,
+            Qt.Key.Key_Hyper_R,
+            Qt.Key.Key_Super_L,
+            Qt.Key.Key_Super_R,
         ]:
             return
-    
+
         if self.keyIndex == 4:
             self.__clearKeys()
-    
+
         if (
-            evt.key() == Qt.Key.Key_Backtab and
-            evt.modifiers() & Qt.KeyboardModifier.ShiftModifier
+            evt.key() == Qt.Key.Key_Backtab
+            and evt.modifiers() & Qt.KeyboardModifier.ShiftModifier
         ):
-            self.keys[self.keyIndex] = QKeyCombination(evt.modifiers(),
-                                                       Qt.Key.Key_Tab)
+            self.keys[self.keyIndex] = QKeyCombination(evt.modifiers(), Qt.Key.Key_Tab)
         else:
-            self.keys[self.keyIndex] = QKeyCombination(evt.modifiers(),
-                                                       Qt.Key(evt.key()))
-        
+            self.keys[self.keyIndex] = QKeyCombination(
+                evt.modifiers(), Qt.Key(evt.key())
+            )
+
         self.keyIndex += 1
-        
+
         if self.keyIndex == 1:
             ks = QKeySequence(self.keys[0])
         elif self.keyIndex == 2:
@@ -178,8 +188,5 @@
         elif self.keyIndex == 3:
             ks = QKeySequence(self.keys[0], self.keys[1], self.keys[2])
         elif self.keyIndex == 4:
-            ks = QKeySequence(
-                self.keys[0], self.keys[1], self.keys[2], self.keys[3])
-        self.__setKeyEditText(
-            ks.toString(QKeySequence.SequenceFormat.NativeText)
-        )
+            ks = QKeySequence(self.keys[0], self.keys[1], self.keys[2], self.keys[3])
+        self.__setKeyEditText(ks.toString(QKeySequence.SequenceFormat.NativeText))
--- a/src/eric7/Preferences/Shortcuts.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/Shortcuts.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,18 +21,20 @@
 def __readShortcut(act, category, prefClass):
     """
     Private function to read a single keyboard shortcut from the settings.
-    
+
     @param act reference to the action object (EricAction)
     @param category category the action belongs to (string)
     @param prefClass preferences class used as the storage area
     """
     if act.objectName():
         accel = prefClass.settings.value(
-            "Shortcuts/{0}/{1}/Accel".format(category, act.objectName()))
+            "Shortcuts/{0}/{1}/Accel".format(category, act.objectName())
+        )
         if accel is not None:
             act.setShortcut(QKeySequence(accel))
         accel = prefClass.settings.value(
-            "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName()))
+            "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName())
+        )
         if accel is not None:
             act.setAlternateShortcut(QKeySequence(accel), removeEmpty=True)
 
@@ -40,7 +42,7 @@
 def readShortcuts(prefClass=Prefs, helpViewer=None, pluginName=None):
     """
     Module function to read the keyboard shortcuts for the defined QActions.
-    
+
     @param prefClass preferences class used as the storage area
     @param helpViewer reference to the help window object
     @param pluginName name of the plugin for which to load shortcuts
@@ -49,53 +51,53 @@
     if helpViewer is None and pluginName is None:
         for act in ericApp().getObject("Project").getActions():
             __readShortcut(act, "Project", prefClass)
-        
-        for act in ericApp().getObject("UserInterface").getActions('ui'):
+
+        for act in ericApp().getObject("UserInterface").getActions("ui"):
             __readShortcut(act, "General", prefClass)
-        
-        for act in ericApp().getObject("UserInterface").getActions('wizards'):
+
+        for act in ericApp().getObject("UserInterface").getActions("wizards"):
             __readShortcut(act, "Wizards", prefClass)
-        
+
         for act in ericApp().getObject("DebugUI").getActions():
             __readShortcut(act, "Debug", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('edit'):
+
+        for act in ericApp().getObject("ViewManager").getActions("edit"):
             __readShortcut(act, "Edit", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('file'):
+
+        for act in ericApp().getObject("ViewManager").getActions("file"):
             __readShortcut(act, "File", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('search'):
+
+        for act in ericApp().getObject("ViewManager").getActions("search"):
             __readShortcut(act, "Search", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('view'):
+
+        for act in ericApp().getObject("ViewManager").getActions("view"):
             __readShortcut(act, "View", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('macro'):
+
+        for act in ericApp().getObject("ViewManager").getActions("macro"):
             __readShortcut(act, "Macro", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('bookmark'):
+
+        for act in ericApp().getObject("ViewManager").getActions("bookmark"):
             __readShortcut(act, "Bookmarks", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('spelling'):
+
+        for act in ericApp().getObject("ViewManager").getActions("spelling"):
             __readShortcut(act, "Spelling", prefClass)
-        
-        actions = ericApp().getObject("ViewManager").getActions('window')
+
+        actions = ericApp().getObject("ViewManager").getActions("window")
         if actions:
             for act in actions:
                 __readShortcut(act, "Window", prefClass)
-        
+
         for category, ref in ericApp().getPluginObjects():
             if hasattr(ref, "getActions"):
                 actions = ref.getActions()
                 for act in actions:
                     __readShortcut(act, category, prefClass)
-    
+
     if helpViewer is not None:
         helpViewerCategory = helpViewer.getActionsCategory()
         for act in helpViewer.getActions():
             __readShortcut(act, helpViewerCategory, prefClass)
-    
+
     if pluginName is not None:
         with contextlib.suppress(KeyError):
             ref = ericApp().getPluginObject(pluginName)
@@ -103,12 +105,12 @@
                 actions = ref.getActions()
                 for act in actions:
                     __readShortcut(act, pluginName, prefClass)
-    
+
 
 def __saveShortcut(act, category, prefClass):
     """
     Private function to write a single keyboard shortcut to the settings.
-    
+
     @param act reference to the action object (EricAction)
     @param category category the action belongs to (string)
     @param prefClass preferences class used as the storage area
@@ -116,16 +118,18 @@
     if act.objectName():
         prefClass.settings.setValue(
             "Shortcuts/{0}/{1}/Accel".format(category, act.objectName()),
-            act.shortcut().toString())
+            act.shortcut().toString(),
+        )
         prefClass.settings.setValue(
             "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName()),
-            act.alternateShortcut().toString())
+            act.alternateShortcut().toString(),
+        )
 
 
 def saveShortcuts(prefClass=Prefs, helpViewer=None):
     """
     Module function to write the keyboard shortcuts for the defined QActions.
-    
+
     @param prefClass preferences class used as the storage area
     @param helpViewer reference to the help window object
     """
@@ -134,62 +138,60 @@
         prefClass.settings.beginGroup("Shortcuts")
         prefClass.settings.remove("")
         prefClass.settings.endGroup()
-        
+
         # step 2: save the various shortcuts
         for act in ericApp().getObject("Project").getActions():
             __saveShortcut(act, "Project", prefClass)
-        
-        for act in ericApp().getObject("UserInterface").getActions('ui'):
+
+        for act in ericApp().getObject("UserInterface").getActions("ui"):
             __saveShortcut(act, "General", prefClass)
-        
-        for act in ericApp().getObject("UserInterface").getActions('wizards'):
+
+        for act in ericApp().getObject("UserInterface").getActions("wizards"):
             __saveShortcut(act, "Wizards", prefClass)
-        
+
         for act in ericApp().getObject("DebugUI").getActions():
             __saveShortcut(act, "Debug", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('edit'):
+
+        for act in ericApp().getObject("ViewManager").getActions("edit"):
             __saveShortcut(act, "Edit", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('file'):
+
+        for act in ericApp().getObject("ViewManager").getActions("file"):
             __saveShortcut(act, "File", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('search'):
+
+        for act in ericApp().getObject("ViewManager").getActions("search"):
             __saveShortcut(act, "Search", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('view'):
+
+        for act in ericApp().getObject("ViewManager").getActions("view"):
             __saveShortcut(act, "View", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('macro'):
+
+        for act in ericApp().getObject("ViewManager").getActions("macro"):
             __saveShortcut(act, "Macro", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('bookmark'):
+
+        for act in ericApp().getObject("ViewManager").getActions("bookmark"):
             __saveShortcut(act, "Bookmarks", prefClass)
-        
-        for act in ericApp().getObject("ViewManager").getActions('spelling'):
+
+        for act in ericApp().getObject("ViewManager").getActions("spelling"):
             __saveShortcut(act, "Spelling", prefClass)
-        
-        actions = ericApp().getObject("ViewManager").getActions('window')
+
+        actions = ericApp().getObject("ViewManager").getActions("window")
         if actions:
             for act in actions:
                 __saveShortcut(act, "Window", prefClass)
-        
+
         for category, ref in ericApp().getPluginObjects():
             if hasattr(ref, "getActions"):
                 actions = ref.getActions()
                 for act in actions:
                     __saveShortcut(act, category, prefClass)
-    
+
     else:
         helpViewerCategory = helpViewer.getActionsCategory()
-        
+
         # step 1: clear all previously saved shortcuts
-        prefClass.settings.beginGroup(
-            "Shortcuts/{0}".format(helpViewerCategory)
-        )
+        prefClass.settings.beginGroup("Shortcuts/{0}".format(helpViewerCategory))
         prefClass.settings.remove("")
         prefClass.settings.endGroup()
-        
+
         # step 2: save the shortcuts
         for act in helpViewer.getActions():
             __saveShortcut(act, helpViewerCategory, prefClass)
@@ -198,7 +200,7 @@
 def exportShortcuts(fn, helpViewer=None):
     """
     Module function to export the keyboard shortcuts for the defined QActions.
-    
+
     @param fn filename of the export file
     @type str
     @param helpViewer reference to the help window object
@@ -207,8 +209,9 @@
     # let the plugin manager create on demand plugin objects
     pm = ericApp().getObject("PluginManager")
     pm.initOnDemandPlugins()
-    
+
     from .ShortcutsFile import ShortcutsFile
+
     shortcutsFile = ShortcutsFile()
     shortcutsFile.writeFile(fn, helpViewer)
 
@@ -216,7 +219,7 @@
 def importShortcuts(fn, helpViewer=None):
     """
     Module function to import the keyboard shortcuts for the defined actions.
-    
+
     @param fn filename of the import file
     @type str
     @param helpViewer reference to the help window object
@@ -225,10 +228,11 @@
     # let the plugin manager create on demand plugin objects
     pm = ericApp().getObject("PluginManager")
     pm.initOnDemandPlugins()
-    
+
     if fn.endswith(".ekj"):
         # new JSON based file
         from .ShortcutsFile import ShortcutsFile
+
         shortcutsFile = ShortcutsFile()
         shortcuts = shortcutsFile.readFile(fn)
         if shortcuts:
@@ -240,6 +244,7 @@
         f = QFile(fn)
         if f.open(QIODevice.OpenModeFlag.ReadOnly):
             from EricXML.ShortcutsReader import ShortcutsReader
+
             reader = ShortcutsReader(f)
             reader.readXML()
             f.close()
@@ -251,19 +256,19 @@
         else:
             EricMessageBox.critical(
                 None,
-                QCoreApplication.translate(
-                    "Shortcuts", "Import Keyboard Shortcuts"),
+                QCoreApplication.translate("Shortcuts", "Import Keyboard Shortcuts"),
                 QCoreApplication.translate(
                     "Shortcuts",
                     "<p>The keyboard shortcuts file <b>{0}</b> could not be"
-                    " read.</p>")
-                .format(fn))
+                    " read.</p>",
+                ).format(fn),
+            )
 
 
 def __setAction(actions, shortcutsDict):
     """
     Private function to set a single keyboard shortcut category shortcuts.
-    
+
     @param actions list of actions to set
     @type list of EricAction
     @param shortcutsDict dictionary containing accelerator information for
@@ -275,14 +280,13 @@
             with contextlib.suppress(KeyError):
                 accel, altAccel = shortcutsDict[act.objectName()]
                 act.setShortcut(QKeySequence(accel))
-                act.setAlternateShortcut(QKeySequence(altAccel),
-                                         removeEmpty=True)
+                act.setAlternateShortcut(QKeySequence(altAccel), removeEmpty=True)
 
 
 def setActions(shortcuts, helpViewer=None):
     """
     Module function to set actions based on the imported shortcuts file.
-    
+
     @param shortcuts dictionary containing the accelerator information
         read from a JSON or XML file
     @type dict
@@ -292,69 +296,73 @@
     if helpViewer is None:
         if "Project" in shortcuts:
             __setAction(
-                ericApp().getObject("Project").getActions(),
-                shortcuts["Project"])
-        
+                ericApp().getObject("Project").getActions(), shortcuts["Project"]
+            )
+
         if "General" in shortcuts:
             __setAction(
-                ericApp().getObject("UserInterface").getActions('ui'),
-                shortcuts["General"])
-        
+                ericApp().getObject("UserInterface").getActions("ui"),
+                shortcuts["General"],
+            )
+
         if "Wizards" in shortcuts:
             __setAction(
-                ericApp().getObject("UserInterface").getActions('wizards'),
-                shortcuts["Wizards"])
-        
+                ericApp().getObject("UserInterface").getActions("wizards"),
+                shortcuts["Wizards"],
+            )
+
         if "Debug" in shortcuts:
-            __setAction(
-                ericApp().getObject("DebugUI").getActions(),
-                shortcuts["Debug"])
-        
+            __setAction(ericApp().getObject("DebugUI").getActions(), shortcuts["Debug"])
+
         if "Edit" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('edit'),
-                shortcuts["Edit"])
-        
+                ericApp().getObject("ViewManager").getActions("edit"), shortcuts["Edit"]
+            )
+
         if "File" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('file'),
-                shortcuts["File"])
-        
+                ericApp().getObject("ViewManager").getActions("file"), shortcuts["File"]
+            )
+
         if "Search" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('search'),
-                shortcuts["Search"])
-        
+                ericApp().getObject("ViewManager").getActions("search"),
+                shortcuts["Search"],
+            )
+
         if "View" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('view'),
-                shortcuts["View"])
-        
+                ericApp().getObject("ViewManager").getActions("view"), shortcuts["View"]
+            )
+
         if "Macro" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('macro'),
-                shortcuts["Macro"])
-        
+                ericApp().getObject("ViewManager").getActions("macro"),
+                shortcuts["Macro"],
+            )
+
         if "Bookmarks" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('bookmark'),
-                shortcuts["Bookmarks"])
-        
+                ericApp().getObject("ViewManager").getActions("bookmark"),
+                shortcuts["Bookmarks"],
+            )
+
         if "Spelling" in shortcuts:
             __setAction(
-                ericApp().getObject("ViewManager").getActions('spelling'),
-                shortcuts["Spelling"])
-        
+                ericApp().getObject("ViewManager").getActions("spelling"),
+                shortcuts["Spelling"],
+            )
+
         if "Window" in shortcuts:
-            actions = ericApp().getObject("ViewManager").getActions('window')
+            actions = ericApp().getObject("ViewManager").getActions("window")
             if actions:
                 __setAction(actions, shortcuts["Window"])
-        
+
         for category, ref in ericApp().getPluginObjects():
             if category in shortcuts and hasattr(ref, "getActions"):
                 actions = ref.getActions()
                 __setAction(actions, shortcuts[category])
-    
+
     else:
         category = helpViewer.getActionsCategory()
         if category in shortcuts:
--- a/src/eric7/Preferences/ShortcutsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ShortcutsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,70 +27,71 @@
     """
     Class implementing a dialog for the configuration of eric's keyboard
     shortcuts.
-    
+
     @signal updateShortcuts() emitted when the user pressed the dialogs OK
         button
     """
+
     updateShortcuts = pyqtSignal()
-    
+
     objectNameRole = Qt.ItemDataRole.UserRole
     noCheckRole = Qt.ItemDataRole.UserRole + 1
     objectTypeRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this dialog
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__helpViewer = None
-        
-        self.shortcutsList.headerItem().setText(
-            self.shortcutsList.columnCount(), "")
-        self.shortcutsList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+
+        self.shortcutsList.headerItem().setText(self.shortcutsList.columnCount(), "")
+        self.shortcutsList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
+
         from .ShortcutDialog import ShortcutDialog
+
         self.shortcutDialog = ShortcutDialog()
         self.shortcutDialog.shortcutChanged.connect(self.__shortcutChanged)
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.shortcutsList.sortItems(
             self.shortcutsList.sortColumn(),
-            self.shortcutsList.header().sortIndicatorOrder())
-        
+            self.shortcutsList.header().sortIndicatorOrder(),
+        )
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.shortcutsList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.shortcutsList.header().setStretchLastSection(True)
-        
+
     def __generateCategoryItem(self, title):
         """
         Private method to generate a category item.
-        
+
         @param title title for the item (string)
         @return reference to the category item (QTreeWidgetItem)
         """
         itm = QTreeWidgetItem(self.shortcutsList, [title])
         itm.setExpanded(True)
         return itm
-        
-    def __generateShortcutItem(self, category, action,
-                               noCheck=False, objectType=""):
+
+    def __generateShortcutItem(self, category, action, noCheck=False, objectType=""):
         """
         Private method to generate a keyboard shortcut item.
-        
+
         @param category reference to the category item (QTreeWidgetItem)
         @param action reference to the keyboard action (EricAction)
         @param noCheck flag indicating that no uniqueness check should
@@ -100,8 +101,12 @@
         """
         itm = QTreeWidgetItem(
             category,
-            [action.iconText(), action.shortcut().toString(),
-             action.alternateShortcut().toString()])
+            [
+                action.iconText(),
+                action.shortcut().toString(),
+                action.alternateShortcut().toString(),
+            ],
+        )
         itm.setIcon(0, action.icon())
         itm.setData(0, self.objectNameRole, action.objectName())
         itm.setData(0, self.noCheckRole, noCheck)
@@ -109,163 +114,153 @@
             itm.setData(0, self.objectTypeRole, objectType)
         else:
             itm.setData(0, self.objectTypeRole, None)
-        
+
     def populate(self, helpViewer=None):
         """
         Public method to populate the dialog.
-        
+
         @param helpViewer reference to the help window object
         """
         self.searchEdit.clear()
         self.searchEdit.setFocus()
         self.shortcutsList.clear()
         self.actionButton.setChecked(True)
-        
+
         self.__helpViewer = helpViewer
-        
+
         if helpViewer is None:
             # let the plugin manager create on demand plugin objects
             pm = ericApp().getObject("PluginManager")
             pm.initOnDemandPlugins()
-            
+
             # populate the various lists
             self.projectItem = self.__generateCategoryItem(self.tr("Project"))
             for act in ericApp().getObject("Project").getActions():
                 self.__generateShortcutItem(self.projectItem, act)
-            
+
             self.uiItem = self.__generateCategoryItem(self.tr("General"))
-            for act in ericApp().getObject("UserInterface").getActions('ui'):
+            for act in ericApp().getObject("UserInterface").getActions("ui"):
                 self.__generateShortcutItem(self.uiItem, act)
-            
+
             self.wizardsItem = self.__generateCategoryItem(self.tr("Wizards"))
-            for act in (
-                ericApp().getObject("UserInterface").getActions('wizards')
-            ):
+            for act in ericApp().getObject("UserInterface").getActions("wizards"):
                 self.__generateShortcutItem(self.wizardsItem, act)
-            
+
             self.debugItem = self.__generateCategoryItem(self.tr("Debug"))
             for act in ericApp().getObject("DebugUI").getActions():
                 self.__generateShortcutItem(self.debugItem, act)
-            
+
             self.editItem = self.__generateCategoryItem(self.tr("Edit"))
-            for act in ericApp().getObject("ViewManager").getActions('edit'):
+            for act in ericApp().getObject("ViewManager").getActions("edit"):
                 self.__generateShortcutItem(self.editItem, act)
-            
+
             self.fileItem = self.__generateCategoryItem(self.tr("File"))
-            for act in ericApp().getObject("ViewManager").getActions('file'):
+            for act in ericApp().getObject("ViewManager").getActions("file"):
                 self.__generateShortcutItem(self.fileItem, act)
-            
+
             self.searchItem = self.__generateCategoryItem(self.tr("Search"))
-            for act in ericApp().getObject("ViewManager").getActions('search'):
+            for act in ericApp().getObject("ViewManager").getActions("search"):
                 self.__generateShortcutItem(self.searchItem, act)
-            
+
             self.viewItem = self.__generateCategoryItem(self.tr("View"))
-            for act in ericApp().getObject("ViewManager").getActions('view'):
+            for act in ericApp().getObject("ViewManager").getActions("view"):
                 self.__generateShortcutItem(self.viewItem, act)
-            
+
             self.macroItem = self.__generateCategoryItem(self.tr("Macro"))
-            for act in ericApp().getObject("ViewManager").getActions('macro'):
+            for act in ericApp().getObject("ViewManager").getActions("macro"):
                 self.__generateShortcutItem(self.macroItem, act)
-            
-            self.bookmarkItem = self.__generateCategoryItem(
-                self.tr("Bookmarks"))
-            for act in (
-                ericApp().getObject("ViewManager").getActions('bookmark')
-            ):
+
+            self.bookmarkItem = self.__generateCategoryItem(self.tr("Bookmarks"))
+            for act in ericApp().getObject("ViewManager").getActions("bookmark"):
                 self.__generateShortcutItem(self.bookmarkItem, act)
-            
-            self.spellingItem = self.__generateCategoryItem(
-                self.tr("Spelling"))
-            for act in (
-                ericApp().getObject("ViewManager").getActions('spelling')
-            ):
+
+            self.spellingItem = self.__generateCategoryItem(self.tr("Spelling"))
+            for act in ericApp().getObject("ViewManager").getActions("spelling"):
                 self.__generateShortcutItem(self.spellingItem, act)
-            
-            actions = ericApp().getObject("ViewManager").getActions('window')
+
+            actions = ericApp().getObject("ViewManager").getActions("window")
             if actions:
-                self.windowItem = self.__generateCategoryItem(
-                    self.tr("Window"))
+                self.windowItem = self.__generateCategoryItem(self.tr("Window"))
                 for act in actions:
                     self.__generateShortcutItem(self.windowItem, act)
-            
+
             self.pluginCategoryItems = []
             for category, ref in ericApp().getPluginObjects():
                 if hasattr(ref, "getActions"):
                     categoryItem = self.__generateCategoryItem(category)
                     objectType = ericApp().getPluginObjectType(category)
                     for act in ref.getActions():
-                        self.__generateShortcutItem(categoryItem, act,
-                                                    objectType=objectType)
+                        self.__generateShortcutItem(
+                            categoryItem, act, objectType=objectType
+                        )
                     self.pluginCategoryItems.append(categoryItem)
-        
+
         else:
             self.helpViewerItem = self.__generateCategoryItem(
-                self.tr("eric Web Browser"))
+                self.tr("eric Web Browser")
+            )
             for act in helpViewer.getActions():
                 self.__generateShortcutItem(self.helpViewerItem, act, True)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
         self.__editTopItem = None
-        
+
     def on_shortcutsList_itemDoubleClicked(self, itm, column):
         """
         Private slot to handle a double click in the shortcuts list.
-        
+
         @param itm the list item that was double clicked (QTreeWidgetItem)
         @param column the list item was double clicked in (integer)
         """
         if itm.childCount():
             return
-        
+
         self.__editTopItem = itm.parent()
-        
+
         self.shortcutDialog.setKeys(
             QKeySequence(itm.text(1)),
             QKeySequence(itm.text(2)),
             itm.data(0, self.noCheckRole),
-            itm.data(0, self.objectTypeRole))
+            itm.data(0, self.objectTypeRole),
+        )
         self.shortcutDialog.show()
-        
+
     def on_shortcutsList_itemClicked(self, itm, column):
         """
         Private slot to handle a click in the shortcuts list.
-        
+
         @param itm the list item that was clicked (QTreeWidgetItem)
         @param column the list item was clicked in (integer)
         """
         if itm.childCount() or column not in [1, 2]:
             return
-        
+
         self.shortcutsList.openPersistentEditor(itm, column)
-        
+
     def on_shortcutsList_itemChanged(self, itm, column):
         """
         Private slot to handle the edit of a shortcut key.
-        
+
         @param itm reference to the item changed (QTreeWidgetItem)
         @param column column changed (integer)
         """
         if column != 0:
             keystr = itm.text(column).title()
-            if (
-                not itm.data(0, self.noCheckRole) and
-                not self.__checkShortcut(QKeySequence(keystr),
-                                         itm.data(0, self.objectTypeRole),
-                                         itm.parent())
+            if not itm.data(0, self.noCheckRole) and not self.__checkShortcut(
+                QKeySequence(keystr), itm.data(0, self.objectTypeRole), itm.parent()
             ):
                 itm.setText(column, "")
             else:
                 itm.setText(column, keystr)
             self.shortcutsList.closePersistentEditor(itm, column)
 
-    def __shortcutChanged(self, keysequence, altKeysequence, noCheck,
-                          objectType):
+    def __shortcutChanged(self, keysequence, altKeysequence, noCheck, objectType):
         """
         Private slot to handle the shortcutChanged signal of the shortcut
         dialog.
-        
+
         @param keysequence the keysequence of the changed action (QKeySequence)
         @param altKeysequence the alternative keysequence of the changed
             action (QKeySequence)
@@ -273,25 +268,22 @@
             be performed (boolean)
         @param objectType type of the object (string).
         """
-        if (
-            not noCheck and
-            (not self.__checkShortcut(
-                keysequence, objectType, self.__editTopItem) or
-             not self.__checkShortcut(
-                altKeysequence, objectType, self.__editTopItem))
+        if not noCheck and (
+            not self.__checkShortcut(keysequence, objectType, self.__editTopItem)
+            or not self.__checkShortcut(altKeysequence, objectType, self.__editTopItem)
         ):
             return
-        
+
         self.shortcutsList.currentItem().setText(1, keysequence.toString())
         self.shortcutsList.currentItem().setText(2, altKeysequence.toString())
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
     def __checkShortcut(self, keysequence, objectType, origTopItem):
         """
         Private method to check a keysequence for uniqueness.
-        
+
         @param keysequence the keysequence to check (QKeySequence)
         @param objectType type of the object (string). Entries with the same
             object type are not checked for uniqueness.
@@ -301,27 +293,27 @@
         """
         if keysequence.isEmpty():
             return True
-        
+
         keystr = keysequence.toString()
         keyname = self.shortcutsList.currentItem().text(0)
         for topIndex in range(self.shortcutsList.topLevelItemCount()):
             topItem = self.shortcutsList.topLevelItem(topIndex)
             for index in range(topItem.childCount()):
                 itm = topItem.child(index)
-                
+
                 # 1. shall a check be performed?
                 if itm.data(0, self.noCheckRole):
                     continue
-                
+
                 # 2. check object type
                 itmObjectType = itm.data(0, self.objectTypeRole)
                 if (
-                    itmObjectType and
-                    itmObjectType == objectType and
-                    topItem != origTopItem
+                    itmObjectType
+                    and itmObjectType == objectType
+                    and topItem != origTopItem
                 ):
                     continue
-                
+
                 # 3. check key name
                 if itm.text(0) != keyname:
                     for col in [1, 2]:
@@ -335,18 +327,19 @@
                                 self.tr(
                                     """<p><b>{0}</b> has already been"""
                                     """ allocated to the <b>{1}</b> action. """
-                                    """Remove this binding?</p>""")
-                                .format(keystr, itm.text(0)),
-                                icon=EricMessageBox.Warning)
+                                    """Remove this binding?</p>"""
+                                ).format(keystr, itm.text(0)),
+                                icon=EricMessageBox.Warning,
+                            )
                             if res:
                                 itm.setText(col, "")
                                 return True
                             else:
                                 return False
-                        
+
                         if not itmseq:
                             continue
-                        
+
                         # step 2: check if shortcut hides an already allocated
                         if itmseq.startswith("{0}+".format(keystr)):
                             res = EricMessageBox.yesNo(
@@ -354,15 +347,16 @@
                                 self.tr("Edit shortcuts"),
                                 self.tr(
                                     """<p><b>{0}</b> hides the <b>{1}</b>"""
-                                    """ action. Remove this binding?</p>""")
-                                .format(keystr, itm.text(0)),
-                                icon=EricMessageBox.Warning)
+                                    """ action. Remove this binding?</p>"""
+                                ).format(keystr, itm.text(0)),
+                                icon=EricMessageBox.Warning,
+                            )
                             if res:
                                 itm.setText(col, "")
                                 return True
                             else:
                                 return False
-                        
+
                         # step 3: check if shortcut is hidden by an
                         #         already allocated
                         if keystr.startswith("{0}+".format(itmseq)):
@@ -372,21 +366,22 @@
                                 self.tr(
                                     """<p><b>{0}</b> is hidden by the """
                                     """<b>{1}</b> action. """
-                                    """Remove this binding?</p>""")
-                                .format(keystr, itm.text(0)),
-                                icon=EricMessageBox.Warning)
+                                    """Remove this binding?</p>"""
+                                ).format(keystr, itm.text(0)),
+                                icon=EricMessageBox.Warning,
+                            )
                             if res:
                                 itm.setText(col, "")
                                 return True
                             else:
                                 return False
-            
+
         return True
-        
+
     def __saveCategoryActions(self, category, actions):
         """
         Private method to save the actions for a category.
-        
+
         @param category reference to the category item (QTreeWidgetItem)
         @param actions list of actions for the category (list of EricAction)
         """
@@ -397,75 +392,80 @@
                 if txt == act.objectName():
                     act.setShortcut(QKeySequence(itm.text(1)))
                     act.setAlternateShortcut(
-                        QKeySequence(itm.text(2)), removeEmpty=True)
+                        QKeySequence(itm.text(2)), removeEmpty=True
+                    )
                     break
-        
+
     def on_buttonBox_accepted(self):
         """
         Private slot to handle the OK button press.
         """
         if self.__helpViewer is None:
             self.__saveCategoryActions(
-                self.projectItem,
-                ericApp().getObject("Project").getActions())
+                self.projectItem, ericApp().getObject("Project").getActions()
+            )
             self.__saveCategoryActions(
-                self.uiItem,
-                ericApp().getObject("UserInterface").getActions('ui'))
+                self.uiItem, ericApp().getObject("UserInterface").getActions("ui")
+            )
             self.__saveCategoryActions(
                 self.wizardsItem,
-                ericApp().getObject("UserInterface").getActions('wizards'))
+                ericApp().getObject("UserInterface").getActions("wizards"),
+            )
             self.__saveCategoryActions(
-                self.debugItem,
-                ericApp().getObject("DebugUI").getActions())
+                self.debugItem, ericApp().getObject("DebugUI").getActions()
+            )
             self.__saveCategoryActions(
-                self.editItem,
-                ericApp().getObject("ViewManager").getActions('edit'))
+                self.editItem, ericApp().getObject("ViewManager").getActions("edit")
+            )
             self.__saveCategoryActions(
-                self.fileItem,
-                ericApp().getObject("ViewManager").getActions('file'))
+                self.fileItem, ericApp().getObject("ViewManager").getActions("file")
+            )
             self.__saveCategoryActions(
-                self.searchItem,
-                ericApp().getObject("ViewManager").getActions('search'))
+                self.searchItem, ericApp().getObject("ViewManager").getActions("search")
+            )
             self.__saveCategoryActions(
-                self.viewItem,
-                ericApp().getObject("ViewManager").getActions('view'))
+                self.viewItem, ericApp().getObject("ViewManager").getActions("view")
+            )
             self.__saveCategoryActions(
-                self.macroItem,
-                ericApp().getObject("ViewManager").getActions('macro'))
+                self.macroItem, ericApp().getObject("ViewManager").getActions("macro")
+            )
             self.__saveCategoryActions(
                 self.bookmarkItem,
-                ericApp().getObject("ViewManager").getActions('bookmark'))
+                ericApp().getObject("ViewManager").getActions("bookmark"),
+            )
             self.__saveCategoryActions(
                 self.spellingItem,
-                ericApp().getObject("ViewManager").getActions('spelling'))
-            
-            actions = ericApp().getObject("ViewManager").getActions('window')
+                ericApp().getObject("ViewManager").getActions("spelling"),
+            )
+
+            actions = ericApp().getObject("ViewManager").getActions("window")
             if actions:
                 self.__saveCategoryActions(self.windowItem, actions)
-            
+
             for categoryItem in self.pluginCategoryItems:
                 category = categoryItem.text(0)
                 ref = ericApp().getPluginObject(category)
                 if ref is not None and hasattr(ref, "getActions"):
                     self.__saveCategoryActions(categoryItem, ref.getActions())
-            
+
             Shortcuts.saveShortcuts()
-        
+
         else:
             self.__saveCategoryActions(
-                self.helpViewerItem, self.__helpViewer.getActions())
+                self.helpViewerItem, self.__helpViewer.getActions()
+            )
             Shortcuts.saveShortcuts(helpViewer=self.__helpViewer)
-        
+
         Preferences.syncPreferences()
-        
+
         self.updateShortcuts.emit()
         self.hide()
-    
+
     @pyqtSlot(str)
     def on_searchEdit_textChanged(self, txt):
         """
         Private slot called, when the text in the search edit changes.
-        
+
         @param txt text of the search edit (string)
         """
         rx = re.compile(re.escape(txt), re.IGNORECASE)
@@ -474,13 +474,12 @@
             childHiddenCount = 0
             for index in range(topItem.childCount()):
                 itm = topItem.child(index)
-                if (
-                    txt and (
-                        (self.actionButton.isChecked() and
-                         rx.search(itm.text(0)) is None) or
-                        (self.shortcutButton.isChecked() and
-                         txt.lower() not in itm.text(1).lower() and
-                         txt.lower() not in itm.text(2).lower())
+                if txt and (
+                    (self.actionButton.isChecked() and rx.search(itm.text(0)) is None)
+                    or (
+                        self.shortcutButton.isChecked()
+                        and txt.lower() not in itm.text(1).lower()
+                        and txt.lower() not in itm.text(2).lower()
                     )
                 ):
                     itm.setHidden(True)
@@ -488,22 +487,22 @@
                 else:
                     itm.setHidden(False)
             topItem.setHidden(childHiddenCount == topItem.childCount())
-    
+
     @pyqtSlot(bool)
     def on_actionButton_toggled(self, checked):
         """
         Private slot called, when the action radio button is toggled.
-        
+
         @param checked state of the action radio button (boolean)
         """
         if checked:
             self.on_searchEdit_textChanged(self.searchEdit.text())
-    
+
     @pyqtSlot(bool)
     def on_shortcutButton_toggled(self, checked):
         """
         Private slot called, when the shortcuts radio button is toggled.
-        
+
         @param checked state of the shortcuts radio button (boolean)
         """
         if checked:
--- a/src/eric7/Preferences/ShortcutsFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ShortcutsFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,20 +26,22 @@
     """
     Class representing the shortcuts JSON file.
     """
+
     def __init__(self: "ShortcutsFile", parent: QObject = None) -> None:
         """
         Constructor
-        
+
         @param parent reference to the parent object (defaults to None)
         @type QObject (optional)
         """
         super().__init__(parent)
-    
-    def __addActionsToDict(self: "ShortcutsFile", category: str, actions: list,
-                           actionsDict: dict) -> None:
+
+    def __addActionsToDict(
+        self: "ShortcutsFile", category: str, actions: list, actionsDict: dict
+    ) -> None:
         """
         Private method to add a list of actions to the actions dictionary.
-        
+
         @param category category of the actions
         @type str
         @param actions list of actions
@@ -55,14 +57,15 @@
                     # shortcuts are only exported, if their objectName is set
                     actionsDict[category][act.objectName()] = (
                         act.shortcut().toString(),
-                        act.alternateShortcut().toString()
+                        act.alternateShortcut().toString(),
                     )
-    
-    def writeFile(self: "ShortcutsFile", filename: str,
-                  helpViewer: HelpViewer = None) -> bool:
+
+    def writeFile(
+        self: "ShortcutsFile", filename: str, helpViewer: HelpViewer = None
+    ) -> bool:
         """
         Public method to write the shortcuts data to a shortcuts JSON file.
-        
+
         @param filename name of the shortcuts file
         @type str
         @param helpViewer reference to the help window object
@@ -71,94 +74,86 @@
         @rtype bool
         """
         actionsDict = {}
-        
+
         # step 1: collect all the shortcuts
         if helpViewer is None:
             self.__addActionsToDict(
-                "Project",
-                ericApp().getObject("Project").getActions(),
-                actionsDict
+                "Project", ericApp().getObject("Project").getActions(), actionsDict
             )
             self.__addActionsToDict(
                 "General",
-                ericApp().getObject("UserInterface").getActions('ui'),
-                actionsDict
+                ericApp().getObject("UserInterface").getActions("ui"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Wizards",
-                ericApp().getObject("UserInterface").getActions('wizards'),
-                actionsDict
+                ericApp().getObject("UserInterface").getActions("wizards"),
+                actionsDict,
             )
             self.__addActionsToDict(
-                "Debug",
-                ericApp().getObject("DebugUI").getActions(),
-                actionsDict
+                "Debug", ericApp().getObject("DebugUI").getActions(), actionsDict
             )
             self.__addActionsToDict(
                 "Edit",
-                ericApp().getObject("ViewManager").getActions('edit'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("edit"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "File",
-                ericApp().getObject("ViewManager").getActions('file'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("file"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Search",
-                ericApp().getObject("ViewManager").getActions('search'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("search"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "View",
-                ericApp().getObject("ViewManager").getActions('view'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("view"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Macro",
-                ericApp().getObject("ViewManager").getActions('macro'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("macro"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Bookmarks",
-                ericApp().getObject("ViewManager").getActions('bookmark'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("bookmark"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Spelling",
-                ericApp().getObject("ViewManager").getActions('spelling'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("spelling"),
+                actionsDict,
             )
             self.__addActionsToDict(
                 "Window",
-                ericApp().getObject("ViewManager").getActions('window'),
-                actionsDict
+                ericApp().getObject("ViewManager").getActions("window"),
+                actionsDict,
             )
-            
+
             for category, ref in ericApp().getPluginObjects():
                 if hasattr(ref, "getActions"):
-                    self.__addActionsToDict(
-                        category, ref.getActions(), actionsDict
-                    )
-        
+                    self.__addActionsToDict(category, ref.getActions(), actionsDict)
+
         else:
             self.__addActionsToDict(
-                helpViewer.getActionsCategory(),
-                helpViewer.getActions(),
-                actionsDict
+                helpViewer.getActionsCategory(), helpViewer.getActions(), actionsDict
             )
-        
+
         # step 2: assemble the data structure to be written
         shortcutsDict = {}
         # step 2.0: header
         shortcutsDict["header"] = {
             "comment": "eric keyboard shortcuts file",
-            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "saved": time.strftime("%Y-%m-%d, %H:%M:%S"),
             "author": Preferences.getUser("Email"),
         }
         # step 2.1: keyboard shortcuts
         shortcutsDict["shortcuts"] = actionsDict
-        
+
         try:
             jsonString = json.dumps(shortcutsDict, indent=2)
             with open(filename, "w") as f:
@@ -171,16 +166,16 @@
                     self.tr(
                         "<p>The keyboard shortcuts file <b>{0}</b> could not"
                         " be written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self: "ShortcutsFile", filename: str) -> bool:
         """
         Public method to read the shortcuts data from a shortcuts JSON file.
-        
+
         @param filename name of the shortcuts file
         @type str
         @return Dictionary of dictionaries of shortcuts. The keys of the
@@ -200,8 +195,8 @@
                 self.tr(
                     "<p>The keyboard shortcuts file <b>{0}</b> could not be"
                     " read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return {}
-        
+
         return shortcutsDict["shortcuts"]
--- a/src/eric7/Preferences/SubstyleDefinitionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/SubstyleDefinitionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the sub-style definition dialog.
     """
+
     def __init__(self, lexer, style, substyle, parent=None):
         """
         Constructor
-        
+
         @param lexer reference to the lexer object
         @type PreferencesLexer
         @param style style number
@@ -34,46 +35,51 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__lexer = lexer
         self.__style = style
         self.__substyle = substyle
-        
-        self.header.setText(self.tr("<h3>{0} - {1}</h3>").format(
-            self.__lexer.language(), self.__lexer.description(self.__style)))
+
+        self.header.setText(
+            self.tr("<h3>{0} - {1}</h3>").format(
+                self.__lexer.language(), self.__lexer.description(self.__style)
+            )
+        )
         if self.__substyle >= 0:
             # it's an edit operation
             self.descriptionEdit.setText(
-                self.__lexer.description(self.__style, self.__substyle))
+                self.__lexer.description(self.__style, self.__substyle)
+            )
             self.wordsEdit.setPlainText(
-                self.__lexer.words(self.__style, self.__substyle))
-    
+                self.__lexer.words(self.__style, self.__substyle)
+            )
+
     def __updateOk(self):
         """
         Private slot to update the state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.descriptionEdit.text().strip()) and
-            bool(self.wordsEdit.toPlainText().strip())
+            bool(self.descriptionEdit.text().strip())
+            and bool(self.wordsEdit.toPlainText().strip())
         )
-    
+
     @pyqtSlot(str)
     def on_descriptionEdit_textChanged(self, txt):
         """
         Private slot handling changes of the description.
-        
+
         @param txt text of the description
         @type str
         """
         self.__updateOk()
-    
+
     @pyqtSlot()
     def on_wordsEdit_textChanged(self):
         """
         Private slot handling changes of the word list.
         """
         self.__updateOk()
-    
+
     @pyqtSlot()
     def on_resetButton_clicked(self):
         """
@@ -82,49 +88,55 @@
         ok = EricMessageBox.yesNo(
             self,
             self.tr("Reset Sub-Style Data"),
-            self.tr("""Shall the entered sub-style data be reset?"""))
+            self.tr("""Shall the entered sub-style data be reset?"""),
+        )
         if ok:
             if self.__substyle >= 0:
                 self.descriptionEdit.setText(
-                    self.__lexer.description(self.__style, self.__substyle))
+                    self.__lexer.description(self.__style, self.__substyle)
+                )
                 self.wordsEdit.setPlainText(
-                    self.__lexer.words(self.__style, self.__substyle))
+                    self.__lexer.words(self.__style, self.__substyle)
+                )
             else:
                 self.descriptionEdit.clear()
                 self.wordsEdit.clear()
-    
+
     @pyqtSlot()
     def on_defaultButton_clicked(self):
         """
         Private slot to set the dialog contents to default values.
         """
-        filled = (
-            bool(self.descriptionEdit.text().strip()) or
-            bool(self.wordsEdit.toPlainText().strip())
+        filled = bool(self.descriptionEdit.text().strip()) or bool(
+            self.wordsEdit.toPlainText().strip()
         )
         ok = (
             EricMessageBox.yesNo(
                 self,
                 self.tr("Set Sub-Style Data to Default"),
-                self.tr("""Shall the sub-style data be set to default"""
-                        """ values?"""))
-            if filled else
-            True
+                self.tr(
+                    """Shall the sub-style data be set to default""" """ values?"""
+                ),
+            )
+            if filled
+            else True
         )
         if ok:
             if self.__substyle >= 0:
-                self.descriptionEdit.setText(self.__lexer.defaultDescription(
-                    self.__style, self.__substyle))
-                self.wordsEdit.setPlainText(self.__lexer.defaultWords(
-                    self.__style, self.__substyle))
+                self.descriptionEdit.setText(
+                    self.__lexer.defaultDescription(self.__style, self.__substyle)
+                )
+                self.wordsEdit.setPlainText(
+                    self.__lexer.defaultWords(self.__style, self.__substyle)
+                )
             else:
                 self.descriptionEdit.clear()
                 self.wordsEdit.clear()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the sub-style description and words list.
         @rtype tuple of (str, str)
         """
--- a/src/eric7/Preferences/ThemeManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ThemeManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,6 +25,7 @@
     """
     Class implementing a manager object for color themes.
     """
+
     ColorKeyPatternList = [
         "Diff/.*Color",
         "Editor/Colour/",
@@ -46,20 +47,20 @@
         "UI/NotificationWarningBackground",
         "UI/NotificationWarningForeground",
     ]
-    
+
     def __init__(self: "ThemeManager", parent: QObject = None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (defaults to None)
         @type QObject (optional)
         """
         super().__init__(parent)
-    
+
     def importTheme(self: "ThemeManager") -> bool:
         """
         Public method to import a theme file and set the colors.
-        
+
         @return flag indicating a successful import
         @rtype bool
         """
@@ -67,7 +68,7 @@
             None,
             self.tr("Import Theme"),
             getConfig("ericThemesDir"),
-            self.tr("eric Theme Files (*.ethj);;All Files (*)")
+            self.tr("eric Theme Files (*.ethj);;All Files (*)"),
         )
         if filename:
             try:
@@ -81,27 +82,29 @@
                     self.tr(
                         "<p>The theme file <b>{0}</b> could not"
                         " be read.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-            
+
             # step 1: process stylesheet data
             stylesheetDict = themeDict["stylesheet"]
             if stylesheetDict["name"]:
-                stylesheetsDir = os.path.join(
-                    Globals.getConfigDir(), "stylesheets")
+                stylesheetsDir = os.path.join(Globals.getConfigDir(), "stylesheets")
                 if not os.path.exists(stylesheetsDir):
                     os.makedirs(stylesheetsDir)
-                stylesheetFile = os.path.join(
-                    stylesheetsDir, stylesheetDict["name"])
-                ok = EricMessageBox.yesNo(
-                    None,
-                    self.tr("Import Theme"),
-                    self.tr(
-                        "The stylesheet file {0} exists already."
-                        " Shall it be overwritten?"
-                    ).format(stylesheetDict["name"])
-                ) if os.path.exists(stylesheetFile) else True
+                stylesheetFile = os.path.join(stylesheetsDir, stylesheetDict["name"])
+                ok = (
+                    EricMessageBox.yesNo(
+                        None,
+                        self.tr("Import Theme"),
+                        self.tr(
+                            "The stylesheet file {0} exists already."
+                            " Shall it be overwritten?"
+                        ).format(stylesheetDict["name"]),
+                    )
+                    if os.path.exists(stylesheetFile)
+                    else True
+                )
                 if ok:
                     try:
                         with open(stylesheetFile, "w") as f:
@@ -113,22 +116,22 @@
                             self.tr(
                                 "<p>The stylesheet file <b>{0}</b> could"
                                 " not be written.</p><p>Reason: {1}</p>"
-                            ).format(stylesheetFile, str(err))
+                            ).format(stylesheetFile, str(err)),
                         )
                         stylesheetFile = ""
                 Preferences.setUI("StyleSheet", stylesheetFile)
-            
+
             # step 2: transfer the color entries
             settings = Preferences.getSettings()
             colorsDict = themeDict["colors"]
             for key, value in colorsDict.items():
                 settings.setValue(key, value)
-            
+
             Preferences.syncPreferences()
             return True
-        
+
         return False
-    
+
     def exportTheme(self: "ThemeManager"):
         """
         Public method to export the current colors to a theme file.
@@ -139,45 +142,44 @@
             os.path.expanduser("~"),
             self.tr("eric Theme Files (*.ethj)"),
             "",
-            EricFileDialog.DontConfirmOverwrite
+            EricFileDialog.DontConfirmOverwrite,
         )
         if filename:
             ext = os.path.splitext(filename)[1]
             if not ext:
                 filename = "{0}{1}".format(
-                    filename,
-                    selectedFilter.rsplit(None, 1)[-1][2:-1])
-            
+                    filename, selectedFilter.rsplit(None, 1)[-1][2:-1]
+                )
+
             ok = (
                 EricMessageBox.yesNo(
                     None,
                     self.tr("Export Theme"),
                     self.tr(
                         """<p>The theme file <b>{0}</b> exists"""
-                        """ already. Overwrite it?</p>""").format(filename))
-                if os.path.exists(filename) else
-                True
+                        """ already. Overwrite it?</p>"""
+                    ).format(filename),
+                )
+                if os.path.exists(filename)
+                else True
             )
-            
+
             if ok:
                 # step 1: generate a dictionary with all color settings
                 settings = Preferences.getSettings()
-                colorKeyFilterRe = re.compile("|".join(
-                    ThemeManager.ColorKeyPatternList +
-                    ThemeManager.ColorKeyList
-                ))
-                
-                keys = [k for k in settings.allKeys()
-                        if colorKeyFilterRe.match(k)]
+                colorKeyFilterRe = re.compile(
+                    "|".join(
+                        ThemeManager.ColorKeyPatternList + ThemeManager.ColorKeyList
+                    )
+                )
+
+                keys = [k for k in settings.allKeys() if colorKeyFilterRe.match(k)]
                 colorsDict = {}
                 for key in keys:
                     colorsDict[key] = settings.value(key)
-                
+
                 # step 2: read the contents of the current stylesheet
-                stylesheetDict = {
-                    "contents": "",
-                    "name": ""
-                }
+                stylesheetDict = {"contents": "", "name": ""}
                 stylesheet = Preferences.getUI("StyleSheet")
                 if stylesheet and os.path.exists(stylesheet):
                     try:
@@ -191,14 +193,14 @@
                             self.tr(
                                 "<p>The stylesheet file <b>{0}</b> could not"
                                 " be read.</p><p>Reason: {1}</p>"
-                            ).format(stylesheet, str(err))
+                            ).format(stylesheet, str(err)),
                         )
-                
+
                 themeDict = {
                     "colors": colorsDict,
                     "stylesheet": stylesheetDict,
                 }
-                
+
                 try:
                     jsonString = json.dumps(themeDict, indent=2)
                     with open(filename, "w") as f:
@@ -210,5 +212,5 @@
                         self.tr(
                             "<p>The theme file <b>{0}</b> could not"
                             " be written.</p><p>Reason: {1}</p>"
-                        ).format(filename, str(err))
+                        ).format(filename, str(err)),
                     )
--- a/src/eric7/Preferences/ToolConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ToolConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,56 +24,56 @@
     """
     Class implementing a configuration dialog for the tools menu.
     """
+
     def __init__(self, toollist, parent=None):
         """
         Constructor
-        
+
         @param toollist list of configured tools
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.iconPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.iconPicker.setFilters(self.tr("Icon files (*.png)"))
         self.executablePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.redirectionModes = [
             ("no", self.tr("no redirection")),
             ("show", self.tr("show output")),
             ("insert", self.tr("insert into current editor")),
-            ("replaceSelection",
-             self.tr("replace selection of current editor")),
+            ("replaceSelection", self.tr("replace selection of current editor")),
         ]
-        
+
         self.toollist = copy.deepcopy(toollist)
         for tool in toollist:
-            self.toolsList.addItem(tool['menutext'])
-        
+            self.toolsList.addItem(tool["menutext"])
+
         for mode in self.redirectionModes:
             self.redirectCombo.addItem(mode[1])
-        
+
         if len(toollist):
             self.toolsList.setCurrentRow(0)
             self.on_toolsList_currentRowChanged(0)
-        
+
         t = self.argumentsEdit.whatsThis()
         if t:
             t += Utilities.getPercentReplacementHelp()
             self.argumentsEdit.setWhatsThis(t)
-        
+
     def __findModeIndex(self, shortName):
         """
         Private method to find the mode index by its short name.
-        
+
         @param shortName short name of the mode (string)
         @return index of the mode (integer)
         """
         for ind, mode in enumerate(self.redirectionModes):
             if mode[0] == shortName:
                 return ind
-        return 1    # default is "show output"
-        
+        return 1  # default is "show output"
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
@@ -84,7 +84,7 @@
         self.iconPicker.clear()
         self.argumentsEdit.clear()
         self.redirectCombo.setCurrentIndex(1)
-        
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -95,25 +95,28 @@
         executable = self.executablePicker.text()
         arguments = self.argumentsEdit.text()
         redirect = self.redirectionModes[self.redirectCombo.currentIndex()][0]
-        
+
         if not executable:
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool entry"),
                 self.tr(
-                    "You have to set an executable to add to the"
-                    " Tools-Menu first."))
+                    "You have to set an executable to add to the" " Tools-Menu first."
+                ),
+            )
             return
-        
+
         if not menutext:
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool entry"),
                 self.tr(
                     "You have to insert a menuentry text to add the"
-                    " selected program to the Tools-Menu first."))
+                    " selected program to the Tools-Menu first."
+                ),
+            )
             return
-        
+
         if not Utilities.isinpath(executable):
             EricMessageBox.critical(
                 self,
@@ -121,28 +124,31 @@
                 self.tr(
                     "The selected file could not be found or"
                     " is not an executable."
-                    " Please choose an executable filename."))
+                    " Please choose an executable filename."
+                ),
+            )
             return
-        
-        if len(self.toolsList.findItems(
-                menutext, Qt.MatchFlag.MatchExactly)):
+
+        if len(self.toolsList.findItems(menutext, Qt.MatchFlag.MatchExactly)):
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool entry"),
-                self.tr("An entry for the menu text {0} already exists.")
-                .format(menutext))
+                self.tr("An entry for the menu text {0} already exists.").format(
+                    menutext
+                ),
+            )
             return
-        
+
         self.toolsList.addItem(menutext)
         tool = {
-            'menutext': menutext,
-            'icon': icon,
-            'executable': executable,
-            'arguments': arguments,
-            'redirect': redirect,
+            "menutext": menutext,
+            "icon": icon,
+            "executable": executable,
+            "arguments": arguments,
+            "redirect": redirect,
         }
         self.toollist.append(tool)
-        
+
     @pyqtSlot()
     def on_changeButton_clicked(self):
         """
@@ -151,31 +157,34 @@
         row = self.toolsList.currentRow()
         if row < 0:
             return
-        
+
         menutext = self.menuEdit.text()
         icon = self.iconPicker.text()
         executable = self.executablePicker.text()
         arguments = self.argumentsEdit.text()
         redirect = self.redirectionModes[self.redirectCombo.currentIndex()][0]
-        
+
         if not executable:
             EricMessageBox.critical(
                 self,
                 self.tr("Change tool entry"),
                 self.tr(
-                    "You have to set an executable to change the"
-                    " Tools-Menu entry."))
+                    "You have to set an executable to change the" " Tools-Menu entry."
+                ),
+            )
             return
-            
+
         if not menutext:
             EricMessageBox.critical(
                 self,
                 self.tr("Change tool entry"),
                 self.tr(
                     "You have to insert a menuentry text to change the"
-                    " selected Tools-Menu entry."))
+                    " selected Tools-Menu entry."
+                ),
+            )
             return
-            
+
         if not Utilities.isinpath(executable):
             EricMessageBox.critical(
                 self,
@@ -183,19 +192,21 @@
                 self.tr(
                     "The selected file could not be found or"
                     " is not an executable."
-                    " Please choose an existing executable filename."))
+                    " Please choose an existing executable filename."
+                ),
+            )
             return
-            
+
         self.toollist[row] = {
-            'menutext': menutext,
-            'icon': icon,
-            'executable': executable,
-            'arguments': arguments,
-            'redirect': redirect,
+            "menutext": menutext,
+            "icon": icon,
+            "executable": executable,
+            "arguments": arguments,
+            "redirect": redirect,
         }
         self.toolsList.currentItem().setText(menutext)
         self.changeButton.setEnabled(False)
-        
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -204,7 +215,7 @@
         row = self.toolsList.currentRow()
         if row < 0:
             return
-        
+
         del self.toollist[row]
         itm = self.toolsList.takeItem(row)
         del itm
@@ -212,7 +223,7 @@
             row -= 1
         self.toolsList.setCurrentRow(row)
         self.on_toolsList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -222,12 +233,12 @@
         self.__swap(curr, curr + 1)
         self.toolsList.clear()
         for tool in self.toollist:
-            self.toolsList.addItem(tool['menutext'])
+            self.toolsList.addItem(tool["menutext"])
         self.toolsList.setCurrentRow(curr + 1)
         if curr + 1 == len(self.toollist):
             self.downButton.setEnabled(False)
         self.upButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -237,32 +248,32 @@
         self.__swap(curr - 1, curr)
         self.toolsList.clear()
         for tool in self.toollist:
-            self.toolsList.addItem(tool['menutext'])
+            self.toolsList.addItem(tool["menutext"])
         self.toolsList.setCurrentRow(curr - 1)
         if curr - 1 == 0:
             self.upButton.setEnabled(False)
         self.downButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_separatorButton_clicked(self):
         """
         Private slot to add a menu separator.
         """
-        self.toolsList.addItem('--')
+        self.toolsList.addItem("--")
         tool = {
-            'menutext': '--',
-            'icon': '',
-            'executable': '',
-            'arguments': '',
-            'redirect': 'no',
+            "menutext": "--",
+            "icon": "",
+            "executable": "",
+            "arguments": "",
+            "redirect": "no",
         }
         self.toollist.append(tool)
-    
+
     @pyqtSlot(str)
     def on_executablePicker_pathSelected(self, path):
         """
         Private slot to check the executable after it has been selected.
-        
+
         @param path path of the executable
         @type str
         """
@@ -272,16 +283,18 @@
                 self.tr("Select executable"),
                 self.tr(
                     "The selected file is not an executable."
-                    " Please choose an executable filename."))
-    
+                    " Please choose an executable filename."
+                ),
+            )
+
     def on_toolsList_currentRowChanged(self, row):
         """
         Private slot to set the lineedits depending on the selected entry.
-        
+
         @param row the row of the selected entry (integer)
         """
         if row >= 0 and row < len(self.toollist):
-            if self.toollist[row]['menutext'] == '--':
+            if self.toollist[row]["menutext"] == "--":
                 self.executablePicker.clear()
                 self.menuEdit.clear()
                 self.iconPicker.clear()
@@ -289,21 +302,22 @@
                 self.redirectCombo.setCurrentIndex(0)
             else:
                 tool = self.toollist[row]
-                self.menuEdit.setText(tool['menutext'])
-                self.iconPicker.setText(tool['icon'])
-                self.executablePicker.setText(tool['executable'])
-                self.argumentsEdit.setText(tool['arguments'])
+                self.menuEdit.setText(tool["menutext"])
+                self.iconPicker.setText(tool["icon"])
+                self.executablePicker.setText(tool["executable"])
+                self.argumentsEdit.setText(tool["arguments"])
                 self.redirectCombo.setCurrentIndex(
-                    self.__findModeIndex(tool['redirect']))
-            
+                    self.__findModeIndex(tool["redirect"])
+                )
+
             self.changeButton.setEnabled(False)
             self.deleteButton.setEnabled(True)
-            
+
             if row != 0:
                 self.upButton.setEnabled(True)
             else:
                 self.upButton.setEnabled(False)
-            
+
             if row + 1 != len(self.toollist):
                 self.downButton.setEnabled(True)
             else:
@@ -317,73 +331,73 @@
             self.upButton.setEnabled(False)
             self.deleteButton.setEnabled(False)
             self.changeButton.setEnabled(False)
-        
+
     def __toolEntryChanged(self):
         """
         Private slot to perform actions when a tool entry was changed.
         """
         row = self.toolsList.currentRow()
         if (
-            row >= 0 and
-            row < len(self.toollist) and
-            self.toollist[row]['menutext'] != '--'
+            row >= 0
+            and row < len(self.toollist)
+            and self.toollist[row]["menutext"] != "--"
         ):
             self.changeButton.setEnabled(True)
-        
+
     def on_menuEdit_textChanged(self, text):
         """
         Private slot called, when the menu text was changed.
-        
+
         @param text the new text (string) (ignored)
         """
         self.__toolEntryChanged()
-        
+
     def on_iconPicker_textChanged(self, text):
         """
         Private slot called, when the icon path was changed.
-        
+
         @param text the new text (string) (ignored)
         """
         self.__toolEntryChanged()
-        
+
     def on_executablePicker_textChanged(self, text):
         """
         Private slot called, when the executable was changed.
-        
+
         @param text the new text (string) (ignored)
         """
         self.__toolEntryChanged()
-        
+
     def on_argumentsEdit_textChanged(self, text):
         """
         Private slot called, when the arguments string was changed.
-        
+
         @param text the new text (string) (ignored)
         """
         self.__toolEntryChanged()
-        
+
     @pyqtSlot(int)
     def on_redirectCombo_currentIndexChanged(self, index):
         """
         Private slot called, when the redirection mode was changed.
-        
+
         @param index the selected mode index (integer) (ignored)
         """
         self.__toolEntryChanged()
-        
+
     def getToollist(self):
         """
         Public method to retrieve the tools list.
-        
+
         @return a list of tuples containing the menu text, the executable,
             the executables arguments and a redirection flag
         """
         return self.toollist[:]
-        
+
     def __swap(self, itm1, itm2):
         """
         Private method used two swap two list entries given by their index.
-        
+
         @param itm1 index of first entry (int)
         @param itm2 index of second entry (int)
         """
--- a/src/eric7/Preferences/ToolGroupConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ToolGroupConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,59 +21,62 @@
     """
     Class implementing a configuration dialog for the tool groups.
     """
+
     def __init__(self, toolGroups, currentGroup, parent=None):
         """
         Constructor
-        
+
         @param toolGroups list of configured tool groups
         @param currentGroup number of the active group (integer)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.currentGroup = currentGroup
         self.toolGroups = copy.deepcopy(toolGroups)
         for group in toolGroups:
             self.groupsList.addItem(group[0])
-        
+
         if len(toolGroups):
             self.groupsList.setCurrentRow(0)
             self.on_groupsList_currentRowChanged(0)
-        
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
         Private slot to clear all entry fields.
         """
         self.nameEdit.clear()
-        
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to add a new entry.
         """
         groupName = self.nameEdit.text()
-        
+
         if not groupName:
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool group entry"),
-                self.tr("You have to give a name for the group to add."))
+                self.tr("You have to give a name for the group to add."),
+            )
             return
-        
-        if len(self.groupsList.findItems(
-                groupName, Qt.MatchFlag.MatchExactly)):
+
+        if len(self.groupsList.findItems(groupName, Qt.MatchFlag.MatchExactly)):
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool group entry"),
-                self.tr("An entry for the group name {0} already exists.")
-                .format(groupName))
+                self.tr("An entry for the group name {0} already exists.").format(
+                    groupName
+                ),
+            )
             return
-        
+
         self.groupsList.addItem(groupName)
         self.toolGroups.append([groupName, []])
-    
+
     @pyqtSlot()
     def on_changeButton_clicked(self):
         """
@@ -82,28 +85,30 @@
         row = self.groupsList.currentRow()
         if row < 0:
             return
-        
+
         groupName = self.nameEdit.text()
-        
+
         if not groupName:
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool group entry"),
-                self.tr("You have to give a name for the group to add."))
+                self.tr("You have to give a name for the group to add."),
+            )
             return
-        
-        if len(self.groupsList.findItems(
-                groupName, Qt.MatchFlag.MatchExactly)):
+
+        if len(self.groupsList.findItems(groupName, Qt.MatchFlag.MatchExactly)):
             EricMessageBox.critical(
                 self,
                 self.tr("Add tool group entry"),
-                self.tr("An entry for the group name {0} already exists.")
-                .format(groupName))
+                self.tr("An entry for the group name {0} already exists.").format(
+                    groupName
+                ),
+            )
             return
-        
+
         self.toolGroups[row][0] = groupName
         self.groupsList.currentItem().setText(groupName)
-        
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -112,21 +117,23 @@
         row = self.groupsList.currentRow()
         if row < 0:
             return
-        
+
         res = EricMessageBox.yesNo(
             self,
             self.tr("Delete tool group entry"),
-            self.tr("""<p>Do you really want to delete the tool group"""
-                    """ <b>"{0}"</b>?</p>""")
-            .format(self.groupsList.currentItem().text()),
-            icon=EricMessageBox.Warning)
+            self.tr(
+                """<p>Do you really want to delete the tool group"""
+                """ <b>"{0}"</b>?</p>"""
+            ).format(self.groupsList.currentItem().text()),
+            icon=EricMessageBox.Warning,
+        )
         if not res:
             return
-        
+
         if row == self.currentGroup:
             # set to default group if current group gets deleted
             self.currentGroup = -1
-        
+
         del self.toolGroups[row]
         itm = self.groupsList.takeItem(row)
         del itm
@@ -134,7 +141,7 @@
             row -= 1
         self.groupsList.setCurrentRow(row)
         self.on_groupsList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -149,7 +156,7 @@
         if curr + 1 == len(self.toolGroups):
             self.downButton.setEnabled(False)
         self.upButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -164,25 +171,25 @@
         if curr - 1 == 0:
             self.upButton.setEnabled(False)
         self.downButton.setEnabled(True)
-        
+
     def on_groupsList_currentRowChanged(self, row):
         """
         Private slot to set the lineedits depending on the selected entry.
-        
+
         @param row the row of the selected entry (integer)
         """
         if row >= 0 and row < len(self.toolGroups):
             group = self.toolGroups[row]
             self.nameEdit.setText(group[0])
-            
+
             self.deleteButton.setEnabled(True)
             self.changeButton.setEnabled(True)
-            
+
             if row != 0:
                 self.upButton.setEnabled(True)
             else:
                 self.upButton.setEnabled(False)
-            
+
             if row + 1 != len(self.toolGroups):
                 self.downButton.setEnabled(True)
             else:
@@ -193,20 +200,20 @@
             self.upButton.setEnabled(False)
             self.deleteButton.setEnabled(False)
             self.changeButton.setEnabled(False)
-        
+
     def getToolGroups(self):
         """
         Public method to retrieve the tool groups.
-        
+
         @return a list of lists containing the group name and the
             tool group entries
         """
         return self.toolGroups[:], self.currentGroup
-        
+
     def __swap(self, itm1, itm2):
         """
         Private method used two swap two list entries given by their index.
-        
+
         @param itm1 index of first entry (int)
         @param itm2 index of second entry (int)
         """
--- a/src/eric7/Preferences/ViewProfileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/ViewProfileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to configure the various view profiles.
     """
-    def __init__(self, layout, editVisibilities, debugVisibilities,
-                 parent=None):
+
+    def __init__(self, layout, editVisibilities, debugVisibilities, parent=None):
         """
         Constructor
-        
+
         @param layout type of the window layout (string)
         @param editVisibilities list  of flags giving the visibilities
             of the various parts for the 'edit' view profile (list of boolean)
@@ -31,36 +31,35 @@
         @exception ValueError raised to indicate an invalid layout
         """
         super().__init__(parent)
-        
+
         if layout not in ("Toolboxes", "Sidebars"):
-            raise ValueError(
-                "Illegal layout given ({0}).".format(self.__layout))
-        
+            raise ValueError("Illegal layout given ({0}).".format(self.__layout))
+
         self.__layout = layout
         if self.__layout == "Toolboxes":
             self.ui = Ui_ViewProfileToolboxesDialog()
         else:
             self.ui = Ui_ViewProfileSidebarsDialog()
         self.ui.setupUi(self)
-        
+
         if self.__layout in ["Toolboxes", "Sidebars"]:
             # set the edit profile
             self.ui.epltCheckBox.setChecked(editVisibilities[0])
             self.ui.ephtCheckBox.setChecked(editVisibilities[1])
             self.ui.eprtCheckBox.setChecked(editVisibilities[2])
-        
+
             # set the debug profile
             self.ui.dpltCheckBox.setChecked(debugVisibilities[0])
             self.ui.dphtCheckBox.setChecked(debugVisibilities[1])
             self.ui.dprtCheckBox.setChecked(debugVisibilities[2])
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getVisibilities(self):
         """
         Public method to retrieve the visibilities configuration.
-        
+
         @return tuple of two lists giving the visibilities of the
             various parts (two lists of boolean)
         """
@@ -77,10 +76,10 @@
                     self.ui.dpltCheckBox.isChecked(),
                     self.ui.dphtCheckBox.isChecked(),
                     self.ui.dprtCheckBox.isChecked(),
-                ]
+                ],
             )
-        
+
         return (
-            [True, True, True],         # edit profile
-            [True, True, True],         # debug profile
+            [True, True, True],  # edit profile
+            [True, True, True],  # debug profile
         )
--- a/src/eric7/Preferences/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Preferences/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,22 @@
 import json
 
 from PyQt6.QtCore import (
-    QDir, QPoint, QLocale, QSettings, QCoreApplication, QByteArray, QSize,
-    QUrl, Qt, QLibraryInfo, QDateTime, QtMsgType
+    QDir,
+    QPoint,
+    QLocale,
+    QSettings,
+    QCoreApplication,
+    QByteArray,
+    QSize,
+    QUrl,
+    Qt,
+    QLibraryInfo,
+    QDateTime,
+    QtMsgType,
 )
 from PyQt6.QtGui import QColor, QFont, QPalette
 from PyQt6.QtWidgets import QApplication
+
 try:
     from PyQt6.QtWebEngineCore import QWebEngineSettings, QWebEngineProfile
 except ImportError:
@@ -43,9 +54,14 @@
 import Globals
 
 from Project.ProjectBrowserFlags import (
-    SourcesBrowserFlag, FormsBrowserFlag, ResourcesBrowserFlag,
-    TranslationsBrowserFlag, InterfacesBrowserFlag, OthersBrowserFlag,
-    ProtocolsBrowserFlag, AllBrowsersFlag
+    SourcesBrowserFlag,
+    FormsBrowserFlag,
+    ResourcesBrowserFlag,
+    TranslationsBrowserFlag,
+    InterfacesBrowserFlag,
+    OthersBrowserFlag,
+    ProtocolsBrowserFlag,
+    AllBrowsersFlag,
 )
 
 from QScintilla.Shell import ShellHistoryStyle
@@ -55,12 +71,10 @@
     """
     A class to hold all configuration items for the application.
     """
+
     # defaults for the variables window
-    varDefaults = {
-        "LocalsFilter": "[]",
-        "GlobalsFilter": "[]"
-    }
-    
+    varDefaults = {"LocalsFilter": "[]", "GlobalsFilter": "[]"}
+
     # defaults for the debugger
     debuggerDefaults = {
         "RemoteDbgEnabled": False,
@@ -97,7 +111,7 @@
         "PathTranslationLocal": "",
         "NetworkInterface": "127.0.0.1",
         "AutoViewSourceCode": False,
-        "MaxVariableSize": 0,     # Bytes, 0 = no limit
+        "MaxVariableSize": 0,  # Bytes, 0 = no limit
         "BgColorNew": QColor("#28FFEEAA"),
         "BgColorChanged": QColor("#2870FF66"),
         "AllowedHosts": ["127.0.0.1", "::1%0"],
@@ -106,19 +120,19 @@
         # Global Multiprocess Debugging Support
         "MultiProcessEnabled": True,
     }
-    
+
     # defaults for the UI settings
     uiDefaults = {
-        "KeyboardInputInterval": 0,         # 0 = use system default
-        "BackgroundServiceProcesses": 0,    # 0 = max. CPUs minus one
+        "KeyboardInputInterval": 0,  # 0 = use system default
+        "BackgroundServiceProcesses": 0,  # 0 = max. CPUs minus one
         "Language": "System",
         "Style": "System",
         "StyleSheet": "",
         "StyleIconsPath": "",
         "ViewManager": "tabview",
-        "LayoutType": "Sidebars",           # "Toolboxes" or "Sidebars"
+        "LayoutType": "Sidebars",  # "Toolboxes" or "Sidebars"
         "CombinedLeftRightSidebar": False,  # place all tools into the
-                                            # left sidebar
+        # left sidebar
         "IconBarColor": QColor("#008800"),
         "IconBarSize": EricIconBar.DefaultBarSize,
         "BrowsersListFoldersFirst": True,
@@ -140,19 +154,19 @@
         "ShowFilePreview": True,
         "ShowFilePreviewJS": True,
         "ShowFilePreviewSSI": True,
-        "ShowTemplateViewer": True,             # left side
-        "ShowFileBrowser": True,                # left side
-        "ShowSymbolsViewer": True,              # left side
-        "ShowFindFileWidget": True,             # left side
-        "ShowFindLocationWidget": True,         # left side
-        "ShowCodeDocumentationViewer": True,    # right side
-        "ShowPyPIPackageManager": True,         # right side
-        "ShowCondaPackageManager": True,        # right side
-        "ShowCooperation": True,                # right side
-        "ShowIrc": True,                        # right side
-        "ShowMicroPython": True,                # right side
-        "ShowInternalHelpViewer": True,         # right side
-        "ShowNumbersViewer": True,              # bottom side
+        "ShowTemplateViewer": True,  # left side
+        "ShowFileBrowser": True,  # left side
+        "ShowSymbolsViewer": True,  # left side
+        "ShowFindFileWidget": True,  # left side
+        "ShowFindLocationWidget": True,  # left side
+        "ShowCodeDocumentationViewer": True,  # right side
+        "ShowPyPIPackageManager": True,  # right side
+        "ShowCondaPackageManager": True,  # right side
+        "ShowCooperation": True,  # right side
+        "ShowIrc": True,  # right side
+        "ShowMicroPython": True,  # right side
+        "ShowInternalHelpViewer": True,  # right side
+        "ShowNumbersViewer": True,  # bottom side
         "ViewProfiles": {
             "edit": [
                 # saved state main window with toolbox windows (0)
@@ -184,7 +198,6 @@
         "ShowSplash": True,
         "SplitOrientationVertical": False,
         "UseNativeMenuBar": True,
-        
         "PerformVersionCheck": 3,
         # 0 = off
         # 1 = at startup
@@ -210,19 +223,17 @@
         "ProxyType/Ftp": EricFtpProxyType.NO_PROXY,
         "ProxyAccount/Ftp": "",
         "ProxyExceptions": "localhost,127.0.0.,::1",
-        
-        "PluginRepositoryUrl7":
-        "https://eric-ide.python-projects.org/plugins7/repository.xml",
-        
-        "OpenOnStartup": 0,        # 0 = nothing
-                                   # 1 = last file
-                                   # 2 = last project
-                                   # 3 = last multiproject
-                                   # 4 = last global session
+        "PluginRepositoryUrl7": (
+            "https://eric-ide.python-projects.org/plugins7/repository.xml"
+        ),
+        "OpenOnStartup": 0,  # 0 = nothing
+        # 1 = last file
+        # 2 = last project
+        # 3 = last multiproject
+        # 4 = last global session
         "OpenCrashSessionOnStartup": True,
         "CrashSessionEnabled": True,
         "UpgraderDelay": 5,
-        
         "DownloadPath": "",
         "RequestDownloadFilename": True,
         "CheckErrorLog": True,
@@ -231,10 +242,9 @@
         # 1 = QtMsgType.QtWarningMsg
         # 2 = QtMsgType.QtCriticalMsg
         # 3 = QtMsgType.QtFatalMsg
-
         "LogStdErrColour": QColor(Qt.GlobalColor.red),
-        "NotificationTimeout": 5,       # time in seconds the notification
-                                        # is shown
+        "NotificationTimeout": 5,  # time in seconds the notification
+        # is shown
         "NotificationPosition": QPoint(10, 10),
         "NotificationWarningForeground": "#606000",
         "NotificationWarningBackground": "#ffffd0",
@@ -341,17 +351,16 @@
             "application/xsl+xml",
             "application/xslt+xml",
             "application/x-desktop",
-            
             "image/svg+xml",
         ],
     }
-    
+
     iconsDefaults = {
         "Path": [],
         "DefaultIconsPath": "automatic",
         # automatic, breeze-dark, breeze-light, oxygen
     }
-    
+
     # defaults for the cooperation settings
     cooperationDefaults = {
         "ServerPort": 42000,
@@ -361,13 +370,13 @@
         "AutoAcceptConnections": False,
         "BannedUsers": [],
     }
-    
+
     # defaults for the editor settings
     editorDefaults = {
         "AutosaveInterval": 0,
         "TabWidth": 4,
         "IndentWidth": 4,
-        "TabIndentOverride": "{}",      # JSON formatted dictionary
+        "TabIndentOverride": "{}",  # JSON formatted dictionary
         "IndentationGuides": True,
         "LinenoMargin": True,
         "FoldingMargin": True,
@@ -390,10 +399,8 @@
         "InsertFinalNewline": True,
         "CommentColumn0": True,
         "OverrideEditAreaColours": False,
-        
         "EdgeMode": QsciScintilla.EdgeMode.EdgeNone,
         "EdgeColumn": 88,
-        
         "AutoIndentation": True,
         "BraceHighlighting": True,
         "CreateBackupFile": False,
@@ -405,9 +412,7 @@
         "CustomSelectionColours": False,
         "ExtendSelectionToEol": False,
         "LineMarkersBackground": True,
-        
         "AutoPrepareAPIs": False,
-        
         "AutoCompletionEnabled": False,
         "AutoCompletionCaseSensitivity": True,
         "AutoCompletionReplaceWord": False,
@@ -422,42 +427,33 @@
         "AutoCompletionReversedList": False,
         "AutoCompletionCacheEnabled": True,
         "AutoCompletionCacheSize": 100,
-        "AutoCompletionCacheTime": 300,     # 5 minutes
-        "AutoCompletionWatchdogTime": 3000,     # ms
+        "AutoCompletionCacheTime": 300,  # 5 minutes
+        "AutoCompletionWatchdogTime": 3000,  # ms
         "AutoCompletionMaxLines": 5,
         "AutoCompletionMaxChars": 40,
-        
         "CallTipsEnabled": False,
         "CallTipsVisible": 0,
         "CallTipsStyle": QsciScintilla.CallTipsStyle.CallTipsNoContext,
         "CallTipsPosition": QsciScintilla.CallTipsPosition.CallTipsBelowText,
         # show QScintilla calltips, if plug-in fails
         "CallTipsScintillaOnFail": False,
-        
         "AutoCheckSyntax": True,
         "OnlineSyntaxCheck": True,
         "OnlineSyntaxCheckInterval": 5,
-        
         "OnlineChangeTrace": True,
-        "OnlineChangeTraceInterval": 500,       # 500 milliseconds
-        
+        "OnlineChangeTraceInterval": 500,  # 500 milliseconds
         "MouseHoverHelp": False,
-        "MouseHoverTimeout": 500,               # 500 milliseconds
-        
+        "MouseHoverTimeout": 500,  # 500 milliseconds
         "AutoReopen": False,
-        
         "AnnotationsEnabled": True,
-        
         "MiniContextMenu": False,
         "HideFormatButtons": True,
-        
         "SearchMarkersEnabled": True,
         "QuickSearchMarkersEnabled": True,
         "MarkOccurrencesEnabled": True,
-        "MarkOccurrencesTimeout": 500,     # 500 milliseconds
-        "SearchRegexpMode": 0,             # 0: POSIX mode, 1: CXX11 mode
+        "MarkOccurrencesTimeout": 500,  # 500 milliseconds
+        "SearchRegexpMode": 0,  # 0: POSIX mode, 1: CXX11 mode
         "AdvancedEncodingDetection": True,
-        
         "SpellCheckingEnabled": True,
         "AutoSpellCheckingEnabled": True,
         "AutoSpellCheckChunkSize": 30,
@@ -468,18 +464,17 @@
         "SpellCheckingPersonalExcludeList": "",
         "FullSpellCheckExtensions": ["md", "markdown", "rst", "txt"],
         "FullSpellCheckUnknown": False,
-        
         "DefaultEncoding": "utf-8",
         "DefaultOpenFilter": QCoreApplication.translate(
-            'Lexers', 'Python Files (*.py *.py3)'),
+            "Lexers", "Python Files (*.py *.py3)"
+        ),
         "DefaultSaveFilter": QCoreApplication.translate(
-            'Lexers', "Python3 Files (*.py)"),
+            "Lexers", "Python3 Files (*.py)"
+        ),
         "AdditionalOpenFilters": [],
         "AdditionalSaveFilters": [],
-        
         "ZoomFactor": 0,
-        
-        "PreviewRefreshWaitTimer": 500,     # wait time in milliseconds
+        "PreviewRefreshWaitTimer": 500,  # wait time in milliseconds
         "PreviewHtmlFileNameExtensions": ["html", "htm", "svg", "asp", "kid"],
         "PreviewMarkdownFileNameExtensions": ["md", "markdown"],
         "PreviewRestFileNameExtensions": ["rst"],
@@ -490,34 +485,25 @@
         "PreviewMarkdownMathJax": True,
         "PreviewMarkdownMermaid": True,
         "PreviewMarkdownHTMLFormat": "HTML5",  # XHTML1, HTML4, HTML5
-        "PreviewRestDocutilsHTMLFormat": "HTML5",   # HTML4, HTML5
-        
+        "PreviewRestDocutilsHTMLFormat": "HTML5",  # HTML4, HTML5
         "VirtualSpaceOptions": QsciScintilla.SCVS_NONE,
-        
         "MouseClickHandlersEnabled": True,
-        
         "ShowMarkerMapOnRight": True,
         "ShowMarkerChanges": True,
         "ShowMarkerCoverage": True,
         "ShowMarkerSearch": True,
-        
         "ShowSourceOutline": True,
         "SourceOutlineWidth": 200,
         "SourceOutlineStepSize": 50,
         "SourceOutlineShowCoding": True,
-        
         "DocstringType": "ericdoc",
         "DocstringAutoGenerate": True,
-        
         # All (most) lexers
         "AllFoldCompact": True,
-        
         # Bash specifics
         "BashFoldComment": True,
-        
         # CMake specifics
         "CMakeFoldAtElse": False,
-        
         # C++ specifics
         "CppCaseInsensitiveKeywords": False,
         "CppFoldComment": True,
@@ -532,27 +518,22 @@
         "CppHighlightBackQuotedStrings": False,
         "CppHighlightEscapeSequences": False,
         "CppVerbatimStringEscapeSequencesAllowed": False,
-        
         # CoffeeScript specifics
         "CoffeScriptFoldComment": False,
         "CoffeeScriptDollarsAllowed": True,
         "CoffeeScriptStylePreprocessor": False,
-        
         # CSS specifics
         "CssFoldComment": True,
         "CssHssSupport": False,
         "CssLessSupport": False,
         "CssSassySupport": False,
-        
         # D specifics
         "DFoldComment": True,
         "DFoldAtElse": False,
         "DIndentOpeningBrace": False,
         "DIndentClosingBrace": False,
-        
         # Gettext specifics
         "PoFoldComment": False,
-        
         # HTML specifics
         "HtmlFoldPreprocessor": False,
         "HtmlFoldScriptComments": False,
@@ -560,38 +541,29 @@
         "HtmlCaseSensitiveTags": False,
         "HtmlDjangoTemplates": False,
         "HtmlMakoTemplates": False,
-        
         # JSON specifics
         "JSONHightlightComments": True,
         "JSONHighlightEscapeSequences": True,
-        
         # Pascal specifics
         "PascalFoldComment": True,
         "PascalFoldPreprocessor": False,
         "PascalSmartHighlighting": True,
-        
         # Perl specifics
         "PerlFoldComment": True,
         "PerlFoldPackages": True,
         "PerlFoldPODBlocks": True,
         "PerlFoldAtElse": False,
-        
         # PostScript specifics
         "PostScriptTokenize": False,
         "PostScriptLevel": 3,
         "PostScriptFoldAtElse": False,
-        
         # Povray specifics
         "PovFoldComment": True,
         "PovFoldDirectives": False,
-        
         # Properties specifics
         "PropertiesInitialSpaces": True,
-        
         # Python specifics
-        "PythonBadIndentation": (
-            QsciLexerPython.IndentationWarning.Inconsistent
-        ),
+        "PythonBadIndentation": (QsciLexerPython.IndentationWarning.Inconsistent),
         "PythonFoldComment": True,
         "PythonFoldString": True,
         "PythonAutoIndent": True,
@@ -601,10 +573,8 @@
         "PythonFoldQuotes": False,
         "PythonStringsOverNewLineAllowed": False,
         "PythonHighlightSubidentifier": True,
-        
         # Ruby specifics
         "RubyFoldComment": False,
-        
         # SQL specifics
         "SqlFoldComment": True,
         "SqlBackslashEscapes": False,
@@ -613,33 +583,28 @@
         "SqlFoldOnlyBegin": False,
         "SqlHashComments": False,
         "SqlQuotedIdentifiers": False,
-        
         # TCL specifics
         "TclFoldComment": False,
-        
         # TeX specifics
         "TexFoldComment": False,
         "TexProcessComments": False,
         "TexProcessIf": True,
-        
         # VHDL specifics
         "VHDLFoldComment": True,
         "VHDLFoldAtElse": True,
         "VHDLFoldAtBegin": True,
         "VHDLFoldAtParenthesis": True,
-        
         # XML specifics
         "XMLStyleScripts": True,
-        
         # YAML specifics
         "YAMLFoldComment": False,
     }
-    
+
     if Globals.isWindowsPlatform():
         editorDefaults["EOLMode"] = QsciScintilla.EolMode.EolWindows
     else:
         editorDefaults["EOLMode"] = QsciScintilla.EolMode.EolUnix
-    
+
     editorColourDefaults = {
         "CurrentMarker": QColor(Qt.GlobalColor.yellow),
         "ErrorMarker": QColor(Qt.GlobalColor.red),
@@ -674,7 +639,7 @@
         "OnlineChangeTraceMarkerSaved": QColor("#88ff88"),
         "IndentationGuidesBackground": QColor(Qt.GlobalColor.white),
         "IndentationGuidesForeground": QColor(Qt.GlobalColor.black),
-        "HighlightMarker": QColor("#200000FF"),     # ARGB format
+        "HighlightMarker": QColor("#200000FF"),  # ARGB format
         # colors for the marker map
         "BookmarksMap": QColor("#f8c700"),
         "ErrorsMap": QColor("#dd0000"),
@@ -688,13 +653,13 @@
         "VcsConflictMarkersMap": QColor("#dd00dd"),
         "MarkerMapBackground": QColor("#e7e7e7"),
     }
-    
+
     editorOtherFontsDefaults = {
         "MarginsFont": "Sans Serif,10,-1,5,50,0,0,0,0,0",
         "DefaultFont": "Sans Serif,10,-1,5,50,0,0,0,0,0",
         "MonospacedFont": "Courier,10,-1,5,50,0,0,0,0,0",
     }
-    
+
     editorTypingDefaults = {
         "Python/EnabledTypingAids": True,
         "Python/InsertClosingBrace": True,
@@ -709,7 +674,6 @@
         "Python/InsertBlank": True,
         "Python/ColonDetection": True,
         "Python/DedentDef": False,
-        
         "Ruby/EnabledTypingAids": True,
         "Ruby/InsertClosingBrace": True,
         "Ruby/IndentBrace": True,
@@ -718,7 +682,6 @@
         "Ruby/InsertBlank": True,
         "Ruby/InsertHereDoc": True,
         "Ruby/InsertInlineDoc": True,
-        
         "Yaml/EnabledTypingAids": True,
         "Yaml/InsertClosingBrace": True,
         "Yaml/SkipBrace": True,
@@ -730,34 +693,30 @@
         "Yaml/InsertBlankQuestion": True,
         "Yaml/InsertBlankComma": True,
     }
-    
+
     editorExporterDefaults = {
         "HTML/WYSIWYG": True,
         "HTML/Folding": False,
         "HTML/OnlyStylesUsed": False,
         "HTML/FullPathAsTitle": False,
         "HTML/UseTabs": False,
-        
         "RTF/WYSIWYG": True,
         "RTF/UseTabs": False,
         "RTF/Font": "Courier New,10,-1,5,50,0,0,0,0,0",
-        
         "PDF/Magnification": 0,
         "PDF/Font": "Helvetica",  # must be Courier, Helvetica or Times
-        "PDF/PageSize": "A4",         # must be A4 or Letter
+        "PDF/PageSize": "A4",  # must be A4 or Letter
         "PDF/MarginLeft": 36,
         "PDF/MarginRight": 36,
         "PDF/MarginTop": 36,
         "PDF/MarginBottom": 36,
-        
         "TeX/OnlyStylesUsed": False,
         "TeX/FullPathAsTitle": False,
-        
         "ODT/WYSIWYG": True,
         "ODT/OnlyStylesUsed": False,
         "ODT/UseTabs": False,
     }
-    
+
     # defaults for the printer settings
     printerDefaults = {
         "PrinterName": "",
@@ -771,9 +730,9 @@
         "RightMargin": 1.0,
         "TopMargin": 1.0,
         "BottomMargin": 1.0,
-        "Resolution": 150,      # printer resolution in DPI
+        "Resolution": 150,  # printer resolution in DPI
     }
-    
+
     # defaults for the project settings
     projectDefaults = {
         "SearchNewFiles": False,
@@ -801,7 +760,7 @@
         "RestartShellForProject": True,
         "BrowsersListHiddenFiles": False,
     }
-    
+
     # defaults for the multi project settings
     multiProjectDefaults = {
         "OpenMasterAutomatically": True,
@@ -809,98 +768,108 @@
         "RecentNumber": 9,
         "Workspace": "",
     }
-    
+
     # defaults for the project browser flags settings
     projectBrowserFlagsDefaults = {
         "PyQt5": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | FormsBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PyQt5C": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PyQt6": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | FormsBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PyQt6C": (
-            SourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "E7Plugin": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | FormsBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "Console": (
-            SourcesBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "Other": (
-            SourcesBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PySide2": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | FormsBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PySide2C": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PySide6": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | FormsBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
         "PySide6C": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
+            SourcesBrowserFlag
+            | ResourcesBrowserFlag
+            | TranslationsBrowserFlag
+            | InterfacesBrowserFlag
+            | OthersBrowserFlag
+            | ProtocolsBrowserFlag
+        ),
     }
-    
+
     # defaults for the project browser colour settings
     projectBrowserColourDefaults = {
         "Highlighted": QColor(Qt.GlobalColor.red),
-        
         "VcsAdded": QColor(Qt.GlobalColor.blue),
         "VcsConflict": QColor(Qt.GlobalColor.red),
         "VcsModified": QColor(Qt.GlobalColor.yellow),
         "VcsReplaced": QColor(Qt.GlobalColor.cyan),
         "VcsUpdate": QColor(Qt.GlobalColor.green),
-        "VcsRemoved": QColor(Qt.GlobalColor.magenta)
+        "VcsRemoved": QColor(Qt.GlobalColor.magenta),
     }
-    
+
     # defaults for the help settings
     helpDefaults = {
         "CustomViewer": "",
@@ -912,10 +881,10 @@
         "PySide2DocDir": "",
         "PySide6DocDir": "",
         "EricDocDir": "",
-        "HelpViewerType": 0,    # internal help viewer
-        "Bookmarks": "[]",      # empty JSON list
+        "HelpViewerType": 0,  # internal help viewer
+        "Bookmarks": "[]",  # empty JSON list
     }
-    
+
     # defaults for the web browser settings
     webBrowserDefaults = {
         "SingleWebBrowserWindow": True,
@@ -925,13 +894,13 @@
         "StatusBarVisible": True,
         "SaveGeometry": True,
         "WebBrowserState": QByteArray(),
-        "StartupBehavior": 2,       # show speed dial
+        "StartupBehavior": 2,  # show speed dial
         # 0     open empty page
         # 1     open home page
         # 2     open speed dial
         # 3     restore last session
         # 4     ask user for session
-        "NewTabBehavior": 2,        # show speed dial
+        "NewTabBehavior": 2,  # show speed dial
         # 0     open empty page
         # 1     open home page
         # 2     open speed dial
@@ -940,44 +909,44 @@
         "WarnOnMultipleClose": True,
         "DefaultScheme": "https://",
         "UserStyleSheet": "",
-        "ZoomValuesDB": "{}",       # empty JSON dictionary
+        "ZoomValuesDB": "{}",  # empty JSON dictionary
         "HistoryLimit": 30,
         "WebSearchSuggestions": True,
         "WebSearchEngine": "DuckDuckGo",
-        "WebSearchKeywords": [],    # array of two tuples (keyword,
-                                    # search engine name)
+        "WebSearchKeywords": [],  # array of two tuples (keyword,
+        # search engine name)
         "SearchLanguage": QLocale().language(),
         "ImageSearchEngine": "Google",
         "RssFeeds": [],
         "ShowPreview": True,
         "DiskCacheEnabled": True,
-        "DiskCacheSize": 50,        # 50 MB
-        "SslExceptionsDB": "{}",    # empty JSON dictionary
+        "DiskCacheSize": 50,  # 50 MB
+        "SslExceptionsDB": "{}",  # empty JSON dictionary
         "AlwaysRejectFaultyCertificates": False,
         "DoNotTrack": False,
-        "RefererSendReferer": 0,      # never send a referrer
-        "RefererDefaultPolicy": 3,    # don't send a referrer when downgrading
-        "RefererTrimmingPolicy": 0,   # send full URL (no trimming)
+        "RefererSendReferer": 0,  # never send a referrer
+        "RefererDefaultPolicy": 3,  # don't send a referrer when downgrading
+        "RefererTrimmingPolicy": 0,  # send full URL (no trimming)
         "SendRefererWhitelist": ["qt-apps.org", "kde-apps.org"],
-        "AcceptCookies": 2,         # CookieJar.AcceptOnlyFromSitesNavigatedTo
-        "KeepCookiesUntil": 0,      # CookieJar.KeepUntilExpire
+        "AcceptCookies": 2,  # CookieJar.AcceptOnlyFromSitesNavigatedTo
+        "KeepCookiesUntil": 0,  # CookieJar.KeepUntilExpire
         "FilterTrackingCookies": True,
         "SecureUrlColor": QColor(184, 248, 169),
         "InsecureUrlColor": QColor(248, 227, 169),
         "MaliciousUrlColor": QColor(255, 132, 140),
         "PrivateModeUrlColor": QColor(220, 220, 220),
         "UserAgent": "",
-        "AcceptQuotaRequest": 2,            # yes/no/ask (0, 1, 2)
+        "AcceptQuotaRequest": 2,  # yes/no/ask (0, 1, 2)
         "AcceptProtocolHandlerRequest": 2,  # yes/no/ask (0, 1, 2)
         # Auto Scroller
         "AutoScrollEnabled": True,
         "AutoScrollDivider": 8.0,
         # Tab Manager
-        "TabManagerGroupByType": 0,     # TabManagerWidget.GroupByWindow
+        "TabManagerGroupByType": 0,  # TabManagerWidget.GroupByWindow
         # Grease Monkey
         "GreaseMonkeyDisabledScripts": [],
         # Downloads
-        "DownloadManagerRemovePolicy": 0,      # never delete downloads
+        "DownloadManagerRemovePolicy": 0,  # never delete downloads
         "DownloadManagerSize": QSize(450, 600),
         "DownloadManagerPosition": QPoint(),
         "DownloadManagerDownloads": [],
@@ -986,9 +955,10 @@
         # Spell Checking
         "SpellCheckEnabled": False,
         "SpellCheckLanguages": [],
-        "SpellCheckDictionariesUrl":
-        ("https://eric-ide.python-projects.org/qwebengine_dictionaries/"
-         "dictionaries.xml"),
+        "SpellCheckDictionariesUrl": (
+            "https://eric-ide.python-projects.org/qwebengine_dictionaries/"
+            "dictionaries.xml"
+        ),
         # Sync
         "SyncEnabled": False,
         "SyncBookmarks": True,
@@ -998,7 +968,7 @@
         "SyncSpeedDial": True,
         "SyncEncryptData": False,
         "SyncEncryptionKey": "",
-        "SyncEncryptionKeyLength": 32,      # 16, 24 or 32
+        "SyncEncryptionKeyLength": 32,  # 16, 24 or 32
         "SyncEncryptPasswordsOnly": False,
         "SyncType": 0,
         "SyncFtpServer": "",
@@ -1041,13 +1011,13 @@
         "SessionLastActivePath": "",
         # Google Safe Browsing
         "SafeBrowsingEnabled": True,
-        "SafeBrowsingApiKey": "",       # API key
+        "SafeBrowsingApiKey": "",  # API key
         "SafeBrowsingFilterPlatform": True,
         "SafeBrowsingAutoUpdate": False,
         "SafeBrowsingUpdateDateTime": QDateTime(),
         "SafeBrowsingUseLookupApi": False,
     }
-    
+
     @classmethod
     def initWebEngineSettingsDefaults(cls):
         """
@@ -1055,113 +1025,140 @@
         """
         if QWebEngineSettings is None:
             return
-        
+
         webEngineSettings = QWebEngineProfile.defaultProfile().settings()
-        cls.webBrowserDefaults.update({
-            # fonts
-            "StandardFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.StandardFont),
-            "FixedFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.FixedFont),
-            "SerifFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.StandardFont),
-            "SansSerifFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.SansSerifFont),
-            "CursiveFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.CursiveFont),
-            "FantasyFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.FantasyFont),
-            "PictographFontFamily": webEngineSettings.fontFamily(
-                QWebEngineSettings.FontFamily.PictographFont),
-            
-            # font sizes
-            "DefaultFontSize": webEngineSettings.fontSize(
-                QWebEngineSettings.FontSize.DefaultFontSize),
-            "DefaultFixedFontSize": webEngineSettings.fontSize(
-                QWebEngineSettings.FontSize.DefaultFixedFontSize),
-            "MinimumFontSize": webEngineSettings.fontSize(
-                QWebEngineSettings.FontSize.MinimumFontSize),
-            "MinimumLogicalFontSize": webEngineSettings.fontSize(
-                QWebEngineSettings.FontSize.MinimumLogicalFontSize),
-            
-            # text encoding
-            "DefaultTextEncoding": webEngineSettings.defaultTextEncoding(),
-            
-            # web attributes
-            "AutoLoadImages": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.AutoLoadImages),
-            "JavaScriptEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled),
-            "JavaScriptCanOpenWindows": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows),
-            "JavaScriptCanAccessClipboard": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard),
-            "LinksIncludedInFocusChain": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain),
-            "LocalStorageEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.LocalStorageEnabled),
-            "LocalContentCanAccessRemoteUrls": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute
-                .LocalContentCanAccessRemoteUrls),
-            "XSSAuditingEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.XSSAuditingEnabled),
-            "SpatialNavigationEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.SpatialNavigationEnabled),
-            "LocalContentCanAccessFileUrls": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls),
-            "ScrollAnimatorEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled),
-            "ErrorPageEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.ErrorPageEnabled),
-            "PluginsEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.PluginsEnabled),
-            "FullScreenSupportEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.FullScreenSupportEnabled),
-            "ScreenCaptureEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.ScreenCaptureEnabled),
-            "WebGLEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.WebGLEnabled),
-            "Accelerated2dCanvasEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.Accelerated2dCanvasEnabled),
-            "AutoLoadIconsForPage": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.AutoLoadIconsForPage),
-            "FocusOnNavigationEnabled": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled),
-            "PrintElementBackgrounds": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.PrintElementBackgrounds),
-            "AllowRunningInsecureContent": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.AllowRunningInsecureContent),
-            "AllowGeolocationOnInsecureOrigins":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute
-                    .AllowGeolocationOnInsecureOrigins),
-            "AllowWindowActivationFromJavaScript":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute
-                    .AllowWindowActivationFromJavaScript),
-            "ShowScrollBars": webEngineSettings.testAttribute(
-                QWebEngineSettings.WebAttribute.ShowScrollBars),
-            "PlaybackRequiresUserGesture":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute
-                    .PlaybackRequiresUserGesture),
-            "JavaScriptCanPaste":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute.JavascriptCanPaste),
-            "WebRTCPublicInterfacesOnly":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute
-                    .WebRTCPublicInterfacesOnly),
-            "DnsPrefetchEnabled":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute.DnsPrefetchEnabled),
-            "PdfViewerEnabled":
-                webEngineSettings.testAttribute(
-                    QWebEngineSettings.WebAttribute.PdfViewerEnabled),
-        })
-        
+        cls.webBrowserDefaults.update(
+            {
+                # fonts
+                "StandardFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.StandardFont
+                ),
+                "FixedFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.FixedFont
+                ),
+                "SerifFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.StandardFont
+                ),
+                "SansSerifFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.SansSerifFont
+                ),
+                "CursiveFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.CursiveFont
+                ),
+                "FantasyFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.FantasyFont
+                ),
+                "PictographFontFamily": webEngineSettings.fontFamily(
+                    QWebEngineSettings.FontFamily.PictographFont
+                ),
+                # font sizes
+                "DefaultFontSize": webEngineSettings.fontSize(
+                    QWebEngineSettings.FontSize.DefaultFontSize
+                ),
+                "DefaultFixedFontSize": webEngineSettings.fontSize(
+                    QWebEngineSettings.FontSize.DefaultFixedFontSize
+                ),
+                "MinimumFontSize": webEngineSettings.fontSize(
+                    QWebEngineSettings.FontSize.MinimumFontSize
+                ),
+                "MinimumLogicalFontSize": webEngineSettings.fontSize(
+                    QWebEngineSettings.FontSize.MinimumLogicalFontSize
+                ),
+                # text encoding
+                "DefaultTextEncoding": webEngineSettings.defaultTextEncoding(),
+                # web attributes
+                "AutoLoadImages": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.AutoLoadImages
+                ),
+                "JavaScriptEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.JavascriptEnabled
+                ),
+                "JavaScriptCanOpenWindows": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows
+                ),
+                "JavaScriptCanAccessClipboard": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard
+                ),
+                "LinksIncludedInFocusChain": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain
+                ),
+                "LocalStorageEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.LocalStorageEnabled
+                ),
+                "LocalContentCanAccessRemoteUrls": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls
+                ),
+                "XSSAuditingEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.XSSAuditingEnabled
+                ),
+                "SpatialNavigationEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.SpatialNavigationEnabled
+                ),
+                "LocalContentCanAccessFileUrls": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls
+                ),
+                "ScrollAnimatorEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled
+                ),
+                "ErrorPageEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.ErrorPageEnabled
+                ),
+                "PluginsEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.PluginsEnabled
+                ),
+                "FullScreenSupportEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.FullScreenSupportEnabled
+                ),
+                "ScreenCaptureEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.ScreenCaptureEnabled
+                ),
+                "WebGLEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.WebGLEnabled
+                ),
+                "Accelerated2dCanvasEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.Accelerated2dCanvasEnabled
+                ),
+                "AutoLoadIconsForPage": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.AutoLoadIconsForPage
+                ),
+                "FocusOnNavigationEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled
+                ),
+                "PrintElementBackgrounds": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.PrintElementBackgrounds
+                ),
+                "AllowRunningInsecureContent": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.AllowRunningInsecureContent
+                ),
+                "AllowGeolocationOnInsecureOrigins": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.AllowGeolocationOnInsecureOrigins
+                ),
+                "AllowWindowActivationFromJavaScript": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.AllowWindowActivationFromJavaScript
+                ),
+                "ShowScrollBars": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.ShowScrollBars
+                ),
+                "PlaybackRequiresUserGesture": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture
+                ),
+                "JavaScriptCanPaste": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.JavascriptCanPaste
+                ),
+                "WebRTCPublicInterfacesOnly": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.WebRTCPublicInterfacesOnly
+                ),
+                "DnsPrefetchEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.DnsPrefetchEnabled
+                ),
+                "PdfViewerEnabled": webEngineSettings.testAttribute(
+                    QWebEngineSettings.WebAttribute.PdfViewerEnabled
+                ),
+            }
+        )
+
         cls.webEngineSettingsIntitialized = True
-    
+
     webEngineSettingsIntitialized = False
 
     # defaults for system settings
@@ -1169,7 +1166,7 @@
         "StringEncoding": "utf-8",
         "IOEncoding": "utf-8",
     }
-    
+
     # defaults for the shell settings
     shellDefaults = {
         "LinenoMargin": True,
@@ -1211,18 +1208,16 @@
         "PySide6VenvName": "",
         "PySide6ToolsDir": "",
     }
-    
+
     # defaults for corba related stuff
-    corbaDefaults = {
-        "omniidl": ""
-    }
-    
+    corbaDefaults = {"omniidl": ""}
+
     # defaults for protobuf related stuff
     protobufDefaults = {
         "protoc": "",
         "grpcPython": "",
     }
-    
+
     # defaults for user related stuff
     userDefaults = {
         "Email": "",
@@ -1231,15 +1226,15 @@
         "MailServerAuthentication": False,
         "MailServerUser": "",
         "MailServerPassword": "",
-        "MailServerEncryption": "No",   # valid values: No, SSL, TLS
+        "MailServerEncryption": "No",  # valid values: No, SSL, TLS
         "MailServerPort": 25,
         "UseSystemEmailClient": False,
         "UseGoogleMailOAuth2": False,
-        "MasterPassword": "",           # stores the password hash
+        "MasterPassword": "",  # stores the password hash
         "UseMasterPassword": False,
         "SavePasswords": False,
     }
-    
+
     # defaults for vcs related stuff
     vcsDefaults = {
         "AutoClose": False,
@@ -1252,7 +1247,7 @@
         "PerProjectCommitHistory": True,
         "CommitMessages": 20,
     }
-    
+
     # defaults for tasks related stuff
     tasksDefaults = {
         "TasksFixmeMarkers": "FIX" + "ME:",
@@ -1270,7 +1265,7 @@
         "TasksDocuColor": QColor("#FFA0FF"),
         "ClearOnFileClose": True,
     }
-    
+
     # defaults for templates related stuff
     templatesDefaults = {
         "AutoOpenGroups": True,
@@ -1279,7 +1274,7 @@
         "SeparatorChar": "$",
         "EditorFont": "Monospace,9,-1,5,50,0,0,0,0,0",
     }
-    
+
     # defaults for plugin manager related stuff
     pluginManagerDefaults = {
         "ActivateExternal": True,
@@ -1299,7 +1294,7 @@
         "StartupCleanup": True,
         "AutoInstallDependencies": True,
     }
-    
+
     # defaults for the printer settings
     graphicsDefaults = {
         "Font": "SansSerif,10,-1,5,50,0,0,0,0,0",
@@ -1308,25 +1303,25 @@
         # black_white - black items on white background
         # white_black - white items on black background
     }
-    
+
     # defaults for the icon editor
     iconEditorDefaults = {
         "IconEditorState": QByteArray(),
     }
-    
+
     # defaults for pyflakes
     pyflakesDefaults = {
         "IncludeInSyntaxCheck": True,
         "IgnoreStarImportWarnings": True,
     }
-    
+
     # defaults for tray starter
     trayStarterDefaults = {
         "TrayStarterIcon": "erict",
         # valid values are: erict, erict-hc,
         #                   erict-bw, erict-bwi
     }
-    
+
     # defaults for geometry
     geometryDefaults = {
         "HelpViewerGeometry": QByteArray(),
@@ -1341,14 +1336,13 @@
 
     # if true, revert layouts to factory defaults
     resetLayout = False
-    
+
     # defaults for IRC
     ircDefaults = {
         "ShowTimestamps": True,
         "TimestampIncludeDate": False,
         "TimeFormat": "hh:mm",
         "DateFormat": "yyyy-MM-dd",
-        
         "NetworkMessageColour": "#000055",
         "ServerMessageColour": "#91640A",
         "ErrorMessageColour": "#FF0000",
@@ -1360,7 +1354,6 @@
         "JoinChannelColour": "#72D672",
         "LeaveChannelColour": "#B00000",
         "ChannelInfoColour": "#9E54B3",
-        
         "EnableIrcColours": True,
         "IrcColor0": "#FFFF00",
         "IrcColor1": "#000000",
@@ -1378,23 +1371,19 @@
         "IrcColor13": "#FFC0CB",
         "IrcColor14": "#A0A0A0",
         "IrcColor15": "#C0C0C0",
-        
         "ShowNotifications": True,
         "NotifyJoinPart": True,
         "NotifyMessage": False,
         "NotifyNick": False,
-        
         "AutoUserInfoLookup": True,
         "AutoUserInfoMax": 200,
         "AutoUserInfoInterval": 90,
-        
         "MarkPositionWhenHidden": True,
-        "MarkerLineForegroundColour": "#000000",    # Black on
-        "MarkerLineBackgroundColour": "#ffff00",    # Yellow
-        
+        "MarkerLineForegroundColour": "#000000",  # Black on
+        "MarkerLineBackgroundColour": "#ffff00",  # Yellow
         "AskOnShutdown": True,
     }
-    
+
     # defaults for Hex Editor
     hexEditorDefaults = {
         "HexEditorState": QByteArray(),
@@ -1410,7 +1399,7 @@
         hexEditorDefaults["Font"] = "Courier,10,-1,5,50,0,0,0,0,0"
     else:
         hexEditorDefaults["Font"] = "Monospace,10,-1,5,50,0,0,0,0,0"
-    
+
     # defaults for Diff colors
     diffColourDefaults = {
         "TextColor": QColor(0, 0, 0),
@@ -1421,77 +1410,70 @@
         "HeaderColor": QColor(237, 237, 190),
         "BadWhitespaceColor": QColor(255, 0, 0, 192),
     }
-    
+
     # defaults for Code Documentation Viewer
     docuViewerDefaults = {
         "Provider": "disabled",
         "ShowInfoOnOpenParenthesis": True,
     }
-    
+
     # defaults for conda
     condaDefaults = {
         "CondaExecutable": "",
     }
-    
+
     # defaults for pip
     pipDefaults = {
-        "PipSearchIndex": "",               # used by the search command
+        "PipSearchIndex": "",  # used by the search command
         "ExcludeCondaEnvironments": True,
         # don't show conda environments in selector
-        
         # defaults for the package vulnerability check
-        "VulnerabilityDbMirror":
-            "https://raw.githubusercontent.com/pyupio/safety-db/master/data/",
-        "VulnerabilityDbCacheValidity": 60 * 60 * 6     # 6 hours
+        "VulnerabilityDbMirror": (
+            "https://raw.githubusercontent.com/pyupio/safety-db/master/data/"
+        ),
+        "VulnerabilityDbCacheValidity": 60 * 60 * 6,  # 6 hours
     }
-    
+
     # defaults for MicroPython
     microPythonDefaults = {
         "MpyWorkspace": "",
-        "SerialTimeout": 2000,          # timeout in milliseconds
-        "ReplLineWrap": True,           # wrap the REPL lines
+        "SerialTimeout": 2000,  # timeout in milliseconds
+        "ReplLineWrap": True,  # wrap the REPL lines
         "SyncTimeAfterConnect": True,
         "ShowHiddenLocal": True,
         "ShowHiddenDevice": True,
-        "ChartColorTheme": -1,          # -1 = automatic,
-                                        # QChart.ChartTheme otherwise
-        "MpyCrossCompiler": "",         # path of the mpy-cross compiler
-        "DfuUtilPath": "",              # path of the dfu-util flashing tool
+        "ChartColorTheme": -1,  # -1 = automatic,
+        # QChart.ChartTheme otherwise
+        "MpyCrossCompiler": "",  # path of the mpy-cross compiler
+        "DfuUtilPath": "",  # path of the dfu-util flashing tool
         "IgnoredUnknownDevices": "[]",  # empty list encoded as JSON
-        "ManualDevices": "[]",          # empty list encoded as JSON
-        
+        "ManualDevices": "[]",  # empty list encoded as JSON
         # MicroPython URLs
-        "MicroPythonDocuUrl":
-            "https://docs.micropython.org/en/latest/",
-        "MicroPythonFirmwareUrl":
-            "http://micropython.org/download/",
-        
+        "MicroPythonDocuUrl": "https://docs.micropython.org/en/latest/",
+        "MicroPythonFirmwareUrl": "http://micropython.org/download/",
         # CircuitPython URLS
-        "CircuitPythonDocuUrl":
-            "https://circuitpython.readthedocs.io/en/latest/",
-        "CircuitPythonFirmwareUrl":
-            "https://circuitpython.org/downloads/",
-        "CircuitPythonLibrariesUrl":
-            "https://circuitpython.org/libraries",
-        
+        "CircuitPythonDocuUrl": "https://circuitpython.readthedocs.io/en/latest/",
+        "CircuitPythonFirmwareUrl": "https://circuitpython.org/downloads/",
+        "CircuitPythonLibrariesUrl": "https://circuitpython.org/libraries",
         # BBC micro:bit URLs
-        "MicrobitDocuUrl":
-            "https://microbit-micropython.readthedocs.io/en/latest/",
-        "MicrobitFirmwareUrl":
-            "https://microbit.org/guide/firmware/",
-        "MicrobitMicroPythonUrl":
-            "https://github.com/bbcmicrobit/micropython/releases/",
-        "MicrobitV2MicroPythonUrl":
-            "https://github.com/microbit-foundation/micropython-microbit-v2/"
-            "releases/",
-        
+        "MicrobitDocuUrl": "https://microbit-micropython.readthedocs.io/en/latest/",
+        "MicrobitFirmwareUrl": "https://microbit.org/guide/firmware/",
+        "MicrobitMicroPythonUrl": (
+            "https://github.com/bbcmicrobit/micropython/releases/"
+        ),
+        "MicrobitV2MicroPythonUrl": (
+            "https://github.com/microbit-foundation/micropython-microbit-v2/releases/"
+        ),
         # calliope mini URLS
-        "CalliopeDocuUrl":
-            "https://github.com/calliope-mini/calliope-mini-micropython/",
-        "CalliopeDAPLinkUrl":
-            "https://github.com/calliope-mini/production-test/releases/",
-        "CalliopeMicroPythonUrl":
-            "https://github.com/calliope-mini/calliope-mini-micropython/",
+        "CalliopeDocuUrl": (
+            "https://github.com/calliope-mini/calliope-mini-micropython/"
+        ),
+        "CalliopeDAPLinkUrl": (
+            "https://github.com/calliope-mini/production-test/releases/"
+        ),
+        "CalliopeMicroPythonUrl": (
+            "https://github.com/calliope-mini/calliope-mini-micropython/"
+        ),
     }
     if Globals.isWindowsPlatform():
         microPythonDefaults["ColorScheme"] = "Windows 10"
@@ -1499,24 +1481,21 @@
         microPythonDefaults["ColorScheme"] = "xterm"
     else:
         microPythonDefaults["ColorScheme"] = "Ubuntu"
-    
+
     # defaults for Python specific settings
     pythonDefaults = {
         "ASTViewerErrorColor": QColor(Qt.GlobalColor.darkRed),
-        
         "DisViewerErrorColor": QColor(Qt.GlobalColor.darkRed),
         "DisViewerCurrentColor": QColor(Qt.GlobalColor.darkMagenta),
         "DisViewerLabeledColor": QColor(Qt.GlobalColor.darkGreen),
         "DisViewerExpandCodeInfoDetails": False,
     }
-    
+
     # defaults for the jedi interface
     jediDefaults = {
         "JediCompletionsEnabled": True,
         "JediFuzzyCompletionsEnabled": False,
-        
         "JediCalltipsEnabled": True,
-        
         "MouseClickEnabled": True,
         "MouseClickGotoModifiers": Qt.KeyboardModifier.AltModifier,
         "MouseClickGotoButton": Qt.MouseButton.LeftButton,
@@ -1526,115 +1505,125 @@
 def readToolGroups():
     """
     Module function to read the tool groups configuration.
-    
+
     @return list of tuples defing the tool groups
     """
     toolGroups = []
     groups = int(Prefs.settings.value("Toolgroups/Groups", 0))
     for groupIndex in range(groups):
-        groupName = Prefs.settings.value(
-            "Toolgroups/{0:02d}/Name".format(groupIndex))
+        groupName = Prefs.settings.value("Toolgroups/{0:02d}/Name".format(groupIndex))
         group = [groupName, []]
-        items = int(Prefs.settings.value(
-            "Toolgroups/{0:02d}/Items".format(groupIndex), 0))
+        items = int(
+            Prefs.settings.value("Toolgroups/{0:02d}/Items".format(groupIndex), 0)
+        )
         for ind in range(items):
             menutext = Prefs.settings.value(
-                "Toolgroups/{0:02d}/{1:02d}/Menutext".format(groupIndex, ind))
+                "Toolgroups/{0:02d}/{1:02d}/Menutext".format(groupIndex, ind)
+            )
             icon = Prefs.settings.value(
-                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind))
+                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind)
+            )
             executable = Prefs.settings.value(
-                "Toolgroups/{0:02d}/{1:02d}/Executable".format(
-                    groupIndex, ind))
+                "Toolgroups/{0:02d}/{1:02d}/Executable".format(groupIndex, ind)
+            )
             arguments = Prefs.settings.value(
-                "Toolgroups/{0:02d}/{1:02d}/Arguments".format(groupIndex, ind))
+                "Toolgroups/{0:02d}/{1:02d}/Arguments".format(groupIndex, ind)
+            )
             redirect = Prefs.settings.value(
-                "Toolgroups/{0:02d}/{1:02d}/Redirect".format(groupIndex, ind))
-            
+                "Toolgroups/{0:02d}/{1:02d}/Redirect".format(groupIndex, ind)
+            )
+
             if menutext:
-                if menutext == '--':
+                if menutext == "--":
                     tool = {
-                        'menutext': '--',
-                        'icon': '',
-                        'executable': '',
-                        'arguments': '',
-                        'redirect': 'no',
+                        "menutext": "--",
+                        "icon": "",
+                        "executable": "",
+                        "arguments": "",
+                        "redirect": "no",
                     }
                     group[1].append(tool)
                 elif executable:
                     tool = {
-                        'menutext': menutext,
-                        'icon': icon,
-                        'executable': executable,
-                        'arguments': arguments,
-                        'redirect': redirect,
+                        "menutext": menutext,
+                        "icon": icon,
+                        "executable": executable,
+                        "arguments": arguments,
+                        "redirect": redirect,
                     }
                     group[1].append(tool)
         toolGroups.append(group)
-    currentGroup = int(
-        Prefs.settings.value("Toolgroups/Current Group", -1))
+    currentGroup = int(Prefs.settings.value("Toolgroups/Current Group", -1))
     return toolGroups, currentGroup
-    
+
 
 def saveToolGroups(toolGroups, currentGroup):
     """
     Module function to write the tool groups configuration.
-    
+
     @param toolGroups reference to the list of tool groups
     @param currentGroup index of the currently selected tool group (integer)
     """
     # first step, remove all tool group entries
     Prefs.settings.remove("Toolgroups")
-    
+
     # second step, write the tool group entries
     Prefs.settings.setValue("Toolgroups/Groups", len(toolGroups))
     for groupIndex, group in enumerate(toolGroups):
+        Prefs.settings.setValue("Toolgroups/{0:02d}/Name".format(groupIndex), group[0])
         Prefs.settings.setValue(
-            "Toolgroups/{0:02d}/Name".format(groupIndex), group[0])
-        Prefs.settings.setValue(
-            "Toolgroups/{0:02d}/Items".format(groupIndex), len(group[1]))
+            "Toolgroups/{0:02d}/Items".format(groupIndex), len(group[1])
+        )
         for ind, tool in enumerate(group[1]):
             Prefs.settings.setValue(
                 "Toolgroups/{0:02d}/{1:02d}/Menutext".format(groupIndex, ind),
-                tool['menutext'])
+                tool["menutext"],
+            )
             Prefs.settings.setValue(
-                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind),
-                tool['icon'])
+                "Toolgroups/{0:02d}/{1:02d}/Icon".format(groupIndex, ind), tool["icon"]
+            )
             Prefs.settings.setValue(
-                "Toolgroups/{0:02d}/{1:02d}/Executable".format(
-                    groupIndex, ind),
-                tool['executable'])
+                "Toolgroups/{0:02d}/{1:02d}/Executable".format(groupIndex, ind),
+                tool["executable"],
+            )
             Prefs.settings.setValue(
                 "Toolgroups/{0:02d}/{1:02d}/Arguments".format(groupIndex, ind),
-                tool['arguments'])
+                tool["arguments"],
+            )
             Prefs.settings.setValue(
                 "Toolgroups/{0:02d}/{1:02d}/Redirect".format(groupIndex, ind),
-                tool['redirect'])
+                tool["redirect"],
+            )
     Prefs.settings.setValue("Toolgroups/Current Group", currentGroup)
-    
+
 
 def initPreferences():
     """
     Module function to initialize the central configuration store.
     """
     from EricWidgets.EricApplication import ericApp
+
     Prefs.settings = QSettings(
-        QSettings.Format.IniFormat, QSettings.Scope.UserScope,
-        Globals.settingsNameOrganization, Globals.settingsNameGlobal,
-        ericApp())
+        QSettings.Format.IniFormat,
+        QSettings.Scope.UserScope,
+        Globals.settingsNameOrganization,
+        Globals.settingsNameGlobal,
+        ericApp(),
+    )
     if not Globals.isWindowsPlatform():
         hp = QDir.homePath()
         dn = QDir(hp)
         dn.mkdir(".eric7")
     QCoreApplication.setOrganizationName(Globals.settingsNameOrganization)
     QCoreApplication.setApplicationName(Globals.settingsNameGlobal)
-    
+
     Prefs.settings.value("UI/SingleApplicationMode")
 
 
 def getSettings():
     """
     Function to get a reference to the settings object.
-    
+
     @return reference to the settings object
     @rtype QSettings
     """
@@ -1644,12 +1633,12 @@
 def syncPreferences():
     """
     Module function to sync the preferences to disk.
-    
+
     In addition to syncing, the central configuration store is reinitialized
     as well.
     """
     Prefs.settings.sync()
-    
+
 
 def exportPreferences():
     """
@@ -1660,10 +1649,11 @@
         QCoreApplication.translate("Preferences", "Export Preferences"),
         "",
         QCoreApplication.translate(
-            "Preferences",
-            "Properties File (*.ini);;All Files (*)"),
+            "Preferences", "Properties File (*.ini);;All Files (*)"
+        ),
         None,
-        EricFileDialog.DontConfirmOverwrite)
+        EricFileDialog.DontConfirmOverwrite,
+    )
     if filename:
         fpath = pathlib.Path(filename)
         if not fpath.suffix:
@@ -1686,8 +1676,9 @@
         QCoreApplication.translate("Preferences", "Import Preferences"),
         "",
         QCoreApplication.translate(
-            "Preferences",
-            "Properties File (*.ini);;All Files (*)"))
+            "Preferences", "Properties File (*.ini);;All Files (*)"
+        ),
+    )
     if filename:
         settingsFile = Prefs.settings.fileName()
         shutil.copy(filename, settingsFile)
@@ -1697,7 +1688,7 @@
 def isConfigured():
     """
     Module function to check, if the the application has been configured.
-    
+
     @return flag indicating the configured status (boolean)
     """
     return toBool(Prefs.settings.value("General/Configured", False))
@@ -1714,79 +1705,99 @@
     """
     Module function to initialize the central configuration store for recently
     opened files and projects.
-    
+
     This function is called once upon import of the module.
     """
     Prefs.rsettings = QSettings(
-        QSettings.Format.IniFormat, QSettings.Scope.UserScope,
-        Globals.settingsNameOrganization, Globals.settingsNameRecent)
-    
+        QSettings.Format.IniFormat,
+        QSettings.Scope.UserScope,
+        Globals.settingsNameOrganization,
+        Globals.settingsNameRecent,
+    )
+
 
 def getVarFilters():
     """
     Module function to retrieve the variables filter settings.
-    
+
     @return a tuple defining the variables filter
     """
-    localsFilter = ast.literal_eval(Prefs.settings.value(
-        "Variables/LocalsFilter", Prefs.varDefaults["LocalsFilter"]))
-    globalsFilter = ast.literal_eval(Prefs.settings.value(
-        "Variables/GlobalsFilter", Prefs.varDefaults["GlobalsFilter"]))
+    localsFilter = ast.literal_eval(
+        Prefs.settings.value(
+            "Variables/LocalsFilter", Prefs.varDefaults["LocalsFilter"]
+        )
+    )
+    globalsFilter = ast.literal_eval(
+        Prefs.settings.value(
+            "Variables/GlobalsFilter", Prefs.varDefaults["GlobalsFilter"]
+        )
+    )
     return (localsFilter, globalsFilter)
-    
+
 
 def setVarFilters(filters):
     """
     Module function to store the variables filter settings.
-    
+
     @param filters variable filters to set
     """
     Prefs.settings.setValue("Variables/LocalsFilter", str(filters[0]))
     Prefs.settings.setValue("Variables/GlobalsFilter", str(filters[1]))
-    
+
 
 def getDebugger(key):
     """
     Module function to retrieve the debugger settings.
-    
+
     @param key the key of the value to get
     @type str
     @return the requested debugger setting
     @rtype Any
     """
-    if key in ("RemoteDbgEnabled", "PassiveDbgEnabled",
-               "AutomaticReset", "DebugEnvironmentReplace",
-               "PythonRedirect", "PythonNoEncoding",
-               "Python3Redirect", "Python3NoEncoding",
-               "RubyRedirect",
-               "ConsoleDbgEnabled", "PathTranslation",
-               "Autosave", "ThreeStateBreakPoints",
-               "BreakAlways", "IntelligentBreakpoints",
-               "AutoViewSourceCode", "ShowExceptionInShell",
-               "MultiProcessEnabled",
-               ):
-        return toBool(Prefs.settings.value(
-            "Debugger/" + key, Prefs.debuggerDefaults[key]))
+    if key in (
+        "RemoteDbgEnabled",
+        "PassiveDbgEnabled",
+        "AutomaticReset",
+        "DebugEnvironmentReplace",
+        "PythonRedirect",
+        "PythonNoEncoding",
+        "Python3Redirect",
+        "Python3NoEncoding",
+        "RubyRedirect",
+        "ConsoleDbgEnabled",
+        "PathTranslation",
+        "Autosave",
+        "ThreeStateBreakPoints",
+        "BreakAlways",
+        "IntelligentBreakpoints",
+        "AutoViewSourceCode",
+        "ShowExceptionInShell",
+        "MultiProcessEnabled",
+    ):
+        return toBool(
+            Prefs.settings.value("Debugger/" + key, Prefs.debuggerDefaults[key])
+        )
     elif key in ["PassiveDbgPort", "MaxVariableSize", "RecentNumber"]:
-        return int(
-            Prefs.settings.value(
-                "Debugger/" + key, Prefs.debuggerDefaults[key]))
+        return int(Prefs.settings.value("Debugger/" + key, Prefs.debuggerDefaults[key]))
     elif key in ["AllowedHosts"]:
         return toList(
-            Prefs.settings.value(
-                "Debugger/" + key, Prefs.debuggerDefaults[key]))
+            Prefs.settings.value("Debugger/" + key, Prefs.debuggerDefaults[key])
+        )
     elif key in ["PythonInterpreter", "Python3Interpreter"]:
         # This code is here to ensure backward compatibility.
         # Keep "PythonInterpreter" for backward compatibility.
         newKey = "Python3VirtualEnv"
         venvName = Prefs.settings.value(
-            "Debugger/" + newKey, Prefs.debuggerDefaults[newKey])
+            "Debugger/" + newKey, Prefs.debuggerDefaults[newKey]
+        )
         if venvName:
             try:
                 from EricWidgets.EricApplication import ericApp
+
                 virtualenvManager = ericApp().getObject("VirtualEnvManager")
             except KeyError:
                 from VirtualEnv.VirtualenvManager import VirtualenvManager
+
                 virtualenvManager = VirtualenvManager()
             interpreter = virtualenvManager.getVirtualenvInterpreter(venvName)
         else:
@@ -1796,9 +1807,10 @@
         return interpreter
     elif key == "DebugClientType3":
         debugClientType = Prefs.settings.value(
-            "Debugger/" + key, Prefs.debuggerDefaults[key])
+            "Debugger/" + key, Prefs.debuggerDefaults[key]
+        )
         # Correct obsolete entry "threaded"
-        if debugClientType == 'threaded':
+        if debugClientType == "threaded":
             return "standard"
         else:
             return debugClientType
@@ -1809,14 +1821,13 @@
         else:
             return Prefs.debuggerDefaults[key]
     else:
-        return Prefs.settings.value(
-            "Debugger/" + key, Prefs.debuggerDefaults[key])
-    
+        return Prefs.settings.value("Debugger/" + key, Prefs.debuggerDefaults[key])
+
 
 def setDebugger(key, value):
     """
     Module function to store the debugger settings.
-    
+
     @param key the key of the setting to be set
     @type str
     @param value the value to be set
@@ -1824,7 +1835,8 @@
     """
     if key in ["BgColorNew", "BgColorChanged"]:
         Prefs.settings.setValue(
-            "Debugger/" + key, value.name(QColor.NameFormat.HexArgb))
+            "Debugger/" + key, value.name(QColor.NameFormat.HexArgb)
+        )
     else:
         Prefs.settings.setValue("Debugger/" + key, value)
 
@@ -1832,7 +1844,7 @@
 def getPython(key):
     """
     Module function to retrieve the Python settings.
-    
+
     @param key the key of the value to get
     @return the requested debugger setting
     """
@@ -1845,37 +1857,34 @@
                 exts.append(".{0}".format(ext))
         return exts
     elif key in (
-        "ASTViewerErrorColor", "DisViewerErrorColor",
-        "DisViewerCurrentColor", "DisViewerLabeledColor",
+        "ASTViewerErrorColor",
+        "DisViewerErrorColor",
+        "DisViewerCurrentColor",
+        "DisViewerLabeledColor",
     ):
-        return QColor(Prefs.settings.value(
-            "Python/" + key, Prefs.pythonDefaults[key]))
+        return QColor(Prefs.settings.value("Python/" + key, Prefs.pythonDefaults[key]))
     elif key in ("DisViewerExpandCodeInfoDetails"):
-        return toBool(Prefs.settings.value(
-            "Python/" + key, Prefs.pythonDefaults[key]))
+        return toBool(Prefs.settings.value("Python/" + key, Prefs.pythonDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "Python/" + key, Prefs.pythonDefaults[key])
+        return Prefs.settings.value("Python/" + key, Prefs.pythonDefaults[key])
 
 
 def setPython(key, value):
     """
     Module function to store the Python settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     if key == "Python3Extensions":
         setDebugger(key, value)
     elif key in (
-        "ASTViewerErrorColor", "DisViewerErrorColor",
-        "DisViewerCurrentColor", "DisViewerLabeledColor",
+        "ASTViewerErrorColor",
+        "DisViewerErrorColor",
+        "DisViewerCurrentColor",
+        "DisViewerLabeledColor",
     ):
-        val = (
-            "#{0:8x}".format(value.rgba())
-            if value.alpha() < 255 else
-            value.name()
-        )
+        val = "#{0:8x}".format(value.rgba()) if value.alpha() < 255 else value.name()
         Prefs.settings.setValue("Python/" + key, val)
     else:
         Prefs.settings.setValue("Python/" + key, value)
@@ -1884,21 +1893,20 @@
 def getUILanguage():
     """
     Module function to retrieve the language for the user interface.
-    
+
     @return the language for the UI
     """
-    lang = Prefs.settings.value("UI/Language",
-                                Prefs.uiDefaults["Language"])
+    lang = Prefs.settings.value("UI/Language", Prefs.uiDefaults["Language"])
     if lang in ("None", "", None):
         return None
     else:
         return lang
-    
+
 
 def setUILanguage(lang):
     """
     Module function to store the language for the user interface.
-    
+
     @param lang the language
     """
     if lang is None:
@@ -1910,17 +1918,16 @@
 def getViewManager():
     """
     Module function to retrieve the selected viewmanager type.
-    
+
     @return the viewmanager type
     """
-    return Prefs.settings.value(
-        "UI/ViewManager", Prefs.uiDefaults["ViewManager"])
-    
+    return Prefs.settings.value("UI/ViewManager", Prefs.uiDefaults["ViewManager"])
+
 
 def setViewManager(vm):
     """
     Module function to store the selected viewmanager type.
-    
+
     @param vm the viewmanager type
     """
     Prefs.settings.setValue("UI/ViewManager", vm)
@@ -1929,47 +1936,82 @@
 def getUI(key):
     """
     Module function to retrieve the various UI settings.
-    
+
     @param key the key of the value to get
     @return the requested UI setting
     """
     if key in [
-        "BrowsersListFoldersFirst", "BrowsersHideNonPublic",
-        "BrowsersListContentsByOccurrence", "BrowsersListHiddenFiles",
-        "BrowserShowCoding", "LogViewerAutoRaise", "SingleApplicationMode",
-        "TabViewManagerFilenameOnly", "ShowFilePreview", "ShowFilePreviewJS",
-        "ShowFilePreviewSSI", "CaptionShowsFilename", "ShowSplash",
-        "SplitOrientationVertical", "DynamicOnlineCheck", "UseProxy",
-        "UseSystemProxy", "UseHttpProxyForAll", "RequestDownloadFilename",
-        "CheckErrorLog", "OpenCrashSessionOnStartup", "CrashSessionEnabled",
-        "ShowCodeDocumentationViewer", "ShowPyPIPackageManager",
-        "ShowCondaPackageManager", "ShowCooperation", "ShowIrc",
-        "ShowTemplateViewer", "ShowFileBrowser", "ShowSymbolsViewer",
-        "ShowNumbersViewer", "ShowMicroPython", "ShowFindFileWidget",
-        "ShowFindLocationWidget", "ShowInternalHelpViewer", "UseNativeMenuBar",
+        "BrowsersListFoldersFirst",
+        "BrowsersHideNonPublic",
+        "BrowsersListContentsByOccurrence",
+        "BrowsersListHiddenFiles",
+        "BrowserShowCoding",
+        "LogViewerAutoRaise",
+        "SingleApplicationMode",
+        "TabViewManagerFilenameOnly",
+        "ShowFilePreview",
+        "ShowFilePreviewJS",
+        "ShowFilePreviewSSI",
+        "CaptionShowsFilename",
+        "ShowSplash",
+        "SplitOrientationVertical",
+        "DynamicOnlineCheck",
+        "UseProxy",
+        "UseSystemProxy",
+        "UseHttpProxyForAll",
+        "RequestDownloadFilename",
+        "CheckErrorLog",
+        "OpenCrashSessionOnStartup",
+        "CrashSessionEnabled",
+        "ShowCodeDocumentationViewer",
+        "ShowPyPIPackageManager",
+        "ShowCondaPackageManager",
+        "ShowCooperation",
+        "ShowIrc",
+        "ShowTemplateViewer",
+        "ShowFileBrowser",
+        "ShowSymbolsViewer",
+        "ShowNumbersViewer",
+        "ShowMicroPython",
+        "ShowFindFileWidget",
+        "ShowFindLocationWidget",
+        "ShowInternalHelpViewer",
+        "UseNativeMenuBar",
         "CombinedLeftRightSidebar",
     ]:
-        return toBool(Prefs.settings.value(
-            "UI/" + key, Prefs.uiDefaults[key]))
+        return toBool(Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]))
     elif key in [
-        "TabViewManagerFilenameLength", "CaptionFilenameLength",
-        "ProxyPort/Http", "ProxyPort/Https", "ProxyPort/Ftp",
-        "OpenOnStartup", "PerformVersionCheck", "RecentNumber",
-        "NotificationTimeout", "UpgraderDelay", "KeyboardInputInterval",
-        "BackgroundServiceProcesses", "MinimumMessageTypeSeverity",
+        "TabViewManagerFilenameLength",
+        "CaptionFilenameLength",
+        "ProxyPort/Http",
+        "ProxyPort/Https",
+        "ProxyPort/Ftp",
+        "OpenOnStartup",
+        "PerformVersionCheck",
+        "RecentNumber",
+        "NotificationTimeout",
+        "UpgraderDelay",
+        "KeyboardInputInterval",
+        "BackgroundServiceProcesses",
+        "MinimumMessageTypeSeverity",
     ]:
-        return int(Prefs.settings.value(
-            "UI/" + key, Prefs.uiDefaults[key]))
-    elif key in ["ProxyType/Ftp", ]:
-        return EricFtpProxyType(int(Prefs.settings.value(
-            "UI/" + key, Prefs.uiDefaults[key].value)))
+        return int(Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]))
     elif key in [
-        "ProxyPassword/Http", "ProxyPassword/Https", "ProxyPassword/Ftp",
+        "ProxyType/Ftp",
+    ]:
+        return EricFtpProxyType(
+            int(Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key].value))
+        )
+    elif key in [
+        "ProxyPassword/Http",
+        "ProxyPassword/Https",
+        "ProxyPassword/Ftp",
     ]:
         from Utilities.crypto import pwConvert
+
         return pwConvert(
-            Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]),
-            encode=False)
+            Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]), encode=False
+        )
     elif key in ("LogStdErrColour", "IconBarColor"):
         col = Prefs.settings.value("UI/" + key)
         if col is not None:
@@ -1988,14 +2030,15 @@
                 viewProfiles[name] = [
                     QByteArray.fromBase64(profiles[name][0].encode("utf-8")),
                     profiles[name][1][:],
-                    []
+                    [],
                 ]
                 if len(profiles[name][2]) == 6:
                     del profiles[name][2][2]
                 for bs in profiles[name][2][:2]:
                     # splitters
                     viewProfiles[name][2].append(
-                        QByteArray.fromBase64(bs.encode("utf-8")))
+                        QByteArray.fromBase64(bs.encode("utf-8"))
+                    )
                 viewProfiles[name][2] += profiles[name][2][2:]  # side bars
         return viewProfiles
     elif key in ["ToolbarManagerState", "PreviewSplitterState"]:
@@ -2005,19 +2048,20 @@
         else:
             return Prefs.uiDefaults[key]
     elif key in [
-        "LogViewerStdoutFilter", "LogViewerStderrFilter",
-        "LogViewerStdxxxFilter", "TextMimeTypes"
+        "LogViewerStdoutFilter",
+        "LogViewerStderrFilter",
+        "LogViewerStdxxxFilter",
+        "TextMimeTypes",
     ]:
-        return toList(
-            Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]))
+        return toList(Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]))
     else:
         return Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key])
-    
+
 
 def setUI(key, value):
     """
     Module function to store the various UI settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2027,30 +2071,36 @@
             profiles[name] = [
                 bytes(value[name][0].toBase64()).decode(),
                 value[name][1][:],
-                []
+                [],
             ]
             for ba in value[name][2][:2]:
                 # Splitters
                 profiles[name][2].append(bytes(ba.toBase64()).decode())
-            profiles[name][2] += value[name][2][2:]     # side bars
+            profiles[name][2] += value[name][2][2:]  # side bars
         Prefs.settings.setValue("UI/" + key, json.dumps(profiles))
     elif key in ("LogStdErrColour", "IconBarColor"):
         Prefs.settings.setValue("UI/" + key, value.name())
-    elif key in ["ProxyPassword/Http", "ProxyPassword/Https",
-                 "ProxyPassword/Ftp", ]:
+    elif key in [
+        "ProxyPassword/Http",
+        "ProxyPassword/Https",
+        "ProxyPassword/Ftp",
+    ]:
         from Utilities.crypto import pwConvert
+
         Prefs.settings.setValue("UI/" + key, pwConvert(value, encode=True))
-    elif key in ["ProxyType/Ftp", ]:
+    elif key in [
+        "ProxyType/Ftp",
+    ]:
         # value is an enum.Enum derived item
         Prefs.settings.setValue("UI/" + key, value.value)
     else:
         Prefs.settings.setValue("UI/" + key, value)
-    
+
 
 def getIcons(key):
     """
     Module function to retrieve the various Icons settings.
-    
+
     @param key the key of the value to get
     @return the requested Icons setting
     """
@@ -2059,50 +2109,52 @@
         return dirlist
     else:
         return Prefs.iconsDefaults[key]
-    
+
     if key in ["Path"]:
-        return toList(Prefs.settings.value(
-            "UI/Icons/" + key, Prefs.iconsDefaults[key]))
+        return toList(Prefs.settings.value("UI/Icons/" + key, Prefs.iconsDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "UI/Icons/" + key, Prefs.iconsDefaults[key])
+        return Prefs.settings.value("UI/Icons/" + key, Prefs.iconsDefaults[key])
 
 
 def setIcons(key, value):
     """
     Module function to store the various Icons settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("UI/Icons/" + key, value)
-    
+
 
 def getCooperation(key):
     """
     Module function to retrieve the various Cooperation settings.
-    
+
     @param key the key of the value to get
     @return the requested UI setting
     """
     if key in ["AutoStartServer", "TryOtherPorts", "AutoAcceptConnections"]:
-        return toBool(Prefs.settings.value(
-            "Cooperation/" + key, Prefs.cooperationDefaults[key]))
+        return toBool(
+            Prefs.settings.value("Cooperation/" + key, Prefs.cooperationDefaults[key])
+        )
     elif key in ["ServerPort", "MaxPortsToTry"]:
-        return int(Prefs.settings.value(
-            "Cooperation/" + key, Prefs.cooperationDefaults[key]))
+        return int(
+            Prefs.settings.value("Cooperation/" + key, Prefs.cooperationDefaults[key])
+        )
     elif key in ["BannedUsers"]:
-        return toList(Prefs.settings.value(
-            "Cooperation/" + key, Prefs.cooperationDefaults[key]))
+        return toList(
+            Prefs.settings.value("Cooperation/" + key, Prefs.cooperationDefaults[key])
+        )
     else:
         return Prefs.settings.value(
-            "Cooperation/" + key, Prefs.cooperationDefaults[key])
-    
+            "Cooperation/" + key, Prefs.cooperationDefaults[key]
+        )
+
 
 def setCooperation(key, value):
     """
     Module function to store the various Cooperation settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2112,60 +2164,90 @@
 def getEditor(key):
     """
     Module function to retrieve the various editor settings.
-    
+
     @param key the key of the value to get
     @return the requested editor setting
     """
-    if key in ["DefaultEncoding", "DefaultOpenFilter", "DefaultSaveFilter",
-               "SpellCheckingDefaultLanguage", "SpellCheckingPersonalWordList",
-               "SpellCheckingPersonalExcludeList", "DocstringType",
-               "PreviewMarkdownHTMLFormat", "PreviewRestDocutilsHTMLFormat",
-               "WrapLongLinesMode", "WrapVisualFlag", "WrapIndentMode",
-               "CallTipsStyle", "CallTipsPosition", "AutoCompletionSource",
-               "EdgeMode", "EOLMode", "PythonBadIndentation"]:
+    if key in [
+        "DefaultEncoding",
+        "DefaultOpenFilter",
+        "DefaultSaveFilter",
+        "SpellCheckingDefaultLanguage",
+        "SpellCheckingPersonalWordList",
+        "SpellCheckingPersonalExcludeList",
+        "DocstringType",
+        "PreviewMarkdownHTMLFormat",
+        "PreviewRestDocutilsHTMLFormat",
+        "WrapLongLinesMode",
+        "WrapVisualFlag",
+        "WrapIndentMode",
+        "CallTipsStyle",
+        "CallTipsPosition",
+        "AutoCompletionSource",
+        "EdgeMode",
+        "EOLMode",
+        "PythonBadIndentation",
+    ]:
         # no special treatment for str and PyQt6 Enum
-        return Prefs.settings.value(
-            "Editor/" + key, Prefs.editorDefaults[key])
-    elif key in ["AutosaveInterval", "TabWidth", "IndentWidth",
-                 "WarnFilesize", "EdgeColumn",
-                 "CaretWidth", "CaretLineFrameWidth",
-                 "AutoCompletionThreshold", "AutoCompletionTimeout",
-                 "AutoCompletionCacheSize", "AutoCompletionCacheTime",
-                 "AutoCompletionWatchdogTime", "AutoCompletionMaxLines",
-                 "AutoCompletionMaxChars", "CallTipsVisible",
-                 "MarkOccurrencesTimeout", "SearchRegexpMode",
-                 "AutoSpellCheckChunkSize", "SpellCheckingMinWordSize",
-                 "PostScriptLevel", "ZoomFactor", "WhitespaceSize",
-                 "OnlineSyntaxCheckInterval", "OnlineChangeTraceInterval",
-                 "WrapStartIndent", "VirtualSpaceOptions",
-                 "PreviewRefreshWaitTimer", "SourceOutlineWidth",
-                 "SourceOutlineStepSize", "FoldingStyle", "MouseHoverTimeout"]:
-        return int(Prefs.settings.value(
-            "Editor/" + key, Prefs.editorDefaults[key]))
-    elif key in ["AdditionalOpenFilters", "AdditionalSaveFilters",
-                 "PreviewMarkdownFileNameExtensions",
-                 "PreviewRestFileNameExtensions",
-                 "PreviewHtmlFileNameExtensions",
-                 "PreviewQssFileNameExtensions",
-                 "FullSpellCheckExtensions"]:
-        return toList(Prefs.settings.value(
-            "Editor/" + key, Prefs.editorDefaults[key]))
+        return Prefs.settings.value("Editor/" + key, Prefs.editorDefaults[key])
+    elif key in [
+        "AutosaveInterval",
+        "TabWidth",
+        "IndentWidth",
+        "WarnFilesize",
+        "EdgeColumn",
+        "CaretWidth",
+        "CaretLineFrameWidth",
+        "AutoCompletionThreshold",
+        "AutoCompletionTimeout",
+        "AutoCompletionCacheSize",
+        "AutoCompletionCacheTime",
+        "AutoCompletionWatchdogTime",
+        "AutoCompletionMaxLines",
+        "AutoCompletionMaxChars",
+        "CallTipsVisible",
+        "MarkOccurrencesTimeout",
+        "SearchRegexpMode",
+        "AutoSpellCheckChunkSize",
+        "SpellCheckingMinWordSize",
+        "PostScriptLevel",
+        "ZoomFactor",
+        "WhitespaceSize",
+        "OnlineSyntaxCheckInterval",
+        "OnlineChangeTraceInterval",
+        "WrapStartIndent",
+        "VirtualSpaceOptions",
+        "PreviewRefreshWaitTimer",
+        "SourceOutlineWidth",
+        "SourceOutlineStepSize",
+        "FoldingStyle",
+        "MouseHoverTimeout",
+    ]:
+        return int(Prefs.settings.value("Editor/" + key, Prefs.editorDefaults[key]))
+    elif key in [
+        "AdditionalOpenFilters",
+        "AdditionalSaveFilters",
+        "PreviewMarkdownFileNameExtensions",
+        "PreviewRestFileNameExtensions",
+        "PreviewHtmlFileNameExtensions",
+        "PreviewQssFileNameExtensions",
+        "FullSpellCheckExtensions",
+    ]:
+        return toList(Prefs.settings.value("Editor/" + key, Prefs.editorDefaults[key]))
     elif key == "TabIndentOverride":
-        overrideStr = Prefs.settings.value(
-            "Editor/" + key, Prefs.editorDefaults[key])
+        overrideStr = Prefs.settings.value("Editor/" + key, Prefs.editorDefaults[key])
         if overrideStr:
             return json.loads(overrideStr)
         else:
             return {}
     else:
-        return toBool(Prefs.settings.value(
-            "Editor/" + key, Prefs.editorDefaults[key]))
-    
+        return toBool(Prefs.settings.value("Editor/" + key, Prefs.editorDefaults[key]))
+
 
 def setEditor(key, value):
     """
     Module function to store the various editor settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2173,12 +2255,12 @@
         Prefs.settings.setValue("Editor/" + key, json.dumps(value))
     else:
         Prefs.settings.setValue("Editor/" + key, value)
-    
+
 
 def getEditorColour(key):
     """
     Module function to retrieve the various editor marker colours.
-    
+
     @param key the key of the value to get
     @return the requested editor colour
     """
@@ -2192,56 +2274,59 @@
     else:
         # palette based defaults here because of Qt6
         if key == "EditAreaForeground":
-            return QApplication.palette().color(QPalette.ColorGroup.Active,
-                                                QPalette.ColorRole.Base)
+            return QApplication.palette().color(
+                QPalette.ColorGroup.Active, QPalette.ColorRole.Base
+            )
         elif key == "EditAreaBackground":
-            return QApplication.palette().color(QPalette.ColorGroup.Active,
-                                                QPalette.ColorRole.Text)
+            return QApplication.palette().color(
+                QPalette.ColorGroup.Active, QPalette.ColorRole.Text
+            )
         else:
             return Prefs.editorColourDefaults[key]
-    
+
 
 def setEditorColour(key, value):
     """
     Module function to store the various editor marker colours.
-    
+
     @param key the key of the colour to be set
     @param value the colour to be set
     """
-    val = (value.name(QColor.NameFormat.HexArgb)
-           if value.alpha() < 255 else
-           value.name())
+    val = value.name(QColor.NameFormat.HexArgb) if value.alpha() < 255 else value.name()
     Prefs.settings.setValue("Editor/Colour/" + key, val)
-    
+
 
 def getEditorOtherFonts(key):
     """
     Module function to retrieve the various editor fonts except the lexer
     fonts.
-    
+
     @param key the key of the value to get
     @return the requested editor font (QFont)
     """
     f = QFont()
-    f.fromString(Prefs.settings.value(
-        "Editor/Other Fonts/" + key, Prefs.editorOtherFontsDefaults[key]))
+    f.fromString(
+        Prefs.settings.value(
+            "Editor/Other Fonts/" + key, Prefs.editorOtherFontsDefaults[key]
+        )
+    )
     return f
-    
+
 
 def setEditorOtherFonts(key, font):
     """
     Module function to store the various editor fonts except the lexer fonts.
-    
+
     @param key the key of the font to be set
     @param font the font to be set (QFont)
     """
     Prefs.settings.setValue("Editor/Other Fonts/" + key, font.toString())
-    
+
 
 def getEditorAPI(language, projectType=""):
     """
     Module function to retrieve the various lists of API files.
-    
+
     @param language language of the API list
     @type str
     @param projectType project type of the API list
@@ -2260,14 +2345,14 @@
         if projectType:
             # try again without project type
             return getEditorAPI(language)
-        
+
         return []
-    
+
 
 def setEditorAPI(language, projectType, apilist):
     """
     Module function to store the various lists of API files.
-    
+
     @param language language of the API list
     @type str
     @param projectType project type of the API list
@@ -2277,12 +2362,12 @@
     """
     key = "{0}_{1}".format(language, projectType) if projectType else language
     Prefs.settings.setValue("Editor/APIs/" + key, apilist)
-    
+
 
 def getEditorKeywords(key):
     """
     Module function to retrieve the various lists of language keywords.
-    
+
     @param key the key of the value to get
     @return the requested list of language keywords (list of strings)
     """
@@ -2291,22 +2376,22 @@
         return keywords
     else:
         return []
-    
+
 
 def setEditorKeywords(key, keywordsLists):
     """
     Module function to store the various lists of language keywords.
-    
+
     @param key the key of the api to be set
     @param keywordsLists the list of language keywords (list of strings)
     """
     Prefs.settings.setValue("Editor/Keywords/" + key, keywordsLists)
-    
+
 
 def getEditorLexerAssocs():
     """
     Module function to retrieve all lexer associations.
-    
+
     @return a reference to the list of lexer associations
         (dictionary of strings)
     """
@@ -2314,10 +2399,11 @@
     Prefs.settings.beginGroup("Editor/LexerAssociations")
     keyList = Prefs.settings.childKeys()
     Prefs.settings.endGroup()
-    
+
     import QScintilla.Lexers
+
     editorLexerAssocDefaults = QScintilla.Lexers.getDefaultLexerAssociations()
-    
+
     if len(keyList) == 0:
         # build from scratch
         for key in list(editorLexerAssocDefaults.keys()):
@@ -2326,19 +2412,20 @@
         for key in keyList:
             defaultValue = editorLexerAssocDefaults.get(key, "")
             editorLexerAssoc[key] = Prefs.settings.value(
-                "Editor/LexerAssociations/" + key, defaultValue)
-        
+                "Editor/LexerAssociations/" + key, defaultValue
+            )
+
         # check for new default lexer associations
         for key in list(editorLexerAssocDefaults.keys()):
             if key not in editorLexerAssoc:
                 editorLexerAssoc[key] = editorLexerAssocDefaults[key]
     return editorLexerAssoc
-    
+
 
 def setEditorLexerAssocs(assocs):
     """
     Module function to retrieve all lexer associations.
-    
+
     @param assocs dictionary of lexer associations to be set
     """
     # first remove lexer associations that no longer exist, than save the rest
@@ -2349,14 +2436,13 @@
         if key not in assocs:
             Prefs.settings.remove("Editor/LexerAssociations/" + key)
     for key in assocs:
-        Prefs.settings.setValue(
-            "Editor/LexerAssociations/" + key, assocs[key])
-    
+        Prefs.settings.setValue("Editor/LexerAssociations/" + key, assocs[key])
+
 
 def getEditorLexerAssoc(filename):
     """
     Module function to retrieve a lexer association.
-    
+
     @param filename filename used to determine the associated lexer language
         (string)
     @return the requested lexer language (string)
@@ -2364,102 +2450,124 @@
     for pattern, language in list(getEditorLexerAssocs().items()):
         if fnmatch.fnmatch(filename, pattern):
             return language
-    
+
     return ""
-    
+
 
 def getEditorTyping(key):
     """
     Module function to retrieve the various editor typing settings.
-    
+
     @param key the key of the value to get
     @return the requested editor setting
     """
-    return toBool(Prefs.settings.value(
-        "Editor/Typing/" + key, Prefs.editorTypingDefaults[key]))
-    
+    return toBool(
+        Prefs.settings.value("Editor/Typing/" + key, Prefs.editorTypingDefaults[key])
+    )
+
 
 def setEditorTyping(key, value):
     """
     Module function to store the various editor typing settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("Editor/Typing/" + key, value)
-    
+
 
 def getEditorExporter(key):
     """
     Module function to retrieve the various editor exporters settings.
-    
+
     @param key the key of the value to get
     @return the requested editor setting
     """
     if key in ["RTF/Font"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]))
+        f.fromString(
+            Prefs.settings.value(
+                "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]
+            )
+        )
         return f
-    elif key in ["HTML/WYSIWYG", "HTML/Folding", "HTML/OnlyStylesUsed",
-                 "HTML/FullPathAsTitle", "HTML/UseTabs", "RTF/WYSIWYG",
-                 "RTF/UseTabs", "TeX/OnlyStylesUsed", "TeX/FullPathAsTitle",
-                 "ODT/WYSIWYG", "ODT/OnlyStylesUsed", "ODT/UseTabs"]:
-        return toBool(Prefs.settings.value(
-            "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]))
-    elif key in ["PDF/Magnification", "PDF/MarginLeft", "PDF/MarginRight",
-                 "PDF/MarginTop", "PDF/MarginBottom"]:
-        return int(Prefs.settings.value(
-            "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]))
+    elif key in [
+        "HTML/WYSIWYG",
+        "HTML/Folding",
+        "HTML/OnlyStylesUsed",
+        "HTML/FullPathAsTitle",
+        "HTML/UseTabs",
+        "RTF/WYSIWYG",
+        "RTF/UseTabs",
+        "TeX/OnlyStylesUsed",
+        "TeX/FullPathAsTitle",
+        "ODT/WYSIWYG",
+        "ODT/OnlyStylesUsed",
+        "ODT/UseTabs",
+    ]:
+        return toBool(
+            Prefs.settings.value(
+                "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]
+            )
+        )
+    elif key in [
+        "PDF/Magnification",
+        "PDF/MarginLeft",
+        "PDF/MarginRight",
+        "PDF/MarginTop",
+        "PDF/MarginBottom",
+    ]:
+        return int(
+            Prefs.settings.value(
+                "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]
+            )
+        )
     else:
         return Prefs.settings.value(
-            "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key])
+            "Editor/Exporters/" + key, Prefs.editorExporterDefaults[key]
+        )
 
 
 def setEditorExporter(key, value):
     """
     Module function to store the various editor exporters settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     if key in ["RTF/Font"]:
-        Prefs.settings.setValue(
-            "Editor/Exporters/" + key, value.toString())
+        Prefs.settings.setValue("Editor/Exporters/" + key, value.toString())
     else:
         Prefs.settings.setValue("Editor/Exporters/" + key, value)
-    
+
 
 def getPrinter(key):
     """
     Module function to retrieve the various printer settings.
-    
+
     @param key the key of the value to get
     @return the requested printer setting
     """
     if key in ["ColorMode", "FirstPageFirst"]:
-        return toBool(Prefs.settings.value(
-            "Printer/" + key, Prefs.printerDefaults[key]))
+        return toBool(
+            Prefs.settings.value("Printer/" + key, Prefs.printerDefaults[key])
+        )
     elif key in ["Magnification", "Orientation", "PageSize", "Resolution"]:
-        return int(Prefs.settings.value(
-            "Printer/" + key, Prefs.printerDefaults[key]))
+        return int(Prefs.settings.value("Printer/" + key, Prefs.printerDefaults[key]))
     elif key in ["LeftMargin", "RightMargin", "TopMargin", "BottomMargin"]:
-        return float(Prefs.settings.value(
-            "Printer/" + key, Prefs.printerDefaults[key]))
+        return float(Prefs.settings.value("Printer/" + key, Prefs.printerDefaults[key]))
     elif key in ["HeaderFont"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "Printer/" + key, Prefs.printerDefaults[key]))
+        f.fromString(Prefs.settings.value("Printer/" + key, Prefs.printerDefaults[key]))
         return f
     else:
-        return Prefs.settings.value(
-            "Printer/" + key, Prefs.printerDefaults[key])
+        return Prefs.settings.value("Printer/" + key, Prefs.printerDefaults[key])
 
 
 def setPrinter(key, value):
     """
     Module function to store the various printer settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2472,33 +2580,30 @@
 def getShell(key):
     """
     Module function to retrieve the various shell settings.
-    
+
     @param key the key of the value to get
     @return the requested shell setting
     """
     if key in ["MonospacedFont", "MarginsFont"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "Shell/" + key, Prefs.shellDefaults[key]))
+        f.fromString(Prefs.settings.value("Shell/" + key, Prefs.shellDefaults[key]))
         return f
     elif key in ["MaxHistoryEntries"]:
-        return int(Prefs.settings.value(
-            "Shell/" + key, Prefs.shellDefaults[key]))
+        return int(Prefs.settings.value("Shell/" + key, Prefs.shellDefaults[key]))
     elif key in ["HistoryStyle"]:
-        return ShellHistoryStyle(int(Prefs.settings.value(
-            "Shell/" + key, Prefs.shellDefaults[key].value)))
+        return ShellHistoryStyle(
+            int(Prefs.settings.value("Shell/" + key, Prefs.shellDefaults[key].value))
+        )
     elif key in ["LastVirtualEnvironment"]:
-        return Prefs.settings.value(
-            "Shell/" + key, Prefs.shellDefaults[key])
+        return Prefs.settings.value("Shell/" + key, Prefs.shellDefaults[key])
     else:
-        return toBool(Prefs.settings.value(
-            "Shell/" + key, Prefs.shellDefaults[key]))
+        return toBool(Prefs.settings.value("Shell/" + key, Prefs.shellDefaults[key]))
 
 
 def setShell(key, value):
     """
     Module function to store the various shell settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2513,25 +2618,26 @@
 def getProject(key):
     """
     Module function to retrieve the various project handling settings.
-    
+
     @param key the key of the value to get
     @return the requested project setting
     """
     if key in ["RecentNumber"]:
-        return int(Prefs.settings.value(
-            "Project/" + key, Prefs.projectDefaults[key]))
+        return int(Prefs.settings.value("Project/" + key, Prefs.projectDefaults[key]))
     elif key in ["DebugClientsHistory", "DebuggerInterpreterHistory"]:
-        return toList(Prefs.settings.value(
-            "Project/" + key, Prefs.projectDefaults[key]))
+        return toList(
+            Prefs.settings.value("Project/" + key, Prefs.projectDefaults[key])
+        )
     else:
-        return toBool(Prefs.settings.value(
-            "Project/" + key, Prefs.projectDefaults[key]))
-    
+        return toBool(
+            Prefs.settings.value("Project/" + key, Prefs.projectDefaults[key])
+        )
+
 
 def setProject(key, value):
     """
     Module function to store the various project handling settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2543,12 +2649,12 @@
         Prefs.settings.setValue("Project/" + key, newList)
     else:
         Prefs.settings.setValue("Project/" + key, value)
-    
+
 
 def getProjectBrowserFlags(key):
     """
     Module function to retrieve the various project browser flags settings.
-    
+
     @param key the key of the value to get
     @return the requested project setting
     """
@@ -2556,44 +2662,43 @@
         default = Prefs.projectBrowserFlagsDefaults[key]
     except KeyError:
         default = AllBrowsersFlag
-    
-    return int(Prefs.settings.value(
-        "Project/BrowserFlags/" + key, default))
-    
+
+    return int(Prefs.settings.value("Project/BrowserFlags/" + key, default))
+
 
 def setProjectBrowserFlags(key, value):
     """
     Module function to store the various project browser flags settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("Project/BrowserFlags/" + key, value)
-    
+
 
 def setProjectBrowserFlagsDefault(key, value):
     """
     Module function to store the various project browser flags settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.projectBrowserFlagsDefaults[key] = value
-    
+
 
 def removeProjectBrowserFlags(key):
     """
     Module function to remove a project browser flags setting.
-    
+
     @param key the key of the setting to be removed
     """
     Prefs.settings.remove("Project/BrowserFlags/" + key)
-    
+
 
 def getProjectBrowserColour(key):
     """
     Module function to retrieve the various project browser colours.
-    
+
     @param key the key of the value to get
     @return the requested project browser colour
     """
@@ -2602,40 +2707,43 @@
         return QColor(col)
     else:
         return Prefs.projectBrowserColourDefaults[key]
-    
+
 
 def setProjectBrowserColour(key, value):
     """
     Module function to store the various project browser colours.
-    
+
     @param key the key of the colour to be set
     @param value the colour to be set
     """
     Prefs.settings.setValue("Project/Colour/" + key, value.name())
-    
+
 
 def getMultiProject(key):
     """
     Module function to retrieve the various project handling settings.
-    
+
     @param key the key of the value to get
     @return the requested project setting
     """
     if key in ["RecentNumber"]:
-        return int(Prefs.settings.value(
-            "MultiProject/" + key, Prefs.multiProjectDefaults[key]))
+        return int(
+            Prefs.settings.value("MultiProject/" + key, Prefs.multiProjectDefaults[key])
+        )
     elif key in ["OpenMasterAutomatically", "TimestampFile"]:
-        return toBool(Prefs.settings.value(
-            "MultiProject/" + key, Prefs.multiProjectDefaults[key]))
+        return toBool(
+            Prefs.settings.value("MultiProject/" + key, Prefs.multiProjectDefaults[key])
+        )
     else:
         return Prefs.settings.value(
-            "MultiProject/" + key, Prefs.multiProjectDefaults[key])
+            "MultiProject/" + key, Prefs.multiProjectDefaults[key]
+        )
 
 
 def setMultiProject(key, value):
     """
     Module function to store the various project handling settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2645,44 +2753,40 @@
 def getQtDocDir(version):
     """
     Module function to retrieve the Qt5DocDir/Qt6DocDir setting.
-    
+
     @param version Qt version to get documentation directory for
     @type int
     @return the requested Qt5DocDir/Qt6DocDir setting
     @rtype str
     """
     key = "Qt{0}DocDir".format(version)
-    s = Prefs.settings.value(
-        "Help/{0}".format(key), Prefs.helpDefaults[key])
+    s = Prefs.settings.value("Help/{0}".format(key), Prefs.helpDefaults[key])
     if s == "":
         s = os.getenv(key.upper(), "")
     if s == "":
         s = os.path.join(
-            QLibraryInfo.path(
-                QLibraryInfo.LibraryPath.DocumentationPath),
-            "qtdoc")
+            QLibraryInfo.path(QLibraryInfo.LibraryPath.DocumentationPath), "qtdoc"
+        )
     return s
 
 
 def getHelp(key):
     """
     Module function to retrieve the various help settings.
-    
+
     @param key the key of the value to get
     @return the requested help setting
     """
-    if key in ("HelpViewerType", ):
-        return int(Prefs.settings.value(
-            "Help/" + key, Prefs.helpDefaults[key]))
+    if key in ("HelpViewerType",):
+        return int(Prefs.settings.value("Help/" + key, Prefs.helpDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "Help/" + key, Prefs.helpDefaults[key])
+        return Prefs.settings.value("Help/" + key, Prefs.helpDefaults[key])
 
 
 def setHelp(key, value):
     """
     Module function to store the various help settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -2692,20 +2796,25 @@
 def getWebBrowser(key):
     """
     Module function to retrieve the various web browser settings.
-    
+
     @param key the key of the value to get
     @return the requested help setting
     """
     if not Prefs.webEngineSettingsIntitialized:
         Prefs.initWebEngineSettingsDefaults()
-    
+
     if key in ["StandardFont", "FixedFont"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]))
+        f.fromString(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+        )
         return f
-    elif key in ["SecureUrlColor", "InsecureUrlColor", "MaliciousUrlColor",
-                 "PrivateModeUrlColor"]:
+    elif key in [
+        "SecureUrlColor",
+        "InsecureUrlColor",
+        "MaliciousUrlColor",
+        "PrivateModeUrlColor",
+    ]:
         col = Prefs.settings.value("WebBrowser/" + key)
         if col is not None:
             return QColor(col)
@@ -2743,7 +2852,8 @@
                 download["Downloaded"] = QDateTime()
             elif isinstance(download["Downloaded"], str):
                 download["Downloaded"] = QDateTime.fromString(
-                    download["Downloaded"], "yyyy-MM-dd hh:mm:ss")
+                    download["Downloaded"], "yyyy-MM-dd hh:mm:ss"
+                )
             downloads.append(download)
         Prefs.settings.endArray()
         return downloads
@@ -2761,67 +2871,122 @@
         return feeds
     elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
         from Utilities.crypto import pwConvert
-        return pwConvert(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]),
-            encode=False)
-    elif key in ["StartupBehavior", "HistoryLimit",
-                 "DownloadManagerRemovePolicy", "SyncType", "SyncFtpPort",
-                 "SyncFtpIdleTimeout", "SyncEncryptionKeyLength",
-                 "DefaultFontSize", "DefaultFixedFontSize",
-                 "MinimumFontSize", "MinimumLogicalFontSize",
-                 "DiskCacheSize", "AcceptCookies", "KeepCookiesUntil",
-                 "AdBlockUpdatePeriod", "TabManagerGroupByType",
-                 "SessionAutoSaveInterval", "NewTabBehavior",
-                 "RefererSendReferer", "RefererDefaultPolicy",
-                 "RefererTrimmingPolicy", "AcceptQuotaRequest",
-                 "AcceptProtocolHandlerRequest",
-                 ]:
-        return int(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]))
-    elif key in ["SingleWebBrowserWindow", "SaveGeometry",
-                 "JavaScriptEnabled", "JavaScriptCanOpenWindows",
-                 "JavaScriptCanAccessClipboard",
-                 "AutoLoadImages", "LocalStorageEnabled",
-                 "SpatialNavigationEnabled", "LinksIncludedInFocusChain",
-                 "LocalContentCanAccessRemoteUrls",
-                 "LocalContentCanAccessFileUrls", "XSSAuditingEnabled",
-                 "ScrollAnimatorEnabled", "ErrorPageEnabled",
-                 "WarnOnMultipleClose", "WebSearchSuggestions",
-                 "SyncEnabled", "SyncBookmarks", "SyncHistory",
-                 "SyncPasswords", "SyncUserAgents", "SyncSpeedDial",
-                 "SyncEncryptData", "SyncEncryptPasswordsOnly",
-                 "ShowPreview", "DiskCacheEnabled",
-                 "DoNotTrack", "FilterTrackingCookies",
-                 "AdBlockEnabled", "AdBlockUseLimitedEasyList",
-                 "PluginsEnabled", "FullScreenSupportEnabled",
-                 "AutoScrollEnabled", "ScreenCaptureEnabled",
-                 "WebGLEnabled", "FocusOnNavigationEnabled",
-                 "PrintElementBackgrounds", "AllowRunningInsecureContent",
-                 "SpellCheckEnabled", "ShowToolbars", "MenuBarVisible",
-                 "BookmarksToolBarVisible", "StatusBarVisible",
-                 "SessionAutoSave", "LoadTabOnActivation",
-                 "SafeBrowsingEnabled", "SafeBrowsingFilterPlatform",
-                 "SafeBrowsingAutoUpdate", "SafeBrowsingUseLookupApi",
-                 "AllowGeolocationOnInsecureOrigins",
-                 "AllowWindowActivationFromJavaScript", "ShowScrollBars",
-                 "DownloadManagerAutoOpen", "DownloadManagerAutoClose",
-                 "PlaybackRequiresUserGesture", "JavaScriptCanPaste",
-                 "WebRTCPublicInterfacesOnly", "DnsPrefetchEnabled",
-                 "VirusTotalEnabled", "VirusTotalSecure",
-                 "PdfViewerEnabled", "AlwaysRejectFaultyCertificates",
-                 "Accelerated2dCanvasEnabled", "AutoLoadIconsForPage",
-                 ]:
-        return toBool(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]))
-    elif key in ["GreaseMonkeyDisabledScripts", "SendRefererWhitelist",
-                 "AdBlockSubscriptions", "AdBlockExceptions",
-                 "SpellCheckLanguages",
-                 ]:
-        return toList(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]))
+
+        return pwConvert(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key]),
+            encode=False,
+        )
+    elif key in [
+        "StartupBehavior",
+        "HistoryLimit",
+        "DownloadManagerRemovePolicy",
+        "SyncType",
+        "SyncFtpPort",
+        "SyncFtpIdleTimeout",
+        "SyncEncryptionKeyLength",
+        "DefaultFontSize",
+        "DefaultFixedFontSize",
+        "MinimumFontSize",
+        "MinimumLogicalFontSize",
+        "DiskCacheSize",
+        "AcceptCookies",
+        "KeepCookiesUntil",
+        "AdBlockUpdatePeriod",
+        "TabManagerGroupByType",
+        "SessionAutoSaveInterval",
+        "NewTabBehavior",
+        "RefererSendReferer",
+        "RefererDefaultPolicy",
+        "RefererTrimmingPolicy",
+        "AcceptQuotaRequest",
+        "AcceptProtocolHandlerRequest",
+    ]:
+        return int(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+        )
+    elif key in [
+        "SingleWebBrowserWindow",
+        "SaveGeometry",
+        "JavaScriptEnabled",
+        "JavaScriptCanOpenWindows",
+        "JavaScriptCanAccessClipboard",
+        "AutoLoadImages",
+        "LocalStorageEnabled",
+        "SpatialNavigationEnabled",
+        "LinksIncludedInFocusChain",
+        "LocalContentCanAccessRemoteUrls",
+        "LocalContentCanAccessFileUrls",
+        "XSSAuditingEnabled",
+        "ScrollAnimatorEnabled",
+        "ErrorPageEnabled",
+        "WarnOnMultipleClose",
+        "WebSearchSuggestions",
+        "SyncEnabled",
+        "SyncBookmarks",
+        "SyncHistory",
+        "SyncPasswords",
+        "SyncUserAgents",
+        "SyncSpeedDial",
+        "SyncEncryptData",
+        "SyncEncryptPasswordsOnly",
+        "ShowPreview",
+        "DiskCacheEnabled",
+        "DoNotTrack",
+        "FilterTrackingCookies",
+        "AdBlockEnabled",
+        "AdBlockUseLimitedEasyList",
+        "PluginsEnabled",
+        "FullScreenSupportEnabled",
+        "AutoScrollEnabled",
+        "ScreenCaptureEnabled",
+        "WebGLEnabled",
+        "FocusOnNavigationEnabled",
+        "PrintElementBackgrounds",
+        "AllowRunningInsecureContent",
+        "SpellCheckEnabled",
+        "ShowToolbars",
+        "MenuBarVisible",
+        "BookmarksToolBarVisible",
+        "StatusBarVisible",
+        "SessionAutoSave",
+        "LoadTabOnActivation",
+        "SafeBrowsingEnabled",
+        "SafeBrowsingFilterPlatform",
+        "SafeBrowsingAutoUpdate",
+        "SafeBrowsingUseLookupApi",
+        "AllowGeolocationOnInsecureOrigins",
+        "AllowWindowActivationFromJavaScript",
+        "ShowScrollBars",
+        "DownloadManagerAutoOpen",
+        "DownloadManagerAutoClose",
+        "PlaybackRequiresUserGesture",
+        "JavaScriptCanPaste",
+        "WebRTCPublicInterfacesOnly",
+        "DnsPrefetchEnabled",
+        "VirusTotalEnabled",
+        "VirusTotalSecure",
+        "PdfViewerEnabled",
+        "AlwaysRejectFaultyCertificates",
+        "Accelerated2dCanvasEnabled",
+        "AutoLoadIconsForPage",
+    ]:
+        return toBool(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+        )
+    elif key in [
+        "GreaseMonkeyDisabledScripts",
+        "SendRefererWhitelist",
+        "AdBlockSubscriptions",
+        "AdBlockExceptions",
+        "SpellCheckLanguages",
+    ]:
+        return toList(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+        )
     elif key in ["AutoScrollDivider"]:
-        return float(Prefs.settings.value(
-            "WebBrowser/" + key, Prefs.webBrowserDefaults[key]))
+        return float(
+            Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+        )
     elif key in ["SafeBrowsingUpdateDateTime"]:
         dateTimeStr = Prefs.settings.value("WebBrowser/" + key)
         if dateTimeStr is not None:
@@ -2829,21 +2994,24 @@
         else:
             return Prefs.webBrowserDefaults[key]
     else:
-        return Prefs.settings.value("WebBrowser/" + key,
-                                    Prefs.webBrowserDefaults[key])
-    
+        return Prefs.settings.value("WebBrowser/" + key, Prefs.webBrowserDefaults[key])
+
 
 def setWebBrowser(key, value):
     """
     Module function to store the various web browser settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     if key in ["StandardFont", "FixedFont"]:
         Prefs.settings.setValue("WebBrowser/" + key, value.toString())
-    elif key in ["SecureUrlColor", "InsecureUrlColor", "MaliciousUrlColor",
-                 "PrivateModeUrlColor"]:
+    elif key in [
+        "SecureUrlColor",
+        "InsecureUrlColor",
+        "MaliciousUrlColor",
+        "PrivateModeUrlColor",
+    ]:
         Prefs.settings.setValue("WebBrowser/" + key, value.name())
     elif key == "WebSearchKeywords":
         # value is list of tuples of (keyword, engine name)
@@ -2866,7 +3034,8 @@
             Prefs.settings.setValue("Done", v["Done"])
             Prefs.settings.setValue("PageURL", v["PageURL"])
             Prefs.settings.setValue(
-                "Downloaded", v["Downloaded"].toString("yyyy-MM-dd hh:mm:ss"))
+                "Downloaded", v["Downloaded"].toString("yyyy-MM-dd hh:mm:ss")
+            )
         Prefs.settings.endArray()
     elif key == "RssFeeds":
         # value is list of tuples of (URL, title, icon)
@@ -2880,162 +3049,167 @@
         Prefs.settings.endArray()
     elif key in ["SyncFtpPassword", "SyncEncryptionKey"]:
         from Utilities.crypto import pwConvert
-        Prefs.settings.setValue(
-            "WebBrowser/" + key, pwConvert(value, encode=True))
+
+        Prefs.settings.setValue("WebBrowser/" + key, pwConvert(value, encode=True))
     elif key in ["SafeBrowsingUpdateDateTime"]:
         # value is a QDateTime
-        Prefs.settings.setValue("WebBrowser/" + key,
-                                value.toString(Qt.DateFormat.ISODate))
+        Prefs.settings.setValue(
+            "WebBrowser/" + key, value.toString(Qt.DateFormat.ISODate)
+        )
     else:
         Prefs.settings.setValue("WebBrowser/" + key, value)
-    
+
 
 def getSystem(key):
     """
     Module function to retrieve the various system settings.
-    
+
     @param key the key of the value to get
     @return the requested system setting
     """
     from Utilities import supportedCodecs
+
     if key in ["StringEncoding", "IOEncoding"]:
-        encoding = Prefs.settings.value(
-            "System/" + key, Prefs.sysDefaults[key])
+        encoding = Prefs.settings.value("System/" + key, Prefs.sysDefaults[key])
         if encoding not in supportedCodecs:
             encoding = Prefs.sysDefaults[key]
         return encoding
-    
+
     return None
-    
+
 
 def setSystem(key, value):
     """
     Module function to store the various system settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("System/" + key, value)
-    
+
 
 def getQtTranslationsDir():
     """
     Module function to retrieve the Qt6TranslationsDir
     setting depending on the current Qt version.
-    
+
     @return the requested setting (string)
     """
     s = Prefs.settings.value(
-        "Qt/Qt6TranslationsDir",
-        Prefs.qtDefaults["Qt6TranslationsDir"])
+        "Qt/Qt6TranslationsDir", Prefs.qtDefaults["Qt6TranslationsDir"]
+    )
     if s == "":
-        s = QLibraryInfo.path(
-            QLibraryInfo.LibraryPath.TranslationsPath)
+        s = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
     if s == "" and Globals.isWindowsPlatform():
-        transPath = os.path.join(Globals.getPyQt6ModulesDirectory(),
-                                 "translations")
+        transPath = os.path.join(Globals.getPyQt6ModulesDirectory(), "translations")
         if os.path.exists(transPath):
             s = transPath
     return s
-    
+
 
 def getQt(key):
     """
     Module function to retrieve the various Qt settings.
-    
+
     @param key the key of the value to get
     @return the requested Qt setting
     """
     if key in ["Qt6TranslationsDir"]:
         return getQtTranslationsDir()
     elif key in ["PyuicIndent", "Pyuic6Indent"]:
-        return int(Prefs.settings.value(
-            "Qt/" + key, Prefs.qtDefaults[key]))
-    elif key in ["PyuicFromImports", "PyuicExecute", "Pyuic6Execute",
-                 "PySide2FromImports", "PySide6FromImports"]:
-        return toBool(Prefs.settings.value(
-            "Qt/" + key, Prefs.qtDefaults[key]))
+        return int(Prefs.settings.value("Qt/" + key, Prefs.qtDefaults[key]))
+    elif key in [
+        "PyuicFromImports",
+        "PyuicExecute",
+        "Pyuic6Execute",
+        "PySide2FromImports",
+        "PySide6FromImports",
+    ]:
+        return toBool(Prefs.settings.value("Qt/" + key, Prefs.qtDefaults[key]))
     else:
         return Prefs.settings.value("Qt/" + key, Prefs.qtDefaults[key])
-    
+
 
 def setQt(key, value):
     """
     Module function to store the various Qt settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("Qt/" + key, value)
-    
+
 
 def getCorba(key):
     """
     Module function to retrieve the various Corba settings.
-    
+
     @param key the key of the value to get
     @return the requested corba setting
     """
-    return Prefs.settings.value(
-        "Corba/" + key, Prefs.corbaDefaults[key])
-    
+    return Prefs.settings.value("Corba/" + key, Prefs.corbaDefaults[key])
+
 
 def setCorba(key, value):
     """
     Module function to store the various Corba settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("Corba/" + key, value)
-    
+
 
 def getProtobuf(key):
     """
     Module function to retrieve the various protobuf settings.
-    
+
     @param key the key of the value to get
     @type str
     @return the requested protobuf setting
     @rtype any
     """
-    return Prefs.settings.value(
-        "Protobuf/" + key, Prefs.protobufDefaults[key])
-    
+    return Prefs.settings.value("Protobuf/" + key, Prefs.protobufDefaults[key])
+
 
 def setProtobuf(key, value):
     """
     Module function to store the various protobuf settings.
-    
+
     @param key the key of the setting to be set
     @type str
     @param value the value to be set
     @type any
     """
     Prefs.settings.setValue("Protobuf/" + key, value)
-    
+
 
 def getUser(key):
     """
     Module function to retrieve the various user settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key == "MailServerPassword":
         from Utilities.crypto import pwConvert
-        return pwConvert(Prefs.settings.value(
-            "User/" + key, Prefs.userDefaults[key]), encode=False)
+
+        return pwConvert(
+            Prefs.settings.value("User/" + key, Prefs.userDefaults[key]), encode=False
+        )
     elif key in ["MailServerPort"]:
         try:
-            return int(Prefs.settings.value(
-                "User/" + key, Prefs.userDefaults[key]))
+            return int(Prefs.settings.value("User/" + key, Prefs.userDefaults[key]))
         except ValueError:
             return Prefs.userDefaults[key]
-    elif key in ["MailServerAuthentication", "UseSystemEmailClient",
-                 "UseMasterPassword", "SavePasswords", "UseGoogleMailOAuth2"]:
-        return toBool(Prefs.settings.value(
-            "User/" + key, Prefs.userDefaults[key]))
+    elif key in [
+        "MailServerAuthentication",
+        "UseSystemEmailClient",
+        "UseMasterPassword",
+        "SavePasswords",
+        "UseGoogleMailOAuth2",
+    ]:
+        return toBool(Prefs.settings.value("User/" + key, Prefs.userDefaults[key]))
     elif key == "MailServerEncryption":
         # convert from old key 'MailServerUseTLS'
         val = Prefs.settings.value("User/" + key)
@@ -3046,116 +3220,124 @@
                 val = Prefs.userDefaults[key]
         return val
     else:
-        return Prefs.settings.value(
-            "User/" + key, Prefs.userDefaults[key])
-    
+        return Prefs.settings.value("User/" + key, Prefs.userDefaults[key])
+
 
 def setUser(key, value):
     """
     Module function to store the various user settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     if key == "MailServerPassword":
         from Utilities.crypto import pwConvert
-        Prefs.settings.setValue(
-            "User/" + key, pwConvert(value, encode=True))
+
+        Prefs.settings.setValue("User/" + key, pwConvert(value, encode=True))
     elif key == "MasterPassword":
         from Utilities.crypto.py3PBKDF2 import hashPassword
-        Prefs.settings.setValue(
-            "User/" + key, hashPassword(value))
+
+        Prefs.settings.setValue("User/" + key, hashPassword(value))
     else:
         Prefs.settings.setValue("User/" + key, value)
-    
+
 
 def getVCS(key):
     """
     Module function to retrieve the VCS related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["StatusMonitorInterval", "CommitMessages"]:
-        return int(Prefs.settings.value(
-            "VCS/" + key, Prefs.vcsDefaults[key]))
+        return int(Prefs.settings.value("VCS/" + key, Prefs.vcsDefaults[key]))
     else:
-        return toBool(Prefs.settings.value(
-            "VCS/" + key, Prefs.vcsDefaults[key]))
-    
+        return toBool(Prefs.settings.value("VCS/" + key, Prefs.vcsDefaults[key]))
+
 
 def setVCS(key, value):
     """
     Module function to store the VCS related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("VCS/" + key, value)
-    
+
 
 def getTasks(key):
     """
     Module function to retrieve the Tasks related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
-    if key in ["TasksFixmeColor", "TasksWarningColor",
-               "TasksTodoColor", "TasksNoteColor",
-               "TasksTestColor", "TasksDocuColor"]:
+    if key in [
+        "TasksFixmeColor",
+        "TasksWarningColor",
+        "TasksTodoColor",
+        "TasksNoteColor",
+        "TasksTestColor",
+        "TasksDocuColor",
+    ]:
         col = Prefs.settings.value("Tasks/" + key)
         if col is not None:
             return QColor(col)
         else:
             return Prefs.tasksDefaults[key]
-    elif key in ["ClearOnFileClose", ]:
-        return toBool(Prefs.settings.value(
-            "Tasks/" + key, Prefs.tasksDefaults[key]))
+    elif key in [
+        "ClearOnFileClose",
+    ]:
+        return toBool(Prefs.settings.value("Tasks/" + key, Prefs.tasksDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "Tasks/" + key, Prefs.tasksDefaults[key])
-    
+        return Prefs.settings.value("Tasks/" + key, Prefs.tasksDefaults[key])
+
 
 def setTasks(key, value):
     """
     Module function to store the Tasks related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
-    if key in ["TasksFixmeColor", "TasksWarningColor",
-               "TasksTodoColor", "TasksNoteColor",
-               "TasksTestColor", "TasksDocuColor"]:
+    if key in [
+        "TasksFixmeColor",
+        "TasksWarningColor",
+        "TasksTodoColor",
+        "TasksNoteColor",
+        "TasksTestColor",
+        "TasksDocuColor",
+    ]:
         Prefs.settings.setValue("Tasks/" + key, value.name())
     else:
         Prefs.settings.setValue("Tasks/" + key, value)
-    
+
 
 def getTemplates(key):
     """
     Module function to retrieve the Templates related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["SeparatorChar"]:
-        return Prefs.settings.value(
-            "Templates/" + key, Prefs.templatesDefaults[key])
+        return Prefs.settings.value("Templates/" + key, Prefs.templatesDefaults[key])
     elif key in ["EditorFont"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "Templates/" + key, Prefs.templatesDefaults[key]))
+        f.fromString(
+            Prefs.settings.value("Templates/" + key, Prefs.templatesDefaults[key])
+        )
         return f
     else:
-        return toBool(Prefs.settings.value(
-            "Templates/" + key, Prefs.templatesDefaults[key]))
-    
+        return toBool(
+            Prefs.settings.value("Templates/" + key, Prefs.templatesDefaults[key])
+        )
+
 
 def setTemplates(key, value):
     """
     Module function to store the Templates related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3163,49 +3345,58 @@
         Prefs.settings.setValue("Templates/" + key, value.toString())
     else:
         Prefs.settings.setValue("Templates/" + key, value)
-    
+
 
 def getPluginManager(key):
     """
     Module function to retrieve the plugin manager related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["DownloadPath"]:
         return Prefs.settings.value(
-            "PluginManager/" + key, Prefs.pluginManagerDefaults[key])
+            "PluginManager/" + key, Prefs.pluginManagerDefaults[key]
+        )
     elif key in ["UpdatesCheckInterval", "KeepGenerations"]:
-        return int(Prefs.settings.value(
-            "PluginManager/" + key, Prefs.pluginManagerDefaults[key]))
+        return int(
+            Prefs.settings.value(
+                "PluginManager/" + key, Prefs.pluginManagerDefaults[key]
+            )
+        )
     elif key in ["HiddenPlugins"]:
-        return toList(Prefs.settings.value(
-            "PluginManager/" + key, Prefs.pluginManagerDefaults[key]))
+        return toList(
+            Prefs.settings.value(
+                "PluginManager/" + key, Prefs.pluginManagerDefaults[key]
+            )
+        )
     else:
-        return toBool(Prefs.settings.value(
-            "PluginManager/" + key, Prefs.pluginManagerDefaults[key]))
-    
+        return toBool(
+            Prefs.settings.value(
+                "PluginManager/" + key, Prefs.pluginManagerDefaults[key]
+            )
+        )
+
 
 def setPluginManager(key, value):
     """
     Module function to store the plugin manager related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("PluginManager/" + key, value)
-    
+
 
 def getGraphics(key):
     """
     Module function to retrieve the Graphics related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["Font"]:
-        font = Prefs.settings.value(
-            "Graphics/" + key, Prefs.graphicsDefaults[key])
+        font = Prefs.settings.value("Graphics/" + key, Prefs.graphicsDefaults[key])
         if isinstance(font, QFont):
             # workaround for an old bug in eric < 4.4
             return font
@@ -3214,14 +3405,13 @@
             f.fromString(font)
             return f
     else:
-        return Prefs.settings.value(
-            "Graphics/" + key, Prefs.graphicsDefaults[key])
-    
+        return Prefs.settings.value("Graphics/" + key, Prefs.graphicsDefaults[key])
+
 
 def setGraphics(key, value):
     """
     Module function to store the Graphics related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3229,23 +3419,22 @@
         Prefs.settings.setValue("Graphics/" + key, value.toString())
     else:
         Prefs.settings.setValue("Graphics/" + key, value)
-    
+
 
 def getIconEditor(key):
     """
     Module function to retrieve the Icon Editor related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
-    return Prefs.settings.value(
-        "IconEditor/" + key, Prefs.iconEditorDefaults[key])
-    
+    return Prefs.settings.value("IconEditor/" + key, Prefs.iconEditorDefaults[key])
+
 
 def setIconEditor(key, value):
     """
     Module function to store the Icon Editor related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3255,22 +3444,22 @@
 def getFlakes(key):
     """
     Module function to retrieve the pyflakes related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["IncludeInSyntaxCheck", "IgnoreStarImportWarnings"]:
-        return toBool(Prefs.settings.value("Py3Flakes/" + key,
-                      Prefs.pyflakesDefaults[key]))
+        return toBool(
+            Prefs.settings.value("Py3Flakes/" + key, Prefs.pyflakesDefaults[key])
+        )
     else:
-        return Prefs.settings.value(
-            "Py3Flakes/" + key, Prefs.pyflakesDefaults[key])
-    
+        return Prefs.settings.value("Py3Flakes/" + key, Prefs.pyflakesDefaults[key])
+
 
 def setFlakes(key, value):
     """
     Module function to store the pyflakes related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3280,49 +3469,53 @@
 def getTrayStarter(key):
     """
     Module function to retrieve the tray starter related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
-    return Prefs.settings.value(
-        "TrayStarter/" + key, Prefs.trayStarterDefaults[key])
-    
+    return Prefs.settings.value("TrayStarter/" + key, Prefs.trayStarterDefaults[key])
+
 
 def setTrayStarter(key, value):
     """
     Module function to store the tray starter related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     Prefs.settings.setValue("TrayStarter/" + key, value)
-    
+
 
 def getIrc(key):
     """
     Module function to retrieve the IRC related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
-    if key in ["TimestampIncludeDate", "ShowTimestamps", "ShowNotifications",
-               "NotifyJoinPart", "NotifyMessage", "NotifyNick",
-               "EnableIrcColours", "AutoUserInfoLookup",
-               "MarkPositionWhenHidden", "AskOnShutdown"]:
-        return toBool(Prefs.settings.value(
-            "IRC/" + key, Prefs.ircDefaults[key]))
+    if key in [
+        "TimestampIncludeDate",
+        "ShowTimestamps",
+        "ShowNotifications",
+        "NotifyJoinPart",
+        "NotifyMessage",
+        "NotifyNick",
+        "EnableIrcColours",
+        "AutoUserInfoLookup",
+        "MarkPositionWhenHidden",
+        "AskOnShutdown",
+    ]:
+        return toBool(Prefs.settings.value("IRC/" + key, Prefs.ircDefaults[key]))
     elif key in ["AutoUserInfoMax", "AutoUserInfoInterval"]:
-        return int(Prefs.settings.value(
-            "IRC/" + key, Prefs.ircDefaults[key]))
+        return int(Prefs.settings.value("IRC/" + key, Prefs.ircDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "IRC/" + key, Prefs.ircDefaults[key])
+        return Prefs.settings.value("IRC/" + key, Prefs.ircDefaults[key])
 
 
 def setIrc(key, value):
     """
     Module function to store the IRC related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3332,31 +3525,38 @@
 def getHexEditor(key):
     """
     Module function to retrieve the Hex Editor related settings.
-    
+
     @param key the key of the value to get
     @return the requested user setting
     """
     if key in ["AddressAreaWidth", "RecentNumber"]:
-        return int(Prefs.settings.value(
-            "HexEditor/" + key, Prefs.hexEditorDefaults[key]))
-    elif key in ["ShowAddressArea", "ShowAsciiArea", "OpenInOverwriteMode",
-                 "OpenReadOnly", "HighlightChanges"]:
-        return toBool(Prefs.settings.value(
-            "HexEditor/" + key, Prefs.hexEditorDefaults[key]))
+        return int(
+            Prefs.settings.value("HexEditor/" + key, Prefs.hexEditorDefaults[key])
+        )
+    elif key in [
+        "ShowAddressArea",
+        "ShowAsciiArea",
+        "OpenInOverwriteMode",
+        "OpenReadOnly",
+        "HighlightChanges",
+    ]:
+        return toBool(
+            Prefs.settings.value("HexEditor/" + key, Prefs.hexEditorDefaults[key])
+        )
     elif key in ["Font"]:
         f = QFont()
-        f.fromString(Prefs.settings.value(
-            "HexEditor/" + key, Prefs.hexEditorDefaults[key]))
+        f.fromString(
+            Prefs.settings.value("HexEditor/" + key, Prefs.hexEditorDefaults[key])
+        )
         return f
     else:
-        return Prefs.settings.value(
-            "HexEditor/" + key, Prefs.hexEditorDefaults[key])
-    
+        return Prefs.settings.value("HexEditor/" + key, Prefs.hexEditorDefaults[key])
+
 
 def setHexEditor(key, value):
     """
     Module function to store the Hex Editor related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3364,12 +3564,12 @@
         Prefs.settings.setValue("HexEditor/" + key, value.toString())
     else:
         Prefs.settings.setValue("HexEditor/" + key, value)
-    
+
 
 def getDiffColour(key):
     """
     Module function to retrieve the colours for the diff highlighter.
-    
+
     @param key the key of the value to get
     @return the requested diff colour
     """
@@ -3382,42 +3582,42 @@
             return QColor(col)
     else:
         return Prefs.diffColourDefaults[key]
-    
+
 
 def setDiffColour(key, value):
     """
     Module function to store the diff highlighter colours.
-    
+
     @param key the key of the colour to be set
     @param value the colour to be set
     """
-    val = ("#{0:8x}".format(value.rgba())
-           if value.alpha() < 255 else
-           value.name())
+    val = "#{0:8x}".format(value.rgba()) if value.alpha() < 255 else value.name()
     Prefs.settings.setValue("Diff/" + key, val)
 
 
 def getDocuViewer(key):
     """
     Module function to retrieve the Code Documentation Viewer related settings.
-    
+
     @param key the key of the value to get
     @return the requested Code Documentation Viewer value
     """
     if key in ["ShowInfoOnOpenParenthesis"]:
-        return toBool(Prefs.settings.value(
-            "CodeDocumentationViewer/" + key,
-            Prefs.docuViewerDefaults[key]))
+        return toBool(
+            Prefs.settings.value(
+                "CodeDocumentationViewer/" + key, Prefs.docuViewerDefaults[key]
+            )
+        )
     else:
         return Prefs.settings.value(
-            "CodeDocumentationViewer/" + key,
-            Prefs.docuViewerDefaults[key])
-    
+            "CodeDocumentationViewer/" + key, Prefs.docuViewerDefaults[key]
+        )
+
 
 def setDocuViewer(key, value):
     """
     Module function to store the Code Documentation Viewer related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3427,19 +3627,17 @@
 def getConda(key):
     """
     Module function to retrieve the conda related settings.
-    
+
     @param key the key of the value to get
     @return the requested conda value
     """
-    return Prefs.settings.value(
-        "Conda/" + key,
-        Prefs.condaDefaults[key])
+    return Prefs.settings.value("Conda/" + key, Prefs.condaDefaults[key])
 
 
 def setConda(key, value):
     """
     Module function to store the conda related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3449,28 +3647,22 @@
 def getPip(key):
     """
     Module function to retrieve the pip related settings.
-    
+
     @param key the key of the value to get
     @return the requested pip value
     """
     if key in ("ExcludeCondaEnvironments",):
-        return toBool(Prefs.settings.value(
-            "Pip/" + key,
-            Prefs.pipDefaults[key]))
+        return toBool(Prefs.settings.value("Pip/" + key, Prefs.pipDefaults[key]))
     elif key in ("VulnerabilityDbCacheValidity",):
-        return int(Prefs.settings.value(
-            "Pip/" + key,
-            Prefs.pipDefaults[key]))
+        return int(Prefs.settings.value("Pip/" + key, Prefs.pipDefaults[key]))
     else:
-        return Prefs.settings.value(
-            "Pip/" + key,
-            Prefs.pipDefaults[key])
+        return Prefs.settings.value("Pip/" + key, Prefs.pipDefaults[key])
 
 
 def setPip(key, value):
     """
     Module function to store the pip related settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
@@ -3480,92 +3672,95 @@
 def getMicroPython(key):
     """
     Module function to retrieve the MicroPython related settings.
-    
+
     @param key the key of the value to get
     @return the requested MicroPython value
     """
     if key in ("SerialTimeout", "ChartColorTheme"):
-        return int(Prefs.settings.value(
-            "MicroPython/" + key,
-            Prefs.microPythonDefaults[key]))
-    elif key in ["ReplLineWrap", "SyncTimeAfterConnect", "ShowHiddenLocal",
-                 "ShowHiddenDevice"]:
-        return toBool(Prefs.settings.value(
-            "MicroPython/" + key,
-            Prefs.microPythonDefaults[key]))
+        return int(
+            Prefs.settings.value("MicroPython/" + key, Prefs.microPythonDefaults[key])
+        )
+    elif key in [
+        "ReplLineWrap",
+        "SyncTimeAfterConnect",
+        "ShowHiddenLocal",
+        "ShowHiddenDevice",
+    ]:
+        return toBool(
+            Prefs.settings.value("MicroPython/" + key, Prefs.microPythonDefaults[key])
+        )
     elif key in ["IgnoredUnknownDevices", "ManualDevices"]:
         jsonStr = Prefs.settings.value(
-            "MicroPython/" + key,
-            Prefs.microPythonDefaults[key])
+            "MicroPython/" + key, Prefs.microPythonDefaults[key]
+        )
         if jsonStr:
             return json.loads(jsonStr)
         else:
             return None
     else:
         return Prefs.settings.value(
-            "MicroPython/" + key,
-            Prefs.microPythonDefaults[key])
+            "MicroPython/" + key, Prefs.microPythonDefaults[key]
+        )
 
 
 def setMicroPython(key, value):
     """
     Module function to store the MicroPython settings.
-    
+
     @param key the key of the setting to be set
     @param value the value to be set
     """
     if key in ["IgnoredUnknownDevices", "ManualDevices"]:
-        Prefs.settings.setValue(
-            "MicroPython/" + key,
-            json.dumps(value))
+        Prefs.settings.setValue("MicroPython/" + key, json.dumps(value))
     else:
-        Prefs.settings.setValue(
-            "MicroPython/" + key,
-            value)
+        Prefs.settings.setValue("MicroPython/" + key, value)
 
 
 def getJedi(key):
     """
     Function to retrieve the Jedi Assistant related settings.
-    
+
     @param key the key of the value to get
     @type str
     @return the requested jedi assistant setting
     @rtype Any
     """
-    if key in ["JediCompletionsEnabled", "JediFuzzyCompletionsEnabled",
-               "JediCalltipsEnabled", "MouseClickEnabled"]:
-        return toBool(Prefs.settings.value(
-            "AssistantJedi/" + key, Prefs.jediDefaults[key]))
+    if key in [
+        "JediCompletionsEnabled",
+        "JediFuzzyCompletionsEnabled",
+        "JediCalltipsEnabled",
+        "MouseClickEnabled",
+    ]:
+        return toBool(
+            Prefs.settings.value("AssistantJedi/" + key, Prefs.jediDefaults[key])
+        )
     else:
-        return Prefs.settings.value(
-            "AssistantJedi/" + key, Prefs.jediDefaults[key])
+        return Prefs.settings.value("AssistantJedi/" + key, Prefs.jediDefaults[key])
 
 
 def setJedi(key, value):
     """
     Public method to store the various refactoring settings.
-    
+
     @param key the key of the setting to be set
     @type str
     @param value the value to be set
     @type Any
     """
-    Prefs.settings.setValue(
-        "AssistantJedi/" + key, value)
+    Prefs.settings.setValue("AssistantJedi/" + key, value)
 
 
 def getGeometry(key):
     """
     Module function to retrieve the display geometry.
-    
+
     @param key the key of the value to get
     @return the requested geometry setting
     """
     if key in ["MainMaximized"]:
-        return toBool(Prefs.settings.value(
-            "Geometry/" + key,
-            Prefs.geometryDefaults[key]))
+        return toBool(
+            Prefs.settings.value("Geometry/" + key, Prefs.geometryDefaults[key])
+        )
     else:
         v = Prefs.settings.value("Geometry/" + key)
         if v is not None:
@@ -3577,7 +3772,7 @@
 def setGeometry(key, value):
     """
     Module function to store the display geometry.
-    
+
     @param key the key of the setting to be set
     @param value the geometry to be set
     """
@@ -3601,11 +3796,11 @@
 def shouldResetLayout():
     """
     Module function to indicate a reset of the layout.
-    
+
     @return flag indicating a reset of the layout (boolean)
     """
     return Prefs.resetLayout
-    
+
 
 def saveResetLayout():
     """
@@ -3613,15 +3808,13 @@
     """
     if Prefs.resetLayout:
         for key in list(Prefs.geometryDefaults.keys()):
-            Prefs.settings.setValue(
-                "Geometry/" + key,
-                Prefs.geometryDefaults[key])
+            Prefs.settings.setValue("Geometry/" + key, Prefs.geometryDefaults[key])
 
 
 def toBool(value):
     """
     Module function to convert a value to bool.
-    
+
     @param value value to be converted
     @return converted data
     """
@@ -3636,7 +3829,7 @@
 def toList(value):
     """
     Module function to convert a value to a list.
-    
+
     @param value value to be converted
     @return converted data
     """
@@ -3651,7 +3844,7 @@
 def toByteArray(value):
     """
     Module function to convert a value to a byte array.
-    
+
     @param value value to be converted
     @return converted data
     """
@@ -3664,7 +3857,7 @@
 def toDict(value):
     """
     Module function to convert a value to a dictionary.
-    
+
     @param value value to be converted
     @return converted data
     """
@@ -3677,41 +3870,44 @@
 def convertPasswords(oldPassword, newPassword):
     """
     Module function to convert all passwords.
-    
+
     @param oldPassword current master password (string)
     @param newPassword new master password (string)
     """
     from Utilities.crypto import pwRecode
-    for key in ["ProxyPassword/Http", "ProxyPassword/Https",
-                "ProxyPassword/Ftp", ]:
+
+    for key in [
+        "ProxyPassword/Http",
+        "ProxyPassword/Https",
+        "ProxyPassword/Ftp",
+    ]:
         Prefs.settings.setValue(
             "UI/" + key,
             pwRecode(
-                Prefs.settings.value("UI/" + key,
-                                     Prefs.uiDefaults[key]),
+                Prefs.settings.value("UI/" + key, Prefs.uiDefaults[key]),
                 oldPassword,
-                newPassword
-            )
+                newPassword,
+            ),
         )
     for key in ["MailServerPassword"]:
         Prefs.settings.setValue(
             "User/" + key,
             pwRecode(
-                Prefs.settings.value("User/" + key,
-                                     Prefs.userDefaults[key]),
+                Prefs.settings.value("User/" + key, Prefs.userDefaults[key]),
                 oldPassword,
-                newPassword
-            )
+                newPassword,
+            ),
         )
     for key in ["SyncFtpPassword", "SyncEncryptionKey"]:
         Prefs.settings.setValue(
             "WebBrowser/" + key,
             pwRecode(
-                Prefs.settings.value("WebBrowser/" + key,
-                                     Prefs.webBrowserDefaults[key]),
+                Prefs.settings.value(
+                    "WebBrowser/" + key, Prefs.webBrowserDefaults[key]
+                ),
                 oldPassword,
-                newPassword
-            )
+                newPassword,
+            ),
         )
 
 
@@ -3726,7 +3922,7 @@
 def eric6SettingsName():
     """
     Function to generate the settings file name for eric6.
-    
+
     @return settings file name
     @rtype str
     """
@@ -3737,7 +3933,7 @@
 def hasEric6Configuration():
     """
     Function to check, if there is an old eric6 configuration.
-    
+
     @return flag indicating the existence of an eric6 configuration
     @rtype bool
     """
@@ -3758,28 +3954,26 @@
         ("Editor/CallTipsPosition", QsciScintilla.CallTipsPosition),
         ("Editor/PythonBadIndentation", QsciLexerPython.IndentationWarning),
         ("Editor/EOLMode", QsciScintilla.EolMode),
-        
         ("WebBrowser/SearchLanguage", QLocale.Language),
-        
         ("RefactoringRope/MouseClickGotoModifiers", Qt.KeyboardModifier),
         ("RefactoringRope/MouseClickGotoButton", Qt.MouseButton),
     )
-    
+
     filename = eric6SettingsName()
     if filename:
         settingsFile = Prefs.settings.fileName()
         shutil.copy(filename, settingsFile)
         initPreferences()
-        
+
         # convert enum related settings
         for settingsKey, enumType in conversions:
             if Prefs.settings.contains(settingsKey):
                 Prefs.settings.setValue(
-                    settingsKey,
-                    enumType(int(Prefs.settings.value(settingsKey)))
+                    settingsKey, enumType(int(Prefs.settings.value(settingsKey)))
                 )
-        
+
         syncPreferences()
 
+
 #
 # eflag: noqa = M201, M613
--- a/src/eric7/Project/AddDirectoryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/AddDirectoryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,13 @@
     """
     Class implementing a dialog to add files of a directory to the project.
     """
-    def __init__(self, pro, fileTypeFilter='source', parent=None, name=None,
-                 startdir=None):
+
+    def __init__(
+        self, pro, fileTypeFilter="source", parent=None, name=None, startdir=None
+    ):
         """
         Constructor
-        
+
         @param pro reference to the project object
         @param fileTypeFilter file type filter (string)
         @param parent parent widget of this dialog (QWidget)
@@ -34,64 +36,51 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.sourceDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.sourceDirPicker.setDefaultDirectory(startdir)
         self.targetDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.targetDirPicker.setDefaultDirectory(startdir)
-        
+
         self.ppath = pro.ppath
         self.targetDirPicker.setText(self.ppath)
         self.on_filterComboBox_highlighted(0)
         # enable all dialog elements
-        if fileTypeFilter == 'source':  # it is a source file
-            self.filterComboBox.addItem(
-                self.tr("Source Files"), "SOURCES")
-        elif fileTypeFilter == 'form':
-            self.filterComboBox.addItem(
-                self.tr("Forms Files"), "FORMS")
-        elif fileTypeFilter == 'resource':
-            self.filterComboBox.addItem(
-                self.tr("Resource Files"), "RESOURCES")
-        elif fileTypeFilter == 'interface':
-            self.filterComboBox.addItem(
-                self.tr("Interface Files"), "INTERFACES")
-        elif fileTypeFilter == 'protocol':
-            self.filterComboBox.addItem(
-                self.tr("Protocol Files"), "PROTOCOLS")
-        elif fileTypeFilter == 'others':
-            self.filterComboBox.addItem(
-                self.tr("Other Files (*)"), "OTHERS")
-            self.on_filterComboBox_highlighted(
-                self.filterComboBox.count() - 1)
+        if fileTypeFilter == "source":  # it is a source file
+            self.filterComboBox.addItem(self.tr("Source Files"), "SOURCES")
+        elif fileTypeFilter == "form":
+            self.filterComboBox.addItem(self.tr("Forms Files"), "FORMS")
+        elif fileTypeFilter == "resource":
+            self.filterComboBox.addItem(self.tr("Resource Files"), "RESOURCES")
+        elif fileTypeFilter == "interface":
+            self.filterComboBox.addItem(self.tr("Interface Files"), "INTERFACES")
+        elif fileTypeFilter == "protocol":
+            self.filterComboBox.addItem(self.tr("Protocol Files"), "PROTOCOLS")
+        elif fileTypeFilter == "others":
+            self.filterComboBox.addItem(self.tr("Other Files (*)"), "OTHERS")
+            self.on_filterComboBox_highlighted(self.filterComboBox.count() - 1)
         else:
-            self.filterComboBox.addItem(
-                self.tr("Source Files"), "SOURCES")
-            self.filterComboBox.addItem(
-                self.tr("Forms Files"), "FORMS")
-            self.filterComboBox.addItem(
-                self.tr("Resource Files"), "RESOURCES")
-            self.filterComboBox.addItem(
-                self.tr("Interface Files"), "INTERFACES")
-            self.filterComboBox.addItem(
-                self.tr("Protocol Files"), "PROTOCOLS")
-            self.filterComboBox.addItem(
-                self.tr("Other Files (*)"), "OTHERS")
+            self.filterComboBox.addItem(self.tr("Source Files"), "SOURCES")
+            self.filterComboBox.addItem(self.tr("Forms Files"), "FORMS")
+            self.filterComboBox.addItem(self.tr("Resource Files"), "RESOURCES")
+            self.filterComboBox.addItem(self.tr("Interface Files"), "INTERFACES")
+            self.filterComboBox.addItem(self.tr("Protocol Files"), "PROTOCOLS")
+            self.filterComboBox.addItem(self.tr("Other Files (*)"), "OTHERS")
         self.filterComboBox.setCurrentIndex(0)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot(int)
     def on_filterComboBox_highlighted(self, index):
         """
         Private slot to handle the selection of a file type.
-        
+
         @param index index of the selected entry
         @type int
         """
         fileType = self.filterComboBox.itemData(index)
-        
+
         if fileType == "OTHERS":
             self.targetDirLabel.setEnabled(False)
             self.targetDirPicker.setEnabled(False)
@@ -100,34 +89,34 @@
             self.targetDirLabel.setEnabled(True)
             self.targetDirPicker.setEnabled(True)
             self.recursiveCheckBox.setEnabled(True)
-        
+
     @pyqtSlot(str)
     def on_sourceDirPicker_textChanged(self, directory):
         """
         Private slot to handle the source directory text changed.
-        
+
         If the entered source directory is a subdirectory of the current
         projects main directory, the target directory path is synchronized.
         It is assumed, that the user wants to add a bunch of files to
         the project in place.
-        
+
         @param directory the text of the source directory line edit (string)
         """
         if directory.startswith(self.ppath):
             self.targetDirPicker.setText(directory)
-        
+
     def getData(self):
         """
         Public slot to retrieve the dialogs data.
-        
+
         @return tuple of four values (string, string, string, boolean) giving
             the selected file type, the source and target directory and
             a flag indicating a recursive add
         """
-        filetype = self.filterComboBox.itemData(
-            self.filterComboBox.currentIndex())
+        filetype = self.filterComboBox.itemData(self.filterComboBox.currentIndex())
         return (
             filetype,
             self.sourceDirPicker.text(),
             self.targetDirPicker.text(),
-            self.recursiveCheckBox.isChecked())
+            self.recursiveCheckBox.isChecked(),
+        )
--- a/src/eric7/Project/AddFileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/AddFileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,11 +21,11 @@
     """
     Class implementing a dialog to add a file to the project.
     """
-    def __init__(self, pro, parent=None, fileTypeFilter=None, name=None,
-                 startdir=None):
+
+    def __init__(self, pro, parent=None, fileTypeFilter=None, name=None, startdir=None):
         """
         Constructor
-        
+
         @param pro reference to the project object
         @param parent parent widget of this dialog (QWidget)
         @param fileTypeFilter filter specification for the file to add (string)
@@ -36,24 +36,24 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.sourceFilesPicker.setMode(EricPathPickerModes.OPEN_FILES_MODE)
         self.targetDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.targetDirPicker.setDefaultDirectory(startdir)
-        
+
         self.targetDirPicker.setText(pro.ppath)
         self.fileTypeFilter = fileTypeFilter
         self.ppath = pro.ppath
         self.startdir = startdir
         self.filetypes = pro.pdata["FILETYPES"]
         # save a reference to the filetypes dict
-        
+
         if self.fileTypeFilter is not None:
             self.sourcecodeCheckBox.hide()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     @pyqtSlot()
     def on_sourceFilesPicker_aboutToShowPathPickerDialog(self):
         """
@@ -64,7 +64,7 @@
         if not path:
             path = self.startdir
         self.sourceFilesPicker.setDefaultDirectory(path)
-        
+
         if self.fileTypeFilter is None:
             patterns = {
                 "SOURCES": [],
@@ -91,77 +91,73 @@
                 " ".join(patterns["RESOURCES"]),
                 " ".join(patterns["INTERFACES"]),
                 " ".join(patterns["PROTOCOLS"]),
-                " ".join(patterns["TRANSLATIONS"])
+                " ".join(patterns["TRANSLATIONS"]),
             )
             caption = self.tr("Select Files")
-        elif self.fileTypeFilter == 'form':
+        elif self.fileTypeFilter == "form":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "FORMS":
                     patterns.append(pattern)
-            dfilter = self.tr("Forms Files ({0})").format(
-                " ".join(patterns))
+            dfilter = self.tr("Forms Files ({0})").format(" ".join(patterns))
             caption = self.tr("Select user-interface files")
         elif self.fileTypeFilter == "resource":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "RESOURCES":
                     patterns.append(pattern)
-            dfilter = self.tr("Resource Files ({0})").format(
-                " ".join(patterns))
+            dfilter = self.tr("Resource Files ({0})").format(" ".join(patterns))
             caption = self.tr("Select resource files")
-        elif self.fileTypeFilter == 'source':
+        elif self.fileTypeFilter == "source":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "SOURCES":
                     patterns.append(pattern)
             dfilter = self.tr("Source Files ({0});;All Files (*)").format(
-                " ".join(patterns))
+                " ".join(patterns)
+            )
             caption = self.tr("Select source files")
-        elif self.fileTypeFilter == 'interface':
+        elif self.fileTypeFilter == "interface":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "INTERFACES":
                     patterns.append(pattern)
-            dfilter = self.tr("Interface Files ({0})").format(
-                " ".join(patterns))
+            dfilter = self.tr("Interface Files ({0})").format(" ".join(patterns))
             caption = self.tr("Select interface files")
-        elif self.fileTypeFilter == 'protocol':
+        elif self.fileTypeFilter == "protocol":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "PROTOCOLS":
                     patterns.append(pattern)
-            dfilter = self.tr("Protocol Files ({0})").format(
-                " ".join(patterns))
+            dfilter = self.tr("Protocol Files ({0})").format(" ".join(patterns))
             caption = self.tr("Select protocol files")
-        elif self.fileTypeFilter == 'translation':
+        elif self.fileTypeFilter == "translation":
             patterns = []
             for pattern, filetype in list(self.filetypes.items()):
                 if filetype == "TRANSLATIONS":
                     patterns.append(pattern)
-            dfilter = self.tr("Translation Files ({0})").format(
-                " ".join(patterns))
+            dfilter = self.tr("Translation Files ({0})").format(" ".join(patterns))
             caption = self.tr("Select translation files")
-        elif self.fileTypeFilter == 'others':
+        elif self.fileTypeFilter == "others":
             dfilter = self.tr("All Files (*)")
             caption = self.tr("Select files")
         else:
             dfilter = ""
             caption = ""
-        
+
         self.sourceFilesPicker.setWindowTitle(caption)
         self.sourceFilesPicker.setFilters(dfilter)
-        
+
     @pyqtSlot(str)
     def on_sourceFilesPicker_textChanged(self, sfile):
         """
         Private slot to handle the source file text changed.
-        
+
         If the entered source directory is a subdirectory of the current
         projects main directory, the target directory path is synchronized.
         It is assumed, that the user wants to add a bunch of files to
         the project in place.
-        
+
         @param sfile the text of the source file picker (string)
         """
         sfile = self.sourceFilesPicker.firstPath()
@@ -171,11 +167,11 @@
             else:
                 directory = os.path.dirname(sfile)
             self.targetDirPicker.setText(directory)
-        
+
     def getData(self):
         """
         Public slot to retrieve the dialogs data.
-        
+
         @return tuple of three values (list of string, string, boolean)
             giving the source files, the target directory and a flag
             telling, whether the files shall be added as source code
@@ -183,4 +179,5 @@
         return (
             self.sourceFilesPicker.paths(),
             self.targetDirPicker.text(),
-            self.sourcecodeCheckBox.isChecked())
+            self.sourcecodeCheckBox.isChecked(),
+        )
--- a/src/eric7/Project/AddFoundFilesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/AddFoundFilesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,15 +16,16 @@
 class AddFoundFilesDialog(QDialog, Ui_AddFoundFilesDialog):
     """
     Class implementing a dialog to show the found files to the user.
-    
+
     The found files are displayed in a listview. Pressing the 'Add All' button
     adds all files to the current project, the 'Add Selected' button adds only
     the selected files and the 'Cancel' button cancels the operation.
     """
+
     def __init__(self, files, parent=None, name=None):
         """
         Constructor
-        
+
         @param files list of files, that have been found for addition
             (list of strings)
         @param parent parent widget of this dialog (QWidget)
@@ -34,50 +35,51 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.addAllButton = self.buttonBox.addButton(
-            self.tr("Add All"), QDialogButtonBox.ButtonRole.AcceptRole)
+            self.tr("Add All"), QDialogButtonBox.ButtonRole.AcceptRole
+        )
         self.addAllButton.setToolTip(self.tr("Add all files."))
         self.addSelectedButton = self.buttonBox.addButton(
-            self.tr("Add Selected"), QDialogButtonBox.ButtonRole.AcceptRole)
-        self.addSelectedButton.setToolTip(
-            self.tr("Add selected files only."))
-        
+            self.tr("Add Selected"), QDialogButtonBox.ButtonRole.AcceptRole
+        )
+        self.addSelectedButton.setToolTip(self.tr("Add selected files only."))
+
         self.fileList.addItems(files)
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.addAllButton:
             self.on_addAllButton_clicked()
         elif button == self.addSelectedButton:
             self.on_addSelectedButton_clicked()
-        
+
     @pyqtSlot()
     def on_addAllButton_clicked(self):
         """
         Private slot to handle the 'Add All' button press.
-        
+
         Always returns the value 1 (integer).
         """
         self.done(1)
-        
+
     @pyqtSlot()
     def on_addSelectedButton_clicked(self):
         """
         Private slot to handle the 'Add Selected' button press.
-        
+
         Always returns the value 2 (integer).
         """
         self.done(2)
-        
+
     def getSelection(self):
         """
         Public method to return the selected items.
-        
+
         @return list of selected files (list of strings)
         """
         list_ = []
--- a/src/eric7/Project/AddLanguageDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/AddLanguageDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to add a new language to the project.
     """
+
     def __init__(self, parent=None, name=None):
         """
         Constructor
-        
+
         @param parent parent widget of this dialog (QWidget)
         @param name name of this dialog (string)
         """
@@ -27,14 +28,14 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getSelectedLanguage(self):
         """
         Public method to retrieve the selected language.
-        
+
         @return the selected language (string)
         """
         return self.languageCombo.currentText()
--- a/src/eric7/Project/CreateDialogCodeDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/CreateDialogCodeDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,13 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    pyqtSlot, Qt, QMetaObject, QRegularExpression, QSortFilterProxyModel,
-    QProcess, QProcessEnvironment
+    pyqtSlot,
+    Qt,
+    QMetaObject,
+    QRegularExpression,
+    QSortFilterProxyModel,
+    QProcess,
+    QProcessEnvironment,
 )
 from PyQt6.QtGui import QStandardItemModel, QStandardItem, QBrush, QColor
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
@@ -43,75 +48,88 @@
     """
     Class implementing a dialog to generate code for a Qt5 dialog.
     """
+
     DialogClasses = {
-        "QDialog", "QWidget", "QMainWindow", "QWizard", "QWizardPage",
-        "QDockWidget", "QFrame", "QGroupBox", "QScrollArea", "QMdiArea",
-        "QTabWidget", "QToolBox", "QStackedWidget"
+        "QDialog",
+        "QWidget",
+        "QMainWindow",
+        "QWizard",
+        "QWizardPage",
+        "QDockWidget",
+        "QFrame",
+        "QGroupBox",
+        "QScrollArea",
+        "QMdiArea",
+        "QTabWidget",
+        "QToolBox",
+        "QStackedWidget",
     }
     Separator = 25 * "="
-    
+
     def __init__(self, formName, project, parent=None):
         """
         Constructor
-        
+
         @param formName name of the file containing the form (string)
         @param project reference to the project object
         @param parent parent widget if the dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         self.slotsView.header().hide()
-        
+
         self.project = project
-        
+
         self.formFile = formName
         filename, ext = os.path.splitext(self.formFile)
-        self.srcFile = '{0}{1}'.format(
-            filename, self.project.getDefaultSourceExtension())
-        
+        self.srcFile = "{0}{1}".format(
+            filename, self.project.getDefaultSourceExtension()
+        )
+
         self.slotsModel = QStandardItemModel()
         self.proxyModel = QSortFilterProxyModel()
         self.proxyModel.setDynamicSortFilter(True)
         self.proxyModel.setSourceModel(self.slotsModel)
         self.slotsView.setModel(self.proxyModel)
-        
+
         # initialize some member variables
         self.__initError = False
         self.__module = None
-        
+
         packagesRoot = self.project.getUicParameter("PackagesRoot")
         if packagesRoot:
-            self.packagesPath = os.path.join(self.project.getProjectPath(),
-                                             packagesRoot)
+            self.packagesPath = os.path.join(
+                self.project.getProjectPath(), packagesRoot
+            )
         else:
             self.packagesPath = self.project.getProjectPath()
-        
+
         if os.path.exists(self.srcFile):
             vm = ericApp().getObject("ViewManager")
             ed = vm.getOpenEditor(self.srcFile)
             if ed and not vm.checkDirty(ed):
                 self.__initError = True
                 return
-            
+
             with contextlib.suppress(ImportError):
                 splitExt = os.path.splitext(self.srcFile)
                 exts = [splitExt[1]] if len(splitExt) == 2 else None
                 from Utilities import ModuleParser
+
                 self.__module = ModuleParser.readModule(
-                    self.srcFile, extensions=exts, caching=False)
-        
+                    self.srcFile, extensions=exts, caching=False
+                )
+
         if self.__module is not None:
             self.filenameEdit.setText(self.srcFile)
-            
+
             classesList = []
             vagueClassesList = []
             for cls in list(self.__module.classes.values()):
-                if not set(cls.super).isdisjoint(
-                        CreateDialogCodeDialog.DialogClasses):
+                if not set(cls.super).isdisjoint(CreateDialogCodeDialog.DialogClasses):
                     classesList.append(cls.name)
                 else:
                     vagueClassesList.append(cls.name)
@@ -119,14 +137,13 @@
             self.classNameCombo.addItems(classesList)
             if vagueClassesList:
                 if classesList:
-                    self.classNameCombo.addItem(
-                        CreateDialogCodeDialog.Separator)
+                    self.classNameCombo.addItem(CreateDialogCodeDialog.Separator)
                 self.classNameCombo.addItems(sorted(vagueClassesList))
-        
+
         if (
-            os.path.exists(self.srcFile) and
-            self.__module is not None and
-            self.classNameCombo.count() == 0
+            os.path.exists(self.srcFile)
+            and self.__module is not None
+            and self.classNameCombo.count() == 0
         ):
             self.__initError = True
             EricMessageBox.critical(
@@ -134,25 +151,27 @@
                 self.tr("Create Dialog Code"),
                 self.tr(
                     """The file <b>{0}</b> exists but does not contain"""
-                    """ any classes.""").format(self.srcFile))
-        
+                    """ any classes."""
+                ).format(self.srcFile),
+            )
+
         self.okButton.setEnabled(self.classNameCombo.count() > 0)
-        
+
         self.__updateSlotsModel()
-        
+
     def initError(self):
         """
         Public method to determine, if there was an initialzation error.
-        
+
         @return flag indicating an initialzation error (boolean)
         """
         return self.__initError
-    
+
     def __runUicLoadUi(self, command):
         """
         Private method to run the UicLoadUi.py script with the given command
         and return the output.
-        
+
         @param command uic command to be run
         @type str
         @return tuple of process output and error flag
@@ -160,7 +179,7 @@
         """
         venvManager = ericApp().getObject("VirtualEnvManager")
         projectType = self.project.getProjectType()
-        
+
         venvName = self.project.getProjectVenv(resolveDebugger=False)
         if not venvName:
             # no project specific environment, try a type specific one
@@ -170,19 +189,17 @@
                 venvName = Preferences.getQt("PyQt6VenvName")
         interpreter = venvManager.getVirtualenvInterpreter(venvName)
         execPath = venvManager.getVirtualenvExecPath(venvName)
-        
+
         if not interpreter:
             interpreter = Globals.getPythonExecutable()
-        
+
         env = QProcessEnvironment.systemEnvironment()
         if execPath:
             if env.contains("PATH"):
-                env.insert(
-                    "PATH", os.pathsep.join([execPath, env.value("PATH")])
-                )
+                env.insert("PATH", os.pathsep.join([execPath, env.value("PATH")]))
             else:
                 env.insert("PATH", execPath)
-        
+
         if projectType in ("PyQt5", "PySide2"):
             loadUi = os.path.join(os.path.dirname(__file__), "UicLoadUi5.py")
         elif projectType in ("PyQt6", "E7Plugin", "PySide6"):
@@ -193,10 +210,10 @@
             self.formFile,
             self.packagesPath,
         ]
-        
+
         uicText = ""
         ok = False
-        
+
         proc = QProcess()
         proc.setWorkingDirectory(self.packagesPath)
         proc.setProcessEnvironment(env)
@@ -215,8 +232,8 @@
                     self.tr("uic error"),
                     self.tr(
                         """<p>There was an error loading the form <b>{0}</b>"""
-                        """.</p><p>{1}</p>""").format(
-                        self.formFile, outText)
+                        """.</p><p>{1}</p>"""
+                    ).format(self.formFile, outText),
                 )
         else:
             EricMessageBox.critical(
@@ -225,50 +242,51 @@
                 self.tr(
                     """<p>The project specific Python interpreter <b>{0}</b>"""
                     """ could not be started or did not finish within 30"""
-                    """ seconds.</p>""").format(interpreter)
+                    """ seconds.</p>"""
+                ).format(interpreter),
             )
-        
+
         return uicText, ok
-    
+
     def __objectName(self):
         """
         Private method to get the object name of a form.
-        
+
         @return object name
         @rtype str
         """
         objectName = ""
-        
+
         output, ok = self.__runUicLoadUi("object_name")
         if ok and output:
             objectName = output
-        
+
         return objectName
-    
+
     def __className(self):
         """
         Private method to get the class name of a form.
-        
+
         @return class name
         @rtype str
         """
         className = ""
-        
+
         output, ok = self.__runUicLoadUi("class_name")
         if ok and output:
             className = output
-        
+
         return className
-    
+
     def __signatures(self):
         """
         Private slot to get the signatures.
-        
+
         @return list of signatures (list of strings)
         """
         if self.__module is None:
             return []
-            
+
         signatures = []
         clsName = self.classNameCombo.currentText()
         if clsName:
@@ -277,68 +295,66 @@
                 if meth.name.startswith("on_"):
                     if meth.pyqtSignature is not None:
                         sig = ", ".join(
-                            [bytes(QMetaObject.normalizedType(t)).decode()
-                             for t in meth.pyqtSignature.split(",")])
+                            [
+                                bytes(QMetaObject.normalizedType(t)).decode()
+                                for t in meth.pyqtSignature.split(",")
+                            ]
+                        )
                         signatures.append("{0}({1})".format(meth.name, sig))
                     else:
                         signatures.append(meth.name)
         return signatures
-        
+
     def __mapType(self, type_):
         """
         Private method to map a type as reported by Qt's meta object to the
         correct Python type.
-        
+
         @param type_ type as reported by Qt (QByteArray)
         @return mapped Python type (string)
         """
         mapped = bytes(type_).decode()
-        
+
         # I. always check for *
         mapped = mapped.replace("*", "")
-        
+
         # 1. check for const
         mapped = mapped.replace("const ", "")
-        
+
         # 2. replace QString and QStringList
-        mapped = (
-            mapped
-            .replace("QStringList", "list")
-            .replace("QString", "str")
-        )
-        
+        mapped = mapped.replace("QStringList", "list").replace("QString", "str")
+
         # 3. replace double by float
         mapped = mapped.replace("double", "float")
-        
+
         return mapped
-    
+
     def __updateSlotsModel(self):
         """
         Private slot to update the slots tree display.
         """
         self.filterEdit.clear()
-        
+
         output, ok = self.__runUicLoadUi("signatures")
         if ok and output:
             objectsList = json.loads(output.strip())
-            
+
             signatureList = self.__signatures()
-            
+
             self.slotsModel.clear()
             self.slotsModel.setHorizontalHeaderLabels([""])
             for objectDict in objectsList:
-                itm = QStandardItem("{0} ({1})".format(
-                    objectDict["name"],
-                    objectDict["class_name"]))
+                itm = QStandardItem(
+                    "{0} ({1})".format(objectDict["name"], objectDict["class_name"])
+                )
                 self.slotsModel.appendRow(itm)
                 for methodDict in objectDict["methods"]:
                     itm2 = QStandardItem(methodDict["signature"])
                     itm.appendRow(itm2)
-                    
-                    if (
-                        self.__module is not None and
-                        (methodDict["methods"][0] in signatureList or
-                         methodDict["methods"][1] in signatureList)
+
+                    if self.__module is not None and (
+                        methodDict["methods"][0] in signatureList
+                        or methodDict["methods"][1] in signatureList
                     ):
                         itm2.setFlags(Qt.ItemFlag.ItemIsEnabled)
                         itm2.setCheckState(Qt.CheckState.Checked)
@@ -347,41 +363,36 @@
                         else:
                             itm2.setForeground(QBrush(Qt.GlobalColor.blue))
                         continue
-            
-                    itm2.setData(methodDict["pyqt_signature"],
-                                 pyqtSignatureRole)
-                    itm2.setData(methodDict["python_signature"],
-                                 pythonSignatureRole)
-                    itm2.setData(methodDict["return_type"],
-                                 returnTypeRole)
-                    itm2.setData(methodDict["parameter_types"],
-                                 parameterTypesListRole)
-                    itm2.setData(methodDict["parameter_names"],
-                                 parameterNamesListRole)
-                    
+
+                    itm2.setData(methodDict["pyqt_signature"], pyqtSignatureRole)
+                    itm2.setData(methodDict["python_signature"], pythonSignatureRole)
+                    itm2.setData(methodDict["return_type"], returnTypeRole)
+                    itm2.setData(methodDict["parameter_types"], parameterTypesListRole)
+                    itm2.setData(methodDict["parameter_names"], parameterNamesListRole)
+
                     itm2.setFlags(
-                        Qt.ItemFlag.ItemIsUserCheckable |
-                        Qt.ItemFlag.ItemIsEnabled |
-                        Qt.ItemFlag.ItemIsSelectable
+                        Qt.ItemFlag.ItemIsUserCheckable
+                        | Qt.ItemFlag.ItemIsEnabled
+                        | Qt.ItemFlag.ItemIsSelectable
                     )
                     itm2.setCheckState(Qt.CheckState.Unchecked)
-            
+
             self.slotsView.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
     def __generateCode(self):
         """
         Private slot to generate the code as requested by the user.
         """
         if (
-            self.filenameEdit.text().endswith(".rb") or
-            self.project.getProjectLanguage() == "Ruby"
+            self.filenameEdit.text().endswith(".rb")
+            or self.project.getProjectLanguage() == "Ruby"
         ):
             # Ruby code generation is not supported
             pass
         else:
             # assume Python (our global default)
             self.__generatePythonCode()
-        
+
     def __generatePythonCode(self):
         """
         Private slot to generate Python code as requested by the user.
@@ -392,47 +403,47 @@
                 self.tr("Code Generation"),
                 self.tr(
                     """<p>Code generation for project language"""
-                    """ "{0}" is not supported.</p>""")
-                .format(self.project.getProjectLanguage()))
+                    """ "{0}" is not supported.</p>"""
+                ).format(self.project.getProjectLanguage()),
+            )
             return
-        
+
         # init some variables
         sourceImpl = []
         appendAtIndex = -1
         indentStr = "    "
         slotsCode = []
-        
+
         if self.__module is None:
             # new file
             try:
                 if self.project.getProjectType() == "PySide2":
                     tmplName = os.path.join(
-                        getConfig('ericCodeTemplatesDir'),
-                        "impl_pyside2.py.tmpl")
+                        getConfig("ericCodeTemplatesDir"), "impl_pyside2.py.tmpl"
+                    )
                 elif self.project.getProjectType() == "PySide6":
                     tmplName = os.path.join(
-                        getConfig('ericCodeTemplatesDir'),
-                        "impl_pyside6.py.tmpl")
+                        getConfig("ericCodeTemplatesDir"), "impl_pyside6.py.tmpl"
+                    )
                 elif self.project.getProjectType() == "PyQt5":
                     tmplName = os.path.join(
-                        getConfig('ericCodeTemplatesDir'),
-                        "impl_pyqt5.py.tmpl")
-                elif self.project.getProjectType() in [
-                    "PyQt6", "E7Plugin"
-                ]:
+                        getConfig("ericCodeTemplatesDir"), "impl_pyqt5.py.tmpl"
+                    )
+                elif self.project.getProjectType() in ["PyQt6", "E7Plugin"]:
                     tmplName = os.path.join(
-                        getConfig('ericCodeTemplatesDir'),
-                        "impl_pyqt6.py.tmpl")
+                        getConfig("ericCodeTemplatesDir"), "impl_pyqt6.py.tmpl"
+                    )
                 else:
                     EricMessageBox.critical(
                         self,
                         self.tr("Code Generation"),
                         self.tr(
                             """<p>No code template file available for"""
-                            """ project type "{0}".</p>""")
-                        .format(self.project.getProjectType()))
+                            """ project type "{0}".</p>"""
+                        ).format(self.project.getProjectType()),
+                    )
                     return
-                with open(tmplName, 'r', encoding="utf-8") as tmplFile:
+                with open(tmplName, "r", encoding="utf-8") as tmplFile:
                     template = tmplFile.read()
             except OSError as why:
                 EricMessageBox.critical(
@@ -440,25 +451,26 @@
                     self.tr("Code Generation"),
                     self.tr(
                         """<p>Could not open the code template file"""
-                        """ "{0}".</p><p>Reason: {1}</p>""")
-                    .format(tmplName, str(why)))
+                        """ "{0}".</p><p>Reason: {1}</p>"""
+                    ).format(tmplName, str(why)),
+                )
                 return
-            
+
             objName = self.__objectName()
             if objName:
                 template = (
-                    template
-                    .replace(
+                    template.replace(
                         "$FORMFILE$",
-                        os.path.splitext(os.path.basename(self.formFile))[0])
+                        os.path.splitext(os.path.basename(self.formFile))[0],
+                    )
                     .replace("$FORMCLASS$", objName)
                     .replace("$CLASSNAME$", self.classNameCombo.currentText())
                     .replace("$SUPERCLASS$", self.__className())
                 )
-                
+
                 sourceImpl = template.splitlines(True)
                 appendAtIndex = -1
-                
+
                 # determine indent string
                 for line in sourceImpl:
                     if line.lstrip().startswith("def __init__"):
@@ -467,7 +479,7 @@
         else:
             # extend existing file
             try:
-                with open(self.srcFile, 'r', encoding="utf-8") as srcFile:
+                with open(self.srcFile, "r", encoding="utf-8") as srcFile:
                     sourceImpl = srcFile.readlines()
                 if not sourceImpl[-1].endswith("\n"):
                     sourceImpl[-1] = "{0}{1}".format(sourceImpl[-1], "\n")
@@ -477,10 +489,11 @@
                     self.tr("Code Generation"),
                     self.tr(
                         """<p>Could not open the source file "{0}".</p>"""
-                        """<p>Reason: {1}</p>""")
-                    .format(self.srcFile, str(why)))
+                        """<p>Reason: {1}</p>"""
+                    ).format(self.srcFile, str(why)),
+                )
                 return
-            
+
             cls = self.__module.classes[self.classNameCombo.currentText()]
             if cls.endlineno == len(sourceImpl) or cls.endlineno == -1:
                 appendAtIndex = -1
@@ -492,98 +505,108 @@
                 while not sourceImpl[appendAtIndex].strip():
                     appendAtIndex -= 1
                 appendAtIndex += 1
-            
+
             # determine indent string
-            for line in sourceImpl[cls.lineno:cls.endlineno + 1]:
+            for line in sourceImpl[cls.lineno : cls.endlineno + 1]:
                 if line.lstrip().startswith("def __init__"):
                     indentStr = line.replace(line.lstrip(), "")
                     break
-        
+
         # do the coding stuff
         pyqtSignatureFormat = (
-            '@Slot({0})'
-            if self.project.getProjectType() in ("PySide2", "PySide6") else
-            '@pyqtSlot({0})'
+            "@Slot({0})"
+            if self.project.getProjectType() in ("PySide2", "PySide6")
+            else "@pyqtSlot({0})"
         )
         for row in range(self.slotsModel.rowCount()):
             topItem = self.slotsModel.item(row)
             for childRow in range(topItem.rowCount()):
                 child = topItem.child(childRow)
-                if (
-                    child.checkState() == Qt.CheckState.Checked and
-                    (child.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                     Qt.ItemFlag.ItemIsUserCheckable)
+                if child.checkState() == Qt.CheckState.Checked and (
+                    child.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                    == Qt.ItemFlag.ItemIsUserCheckable
                 ):
-                    slotsCode.append('{0}\n'.format(indentStr))
-                    slotsCode.append('{0}{1}\n'.format(
-                        indentStr,
-                        pyqtSignatureFormat.format(
-                            child.data(pyqtSignatureRole))))
-                    slotsCode.append('{0}def {1}:\n'.format(
-                        indentStr, child.data(pythonSignatureRole)))
+                    slotsCode.append("{0}\n".format(indentStr))
+                    slotsCode.append(
+                        "{0}{1}\n".format(
+                            indentStr,
+                            pyqtSignatureFormat.format(child.data(pyqtSignatureRole)),
+                        )
+                    )
+                    slotsCode.append(
+                        "{0}def {1}:\n".format(
+                            indentStr, child.data(pythonSignatureRole)
+                        )
+                    )
                     indentStr2 = indentStr * 2
                     slotsCode.append('{0}"""\n'.format(indentStr2))
                     slotsCode.append(
-                        '{0}Slot documentation goes here.\n'.format(
-                            indentStr2))
-                    if (
-                        child.data(returnTypeRole) or
-                        child.data(parameterTypesListRole)
-                    ):
-                        slotsCode.append('{0}\n'.format(indentStr2))
+                        "{0}Slot documentation goes here.\n".format(indentStr2)
+                    )
+                    if child.data(returnTypeRole) or child.data(parameterTypesListRole):
+                        slotsCode.append("{0}\n".format(indentStr2))
                         if child.data(parameterTypesListRole):
                             for name, type_ in zip(
                                 child.data(parameterNamesListRole),
-                                    child.data(parameterTypesListRole)):
+                                child.data(parameterTypesListRole),
+                            ):
                                 slotsCode.append(
-                                    '{0}@param {1} DESCRIPTION\n'.format(
-                                        indentStr2, name))
-                                slotsCode.append('{0}@type {1}\n'.format(
-                                    indentStr2, type_))
+                                    "{0}@param {1} DESCRIPTION\n".format(
+                                        indentStr2, name
+                                    )
+                                )
+                                slotsCode.append(
+                                    "{0}@type {1}\n".format(indentStr2, type_)
+                                )
                         if child.data(returnTypeRole):
                             slotsCode.append(
-                                '{0}@returns DESCRIPTION\n'.format(
-                                    indentStr2))
-                            slotsCode.append('{0}@rtype {1}\n'.format(
-                                indentStr2, child.data(returnTypeRole)))
+                                "{0}@returns DESCRIPTION\n".format(indentStr2)
+                            )
+                            slotsCode.append(
+                                "{0}@rtype {1}\n".format(
+                                    indentStr2, child.data(returnTypeRole)
+                                )
+                            )
                     slotsCode.append('{0}"""\n'.format(indentStr2))
-                    slotsCode.append('{0}# {1}: not implemented yet\n'.format(
-                        indentStr2, "TODO"))
-                    slotsCode.append('{0}raise NotImplementedError\n'.format(
-                        indentStr2))
-        
+                    slotsCode.append(
+                        "{0}# {1}: not implemented yet\n".format(indentStr2, "TODO")
+                    )
+                    slotsCode.append(
+                        "{0}raise NotImplementedError\n".format(indentStr2)
+                    )
+
         if appendAtIndex == -1:
             sourceImpl.extend(slotsCode)
         else:
             sourceImpl[appendAtIndex:appendAtIndex] = slotsCode
-        
+
         # write the new code
-        newline = (None if self.project.useSystemEol()
-                   else self.project.getEolString())
+        newline = None if self.project.useSystemEol() else self.project.getEolString()
         fn = self.filenameEdit.text()
         try:
-            with open(fn, 'w', encoding="utf-8", newline=newline) as srcFile:
+            with open(fn, "w", encoding="utf-8", newline=newline) as srcFile:
                 srcFile.write("".join(sourceImpl))
         except OSError as why:
             EricMessageBox.critical(
                 self,
                 self.tr("Code Generation"),
-                self.tr("""<p>Could not write the source file "{0}".</p>"""
-                        """<p>Reason: {1}</p>""")
-                .format(fn, str(why)))
+                self.tr(
+                    """<p>Could not write the source file "{0}".</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(fn, str(why)),
+            )
             return
-        
+
         self.project.appendFile(fn)
-        
+
     @pyqtSlot(int)
     def on_classNameCombo_activated(self, index):
         """
         Private slot to handle the activated signal of the classname combo.
-        
+
         @param index index of the activated item (integer)
         """
-        if (self.classNameCombo.currentText() ==
-                CreateDialogCodeDialog.Separator):
+        if self.classNameCombo.currentText() == CreateDialogCodeDialog.Separator:
             self.okButton.setEnabled(False)
             self.filterEdit.clear()
             self.slotsModel.clear()
@@ -591,18 +614,18 @@
         else:
             self.okButton.setEnabled(True)
             self.__updateSlotsModel()
-        
+
     def on_filterEdit_textChanged(self, text):
         """
         Private slot called, when thext of the filter edit has changed.
-        
+
         @param text changed text (string)
         """
         rx = QRegularExpression(
-            text,
-            QRegularExpression.PatternOption.CaseInsensitiveOption)
+            text, QRegularExpression.PatternOption.CaseInsensitiveOption
+        )
         self.proxyModel.setFilterRegularExpression(rx)
-        
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
@@ -614,19 +637,19 @@
             dlg = NewDialogClassDialog(objName, file, path, self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 className, fileName = dlg.getData()
-                
+
                 self.classNameCombo.clear()
                 self.classNameCombo.addItem(className)
                 self.srcFile = fileName
                 self.filenameEdit.setText(self.srcFile)
                 self.__module = None
-            
+
             self.okButton.setEnabled(self.classNameCombo.count() > 0)
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the buttonBox clicked signal.
-        
+
         @param button reference to the button that was clicked
             (QAbstractButton)
         """
--- a/src/eric7/Project/DebuggerPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/DebuggerPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,10 +30,11 @@
     Class implementing a dialog for entering project specific debugger
     settings.
     """
+
     def __init__(self, project, parent=None, name=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this dialog (QWidget)
         @param name name of this dialog (string)
@@ -42,31 +43,30 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
-        debugClientsHistory = Preferences.getProject(
-            "DebugClientsHistory")
+
+        debugClientsHistory = Preferences.getProject("DebugClientsHistory")
         self.debugClientPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.debugClientPicker.setInsertPolicy(
-            QComboBox.InsertPolicy.InsertAtTop)
+        self.debugClientPicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.debugClientPicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
         self.debugClientPicker.setPathsList(debugClientsHistory)
-        self.debugClientClearHistoryButton.setIcon(
-            UI.PixmapCache.getIcon("editDelete"))
-        
+        self.debugClientClearHistoryButton.setIcon(UI.PixmapCache.getIcon("editDelete"))
+
         venvManager = ericApp().getObject("VirtualEnvManager")
-        
+
         self.venvComboBox.addItem("")
         self.venvComboBox.addItems(sorted(venvManager.getVirtualenvNames()))
-        
-        self.translationLocalCompleter = EricDirCompleter(
-            self.translationLocalEdit)
-        
+
+        self.translationLocalCompleter = EricDirCompleter(self.translationLocalEdit)
+
         self.project = project
-        
+
         if self.project.debugProperties["VIRTUALENV"]:
-            venvIndex = max(0, self.venvComboBox.findText(
-                self.project.debugProperties["VIRTUALENV"]))
+            venvIndex = max(
+                0,
+                self.venvComboBox.findText(self.project.debugProperties["VIRTUALENV"]),
+            )
         else:
             if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
@@ -81,41 +81,39 @@
         self.venvComboBox.setCurrentIndex(venvIndex)
         if self.project.debugProperties["DEBUGCLIENT"]:
             self.debugClientPicker.setText(
-                self.project.debugProperties["DEBUGCLIENT"],
-                toNative=False)
+                self.project.debugProperties["DEBUGCLIENT"], toNative=False
+            )
         else:
             if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
-                    getConfig('ericDir'),
-                    "DebugClients", "Python", "DebugClient.py")
+                    getConfig("ericDir"), "DebugClients", "Python", "DebugClient.py"
+                )
             else:
                 debugClient = ""
             self.debugClientPicker.setText(debugClient, toNative=False)
         self.debugEnvironmentOverrideCheckBox.setChecked(
-            self.project.debugProperties["ENVIRONMENTOVERRIDE"])
+            self.project.debugProperties["ENVIRONMENTOVERRIDE"]
+        )
         self.debugEnvironmentEdit.setText(
-            self.project.debugProperties["ENVIRONMENTSTRING"])
+            self.project.debugProperties["ENVIRONMENTSTRING"]
+        )
         self.remoteDebuggerGroup.setChecked(
-            self.project.debugProperties["REMOTEDEBUGGER"])
-        self.remoteHostEdit.setText(
-            self.project.debugProperties["REMOTEHOST"])
-        self.remoteCommandEdit.setText(
-            self.project.debugProperties["REMOTECOMMAND"])
+            self.project.debugProperties["REMOTEDEBUGGER"]
+        )
+        self.remoteHostEdit.setText(self.project.debugProperties["REMOTEHOST"])
+        self.remoteCommandEdit.setText(self.project.debugProperties["REMOTECOMMAND"])
         self.pathTranslationGroup.setChecked(
-            self.project.debugProperties["PATHTRANSLATION"])
-        self.translationRemoteEdit.setText(
-            self.project.debugProperties["REMOTEPATH"])
-        self.translationLocalEdit.setText(
-            self.project.debugProperties["LOCALPATH"])
+            self.project.debugProperties["PATHTRANSLATION"]
+        )
+        self.translationRemoteEdit.setText(self.project.debugProperties["REMOTEPATH"])
+        self.translationLocalEdit.setText(self.project.debugProperties["LOCALPATH"])
         self.consoleDebuggerGroup.setChecked(
-            self.project.debugProperties["CONSOLEDEBUGGER"])
-        self.consoleCommandEdit.setText(
-            self.project.debugProperties["CONSOLECOMMAND"])
-        self.redirectCheckBox.setChecked(
-            self.project.debugProperties["REDIRECT"])
-        self.noEncodingCheckBox.setChecked(
-            self.project.debugProperties["NOENCODING"])
-        
+            self.project.debugProperties["CONSOLEDEBUGGER"]
+        )
+        self.consoleCommandEdit.setText(self.project.debugProperties["CONSOLECOMMAND"])
+        self.redirectCheckBox.setChecked(self.project.debugProperties["REDIRECT"])
+        self.noEncodingCheckBox.setChecked(self.project.debugProperties["NOENCODING"])
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
 
@@ -125,8 +123,7 @@
         Private slot to perform actions before the debug client selection
         dialog is shown.
         """
-        filters = self.project.getDebuggerFilters(
-            self.project.pdata["PROGLANGUAGE"])
+        filters = self.project.getDebuggerFilters(self.project.pdata["PROGLANGUAGE"])
         filters += self.tr("All Files (*)")
         self.debugClientPicker.setFilters(filters)
 
@@ -134,63 +131,47 @@
         """
         Public method to store the entered/modified data.
         """
-        self.project.debugProperties["VIRTUALENV"] = (
-            self.venvComboBox.currentText()
-        )
-        
-        self.project.debugProperties["DEBUGCLIENT"] = (
-            self.debugClientPicker.text(toNative=False)
+        self.project.debugProperties["VIRTUALENV"] = self.venvComboBox.currentText()
+
+        self.project.debugProperties["DEBUGCLIENT"] = self.debugClientPicker.text(
+            toNative=False
         )
         if not self.project.debugProperties["DEBUGCLIENT"]:
             if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
-                    getConfig('ericDir'),
-                    "DebugClients", "Python", "DebugClient.py")
+                    getConfig("ericDir"), "DebugClients", "Python", "DebugClient.py"
+                )
             else:
                 debugClient = ""
             self.project.debugProperties["DEBUGCLIENT"] = debugClient
-        
-        self.project.debugProperties["ENVIRONMENTOVERRIDE"] = (
-            self.debugEnvironmentOverrideCheckBox.isChecked()
-        )
-        self.project.debugProperties["ENVIRONMENTSTRING"] = (
-            self.debugEnvironmentEdit.text()
-        )
-        self.project.debugProperties["REMOTEDEBUGGER"] = (
-            self.remoteDebuggerGroup.isChecked()
-        )
-        self.project.debugProperties["REMOTEHOST"] = (
-            self.remoteHostEdit.text()
-        )
-        self.project.debugProperties["REMOTECOMMAND"] = (
-            self.remoteCommandEdit.text()
-        )
-        self.project.debugProperties["PATHTRANSLATION"] = (
-            self.pathTranslationGroup.isChecked()
-        )
-        self.project.debugProperties["REMOTEPATH"] = (
-            self.translationRemoteEdit.text()
-        )
-        self.project.debugProperties["LOCALPATH"] = (
-            self.translationLocalEdit.text()
-        )
-        self.project.debugProperties["CONSOLEDEBUGGER"] = (
-            self.consoleDebuggerGroup.isChecked()
-        )
-        self.project.debugProperties["CONSOLECOMMAND"] = (
-            self.consoleCommandEdit.text()
-        )
-        self.project.debugProperties["REDIRECT"] = (
-            self.redirectCheckBox.isChecked()
-        )
-        self.project.debugProperties["NOENCODING"] = (
-            self.noEncodingCheckBox.isChecked()
-        )
+
+        self.project.debugProperties[
+            "ENVIRONMENTOVERRIDE"
+        ] = self.debugEnvironmentOverrideCheckBox.isChecked()
+        self.project.debugProperties[
+            "ENVIRONMENTSTRING"
+        ] = self.debugEnvironmentEdit.text()
+        self.project.debugProperties[
+            "REMOTEDEBUGGER"
+        ] = self.remoteDebuggerGroup.isChecked()
+        self.project.debugProperties["REMOTEHOST"] = self.remoteHostEdit.text()
+        self.project.debugProperties["REMOTECOMMAND"] = self.remoteCommandEdit.text()
+        self.project.debugProperties[
+            "PATHTRANSLATION"
+        ] = self.pathTranslationGroup.isChecked()
+        self.project.debugProperties["REMOTEPATH"] = self.translationRemoteEdit.text()
+        self.project.debugProperties["LOCALPATH"] = self.translationLocalEdit.text()
+        self.project.debugProperties[
+            "CONSOLEDEBUGGER"
+        ] = self.consoleDebuggerGroup.isChecked()
+        self.project.debugProperties["CONSOLECOMMAND"] = self.consoleCommandEdit.text()
+        self.project.debugProperties["REDIRECT"] = self.redirectCheckBox.isChecked()
+        self.project.debugProperties["NOENCODING"] = self.noEncodingCheckBox.isChecked()
         self.project.debugPropertiesLoaded = True
         self.project.debugPropertiesChanged = True
-        
+
         self.__saveHistories()
-    
+
     def __saveHistories(self):
         """
         Private method to save the path picker histories.
@@ -199,25 +180,24 @@
         debugClientsHistory = self.debugClientPicker.getPathItems()
         if debugClient not in debugClientsHistory:
             debugClientsHistory.insert(0, debugClient)
-        Preferences.setProject("DebugClientsHistory",
-                               debugClientsHistory)
-    
+        Preferences.setProject("DebugClientsHistory", debugClientsHistory)
+
     @pyqtSlot()
     def on_debugClientClearHistoryButton_clicked(self):
         """
         Private slot to clear the debug clients history.
         """
         self.__clearHistory(self.debugClientPicker)
-    
+
     def __clearHistory(self, picker):
         """
         Private method to clear a path picker history.
-        
+
         @param picker reference to the path picker
         @type EricComboPathPicker
         """
         currentText = picker.text()
         picker.clear()
         picker.setText(currentText)
-        
+
         self.__saveHistories()
--- a/src/eric7/Project/DebuggerPropertiesFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/DebuggerPropertiesFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,11 @@
     """
     Class representing the project debugger properties JSON file.
     """
+
     def __init__(self, project: Project, parent: QObject = None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent reference to the parent object (defaults to None)
@@ -37,12 +38,12 @@
         """
         super().__init__(parent)
         self.__project = project
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the project debugger properties data to a
         project debugger properties JSON file.
-        
+
         @param filename name of the user project file
         @type str
         @return flag indicating a successful write
@@ -51,19 +52,18 @@
         debuggerPropertiesDict = {}
         debuggerPropertiesDict["header"] = {
             "comment": "eric debugger properties file for project {0}".format(
-                self.__project.getProjectName()),
+                self.__project.getProjectName()
+            ),
             "warning": "This file was generated automatically, do not edit.",
         }
-        
+
         if Preferences.getProject("TimestampFile"):
-            debuggerPropertiesDict["header"]["saved"] = (
-                time.strftime('%Y-%m-%d, %H:%M:%S')
+            debuggerPropertiesDict["header"]["saved"] = time.strftime(
+                "%Y-%m-%d, %H:%M:%S"
             )
-        
-        debuggerPropertiesDict["debug_properties"] = (
-            self.__project.debugProperties
-        )
-        
+
+        debuggerPropertiesDict["debug_properties"] = self.__project.debugProperties
+
         try:
             jsonString = json.dumps(debuggerPropertiesDict, indent=2)
             with open(filename, "w") as f:
@@ -77,17 +77,17 @@
                         "<p>The project debugger properties file"
                         " <b>{0}</b> could not be written.</p>"
                         "<p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the project debugger properties data from a
         project debugger properties JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful read
@@ -104,12 +104,10 @@
                 self.tr(
                     "<p>The project debugger properties file <b>{0}</b>"
                     " could not be read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
-        self.__project.debugProperties = (
-            debuggerPropertiesDict["debug_properties"]
-        )
-        
+
+        self.__project.debugProperties = debuggerPropertiesDict["debug_properties"]
+
         return True
--- a/src/eric7/Project/FiletypeAssociationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/FiletypeAssociationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to enter filetype associations for the project.
     """
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent reference to the parent widget (QWidget)
         """
@@ -30,64 +31,78 @@
         self.setupUi(self)
 
         self.filetypeAssociationList.headerItem().setText(
-            self.filetypeAssociationList.columnCount(), "")
+            self.filetypeAssociationList.columnCount(), ""
+        )
         self.filetypeAssociationList.header().setSortIndicator(
-            0, Qt.SortOrder.AscendingOrder)
-        
+            0, Qt.SortOrder.AscendingOrder
+        )
+
         # keep these lists in sync
-        self.filetypes = ["SOURCES", "FORMS", "TRANSLATIONS", "RESOURCES",
-                          "INTERFACES", "PROTOCOLS", "OTHERS", "__IGNORE__"]
-        self.filetypeStrings = [self.tr("Sources"), self.tr("Forms"),
-                                self.tr("Translations"),
-                                self.tr("Resources"),
-                                self.tr("Interfaces"),
-                                self.tr("Protocols"),
-                                self.tr("Others"),
-                                self.tr("Ignore")]
+        self.filetypes = [
+            "SOURCES",
+            "FORMS",
+            "TRANSLATIONS",
+            "RESOURCES",
+            "INTERFACES",
+            "PROTOCOLS",
+            "OTHERS",
+            "__IGNORE__",
+        ]
+        self.filetypeStrings = [
+            self.tr("Sources"),
+            self.tr("Forms"),
+            self.tr("Translations"),
+            self.tr("Resources"),
+            self.tr("Interfaces"),
+            self.tr("Protocols"),
+            self.tr("Others"),
+            self.tr("Ignore"),
+        ]
         self.filetypeCombo.addItems(self.filetypeStrings)
-        
+
         self.project = project
         for pattern, filetype in list(self.project.pdata["FILETYPES"].items()):
             with contextlib.suppress(ValueError):
                 index = self.filetypes.index(filetype)
                 self.__createItem(pattern, self.filetypeStrings[index])
-        
+
         self.__resort()
         self.__reformat()
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.filetypeAssociationList.sortItems(
             self.filetypeAssociationList.sortColumn(),
-            self.filetypeAssociationList.header().sortIndicatorOrder())
-        
+            self.filetypeAssociationList.header().sortIndicatorOrder(),
+        )
+
     def __reformat(self):
         """
         Private method to reformat the tree.
         """
         self.filetypeAssociationList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.filetypeAssociationList.header().setStretchLastSection(True)
-        
+
     def __createItem(self, pattern, filetype):
         """
         Private slot to create a new entry in the association list.
-        
+
         @param pattern pattern of the entry (string)
         @param filetype file type of the entry (string)
         @return reference to the newly generated entry (QTreeWidgetItem)
         """
-        itm = QTreeWidgetItem(
-            self.filetypeAssociationList, [pattern, filetype])
+        itm = QTreeWidgetItem(self.filetypeAssociationList, [pattern, filetype])
         return itm
-        
+
     def on_filetypeAssociationList_currentItemChanged(self, itm, prevItm):
         """
         Private slot to handle the currentItemChanged signal of the
         association list.
-        
+
         @param itm reference to the new current item (QTreeWidgetItem)
         @param prevItm reference to the previous current item (QTreeWidgetItem)
         """
@@ -97,8 +112,7 @@
             self.deleteAssociationButton.setEnabled(False)
         else:
             self.filePatternEdit.setText(itm.text(0))
-            self.filetypeCombo.setCurrentIndex(
-                self.filetypeCombo.findText(itm.text(1)))
+            self.filetypeCombo.setCurrentIndex(self.filetypeCombo.findText(itm.text(1)))
             self.deleteAssociationButton.setEnabled(True)
 
     @pyqtSlot()
@@ -110,10 +124,12 @@
         filetype = self.filetypeCombo.currentText()
         if pattern:
             items = self.filetypeAssociationList.findItems(
-                pattern, Qt.MatchFlag.MatchExactly, 0)
+                pattern, Qt.MatchFlag.MatchExactly, 0
+            )
             for itm in items:
                 itm = self.filetypeAssociationList.takeTopLevelItem(
-                    self.filetypeAssociationList.indexOfTopLevelItem(itm))
+                    self.filetypeAssociationList.indexOfTopLevelItem(itm)
+                )
                 del itm
             itm = self.__createItem(pattern, filetype)
             self.__resort()
@@ -130,9 +146,10 @@
         """
         for itm in self.filetypeAssociationList.selectedItems():
             itm = self.filetypeAssociationList.takeTopLevelItem(
-                self.filetypeAssociationList.indexOfTopLevelItem(itm))
+                self.filetypeAssociationList.indexOfTopLevelItem(itm)
+            )
             del itm
-            
+
             self.filetypeAssociationList.clearSelection()
             self.filePatternEdit.clear()
             self.filetypeCombo.setCurrentIndex(0)
@@ -140,7 +157,7 @@
     def on_filePatternEdit_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of the pattern lineedit.
-        
+
         @param txt text of the lineedit (string)
         """
         if not txt:
@@ -152,8 +169,8 @@
                 self.deleteAssociationButton.setEnabled(False)
             else:
                 self.deleteAssociationButton.setEnabled(
-                    self.filetypeAssociationList.selectedItems()[0]
-                    .text(0) == txt)
+                    self.filetypeAssociationList.selectedItems()[0].text(0) == txt
+                )
 
     def transferData(self):
         """
--- a/src/eric7/Project/IdlCompilerDefineNameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/IdlCompilerDefineNameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     Class implementing a dialog to enter the name-value pair to define a
     variable for the IDL compiler.
     """
+
     def __init__(self, name="", value="", parent=None):
         """
         Constructor
-        
+
         @param name name of the variable
         @type str
         @param value value of the variable
@@ -32,36 +33,37 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.nameEdit.setText(name)
         self.valueEdit.setText(value)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOkButton()
-    
+
     def __updateOkButton(self):
         """
         Private slot to update the enable state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.nameEdit.text()))
-    
+            bool(self.nameEdit.text())
+        )
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the name.
-        
+
         @param txt current text of the name edit
         @type str
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the variable name and value
         @rtype tuple of (str, str)
         """
--- a/src/eric7/Project/IdlCompilerOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/IdlCompilerOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,18 @@
     """
     Class implementing a dialog to enter some IDL compiler options.
     """
-    def __init__(self, includeDirectories, definedNames, undefinedNames,
-                 project=None, parent=None):
+
+    def __init__(
+        self,
+        includeDirectories,
+        definedNames,
+        undefinedNames,
+        project=None,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param includeDirectories list of include directories
         @type list of str
         @param definedNames list of defined variables with name and value
@@ -43,33 +50,33 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__project = project
-        
+
         self.idAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.idDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.idEditButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
+
         self.dnAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.dnDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.dnEditButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
+
         self.unAddButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.unDeleteButton.setIcon(UI.PixmapCache.getIcon("minus"))
         self.unEditButton.setIcon(UI.PixmapCache.getIcon("edit"))
-        
+
         self.__populateIncludeDirectoriesList(includeDirectories)
         self.__populateDefineNamesList(definedNames)
         self.unList.addItems(undefinedNames)
-        
+
         self.__updateIncludeDirectoryButtons()
         self.__updateDefineNameButtons()
         self.__updateUndefineNameButtons()
-    
+
     #######################################################################
     ## Methods implementing the 'Include Directory' option
     #######################################################################
-    
+
     def __updateIncludeDirectoryButtons(self):
         """
         Private method to set the state of the 'Include Directory' buttons.
@@ -77,11 +84,11 @@
         enable = len(self.idList.selectedItems())
         self.idDeleteButton.setEnabled(enable)
         self.idEditButton.setEnabled(enable)
-    
+
     def __populateIncludeDirectoriesList(self, includeDirectories):
         """
         Private method to populate the 'Include Directories' list.
-        
+
         @param includeDirectories list of include directories
         @type list of str
         """
@@ -94,52 +101,47 @@
                 self.idList.addItem(path)
             else:
                 self.idList.addItem(directory)
-    
+
     def __generateIncludeDirectoriesList(self):
         """
         Private method to prepare the list of 'Include Directories'.
-        
+
         @return list of 'Include Directories'
         @rtype list of str
         """
-        return [
-            self.idList.item(row).text()
-            for row in range(self.idList.count())
-        ]
-    
+        return [self.idList.item(row).text() for row in range(self.idList.count())]
+
     def __includeDirectoriesContain(self, directory):
         """
         Private method to test, if the currently defined 'Include Directories'
         contain a given one.
-        
+
         @param directory directory name to be tested
         @type str
         @return flag indicating that the given directory is already included
         @rtype bool
         """
-        return len(self.idList.findItems(
-            directory, Qt.MatchFlag.MatchExactly)) > 0
-    
+        return len(self.idList.findItems(directory, Qt.MatchFlag.MatchExactly)) > 0
+
     @pyqtSlot()
     def on_idList_itemSelectionChanged(self):
         """
         Private slot handling the selection of an 'Include Directory' entry.
         """
         self.__updateIncludeDirectoryButtons()
-    
+
     @pyqtSlot()
     def on_idAddButton_clicked(self):
         """
         Private slot to add an 'Include Directory'.
         """
-        defaultDirectory = (self.__project.getProjectPath() if self.__project
-                            else "")
+        defaultDirectory = self.__project.getProjectPath() if self.__project else ""
         path, ok = EricPathPickerDialog.getPath(
             self,
             self.tr("Include Directory"),
             self.tr("Select Include Directory"),
             EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE,
-            defaultDirectory=defaultDirectory
+            defaultDirectory=defaultDirectory,
         )
         if ok and path:
             if self.__project:
@@ -148,7 +150,7 @@
                     path = "."
             if not self.__includeDirectoriesContain(path):
                 self.idList.addItem(path)
-    
+
     @pyqtSlot()
     def on_idDeleteButton_clicked(self):
         """
@@ -158,7 +160,7 @@
         row = self.idList.row(itm)
         self.idList.takeItem(row)
         del itm
-    
+
     @pyqtSlot()
     def on_idEditButton_clicked(self):
         """
@@ -177,7 +179,7 @@
             self.tr("Select Include Directory"),
             EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE,
             path=path,
-            defaultDirectory=defaultDirectory
+            defaultDirectory=defaultDirectory,
         )
         if ok and path:
             if self.__project:
@@ -191,11 +193,11 @@
                 del itm
             else:
                 itm.setText(path)
-    
+
     #######################################################################
     ## Methods implementing the 'Define Name' option
     #######################################################################
-    
+
     def __updateDefineNameButtons(self):
         """
         Private method to set the state of the 'Define Name' buttons.
@@ -203,11 +205,11 @@
         enable = len(self.dnList.selectedItems())
         self.dnDeleteButton.setEnabled(enable)
         self.dnEditButton.setEnabled(enable)
-    
+
     def __populateDefineNamesList(self, definedNames):
         """
         Private method to populate the list of defined names.
-        
+
         @param definedNames list of defined variables with name and value
             separated by '='
         @type list of str
@@ -221,13 +223,13 @@
                 else:
                     value = ""
                 QTreeWidgetItem(self.dnList, [name, value])
-        
+
         self.dnList.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     def __generateDefinedNamesList(self):
         """
         Private method to prepare the list of 'Defined Names'.
-        
+
         @return list of 'Defined Names'
         @rtype list of str
         """
@@ -240,29 +242,28 @@
                 definedNames.append("{0}={1}".format(name, value))
             else:
                 definedNames.append(name)
-        
+
         return definedNames
-    
+
     def __definedNamesContain(self, name):
         """
         Private method to test, if the currently defined 'Defined Names'
         contain a given one.
-        
+
         @param name variable name to be tested
         @type str
         @return flag indicating that the given name is already included
         @rtype bool
         """
-        return len(self.dnList.findItems(
-            name, Qt.MatchFlag.MatchExactly, 0)) > 0
-    
+        return len(self.dnList.findItems(name, Qt.MatchFlag.MatchExactly, 0)) > 0
+
     @pyqtSlot()
     def on_dnList_itemSelectionChanged(self):
         """
         Private slot handling the selection of a 'Define Name' entry.
         """
         self.__updateDefineNameButtons()
-    
+
     @pyqtSlot()
     def on_dnAddButton_clicked(self):
         """
@@ -273,9 +274,9 @@
             name, value = dlg.getData()
             if not self.__definedNamesContain(name):
                 QTreeWidgetItem(self.dnList, [name, value])
-        
+
         self.dnList.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     @pyqtSlot()
     def on_dnDeleteButton_clicked(self):
         """
@@ -285,16 +286,17 @@
         index = self.dnList.indexOfTopLevelItem(itm)
         self.dnList.takeTopLevelItem(index)
         del itm
-    
+
     @pyqtSlot()
     def on_dnEditButton_clicked(self):
         """
         Private slot to edit the selected 'Define Name' entry.
         """
         itm = self.dnList.selectedItems()[0]
-        
+
         dlg = IdlCompilerDefineNameDialog(
-            name=itm.text(0), value=itm.text(1), parent=self)
+            name=itm.text(0), value=itm.text(1), parent=self
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, value = dlg.getData()
             if self.__definedNamesContain(name) and itm.text(0) != name:
@@ -302,21 +304,20 @@
                 index = self.dnList.indexOfTopLevelItem(itm)
                 self.dnList.takeTopLevelItem(index)
                 del itm
-                
+
                 # change the named one
-                itm = self.dnList.findItems(
-                    name, Qt.MatchFlag.MatchExactly, 0)[0]
+                itm = self.dnList.findItems(name, Qt.MatchFlag.MatchExactly, 0)[0]
                 itm.setText(1, value)
             else:
                 itm.setText(0, name)
                 itm.setText(1, value)
-        
+
         self.dnList.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
+
     #######################################################################
     ## Methods implementing the 'Undefine Name' option
     #######################################################################
-    
+
     def __updateUndefineNameButtons(self):
         """
         Private method to set the state of the 'Undefine Name' buttons.
@@ -324,38 +325,35 @@
         enable = len(self.unList.selectedItems())
         self.unDeleteButton.setEnabled(enable)
         self.unEditButton.setEnabled(enable)
-    
+
     def __generateUndefinedNamesList(self):
         """
         Private method to prepare the list of 'Undefined Names'.
-        
+
         @return list of 'Undefined Names'
         @rtype list of str
         """
-        return [
-            self.unList.item(row).text()
-            for row in range(self.unList.count())
-        ]
-    
+        return [self.unList.item(row).text() for row in range(self.unList.count())]
+
     def __undefinedNamesContain(self, name):
         """
         Private method to test, if the currently defined 'Undefined Names'
         contain a given one.
-        
+
         @param name variable name to be tested
         @type str
         @return flag indicating that the given name is already included
         @rtype bool
         """
         return len(self.unList.findItems(name, Qt.MatchFlag.MatchExactly)) > 0
-    
+
     @pyqtSlot()
     def on_unList_itemSelectionChanged(self):
         """
         Private slot handling the selection of a 'Undefine Name' entry.
         """
         self.__updateUndefineNameButtons()
-    
+
     @pyqtSlot()
     def on_unAddButton_clicked(self):
         """
@@ -364,12 +362,12 @@
         name, ok = QInputDialog.getText(
             self,
             self.tr("Undefine Name"),
-            self.tr("Enter a variable name to be undefined:")
+            self.tr("Enter a variable name to be undefined:"),
         )
         name = name.strip()
         if ok and name and not self.__undefinedNamesContain(name):
             self.unList.addItem(name)
-    
+
     @pyqtSlot()
     def on_unDeleteButton_clicked(self):
         """
@@ -379,7 +377,7 @@
         row = self.unList.row(itm)
         self.unList.takeItem(row)
         del itm
-    
+
     @pyqtSlot()
     def on_unEditButton_clicked(self):
         """
@@ -390,7 +388,7 @@
             self,
             self.tr("Undefine Name"),
             self.tr("Enter a variable name to be undefined:"),
-            text=itm.text()
+            text=itm.text(),
         )
         name = name.strip()
         if ok and name:
@@ -401,15 +399,15 @@
                 del itm
             else:
                 itm.setText(name)
-    
+
     #######################################################################
     ## Methods implementing the result preparation
     #######################################################################
-    
+
     def getData(self):
         """
         Public method to return the data entered by the user.
-        
+
         @return tuple containing the list of include directories, list of
             defined names and list of undefined names
         @rtype tuple of (list of str, list of str, list of str)
--- a/src/eric7/Project/LexerAssociationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/LexerAssociationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,10 +23,11 @@
     """
     Class implementing a dialog to enter lexer associations for the project.
     """
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent reference to the parent widget (QWidget)
         """
@@ -34,39 +35,38 @@
         self.setupUi(self)
 
         self.editorLexerList.headerItem().setText(
-            self.editorLexerList.columnCount(), "")
+            self.editorLexerList.columnCount(), ""
+        )
         header = self.editorLexerList.header()
         header.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         try:
             self.extsep = os.extsep
         except AttributeError:
             self.extsep = "."
-        
+
         self.extras = ["-----------", self.tr("Alternative")]
-        
+
         self.editorLexerCombo.addItem("")
-        self.editorLexerCombo.addItem(
-            UI.PixmapCache.getIcon("fileText"),
-            "Text"
-        )
+        self.editorLexerCombo.addItem(UI.PixmapCache.getIcon("fileText"), "Text")
         for lang in sorted(QScintilla.Lexers.getSupportedLanguages().keys()):
             self.editorLexerCombo.addItem(
-                QScintilla.Lexers.getLanguageIcon(lang, False),
-                lang)
+                QScintilla.Lexers.getLanguageIcon(lang, False), lang
+            )
         self.editorLexerCombo.addItems(self.extras)
-        
+
         from pygments.lexers import get_all_lexers
-        pygmentsLexers = [''] + sorted(lex[0] for lex in get_all_lexers())
+
+        pygmentsLexers = [""] + sorted(lex[0] for lex in get_all_lexers())
         self.pygmentsLexerCombo.addItems(pygmentsLexers)
-        
+
         # set initial values
         self.project = project
         for ext, lexer in list(self.project.pdata["LEXERASSOCS"].items()):
             QTreeWidgetItem(self.editorLexerList, [ext, lexer])
         self.editorLexerList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-    
+
     @pyqtSlot()
     def on_addLexerButton_clicked(self):
         """
@@ -83,8 +83,7 @@
             else:
                 lexer = "Pygments|{0}".format(pygmentsLexer)
         if ext and lexer:
-            itmList = self.editorLexerList.findItems(
-                ext, Qt.MatchFlag.MatchExactly, 0)
+            itmList = self.editorLexerList.findItems(ext, Qt.MatchFlag.MatchExactly, 0)
             if itmList:
                 index = self.editorLexerList.indexOfTopLevelItem(itmList[0])
                 itm = self.editorLexerList.takeTopLevelItem(index)
@@ -96,8 +95,9 @@
             self.pygmentsLexerCombo.setCurrentIndex(0)
             self.editorLexerList.sortItems(
                 self.editorLexerList.sortColumn(),
-                self.editorLexerList.header().sortIndicatorOrder())
-    
+                self.editorLexerList.header().sortIndicatorOrder(),
+            )
+
     @pyqtSlot()
     def on_deleteLexerButton_clicked(self):
         """
@@ -110,16 +110,16 @@
             itm = self.editorLexerList.takeTopLevelItem(index)
             # __IGNORE_WARNING__
             del itm
-            
+
             self.editorLexerList.clearSelection()
             self.editorFileExtEdit.clear()
             self.editorLexerCombo.setCurrentIndex(0)
-    
+
     def on_editorLexerList_itemClicked(self, itm, column):
         """
         Private slot to handle the clicked signal of the lexer association
         list.
-        
+
         @param itm reference to the selecte item (QTreeWidgetItem)
         @param column column the item was clicked or activated (integer)
             (ignored)
@@ -140,23 +140,23 @@
             index = self.editorLexerCombo.findText(lexer)
             self.editorLexerCombo.setCurrentIndex(index)
             self.pygmentsLexerCombo.setCurrentIndex(pygmentsIndex)
-    
+
     def on_editorLexerList_itemActivated(self, itm, column):
         """
         Private slot to handle the activated signal of the lexer association
         list.
-        
+
         @param itm reference to the selecte item (QTreeWidgetItem)
         @param column column the item was clicked or activated (integer)
             (ignored)
         """
         self.on_editorLexerList_itemClicked(itm, column)
-    
+
     @pyqtSlot(int)
     def on_editorLexerCombo_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a lexer.
-        
+
         @param index index of the current item
         @type int
         """
--- a/src/eric7/Project/MakePropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/MakePropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to enter the properties for 'make'.
     """
+
     def __init__(self, project, new, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param new flag indicating the generation of a new project
@@ -31,30 +32,31 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__project = project
-        
+
         self.makePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.makePicker.setFilters(self.tr("All Files (*)"))
-        
+
         self.makefilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.makefilePicker.setDefaultDirectory(self.__project.ppath)
-        self.makefilePicker.setFilters(self.tr(
-            "Makefiles (*makefile Makefile *.mak);;All Files (*)"))
-        
+        self.makefilePicker.setFilters(
+            self.tr("Makefiles (*makefile Makefile *.mak);;All Files (*)")
+        )
+
         self.makeTargetEdit.textChanged.connect(self.__updateOkButton)
-        
+
         self.initDialog()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def initDialog(self):
         """
         Public method to initialize the dialog's data.
         """
         makeData = self.__project.pdata["MAKEPARAMS"]
-        
+
         if makeData["MakeExecutable"]:
             self.makePicker.setText(makeData["MakeExecutable"])
         else:
@@ -66,33 +68,33 @@
         self.makeTargetEdit.setText(makeData["MakeTarget"])
         self.makeParametersEdit.setText(makeData["MakeParameters"])
         self.testOnlyCheckBox.setChecked(makeData["MakeTestOnly"])
-        
+
         self.__updateOkButton()
-    
+
     def __updateOkButton(self):
         """
         Private slot to update the enabled state of the OK button.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(bool(
-                self.makeTargetEdit.text()))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
+            bool(self.makeTargetEdit.text())
+        )
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
         """
         makeData = self.__project.pdata["MAKEPARAMS"]
-        
+
         makeExe = self.makePicker.text()
         if makeExe == self.__project.DefaultMake:
             makeExe = ""
         makeData["MakeExecutable"] = makeExe
-        
+
         makefile = self.__project.getRelativePath(self.makefilePicker.text())
         if makefile == self.__project.DefaultMakefile:
             makefile = ""
         makeData["MakeFile"] = makefile
-        
+
         makeData["MakeTarget"] = self.makeTargetEdit.text()
         makeData["MakeParameters"] = self.makeParametersEdit.text()
         makeData["MakeTestOnly"] = self.testOnlyCheckBox.isChecked()
--- a/src/eric7/Project/NewDialogClassDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/NewDialogClassDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,11 +20,11 @@
     """
     Class implementing a dialog to ente the data for a new dialog class file.
     """
-    def __init__(self, defaultClassName, defaultFile, defaultPath,
-                 parent=None):
+
+    def __init__(self, defaultClassName, defaultFile, defaultPath, parent=None):
         """
         Constructor
-        
+
         @param defaultClassName proposed name for the new class (string)
         @param defaultFile proposed name for the source file (string)
         @param defaultPath default path for the new file (string)
@@ -32,61 +32,60 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.pathnamePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         self.classnameEdit.setText(defaultClassName)
         self.filenameEdit.setText(defaultFile)
         self.pathnamePicker.setText(defaultPath)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def __enableOkButton(self):
         """
         Private slot to set the enable state of theok button.
         """
         self.okButton.setEnabled(
-            self.classnameEdit.text() != "" and
-            self.filenameEdit.text() != "" and
-            self.pathnamePicker.text() != "")
-        
+            self.classnameEdit.text() != ""
+            and self.filenameEdit.text() != ""
+            and self.pathnamePicker.text() != ""
+        )
+
     def on_classnameEdit_textChanged(self, text):
         """
         Private slot called, when thext of the classname edit has changed.
-        
+
         @param text changed text (string)
         """
         self.__enableOkButton()
-        
+
     def on_filenameEdit_textChanged(self, text):
         """
         Private slot called, when thext of the filename edit has changed.
-        
+
         @param text changed text (string)
         """
         self.__enableOkButton()
-        
+
     def on_pathnamePicker_textChanged(self, text):
         """
         Private slot called, when the text of the path name has changed.
-        
+
         @param text changed text (string)
         """
         self.__enableOkButton()
-        
+
     def getData(self):
         """
         Public method to retrieve the data entered into the dialog.
-        
+
         @return tuple giving the classname (string) and the file name (string)
         """
         return (
             self.classnameEdit.text(),
-            os.path.join(self.pathnamePicker.text(),
-                         self.filenameEdit.text())
+            os.path.join(self.pathnamePicker.text(), self.filenameEdit.text()),
         )
--- a/src/eric7/Project/NewPythonPackageDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/NewPythonPackageDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,40 +17,40 @@
     """
     Class implementing a dialog to add a new Python package.
     """
+
     def __init__(self, relPath, parent=None):
         """
         Constructor
-        
+
         @param relPath initial package path relative to the project root
             (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
         self.okButton.setEnabled(False)
-        
+
         rp = relPath.replace("/", ".").replace("\\", ".")
         self.packageEdit.setText(rp)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(str)
     def on_packageEdit_textChanged(self, txt):
         """
         Private slot called, when the package name is changed.
-        
+
         @param txt new text of the package name edit (string)
         """
         self.okButton.setEnabled(txt != "")
-    
+
     def getData(self):
         """
         Public method to retrieve the data entered into the dialog.
-        
+
         @return package name (string)
         """
         return self.packageEdit.text()
--- a/src/eric7/Project/Project.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/Project.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,13 +18,17 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSlot, QFile, pyqtSignal, QCryptographicHash, QIODevice, QByteArray,
-    QObject, QProcess
+    pyqtSlot,
+    QFile,
+    pyqtSignal,
+    QCryptographicHash,
+    QIODevice,
+    QByteArray,
+    QObject,
+    QProcess,
 )
 from PyQt6.QtGui import QKeySequence, QAction
-from PyQt6.QtWidgets import (
-    QLineEdit, QToolBar, QDialog, QInputDialog, QMenu
-)
+from PyQt6.QtWidgets import QLineEdit, QToolBar, QDialog, QInputDialog, QMenu
 from PyQt6.Qsci import QsciScintilla
 
 from EricWidgets.EricApplication import ericApp
@@ -58,7 +62,7 @@
 class Project(QObject):
     """
     Class implementing the project management functionality.
-    
+
     @signal dirty(bool) emitted when the dirty state changes
     @signal projectLanguageAdded(str) emitted after a new language was added
     @signal projectLanguageAddedByCode(str) emitted after a new language was
@@ -125,6 +129,7 @@
     @signal appendStderr(str) emitted after something was received from
         a QProcess on stderr
     """
+
     dirty = pyqtSignal(bool)
     projectLanguageAdded = pyqtSignal(str)
     projectLanguageAddedByCode = pyqtSignal(str)
@@ -168,71 +173,72 @@
     projectChanged = pyqtSignal()
     appendStdout = pyqtSignal(str)
     appendStderr = pyqtSignal(str)
-    
+
     eols = [os.linesep, "\n", "\r", "\r\n"]
-    
+
     DefaultMake = "make"
     DefaultMakefile = "makefile"
-    
+
     def __init__(self, parent=None, filename=None):
         """
         Constructor
-        
+
         @param parent parent widget (usually the ui object) (QWidget)
         @param filename optional filename of a project file to open (string)
         """
         super().__init__(parent)
-        
+
         self.ui = parent
-        
+
         self.__progLanguages = [
             "Python3",
             "MicroPython",
             "Ruby",
             "JavaScript",
         ]
-        
+
         self.__dbgFilters = {
             "Python3": self.tr(
-                "Python3 Files (*.py *.py3);;"
-                "Python3 GUI Files (*.pyw *.pyw3);;"),
+                "Python3 Files (*.py *.py3);;" "Python3 GUI Files (*.pyw *.pyw3);;"
+            ),
         }
-        
+
         self.vcsMenu = None
         self.__makeProcess = None
-        
+
         self.__initProjectTypes()
-        
+
         self.__initData()
-        
+
         self.__projectFile = ProjectFile(self)
         self.__userProjectFile = UserProjectFile(self)
         self.__debuggerPropertiesFile = DebuggerPropertiesFile(self)
         self.__sessionFile = SessionFile(False)
         self.__tasksFile = TasksFile(False)
-        
+
         self.recent = []
         self.__loadRecent()
-        
+
         if filename is not None:
             self.openProject(filename)
         else:
             self.vcs = self.initVCS()
-        
+
         from .ProjectBrowserModel import ProjectBrowserModel
+
         self.__model = ProjectBrowserModel(self)
-        
+
         self.codemetrics = None
         self.codecoverage = None
         self.profiledata = None
         self.applicationDiagram = None
         self.loadedDiagram = None
         self.__findProjectFileDialog = None
-        
+
     def __sourceExtensions(self, language):
         """
         Private method to get the source extensions of a programming language.
-        
+
         @param language programming language (string)
         @return source extensions (list of string)
         """
@@ -254,23 +260,21 @@
             return {
                 "Ruby": [".rb"],
                 "JavaScript": [".js"],
-                "Mixed": (
-                    Preferences.getPython("Python3Extensions") +
-                    ['.rb', '.js']),
+                "Mixed": (Preferences.getPython("Python3Extensions") + [".rb", ".js"]),
             }.get(language, "")
-        
+
     def getProgrammingLanguages(self):
         """
         Public method to get the programming languages supported by project.
-        
+
         @return list of supported programming languages (list of string)
         """
         return self.__progLanguages[:]
-    
+
     def getDebuggerFilters(self, language):
         """
         Public method to get the debugger filters for a programming language.
-        
+
         @param language programming language
         @type str
         @return filter string
@@ -280,7 +284,7 @@
             return self.__dbgFilters[language]
         except KeyError:
             return ""
-    
+
     def __initProjectTypes(self):
         """
         Private method to initialize the list of supported project types.
@@ -288,7 +292,7 @@
         self.__fileTypeCallbacks = {}
         self.__lexerAssociationCallbacks = {}
         self.__binaryTranslationsCallbacks = {}
-        
+
         self.__projectTypes = {
             "PyQt5": self.tr("PyQt5 GUI"),
             "PyQt5C": self.tr("PyQt5 Console"),
@@ -298,31 +302,36 @@
             "Console": self.tr("Console"),
             "Other": self.tr("Other"),
         }
-        
+
         self.__projectProgLanguages = {
-            "Python3": ["PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-                        "Console", "Other"],
+            "Python3": [
+                "PyQt5",
+                "PyQt5C",
+                "PyQt6",
+                "PyQt6C",
+                "E7Plugin",
+                "Console",
+                "Other",
+            ],
             "MicroPython": ["Console", "Other"],
             "Ruby": ["Console", "Other"],
             "JavaScript": ["Other"],
         }
-        
+
         if Utilities.checkPyside(variant=2):
             self.__projectTypes["PySide2"] = self.tr("PySide2 GUI")
             self.__projectTypes["PySide2C"] = self.tr("PySide2 Console")
-            self.__projectProgLanguages["Python3"].extend(
-                ["PySide2", "PySide2C"])
-        
+            self.__projectProgLanguages["Python3"].extend(["PySide2", "PySide2C"])
+
         if Utilities.checkPyside(variant=6):
             self.__projectTypes["PySide6"] = self.tr("PySide6 GUI")
             self.__projectTypes["PySide6C"] = self.tr("PySide6 Console")
-            self.__projectProgLanguages["Python3"].extend(
-                ["PySide6", "PySide6C"])
-        
+            self.__projectProgLanguages["Python3"].extend(["PySide6", "PySide6C"])
+
     def getProjectTypes(self, progLanguage=""):
         """
         Public method to get the list of supported project types.
-        
+
         @param progLanguage programming language to get project types for
             (string)
         @return reference to the dictionary of project types.
@@ -334,29 +343,35 @@
             return ptypes
         else:
             return self.__projectTypes
-        
+
     def hasProjectType(self, type_, progLanguage=""):
         """
         Public method to check, if a project type is already registered.
-        
+
         @param type_ internal type designator (string)
         @param progLanguage programming language of the project type (string)
         @return flag indicating presence of the project type (boolean)
         """
         if progLanguage:
             return (
-                progLanguage in self.__projectProgLanguages and
-                type_ in self.__projectProgLanguages[progLanguage]
+                progLanguage in self.__projectProgLanguages
+                and type_ in self.__projectProgLanguages[progLanguage]
             )
         else:
             return type_ in self.__projectTypes
-        
-    def registerProjectType(self, type_, description, fileTypeCallback=None,
-                            binaryTranslationsCallback=None,
-                            lexerAssociationCallback=None, progLanguages=None):
+
+    def registerProjectType(
+        self,
+        type_,
+        description,
+        fileTypeCallback=None,
+        binaryTranslationsCallback=None,
+        lexerAssociationCallback=None,
+        progLanguages=None,
+    ):
         """
         Public method to register a project type.
-        
+
         @param type_ internal type designator to be registered (string)
         @param description more verbose type name (display string) (string)
         @param fileTypeCallback reference to a method returning a dictionary
@@ -378,11 +393,11 @@
                         self.tr("Registering Project Type"),
                         self.tr(
                             """<p>The Programming Language <b>{0}</b> is not"""
-                            """ supported (project type: {1}).</p>""")
-                        .format(progLanguage, type_)
+                            """ supported (project type: {1}).</p>"""
+                        ).format(progLanguage, type_),
                     )
                     return
-                
+
                 if type_ in self.__projectProgLanguages[progLanguage]:
                     EricMessageBox.critical(
                         self.ui,
@@ -390,25 +405,25 @@
                         self.tr(
                             """<p>The Project type <b>{0}</b> is already"""
                             """ registered with Programming Language"""
-                            """ <b>{1}</b>.</p>""")
-                        .format(type_, progLanguage)
+                            """ <b>{1}</b>.</p>"""
+                        ).format(type_, progLanguage),
                     )
                     return
-            
+
         if type_ in self.__projectTypes:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Registering Project Type"),
-                self.tr("""<p>The Project type <b>{0}</b> is already"""
-                        """ registered.</p>""").format(type_)
+                self.tr(
+                    """<p>The Project type <b>{0}</b> is already"""
+                    """ registered.</p>"""
+                ).format(type_),
             )
         else:
             self.__projectTypes[type_] = description
             self.__fileTypeCallbacks[type_] = fileTypeCallback
             self.__lexerAssociationCallbacks[type_] = lexerAssociationCallback
-            self.__binaryTranslationsCallbacks[type_] = (
-                binaryTranslationsCallback
-            )
+            self.__binaryTranslationsCallbacks[type_] = binaryTranslationsCallback
             if progLanguages:
                 for progLanguage in progLanguages:
                     self.__projectProgLanguages[progLanguage].append(type_)
@@ -416,11 +431,11 @@
                 # no specific programming languages given -> add to all
                 for progLanguage in self.__projectProgLanguages:
                     self.__projectProgLanguages[progLanguage].append(type_)
-        
+
     def unregisterProjectType(self, type_):
         """
         Public method to unregister a project type.
-        
+
         @param type_ internal type designator to be unregistered (string)
         """
         for progLanguage in self.__projectProgLanguages:
@@ -434,15 +449,15 @@
             del self.__lexerAssociationCallbacks[type_]
         if type_ in self.__binaryTranslationsCallbacks:
             del self.__binaryTranslationsCallbacks[type_]
-        
+
     def __initData(self):
         """
         Private method to initialize the project data part.
         """
-        self.loaded = False     # flag for the loaded status
-        self.__dirty = False      # dirty flag
-        self.pfile = ""         # name of the project file
-        self.ppath = ""         # name of the project directory
+        self.loaded = False  # flag for the loaded status
+        self.__dirty = False  # dirty flag
+        self.pfile = ""  # name of the project file
+        self.ppath = ""  # name of the project directory
         self.translationsRoot = ""  # the translations prefix
         self.name = ""
         self.opened = False
@@ -451,10 +466,10 @@
         self.otherssubdirs = []
         self.vcs = None
         self.vcsRequested = False
-        self.dbgVirtualEnv = ''
-        self.dbgCmdline = ''
-        self.dbgWd = ''
-        self.dbgEnv = ''
+        self.dbgVirtualEnv = ""
+        self.dbgCmdline = ""
+        self.dbgWd = ""
+        self.dbgEnv = ""
         self.dbgReportExceptions = True
         self.dbgExcList = []
         self.dbgExcIgnoreList = []
@@ -467,7 +482,7 @@
             "enable": False,
             "redirect": True,
         }
-        
+
         self.pdata = {
             "DESCRIPTION": "",
             "VERSION": "",
@@ -485,16 +500,15 @@
             "VCS": "None",
             "VCSOPTIONS": {},
             "VCSOTHERDATA": {},
-            "AUTHOR": '',
-            "EMAIL": '',
-            "HASH": '',
+            "AUTHOR": "",
+            "EMAIL": "",
+            "HASH": "",
             "PROGLANGUAGE": "Python3",
             "MIXEDLANGUAGE": False,
             "PROJECTTYPE": "PyQt5",
-            "SPELLLANGUAGE":
-                Preferences.getEditor("SpellCheckingDefaultLanguage"),
-            "SPELLWORDS": '',
-            "SPELLEXCLUDES": '',
+            "SPELLLANGUAGE": Preferences.getEditor("SpellCheckingDefaultLanguage"),
+            "SPELLWORDS": "",
+            "SPELLEXCLUDES": "",
             "FILETYPES": {},
             "LEXERASSOCS": {},
             "PROJECTTYPESPECIFICDATA": {},
@@ -521,8 +535,8 @@
                 "PackagesRoot": "",
             },
             "RCCPARAMS": {
-                "CompressionThreshold": 70,     # default value
-                "CompressLevel": 0,             # use zlib default
+                "CompressionThreshold": 70,  # default value
+                "CompressLevel": 0,  # use zlib default
                 "CompressionDisable": False,
                 "PathPrefix": "",
             },
@@ -531,20 +545,20 @@
             "TESTING_FRAMEWORK": "",
             "LICENSE": "",
         }
-        
+
         self.__initDebugProperties()
-        
+
         self.pudata = {
             "VCSOVERRIDE": "",
             "VCSSTATUSMONITORINTERVAL": 0,
         }
-        
+
         self.vcs = self.initVCS()
-        
+
     def getData(self, category, key):
         """
         Public method to get data out of the project data store.
-        
+
         @param category category of the data to get (string, one of
             PROJECTTYPESPECIFICDATA, CHECKERSPARMS, PACKAGERSPARMS,
             DOCUMENTATIONPARMS or OTHERTOOLSPARMS)
@@ -553,19 +567,24 @@
         """
         # __IGNORE_WARNING_D202__
         if (
-            category in ["PROJECTTYPESPECIFICDATA", "CHECKERSPARMS",
-                         "PACKAGERSPARMS", "DOCUMENTATIONPARMS",
-                         "OTHERTOOLSPARMS"] and
-            key in self.pdata[category]
+            category
+            in [
+                "PROJECTTYPESPECIFICDATA",
+                "CHECKERSPARMS",
+                "PACKAGERSPARMS",
+                "DOCUMENTATIONPARMS",
+                "OTHERTOOLSPARMS",
+            ]
+            and key in self.pdata[category]
         ):
             return copy.deepcopy(self.pdata[category][key])
         else:
             return None
-        
+
     def setData(self, category, key, data):
         """
         Public method to store data in the project data store.
-        
+
         @param category category of the data to get (string, one of
             PROJECTTYPESPECIFICDATA, CHECKERSPARMS, PACKAGERSPARMS,
             DOCUMENTATIONPARMS or OTHERTOOLSPARMS)
@@ -574,11 +593,15 @@
         @return flag indicating success (boolean)
         """
         # __IGNORE_WARNING_D202__
-        if category not in ["PROJECTTYPESPECIFICDATA", "CHECKERSPARMS",
-                            "PACKAGERSPARMS", "DOCUMENTATIONPARMS",
-                            "OTHERTOOLSPARMS"]:
+        if category not in [
+            "PROJECTTYPESPECIFICDATA",
+            "CHECKERSPARMS",
+            "PACKAGERSPARMS",
+            "DOCUMENTATIONPARMS",
+            "OTHERTOOLSPARMS",
+        ]:
             return False
-        
+
         # test for changes of data and save them in the project
         # 1. there were none, now there are
         if key not in self.pdata[category] and len(data) > 0:
@@ -597,7 +620,7 @@
         else:
             return False
         return True
-        
+
     def initFileTypes(self):
         """
         Public method to initialize the filetype associations with default
@@ -615,77 +638,92 @@
             "makefile": "OTHERS",
             "Makefile": "OTHERS",
         }
-        
+
         # Sources
         sourceKey = (
-            "Mixed"
-            if self.pdata["MIXEDLANGUAGE"] else
-            self.pdata["PROGLANGUAGE"]
+            "Mixed" if self.pdata["MIXEDLANGUAGE"] else self.pdata["PROGLANGUAGE"]
         )
         for ext in self.__sourceExtensions(sourceKey):
             self.pdata["FILETYPES"]["*{0}".format(ext)] = "SOURCES"
-        
+
         # IDL interfaces
         self.pdata["FILETYPES"]["*.idl"] = "INTERFACES"
-        
+
         # Protobuf Files
         self.pdata["FILETYPES"]["*.proto"] = "PROTOCOLS"
-        
+
         # Forms
-        if self.pdata["PROJECTTYPE"] in ["E7Plugin",
-                                         "PyQt5",
-                                         "PyQt6",
-                                         "PySide2",
-                                         "PySide6"]:
+        if self.pdata["PROJECTTYPE"] in [
+            "E7Plugin",
+            "PyQt5",
+            "PyQt6",
+            "PySide2",
+            "PySide6",
+        ]:
             self.pdata["FILETYPES"]["*.ui"] = "FORMS"
-        
+
         # Resources
-        if self.pdata["PROJECTTYPE"] in ["PyQt5", "PyQt5C",
-                                         "PySide2", "PySide2C",
-                                         "PySide6", "PySide6C"]:
+        if self.pdata["PROJECTTYPE"] in [
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
+        ]:
             self.pdata["FILETYPES"]["*.qrc"] = "RESOURCES"
-        
+
         # Translations
-        if self.pdata["PROJECTTYPE"] in ["E7Plugin",
-                                         "PyQt5", "PyQt5C",
-                                         "PyQt6", "PyQt6C",
-                                         "PySide2", "PySide2C",
-                                         "PySide6", "PySide6C"]:
+        if self.pdata["PROJECTTYPE"] in [
+            "E7Plugin",
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
+        ]:
             self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
             self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
-        
+
         # Project type specific ones
         with contextlib.suppress(KeyError):
-            if self.__fileTypeCallbacks[
-                    self.pdata["PROJECTTYPE"]] is not None:
+            if self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]] is not None:
                 ftypes = self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]]()
                 self.pdata["FILETYPES"].update(ftypes)
-        
+
         self.setDirty(True)
-        
+
     def updateFileTypes(self):
         """
         Public method to update the filetype associations with new default
         values.
         """
-        if self.pdata["PROJECTTYPE"] in ["E7Plugin",
-                                         "PyQt5", "PyQt5C",
-                                         "PyQt6", "PyQt6C",
-                                         "PySide2", "PySide2C",
-                                         "PySide6", "PySide6C"]:
+        if self.pdata["PROJECTTYPE"] in [
+            "E7Plugin",
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
+        ]:
             if "*.ts" not in self.pdata["FILETYPES"]:
                 self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
             if "*.qm" not in self.pdata["FILETYPES"]:
                 self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
         with contextlib.suppress(KeyError):
-            if self.__fileTypeCallbacks[
-                    self.pdata["PROJECTTYPE"]] is not None:
+            if self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]] is not None:
                 ftypes = self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]]()
                 for pattern, ftype in list(ftypes.items()):
                     if pattern not in self.pdata["FILETYPES"]:
                         self.pdata["FILETYPES"][pattern] = ftype
                         self.setDirty(True)
-        
+
     def __loadRecent(self):
         """
         Private method to load the recently opened project filenames.
@@ -697,72 +735,70 @@
             for f in rp:
                 if pathlib.Path(f).exists():
                     self.recent.append(f)
-    
+
     def __saveRecent(self):
         """
         Private method to save the list of recently opened filenames.
         """
         Preferences.Prefs.rsettings.setValue(recentNameProject, self.recent)
         Preferences.Prefs.rsettings.sync()
-        
+
     def getMostRecent(self):
         """
         Public method to get the most recently opened project.
-        
+
         @return path of the most recently opened project (string)
         """
         if len(self.recent):
             return self.recent[0]
         else:
             return None
-        
+
     def getModel(self):
         """
         Public method to get a reference to the project browser model.
-        
+
         @return reference to the project browser model (ProjectBrowserModel)
         """
         return self.__model
-    
+
     def startFileSystemMonitoring(self):
         """
         Public method to (re)start monitoring the project file system.
         """
         self.__model.startFileSystemMonitoring()
-    
+
     def stopFileSystemMonitoring(self):
         """
         Public method to stop monitoring the project file system.
         """
         self.__model.stopFileSystemMonitoring()
-        
+
     def getVcs(self):
         """
         Public method to get a reference to the VCS object.
-        
+
         @return reference to the VCS object
         """
         return self.vcs
-        
+
     def handlePreferencesChanged(self):
         """
         Public slot used to handle the preferencesChanged signal.
         """
         if self.pudata["VCSSTATUSMONITORINTERVAL"]:
-            self.setStatusMonitorInterval(
-                self.pudata["VCSSTATUSMONITORINTERVAL"])
+            self.setStatusMonitorInterval(self.pudata["VCSSTATUSMONITORINTERVAL"])
         else:
-            self.setStatusMonitorInterval(
-                Preferences.getVCS("StatusMonitorInterval"))
-        
+            self.setStatusMonitorInterval(Preferences.getVCS("StatusMonitorInterval"))
+
         self.__model.preferencesChanged()
-        
+
     def setDirty(self, dirty):
         """
         Public method to set the dirty state.
-        
+
         It emits the signal dirty(bool).
-        
+
         @param dirty dirty state
         @type bool
         """
@@ -771,31 +807,31 @@
         self.dirty.emit(dirty)
         if self.__dirty:
             self.projectChanged.emit()
-        
+
     def isDirty(self):
         """
         Public method to return the dirty state.
-        
+
         @return dirty state (boolean)
         """
         return self.__dirty
-        
+
     def isOpen(self):
         """
         Public method to return the opened state.
-        
+
         @return open state (boolean)
         """
         return self.opened
-        
+
     def __checkFilesExist(self, index):
         """
         Private method to check, if the files in a list exist.
-        
+
         The files in the indicated list are checked for existance in the
         filesystem. Non existant files are removed from the list and the
         dirty state of the project is changed accordingly.
-        
+
         @param index key of the list to be checked (string)
         """
         removed = False
@@ -804,16 +840,16 @@
             if not os.path.exists(os.path.join(self.ppath, file)):
                 removelist.append(file)
                 removed = True
-                
+
         if removed:
             for file in removelist:
                 self.pdata[index].remove(file)
             self.setDirty(True)
-        
+
     def __readProject(self, fn):
         """
         Private method to read in a project (.epj or .e4p) file.
-        
+
         @param fn filename of the project file to be read (string)
         @return flag indicating success
         """
@@ -826,17 +862,21 @@
             f = QFile(fn)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
                 from EricXML.ProjectReader import ProjectReader
+
                 reader = ProjectReader(f, self)
                 reader.readXML()
                 res = not reader.hasError()
                 f.close()
-                
+
                 # create hash value, if it doesn't have one
                 if reader.version.startswith("5.") and not self.pdata["HASH"]:
-                    hashStr = str(QCryptographicHash.hash(
-                        QByteArray(self.ppath.encode("utf-8")),
-                        QCryptographicHash.Algorithm.Sha1).toHex(),
-                        encoding="utf-8")
+                    hashStr = str(
+                        QCryptographicHash.hash(
+                            QByteArray(self.ppath.encode("utf-8")),
+                            QCryptographicHash.Algorithm.Sha1,
+                        ).toHex(),
+                        encoding="utf-8",
+                    )
                     self.pdata["HASH"] = hashStr
                     self.setDirty(True)
             else:
@@ -844,33 +884,33 @@
                     self.ui,
                     self.tr("Read Project File"),
                     self.tr(
-                        "<p>The project file <b>{0}</b> could not be read."
-                        "</p>")
-                    .format(fn))
+                        "<p>The project file <b>{0}</b> could not be read." "</p>"
+                    ).format(fn),
+                )
                 res = False
-        
+
         if res:
             self.pfile = os.path.abspath(fn)
             self.ppath = os.path.abspath(os.path.dirname(fn))
-            
+
             # insert filename into list of recently opened projects
             self.__syncRecent()
-            
+
             if self.pdata["TRANSLATIONPATTERN"]:
                 self.translationsRoot = self.pdata["TRANSLATIONPATTERN"].split(
-                    "%language%")[0]
+                    "%language%"
+                )[0]
             elif self.pdata["MAINSCRIPT"]:
-                self.translationsRoot = os.path.splitext(
-                    self.pdata["MAINSCRIPT"])[0]
+                self.translationsRoot = os.path.splitext(self.pdata["MAINSCRIPT"])[0]
             if os.path.isdir(os.path.join(self.ppath, self.translationsRoot)):
                 dn = self.translationsRoot
             else:
                 dn = os.path.dirname(self.translationsRoot)
             if dn not in self.subdirs:
                 self.subdirs.append(dn)
-                
+
             self.name = os.path.splitext(os.path.basename(fn))[0]
-            
+
             # check, if the files of the project still exist in the
             # project directory
             self.__checkFilesExist("SOURCES")
@@ -880,32 +920,32 @@
             self.__checkFilesExist("TRANSLATIONS")
             self.__checkFilesExist("RESOURCES")
             self.__checkFilesExist("OTHERS")
-            
+
             # get the names of subdirectories the files are stored in
             for fn in (
-                self.pdata["SOURCES"] +
-                self.pdata["FORMS"] +
-                self.pdata["INTERFACES"] +
-                self.pdata["PROTOCOLS"] +
-                self.pdata["RESOURCES"] +
-                self.pdata["TRANSLATIONS"]
+                self.pdata["SOURCES"]
+                + self.pdata["FORMS"]
+                + self.pdata["INTERFACES"]
+                + self.pdata["PROTOCOLS"]
+                + self.pdata["RESOURCES"]
+                + self.pdata["TRANSLATIONS"]
             ):
                 dn = os.path.dirname(fn)
                 if dn not in self.subdirs:
                     self.subdirs.append(dn)
-            
+
             # get the names of other subdirectories
             for fn in self.pdata["OTHERS"]:
                 dn = os.path.dirname(fn)
                 if dn not in self.otherssubdirs:
                     self.otherssubdirs.append(dn)
-            
+
         return res
 
     def __writeProject(self, fn=None):
         """
         Private method to save the project infos to a project file.
-        
+
         @param fn optional filename of the project file to be written (string).
             If fn is None, the filename stored in the project object
             is used. This is the 'save' action. If fn is given, this filename
@@ -915,33 +955,35 @@
         """
         if self.vcs is not None:
             self.pdata["VCSOPTIONS"] = copy.deepcopy(self.vcs.vcsGetOptions())
-            self.pdata["VCSOTHERDATA"] = copy.deepcopy(
-                self.vcs.vcsGetOtherData())
-        
+            self.pdata["VCSOTHERDATA"] = copy.deepcopy(self.vcs.vcsGetOtherData())
+
         if not self.pdata["HASH"]:
-            hashStr = str(QCryptographicHash.hash(
-                QByteArray(self.ppath.encode("utf-8")),
-                QCryptographicHash.Algorithm.Sha1).toHex(),
-                encoding="utf-8")
+            hashStr = str(
+                QCryptographicHash.hash(
+                    QByteArray(self.ppath.encode("utf-8")),
+                    QCryptographicHash.Algorithm.Sha1,
+                ).toHex(),
+                encoding="utf-8",
+            )
             self.pdata["HASH"] = hashStr
-        
+
         if fn is None:
             fn = self.pfile
-        
+
         with EricOverrideCursor():
             res = self.__projectFile.writeFile(fn)
-        
+
         if res:
             self.pfile = os.path.abspath(fn)
             self.ppath = os.path.abspath(os.path.dirname(fn))
             self.name = os.path.splitext(os.path.basename(fn))[0]
             self.setDirty(False)
-            
+
             # insert filename into list of recently opened projects
             self.__syncRecent()
-        
+
         return res
-        
+
     def __readUserProperties(self):
         """
         Private method to read in the user specific project file (.eqj or
@@ -949,21 +991,20 @@
         """
         if self.pfile is None:
             return
-        
+
         fn1, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}.eqj'.format(fn1))
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.eqj".format(fn1))
         if os.path.exists(fn):
             # try the new JSON based format first
             self.__userProjectFile.readFile(fn)
         else:
             # try the old XML based format second
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}.e4q'.format(fn1))
+            fn = os.path.join(self.getProjectManagementDir(), "{0}.e4q".format(fn1))
             if os.path.exists(fn):
                 f = QFile(fn)
                 if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from EricXML.UserProjectReader import UserProjectReader
+
                     reader = UserProjectReader(f, self)
                     reader.readXML()
                     f.close()
@@ -973,21 +1014,23 @@
                         self.tr("Read User Project Properties"),
                         self.tr(
                             "<p>The user specific project properties file"
-                            " <b>{0}</b> could not be read.</p>").format(fn))
-        
+                            " <b>{0}</b> could not be read.</p>"
+                        ).format(fn),
+                    )
+
     def __writeUserProperties(self):
         """
         Private method to write the user specific project data to a JSON file.
         """
         if self.pfile is None:
             return
-        
+
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.eqj'.format(fn))
-        
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.eqj".format(fn))
+
         with EricOverrideCursor():
             self.__userProjectFile.writeFile(fn)
-    
+
     def __showContextMenuSession(self):
         """
         Private slot called before the Session menu is shown.
@@ -997,21 +1040,17 @@
             enable = False
         else:
             fn, ext = os.path.splitext(os.path.basename(self.pfile))
-            fn_new = os.path.join(self.getProjectManagementDir(),
-                                  '{0}.esj'.format(fn))
-            fn_old = os.path.join(self.getProjectManagementDir(),
-                                  '{0}.e5s'.format(fn))
+            fn_new = os.path.join(self.getProjectManagementDir(), "{0}.esj".format(fn))
+            fn_old = os.path.join(self.getProjectManagementDir(), "{0}.e5s".format(fn))
             enable = os.path.exists(fn_new) or os.path.exists(fn_old)
-        self.sessActGrp.findChild(
-            QAction, "project_load_session").setEnabled(enable)
-        self.sessActGrp.findChild(
-            QAction, "project_delete_session").setEnabled(enable)
-        
+        self.sessActGrp.findChild(QAction, "project_load_session").setEnabled(enable)
+        self.sessActGrp.findChild(QAction, "project_delete_session").setEnabled(enable)
+
     @pyqtSlot()
     def __readSession(self, quiet=False, indicator=""):
         """
         Private method to read in the project session file (.esj or .e5s).
-        
+
         @param quiet flag indicating quiet operations.
                 If this flag is true, no errors are reported.
         @param indicator indicator string (string)
@@ -1021,23 +1060,27 @@
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Read Project Session"),
-                    self.tr("Please save the project first."))
+                    self.tr("Please save the project first."),
+                )
             return
-            
+
         fn1, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}{1}.esj'.format(fn1, indicator))
+        fn = os.path.join(
+            self.getProjectManagementDir(), "{0}{1}.esj".format(fn1, indicator)
+        )
         if os.path.exists(fn):
             # try the new JSON based format first
             self.__sessionFile.readFile(fn)
         else:
             # try the old XML based format second
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}{1}.e5s'.format(fn1, indicator))
+            fn = os.path.join(
+                self.getProjectManagementDir(), "{0}{1}.e5s".format(fn1, indicator)
+            )
             if os.path.exists(fn):
                 f = QFile(fn)
                 if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from EricXML.SessionReader import SessionReader
+
                     reader = SessionReader(f, False)
                     reader.readXML(quiet=quiet)
                     f.close()
@@ -1048,13 +1091,15 @@
                             self.tr("Read project session"),
                             self.tr(
                                 "<p>The project session file <b>{0}</b> could"
-                                " not be read.</p>").format(fn))
-        
+                                " not be read.</p>"
+                            ).format(fn),
+                        )
+
     @pyqtSlot()
     def __writeSession(self, quiet=False, indicator=""):
         """
         Private method to write the session data to an XML file (.esj).
-        
+
         @param quiet flag indicating quiet operations.
             If this flag is true, no errors are reported.
         @param indicator indicator string (string)
@@ -1064,15 +1109,17 @@
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Save Project Session"),
-                    self.tr("Please save the project first."))
+                    self.tr("Please save the project first."),
+                )
             return
-        
+
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}{1}.esj'.format(fn, indicator))
-        
+        fn = os.path.join(
+            self.getProjectManagementDir(), "{0}{1}.esj".format(fn, indicator)
+        )
+
         self.__sessionFile.writeFile(fn)
-    
+
     def __deleteSession(self):
         """
         Private method to delete the session file.
@@ -1081,14 +1128,16 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Delete Project Session"),
-                self.tr("Please save the project first."))
+                self.tr("Please save the project first."),
+            )
             return
-            
+
         fname, ext = os.path.splitext(os.path.basename(self.pfile))
-        
+
         for ext in (".esj", ".e5s", ".e4s"):
             fn = os.path.join(
-                self.getProjectManagementDir(), "{0}{1}".format(fname, ext))
+                self.getProjectManagementDir(), "{0}{1}".format(fname, ext)
+            )
             if os.path.exists(fn):
                 try:
                     os.remove(fn)
@@ -1098,8 +1147,10 @@
                         self.tr("Delete Project Session"),
                         self.tr(
                             "<p>The project session file <b>{0}</b> could"
-                            " not be deleted.</p>").format(fn))
-        
+                            " not be deleted.</p>"
+                        ).format(fn),
+                    )
+
     def __readTasks(self):
         """
         Private method to read in the project tasks file (.etj or .e6t).
@@ -1108,23 +1159,23 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Read Tasks"),
-                self.tr("Please save the project first."))
+                self.tr("Please save the project first."),
+            )
             return
-        
+
         base, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}.etj'.format(base))
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.etj".format(base))
         if os.path.exists(fn):
             # try new style JSON file first
             self.__tasksFile.readFile(fn)
         else:
             # try old style XML file second
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}.e6t'.format(base))
+            fn = os.path.join(self.getProjectManagementDir(), "{0}.e6t".format(base))
             if os.path.exists(fn):
                 f = QFile(fn)
                 if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from EricXML.TasksReader import TasksReader
+
                     reader = TasksReader(f, True)
                     reader.readXML()
                     f.close()
@@ -1133,23 +1184,22 @@
                         self.ui,
                         self.tr("Read Tasks"),
                         self.tr(
-                            "<p>The tasks file <b>{0}</b> could not be read."
-                            "</p>")
-                        .format(fn))
-        
+                            "<p>The tasks file <b>{0}</b> could not be read." "</p>"
+                        ).format(fn),
+                    )
+
     def writeTasks(self):
         """
         Public method to write the tasks data to a JSON file (.etj).
         """
         if self.pfile is None:
             return
-            
+
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}.etj'.format(fn))
+
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.etj".format(fn))
         self.__tasksFile.writeFile(fn)
-    
+
     def __showContextMenuDebugger(self):
         """
         Private slot called before the Debugger menu is shown.
@@ -1160,24 +1210,24 @@
         else:
             fn, ext = os.path.splitext(os.path.basename(self.pfile))
             # try new style file first
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}.edj'.format(fn))
+            fn = os.path.join(self.getProjectManagementDir(), "{0}.edj".format(fn))
             if not os.path.exists(fn):
                 # try old style file second
-                fn = os.path.join(self.getProjectManagementDir(),
-                                  '{0}.e4d'.format(fn))
+                fn = os.path.join(self.getProjectManagementDir(), "{0}.e4d".format(fn))
             enable = os.path.exists(fn)
         self.dbgActGrp.findChild(
-            QAction, "project_debugger_properties_load").setEnabled(enable)
+            QAction, "project_debugger_properties_load"
+        ).setEnabled(enable)
         self.dbgActGrp.findChild(
-            QAction, "project_debugger_properties_delete").setEnabled(enable)
-        
+            QAction, "project_debugger_properties_delete"
+        ).setEnabled(enable)
+
     @pyqtSlot()
     def __readDebugProperties(self, quiet=False):
         """
         Private method to read in the project debugger properties file
         (.edj or .e4d).
-        
+
         @param quiet flag indicating quiet operations.
             If this flag is true, no errors are reported.
         """
@@ -1186,12 +1236,12 @@
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Read Debugger Properties"),
-                    self.tr("Please save the project first."))
+                    self.tr("Please save the project first."),
+                )
             return
-        
+
         fn1, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}.edj'.format(fn1))
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.edj".format(fn1))
         if os.path.exists(fn):
             # try the new JSON based format first
             if self.__debuggerPropertiesFile.readFile(fn):
@@ -1199,14 +1249,12 @@
                 self.debugPropertiesChanged = False
         else:
             # try the old XML based format second
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}.e4d'.format(fn1))
-            
+            fn = os.path.join(self.getProjectManagementDir(), "{0}.e4d".format(fn1))
+
             f = QFile(fn)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
-                from EricXML.DebuggerPropertiesReader import (
-                    DebuggerPropertiesReader
-                )
+                from EricXML.DebuggerPropertiesReader import DebuggerPropertiesReader
+
                 reader = DebuggerPropertiesReader(f, self)
                 reader.readXML(quiet=quiet)
                 f.close()
@@ -1219,13 +1267,15 @@
                         self.tr("Read Debugger Properties"),
                         self.tr(
                             "<p>The project debugger properties file"
-                            " <b>{0}</b> could not be read.</p>").format(fn))
-    
+                            " <b>{0}</b> could not be read.</p>"
+                        ).format(fn),
+                    )
+
     @pyqtSlot()
     def __writeDebugProperties(self, quiet=False):
         """
         Private method to write the project debugger properties file (.edj).
-        
+
         @param quiet flag indicating quiet operations.
                 If this flag is true, no errors are reported.
         """
@@ -1234,15 +1284,16 @@
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Save Debugger Properties"),
-                    self.tr("Please save the project first."))
+                    self.tr("Please save the project first."),
+                )
             return
-        
+
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.edj'.format(fn))
-        
+        fn = os.path.join(self.getProjectManagementDir(), "{0}.edj".format(fn))
+
         with EricOverrideCursor():
             self.__debuggerPropertiesFile.writeFile(fn)
-    
+
     def __deleteDebugProperties(self):
         """
         Private method to delete the project debugger properties file
@@ -1252,14 +1303,16 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Delete Debugger Properties"),
-                self.tr("Please save the project first."))
+                self.tr("Please save the project first."),
+            )
             return
-            
+
         fname, ext = os.path.splitext(os.path.basename(self.pfile))
-        
+
         for ext in (".edj", ".e4d"):
-            fn = os.path.join(self.getProjectManagementDir(),
-                              "{0}{1}".format(fname, ext))
+            fn = os.path.join(
+                self.getProjectManagementDir(), "{0}{1}".format(fname, ext)
+            )
             if os.path.exists(fn):
                 try:
                     os.remove(fn)
@@ -1269,9 +1322,10 @@
                         self.tr("Delete Debugger Properties"),
                         self.tr(
                             "<p>The project debugger properties file"
-                            " <b>{0}</b> could not be deleted.</p>")
-                        .format(fn))
-        
+                            " <b>{0}</b> could not be deleted.</p>"
+                        ).format(fn),
+                    )
+
     def __initDebugProperties(self):
         """
         Private method to initialize the debug properties.
@@ -1294,46 +1348,60 @@
             "REDIRECT": False,
             "NOENCODING": False,
         }
-    
+
     def isDebugPropertiesLoaded(self):
         """
         Public method to return the status of the debug properties.
-        
+
         @return load status of debug properties (boolean)
         """
         return self.debugPropertiesLoaded
-        
+
     def __showDebugProperties(self):
         """
         Private slot to display the debugger properties dialog.
         """
         from .DebuggerPropertiesDialog import DebuggerPropertiesDialog
+
         dlg = DebuggerPropertiesDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.storeData()
-        
+
     def getDebugProperty(self, key):
         """
         Public method to retrieve a debugger property.
-        
+
         @param key key of the property (string)
         @return value of the property
         """
         if key == "INTERPRETER":
             return (
-                ericApp().getObject("VirtualEnvManager")
+                ericApp()
+                .getObject("VirtualEnvManager")
                 .getVirtualenvInterpreter(self.debugProperties["VIRTUALENV"])
             )
         else:
             return self.debugProperties[key]
-    
-    def setDbgInfo(self, venvName, argv, wd, env, excReporting, excList,
-                   excIgnoreList, autoClearShell, tracePython=None,
-                   autoContinue=None, enableMultiprocess=None,
-                   multiprocessNoDebug=None, configOverride=None):
+
+    def setDbgInfo(
+        self,
+        venvName,
+        argv,
+        wd,
+        env,
+        excReporting,
+        excList,
+        excIgnoreList,
+        autoClearShell,
+        tracePython=None,
+        autoContinue=None,
+        enableMultiprocess=None,
+        multiprocessNoDebug=None,
+        configOverride=None,
+    ):
         """
         Public method to set the debugging information.
-        
+
         @param venvName name of the virtual environment used
         @type str
         @param argv command line arguments to be used
@@ -1372,8 +1440,8 @@
         self.dbgWd = wd
         self.dbgEnv = env
         self.dbgReportExceptions = excReporting
-        self.dbgExcList = excList[:]                # keep a copy of the list
-        self.dbgExcIgnoreList = excIgnoreList[:]    # keep a copy of the list
+        self.dbgExcList = excList[:]  # keep a copy of the list
+        self.dbgExcIgnoreList = excIgnoreList[:]  # keep a copy of the list
         self.dbgAutoClearShell = autoClearShell
         if tracePython is not None:
             self.dbgTracePython = tracePython
@@ -1385,24 +1453,24 @@
             self.dbgMultiprocessNoDebug = multiprocessNoDebug
         if configOverride is not None:
             self.dbgGlobalConfigOverride = copy.deepcopy(configOverride)
-    
+
     def getTranslationPattern(self):
         """
         Public method to get the translation pattern.
-        
+
         @return translation pattern (string)
         """
         return self.pdata["TRANSLATIONPATTERN"]
-    
+
     def setTranslationPattern(self, pattern):
         """
         Public method to set the translation pattern.
-        
+
         @param pattern translation pattern
         @type str
         """
         self.pdata["TRANSLATIONPATTERN"] = pattern
-    
+
     def addLanguage(self):
         """
         Public slot used to add a language to the project.
@@ -1411,43 +1479,53 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Add Language"),
-                self.tr(
-                    "You have to specify a translation pattern first."))
+                self.tr("You have to specify a translation pattern first."),
+            )
             return
-        
+
         from .AddLanguageDialog import AddLanguageDialog
+
         dlg = AddLanguageDialog(self.parent())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             lang = dlg.getSelectedLanguage()
             if self.pdata["PROJECTTYPE"] in [
-                "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-                "PySide2", "PySide2C", "PySide6", "PySide6C"
+                "PyQt5",
+                "PyQt5C",
+                "PyQt6",
+                "PyQt6C",
+                "E7Plugin",
+                "PySide2",
+                "PySide2C",
+                "PySide6",
+                "PySide6C",
             ]:
-                langFile = self.pdata["TRANSLATIONPATTERN"].replace(
-                    "%language%", lang)
+                langFile = self.pdata["TRANSLATIONPATTERN"].replace("%language%", lang)
                 self.appendFile(langFile)
             self.projectLanguageAddedByCode.emit(lang)
-        
+
     def __binaryTranslationFile(self, langFile):
         """
         Private method to calculate the filename of the binary translations
         file given the name of the raw translations file.
-        
+
         @param langFile name of the raw translations file (string)
         @return name of the binary translations file (string)
         """
         qmFile = ""
         try:
-            if self.__binaryTranslationsCallbacks[
-                    self.pdata["PROJECTTYPE"]] is not None:
-                qmFile = self.__binaryTranslationsCallbacks[
-                    self.pdata["PROJECTTYPE"]](langFile)
+            if (
+                self.__binaryTranslationsCallbacks[self.pdata["PROJECTTYPE"]]
+                is not None
+            ):
+                qmFile = self.__binaryTranslationsCallbacks[self.pdata["PROJECTTYPE"]](
+                    langFile
+                )
         except KeyError:
-            qmFile = langFile.replace('.ts', '.qm')
+            qmFile = langFile.replace(".ts", ".qm")
         if qmFile == langFile:
             qmFile = ""
         return qmFile
-        
+
     def checkLanguageFiles(self):
         """
         Public slot to check the language files after a release process.
@@ -1456,25 +1534,23 @@
         for langFile in self.pdata["TRANSLATIONS"][:]:
             qmFile = self.__binaryTranslationFile(langFile)
             if qmFile:
-                if (
-                    qmFile not in self.pdata["TRANSLATIONS"] and
-                    os.path.exists(os.path.join(self.ppath, qmFile))
+                if qmFile not in self.pdata["TRANSLATIONS"] and os.path.exists(
+                    os.path.join(self.ppath, qmFile)
                 ):
                     self.appendFile(qmFile)
                 if tbPath:
                     qmFile = os.path.join(tbPath, os.path.basename(qmFile))
-                    if (
-                        qmFile not in self.pdata["TRANSLATIONS"] and
-                        os.path.exists(os.path.join(self.ppath, qmFile))
+                    if qmFile not in self.pdata["TRANSLATIONS"] and os.path.exists(
+                        os.path.join(self.ppath, qmFile)
                     ):
                         self.appendFile(qmFile)
-        
+
     def removeLanguageFile(self, langFile):
         """
         Public slot to remove a translation from the project.
-        
+
         The translation file is not deleted from the project directory.
-        
+
         @param langFile the translation file to be removed (string)
         """
         langFile = self.getRelativePath(langFile)
@@ -1485,26 +1561,28 @@
             with contextlib.suppress(ValueError):
                 if self.pdata["TRANSLATIONSBINPATH"]:
                     qmFile = self.getRelativePath(
-                        os.path.join(self.pdata["TRANSLATIONSBINPATH"],
-                                     os.path.basename(qmFile)))
+                        os.path.join(
+                            self.pdata["TRANSLATIONSBINPATH"], os.path.basename(qmFile)
+                        )
+                    )
                 self.pdata["TRANSLATIONS"].remove(qmFile)
                 self.__model.removeItem(qmFile)
         self.setDirty(True)
-        
+
     def deleteLanguageFile(self, langFile):
         """
         Public slot to delete a translation from the project directory.
-        
+
         @param langFile the translation file to be removed (string)
         """
         try:
             from send2trash import send2trash as s2t
         except ImportError:
             s2t = os.remove
-        
+
         langFile = self.getRelativePath(langFile)
         qmFile = self.__binaryTranslationFile(langFile)
-        
+
         try:
             fn = os.path.join(self.ppath, langFile)
             if os.path.exists(fn):
@@ -1515,19 +1593,22 @@
                 self.tr("Delete translation"),
                 self.tr(
                     "<p>The selected translation file <b>{0}</b> could not be"
-                    " deleted.</p><p>Reason: {1}</p>").format(
-                    langFile, str(err)))
+                    " deleted.</p><p>Reason: {1}</p>"
+                ).format(langFile, str(err)),
+            )
             return
-        
+
         self.removeLanguageFile(langFile)
-        
+
         # now get rid of the .qm file
         if qmFile:
             try:
                 if self.pdata["TRANSLATIONSBINPATH"]:
                     qmFile = self.getRelativePath(
-                        os.path.join(self.pdata["TRANSLATIONSBINPATH"],
-                                     os.path.basename(qmFile)))
+                        os.path.join(
+                            self.pdata["TRANSLATIONSBINPATH"], os.path.basename(qmFile)
+                        )
+                    )
                 fn = os.path.join(self.ppath, qmFile)
                 if os.path.exists(fn):
                     s2t(fn)
@@ -1537,14 +1618,15 @@
                     self.tr("Delete translation"),
                     self.tr(
                         "<p>The selected translation file <b>{0}</b> could"
-                        " not be deleted.</p><p>Reason: {1}</p>").format(
-                        qmFile, str(err)))
+                        " not be deleted.</p><p>Reason: {1}</p>"
+                    ).format(qmFile, str(err)),
+                )
                 return
-        
+
     def appendFile(self, fn, isSourceFile=False, updateModel=True):
         """
         Public method to append a file to the project.
-        
+
         @param fn filename to be added to the project (string)
         @param isSourceFile flag indicating that this is a source file
             even if it doesn't have the source extension (boolean)
@@ -1552,31 +1634,29 @@
             requested (boolean)
         """
         dirty = False
-        
+
         # make it relative to the project root, if it starts with that path
         # assume relative paths are relative to the project root
         newfn = self.getRelativePath(fn) if os.path.isabs(fn) else fn
         newdir = os.path.dirname(newfn)
-        
+
         if isSourceFile:
             filetype = "SOURCES"
         else:
             filetype = "OTHERS"
             bfn = os.path.basename(newfn)
-            if fnmatch.fnmatch(bfn, '*.ts') or fnmatch.fnmatch(bfn, '*.qm'):
+            if fnmatch.fnmatch(bfn, "*.ts") or fnmatch.fnmatch(bfn, "*.qm"):
                 filetype = "TRANSLATIONS"
             else:
-                for pattern in sorted(self.pdata["FILETYPES"].keys(),
-                                      reverse=True):
+                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
                         filetype = self.pdata["FILETYPES"][pattern]
                         break
-        
+
         if filetype == "__IGNORE__":
             return
-        
-        if filetype in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS",
-                        "RESOURCES"]:
+
+        if filetype in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES"]:
             if filetype == "SOURCES":
                 if newfn not in self.pdata["SOURCES"]:
                     self.pdata["SOURCES"].append(newfn)
@@ -1597,8 +1677,7 @@
                 if newfn not in self.pdata["INTERFACES"]:
                     self.pdata["INTERFACES"].append(newfn)
                     self.projectInterfaceAdded.emit(newfn)
-                    (updateModel and
-                     self.__model.addNewItem("INTERFACES", newfn))
+                    (updateModel and self.__model.addNewItem("INTERFACES", newfn))
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
@@ -1606,8 +1685,7 @@
                 if newfn not in self.pdata["PROTOCOLS"]:
                     self.pdata["PROTOCOLS"].append(newfn)
                     self.projectProtocolAdded.emit(newfn)
-                    (updateModel and
-                     self.__model.addNewItem("PROTOCOLS", newfn))
+                    (updateModel and self.__model.addNewItem("PROTOCOLS", newfn))
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
@@ -1629,24 +1707,24 @@
                 dirty = True
             else:
                 updateModel and self.repopulateItem(newfn)
-        else:   # filetype == "OTHERS"
+        else:  # filetype == "OTHERS"
             if newfn not in self.pdata["OTHERS"]:
-                self.pdata['OTHERS'].append(newfn)
+                self.pdata["OTHERS"].append(newfn)
                 self.othersAdded(newfn, updateModel)
                 dirty = True
             else:
                 updateModel and self.repopulateItem(newfn)
             if newdir not in self.otherssubdirs:
                 self.otherssubdirs.append(newdir)
-        
+
         if dirty:
             self.setDirty(True)
-        
+
     @pyqtSlot()
     def addFiles(self, fileTypeFilter=None, startdir=None):
         """
         Public slot used to add files to the project.
-        
+
         @param fileTypeFilter filter to be used by the add file dialog
         @type str out of source, form, resource, interface, protocol, others
         @param startdir start directory for the selection dialog
@@ -1655,30 +1733,31 @@
         if startdir is None:
             startdir = self.ppath
         from .AddFileDialog import AddFileDialog
-        dlg = AddFileDialog(self, self.parent(), fileTypeFilter,
-                            startdir=startdir)
+
+        dlg = AddFileDialog(self, self.parent(), fileTypeFilter, startdir=startdir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             fnames, target, isSource = dlg.getData()
-            if target != '':
+            if target != "":
                 for fn in fnames:
                     targetfile = os.path.join(target, os.path.basename(fn))
                     if not Utilities.samepath(os.path.dirname(fn), target):
                         try:
                             if not os.path.isdir(target):
                                 os.makedirs(target)
-                                
+
                             if os.path.exists(targetfile):
                                 res = EricMessageBox.yesNo(
                                     self.ui,
                                     self.tr("Add file"),
                                     self.tr(
                                         "<p>The file <b>{0}</b> already"
-                                        " exists.</p><p>Overwrite it?</p>")
-                                    .format(targetfile),
-                                    icon=EricMessageBox.Warning)
+                                        " exists.</p><p>Overwrite it?</p>"
+                                    ).format(targetfile),
+                                    icon=EricMessageBox.Warning,
+                                )
                                 if not res:
                                     return  # don't overwrite
-                                    
+
                             shutil.copy(fn, target)
                         except OSError as why:
                             EricMessageBox.critical(
@@ -1687,23 +1766,24 @@
                                 self.tr(
                                     "<p>The selected file <b>{0}</b> could"
                                     " not be added to <b>{1}</b>.</p>"
-                                    "<p>Reason: {2}</p>")
-                                .format(fn, target, str(why)))
+                                    "<p>Reason: {2}</p>"
+                                ).format(fn, target, str(why)),
+                            )
                             continue
-                    
-                    self.appendFile(targetfile,
-                                    isSource or fileTypeFilter == 'source')
+
+                    self.appendFile(targetfile, isSource or fileTypeFilter == "source")
             else:
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Add file"),
-                    self.tr("The target directory must not be empty."))
-        
+                    self.tr("The target directory must not be empty."),
+                )
+
     def __addSingleDirectory(self, filetype, source, target, quiet=False):
         """
         Private method used to add all files of a single directory to the
         project.
-        
+
         @param filetype type of files to add (string)
         @param source source directory (string)
         @param target target directory (string)
@@ -1717,12 +1797,12 @@
                 patterns.append(pattern)
             elif patterntype == "__IGNORE__":
                 ignorePatterns.append(pattern)
-        
+
         files = []
         for pattern in patterns:
             sstring = "{0}{1}{2}".format(source, os.sep, pattern)
             files.extend(glob.glob(sstring))
-        
+
         if len(files) == 0:
             if not quiet:
                 EricMessageBox.information(
@@ -1730,13 +1810,12 @@
                     self.tr("Add directory"),
                     self.tr(
                         "<p>The source directory doesn't contain"
-                        " any files belonging to the selected category.</p>"))
+                        " any files belonging to the selected category.</p>"
+                    ),
+                )
             return
-        
-        if (
-            not Utilities.samepath(target, source) and
-            not os.path.isdir(target)
-        ):
+
+        if not Utilities.samepath(target, source) and not os.path.isdir(target):
             try:
                 os.makedirs(target)
             except OSError as why:
@@ -1745,15 +1824,16 @@
                     self.tr("Add directory"),
                     self.tr(
                         "<p>The target directory <b>{0}</b> could not be"
-                        " created.</p><p>Reason: {1}</p>")
-                    .format(target, str(why)))
+                        " created.</p><p>Reason: {1}</p>"
+                    ).format(target, str(why)),
+                )
                 return
-        
+
         for file in files:
             for pattern in ignorePatterns:
                 if fnmatch.fnmatch(file, pattern):
                     continue
-            
+
             targetfile = os.path.join(target, os.path.basename(file))
             if not Utilities.samepath(target, source):
                 try:
@@ -1763,36 +1843,39 @@
                             self.tr("Add directory"),
                             self.tr(
                                 "<p>The file <b>{0}</b> already exists.</p>"
-                                "<p>Overwrite it?</p>")
-                            .format(targetfile),
-                            icon=EricMessageBox.Warning)
+                                "<p>Overwrite it?</p>"
+                            ).format(targetfile),
+                            icon=EricMessageBox.Warning,
+                        )
                         if not res:
                             continue
                             # don't overwrite, carry on with next file
-                            
+
                     shutil.copy(file, target)
                 except OSError:
                     continue
             self.appendFile(targetfile)
-        
+
     def __addRecursiveDirectory(self, filetype, source, target):
         """
         Private method used to add all files of a directory tree.
-        
+
         The tree is rooted at source to another one rooted at target. This
         method decents down to the lowest subdirectory.
-        
+
         @param filetype type of files to add (string)
         @param source source directory (string)
         @param target target directory (string)
         """
         # first perform the addition of source
         self.__addSingleDirectory(filetype, source, target, True)
-        
-        ignore_patterns = [pattern for pattern, filetype in
-                           self.pdata["FILETYPES"].items()
-                           if filetype == '__IGNORE__']
-        
+
+        ignore_patterns = [
+            pattern
+            for pattern, filetype in self.pdata["FILETYPES"].items()
+            if filetype == "__IGNORE__"
+        ]
+
         # now recurse into subdirectories
         for name in os.listdir(source):
             ns = os.path.join(source, name)
@@ -1804,15 +1887,15 @@
                         break
                 if skip:
                     continue
-                
+
                 nt = os.path.join(target, name)
                 self.__addRecursiveDirectory(filetype, ns, nt)
-        
+
     @pyqtSlot()
     def addDirectory(self, fileTypeFilter=None, startdir=None):
         """
         Public method used to add all files of a directory to the project.
-        
+
         @param fileTypeFilter filter to be used by the add directory dialog
         @type str out of source, form, resource, interface, protocol, others
         @param startdir start directory for the selection dialog
@@ -1821,135 +1904,137 @@
         if startdir is None:
             startdir = self.ppath
         from .AddDirectoryDialog import AddDirectoryDialog
-        dlg = AddDirectoryDialog(
-            self, fileTypeFilter, self.parent(), startdir=startdir)
+
+        dlg = AddDirectoryDialog(self, fileTypeFilter, self.parent(), startdir=startdir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             filetype, source, target, recursive = dlg.getData()
-            if target == '':
+            if target == "":
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Add directory"),
-                    self.tr("The target directory must not be empty."))
+                    self.tr("The target directory must not be empty."),
+                )
                 return
-            
-            if filetype == 'OTHERS':
+
+            if filetype == "OTHERS":
                 self.addToOthers(source)
                 return
-            
-            if source == '':
+
+            if source == "":
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Add directory"),
-                    self.tr("The source directory must not be empty."))
+                    self.tr("The source directory must not be empty."),
+                )
                 return
-            
+
             if recursive:
                 self.__addRecursiveDirectory(filetype, source, target)
             else:
                 self.__addSingleDirectory(filetype, source, target)
-        
+
     def addToOthers(self, fn):
         """
         Public method to add a file/directory to the OTHERS project data.
-        
+
         @param fn file name or directory name to add (string)
         """
         if fn:
             # if it is below the project directory, make it relative to that
             fn = self.getRelativePath(fn)
-            
+
             # if it ends with the directory separator character, remove it
             if fn.endswith(os.sep):
                 fn = fn[:-1]
-            
+
             if fn not in self.pdata["OTHERS"]:
-                self.pdata['OTHERS'].append(fn)
+                self.pdata["OTHERS"].append(fn)
                 self.othersAdded(fn)
                 self.setDirty(True)
-            
+
             if os.path.isdir(fn) and fn not in self.otherssubdirs:
                 self.otherssubdirs.append(fn)
-        
+
     def addSourceFiles(self):
         """
         Public slot to add source files to the current project.
         """
-        self.addFiles('source')
-        
+        self.addFiles("source")
+
     def addUiFiles(self):
         """
         Public slot to add forms to the current project.
         """
-        self.addFiles('form')
-        
+        self.addFiles("form")
+
     def addIdlFiles(self):
         """
         Public slot to add IDL interfaces to the current project.
         """
-        self.addFiles('interface')
-        
+        self.addFiles("interface")
+
     def addProtoFiles(self):
         """
         Public slot to add protocol files to the current project.
         """
-        self.addFiles('protocol')
-        
+        self.addFiles("protocol")
+
     def addResourceFiles(self):
         """
         Public slot to add Qt resources to the current project.
         """
-        self.addFiles('resource')
-        
+        self.addFiles("resource")
+
     def addOthersFiles(self):
         """
         Public slot to add files to the OTHERS project data.
         """
-        self.addFiles('others')
-        
+        self.addFiles("others")
+
     def addSourceDir(self):
         """
         Public slot to add all source files of a directory to the current
         project.
         """
-        self.addDirectory('source')
-        
+        self.addDirectory("source")
+
     def addUiDir(self):
         """
         Public slot to add all forms of a directory to the current project.
         """
-        self.addDirectory('form')
-        
+        self.addDirectory("form")
+
     def addIdlDir(self):
         """
         Public slot to add all IDL interfaces of a directory to the current
         project.
         """
-        self.addDirectory('interface')
-        
+        self.addDirectory("interface")
+
     def addProtoDir(self):
         """
         Public slot to add all protocol files of a directory to the current
         project.
         """
-        self.addDirectory('protocol')
-        
+        self.addDirectory("protocol")
+
     def addResourceDir(self):
         """
         Public slot to add all Qt resource files of a directory to the current
         project.
         """
-        self.addDirectory('resource')
-        
+        self.addDirectory("resource")
+
     def addOthersDir(self):
         """
         Public slot to add a directory to the OTHERS project data.
         """
-        self.addDirectory('others')
-        
+        self.addDirectory("others")
+
     def renameMainScript(self, oldfn, newfn):
         """
         Public method to rename the main script.
-        
+
         @param oldfn old filename (string)
         @param newfn new filename of the main script (string)
         """
@@ -1957,44 +2042,47 @@
             ofn = self.getRelativePath(oldfn)
             if ofn != self.pdata["MAINSCRIPT"]:
                 return
-            
+
             fn = self.getRelativePath(newfn)
             self.pdata["MAINSCRIPT"] = fn
             self.setDirty(True)
-        
+
     def renameFile(self, oldfn, newfn=None):
         """
         Public slot to rename a file of the project.
-        
+
         @param oldfn old filename of the file (string)
         @param newfn new filename of the file (string)
         @return flag indicating success
         """
         fn = self.getRelativePath(oldfn)
         isSourceFile = fn in self.pdata["SOURCES"]
-        
+
         if newfn is None:
             newfn = EricFileDialog.getSaveFileName(
                 None,
                 self.tr("Rename file"),
                 oldfn,
                 "",
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if not newfn:
                 return False
             newfn = Utilities.toNativeSeparators(newfn)
-        
+
         if os.path.exists(newfn):
             res = EricMessageBox.yesNo(
                 self.ui,
                 self.tr("Rename File"),
-                self.tr("""<p>The file <b>{0}</b> already exists."""
-                        """ Overwrite it?</p>""")
-                    .format(newfn),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    """<p>The file <b>{0}</b> already exists."""
+                    """ Overwrite it?</p>"""
+                ).format(newfn),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return False
-        
+
         try:
             os.rename(oldfn, newfn)
         except OSError as msg:
@@ -2003,26 +2091,28 @@
                 self.tr("Rename File"),
                 self.tr(
                     """<p>The file <b>{0}</b> could not be renamed.<br />"""
-                    """Reason: {1}</p>""").format(oldfn, str(msg)))
+                    """Reason: {1}</p>"""
+                ).format(oldfn, str(msg)),
+            )
             return False
 
         if (
-            fn in self.pdata["SOURCES"] or
-            fn in self.pdata["FORMS"] or
-            fn in self.pdata["TRANSLATIONS"] or
-            fn in self.pdata["INTERFACES"] or
-            fn in self.pdata["PROTOCOLS"] or
-            fn in self.pdata["RESOURCES"] or
-            fn in self.pdata["OTHERS"]
+            fn in self.pdata["SOURCES"]
+            or fn in self.pdata["FORMS"]
+            or fn in self.pdata["TRANSLATIONS"]
+            or fn in self.pdata["INTERFACES"]
+            or fn in self.pdata["PROTOCOLS"]
+            or fn in self.pdata["RESOURCES"]
+            or fn in self.pdata["OTHERS"]
         ):
             self.renameFileInPdata(oldfn, newfn, isSourceFile)
-        
+
         return True
-        
+
     def renameFileInPdata(self, oldname, newname, isSourceFile=False):
         """
         Public method to rename a file in the pdata structure.
-        
+
         @param oldname old filename (string)
         @param newname new filename (string)
         @param isSourceFile flag indicating that this is a source file
@@ -2038,94 +2128,131 @@
             self.removeFile(oldname)
             self.appendFile(newname, isSourceFile)
         self.projectFileRenamed.emit(oldname, newname)
-        
+
         self.renameMainScript(fn, newname)
-        
+
     def getFiles(self, start):
         """
         Public method to get all files starting with a common prefix.
-        
+
         @param start prefix (string)
         @return list of files starting with a common prefix (list of strings)
         """
         filelist = []
         start = self.getRelativePath(start)
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "OTHERS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "OTHERS",
+        ]:
             for entry in self.pdata[key][:]:
                 if entry.startswith(start):
                     filelist.append(os.path.join(self.ppath, entry))
         return filelist
-        
+
     def __reorganizeFiles(self):
         """
         Private method to reorganize files stored in the project.
         """
         reorganized = False
-        
+
         # init data store for the reorganization
         newPdata = {}
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "OTHERS", "TRANSLATIONS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "OTHERS",
+            "TRANSLATIONS",
+        ]:
             newPdata[key] = []
-        
+
         # iterate over all files checking for a reassignment
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "OTHERS", "TRANSLATIONS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "OTHERS",
+            "TRANSLATIONS",
+        ]:
             for fn in self.pdata[key][:]:
                 filetype = key
                 bfn = os.path.basename(fn)
-                for pattern in sorted(self.pdata["FILETYPES"].keys(),
-                                      reverse=True):
+                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
                         filetype = self.pdata["FILETYPES"][pattern]
                         break
-        
+
                 if filetype != "__IGNORE__":
                     newPdata[filetype].append(fn)
                     if filetype != key:
                         reorganized = True
-        
+
         if reorganized:
             # copy the reorganized files back to the project
-            for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS",
-                        "RESOURCES", "OTHERS", "TRANSLATIONS"]:
+            for key in [
+                "SOURCES",
+                "FORMS",
+                "INTERFACES",
+                "PROTOCOLS",
+                "RESOURCES",
+                "OTHERS",
+                "TRANSLATIONS",
+            ]:
                 self.pdata[key] = newPdata[key][:]
-            
+
             # repopulate the model
             self.__model.projectClosed(False)
             self.__model.projectOpened()
-        
+
     def copyDirectory(self, olddn, newdn):
         """
         Public slot to copy a directory.
-        
+
         @param olddn original directory name (string)
         @param newdn new directory name (string)
         """
         olddn = self.getRelativePath(olddn)
         newdn = self.getRelativePath(newdn)
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "OTHERS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "OTHERS",
+        ]:
             for entry in self.pdata[key][:]:
                 if entry.startswith(olddn):
                     entry = entry.replace(olddn, newdn)
-                    self.appendFile(os.path.join(self.ppath, entry),
-                                    key == "SOURCES")
+                    self.appendFile(os.path.join(self.ppath, entry), key == "SOURCES")
         self.setDirty(True)
-        
+
     def moveDirectory(self, olddn, newdn):
         """
         Public slot to move a directory.
-        
+
         @param olddn old directory name (string)
         @param newdn new directory name (string)
         """
         olddn = self.getRelativePath(olddn)
         newdn = self.getRelativePath(newdn)
         typeStrings = []
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "OTHERS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "OTHERS",
+        ]:
             for entry in self.pdata[key][:]:
                 if entry.startswith(olddn):
                     if key not in typeStrings:
@@ -2149,13 +2276,13 @@
         else:
             self.__model.renameItem(olddn, self.getAbsolutePath(newdn))
         self.directoryRemoved.emit(olddn)
-        
+
     def removeFile(self, fn, updateModel=True):
         """
         Public slot to remove a file from the project.
-        
+
         The file is not deleted from the project directory.
-        
+
         @param fn filename to be removed from the project
         @param updateModel flag indicating an update of the model is
             requested (boolean)
@@ -2188,13 +2315,13 @@
         updateModel and self.__model.removeItem(fn)
         if dirty:
             self.setDirty(True)
-        
+
     def removeDirectory(self, dn):
         """
         Public method to remove a directory from the project.
-        
+
         The directory is not deleted from the project directory.
-        
+
         @param dn directory name to be removed from the project
         """
         dirty = False
@@ -2204,8 +2331,14 @@
                 self.pdata["OTHERS"].remove(entry)
                 dirty = True
         dn2 = dn if dn.endswith(os.sep) else dn + os.sep
-        for key in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "TRANSLATIONS", ]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "TRANSLATIONS",
+        ]:
             for entry in self.pdata[key][:]:
                 if entry.startswith(dn2):
                     self.pdata[key].remove(entry)
@@ -2214,11 +2347,11 @@
         if dirty:
             self.setDirty(True)
         self.directoryRemoved.emit(dn)
-        
+
     def deleteFile(self, fn):
         """
         Public method to delete a file from the project directory.
-        
+
         @param fn filename to be deleted from the project
         @return flag indicating success (boolean)
         """
@@ -2226,22 +2359,22 @@
             from send2trash import send2trash as s2t
         except ImportError:
             s2t = os.remove
-        
+
         try:
             s2t(os.path.join(self.ppath, fn))
             path, ext = os.path.splitext(fn)
-            if ext == '.ui':
-                fn2 = os.path.join(self.ppath, '{0}.h'.format(fn))
+            if ext == ".ui":
+                fn2 = os.path.join(self.ppath, "{0}.h".format(fn))
                 if os.path.isfile(fn2):
                     s2t(fn2)
             head, tail = os.path.split(path)
-            for ext in ['.pyc', '.pyo']:
+            for ext in [".pyc", ".pyo"]:
                 fn2 = os.path.join(self.ppath, path + ext)
                 if os.path.isfile(fn2):
                     s2t(fn2)
                 pat = os.path.join(
-                    self.ppath, head,
-                    "__pycache__", "{0}.*{1}".format(tail, ext))
+                    self.ppath, head, "__pycache__", "{0}.*{1}".format(tail, ext)
+                )
                 for f in glob.glob(pat):
                     s2t(f)
         except OSError as err:
@@ -2250,19 +2383,20 @@
                 self.tr("Delete file"),
                 self.tr(
                     "<p>The selected file <b>{0}</b> could not be"
-                    " deleted.</p><p>Reason: {1}</p>").format(
-                    fn, str(err)))
+                    " deleted.</p><p>Reason: {1}</p>"
+                ).format(fn, str(err)),
+            )
             return False
-        
+
         self.removeFile(fn)
-        if ext == '.ui':
-            self.removeFile(fn + '.h')
+        if ext == ".ui":
+            self.removeFile(fn + ".h")
         return True
-        
+
     def deleteDirectory(self, dn):
         """
         Public method to delete a directory from the project directory.
-        
+
         @param dn directory name to be removed from the project
         @return flag indicating success (boolean)
         """
@@ -2271,6 +2405,7 @@
         try:
             try:
                 from send2trash import send2trash
+
                 send2trash(dn)
             except ImportError:
                 shutil.rmtree(dn, True)
@@ -2280,45 +2415,48 @@
                 self.tr("Delete directory"),
                 self.tr(
                     "<p>The selected directory <b>{0}</b> could not be"
-                    " deleted.</p><p>Reason: {1}</p>").format(dn, str(err)))
+                    " deleted.</p><p>Reason: {1}</p>"
+                ).format(dn, str(err)),
+            )
             return False
-        
+
         self.removeDirectory(dn)
         return True
-    
+
     def hasEntry(self, fn):
         """
         Public method to check the project for a file.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating, if the project contains the file (boolean)
         """
         fn = self.getRelativePath(fn)
         return (
-            fn in self.pdata["SOURCES"] or
-            fn in self.pdata["FORMS"] or
-            fn in self.pdata["INTERFACES"] or
-            fn in self.pdata["PROTOCOLS"] or
-            fn in self.pdata["RESOURCES"] or
-            fn in self.pdata["OTHERS"]
+            fn in self.pdata["SOURCES"]
+            or fn in self.pdata["FORMS"]
+            or fn in self.pdata["INTERFACES"]
+            or fn in self.pdata["PROTOCOLS"]
+            or fn in self.pdata["RESOURCES"]
+            or fn in self.pdata["OTHERS"]
         )
-        
+
     def createNewProject(self):
         """
         Public slot to built a new project.
-        
+
         This method displays the new project dialog and initializes
         the project object with the data entered.
         """
         if not self.checkDirty():
             return
-            
+
         from .PropertiesDialog import PropertiesDialog
+
         dlg = PropertiesDialog(self, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.closeProject()
             dlg.storeData()
-            self.pdata["VCS"] = 'None'
+            self.pdata["VCS"] = "None"
             self.opened = True
             if not self.pdata["FILETYPES"]:
                 self.initFileTypes()
@@ -2339,31 +2477,30 @@
             self.menuDiagramAct.setEnabled(True)
             self.menuApidocAct.setEnabled(True)
             self.menuPackagersAct.setEnabled(True)
-            self.pluginGrp.setEnabled(
-                self.pdata["PROJECTTYPE"] in ["E7Plugin"])
-            self.addLanguageAct.setEnabled(
-                bool(self.pdata["TRANSLATIONPATTERN"]))
-            self.makeGrp.setEnabled(
-                self.pdata["MAKEPARAMS"]["MakeEnabled"])
-            self.menuMakeAct.setEnabled(
-                self.pdata["MAKEPARAMS"]["MakeEnabled"])
+            self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
+            self.addLanguageAct.setEnabled(bool(self.pdata["TRANSLATIONPATTERN"]))
+            self.makeGrp.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
+            self.menuMakeAct.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
             self.menuOtherToolsAct.setEnabled(True)
             self.menuFormattingAct.setEnabled(True)
-            
+
             self.projectAboutToBeCreated.emit()
-            
-            hashStr = str(QCryptographicHash.hash(
-                QByteArray(self.ppath.encode("utf-8")),
-                QCryptographicHash.Algorithm.Sha1).toHex(),
-                encoding="utf-8")
+
+            hashStr = str(
+                QCryptographicHash.hash(
+                    QByteArray(self.ppath.encode("utf-8")),
+                    QCryptographicHash.Algorithm.Sha1,
+                ).toHex(),
+                encoding="utf-8",
+            )
             self.pdata["HASH"] = hashStr
-            
+
             if self.pdata["PROGLANGUAGE"] == "MicroPython":
                 # change the lexer association for *.py files
                 self.pdata["LEXERASSOCS"] = {
                     "*.py": "MicroPython",
                 }
-            
+
             # create the project directory if it doesn't exist already
             if not os.path.isdir(self.ppath):
                 try:
@@ -2374,33 +2511,31 @@
                         self.tr("Create project directory"),
                         self.tr(
                             "<p>The project directory <b>{0}</b> could not"
-                            " be created.</p>")
-                        .format(self.ppath))
+                            " be created.</p>"
+                        ).format(self.ppath),
+                    )
                     self.vcs = self.initVCS()
                     return
-                
+
                 # create an empty __init__.py file to make it a Python package
                 # (only for Python and Python3)
-                if self.pdata["PROGLANGUAGE"] in [
-                    "Python3", "MicroPython"
-                ]:
+                if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     with open(fn, "w", encoding="utf-8"):
                         pass
                     self.appendFile(fn, True)
-                
+
                 # create an empty main script file, if a name was given
                 if self.pdata["MAINSCRIPT"]:
                     if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                        ms = os.path.join(
-                            self.ppath, self.pdata["MAINSCRIPT"])
+                        ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
                     else:
                         ms = self.pdata["MAINSCRIPT"]
                     os.makedirs(os.path.dirname(ms), exist_ok=True)
                     with open(ms, "w"):
                         pass
                     self.appendFile(ms, True)
-                
+
                 if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
                     mf = self.pdata["MAKEPARAMS"]["MakeFile"]
                     if mf:
@@ -2412,21 +2547,20 @@
                     with open(mf, "w"):
                         pass
                     self.appendFile(mf)
-                
+
                 tpd = os.path.join(self.ppath, self.translationsRoot)
                 if not self.translationsRoot.endswith(os.sep):
                     tpd = os.path.dirname(tpd)
                 if not os.path.isdir(tpd):
                     os.makedirs(tpd, exist_ok=True)
                 if self.pdata["TRANSLATIONSBINPATH"]:
-                    tpd = os.path.join(
-                        self.ppath, self.pdata["TRANSLATIONSBINPATH"])
+                    tpd = os.path.join(self.ppath, self.pdata["TRANSLATIONSBINPATH"])
                     if not os.path.isdir(tpd):
                         os.makedirs(tpd, exist_ok=True)
-                
+
                 # create management directory if not present
                 self.createProjectManagementDir()
-                
+
                 self.saveProject()
                 addAllToVcs = True
             else:
@@ -2439,14 +2573,14 @@
                         self.tr("Create project management directory"),
                         self.tr(
                             "<p>The project directory <b>{0}</b> is not"
-                            " writable.</p>")
-                        .format(self.ppath))
+                            " writable.</p>"
+                        ).format(self.ppath),
+                    )
                     return
-                
+
                 if self.pdata["MAINSCRIPT"]:
                     if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                        ms = os.path.join(
-                            self.ppath, self.pdata["MAINSCRIPT"])
+                        ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
                     else:
                         ms = self.pdata["MAINSCRIPT"]
                     if not os.path.exists(ms):
@@ -2460,12 +2594,13 @@
                                 self.tr("Create main script"),
                                 self.tr(
                                     "<p>The mainscript <b>{0}</b> could not"
-                                    " be created.<br/>Reason: {1}</p>")
-                                .format(ms, str(err)))
+                                    " be created.<br/>Reason: {1}</p>"
+                                ).format(ms, str(err)),
+                            )
                     self.appendFile(ms, True)
                 else:
                     ms = ""
-                
+
                 if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
                     mf = self.pdata["MAKEPARAMS"]["MakeFile"]
                     if mf:
@@ -2484,36 +2619,37 @@
                                 self.tr("Create Makefile"),
                                 self.tr(
                                     "<p>The makefile <b>{0}</b> could not"
-                                    " be created.<br/>Reason: {1}</p>")
-                                .format(mf, str(err)))
+                                    " be created.<br/>Reason: {1}</p>"
+                                ).format(mf, str(err)),
+                            )
                     self.appendFile(mf)
-                
+
                 # add existing files to the project
                 res = EricMessageBox.yesNo(
                     self.ui,
                     self.tr("New Project"),
                     self.tr("""Add existing files to the project?"""),
-                    yesDefault=True)
+                    yesDefault=True,
+                )
                 if res:
                     self.newProjectAddFiles(ms)
                 addAllToVcs = res
                 # create an empty __init__.py file to make it a Python package
                 # if none exists (only for Python and Python3)
-                if self.pdata["PROGLANGUAGE"] in [
-                    "Python3", "MicroPython"
-                ]:
+                if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     if not os.path.exists(fn):
                         with open(fn, "w", encoding="utf-8"):
                             pass
                         self.appendFile(fn, True)
                 self.saveProject()
-                
+
                 # check, if the existing project directory is already under
                 # VCS control
                 pluginManager = ericApp().getObject("PluginManager")
                 for indicator, vcsData in list(
-                        pluginManager.getVcsSystemIndicators().items()):
+                    pluginManager.getVcsSystemIndicators().items()
+                ):
                     if os.path.exists(os.path.join(self.ppath, indicator)):
                         if len(vcsData) > 1:
                             vcsList = []
@@ -2524,7 +2660,9 @@
                                 self.tr("New Project"),
                                 self.tr("Select Version Control System"),
                                 vcsList,
-                                0, False)
+                                0,
+                                False,
+                            )
                             if vcs_ok:
                                 for vcsSystemStr, vcsSystemDisplay in vcsData:
                                     if res == vcsSystemDisplay:
@@ -2547,13 +2685,16 @@
                                     self.tr("New Project"),
                                     self.tr(
                                         """Would you like to edit the VCS"""
-                                        """ command options?"""))
+                                        """ command options?"""
+                                    ),
+                                )
                             else:
                                 vcores = False
                             if vcores:
                                 from VCS.CommandOptionsDialog import (
-                                    VcsCommandOptionsDialog
+                                    VcsCommandOptionsDialog,
                                 )
+
                                 codlg = VcsCommandOptionsDialog(self.vcs)
                                 if codlg.exec() == QDialog.DialogCode.Accepted:
                                     self.vcs.vcsSetOptions(codlg.getOptions())
@@ -2564,24 +2705,23 @@
                                     self.tr("New project"),
                                     self.tr(
                                         "Shall the project file be added"
-                                        " to the repository?"),
-                                    yesDefault=True)
+                                        " to the repository?"
+                                    ),
+                                    yesDefault=True,
+                                )
                                 if apres:
                                     self.saveProject()
                                     self.vcs.vcsAdd(self.pfile)
                         else:
-                            self.pdata["VCS"] = 'None'
+                            self.pdata["VCS"] = "None"
                         self.saveProject()
                         break
-            
+
             # put the project under VCS control
-            if (
-                self.vcs is None and
-                self.vcsSoftwareAvailable() and
-                self.vcsRequested
-            ):
+            if self.vcs is None and self.vcsSoftwareAvailable() and self.vcsRequested:
                 vcsSystemsDict = (
-                    ericApp().getObject("PluginManager")
+                    ericApp()
+                    .getObject("PluginManager")
                     .getPluginDisplayStrings("version_control")
                 )
                 vcsSystemsDisplay = [self.tr("None")]
@@ -2591,26 +2731,27 @@
                 vcsSelected, ok = QInputDialog.getItem(
                     None,
                     self.tr("New Project"),
-                    self.tr(
-                        "Select version control system for the project"),
+                    self.tr("Select version control system for the project"),
                     vcsSystemsDisplay,
-                    0, False)
+                    0,
+                    False,
+                )
                 if ok and vcsSelected != self.tr("None"):
                     for vcsSystem, vcsSystemDisplay in vcsSystemsDict.items():
                         if vcsSystemDisplay == vcsSelected:
                             self.pdata["VCS"] = vcsSystem
                             break
                     else:
-                        self.pdata["VCS"] = 'None'
+                        self.pdata["VCS"] = "None"
                 else:
-                    self.pdata["VCS"] = 'None'
+                    self.pdata["VCS"] = "None"
                 self.vcs = self.initVCS()
                 if self.vcs is not None:
                     vcsdlg = self.vcs.vcsOptionsDialog(self, self.name)
                     if vcsdlg.exec() == QDialog.DialogCode.Accepted:
                         vcsDataDict = vcsdlg.getData()
                     else:
-                        self.pdata["VCS"] = 'None'
+                        self.pdata["VCS"] = "None"
                         self.vcs = self.initVCS()
                 self.setDirty(True)
                 if self.vcs is not None:
@@ -2621,26 +2762,26 @@
                             self.tr("New Project"),
                             self.tr(
                                 """Would you like to edit the VCS command"""
-                                """ options?"""))
+                                """ options?"""
+                            ),
+                        )
                     else:
                         vcores = False
                     if vcores:
-                        from VCS.CommandOptionsDialog import (
-                            VcsCommandOptionsDialog
-                        )
+                        from VCS.CommandOptionsDialog import VcsCommandOptionsDialog
+
                         codlg = VcsCommandOptionsDialog(self.vcs)
                         if codlg.exec() == QDialog.DialogCode.Accepted:
                             self.vcs.vcsSetOptions(codlg.getOptions())
-                    
+
                     # create the project in the VCS
                     self.vcs.vcsSetDataFromDict(vcsDataDict)
                     self.saveProject()
-                    self.vcs.vcsConvertProject(vcsDataDict, self,
-                                               addAll=addAllToVcs)
+                    self.vcs.vcsConvertProject(vcsDataDict, self, addAll=addAllToVcs)
                 else:
                     self.newProjectHooks.emit()
                     self.newProject.emit()
-            
+
             else:
                 self.newProjectHooks.emit()
                 self.newProject.emit()
@@ -2648,12 +2789,12 @@
     def newProjectAddFiles(self, mainscript):
         """
         Public method to add files to a new project.
-        
+
         @param mainscript name of the mainscript (string)
         """
         # Show the file type associations for the user to change
         self.__showFiletypeAssociations()
-        
+
         with EricOverrideCursor():
             # search the project directory for files with known extensions
             filespecs = list(self.pdata["FILETYPES"].keys())
@@ -2661,7 +2802,7 @@
                 files = Utilities.direntries(self.ppath, True, filespec)
                 for file in files:
                     self.appendFile(file)
-            
+
             # special handling for translation files
             if self.translationsRoot:
                 tpd = os.path.join(self.ppath, self.translationsRoot)
@@ -2675,8 +2816,7 @@
                 if "%language%" in pattern:
                     pattern = pattern.replace("%language%", "*")
                 else:
-                    tpd = self.pdata["TRANSLATIONPATTERN"].split(
-                        "%language%")[0]
+                    tpd = self.pdata["TRANSLATIONPATTERN"].split("%language%")[0]
             else:
                 pattern = "*.ts"
             tslist.extend(Utilities.direntries(tpd, True, pattern))
@@ -2684,17 +2824,19 @@
             if pattern:
                 tslist.extend(Utilities.direntries(tpd, True, pattern))
             if tslist:
-                if '_' in os.path.basename(tslist[0]):
+                if "_" in os.path.basename(tslist[0]):
                     # the first entry determines the mainscript name
                     mainscriptname = (
-                        os.path.splitext(mainscript)[0] or
-                        os.path.basename(tslist[0]).split('_')[0]
+                        os.path.splitext(mainscript)[0]
+                        or os.path.basename(tslist[0]).split("_")[0]
                     )
                     self.pdata["TRANSLATIONPATTERN"] = os.path.join(
                         os.path.dirname(tslist[0]),
                         "{0}_%language%{1}".format(
-                            os.path.basename(tslist[0]).split('_')[0],
-                            os.path.splitext(tslist[0])[1]))
+                            os.path.basename(tslist[0]).split("_")[0],
+                            os.path.splitext(tslist[0])[1],
+                        ),
+                    )
                 else:
                     mainscriptname = ""
                     pattern, ok = QInputDialog.getText(
@@ -2703,47 +2845,49 @@
                         self.tr(
                             "Enter the path pattern for translation files "
                             "(use '%language%' in place of the language"
-                            " code):"),
+                            " code):"
+                        ),
                         QLineEdit.EchoMode.Normal,
-                        tslist[0])
+                        tslist[0],
+                    )
                     if pattern:
                         self.pdata["TRANSLATIONPATTERN"] = pattern
                 if self.pdata["TRANSLATIONPATTERN"]:
                     self.pdata["TRANSLATIONPATTERN"] = self.getRelativePath(
-                        self.pdata["TRANSLATIONPATTERN"])
+                        self.pdata["TRANSLATIONPATTERN"]
+                    )
                     pattern = self.pdata["TRANSLATIONPATTERN"].replace(
-                        "%language%", "*")
+                        "%language%", "*"
+                    )
                     for ts in tslist:
                         if fnmatch.fnmatch(ts, pattern):
                             self.pdata["TRANSLATIONS"].append(ts)
                             self.projectLanguageAdded.emit(ts)
                     if self.pdata["TRANSLATIONSBINPATH"]:
-                        tpd = os.path.join(self.ppath,
-                                           self.pdata["TRANSLATIONSBINPATH"])
+                        tpd = os.path.join(
+                            self.ppath, self.pdata["TRANSLATIONSBINPATH"]
+                        )
                         pattern = os.path.basename(
-                            self.pdata["TRANSLATIONPATTERN"]).replace(
-                            "%language%", "*")
+                            self.pdata["TRANSLATIONPATTERN"]
+                        ).replace("%language%", "*")
                         pattern = self.__binaryTranslationFile(pattern)
                         qmlist = Utilities.direntries(tpd, True, pattern)
                         for qm in qmlist:
                             self.pdata["TRANSLATIONS"].append(qm)
                             self.projectLanguageAdded.emit(qm)
                 if not self.pdata["MAINSCRIPT"] and bool(mainscriptname):
-                    if self.pdata["PROGLANGUAGE"] in [
-                        "Python3", "MicroPython"
-                    ]:
-                        self.pdata["MAINSCRIPT"] = '{0}.py'.format(
-                            mainscriptname)
+                    if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
+                        self.pdata["MAINSCRIPT"] = "{0}.py".format(mainscriptname)
                     elif self.pdata["PROGLANGUAGE"] == "Ruby":
-                        self.pdata["MAINSCRIPT"] = '{0}.rb'.format(
-                            mainscriptname)
+                        self.pdata["MAINSCRIPT"] = "{0}.rb".format(mainscriptname)
             self.setDirty(True)
-    
+
     def __showProperties(self):
         """
         Private slot to display the properties dialog.
         """
         from .PropertiesDialog import PropertiesDialog
+
         dlg = PropertiesDialog(self, False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             projectType = self.pdata["PROJECTTYPE"]
@@ -2751,13 +2895,12 @@
             self.setDirty(True)
             if self.pdata["MAINSCRIPT"]:
                 if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                    ms = os.path.join(
-                        self.ppath, self.pdata["MAINSCRIPT"])
+                    ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
                 else:
                     ms = self.pdata["MAINSCRIPT"]
                 if os.path.exists(ms):
                     self.appendFile(ms)
-            
+
             if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
                 mf = self.pdata["MAKEPARAMS"]["MakeFile"]
                 if mf:
@@ -2775,14 +2918,15 @@
                             self.tr("Create Makefile"),
                             self.tr(
                                 "<p>The makefile <b>{0}</b> could not"
-                                " be created.<br/>Reason: {1}</p>")
-                            .format(mf, str(err)))
+                                " be created.<br/>Reason: {1}</p>"
+                            ).format(mf, str(err)),
+                        )
                 self.appendFile(mf)
-            
+
             if self.pdata["PROJECTTYPE"] != projectType:
                 # reinitialize filetype associations
                 self.initFileTypes()
-            
+
             if self.translationsRoot:
                 tp = os.path.join(self.ppath, self.translationsRoot)
                 if not self.translationsRoot.endswith(os.sep):
@@ -2793,43 +2937,42 @@
                 os.makedirs(tp)
             if tp != self.ppath and tp not in self.subdirs:
                 self.subdirs.append(tp)
-            
+
             if self.pdata["TRANSLATIONSBINPATH"]:
-                tp = os.path.join(
-                    self.ppath, self.pdata["TRANSLATIONSBINPATH"])
+                tp = os.path.join(self.ppath, self.pdata["TRANSLATIONSBINPATH"])
                 if not os.path.isdir(tp):
                     os.makedirs(tp)
                 if tp != self.ppath and tp not in self.subdirs:
                     self.subdirs.append(tp)
-            
-            self.pluginGrp.setEnabled(
-                self.pdata["PROJECTTYPE"] in ["E7Plugin"])
-            
+
+            self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
+
             self.__model.projectPropertiesChanged()
             self.projectPropertiesChanged.emit()
-            
+
             if self.pdata["PROJECTTYPE"] != projectType:
                 self.__reorganizeFiles()
-        
+
     def __showUserProperties(self):
         """
         Private slot to display the user specific properties dialog.
         """
         vcsSystem = self.pdata["VCS"] or None
         vcsSystemOverride = self.pudata["VCSOVERRIDE"] or None
-        
+
         from .UserPropertiesDialog import UserPropertiesDialog
+
         dlg = UserPropertiesDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.storeData()
-            
+
             if (
-                (self.pdata["VCS"] and
-                 self.pdata["VCS"] != vcsSystem) or
-                (self.pudata["VCSOVERRIDE"] and
-                 self.pudata["VCSOVERRIDE"] != vcsSystemOverride) or
-                (vcsSystemOverride is not None and
-                    not self.pudata["VCSOVERRIDE"])
+                (self.pdata["VCS"] and self.pdata["VCS"] != vcsSystem)
+                or (
+                    self.pudata["VCSOVERRIDE"]
+                    and self.pudata["VCSOVERRIDE"] != vcsSystemOverride
+                )
+                or (vcsSystemOverride is not None and not self.pudata["VCSOVERRIDE"])
             ):
                 # stop the VCS monitor thread and shutdown VCS
                 if self.vcs is not None:
@@ -2843,30 +2986,31 @@
                 # start the VCS monitor thread
                 self.__vcsConnectStatusMonitor()
                 self.reinitVCS.emit()
-            
+
             if self.pudata["VCSSTATUSMONITORINTERVAL"]:
-                self.setStatusMonitorInterval(
-                    self.pudata["VCSSTATUSMONITORINTERVAL"])
+                self.setStatusMonitorInterval(self.pudata["VCSSTATUSMONITORINTERVAL"])
             else:
                 self.setStatusMonitorInterval(
-                    Preferences.getVCS("StatusMonitorInterval"))
-        
+                    Preferences.getVCS("StatusMonitorInterval")
+                )
+
     def __showFiletypeAssociations(self):
         """
         Private slot to display the filetype association dialog.
         """
         from .FiletypeAssociationDialog import FiletypeAssociationDialog
+
         dlg = FiletypeAssociationDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.transferData()
             self.setDirty(True)
             self.__reorganizeFiles()
-    
+
     def getFiletypeAssociations(self, associationType):
         """
         Public method to get the list of file type associations for
         the given association type.
-        
+
         @param associationType type of the association (one of FORMS,
             INTERFACES, OTHERS, PROTOCOLS, RESOURCES, SOURCES,
             TRANSLATIONS or __IGNORE__)
@@ -2874,24 +3018,28 @@
         @return list of file patterns for the given type
         @rtype list of str
         """
-        return [assoc for assoc in self.pdata["FILETYPES"]
-                if self.pdata["FILETYPES"][assoc] == associationType]
-    
+        return [
+            assoc
+            for assoc in self.pdata["FILETYPES"]
+            if self.pdata["FILETYPES"][assoc] == associationType
+        ]
+
     def __showLexerAssociations(self):
         """
         Private slot to display the lexer association dialog.
         """
         from .LexerAssociationDialog import LexerAssociationDialog
+
         dlg = LexerAssociationDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.transferData()
             self.setDirty(True)
             self.lexerAssociationsChanged.emit()
-        
+
     def getEditorLexerAssoc(self, filename):
         """
         Public method to retrieve a lexer association.
-        
+
         @param filename filename used to determine the associated lexer
             language (string)
         @return the requested lexer language (string)
@@ -2900,32 +3048,32 @@
         for pattern, language in list(self.pdata["LEXERASSOCS"].items()):
             if fnmatch.fnmatch(filename, pattern):
                 return language
-        
+
         # try project type specific defaults next
         projectType = self.pdata["PROJECTTYPE"]
         with contextlib.suppress(KeyError):
             if self.__lexerAssociationCallbacks[projectType] is not None:
                 return self.__lexerAssociationCallbacks[projectType](filename)
-        
+
         # return empty string to signal to use the global setting
         return ""
-    
+
     def getIgnorePatterns(self):
         """
         Public method to get the list of file name patterns for files to be
         ignored.
-        
+
         @return list of ignore file name patterns
         @rtype list of str
         """
         return self.getFiletypeAssociations("__IGNORE__")
-    
+
     @pyqtSlot()
     @pyqtSlot(str)
     def openProject(self, fn=None, restoreSession=True, reopen=False):
         """
         Public slot to open a project.
-        
+
         @param fn optional filename of the project file to be read
         @param restoreSession flag indicating to restore the project
             session (boolean)
@@ -2933,15 +3081,15 @@
         """
         if not self.checkDirty():
             return
-        
+
         if fn is None:
             fn = EricFileDialog.getOpenFileName(
                 self.parent(),
                 self.tr("Open project"),
-                Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir(),
-                self.tr("Project Files (*.epj);;XML Project Files (*.e4p)"))
-        
+                Preferences.getMultiProject("Workspace") or Utilities.getHomeDir(),
+                self.tr("Project Files (*.epj);;XML Project Files (*.e4p)"),
+            )
+
         if fn and self.closeProject():
             with EricOverrideCursor():
                 ok = self.__readProject(fn)
@@ -2951,7 +3099,7 @@
                     self.initFileTypes()
                 else:
                     self.updateFileTypes()
-                
+
                 try:
                     # create management directory if not present
                     self.createProjectManagementDir()
@@ -2961,43 +3109,40 @@
                         self.tr("Create project management directory"),
                         self.tr(
                             "<p>The project directory <b>{0}</b> is not"
-                            " writable.</p>")
-                        .format(self.ppath))
+                            " writable.</p>"
+                        ).format(self.ppath),
+                    )
                     return
-                
+
                 # read a user specific project file
                 self.__readUserProperties()
-                
+
                 with EricOverrideCursor():
                     oldState = self.isDirty()
                     self.vcs = self.initVCS()
                     if self.vcs is None and self.isDirty() == oldState:
                         # check, if project is version controlled
                         pluginManager = ericApp().getObject("PluginManager")
-                        for indicator, vcsData in (
-                            pluginManager.getVcsSystemIndicators().items()
-                        ):
-                            if os.path.exists(
-                                    os.path.join(self.ppath, indicator)):
+                        for (
+                            indicator,
+                            vcsData,
+                        ) in pluginManager.getVcsSystemIndicators().items():
+                            if os.path.exists(os.path.join(self.ppath, indicator)):
                                 if len(vcsData) > 1:
                                     vcsList = []
-                                    for (
-                                        _vcsSystemStr, vcsSystemDisplay
-                                    ) in vcsData:
+                                    for (_vcsSystemStr, vcsSystemDisplay) in vcsData:
                                         vcsList.append(vcsSystemDisplay)
                                     with EricOverridenCursor():
                                         res, vcs_ok = QInputDialog.getItem(
                                             None,
                                             self.tr("New Project"),
-                                            self.tr(
-                                                "Select Version Control"
-                                                " System"),
+                                            self.tr("Select Version Control" " System"),
                                             vcsList,
-                                            0, False)
+                                            0,
+                                            False,
+                                        )
                                     if vcs_ok:
-                                        for (
-                                            vcsSystemStr, vcsSystemDisplay
-                                        ) in vcsData:
+                                        for (vcsSystemStr, vcsSystemDisplay) in vcsData:
                                             if res == vcsSystemDisplay:
                                                 vcsSystem = vcsSystemStr
                                                 break
@@ -3010,12 +3155,11 @@
                                 self.pdata["VCS"] = vcsSystem
                                 self.vcs = self.initVCS()
                                 self.setDirty(True)
-                    if (
-                        self.vcs is not None and
-                        (self.vcs.vcsRegisteredState(self.ppath) !=
-                            self.vcs.canBeCommitted)
+                    if self.vcs is not None and (
+                        self.vcs.vcsRegisteredState(self.ppath)
+                        != self.vcs.canBeCommitted
                     ):
-                        self.pdata["VCS"] = 'None'
+                        self.pdata["VCS"] = "None"
                         self.vcs = self.initVCS()
                     self.closeAct.setEnabled(True)
                     self.saveasAct.setEnabled(True)
@@ -3033,56 +3177,52 @@
                     self.menuDiagramAct.setEnabled(True)
                     self.menuApidocAct.setEnabled(True)
                     self.menuPackagersAct.setEnabled(True)
-                    self.pluginGrp.setEnabled(
-                        self.pdata["PROJECTTYPE"] in ["E7Plugin"])
+                    self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
                     self.addLanguageAct.setEnabled(
-                        bool(self.pdata["TRANSLATIONPATTERN"]))
-                    self.makeGrp.setEnabled(
-                        self.pdata["MAKEPARAMS"]["MakeEnabled"])
-                    self.menuMakeAct.setEnabled(
-                        self.pdata["MAKEPARAMS"]["MakeEnabled"])
+                        bool(self.pdata["TRANSLATIONPATTERN"])
+                    )
+                    self.makeGrp.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
+                    self.menuMakeAct.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
                     self.menuOtherToolsAct.setEnabled(True)
                     self.menuFormattingAct.setEnabled(True)
-                    
+
                     # open a project debugger properties file being quiet
                     # about errors
                     if Preferences.getProject("AutoLoadDbgProperties"):
                         self.__readDebugProperties(True)
-                    
+
                     self.__model.projectOpened()
                     self.projectOpenedHooks.emit()
                     self.projectOpened.emit()
-                
+
                 if Preferences.getProject("SearchNewFiles"):
                     self.__doSearchNewFiles()
-                
+
                 # read a project tasks file
                 self.__readTasks()
                 self.ui.taskViewer.setProjectOpen(True)
                 # rescan project tasks
                 if Preferences.getProject("TasksProjectRescanOnOpen"):
-                    ericApp().getObject("TaskViewer"
-                                        ).regenerateProjectTasks(quiet=True)
-                
+                    ericApp().getObject("TaskViewer").regenerateProjectTasks(quiet=True)
+
                 if restoreSession:
                     # open the main script
                     if self.pdata["MAINSCRIPT"]:
                         if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                            ms = os.path.join(
-                                self.ppath, self.pdata["MAINSCRIPT"])
+                            ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
                         else:
                             ms = self.pdata["MAINSCRIPT"]
                         self.sourceFile.emit(ms)
-                    
+
                     # open a project session file being quiet about errors
                     if reopen:
                         self.__readSession(quiet=True, indicator="_tmp")
                     elif Preferences.getProject("AutoLoadSession"):
                         self.__readSession(quiet=True)
-                
+
                 # start the VCS monitor thread
                 self.__vcsConnectStatusMonitor()
-        
+
     def reopenProject(self):
         """
         Public slot to reopen the current project.
@@ -3091,11 +3231,11 @@
         res = self.closeProject(reopen=True)
         if res:
             self.openProject(projectFile, reopen=True)
-        
+
     def saveProject(self):
         """
         Public slot to save the current project.
-        
+
         @return flag indicating success
         """
         if self.isDirty():
@@ -3111,19 +3251,18 @@
         self.sessActGrp.setEnabled(ok)
         self.menuSessionAct.setEnabled(ok)
         return ok
-        
+
     def saveProjectAs(self):
         """
         Public slot to save the current project to a different file.
-        
+
         @return flag indicating success (boolean)
         """
         defaultFilter = self.tr("Project Files (*.epj)")
         defaultPath = (
             self.ppath
-            if self.ppath else
-            (Preferences.getMultiProject("Workspace") or
-             Utilities.getHomeDir())
+            if self.ppath
+            else (Preferences.getMultiProject("Workspace") or Utilities.getHomeDir())
         )
         fn, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self.parent(),
@@ -3131,8 +3270,9 @@
             defaultPath,
             self.tr("Project Files (*.epj)"),
             defaultFilter,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if fn:
             fpath = pathlib.Path(fn)
             if not fpath.suffix:
@@ -3143,22 +3283,25 @@
                 res = EricMessageBox.yesNo(
                     self.ui,
                     self.tr("Save File"),
-                    self.tr("""<p>The file <b>{0}</b> already exists."""
-                            """ Overwrite it?</p>""").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        """<p>The file <b>{0}</b> already exists."""
+                        """ Overwrite it?</p>"""
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return False
-                
+
             self.name = fpath.stem
             ok = self.__writeProject(str(fpath))
-            
+
             if ok:
                 # create management directory if not present
                 self.createProjectManagementDir()
-                
+
                 # now save the tasks
                 self.writeTasks()
-            
+
             self.sessActGrp.setEnabled(ok)
             self.menuSessionAct.setEnabled(ok)
             self.projectClosedHooks.emit()
@@ -3168,11 +3311,11 @@
             return ok
         else:
             return False
-    
+
     def checkDirty(self):
         """
         Public method to check dirty status and open a message window.
-        
+
         @return flag indicating whether this operation was successful (boolean)
         """
         if self.isDirty():
@@ -3180,13 +3323,14 @@
                 self.parent(),
                 self.tr("Close Project"),
                 self.tr("The current project has unsaved changes."),
-                self.saveProject)
+                self.saveProject,
+            )
             if res:
                 self.setDirty(False)
             return res
-            
+
         return True
-        
+
     def __closeAllWindows(self):
         """
         Private method to close all project related windows.
@@ -3196,12 +3340,12 @@
         self.profiledata and self.profiledata.close()
         self.applicationDiagram and self.applicationDiagram.close()
         self.loadedDiagram and self.loadedDiagram.close()
-        
+
     @pyqtSlot()
     def closeProject(self, reopen=False, noSave=False, shutdown=False):
         """
         Public slot to close the current project.
-        
+
         @param reopen flag indicating a reopening of the project
         @type bool
         @param noSave flag indicating to not perform save actions
@@ -3213,35 +3357,36 @@
         """
         # save the list of recently opened projects
         self.__saveRecent()
-        
+
         if not self.isOpen():
             return True
-        
+
         if not self.checkDirty():
             return False
-        
+
         ericApp().getObject("TaskViewer").stopProjectTaskExtraction()
-        
+
         # save the user project properties
         if not noSave:
             self.__writeUserProperties()
-        
+
         # save the project session file being quiet about error
         if reopen:
             self.__writeSession(quiet=True, indicator="_tmp")
         elif Preferences.getProject("AutoSaveSession") and not noSave:
             self.__writeSession(quiet=True)
-        
+
         # save the project debugger properties file being quiet about error
         if (
-            Preferences.getProject("AutoSaveDbgProperties") and
-            self.isDebugPropertiesLoaded() and
-            not noSave and self.debugPropertiesChanged
+            Preferences.getProject("AutoSaveDbgProperties")
+            and self.isDebugPropertiesLoaded()
+            and not noSave
+            and self.debugPropertiesChanged
         ):
             self.__writeDebugProperties(True)
-        
+
         vm = ericApp().getObject("ViewManager")
-        
+
         # check dirty status of all project files first
         for fn in vm.getOpenFilenames():
             if self.isProjectFile(fn):
@@ -3249,7 +3394,7 @@
                 if not reset:
                     # abort shutting down
                     return False
-        
+
         # close all project related editors
         success = True
         for fn in vm.getOpenFilenames():
@@ -3257,27 +3402,27 @@
                 success &= vm.closeWindow(fn, ignoreDirty=True)
         if not success:
             return False
-        
+
         # stop the VCS monitor thread
         if self.vcs is not None:
             self.vcs.stopStatusMonitor()
-        
+
         # now save the tasks
         if not noSave:
             self.writeTasks()
         self.ui.taskViewer.clearProjectTasks()
         self.ui.taskViewer.setProjectOpen(False)
-        
+
         # now shutdown the vcs interface
         if self.vcs:
             self.vcs.vcsShutdown()
             self.vcs.deleteLater()
             self.vcs = None
             ericApp().getObject("PluginManager").deactivateVcsPlugins()
-        
+
         # now close all project related tool windows
         self.__closeAllWindows()
-        
+
         self.__initData()
         self.closeAct.setEnabled(False)
         self.saveasAct.setEnabled(False)
@@ -3301,17 +3446,17 @@
         self.menuMakeAct.setEnabled(False)
         self.menuOtherToolsAct.setEnabled(False)
         self.menuFormattingAct.setEnabled(False)
-        
+
         self.__model.projectClosed()
         self.projectClosedHooks.emit()
         self.projectClosed.emit(shutdown)
-        
+
         return True
 
     def saveAllScripts(self, reportSyntaxErrors=False):
         """
         Public method to save all scripts belonging to the project.
-        
+
         @param reportSyntaxErrors flag indicating special reporting
             for syntax errors (boolean)
         @return flag indicating success (boolean)
@@ -3326,24 +3471,26 @@
                 success &= vm.saveEditorEd(editor)
                 if reportSyntaxErrors and editor.hasSyntaxErrors():
                     filesWithSyntaxErrors += 1
-        
+
         if reportSyntaxErrors and filesWithSyntaxErrors > 0:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Syntax errors detected"),
                 self.tr(
                     """The project contains %n file(s) with syntax errors.""",
-                    "", filesWithSyntaxErrors)
+                    "",
+                    filesWithSyntaxErrors,
+                ),
             )
             return False
         else:
             return success
-        
+
     def checkAllScriptsDirty(self, reportSyntaxErrors=False):
         """
         Public method to check all scripts belonging to the project for
         their dirty status.
-        
+
         @param reportSyntaxErrors flag indicating special reporting
             for syntax errors (boolean)
         @return flag indicating success (boolean)
@@ -3358,14 +3505,16 @@
                 success &= editor.checkDirty()
                 if reportSyntaxErrors and editor.hasSyntaxErrors():
                     filesWithSyntaxErrors += 1
-        
+
         if reportSyntaxErrors and filesWithSyntaxErrors > 0:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Syntax errors detected"),
                 self.tr(
                     """The project contains %n file(s) with syntax errors.""",
-                    "", filesWithSyntaxErrors)
+                    "",
+                    filesWithSyntaxErrors,
+                ),
             )
             return False
         else:
@@ -3374,10 +3523,10 @@
     def getMainScript(self, normalized=False):
         """
         Public method to return the main script filename.
-        
+
         The normalized name is the name of the main script prepended with
         the project path.
-        
+
         @param normalized flag indicating a normalized filename is wanted
         @type bool
         @return filename of the projects main script
@@ -3390,22 +3539,22 @@
                 return self.pdata["MAINSCRIPT"]
         else:
             return ""
-        
+
     def getSources(self, normalized=False):
         """
         Public method to return the source script files.
-        
+
         @param normalized flag indicating a normalized filename is wanted
         @type bool
         @return list of the projects scripts
         @rtype list of str
         """
         return self.getProjectFiles("SOURCES", normalized=normalized)
-    
+
     def getProjectFiles(self, fileType, normalized=False):
         """
         Public method to get the file entries of the given type.
-        
+
         @param fileType project file type (one of SOURCES, FORMS, RESOURCES,
             INTERFACES, PROTOCOLS, OTHERS, TRANSLATIONS)
         @type str
@@ -3415,95 +3564,101 @@
         @rtype list of str
         @exception ValueError raised when an unsupported file type is given
         """
-        if fileType not in ["SOURCES", "FORMS", "RESOURCES", "INTERFACES",
-                            "PROTOCOLS", "OTHERS", "TRANSLATIONS"]:
+        if fileType not in [
+            "SOURCES",
+            "FORMS",
+            "RESOURCES",
+            "INTERFACES",
+            "PROTOCOLS",
+            "OTHERS",
+            "TRANSLATIONS",
+        ]:
             raise ValueError("Given file type has incorrect value.")
-        
+
         if normalized:
-            return [os.path.join(self.ppath, fn) for fn in
-                    self.pdata[fileType]]
+            return [os.path.join(self.ppath, fn) for fn in self.pdata[fileType]]
         else:
             return self.pdata[fileType]
-        
+
     def getProjectType(self):
         """
         Public method to get the type of the project.
-        
+
         @return UI type of the project (string)
         """
         return self.pdata["PROJECTTYPE"]
-        
+
     def getProjectLanguage(self):
         """
         Public method to get the project's programming language.
-        
+
         @return programming language (string)
         """
         return self.pdata["PROGLANGUAGE"]
-        
+
     def isMixedLanguageProject(self):
         """
         Public method to check, if this is a mixed language project.
-        
+
         @return flag indicating a mixed language project
         @rtype bool
         """
         return self.pdata["MIXEDLANGUAGE"]
-        
+
     def isPythonProject(self):
         """
         Public method to check, if this project is a Python3 or MicroPython
         project.
-        
+
         @return flag indicating a Python project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]
-        
+
     def isPy3Project(self):
         """
         Public method to check, if this project is a Python3 project.
-        
+
         @return flag indicating a Python3 project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] == "Python3"
-    
+
     def isMicroPythonProject(self):
         """
         Public method to check, if this project is a MicroPython project.
-        
+
         @return flag indicating a MicroPython project
         @rtype bool
         """
         return self.pdata["PROGLANGUAGE"] == "MicroPython"
-        
+
     def isRubyProject(self):
         """
         Public method to check, if this project is a Ruby project.
-        
+
         @return flag indicating a Ruby project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] == "Ruby"
-        
+
     def isJavaScriptProject(self):
         """
         Public method to check, if this project is a JavaScript project.
-        
+
         @return flag indicating a JavaScript project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] == "JavaScript"
-        
+
     def getProjectSpellLanguage(self):
         """
         Public method to get the project's programming language.
-        
+
         @return programming language (string)
         """
         return self.pdata["SPELLLANGUAGE"]
-        
+
     def getProjectDictionaries(self):
         """
         Public method to get the names of the project specific dictionaries.
-        
+
         @return tuple of two strings giving the absolute path names of the
             project specific word and exclude list
         """
@@ -3512,67 +3667,65 @@
             pwl = os.path.join(self.ppath, self.pdata["SPELLWORDS"])
             if not os.path.isfile(pwl):
                 pwl = ""
-        
+
         pel = ""
         if self.pdata["SPELLEXCLUDES"]:
             pel = os.path.join(self.ppath, self.pdata["SPELLEXCLUDES"])
             if not os.path.isfile(pel):
                 pel = ""
-        
+
         return (pwl, pel)
-        
+
     def getDefaultSourceExtension(self):
         """
         Public method to get the default extension for the project's
         programming language.
-        
+
         @return default extension (including the dot) (string)
         """
         lang = self.pdata["PROGLANGUAGE"]
         if lang in ("", "Python"):
             lang = "Python3"
         return self.__sourceExtensions(lang)[0]
-        
+
     def getProjectPath(self):
         """
         Public method to get the project path.
-        
+
         @return project path (string)
         """
         return self.ppath
-        
+
     def startswithProjectPath(self, path):
         """
         Public method to check, if a path starts with the project path.
-        
+
         @param path path to be checked
         @type str
         @return flag indicating that the path starts with the project path
         @rtype bool
         """
-        return (
-            bool(self.ppath) and
-            (path == self.ppath or
-             Utilities.normcasepath(Utilities.toNativeSeparators(path))
-             .startswith(Utilities.normcasepath(
-                         Utilities.toNativeSeparators(self.ppath + "/")))
-             )
+        return bool(self.ppath) and (
+            path == self.ppath
+            or Utilities.normcasepath(Utilities.toNativeSeparators(path)).startswith(
+                Utilities.normcasepath(Utilities.toNativeSeparators(self.ppath + "/"))
+            )
         )
-    
+
     def getProjectFile(self):
         """
         Public method to get the path of the project file.
-        
+
         @return path of the project file (string)
         """
         return self.pfile
-        
+
     def getProjectName(self):
         """
         Public method to get the name of the project.
-        
+
         The project name is determined from the name of the project file.
-        
+
         @return name of the project (string)
         """
         if self.pfile:
@@ -3580,39 +3733,39 @@
             return os.path.basename(name)
         else:
             return ""
-        
+
     def getProjectManagementDir(self):
         """
         Public method to get the path of the management directory.
-        
+
         @return path of the management directory (string)
         """
         return os.path.join(self.ppath, ".eric7project")
-    
+
     def createProjectManagementDir(self):
         """
         Public method to create the project management directory.
-        
+
         It does nothing, if it already exists.
         """
         # create management directory if not present
         mgmtDir = self.getProjectManagementDir()
         if not os.path.exists(mgmtDir):
             os.makedirs(mgmtDir)
-        
+
     def getHash(self):
         """
         Public method to get the project hash.
-        
+
         @return project hash as a hex string (string)
         """
         return self.pdata["HASH"]
-        
+
     def getRelativePath(self, path):
         """
         Public method to convert a file path to a project relative
         file path.
-        
+
         @param path file or directory name to convert (string)
         @return project relative path or unchanged path, if path doesn't
             belong to the project (string)
@@ -3621,46 +3774,46 @@
             return str(pathlib.Path(path).relative_to(self.ppath))
         except ValueError:
             return path
-        
+
     def getRelativeUniversalPath(self, path):
         """
         Public method to convert a file path to a project relative
         file path with universal separators.
-        
+
         @param path file or directory name to convert (string)
         @return project relative path or unchanged path, if path doesn't
             belong to the project (string)
         """
         return Utilities.fromNativeSeparators(self.getRelativePath(path))
-        
+
     def getAbsolutePath(self, fn):
         """
         Public method to convert a project relative file path to an absolute
         file path.
-        
+
         @param fn file or directory name to convert (string)
         @return absolute path (string)
         """
         if not os.path.isabs(fn):
             fn = os.path.join(self.ppath, fn)
         return fn
-        
+
     def getAbsoluteUniversalPath(self, fn):
         """
         Public method to convert a project relative file path with universal
         separators to an absolute file path.
-        
+
         @param fn file or directory name to convert (string)
         @return absolute path (string)
         """
         if not os.path.isabs(fn):
             fn = os.path.join(self.ppath, Utilities.toNativeSeparators(fn))
         return fn
-        
+
     def getEolString(self):
         """
         Public method to get the EOL-string to be used by the project.
-        
+
         @return eol string (string)
         """
         if self.pdata["EOL"] >= 0:
@@ -3668,64 +3821,64 @@
         else:
             eolMode = Preferences.getEditor("EOLMode")
             if eolMode == QsciScintilla.EolMode.EolWindows:
-                eol = '\r\n'
+                eol = "\r\n"
             elif eolMode == QsciScintilla.EolMode.EolUnix:
-                eol = '\n'
+                eol = "\n"
             elif eolMode == QsciScintilla.EolMode.EolMac:
-                eol = '\r'
+                eol = "\r"
             else:
                 eol = os.linesep
             return eol
-        
+
     def useSystemEol(self):
         """
         Public method to check, if the project uses the system eol setting.
-        
+
         @return flag indicating the usage of system eol (boolean)
         """
         return self.pdata["EOL"] == 0
-    
+
     def getProjectVersion(self):
         """
         Public mehod to get the version number of the project.
-        
+
         @return version number
         @rtype str
         """
         return self.pdata["VERSION"]
-    
+
     def getProjectAuthor(self):
         """
         Public method to get the author of the project.
-        
+
         @return author name
         @rtype str
         """
         return self.pdata["AUTHOR"]
-    
+
     def getProjectAuthorEmail(self):
         """
         Public method to get the email address of the project author.
-        
+
         @return project author email
         @rtype str
         """
         return self.pdata["EMAIL"]
-    
+
     def getProjectDescription(self):
         """
         Public method to get the description of the project.
-        
+
         @return project description
         @rtype str
         """
         return self.pdata["DESCRIPTION"]
-    
+
     def getProjectVenv(self, resolveDebugger=True):
         """
         Public method to get the name of the virtual environment used by the
         project.
-        
+
         @param resolveDebugger flag indicating to resolve the virtual
             environment name via the debugger settings if none was configured
         @type bool
@@ -3734,18 +3887,18 @@
         """
         venvName = self.getDebugProperty("VIRTUALENV")
         if (
-            not venvName and
-            resolveDebugger and
-            self.getProjectLanguage() in ("Python3", "MicroPython", "Cython")
+            not venvName
+            and resolveDebugger
+            and self.getProjectLanguage() in ("Python3", "MicroPython", "Cython")
         ):
             venvName = Preferences.getDebugger("Python3VirtualEnv")
-        
+
         return venvName
-    
+
     def getProjectInterpreter(self, resolveGlobal=True):
         """
         Public method to get the path of the interpreter used by the project.
-        
+
         @param resolveGlobal flag indicating to resolve the interpreter using
             the global interpreter if no project of debugger specific
             environment was configured
@@ -3757,18 +3910,19 @@
         venvName = self.getProjectVenv()
         if venvName:
             interpreter = (
-                ericApp().getObject("VirtualEnvManager")
+                ericApp()
+                .getObject("VirtualEnvManager")
                 .getVirtualenvInterpreter(venvName)
             )
         if not interpreter and resolveGlobal:
             interpreter = Globals.getPythonExecutable()
-        
+
         return interpreter
-    
+
     def getProjectExecPath(self):
         """
         Public method to get the executable search path prefix of the project.
-        
+
         @return executable search path prefix
         @rtype str
         """
@@ -3776,16 +3930,15 @@
         venvName = self.getProjectVenv()
         if venvName:
             execPath = (
-                ericApp().getObject("VirtualEnvManager")
-                .getVirtualenvExecPath(venvName)
+                ericApp().getObject("VirtualEnvManager").getVirtualenvExecPath(venvName)
             )
-        
+
         return execPath
-    
+
     def getProjectTestingFramework(self):
         """
         Public method to get the testing framework name of the project.
-        
+
         @return testing framework name of the project
         @rtype str
         """
@@ -3793,11 +3946,11 @@
             return self.pdata["TESTING_FRAMEWORK"]
         except KeyError:
             return ""
-    
+
     def getProjectLicense(self):
         """
         Public method to get the license type used by the project.
-        
+
         @return license type of the project
         @rtype str
         """
@@ -3805,12 +3958,12 @@
             return self.pdata["LICENSE"]
         except KeyError:
             return ""
-    
+
     def __isInPdata(self, fn):
         """
         Private method used to check, if the passed in filename is project
         controlled..
-        
+
         @param fn filename to be checked
         @type str
         @return flag indicating membership
@@ -3821,500 +3974,652 @@
         return any(
             newfn in self.pdata[group]
             for group in [
-                "SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                "TRANSLATIONS", "OTHERS"
+                "SOURCES",
+                "FORMS",
+                "INTERFACES",
+                "PROTOCOLS",
+                "RESOURCES",
+                "TRANSLATIONS",
+                "OTHERS",
             ]
         )
-    
+
     def isProjectFile(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating membership (boolean)
         """
         return any(
             self.__checkProjectFileGroup(fn, group)
             for group in [
-                "SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                "TRANSLATIONS", "OTHERS"
+                "SOURCES",
+                "FORMS",
+                "INTERFACES",
+                "PROTOCOLS",
+                "RESOURCES",
+                "TRANSLATIONS",
+                "OTHERS",
             ]
         )
-        
+
     def __checkProjectFileGroup(self, fn, group):
         """
         Private method to check, if a file is in a specific file group of the
         project.
-        
+
         @param fn filename to be checked (string)
         @param group group to check (string)
         @return flag indicating membership (boolean)
         """
         newfn = os.path.abspath(fn)
         newfn = self.getRelativePath(newfn)
-        if (
-            newfn in self.pdata[group] or
-            (group == "OTHERS" and
-             any(newfn.startswith(entry) for entry in self.pdata[group]))
+        if newfn in self.pdata[group] or (
+            group == "OTHERS"
+            and any(newfn.startswith(entry) for entry in self.pdata[group])
         ):
             return True
-        
+
         if Utilities.isWindowsPlatform():
             # try the above case-insensitive
             newfn = newfn.lower()
             if any(entry.lower() == newfn for entry in self.pdata[group]):
                 return True
-        elif (
-            group == "OTHERS" and
-            any(newfn.startswith(entry.lower())
-                for entry in self.pdata[group])
+        elif group == "OTHERS" and any(
+            newfn.startswith(entry.lower()) for entry in self.pdata[group]
         ):
             return True
-        
+
         return False
-        
+
     def isProjectSource(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project sources.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating membership (boolean)
         """
         return self.__checkProjectFileGroup(fn, "SOURCES")
-        
+
     def isProjectForm(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project forms.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating membership (boolean)
         """
         return self.__checkProjectFileGroup(fn, "FORMS")
-        
+
     def isProjectInterface(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project interfaces.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating membership (boolean)
         """
         return self.__checkProjectFileGroup(fn, "INTERFACES")
-        
+
     def isProjectProtocol(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project protocols.
-        
+
         @param fn filename to be checked
         @type str
         @return flag indicating membership
         @rtype bool
         """
         return self.__checkProjectFileGroup(fn, "PROTOCOLS")
-    
+
     def isProjectResource(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
         project resources.
-        
+
         @param fn filename to be checked (string)
         @return flag indicating membership (boolean)
         """
         return self.__checkProjectFileGroup(fn, "RESOURCES")
-        
+
     def initActions(self):
         """
         Public slot to initialize the project related actions.
         """
         self.actions = []
-        
+
         ###################################################################
         ## Project actions
         ###################################################################
-        
+
         self.actGrp1 = createActionGroup(self)
-        
+
         act = EricAction(
-            self.tr('New project'),
+            self.tr("New project"),
             UI.PixmapCache.getIcon("projectNew"),
-            self.tr('&New...'), 0, 0,
-            self.actGrp1, 'project_new')
-        act.setStatusTip(self.tr('Generate a new project'))
-        act.setWhatsThis(self.tr(
-            """<b>New...</b>"""
-            """<p>This opens a dialog for entering the info for a"""
-            """ new project.</p>"""
-        ))
+            self.tr("&New..."),
+            0,
+            0,
+            self.actGrp1,
+            "project_new",
+        )
+        act.setStatusTip(self.tr("Generate a new project"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>New...</b>"""
+                """<p>This opens a dialog for entering the info for a"""
+                """ new project.</p>"""
+            )
+        )
         act.triggered.connect(self.createNewProject)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Open project'),
+            self.tr("Open project"),
             UI.PixmapCache.getIcon("projectOpen"),
-            self.tr('&Open...'), 0, 0,
-            self.actGrp1, 'project_open')
-        act.setStatusTip(self.tr('Open an existing project'))
-        act.setWhatsThis(self.tr(
-            """<b>Open...</b>"""
-            """<p>This opens an existing project.</p>"""
-        ))
+            self.tr("&Open..."),
+            0,
+            0,
+            self.actGrp1,
+            "project_open",
+        )
+        act.setStatusTip(self.tr("Open an existing project"))
+        act.setWhatsThis(
+            self.tr("""<b>Open...</b>""" """<p>This opens an existing project.</p>""")
+        )
         act.triggered.connect(self.openProject)
         self.actions.append(act)
 
         self.closeAct = EricAction(
-            self.tr('Close project'),
+            self.tr("Close project"),
             UI.PixmapCache.getIcon("projectClose"),
-            self.tr('&Close'), 0, 0, self, 'project_close')
-        self.closeAct.setStatusTip(self.tr('Close the current project'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close</b>"""
-            """<p>This closes the current project.</p>"""
-        ))
+            self.tr("&Close"),
+            0,
+            0,
+            self,
+            "project_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the current project"))
+        self.closeAct.setWhatsThis(
+            self.tr("""<b>Close</b>""" """<p>This closes the current project.</p>""")
+        )
         self.closeAct.triggered.connect(self.closeProject)
         self.actions.append(self.closeAct)
 
         self.saveAct = EricAction(
-            self.tr('Save project'),
+            self.tr("Save project"),
             UI.PixmapCache.getIcon("projectSave"),
-            self.tr('&Save'), 0, 0, self, 'project_save')
-        self.saveAct.setStatusTip(self.tr('Save the current project'))
-        self.saveAct.setWhatsThis(self.tr(
-            """<b>Save</b>"""
-            """<p>This saves the current project.</p>"""
-        ))
+            self.tr("&Save"),
+            0,
+            0,
+            self,
+            "project_save",
+        )
+        self.saveAct.setStatusTip(self.tr("Save the current project"))
+        self.saveAct.setWhatsThis(
+            self.tr("""<b>Save</b>""" """<p>This saves the current project.</p>""")
+        )
         self.saveAct.triggered.connect(self.saveProject)
         self.actions.append(self.saveAct)
 
         self.saveasAct = EricAction(
-            self.tr('Save project as'),
+            self.tr("Save project as"),
             UI.PixmapCache.getIcon("projectSaveAs"),
-            self.tr('Save &as...'), 0, 0, self, 'project_save_as')
-        self.saveasAct.setStatusTip(self.tr(
-            'Save the current project to a new file'))
-        self.saveasAct.setWhatsThis(self.tr(
-            """<b>Save as</b>"""
-            """<p>This saves the current project to a new file.</p>"""
-        ))
+            self.tr("Save &as..."),
+            0,
+            0,
+            self,
+            "project_save_as",
+        )
+        self.saveasAct.setStatusTip(self.tr("Save the current project to a new file"))
+        self.saveasAct.setWhatsThis(
+            self.tr(
+                """<b>Save as</b>"""
+                """<p>This saves the current project to a new file.</p>"""
+            )
+        )
         self.saveasAct.triggered.connect(self.saveProjectAs)
         self.actions.append(self.saveasAct)
-        
+
         ###################################################################
         ## Project management actions
         ###################################################################
-        
+
         self.actGrp2 = createActionGroup(self)
-        
+
         self.addFilesAct = EricAction(
-            self.tr('Add files to project'),
+            self.tr("Add files to project"),
             UI.PixmapCache.getIcon("fileMisc"),
-            self.tr('Add &files...'), 0, 0,
-            self.actGrp2, 'project_add_file')
-        self.addFilesAct.setStatusTip(self.tr(
-            'Add files to the current project'))
-        self.addFilesAct.setWhatsThis(self.tr(
-            """<b>Add files...</b>"""
-            """<p>This opens a dialog for adding files"""
-            """ to the current project. The place to add is"""
-            """ determined by the file extension.</p>"""
-        ))
+            self.tr("Add &files..."),
+            0,
+            0,
+            self.actGrp2,
+            "project_add_file",
+        )
+        self.addFilesAct.setStatusTip(self.tr("Add files to the current project"))
+        self.addFilesAct.setWhatsThis(
+            self.tr(
+                """<b>Add files...</b>"""
+                """<p>This opens a dialog for adding files"""
+                """ to the current project. The place to add is"""
+                """ determined by the file extension.</p>"""
+            )
+        )
         self.addFilesAct.triggered.connect(self.addFiles)
         self.actions.append(self.addFilesAct)
 
         self.addDirectoryAct = EricAction(
-            self.tr('Add directory to project'),
+            self.tr("Add directory to project"),
             UI.PixmapCache.getIcon("dirOpen"),
-            self.tr('Add directory...'), 0, 0,
-            self.actGrp2, 'project_add_directory')
+            self.tr("Add directory..."),
+            0,
+            0,
+            self.actGrp2,
+            "project_add_directory",
+        )
         self.addDirectoryAct.setStatusTip(
-            self.tr('Add a directory to the current project'))
-        self.addDirectoryAct.setWhatsThis(self.tr(
-            """<b>Add directory...</b>"""
-            """<p>This opens a dialog for adding a directory"""
-            """ to the current project.</p>"""
-        ))
+            self.tr("Add a directory to the current project")
+        )
+        self.addDirectoryAct.setWhatsThis(
+            self.tr(
+                """<b>Add directory...</b>"""
+                """<p>This opens a dialog for adding a directory"""
+                """ to the current project.</p>"""
+            )
+        )
         self.addDirectoryAct.triggered.connect(self.addDirectory)
         self.actions.append(self.addDirectoryAct)
 
         self.addLanguageAct = EricAction(
-            self.tr('Add translation to project'),
+            self.tr("Add translation to project"),
             UI.PixmapCache.getIcon("linguist4"),
-            self.tr('Add &translation...'), 0, 0,
-            self.actGrp2, 'project_add_translation')
+            self.tr("Add &translation..."),
+            0,
+            0,
+            self.actGrp2,
+            "project_add_translation",
+        )
         self.addLanguageAct.setStatusTip(
-            self.tr('Add a translation to the current project'))
-        self.addLanguageAct.setWhatsThis(self.tr(
-            """<b>Add translation...</b>"""
-            """<p>This opens a dialog for add a translation"""
-            """ to the current project.</p>"""
-        ))
+            self.tr("Add a translation to the current project")
+        )
+        self.addLanguageAct.setWhatsThis(
+            self.tr(
+                """<b>Add translation...</b>"""
+                """<p>This opens a dialog for add a translation"""
+                """ to the current project.</p>"""
+            )
+        )
         self.addLanguageAct.triggered.connect(self.addLanguage)
         self.actions.append(self.addLanguageAct)
 
         act = EricAction(
-            self.tr('Search new files'),
-            self.tr('Searc&h new files...'), 0, 0,
-            self.actGrp2, 'project_search_new_files')
-        act.setStatusTip(self.tr(
-            'Search new files in the project directory.'))
-        act.setWhatsThis(self.tr(
-            """<b>Search new files...</b>"""
-            """<p>This searches for new files (sources, *.ui, *.idl,"""
-            """ *.proto) in the project directory and registered"""
-            """ subdirectories.</p>"""
-        ))
+            self.tr("Search new files"),
+            self.tr("Searc&h new files..."),
+            0,
+            0,
+            self.actGrp2,
+            "project_search_new_files",
+        )
+        act.setStatusTip(self.tr("Search new files in the project directory."))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Search new files...</b>"""
+                """<p>This searches for new files (sources, *.ui, *.idl,"""
+                """ *.proto) in the project directory and registered"""
+                """ subdirectories.</p>"""
+            )
+        )
         act.triggered.connect(self.__searchNewFiles)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Search Project File'),
-            self.tr('Search Project File...'),
+            self.tr("Search Project File"),
+            self.tr("Search Project File..."),
             QKeySequence(self.tr("Alt+Ctrl+P", "Project|Search Project File")),
             0,
-            self.actGrp2, 'project_search_project_file')
-        act.setStatusTip(self.tr(
-            'Search for a file in the project list of files.'))
-        act.setWhatsThis(self.tr(
-            """<b>Search Project File</b>"""
-            """<p>This searches for a file in the project list of files.</p>"""
-        ))
+            self.actGrp2,
+            "project_search_project_file",
+        )
+        act.setStatusTip(self.tr("Search for a file in the project list of files."))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Search Project File</b>"""
+                """<p>This searches for a file in the project list of files.</p>"""
+            )
+        )
         act.triggered.connect(self.__searchProjectFile)
         self.actions.append(act)
-        
+
         self.propsAct = EricAction(
-            self.tr('Project properties'),
+            self.tr("Project properties"),
             UI.PixmapCache.getIcon("projectProps"),
-            self.tr('&Properties...'), 0, 0, self,
-            'project_properties')
-        self.propsAct.setStatusTip(self.tr('Show the project properties'))
-        self.propsAct.setWhatsThis(self.tr(
-            """<b>Properties...</b>"""
-            """<p>This shows a dialog to edit the project properties.</p>"""
-        ))
+            self.tr("&Properties..."),
+            0,
+            0,
+            self,
+            "project_properties",
+        )
+        self.propsAct.setStatusTip(self.tr("Show the project properties"))
+        self.propsAct.setWhatsThis(
+            self.tr(
+                """<b>Properties...</b>"""
+                """<p>This shows a dialog to edit the project properties.</p>"""
+            )
+        )
         self.propsAct.triggered.connect(self.__showProperties)
         self.actions.append(self.propsAct)
 
         self.userPropsAct = EricAction(
-            self.tr('User project properties'),
+            self.tr("User project properties"),
             UI.PixmapCache.getIcon("projectUserProps"),
-            self.tr('&User Properties...'), 0, 0, self,
-            'project_user_properties')
-        self.userPropsAct.setStatusTip(self.tr(
-            'Show the user specific project properties'))
-        self.userPropsAct.setWhatsThis(self.tr(
-            """<b>User Properties...</b>"""
-            """<p>This shows a dialog to edit the user specific project"""
-            """ properties.</p>"""
-        ))
+            self.tr("&User Properties..."),
+            0,
+            0,
+            self,
+            "project_user_properties",
+        )
+        self.userPropsAct.setStatusTip(
+            self.tr("Show the user specific project properties")
+        )
+        self.userPropsAct.setWhatsThis(
+            self.tr(
+                """<b>User Properties...</b>"""
+                """<p>This shows a dialog to edit the user specific project"""
+                """ properties.</p>"""
+            )
+        )
         self.userPropsAct.triggered.connect(self.__showUserProperties)
         self.actions.append(self.userPropsAct)
 
         self.filetypesAct = EricAction(
-            self.tr('Filetype Associations'),
-            self.tr('Filetype Associations...'), 0, 0,
-            self, 'project_filetype_associations')
+            self.tr("Filetype Associations"),
+            self.tr("Filetype Associations..."),
+            0,
+            0,
+            self,
+            "project_filetype_associations",
+        )
         self.filetypesAct.setStatusTip(
-            self.tr('Show the project file type associations'))
-        self.filetypesAct.setWhatsThis(self.tr(
-            """<b>Filetype Associations...</b>"""
-            """<p>This shows a dialog to edit the file type associations of"""
-            """ the project. These associations determine the type"""
-            """ (source, form, interface, protocol or others) with a"""
-            """ filename pattern. They are used when adding a file to the"""
-            """ project and when performing a search for new files.</p>"""
-        ))
-        self.filetypesAct.triggered.connect(
-            self.__showFiletypeAssociations)
+            self.tr("Show the project file type associations")
+        )
+        self.filetypesAct.setWhatsThis(
+            self.tr(
+                """<b>Filetype Associations...</b>"""
+                """<p>This shows a dialog to edit the file type associations of"""
+                """ the project. These associations determine the type"""
+                """ (source, form, interface, protocol or others) with a"""
+                """ filename pattern. They are used when adding a file to the"""
+                """ project and when performing a search for new files.</p>"""
+            )
+        )
+        self.filetypesAct.triggered.connect(self.__showFiletypeAssociations)
         self.actions.append(self.filetypesAct)
 
         self.lexersAct = EricAction(
-            self.tr('Lexer Associations'),
-            self.tr('Lexer Associations...'), 0, 0,
-            self, 'project_lexer_associations')
-        self.lexersAct.setStatusTip(self.tr(
-            'Show the project lexer associations (overriding defaults)'))
-        self.lexersAct.setWhatsThis(self.tr(
-            """<b>Lexer Associations...</b>"""
-            """<p>This shows a dialog to edit the lexer associations of"""
-            """ the project. These associations override the global lexer"""
-            """ associations. Lexers are used to highlight the editor"""
-            """ text.</p>"""
-        ))
+            self.tr("Lexer Associations"),
+            self.tr("Lexer Associations..."),
+            0,
+            0,
+            self,
+            "project_lexer_associations",
+        )
+        self.lexersAct.setStatusTip(
+            self.tr("Show the project lexer associations (overriding defaults)")
+        )
+        self.lexersAct.setWhatsThis(
+            self.tr(
+                """<b>Lexer Associations...</b>"""
+                """<p>This shows a dialog to edit the lexer associations of"""
+                """ the project. These associations override the global lexer"""
+                """ associations. Lexers are used to highlight the editor"""
+                """ text.</p>"""
+            )
+        )
         self.lexersAct.triggered.connect(self.__showLexerAssociations)
         self.actions.append(self.lexersAct)
-        
+
         ###################################################################
         ## Project debug actions
         ###################################################################
-        
+
         self.dbgActGrp = createActionGroup(self)
-        
+
         act = EricAction(
-            self.tr('Debugger Properties'),
-            self.tr('Debugger &Properties...'), 0, 0,
-            self.dbgActGrp, 'project_debugger_properties')
-        act.setStatusTip(self.tr('Show the debugger properties'))
-        act.setWhatsThis(self.tr(
-            """<b>Debugger Properties...</b>"""
-            """<p>This shows a dialog to edit project specific debugger"""
-            """ settings.</p>"""
-        ))
+            self.tr("Debugger Properties"),
+            self.tr("Debugger &Properties..."),
+            0,
+            0,
+            self.dbgActGrp,
+            "project_debugger_properties",
+        )
+        act.setStatusTip(self.tr("Show the debugger properties"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Debugger Properties...</b>"""
+                """<p>This shows a dialog to edit project specific debugger"""
+                """ settings.</p>"""
+            )
+        )
         act.triggered.connect(self.__showDebugProperties)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Load'),
-            self.tr('&Load'), 0, 0,
-            self.dbgActGrp, 'project_debugger_properties_load')
-        act.setStatusTip(self.tr('Load the debugger properties'))
-        act.setWhatsThis(self.tr(
-            """<b>Load Debugger Properties</b>"""
-            """<p>This loads the project specific debugger settings.</p>"""
-        ))
+            self.tr("Load"),
+            self.tr("&Load"),
+            0,
+            0,
+            self.dbgActGrp,
+            "project_debugger_properties_load",
+        )
+        act.setStatusTip(self.tr("Load the debugger properties"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Load Debugger Properties</b>"""
+                """<p>This loads the project specific debugger settings.</p>"""
+            )
+        )
         act.triggered.connect(self.__readDebugProperties)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Save'),
-            self.tr('&Save'), 0, 0,
-            self.dbgActGrp, 'project_debugger_properties_save')
-        act.setStatusTip(self.tr('Save the debugger properties'))
-        act.setWhatsThis(self.tr(
-            """<b>Save Debugger Properties</b>"""
-            """<p>This saves the project specific debugger settings.</p>"""
-        ))
+            self.tr("Save"),
+            self.tr("&Save"),
+            0,
+            0,
+            self.dbgActGrp,
+            "project_debugger_properties_save",
+        )
+        act.setStatusTip(self.tr("Save the debugger properties"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Save Debugger Properties</b>"""
+                """<p>This saves the project specific debugger settings.</p>"""
+            )
+        )
         act.triggered.connect(self.__writeDebugProperties)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Delete'),
-            self.tr('&Delete'), 0, 0,
-            self.dbgActGrp, 'project_debugger_properties_delete')
-        act.setStatusTip(self.tr('Delete the debugger properties'))
-        act.setWhatsThis(self.tr(
-            """<b>Delete Debugger Properties</b>"""
-            """<p>This deletes the file containing the project specific"""
-            """ debugger settings.</p>"""
-        ))
+            self.tr("Delete"),
+            self.tr("&Delete"),
+            0,
+            0,
+            self.dbgActGrp,
+            "project_debugger_properties_delete",
+        )
+        act.setStatusTip(self.tr("Delete the debugger properties"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Delete Debugger Properties</b>"""
+                """<p>This deletes the file containing the project specific"""
+                """ debugger settings.</p>"""
+            )
+        )
         act.triggered.connect(self.__deleteDebugProperties)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Reset'),
-            self.tr('&Reset'), 0, 0,
-            self.dbgActGrp, 'project_debugger_properties_resets')
-        act.setStatusTip(self.tr('Reset the debugger properties'))
-        act.setWhatsThis(self.tr(
-            """<b>Reset Debugger Properties</b>"""
-            """<p>This resets the project specific debugger settings.</p>"""
-        ))
+            self.tr("Reset"),
+            self.tr("&Reset"),
+            0,
+            0,
+            self.dbgActGrp,
+            "project_debugger_properties_resets",
+        )
+        act.setStatusTip(self.tr("Reset the debugger properties"))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Reset Debugger Properties</b>"""
+                """<p>This resets the project specific debugger settings.</p>"""
+            )
+        )
         act.triggered.connect(self.__initDebugProperties)
         self.actions.append(act)
-        
+
         ###################################################################
         ## Project session actions
         ###################################################################
-        
+
         self.sessActGrp = createActionGroup(self)
-        
+
         act = EricAction(
-            self.tr('Load session'),
-            self.tr('Load session'), 0, 0,
-            self.sessActGrp, 'project_load_session')
-        act.setStatusTip(self.tr('Load the projects session file.'))
-        act.setWhatsThis(self.tr(
-            """<b>Load session</b>"""
-            """<p>This loads the projects session file. The session consists"""
-            """ of the following data.<br>"""
-            """- all open source files<br>"""
-            """- all breakpoint<br>"""
-            """- the commandline arguments<br>"""
-            """- the working directory<br>"""
-            """- the exception reporting flag</p>"""
-        ))
+            self.tr("Load session"),
+            self.tr("Load session"),
+            0,
+            0,
+            self.sessActGrp,
+            "project_load_session",
+        )
+        act.setStatusTip(self.tr("Load the projects session file."))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Load session</b>"""
+                """<p>This loads the projects session file. The session consists"""
+                """ of the following data.<br>"""
+                """- all open source files<br>"""
+                """- all breakpoint<br>"""
+                """- the commandline arguments<br>"""
+                """- the working directory<br>"""
+                """- the exception reporting flag</p>"""
+            )
+        )
         act.triggered.connect(self.__readSession)
         self.actions.append(act)
 
         act = EricAction(
-            self.tr('Save session'),
-            self.tr('Save session'), 0, 0,
-            self.sessActGrp, 'project_save_session')
-        act.setStatusTip(self.tr('Save the projects session file.'))
-        act.setWhatsThis(self.tr(
-            """<b>Save session</b>"""
-            """<p>This saves the projects session file. The session consists"""
-            """ of the following data.<br>"""
-            """- all open source files<br>"""
-            """- all breakpoint<br>"""
-            """- the commandline arguments<br>"""
-            """- the working directory<br>"""
-            """- the exception reporting flag</p>"""
-        ))
+            self.tr("Save session"),
+            self.tr("Save session"),
+            0,
+            0,
+            self.sessActGrp,
+            "project_save_session",
+        )
+        act.setStatusTip(self.tr("Save the projects session file."))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Save session</b>"""
+                """<p>This saves the projects session file. The session consists"""
+                """ of the following data.<br>"""
+                """- all open source files<br>"""
+                """- all breakpoint<br>"""
+                """- the commandline arguments<br>"""
+                """- the working directory<br>"""
+                """- the exception reporting flag</p>"""
+            )
+        )
         act.triggered.connect(self.__writeSession)
         self.actions.append(act)
-        
+
         act = EricAction(
-            self.tr('Delete session'),
-            self.tr('Delete session'), 0, 0,
-            self.sessActGrp, 'project_delete_session')
-        act.setStatusTip(self.tr('Delete the projects session file.'))
-        act.setWhatsThis(self.tr(
-            """<b>Delete session</b>"""
-            """<p>This deletes the projects session file</p>"""
-        ))
+            self.tr("Delete session"),
+            self.tr("Delete session"),
+            0,
+            0,
+            self.sessActGrp,
+            "project_delete_session",
+        )
+        act.setStatusTip(self.tr("Delete the projects session file."))
+        act.setWhatsThis(
+            self.tr(
+                """<b>Delete session</b>"""
+                """<p>This deletes the projects session file</p>"""
+            )
+        )
         act.triggered.connect(self.__deleteSession)
         self.actions.append(act)
-        
+
         ###################################################################
         ## Project Tools - check actions
         ###################################################################
-        
+
         self.chkGrp = createActionGroup(self)
 
         self.codeMetricsAct = EricAction(
-            self.tr('Code Metrics'),
-            self.tr('&Code Metrics...'), 0, 0,
-            self.chkGrp, 'project_code_metrics')
+            self.tr("Code Metrics"),
+            self.tr("&Code Metrics..."),
+            0,
+            0,
+            self.chkGrp,
+            "project_code_metrics",
+        )
         self.codeMetricsAct.setStatusTip(
-            self.tr('Show some code metrics for the project.'))
-        self.codeMetricsAct.setWhatsThis(self.tr(
-            """<b>Code Metrics...</b>"""
-            """<p>This shows some code metrics for all Python files in"""
-            """ the project.</p>"""
-        ))
+            self.tr("Show some code metrics for the project.")
+        )
+        self.codeMetricsAct.setWhatsThis(
+            self.tr(
+                """<b>Code Metrics...</b>"""
+                """<p>This shows some code metrics for all Python files in"""
+                """ the project.</p>"""
+            )
+        )
         self.codeMetricsAct.triggered.connect(self.__showCodeMetrics)
         self.actions.append(self.codeMetricsAct)
 
         self.codeCoverageAct = EricAction(
-            self.tr('Python Code Coverage'),
-            self.tr('Code Co&verage...'), 0, 0,
-            self.chkGrp, 'project_code_coverage')
+            self.tr("Python Code Coverage"),
+            self.tr("Code Co&verage..."),
+            0,
+            0,
+            self.chkGrp,
+            "project_code_coverage",
+        )
         self.codeCoverageAct.setStatusTip(
-            self.tr('Show code coverage information for the project.'))
-        self.codeCoverageAct.setWhatsThis(self.tr(
-            """<b>Code Coverage...</b>"""
-            """<p>This shows the code coverage information for all Python"""
-            """ files in the project.</p>"""
-        ))
+            self.tr("Show code coverage information for the project.")
+        )
+        self.codeCoverageAct.setWhatsThis(
+            self.tr(
+                """<b>Code Coverage...</b>"""
+                """<p>This shows the code coverage information for all Python"""
+                """ files in the project.</p>"""
+            )
+        )
         self.codeCoverageAct.triggered.connect(self.__showCodeCoverage)
         self.actions.append(self.codeCoverageAct)
 
         self.codeProfileAct = EricAction(
-            self.tr('Profile Data'),
-            self.tr('&Profile Data...'), 0, 0,
-            self.chkGrp, 'project_profile_data')
+            self.tr("Profile Data"),
+            self.tr("&Profile Data..."),
+            0,
+            0,
+            self.chkGrp,
+            "project_profile_data",
+        )
         self.codeProfileAct.setStatusTip(
-            self.tr('Show profiling data for the project.'))
-        self.codeProfileAct.setWhatsThis(self.tr(
-            """<b>Profile Data...</b>"""
-            """<p>This shows the profiling data for the project.</p>"""
-        ))
+            self.tr("Show profiling data for the project.")
+        )
+        self.codeProfileAct.setWhatsThis(
+            self.tr(
+                """<b>Profile Data...</b>"""
+                """<p>This shows the profiling data for the project.</p>"""
+            )
+        )
         self.codeProfileAct.triggered.connect(self.__showProfileData)
         self.actions.append(self.codeProfileAct)
-        
+
         ###################################################################
         ## Project Tools - graphics actions
         ###################################################################
@@ -4322,90 +4627,119 @@
         self.graphicsGrp = createActionGroup(self)
 
         self.applicationDiagramAct = EricAction(
-            self.tr('Application Diagram'),
-            self.tr('&Application Diagram...'), 0, 0,
-            self.graphicsGrp, 'project_application_diagram')
+            self.tr("Application Diagram"),
+            self.tr("&Application Diagram..."),
+            0,
+            0,
+            self.graphicsGrp,
+            "project_application_diagram",
+        )
         self.applicationDiagramAct.setStatusTip(
-            self.tr('Show a diagram of the project.'))
-        self.applicationDiagramAct.setWhatsThis(self.tr(
-            """<b>Application Diagram...</b>"""
-            """<p>This shows a diagram of the project.</p>"""
-        ))
-        self.applicationDiagramAct.triggered.connect(
-            self.handleApplicationDiagram)
+            self.tr("Show a diagram of the project.")
+        )
+        self.applicationDiagramAct.setWhatsThis(
+            self.tr(
+                """<b>Application Diagram...</b>"""
+                """<p>This shows a diagram of the project.</p>"""
+            )
+        )
+        self.applicationDiagramAct.triggered.connect(self.handleApplicationDiagram)
         self.actions.append(self.applicationDiagramAct)
 
         self.loadDiagramAct = EricAction(
-            self.tr('Load Diagram'),
-            self.tr('&Load Diagram...'), 0, 0,
-            self.graphicsGrp, 'project_load_diagram')
-        self.loadDiagramAct.setStatusTip(
-            self.tr('Load a diagram from file.'))
-        self.loadDiagramAct.setWhatsThis(self.tr(
-            """<b>Load Diagram...</b>"""
-            """<p>This loads a diagram from file.</p>"""
-        ))
+            self.tr("Load Diagram"),
+            self.tr("&Load Diagram..."),
+            0,
+            0,
+            self.graphicsGrp,
+            "project_load_diagram",
+        )
+        self.loadDiagramAct.setStatusTip(self.tr("Load a diagram from file."))
+        self.loadDiagramAct.setWhatsThis(
+            self.tr(
+                """<b>Load Diagram...</b>"""
+                """<p>This loads a diagram from file.</p>"""
+            )
+        )
         self.loadDiagramAct.triggered.connect(self.__loadDiagram)
         self.actions.append(self.loadDiagramAct)
-        
+
         ###################################################################
         ## Project Tools - plugin packaging actions
         ###################################################################
-        
+
         self.pluginGrp = createActionGroup(self)
-        
+
         self.pluginPkgListAct = EricAction(
-            self.tr('Create Package List'),
+            self.tr("Create Package List"),
             UI.PixmapCache.getIcon("pluginArchiveList"),
-            self.tr('Create &Package List'), 0, 0,
-            self.pluginGrp, 'project_plugin_pkglist')
+            self.tr("Create &Package List"),
+            0,
+            0,
+            self.pluginGrp,
+            "project_plugin_pkglist",
+        )
         self.pluginPkgListAct.setStatusTip(
-            self.tr('Create an initial PKGLIST file for an eric plugin.'))
-        self.pluginPkgListAct.setWhatsThis(self.tr(
-            """<b>Create Package List</b>"""
-            """<p>This creates an initial list of files to include in an"""
-            """ eric plugin archive. The list is created from the project"""
-            """ file.</p>"""
-        ))
+            self.tr("Create an initial PKGLIST file for an eric plugin.")
+        )
+        self.pluginPkgListAct.setWhatsThis(
+            self.tr(
+                """<b>Create Package List</b>"""
+                """<p>This creates an initial list of files to include in an"""
+                """ eric plugin archive. The list is created from the project"""
+                """ file.</p>"""
+            )
+        )
         self.pluginPkgListAct.triggered.connect(self.__pluginCreatePkgList)
         self.actions.append(self.pluginPkgListAct)
 
         self.pluginArchiveAct = EricAction(
-            self.tr('Create Plugin Archives'),
+            self.tr("Create Plugin Archives"),
             UI.PixmapCache.getIcon("pluginArchive"),
-            self.tr('Create Plugin &Archives'), 0, 0,
-            self.pluginGrp, 'project_plugin_archive')
-        self.pluginArchiveAct.setStatusTip(
-            self.tr('Create eric plugin archive files.'))
-        self.pluginArchiveAct.setWhatsThis(self.tr(
-            """<b>Create Plugin Archives</b>"""
-            """<p>This creates eric plugin archive files using the list"""
-            """ of files given in a PKGLIST* file. The archive name is"""
-            """ built from the main script name if not designated in"""
-            """ the package list file.</p>"""
-        ))
+            self.tr("Create Plugin &Archives"),
+            0,
+            0,
+            self.pluginGrp,
+            "project_plugin_archive",
+        )
+        self.pluginArchiveAct.setStatusTip(self.tr("Create eric plugin archive files."))
+        self.pluginArchiveAct.setWhatsThis(
+            self.tr(
+                """<b>Create Plugin Archives</b>"""
+                """<p>This creates eric plugin archive files using the list"""
+                """ of files given in a PKGLIST* file. The archive name is"""
+                """ built from the main script name if not designated in"""
+                """ the package list file.</p>"""
+            )
+        )
         self.pluginArchiveAct.triggered.connect(self.__pluginCreateArchives)
         self.actions.append(self.pluginArchiveAct)
-    
+
         self.pluginSArchiveAct = EricAction(
-            self.tr('Create Plugin Archives (Snapshot)'),
+            self.tr("Create Plugin Archives (Snapshot)"),
             UI.PixmapCache.getIcon("pluginArchiveSnapshot"),
-            self.tr('Create Plugin Archives (&Snapshot)'), 0, 0,
-            self.pluginGrp, 'project_plugin_sarchive')
-        self.pluginSArchiveAct.setStatusTip(self.tr(
-            'Create eric plugin archive files (snapshot releases).'))
-        self.pluginSArchiveAct.setWhatsThis(self.tr(
-            """<b>Create Plugin Archives (Snapshot)</b>"""
-            """<p>This creates eric plugin archive files using the list"""
-            """ of files given in the PKGLIST* file. The archive name is"""
-            """ built from the main script name if not designated in"""
-            """ the package list file. The version entry of the main script"""
-            """ is modified to reflect a snapshot release.</p>"""
-        ))
-        self.pluginSArchiveAct.triggered.connect(
-            self.__pluginCreateSnapshotArchives)
+            self.tr("Create Plugin Archives (&Snapshot)"),
+            0,
+            0,
+            self.pluginGrp,
+            "project_plugin_sarchive",
+        )
+        self.pluginSArchiveAct.setStatusTip(
+            self.tr("Create eric plugin archive files (snapshot releases).")
+        )
+        self.pluginSArchiveAct.setWhatsThis(
+            self.tr(
+                """<b>Create Plugin Archives (Snapshot)</b>"""
+                """<p>This creates eric plugin archive files using the list"""
+                """ of files given in the PKGLIST* file. The archive name is"""
+                """ built from the main script name if not designated in"""
+                """ the package list file. The version entry of the main script"""
+                """ is modified to reflect a snapshot release.</p>"""
+            )
+        )
+        self.pluginSArchiveAct.triggered.connect(self.__pluginCreateSnapshotArchives)
         self.actions.append(self.pluginSArchiveAct)
-        
+
         ###################################################################
         ## Project Tools - make actions
         ###################################################################
@@ -4413,126 +4747,158 @@
         self.makeGrp = createActionGroup(self)
 
         self.makeExecuteAct = EricAction(
-            self.tr('Execute Make'),
-            self.tr('&Execute Make'), 0, 0,
-            self.makeGrp, 'project_make_execute')
-        self.makeExecuteAct.setStatusTip(
-            self.tr("Perform a 'make' run."))
-        self.makeExecuteAct.setWhatsThis(self.tr(
-            """<b>Execute Make</b>"""
-            """<p>This performs a 'make' run to rebuild the configured"""
-            """ target.</p>"""
-        ))
+            self.tr("Execute Make"),
+            self.tr("&Execute Make"),
+            0,
+            0,
+            self.makeGrp,
+            "project_make_execute",
+        )
+        self.makeExecuteAct.setStatusTip(self.tr("Perform a 'make' run."))
+        self.makeExecuteAct.setWhatsThis(
+            self.tr(
+                """<b>Execute Make</b>"""
+                """<p>This performs a 'make' run to rebuild the configured"""
+                """ target.</p>"""
+            )
+        )
         self.makeExecuteAct.triggered.connect(self.__executeMake)
         self.actions.append(self.makeExecuteAct)
 
         self.makeTestAct = EricAction(
-            self.tr('Test for Changes'),
-            self.tr('&Test for Changes'), 0, 0,
-            self.makeGrp, 'project_make_test')
+            self.tr("Test for Changes"),
+            self.tr("&Test for Changes"),
+            0,
+            0,
+            self.makeGrp,
+            "project_make_test",
+        )
         self.makeTestAct.setStatusTip(
-            self.tr("Question 'make', if a rebuild is needed."))
-        self.makeTestAct.setWhatsThis(self.tr(
-            """<b>Test for Changes</b>"""
-            """<p>This questions 'make', if a rebuild of the configured"""
-            """ target is necessary.</p>"""
-        ))
+            self.tr("Question 'make', if a rebuild is needed.")
+        )
+        self.makeTestAct.setWhatsThis(
+            self.tr(
+                """<b>Test for Changes</b>"""
+                """<p>This questions 'make', if a rebuild of the configured"""
+                """ target is necessary.</p>"""
+            )
+        )
         self.makeTestAct.triggered.connect(
-            lambda: self.__executeMake(questionOnly=True))
+            lambda: self.__executeMake(questionOnly=True)
+        )
         self.actions.append(self.makeTestAct)
-        
+
         ###################################################################
         ## Project Tools - other tools actions
         ###################################################################
-        
+
         self.othersGrp = createActionGroup(self)
-        
+
         self.createSBOMAct = EricAction(
-            self.tr('Create SBOM File'),
-            self.tr('Create &SBOM File'), 0, 0,
-            self.othersGrp, 'project_create_sbom')
+            self.tr("Create SBOM File"),
+            self.tr("Create &SBOM File"),
+            0,
+            0,
+            self.othersGrp,
+            "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.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)
-        
+
         ###################################################################
         ## Project Tools - code formatting actions
         ###################################################################
-        
+
         self.blackFormattingGrp = createActionGroup(self)
-        
+
         self.blackAboutAct = EricAction(
             self.tr("About Black"),
             self.tr("&Black"),
-            0, 0,
-            self.blackFormattingGrp, "project_black_about"
+            0,
+            0,
+            self.blackFormattingGrp,
+            "project_black_about",
         )
-        self.blackAboutAct.setStatusTip(
-            self.tr("Show some information about 'Black'.")
+        self.blackAboutAct.setStatusTip(self.tr("Show some information about 'Black'."))
+        self.blackAboutAct.setWhatsThis(
+            self.tr(
+                "<b>Black</b>"
+                "<p>This shows some information about the installed 'Black' tool.</p>"
+            )
         )
-        self.blackAboutAct.setWhatsThis(self.tr(
-            "<b>Black</b>"
-            "<p>This shows some information about the installed 'Black' tool.</p>"
-        ))
         self.blackAboutAct.triggered.connect(self.__aboutBlack)
         self.actions.append(self.blackAboutAct)
         font = self.blackAboutAct.font()
         font.setBold(True)
         self.blackAboutAct.setFont(font)
-        
+
         self.blackFormatAct = EricAction(
             self.tr("Format Code"),
             self.tr("&Format Code"),
-            0, 0,
-            self.blackFormattingGrp, "project_black_format_code"
+            0,
+            0,
+            self.blackFormattingGrp,
+            "project_black_format_code",
         )
         self.blackFormatAct.setStatusTip(
             self.tr("Format the project sources with 'Black'.")
         )
-        self.blackFormatAct.setWhatsThis(self.tr(
-            "<b>Format Code</b>"
-            "<p>This shows a dialog to enter parameters for the formatting run and"
-            " reformats the project sources using 'Black'.</p>"
-        ))
+        self.blackFormatAct.setWhatsThis(
+            self.tr(
+                "<b>Format Code</b>"
+                "<p>This shows a dialog to enter parameters for the formatting run and"
+                " reformats the project sources using 'Black'.</p>"
+            )
+        )
         self.blackFormatAct.triggered.connect(
             lambda: self.__performFormatWithBlack(BlackFormattingAction.Format)
         )
         self.actions.append(self.blackFormatAct)
-        
+
         self.blackCheckFormattingAct = EricAction(
             self.tr("Check Code Formatting"),
             self.tr("&Check Code Formatting"),
-            0, 0,
-            self.blackFormattingGrp, "project_black_check_code"
+            0,
+            0,
+            self.blackFormattingGrp,
+            "project_black_check_code",
         )
         self.blackCheckFormattingAct.setStatusTip(
             self.tr(
                 "Check, if the project sources need to be reformatted with 'Black'."
             )
         )
-        self.blackCheckFormattingAct.setWhatsThis(self.tr(
-            "<b>Check Code Formatting</b>"
-            "<p>This shows a dialog to enter parameters for the format check run and"
-            " performs a check, if the project sources need to be reformatted using"
-            " 'Black'.</p>"
-        ))
+        self.blackCheckFormattingAct.setWhatsThis(
+            self.tr(
+                "<b>Check Code Formatting</b>"
+                "<p>This shows a dialog to enter parameters for the format check run"
+                " and performs a check, if the project sources need to be reformatted"
+                " using Black'.</p>"
+            )
+        )
         self.blackCheckFormattingAct.triggered.connect(
             lambda: self.__performFormatWithBlack(BlackFormattingAction.Check)
         )
         self.actions.append(self.blackCheckFormattingAct)
-        
+
         self.blackDiffFormattingAct = EricAction(
             self.tr("Code Formatting Diff"),
             self.tr("Code Formatting &Diff"),
-            0, 0,
-            self.blackFormattingGrp, "project_black_diff_code"
+            0,
+            0,
+            self.blackFormattingGrp,
+            "project_black_diff_code",
         )
         self.blackDiffFormattingAct.setStatusTip(
             self.tr(
@@ -4540,17 +4906,19 @@
                 " with 'Black'."
             )
         )
-        self.blackDiffFormattingAct.setWhatsThis(self.tr(
-            "<b>Diff Code Formatting</b>"
-            "<p>This shows a dialog to enter parameters for the format diff run and"
-            " generates a unified diff of potential project source reformatting using"
-            " 'Black'.</p>"
-        ))
+        self.blackDiffFormattingAct.setWhatsThis(
+            self.tr(
+                "<b>Diff Code Formatting</b>"
+                "<p>This shows a dialog to enter parameters for the format diff run and"
+                " generates a unified diff of potential project source reformatting"
+                " using Black'.</p>"
+            )
+        )
         self.blackDiffFormattingAct.triggered.connect(
             lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff)
         )
         self.actions.append(self.blackDiffFormattingAct)
-        
+
         self.closeAct.setEnabled(False)
         self.saveAct.setEnabled(False)
         self.saveasAct.setEnabled(False)
@@ -4562,36 +4930,36 @@
         self.sessActGrp.setEnabled(False)
         self.dbgActGrp.setEnabled(False)
         self.pluginGrp.setEnabled(False)
-        
+
     def initMenus(self):
         """
         Public slot to initialize the project menus.
-        
+
         @return tuple of generated menus
         @rtype tuple of (QMenu, QMenu)
         """
-        menu = QMenu(self.tr('&Project'), self.parent())
-        self.recentMenu = QMenu(self.tr('Open &Recent Projects'), menu)
-        self.sessionMenu = QMenu(self.tr('Session'), menu)
-        self.debuggerMenu = QMenu(self.tr('Debugger'), menu)
-        
-        toolsMenu = QMenu(self.tr('Project-T&ools'), self.parent())
-        self.vcsMenu = QMenu(self.tr('&Version Control'), toolsMenu)
+        menu = QMenu(self.tr("&Project"), self.parent())
+        self.recentMenu = QMenu(self.tr("Open &Recent Projects"), menu)
+        self.sessionMenu = QMenu(self.tr("Session"), menu)
+        self.debuggerMenu = QMenu(self.tr("Debugger"), menu)
+
+        toolsMenu = QMenu(self.tr("Project-T&ools"), self.parent())
+        self.vcsMenu = QMenu(self.tr("&Version Control"), toolsMenu)
         self.vcsMenu.setTearOffEnabled(True)
         self.vcsProjectHelper.initMenu(self.vcsMenu)
         self.vcsMenu.setEnabled(self.vcsSoftwareAvailable())
-        self.checksMenu = QMenu(self.tr('Chec&k'), toolsMenu)
+        self.checksMenu = QMenu(self.tr("Chec&k"), toolsMenu)
         self.checksMenu.setTearOffEnabled(True)
         self.formattingMenu = QMenu(self.tr("Code &Formatting"), toolsMenu)
         self.formattingMenu.setTearOffEnabled(True)
-        self.menuShow = QMenu(self.tr('Sho&w'), toolsMenu)
-        self.graphicsMenu = QMenu(self.tr('&Diagrams'), toolsMenu)
-        self.packagersMenu = QMenu(self.tr('Pac&kagers'), toolsMenu)
-        self.apidocMenu = QMenu(self.tr('Source &Documentation'), toolsMenu)
+        self.menuShow = QMenu(self.tr("Sho&w"), toolsMenu)
+        self.graphicsMenu = QMenu(self.tr("&Diagrams"), toolsMenu)
+        self.packagersMenu = QMenu(self.tr("Pac&kagers"), toolsMenu)
+        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.makeMenu = QMenu(self.tr("Make"), toolsMenu)
+        self.othersMenu = QMenu(self.tr("Other Tools"), toolsMenu)
+
         self.__menus = {
             "Main": menu,
             "Recent": self.recentMenu,
@@ -4607,7 +4975,7 @@
             "OtherTools": self.othersMenu,
             "Formatting": self.formattingMenu,
         }
-        
+
         # connect the aboutToShow signals
         self.recentMenu.aboutToShow.connect(self.__showContextMenuRecent)
         self.recentMenu.triggered.connect(self.__openRecent)
@@ -4623,47 +4991,47 @@
         self.othersMenu.aboutToShow.connect(self.__showContextMenuOthers)
         self.formattingMenu.aboutToShow.connect(self.__showContextMenuFormat)
         menu.aboutToShow.connect(self.__showMenu)
-        
+
         # build the show menu
         self.menuShow.setTearOffEnabled(True)
         self.menuShow.addAction(self.codeMetricsAct)
         self.menuShow.addAction(self.codeCoverageAct)
         self.menuShow.addAction(self.codeProfileAct)
-        
+
         # build the diagrams menu
         self.graphicsMenu.setTearOffEnabled(True)
         self.graphicsMenu.addAction(self.applicationDiagramAct)
         self.graphicsMenu.addSeparator()
         self.graphicsMenu.addAction(self.loadDiagramAct)
-        
+
         # build the session menu
         self.sessionMenu.setTearOffEnabled(True)
         self.sessionMenu.addActions(self.sessActGrp.actions())
-        
+
         # build the debugger menu
         self.debuggerMenu.setTearOffEnabled(True)
         self.debuggerMenu.addActions(self.dbgActGrp.actions())
-        
+
         # build the packagers menu
         self.packagersMenu.setTearOffEnabled(True)
         self.packagersMenu.addActions(self.pluginGrp.actions())
         self.packagersMenu.addSeparator()
-        
+
         # build the make menu
         self.makeMenu.setTearOffEnabled(True)
         self.makeMenu.addActions(self.makeGrp.actions())
         self.makeMenu.addSeparator()
-        
+
         # build the 'Other Tools' menu
         self.othersMenu.setTearOffEnabled(True)
         self.othersMenu.addActions(self.othersGrp.actions())
         self.othersMenu.addSeparator()
-        
+
         # build the 'Code Formatting' menu
         self.formattingMenu.setTearOffEnabled(True)
         self.formattingMenu.addActions(self.blackFormattingGrp.actions())
         self.formattingMenu.addSeparator()
-        
+
         # build the project main menu
         menu.setTearOffEnabled(True)
         menu.addActions(self.actGrp1.actions())
@@ -4683,7 +5051,7 @@
         menu.addSeparator()
         self.menuDebuggerAct = menu.addMenu(self.debuggerMenu)
         self.menuSessionAct = menu.addMenu(self.sessionMenu)
-        
+
         # build the project tools menu
         toolsMenu.setTearOffEnabled(True)
         toolsMenu.addSeparator()
@@ -4704,7 +5072,7 @@
         self.menuPackagersAct = toolsMenu.addMenu(self.packagersMenu)
         toolsMenu.addSeparator()
         self.menuOtherToolsAct = toolsMenu.addMenu(self.othersMenu)
-        
+
         self.menuCheckAct.setEnabled(False)
         self.menuShowAct.setEnabled(False)
         self.menuDiagramAct.setEnabled(False)
@@ -4715,17 +5083,17 @@
         self.menuMakeAct.setEnabled(False)
         self.menuOtherToolsAct.setEnabled(False)
         self.menuFormattingAct.setEnabled(False)
-        
+
         self.__menu = menu
         self.__toolsMenu = toolsMenu
-        
+
         return menu, toolsMenu
-        
+
     def initToolbars(self, toolbarManager):
         """
         Public slot to initialize the project toolbar and the basic VCS
         toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return tuple of the generated toolbars (tuple of two QToolBar)
@@ -4733,35 +5101,35 @@
         tb = QToolBar(self.tr("Project"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("ProjectToolbar")
-        tb.setToolTip(self.tr('Project'))
-        
+        tb.setToolTip(self.tr("Project"))
+
         tb.addActions(self.actGrp1.actions())
         tb.addAction(self.closeAct)
         tb.addSeparator()
         tb.addAction(self.saveAct)
         tb.addAction(self.saveasAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.addFilesAct, tb.windowTitle())
         toolbarManager.addAction(self.addDirectoryAct, tb.windowTitle())
         toolbarManager.addAction(self.addLanguageAct, tb.windowTitle())
         toolbarManager.addAction(self.propsAct, tb.windowTitle())
         toolbarManager.addAction(self.userPropsAct, tb.windowTitle())
-        
+
         import VCS
-        vcstb = VCS.getBasicHelper(self).initBasicToolbar(
-            self.ui, toolbarManager)
-        
+
+        vcstb = VCS.getBasicHelper(self).initBasicToolbar(self.ui, toolbarManager)
+
         return tb, vcstb
-        
+
     def __showMenu(self):
         """
         Private method to set up the project menu.
         """
         self.menuRecentAct.setEnabled(len(self.recent) > 0)
-        
+
         self.showMenu.emit("Main", self.__menus["Main"])
-        
+
     def __syncRecent(self):
         """
         Private method to synchronize the list of recently opened projects
@@ -4775,87 +5143,86 @@
         if len(self.recent) > maxRecent:
             self.recent = self.recent[:maxRecent]
         self.__saveRecent()
-        
+
     def __showContextMenuRecent(self):
         """
         Private method to set up the recent projects menu.
         """
         self.__loadRecent()
-        
+
         self.recentMenu.clear()
-        
+
         for idx, rp in enumerate(self.recent, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentMenu.addAction(
                 formatStr.format(
-                    idx,
-                    Utilities.compactPath(rp, self.ui.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rp, self.ui.maxMenuFilePathLen)
+                )
+            )
             act.setData(rp)
             act.setEnabled(pathlib.Path(rp).exists())
-        
+
         self.recentMenu.addSeparator()
-        self.recentMenu.addAction(self.tr('&Clear'), self.clearRecent)
-        
+        self.recentMenu.addAction(self.tr("&Clear"), self.clearRecent)
+
     def __openRecent(self, act):
         """
         Private method to open a project from the list of rencently opened
         projects.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         file = act.data()
         if file:
             self.openProject(file)
-        
+
     def clearRecent(self):
         """
         Public method to clear the recent projects menu.
         """
         self.recent = []
         self.__saveRecent()
-    
+
     def clearHistories(self):
         """
         Public method to clear the project related histories.
         """
         self.clearRecent()
-        
+
         for key in ["DebugClientsHistory", "DebuggerInterpreterHistory"]:
             Preferences.setProject(key, [])
         Preferences.syncPreferences()
-    
+
     def __searchNewFiles(self):
         """
         Private slot used to handle the search new files action.
         """
         self.__doSearchNewFiles(False, True)
-    
+
     def __searchProjectFile(self):
         """
         Private slot to show the Find Project File dialog.
         """
         if self.__findProjectFileDialog is None:
             from .QuickFindFileDialog import QuickFindFileDialog
+
             self.__findProjectFileDialog = QuickFindFileDialog(self)
-            self.__findProjectFileDialog.sourceFile.connect(
-                self.sourceFile)
-            self.__findProjectFileDialog.designerFile.connect(
-                self.designerFile)
-            self.__findProjectFileDialog.linguistFile.connect(
-                self.linguistFile)
+            self.__findProjectFileDialog.sourceFile.connect(self.sourceFile)
+            self.__findProjectFileDialog.designerFile.connect(self.designerFile)
+            self.__findProjectFileDialog.linguistFile.connect(self.linguistFile)
         self.__findProjectFileDialog.show()
         self.__findProjectFileDialog.raise_()
         self.__findProjectFileDialog.activateWindow()
-        
+
     def __doSearchNewFiles(self, AI=True, onUserDemand=False):
         """
         Private method to search for new files in the project directory.
-        
+
         If new files were found, it shows a dialog listing these files and
         gives the user the opportunity to select the ones he wants to
         include. If 'Automatic Inclusion' is enabled, the new files are
         automatically added to the project.
-        
+
         @param AI flag indicating whether the automatic inclusion should
                 be honoured (boolean)
         @param onUserDemand flag indicating whether this method was
@@ -4864,11 +5231,13 @@
         autoInclude = Preferences.getProject("AutoIncludeNewFiles")
         recursiveSearch = Preferences.getProject("SearchNewFilesRecursively")
         newFiles = []
-        
-        ignore_patterns = [pattern for pattern, filetype in
-                           self.pdata["FILETYPES"].items()
-                           if filetype == '__IGNORE__']
-        
+
+        ignore_patterns = [
+            pattern
+            for pattern, filetype in self.pdata["FILETYPES"].items()
+            if filetype == "__IGNORE__"
+        ]
+
         dirs = self.subdirs[:]
         for directory in dirs:
             skip = False
@@ -4878,7 +5247,7 @@
                     break
             if skip:
                 continue
-            
+
             curpath = os.path.join(self.ppath, directory)
             try:
                 newSources = os.listdir(curpath)
@@ -4886,28 +5255,28 @@
                 newSources = []
             pattern = (
                 self.pdata["TRANSLATIONPATTERN"].replace("%language%", "*")
-                if self.pdata["TRANSLATIONPATTERN"] else
-                "*.ts"
+                if self.pdata["TRANSLATIONPATTERN"]
+                else "*.ts"
             )
             binpattern = self.__binaryTranslationFile(pattern)
             for ns in newSources:
                 # ignore hidden files and directories
-                if ns.startswith('.'):
+                if ns.startswith("."):
                     continue
                 if (
-                    Utilities.isWindowsPlatform() and
-                    os.path.isdir(os.path.join(curpath, ns)) and
-                    ns.startswith('_')
+                    Utilities.isWindowsPlatform()
+                    and os.path.isdir(os.path.join(curpath, ns))
+                    and ns.startswith("_")
                 ):
                     # dot net hack
                     continue
-                
+
                 # set fn to project relative name
                 # then reset ns to fully qualified name for insertion,
                 # possibly.
                 fn = os.path.join(directory, ns) if directory else ns
                 ns = os.path.abspath(os.path.join(curpath, ns))
-                
+
                 # do not bother with dirs here...
                 if os.path.isdir(ns):
                     if recursiveSearch:
@@ -4915,109 +5284,108 @@
                         if d not in dirs:
                             dirs.append(d)
                     continue
-                
+
                 filetype = ""
                 bfn = os.path.basename(fn)
-                for pattern in sorted(self.pdata["FILETYPES"].keys(),
-                                      reverse=True):
+                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
                         filetype = self.pdata["FILETYPES"][pattern]
                         break
-                
+
                 if (
-                    (filetype == "SOURCES" and
-                     fn not in self.pdata["SOURCES"]) or
-                    (filetype == "FORMS" and
-                     fn not in self.pdata["FORMS"]) or
-                    (filetype == "INTERFACES" and
-                     fn not in self.pdata["INTERFACES"]) or
-                    (filetype == "PROTOCOLS" and
-                     fn not in self.pdata["PROTOCOLS"]) or
-                    (filetype == "RESOURCES" and
-                     fn not in self.pdata["RESOURCES"]) or
-                    (filetype == "OTHERS" and
-                     fn not in self.pdata["OTHERS"]) or
-                    (filetype == "TRANSLATIONS" and
-                     fn not in self.pdata["TRANSLATIONS"] and
-                     (fnmatch.fnmatch(ns, pattern) or
-                      fnmatch.fnmatch(ns, binpattern)))
+                    (filetype == "SOURCES" and fn not in self.pdata["SOURCES"])
+                    or (filetype == "FORMS" and fn not in self.pdata["FORMS"])
+                    or (filetype == "INTERFACES" and fn not in self.pdata["INTERFACES"])
+                    or (filetype == "PROTOCOLS" and fn not in self.pdata["PROTOCOLS"])
+                    or (filetype == "RESOURCES" and fn not in self.pdata["RESOURCES"])
+                    or (filetype == "OTHERS" and fn not in self.pdata["OTHERS"])
+                    or (
+                        filetype == "TRANSLATIONS"
+                        and fn not in self.pdata["TRANSLATIONS"]
+                        and (
+                            fnmatch.fnmatch(ns, pattern)
+                            or fnmatch.fnmatch(ns, binpattern)
+                        )
+                    )
                 ):
                     if autoInclude and AI:
                         self.appendFile(ns)
                     else:
                         newFiles.append(ns)
-        
+
         # if autoInclude is set there is no more work left
-        if (autoInclude and AI):
+        if autoInclude and AI:
             return
-        
+
         # if newfiles is empty, put up message box informing user nothing found
         if not newFiles:
             if onUserDemand:
                 EricMessageBox.information(
                     self.ui,
                     self.tr("Search New Files"),
-                    self.tr("There were no new files found to be added."))
+                    self.tr("There were no new files found to be added."),
+                )
             return
-            
+
         # autoInclude is not set, show a dialog
         from .AddFoundFilesDialog import AddFoundFilesDialog
+
         dlg = AddFoundFilesDialog(newFiles, self.parent(), None)
         res = dlg.exec()
-        
+
         # the 'Add All' button was pressed
         if res == 1:
             for file in newFiles:
                 self.appendFile(file)
-            
+
         # the 'Add Selected' button was pressed
         elif res == 2:
             files = dlg.getSelection()
             for file in files:
                 self.appendFile(file)
-        
+
     def othersAdded(self, fn, updateModel=True):
         """
         Public slot to be called, if something was added to the OTHERS project
         data area.
-        
+
         @param fn filename or directory name added (string)
         @param updateModel flag indicating an update of the model is requested
             (boolean)
         """
         self.projectOthersAdded.emit(fn)
         updateModel and self.__model.addNewItem("OTHERS", fn)
-        
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.actions[:]
-        
+
     def addEricActions(self, actions):
         """
         Public method to add actions to the list of actions.
-        
+
         @param actions list of actions (list of EricAction)
         """
         self.actions.extend(actions)
-        
+
     def removeEricActions(self, actions):
         """
         Public method to remove actions from the list of actions.
-        
+
         @param actions list of actions (list of EricAction)
         """
         for act in actions:
             with contextlib.suppress(ValueError):
                 self.actions.remove(act)
-        
+
     def getMenu(self, menuName):
         """
         Public method to get a reference to the main menu or a submenu.
-        
+
         @param menuName name of the menu (string)
         @return reference to the requested menu (QMenu) or None
         """
@@ -5025,30 +5393,30 @@
             return self.__menus[menuName]
         except KeyError:
             return None
-        
+
     def repopulateItem(self, fullname):
         """
         Public slot to repopulate a named item.
-        
+
         @param fullname full name of the item to repopulate (string)
         """
         if not self.isOpen():
             return
-        
+
         with EricOverrideCursor():
             name = self.getRelativePath(fullname)
             self.prepareRepopulateItem.emit(name)
             self.__model.repopulateItem(name)
             self.completeRepopulateItem.emit(name)
-    
+
     ##############################################################
     ## Below is the VCS interface
     ##############################################################
-    
+
     def initVCS(self, vcsSystem=None, nooverride=False):
         """
         Public method used to instantiate a vcs system.
-        
+
         @param vcsSystem type of VCS to be used (string)
         @param nooverride flag indicating to ignore an override request
             (boolean)
@@ -5057,25 +5425,26 @@
         vcs = None
         forProject = True
         override = False
-        
+
         if vcsSystem is None:
-            if self.pdata["VCS"] and self.pdata["VCS"] != 'None':
+            if self.pdata["VCS"] and self.pdata["VCS"] != "None":
                 vcsSystem = self.pdata["VCS"]
         else:
             forProject = False
-        
+
         if (
-            forProject and
-            self.pdata["VCS"] and
-            self.pdata["VCS"] != 'None' and
-            self.pudata["VCSOVERRIDE"] and
-            not nooverride
+            forProject
+            and self.pdata["VCS"]
+            and self.pdata["VCS"] != "None"
+            and self.pudata["VCSOVERRIDE"]
+            and not nooverride
         ):
             vcsSystem = self.pudata["VCSOVERRIDE"]
             override = True
-        
+
         if vcsSystem is not None:
             import VCS
+
             try:
                 vcs = VCS.factory(vcsSystem)
             except ImportError:
@@ -5083,7 +5452,7 @@
                     # override failed, revert to original
                     self.pudata["VCSOVERRIDE"] = ""
                     return self.initVCS(nooverride=True)
-        
+
         if vcs:
             vcsExists, msg = vcs.vcsExists()
             if not vcsExists:
@@ -5096,11 +5465,12 @@
                             self.tr(
                                 "<p>The selected VCS <b>{0}</b> could not be"
                                 " found. <br/>Reverting override.</p><p>{1}"
-                                "</p>")
-                            .format(vcsSystem, msg))
+                                "</p>"
+                            ).format(vcsSystem, msg),
+                        )
                         self.pudata["VCSOVERRIDE"] = ""
                     return self.initVCS(nooverride=True)
-                
+
                 with EricOverridenCursor():
                     EricMessageBox.critical(
                         self.ui,
@@ -5108,14 +5478,16 @@
                         self.tr(
                             "<p>The selected VCS <b>{0}</b> could not be"
                             " found.<br/>Disabling version control.</p>"
-                            "<p>{1}</p>").format(vcsSystem, msg))
+                            "<p>{1}</p>"
+                        ).format(vcsSystem, msg),
+                    )
                 vcs = None
                 if forProject:
-                    self.pdata["VCS"] = 'None'
+                    self.pdata["VCS"] = "None"
                     self.setDirty(True)
             else:
                 vcs.vcsInitConfig(self)
-        
+
         if vcs and forProject:
             # set the vcs options
             if vcs.vcsSupportCommandOptions():
@@ -5126,10 +5498,11 @@
             with contextlib.suppress(LookupError):
                 vcsother = copy.deepcopy(self.pdata["VCSOTHERDATA"])
                 vcs.vcsSetOtherData(vcsother)
-        
+
         if forProject:
             if vcs is None:
                 import VCS
+
                 self.vcsProjectHelper = VCS.getBasicHelper(self)
                 self.vcsBasicHelper = True
             else:
@@ -5138,17 +5511,17 @@
             if self.vcsMenu is not None:
                 self.vcsProjectHelper.initMenu(self.vcsMenu)
                 self.vcsMenu.setEnabled(self.vcsSoftwareAvailable())
-        
+
         return vcs
-    
+
     def resetVCS(self):
         """
         Public method to reset the VCS.
         """
-        self.pdata["VCS"] = 'None'
+        self.pdata["VCS"] = "None"
         self.vcs = self.initVCS()
         ericApp().getObject("PluginManager").deactivateVcsPlugins()
-    
+
     def __showContextMenuVCS(self):
         """
         Private slot called before the vcs menu is shown.
@@ -5156,88 +5529,87 @@
         self.vcsProjectHelper.showMenu()
         if self.vcsBasicHelper:
             self.showMenu.emit("VCS", self.vcsMenu)
-    
+
     def vcsSoftwareAvailable(self):
         """
         Public method to check, if some supported VCS software is available
         to the IDE.
-        
+
         @return flag indicating availability of VCS software (boolean)
         """
         vcsSystemsDict = (
-            ericApp().getObject("PluginManager")
+            ericApp()
+            .getObject("PluginManager")
             .getPluginDisplayStrings("version_control")
         )
         return len(vcsSystemsDict) != 0
-    
+
     def __vcsStatusChanged(self):
         """
         Private slot to handle a change of the overall VCS status.
         """
         self.projectChanged.emit()
-    
+
     def __vcsConnectStatusMonitor(self):
         """
         Private method to start the VCS monitor and connect its signals.
         """
         if self.vcs is not None:
             self.vcs.committed.connect(self.vcsCommitted)
-            
+
             self.vcs.startStatusMonitor(self)
-            self.vcs.vcsStatusMonitorData.connect(
-                self.__model.changeVCSStates)
-            self.vcs.vcsStatusMonitorData.connect(
-                self.vcsStatusMonitorData)
-            self.vcs.vcsStatusMonitorAllData.connect(
-                self.vcsStatusMonitorAllData)
-            self.vcs.vcsStatusMonitorStatus.connect(
-                self.vcsStatusMonitorStatus)
-            self.vcs.vcsStatusMonitorInfo.connect(
-                self.vcsStatusMonitorInfo)
-            self.vcs.vcsStatusChanged.connect(
-                self.__vcsStatusChanged)
-    
+            self.vcs.vcsStatusMonitorData.connect(self.__model.changeVCSStates)
+            self.vcs.vcsStatusMonitorData.connect(self.vcsStatusMonitorData)
+            self.vcs.vcsStatusMonitorAllData.connect(self.vcsStatusMonitorAllData)
+            self.vcs.vcsStatusMonitorStatus.connect(self.vcsStatusMonitorStatus)
+            self.vcs.vcsStatusMonitorInfo.connect(self.vcsStatusMonitorInfo)
+            self.vcs.vcsStatusChanged.connect(self.__vcsStatusChanged)
+
     #########################################################################
     ## Below is the interface to the checker tools
     #########################################################################
-    
+
     def __showContextMenuChecks(self):
         """
         Private slot called before the checks menu is shown.
         """
         self.showMenu.emit("Checks", self.checksMenu)
-    
+
     #########################################################################
     ## Below is the interface to the packagers tools
     #########################################################################
-    
+
     def __showContextMenuPackagers(self):
         """
         Private slot called before the packagers menu is shown.
         """
         self.showMenu.emit("Packagers", self.packagersMenu)
-    
+
     #########################################################################
     ## Below is the interface to the apidoc tools
     #########################################################################
-    
+
     def __showContextMenuApiDoc(self):
         """
         Private slot called before the apidoc menu is shown.
         """
         self.showMenu.emit("Apidoc", self.apidocMenu)
-    
+
     #########################################################################
     ## Below is the interface to the show tools
     #########################################################################
-    
+
     def __showCodeMetrics(self):
         """
         Private slot used to calculate some code metrics for the project files.
         """
-        files = [os.path.join(self.ppath, file)
-                 for file in self.pdata["SOURCES"] if file.endswith(".py")]
+        files = [
+            os.path.join(self.ppath, file)
+            for file in self.pdata["SOURCES"]
+            if file.endswith(".py")
+        ]
         from DataViews.CodeMetricsDialog import CodeMetricsDialog
+
         self.codemetrics = CodeMetricsDialog()
         self.codemetrics.show()
         self.codemetrics.prepare(files)
@@ -5254,9 +5626,11 @@
                 self.tr("Coverage Data"),
                 self.tr(
                     "There is no main script defined for the"
-                    " current project. Aborting"))
+                    " current project. Aborting"
+                ),
+            )
             return
-        
+
         files = Utilities.getCoverageFileNames(fn)
         if files:
             if len(files) > 1:
@@ -5265,18 +5639,23 @@
                     self.tr("Code Coverage"),
                     self.tr("Please select a coverage file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 fn = files[0]
         else:
             return
-        
-        files = [os.path.join(self.ppath, file)
-                 for file in self.pdata["SOURCES"]
-                 if os.path.splitext(file)[1].startswith(".py")]
+
+        files = [
+            os.path.join(self.ppath, file)
+            for file in self.pdata["SOURCES"]
+            if os.path.splitext(file)[1].startswith(".py")
+        ]
         from DataViews.PyCoverageDialog import PyCoverageDialog
+
         self.codecoverage = PyCoverageDialog()
         self.codecoverage.show()
         self.codecoverage.start(fn, files)
@@ -5292,9 +5671,11 @@
                 self.tr("Profile Data"),
                 self.tr(
                     "There is no main script defined for the"
-                    " current project. Aborting"))
+                    " current project. Aborting"
+                ),
+            )
             return
-        
+
         files = Utilities.getProfileFileNames(fn)
         if files:
             if len(files) > 1:
@@ -5303,19 +5684,22 @@
                     self.tr("Profile Data"),
                     self.tr("Please select a profile file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 fn = files[0]
         else:
             return
-        
+
         from DataViews.PyProfileDialog import PyProfileDialog
+
         self.profiledata = PyProfileDialog()
         self.profiledata.show()
         self.profiledata.start(fn)
-        
+
     def __showContextMenuShow(self):
         """
         Private slot called before the show menu is shown.
@@ -5323,28 +5707,26 @@
         fn = self.getMainScript(True)
         if not fn:
             fn = self.getProjectPath()
-        
+
         self.codeProfileAct.setEnabled(
-            self.isPy3Project() and
-            bool(Utilities.getProfileFileName(fn))
+            self.isPy3Project() and bool(Utilities.getProfileFileName(fn))
         )
         self.codeCoverageAct.setEnabled(
-            self.isPy3Project() and
-            bool(Utilities.getCoverageFileNames(fn))
+            self.isPy3Project() and bool(Utilities.getCoverageFileNames(fn))
         )
-        
+
         self.showMenu.emit("Show", self.menuShow)
-    
+
     #########################################################################
     ## Below is the interface to the diagrams
     #########################################################################
-    
+
     def __showContextMenuGraphics(self):
         """
         Private slot called before the graphics menu is shown.
         """
         self.showMenu.emit("Graphics", self.graphicsMenu)
-    
+
     def handleApplicationDiagram(self):
         """
         Public method to handle the application diagram context menu action.
@@ -5353,109 +5735,111 @@
             self.ui,
             self.tr("Application Diagram"),
             self.tr("""Include module names?"""),
-            yesDefault=True)
-        
+            yesDefault=True,
+        )
+
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.applicationDiagram = UMLDialog(
-            UMLDialogType.APPLICATION_DIAGRAM, self, self.parent(),
-            noModules=not res)
+            UMLDialogType.APPLICATION_DIAGRAM, self, self.parent(), noModules=not res
+        )
         self.applicationDiagram.show()
-    
+
     def __loadDiagram(self):
         """
         Private slot to load a diagram from file.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.loadedDiagram = None
-        loadedDiagram = UMLDialog(UMLDialogType.NO_DIAGRAM,
-                                  self, parent=self.parent())
+        loadedDiagram = UMLDialog(UMLDialogType.NO_DIAGRAM, self, parent=self.parent())
         if loadedDiagram.load():
             self.loadedDiagram = loadedDiagram
             self.loadedDiagram.show(fromFile=True)
-    
+
     #########################################################################
     ## Below is the interface to the VCS monitor thread
     #########################################################################
-    
+
     def setStatusMonitorInterval(self, interval):
         """
         Public method to se the interval of the VCS status monitor thread.
-        
+
         @param interval status monitor interval in seconds (integer)
         """
         if self.vcs is not None:
             self.vcs.setStatusMonitorInterval(interval, self)
-        
+
     def getStatusMonitorInterval(self):
         """
         Public method to get the monitor interval.
-        
+
         @return interval in seconds (integer)
         """
         if self.vcs is not None:
             return self.vcs.getStatusMonitorInterval()
         else:
             return 0
-        
+
     def setStatusMonitorAutoUpdate(self, auto):
         """
         Public method to enable the auto update function.
-        
+
         @param auto status of the auto update function (boolean)
         """
         if self.vcs is not None:
             self.vcs.setStatusMonitorAutoUpdate(auto)
-        
+
     def getStatusMonitorAutoUpdate(self):
         """
         Public method to retrieve the status of the auto update function.
-        
+
         @return status of the auto update function (boolean)
         """
         if self.vcs is not None:
             return self.vcs.getStatusMonitorAutoUpdate()
         else:
             return False
-        
+
     def checkVCSStatus(self):
         """
         Public method to wake up the VCS status monitor thread.
         """
         if self.vcs is not None:
             self.vcs.checkVCSStatus()
-        
+
     def clearStatusMonitorCachedState(self, name):
         """
         Public method to clear the cached VCS state of a file/directory.
-        
+
         @param name name of the entry to be cleared (string)
         """
         if self.vcs is not None:
             self.vcs.clearStatusMonitorCachedState(name)
-        
+
     def startStatusMonitor(self):
         """
         Public method to start the VCS status monitor thread.
         """
         if self.vcs is not None:
             self.vcs.startStatusMonitor(self)
-        
+
     def stopStatusMonitor(self):
         """
         Public method to stop the VCS status monitor thread.
         """
         if self.vcs is not None:
             self.vcs.stopStatusMonitor()
-    
+
     #########################################################################
     ## Below are the plugin development related methods
     #########################################################################
-    
+
     def __pluginVersionToTuple(self, versionStr):
         """
         Private method to convert a plug-in version string into a version
         tuple.
-        
+
         @param versionStr version string to be converted
         @type str
         @return version info as a tuple
@@ -5471,12 +5855,12 @@
                 vParts.append(int(part))
             except ValueError:
                 vParts.append(part)
-        
+
         if additional:
             vParts.append(additional)
-        
+
         return tuple(vParts)
-    
+
     def __pluginCreatePkgList(self):
         """
         Private slot to create a PKGLIST file needed for archive file creation.
@@ -5488,29 +5872,41 @@
                 self.tr("Create Package List"),
                 self.tr(
                     "<p>The file <b>PKGLIST</b> already"
-                    " exists.</p><p>Overwrite it?</p>"),
-                icon=EricMessageBox.Warning)
+                    " exists.</p><p>Overwrite it?</p>"
+                ),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return  # don't overwrite
-        
+
         # build the list of entries
         lst_ = []
-        for key in ["SOURCES", "FORMS", "RESOURCES", "TRANSLATIONS",
-                    "INTERFACES", "PROTOCOLS", "OTHERS"]:
+        for key in [
+            "SOURCES",
+            "FORMS",
+            "RESOURCES",
+            "TRANSLATIONS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "OTHERS",
+        ]:
             lst_.extend(self.pdata[key])
         lst = []
         for entry in lst_:
             if os.path.isdir(self.getAbsolutePath(entry)):
                 lst.extend(
-                    [self.getRelativePath(p) for p in
-                     Utilities.direntries(self.getAbsolutePath(entry), True)])
+                    [
+                        self.getRelativePath(p)
+                        for p in Utilities.direntries(self.getAbsolutePath(entry), True)
+                    ]
+                )
                 continue
             else:
                 lst.append(entry)
         lst.sort()
         if "PKGLIST" in lst:
             lst.remove("PKGLIST")
-        
+
         # build the header to indicate a freshly generated list
         header = [
             ";",
@@ -5518,16 +5914,15 @@
             ";",
             " ",
         ]
-        
+
         # write the file
         try:
             newline = None if self.pdata["EOL"] == 0 else self.getEolString()
-            with open(pkglist, "w", encoding="utf-8",
-                      newline=newline) as pkglistFile:
+            with open(pkglist, "w", encoding="utf-8", newline=newline) as pkglistFile:
                 pkglistFile.write("\n".join(header) + "\n")
                 pkglistFile.write(
-                    "\n".join([Utilities.fromNativeSeparators(f)
-                               for f in lst]))
+                    "\n".join([Utilities.fromNativeSeparators(f) for f in lst])
+                )
                 pkglistFile.write("\n")
                 # ensure the file ends with an empty line
         except OSError as why:
@@ -5536,17 +5931,19 @@
                 self.tr("Create Package List"),
                 self.tr(
                     """<p>The file <b>PKGLIST</b> could not be created.</p>"""
-                    """<p>Reason: {0}</p>""").format(str(why)))
+                    """<p>Reason: {0}</p>"""
+                ).format(str(why)),
+            )
             return
-        
+
         if "PKGLIST" not in self.pdata["OTHERS"]:
             self.appendFile("PKGLIST")
-        
+
     @pyqtSlot()
     def __pluginCreateArchives(self, snapshot=False):
         """
         Private slot to create eric plugin archives.
-        
+
         @param snapshot flag indicating snapshot archives (boolean)
         """
         if not self.pdata["MAINSCRIPT"]:
@@ -5555,36 +5952,50 @@
                 self.tr("Create Plugin Archive"),
                 self.tr(
                     """The project does not have a main script defined. """
-                    """Aborting..."""))
+                    """Aborting..."""
+                ),
+            )
             return
-        
+
         selectedLists = []
-        pkglists = [os.path.basename(f) for f in
-                    glob.glob(os.path.join(self.ppath, "PKGLIST*"))]
+        pkglists = [
+            os.path.basename(f) for f in glob.glob(os.path.join(self.ppath, "PKGLIST*"))
+        ]
         if len(pkglists) == 1:
             selectedLists = [os.path.join(self.ppath, pkglists[0])]
         elif len(pkglists) > 1:
             dlg = EricListSelectionDialog(
-                sorted(pkglists), title=self.tr("Create Plugin Archive"),
+                sorted(pkglists),
+                title=self.tr("Create Plugin Archive"),
                 message=self.tr("Select package lists:"),
-                checkBoxSelection=True)
+                checkBoxSelection=True,
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
-                selectedLists = [os.path.join(self.ppath, s)
-                                 for s in dlg.getSelection()]
+                selectedLists = [
+                    os.path.join(self.ppath, s) for s in dlg.getSelection()
+                ]
             else:
                 return
-        
+
         if not selectedLists:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Create Plugin Archive"),
-                self.tr("""<p>No package list files (PKGLIST*) available or"""
-                        """ selected. Aborting...</p>"""))
+                self.tr(
+                    """<p>No package list files (PKGLIST*) available or"""
+                    """ selected. Aborting...</p>"""
+                ),
+            )
             return
-        
+
         progress = EricProgressDialog(
-            self.tr("Creating plugin archives..."), self.tr("Abort"),
-            0, len(selectedLists), self.tr("%v/%m Archives"), self.ui)
+            self.tr("Creating plugin archives..."),
+            self.tr("Abort"),
+            0,
+            len(selectedLists),
+            self.tr("%v/%m Archives"),
+            self.ui,
+        )
         progress.setMinimumDuration(0)
         progress.setWindowTitle(self.tr("Create Plugin Archives"))
         errors = 0
@@ -5592,7 +6003,7 @@
             progress.setValue(count)
             if progress.wasCanceled():
                 break
-            
+
             try:
                 with open(pkglist, "r", encoding="utf-8") as pkglistFile:
                     names = pkglistFile.read()
@@ -5602,11 +6013,12 @@
                     self.tr("Create Plugin Archive"),
                     self.tr(
                         """<p>The file <b>{0}</b> could not be read.</p>"""
-                        """<p>Reason: {1}</p>""").format(
-                        os.path.basename(pkglist), str(why)))
+                        """<p>Reason: {1}</p>"""
+                    ).format(os.path.basename(pkglist), str(why)),
+                )
                 errors += 1
                 continue
-            
+
             lines = names.splitlines()
             archiveName = ""
             archiveVersion = ""
@@ -5631,22 +6043,25 @@
                                 """<p>The file <b>{0}</b> is not ready yet."""
                                 """</p><p>Please rework it and delete the"""
                                 """'; initial_list' line of the header."""
-                                """</p>""").format(os.path.basename(pkglist)))
+                                """</p>"""
+                            ).format(os.path.basename(pkglist)),
+                        )
                         errors += 1
                         listOK = False
                         break
                 elif line.strip():
                     names.append(line.strip())
-            
+
             if not listOK:
                 continue
-            
+
             names = sorted(names)
             archive = (
                 os.path.join(self.ppath, archiveName)
-                if archiveName else
-                os.path.join(self.ppath,
-                             self.pdata["MAINSCRIPT"].replace(".py", ".zip"))
+                if archiveName
+                else os.path.join(
+                    self.ppath, self.pdata["MAINSCRIPT"].replace(".py", ".zip")
+                )
             )
             try:
                 archiveFile = zipfile.ZipFile(archive, "w")
@@ -5657,32 +6072,30 @@
                     self.tr(
                         """<p>The eric plugin archive file <b>{0}</b>"""
                         """ could not be created.</p>"""
-                        """<p>Reason: {1}</p>""").format(archive, str(why)))
+                        """<p>Reason: {1}</p>"""
+                    ).format(archive, str(why)),
+                )
                 errors += 1
                 continue
-            
+
             for name in names:
                 if name:
                     try:
-                        self.__createZipDirEntries(
-                            os.path.split(name)[0], archiveFile)
+                        self.__createZipDirEntries(os.path.split(name)[0], archiveFile)
                         if snapshot and name == self.pdata["MAINSCRIPT"]:
-                            snapshotSource, version = (
-                                self.__createSnapshotSource(
-                                    os.path.join(self.ppath,
-                                                 self.pdata["MAINSCRIPT"]))
+                            snapshotSource, version = self.__createSnapshotSource(
+                                os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
                             )
                             archiveFile.writestr(name, snapshotSource)
                         else:
-                            archiveFile.write(os.path.join(self.ppath, name),
-                                              name)
+                            archiveFile.write(os.path.join(self.ppath, name), name)
                             if name == self.pdata["MAINSCRIPT"]:
                                 version = self.__pluginExtractVersion(
-                                    os.path.join(self.ppath,
-                                                 self.pdata["MAINSCRIPT"]))
+                                    os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                                )
                                 if archiveVersion and (
-                                    self.__pluginVersionToTuple(version) <
-                                    self.__pluginVersionToTuple(archiveVersion)
+                                    self.__pluginVersionToTuple(version)
+                                    < self.__pluginVersionToTuple(archiveVersion)
                                 ):
                                     version = archiveVersion
                     except OSError as why:
@@ -5692,62 +6105,68 @@
                             self.tr(
                                 """<p>The file <b>{0}</b> could not be"""
                                 """ stored in the archive. Ignoring it.</p>"""
-                                """<p>Reason: {1}</p>""")
-                            .format(os.path.join(self.ppath, name), str(why)))
+                                """<p>Reason: {1}</p>"""
+                            ).format(os.path.join(self.ppath, name), str(why)),
+                        )
             archiveFile.writestr("VERSION", version.encode("utf-8"))
             archiveFile.close()
-            
+
             if archive not in self.pdata["OTHERS"]:
                 self.appendFile(archive)
-        
+
         progress.setValue(len(selectedLists))
-        
+
         if errors:
             self.ui.showNotification(
                 UI.PixmapCache.getPixmap("pluginArchive48"),
                 self.tr("Create Plugin Archive"),
-                self.tr("<p>The eric plugin archive files were "
-                        "created with some errors.</p>"),
+                self.tr(
+                    "<p>The eric plugin archive files were "
+                    "created with some errors.</p>"
+                ),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
         else:
             self.ui.showNotification(
                 UI.PixmapCache.getPixmap("pluginArchive48"),
                 self.tr("Create Plugin Archive"),
-                self.tr("<p>The eric plugin archive files were "
-                        "created successfully.</p>"))
-    
+                self.tr(
+                    "<p>The eric plugin archive files were " "created successfully.</p>"
+                ),
+            )
+
     def __pluginCreateSnapshotArchives(self):
         """
         Private slot to create eric plugin archive snapshot releases.
         """
         self.__pluginCreateArchives(True)
-    
+
     def __createZipDirEntries(self, path, zipFile):
         """
         Private method to create dir entries in the zip file.
-        
+
         @param path name of the directory entry to create (string)
         @param zipFile open ZipFile object (zipfile.ZipFile)
         """
         if path in ("", "/", "\\"):
             return
-        
+
         if not path.endswith("/") and not path.endswith("\\"):
             path = "{0}/".format(path)
-        
+
         if path not in zipFile.namelist():
             self.__createZipDirEntries(os.path.split(path[:-1])[0], zipFile)
             zipFile.writestr(path, b"")
-    
+
     def __createSnapshotSource(self, filename):
         """
         Private method to create a snapshot plugin version.
-        
+
         The version entry in the plugin module is modified to signify
         a snapshot version. This method appends the string "-snapshot-"
         and date indicator to the version string.
-        
+
         @param filename name of the plugin file to modify (string)
         @return modified source (bytes), snapshot version string (string)
         """
@@ -5758,36 +6177,37 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Create Plugin Archive"),
-                self.tr("""<p>The plugin file <b>{0}</b> could """
-                        """not be read.</p>"""
-                        """<p>Reason: {1}</p>""")
-                .format(filename, str(why)))
+                self.tr(
+                    """<p>The plugin file <b>{0}</b> could """
+                    """not be read.</p>"""
+                    """<p>Reason: {1}</p>"""
+                ).format(filename, str(why)),
+            )
             return b"", ""
-        
+
         lineno = 0
         while lineno < len(sourcelines):
             if sourcelines[lineno].startswith("version = "):
                 # found the line to modify
                 datestr = time.strftime("%Y%m%d")
-                lineend = sourcelines[lineno].replace(
-                    sourcelines[lineno].rstrip(), "")
+                lineend = sourcelines[lineno].replace(sourcelines[lineno].rstrip(), "")
                 sversion = "{0}-snapshot-{1}".format(
-                    sourcelines[lineno].replace("version = ", "")
-                    .strip()[1:-1],
-                    datestr)
+                    sourcelines[lineno].replace("version = ", "").strip()[1:-1], datestr
+                )
                 sourcelines[lineno] = '{0} + "-snapshot-{1}"{2}'.format(
-                    sourcelines[lineno].rstrip(), datestr, lineend)
+                    sourcelines[lineno].rstrip(), datestr, lineend
+                )
                 break
-            
+
             lineno += 1
-        
+
         source = Utilities.encode("".join(sourcelines), encoding)[0]
         return source, sversion
-    
+
     def __pluginExtractVersion(self, filename):
         """
         Private method to extract the version number entry.
-        
+
         @param filename name of the plugin file (string)
         @return version string (string)
         """
@@ -5801,35 +6221,38 @@
                 self.tr("Create Plugin Archive"),
                 self.tr(
                     """<p>The plugin file <b>{0}</b> could """
-                    """not be read.</p> <p>Reason: {1}</p>""")
-                .format(filename, str(why)))
+                    """not be read.</p> <p>Reason: {1}</p>"""
+                ).format(filename, str(why)),
+            )
             return ""
-        
+
         for sourceline in sourcelines:
             if sourceline.startswith("version = "):
                 version = (
-                    sourceline.replace("version = ", "").strip()
-                    .replace('"', "").replace("'", "")
+                    sourceline.replace("version = ", "")
+                    .strip()
+                    .replace('"', "")
+                    .replace("'", "")
                 )
                 break
-        
+
         return version
-    
+
     #########################################################################
     ## Below are methods implementing the 'make' support
     #########################################################################
-    
+
     def __showContextMenuMake(self):
         """
         Private slot called before the make menu is shown.
         """
         self.showMenu.emit("Make", self.makeMenu)
-    
+
     def hasDefaultMakeParameters(self):
         """
         Public method to test, if the project contains the default make
         parameters.
-        
+
         @return flag indicating default parameter set
         @rtype bool
         """
@@ -5841,16 +6264,16 @@
             "MakeParameters": "",
             "MakeTestOnly": True,
         }
-    
+
     def isMakeEnabled(self):
         """
         Public method to test, if make is enabled for the project.
-        
+
         @return flag indicating enabled make support
         @rtype bool
         """
         return self.pdata["MAKEPARAMS"]["MakeEnabled"]
-    
+
     @pyqtSlot()
     def executeMake(self):
         """
@@ -5858,14 +6281,14 @@
         (execute or question).
         """
         self.__executeMake(
-            questionOnly=self.pdata["MAKEPARAMS"]["MakeTestOnly"],
-            interactive=False)
-    
+            questionOnly=self.pdata["MAKEPARAMS"]["MakeTestOnly"], interactive=False
+        )
+
     @pyqtSlot()
     def __executeMake(self, questionOnly=False, interactive=True):
         """
         Private method to execute a project specific make run.
-        
+
         @param questionOnly flag indicating to ask make for changes only
         @type bool
         @param interactive flag indicating an interactive invocation (i.e.
@@ -5873,78 +6296,82 @@
         @type bool
         """
         if (
-            not self.pdata["MAKEPARAMS"]["MakeEnabled"] or
-            self.__makeProcess is not None
+            not self.pdata["MAKEPARAMS"]["MakeEnabled"]
+            or self.__makeProcess is not None
         ):
             return
-        
+
         prog = (
             self.pdata["MAKEPARAMS"]["MakeExecutable"]
-            if self.pdata["MAKEPARAMS"]["MakeExecutable"] else
-            Project.DefaultMake
+            if self.pdata["MAKEPARAMS"]["MakeExecutable"]
+            else Project.DefaultMake
         )
-        
+
         args = []
         if self.pdata["MAKEPARAMS"]["MakeParameters"]:
-            args.extend(Utilities.parseOptionString(
-                self.pdata["MAKEPARAMS"]["MakeParameters"]))
-        
+            args.extend(
+                Utilities.parseOptionString(self.pdata["MAKEPARAMS"]["MakeParameters"])
+            )
+
         if self.pdata["MAKEPARAMS"]["MakeFile"]:
-            args.append("--makefile={0}".format(
-                self.pdata["MAKEPARAMS"]["MakeFile"]))
-        
+            args.append("--makefile={0}".format(self.pdata["MAKEPARAMS"]["MakeFile"]))
+
         if questionOnly:
             args.append("--question")
-        
+
         if self.pdata["MAKEPARAMS"]["MakeTarget"]:
             args.append(self.pdata["MAKEPARAMS"]["MakeTarget"])
-        
+
         self.__makeProcess = QProcess(self)
-        self.__makeProcess.readyReadStandardOutput.connect(
-            self.__makeReadStdOut)
-        self.__makeProcess.readyReadStandardError.connect(
-            self.__makeReadStdErr)
+        self.__makeProcess.readyReadStandardOutput.connect(self.__makeReadStdOut)
+        self.__makeProcess.readyReadStandardError.connect(self.__makeReadStdErr)
         self.__makeProcess.finished.connect(
             lambda exitCode, exitStatus: self.__makeFinished(
-                exitCode, exitStatus, questionOnly, interactive))
+                exitCode, exitStatus, questionOnly, interactive
+            )
+        )
         self.__makeProcess.setWorkingDirectory(self.getProjectPath())
         self.__makeProcess.start(prog, args)
-        
+
         if not self.__makeProcess.waitForStarted():
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Execute Make"),
-                self.tr("""The make process did not start."""))
-            
+                self.tr("""The make process did not start."""),
+            )
+
             self.__cleanupMake()
-    
+
     @pyqtSlot()
     def __makeReadStdOut(self):
         """
         Private slot to process process output received via stdout.
         """
         if self.__makeProcess is not None:
-            output = str(self.__makeProcess.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace')
+            output = str(
+                self.__makeProcess.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.appendStdout.emit(output)
-    
+
     @pyqtSlot()
     def __makeReadStdErr(self):
         """
         Private slot to process process output received via stderr.
         """
         if self.__makeProcess is not None:
-            error = str(self.__makeProcess.readAllStandardError(),
-                        Preferences.getSystem("IOEncoding"),
-                        'replace')
+            error = str(
+                self.__makeProcess.readAllStandardError(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.appendStderr.emit(error)
-    
-    def __makeFinished(self, exitCode, exitStatus, questionOnly,
-                       interactive=True):
+
+    def __makeFinished(self, exitCode, exitStatus, questionOnly, interactive=True):
         """
         Private slot handling the make process finished signal.
-        
+
         @param exitCode exit code of the make process
         @type int
         @param exitStatus exit status of the make process
@@ -5959,12 +6386,13 @@
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Execute Make"),
-                self.tr("""The make process crashed."""))
+                self.tr("""The make process crashed."""),
+            )
         else:
             if questionOnly and exitCode == 1:
                 # a rebuild is needed
                 title = self.tr("Test for Changes")
-                
+
                 if self.pdata["MAKEPARAMS"]["MakeTarget"]:
                     message = self.tr(
                         """<p>There are changes that require the configured"""
@@ -5973,22 +6401,25 @@
                 else:
                     message = self.tr(
                         """<p>There are changes that require the default"""
-                        """ make target to be rebuilt.</p>""")
-                
+                        """ make target to be rebuilt.</p>"""
+                    )
+
                 self.ui.showNotification(
                     UI.PixmapCache.getPixmap("makefile48"),
                     title,
                     message,
                     kind=NotificationTypes.WARNING,
-                    timeout=0)
+                    timeout=0,
+                )
             elif exitCode > 1:
                 EricMessageBox.critical(
                     self.ui,
                     self.tr("Execute Make"),
-                    self.tr("""The makefile contains errors."""))
-        
+                    self.tr("""The makefile contains errors."""),
+                )
+
         self.__cleanupMake()
-    
+
     def __cleanupMake(self):
         """
         Private method to clean up make related stuff.
@@ -5998,16 +6429,16 @@
         self.__makeProcess.finished.disconnect()
         self.__makeProcess.deleteLater()
         self.__makeProcess = None
-    
+
     #########################################################################
     ## Below are methods implementing some 'IDL' support functions
     #########################################################################
-    
+
     def hasDefaultIdlCompilerParameters(self):
         """
         Public method to test, if the project contains the default IDL compiler
         parameters.
-        
+
         @return flag indicating default parameter set
         @rtype bool
         """
@@ -6016,16 +6447,16 @@
             "DefinedNames": [],
             "UndefinedNames": [],
         }
-    
+
     #########################################################################
     ## Below are methods implementing some 'UIC' support functions
     #########################################################################
-    
+
     def hasDefaultUicCompilerParameters(self):
         """
         Public method to test, if the project contains the default uic compiler
         parameters.
-        
+
         @return flag indicating default parameter set
         @rtype bool
         """
@@ -6034,11 +6465,11 @@
             "RcSuffix": "",
             "PackagesRoot": "",
         }
-    
+
     def getUicParameter(self, name):
         """
         Public method to get a named uic related parameter.
-        
+
         @param name name of the parameter
         @type str
         @return value of the given parameter
@@ -6048,108 +6479,108 @@
             return self.pdata["UICPARAMS"][name]
         else:
             return None
-    
+
     #########################################################################
     ## Below are methods implementing some 'RCC' support functions
     #########################################################################
-    
+
     def hasDefaultRccCompilerParameters(self):
         """
         Public method to test, if the project contains the default rcc compiler
         parameters.
-        
+
         @return flag indicating default parameter set
         @rtype bool
         """
-        return (
-            self.pdata["RCCPARAMS"] == self.getDefaultRccCompilerParameters()
-        )
-    
+        return self.pdata["RCCPARAMS"] == self.getDefaultRccCompilerParameters()
+
     def getDefaultRccCompilerParameters(self):
         """
         Public method to get the default rcc compiler parameters.
-        
+
         @return dictionary containing the default rcc compiler parameters
         @rtype dict
         """
         return {
-            "CompressionThreshold": 70,     # default value
-            "CompressLevel": 0,             # use zlib default
+            "CompressionThreshold": 70,  # default value
+            "CompressLevel": 0,  # use zlib default
             "CompressionDisable": False,
             "PathPrefix": "",
         }
-    
+
     #########################################################################
     ## Below are methods implementing some 'docstring' support functions
     #########################################################################
-    
+
     def hasDefaultDocstringParameter(self):
         """
         Public method to test, if the project contains the default docstring
         parameter.
-        
+
         @return flag indicating default parameter
         @rtype bool
         """
         return self.pdata["DOCSTRING"] == ""
-    
+
     def getDocstringType(self):
         """
         Public method to get the configured docstring style.
-        
+
         @return configured docstring style
         @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>")
-    
+
     #########################################################################
     ## Below are methods implementing the 'Code Formatting' support
     #########################################################################
-    
+
     def __showContextMenuFormat(self):
         """
         Private slot called before the 'Code Formatting' menu is shown.
         """
         self.showMenu.emit("Formatting", self.othersMenu)
-    
+
     @pyqtSlot()
     def __aboutBlack(self):
         """
         Private slot to show some information about the installed 'Black' tool.
         """
         import black
-        
+
         EricMessageBox.information(
             None,
             self.tr("About Black"),
-            self.tr("""<p><b>Black Version {0}</b></p>"""
-                    """<p><i>Black</i> is the uncompromising Python code"""
-                    """ formatter.</p>""").format(black.__version__)
+            self.tr(
+                """<p><b>Black Version {0}</b></p>"""
+                """<p><i>Black</i> is the uncompromising Python code"""
+                """ formatter.</p>"""
+            ).format(black.__version__),
         )
-    
+
     def __performFormatWithBlack(self, action):
         """
         Private method to format the project sources using the 'Black' tool.
-        
+
         Following actions are supported.
         <ul>
         <li>BlackFormattingAction.Format - the code reformatting is performed</li>
@@ -6158,25 +6589,26 @@
         <li>BlackFormattingAction.Diff - a unified diff of potential code formatting
             changes is generated</li>
         </ul>
-        
+
         @param action formatting operation to be performed
         @type BlackFormattingAction
         """
         from CodeFormatting.BlackConfigurationDialog import BlackConfigurationDialog
         from CodeFormatting.BlackFormattingDialog import BlackFormattingDialog
-        
+
         if ericApp().getObject("ViewManager").checkAllDirty():
             dlg = BlackConfigurationDialog(withProject=True)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 config = dlg.getConfiguration()
-                
+
                 formattingDialog = BlackFormattingDialog(
                     config,
                     self.getProjectFiles("SOURCES", normalized=True),
                     project=self,
-                    action=action
+                    action=action,
                 )
                 formattingDialog.exec()
 
+
 #
 # eflag: noqa = M601
--- a/src/eric7/Project/ProjectBaseBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectBaseBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,12 +11,15 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    QModelIndex, pyqtSignal, Qt, QCoreApplication, QItemSelectionModel,
-    QItemSelection, QElapsedTimer
+    QModelIndex,
+    pyqtSignal,
+    Qt,
+    QCoreApplication,
+    QItemSelectionModel,
+    QItemSelection,
+    QElapsedTimer,
 )
-from PyQt6.QtWidgets import (
-    QTreeView, QApplication, QMenu, QDialog, QAbstractItemView
-)
+from PyQt6.QtWidgets import QTreeView, QApplication, QMenu, QDialog, QAbstractItemView
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox
@@ -26,92 +29,92 @@
 from UI.BrowserModel import BrowserDirectoryItem, BrowserFileItem
 
 from .ProjectBrowserModel import (
-    ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem,
-    ProjectBrowserFileItem
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserFileItem,
 )
-from .ProjectBrowserSortFilterProxyModel import (
-    ProjectBrowserSortFilterProxyModel
-)
+from .ProjectBrowserSortFilterProxyModel import ProjectBrowserSortFilterProxyModel
 
 
 class ProjectBaseBrowser(Browser):
     """
     Baseclass implementing common functionality for the various project
     browsers.
-    
+
     @signal closeSourceWindow(str) emitted to close a source file
     """
+
     closeSourceWindow = pyqtSignal(str)
-    
+
     def __init__(self, project, type_, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param type_ project browser type (string)
         @param parent parent widget of this browser
         """
         QTreeView.__init__(self, parent)
-        
+
         self.project = project
-        
+
         self._model = project.getModel()
         self._sortModel = ProjectBrowserSortFilterProxyModel(type_)
         self._sortModel.setSourceModel(self._model)
         self.setModel(self._sortModel)
-        
+
         self.selectedItemsFilter = [ProjectBrowserFileItem]
-        
+
         # contains codes for special menu entries
         # 1 = specials for Others browser
         self.specialMenuEntries = []
         self.isTranslationsBrowser = False
         self.expandedNames = []
-        
+
         self.SelectFlags = (
-            QItemSelectionModel.SelectionFlag.Select |
-            QItemSelectionModel.SelectionFlag.Rows
+            QItemSelectionModel.SelectionFlag.Select
+            | QItemSelectionModel.SelectionFlag.Rows
         )
         self.DeselectFlags = (
-            QItemSelectionModel.SelectionFlag.Deselect |
-            QItemSelectionModel.SelectionFlag.Rows
+            QItemSelectionModel.SelectionFlag.Deselect
+            | QItemSelectionModel.SelectionFlag.Rows
         )
-        
+
         self._activating = False
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self._contextMenuRequested)
         self.activated.connect(self._openItem)
         self._model.rowsInserted.connect(self.__modelRowsInserted)
         self._connectExpandedCollapsed()
-        
+
         self._createPopupMenus()
-        
+
         self.currentItemName = None
-        
-        self._init()    # perform common initialization tasks
-        
+
+        self._init()  # perform common initialization tasks
+
         self._keyboardSearchString = ""
         self._keyboardSearchTimer = QElapsedTimer()
         self._keyboardSearchTimer.invalidate()
-        
-        self._initHookMethods()     # perform initialization of the hooks
+
+        self._initHookMethods()  # perform initialization of the hooks
         self.hooksMenuEntries = {}
-        
+
     def _connectExpandedCollapsed(self):
         """
         Protected method to connect the expanded and collapsed signals.
         """
         self.expanded.connect(self._resizeColumns)
         self.collapsed.connect(self._resizeColumns)
-        
+
     def _disconnectExpandedCollapsed(self):
         """
         Protected method to disconnect the expanded and collapsed signals.
         """
         self.expanded.disconnect(self._resizeColumns)
         self.collapsed.disconnect(self._resizeColumns)
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menus.
@@ -119,104 +122,106 @@
         # create the popup menu for source files
         self.sourceMenu = QMenu(self)
         self.sourceMenu.addAction(
-            QCoreApplication.translate('ProjectBaseBrowser', 'Open'),
-            self._openItem)
-        
+            QCoreApplication.translate("ProjectBaseBrowser", "Open"), self._openItem
+        )
+
         # create the popup menu for general use
         self.menu = QMenu(self)
         self.menu.addAction(
-            QCoreApplication.translate('ProjectBaseBrowser', 'Open'),
-            self._openItem)
+            QCoreApplication.translate("ProjectBaseBrowser", "Open"), self._openItem
+        )
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         self.multiMenu.addAction(
-            QCoreApplication.translate('ProjectBaseBrowser', 'Open'),
-            self._openItem)
-        
+            QCoreApplication.translate("ProjectBaseBrowser", "Open"), self._openItem
+        )
+
         # create the background menu
         self.backMenu = None
-        
+
         # create the directories menu
         self.dirMenu = None
-        
+
         # create the directory for multiple selected directories
         self.dirMultiMenu = None
-        
+
         self.menuActions = []
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.mainMenu = None
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         cnt = self.getSelectedItemsCount()
         if cnt > 1:
             self.multiMenu.popup(self.mapToGlobal(coord))
         else:
             index = self.indexAt(coord)
-            
+
             if index.isValid():
                 self.menu.popup(self.mapToGlobal(coord))
             else:
                 self.backMenu and self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def _selectSingleItem(self, index):
         """
         Protected method to select a single item.
-        
+
         @param index index of item to be selected (QModelIndex)
         """
         if index.isValid():
             self.setCurrentIndex(index)
             self.selectionModel().select(
                 index,
-                QItemSelectionModel.SelectionFlag.ClearAndSelect |
-                QItemSelectionModel.SelectionFlag.Rows
+                QItemSelectionModel.SelectionFlag.ClearAndSelect
+                | QItemSelectionModel.SelectionFlag.Rows,
             )
-        
+
     def _setItemSelected(self, index, selected):
         """
         Protected method to set the selection status of an item.
-        
+
         @param index index of item to set (QModelIndex)
         @param selected flag giving the new selection status (boolean)
         """
         if index.isValid():
             self.selectionModel().select(
-                index, selected and self.SelectFlags or self.DeselectFlags)
-        
+                index, selected and self.SelectFlags or self.DeselectFlags
+            )
+
     def _setItemRangeSelected(self, startIndex, endIndex, selected):
         """
         Protected method to set the selection status of a range of items.
-        
+
         @param startIndex start index of range of items to set (QModelIndex)
         @param endIndex end index of range of items to set (QModelIndex)
         @param selected flag giving the new selection status (boolean)
         """
         selection = QItemSelection(startIndex, endIndex)
         self.selectionModel().select(
-            selection, selected and self.SelectFlags or self.DeselectFlags)
-        
+            selection, selected and self.SelectFlags or self.DeselectFlags
+        )
+
     def __modelRowsInserted(self, parent, start, end):
         """
         Private slot called after rows have been inserted into the model.
-        
+
         @param parent parent index of inserted rows (QModelIndex)
         @param start start row number (integer)
         @param end end row number (integer)
         """
         self._resizeColumns(parent)
-        
+
     def _projectClosed(self):
         """
         Protected slot to handle the projectClosed signal.
@@ -224,9 +229,9 @@
         self.layoutDisplay()
         if self.backMenu is not None:
             self.backMenu.setEnabled(False)
-        
+
         self._createPopupMenus()
-        
+
     def _projectOpened(self):
         """
         Protected slot to handle the projectOpened signal.
@@ -235,58 +240,64 @@
         self.sortByColumn(0, Qt.SortOrder.DescendingOrder)
         self.sortByColumn(0, Qt.SortOrder.AscendingOrder)
         self._initMenusAndVcs()
-        
+
     def _initMenusAndVcs(self):
         """
         Protected slot to initialize the menus and the Vcs interface.
         """
         self._createPopupMenus()
-        
+
         if self.backMenu is not None:
             self.backMenu.setEnabled(True)
-        
+
         if self.project.vcs is not None:
             self.vcsHelper = self.project.vcs.vcsGetProjectBrowserHelper(
-                self, self.project, self.isTranslationsBrowser)
+                self, self.project, self.isTranslationsBrowser
+            )
             self.vcsHelper.addVCSMenus(
-                self.mainMenu, self.multiMenu, self.backMenu,
-                self.dirMenu, self.dirMultiMenu)
-    
+                self.mainMenu,
+                self.multiMenu,
+                self.backMenu,
+                self.dirMenu,
+                self.dirMultiMenu,
+            )
+
     def _newProject(self):
         """
         Protected slot to handle the newProject signal.
         """
         # default to perform same actions as opening a project
         self._projectOpened()
-        
+
     def _removeFile(self):
         """
         Protected method to remove a file or files from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList[:]:
             fn = itm.fileName()
             self.closeSourceWindow.emit(fn)
             self.project.removeFile(fn)
-        
+
     def _removeDir(self):
         """
         Protected method to remove a (single) directory from the project.
         """
         itmList = self.getSelectedItems(
-            [ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem])
+            [ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem]
+        )
         for itm in itmList[:]:
             dn = itm.dirName()
             self.project.removeDirectory(dn)
-        
+
     def _deleteDirectory(self):
         """
         Protected method to delete the selected directory from the project
         data area.
         """
         itmList = self.getSelectedItems()
-        
+
         dirs = []
         fullNames = []
         for itm in itmList:
@@ -294,24 +305,23 @@
             fullNames.append(dn)
             dn = self.project.getRelativePath(dn)
             dirs.append(dn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
-            QCoreApplication.translate(
-                "ProjectBaseBrowser", "Delete directories"),
+            QCoreApplication.translate("ProjectBaseBrowser", "Delete directories"),
             QCoreApplication.translate(
                 "ProjectBaseBrowser",
-                "Do you really want to delete these directories from"
-                " the project?"),
-            dirs)
-        
+                "Do you really want to delete these directories from" " the project?",
+            ),
+            dirs,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for dn in fullNames:
                 self.project.deleteDirectory(dn)
-        
+
     def _renameFile(self):
         """
         Protected method to rename a file of the project.
@@ -319,7 +329,7 @@
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
         self.project.renameFile(fn)
-        
+
     def _copyToClipboard(self):
         """
         Protected method to copy the path of an entry to the clipboard.
@@ -332,14 +342,14 @@
                 fn = itm.dirName()
             except AttributeError:
                 fn = ""
-        
+
         cb = QApplication.clipboard()
         cb.setText(fn)
-        
+
     def selectFile(self, fn):
         """
         Public method to highlight a node given its filename.
-        
+
         @param fn filename of file to be highlighted (string)
         """
         newfn = os.path.abspath(fn)
@@ -349,13 +359,12 @@
             index = self.model().mapFromSource(sindex)
             if index.isValid():
                 self._selectSingleItem(index)
-                self.scrollTo(index,
-                              QAbstractItemView.ScrollHint.PositionAtTop)
-        
+                self.scrollTo(index, QAbstractItemView.ScrollHint.PositionAtTop)
+
     def selectFileLine(self, fn, lineno):
         """
         Public method to highlight a node given its filename.
-        
+
         @param fn filename of file to be highlighted (string)
         @param lineno one based line number of the item (integer)
         """
@@ -367,7 +376,7 @@
             if index.isValid():
                 self._selectSingleItem(index)
                 self.scrollTo(index)
-        
+
     def _expandAllDirs(self):
         """
         Protected slot to handle the 'Expand all directories' menu action.
@@ -377,18 +386,15 @@
             index = self.model().index(0, 0)
             while index.isValid():
                 itm = self.model().item(index)
-                if (
-                    isinstance(
-                        itm,
-                        (ProjectBrowserSimpleDirectoryItem,
-                         ProjectBrowserDirectoryItem)) and
-                    not self.isExpanded(index)
-                ):
+                if isinstance(
+                    itm,
+                    (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem),
+                ) and not self.isExpanded(index):
                     self.expand(index)
                 index = self.indexBelow(index)
             self.layoutDisplay()
         self._connectExpandedCollapsed()
-        
+
     def _collapseAllDirs(self):
         """
         Protected slot to handle the 'Collapse all directories' menu action.
@@ -401,30 +407,27 @@
             while index.isValid():
                 vindex = index
                 index = self.indexBelow(index)
-            
+
             # step 2: go up collapsing all directory items
             index = vindex
             while index.isValid():
                 itm = self.model().item(index)
-                if (
-                    isinstance(
-                        itm,
-                        (ProjectBrowserSimpleDirectoryItem,
-                         ProjectBrowserDirectoryItem)) and
-                    self.isExpanded(index)
-                ):
+                if isinstance(
+                    itm,
+                    (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem),
+                ) and self.isExpanded(index):
                     self.collapse(index)
                 index = self.indexAbove(index)
             self.layoutDisplay()
         self._connectExpandedCollapsed()
-        
+
     def _showContextMenu(self, menu):
         """
         Protected slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown (QMenu)
         """
         if self.project.vcs is None:
@@ -432,15 +435,15 @@
                 act.setEnabled(True)
         else:
             self.vcsHelper.showContextMenu(menu, self.menuActions)
-        
+
     def _showContextMenuMulti(self, menu):
         """
         Protected slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown (QMenu)
         """
         if self.project.vcs is None:
@@ -448,14 +451,14 @@
                 act.setEnabled(True)
         else:
             self.vcsHelper.showContextMenuMulti(menu, self.multiMenuActions)
-        
+
     def _showContextMenuDir(self, menu):
         """
         Protected slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown (QMenu)
         """
         if self.project.vcs is None:
@@ -463,54 +466,53 @@
                 act.setEnabled(True)
         else:
             self.vcsHelper.showContextMenuDir(menu, self.dirMenuActions)
-        
+
     def _showContextMenuDirMulti(self, menu):
         """
         Protected slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown (QMenu)
         """
         if self.project.vcs is None:
             for act in self.dirMultiMenuActions:
                 act.setEnabled(True)
         else:
-            self.vcsHelper.showContextMenuDirMulti(
-                menu, self.dirMultiMenuActions)
-        
+            self.vcsHelper.showContextMenuDirMulti(menu, self.dirMultiMenuActions)
+
     def _showContextMenuBack(self, menu):
         """
         Protected slot called before the context menu is shown.
-        
+
         @param menu reference to the menu to be shown (QMenu)
         """
         # nothing to do for now
         return
-        
+
     def _selectEntries(self, local=True, filterList=None):
         """
         Protected method to select entries based on their VCS status.
-        
+
         @param local flag indicating local (i.e. non VCS controlled)
             file/directory entries should be selected (boolean)
         @param filterList list of classes to check against
         """
         if self.project.vcs is None:
             return
-        
+
         compareString = (
-            QCoreApplication.translate('ProjectBaseBrowser', "local")
-            if local else
-            self.project.vcs.vcsName()
+            QCoreApplication.translate("ProjectBaseBrowser", "local")
+            if local
+            else self.project.vcs.vcsName()
         )
-        
+
         # expand all directories in order to iterate over all entries
         self._expandAllDirs()
-        
+
         self.selectionModel().clear()
-        
+
         with EricOverrideCursor():
             # now iterate over all entries
             startIndex = None
@@ -519,14 +521,8 @@
             index = self.model().index(0, 0)
             while index.isValid():
                 itm = self.model().item(index)
-                if (
-                    self.wantedItem(itm, filterList) and
-                    compareString == itm.data(1)
-                ):
-                    if (
-                        startIndex is not None and
-                        startIndex.parent() != index.parent()
-                    ):
+                if self.wantedItem(itm, filterList) and compareString == itm.data(1):
+                    if startIndex is not None and startIndex.parent() != index.parent():
                         self._setItemRangeSelected(startIndex, endIndex, True)
                         startIndex = None
                     selectedEntries += 1
@@ -540,28 +536,28 @@
                 index = self.indexBelow(index)
             if startIndex is not None:
                 self._setItemRangeSelected(startIndex, endIndex, True)
-        
+
         if selectedEntries == 0:
             EricMessageBox.information(
                 self,
-                QCoreApplication.translate(
-                    'ProjectBaseBrowser', "Select entries"),
+                QCoreApplication.translate("ProjectBaseBrowser", "Select entries"),
                 QCoreApplication.translate(
-                    'ProjectBaseBrowser',
-                    """There were no matching entries found."""))
-        
+                    "ProjectBaseBrowser", """There were no matching entries found."""
+                ),
+            )
+
     def selectLocalEntries(self):
         """
         Public slot to handle the select local files context menu entries.
         """
         self._selectEntries(local=True, filterList=[ProjectBrowserFileItem])
-        
+
     def selectVCSEntries(self):
         """
         Public slot to handle the select VCS files context menu entries.
         """
         self._selectEntries(local=False, filterList=[ProjectBrowserFileItem])
-        
+
     def selectLocalDirEntries(self):
         """
         Public slot to handle the select local directories context menu
@@ -569,41 +565,40 @@
         """
         self._selectEntries(
             local=True,
-            filterList=[ProjectBrowserSimpleDirectoryItem,
-                        ProjectBrowserDirectoryItem])
-        
+            filterList=[ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem],
+        )
+
     def selectVCSDirEntries(self):
         """
         Public slot to handle the select VCS directories context menu entries.
         """
         self._selectEntries(
             local=False,
-            filterList=[ProjectBrowserSimpleDirectoryItem,
-                        ProjectBrowserDirectoryItem])
-        
+            filterList=[ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem],
+        )
+
     def getExpandedItemNames(self):
         """
         Public method to get the file/directory names of all expanded items.
-        
+
         @return list of expanded items names (list of string)
         """
         expandedNames = []
-        
+
         childIndex = self.model().index(0, 0)
         while childIndex.isValid():
             if self.isExpanded(childIndex):
                 with contextlib.suppress(AttributeError):
-                    expandedNames.append(
-                        self.model().item(childIndex).name())
+                    expandedNames.append(self.model().item(childIndex).name())
                     # only items defining the name() method are returned
             childIndex = self.indexBelow(childIndex)
-        
+
         return expandedNames
-        
+
     def expandItemsByName(self, names):
         """
         Public method to expand items given their names.
-        
+
         @param names list of item names to be expanded (list of string)
         """
         model = self.model()
@@ -616,11 +611,11 @@
                         break
                     # ignore items not supporting this method
                 childIndex = self.indexBelow(childIndex)
-        
+
     def _prepareRepopulateItem(self, name):
         """
         Protected slot to handle the prepareRepopulateItem signal.
-        
+
         @param name relative name of file item to be repopulated (string)
         """
         itm = self.currentItem()
@@ -630,24 +625,23 @@
         sindex = self._model.itemIndexByName(name)
         if not sindex.isValid():
             return
-        
+
         index = self.model().mapFromSource(sindex)
         if not index.isValid():
             return
-        
+
         childIndex = self.indexBelow(index)
         while childIndex.isValid():
             if childIndex.parent() == index.parent():
                 break
             if self.isExpanded(childIndex):
-                self.expandedNames.append(
-                    self.model().item(childIndex).data(0))
+                self.expandedNames.append(self.model().item(childIndex).data(0))
             childIndex = self.indexBelow(childIndex)
-        
+
     def _completeRepopulateItem(self, name):
         """
         Protected slot to handle the completeRepopulateItem signal.
-        
+
         @param name relative name of file item to be repopulated (string)
         """
         sindex = self._model.itemIndexByName(name)
@@ -658,16 +652,16 @@
                     childIndex = self.indexBelow(index)
                     while childIndex.isValid():
                         if (
-                            not childIndex.isValid() or
-                            childIndex.parent() == index.parent()
+                            not childIndex.isValid()
+                            or childIndex.parent() == index.parent()
                         ):
                             break
                         itm = self.model().item(childIndex)
                         if itm is not None:
                             itemData = itm.data(0)
                             if (
-                                self.currentItemName and
-                                self.currentItemName == itemData
+                                self.currentItemName
+                                and self.currentItemName == itemData
                             ):
                                 self._selectSingleItem(childIndex)
                             if itemData in self.expandedNames:
@@ -678,96 +672,101 @@
                 self.expandedNames = []
         self.currentItemName = None
         self._resort()
-        
+
     def currentItem(self):
         """
         Public method to get a reference to the current item.
-        
+
         @return reference to the current item
         """
         itm = self.model().item(self.currentIndex())
         return itm
-    
+
     def _keyboardSearchType(self, item):
         """
         Protected method to check, if the item is of the correct type.
-        
+
         @param item reference to the item
         @type BrowserItem
         @return flag indicating a correct type
         @rtype bool
         """
         return isinstance(
-            item, (BrowserDirectoryItem, BrowserFileItem,
-                   ProjectBrowserSimpleDirectoryItem,
-                   ProjectBrowserDirectoryItem, ProjectBrowserFileItem))
-    
+            item,
+            (
+                BrowserDirectoryItem,
+                BrowserFileItem,
+                ProjectBrowserSimpleDirectoryItem,
+                ProjectBrowserDirectoryItem,
+                ProjectBrowserFileItem,
+            ),
+        )
+
     ###########################################################################
     ## Support for hooks below
     ###########################################################################
-    
+
     def _initHookMethods(self):
         """
         Protected method to initialize the hooks dictionary.
-        
+
         This method should be overridden by subclasses. All supported
         hook methods should be initialized with a None value. The keys
         must be strings.
         """
         self.hooks = {}
-        
+
     def __checkHookKey(self, key):
         """
         Private method to check a hook key.
-        
+
         @param key key of the hook to check (string)
         @exception KeyError raised to indicate an invalid hook
         """
         if len(self.hooks) == 0:
             raise KeyError("Hooks are not initialized.")
-        
+
         if key not in self.hooks:
             raise KeyError(key)
-        
+
     def addHookMethod(self, key, method):
         """
         Public method to add a hook method to the dictionary.
-        
+
         @param key for the hook method (string)
         @param method reference to the hook method (method object)
         """
         self.__checkHookKey(key)
         self.hooks[key] = method
-        
+
     def addHookMethodAndMenuEntry(self, key, method, menuEntry):
         """
         Public method to add a hook method to the dictionary.
-        
+
         @param key for the hook method (string)
         @param method reference to the hook method (method object)
         @param menuEntry entry to be shown in the context menu (string)
         """
         self.addHookMethod(key, method)
         self.hooksMenuEntries[key] = menuEntry
-        
+
     def removeHookMethod(self, key):
         """
         Public method to remove a hook method from the dictionary.
-        
+
         @param key for the hook method (string)
         """
         self.__checkHookKey(key)
         self.hooks[key] = None
         if key in self.hooksMenuEntries:
             del self.hooksMenuEntries[key]
-    
+
     ##################################################################
     ## Configure method below
     ##################################################################
-    
+
     def _configure(self):
         """
         Protected method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "projectBrowserPage")
+        ericApp().getObject("UserInterface").showPreferences("projectBrowserPage")
--- a/src/eric7/Project/ProjectBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,16 +18,21 @@
 import Preferences
 
 from .ProjectBrowserFlags import (
-    SourcesBrowserFlag, FormsBrowserFlag, ResourcesBrowserFlag,
-    TranslationsBrowserFlag, InterfacesBrowserFlag, OthersBrowserFlag,
-    ProtocolsBrowserFlag, AllBrowsersFlag
+    SourcesBrowserFlag,
+    FormsBrowserFlag,
+    ResourcesBrowserFlag,
+    TranslationsBrowserFlag,
+    InterfacesBrowserFlag,
+    OthersBrowserFlag,
+    ProtocolsBrowserFlag,
+    AllBrowsersFlag,
 )
 
 
 class ProjectBrowser(EricTabWidget):
     """
     Class implementing the project browser part of the eric UI.
-    
+
     It generates a widget with up to seven tabs. The individual tabs contain
     the project sources browser, the project forms browser,
     the project resources browser, the project translations browser,
@@ -35,24 +40,24 @@
     that doesn't fit these categories. Optionally it contains an additional
     tab with the file system browser.
     """
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget (QWidget)
         """
         EricTabWidget.__init__(self, parent)
         self.project = project
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.setUsesScrollButtons(True)
-        
+
         self.vcsStatusIndicator = EricClickableLed(self)
         self.setCornerWidget(self.vcsStatusIndicator, Qt.Corner.TopLeftCorner)
-        self.vcsStatusIndicator.clicked.connect(
-            self.__vcsStatusIndicatorClicked)
+        self.vcsStatusIndicator.clicked.connect(self.__vcsStatusIndicatorClicked)
         self.vcsStatusColorNames = {
             "A": "VcsAdded",
             "M": "VcsModified",
@@ -71,7 +76,7 @@
             "Z": self.tr("conflict"),
         }
         self.__vcsStateChanged(" ")
-        
+
         # step 1: create all the individual browsers
         from .ProjectSourcesBrowser import ProjectSourcesBrowser
         from .ProjectFormsBrowser import ProjectFormsBrowser
@@ -80,6 +85,7 @@
         from .ProjectInterfacesBrowser import ProjectInterfacesBrowser
         from .ProjectOthersBrowser import ProjectOthersBrowser
         from .ProjectProtocolsBrowser import ProjectProtocolsBrowser
+
         # sources browser
         self.psBrowser = ProjectSourcesBrowser(self.project)
         # forms browser
@@ -94,143 +100,133 @@
         self.ppBrowser = ProjectProtocolsBrowser(self.project)
         # others browser
         self.poBrowser = ProjectOthersBrowser(self.project)
-        
+
         # step 2: connect all the browsers
         # connect the sources browser
         self.project.projectClosed.connect(self.psBrowser._projectClosed)
         self.project.projectOpened.connect(self.psBrowser._projectOpened)
         self.project.newProject.connect(self.psBrowser._newProject)
         self.project.reinitVCS.connect(self.psBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.psBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.psBrowser._initMenusAndVcs)
+
         # connect the forms browser
         self.project.projectClosed.connect(self.pfBrowser._projectClosed)
         self.project.projectOpened.connect(self.pfBrowser._projectOpened)
         self.project.newProject.connect(self.pfBrowser._newProject)
         self.project.reinitVCS.connect(self.pfBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.pfBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.pfBrowser._initMenusAndVcs)
+
         # connect the resources browser
         self.project.projectClosed.connect(self.prBrowser._projectClosed)
         self.project.projectOpened.connect(self.prBrowser._projectOpened)
         self.project.newProject.connect(self.prBrowser._newProject)
         self.project.reinitVCS.connect(self.prBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.prBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.prBrowser._initMenusAndVcs)
+
         # connect the translations browser
         self.project.projectClosed.connect(self.ptBrowser._projectClosed)
         self.project.projectOpened.connect(self.ptBrowser._projectOpened)
         self.project.newProject.connect(self.ptBrowser._newProject)
         self.project.reinitVCS.connect(self.ptBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.ptBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.ptBrowser._initMenusAndVcs)
+
         # connect the interfaces (IDL)  browser
         self.project.projectClosed.connect(self.piBrowser._projectClosed)
         self.project.projectOpened.connect(self.piBrowser._projectOpened)
         self.project.newProject.connect(self.piBrowser._newProject)
         self.project.reinitVCS.connect(self.piBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.piBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.piBrowser._initMenusAndVcs)
+
         # connect the protocols (protobuf)  browser
         self.project.projectClosed.connect(self.ppBrowser._projectClosed)
         self.project.projectOpened.connect(self.ppBrowser._projectOpened)
         self.project.newProject.connect(self.ppBrowser._newProject)
         self.project.reinitVCS.connect(self.ppBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.ppBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.ppBrowser._initMenusAndVcs)
+
         # connect the others browser
         self.project.projectClosed.connect(self.poBrowser._projectClosed)
         self.project.projectOpened.connect(self.poBrowser._projectOpened)
         self.project.newProject.connect(self.poBrowser._newProject)
         self.project.reinitVCS.connect(self.poBrowser._initMenusAndVcs)
-        self.project.projectPropertiesChanged.connect(
-            self.poBrowser._initMenusAndVcs)
-        
+        self.project.projectPropertiesChanged.connect(self.poBrowser._initMenusAndVcs)
+
         # add signal connection to ourselves
         self.project.projectOpened.connect(self.__projectOpened)
         self.project.projectClosed.connect(self.__projectClosed)
         self.project.newProject.connect(self.__newProject)
-        self.project.projectPropertiesChanged.connect(
-            self.__projectPropertiesChanged)
+        self.project.projectPropertiesChanged.connect(self.__projectPropertiesChanged)
         self.currentChanged.connect(self.__currentChanged)
         self.project.getModel().vcsStateChanged.connect(self.__vcsStateChanged)
-        
+
         self.__currentBrowsersFlags = 0
         self.__projectPropertiesChanged()
         self.setCurrentIndex(0)
-        
+
     def __setBrowsersAvailable(self, browserFlags):
         """
         Private method to add selected browsers to the project browser.
-        
+
         @param browserFlags flags indicating the browsers to add (integer)
         """
         # step 1: remove all tabs
         while self.count() > 0:
             self.removeTab(0)
-        
+
         # step 2: add browsers
         if browserFlags & SourcesBrowserFlag:
             index = self.addTab(
-                self.psBrowser,
-                UI.PixmapCache.getIcon("projectSources"), '')
+                self.psBrowser, UI.PixmapCache.getIcon("projectSources"), ""
+            )
             self.setTabToolTip(index, self.psBrowser.windowTitle())
-        
+
         if browserFlags & FormsBrowserFlag:
             index = self.addTab(
-                self.pfBrowser,
-                UI.PixmapCache.getIcon("projectForms"), '')
+                self.pfBrowser, UI.PixmapCache.getIcon("projectForms"), ""
+            )
             self.setTabToolTip(index, self.pfBrowser.windowTitle())
-        
+
         if browserFlags & ResourcesBrowserFlag:
             index = self.addTab(
-                self.prBrowser,
-                UI.PixmapCache.getIcon("projectResources"), '')
+                self.prBrowser, UI.PixmapCache.getIcon("projectResources"), ""
+            )
             self.setTabToolTip(index, self.prBrowser.windowTitle())
-        
+
         if browserFlags & TranslationsBrowserFlag:
             index = self.addTab(
-                self.ptBrowser,
-                UI.PixmapCache.getIcon("projectTranslations"), '')
+                self.ptBrowser, UI.PixmapCache.getIcon("projectTranslations"), ""
+            )
             self.setTabToolTip(index, self.ptBrowser.windowTitle())
-        
+
         if browserFlags & InterfacesBrowserFlag:
             index = self.addTab(
-                self.piBrowser,
-                UI.PixmapCache.getIcon("projectInterfaces"), '')
+                self.piBrowser, UI.PixmapCache.getIcon("projectInterfaces"), ""
+            )
             self.setTabToolTip(index, self.piBrowser.windowTitle())
-        
+
         if browserFlags & ProtocolsBrowserFlag:
-            index = self.addTab(
-                self.ppBrowser,
-                UI.PixmapCache.getIcon("protobuf"), '')
+            index = self.addTab(self.ppBrowser, UI.PixmapCache.getIcon("protobuf"), "")
             self.setTabToolTip(index, self.ppBrowser.windowTitle())
-        
+
         if browserFlags & OthersBrowserFlag:
             index = self.addTab(
-                self.poBrowser,
-                UI.PixmapCache.getIcon("projectOthers"), '')
+                self.poBrowser, UI.PixmapCache.getIcon("projectOthers"), ""
+            )
             self.setTabToolTip(index, self.poBrowser.windowTitle())
-        
+
         QApplication.processEvents()
-        
+
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged(int) signal.
-        
+
         @param index index of the tab (integer)
         """
         if index > -1:
             browser = self.widget(index)
             if browser is not None:
                 browser.layoutDisplay()
-        
+
     def __projectOpened(self):
         """
         Private slot to handle the projectOpened signal.
@@ -238,7 +234,7 @@
         self.__projectPropertiesChanged()
         self.setCurrentIndex(0)
         self.__vcsStateChanged(" ")
-        
+
     def __projectClosed(self):
         """
         Private slot to handle the projectClosed signal.
@@ -247,34 +243,34 @@
         self.setCurrentIndex(0)
         self.__setSourcesIcon()
         self.__vcsStateChanged(" ")
-        
+
     def __newProject(self):
         """
         Private slot to handle the newProject signal.
         """
         self.setCurrentIndex(0)
         self.__projectPropertiesChanged()
-        
+
     def __projectPropertiesChanged(self):
         """
         Private slot to handle the projectPropertiesChanged signal.
         """
         flags = (
             Preferences.getProjectBrowserFlags(self.project.getProjectType())
-            if self.project.isOpen() else
-            AllBrowsersFlag
+            if self.project.isOpen()
+            else AllBrowsersFlag
         )
-        
+
         if flags != self.__currentBrowsersFlags:
             self.__currentBrowsersFlags = flags
             self.__setBrowsersAvailable(flags)
-        
+
         endIndex = self.count()
         for index in range(endIndex):
             self.setTabEnabled(index, self.project.isOpen())
-        
+
         self.__setSourcesIcon()
-        
+
     def __setSourcesIcon(self):
         """
         Private method to set the right icon for the sources browser tab.
@@ -299,11 +295,11 @@
             else:
                 icon = UI.PixmapCache.getIcon("projectSources")
         self.setTabIcon(self.indexOf(self.psBrowser), icon)
-        
+
     def handleEditorChanged(self, fn):
         """
         Public slot to handle the editorChanged signal.
-        
+
         @param fn filename of the changed file (string)
         """
         if Preferences.getProject("FollowEditor"):
@@ -317,35 +313,41 @@
                 self.piBrowser.selectFile(fn)
             elif self.project.isProjectProtocol(fn):
                 self.ppBrowser.selectFile(fn)
-    
+
     def handleEditorLineChanged(self, fn, lineno):
         """
         Public slot to handle the editorLineChanged signal.
-        
+
         @param fn filename of the changed file (string)
         @param lineno one based line number of the item (integer)
         """
         if (
-            Preferences.getProject("FollowEditor") and
-            Preferences.getProject("FollowCursorLine") and
-            self.project.isProjectSource(fn)
+            Preferences.getProject("FollowEditor")
+            and Preferences.getProject("FollowCursorLine")
+            and self.project.isProjectSource(fn)
         ):
             self.psBrowser.selectFileLine(fn, lineno)
-    
+
     def getProjectBrowsers(self):
         """
         Public method to get references to the individual project browsers.
-        
+
         @return list of references to project browsers
         """
-        return [self.psBrowser, self.pfBrowser, self.prBrowser,
-                self.ptBrowser, self.piBrowser, self.ppBrowser,
-                self.poBrowser]
-    
+        return [
+            self.psBrowser,
+            self.pfBrowser,
+            self.prBrowser,
+            self.ptBrowser,
+            self.piBrowser,
+            self.ppBrowser,
+            self.poBrowser,
+        ]
+
     def getProjectBrowser(self, name):
         """
         Public method to get a reference to the named project browser.
-        
+
         @param name name of the requested project browser (string).
             Valid names are "sources, forms, resources, translations,
             interfaces, protocols, others".
@@ -360,27 +362,34 @@
             "protocols": self.ppBrowser,
             "others": self.poBrowser,
         }.get(name, None)
-    
+
     def getProjectBrowserNames(self):
         """
         Public method to get the names of the various project browsers.
-        
+
         @return list of project browser names (list of string)
         """
-        return ["sources", "forms", "resources",
-                "translations", "interfaces", "protocols", "others"]
-    
+        return [
+            "sources",
+            "forms",
+            "resources",
+            "translations",
+            "interfaces",
+            "protocols",
+            "others",
+        ]
+
     def handlePreferencesChanged(self):
         """
         Public slot used to handle the preferencesChanged signal.
         """
         self.__projectPropertiesChanged()
         self.__vcsStateChanged(self.currentVcsStatus)
-    
+
     def __vcsStateChanged(self, state):
         """
         Private slot to handle a change in the vcs state.
-        
+
         @param state new vcs state (string)
         """
         self.currentVcsStatus = state
@@ -388,17 +397,17 @@
             self.vcsStatusIndicator.setColor(QColor(Qt.GlobalColor.lightGray))
         else:
             self.vcsStatusIndicator.setColor(
-                Preferences.getProjectBrowserColour(
-                    self.vcsStatusColorNames[state]))
+                Preferences.getProjectBrowserColour(self.vcsStatusColorNames[state])
+            )
         if state not in self.vcsStatusText:
             self.vcsStatusIndicator.setToolTip(self.tr("unknown status"))
         else:
             self.vcsStatusIndicator.setToolTip(self.vcsStatusText[state])
-    
+
     def __vcsStatusIndicatorClicked(self, pos):
         """
         Private slot to react upon clicks on the VCS indicator LED.
-        
+
         @param pos position of the click (QPoint)
         """
         vcs = self.project.getVcs()
--- a/src/eric7/Project/ProjectBrowserFlags.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectBrowserFlags.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,11 +16,11 @@
 ProtocolsBrowserFlag = 64
 
 AllBrowsersFlag = (
-    SourcesBrowserFlag |
-    FormsBrowserFlag |
-    ResourcesBrowserFlag |
-    TranslationsBrowserFlag |
-    InterfacesBrowserFlag |
-    OthersBrowserFlag |
-    ProtocolsBrowserFlag
+    SourcesBrowserFlag
+    | FormsBrowserFlag
+    | ResourcesBrowserFlag
+    | TranslationsBrowserFlag
+    | InterfacesBrowserFlag
+    | OthersBrowserFlag
+    | ProtocolsBrowserFlag
 )
--- a/src/eric7/Project/ProjectBrowserModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectBrowserModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,7 +15,10 @@
 from PyQt6.QtGui import QColor
 
 from UI.BrowserModel import (
-    BrowserModel, BrowserItem, BrowserDirectoryItem, BrowserFileItem
+    BrowserModel,
+    BrowserItem,
+    BrowserDirectoryItem,
+    BrowserFileItem,
 )
 
 import UI.PixmapCache
@@ -41,67 +44,68 @@
 class ProjectBrowserItemMixin:
     """
     Class implementing common methods of project browser items.
-    
+
     It is meant to be used as a mixin class.
     """
+
     def __init__(self, type_, bold=False):
         """
         Constructor
-        
+
         @param type_ type of file/directory in the project
         @param bold flag indicating a highlighted font
         """
         self._projectTypes = [type_]
         self.bold = bold
         self.vcsState = " "
-    
+
     def getTextColor(self):
         """
         Public method to get the items text color.
-        
+
         @return text color (QColor)
         """
         if self.bold:
             return Preferences.getProjectBrowserColour("Highlighted")
         else:
             return None
-    
+
     def setVcsState(self, state):
         """
         Public method to set the items VCS state.
-        
+
         @param state VCS state (one of A, C, M, U or " ") (string)
         """
         self.vcsState = state
-    
+
     def addVcsStatus(self, vcsStatus):
         """
         Public method to add the VCS status.
-        
+
         @param vcsStatus VCS status text (string)
         """
         self.itemData.append(vcsStatus)
-    
+
     def setVcsStatus(self, vcsStatus):
         """
         Public method to set the VCS status.
-        
+
         @param vcsStatus VCS status text (string)
         """
         self.itemData[1] = vcsStatus
-    
+
     def getProjectTypes(self):
         """
         Public method to get the project type.
-        
+
         @return project type
         """
         return self._projectTypes[:]
-    
+
     def addProjectType(self, type_):
         """
         Public method to add a type to the list.
-        
+
         @param type_ type to add to the list
         """
         self._projectTypes.append(type_)
@@ -112,10 +116,11 @@
     Class implementing the data structure for project browser simple directory
     items.
     """
+
     def __init__(self, parent, projectType, text, path=""):
         """
         Constructor
-        
+
         @param parent parent item
         @param projectType type of file/directory in the project
         @param text text to be displayed (string)
@@ -123,71 +128,70 @@
         """
         BrowserItem.__init__(self, parent, text)
         ProjectBrowserItemMixin.__init__(self, projectType)
-        
+
         self._dirName = path
         if not os.path.isdir(self._dirName):
             self._dirName = os.path.dirname(self._dirName)
-        
+
         self.type_ = ProjectBrowserItemSimpleDirectory
         if os.path.lexists(self._dirName) and os.path.islink(self._dirName):
             self.symlink = True
             self.icon = UI.PixmapCache.getSymlinkIcon("dirClosed")
         else:
             self.icon = UI.PixmapCache.getIcon("dirClosed")
-    
+
     def setName(self, dinfo, full=True):
         """
         Public method to set the directory name.
-        
+
         @param dinfo dinfo is the string for the directory (string)
         @param full flag indicating full pathname should be displayed (boolean)
         """
         self._dirName = os.path.abspath(dinfo)
         self.itemData[0] = os.path.basename(self._dirName)
-    
+
     def dirName(self):
         """
         Public method returning the directory name.
-        
+
         @return directory name (string)
         """
         return self._dirName
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
         return self._dirName
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if (
-            issubclass(other.__class__, BrowserFileItem) and
-            Preferences.getUI("BrowsersListFoldersFirst")
+        if issubclass(other.__class__, BrowserFileItem) and Preferences.getUI(
+            "BrowsersListFoldersFirst"
         ):
             return order == Qt.SortOrder.AscendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
-class ProjectBrowserDirectoryItem(BrowserDirectoryItem,
-                                  ProjectBrowserItemMixin):
+class ProjectBrowserDirectoryItem(BrowserDirectoryItem, ProjectBrowserItemMixin):
     """
     Class implementing the data structure for project browser directory items.
     """
+
     def __init__(self, parent, dinfo, projectType, full=True, bold=False):
         """
         Constructor
-        
+
         @param parent parent item
         @param dinfo dinfo is the string for the directory (string)
         @param projectType type of file/directory in the project
@@ -196,7 +200,7 @@
         """
         BrowserDirectoryItem.__init__(self, parent, dinfo, full)
         ProjectBrowserItemMixin.__init__(self, projectType, bold)
-        
+
         self.type_ = ProjectBrowserItemDirectory
 
 
@@ -204,11 +208,13 @@
     """
     Class implementing the data structure for project browser file items.
     """
-    def __init__(self, parent, finfo, projectType, full=True, bold=False,
-                 sourceLanguage=""):
+
+    def __init__(
+        self, parent, finfo, projectType, full=True, bold=False, sourceLanguage=""
+    ):
         """
         Constructor
-        
+
         @param parent parent item
         @param finfo the string for the file (string)
         @param projectType type of file/directory in the project
@@ -218,40 +224,41 @@
         """
         BrowserFileItem.__init__(self, parent, finfo, full, sourceLanguage)
         ProjectBrowserItemMixin.__init__(self, projectType, bold)
-        
+
         self.type_ = ProjectBrowserItemFile
 
 
 class ProjectBrowserModel(BrowserModel):
     """
     Class implementing the project browser model.
-    
+
     @signal vcsStateChanged(str) emitted after the VCS state has changed
     """
+
     vcsStateChanged = pyqtSignal(str)
-    
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent reference to parent object (Project.Project)
         """
         super().__init__(parent, nopopulate=True)
-        
+
         rootData = self.tr("Name")
         self.rootItem = BrowserItem(None, rootData)
         self.rootItem.itemData.append(self.tr("VCS Status"))
-        
+
         self.progDir = None
         self.project = parent
-        
+
         self.watchedItems = {}
         self.__watcherActive = True
         self.watcher = QFileSystemWatcher(self)
         self.watcher.directoryChanged.connect(self.directoryChanged)
-        
+
         self.inRefresh = False
-        
+
         self.projectBrowserTypes = {
             "SOURCES": ProjectBrowserSourceType,
             "FORMS": ProjectBrowserFormType,
@@ -261,7 +268,7 @@
             "TRANSLATIONS": ProjectBrowserTranslationType,
             "OTHERS": ProjectBrowserOthersType,
         }
-        
+
         self.colorNames = {
             "A": "VcsAdded",
             "M": "VcsModified",
@@ -279,24 +286,23 @@
             "U": Preferences.getProjectBrowserColour(self.colorNames["U"]),
             "Z": Preferences.getProjectBrowserColour(self.colorNames["Z"]),
         }
-        
-        self.highLightColor = Preferences.getProjectBrowserColour(
-            "Highlighted")
+
+        self.highLightColor = Preferences.getProjectBrowserColour("Highlighted")
         # needed by preferencesChanged()
-        
+
         self.vcsStatusReport = {}
-    
+
     def data(self, index, role):
         """
         Public method to get data of an item.
-        
+
         @param index index of the data to retrieve (QModelIndex)
         @param role role of data (Qt.ItemDataRole)
         @return requested data
         """
         if not index.isValid():
             return None
-        
+
         if role == Qt.ItemDataRole.ForegroundRole:
             if index.column() == 0:
                 try:
@@ -305,8 +311,7 @@
                     return None
         elif role == Qt.ItemDataRole.BackgroundRole:
             try:
-                col = self.itemBackgroundColors[
-                    index.internalPointer().vcsState]
+                col = self.itemBackgroundColors[index.internalPointer().vcsState]
                 if col.isValid():
                     return col
                 else:
@@ -315,13 +320,13 @@
                 return None
             except KeyError:
                 return None
-        
+
         return BrowserModel.data(self, index, role)
-    
+
     def populateItem(self, parentItem, repopulate=False):
         """
         Public method to populate an item's subtree.
-        
+
         @param parentItem reference to the item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
@@ -337,30 +342,28 @@
     def populateProjectDirectoryItem(self, parentItem, repopulate=False):
         """
         Public method to populate a directory item's subtree.
-        
+
         @param parentItem reference to the directory item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
         self._addWatchedItem(parentItem)
-        
+
         qdir = QDir(parentItem.dirName())
-        
+
         fileFilter = (
-            (
-                QDir.Filter.AllEntries |
-                QDir.Filter.Hidden |
-                QDir.Filter.NoDotAndDotDot
-            )
-            if Preferences.getProject("BrowsersListHiddenFiles") else
-            QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
+            (QDir.Filter.AllEntries | QDir.Filter.Hidden | QDir.Filter.NoDotAndDotDot)
+            if Preferences.getProject("BrowsersListHiddenFiles")
+            else QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
         )
         entryInfoList = qdir.entryInfoList(fileFilter)
-        
+
         if len(entryInfoList) > 0:
             if repopulate:
-                self.beginInsertRows(self.createIndex(
-                    parentItem.row(), 0, parentItem),
-                    0, len(entryInfoList) - 1)
+                self.beginInsertRows(
+                    self.createIndex(parentItem.row(), 0, parentItem),
+                    0,
+                    len(entryInfoList) - 1,
+                )
             states = {}
             if self.project.vcs is not None:
                 for f in entryInfoList:
@@ -369,28 +372,30 @@
                 dname = parentItem.dirName()
                 self.project.vcs.clearStatusCache()
                 states = self.project.vcs.vcsAllRegisteredStates(states, dname)
-            
+
             for f in entryInfoList:
                 node = (
                     ProjectBrowserDirectoryItem(
                         parentItem,
                         Utilities.toNativeSeparators(f.absoluteFilePath()),
-                        parentItem.getProjectTypes()[0], False)
-                    if f.isDir() else
-                    ProjectBrowserFileItem(
+                        parentItem.getProjectTypes()[0],
+                        False,
+                    )
+                    if f.isDir()
+                    else ProjectBrowserFileItem(
                         parentItem,
                         Utilities.toNativeSeparators(f.absoluteFilePath()),
-                        parentItem.getProjectTypes()[0])
+                        parentItem.getProjectTypes()[0],
+                    )
                 )
                 if self.project.vcs is not None:
                     fname = f.absoluteFilePath()
                     if (
-                        states[os.path.normcase(fname)] ==
-                            self.project.vcs.canBeCommitted
+                        states[os.path.normcase(fname)]
+                        == self.project.vcs.canBeCommitted
                     ):
                         node.addVcsStatus(self.project.vcs.vcsName())
-                        self.project.clearStatusMonitorCachedState(
-                            f.absoluteFilePath())
+                        self.project.clearStatusMonitorCachedState(f.absoluteFilePath())
                     else:
                         node.addVcsStatus(self.tr("local"))
                 else:
@@ -404,19 +409,19 @@
         Public method called after a project has been closed.
         """
         self.__vcsStatus = {}
-        
+
         self.watchedItems = {}
         watchedDirs = self.watcher.directories()
         if watchedDirs:
             self.watcher.removePaths(watchedDirs)
-        
+
         self.rootItem.removeChildren()
         self.beginResetModel()
         self.endResetModel()
-        
+
         # reset the module parser cache
         Utilities.ModuleParser.resetParsedModules()
-        
+
     def projectOpened(self):
         """
         Public method used to populate the model after a project has been
@@ -425,17 +430,15 @@
         self.__vcsStatus = {}
         states = {}
         keys = list(self.projectBrowserTypes.keys())[:]
-        
+
         if self.project.vcs is not None:
             for key in keys:
                 for fn in self.project.pdata[key]:
-                    states[os.path.normcase(
-                        os.path.join(self.project.ppath, fn))] = 0
-            
+                    states[os.path.normcase(os.path.join(self.project.ppath, fn))] = 0
+
             self.project.vcs.clearStatusCache()
-            states = self.project.vcs.vcsAllRegisteredStates(
-                states, self.project.ppath)
-        
+            states = self.project.vcs.vcsAllRegisteredStates(states, self.project.ppath)
+
         self.inRefresh = True
         for key in keys:
             # Show the entry in bold in the others browser to make it more
@@ -444,25 +447,31 @@
             sourceLanguage = (
                 self.project.getProjectLanguage() if key == "SOURCES" else ""
             )
-            
+
             for fn in self.project.pdata[key]:
                 fname = os.path.join(self.project.ppath, fn)
                 parentItem, dt = self.findParentItemByName(
-                    self.projectBrowserTypes[key], fn)
+                    self.projectBrowserTypes[key], fn
+                )
                 itm = (
                     ProjectBrowserDirectoryItem(
-                        parentItem, fname, self.projectBrowserTypes[key],
-                        False, bold)
-                    if os.path.isdir(fname) else
-                    ProjectBrowserFileItem(
-                        parentItem, fname, self.projectBrowserTypes[key],
-                        False, bold, sourceLanguage=sourceLanguage)
+                        parentItem, fname, self.projectBrowserTypes[key], False, bold
+                    )
+                    if os.path.isdir(fname)
+                    else ProjectBrowserFileItem(
+                        parentItem,
+                        fname,
+                        self.projectBrowserTypes[key],
+                        False,
+                        bold,
+                        sourceLanguage=sourceLanguage,
+                    )
                 )
                 self._addItem(itm, parentItem)
                 if self.project.vcs is not None:
                     if (
-                        states[os.path.normcase(fname)] ==
-                            self.project.vcs.canBeCommitted
+                        states[os.path.normcase(fname)]
+                        == self.project.vcs.canBeCommitted
                     ):
                         itm.addVcsStatus(self.project.vcs.vcsName())
                     else:
@@ -476,10 +485,10 @@
     def findParentItemByName(self, type_, name, dontSplit=False):
         """
         Public method to find an item given its name.
-        
+
         <b>Note</b>: This method creates all necessary parent items, if they
         don't exist.
-        
+
         @param type_ type of the item
         @param name name of the item (string)
         @param dontSplit flag indicating the name should not be split (boolean)
@@ -490,8 +499,8 @@
             pathlist.append(name)
             pathlist.append("ignore_me")
         else:
-            pathlist = re.split(r'/|\\', name)
-        
+            pathlist = re.split(r"/|\\", name)
+
         if len(pathlist) > 1:
             olditem = self.rootItem
             path = self.project.ppath
@@ -499,8 +508,7 @@
                 itm = self.findChildItem(p, 0, olditem)
                 path = os.path.join(path, p)
                 if itm is None:
-                    itm = ProjectBrowserSimpleDirectoryItem(
-                        olditem, type_, p, path)
+                    itm = ProjectBrowserSimpleDirectoryItem(olditem, type_, p, path)
                     self.__addVCSStatus(itm, path)
                     if self.inRefresh:
                         self._addItem(itm, olditem)
@@ -508,8 +516,7 @@
                         if olditem == self.rootItem:
                             oldindex = QModelIndex()
                         else:
-                            oldindex = self.createIndex(
-                                olditem.row(), 0, olditem)
+                            oldindex = self.createIndex(olditem.row(), 0, olditem)
                         self.addItem(itm, oldindex)
                 else:
                     if type_ and type_ not in itm.getProjectTypes():
@@ -518,11 +525,11 @@
             return (itm, pathlist[-1])
         else:
             return (self.rootItem, name)
-    
+
     def findChildItem(self, text, column, parentItem=None):
         """
         Public method to find a child item given some text.
-        
+
         @param text text to search for (string)
         @param column column to search in (integer)
         @param parentItem reference to parent item
@@ -530,17 +537,17 @@
         """
         if parentItem is None:
             parentItem = self.rootItem
-        
+
         for itm in parentItem.children():
             if itm.data(column) == text:
                 return itm
-        
+
         return None
-        
+
     def addNewItem(self, typeString, name, additionalTypeStrings=None):
         """
         Public method to add a new item to the model.
-        
+
         @param typeString string denoting the type of the new item (string)
         @param name name of the new item (string)
         @param additionalTypeStrings names of additional types (list of string)
@@ -548,60 +555,66 @@
         # Show the entry in bold in the others browser to make it more
         # distinguishable
         bold = typeString == "OTHERS"
-        
+
         fname = os.path.join(self.project.ppath, name)
         parentItem, dt = self.findParentItemByName(
-            self.projectBrowserTypes[typeString], name)
+            self.projectBrowserTypes[typeString], name
+        )
         parentIndex = (
             QModelIndex()
-            if parentItem == self.rootItem else
-            self.createIndex(parentItem.row(), 0, parentItem)
+            if parentItem == self.rootItem
+            else self.createIndex(parentItem.row(), 0, parentItem)
         )
         if os.path.isdir(fname):
             itm = ProjectBrowserDirectoryItem(
-                parentItem, fname, self.projectBrowserTypes[typeString],
-                False, bold)
+                parentItem, fname, self.projectBrowserTypes[typeString], False, bold
+            )
         else:
             if typeString == "SOURCES":
                 sourceLanguage = self.project.getProjectLanguage()
             else:
                 sourceLanguage = ""
             itm = ProjectBrowserFileItem(
-                parentItem, fname, self.projectBrowserTypes[typeString],
-                False, bold, sourceLanguage=sourceLanguage)
+                parentItem,
+                fname,
+                self.projectBrowserTypes[typeString],
+                False,
+                bold,
+                sourceLanguage=sourceLanguage,
+            )
         self.__addVCSStatus(itm, fname)
         if additionalTypeStrings:
             for additionalTypeString in additionalTypeStrings:
                 type_ = self.projectBrowserTypes[additionalTypeString]
                 itm.addProjectType(type_)
         self.addItem(itm, parentIndex)
-    
+
     def renameItem(self, name, newFilename):
         """
         Public method to rename an item.
-        
+
         @param name the old display name (string)
         @param newFilename new filename of the item (string)
         """
         itm = self.findItem(name)
         if itm is None:
             return
-        
+
         index = self.createIndex(itm.row(), 0, itm)
         itm.setName(newFilename, full=False)
         self.dataChanged.emit(index, index)
         self.repopulateItem(newFilename)
-    
+
     def findItem(self, name):
         """
         Public method to find an item given its name.
-        
+
         @param name name of the item (string)
         @return reference to the item found
         """
         if QDir.isAbsolutePath(name):
             name = self.project.getRelativePath(name)
-        pathlist = re.split(r'/|\\', name)
+        pathlist = re.split(r"/|\\", name)
         if len(pathlist) > 0:
             olditem = self.rootItem
             for p in pathlist:
@@ -612,32 +625,29 @@
             return itm
         else:
             return None
-    
+
     def itemIndexByName(self, name):
         """
         Public method to find an item's index given its name.
-        
+
         @param name name of the item (string)
         @return index of the item found (QModelIndex)
         """
         itm = self.findItem(name)
         index = self.createIndex(itm.row(), 0, itm) if itm else QModelIndex()
         return index
-    
+
     def itemIndexByNameAndLine(self, name, lineno):
         """
         Public method to find an item's index given its name.
-        
+
         @param name name of the item (string)
         @param lineno one based line number of the item (integer)
         @return index of the item found (QModelIndex)
         """
         index = QModelIndex()
         itm = self.findItem(name)
-        if (
-            itm is not None and
-            isinstance(itm, ProjectBrowserFileItem)
-        ):
+        if itm is not None and isinstance(itm, ProjectBrowserFileItem):
             olditem = itm
             autoPopulate = Preferences.getProject("AutoPopulateItems")
             while itm is not None:
@@ -650,7 +660,7 @@
                     with contextlib.suppress(AttributeError):
                         start, end = child.boundaries()
                         if end == -1:
-                            end = 1000000   # assume end of file
+                            end = 1000000  # assume end of file
                         if start <= lineno <= end:
                             itm = child
                             break
@@ -659,51 +669,47 @@
                 if itm:
                     olditem = itm
             index = self.createIndex(olditem.row(), 0, olditem)
-        
+
         return index
-    
+
     def startFileSystemMonitoring(self):
         """
         Public method to (re)start monitoring the project file system.
         """
         self.__watcherActive = True
-    
+
     def stopFileSystemMonitoring(self):
         """
         Public method to stop monitoring the project file system.
         """
         self.__watcherActive = False
-        
+
     def directoryChanged(self, path):
         """
         Public slot to handle the directoryChanged signal of the watcher.
-        
+
         @param path path of the directory (string)
         """
         if not self.__watcherActive:
             return
-        
+
         if path not in self.watchedItems:
             # just ignore the situation we don't have a reference to the item
             return
-        
+
         fileFilter = (
-            (
-                QDir.Filter.AllEntries |
-                QDir.Filter.Hidden |
-                QDir.Filter.NoDotAndDotDot
-            )
-            if Preferences.getProject("BrowsersListHiddenFiles") else
-            QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
+            (QDir.Filter.AllEntries | QDir.Filter.Hidden | QDir.Filter.NoDotAndDotDot)
+            if Preferences.getProject("BrowsersListHiddenFiles")
+            else QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
         )
-        
+
         for itm in self.watchedItems[path]:
             oldCnt = itm.childCount()
-            
+
             qdir = QDir(itm.dirName())
-            
+
             entryInfoList = qdir.entryInfoList(fileFilter)
-            
+
             # step 1: check for new entries
             children = itm.children()
             for f in entryInfoList:
@@ -716,21 +722,22 @@
                         break
                 if childFound:
                     continue
-                
+
                 cnt = itm.childCount()
-                self.beginInsertRows(
-                    self.createIndex(itm.row(), 0, itm), cnt, cnt)
+                self.beginInsertRows(self.createIndex(itm.row(), 0, itm), cnt, cnt)
                 node = (
                     ProjectBrowserDirectoryItem(
                         itm,
                         Utilities.toNativeSeparators(f.absoluteFilePath()),
                         itm.getProjectTypes()[0],
-                        False)
-                    if f.isDir() else
-                    ProjectBrowserFileItem(
+                        False,
+                    )
+                    if f.isDir()
+                    else ProjectBrowserFileItem(
                         itm,
                         Utilities.toNativeSeparators(f.absoluteFilePath()),
-                        itm.getProjectTypes()[0])
+                        itm.getProjectTypes()[0],
+                    )
                 )
                 self._addItem(node, itm)
                 if self.project.vcs is not None:
@@ -741,7 +748,7 @@
                     else:
                         node.addVcsStatus(self.tr("local"))
                 self.endInsertRows()
-            
+
             # step 2: check for removed entries
             if len(entryInfoList) != itm.childCount():
                 for row in range(oldCnt - 1, -1, -1):
@@ -755,17 +762,16 @@
                             break
                     if entryFound:
                         continue
-                    
+
                     self._removeWatchedItem(child)
-                    self.beginRemoveRows(
-                        self.createIndex(itm.row(), 0, itm), row, row)
+                    self.beginRemoveRows(self.createIndex(itm.row(), 0, itm), row, row)
                     itm.removeChild(child)
                     self.endRemoveRows()
-    
+
     def __addVCSStatus(self, item, name):
         """
         Private method used to set the vcs status of a node.
-        
+
         @param item item to work on
         @param name filename belonging to this item (string)
         """
@@ -777,11 +783,11 @@
                 item.addVcsStatus(self.tr("local"))
         else:
             item.addVcsStatus("")
-    
+
     def __updateVCSStatus(self, item, name, recursive=True):
         """
         Private method used to update the vcs status of a node.
-        
+
         @param item item to work on
         @param name filename belonging to this item (string)
         @param recursive flag indicating a recursive update (boolean)
@@ -800,65 +806,66 @@
                     self.__updateVCSStatus(parentItem, name, recursive)
         else:
             item.setVcsStatus("")
-        
+
         index = self.createIndex(item.row(), 0, item)
         self.dataChanged.emit(index, index)
-    
+
     def updateVCSStatus(self, name, recursive=True):
         """
         Public method used to update the vcs status of a node.
-        
+
         @param name filename belonging to this item (string)
         @param recursive flag indicating a recursive update (boolean)
         """
         item = self.findItem(name)
         if item:
             self.__updateVCSStatus(item, name, recursive)
-    
+
     def removeItem(self, name):
         """
         Public method to remove a named item.
-        
+
         @param name file or directory name of the item (string).
         """
         fname = os.path.basename(name)
         parentItem = self.findParentItemByName(0, name)[0]
         parentIndex = (
             QModelIndex()
-            if parentItem == self.rootItem else
-            self.createIndex(parentItem.row(), 0, parentItem)
+            if parentItem == self.rootItem
+            else self.createIndex(parentItem.row(), 0, parentItem)
         )
         childItem = self.findChildItem(fname, 0, parentItem)
         if childItem is not None:
             self.beginRemoveRows(parentIndex, childItem.row(), childItem.row())
             parentItem.removeChild(childItem)
             self.endRemoveRows()
-    
+
     def repopulateItem(self, name):
         """
         Public method to repopulate an item.
-        
+
         @param name name of the file relative to the project root (string)
         """
         itm = self.findItem(name)
         if itm is None:
             return
-        
+
         if itm.isLazyPopulated():
             if not itm.isPopulated():
                 # item is not populated yet, nothing to do
                 return
-            
+
             if itm.childCount():
                 index = self.createIndex(itm.row(), 0, itm)
                 self.beginRemoveRows(index, 0, itm.childCount() - 1)
                 itm.removeChildren()
                 self.endRemoveRows()
             Utilities.ModuleParser.resetParsedModule(
-                os.path.join(self.project.ppath, name))
-            
+                os.path.join(self.project.ppath, name)
+            )
+
             self.populateItem(itm, True)
-    
+
     def projectPropertiesChanged(self):
         """
         Public method to react on a change of the project properties.
@@ -869,7 +876,7 @@
     def changeVCSStates(self, statesList):
         """
         Public slot to record the (non normal) VCS states.
-        
+
         @param statesList list of VCS state entries (list of strings) giving
             the states in the first column and the path relative to the project
             directory starting with the third column. The allowed status flags
@@ -887,21 +894,21 @@
         statesList.sort()
         lastHead = ""
         itemCache = {}
-        if len(statesList) == 1 and statesList[0] == '--RESET--':
+        if len(statesList) == 1 and statesList[0] == "--RESET--":
             statesList = []
             for name in list(self.__vcsStatus.keys()):
                 statesList.append(" {0}".format(name))
-        
+
         for name in statesList:
             state = name[0]
             if state in "AMORUZ ":
                 name = name[1:].strip()
-                if state == ' ':
+                if state == " ":
                     if name in self.__vcsStatus:
                         del self.__vcsStatus[name]
                 else:
                     self.__vcsStatus[name] = state
-                
+
                 try:
                     itm = itemCache[name]
                 except KeyError:
@@ -913,9 +920,10 @@
                     itm.setVcsStatus(self.project.vcs.vcsName())
                     index1 = self.createIndex(itm.row(), 0, itm)
                     index2 = self.createIndex(
-                        itm.row(), self.rootItem.columnCount(), itm)
+                        itm.row(), self.rootItem.columnCount(), itm
+                    )
                     self.dataChanged.emit(index1, index2)
-                
+
                 head, tail = os.path.split(name)
                 if head != lastHead:
                     if lastHead:
@@ -926,13 +934,13 @@
         try:
             globalVcsStatus = sorted(self.__vcsStatus.values())[-1]
         except IndexError:
-            globalVcsStatus = ' '
+            globalVcsStatus = " "
         self.vcsStateChanged.emit(globalVcsStatus)
 
     def __changeParentsVCSState(self, path, itemCache):
         """
         Private method to recursively change the parents VCS state.
-        
+
         @param path pathname of parent item (string)
         @param itemCache reference to the item cache used to store
             references to named items
@@ -953,10 +961,11 @@
                     itm.setVcsState(state)
                     index1 = self.createIndex(itm.row(), 0, itm)
                     index2 = self.createIndex(
-                        itm.row(), self.rootItem.columnCount(), itm)
+                        itm.row(), self.rootItem.columnCount(), itm
+                    )
                     self.dataChanged.emit(index1, index2)
             path, tail = os.path.split(path)
-    
+
     def preferencesChanged(self):
         """
         Public method used to handle a change in preferences.
@@ -965,9 +974,9 @@
             color = Preferences.getProjectBrowserColour(self.colorNames[code])
             if color.name() == self.itemBackgroundColors[code].name():
                 continue
-            
+
             self.itemBackgroundColors[code] = color
-        
+
         color = Preferences.getProjectBrowserColour("Highlighted")
         if self.highLightColor.name() != color.name():
             self.highLightColor = color
--- a/src/eric7/Project/ProjectBrowserSortFilterProxyModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectBrowserSortFilterProxyModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the browser sort filter proxy model.
     """
+
     def __init__(self, filterType, parent=None):
         """
         Constructor
-        
+
         @param filterType type of filter to apply
         @param parent reference to the parent object (QObject)
         """
@@ -30,14 +31,14 @@
         self.__filterType = filterType
         self.setDynamicSortFilter(True)
         self.hideGeneratedForms = Preferences.getProject("HideGeneratedForms")
-        
+
     def filterAcceptsRow(self, source_row, source_parent):
         """
         Public method to filter rows.
-        
+
         It implements a filter to suppress the display of non public
         classes, methods and attributes.
-        
+
         @param source_row row number (in the source model) of item (integer)
         @param source_parent index of parent item (in the source model)
             of item (QModelIndex)
@@ -51,23 +52,23 @@
             if self.__filterType not in sitem.getProjectTypes():
                 return False
             if (
-                self.hideGeneratedForms and
-                self.__filterType == ProjectBrowserSourceType and
-                sitem.data(0).startswith("Ui_")
+                self.hideGeneratedForms
+                and self.__filterType == ProjectBrowserSourceType
+                and sitem.data(0).startswith("Ui_")
             ):
                 return False
-        
+
         if self.hideNonPublic:
             return sitem.isPublic()
         else:
             return True
-    
+
     def preferencesChanged(self):
         """
         Public slot called to handle a change of the preferences settings.
         """
         BrowserSortFilterProxyModel.preferencesChanged(self)
-        
+
         hideGeneratedForms = Preferences.getProject("HideGeneratedForms")
         if self.hideGeneratedForms != hideGeneratedForms:
             self.hideGeneratedForms = hideGeneratedForms
--- a/src/eric7/Project/ProjectFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,10 +28,11 @@
     """
     Class representing the project JSON file.
     """
+
     def __init__(self, project: Project, parent: QObject = None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent reference to the parent object (defaults to None)
@@ -39,11 +40,11 @@
         """
         super().__init__(parent)
         self.__project = project
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the project data to a project JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful write
@@ -52,38 +53,50 @@
         projectDict = {}
         projectDict["header"] = {
             "comment": "eric project file for project {0}".format(
-                self.__project.getProjectName()),
+                self.__project.getProjectName()
+            ),
             "copyright": "Copyright (C) {0} {1}, {2}".format(
-                time.strftime('%Y'),
+                time.strftime("%Y"),
                 self.__project.pdata["AUTHOR"],
-                self.__project.pdata["EMAIL"])
+                self.__project.pdata["EMAIL"],
+            ),
         }
-        
+
         if Preferences.getProject("TimestampFile"):
-            projectDict["header"]["saved"] = (
-                time.strftime('%Y-%m-%d, %H:%M:%S')
-            )
-        
+            projectDict["header"]["saved"] = time.strftime("%Y-%m-%d, %H:%M:%S")
+
         projectDict["project"] = copy.deepcopy(self.__project.pdata)
-        
+
         # modify paths to contain universal separators
         for key in (
-            "SOURCES", "FORMS", "TRANSLATIONS", "TRANSLATIONEXCEPTIONS",
-            "RESOURCES", "INTERFACES", "PROTOCOLS", "OTHERS"
+            "SOURCES",
+            "FORMS",
+            "TRANSLATIONS",
+            "TRANSLATIONEXCEPTIONS",
+            "RESOURCES",
+            "INTERFACES",
+            "PROTOCOLS",
+            "OTHERS",
         ):
             with contextlib.suppress(KeyError):
-                projectDict["project"][key] = sorted([
-                    Utilities.fromNativeSeparators(f)
-                    for f in projectDict["project"][key]
-                ])
+                projectDict["project"][key] = sorted(
+                    [
+                        Utilities.fromNativeSeparators(f)
+                        for f in projectDict["project"][key]
+                    ]
+                )
         for key in (
-            "SPELLWORDS", "SPELLEXCLUDES", "TRANSLATIONPATTERN",
-            "TRANSLATIONSBINPATH", "MAINSCRIPT"
+            "SPELLWORDS",
+            "SPELLEXCLUDES",
+            "TRANSLATIONPATTERN",
+            "TRANSLATIONSBINPATH",
+            "MAINSCRIPT",
         ):
             with contextlib.suppress(KeyError):
                 projectDict["project"][key] = Utilities.fromNativeSeparators(
-                    projectDict["project"][key])
-        
+                    projectDict["project"][key]
+                )
+
         try:
             jsonString = json.dumps(projectDict, indent=2, sort_keys=True)
             with open(filename, "w", newline="") as f:
@@ -96,16 +109,16 @@
                     self.tr(
                         "<p>The project file <b>{0}</b> could not be "
                         "written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the project data from a project JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful read
@@ -122,28 +135,37 @@
                 self.tr(
                     "<p>The project file <b>{0}</b> could not be "
                     "read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         # modify paths to contain native separators
         for key in (
-            "SOURCES", "FORMS", "TRANSLATIONS", "TRANSLATIONEXCEPTIONS",
-            "RESOURCES", "INTERFACES", "PROTOCOLS", "OTHERS"
+            "SOURCES",
+            "FORMS",
+            "TRANSLATIONS",
+            "TRANSLATIONEXCEPTIONS",
+            "RESOURCES",
+            "INTERFACES",
+            "PROTOCOLS",
+            "OTHERS",
         ):
             with contextlib.suppress(KeyError):
                 projectDict["project"][key] = [
-                    Utilities.toNativeSeparators(f)
-                    for f in projectDict["project"][key]
+                    Utilities.toNativeSeparators(f) for f in projectDict["project"][key]
                 ]
         for key in (
-            "SPELLWORDS", "SPELLEXCLUDES", "TRANSLATIONPATTERN",
-            "TRANSLATIONSBINPATH", "MAINSCRIPT"
+            "SPELLWORDS",
+            "SPELLEXCLUDES",
+            "TRANSLATIONPATTERN",
+            "TRANSLATIONSBINPATH",
+            "MAINSCRIPT",
         ):
             with contextlib.suppress(KeyError):
                 projectDict["project"][key] = Utilities.toNativeSeparators(
-                    projectDict["project"][key])
-        
+                    projectDict["project"][key]
+                )
+
         self.__project.pdata = projectDict["project"]
-        
+
         return True
--- a/src/eric7/Project/ProjectFormsBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectFormsBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,8 +21,10 @@
 from EricWidgets.EricProgressDialog import EricProgressDialog
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserFormType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserFormType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
@@ -39,7 +41,7 @@
 class ProjectFormsBrowser(ProjectBaseBrowser):
     """
     A class used to display the forms part of the project.
-    
+
     @signal appendStderr(str) emitted after something was received from
         a QProcess on stderr
     @signal uipreview(str) emitted to preview a forms file
@@ -48,46 +50,62 @@
     @signal menusAboutToBeCreated() emitted when the context menus are about to
         be created. This is the right moment to add or remove hook methods.
     """
+
     appendStderr = pyqtSignal(str)
     uipreview = pyqtSignal(str)
     showMenu = pyqtSignal(str, QMenu)
     menusAboutToBeCreated = pyqtSignal()
-    
+
     Pyuic5IndentDefault = 4
     Pyuic6IndentDefault = 4
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
-        ProjectBaseBrowser.__init__(self, project, ProjectBrowserFormType,
-                                    parent)
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Forms'))
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserFormType, parent)
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Forms"))
 
-        self.setWhatsThis(self.tr(
-            """<b>Project Forms Browser</b>"""
-            """<p>This allows to easily see all forms contained in the"""
-            """ current project. Several actions can be executed via the"""
-            """ context menu.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Forms Browser</b>"""
+                """<p>This allows to easily see all forms contained in the"""
+                """ current project. Several actions can be executed via the"""
+                """ context menu.</p>"""
+            )
+        )
+
         # templates for Qt
         # these two lists have to stay in sync
         self.templates4 = [
-            'dialog4.tmpl', 'widget4.tmpl', 'mainwindow4.tmpl',
-            'dialogbuttonboxbottom4.tmpl', 'dialogbuttonboxright4.tmpl',
-            'dialogbuttonsbottom4.tmpl', 'dialogbuttonsbottomcenter4.tmpl',
-            'dialogbuttonsright4.tmpl', '', 'wizard4.tmpl', 'wizardpage4.tmpl',
-            'qdockwidget4.tmpl', 'qframe4.tmpl', 'qgroupbox4.tmpl',
-            'qscrollarea4.tmpl', 'qmdiarea4.tmpl', 'qtabwidget4.tmpl',
-            'qtoolbox4.tmpl', 'qstackedwidget4.tmpl'
+            "dialog4.tmpl",
+            "widget4.tmpl",
+            "mainwindow4.tmpl",
+            "dialogbuttonboxbottom4.tmpl",
+            "dialogbuttonboxright4.tmpl",
+            "dialogbuttonsbottom4.tmpl",
+            "dialogbuttonsbottomcenter4.tmpl",
+            "dialogbuttonsright4.tmpl",
+            "",
+            "wizard4.tmpl",
+            "wizardpage4.tmpl",
+            "qdockwidget4.tmpl",
+            "qframe4.tmpl",
+            "qgroupbox4.tmpl",
+            "qscrollarea4.tmpl",
+            "qmdiarea4.tmpl",
+            "qtabwidget4.tmpl",
+            "qtoolbox4.tmpl",
+            "qstackedwidget4.tmpl",
         ]
         self.templateTypes4 = [
             self.tr("Dialog"),
@@ -98,7 +116,7 @@
             self.tr("Dialog with Buttons (Bottom)"),
             self.tr("Dialog with Buttons (Bottom-Center)"),
             self.tr("Dialog with Buttons (Right)"),
-            '',
+            "",
             self.tr("QWizard"),
             self.tr("QWizardPage"),
             self.tr("QDockWidget"),
@@ -110,13 +128,13 @@
             self.tr("QToolBox"),
             self.tr("QStackedWidget"),
         ]
-        
+
         self.compileProc = None
         self.__uicompiler = ""
-        
+
         self.project.projectClosed.connect(self.__resetUiCompiler)
         self.project.projectPropertiesChanged.connect(self.__resetUiCompiler)
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
@@ -125,286 +143,274 @@
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.menusAboutToBeCreated.emit()
-        
+
         projectType = self.project.getProjectType()
-        
+
         self.menu = QMenu(self)
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
-            self.menu.addAction(
-                self.tr('Compile form'), self.__compileForm)
+            self.menu.addAction(self.tr("Compile form"), self.__compileForm)
+            self.menu.addAction(self.tr("Compile all forms"), self.__compileAllForms)
             self.menu.addAction(
-                self.tr('Compile all forms'),
-                self.__compileAllForms)
-            self.menu.addAction(
-                self.tr('Generate Dialog Code...'),
-                self.__generateDialogCode)
+                self.tr("Generate Dialog Code..."), self.__generateDialogCode
+            )
             self.menu.addSeparator()
             self.__pyuicConfigAct = self.menu.addAction(
-                self.tr('Configure uic Compiler'),
-                self.__configureUicCompiler)
+                self.tr("Configure uic Compiler"), self.__configureUicCompiler
+            )
             self.menu.addSeparator()
-            self.menu.addAction(
-                self.tr('Open in Qt-Designer'), self.__openFile)
-            self.menu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+            self.menu.addAction(self.tr("Open in Qt-Designer"), self.__openFile)
+            self.menu.addAction(self.tr("Open in Editor"), self.__openFileInEditor)
             self.menu.addSeparator()
-            self.menu.addAction(self.tr('Preview form'), self.__UIPreview)
-            self.menu.addAction(
-                self.tr('Preview translations'), self.__TRPreview)
+            self.menu.addAction(self.tr("Preview form"), self.__UIPreview)
+            self.menu.addAction(self.tr("Preview translations"), self.__TRPreview)
         else:
             if self.hooks["compileForm"] is not None:
                 self.menu.addAction(
-                    self.hooksMenuEntries.get(
-                        "compileForm",
-                        self.tr('Compile form')), self.__compileForm)
+                    self.hooksMenuEntries.get("compileForm", self.tr("Compile form")),
+                    self.__compileForm,
+                )
             if self.hooks["compileAllForms"] is not None:
                 self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllForms",
-                        self.tr('Compile all forms')),
-                    self.__compileAllForms)
+                        "compileAllForms", self.tr("Compile all forms")
+                    ),
+                    self.__compileAllForms,
+                )
             if self.hooks["generateDialogCode"] is not None:
                 self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateDialogCode",
-                        self.tr('Generate Dialog Code...')),
-                    self.__generateDialogCode)
+                        "generateDialogCode", self.tr("Generate Dialog Code...")
+                    ),
+                    self.__generateDialogCode,
+                )
             if (
-                self.hooks["compileForm"] is not None or
-                self.hooks["compileAllForms"] is not None or
-                self.hooks["generateDialogCode"] is not None
+                self.hooks["compileForm"] is not None
+                or self.hooks["compileAllForms"] is not None
+                or self.hooks["generateDialogCode"] is not None
             ):
                 self.menu.addSeparator()
             if self.hooks["open"] is not None:
                 self.menu.addAction(
-                    self.hooksMenuEntries.get("open", self.tr('Open')),
-                    self.__openFile)
-            self.menu.addAction(self.tr('Open'), self.__openFileInEditor)
+                    self.hooksMenuEntries.get("open", self.tr("Open")), self.__openFile
+                )
+            self.menu.addAction(self.tr("Open"), self.__openFileInEditor)
         self.menu.addSeparator()
-        act = self.menu.addAction(self.tr('Rename file'), self._renameFile)
+        act = self.menu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
-        act = self.menu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.menu.addAction(self.tr("Remove from project"), self._removeFile)
         self.menuActions.append(act)
-        act = self.menu.addAction(self.tr('Delete'), self.__deleteFile)
+        act = self.menu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.menu.addSeparator()
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
-            self.menu.addAction(self.tr('New form...'), self.__newForm)
+            self.menu.addAction(self.tr("New form..."), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
                 self.menu.addAction(
-                    self.hooksMenuEntries.get(
-                        "newForm", self.tr('New form...')), self.__newForm)
-        self.menu.addAction(self.tr('Add forms...'), self.__addFormFiles)
-        self.menu.addAction(
-            self.tr('Add forms directory...'), self.__addFormsDirectory)
+                    self.hooksMenuEntries.get("newForm", self.tr("New form...")),
+                    self.__newForm,
+                )
+        self.menu.addAction(self.tr("Add forms..."), self.__addFormFiles)
+        self.menu.addAction(self.tr("Add forms directory..."), self.__addFormsDirectory)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.menu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         self.backMenu = QMenu(self)
         if (
-            projectType in [
-                "PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"
-            ] or self.hooks["compileAllForms"] is not None
+            projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]
+            or self.hooks["compileAllForms"] is not None
         ):
             self.backMenu.addAction(
-                self.tr('Compile all forms'), self.__compileAllForms)
+                self.tr("Compile all forms"), self.__compileAllForms
+            )
             self.backMenu.addSeparator()
             self.__pyuicBackConfigAct = self.backMenu.addAction(
-                self.tr('Configure uic Compiler'),
-                self.__configureUicCompiler)
+                self.tr("Configure uic Compiler"), self.__configureUicCompiler
+            )
             self.backMenu.addSeparator()
-            self.backMenu.addAction(self.tr('New form...'), self.__newForm)
+            self.backMenu.addAction(self.tr("New form..."), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
                 self.backMenu.addAction(
-                    self.hooksMenuEntries.get(
-                        "newForm", self.tr('New form...')), self.__newForm)
+                    self.hooksMenuEntries.get("newForm", self.tr("New form...")),
+                    self.__newForm,
+                )
+        self.backMenu.addAction(self.tr("Add forms..."), self.project.addUiFiles)
         self.backMenu.addAction(
-            self.tr('Add forms...'), self.project.addUiFiles)
-        self.backMenu.addAction(
-            self.tr('Add forms directory...'), self.project.addUiDir)
+            self.tr("Add forms directory..."), self.project.addUiDir
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
             self.multiMenu.addAction(
-                self.tr('Compile forms'), self.__compileSelectedForms)
+                self.tr("Compile forms"), self.__compileSelectedForms
+            )
             self.multiMenu.addSeparator()
             self.__pyuicMultiConfigAct = self.multiMenu.addAction(
-                self.tr('Configure uic Compiler'),
-                self.__configureUicCompiler)
+                self.tr("Configure uic Compiler"), self.__configureUicCompiler
+            )
             self.multiMenu.addSeparator()
-            self.multiMenu.addAction(
-                self.tr('Open in Qt-Designer'), self.__openFile)
-            self.multiMenu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+            self.multiMenu.addAction(self.tr("Open in Qt-Designer"), self.__openFile)
+            self.multiMenu.addAction(self.tr("Open in Editor"), self.__openFileInEditor)
             self.multiMenu.addSeparator()
-            self.multiMenu.addAction(
-                self.tr('Preview translations'), self.__TRPreview)
+            self.multiMenu.addAction(self.tr("Preview translations"), self.__TRPreview)
         else:
             if self.hooks["compileSelectedForms"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileSelectedForms",
-                        self.tr('Compile forms')),
-                    self.__compileSelectedForms)
+                        "compileSelectedForms", self.tr("Compile forms")
+                    ),
+                    self.__compileSelectedForms,
+                )
                 self.multiMenu.addSeparator()
             if self.hooks["open"] is not None:
                 self.multiMenu.addAction(
-                    self.hooksMenuEntries.get("open", self.tr('Open')),
-                    self.__openFile)
-            self.multiMenu.addAction(
-                self.tr('Open'), self.__openFileInEditor)
+                    self.hooksMenuEntries.get("open", self.tr("Open")), self.__openFile
+                )
+            self.multiMenu.addAction(self.tr("Open"), self.__openFileInEditor)
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.dirMenu = QMenu(self)
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
-            self.dirMenu.addAction(
-                self.tr('Compile all forms'), self.__compileAllForms)
+            self.dirMenu.addAction(self.tr("Compile all forms"), self.__compileAllForms)
             self.dirMenu.addSeparator()
             self.__pyuicDirConfigAct = self.dirMenu.addAction(
-                self.tr('Configure uic Compiler'),
-                self.__configureUicCompiler)
+                self.tr("Configure uic Compiler"), self.__configureUicCompiler
+            )
             self.dirMenu.addSeparator()
         else:
             if self.hooks["compileAllForms"] is not None:
                 self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllForms",
-                        self.tr('Compile all forms')),
-                    self.__compileAllForms)
+                        "compileAllForms", self.tr("Compile all forms")
+                    ),
+                    self.__compileAllForms,
+                )
                 self.dirMenu.addSeparator()
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeDir)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
         self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
-            self.dirMenu.addAction(self.tr('New form...'), self.__newForm)
+            self.dirMenu.addAction(self.tr("New form..."), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
                 self.dirMenu.addAction(
-                    self.hooksMenuEntries.get(
-                        "newForm",
-                        self.tr('New form...')), self.__newForm)
-        self.dirMenu.addAction(
-            self.tr('Add forms...'), self.__addFormFiles)
-        self.dirMenu.addAction(
-            self.tr('Add forms directory...'), self.__addFormsDirectory)
-        self.dirMenu.addSeparator()
+                    self.hooksMenuEntries.get("newForm", self.tr("New form...")),
+                    self.__newForm,
+                )
+        self.dirMenu.addAction(self.tr("Add forms..."), self.__addFormFiles)
         self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Add forms directory..."), self.__addFormsDirectory
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = QMenu(self)
         if projectType in ["PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"]:
             self.dirMultiMenu.addAction(
-                self.tr('Compile all forms'), self.__compileAllForms)
+                self.tr("Compile all forms"), self.__compileAllForms
+            )
             self.dirMultiMenu.addSeparator()
             self.__pyuicDirMultiConfigAct = self.dirMultiMenu.addAction(
-                self.tr('Configure uic Compiler'),
-                self.__configureUicCompiler)
+                self.tr("Configure uic Compiler"), self.__configureUicCompiler
+            )
             self.dirMultiMenu.addSeparator()
         else:
             if self.hooks["compileAllForms"] is not None:
                 self.dirMultiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllForms",
-                        self.tr('Compile all forms')),
-                    self.__compileAllForms)
+                        "compileAllForms", self.tr("Compile all forms")
+                    ),
+                    self.__compileAllForms,
+                )
                 self.dirMultiMenu.addSeparator()
+        self.dirMultiMenu.addAction(self.tr("Add forms..."), self.project.addUiFiles)
         self.dirMultiMenu.addAction(
-            self.tr('Add forms...'), self.project.addUiFiles)
-        self.dirMultiMenu.addAction(
-            self.tr('Add forms directory...'), self.project.addUiDir)
+            self.tr("Add forms directory..."), self.project.addUiDir
+        )
         self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMultiMenu.addSeparator()
-        self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.menu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.menu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
-        enable = (
-            self.project.getProjectType() in ("PyQt5", "PyQt6", "E7Plugin")
-        )
+
+        enable = self.project.getProjectType() in ("PyQt5", "PyQt6", "E7Plugin")
         self.__pyuicConfigAct.setEnabled(enable)
         self.__pyuicMultiConfigAct.setEnabled(enable)
         self.__pyuicDirConfigAct.setEnabled(enable)
         self.__pyuicDirMultiConfigAct.setEnabled(enable)
         self.__pyuicBackConfigAct.setEnabled(enable)
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem])
+                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem,
-                         ProjectBrowserSimpleDirectoryItem])
+                        [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+                    )
                     cnt = categories["sum"]
-            
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -422,47 +428,47 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenu(self, self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuDirMulti(self):
         """
         Private slot called by the dirMultiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
-        
+
         self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def __addFormFiles(self):
         """
         Private method to add form files to the project.
@@ -471,14 +477,13 @@
         if isinstance(itm, ProjectBrowserFileItem):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('form', dn)
-        
+        self.project.addFiles("form", dn)
+
     def __addFormsDirectory(self):
         """
         Private method to add form files of a directory to the project.
@@ -487,14 +492,13 @@
         if isinstance(itm, ProjectBrowserFileItem):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addDirectory('form', dn)
-        
+        self.project.addDirectory("form", dn)
+
     def __openFile(self):
         """
         Private slot to handle the Open menu action.
@@ -508,7 +512,7 @@
                         self.hooks["open"](itm.fileName())
                     else:
                         self.designerFile.emit(itm.fileName())
-        
+
     def __openFileInEditor(self):
         """
         Private slot to handle the Open in Editor menu action.
@@ -516,7 +520,7 @@
         itmList = self.getSelectedItems()
         for itm in itmList[:]:
             self.sourceFile.emit(itm.fileName())
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
@@ -528,14 +532,14 @@
                     self.designerFile.emit(itm.fileName())
                 else:
                     self.sourceFile.emit(itm.fileName())
-        
+
     def __UIPreview(self):
         """
         Private slot to handle the Preview menu action.
         """
         itmList = self.getSelectedItems()
         self.uipreview.emit(itmList[0].fileName())
-        
+
     def __TRPreview(self):
         """
         Private slot to handle the Preview translations action.
@@ -544,11 +548,15 @@
         for itm in self.getSelectedItems():
             fileNames.append(itm.fileName())
         trfiles = sorted(self.project.pdata["TRANSLATIONS"][:])
-        fileNames.extend([os.path.join(self.project.ppath, trfile)
-                          for trfile in trfiles
-                          if trfile.endswith('.qm')])
+        fileNames.extend(
+            [
+                os.path.join(self.project.ppath, trfile)
+                for trfile in trfiles
+                if trfile.endswith(".qm")
+            ]
+        )
         self.trpreview[list].emit(fileNames)
-        
+
     def __newForm(self):
         """
         Private slot to handle the New Form menu action.
@@ -564,20 +572,24 @@
                     path = itm.dirName()
                 except AttributeError:
                     path = os.path.join(self.project.ppath, itm.data(0))
-        
+
         if self.hooks["newForm"] is not None:
             self.hooks["newForm"](path)
         else:
             if self.project.getProjectType() in [
-                "PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"
+                "PyQt5",
+                "PyQt6",
+                "E7Plugin",
+                "PySide2",
+                "PySide6",
             ]:
                 self.__newUiForm(path)
-        
+
     def __newUiForm(self, path):
         """
         Private slot to handle the New Form menu action for Qt-related
         projects.
-        
+
         @param path full directory path for the new form file (string)
         """
         selectedForm, ok = QInputDialog.getItem(
@@ -585,27 +597,31 @@
             self.tr("New Form"),
             self.tr("Select a form type:"),
             self.templateTypes4,
-            0, False)
+            0,
+            False,
+        )
         if not ok or not selectedForm:
             # user pressed cancel
             return
-        
+
         templateIndex = self.templateTypes4.index(selectedForm)
         templateFile = os.path.join(
-            getConfig('ericTemplatesDir'), self.templates4[templateIndex])
-        
+            getConfig("ericTemplatesDir"), self.templates4[templateIndex]
+        )
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("New Form"),
             path,
             self.tr("Qt User-Interface Files (*.ui);;All Files (*)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             # user aborted or didn't enter a filename
             return
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -616,11 +632,12 @@
                 self,
                 self.tr("New Form"),
                 self.tr("The file already exists! Overwrite it?"),
-                icon=EricMessageBox.Warning)
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 # user selected to not overwrite
                 return
-        
+
         try:
             shutil.copy(templateFile, fpath)
         except OSError as err:
@@ -629,18 +646,20 @@
                 self.tr("New Form"),
                 self.tr(
                     "<p>The new form file <b>{0}</b> could not be created.<br>"
-                    "Problem: {1}</p>").format(fpath, str(err)))
+                    "Problem: {1}</p>"
+                ).format(fpath, str(err)),
+            )
             return
-        
+
         self.project.appendFile(str(fpath))
         self.designerFile.emit(str(fpath))
-        
+
     def __deleteFile(self):
         """
         Private method to delete a form file from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         files = []
         fullNames = []
         for itm in itmList:
@@ -648,64 +667,65 @@
             fullNames.append(fn2)
             fn = self.project.getRelativePath(fn2)
             files.append(fn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete forms"),
-            self.tr(
-                "Do you really want to delete these forms from the project?"),
-            files)
-        
+            self.tr("Do you really want to delete these forms from the project?"),
+            files,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn2, fn in zip(fullNames, files):
                 self.closeSourceWindow.emit(fn2)
                 self.project.deleteFile(fn)
-    
+
     ###########################################################################
     ##  Methods to handle the various compile commands
     ###########################################################################
-    
+
     def __resetUiCompiler(self):
         """
         Private slot to reset the determined UI compiler executable.
         """
         self.__uicompiler = ""
-    
+
     def __determineUiCompiler(self):
         """
         Private method to determine the UI compiler for the project.
         """
         self.__resetUiCompiler()
-        
+
         if self.project.getProjectLanguage() == "Python3":
             if self.project.getProjectType() in ["PyQt5"]:
                 self.__uicompiler = Utilities.generatePyQtToolPath(
-                    'pyuic5', ["py3uic5"])
+                    "pyuic5", ["py3uic5"]
+                )
             elif self.project.getProjectType() in ["PyQt6", "E7Plugin"]:
-                self.__uicompiler = Utilities.generatePyQtToolPath(
-                    'pyuic6')
+                self.__uicompiler = Utilities.generatePyQtToolPath("pyuic6")
             elif self.project.getProjectType() == "PySide2":
                 self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside2-uic', variant=2)
+                    "pyside2-uic", variant=2
+                )
             elif self.project.getProjectType() == "PySide6":
                 self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside6-uic', variant=6)
-    
+                    "pyside6-uic", variant=6
+                )
+
     def getUiCompiler(self):
         """
         Public method to get the UI compiler executable of the project.
-        
+
         @return UI compiler executable
         @rtype str
         """
         if not self.__uicompiler:
             self.__determineUiCompiler()
-        
+
         return self.__uicompiler
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
@@ -714,11 +734,10 @@
         if self.compileProc is None:
             return
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.compileProc and self.compileProc.canReadLine():
-            self.buf += str(self.compileProc.readLine(),
-                            "utf-8", 'replace')
-        
+            self.buf += str(self.compileProc.readLine(), "utf-8", "replace")
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
@@ -726,36 +745,32 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardError)
         while self.compileProc and self.compileProc.canReadLine():
-            s = self.__uicompiler + ': '
-            error = str(self.compileProc.readLine(),
-                        ioEncoding, 'replace')
+            s = self.__uicompiler + ": "
+            error = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += error
             self.appendStderr.emit(s)
-        
+
     def __compileUIDone(self, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of the pyuic/rbuic process.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.compileRunning = False
         ericApp().getObject("ViewManager").enableEditorsCheckFocusIn(True)
         ui = ericApp().getObject("UserInterface")
-        if (
-            exitStatus == QProcess.ExitStatus.NormalExit and
-            exitCode == 0 and
-            self.buf
-        ):
+        if exitStatus == QProcess.ExitStatus.NormalExit and exitCode == 0 and self.buf:
             ofn = os.path.join(self.project.ppath, self.compiledFile)
             try:
-                newline = (None if self.project.useSystemEol()
-                           else self.project.getEolString())
+                newline = (
+                    None if self.project.useSystemEol() else self.project.getEolString()
+                )
                 with open(ofn, "w", encoding="utf-8", newline=newline) as f:
                     for line in self.buf.splitlines():
                         f.write(line + "\n")
@@ -764,8 +779,8 @@
                 ui.showNotification(
                     UI.PixmapCache.getPixmap("designer48"),
                     self.tr("Form Compilation"),
-                    self.tr("The compilation of the form file"
-                            " was successful."))
+                    self.tr("The compilation of the form file" " was successful."),
+                )
                 self.project.projectFormCompiled.emit(self.compiledFile)
             except OSError as msg:
                 ui.showNotification(
@@ -773,22 +788,25 @@
                     self.tr("Form Compilation"),
                     self.tr(
                         "<p>The compilation of the form file failed.</p>"
-                        "<p>Reason: {0}</p>").format(str(msg)),
+                        "<p>Reason: {0}</p>"
+                    ).format(str(msg)),
                     kind=NotificationTypes.CRITICAL,
-                    timeout=0)
+                    timeout=0,
+                )
         else:
             ui.showNotification(
                 UI.PixmapCache.getPixmap("designer48"),
                 self.tr("Form Compilation"),
                 self.tr("The compilation of the form file failed."),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
         self.compileProc = None
-        
+
     def __compileUI(self, fn, noDialog=False, progress=None):
         """
         Private method to compile a .ui file to a .py/.rb file.
-        
+
         @param fn filename of the .ui file to be compiled
         @param noDialog flag indicating silent operations
         @param progress reference to the progress dialog
@@ -797,18 +815,18 @@
         self.compileProc = QProcess()
         args = []
         self.buf = ""
-        
+
         uicompiler = self.getUiCompiler()
         if not uicompiler:
             return None
-        
+
         ofn, ext = os.path.splitext(fn)
         fn = os.path.join(self.project.ppath, fn)
-        
+
         if self.project.getProjectLanguage() == "Python3":
             dirname, filename = os.path.split(ofn)
             self.compiledFile = os.path.join(dirname, "Ui_" + filename + ".py")
-            
+
             if self.project.getProjectType() == "PySide2":
                 # PySide2
                 if Preferences.getQt("PySide2FromImports"):
@@ -831,26 +849,29 @@
                 indentWidth = Preferences.getQt("PyuicIndent")
                 if indentWidth != self.Pyuic5IndentDefault:
                     args.append("--indent={0}".format(indentWidth))
-                if (
-                    'uic5' in uicompiler and
-                    self.project.pdata["UICPARAMS"]["Package"]
-                ):
-                    args.append("--import-from={0}".format(
-                        self.project.pdata["UICPARAMS"]["Package"]))
+                if "uic5" in uicompiler and self.project.pdata["UICPARAMS"]["Package"]:
+                    args.append(
+                        "--import-from={0}".format(
+                            self.project.pdata["UICPARAMS"]["Package"]
+                        )
+                    )
                 elif Preferences.getQt("PyuicFromImports"):
                     args.append("--from-imports")
                 if self.project.pdata["UICPARAMS"]["RcSuffix"]:
-                    args.append("--resource-suffix={0}".format(
-                        self.project.pdata["UICPARAMS"]["RcSuffix"]))
+                    args.append(
+                        "--resource-suffix={0}".format(
+                            self.project.pdata["UICPARAMS"]["RcSuffix"]
+                        )
+                    )
         elif self.project.getProjectLanguage() == "Ruby":
-            self.compiledFile = ofn + '.rb'
-            args.append('-x')
-        
+            self.compiledFile = ofn + ".rb"
+            args.append("-x")
+
         args.append(fn)
         self.compileProc.finished.connect(self.__compileUIDone)
         self.compileProc.readyReadStandardOutput.connect(self.__readStdout)
         self.compileProc.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.noDialog = noDialog
         self.compileProc.setWorkingDirectory(self.project.getProjectPath())
         self.compileProc.start(uicompiler, args)
@@ -865,38 +886,38 @@
                 progress.cancel()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'Could not start {0}.<br>'
-                    'Ensure that it is in the search path.'
-                ).format(uicompiler))
+                    "Could not start {0}.<br>" "Ensure that it is in the search path."
+                ).format(uicompiler),
+            )
             return None
-        
+
     def __generateDialogCode(self):
         """
         Private method to generate dialog code for the form (Qt only).
         """
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
-        
+
         if self.hooks["generateDialogCode"] is not None:
             self.hooks["generateDialogCode"](fn)
         else:
             from .CreateDialogCodeDialog import CreateDialogCodeDialog
-            
+
             # change environment
             sys.path.insert(0, self.project.getProjectPath())
             cwd = os.getcwd()
             os.chdir(os.path.dirname(os.path.abspath(fn)))
-            
+
             dlg = CreateDialogCodeDialog(fn, self.project, self)
             if not dlg.initError():
                 dlg.exec()
-            
+
             # reset the environment
             os.chdir(cwd)
             del sys.path[0]
-        
+
     def __compileForm(self):
         """
         Private method to compile a form to a source file.
@@ -908,7 +929,7 @@
             self.hooks["compileForm"](fn)
         else:
             self.__compileUI(fn)
-        
+
     def __compileAllForms(self):
         """
         Private method to compile all forms to source files.
@@ -919,17 +940,21 @@
             numForms = len(self.project.pdata["FORMS"])
             progress = EricProgressDialog(
                 self.tr("Compiling forms..."),
-                self.tr("Abort"), 0, numForms,
-                self.tr("%v/%m Forms"), self)
+                self.tr("Abort"),
+                0,
+                numForms,
+                self.tr("%v/%m Forms"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Forms"))
-            
+
             for prog, fn in enumerate(self.project.pdata["FORMS"]):
                 progress.setValue(prog)
                 if progress.wasCanceled():
                     break
-                
+
                 proc = self.__compileUI(fn, True, progress)
                 if proc is not None:
                     while proc.state() == QProcess.ProcessState.Running:
@@ -938,32 +963,35 @@
                 else:
                     break
             progress.setValue(numForms)
-        
+
     def __compileSelectedForms(self):
         """
         Private method to compile selected forms to source files.
         """
         items = self.getSelectedItems()
-        files = [self.project.getRelativePath(itm.fileName())
-                 for itm in items]
-        
+        files = [self.project.getRelativePath(itm.fileName()) for itm in items]
+
         if self.hooks["compileSelectedForms"] is not None:
             self.hooks["compileSelectedForms"](files)
         else:
             numForms = len(files)
             progress = EricProgressDialog(
                 self.tr("Compiling forms..."),
-                self.tr("Abort"), 0, numForms,
-                self.tr("%v/%m Forms"), self)
+                self.tr("Abort"),
+                0,
+                numForms,
+                self.tr("%v/%m Forms"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Forms"))
-            
+
             for prog, fn in enumerate(files):
                 progress.setValue(prog)
                 if progress.wasCanceled():
                     break
-                
+
                 proc = self.__compileUI(fn, True, progress)
                 if proc is not None:
                     while proc.state() == QProcess.ProcessState.Running:
@@ -972,7 +1000,7 @@
                 else:
                     break
             progress.setValue(numForms)
-        
+
     def compileChangedForms(self):
         """
         Public method to compile all changed forms to source files.
@@ -981,45 +1009,53 @@
             self.hooks["compileChangedForms"](self.project.pdata["FORMS"])
         else:
             if self.project.getProjectType() not in [
-                "PyQt5", "PyQt6", "E7Plugin", "PySide2", "PySide6"
+                "PyQt5",
+                "PyQt6",
+                "E7Plugin",
+                "PySide2",
+                "PySide6",
             ]:
                 # ignore the request for non Qt GUI projects
                 return
-            
+
             if len(self.project.pdata["FORMS"]) == 0:
                 # The project does not contain form files.
                 return
-            
+
             progress = EricProgressDialog(
                 self.tr("Determining changed forms..."),
-                self.tr("Abort"), 0, 100, self.tr("%v/%m Forms"), self)
+                self.tr("Abort"),
+                0,
+                100,
+                self.tr("%v/%m Forms"),
+                self,
+            )
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Forms"))
-            
+
             # get list of changed forms
             changedForms = []
             progress.setMaximum(len(self.project.pdata["FORMS"]))
             for prog, fn in enumerate(self.project.pdata["FORMS"]):
                 progress.setValue(prog)
                 QApplication.processEvents()
-                
+
                 ifn = os.path.join(self.project.ppath, fn)
                 if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(dirname, "Ui_" + filename + ".py")
                 elif self.project.getProjectLanguage() == "Ruby":
-                    ofn = os.path.splitext(ifn)[0] + '.rb'
+                    ofn = os.path.splitext(ifn)[0] + ".rb"
                 if (
-                    not os.path.exists(ofn) or
-                    os.stat(ifn).st_mtime > os.stat(ofn).st_mtime
+                    not os.path.exists(ofn)
+                    or os.stat(ifn).st_mtime > os.stat(ofn).st_mtime
                 ):
                     changedForms.append(fn)
             progress.setValue(len(self.project.pdata["FORMS"]))
             QApplication.processEvents()
-            
+
             if changedForms:
-                progress.setLabelText(
-                    self.tr("Compiling changed forms..."))
+                progress.setLabelText(self.tr("Compiling changed forms..."))
                 progress.setMaximum(len(changedForms))
                 progress.setValue(prog)
                 QApplication.processEvents()
@@ -1027,7 +1063,7 @@
                     progress.setValue(prog)
                     if progress.wasCanceled():
                         break
-                    
+
                     proc = self.__compileUI(fn, True, progress)
                     if proc is not None:
                         while proc.state() == QProcess.ProcessState.Running:
@@ -1038,23 +1074,23 @@
                         break
                 progress.setValue(len(changedForms))
                 QApplication.processEvents()
-        
+
     def handlePreferencesChanged(self):
         """
         Public slot used to handle the preferencesChanged signal.
         """
         ProjectBaseBrowser.handlePreferencesChanged(self)
-        
+
         self.__resetUiCompiler()
-    
+
     def __configureUicCompiler(self):
         """
         Private slot to configure some non-common uic compiler options.
         """
         from .UicCompilerOptionsDialog import UicCompilerOptionsDialog
-        
+
         params = self.project.pdata["UICPARAMS"]
-        
+
         if self.project.getProjectType() in ["PyQt5", "PyQt6", "E7Plugin"]:
             dlg = UicCompilerOptionsDialog(params, self.getUiCompiler())
             if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -1068,15 +1104,15 @@
                 if root != params["PackagesRoot"]:
                     params["PackagesRoot"] = root
                     self.project.setDirty(True)
-    
+
     ###########################################################################
     ## Support for hooks below
     ###########################################################################
-    
+
     def _initHookMethods(self):
         """
         Protected method to initialize the hooks dictionary.
-        
+
         Supported hook methods are:
         <ul>
         <li>compileForm: takes filename as parameter</li>
@@ -1087,7 +1123,7 @@
         <li>newForm: takes full directory path of new file as parameter</li>
         <li>open: takes a filename as parameter</li>
         </ul>
-        
+
         <b>Note</b>: Filenames are relative to the project directory, if not
         specified differently.
         """
--- a/src/eric7/Project/ProjectInterfacesBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectInterfacesBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,14 +20,18 @@
 from EricWidgets.EricProgressDialog import EricProgressDialog
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserInterfaceType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserInterfaceType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
 from UI.BrowserModel import (
-    BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-    BrowserClassAttributeItem
+    BrowserFileItem,
+    BrowserClassItem,
+    BrowserMethodItem,
+    BrowserClassAttributeItem,
 )
 import UI.PixmapCache
 from UI.NotificationWidget import NotificationTypes
@@ -39,7 +43,7 @@
 class ProjectInterfacesBrowser(ProjectBaseBrowser):
     """
     A class used to display the interfaces (IDL) part of the project.
-    
+
     @signal appendStdout(str) emitted after something was received from
         a QProcess on stdout
     @signal appendStderr(str) emitted after something was received from
@@ -47,44 +51,45 @@
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     appendStdout = pyqtSignal(str)
     appendStderr = pyqtSignal(str)
     showMenu = pyqtSignal(str, QMenu)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
         self.omniidl = Preferences.getCorba("omniidl")
         if self.omniidl == "":
-            self.omniidl = (
-                Utilities.isWindowsPlatform() and
-                "omniidl.exe" or "omniidl"
-            )
+            self.omniidl = Utilities.isWindowsPlatform() and "omniidl.exe" or "omniidl"
         if not Utilities.isinpath(self.omniidl):
             self.omniidl = None
-        
-        ProjectBaseBrowser.__init__(self, project,
-                                    ProjectBrowserInterfaceType, parent)
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Interfaces (IDL)'))
-        
-        self.setWhatsThis(self.tr(
-            """<b>Project Interfaces Browser</b>"""
-            """<p>This allows to easily see all interfaces (CORBA IDL files)"""
-            """ contained in the current project. Several actions can be"""
-            """ executed via the context menu.</p>"""
-        ))
-        
+
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserInterfaceType, parent)
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Interfaces (IDL)"))
+
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Interfaces Browser</b>"""
+                """<p>This allows to easily see all interfaces (CORBA IDL files)"""
+                """ contained in the current project. Several actions can be"""
+                """ executed via the context menu.</p>"""
+            )
+        )
+
         project.prepareRepopulateItem.connect(self._prepareRepopulateItem)
         project.completeRepopulateItem.connect(self._completeRepopulateItem)
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
@@ -93,226 +98,228 @@
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.sourceMenu = QMenu(self)
         if self.omniidl is not None:
             self.sourceMenu.addAction(
-                self.tr('Compile interface'), self.__compileInterface)
+                self.tr("Compile interface"), self.__compileInterface
+            )
             self.sourceMenu.addAction(
-                self.tr('Compile all interfaces'),
-                self.__compileAllInterfaces)
+                self.tr("Compile all interfaces"), self.__compileAllInterfaces
+            )
             self.sourceMenu.addSeparator()
             self.sourceMenu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Open'), self._openItem)
+        self.sourceMenu.addAction(self.tr("Open"), self._openItem)
         self.sourceMenu.addSeparator()
-        act = self.sourceMenu.addAction(
-            self.tr('Rename file'), self._renameFile)
+        act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
         act = self.sourceMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+            self.tr("Remove from project"), self._removeFile
+        )
         self.menuActions.append(act)
-        act = self.sourceMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Add interfaces...'), self.__addInterfaceFiles)
+            self.tr("Add interfaces..."), self.__addInterfaceFiles
+        )
         self.sourceMenu.addAction(
-            self.tr('Add interfaces directory...'),
-            self.__addInterfacesDirectory)
+            self.tr("Add interfaces directory..."), self.__addInterfacesDirectory
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Copy Path to Clipboard"), self._copyToClipboard
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.sourceMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
-        self.sourceMenu.addAction(
-            self.tr('Configure CORBA...'), self.__configureCorba)
+        self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
+        self.sourceMenu.addAction(self.tr("Configure CORBA..."), self.__configureCorba)
 
         self.menu = QMenu(self)
         if self.omniidl is not None:
-            self.menu.addAction(
-                self.tr('Compile interface'), self.__compileInterface)
+            self.menu.addAction(self.tr("Compile interface"), self.__compileInterface)
             self.menu.addAction(
-                self.tr('Compile all interfaces'),
-                self.__compileAllInterfaces)
+                self.tr("Compile all interfaces"), self.__compileAllInterfaces
+            )
             self.menu.addSeparator()
             self.menu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.menu.addSeparator()
-        self.menu.addAction(self.tr('Open'), self._openItem)
+        self.menu.addAction(self.tr("Open"), self._openItem)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Add interfaces...'), self.__addInterfaceFiles)
+        self.menu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles)
         self.menu.addAction(
-            self.tr('Add interfaces directory...'),
-            self.__addInterfacesDirectory)
+            self.tr("Add interfaces directory..."), self.__addInterfacesDirectory
+        )
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
-        self.menu.addAction(
-            self.tr('Configure CORBA...'), self.__configureCorba)
+        self.menu.addAction(self.tr("Configure..."), self._configure)
+        self.menu.addAction(self.tr("Configure CORBA..."), self.__configureCorba)
 
         self.backMenu = QMenu(self)
         if self.omniidl is not None:
             self.backMenu.addAction(
-                self.tr('Compile all interfaces'),
-                self.__compileAllInterfaces)
+                self.tr("Compile all interfaces"), self.__compileAllInterfaces
+            )
             self.backMenu.addSeparator()
             self.backMenu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Add interfaces..."), self.project.addIdlFiles)
         self.backMenu.addAction(
-            self.tr('Add interfaces...'), self.project.addIdlFiles)
-        self.backMenu.addAction(
-            self.tr('Add interfaces directory...'), self.project.addIdlDir)
+            self.tr("Add interfaces directory..."), self.project.addIdlDir
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
-        self.backMenu.addAction(
-            self.tr('Configure CORBA...'), self.__configureCorba)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
+        self.backMenu.addAction(self.tr("Configure CORBA..."), self.__configureCorba)
         self.backMenu.setEnabled(False)
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.omniidl is not None:
             self.multiMenu.addAction(
-                self.tr('Compile interfaces'),
-                self.__compileSelectedInterfaces)
+                self.tr("Compile interfaces"), self.__compileSelectedInterfaces
+            )
             self.multiMenu.addSeparator()
             self.multiMenu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Open'), self._openItem)
+        self.multiMenu.addAction(self.tr("Open"), self._openItem)
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
-        self.multiMenu.addAction(
-            self.tr('Configure CORBA...'), self.__configureCorba)
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
+        self.multiMenu.addAction(self.tr("Configure CORBA..."), self.__configureCorba)
 
         self.dirMenu = QMenu(self)
         if self.omniidl is not None:
             self.dirMenu.addAction(
-                self.tr('Compile all interfaces'),
-                self.__compileAllInterfaces)
+                self.tr("Compile all interfaces"), self.__compileAllInterfaces
+            )
             self.dirMenu.addSeparator()
             self.dirMenu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.dirMenu.addSeparator()
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Add interfaces...'), self.__addInterfaceFiles)
+        self.dirMenu.addAction(self.tr("Add interfaces..."), self.__addInterfaceFiles)
         self.dirMenu.addAction(
-            self.tr('Add interfaces directory...'),
-            self.__addInterfacesDirectory)
+            self.tr("Add interfaces directory..."), self.__addInterfacesDirectory
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        self.dirMenu.addAction(
-            self.tr('Configure CORBA...'), self.__configureCorba)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+        self.dirMenu.addAction(self.tr("Configure CORBA..."), self.__configureCorba)
+
         self.dirMultiMenu = QMenu(self)
         if self.omniidl is not None:
             self.dirMultiMenu.addAction(
-                self.tr('Compile all interfaces'),
-                self.__compileAllInterfaces)
+                self.tr("Compile all interfaces"), self.__compileAllInterfaces
+            )
             self.dirMultiMenu.addSeparator()
             self.dirMultiMenu.addAction(
-                self.tr('Configure IDL compiler'),
-                self.__configureIdlCompiler)
+                self.tr("Configure IDL compiler"), self.__configureIdlCompiler
+            )
             self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Add interfaces...'), self.project.addIdlFiles)
+            self.tr("Add interfaces..."), self.project.addIdlFiles
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Add interfaces directory...'), self.project.addIdlDir)
+            self.tr("Add interfaces directory..."), self.project.addIdlDir
+        )
         self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
-        self.dirMultiMenu.addSeparator()
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        self.dirMultiMenu.addAction(self.tr('Configure CORBA...'),
-                                    self.__configureCorba)
-        
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.dirMultiMenu.addSeparator()
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+        self.dirMultiMenu.addAction(
+            self.tr("Configure CORBA..."), self.__configureCorba
+        )
+
         self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.sourceMenu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, BrowserClassItem,
-                 BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
+                [
+                    ProjectBrowserFileItem,
+                    BrowserClassItem,
+                    BrowserMethodItem,
+                    ProjectBrowserSimpleDirectoryItem,
+                ]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem, BrowserClassItem,
-                         BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
+                        [
+                            ProjectBrowserFileItem,
+                            BrowserClassItem,
+                            BrowserMethodItem,
+                            ProjectBrowserSimpleDirectoryItem,
+                        ]
+                    )
                     cnt = categories["sum"]
-            
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             cmcnt = (
-                categories[str(BrowserClassItem)] +
-                categories[str(BrowserMethodItem)]
+                categories[str(BrowserClassItem)] + categories[str(BrowserMethodItem)]
             )
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -326,10 +333,7 @@
                         itm = self.model().item(index)
                         if isinstance(itm, ProjectBrowserFileItem):
                             self.sourceMenu.popup(self.mapToGlobal(coord))
-                        elif isinstance(
-                            itm,
-                            (BrowserClassItem, BrowserMethodItem)
-                        ):
+                        elif isinstance(itm, (BrowserClassItem, BrowserMethodItem)):
                             self.menu.popup(self.mapToGlobal(coord))
                         else:
                             self.backMenu.popup(self.mapToGlobal(coord))
@@ -339,112 +343,114 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenu(self, self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuDirMulti(self):
         """
         Private slot called by the dirMultiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
-        
+
         self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         itmList = self.getSelectedItems(
-            [BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-             BrowserClassAttributeItem])
-        
+            [
+                BrowserFileItem,
+                BrowserClassItem,
+                BrowserMethodItem,
+                BrowserClassAttributeItem,
+            ]
+        )
+
         for itm in itmList:
             if isinstance(itm, BrowserFileItem):
                 self.sourceFile[str].emit(itm.fileName())
             elif isinstance(itm, BrowserClassItem):
-                self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.classObject().lineno)
+                self.sourceFile[str, int].emit(itm.fileName(), itm.classObject().lineno)
             elif isinstance(itm, BrowserMethodItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.functionObject().lineno)
+                    itm.fileName(), itm.functionObject().lineno
+                )
             elif isinstance(itm, BrowserClassAttributeItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.attributeObject().lineno)
-        
+                    itm.fileName(), itm.attributeObject().lineno
+                )
+
     def __addInterfaceFiles(self):
         """
         Private method to add interface files to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('interface', dn)
-        
+        self.project.addFiles("interface", dn)
+
     def __addInterfacesDirectory(self):
         """
         Private method to add interface files of a directory to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addDirectory('interface', dn)
-        
+        self.project.addDirectory("interface", dn)
+
     def __deleteFile(self):
         """
         Private method to delete files from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         files = []
         fullNames = []
         for itm in itmList:
@@ -452,26 +458,27 @@
             fullNames.append(fn2)
             fn = self.project.getRelativePath(fn2)
             files.append(fn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete interfaces"),
-            self.tr("Do you really want to delete these interfaces from"
-                    " the project?"),
-            files)
-        
+            self.tr(
+                "Do you really want to delete these interfaces from" " the project?"
+            ),
+            files,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn2, fn in zip(fullNames, files):
                 self.closeSourceWindow.emit(fn2)
                 self.project.deleteFile(fn)
-    
+
     ###########################################################################
     ##  Methods to handle the various compile commands
     ###########################################################################
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
@@ -479,16 +486,16 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
         while self.compileProc and self.compileProc.canReadLine():
-            s = 'omniidl: '
-            output = str(self.compileProc.readLine(), ioEncoding, 'replace')
+            s = "omniidl: "
+            output = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += output
             self.appendStdout.emit(s)
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
@@ -496,20 +503,20 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardError)
         while self.compileProc and self.compileProc.canReadLine():
-            s = 'omniidl: '
-            error = str(self.compileProc.readLine(), ioEncoding, 'replace')
+            s = "omniidl: "
+            error = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += error
             self.appendStderr.emit(s)
-        
+
     def __compileIDLDone(self, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of the omniidl process.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
@@ -527,19 +534,18 @@
             ui.showNotification(
                 UI.PixmapCache.getPixmap("corba48"),
                 self.tr("Interface Compilation"),
-                self.tr(
-                    "The compilation of the interface file was"
-                    " successful."))
+                self.tr("The compilation of the interface file was" " successful."),
+            )
         else:
             ui.showNotification(
                 UI.PixmapCache.getPixmap("corba48"),
                 self.tr("Interface Compilation"),
-                self.tr(
-                    "The compilation of the interface file failed."),
+                self.tr("The compilation of the interface file failed."),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
         self.compileProc = None
-        
+
     def __compileIDL(self, fn, noDialog=False, progress=None):
         """
         Private method to compile a .idl file to python.
@@ -550,29 +556,30 @@
         @return reference to the compile process (QProcess)
         """
         params = self.project.pdata["IDLPARAMS"]
-        
+
         self.compileProc = QProcess()
         args = []
-        
+
         args.append("-bpython")
         args.append("-I.")
         for directory in params["IncludeDirs"]:
-            args.append("-I{0}".format(
-                self.project.getAbsoluteUniversalPath(directory)))
+            args.append(
+                "-I{0}".format(self.project.getAbsoluteUniversalPath(directory))
+            )
         for name in params["DefinedNames"]:
             args.append("-D{0}".format(name))
         for name in params["UndefinedNames"]:
             args.append("-U{0}".format(name))
-        
+
         fn = self.project.getAbsoluteUniversalPath(fn)
         self.idlFile = fn
         args.append("-C{0}".format(os.path.dirname(fn)))
         args.append(fn)
-        
+
         self.compileProc.finished.connect(self.__compileIDLDone)
         self.compileProc.readyReadStandardOutput.connect(self.__readStdout)
         self.compileProc.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.noDialog = noDialog
         self.compileProc.start(self.omniidl, args)
         procStarted = self.compileProc.waitForStarted(5000)
@@ -585,13 +592,14 @@
                 progress.cancel()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start {0}.<br>'
-                    'Ensure that it is in the search path.</p>'
-                ).format(self.omniidl))
+                    "<p>Could not start {0}.<br>"
+                    "Ensure that it is in the search path.</p>"
+                ).format(self.omniidl),
+            )
             return None
-        
+
     def __compileInterface(self):
         """
         Private method to compile an interface to python.
@@ -601,7 +609,7 @@
             fn2 = itm.fileName()
             fn = self.project.getRelativePath(fn2)
             self.__compileIDL(fn)
-        
+
     def __compileAllInterfaces(self):
         """
         Private method to compile all interfaces to python.
@@ -610,12 +618,16 @@
             numIDLs = len(self.project.pdata["INTERFACES"])
             progress = EricProgressDialog(
                 self.tr("Compiling interfaces..."),
-                self.tr("Abort"), 0, numIDLs,
-                self.tr("%v/%m Interfaces"), self)
+                self.tr("Abort"),
+                0,
+                numIDLs,
+                self.tr("%v/%m Interfaces"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Interfaces"))
-            
+
             for prog, fn in enumerate(self.project.pdata["INTERFACES"]):
                 progress.setValue(prog)
                 if progress.wasCanceled():
@@ -628,25 +640,28 @@
                 else:
                     break
             progress.setValue(numIDLs)
-        
+
     def __compileSelectedInterfaces(self):
         """
         Private method to compile selected interfaces to python.
         """
         if self.omniidl is not None:
             items = self.getSelectedItems()
-            
-            files = [self.project.getRelativePath(itm.fileName())
-                     for itm in items]
+
+            files = [self.project.getRelativePath(itm.fileName()) for itm in items]
             numIDLs = len(files)
             progress = EricProgressDialog(
                 self.tr("Compiling interfaces..."),
-                self.tr("Abort"), 0, numIDLs,
-                self.tr("%v/%m Interfaces"), self)
+                self.tr("Abort"),
+                0,
+                numIDLs,
+                self.tr("%v/%m Interfaces"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Interfaces"))
-            
+
             for prog, fn in enumerate(files):
                 progress.setValue(prog)
                 if progress.wasCanceled():
@@ -659,18 +674,23 @@
                 else:
                     break
             progress.setValue(numIDLs)
-    
+
     def __configureIdlCompiler(self):
         """
         Private method to show a dialog to configure some options for the
         IDL compiler.
         """
         params = self.project.pdata["IDLPARAMS"]
-        
+
         from .IdlCompilerOptionsDialog import IdlCompilerOptionsDialog
+
         dlg = IdlCompilerOptionsDialog(
-            params["IncludeDirs"][:], params["DefinedNames"][:],
-            params["UndefinedNames"][:], self.project, self)
+            params["IncludeDirs"][:],
+            params["DefinedNames"][:],
+            params["UndefinedNames"][:],
+            self.project,
+            self,
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             include, defined, undefined = dlg.getData()
             if include != params["IncludeDirs"]:
@@ -682,7 +702,7 @@
             if undefined != params["UndefinedNames"]:
                 params["UndefinedNames"] = undefined[:]
                 self.project.setDirty(True)
-    
+
     def __configureCorba(self):
         """
         Private method to open the configuration dialog.
--- a/src/eric7/Project/ProjectOthersBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectOthersBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,8 +17,10 @@
 from EricWidgets import EricMessageBox
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserOthersType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserOthersType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
@@ -30,124 +32,120 @@
     """
     A class used to display the parts of the project, that don't fit the
     other categories.
-    
+
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     showMenu = pyqtSignal(str, QMenu)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
-        ProjectBaseBrowser.__init__(self, project, ProjectBrowserOthersType,
-                                    parent)
-    
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserDirectoryItem]
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserOthersType, parent)
+
+        self.selectedItemsFilter = [ProjectBrowserFileItem, ProjectBrowserDirectoryItem]
         self.specialMenuEntries = [1]
 
-        self.setWindowTitle(self.tr('Others'))
+        self.setWindowTitle(self.tr("Others"))
 
-        self.setWhatsThis(self.tr(
-            """<b>Project Others Browser</b>"""
-            """<p>This allows to easily see all other files and directories"""
-            """ contained in the current project. Several actions can be"""
-            """ executed via the context menu. The entry which is registered"""
-            """ in the project is shown in a different colour.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Others Browser</b>"""
+                """<p>This allows to easily see all other files and directories"""
+                """ contained in the current project. Several actions can be"""
+                """ executed via the context menu. The entry which is registered"""
+                """ in the project is shown in a different colour.</p>"""
+            )
+        )
+
         project.prepareRepopulateItem.connect(self._prepareRepopulateItem)
         project.completeRepopulateItem.connect(self._completeRepopulateItem)
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
         """
         ProjectBaseBrowser._createPopupMenus(self)
-        
-        self.menu.addAction(
-            self.tr('Open in Hex Editor'), self._openHexEditor)
+
+        self.menu.addAction(self.tr("Open in Hex Editor"), self._openHexEditor)
         self.editPixmapAct = self.menu.addAction(
-            self.tr('Open in Icon Editor'), self._editPixmap)
+            self.tr("Open in Icon Editor"), self._editPixmap
+        )
         self.openInEditorAct = self.menu.addAction(
-            self.tr('Open in Editor'), self._openFileInEditor)
+            self.tr("Open in Editor"), self._openFileInEditor
+        )
         self.menu.addSeparator()
         self.mimeTypeAct = self.menu.addAction(
-            self.tr('Show Mime-Type'), self.__showMimeType)
+            self.tr("Show Mime-Type"), self.__showMimeType
+        )
         self.menu.addSeparator()
         self.renameFileAct = self.menu.addAction(
-            self.tr('Rename file'), self._renameFile)
+            self.tr("Rename file"), self._renameFile
+        )
         self.menuActions.append(self.renameFileAct)
-        act = self.menu.addAction(
-            self.tr('Remove from project'), self.__removeItem)
+        act = self.menu.addAction(self.tr("Remove from project"), self.__removeItem)
         self.menuActions.append(act)
-        act = self.menu.addAction(self.tr('Delete'), self.__deleteItem)
+        act = self.menu.addAction(self.tr("Delete"), self.__deleteItem)
         self.menuActions.append(act)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Add files...'), self.project.addOthersFiles)
-        self.menu.addAction(
-            self.tr('Add directory...'), self.project.addOthersDir)
+        self.menu.addAction(self.tr("Add files..."), self.project.addOthersFiles)
+        self.menu.addAction(self.tr("Add directory..."), self.project.addOthersDir)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Refresh'), self.__refreshItem)
+        self.menu.addAction(self.tr("Refresh"), self.__refreshItem)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.menu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         self.backMenu = QMenu(self)
-        self.backMenu.addAction(
-            self.tr('Add files...'), self.project.addOthersFiles)
-        self.backMenu.addAction(
-            self.tr('Add directory...'), self.project.addOthersDir)
+        self.backMenu.addAction(self.tr("Add files..."), self.project.addOthersFiles)
+        self.backMenu.addAction(self.tr("Add directory..."), self.project.addOthersDir)
         self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
 
         self.multiMenu.addSeparator()
         act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self.__removeItem)
+            self.tr("Remove from project"), self.__removeItem
+        )
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteItem)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteItem)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.menu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.menu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             cnt = self.getSelectedItemsCount()
             if cnt <= 1:
@@ -155,7 +153,7 @@
                 if index.isValid():
                     self._selectSingleItem(index)
                     cnt = self.getSelectedItemsCount()
-            
+
             if cnt > 1:
                 self.multiMenu.popup(self.mapToGlobal(coord))
             else:
@@ -175,38 +173,38 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         self._showContextMenu(self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def _showContextMenu(self, menu):
         """
         Protected slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu Reference to the popup menu (QPopupMenu)
         """
         if self.project.vcs is None:
@@ -214,43 +212,38 @@
                 act.setEnabled(True)
             itm = self.model().item(self.currentIndex())
             if isinstance(
-                itm,
-                (ProjectBrowserSimpleDirectoryItem,
-                 ProjectBrowserDirectoryItem)
+                itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
             ):
                 self.renameFileAct.setEnabled(False)
         else:
             self.vcsHelper.showContextMenu(menu, self.menuActions)
-    
+
     def _editPixmap(self):
         """
         Protected slot to handle the open in icon editor popup menu entry.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList:
-            if (
-                isinstance(itm, ProjectBrowserFileItem) and
-                itm.isPixmapFile()
-            ):
+            if isinstance(itm, ProjectBrowserFileItem) and itm.isPixmapFile():
                 self.pixmapEditFile.emit(itm.fileName())
-        
+
     def _openHexEditor(self):
         """
         Protected slot to handle the open in hex editor popup menu entry.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList:
             if isinstance(itm, ProjectBrowserFileItem):
                 self.binaryFile.emit(itm.fileName())
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList:
             if isinstance(itm, ProjectBrowserFileItem):
                 if itm.isSvgFile():
@@ -264,20 +257,19 @@
                         self.sourceFile.emit(itm.fileName())
                     else:
                         QDesktopServices.openUrl(QUrl(itm.fileName()))
-    
+
     def _openFileInEditor(self):
         """
         Protected slot to handle the Open in Editor menu action.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList:
-            if (
-                isinstance(itm, ProjectBrowserFileItem) and
-                Utilities.MimeTypes.isTextFile(itm.fileName())
-            ):
+            if isinstance(
+                itm, ProjectBrowserFileItem
+            ) and Utilities.MimeTypes.isTextFile(itm.fileName()):
                 self.sourceFile.emit(itm.fileName())
-    
+
     def __showMimeType(self):
         """
         Private slot to show the mime type of the selected entry.
@@ -289,40 +281,49 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("Show Mime-Type"),
-                    self.tr("""The mime type of the file could not be"""
-                            """ determined."""))
+                    self.tr(
+                        """The mime type of the file could not be""" """ determined."""
+                    ),
+                )
             elif mimetype.split("/")[0] == "text":
                 EricMessageBox.information(
                     self,
                     self.tr("Show Mime-Type"),
-                    self.tr("""The file has the mime type <b>{0}</b>.""")
-                    .format(mimetype))
+                    self.tr("""The file has the mime type <b>{0}</b>.""").format(
+                        mimetype
+                    ),
+                )
             else:
                 textMimeTypesList = Preferences.getUI("TextMimeTypes")
                 if mimetype in textMimeTypesList:
                     EricMessageBox.information(
                         self,
                         self.tr("Show Mime-Type"),
-                        self.tr("""The file has the mime type <b>{0}</b>.""")
-                        .format(mimetype))
+                        self.tr("""The file has the mime type <b>{0}</b>.""").format(
+                            mimetype
+                        ),
+                    )
                 else:
                     ok = EricMessageBox.yesNo(
                         self,
                         self.tr("Show Mime-Type"),
-                        self.tr("""The file has the mime type <b>{0}</b>."""
-                                """<br/> Shall it be added to the list of"""
-                                """ text mime types?""").format(mimetype))
+                        self.tr(
+                            """The file has the mime type <b>{0}</b>."""
+                            """<br/> Shall it be added to the list of"""
+                            """ text mime types?"""
+                        ).format(mimetype),
+                    )
                     if ok:
                         textMimeTypesList.append(mimetype)
                         Preferences.setUI("TextMimeTypes", textMimeTypesList)
-        
+
     def __removeItem(self):
         """
         Private slot to remove the selected entry from the OTHERS project
         data area.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList[:]:
             if isinstance(itm, ProjectBrowserFileItem):
                 fn = itm.fileName()
@@ -331,14 +332,14 @@
             else:
                 dn = itm.dirName()
                 self.project.removeDirectory(dn)
-        
+
     def __deleteItem(self):
         """
         Private method to delete the selected entry from the OTHERS project
         data area.
         """
         itmList = self.getSelectedItems()
-        
+
         items = []
         names = []
         fullNames = []
@@ -364,18 +365,16 @@
         del itmList
         del dirFullNames
         del dirNames
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete files/directories"),
-            self.tr(
-                "Do you really want to delete these entries from the"
-                " project?"),
-            names)
-        
+            self.tr("Do you really want to delete these entries from the" " project?"),
+            names,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for itm, fn2, fn in zip(items[:], fullNames, names):
                 if isinstance(itm, ProjectBrowserFileItem):
@@ -383,7 +382,7 @@
                     self.project.deleteFile(fn)
                 elif isinstance(itm, ProjectBrowserDirectoryItem):
                     self.project.deleteDirectory(fn2)
-        
+
     def __refreshItem(self):
         """
         Private slot to refresh (repopulate) an item.
@@ -396,6 +395,6 @@
             name = itm.dirName()
             self._model.directoryChanged(name)
         else:
-            name = ''
-        
+            name = ""
+
         self._resizeColumns(QModelIndex())
--- a/src/eric7/Project/ProjectProtocolsBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectProtocolsBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,14 +20,18 @@
 from EricWidgets.EricProgressDialog import EricProgressDialog
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserProtocolsType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserProtocolsType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
 from UI.BrowserModel import (
-    BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-    BrowserClassAttributeItem
+    BrowserFileItem,
+    BrowserClassItem,
+    BrowserMethodItem,
+    BrowserClassAttributeItem,
 )
 import UI.PixmapCache
 from UI.NotificationWidget import NotificationTypes
@@ -40,7 +44,7 @@
 class ProjectProtocolsBrowser(ProjectBaseBrowser):
     """
     A class used to display the protocols (protobuf) part of the project.
-    
+
     @signal appendStdout(str) emitted after something was received from
         a QProcess on stdout
     @signal appendStderr(str) emitted after something was received from
@@ -48,37 +52,41 @@
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     appendStdout = pyqtSignal(str)
     appendStderr = pyqtSignal(str)
     showMenu = pyqtSignal(str, QMenu)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this browser
         @type QWidget
         """
-        ProjectBaseBrowser.__init__(self, project,
-                                    ProjectBrowserProtocolsType, parent)
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Protocols (protobuf)'))
-        
-        self.setWhatsThis(self.tr(
-            """<b>Project Protocols Browser</b>"""
-            """<p>This allows to easily see all protocols (protobuf files)"""
-            """ contained in the current project. Several actions can be"""
-            """ executed via the context menu.</p>"""
-        ))
-        
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserProtocolsType, parent)
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Protocols (protobuf)"))
+
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Protocols Browser</b>"""
+                """<p>This allows to easily see all protocols (protobuf files)"""
+                """ contained in the current project. Several actions can be"""
+                """ executed via the context menu.</p>"""
+            )
+        )
+
         project.prepareRepopulateItem.connect(self._prepareRepopulateItem)
         project.completeRepopulateItem.connect(self._completeRepopulateItem)
-    
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
@@ -87,224 +95,238 @@
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.sourceMenu = QMenu(self)
+        self.sourceMenu.addAction(self.tr("Compile protocol"), self.__compileProtocol)
         self.sourceMenu.addAction(
-            self.tr('Compile protocol'), self.__compileProtocol)
-        self.sourceMenu.addAction(
-            self.tr('Compile all protocols'),
-            self.__compileAllProtocols)
+            self.tr("Compile all protocols"), self.__compileAllProtocols
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Compile protocol as gRPC'),
-            lambda: self.__compileProtocol(grpc=True))
+            self.tr("Compile protocol as gRPC"),
+            lambda: self.__compileProtocol(grpc=True),
+        )
         self.sourceMenu.addAction(
-            self.tr('Compile all protocols as gRPC'),
-            lambda: self.__compileAllProtocols(grpc=True))
+            self.tr("Compile all protocols as gRPC"),
+            lambda: self.__compileAllProtocols(grpc=True),
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Open'), self._openItem)
+        self.sourceMenu.addAction(self.tr("Open"), self._openItem)
         self.sourceMenu.addSeparator()
-        act = self.sourceMenu.addAction(
-            self.tr('Rename file'), self._renameFile)
+        act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
         act = self.sourceMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+            self.tr("Remove from project"), self._removeFile
+        )
+        self.menuActions.append(act)
+        act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
-        act = self.sourceMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
-        self.menuActions.append(act)
+        self.sourceMenu.addSeparator()
+        self.sourceMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
+        self.sourceMenu.addAction(
+            self.tr("Add protocols directory..."), self.__addProtocolsDirectory
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Add protocols...'), self.__addProtocolFiles)
-        self.sourceMenu.addAction(
-            self.tr('Add protocols directory...'),
-            self.__addProtocolsDirectory)
-        self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Copy Path to Clipboard"), self._copyToClipboard
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.sourceMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
+        self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
         self.sourceMenu.addAction(
-            self.tr('Configure Protobuf...'), self.__configureProtobuf)
+            self.tr("Configure Protobuf..."), self.__configureProtobuf
+        )
 
         self.menu = QMenu(self)
-        self.menu.addAction(
-            self.tr('Compile protocol'), self.__compileProtocol)
+        self.menu.addAction(self.tr("Compile protocol"), self.__compileProtocol)
         self.menu.addAction(
-            self.tr('Compile all protocols'),
-            self.__compileAllProtocols)
+            self.tr("Compile all protocols"), self.__compileAllProtocols
+        )
         self.menu.addSeparator()
         self.menu.addAction(
-            self.tr('Compile protocol as gRPC'),
-            lambda: self.__compileProtocol(grpc=True))
-        self.menu.addAction(
-            self.tr('Compile all protocols as gRPC'),
-            lambda: self.__compileAllProtocols(grpc=True))
-        self.menu.addSeparator()
-        self.menu.addAction(self.tr('Open'), self._openItem)
-        self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Add protocols...'), self.__addProtocolFiles)
+            self.tr("Compile protocol as gRPC"),
+            lambda: self.__compileProtocol(grpc=True),
+        )
         self.menu.addAction(
-            self.tr('Add protocols directory...'),
-            self.__addProtocolsDirectory)
+            self.tr("Compile all protocols as gRPC"),
+            lambda: self.__compileAllProtocols(grpc=True),
+        )
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.menu.addAction(self.tr("Open"), self._openItem)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
         self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add protocols directory..."), self.__addProtocolsDirectory
+        )
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
-        self.menu.addAction(
-            self.tr('Configure Protobuf...'), self.__configureProtobuf)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Configure..."), self._configure)
+        self.menu.addAction(self.tr("Configure Protobuf..."), self.__configureProtobuf)
 
         self.backMenu = QMenu(self)
         self.backMenu.addAction(
-            self.tr('Compile all protocols'),
-            self.__compileAllProtocols)
-        self.backMenu.addSeparator()
-        self.backMenu.addAction(
-            self.tr('Compile all protocols as gRPC'),
-            lambda: self.__compileAllProtocols(grpc=True))
+            self.tr("Compile all protocols"), self.__compileAllProtocols
+        )
         self.backMenu.addSeparator()
         self.backMenu.addAction(
-            self.tr('Add protocols...'), self.project.addProtoFiles)
-        self.backMenu.addAction(
-            self.tr('Add protocols directory...'), self.project.addProtoDir)
+            self.tr("Compile all protocols as gRPC"),
+            lambda: self.__compileAllProtocols(grpc=True),
+        )
         self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Add protocols..."), self.project.addProtoFiles)
         self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add protocols directory..."), self.project.addProtoDir
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Configure Protobuf...'), self.__configureProtobuf)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
+        self.backMenu.addAction(
+            self.tr("Configure Protobuf..."), self.__configureProtobuf
+        )
         self.backMenu.setEnabled(False)
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         self.multiMenu.addAction(
-            self.tr('Compile protocols'),
-            self.__compileSelectedProtocols)
+            self.tr("Compile protocols"), self.__compileSelectedProtocols
+        )
         self.multiMenu.addSeparator()
         self.multiMenu.addAction(
-            self.tr('Compile protocols as gRPC'),
-            lambda: self.__compileSelectedProtocols(grpc=True))
-        self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Open'), self._openItem)
+            self.tr("Compile protocols as gRPC"),
+            lambda: self.__compileSelectedProtocols(grpc=True),
+        )
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        self.multiMenu.addAction(self.tr("Open"), self._openItem)
+        self.multiMenu.addSeparator()
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
         self.multiMenu.addAction(
-            self.tr('Configure Protobuf...'), self.__configureProtobuf)
+            self.tr("Configure Protobuf..."), self.__configureProtobuf
+        )
 
         self.dirMenu = QMenu(self)
         self.dirMenu.addAction(
-            self.tr('Compile all protocols'),
-            self.__compileAllProtocols)
-        self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Compile all protocols as gRPC'),
-            lambda: self.__compileAllProtocols(grpc=True))
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
-        self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
-        self.dirMenuActions.append(act)
-        self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Add protocols...'), self.__addProtocolFiles)
-        self.dirMenu.addAction(
-            self.tr('Add protocols directory...'),
-            self.__addProtocolsDirectory)
-        self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Compile all protocols"), self.__compileAllProtocols
+        )
         self.dirMenu.addSeparator()
         self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Compile all protocols as gRPC"),
+            lambda: self.__compileAllProtocols(grpc=True),
+        )
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeFile)
+        self.dirMenuActions.append(act)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
+        self.dirMenuActions.append(act)
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Add protocols..."), self.__addProtocolFiles)
         self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add protocols directory..."), self.__addProtocolsDirectory
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Configure Protobuf...'), self.__configureProtobuf)
-        
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+        self.dirMenu.addAction(
+            self.tr("Configure Protobuf..."), self.__configureProtobuf
+        )
+
         self.dirMultiMenu = QMenu(self)
         self.dirMultiMenu.addAction(
-            self.tr('Compile all protocols'),
-            self.__compileAllProtocols)
+            self.tr("Compile all protocols"), self.__compileAllProtocols
+        )
         self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Compile all protocols as gRPC'),
-            lambda: self.__compileAllProtocols(grpc=True))
+            self.tr("Compile all protocols as gRPC"),
+            lambda: self.__compileAllProtocols(grpc=True),
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Add protocols...'), self.project.addProtoFiles)
+            self.tr("Add protocols..."), self.project.addProtoFiles
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Add protocols directory...'), self.project.addProtoDir)
+            self.tr("Add protocols directory..."), self.project.addProtoDir
+        )
         self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
-        self.dirMultiMenu.addSeparator()
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        self.dirMultiMenu.addAction(self.tr('Configure Protobuf...'),
-                                    self.__configureProtobuf)
-        
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.dirMultiMenu.addSeparator()
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+        self.dirMultiMenu.addAction(
+            self.tr("Configure Protobuf..."), self.__configureProtobuf
+        )
+
         self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.sourceMenu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, BrowserClassItem,
-                 BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
+                [
+                    ProjectBrowserFileItem,
+                    BrowserClassItem,
+                    BrowserMethodItem,
+                    ProjectBrowserSimpleDirectoryItem,
+                ]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem, BrowserClassItem,
-                         BrowserMethodItem, ProjectBrowserSimpleDirectoryItem])
+                        [
+                            ProjectBrowserFileItem,
+                            BrowserClassItem,
+                            BrowserMethodItem,
+                            ProjectBrowserSimpleDirectoryItem,
+                        ]
+                    )
                     cnt = categories["sum"]
-            
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             cmcnt = (
-                categories[str(BrowserClassItem)] +
-                categories[str(BrowserMethodItem)]
+                categories[str(BrowserClassItem)] + categories[str(BrowserMethodItem)]
             )
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -318,10 +340,7 @@
                         itm = self.model().item(index)
                         if isinstance(itm, ProjectBrowserFileItem):
                             self.sourceMenu.popup(self.mapToGlobal(coord))
-                        elif isinstance(
-                            itm,
-                            (BrowserClassItem, BrowserMethodItem)
-                        ):
+                        elif isinstance(itm, (BrowserClassItem, BrowserMethodItem)):
                             self.menu.popup(self.mapToGlobal(coord))
                         else:
                             self.backMenu.popup(self.mapToGlobal(coord))
@@ -331,112 +350,114 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenu(self, self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuDirMulti(self):
         """
         Private slot called by the dirMultiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
-        
+
         self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         itmList = self.getSelectedItems(
-            [BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-             BrowserClassAttributeItem])
-        
+            [
+                BrowserFileItem,
+                BrowserClassItem,
+                BrowserMethodItem,
+                BrowserClassAttributeItem,
+            ]
+        )
+
         for itm in itmList:
             if isinstance(itm, BrowserFileItem):
                 self.sourceFile[str].emit(itm.fileName())
             elif isinstance(itm, BrowserClassItem):
-                self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.classObject().lineno)
+                self.sourceFile[str, int].emit(itm.fileName(), itm.classObject().lineno)
             elif isinstance(itm, BrowserMethodItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.functionObject().lineno)
+                    itm.fileName(), itm.functionObject().lineno
+                )
             elif isinstance(itm, BrowserClassAttributeItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.attributeObject().lineno)
-        
+                    itm.fileName(), itm.attributeObject().lineno
+                )
+
     def __addProtocolFiles(self):
         """
         Private method to add protocol files to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('protocol', dn)
-        
+        self.project.addFiles("protocol", dn)
+
     def __addProtocolsDirectory(self):
         """
         Private method to add protocol files of a directory to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addDirectory('protocol', dn)
-        
+        self.project.addDirectory("protocol", dn)
+
     def __deleteFile(self):
         """
         Private method to delete files from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         files = []
         fullNames = []
         for itm in itmList:
@@ -444,30 +465,31 @@
             fullNames.append(fn2)
             fn = self.project.getRelativePath(fn2)
             files.append(fn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete Protocols"),
-            self.tr("Do you really want to delete these protocol files from"
-                    " the project?"),
-            files)
-        
+            self.tr(
+                "Do you really want to delete these protocol files from" " the project?"
+            ),
+            files,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn2, fn in zip(fullNames, files):
                 self.closeSourceWindow.emit(fn2)
                 self.project.deleteFile(fn)
-    
+
     ###########################################################################
     ##  Methods to handle the various compile commands
     ###########################################################################
-    
+
     def __getCompilerCommand(self, grpc):
         """
         Private method to get the compiler command.
-        
+
         @param grpc flag indicating to get a gRPC command
         @type bool
         @return tuple giving the executable and its parameter list
@@ -475,24 +497,21 @@
         """
         exe = None
         exeArgs = []
-        
+
         if grpc:
             exe = Preferences.getProtobuf("grpcPython")
             if exe == "":
                 exe = Globals.getPythonExecutable()
-            exeArgs = ['-m', 'grpc_tools.protoc']
+            exeArgs = ["-m", "grpc_tools.protoc"]
         else:
             exe = Preferences.getProtobuf("protoc")
             if exe == "":
-                exe = (
-                    Utilities.isWindowsPlatform() and
-                    "protoc.exe" or "protoc"
-                )
+                exe = Utilities.isWindowsPlatform() and "protoc.exe" or "protoc"
             if not Utilities.isinpath(exe):
                 exe = None
-        
+
         return exe, exeArgs
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
@@ -500,16 +519,16 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
         while self.compileProc and self.compileProc.canReadLine():
-            s = 'protoc: '
-            output = str(self.compileProc.readLine(), ioEncoding, 'replace')
+            s = "protoc: "
+            output = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += output
             self.appendStdout.emit(s)
-        
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
@@ -517,20 +536,20 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardError)
         while self.compileProc and self.compileProc.canReadLine():
-            s = 'protoc: '
-            error = str(self.compileProc.readLine(), ioEncoding, 'replace')
+            s = "protoc: "
+            error = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += error
             self.appendStderr.emit(s)
-        
+
     def __compileProtoDone(self, exitCode, exitStatus, grpc):
         """
         Private slot to handle the finished signal of the protoc process.
-        
+
         @param exitCode exit code of the process
         @type int
         @param exitStatus exit status of the process
@@ -554,9 +573,8 @@
             ui.showNotification(
                 icon,
                 self.tr("Protocol Compilation"),
-                self.tr(
-                    "The compilation of the protocol file was"
-                    " successful."))
+                self.tr("The compilation of the protocol file was" " successful."),
+            )
         else:
             if grpc:
                 icon = UI.PixmapCache.getPixmap("gRPC48")
@@ -565,12 +583,12 @@
             ui.showNotification(
                 icon,
                 self.tr("Protocol Compilation"),
-                self.tr(
-                    "The compilation of the protocol file failed."),
+                self.tr("The compilation of the protocol file failed."),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
         self.compileProc = None
-        
+
     def __compileProto(self, fn, noDialog=False, progress=None, grpc=False):
         """
         Private method to compile a .proto file to Python.
@@ -590,22 +608,23 @@
         if exe:
             self.compileProc = QProcess()
             args = []
-            
+
             fn = os.path.join(self.project.ppath, fn)
             self.__protoFile = fn
-            
+
             srcPath = os.path.dirname(fn)
             args.append("--proto_path={0}".format(srcPath))
             args.append("--python_out={0}".format(srcPath))
             if grpc:
                 args.append("--grpc_python_out={0}".format(srcPath))
             args.append(fn)
-            
+
             self.compileProc.finished.connect(
-                lambda c, s: self.__compileProtoDone(c, s, grpc))
+                lambda c, s: self.__compileProtoDone(c, s, grpc)
+            )
             self.compileProc.readyReadStandardOutput.connect(self.__readStdout)
             self.compileProc.readyReadStandardError.connect(self.__readStderr)
-            
+
             self.noDialog = noDialog
             self.compileProc.start(exe, exeArgs + args)
             procStarted = self.compileProc.waitForStarted(5000)
@@ -618,23 +637,25 @@
                     progress.cancel()
                 EricMessageBox.critical(
                     self,
-                    self.tr('Process Generation Error'),
+                    self.tr("Process Generation Error"),
                     self.tr(
-                        '<p>Could not start {0}.<br>'
-                        'Ensure that it is in the search path.</p>'
-                    ).format(exe))
+                        "<p>Could not start {0}.<br>"
+                        "Ensure that it is in the search path.</p>"
+                    ).format(exe),
+                )
                 return None
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Compiler Invalid'),
-                self.tr('The configured compiler is invalid.'))
+                self.tr("Compiler Invalid"),
+                self.tr("The configured compiler is invalid."),
+            )
             return None
-        
+
     def __compileProtocol(self, grpc=False):
         """
         Private method to compile a protocol to Python.
-        
+
         @param grpc flag indicating to compile as gRPC files
         @type bool
         """
@@ -643,11 +664,11 @@
             fn2 = itm.fileName()
             fn = self.project.getRelativePath(fn2)
             self.__compileProto(fn, grpc=grpc)
-        
+
     def __compileAllProtocols(self, grpc=False):
         """
         Private method to compile all protocols to Python.
-        
+
         @param grpc flag indicating to compile as gRPC files
         @type bool
         """
@@ -655,12 +676,16 @@
             numProtos = len(self.project.pdata["PROTOCOLS"])
             progress = EricProgressDialog(
                 self.tr("Compiling Protocols..."),
-                self.tr("Abort"), 0, numProtos,
-                self.tr("%v/%m Protocols"), self)
+                self.tr("Abort"),
+                0,
+                numProtos,
+                self.tr("%v/%m Protocols"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Protocols"))
-            
+
             for prog, fn in enumerate(self.project.pdata["PROTOCOLS"]):
                 progress.setValue(prog)
                 if progress.wasCanceled():
@@ -673,28 +698,31 @@
                 else:
                     break
             progress.setValue(numProtos)
-        
+
     def __compileSelectedProtocols(self, grpc=False):
         """
         Private method to compile selected protocols to Python.
-        
+
         @param grpc flag indicating to compile as gRPC files
         @type bool
         """
         if self.__getCompilerCommand(grpc)[0] is not None:
             items = self.getSelectedItems()
-            
-            files = [self.project.getRelativePath(itm.fileName())
-                     for itm in items]
+
+            files = [self.project.getRelativePath(itm.fileName()) for itm in items]
             numProtos = len(files)
             progress = EricProgressDialog(
                 self.tr("Compiling Protocols..."),
-                self.tr("Abort"), 0, numProtos,
-                self.tr("%v/%m Protocols"), self)
+                self.tr("Abort"),
+                0,
+                numProtos,
+                self.tr("%v/%m Protocols"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Protocols"))
-            
+
             for prog, fn in enumerate(files):
                 progress.setValue(prog)
                 if progress.wasCanceled():
@@ -707,7 +735,7 @@
                 else:
                     break
             progress.setValue(numProtos)
-        
+
     def __configureProtobuf(self):
         """
         Private method to open the configuration dialog.
--- a/src/eric7/Project/ProjectResourcesBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectResourcesBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,8 +19,10 @@
 from EricWidgets.EricProgressDialog import EricProgressDialog
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserResourceType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserResourceType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
@@ -34,42 +36,46 @@
 class ProjectResourcesBrowser(ProjectBaseBrowser):
     """
     A class used to display the resources part of the project.
-    
+
     @signal appendStderr(str) emitted after something was received from
         a QProcess on stderr
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     appendStderr = pyqtSignal(str)
     showMenu = pyqtSignal(str, QMenu)
-    
+
     RCFilenameFormatPython = "{0}_rc.py"
     RCFilenameFormatRuby = "{0}_rc.rb"
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
-        ProjectBaseBrowser.__init__(self, project, ProjectBrowserResourceType,
-                                    parent)
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Resources'))
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserResourceType, parent)
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Resources"))
 
-        self.setWhatsThis(self.tr(
-            """<b>Project Resources Browser</b>"""
-            """<p>This allows to easily see all resources contained in the"""
-            """ current project. Several actions can be executed via the"""
-            """ context menu.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Resources Browser</b>"""
+                """<p>This allows to easily see all resources contained in the"""
+                """ current project. Several actions can be executed via the"""
+                """ context menu.</p>"""
+            )
+        )
+
         self.compileProc = None
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
@@ -78,270 +84,291 @@
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.menu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
+            self.menu.addAction(self.tr("Compile resource"), self.__compileResource)
             self.menu.addAction(
-                self.tr('Compile resource'),
-                self.__compileResource)
-            self.menu.addAction(
-                self.tr('Compile all resources'),
-                self.__compileAllResources)
+                self.tr("Compile all resources"), self.__compileAllResources
+            )
             self.menu.addSeparator()
             self.menu.addAction(
-                self.tr('Configure rcc Compiler'),
-                self.__configureRccCompiler)
+                self.tr("Configure rcc Compiler"), self.__configureRccCompiler
+            )
             self.menu.addSeparator()
         else:
             if self.hooks["compileResource"] is not None:
                 self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileResource",
-                        self.tr('Compile resource')),
-                    self.__compileResource)
+                        "compileResource", self.tr("Compile resource")
+                    ),
+                    self.__compileResource,
+                )
             if self.hooks["compileAllResources"] is not None:
                 self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllResources",
-                        self.tr('Compile all resources')),
-                    self.__compileAllResources)
+                        "compileAllResources", self.tr("Compile all resources")
+                    ),
+                    self.__compileAllResources,
+                )
             if (
-                self.hooks["compileResource"] is not None or
-                self.hooks["compileAllResources"] is not None
+                self.hooks["compileResource"] is not None
+                or self.hooks["compileAllResources"] is not None
             ):
                 self.menu.addSeparator()
-        self.menu.addAction(self.tr('Open'), self.__openFile)
+        self.menu.addAction(self.tr("Open"), self.__openFile)
         self.menu.addSeparator()
-        act = self.menu.addAction(self.tr('Rename file'), self._renameFile)
+        act = self.menu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
-        act = self.menu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.menu.addAction(self.tr("Remove from project"), self._removeFile)
         self.menuActions.append(act)
-        act = self.menu.addAction(self.tr('Delete'), self.__deleteFile)
+        act = self.menu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.menu.addSeparator()
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
-            self.menu.addAction(
-                self.tr('New resource...'), self.__newResource)
+            self.menu.addAction(self.tr("New resource..."), self.__newResource)
         else:
             if self.hooks["newResource"] is not None:
                 self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "newResource",
-                        self.tr('New resource...')), self.__newResource)
-        self.menu.addAction(
-            self.tr('Add resources...'), self.__addResourceFiles)
-        self.menu.addAction(
-            self.tr('Add resources directory...'),
-            self.__addResourcesDirectory)
-        self.menu.addSeparator()
+                        "newResource", self.tr("New resource...")
+                    ),
+                    self.__newResource,
+                )
+        self.menu.addAction(self.tr("Add resources..."), self.__addResourceFiles)
         self.menu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Add resources directory..."), self.__addResourcesDirectory
+        )
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         self.backMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             self.backMenu.addAction(
-                self.tr('Compile all resources'),
-                self.__compileAllResources)
+                self.tr("Compile all resources"), self.__compileAllResources
+            )
             self.backMenu.addSeparator()
             self.backMenu.addAction(
-                self.tr('Configure rcc Compiler'),
-                self.__configureRccCompiler)
+                self.tr("Configure rcc Compiler"), self.__configureRccCompiler
+            )
             self.backMenu.addSeparator()
-            self.backMenu.addAction(
-                self.tr('New resource...'), self.__newResource)
+            self.backMenu.addAction(self.tr("New resource..."), self.__newResource)
         else:
             if self.hooks["compileAllResources"] is not None:
                 self.backMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllResources",
-                        self.tr('Compile all resources')),
-                    self.__compileAllResources)
+                        "compileAllResources", self.tr("Compile all resources")
+                    ),
+                    self.__compileAllResources,
+                )
                 self.backMenu.addSeparator()
             if self.hooks["newResource"] is not None:
                 self.backMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "newResource",
-                        self.tr('New resource...')), self.__newResource)
+                        "newResource", self.tr("New resource...")
+                    ),
+                    self.__newResource,
+                )
         self.backMenu.addAction(
-            self.tr('Add resources...'), self.project.addResourceFiles)
+            self.tr("Add resources..."), self.project.addResourceFiles
+        )
         self.backMenu.addAction(
-            self.tr('Add resources directory...'),
-            self.project.addResourceDir)
+            self.tr("Add resources directory..."), self.project.addResourceDir
+        )
         self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             act = self.multiMenu.addAction(
-                self.tr('Compile resources'),
-                self.__compileSelectedResources)
+                self.tr("Compile resources"), self.__compileSelectedResources
+            )
             self.multiMenu.addSeparator()
             self.multiMenu.addAction(
-                self.tr('Configure rcc Compiler'),
-                self.__configureRccCompiler)
+                self.tr("Configure rcc Compiler"), self.__configureRccCompiler
+            )
             self.multiMenu.addSeparator()
         else:
             if self.hooks["compileSelectedResources"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileSelectedResources",
-                        self.tr('Compile resources')),
-                    self.__compileSelectedResources)
+                        "compileSelectedResources", self.tr("Compile resources")
+                    ),
+                    self.__compileSelectedResources,
+                )
                 self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Open'), self.__openFile)
+        self.multiMenu.addAction(self.tr("Open"), self.__openFile)
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.dirMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             self.dirMenu.addAction(
-                self.tr('Compile all resources'),
-                self.__compileAllResources)
+                self.tr("Compile all resources"), self.__compileAllResources
+            )
             self.dirMenu.addSeparator()
             self.dirMenu.addAction(
-                self.tr('Configure rcc Compiler'),
-                self.__configureRccCompiler)
+                self.tr("Configure rcc Compiler"), self.__configureRccCompiler
+            )
             self.dirMenu.addSeparator()
         else:
             if self.hooks["compileAllResources"] is not None:
                 self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllResources",
-                        self.tr('Compile all resources')),
-                    self.__compileAllResources)
+                        "compileAllResources", self.tr("Compile all resources")
+                    ),
+                    self.__compileAllResources,
+                )
                 self.dirMenu.addSeparator()
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeDir)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
         self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('New resource...'), self.__newResource)
-        self.dirMenu.addAction(
-            self.tr('Add resources...'), self.__addResourceFiles)
-        self.dirMenu.addAction(
-            self.tr('Add resources directory...'),
-            self.__addResourcesDirectory)
-        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("New resource..."), self.__newResource)
+        self.dirMenu.addAction(self.tr("Add resources..."), self.__addResourceFiles)
         self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Add resources directory..."), self.__addResourcesDirectory
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             self.dirMultiMenu.addAction(
-                self.tr('Compile all resources'),
-                self.__compileAllResources)
+                self.tr("Compile all resources"), self.__compileAllResources
+            )
             self.dirMultiMenu.addSeparator()
             self.dirMultiMenu.addAction(
-                self.tr('Configure rcc Compiler'),
-                self.__configureRccCompiler)
+                self.tr("Configure rcc Compiler"), self.__configureRccCompiler
+            )
             self.dirMultiMenu.addSeparator()
         else:
             if self.hooks["compileAllResources"] is not None:
                 self.dirMultiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "compileAllResources",
-                        self.tr('Compile all resources')),
-                    self.__compileAllResources)
+                        "compileAllResources", self.tr("Compile all resources")
+                    ),
+                    self.__compileAllResources,
+                )
                 self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Add resources...'),
-            self.project.addResourceFiles)
+            self.tr("Add resources..."), self.project.addResourceFiles
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Add resources directory...'),
-            self.project.addResourceDir)
+            self.tr("Add resources directory..."), self.project.addResourceDir
+        )
         self.dirMultiMenu.addSeparator()
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMultiMenu.addSeparator()
-        self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.menu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.menu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem])
+                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem,
-                         ProjectBrowserSimpleDirectoryItem])
+                        [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+                    )
                     cnt = categories["sum"]
-                        
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -359,47 +386,47 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenu(self, self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuDirMulti(self):
         """
         Private slot called by the dirMultiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
-        
+
         self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def __addResourceFiles(self):
         """
         Private method to add resource files to the project.
@@ -408,14 +435,13 @@
         if isinstance(itm, ProjectBrowserFileItem):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('resource', dn)
-        
+        self.project.addFiles("resource", dn)
+
     def __addResourcesDirectory(self):
         """
         Private method to add resource files of a directory to the project.
@@ -424,20 +450,19 @@
         if isinstance(itm, ProjectBrowserFileItem):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addDirectory('resource', dn)
-        
+        self.project.addDirectory("resource", dn)
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         self.__openFile()
-        
+
     def __openFile(self):
         """
         Private slot to handle the Open menu action.
@@ -446,7 +471,7 @@
         for itm in itmList[:]:
             if isinstance(itm, ProjectBrowserFileItem):
                 self.sourceFile.emit(itm.fileName())
-        
+
     def __newResource(self):
         """
         Private slot to handle the New Resource menu action.
@@ -462,7 +487,7 @@
                     path = itm.dirName()
                 except AttributeError:
                     path = os.path.join(self.project.ppath, itm.data(0))
-        
+
         if self.hooks["newResource"] is not None:
             self.hooks["newResource"](path)
         else:
@@ -472,12 +497,13 @@
                 path,
                 self.tr("Qt Resource Files (*.qrc)"),
                 "",
-                EricFileDialog.DontConfirmOverwrite)
-            
+                EricFileDialog.DontConfirmOverwrite,
+            )
+
             if not fname:
                 # user aborted or didn't enter a filename
                 return
-            
+
             fpath = pathlib.Path(fname)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -488,40 +514,42 @@
                     self,
                     self.tr("New Resource"),
                     self.tr("The file already exists! Overwrite it?"),
-                    icon=EricMessageBox.Warning)
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     # user selected to not overwrite
                     return
-            
+
             try:
-                newline = (None if self.project.useSystemEol()
-                           else self.project.getEolString())
-                with fpath.open('w', encoding="utf-8",
-                                newline=newline) as rcfile:
-                    rcfile.write('<!DOCTYPE RCC>\n')
+                newline = (
+                    None if self.project.useSystemEol() else self.project.getEolString()
+                )
+                with fpath.open("w", encoding="utf-8", newline=newline) as rcfile:
+                    rcfile.write("<!DOCTYPE RCC>\n")
                     rcfile.write('<RCC version="1.0">\n')
-                    rcfile.write('<qresource>\n')
-                    rcfile.write('</qresource>\n')
-                    rcfile.write('</RCC>\n')
+                    rcfile.write("<qresource>\n")
+                    rcfile.write("</qresource>\n")
+                    rcfile.write("</RCC>\n")
             except OSError as e:
                 EricMessageBox.critical(
                     self,
                     self.tr("New Resource"),
                     self.tr(
                         "<p>The new resource file <b>{0}</b> could not"
-                        " be created.<br>Problem: {1}</p>")
-                    .format(fpath, str(e)))
+                        " be created.<br>Problem: {1}</p>"
+                    ).format(fpath, str(e)),
+                )
                 return
-            
+
             self.project.appendFile(str(fpath))
             self.sourceFile.emit(str(fpath))
-        
+
     def __deleteFile(self):
         """
         Private method to delete a resource file from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         files = []
         fullNames = []
         for itm in itmList:
@@ -529,27 +557,27 @@
             fullNames.append(fn2)
             fn = self.project.getRelativePath(fn2)
             files.append(fn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete resources"),
             self.tr(
-                "Do you really want to delete these resources from the"
-                " project?"),
-            files)
-        
+                "Do you really want to delete these resources from the" " project?"
+            ),
+            files,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn2, fn in zip(fullNames, files):
                 self.closeSourceWindow.emit(fn2)
                 self.project.deleteFile(fn)
-    
+
     ###########################################################################
     ##  Methods to handle the various compile commands
     ###########################################################################
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
@@ -558,12 +586,14 @@
         if self.compileProc is None:
             return
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.compileProc and self.compileProc.canReadLine():
-            self.buf += str(self.compileProc.readLine(),
-                            Preferences.getSystem("IOEncoding"),
-                            'replace')
-        
+            self.buf += str(
+                self.compileProc.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
@@ -571,36 +601,32 @@
         """
         if self.compileProc is None:
             return
-        
+
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         self.compileProc.setReadChannel(QProcess.ProcessChannel.StandardError)
         while self.compileProc and self.compileProc.canReadLine():
-            s = self.rccCompiler + ': '
-            error = str(self.compileProc.readLine(),
-                        ioEncoding, 'replace')
+            s = self.rccCompiler + ": "
+            error = str(self.compileProc.readLine(), ioEncoding, "replace")
             s += error
             self.appendStderr.emit(s)
-        
+
     def __compileQRCDone(self, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of the compile process.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         self.compileRunning = False
         ericApp().getObject("ViewManager").enableEditorsCheckFocusIn(True)
         ui = ericApp().getObject("UserInterface")
-        if (
-            exitStatus == QProcess.ExitStatus.NormalExit and
-            exitCode == 0 and
-            self.buf
-        ):
+        if exitStatus == QProcess.ExitStatus.NormalExit and exitCode == 0 and self.buf:
             ofn = os.path.join(self.project.ppath, self.compiledFile)
             try:
-                newline = (None if self.project.useSystemEol()
-                           else self.project.getEolString())
+                newline = (
+                    None if self.project.useSystemEol() else self.project.getEolString()
+                )
                 with open(ofn, "w", encoding="utf-8", newline=newline) as f:
                     for line in self.buf.splitlines():
                         f.write(line + "\n")
@@ -609,8 +635,8 @@
                 ui.showNotification(
                     UI.PixmapCache.getPixmap("resourcesCompiler48"),
                     self.tr("Resource Compilation"),
-                    self.tr("The compilation of the resource file"
-                            " was successful."))
+                    self.tr("The compilation of the resource file" " was successful."),
+                )
             except OSError as msg:
                 if not self.noDialog:
                     EricMessageBox.information(
@@ -618,21 +644,23 @@
                         self.tr("Resource Compilation"),
                         self.tr(
                             "<p>The compilation of the resource file"
-                            " failed.</p><p>Reason: {0}</p>").format(str(msg)))
+                            " failed.</p><p>Reason: {0}</p>"
+                        ).format(str(msg)),
+                    )
         else:
             ui.showNotification(
                 UI.PixmapCache.getPixmap("resourcesCompiler48"),
                 self.tr("Resource Compilation"),
-                self.tr(
-                    "The compilation of the resource file failed."),
+                self.tr("The compilation of the resource file failed."),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
         self.compileProc = None
-        
+
     def __compileQRC(self, fn, noDialog=False, progress=None):
         """
         Private method to compile a .qrc file to a .py file.
-        
+
         @param fn filename of the .ui file to be compiled
         @param noDialog flag indicating silent operations
         @param progress reference to the progress dialog
@@ -641,35 +669,34 @@
         self.compileProc = QProcess()
         args = []
         self.buf = ""
-        
+
         if self.project.getProjectLanguage() == "Python3":
             if self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
-                self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
+                self.rccCompiler = Utilities.generatePyQtToolPath("pyrcc5")
             elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
                 self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside2-rcc', variant=2)
+                    "pyside2-rcc", variant=2
+                )
             elif self.project.getProjectType() in ["PySide6", "PySide6C"]:
                 self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside6-rcc', variant=6)
+                    "pyside6-rcc", variant=6
+                )
             else:
                 return None
             defaultParameters = self.project.getDefaultRccCompilerParameters()
             rccParameters = self.project.pdata["RCCPARAMS"]
             if (
-                rccParameters["CompressionThreshold"] !=
-                    defaultParameters["CompressionThreshold"]
+                rccParameters["CompressionThreshold"]
+                != defaultParameters["CompressionThreshold"]
             ):
                 args.append("-threshold")
                 args.append(str(rccParameters["CompressionThreshold"]))
-            if (
-                rccParameters["CompressLevel"] !=
-                    defaultParameters["CompressLevel"]
-            ):
+            if rccParameters["CompressLevel"] != defaultParameters["CompressLevel"]:
                 args.append("-compress")
                 args.append(str(rccParameters["CompressLevel"]))
             if (
-                rccParameters["CompressionDisable"] !=
-                    defaultParameters["CompressionDisable"]
+                rccParameters["CompressionDisable"]
+                != defaultParameters["CompressionDisable"]
             ):
                 args.append("-no-compress")
             if rccParameters["PathPrefix"] != defaultParameters["PathPrefix"]:
@@ -677,25 +704,27 @@
                 args.append(rccParameters["PathPrefix"])
         else:
             return None
-        
+
         rcc = self.rccCompiler
-        
+
         ofn, ext = os.path.splitext(fn)
         fn = os.path.join(self.project.ppath, fn)
-        
+
         dirname, filename = os.path.split(ofn)
         if self.project.getProjectLanguage() == "Python3":
             self.compiledFile = os.path.join(
-                dirname, self.RCFilenameFormatPython.format(filename))
+                dirname, self.RCFilenameFormatPython.format(filename)
+            )
         elif self.project.getProjectLanguage() == "Ruby":
             self.compiledFile = os.path.join(
-                dirname, self.RCFilenameFormatRuby.format(filename))
-        
+                dirname, self.RCFilenameFormatRuby.format(filename)
+            )
+
         args.append(fn)
         self.compileProc.finished.connect(self.__compileQRCDone)
         self.compileProc.readyReadStandardOutput.connect(self.__readStdout)
         self.compileProc.readyReadStandardError.connect(self.__readStderr)
-        
+
         self.noDialog = noDialog
         self.compileProc.start(rcc, args)
         procStarted = self.compileProc.waitForStarted(5000)
@@ -709,13 +738,13 @@
                 progress.cancel()
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    'Could not start {0}.<br>'
-                    'Ensure that it is in the search path.'
-                ).format(self.rccCompiler))
+                    "Could not start {0}.<br>" "Ensure that it is in the search path."
+                ).format(self.rccCompiler),
+            )
             return None
-        
+
     def __compileResource(self):
         """
         Private method to compile a resource to a source file.
@@ -727,7 +756,7 @@
             self.hooks["compileResource"](fn)
         else:
             self.__compileQRC(fn)
-        
+
     def __compileAllResources(self):
         """
         Private method to compile all resources to source files.
@@ -738,12 +767,16 @@
             numResources = len(self.project.pdata["RESOURCES"])
             progress = EricProgressDialog(
                 self.tr("Compiling resources..."),
-                self.tr("Abort"), 0, numResources,
-                self.tr("%v/%m Resources"), self)
+                self.tr("Abort"),
+                0,
+                numResources,
+                self.tr("%v/%m Resources"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Resources"))
-            
+
             for prog, fn in enumerate(self.project.pdata["RESOURCES"]):
                 progress.setValue(prog)
                 if progress.wasCanceled():
@@ -756,32 +789,35 @@
                 else:
                     break
             progress.setValue(numResources)
-        
+
     def __compileSelectedResources(self):
         """
         Private method to compile selected resources to source files.
         """
         items = self.getSelectedItems()
-        files = [self.project.getRelativePath(itm.fileName())
-                 for itm in items]
-        
+        files = [self.project.getRelativePath(itm.fileName()) for itm in items]
+
         if self.hooks["compileSelectedResources"] is not None:
             self.hooks["compileSelectedResources"](files)
         else:
             numResources = len(files)
             progress = EricProgressDialog(
                 self.tr("Compiling resources..."),
-                self.tr("Abort"), 0, numResources,
-                self.tr("%v/%m Resources"), self)
+                self.tr("Abort"),
+                0,
+                numResources,
+                self.tr("%v/%m Resources"),
+                self,
+            )
             progress.setModal(True)
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Resources"))
-            
+
             for prog, fn in enumerate(files):
                 progress.setValue(prog)
                 if progress.wasCanceled():
                     break
-                if not fn.endswith('.ui.h'):
+                if not fn.endswith(".ui.h"):
                     proc = self.__compileQRC(fn, True, progress)
                     if proc is not None:
                         while proc.state() == QProcess.ProcessState.Running:
@@ -790,12 +826,12 @@
                     else:
                         break
             progress.setValue(numResources)
-        
+
     def __checkResourcesNewer(self, filename, mtime):
         """
         Private method to check, if any file referenced in a resource
         file is newer than a given time.
-        
+
         @param filename filename of the resource file (string)
         @param mtime modification time to check against
         @return flag indicating some file is newer (boolean)
@@ -805,15 +841,12 @@
                 buf = f.read()
         except OSError:
             return False
-        
+
         qrcDirName = os.path.dirname(filename)
         lbuf = ""
         for line in buf.splitlines():
             line = line.strip()
-            if (
-                line.lower().startswith("<file>") or
-                line.lower().startswith("<file ")
-            ):
+            if line.lower().startswith("<file>") or line.lower().startswith("<file "):
                 lbuf = line
             elif lbuf:
                 lbuf = "{0}{1}".format(lbuf, line)
@@ -821,34 +854,35 @@
                 rfile = lbuf.split(">", 1)[1].split("<", 1)[0]
                 if not os.path.isabs(rfile):
                     rfile = os.path.join(qrcDirName, rfile)
-                if (
-                    os.path.exists(rfile) and
-                    os.stat(rfile).st_mtime > mtime
-                ):
+                if os.path.exists(rfile) and os.stat(rfile).st_mtime > mtime:
                     return True
-                
+
                 lbuf = ""
-        
+
         return False
-        
+
     def compileChangedResources(self):
         """
         Public method to compile all changed resources to source files.
         """
         if self.hooks["compileChangedResources"] is not None:
-            self.hooks["compileChangedResources"](
-                self.project.pdata["RESOURCES"])
+            self.hooks["compileChangedResources"](self.project.pdata["RESOURCES"])
         else:
             if len(self.project.pdata["RESOURCES"]) == 0:
                 # The project does not contain resource files
                 return
-            
+
             progress = EricProgressDialog(
                 self.tr("Determining changed resources..."),
-                self.tr("Abort"), 0, 100, self.tr("%v/%m Resources"), self)
+                self.tr("Abort"),
+                0,
+                100,
+                self.tr("%v/%m Resources"),
+                self,
+            )
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Resources"))
-            
+
             # get list of changed resources
             changedResources = []
             progress.setMaximum(len(self.project.pdata["RESOURCES"]))
@@ -859,25 +893,26 @@
                 if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(
-                        dirname, self.RCFilenameFormatPython.format(filename))
+                        dirname, self.RCFilenameFormatPython.format(filename)
+                    )
                 elif self.project.getProjectLanguage() == "Ruby":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(
-                        dirname, self.RCFilenameFormatRuby.format(filename))
+                        dirname, self.RCFilenameFormatRuby.format(filename)
+                    )
                 else:
                     return
                 if (
-                    not os.path.exists(ofn) or
-                    os.stat(ifn).st_mtime > os.stat(ofn).st_mtime or
-                    self.__checkResourcesNewer(ifn, os.stat(ofn).st_mtime)
+                    not os.path.exists(ofn)
+                    or os.stat(ifn).st_mtime > os.stat(ofn).st_mtime
+                    or self.__checkResourcesNewer(ifn, os.stat(ofn).st_mtime)
                 ):
                     changedResources.append(fn)
             progress.setValue(len(self.project.pdata["RESOURCES"]))
             QApplication.processEvents()
-            
+
             if changedResources:
-                progress.setLabelText(
-                    self.tr("Compiling changed resources..."))
+                progress.setLabelText(self.tr("Compiling changed resources..."))
                 progress.setMaximum(len(changedResources))
                 progress.setValue(0)
                 QApplication.processEvents()
@@ -894,21 +929,21 @@
                         break
                 progress.setValue(len(changedResources))
                 QApplication.processEvents()
-        
+
     def handlePreferencesChanged(self):
         """
         Public slot used to handle the preferencesChanged signal.
         """
         ProjectBaseBrowser.handlePreferencesChanged(self)
-    
+
     def __configureRccCompiler(self):
         """
         Private slot to configure some non-common rcc compiler options.
         """
         from .RccCompilerOptionsDialog import RccCompilerOptionsDialog
-        
+
         params = self.project.pdata["RCCPARAMS"]
-        
+
         dlg = RccCompilerOptionsDialog(params)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             threshold, compression, noCompression, root = dlg.getData()
@@ -924,15 +959,15 @@
             if root != params["PathPrefix"]:
                 params["PathPrefix"] = root
                 self.project.setDirty(True)
-    
+
     ###########################################################################
     ## Support for hooks below
     ###########################################################################
-    
+
     def _initHookMethods(self):
         """
         Protected method to initialize the hooks dictionary.
-        
+
         Supported hook methods are:
         <ul>
         <li>compileResource: takes filename as parameter</li>
@@ -943,7 +978,7 @@
         <li>newResource: takes full directory path of new file as
             parameter</li>
         </ul>
-        
+
         <b>Note</b>: Filenames are relative to the project directory, if not
         specified differently.
         """
--- a/src/eric7/Project/ProjectSourcesBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectSourcesBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,13 +17,18 @@
 from EricWidgets.EricApplication import ericApp
 
 from UI.BrowserModel import (
-    BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-    BrowserClassAttributeItem, BrowserImportItem
+    BrowserFileItem,
+    BrowserClassItem,
+    BrowserMethodItem,
+    BrowserClassAttributeItem,
+    BrowserImportItem,
 )
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserSourceType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserSourceType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
@@ -36,37 +41,41 @@
 class ProjectSourcesBrowser(ProjectBaseBrowser):
     """
     A class used to display the Sources part of the project.
-    
+
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     showMenu = pyqtSignal(str, QMenu)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
-        ProjectBaseBrowser.__init__(self, project, ProjectBrowserSourceType,
-                                    parent)
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Sources'))
+        ProjectBaseBrowser.__init__(self, project, ProjectBrowserSourceType, parent)
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Sources"))
 
-        self.setWhatsThis(self.tr(
-            """<b>Project Sources Browser</b>"""
-            """<p>This allows to easily see all sources contained in the"""
-            """ current project. Several actions can be executed via the"""
-            """ context menu.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Sources Browser</b>"""
+                """<p>This allows to easily see all sources contained in the"""
+                """ current project. Several actions can be executed via the"""
+                """ context menu.</p>"""
+            )
+        )
+
         project.prepareRepopulateItem.connect(self._prepareRepopulateItem)
         project.completeRepopulateItem.connect(self._completeRepopulateItem)
-        
+
         self.codemetrics = None
         self.codecoverage = None
         self.profiledata = None
@@ -75,7 +84,7 @@
         self.packageDiagram = None
         self.applicationDiagram = None
         self.loadedDiagram = None
-        
+
     def __closeAllWindows(self):
         """
         Private method to close all project related windows.
@@ -88,21 +97,21 @@
         self.packageDiagram and self.packageDiagram.close()
         self.applicationDiagram and self.applicationDiagram.close()
         self.loadedDiagram and self.loadedDiagram.close()
-        
+
     def _projectClosed(self):
         """
         Protected slot to handle the projectClosed signal.
         """
         self.__closeAllWindows()
         ProjectBaseBrowser._projectClosed(self)
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
         """
         ProjectBaseBrowser._createPopupMenus(self)
         self.sourceMenuActions = {}
-        
+
         if self.project.isPythonProject():
             self.__createPythonPopupMenus()
         elif self.project.isRubyProject():
@@ -112,91 +121,100 @@
         else:
             # assign generic source menu
             self.mainMenu = self.sourceMenu
-        
+
     def __createPythonPopupMenus(self):
         """
         Private method to generate the popup menus for a Python project.
         """
-        self.checksMenu = QMenu(self.tr('Check'))
+        self.checksMenu = QMenu(self.tr("Check"))
         self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck)
-        
+
         self.formattingMenu = QMenu(self.tr("Code Formatting"))
         self.formattingMenu.addAction(
             self.tr("Format Code"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Format)
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Format),
         )
         self.formattingMenu.addAction(
             self.tr("Check Formatting"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Check)
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Check),
         )
         self.formattingMenu.addAction(
             self.tr("Formatting Diff"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff)
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff),
         )
         self.formattingMenu.aboutToShow.connect(self.__showContextMenuFormatting)
-        
-        self.menuShow = QMenu(self.tr('Show'))
-        self.menuShow.addAction(
-            self.tr('Code metrics...'), self.__showCodeMetrics)
+
+        self.menuShow = QMenu(self.tr("Show"))
+        self.menuShow.addAction(self.tr("Code metrics..."), self.__showCodeMetrics)
         self.coverageMenuAction = self.menuShow.addAction(
-            self.tr('Code coverage...'), self.__showCodeCoverage)
+            self.tr("Code coverage..."), self.__showCodeCoverage
+        )
         self.profileMenuAction = self.menuShow.addAction(
-            self.tr('Profile data...'), self.__showProfileData)
+            self.tr("Profile data..."), self.__showProfileData
+        )
         self.menuShow.aboutToShow.connect(self.__showContextMenuShow)
-        
-        self.graphicsMenu = QMenu(self.tr('Diagrams'))
+
+        self.graphicsMenu = QMenu(self.tr("Diagrams"))
         self.classDiagramAction = self.graphicsMenu.addAction(
-            self.tr("Class Diagram..."), self.__showClassDiagram)
+            self.tr("Class Diagram..."), self.__showClassDiagram
+        )
         self.graphicsMenu.addAction(
-            self.tr("Package Diagram..."), self.__showPackageDiagram)
+            self.tr("Package Diagram..."), self.__showPackageDiagram
+        )
         self.importsDiagramAction = self.graphicsMenu.addAction(
-            self.tr("Imports Diagram..."), self.__showImportsDiagram)
+            self.tr("Imports Diagram..."), self.__showImportsDiagram
+        )
         self.graphicsMenu.addAction(
-            self.tr("Application Diagram..."),
-            self.__showApplicationDiagram)
+            self.tr("Application Diagram..."), self.__showApplicationDiagram
+        )
         self.graphicsMenu.addSeparator()
         self.graphicsMenu.addAction(
             UI.PixmapCache.getIcon("open"),
-            self.tr("Load Diagram..."), self.__loadDiagram)
+            self.tr("Load Diagram..."),
+            self.__loadDiagram,
+        )
         self.graphicsMenu.aboutToShow.connect(self.__showContextMenuGraphics)
-        
+
         self.__startMenu = QMenu(self.tr("Start"), self)
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("runScript"),
-            self.tr('Run Script...'),
-            self.__contextMenuRunScript)
+            self.tr("Run Script..."),
+            self.__contextMenuRunScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("debugScript"),
-            self.tr('Debug Script...'),
-            self.__contextMenuDebugScript)
+            self.tr("Debug Script..."),
+            self.__contextMenuDebugScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("profileScript"),
-            self.tr('Profile Script...'),
-            self.__contextMenuProfileScript)
+            self.tr("Profile Script..."),
+            self.__contextMenuProfileScript,
+        )
         self.__startMenu.addAction(
             UI.PixmapCache.getIcon("coverageScript"),
-            self.tr('Coverage run of Script...'),
-            self.__contextMenuCoverageScript)
-        
+            self.tr("Coverage run of Script..."),
+            self.__contextMenuCoverageScript,
+        )
+
         self.testingAction = self.sourceMenu.addAction(
-            self.tr('Run tests...'), self.handleTesting)
+            self.tr("Run tests..."), self.handleTesting
+        )
         self.sourceMenu.addSeparator()
-        act = self.sourceMenu.addAction(
-            self.tr('Rename file'), self._renameFile)
+        act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
         act = self.sourceMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+            self.tr("Remove from project"), self._removeFile
+        )
         self.menuActions.append(act)
-        act = self.sourceMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(
-            self.tr('New package...'), self.__addNewPackage)
+        self.sourceMenu.addAction(self.tr("New package..."), self.__addNewPackage)
+        self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.sourceMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.sourceMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addMenu(self.graphicsMenu)
         self.sourceMenu.addMenu(self.checksMenu)
@@ -206,444 +224,461 @@
         self.__startAct = self.sourceMenu.addMenu(self.__startMenu)
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Copy Path to Clipboard"), self._copyToClipboard
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.sourceMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
+        self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('New package...'), self.__addNewPackage)
+        self.menu.addAction(self.tr("New package..."), self.__addNewPackage)
+        self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.menu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.menu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         # create the attribute menu
         self.gotoMenu = QMenu(self.tr("Goto"), self)
         self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
         self.gotoMenu.triggered.connect(self._gotoAttribute)
-        
+
         self.attributeMenu = QMenu(self)
         self.attributeMenu.addMenu(self.gotoMenu)
         self.attributeMenu.addSeparator()
-        self.attributeMenu.addAction(
-            self.tr('New package...'), self.__addNewPackage)
-        self.attributeMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
+        self.attributeMenu.addAction(self.tr("New package..."), self.__addNewPackage)
         self.attributeMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
-        self.attributeMenu.addSeparator()
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.attributeMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.attributeMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
         self.attributeMenu.addSeparator()
         self.attributeMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
+        self.attributeMenu.addAction(
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.attributeMenu.addSeparator()
+        self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.backMenu = QMenu(self)
+        self.backMenu.addAction(self.tr("New package..."), self.__addNewPackage)
         self.backMenu.addAction(
-            self.tr('New package...'), self.__addNewPackage)
-        self.backMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
-        self.backMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
-        self.backMenu.addSeparator()
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
+        self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
-        
+
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
         self.multiMenu.addMenu(self.checksMenu)
         self.multiMenu.addMenu(self.formattingMenu)
         self.multiMenu.addSeparator()
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMenu = QMenu(self)
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeDir)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
         self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('New package...'), self.__addNewPackage)
+        self.dirMenu.addAction(self.tr("New package..."), self.__addNewPackage)
+        self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.dirMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.dirMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.dirMenu.addSeparator()
         act = self.dirMenu.addMenu(self.graphicsMenu)
         self.dirMenu.addMenu(self.checksMenu)
         self.dirMenu.addMenu(self.formattingMenu)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = QMenu(self)
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMultiMenu.addSeparator()
-        self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.sourceMenu
-        
+
     def __createRubyPopupMenus(self):
         """
         Private method to generate the popup menus for a Ruby project.
         """
-        self.graphicsMenu = QMenu(self.tr('Diagrams'))
+        self.graphicsMenu = QMenu(self.tr("Diagrams"))
         self.classDiagramAction = self.graphicsMenu.addAction(
-            self.tr("Class Diagram..."), self.__showClassDiagram)
+            self.tr("Class Diagram..."), self.__showClassDiagram
+        )
         self.graphicsMenu.addAction(
-            self.tr("Package Diagram..."), self.__showPackageDiagram)
+            self.tr("Package Diagram..."), self.__showPackageDiagram
+        )
         self.graphicsMenu.addAction(
-            self.tr("Application Diagram..."),
-            self.__showApplicationDiagram)
+            self.tr("Application Diagram..."), self.__showApplicationDiagram
+        )
         self.graphicsMenu.addSeparator()
         self.graphicsMenu.addAction(
             UI.PixmapCache.getIcon("fileOpen"),
-            self.tr("Load Diagram..."), self.__loadDiagram)
-        
+            self.tr("Load Diagram..."),
+            self.__loadDiagram,
+        )
+
         self.sourceMenu.addSeparator()
-        act = self.sourceMenu.addAction(
-            self.tr('Rename file'), self._renameFile)
+        act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
         act = self.sourceMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+            self.tr("Remove from project"), self._removeFile
+        )
         self.menuActions.append(act)
-        act = self.sourceMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.sourceMenu.addSeparator()
+        self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.sourceMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.sourceMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.sourceMenu.addSeparator()
         act = self.sourceMenu.addMenu(self.graphicsMenu)
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.sourceMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
+        self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.menu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
-        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         # create the attribute menu
         self.gotoMenu = QMenu(self.tr("Goto"), self)
         self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
         self.gotoMenu.triggered.connect(self._gotoAttribute)
-        
+
         self.attributeMenu = QMenu(self)
         self.attributeMenu.addMenu(self.gotoMenu)
         self.attributeMenu.addSeparator()
         self.attributeMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.attributeMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
-        self.attributeMenu.addSeparator()
-        self.attributeMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.attributeMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
         self.attributeMenu.addSeparator()
         self.attributeMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
+        self.attributeMenu.addAction(
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.attributeMenu.addSeparator()
+        self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.backMenu = QMenu(self)
         self.backMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.backMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
         self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.backMenu.setEnabled(False)
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMenu = QMenu(self)
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeDir)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.dirMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.dirMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.dirMenu.addSeparator()
         act = self.dirMenu.addMenu(self.graphicsMenu)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = QMenu(self)
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMultiMenu.addSeparator()
-        self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.sourceMenu
-        
+
     def __createJavaScriptPopupMenus(self):
         """
         Private method to generate the popup menus for a Python project.
         """
-        self.checksMenu = QMenu(self.tr('Check'))
+        self.checksMenu = QMenu(self.tr("Check"))
         self.checksMenu.aboutToShow.connect(self.__showContextMenuCheck)
-        
+
         self.sourceMenu.addSeparator()
-        act = self.sourceMenu.addAction(
-            self.tr('Rename file'), self._renameFile)
+        act = self.sourceMenu.addAction(self.tr("Rename file"), self._renameFile)
         self.menuActions.append(act)
         act = self.sourceMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+            self.tr("Remove from project"), self._removeFile
+        )
         self.menuActions.append(act)
-        act = self.sourceMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.sourceMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.menuActions.append(act)
         self.sourceMenu.addSeparator()
+        self.sourceMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.sourceMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.sourceMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addMenu(self.checksMenu)
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Copy Path to Clipboard"), self._copyToClipboard
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.sourceMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.sourceMenu.addSeparator()
-        self.sourceMenu.addAction(self.tr('Configure...'), self._configure)
+        self.sourceMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.menu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
-        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.menu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.menu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
+        self.menu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.menu.addAction(self.tr("Collapse all directories"), self._collapseAllDirs)
+        self.menu.addSeparator()
+        self.menu.addAction(self.tr("Configure..."), self._configure)
 
         # create the attribute menu
         self.gotoMenu = QMenu(self.tr("Goto"), self)
         self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
         self.gotoMenu.triggered.connect(self._gotoAttribute)
-        
+
         self.attributeMenu = QMenu(self)
         self.attributeMenu.addMenu(self.gotoMenu)
         self.attributeMenu.addSeparator()
         self.attributeMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.attributeMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
         self.attributeMenu.addSeparator()
         self.attributeMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.attributeMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.attributeMenu.addSeparator()
-        self.attributeMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.attributeMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.backMenu = QMenu(self)
         self.backMenu.addAction(
-            self.tr('Add source files...'), self.project.addSourceFiles)
+            self.tr("Add source files..."), self.project.addSourceFiles
+        )
         self.backMenu.addAction(
-            self.tr('Add source directory...'), self.project.addSourceDir)
-        self.backMenu.addSeparator()
-        self.backMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.backMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Add source directory..."), self.project.addSourceDir
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
+        self.backMenu.addAction(
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
+        self.backMenu.addSeparator()
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
-        
+
         self.multiMenu.addSeparator()
-        act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self._removeFile)
+        act = self.multiMenu.addAction(self.tr("Remove from project"), self._removeFile)
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
         self.multiMenu.addMenu(self.checksMenu)
         self.multiMenu.addSeparator()
+        self.multiMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.multiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.multiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMenu = QMenu(self)
-        act = self.dirMenu.addAction(
-            self.tr('Remove from project'), self._removeDir)
+        act = self.dirMenu.addAction(self.tr("Remove from project"), self._removeDir)
         self.dirMenuActions.append(act)
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Add source files..."), self.__addSourceFiles)
         self.dirMenu.addAction(
-            self.tr('Add source files...'), self.__addSourceFiles)
-        self.dirMenu.addAction(
-            self.tr('Add source directory...'), self.__addSourceDirectory)
+            self.tr("Add source directory..."), self.__addSourceDirectory
+        )
         self.dirMenu.addSeparator()
         self.dirMenu.addMenu(self.checksMenu)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Expand all directories"), self._expandAllDirs)
         self.dirMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
-        self.dirMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = QMenu(self)
         self.dirMultiMenu.addAction(
-            self.tr('Expand all directories'), self._expandAllDirs)
+            self.tr("Expand all directories"), self._expandAllDirs
+        )
         self.dirMultiMenu.addAction(
-            self.tr('Collapse all directories'), self._collapseAllDirs)
+            self.tr("Collapse all directories"), self._collapseAllDirs
+        )
         self.dirMultiMenu.addSeparator()
-        self.dirMultiMenu.addAction(
-            self.tr('Configure...'), self._configure)
-        
+        self.dirMultiMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.sourceMenu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.dirMultiMenu.aboutToShow.connect(self.__showContextMenuDirMulti)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.sourceMenu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, BrowserClassItem,
-                 BrowserMethodItem, ProjectBrowserSimpleDirectoryItem,
-                 BrowserClassAttributeItem, BrowserImportItem])
+                [
+                    ProjectBrowserFileItem,
+                    BrowserClassItem,
+                    BrowserMethodItem,
+                    ProjectBrowserSimpleDirectoryItem,
+                    BrowserClassAttributeItem,
+                    BrowserImportItem,
+                ]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem, BrowserClassItem,
-                         BrowserMethodItem, ProjectBrowserSimpleDirectoryItem,
-                         BrowserClassAttributeItem, BrowserImportItem])
+                        [
+                            ProjectBrowserFileItem,
+                            BrowserClassItem,
+                            BrowserMethodItem,
+                            ProjectBrowserSimpleDirectoryItem,
+                            BrowserClassAttributeItem,
+                            BrowserImportItem,
+                        ]
+                    )
                     cnt = categories["sum"]
-            
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             cmcnt = (
-                categories[str(BrowserClassItem)] +
-                categories[str(BrowserMethodItem)] +
-                categories[str(BrowserClassAttributeItem)] +
-                categories[str(BrowserImportItem)]
+                categories[str(BrowserClassItem)]
+                + categories[str(BrowserMethodItem)]
+                + categories[str(BrowserClassAttributeItem)]
+                + categories[str(BrowserImportItem)]
             )
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -658,32 +693,28 @@
                         if isinstance(itm, ProjectBrowserFileItem):
                             fn = itm.fileName()
                             if self.project.isPythonProject():
-                                if fn.endswith('.ptl'):
+                                if fn.endswith(".ptl"):
                                     for act in self.sourceMenuActions.values():
                                         act.setEnabled(False)
                                     self.classDiagramAction.setEnabled(True)
                                     self.importsDiagramAction.setEnabled(True)
                                     self.testingAction.setEnabled(False)
-                                    self.checksMenu.menuAction().setEnabled(
-                                        False)
-                                elif fn.endswith('.rb'):
+                                    self.checksMenu.menuAction().setEnabled(False)
+                                elif fn.endswith(".rb"):
                                     # entry for mixed mode programs
                                     for act in self.sourceMenuActions.values():
                                         act.setEnabled(False)
                                     self.classDiagramAction.setEnabled(True)
                                     self.importsDiagramAction.setEnabled(False)
                                     self.testingAction.setEnabled(False)
-                                    self.checksMenu.menuAction().setEnabled(
-                                        False)
-                                elif fn.endswith('.js'):
+                                    self.checksMenu.menuAction().setEnabled(False)
+                                elif fn.endswith(".js"):
                                     # entry for mixed mode programs
                                     for act in self.sourceMenuActions.values():
                                         act.setEnabled(False)
                                     self.testingAction.setEnabled(False)
-                                    self.checksMenu.menuAction().setEnabled(
-                                        False)
-                                    self.graphicsMenu.menuAction().setEnabled(
-                                        False)
+                                    self.checksMenu.menuAction().setEnabled(False)
+                                    self.graphicsMenu.menuAction().setEnabled(False)
                                 else:
                                     # assume the source file is a Python file
                                     for act in self.sourceMenuActions.values():
@@ -691,13 +722,11 @@
                                     self.classDiagramAction.setEnabled(True)
                                     self.importsDiagramAction.setEnabled(True)
                                     self.testingAction.setEnabled(True)
-                                    self.checksMenu.menuAction().setEnabled(
-                                        True)
+                                    self.checksMenu.menuAction().setEnabled(True)
                             self.sourceMenu.popup(self.mapToGlobal(coord))
                         elif isinstance(
                             itm,
-                            (BrowserClassItem, BrowserMethodItem,
-                             BrowserImportItem)
+                            (BrowserClassItem, BrowserMethodItem, BrowserImportItem),
                         ):
                             self.menu.popup(self.mapToGlobal(coord))
                         elif isinstance(itm, BrowserClassAttributeItem):
@@ -711,13 +740,13 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the sourceMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenu(self, self.sourceMenu)
-        
+
         itm = self.model().item(self.currentIndex())
         if itm:
             try:
@@ -726,134 +755,129 @@
                 self.__startAct.setEnabled(False)
         else:
             self.__startAct.setEnabled(False)
-        
+
         self.showMenu.emit("Main", self.sourceMenu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuDirMulti(self):
         """
         Private slot called by the dirMultiMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuDirMulti(self, self.dirMultiMenu)
-        
+
         self.showMenu.emit("MainDirMulti", self.dirMultiMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         ProjectBaseBrowser._showContextMenuBack(self, self.backMenu)
-        
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def __showContextMenuShow(self):
         """
         Private slot called before the show menu is shown.
         """
         prEnable = False
         coEnable = False
-        
+
         # first check if the file belongs to a project and there is
         # a project coverage file
         fn = self.project.getMainScript(True)
         if fn is not None:
-            prEnable = (
-                self.project.isPy3Project() and
-                bool(Utilities.getProfileFileNames(fn))
+            prEnable = self.project.isPy3Project() and bool(
+                Utilities.getProfileFileNames(fn)
             )
-            coEnable = (
-                self.project.isPy3Project() and
-                bool(Utilities.getCoverageFileNames(fn))
+            coEnable = self.project.isPy3Project() and bool(
+                Utilities.getCoverageFileNames(fn)
             )
-        
+
         # now check the selected item
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
         if fn is not None:
-            prEnable |= (
-                itm.isPython3File() and
-                bool(Utilities.getProfileFileNames(fn))
-            )
-            coEnable |= (
-                itm.isPython3File() and
-                bool(Utilities.getCoverageFileName(fn))
-            )
-        
+            prEnable |= itm.isPython3File() and bool(Utilities.getProfileFileNames(fn))
+            coEnable |= itm.isPython3File() and bool(Utilities.getCoverageFileName(fn))
+
         self.profileMenuAction.setEnabled(prEnable)
         self.coverageMenuAction.setEnabled(coEnable)
-        
+
         self.showMenu.emit("Show", self.menuShow)
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         itmList = self.getSelectedItems(
-            [BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-             BrowserClassAttributeItem, BrowserImportItem])
-        
+            [
+                BrowserFileItem,
+                BrowserClassItem,
+                BrowserMethodItem,
+                BrowserClassAttributeItem,
+                BrowserImportItem,
+            ]
+        )
+
         for itm in itmList:
             if isinstance(itm, BrowserFileItem):
                 if itm.isPython3File():
                     self.sourceFile[str].emit(itm.fileName())
                 elif itm.isRubyFile():
-                    self.sourceFile[str, int, str].emit(
-                        itm.fileName(), -1, "Ruby")
+                    self.sourceFile[str, int, str].emit(itm.fileName(), -1, "Ruby")
                 elif itm.isDFile():
-                    self.sourceFile[str, int, str].emit(
-                        itm.fileName(), -1, "D")
+                    self.sourceFile[str, int, str].emit(itm.fileName(), -1, "D")
                 else:
                     self.sourceFile[str].emit(itm.fileName())
             elif isinstance(itm, BrowserClassItem):
-                self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.classObject().lineno)
+                self.sourceFile[str, int].emit(itm.fileName(), itm.classObject().lineno)
             elif isinstance(itm, BrowserMethodItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.functionObject().lineno)
+                    itm.fileName(), itm.functionObject().lineno
+                )
             elif isinstance(itm, BrowserClassAttributeItem):
                 self.sourceFile[str, int].emit(
-                    itm.fileName(), itm.attributeObject().lineno)
+                    itm.fileName(), itm.attributeObject().lineno
+                )
             elif isinstance(itm, BrowserImportItem):
-                self.sourceFile[str, list].emit(
-                    itm.fileName(), itm.linenos())
-        
+                self.sourceFile[str, list].emit(itm.fileName(), itm.linenos())
+
     def __addNewPackage(self):
         """
         Private method to add a new package to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = ""
-        
+
         dn = self.project.getRelativePath(dn)
         if dn.startswith(os.sep):
             dn = dn[1:]
         from .NewPythonPackageDialog import NewPythonPackageDialog
+
         dlg = NewPythonPackageDialog(dn, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             packageName = dlg.getData()
@@ -872,8 +896,9 @@
                             self.tr(
                                 """<p>The package directory <b>{0}</b> could"""
                                 """ not be created. Aborting...</p>"""
-                                """<p>Reason: {1}</p>""")
-                            .format(packagePath, str(err)))
+                                """<p>Reason: {1}</p>"""
+                            ).format(packagePath, str(err)),
+                        )
                         return
                 packageFile = os.path.join(packagePath, "__init__.py")
                 if not os.path.exists(packageFile):
@@ -887,57 +912,54 @@
                             self.tr(
                                 """<p>The package file <b>{0}</b> could"""
                                 """ not be created. Aborting...</p>"""
-                                """<p>Reason: {1}</p>""")
-                            .format(packageFile, str(err)))
+                                """<p>Reason: {1}</p>"""
+                            ).format(packageFile, str(err)),
+                        )
                         return
                 self.project.appendFile(packageFile)
             if packageFile:
                 self.sourceFile[str].emit(packageFile)
-        
+
     def __addSourceFiles(self):
         """
         Private method to add a source file to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('source', dn)
-        
+        self.project.addFiles("source", dn)
+
     def __addSourceDirectory(self):
         """
         Private method to add source files of a directory to the project.
         """
         itm = self.model().item(self.currentIndex())
         if isinstance(
-            itm,
-            (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
+            itm, (ProjectBrowserFileItem, BrowserClassItem, BrowserMethodItem)
         ):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addDirectory('source', dn)
-        
+        self.project.addDirectory("source", dn)
+
     def __deleteFile(self):
         """
         Private method to delete files from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         files = []
         fullNames = []
         for itm in itmList:
@@ -945,48 +967,48 @@
             fullNames.append(fn2)
             fn = self.project.getRelativePath(fn2)
             files.append(fn)
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete files"),
-            self.tr(
-                "Do you really want to delete these files from the project?"),
-            files)
-        
+            self.tr("Do you really want to delete these files from the project?"),
+            files,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn2, fn in zip(fullNames, files):
                 self.closeSourceWindow.emit(fn2)
                 self.project.deleteFile(fn)
-    
+
     ###########################################################################
     ## Methods for the Checks submenu
     ###########################################################################
-    
+
     def __showContextMenuCheck(self):
         """
         Private slot called before the checks menu is shown.
         """
         self.showMenu.emit("Checks", self.checksMenu)
-    
+
     ###########################################################################
     ## Methods for the Show submenu
     ###########################################################################
-    
+
     def __showCodeMetrics(self):
         """
         Private method to handle the code metrics context menu action.
         """
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
-        
+
         from DataViews.CodeMetricsDialog import CodeMetricsDialog
+
         self.codemetrics = CodeMetricsDialog()
         self.codemetrics.show()
         self.codemetrics.start(fn)
-    
+
     def __showCodeCoverage(self):
         """
         Private method to handle the code coverage context menu action.
@@ -994,15 +1016,15 @@
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
         pfn = self.project.getMainScript(True)
-        
+
         files = set()
-        
+
         if pfn is not None:
             files |= set(Utilities.getCoverageFileNames(pfn))
-        
+
         if fn is not None:
             files |= set(Utilities.getCoverageFileNames(fn))
-        
+
         if list(files):
             if len(files) > 1:
                 cfn, ok = QInputDialog.getItem(
@@ -1010,19 +1032,22 @@
                     self.tr("Code Coverage"),
                     self.tr("Please select a coverage file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 cfn = files[0]
         else:
             return
-        
+
         from DataViews.PyCoverageDialog import PyCoverageDialog
+
         self.codecoverage = PyCoverageDialog()
         self.codecoverage.show()
         self.codecoverage.start(cfn, fn)
-    
+
     def __showProfileData(self):
         """
         Private method to handle the show profile data context menu action.
@@ -1030,15 +1055,15 @@
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
         pfn = self.project.getMainScript(True)
-        
+
         files = set()
-        
+
         if pfn is not None:
             files |= set(Utilities.getProfileFileNames(pfn))
-        
+
         if fn is not None:
             files |= set(Utilities.getProfileFileNames(fn))
-        
+
         if list(files):
             if len(files) > 1:
                 pfn, ok = QInputDialog.getItem(
@@ -1046,29 +1071,32 @@
                     self.tr("Profile Data"),
                     self.tr("Please select a profile file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 pfn = files[0]
         else:
             return
-            
+
         from DataViews.PyProfileDialog import PyProfileDialog
+
         self.profiledata = PyProfileDialog()
         self.profiledata.show()
         self.profiledata.start(pfn, fn)
-    
+
     ###########################################################################
     ## Methods for the Graphics submenu
     ###########################################################################
-    
+
     def __showContextMenuGraphics(self):
         """
         Private slot called before the checks menu is shown.
         """
         self.showMenu.emit("Graphics", self.graphicsMenu)
-    
+
     def __showClassDiagram(self):
         """
         Private method to handle the class diagram context menu action.
@@ -1082,14 +1110,16 @@
             self,
             self.tr("Class Diagram"),
             self.tr("""Include class attributes?"""),
-            yesDefault=True)
-        
+            yesDefault=True,
+        )
+
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.classDiagram = UMLDialog(
-            UMLDialogType.CLASS_DIAGRAM, self.project, fn,
-            self, noAttrs=not res)
+            UMLDialogType.CLASS_DIAGRAM, self.project, fn, self, noAttrs=not res
+        )
         self.classDiagram.show()
-        
+
     def __showImportsDiagram(self):
         """
         Private method to handle the imports diagram context menu action.
@@ -1103,14 +1133,20 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Imports Diagram"),
-            self.tr("""Include imports from external modules?"""))
-        
+            self.tr("""Include imports from external modules?"""),
+        )
+
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.importsDiagram = UMLDialog(
-            UMLDialogType.IMPORTS_DIAGRAM, self.project, package,
-            self, showExternalImports=res)
+            UMLDialogType.IMPORTS_DIAGRAM,
+            self.project,
+            package,
+            self,
+            showExternalImports=res,
+        )
         self.importsDiagram.show()
-        
+
     def __showPackageDiagram(self):
         """
         Private method to handle the package diagram context menu action.
@@ -1125,14 +1161,16 @@
             self,
             self.tr("Package Diagram"),
             self.tr("""Include class attributes?"""),
-            yesDefault=True)
-        
+            yesDefault=True,
+        )
+
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.packageDiagram = UMLDialog(
-            UMLDialogType.PACKAGE_DIAGRAM, self.project, package,
-            self, noAttrs=not res)
+            UMLDialogType.PACKAGE_DIAGRAM, self.project, package, self, noAttrs=not res
+        )
         self.packageDiagram.show()
-        
+
     def __showApplicationDiagram(self):
         """
         Private method to handle the application diagram context menu action.
@@ -1141,72 +1179,74 @@
             self,
             self.tr("Application Diagram"),
             self.tr("""Include module names?"""),
-            yesDefault=True)
-        
+            yesDefault=True,
+        )
+
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.applicationDiagram = UMLDialog(
-            UMLDialogType.APPLICATION_DIAGRAM, self.project,
-            self, noModules=not res)
+            UMLDialogType.APPLICATION_DIAGRAM, self.project, self, noModules=not res
+        )
         self.applicationDiagram.show()
-    
+
     def __loadDiagram(self):
         """
         Private slot to load a diagram from file.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.loadedDiagram = None
-        loadedDiagram = UMLDialog(
-            UMLDialogType.NO_DIAGRAM, self.project, parent=self)
+        loadedDiagram = UMLDialog(UMLDialogType.NO_DIAGRAM, self.project, parent=self)
         if loadedDiagram.load():
             self.loadedDiagram = loadedDiagram
             self.loadedDiagram.show(fromFile=True)
-    
+
     ###########################################################################
     ## Methods for the Start submenu
     ###########################################################################
-    
+
     def __contextMenuRunScript(self):
         """
         Private method to run the editor script.
         """
         fn = self.model().item(self.currentIndex()).fileName()
         ericApp().getObject("DebugUI").doRun(False, script=fn)
-        
+
     def __contextMenuDebugScript(self):
         """
         Private method to debug the editor script.
         """
         fn = self.model().item(self.currentIndex()).fileName()
         ericApp().getObject("DebugUI").doDebug(False, script=fn)
-        
+
     def __contextMenuProfileScript(self):
         """
         Private method to profile the editor script.
         """
         fn = self.model().item(self.currentIndex()).fileName()
         ericApp().getObject("DebugUI").doProfile(False, script=fn)
-        
+
     def __contextMenuCoverageScript(self):
         """
         Private method to run a coverage test of the editor script.
         """
         fn = self.model().item(self.currentIndex()).fileName()
         ericApp().getObject("DebugUI").doCoverage(False, script=fn)
-    
+
     ###########################################################################
     ## Methods for the Code Formatting submenu
     ###########################################################################
-    
+
     def __showContextMenuFormatting(self):
         """
         Private slot called before the Code Formatting menu is shown.
         """
         self.showMenu.emit("Formatting", self.formattingMenu)
-    
+
     def __performFormatWithBlack(self, action):
         """
         Private method to format the selected project sources using the 'Black' tool.
-        
+
         Following actions are supported.
         <ul>
         <li>BlackFormattingAction.Format - the code reformatting is performed</li>
@@ -1215,18 +1255,23 @@
         <li>BlackFormattingAction.Diff - a unified diff of potential code formatting
             changes is generated</li>
         </ul>
-        
+
         @param action formatting operation to be performed
         @type BlackFormattingAction
         """
         from CodeFormatting.BlackConfigurationDialog import BlackConfigurationDialog
         from CodeFormatting.BlackFormattingDialog import BlackFormattingDialog
-        
+
         files = [
             itm.fileName()
             for itm in self.getSelectedItems(
-                [BrowserFileItem, BrowserClassItem, BrowserMethodItem,
-                 BrowserClassAttributeItem, BrowserImportItem]
+                [
+                    BrowserFileItem,
+                    BrowserClassItem,
+                    BrowserMethodItem,
+                    BrowserClassAttributeItem,
+                    BrowserImportItem,
+                ]
             )
             if itm.isPython3File()
         ]
@@ -1239,16 +1284,13 @@
                 for f in self.project.getProjectFiles("SOURCES", normalized=True)
                 if f.startswith(dirName)
             ]
-        
+
         if ericApp().getObject("ViewManager").checkAllDirty():
             dlg = BlackConfigurationDialog(withProject=True)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 config = dlg.getConfiguration()
-                
+
                 formattingDialog = BlackFormattingDialog(
-                    config,
-                    files,
-                    project=self.project,
-                    action=action
+                    config, files, project=self.project, action=action
                 )
                 formattingDialog.exec()
--- a/src/eric7/Project/ProjectTranslationsBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/ProjectTranslationsBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,8 +24,10 @@
 from EricWidgets.EricApplication import ericApp
 
 from .ProjectBrowserModel import (
-    ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem,
-    ProjectBrowserDirectoryItem, ProjectBrowserTranslationType
+    ProjectBrowserFileItem,
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserDirectoryItem,
+    ProjectBrowserTranslationType,
 )
 from .ProjectBaseBrowser import ProjectBaseBrowser
 
@@ -39,7 +41,7 @@
 class ProjectTranslationsBrowser(ProjectBaseBrowser):
     """
     A class used to display the translations part of the project.
-    
+
     @signal appendStdout(str) emitted after something was received from
         a QProcess on stdout
     @signal appendStderr(str) emitted after something was received from
@@ -47,39 +49,45 @@
     @signal showMenu(str, QMenu) emitted when a menu is about to be shown.
         The name of the menu and a reference to the menu are given.
     """
+
     appendStdout = pyqtSignal(str)
     appendStderr = pyqtSignal(str)
     showMenu = pyqtSignal(str, QMenu)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this browser (QWidget)
         """
-        ProjectBaseBrowser.__init__(self, project,
-                                    ProjectBrowserTranslationType, parent)
+        ProjectBaseBrowser.__init__(
+            self, project, ProjectBrowserTranslationType, parent
+        )
         self.isTranslationsBrowser = True
-        
-        self.selectedItemsFilter = [ProjectBrowserFileItem,
-                                    ProjectBrowserSimpleDirectoryItem]
-        
-        self.setWindowTitle(self.tr('Translations'))
+
+        self.selectedItemsFilter = [
+            ProjectBrowserFileItem,
+            ProjectBrowserSimpleDirectoryItem,
+        ]
+
+        self.setWindowTitle(self.tr("Translations"))
 
-        self.setWhatsThis(self.tr(
-            """<b>Project Translations Browser</b>"""
-            """<p>This allows to easily see all translations contained in"""
-            """ the current project. Several actions can be executed via"""
-            """ the context menu.</p>"""
-        ))
-        
+        self.setWhatsThis(
+            self.tr(
+                """<b>Project Translations Browser</b>"""
+                """<p>This allows to easily see all translations contained in"""
+                """ the current project. Several actions can be executed via"""
+                """ the context menu.</p>"""
+            )
+        )
+
         self.__lreleaseProcesses = []
         self.__pylupdateProcesses = []
         self.lreleaseProcRunning = False
         self.pylupdateProcRunning = False
         self.__tmpProjects = []
-        
+
     def _createPopupMenus(self):
         """
         Protected overloaded method to generate the popup menu.
@@ -88,396 +96,459 @@
         self.multiMenuActions = []
         self.dirMenuActions = []
         self.dirMultiMenuActions = []
-        
+
         self.tsMenuActions = []
         self.qmMenuActions = []
         self.tsprocMenuActions = []
         self.qmprocMenuActions = []
-        
+
         self.tsMultiMenuActions = []
         self.qmMultiMenuActions = []
         self.tsprocMultiMenuActions = []
         self.qmprocMultiMenuActions = []
-        
+
         self.tsprocDirMenuActions = []
         self.qmprocDirMenuActions = []
-        
+
         self.tsprocBackMenuActions = []
         self.qmprocBackMenuActions = []
-        
+
         self.menu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             act = self.menu.addAction(
-                self.tr('Generate translation'), self.__generateSelected)
+                self.tr("Generate translation"), self.__generateSelected
+            )
             self.tsMenuActions.append(act)
             self.tsprocMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Generate translation (with obsolete)'),
-                self.__generateObsoleteSelected)
+                self.tr("Generate translation (with obsolete)"),
+                self.__generateObsoleteSelected,
+            )
             self.tsMenuActions.append(act)
             self.tsprocMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Generate all translations'), self.__generateAll)
+                self.tr("Generate all translations"), self.__generateAll
+            )
             self.tsprocMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Generate all translations (with obsolete)'),
-                self.__generateObsoleteAll)
+                self.tr("Generate all translations (with obsolete)"),
+                self.__generateObsoleteAll,
+            )
             self.tsprocMenuActions.append(act)
             self.menu.addSeparator()
-            act = self.menu.addAction(
-                self.tr('Open in Qt-Linguist'), self._openItem)
+            act = self.menu.addAction(self.tr("Open in Qt-Linguist"), self._openItem)
             self.tsMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+                self.tr("Open in Editor"), self.__openFileInEditor
+            )
             self.tsMenuActions.append(act)
             self.menu.addSeparator()
             act = self.menu.addAction(
-                self.tr('Release translation'), self.__releaseSelected)
+                self.tr("Release translation"), self.__releaseSelected
+            )
             self.tsMenuActions.append(act)
             self.qmprocMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Release all translations'), self.__releaseAll)
+                self.tr("Release all translations"), self.__releaseAll
+            )
             self.qmprocMenuActions.append(act)
             self.menu.addSeparator()
-            act = self.menu.addAction(
-                self.tr('Preview translation'), self.__TRPreview)
+            act = self.menu.addAction(self.tr("Preview translation"), self.__TRPreview)
             self.qmMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Preview all translations'), self.__TRPreviewAll)
+                self.tr("Preview all translations"), self.__TRPreviewAll
+            )
             self.menu.addSeparator()
         else:
             if self.hooks["extractMessages"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "extractMessages",
-                        self.tr('Extract messages')),
-                    self.__extractMessages)
+                        "extractMessages", self.tr("Extract messages")
+                    ),
+                    self.__extractMessages,
+                )
                 self.menuActions.append(act)
                 self.menu.addSeparator()
             if self.hooks["generateSelected"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateSelected",
-                        self.tr('Generate translation')),
-                    self.__generateSelected)
+                        "generateSelected", self.tr("Generate translation")
+                    ),
+                    self.__generateSelected,
+                )
                 self.tsMenuActions.append(act)
                 self.tsprocMenuActions.append(act)
             if self.hooks["generateSelectedWithObsolete"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
                         "generateSelectedWithObsolete",
-                        self.tr('Generate translation (with obsolete)')),
-                    self.__generateObsoleteSelected)
+                        self.tr("Generate translation (with obsolete)"),
+                    ),
+                    self.__generateObsoleteSelected,
+                )
                 self.tsMenuActions.append(act)
                 self.tsprocMenuActions.append(act)
             if self.hooks["generateAll"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateAll",
-                        self.tr('Generate all translations')),
-                    self.__generateAll)
+                        "generateAll", self.tr("Generate all translations")
+                    ),
+                    self.__generateAll,
+                )
                 self.tsprocMenuActions.append(act)
             if self.hooks["generateAllWithObsolete"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
                         "generateAllWithObsolete",
-                        self.tr(
-                            'Generate all translations (with obsolete)')),
-                    self.__generateObsoleteAll)
+                        self.tr("Generate all translations (with obsolete)"),
+                    ),
+                    self.__generateObsoleteAll,
+                )
                 self.tsprocMenuActions.append(act)
             self.menu.addSeparator()
             if self.hooks["open"] is not None:
                 act = self.menu.addAction(
-                    self.hooksMenuEntries.get(
-                        "open", self.tr('Open')),
-                    self._openItem)
+                    self.hooksMenuEntries.get("open", self.tr("Open")), self._openItem
+                )
                 self.tsMenuActions.append(act)
             act = self.menu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+                self.tr("Open in Editor"), self.__openFileInEditor
+            )
             self.tsMenuActions.append(act)
             self.menu.addSeparator()
             if self.hooks["releaseSelected"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "releaseSelected",
-                        self.tr('Release translation')),
-                    self.__releaseSelected)
+                        "releaseSelected", self.tr("Release translation")
+                    ),
+                    self.__releaseSelected,
+                )
                 self.tsMenuActions.append(act)
                 self.qmprocMenuActions.append(act)
             if self.hooks["releaseAll"] is not None:
                 act = self.menu.addAction(
                     self.hooksMenuEntries.get(
-                        "releaseAll",
-                        self.tr('Release all translations')),
-                    self.__releaseAll)
+                        "releaseAll", self.tr("Release all translations")
+                    ),
+                    self.__releaseAll,
+                )
                 self.qmprocMenuActions.append(act)
             self.menu.addSeparator()
         act = self.menu.addAction(
-            self.tr('Remove from project'), self.__removeLanguageFile)
+            self.tr("Remove from project"), self.__removeLanguageFile
+        )
         self.menuActions.append(act)
-        act = self.menu.addAction(
-            self.tr('Delete'), self.__deleteLanguageFile)
+        act = self.menu.addAction(self.tr("Delete"), self.__deleteLanguageFile)
         self.menuActions.append(act)
         self.menu.addSeparator()
         self.__addTranslationAct = self.menu.addAction(
-            self.tr('Add translation...'), self.project.addLanguage)
+            self.tr("Add translation..."), self.project.addLanguage
+        )
         self.menu.addAction(
-            self.tr('Add translation files...'),
-            self.__addTranslationFiles)
+            self.tr("Add translation files..."), self.__addTranslationFiles
+        )
         self.menu.addSeparator()
-        self.menu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+        self.menu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.menu.addSeparator()
-        self.menu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.menu.addAction(self.tr("Configure..."), self._configure)
+
         self.backMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             act = self.backMenu.addAction(
-                self.tr('Generate all translations'),
-                self.__generateAll)
+                self.tr("Generate all translations"), self.__generateAll
+            )
             self.tsprocBackMenuActions.append(act)
             act = self.backMenu.addAction(
-                self.tr('Generate all translations (with obsolete)'),
-                self.__generateObsoleteAll)
+                self.tr("Generate all translations (with obsolete)"),
+                self.__generateObsoleteAll,
+            )
             self.tsprocBackMenuActions.append(act)
             act = self.backMenu.addAction(
-                self.tr('Release all translations'),
-                self.__releaseAll)
+                self.tr("Release all translations"), self.__releaseAll
+            )
             self.qmprocBackMenuActions.append(act)
             self.backMenu.addSeparator()
             act = self.backMenu.addAction(
-                self.tr('Preview all translations'),
-                self.__TRPreview)
+                self.tr("Preview all translations"), self.__TRPreview
+            )
         else:
             if self.hooks["extractMessages"] is not None:
                 act = self.backMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "extractMessages",
-                        self.tr('Extract messages')),
-                    self.__extractMessages)
+                        "extractMessages", self.tr("Extract messages")
+                    ),
+                    self.__extractMessages,
+                )
                 self.backMenu.addSeparator()
             if self.hooks["generateAll"] is not None:
                 act = self.backMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateAll",
-                        self.tr('Generate all translations')),
-                    self.__generateAll)
+                        "generateAll", self.tr("Generate all translations")
+                    ),
+                    self.__generateAll,
+                )
                 self.tsprocBackMenuActions.append(act)
             if self.hooks["generateAllWithObsolete"] is not None:
                 act = self.backMenu.addAction(
                     self.hooksMenuEntries.get(
                         "generateAllWithObsolete",
-                        self.tr(
-                            'Generate all translations (with obsolete)')),
-                    self.__generateObsoleteAll)
+                        self.tr("Generate all translations (with obsolete)"),
+                    ),
+                    self.__generateObsoleteAll,
+                )
                 self.tsprocBackMenuActions.append(act)
             if self.hooks["releaseAll"] is not None:
                 act = self.backMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "releaseAll",
-                        self.tr('Release all translations')),
-                    self.__releaseAll)
+                        "releaseAll", self.tr("Release all translations")
+                    ),
+                    self.__releaseAll,
+                )
                 self.qmprocBackMenuActions.append(act)
         self.backMenu.addSeparator()
         self.__addTranslationBackAct = self.backMenu.addAction(
-            self.tr('Add translation...'), self.project.addLanguage)
+            self.tr("Add translation..."), self.project.addLanguage
+        )
         self.backMenu.addAction(
-            self.tr('Add translation files...'),
-            self.__addTranslationFiles)
+            self.tr("Add translation files..."), self.__addTranslationFiles
+        )
         self.backMenu.addSeparator()
-        self.backMenu.addAction(self.tr('Configure...'), self._configure)
+        self.backMenu.addAction(self.tr("Configure..."), self._configure)
         self.backMenu.setEnabled(False)
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             act = self.multiMenu.addAction(
-                self.tr('Generate translations'),
-                self.__generateSelected)
+                self.tr("Generate translations"), self.__generateSelected
+            )
             self.tsMultiMenuActions.append(act)
             self.tsprocMultiMenuActions.append(act)
             act = self.multiMenu.addAction(
-                self.tr('Generate translations (with obsolete)'),
-                self.__generateObsoleteSelected)
+                self.tr("Generate translations (with obsolete)"),
+                self.__generateObsoleteSelected,
+            )
             self.tsMultiMenuActions.append(act)
             self.tsprocMultiMenuActions.append(act)
             self.multiMenu.addSeparator()
             act = self.multiMenu.addAction(
-                self.tr('Open in Qt-Linguist'), self._openItem)
+                self.tr("Open in Qt-Linguist"), self._openItem
+            )
             self.tsMultiMenuActions.append(act)
             act = self.multiMenu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+                self.tr("Open in Editor"), self.__openFileInEditor
+            )
             self.tsMultiMenuActions.append(act)
             self.multiMenu.addSeparator()
             act = self.multiMenu.addAction(
-                self.tr('Release translations'), self.__releaseSelected)
+                self.tr("Release translations"), self.__releaseSelected
+            )
             self.tsMultiMenuActions.append(act)
             self.qmprocMultiMenuActions.append(act)
             self.multiMenu.addSeparator()
             act = self.multiMenu.addAction(
-                self.tr('Preview translations'), self.__TRPreview)
+                self.tr("Preview translations"), self.__TRPreview
+            )
             self.qmMultiMenuActions.append(act)
         else:
             if self.hooks["extractMessages"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "extractMessages",
-                        self.tr('Extract messages')),
-                    self.__extractMessages)
+                        "extractMessages", self.tr("Extract messages")
+                    ),
+                    self.__extractMessages,
+                )
                 self.multiMenuActions.append(act)
                 self.multiMenu.addSeparator()
             if self.hooks["generateSelected"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateSelected",
-                        self.tr('Generate translations')),
-                    self.__generateSelected)
+                        "generateSelected", self.tr("Generate translations")
+                    ),
+                    self.__generateSelected,
+                )
                 self.tsMultiMenuActions.append(act)
                 self.tsprocMultiMenuActions.append(act)
             if self.hooks["generateSelectedWithObsolete"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
                         "generateSelectedWithObsolete",
-                        self.tr('Generate translations (with obsolete)')),
-                    self.__generateObsoleteSelected)
+                        self.tr("Generate translations (with obsolete)"),
+                    ),
+                    self.__generateObsoleteSelected,
+                )
                 self.tsMultiMenuActions.append(act)
                 self.tsprocMultiMenuActions.append(act)
             self.multiMenu.addSeparator()
             if self.hooks["open"] is not None:
                 act = self.multiMenu.addAction(
-                    self.hooksMenuEntries.get(
-                        "open", self.tr('Open')),
-                    self._openItem)
+                    self.hooksMenuEntries.get("open", self.tr("Open")), self._openItem
+                )
                 self.tsMultiMenuActions.append(act)
             act = self.multiMenu.addAction(
-                self.tr('Open in Editor'), self.__openFileInEditor)
+                self.tr("Open in Editor"), self.__openFileInEditor
+            )
             self.tsMultiMenuActions.append(act)
             self.multiMenu.addSeparator()
             if self.hooks["releaseSelected"] is not None:
                 act = self.multiMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "releaseSelected",
-                        self.tr('Release translations')),
-                    self.__releaseSelected)
+                        "releaseSelected", self.tr("Release translations")
+                    ),
+                    self.__releaseSelected,
+                )
                 self.tsMultiMenuActions.append(act)
                 self.qmprocMultiMenuActions.append(act)
         self.multiMenu.addSeparator()
         act = self.multiMenu.addAction(
-            self.tr('Remove from project'), self.__removeLanguageFile)
+            self.tr("Remove from project"), self.__removeLanguageFile
+        )
         self.multiMenuActions.append(act)
-        act = self.multiMenu.addAction(
-            self.tr('Delete'), self.__deleteLanguageFile)
+        act = self.multiMenu.addAction(self.tr("Delete"), self.__deleteLanguageFile)
         self.multiMenuActions.append(act)
         self.multiMenu.addSeparator()
-        self.multiMenu.addAction(self.tr('Configure...'), self._configure)
+        self.multiMenu.addAction(self.tr("Configure..."), self._configure)
 
         self.dirMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             act = self.dirMenu.addAction(
-                self.tr('Generate all translations'),
-                self.__generateAll)
+                self.tr("Generate all translations"), self.__generateAll
+            )
             self.tsprocDirMenuActions.append(act)
             act = self.dirMenu.addAction(
-                self.tr('Generate all translations (with obsolete)'),
-                self.__generateObsoleteAll)
+                self.tr("Generate all translations (with obsolete)"),
+                self.__generateObsoleteAll,
+            )
             self.tsprocDirMenuActions.append(act)
             act = self.dirMenu.addAction(
-                self.tr('Release all translations'),
-                self.__releaseAll)
+                self.tr("Release all translations"), self.__releaseAll
+            )
             self.qmprocDirMenuActions.append(act)
             self.dirMenu.addSeparator()
             act = self.dirMenu.addAction(
-                self.tr('Preview all translations'),
-                self.__TRPreview)
+                self.tr("Preview all translations"), self.__TRPreview
+            )
         else:
             if self.hooks["extractMessages"] is not None:
                 act = self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "extractMessages",
-                        self.tr('Extract messages')),
-                    self.__extractMessages)
+                        "extractMessages", self.tr("Extract messages")
+                    ),
+                    self.__extractMessages,
+                )
                 self.dirMenuActions.append(act)
                 self.dirMenu.addSeparator()
             if self.hooks["generateAll"] is not None:
                 act = self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "generateAll",
-                        self.tr('Generate all translations')),
-                    self.__generateAll)
+                        "generateAll", self.tr("Generate all translations")
+                    ),
+                    self.__generateAll,
+                )
                 self.tsprocDirMenuActions.append(act)
             if self.hooks["generateAllWithObsolete"] is not None:
                 act = self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
                         "generateAllWithObsolete",
-                        self.tr(
-                            'Generate all translations (with obsolete)')),
-                    self.__generateObsoleteAll)
+                        self.tr("Generate all translations (with obsolete)"),
+                    ),
+                    self.__generateObsoleteAll,
+                )
                 self.tsprocDirMenuActions.append(act)
             if self.hooks["releaseAll"] is not None:
                 act = self.dirMenu.addAction(
                     self.hooksMenuEntries.get(
-                        "releaseAll",
-                        self.tr('Release all translations')),
-                    self.__releaseAll)
+                        "releaseAll", self.tr("Release all translations")
+                    ),
+                    self.__releaseAll,
+                )
                 self.qmprocDirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        act = self.dirMenu.addAction(
-            self.tr('Delete'), self._deleteDirectory)
+        act = self.dirMenu.addAction(self.tr("Delete"), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
         self.__addTranslationDirAct = self.dirMenu.addAction(
-            self.tr('Add translation...'), self.project.addLanguage)
-        self.dirMenu.addAction(
-            self.tr('Add translation files...'),
-            self.__addTranslationFiles)
-        self.dirMenu.addSeparator()
+            self.tr("Add translation..."), self.project.addLanguage
+        )
         self.dirMenu.addAction(
-            self.tr('Copy Path to Clipboard'), self._copyToClipboard)
+            self.tr("Add translation files..."), self.__addTranslationFiles
+        )
+        self.dirMenu.addSeparator()
+        self.dirMenu.addAction(self.tr("Copy Path to Clipboard"), self._copyToClipboard)
         self.dirMenu.addSeparator()
-        self.dirMenu.addAction(self.tr('Configure...'), self._configure)
-        
+        self.dirMenu.addAction(self.tr("Configure..."), self._configure)
+
         self.dirMultiMenu = None
-        
+
         self.menu.aboutToShow.connect(self.__showContextMenu)
         self.multiMenu.aboutToShow.connect(self.__showContextMenuMulti)
         self.dirMenu.aboutToShow.connect(self.__showContextMenuDir)
         self.backMenu.aboutToShow.connect(self.__showContextMenuBack)
         self.mainMenu = self.menu
-        
+
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         with contextlib.suppress(Exception):
             categories = self.getSelectedItemsCountCategorized(
-                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem])
+                [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+            )
             cnt = categories["sum"]
             if cnt <= 1:
                 index = self.indexAt(coord)
                 if index.isValid():
                     self._selectSingleItem(index)
                     categories = self.getSelectedItemsCountCategorized(
-                        [ProjectBrowserFileItem,
-                         ProjectBrowserSimpleDirectoryItem])
+                        [ProjectBrowserFileItem, ProjectBrowserSimpleDirectoryItem]
+                    )
                     cnt = categories["sum"]
-                        
+
             bfcnt = categories[str(ProjectBrowserFileItem)]
             sdcnt = categories[str(ProjectBrowserSimpleDirectoryItem)]
             if cnt > 1 and cnt == bfcnt:
@@ -493,27 +564,31 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def __showContextMenu(self):
         """
         Private slot called by the menu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             tsFiles = 0
             qmFiles = 0
             itmList = self.getSelectedItems()
             for itm in itmList[:]:
-                if itm.fileName().endswith('.ts'):
+                if itm.fileName().endswith(".ts"):
                     tsFiles += 1
-                elif itm.fileName().endswith('.qm'):
+                elif itm.fileName().endswith(".qm"):
                     qmFiles += 1
-            if (
-                (tsFiles > 0 and qmFiles > 0) or
-                (tsFiles == 0 and qmFiles == 0)
-            ):
+            if (tsFiles > 0 and qmFiles > 0) or (tsFiles == 0 and qmFiles == 0):
                 for act in self.tsMenuActions + self.qmMenuActions:
                     act.setEnabled(False)
             elif tsFiles > 0:
@@ -532,33 +607,36 @@
             if self.lreleaseProcRunning:
                 for act in self.qmprocMenuActions:
                     act.setEnabled(True)
-        self.__addTranslationAct.setEnabled(
-            self.project.getTranslationPattern() != "")
-        
+        self.__addTranslationAct.setEnabled(self.project.getTranslationPattern() != "")
+
         ProjectBaseBrowser._showContextMenu(self, self.menu)
-        
+
         self.showMenu.emit("Main", self.menu)
-        
+
     def __showContextMenuMulti(self):
         """
         Private slot called by the multiMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             tsFiles = 0
             qmFiles = 0
             itmList = self.getSelectedItems()
             for itm in itmList[:]:
-                if itm.fileName().endswith('.ts'):
+                if itm.fileName().endswith(".ts"):
                     tsFiles += 1
-                elif itm.fileName().endswith('.qm'):
+                elif itm.fileName().endswith(".qm"):
                     qmFiles += 1
-            if (
-                (tsFiles > 0 and qmFiles > 0) or
-                (tsFiles == 0 and qmFiles == 0)
-            ):
+            if (tsFiles > 0 and qmFiles > 0) or (tsFiles == 0 and qmFiles == 0):
                 for act in self.tsMultiMenuActions + self.qmMultiMenuActions:
                     act.setEnabled(False)
             elif tsFiles > 0:
@@ -577,18 +655,25 @@
             if self.lreleaseProcRunning:
                 for act in self.qmprocMultiMenuActions:
                     act.setEnabled(True)
-        
+
         ProjectBaseBrowser._showContextMenuMulti(self, self.multiMenu)
-        
+
         self.showMenu.emit("MainMulti", self.multiMenu)
-        
+
     def __showContextMenuDir(self):
         """
         Private slot called by the dirMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             if self.pylupdateProcRunning:
                 for act in self.tsprocDirMenuActions:
@@ -597,19 +682,27 @@
                 for act in self.qmprocDirMenuActions:
                     act.setEnabled(True)
         self.__addTranslationDirAct.setEnabled(
-            self.project.getTranslationPattern() != "")
-        
+            self.project.getTranslationPattern() != ""
+        )
+
         ProjectBaseBrowser._showContextMenuDir(self, self.dirMenu)
-        
+
         self.showMenu.emit("MainDir", self.dirMenu)
-        
+
     def __showContextMenuBack(self):
         """
         Private slot called by the backMenu aboutToShow signal.
         """
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             if self.pylupdateProcRunning:
                 for act in self.tsprocBackMenuActions:
@@ -618,10 +711,11 @@
                 for act in self.qmprocBackMenuActions:
                     act.setEnabled(True)
         self.__addTranslationBackAct.setEnabled(
-            self.project.getTranslationPattern() != "")
-        
+            self.project.getTranslationPattern() != ""
+        )
+
         self.showMenu.emit("MainBack", self.backMenu)
-        
+
     def __addTranslationFiles(self):
         """
         Private method to add translation files to the project.
@@ -630,14 +724,13 @@
         if isinstance(itm, ProjectBrowserFileItem):
             dn = os.path.dirname(itm.fileName())
         elif isinstance(
-            itm,
-            (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
+            itm, (ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem)
         ):
             dn = itm.dirName()
         else:
             dn = None
-        self.project.addFiles('translation', dn)
-        
+        self.project.addFiles("translation", dn)
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
@@ -649,13 +742,13 @@
                 if self.hooks["open"] is not None:
                     self.hooks["open"](itm.fileName())
                 elif itm.isLinguistFile():
-                    if itm.fileExt() == '.ts':
+                    if itm.fileExt() == ".ts":
                         self.linguistFile.emit(itm.fileName())
                     else:
                         self.trpreview.emit([itm.fileName()])
                 else:
                     self.sourceFile.emit(itm.fileName())
-        
+
     def __openFileInEditor(self):
         """
         Private slot to handle the Open in Editor menu action.
@@ -663,45 +756,47 @@
         itmList = self.getSelectedItems()
         for itm in itmList[:]:
             self.sourceFile.emit(itm.fileName())
-        
+
     def __removeLanguageFile(self):
         """
         Private method to remove a translation from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         for itm in itmList[:]:
             fn = itm.fileName()
             self.closeSourceWindow.emit(fn)
             self.project.removeLanguageFile(fn)
-        
+
     def __deleteLanguageFile(self):
         """
         Private method to delete a translation file from the project.
         """
         itmList = self.getSelectedItems()
-        
+
         translationFiles = [itm.fileName() for itm in itmList]
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
             self.parent(),
             self.tr("Delete translation files"),
-            self.tr("Do you really want to delete these translation files"
-                    " from the project?"),
-            translationFiles)
-        
+            self.tr(
+                "Do you really want to delete these translation files"
+                " from the project?"
+            ),
+            translationFiles,
+        )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn in translationFiles:
                 self.closeSourceWindow.emit(fn)
                 self.project.deleteLanguageFile(fn)
-        
+
     def __TRPreview(self, previewAll=False):
         """
         Private slot to handle the Preview translations action.
-        
+
         @param previewAll flag indicating, that all translations
             should be previewed (boolean)
         """
@@ -713,38 +808,38 @@
                     dname = self.project.getRelativePath(itm.dirName())
                     trfiles = sorted(self.project.pdata["TRANSLATIONS"][:])
                     for trfile in trfiles:
-                        if (
-                            trfile.startswith(dname) and
-                            trfile not in fileNames
-                        ):
-                            fileNames.append(
-                                os.path.join(self.project.ppath, trfile))
+                        if trfile.startswith(dname) and trfile not in fileNames:
+                            fileNames.append(os.path.join(self.project.ppath, trfile))
                 else:
                     fn = itm.fileName()
                     if fn not in fileNames:
                         fileNames.append(os.path.join(self.project.ppath, fn))
         else:
             trfiles = sorted(self.project.pdata["TRANSLATIONS"][:])
-            fileNames.extend([os.path.join(self.project.ppath, trfile)
-                              for trfile in trfiles
-                              if trfile.endswith('.qm')])
+            fileNames.extend(
+                [
+                    os.path.join(self.project.ppath, trfile)
+                    for trfile in trfiles
+                    if trfile.endswith(".qm")
+                ]
+            )
         self.trpreview[list, bool].emit(fileNames, True)
-        
+
     def __TRPreviewAll(self):
         """
         Private slot to handle the Preview all translations action.
         """
         self.__TRPreview(True)
-    
+
     ###########################################################################
     ##  Methods to support the generation and release commands
     ###########################################################################
-    
+
     def __writeTempProjectFile(self, langs, filterList):
         """
         Private method to write a temporary project file suitable for
         pylupdate and lrelease.
-        
+
         @param langs list of languages to include in the process. An empty
             list (default) means that all translations should be included.
             (list of ProjectBrowserFileItem)
@@ -753,11 +848,14 @@
         @return flag indicating success
         """
         path, ext = os.path.splitext(self.project.pfile)
-        pfile = '{0}_e4x.pro'.format(path)
-        
+        pfile = "{0}_e4x.pro".format(path)
+
         # only consider files satisfying the filter criteria
-        _sources = [s for s in self.project.pdata["SOURCES"]
-                    if os.path.splitext(s)[1] in filterList]
+        _sources = [
+            s
+            for s in self.project.pdata["SOURCES"]
+            if os.path.splitext(s)[1] in filterList
+        ]
         sources = []
         for s in _sources:
             addIt = True
@@ -767,8 +865,8 @@
                     break
             if addIt:
                 sources.append(s)
-        
-        _forms = [f for f in self.project.pdata["FORMS"] if f.endswith('.ui')]
+
+        _forms = [f for f in self.project.pdata["FORMS"] if f.endswith(".ui")]
         forms = []
         for f in _forms:
             addIt = True
@@ -778,25 +876,33 @@
                     break
             if addIt:
                 forms.append(f)
-        
+
         if langs:
-            langs = [self.project.getRelativePath(lang.fileName())
-                     for lang in langs if lang.fileName().endswith('.ts')]
+            langs = [
+                self.project.getRelativePath(lang.fileName())
+                for lang in langs
+                if lang.fileName().endswith(".ts")
+            ]
         else:
             try:
                 pattern = self.project.pdata["TRANSLATIONPATTERN"].replace(
-                    "%language%", "*")
-                langs = [lang for lang in self.project.pdata["TRANSLATIONS"]
-                         if fnmatch.fnmatch(lang, pattern)]
+                    "%language%", "*"
+                )
+                langs = [
+                    lang
+                    for lang in self.project.pdata["TRANSLATIONS"]
+                    if fnmatch.fnmatch(lang, pattern)
+                ]
             except IndexError:
                 langs = []
         if not langs:
             EricMessageBox.warning(
                 self,
                 self.tr("Write temporary project file"),
-                self.tr("""No translation files (*.ts) selected."""))
+                self.tr("""No translation files (*.ts) selected."""),
+            )
             return False
-        
+
         # create a prefix relative from the *.ts down to the project path
         langLevel = {}
         for lang in langs:
@@ -806,17 +912,11 @@
             langLevel[level] = lst
 
         for level, langs in langLevel.items():
-            prefix = '../' * level
-            sections = [
-                ("SOURCES",
-                 [prefix + src for src in sources])]
-            sections.append(
-                ("FORMS",
-                 [prefix + form for form in forms]))
-            sections.append(
-                ("TRANSLATIONS",
-                 [prefix + lang for lang in langs]))
-            
+            prefix = "../" * level
+            sections = [("SOURCES", [prefix + src for src in sources])]
+            sections.append(("FORMS", [prefix + form for form in forms]))
+            sections.append(("TRANSLATIONS", [prefix + lang for lang in langs]))
+
             directory, name = os.path.split(pfile)
             outFile = os.path.join(directory, os.path.dirname(langs[0]), name)
             outDir = os.path.dirname(outFile)
@@ -826,11 +926,14 @@
                 with open(outFile, "w", encoding="utf-8") as pf:
                     for key, fileList in sections:
                         if len(fileList) > 0:
-                            pf.write('{0} = '.format(key))
-                            pf.write(' \\\n\t'.join(
-                                [f.replace(os.sep, '/') for f in fileList]))
-                            pf.write('\n\n')
-                
+                            pf.write("{0} = ".format(key))
+                            pf.write(
+                                " \\\n\t".join(
+                                    [f.replace(os.sep, "/") for f in fileList]
+                                )
+                            )
+                            pf.write("\n\n")
+
                 self.__tmpProjects.append(outFile)
             except OSError:
                 EricMessageBox.critical(
@@ -838,100 +941,102 @@
                     self.tr("Write temporary project file"),
                     self.tr(
                         "<p>The temporary project file <b>{0}</b> could not"
-                        " be written.</p>").format(outFile))
-        
+                        " be written.</p>"
+                    ).format(outFile),
+                )
+
         if len(self.__tmpProjects) == 0:
             return False
-            
+
         return True
-    
+
     def __readStdoutLupdate(self, proc):
         """
         Private slot to handle the readyReadStandardOutput signal of the
         pylupdate process.
-        
+
         @param proc reference to the process
         @type QProcess
         """
-        self.__readStdout(proc, '{0}: '.format(self.pylupdate))
-        
+        self.__readStdout(proc, "{0}: ".format(self.pylupdate))
+
     def __readStdoutLrelease(self, proc):
         """
         Private slot to handle the readyReadStandardOutput signal of the
         lrelease process.
-        
+
         @param proc reference to the process
         @type QProcess
         """
-        self.__readStdout(proc, 'lrelease: ')
-        
+        self.__readStdout(proc, "lrelease: ")
+
     def __readStdout(self, proc, ps):
         """
         Private method to read from a process' stdout channel.
-        
+
         @param proc process to read from (QProcess)
         @param ps prompt string (string)
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         proc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
         while proc and proc.canReadLine():
             s = ps
-            output = str(proc.readLine(), ioEncoding, 'replace')
+            output = str(proc.readLine(), ioEncoding, "replace")
             s += output
             self.appendStdout.emit(s)
-        
+
     def __readStderrLupdate(self, proc):
         """
         Private slot to handle the readyReadStandardError signal of the
         pylupdate5 / pylupdate6 / pyside2-lupdate / pyside6-lupdate process.
-        
+
         @param proc reference to the process
         @type QProcess
         """
-        self.__readStderr(proc, '{0}: '.format(self.pylupdate))
-        
+        self.__readStderr(proc, "{0}: ".format(self.pylupdate))
+
     def __readStderrLrelease(self, proc):
         """
         Private slot to handle the readyReadStandardError signal of the
         lrelease process.
-        
+
         @param proc reference to the process
         @type QProcess
         """
-        self.__readStderr(proc, 'lrelease: ')
-        
+        self.__readStderr(proc, "lrelease: ")
+
     def __readStderr(self, proc, ps):
         """
         Private method to read from a process' stderr channel.
-        
+
         @param proc process to read from (QProcess)
         @param ps propmt string (string)
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         proc.setReadChannel(QProcess.ProcessChannel.StandardError)
         while proc and proc.canReadLine():
             s = ps
-            error = str(proc.readLine(), ioEncoding, 'replace')
+            error = str(proc.readLine(), ioEncoding, "replace")
             s += error
             self.appendStderr.emit(s)
-    
+
     ###########################################################################
     ##  Methods for the generation commands
     ###########################################################################
-    
+
     def __extractMessages(self):
         """
         Private slot to extract the messages to form a messages template file.
         """
         if self.hooks["extractMessages"] is not None:
             self.hooks["extractMessages"]()
-        
+
     def __generateTSFileDone(self, proc, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of the pylupdate process.
-        
+
         @param proc reference to the process
         @type QProcess
         @param exitCode exit code of the process
@@ -945,8 +1050,9 @@
                 UI.PixmapCache.getPixmap("linguist48"),
                 self.tr("Translation file generation"),
                 self.tr(
-                    "The generation of the translation files (*.ts)"
-                    " was successful."))
+                    "The generation of the translation files (*.ts)" " was successful."
+                ),
+            )
         else:
             if exitStatus == QProcess.ExitStatus.CrashExit:
                 info = self.tr(" The process has crashed.")
@@ -956,11 +1062,12 @@
                 UI.PixmapCache.getPixmap("linguist48"),
                 self.tr("Translation file generation"),
                 self.tr(
-                    "The generation of the translation files (*.ts) has"
-                    " failed.{0}").format(info),
+                    "The generation of the translation files (*.ts) has" " failed.{0}"
+                ).format(info),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
-        
+                timeout=0,
+            )
+
         for index in range(len(self.__pylupdateProcesses)):
             if proc == self.__pylupdateProcesses[index][0]:
                 tmpProjectFile = self.__pylupdateProcesses[index][1]
@@ -970,91 +1077,97 @@
                         os.remove(tmpProjectFile)
                 del self.__pylupdateProcesses[index]
                 break
-        
+
         if not self.__pylupdateProcesses:
             # all done
             self.pylupdateProcRunning = False
-            
+
             QGuiApplication.restoreOverrideCursor()
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
     def __generateTSFile(self, noobsolete=False, generateAll=True):
         """
         Private method used to run pylupdate5 / pylupdate6 / pyside2-lupdate /
         pyside6-lupdate to generate the .ts files.
-        
+
         @param noobsolete flag indicating whether obsolete entries should be
             kept (boolean)
         @param generateAll flag indicating whether all translations should be
             generated (boolean)
         """
         langs = [] if generateAll else self.getSelectedItems()
-        
+
         # Hook support
         if generateAll:
             if noobsolete:
                 if self.hooks["generateAll"] is not None:
-                    self.hooks["generateAll"](
-                        self.project.pdata["TRANSLATIONS"])
+                    self.hooks["generateAll"](self.project.pdata["TRANSLATIONS"])
                     return
             else:
                 if self.hooks["generateAllWithObsolete"] is not None:
                     self.hooks["generateAllWithObsolete"](
-                        self.project.pdata["TRANSLATIONS"])
+                        self.project.pdata["TRANSLATIONS"]
+                    )
                     return
         else:
             if noobsolete:
                 if self.hooks["generateSelected"] is not None:
-                    li = [self.project.getRelativePath(lang.fileName())
-                          for lang in langs]
+                    li = [
+                        self.project.getRelativePath(lang.fileName()) for lang in langs
+                    ]
                     self.hooks["generateSelected"](li)
                     return
             else:
                 if self.hooks["generateSelectedWithObsolete"] is not None:
-                    li = [self.project.getRelativePath(lang.fileName())
-                          for lang in langs]
+                    li = [
+                        self.project.getRelativePath(lang.fileName()) for lang in langs
+                    ]
                     self.hooks["generateSelectedWithObsolete"](li)
                     return
-        
+
         # generate a minimal temporary project file suitable for pylupdate
         self.__tmpProjects = []
-        if self.project.getProjectLanguage() in [
-            "Python", "Python3"
-        ]:
-            if self.project.getProjectType() not in [
-                "PyQt6", "PyQt6C", "E7Plugin"
-            ]:
+        if self.project.getProjectLanguage() in ["Python", "Python3"]:
+            if self.project.getProjectType() not in ["PyQt6", "PyQt6C", "E7Plugin"]:
                 ok = self.__writeTempProjectFile(langs, [".py"])
                 if not ok:
                     return
         else:
             return
-        
+
         if self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
-            self.pylupdate = Utilities.generatePyQtToolPath('pylupdate5')
+            self.pylupdate = Utilities.generatePyQtToolPath("pylupdate5")
         elif self.project.getProjectType() in ["PyQt6", "PyQt6C", "E7Plugin"]:
-            self.pylupdate = Utilities.generatePyQtToolPath('pylupdate6')
+            self.pylupdate = Utilities.generatePyQtToolPath("pylupdate6")
         elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
             self.pylupdate = Utilities.generatePySideToolPath(
-                'pyside2-lupdate', variant=2)
+                "pyside2-lupdate", variant=2
+            )
         elif self.project.getProjectType() in ["PySide6", "PySide6C"]:
             self.pylupdate = Utilities.generatePySideToolPath(
-                'pyside6-lupdate', variant=6)
+                "pyside6-lupdate", variant=6
+            )
         else:
             return
 
         self.__pylupdateProcesses = []
         if self.project.getProjectType() in ["PyQt6", "PyQt6C", "E7Plugin"]:
             if langs:
-                langs = [self.project.getRelativePath(lang.fileName())
-                         for lang in langs if lang.fileName().endswith('.ts')]
+                langs = [
+                    self.project.getRelativePath(lang.fileName())
+                    for lang in langs
+                    if lang.fileName().endswith(".ts")
+                ]
             else:
                 try:
                     pattern = self.project.pdata["TRANSLATIONPATTERN"].replace(
-                        "%language%", "*")
+                        "%language%", "*"
+                    )
                     langs = [
-                        lang for lang in self.project.pdata["TRANSLATIONS"]
+                        lang
+                        for lang in self.project.pdata["TRANSLATIONS"]
                         if fnmatch.fnmatch(lang, pattern)
                     ]
                 except IndexError:
@@ -1063,32 +1176,34 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("Translation file generation"),
-                    self.tr("""No translation files (*.ts) selected."""))
+                    self.tr("""No translation files (*.ts) selected."""),
+                )
                 return
-            
+
             excludePatterns = [
-                pat for pat in self.project.getIgnorePatterns()
+                pat
+                for pat in self.project.getIgnorePatterns()
                 if pat.endswith((".py", ".ui"))
             ]
-            
-            QGuiApplication.setOverrideCursor(
-                QCursor(Qt.CursorShape.WaitCursor))
+
+            QGuiApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-            
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
             for lang in langs:
                 proc = QProcess()
                 args = []
-                
+
                 for pattern in excludePatterns:
                     args += ["--exclude", pattern]
-                
+
                 if noobsolete:
-                    args.append('--no-obsolete')
-                
+                    args.append("--no-obsolete")
+
                 args += ["--ts", lang]
                 args.append(".")
-                
+
                 proc.setWorkingDirectory(self.project.ppath)
                 proc.finished.connect(
                     functools.partial(self.__generateTSFileDone, proc)
@@ -1099,7 +1214,7 @@
                 proc.readyReadStandardError.connect(
                     functools.partial(self.__readStderrLupdate, proc)
                 )
-                
+
                 proc.start(self.pylupdate, args)
                 procStarted = proc.waitForStarted()
                 if procStarted:
@@ -1109,29 +1224,29 @@
                     with EricOverridenCursor():
                         EricMessageBox.critical(
                             self,
-                            self.tr('Process Generation Error'),
+                            self.tr("Process Generation Error"),
                             self.tr(
-                                'Could not start {0}.<br>'
-                                'Ensure that it is in the search path.'
-                            ).format(self.pylupdate))
+                                "Could not start {0}.<br>"
+                                "Ensure that it is in the search path."
+                            ).format(self.pylupdate),
+                        )
         else:
-            QGuiApplication.setOverrideCursor(
-                QCursor(Qt.CursorShape.WaitCursor))
+            QGuiApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-            
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
             for tempProjectFile in self.__tmpProjects[:]:
                 proc = QProcess()
                 args = []
 
                 if noobsolete:
-                    args.append('-noobsolete')
-                
-                args.append('-verbose')
+                    args.append("-noobsolete")
+
+                args.append("-verbose")
                 path, filename = os.path.split(tempProjectFile)
                 args.append(filename)
-                proc.setWorkingDirectory(
-                    os.path.join(self.project.ppath, path))
+                proc.setWorkingDirectory(os.path.join(self.project.ppath, path))
                 proc.finished.connect(
                     functools.partial(self.__generateTSFileDone, proc)
                 )
@@ -1141,7 +1256,7 @@
                 proc.readyReadStandardError.connect(
                     functools.partial(self.__readStderrLupdate, proc)
                 )
-                
+
                 proc.start(self.pylupdate, args)
                 procStarted = proc.waitForStarted()
                 if procStarted:
@@ -1151,64 +1266,66 @@
                     with EricOverridenCursor():
                         EricMessageBox.critical(
                             self,
-                            self.tr('Process Generation Error'),
+                            self.tr("Process Generation Error"),
                             self.tr(
-                                'Could not start {0}.<br>'
-                                'Ensure that it is in the search path.'
-                            ).format(self.pylupdate))
+                                "Could not start {0}.<br>"
+                                "Ensure that it is in the search path."
+                            ).format(self.pylupdate),
+                        )
                     # cleanup
                     with contextlib.suppress(OSError):
                         self.__tmpProjects.remove(tempProjectFile)
                         os.remove(tempProjectFile)
-        
+
         if not self.__pylupdateProcesses:
             # no processes could be started, revert override cursor
             QGuiApplication.restoreOverrideCursor()
             QGuiApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+
     def __generateAll(self):
         """
         Private method to generate all translation files (.ts) for Qt Linguist.
-        
+
         All obsolete strings are removed from the .ts file.
         """
         self.__generateTSFile(noobsolete=True, generateAll=True)
-        
+
     def __generateObsoleteAll(self):
         """
         Private method to generate all translation files (.ts) for Qt Linguist.
-        
+
         Obsolete strings are kept.
         """
         self.__generateTSFile(noobsolete=False, generateAll=True)
-        
+
     def __generateSelected(self):
         """
         Private method to generate selected translation files (.ts) for
         Qt Linguist.
-        
+
         All obsolete strings are removed from the .ts file.
         """
         self.__generateTSFile(noobsolete=True, generateAll=False)
-        
+
     def __generateObsoleteSelected(self):
         """
         Private method to generate selected translation files (.ts) for
         Qt Linguist.
-        
+
         Obsolete strings are kept.
         """
         self.__generateTSFile(noobsolete=False, generateAll=False)
-    
+
     ###########################################################################
     ##  Methods for the release commands
     ###########################################################################
-    
+
     def __releaseTSFileDone(self, proc, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of the lrelease process.
-        
+
         @param proc reference to the process
         @type QProcess
         @param exitCode exit code of the process
@@ -1221,27 +1338,30 @@
             ui.showNotification(
                 UI.PixmapCache.getPixmap("linguist48"),
                 self.tr("Translation file release"),
-                self.tr("The release of the translation files (*.qm)"
-                        " was successful."))
+                self.tr(
+                    "The release of the translation files (*.qm)" " was successful."
+                ),
+            )
             if self.project.pdata["TRANSLATIONSBINPATH"]:
                 target = os.path.join(
-                    self.project.ppath,
-                    self.project.pdata["TRANSLATIONSBINPATH"])
+                    self.project.ppath, self.project.pdata["TRANSLATIONSBINPATH"]
+                )
                 for langFile in self.project.pdata["TRANSLATIONS"][:]:
-                    if langFile.endswith('.ts'):
-                        qmFile = os.path.join(self.project.ppath,
-                                              langFile.replace('.ts', '.qm'))
+                    if langFile.endswith(".ts"):
+                        qmFile = os.path.join(
+                            self.project.ppath, langFile.replace(".ts", ".qm")
+                        )
                         if os.path.exists(qmFile):
                             shutil.move(qmFile, target)
         else:
             ui.showNotification(
                 UI.PixmapCache.getPixmap("linguist48"),
                 self.tr("Translation file release"),
-                self.tr(
-                    "The release of the translation files (*.qm) has failed."),
+                self.tr("The release of the translation files (*.qm) has failed."),
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
-        
+                timeout=0,
+            )
+
         for index in range(len(self.__lreleaseProcesses)):
             if proc == self.__lreleaseProcesses[index]:
                 del self.__lreleaseProcesses[index]
@@ -1250,16 +1370,16 @@
             # all done
             self.lreleaseProcRunning = False
             self.project.checkLanguageFiles()
-        
+
     def __releaseTSFile(self, generateAll=False):
         """
         Private method to run lrelease to release the translation files (.qm).
-        
+
         @param generateAll flag indicating whether all translations should be
             released (boolean)
         """
         langs = [] if generateAll else self.getSelectedItems()
-        
+
         # Hooks support
         if generateAll:
             if self.hooks["releaseAll"] is not None:
@@ -1267,60 +1387,72 @@
                 return
         else:
             if self.hooks["releaseSelected"] is not None:
-                li = [self.project.getRelativePath(lang.fileName())
-                      for lang in langs]
+                li = [self.project.getRelativePath(lang.fileName()) for lang in langs]
                 self.hooks["releaseSelected"](li)
                 return
-        
+
         if self.project.getProjectType() in [
-            "PyQt5", "PyQt5C", "PyQt6", "PyQt6C", "E7Plugin",
-            "PySide2", "PySide2C", "PySide6", "PySide6C"
+            "PyQt5",
+            "PyQt5C",
+            "PyQt6",
+            "PyQt6C",
+            "E7Plugin",
+            "PySide2",
+            "PySide2C",
+            "PySide6",
+            "PySide6C",
         ]:
             lrelease = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("lrelease"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("lrelease")
+            )
         else:
             return
         if Utilities.isWindowsPlatform():
-            lrelease += '.exe'
-        
+            lrelease += ".exe"
+
         if langs:
-            langs = [self.project.getRelativePath(lang.fileName())
-                     for lang in langs if lang.fileName().endswith('.ts')]
+            langs = [
+                self.project.getRelativePath(lang.fileName())
+                for lang in langs
+                if lang.fileName().endswith(".ts")
+            ]
         else:
             try:
                 pattern = self.project.pdata["TRANSLATIONPATTERN"].replace(
-                    "%language%", "*")
-                langs = [lang for lang in self.project.pdata["TRANSLATIONS"]
-                         if fnmatch.fnmatch(lang, pattern)]
+                    "%language%", "*"
+                )
+                langs = [
+                    lang
+                    for lang in self.project.pdata["TRANSLATIONS"]
+                    if fnmatch.fnmatch(lang, pattern)
+                ]
             except IndexError:
                 langs = []
         if not langs:
             EricMessageBox.warning(
                 self,
                 self.tr("Write temporary project file"),
-                self.tr("""No translation files (*.ts) selected."""))
+                self.tr("""No translation files (*.ts) selected."""),
+            )
             return
-        
+
         self.__lreleaseProcesses = []
         args = []
-        args.append('-verbose')
+        args.append("-verbose")
         for langFile in langs:
             path, filename = os.path.split(langFile)
             args.append(filename)
-        
+
         proc = QProcess()
         proc.setWorkingDirectory(os.path.join(self.project.ppath, path))
-        proc.finished.connect(
-            functools.partial(self.__releaseTSFileDone, proc)
-        )
+        proc.finished.connect(functools.partial(self.__releaseTSFileDone, proc))
         proc.readyReadStandardOutput.connect(
             functools.partial(self.__readStdoutLrelease, proc)
         )
         proc.readyReadStandardError.connect(
             functools.partial(self.__readStderrLrelease, proc)
         )
-        
+
         proc.start(lrelease, args)
         procStarted = proc.waitForStarted()
         if procStarted:
@@ -1329,32 +1461,33 @@
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start lrelease.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(lrelease))
-        
+                    "<p>Could not start lrelease.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(lrelease),
+            )
+
     def __releaseSelected(self):
         """
         Private method to release the translation files (.qm).
         """
         self.__releaseTSFile(generateAll=False)
-        
+
     def __releaseAll(self):
         """
         Private method to release the translation files (.qm).
         """
         self.__releaseTSFile(generateAll=True)
-    
+
     ###########################################################################
     ## Support for hooks below
     ###########################################################################
-    
+
     def _initHookMethods(self):
         """
         Protected method to initialize the hooks dictionary.
-        
+
         Supported hook methods are:
         <ul>
         <li>extractMessages: takes no parameters</li>
@@ -1367,7 +1500,7 @@
         <li>releaseSelected: takes list of filenames as parameter</li>
         <li>open: takes a filename as parameter</li>
         </ul>
-        
+
         <b>Note</b>: Filenames are relative to the project directory.
         """
         self.hooks = {
--- a/src/eric7/Project/PropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/PropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,10 +33,11 @@
     """
     Class implementing the project properties dialog.
     """
+
     def __init__(self, project, new=True, parent=None, name=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param new flag indicating the generation of a new project
         @param parent parent widget of this dialog (QWidget)
@@ -46,64 +47,59 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.dirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.mainscriptPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.makeButton.setIcon(UI.PixmapCache.getIcon("makefile"))
-        
+
         self.docstringStyleComboBox.addItem(self.tr("None"), "")
-        for docstringType, docstringStyle in sorted(
-            getSupportedDocstringTypes()
-        ):
+        for docstringType, docstringStyle in sorted(getSupportedDocstringTypes()):
             self.docstringStyleComboBox.addItem(docstringStyle, docstringType)
-        
+
         self.project = project
         self.newProject = new
         self.transPropertiesDlg = None
         self.spellPropertiesDlg = None
         self.makePropertiesDlg = None
-        
+
         patterns = []
         for pattern, filetype in self.project.pdata["FILETYPES"].items():
             if filetype == "SOURCES":
                 patterns.append(pattern)
-        filters = self.tr("Source Files ({0});;All Files (*)"
-                          ).format(" ".join(sorted(patterns)))
+        filters = self.tr("Source Files ({0});;All Files (*)").format(
+            " ".join(sorted(patterns))
+        )
         self.mainscriptPicker.setFilters(filters)
-        
+
         self.languageComboBox.addItems(project.getProgrammingLanguages())
-        
+
         projectTypes = []
         for projectTypeItem in project.getProjectTypes().items():
             projectTypes.append((projectTypeItem[1], projectTypeItem[0]))
         self.projectTypeComboBox.clear()
         for projectType in sorted(projectTypes):
-            self.projectTypeComboBox.addItem(
-                projectType[0], projectType[1])
-        
-        ipath = (
-            Preferences.getMultiProject("Workspace") or
-            Utilities.getHomeDir()
-        )
+            self.projectTypeComboBox.addItem(projectType[0], projectType[1])
+
+        ipath = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
         self.__initPaths = [
             Utilities.fromNativeSeparators(ipath),
             Utilities.fromNativeSeparators(ipath) + "/",
         ]
-        
+
         self.licenseComboBox.lineEdit().setClearButtonEnabled(True)
         self.__populateLicenseComboBox()
-        
+
         if not new:
             name = os.path.splitext(self.project.pfile)[0]
             self.nameEdit.setText(os.path.basename(name))
             self.languageComboBox.setCurrentIndex(
-                self.languageComboBox.findText(
-                    self.project.pdata["PROGLANGUAGE"]))
-            self.mixedLanguageCheckBox.setChecked(
-                self.project.pdata["MIXEDLANGUAGE"])
+                self.languageComboBox.findText(self.project.pdata["PROGLANGUAGE"])
+            )
+            self.mixedLanguageCheckBox.setChecked(self.project.pdata["MIXEDLANGUAGE"])
             curIndex = self.projectTypeComboBox.findData(
-                self.project.pdata["PROJECTTYPE"])
+                self.project.pdata["PROJECTTYPE"]
+            )
             if curIndex == -1:
                 curIndex = self.projectTypeComboBox.findData("PyQt6")
             self.projectTypeComboBox.setCurrentIndex(curIndex)
@@ -112,92 +108,95 @@
             self.mainscriptPicker.setText(self.project.pdata["MAINSCRIPT"])
             self.authorEdit.setText(self.project.pdata["AUTHOR"])
             self.emailEdit.setText(self.project.pdata["EMAIL"])
-            self.descriptionEdit.setPlainText(
-                self.project.pdata["DESCRIPTION"])
+            self.descriptionEdit.setPlainText(self.project.pdata["DESCRIPTION"])
             self.eolComboBox.setCurrentIndex(self.project.pdata["EOL"])
             self.vcsLabel.show()
             if self.project.vcs is not None:
                 vcsSystemsDict = (
-                    ericApp().getObject("PluginManager")
+                    ericApp()
+                    .getObject("PluginManager")
                     .getPluginDisplayStrings("version_control")
                 )
                 try:
-                    vcsSystemDisplay = vcsSystemsDict[
-                        self.project.pdata["VCS"]]
+                    vcsSystemDisplay = vcsSystemsDict[self.project.pdata["VCS"]]
                 except KeyError:
                     vcsSystemDisplay = "None"
                 self.vcsLabel.setText(
-                    self.tr(
-                        "The project is version controlled by <b>{0}</b>.")
-                    .format(vcsSystemDisplay))
+                    self.tr("The project is version controlled by <b>{0}</b>.").format(
+                        vcsSystemDisplay
+                    )
+                )
                 self.vcsInfoButton.show()
             else:
-                self.vcsLabel.setText(
-                    self.tr("The project is not version controlled."))
+                self.vcsLabel.setText(self.tr("The project is not version controlled."))
                 self.vcsInfoButton.hide()
             self.vcsCheckBox.hide()
             self.makeCheckBox.setChecked(
-                self.project.pdata["MAKEPARAMS"]["MakeEnabled"])
+                self.project.pdata["MAKEPARAMS"]["MakeEnabled"]
+            )
             cindex = self.docstringStyleComboBox.findData(
-                self.project.pdata["DOCSTRING"])
+                self.project.pdata["DOCSTRING"]
+            )
             self.docstringStyleComboBox.setCurrentIndex(cindex)
             with contextlib.suppress(KeyError):
                 cindex = self.testingFrameworkComboBox.findData(
-                    self.project.pdata["TESTING_FRAMEWORK"])
+                    self.project.pdata["TESTING_FRAMEWORK"]
+                )
                 self.testingFrameworkComboBox.setCurrentIndex(cindex)
             with contextlib.suppress(KeyError):
-                self.licenseComboBox.setCurrentText(
-                    self.project.pdata["LICENSE"])
+                self.licenseComboBox.setCurrentText(self.project.pdata["LICENSE"])
         else:
             self.languageComboBox.setCurrentText("Python3")
             self.projectTypeComboBox.setCurrentIndex(
-                self.projectTypeComboBox.findData("PyQt6"))
+                self.projectTypeComboBox.findData("PyQt6")
+            )
             self.dirPicker.setText(self.__initPaths[0])
-            self.versionEdit.setText('0.1')
+            self.versionEdit.setText("0.1")
             self.vcsLabel.hide()
             self.vcsInfoButton.hide()
             if not self.project.vcsSoftwareAvailable():
                 self.vcsCheckBox.hide()
-        
+
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(self.dirPicker.text()) and
-            self.dirPicker.text() not in self.__initPaths)
-    
+            bool(self.dirPicker.text())
+            and self.dirPicker.text() not in self.__initPaths
+        )
+
     def __populateLicenseComboBox(self):
         """
         Private method to populate the license selector with the list of trove
         license types.
         """
         self.licenseComboBox.addItem("")
-        self.licenseComboBox.addItems(sorted(
-            classifier.split("::")[-1].strip()
-            for classifier in trove_classifiers.classifiers
-            if classifier.startswith("License ::")
-        ))
-    
+        self.licenseComboBox.addItems(
+            sorted(
+                classifier.split("::")[-1].strip()
+                for classifier in trove_classifiers.classifiers
+                if classifier.startswith("License ::")
+            )
+        )
+
     @pyqtSlot(str)
     def on_languageComboBox_currentTextChanged(self, language):
         """
         Private slot handling the selection of a programming language.
-        
+
         @param language text of the current item
         @type str
         """
         curProjectType = self.getProjectType()
-        
+
         self.projectTypeComboBox.clear()
         for projectType in sorted(
-            self.project.getProjectTypes(language).items(),
-            key=lambda k: k[1]
+            self.project.getProjectTypes(language).items(), key=lambda k: k[1]
         ):
-            self.projectTypeComboBox.addItem(
-                projectType[1], projectType[0])
-        
+            self.projectTypeComboBox.addItem(projectType[1], projectType[0])
+
         index = self.projectTypeComboBox.findData(curProjectType)
         if index == -1:
             index = 0
         self.projectTypeComboBox.setCurrentIndex(index)
-        
+
         curTestingFramework = self.testingFrameworkComboBox.currentText()
         self.testingFrameworkComboBox.clear()
         self.testingFrameworkComboBox.addItem(self.tr("None"), "")
@@ -205,18 +204,18 @@
             for framework in sorted(FrameworkNames[language]):
                 self.testingFrameworkComboBox.addItem(framework, framework)
         self.testingFrameworkComboBox.setCurrentText(curTestingFramework)
-    
+
     @pyqtSlot(str)
     def on_dirPicker_textChanged(self, txt):
         """
         Private slot to handle a change of the project directory.
-        
+
         @param txt name of the project directory (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and
-            Utilities.fromNativeSeparators(txt) not in self.__initPaths)
-    
+            bool(txt) and Utilities.fromNativeSeparators(txt) not in self.__initPaths
+        )
+
     @pyqtSlot()
     def on_spellPropertiesButton_clicked(self):
         """
@@ -224,29 +223,31 @@
         """
         if self.spellPropertiesDlg is None:
             from .SpellingPropertiesDialog import SpellingPropertiesDialog
+
             self.spellPropertiesDlg = SpellingPropertiesDialog(
-                self.project, self.newProject, self)
+                self.project, self.newProject, self
+            )
         res = self.spellPropertiesDlg.exec()
         if res == QDialog.DialogCode.Rejected:
             self.spellPropertiesDlg.initDialog()  # reset the dialogs contents
-    
+
     @pyqtSlot()
     def on_transPropertiesButton_clicked(self):
         """
         Private slot to display the translations properties dialog.
         """
         if self.transPropertiesDlg is None:
-            from .TranslationPropertiesDialog import (
-                TranslationPropertiesDialog
+            from .TranslationPropertiesDialog import TranslationPropertiesDialog
+
+            self.transPropertiesDlg = TranslationPropertiesDialog(
+                self.project, self.newProject, self
             )
-            self.transPropertiesDlg = TranslationPropertiesDialog(
-                self.project, self.newProject, self)
         else:
             self.transPropertiesDlg.initFilters()
         res = self.transPropertiesDlg.exec()
         if res == QDialog.DialogCode.Rejected:
             self.transPropertiesDlg.initDialog()  # reset the dialogs contents
-    
+
     @pyqtSlot()
     def on_makeButton_clicked(self):
         """
@@ -254,17 +255,19 @@
         """
         if self.makePropertiesDlg is None:
             from .MakePropertiesDialog import MakePropertiesDialog
+
             self.makePropertiesDlg = MakePropertiesDialog(
-                self.project, self.newProject, self)
+                self.project, self.newProject, self
+            )
         res = self.makePropertiesDlg.exec()
         if res == QDialog.DialogCode.Rejected:
             self.makePropertiesDlg.initDialog()
-    
+
     @pyqtSlot(str)
     def on_mainscriptPicker_pathSelected(self, script):
         """
         Private slot to check the selected main script name.
-        
+
         @param script name of the main script
         @type str
         """
@@ -274,7 +277,7 @@
                 ppath = QDir(ppath).absolutePath() + QDir.separator()
                 script = script.replace(ppath, "")
             self.mainscriptPicker.setText(script)
-    
+
     @pyqtSlot()
     def on_mainscriptPicker_aboutToShowPathPickerDialog(self):
         """
@@ -285,7 +288,7 @@
         if not path:
             path = QDir.currentPath()
         self.mainscriptPicker.setDefaultDirectory(path)
-    
+
     @pyqtSlot()
     def on_vcsInfoButton_clicked(self):
         """
@@ -293,29 +296,31 @@
         """
         if self.project.vcs is None:
             return
-            
+
         from VCS.RepositoryInfoDialog import VcsRepositoryInfoDialog
+
         info = self.project.vcs.vcsRepositoryInfos(self.project.ppath)
         dlg = VcsRepositoryInfoDialog(self, info)
         dlg.exec()
-    
+
     def getProjectType(self):
         """
         Public method to get the selected project type.
-        
+
         @return selected UI type (string)
         """
         return self.projectTypeComboBox.itemData(
-            self.projectTypeComboBox.currentIndex())
-    
+            self.projectTypeComboBox.currentIndex()
+        )
+
     def getPPath(self):
         """
         Public method to get the project path.
-        
+
         @return data of the project directory edit (string)
         """
         return os.path.abspath(self.dirPicker.text())
-    
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
@@ -340,37 +345,29 @@
         self.project.pdata["AUTHOR"] = self.authorEdit.text()
         self.project.pdata["EMAIL"] = self.emailEdit.text()
         self.project.pdata["DESCRIPTION"] = self.descriptionEdit.toPlainText()
-        self.project.pdata["PROGLANGUAGE"] = (
-            self.languageComboBox.currentText()
-        )
-        self.project.pdata["MIXEDLANGUAGE"] = (
-            self.mixedLanguageCheckBox.isChecked()
-        )
+        self.project.pdata["PROGLANGUAGE"] = self.languageComboBox.currentText()
+        self.project.pdata["MIXEDLANGUAGE"] = self.mixedLanguageCheckBox.isChecked()
         projectType = self.getProjectType()
         if projectType is not None:
             self.project.pdata["PROJECTTYPE"] = projectType
         self.project.pdata["EOL"] = self.eolComboBox.currentIndex()
-        
+
         self.project.vcsRequested = self.vcsCheckBox.isChecked()
-        
+
         if self.spellPropertiesDlg is not None:
             self.spellPropertiesDlg.storeData()
-        
+
         if self.transPropertiesDlg is not None:
             self.transPropertiesDlg.storeData()
-        
-        self.project.pdata["MAKEPARAMS"]["MakeEnabled"] = (
-            self.makeCheckBox.isChecked()
-        )
+
+        self.project.pdata["MAKEPARAMS"]["MakeEnabled"] = self.makeCheckBox.isChecked()
         if self.makePropertiesDlg is not None:
             self.makePropertiesDlg.storeData()
-        
-        self.project.pdata["DOCSTRING"] = (
-            self.docstringStyleComboBox.currentData()
-        )
-        
-        self.project.pdata["TESTING_FRAMEWORK"] = (
-            self.testingFrameworkComboBox.currentData()
-        )
-        
+
+        self.project.pdata["DOCSTRING"] = self.docstringStyleComboBox.currentData()
+
+        self.project.pdata[
+            "TESTING_FRAMEWORK"
+        ] = self.testingFrameworkComboBox.currentData()
+
         self.project.pdata["LICENSE"] = self.licenseComboBox.currentText()
--- a/src/eric7/Project/QuickFindFileDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/QuickFindFileDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,11 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QApplication, QDialogButtonBox, QTreeWidgetItem
+    QWidget,
+    QHeaderView,
+    QApplication,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from .Ui_QuickFindFile import Ui_QuickFindFile
@@ -23,24 +27,25 @@
 class QuickFindFileDialog(QWidget, Ui_QuickFindFile):
     """
     Class implementing the Quick Find File by Name Dialog.
-    
+
     This dialog provides a slightly more streamlined behaviour
     than the standard FindFileNameDialog in that it tries to
     match any name in the project against (fragmentary) bits of
     file names.
-    
+
     @signal sourceFile(str) emitted to open a file in the editor
     @signal designerFile(str) emitted to open a Qt-Designer file
     @signal linguistFile(str) emitted to open a Qt translation file
     """
+
     sourceFile = pyqtSignal(str)
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this dialog
@@ -48,20 +53,20 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.fileList.headerItem().setText(self.fileList.columnCount(), "")
-        self.fileNameEdit.returnPressed.connect(
-            self.on_fileNameEdit_returnPressed)
+        self.fileNameEdit.returnPressed.connect(self.on_fileNameEdit_returnPressed)
         self.installEventFilter(self)
 
         self.stopButton = self.buttonBox.addButton(
-            self.tr("Stop"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Stop"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.project = project
-    
+
     def eventFilter(self, source, event):
         """
         Public method to handle event for another object.
-        
+
         @param source object to handle events for
         @type QObject
         @param event event to handle
@@ -70,51 +75,47 @@
         @rtype bool
         """
         if event.type() == QEvent.Type.KeyPress:
-            
+
             # Anywhere in the dialog, make hitting escape cancel it
             if event.key() == Qt.Key.Key_Escape:
                 self.close()
-            
+
             # Anywhere in the dialog, make hitting up/down choose next item
             # Note: This doesn't really do anything, as other than the text
             #       input there's nothing that doesn't handle up/down already.
-            elif (
-                event.key() == Qt.Key.Key_Up or
-                event.key() == Qt.Key.Key_Down
-            ):
+            elif event.key() == Qt.Key.Key_Up or event.key() == Qt.Key.Key_Down:
                 current = self.fileList.currentItem()
                 index = self.fileList.indexOfTopLevelItem(current)
                 if event.key() == Qt.Key.Key_Up:
                     if index != 0:
                         self.fileList.setCurrentItem(
-                            self.fileList.topLevelItem(index - 1))
+                            self.fileList.topLevelItem(index - 1)
+                        )
                 else:
                     if index < (self.fileList.topLevelItemCount() - 1):
                         self.fileList.setCurrentItem(
-                            self.fileList.topLevelItem(index + 1))
+                            self.fileList.topLevelItem(index + 1)
+                        )
         return QWidget.eventFilter(self, source, event)
 
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.stopButton:
             self.shouldStop = True
-        elif (
-            button ==
-            self.buttonBox.button(QDialogButtonBox.StandardButton.Open)
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Open):
             self.__openFile()
-    
+
     def __openFile(self, itm=None):
         """
         Private slot to open a file.
-        
+
         It emits the signal sourceFile or designerFile depending on the
         file extension.
-        
+
         @param itm item to be opened
         @type QTreeWidgetItem
         @return flag indicating a file was opened
@@ -126,33 +127,40 @@
             filePath = itm.text(1)
             fileName = itm.text(0)
             fullPath = os.path.join(self.project.ppath, filePath, fileName)
-            
-            if fullPath.endswith('.ui'):
+
+            if fullPath.endswith(".ui"):
                 self.designerFile.emit(fullPath)
-            elif fullPath.endswith(('.ts', '.qm')):
+            elif fullPath.endswith((".ts", ".qm")):
                 self.linguistFile.emit(fullPath)
             else:
                 self.sourceFile.emit(fullPath)
             return True
-        
+
         return False
-    
+
     def __generateLocations(self):
         """
         Private method to generate a set of locations that can be searched.
-        
+
         @yield set of files in our project
         @ytype str
         """
-        for typ in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES",
-                    "TRANSLATIONS", "OTHERS"]:
+        for typ in [
+            "SOURCES",
+            "FORMS",
+            "INTERFACES",
+            "PROTOCOLS",
+            "RESOURCES",
+            "TRANSLATIONS",
+            "OTHERS",
+        ]:
             entries = self.project.pdata.get(typ)
             yield from entries[:]
-    
+
     def __sortedMatches(self, items, searchTerm):
         """
         Private method to find the subset of items which match a search term.
-        
+
         @param items list of items to be scanned for the search term
         @type list of str
         @param searchTerm search term to be searched for
@@ -162,11 +170,11 @@
         @rtype list of tuple of bool, int and str
         """
         fragments = searchTerm.split()
-        
+
         possible = [
             # matches, in_order, file name
         ]
-        
+
         for entry in items:
             count = 0
             match_order = []
@@ -188,7 +196,7 @@
                     # keep this
                     del possible[:]
                 possible.append(record)
-        
+
         ordered = []
         for (_, in_order, name) in possible:
             try:
@@ -196,11 +204,13 @@
             except OSError:
                 # skipping, because it doesn't appear to exist...
                 continue
-            ordered.append((
-                in_order,    # we want closer match first
-                - age,       # then approximately "most recently edited"
-                name
-            ))
+            ordered.append(
+                (
+                    in_order,  # we want closer match first
+                    -age,  # then approximately "most recently edited"
+                    name,
+                )
+            )
         ordered.sort()
         return ordered
 
@@ -212,32 +222,32 @@
         if not fileName:
             self.fileList.clear()
             return
-        
+
         ordered = self.__sortedMatches(self.__generateLocations(), fileName)
-        
+
         found = False
         self.fileList.clear()
         locations = {}
 
         for _in_order, _age, name in ordered:
             found = True
-            QTreeWidgetItem(self.fileList, [os.path.basename(name),
-                                            os.path.dirname(name)])
+            QTreeWidgetItem(
+                self.fileList, [os.path.basename(name), os.path.dirname(name)]
+            )
         QApplication.processEvents()
-            
+
         del locations
         self.stopButton.setEnabled(False)
-        self.fileList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.fileList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.fileList.header().setStretchLastSection(True)
-        
+
         if found:
             self.fileList.setCurrentItem(self.fileList.topLevelItem(0))
 
     def on_fileNameEdit_textChanged(self, text):
         """
         Private slot to handle the textChanged signal of the file name edit.
-        
+
         @param text (ignored)
         """
         self.__searchFile()
@@ -248,29 +258,30 @@
         """
         if self.__openFile():
             self.close()
-    
+
     def on_fileList_itemActivated(self, itm, column):
         """
         Private slot to handle the double click on a file item.
-        
+
         It emits the signal sourceFile or designerFile depending on the
         file extension.
-        
+
         @param itm the double clicked listview item (QTreeWidgetItem)
         @param column column that was double clicked (integer) (ignored)
         """
         self.__openFile(itm)
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_fileList_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current item.
-        
+
         @param current current item (QTreeWidgetItem)
         @param previous prevoius current item (QTreeWidgetItem)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Open).setEnabled(
-            current is not None)
+            current is not None
+        )
 
     def show(self):
         """
@@ -278,5 +289,5 @@
         """
         self.fileNameEdit.selectAll()
         self.fileNameEdit.setFocus()
-        
+
         super().show()
--- a/src/eric7/Project/RccCompilerOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/RccCompilerOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter some non-common rcc compiler options.
     """
+
     def __init__(self, compilerOptions, parent=None):
         """
         Constructor
-        
+
         @param compilerOptions dictionary containing the rcc compiler options
         @type dict
         @param parent reference to the parent widget
@@ -27,19 +28,19 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.thresholdSpinBox.setValue(compilerOptions["CompressionThreshold"])
         self.compressionSpinBox.setValue(compilerOptions["CompressLevel"])
         self.disableCheckBox.setChecked(compilerOptions["CompressionDisable"])
         self.rootEdit.setText(compilerOptions["PathPrefix"])
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the compression threshold, compression level,
             flag indicating to disable compression and the resource access path
             prefix
--- a/src/eric7/Project/SpellingPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/SpellingPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,47 +20,45 @@
     """
     Class implementing the Spelling Properties dialog.
     """
+
     def __init__(self, project, new, parent):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param new flag indicating the generation of a new project
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.pwlPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.pwlPicker.setDefaultDirectory(project.ppath)
-        self.pwlPicker.setFilters(self.tr(
-            "Dictionary File (*.dic);;All Files (*)"))
-        
+        self.pwlPicker.setFilters(self.tr("Dictionary File (*.dic);;All Files (*)"))
+
         self.pelPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.pelPicker.setDefaultDirectory(project.ppath)
-        self.pelPicker.setFilters(self.tr(
-            "Dictionary File (*.dic);;All Files (*)"))
-        
+        self.pelPicker.setFilters(self.tr("Dictionary File (*.dic);;All Files (*)"))
+
         self.project = project
         self.parent = parent
-        
+
         from QScintilla.SpellChecker import SpellChecker
+
         self.spellingComboBox.addItem(self.tr("<default>"))
-        self.spellingComboBox.addItems(
-            sorted(SpellChecker.getAvailableLanguages()))
-        
+        self.spellingComboBox.addItems(sorted(SpellChecker.getAvailableLanguages()))
+
         if not new:
             self.initDialog()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def initDialog(self):
         """
         Public method to initialize the dialogs data.
         """
-        index = self.spellingComboBox.findText(
-            self.project.pdata["SPELLLANGUAGE"])
+        index = self.spellingComboBox.findText(self.project.pdata["SPELLLANGUAGE"])
         if index == -1:
             index = 0
         self.spellingComboBox.setCurrentIndex(index)
@@ -68,20 +66,20 @@
             self.pwlPicker.setText(self.project.pdata["SPELLWORDS"])
         if self.project.pdata["SPELLEXCLUDES"]:
             self.pelPicker.setText(self.project.pdata["SPELLEXCLUDES"])
-    
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
         """
         if self.spellingComboBox.currentIndex() == 0:
-            self.project.pdata["SPELLLANGUAGE"] = (
-                Preferences.getEditor("SpellCheckingDefaultLanguage")
+            self.project.pdata["SPELLLANGUAGE"] = Preferences.getEditor(
+                "SpellCheckingDefaultLanguage"
             )
         else:
-            self.project.pdata["SPELLLANGUAGE"] = (
-                self.spellingComboBox.currentText()
-            )
+            self.project.pdata["SPELLLANGUAGE"] = self.spellingComboBox.currentText()
         self.project.pdata["SPELLWORDS"] = self.project.getRelativePath(
-            self.pwlPicker.text())
+            self.pwlPicker.text()
+        )
         self.project.pdata["SPELLEXCLUDES"] = self.project.getRelativePath(
-            self.pelPicker.text())
+            self.pelPicker.text()
+        )
--- a/src/eric7/Project/TranslationPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/TranslationPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,31 +25,32 @@
     """
     Class implementing the Translations Properties dialog.
     """
+
     def __init__(self, project, new, parent):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param new flag indicating the generation of a new project
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.transPatternPicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
         self.transPatternPicker.setDefaultDirectory(project.ppath)
         self.transBinPathPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.transBinPathPicker.setDefaultDirectory(project.ppath)
-        
+
         self.project = project
         self.parent = parent
-        
+
         self.exceptionCompleter = EricFileCompleter(self.exceptionEdit)
-        
+
         self.initFilters()
         if not new:
             self.initDialog()
-        
+
     def initFilters(self):
         """
         Public method to initialize the filters.
@@ -61,57 +62,57 @@
         for pattern, filetype in list(self.project.pdata["FILETYPES"].items()):
             if filetype in patterns:
                 patterns[filetype].append(pattern)
-        self.filters = self.tr("Source Files ({0});;"
-                               ).format(" ".join(patterns["SOURCES"]))
-        self.filters += self.tr("Forms Files ({0});;"
-                                ).format(" ".join(patterns["FORMS"]))
+        self.filters = self.tr("Source Files ({0});;").format(
+            " ".join(patterns["SOURCES"])
+        )
+        self.filters += self.tr("Forms Files ({0});;").format(
+            " ".join(patterns["FORMS"])
+        )
         self.filters += self.tr("All Files (*)")
-        
+
     def initDialog(self):
         """
         Public method to initialize the dialogs data.
         """
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        self.transPatternPicker.setText(
-            self.project.pdata["TRANSLATIONPATTERN"])
-        self.transBinPathPicker.setText(
-            self.project.pdata["TRANSLATIONSBINPATH"])
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+        self.transPatternPicker.setText(self.project.pdata["TRANSLATIONPATTERN"])
+        self.transBinPathPicker.setText(self.project.pdata["TRANSLATIONSBINPATH"])
         self.exceptionsList.clear()
         for texcept in self.project.pdata["TRANSLATIONEXCEPTIONS"]:
             if texcept:
                 self.exceptionsList.addItem(texcept)
-        
+
     @pyqtSlot(str)
     def on_transPatternPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a translation path.
-        
+
         @param path selected path
         @type str
         """
         self.transPatternPicker.setText(self.project.getRelativePath(path))
-        
+
     @pyqtSlot(str)
     def on_transPatternPicker_textChanged(self, txt):
         """
         Private slot to check the translation pattern for correctness.
-        
+
         @param txt text of the transPatternPicker line edit (string)
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            "%language%" in txt)
-        
+            "%language%" in txt
+        )
+
     @pyqtSlot(str)
     def on_transBinPathPicker_pathSelected(self, path):
         """
         Private slot handling the selection of a binary translations path.
-        
+
         @param path selected path
         @type str
         """
         self.transBinPathPicker.setText(self.project.getRelativePath(path))
-        
+
     @pyqtSlot()
     def on_deleteExceptionButton_clicked(self):
         """
@@ -122,7 +123,7 @@
         del itm
         row = self.exceptionsList.currentRow()
         self.on_exceptionsList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_addExceptionButton_clicked(self):
         """
@@ -131,8 +132,8 @@
         texcept = self.exceptionEdit.text()
         texcept = (
             texcept.replace(self.parent.getPPath() + os.sep, "")
-            if self.project.ppath == '' else
-            self.project.getRelativePath(texcept)
+            if self.project.ppath == ""
+            else self.project.getRelativePath(texcept)
         )
         if texcept.endswith(os.sep):
             texcept = texcept[:-1]
@@ -141,7 +142,7 @@
             self.exceptionEdit.clear()
         row = self.exceptionsList.currentRow()
         self.on_exceptionsList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_exceptFileButton_clicked(self):
         """
@@ -151,10 +152,11 @@
             self,
             self.tr("Exempt file from translation"),
             self.project.ppath,
-            self.filters)
+            self.filters,
+        )
         if texcept:
             self.exceptionEdit.setText(Utilities.toNativeSeparators(texcept))
-        
+
     @pyqtSlot()
     def on_exceptDirButton_clicked(self):
         """
@@ -164,30 +166,31 @@
             self,
             self.tr("Exempt directory from translation"),
             self.project.ppath,
-            EricFileDialog.ShowDirsOnly)
+            EricFileDialog.ShowDirsOnly,
+        )
         if texcept:
             self.exceptionEdit.setText(Utilities.toNativeSeparators(texcept))
-        
+
     def on_exceptionsList_currentRowChanged(self, row):
         """
         Private slot to handle the currentRowChanged signal of the exceptions
         list.
-        
+
         @param row the current row (integer)
         """
         if row == -1:
             self.deleteExceptionButton.setEnabled(False)
         else:
             self.deleteExceptionButton.setEnabled(True)
-        
+
     def on_exceptionEdit_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of the exception edit.
-        
+
         @param txt the text of the exception edit (string)
         """
         self.addExceptionButton.setEnabled(txt != "")
-        
+
     def storeData(self):
         """
         Public method to store the entered/modified data.
--- a/src/eric7/Project/UicCompilerOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/UicCompilerOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to enter some non-common uic compiler options.
     """
+
     def __init__(self, compilerOptions, compiler, parent=None):
         """
         Constructor
-        
+
         @param compilerOptions dictionary containing the uic compiler options
         @type dict
         @param compiler name of the uic compiler executable
@@ -29,21 +30,21 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.packageEdit.setText(compilerOptions["Package"])
         self.packageRootEdit.setText(compilerOptions["PackagesRoot"])
         self.suffixEdit.setText(compilerOptions["RcSuffix"])
-        
-        self.packageGroup.setEnabled('uic5' in compiler)
-        self.suffixGroup.setEnabled('uic6' not in compiler)
-        
+
+        self.packageGroup.setEnabled("uic5" in compiler)
+        self.suffixGroup.setEnabled("uic6" not in compiler)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the package, the rc-file suffix and the
             project relative root of the packages directory
         @rtype tuple of (str, str, str)
--- a/src/eric7/Project/UicLoadUi5.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/UicLoadUi5.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,7 +9,7 @@
 
 import sys
 import json
-import xml.etree.ElementTree            # secok
+import xml.etree.ElementTree  # secok
 import contextlib
 
 try:
@@ -24,27 +24,26 @@
     sys.exit(1)
 
 with contextlib.suppress(ImportError):
-    from PyQt5 import QtWebEngineWidgets    # __IGNORE_WARNING__
+    from PyQt5 import QtWebEngineWidgets  # __IGNORE_WARNING__
 
 
 def objectName(formFile, projectPath):
     """
     Function to get the object name of a form.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         print(dlg.objectName())
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -52,21 +51,20 @@
 def className(formFile, projectPath):
     """
     Function to get the class name of a form.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         print(dlg.metaObject().className())
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -75,47 +73,43 @@
     """
     Private function to map a type as reported by Qt's meta object to the
     correct Python type.
-    
+
     @param type_ type as reported by Qt
     @type QByteArray or bytes
     @return mapped Python type
     @rtype str
     """
     mapped = bytes(type_).decode()
-    
+
     # I. always check for *
     mapped = mapped.replace("*", "")
-    
+
     # 1. check for const
     mapped = mapped.replace("const ", "")
-    
+
     # 2. replace QString and QStringList
-    mapped = (
-        mapped
-        .replace("QStringList", "list")
-        .replace("QString", "str")
-    )
-    
+    mapped = mapped.replace("QStringList", "list").replace("QString", "str")
+
     # 3. replace double by float
     mapped = mapped.replace("double", "float")
-    
+
     return mapped
 
 
 def signatures(formFile, projectPath):
     """
     Function to get the signatures of form elements.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
+
     objectsList = []
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         objects = dlg.findChildren(QWidget) + dlg.findChildren(QAction)
@@ -124,51 +118,48 @@
             if not name or name.startswith("qt_"):
                 # ignore un-named or internal objects
                 continue
-            
+
             metaObject = obj.metaObject()
             objectDict = {
                 "name": name,
                 "class_name": metaObject.className(),
                 "methods": [],
             }
-            
+
             for index in range(metaObject.methodCount()):
                 metaMethod = metaObject.method(index)
                 if metaMethod.methodType() == QMetaMethod.MethodType.Signal:
-                    signatureDict = {
-                        "methods": []
-                    }
+                    signatureDict = {"methods": []}
                     signatureDict["signature"] = "on_{0}_{1}".format(
-                        name,
-                        bytes(metaMethod.methodSignature()).decode()
+                        name, bytes(metaMethod.methodSignature()).decode()
+                    )
+
+                    signatureDict["methods"].append(
+                        "on_{0}_{1}".format(
+                            name,
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                        )
                     )
-                    
-                    signatureDict["methods"].append("on_{0}_{1}".format(
-                        name,
-                        bytes(metaMethod.methodSignature())
-                        .decode().split("(")[0]
-                    ))
-                    signatureDict["methods"].append("{0}({1})".format(
-                        signatureDict["methods"][-1],
-                        ", ".join([
-                            __mapType(t)
-                            for t in metaMethod.parameterTypes()
-                        ])
-                    ))
-                    
-                    returnType = __mapType(
-                        metaMethod.typeName().encode())
-                    if returnType == 'void':
+                    signatureDict["methods"].append(
+                        "{0}({1})".format(
+                            signatureDict["methods"][-1],
+                            ", ".join(
+                                [__mapType(t) for t in metaMethod.parameterTypes()]
+                            ),
+                        )
+                    )
+
+                    returnType = __mapType(metaMethod.typeName().encode())
+                    if returnType == "void":
                         returnType = ""
                     signatureDict["return_type"] = returnType
                     parameterTypesList = [
-                        __mapType(t)
-                        for t in metaMethod.parameterTypes()
+                        __mapType(t) for t in metaMethod.parameterTypes()
                     ]
                     signatureDict["parameter_types"] = parameterTypesList
                     pyqtSignature = ", ".join(parameterTypesList)
                     signatureDict["pyqt_signature"] = pyqtSignature
-                    
+
                     parameterNames = metaMethod.parameterNames()
                     if parameterNames:
                         for index in range(len(parameterNames)):
@@ -176,32 +167,30 @@
                                 parameterNames[index] = QByteArray(
                                     "p{0:d}".format(index).encode("utf-8")
                                 )
-                    parameterNamesList = [bytes(n).decode()
-                                          for n in parameterNames]
+                    parameterNamesList = [bytes(n).decode() for n in parameterNames]
                     signatureDict["parameter_names"] = parameterNamesList
                     methNamesSig = ", ".join(parameterNamesList)
-                    
+
                     if methNamesSig:
                         pythonSignature = "on_{0}_{1}(self, {2})".format(
                             name,
-                            bytes(metaMethod.methodSignature())
-                            .decode().split("(")[0],
-                            methNamesSig)
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                            methNamesSig,
+                        )
                     else:
                         pythonSignature = "on_{0}_{1}(self)".format(
                             name,
-                            bytes(metaMethod.methodSignature())
-                            .decode().split("(")[0])
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                        )
                     signatureDict["python_signature"] = pythonSignature
-                    
+
                     objectDict["methods"].append(signatureDict)
-            
+
             objectsList.append(objectDict)
-        
+
         print(json.dumps(objectsList))
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -210,7 +199,7 @@
     if len(sys.argv) != 4:
         print("Wrong number of arguments.")
         sys.exit(1)
-    
+
     if sys.argv[1] == "object_name":
         objectName(sys.argv[2], sys.argv[3])
     elif sys.argv[1] == "class_name":
@@ -220,6 +209,6 @@
     else:
         print("Unknow operation given.")
         sys.exit(1)
-    
+
 #
 # eflag: noqa = M701, M801
--- a/src/eric7/Project/UicLoadUi6.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/UicLoadUi6.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,7 @@
 import os
 import sys
 import json
-import xml.etree.ElementTree            # secok
+import xml.etree.ElementTree  # secok
 import contextlib
 
 try:
@@ -26,7 +26,7 @@
     sys.exit(1)
 
 with contextlib.suppress(ImportError):
-    from PyQt6 import QtWebEngineWidgets    # __IGNORE_WARNING__
+    from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__
 
 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
 # add the eric package directory
@@ -35,21 +35,20 @@
 def objectName(formFile, projectPath):
     """
     Function to get the object name of a form.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         print(dlg.objectName())
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -57,21 +56,20 @@
 def className(formFile, projectPath):
     """
     Function to get the class name of a form.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         print(dlg.metaObject().className())
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -80,47 +78,43 @@
     """
     Private function to map a type as reported by Qt's meta object to the
     correct Python type.
-    
+
     @param type_ type as reported by Qt
     @type QByteArray or bytes
     @return mapped Python type
     @rtype str
     """
     mapped = bytes(type_).decode()
-    
+
     # I. always check for *
     mapped = mapped.replace("*", "")
-    
+
     # 1. check for const
     mapped = mapped.replace("const ", "")
-    
+
     # 2. replace QString and QStringList
-    mapped = (
-        mapped
-        .replace("QStringList", "list")
-        .replace("QString", "str")
-    )
-    
+    mapped = mapped.replace("QStringList", "list").replace("QString", "str")
+
     # 3. replace double by float
     mapped = mapped.replace("double", "float")
-    
+
     return mapped
 
 
 def signatures(formFile, projectPath):
     """
     Function to get the signatures of form elements.
-    
+
     @param formFile file name of the form
     @type str
     @param projectPath directory name of the project
     @type str
     """
     sys.path.append(projectPath)
-    
+
     objectsList = []
-    
-    app = QApplication([])      # __IGNORE_WARNING__
+
+    app = QApplication([])  # __IGNORE_WARNING__
     try:
         dlg = uic.loadUi(formFile, package=projectPath)
         objects = dlg.findChildren(QWidget) + dlg.findChildren(QAction)
@@ -129,51 +123,48 @@
             if not name or name.startswith("qt_"):
                 # ignore un-named or internal objects
                 continue
-            
+
             metaObject = obj.metaObject()
             objectDict = {
                 "name": name,
                 "class_name": metaObject.className(),
                 "methods": [],
             }
-            
+
             for index in range(metaObject.methodCount()):
                 metaMethod = metaObject.method(index)
                 if metaMethod.methodType() == QMetaMethod.MethodType.Signal:
-                    signatureDict = {
-                        "methods": []
-                    }
+                    signatureDict = {"methods": []}
                     signatureDict["signature"] = "on_{0}_{1}".format(
-                        name,
-                        bytes(metaMethod.methodSignature()).decode()
+                        name, bytes(metaMethod.methodSignature()).decode()
+                    )
+
+                    signatureDict["methods"].append(
+                        "on_{0}_{1}".format(
+                            name,
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                        )
                     )
-                    
-                    signatureDict["methods"].append("on_{0}_{1}".format(
-                        name,
-                        bytes(metaMethod.methodSignature())
-                        .decode().split("(")[0]
-                    ))
-                    signatureDict["methods"].append("{0}({1})".format(
-                        signatureDict["methods"][-1],
-                        ", ".join([
-                            __mapType(t)
-                            for t in metaMethod.parameterTypes()
-                        ])
-                    ))
-                    
-                    returnType = __mapType(
-                        metaMethod.typeName().encode())
-                    if returnType == 'void':
+                    signatureDict["methods"].append(
+                        "{0}({1})".format(
+                            signatureDict["methods"][-1],
+                            ", ".join(
+                                [__mapType(t) for t in metaMethod.parameterTypes()]
+                            ),
+                        )
+                    )
+
+                    returnType = __mapType(metaMethod.typeName().encode())
+                    if returnType == "void":
                         returnType = ""
                     signatureDict["return_type"] = returnType
                     parameterTypesList = [
-                        __mapType(t)
-                        for t in metaMethod.parameterTypes()
+                        __mapType(t) for t in metaMethod.parameterTypes()
                     ]
                     signatureDict["parameter_types"] = parameterTypesList
                     pyqtSignature = ", ".join(parameterTypesList)
                     signatureDict["pyqt_signature"] = pyqtSignature
-                    
+
                     parameterNames = metaMethod.parameterNames()
                     if parameterNames:
                         for index in range(len(parameterNames)):
@@ -181,32 +172,30 @@
                                 parameterNames[index] = QByteArray(
                                     "p{0:d}".format(index).encode("utf-8")
                                 )
-                    parameterNamesList = [bytes(n).decode()
-                                          for n in parameterNames]
+                    parameterNamesList = [bytes(n).decode() for n in parameterNames]
                     signatureDict["parameter_names"] = parameterNamesList
                     methNamesSig = ", ".join(parameterNamesList)
-                    
+
                     if methNamesSig:
                         pythonSignature = "on_{0}_{1}(self, {2})".format(
                             name,
-                            bytes(metaMethod.methodSignature())
-                            .decode().split("(")[0],
-                            methNamesSig)
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                            methNamesSig,
+                        )
                     else:
                         pythonSignature = "on_{0}_{1}(self)".format(
                             name,
-                            bytes(metaMethod.methodSignature())
-                            .decode().split("(")[0])
+                            bytes(metaMethod.methodSignature()).decode().split("(")[0],
+                        )
                     signatureDict["python_signature"] = pythonSignature
-                    
+
                     objectDict["methods"].append(signatureDict)
-            
+
             objectsList.append(objectDict)
-        
+
         print(json.dumps(objectsList))
         sys.exit(0)
-    except (AttributeError, ImportError,
-            xml.etree.ElementTree.ParseError) as err:
+    except (AttributeError, ImportError, xml.etree.ElementTree.ParseError) as err:
         print(str(err))
         sys.exit(1)
 
@@ -215,7 +204,7 @@
     if len(sys.argv) != 4:
         print("Wrong number of arguments.")
         sys.exit(1)
-    
+
     if sys.argv[1] == "object_name":
         objectName(sys.argv[2], sys.argv[3])
     elif sys.argv[1] == "class_name":
@@ -225,6 +214,6 @@
     else:
         print("Unknow operation given.")
         sys.exit(1)
-    
+
 #
 # eflag: noqa = M701, M801
--- a/src/eric7/Project/UserProjectFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/UserProjectFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,10 +25,11 @@
     """
     Class representing the user project JSON file.
     """
+
     def __init__(self, project: Project, parent: QObject = None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent reference to the parent object (defaults to None)
@@ -36,12 +37,12 @@
         """
         super().__init__(parent)
         self.__project = project
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the user project data to a user project
         JSON file.
-        
+
         @param filename name of the user project file
         @type str
         @return flag indicating a successful write
@@ -50,16 +51,15 @@
         userProjectDict = {}
         userProjectDict["header"] = {
             "comment": "eric user project file for project {0}".format(
-                self.__project.getProjectName()),
+                self.__project.getProjectName()
+            ),
         }
-        
+
         if Preferences.getProject("TimestampFile"):
-            userProjectDict["header"]["saved"] = (
-                time.strftime('%Y-%m-%d, %H:%M:%S')
-            )
-        
+            userProjectDict["header"]["saved"] = time.strftime("%Y-%m-%d, %H:%M:%S")
+
         userProjectDict["user_data"] = self.__project.pudata
-        
+
         try:
             jsonString = json.dumps(userProjectDict, indent=2)
             with open(filename, "w") as f:
@@ -73,17 +73,17 @@
                         "<p>The user specific project properties file"
                         " <b>{0}</b> could not be written.</p>"
                         "<p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the user project data from a user project
         JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful read
@@ -100,10 +100,10 @@
                 self.tr(
                     "<p>The user specific project properties file <b>{0}</b>"
                     " could not be read.</p><p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         self.__project.pudata = userProjectDict["user_data"]
-        
+
         return True
--- a/src/eric7/Project/UserPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Project/UserPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing the user specific project properties dialog.
     """
+
     def __init__(self, project, parent=None, name=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @param parent parent widget of this dialog (QWidget)
         @param name name of this dialog (string)
@@ -32,36 +33,36 @@
         if name:
             self.setObjectName(name)
         self.setupUi(self)
-        
+
         self.project = project
-        
+
         if self.project.pudata["VCSSTATUSMONITORINTERVAL"]:
             self.vcsStatusMonitorIntervalSpinBox.setValue(
-                self.project.pudata["VCSSTATUSMONITORINTERVAL"])
+                self.project.pudata["VCSSTATUSMONITORINTERVAL"]
+            )
         else:
             self.vcsStatusMonitorIntervalSpinBox.setValue(
-                Preferences.getVCS("StatusMonitorInterval"))
-        
+                Preferences.getVCS("StatusMonitorInterval")
+            )
+
         enableVcsGroup = False
         if self.project.pdata["VCS"]:
             found = False
             for _indicator, vcsData in (
-                ericApp().getObject("PluginManager")
-                .getVcsSystemIndicators().items()
+                ericApp().getObject("PluginManager").getVcsSystemIndicators().items()
             ):
                 for vcsSystem, _vcsSystemDisplay in vcsData:
                     if vcsSystem == self.project.pdata["VCS"]:
                         found = True
                         break
-                
+
                 if found:
                     for vcsSystem, vcsSystemDisplay in vcsData:
-                        self.vcsInterfaceCombo.addItem(
-                            vcsSystemDisplay, vcsSystem)
+                        self.vcsInterfaceCombo.addItem(vcsSystemDisplay, vcsSystem)
                     enableVcsGroup = len(vcsData) > 1
                     break
         self.vcsGroup.setEnabled(enableVcsGroup)
-        
+
         if self.vcsGroup.isEnabled():
             if self.project.pudata["VCSOVERRIDE"]:
                 vcsSystem = self.project.pudata["VCSOVERRIDE"]
@@ -71,7 +72,7 @@
             if index == -1:
                 index = 0
             self.vcsInterfaceCombo.setCurrentIndex(index)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
 
@@ -80,19 +81,15 @@
         Public method to store the entered/modified data.
         """
         vcsStatusMonitorInterval = self.vcsStatusMonitorIntervalSpinBox.value()
-        if (
-            vcsStatusMonitorInterval !=
-                Preferences.getVCS("StatusMonitorInterval")
-        ):
-            self.project.pudata["VCSSTATUSMONITORINTERVAL"] = (
-                vcsStatusMonitorInterval
-            )
+        if vcsStatusMonitorInterval != Preferences.getVCS("StatusMonitorInterval"):
+            self.project.pudata["VCSSTATUSMONITORINTERVAL"] = vcsStatusMonitorInterval
         else:
             self.project.pudata["VCSSTATUSMONITORINTERVAL"] = 0
-        
+
         if self.vcsGroup.isEnabled():
             vcsSystem = self.vcsInterfaceCombo.itemData(
-                self.vcsInterfaceCombo.currentIndex())
+                self.vcsInterfaceCombo.currentIndex()
+            )
             if self.vcsInterfaceDefaultCheckBox.isChecked():
                 if vcsSystem != self.project.pdata["VCS"]:
                     self.project.pdata["VCS"] = vcsSystem
--- a/src/eric7/QScintilla/APIsManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/APIsManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 class APIs(QObject):
     """
     Class implementing an API storage entity.
-    
+
     @signal apiPreparationFinished() emitted after the API preparation has
         finished
     @signal apiPreparationCancelled() emitted after the API preparation has
@@ -29,15 +29,15 @@
     @signal apiPreparationStarted() emitted after the API preparation has
         started
     """
+
     apiPreparationFinished = pyqtSignal()
     apiPreparationCancelled = pyqtSignal()
     apiPreparationStarted = pyqtSignal()
-    
-    def __init__(self, language, projectType="", forPreparation=False,
-                 parent=None):
+
+    def __init__(self, language, projectType="", forPreparation=False, parent=None):
         """
         Constructor
-        
+
         @param language language of the APIs object
         @type str
         @param projectType type of the project
@@ -53,79 +53,63 @@
             self.setObjectName("APIs_{0}_{1}".format(language, projectType))
         else:
             self.setObjectName("APIs_{0}".format(language))
-        
+
         self.__inPreparation = False
         self.__language = language
         self.__projectType = projectType
         self.__forPreparation = forPreparation
         self.__lexer = Lexers.getLexer(self.__language)
-        self.__apifiles = Preferences.getEditorAPI(self.__language,
-                                                   self.__projectType)
+        self.__apifiles = Preferences.getEditorAPI(self.__language, self.__projectType)
         self.__apifiles.sort()
         if self.__lexer is None:
             self.__apis = None
         else:
             self.__apis = QsciAPIs(self.__lexer)
-            self.__apis.apiPreparationFinished.connect(
-                self.__apiPreparationFinished)
-            self.__apis.apiPreparationCancelled.connect(
-                self.__apiPreparationCancelled)
-            self.__apis.apiPreparationStarted.connect(
-                self.__apiPreparationStarted)
+            self.__apis.apiPreparationFinished.connect(self.__apiPreparationFinished)
+            self.__apis.apiPreparationCancelled.connect(self.__apiPreparationCancelled)
+            self.__apis.apiPreparationStarted.connect(self.__apiPreparationStarted)
             self.__loadAPIs()
-        
+
     def __loadAPIs(self):
         """
         Private method to load the APIs.
         """
         if self.__apis.isPrepared():
             # load a prepared API file
-            if (
-                not self.__forPreparation and
-                Preferences.getEditor("AutoPrepareAPIs")
-            ):
+            if not self.__forPreparation and Preferences.getEditor("AutoPrepareAPIs"):
                 self.prepareAPIs()
             self.__apis.loadPrepared(self.__preparedName())
         else:
             # load the raw files and prepare the API file
-            if (
-                not self.__forPreparation and
-                Preferences.getEditor("AutoPrepareAPIs")
-            ):
+            if not self.__forPreparation and Preferences.getEditor("AutoPrepareAPIs"):
                 self.prepareAPIs(ondemand=True)
-    
+
     def reloadAPIs(self):
         """
         Public method to reload the API information.
         """
-        if (
-            not self.__forPreparation and
-            Preferences.getEditor("AutoPrepareAPIs")
-        ):
+        if not self.__forPreparation and Preferences.getEditor("AutoPrepareAPIs"):
             self.prepareAPIs()
         self.__loadAPIs()
-    
+
     def getQsciAPIs(self):
         """
         Public method to get a reference to QsciAPIs object.
-        
+
         @return reference to the QsciAPIs object (QsciAPIs)
         """
-        if (
-            not self.__forPreparation and
-            Preferences.getEditor("AutoPrepareAPIs")
-        ):
+        if not self.__forPreparation and Preferences.getEditor("AutoPrepareAPIs"):
             self.prepareAPIs()
         return self.__apis
-    
+
     def isEmpty(self):
         """
         Public method to check, if the object has API files configured.
-        
+
         @return flag indicating no API files have been configured (boolean)
         """
         return len(self.__apifiles) == 0
-    
+
     def __apiPreparationFinished(self):
         """
         Private method called to save an API, after it has been prepared.
@@ -133,7 +117,7 @@
         self.__apis.savePrepared(self.__preparedName())
         self.__inPreparation = False
         self.apiPreparationFinished.emit()
-    
+
     def __apiPreparationCancelled(self):
         """
         Private method called, after the API preparation process has been
@@ -141,24 +125,24 @@
         """
         self.__inPreparation = False
         self.apiPreparationCancelled.emit()
-    
+
     def __apiPreparationStarted(self):
         """
         Private method called, when the API preparation process started.
         """
         self.__inPreparation = True
         self.apiPreparationStarted.emit()
-    
+
     def prepareAPIs(self, ondemand=False, rawList=None):
         """
         Public method to prepare the APIs if necessary.
-        
+
         @param ondemand flag indicating a requested preparation (boolean)
         @param rawList list of raw API files (list of strings)
         """
         if self.__apis is None or self.__inPreparation:
             return
-        
+
         needsPreparation = False
         if ondemand:
             needsPreparation = True
@@ -171,117 +155,114 @@
                     needsPreparation = True
                 else:
                     preparedAPIsModified = preparedPath.stat().st_mtime
-                    apifiles = sorted(Preferences.getEditorAPI(
-                        self.__language, self.__projectType))
+                    apifiles = sorted(
+                        Preferences.getEditorAPI(self.__language, self.__projectType)
+                    )
                     if self.__apifiles != apifiles:
                         needsPreparation = True
                     for apifile in apifiles:
                         apifilePath = pathlib.Path(apifile)
                         if (
-                            apifilePath.exists() and
-                            apifilePath.stat().st_mtime >
-                            preparedAPIsModified
+                            apifilePath.exists()
+                            and apifilePath.stat().st_mtime > preparedAPIsModified
                         ):
                             needsPreparation = True
                             break
-        
+
         if needsPreparation:
             # do the preparation
             self.__apis.clear()
             if rawList:
                 apifiles = rawList
             else:
-                apifiles = Preferences.getEditorAPI(
-                    self.__language, self.__projectType)
+                apifiles = Preferences.getEditorAPI(self.__language, self.__projectType)
             for apifile in apifiles:
                 self.__apis.load(apifile)
             self.__apis.prepare()
             self.__apifiles = apifiles
-    
+
     def cancelPreparation(self):
         """
         Public slot to cancel the APIs preparation.
         """
         self.__apis and self.__apis.cancelPreparation()
-    
+
     def installedAPIFiles(self):
         """
         Public method to get a list of installed API files.
-        
+
         @return list of installed API files (list of strings)
         """
         if self.__apis is not None:
             if Globals.isWindowsPlatform():
-                qsciPath = os.path.join(
-                    Globals.getPyQt6ModulesDirectory(), "qsci")
+                qsciPath = os.path.join(Globals.getPyQt6ModulesDirectory(), "qsci")
                 if os.path.exists(qsciPath):
                     # it's the installer
                     if self.__lexer.lexerName() is not None:
-                        apidir = os.path.join(qsciPath, "api",
-                                              self.__lexer.lexerName())
+                        apidir = os.path.join(qsciPath, "api", self.__lexer.lexerName())
                         fnames = []
                         filist = QDir(apidir).entryInfoList(
-                            ["*.api"], QDir.Filter.Files,
-                            QDir.SortFlag.IgnoreCase)
+                            ["*.api"], QDir.Filter.Files, QDir.SortFlag.IgnoreCase
+                        )
                         for fi in filist:
                             fnames.append(fi.absoluteFilePath())
                         return fnames
                     else:
                         return []
-            
+
             return self.__apis.installedAPIFiles()
         else:
             return []
-    
+
     def __preparedName(self):
         """
         Private method returning the default name of a prepared API file.
-        
+
         @return complete filename for the Prepared APIs file (string)
         """
         apisDir = os.path.join(Globals.getConfigDir(), "APIs")
         if self.__apis is not None:
             if self.__projectType:
-                filename = "{0}_{1}.pap".format(self.__language,
-                                                self.__projectType)
+                filename = "{0}_{1}.pap".format(self.__language, self.__projectType)
             else:
                 filename = "{0}.pap".format(self.__language)
             return os.path.join(apisDir, filename)
         else:
             return ""
-    
+
 
 class APIsManager(QObject):
     """
     Class implementing the APIsManager class, which is the central store for
     API information used by autocompletion and calltips.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
         self.setObjectName("APIsManager")
-        
+
         self.__apis = {}
-    
+
     def reloadAPIs(self):
         """
         Public slot to reload the api information.
         """
         for api in list(self.__apis.values()):
             api and api.reloadAPIs()
-    
+
     def getAPIs(self, language, projectType="", forPreparation=False):
         """
         Public method to get an APIs object for autocompletion/calltips.
-        
+
         This method creates and loads an APIs object dynamically upon request.
         This saves memory for languages, that might not be needed at the
         moment.
-        
+
         @param language language of the requested APIs object
         @type str
         @param projectType type of the project
@@ -293,8 +274,9 @@
         @rtype APIs
         """
         if forPreparation:
-            return APIs(language, projectType=projectType,
-                        forPreparation=forPreparation)
+            return APIs(
+                language, projectType=projectType, forPreparation=forPreparation
+            )
         else:
             try:
                 return self.__apis[(language, projectType)]
@@ -302,7 +284,8 @@
                 if language in Lexers.getSupportedApiLanguages():
                     # create the api object
                     self.__apis[(language, projectType)] = APIs(
-                        language, projectType=projectType)
+                        language, projectType=projectType
+                    )
                     return self.__apis[(language, projectType)]
                 else:
                     return None
--- a/src/eric7/QScintilla/DocstringGenerator/BaseDocstringGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/BaseDocstringGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,15 +20,15 @@
 def getIndentStr(text):
     """
     Function to get the indentation of a text.
-    
+
     @param text text to extract indentation from
     @type str
     @return indentation string
     @rtype str
     """
-    indent = ''
+    indent = ""
 
-    ret = re.match(r'(\s*)', text)
+    ret = re.match(r"(\s*)", text)
     if ret:
         indent = ret.group(1)
 
@@ -39,20 +39,21 @@
     """
     Class implementing a docstring generator base class.
     """
+
     def __init__(self, editor):
         """
         Constructor
-        
+
         @param editor reference to the editor widget
         @type Editor
         """
         self.editor = editor
-    
+
     def isFunctionStart(self, text):
         """
         Public method to test, if a text is the start of a function or method
         definition.
-        
+
         @param text line of text to be tested
         @type str
         @return flag indicating that the given text starts a function or
@@ -60,36 +61,36 @@
         @rtype bool
         """
         return False
-    
+
     def hasFunctionDefinition(self, cursorPosition):
         """
         Public method to test, if the cursor is right below a function
         definition.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         @return flag indicating cursor is right below a function definition
         @rtype bool
         """
         return False
-    
+
     def isDocstringIntro(self, cursorPosition):
         """
         Public function to test, if the line up to the cursor position might be
         introducing a docstring.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         @return flag indicating a potential start of a docstring
         @rtype bool
         """
         return False
-    
+
     def insertDocstring(self, cursorPosition, fromStart=True):
         """
         Public method to insert a docstring for the function at the cursor
         position.
-        
+
         @param cursorPosition position of the cursor (line and index)
         @type tuple of (int, int)
         @param fromStart flag indicating that the editor text cursor is placed
@@ -98,47 +99,43 @@
         """
         # just do nothing in the base class
         return
-    
+
     def insertDocstringFromShortcut(self, cursorPosition):
         """
         Public method to insert a docstring for the function at the cursor
         position initiated via a keyboard shortcut.
-        
+
         @param cursorPosition position of the cursor (line and index)
         @type tuple of (int, int)
         """
         # just do nothing in the base class
         return
-    
+
     def getDocstringType(self):
         """
         Public method to determine the docstring type to be generated.
-        
+
         @return docstring type (one of 'ericdoc', 'numpydoc', 'googledoc',
             'sphinxdoc')
         @rtype str
         """
         docstringStyle = ""
-        
+
         project = ericApp().getObject("Project")
         filename = self.editor.getFileName()
-        if (
-            filename and
-            project.isOpen() and
-            project.isProjectFile(filename)
-        ):
+        if filename and project.isOpen() and project.isProjectFile(filename):
             docstringStyle = project.getDocstringType().lower()
-        
+
         if docstringStyle == "":
             docstringStyle = Preferences.getEditor("DocstringType")
-        
+
         return docstringStyle
-    
+
     def _generateDocstringList(self, functionInfo, docstringType):
         """
         Protected method to generate type specific docstrings based on the
         extracted function information.
-        
+
         @param functionInfo reference to the function info object
         @type FunctionInfo
         @param docstringType kind of docstring to be generated
@@ -147,15 +144,19 @@
         """
         if docstringType == "ericdoc":
             from .EricdocGenerator import generateEricDoc
+
             return generateEricDoc(functionInfo)
         elif docstringType == "numpydoc":
             from .NumpydocGenerator import generateNumpyDoc
+
             return generateNumpyDoc(functionInfo)
         elif docstringType == "googledoc":
             from .GoogledocGenerator import generateGoogleDoc
+
             return generateGoogleDoc(functionInfo, self.editor)
         elif docstringType == "sphinxdoc":
             from .SphinxdocGenerator import generateSphinxDoc
+
             return generateSphinxDoc(functionInfo)
         else:
             return []
@@ -164,10 +165,11 @@
 class FunctionInfo:
     """
     Class implementing an object to store function information.
-    
+
     Methods to extract the relevant information need to be implemented in
     language specific subclasses.
     """
+
     def __init__(self):
         """
         Constructor
@@ -175,7 +177,7 @@
         self.hasInfo = False
         self.funcionText = ""
         self.argumentsText = ""
-        
+
         self.functionIndent = ""
         # indentation fo function definition
         self.argumentsList = []
@@ -203,14 +205,15 @@
 class DocstringMenuForEnterOnly(QMenu):
     """
     Class implementing a special menu reacting to the enter/return keys only.
-    
+
     If a keyboard input is not the "enter key", the menu is closed and the
     input is inserted to the code editor.
     """
+
     def __init__(self, editor):
         """
         Constructor
-        
+
         @param editor reference to the editor
         @type Editor
         """
@@ -220,7 +223,7 @@
     def keyPressEvent(self, evt):
         """
         Protected method to handle key press events.
-        
+
         @param evt reference to the key press event object
         @type QKeyEvent
         """
--- a/src/eric7/QScintilla/DocstringGenerator/EricdocGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/EricdocGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,10 +11,10 @@
 def generateEricDoc(functionInfo):
     """
     Function to generate the docstring line list iaw. eric documentation style.
-    
+
     Note: Partial English text is created with DESCRIPTION placeholders
     for descriptions and TYPE placeholders for type information
-    
+
     @param functionInfo object containing the function information to base
         the docstring on
     @type FunctionInfo
@@ -23,7 +23,7 @@
     """
     # __IGNORE_WARNING_D202__
     lines = []
-    
+
     # create a basic/partial function description
     if functionInfo.functionType == "classmethod":
         descr = "Class method "
@@ -42,10 +42,11 @@
             descr = "Special "
         else:
             descr = ""
-        
-        if (
-            len(functionInfo.argumentsList) > 0 and
-            functionInfo.argumentsList[0][0] in ("self", "cls", "this")
+
+        if len(functionInfo.argumentsList) > 0 and functionInfo.argumentsList[0][0] in (
+            "self",
+            "cls",
+            "this",
         ):
             if functionInfo.isAsync:
                 descr += "coroutine "
@@ -61,48 +62,49 @@
             else:
                 descr = "Function "
     lines.append(descr)
-    
+
     # remove 'self', 'this' or 'cls' from arguments list
-    if (
-        len(functionInfo.argumentsList) > 0 and
-        functionInfo.argumentsList[0][0] in ("self", "cls", "this")
+    if len(functionInfo.argumentsList) > 0 and functionInfo.argumentsList[0][0] in (
+        "self",
+        "cls",
+        "this",
     ):
         del functionInfo.argumentsList[0]
-    
+
     # add an empty line if there is one of the other sections
     if (
-        functionInfo.argumentsList or
-        functionInfo.hasYield or
-        functionInfo.returnTypeAnnotated or
-        functionInfo.returnValueInBody or
-        functionInfo.raiseList
+        functionInfo.argumentsList
+        or functionInfo.hasYield
+        or functionInfo.returnTypeAnnotated
+        or functionInfo.returnValueInBody
+        or functionInfo.raiseList
     ):
         lines.append("")
-    
+
     # add the parameters section
     tag = "@param"
     for argName, argType, argValue in functionInfo.argumentsList:
         if argName == "*":
             tag = "@keyparam"
             continue
-        
+
         argLine = "{0} {1} DESCRIPTION".format(tag, argName)
         if argValue:
             argLine += " (defaults to {0})".format(argValue)
         lines.append(argLine)
-        
+
         if argType is None:
             argType = "TYPE"
         argLine = "@type {0}".format(argType)
         if argValue:
             argLine += " (optional)"
         lines.append(argLine)
-    
+
     # add return section
     if (
-        functionInfo.hasYield or
-        functionInfo.returnValueInBody or
-        functionInfo.returnTypeAnnotated
+        functionInfo.hasYield
+        or functionInfo.returnValueInBody
+        or functionInfo.returnTypeAnnotated
     ):
         if functionInfo.hasYield:
             lines.append("@yield DESCRIPTION")
@@ -111,14 +113,13 @@
             lines.append("@return DESCRIPTION")
             rType = "@rtype"
         if functionInfo.returnTypeAnnotated:
-            lines.append("{0} {1}".format(
-                rType, functionInfo.returnTypeAnnotated))
+            lines.append("{0} {1}".format(rType, functionInfo.returnTypeAnnotated))
         else:
             lines.append("{0} TYPE".format(rType))
-    
+
     # add an exceptions section, if function raises something
     if functionInfo.raiseList:
         for exc in sorted(functionInfo.raiseList):
             lines.append("@exception {0} DESCRIPTION".format(exc))
-    
+
     return lines
--- a/src/eric7/QScintilla/DocstringGenerator/GoogledocGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/GoogledocGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,10 @@
     """
     Function to generate the docstring line list iaw. Sphinx documentation
     style.
-    
+
     Note: Text is created with DESCRIPTION placeholders for descriptions and
     TYPE placeholders for type information
-    
+
     @param functionInfo object containing the function information to base
         the docstring on
     @type FunctionInfo
@@ -26,23 +26,24 @@
     """
     # __IGNORE_WARNING_D202__
     lines = []
-    
+
     # function description
     lines.append("")
-    
+
     # remove 'self', 'this' or 'cls' from arguments list
-    if (
-        len(functionInfo.argumentsList) > 0 and
-        functionInfo.argumentsList[0][0] in ("self", "cls", "this")
+    if len(functionInfo.argumentsList) > 0 and functionInfo.argumentsList[0][0] in (
+        "self",
+        "cls",
+        "this",
     ):
         del functionInfo.argumentsList[0]
-    
+
     # determine additional indentation string
     indentWidth = editor.indentationWidth()
     if indentWidth == 0:
         indentWidth = editor.tabWidth()
     indent = indentWidth * " "
-    
+
     # add the parameters section
     if functionInfo.argumentsList:
         lines.append("")
@@ -63,7 +64,7 @@
             if argValue:
                 argLine += " Defaults to {0}.".format(argValue)
             lines.append(argLine)
-    
+
     # add return section
     lines.append("")
     if functionInfo.hasYield:
@@ -71,18 +72,19 @@
     else:
         lines.append("Returns:")
     if functionInfo.returnTypeAnnotated:
-        lines.append("{0}{1}: DESCRIPTION".format(
-            indent, functionInfo.returnTypeAnnotated))
+        lines.append(
+            "{0}{1}: DESCRIPTION".format(indent, functionInfo.returnTypeAnnotated)
+        )
     elif functionInfo.returnValueInBody:
         lines.append("{0}TYPE: DESCRIPTION")
     else:
         lines.append("{0}None".format(indent))
-    
+
     # add an exceptions section, if function raises something
     if functionInfo.raiseList:
         lines.append("")
         lines.append("Raises:")
         for exc in sorted(functionInfo.raiseList):
             lines.append("{0}{1}: DESCRIPTION".format(indent, exc))
-    
+
     return lines
--- a/src/eric7/QScintilla/DocstringGenerator/NumpydocGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/NumpydocGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,10 @@
     """
     Function to generate the docstring line list iaw. NumPy documentation
     style.
-    
+
     Note: Text is created with DESCRIPTION placeholders for descriptions and
     TYPE placeholders for type information
-    
+
     @param functionInfo object containing the function information to base
         the docstring on
     @type FunctionInfo
@@ -26,23 +26,24 @@
     """
     # __IGNORE_WARNING_D202__
     lines = []
-    
+
     # function description
     lines.append("")
-    
+
     # remove 'self', 'this' or 'cls' from arguments list
-    if (
-        len(functionInfo.argumentsList) > 0 and
-        functionInfo.argumentsList[0][0] in ("self", "cls", "this")
+    if len(functionInfo.argumentsList) > 0 and functionInfo.argumentsList[0][0] in (
+        "self",
+        "cls",
+        "this",
     ):
         del functionInfo.argumentsList[0]
-    
+
     # determine additional indentation string
     indentWidth = editor.indentationWidth()
     if indentWidth == 0:
         indentWidth = editor.tabWidth()
     indent = indentWidth * " "
-    
+
     # add the parameters section
     if functionInfo.argumentsList:
         lines.append("")
@@ -61,7 +62,7 @@
             if argValue:
                 argLine += " The default is {0}".format(argValue)
             lines.append(argLine)
-    
+
     # add an exceptions section, if function raises something
     if functionInfo.raiseList:
         lines.append("")
@@ -70,7 +71,7 @@
         for exc in sorted(functionInfo.raiseList):
             lines.append("{0}".format(exc))
             lines.append("{0}DESCRIPTION".format(indent))
-    
+
     # add return section
     lines.append("")
     if functionInfo.hasYield:
@@ -87,5 +88,5 @@
         lines.append("{0}DESCRIPTION.".format(indent))
     else:
         lines.append("{0}None".format(indent))
-    
+
     return lines
--- a/src/eric7/QScintilla/DocstringGenerator/PyDocstringGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/PyDocstringGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,32 +10,31 @@
 import re
 import collections
 
-from .BaseDocstringGenerator import (
-    BaseDocstringGenerator, FunctionInfo, getIndentStr
-)
+from .BaseDocstringGenerator import BaseDocstringGenerator, FunctionInfo, getIndentStr
 
 
 class PyDocstringGenerator(BaseDocstringGenerator):
     """
     Class implementing a docstring generator for Python.
     """
+
     def __init__(self, editor):
         """
         Constructor
-        
+
         @param editor reference to the editor widget
         @type Editor
         """
         super().__init__(editor)
-        
+
         self.__quote3 = '"""'
         self.__quote3Alternate = "'''"
-    
+
     def isFunctionStart(self, text):
         """
         Public method to test, if a text is the start of a function or method
         definition.
-        
+
         @param text line of text to be tested
         @type str
         @return flag indicating that the given text starts a function or
@@ -46,28 +45,26 @@
             text = text.lstrip()
             if text.startswith(("def", "async def")):
                 return True
-        
+
         return False
-    
+
     def hasFunctionDefinition(self, cursorPosition):
         """
         Public method to test, if the cursor is right below a function
         definition.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         @return flag indicating cursor is right below a function definition
         @rtype bool
         """
-        return (
-            self.__getFunctionDefinitionFromBelow(cursorPosition) is not None
-        )
-    
+        return self.__getFunctionDefinitionFromBelow(cursorPosition) is not None
+
     def isDocstringIntro(self, cursorPosition):
         """
         Public function to test, if the line up to the cursor position might be
         introducing a docstring.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         @return flag indicating a potential start of a docstring
@@ -76,12 +73,12 @@
         cline, cindex = cursorPosition
         lineToCursor = self.editor.text(cline)[:cindex]
         return self.__isTripleQuotesStart(lineToCursor)
-    
+
     def __isTripleQuotesStart(self, text):
         """
         Private method to test, if the given text is the start of a triple
         quoted string.
-        
+
         @param text text to be inspected
         @type str
         @return flag indicating a triple quote start
@@ -92,12 +89,12 @@
             return True
 
         return False
-    
+
     def insertDocstring(self, cursorPosition, fromStart=True):
         """
         Public method to insert a docstring for the function at the cursor
         position.
-        
+
         @param cursorPosition position of the cursor (line and index)
         @type tuple of (int, int)
         @param fromStart flag indicating that the editor text cursor is placed
@@ -106,45 +103,42 @@
         """
         if fromStart:
             self.__functionStartLine = cursorPosition[0]
-            docstring, insertPos, newCursorLine = (
-                self.__generateDocstringFromStart()
-            )
+            docstring, insertPos, newCursorLine = self.__generateDocstringFromStart()
         else:
-            docstring, insertPos, newCursorLine = (
-                self.__generateDocstringFromBelow(cursorPosition)
+            docstring, insertPos, newCursorLine = self.__generateDocstringFromBelow(
+                cursorPosition
             )
-        
+
         if docstring:
             self.editor.beginUndoAction()
             self.editor.insertAt(docstring, *insertPos)
-            
+
             if not fromStart:
                 # correct triple quote indentation if neccessary
-                functionIndent = self.editor.indentation(
-                    self.__functionStartLine)
+                functionIndent = self.editor.indentation(self.__functionStartLine)
                 quoteIndent = self.editor.indentation(insertPos[0])
-                
+
                 # step 1: unindent quote line until indentation is zero
                 while quoteIndent > 0:
                     self.editor.unindent(insertPos[0])
                     quoteIndent = self.editor.indentation(insertPos[0])
-                
+
                 # step 2: indent quote line until indentation is one greater
                 # than function definition line
                 while quoteIndent <= functionIndent:
                     self.editor.indent(insertPos[0])
                     quoteIndent = self.editor.indentation(insertPos[0])
-            
+
             self.editor.endUndoAction()
             self.editor.setCursorPosition(
                 newCursorLine, len(self.editor.text(newCursorLine)) - 1
             )
-    
+
     def insertDocstringFromShortcut(self, cursorPosition):
         """
         Public method to insert a docstring for the function at the cursor
         position initiated via a keyboard shortcut.
-        
+
         @param cursorPosition position of the cursor (line and index)
         @type tuple of (int, int)
         """
@@ -162,10 +156,8 @@
             # neither after the function definition nor at the start
             # just do nothing
             return
-        
-        docstring, insertPos, newCursorLine = (
-            self.__generateDocstringFromStart()
-        )
+
+        docstring, insertPos, newCursorLine = self.__generateDocstringFromStart()
         if docstring:
             self.editor.beginUndoAction()
             self.editor.insertAt(docstring, *insertPos)
@@ -173,11 +165,11 @@
             self.editor.setCursorPosition(
                 newCursorLine, len(self.editor.text(newCursorLine)) - 1
             )
-    
+
     def __getIndentationInsertString(self, text):
         """
         Private method to create the indentation string for the docstring.
-        
+
         @param text text to based the indentation on
         @type str
         @return indentation string for docstring
@@ -187,19 +179,19 @@
         indentWidth = self.editor.indentationWidth()
         if indentWidth == 0:
             indentWidth = self.editor.tabWidth()
-        
+
         return indent + indentWidth * " "
-    
+
     #######################################################################
     ## Methods to generate the docstring when the text cursor is on the
     ## line starting the function definition.
     #######################################################################
-    
+
     def __generateDocstringFromStart(self):
         """
         Private method to generate a docstring based on the cursor being
         placed on the first line of the definition.
-        
+
         @return tuple containing the docstring and a tuple containing the
             insertion line and index
         @rtype tuple of (str, tuple(int, int))
@@ -207,15 +199,13 @@
         result = self.__getFunctionDefinitionFromStart()
         if result:
             functionDefinition, functionDefinitionLength = result
-            
+
             insertLine = self.__functionStartLine + functionDefinitionLength
             indentation = self.__getIndentationInsertString(functionDefinition)
             sep = self.editor.getLineSeparator()
             bodyStart = insertLine
-            
-            docstringList = self.__generateDocstring(
-                '"', functionDefinition, bodyStart
-            )
+
+            docstringList = self.__generateDocstring('"', functionDefinition, bodyStart)
             if docstringList:
                 if self.getDocstringType() == "ericdoc":
                     docstringList.insert(0, self.__quote3)
@@ -225,104 +215,99 @@
                     newCursorLine = insertLine
                 docstringList.append(self.__quote3)
                 return (
-                    indentation +
-                    "{0}{1}".format(sep, indentation).join(docstringList) +
-                    sep
-                ), (insertLine, 0), newCursorLine
-        
+                    (
+                        indentation
+                        + "{0}{1}".format(sep, indentation).join(docstringList)
+                        + sep
+                    ),
+                    (insertLine, 0),
+                    newCursorLine,
+                )
+
         return "", (0, 0), 0
-    
+
     def __getFunctionDefinitionFromStart(self):
         """
         Private method to extract the function definition based on the cursor
         being placed on the first line of the definition.
-        
+
         @return text containing the function definition
         @rtype str
         """
         startLine = self.__functionStartLine
         endLine = startLine + min(
-            self.editor.lines() - startLine,
-            20          # max. 20 lines of definition allowed
+            self.editor.lines() - startLine, 20  # max. 20 lines of definition allowed
         )
         isFirstLine = True
         functionIndent = ""
         functionTextList = []
-        
+
         for lineNo in range(startLine, endLine):
             text = self.editor.text(lineNo).rstrip()
             if isFirstLine:
                 if not self.isFunctionStart(text):
                     return None
-                
+
                 functionIndent = getIndentStr(text)
                 isFirstLine = False
             else:
                 currentIndent = getIndentStr(text)
-                if (
-                    currentIndent <= functionIndent or
-                    self.isFunctionStart(text)
-                ):
+                if currentIndent <= functionIndent or self.isFunctionStart(text):
                     # no function body exists
                     return None
                 if text.strip() == "":
                     # empty line, illegal/incomplete function definition
                     return None
-            
+
             if text.endswith("\\"):
                 text = text[:-1]
-            
+
             functionTextList.append(text)
-            
+
             if text.endswith(":"):
                 # end of function definition reached
                 functionDefinitionLength = len(functionTextList)
-                
+
                 # check, if function is decorated with a supported one
                 if startLine > 0:
                     decoratorLine = self.editor.text(startLine - 1)
                     if (
-                        "@classmethod" in decoratorLine or
-                        "@staticmethod" in decoratorLine or
-                        "pyqtSlot" in decoratorLine or          # PyQt slot
-                        "Slot" in decoratorLine                 # PySide slot
+                        "@classmethod" in decoratorLine
+                        or "@staticmethod" in decoratorLine
+                        or "pyqtSlot" in decoratorLine
+                        or "Slot" in decoratorLine  # PyQt slot  # PySide slot
                     ):
                         functionTextList.insert(0, decoratorLine)
-                
+
                 return "".join(functionTextList), functionDefinitionLength
-        
+
         return None
-    
+
     #######################################################################
     ## Methods to generate the docstring when the text cursor is on the
     ## line after the function definition (e.g. after a triple quote).
     #######################################################################
-    
+
     def __generateDocstringFromBelow(self, cursorPosition):
         """
         Private method to generate a docstring when the gicen position is on
         the line below the end of the definition.
-        
+
         @param cursorPosition position of the cursor (line and index)
         @type tuple of (int, int)
         @return tuple containing the docstring and a tuple containing the
             insertion line and index
         @rtype tuple of (str, tuple(int, int))
         """
-        functionDefinition = self.__getFunctionDefinitionFromBelow(
-            cursorPosition)
+        functionDefinition = self.__getFunctionDefinitionFromBelow(cursorPosition)
         if functionDefinition:
-            lineTextToCursor = (
-                self.editor.text(cursorPosition[0])[:cursorPosition[1]]
-            )
+            lineTextToCursor = self.editor.text(cursorPosition[0])[: cursorPosition[1]]
             insertLine = cursorPosition[0]
             indentation = self.__getIndentationInsertString(functionDefinition)
             sep = self.editor.getLineSeparator()
             bodyStart = insertLine
-            
-            docstringList = self.__generateDocstring(
-                '"', functionDefinition, bodyStart
-            )
+
+            docstringList = self.__generateDocstring('"', functionDefinition, bodyStart)
             if docstringList:
                 if self.__isTripleQuotesStart(lineTextToCursor):
                     if self.getDocstringType() == "ericdoc":
@@ -339,18 +324,16 @@
                         docstringList[0] = self.__quote3 + docstringList[0]
                         newCursorLine = cursorPosition[0]
                     docstringList.append(self.__quote3)
-                docstring = (
-                    "{0}{1}".format(sep, indentation).join(docstringList)
-                )
+                docstring = "{0}{1}".format(sep, indentation).join(docstringList)
                 return docstring, cursorPosition, newCursorLine
-        
+
         return "", (0, 0), 0
-    
+
     def __getFunctionDefinitionFromBelow(self, cursorPosition):
         """
         Private method to extract the function definition based on the cursor
         being placed on the first line after the definition.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         @return text containing the function definition
@@ -361,7 +344,7 @@
         # max. 20 lines of definition allowed
         isFirstLine = True
         functionTextList = []
-        
+
         for lineNo in range(startLine, endLine, -1):
             text = self.editor.text(lineNo).rstrip()
             if isFirstLine:
@@ -370,39 +353,39 @@
                 isFirstLine = False
             elif text.endswith(":") or text == "":
                 return None
-            
+
             if text.endswith("\\"):
                 text = text[:-1]
-            
+
             functionTextList.insert(0, text)
-            
+
             if self.isFunctionStart(text):
                 # start of function definition reached
                 self.__functionStartLine = lineNo
-                
+
                 # check, if function is decorated with a supported one
                 if lineNo > 0:
                     decoratorLine = self.editor.text(lineNo - 1)
                     if (
-                        "@classmethod" in decoratorLine or
-                        "@staticmethod" in decoratorLine or
-                        "pyqtSlot" in decoratorLine or          # PyQt slot
-                        "Slot" in decoratorLine                 # PySide slot
+                        "@classmethod" in decoratorLine
+                        or "@staticmethod" in decoratorLine
+                        or "pyqtSlot" in decoratorLine
+                        or "Slot" in decoratorLine  # PyQt slot  # PySide slot
                     ):
                         functionTextList.insert(0, decoratorLine)
-                
+
                 return "".join(functionTextList)
-        
+
         return None
-    
+
     #######################################################################
     ## Methods to generate the docstring contents.
     #######################################################################
-    
+
     def __getFunctionBody(self, functionIndent, startLine):
         """
         Private method to get the function body.
-        
+
         @param functionIndent indentation string of the function definition
         @type str
         @param startLine starting line for the extraction process
@@ -411,24 +394,24 @@
         @rtype str
         """
         bodyList = []
-        
+
         for line in range(startLine, self.editor.lines()):
             text = self.editor.text(line)
             textIndent = getIndentStr(text)
-            
+
             if text.strip() == "":
                 pass
             elif len(textIndent) <= len(functionIndent):
                 break
-            
+
             bodyList.append(text)
-        
+
         return "".join(bodyList)
-    
+
     def __generateDocstring(self, quote, functionDef, bodyStartLine):
         """
         Private method to generate the list of docstring lines.
-        
+
         @param quote quote string
         @type str
         @param functionDef text containing the function definition
@@ -445,17 +428,18 @@
             quote3replace = 3 * '"'
         functionInfo = PyFunctionInfo()
         functionInfo.parseDefinition(functionDef, quote3, quote3replace)
-        
+
         if functionInfo.hasInfo:
-            functionBody = self.__getFunctionBody(functionInfo.functionIndent,
-                                                  bodyStartLine)
-            
+            functionBody = self.__getFunctionBody(
+                functionInfo.functionIndent, bodyStartLine
+            )
+
             if functionBody:
                 functionInfo.parseBody(functionBody)
-            
+
             docstringType = self.getDocstringType()
             return self._generateDocstringList(functionInfo, docstringType)
-        
+
         return []
 
 
@@ -463,17 +447,18 @@
     """
     Class implementing an object to extract and store function information.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def __isCharInPairs(self, posChar, pairs):
         """
         Private method to test, if the given character position is between
         pairs of brackets or quotes.
-        
+
         @param posChar character position to be tested
         @type int
         @param pairs list containing pairs of positions
@@ -481,13 +466,12 @@
         @return flag indicating the position is in between
         @rtype bool
         """
-        return any(posLeft < posChar < posRight
-                   for (posLeft, posRight) in pairs)
-    
+        return any(posLeft < posChar < posRight for (posLeft, posRight) in pairs)
+
     def __findQuotePosition(self, text):
         """
         Private method to find the start and end position of pairs of quotes.
-        
+
         @param text text to be parsed
         @type str
         @return list of tuple with start and end position of pairs of quotes
@@ -496,7 +480,7 @@
         """
         pos = []
         foundLeftQuote = False
-        
+
         for index, character in enumerate(text):
             if foundLeftQuote is False:
                 if character in ("'", '"'):
@@ -507,19 +491,19 @@
                 if character == quote and text[index - 1] != "\\":
                     pos.append((leftPos, index))
                     foundLeftQuote = False
-        
+
         if foundLeftQuote:
             raise IndexError("No matching close quote at: {0}".format(leftPos))
-        
+
         return pos
-    
+
     def __findBracketPosition(self, text, bracketLeft, bracketRight, posQuote):
         """
         Private method to find the start and end position of pairs of brackets.
 
         https://stackoverflow.com/questions/29991917/
         indices-of-matching-parentheses-in-python
-        
+
         @param text text to be parsed
         @type str
         @param bracketLeft character of the left bracket
@@ -536,33 +520,26 @@
         """
         pos = []
         pstack = []
-        
+
         for index, character in enumerate(text):
-            if (
-                character == bracketLeft and
-                not self.__isCharInPairs(index, posQuote)
-            ):
+            if character == bracketLeft and not self.__isCharInPairs(index, posQuote):
                 pstack.append(index)
-            elif (
-                character == bracketRight and
-                not self.__isCharInPairs(index, posQuote)
+            elif character == bracketRight and not self.__isCharInPairs(
+                index, posQuote
             ):
                 if len(pstack) == 0:
-                    raise IndexError(
-                        "No matching closing parens at: {0}".format(index))
+                    raise IndexError("No matching closing parens at: {0}".format(index))
                 pos.append((pstack.pop(), index))
-        
+
         if len(pstack) > 0:
-            raise IndexError(
-                "No matching opening parens at: {0}".format(pstack.pop()))
-        
+            raise IndexError("No matching opening parens at: {0}".format(pstack.pop()))
+
         return pos
-    
-    def __splitArgumentToNameTypeValue(self, argumentsList,
-                                       quote, quoteReplace):
+
+    def __splitArgumentToNameTypeValue(self, argumentsList, quote, quoteReplace):
         """
         Private method to split some argument text to name, type and value.
-        
+
         @param argumentsList list of function argument definitions
         @type list of str
         @param quote quote string to be replaced
@@ -573,32 +550,29 @@
         for arg in argumentsList:
             hasType = False
             hasValue = False
-            
+
             colonPosition = arg.find(":")
             equalPosition = arg.find("=")
-            
+
             if equalPosition > -1:
                 hasValue = True
-            
-            if (
-                colonPosition > -1 and
-                (not hasValue or equalPosition > colonPosition)
-            ):
+
+            if colonPosition > -1 and (not hasValue or equalPosition > colonPosition):
                 # exception for def foo(arg1=":")
                 hasType = True
-        
+
             if hasValue and hasType:
                 argName = arg[0:colonPosition].strip()
-                argType = arg[colonPosition + 1:equalPosition].strip()
-                argValue = arg[equalPosition + 1:].strip()
+                argType = arg[colonPosition + 1 : equalPosition].strip()
+                argValue = arg[equalPosition + 1 :].strip()
             elif not hasValue and hasType:
                 argName = arg[0:colonPosition].strip()
-                argType = arg[colonPosition + 1:].strip()
+                argType = arg[colonPosition + 1 :].strip()
                 argValue = None
             elif hasValue and not hasType:
                 argName = arg[0:equalPosition].strip()
                 argType = None
-                argValue = arg[equalPosition + 1:].strip()
+                argValue = arg[equalPosition + 1 :].strip()
             else:
                 argName = arg.strip()
                 argType = None
@@ -606,17 +580,17 @@
             if argValue and quote:
                 # sanitize argValue with respect to quotes
                 argValue = argValue.replace(quote, quoteReplace)
-            
+
             self.argumentsList.append((argName, argType, argValue))
-    
+
     def __splitArgumentsTextToList(self, argumentsText):
         """
         Private method to split the given arguments text into a list of
         arguments.
-        
+
         This function uses a comma to separate arguments and ignores a comma in
         brackets and quotes.
-        
+
         @param argumentsText text containing the list of arguments
         @type str
         @return list of individual argument texts
@@ -625,46 +599,43 @@
         argumentsList = []
         indexFindStart = 0
         indexArgStart = 0
-        
+
         try:
             posQuote = self.__findQuotePosition(argumentsText)
-            posRound = self.__findBracketPosition(
-                argumentsText, "(", ")", posQuote)
-            posCurly = self.__findBracketPosition(
-                argumentsText, "{", "}", posQuote)
-            posSquare = self.__findBracketPosition(
-                argumentsText, "[", "]", posQuote)
+            posRound = self.__findBracketPosition(argumentsText, "(", ")", posQuote)
+            posCurly = self.__findBracketPosition(argumentsText, "{", "}", posQuote)
+            posSquare = self.__findBracketPosition(argumentsText, "[", "]", posQuote)
         except IndexError:
             return None
-        
+
         while True:
             posComma = argumentsText.find(",", indexFindStart)
-            
+
             if posComma == -1:
                 break
-            
+
             indexFindStart = posComma + 1
-            
+
             if (
-                self.__isCharInPairs(posComma, posRound) or
-                self.__isCharInPairs(posComma, posCurly) or
-                self.__isCharInPairs(posComma, posSquare) or
-                self.__isCharInPairs(posComma, posQuote)
+                self.__isCharInPairs(posComma, posRound)
+                or self.__isCharInPairs(posComma, posCurly)
+                or self.__isCharInPairs(posComma, posSquare)
+                or self.__isCharInPairs(posComma, posQuote)
             ):
                 continue
-            
+
             argumentsList.append(argumentsText[indexArgStart:posComma])
             indexArgStart = posComma + 1
-        
+
         if indexArgStart < len(argumentsText):
             argumentsList.append(argumentsText[indexArgStart:])
-        
+
         return argumentsList
-    
+
     def parseDefinition(self, text, quote, quoteReplace):
         """
         Public method to parse the function definition text.
-        
+
         @param text text containing the function definition
         @type str
         @param quote quote string to be replaced
@@ -673,7 +644,7 @@
         @type str
         """
         self.functionIndent = getIndentStr(text)
-        
+
         textList = text.splitlines()
         if textList[0].lstrip().startswith("@"):
             # first line of function definition is a decorator
@@ -682,17 +653,16 @@
                 self.functionType = "staticmethod"
             elif decorator == "@classmethod":
                 self.functionType = "classmethod"
-            elif (
-                re.match(r"@(PyQt[456]\.)?(QtCore\.)?pyqtSlot", decorator) or
-                re.match(r"@(PySide[26]\.)?(QtCore\.)?Slot", decorator)
+            elif re.match(r"@(PyQt[456]\.)?(QtCore\.)?pyqtSlot", decorator) or re.match(
+                r"@(PySide[26]\.)?(QtCore\.)?Slot", decorator
             ):
                 self.functionType = "qtslot"
-        
+
         text = "".join(textList).strip()
-        
+
         if text.startswith("async def "):
             self.isAsync = True
-        
+
         returnType = re.search(r"->[ ]*([a-zA-Z0-9_,()\[\] ]*):$", text)
         if returnType:
             self.returnTypeAnnotated = returnType.group(1)
@@ -700,21 +670,19 @@
         else:
             self.returnTypeAnnotated = None
             textEnd = len(text)
-        
+
         positionArgumentsStart = text.find("(") + 1
-        positionArgumentsEnd = text.rfind(")", positionArgumentsStart,
-                                          textEnd)
-        
+        positionArgumentsEnd = text.rfind(")", positionArgumentsStart, textEnd)
+
         self.argumentsText = text[positionArgumentsStart:positionArgumentsEnd]
-        
+
         argumentsList = self.__splitArgumentsTextToList(self.argumentsText)
         if argumentsList is not None:
             self.hasInfo = True
-            self.__splitArgumentToNameTypeValue(
-                argumentsList, quote, quoteReplace)
-        
+            self.__splitArgumentToNameTypeValue(argumentsList, quote, quoteReplace)
+
         functionName = (
-            text[:positionArgumentsStart - 1]
+            text[: positionArgumentsStart - 1]
             .replace("async def ", "")
             .replace("def ", "")
         )
@@ -729,11 +697,11 @@
             self.visibility = "protected"
         else:
             self.visibility = "public"
-    
+
     def parseBody(self, text):
         """
         Public method to parse the function body text.
-        
+
         @param text function body text
         @type str
         """
@@ -741,8 +709,7 @@
         if len(raiseRe) > 0:
             self.raiseList = [x.strip() for x in raiseRe]
             # remove duplicates from list while keeping it in the order
-            self.raiseList = list(collections.OrderedDict.fromkeys(
-                self.raiseList))
+            self.raiseList = list(collections.OrderedDict.fromkeys(self.raiseList))
 
         yieldRe = re.search(r"[ \t]yield ", text)
         if yieldRe:
@@ -757,10 +724,7 @@
         for line in lineList:
             line = line.strip()
 
-            if (
-                returnFound is False and
-                re.match(returnPattern, line)
-            ):
+            if returnFound is False and re.match(returnPattern, line):
                 returnFound = True
 
             if returnFound:
@@ -773,12 +737,9 @@
                         returnTmpLine = returnTmpLine[:-1]
                         continue
 
-                    self.__findBracketPosition(
-                        returnTmpLine, "(", ")", quotePos)
-                    self.__findBracketPosition(
-                        returnTmpLine, "{", "}", quotePos)
-                    self.__findBracketPosition(
-                        returnTmpLine, "[", "]", quotePos)
+                    self.__findBracketPosition(returnTmpLine, "(", ")", quotePos)
+                    self.__findBracketPosition(returnTmpLine, "{", "}", quotePos)
+                    self.__findBracketPosition(returnTmpLine, "[", "]", quotePos)
                 except IndexError:
                     continue
 
--- a/src/eric7/QScintilla/DocstringGenerator/SphinxdocGenerator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/SphinxdocGenerator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,10 @@
     """
     Function to generate the docstring line list iaw. Sphinx documentation
     style.
-    
+
     Note: Text is created with DESCRIPTION placeholders for descriptions and
     TYPE placeholders for type information
-    
+
     @param functionInfo object containing the function information to base
         the docstring on
     @type FunctionInfo
@@ -24,34 +24,35 @@
     """
     # __IGNORE_WARNING_D202__
     lines = []
-    
+
     # function description
     lines.append("")
-    
+
     # remove 'self', 'this' or 'cls' from arguments list
-    if (
-        len(functionInfo.argumentsList) > 0 and
-        functionInfo.argumentsList[0][0] in ("self", "cls", "this")
+    if len(functionInfo.argumentsList) > 0 and functionInfo.argumentsList[0][0] in (
+        "self",
+        "cls",
+        "this",
     ):
         del functionInfo.argumentsList[0]
-    
+
     # add an empty line if there is one of the other sections
     if (
-        functionInfo.argumentsList or
-        functionInfo.hasYield or
-        functionInfo.returnTypeAnnotated or
-        functionInfo.returnValueInBody or
-        functionInfo.raiseList
+        functionInfo.argumentsList
+        or functionInfo.hasYield
+        or functionInfo.returnTypeAnnotated
+        or functionInfo.returnValueInBody
+        or functionInfo.raiseList
     ):
         lines.append("")
-    
+
     # add the parameters section
     for argName, argType, argValue in functionInfo.argumentsList:
         argLine = ":param {0}: DESCRIPTION".format(argName)
         if argValue:
             argLine += ", defaults to {0}".format(argValue)
         lines.append(argLine)
-        
+
         argLine = ":type {0}: ".format(argName)
         if argType:
             argLine += "{0}".format(argType)
@@ -60,28 +61,27 @@
         if argValue:
             argLine += ", optional"
         lines.append(argLine)
-    
+
     # add an exceptions section, if function raises something
     if functionInfo.raiseList:
         for exc in sorted(functionInfo.raiseList):
             lines.append(":raises {0}: DESCRIPTION".format(exc))
-    
+
     # add return section
     if (
-        functionInfo.hasYield or
-        functionInfo.returnValueInBody or
-        functionInfo.returnTypeAnnotated
+        functionInfo.hasYield
+        or functionInfo.returnValueInBody
+        or functionInfo.returnTypeAnnotated
     ):
         if functionInfo.hasYield:
             lines.append(":yield: DESCRIPTION")
         else:
             lines.append(":return: DESCRIPTION")
         if functionInfo.returnTypeAnnotated:
-            lines.append(":rtype: {0}".format(
-                functionInfo.returnTypeAnnotated))
+            lines.append(":rtype: {0}".format(functionInfo.returnTypeAnnotated))
         else:
             lines.append(":rtype: TYPE")
-    
+
     lines.append("")
-    
+
     return lines
--- a/src/eric7/QScintilla/DocstringGenerator/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/DocstringGenerator/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,38 +13,37 @@
 def getDocstringGenerator(editor):
     """
     Function to get a docstring generator for the given editor.
-    
+
     @param editor reference to the editor to create a docstring generator for
     @type Editor
     @return reference to the created docstring generator
     @rtype BaseDocstringGenerator
     """
-    if (
-        editor.isPyFile() or
-        editor.getFileType() in ("Python", "Python3", "MicroPython")
+    if editor.isPyFile() or editor.getFileType() in (
+        "Python",
+        "Python3",
+        "MicroPython",
     ):
         from .PyDocstringGenerator import PyDocstringGenerator
+
         return PyDocstringGenerator(editor)
     else:
         from .BaseDocstringGenerator import BaseDocstringGenerator
+
         return BaseDocstringGenerator(editor)
 
 
 def getSupportedDocstringTypes():
     """
     Function to get the supported docstring types/styles.
-    
+
     @return list of tuples with supported docstring type/style and the
         corresponding display string
     @rtype tuple of (str, str)
     """
     return [
-        ("ericdoc",
-         QCoreApplication.translate("DocstringGenerator", "Eric")),
-        ("numpydoc",
-         QCoreApplication.translate("DocstringGenerator", "NumPy")),
-        ("googledoc",
-         QCoreApplication.translate("DocstringGenerator", "Google")),
-        ("sphinxdoc",
-         QCoreApplication.translate("DocstringGenerator", "Sphinx")),
+        ("ericdoc", QCoreApplication.translate("DocstringGenerator", "Eric")),
+        ("numpydoc", QCoreApplication.translate("DocstringGenerator", "NumPy")),
+        ("googledoc", QCoreApplication.translate("DocstringGenerator", "Google")),
+        ("sphinxdoc", QCoreApplication.translate("DocstringGenerator", "Sphinx")),
     ]
--- a/src/eric7/QScintilla/Editor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Editor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,13 +18,20 @@
 import editorconfig
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QDir, QTimer, QModelIndex, QCryptographicHash,
-    QEvent, QDateTime, QPoint, QSize
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QDir,
+    QTimer,
+    QModelIndex,
+    QCryptographicHash,
+    QEvent,
+    QDateTime,
+    QPoint,
+    QSize,
 )
 from PyQt6.QtGui import QPalette, QFont, QPixmap, QPainter, QActionGroup
-from PyQt6.QtWidgets import (
-    QLineEdit, QDialog, QInputDialog, QApplication, QMenu
-)
+from PyQt6.QtWidgets import QLineEdit, QDialog, QInputDialog, QApplication, QMenu
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog
 from PyQt6.Qsci import QsciScintilla, QsciMacro, QsciStyledText
 
@@ -55,13 +62,14 @@
 ReferencesListID = 3
 
 ReferenceItem = collections.namedtuple(
-    "ReferenceItem", ["modulePath", "codeLine", "line", "column"])
+    "ReferenceItem", ["modulePath", "codeLine", "line", "column"]
+)
 
 
 class Editor(QsciScintillaCompat):
     """
     Class implementing the editor component of the eric IDE.
-    
+
     @signal modificationStatusChanged(bool, QsciScintillaCompat) emitted when
         the modification status has changed
     @signal undoAvailable(bool) emitted to signal the undo availability
@@ -108,6 +116,7 @@
     @signal mouseDoubleClick(position, buttons) emitted to signal a mouse
         double click somewhere in the editor area
     """
+
     modificationStatusChanged = pyqtSignal(bool, QsciScintillaCompat)
     undoAvailable = pyqtSignal(bool)
     redoAvailable = pyqtSignal(bool)
@@ -133,10 +142,10 @@
     refreshed = pyqtSignal()
     settingsRead = pyqtSignal()
     mouseDoubleClick = pyqtSignal(QPoint, int)
-    
+
     WarningCode = 1
     WarningStyle = 2
-    
+
     # Autocompletion icon definitions
     ClassID = 1
     ClassProtectedID = 2
@@ -150,46 +159,46 @@
     EnumID = 10
     KeywordsID = 11
     ModuleID = 12
-    
+
     FromDocumentID = 99
-    
+
     TemplateImageID = 100
-    
+
     # Cooperation related definitions
     Separator = "@@@"
-    
+
     StartEditToken = "START_EDIT"
     EndEditToken = "END_EDIT"
     CancelEditToken = "CANCEL_EDIT"
     RequestSyncToken = "REQUEST_SYNC"
     SyncToken = "SYNC"
-    
+
     VcsConflictMarkerLineRegExpList = (
         r"""^<<<<<<< .*?$""",
         r"""^\|\|\|\|\|\|\| .*?$""",
         r"""^=======.*?$""",
         r"""^>>>>>>> .*?$""",
     )
-    
+
     EncloseChars = {
         '"': '"',
         "'": "'",
         "(": "()",
         ")": "()",
-        "{": "{}",          # __IGNORE_WARNING_M613__
-        "}": "{}",          # __IGNORE_WARNING_M613__
+        "{": "{}",  # __IGNORE_WARNING_M613__
+        "}": "{}",  # __IGNORE_WARNING_M613__
         "[": "[]",
         "]": "[]",
         "<": "<>",
         ">": "<>",
     }
-    
-    def __init__(self, dbs, fn="", vm=None,
-                 filetype="", editor=None, tv=None,
-                 parent=None):
+
+    def __init__(
+        self, dbs, fn="", vm=None, filetype="", editor=None, tv=None, parent=None
+    ):
         """
         Constructor
-        
+
         @param dbs reference to the debug server object
         @type DebugServer
         @param fn name of the file to be opened. If it is None, a new (empty)
@@ -210,9 +219,9 @@
         super().__init__(parent)
         self.setAttribute(Qt.WidgetAttribute.WA_KeyCompression)
         self.setUtf8(True)
-        
+
         self.enableMultiCursorSupport()
-        
+
         self.dbs = dbs
         self.taskViewer = tv
         self.__setFileName(fn)
@@ -221,12 +230,12 @@
         self.filetypeByFlag = False
         self.noName = ""
         self.project = ericApp().getObject("Project")
-        
+
         # clear some variables
-        self.lastHighlight = None   # remember the last highlighted line
-        self.lastErrorMarker = None   # remember the last error line
-        self.lastCurrMarker = None   # remember the last current line
-        
+        self.lastHighlight = None  # remember the last highlighted line
+        self.lastErrorMarker = None  # remember the last error line
+        self.lastCurrMarker = None  # remember the last current line
+
         self.breaks = {}
         # key:   marker handle,
         # value: (lineno, condition, temporary,
@@ -242,12 +251,12 @@
         # value: list of (warning message, warning type)
         self.notcoveredMarkers = []  # just a list of marker handles
         self.showingNotcoveredMarkers = False
-        
+
         self.lexer_ = None
-        self.apiLanguage = ''
-        
+        self.apiLanguage = ""
+
         self.__loadEditorConfig()
-        
+
         self.__lexerReset = False
         self.completer = None
         self.encoding = self.__getEditorConfig("DefaultEncoding")
@@ -269,43 +278,44 @@
         # true if we are propagating a lines changed event
         self.__hasTaskMarkers = False
         # no task markers present
-            
-        self.macros = {}    # list of defined macros
+
+        self.macros = {}  # list of defined macros
         self.curMacro = None
         self.recording = False
-        
+
         self.acAPI = False
-        
+
         self.__lastEditPosition = None
         self.__annotationLines = 0
-        
+
         self.__docstringGenerator = None
-        
+
         # list of clones
         self.__clones = []
-        
+
         # clear QScintilla defined keyboard commands
         # we do our own handling through the view manager
         self.clearAlternateKeys()
         self.clearKeys()
-        
+
         self.__markerMap = EditorMarkerMap(self)
-        
+
         # initialize the mark occurrences timer
         self.__markOccurrencesTimer = QTimer(self)
         self.__markOccurrencesTimer.setSingleShot(True)
         self.__markOccurrencesTimer.setInterval(
-            Preferences.getEditor("MarkOccurrencesTimeout"))
+            Preferences.getEditor("MarkOccurrencesTimeout")
+        )
         self.__markOccurrencesTimer.timeout.connect(self.__markOccurrences)
         self.__markedText = ""
         self.__searchIndicatorLines = []
-        
+
         # initialize some spellchecking stuff
         self.spell = None
         self.lastLine = 0
         self.lastIndex = 0
         self.__inSpellLanguageChanged = False
-        
+
         # initialize some cooperation stuff
         self.__isSyncing = False
         self.__receivedWhileSyncing = []
@@ -313,107 +323,97 @@
         self.__inSharedEdit = False
         self.__isShared = False
         self.__inRemoteSharedEdit = False
-        
+
         # connect signals before loading the text
         self.modificationChanged.connect(self.__modificationChanged)
         self.cursorPositionChanged.connect(self.__cursorPositionChanged)
         self.modificationAttempted.connect(self.__modificationReadOnly)
-        
+
         # define the margins markers
         self.__changeMarkerSaved = self.markerDefine(
-            self.__createChangeMarkerPixmap(
-                "OnlineChangeTraceMarkerSaved"))
+            self.__createChangeMarkerPixmap("OnlineChangeTraceMarkerSaved")
+        )
         self.__changeMarkerUnsaved = self.markerDefine(
-            self.__createChangeMarkerPixmap(
-                "OnlineChangeTraceMarkerUnsaved"))
-        self.breakpoint = self.markerDefine(
-            UI.PixmapCache.getPixmap("break"))
-        self.cbreakpoint = self.markerDefine(
-            UI.PixmapCache.getPixmap("cBreak"))
-        self.tbreakpoint = self.markerDefine(
-            UI.PixmapCache.getPixmap("tBreak"))
-        self.tcbreakpoint = self.markerDefine(
-            UI.PixmapCache.getPixmap("tCBreak"))
-        self.dbreakpoint = self.markerDefine(
-            UI.PixmapCache.getPixmap("breakDisabled"))
-        self.bookmark = self.markerDefine(
-            UI.PixmapCache.getPixmap("bookmark16"))
-        self.syntaxerror = self.markerDefine(
-            UI.PixmapCache.getPixmap("syntaxError"))
-        self.notcovered = self.markerDefine(
-            UI.PixmapCache.getPixmap("notcovered"))
-        self.taskmarker = self.markerDefine(
-            UI.PixmapCache.getPixmap("task"))
-        self.warning = self.markerDefine(
-            UI.PixmapCache.getPixmap("warning"))
-        
+            self.__createChangeMarkerPixmap("OnlineChangeTraceMarkerUnsaved")
+        )
+        self.breakpoint = self.markerDefine(UI.PixmapCache.getPixmap("break"))
+        self.cbreakpoint = self.markerDefine(UI.PixmapCache.getPixmap("cBreak"))
+        self.tbreakpoint = self.markerDefine(UI.PixmapCache.getPixmap("tBreak"))
+        self.tcbreakpoint = self.markerDefine(UI.PixmapCache.getPixmap("tCBreak"))
+        self.dbreakpoint = self.markerDefine(UI.PixmapCache.getPixmap("breakDisabled"))
+        self.bookmark = self.markerDefine(UI.PixmapCache.getPixmap("bookmark16"))
+        self.syntaxerror = self.markerDefine(UI.PixmapCache.getPixmap("syntaxError"))
+        self.notcovered = self.markerDefine(UI.PixmapCache.getPixmap("notcovered"))
+        self.taskmarker = self.markerDefine(UI.PixmapCache.getPixmap("task"))
+        self.warning = self.markerDefine(UI.PixmapCache.getPixmap("warning"))
+
         # define the line markers
         if Preferences.getEditor("LineMarkersBackground"):
-            self.currentline = self.markerDefine(
-                QsciScintilla.MarkerSymbol.Background)
-            self.errorline = self.markerDefine(
-                QsciScintilla.MarkerSymbol.Background)
+            self.currentline = self.markerDefine(QsciScintilla.MarkerSymbol.Background)
+            self.errorline = self.markerDefine(QsciScintilla.MarkerSymbol.Background)
             self.__setLineMarkerColours()
         else:
             self.currentline = self.markerDefine(
-                UI.PixmapCache.getPixmap("currentLineMarker"))
+                UI.PixmapCache.getPixmap("currentLineMarker")
+            )
             self.errorline = self.markerDefine(
-                UI.PixmapCache.getPixmap("errorLineMarker"))
-        
+                UI.PixmapCache.getPixmap("errorLineMarker")
+            )
+
         self.breakpointMask = (
-            (1 << self.breakpoint) |
-            (1 << self.cbreakpoint) |
-            (1 << self.tbreakpoint) |
-            (1 << self.tcbreakpoint) |
-            (1 << self.dbreakpoint)
-        )
-        
-        self.changeMarkersMask = (
-            (1 << self.__changeMarkerSaved) |
-            (1 << self.__changeMarkerUnsaved)
-        )
-        
+            (1 << self.breakpoint)
+            | (1 << self.cbreakpoint)
+            | (1 << self.tbreakpoint)
+            | (1 << self.tcbreakpoint)
+            | (1 << self.dbreakpoint)
+        )
+
+        self.changeMarkersMask = (1 << self.__changeMarkerSaved) | (
+            1 << self.__changeMarkerUnsaved
+        )
+
         # configure the margins
         self.__setMarginsDisplay()
         self.linesChanged.connect(self.__resizeLinenoMargin)
-        
+
         self.marginClicked.connect(self.__marginClicked)
-        
+
         # set the eol mode
         self.__setEolMode()
-        
+
         # set the text display
         self.__setTextDisplay()
-        
+
         # initialize the online syntax check timer
         try:
-            self.syntaxCheckService = ericApp().getObject('SyntaxCheckService')
+            self.syntaxCheckService = ericApp().getObject("SyntaxCheckService")
             self.syntaxCheckService.syntaxChecked.connect(
-                self.__processSyntaxCheckResult)
-            self.syntaxCheckService.error.connect(
-                self.__processSyntaxCheckError)
+                self.__processSyntaxCheckResult
+            )
+            self.syntaxCheckService.error.connect(self.__processSyntaxCheckError)
             self.__initOnlineSyntaxCheck()
         except KeyError:
             self.syntaxCheckService = None
-        
+
         self.isResourcesFile = False
         if editor is None:
             if self.fileName:
                 if (
-                    (pathlib.Path(self.fileName).stat().st_size // 1024) >
-                        Preferences.getEditor("WarnFilesize")
-                ):
+                    pathlib.Path(self.fileName).stat().st_size // 1024
+                ) > Preferences.getEditor("WarnFilesize"):
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Open File"),
-                        self.tr("""<p>The size of the file <b>{0}</b>"""
-                                """ is <b>{1} KB</b>."""
-                                """ Do you really want to load it?</p>""")
-                        .format(
+                        self.tr(
+                            """<p>The size of the file <b>{0}</b>"""
+                            """ is <b>{1} KB</b>."""
+                            """ Do you really want to load it?</p>"""
+                        ).format(
                             self.fileName,
-                            pathlib.Path(self.fileName).stat().st_size // 1024
+                            pathlib.Path(self.fileName).stat().st_size // 1024,
                         ),
-                        icon=EricMessageBox.Warning)
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         raise OSError()
                 self.readFile(self.fileName, True)
@@ -421,9 +421,9 @@
                 self.__bindCompleter(self.fileName)
                 self.checkSyntax()
                 self.isResourcesFile = self.fileName.endswith(".qrc")
-                
+
                 self.__convertTabs()
-                
+
                 self.recolor()
         else:
             # clone the given editor
@@ -435,104 +435,107 @@
             self.showingNotcoveredMarkers = editor.showingNotcoveredMarkers
             self.isResourcesFile = editor.isResourcesFile
             self.lastModified = editor.lastModified
-            
+
             self.addClone(editor)
             editor.addClone(self)
-        
+
         self.gotoLine(1)
-        
+
         # connect the mouse hover signals
         self.SCN_DWELLSTART.connect(self.__showMouseHoverHelp)
         self.SCN_DWELLEND.connect(self.__cancelMouseHoverHelp)
         self.__mouseHoverHelp = None
         self.__showingMouseHoverHelp = False
-        
+
         # set the text display again
         self.__setTextDisplay()
-        
+
         # set the auto-completion function
         self.__acContext = True
         self.__acText = ""
         self.__acCompletions = set()
         self.__acCompletionsFinished = 0
         self.__acCache = EricCache(
-            size=Preferences.getEditor("AutoCompletionCacheSize"))
+            size=Preferences.getEditor("AutoCompletionCacheSize")
+        )
         self.__acCache.setMaximumCacheTime(
-            Preferences.getEditor("AutoCompletionCacheTime"))
-        self.__acCacheEnabled = Preferences.getEditor(
-            "AutoCompletionCacheEnabled")
+            Preferences.getEditor("AutoCompletionCacheTime")
+        )
+        self.__acCacheEnabled = Preferences.getEditor("AutoCompletionCacheEnabled")
         self.__acTimer = QTimer(self)
         self.__acTimer.setSingleShot(True)
-        self.__acTimer.setInterval(
-            Preferences.getEditor("AutoCompletionTimeout"))
+        self.__acTimer.setInterval(Preferences.getEditor("AutoCompletionTimeout"))
         self.__acTimer.timeout.connect(self.__autoComplete)
-        
+
         self.__acWatchdog = QTimer(self)
         self.__acWatchdog.setSingleShot(True)
         self.__acWatchdog.setInterval(
-            Preferences.getEditor("AutoCompletionWatchdogTime"))
+            Preferences.getEditor("AutoCompletionWatchdogTime")
+        )
         self.__acWatchdog.timeout.connect(self.autoCompleteQScintilla)
-        
+
         self.userListActivated.connect(self.__completionListSelected)
         self.SCN_CHARADDED.connect(self.__charAdded)
         self.SCN_AUTOCCANCELLED.connect(self.__autocompletionCancelled)
-        
+
         self.__completionListHookFunctions = {}
         self.__completionListAsyncHookFunctions = {}
         self.__setAutoCompletion()
-        
+
         # set the call-tips function
         self.__ctHookFunctions = {}
         self.__setCallTips()
-        
+
         # set the mouse click handlers (fired on mouse release)
         self.__mouseClickHandlers = {}
         # dictionary with tuple of keyboard modifier and mouse button as key
         # and tuple of plug-in name and function as value
-        
+
         sh = self.sizeHint()
         if sh.height() < 300:
             sh.setHeight(300)
         self.resize(sh)
-        
+
         # Make sure tabbing through a QWorkspace works.
         self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
-        
+
         self.__updateReadOnly(True)
-        
-        self.setWhatsThis(self.tr(
-            """<b>A Source Editor Window</b>"""
-            """<p>This window is used to display and edit a source file."""
-            """  You can open as many of these as you like. The name of the"""
-            """ file is displayed in the window's titlebar.</p>"""
-            """<p>In order to set breakpoints just click in the space"""
-            """ between the line numbers and the fold markers. Via the"""
-            """ context menu of the margins they may be edited.</p>"""
-            """<p>In order to set bookmarks just Shift click in the space"""
-            """ between the line numbers and the fold markers.</p>"""
-            """<p>These actions can be reversed via the context menu.</p>"""
-            """<p>Ctrl clicking on a syntax error marker shows some info"""
-            """ about this error.</p>"""
-        ))
-        
+
+        self.setWhatsThis(
+            self.tr(
+                """<b>A Source Editor Window</b>"""
+                """<p>This window is used to display and edit a source file."""
+                """  You can open as many of these as you like. The name of the"""
+                """ file is displayed in the window's titlebar.</p>"""
+                """<p>In order to set breakpoints just click in the space"""
+                """ between the line numbers and the fold markers. Via the"""
+                """ context menu of the margins they may be edited.</p>"""
+                """<p>In order to set bookmarks just Shift click in the space"""
+                """ between the line numbers and the fold markers.</p>"""
+                """<p>These actions can be reversed via the context menu.</p>"""
+                """<p>Ctrl clicking on a syntax error marker shows some info"""
+                """ about this error.</p>"""
+            )
+        )
+
         # Set the editors size, if it is too big for the view manager.
         if self.vm is not None:
             req = self.size()
             bnd = req.boundedTo(self.vm.size())
-            
+
             if bnd.width() < req.width() or bnd.height() < req.height():
                 self.resize(bnd)
-            
+
         # set the autosave flag
         self.autosaveEnabled = Preferences.getEditor("AutosaveInterval") > 0
         self.autosaveManuallyDisabled = False
-        
+
         # code coverage related attributes
         self.__coverageFile = ""
-        
+
         self.__initContextMenu()
         self.__initContextMenuMargins()
-        
+
         self.__checkEol()
         if editor is None:
             self.__checkLanguage()
@@ -542,141 +545,133 @@
             # it's a clone
             self.__languageChanged(editor.apiLanguage, propagate=False)
             self.__encodingChanged(editor.encoding, propagate=False)
-            self.__spellLanguageChanged(editor.getSpellingLanguage(),
-                                        propagate=False)
+            self.__spellLanguageChanged(editor.getSpellingLanguage(), propagate=False)
             # link the warnings to the original editor
             self.warnings = editor.warnings
-        
+
         self.setAcceptDrops(True)
-        
+
         # breakpoint handling
         self.breakpointModel = self.dbs.getBreakPointModel()
         self.__restoreBreakpoints()
-        self.breakpointModel.rowsAboutToBeRemoved.connect(
-            self.__deleteBreakPoints)
+        self.breakpointModel.rowsAboutToBeRemoved.connect(self.__deleteBreakPoints)
         self.breakpointModel.dataAboutToBeChanged.connect(
-            self.__breakPointDataAboutToBeChanged)
-        self.breakpointModel.dataChanged.connect(
-            self.__changeBreakPoints)
-        self.breakpointModel.rowsInserted.connect(
-            self.__addBreakPoints)
+            self.__breakPointDataAboutToBeChanged
+        )
+        self.breakpointModel.dataChanged.connect(self.__changeBreakPoints)
+        self.breakpointModel.rowsInserted.connect(self.__addBreakPoints)
         self.SCN_MODIFIED.connect(self.__modified)
-        
+
         # establish connection to some ViewManager action groups
         self.addActions(self.vm.editorActGrp.actions())
         self.addActions(self.vm.editActGrp.actions())
         self.addActions(self.vm.copyActGrp.actions())
         self.addActions(self.vm.viewActGrp.actions())
-        
+
         # register images to be shown in autocompletion lists
         self.__registerImages()
-        
+
         # connect signals after loading the text
         self.textChanged.connect(self.__textChanged)
-        
+
         # initialize the online change trace timer
         self.__initOnlineChangeTrace()
-        
+
         if (
-            self.fileName and
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
+            self.fileName
+            and self.project.isOpen()
+            and self.project.isProjectSource(self.fileName)
         ):
             self.project.projectPropertiesChanged.connect(
-                self.__projectPropertiesChanged)
-        
+                self.__projectPropertiesChanged
+            )
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-        
+
         self.SCN_ZOOM.connect(self.__markerMap.update)
         self.__markerMap.update()
-    
+
     def __setFileName(self, name):
         """
         Private method to set the file name of the current file.
-        
+
         @param name name of the current file
         @type str
         """
         self.fileName = name
-        
+
         if self.fileName:
-            self.__fileNameExtension = (
-                os.path.splitext(self.fileName)[1][1:].lower()
-            )
+            self.__fileNameExtension = os.path.splitext(self.fileName)[1][1:].lower()
         else:
             self.__fileNameExtension = ""
-    
+
     def __registerImages(self):
         """
         Private method to register images for autocompletion lists.
         """
         # finale size of the completion images
         imageSize = QSize(22, 22)
-        
-        self.registerImage(
-            self.ClassID,
-            UI.PixmapCache.getPixmap("class", imageSize))
+
+        self.registerImage(self.ClassID, UI.PixmapCache.getPixmap("class", imageSize))
         self.registerImage(
             self.ClassProtectedID,
-            UI.PixmapCache.getPixmap("class_protected", imageSize))
+            UI.PixmapCache.getPixmap("class_protected", imageSize),
+        )
         self.registerImage(
-            self.ClassPrivateID,
-            UI.PixmapCache.getPixmap("class_private", imageSize))
-        self.registerImage(
-            self.MethodID,
-            UI.PixmapCache.getPixmap("method", imageSize))
+            self.ClassPrivateID, UI.PixmapCache.getPixmap("class_private", imageSize)
+        )
+        self.registerImage(self.MethodID, UI.PixmapCache.getPixmap("method", imageSize))
         self.registerImage(
             self.MethodProtectedID,
-            UI.PixmapCache.getPixmap("method_protected", imageSize))
+            UI.PixmapCache.getPixmap("method_protected", imageSize),
+        )
         self.registerImage(
-            self.MethodPrivateID,
-            UI.PixmapCache.getPixmap("method_private", imageSize))
+            self.MethodPrivateID, UI.PixmapCache.getPixmap("method_private", imageSize)
+        )
         self.registerImage(
-            self.AttributeID,
-            UI.PixmapCache.getPixmap("attribute", imageSize))
+            self.AttributeID, UI.PixmapCache.getPixmap("attribute", imageSize)
+        )
         self.registerImage(
             self.AttributeProtectedID,
-            UI.PixmapCache.getPixmap("attribute_protected", imageSize))
+            UI.PixmapCache.getPixmap("attribute_protected", imageSize),
+        )
         self.registerImage(
             self.AttributePrivateID,
-            UI.PixmapCache.getPixmap("attribute_private", imageSize))
-        self.registerImage(
-            self.EnumID,
-            UI.PixmapCache.getPixmap("enum", imageSize))
-        self.registerImage(
-            self.KeywordsID,
-            UI.PixmapCache.getPixmap("keywords", imageSize))
+            UI.PixmapCache.getPixmap("attribute_private", imageSize),
+        )
+        self.registerImage(self.EnumID, UI.PixmapCache.getPixmap("enum", imageSize))
         self.registerImage(
-            self.ModuleID,
-            UI.PixmapCache.getPixmap("module", imageSize))
-        
+            self.KeywordsID, UI.PixmapCache.getPixmap("keywords", imageSize)
+        )
+        self.registerImage(self.ModuleID, UI.PixmapCache.getPixmap("module", imageSize))
+
         self.registerImage(
-            self.FromDocumentID,
-            UI.PixmapCache.getPixmap("editor", imageSize))
-        
+            self.FromDocumentID, UI.PixmapCache.getPixmap("editor", imageSize)
+        )
+
         self.registerImage(
-            self.TemplateImageID,
-            UI.PixmapCache.getPixmap("templateViewer", imageSize))
-    
+            self.TemplateImageID, UI.PixmapCache.getPixmap("templateViewer", imageSize)
+        )
+
     def addClone(self, editor):
         """
         Public method to add a clone to our list.
-        
+
         @param editor reference to the cloned editor
         @type Editor
         """
         self.__clones.append(editor)
-        
+
         editor.editorRenamed.connect(self.fileRenamed)
         editor.languageChanged.connect(self.languageChanged)
         editor.eolChanged.connect(self.__eolChanged)
         editor.encodingChanged.connect(self.__encodingChanged)
         editor.spellLanguageChanged.connect(self.__spellLanguageChanged)
-        
+
     def removeClone(self, editor):
         """
         Public method to remove a clone from our list.
-        
+
         @param editor reference to the cloned editor
         @type Editor
         """
@@ -687,29 +682,29 @@
             editor.encodingChanged.disconnect(self.__encodingChanged)
             editor.spellLanguageChanged.disconnect(self.__spellLanguageChanged)
             self.__clones.remove(editor)
-        
+
     def isClone(self, editor):
         """
         Public method to test, if the given editor is a clone.
-        
+
         @param editor reference to the cloned editor
         @type Editor
         @return flag indicating a clone
         @rtype bool
         """
         return editor in self.__clones
-        
+
     def __bindName(self, line0):
         """
         Private method to generate a dummy filename for binding a lexer.
-        
+
         @param line0 first line of text to use in the generation process
             (string)
         @return dummy file name to be used for binding a lexer (string)
         """
         bindName = ""
         line0 = line0.lower()
-        
+
         # check first line if it does not start with #!
         if line0.startswith(("<html", "<!doctype html", "<?php")):
             bindName = "dummy.html"
@@ -719,27 +714,28 @@
             bindName = "dummy.diff"
         elif line0.startswith("\\documentclass"):
             bindName = "dummy.tex"
-        
+
         if not bindName and self.filetype:
             # check filetype
             from . import Lexers
+
             supportedLanguages = Lexers.getSupportedLanguages()
             if self.filetype in supportedLanguages:
                 bindName = supportedLanguages[self.filetype][1]
             elif self.filetype in ["Python", "Python3", "MicroPython"]:
                 bindName = "dummy.py"
-        
+
         if not bindName and line0.startswith("#!"):
             # #! marker detection
             if (
-                "python3" in line0 or
-                "python" in line0 or
-                "pypy3" in line0 or
-                "pypy" in line0
+                "python3" in line0
+                or "python" in line0
+                or "pypy3" in line0
+                or "pypy" in line0
             ):
                 bindName = "dummy.py"
                 self.filetype = "Python3"
-            elif ("/bash" in line0 or "/sh" in line0):
+            elif "/bash" in line0 or "/sh" in line0:
                 bindName = "dummy.sh"
             elif "ruby" in line0:
                 bindName = "dummy.rb"
@@ -751,7 +747,7 @@
             elif "dmd" in line0:
                 bindName = "dummy.d"
                 self.filetype = "D"
-        
+
         if not bindName:
             # mode line detection: -*- mode: python -*-
             match = re.search(r"mode[:=]\s*([-\w_.]+)", line0)
@@ -770,16 +766,16 @@
                 elif mode in ["dmd", "d"]:
                     bindName = "dummy.d"
                     self.filetype = "D"
-        
+
         if not bindName:
             bindName = self.fileName
-        
+
         return bindName
-        
+
     def getMenu(self, menuName):
         """
         Public method to get a reference to the main context menu or a submenu.
-        
+
         @param menuName name of the menu (string)
         @return reference to the requested menu (QMenu) or None
         """
@@ -787,27 +783,27 @@
             return self.__menus[menuName]
         except KeyError:
             return None
-        
+
     def hasMiniMenu(self):
         """
         Public method to check the miniMenu flag.
-        
+
         @return flag indicating a minimized context menu (boolean)
         """
         return self.miniMenu
-        
+
     def __initContextMenu(self):
         """
         Private method used to setup the context menu.
         """
         self.miniMenu = Preferences.getEditor("MiniContextMenu")
-        
+
         self.menuActs = {}
         self.menu = QMenu()
         self.__menus = {
             "Main": self.menu,
         }
-        
+
         self.languagesMenu = self.__initContextMenuLanguages()
         self.__menus["Languages"] = self.languagesMenu
         if self.isResourcesFile:
@@ -832,53 +828,59 @@
         self.__menus["Encodings"] = self.encodingsMenu
         self.spellCheckMenu = self.__initContextMenuSpellCheck()
         self.__menus["SpellCheck"] = self.spellCheckMenu
-        
+
         self.menuActs["Undo"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("editUndo"),
-            self.tr('Undo'), self.undo)
+            UI.PixmapCache.getIcon("editUndo"), self.tr("Undo"), self.undo
+        )
         self.menuActs["Redo"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("editRedo"),
-            self.tr('Redo'), self.redo)
+            UI.PixmapCache.getIcon("editRedo"), self.tr("Redo"), self.redo
+        )
         self.menuActs["Revert"] = self.menu.addAction(
-            self.tr("Revert to last saved state"),
-            self.revertToUnmodified)
+            self.tr("Revert to last saved state"), self.revertToUnmodified
+        )
         self.menu.addSeparator()
         self.menuActs["Cut"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("editCut"),
-            self.tr('Cut'), self.cut)
+            UI.PixmapCache.getIcon("editCut"), self.tr("Cut"), self.cut
+        )
         self.menuActs["Copy"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr('Copy'), self.copy)
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy"), self.copy
+        )
         self.menuActs["Paste"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("editPaste"),
-            self.tr('Paste'), self.paste)
+            UI.PixmapCache.getIcon("editPaste"), self.tr("Paste"), self.paste
+        )
         if not self.miniMenu:
             self.menu.addSeparator()
             self.menu.addAction(
                 UI.PixmapCache.getIcon("editIndent"),
-                self.tr('Indent'), self.indentLineOrSelection)
+                self.tr("Indent"),
+                self.indentLineOrSelection,
+            )
             self.menu.addAction(
                 UI.PixmapCache.getIcon("editUnindent"),
-                self.tr('Unindent'), self.unindentLineOrSelection)
+                self.tr("Unindent"),
+                self.unindentLineOrSelection,
+            )
             self.menuActs["Comment"] = self.menu.addAction(
                 UI.PixmapCache.getIcon("editComment"),
-                self.tr('Comment'), self.commentLineOrSelection)
+                self.tr("Comment"),
+                self.commentLineOrSelection,
+            )
             self.menuActs["Uncomment"] = self.menu.addAction(
                 UI.PixmapCache.getIcon("editUncomment"),
-                self.tr('Uncomment'), self.uncommentLineOrSelection)
+                self.tr("Uncomment"),
+                self.uncommentLineOrSelection,
+            )
             self.menu.addSeparator()
             self.menuActs["Docstring"] = self.menu.addAction(
-                self.tr("Generate Docstring"),
-                self.__insertDocstring)
+                self.tr("Generate Docstring"), self.__insertDocstring
+            )
             self.menu.addSeparator()
-            self.menu.addAction(
-                self.tr('Select to brace'), self.selectToMatchingBrace)
-            self.menu.addAction(self.tr('Select all'), self.__selectAll)
-            self.menu.addAction(
-                self.tr('Deselect all'), self.__deselectAll)
+            self.menu.addAction(self.tr("Select to brace"), self.selectToMatchingBrace)
+            self.menu.addAction(self.tr("Select all"), self.__selectAll)
+            self.menu.addAction(self.tr("Deselect all"), self.__deselectAll)
             self.menuActs["ExecuteSelection"] = self.menu.addAction(
-                self.tr("Execute Selection In Console"),
-                self.__executeSelection)
+                self.tr("Execute Selection In Console"), self.__executeSelection
+            )
         else:
             self.menuActs["ExecuteSelection"] = None
         self.menu.addSeparator()
@@ -889,33 +891,38 @@
         self.menuActs["Eol"] = self.menu.addMenu(self.eolMenu)
         self.menu.addSeparator()
         self.menuActs["MonospacedFont"] = self.menu.addAction(
-            self.tr("Use Monospaced Font"),
-            self.handleMonospacedEnable)
+            self.tr("Use Monospaced Font"), self.handleMonospacedEnable
+        )
         self.menuActs["MonospacedFont"].setCheckable(True)
         self.menuActs["MonospacedFont"].setChecked(self.useMonospaced)
         self.menuActs["AutosaveEnable"] = self.menu.addAction(
-            self.tr("Autosave enabled"), self.__autosaveEnable)
+            self.tr("Autosave enabled"), self.__autosaveEnable
+        )
         self.menuActs["AutosaveEnable"].setCheckable(True)
         self.menuActs["AutosaveEnable"].setChecked(self.autosaveEnabled)
         self.menuActs["TypingAidsEnabled"] = self.menu.addAction(
-            self.tr("Typing aids enabled"), self.__toggleTypingAids)
+            self.tr("Typing aids enabled"), self.__toggleTypingAids
+        )
         self.menuActs["TypingAidsEnabled"].setCheckable(True)
-        self.menuActs["TypingAidsEnabled"].setEnabled(
-            self.completer is not None)
+        self.menuActs["TypingAidsEnabled"].setEnabled(self.completer is not None)
         self.menuActs["TypingAidsEnabled"].setChecked(
-            self.completer is not None and self.completer.isEnabled())
+            self.completer is not None and self.completer.isEnabled()
+        )
         self.menuActs["AutoCompletionEnable"] = self.menu.addAction(
-            self.tr("Automatic Completion enabled"),
-            self.__toggleAutoCompletionEnable)
+            self.tr("Automatic Completion enabled"), self.__toggleAutoCompletionEnable
+        )
         self.menuActs["AutoCompletionEnable"].setCheckable(True)
         self.menuActs["AutoCompletionEnable"].setChecked(
-            self.autoCompletionThreshold() != -1)
+            self.autoCompletionThreshold() != -1
+        )
         if not self.isResourcesFile:
             self.menu.addMenu(self.autocompletionMenu)
             self.menuActs["calltip"] = self.menu.addAction(
-                self.tr('Calltip'), self.callTip)
+                self.tr("Calltip"), self.callTip
+            )
             self.menuActs["codeInfo"] = self.menu.addAction(
-                self.tr('Code Info'), self.__showCodeInfo)
+                self.tr("Code Info"), self.__showCodeInfo
+            )
         self.menu.addSeparator()
         if self.isResourcesFile:
             self.menu.addMenu(self.resourcesMenu)
@@ -929,196 +936,206 @@
         self.menu.addSeparator()
         self.menu.addAction(
             UI.PixmapCache.getIcon("documentNewView"),
-            self.tr('New Document View'), self.__newView)
+            self.tr("New Document View"),
+            self.__newView,
+        )
         self.menuActs["NewSplit"] = self.menu.addAction(
             UI.PixmapCache.getIcon("splitVertical"),
-            self.tr('New Document View (with new split)'),
-            self.__newViewNewSplit)
+            self.tr("New Document View (with new split)"),
+            self.__newViewNewSplit,
+        )
         self.menuActs["NewSplit"].setEnabled(self.vm.canSplit())
         self.menu.addSeparator()
         self.reopenEncodingMenu = self.__initContextMenuReopenWithEncoding()
         self.menuActs["Reopen"] = self.menu.addMenu(self.reopenEncodingMenu)
         self.menuActs["Save"] = self.menu.addAction(
-            UI.PixmapCache.getIcon("fileSave"),
-            self.tr('Save'), self.__contextSave)
+            UI.PixmapCache.getIcon("fileSave"), self.tr("Save"), self.__contextSave
+        )
         self.menu.addAction(
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save As...'), self.__contextSaveAs)
+            self.tr("Save As..."),
+            self.__contextSaveAs,
+        )
         self.menu.addAction(
             UI.PixmapCache.getIcon("fileSaveCopy"),
-            self.tr('Save Copy...'), self.__contextSaveCopy)
-        
+            self.tr("Save Copy..."),
+            self.__contextSaveCopy,
+        )
+
         self.menu.aboutToShow.connect(self.__showContextMenu)
-        
+
         self.spellingMenu = QMenu()
         self.__menus["Spelling"] = self.spellingMenu
-        
+
         self.spellingMenu.aboutToShow.connect(self.__showContextMenuSpelling)
-        self.spellingMenu.triggered.connect(
-            self.__contextMenuSpellingTriggered)
+        self.spellingMenu.triggered.connect(self.__contextMenuSpellingTriggered)
 
     def __initContextMenuAutocompletion(self):
         """
         Private method used to setup the Checks context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
-        menu = QMenu(self.tr('Complete'))
-        
+        menu = QMenu(self.tr("Complete"))
+
         self.menuActs["acDynamic"] = menu.addAction(
-            self.tr('Complete'), self.autoComplete)
+            self.tr("Complete"), self.autoComplete
+        )
         menu.addSeparator()
         self.menuActs["acClearCache"] = menu.addAction(
-            self.tr("Clear Completions Cache"), self.__clearCompletionsCache)
+            self.tr("Clear Completions Cache"), self.__clearCompletionsCache
+        )
         menu.addSeparator()
-        menu.addAction(
-            self.tr('Complete from Document'), self.autoCompleteFromDocument)
+        menu.addAction(self.tr("Complete from Document"), self.autoCompleteFromDocument)
         self.menuActs["acAPI"] = menu.addAction(
-            self.tr('Complete from APIs'), self.autoCompleteFromAPIs)
+            self.tr("Complete from APIs"), self.autoCompleteFromAPIs
+        )
         self.menuActs["acAPIDocument"] = menu.addAction(
-            self.tr('Complete from Document and APIs'),
-            self.autoCompleteFromAll)
-        
+            self.tr("Complete from Document and APIs"), self.autoCompleteFromAll
+        )
+
         menu.aboutToShow.connect(self.__showContextMenuAutocompletion)
-        
+
         return menu
-    
+
     def __initContextMenuChecks(self):
         """
         Private method used to setup the Checks context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
-        menu = QMenu(self.tr('Check'))
+        menu = QMenu(self.tr("Check"))
         menu.aboutToShow.connect(self.__showContextMenuChecks)
         return menu
 
     def __initContextMenuFormatting(self):
         """
         Private method used to setup the Code Formatting context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         menu = QMenu(self.tr("Code Formatting"))
-        
+
         menu.addAction(
             self.tr("Format Code"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Format)
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Format),
         )
         menu.addAction(
             self.tr("Check Formatting"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Check)
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Check),
         )
         menu.addAction(
             self.tr("Formatting Diff"),
-            lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff)
-        )
-        
+            lambda: self.__performFormatWithBlack(BlackFormattingAction.Diff),
+        )
+
         menu.aboutToShow.connect(self.__showContextMenuFormatting)
-        
+
         return menu
-    
+
     def __initContextMenuTools(self):
         """
         Private method used to setup the Tools context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
-        menu = QMenu(self.tr('Tools'))
+        menu = QMenu(self.tr("Tools"))
         menu.aboutToShow.connect(self.__showContextMenuTools)
         return menu
 
     def __initContextMenuShow(self):
         """
         Private method used to setup the Show context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
-        menu = QMenu(self.tr('Show'))
-        
-        menu.addAction(self.tr('Code metrics...'), self.__showCodeMetrics)
+        menu = QMenu(self.tr("Show"))
+
+        menu.addAction(self.tr("Code metrics..."), self.__showCodeMetrics)
         self.coverageMenuAct = menu.addAction(
-            self.tr('Code coverage...'), self.__showCodeCoverage)
+            self.tr("Code coverage..."), self.__showCodeCoverage
+        )
         self.coverageShowAnnotationMenuAct = menu.addAction(
-            self.tr('Show code coverage annotations'),
-            self.codeCoverageShowAnnotations)
+            self.tr("Show code coverage annotations"), self.codeCoverageShowAnnotations
+        )
         self.coverageHideAnnotationMenuAct = menu.addAction(
-            self.tr('Hide code coverage annotations'),
-            self.__codeCoverageHideAnnotations)
+            self.tr("Hide code coverage annotations"),
+            self.__codeCoverageHideAnnotations,
+        )
         self.profileMenuAct = menu.addAction(
-            self.tr('Profile data...'), self.__showProfileData)
-        
+            self.tr("Profile data..."), self.__showProfileData
+        )
+
         menu.aboutToShow.connect(self.__showContextMenuShow)
-        
+
         return menu
-        
+
     def __initContextMenuGraphics(self):
         """
         Private method used to setup the diagrams context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
-        menu = QMenu(self.tr('Diagrams'))
-        
-        menu.addAction(
-            self.tr('Class Diagram...'), self.__showClassDiagram)
-        menu.addAction(
-            self.tr('Package Diagram...'), self.__showPackageDiagram)
-        menu.addAction(
-            self.tr('Imports Diagram...'), self.__showImportsDiagram)
+        menu = QMenu(self.tr("Diagrams"))
+
+        menu.addAction(self.tr("Class Diagram..."), self.__showClassDiagram)
+        menu.addAction(self.tr("Package Diagram..."), self.__showPackageDiagram)
+        menu.addAction(self.tr("Imports Diagram..."), self.__showImportsDiagram)
         self.applicationDiagramMenuAct = menu.addAction(
-            self.tr('Application Diagram...'),
-            self.__showApplicationDiagram)
+            self.tr("Application Diagram..."), self.__showApplicationDiagram
+        )
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("open"),
-            self.tr("Load Diagram..."), self.__loadDiagram)
-        
+            self.tr("Load Diagram..."),
+            self.__loadDiagram,
+        )
+
         menu.aboutToShow.connect(self.__showContextMenuGraphics)
-        
+
         return menu
 
     def __initContextMenuLanguages(self):
         """
         Private method used to setup the Languages context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         menu = QMenu(self.tr("Languages"))
-        
+
         self.languagesActGrp = QActionGroup(self)
         self.noLanguageAct = menu.addAction(
-            UI.PixmapCache.getIcon("fileText"),
-            self.tr("Text"))
+            UI.PixmapCache.getIcon("fileText"), self.tr("Text")
+        )
         self.noLanguageAct.setCheckable(True)
         self.noLanguageAct.setData("None")
         self.languagesActGrp.addAction(self.noLanguageAct)
         menu.addSeparator()
-        
+
         from . import Lexers
+
         self.supportedLanguages = {}
         supportedLanguages = Lexers.getSupportedLanguages()
         languages = sorted(supportedLanguages.keys())
         for language in languages:
             if language != "Guessed":
-                self.supportedLanguages[language] = (
-                    supportedLanguages[language][:2]
-                )
+                self.supportedLanguages[language] = supportedLanguages[language][:2]
                 act = menu.addAction(
                     UI.PixmapCache.getIcon(supportedLanguages[language][2]),
-                    self.supportedLanguages[language][0])
+                    self.supportedLanguages[language][0],
+                )
                 act.setCheckable(True)
                 act.setData(language)
                 self.supportedLanguages[language].append(act)
                 self.languagesActGrp.addAction(act)
-        
+
         menu.addSeparator()
         self.pygmentsAct = menu.addAction(self.tr("Guessed"))
         self.pygmentsAct.setCheckable(True)
@@ -1126,318 +1143,302 @@
         self.languagesActGrp.addAction(self.pygmentsAct)
         self.pygmentsSelAct = menu.addAction(self.tr("Alternatives"))
         self.pygmentsSelAct.setData("Alternatives")
-        
+
         menu.triggered.connect(self.__languageMenuTriggered)
         menu.aboutToShow.connect(self.__showContextMenuLanguages)
-        
+
         return menu
-        
+
     def __initContextMenuEncodings(self):
         """
         Private method used to setup the Encodings context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         self.supportedEncodings = {}
-        
+
         menu = QMenu(self.tr("Encodings"))
-        
+
         self.encodingsActGrp = QActionGroup(self)
-        
+
         for encoding in sorted(Utilities.supportedCodecs):
             act = menu.addAction(encoding)
             act.setCheckable(True)
             act.setData(encoding)
             self.supportedEncodings[encoding] = act
             self.encodingsActGrp.addAction(act)
-        
+
         menu.triggered.connect(self.__encodingsMenuTriggered)
         menu.aboutToShow.connect(self.__showContextMenuEncodings)
-        
+
         return menu
-        
+
     def __initContextMenuReopenWithEncoding(self):
         """
         Private method used to setup the Reopen With Encoding context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         menu = QMenu(self.tr("Re-Open With Encoding"))
         menu.setIcon(UI.PixmapCache.getIcon("open"))
-        
+
         for encoding in sorted(Utilities.supportedCodecs):
             act = menu.addAction(encoding)
             act.setData(encoding)
-        
+
         menu.triggered.connect(self.__reopenWithEncodingMenuTriggered)
-        
+
         return menu
-        
+
     def __initContextMenuEol(self):
         """
         Private method to setup the eol context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         self.supportedEols = {}
-        
+
         menu = QMenu(self.tr("End-of-Line Type"))
-        
+
         self.eolActGrp = QActionGroup(self)
-        
-        act = menu.addAction(UI.PixmapCache.getIcon("eolLinux"),
-                             self.tr("Unix"))
+
+        act = menu.addAction(UI.PixmapCache.getIcon("eolLinux"), self.tr("Unix"))
         act.setCheckable(True)
-        act.setData('\n')
-        self.supportedEols['\n'] = act
+        act.setData("\n")
+        self.supportedEols["\n"] = act
         self.eolActGrp.addAction(act)
-        
-        act = menu.addAction(UI.PixmapCache.getIcon("eolWindows"),
-                             self.tr("Windows"))
+
+        act = menu.addAction(UI.PixmapCache.getIcon("eolWindows"), self.tr("Windows"))
         act.setCheckable(True)
-        act.setData('\r\n')
-        self.supportedEols['\r\n'] = act
+        act.setData("\r\n")
+        self.supportedEols["\r\n"] = act
         self.eolActGrp.addAction(act)
-        
-        act = menu.addAction(UI.PixmapCache.getIcon("eolMac"),
-                             self.tr("Macintosh"))
+
+        act = menu.addAction(UI.PixmapCache.getIcon("eolMac"), self.tr("Macintosh"))
         act.setCheckable(True)
-        act.setData('\r')
-        self.supportedEols['\r'] = act
+        act.setData("\r")
+        self.supportedEols["\r"] = act
         self.eolActGrp.addAction(act)
-        
+
         menu.triggered.connect(self.__eolMenuTriggered)
         menu.aboutToShow.connect(self.__showContextMenuEol)
-        
+
         return menu
-    
+
     def __initContextMenuSpellCheck(self):
         """
         Private method used to setup the spell checking context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         menu = QMenu(self.tr("Spelling"))
         menu.setIcon(UI.PixmapCache.getIcon("spellchecking"))
-        
+
         self.spellLanguagesMenu = self.__initContextMenuSpellLanguages()
         self.__menus["SpellLanguages"] = self.spellLanguagesMenu
-        
+
         self.menuActs["SpellCheck"] = menu.addAction(
             UI.PixmapCache.getIcon("spellchecking"),
-            self.tr('Check spelling...'), self.checkSpelling)
+            self.tr("Check spelling..."),
+            self.checkSpelling,
+        )
         self.menuActs["SpellCheckSelection"] = menu.addAction(
             UI.PixmapCache.getIcon("spellchecking"),
-            self.tr('Check spelling of selection...'),
-            self.__checkSpellingSelection)
+            self.tr("Check spelling of selection..."),
+            self.__checkSpellingSelection,
+        )
         self.menuActs["SpellCheckRemove"] = menu.addAction(
-            self.tr("Remove from dictionary"),
-            self.__removeFromSpellingDictionary)
-        self.menuActs["SpellCheckLanguages"] = menu.addMenu(
-            self.spellLanguagesMenu)
-        
+            self.tr("Remove from dictionary"), self.__removeFromSpellingDictionary
+        )
+        self.menuActs["SpellCheckLanguages"] = menu.addMenu(self.spellLanguagesMenu)
+
         menu.aboutToShow.connect(self.__showContextMenuSpellCheck)
-        
+
         return menu
-    
+
     def __initContextMenuSpellLanguages(self):
         """
         Private method to setup the spell checking languages context sub menu.
-        
+
         @return reference to the generated menu
         @rtype QMenu
         """
         self.supportedSpellLanguages = {}
-        
+
         menu = QMenu(self.tr("Spell Check Languages"))
-        
+
         self.spellLanguagesActGrp = QActionGroup(self)
-        
-        self.noSpellLanguageAct = menu.addAction(
-            self.tr("No Language"))
+
+        self.noSpellLanguageAct = menu.addAction(self.tr("No Language"))
         self.noSpellLanguageAct.setCheckable(True)
         self.noSpellLanguageAct.setData("")
         self.spellLanguagesActGrp.addAction(self.noSpellLanguageAct)
         menu.addSeparator()
-        
+
         for language in sorted(SpellChecker.getAvailableLanguages()):
             act = menu.addAction(language)
             act.setCheckable(True)
             act.setData(language)
             self.supportedSpellLanguages[language] = act
             self.spellLanguagesActGrp.addAction(act)
-        
+
         menu.triggered.connect(self.__spellLanguagesMenuTriggered)
         menu.aboutToShow.connect(self.__showContextMenuSpellLanguages)
-        
+
         return menu
-    
+
     def __initContextMenuMargins(self):
         """
         Private method used to setup the context menu for the margins.
         """
         self.marginMenuActs = {}
-        
+
         # bookmark margin
         self.bmMarginMenu = QMenu()
-        
-        self.bmMarginMenu.addAction(
-            self.tr('Toggle bookmark'), self.menuToggleBookmark)
+
+        self.bmMarginMenu.addAction(self.tr("Toggle bookmark"), self.menuToggleBookmark)
         self.marginMenuActs["NextBookmark"] = self.bmMarginMenu.addAction(
-            self.tr('Next bookmark'), self.nextBookmark)
+            self.tr("Next bookmark"), self.nextBookmark
+        )
         self.marginMenuActs["PreviousBookmark"] = self.bmMarginMenu.addAction(
-            self.tr('Previous bookmark'), self.previousBookmark)
+            self.tr("Previous bookmark"), self.previousBookmark
+        )
         self.marginMenuActs["ClearBookmark"] = self.bmMarginMenu.addAction(
-            self.tr('Clear all bookmarks'), self.clearBookmarks)
-        
+            self.tr("Clear all bookmarks"), self.clearBookmarks
+        )
+
         self.bmMarginMenu.aboutToShow.connect(
-            lambda: self.__showContextMenuMargin(self.bmMarginMenu))
-        
+            lambda: self.__showContextMenuMargin(self.bmMarginMenu)
+        )
+
         # breakpoint margin
         self.bpMarginMenu = QMenu()
-        
+
         self.marginMenuActs["Breakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Toggle breakpoint'), self.menuToggleBreakpoint)
+            self.tr("Toggle breakpoint"), self.menuToggleBreakpoint
+        )
         self.marginMenuActs["TempBreakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Toggle temporary breakpoint'),
-            self.__menuToggleTemporaryBreakpoint)
+            self.tr("Toggle temporary breakpoint"), self.__menuToggleTemporaryBreakpoint
+        )
         self.marginMenuActs["EditBreakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Edit breakpoint...'), self.menuEditBreakpoint)
+            self.tr("Edit breakpoint..."), self.menuEditBreakpoint
+        )
         self.marginMenuActs["EnableBreakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Enable breakpoint'),
-            self.__menuToggleBreakpointEnabled)
+            self.tr("Enable breakpoint"), self.__menuToggleBreakpointEnabled
+        )
         self.marginMenuActs["NextBreakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Next breakpoint'), self.menuNextBreakpoint)
-        self.marginMenuActs["PreviousBreakpoint"] = (
-            self.bpMarginMenu.addAction(
-                self.tr('Previous breakpoint'),
-                self.menuPreviousBreakpoint)
+            self.tr("Next breakpoint"), self.menuNextBreakpoint
+        )
+        self.marginMenuActs["PreviousBreakpoint"] = self.bpMarginMenu.addAction(
+            self.tr("Previous breakpoint"), self.menuPreviousBreakpoint
         )
         self.marginMenuActs["ClearBreakpoint"] = self.bpMarginMenu.addAction(
-            self.tr('Clear all breakpoints'), self.__menuClearBreakpoints)
-        
+            self.tr("Clear all breakpoints"), self.__menuClearBreakpoints
+        )
+
         self.bpMarginMenu.aboutToShow.connect(
-            lambda: self.__showContextMenuMargin(self.bpMarginMenu))
-        
+            lambda: self.__showContextMenuMargin(self.bpMarginMenu)
+        )
+
         # fold margin
         self.foldMarginMenu = QMenu()
-        
-        self.marginMenuActs["ToggleAllFolds"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Toggle all folds"),
-                self.foldAll)
-        )
-        self.marginMenuActs["ToggleAllFoldsAndChildren"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Toggle all folds (including children)"),
-                lambda: self.foldAll(True))
-        )
-        self.marginMenuActs["ToggleCurrentFold"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Toggle current fold"),
-                self.toggleCurrentFold)
-        )
-        self.foldMarginMenu.addSeparator()
-        self.marginMenuActs["ExpandChildren"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Expand (including children)"),
-                self.__contextMenuExpandFoldWithChildren)
-        )
-        self.marginMenuActs["CollapseChildren"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Collapse (including children)"),
-                self.__contextMenuCollapseFoldWithChildren)
+
+        self.marginMenuActs["ToggleAllFolds"] = self.foldMarginMenu.addAction(
+            self.tr("Toggle all folds"), self.foldAll
+        )
+        self.marginMenuActs[
+            "ToggleAllFoldsAndChildren"
+        ] = self.foldMarginMenu.addAction(
+            self.tr("Toggle all folds (including children)"), lambda: self.foldAll(True)
+        )
+        self.marginMenuActs["ToggleCurrentFold"] = self.foldMarginMenu.addAction(
+            self.tr("Toggle current fold"), self.toggleCurrentFold
         )
         self.foldMarginMenu.addSeparator()
-        self.marginMenuActs["ClearAllFolds"] = (
-            self.foldMarginMenu.addAction(
-                self.tr("Clear all folds"),
-                self.clearFolds)
-        )
-        
+        self.marginMenuActs["ExpandChildren"] = self.foldMarginMenu.addAction(
+            self.tr("Expand (including children)"),
+            self.__contextMenuExpandFoldWithChildren,
+        )
+        self.marginMenuActs["CollapseChildren"] = self.foldMarginMenu.addAction(
+            self.tr("Collapse (including children)"),
+            self.__contextMenuCollapseFoldWithChildren,
+        )
+        self.foldMarginMenu.addSeparator()
+        self.marginMenuActs["ClearAllFolds"] = self.foldMarginMenu.addAction(
+            self.tr("Clear all folds"), self.clearFolds
+        )
+
         self.foldMarginMenu.aboutToShow.connect(
-            lambda: self.__showContextMenuMargin(self.foldMarginMenu))
-        
+            lambda: self.__showContextMenuMargin(self.foldMarginMenu)
+        )
+
         # indicator margin
         self.indicMarginMenu = QMenu()
-        
-        self.marginMenuActs["GotoSyntaxError"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Goto syntax error'), self.gotoSyntaxError)
-        )
-        self.marginMenuActs["ShowSyntaxError"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Show syntax error message'),
-                self.__showSyntaxError)
-        )
-        self.marginMenuActs["ClearSyntaxError"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Clear syntax error'), self.clearSyntaxError)
+
+        self.marginMenuActs["GotoSyntaxError"] = self.indicMarginMenu.addAction(
+            self.tr("Goto syntax error"), self.gotoSyntaxError
+        )
+        self.marginMenuActs["ShowSyntaxError"] = self.indicMarginMenu.addAction(
+            self.tr("Show syntax error message"), self.__showSyntaxError
+        )
+        self.marginMenuActs["ClearSyntaxError"] = self.indicMarginMenu.addAction(
+            self.tr("Clear syntax error"), self.clearSyntaxError
         )
         self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextWarningMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr("Next warning"), self.nextWarning)
-        )
-        self.marginMenuActs["PreviousWarningMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr("Previous warning"), self.previousWarning)
-        )
-        self.marginMenuActs["ShowWarning"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Show warning message'), self.__showWarning)
-        )
-        self.marginMenuActs["ClearWarnings"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Clear warnings'), self.clearWarnings)
+        self.marginMenuActs["NextWarningMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Next warning"), self.nextWarning
+        )
+        self.marginMenuActs["PreviousWarningMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Previous warning"), self.previousWarning
+        )
+        self.marginMenuActs["ShowWarning"] = self.indicMarginMenu.addAction(
+            self.tr("Show warning message"), self.__showWarning
+        )
+        self.marginMenuActs["ClearWarnings"] = self.indicMarginMenu.addAction(
+            self.tr("Clear warnings"), self.clearWarnings
         )
         self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextCoverageMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Next uncovered line'), self.nextUncovered)
-        )
-        self.marginMenuActs["PreviousCoverageMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Previous uncovered line'), self.previousUncovered)
+        self.marginMenuActs["NextCoverageMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Next uncovered line"), self.nextUncovered
+        )
+        self.marginMenuActs["PreviousCoverageMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Previous uncovered line"), self.previousUncovered
         )
         self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextTaskMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Next task'), self.nextTask)
-        )
-        self.marginMenuActs["PreviousTaskMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Previous task'), self.previousTask)
+        self.marginMenuActs["NextTaskMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Next task"), self.nextTask
+        )
+        self.marginMenuActs["PreviousTaskMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Previous task"), self.previousTask
         )
         self.indicMarginMenu.addSeparator()
-        self.marginMenuActs["NextChangeMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Next change'), self.nextChange)
-        )
-        self.marginMenuActs["PreviousChangeMarker"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Previous change'), self.previousChange)
-        )
-        self.marginMenuActs["ClearChangeMarkers"] = (
-            self.indicMarginMenu.addAction(
-                self.tr('Clear changes'), self.__reinitOnlineChangeTrace)
-        )
-        
+        self.marginMenuActs["NextChangeMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Next change"), self.nextChange
+        )
+        self.marginMenuActs["PreviousChangeMarker"] = self.indicMarginMenu.addAction(
+            self.tr("Previous change"), self.previousChange
+        )
+        self.marginMenuActs["ClearChangeMarkers"] = self.indicMarginMenu.addAction(
+            self.tr("Clear changes"), self.__reinitOnlineChangeTrace
+        )
+
         self.indicMarginMenu.aboutToShow.connect(
-            lambda: self.__showContextMenuMargin(self.indicMarginMenu))
-        
+            lambda: self.__showContextMenuMargin(self.indicMarginMenu)
+        )
+
     def exportFile(self, exporterFormat):
         """
         Public method to export the file.
-        
+
         @param exporterFormat format the file should be exported into (string)
         """
         if exporterFormat:
             from . import Exporters
+
             exporter = Exporters.getExporter(exporterFormat, self)
             if exporter:
                 exporter.exportSource()
@@ -1447,14 +1448,16 @@
                     self.tr("Export source"),
                     self.tr(
                         """<p>No exporter available for the """
-                        """export format <b>{0}</b>. Aborting...</p>""")
-                    .format(exporterFormat))
+                        """export format <b>{0}</b>. Aborting...</p>"""
+                    ).format(exporterFormat),
+                )
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Export source"),
-                self.tr("""No export format given. Aborting..."""))
-        
+                self.tr("""No export format given. Aborting..."""),
+            )
+
     def __showContextMenuLanguages(self):
         """
         Private slot handling the aboutToShow signal of the languages context
@@ -1462,23 +1465,25 @@
         """
         if self.apiLanguage.startswith("Pygments|"):
             self.pygmentsSelAct.setText(
-                self.tr("Alternatives ({0})").format(
-                    self.getLanguage(normalized=False)))
+                self.tr("Alternatives ({0})").format(self.getLanguage(normalized=False))
+            )
         else:
             self.pygmentsSelAct.setText(self.tr("Alternatives"))
         self.showMenu.emit("Languages", self.languagesMenu, self)
-        
+
     def __selectPygmentsLexer(self):
         """
         Private method to select a specific pygments lexer.
-        
+
         @return name of the selected pygments lexer (string)
         """
         from pygments.lexers import get_all_lexers
+
         lexerList = sorted(lex[0] for lex in get_all_lexers())
         try:
             lexerSel = lexerList.index(
-                self.getLanguage(normalized=False, forPygments=True))
+                self.getLanguage(normalized=False, forPygments=True)
+            )
         except ValueError:
             lexerSel = 0
         lexerName, ok = QInputDialog.getItem(
@@ -1487,16 +1492,17 @@
             self.tr("Select the Pygments lexer to apply."),
             lexerList,
             lexerSel,
-            False)
+            False,
+        )
         if ok and lexerName:
             return lexerName
         else:
             return ""
-        
+
     def __languageMenuTriggered(self, act):
         """
         Private method to handle the selection of a lexer language.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         if act == self.noLanguageAct:
@@ -1513,47 +1519,42 @@
                 self.filetype = language
                 self.setLanguage(self.supportedLanguages[language][1])
                 self.checkSyntax()
-        
+
         self.__docstringGenerator = None
-        
+
     def __languageChanged(self, language, propagate=True):
         """
         Private slot handling a change of a connected editor's language.
-        
+
         @param language language to be set (string)
         @param propagate flag indicating to propagate the change (boolean)
         """
-        if language == '':
+        if language == "":
             self.__resetLanguage(propagate=propagate)
         elif language == "Guessed":
-            self.setLanguage("dummy.pygments",
-                             propagate=propagate)
+            self.setLanguage("dummy.pygments", propagate=propagate)
         elif language.startswith("Pygments|"):
             pyname = language.split("|", 1)[1]
-            self.setLanguage("dummy.pygments", pyname=pyname,
-                             propagate=propagate)
+            self.setLanguage("dummy.pygments", pyname=pyname, propagate=propagate)
         else:
             self.filetype = language
-            self.setLanguage(self.supportedLanguages[language][1],
-                             propagate=propagate)
+            self.setLanguage(self.supportedLanguages[language][1], propagate=propagate)
             self.checkSyntax()
-        
+
         self.__docstringGenerator = None
-        
+
     def __resetLanguage(self, propagate=True):
         """
         Private method used to reset the language selection.
-        
+
         @param propagate flag indicating to propagate the change (boolean)
         """
-        if (
-            self.lexer_ is not None and
-            (self.lexer_.lexer() == "container" or
-             self.lexer_.lexer() is None)
+        if self.lexer_ is not None and (
+            self.lexer_.lexer() == "container" or self.lexer_.lexer() is None
         ):
             with contextlib.suppress(TypeError):
                 self.SCN_STYLENEEDED.disconnect(self.__styleNeeded)
-        
+
         self.apiLanguage = ""
         self.lexer_ = None
         self.__lexerReset = True
@@ -1567,19 +1568,18 @@
         self.setMonospaced(useMonospaced)
         with contextlib.suppress(AttributeError):
             self.menuActs["MonospacedFont"].setChecked(self.useMonospaced)
-        
+
         self.__docstringGenerator = None
-        
+
         if not self.inLanguageChanged and propagate:
             self.inLanguageChanged = True
             self.languageChanged.emit(self.apiLanguage)
             self.inLanguageChanged = False
-        
-    def setLanguage(self, filename, initTextDisplay=True, propagate=True,
-                    pyname=""):
+
+    def setLanguage(self, filename, initTextDisplay=True, propagate=True, pyname=""):
         """
         Public method to set a lexer language.
-        
+
         @param filename filename used to determine the associated lexer
             language (string)
         @param initTextDisplay flag indicating an initialization of the text
@@ -1590,30 +1590,30 @@
         # clear all warning and syntax error markers
         self.clearSyntaxError()
         self.clearWarnings()
-        
+
         self.menuActs["MonospacedFont"].setChecked(False)
-        
+
         self.__lexerReset = False
         self.__bindLexer(filename, pyname=pyname)
         self.__bindCompleter(filename)
         self.recolor()
         self.__checkLanguage()
-        
+
         self.__docstringGenerator = None
-        
+
         # set the text display
         if initTextDisplay:
             self.__setTextDisplay()
-        
+
         # set the auto-completion and call-tips function
         self.__setAutoCompletion()
         self.__setCallTips()
-        
+
         if not self.inLanguageChanged and propagate:
             self.inLanguageChanged = True
             self.languageChanged.emit(self.apiLanguage)
             self.inLanguageChanged = False
-    
+
     def __checkLanguage(self):
         """
         Private method to check the selected language of the language submenu.
@@ -1628,104 +1628,102 @@
                 act.setChecked(False)
         else:
             self.supportedLanguages[self.apiLanguage][2].setChecked(True)
-    
+
     def projectLexerAssociationsChanged(self):
         """
         Public slot to handle changes of the project lexer associations.
         """
         self.setLanguage(self.fileName)
-    
+
     def __showContextMenuEncodings(self):
         """
         Private slot handling the aboutToShow signal of the encodings context
         menu.
         """
         self.showMenu.emit("Encodings", self.encodingsMenu, self)
-        
+
     def __encodingsMenuTriggered(self, act):
         """
         Private method to handle the selection of an encoding.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         encoding = act.data()
         self.setModified(True)
         self.__encodingChanged("{0}-selected".format(encoding))
-        
+
     def __checkEncoding(self):
         """
         Private method to check the selected encoding of the encodings submenu.
         """
         with contextlib.suppress(AttributeError, KeyError):
-            (self.supportedEncodings[self.__normalizedEncoding()]
-             .setChecked(True))
-        
+            (self.supportedEncodings[self.__normalizedEncoding()].setChecked(True))
+
     def __encodingChanged(self, encoding, propagate=True):
         """
         Private slot to handle a change of the encoding.
-        
+
         @param encoding changed encoding (string)
         @param propagate flag indicating to propagate the change (boolean)
         """
         self.encoding = encoding
         self.__checkEncoding()
-        
+
         if not self.inEncodingChanged and propagate:
             self.inEncodingChanged = True
             self.encodingChanged.emit(self.encoding)
             self.inEncodingChanged = False
-        
+
     def __normalizedEncoding(self, encoding=""):
         """
         Private method to calculate the normalized encoding string.
-        
+
         @param encoding encoding to be normalized (string)
         @return normalized encoding (string)
         """
         if not encoding:
             encoding = self.encoding
         return (
-            encoding
-            .replace("-default", "")
+            encoding.replace("-default", "")
             .replace("-guessed", "")
             .replace("-selected", "")
         )
-        
+
     def __showContextMenuEol(self):
         """
         Private slot handling the aboutToShow signal of the eol context menu.
         """
         self.showMenu.emit("Eol", self.eolMenu, self)
-        
+
     def __eolMenuTriggered(self, act):
         """
         Private method to handle the selection of an eol type.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         eol = act.data()
         self.setEolModeByEolString(eol)
         self.convertEols(self.eolMode())
-        
+
     def __checkEol(self):
         """
         Private method to check the selected eol type of the eol submenu.
         """
         with contextlib.suppress(AttributeError, TypeError):
             self.supportedEols[self.getLineSeparator()].setChecked(True)
-        
+
     def __eolChanged(self):
         """
         Private slot to handle a change of the eol mode.
         """
         self.__checkEol()
-        
+
         if not self.inEolChanged:
             self.inEolChanged = True
             eol = self.getLineSeparator()
             self.eolChanged.emit(eol)
             self.inEolChanged = False
-    
+
     def __showContextMenuSpellCheck(self):
         """
         Private slot handling the aboutToShow signal of the spell check
@@ -1734,31 +1732,33 @@
         spellingAvailable = SpellChecker.isAvailable()
         self.menuActs["SpellCheck"].setEnabled(spellingAvailable)
         self.menuActs["SpellCheckSelection"].setEnabled(
-            spellingAvailable and self.hasSelectedText())
+            spellingAvailable and self.hasSelectedText()
+        )
         self.menuActs["SpellCheckRemove"].setEnabled(
-            spellingAvailable and self.spellingMenuPos >= 0)
+            spellingAvailable and self.spellingMenuPos >= 0
+        )
         self.menuActs["SpellCheckLanguages"].setEnabled(spellingAvailable)
-        
+
         self.showMenu.emit("SpellCheck", self.spellCheckMenu, self)
-    
+
     def __showContextMenuSpellLanguages(self):
         """
         Private slot handling the aboutToShow signal of the spell check
         languages context menu.
         """
         self.showMenu.emit("SpellLanguage", self.spellLanguagesMenu, self)
-    
+
     def __spellLanguagesMenuTriggered(self, act):
         """
         Private method to handle the selection of a spell check language.
-        
+
         @param act reference to the action that was triggered
         @type QAction
         """
         language = act.data()
         self.__setSpellingLanguage(language)
         self.spellLanguageChanged.emit(language)
-    
+
     def __checkSpellLanguage(self):
         """
         Private slot to check the selected spell check language action.
@@ -1766,11 +1766,11 @@
         language = self.getSpellingLanguage()
         with contextlib.suppress(AttributeError, KeyError):
             self.supportedSpellLanguages[language].setChecked(True)
-    
+
     def __spellLanguageChanged(self, language, propagate=True):
         """
         Private slot to handle a change of the spell check language.
-        
+
         @param language new spell check language
         @type str
         @param propagate flag indicating to propagate the change
@@ -1778,35 +1778,30 @@
         """
         self.__setSpellingLanguage(language)
         self.__checkSpellLanguage()
-        
+
         if not self.__inSpellLanguageChanged and propagate:
             self.__inSpellLanguageChanged = True
             self.spellLanguageChanged.emit(language)
             self.__inSpellLanguageChanged = False
-    
+
     def __bindLexer(self, filename, pyname=""):
         """
         Private slot to set the correct lexer depending on language.
-        
+
         @param filename filename used to determine the associated lexer
             language (string)
         @param pyname name of the pygments lexer to use (string)
         """
-        if (
-            self.lexer_ is not None and
-            (self.lexer_.lexer() == "container" or
-             self.lexer_.lexer() is None)
+        if self.lexer_ is not None and (
+            self.lexer_.lexer() == "container" or self.lexer_.lexer() is None
         ):
             self.SCN_STYLENEEDED.disconnect(self.__styleNeeded)
-        
+
         language = ""
         if not self.filetype:
             if filename:
                 basename = os.path.basename(filename)
-                if (
-                    self.project.isOpen() and
-                    self.project.isProjectFile(filename)
-                ):
+                if self.project.isOpen() and self.project.isProjectFile(filename):
                     language = self.project.getEditorLexerAssoc(basename)
                 if not language:
                     language = Preferences.getEditorLexerAssoc(basename)
@@ -1814,36 +1809,43 @@
                 # no highlighting for plain text files
                 self.__resetLanguage()
                 return
-            
+
             if not language:
                 bindName = self.__bindName(self.text(0))
                 if bindName:
                     language = Preferences.getEditorLexerAssoc(bindName)
             if language == "Python":
                 # correction for Python
-                pyVer = Utilities.determinePythonVersion(
-                    filename, self.text(0), self)
+                pyVer = Utilities.determinePythonVersion(filename, self.text(0), self)
                 language = "Python{0}".format(pyVer)
-            if language in ['Python3', 'MicroPython', 'Cython', 'Ruby',
-                            'JavaScript', 'YAML', 'JSON']:
+            if language in [
+                "Python3",
+                "MicroPython",
+                "Cython",
+                "Ruby",
+                "JavaScript",
+                "YAML",
+                "JSON",
+            ]:
                 self.filetype = language
             else:
                 self.filetype = ""
         else:
             language = self.filetype
-        
+
         if language.startswith("Pygments|"):
             pyname = language
             self.filetype = language.split("|")[-1]
             language = ""
-        
+
         from . import Lexers
+
         self.lexer_ = Lexers.getLexer(language, self, pyname=pyname)
         if self.lexer_ is None:
             self.setLexer()
             self.apiLanguage = ""
             return
-        
+
         if pyname:
             if pyname.startswith("Pygments|"):
                 self.apiLanguage = pyname
@@ -1864,12 +1866,12 @@
         self.__setMarginsDisplay()
         if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None:
             self.SCN_STYLENEEDED.connect(self.__styleNeeded)
-        
+
         # get the font for style 0 and set it as the default font
         key = (
-            'Scintilla/Guessed/style0/font'
-            if pyname and pyname.startswith("Pygments|") else
-            'Scintilla/{0}/style0/font'.format(self.lexer_.language())
+            "Scintilla/Guessed/style0/font"
+            if pyname and pyname.startswith("Pygments|")
+            else "Scintilla/{0}/style0/font".format(self.lexer_.language())
         )
         fdesc = Preferences.getSettings().value(key)
         if fdesc is not None:
@@ -1878,60 +1880,58 @@
         self.lexer_.readSettings(Preferences.getSettings(), "Scintilla")
         if self.lexer_.hasSubstyles():
             self.lexer_.readSubstyles(self)
-        
+
         # now set the lexer properties
         self.lexer_.initProperties()
-        
+
         # initialize the lexer APIs settings
         projectType = (
             self.project.getProjectType()
             if self.project.isOpen() and self.project.isProjectFile(filename)
             else ""
         )
-        api = self.vm.getAPIsManager().getAPIs(self.apiLanguage,
-                                               projectType=projectType)
+        api = self.vm.getAPIsManager().getAPIs(
+            self.apiLanguage, projectType=projectType
+        )
         if api is not None and not api.isEmpty():
             self.lexer_.setAPIs(api.getQsciAPIs())
             self.acAPI = True
         else:
             self.acAPI = False
         self.autoCompletionAPIsAvailable.emit(self.acAPI)
-        
+
         self.__setAnnotationStyles()
-        
+
         self.lexer_.setDefaultColor(self.lexer_.color(0))
         self.lexer_.setDefaultPaper(self.lexer_.paper(0))
-        
+
     def __styleNeeded(self, position):
         """
         Private slot to handle the need for more styling.
-        
+
         @param position end position, that needs styling (integer)
         """
         self.lexer_.styleText(self.getEndStyled(), position)
-        
+
     def getLexer(self):
         """
         Public method to retrieve a reference to the lexer object.
-        
+
         @return the lexer object (Lexer)
         """
         return self.lexer_
-        
+
     def getLanguage(self, normalized=True, forPygments=False):
         """
         Public method to retrieve the language of the editor.
-        
+
         @param normalized flag indicating to normalize some Pygments
             lexer names (boolean)
         @param forPygments flag indicating to normalize some lexer
             names for Pygments (boolean)
         @return language of the editor (string)
         """
-        if (
-            self.apiLanguage == "Guessed" or
-            self.apiLanguage.startswith("Pygments|")
-        ):
+        if self.apiLanguage == "Guessed" or self.apiLanguage.startswith("Pygments|"):
             lang = self.lexer_.name()
             if normalized:
                 # adjust some Pygments lexer names
@@ -1939,7 +1939,7 @@
                     lang = "Python3"
                 elif lang == "Protocol Buffer":
                     lang = "Protocol"
-                    
+
         else:
             lang = self.apiLanguage
             if forPygments:
@@ -1949,27 +1949,27 @@
                 elif lang == "Protocol":
                     lang = "Protocol Buffer"
         return lang
-    
+
     def getApiLanguage(self):
         """
         Public method to get the API language of the editor.
-        
+
         @return API language
         @rtype str
         """
         return self.apiLanguage
-        
+
     def __bindCompleter(self, filename):
         """
         Private slot to set the correct typing completer depending on language.
-        
+
         @param filename filename used to determine the associated typing
             completer language (string)
         """
         if self.completer is not None:
             self.completer.setEnabled(False)
             self.completer = None
-        
+
         filename = os.path.basename(filename)
         apiLanguage = Preferences.getEditorLexerAssoc(filename)
         if apiLanguage == "":
@@ -1978,25 +1978,26 @@
                 apiLanguage = "Python{0}".format(pyVer)
             elif self.isRubyFile():
                 apiLanguage = "Ruby"
-        
+
         from . import TypingCompleters
+
         self.completer = TypingCompleters.getCompleter(apiLanguage, self)
-        
+
     def getCompleter(self):
         """
         Public method to retrieve a reference to the completer object.
-        
+
         @return the completer object (CompleterBase)
         """
         return self.completer
-        
+
     def __modificationChanged(self, m):
         """
         Private slot to handle the modificationChanged signal.
-        
+
         It emits the signal modificationStatusChanged with parameters
         m and self.
-        
+
         @param m modification status
         """
         if not m and bool(self.fileName) and pathlib.Path(self.fileName).exists():
@@ -2004,44 +2005,43 @@
         self.modificationStatusChanged.emit(m, self)
         self.undoAvailable.emit(self.isUndoAvailable())
         self.redoAvailable.emit(self.isRedoAvailable())
-        
+
     def __cursorPositionChanged(self, line, index):
         """
         Private slot to handle the cursorPositionChanged signal.
-        
+
         It emits the signal cursorChanged with parameters fileName,
         line and pos.
-        
+
         @param line line number of the cursor
         @param index position in line of the cursor
         """
         self.cursorChanged.emit(self.fileName, line + 1, index)
-        
+
         if Preferences.getEditor("MarkOccurrencesEnabled"):
             self.__markOccurrencesTimer.stop()
             self.__markOccurrencesTimer.start()
-        
+
         if self.lastLine != line:
             self.cursorLineChanged.emit(line)
-        
+
         if self.spell is not None:
             # do spell checking
             doSpelling = True
             if self.lastLine == line:
-                start, end = self.getWordBoundaries(
-                    line, index, useWordChars=False)
+                start, end = self.getWordBoundaries(line, index, useWordChars=False)
                 if start <= self.lastIndex and self.lastIndex <= end:
                     doSpelling = False
             if doSpelling:
                 pos = self.positionFromLineIndex(self.lastLine, self.lastIndex)
                 self.spell.checkWord(pos)
-        
+
         if self.lastLine != line:
             self.__markerMap.update()
-        
+
         self.lastLine = line
         self.lastIndex = index
-        
+
     def __modificationReadOnly(self):
         """
         Private slot to handle the modificationAttempted signal.
@@ -2049,46 +2049,49 @@
         EricMessageBox.warning(
             self,
             self.tr("Modification of Read Only file"),
-            self.tr("""You are attempting to change a read only file. """
-                    """Please save to a different file first."""))
-        
+            self.tr(
+                """You are attempting to change a read only file. """
+                """Please save to a different file first."""
+            ),
+        )
+
     def setNoName(self, noName):
         """
         Public method to set the display string for an unnamed editor.
-        
+
         @param noName display string for this unnamed editor (string)
         """
         self.noName = noName
-        
+
     def getNoName(self):
         """
         Public method to get the display string for an unnamed editor.
-        
+
         @return display string for this unnamed editor (string)
         """
         return self.noName
-        
+
     def getFileName(self):
         """
         Public method to return the name of the file being displayed.
-        
+
         @return filename of the displayed file (string)
         """
         return self.fileName
-        
+
     def getFileType(self):
         """
         Public method to return the type of the file being displayed.
-        
+
         @return type of the displayed file (string)
         """
         return self.filetype
-        
+
     def getFileTypeByFlag(self):
         """
         Public method to return the type of the file, if it was set by an
         eflag: marker.
-        
+
         @return type of the displayed file, if set by an eflag: marker or an
             empty string (string)
         """
@@ -2096,11 +2099,11 @@
             return self.filetype
         else:
             return ""
-        
+
     def determineFileType(self):
         """
         Public method to determine the file type using various tests.
-        
+
         @return type of the displayed file or an empty string (string)
         """
         ftype = self.filetype
@@ -2112,114 +2115,108 @@
                 ftype = "Ruby"
             else:
                 ftype = ""
-        
+
         return ftype
-        
+
     def getEncoding(self):
         """
         Public method to return the current encoding.
-        
+
         @return current encoding (string)
         """
         return self.encoding
-    
+
     def __getPyVersion(self):
         """
         Private method to return the Python main version or 0 if it's
         not a Python file at all.
-        
+
         @return Python version or 0 if it's not a Python file (int)
         """
-        return Utilities.determinePythonVersion(
-            self.fileName, self.text(0), self)
-    
+        return Utilities.determinePythonVersion(self.fileName, self.text(0), self)
+
     def isPyFile(self):
         """
         Public method to return a flag indicating a Python (2 or 3) file.
-        
+
         @return flag indicating a Python3 file (boolean)
         """
         return self.__getPyVersion() == 3
-    
+
     def isPy3File(self):
         """
         Public method to return a flag indicating a Python3 file.
-        
+
         @return flag indicating a Python3 file (boolean)
         """
         return self.__getPyVersion() == 3
-    
+
     def isMicroPythonFile(self):
         """
         Public method to return a flag indicating a MicroPython file.
-        
+
         @return flag indicating a MicroPython file
         @rtype bool
         """
         if self.filetype == "MicroPython":
             return True
-        
+
         return False
-    
+
     def isCythonFile(self):
         """
         Public method to return a flag indicating a Cython file.
-        
+
         @return flag indicating a Cython file
         @rtype bool
         """
         if self.filetype == "Cython":
             return True
-        
+
         return False
 
     def isRubyFile(self):
         """
         Public method to return a flag indicating a Ruby file.
-        
+
         @return flag indicating a Ruby file (boolean)
         """
         if self.filetype == "Ruby":
             return True
-        
+
         if self.filetype == "":
             line0 = self.text(0)
-            if (
-                line0.startswith("#!") and
-                "ruby" in line0
-            ):
+            if line0.startswith("#!") and "ruby" in line0:
                 self.filetype = "Ruby"
                 return True
-            
-            if (
-                bool(self.fileName) and
-                os.path.splitext(self.fileName)[1] in
-                    self.dbs.getExtensions('Ruby')
-            ):
+
+            if bool(self.fileName) and os.path.splitext(self.fileName)[
+                1
+            ] in self.dbs.getExtensions("Ruby"):
                 self.filetype = "Ruby"
                 return True
-        
+
         return False
 
     def isJavascriptFile(self):
         """
         Public method to return a flag indicating a Javascript file.
-        
+
         @return flag indicating a Javascript file (boolean)
         """
         if self.filetype == "JavaScript":
             return True
-        
+
         if (
-            self.filetype == "" and
-            self.fileName and
-            os.path.splitext(self.fileName)[1] == ".js"
+            self.filetype == ""
+            and self.fileName
+            and os.path.splitext(self.fileName)[1] == ".js"
         ):
             self.filetype = "JavaScript"
             return True
-        
+
         return False
-    
+
     def highlightVisible(self):
         """
         Public method to make sure that the highlight is visible.
@@ -2227,11 +2224,11 @@
         if self.lastHighlight is not None:
             lineno = self.markerLine(self.lastHighlight)
             self.ensureVisible(lineno + 1)
-        
+
     def highlight(self, line=None, error=False, syntaxError=False):
         """
         Public method to highlight [or de-highlight] a particular line.
-        
+
         @param line line number to highlight (integer)
         @param error flag indicating whether the error highlight should be
             used (boolean)
@@ -2254,31 +2251,41 @@
             else:
                 if self.lastCurrMarker is not None:
                     self.markerDeleteHandle(self.lastCurrMarker)
-                self.lastCurrMarker = self.markerAdd(line - 1,
-                                                     self.currentline)
+                self.lastCurrMarker = self.markerAdd(line - 1, self.currentline)
                 self.lastHighlight = self.lastCurrMarker
             self.setCursorPosition(line - 1, 0)
-        
+
     def getHighlightPosition(self):
         """
         Public method to return the position of the highlight bar.
-        
+
         @return line number of the highlight bar (integer)
         """
         if self.lastHighlight is not None:
             return self.markerLine(self.lastHighlight)
         else:
             return 1
-    
+
     ###########################################################################
     ## Breakpoint handling methods below
     ###########################################################################
 
-    def __modified(self, pos, mtype, text, length, linesAdded, line, foldNow,
-                   foldPrev, token, annotationLinesAdded):
+    def __modified(
+        self,
+        pos,
+        mtype,
+        text,
+        length,
+        linesAdded,
+        line,
+        foldNow,
+        foldPrev,
+        token,
+        annotationLinesAdded,
+    ):
         """
         Private method to handle changes of the number of lines.
-        
+
         @param pos start position of change (integer)
         @param mtype flags identifying the change (integer)
         @param text text that is given to the Undo system (string)
@@ -2292,41 +2299,36 @@
             (integer)
         """
         if (
-            mtype & (self.SC_MOD_INSERTTEXT | self.SC_MOD_DELETETEXT) and
-            linesAdded != 0 and
-            self.breaks
+            mtype & (self.SC_MOD_INSERTTEXT | self.SC_MOD_DELETETEXT)
+            and linesAdded != 0
+            and self.breaks
         ):
-            bps = []    # list of breakpoints
-            for handle, (ln, cond, temp, enabled, ignorecount) in (
-                self.breaks.items()
-            ):
+            bps = []  # list of breakpoints
+            for handle, (ln, cond, temp, enabled, ignorecount) in self.breaks.items():
                 line = self.markerLine(handle) + 1
                 if ln != line:
                     bps.append((ln, line))
-                    self.breaks[handle] = (line, cond, temp, enabled,
-                                           ignorecount)
+                    self.breaks[handle] = (line, cond, temp, enabled, ignorecount)
             self.inLinesChanged = True
             for ln, line in sorted(bps, reverse=linesAdded > 0):
-                index1 = self.breakpointModel.getBreakPointIndex(
-                    self.fileName, ln)
+                index1 = self.breakpointModel.getBreakPointIndex(self.fileName, ln)
                 index2 = self.breakpointModel.index(index1.row(), 1)
                 self.breakpointModel.setData(index2, line)
             self.inLinesChanged = False
-        
+
     def __restoreBreakpoints(self):
         """
         Private method to restore the breakpoints.
         """
         for handle in list(self.breaks.keys()):
             self.markerDeleteHandle(handle)
-        self.__addBreakPoints(
-            QModelIndex(), 0, self.breakpointModel.rowCount() - 1)
+        self.__addBreakPoints(QModelIndex(), 0, self.breakpointModel.rowCount() - 1)
         self.__markerMap.update()
-        
+
     def __deleteBreakPoints(self, parentIndex, start, end):
         """
         Private slot to delete breakpoints.
-        
+
         @param parentIndex index of parent item (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
@@ -2336,75 +2338,79 @@
             fn, lineno = self.breakpointModel.getBreakPointByIndex(index)[0:2]
             if fn == self.fileName:
                 self.clearBreakpoint(lineno)
-        
+
     def __changeBreakPoints(self, startIndex, endIndex):
         """
         Private slot to set changed breakpoints.
-        
+
         @param startIndex start index of the breakpoints being changed
             (QModelIndex)
         @param endIndex end index of the breakpoints being changed
             (QModelIndex)
         """
         if not self.inLinesChanged:
-            self.__addBreakPoints(QModelIndex(), startIndex.row(),
-                                  endIndex.row())
-        
+            self.__addBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def __breakPointDataAboutToBeChanged(self, startIndex, endIndex):
         """
         Private slot to handle the dataAboutToBeChanged signal of the
         breakpoint model.
-        
+
         @param startIndex start index of the rows to be changed (QModelIndex)
         @param endIndex end index of the rows to be changed (QModelIndex)
         """
-        self.__deleteBreakPoints(QModelIndex(), startIndex.row(),
-                                 endIndex.row())
-        
+        self.__deleteBreakPoints(QModelIndex(), startIndex.row(), endIndex.row())
+
     def __addBreakPoints(self, parentIndex, start, end):
         """
         Private slot to add breakpoints.
-        
+
         @param parentIndex index of parent item (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
         """
         for row in range(start, end + 1):
             index = self.breakpointModel.index(row, 0, parentIndex)
-            fn, line, cond, temp, enabled, ignorecount = (
-                self.breakpointModel.getBreakPointByIndex(index)[:6]
-            )
+            (
+                fn,
+                line,
+                cond,
+                temp,
+                enabled,
+                ignorecount,
+            ) = self.breakpointModel.getBreakPointByIndex(index)[:6]
             if fn == self.fileName:
                 self.newBreakpointWithProperties(
-                    line, (cond, temp, enabled, ignorecount))
-        
+                    line, (cond, temp, enabled, ignorecount)
+                )
+
     def clearBreakpoint(self, line):
         """
         Public method to clear a breakpoint.
-        
+
         Note: This doesn't clear the breakpoint in the debugger,
         it just deletes it from the editor internal list of breakpoints.
-        
+
         @param line line number of the breakpoint (integer)
         """
         if self.inLinesChanged:
             return
-        
+
         for handle in self.breaks:
             if self.markerLine(handle) == line - 1:
                 break
         else:
             # not found, simply ignore it
             return
-        
+
         del self.breaks[handle]
         self.markerDeleteHandle(handle)
         self.__markerMap.update()
-        
+
     def newBreakpointWithProperties(self, line, properties):
         """
         Public method to set a new breakpoint and its properties.
-        
+
         @param line line number of the breakpoint (integer)
         @param properties properties for the breakpoint (tuple)
                 (condition, temporary flag, enabled flag, ignore count)
@@ -2415,30 +2421,27 @@
             marker = properties[1] and self.tcbreakpoint or self.cbreakpoint
         else:
             marker = properties[1] and self.tbreakpoint or self.breakpoint
-            
+
         if self.markersAtLine(line - 1) & self.breakpointMask == 0:
             handle = self.markerAdd(line - 1, marker)
             self.breaks[handle] = (line,) + properties
             self.breakpointToggled.emit(self)
             self.__markerMap.update()
-        
+
     def __toggleBreakpoint(self, line, temporary=False):
         """
         Private method to toggle a breakpoint.
-        
+
         @param line line number of the breakpoint (integer)
         @param temporary flag indicating a temporary breakpoint (boolean)
         """
         for handle in self.breaks:
             if self.markerLine(handle) == line - 1:
                 # delete breakpoint or toggle it to the next state
-                index = self.breakpointModel.getBreakPointIndex(
-                    self.fileName, line)
-                if (
-                    Preferences.getDebugger("ThreeStateBreakPoints") and
-                    not self.breakpointModel.isBreakPointTemporaryByIndex(
-                        index)
-                ):
+                index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
+                if Preferences.getDebugger(
+                    "ThreeStateBreakPoints"
+                ) and not self.breakpointModel.isBreakPointTemporaryByIndex(index):
                     self.breakpointModel.deleteBreakPointByIndex(index)
                     self.__addBreakPoint(line, True)
                 else:
@@ -2451,7 +2454,7 @@
     def __addBreakPoint(self, line, temporary):
         """
         Private method to add a new breakpoint.
-        
+
         @param line line number of the breakpoint (integer)
         @param temporary flag indicating a temporary breakpoint (boolean)
         """
@@ -2468,43 +2471,46 @@
                     EricMessageBox.warning(
                         self,
                         self.tr("Add Breakpoint"),
-                        self.tr("No Python byte code will be created for the"
-                                " selected line. No break point will be set!")
+                        self.tr(
+                            "No Python byte code will be created for the"
+                            " selected line. No break point will be set!"
+                        ),
                     )
                 return
-            
+
             self.breakpointModel.addBreakPoint(
-                self.fileName, line, ('', temporary, True, 0))
+                self.fileName, line, ("", temporary, True, 0)
+            )
             self.breakpointToggled.emit(self)
-        
+
     def __toggleBreakpointEnabled(self, line):
         """
         Private method to toggle a breakpoints enabled status.
-        
+
         @param line line number of the breakpoint (integer)
         """
         for handle in self.breaks:
             if self.markerLine(handle) == line - 1:
-                index = self.breakpointModel.getBreakPointIndex(
-                    self.fileName, line)
+                index = self.breakpointModel.getBreakPointIndex(self.fileName, line)
                 self.breakpointModel.setBreakPointEnabledByIndex(
-                    index, not self.breaks[handle][3])
+                    index, not self.breaks[handle][3]
+                )
                 break
-        
+
     def curLineHasBreakpoint(self):
         """
         Public method to check for the presence of a breakpoint at the current
         line.
-        
+
         @return flag indicating the presence of a breakpoint (boolean)
         """
         line, _ = self.getCursorPosition()
         return self.markersAtLine(line) & self.breakpointMask != 0
-        
+
     def getBreakpointLines(self):
         """
         Public method to get the lines containing a breakpoint.
-        
+
         @return list of lines containing a breakpoint (list of integer)
         """
         lines = []
@@ -2516,15 +2522,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasBreakpoints(self):
         """
         Public method to check for the presence of breakpoints.
-        
+
         @return flag indicating the presence of breakpoints (boolean)
         """
         return len(self.breaks) > 0
-        
+
     def __menuToggleTemporaryBreakpoint(self):
         """
         Private slot to handle the 'Toggle temporary breakpoint' context menu
@@ -2535,7 +2541,7 @@
         self.line += 1
         self.__toggleBreakpoint(self.line, 1)
         self.line = -1
-        
+
     def menuToggleBreakpoint(self):
         """
         Public slot to handle the 'Toggle breakpoint' context menu action.
@@ -2545,7 +2551,7 @@
         self.line += 1
         self.__toggleBreakpoint(self.line)
         self.line = -1
-        
+
     def __menuToggleBreakpointEnabled(self):
         """
         Private slot to handle the 'Enable/Disable breakpoint' context menu
@@ -2556,60 +2562,62 @@
         self.line += 1
         self.__toggleBreakpointEnabled(self.line)
         self.line = -1
-        
+
     def menuEditBreakpoint(self, line=None):
         """
         Public slot to handle the 'Edit breakpoint' context menu action.
-        
+
         @param line linenumber of the breakpoint to edit
         """
         if line is not None:
             self.line = line - 1
         if self.line < 0:
             self.line, index = self.getCursorPosition()
-        
+
         for handle in self.breaks:
             if self.markerLine(handle) == self.line:
                 ln, cond, temp, enabled, ignorecount = self.breaks[handle]
-                index = self.breakpointModel.getBreakPointIndex(self.fileName,
-                                                                ln)
+                index = self.breakpointModel.getBreakPointIndex(self.fileName, ln)
                 if not index.isValid():
                     return
-                
+
                 # get recently used breakpoint conditions
-                rs = Preferences.Prefs.rsettings.value(
-                    recentNameBreakpointConditions)
+                rs = Preferences.Prefs.rsettings.value(recentNameBreakpointConditions)
                 condHistory = (
-                    Preferences.toList(rs)[
-                        :Preferences.getDebugger("RecentNumber")]
-                    if rs is not None else
-                    []
+                    Preferences.toList(rs)[: Preferences.getDebugger("RecentNumber")]
+                    if rs is not None
+                    else []
                 )
-                
+
                 from Debugger.EditBreakpointDialog import EditBreakpointDialog
+
                 dlg = EditBreakpointDialog(
                     (self.fileName, ln),
                     (cond, temp, enabled, ignorecount),
-                    condHistory, self, modal=True)
+                    condHistory,
+                    self,
+                    modal=True,
+                )
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     cond, temp, enabled, ignorecount = dlg.getData()
                     self.breakpointModel.setBreakPointByIndex(
-                        index, self.fileName, ln,
-                        (cond, temp, enabled, ignorecount))
-                    
+                        index, self.fileName, ln, (cond, temp, enabled, ignorecount)
+                    )
+
                     if cond:
                         # save the recently used breakpoint condition
                         if cond in condHistory:
                             condHistory.remove(cond)
                         condHistory.insert(0, cond)
                         Preferences.Prefs.rsettings.setValue(
-                            recentNameBreakpointConditions, condHistory)
+                            recentNameBreakpointConditions, condHistory
+                        )
                         Preferences.Prefs.rsettings.sync()
-                    
+
                     break
-        
+
         self.line = -1
-        
+
     def menuNextBreakpoint(self):
         """
         Public slot to handle the 'Next breakpoint' context menu action.
@@ -2626,7 +2634,7 @@
         if bpline >= 0:
             self.setCursorPosition(bpline, 0)
             self.ensureLineVisible(bpline)
-        
+
     def menuPreviousBreakpoint(self):
         """
         Public slot to handle the 'Previous breakpoint' context menu action.
@@ -2639,22 +2647,21 @@
         bpline = self.markerFindPrevious(line, self.breakpointMask)
         if bpline < 0:
             # wrap around
-            bpline = self.markerFindPrevious(
-                self.lines() - 1, self.breakpointMask)
+            bpline = self.markerFindPrevious(self.lines() - 1, self.breakpointMask)
         if bpline >= 0:
             self.setCursorPosition(bpline, 0)
             self.ensureLineVisible(bpline)
-        
+
     def __menuClearBreakpoints(self):
         """
         Private slot to handle the 'Clear all breakpoints' context menu action.
         """
         self.__clearBreakpoints(self.fileName)
-        
+
     def __clearBreakpoints(self, fileName):
         """
         Private slot to clear all breakpoints.
-        
+
         @param fileName name of the file (string)
         """
         idxList = []
@@ -2664,15 +2671,15 @@
                 idxList.append(index)
         if idxList:
             self.breakpointModel.deleteBreakPoints(idxList)
-    
+
     ###########################################################################
     ## Bookmark handling methods below
     ###########################################################################
-    
+
     def toggleBookmark(self, line):
         """
         Public method to toggle a bookmark.
-        
+
         @param line line number of the bookmark (integer)
         """
         for handle in self.bookmarks:
@@ -2686,25 +2693,25 @@
             self.bookmarks.append(handle)
         self.bookmarkToggled.emit(self)
         self.__markerMap.update()
-        
+
     def getBookmarks(self):
         """
         Public method to retrieve the bookmarks.
-        
+
         @return sorted list of all lines containing a bookmark
             (list of integer)
         """
         bmlist = []
         for handle in self.bookmarks:
             bmlist.append(self.markerLine(handle) + 1)
-        
+
         bmlist.sort()
         return bmlist
-        
+
     def getBookmarkLines(self):
         """
         Public method to get the lines containing a bookmark.
-        
+
         @return list of lines containing a bookmark (list of integer)
         """
         lines = []
@@ -2716,15 +2723,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasBookmarks(self):
         """
         Public method to check for the presence of bookmarks.
-        
+
         @return flag indicating the presence of bookmarks (boolean)
         """
         return len(self.bookmarks) > 0
-    
+
     def menuToggleBookmark(self):
         """
         Public slot to handle the 'Toggle bookmark' context menu action.
@@ -2734,7 +2741,7 @@
         self.line += 1
         self.toggleBookmark(self.line)
         self.line = -1
-        
+
     def nextBookmark(self):
         """
         Public slot to handle the 'Next bookmark' context menu action.
@@ -2751,7 +2758,7 @@
         if bmline >= 0:
             self.setCursorPosition(bmline, 0)
             self.ensureLineVisible(bmline)
-        
+
     def previousBookmark(self):
         """
         Public slot to handle the 'Previous bookmark' context menu action.
@@ -2764,12 +2771,11 @@
         bmline = self.markerFindPrevious(line, 1 << self.bookmark)
         if bmline < 0:
             # wrap around
-            bmline = self.markerFindPrevious(
-                self.lines() - 1, 1 << self.bookmark)
+            bmline = self.markerFindPrevious(self.lines() - 1, 1 << self.bookmark)
         if bmline >= 0:
             self.setCursorPosition(bmline, 0)
             self.ensureLineVisible(bmline)
-        
+
     def clearBookmarks(self):
         """
         Public slot to handle the 'Clear all bookmarks' context menu action.
@@ -2779,7 +2785,7 @@
         self.bookmarks.clear()
         self.bookmarkToggled.emit(self)
         self.__markerMap.update()
-    
+
     ###########################################################################
     ## Printing methods below
     ###########################################################################
@@ -2789,25 +2795,23 @@
         Public slot to print the text.
         """
         from .Printer import Printer
+
         printer = Printer(mode=QPrinter.PrinterMode.HighResolution)
         sb = ericApp().getObject("UserInterface").statusBar()
         printDialog = QPrintDialog(printer, self)
         if self.hasSelectedText():
             printDialog.setOption(
-                QAbstractPrintDialog.PrintDialogOption.PrintSelection,
-                True)
+                QAbstractPrintDialog.PrintDialogOption.PrintSelection, True
+            )
         if printDialog.exec() == QDialog.DialogCode.Accepted:
-            sb.showMessage(self.tr('Printing...'))
+            sb.showMessage(self.tr("Printing..."))
             QApplication.processEvents()
             fn = self.getFileName()
             if fn is not None:
                 printer.setDocName(os.path.basename(fn))
             else:
                 printer.setDocName(self.noName)
-            if (
-                printDialog.printRange() ==
-                QAbstractPrintDialog.PrintRange.Selection
-            ):
+            if printDialog.printRange() == QAbstractPrintDialog.PrintRange.Selection:
                 # get the selection
                 fromLine, fromIndex, toLine, toIndex = self.getSelection()
                 if toIndex == 0:
@@ -2817,12 +2821,12 @@
             else:
                 res = printer.printRange(self)
             if res:
-                sb.showMessage(self.tr('Printing completed'), 2000)
+                sb.showMessage(self.tr("Printing completed"), 2000)
             else:
-                sb.showMessage(self.tr('Error while printing'), 2000)
+                sb.showMessage(self.tr("Error while printing"), 2000)
             QApplication.processEvents()
         else:
-            sb.showMessage(self.tr('Printing aborted'), 2000)
+            sb.showMessage(self.tr("Printing aborted"), 2000)
             QApplication.processEvents()
 
     def printPreviewFile(self):
@@ -2831,7 +2835,7 @@
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
         from .Printer import Printer
-        
+
         printer = Printer(mode=QPrinter.PrinterMode.HighResolution)
         fn = self.getFileName()
         if fn is not None:
@@ -2841,24 +2845,24 @@
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested.connect(self.__printPreview)
         preview.exec()
-    
+
     def __printPreview(self, printer):
         """
         Private slot to generate a print preview.
-        
+
         @param printer reference to the printer object
             (QScintilla.Printer.Printer)
         """
         printer.printRange(self)
-    
+
     ###########################################################################
     ## Task handling methods below
     ###########################################################################
-    
+
     def getTaskLines(self):
         """
         Public method to get the lines containing a task.
-        
+
         @return list of lines containing a task (list of integer)
         """
         lines = []
@@ -2870,15 +2874,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasTaskMarkers(self):
         """
         Public method to determine, if this editor contains any task markers.
-        
+
         @return flag indicating the presence of task markers (boolean)
         """
         return self.__hasTaskMarkers
-        
+
     def nextTask(self):
         """
         Public slot to handle the 'Next task' context menu action.
@@ -2895,7 +2899,7 @@
         if taskline >= 0:
             self.setCursorPosition(taskline, 0)
             self.ensureLineVisible(taskline)
-        
+
     def previousTask(self):
         """
         Public slot to handle the 'Previous task' context menu action.
@@ -2908,36 +2912,36 @@
         taskline = self.markerFindPrevious(line, 1 << self.taskmarker)
         if taskline < 0:
             # wrap around
-            taskline = self.markerFindPrevious(
-                self.lines() - 1, 1 << self.taskmarker)
+            taskline = self.markerFindPrevious(self.lines() - 1, 1 << self.taskmarker)
         if taskline >= 0:
             self.setCursorPosition(taskline, 0)
             self.ensureLineVisible(taskline)
-        
+
     def extractTasks(self):
         """
         Public slot to extract all tasks.
         """
         from Tasks.Task import Task
+
         markers = {
             taskType: Preferences.getTasks(markersName).split()
             for taskType, markersName in Task.TaskType2MarkersName.items()
         }
         txtList = self.text().split(self.getLineSeparator())
-        
+
         # clear all task markers and tasks
         self.markerDeleteAll(self.taskmarker)
         self.taskViewer.clearFileTasks(self.fileName)
         self.__hasTaskMarkers = False
-        
+
         # now search tasks and record them
         for lineIndex, line in enumerate(txtList):
             shouldBreak = False
-            
+
             if line.endswith("__NO-TASK__"):
                 # ignore potential task marker
                 continue
-            
+
             for taskType, taskMarkers in markers.items():
                 for taskMarker in taskMarkers:
                     index = line.find(taskMarker)
@@ -2945,7 +2949,8 @@
                         task = line[index:]
                         self.markerAdd(lineIndex, self.taskmarker)
                         self.taskViewer.addFileTask(
-                            task, self.fileName, lineIndex + 1, taskType)
+                            task, self.fileName, lineIndex + 1, taskType
+                        )
                         self.__hasTaskMarkers = True
                         shouldBreak = True
                         break
@@ -2953,15 +2958,15 @@
                     break
         self.taskMarkersUpdated.emit(self)
         self.__markerMap.update()
-    
+
     ###########################################################################
     ## Change tracing methods below
     ###########################################################################
-    
+
     def __createChangeMarkerPixmap(self, key, size=16, width=4):
         """
         Private method to create a pixmap for the change markers.
-        
+
         @param key key of the color to use (string)
         @param size size of the pixmap (integer)
         @param width width of the marker line (integer)
@@ -2970,11 +2975,10 @@
         pixmap = QPixmap(size, size)
         pixmap.fill(Qt.GlobalColor.transparent)
         painter = QPainter(pixmap)
-        painter.fillRect(size - 4, 0, 4, size,
-                         Preferences.getEditorColour(key))
+        painter.fillRect(size - 4, 0, 4, size, Preferences.getEditorColour(key))
         painter.end()
         return pixmap
-        
+
     def __initOnlineChangeTrace(self):
         """
         Private slot to initialize the online change trace.
@@ -2985,11 +2989,13 @@
         self.__onlineChangeTraceTimer = QTimer(self)
         self.__onlineChangeTraceTimer.setSingleShot(True)
         self.__onlineChangeTraceTimer.setInterval(
-            Preferences.getEditor("OnlineChangeTraceInterval"))
+            Preferences.getEditor("OnlineChangeTraceInterval")
+        )
         self.__onlineChangeTraceTimer.timeout.connect(
-            self.__onlineChangeTraceTimerTimeout)
+            self.__onlineChangeTraceTimerTimeout
+        )
         self.textChanged.connect(self.__resetOnlineChangeTraceTimer)
-        
+
     def __reinitOnlineChangeTrace(self):
         """
         Private slot to re-initialize the online change trace.
@@ -2997,7 +3003,7 @@
         self.__oldText = self.text()
         self.__lastSavedText = self.text()
         self.__deleteAllChangeMarkers()
-        
+
     def __resetOnlineChangeTraceTimer(self):
         """
         Private method to reset the online syntax check timer.
@@ -3005,61 +3011,61 @@
         if Preferences.getEditor("OnlineChangeTrace"):
             self.__onlineChangeTraceTimer.stop()
             self.__onlineChangeTraceTimer.start()
-        
+
     def __onlineChangeTraceTimerTimeout(self):
         """
         Private slot to mark added and changed lines.
         """
         self.__deleteAllChangeMarkers()
-        
+
         # step 1: mark saved changes
         oldL = self.__oldText.splitlines()
         newL = self.__lastSavedText.splitlines()
         matcher = difflib.SequenceMatcher(None, oldL, newL)
-        
+
         for token, _, _, j1, j2 in matcher.get_opcodes():
             if token in ["insert", "replace"]:
                 for lineNo in range(j1, j2):
                     self.markerAdd(lineNo, self.__changeMarkerSaved)
                     self.__hasChangeMarkers = True
-        
+
         # step 2: mark unsaved changes
         oldL = self.__lastSavedText.splitlines()
         newL = self.text().splitlines()
         matcher = difflib.SequenceMatcher(None, oldL, newL)
-        
+
         for token, _, _, j1, j2 in matcher.get_opcodes():
             if token in ["insert", "replace"]:
                 for lineNo in range(j1, j2):
                     self.markerAdd(lineNo, self.__changeMarkerUnsaved)
                     self.__hasChangeMarkers = True
-        
+
         if self.__hasChangeMarkers:
             self.changeMarkersUpdated.emit(self)
             self.__markerMap.update()
-        
+
     def __resetOnlineChangeTraceInfo(self):
         """
         Private slot to reset the online change trace info.
         """
         self.__lastSavedText = self.text()
         self.__deleteAllChangeMarkers()
-        
+
         # mark saved changes
         oldL = self.__oldText.splitlines()
         newL = self.__lastSavedText.splitlines()
         matcher = difflib.SequenceMatcher(None, oldL, newL)
-        
+
         for token, _, _, j1, j2 in matcher.get_opcodes():
             if token in ["insert", "replace"]:
                 for lineNo in range(j1, j2):
                     self.markerAdd(lineNo, self.__changeMarkerSaved)
                     self.__hasChangeMarkers = True
-        
+
         if self.__hasChangeMarkers:
             self.changeMarkersUpdated.emit(self)
             self.__markerMap.update()
-        
+
     def __deleteAllChangeMarkers(self):
         """
         Private slot to delete all change markers.
@@ -3069,11 +3075,11 @@
         self.__hasChangeMarkers = False
         self.changeMarkersUpdated.emit(self)
         self.__markerMap.update()
-        
+
     def getChangeLines(self):
         """
         Public method to get the lines containing a change.
-        
+
         @return list of lines containing a change (list of integer)
         """
         lines = []
@@ -3085,15 +3091,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasChangeMarkers(self):
         """
         Public method to determine, if this editor contains any change markers.
-        
+
         @return flag indicating the presence of change markers (boolean)
         """
         return self.__hasChangeMarkers
-        
+
     def nextChange(self):
         """
         Public slot to handle the 'Next change' context menu action.
@@ -3110,7 +3116,7 @@
         if changeline >= 0:
             self.setCursorPosition(changeline, 0)
             self.ensureLineVisible(changeline)
-        
+
     def previousChange(self):
         """
         Public slot to handle the 'Previous change' context menu action.
@@ -3124,26 +3130,27 @@
         if changeline < 0:
             # wrap around
             changeline = self.markerFindPrevious(
-                self.lines() - 1, self.changeMarkersMask)
+                self.lines() - 1, self.changeMarkersMask
+            )
         if changeline >= 0:
             self.setCursorPosition(changeline, 0)
             self.ensureLineVisible(changeline)
-    
+
     ###########################################################################
     ## Flags handling methods below
     ###########################################################################
-    
+
     def __processFlags(self):
         """
         Private method to extract flags and process them.
-        
+
         @return list of change flags (list of string)
         """
         txt = self.text()
         flags = Utilities.extractFlags(txt)
-        
+
         changedFlags = []
-        
+
         # Flag 1: FileType
         if "FileType" in flags:
             oldFiletype = self.filetype
@@ -3158,17 +3165,17 @@
                 self.filetypeByFlag = False
                 self.__bindName(txt.splitlines()[0])
                 changedFlags.append("FileType")
-        
+
         return changedFlags
-    
+
     ###########################################################################
     ## File handling methods below
     ###########################################################################
-    
+
     def checkDirty(self):
         """
         Public method to check dirty status and open a message window.
-        
+
         @return flag indicating successful reset of the dirty flag (boolean)
         """
         if self.isModified():
@@ -3178,15 +3185,15 @@
             res = EricMessageBox.okToClearData(
                 self,
                 self.tr("File Modified"),
-                self.tr("<p>The file <b>{0}</b> has unsaved changes.</p>")
-                .format(fn),
-                self.saveFile)
+                self.tr("<p>The file <b>{0}</b> has unsaved changes.</p>").format(fn),
+                self.saveFile,
+            )
             if res:
                 self.vm.setEditorName(self, self.fileName)
             return res
-        
+
         return True
-        
+
     def revertToUnmodified(self):
         """
         Public method to revert back to the last saved state.
@@ -3206,11 +3213,11 @@
                 else:
                     break
                     # Couldn't find the unmodified state
-    
+
     def readFile(self, fn, createIt=False, encoding=""):
         """
         Public slot to read the text from a file.
-        
+
         @param fn filename to read from (string)
         @param createIt flag indicating the creation of a new file, if the
             given one doesn't exist (boolean)
@@ -3218,61 +3225,61 @@
             (Note: this parameter overrides encoding detection)
         """
         self.__loadEditorConfig(fileName=fn)
-        
+
         try:
             with EricOverrideCursor():
                 if createIt and not os.path.exists(fn):
                     with open(fn, "w"):
                         pass
                 if encoding == "":
-                    encoding = self.__getEditorConfig("DefaultEncoding",
-                                                      nodefault=True)
+                    encoding = self.__getEditorConfig("DefaultEncoding", nodefault=True)
                 if encoding:
                     txt, self.encoding = Utilities.readEncodedFileWithEncoding(
-                        fn, encoding)
+                        fn, encoding
+                    )
                 else:
                     txt, self.encoding = Utilities.readEncodedFile(fn)
         except (UnicodeDecodeError, OSError) as why:
             EricMessageBox.critical(
                 self.vm,
-                self.tr('Open File'),
-                self.tr('<p>The file <b>{0}</b> could not be opened.</p>'
-                        '<p>Reason: {1}</p>')
-                    .format(fn, str(why)))
+                self.tr("Open File"),
+                self.tr(
+                    "<p>The file <b>{0}</b> could not be opened.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(fn, str(why)),
+            )
             raise
-        
+
         with EricOverrideCursor():
             modified = False
-            
+
             self.setText(txt)
-            
+
             # get eric specific flags
             self.__processFlags()
-            
+
             # perform automatic EOL conversion
-            if (
-                self.__getEditorConfig("EOLMode", nodefault=True) or
-                Preferences.getEditor("AutomaticEOLConversion")
-            ):
+            if self.__getEditorConfig(
+                "EOLMode", nodefault=True
+            ) or Preferences.getEditor("AutomaticEOLConversion"):
                 self.convertEols(self.eolMode())
             else:
                 fileEol = self.detectEolString(txt)
                 self.setEolModeByEolString(fileEol)
-            
+
             self.extractTasks()
-            
+
             self.setModified(modified)
             self.lastModified = pathlib.Path(fn).stat().st_mtime
-    
+
     def __convertTabs(self):
         """
         Private slot to convert tabulators to spaces.
         """
         if (
-            (not self.__getEditorConfig("TabForIndentation")) and
-            Preferences.getEditor("ConvertTabsOnLoad") and
-            not (self.lexer_ and
-                 self.lexer_.alwaysKeepTabs())
+            (not self.__getEditorConfig("TabForIndentation"))
+            and Preferences.getEditor("ConvertTabsOnLoad")
+            and not (self.lexer_ and self.lexer_.alwaysKeepTabs())
         ):
             txt = self.text()
             txtExpanded = txt.expandtabs(self.__getEditorConfig("TabWidth"))
@@ -3280,56 +3287,56 @@
                 self.beginUndoAction()
                 self.setText(txt)
                 self.endUndoAction()
-                
+
                 self.setModified(True)
-    
+
     def __removeTrailingWhitespace(self):
         """
         Private method to remove trailing whitespace.
         """
-        searchRE = r"[ \t]+$"    # whitespace at the end of a line
-        
+        searchRE = r"[ \t]+$"  # whitespace at the end of a line
+
         ok = self.findFirstTarget(searchRE, True, False, False, 0, 0)
         self.beginUndoAction()
         while ok:
             self.replaceTarget("")
             ok = self.findNextTarget()
         self.endUndoAction()
-        
+
     def writeFile(self, fn, backup=True):
         """
         Public slot to write the text to a file.
-        
+
         @param fn filename to write to (string)
         @param backup flag indicating to save a backup (boolean)
         @return flag indicating success (boolean)
         """
         config = self.__loadEditorConfigObject(fn)
-        
+
         eol = self.__getEditorConfig("EOLMode", nodefault=True, config=config)
         if eol is not None:
             self.convertEols(eol)
-        
+
         if self.__getEditorConfig("StripTrailingWhitespace", config=config):
             self.__removeTrailingWhitespace()
-        
+
         txt = self.text()
-        
+
         if self.__getEditorConfig("InsertFinalNewline", config=config):
             eol = self.getLineSeparator()
             if eol:
                 if len(txt) >= len(eol):
-                    if txt[-len(eol):] != eol:
+                    if txt[-len(eol) :] != eol:
                         txt += eol
                 else:
                     txt += eol
-        
+
         # create a backup file, if the option is set
         createBackup = backup and Preferences.getEditor("CreateBackupFile")
         if createBackup:
             if os.path.islink(fn):
                 fn = os.path.realpath(fn)
-            bfn = '{0}~'.format(fn)
+            bfn = "{0}~".format(fn)
             try:
                 permissions = os.stat(fn).st_mode
                 perms_valid = True
@@ -3340,54 +3347,51 @@
                 os.remove(bfn)
             with contextlib.suppress(OSError):
                 os.rename(fn, bfn)
-        
+
         # now write text to the file fn
         try:
             editorConfigEncoding = self.__getEditorConfig(
-                "DefaultEncoding", nodefault=True, config=config)
+                "DefaultEncoding", nodefault=True, config=config
+            )
             self.encoding = Utilities.writeEncodedFile(
-                fn, txt, self.encoding, forcedEncoding=editorConfigEncoding)
+                fn, txt, self.encoding, forcedEncoding=editorConfigEncoding
+            )
             if createBackup and perms_valid:
                 os.chmod(fn, permissions)
             return True
         except (OSError, Utilities.CodingError, UnicodeError) as why:
             EricMessageBox.critical(
                 self,
-                self.tr('Save File'),
-                self.tr('<p>The file <b>{0}</b> could not be saved.<br/>'
-                        'Reason: {1}</p>')
-                .format(fn, str(why)))
+                self.tr("Save File"),
+                self.tr(
+                    "<p>The file <b>{0}</b> could not be saved.<br/>" "Reason: {1}</p>"
+                ).format(fn, str(why)),
+            )
             return False
-        
+
     def __getSaveFileName(self, path=None):
         """
         Private method to get the name of the file to be saved.
-        
+
         @param path directory to save the file in (string)
         @return file name (string)
         """
         # save to project, if a project is loaded
         if self.project.isOpen():
-            if (
-                self.fileName and
-                self.project.startswithProjectPath(self.fileName)
-            ):
+            if self.fileName and self.project.startswithProjectPath(self.fileName):
                 path = os.path.dirname(self.fileName)
             elif not self.fileName:
                 path = self.project.getProjectPath()
-        
+
         if not path and self.fileName:
             path = os.path.dirname(self.fileName)
         if not path:
-            path = (
-                Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir()
-            )
-        
+            path = Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
+
         from . import Lexers
+
         if self.fileName:
-            filterPattern = "(*{0})".format(
-                os.path.splitext(self.fileName)[1])
+            filterPattern = "(*{0})".format(os.path.splitext(self.fileName)[1])
             for fileFilter in Lexers.getSaveFileFiltersList(True):
                 if filterPattern in fileFilter:
                     defaultFilter = fileFilter
@@ -3402,12 +3406,13 @@
             path,
             Lexers.getSaveFileFiltersList(True, True),
             defaultFilter,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if fn:
             if fn.endswith("."):
                 fn = fn[:-1]
-            
+
             fpath = pathlib.Path(fn)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -3417,67 +3422,62 @@
                 res = EricMessageBox.yesNo(
                     self,
                     self.tr("Save File"),
-                    self.tr("<p>The file <b>{0}</b> already exists."
-                            " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                    self.tr(
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return ""
-        
+
             return str(fpath)
-        
+
         return ""
-    
+
     def saveFileCopy(self, path=None):
         """
         Public method to save a copy of the file.
-        
+
         @param path directory to save the file in (string)
         @return flag indicating success (boolean)
         """
         fn = self.__getSaveFileName(path)
         if not fn:
             return False
-        
+
         res = self.writeFile(fn)
-        if (
-            res and
-            self.project.isOpen() and
-            self.project.startswithProjectPath(fn)
-        ):
+        if res and self.project.isOpen() and self.project.startswithProjectPath(fn):
             # save to project, if a project is loaded
             self.project.appendFile(fn)
-        
+
         return res
-        
+
     def saveFile(self, saveas=False, path=None):
         """
         Public method to save the text to a file.
-        
+
         @param saveas flag indicating a 'save as' action (boolean)
         @param path directory to save the file in (string)
         @return flag indicating success (boolean)
         """
         if not saveas and not self.isModified():
-            return False      # do nothing if text wasn't changed
-            
+            return False  # do nothing if text wasn't changed
+
         newName = None
         if saveas or self.fileName == "":
             saveas = True
-            
+
             fn = self.__getSaveFileName(path)
             if not fn:
                 return False
-            
+
             newName = fn
-            
+
             # save to project, if a project is loaded
-            if (
-                self.project.isOpen() and
-                self.project.startswithProjectPath(fn)
-            ):
+            if self.project.isOpen() and self.project.startswithProjectPath(fn):
                 editorConfigEol = self.__getEditorConfig(
-                    "EOLMode", nodefault=True,
-                    config=self.__loadEditorConfigObject(fn))
+                    "EOLMode", nodefault=True, config=self.__loadEditorConfigObject(fn)
+                )
                 if editorConfigEol is not None:
                     self.setEolMode(editorConfigEol)
                 else:
@@ -3485,7 +3485,7 @@
                 self.convertEols(self.eolMode())
         else:
             fn = self.fileName
-        
+
         self.__loadEditorConfig(fn)
         self.editorAboutToBeSaved.emit(self.fileName)
         if self.writeFile(fn):
@@ -3499,22 +3499,19 @@
             changedFlags = self.__processFlags()
             if not self.__lexerReset and "FileType" in changedFlags:
                 self.setLanguage(self.fileName)
-            
+
             if saveas:
                 self.isResourcesFile = self.fileName.endswith(".qrc")
                 self.__initContextMenu()
                 self.editorRenamed.emit(self.fileName)
-                
+
                 # save to project, if a project is loaded
-                if (
-                    self.project.isOpen() and
-                    self.project.startswithProjectPath(fn)
-                ):
+                if self.project.isOpen() and self.project.startswithProjectPath(fn):
                     self.project.appendFile(fn)
                     self.addedToProject()
-                
+
                 self.setLanguage(self.fileName)
-            
+
             self.lastModified = pathlib.Path(fn).stat().st_mtime
             if newName is not None:
                 self.vm.addToRecentList(newName)
@@ -3526,16 +3523,14 @@
             return True
         else:
             self.lastModified = (
-                pathlib.Path(fn).stat().st_mtime
-                if pathlib.Path(fn).exists() else
-                0
+                pathlib.Path(fn).stat().st_mtime if pathlib.Path(fn).exists() else 0
             )
             return False
-        
+
     def saveFileAs(self, path=None, toProject=False):
         """
         Public slot to save a file with a new name.
-        
+
         @param path directory to save the file in (string)
         @param toProject flag indicating a save to project operation
             (boolean)
@@ -3543,31 +3538,31 @@
             indicator and the name of the saved file
         """
         return self.saveFile(True, path)
-        
+
     def handleRenamed(self, fn):
         """
         Public slot to handle the editorRenamed signal.
-        
+
         @param fn filename to be set for the editor (string).
         """
         self.__clearBreakpoints(fn)
-        
+
         self.__setFileName(fn)
         self.setWindowTitle(self.fileName)
-        
+
         self.__loadEditorConfig()
-        
+
         if self.lexer_ is None:
             self.setLanguage(self.fileName)
-        
+
         self.lastModified = pathlib.Path(fn).stat().st_mtime
         self.vm.setEditorName(self, self.fileName)
         self.__updateReadOnly(True)
-        
+
     def fileRenamed(self, fn):
         """
         Public slot to handle the editorRenamed signal.
-        
+
         @param fn filename to be set for the editor (string).
         """
         self.handleRenamed(fn)
@@ -3575,7 +3570,7 @@
             self.inFileRenamed = True
             self.editorRenamed.emit(self.fileName)
             self.inFileRenamed = False
-    
+
     ###########################################################################
     ## Utility methods below
     ###########################################################################
@@ -3583,7 +3578,7 @@
     def ensureVisible(self, line, expand=False):
         """
         Public slot to ensure, that the specified line is visible.
-        
+
         @param line line number to make visible
         @type int
         @param expand flag indicating to expand all folds
@@ -3591,14 +3586,17 @@
         """
         self.ensureLineVisible(line - 1)
         if expand:
-            self.SendScintilla(QsciScintilla.SCI_FOLDCHILDREN, line - 1,
-                               QsciScintilla.SC_FOLDACTION_EXPAND)
-        
+            self.SendScintilla(
+                QsciScintilla.SCI_FOLDCHILDREN,
+                line - 1,
+                QsciScintilla.SC_FOLDACTION_EXPAND,
+            )
+
     def ensureVisibleTop(self, line, expand=False):
         """
         Public slot to ensure, that the specified line is visible at the top
         of the editor.
-        
+
         @param line line number to make visible
         @type int
         @param expand flag indicating to expand all folds
@@ -3608,13 +3606,16 @@
         self.setFirstVisibleLine(line - 1)
         self.ensureCursorVisible()
         if expand:
-            self.SendScintilla(QsciScintilla.SCI_FOLDCHILDREN, line - 1,
-                               QsciScintilla.SC_FOLDACTION_EXPAND)
-        
+            self.SendScintilla(
+                QsciScintilla.SCI_FOLDCHILDREN,
+                line - 1,
+                QsciScintilla.SC_FOLDACTION_EXPAND,
+            )
+
     def __marginClicked(self, margin, line, modifiers):
         """
         Private slot to handle the marginClicked signal.
-        
+
         @param margin id of the clicked margin (integer)
         @param line line number of the click (integer)
         @param modifiers keyboard modifiers (Qt.KeyboardModifiers)
@@ -3628,7 +3629,7 @@
                 self.__showSyntaxError(line)
             elif self.markersAtLine(line) & (1 << self.warning):
                 self.__showWarning(line)
-        
+
     def handleMonospacedEnable(self):
         """
         Public slot to handle the Use Monospaced Font context menu entry.
@@ -3638,18 +3639,17 @@
                 self.setMonospaced(True)
         else:
             if self.lexer_:
-                self.lexer_.readSettings(
-                    Preferences.getSettings(), "Scintilla")
+                self.lexer_.readSettings(Preferences.getSettings(), "Scintilla")
                 if self.lexer_.hasSubstyles():
                     self.lexer_.readSubstyles(self)
                 self.lexer_.initProperties()
             self.setMonospaced(False)
             self.__setMarginsDisplay()
-        
+
     def getWordBoundaries(self, line, index, useWordChars=True):
         """
         Public method to get the word boundaries at a position.
-        
+
         @param line number of line to look at (int)
         @param index position to look at (int)
         @param useWordChars flag indicating to use the wordCharacters
@@ -3661,26 +3661,26 @@
         if wc is None or not useWordChars:
             pattern = r"\b[\w_]+\b"
         else:
-            wc = re.sub(r'\w', "", wc)
+            wc = re.sub(r"\w", "", wc)
             pattern = r"\b[\w{0}]+\b".format(re.escape(wc))
         rx = (
             re.compile(pattern)
-            if self.caseSensitive() else
-            re.compile(pattern, re.IGNORECASE)
-        )
-        
+            if self.caseSensitive()
+            else re.compile(pattern, re.IGNORECASE)
+        )
+
         text = self.text(line)
         for match in rx.finditer(text):
             start, end = match.span()
             if start <= index <= end:
                 return (start, end)
-        
+
         return (index, index)
-    
+
     def getWord(self, line, index, direction=0, useWordChars=True):
         """
         Public method to get the word at a position.
-        
+
         @param line number of line to look at (int)
         @param index position to look at (int)
         @param direction direction to look in (0 = whole word, 1 = left,
@@ -3698,114 +3698,114 @@
             text = self.text(line)
             word = text[start:end]
         else:
-            word = ''
+            word = ""
         return word
-        
+
     def getWordLeft(self, line, index):
         """
         Public method to get the word to the left of a position.
-        
+
         @param line number of line to look at (int)
         @param index position to look at (int)
         @return the word to the left of that position (string)
         """
         return self.getWord(line, index, 1)
-        
+
     def getWordRight(self, line, index):
         """
         Public method to get the word to the right of a position.
-        
+
         @param line number of line to look at (int)
         @param index position to look at (int)
         @return the word to the right of that position (string)
         """
         return self.getWord(line, index, 2)
-        
+
     def getCurrentWord(self):
         """
         Public method to get the word at the current position.
-        
+
         @return the word at that current position (string)
         """
         line, index = self.getCursorPosition()
         return self.getWord(line, index)
-        
+
     def getCurrentWordBoundaries(self):
         """
         Public method to get the word boundaries at the current position.
-        
+
         @return tuple with start and end indexes of the current word
             (integer, integer)
         """
         line, index = self.getCursorPosition()
         return self.getWordBoundaries(line, index)
-        
+
     def selectWord(self, line, index):
         """
         Public method to select the word at a position.
-        
+
         @param line number of line to look at (int)
         @param index position to look at (int)
         """
         start, end = self.getWordBoundaries(line, index)
         self.setSelection(line, start, line, end)
-        
+
     def selectCurrentWord(self):
         """
         Public method to select the current word.
         """
         line, index = self.getCursorPosition()
         self.selectWord(line, index)
-        
+
     def __getCharacter(self, pos):
         """
         Private method to get the character to the left of the current position
         in the current line.
-        
+
         @param pos position to get character at (integer)
         @return requested character or "", if there are no more (string) and
             the next position (i.e. pos - 1)
         """
         if pos <= 0:
             return "", pos
-        
+
         pos = self.positionBefore(pos)
         ch = self.charAt(pos)
-        
+
         # Don't go past the end of the previous line
-        if ch in ('\n', '\r'):
+        if ch in ("\n", "\r"):
             return "", pos
-        
+
         return ch, pos
-    
+
     def getSearchText(self, selectionOnly=False):
         """
         Public method to determine the selection or the current word for the
         next search operation.
-        
+
         @param selectionOnly flag indicating that only selected text should be
             returned (boolean)
         @return selection or current word (string)
         """
         if self.hasSelectedText():
             text = self.selectedText()
-            if '\r' in text or '\n' in text:
+            if "\r" in text or "\n" in text:
                 # the selection contains at least a newline, it is
                 # unlikely to be the expression to search for
-                return ''
-            
+                return ""
+
             return text
-        
+
         if not selectionOnly:
             # no selected text, determine the word at the current position
             return self.getCurrentWord()
-        
-        return ''
-        
+
+        return ""
+
     def setSearchIndicator(self, startPos, indicLength):
         """
         Public method to set a search indicator for the given range.
-        
+
         @param startPos start position of the indicator (integer)
         @param indicLength length of the indicator (integer)
         """
@@ -3813,7 +3813,7 @@
         line = self.lineIndexFromPosition(startPos)[0]
         if line not in self.__searchIndicatorLines:
             self.__searchIndicatorLines.append(line)
-        
+
     def clearSearchIndicators(self):
         """
         Public method to clear all search indicators.
@@ -3822,7 +3822,7 @@
         self.__markedText = ""
         self.__searchIndicatorLines = []
         self.__markerMap.update()
-        
+
     def __markOccurrences(self):
         """
         Private method to mark all occurrences of the current word.
@@ -3831,42 +3831,41 @@
         if not word:
             self.clearSearchIndicators()
             return
-        
+
         if self.__markedText == word:
             return
-        
+
         self.clearSearchIndicators()
-        ok = self.findFirstTarget(word, False, self.caseSensitive(), True,
-                                  0, 0)
+        ok = self.findFirstTarget(word, False, self.caseSensitive(), True, 0, 0)
         while ok:
             tgtPos, tgtLen = self.getFoundTarget()
             self.setSearchIndicator(tgtPos, tgtLen)
             ok = self.findNextTarget()
         self.__markedText = word
         self.__markerMap.update()
-    
+
     def getSearchIndicatorLines(self):
         """
         Public method to get the lines containing a search indicator.
-        
+
         @return list of lines containing a search indicator (list of integer)
         """
         return self.__searchIndicatorLines[:]
-    
+
     def updateMarkerMap(self):
         """
         Public method to initiate an update of the marker map.
         """
         self.__markerMap.update()
-    
+
     ###########################################################################
     ## Highlighting marker handling methods below
     ###########################################################################
-    
+
     def setHighlight(self, startLine, startIndex, endLine, endIndex):
         """
         Public method to set a text highlight.
-        
+
         @param startLine line of the highlight start
         @type int
         @param startIndex index of the highlight start
@@ -3876,19 +3875,20 @@
         @param endIndex index of the highlight end
         @type int
         """
-        self.setIndicator(self.highlightIndicator, startLine, startIndex,
-                          endLine, endIndex)
-    
+        self.setIndicator(
+            self.highlightIndicator, startLine, startIndex, endLine, endIndex
+        )
+
     def clearAllHighlights(self):
         """
         Public method to clear all highlights.
         """
         self.clearAllIndicators(self.highlightIndicator)
-    
+
     def clearHighlight(self, startLine, startIndex, endLine, endIndex):
         """
         Public method to clear a text highlight.
-        
+
         @param startLine line of the highlight start
         @type int
         @param startIndex index of the highlight start
@@ -3898,18 +3898,19 @@
         @param endIndex index of the highlight end
         @type int
         """
-        self.clearIndicator(self.highlightIndicator, startLine, startIndex,
-                            endLine, endIndex)
-    
+        self.clearIndicator(
+            self.highlightIndicator, startLine, startIndex, endLine, endIndex
+        )
+
     ###########################################################################
     ## Comment handling methods below
     ###########################################################################
-    
+
     def __isCommentedLine(self, line, commentStr):
         """
         Private method to check, if the given line is a comment line as
         produced by the configured comment rules.
-        
+
         @param line text of the line to check (string)
         @param commentStr comment string to check against (string)
         @return flag indicating a commented line (boolean)
@@ -3918,27 +3919,25 @@
             return line.startswith(commentStr)
         else:
             return line.strip().startswith(commentStr)
-    
+
     def toggleCommentBlock(self):
         """
         Public slot to toggle the comment of a block.
-        
+
         If the line of the cursor or the selection is not commented, it will
         be commented. If it is commented, the comment block will be removed.
         The later works independent of the current selection.
         """
         if self.lexer_ is None or not self.lexer_.canBlockComment():
             return
-        
+
         commentStr = self.lexer_.commentStr()
         line, index = self.getCursorPosition()
-        
+
         # check if line starts with our comment string (i.e. was commented
         # by our comment...() slots
-        if (
-            self.hasSelectedText() and
-            self.__isCommentedLine(self.text(self.getSelection()[0]),
-                                   commentStr)
+        if self.hasSelectedText() and self.__isCommentedLine(
+            self.text(self.getSelection()[0]), commentStr
         ):
             self.uncommentLineOrSelection()
         elif not self.__isCommentedLine(self.text(line), commentStr):
@@ -3947,33 +3946,31 @@
         else:
             # determine the start of the comment block
             begline = line
-            while (
-                begline > 0 and
-                self.__isCommentedLine(self.text(begline - 1), commentStr)
+            while begline > 0 and self.__isCommentedLine(
+                self.text(begline - 1), commentStr
             ):
                 begline -= 1
             # determine the end of the comment block
             endline = line
             lines = self.lines()
-            while (
-                endline < lines and
-                self.__isCommentedLine(self.text(endline + 1), commentStr)
+            while endline < lines and self.__isCommentedLine(
+                self.text(endline + 1), commentStr
             ):
                 endline += 1
-            
+
             self.setSelection(begline, 0, endline, self.lineLength(endline))
             self.uncommentLineOrSelection()
-            
+
             # reset the cursor
             self.setCursorPosition(line, index - len(commentStr))
-        
+
     def commentLine(self):
         """
         Public slot to comment the current line.
         """
         if self.lexer_ is None or not self.lexer_.canBlockComment():
             return
-        
+
         line, index = self.getCursorPosition()
         self.beginUndoAction()
         if Preferences.getEditor("CommentColumn0"):
@@ -3983,22 +3980,22 @@
             pos = len(lineText.replace(lineText.lstrip(" \t"), ""))
             self.insertAt(self.lexer_.commentStr(), line, pos)
         self.endUndoAction()
-        
+
     def uncommentLine(self):
         """
         Public slot to uncomment the current line.
         """
         if self.lexer_ is None or not self.lexer_.canBlockComment():
             return
-        
+
         commentStr = self.lexer_.commentStr()
         line, index = self.getCursorPosition()
-        
+
         # check if line starts with our comment string (i.e. was commented
         # by our comment...() slots
         if not self.__isCommentedLine(self.text(line), commentStr):
             return
-        
+
         # now remove the comment string
         self.beginUndoAction()
         if Preferences.getEditor("CommentColumn0"):
@@ -4009,23 +4006,23 @@
             self.setSelection(line, pos, line, pos + len(commentStr))
         self.removeSelectedText()
         self.endUndoAction()
-        
+
     def commentSelection(self):
         """
         Public slot to comment the current selection.
         """
         if self.lexer_ is None or not self.lexer_.canBlockComment():
             return
-        
+
         if not self.hasSelectedText():
             return
-        
+
         commentStr = self.lexer_.commentStr()
-        
+
         # get the selection boundaries
         lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
         endLine = lineTo if indexTo else lineTo - 1
-        
+
         self.beginUndoAction()
         # iterate over the lines
         for line in range(lineFrom, endLine + 1):
@@ -4035,27 +4032,27 @@
                 lineText = self.text(line)
                 pos = len(lineText.replace(lineText.lstrip(" \t"), ""))
                 self.insertAt(commentStr, line, pos)
-        
+
         # change the selection accordingly
         self.setSelection(lineFrom, 0, endLine + 1, 0)
         self.endUndoAction()
-        
+
     def uncommentSelection(self):
         """
         Public slot to uncomment the current selection.
         """
         if self.lexer_ is None or not self.lexer_.canBlockComment():
             return
-        
+
         if not self.hasSelectedText():
             return
-        
+
         commentStr = self.lexer_.commentStr()
-        
+
         # get the selection boundaries
         lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
         endLine = lineTo if indexTo else lineTo - 1
-        
+
         self.beginUndoAction()
         # iterate over the lines
         for line in range(lineFrom, endLine + 1):
@@ -4063,7 +4060,7 @@
             # by our comment...() slots
             if not self.__isCommentedLine(self.text(line), commentStr):
                 continue
-            
+
             if Preferences.getEditor("CommentColumn0"):
                 self.setSelection(line, 0, line, len(commentStr))
             else:
@@ -4071,23 +4068,23 @@
                 pos = len(lineText.replace(lineText.lstrip(" \t"), ""))
                 self.setSelection(line, pos, line, pos + len(commentStr))
             self.removeSelectedText()
-            
+
             # adjust selection start
             if line == lineFrom:
                 indexFrom -= len(commentStr)
                 if indexFrom < 0:
                     indexFrom = 0
-            
+
             # adjust selection end
             if line == lineTo:
                 indexTo -= len(commentStr)
                 if indexTo < 0:
                     indexTo = 0
-            
+
         # change the selection accordingly
         self.setSelection(lineFrom, indexFrom, lineTo, indexTo)
         self.endUndoAction()
-        
+
     def commentLineOrSelection(self):
         """
         Public slot to comment the current line or current selection.
@@ -4112,27 +4109,27 @@
         """
         if self.lexer_ is None or not self.lexer_.canStreamComment():
             return
-        
+
         commentStr = self.lexer_.streamCommentStr()
         line, index = self.getCursorPosition()
-        
+
         self.beginUndoAction()
-        self.insertAt(commentStr['end'], line, self.lineLength(line))
-        self.insertAt(commentStr['start'], line, 0)
+        self.insertAt(commentStr["end"], line, self.lineLength(line))
+        self.insertAt(commentStr["start"], line, 0)
         self.endUndoAction()
-        
+
     def streamCommentSelection(self):
         """
         Public slot to comment the current selection.
         """
         if self.lexer_ is None or not self.lexer_.canStreamComment():
             return
-        
+
         if not self.hasSelectedText():
             return
-        
+
         commentStr = self.lexer_.streamCommentStr()
-        
+
         # get the selection boundaries
         lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
         if indexTo == 0:
@@ -4141,19 +4138,19 @@
         else:
             endLine = lineTo
             endIndex = indexTo
-        
+
         self.beginUndoAction()
-        self.insertAt(commentStr['end'], endLine, endIndex)
-        self.insertAt(commentStr['start'], lineFrom, indexFrom)
-        
+        self.insertAt(commentStr["end"], endLine, endIndex)
+        self.insertAt(commentStr["start"], lineFrom, indexFrom)
+
         # change the selection accordingly
         if indexTo > 0:
-            indexTo += len(commentStr['end'])
+            indexTo += len(commentStr["end"])
             if lineFrom == endLine:
-                indexTo += len(commentStr['start'])
+                indexTo += len(commentStr["start"])
         self.setSelection(lineFrom, indexFrom, lineTo, indexTo)
         self.endUndoAction()
-        
+
     def streamCommentLineOrSelection(self):
         """
         Public slot to stream comment the current line or current selection.
@@ -4162,58 +4159,58 @@
             self.streamCommentSelection()
         else:
             self.streamCommentLine()
-        
+
     def boxCommentLine(self):
         """
         Public slot to box comment the current line.
         """
         if self.lexer_ is None or not self.lexer_.canBoxComment():
             return
-        
+
         commentStr = self.lexer_.boxCommentStr()
         line, index = self.getCursorPosition()
-        
+
         eol = self.getLineSeparator()
         self.beginUndoAction()
         self.insertAt(eol, line, self.lineLength(line))
-        self.insertAt(commentStr['end'], line + 1, 0)
-        self.insertAt(commentStr['middle'], line, 0)
+        self.insertAt(commentStr["end"], line + 1, 0)
+        self.insertAt(commentStr["middle"], line, 0)
         self.insertAt(eol, line, 0)
-        self.insertAt(commentStr['start'], line, 0)
+        self.insertAt(commentStr["start"], line, 0)
         self.endUndoAction()
-        
+
     def boxCommentSelection(self):
         """
         Public slot to box comment the current selection.
         """
         if self.lexer_ is None or not self.lexer_.canBoxComment():
             return
-        
+
         if not self.hasSelectedText():
             return
-            
+
         commentStr = self.lexer_.boxCommentStr()
-        
+
         # get the selection boundaries
         lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
         endLine = lineTo if indexTo else lineTo - 1
-        
+
         self.beginUndoAction()
         # iterate over the lines
         for line in range(lineFrom, endLine + 1):
-            self.insertAt(commentStr['middle'], line, 0)
-        
+            self.insertAt(commentStr["middle"], line, 0)
+
         # now do the comments before and after the selection
         eol = self.getLineSeparator()
         self.insertAt(eol, endLine, self.lineLength(endLine))
-        self.insertAt(commentStr['end'], endLine + 1, 0)
+        self.insertAt(commentStr["end"], endLine + 1, 0)
         self.insertAt(eol, lineFrom, 0)
-        self.insertAt(commentStr['start'], lineFrom, 0)
-        
+        self.insertAt(commentStr["start"], lineFrom, 0)
+
         # change the selection accordingly
         self.setSelection(lineFrom, 0, endLine + 3, 0)
         self.endUndoAction()
-        
+
     def boxCommentLineOrSelection(self):
         """
         Public slot to box comment the current line or current selection.
@@ -4222,7 +4219,7 @@
             self.boxCommentSelection()
         else:
             self.boxCommentLine()
-    
+
     ###########################################################################
     ## Indentation handling methods below
     ###########################################################################
@@ -4230,7 +4227,7 @@
     def __indentLine(self, indent=True):
         """
         Private method to indent or unindent the current line.
-        
+
         @param indent flag indicating an indent operation (boolean)
                 <br />If the flag is true, an indent operation is performed.
                 Otherwise the current line is unindented.
@@ -4246,22 +4243,22 @@
             self.setCursorPosition(line, index + self.indentationWidth())
         else:
             self.setCursorPosition(line, index - self.indentationWidth())
-        
+
     def __indentSelection(self, indent=True):
         """
         Private method to indent or unindent the current selection.
-        
+
         @param indent flag indicating an indent operation (boolean)
                 <br />If the flag is true, an indent operation is performed.
                 Otherwise the current line is unindented.
         """
         if not self.hasSelectedText():
             return
-        
+
         # get the selection
         lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
         endLine = lineTo if indexTo else lineTo - 1
-        
+
         self.beginUndoAction()
         # iterate over the lines
         for line in range(lineFrom, endLine + 1):
@@ -4273,12 +4270,15 @@
         if indent:
             if indexTo == 0:
                 self.setSelection(
-                    lineFrom, indexFrom + self.indentationWidth(),
-                    lineTo, 0)
+                    lineFrom, indexFrom + self.indentationWidth(), lineTo, 0
+                )
             else:
                 self.setSelection(
-                    lineFrom, indexFrom + self.indentationWidth(),
-                    lineTo, indexTo + self.indentationWidth())
+                    lineFrom,
+                    indexFrom + self.indentationWidth(),
+                    lineTo,
+                    indexTo + self.indentationWidth(),
+                )
         else:
             indexStart = indexFrom - self.indentationWidth()
             if indexStart < 0:
@@ -4287,7 +4287,7 @@
             if indexEnd < 0:
                 indexEnd = 0
             self.setSelection(lineFrom, indexStart, lineTo, indexEnd)
-        
+
     def indentLineOrSelection(self):
         """
         Public slot to indent the current line or current selection.
@@ -4296,7 +4296,7 @@
             self.__indentSelection(True)
         else:
             self.__indentLine(True)
-        
+
     def unindentLineOrSelection(self):
         """
         Public slot to unindent the current line or current selection.
@@ -4305,7 +4305,7 @@
             self.__indentSelection(False)
         else:
             self.__indentLine(False)
-        
+
     def smartIndentLineOrSelection(self):
         """
         Public slot to indent current line smartly.
@@ -4320,11 +4320,11 @@
                 self.lexer_.smartIndentLine(self)
             else:
                 self.__indentLine(True)
-        
+
     def gotoLine(self, line, pos=1, firstVisible=False, expand=False):
         """
         Public slot to jump to the beginning of a line.
-        
+
         @param line line number to go to
         @type int
         @param pos position in line to go to
@@ -4340,43 +4340,43 @@
             self.ensureVisibleTop(line, expand)
         else:
             self.ensureVisible(line, expand)
-    
+
     def __textChanged(self):
         """
         Private slot to handle a change of the editor text.
-        
+
         This slot defers the handling to the next time the event loop
         is run in order to ensure, that cursor position has been updated
         by the underlying Scintilla editor.
         """
         QTimer.singleShot(0, self.__saveLastEditPosition)
-    
+
     def __saveLastEditPosition(self):
         """
         Private slot to record the last edit position.
         """
         self.__lastEditPosition = self.getCursorPosition()
         self.lastEditPositionAvailable.emit()
-    
+
     def isLastEditPositionAvailable(self):
         """
         Public method to check, if a last edit position is available.
-        
+
         @return flag indicating availability (boolean)
         """
         return self.__lastEditPosition is not None
-    
+
     def gotoLastEditPosition(self):
         """
         Public method to move the cursor to the last edit position.
         """
         self.setCursorPosition(*self.__lastEditPosition)
         self.ensureVisible(self.__lastEditPosition[0])
-    
+
     def gotoMethodClass(self, goUp=False):
         """
         Public method to go to the next Python method or class definition.
-        
+
         @param goUp flag indicating the move direction (boolean)
         """
         if self.isPyFile() or self.isRubyFile():
@@ -4397,7 +4397,7 @@
                     self.setCursorPosition(lineNo, self.lineLength(lineNo))
                     self.ensureVisible(lineNo)
                     return
-                
+
                 line = self.text(lineNo)
                 if line.strip().startswith(("class ", "def ", "module ")):
                     # try 'def ' first because it occurs more often
@@ -4418,12 +4418,12 @@
                     self.setSelection(lineNo, first, lineNo, end)
                     self.ensureVisible(lineNo)
                     return
-                
+
                 if goUp:
                     lineNo -= 1
                 else:
                     lineNo += 1
-    
+
     ###########################################################################
     ## Setup methods below
     ###########################################################################
@@ -4438,174 +4438,180 @@
             if self.lexer_.hasSubstyles():
                 self.lexer_.readSubstyles(self)
             self.lexer_.initProperties()
-            
+
             self.lexer_.setDefaultColor(self.lexer_.color(0))
             self.lexer_.setDefaultPaper(self.lexer_.paper(0))
-        
+
         self.__bindLexer(self.fileName)
         self.recolor()
-        
+
         # read the typing completer settings
         if self.completer is not None:
             self.completer.readSettings()
-        
+
         # set the line marker colours or pixmap
         if Preferences.getEditor("LineMarkersBackground"):
-            self.markerDefine(QsciScintilla.MarkerSymbol.Background,
-                              self.currentline)
-            self.markerDefine(QsciScintilla.MarkerSymbol.Background,
-                              self.errorline)
+            self.markerDefine(QsciScintilla.MarkerSymbol.Background, self.currentline)
+            self.markerDefine(QsciScintilla.MarkerSymbol.Background, self.errorline)
             self.__setLineMarkerColours()
         else:
             self.markerDefine(
-                UI.PixmapCache.getPixmap("currentLineMarker"),
-                self.currentline)
+                UI.PixmapCache.getPixmap("currentLineMarker"), self.currentline
+            )
             self.markerDefine(
-                UI.PixmapCache.getPixmap("errorLineMarker"),
-                self.errorline)
-        
+                UI.PixmapCache.getPixmap("errorLineMarker"), self.errorline
+            )
+
         # set the text display
         self.__setTextDisplay()
-        
+
         # set margin 0 and 2 configuration
         self.__setMarginsDisplay()
-        
+
         # set the auto-completion function
-        self.__acCache.setSize(
-            Preferences.getEditor("AutoCompletionCacheSize"))
+        self.__acCache.setSize(Preferences.getEditor("AutoCompletionCacheSize"))
         self.__acCache.setMaximumCacheTime(
-            Preferences.getEditor("AutoCompletionCacheTime"))
-        self.__acCacheEnabled = Preferences.getEditor(
-            "AutoCompletionCacheEnabled")
+            Preferences.getEditor("AutoCompletionCacheTime")
+        )
+        self.__acCacheEnabled = Preferences.getEditor("AutoCompletionCacheEnabled")
         acTimeout = Preferences.getEditor("AutoCompletionTimeout")
         if acTimeout != self.__acTimer.interval:
             self.__acTimer.setInterval(acTimeout)
         self.__setAutoCompletion()
-        
+
         # set the calltips function
         self.__setCallTips()
-        
+
         # set the autosave flags
         self.autosaveEnabled = Preferences.getEditor("AutosaveInterval") > 0
-        
+
         if Preferences.getEditor("MiniContextMenu") != self.miniMenu:
             # regenerate context menu
             self.__initContextMenu()
         else:
             # set checked context menu items
             self.menuActs["AutoCompletionEnable"].setChecked(
-                self.autoCompletionThreshold() != -1)
-            self.menuActs["MonospacedFont"].setChecked(
-                self.useMonospaced)
+                self.autoCompletionThreshold() != -1
+            )
+            self.menuActs["MonospacedFont"].setChecked(self.useMonospaced)
             self.menuActs["AutosaveEnable"].setChecked(
-                self.autosaveEnabled and not self.autosaveManuallyDisabled)
-        
+                self.autosaveEnabled and not self.autosaveManuallyDisabled
+            )
+
         # regenerate the margins context menu(s)
         self.__initContextMenuMargins()
-        
+
         if Preferences.getEditor("MarkOccurrencesEnabled"):
             self.__markOccurrencesTimer.setInterval(
-                Preferences.getEditor("MarkOccurrencesTimeout"))
+                Preferences.getEditor("MarkOccurrencesTimeout")
+            )
         else:
             self.__markOccurrencesTimer.stop()
             self.clearSearchIndicators()
-        
+
         if Preferences.getEditor("OnlineSyntaxCheck"):
             self.__onlineSyntaxCheckTimer.setInterval(
-                Preferences.getEditor("OnlineSyntaxCheckInterval") * 1000)
+                Preferences.getEditor("OnlineSyntaxCheckInterval") * 1000
+            )
         else:
             self.__onlineSyntaxCheckTimer.stop()
-        
+
         if Preferences.getEditor("OnlineChangeTrace"):
             self.__onlineChangeTraceTimer.setInterval(
-                Preferences.getEditor("OnlineChangeTraceInterval"))
+                Preferences.getEditor("OnlineChangeTraceInterval")
+            )
         else:
             self.__onlineChangeTraceTimer.stop()
             self.__deleteAllChangeMarkers()
-        self.markerDefine(self.__createChangeMarkerPixmap(
-            "OnlineChangeTraceMarkerUnsaved"), self.__changeMarkerUnsaved)
-        self.markerDefine(self.__createChangeMarkerPixmap(
-            "OnlineChangeTraceMarkerSaved"), self.__changeMarkerSaved)
-        
+        self.markerDefine(
+            self.__createChangeMarkerPixmap("OnlineChangeTraceMarkerUnsaved"),
+            self.__changeMarkerUnsaved,
+        )
+        self.markerDefine(
+            self.__createChangeMarkerPixmap("OnlineChangeTraceMarkerSaved"),
+            self.__changeMarkerSaved,
+        )
+
         # refresh the annotations display
         self.__refreshAnnotations()
-        
-        self.__markerMap.setMapPosition(
-            Preferences.getEditor("ShowMarkerMapOnRight"))
+
+        self.__markerMap.setMapPosition(Preferences.getEditor("ShowMarkerMapOnRight"))
         self.__markerMap.initColors()
-        
+
         self.setLanguage(self.fileName, propagate=False)
-        
+
         self.settingsRead.emit()
-    
+
     def __setLineMarkerColours(self):
         """
         Private method to set the line marker colours.
         """
         self.setMarkerForegroundColor(
-            Preferences.getEditorColour("CurrentMarker"), self.currentline)
+            Preferences.getEditorColour("CurrentMarker"), self.currentline
+        )
         self.setMarkerBackgroundColor(
-            Preferences.getEditorColour("CurrentMarker"), self.currentline)
+            Preferences.getEditorColour("CurrentMarker"), self.currentline
+        )
         self.setMarkerForegroundColor(
-            Preferences.getEditorColour("ErrorMarker"), self.errorline)
+            Preferences.getEditorColour("ErrorMarker"), self.errorline
+        )
         self.setMarkerBackgroundColor(
-            Preferences.getEditorColour("ErrorMarker"), self.errorline)
-        
+            Preferences.getEditorColour("ErrorMarker"), self.errorline
+        )
+
     def __setMarginsDisplay(self):
         """
         Private method to configure margins 0 and 2.
         """
         # set the settings for all margins
         self.setMarginsFont(Preferences.getEditorOtherFonts("MarginsFont"))
-        self.setMarginsForegroundColor(
-            Preferences.getEditorColour("MarginsForeground"))
-        self.setMarginsBackgroundColor(
-            Preferences.getEditorColour("MarginsBackground"))
-        
+        self.setMarginsForegroundColor(Preferences.getEditorColour("MarginsForeground"))
+        self.setMarginsBackgroundColor(Preferences.getEditorColour("MarginsBackground"))
+
         # reset standard margins settings
         for margin in range(5):
             self.setMarginLineNumbers(margin, False)
             self.setMarginMarkerMask(margin, 0)
             self.setMarginWidth(margin, 0)
             self.setMarginSensitivity(margin, False)
-        
+
         # set marker margin(s) settings
         self.__bmMargin = 0
         self.__linenoMargin = 1
         self.__bpMargin = 2
         self.__foldMargin = 3
         self.__indicMargin = 4
-        
-        marginBmMask = (1 << self.bookmark)
+
+        marginBmMask = 1 << self.bookmark
         self.setMarginWidth(self.__bmMargin, 16)
         self.setMarginSensitivity(self.__bmMargin, True)
         self.setMarginMarkerMask(self.__bmMargin, marginBmMask)
-        
+
         marginBpMask = (
-            (1 << self.breakpoint) |
-            (1 << self.cbreakpoint) |
-            (1 << self.tbreakpoint) |
-            (1 << self.tcbreakpoint) |
-            (1 << self.dbreakpoint)
+            (1 << self.breakpoint)
+            | (1 << self.cbreakpoint)
+            | (1 << self.tbreakpoint)
+            | (1 << self.tcbreakpoint)
+            | (1 << self.dbreakpoint)
         )
         self.setMarginWidth(self.__bpMargin, 16)
         self.setMarginSensitivity(self.__bpMargin, True)
         self.setMarginMarkerMask(self.__bpMargin, marginBpMask)
-        
+
         marginIndicMask = (
-            (1 << self.syntaxerror) |
-            (1 << self.notcovered) |
-            (1 << self.taskmarker) |
-            (1 << self.warning) |
-            (1 << self.__changeMarkerUnsaved) |
-            (1 << self.__changeMarkerSaved) |
-            (1 << self.currentline) |
-            (1 << self.errorline)
+            (1 << self.syntaxerror)
+            | (1 << self.notcovered)
+            | (1 << self.taskmarker)
+            | (1 << self.warning)
+            | (1 << self.__changeMarkerUnsaved)
+            | (1 << self.__changeMarkerSaved)
+            | (1 << self.currentline)
+            | (1 << self.errorline)
         )
         self.setMarginWidth(self.__indicMargin, 16)
         self.setMarginSensitivity(self.__indicMargin, True)
         self.setMarginMarkerMask(self.__indicMargin, marginIndicMask)
-        
+
         # set linenumber margin settings
         linenoMargin = Preferences.getEditor("LinenoMargin")
         self.setMarginLineNumbers(self.__linenoMargin, linenoMargin)
@@ -4613,7 +4619,7 @@
             self.__resizeLinenoMargin()
         else:
             self.setMarginWidth(self.__linenoMargin, 0)
-        
+
         # set folding margin settings
         if Preferences.getEditor("FoldingMargin"):
             self.setMarginWidth(self.__foldMargin, 16)
@@ -4621,24 +4627,26 @@
             self.setFolding(folding, self.__foldMargin)
             self.setFoldMarginColors(
                 Preferences.getEditorColour("FoldmarginBackground"),
-                Preferences.getEditorColour("FoldmarginBackground"))
+                Preferences.getEditorColour("FoldmarginBackground"),
+            )
             self.setFoldMarkersColors(
                 Preferences.getEditorColour("FoldMarkersForeground"),
-                Preferences.getEditorColour("FoldMarkersBackground"))
+                Preferences.getEditorColour("FoldMarkersBackground"),
+            )
         else:
             self.setMarginWidth(self.__foldMargin, 0)
-            self.setFolding(QsciScintilla.FoldStyle.NoFoldStyle.value,
-                            self.__foldMargin)
-    
+            self.setFolding(
+                QsciScintilla.FoldStyle.NoFoldStyle.value, self.__foldMargin
+            )
+
     def __resizeLinenoMargin(self):
         """
         Private slot to resize the line numbers margin.
         """
         linenoMargin = Preferences.getEditor("LinenoMargin")
         if linenoMargin:
-            self.setMarginWidth(
-                self.__linenoMargin, '8' * (len(str(self.lines())) + 1))
-    
+            self.setMarginWidth(self.__linenoMargin, "8" * (len(str(self.lines())) + 1))
+
     def __setTabAndIndent(self):
         """
         Private method to set indentation size and style and tab width.
@@ -4648,35 +4656,35 @@
         if self.lexer_ and self.lexer_.alwaysKeepTabs():
             self.setIndentationsUseTabs(True)
         else:
-            self.setIndentationsUseTabs(
-                self.__getEditorConfig("TabForIndentation"))
-    
+            self.setIndentationsUseTabs(self.__getEditorConfig("TabForIndentation"))
+
     def __setTextDisplay(self):
         """
         Private method to configure the text display.
         """
         self.__setTabAndIndent()
-        
+
         self.setTabIndents(Preferences.getEditor("TabIndents"))
         self.setBackspaceUnindents(Preferences.getEditor("TabIndents"))
         self.setIndentationGuides(Preferences.getEditor("IndentationGuides"))
         self.setIndentationGuidesBackgroundColor(
-            Preferences.getEditorColour("IndentationGuidesBackground"))
+            Preferences.getEditorColour("IndentationGuidesBackground")
+        )
         self.setIndentationGuidesForegroundColor(
-            Preferences.getEditorColour("IndentationGuidesForeground"))
+            Preferences.getEditorColour("IndentationGuidesForeground")
+        )
         if Preferences.getEditor("ShowWhitespace"):
-            self.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsVisible)
+            self.setWhitespaceVisibility(QsciScintilla.WhitespaceVisibility.WsVisible)
             with contextlib.suppress(AttributeError):
                 self.setWhitespaceForegroundColor(
-                    Preferences.getEditorColour("WhitespaceForeground"))
+                    Preferences.getEditorColour("WhitespaceForeground")
+                )
                 self.setWhitespaceBackgroundColor(
-                    Preferences.getEditorColour("WhitespaceBackground"))
-                self.setWhitespaceSize(
-                    Preferences.getEditor("WhitespaceSize"))
-        else:
-            self.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsInvisible)
+                    Preferences.getEditorColour("WhitespaceBackground")
+                )
+                self.setWhitespaceSize(Preferences.getEditor("WhitespaceSize"))
+        else:
+            self.setWhitespaceVisibility(QsciScintilla.WhitespaceVisibility.WsInvisible)
         self.setEolVisibility(Preferences.getEditor("ShowEOL"))
         self.setAutoIndent(Preferences.getEditor("AutoIndentation"))
         if Preferences.getEditor("BraceHighlighting"):
@@ -4684,36 +4692,42 @@
         else:
             self.setBraceMatching(QsciScintilla.BraceMatch.NoBraceMatch)
         self.setMatchedBraceForegroundColor(
-            Preferences.getEditorColour("MatchingBrace"))
+            Preferences.getEditorColour("MatchingBrace")
+        )
         self.setMatchedBraceBackgroundColor(
-            Preferences.getEditorColour("MatchingBraceBack"))
+            Preferences.getEditorColour("MatchingBraceBack")
+        )
         self.setUnmatchedBraceForegroundColor(
-            Preferences.getEditorColour("NonmatchingBrace"))
+            Preferences.getEditorColour("NonmatchingBrace")
+        )
         self.setUnmatchedBraceBackgroundColor(
-            Preferences.getEditorColour("NonmatchingBraceBack"))
+            Preferences.getEditorColour("NonmatchingBraceBack")
+        )
         if Preferences.getEditor("CustomSelectionColours"):
             self.setSelectionBackgroundColor(
-                Preferences.getEditorColour("SelectionBackground"))
+                Preferences.getEditorColour("SelectionBackground")
+            )
         else:
             self.setSelectionBackgroundColor(
-                QApplication.palette().color(QPalette.ColorRole.Highlight))
+                QApplication.palette().color(QPalette.ColorRole.Highlight)
+            )
         if Preferences.getEditor("ColourizeSelText"):
             self.resetSelectionForegroundColor()
         elif Preferences.getEditor("CustomSelectionColours"):
             self.setSelectionForegroundColor(
-                Preferences.getEditorColour("SelectionForeground"))
+                Preferences.getEditorColour("SelectionForeground")
+            )
         else:
             self.setSelectionForegroundColor(
-                QApplication.palette().color(
-                    QPalette.ColorRole.HighlightedText))
+                QApplication.palette().color(QPalette.ColorRole.HighlightedText)
+            )
         self.setSelectionToEol(Preferences.getEditor("ExtendSelectionToEol"))
-        self.setCaretForegroundColor(
-            Preferences.getEditorColour("CaretForeground"))
+        self.setCaretForegroundColor(Preferences.getEditorColour("CaretForeground"))
         self.setCaretLineBackgroundColor(
-            Preferences.getEditorColour("CaretLineBackground"))
+            Preferences.getEditorColour("CaretLineBackground")
+        )
         self.setCaretLineVisible(Preferences.getEditor("CaretLineVisible"))
-        self.setCaretLineAlwaysVisible(
-            Preferences.getEditor("CaretLineAlwaysVisible"))
+        self.setCaretLineAlwaysVisible(Preferences.getEditor("CaretLineAlwaysVisible"))
         self.caretWidth = Preferences.getEditor("CaretWidth")
         self.setCaretWidth(self.caretWidth)
         self.caretLineFrameWidth = Preferences.getEditor("CaretLineFrameWidth")
@@ -4726,75 +4740,85 @@
         if edgeMode:
             self.setEdgeColumn(Preferences.getEditor("EdgeColumn"))
             self.setEdgeColor(Preferences.getEditorColour("Edge"))
-        
+
         wrapVisualFlag = Preferences.getEditor("WrapVisualFlag")
         self.setWrapMode(Preferences.getEditor("WrapLongLinesMode"))
         self.setWrapVisualFlags(wrapVisualFlag, wrapVisualFlag)
         self.setWrapIndentMode(Preferences.getEditor("WrapIndentMode"))
         self.setWrapStartIndent(Preferences.getEditor("WrapStartIndent"))
-        
+
         self.zoomTo(Preferences.getEditor("ZoomFactor"))
-        
+
         self.searchIndicator = QsciScintilla.INDIC_CONTAINER
         self.indicatorDefine(
-            self.searchIndicator, QsciScintilla.INDIC_BOX,
-            Preferences.getEditorColour("SearchMarkers"))
+            self.searchIndicator,
+            QsciScintilla.INDIC_BOX,
+            Preferences.getEditorColour("SearchMarkers"),
+        )
         if (
-            not Preferences.getEditor("SearchMarkersEnabled") and
-            not Preferences.getEditor("QuickSearchMarkersEnabled") and
-            not Preferences.getEditor("MarkOccurrencesEnabled")
+            not Preferences.getEditor("SearchMarkersEnabled")
+            and not Preferences.getEditor("QuickSearchMarkersEnabled")
+            and not Preferences.getEditor("MarkOccurrencesEnabled")
         ):
             self.clearAllIndicators(self.searchIndicator)
-        
+
         self.spellingIndicator = QsciScintilla.INDIC_CONTAINER + 1
         self.indicatorDefine(
-            self.spellingIndicator, QsciScintilla.INDIC_SQUIGGLE,
-            Preferences.getEditorColour("SpellingMarkers"))
+            self.spellingIndicator,
+            QsciScintilla.INDIC_SQUIGGLE,
+            Preferences.getEditorColour("SpellingMarkers"),
+        )
         self.__setSpelling()
-        
+
         self.highlightIndicator = QsciScintilla.INDIC_CONTAINER + 2
         self.indicatorDefine(
-            self.highlightIndicator, QsciScintilla.INDIC_FULLBOX,
-            Preferences.getEditorColour("HighlightMarker"))
-        
+            self.highlightIndicator,
+            QsciScintilla.INDIC_FULLBOX,
+            Preferences.getEditorColour("HighlightMarker"),
+        )
+
         self.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         with contextlib.suppress(AttributeError):
             if Preferences.getEditor("AnnotationsEnabled"):
                 self.setAnnotationDisplay(
-                    QsciScintilla.AnnotationDisplay.AnnotationBoxed)
+                    QsciScintilla.AnnotationDisplay.AnnotationBoxed
+                )
             else:
                 self.setAnnotationDisplay(
-                    QsciScintilla.AnnotationDisplay.AnnotationHidden)
+                    QsciScintilla.AnnotationDisplay.AnnotationHidden
+                )
         self.__setAnnotationStyles()
-        
+
         if Preferences.getEditor("OverrideEditAreaColours"):
             self.setColor(Preferences.getEditorColour("EditAreaForeground"))
             self.setPaper(Preferences.getEditorColour("EditAreaBackground"))
-        
-        self.setVirtualSpaceOptions(
-            Preferences.getEditor("VirtualSpaceOptions"))
-        
+
+        self.setVirtualSpaceOptions(Preferences.getEditor("VirtualSpaceOptions"))
+
         if Preferences.getEditor("MouseHoverHelp"):
-            self.SendScintilla(QsciScintilla.SCI_SETMOUSEDWELLTIME,
-                               Preferences.getEditor("MouseHoverTimeout"))
-        else:
-            self.SendScintilla(QsciScintilla.SCI_SETMOUSEDWELLTIME,
-                               QsciScintilla.SC_TIME_FOREVER)
-        
+            self.SendScintilla(
+                QsciScintilla.SCI_SETMOUSEDWELLTIME,
+                Preferences.getEditor("MouseHoverTimeout"),
+            )
+        else:
+            self.SendScintilla(
+                QsciScintilla.SCI_SETMOUSEDWELLTIME, QsciScintilla.SC_TIME_FOREVER
+            )
+
         # to avoid errors due to line endings by pasting
         self.SendScintilla(QsciScintilla.SCI_SETPASTECONVERTENDINGS, True)
-        
+
         self.__markerMap.setEnabled(True)
-    
+
     def __setEolMode(self):
         """
         Private method to configure the eol mode of the editor.
         """
         if (
-            self.fileName and
-            self.project.isOpen() and
-            self.project.isProjectFile(self.fileName)
+            self.fileName
+            and self.project.isOpen()
+            and self.project.isProjectFile(self.fileName)
         ):
             eolMode = self.__getEditorConfig("EOLMode", nodefault=True)
             if eolMode is None:
@@ -4806,76 +4830,71 @@
             eolMode = self.__getEditorConfig("EOLMode")
             self.setEolMode(eolMode)
         self.__eolChanged()
-        
+
     def __setAutoCompletion(self):
         """
         Private method to configure the autocompletion function.
         """
         if self.lexer_:
             self.setAutoCompletionFillupsEnabled(
-                Preferences.getEditor("AutoCompletionFillups"))
+                Preferences.getEditor("AutoCompletionFillups")
+            )
         self.setAutoCompletionCaseSensitivity(
-            Preferences.getEditor("AutoCompletionCaseSensitivity"))
+            Preferences.getEditor("AutoCompletionCaseSensitivity")
+        )
         self.setAutoCompletionReplaceWord(
-            Preferences.getEditor("AutoCompletionReplaceWord"))
+            Preferences.getEditor("AutoCompletionReplaceWord")
+        )
         self.setAutoCompletionThreshold(0)
         if Preferences.getEditor("AutoCompletionShowSingle"):
             self.setAutoCompletionUseSingle(
-                QsciScintilla.AutoCompletionUseSingle.AcusAlways)
+                QsciScintilla.AutoCompletionUseSingle.AcusAlways
+            )
         else:
             self.setAutoCompletionUseSingle(
-                QsciScintilla.AutoCompletionUseSingle.AcusNever)
+                QsciScintilla.AutoCompletionUseSingle.AcusNever
+            )
         autoCompletionSource = Preferences.getEditor("AutoCompletionSource")
-        if (
-            autoCompletionSource ==
-            QsciScintilla.AutoCompletionSource.AcsDocument
-        ):
-            self.setAutoCompletionSource(
-                QsciScintilla.AutoCompletionSource.AcsDocument)
-        elif (
-            autoCompletionSource == QsciScintilla.AutoCompletionSource.AcsAPIs
-        ):
-            self.setAutoCompletionSource(
-                QsciScintilla.AutoCompletionSource.AcsAPIs)
-        else:
-            self.setAutoCompletionSource(
-                QsciScintilla.AutoCompletionSource.AcsAll)
-        
+        if autoCompletionSource == QsciScintilla.AutoCompletionSource.AcsDocument:
+            self.setAutoCompletionSource(QsciScintilla.AutoCompletionSource.AcsDocument)
+        elif autoCompletionSource == QsciScintilla.AutoCompletionSource.AcsAPIs:
+            self.setAutoCompletionSource(QsciScintilla.AutoCompletionSource.AcsAPIs)
+        else:
+            self.setAutoCompletionSource(QsciScintilla.AutoCompletionSource.AcsAll)
+
         self.setAutoCompletionWidgetSize(
             Preferences.getEditor("AutoCompletionMaxChars"),
-            Preferences.getEditor("AutoCompletionMaxLines")
-        )
-        
+            Preferences.getEditor("AutoCompletionMaxLines"),
+        )
+
     def __setCallTips(self):
         """
         Private method to configure the calltips function.
         """
         self.setCallTipsBackgroundColor(
-            Preferences.getEditorColour("CallTipsBackground"))
+            Preferences.getEditorColour("CallTipsBackground")
+        )
         self.setCallTipsForegroundColor(
-            Preferences.getEditorColour("CallTipsForeground"))
-        self.setCallTipsHighlightColor(
-            Preferences.getEditorColour("CallTipsHighlight"))
+            Preferences.getEditorColour("CallTipsForeground")
+        )
+        self.setCallTipsHighlightColor(Preferences.getEditorColour("CallTipsHighlight"))
         self.setCallTipsVisible(Preferences.getEditor("CallTipsVisible"))
         calltipsStyle = Preferences.getEditor("CallTipsStyle")
         with contextlib.suppress(AttributeError):
-            self.setCallTipsPosition(
-                Preferences.getEditor("CallTipsPosition"))
-        
+            self.setCallTipsPosition(Preferences.getEditor("CallTipsPosition"))
+
         if Preferences.getEditor("CallTipsEnabled"):
             if calltipsStyle == QsciScintilla.CallTipsStyle.CallTipsNoContext:
-                self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle.CallTipsNoContext)
+                self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsNoContext)
             elif (
-                calltipsStyle ==
-                QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
+                calltipsStyle
+                == QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
             ):
                 self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle
-                    .CallTipsNoAutoCompletionContext)
+                    QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
+                )
             else:
-                self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle.CallTipsContext)
+                self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsContext)
         else:
             self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsNone)
 
@@ -4886,20 +4905,20 @@
     def canAutoCompleteFromAPIs(self):
         """
         Public method to check for API availablity.
-        
+
         @return flag indicating autocompletion from APIs is available (boolean)
         """
         return self.acAPI
-        
+
     def autoCompleteQScintilla(self):
         """
         Public method to perform an autocompletion using QScintilla methods.
         """
-        self.__acText = ' '  # Prevent long running ACs to add results
+        self.__acText = " "  # Prevent long running ACs to add results
         self.__acWatchdog.stop()
         if self.__acCompletions:
             return
-        
+
         acs = Preferences.getEditor("AutoCompletionSource")
         if acs == QsciScintilla.AutoCompletionSource.AcsDocument:
             self.autoCompleteFromDocument()
@@ -4913,34 +4932,28 @@
                 self.tr("Autocompletion"),
                 self.tr(
                     """Autocompletion is not available because"""
-                    """ there is no autocompletion source set."""))
-        
+                    """ there is no autocompletion source set."""
+                ),
+            )
+
     def setAutoCompletionEnabled(self, enable):
         """
         Public method to enable/disable autocompletion.
-        
+
         @param enable flag indicating the desired autocompletion status
             (boolean)
         """
         if enable:
-            autoCompletionSource = Preferences.getEditor(
-                "AutoCompletionSource")
-            if (
-                autoCompletionSource ==
-                QsciScintilla.AutoCompletionSource.AcsDocument
-            ):
+            autoCompletionSource = Preferences.getEditor("AutoCompletionSource")
+            if autoCompletionSource == QsciScintilla.AutoCompletionSource.AcsDocument:
                 self.setAutoCompletionSource(
-                    QsciScintilla.AutoCompletionSource.AcsDocument)
-            elif (
-                autoCompletionSource ==
-                QsciScintilla.AutoCompletionSource.AcsAPIs
-            ):
-                self.setAutoCompletionSource(
-                    QsciScintilla.AutoCompletionSource.AcsAPIs)
+                    QsciScintilla.AutoCompletionSource.AcsDocument
+                )
+            elif autoCompletionSource == QsciScintilla.AutoCompletionSource.AcsAPIs:
+                self.setAutoCompletionSource(QsciScintilla.AutoCompletionSource.AcsAPIs)
             else:
-                self.setAutoCompletionSource(
-                    QsciScintilla.AutoCompletionSource.AcsAll)
-    
+                self.setAutoCompletionSource(QsciScintilla.AutoCompletionSource.AcsAll)
+
     def __toggleAutoCompletionEnable(self):
         """
         Private slot to handle the Enable Autocompletion context menu entry.
@@ -4949,86 +4962,83 @@
             self.setAutoCompletionEnabled(True)
         else:
             self.setAutoCompletionEnabled(False)
-    
+
     #################################################################
     ## Support for autocompletion hook methods
     #################################################################
-    
+
     def __charAdded(self, charNumber):
         """
         Private slot called to handle the user entering a character.
-        
+
         @param charNumber value of the character entered (integer)
         """
         char = chr(charNumber)
         # update code documentation viewer
-        if (
-            char == "(" and
-            Preferences.getDocuViewer("ShowInfoOnOpenParenthesis")
-        ):
+        if char == "(" and Preferences.getDocuViewer("ShowInfoOnOpenParenthesis"):
             self.vm.showEditorInfo(self)
-        
+
         self.__delayedDocstringMenuPopup(self.getCursorPosition())
-        
+
         if self.isListActive():
             if self.__isStartChar(char):
                 self.cancelList()
                 self.autoComplete(auto=True, context=True)
                 return
-            elif char == '(':
+            elif char == "(":
                 self.cancelList()
             else:
                 self.__acTimer.stop()
-        
+
         if (
-            self.callTipsStyle() !=
-            QsciScintilla.CallTipsStyle.CallTipsNone and
-            self.lexer_ is not None and chr(charNumber) in '()'
+            self.callTipsStyle() != QsciScintilla.CallTipsStyle.CallTipsNone
+            and self.lexer_ is not None
+            and chr(charNumber) in "()"
         ):
             self.callTip()
-        
+
         if not self.isCallTipActive():
             char = chr(charNumber)
             if self.__isStartChar(char):
                 self.autoComplete(auto=True, context=True)
                 return
-            
+
             line, col = self.getCursorPosition()
             txt = self.getWordLeft(line, col)
             if len(txt) >= Preferences.getEditor("AutoCompletionThreshold"):
                 self.autoComplete(auto=True, context=False)
                 return
-    
+
     def __isStartChar(self, ch):
         """
         Private method to check, if a character is an autocompletion start
         character.
-        
+
         @param ch character to be checked (one character string)
         @return flag indicating the result (boolean)
         """
         if self.lexer_ is None:
             return False
-        
+
         wseps = self.lexer_.autoCompletionWordSeparators()
         return any(wsep.endswith(ch) for wsep in wseps)
-    
+
     def __autocompletionCancelled(self):
         """
         Private slot to handle the cancellation of an auto-completion list.
         """
         self.__acWatchdog.stop()
-        
+
         self.__acText = ""
-    
+
     #################################################################
     ## auto-completion hook interfaces
     #################################################################
-    
+
     def addCompletionListHook(self, key, func, asynchroneous=False):
         """
         Public method to set an auto-completion list provider.
-        
+
         @param key name of the provider
         @type str
         @param func function providing completion list. func
@@ -5042,28 +5052,30 @@
         @type bool
         """
         if (
-            key in self.__completionListHookFunctions or
-            key in self.__completionListAsyncHookFunctions
+            key in self.__completionListHookFunctions
+            or key in self.__completionListAsyncHookFunctions
         ):
             # it was already registered
             EricMessageBox.warning(
                 self,
                 self.tr("Auto-Completion Provider"),
-                self.tr("""The completion list provider '{0}' was already"""
-                        """ registered. Ignoring duplicate request.""")
-                .format(key))
+                self.tr(
+                    """The completion list provider '{0}' was already"""
+                    """ registered. Ignoring duplicate request."""
+                ).format(key),
+            )
             return
-        
+
         if asynchroneous:
             self.__completionListAsyncHookFunctions[key] = func
         else:
             self.__completionListHookFunctions[key] = func
-    
+
     def removeCompletionListHook(self, key):
         """
         Public method to remove a previously registered completion list
         provider.
-        
+
         @param key name of the provider
         @type str
         """
@@ -5071,23 +5083,24 @@
             del self.__completionListHookFunctions[key]
         elif key in self.__completionListAsyncHookFunctions:
             del self.__completionListAsyncHookFunctions[key]
-    
+
     def getCompletionListHook(self, key):
         """
         Public method to get the registered completion list provider.
-        
+
         @param key name of the provider
         @type str
         @return function providing completion list
         @rtype function or None
         """
-        return (self.__completionListHookFunctions.get(key) or
-                self.__completionListAsyncHookFunctions.get(key))
-    
+        return self.__completionListHookFunctions.get(
+            key
+        ) or self.__completionListAsyncHookFunctions.get(key)
+
     def autoComplete(self, auto=False, context=True):
         """
         Public method to start auto-completion.
-        
+
         @param auto flag indicating a call from the __charAdded method
             (boolean)
         @param context flag indicating to complete a context (boolean)
@@ -5095,13 +5108,13 @@
         if auto and not Preferences.getEditor("AutoCompletionEnabled"):
             # auto-completion is disabled
             return
-        
+
         if self.isListActive():
             self.cancelList()
-        
+
         if (
-            self.__completionListHookFunctions or
-            self.__completionListAsyncHookFunctions
+            self.__completionListHookFunctions
+            or self.__completionListAsyncHookFunctions
         ):
             # Avoid delayed auto-completion after cursor repositioning
             self.__acText = self.__getAcText()
@@ -5111,17 +5124,15 @@
                 self.__acTimer.start()
             else:
                 self.__autoComplete(auto, context)
-        elif (
-            not auto or
-            (self.autoCompletionSource() !=
-             QsciScintilla.AutoCompletionSource.AcsNone)
+        elif not auto or (
+            self.autoCompletionSource() != QsciScintilla.AutoCompletionSource.AcsNone
         ):
             self.autoCompleteQScintilla()
-    
+
     def __getAcText(self):
         """
         Private method to get the text from cursor position for autocompleting.
-        
+
         @return text left of cursor position
         @rtype str
         """
@@ -5130,18 +5141,18 @@
         try:
             acText = (
                 self.getWordLeft(line, col - 1) + text[col - 1]
-                if self.__isStartChar(text[col - 1]) else
-                self.getWordLeft(line, col)
+                if self.__isStartChar(text[col - 1])
+                else self.getWordLeft(line, col)
             )
         except IndexError:
             acText = ""
-        
+
         return acText
-    
+
     def __autoComplete(self, auto=True, context=None):
         """
         Private method to start auto-completion via plug-ins.
-        
+
         @param auto flag indicating a call from the __charAdded method
             (boolean)
         @param context flag indicating to complete a context
@@ -5149,124 +5160,121 @@
         """
         self.__acCompletions.clear()
         self.__acCompletionsFinished = 0
-        
+
         # Suppress empty completions
-        if auto and self.__acText == '':
+        if auto and self.__acText == "":
             return
-        
+
         completions = (
-            self.__acCache.get(self.__acText)
-            if self.__acCacheEnabled else
-            None
+            self.__acCache.get(self.__acText) if self.__acCacheEnabled else None
         )
         if completions is not None:
             # show list with cached entries
             if self.isListActive():
                 self.cancelList()
-            
+
             self.__showCompletionsList(completions)
         else:
             if context is None:
                 context = self.__acContext
-            
+
             for key in self.__completionListAsyncHookFunctions:
                 self.__completionListAsyncHookFunctions[key](
-                    self, context, self.__acText)
-            
+                    self, context, self.__acText
+                )
+
             for key in self.__completionListHookFunctions:
-                completions = self.__completionListHookFunctions[key](
-                    self, context)
+                completions = self.__completionListHookFunctions[key](self, context)
                 self.completionsListReady(completions, self.__acText)
-            
+
             if Preferences.getEditor("AutoCompletionScintillaOnFail"):
                 self.__acWatchdog.start()
-    
+
     def completionsListReady(self, completions, acText):
         """
         Public method to show the completions determined by a completions
         provider.
-        
+
         @param completions list of possible completions
         @type list of str or set of str
         @param acText text to be completed
         @type str
         """
-        currentWord = self.__getAcText() or ' '
+        currentWord = self.__getAcText() or " "
         # process the list only, if not already obsolete ...
         if acText != self.__acText or not self.__acText.endswith(currentWord):
             # Suppress auto-completion done by QScintilla as fallback
             self.__acWatchdog.stop()
             return
-        
+
         self.__acCompletions.update(set(completions))
-        
+
         self.__acCompletionsFinished += 1
         # Got all results from auto completer?
         if self.__acCompletionsFinished >= (
-            len(self.__completionListAsyncHookFunctions) +
-            len(self.__completionListHookFunctions)
+            len(self.__completionListAsyncHookFunctions)
+            + len(self.__completionListHookFunctions)
         ):
             self.__acWatchdog.stop()
-            
+
             # Autocomplete with QScintilla if no results present
             if (
-                Preferences.getEditor("AutoCompletionScintillaOnFail") and
-                not self.__acCompletions
+                Preferences.getEditor("AutoCompletionScintillaOnFail")
+                and not self.__acCompletions
             ):
                 self.autoCompleteQScintilla()
                 return
-        
+
         # ... or completions are not empty
         if not bool(completions):
             return
-        
+
         if self.isListActive():
             self.cancelList()
-        
+
         if self.__acCompletions:
             if self.__acCacheEnabled:
                 self.__acCache.add(acText, set(self.__acCompletions))
             self.__showCompletionsList(self.__acCompletions)
-    
+
     def __showCompletionsList(self, completions):
         """
         Private method to show the completions list.
-        
+
         @param completions completions to be shown
         @type list of str or set of str
         """
         acCompletions = (
-            sorted(completions,
-                   key=self.__replaceLeadingUnderscores)
-            if Preferences.getEditor("AutoCompletionReversedList") else
-            sorted(completions)
+            sorted(completions, key=self.__replaceLeadingUnderscores)
+            if Preferences.getEditor("AutoCompletionReversedList")
+            else sorted(completions)
         )
         self.showUserList(EditorAutoCompletionListID, acCompletions)
-    
+
     def __replaceLeadingUnderscores(self, txt):
         """
         Private method to replace the first two underlines for invers sorting.
-        
+
         @param txt completion text
         @type str
         @return modified completion text
         @rtype str
         """
-        if txt.startswith('_'):
-            return txt[:2].replace('_', '~') + txt[2:]
+        if txt.startswith("_"):
+            return txt[:2].replace("_", "~") + txt[2:]
         else:
             return txt
-    
+
     def __clearCompletionsCache(self):
         """
         Private method to clear the auto-completions cache.
         """
         self.__acCache.clear()
-    
+
     def __completionListSelected(self, listId, txt):
         """
         Private slot to handle the selection from the completion list.
-        
+
         @param listId the ID of the user list (should be 1 or 2) (integer)
         @param txt the selected text (string)
         """
@@ -5275,7 +5283,7 @@
             lst = txt.split()
             if len(lst) > 1:
                 txt = lst[0]
-            
+
             self.beginUndoAction()
             if Preferences.getEditor("AutoCompletionReplaceWord"):
                 self.selectCurrentWord()
@@ -5289,46 +5297,47 @@
                     self.removeSelectedText()
                     line, col = self.getCursorPosition()
                 elif wLeft:
-                    txt = txt[len(wLeft):]
-                
+                    txt = txt[len(wLeft) :]
+
                 if txt and txt[0] in "'\"":
                     # New in jedi 0.16: AC of dict keys
                     txt = txt[1:]
             self.insert(txt)
             self.endUndoAction()
             self.setCursorPosition(line, col + len(txt))
-        
+
         # template completions
         elif listId == TemplateCompletionListID:
             self.__applyTemplate(txt, self.getLanguage())
-        
+
         # 'goto reference' completions
         elif listId == ReferencesListID:
             with contextlib.suppress(ValueError, IndexError):
                 index = self.__referencesList.index(txt)
                 filename, line, column = self.__referencesPositionsList[index]
-                self.vm.openSourceFile(
-                    filename, lineno=line, pos=column, addNext=True)
-    
+                self.vm.openSourceFile(filename, lineno=line, pos=column, addNext=True)
+
     def canProvideDynamicAutoCompletion(self):
         """
         Public method to test the dynamic auto-completion availability.
-        
+
         @return flag indicating the availability of dynamic auto-completion
             (boolean)
         """
-        return (self.acAPI or
-                bool(self.__completionListHookFunctions) or
-                bool(self.__completionListAsyncHookFunctions))
-    
+        return (
+            self.acAPI
+            or bool(self.__completionListHookFunctions)
+            or bool(self.__completionListAsyncHookFunctions)
+        )
+
     #################################################################
     ## call-tip hook interfaces
     #################################################################
-    
+
     def addCallTipHook(self, key, func):
         """
         Public method to set a calltip provider.
-        
+
         @param key name of the provider
         @type str
         @param func function providing calltips. func
@@ -5343,27 +5352,29 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Call-Tips Provider"),
-                self.tr("""The call-tips provider '{0}' was already"""
-                        """ registered. Ignoring duplicate request.""")
-                .format(key))
+                self.tr(
+                    """The call-tips provider '{0}' was already"""
+                    """ registered. Ignoring duplicate request."""
+                ).format(key),
+            )
             return
-        
+
         self.__ctHookFunctions[key] = func
-    
+
     def removeCallTipHook(self, key):
         """
         Public method to remove a previously registered calltip provider.
-        
+
         @param key name of the provider
         @type str
         """
         if key in self.__ctHookFunctions:
             del self.__ctHookFunctions[key]
-    
+
     def getCallTipHook(self, key):
         """
         Public method to get the registered calltip provider.
-        
+
         @param key name of the provider
         @type str
         @return function providing calltips
@@ -5373,16 +5384,15 @@
             return self.__ctHookFunctions[key]
         else:
             return None
-    
+
     def canProvideCallTipps(self):
         """
         Public method to test the calltips availability.
-        
+
         @return flag indicating the availability of calltips (boolean)
         """
-        return (self.acAPI or
-                bool(self.__ctHookFunctions))
-    
+        return self.acAPI or bool(self.__ctHookFunctions)
+
     def callTip(self):
         """
         Public method to show calltips.
@@ -5391,46 +5401,46 @@
             self.__callTip()
         else:
             super().callTip()
-    
+
     def __callTip(self):
         """
         Private method to show call tips provided by a plugin.
         """
         pos = self.currentPosition()
-        
+
         # move backward to the start of the current calltip working out
         # which argument to highlight
         commas = 0
         found = False
         ch, pos = self.__getCharacter(pos)
         while ch:
-            if ch == ',':
+            if ch == ",":
                 commas += 1
-            elif ch == ')':
+            elif ch == ")":
                 depth = 1
-                
+
                 # ignore everything back to the start of the corresponding
                 # parenthesis
                 ch, pos = self.__getCharacter(pos)
                 while ch:
-                    if ch == ')':
+                    if ch == ")":
                         depth += 1
-                    elif ch == '(':
+                    elif ch == "(":
                         depth -= 1
                         if depth == 0:
                             break
                     ch, pos = self.__getCharacter(pos)
-            elif ch == '(':
+            elif ch == "(":
                 found = True
                 break
-            
+
             ch, pos = self.__getCharacter(pos)
-        
+
         self.cancelCallTips()
-        
+
         if not found:
             return
-        
+
         callTips = []
         if self.__ctHookFunctions:
             for key in self.__ctHookFunctions:
@@ -5446,62 +5456,65 @@
                 # try QScintilla calltips
                 super().callTip()
             return
-        
+
         ctshift = 0
         for ct in callTips:
             shift = ct.index("(")
             if ctshift < shift:
                 ctshift = shift
-        
+
         cv = self.callTipsVisible()
         ct = (
             # this is just a safe guard
             self._encodeString("\n".join(callTips[:cv]))
-            if cv > 0 else
+            if cv > 0
+            else
             # until here and unindent below
             self._encodeString("\n".join(callTips))
         )
-        
-        self.SendScintilla(QsciScintilla.SCI_CALLTIPSHOW,
-                           self.__adjustedCallTipPosition(ctshift, pos), ct)
-        if b'\n' in ct:
+
+        self.SendScintilla(
+            QsciScintilla.SCI_CALLTIPSHOW,
+            self.__adjustedCallTipPosition(ctshift, pos),
+            ct,
+        )
+        if b"\n" in ct:
             return
-        
+
         # Highlight the current argument
         if commas == 0:
-            astart = ct.find(b'(')
-        else:
-            astart = ct.find(b',')
+            astart = ct.find(b"(")
+        else:
+            astart = ct.find(b",")
             commas -= 1
             while astart != -1 and commas > 0:
-                astart = ct.find(b',', astart + 1)
+                astart = ct.find(b",", astart + 1)
                 commas -= 1
-        
+
         if astart == -1:
             return
-        
+
         depth = 0
         for aend in range(astart + 1, len(ct)):
-            ch = ct[aend:aend + 1]
-            
-            if ch == b',' and depth == 0:
+            ch = ct[aend : aend + 1]
+
+            if ch == b"," and depth == 0:
                 break
-            elif ch == b'(':
+            elif ch == b"(":
                 depth += 1
-            elif ch == b')':
+            elif ch == b")":
                 if depth == 0:
                     break
-                
+
                 depth -= 1
-        
+
         if astart != aend:
-            self.SendScintilla(QsciScintilla.SCI_CALLTIPSETHLT,
-                               astart + 1, aend)
-    
+            self.SendScintilla(QsciScintilla.SCI_CALLTIPSETHLT, astart + 1, aend)
+
     def __adjustedCallTipPosition(self, ctshift, pos):
         """
         Private method to calculate an adjusted position for showing calltips.
-        
+
         @param ctshift amount the calltip shall be shifted (integer)
         @param pos position into the text (integer)
         @return new position for the calltip (integer)
@@ -5510,31 +5523,32 @@
         if ctshift:
             ctmin = self.SendScintilla(
                 QsciScintilla.SCI_POSITIONFROMLINE,
-                self.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, ct))
+                self.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, ct),
+            )
             if ct - ctshift < ctmin:
                 ct = ctmin
             else:
                 ct -= ctshift
         return ct
-    
+
     #################################################################
     ## Methods needed by the code documentation viewer
     #################################################################
-    
+
     def __showCodeInfo(self):
         """
         Private slot to handle the context menu action to show code info.
         """
         self.vm.showEditorInfo(self)
-    
+
     #################################################################
     ## Methods needed by the context menu
     #################################################################
-    
+
     def __marginNumber(self, xPos):
         """
         Private method to calculate the margin number based on a x position.
-        
+
         @param xPos x position (integer)
         @return margin number (integer, -1 for no margin)
         """
@@ -5544,29 +5558,27 @@
             if xPos <= width:
                 return margin
         return -1
-        
+
     def contextMenuEvent(self, evt):
         """
         Protected method implementing the context menu event.
-        
+
         @param evt the context menu event (QContextMenuEvent)
         """
         evt.accept()
         if self.__marginNumber(evt.x()) == -1:
             self.spellingMenuPos = self.positionFromPoint(evt.pos())
             if (
-                self.spellingMenuPos >= 0 and
-                self.spell is not None and
-                self.hasIndicator(self.spellingIndicator,
-                                  self.spellingMenuPos)
+                self.spellingMenuPos >= 0
+                and self.spell is not None
+                and self.hasIndicator(self.spellingIndicator, self.spellingMenuPos)
             ):
                 self.spellingMenu.popup(evt.globalPos())
             else:
                 self.menu.popup(evt.globalPos())
         else:
             self.line = self.lineAt(evt.pos())
-            if self.__marginNumber(evt.x()) in [self.__bmMargin,
-                                                self.__linenoMargin]:
+            if self.__marginNumber(evt.x()) in [self.__bmMargin, self.__linenoMargin]:
                 self.bmMarginMenu.popup(evt.globalPos())
             elif self.__marginNumber(evt.x()) == self.__bpMargin:
                 self.bpMarginMenu.popup(evt.globalPos())
@@ -5574,13 +5586,14 @@
                 self.indicMarginMenu.popup(evt.globalPos())
             elif self.__marginNumber(evt.x()) == self.__foldMargin:
                 self.foldMarginMenu.popup(evt.globalPos())
-        
+
     def __showContextMenu(self):
         """
         Private slot handling the aboutToShow signal of the context menu.
         """
         self.menuActs["Reopen"].setEnabled(
-            not self.isModified() and bool(self.fileName))
+            not self.isModified() and bool(self.fileName)
+        )
         self.menuActs["Save"].setEnabled(self.isModified())
         self.menuActs["Undo"].setEnabled(self.isUndoAvailable())
         self.menuActs["Redo"].setEnabled(self.isRedoAvailable())
@@ -5588,266 +5601,249 @@
         self.menuActs["Cut"].setEnabled(self.hasSelectedText())
         self.menuActs["Copy"].setEnabled(self.hasSelectedText())
         if self.menuActs["ExecuteSelection"] is not None:
-            self.menuActs["ExecuteSelection"].setEnabled(
-                self.hasSelectedText())
+            self.menuActs["ExecuteSelection"].setEnabled(self.hasSelectedText())
         self.menuActs["Paste"].setEnabled(self.canPaste())
         if not self.isResourcesFile:
             if self.fileName and self.isPyFile():
                 self.menuActs["Show"].setEnabled(True)
             else:
                 self.menuActs["Show"].setEnabled(False)
-            if (
-                self.fileName and
-                (self.isPyFile() or self.isRubyFile())
-            ):
+            if self.fileName and (self.isPyFile() or self.isRubyFile()):
                 self.menuActs["Diagrams"].setEnabled(True)
             else:
                 self.menuActs["Diagrams"].setEnabled(False)
         if not self.miniMenu:
             if self.lexer_ is not None:
-                self.menuActs["Comment"].setEnabled(
-                    self.lexer_.canBlockComment())
-                self.menuActs["Uncomment"].setEnabled(
-                    self.lexer_.canBlockComment())
+                self.menuActs["Comment"].setEnabled(self.lexer_.canBlockComment())
+                self.menuActs["Uncomment"].setEnabled(self.lexer_.canBlockComment())
             else:
                 self.menuActs["Comment"].setEnabled(False)
                 self.menuActs["Uncomment"].setEnabled(False)
-            
+
             cline = self.getCursorPosition()[0]
             line = self.text(cline)
             self.menuActs["Docstring"].setEnabled(
-                self.getDocstringGenerator().isFunctionStart(line))
-        
-        self.menuActs["TypingAidsEnabled"].setEnabled(
-            self.completer is not None)
+                self.getDocstringGenerator().isFunctionStart(line)
+            )
+
+        self.menuActs["TypingAidsEnabled"].setEnabled(self.completer is not None)
         self.menuActs["TypingAidsEnabled"].setChecked(
-            self.completer is not None and self.completer.isEnabled())
-        
+            self.completer is not None and self.completer.isEnabled()
+        )
+
         if not self.isResourcesFile:
             self.menuActs["calltip"].setEnabled(self.canProvideCallTipps())
             self.menuActs["codeInfo"].setEnabled(
-                self.vm.isEditorInfoSupported(self.getLanguage()))
-        
+                self.vm.isEditorInfoSupported(self.getLanguage())
+            )
+
         self.menuActs["MonospacedFont"].setEnabled(self.lexer_ is None)
-        
+
         splitOrientation = self.vm.getSplitOrientation()
         if splitOrientation == Qt.Orientation.Horizontal:
-            self.menuActs["NewSplit"].setIcon(
-                UI.PixmapCache.getIcon("splitHorizontal"))
-        else:
-            self.menuActs["NewSplit"].setIcon(
-                UI.PixmapCache.getIcon("splitVertical"))
-        
+            self.menuActs["NewSplit"].setIcon(UI.PixmapCache.getIcon("splitHorizontal"))
+        else:
+            self.menuActs["NewSplit"].setIcon(UI.PixmapCache.getIcon("splitVertical"))
+
         self.menuActs["Tools"].setEnabled(not self.toolsMenu.isEmpty())
-        
+
         self.showMenu.emit("Main", self.menu, self)
-        
+
     def __showContextMenuAutocompletion(self):
         """
         Private slot called before the autocompletion menu is shown.
         """
-        self.menuActs["acDynamic"].setEnabled(
-            self.canProvideDynamicAutoCompletion())
-        self.menuActs["acClearCache"].setEnabled(
-            self.canProvideDynamicAutoCompletion())
+        self.menuActs["acDynamic"].setEnabled(self.canProvideDynamicAutoCompletion())
+        self.menuActs["acClearCache"].setEnabled(self.canProvideDynamicAutoCompletion())
         self.menuActs["acAPI"].setEnabled(self.acAPI)
         self.menuActs["acAPIDocument"].setEnabled(self.acAPI)
-        
+
         self.showMenu.emit("Autocompletion", self.autocompletionMenu, self)
-        
+
     def __showContextMenuShow(self):
         """
         Private slot called before the show menu is shown.
         """
         prEnable = False
         coEnable = False
-        
+
         # first check if the file belongs to a project
-        if (
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
-        ):
+        if self.project.isOpen() and self.project.isProjectSource(self.fileName):
             fn = self.project.getMainScript(True)
             if fn is not None:
-                prEnable = (
-                    self.project.isPy3Project() and
-                    bool(Utilities.getProfileFileNames(fn))
+                prEnable = self.project.isPy3Project() and bool(
+                    Utilities.getProfileFileNames(fn)
                 )
-                coEnable = (
-                    self.project.isPy3Project() and
-                    bool(Utilities.getCoverageFileNames(fn))
+                coEnable = self.project.isPy3Project() and bool(
+                    Utilities.getCoverageFileNames(fn)
                 )
-        
+
         # now check ourselves
         fn = self.getFileName()
         if fn is not None:
-            prEnable |= (
-                self.project.isPy3Project() and
-                bool(Utilities.getProfileFileName(fn))
+            prEnable |= self.project.isPy3Project() and bool(
+                Utilities.getProfileFileName(fn)
             )
-            coEnable |= (
-                self.project.isPy3Project() and
-                bool(Utilities.getCoverageFileName(fn))
+            coEnable |= self.project.isPy3Project() and bool(
+                Utilities.getCoverageFileName(fn)
             )
-        
+
         coEnable |= bool(self.__coverageFile)
-        
+
         # now check for syntax errors
         if self.hasSyntaxErrors():
             coEnable = False
-        
+
         self.profileMenuAct.setEnabled(prEnable)
         self.coverageMenuAct.setEnabled(coEnable)
         self.coverageShowAnnotationMenuAct.setEnabled(
-            coEnable and len(self.notcoveredMarkers) == 0)
-        self.coverageHideAnnotationMenuAct.setEnabled(
-            len(self.notcoveredMarkers) > 0)
-        
+            coEnable and len(self.notcoveredMarkers) == 0
+        )
+        self.coverageHideAnnotationMenuAct.setEnabled(len(self.notcoveredMarkers) > 0)
+
         self.showMenu.emit("Show", self.menuShow, self)
-        
+
     def __showContextMenuGraphics(self):
         """
         Private slot handling the aboutToShow signal of the diagrams context
         menu.
         """
-        if (
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
-        ):
+        if self.project.isOpen() and self.project.isProjectSource(self.fileName):
             self.applicationDiagramMenuAct.setEnabled(True)
         else:
             self.applicationDiagramMenuAct.setEnabled(False)
-        
+
         self.showMenu.emit("Graphics", self.graphicsMenu, self)
-        
+
     def __showContextMenuMargin(self, menu):
         """
         Private slot handling the aboutToShow signal of the margins context
         menu.
-        
+
         @param menu reference to the menu to be shown
         @type QMenu
         """
         if menu is self.bpMarginMenu:
             supportsDebugger = bool(self.fileName and self.isPyFile())
             hasBreakpoints = bool(self.breaks)
-            hasBreakpoint = bool(
-                self.markersAtLine(self.line) & self.breakpointMask)
-            
+            hasBreakpoint = bool(self.markersAtLine(self.line) & self.breakpointMask)
+
             self.marginMenuActs["Breakpoint"].setEnabled(supportsDebugger)
             self.marginMenuActs["TempBreakpoint"].setEnabled(supportsDebugger)
             self.marginMenuActs["NextBreakpoint"].setEnabled(
-                supportsDebugger and hasBreakpoints)
+                supportsDebugger and hasBreakpoints
+            )
             self.marginMenuActs["PreviousBreakpoint"].setEnabled(
-                supportsDebugger and hasBreakpoints)
+                supportsDebugger and hasBreakpoints
+            )
             self.marginMenuActs["ClearBreakpoint"].setEnabled(
-                supportsDebugger and hasBreakpoints)
+                supportsDebugger and hasBreakpoints
+            )
             self.marginMenuActs["EditBreakpoint"].setEnabled(
-                supportsDebugger and hasBreakpoint)
+                supportsDebugger and hasBreakpoint
+            )
             self.marginMenuActs["EnableBreakpoint"].setEnabled(
-                supportsDebugger and hasBreakpoint)
+                supportsDebugger and hasBreakpoint
+            )
             if supportsDebugger:
                 if self.markersAtLine(self.line) & (1 << self.dbreakpoint):
                     self.marginMenuActs["EnableBreakpoint"].setText(
-                        self.tr('Enable breakpoint'))
+                        self.tr("Enable breakpoint")
+                    )
                 else:
                     self.marginMenuActs["EnableBreakpoint"].setText(
-                        self.tr('Disable breakpoint'))
-        
+                        self.tr("Disable breakpoint")
+                    )
+
         if menu is self.bmMarginMenu:
             hasBookmarks = bool(self.bookmarks)
-            
+
             self.marginMenuActs["NextBookmark"].setEnabled(hasBookmarks)
             self.marginMenuActs["PreviousBookmark"].setEnabled(hasBookmarks)
             self.marginMenuActs["ClearBookmark"].setEnabled(hasBookmarks)
-        
+
         if menu is self.foldMarginMenu:
-            isFoldHeader = bool(self.SendScintilla(
-                QsciScintilla.SCI_GETFOLDLEVEL, self.line) &
-                QsciScintilla.SC_FOLDLEVELHEADERFLAG)
-            
+            isFoldHeader = bool(
+                self.SendScintilla(QsciScintilla.SCI_GETFOLDLEVEL, self.line)
+                & QsciScintilla.SC_FOLDLEVELHEADERFLAG
+            )
+
             self.marginMenuActs["ExpandChildren"].setEnabled(isFoldHeader)
             self.marginMenuActs["CollapseChildren"].setEnabled(isFoldHeader)
-        
+
         if menu is self.indicMarginMenu:
             hasSyntaxErrors = bool(self.syntaxerrors)
             hasWarnings = bool(self.warnings)
             hasNotCoveredMarkers = bool(self.notcoveredMarkers)
-            
+
             self.marginMenuActs["GotoSyntaxError"].setEnabled(hasSyntaxErrors)
             self.marginMenuActs["ClearSyntaxError"].setEnabled(hasSyntaxErrors)
-            if (
-                hasSyntaxErrors and
-                self.markersAtLine(self.line) & (1 << self.syntaxerror)
+            if hasSyntaxErrors and self.markersAtLine(self.line) & (
+                1 << self.syntaxerror
             ):
                 self.marginMenuActs["ShowSyntaxError"].setEnabled(True)
             else:
                 self.marginMenuActs["ShowSyntaxError"].setEnabled(False)
-            
+
             self.marginMenuActs["NextWarningMarker"].setEnabled(hasWarnings)
-            self.marginMenuActs["PreviousWarningMarker"].setEnabled(
-                hasWarnings)
+            self.marginMenuActs["PreviousWarningMarker"].setEnabled(hasWarnings)
             self.marginMenuActs["ClearWarnings"].setEnabled(hasWarnings)
-            if (
-                hasWarnings and
-                self.markersAtLine(self.line) & (1 << self.warning)
-            ):
+            if hasWarnings and self.markersAtLine(self.line) & (1 << self.warning):
                 self.marginMenuActs["ShowWarning"].setEnabled(True)
             else:
                 self.marginMenuActs["ShowWarning"].setEnabled(False)
-            
-            self.marginMenuActs["NextCoverageMarker"].setEnabled(
-                hasNotCoveredMarkers)
+
+            self.marginMenuActs["NextCoverageMarker"].setEnabled(hasNotCoveredMarkers)
             self.marginMenuActs["PreviousCoverageMarker"].setEnabled(
-                hasNotCoveredMarkers)
-            
-            self.marginMenuActs["PreviousTaskMarker"].setEnabled(
-                self.__hasTaskMarkers)
-            self.marginMenuActs["NextTaskMarker"].setEnabled(
-                self.__hasTaskMarkers)
-            
+                hasNotCoveredMarkers
+            )
+
+            self.marginMenuActs["PreviousTaskMarker"].setEnabled(self.__hasTaskMarkers)
+            self.marginMenuActs["NextTaskMarker"].setEnabled(self.__hasTaskMarkers)
+
             self.marginMenuActs["PreviousChangeMarker"].setEnabled(
-                self.__hasChangeMarkers)
-            self.marginMenuActs["NextChangeMarker"].setEnabled(
-                self.__hasChangeMarkers)
+                self.__hasChangeMarkers
+            )
+            self.marginMenuActs["NextChangeMarker"].setEnabled(self.__hasChangeMarkers)
             self.marginMenuActs["ClearChangeMarkers"].setEnabled(
-                self.__hasChangeMarkers)
-        
+                self.__hasChangeMarkers
+            )
+
         self.showMenu.emit("Margin", menu, self)
-        
+
     def __showContextMenuChecks(self):
         """
         Private slot handling the aboutToShow signal of the checks context
         menu.
         """
         self.showMenu.emit("Checks", self.checksMenu, self)
-        
+
     def __showContextMenuTools(self):
         """
         Private slot handling the aboutToShow signal of the tools context
         menu.
         """
         self.showMenu.emit("Tools", self.toolsMenu, self)
-    
+
     def __showContextMenuFormatting(self):
         """
         Private slot handling the aboutToShow signal of the code formatting context
         menu.
         """
         self.showMenu.emit("Formatting", self.codeFormattingMenu, self)
-    
+
     def __reopenWithEncodingMenuTriggered(self, act):
         """
         Private method to handle the rereading of the file with a selected
         encoding.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         encoding = act.data()
         self.readFile(self.fileName, encoding=encoding)
         self.__convertTabs()
         self.__checkEncoding()
-        
+
     def __contextSave(self):
         """
         Private slot handling the save context menu entry.
@@ -5855,7 +5851,7 @@
         ok = self.saveFile()
         if ok:
             self.vm.setEditorName(self, self.fileName)
-        
+
     def __contextSaveAs(self):
         """
         Private slot handling the save as context menu entry.
@@ -5863,44 +5859,44 @@
         ok = self.saveFileAs()
         if ok:
             self.vm.setEditorName(self, self.fileName)
-        
+
     def __contextSaveCopy(self):
         """
         Private slot handling the save copy context menu entry.
         """
         self.saveFileCopy()
-        
+
     def __contextClose(self):
         """
         Private slot handling the close context menu entry.
         """
         self.vm.closeEditor(self)
-    
+
     def __newView(self):
         """
         Private slot to create a new view to an open document.
         """
         self.vm.newEditorView(self.fileName, self, self.filetype)
-        
+
     def __newViewNewSplit(self):
         """
         Private slot to create a new view to an open document.
         """
         self.vm.addSplit()
         self.vm.newEditorView(self.fileName, self, self.filetype)
-        
+
     def __selectAll(self):
         """
         Private slot handling the select all context menu action.
         """
         self.selectAll(True)
-            
+
     def __deselectAll(self):
         """
         Private slot handling the deselect all context menu action.
         """
         self.selectAll(False)
-        
+
     def joinLines(self):
         """
         Public slot to join the current line with the next one.
@@ -5908,55 +5904,54 @@
         curLine = self.getCursorPosition()[0]
         if curLine == self.lines() - 1:
             return
-        
+
         line0Text = self.text(curLine)
         line1Text = self.text(curLine + 1)
         if line1Text in ["", "\r", "\n", "\r\n"]:
             return
-        
-        if (
-            line0Text.rstrip("\r\n\\ \t").endswith(("'", '"')) and
-            line1Text.lstrip().startswith(("'", '"'))
-        ):
+
+        if line0Text.rstrip("\r\n\\ \t").endswith(
+            ("'", '"')
+        ) and line1Text.lstrip().startswith(("'", '"')):
             # merging multi line strings
             startChars = "\r\n\\ \t'\""
             endChars = " \t'\""
         else:
             startChars = "\r\n\\ \t"
             endChars = " \t"
-        
+
         # determine start index
         startIndex = len(line0Text)
         while startIndex > 0 and line0Text[startIndex - 1] in startChars:
             startIndex -= 1
         if startIndex == 0:
             return
-        
+
         # determine end index
         endIndex = 0
         while line1Text[endIndex] in endChars:
             endIndex += 1
-        
+
         self.setSelection(curLine, startIndex, curLine + 1, endIndex)
         self.beginUndoAction()
         self.removeSelectedText()
         self.insertAt(" ", curLine, startIndex)
         self.endUndoAction()
-        
+
     def shortenEmptyLines(self):
         """
         Public slot to compress lines consisting solely of whitespace
         characters.
         """
         searchRE = r"^[ \t]+$"
-        
+
         ok = self.findFirstTarget(searchRE, True, False, False, 0, 0)
         self.beginUndoAction()
         while ok:
             self.replaceTarget("")
             ok = self.findNextTarget()
         self.endUndoAction()
-        
+
     def __autosaveEnable(self):
         """
         Private slot handling the autosave enable context menu action.
@@ -5965,17 +5960,17 @@
             self.autosaveManuallyDisabled = False
         else:
             self.autosaveManuallyDisabled = True
-        
+
     def shouldAutosave(self):
         """
         Public slot to check the autosave flags.
-        
+
         @return flag indicating this editor should be saved (boolean)
         """
         return (
-            bool(self.fileName) and
-            not self.autosaveManuallyDisabled and
-            not self.isReadOnly()
+            bool(self.fileName)
+            and not self.autosaveManuallyDisabled
+            and not self.isReadOnly()
         )
 
     def checkSyntax(self):
@@ -5986,44 +5981,44 @@
         if fileType == "MicroPython":
             # adjustment for MicroPython
             fileType = "Python3"
-        
+
         if (
-            self.syntaxCheckService is None or
-            fileType not in self.syntaxCheckService.getLanguages()
+            self.syntaxCheckService is None
+            or fileType not in self.syntaxCheckService.getLanguages()
         ):
             return
-        
+
         if Preferences.getEditor("AutoCheckSyntax"):
             if Preferences.getEditor("OnlineSyntaxCheck"):
                 self.__onlineSyntaxCheckTimer.stop()
-            
+
             self.syntaxCheckService.syntaxCheck(
-                fileType, self.fileName or "(Unnamed)", self.text())
+                fileType, self.fileName or "(Unnamed)", self.text()
+            )
 
     def __processSyntaxCheckError(self, fn, msg):
         """
         Private slot to report an error message of a syntax check.
-        
+
         @param fn filename of the file
         @type str
         @param msg error message
         @type str
         """
-        if fn != self.fileName and (
-                bool(self.fileName) or fn != "(Unnamed)"):
+        if fn != self.fileName and (bool(self.fileName) or fn != "(Unnamed)"):
             return
-        
+
         self.clearSyntaxError()
         self.clearFlakesWarnings()
-        
+
         self.toggleWarning(0, 0, True, msg)
-        
+
         self.updateVerticalScrollBar()
-    
+
     def __processSyntaxCheckResult(self, fn, problems):
         """
         Private slot to report the resulting messages of a syntax check.
-        
+
         @param fn filename of the checked file (str)
         @param problems dictionary with the keys 'error' and 'warnings' which
             hold a list containing details about the error/ warnings
@@ -6031,24 +6026,23 @@
             errors), the message) (dict)
         """
         # Check if it's the requested file, otherwise ignore signal
-        if fn != self.fileName and (
-                bool(self.fileName) or fn != "(Unnamed)"):
+        if fn != self.fileName and (bool(self.fileName) or fn != "(Unnamed)"):
             return
-        
+
         self.clearSyntaxError()
         self.clearFlakesWarnings()
-        
-        error = problems.get('error')
+
+        error = problems.get("error")
         if error:
             _fn, lineno, col, code, msg = error
             self.toggleSyntaxError(lineno, col, True, msg)
-        
-        warnings = problems.get('warnings', [])
+
+        warnings = problems.get("warnings", [])
         for _fn, lineno, col, _code, msg in warnings:
             self.toggleWarning(lineno, col, True, msg)
-        
+
         self.updateVerticalScrollBar()
- 
+
     def __initOnlineSyntaxCheck(self):
         """
         Private slot to initialize the online syntax check.
@@ -6056,10 +6050,11 @@
         self.__onlineSyntaxCheckTimer = QTimer(self)
         self.__onlineSyntaxCheckTimer.setSingleShot(True)
         self.__onlineSyntaxCheckTimer.setInterval(
-            Preferences.getEditor("OnlineSyntaxCheckInterval") * 1000)
+            Preferences.getEditor("OnlineSyntaxCheckInterval") * 1000
+        )
         self.__onlineSyntaxCheckTimer.timeout.connect(self.checkSyntax)
         self.textChanged.connect(self.__resetOnlineSyntaxCheckTimer)
-        
+
     def __resetOnlineSyntaxCheckTimer(self):
         """
         Private method to reset the online syntax check timer.
@@ -6067,48 +6062,46 @@
         if Preferences.getEditor("OnlineSyntaxCheck"):
             self.__onlineSyntaxCheckTimer.stop()
             self.__onlineSyntaxCheckTimer.start()
-        
+
     def __showCodeMetrics(self):
         """
         Private method to handle the code metrics context menu action.
         """
         if not self.checkDirty():
             return
-        
+
         from DataViews.CodeMetricsDialog import CodeMetricsDialog
+
         self.codemetrics = CodeMetricsDialog()
         self.codemetrics.show()
         self.codemetrics.start(self.fileName)
-        
+
     def __getCodeCoverageFile(self):
         """
         Private method to get the file name of the file containing coverage
         info.
-        
+
         @return file name of the coverage file
         @rtype str
         """
         files = set()
-        
+
         if bool(self.__coverageFile):
             # return the path of a previously used coverage file
             return self.__coverageFile
-        
+
         # first check if the file belongs to a project and there is
         # a project coverage file
-        if (
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
-        ):
+        if self.project.isOpen() and self.project.isProjectSource(self.fileName):
             pfn = self.project.getMainScript(True)
             if pfn is not None:
                 files |= set(Utilities.getCoverageFileNames(pfn))
-        
+
         # now check, if there are coverage files belonging to ourselves
         fn = self.getFileName()
         if fn is not None:
             files |= set(Utilities.getCoverageFileNames(fn))
-        
+
         files = list(files)
         if files:
             if len(files) > 1:
@@ -6117,16 +6110,18 @@
                     self.tr("Code Coverage"),
                     self.tr("Please select a coverage file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return ""
             else:
                 cfn = files[0]
         else:
             cfn = None
-        
+
         return cfn
-        
+
     def __showCodeCoverage(self):
         """
         Private method to handle the code coverage context menu action.
@@ -6135,22 +6130,23 @@
         self.__coverageFile = fn
         if fn:
             from DataViews.PyCoverageDialog import PyCoverageDialog
+
             self.codecoverage = PyCoverageDialog()
             self.codecoverage.show()
             self.codecoverage.start(fn, self.fileName)
-        
+
     def refreshCoverageAnnotations(self):
         """
         Public method to refresh the code coverage annotations.
         """
         if self.showingNotcoveredMarkers:
             self.codeCoverageShowAnnotations(silent=True)
-        
+
     def codeCoverageShowAnnotations(self, silent=False, coverageFile=None):
         """
         Public method to handle the show code coverage annotations context
         menu action.
-        
+
         @param silent flag indicating to not show any dialog (defaults to
             False)
         @type bool (optional)
@@ -6159,16 +6155,13 @@
         @type str (optional)
         """
         self.__codeCoverageHideAnnotations()
-        
-        fn = (
-            coverageFile
-            if bool(coverageFile) else
-            self.__getCodeCoverageFile()
-        )
+
+        fn = coverageFile if bool(coverageFile) else self.__getCodeCoverageFile()
         self.__coverageFile = fn
-        
+
         if fn:
             from coverage import Coverage
+
             cover = Coverage(data_file=fn)
             cover.load()
             missing = cover.analysis2(self.fileName)[3]
@@ -6183,15 +6176,17 @@
                     EricMessageBox.information(
                         self,
                         self.tr("Show Code Coverage Annotations"),
-                        self.tr("""All lines have been covered."""))
+                        self.tr("""All lines have been covered."""),
+                    )
             self.showingNotcoveredMarkers = True
         else:
             if not silent:
                 EricMessageBox.warning(
                     self,
                     self.tr("Show Code Coverage Annotations"),
-                    self.tr("""There is no coverage file available."""))
-        
+                    self.tr("""There is no coverage file available."""),
+                )
+
     def __codeCoverageHideAnnotations(self):
         """
         Private method to handle the hide code coverage annotations context
@@ -6203,11 +6198,11 @@
         self.coverageMarkersShown.emit(False)
         self.showingNotcoveredMarkers = False
         self.__markerMap.update()
-        
+
     def getCoverageLines(self):
         """
         Public method to get the lines containing a coverage marker.
-        
+
         @return list of lines containing a coverage marker (list of integer)
         """
         lines = []
@@ -6219,15 +6214,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasCoverageMarkers(self):
         """
         Public method to test, if there are coverage markers.
-        
+
         @return flag indicating the presence of coverage markers (boolean)
         """
         return len(self.notcoveredMarkers) > 0
-        
+
     def nextUncovered(self):
         """
         Public slot to handle the 'Next uncovered' context menu action.
@@ -6244,7 +6239,7 @@
         if ucline >= 0:
             self.setCursorPosition(ucline, 0)
             self.ensureLineVisible(ucline)
-        
+
     def previousUncovered(self):
         """
         Public slot to handle the 'Previous uncovered' context menu action.
@@ -6257,33 +6252,29 @@
         ucline = self.markerFindPrevious(line, 1 << self.notcovered)
         if ucline < 0:
             # wrap around
-            ucline = self.markerFindPrevious(
-                self.lines() - 1, 1 << self.notcovered)
+            ucline = self.markerFindPrevious(self.lines() - 1, 1 << self.notcovered)
         if ucline >= 0:
             self.setCursorPosition(ucline, 0)
             self.ensureLineVisible(ucline)
-        
+
     def __showProfileData(self):
         """
         Private method to handle the show profile data context menu action.
         """
         files = set()
-        
+
         # first check if the file belongs to a project and there is
         # a project profile file
-        if (
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
-        ):
+        if self.project.isOpen() and self.project.isProjectSource(self.fileName):
             fn = self.project.getMainScript(True)
             if fn is not None:
                 files |= set(Utilities.getProfileFileNames(fn))
-        
+
         # now check, if there are profile files belonging to ourselves
         fn = self.getFileName()
         if fn is not None:
             files |= set(Utilities.getProfileFileNames(fn))
-        
+
         files = list(files)
         if files:
             if len(files) > 1:
@@ -6292,19 +6283,22 @@
                     self.tr("Profile Data"),
                     self.tr("Please select a profile file"),
                     files,
-                    0, False)
+                    0,
+                    False,
+                )
                 if not ok:
                     return
             else:
                 fn = files[0]
         else:
             return
-        
+
         from DataViews.PyProfileDialog import PyProfileDialog
+
         self.profiledata = PyProfileDialog()
         self.profiledata.show()
         self.profiledata.start(fn, self.fileName)
-        
+
     def __lmBbookmarks(self):
         """
         Private method to handle the 'LMB toggles bookmark' context menu
@@ -6312,7 +6306,7 @@
         """
         self.marginMenuActs["LMBbookmarks"].setChecked(True)
         self.marginMenuActs["LMBbreakpoints"].setChecked(False)
-        
+
     def __lmBbreakpoints(self):
         """
         Private method to handle the 'LMB toggles breakpoint' context menu
@@ -6320,7 +6314,7 @@
         """
         self.marginMenuActs["LMBbookmarks"].setChecked(True)
         self.marginMenuActs["LMBbreakpoints"].setChecked(False)
-    
+
     ###########################################################################
     ## Syntax error handling methods below
     ###########################################################################
@@ -6328,7 +6322,7 @@
     def toggleSyntaxError(self, line, index, error, msg="", show=False):
         """
         Public method to toggle a syntax error indicator.
-        
+
         @param line line number of the syntax error (integer)
         @param index index number of the syntax error (integer)
         @param error flag indicating if the error marker should be
@@ -6351,8 +6345,8 @@
             else:
                 for handle in list(self.syntaxerrors.keys()):
                     if (
-                        self.markerLine(handle) == line - 1 and
-                        (msg, index) not in self.syntaxerrors[handle]
+                        self.markerLine(handle) == line - 1
+                        and (msg, index) not in self.syntaxerrors[handle]
                     ):
                         self.syntaxerrors[handle].append((msg, index))
             if show:
@@ -6364,28 +6358,28 @@
                     del self.syntaxerrors[handle]
                     self.markerDeleteHandle(handle)
                     self.syntaxerrorToggled.emit(self)
-        
+
         self.__setAnnotation(line - 1)
         self.__markerMap.update()
-        
+
     def getSyntaxErrors(self):
         """
         Public method to retrieve the syntax error markers.
-        
+
         @return sorted list of all lines containing a syntax error
             (list of integer)
         """
         selist = []
         for handle in list(self.syntaxerrors.keys()):
             selist.append(self.markerLine(handle) + 1)
-        
+
         selist.sort()
         return selist
-        
+
     def getSyntaxErrorLines(self):
         """
         Public method to get the lines containing a syntax error.
-        
+
         @return list of lines containing a syntax error (list of integer)
         """
         lines = []
@@ -6397,15 +6391,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasSyntaxErrors(self):
         """
         Public method to check for the presence of syntax errors.
-        
+
         @return flag indicating the presence of syntax errors (boolean)
         """
         return len(self.syntaxerrors) > 0
-    
+
     def gotoSyntaxError(self):
         """
         Public slot to handle the 'Goto syntax error' context menu action.
@@ -6418,7 +6412,7 @@
                     index = self.syntaxerrors[handle][0][1]
             self.setCursorPosition(seline, index)
         self.ensureLineVisible(seline)
-        
+
     def clearSyntaxError(self):
         """
         Public slot to handle the 'Clear all syntax error' context menu action.
@@ -6426,34 +6420,34 @@
         for handle in list(self.syntaxerrors.keys()):
             line = self.markerLine(handle) + 1
             self.toggleSyntaxError(line, 0, False)
-        
+
         self.syntaxerrors.clear()
         self.syntaxerrorToggled.emit(self)
-    
+
     def __showSyntaxError(self, line=-1):
         """
         Private slot to handle the 'Show syntax error message'
         context menu action.
-        
+
         @param line line number to show the syntax error for (integer)
         """
         if line == -1:
             line = self.line
-        
+
         for handle in list(self.syntaxerrors.keys()):
             if self.markerLine(handle) == line:
                 errors = [e[0] for e in self.syntaxerrors[handle]]
                 EricMessageBox.critical(
-                    self,
-                    self.tr("Syntax Error"),
-                    "\n".join(errors))
+                    self, self.tr("Syntax Error"), "\n".join(errors)
+                )
                 break
         else:
             EricMessageBox.critical(
                 self,
                 self.tr("Syntax Error"),
-                self.tr("No syntax error message available."))
-    
+                self.tr("No syntax error message available."),
+            )
+
     ###########################################################################
     ## VCS conflict marker handling methods below
     ###########################################################################
@@ -6461,32 +6455,32 @@
     def getVcsConflictMarkerLines(self):
         """
         Public method to determine the lines containing a VCS conflict marker.
-        
+
         @return list of line numbers containg a VCS conflict marker
         @rtype list of int
         """
         conflictMarkerLines = []
-        
-        regExp = re.compile("|".join(Editor.VcsConflictMarkerLineRegExpList),
-                            re.MULTILINE)
+
+        regExp = re.compile(
+            "|".join(Editor.VcsConflictMarkerLineRegExpList), re.MULTILINE
+        )
         matches = [m for m in regExp.finditer(self.text())]
         for match in matches:
             line, _ = self.lineIndexFromPosition(match.start())
             conflictMarkerLines.append(line)
-        
+
         return conflictMarkerLines
-    
+
     ###########################################################################
     ## Warning handling methods below
     ###########################################################################
-    
-    def toggleWarning(
-            self, line, col, warning, msg="", warningType=WarningCode):
+
+    def toggleWarning(self, line, col, warning, msg="", warningType=WarningCode):
         """
         Public method to toggle a warning indicator.
-        
+
         Note: This method is used to set pyflakes and code style warnings.
-        
+
         @param line line number of the warning
         @param col column of the warning
         @param warning flag indicating if the warning marker should be
@@ -6508,8 +6502,8 @@
             else:
                 for handle in list(self.warnings.keys()):
                     if (
-                        self.markerLine(handle) == line - 1 and
-                        warn not in self.warnings[handle]
+                        self.markerLine(handle) == line - 1
+                        and warn not in self.warnings[handle]
                     ):
                         self.warnings[handle].append(warn)
         else:
@@ -6518,28 +6512,28 @@
                     del self.warnings[handle]
                     self.markerDeleteHandle(handle)
                     self.syntaxerrorToggled.emit(self)
-        
+
         self.__setAnnotation(line - 1)
         self.__markerMap.update()
-    
+
     def getWarnings(self):
         """
         Public method to retrieve the warning markers.
-        
+
         @return sorted list of all lines containing a warning
             (list of integer)
         """
         fwlist = []
         for handle in list(self.warnings.keys()):
             fwlist.append(self.markerLine(handle) + 1)
-        
+
         fwlist.sort()
         return fwlist
-    
+
     def getWarningLines(self):
         """
         Public method to get the lines containing a warning.
-        
+
         @return list of lines containing a warning (list of integer)
         """
         lines = []
@@ -6551,15 +6545,15 @@
             else:
                 lines.append(line)
         return lines
-        
+
     def hasWarnings(self):
         """
         Public method to check for the presence of warnings.
-        
+
         @return flag indicating the presence of warnings (boolean)
         """
         return len(self.warnings) > 0
-    
+
     def nextWarning(self):
         """
         Public slot to handle the 'Next warning' context menu action.
@@ -6576,7 +6570,7 @@
         if fwline >= 0:
             self.setCursorPosition(fwline, 0)
             self.ensureLineVisible(fwline)
-    
+
     def previousWarning(self):
         """
         Public slot to handle the 'Previous warning' context menu action.
@@ -6589,28 +6583,27 @@
         fwline = self.markerFindPrevious(line, 1 << self.warning)
         if fwline < 0:
             # wrap around
-            fwline = self.markerFindPrevious(
-                self.lines() - 1, 1 << self.warning)
+            fwline = self.markerFindPrevious(self.lines() - 1, 1 << self.warning)
         if fwline >= 0:
             self.setCursorPosition(fwline, 0)
             self.ensureLineVisible(fwline)
-    
+
     def clearFlakesWarnings(self):
         """
         Public slot to clear all pyflakes warnings.
         """
         self.__clearTypedWarning(Editor.WarningCode)
-    
+
     def clearStyleWarnings(self):
         """
         Public slot to clear all style warnings.
         """
         self.__clearTypedWarning(Editor.WarningStyle)
-    
+
     def __clearTypedWarning(self, warningKind):
         """
         Private method to clear warnings of a specific kind.
-        
+
         @param warningKind kind of warning to clear (Editor.WarningCode,
             Editor.WarningStyle)
         """
@@ -6619,9 +6612,9 @@
             for msg, warningType in self.warnings[handle]:
                 if warningType == warningKind:
                     continue
-                
+
                 warnings.append((msg, warningType))
-            
+
             if warnings:
                 self.warnings[handle] = warnings
                 self.__setAnnotation(self.markerLine(handle))
@@ -6631,7 +6624,7 @@
                 self.markerDeleteHandle(handle)
         self.syntaxerrorToggled.emit(self)
         self.__markerMap.update()
-    
+
     def clearWarnings(self):
         """
         Public slot to clear all warnings.
@@ -6643,194 +6636,199 @@
         self.warnings.clear()
         self.syntaxerrorToggled.emit(self)
         self.__markerMap.update()
-    
+
     def __showWarning(self, line=-1):
         """
         Private slot to handle the 'Show warning' context menu action.
-        
+
         @param line line number to show the warning for (integer)
         """
         if line == -1:
             line = self.line
-        
+
         for handle in list(self.warnings.keys()):
             if self.markerLine(handle) == line:
                 EricMessageBox.warning(
                     self,
                     self.tr("Warning"),
-                    '\n'.join([w[0] for w in self.warnings[handle]]))
+                    "\n".join([w[0] for w in self.warnings[handle]]),
+                )
                 break
         else:
             EricMessageBox.warning(
-                self,
-                self.tr("Warning"),
-                self.tr("No warning messages available."))
-    
+                self, self.tr("Warning"), self.tr("No warning messages available.")
+            )
+
     ###########################################################################
     ## Annotation handling methods below
     ###########################################################################
-    
+
     def __setAnnotationStyles(self):
         """
         Private slot to define the style used by inline annotations.
         """
         if hasattr(QsciScintilla, "annotate"):
-            self.annotationWarningStyle = (
-                QsciScintilla.STYLE_LASTPREDEFINED + 1
-            )
+            self.annotationWarningStyle = QsciScintilla.STYLE_LASTPREDEFINED + 1
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETFORE,
                 self.annotationWarningStyle,
-                Preferences.getEditorColour("AnnotationsWarningForeground"))
+                Preferences.getEditorColour("AnnotationsWarningForeground"),
+            )
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETBACK,
                 self.annotationWarningStyle,
-                Preferences.getEditorColour("AnnotationsWarningBackground"))
-            
+                Preferences.getEditorColour("AnnotationsWarningBackground"),
+            )
+
             self.annotationErrorStyle = self.annotationWarningStyle + 1
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETFORE,
                 self.annotationErrorStyle,
-                Preferences.getEditorColour("AnnotationsErrorForeground"))
+                Preferences.getEditorColour("AnnotationsErrorForeground"),
+            )
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETBACK,
                 self.annotationErrorStyle,
-                Preferences.getEditorColour("AnnotationsErrorBackground"))
-            
+                Preferences.getEditorColour("AnnotationsErrorBackground"),
+            )
+
             self.annotationStyleStyle = self.annotationErrorStyle + 1
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETFORE,
                 self.annotationStyleStyle,
-                Preferences.getEditorColour("AnnotationsStyleForeground"))
+                Preferences.getEditorColour("AnnotationsStyleForeground"),
+            )
             self.SendScintilla(
                 QsciScintilla.SCI_STYLESETBACK,
                 self.annotationStyleStyle,
-                Preferences.getEditorColour("AnnotationsStyleBackground"))
-        
+                Preferences.getEditorColour("AnnotationsStyleBackground"),
+            )
+
     def __setAnnotation(self, line):
         """
         Private method to set the annotations for the given line.
-        
+
         @param line number of the line that needs annotation (integer)
         """
         if hasattr(QsciScintilla, "annotate"):
             warningAnnotations = []
             errorAnnotations = []
             styleAnnotations = []
-            
+
             # step 1: do warnings
             for handle in self.warnings:
                 if self.markerLine(handle) == line:
                     for msg, warningType in self.warnings[handle]:
                         if warningType == self.WarningStyle:
-                            styleAnnotations.append(
-                                self.tr("Style: {0}").format(msg))
+                            styleAnnotations.append(self.tr("Style: {0}").format(msg))
                         else:
                             warningAnnotations.append(
-                                self.tr("Warning: {0}").format(msg))
-            
+                                self.tr("Warning: {0}").format(msg)
+                            )
+
             # step 2: do syntax errors
             for handle in self.syntaxerrors:
                 if self.markerLine(handle) == line:
                     for msg, _ in self.syntaxerrors[handle]:
-                        errorAnnotations.append(
-                            self.tr("Error: {0}").format(msg))
-            
+                        errorAnnotations.append(self.tr("Error: {0}").format(msg))
+
             annotations = []
             if styleAnnotations:
                 annotationStyleTxt = "\n".join(styleAnnotations)
                 if warningAnnotations or errorAnnotations:
                     annotationStyleTxt += "\n"
-                annotations.append(QsciStyledText(
-                    annotationStyleTxt, self.annotationStyleStyle))
-            
+                annotations.append(
+                    QsciStyledText(annotationStyleTxt, self.annotationStyleStyle)
+                )
+
             if warningAnnotations:
                 annotationWarningTxt = "\n".join(warningAnnotations)
                 if errorAnnotations:
                     annotationWarningTxt += "\n"
-                annotations.append(QsciStyledText(
-                    annotationWarningTxt, self.annotationWarningStyle))
-            
+                annotations.append(
+                    QsciStyledText(annotationWarningTxt, self.annotationWarningStyle)
+                )
+
             if errorAnnotations:
                 annotationErrorTxt = "\n".join(errorAnnotations)
-                annotations.append(QsciStyledText(
-                    annotationErrorTxt, self.annotationErrorStyle))
-            
+                annotations.append(
+                    QsciStyledText(annotationErrorTxt, self.annotationErrorStyle)
+                )
+
             if annotations:
                 self.annotate(line, annotations)
             else:
                 self.clearAnnotations(line)
-    
+
     def __refreshAnnotations(self):
         """
         Private method to refresh the annotations.
         """
         if hasattr(QsciScintilla, "annotate"):
             self.clearAnnotations()
-            for handle in (
-                list(self.warnings.keys()) +
-                list(self.syntaxerrors.keys())
-            ):
+            for handle in list(self.warnings.keys()) + list(self.syntaxerrors.keys()):
                 line = self.markerLine(handle)
                 self.__setAnnotation(line)
-    
+
     #################################################################
     ## Fold handling methods
     #################################################################
-    
+
     def toggleCurrentFold(self):
         """
         Public slot to toggle the fold containing the current line.
         """
         line, index = self.getCursorPosition()
         self.foldLine(line)
-    
+
     def expandFoldWithChildren(self, line=-1):
         """
         Public slot to expand the current fold including its children.
-        
+
         @param line number of line to be expanded
         @type int
         """
         if line == -1:
             line, index = self.getCursorPosition()
-        
-        self.SendScintilla(QsciScintilla.SCI_FOLDCHILDREN, line,
-                           QsciScintilla.SC_FOLDACTION_EXPAND)
-    
+
+        self.SendScintilla(
+            QsciScintilla.SCI_FOLDCHILDREN, line, QsciScintilla.SC_FOLDACTION_EXPAND
+        )
+
     def collapseFoldWithChildren(self, line=-1):
         """
         Public slot to collapse the current fold including its children.
-        
+
         @param line number of line to be expanded
         @type int
         """
         if line == -1:
             line, index = self.getCursorPosition()
-        
-        self.SendScintilla(QsciScintilla.SCI_FOLDCHILDREN, line,
-                           QsciScintilla.SC_FOLDACTION_CONTRACT)
-    
+
+        self.SendScintilla(
+            QsciScintilla.SCI_FOLDCHILDREN, line, QsciScintilla.SC_FOLDACTION_CONTRACT
+        )
+
     def __contextMenuExpandFoldWithChildren(self):
         """
         Private slot to handle the context menu expand with children action.
         """
         self.expandFoldWithChildren(self.line)
-    
+
     def __contextMenuCollapseFoldWithChildren(self):
         """
         Private slot to handle the context menu collapse with children action.
         """
         self.collapseFoldWithChildren(self.line)
-    
+
     #################################################################
     ## Macro handling methods
     #################################################################
-    
+
     def __getMacroName(self):
         """
         Private method to select a macro name from the list of macros.
-        
+
         @return Tuple of macro name and a flag, indicating, if the user
             pressed ok or canceled the operation. (string, boolean)
         """
@@ -6839,12 +6837,9 @@
             qs.append(s)
         qs.sort()
         return QInputDialog.getItem(
-            self,
-            self.tr("Macro Name"),
-            self.tr("Select a macro name:"),
-            qs,
-            0, False)
-        
+            self, self.tr("Macro Name"), self.tr("Select a macro name:"), qs, 0, False
+        )
+
     def macroRun(self):
         """
         Public method to execute a macro.
@@ -6852,7 +6847,7 @@
         name, ok = self.__getMacroName()
         if ok and name:
             self.macros[name].play()
-        
+
     def macroDelete(self):
         """
         Public method to delete a macro.
@@ -6860,7 +6855,7 @@
         name, ok = self.__getMacroName()
         if ok and name:
             del self.macros[name]
-        
+
     def macroLoad(self):
         """
         Public method to load a macro from a file.
@@ -6870,11 +6865,12 @@
             self,
             self.tr("Load macro file"),
             configDir,
-            self.tr("Macro files (*.macro)"))
-        
+            self.tr("Macro files (*.macro)"),
+        )
+
         if not fname:
             return  # user aborted
-        
+
         try:
             with open(fname, "r", encoding="utf-8") as f:
                 lines = f.readlines()
@@ -6882,43 +6878,45 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Error loading macro"),
-                self.tr(
-                    "<p>The macro file <b>{0}</b> could not be read.</p>")
-                .format(fname))
+                self.tr("<p>The macro file <b>{0}</b> could not be read.</p>").format(
+                    fname
+                ),
+            )
             return
-        
+
         if len(lines) != 2:
             EricMessageBox.critical(
                 self,
                 self.tr("Error loading macro"),
-                self.tr("<p>The macro file <b>{0}</b> is corrupt.</p>")
-                .format(fname))
+                self.tr("<p>The macro file <b>{0}</b> is corrupt.</p>").format(fname),
+            )
             return
-        
+
         macro = QsciMacro(lines[1], self)
         self.macros[lines[0].strip()] = macro
-        
+
     def macroSave(self):
         """
         Public method to save a macro to a file.
         """
         configDir = Utilities.getConfigDir()
-        
+
         name, ok = self.__getMacroName()
         if not ok or not name:
             return  # user abort
-        
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save macro file"),
             configDir,
             self.tr("Macro files (*.macro)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return  # user aborted
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -6928,12 +6926,14 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save macro"),
-                self.tr("<p>The macro file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The macro file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         try:
             with fpath.open("w", encoding="utf-8") as f:
                 f.write("{0}{1}".format(name, "\n"))
@@ -6943,10 +6943,11 @@
                 self,
                 self.tr("Error saving macro"),
                 self.tr(
-                    "<p>The macro file <b>{0}</b> could not be written.</p>")
-                .format(fpath))
+                    "<p>The macro file <b>{0}</b> could not be written.</p>"
+                ).format(fpath),
+            )
             return
-        
+
     def macroRecordingStart(self):
         """
         Public method to start macro recording.
@@ -6957,42 +6958,44 @@
                 self.tr("Start Macro Recording"),
                 self.tr("Macro recording is already active. Start new?"),
                 icon=EricMessageBox.Warning,
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.macroRecordingStop()
             else:
                 return
         else:
             self.recording = True
-        
+
         self.curMacro = QsciMacro(self)
         self.curMacro.startRecording()
-        
+
     def macroRecordingStop(self):
         """
         Public method to stop macro recording.
         """
         if not self.recording:
-            return      # we are not recording
-        
+            return  # we are not recording
+
         self.curMacro.endRecording()
         self.recording = False
-        
+
         name, ok = QInputDialog.getText(
             self,
             self.tr("Macro Recording"),
             self.tr("Enter name of the macro:"),
-            QLineEdit.EchoMode.Normal)
-        
+            QLineEdit.EchoMode.Normal,
+        )
+
         if ok and name:
             self.macros[name] = self.curMacro
-        
+
         self.curMacro = None
-        
+
     #################################################################
     ## Overwritten methods
     #################################################################
-    
+
     def undo(self):
         """
         Public method to undo the last recorded change.
@@ -7000,7 +7003,7 @@
         super().undo()
         self.undoAvailable.emit(self.isUndoAvailable())
         self.redoAvailable.emit(self.isRedoAvailable())
-        
+
     def redo(self):
         """
         Public method to redo the last recorded change.
@@ -7008,109 +7011,106 @@
         super().redo()
         self.undoAvailable.emit(self.isUndoAvailable())
         self.redoAvailable.emit(self.isRedoAvailable())
-        
+
     def close(self, alsoDelete=False):
         """
         Public method called when the window gets closed.
-        
+
         This overwritten method redirects the action to our
         ViewManager.closeEditor, which in turn calls our closeIt
         method.
-        
+
         @param alsoDelete ignored
         @return flag indicating a successful close of the editor (boolean)
         """
         return self.vm.closeEditor(self)
-        
+
     def closeIt(self):
         """
         Public method called by the viewmanager to finally get rid of us.
         """
         if Preferences.getEditor("ClearBreaksOnClose") and not self.__clones:
             self.__menuClearBreakpoints()
-        
+
         for clone in self.__clones[:]:
             self.removeClone(clone)
             clone.removeClone(self)
-        
-        self.breakpointModel.rowsAboutToBeRemoved.disconnect(
-            self.__deleteBreakPoints)
+
+        self.breakpointModel.rowsAboutToBeRemoved.disconnect(self.__deleteBreakPoints)
         self.breakpointModel.dataAboutToBeChanged.disconnect(
-            self.__breakPointDataAboutToBeChanged)
-        self.breakpointModel.dataChanged.disconnect(
-            self.__changeBreakPoints)
-        self.breakpointModel.rowsInserted.disconnect(
-            self.__addBreakPoints)
-        
+            self.__breakPointDataAboutToBeChanged
+        )
+        self.breakpointModel.dataChanged.disconnect(self.__changeBreakPoints)
+        self.breakpointModel.rowsInserted.disconnect(self.__addBreakPoints)
+
         if self.syntaxCheckService is not None:
             self.syntaxCheckService.syntaxChecked.disconnect(
-                self.__processSyntaxCheckResult)
-            self.syntaxCheckService.error.disconnect(
-                self.__processSyntaxCheckError)
-        
+                self.__processSyntaxCheckResult
+            )
+            self.syntaxCheckService.error.disconnect(self.__processSyntaxCheckError)
+
         if self.spell:
             self.spell.stopIncrementalCheck()
-        
+
         with contextlib.suppress(TypeError):
             self.project.projectPropertiesChanged.disconnect(
-                self.__projectPropertiesChanged)
-        
+                self.__projectPropertiesChanged
+            )
+
         if self.fileName:
             self.taskViewer.clearFileTasks(self.fileName, True)
-        
+
         super().close()
-        
+
     def keyPressEvent(self, ev):
         """
         Protected method to handle the user input a key at a time.
-        
+
         @param ev key event
         @type QKeyEvent
         """
+
         def encloseSelectedText(encString):
             """
             Local function to enclose the current selection with some
             characters.
-            
+
             @param encString string to use to enclose the selection
                 (one or two characters)
             @type str
             """
             startChar = encString[0]
             endChar = encString[1] if len(encString) == 2 else startChar
-            
+
             sline, sindex, eline, eindex = self.getSelection()
             replaceText = startChar + self.selectedText() + endChar
             self.beginUndoAction()
             self.replaceSelectedText(replaceText)
             self.endUndoAction()
             self.setSelection(sline, sindex + 1, eline, eindex + 1)
-        
+
         txt = ev.text()
-        
+
         # See it is text to insert.
         if len(txt) and txt >= " ":
-            if (
-                self.hasSelectedText() and
-                txt in Editor.EncloseChars
-            ):
+            if self.hasSelectedText() and txt in Editor.EncloseChars:
                 encloseSelectedText(Editor.EncloseChars[txt])
                 ev.accept()
                 return
-            
+
             super().keyPressEvent(ev)
         else:
             ev.ignore()
-        
+
     def focusInEvent(self, event):
         """
         Protected method called when the editor receives focus.
-        
+
         This method checks for modifications of the current file and
         rereads it upon request. The cursor is placed at the current position
         assuming, that it is in the vicinity of the old position after the
         reread.
-        
+
         @param event the event object
         @type QFocusEvent
         """
@@ -7124,10 +7124,11 @@
             self.setCaretWidth(self.caretWidth)
         self.__updateReadOnly(False)
         if (
-            self.vm.editorsCheckFocusInEnabled() and
-            not self.inReopenPrompt and self.fileName and
-            pathlib.Path(self.fileName).exists() and
-            pathlib.Path(self.fileName).stat().st_mtime != self.lastModified
+            self.vm.editorsCheckFocusInEnabled()
+            and not self.inReopenPrompt
+            and self.fileName
+            and pathlib.Path(self.fileName).exists()
+            and pathlib.Path(self.fileName).stat().st_mtime != self.lastModified
         ):
             self.inReopenPrompt = True
             if Preferences.getEditor("AutoReopen") and not self.isModified():
@@ -7141,72 +7142,70 @@
                 if self.isModified():
                     msg += self.tr(
                         """<br><b>Warning:</b> You will lose"""
-                        """ your changes upon reopening it.""")
+                        """ your changes upon reopening it."""
+                    )
                     yesDefault = False
                 res = EricMessageBox.yesNo(
                     self,
-                    self.tr("File changed"), msg,
+                    self.tr("File changed"),
+                    msg,
                     icon=EricMessageBox.Warning,
-                    yesDefault=yesDefault)
+                    yesDefault=yesDefault,
+                )
                 if res:
                     self.refresh()
                 else:
                     # do not prompt for this change again...
-                    self.lastModified = (
-                        pathlib.Path(self.fileName).stat().st_mtime
-                    )
+                    self.lastModified = pathlib.Path(self.fileName).stat().st_mtime
             self.inReopenPrompt = False
-        
+
         self.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         super().focusInEvent(event)
-        
+
     def focusOutEvent(self, event):
         """
         Protected method called when the editor loses focus.
-        
+
         @param event the event object
         @type QFocusEvent
         """
         self.vm.editorActGrp.setEnabled(False)
         self.setCaretWidth(0)
-        
+
         self.cancelCallTips()
-        
+
         super().focusOutEvent(event)
-        
+
     def changeEvent(self, evt):
         """
         Protected method called to process an event.
-        
+
         This implements special handling for the events showMaximized,
         showMinimized and showNormal. The windows caption is shortened
         for the minimized mode and reset to the full filename for the
         other modes. This is to make the editor windows work nicer
         with the QWorkspace.
-        
+
         @param evt the event, that was generated
         @type QEvent
         """
-        if (
-            evt.type() == QEvent.Type.WindowStateChange and
-            bool(self.fileName)
-        ):
+        if evt.type() == QEvent.Type.WindowStateChange and bool(self.fileName):
             cap = (
                 os.path.basename(self.fileName)
-                if self.windowState() == Qt.WindowState.WindowMinimized else
-                self.fileName
+                if self.windowState() == Qt.WindowState.WindowMinimized
+                else self.fileName
             )
             if self.isReadOnly():
                 cap = self.tr("{0} (ro)").format(cap)
             self.setWindowTitle(cap)
-        
+
         super().changeEvent(evt)
-        
+
     def mousePressEvent(self, event):
         """
         Protected method to handle the mouse press event.
-        
+
         @param event the mouse press event
         @type QMouseEvent
         """
@@ -7216,12 +7215,9 @@
         elif event.button() == Qt.MouseButton.XButton2:
             self.redo()
             event.accept()
-        elif (
-            event.button() == Qt.MouseButton.LeftButton and
-            bool(event.modifiers() & (
-                Qt.KeyboardModifier.MetaModifier |
-                Qt.KeyboardModifier.AltModifier
-            ))
+        elif event.button() == Qt.MouseButton.LeftButton and bool(
+            event.modifiers()
+            & (Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.AltModifier)
         ):
             line, index = self.lineIndexFromPoint(event.position().toPoint())
             self.addCursor(line, index)
@@ -7229,22 +7225,22 @@
         else:
             self.vm.eventFilter(self, event)
             super().mousePressEvent(event)
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double click events.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         super().mouseDoubleClickEvent(evt)
-        
+
         self.mouseDoubleClick.emit(evt.position().toPoint(), evt.buttons())
-        
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event
         @type QWheelEvent
         """
@@ -7256,7 +7252,7 @@
                 self.zoomIn()
             evt.accept()
             return
-        
+
         if evt.modifiers() & Qt.KeyboardModifier.ShiftModifier:
             if delta < 0:
                 self.gotoMethodClass(False)
@@ -7264,13 +7260,13 @@
                 self.gotoMethodClass(True)
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating, if the event was handled
@@ -7279,13 +7275,13 @@
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -7304,21 +7300,21 @@
                     pinch.setTotalScaleFactor(3.0)
                 self.zoomTo(zoom)
             evt.accept()
-    
+
     def resizeEvent(self, evt):
         """
         Protected method handling resize events.
-        
+
         @param evt reference to the resize event
         @type QResizeEvent
         """
         super().resizeEvent(evt)
         self.__markerMap.calculateGeometry()
-    
+
     def viewportEvent(self, evt):
         """
         Protected method handling event of the viewport.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indiating that the event was handled
@@ -7327,11 +7323,11 @@
         with contextlib.suppress(AttributeError):
             self.__markerMap.calculateGeometry()
         return super().viewportEvent(evt)
-    
+
     def __updateReadOnly(self, bForce=True):
         """
         Private method to update the readOnly information for this editor.
-        
+
         If bForce is True, then updates everything regardless if
         the attributes have actually changed, such as during
         initialization time.  A signal is emitted after the
@@ -7342,48 +7338,45 @@
         """
         if self.fileName == "":
             return
-        
-        readOnly = (
-            not os.access(self.fileName, os.W_OK) or
-            self.isReadOnly()
-        )
+
+        readOnly = not os.access(self.fileName, os.W_OK) or self.isReadOnly()
         if not bForce and (readOnly == self.isReadOnly()):
             return
-        
+
         cap = self.fileName
         if readOnly:
             cap = self.tr("{0} (ro)".format(cap))
         self.setReadOnly(readOnly)
         self.setWindowTitle(cap)
         self.captionChanged.emit(cap, self)
-        
+
     def refresh(self):
         """
         Public slot to refresh the editor contents.
         """
         # save cursor position
         cline, cindex = self.getCursorPosition()
-        
+
         # save bookmarks and breakpoints and clear them
         bmlist = self.getBookmarks()
         self.clearBookmarks()
-        
+
         # clear syntax error markers
         self.clearSyntaxError()
-        
+
         # clear flakes warning markers
         self.clearWarnings()
-        
+
         # clear breakpoint markers
         for handle in list(self.breaks.keys()):
             self.markerDeleteHandle(handle)
         self.breaks.clear()
-        
+
         if not os.path.exists(self.fileName):
             # close the file, if it was deleted in the background
             self.close()
             return
-        
+
         # reread the file
         try:
             self.readFile(self.fileName)
@@ -7392,31 +7385,31 @@
             self.lastModified = QDateTime.currentDateTime()
         self.setModified(False)
         self.__convertTabs()
-        
+
         # re-initialize the online change tracer
         self.__reinitOnlineChangeTrace()
-        
+
         # reset cursor position
         self.setCursorPosition(cline, cindex)
         self.ensureCursorVisible()
-        
+
         # reset bookmarks and breakpoints to their old position
         if bmlist:
             for bm in bmlist:
                 self.toggleBookmark(bm)
         self.__restoreBreakpoints()
-        
+
         self.editorSaved.emit(self.fileName)
         self.checkSyntax()
-        
+
         self.__markerMap.update()
-        
+
         self.refreshed.emit()
-        
+
     def setMonospaced(self, on):
         """
         Public method to set/reset a monospaced font.
-        
+
         @param on flag to indicate usage of a monospace font (boolean)
         """
         if on:
@@ -7428,9 +7421,9 @@
                 self.clearStyles()
                 self.__setMarginsDisplay()
             self.setFont(Preferences.getEditorOtherFonts("DefaultFont"))
-        
+
         self.useMonospaced = on
-    
+
     def clearStyles(self):
         """
         Public method to set the styles according the selected Qt style
@@ -7440,15 +7433,15 @@
         if Preferences.getEditor("OverrideEditAreaColours"):
             self.setColor(Preferences.getEditorColour("EditAreaForeground"))
             self.setPaper(Preferences.getEditorColour("EditAreaBackground"))
-    
+
     #################################################################
     ## Drag and Drop Support
     #################################################################
-    
+
     def dragEnterEvent(self, event):
         """
         Protected method to handle the drag enter event.
-        
+
         @param event the drag enter event (QDragEnterEvent)
         """
         self.inDragDrop = event.mimeData().hasUrls()
@@ -7456,22 +7449,22 @@
             event.acceptProposedAction()
         else:
             super().dragEnterEvent(event)
-        
+
     def dragMoveEvent(self, event):
         """
         Protected method to handle the drag move event.
-        
+
         @param event the drag move event (QDragMoveEvent)
         """
         if self.inDragDrop:
             event.accept()
         else:
             super().dragMoveEvent(event)
-        
+
     def dragLeaveEvent(self, event):
         """
         Protected method to handle the drag leave event.
-        
+
         @param event the drag leave event (QDragLeaveEvent)
         """
         if self.inDragDrop:
@@ -7479,11 +7472,11 @@
             event.accept()
         else:
             super().dragLeaveEvent(event)
-        
+
     def dropEvent(self, event):
         """
         Protected method to handle the drop event.
-        
+
         @param event the drop event (QDropEvent)
         """
         if event.mimeData().hasUrls():
@@ -7496,77 +7489,70 @@
                         EricMessageBox.information(
                             self,
                             self.tr("Drop Error"),
-                            self.tr("""<p><b>{0}</b> is not a file.</p>""")
-                            .format(fname))
+                            self.tr("""<p><b>{0}</b> is not a file.</p>""").format(
+                                fname
+                            ),
+                        )
             event.acceptProposedAction()
         else:
             super().dropEvent(event)
-        
+
         self.inDragDrop = False
-    
+
     #################################################################
     ## Support for Qt resources files
     #################################################################
-    
+
     def __initContextMenuResources(self):
         """
         Private method used to setup the Resources context sub menu.
-        
+
         @return reference to the generated menu (QMenu)
         """
-        menu = QMenu(self.tr('Resources'))
-        
-        menu.addAction(
-            self.tr('Add file...'), self.__addFileResource)
-        menu.addAction(
-            self.tr('Add files...'), self.__addFileResources)
+        menu = QMenu(self.tr("Resources"))
+
+        menu.addAction(self.tr("Add file..."), self.__addFileResource)
+        menu.addAction(self.tr("Add files..."), self.__addFileResources)
+        menu.addAction(self.tr("Add aliased file..."), self.__addFileAliasResource)
         menu.addAction(
-            self.tr('Add aliased file...'),
-            self.__addFileAliasResource)
-        menu.addAction(
-            self.tr('Add localized resource...'),
-            self.__addLocalizedResource)
+            self.tr("Add localized resource..."), self.__addLocalizedResource
+        )
         menu.addSeparator()
-        menu.addAction(
-            self.tr('Add resource frame'), self.__addResourceFrame)
-        
+        menu.addAction(self.tr("Add resource frame"), self.__addResourceFrame)
+
         menu.aboutToShow.connect(self.__showContextMenuResources)
-        
+
         return menu
-        
+
     def __showContextMenuResources(self):
         """
         Private slot handling the aboutToShow signal of the resources context
         menu.
         """
         self.showMenu.emit("Resources", self.resourcesMenu, self)
-        
+
     def __addFileResource(self):
         """
         Private method to handle the Add file context menu action.
         """
         dirStr = os.path.dirname(self.fileName)
         file = EricFileDialog.getOpenFileName(
-            self,
-            self.tr("Add file resource"),
-            dirStr,
-            "")
+            self, self.tr("Add file resource"), dirStr, ""
+        )
         if file:
             relFile = QDir(dirStr).relativeFilePath(file)
             line, index = self.getCursorPosition()
             self.insert("  <file>{0}</file>\n".format(relFile))
             self.setCursorPosition(line + 1, index)
-        
+
     def __addFileResources(self):
         """
         Private method to handle the Add files context menu action.
         """
         dirStr = os.path.dirname(self.fileName)
         files = EricFileDialog.getOpenFileNames(
-            self,
-            self.tr("Add file resources"),
-            dirStr,
-            "")
+            self, self.tr("Add file resources"), dirStr, ""
+        )
         if files:
             myDir = QDir(dirStr)
             filesText = ""
@@ -7576,17 +7562,15 @@
             line, index = self.getCursorPosition()
             self.insert(filesText)
             self.setCursorPosition(line + len(files), index)
-        
+
     def __addFileAliasResource(self):
         """
         Private method to handle the Add aliased file context menu action.
         """
         dirStr = os.path.dirname(self.fileName)
         file = EricFileDialog.getOpenFileName(
-            self,
-            self.tr("Add aliased file resource"),
-            dirStr,
-            "")
+            self, self.tr("Add aliased file resource"), dirStr, ""
+        )
         if file:
             relFile = QDir(dirStr).relativeFilePath(file)
             alias, ok = QInputDialog.getText(
@@ -7594,126 +7578,147 @@
                 self.tr("Add aliased file resource"),
                 self.tr("Alias for file <b>{0}</b>:").format(relFile),
                 QLineEdit.EchoMode.Normal,
-                relFile)
+                relFile,
+            )
             if ok and alias:
                 line, index = self.getCursorPosition()
-                self.insert('  <file alias="{1}">{0}</file>\n'
-                            .format(relFile, alias))
+                self.insert('  <file alias="{1}">{0}</file>\n'.format(relFile, alias))
                 self.setCursorPosition(line + 1, index)
-        
+
     def __addLocalizedResource(self):
         """
         Private method to handle the Add localized resource context menu
         action.
         """
         from Project.AddLanguageDialog import AddLanguageDialog
+
         dlg = AddLanguageDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             lang = dlg.getSelectedLanguage()
             line, index = self.getCursorPosition()
             self.insert('<qresource lang="{0}">\n</qresource>\n'.format(lang))
             self.setCursorPosition(line + 2, index)
-        
+
     def __addResourceFrame(self):
         """
         Private method to handle the Add resource frame context menu action.
         """
         line, index = self.getCursorPosition()
-        self.insert('<!DOCTYPE RCC>\n'
-                    '<RCC version="1.0">\n'
-                    '<qresource>\n'
-                    '</qresource>\n'
-                    '</RCC>\n')
+        self.insert(
+            "<!DOCTYPE RCC>\n"
+            '<RCC version="1.0">\n'
+            "<qresource>\n"
+            "</qresource>\n"
+            "</RCC>\n"
+        )
         self.setCursorPosition(line + 5, index)
-    
+
     #################################################################
     ## Support for diagrams below
     #################################################################
-    
+
     def __showClassDiagram(self):
         """
         Private method to handle the Class Diagram context menu action.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         if not self.checkDirty():
             return
-        
+
         self.classDiagram = UMLDialog(
-            UMLDialogType.CLASS_DIAGRAM, self.project, self.fileName,
-            self, noAttrs=False)
+            UMLDialogType.CLASS_DIAGRAM,
+            self.project,
+            self.fileName,
+            self,
+            noAttrs=False,
+        )
         self.classDiagram.show()
-        
+
     def __showPackageDiagram(self):
         """
         Private method to handle the Package Diagram context menu action.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         if not self.checkDirty():
             return
-        
+
         package = (
-            os.path.isdir(self.fileName) and
-            self.fileName or os.path.dirname(self.fileName)
+            os.path.isdir(self.fileName)
+            and self.fileName
+            or os.path.dirname(self.fileName)
         )
         res = EricMessageBox.yesNo(
             self,
             self.tr("Package Diagram"),
             self.tr("""Include class attributes?"""),
-            yesDefault=True)
+            yesDefault=True,
+        )
         self.packageDiagram = UMLDialog(
-            UMLDialogType.PACKAGE_DIAGRAM, self.project, package,
-            self, noAttrs=not res)
+            UMLDialogType.PACKAGE_DIAGRAM, self.project, package, self, noAttrs=not res
+        )
         self.packageDiagram.show()
-        
+
     def __showImportsDiagram(self):
         """
         Private method to handle the Imports Diagram context menu action.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         if not self.checkDirty():
             return
-        
+
         package = os.path.dirname(self.fileName)
         res = EricMessageBox.yesNo(
             self,
             self.tr("Imports Diagram"),
-            self.tr("""Include imports from external modules?"""))
+            self.tr("""Include imports from external modules?"""),
+        )
         self.importsDiagram = UMLDialog(
-            UMLDialogType.IMPORTS_DIAGRAM, self.project, package,
-            self, showExternalImports=res)
+            UMLDialogType.IMPORTS_DIAGRAM,
+            self.project,
+            package,
+            self,
+            showExternalImports=res,
+        )
         self.importsDiagram.show()
-        
+
     def __showApplicationDiagram(self):
         """
         Private method to handle the Imports Diagram context menu action.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         res = EricMessageBox.yesNo(
             self,
             self.tr("Application Diagram"),
             self.tr("""Include module names?"""),
-            yesDefault=True)
+            yesDefault=True,
+        )
         self.applicationDiagram = UMLDialog(
-            UMLDialogType.APPLICATION_DIAGRAM, self.project,
-            self, noModules=not res)
+            UMLDialogType.APPLICATION_DIAGRAM, self.project, self, noModules=not res
+        )
         self.applicationDiagram.show()
-    
+
     def __loadDiagram(self):
         """
         Private slot to load a diagram from file.
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         self.loadedDiagram = UMLDialog(
-            UMLDialogType.NO_DIAGRAM, self.project, parent=self)
+            UMLDialogType.NO_DIAGRAM, self.project, parent=self
+        )
         if self.loadedDiagram.load():
             self.loadedDiagram.show(fromFile=True)
         else:
             self.loadedDiagram = None
-    
+
     #######################################################################
     ## Typing aids related methods below
     #######################################################################
-    
+
     def __toggleTypingAids(self):
         """
         Private slot to toggle the typing aids.
@@ -7722,15 +7727,15 @@
             self.completer.setEnabled(True)
         else:
             self.completer.setEnabled(False)
-    
+
     #######################################################################
     ## Auto-completing templates
     #######################################################################
-    
+
     def editorCommand(self, cmd):
         """
         Public method to perform a simple editor command.
-        
+
         @param cmd the scintilla command to be performed
         """
         if cmd == QsciScintilla.SCI_TAB:
@@ -7739,43 +7744,45 @@
             except KeyError:
                 # template viewer is not active
                 templateViewer = None
-            
+
             if templateViewer is not None:
                 line, index = self.getCursorPosition()
                 tmplName = self.getWordLeft(line, index)
                 if tmplName:
-                    if templateViewer.hasTemplate(tmplName,
-                                                  self.getLanguage()):
+                    if templateViewer.hasTemplate(tmplName, self.getLanguage()):
                         self.__applyTemplate(tmplName, self.getLanguage())
                         return
                     else:
                         templateNames = templateViewer.getTemplateNames(
-                            tmplName, self.getLanguage())
+                            tmplName, self.getLanguage()
+                        )
                         if len(templateNames) == 1:
-                            self.__applyTemplate(templateNames[0],
-                                                 self.getLanguage())
+                            self.__applyTemplate(templateNames[0], self.getLanguage())
                             return
                         elif len(templateNames) > 1:
                             self.showUserList(
                                 TemplateCompletionListID,
-                                ["{0}?{1:d}".format(t, self.TemplateImageID)
-                                 for t in templateNames])
+                                [
+                                    "{0}?{1:d}".format(t, self.TemplateImageID)
+                                    for t in templateNames
+                                ],
+                            )
                             return
-        
+
         elif cmd == QsciScintilla.SCI_DELETEBACK:
             line, index = self.getCursorPosition()
-            text = self.text(line)[index - 1:index + 1]
-            matchingPairs = ['()', '[]', '{}', '<>', "''", '""']
+            text = self.text(line)[index - 1 : index + 1]
+            matchingPairs = ["()", "[]", "{}", "<>", "''", '""']
             # __IGNORE_WARNING_M613__
             if text in matchingPairs:
                 self.delete()
-        
+
         super().editorCommand(cmd)
-    
+
     def __applyTemplate(self, templateName, language):
         """
         Private method to apply a template by name.
-        
+
         @param templateName name of the template to apply (string)
         @param language name of the language (group) to get the template
             from (string)
@@ -7785,84 +7792,83 @@
         except KeyError:
             # template viewer is not active
             return
-        
+
         if templateViewer.hasTemplate(templateName, self.getLanguage()):
             self.extendSelectionWordLeft()
-            templateViewer.applyNamedTemplate(templateName,
-                                              self.getLanguage())
-    
+            templateViewer.applyNamedTemplate(templateName, self.getLanguage())
+
     #######################################################################
     ## Project related methods
     #######################################################################
-    
+
     def __projectPropertiesChanged(self):
         """
         Private slot to handle changes of the project properties.
         """
         if self.spell:
             pwl, pel = self.project.getProjectDictionaries()
-            self.__setSpellingLanguage(self.project.getProjectSpellLanguage(),
-                                       pwl=pwl, pel=pel)
-        
+            self.__setSpellingLanguage(
+                self.project.getProjectSpellLanguage(), pwl=pwl, pel=pel
+            )
+
         editorConfigEol = self.__getEditorConfig("EOLMode", nodefault=True)
         if editorConfigEol is not None:
             self.setEolMode(editorConfigEol)
         else:
             self.setEolModeByEolString(self.project.getEolString())
         self.convertEols(self.eolMode())
-    
+
     def addedToProject(self):
         """
         Public method to signal, that this editor has been added to a project.
         """
         if self.spell:
             pwl, pel = self.project.getProjectDictionaries()
-            self.__setSpellingLanguage(self.project.getProjectSpellLanguage(),
-                                       pwl=pwl, pel=pel)
-        
-        self.project.projectPropertiesChanged.connect(
-            self.__projectPropertiesChanged)
-    
+            self.__setSpellingLanguage(
+                self.project.getProjectSpellLanguage(), pwl=pwl, pel=pel
+            )
+
+        self.project.projectPropertiesChanged.connect(self.__projectPropertiesChanged)
+
     def projectOpened(self):
         """
         Public slot to handle the opening of a project.
         """
-        if (
-            self.fileName and
-            self.project.isProjectSource(self.fileName)
-        ):
+        if self.fileName and self.project.isProjectSource(self.fileName):
             self.project.projectPropertiesChanged.connect(
-                self.__projectPropertiesChanged)
+                self.__projectPropertiesChanged
+            )
             self.setSpellingForProject()
-    
+
     def projectClosed(self):
         """
         Public slot to handle the closing of a project.
         """
         with contextlib.suppress(TypeError):
             self.project.projectPropertiesChanged.disconnect(
-                self.__projectPropertiesChanged)
-    
+                self.__projectPropertiesChanged
+            )
+
     #######################################################################
     ## Spell checking related methods
     #######################################################################
-    
+
     def getSpellingLanguage(self):
         """
         Public method to get the current spelling language.
-        
+
         @return current spelling language
         @rtype str
         """
         if self.spell:
             return self.spell.getLanguage()
-        
+
         return ""
-    
+
     def __setSpellingLanguage(self, language, pwl="", pel=""):
         """
         Private slot to set the spell checking language.
-        
+
         @param language spell checking language to be set (string)
         @param pwl name of the personal/project word list (string)
         @param pel name of the personal/project exclude list (string)
@@ -7870,21 +7876,24 @@
         if self.spell and self.spell.getLanguage() != language:
             self.spell.setLanguage(language, pwl=pwl, pel=pel)
             self.spell.checkDocumentIncrementally()
-    
+
     def __setSpelling(self):
         """
         Private method to initialize the spell checking functionality.
         """
         if Preferences.getEditor("SpellCheckingEnabled"):
             self.__spellCheckStringsOnly = Preferences.getEditor(
-                "SpellCheckStringsOnly")
+                "SpellCheckStringsOnly"
+            )
             if self.spell is None:
-                self.spell = SpellChecker(self, self.spellingIndicator,
-                                          checkRegion=self.isSpellCheckRegion)
+                self.spell = SpellChecker(
+                    self, self.spellingIndicator, checkRegion=self.isSpellCheckRegion
+                )
             self.setSpellingForProject()
             self.spell.setMinimumWordSize(
-                Preferences.getEditor("SpellCheckingMinWordSize"))
-            
+                Preferences.getEditor("SpellCheckingMinWordSize")
+            )
+
             self.setAutoSpellChecking()
         else:
             self.spell = None
@@ -7896,14 +7905,15 @@
         to the current project.
         """
         if (
-            self.fileName and
-            self.project.isOpen() and
-            self.project.isProjectSource(self.fileName)
+            self.fileName
+            and self.project.isOpen()
+            and self.project.isProjectSource(self.fileName)
         ):
             pwl, pel = self.project.getProjectDictionaries()
-            self.__setSpellingLanguage(self.project.getProjectSpellLanguage(),
-                                       pwl=pwl, pel=pel)
-    
+            self.__setSpellingLanguage(
+                self.project.getProjectSpellLanguage(), pwl=pwl, pel=pel
+            )
+
     def setAutoSpellChecking(self):
         """
         Public method to set the automatic spell checking.
@@ -7911,23 +7921,24 @@
         if Preferences.getEditor("AutoSpellCheckingEnabled"):
             with contextlib.suppress(TypeError):
                 self.SCN_CHARADDED.connect(
-                    self.__spellCharAdded, Qt.ConnectionType.UniqueConnection)
+                    self.__spellCharAdded, Qt.ConnectionType.UniqueConnection
+                )
             self.spell.checkDocumentIncrementally()
         else:
             with contextlib.suppress(TypeError):
                 self.SCN_CHARADDED.disconnect(self.__spellCharAdded)
             self.clearAllIndicators(self.spellingIndicator)
-    
+
     def isSpellCheckRegion(self, pos):
         """
         Public method to check, if the given position is within a region, that
         should be spell checked.
-        
+
         For files with a configured full text file extension all regions will
         be regarded as to be checked. Depending on configuration, all unknown
         files (i.e. those without a file extension) will be checked fully as
         well.
-        
+
         @param pos position to be checked
         @type int
         @return flag indicating pos is in a spell check region
@@ -7935,37 +7946,35 @@
         """
         if self.__spellCheckStringsOnly:
             if (
-                (self.__fileNameExtension in
-                 Preferences.getEditor("FullSpellCheckExtensions")) or
-                (not self.__fileNameExtension and
-                 Preferences.getEditor("FullSpellCheckUnknown"))
+                self.__fileNameExtension
+                in Preferences.getEditor("FullSpellCheckExtensions")
+            ) or (
+                not self.__fileNameExtension
+                and Preferences.getEditor("FullSpellCheckUnknown")
             ):
                 return True
             else:
                 style = self.styleAt(pos)
                 if self.lexer_ is not None:
-                    return (
-                        self.lexer_.isCommentStyle(style) or
-                        self.lexer_.isStringStyle(style)
-                    )
-        
+                    return self.lexer_.isCommentStyle(
+                        style
+                    ) or self.lexer_.isStringStyle(style)
+
         return True
-    
+
     @pyqtSlot(int)
     def __spellCharAdded(self, charNumber):
         """
         Private slot called to handle the user entering a character.
-        
+
         @param charNumber value of the character entered (integer)
         """
         if self.spell:
             if not chr(charNumber).isalnum():
-                self.spell.checkWord(
-                    self.positionBefore(self.currentPosition()), True)
-            elif self.hasIndicator(
-                    self.spellingIndicator, self.currentPosition()):
+                self.spell.checkWord(self.positionBefore(self.currentPosition()), True)
+            elif self.hasIndicator(self.spellingIndicator, self.currentPosition()):
                 self.spell.checkWord(self.currentPosition())
-    
+
     def checkSpelling(self):
         """
         Public slot to perform an interactive spell check of the document.
@@ -7973,35 +7982,38 @@
         if self.spell:
             cline, cindex = self.getCursorPosition()
             from .SpellCheckingDialog import SpellCheckingDialog
+
             dlg = SpellCheckingDialog(self.spell, 0, self.length(), self)
             dlg.exec()
             self.setCursorPosition(cline, cindex)
             if Preferences.getEditor("AutoSpellCheckingEnabled"):
                 self.spell.checkDocumentIncrementally()
-    
+
     def __checkSpellingSelection(self):
         """
         Private slot to spell check the current selection.
         """
         from .SpellCheckingDialog import SpellCheckingDialog
+
         sline, sindex, eline, eindex = self.getSelection()
         startPos = self.positionFromLineIndex(sline, sindex)
         endPos = self.positionFromLineIndex(eline, eindex)
         dlg = SpellCheckingDialog(self.spell, startPos, endPos, self)
         dlg.exec()
-    
+
     def __checkSpellingWord(self):
         """
         Private slot to check the word below the spelling context menu.
         """
         from .SpellCheckingDialog import SpellCheckingDialog
+
         line, index = self.lineIndexFromPosition(self.spellingMenuPos)
         wordStart, wordEnd = self.getWordBoundaries(line, index)
         wordStartPos = self.positionFromLineIndex(line, wordStart)
         wordEndPos = self.positionFromLineIndex(line, wordEnd)
         dlg = SpellCheckingDialog(self.spell, wordStartPos, wordEndPos, self)
         dlg.exec()
-    
+
     def __showContextMenuSpelling(self):
         """
         Private slot to set up the spelling menu before it is shown.
@@ -8012,25 +8024,26 @@
         word = self.getWord(line, index)
         suggestions = self.spell.getSuggestions(word)
         for suggestion in suggestions[:5]:
-            self.spellingSuggActs.append(
-                self.spellingMenu.addAction(suggestion))
+            self.spellingSuggActs.append(self.spellingMenu.addAction(suggestion))
         if suggestions:
             self.spellingMenu.addSeparator()
         self.spellingMenu.addAction(
             UI.PixmapCache.getIcon("spellchecking"),
-            self.tr("Check spelling..."), self.__checkSpellingWord)
-        self.spellingMenu.addAction(
-            self.tr("Add to dictionary"), self.__addToSpellingDictionary)
+            self.tr("Check spelling..."),
+            self.__checkSpellingWord,
+        )
         self.spellingMenu.addAction(
-            self.tr("Ignore All"), self.__ignoreSpellingAlways)
-        
+            self.tr("Add to dictionary"), self.__addToSpellingDictionary
+        )
+        self.spellingMenu.addAction(self.tr("Ignore All"), self.__ignoreSpellingAlways)
+
         self.showMenu.emit("Spelling", self.spellingMenu, self)
-    
+
     def __contextMenuSpellingTriggered(self, action):
         """
         Private slot to handle the selection of a suggestion of the spelling
         context menu.
-        
+
         @param action reference to the action that was selected (QAction)
         """
         if action in self.spellingSuggActs:
@@ -8042,7 +8055,7 @@
             self.removeSelectedText()
             self.insert(replacement)
             self.endUndoAction()
-    
+
     def __addToSpellingDictionary(self):
         """
         Private slot to add the word below the spelling context menu to the
@@ -8051,13 +8064,12 @@
         line, index = self.lineIndexFromPosition(self.spellingMenuPos)
         word = self.getWord(line, index)
         self.spell.add(word)
-        
+
         wordStart, wordEnd = self.getWordBoundaries(line, index)
-        self.clearIndicator(self.spellingIndicator, line, wordStart,
-                            line, wordEnd)
+        self.clearIndicator(self.spellingIndicator, line, wordStart, line, wordEnd)
         if Preferences.getEditor("AutoSpellCheckingEnabled"):
             self.spell.checkDocumentIncrementally()
-    
+
     def __removeFromSpellingDictionary(self):
         """
         Private slot to remove the word below the context menu to the
@@ -8066,10 +8078,10 @@
         line, index = self.lineIndexFromPosition(self.spellingMenuPos)
         word = self.getWord(line, index)
         self.spell.remove(word)
-        
+
         if Preferences.getEditor("AutoSpellCheckingEnabled"):
             self.spell.checkDocumentIncrementally()
-    
+
     def __ignoreSpellingAlways(self):
         """
         Private to always ignore the word below the spelling context menu.
@@ -8079,33 +8091,35 @@
         self.spell.ignoreAlways(word)
         if Preferences.getEditor("AutoSpellCheckingEnabled"):
             self.spell.checkDocumentIncrementally()
-    
+
     #######################################################################
     ## Cooperation related methods
     #######################################################################
-    
+
     def getSharingStatus(self):
         """
         Public method to get some share status info.
-        
+
         @return tuple indicating, if the editor is sharable, the sharing
             status, if it is inside a locally initiated shared edit session
             and if it is inside a remotely initiated shared edit session
             (boolean, boolean, boolean, boolean)
         """
         return (
-            (bool(self.fileName) and
-             self.project.isOpen() and
-             self.project.isProjectFile(self.fileName)),
+            (
+                bool(self.fileName)
+                and self.project.isOpen()
+                and self.project.isProjectFile(self.fileName)
+            ),
             self.__isShared,
             self.__inSharedEdit,
-            self.__inRemoteSharedEdit
-        )
-    
+            self.__inRemoteSharedEdit,
+        )
+
     def shareConnected(self, connected):
         """
         Public slot to handle a change of the connected state.
-        
+
         @param connected flag indicating the connected state (boolean)
         """
         if not connected:
@@ -8115,17 +8129,17 @@
             self.cancelSharedEdit(send=False)
             self.__isSyncing = False
             self.__receivedWhileSyncing = []
-    
+
     def shareEditor(self, share):
         """
         Public slot to set the shared status of the editor.
-        
+
         @param share flag indicating the share status (boolean)
         """
         self.__isShared = share
         if not share:
             self.shareConnected(False)
-    
+
     def startSharedEdit(self):
         """
         Public slot to start a shared edit session for the editor.
@@ -8135,10 +8149,12 @@
         hashStr = str(
             QCryptographicHash.hash(
                 Utilities.encode(self.__savedText, self.encoding)[0],
-                QCryptographicHash.Algorithm.Sha1).toHex(),
-            encoding="utf-8")
+                QCryptographicHash.Algorithm.Sha1,
+            ).toHex(),
+            encoding="utf-8",
+        )
         self.__send(Editor.StartEditToken, hashStr)
-    
+
     def sendSharedEdit(self):
         """
         Public slot to end a shared edit session for the editor and
@@ -8148,63 +8164,57 @@
         self.__send(Editor.EndEditToken, commands)
         self.__inSharedEdit = False
         self.__savedText = ""
-    
+
     def cancelSharedEdit(self, send=True):
         """
         Public slot to cancel a shared edit session for the editor.
-        
+
         @param send flag indicating to send the CancelEdit command (boolean)
         """
         self.__inSharedEdit = False
         self.__savedText = ""
         if send:
             self.__send(Editor.CancelEditToken)
-    
+
     def __send(self, token, args=None):
         """
         Private method to send an editor command to remote editors.
-        
+
         @param token command token (string)
         @param args arguments for the command (string)
         """
         if self.vm.isConnected():
             msg = ""
-            if token in (Editor.StartEditToken,
-                         Editor.EndEditToken,
-                         Editor.RequestSyncToken,
-                         Editor.SyncToken):
-                msg = "{0}{1}{2}".format(
-                    token,
-                    Editor.Separator,
-                    args
-                )
+            if token in (
+                Editor.StartEditToken,
+                Editor.EndEditToken,
+                Editor.RequestSyncToken,
+                Editor.SyncToken,
+            ):
+                msg = "{0}{1}{2}".format(token, Editor.Separator, args)
             elif token == Editor.CancelEditToken:
-                msg = "{0}{1}c".format(
-                    token,
-                    Editor.Separator
-                )
-            
+                msg = "{0}{1}c".format(token, Editor.Separator)
+
             self.vm.send(self.fileName, msg)
-    
+
     def receive(self, command):
         """
         Public slot to handle received editor commands.
-        
+
         @param command command string (string)
         """
         if self.__isShared:
-            if (
-                self.__isSyncing and
-                not command.startswith(Editor.SyncToken + Editor.Separator)
+            if self.__isSyncing and not command.startswith(
+                Editor.SyncToken + Editor.Separator
             ):
                 self.__receivedWhileSyncing.append(command)
             else:
                 self.__dispatchCommand(command)
-    
+
     def __dispatchCommand(self, command):
         """
         Private method to dispatch received commands.
-        
+
         @param command command to be processed (string)
         """
         token, argsString = command.split(Editor.Separator, 1)
@@ -8218,11 +8228,11 @@
             self.__processRequestSyncCommand(argsString)
         elif token == Editor.SyncToken:
             self.__processSyncCommand(argsString)
-    
+
     def __processStartEditCommand(self, argsString):
         """
         Private slot to process a remote StartEdit command.
-        
+
         @param argsString string containing the command parameters (string)
         """
         if not self.__inSharedEdit and not self.__inRemoteSharedEdit:
@@ -8232,18 +8242,20 @@
             hashStr = str(
                 QCryptographicHash.hash(
                     Utilities.encode(self.text(), self.encoding)[0],
-                    QCryptographicHash.Algorithm.Sha1).toHex(),
-                encoding="utf-8")
+                    QCryptographicHash.Algorithm.Sha1,
+                ).toHex(),
+                encoding="utf-8",
+            )
             if hashStr != argsString:
                 # text is different to the remote site, request to sync it
                 self.__isSyncing = True
                 self.__send(Editor.RequestSyncToken, argsString)
-    
+
     def __calculateChanges(self, old, new):
         """
         Private method to determine change commands to convert old text into
         new text.
-        
+
         @param old old text (string)
         @param new new text (string)
         @return commands to change old into new (string)
@@ -8251,38 +8263,38 @@
         oldL = old.splitlines()
         newL = new.splitlines()
         matcher = difflib.SequenceMatcher(None, oldL, newL)
-        
+
         formatStr = "@@{0} {1} {2} {3}"
         commands = []
         for token, i1, i2, j1, j2 in matcher.get_opcodes():
-            if token == "insert":               # secok
+            if token == "insert":  # secok
                 commands.append(formatStr.format("i", j1, j2 - j1, -1))
                 commands.extend(newL[j1:j2])
-            elif token == "delete":             # secok
+            elif token == "delete":  # secok
                 commands.append(formatStr.format("d", j1, i2 - i1, -1))
-            elif token == "replace":            # secok
+            elif token == "replace":  # secok
                 commands.append(formatStr.format("r", j1, i2 - i1, j2 - j1))
                 commands.extend(newL[j1:j2])
-        
+
         return "\n".join(commands) + "\n"
-    
+
     def __processEndEditCommand(self, argsString):
         """
         Private slot to process a remote EndEdit command.
-        
+
         @param argsString string containing the command parameters (string)
         """
         commands = argsString.splitlines()
         sep = self.getLineSeparator()
         cur = self.getCursorPosition()
-        
+
         self.setReadOnly(False)
         self.beginUndoAction()
         while commands:
             commandLine = commands.pop(0)
             if not commandLine.startswith("@@"):
                 continue
-            
+
             args = commandLine.split()
             command = args.pop(0)
             pos, l1, l2 = [int(arg) for arg in args]
@@ -8302,34 +8314,36 @@
         self.endUndoAction()
         self.__updateReadOnly()
         self.__inRemoteSharedEdit = False
-        
+
         self.setCursorPosition(*cur)
-    
+
     def __processRequestSyncCommand(self, argsString):
         """
         Private slot to process a remote RequestSync command.
-        
+
         @param argsString string containing the command parameters (string)
         """
         if self.__inSharedEdit:
             hashStr = str(
                 QCryptographicHash.hash(
                     Utilities.encode(self.__savedText, self.encoding)[0],
-                    QCryptographicHash.Algorithm.Sha1).toHex(),
-                encoding="utf-8")
-            
+                    QCryptographicHash.Algorithm.Sha1,
+                ).toHex(),
+                encoding="utf-8",
+            )
+
             if hashStr == argsString:
                 self.__send(Editor.SyncToken, self.__savedText)
-    
+
     def __processSyncCommand(self, argsString):
         """
         Private slot to process a remote Sync command.
-        
+
         @param argsString string containing the command parameters (string)
         """
         if self.__isSyncing:
             cur = self.getCursorPosition()
-            
+
             self.setReadOnly(False)
             self.beginUndoAction()
             self.selectAll()
@@ -8337,35 +8351,35 @@
             self.insertAt(argsString, 0, 0)
             self.endUndoAction()
             self.setReadOnly(True)
-            
+
             self.setCursorPosition(*cur)
-            
+
             while self.__receivedWhileSyncing:
                 command = self.__receivedWhileSyncing.pop(0)
                 self.__dispatchCommand(command)
-            
+
             self.__isSyncing = False
-    
+
     #######################################################################
     ## Special search related methods
     #######################################################################
-    
+
     def searchCurrentWordForward(self):
         """
         Public slot to search the current word forward.
         """
         self.__searchCurrentWord(forward=True)
-    
+
     def searchCurrentWordBackward(self):
         """
         Public slot to search the current word backward.
         """
         self.__searchCurrentWord(forward=False)
-    
+
     def __searchCurrentWord(self, forward=True):
         """
         Private slot to search the next occurrence of the current word.
-        
+
         @param forward flag indicating the search direction (boolean)
         """
         self.hideFindIndicator()
@@ -8374,10 +8388,10 @@
         wordStart, wordEnd = self.getCurrentWordBoundaries()
         wordStartPos = self.positionFromLineIndex(line, wordStart)
         wordEndPos = self.positionFromLineIndex(line, wordEnd)
-        
+
         regExp = re.compile(r"\b{0}\b".format(word))
         startPos = wordEndPos if forward else wordStartPos
-        
+
         matches = [m for m in regExp.finditer(self.text())]
         if matches:
             if forward:
@@ -8396,33 +8410,36 @@
                     match = matches[-1]
             line, index = self.lineIndexFromPosition(match.start())
             self.setSelection(line, index + len(match.group(0)), line, index)
-            self.showFindIndicator(line, index,
-                                   line, index + len(match.group(0)))
-    
+            self.showFindIndicator(line, index, line, index + len(match.group(0)))
+
     #######################################################################
     ## Sort related methods
     #######################################################################
-    
+
     def sortLines(self):
         """
         Public slot to sort the lines spanned by a rectangular selection.
         """
         if not self.selectionIsRectangle():
             return
-        
+
         from .SortOptionsDialog import SortOptionsDialog
+
         dlg = SortOptionsDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             ascending, alnum, caseSensitive = dlg.getData()
-            origStartLine, origStartIndex, origEndLine, origEndIndex = (
-                self.getRectangularSelection()
-            )
+            (
+                origStartLine,
+                origStartIndex,
+                origEndLine,
+                origEndIndex,
+            ) = self.getRectangularSelection()
             # convert to upper-left to lower-right
             startLine = min(origStartLine, origEndLine)
             startIndex = min(origStartIndex, origEndIndex)
             endLine = max(origStartLine, origEndLine)
             endIndex = max(origStartIndex, origEndIndex)
-            
+
             # step 1: extract the text of the rectangular selection and
             #         the lines
             selText = {}
@@ -8439,21 +8456,23 @@
                             self.tr("Sort Lines"),
                             self.tr(
                                 """The selection contains illegal data for a"""
-                                """ numerical sort."""))
+                                """ numerical sort."""
+                            ),
+                        )
                         return
-                
+
                 if txt in selText:
                     selText[txt].append(line)
                 else:
                     selText[txt] = [line]
-            
+
             # step 2: calculate the sort parameters
             reverse = not ascending
             if alnum and not caseSensitive:
                 keyFun = str.lower
             else:
                 keyFun = None
-            
+
             # step 3: sort the lines
             eol = self.getLineSeparator()
             lastWithEol = True
@@ -8466,51 +8485,52 @@
                         txt += eol
                     newLines.append(txt)
             if not lastWithEol:
-                newLines[-1] = newLines[-1][:-len(eol)]
-            
+                newLines[-1] = newLines[-1][: -len(eol)]
+
             # step 4: replace the lines by the sorted ones
             self.setSelection(startLine, 0, endLine + 1, 0)
             self.beginUndoAction()
             self.replaceSelectedText("".join(newLines))
             self.endUndoAction()
-            
+
             # step 5: reset the rectangular selection
-            self.setRectangularSelection(origStartLine, origStartIndex,
-                                         origEndLine, origEndIndex)
+            self.setRectangularSelection(
+                origStartLine, origStartIndex, origEndLine, origEndIndex
+            )
             self.selectionChanged.emit()
-    
+
     #######################################################################
     ## Mouse click handler related methods
     #######################################################################
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method calling a registered mouse click handler function.
-        
+
         @param evt event object
         @type QMouseEvent
         """
         modifiers = evt.modifiers()
         button = evt.button()
         key = (modifiers, button)
-        
+
         self.vm.eventFilter(self, evt)
         super().mouseReleaseEvent(evt)
-        
+
         if (
-            button != Qt.MouseButton.NoButton and
-            Preferences.getEditor("MouseClickHandlersEnabled") and
-            key in self.__mouseClickHandlers
+            button != Qt.MouseButton.NoButton
+            and Preferences.getEditor("MouseClickHandlersEnabled")
+            and key in self.__mouseClickHandlers
         ):
             evt.accept()
             self.__mouseClickHandlers[key][1](self)
         else:
             super().mouseReleaseEvent(evt)
-    
+
     def setMouseClickHandler(self, name, modifiers, button, function):
         """
         Public method to set a mouse click handler.
-        
+
         @param name name of the plug-in (or 'internal') setting this handler
         @type str
         @param modifiers keyboard modifiers of the handler
@@ -8528,24 +8548,27 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("Register Mouse Click Handler"),
-                    self.tr("""A mouse click handler for "{0}" was already"""
-                            """ registered by "{1}". Aborting request by"""
-                            """ "{2}"...""").format(
-                        MouseUtilities.MouseButtonModifier2String(
-                            modifiers, button),
+                    self.tr(
+                        """A mouse click handler for "{0}" was already"""
+                        """ registered by "{1}". Aborting request by"""
+                        """ "{2}"..."""
+                    ).format(
+                        MouseUtilities.MouseButtonModifier2String(modifiers, button),
                         self.__mouseClickHandlers[key][0],
-                        name))
+                        name,
+                    ),
+                )
                 return False
-            
+
             self.__mouseClickHandlers[key] = (name, function)
             return True
-        
+
         return False
-    
+
     def getMouseClickHandler(self, modifiers, button):
         """
         Public method to get a registered mouse click handler.
-        
+
         @param modifiers keyboard modifiers of the handler
         @type Qt.KeyboardModifiers
         @param button mouse button of the handler
@@ -8558,12 +8581,12 @@
             return self.__mouseClickHandlers[key]
         else:
             return ("", None)
-    
+
     def getMouseClickHandlers(self, name):
         """
         Public method to get all registered mouse click handlers of
         a plug-in.
-        
+
         @param name name of the plug-in
         @type str
         @return registered mouse click handlers as list of modifiers,
@@ -8575,11 +8598,11 @@
             if value[0] == name:
                 lst.append((key[0], key[1], value[1]))
         return lst
-    
+
     def removeMouseClickHandler(self, modifiers, button):
         """
         Public method to un-registered a mouse click handler.
-        
+
         @param modifiers keyboard modifiers of the handler
         @type Qt.KeyboardModifiers
         @param button mouse button of the handler
@@ -8588,12 +8611,12 @@
         key = (modifiers, button)
         if key in self.__mouseClickHandlers:
             del self.__mouseClickHandlers[key]
-    
+
     def removeMouseClickHandlers(self, name):
         """
         Public method to un-registered all mouse click handlers of
         a plug-in.
-        
+
         @param name name of the plug-in
         @type str
         """
@@ -8603,88 +8626,92 @@
                 keys.append(key)
         for key in keys:
             del self.__mouseClickHandlers[key]
-    
+
     def gotoReferenceHandler(self, referencesList):
         """
         Public method to handle a list of references to perform a goto.
-        
+
         @param referencesList list of references for a 'goto' action
         @type ReferenceItem
         """
         references = []
         referencePositions = []
-        
+
         for reference in referencesList:
             if (
-                reference.modulePath != self.getFileName() or
-                self.getCursorPosition()[0] + 1 != reference.line
+                reference.modulePath != self.getFileName()
+                or self.getCursorPosition()[0] + 1 != reference.line
             ):
                 if reference.modulePath == self.getFileName():
                     references.append(
-                        self.tr("{0:4d}    {1}", "line number, source code")
-                        .format(reference.line, reference.codeLine.strip())
+                        self.tr("{0:4d}    {1}", "line number, source code").format(
+                            reference.line, reference.codeLine.strip()
+                        )
                     )
                 else:
                     references.append(
-                        self.tr("{0:4d}    {1}\n    =>  {2}",
-                                "line number, source code, file name")
-                        .format(
-                            reference.line, reference.codeLine.strip(),
-                            self.project.getRelativePath(reference.modulePath)
+                        self.tr(
+                            "{0:4d}    {1}\n    =>  {2}",
+                            "line number, source code, file name",
+                        ).format(
+                            reference.line,
+                            reference.codeLine.strip(),
+                            self.project.getRelativePath(reference.modulePath),
                         )
                     )
                 referencePositions.append(
-                    (reference.modulePath, reference.line, reference.column))
-        
+                    (reference.modulePath, reference.line, reference.column)
+                )
+
         if references:
             if self.isCallTipActive():
                 self.cancelCallTips()
             self.__referencesList = references
             self.__referencesPositionsList = referencePositions
             self.showUserList(ReferencesListID, references)
-    
+
     #######################################################################
     ## Methods implementing a Shell interface
     #######################################################################
-    
+
     def __executeSelection(self):
         """
         Private slot to execute the selected text in the shell window.
         """
         txt = self.selectedText()
         ericApp().getObject("Shell").executeLines(txt)
-    
+
     #######################################################################
     ## Methods implementing the interface to EditorConfig
     #######################################################################
-    
+
     def __loadEditorConfig(self, fileName=""):
         """
         Private method to load the EditorConfig properties.
-        
+
         @param fileName name of the file
         @type str
         """
         if not fileName:
             fileName = self.fileName
-        
+
         self.__editorConfig = self.__loadEditorConfigObject(fileName)
-        
+
         if fileName:
             self.__setTabAndIndent()
-    
+
     def __loadEditorConfigObject(self, fileName):
         """
         Private method to load the EditorConfig properties for the given
         file name.
-        
+
         @param fileName name of the file
         @type str
         @return EditorConfig dictionary
         @rtype dict
         """
         editorConfig = {}
-        
+
         if fileName:
             try:
                 editorConfig = editorconfig.get_properties(fileName)
@@ -8692,21 +8719,23 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("EditorConfig Properties"),
-                    self.tr("""<p>The EditorConfig properties for file"""
-                            """ <b>{0}</b> could not be loaded.</p>""")
-                    .format(fileName))
-        
+                    self.tr(
+                        """<p>The EditorConfig properties for file"""
+                        """ <b>{0}</b> could not be loaded.</p>"""
+                    ).format(fileName),
+                )
+
         return editorConfig
-    
+
     def __getEditorConfig(self, option, nodefault=False, config=None):
         """
         Private method to get the requested option via EditorConfig.
-        
+
         If there is no EditorConfig defined, the equivalent built-in option
         will be used (Preferences.getEditor() ). The option must be given as
         the Preferences option key. The mapping to the EditorConfig option name
         will be done within this method.
-        
+
         @param option Preferences option key
         @type str
         @param nodefault flag indicating to not get the default value from
@@ -8720,7 +8749,7 @@
         """
         if config is None:
             config = self.__editorConfig
-        
+
         if not config:
             if nodefault:
                 return None
@@ -8730,7 +8759,7 @@
                     # no override
                     value = Preferences.getEditor(option)
                 return value
-        
+
         try:
             if option == "EOLMode":
                 value = config["end_of_line"]
@@ -8760,31 +8789,31 @@
                 value = config["indent_style"] == "tab"
         except KeyError:
             value = None
-        
+
         if value is None and not nodefault:
             # use Preferences in case of error
             value = self.__getOverrideValue(option)
             if value is None:
                 # no override
                 value = Preferences.getEditor(option)
-        
+
         return value
-    
+
     def getEditorConfig(self, option):
         """
         Public method to get the requested option via EditorConfig.
-        
+
         @param option Preferences option key
         @type str
         @return value of requested setting
         @rtype any
         """
         return self.__getEditorConfig(option)
-    
+
     def __getOverrideValue(self, option):
         """
         Private method to get an override value for the current file type.
-        
+
         @param option Preferences option key
         @type str
         @return override value; None in case nothing is defined
@@ -8798,39 +8827,38 @@
                     return overrides[language][0]
                 elif option == "IndentWidth":
                     return overrides[language][1]
-        
+
         return None
-    
+
     #######################################################################
     ## Methods implementing the docstring generator interface
     #######################################################################
-    
+
     def getDocstringGenerator(self):
         """
         Public method to get a reference to the docstring generator.
-        
+
         @return reference to the docstring generator
         @rtype BaseDocstringGenerator
         """
         if self.__docstringGenerator is None:
             from . import DocstringGenerator
-            self.__docstringGenerator = (
-                DocstringGenerator.getDocstringGenerator(self)
-            )
-        
+
+            self.__docstringGenerator = DocstringGenerator.getDocstringGenerator(self)
+
         return self.__docstringGenerator
-    
+
     def insertDocstring(self):
         """
         Public method to generate and insert a docstring for the function under
         the cursor.
-        
+
         Note: This method is called via a keyboard shortcut or through the
         global 'Edit' menu.
         """
         generator = self.getDocstringGenerator()
         generator.insertDocstringFromShortcut(self.getCursorPosition())
-    
+
     @pyqtSlot()
     def __insertDocstring(self):
         """
@@ -8839,31 +8867,28 @@
         """
         generator = self.getDocstringGenerator()
         generator.insertDocstring(self.getCursorPosition(), fromStart=True)
-    
+
     def __delayedDocstringMenuPopup(self, cursorPosition):
         """
         Private method to test, if the user might want to insert a docstring.
-        
+
         @param cursorPosition current cursor position (line and column)
         @type tuple of (int, int)
         """
-        if (
-            Preferences.getEditor("DocstringAutoGenerate") and
-            self.getDocstringGenerator().isDocstringIntro(cursorPosition)
-        ):
-            lineText2Cursor = self.text(cursorPosition[0])[:cursorPosition[1]]
-            
+        if Preferences.getEditor(
+            "DocstringAutoGenerate"
+        ) and self.getDocstringGenerator().isDocstringIntro(cursorPosition):
+            lineText2Cursor = self.text(cursorPosition[0])[: cursorPosition[1]]
+
             QTimer.singleShot(
-                300,
-                lambda: self.__popupDocstringMenu(lineText2Cursor,
-                                                  cursorPosition)
+                300, lambda: self.__popupDocstringMenu(lineText2Cursor, cursorPosition)
             )
-    
+
     def __popupDocstringMenu(self, lastLineText, lastCursorPosition):
         """
         Private slot to pop up a menu asking the user, if a docstring should be
         inserted.
-        
+
         @param lastLineText line contents when the delay timer was started
         @type str
         @param lastCursorPosition position of the cursor when the delay timer
@@ -8873,36 +8898,35 @@
         cursorPosition = self.getCursorPosition()
         if lastCursorPosition != cursorPosition:
             return
-        
-        if self.text(cursorPosition[0])[:cursorPosition[1]] != lastLineText:
+
+        if self.text(cursorPosition[0])[: cursorPosition[1]] != lastLineText:
             return
-        
+
         generator = self.getDocstringGenerator()
         if generator.hasFunctionDefinition(cursorPosition):
             from .DocstringGenerator.BaseDocstringGenerator import (
-                DocstringMenuForEnterOnly
+                DocstringMenuForEnterOnly,
             )
+
             docstringMenu = DocstringMenuForEnterOnly(self)
             act = docstringMenu.addAction(
                 UI.PixmapCache.getIcon("fileText"),
                 self.tr("Generate Docstring"),
-                lambda: generator.insertDocstring(cursorPosition,
-                                                  fromStart=False)
+                lambda: generator.insertDocstring(cursorPosition, fromStart=False),
             )
             docstringMenu.setActiveAction(act)
-            docstringMenu.popup(
-                self.mapToGlobal(self.getGlobalCursorPosition()))
-    
+            docstringMenu.popup(self.mapToGlobal(self.getGlobalCursorPosition()))
+
     #######################################################################
     ## Methods implementing the mouse hover help interface
     #######################################################################
-    
+
     @pyqtSlot(int, int, int)
     def __showMouseHoverHelp(self, pos, x, y):
         """
         Private slot showing code information about the symbol under the
         cursor.
-        
+
         @param pos mouse position into the document
         @type int
         @param x x-value of mouse screen position
@@ -8924,7 +8948,7 @@
                     self.__cancelMouseHoverHelp()
             else:
                 self.__cancelMouseHoverHelp()
-    
+
     def __cancelMouseHoverHelp(self):
         """
         Private slot cancelling the display of mouse hover help.
@@ -8932,35 +8956,35 @@
         if self.__showingMouseHoverHelp:
             self.cancelCallTips()
             self.__showingMouseHoverHelp = False
-    
+
     def registerMouseHoverHelpFunction(self, func):
         """
         Public method to register a mouse hover help function.
-        
+
         Note: Only one plugin should provide this function. Otherwise
         the last one wins.
-        
+
         @param func function accepting a reference to the calling editor and
             the line and column position (zero based each)
         @type func
         """
         self.__mouseHoverHelp = func
-    
+
     def unregisterMouseHoverHelpFunction(self, func):
         """
         Public method to unregister a mouse hover help function.
-        
+
         @param func function accepting a reference to the calling editor and
             the line and column position (zero based each)
         @type func
         """
         if self.__mouseHoverHelp is func:
             self.__mouseHoverHelp = None
-    
+
     def showMouseHoverHelpData(self, line, index, data):
         """
         Public method to show the mouse hover help data.
-        
+
         @param line line of mouse cursor position
         @type int
         @param index column of mouse cursor position
@@ -8970,20 +8994,21 @@
         """
         if data and self.hasFocus() and not self.isListActive():
             pos = self.positionFromLineIndex(line, index)
-            self.SendScintilla(QsciScintilla.SCI_CALLTIPSHOW,
-                               pos, self._encodeString(data))
+            self.SendScintilla(
+                QsciScintilla.SCI_CALLTIPSHOW, pos, self._encodeString(data)
+            )
             self.__showingMouseHoverHelp = True
         else:
             self.__cancelMouseHoverHelp()
-    
+
     #######################################################################
     ## Methods implementing the Black code formatting interface
     #######################################################################
-    
+
     def __performFormatWithBlack(self, action):
         """
         Private method to format the source code using the 'Black' tool.
-        
+
         Following actions are supported.
         <ul>
         <li>BlackFormattingAction.Format - the code reformatting is performed</li>
@@ -8992,27 +9017,24 @@
         <li>BlackFormattingAction.Diff - a unified diff of potential code formatting
             changes is generated</li>
         </ul>
-        
+
         @param action formatting operation to be performed
         @type BlackFormattingAction
         """
         from CodeFormatting.BlackConfigurationDialog import BlackConfigurationDialog
         from CodeFormatting.BlackFormattingDialog import BlackFormattingDialog
-        
+
         if not self.isModified() or self.saveFile():
             withProject = (
-                self.fileName and
-                self.project.isOpen() and
-                self.project.isProjectSource(self.fileName)
+                self.fileName
+                and self.project.isOpen()
+                and self.project.isProjectSource(self.fileName)
             )
             dlg = BlackConfigurationDialog(withProject=withProject)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 config = dlg.getConfiguration()
-                
+
                 formattingDialog = BlackFormattingDialog(
-                    config,
-                    [self.fileName],
-                    project=self.project,
-                    action=action
+                    config, [self.fileName], project=self.project, action=action
                 )
                 formattingDialog.exec()
--- a/src/eric7/QScintilla/EditorAssembly.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorAssembly.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,11 +24,11 @@
     Class implementing the editor assembly widget containing the navigation
     combos and the editor widget.
     """
-    def __init__(self, dbs, fn="", vm=None, filetype="", editor=None,
-                 tv=None):
+
+    def __init__(self, dbs, fn="", vm=None, filetype="", editor=None, tv=None):
         """
         Constructor
-        
+
         @param dbs reference to the debug server object
         @type DebugServer
         @param fn name of the file to be opened. If it is None,
@@ -44,17 +44,17 @@
         @type TaskViewer
         """
         super().__init__()
-        
+
         self.__layout = QGridLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__layout.setSpacing(1)
-        
+
         from .EditorButtonsWidget import EditorButtonsWidget
         from .Editor import Editor
         from .EditorOutline import EditorOutlineView
-        
+
         self.__showOutline = Preferences.getEditor("ShowSourceOutline")
-        
+
         self.__editor = Editor(dbs, fn, vm, filetype, editor, tv)
         self.__buttonsWidget = EditorButtonsWidget(self.__editor, self)
         self.__globalsCombo = QComboBox()
@@ -62,38 +62,41 @@
         self.__membersCombo = QComboBox()
         self.__membersCombo.setDuplicatesEnabled(True)
         self.__sourceOutline = EditorOutlineView(
-            self.__editor, populate=self.__showOutline)
+            self.__editor, populate=self.__showOutline
+        )
         self.__sourceOutline.setMaximumWidth(
-            Preferences.getEditor("SourceOutlineWidth"))
-        
+            Preferences.getEditor("SourceOutlineWidth")
+        )
+
         self.__layout.addWidget(self.__buttonsWidget, 1, 0, -1, 1)
         self.__layout.addWidget(self.__globalsCombo, 0, 1)
         self.__layout.addWidget(self.__membersCombo, 0, 2)
         self.__layout.addWidget(self.__editor, 1, 1, 1, 2)
         self.__layout.addWidget(self.__sourceOutline, 0, 3, -1, -1)
-        
+
         self.setFocusProxy(self.__editor)
-        
+
         self.__module = None
-        
+
         self.__shutdownTimerCalled = False
         self.__parseTimer = QTimer(self)
         self.__parseTimer.setSingleShot(True)
         self.__parseTimer.setInterval(5 * 1000)
         self.__editor.textChanged.connect(self.__resetParseTimer)
         self.__editor.refreshed.connect(self.__resetParseTimer)
-        
+
         self.__selectedGlobal = ""
         self.__selectedMember = ""
         self.__globalsBoundaries = {}
         self.__membersBoundaries = {}
-        
+
         self.__activateOutline(self.__showOutline)
         self.__activateCombos(not self.__showOutline)
-        
+
         ericApp().getObject("UserInterface").preferencesChanged.connect(
-            self.__preferencesChanged)
-    
+            self.__preferencesChanged
+        )
+
     def shutdownTimer(self):
         """
         Public method to stop and disconnect the timer.
@@ -103,16 +106,16 @@
             self.__editor.textChanged.disconnect(self.__resetParseTimer)
             self.__editor.refreshed.disconnect(self.__resetParseTimer)
             self.__shutdownTimerCalled = True
-    
+
     def getEditor(self):
         """
         Public method to get the reference to the editor widget.
-        
+
         @return reference to the editor widget
         @rtype Editor
         """
         return self.__editor
-    
+
     def __preferencesChanged(self):
         """
         Private slot handling a change of preferences.
@@ -122,53 +125,49 @@
             self.__showOutline = showOutline
             self.__activateOutline(self.__showOutline)
             self.__activateCombos(not self.__showOutline)
-    
+
     #######################################################################
     ## Methods dealing with the navigation combos below
     #######################################################################
-    
+
     def __activateCombos(self, activate):
         """
         Private slot to activate the navigation combo boxes.
-        
+
         @param activate flag indicating to activate the combo boxes
         @type bool
         """
         self.__globalsCombo.setVisible(activate)
         self.__membersCombo.setVisible(activate)
         if activate:
-            self.__globalsCombo.activated[int].connect(
-                self.__globalsActivated)
-            self.__membersCombo.activated[int].connect(
-                self.__membersActivated)
-            self.__editor.cursorLineChanged.connect(
-                self.__editorCursorLineChanged)
+            self.__globalsCombo.activated[int].connect(self.__globalsActivated)
+            self.__membersCombo.activated[int].connect(self.__membersActivated)
+            self.__editor.cursorLineChanged.connect(self.__editorCursorLineChanged)
             self.__parseTimer.timeout.connect(self.__parseEditor)
-            
+
             self.__parseEditor()
-            
+
             line, _ = self.__editor.getCursorPosition()
             self.__editorCursorLineChanged(line)
         else:
             with contextlib.suppress(TypeError):
-                self.__globalsCombo.activated[int].disconnect(
-                    self.__globalsActivated)
-                self.__membersCombo.activated[int].disconnect(
-                    self.__membersActivated)
+                self.__globalsCombo.activated[int].disconnect(self.__globalsActivated)
+                self.__membersCombo.activated[int].disconnect(self.__membersActivated)
                 self.__editor.cursorLineChanged.disconnect(
-                    self.__editorCursorLineChanged)
+                    self.__editorCursorLineChanged
+                )
                 self.__parseTimer.timeout.disconnect(self.__parseEditor)
-            
+
             self.__globalsCombo.clear()
             self.__membersCombo.clear()
             self.__globalsBoundaries = {}
             self.__membersBoundaries = {}
-    
+
     def __globalsActivated(self, index, moveCursor=True):
         """
         Private method to jump to the line of the selected global entry and to
         populate the members combo box.
-        
+
         @param index index of the selected entry
         @type int
         @param moveCursor flag indicating to move the editor cursor
@@ -180,10 +179,9 @@
             if moveCursor:
                 txt = self.__editor.text(lineno - 1).rstrip()
                 pos = len(txt.replace(txt.strip(), ""))
-                self.__editor.gotoLine(
-                    lineno, pos if pos == 0 else pos + 1, True)
+                self.__editor.gotoLine(lineno, pos if pos == 0 else pos + 1, True)
                 self.__editor.setFocus()
-            
+
             # step 2: populate the members combo, if the entry is a class
             self.__membersCombo.clear()
             self.__membersBoundaries = {}
@@ -201,22 +199,20 @@
                         if cl.isPrivate():
                             icon = UI.PixmapCache.getIcon("class_private")
                         elif cl.isProtected():
-                            icon = UI.PixmapCache.getIcon(
-                                "class_protected")
+                            icon = UI.PixmapCache.getIcon("class_protected")
                         else:
                             icon = UI.PixmapCache.getIcon("class")
                         items.append((icon, cl.name, cl.lineno, cl.endlineno))
                     for itm in sorted(items, key=lambda x: (x[1], x[2])):
                         self.__membersCombo.addItem(itm[0], itm[1], itm[2])
                         memberIndex += 1
-                        self.__membersBoundaries[(itm[2], itm[3])] = (
-                            memberIndex
-                        )
+                        self.__membersBoundaries[(itm[2], itm[3])] = memberIndex
                 else:
                     return
-                
+
                 # step 2.1: add class methods
                 from Utilities.ModuleParser import Function
+
                 items = []
                 for meth in entry.methods.values():
                     if meth.modifier == Function.Static:
@@ -229,28 +225,25 @@
                         icon = UI.PixmapCache.getIcon("method_protected")
                     else:
                         icon = UI.PixmapCache.getIcon("method")
-                    items.append(
-                        (icon, meth.name, meth.lineno, meth.endlineno)
-                    )
+                    items.append((icon, meth.name, meth.lineno, meth.endlineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__membersCombo.addItem(itm[0], itm[1], itm[2])
                     memberIndex += 1
                     self.__membersBoundaries[(itm[2], itm[3])] = memberIndex
-                
+
                 # step 2.2: add class instance attributes
                 items = []
                 for attr in entry.attributes.values():
                     if attr.isPrivate():
                         icon = UI.PixmapCache.getIcon("attribute_private")
                     elif attr.isProtected():
-                        icon = UI.PixmapCache.getIcon(
-                            "attribute_protected")
+                        icon = UI.PixmapCache.getIcon("attribute_protected")
                     else:
                         icon = UI.PixmapCache.getIcon("attribute")
                     items.append((icon, attr.name, attr.lineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__membersCombo.addItem(itm[0], itm[1], itm[2])
-                
+
                 # step 2.3: add class attributes
                 items = []
                 icon = UI.PixmapCache.getIcon("attribute_class")
@@ -258,11 +251,11 @@
                     items.append((icon, globalVar.name, globalVar.lineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__membersCombo.addItem(itm[0], itm[1], itm[2])
-    
+
     def __membersActivated(self, index, moveCursor=True):
         """
         Private method to jump to the line of the selected members entry.
-        
+
         @param index index of the selected entry
         @type int
         @param moveCursor flag indicating to move the editor cursor
@@ -272,24 +265,25 @@
         if lineno is not None and moveCursor:
             txt = self.__editor.text(lineno - 1).rstrip()
             pos = len(txt.replace(txt.strip(), ""))
-            self.__editor.gotoLine(lineno, pos if pos == 0 else pos + 1,
-                                   firstVisible=True, expand=True)
+            self.__editor.gotoLine(
+                lineno, pos if pos == 0 else pos + 1, firstVisible=True, expand=True
+            )
             self.__editor.setFocus()
-    
+
     def __resetParseTimer(self):
         """
         Private slot to reset the parse timer.
         """
         self.__parseTimer.stop()
         self.__parseTimer.start()
-    
+
     def __parseEditor(self):
         """
         Private method to parse the editor source and repopulate the globals
         combo.
         """
         from Utilities.ModuleParser import Module, getTypeFromTypeName
-        
+
         self.__module = None
         sourceType = getTypeFromTypeName(self.__editor.determineFileType())
         if sourceType != -1:
@@ -300,31 +294,35 @@
                     fn = ""
                 self.__module = Module("", fn, sourceType)
                 self.__module.scan(src)
-                
+
                 # remember the current selections
                 self.__selectedGlobal = self.__globalsCombo.currentText()
                 self.__selectedMember = self.__membersCombo.currentText()
-                
+
                 self.__globalsCombo.clear()
                 self.__membersCombo.clear()
                 self.__globalsBoundaries = {}
                 self.__membersBoundaries = {}
-                
+
                 self.__globalsCombo.addItem("")
                 index = 0
-                
+
                 # step 1: add modules
                 items = []
                 for module in self.__module.modules.values():
                     items.append(
-                        (UI.PixmapCache.getIcon("module"), module.name,
-                         module.lineno, module.endlineno)
+                        (
+                            UI.PixmapCache.getIcon("module"),
+                            module.name,
+                            module.lineno,
+                            module.endlineno,
+                        )
                     )
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__globalsCombo.addItem(itm[0], itm[1], itm[2])
                     index += 1
                     self.__globalsBoundaries[(itm[2], itm[3])] = index
-                
+
                 # step 2: add classes
                 items = []
                 for cl in self.__module.classes.values():
@@ -334,14 +332,12 @@
                         icon = UI.PixmapCache.getIcon("class_protected")
                     else:
                         icon = UI.PixmapCache.getIcon("class")
-                    items.append(
-                        (icon, cl.name, cl.lineno, cl.endlineno)
-                    )
+                    items.append((icon, cl.name, cl.lineno, cl.endlineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__globalsCombo.addItem(itm[0], itm[1], itm[2])
                     index += 1
                     self.__globalsBoundaries[(itm[2], itm[3])] = index
-                
+
                 # step 3: add functions
                 items = []
                 for func in self.__module.functions.values():
@@ -351,30 +347,25 @@
                         icon = UI.PixmapCache.getIcon("method_protected")
                     else:
                         icon = UI.PixmapCache.getIcon("method")
-                    items.append(
-                        (icon, func.name, func.lineno, func.endlineno)
-                    )
+                    items.append((icon, func.name, func.lineno, func.endlineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__globalsCombo.addItem(itm[0], itm[1], itm[2])
                     index += 1
                     self.__globalsBoundaries[(itm[2], itm[3])] = index
-                
+
                 # step 4: add attributes
                 items = []
                 for globalValue in self.__module.globals.values():
                     if globalValue.isPrivate():
                         icon = UI.PixmapCache.getIcon("attribute_private")
                     elif globalValue.isProtected():
-                        icon = UI.PixmapCache.getIcon(
-                            "attribute_protected")
+                        icon = UI.PixmapCache.getIcon("attribute_protected")
                     else:
                         icon = UI.PixmapCache.getIcon("attribute")
-                    items.append(
-                        (icon, globalValue.name, globalValue.lineno)
-                    )
+                    items.append((icon, globalValue.name, globalValue.lineno))
                 for itm in sorted(items, key=lambda x: (x[1], x[2])):
                     self.__globalsCombo.addItem(itm[0], itm[1], itm[2])
-                
+
                 # reset the currently selected entries without moving the
                 # text cursor
                 index = self.__globalsCombo.findText(self.__selectedGlobal)
@@ -390,78 +381,77 @@
             self.__membersCombo.clear()
             self.__globalsBoundaries = {}
             self.__membersBoundaries = {}
-    
+
     def __editorCursorLineChanged(self, lineno):
         """
         Private slot handling a line change of the cursor of the editor.
-        
+
         @param lineno line number of the cursor
         @type int
         """
-        lineno += 1     # cursor position is zero based, code info one based
-        
+        lineno += 1  # cursor position is zero based, code info one based
+
         # step 1: search in the globals
         indexFound = 0
         for (lower, upper), index in self.__globalsBoundaries.items():
             if upper == -1:
-                upper = 1000000     # it is the last line
+                upper = 1000000  # it is the last line
             if lower <= lineno <= upper:
                 indexFound = index
                 break
         self.__globalsCombo.setCurrentIndex(indexFound)
         self.__globalsActivated(indexFound, moveCursor=False)
-        
+
         # step 2: search in members
         indexFound = 0
         for (lower, upper), index in self.__membersBoundaries.items():
             if upper == -1:
-                upper = 1000000     # it is the last line
+                upper = 1000000  # it is the last line
             if lower <= lineno <= upper:
                 indexFound = index
                 break
         self.__membersCombo.setCurrentIndex(indexFound)
         self.__membersActivated(indexFound, moveCursor=False)
-    
+
     #######################################################################
     ## Methods dealing with the source outline below
     #######################################################################
-    
+
     def __activateOutline(self, activate):
         """
         Private slot to activate the source outline view.
-        
+
         @param activate flag indicating to activate the source outline view
         @type bool
         """
         self.__sourceOutline.setActive(activate)
-        
+
         if activate:
             self.__sourceOutline.setVisible(
-                self.__sourceOutline.isSupportedLanguage(
-                    self.__editor.getLanguage()
-                )
+                self.__sourceOutline.isSupportedLanguage(self.__editor.getLanguage())
             )
-            
+
             self.__parseTimer.timeout.connect(self.__sourceOutline.repopulate)
             self.__editor.languageChanged.connect(self.__editorChanged)
             self.__editor.editorRenamed.connect(self.__editorChanged)
         else:
             self.__sourceOutline.hide()
-            
+
             with contextlib.suppress(TypeError):
-                self.__parseTimer.timeout.disconnect(
-                    self.__sourceOutline.repopulate)
+                self.__parseTimer.timeout.disconnect(self.__sourceOutline.repopulate)
                 self.__editor.languageChanged.disconnect(self.__editorChanged)
                 self.__editor.editorRenamed.disconnect(self.__editorChanged)
-    
+
     def __editorChanged(self):
         """
         Private slot handling changes of the editor language or file name.
         """
         supported = self.__sourceOutline.isSupportedLanguage(
-            self.__editor.getLanguage())
-        
+            self.__editor.getLanguage()
+        )
+
         self.__sourceOutline.setVisible(supported)
 
+
 #
 # eflag: noqa = Y113
--- a/src/eric7/QScintilla/EditorButtonsWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorButtonsWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,13 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QToolButton, QFrame, QMenu, QSizePolicy, QScrollArea
+    QWidget,
+    QVBoxLayout,
+    QToolButton,
+    QFrame,
+    QMenu,
+    QSizePolicy,
+    QScrollArea,
 )
 
 import UI.PixmapCache
@@ -26,103 +32,108 @@
     Class implementing a widget containing various buttons for accessing
     editor actions.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor
         @type Editor
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         margin = 2
         spacing = 3
-        
+
         self.__buttonsWidget = QWidget(self)
-        
+
         self.__layout = QVBoxLayout(self.__buttonsWidget)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__layout.setSpacing(spacing)
-        
+
         self.__provider = None
-        
+
         self.__editor = editor
         self.__editor.languageChanged.connect(self.__updateButtonStates)
         self.__editor.editorSaved.connect(self.__updateButtonStates)
         self.__editor.editorRenamed.connect(self.__updateButtonStates)
         self.__editor.selectionChanged.connect(self.__editorSelectionChanged)
         self.__editor.settingsRead.connect(self.__editorSettingsRead)
-        
+
         self.__createButtons()
-        
+
         self.__layout.addStretch()
-        
+
         self.__outerLayout = QVBoxLayout(self)
         self.__outerLayout.setContentsMargins(margin, margin, margin, margin)
         self.__outerLayout.setSpacing(spacing)
         self.__outerLayout.setAlignment(Qt.AlignmentFlag.AlignHCenter)
-        
+
         self.__upButton = QToolButton(self)
         self.__upButton.setArrowType(Qt.ArrowType.UpArrow)
         self.__upButton.setSizePolicy(
-            QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
+            QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum
+        )
         self.__upButton.setAutoRepeat(True)
-        
+
         self.__scroller = QScrollArea(self)
         self.__scroller.setWidget(self.__buttonsWidget)
         self.__scroller.setSizePolicy(
-            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.__scroller.setFrameShape(QFrame.Shape.NoFrame)
         self.__scroller.setVerticalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+            Qt.ScrollBarPolicy.ScrollBarAlwaysOff
+        )
         self.__scroller.setHorizontalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+            Qt.ScrollBarPolicy.ScrollBarAlwaysOff
+        )
         self.__scroller.setWidgetResizable(False)
-        
+
         self.__downButton = QToolButton(self)
         self.__downButton.setArrowType(Qt.ArrowType.DownArrow)
         self.__downButton.setSizePolicy(
-            QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
+            QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum
+        )
         self.__downButton.setAutoRepeat(True)
-        
+
         self.__outerLayout.addWidget(self.__upButton)
         self.__outerLayout.addWidget(self.__scroller)
         self.__outerLayout.addWidget(self.__downButton)
-        
+
         self.__upButton.clicked.connect(self.__slideUp)
         self.__downButton.clicked.connect(self.__slideDown)
-        
-        self.setMaximumWidth(
-            self.__buttons["bold"].sizeHint().width() + 2 * margin)
-        
+
+        self.setMaximumWidth(self.__buttons["bold"].sizeHint().width() + 2 * margin)
+
         self.__updateButtonStates()
 
     #######################################################################
     ## Methods below implement some event handlers
     #######################################################################
-    
+
     def show(self):
         """
         Public slot to show the widget.
         """
         super().show()
         self.__enableScrollerButtons()
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt reference to the resize event (QResizeEvent)
         """
         self.__enableScrollerButtons()
         super().resizeEvent(evt)
-    
+
     #######################################################################
     ## Methods below implement scroller related functions
     #######################################################################
-    
+
     def __enableScrollerButtons(self):
         """
         Private method to set the enabled state of the scroll buttons.
@@ -130,25 +141,25 @@
         scrollBar = self.__scroller.verticalScrollBar()
         self.__upButton.setEnabled(scrollBar.value() > 0)
         self.__downButton.setEnabled(scrollBar.value() < scrollBar.maximum())
-    
+
     def __slideUp(self):
         """
         Private slot to move the widget upwards, i.e. show contents to the
         bottom.
         """
         self.__slide(True)
-    
+
     def __slideDown(self):
         """
         Private slot to move the widget downwards, i.e. show contents to
         the top.
         """
         self.__slide(False)
-    
+
     def __slide(self, up):
         """
         Private method to move the sliding widget.
-        
+
         @param up flag indicating to move upwards (boolean)
         """
         scrollBar = self.__scroller.verticalScrollBar()
@@ -162,11 +173,11 @@
             newValue = scrollBar.maximum()
         scrollBar.setValue(newValue)
         self.__enableScrollerButtons()
-    
+
     #######################################################################
     ## Methods below implement the format button functions
     #######################################################################
-    
+
     def __createButtons(self):
         """
         Private slot to create the various tool buttons.
@@ -174,50 +185,43 @@
         self.__buttons = {}
         self.__separators = []
         self.__headerMenu = QMenu()
-        
-        self.__addButton("bold", "formatTextBold",
-                         self.tr("Bold"))
-        self.__addButton("italic", "formatTextItalic",
-                         self.tr("Italic"))
-        self.__addButton("strikethrough", "formatTextStrikethrough",
-                         self.tr("Strike Through"))
+
+        self.__addButton("bold", "formatTextBold", self.tr("Bold"))
+        self.__addButton("italic", "formatTextItalic", self.tr("Italic"))
+        self.__addButton(
+            "strikethrough", "formatTextStrikethrough", self.tr("Strike Through")
+        )
         self.__addSeparator()
-        self.__addButton("header1", "formatTextHeader1",
-                         self.tr("Header 1"))
-        self.__addButton("header2", "formatTextHeader2",
-                         self.tr("Header 2"))
-        self.__addButton("header3", "formatTextHeader3",
-                         self.tr("Header 3"))
-        button = self.__addButton("header", "formatTextHeader",
-                                  self.tr("Header"))
+        self.__addButton("header1", "formatTextHeader1", self.tr("Header 1"))
+        self.__addButton("header2", "formatTextHeader2", self.tr("Header 2"))
+        self.__addButton("header3", "formatTextHeader3", self.tr("Header 3"))
+        button = self.__addButton("header", "formatTextHeader", self.tr("Header"))
         button.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
         button.setMenu(self.__headerMenu)
         self.__addSeparator()
-        self.__addButton("code", "formatTextInlineCode",
-                         self.tr("Inline Code"))
-        self.__addButton("codeBlock", "formatTextCodeBlock",
-                         self.tr("Code Block"))
-        self.__addButton("quote", "formatTextQuote",
-                         self.tr("Quote"))
+        self.__addButton("code", "formatTextInlineCode", self.tr("Inline Code"))
+        self.__addButton("codeBlock", "formatTextCodeBlock", self.tr("Code Block"))
+        self.__addButton("quote", "formatTextQuote", self.tr("Quote"))
+        self.__addSeparator()
+        self.__addButton("hyperlink", "formatTextHyperlink", self.tr("Add Hyperlink"))
+        self.__addButton(
+            "line", "formatTextHorizontalLine", self.tr("Add Horizontal Line")
+        )
+        self.__addButton("image", "formatTextImage", self.tr("Add Image"))
         self.__addSeparator()
-        self.__addButton("hyperlink", "formatTextHyperlink",
-                         self.tr("Add Hyperlink"))
-        self.__addButton("line", "formatTextHorizontalLine",
-                         self.tr("Add Horizontal Line"))
-        self.__addButton("image", "formatTextImage",
-                         self.tr("Add Image"))
-        self.__addSeparator()
-        self.__addButton("bulletedList", "formatTextBulletedList",
-                         self.tr("Add Bulleted List"))
-        self.__addButton("numberedList", "formatTextNumberedList",
-                         self.tr("Add Numbered List"))
-        
+        self.__addButton(
+            "bulletedList", "formatTextBulletedList", self.tr("Add Bulleted List")
+        )
+        self.__addButton(
+            "numberedList", "formatTextNumberedList", self.tr("Add Numbered List")
+        )
+
         self.__headerMenu.triggered.connect(self.__headerMenuTriggered)
-    
+
     def __addButton(self, formatName, iconName, toolTip):
         """
         Private method to add a format button.
-        
+
         @param formatName unique name of the format
         @type str
         @param iconName name of the icon for the button
@@ -233,9 +237,9 @@
         button.clicked.connect(lambda: self.__formatClicked(formatName))
         self.__layout.addWidget(button)
         self.__buttons[formatName] = button
-        
+
         return button
-    
+
     def __addSeparator(self):
         """
         Private method to add a separator line.
@@ -247,27 +251,25 @@
         else:
             line.setFrameShape(QFrame.Shape.VLine)
         line.setFrameShadow(QFrame.Shadow.Sunken)
-        
+
         self.__layout.addWidget(line)
         self.__separators.append(line)
-    
+
     @pyqtSlot()
     def __updateButtonStates(self):
         """
         Private slot to change the button states.
         """
         provider = MarkupProviders.getMarkupProvider(self.__editor)
-        if (
-            self.__provider is None or
-            provider.kind() != self.__provider.kind()
-        ):
+        if self.__provider is None or provider.kind() != self.__provider.kind():
             self.__provider = provider
-            
+
             self.__buttons["bold"].setEnabled(self.__provider.hasBold())
             self.__buttons["italic"].setEnabled(self.__provider.hasItalic())
             self.__buttons["strikethrough"].setEnabled(
-                self.__provider.hasStrikethrough())
-            
+                self.__provider.hasStrikethrough()
+            )
+
             headerLevels = self.__provider.headerLevels()
             self.__buttons["header1"].setEnabled(headerLevels >= 1)
             self.__buttons["header2"].setEnabled(headerLevels >= 2)
@@ -275,28 +277,24 @@
             self.__buttons["header"].setEnabled(headerLevels > 3)
             self.__headerMenu.clear()
             for level in range(1, headerLevels + 1):
-                act = self.__headerMenu.addAction(
-                    self.tr("Level {0}").format(level))
+                act = self.__headerMenu.addAction(self.tr("Level {0}").format(level))
                 act.setData("header{0}".format(level))
-            
+
             self.__buttons["code"].setEnabled(self.__provider.hasCode())
-            self.__buttons["codeBlock"].setEnabled(
-                self.__provider.hasCodeBlock())
-            
-            self.__buttons["bulletedList"].setEnabled(
-                self.__provider.hasBulletedList())
-            self.__buttons["numberedList"].setEnabled(
-                self.__provider.hasNumberedList())
-            
+            self.__buttons["codeBlock"].setEnabled(self.__provider.hasCodeBlock())
+
+            self.__buttons["bulletedList"].setEnabled(self.__provider.hasBulletedList())
+            self.__buttons["numberedList"].setEnabled(self.__provider.hasNumberedList())
+
             self.__editorSelectionChanged()
-            
+
             if Preferences.getEditor("HideFormatButtons"):
                 self.setVisible(self.__provider.kind() != "none")
-    
+
     def __formatClicked(self, formatName):
         """
         Private slot to handle a format button being clicked.
-        
+
         @param formatName format type of the button
         @type str
         """
@@ -326,17 +324,17 @@
             self.__provider.bulletedList(self.__editor)
         elif formatName == "numberedList":
             self.__provider.numberedList(self.__editor)
-    
+
     def __headerMenuTriggered(self, act):
         """
         Private method handling the selection of a header menu entry.
-        
+
         @param act action of the headers menu that was triggered
         @type QAction
         """
         formatName = act.data()
         self.__formatClicked(formatName)
-    
+
     def __editorSelectionChanged(self):
         """
         Private slot to handle a change of the editor's selection.
@@ -344,17 +342,19 @@
         hasSelection = self.__editor.hasSelectedText()
         if self.__provider:
             self.__buttons["quote"].setEnabled(
-                self.__provider.hasQuote() and (
-                    self.__provider.kind() == "html" or hasSelection
-                )
+                self.__provider.hasQuote()
+                and (self.__provider.kind() == "html" or hasSelection)
             )
             self.__buttons["hyperlink"].setEnabled(
-                self.__provider.hasHyperlink() and not hasSelection)
+                self.__provider.hasHyperlink() and not hasSelection
+            )
             self.__buttons["line"].setEnabled(
-                self.__provider.hasLine() and not hasSelection)
+                self.__provider.hasLine() and not hasSelection
+            )
             self.__buttons["image"].setEnabled(
-                self.__provider.hasImage() and not hasSelection)
-    
+                self.__provider.hasImage() and not hasSelection
+            )
+
     def __editorSettingsRead(self):
         """
         Private slot to handle a change of the editor related settings.
--- a/src/eric7/QScintilla/EditorMarkerMap.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorMarkerMap.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,33 +16,35 @@
     """
     Class implementing a class for showing an editor marker map.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.setWhatsThis(self.tr(
-            """<b>Editor Map</b>"""
-            """<p>This shows a 'map' of the editor. The visible area is"""
-            """ highlighted by the box and all markers like bookmarks,"""
-            """ breakpoints, errors or changed lines are indicated"""
-            """ by differently colored lines configurable via the"""
-            """ Editor\u279dStyle page of the configuration dialog.</p>"""
-        ))
-        
+
+        self.setWhatsThis(
+            self.tr(
+                """<b>Editor Map</b>"""
+                """<p>This shows a 'map' of the editor. The visible area is"""
+                """ highlighted by the box and all markers like bookmarks,"""
+                """ breakpoints, errors or changed lines are indicated"""
+                """ by differently colored lines configurable via the"""
+                """ Editor\u279dStyle page of the configuration dialog.</p>"""
+            )
+        )
+
         # initialize colors for various markers
         self.initColors()
-    
+
     def initColors(self):
         """
         Public method to initialize the colors.
         """
-        self.setBackgroundColor(
-            Preferences.getEditorColour("MarkerMapBackground"))
-        
+        self.setBackgroundColor(Preferences.getEditorColour("MarkerMapBackground"))
+
         self.__bookmarkColor = Preferences.getEditorColour("BookmarksMap")
         self.__errorColor = Preferences.getEditorColour("ErrorsMap")
         self.__warningColor = Preferences.getEditorColour("WarningsMap")
@@ -51,16 +53,16 @@
         self.__coverageColor = Preferences.getEditorColour("CoverageMap")
         self.__changeColor = Preferences.getEditorColour("ChangesMap")
         self.__currentLineMarker = Preferences.getEditorColour("CurrentMap")
-        self.__searchMarkerColor = Preferences.getEditorColour(
-            "SearchMarkersMap")
+        self.__searchMarkerColor = Preferences.getEditorColour("SearchMarkersMap")
         self.__vcsConflictMarkerColor = Preferences.getEditorColour(
-            "VcsConflictMarkersMap")
+            "VcsConflictMarkersMap"
+        )
         self.update()
-    
+
     def __drawIndicator(self, line, painter, color):
         """
         Private method to draw an indicator.
-        
+
         @param line line number (integer)
         @param painter reference to the painter (QPainter)
         @param color color to be used (QColor)
@@ -70,54 +72,55 @@
         painter.setPen(color)
         painter.setBrush(color)
         painter.drawRect(self.generateIndicatorRect(position))
-    
+
     def _paintIt(self, painter):
         """
         Protected method for painting the widget's indicators.
-        
+
         @param painter reference to the painter object (QPainter)
         """
         # draw indicators in reverse order of priority
-        
+
         # 1. changes
         if Preferences.getEditor("ShowMarkerChanges"):
             for line in self._master.getChangeLines():
                 self.__drawIndicator(line, painter, self.__changeColor)
-        
+
         # 2. coverage
         if Preferences.getEditor("ShowMarkerCoverage"):
             for line in self._master.getCoverageLines():
                 self.__drawIndicator(line, painter, self.__coverageColor)
-        
+
         # 3. tasks
         for line in self._master.getTaskLines():
             self.__drawIndicator(line, painter, self.__taskColor)
-        
+
         # 4. breakpoints
         for line in self._master.getBreakpointLines():
             self.__drawIndicator(line, painter, self.__breakpointColor)
-        
+
         # 5. bookmarks
         for line in self._master.getBookmarkLines():
             self.__drawIndicator(line, painter, self.__bookmarkColor)
-        
+
         # 6. search markers
         if Preferences.getEditor("ShowMarkerSearch"):
             for line in self._master.getSearchIndicatorLines():
                 self.__drawIndicator(line, painter, self.__searchMarkerColor)
-        
+
         # 7. warnings
         for line in self._master.getWarningLines():
             self.__drawIndicator(line, painter, self.__warningColor)
-        
+
         # 8. VCS conflict markers
         for line in self._master.getVcsConflictMarkerLines():
             self.__drawIndicator(line, painter, self.__vcsConflictMarkerColor)
-        
+
         # 9. errors
         for line in self._master.getSyntaxErrorLines():
             self.__drawIndicator(line, painter, self.__errorColor)
-        
+
         # 10. current line
-        self.__drawIndicator(self._master.getCursorPosition()[0], painter,
-                             self.__currentLineMarker)
+        self.__drawIndicator(
+            self._master.getCursorPosition()[0], painter, self.__currentLineMarker
+        )
--- a/src/eric7/QScintilla/EditorOutline.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorOutline.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,14 +10,14 @@
 import contextlib
 
 from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication, QModelIndex, QPoint
-from PyQt6.QtWidgets import (
-    QTreeView, QAbstractItemView, QMenu, QApplication, QDialog
-)
+from PyQt6.QtWidgets import QTreeView, QAbstractItemView, QMenu, QApplication, QDialog
 
 from UI.BrowserSortFilterProxyModel import BrowserSortFilterProxyModel
 from UI.BrowserModel import (
-    BrowserImportsItem, BrowserGlobalsItem, BrowserClassAttributeItem,
-    BrowserImportItem
+    BrowserImportsItem,
+    BrowserGlobalsItem,
+    BrowserClassAttributeItem,
+    BrowserImportItem,
 )
 
 from .EditorOutlineModel import EditorOutlineModel
@@ -30,10 +30,11 @@
     Class implementing an outline widget for source code navigation of the
     editor.
     """
+
     def __init__(self, editor, populate=True, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor widget
         @type Editor
         @param populate flag indicating to populate the outline
@@ -42,45 +43,44 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__model = EditorOutlineModel(editor, populate=populate)
         self.__sortModel = BrowserSortFilterProxyModel()
         self.__sortModel.setSourceModel(self.__model)
         self.setModel(self.__sortModel)
-        
+
         self.setRootIsDecorated(True)
         self.setAlternatingRowColors(True)
-        
+
         header = self.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(True)
         header.setSectionsClickable(True)
         self.setHeaderHidden(True)
-        
+
         self.setSortingEnabled(True)
-        
+
         self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
-        
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
         self.__createPopupMenus()
-        
+
         self.activated.connect(self.__gotoItem)
         self.expanded.connect(self.__resizeColumns)
         self.collapsed.connect(self.__resizeColumns)
-        
+
         self.__resizeColumns()
-        
+
         self.__expandedNames = []
         self.__currentItemName = ""
         self.__signalsConnected = False
-    
+
     def setActive(self, active):
         """
         Public method to activate or deactivate the outline view.
-        
+
         @param active flag indicating the requested action
         @type bool
         """
@@ -90,38 +90,38 @@
             editor.languageChanged.connect(self.__editorLanguageChanged)
             editor.editorRenamed.connect(self.__editorRenamed)
             editor.cursorLineChanged.connect(self.__editorCursorLineChanged)
-            
+
             self.__model.repopulate()
             self.__resizeColumns()
-            
+
             line, _ = editor.getCursorPosition()
             self.__editorCursorLineChanged(line)
-        
+
         elif not active and self.__signalsConnected:
             editor = self.__model.editor()
             editor.refreshed.disconnect(self.repopulate)
             editor.languageChanged.disconnect(self.__editorLanguageChanged)
             editor.editorRenamed.disconnect(self.__editorRenamed)
             editor.cursorLineChanged.disconnect(self.__editorCursorLineChanged)
-            
+
             self.__model.clear()
-    
+
     @pyqtSlot()
     def __resizeColumns(self):
         """
         Private slot to resize the view when items get expanded or collapsed.
         """
         self.resizeColumnToContents(0)
-    
+
     def isPopulated(self):
         """
         Public method to check, if the model is populated.
-        
+
         @return flag indicating a populated model
         @rtype bool
         """
         return self.__model.isPopulated()
-    
+
     @pyqtSlot()
     def repopulate(self):
         """
@@ -131,7 +131,7 @@
             self.__prepareRepopulate()
             self.__model.repopulate()
             self.__completeRepopulate()
-    
+
     @pyqtSlot()
     def __prepareRepopulate(self):
         """
@@ -140,16 +140,15 @@
         itm = self.__currentItem()
         if itm is not None:
             self.__currentItemName = itm.data(0)
-            
+
         self.__expandedNames = []
-        
+
         childIndex = self.model().index(0, 0)
         while childIndex.isValid():
             if self.isExpanded(childIndex):
-                self.__expandedNames.append(
-                    self.model().item(childIndex).data(0))
+                self.__expandedNames.append(self.model().item(childIndex).data(0))
             childIndex = self.indexBelow(childIndex)
-    
+
     @pyqtSlot()
     def __completeRepopulate(self):
         """
@@ -158,32 +157,32 @@
         childIndex = self.model().index(0, 0)
         while childIndex.isValid():
             name = self.model().item(childIndex).data(0)
-            if (self.__currentItemName and self.__currentItemName == name):
+            if self.__currentItemName and self.__currentItemName == name:
                 self.setCurrentIndex(childIndex)
             if name in self.__expandedNames:
                 self.setExpanded(childIndex, True)
             childIndex = self.indexBelow(childIndex)
         self.__resizeColumns()
-        
+
         self.__expandedNames = []
         self.__currentItemName = ""
-    
+
     def isSupportedLanguage(self, language):
         """
         Public method to check, if outlining a given language is supported.
-        
+
         @param language source language to be checked
         @type str
         @return flag indicating support
         @rtype bool
         """
         return language in EditorOutlineModel.SupportedLanguages
-    
+
     @pyqtSlot(QModelIndex)
     def __gotoItem(self, index):
         """
         Private slot to set the editor cursor.
-        
+
         @param index index of the item to set the cursor for
         @type QModelIndex
         """
@@ -193,14 +192,14 @@
                 with contextlib.suppress(AttributeError):
                     lineno = itm.lineno()
                     self.__model.editor().gotoLine(lineno)
-    
+
     def mouseDoubleClickEvent(self, mouseEvent):
         """
         Protected method of QAbstractItemView.
-        
+
         Reimplemented to disable expanding/collapsing of items when
         double-clicking. Instead the double-clicked entry is opened.
-        
+
         @param mouseEvent the mouse event (QMouseEvent)
         """
         index = self.indexAt(mouseEvent.position().toPoint())
@@ -210,21 +209,21 @@
                 self.setExpanded(index, not self.isExpanded(index))
             else:
                 self.__gotoItem(index)
-        
+
     def __currentItem(self):
         """
         Private method to get a reference to the current item.
-        
+
         @return reference to the current item
         @rtype BrowserItem
         """
         itm = self.model().item(self.currentIndex())
         return itm
-    
+
     #######################################################################
     ## Context menu methods below
     #######################################################################
-    
+
     def __createPopupMenus(self):
         """
         Private method to generate the various popup menus.
@@ -232,149 +231,146 @@
         # create the popup menu for general use
         self.__menu = QMenu(self)
         self.__menu.addAction(
-            QCoreApplication.translate('EditorOutlineView', 'Goto'),
-            self.__goto)
+            QCoreApplication.translate("EditorOutlineView", "Goto"), self.__goto
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
-            QCoreApplication.translate('EditorOutlineView', 'Refresh'),
-            self.repopulate)
+            QCoreApplication.translate("EditorOutlineView", "Refresh"), self.repopulate
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Copy Path to Clipboard'),
-            self.__copyToClipboard)
+            QCoreApplication.translate("EditorOutlineView", "Copy Path to Clipboard"),
+            self.__copyToClipboard,
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Expand All'),
-            lambda: self.expandToDepth(-1))
+            QCoreApplication.translate("EditorOutlineView", "Expand All"),
+            lambda: self.expandToDepth(-1),
+        )
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Collapse All'),
-            self.collapseAll)
+            QCoreApplication.translate("EditorOutlineView", "Collapse All"),
+            self.collapseAll,
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Increment Width'),
-            self.__incWidth)
+            QCoreApplication.translate("EditorOutlineView", "Increment Width"),
+            self.__incWidth,
+        )
         self.__decWidthAct = self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Decrement Width'),
-            self.__decWidth)
+            QCoreApplication.translate("EditorOutlineView", "Decrement Width"),
+            self.__decWidth,
+        )
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Set to Default Width'),
-            self.__defaultWidth)
+            QCoreApplication.translate("EditorOutlineView", "Set to Default Width"),
+            self.__defaultWidth,
+        )
         self.__menu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Change Default Width'),
-            self.__changeDefaultWidth)
-        
+            QCoreApplication.translate("EditorOutlineView", "Change Default Width"),
+            self.__changeDefaultWidth,
+        )
+
         # create the attribute/import menu
         self.__gotoMenu = QMenu(
-            QCoreApplication.translate('EditorOutlineView', "Goto"),
-            self)
+            QCoreApplication.translate("EditorOutlineView", "Goto"), self
+        )
         self.__gotoMenu.aboutToShow.connect(self.__showGotoMenu)
         self.__gotoMenu.triggered.connect(self.__gotoAttribute)
-        
+
         self.__attributeMenu = QMenu(self)
         self.__attributeMenu.addMenu(self.__gotoMenu)
         self.__attributeMenu.addSeparator()
         self.__attributeMenu.addAction(
-            QCoreApplication.translate('EditorOutlineView', 'Refresh'),
-            self.repopulate)
+            QCoreApplication.translate("EditorOutlineView", "Refresh"), self.repopulate
+        )
         self.__attributeMenu.addSeparator()
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Copy Path to Clipboard'),
-            self.__copyToClipboard)
+            QCoreApplication.translate("EditorOutlineView", "Copy Path to Clipboard"),
+            self.__copyToClipboard,
+        )
         self.__attributeMenu.addSeparator()
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Expand All'),
-            lambda: self.expandToDepth(-1))
+            QCoreApplication.translate("EditorOutlineView", "Expand All"),
+            lambda: self.expandToDepth(-1),
+        )
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Collapse All'),
-            self.collapseAll)
+            QCoreApplication.translate("EditorOutlineView", "Collapse All"),
+            self.collapseAll,
+        )
         self.__attributeMenu.addSeparator()
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Increment Width'),
-            self.__incWidth)
+            QCoreApplication.translate("EditorOutlineView", "Increment Width"),
+            self.__incWidth,
+        )
         self.__attributeDecWidthAct = self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Decrement Width'),
-            self.__decWidth)
+            QCoreApplication.translate("EditorOutlineView", "Decrement Width"),
+            self.__decWidth,
+        )
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Set to Default Width'),
-            self.__defaultWidth)
+            QCoreApplication.translate("EditorOutlineView", "Set to Default Width"),
+            self.__defaultWidth,
+        )
         self.__attributeMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Change Default Width'),
-            self.__changeDefaultWidth)
-        
+            QCoreApplication.translate("EditorOutlineView", "Change Default Width"),
+            self.__changeDefaultWidth,
+        )
+
         # create the background menu
         self.__backMenu = QMenu(self)
         self.__backMenu.addAction(
-            QCoreApplication.translate('EditorOutlineView', 'Refresh'),
-            self.repopulate)
+            QCoreApplication.translate("EditorOutlineView", "Refresh"), self.repopulate
+        )
         self.__backMenu.addSeparator()
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Copy Path to Clipboard'),
-            self.__copyToClipboard)
+            QCoreApplication.translate("EditorOutlineView", "Copy Path to Clipboard"),
+            self.__copyToClipboard,
+        )
         self.__backMenu.addSeparator()
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Expand All'),
-            lambda: self.expandToDepth(-1))
+            QCoreApplication.translate("EditorOutlineView", "Expand All"),
+            lambda: self.expandToDepth(-1),
+        )
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Collapse All'),
-            self.collapseAll)
+            QCoreApplication.translate("EditorOutlineView", "Collapse All"),
+            self.collapseAll,
+        )
         self.__backMenu.addSeparator()
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Increment Width'),
-            self.__incWidth)
+            QCoreApplication.translate("EditorOutlineView", "Increment Width"),
+            self.__incWidth,
+        )
         self.__backDecWidthAct = self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Decrement Width'),
-            self.__decWidth)
+            QCoreApplication.translate("EditorOutlineView", "Decrement Width"),
+            self.__decWidth,
+        )
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Set to Default Width'),
-            self.__defaultWidth)
+            QCoreApplication.translate("EditorOutlineView", "Set to Default Width"),
+            self.__defaultWidth,
+        )
         self.__backMenu.addAction(
-            QCoreApplication.translate(
-                'EditorOutlineView', 'Change Default Width'),
-            self.__changeDefaultWidth)
-    
+            QCoreApplication.translate("EditorOutlineView", "Change Default Width"),
+            self.__changeDefaultWidth,
+        )
+
     @pyqtSlot(QPoint)
     def __contextMenuRequested(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord position of the mouse pointer
         @type QPoint
         """
         index = self.indexAt(coord)
         coord = self.mapToGlobal(coord)
-        
-        decWidthEnable = (
-            self.maximumWidth() !=
-            2 * Preferences.getEditor("SourceOutlineStepSize")
+
+        decWidthEnable = self.maximumWidth() != 2 * Preferences.getEditor(
+            "SourceOutlineStepSize"
         )
-        
+
         if index.isValid():
             self.setCurrentIndex(index)
-            
+
             itm = self.model().item(index)
-            if isinstance(
-                itm, (BrowserClassAttributeItem, BrowserImportItem)
-            ):
+            if isinstance(itm, (BrowserClassAttributeItem, BrowserImportItem)):
                 self.__attributeDecWidthAct.setEnabled(decWidthEnable)
                 self.__attributeMenu.popup(coord)
             else:
@@ -383,14 +379,14 @@
         else:
             self.__backDecWidthAct.setEnabled(decWidthEnable)
             self.__backMenu.popup(coord)
-    
+
     @pyqtSlot()
     def __showGotoMenu(self):
         """
         Private slot to prepare the goto submenu of the attribute menu.
         """
         self.__gotoMenu.clear()
-        
+
         itm = self.model().item(self.currentIndex())
         try:
             linenos = itm.linenos()
@@ -399,56 +395,57 @@
                 linenos = [itm.lineno()]
             except AttributeError:
                 return
-        
+
         for lineno in sorted(linenos):
             act = self.__gotoMenu.addAction(
-                QCoreApplication.translate(
-                    'EditorOutlineView', "Line {0}").format(lineno))
+                QCoreApplication.translate("EditorOutlineView", "Line {0}").format(
+                    lineno
+                )
+            )
             act.setData(lineno)
-    
+
     #######################################################################
     ## Context menu handlers below
     #######################################################################
-    
+
     @pyqtSlot()
     def __gotoAttribute(self, act):
         """
         Private slot to handle the selection of the goto menu.
-        
+
         @param act reference to the action (EricAction)
         """
         lineno = act.data()
         self.__model.editor().gotoLine(lineno)
-    
+
     @pyqtSlot()
     def __goto(self):
         """
         Private slot to move the editor cursor to the line of the context item.
         """
         self.__gotoItem(self.currentIndex())
-    
+
     @pyqtSlot()
     def __copyToClipboard(self):
         """
         Private slot to copy the file name of the editor to the clipboard.
         """
         fn = self.__model.fileName()
-        
+
         if fn:
             cb = QApplication.clipboard()
             cb.setText(fn)
-    
+
     @pyqtSlot()
     def __incWidth(self):
         """
         Private slot to increment the width of the outline.
         """
         self.setMaximumWidth(
-            self.maximumWidth() +
-            Preferences.getEditor("SourceOutlineStepSize")
+            self.maximumWidth() + Preferences.getEditor("SourceOutlineStepSize")
         )
         self.updateGeometry()
-    
+
     @pyqtSlot()
     def __decWidth(self):
         """
@@ -456,10 +453,10 @@
         """
         stepSize = Preferences.getEditor("SourceOutlineStepSize")
         newWidth = self.maximumWidth() - stepSize
-        
+
         self.setMaximumWidth(max(newWidth, 2 * stepSize))
         self.updateGeometry()
-    
+
     @pyqtSlot()
     def __defaultWidth(self):
         """
@@ -467,7 +464,7 @@
         """
         self.setMaximumWidth(Preferences.getEditor("SourceOutlineWidth"))
         self.updateGeometry()
-    
+
     @pyqtSlot()
     def __changeDefaultWidth(self):
         """
@@ -475,25 +472,25 @@
         size presetting the width with the current value.
         """
         from .EditorOutlineSizesDialog import EditorOutlineSizesDialog
-        
+
         stepSize = Preferences.getEditor("SourceOutlineStepSize")
         defaultWidth = Preferences.getEditor("SourceOutlineWidth")
         currentWidth = self.maximumWidth()
-        
+
         dlg = EditorOutlineSizesDialog(currentWidth, defaultWidth, stepSize)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             newDefaultWidth, stepSize = dlg.getSizes()
-            
+
             Preferences.setEditor("SourceOutlineWidth", newDefaultWidth)
             Preferences.setEditor("SourceOutlineStepSize", stepSize)
-            
+
             if newDefaultWidth != currentWidth:
                 self.__defaultWidth()
-    
+
     #######################################################################
     ## Methods handling editor signals below
     #######################################################################
-    
+
     @pyqtSlot()
     def __editorLanguageChanged(self):
         """
@@ -502,7 +499,7 @@
         """
         self.__model.repopulate()
         self.__resizeColumns()
-    
+
     @pyqtSlot()
     def __editorRenamed(self):
         """
@@ -510,12 +507,12 @@
         """
         self.__model.repopulate()
         self.__resizeColumns()
-    
+
     @pyqtSlot(int)
     def __editorCursorLineChanged(self, lineno):
         """
         Private method to highlight a node given its line number.
-        
+
         @param lineno zero based line number of the item
         @type int
         """
--- a/src/eric7/QScintilla/EditorOutlineModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorOutlineModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,9 +13,15 @@
 from PyQt6.QtCore import QCoreApplication, QModelIndex
 
 from UI.BrowserModel import (
-    BrowserModel, BrowserItem, BrowserClassItem, BrowserCodingItem,
-    BrowserGlobalsItem, BrowserImportsItem, BrowserImportItem,
-    BrowserClassAttributesItem, BrowserMethodItem
+    BrowserModel,
+    BrowserItem,
+    BrowserClassItem,
+    BrowserCodingItem,
+    BrowserGlobalsItem,
+    BrowserImportsItem,
+    BrowserImportItem,
+    BrowserClassAttributesItem,
+    BrowserMethodItem,
 )
 
 import Preferences
@@ -25,83 +31,98 @@
     """
     Class implementing the editor outline model.
     """
+
     SupportedLanguages = (
-        "IDL", "JavaScript", "Protocol", "Python3", "MicroPython", "Cython",
+        "IDL",
+        "JavaScript",
+        "Protocol",
+        "Python3",
+        "MicroPython",
+        "Cython",
         "Ruby",
     )
-    
+
     def __init__(self, editor, populate=True):
         """
         Constructor
-        
+
         @param editor reference to the editor containing the source text
         @type Editor
         @param populate flag indicating to populate the outline
         @type bool
         """
         super().__init__(nopopulate=True)
-        
+
         self.__editor = editor
-        
+
         self.__populated = False
-        
+
         rootData = QCoreApplication.translate("EditorOutlineModel", "Name")
         self.rootItem = BrowserItem(None, rootData)
-        
+
         if populate:
             self.__populateModel()
-    
+
     def __populateModel(self, repopulate=False):
         """
         Private slot to populate the model.
-        
+
         @param repopulate flag indicating a repopulation
         @type bool
         """
         self.__filename = self.__editor.getFileName()
         self.__module = os.path.basename(self.__filename)
-        
+
         language = self.__editor.getLanguage()
         if language in EditorOutlineModel.SupportedLanguages:
             if language == "IDL":
                 from Utilities.ClassBrowsers import idlclbr
+
                 dictionary = idlclbr.scan(
-                    self.__editor.text(), self.__filename, self.__module)
+                    self.__editor.text(), self.__filename, self.__module
+                )
                 idlclbr._modules.clear()
             elif language == "Protocol":
                 from Utilities.ClassBrowsers import protoclbr
+
                 dictionary = protoclbr.scan(
-                    self.__editor.text(), self.__filename, self.__module)
+                    self.__editor.text(), self.__filename, self.__module
+                )
                 protoclbr._modules.clear()
             elif language == "Ruby":
                 from Utilities.ClassBrowsers import rbclbr
+
                 dictionary = rbclbr.scan(
-                    self.__editor.text(), self.__filename, self.__module)
+                    self.__editor.text(), self.__filename, self.__module
+                )
                 rbclbr._modules.clear()
             elif language == "JavaScript":
                 from Utilities.ClassBrowsers import jsclbr
+
                 dictionary = jsclbr.scan(
-                    self.__editor.text(), self.__filename, self.__module)
+                    self.__editor.text(), self.__filename, self.__module
+                )
                 jsclbr._modules.clear()
             elif language in ("Python3", "MicroPython", "Cython"):
                 from Utilities.ClassBrowsers import pyclbr
+
                 dictionary = pyclbr.scan(
-                    self.__editor.text(), self.__filename, self.__module)
+                    self.__editor.text(), self.__filename, self.__module
+                )
                 pyclbr._modules.clear()
-            
+
             keys = list(dictionary.keys())
             if len(keys) > 0:
                 parentItem = self.rootItem
-                
+
                 if repopulate:
                     last = len(keys) - 1
-                    if (
-                        "@@Coding@@" in keys and
-                        not Preferences.getEditor("SourceOutlineShowCoding")
+                    if "@@Coding@@" in keys and not Preferences.getEditor(
+                        "SourceOutlineShowCoding"
                     ):
                         last -= 1
                     self.beginInsertRows(QModelIndex(), 0, last)
-                
+
                 for key in keys:
                     if key.startswith("@@"):
                         # special treatment done later
@@ -109,32 +130,31 @@
                     cl = dictionary[key]
                     with contextlib.suppress(AttributeError):
                         if cl.module == self.__module:
-                            node = BrowserClassItem(
-                                parentItem, cl, self.__filename)
+                            node = BrowserClassItem(parentItem, cl, self.__filename)
                             self._addItem(node, parentItem)
-                if (
-                    "@@Coding@@" in keys and
-                    Preferences.getEditor("SourceOutlineShowCoding")
+                if "@@Coding@@" in keys and Preferences.getEditor(
+                    "SourceOutlineShowCoding"
                 ):
                     node = BrowserCodingItem(
                         parentItem,
                         QCoreApplication.translate(
-                            "EditorOutlineModel", "Coding: {0}")
-                        .format(dictionary["@@Coding@@"].coding),
-                        dictionary["@@Coding@@"].linenumber)
+                            "EditorOutlineModel", "Coding: {0}"
+                        ).format(dictionary["@@Coding@@"].coding),
+                        dictionary["@@Coding@@"].linenumber,
+                    )
                     self._addItem(node, parentItem)
                 if "@@Globals@@" in keys:
                     node = BrowserGlobalsItem(
                         parentItem,
                         dictionary["@@Globals@@"].globals,
-                        QCoreApplication.translate(
-                            "EditorOutlineModel", "Globals"))
+                        QCoreApplication.translate("EditorOutlineModel", "Globals"),
+                    )
                     self._addItem(node, parentItem)
                 if "@@Import@@" in keys or "@@ImportFrom@@" in keys:
                     node = BrowserImportsItem(
                         parentItem,
-                        QCoreApplication.translate(
-                            "EditorOutlineModel", "Imports"))
+                        QCoreApplication.translate("EditorOutlineModel", "Imports"),
+                    )
                     self._addItem(node, parentItem)
                     if "@@Import@@" in keys:
                         for importedModule in (
@@ -144,74 +164,78 @@
                                 node,
                                 importedModule.importedModuleName,
                                 importedModule.file,
-                                importedModule.linenos)
+                                importedModule.linenos,
+                            )
                             self._addItem(m_node, node)
-                            for importedName, linenos in (
-                                importedModule.importedNames.items()
-                            ):
+                            for (
+                                importedName,
+                                linenos,
+                            ) in importedModule.importedNames.items():
                                 mn_node = BrowserImportItem(
                                     m_node,
                                     importedName,
                                     importedModule.file,
                                     linenos,
-                                    isModule=False)
+                                    isModule=False,
+                                )
                                 self._addItem(mn_node, m_node)
                 if repopulate:
                     self.endInsertRows()
-            
+
             self.__populated = True
         else:
             self.clear()
             self.__populated = False
-    
+
     def isPopulated(self):
         """
         Public method to check, if the model is populated.
-        
+
         @return flag indicating a populated model
         @rtype bool
         """
         return self.__populated
-    
+
     def repopulate(self):
         """
         Public slot to repopulate the model.
         """
         self.clear()
         self.__populateModel(repopulate=True)
-    
+
     def editor(self):
         """
         Public method to retrieve a reference to the editor.
-        
+
         @return reference to the editor
         @rtype Editor
         """
         return self.__editor
-    
+
     def fileName(self):
         """
         Public method to retrieve the file name of the editor.
-        
+
         @return file name of the editor
         @rtype str
         """
         return self.__filename
-    
+
     def itemIndexByLine(self, lineno):
         """
         Public method to find an item's index given a line number.
-        
+
         @param lineno one based line number of the item
         @type int
         @return index of the item found
         @rtype QModelIndex
         """
+
         def findItem(lineno, parent):
             """
             Function to iteratively search for an item containing the given
             line.
-            
+
             @param lineno one based line number of the item
             @type int
             @param parent reference to the parent item
@@ -232,7 +256,7 @@
                 elif isinstance(child, (BrowserClassItem, BrowserMethodItem)):
                     start, end = child.boundaries()
                     if end == -1:
-                        end = 1000000   # assume end of file
+                        end = 1000000  # assume end of file
                     if start <= lineno <= end:
                         itm = findItem(lineno, child)
                         if itm is not None:
@@ -242,36 +266,32 @@
                 elif hasattr(child, "linenos"):
                     if lineno in child.linenos():
                         return child
-                elif (
-                    hasattr(child, "lineno") and
-                    lineno == child.lineno()
-                ):
+                elif hasattr(child, "lineno") and lineno == child.lineno():
                     return child
             else:
                 return None
-        
+
         if self.__populated:
             for rootChild in self.rootItem.children():
                 itm = None
                 if isinstance(rootChild, BrowserClassItem):
                     start, end = rootChild.boundaries()
                     if end == -1:
-                        end = 1000000   # assume end of file
+                        end = 1000000  # assume end of file
                     if start <= lineno <= end:
                         itm = findItem(lineno, rootChild)
                         if itm is None:
                             itm = rootChild
-                elif isinstance(rootChild,
-                                (BrowserImportsItem, BrowserGlobalsItem)):
+                elif isinstance(rootChild, (BrowserImportsItem, BrowserGlobalsItem)):
                     itm = findItem(lineno, rootChild)
                 elif (
-                    isinstance(rootChild, BrowserCodingItem) and
-                    lineno == rootChild.lineno()
+                    isinstance(rootChild, BrowserCodingItem)
+                    and lineno == rootChild.lineno()
                 ):
                     itm = rootChild
                 if itm is not None:
                     return self.createIndex(itm.row(), 0, itm)
             else:
                 return QModelIndex()
-        
+
         return QModelIndex()
--- a/src/eric7/QScintilla/EditorOutlineSizesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/EditorOutlineSizesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,11 @@
     Class implementing a dialog to change the default size settings of the
     Source Outline pane.
     """
-    def __init__(self, currentWidth, defaultWidth, defaultStepSize,
-                 parent=None):
+
+    def __init__(self, currentWidth, defaultWidth, defaultStepSize, parent=None):
         """
         Constructor
-        
+
         @param currentWidth value of the current width
         @type int
         @param defaultWidth value of the default width
@@ -35,21 +35,21 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__defaultWidth = defaultWidth
         self.__defaultStepSize = defaultStepSize
-        
+
         self.sourceOutlineWidthSpinBox.setValue(currentWidth)
         self.sourceOutlineWidthStepSpinBox.setValue(defaultStepSize)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the selection of a dialog button.
-        
+
         @param button reference to the clicked button
         @type QAbstractButton
         """
@@ -58,15 +58,15 @@
         ):
             self.sourceOutlineWidthSpinBox.setValue(self.__defaultWidth)
             self.sourceOutlineWidthStepSpinBox.setValue(self.__defaultStepSize)
-    
+
     def getSizes(self):
         """
         Public method to retrieve the entered values.
-        
+
         @return tuple containing the values of the default width and step size
         @rtype tuple of (int, int)
         """
         return (
             self.sourceOutlineWidthSpinBox.value(),
-            self.sourceOutlineWidthStepSpinBox.value()
+            self.sourceOutlineWidthStepSpinBox.value(),
         )
--- a/src/eric7/QScintilla/Exporters/ExporterBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,34 +18,36 @@
     """
     Class implementing the exporter base class.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         super().__init__(parent)
         self.editor = editor
-    
+
     def _getFileName(self, fileFilter):
         """
         Protected method to get the file name of the export file from the user.
-        
+
         @param fileFilter the filter string to be used (string). The filter for
             "All Files (*)" is appended by this method.
         @return file name entered by the user (string)
         """
         fileFilter += ";;"
-        fileFilter += QCoreApplication.translate('Exporter', "All Files (*)")
+        fileFilter += QCoreApplication.translate("Exporter", "All Files (*)")
         fn, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self.editor,
-            QCoreApplication.translate('Exporter', "Export source"),
+            QCoreApplication.translate("Exporter", "Export source"),
             "",
             fileFilter,
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if fn:
             fpath = pathlib.Path(fn)
             if not fpath.suffix:
@@ -55,24 +57,24 @@
             if fpath.exists():
                 res = EricMessageBox.yesNo(
                     self.editor,
-                    QCoreApplication.translate(
-                        'Exporter', "Export source"),
+                    QCoreApplication.translate("Exporter", "Export source"),
                     QCoreApplication.translate(
-                        'Exporter',
-                        "<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                    icon=EricMessageBox.Warning)
+                        "Exporter",
+                        "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>",
+                    ).format(fpath),
+                    icon=EricMessageBox.Warning,
+                )
                 if not res:
                     return ""
-        
+
         return str(fpath)
-    
+
     def exportSource(self):
         """
         Public method performing the export.
-        
+
         This method must be overridden by the real exporters.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by a subclass
         """
--- a/src/eric7/QScintilla/Exporters/ExporterHTML.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterHTML.py	Wed Jul 13 14:55:47 2022 +0200
@@ -32,19 +32,27 @@
     """
     Class implementing an HTML generator for exporting source code.
     """
+
     def __init__(self, editor):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         """
         self.editor = editor
-    
-    def generate(self, tabSize=4, useTabs=False, wysiwyg=True, folding=False,
-                 onlyStylesUsed=False, titleFullPath=False):
+
+    def generate(
+        self,
+        tabSize=4,
+        useTabs=False,
+        wysiwyg=True,
+        folding=False,
+        onlyStylesUsed=False,
+        titleFullPath=False,
+    ):
         """
         Public method to generate HTML for the source editor.
-        
+
         @param tabSize size of tabs (integer)
         @param useTabs flag indicating the use of tab characters (boolean)
         @param wysiwyg flag indicating colorization (boolean)
@@ -56,7 +64,7 @@
         @return generated HTML text (string)
         """
         self.editor.recolor(0, -1)
-        
+
         lengthDoc = self.editor.length()
         styleIsUsed = {}
         if onlyStylesUsed:
@@ -71,125 +79,122 @@
             for index in range(QsciScintilla.STYLE_MAX + 1):
                 styleIsUsed[index] = True
         styleIsUsed[QsciScintilla.STYLE_DEFAULT] = True
-        
+
         html = (
-            '''<!DOCTYPE html PUBLIC "-//W3C//DTD'''
-            ''' XHTML 1.0 Transitional//EN"\n'''
-            ''' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'''
-            '''\n'''
-            '''<html xmlns="http://www.w3.org/1999/xhtml">\n'''
-            '''<head>\n'''
+            """<!DOCTYPE html PUBLIC "-//W3C//DTD"""
+            """ XHTML 1.0 Transitional//EN"\n"""
+            """ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">"""
+            """\n"""
+            """<html xmlns="http://www.w3.org/1999/xhtml">\n"""
+            """<head>\n"""
         )
         if titleFullPath:
-            html += '''<title>{0}</title>\n'''.format(
-                self.editor.getFileName())
+            html += """<title>{0}</title>\n""".format(self.editor.getFileName())
         else:
-            html += '''<title>{0}</title>\n'''.format(
-                os.path.basename(self.editor.getFileName()))
+            html += """<title>{0}</title>\n""".format(
+                os.path.basename(self.editor.getFileName())
+            )
         html += (
-            '''<meta name="Generator" content="eric" />\n'''
-            '''<meta http-equiv="Content-Type" '''
-            '''content="text/html; charset=utf-8" />\n'''
+            """<meta name="Generator" content="eric" />\n"""
+            """<meta http-equiv="Content-Type" """
+            """content="text/html; charset=utf-8" />\n"""
         )
         if folding:
             html += (
-                '''<script language="JavaScript" type="text/javascript">\n'''
-                '''<!--\n'''
-                '''function symbol(id, sym) {\n'''
-                '''  if (id.textContent == undefined) {\n'''
-                '''    id.innerText = sym;\n'''
-                '''  } else {\n'''
-                '''    id.textContent = sym;\n'''
-                '''  }\n'''
-                '''}\n'''
-                '''function toggle(id) {\n'''
-                '''  var thislayer = document.getElementById('ln' + id);\n'''
-                '''  id -= 1;\n'''
-                '''  var togline = document.getElementById('hd' + id);\n'''
-                '''  var togsym = document.getElementById('bt' + id);\n'''
-                '''  if (thislayer.style.display == 'none') {\n'''
-                '''    thislayer.style.display = 'block';\n'''
-                '''    togline.style.textDecoration = 'none';\n'''
-                '''    symbol(togsym, '- ');\n'''
-                '''  } else {\n'''
-                '''    thislayer.style.display = 'none';\n'''
-                '''    togline.style.textDecoration = 'underline';\n'''
-                '''    symbol(togsym, '+ ');\n'''
-                '''  }\n'''
-                '''}\n'''
-                '''//-->\n'''
-                '''</script>\n'''
+                """<script language="JavaScript" type="text/javascript">\n"""
+                """<!--\n"""
+                """function symbol(id, sym) {\n"""
+                """  if (id.textContent == undefined) {\n"""
+                """    id.innerText = sym;\n"""
+                """  } else {\n"""
+                """    id.textContent = sym;\n"""
+                """  }\n"""
+                """}\n"""
+                """function toggle(id) {\n"""
+                """  var thislayer = document.getElementById('ln' + id);\n"""
+                """  id -= 1;\n"""
+                """  var togline = document.getElementById('hd' + id);\n"""
+                """  var togsym = document.getElementById('bt' + id);\n"""
+                """  if (thislayer.style.display == 'none') {\n"""
+                """    thislayer.style.display = 'block';\n"""
+                """    togline.style.textDecoration = 'none';\n"""
+                """    symbol(togsym, '- ');\n"""
+                """  } else {\n"""
+                """    thislayer.style.display = 'none';\n"""
+                """    togline.style.textDecoration = 'underline';\n"""
+                """    symbol(togsym, '+ ');\n"""
+                """  }\n"""
+                """}\n"""
+                """//-->\n"""
+                """</script>\n"""
             )
-        
+
         lex = self.editor.getLexer()
         bgColour = (
             lex.paper(QsciScintilla.STYLE_DEFAULT).name()
-            if lex else
-            self.editor.paper().name()
+            if lex
+            else self.editor.paper().name()
         )
-        
-        html += '''<style type="text/css">\n'''
+
+        html += """<style type="text/css">\n"""
         if lex:
             istyle = 0
             while istyle <= QsciScintilla.STYLE_MAX:
                 if (
-                    (istyle <= QsciScintilla.STYLE_DEFAULT or
-                     istyle > QsciScintilla.STYLE_LASTPREDEFINED) and
-                    styleIsUsed[istyle]
-                ):
-                    if (
-                        lex.description(istyle) or
-                        istyle == QsciScintilla.STYLE_DEFAULT
-                    ):
+                    istyle <= QsciScintilla.STYLE_DEFAULT
+                    or istyle > QsciScintilla.STYLE_LASTPREDEFINED
+                ) and styleIsUsed[istyle]:
+                    if lex.description(istyle) or istyle == QsciScintilla.STYLE_DEFAULT:
                         font = lex.font(istyle)
                         colour = lex.color(istyle)
                         paper = lex.paper(istyle)
                         if istyle == QsciScintilla.STYLE_DEFAULT:
-                            html += '''span {\n'''
+                            html += """span {\n"""
                         else:
-                            html += '''.S{0:d} {{\n'''.format(istyle)
+                            html += """.S{0:d} {{\n""".format(istyle)
                         if font.italic():
-                            html += '''    font-style: italic;\n'''
+                            html += """    font-style: italic;\n"""
                         if font.bold():
-                            html += '''    font-weight: bold;\n'''
+                            html += """    font-weight: bold;\n"""
                         if wysiwyg:
-                            html += '''    font-family: '{0}';\n'''.format(
-                                    font.family())
-                        html += '''    color: {0};\n'''.format(colour.name())
+                            html += """    font-family: '{0}';\n""".format(
+                                font.family()
+                            )
+                        html += """    color: {0};\n""".format(colour.name())
                         if (
-                            istyle != QsciScintilla.STYLE_DEFAULT and
-                            bgColour != paper.name()
+                            istyle != QsciScintilla.STYLE_DEFAULT
+                            and bgColour != paper.name()
                         ):
-                            html += '''    background: {0};\n'''.format(
-                                    paper.name())
-                            html += '''    text-decoration: inherit;\n'''
+                            html += """    background: {0};\n""".format(paper.name())
+                            html += """    text-decoration: inherit;\n"""
                         if wysiwyg:
-                            html += '''    font-size: {0:d}pt;\n'''.format(
-                                    QFontInfo(font).pointSize())
-                        html += '''}\n'''
-                        
+                            html += """    font-size: {0:d}pt;\n""".format(
+                                QFontInfo(font).pointSize()
+                            )
+                        html += """}\n"""
+
                         # get substyles
-                        subs_start, subs_count = self.editor.getSubStyleRange(
-                            istyle)
+                        subs_start, subs_count = self.editor.getSubStyleRange(istyle)
                         for subs_idx in range(subs_count):
                             styleIsUsed[subs_idx - subs_start] = True
                             font = lex.font(subs_start + subs_idx)
                             colour = lex.color(subs_start + subs_idx)
                             paper = lex.paper(subs_start + subs_idx)
-                            html += '.S{0:d} {{\n'.format(
-                                subs_idx - subs_start)
+                            html += ".S{0:d} {{\n".format(subs_idx - subs_start)
                             if font.italic():
-                                html += '    font-style: italic;\n'
+                                html += "    font-style: italic;\n"
                             if font.bold():
-                                html += '    font-weight: bold;\n'
+                                html += "    font-weight: bold;\n"
                             if wysiwyg:
                                 html += "    font-family: '{0}';\n".format(
-                                        font.family())
-                            html += '    color: {0};\n'.format(colour.name())
+                                    font.family()
+                                )
+                            html += "    color: {0};\n".format(colour.name())
                             if wysiwyg:
-                                html += '    font-size: {0:d}pt;\n'.format(
-                                        QFontInfo(font).pointSize())
-                            html += '}\n'
+                                html += "    font-size: {0:d}pt;\n".format(
+                                    QFontInfo(font).pointSize()
+                                )
+                            html += "}\n"
                             # __IGNORE_WARNING_Y113__
                     else:
                         styleIsUsed[istyle] = False
@@ -198,25 +203,26 @@
             colour = self.editor.color()
             paper = self.editor.paper()
             font = Preferences.getEditorOtherFonts("DefaultFont")
-            html += '''.S0 {\n'''
+            html += """.S0 {\n"""
             if font.italic():
-                html += '''    font-style: italic;\n'''
+                html += """    font-style: italic;\n"""
             if font.bold():
-                html += '''    font-weight: bold;\n'''
+                html += """    font-weight: bold;\n"""
             if wysiwyg:
-                html += '''    font-family: '{0}';\n'''.format(font.family())
-            html += '''    color: {0};\n'''.format(colour.name())
+                html += """    font-family: '{0}';\n""".format(font.family())
+            html += """    color: {0};\n""".format(colour.name())
             if bgColour != paper.name():
-                html += '''    background: {0};\n'''.format(paper.name())
-                html += '''    text-decoration: inherit;\n'''
+                html += """    background: {0};\n""".format(paper.name())
+                html += """    text-decoration: inherit;\n"""
             if wysiwyg:
-                html += '''    font-size: {0:d}pt;\n'''.format(
-                        QFontInfo(font).pointSize())
-            html += '''}\n'''
-        html += '''</style>\n'''
-        html += '''</head>\n'''
-        
-        html += '''<body bgcolor="{0}">\n'''.format(bgColour)
+                html += """    font-size: {0:d}pt;\n""".format(
+                    QFontInfo(font).pointSize()
+                )
+            html += """}\n"""
+        html += """</style>\n"""
+        html += """</head>\n"""
+
+        html += """<body bgcolor="{0}">\n""".format(bgColour)
         line = self.editor.lineAt(0)
         level = self.editor.foldLevelAt(line) - QsciScintilla.SC_FOLDLEVELBASE
         levelStack = [level]
@@ -225,135 +231,131 @@
         inFoldSpan = False
         # Global span for default attributes
         if wysiwyg:
-            html += '''<span>'''
+            html += """<span>"""
         else:
-            html += '''<pre>'''
-        
+            html += """<pre>"""
+
         if folding:
-            if (
-                self.editor.foldFlagsAt(line) &
-                    QsciScintilla.SC_FOLDLEVELHEADERFLAG
-            ):
-                html += (
-                    '''<span id="hd{0:d}" onclick="toggle('{1:d}')">'''
-                ).format(line, line + 1)
-                html += '''<span id="bt{0:d}">- </span>'''.format(line)
+            if self.editor.foldFlagsAt(line) & QsciScintilla.SC_FOLDLEVELHEADERFLAG:
+                html += ("""<span id="hd{0:d}" onclick="toggle('{1:d}')">""").format(
+                    line, line + 1
+                )
+                html += """<span id="bt{0:d}">- </span>""".format(line)
                 inFoldSpan = True
             else:
-                html += '''&nbsp; '''
-        
+                html += """&nbsp; """
+
         if styleIsUsed[styleCurrent]:
-            html += '''<span class="S{0:0d}">'''.format(styleCurrent)
+            html += """<span class="S{0:0d}">""".format(styleCurrent)
             inStyleSpan = True
-        
+
         column = 0
         pos = 0
         utf8 = self.editor.isUtf8()
         utf8Ch = b""
         utf8Len = 0
-        
+
         while pos < lengthDoc:
             ch = self.editor.byteAt(pos)
             style = self.editor.styleAt(pos)
             if style != styleCurrent:
                 if inStyleSpan:
-                    html += '''</span>'''
+                    html += """</span>"""
                     inStyleSpan = False
-                if ch not in [b'\r', b'\n']:  # no need of a span for the EOL
+                if ch not in [b"\r", b"\n"]:  # no need of a span for the EOL
                     if styleIsUsed[style]:
-                        html += '''<span class="S{0:d}">'''.format(style)
+                        html += """<span class="S{0:d}">""".format(style)
                         inStyleSpan = True
                     styleCurrent = style
-            
-            if ch == b' ':
+
+            if ch == b" ":
                 if wysiwyg:
-                    prevCh = b''
+                    prevCh = b""
                     if column == 0:
                         # at start of line, must put a &nbsp;
                         # because regular space will be collapsed
-                        prevCh = b' '
-                    while pos < lengthDoc and self.editor.byteAt(pos) == b' ':
-                        if prevCh != b' ':
-                            html += ' '
+                        prevCh = b" "
+                    while pos < lengthDoc and self.editor.byteAt(pos) == b" ":
+                        if prevCh != b" ":
+                            html += " "
                         else:
-                            html += '''&nbsp;'''
+                            html += """&nbsp;"""
                         prevCh = self.editor.byteAt(pos)
                         pos += 1
                         column += 1
                     pos -= 1
                     # the last incrementation will be done by the outer loop
                 else:
-                    html += ' '
+                    html += " "
                     column += 1
-            elif ch == b'\t':
+            elif ch == b"\t":
                 ts = tabSize - (column % tabSize)
                 if wysiwyg:
-                    html += '''&nbsp;''' * ts
+                    html += """&nbsp;""" * ts
                     column += ts
                 else:
                     if useTabs:
-                        html += '\t'
+                        html += "\t"
                         column += 1
                     else:
-                        html += ' ' * ts
+                        html += " " * ts
                         column += ts
-            elif ch in [b'\r', b'\n']:
+            elif ch in [b"\r", b"\n"]:
                 if inStyleSpan:
-                    html += '''</span>'''
+                    html += """</span>"""
                     inStyleSpan = False
                 if inFoldSpan:
-                    html += '''</span>'''
+                    html += """</span>"""
                     inFoldSpan = False
-                if ch == b'\r' and self.editor.byteAt(pos + 1) == b'\n':
+                if ch == b"\r" and self.editor.byteAt(pos + 1) == b"\n":
                     pos += 1  # CR+LF line ending, skip the "extra" EOL char
                 column = 0
                 if wysiwyg:
-                    html += '''<br />'''
-                
+                    html += """<br />"""
+
                 styleCurrent = self.editor.styleAt(pos + 1)
                 if folding:
                     line = self.editor.lineAt(pos + 1)
                     newLevel = self.editor.foldLevelAt(line)
-                    
+
                     if newLevel < level:
                         while levelStack[-1] > newLevel:
-                            html += '''</span>'''
+                            html += """</span>"""
                             levelStack.pop()
-                    html += '\n'  # here to get clean code
+                    html += "\n"  # here to get clean code
                     if newLevel > level:
-                        html += '''<span id="ln{0:d}">'''.format(line)
+                        html += """<span id="ln{0:d}">""".format(line)
                         levelStack.append(newLevel)
                     if (
-                        self.editor.foldFlagsAt(line) &
-                            QsciScintilla.SC_FOLDLEVELHEADERFLAG
+                        self.editor.foldFlagsAt(line)
+                        & QsciScintilla.SC_FOLDLEVELHEADERFLAG
                     ):
                         html += (
-                            '''<span id="hd{0:d}"'''
-                            ''' onclick="toggle('{1:d}')">'''
+                            '''<span id="hd{0:d}"''' """ onclick="toggle('{1:d}')">"""
                         ).format(line, line + 1)
-                        html += '''<span id="bt{0:d}">- </span>'''.format(line)
+                        html += """<span id="bt{0:d}">- </span>""".format(line)
                         inFoldSpan = True
                     else:
-                        html += '''&nbsp; '''
+                        html += """&nbsp; """
                     level = newLevel
                 else:
-                    html += '\n'
-                
-                if (
-                    styleIsUsed[styleCurrent] and
-                    self.editor.byteAt(pos + 1) not in [b'\r', b'\n']
-                ):
+                    html += "\n"
+
+                if styleIsUsed[styleCurrent] and self.editor.byteAt(pos + 1) not in [
+                    b"\r",
+                    b"\n",
+                ]:
                     # We know it's the correct next style,
                     # but no (empty) span for an empty line
-                    html += '''<span class="S{0:0d}">'''.format(styleCurrent)
+                    html += """<span class="S{0:0d}">""".format(styleCurrent)
                     inStyleSpan = True
             else:
-                if ch == b'<':
-                    html += '''&lt;'''
-                elif ch == b'>':
-                    html += '''&gt'''
-                elif ch == b'&':
-                    html += '''&amp;'''
+                if ch == b"<":
+                    html += """&lt;"""
+                elif ch == b">":
+                    html += """&gt"""
+                elif ch == b"&":
+                    html += """&amp;"""
                 else:
                     if ord(ch) > 127 and utf8:
                         utf8Ch += ch
@@ -366,7 +368,7 @@
                                 utf8Len = 2
                             column -= 1  # will be incremented again later
                         elif len(utf8Ch) == utf8Len:
-                            ch = utf8Ch.decode('utf8')
+                            ch = utf8Ch.decode("utf8")
                             html += Utilities.html_encode(ch)
                             utf8Ch = b""
                             utf8Len = 0
@@ -375,24 +377,24 @@
                     else:
                         html += ch.decode()
                 column += 1
-            
+
             pos += 1
-        
+
         if inStyleSpan:
-            html += '''</span>'''
-        
+            html += """</span>"""
+
         if folding:
             while levelStack:
-                html += '''</span>'''
+                html += """</span>"""
                 levelStack.pop()
-        
+
         if wysiwyg:
-            html += '''</span>'''
+            html += """</span>"""
         else:
-            html += '''</pre>'''
-        
-        html += '''</body>\n</html>\n'''
-        
+            html += """</pre>"""
+
+        html += """</body>\n</html>\n"""
+
         return html
 
 
@@ -400,15 +402,16 @@
     """
     Class implementing an exporter for HTML.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         ExporterBase.__init__(self, editor, parent)
-    
+
     def exportSource(self):
         """
         Public method performing the export.
@@ -416,14 +419,13 @@
         filename = self._getFileName(self.tr("HTML Files (*.html)"))
         if not filename:
             return
-        
+
         fn = self.editor.getFileName()
         extension = os.path.normcase(os.path.splitext(fn)[1][1:]) if fn else ""
-        
+
         if (
-            extension in Preferences.getEditor(
-                "PreviewMarkdownFileNameExtensions") or
-            self.editor.getLanguage().lower() == "markdown"
+            extension in Preferences.getEditor("PreviewMarkdownFileNameExtensions")
+            or self.editor.getLanguage().lower() == "markdown"
         ):
             # export markdown to HTML
             colorSchemes = [
@@ -435,7 +437,9 @@
                 self.tr("Markdown Export"),
                 self.tr("Select color scheme:"),
                 colorSchemes,
-                0, False)
+                0,
+                False,
+            )
             if ok:
                 colorSchemeIndex = colorSchemes.index(colorScheme)
             else:
@@ -444,9 +448,8 @@
             with EricOverrideCursor():
                 html = self.__generateFromMarkdown(colorSchemeIndex == 1)
         elif (
-            extension in Preferences.getEditor(
-                "PreviewRestFileNameExtensions") or
-            self.editor.getLanguage().lower() == "restructuredtext"
+            extension in Preferences.getEditor("PreviewRestFileNameExtensions")
+            or self.editor.getLanguage().lower() == "restructuredtext"
         ):
             # export ReST to HTML
             with EricOverrideCursor():
@@ -457,12 +460,10 @@
                 tabSize = 4
             wysiwyg = Preferences.getEditorExporter("HTML/WYSIWYG")
             folding = Preferences.getEditorExporter("HTML/Folding")
-            onlyStylesUsed = Preferences.getEditorExporter(
-                "HTML/OnlyStylesUsed")
-            titleFullPath = Preferences.getEditorExporter(
-                "HTML/FullPathAsTitle")
+            onlyStylesUsed = Preferences.getEditorExporter("HTML/OnlyStylesUsed")
+            titleFullPath = Preferences.getEditorExporter("HTML/FullPathAsTitle")
             tabs = Preferences.getEditorExporter("HTML/UseTabs")
-            
+
             with EricOverrideCursor():
                 generator = HTMLGenerator(self.editor)
                 html = generator.generate(
@@ -471,12 +472,11 @@
                     wysiwyg=wysiwyg,
                     folding=folding,
                     onlyStylesUsed=onlyStylesUsed,
-                    titleFullPath=titleFullPath
+                    titleFullPath=titleFullPath,
                 )
-        
+
         if html:
-            with EricOverrideCursor(), open(filename, "w", encoding="utf-8"
-                                            ) as f:
+            with EricOverrideCursor(), open(filename, "w", encoding="utf-8") as f:
                 try:
                     f.write(html)
                 except OSError as err:
@@ -485,8 +485,9 @@
                         self.tr("Export source"),
                         self.tr(
                             """<p>The source could not be exported to"""
-                            """ <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                        .format(filename, str(err)))
+                            """ <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                        ).format(filename, str(err)),
+                    )
         else:
             EricMessageBox.critical(
                 self.editor,
@@ -494,24 +495,26 @@
                 self.tr(
                     """<p>The source could not be exported to"""
                     """ <b>{0}</b>.</p><p>Reason: No HTML code"""
-                    """ generated.</p>""")
-                .format(filename))
-    
+                    """ generated.</p>"""
+                ).format(filename),
+            )
+
     def __generateFromReSTDocutils(self):
         """
         Private method to convert ReST text into HTML using 'docutils'.
-        
+
         @return processed HTML (string)
         """
-        if 'sphinx' in sys.modules:
+        if "sphinx" in sys.modules:
             # Make sure any Sphinx polution of docutils has been removed.
-            unloadKeys = [k for k in sys.modules.keys()
-                          if k.startswith(('docutils', 'sphinx'))]
+            unloadKeys = [
+                k for k in sys.modules.keys() if k.startswith(("docutils", "sphinx"))
+            ]
             for key in unloadKeys:
                 sys.modules.pop(key)
-        
+
         try:
-            import docutils.core    # __IGNORE_EXCEPTION__
+            import docutils.core  # __IGNORE_EXCEPTION__
         except ImportError:
             EricMessageBox.critical(
                 self.editor,
@@ -521,24 +524,25 @@
                     """ <b>python-docutils</b> package.<br/>Install it with"""
                     """ your package manager, 'pip install docutils' or see"""
                     """ <a href="http://pypi.python.org/pypi/docutils">"""
-                    """this page.</a></p>""")
+                    """this page.</a></p>"""
+                ),
             )
             return ""
-        
-        htmlFormat = Preferences.getEditor(
-            "PreviewRestDocutilsHTMLFormat").lower()
+
+        htmlFormat = Preferences.getEditor("PreviewRestDocutilsHTMLFormat").lower()
         # redirect sys.stderr because we are not interested in it here
         origStderr = sys.stderr
         sys.stderr = io.StringIO()
         html = docutils.core.publish_string(
-            self.editor.text(), writer_name=htmlFormat).decode("utf-8")
+            self.editor.text(), writer_name=htmlFormat
+        ).decode("utf-8")
         sys.stderr = origStderr
         return html
-    
+
     def __generateFromMarkdown(self, useDarkScheme):
         """
         Private method to convert Markdown text into HTML.
-        
+
         @param useDarkScheme flag indicating to export using a dark color
             scheme
         @type bool
@@ -546,7 +550,7 @@
         @rtype str
         """
         try:
-            import markdown     # __IGNORE_EXCEPTION__
+            import markdown  # __IGNORE_EXCEPTION__
         except ImportError:
             EricMessageBox.critical(
                 self.editor,
@@ -556,53 +560,59 @@
                     """</b> package.<br/>Install it with your package"""
                     """ manager, 'pip install docutils' or see """
                     """<a href="http://pythonhosted.org/Markdown/install"""
-                    """.html"> installation instructions.</a></p>""")
+                    """.html"> installation instructions.</a></p>"""
+                ),
             )
             return ""
-        
+
         from UI.Previewers import PreviewerHTMLStyles
         from UI.Previewers import MarkdownExtensions
-        
+
         extensions = []
-        
+
         text = self.editor.text()
-        
+
         mermaidNeeded = False
-        if (
-            Preferences.getEditor("PreviewMarkdownMermaid") and
-            MarkdownExtensions.MermaidRegexFullText.search(text)
-        ):
+        if Preferences.getEditor(
+            "PreviewMarkdownMermaid"
+        ) and MarkdownExtensions.MermaidRegexFullText.search(text):
             extensions.append(MarkdownExtensions.MermaidExtension())
             mermaidNeeded = True
-        
+
         if Preferences.getEditor("PreviewMarkdownNLtoBR"):
-            extensions.append('nl2br')
-        
+            extensions.append("nl2br")
+
         pyMdown = False
         if Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions"):
             with contextlib.suppress(ImportError):
-                import pymdownx     # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+                import pymdownx  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+
                 # PyPI package is 'pymdown-extensions'
-                
-                extensions.extend([
-                    'toc',
-                    'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
-                    'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
-                    'pymdownx.tasklist', 'pymdownx.smartsymbols',
-                ])
+
+                extensions.extend(
+                    [
+                        "toc",
+                        "pymdownx.extra",
+                        "pymdownx.caret",
+                        "pymdownx.emoji",
+                        "pymdownx.mark",
+                        "pymdownx.tilde",
+                        "pymdownx.keys",
+                        "pymdownx.tasklist",
+                        "pymdownx.smartsymbols",
+                    ]
+                )
                 pyMdown = True
-        
+
         if not pyMdown:
-            extensions.extend(['extra', 'toc'])
-            
+            extensions.extend(["extra", "toc"])
+
             # version 2.0 supports only extension names, not instances
-            if (
-                markdown.version_info[0] > 2 or
-                (markdown.version_info[0] == 2 and
-                 markdown.version_info[1] > 0)
+            if markdown.version_info[0] > 2 or (
+                markdown.version_info[0] == 2 and markdown.version_info[1] > 0
             ):
                 extensions.append(MarkdownExtensions.SimplePatternExtension())
-        
+
         if Preferences.getEditor("PreviewMarkdownMathJax"):
             mathjax = (
                 "<script type='text/javascript' id='MathJax-script' async"
@@ -612,15 +622,14 @@
             )
             # prepare text for mathjax
             text = (
-                text
-                .replace(r"\(", r"\\(")
+                text.replace(r"\(", r"\\(")
                 .replace(r"\)", r"\\)")
                 .replace(r"\[", r"\\[")
                 .replace(r"\]", r"\\]")
             )
         else:
             mathjax = ""
-        
+
         if mermaidNeeded:
             mermaid = (
                 "<script type='text/javascript' id='Mermaid-script'"
@@ -644,53 +653,53 @@
         else:
             mermaid = ""
             mermaid_initialize = ""
-        
+
         htmlFormat = Preferences.getEditor("PreviewMarkdownHTMLFormat").lower()
-        body = markdown.markdown(text, extensions=extensions,
-                                 output_format=htmlFormat)
+        body = markdown.markdown(text, extensions=extensions, output_format=htmlFormat)
         style = (
-            (PreviewerHTMLStyles.css_markdown_dark +
-             PreviewerHTMLStyles.css_pygments_dark)
-            if useDarkScheme else
-            (PreviewerHTMLStyles.css_markdown_light +
-             PreviewerHTMLStyles.css_pygments_light)
+            (
+                PreviewerHTMLStyles.css_markdown_dark
+                + PreviewerHTMLStyles.css_pygments_dark
+            )
+            if useDarkScheme
+            else (
+                PreviewerHTMLStyles.css_markdown_light
+                + PreviewerHTMLStyles.css_pygments_light
+            )
         )
-        
+
         if htmlFormat == "xhtml1":
             head = (
-                '''<!DOCTYPE html PUBLIC "-//W3C//DTD'''
-                ''' XHTML 1.0 Transitional//EN"\n'''
-                ''' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional'''
-                '''.dtd">\n'''
-                '''<html xmlns="http://www.w3.org/1999/xhtml">\n'''
+                """<!DOCTYPE html PUBLIC "-//W3C//DTD"""
+                """ XHTML 1.0 Transitional//EN"\n"""
+                """ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional"""
+                """.dtd">\n"""
+                """<html xmlns="http://www.w3.org/1999/xhtml">\n"""
             )
         elif htmlFormat == "html5":
-            head = (
-                '''<!DOCTYPE html>\n'''
-                '''<html lang="EN">\n'''
-            )
+            head = """<!DOCTYPE html>\n""" """<html lang="EN">\n"""
         else:
             head = '<html lang="EN">\n'
-        head += '''<head>\n'''
+        head += """<head>\n"""
         if Preferences.getEditorExporter("HTML/FullPathAsTitle"):
-            head += '''<title>{0}</title>\n'''.format(
-                self.editor.getFileName())
+            head += """<title>{0}</title>\n""".format(self.editor.getFileName())
         else:
-            head += '''<title>{0}</title>\n'''.format(
-                os.path.basename(self.editor.getFileName()))
+            head += """<title>{0}</title>\n""".format(
+                os.path.basename(self.editor.getFileName())
+            )
         head += (
-            '''<meta name="Generator" content="eric" />\n'''
-            '''<meta http-equiv="Content-Type" '''
-            '''content="text/html; charset=utf-8" />\n'''
-            '''{0}'''
-            '''{1}'''
-            '''<style type="text/css">'''
-            '''{2}'''
-            '''</style>\n'''
-            '''</head>\n'''
-            '''<body>\n'''
+            """<meta name="Generator" content="eric" />\n"""
+            """<meta http-equiv="Content-Type" """
+            """content="text/html; charset=utf-8" />\n"""
+            """{0}"""
+            """{1}"""
+            """<style type="text/css">"""
+            """{2}"""
+            """</style>\n"""
+            """</head>\n"""
+            """<body>\n"""
         ).format(mathjax, mermaid, style)
-        
-        foot = '''\n</body>\n</html>\n'''
-        
+
+        foot = """\n</body>\n</html>\n"""
+
         return head + body + mermaid_initialize + foot
--- a/src/eric7/QScintilla/Exporters/ExporterODT.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterODT.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,15 +22,16 @@
     """
     Class implementing an exporter for ODT.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         ExporterBase.__init__(self, editor, parent)
-    
+
     def exportSource(self):
         """
         Public method performing the export.
@@ -38,14 +39,14 @@
         filename = self._getFileName(self.tr("ODT Files (*.odt)"))
         if not filename:
             return
-        
+
         tabSize = self.editor.getEditorConfig("TabWidth")
         if tabSize == 0:
             tabSize = 4
         wysiwyg = Preferences.getEditorExporter("ODT/WYSIWYG")
         onlyStylesUsed = Preferences.getEditorExporter("ODT/OnlyStylesUsed")
         tabs = Preferences.getEditorExporter("ODT/UseTabs")
-        
+
         with EricOverrideCursor():
             # generate HTML of the source
             generator = HTMLGenerator(self.editor)
@@ -55,19 +56,20 @@
                 wysiwyg=wysiwyg,
                 folding=False,
                 onlyStylesUsed=onlyStylesUsed,
-                titleFullPath=False
+                titleFullPath=False,
             )
-            
+
             # convert HTML to ODT
             doc = QTextDocument()
             doc.setHtml(html)
             writer = QTextDocumentWriter(filename)
             ok = writer.write(doc)
-        
+
         if not ok:
             EricMessageBox.critical(
                 self.editor,
                 self.tr("Export source"),
                 self.tr(
-                    """<p>The source could not be exported to"""
-                    """ <b>{0}</b>.</p>""").format(filename))
+                    """<p>The source could not be exported to""" """ <b>{0}</b>.</p>"""
+                ).format(filename),
+            )
--- a/src/eric7/QScintilla/Exporters/ExporterPDF.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterPDF.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,24 +20,32 @@
 
 import Preferences
 
-PDF_FONT_DEFAULT = 1    # Helvetica
+PDF_FONT_DEFAULT = 1  # Helvetica
 PDF_FONTSIZE_DEFAULT = 10
 PDF_SPACING_DEFAULT = 1.2
 PDF_MARGIN_DEFAULT = 72  # 1.0"
 PDF_ENCODING = "WinAnsiEncoding"
 
 PDFfontNames = [
-    "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique",
-    "Helvetica", "Helvetica-Bold", "Helvetica-Oblique",
-    "Helvetica-BoldOblique", "Times-Roman", "Times-Bold", "Times-Italic",
-    "Times-BoldItalic"
+    "Courier",
+    "Courier-Bold",
+    "Courier-Oblique",
+    "Courier-BoldOblique",
+    "Helvetica",
+    "Helvetica-Bold",
+    "Helvetica-Oblique",
+    "Helvetica-BoldOblique",
+    "Times-Roman",
+    "Times-Bold",
+    "Times-Italic",
+    "Times-BoldItalic",
 ]
 PDFfontAscenders = [629, 718, 699]
 PDFfontDescenders = [157, 207, 217]
 PDFfontWidths = [600, 0, 0]
 
 PDFpageSizes = {
-    #- name   : (height, width)
+    # - name   : (height, width)
     "Letter": (792, 612),
     "A4": (842, 595),
 }
@@ -47,6 +55,7 @@
     """
     Simple class to store the values of a PDF style.
     """
+
     def __init__(self):
         """
         Constructor
@@ -59,34 +68,35 @@
     """
     Class to conveniently handle the tracking of PDF objects so that the
     cross-reference table can be built (PDF1.4Ref(p39)).
-    
+
     All writes to the file are passed through a PDFObjectTracker object.
     """
+
     def __init__(self, file):
         """
         Constructor
-        
+
         @param file file object open for writing (file)
         """
         self.file = file
         self.offsetList = []
         self.index = 1
-        
+
     def write(self, objectData):
         """
         Public method to write the data to the file.
-        
+
         @param objectData data to be written (integer or string)
         """
         if isinstance(objectData, int):
             self.file.write("{0:d}".format(objectData))
         else:
             self.file.write(objectData)
-        
+
     def add(self, objectData):
         """
         Public method to add a new object.
-        
+
         @param objectData data to be added (integer or string)
         @return object number assigned to the supplied data (integer)
         """
@@ -98,11 +108,11 @@
         ind = self.index
         self.index += 1
         return ind
-        
+
     def xref(self):
         """
         Public method to build the xref table.
-        
+
         @return file offset of the xref table (integer)
         """
         xrefStart = self.file.tell()
@@ -121,10 +131,11 @@
 class PDFRender:
     """
     Class to manage line and page rendering.
-    
+
     Apart from startPDF, endPDF everything goes in via add() and nextLine()
     so that line formatting and pagination can be done properly.
     """
+
     def __init__(self):
         """
         Constructor
@@ -152,75 +163,68 @@
         self.yPos = 0.0
         self.justWhiteSpace = False
         self.oT = None
-        
+
     def fontToPoints(self, thousandths):
         """
         Public method to convert the font size to points.
-        
+
         @param thousandths font size (integer)
         @return point size of the font (integer)
         """
         return self.fontSize * thousandths / 1000.0
-        
+
     def setStyle(self, style_):
         """
         Public method to set a style.
-        
+
         @param style_ style to be set (integer)
         @return the PDF string to set the given style (string)
         """
         styleNext = style_
         if style_ == -1:
             styleNext = self.styleCurrent
-        
+
         buf = ""
         if styleNext != self.styleCurrent or style_ == -1:
             if (
-                (self.style[self.styleCurrent].font !=
-                 self.style[styleNext].font) or
-                style_ == -1
-            ):
+                self.style[self.styleCurrent].font != self.style[styleNext].font
+            ) or style_ == -1:
                 buf += "/F{0:d} {1:d} Tf ".format(
-                    self.style[styleNext].font + 1, self.fontSize)
+                    self.style[styleNext].font + 1, self.fontSize
+                )
             if (
-                (self.style[self.styleCurrent].fore !=
-                 self.style[styleNext].fore) or
-                style_ == -1
-            ):
+                self.style[self.styleCurrent].fore != self.style[styleNext].fore
+            ) or style_ == -1:
                 buf += "{0}rg ".format(self.style[styleNext].fore)
         return buf
-        
+
     def startPDF(self):
         """
         Public method to start the PDF document.
         """
         if self.fontSize <= 0:
             self.fontSize = PDF_FONTSIZE_DEFAULT
-        
+
         # leading is the term for distance between lines
         self.leading = self.fontSize * PDF_SPACING_DEFAULT
-        
+
         # sanity check for page size and margins
         pageWidthMin = (
-            int(self.leading) +
-            self.pageMargins["left"] +
-            self.pageMargins["right"]
+            int(self.leading) + self.pageMargins["left"] + self.pageMargins["right"]
         )
         if self.pageWidth < pageWidthMin:
             self.pageWidth = pageWidthMin
         pageHeightMin = (
-            int(self.leading) +
-            self.pageMargins["top"] +
-            self.pageMargins["bottom"]
+            int(self.leading) + self.pageMargins["top"] + self.pageMargins["bottom"]
         )
         if self.pageHeight < pageHeightMin:
             self.pageHeight = pageHeightMin
-        
+
         # start to write PDF file here (PDF1.4Ref(p63))
         # ASCII>127 characters to indicate binary-possible stream
         self.oT.write("%PDF-1.3\n%�쏢\n")
         self.styleCurrent = QsciScintilla.STYLE_DEFAULT
-        
+
         # build objects for font resources; note that font objects are
         # *expected* to start from index 1 since they are the first objects
         # to be inserted (PDF1.4Ref(p317))
@@ -228,13 +232,11 @@
             buffer = (
                 "<</Type/Font/Subtype/Type1/Name/F{0:d}/BaseFont/{1}/"
                 "Encoding/{2}>>\n"
-            ).format(
-                i + 1, PDFfontNames[self.fontSet * 4 + i], PDF_ENCODING
-            )
+            ).format(i + 1, PDFfontNames[self.fontSet * 4 + i], PDF_ENCODING)
             self.oT.add(buffer)
-        
+
         self.pageContentStart = self.oT.index
-        
+
     def endPDF(self):
         """
         Public method to end the PDF document.
@@ -242,12 +244,13 @@
         if self.pageStarted:
             # flush buffers
             self.endPage()
-        
+
         # refer to all used or unused fonts for simplicity
         resourceRef = self.oT.add(
             "<</ProcSet[/PDF/Text]\n/Font<</F1 1 0 R/F2 2 0 R/F3 3 0 R/"
-            "F4 4 0 R>> >>\n")
-        
+            "F4 4 0 R>> >>\n"
+        )
+
         # create all the page objects (PDF1.4Ref(p88))
         # forward reference pages object; calculate its object number
         pageObjectStart = self.oT.index
@@ -259,51 +262,53 @@
                 "/Contents {3:d} 0 R\n"
                 "/Resources {4:d} 0 R\n>>\n"
             ).format(
-                pagesRef, self.pageWidth, self.pageHeight,
-                self.pageContentStart + i, resourceRef
+                pagesRef,
+                self.pageWidth,
+                self.pageHeight,
+                self.pageContentStart + i,
+                resourceRef,
             )
             self.oT.add(buffer)
-        
+
         # create page tree object (PDF1.4Ref(p86))
         self.pageData = "<</Type/Pages/Kids[\n"
         for i in range(self.pageCount):
             self.pageData += "{0:d} 0 R\n".format(pageObjectStart + i)
         self.pageData += "]/Count {0:d}\n>>\n".format(self.pageCount)
         self.oT.add(self.pageData)
-        
+
         # create catalog object (PDF1.4Ref(p83))
         buffer = "<</Type/Catalog/Pages {0:d} 0 R >>\n".format(pagesRef)
         catalogRef = self.oT.add(buffer)
-        
+
         # append the cross reference table (PDF1.4Ref(p64))
         xref = self.oT.xref()
-        
+
         # end the file with the trailer (PDF1.4Ref(p67))
         buffer = (
-            "trailer\n<< /Size {0:d} /Root {1:d} 0 R\n>>\nstartxref\n{2:d}\n"
-            "%%EOF\n"
+            "trailer\n<< /Size {0:d} /Root {1:d} 0 R\n>>\nstartxref\n{2:d}\n" "%%EOF\n"
         ).format(self.oT.index, catalogRef, xref)
         self.oT.write(buffer)
-        
+
     def add(self, ch, style_):
         """
         Public method to add a character to the page.
-        
+
         @param ch character to add (string)
         @param style_ number of the style of the character (integer)
         """
         if not self.pageStarted:
             self.startPage()
-        
+
         # get glyph width (TODO future non-monospace handling)
         glyphWidth = self.fontToPoints(PDFfontWidths[self.fontSet])
         self.xPos += glyphWidth
-        
+
         # if cannot fit into a line, flush, wrap to next line
         if self.xPos > self.pageWidth - self.pageMargins["right"]:
             self.nextLine()
             self.xPos += glyphWidth
-        
+
         # if different style, then change to style
         if style_ != self.styleCurrent:
             self.flushSegment()
@@ -311,20 +316,20 @@
             self.segStyle = self.setStyle(style_)
             self.stylePrev = self.styleCurrent
             self.styleCurrent = style_
-        
+
         # escape these characters
-        if ch in (')', '(', '\\'):
-            self.segment += '\\'
-        if ch != ' ':
+        if ch in (")", "(", "\\"):
+            self.segment += "\\"
+        if ch != " ":
             self.justWhiteSpace = False
         self.segment += ch  # add to segment data
-        
+
     def flushSegment(self):
         """
         Public method to flush a segment of data.
         """
         if len(self.segment) > 0:
-            if self.justWhiteSpace:     # optimise
+            if self.justWhiteSpace:  # optimise
                 self.styleCurrent = self.stylePrev
             else:
                 self.pageData += self.segStyle
@@ -332,7 +337,7 @@
             self.segment = ""
             self.segStyle = ""
             self.justWhiteSpace = True
-        
+
     def startPage(self):
         """
         Public method to start a new page.
@@ -342,11 +347,12 @@
         self.pageCount += 1
         fontAscender = self.fontToPoints(PDFfontAscenders[self.fontSet])
         self.yPos = self.pageHeight - self.pageMargins["top"] - fontAscender
-        
+
         # start a new page
         buffer = "BT 1 0 0 1 {0:d} {1:d} Tm\n".format(
-            self.pageMargins["left"], int(self.yPos))
-        
+            self.pageMargins["left"], int(self.yPos)
+        )
+
         # force setting of initial font, colour
         self.segStyle = self.setStyle(-1)
         buffer += self.segStyle
@@ -354,30 +360,31 @@
         self.xPos = self.pageMargins["left"]
         self.segment = ""
         self.flushSegment()
-        
+
     def endPage(self):
         """
         Public method to end a page.
         """
         self.pageStarted = False
         self.flushSegment()
-        
+
         # build actual text object; +3 is for "ET\n"
         # PDF1.4Ref(p38) EOL marker preceding endstream not counted
         textObj = "<</Length {0:d}>>\nstream\n{1}ET\nendstream\n".format(
-                  len(self.pageData) - 1 + 3, self.pageData)
+            len(self.pageData) - 1 + 3, self.pageData
+        )
         self.oT.add(textObj)
-        
+
     def nextLine(self):
         """
         Public method to start a new line.
         """
         if not self.pageStarted:
             self.startPage()
-        
+
         self.xPos = self.pageMargins["left"]
         self.flushSegment()
-        
+
         # PDF follows cartesian coords, subtract -> down
         self.yPos -= self.leading
         fontDescender = self.fontToPoints(PDFfontDescenders[self.fontSet])
@@ -385,7 +392,7 @@
             self.endPage()
             self.startPage()
             return
-        
+
         if self.firstLine:
             # avoid breakage due to locale setting
             f = int(self.leading * 10 + 0.5)
@@ -400,19 +407,20 @@
     """
     Class implementing an exporter for PDF.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         ExporterBase.__init__(self, editor, parent)
-    
+
     def __getPDFRGB(self, color):
         """
         Private method to convert a color object to the correct PDF color.
-        
+
         @param color color object to convert (QColor)
         @return PDF color description (string)
         """
@@ -424,28 +432,27 @@
             else:
                 pdfColor += "0.{0:03d} ".format(c)
         return pdfColor
-        
+
     def exportSource(self):
         """
         Public method performing the export.
         """
         self.pr = PDFRender()
-        
+
         filename = self._getFileName(self.tr("PDF Files (*.pdf)"))
         if not filename:
             return
-        
+
         self.editor.recolor(0, -1)
         lex = self.editor.getLexer()
-        
+
         tabSize = self.editor.getEditorConfig("TabWidth")
         if tabSize == 0:
             tabSize = 4
-        
+
         # get magnification value to add to default screen font size
-        self.pr.fontSize = Preferences.getEditorExporter(
-            "PDF/Magnification")
-        
+        self.pr.fontSize = Preferences.getEditorExporter("PDF/Magnification")
+
         # set font family according to face name
         fontName = Preferences.getEditorExporter("PDF/Font")
         self.pr.fontSet = PDF_FONT_DEFAULT
@@ -455,7 +462,7 @@
             self.pr.fontSet = 1
         elif fontName == "Times":
             self.pr.fontSet = 2
-        
+
         # page size: height, width,
         pageSize = Preferences.getEditorExporter("PDF/PageSize")
         try:
@@ -464,7 +471,7 @@
             pageDimensions = PDFpageSizes["A4"]
         self.pr.pageHeight = pageDimensions[0]
         self.pr.pageWidth = pageDimensions[1]
-        
+
         # page margins: left, right, top, bottom
         # < 0 to use PDF default values
         val = Preferences.getEditorExporter("PDF/MarginLeft")
@@ -487,33 +494,31 @@
             self.pr.pageMargins["bottom"] = PDF_MARGIN_DEFAULT
         else:
             self.pr.pageMargins["bottom"] = val
-        
+
         # collect all styles available for that 'language'
         # or the default style if no language is available...
         if lex:
             istyle = 0
             while istyle <= QsciScintilla.STYLE_MAX:
-                if (istyle <= QsciScintilla.STYLE_DEFAULT or
-                        istyle > QsciScintilla.STYLE_LASTPREDEFINED):
-                    if (
-                        lex.description(istyle) or
-                        istyle == QsciScintilla.STYLE_DEFAULT
-                    ):
+                if (
+                    istyle <= QsciScintilla.STYLE_DEFAULT
+                    or istyle > QsciScintilla.STYLE_LASTPREDEFINED
+                ):
+                    if lex.description(istyle) or istyle == QsciScintilla.STYLE_DEFAULT:
                         style = PDFStyle()
-                        
+
                         font = lex.font(istyle)
                         if font.italic():
                             style.font |= 2
                         if font.bold():
                             style.font |= 1
-                        
+
                         colour = lex.color(istyle)
                         style.fore = self.__getPDFRGB(colour)
                         self.pr.style[istyle] = style
-                    
+
                         # get substyles
-                        subs_start, subs_count = self.editor.getSubStyleRange(
-                            istyle)
+                        subs_start, subs_count = self.editor.getSubStyleRange(istyle)
                         for subs_idx in range(subs_count):
                             style = PDFStyle()
                             font = lex.font(subs_start + subs_idx)
@@ -521,7 +526,7 @@
                                 style.font |= 2
                             if font.bold():
                                 style.font |= 1
-                            
+
                             colour = lex.color(subs_start + subs_idx)
                             style.fore = self.__getPDFRGB(colour)
                             # styleAt returns negative numbers for substyles
@@ -534,40 +539,41 @@
                             self.pr.fontSize += fontSize
                         else:
                             self.pr.fontSize = PDF_FONTSIZE_DEFAULT
-                    
+
                 istyle += 1
         else:
             style = PDFStyle()
-            
+
             font = Preferences.getEditorOtherFonts("DefaultFont")
             if font.italic():
                 style.font |= 2
             if font.bold():
                 style.font |= 1
-            
+
             colour = self.editor.color()
             style.fore = self.__getPDFRGB(colour)
             self.pr.style[0] = style
             self.pr.style[QsciScintilla.STYLE_DEFAULT] = style
-            
+
             fontSize = QFontInfo(font).pointSize()
             if fontSize > 0:
                 self.pr.fontSize += fontSize
             else:
                 self.pr.fontSize = PDF_FONTSIZE_DEFAULT
-        
-        with EricOverrideCursor(), open(filename, "w", encoding="cp1250",
-                                        errors="backslashreplace") as f:
+
+        with EricOverrideCursor(), open(
+            filename, "w", encoding="cp1250", errors="backslashreplace"
+        ) as f:
             # save file in win ansi using cp1250
             try:
                 # initialise PDF rendering
                 ot = PDFObjectTracker(f)
                 self.pr.oT = ot
                 self.pr.startPDF()
-                
+
                 # do here all the writing
                 lengthDoc = self.editor.length()
-                
+
                 if lengthDoc == 0:
                     self.pr.nextLine()  # enable zero length docs
                 else:
@@ -576,21 +582,18 @@
                     utf8 = self.editor.isUtf8()
                     utf8Ch = b""
                     utf8Len = 0
-                    
+
                     while pos < lengthDoc:
                         ch = self.editor.byteAt(pos)
                         style = self.editor.styleAt(pos)
-                        
-                        if ch == b'\t':
+
+                        if ch == b"\t":
                             # expand tabs
                             ts = tabSize - (column % tabSize)
                             column += ts
-                            self.pr.add(' ' * ts, style)
-                        elif ch in (b'\r', b'\n'):
-                            if (
-                                ch == b'\r' and
-                                self.editor.byteAt(pos + 1) == b'\n'
-                            ):
+                            self.pr.add(" " * ts, style)
+                        elif ch in (b"\r", b"\n"):
+                            if ch == b"\r" and self.editor.byteAt(pos + 1) == b"\n":
                                 pos += 1
                             # close and begin a newline...
                             self.pr.nextLine()
@@ -609,7 +612,7 @@
                                     column -= 1
                                     # will be incremented again later
                                 elif len(utf8Ch) == utf8Len:
-                                    ch = utf8Ch.decode('utf8')
+                                    ch = utf8Ch.decode("utf8")
                                     self.pr.add(ch, style)
                                     utf8Ch = b""
                                     utf8Len = 0
@@ -619,9 +622,9 @@
                             else:
                                 self.pr.add(ch.decode(), style)
                             column += 1
-                        
+
                         pos += 1
-                
+
                 # write required stuff and close the PDF file
                 self.pr.endPDF()
             except OSError as err:
@@ -630,5 +633,6 @@
                     self.tr("Export source"),
                     self.tr(
                         """<p>The source could not be exported to"""
-                        """ <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                    .format(filename, str(err)))
+                        """ <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                    ).format(filename, str(err)),
+                )
--- a/src/eric7/QScintilla/Exporters/ExporterRTF.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterRTF.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,6 +27,7 @@
     """
     Class implementing an exporter for RTF.
     """
+
     RTF_HEADEROPEN = "{\\rtf1\\ansi\\deff0\\deftab720"
     RTF_HEADERCLOSE = "\n"
     RTF_FONTDEFOPEN = "{\\fonttbl"
@@ -60,16 +61,16 @@
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         ExporterBase.__init__(self, editor, parent)
-    
+
     def __GetRTFNextControl(self, pos, style):
         """
         Private method to extract the next RTF control word from style.
-        
+
         @param pos position to start search (integer)
         @param style style definition to search in (string)
         @return tuple of new start position and control word found
@@ -78,18 +79,18 @@
         # \f0\fs20\cf0\highlight0\b0\i0
         if pos >= len(style):
             return pos, ""
-        
+
         oldpos = pos
-        pos += 1    # implicit skip over leading '\'
-        while pos < len(style) and style[pos] != '\\':
+        pos += 1  # implicit skip over leading '\'
+        while pos < len(style) and style[pos] != "\\":
             pos += 1
         return pos, style[oldpos:pos]
-    
+
     def __GetRTFStyleChange(self, last, current):
         """
         Private method to extract control words that are different between two
         styles.
-        
+
         @param last least recently used style (string)
         @param current current style (string)
         @return string containing the delta between these styles (string)
@@ -97,19 +98,18 @@
         # \f0\fs20\cf0\highlight0\b0\i0
         lastPos = 0
         currentPos = 0
-        delta = ''
+        delta = ""
         i = 0
         while i < 6:
             lastPos, lastControl = self.__GetRTFNextControl(lastPos, last)
-            currentPos, currentControl = self.__GetRTFNextControl(currentPos,
-                                                                  current)
+            currentPos, currentControl = self.__GetRTFNextControl(currentPos, current)
             if lastControl != currentControl:
                 delta += currentControl
             i += 1
-        if delta != '':
-            delta += ' '
+        if delta != "":
+            delta += " "
         return delta
-    
+
     def exportSource(self):
         """
         Public method performing the export.
@@ -117,26 +117,30 @@
         filename = self._getFileName(self.tr("RTF Files (*.rtf)"))
         if not filename:
             return
-        
+
         self.editor.recolor(0, -1)
         tabs = Preferences.getEditorExporter("RTF/UseTabs")
         tabSize = self.editor.getEditorConfig("TabWidth")
         if tabSize == 0:
             tabSize = 4
-        
+
         with EricOverrideCursor(), open(filename, "w", encoding="utf-8") as f:
             try:
                 styles, fontsize = self.__prepareStyles(f)
-                
+
                 lastStyle = (
-                    self.RTF_SETFONTFACE + "0" +
-                    self.RTF_SETFONTSIZE + "{0:d}".format(fontsize) +
-                    self.RTF_SETCOLOR + "0" +
-                    self.RTF_SETBACKGROUND + "1" +
-                    self.RTF_BOLD_OFF +
-                    self.RTF_ITALIC_OFF
+                    self.RTF_SETFONTFACE
+                    + "0"
+                    + self.RTF_SETFONTSIZE
+                    + "{0:d}".format(fontsize)
+                    + self.RTF_SETCOLOR
+                    + "0"
+                    + self.RTF_SETBACKGROUND
+                    + "1"
+                    + self.RTF_BOLD_OFF
+                    + self.RTF_ITALIC_OFF
                 )
-                
+
                 lengthDoc = self.editor.length()
                 prevCR = False
                 column = 0
@@ -146,36 +150,35 @@
                 utf8 = self.editor.isUtf8()
                 utf8Ch = b""
                 utf8Len = 0
-                
+
                 while pos < lengthDoc:
                     ch = self.editor.byteAt(pos)
                     style = self.editor.styleAt(pos)
                     if style != styleCurrent:
-                        deltaStyle = self.__GetRTFStyleChange(
-                            lastStyle, styles[style])
+                        deltaStyle = self.__GetRTFStyleChange(lastStyle, styles[style])
                         if deltaStyle:
                             f.write(deltaStyle)
                         styleCurrent = style
                         lastStyle = styles[style]
-                    
-                    if ch == b'{':
-                        f.write('\\{')
-                    elif ch == b'}':
-                        f.write('\\}')
-                    elif ch == b'\\':
-                        f.write('\\\\')
-                    elif ch == b'\t':
+
+                    if ch == b"{":
+                        f.write("\\{")
+                    elif ch == b"}":
+                        f.write("\\}")
+                    elif ch == b"\\":
+                        f.write("\\\\")
+                    elif ch == b"\t":
                         if tabs:
                             f.write(self.RTF_TAB)
                         else:
                             ts = tabSize - (column % tabSize)
-                            f.write(' ' * ts)
+                            f.write(" " * ts)
                             column += ts - 1
-                    elif ch == b'\n':
+                    elif ch == b"\n":
                         if not prevCR:
                             f.write(self.RTF_EOLN)
                             column -= 1
-                    elif ch == b'\r':
+                    elif ch == b"\r":
                         f.write(self.RTF_EOLN)
                         column -= 1
                     else:
@@ -191,12 +194,15 @@
                                 column -= 1
                                 # will be incremented again later
                             elif len(utf8Ch) == utf8Len:
-                                ch = utf8Ch.decode('utf8')
-                                if ord(ch) <= 0xff:
+                                ch = utf8Ch.decode("utf8")
+                                if ord(ch) <= 0xFF:
                                     f.write("\\'{0:x}".format(ord(ch)))
                                 else:
-                                    f.write("\\u{0:d}\\'{1:x}".format(
-                                            ord(ch), ord(ch) & 0xFF))
+                                    f.write(
+                                        "\\u{0:d}\\'{1:x}".format(
+                                            ord(ch), ord(ch) & 0xFF
+                                        )
+                                    )
                                 utf8Ch = b""
                                 utf8Len = 0
                             else:
@@ -204,11 +210,11 @@
                                 # will be incremented again later
                         else:
                             f.write(ch.decode())
-                    
+
                     column += 1
-                    prevCR = ch == b'\r'
+                    prevCR = ch == b"\r"
                     pos += 1
-                
+
                 f.write(self.RTF_BODYCLOSE)
             except OSError as err:
                 EricMessageBox.critical(
@@ -216,13 +222,14 @@
                     self.tr("Export source"),
                     self.tr(
                         """<p>The source could not be exported to"""
-                        """ <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                    .format(filename, str(err)))
-    
+                        """ <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                    ).format(filename, str(err)),
+                )
+
     def __prepareStyles(self, f):
         """
         Private method to generate and store the different styles.
-        
+
         @param f filepointer to the open RTF
         @type object
         @return styles, fontsize
@@ -232,9 +239,9 @@
         fonts = {}
         colors = {}
         lastStyle = ""
-        
+
         lex = self.editor.getLexer()
-        
+
         wysiwyg = Preferences.getEditorExporter("RTF/WYSIWYG")
         if wysiwyg:
             if lex:
@@ -248,14 +255,14 @@
         if fontsize == 0:
             fontsize = 10 << 1
         characterset = QsciScintilla.SC_CHARSET_DEFAULT
-        
+
         if lex:
             fgColour = lex.color(QsciScintilla.STYLE_DEFAULT)
             bgColour = lex.paper(QsciScintilla.STYLE_DEFAULT)
         else:
             fgColour = self.editor.color()
             bgColour = self.editor.paper()
-        
+
         f.write(self.RTF_HEADEROPEN + self.RTF_FONTDEFOPEN)
         fonts[0] = fontface
         fontCount = 1
@@ -263,13 +270,13 @@
         colors[0] = fgColour
         colors[1] = bgColour
         colorCount = 2
-        
+
         if lex:
             istyle = 0
             while istyle <= QsciScintilla.STYLE_MAX:
                 if (
-                    istyle < QsciScintilla.STYLE_DEFAULT or
-                    istyle > QsciScintilla.STYLE_LASTPREDEFINED
+                    istyle < QsciScintilla.STYLE_DEFAULT
+                    or istyle > QsciScintilla.STYLE_LASTPREDEFINED
                 ):
                     if lex.description(istyle):
                         font = lex.font(istyle)
@@ -282,25 +289,26 @@
                                     break
                             else:
                                 fonts[fontCount] = font.family()
-                                f.write(self.RTF_FONTDEF.format(
-                                    fontCount, characterset,
-                                    font.family()))
+                                f.write(
+                                    self.RTF_FONTDEF.format(
+                                        fontCount, characterset, font.family()
+                                    )
+                                )
                                 fontKey = fontCount
                                 fontCount += 1
-                            
+
                             lastStyle += "{0:d}".format(fontKey)
                         else:
                             lastStyle += "0"
-                        
+
                         lastStyle += self.RTF_SETFONTSIZE
                         if wysiwyg and QFontInfo(font).pointSize():
-                            lastStyle += (
-                                "{0:d}".format(
-                                    QFontInfo(font).pointSize() << 1)
+                            lastStyle += "{0:d}".format(
+                                QFontInfo(font).pointSize() << 1
                             )
                         else:
                             lastStyle += "{0:d}".format(fontsize)
-                        
+
                         sColour = lex.color(istyle)
                         sColourKey = None
                         for key, value in colors.items():
@@ -311,11 +319,8 @@
                             colors[colorCount] = sColour
                             sColourKey = colorCount
                             colorCount += 1
-                        lastStyle += (
-                            self.RTF_SETCOLOR +
-                            "{0:d}".format(sColourKey)
-                        )
-                        
+                        lastStyle += self.RTF_SETCOLOR + "{0:d}".format(sColourKey)
+
                         sColour = lex.paper(istyle)
                         sColourKey = None
                         for key, value in colors.items():
@@ -326,12 +331,9 @@
                             colors[colorCount] = sColour
                             sColourKey = colorCount
                             colorCount += 1
-                        
-                        lastStyle += (
-                            self.RTF_SETBACKGROUND +
-                            "{0:d}".format(sColourKey)
-                        )
-                        
+
+                        lastStyle += self.RTF_SETBACKGROUND + "{0:d}".format(sColourKey)
+
                         if font.bold():
                             lastStyle += self.RTF_BOLD_ON
                         else:
@@ -341,10 +343,9 @@
                         else:
                             lastStyle += self.RTF_ITALIC_OFF
                         styles[istyle] = lastStyle
-                        
+
                         # get substyles
-                        subs_start, subs_count = self.editor.getSubStyleRange(
-                            istyle)
+                        subs_start, subs_count = self.editor.getSubStyleRange(istyle)
                         for subs_idx in range(subs_count):
                             font = lex.font(subs_start + subs_idx)
                             lastStyle = self.RTF_SETFONTFACE
@@ -356,25 +357,26 @@
                                         break
                                 else:
                                     fonts[fontCount] = font.family()
-                                    f.write(self.RTF_FONTDEF.format(
-                                        fontCount, characterset,
-                                        font.family()))
+                                    f.write(
+                                        self.RTF_FONTDEF.format(
+                                            fontCount, characterset, font.family()
+                                        )
+                                    )
                                     fontKey = fontCount
                                     fontCount += 1
-                                
+
                                 lastStyle += "{0:d}".format(fontKey)
                             else:
                                 lastStyle += "0"
-                            
+
                             lastStyle += self.RTF_SETFONTSIZE
                             if wysiwyg and QFontInfo(font).pointSize():
-                                lastStyle += (
-                                    "{0:d}".format(
-                                        QFontInfo(font).pointSize() << 1)
+                                lastStyle += "{0:d}".format(
+                                    QFontInfo(font).pointSize() << 1
                                 )
                             else:
                                 lastStyle += "{0:d}".format(fontsize)
-                            
+
                             sColour = lex.color(subs_start + subs_idx)
                             sColourKey = None
                             for key, value in colors.items():
@@ -385,11 +387,8 @@
                                 colors[colorCount] = sColour
                                 sColourKey = colorCount
                                 colorCount += 1
-                            lastStyle += (
-                                self.RTF_SETCOLOR +
-                                "{0:d}".format(sColourKey)
-                            )
-                            
+                            lastStyle += self.RTF_SETCOLOR + "{0:d}".format(sColourKey)
+
                             sColour = lex.paper(subs_start + subs_idx)
                             sColourKey = None
                             for key, value in colors.items():
@@ -400,12 +399,11 @@
                                 colors[colorCount] = sColour
                                 sColourKey = colorCount
                                 colorCount += 1
-                            
-                            lastStyle += (
-                                self.RTF_SETBACKGROUND +
-                                "{0:d}".format(sColourKey)
+
+                            lastStyle += self.RTF_SETBACKGROUND + "{0:d}".format(
+                                sColourKey
                             )
-                            
+
                             if font.bold():
                                 lastStyle += self.RTF_BOLD_ON
                             else:
@@ -415,41 +413,52 @@
                             else:
                                 lastStyle += self.RTF_ITALIC_OFF
                             styles[subs_idx - subs_start] = lastStyle
-                        
+
                     else:
                         styles[istyle] = (
-                            self.RTF_SETFONTFACE + "0" +
-                            self.RTF_SETFONTSIZE +
-                            "{0:d}".format(fontsize) +
-                            self.RTF_SETCOLOR + "0" +
-                            self.RTF_SETBACKGROUND + "1" +
-                            self.RTF_BOLD_OFF +
-                            self.RTF_ITALIC_OFF
+                            self.RTF_SETFONTFACE
+                            + "0"
+                            + self.RTF_SETFONTSIZE
+                            + "{0:d}".format(fontsize)
+                            + self.RTF_SETCOLOR
+                            + "0"
+                            + self.RTF_SETBACKGROUND
+                            + "1"
+                            + self.RTF_BOLD_OFF
+                            + self.RTF_ITALIC_OFF
                         )
-                
+
                 istyle += 1
         else:
             styles[0] = (
-                self.RTF_SETFONTFACE + "0" +
-                self.RTF_SETFONTSIZE +
-                "{0:d}".format(fontsize) +
-                self.RTF_SETCOLOR + "0" +
-                self.RTF_SETBACKGROUND + "1" +
-                self.RTF_BOLD_OFF +
-                self.RTF_ITALIC_OFF
+                self.RTF_SETFONTFACE
+                + "0"
+                + self.RTF_SETFONTSIZE
+                + "{0:d}".format(fontsize)
+                + self.RTF_SETCOLOR
+                + "0"
+                + self.RTF_SETBACKGROUND
+                + "1"
+                + self.RTF_BOLD_OFF
+                + self.RTF_ITALIC_OFF
             )
-        
+
         f.write(self.RTF_FONTDEFCLOSE + self.RTF_COLORDEFOPEN)
         for value in colors.values():
-            f.write(self.RTF_COLORDEF.format(
-                    value.red(), value.green(), value.blue()))
+            f.write(self.RTF_COLORDEF.format(value.red(), value.green(), value.blue()))
         f.write(self.RTF_COLORDEFCLOSE)
         f.write(self.RTF_INFOOPEN + self.RTF_COMMENT)
         f.write(time.strftime(self.RTF_CREATED))
         f.write(self.RTF_INFOCLOSE)
-        f.write(self.RTF_HEADERCLOSE +
-                self.RTF_BODYOPEN + self.RTF_SETFONTFACE + "0" +
-                self.RTF_SETFONTSIZE + "{0:d}".format(fontsize) +
-                self.RTF_SETCOLOR + "0 ")
-        
+        f.write(
+            self.RTF_HEADERCLOSE
+            + self.RTF_BODYOPEN
+            + self.RTF_SETFONTFACE
+            + "0"
+            + self.RTF_SETFONTSIZE
+            + "{0:d}".format(fontsize)
+            + self.RTF_SETCOLOR
+            + "0 "
+        )
+
         return styles, fontsize
--- a/src/eric7/QScintilla/Exporters/ExporterTEX.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/ExporterTEX.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,21 +26,22 @@
     """
     Class implementing an exporter for TeX.
     """
+
     CHARZ = 26
-    
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor.Editor)
         @param parent parent object of the exporter (QObject)
         """
         ExporterBase.__init__(self, editor, parent)
-    
+
     def __getTexRGB(self, color):
         """
         Private method to convert a color object to a TeX color string.
-        
+
         @param color color object to convert (QColor)
         @return TeX color string (string)
         """
@@ -48,30 +49,31 @@
         rf = color.red() / 256.0
         gf = color.green() / 256.0
         bf = color.blue() / 256.0
-        
+
         # avoid breakage due to locale setting
         r = int(rf * 10 + 0.5)
         g = int(gf * 10 + 0.5)
         b = int(bf * 10 + 0.5)
-        
+
         return "{0:d}.{1:d}, {2:d}.{3:d}, {4:d}.{5:d}".format(
-               r // 10, r % 10, g // 10, g % 10, b // 10, b % 10)
-    
+            r // 10, r % 10, g // 10, g % 10, b // 10, b % 10
+        )
+
     def __texStyle(self, style):
         """
         Private method to calculate a style name string for a given style
         number.
-        
+
         @param style style number (integer)
         @return style name string (string)
         """
         buf = ""
         if style >= 0:
-            start = ord('a')
+            start = ord("a")
         else:
-            start = ord('A')
+            start = ord("A")
             style = abs(style)
-        
+
         if style == 0:
             buf = "a"
         else:
@@ -79,11 +81,11 @@
                 buf += chr(start + (style % self.CHARZ))
                 style //= self.CHARZ
         return buf
-    
+
     def __defineTexStyle(self, font, color, paper, file, istyle):
         """
         Private method to define a new TeX style.
-        
+
         @param font the font to be used (QFont)
         @param color the foreground color to be used (QColor)
         @param paper the background color to be used (QColor)
@@ -93,7 +95,9 @@
         closing_brackets = 3
         file.write(
             "\\newcommand{{\\eric{0}}}[1]{{\\noindent{{\\ttfamily{{".format(
-                self.__texStyle(istyle)))
+                self.__texStyle(istyle)
+            )
+        )
         if font.italic():
             file.write("\\textit{")
             closing_brackets += 1
@@ -101,15 +105,13 @@
             file.write("\\textbf{")
             closing_brackets += 1
         if color != self.defaultColor:
-            file.write(
-                "\\textcolor[rgb]{{{0}}}{{".format(self.__getTexRGB(color)))
+            file.write("\\textcolor[rgb]{{{0}}}{{".format(self.__getTexRGB(color)))
             closing_brackets += 1
         if paper != self.defaultPaper:
-            file.write(
-                "\\colorbox[rgb]{{{0}}}{{".format(self.__getTexRGB(paper)))
+            file.write("\\colorbox[rgb]{{{0}}}{{".format(self.__getTexRGB(paper)))
             closing_brackets += 1
-        file.write("#1{0}\n".format('}' * closing_brackets))
-    
+        file.write("#1{0}\n".format("}" * closing_brackets))
+
     def exportSource(self):
         """
         Public method performing the export.
@@ -117,35 +119,29 @@
         filename = self._getFileName(self.tr("TeX Files (*.tex)"))
         if not filename:
             return
-        
+
         self.editor.recolor(0, -1)
-        
+
         tabSize = self.editor.getEditorConfig("TabWidth")
         if tabSize == 0:
             tabSize = 4
-        
-        onlyStylesUsed = Preferences.getEditorExporter(
-            "TeX/OnlyStylesUsed")
-        titleFullPath = Preferences.getEditorExporter(
-            "TeX/FullPathAsTitle")
-        
+
+        onlyStylesUsed = Preferences.getEditorExporter("TeX/OnlyStylesUsed")
+        titleFullPath = Preferences.getEditorExporter("TeX/FullPathAsTitle")
+
         lex = self.editor.getLexer()
         self.defaultPaper = (
-            lex and
-            lex.paper(QsciScintilla.STYLE_DEFAULT) or
-            self.editor.paper().name()
+            lex and lex.paper(QsciScintilla.STYLE_DEFAULT) or self.editor.paper().name()
         )
         self.defaultColor = (
-            lex and
-            lex.color(QsciScintilla.STYLE_DEFAULT) or
-            self.editor.color().name()
+            lex and lex.color(QsciScintilla.STYLE_DEFAULT) or self.editor.color().name()
         )
         self.defaultFont = (
-            lex and
-            lex.color(QsciScintilla.STYLE_DEFAULT) or
-            Preferences.getEditorOtherFonts("DefaultFont")
+            lex
+            and lex.color(QsciScintilla.STYLE_DEFAULT)
+            or Preferences.getEditorOtherFonts("DefaultFont")
         )
-        
+
         lengthDoc = self.editor.length()
         styleIsUsed = {}
         if onlyStylesUsed:
@@ -160,7 +156,7 @@
             for index in range(QsciScintilla.STYLE_MAX + 1):
                 styleIsUsed[index] = True
         styleIsUsed[QsciScintilla.STYLE_DEFAULT] = True
-        
+
         with EricOverrideCursor(), open(filename, "w", encoding="utf-8") as f:
             try:
                 f.write("\\documentclass[a4paper]{article}\n")
@@ -173,104 +169,102 @@
                     f.write("\\usepackage[utf8]{inputenc}\n")
                 else:
                     f.write("\\usepackage[latin1]{inputenc}\n")
-                
+
                 if lex:
                     istyle = 0
                     while istyle <= QsciScintilla.STYLE_MAX:
                         if (
-                            (istyle <= QsciScintilla.STYLE_DEFAULT or
-                             istyle > QsciScintilla.STYLE_LASTPREDEFINED) and
-                            styleIsUsed[istyle] and
-                            (lex.description(istyle) or
-                             istyle == QsciScintilla.STYLE_DEFAULT)
+                            (
+                                istyle <= QsciScintilla.STYLE_DEFAULT
+                                or istyle > QsciScintilla.STYLE_LASTPREDEFINED
+                            )
+                            and styleIsUsed[istyle]
+                            and (
+                                lex.description(istyle)
+                                or istyle == QsciScintilla.STYLE_DEFAULT
+                            )
                         ):
                             font = lex.font(istyle)
                             colour = lex.color(istyle)
                             paper = lex.paper(istyle)
-                            
-                            self.__defineTexStyle(
-                                font, colour, paper, f, istyle)
+
+                            self.__defineTexStyle(font, colour, paper, f, istyle)
                             # get substyles
-                            subs_start, subs_count = (
-                                self.editor.getSubStyleRange(istyle)
+                            subs_start, subs_count = self.editor.getSubStyleRange(
+                                istyle
                             )
                             for subs_idx in range(subs_count):
                                 font = lex.font(subs_start + subs_idx)
-                                colour = lex.color(
-                                    subs_start + subs_idx)
-                                paper = lex.paper(
-                                    subs_start + subs_idx)
-                                
+                                colour = lex.color(subs_start + subs_idx)
+                                paper = lex.paper(subs_start + subs_idx)
+
                                 self.__defineTexStyle(
-                                    font, colour, paper, f,
-                                    subs_idx - subs_start)
-                                
+                                    font, colour, paper, f, subs_idx - subs_start
+                                )
+
                         istyle += 1
                 else:
                     colour = self.editor.color()
                     paper = self.editor.paper()
                     font = Preferences.getEditorOtherFonts("DefaultFont")
-                    
+
                     self.__defineTexStyle(font, colour, paper, f, 0)
-                    self.__defineTexStyle(font, colour, paper, f,
-                                          QsciScintilla.STYLE_DEFAULT)
-                
+                    self.__defineTexStyle(
+                        font, colour, paper, f, QsciScintilla.STYLE_DEFAULT
+                    )
+
                 f.write("\\begin{document}\n\n")
                 title = (
                     self.editor.getFileName()
-                    if titleFullPath else
-                    os.path.basename(self.editor.getFileName())
+                    if titleFullPath
+                    else os.path.basename(self.editor.getFileName())
                 )
                 f.write(
-                    "Source File: {0}\n\n\\noindent\n\\tiny{{\n"
-                    .format(title.replace('_', '\\_')))
-                
+                    "Source File: {0}\n\n\\noindent\n\\tiny{{\n".format(
+                        title.replace("_", "\\_")
+                    )
+                )
+
                 styleCurrent = self.editor.styleAt(0)
-                f.write("\\eric{0}{{"
-                        .format(self.__texStyle(styleCurrent)))
-                
+                f.write("\\eric{0}{{".format(self.__texStyle(styleCurrent)))
+
                 lineIdx = 0
                 pos = 0
                 utf8 = self.editor.isUtf8()
                 utf8Ch = b""
                 utf8Len = 0
-                
+
                 while pos < lengthDoc:
                     ch = self.editor.byteAt(pos)
                     style = self.editor.styleAt(pos)
                     if style != styleCurrent:
                         # new style
-                        f.write(
-                            "}}\n\\eric{0}{{".format(
-                                self.__texStyle(style)))
+                        f.write("}}\n\\eric{0}{{".format(self.__texStyle(style)))
                         styleCurrent = style
-                    
-                    if ch == b'\t':
+
+                    if ch == b"\t":
                         ts = tabSize - (lineIdx % tabSize)
                         lineIdx += ts - 1
                         f.write("\\hspace*{{{0:d}em}}".format(ts))
-                    elif ch == b'\\':
+                    elif ch == b"\\":
                         f.write("{\\textbackslash}")
-                    elif ch in [b'>', b'<', b'@']:
+                    elif ch in [b">", b"<", b"@"]:
                         f.write("${0}$".format(ch.decode()))
-                    elif ch in [b'{', b'}', b'^', b'_', b'&', b'$', b'#',
-                                b'%', b'~']:
+                    elif ch in [b"{", b"}", b"^", b"_", b"&", b"$", b"#", b"%", b"~"]:
                         f.write("\\{0}".format(ch.decode()))
-                    elif ch in [b'\r', b'\n']:
-                        lineIdx = -1    # because incremented below
-                        if (
-                            ch == b'\r' and
-                            self.editor.byteAt(pos + 1) == b'\n'
-                        ):
-                            pos += 1    # skip the LF
+                    elif ch in [b"\r", b"\n"]:
+                        lineIdx = -1  # because incremented below
+                        if ch == b"\r" and self.editor.byteAt(pos + 1) == b"\n":
+                            pos += 1  # skip the LF
                         styleCurrent = self.editor.styleAt(pos + 1)
-                        f.write("}} \\\\\n\\eric{0}{{".format(
-                                self.__texStyle(styleCurrent)))
-                    elif ch == b' ':
-                        if self.editor.byteAt(pos + 1) == b' ':
+                        f.write(
+                            "}} \\\\\n\\eric{0}{{".format(self.__texStyle(styleCurrent))
+                        )
+                    elif ch == b" ":
+                        if self.editor.byteAt(pos + 1) == b" ":
                             f.write("{\\hspace*{1em}}")
                         else:
-                            f.write(' ')
+                            f.write(" ")
                     else:
                         if ord(ch) > 127 and utf8:
                             utf8Ch += ch
@@ -282,7 +276,7 @@
                                 elif (utf8Ch[0] & 0xC0) == 0xC0:
                                     utf8Len = 2
                             elif len(utf8Ch) == utf8Len:
-                                ch = utf8Ch.decode('utf8')
+                                ch = utf8Ch.decode("utf8")
                                 f.write(ch)
                                 utf8Ch = b""
                                 utf8Len = 0
@@ -290,7 +284,7 @@
                             f.write(ch.decode())
                     lineIdx += 1
                     pos += 1
-                
+
                 # close last empty style macros and document too
                 f.write("}\n} %end tiny\n\n\\end{document}\n")
             except OSError as err:
@@ -299,5 +293,6 @@
                     self.tr("Export source"),
                     self.tr(
                         """<p>The source could not be exported to"""
-                        """ <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                    .format(filename, str(err)))
+                        """ <b>{0}</b>.</p><p>Reason: {1}</p>"""
+                    ).format(filename, str(err)),
+                )
--- a/src/eric7/QScintilla/Exporters/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Exporters/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,26 +13,26 @@
 def getSupportedFormats():
     """
     Module function to get a dictionary of supported exporters.
-    
+
     @return dictionary of supported exporters. The keys are the
         internal format names. The items are the display strings
         for the exporters (string)
     """
     supportedFormats = {
-        "HTML": QCoreApplication.translate('Exporters', "HTML"),
-        "RTF": QCoreApplication.translate('Exporters', "RTF"),
-        "PDF": QCoreApplication.translate('Exporters', "PDF"),
-        "TeX": QCoreApplication.translate('Exporters', "TeX"),
-        "ODT": QCoreApplication.translate('Exporters', "ODT"),
+        "HTML": QCoreApplication.translate("Exporters", "HTML"),
+        "RTF": QCoreApplication.translate("Exporters", "RTF"),
+        "PDF": QCoreApplication.translate("Exporters", "PDF"),
+        "TeX": QCoreApplication.translate("Exporters", "TeX"),
+        "ODT": QCoreApplication.translate("Exporters", "ODT"),
     }
-    
+
     return supportedFormats
 
 
 def getExporter(exporterFormat, editor):
     """
     Module function to instantiate an exporter object for a given format.
-    
+
     @param exporterFormat format of the exporter (string)
     @param editor reference to the editor object (QScintilla.Editor.Editor)
     @return reference to the instanciated exporter object
@@ -41,18 +41,23 @@
     try:
         if exporterFormat == "HTML":
             from .ExporterHTML import ExporterHTML
+
             return ExporterHTML(editor)
         elif exporterFormat == "PDF":
             from .ExporterPDF import ExporterPDF
+
             return ExporterPDF(editor)
         elif exporterFormat == "RTF":
             from .ExporterRTF import ExporterRTF
+
             return ExporterRTF(editor)
         elif exporterFormat == "TeX":
             from .ExporterTEX import ExporterTEX
+
             return ExporterTEX(editor)
         elif exporterFormat == "ODT":
             from .ExporterODT import ExporterODT
+
             return ExporterODT(editor)
     except ImportError:
         return None
--- a/src/eric7/QScintilla/GotoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/GotoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing the Goto dialog.
     """
+
     def __init__(self, maximum, curLine, parent, name=None, modal=False):
         """
         Constructor
-        
+
         @param maximum maximum allowed for the spinbox (integer)
         @param curLine current line number (integer)
         @param parent parent widget of this dialog (QWidget)
@@ -31,21 +32,20 @@
             self.setObjectName(name)
         self.setupUi(self)
         self.setModal(modal)
-        
+
         self.linenumberSpinBox.setMaximum(maximum)
         self.linenumberSpinBox.setValue(curLine)
         self.linenumberSpinBox.selectAll()
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setDefault(True)
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getLinenumber(self):
         """
         Public method to retrieve the linenumber.
-        
+
         @return line number (int)
         """
         return self.linenumberSpinBox.value()
--- a/src/eric7/QScintilla/KeySequenceTranslator.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/KeySequenceTranslator.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,36 +31,28 @@
     QsciScintilla.SCI_PARADOWN: QKeySequence.StandardKey.MoveToEndOfBlock,
     QsciScintilla.SCI_PAGEUP: QKeySequence.StandardKey.MoveToPreviousPage,
     QsciScintilla.SCI_PAGEDOWN: QKeySequence.StandardKey.MoveToNextPage,
-    QsciScintilla.SCI_DOCUMENTSTART:
-        QKeySequence.StandardKey.MoveToStartOfDocument,
-    QsciScintilla.SCI_DOCUMENTEND:
-        QKeySequence.StandardKey.MoveToEndOfDocument,
+    QsciScintilla.SCI_DOCUMENTSTART: QKeySequence.StandardKey.MoveToStartOfDocument,
+    QsciScintilla.SCI_DOCUMENTEND: QKeySequence.StandardKey.MoveToEndOfDocument,
     QsciScintilla.SCI_TAB: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_BACKTAB: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_CHARLEFTEXTEND:
-        QKeySequence.StandardKey.SelectPreviousChar,
+    QsciScintilla.SCI_CHARLEFTEXTEND: QKeySequence.StandardKey.SelectPreviousChar,
     QsciScintilla.SCI_CHARRIGHTEXTEND: QKeySequence.StandardKey.SelectNextChar,
-    QsciScintilla.SCI_LINEUPEXTEND:
-        QKeySequence.StandardKey.SelectPreviousLine,
+    QsciScintilla.SCI_LINEUPEXTEND: QKeySequence.StandardKey.SelectPreviousLine,
     QsciScintilla.SCI_LINEDOWNEXTEND: QKeySequence.StandardKey.SelectNextLine,
     QsciScintilla.SCI_WORDPARTLEFTEXTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_WORDPARTRIGHTEXTEND: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_WORDLEFTEXTEND:
-        QKeySequence.StandardKey.SelectPreviousWord,
+    QsciScintilla.SCI_WORDLEFTEXTEND: QKeySequence.StandardKey.SelectPreviousWord,
     QsciScintilla.SCI_WORDRIGHTEXTEND: QKeySequence.StandardKey.SelectNextWord,
     QsciScintilla.SCI_VCHOMEEXTEND: QKeySequence.StandardKey.SelectStartOfLine,
     QsciScintilla.SCI_LINEENDEXTEND: QKeySequence.StandardKey.SelectEndOfLine,
-    QsciScintilla.SCI_PARAUPEXTEND:
-        QKeySequence.StandardKey.SelectStartOfBlock,
-    QsciScintilla.SCI_PARADOWNEXTEND:
-        QKeySequence.StandardKey.SelectEndOfBlock,
-    QsciScintilla.SCI_PAGEUPEXTEND:
-        QKeySequence.StandardKey.SelectPreviousPage,
+    QsciScintilla.SCI_PARAUPEXTEND: QKeySequence.StandardKey.SelectStartOfBlock,
+    QsciScintilla.SCI_PARADOWNEXTEND: QKeySequence.StandardKey.SelectEndOfBlock,
+    QsciScintilla.SCI_PAGEUPEXTEND: QKeySequence.StandardKey.SelectPreviousPage,
     QsciScintilla.SCI_PAGEDOWNEXTEND: QKeySequence.StandardKey.SelectNextPage,
-    QsciScintilla.SCI_DOCUMENTSTARTEXTEND:
-        QKeySequence.StandardKey.SelectStartOfDocument,
-    QsciScintilla.SCI_DOCUMENTENDEXTEND:
-        QKeySequence.StandardKey.SelectEndOfDocument,
+    QsciScintilla.SCI_DOCUMENTSTARTEXTEND: (
+        QKeySequence.StandardKey.SelectStartOfDocument
+    ),
+    QsciScintilla.SCI_DOCUMENTENDEXTEND: QKeySequence.StandardKey.SelectEndOfDocument,
     QsciScintilla.SCI_DELETEBACK: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_DELETEBACKNOTLINE: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_CLEAR: QKeySequence.StandardKey.Delete,
@@ -76,8 +68,7 @@
     QsciScintilla.SCI_LINECOPY: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_EDITTOGGLEOVERTYPE: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_LINEENDDISPLAY: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_LINEENDDISPLAYEXTEND:
-        QKeySequence.StandardKey.UnknownKey,
+    QsciScintilla.SCI_LINEENDDISPLAYEXTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_FORMFEED: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_CANCEL: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_LINEDOWNRECTEXTEND: QKeySequence.StandardKey.UnknownKey,
@@ -107,15 +98,12 @@
     QsciScintilla.SCI_LINEENDWRAP: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_LINEENDWRAPEXTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_STUTTEREDPAGEUP: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_STUTTEREDPAGEUPEXTEND:
-        QKeySequence.StandardKey.UnknownKey,
+    QsciScintilla.SCI_STUTTEREDPAGEUPEXTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_STUTTEREDPAGEDOWN: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_STUTTEREDPAGEDOWNEXTEND:
-        QKeySequence.StandardKey.UnknownKey,
+    QsciScintilla.SCI_STUTTEREDPAGEDOWNEXTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_DELWORDRIGHTEND: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_MOVESELECTEDLINESUP: QKeySequence.StandardKey.UnknownKey,
-    QsciScintilla.SCI_MOVESELECTEDLINESDOWN:
-        QKeySequence.StandardKey.UnknownKey,
+    QsciScintilla.SCI_MOVESELECTEDLINESDOWN: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_LOWERCASE: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_UPPERCASE: QKeySequence.StandardKey.UnknownKey,
     QsciScintilla.SCI_LINEDELETE: QKeySequence.StandardKey.DeleteCompleteLine,
@@ -126,7 +114,7 @@
 def s2qTranslate(scintillaCommand):
     """
     Function to translate a QScintilla command to a QKeySequence.
-    
+
     @param scintillaCommand QScintilla command
     @type int
     @return Qt key sequence
--- a/src/eric7/QScintilla/Lexers/Lexer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/Lexer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,206 +14,195 @@
     """
     Class to implement the lexer mixin class.
     """
+
     def __init__(self):
         """
         Constructor
         """
-        self.commentString = ''
-        self.streamCommentString = {
-            'start': '',
-            'end': ''
-        }
-        self.boxCommentString = {
-            'start': '',
-            'middle': '',
-            'end': ''
-        }
-        
+        self.commentString = ""
+        self.streamCommentString = {"start": "", "end": ""}
+        self.boxCommentString = {"start": "", "middle": "", "end": ""}
+
         # last indented line wrapper
         self.lastIndented = -1
         self.lastIndentedIndex = -1
-        
+
         # always keep tabs (for languages where tabs are esential
         self._alwaysKeepTabs = False
-        
+
         # descriptions for keyword sets
         self.keywordSetDescriptions = []
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         # default implementation is a do nothing
         return
-        
+
     def commentStr(self):
         """
         Public method to return the comment string.
-        
+
         @return comment string (string)
         """
         return self.commentString
-        
+
     def canBlockComment(self):
         """
         Public method to determine, whether the lexer language supports a
         block comment.
-        
+
         @return flag (boolean)
         """
         return self.commentString != ""
-        
+
     def streamCommentStr(self):
         """
         Public method to return the stream comment strings.
-        
+
         @return stream comment strings (dictionary with two strings)
         """
         return self.streamCommentString
-        
+
     def canStreamComment(self):
         """
         Public method to determine, whether the lexer language supports a
         stream comment.
-        
+
         @return flag (boolean)
         """
         return (
-            self.streamCommentString['start'] != "" and
-            self.streamCommentString['end'] != ""
+            self.streamCommentString["start"] != ""
+            and self.streamCommentString["end"] != ""
         )
-        
+
     def boxCommentStr(self):
         """
         Public method to return the box comment strings.
-        
+
         @return box comment strings (dictionary with three QStrings)
         """
         return self.boxCommentString
-        
+
     def canBoxComment(self):
         """
         Public method to determine, whether the lexer language supports a
         box comment.
-        
+
         @return flag (boolean)
         """
         return (
-            (self.boxCommentString['start'] != "") and
-            (self.boxCommentString['middle'] != "") and
-            (self.boxCommentString['end'] != "")
+            (self.boxCommentString["start"] != "")
+            and (self.boxCommentString["middle"] != "")
+            and (self.boxCommentString["end"] != "")
         )
-        
+
     def alwaysKeepTabs(self):
         """
         Public method to check, if tab conversion is allowed.
-        
+
         @return flag indicating to keep tabs (boolean)
         """
         return self._alwaysKeepTabs
-        
+
     def hasSmartIndent(self):
         """
         Public method indicating whether lexer can do smart indentation.
-        
+
         @return flag indicating availability of smartIndentLine and
             smartIndentSelection methods (boolean)
         """
-        return hasattr(self, 'getIndentationDifference')
-        
+        return hasattr(self, "getIndentationDifference")
+
     def smartIndentLine(self, editor):
         """
         Public method to handle smart indentation for a line.
-        
+
         @param editor reference to the QScintilla editor object
         """
         cline, cindex = editor.getCursorPosition()
-        
+
         # get leading spaces
         lead_spaces = editor.indentation(cline)
-        
+
         # get the indentation difference
         indentDifference = self.getIndentationDifference(cline, editor)
-        
+
         if indentDifference != 0:
             editor.setIndentation(cline, lead_spaces + indentDifference)
             editor.setCursorPosition(cline, cindex + indentDifference)
-        
+
         self.lastIndented = cline
-        
+
     def smartIndentSelection(self, editor):
         """
         Public method to handle smart indentation for a selection of lines.
-        
+
         Note: The assumption is, that the first line determines the new
               indentation level.
-        
+
         @param editor reference to the QScintilla editor object
         """
         if not editor.hasSelectedText():
             return
-            
+
         # get the selection
         lineFrom, indexFrom, lineTo, indexTo = editor.getSelection()
         if lineFrom != self.lastIndented:
             self.lastIndentedIndex = indexFrom
-        
+
         endLine = lineTo if indexTo else lineTo - 1
-        
+
         # get the indentation difference
         indentDifference = self.getIndentationDifference(lineFrom, editor)
-        
+
         editor.beginUndoAction()
         # iterate over the lines
         for line in range(lineFrom, endLine + 1):
-            editor.setIndentation(
-                line, editor.indentation(line) + indentDifference)
+            editor.setIndentation(line, editor.indentation(line) + indentDifference)
         editor.endUndoAction()
-        
-        indexStart = (
-            indexFrom + indentDifference
-            if self.lastIndentedIndex != 0 else
-            0
-        )
+
+        indexStart = indexFrom + indentDifference if self.lastIndentedIndex != 0 else 0
         if indexStart < 0:
             indexStart = 0
         indexEnd = indexTo != 0 and (indexTo + indentDifference) or 0
         if indexEnd < 0:
             indexEnd = 0
         editor.setSelection(lineFrom, indexStart, lineTo, indexEnd)
-        
+
         self.lastIndented = lineFrom
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
         return []
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return True
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return True
-    
+
     def keywords(self, kwSet):
         """
         Public method to get the keywords.
-        
+
         @param kwSet number of the keyword set
         @type int
         @return space separated list of keywords
@@ -228,11 +217,11 @@
                 return kw
         else:
             return self.defaultKeywords(kwSet)
-    
+
     def keywordsDescription(self, kwSet):
         """
         Public method to get the description for a keywords set.
-        
+
         @param kwSet number of the keyword set
         @type int
         @return description of the keyword set
@@ -242,41 +231,41 @@
             return ""
         else:
             return self.keywordSetDescriptions[kwSet - 1]
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set
         @type int
         @return space separated list of keywords
         @rtype str or None
         """
-        return None     # __IGNORE_WARNING_M831__
-    
+        return None  # __IGNORE_WARNING_M831__
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         Note: A return value of 0 indicates to determine this dynamically.
-        
+
         @return maximum keyword set
         @rtype int
         """
         return len(self.keywordSetDescriptions)
-    
+
     def lexerName(self):
         """
         Public method to return the lexer name.
-        
+
         @return lexer name (string)
         """
         return self.lexer()
-    
+
     def hasSubstyles(self):
         """
         Public method to indicate the support of sub-styles.
-        
+
         @return flag indicating sub-styling support
         @rtype bool
         """
--- a/src/eric7/QScintilla/Lexers/LexerBash.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerBash.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,52 +17,55 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerBash.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldComments(Preferences.getEditor("BashFoldComment"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerBash.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerBash.DoubleQuotedString,
-                         QsciLexerBash.SingleQuotedString,
-                         QsciLexerBash.SingleQuotedHereDocument]
-    
+        return style in [
+            QsciLexerBash.DoubleQuotedString,
+            QsciLexerBash.SingleQuotedString,
+            QsciLexerBash.SingleQuotedHereDocument,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerBatch.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerBatch.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,44 +16,45 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerBatch.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "REM "
-        
+
         self.keywordSetDescriptions = [
             self.tr("Internal Commands"),
-            self.tr("External Commands")
+            self.tr("External Commands"),
         ]
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerBatch.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerCMake.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerCMake.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,51 +17,52 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerCMake.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Commands"),
             self.tr("Parameters"),
             self.tr("User defined"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldAtElse(Preferences.getEditor("CMakeFoldAtElse"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerCMake.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return style in [QsciLexerCMake.String]
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerCPP.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerCPP.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,28 +19,22 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None, caseInsensitiveKeywords=False):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         @param caseInsensitiveKeywords flag indicating keywords are case
             insensitive (boolean)
         """
         QsciLexerCPP.__init__(self, parent, caseInsensitiveKeywords)
         SubstyledLexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -49,17 +43,17 @@
             self.tr("Preprocessor definitions"),
             self.tr("Task marker and error marker keywords"),
         ]
-        
+
         ##############################################################
         ## default sub-style definitions
         ##############################################################
-        
+
         diffToSecondary = 0x40
         # This may need to be changed to be in line with Scintilla C++ lexer.
-        
+
         # list of style numbers, that support sub-styling
         self.baseStyles = [11, 17, 11 + diffToSecondary, 17 + diffToSecondary]
-        
+
         self.defaultSubStyles = {
             11: {
                 0: {
@@ -67,7 +61,7 @@
                     "Words": "std map string vector",
                     "Style": {
                         "fore": 0xEE00AA,
-                    }
+                    },
                 },
             },
             17: {
@@ -76,26 +70,27 @@
                     "Words": "check",
                     "Style": {
                         "fore": 0x00AAEE,
-                    }
+                    },
                 },
             },
-            11 + diffToSecondary: {
+            11
+            + diffToSecondary: {
                 0: {
                     "Description": self.tr("Inactive additional identifier"),
                     "Words": "std map string vector",
                     "Style": {
                         "fore": 0xBB6666,
-                    }
+                    },
                 },
             },
-            17 + diffToSecondary: {
+            17
+            + diffToSecondary: {
                 0: {
-                    "Description": self.tr(
-                        "Inactive additional JavaDoc keyword"),
+                    "Description": self.tr("Inactive additional JavaDoc keyword"),
                     "Words": "check",
                     "Style": {
                         "fore": 0x6699AA,
-                    }
+                    },
                 },
             },
         }
@@ -117,70 +112,77 @@
         with contextlib.suppress(AttributeError):
             self.setDollarsAllowed(Preferences.getEditor("CppDollarsAllowed"))
         with contextlib.suppress(AttributeError):
-            self.setStylePreprocessor(
-                Preferences.getEditor("CppStylePreprocessor"))
+            self.setStylePreprocessor(Preferences.getEditor("CppStylePreprocessor"))
         with contextlib.suppress(AttributeError):
             self.setHighlightTripleQuotedStrings(
-                Preferences.getEditor("CppHighlightTripleQuotedStrings"))
+                Preferences.getEditor("CppHighlightTripleQuotedStrings")
+            )
         with contextlib.suppress(AttributeError):
             self.setHighlightHashQuotedStrings(
-                Preferences.getEditor("CppHighlightHashQuotedStrings"))
+                Preferences.getEditor("CppHighlightHashQuotedStrings")
+            )
         with contextlib.suppress(AttributeError):
             self.setHighlightBackQuotedStrings(
-                Preferences.getEditor("CppHighlightBackQuotedStrings"))
+                Preferences.getEditor("CppHighlightBackQuotedStrings")
+            )
         with contextlib.suppress(AttributeError):
             self.setHighlightEscapeSequences(
-                Preferences.getEditor("CppHighlightEscapeSequences"))
+                Preferences.getEditor("CppHighlightEscapeSequences")
+            )
         with contextlib.suppress(AttributeError):
             self.setVerbatimStringEscapeSequencesAllowed(
-                Preferences.getEditor(
-                    "CppVerbatimStringEscapeSequencesAllowed"))
-    
+                Preferences.getEditor("CppVerbatimStringEscapeSequencesAllowed")
+            )
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['::', '->', '.']
-    
+        return ["::", "->", "."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerCPP.Comment,
-                         QsciLexerCPP.CommentDoc,
-                         QsciLexerCPP.CommentLine,
-                         QsciLexerCPP.CommentLineDoc]
-    
+        return style in [
+            QsciLexerCPP.Comment,
+            QsciLexerCPP.CommentDoc,
+            QsciLexerCPP.CommentLine,
+            QsciLexerCPP.CommentLineDoc,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerCPP.DoubleQuotedString,
-                         QsciLexerCPP.SingleQuotedString,
-                         QsciLexerCPP.UnclosedString,
-                         QsciLexerCPP.VerbatimString]
-    
+        return style in [
+            QsciLexerCPP.DoubleQuotedString,
+            QsciLexerCPP.SingleQuotedString,
+            QsciLexerCPP.UnclosedString,
+            QsciLexerCPP.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerCPP.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerCSS.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerCSS.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,19 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerCSS.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("CSS1 Properties"),
             self.tr("Pseudo-Classes"),
@@ -44,7 +42,7 @@
             self.tr("Browser-Specific Pseudo-Classes"),
             self.tr("Browser-Specific Pseudo-Elements"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -52,36 +50,35 @@
         self.setFoldComments(Preferences.getEditor("CssFoldComment"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setHSSLanguage(
-                Preferences.getEditor("CssHssSupport"))
-            self.setLessLanguage(
-                Preferences.getEditor("CssLessSupport"))
-            self.setSCSSLanguage(
-                Preferences.getEditor("CssSassySupport"))
-    
+            self.setHSSLanguage(Preferences.getEditor("CssHssSupport"))
+            self.setLessLanguage(Preferences.getEditor("CssLessSupport"))
+            self.setSCSSLanguage(Preferences.getEditor("CssSassySupport"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerCSS.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerCSS.DoubleQuotedString,
-                         QsciLexerCSS.SingleQuotedString]
-    
+        return style in [
+            QsciLexerCSS.DoubleQuotedString,
+            QsciLexerCSS.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
@@ -101,7 +98,7 @@
                 " white-space list-style-type list-style-image"
                 " list-style-position list-style"
             )
-        
+
         if kwSet == 2:
             return (
                 "link active visited first-child focus hover lang left"
@@ -111,7 +108,7 @@
                 " invalid required optional first-letter first-line before"
                 " after"
             )
-        
+
         if kwSet == 3:
             return (
                 "border-top-color border-right-color border-bottom-color"
@@ -133,7 +130,7 @@
                 " speech-rate voice-family pitch pitch-range stress richness"
                 " speak-punctuation speak-numeral"
             )
-        
+
         if kwSet == 4:
             return (
                 "background-size border-radius border-top-right-radius"
@@ -142,25 +139,17 @@
                 " column-count column-rule column-gap column-rule-color"
                 " column-rule-style column-rule-width resize opacity word-wrap"
             )
-        
+
         if kwSet == 5:
-            return (
-                "first-letter first-line before after selection"
-            )
-        
+            return "first-letter first-line before after selection"
+
         if kwSet == 6:
-            return (
-                "^-moz- ^-webkit- ^-o- ^-ms- filter"
-            )
-        
+            return "^-moz- ^-webkit- ^-o- ^-ms- filter"
+
         if kwSet == 7:
-            return (
-                "indeterminate default ^-moz- ^-webkit- ^-o- ^-ms-"
-            )
-        
+            return "indeterminate default ^-moz- ^-webkit- ^-o- ^-ms-"
+
         if kwSet == 8:
-            return (
-                "selection ^-moz- ^-webkit- ^-o- ^-ms-"
-            )
-        
+            return "selection ^-moz- ^-webkit- ^-o- ^-ms-"
+
         return QsciLexerCSS.keywords(self, kwSet)
--- a/src/eric7/QScintilla/Lexers/LexerCSharp.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerCSharp.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerCSharp.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -45,7 +39,7 @@
             self.tr("Preprocessor definitions"),
             self.tr("Task marker and error marker keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -60,44 +54,48 @@
             indentStyle |= QsciScintilla.AiClosing
         self.setAutoIndentStyle(indentStyle)
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerCSharp.Comment,
-                         QsciLexerCSharp.CommentDoc,
-                         QsciLexerCSharp.CommentLine,
-                         QsciLexerCSharp.CommentLineDoc]
-    
+        return style in [
+            QsciLexerCSharp.Comment,
+            QsciLexerCSharp.CommentDoc,
+            QsciLexerCSharp.CommentLine,
+            QsciLexerCSharp.CommentLineDoc,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerCSharp.DoubleQuotedString,
-                         QsciLexerCSharp.SingleQuotedString,
-                         QsciLexerCSharp.UnclosedString,
-                         QsciLexerCSharp.VerbatimString]
-    
+        return style in [
+            QsciLexerCSharp.DoubleQuotedString,
+            QsciLexerCSharp.SingleQuotedString,
+            QsciLexerCSharp.UnclosedString,
+            QsciLexerCSharp.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerCSharp.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerCoffeeScript.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerCoffeeScript.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,80 +17,80 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerCoffeeScript.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        self.streamCommentString = {
-            'start': '###\n',
-            'end': '\n###'
-        }
-        
+        self.streamCommentString = {"start": "###\n", "end": "\n###"}
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
             self.tr("Secondary keywords"),
             self.tr("Unused"),
             self.tr("Global classes"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
-        self.setDollarsAllowed(
-            Preferences.getEditor("CoffeeScriptDollarsAllowed"))
-        self.setFoldComments(
-            Preferences.getEditor("CoffeScriptFoldComment"))
+        self.setDollarsAllowed(Preferences.getEditor("CoffeeScriptDollarsAllowed"))
+        self.setFoldComments(Preferences.getEditor("CoffeScriptFoldComment"))
         self.setStylePreprocessor(
-            Preferences.getEditor("CoffeeScriptStylePreprocessor"))
-        self.setFoldCompact(
-            Preferences.getEditor("AllFoldCompact"))
-    
+            Preferences.getEditor("CoffeeScriptStylePreprocessor")
+        )
+        self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerCoffeeScript.Comment,
-                         QsciLexerCoffeeScript.CommentDoc,
-                         QsciLexerCoffeeScript.CommentLine,
-                         QsciLexerCoffeeScript.CommentLineDoc,
-                         QsciLexerCoffeeScript.CommentBlock,
-                         QsciLexerCoffeeScript.BlockRegexComment]
-    
+        return style in [
+            QsciLexerCoffeeScript.Comment,
+            QsciLexerCoffeeScript.CommentDoc,
+            QsciLexerCoffeeScript.CommentLine,
+            QsciLexerCoffeeScript.CommentLineDoc,
+            QsciLexerCoffeeScript.CommentBlock,
+            QsciLexerCoffeeScript.BlockRegexComment,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerCoffeeScript.DoubleQuotedString,
-                         QsciLexerCoffeeScript.SingleQuotedString,
-                         QsciLexerCoffeeScript.UnclosedString,
-                         QsciLexerCoffeeScript.VerbatimString]
-    
+        return style in [
+            QsciLexerCoffeeScript.DoubleQuotedString,
+            QsciLexerCoffeeScript.SingleQuotedString,
+            QsciLexerCoffeeScript.UnclosedString,
+            QsciLexerCoffeeScript.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerCoffeeScript.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerContainer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerContainer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,62 +16,63 @@
     """
     Subclass as a base for the implementation of custom lexers.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexer.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.editor = parent
-    
+
     def language(self):
         """
         Public method returning the language of the lexer.
-        
+
         @return language of the lexer (string)
         """
         return "Container"
-    
+
     def lexer(self):
         """
         Public method returning the type of the lexer.
-        
+
         @return type of the lexer (string)
         """
-        if hasattr(self, 'lexerId'):
+        if hasattr(self, "lexerId"):
             return None
         else:
             return "container"
-    
+
     def description(self, style):
         """
         Public method returning the descriptions of the styles supported
         by the lexer.
-        
+
         <b>Note</b>: This methods needs to be overridden by the lexer class.
-        
+
         @param style style number (integer)
         @return description for the given style (string)
         """
         return ""
-    
+
     def styleText(self, start, end):
         """
         Public method to perform the styling.
-        
+
         @param start position of first character to be styled (integer)
         @param end position of last character to be styled (integer)
         """
-        self.editor.startStyling(start, 0x1f)
+        self.editor.startStyling(start, 0x1F)
         self.editor.setStyling(end - start + 1, 0)
-    
+
     def keywords(self, kwSet):
         """
         Public method to get the keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerD.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerD.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerD.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/+ ',
-            'end': ' +/'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/+ ", "end": " +/"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -46,7 +40,7 @@
             self.tr("User defined 2"),
             self.tr("User defined 3"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -60,51 +54,52 @@
             indentStyle |= QsciScintilla.AiClosing
         self.setAutoIndentStyle(indentStyle)
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerD.Comment,
-                         QsciLexerD.CommentDoc,
-                         QsciLexerD.CommentLine,
-                         QsciLexerD.CommentLineDoc,
-                         QsciLexerD.CommentNested]
-    
+        return style in [
+            QsciLexerD.Comment,
+            QsciLexerD.CommentDoc,
+            QsciLexerD.CommentLine,
+            QsciLexerD.CommentLineDoc,
+            QsciLexerD.CommentNested,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerD.String,
-                         QsciLexerD.UnclosedString]
-    
+        return style in [QsciLexerD.String, QsciLexerD.UnclosedString]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerD.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 7
--- a/src/eric7/QScintilla/Lexers/LexerDiff.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerDiff.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,39 +16,40 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerDiff.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.keywordSetDescriptions = []
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [LexerDiff.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerFortran.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerFortran.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,61 +17,64 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerFortran.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "c "
-        
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Intrinsic functions"),
             self.tr("Extended and user defined functions"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerFortran.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerFortran.DoubleQuotedString,
-                         QsciLexerFortran.SingleQuotedString,
-                         QsciLexerFortran.UnclosedString]
-    
+        return style in [
+            QsciLexerFortran.DoubleQuotedString,
+            QsciLexerFortran.SingleQuotedString,
+            QsciLexerFortran.UnclosedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerFortran77.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerFortran77.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,61 +17,64 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerFortran77.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "c "
-        
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Intrinsic functions"),
             self.tr("Extended and user defined functions"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerFortran77.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerFortran77.DoubleQuotedString,
-                         QsciLexerFortran77.SingleQuotedString,
-                         QsciLexerFortran77.UnclosedString]
-    
+        return style in [
+            QsciLexerFortran77.DoubleQuotedString,
+            QsciLexerFortran77.SingleQuotedString,
+            QsciLexerFortran77.UnclosedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerHTML.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerHTML.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,20 +19,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerHTML.__init__(self, parent)
         Lexer.__init__(self)
-        
-        self.streamCommentString = {
-            'start': '<!-- ',
-            'end': ' -->'
-        }
-        
+
+        self.streamCommentString = {"start": "<!-- ", "end": " -->"}
+
         self.keywordSetDescriptions = [
             self.tr("HTML elements and attributes"),
             self.tr("JavaScript keywords"),
@@ -41,84 +39,84 @@
             self.tr("PHP keywords"),
             self.tr("SGML and DTD keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldPreprocessor(Preferences.getEditor("HtmlFoldPreprocessor"))
-        self.setCaseSensitiveTags(
-            Preferences.getEditor("HtmlCaseSensitiveTags"))
+        self.setCaseSensitiveTags(Preferences.getEditor("HtmlCaseSensitiveTags"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setFoldScriptComments(
-                Preferences.getEditor("HtmlFoldScriptComments"))
-            self.setFoldScriptHeredocs(
-                Preferences.getEditor("HtmlFoldScriptHeredocs"))
+            self.setFoldScriptComments(Preferences.getEditor("HtmlFoldScriptComments"))
+            self.setFoldScriptHeredocs(Preferences.getEditor("HtmlFoldScriptHeredocs"))
         with contextlib.suppress(AttributeError):
-            self.setDjangoTemplates(
-                Preferences.getEditor("HtmlDjangoTemplates"))
+            self.setDjangoTemplates(Preferences.getEditor("HtmlDjangoTemplates"))
             self.setMakoTemplates(Preferences.getEditor("HtmlMakoTemplates"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerHTML.HTMLComment,
-                         QsciLexerHTML.ASPXCComment,
-                         QsciLexerHTML.SGMLComment,
-                         QsciLexerHTML.SGMLParameterComment,
-                         QsciLexerHTML.JavaScriptComment,
-                         QsciLexerHTML.JavaScriptCommentDoc,
-                         QsciLexerHTML.JavaScriptCommentLine,
-                         QsciLexerHTML.ASPJavaScriptComment,
-                         QsciLexerHTML.ASPJavaScriptCommentDoc,
-                         QsciLexerHTML.ASPJavaScriptCommentLine,
-                         QsciLexerHTML.VBScriptComment,
-                         QsciLexerHTML.ASPVBScriptComment,
-                         QsciLexerHTML.PythonComment,
-                         QsciLexerHTML.ASPPythonComment,
-                         QsciLexerHTML.PHPComment]
-    
+        return style in [
+            QsciLexerHTML.HTMLComment,
+            QsciLexerHTML.ASPXCComment,
+            QsciLexerHTML.SGMLComment,
+            QsciLexerHTML.SGMLParameterComment,
+            QsciLexerHTML.JavaScriptComment,
+            QsciLexerHTML.JavaScriptCommentDoc,
+            QsciLexerHTML.JavaScriptCommentLine,
+            QsciLexerHTML.ASPJavaScriptComment,
+            QsciLexerHTML.ASPJavaScriptCommentDoc,
+            QsciLexerHTML.ASPJavaScriptCommentLine,
+            QsciLexerHTML.VBScriptComment,
+            QsciLexerHTML.ASPVBScriptComment,
+            QsciLexerHTML.PythonComment,
+            QsciLexerHTML.ASPPythonComment,
+            QsciLexerHTML.PHPComment,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerHTML.HTMLDoubleQuotedString,
-                         QsciLexerHTML.HTMLSingleQuotedString,
-                         QsciLexerHTML.SGMLDoubleQuotedString,
-                         QsciLexerHTML.SGMLSingleQuotedString,
-                         QsciLexerHTML.JavaScriptDoubleQuotedString,
-                         QsciLexerHTML.JavaScriptSingleQuotedString,
-                         QsciLexerHTML.JavaScriptUnclosedString,
-                         QsciLexerHTML.ASPJavaScriptDoubleQuotedString,
-                         QsciLexerHTML.ASPJavaScriptSingleQuotedString,
-                         QsciLexerHTML.ASPJavaScriptUnclosedString,
-                         QsciLexerHTML.VBScriptString,
-                         QsciLexerHTML.VBScriptUnclosedString,
-                         QsciLexerHTML.ASPVBScriptString,
-                         QsciLexerHTML.ASPVBScriptUnclosedString,
-                         QsciLexerHTML.PythonDoubleQuotedString,
-                         QsciLexerHTML.PythonSingleQuotedString,
-                         QsciLexerHTML.PythonTripleDoubleQuotedString,
-                         QsciLexerHTML.PythonTripleSingleQuotedString,
-                         QsciLexerHTML.ASPPythonDoubleQuotedString,
-                         QsciLexerHTML.ASPPythonSingleQuotedString,
-                         QsciLexerHTML.ASPPythonTripleDoubleQuotedString,
-                         QsciLexerHTML.ASPPythonTripleSingleQuotedString,
-                         QsciLexerHTML.PHPDoubleQuotedString,
-                         QsciLexerHTML.PHPSingleQuotedString]
-    
+        return style in [
+            QsciLexerHTML.HTMLDoubleQuotedString,
+            QsciLexerHTML.HTMLSingleQuotedString,
+            QsciLexerHTML.SGMLDoubleQuotedString,
+            QsciLexerHTML.SGMLSingleQuotedString,
+            QsciLexerHTML.JavaScriptDoubleQuotedString,
+            QsciLexerHTML.JavaScriptSingleQuotedString,
+            QsciLexerHTML.JavaScriptUnclosedString,
+            QsciLexerHTML.ASPJavaScriptDoubleQuotedString,
+            QsciLexerHTML.ASPJavaScriptSingleQuotedString,
+            QsciLexerHTML.ASPJavaScriptUnclosedString,
+            QsciLexerHTML.VBScriptString,
+            QsciLexerHTML.VBScriptUnclosedString,
+            QsciLexerHTML.ASPVBScriptString,
+            QsciLexerHTML.ASPVBScriptUnclosedString,
+            QsciLexerHTML.PythonDoubleQuotedString,
+            QsciLexerHTML.PythonSingleQuotedString,
+            QsciLexerHTML.PythonTripleDoubleQuotedString,
+            QsciLexerHTML.PythonTripleSingleQuotedString,
+            QsciLexerHTML.ASPPythonDoubleQuotedString,
+            QsciLexerHTML.ASPPythonSingleQuotedString,
+            QsciLexerHTML.ASPPythonTripleDoubleQuotedString,
+            QsciLexerHTML.ASPPythonTripleSingleQuotedString,
+            QsciLexerHTML.PHPDoubleQuotedString,
+            QsciLexerHTML.PHPSingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerIDL.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerIDL.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerIDL.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -45,7 +39,7 @@
             self.tr("Preprocessor definitions"),
             self.tr("Task marker and error marker keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -60,44 +54,48 @@
             indentStyle |= QsciScintilla.AiClosing
         self.setAutoIndentStyle(indentStyle)
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerIDL.Comment,
-                         QsciLexerIDL.CommentDoc,
-                         QsciLexerIDL.CommentLine,
-                         QsciLexerIDL.CommentLineDoc]
-    
+        return style in [
+            QsciLexerIDL.Comment,
+            QsciLexerIDL.CommentDoc,
+            QsciLexerIDL.CommentLine,
+            QsciLexerIDL.CommentLineDoc,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerIDL.DoubleQuotedString,
-                         QsciLexerIDL.SingleQuotedString,
-                         QsciLexerIDL.UnclosedString,
-                         QsciLexerIDL.VerbatimString]
-    
+        return style in [
+            QsciLexerIDL.DoubleQuotedString,
+            QsciLexerIDL.SingleQuotedString,
+            QsciLexerIDL.UnclosedString,
+            QsciLexerIDL.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerIDL.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerJSON.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerJSON.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,70 +17,65 @@
     """
     Subclass to implement some additional lexer dependent methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerJSON.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("JSON Keywords"),
             self.tr("JSON-LD Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
-        self.setHighlightComments(
-            Preferences.getEditor("JSONHightlightComments"))
+        self.setHighlightComments(Preferences.getEditor("JSONHightlightComments"))
         self.setHighlightEscapeSequences(
-            Preferences.getEditor("JSONHighlightEscapeSequences"))
-        self.setFoldCompact(
-            Preferences.getEditor("AllFoldCompact"))
-    
+            Preferences.getEditor("JSONHighlightEscapeSequences")
+        )
+        self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerJSON.CommentLine,
-                         QsciLexerJSON.CommentBlock]
-    
+        return style in [QsciLexerJSON.CommentLine, QsciLexerJSON.CommentBlock]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerJSON.String,
-                         QsciLexerJSON.UnclosedString]
-    
+        return style in [QsciLexerJSON.String, QsciLexerJSON.UnclosedString]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerJSON.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 2
--- a/src/eric7/QScintilla/Lexers/LexerJava.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerJava.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerJava.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -45,7 +39,7 @@
             self.tr("Preprocessor definitions"),
             self.tr("Task marker and error marker keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -60,44 +54,48 @@
             indentStyle |= QsciScintilla.AiClosing
         self.setAutoIndentStyle(indentStyle)
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerJava.Comment,
-                         QsciLexerJava.CommentDoc,
-                         QsciLexerJava.CommentLine,
-                         QsciLexerJava.CommentLineDoc]
-    
+        return style in [
+            QsciLexerJava.Comment,
+            QsciLexerJava.CommentDoc,
+            QsciLexerJava.CommentLine,
+            QsciLexerJava.CommentLineDoc,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerJava.DoubleQuotedString,
-                         QsciLexerJava.SingleQuotedString,
-                         QsciLexerJava.UnclosedString,
-                         QsciLexerJava.VerbatimString]
-    
+        return style in [
+            QsciLexerJava.DoubleQuotedString,
+            QsciLexerJava.SingleQuotedString,
+            QsciLexerJava.UnclosedString,
+            QsciLexerJava.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerJava.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerJavaScript.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerJavaScript.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerJavaScript.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Primary keywords and identifiers"),
             self.tr("Secondary keywords and identifiers"),
@@ -45,7 +39,7 @@
             self.tr("Preprocessor definitions"),
             self.tr("Task marker and error marker keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -60,44 +54,48 @@
             indentStyle |= QsciScintilla.AiClosing
         self.setAutoIndentStyle(indentStyle)
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerJavaScript.Comment,
-                         QsciLexerJavaScript.CommentDoc,
-                         QsciLexerJavaScript.CommentLine,
-                         QsciLexerJavaScript.CommentLineDoc]
-    
+        return style in [
+            QsciLexerJavaScript.Comment,
+            QsciLexerJavaScript.CommentDoc,
+            QsciLexerJavaScript.CommentLine,
+            QsciLexerJavaScript.CommentLineDoc,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerJavaScript.DoubleQuotedString,
-                         QsciLexerJavaScript.SingleQuotedString,
-                         QsciLexerJavaScript.UnclosedString,
-                         QsciLexerJavaScript.VerbatimString]
-    
+        return style in [
+            QsciLexerJavaScript.DoubleQuotedString,
+            QsciLexerJavaScript.SingleQuotedString,
+            QsciLexerJavaScript.UnclosedString,
+            QsciLexerJavaScript.VerbatimString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerJavaScript.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 4
--- a/src/eric7/QScintilla/Lexers/LexerLua.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerLua.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,21 +17,19 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerLua.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "--"
-        self.streamCommentString = {
-            'start': '--[[ ',
-            'end': ' ]]--'
-        }
-        
+        self.streamCommentString = {"start": "--[[ ", "end": " ]]--"}
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
             self.tr("Basic functions"),
@@ -42,55 +40,56 @@
             self.tr("User defined 3"),
             self.tr("User defined 4"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return [':', '.']
-    
+        return [":", "."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerLua.Comment,
-                         QsciLexerLua.LineComment]
-    
+        return style in [QsciLexerLua.Comment, QsciLexerLua.LineComment]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerLua.String,
-                         QsciLexerLua.LiteralString,
-                         QsciLexerLua.UnclosedString]
-    
+        return style in [
+            QsciLexerLua.String,
+            QsciLexerLua.LiteralString,
+            QsciLexerLua.UnclosedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerLua.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 8
--- a/src/eric7/QScintilla/Lexers/LexerMakefile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerMakefile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,42 +16,43 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerMakefile.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
         self._alwaysKeepTabs = True
-        
+
         self.keywordSetDescriptions = []
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerMakefile.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerMarkdown.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerMarkdown.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,21 +16,22 @@
     """
     Subclass to implement some additional lexer dependent methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerMarkdown.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.keywordSetDescriptions = []
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerMatlab.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerMatlab.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,44 +16,47 @@
     """
     Subclass to implement some additional lexer dependent methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerMatlab.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "%~"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerMatlab.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerMatlab.DoubleQuotedString,
-                         QsciLexerMatlab.SingleQuotedString]
-    
+        return style in [
+            QsciLexerMatlab.DoubleQuotedString,
+            QsciLexerMatlab.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerOctave.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerOctave.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,44 +16,47 @@
     """
     Subclass to implement some additional lexer dependent methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerOctave.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerOctave.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerOctave.DoubleQuotedString,
-                         QsciLexerOctave.SingleQuotedString]
-    
+        return style in [
+            QsciLexerOctave.DoubleQuotedString,
+            QsciLexerOctave.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPO.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPO.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,50 +17,53 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerPO.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = []
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldComments(Preferences.getEditor("PoFoldComment"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerPO.Comment, QsciLexerPO.ProgrammerComment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerPO.MessageIdText,
-                         QsciLexerPO.MessageStringText,
-                         QsciLexerPO.MessageContextText]
-    
+        return style in [
+            QsciLexerPO.MessageIdText,
+            QsciLexerPO.MessageStringText,
+            QsciLexerPO.MessageContextText,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPOV.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPOV.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,20 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerPOV.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        self.boxCommentString = {
-            'start': '/* ',
-            'middle': ' * ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+        self.boxCommentString = {"start": "/* ", "middle": " * ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("Language directives"),
             self.tr("Objects & CSG & Appearance"),
@@ -47,7 +41,7 @@
             self.tr("User defined 2"),
             self.tr("User defined 3"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -55,31 +49,29 @@
         self.setFoldComments(Preferences.getEditor("PovFoldComment"))
         self.setFoldDirectives(Preferences.getEditor("PovFoldDirectives"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerPOV.Comment,
-                         QsciLexerPOV.CommentLine]
-    
+        return style in [QsciLexerPOV.Comment, QsciLexerPOV.CommentLine]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerPOV.String,
-                         QsciLexerPOV.UnclosedString]
-    
+        return style in [QsciLexerPOV.String, QsciLexerPOV.UnclosedString]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPascal.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPascal.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,74 +19,74 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerPascal.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "//"
-        self.streamCommentString = {
-            'start': '{ ',
-            'end': ' }'
-        }
-        
+        self.streamCommentString = {"start": "{ ", "end": " }"}
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldComments(Preferences.getEditor("PascalFoldComment"))
-        self.setFoldPreprocessor(
-            Preferences.getEditor("PascalFoldPreprocessor"))
+        self.setFoldPreprocessor(Preferences.getEditor("PascalFoldPreprocessor"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setSmartHighlighting(
-                Preferences.getEditor("PascalSmartHighlighting"))
-    
+            self.setSmartHighlighting(Preferences.getEditor("PascalSmartHighlighting"))
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         try:
-            return style in [QsciLexerPascal.Comment,
-                             QsciLexerPascal.CommentDoc,
-                             QsciLexerPascal.CommentLine]
+            return style in [
+                QsciLexerPascal.Comment,
+                QsciLexerPascal.CommentDoc,
+                QsciLexerPascal.CommentLine,
+            ]
         except AttributeError:
-            return style in [QsciLexerPascal.Comment,
-                             QsciLexerPascal.CommentParenthesis,
-                             QsciLexerPascal.CommentLine]
-    
+            return style in [
+                QsciLexerPascal.Comment,
+                QsciLexerPascal.CommentParenthesis,
+                QsciLexerPascal.CommentLine,
+            ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return style in [QsciLexerPascal.SingleQuotedString]
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPerl.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPerl.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,22 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerPerl.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -45,45 +46,47 @@
             self.setFoldPODBlocks(Preferences.getEditor("PerlFoldPODBlocks"))
         with contextlib.suppress(AttributeError):
             self.setFoldAtElse(Preferences.getEditor("PerlFoldAtElse"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['::', '->']
-    
+        return ["::", "->"]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerPerl.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerPerl.DoubleQuotedHereDocument,
-                         QsciLexerPerl.DoubleQuotedString,
-                         QsciLexerPerl.QuotedStringQ,
-                         QsciLexerPerl.QuotedStringQQ,
-                         QsciLexerPerl.QuotedStringQR,
-                         QsciLexerPerl.QuotedStringQW,
-                         QsciLexerPerl.QuotedStringQX,
-                         QsciLexerPerl.SingleQuotedHereDocument,
-                         QsciLexerPerl.SingleQuotedString]
-    
+        return style in [
+            QsciLexerPerl.DoubleQuotedHereDocument,
+            QsciLexerPerl.DoubleQuotedString,
+            QsciLexerPerl.QuotedStringQ,
+            QsciLexerPerl.QuotedStringQQ,
+            QsciLexerPerl.QuotedStringQR,
+            QsciLexerPerl.QuotedStringQW,
+            QsciLexerPerl.QuotedStringQX,
+            QsciLexerPerl.SingleQuotedHereDocument,
+            QsciLexerPerl.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPostScript.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPostScript.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,17 +17,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerPostScript.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "%"
-        
+
         self.keywordSetDescriptions = [
             self.tr("PS Level 1 operators"),
             self.tr("PS Level 2 operators"),
@@ -35,7 +36,7 @@
             self.tr("RIP specific operators"),
             self.tr("User defined operators"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -44,38 +45,38 @@
         self.setLevel(Preferences.getEditor("PostScriptLevel"))
         self.setFoldAtElse(Preferences.getEditor("PostScriptFoldAtElse"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerPostScript.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerPostScript.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 5
--- a/src/eric7/QScintilla/Lexers/LexerProperties.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerProperties.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,50 +19,50 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerProperties.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = []
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setInitialSpaces(
-                Preferences.getEditor("PropertiesInitialSpaces"))
-    
+            self.setInitialSpaces(Preferences.getEditor("PropertiesInitialSpaces"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerProperties.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerPygments.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPygments.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import contextlib
 
 from pygments.token import Token
-from pygments.lexers import (
-    guess_lexer_for_filename, guess_lexer, find_lexer_class
-)
+from pygments.lexers import guess_lexer_for_filename, guess_lexer, find_lexer_class
 from pygments.util import ClassNotFound
 
 from PyQt6.QtGui import QColor, QFont
@@ -75,7 +73,7 @@
 PYGMENTS_BACKTICKSTRING = 57
 PYGMENTS_WHITESPACE = 58
 
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------#
 
 TOKEN_MAP = {
     Token.Comment: PYGMENTS_COMMENT,
@@ -85,11 +83,8 @@
     Token.Comment.PreprocFile: PYGMENTS_PREPROCESSOR,
     Token.Comment.Single: PYGMENTS_COMMENT,
     Token.Comment.Special: PYGMENTS_COMMENT,
-    
     Token.Escape: PYGMENTS_ESCAPE,
-    
     Token.Error: PYGMENTS_ERROR,
-    
     Token.Generic: PYGMENTS_DEFAULT,
     Token.Generic.Deleted: PYGMENTS_DELETED,
     Token.Generic.Emph: PYGMENTS_EMPHASIZE,
@@ -101,7 +96,6 @@
     Token.Generic.Strong: PYGMENTS_STRONG,
     Token.Generic.Subheading: PYGMENTS_SUBHEADING,
     Token.Generic.Traceback: PYGMENTS_TRACEBACK,
-    
     Token.Keyword: PYGMENTS_KEYWORD,
     Token.Keyword.Constant: PYGMENTS_KEYWORD,
     Token.Keyword.Declaration: PYGMENTS_KEYWORD,
@@ -109,10 +103,8 @@
     Token.Keyword.Pseudo: PYGMENTS_PSEUDOKEYWORD,
     Token.Keyword.Reserved: PYGMENTS_RESERVEDKEYWORD,
     Token.Keyword.Type: PYGMENTS_TYPEKEYWORD,
-    
     Token.Literal: PYGMENTS_LITERAL,
     Token.Literal.Date: PYGMENTS_LITERAL,
-    
     Token.Name: PYGMENTS_DEFAULT,
     Token.Name.Attribute: PYGMENTS_ATTRIBUTE,
     Token.Name.Builtin: PYGMENTS_BUILTIN,
@@ -134,7 +126,6 @@
     Token.Name.Variable.Global: PYGMENTS_VARIABLE,
     Token.Name.Variable.Instance: PYGMENTS_VARIABLE,
     Token.Name.Variable.Magic: PYGMENTS_VARIABLE,
-    
     Token.Number: PYGMENTS_NUMBER,
     Token.Number.Bin: PYGMENTS_NUMBER,
     Token.Number.Float: PYGMENTS_NUMBER,
@@ -142,14 +133,10 @@
     Token.Number.Integer: PYGMENTS_NUMBER,
     Token.Number.Integer.Long: PYGMENTS_NUMBER,
     Token.Number.Oct: PYGMENTS_NUMBER,
-    
     Token.Operator: PYGMENTS_OPERATOR,
     Token.Operator.Word: PYGMENTS_WORD,
-    
     Token.Other: PYGMENTS_DEFAULT,
-    
     Token.Punctuation: PYGMENTS_PUNCTUATION,
-    
     Token.String: PYGMENTS_STRING,
     Token.String.Affix: PYGMENTS_STRING,
     Token.String.Backtick: PYGMENTS_BACKTICKSTRING,
@@ -164,30 +151,29 @@
     Token.String.Regex: PYGMENTS_REGEX,
     Token.String.Single: PYGMENTS_SINGLESTRING,
     Token.String.Symbol: PYGMENTS_SYMBOL,
-    
     Token.Whitespace: PYGMENTS_WHITESPACE,
-    
     Token.Text: PYGMENTS_DEFAULT,
 }
 
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------#
 
 
 class LexerPygments(LexerContainer):
     """
     Class implementing a custom lexer using pygments.
     """
+
     def __init__(self, parent=None, name=""):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         @param name name of the pygments lexer to use (string)
         """
         super().__init__(parent)
-        
+
         self.__inReadSettings = False
-        
+
         if name.startswith("Pygments|"):
             self.__forcedPygmentsName = True
             self.__pygmentsName = name.replace("Pygments|", "")
@@ -197,7 +183,7 @@
         else:
             self.__pygmentsName = ""
             self.__forcedPygmentsName = False
-        
+
         self.descriptions = {
             PYGMENTS_DEFAULT: self.tr("Default"),
             PYGMENTS_COMMENT: self.tr("Comment"),
@@ -251,7 +237,7 @@
             PYGMENTS_BACKTICKSTRING: self.tr("Backtick string"),
             PYGMENTS_WHITESPACE: self.tr("Whitespace"),
         }
-        
+
         self.defaultColors = {
             PYGMENTS_DEFAULT: QColor("#000000"),
             PYGMENTS_COMMENT: QColor("#408080"),
@@ -302,27 +288,27 @@
             PYGMENTS_BACKTICKSTRING: QColor("#FFFF00"),
             PYGMENTS_WHITESPACE: QColor("#BBBBBB"),
         }
-        
+
         self.defaultPapers = {
             PYGMENTS_ERROR: QColor("#FF0000"),
             PYGMENTS_MULTILINECOMMENT: QColor("#A8FFA8"),
             PYGMENTS_HEREDOC: QColor("#DDD0DD"),
             PYGMENTS_BACKTICKSTRING: QColor("#a08080"),
         }
-        
+
         self.defaultEolFills = {
             PYGMENTS_ERROR: True,
             PYGMENTS_MULTILINECOMMENT: True,
             PYGMENTS_HEREDOC: True,
             PYGMENTS_BACKTICKSTRING: True,
         }
-    
+
     def readSettings(self, qs, prefix="/Scintilla"):
         """
         Public method to read the lexer settings.
-        
+
         Note: Overridden to treat the Pygments lexer specially.
-        
+
         @param qs reference to the settings object
         @type QSettings
         @param prefix prefix for the settings key (defaults to "/Scintilla")
@@ -331,23 +317,23 @@
         self.__inReadSettings = True
         super().readSettings(qs, prefix=prefix)
         self.__inReadSettings = False
-    
+
     def language(self):
         """
         Public method returning the language of the lexer.
-        
+
         @return language of the lexer (string)
         """
         if self.__pygmentsName and not self.__inReadSettings:
             return self.__pygmentsName
         else:
             return "Guessed"
-    
+
     def description(self, style):
         """
         Public method returning the descriptions of the styles supported
         by the lexer.
-        
+
         @param style style number (integer)
         @return description for the style (string)
         """
@@ -355,11 +341,11 @@
             return self.descriptions[style]
         except KeyError:
             return ""
-    
+
     def defaultColor(self, style):
         """
         Public method to get the default foreground color for a style.
-        
+
         @param style style number (integer)
         @return foreground color (QColor)
         """
@@ -367,11 +353,11 @@
             return self.defaultColors[style]
         except KeyError:
             return LexerContainer.defaultColor(self, style)
-    
+
     def defaultPaper(self, style):
         """
         Public method to get the default background color for a style.
-        
+
         @param style style number (integer)
         @return background color (QColor)
         """
@@ -379,16 +365,19 @@
             return self.defaultPapers[style]
         except KeyError:
             return LexerContainer.defaultPaper(self, style)
-    
+
     def defaultFont(self, style):
         """
         Public method to get the default font for a style.
-        
+
         @param style style number (integer)
         @return font (QFont)
         """
-        if style in [PYGMENTS_COMMENT, PYGMENTS_PREPROCESSOR,
-                     PYGMENTS_MULTILINECOMMENT]:
+        if style in [
+            PYGMENTS_COMMENT,
+            PYGMENTS_PREPROCESSOR,
+            PYGMENTS_MULTILINECOMMENT,
+        ]:
             if Utilities.isWindowsPlatform():
                 f = QFont(["Comic Sans MS"], 9)
             elif Utilities.isMacPlatform():
@@ -398,7 +387,7 @@
             if style == PYGMENTS_PREPROCESSOR:
                 f.setItalic(True)
             return f
-        
+
         if style in [PYGMENTS_STRING, PYGMENTS_CHAR]:
             if Utilities.isWindowsPlatform():
                 return QFont(["Comic Sans MS"], 10)
@@ -406,28 +395,41 @@
                 f = QFont(["Courier"], 11)
             else:
                 return QFont(["Bitstream Vera Serif"], 10)
-        
-        if style in [PYGMENTS_KEYWORD, PYGMENTS_OPERATOR, PYGMENTS_WORD,
-                     PYGMENTS_BUILTIN, PYGMENTS_ATTRIBUTE, PYGMENTS_FUNCTION,
-                     PYGMENTS_CLASS, PYGMENTS_NAMESPACE, PYGMENTS_EXCEPTION,
-                     PYGMENTS_ENTITY, PYGMENTS_TAG, PYGMENTS_SCALAR,
-                     PYGMENTS_ESCAPE, PYGMENTS_HEADING, PYGMENTS_SUBHEADING,
-                     PYGMENTS_STRONG, PYGMENTS_PROMPT]:
+
+        if style in [
+            PYGMENTS_KEYWORD,
+            PYGMENTS_OPERATOR,
+            PYGMENTS_WORD,
+            PYGMENTS_BUILTIN,
+            PYGMENTS_ATTRIBUTE,
+            PYGMENTS_FUNCTION,
+            PYGMENTS_CLASS,
+            PYGMENTS_NAMESPACE,
+            PYGMENTS_EXCEPTION,
+            PYGMENTS_ENTITY,
+            PYGMENTS_TAG,
+            PYGMENTS_SCALAR,
+            PYGMENTS_ESCAPE,
+            PYGMENTS_HEADING,
+            PYGMENTS_SUBHEADING,
+            PYGMENTS_STRONG,
+            PYGMENTS_PROMPT,
+        ]:
             f = LexerContainer.defaultFont(self, style)
             f.setBold(True)
             return f
-        
+
         if style in [PYGMENTS_DOCSTRING, PYGMENTS_EMPHASIZE]:
             f = LexerContainer.defaultFont(self, style)
             f.setItalic(True)
             return f
-        
+
         return LexerContainer.defaultFont(self, style)
-    
+
     def defaultEolFill(self, style):
         """
         Public method to get the default fill to eol flag.
-        
+
         @param style style number (integer)
         @return fill to eol flag (boolean)
         """
@@ -435,21 +437,21 @@
             return self.defaultEolFills[style]
         except KeyError:
             return LexerContainer.defaultEolFill(self, style)
-        
+
     def __guessLexer(self, text):
         """
         Private method to guess a pygments lexer.
-        
+
         @param text text to base guessing on (string)
         @return reference to the guessed lexer (pygments.lexer)
         """
         lexer = None
-        
+
         if self.__pygmentsName:
             lexerClass = find_lexer_class(self.__pygmentsName)
             if lexerClass is not None:
                 lexer = lexerClass()
-        
+
         elif text:
             # step 1: guess based on filename and text
             if self.editor is not None:
@@ -457,50 +459,50 @@
                 if fn:
                     with contextlib.suppress(ClassNotFound, AttributeError):
                         lexer = guess_lexer_for_filename(fn, text)
-            
+
             # step 2: guess on text only
             if lexer is None:
                 with contextlib.suppress(ClassNotFound, AttributeError):
                     lexer = guess_lexer(text)
-        
+
         return lexer
-    
+
     def canStyle(self):
         """
         Public method to check, if the lexer is able to style the text.
-        
+
         @return flag indicating the lexer capability (boolean)
         """
         if self.editor is None:
             return True
-        
+
         text = self.editor.text()
         self.__lexer = self.__guessLexer(text)
-        
+
         return self.__lexer is not None
-    
+
     def name(self):
         """
         Public method to get the name of the pygments lexer.
-        
+
         @return name of the pygments lexer (string)
         """
         if self.__lexer is None:
             return ""
         else:
             return self.__lexer.name
-    
+
     def styleText(self, start, end):
         """
         Public method to perform the styling.
-        
+
         @param start position of first character to be styled (integer)
         @param end position of last character to be styled (integer)
         """
-        text = self.editor.text()[:end + 1]
+        text = self.editor.text()[: end + 1]
         textLen = len(text.encode("utf-8"))
         self.__lexer = self.__guessLexer(text)
-        
+
         cpos = 0
         # adjust start position because pygments ignores empty line at
         # start of text
@@ -509,50 +511,56 @@
                 cpos += 1
             else:
                 break
-        
-        self.editor.startStyling(cpos, 0x3f)
+
+        self.editor.startStyling(cpos, 0x3F)
         if self.__lexer is None:
             self.editor.setStyling(len(text), PYGMENTS_DEFAULT)
         else:
             eolLen = len(self.editor.getLineSeparator())
             for token, txt in self.__lexer.get_tokens(text):
                 style = TOKEN_MAP.get(token, PYGMENTS_DEFAULT)
-                
-                tlen = len(txt.encode('utf-8'))
+
+                tlen = len(txt.encode("utf-8"))
                 if eolLen > 1:
-                    tlen += txt.count('\n')
+                    tlen += txt.count("\n")
                 cpos += tlen
                 if tlen and cpos < textLen:
                     self.editor.setStyling(tlen, style)
                 if cpos >= textLen:
                     break
-            self.editor.startStyling(cpos, 0x3f)
-    
+            self.editor.startStyling(cpos, 0x3F)
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [PYGMENTS_COMMENT]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [PYGMENTS_STRING, PYGMENTS_DOCSTRING, PYGMENTS_OTHER,
-                         PYGMENTS_HEADING, PYGMENTS_SUBHEADING,
-                         PYGMENTS_EMPHASIZE, PYGMENTS_STRONG]
-    
+        return style in [
+            PYGMENTS_STRING,
+            PYGMENTS_DOCSTRING,
+            PYGMENTS_OTHER,
+            PYGMENTS_HEADING,
+            PYGMENTS_SUBHEADING,
+            PYGMENTS_EMPHASIZE,
+            PYGMENTS_STRONG,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
-        return None     # __IGNORE_WARNING_M831__
+        return None  # __IGNORE_WARNING_M831__
--- a/src/eric7/QScintilla/Lexers/LexerPython.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerPython.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,31 +20,32 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, variant="", parent=None):
         """
         Constructor
-        
+
         @param variant name of the language variant (string)
         @param parent parent widget of this lexer
         """
         QsciLexerPython.__init__(self, parent)
         SubstyledLexer.__init__(self)
-        
+
         self.variant = variant
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
             self.tr("Highlighted identifiers"),
         ]
-        
+
         ##############################################################
         ## default sub-style definitions
         ##############################################################
-        
+
         # list of style numbers, that support sub-styling
         self.baseStyles = [11]
-        
+
         self.defaultSubStyles = {
             11: {
                 0: {
@@ -75,7 +76,7 @@
                     "Style": {
                         "fore": 0xDD9900,
                         "font_bold": True,
-                    }
+                    },
                 },
                 1: {
                     "Description": self.tr("__future__ Imports"),
@@ -85,7 +86,7 @@
                     "Style": {
                         "fore": 0xEE00AA,
                         "font_italic": True,
-                    }
+                    },
                 },
                 2: {
                     "Description": self.tr("PyQt5/6 Modules"),
@@ -102,160 +103,166 @@
                     "Style": {
                         "fore": 0x44AADD,
                         "font_bold": True,
-                    }
+                    },
                 },
                 3: {
                     "Description": self.tr("Cython Specifics"),
                     "Words": "cython pyximport Cython __cinit__ __dealloc__",
                     "Style": {
-                        "fore": 0xdd0000,
+                        "fore": 0xDD0000,
                         "font_bold": True,
-                    }
+                    },
                 },
             },
         }
-    
+
     def language(self):
         """
         Public method to get the lexer language.
-        
+
         @return lexer language (string)
         """
         if not self.variant:
             return QsciLexerPython.language(self)
         else:
             return self.variant
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
-        self.setIndentationWarning(
-            Preferences.getEditor("PythonBadIndentation"))
+        self.setIndentationWarning(Preferences.getEditor("PythonBadIndentation"))
         self.setFoldComments(Preferences.getEditor("PythonFoldComment"))
         self.setFoldQuotes(Preferences.getEditor("PythonFoldString"))
         if not Preferences.getEditor("PythonAutoIndent"):
             self.setAutoIndentStyle(QsciScintilla.AiMaintain)
         with contextlib.suppress(AttributeError):
-            self.setV2UnicodeAllowed(
-                Preferences.getEditor("PythonAllowV2Unicode"))
-            self.setV3BinaryOctalAllowed(
-                Preferences.getEditor("PythonAllowV3Binary"))
+            self.setV2UnicodeAllowed(Preferences.getEditor("PythonAllowV2Unicode"))
+            self.setV3BinaryOctalAllowed(Preferences.getEditor("PythonAllowV3Binary"))
             self.setV3BytesAllowed(Preferences.getEditor("PythonAllowV3Bytes"))
         with contextlib.suppress(AttributeError):
             self.setFoldQuotes(Preferences.getEditor("PythonFoldQuotes"))
             self.setStringsOverNewlineAllowed(
-                Preferences.getEditor("PythonStringsOverNewLineAllowed"))
+                Preferences.getEditor("PythonStringsOverNewLineAllowed")
+            )
         with contextlib.suppress(AttributeError):
             self.setHighlightSubidentifiers(
-                Preferences.getEditor("PythonHighlightSubidentifier"))
-    
+                Preferences.getEditor("PythonHighlightSubidentifier")
+            )
+
     def getIndentationDifference(self, line, editor):
         """
         Public method to determine the difference for the new indentation.
-        
+
         @param line line to perform the calculation for (integer)
         @param editor QScintilla editor
         @return amount of difference in indentation (integer)
         """
-        indent_width = editor.getEditorConfig('IndentWidth')
-        
+        indent_width = editor.getEditorConfig("IndentWidth")
+
         lead_spaces = editor.indentation(line)
-        
+
         pline = line - 1
-        while pline >= 0 and re.match(r'^\s*(#.*)?$', editor.text(pline)):
+        while pline >= 0 and re.match(r"^\s*(#.*)?$", editor.text(pline)):
             pline -= 1
-        
+
         if pline < 0:
             last = 0
         else:
             previous_lead_spaces = editor.indentation(pline)
             # trailing spaces
-            m = re.search(r':\s*(#.*)?$', editor.text(pline))
+            m = re.search(r":\s*(#.*)?$", editor.text(pline))
             last = previous_lead_spaces
             if m:
                 last += indent_width
             else:
                 # special cases, like pass (unindent) or return (also unindent)
-                m = re.search(r'(pass\s*(#.*)?$)|(^[^#]return)',
-                              editor.text(pline))
+                m = re.search(r"(pass\s*(#.*)?$)|(^[^#]return)", editor.text(pline))
                 if m:
                     last -= indent_width
-        
+
         indentDifference = (
             last - lead_spaces
-            if (lead_spaces % indent_width != 0 or
-                lead_spaces == 0 or
-                self.lastIndented != line) else
-            -indent_width           # __IGNORE_WARNING_W503__
+            if (
+                lead_spaces % indent_width != 0
+                or lead_spaces == 0
+                or self.lastIndented != line
+            )
+            else -indent_width  # __IGNORE_WARNING_W503__
         )
-        
+
         return indentDifference
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerPython.Comment,
-                         QsciLexerPython.CommentBlock]
-    
+        return style in [QsciLexerPython.Comment, QsciLexerPython.CommentBlock]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerPython.DoubleQuotedString,
-                         QsciLexerPython.SingleQuotedString,
-                         QsciLexerPython.TripleDoubleQuotedString,
-                         QsciLexerPython.TripleSingleQuotedString,
-                         QsciLexerPython.UnclosedString]
-    
+        return style in [
+            QsciLexerPython.DoubleQuotedString,
+            QsciLexerPython.SingleQuotedString,
+            QsciLexerPython.TripleDoubleQuotedString,
+            QsciLexerPython.TripleSingleQuotedString,
+            QsciLexerPython.UnclosedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         if kwSet == 1:
             if self.language() == "Python3":
                 import keyword
+
                 keywords = " ".join(keyword.kwlist)
             elif self.language() == "MicroPython":
-                keywords = ("False None True and as assert break class "
-                            "continue def del elif else except finally for "
-                            "from global if import in is lambda nonlocal not "
-                            "or pass raise return try while with yield")
+                keywords = (
+                    "False None True and as assert break class "
+                    "continue def del elif else except finally for "
+                    "from global if import in is lambda nonlocal not "
+                    "or pass raise return try while with yield"
+                )
             elif self.language() == "Cython":
-                keywords = ("False None True and as assert break class "
-                            "continue def del elif else except finally for "
-                            "from global if import in is lambda nonlocal not "
-                            "or pass raise return try while with yield "
-                            "cdef cimport cpdef ctypedef")
+                keywords = (
+                    "False None True and as assert break class "
+                    "continue def del elif else except finally for "
+                    "from global if import in is lambda nonlocal not "
+                    "or pass raise return try while with yield "
+                    "cdef cimport cpdef ctypedef"
+                )
             else:
                 keywords = QsciLexerPython.keywords(self, kwSet)
         else:
             keywords = QsciLexerPython.keywords(self, kwSet)
-        
+
         return keywords
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 2
--- a/src/eric7/QScintilla/Lexers/LexerQSS.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerQSS.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,19 @@
     """
     Subclass to implement some additional lexer dependent methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerCSS.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        self.streamCommentString = {
-            'start': '/* ',
-            'end': ' */'
-        }
-        
+        self.streamCommentString = {"start": "/* ", "end": " */"}
+
         self.keywordSetDescriptions = [
             self.tr("CSS1 Properties"),
             self.tr("Pseudo-Classes"),
@@ -44,7 +42,7 @@
             self.tr("Browser-Specific Pseudo-Classes"),
             self.tr("Browser-Specific Pseudo-Elements"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -52,36 +50,35 @@
         self.setFoldComments(Preferences.getEditor("CssFoldComment"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setHSSLanguage(
-                Preferences.getEditor("CssHssSupport"))
-            self.setLessLanguage(
-                Preferences.getEditor("CssLessSupport"))
-            self.setSCSSLanguage(
-                Preferences.getEditor("CssSassySupport"))
-    
+            self.setHSSLanguage(Preferences.getEditor("CssHssSupport"))
+            self.setLessLanguage(Preferences.getEditor("CssLessSupport"))
+            self.setSCSSLanguage(Preferences.getEditor("CssSassySupport"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerCSS.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerCSS.DoubleQuotedString,
-                         QsciLexerCSS.SingleQuotedString]
-    
+        return style in [
+            QsciLexerCSS.DoubleQuotedString,
+            QsciLexerCSS.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
@@ -153,21 +150,21 @@
                 " sub-page tab tab-bar tear tearoff text title up-arrow"
                 " up-button"
             )
-        
+
         return None
-    
+
     def language(self):
         """
         Public method to return the lexer language.
-        
+
         @return lexer language (string)
         """
         return "QSS"
-    
+
     def lexerName(self):
         """
         Public method to return the lexer name.
-        
+
         @return lexer name (string)
         """
         return "QSS"
--- a/src/eric7/QScintilla/Lexers/LexerRuby.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerRuby.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,22 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerRuby.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -41,44 +42,46 @@
         with contextlib.suppress(AttributeError):
             self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
             self.setFoldComments(Preferences.getEditor("RubyFoldComment"))
-    
+
     def autoCompletionWordSeparators(self):
         """
         Public method to return the list of separators for autocompletion.
-        
+
         @return list of separators (list of strings)
         """
-        return ['.']
-    
+        return ["."]
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerRuby.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerRuby.DoubleQuotedString,
-                         QsciLexerRuby.HereDocument,
-                         QsciLexerRuby.PercentStringQ,
-                         QsciLexerRuby.PercentStringq,
-                         QsciLexerRuby.PercentStringr,
-                         QsciLexerRuby.PercentStringw,
-                         QsciLexerRuby.PercentStringx,
-                         QsciLexerRuby.SingleQuotedString]
-    
+        return style in [
+            QsciLexerRuby.DoubleQuotedString,
+            QsciLexerRuby.HereDocument,
+            QsciLexerRuby.PercentStringQ,
+            QsciLexerRuby.PercentStringq,
+            QsciLexerRuby.PercentStringr,
+            QsciLexerRuby.PercentStringw,
+            QsciLexerRuby.PercentStringx,
+            QsciLexerRuby.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerSQL.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerSQL.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,17 +19,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerSQL.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "--"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
             self.tr("Database Objects"),
@@ -40,7 +41,7 @@
             self.tr("User defined 2"),
             self.tr("User defined 3"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -53,44 +54,47 @@
             self.setFoldAtElse(Preferences.getEditor("SqlFoldAtElse"))
             self.setFoldOnlyBegin(Preferences.getEditor("SqlFoldOnlyBegin"))
             self.setHashComments(Preferences.getEditor("SqlHashComments"))
-            self.setQuotedIdentifiers(
-                Preferences.getEditor("SqlQuotedIdentifiers"))
-    
+            self.setQuotedIdentifiers(Preferences.getEditor("SqlQuotedIdentifiers"))
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerSQL.Comment,
-                         QsciLexerSQL.CommentDoc,
-                         QsciLexerSQL.CommentLine,
-                         QsciLexerSQL.CommentLineHash]
-    
+        return style in [
+            QsciLexerSQL.Comment,
+            QsciLexerSQL.CommentDoc,
+            QsciLexerSQL.CommentLine,
+            QsciLexerSQL.CommentLineHash,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerSQL.DoubleQuotedString,
-                         QsciLexerSQL.SingleQuotedString]
-    
+        return style in [
+            QsciLexerSQL.DoubleQuotedString,
+            QsciLexerSQL.SingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerSQL.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 8
--- a/src/eric7/QScintilla/Lexers/LexerTCL.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerTCL.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,17 +20,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerTCL.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("TCL Keywords"),
             self.tr("TK Keywords"),
@@ -42,7 +43,7 @@
             self.tr("User defined 3"),
             self.tr("User defined 4"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -51,41 +52,43 @@
             self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
             self.setFoldComments(Preferences.getEditor("TclFoldComment"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerTCL.Comment,
-                         QsciLexerTCL.CommentBlock,
-                         QsciLexerTCL.CommentBox,
-                         QsciLexerTCL.CommentLine]
-    
+        return style in [
+            QsciLexerTCL.Comment,
+            QsciLexerTCL.CommentBlock,
+            QsciLexerTCL.CommentBox,
+            QsciLexerTCL.CommentLine,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return style in [QsciLexerTCL.QuotedString]
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerTCL.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 9
--- a/src/eric7/QScintilla/Lexers/LexerTeX.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerTeX.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,17 +19,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerTeX.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "%"
-        
+
         self.keywordSetDescriptions = [
             self.tr("TeX, eTeX, pdfTeX, Omega"),
             self.tr("ConTeXt Dutch"),
@@ -40,7 +41,7 @@
             self.tr("ConTeXt Romanian"),
             self.tr("LaTeX"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -48,32 +49,31 @@
         with contextlib.suppress(AttributeError):
             self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
             self.setFoldComments(Preferences.getEditor("TexFoldComment"))
-            self.setProcessComments(
-                Preferences.getEditor("TexProcessComments"))
+            self.setProcessComments(Preferences.getEditor("TexProcessComments"))
             self.setProcessIf(Preferences.getEditor("TexProcessIf"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return False
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return style in [QsciLexerTeX.Text]
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
@@ -197,14 +197,18 @@
         )
         if kwSet in (1, 2, 3, 4, 5, 6, 7):
             return (
-                texKeywords + " " + etexKeywords + " " +
-                pdftexKeywords + " " + omegaKeywords + " " + macros
+                texKeywords
+                + " "
+                + etexKeywords
+                + " "
+                + pdftexKeywords
+                + " "
+                + omegaKeywords
+                + " "
+                + macros
             )
-        
+
         if kwSet == 8:
-            return (
-                texKeywords + " " + etexKeywords + " " +
-                pdftexKeywords
-            )
-        
+            return texKeywords + " " + etexKeywords + " " + pdftexKeywords
+
         return None
--- a/src/eric7/QScintilla/Lexers/LexerVHDL.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerVHDL.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,17 +17,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerVHDL.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "--"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
             self.tr("Operators"),
@@ -37,7 +38,7 @@
             self.tr("Standard Types"),
             self.tr("User defined"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
@@ -45,43 +46,40 @@
         self.setFoldComments(Preferences.getEditor("VHDLFoldComment"))
         self.setFoldAtElse(Preferences.getEditor("VHDLFoldAtElse"))
         self.setFoldAtBegin(Preferences.getEditor("VHDLFoldAtBegin"))
-        self.setFoldAtParenthesis(
-            Preferences.getEditor("VHDLFoldAtParenthesis"))
+        self.setFoldAtParenthesis(Preferences.getEditor("VHDLFoldAtParenthesis"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerVHDL.Comment,
-                         QsciLexerVHDL.CommentLine]
-    
+        return style in [QsciLexerVHDL.Comment, QsciLexerVHDL.CommentLine]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerVHDL.String,
-                         QsciLexerVHDL.UnclosedString]
-    
+        return style in [QsciLexerVHDL.String, QsciLexerVHDL.UnclosedString]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
         return QsciLexerVHDL.keywords(self, kwSet)
-    
+
     def maximumKeywordSet(self):
         """
         Public method to get the maximum keyword set.
-        
+
         @return maximum keyword set (integer)
         """
         return 7
--- a/src/eric7/QScintilla/Lexers/LexerXML.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerXML.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,20 +19,18 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerXML.__init__(self, parent)
         Lexer.__init__(self)
-        
-        self.streamCommentString = {
-            'start': '<!-- ',
-            'end': ' -->'
-        }
-        
+
+        self.streamCommentString = {"start": "<!-- ", "end": " -->"}
+
         self.keywordSetDescriptions = [
             self.tr(""),
             self.tr(""),
@@ -41,81 +39,82 @@
             self.tr(""),
             self.tr("SGML and DTD keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldPreprocessor(Preferences.getEditor("HtmlFoldPreprocessor"))
-        self.setCaseSensitiveTags(
-            Preferences.getEditor("HtmlCaseSensitiveTags"))
+        self.setCaseSensitiveTags(Preferences.getEditor("HtmlCaseSensitiveTags"))
         self.setFoldCompact(Preferences.getEditor("AllFoldCompact"))
         with contextlib.suppress(AttributeError):
-            self.setFoldScriptComments(
-                Preferences.getEditor("HtmlFoldScriptComments"))
-            self.setFoldScriptHeredocs(
-                Preferences.getEditor("HtmlFoldScriptHeredocs"))
+            self.setFoldScriptComments(Preferences.getEditor("HtmlFoldScriptComments"))
+            self.setFoldScriptHeredocs(Preferences.getEditor("HtmlFoldScriptHeredocs"))
             self.setScriptsStyled(Preferences.getEditor("XMLStyleScripts"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
-        return style in [QsciLexerXML.HTMLComment,
-                         QsciLexerXML.ASPXCComment,
-                         QsciLexerXML.SGMLComment,
-                         QsciLexerXML.SGMLParameterComment,
-                         QsciLexerXML.JavaScriptComment,
-                         QsciLexerXML.JavaScriptCommentDoc,
-                         QsciLexerXML.JavaScriptCommentLine,
-                         QsciLexerXML.ASPJavaScriptComment,
-                         QsciLexerXML.ASPJavaScriptCommentDoc,
-                         QsciLexerXML.ASPJavaScriptCommentLine,
-                         QsciLexerXML.VBScriptComment,
-                         QsciLexerXML.ASPVBScriptComment,
-                         QsciLexerXML.PythonComment,
-                         QsciLexerXML.ASPPythonComment,
-                         QsciLexerXML.PHPComment]
-    
+        return style in [
+            QsciLexerXML.HTMLComment,
+            QsciLexerXML.ASPXCComment,
+            QsciLexerXML.SGMLComment,
+            QsciLexerXML.SGMLParameterComment,
+            QsciLexerXML.JavaScriptComment,
+            QsciLexerXML.JavaScriptCommentDoc,
+            QsciLexerXML.JavaScriptCommentLine,
+            QsciLexerXML.ASPJavaScriptComment,
+            QsciLexerXML.ASPJavaScriptCommentDoc,
+            QsciLexerXML.ASPJavaScriptCommentLine,
+            QsciLexerXML.VBScriptComment,
+            QsciLexerXML.ASPVBScriptComment,
+            QsciLexerXML.PythonComment,
+            QsciLexerXML.ASPPythonComment,
+            QsciLexerXML.PHPComment,
+        ]
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
-        return style in [QsciLexerXML.HTMLDoubleQuotedString,
-                         QsciLexerXML.HTMLSingleQuotedString,
-                         QsciLexerXML.SGMLDoubleQuotedString,
-                         QsciLexerXML.SGMLSingleQuotedString,
-                         QsciLexerXML.JavaScriptDoubleQuotedString,
-                         QsciLexerXML.JavaScriptSingleQuotedString,
-                         QsciLexerXML.JavaScriptUnclosedString,
-                         QsciLexerXML.ASPJavaScriptDoubleQuotedString,
-                         QsciLexerXML.ASPJavaScriptSingleQuotedString,
-                         QsciLexerXML.ASPJavaScriptUnclosedString,
-                         QsciLexerXML.VBScriptString,
-                         QsciLexerXML.VBScriptUnclosedString,
-                         QsciLexerXML.ASPVBScriptString,
-                         QsciLexerXML.ASPVBScriptUnclosedString,
-                         QsciLexerXML.PythonDoubleQuotedString,
-                         QsciLexerXML.PythonSingleQuotedString,
-                         QsciLexerXML.PythonTripleDoubleQuotedString,
-                         QsciLexerXML.PythonTripleSingleQuotedString,
-                         QsciLexerXML.ASPPythonDoubleQuotedString,
-                         QsciLexerXML.ASPPythonSingleQuotedString,
-                         QsciLexerXML.ASPPythonTripleDoubleQuotedString,
-                         QsciLexerXML.ASPPythonTripleSingleQuotedString,
-                         QsciLexerXML.PHPDoubleQuotedString,
-                         QsciLexerXML.PHPSingleQuotedString]
-    
+        return style in [
+            QsciLexerXML.HTMLDoubleQuotedString,
+            QsciLexerXML.HTMLSingleQuotedString,
+            QsciLexerXML.SGMLDoubleQuotedString,
+            QsciLexerXML.SGMLSingleQuotedString,
+            QsciLexerXML.JavaScriptDoubleQuotedString,
+            QsciLexerXML.JavaScriptSingleQuotedString,
+            QsciLexerXML.JavaScriptUnclosedString,
+            QsciLexerXML.ASPJavaScriptDoubleQuotedString,
+            QsciLexerXML.ASPJavaScriptSingleQuotedString,
+            QsciLexerXML.ASPJavaScriptUnclosedString,
+            QsciLexerXML.VBScriptString,
+            QsciLexerXML.VBScriptUnclosedString,
+            QsciLexerXML.ASPVBScriptString,
+            QsciLexerXML.ASPVBScriptUnclosedString,
+            QsciLexerXML.PythonDoubleQuotedString,
+            QsciLexerXML.PythonSingleQuotedString,
+            QsciLexerXML.PythonTripleDoubleQuotedString,
+            QsciLexerXML.PythonTripleSingleQuotedString,
+            QsciLexerXML.ASPPythonDoubleQuotedString,
+            QsciLexerXML.ASPPythonSingleQuotedString,
+            QsciLexerXML.ASPPythonTripleDoubleQuotedString,
+            QsciLexerXML.ASPPythonTripleSingleQuotedString,
+            QsciLexerXML.PHPDoubleQuotedString,
+            QsciLexerXML.PHPSingleQuotedString,
+        ]
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/LexerYAML.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/LexerYAML.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,49 +17,50 @@
     """
     Subclass to implement some additional lexer dependant methods.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget of this lexer
         """
         QsciLexerYAML.__init__(self, parent)
         Lexer.__init__(self)
-        
+
         self.commentString = "#"
-        
+
         self.keywordSetDescriptions = [
             self.tr("Keywords"),
         ]
-    
+
     def initProperties(self):
         """
         Public slot to initialize the properties.
         """
         self.setFoldComments(Preferences.getEditor("YAMLFoldComment"))
-    
+
     def isCommentStyle(self, style):
         """
         Public method to check, if a style is a comment style.
-        
+
         @param style style to check (integer)
         @return flag indicating a comment style (boolean)
         """
         return style in [QsciLexerYAML.Comment]
-    
+
     def isStringStyle(self, style):
         """
         Public method to check, if a style is a string style.
-        
+
         @param style style to check (integer)
         @return flag indicating a string style (boolean)
         """
         return False
-    
+
     def defaultKeywords(self, kwSet):
         """
         Public method to get the default keywords.
-        
+
         @param kwSet number of the keyword set (integer)
         @return string giving the keywords (string) or None
         """
--- a/src/eric7/QScintilla/Lexers/SubstyledLexer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/SubstyledLexer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,12 +20,13 @@
     """
     Class to implement the sub-styled lexer mixin class.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.baseStyles = []
         # list of style numbers, that support sub-styling
         self.defaultSubStyles = {}
@@ -44,51 +45,52 @@
         #               'font_bold: bold font (bool)
         #               'font_italic: italic font (bool)
         #               'font_underline: underlined font (bool)
-        
+
         self.__subStyles = {}
         self.__subStylesInitialized = False
-    
+
     def loadAllDefaultSubStyles(self):
         """
         Public method to load the default sub-style definitions.
         """
         self.__subStyles = copy.deepcopy(self.defaultSubStyles)
-        
+
         self.__subStylesInitialized = True
-    
+
     def loadDefaultSubStyles(self, style):
         """
         Public method to load the default sub-styles for a given base style.
-        
+
         @param style style number
         @type int
         """
         if style in self.defaultSubStyles:
-            self.__subStyles[style] = copy.deepcopy(
-                self.defaultSubStyles[style])
-    
+            self.__subStyles[style] = copy.deepcopy(self.defaultSubStyles[style])
+
     def loadSubstyles(self):
         """
         Public method to load the sub-styles from the settings file.
         """
         settings = Preferences.getSettings()
-        
+
         # Step 1: check if sub-styles were defined and saved
         subStylesDefined = False
         for baseStyle in self.baseStyles:
             key = "Scintilla/{0}/style{1}/SubStyleLength".format(
-                self.language(), baseStyle)
+                self.language(), baseStyle
+            )
             subStylesDefined |= settings.contains(key)
         # Step 2.1: load default sub-styles, if none were defined
         if not subStylesDefined:
             self.loadAllDefaultSubStyles()
-        
+
         # Step 2.2: load from settings file
         else:
             self.__subStyles = {}
             for baseStyle in self.baseStyles:
                 key = "Scintilla/{0}/style{1}/SubStyleLength".format(
-                    self.language(), baseStyle)
+                    self.language(), baseStyle
+                )
                 if settings.contains(key):
                     subStyleLength = int(settings.value(key))
                     if subStyleLength:
@@ -100,11 +102,13 @@
                             if settings.contains(substyleKey + "Description"):
                                 subStyleData = {}
                                 subStyleData["Description"] = settings.value(
-                                    substyleKey + "Description", "")
+                                    substyleKey + "Description", ""
+                                )
                                 subStyleData["Words"] = settings.value(
-                                    substyleKey + "Words", "")
+                                    substyleKey + "Words", ""
+                                )
                                 style = {}
-                                
+
                                 key = substyleKey + "fore"
                                 if settings.contains(key):
                                     style["fore"] = int(settings.value(key))
@@ -114,79 +118,75 @@
                                 key = substyleKey + "eolfill"
                                 if settings.contains(key):
                                     style["eolfill"] = Preferences.toBool(
-                                        settings.value(key))
+                                        settings.value(key)
+                                    )
                                 key = substyleKey + "font_family"
                                 if settings.contains(key):
                                     style["font_family"] = settings.value(key)
                                 key = substyleKey + "font_size"
                                 if settings.contains(key):
-                                    style["font_size"] = (
-                                        int(settings.value(key))
-                                    )
+                                    style["font_size"] = int(settings.value(key))
                                 key = substyleKey + "font_bold"
                                 if settings.contains(key):
                                     style["font_bold"] = Preferences.toBool(
-                                        settings.value(key))
+                                        settings.value(key)
+                                    )
                                 key = substyleKey + "font_italic"
                                 if settings.contains(key):
                                     style["font_italic"] = Preferences.toBool(
-                                        settings.value(key))
+                                        settings.value(key)
+                                    )
                                 key = substyleKey + "font_underline"
                                 if settings.contains(key):
-                                    style["font_underline"] = (
-                                        Preferences.toBool(settings.value(key))
+                                    style["font_underline"] = Preferences.toBool(
+                                        settings.value(key)
                                     )
-                                
+
                                 subStyleData["Style"] = style
-                                
-                                self.__subStyles[baseStyle][subStyle] = (
-                                    subStyleData
-                                )
-                            
+
+                                self.__subStyles[baseStyle][subStyle] = subStyleData
+
                             else:
                                 # initialize with default
-                                self.__subStyles[baseStyle][subStyle] = (
-                                    copy.deepcopy(self.defaultSubStyles
-                                                  [baseStyle][subStyle])
+                                self.__subStyles[baseStyle][subStyle] = copy.deepcopy(
+                                    self.defaultSubStyles[baseStyle][subStyle]
                                 )
-        
+
         self.__subStylesInitialized = True
-    
+
     def readSubstyles(self, editor):
         """
         Public method to load the sub-styles and configure the editor.
-        
+
         @param editor reference to the editor object
         @type QsciScintilla
         """
-        subStyleBasesLength = editor.SendScintilla(
-            editor.SCI_GETSUBSTYLEBASES, 0, None)
+        subStyleBasesLength = editor.SendScintilla(editor.SCI_GETSUBSTYLEBASES, 0, None)
         if not subStyleBasesLength:
             # lexer does not support sub-styling
             return
-        
+
         self.loadSubstyles()
-        
+
         # free existing sub-styles first
         editor.SendScintilla(editor.SCI_FREESUBSTYLES)
         subStyleBases = b"\00" * (subStyleBasesLength + 1)
         editor.SendScintilla(editor.SCI_GETSUBSTYLEBASES, 0, subStyleBases)
-        distanceToSecondary = editor.SendScintilla(
-            editor.SCI_DISTANCETOSECONDARYSTYLES)
-        
+        distanceToSecondary = editor.SendScintilla(editor.SCI_DISTANCETOSECONDARYSTYLES)
+
         subStyleBases = [b for b in bytearray(subStyleBases[:-1])]
         if distanceToSecondary:
-            subStyleBases.extend(b + distanceToSecondary
-                                 for b in subStyleBases[:])
+            subStyleBases.extend(b + distanceToSecondary for b in subStyleBases[:])
         for baseStyleNo in subStyleBases:
             if baseStyleNo in self.__subStyles:
                 subStylesData = self.__subStyles[baseStyleNo]
                 subStyleLength = len(subStylesData)
                 subStyleStart = editor.SendScintilla(
-                    editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength)
+                    editor.SCI_ALLOCATESUBSTYLES, baseStyleNo, subStyleLength
+                )
                 if subStyleStart < 0:
                     continue
-                
+
                 for subStyleIndex, subStyleKey in enumerate(
                     sorted(subStylesData.keys())
                 ):
@@ -194,39 +194,40 @@
                     subStyle = subStylesData[subStyleKey]
                     # set the words
                     editor.SendScintilla(
-                        editor.SCI_SETIDENTIFIERS,
-                        styleNo,
-                        subStyle["Words"].encode())
-                    
+                        editor.SCI_SETIDENTIFIERS, styleNo, subStyle["Words"].encode()
+                    )
+
                     # set the style
                     style = subStyle["Style"]
                     color = (
                         QColor(
-                            style["fore"] >> 16 & 0xff,
-                            style["fore"] >> 8 & 0xff,
-                            style["fore"] & 0xff,)
-                        if "fore" in style else
-                        self.color(baseStyleNo)
+                            style["fore"] >> 16 & 0xFF,
+                            style["fore"] >> 8 & 0xFF,
+                            style["fore"] & 0xFF,
+                        )
+                        if "fore" in style
+                        else self.color(baseStyleNo)
                     )
                     self.setColor(color, styleNo)
-                    
+
                     color = (
                         QColor(
-                            style["paper"] >> 16 & 0xff,
-                            style["paper"] >> 8 & 0xff,
-                            style["paper"] & 0xff,)
-                        if "paper" in style else
-                        self.paper(baseStyleNo)
+                            style["paper"] >> 16 & 0xFF,
+                            style["paper"] >> 8 & 0xFF,
+                            style["paper"] & 0xFF,
+                        )
+                        if "paper" in style
+                        else self.paper(baseStyleNo)
                     )
                     self.setPaper(color, styleNo)
-                    
+
                     eolFill = (
                         style["eolfill"]
-                        if "eolfill" in style else
-                        self.eolFill(baseStyleNo)
+                        if "eolfill" in style
+                        else self.eolFill(baseStyleNo)
                     )
                     self.setEolFill(eolFill, styleNo)
-                    
+
                     font = self.font(baseStyleNo)
                     if "font_family" in style:
                         font.setFamily(style["font_family"])
@@ -239,53 +240,53 @@
                     if "font_underline" in style:
                         font.setUnderline(style["font_underline"])
                     self.setFont(font, styleNo)
-    
+
     def writeSubstyles(self):
         """
         Public method to save the sub-styles.
         """
         if not self.__subStylesInitialized:
             return
-        
+
         settings = Preferences.getSettings()
-        
+
         # Step 1: remove all sub-style definitions first
         for baseStyle in self.baseStyles:
             key = "Scintilla/{0}/style{1}/SubStyleLength".format(
-                self.language(), baseStyle)
+                self.language(), baseStyle
+            )
             if settings.contains(key):
                 subStyleLength = int(settings.value(key))
                 if subStyleLength:
                     for subStyle in range(subStyleLength):
-                        substyleKey = (
-                            "Scintilla/{0}/style{1}/substyle{2}/"
-                        ).format(self.language(), baseStyle, subStyle)
+                        substyleKey = ("Scintilla/{0}/style{1}/substyle{2}/").format(
+                            self.language(), baseStyle, subStyle
+                        )
                         settings.remove(substyleKey)
-        
+
         # Step 2: save the defined sub-styles
         for baseStyle in self.baseStyles:
             key = "Scintilla/{0}/style{1}/SubStyleLength".format(
-                self.language(), baseStyle)
+                self.language(), baseStyle
+            )
             settings.setValue(key, len(self.__subStyles[baseStyle]))
             for subStyleIndex, subStyle in enumerate(
                 sorted(self.__subStyles[baseStyle].keys())
             ):
                 substyleKey = "Scintilla/{0}/style{1}/substyle{2}/".format(
-                    self.language(), baseStyle, subStyleIndex)
+                    self.language(), baseStyle, subStyleIndex
+                )
                 subStyleData = self.__subStyles[baseStyle][subStyle]
-                
-                if (
-                    not subStyleData["Description"] and
-                    not subStyleData["Words"]
-                ):
+
+                if not subStyleData["Description"] and not subStyleData["Words"]:
                     # invalid or incomplete sub-style definition
                     continue
-                
-                settings.setValue(substyleKey + "Description",
-                                  subStyleData["Description"])
-                settings.setValue(substyleKey + "Words",
-                                  subStyleData["Words"])
-                
+
+                settings.setValue(
+                    substyleKey + "Description", subStyleData["Description"]
+                )
+                settings.setValue(substyleKey + "Words", subStyleData["Words"])
+
                 style = subStyleData["Style"]
                 if "fore" in style:
                     color = style["fore"]
@@ -312,47 +313,46 @@
                 settings.setValue(substyleKey + "font_italic", italic)
                 underline = (
                     style["font_underline"]
-                    if "font_underline" in style else
-                    font.underline()
+                    if "font_underline" in style
+                    else font.underline()
                 )
                 settings.setValue(substyleKey + "font_underline", underline)
-    
+
     def hasSubstyles(self):
         """
         Public method to indicate the support of sub-styles.
-        
+
         @return flag indicating sub-styling support
         @rtype bool
         """
         return True
-    
+
     def getBaseStyles(self):
         """
         Public method to get the list of supported base styles.
-        
+
         @return list of base styles
         @rtype list of int
         """
         return self.baseStyles[:]
-    
+
     def substylesCount(self, style):
         """
         Public method to get the number of defined sub-styles.
-        
+
         @param style base style number
         @type int
         @return number of defined sub-styles
         @rtype int
         """
-        count = (len(self.__subStyles[style]) if style in self.__subStyles
-                 else 0)
-        
+        count = len(self.__subStyles[style]) if style in self.__subStyles else 0
+
         return count
-    
+
     def setSubstyleDescription(self, description, style, substyle):
         """
         Public method to set the description for a sub-style.
-        
+
         @param description description to be set
         @type str
         @param style base style number
@@ -361,14 +361,12 @@
         @type int
         """
         if style in self.__subStyles and substyle in self.__subStyles[style]:
-            self.__subStyles[style][substyle]["Description"] = (
-                description.strip()
-            )
-    
+            self.__subStyles[style][substyle]["Description"] = description.strip()
+
     def substyleDescription(self, style, substyle):
         """
         Public method to get the description of a sub-style.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -378,17 +376,16 @@
         """
         desc = (
             self.__subStyles[style][substyle]["Description"].strip()
-            if (style in self.__subStyles and
-                substyle in self.__subStyles[style]) else
-            ""
+            if (style in self.__subStyles and substyle in self.__subStyles[style])
+            else ""
         )
-        
+
         return desc
-    
+
     def setSubstyleWords(self, words, style, substyle):
         """
         Public method to set the words for a sub-style.
-        
+
         @param words words to be set separated by white-space
         @type str
         @param style base style number
@@ -398,11 +395,11 @@
         """
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             self.__subStyles[style][substyle]["Words"] = words.strip()
-    
+
     def substyleWords(self, style, substyle):
         """
         Public method to get the words of a sub-style.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -412,17 +409,16 @@
         """
         words = (
             self.__subStyles[style][substyle]["Words"].strip()
-            if (style in self.__subStyles and
-                substyle in self.__subStyles[style]) else
-            ""
+            if (style in self.__subStyles and substyle in self.__subStyles[style])
+            else ""
         )
-        
+
         return words
-    
+
     def setSubstyleColor(self, color, style, substyle):
         """
         Public method to set the foreground color of a sub-style.
-        
+
         @param color foreground color to be set
         @type QColor
         @param style base style number
@@ -434,11 +430,11 @@
             self.__subStyles[style][substyle]["Style"]["fore"] = (
                 color.red() << 16 | color.green() << 8 | color.blue()
             )
-    
+
     def substyleColor(self, style, substyle):
         """
         Public method to get the sub-style foreground color.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -447,22 +443,22 @@
         @rtype QColor
         """
         color = self.color(style)
-        
+
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             styleData = self.__subStyles[style][substyle]["Style"]
             if "fore" in styleData:
                 color = QColor(
-                    styleData["fore"] >> 16 & 0xff,
-                    styleData["fore"] >> 8 & 0xff,
-                    styleData["fore"] & 0xff,
+                    styleData["fore"] >> 16 & 0xFF,
+                    styleData["fore"] >> 8 & 0xFF,
+                    styleData["fore"] & 0xFF,
                 )
-        
+
         return color
-    
+
     def setSubstylePaper(self, color, style, substyle):
         """
         Public method to set the background color of a sub-style.
-        
+
         @param color background color to be set
         @type QColor
         @param style base style number
@@ -474,11 +470,11 @@
             self.__subStyles[style][substyle]["Style"]["paper"] = (
                 color.red() << 16 | color.green() << 8 | color.blue()
             )
-    
+
     def substylePaper(self, style, substyle):
         """
         Public method to get the sub-style background color.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -487,22 +483,22 @@
         @rtype QColor
         """
         color = self.paper(style)
-        
+
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             styleData = self.__subStyles[style][substyle]["Style"]
             if "paper" in styleData:
                 color = QColor(
-                    styleData["paper"] >> 16 & 0xff,
-                    styleData["paper"] >> 8 & 0xff,
-                    styleData["paper"] & 0xff,
+                    styleData["paper"] >> 16 & 0xFF,
+                    styleData["paper"] >> 8 & 0xFF,
+                    styleData["paper"] & 0xFF,
                 )
-        
+
         return color
-    
+
     def setSubstyleEolFill(self, eolFill, style, substyle):
         """
         Public method to set the eolfill flag of a sub-style.
-        
+
         @param eolFill eolfill flag to be set
         @type bool
         @param style base style number
@@ -511,14 +507,12 @@
         @type int
         """
         if style in self.__subStyles and substyle in self.__subStyles[style]:
-            self.__subStyles[style][substyle]["Style"]["eolfill"] = (
-                eolFill
-            )
-    
+            self.__subStyles[style][substyle]["Style"]["eolfill"] = eolFill
+
     def substyleEolFill(self, style, substyle):
         """
         Public method to get the eolfill flag.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -527,17 +521,17 @@
         @rtype bool
         """
         eolFill = self.eolFill(style)
-        
+
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             styleData = self.__subStyles[style][substyle]["Style"]
             eolFill = styleData.get("eolfill", self.eolFill(style))
-        
+
         return eolFill
-    
+
     def setSubstyleFont(self, font, style, substyle):
         """
         Public method to set the font of a sub-style.
-        
+
         @param font font to be set
         @type QFont
         @param style base style number
@@ -546,26 +540,18 @@
         @type int
         """
         if style in self.__subStyles and substyle in self.__subStyles[style]:
-            self.__subStyles[style][substyle]["Style"]["font_family"] = (
-                font.family()
-            )
-            self.__subStyles[style][substyle]["Style"]["font_size"] = (
-                font.pointSize()
-            )
-            self.__subStyles[style][substyle]["Style"]["font_bold"] = (
-                font.bold()
-            )
-            self.__subStyles[style][substyle]["Style"]["font_italic"] = (
-                font.italic()
-            )
-            self.__subStyles[style][substyle]["Style"]["font_underline"] = (
-                font.underline()
-            )
-    
+            self.__subStyles[style][substyle]["Style"]["font_family"] = font.family()
+            self.__subStyles[style][substyle]["Style"]["font_size"] = font.pointSize()
+            self.__subStyles[style][substyle]["Style"]["font_bold"] = font.bold()
+            self.__subStyles[style][substyle]["Style"]["font_italic"] = font.italic()
+            self.__subStyles[style][substyle]["Style"][
+                "font_underline"
+            ] = font.underline()
+
     def substyleFont(self, style, substyle):
         """
         Public method to get the sub-style font.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -574,7 +560,7 @@
         @rtype QFont
         """
         font = self.font(style)
-        
+
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             styleData = self.__subStyles[style][substyle]["Style"]
             if "font_family" in styleData:
@@ -587,13 +573,13 @@
                 font.setItalic(styleData["font_italic"])
             if "font_underline" in styleData:
                 font.setUnderline(styleData["font_underline"])
-        
+
         return font
-    
+
     def substyleDefaultDescription(self, style, substyle):
         """
         Public method to get the default description of a sub-style.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -602,20 +588,17 @@
         @rtype str
         """
         description = ""
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             substyleData = self.defaultSubStyles[style][substyle]
             description = substyleData["Description"].strip()
-        
+
         return description
-    
+
     def substyleDefaultWords(self, style, substyle):
         """
         Public method to get the default words of a sub-style.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -624,20 +607,17 @@
         @rtype str
         """
         words = ""
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             substyleData = self.defaultSubStyles[style][substyle]
             words = substyleData["Words"].strip()
-        
+
         return words
-    
+
     def substyleDefaultColor(self, style, substyle):
         """
         Public method to get the sub-style default foreground color.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -646,25 +626,22 @@
         @rtype QColor
         """
         color = self.defaultColor(style)
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             styleData = self.defaultSubStyles[style][substyle]["Style"]
             if "fore" in styleData:
                 color = QColor(
-                    styleData["fore"] >> 16 & 0xff,
-                    styleData["fore"] >> 8 & 0xff,
-                    styleData["fore"] & 0xff,
+                    styleData["fore"] >> 16 & 0xFF,
+                    styleData["fore"] >> 8 & 0xFF,
+                    styleData["fore"] & 0xFF,
                 )
-        
+
         return color
-    
+
     def substyleDefaultPaper(self, style, substyle):
         """
         Public method to get the sub-style default background color.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -673,25 +650,22 @@
         @rtype QColor
         """
         color = self.defaultPaper(style)
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             styleData = self.defaultSubStyles[style][substyle]["Style"]
             if "paper" in styleData:
                 color = QColor(
-                    styleData["paper"] >> 16 & 0xff,
-                    styleData["paper"] >> 8 & 0xff,
-                    styleData["paper"] & 0xff,
+                    styleData["paper"] >> 16 & 0xFF,
+                    styleData["paper"] >> 8 & 0xFF,
+                    styleData["paper"] & 0xFF,
                 )
-        
+
         return color
-    
+
     def substyleDefaultEolFill(self, style, substyle):
         """
         Public method to get the default eolfill flag.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -700,20 +674,17 @@
         @rtype bool
         """
         eolFill = self.defaultEolFill(style)
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             styleData = self.defaultSubStyles[style][substyle]["Style"]
             eolFill = styleData.get("eolfill", self.defaultEolFill(style))
-        
+
         return eolFill
-    
+
     def substyleDefaultFont(self, style, substyle):
         """
         Public method to get the default sub-style font.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -722,11 +693,8 @@
         @rtype QFont
         """
         font = self.defaultFont(style)
-        
-        if (
-            style in self.defaultSubStyles and
-            substyle in self.defaultSubStyles[style]
-        ):
+
+        if style in self.defaultSubStyles and substyle in self.defaultSubStyles[style]:
             styleData = self.defaultSubStyles[style][substyle]["Style"]
             if "font_family" in styleData:
                 font.setFamily(styleData["font_family"])
@@ -738,13 +706,13 @@
                 font.setItalic(styleData["font_italic"])
             if "font_underline" in styleData:
                 font.setUnderline(styleData["font_underline"])
-        
+
         return font
-    
+
     def addSubstyle(self, style):
         """
         Public method to add an empty sub-style to a given base style.
-        
+
         @param style base style number
         @type int
         @return allocated sub-style number or -1 to indicate an error
@@ -760,13 +728,13 @@
             }
         else:
             subStyle = -1
-        
+
         return subStyle
-    
+
     def delSubstyle(self, style, substyle):
         """
         Public method to delete a given sub-style definition.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -775,17 +743,17 @@
         @rtype bool
         """
         ok = False
-        
+
         if style in self.__subStyles and substyle in self.__subStyles[style]:
             del self.__subStyles[style][substyle]
             ok = True
-        
+
         return ok
-    
+
     def hasSubstyle(self, style, substyle):
         """
         Public method to test for a given sub-style definition.
-        
+
         @param style base style number
         @type int
         @param substyle sub-style number
@@ -793,13 +761,12 @@
         @return flag indicating the existence of a sub-style definition
         @rtype bool
         """
-        return (style in self.__subStyles and
-                substyle in self.__subStyles[style])
-    
+        return style in self.__subStyles and substyle in self.__subStyles[style]
+
     def isBaseStyle(self, style):
         """
         Public method to test, if a given style may have sub-styles.
-        
+
         @param style base style number
         @type int
         @return flag indicating that the style may have sub-styles
--- a/src/eric7/QScintilla/Lexers/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Lexers/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,12 +26,19 @@
 LexerRegistry = {}
 
 
-def registerLexer(name, displayString, filenameSample, getLexerFunc,
-                  openFilters=None, saveFilters=None,
-                  defaultAssocs=None, iconFileName=""):
+def registerLexer(
+    name,
+    displayString,
+    filenameSample,
+    getLexerFunc,
+    openFilters=None,
+    saveFilters=None,
+    defaultAssocs=None,
+    iconFileName="",
+):
     """
     Module function to register a custom QScintilla lexer.
-    
+
     @param name lexer language name (string)
     @param displayString display string (string)
     @param filenameSample dummy filename to derive lexer name (string)
@@ -50,18 +57,20 @@
         raise KeyError('Lexer "{0}" already registered.'.format(name))
     else:
         LexerRegistry[name] = [
-            displayString, filenameSample, getLexerFunc,
+            displayString,
+            filenameSample,
+            getLexerFunc,
             [] if openFilters is None else openFilters[:],
             [] if saveFilters is None else saveFilters[:],
             [] if defaultAssocs is None else defaultAssocs[:],
-            iconFileName
+            iconFileName,
         ]
 
 
 def unregisterLexer(name):
     """
     Module function to unregister a custom QScintilla lexer.
-    
+
     @param name lexer language name (string)
     """
     if name in LexerRegistry:
@@ -71,7 +80,7 @@
 def getSupportedLanguages():
     """
     Module function to get a dictionary of supported lexer languages.
-    
+
     @return dictionary of supported lexer languages. The keys are the
         internal language names. The items are lists of three entries.
         The first is the display string for the language, the second
@@ -80,165 +89,187 @@
         (string, string, string)
     """
     supportedLanguages = {
-        "Bash":
-            [QCoreApplication.translate('Lexers', "Bash"), 'dummy.sh',
-             "lexerBash"],
-        "Batch":
-            [QCoreApplication.translate('Lexers', "Batch"), 'dummy.bat',
-             "lexerBatch"],
-        "C++":
-            [QCoreApplication.translate('Lexers', "C/C++"), 'dummy.cpp',
-             "lexerCPP"],
-        "C#":
-            [QCoreApplication.translate('Lexers', "C#"), 'dummy.cs',
-             "lexerCsharp"],
-        "CMake":
-            [QCoreApplication.translate('Lexers', "CMake"), 'dummy.cmake',
-             "lexerCMake"],
-        "CSS":
-            [QCoreApplication.translate('Lexers', "CSS"), 'dummy.css',
-             "lexerCSS"],
-        "Cython":
-            [QCoreApplication.translate('Lexers', "Cython"), 'dummy.pyx',
-             "lexerCython"],
-        "D":
-            [QCoreApplication.translate('Lexers', "D"), 'dummy.d',
-             "lexerD"],
-        "Diff":
-            [QCoreApplication.translate('Lexers', "Diff"), 'dummy.diff',
-             "lexerDiff"],
-        "Fortran":
-            [QCoreApplication.translate('Lexers', "Fortran"), 'dummy.f95',
-             "lexerFortran"],
-        "Fortran77":
-            [QCoreApplication.translate('Lexers', "Fortran77"), 'dummy.f',
-             "lexerFortran"],
-        "HTML":
-            [QCoreApplication.translate('Lexers', "HTML/PHP/XML"),
-             'dummy.html', "lexerHTML"],
-        "IDL":
-            [QCoreApplication.translate('Lexers', "IDL"), 'dummy.idl',
-             "lexerIDL"],
-        "Java":
-            [QCoreApplication.translate('Lexers', "Java"), 'dummy.java',
-             "lexerJava"],
-        "JavaScript":
-            [QCoreApplication.translate('Lexers', "JavaScript"), 'dummy.js',
-             "lexerJavaScript"],
-        "Lua":
-            [QCoreApplication.translate('Lexers', "Lua"), 'dummy.lua',
-             "lexerLua"],
-        "Makefile":
-            [QCoreApplication.translate('Lexers', "Makefile"), 'dummy.mak',
-             "lexerMakefile"],
-        "Matlab":
-            [QCoreApplication.translate('Lexers', "Matlab"), 'dummy.m.matlab',
-             "lexerMatlab"],
-        "Octave":
-            [QCoreApplication.translate('Lexers', "Octave"), 'dummy.m.octave',
-             "lexerOctave"],
-        "Pascal":
-            [QCoreApplication.translate('Lexers', "Pascal"), 'dummy.pas',
-             "lexerPascal"],
-        "Perl":
-            [QCoreApplication.translate('Lexers', "Perl"), 'dummy.pl',
-             "lexerPerl"],
-        "PostScript":
-            [QCoreApplication.translate('Lexers', "PostScript"), 'dummy.ps',
-             "lexerPostscript"],
-        "Povray":
-            [QCoreApplication.translate('Lexers', "Povray"), 'dummy.pov',
-             "lexerPOV"],
-        "Properties":
-            [QCoreApplication.translate('Lexers', "Properties"), 'dummy.ini',
-             "lexerProperties"],
+        "Bash": [QCoreApplication.translate("Lexers", "Bash"), "dummy.sh", "lexerBash"],
+        "Batch": [
+            QCoreApplication.translate("Lexers", "Batch"),
+            "dummy.bat",
+            "lexerBatch",
+        ],
+        "C++": [QCoreApplication.translate("Lexers", "C/C++"), "dummy.cpp", "lexerCPP"],
+        "C#": [QCoreApplication.translate("Lexers", "C#"), "dummy.cs", "lexerCsharp"],
+        "CMake": [
+            QCoreApplication.translate("Lexers", "CMake"),
+            "dummy.cmake",
+            "lexerCMake",
+        ],
+        "CSS": [QCoreApplication.translate("Lexers", "CSS"), "dummy.css", "lexerCSS"],
+        "Cython": [
+            QCoreApplication.translate("Lexers", "Cython"),
+            "dummy.pyx",
+            "lexerCython",
+        ],
+        "D": [QCoreApplication.translate("Lexers", "D"), "dummy.d", "lexerD"],
+        "Diff": [
+            QCoreApplication.translate("Lexers", "Diff"),
+            "dummy.diff",
+            "lexerDiff",
+        ],
+        "Fortran": [
+            QCoreApplication.translate("Lexers", "Fortran"),
+            "dummy.f95",
+            "lexerFortran",
+        ],
+        "Fortran77": [
+            QCoreApplication.translate("Lexers", "Fortran77"),
+            "dummy.f",
+            "lexerFortran",
+        ],
+        "HTML": [
+            QCoreApplication.translate("Lexers", "HTML/PHP/XML"),
+            "dummy.html",
+            "lexerHTML",
+        ],
+        "IDL": [QCoreApplication.translate("Lexers", "IDL"), "dummy.idl", "lexerIDL"],
+        "Java": [
+            QCoreApplication.translate("Lexers", "Java"),
+            "dummy.java",
+            "lexerJava",
+        ],
+        "JavaScript": [
+            QCoreApplication.translate("Lexers", "JavaScript"),
+            "dummy.js",
+            "lexerJavaScript",
+        ],
+        "Lua": [QCoreApplication.translate("Lexers", "Lua"), "dummy.lua", "lexerLua"],
+        "Makefile": [
+            QCoreApplication.translate("Lexers", "Makefile"),
+            "dummy.mak",
+            "lexerMakefile",
+        ],
+        "Matlab": [
+            QCoreApplication.translate("Lexers", "Matlab"),
+            "dummy.m.matlab",
+            "lexerMatlab",
+        ],
+        "Octave": [
+            QCoreApplication.translate("Lexers", "Octave"),
+            "dummy.m.octave",
+            "lexerOctave",
+        ],
+        "Pascal": [
+            QCoreApplication.translate("Lexers", "Pascal"),
+            "dummy.pas",
+            "lexerPascal",
+        ],
+        "Perl": [QCoreApplication.translate("Lexers", "Perl"), "dummy.pl", "lexerPerl"],
+        "PostScript": [
+            QCoreApplication.translate("Lexers", "PostScript"),
+            "dummy.ps",
+            "lexerPostscript",
+        ],
+        "Povray": [
+            QCoreApplication.translate("Lexers", "Povray"),
+            "dummy.pov",
+            "lexerPOV",
+        ],
+        "Properties": [
+            QCoreApplication.translate("Lexers", "Properties"),
+            "dummy.ini",
+            "lexerProperties",
+        ],
         "Protocol Buffer": [
-            QCoreApplication.translate('Lexers', "Protocol Buffer (protobuf)"),
-            'dummy.proto', "protobuf"],
-        "Python3":
-            [QCoreApplication.translate('Lexers', "Python3"), 'dummy.py',
-             "lexerPython3"],
-        "MicroPython":
-            [QCoreApplication.translate('Lexers', "MicroPython"), 'dummy.py',
-             "micropython"],
-        "QSS":
-            [QCoreApplication.translate('Lexers', "QSS"), 'dummy.qss',
-             "lexerCSS"],
-        "Ruby":
-            [QCoreApplication.translate('Lexers', "Ruby"), 'dummy.rb',
-             "lexerRuby"],
-        "SQL":
-            [QCoreApplication.translate('Lexers', "SQL"), 'dummy.sql',
-             "lexerSQL"],
-        "TCL":
-            [QCoreApplication.translate('Lexers', "TCL"), 'dummy.tcl',
-             "lexerTCL"],
-        "TeX":
-            [QCoreApplication.translate('Lexers', "TeX"), 'dummy.tex',
-             "lexerTeX"],
-        "VHDL":
-            [QCoreApplication.translate('Lexers', "VHDL"), 'dummy.vhd',
-             "lexerVHDL"],
-        "XML":
-            [QCoreApplication.translate('Lexers', "XML"), 'dummy.xml',
-             "lexerXML"],
-        "YAML":
-            [QCoreApplication.translate('Lexers', "YAML"), 'dummy.yml',
-             "lexerYAML"],
-        "Gettext":
-            [QCoreApplication.translate('Lexers', "Gettext"), 'dummy.po',
-             "lexerGettext"],
-        "CoffeeScript":
-            [QCoreApplication.translate('Lexers', "CoffeeScript"),
-             'dummy.coffee', "lexerCoffeeScript"],
-        "JSON":
-            [QCoreApplication.translate('Lexers', "JSON"), 'dummy.json',
-             "lexerJSON"],
-        "Markdown":
-            [QCoreApplication.translate('Lexers', "Markdown"), 'dummy.md',
-             "lexerMarkdown"],
+            QCoreApplication.translate("Lexers", "Protocol Buffer (protobuf)"),
+            "dummy.proto",
+            "protobuf",
+        ],
+        "Python3": [
+            QCoreApplication.translate("Lexers", "Python3"),
+            "dummy.py",
+            "lexerPython3",
+        ],
+        "MicroPython": [
+            QCoreApplication.translate("Lexers", "MicroPython"),
+            "dummy.py",
+            "micropython",
+        ],
+        "QSS": [QCoreApplication.translate("Lexers", "QSS"), "dummy.qss", "lexerCSS"],
+        "Ruby": [QCoreApplication.translate("Lexers", "Ruby"), "dummy.rb", "lexerRuby"],
+        "SQL": [QCoreApplication.translate("Lexers", "SQL"), "dummy.sql", "lexerSQL"],
+        "TCL": [QCoreApplication.translate("Lexers", "TCL"), "dummy.tcl", "lexerTCL"],
+        "TeX": [QCoreApplication.translate("Lexers", "TeX"), "dummy.tex", "lexerTeX"],
+        "VHDL": [
+            QCoreApplication.translate("Lexers", "VHDL"),
+            "dummy.vhd",
+            "lexerVHDL",
+        ],
+        "XML": [QCoreApplication.translate("Lexers", "XML"), "dummy.xml", "lexerXML"],
+        "YAML": [
+            QCoreApplication.translate("Lexers", "YAML"),
+            "dummy.yml",
+            "lexerYAML",
+        ],
+        "Gettext": [
+            QCoreApplication.translate("Lexers", "Gettext"),
+            "dummy.po",
+            "lexerGettext",
+        ],
+        "CoffeeScript": [
+            QCoreApplication.translate("Lexers", "CoffeeScript"),
+            "dummy.coffee",
+            "lexerCoffeeScript",
+        ],
+        "JSON": [
+            QCoreApplication.translate("Lexers", "JSON"),
+            "dummy.json",
+            "lexerJSON",
+        ],
+        "Markdown": [
+            QCoreApplication.translate("Lexers", "Markdown"),
+            "dummy.md",
+            "lexerMarkdown",
+        ],
     }
-    
+
     for name in LexerRegistry:
         if not name.startswith("Pygments|"):
-            supportedLanguages[name] = (
-                LexerRegistry[name][:2] +
-                [LexerRegistry[name][6]]
-            )
-    
+            supportedLanguages[name] = LexerRegistry[name][:2] + [
+                LexerRegistry[name][6]
+            ]
+
     supportedLanguages["Guessed"] = [
-        QCoreApplication.translate('Lexers', "Pygments"),
-        'dummy.pygments',
-        ""
+        QCoreApplication.translate("Lexers", "Pygments"),
+        "dummy.pygments",
+        "",
     ]
-    
+
     return supportedLanguages
 
 
 def getSupportedApiLanguages():
     """
     Module function to get a list of supported API languages.
-    
+
     @return list of supported API languages
     @rtype list of str
     """
-    return [lang for lang in getSupportedLanguages().keys()
-            if lang != "Guessed" and not lang.startswith("Pygments|")]
+    return [
+        lang
+        for lang in getSupportedLanguages().keys()
+        if lang != "Guessed" and not lang.startswith("Pygments|")
+    ]
 
 
 def getLanguageIcon(language, pixmap):
     """
     Module function to get an icon for a language.
-    
+
     @param language language of the lexer (string)
     @param pixmap flag indicating to return a pixmap (boolean)
     @return icon for the language (QPixmap or QIcon)
     """
     supportedLanguages = getSupportedLanguages()
     iconFileName = (
-        supportedLanguages[language][2]
-        if language in supportedLanguages else
-        ""
+        supportedLanguages[language][2] if language in supportedLanguages else ""
     )
     if pixmap:
         return UI.PixmapCache.getPixmap(iconFileName)
@@ -249,7 +280,7 @@
 def getLexer(language, parent=None, pyname=""):
     """
     Module function to instantiate a lexer object for a given language.
-    
+
     @param language language of the lexer (string)
     @param parent reference to the parent object (QObject)
     @param pyname name of the pygments lexer to use (string)
@@ -259,121 +290,157 @@
         try:
             if language in ["Python", "Python3", "Cython", "MicroPython"]:
                 from .LexerPython import LexerPython
+
                 return LexerPython(language, parent)
             elif language == "C++":
                 from .LexerCPP import LexerCPP
+
                 return LexerCPP(
-                    parent,
-                    Preferences.getEditor("CppCaseInsensitiveKeywords"))
+                    parent, Preferences.getEditor("CppCaseInsensitiveKeywords")
+                )
             elif language == "C#":
                 from .LexerCSharp import LexerCSharp
+
                 return LexerCSharp(parent)
             elif language == "IDL":
                 from .LexerIDL import LexerIDL
+
                 return LexerIDL(parent)
             elif language == "Java":
                 from .LexerJava import LexerJava
+
                 return LexerJava(parent)
             elif language == "JavaScript":
                 from .LexerJavaScript import LexerJavaScript
+
                 return LexerJavaScript(parent)
             elif language == "SQL":
                 from .LexerSQL import LexerSQL
+
                 return LexerSQL(parent)
             elif language == "HTML":
                 from .LexerHTML import LexerHTML
+
                 return LexerHTML(parent)
             elif language == "Perl":
                 from .LexerPerl import LexerPerl
+
                 return LexerPerl(parent)
             elif language == "Bash":
                 from .LexerBash import LexerBash
+
                 return LexerBash(parent)
             elif language == "Ruby":
                 from .LexerRuby import LexerRuby
+
                 return LexerRuby(parent)
             elif language == "Lua":
                 from .LexerLua import LexerLua
+
                 return LexerLua(parent)
             elif language == "CSS":
                 from .LexerCSS import LexerCSS
+
                 return LexerCSS(parent)
             elif language == "TeX":
                 from .LexerTeX import LexerTeX
+
                 return LexerTeX(parent)
             elif language == "Diff":
                 from .LexerDiff import LexerDiff
+
                 return LexerDiff(parent)
             elif language == "Makefile":
                 from .LexerMakefile import LexerMakefile
+
                 return LexerMakefile(parent)
             elif language == "Properties":
                 from .LexerProperties import LexerProperties
+
                 return LexerProperties(parent)
             elif language == "Batch":
                 from .LexerBatch import LexerBatch
+
                 return LexerBatch(parent)
             elif language == "D":
                 from .LexerD import LexerD
+
                 return LexerD(parent)
             elif language == "Povray":
                 from .LexerPOV import LexerPOV
+
                 return LexerPOV(parent)
             elif language == "CMake":
                 from .LexerCMake import LexerCMake
+
                 return LexerCMake(parent)
             elif language == "VHDL":
                 from .LexerVHDL import LexerVHDL
+
                 return LexerVHDL(parent)
             elif language == "TCL":
                 from .LexerTCL import LexerTCL
+
                 return LexerTCL(parent)
             elif language == "Fortran":
                 from .LexerFortran import LexerFortran
+
                 return LexerFortran(parent)
             elif language == "Fortran77":
                 from .LexerFortran77 import LexerFortran77
+
                 return LexerFortran77(parent)
             elif language == "Pascal":
                 from .LexerPascal import LexerPascal
+
                 return LexerPascal(parent)
             elif language == "PostScript":
                 from .LexerPostScript import LexerPostScript
+
                 return LexerPostScript(parent)
             elif language == "XML":
                 from .LexerXML import LexerXML
+
                 return LexerXML(parent)
             elif language == "YAML":
                 from .LexerYAML import LexerYAML
+
                 return LexerYAML(parent)
             elif language == "Matlab":
                 from .LexerMatlab import LexerMatlab
+
                 return LexerMatlab(parent)
             elif language == "Octave":
                 from .LexerOctave import LexerOctave
+
                 return LexerOctave(parent)
             elif language == "QSS":
                 from .LexerQSS import LexerQSS
+
                 return LexerQSS(parent)
             elif language == "Gettext":
                 from .LexerPO import LexerPO
+
                 return LexerPO(parent)
             elif language == "CoffeeScript":
                 from .LexerCoffeeScript import LexerCoffeeScript
+
                 return LexerCoffeeScript(parent)
             elif language == "JSON":
                 from .LexerJSON import LexerJSON
+
                 return LexerJSON(parent)
             elif language == "Markdown":
                 from .LexerMarkdown import LexerMarkdown
+
                 return LexerMarkdown(parent)
-            
+
             elif language == "Protocol Buffer":
                 return __getPygmentsLexer(parent, name="Protocol Buffer")
-            
+
             elif language in LexerRegistry:
                 return LexerRegistry[language][2](parent)
-            
+
             else:
                 return __getPygmentsLexer(parent)
         except ImportError:
@@ -385,24 +452,24 @@
 def __getPygmentsLexer(parent, name=""):
     """
     Private module function to instantiate a pygments lexer.
-    
+
     @param parent reference to the parent widget
     @param name name of the pygments lexer to use (string)
     @return reference to the lexer (LexerPygments) or None
     """
     from .LexerPygments import LexerPygments
+
     lexer = LexerPygments(parent, name=name)
     if lexer.canStyle():
         return lexer
     else:
         return None
-    
+
 
-def getOpenFileFiltersList(includeAll=False, asString=False,
-                           withAdditional=True):
+def getOpenFileFiltersList(includeAll=False, asString=False, withAdditional=True):
     """
     Module function to get the file filter list for an open file operation.
-    
+
     @param includeAll flag indicating the inclusion of the
         All Files filter (boolean)
     @param asString flag indicating the list should be returned
@@ -412,167 +479,90 @@
     @return file filter list (list of strings or string)
     """
     openFileFiltersList = [
-        QCoreApplication.translate(
-            'Lexers',
-            'Python Files (*.py *.py3)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Python GUI Files (*.pyw *.pyw3)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Cython Files (*.pyx *.pxd *.pxi)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Quixote Template Files (*.ptl)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Ruby Files (*.rb)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'IDL Files (*.idl)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Protocol Buffer Files (*.proto)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'C Files (*.h *.c)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'C++ Files (*.h *.hpp *.hh *.cxx *.cpp *.cc)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'C# Files (*.cs)'),
+        QCoreApplication.translate("Lexers", "Python Files (*.py *.py3)"),
+        QCoreApplication.translate("Lexers", "Python GUI Files (*.pyw *.pyw3)"),
+        QCoreApplication.translate("Lexers", "Cython Files (*.pyx *.pxd *.pxi)"),
+        QCoreApplication.translate("Lexers", "Quixote Template Files (*.ptl)"),
+        QCoreApplication.translate("Lexers", "Ruby Files (*.rb)"),
+        QCoreApplication.translate("Lexers", "IDL Files (*.idl)"),
+        QCoreApplication.translate("Lexers", "Protocol Buffer Files (*.proto)"),
+        QCoreApplication.translate("Lexers", "C Files (*.h *.c)"),
         QCoreApplication.translate(
-            'Lexers',
-            'HTML Files (*.html *.htm *.asp *.shtml)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CSS Files (*.css)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'QSS Files (*.qss)'),
+            "Lexers", "C++ Files (*.h *.hpp *.hh *.cxx *.cpp *.cc)"
+        ),
+        QCoreApplication.translate("Lexers", "C# Files (*.cs)"),
+        QCoreApplication.translate("Lexers", "HTML Files (*.html *.htm *.asp *.shtml)"),
+        QCoreApplication.translate("Lexers", "CSS Files (*.css)"),
+        QCoreApplication.translate("Lexers", "QSS Files (*.qss)"),
         QCoreApplication.translate(
-            'Lexers',
-            'PHP Files (*.php *.php3 *.php4 *.php5 *.phtml)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'XML Files (*.xml *.xsl *.xslt *.dtd *.svg *.xul *.xsd)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Qt Resource Files (*.qrc)'),
+            "Lexers", "PHP Files (*.php *.php3 *.php4 *.php5 *.phtml)"
+        ),
         QCoreApplication.translate(
-            'Lexers',
-            'D Files (*.d *.di)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Java Files (*.java)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'JavaScript Files (*.js)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'SQL Files (*.sql)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Docbook Files (*.docbook)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Perl Files (*.pl *.pm *.ph)'),
+            "Lexers", "XML Files (*.xml *.xsl *.xslt *.dtd *.svg *.xul *.xsd)"
+        ),
+        QCoreApplication.translate("Lexers", "Qt Resource Files (*.qrc)"),
+        QCoreApplication.translate("Lexers", "D Files (*.d *.di)"),
+        QCoreApplication.translate("Lexers", "Java Files (*.java)"),
+        QCoreApplication.translate("Lexers", "JavaScript Files (*.js)"),
+        QCoreApplication.translate("Lexers", "SQL Files (*.sql)"),
+        QCoreApplication.translate("Lexers", "Docbook Files (*.docbook)"),
+        QCoreApplication.translate("Lexers", "Perl Files (*.pl *.pm *.ph)"),
+        QCoreApplication.translate("Lexers", "Lua Files (*.lua)"),
         QCoreApplication.translate(
-            'Lexers',
-            'Lua Files (*.lua)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Tex Files (*.tex *.sty *.aux *.toc *.idx)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Shell Files (*.sh)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Batch Files (*.bat *.cmd)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Diff Files (*.diff *.patch)'),
+            "Lexers", "Tex Files (*.tex *.sty *.aux *.toc *.idx)"
+        ),
+        QCoreApplication.translate("Lexers", "Shell Files (*.sh)"),
+        QCoreApplication.translate("Lexers", "Batch Files (*.bat *.cmd)"),
+        QCoreApplication.translate("Lexers", "Diff Files (*.diff *.patch)"),
+        QCoreApplication.translate("Lexers", "Makefiles (*makefile Makefile *.mak)"),
         QCoreApplication.translate(
-            'Lexers',
-            'Makefiles (*makefile Makefile *.mak)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Properties Files (*.properties *.ini *.inf *.reg *.cfg'
-            ' *.cnf *.rc)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Povray Files (*.pov)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CMake Files (CMakeLists.txt *.cmake *.ctest)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'VHDL Files (*.vhd *.vhdl)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'TCL/Tk Files (*.tcl *.tk)'),
+            "Lexers",
+            "Properties Files (*.properties *.ini *.inf *.reg *.cfg" " *.cnf *.rc)",
+        ),
+        QCoreApplication.translate("Lexers", "Povray Files (*.pov)"),
         QCoreApplication.translate(
-            'Lexers',
-            'Fortran Files (*.f90 *.f95 *.f2k)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Fortran77 Files (*.f *.for)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Pascal Files (*.dpr *.dpk *.pas *.dfm *.inc *.pp)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'PostScript Files (*.ps)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'YAML Files (*.yaml *.yml)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'TOML Files (*.toml)'),
+            "Lexers", "CMake Files (CMakeLists.txt *.cmake *.ctest)"
+        ),
+        QCoreApplication.translate("Lexers", "VHDL Files (*.vhd *.vhdl)"),
+        QCoreApplication.translate("Lexers", "TCL/Tk Files (*.tcl *.tk)"),
+        QCoreApplication.translate("Lexers", "Fortran Files (*.f90 *.f95 *.f2k)"),
+        QCoreApplication.translate("Lexers", "Fortran77 Files (*.f *.for)"),
         QCoreApplication.translate(
-            'Lexers',
-            'Matlab Files (*.m *.m.matlab)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Octave Files (*.m *.m.octave)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Gettext Files (*.po)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CoffeeScript Files (*.coffee)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'JSON Files (*.json)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Markdown Files (*.md)'),
+            "Lexers", "Pascal Files (*.dpr *.dpk *.pas *.dfm *.inc *.pp)"
+        ),
+        QCoreApplication.translate("Lexers", "PostScript Files (*.ps)"),
+        QCoreApplication.translate("Lexers", "YAML Files (*.yaml *.yml)"),
+        QCoreApplication.translate("Lexers", "TOML Files (*.toml)"),
+        QCoreApplication.translate("Lexers", "Matlab Files (*.m *.m.matlab)"),
+        QCoreApplication.translate("Lexers", "Octave Files (*.m *.m.octave)"),
+        QCoreApplication.translate("Lexers", "Gettext Files (*.po)"),
+        QCoreApplication.translate("Lexers", "CoffeeScript Files (*.coffee)"),
+        QCoreApplication.translate("Lexers", "JSON Files (*.json)"),
+        QCoreApplication.translate("Lexers", "Markdown Files (*.md)"),
     ]
-    
+
     for name in LexerRegistry:
         openFileFiltersList.extend(LexerRegistry[name][3])
-    
+
     if withAdditional:
-        openFileFiltersList.extend(
-            Preferences.getEditor("AdditionalOpenFilters"))
-    
+        openFileFiltersList.extend(Preferences.getEditor("AdditionalOpenFilters"))
+
     openFileFiltersList.sort()
     if includeAll:
         openFileFiltersList.append(
-            QCoreApplication.translate('Lexers', 'All Files (*)'))
-    
+            QCoreApplication.translate("Lexers", "All Files (*)")
+        )
+
     if asString:
-        return ';;'.join(openFileFiltersList)
+        return ";;".join(openFileFiltersList)
     else:
         return openFileFiltersList
 
 
-def getSaveFileFiltersList(includeAll=False, asString=False,
-                           withAdditional=True):
+def getSaveFileFiltersList(includeAll=False, asString=False, withAdditional=True):
     """
     Module function to get the file filter list for a save file operation.
-    
+
     @param includeAll flag indicating the inclusion of the
         All Files filter (boolean)
     @param asString flag indicating the list should be returned
@@ -582,194 +572,80 @@
     @return file filter list (list of strings or string)
     """
     saveFileFiltersList = [
-        QCoreApplication.translate(
-            'Lexers',
-            "Python3 Files (*.py)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Python3 GUI Files (*.pyw)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Cython Files (*.pyx)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Cython Declaration Files (*.pxd)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Cython Include Files (*.pxi)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Quixote Template Files (*.ptl)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Ruby Files (*.rb)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "IDL Files (*.idl)"),
-        QCoreApplication.translate(
-            'Lexers',
-            'Protocol Buffer Files (*.proto)'),
-        QCoreApplication.translate(
-            'Lexers',
-            "C Files (*.c)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "C++ Files (*.cpp)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "C++/C Header Files (*.h)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "C# Files (*.cs)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "HTML Files (*.html)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "PHP Files (*.php)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "ASP Files (*.asp)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "CSS Files (*.css)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "QSS Files (*.qss)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "XML Files (*.xml)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "XSL Files (*.xsl)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "DTD Files (*.dtd)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Qt Resource Files (*.qrc)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "D Files (*.d)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "D Interface Files (*.di)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Java Files (*.java)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "JavaScript Files (*.js)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "SQL Files (*.sql)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Docbook Files (*.docbook)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Perl Files (*.pl)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Perl Module Files (*.pm)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Lua Files (*.lua)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Shell Files (*.sh)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Batch Files (*.bat)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "TeX Files (*.tex)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "TeX Template Files (*.sty)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Diff Files (*.diff)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Make Files (*.mak)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Properties Files (*.ini)"),
-        QCoreApplication.translate(
-            'Lexers',
-            "Configuration Files (*.cfg)"),
-        QCoreApplication.translate(
-            'Lexers',
-            'Povray Files (*.pov)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CMake Files (CMakeLists.txt)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CMake Macro Files (*.cmake)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'VHDL Files (*.vhd)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'TCL Files (*.tcl)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Tk Files (*.tk)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Fortran Files (*.f95)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Fortran77 Files (*.f)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Pascal Files (*.pas)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'PostScript Files (*.ps)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'YAML Files (*.yml)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'TOML Files (*.toml)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Matlab Files (*.m)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Octave Files (*.m.octave)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Gettext Files (*.po)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'CoffeeScript Files (*.coffee)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'JSON Files (*.json)'),
-        QCoreApplication.translate(
-            'Lexers',
-            'Markdown Files (*.md)'),
+        QCoreApplication.translate("Lexers", "Python3 Files (*.py)"),
+        QCoreApplication.translate("Lexers", "Python3 GUI Files (*.pyw)"),
+        QCoreApplication.translate("Lexers", "Cython Files (*.pyx)"),
+        QCoreApplication.translate("Lexers", "Cython Declaration Files (*.pxd)"),
+        QCoreApplication.translate("Lexers", "Cython Include Files (*.pxi)"),
+        QCoreApplication.translate("Lexers", "Quixote Template Files (*.ptl)"),
+        QCoreApplication.translate("Lexers", "Ruby Files (*.rb)"),
+        QCoreApplication.translate("Lexers", "IDL Files (*.idl)"),
+        QCoreApplication.translate("Lexers", "Protocol Buffer Files (*.proto)"),
+        QCoreApplication.translate("Lexers", "C Files (*.c)"),
+        QCoreApplication.translate("Lexers", "C++ Files (*.cpp)"),
+        QCoreApplication.translate("Lexers", "C++/C Header Files (*.h)"),
+        QCoreApplication.translate("Lexers", "C# Files (*.cs)"),
+        QCoreApplication.translate("Lexers", "HTML Files (*.html)"),
+        QCoreApplication.translate("Lexers", "PHP Files (*.php)"),
+        QCoreApplication.translate("Lexers", "ASP Files (*.asp)"),
+        QCoreApplication.translate("Lexers", "CSS Files (*.css)"),
+        QCoreApplication.translate("Lexers", "QSS Files (*.qss)"),
+        QCoreApplication.translate("Lexers", "XML Files (*.xml)"),
+        QCoreApplication.translate("Lexers", "XSL Files (*.xsl)"),
+        QCoreApplication.translate("Lexers", "DTD Files (*.dtd)"),
+        QCoreApplication.translate("Lexers", "Qt Resource Files (*.qrc)"),
+        QCoreApplication.translate("Lexers", "D Files (*.d)"),
+        QCoreApplication.translate("Lexers", "D Interface Files (*.di)"),
+        QCoreApplication.translate("Lexers", "Java Files (*.java)"),
+        QCoreApplication.translate("Lexers", "JavaScript Files (*.js)"),
+        QCoreApplication.translate("Lexers", "SQL Files (*.sql)"),
+        QCoreApplication.translate("Lexers", "Docbook Files (*.docbook)"),
+        QCoreApplication.translate("Lexers", "Perl Files (*.pl)"),
+        QCoreApplication.translate("Lexers", "Perl Module Files (*.pm)"),
+        QCoreApplication.translate("Lexers", "Lua Files (*.lua)"),
+        QCoreApplication.translate("Lexers", "Shell Files (*.sh)"),
+        QCoreApplication.translate("Lexers", "Batch Files (*.bat)"),
+        QCoreApplication.translate("Lexers", "TeX Files (*.tex)"),
+        QCoreApplication.translate("Lexers", "TeX Template Files (*.sty)"),
+        QCoreApplication.translate("Lexers", "Diff Files (*.diff)"),
+        QCoreApplication.translate("Lexers", "Make Files (*.mak)"),
+        QCoreApplication.translate("Lexers", "Properties Files (*.ini)"),
+        QCoreApplication.translate("Lexers", "Configuration Files (*.cfg)"),
+        QCoreApplication.translate("Lexers", "Povray Files (*.pov)"),
+        QCoreApplication.translate("Lexers", "CMake Files (CMakeLists.txt)"),
+        QCoreApplication.translate("Lexers", "CMake Macro Files (*.cmake)"),
+        QCoreApplication.translate("Lexers", "VHDL Files (*.vhd)"),
+        QCoreApplication.translate("Lexers", "TCL Files (*.tcl)"),
+        QCoreApplication.translate("Lexers", "Tk Files (*.tk)"),
+        QCoreApplication.translate("Lexers", "Fortran Files (*.f95)"),
+        QCoreApplication.translate("Lexers", "Fortran77 Files (*.f)"),
+        QCoreApplication.translate("Lexers", "Pascal Files (*.pas)"),
+        QCoreApplication.translate("Lexers", "PostScript Files (*.ps)"),
+        QCoreApplication.translate("Lexers", "YAML Files (*.yml)"),
+        QCoreApplication.translate("Lexers", "TOML Files (*.toml)"),
+        QCoreApplication.translate("Lexers", "Matlab Files (*.m)"),
+        QCoreApplication.translate("Lexers", "Octave Files (*.m.octave)"),
+        QCoreApplication.translate("Lexers", "Gettext Files (*.po)"),
+        QCoreApplication.translate("Lexers", "CoffeeScript Files (*.coffee)"),
+        QCoreApplication.translate("Lexers", "JSON Files (*.json)"),
+        QCoreApplication.translate("Lexers", "Markdown Files (*.md)"),
     ]
-    
+
     for name in LexerRegistry:
         saveFileFiltersList.extend(LexerRegistry[name][4])
-    
+
     if withAdditional:
-        saveFileFiltersList.extend(
-            Preferences.getEditor("AdditionalSaveFilters"))
-    
+        saveFileFiltersList.extend(Preferences.getEditor("AdditionalSaveFilters"))
+
     saveFileFiltersList.sort()
-    
+
     if includeAll:
         saveFileFiltersList.append(
-            QCoreApplication.translate('Lexers', 'All Files (*)'))
-    
+            QCoreApplication.translate("Lexers", "All Files (*)")
+        )
+
     if asString:
-        return ';;'.join(saveFileFiltersList)
+        return ";;".join(saveFileFiltersList)
     else:
         return saveFileFiltersList
 
@@ -777,58 +653,58 @@
 def getDefaultLexerAssociations():
     """
     Module function to get a dictionary with the default associations.
-    
+
     @return dictionary with the default lexer associations
     """
     assocs = {
-        '*.sh': "Bash",
-        '*.bash': "Bash",
+        "*.sh": "Bash",
+        "*.bash": "Bash",
         "*.bat": "Batch",
         "*.cmd": "Batch",
-        '*.cpp': "C++",
-        '*.cxx': "C++",
-        '*.cc': "C++",
-        '*.c': "C++",
-        '*.hpp': "C++",
-        '*.hh': "C++",
-        '*.h': "C++",
-        '*.cs': "C#",
-        'CMakeLists.txt': "CMake",
-        '*.cmake': "CMake",
-        '*.cmake.in': "CMake",
-        '*.ctest': "CMake",
-        '*.ctest.in': "CMake",
-        '*.css': "CSS",
-        '*.qss': "QSS",
+        "*.cpp": "C++",
+        "*.cxx": "C++",
+        "*.cc": "C++",
+        "*.c": "C++",
+        "*.hpp": "C++",
+        "*.hh": "C++",
+        "*.h": "C++",
+        "*.cs": "C#",
+        "CMakeLists.txt": "CMake",
+        "*.cmake": "CMake",
+        "*.cmake.in": "CMake",
+        "*.ctest": "CMake",
+        "*.ctest.in": "CMake",
+        "*.css": "CSS",
+        "*.qss": "QSS",
         "*.d": "D",
         "*.di": "D",
         "*.diff": "Diff",
         "*.patch": "Diff",
-        '*.html': "HTML",
-        '*.htm': "HTML",
-        '*.asp': "HTML",
-        '*.shtml': "HTML",
-        '*.php': "HTML",
-        '*.php3': "HTML",
-        '*.php4': "HTML",
-        '*.php5': "HTML",
-        '*.phtml': "HTML",
-        '*.docbook': "HTML",
-        '*.ui': "HTML",
-        '*.ts': "HTML",
-        '*.qrc': "HTML",
-        '*.kid': "HTML",
-        '*.idl': "IDL",
-        '*.java': "Java",
-        '*.js': "JavaScript",
-        '*.lua': "Lua",
+        "*.html": "HTML",
+        "*.htm": "HTML",
+        "*.asp": "HTML",
+        "*.shtml": "HTML",
+        "*.php": "HTML",
+        "*.php3": "HTML",
+        "*.php4": "HTML",
+        "*.php5": "HTML",
+        "*.phtml": "HTML",
+        "*.docbook": "HTML",
+        "*.ui": "HTML",
+        "*.ts": "HTML",
+        "*.qrc": "HTML",
+        "*.kid": "HTML",
+        "*.idl": "IDL",
+        "*.java": "Java",
+        "*.js": "JavaScript",
+        "*.lua": "Lua",
         "*makefile": "Makefile",
         "Makefile*": "Makefile",
         "*.mak": "Makefile",
-        '*.pl': "Perl",
-        '*.pm': "Perl",
-        '*.ph': "Perl",
-        '*.pov': "Povray",
+        "*.pl": "Perl",
+        "*.pm": "Perl",
+        "*.ph": "Perl",
+        "*.pov": "Povray",
         "*.properties": "Properties",
         "*.ini": "Properties",
         "*.inf": "Properties",
@@ -836,24 +712,24 @@
         "*.cfg": "Properties",
         "*.cnf": "Properties",
         "*.rc": "Properties",
-        '*.py': "Python",
-        '*.pyw': "Python",
-        '*.py3': "Python",
-        '*.pyw3': "Python",
-        '*.pyx': "Cython",
-        '*.pxd': "Cython",
-        '*.pxi': "Cython",
-        '*.ptl': "Python",
-        '*.rb': "Ruby",
-        '*.rbw': "Ruby",
-        '*.sql': "SQL",
+        "*.py": "Python",
+        "*.pyw": "Python",
+        "*.py3": "Python",
+        "*.pyw3": "Python",
+        "*.pyx": "Cython",
+        "*.pxd": "Cython",
+        "*.pxi": "Cython",
+        "*.ptl": "Python",
+        "*.rb": "Ruby",
+        "*.rbw": "Ruby",
+        "*.sql": "SQL",
         "*.tex": "TeX",
         "*.sty": "TeX",
         "*.aux": "TeX",
         "*.toc": "TeX",
         "*.idx": "TeX",
-        '*.vhd': "VHDL",
-        '*.vhdl': "VHDL",
+        "*.vhd": "VHDL",
+        "*.vhdl": "VHDL",
         "*.tcl": "TCL",
         "*.tk": "TCL",
         "*.f": "Fortran77",
@@ -878,55 +754,54 @@
         "*.xul": "XML",
         "*.yaml": "YAML",
         "*.yml": "YAML",
-        '*.m': "Matlab",
-        '*.m.matlab': "Matlab",
-        '*.m.octave': "Octave",
-        '*.e4c': "XML",
-        '*.e4d': "XML",
-        '*.e4k': "XML",
-        '*.e4m': "XML",
-        '*.e4p': "XML",
-        '*.e4q': "XML",
-        '*.e4s': "XML",
-        '*.e4t': "XML",
-        '*.e5d': "XML",
-        '*.e5k': "XML",
-        '*.e5m': "XML",
-        '*.e5p': "XML",
-        '*.e5q': "XML",
-        '*.e5s': "XML",
-        '*.e5t': "XML",
-        '*.e6d': "XML",
-        '*.e6k': "XML",
-        '*.e6m': "XML",
-        '*.e6p': "XML",
-        '*.e6q': "XML",
-        '*.e6s': "XML",
-        '*.e6t': "XML",
-        '*.ecj': "JSON",
-        '*.edj': "JSON",
-        '*.egj': "JSON",
-        '*.ehj': "JSON",
-        '*.ekj': "JSON",
-        '*.emj': "JSON",
-        '*.epj': "JSON",
-        '*.eqj': "JSON",
-        '*.esj': "JSON",
-        '*.etj': "JSON",
-        '*.ethj': "JSON",
-        '*.proto': "Protocol Buffer",
-        '*.po': "Gettext",
-        '*.coffee': "CoffeeScript",
-        '*.json': "JSON",
-        '*.md': "Markdown",
-        
-        '*.toml': "Pygments|TOML",
-        'Pipfile': "Pygments|TOML",
-        'poetry.lock': "Pygments|TOML",
+        "*.m": "Matlab",
+        "*.m.matlab": "Matlab",
+        "*.m.octave": "Octave",
+        "*.e4c": "XML",
+        "*.e4d": "XML",
+        "*.e4k": "XML",
+        "*.e4m": "XML",
+        "*.e4p": "XML",
+        "*.e4q": "XML",
+        "*.e4s": "XML",
+        "*.e4t": "XML",
+        "*.e5d": "XML",
+        "*.e5k": "XML",
+        "*.e5m": "XML",
+        "*.e5p": "XML",
+        "*.e5q": "XML",
+        "*.e5s": "XML",
+        "*.e5t": "XML",
+        "*.e6d": "XML",
+        "*.e6k": "XML",
+        "*.e6m": "XML",
+        "*.e6p": "XML",
+        "*.e6q": "XML",
+        "*.e6s": "XML",
+        "*.e6t": "XML",
+        "*.ecj": "JSON",
+        "*.edj": "JSON",
+        "*.egj": "JSON",
+        "*.ehj": "JSON",
+        "*.ekj": "JSON",
+        "*.emj": "JSON",
+        "*.epj": "JSON",
+        "*.eqj": "JSON",
+        "*.esj": "JSON",
+        "*.etj": "JSON",
+        "*.ethj": "JSON",
+        "*.proto": "Protocol Buffer",
+        "*.po": "Gettext",
+        "*.coffee": "CoffeeScript",
+        "*.json": "JSON",
+        "*.md": "Markdown",
+        "*.toml": "Pygments|TOML",
+        "Pipfile": "Pygments|TOML",
+        "poetry.lock": "Pygments|TOML",
     }
-    
+
     for name in LexerRegistry:
         for pattern in LexerRegistry[name][5]:
             assocs[pattern] = name
-    
+
     return assocs
--- a/src/eric7/QScintilla/MarkupProviders/HtmlProvider.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/HtmlProvider.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,88 +17,89 @@
     """
     Class implementing the HTML markup provider.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def kind(self):
         """
         Public method to get the markup kind.
-        
+
         @return string with markup kind
         @rtype str
         """
         return "html"
-    
+
     def hasBold(self):
         """
         Public method to indicate the availability of bold markup.
-        
+
         @return flag indicating the availability of bold markup
         @rtype bool
         """
         return True
-    
+
     def bold(self, editor):
         """
         Public method to generate bold text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("b", editor)
-    
+
     def hasItalic(self):
         """
         Public method to indicate the availability of italic markup.
-        
+
         @return flag indicating the availability of italic markup
         @rtype bool
         """
         return True
-    
+
     def italic(self, editor):
         """
         Public method to generate italic text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("i", editor)
-    
+
     def hasStrikethrough(self):
         """
         Public method to indicate the availability of strikethrough markup.
-        
+
         @return flag indicating the availability of strikethrough markup
         @rtype bool
         """
         return True
-    
+
     def strikethrough(self, editor):
         """
         Public method to generate strikethrough text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("del", editor)
-    
+
     def headerLevels(self):
         """
         Public method to determine the available header levels.
-        
+
         @return supported header levels
         @rtype int
         """
         return 6
-    
+
     def header(self, editor, level):
         """
         Public method to generate a header.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param level header level
@@ -106,65 +107,65 @@
         """
         if level <= 6:
             self.__insertMarkup("h{0}".format(level), editor)
-    
+
     def hasCode(self):
         """
         Public method to indicate the availability of inline code markup.
-        
+
         @return flag indicating the availability of inline code markup
         @rtype bool
         """
         return True
-    
+
     def code(self, editor):
         """
         Public method to generate inline code text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("code", editor)
-    
+
     def hasCodeBlock(self):
         """
         Public method to indicate the availability of code block markup.
-        
+
         @return flag indicating the availability of code block markup
         @rtype bool
         """
         return True
-    
+
     def codeBlock(self, editor):
         """
         Public method to generate code block text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
             newText = "<pre><code>{0}{1}</code></pre>{0}".format(
-                lineSeparator, editor.selectedText())
+                lineSeparator, editor.selectedText()
+            )
             editor.replaceSelectedText(newText)
         else:
-            editor.insert("<pre><code>{0}{0}</code></pre>{0}".format(
-                lineSeparator))
+            editor.insert("<pre><code>{0}{0}</code></pre>{0}".format(lineSeparator))
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline + 1, 0)
         editor.endUndoAction()
-    
+
     def __insertMarkup(self, markup, editor, addEol=False):
         """
         Private method to insert the specified markup.
-        
+
         If the editor has selected text, this text is enclosed by the given
         markup. If no text is selected, the markup is inserted at the cursor
         position and the cursor is positioned in between.
-        
+
         @param markup markup string to be inserted
         @type str
         @param editor reference to the editor to work on
@@ -174,12 +175,13 @@
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator() if addEol else ""
         editor.beginUndoAction()
         if editor.hasSelectedText():
             newText = "<{0}>{2}{1}</{0}>{2}".format(
-                markup, editor.selectedText(), lineSeparator)
+                markup, editor.selectedText(), lineSeparator
+            )
             editor.replaceSelectedText(newText)
         else:
             editor.insert("<{0}>{1}{1}</{0}>{1}".format(markup, lineSeparator))
@@ -189,171 +191,169 @@
             else:
                 editor.setCursorPosition(cline, cindex + len(markup) + 2)
         editor.endUndoAction()
-    
+
     def hasHyperlink(self):
         """
         Public method to indicate the availability of hyperlink markup.
-        
+
         @return flag indicating the availability of hyperlink markup
         @rtype bool
         """
         return True
-    
+
     def hyperlink(self, editor):
         """
         Public method to generate hyperlink text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .HyperlinkMarkupDialog import HyperlinkMarkupDialog
+
         dlg = HyperlinkMarkupDialog(True, False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             text, target, title = dlg.getData()
             if not text:
                 text = target
-            
+
             if title:
-                link = '<a href="{0}" title="{2}">{1}</a>'.format(
-                    target, text, title)
+                link = '<a href="{0}" title="{2}">{1}</a>'.format(target, text, title)
             else:
                 link = '<a href="{0}">{1}</a>'.format(target, text)
-            
+
             editor.beginUndoAction()
             cline, cindex = editor.getCursorPosition()
             editor.insert(link)
             editor.setCursorPosition(cline, cindex + len(link))
             editor.endUndoAction()
-    
+
     def hasLine(self):
         """
         Public method to indicate the availability of a horizontal line markup.
-        
+
         @return flag indicating the availability of a horizontal line markup
         @rtype bool
         """
         return True
-    
+
     def line(self, editor):
         """
         Public method to generate a horizontal line text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         editor.beginUndoAction()
         markup = "<hr />"
         editor.insert(markup)
         cline, cindex = editor.getCursorPosition()
         editor.setCursorPosition(cline, cindex + len(markup))
         editor.endUndoAction()
-    
+
     def hasQuote(self):
         """
         Public method to indicate the availability of block quote markup.
-        
+
         @return flag indicating the availability of block quote markup
         @rtype bool
         """
         return True
-    
+
     def quote(self, editor):
         """
         Public method to generate block quote text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("blockquote", editor, True)
-    
+
     def hasImage(self):
         """
         Public method to indicate the availability of image markup.
-        
+
         @return flag indicating the availability of image markup
         @rtype bool
         """
         return True
-    
+
     def image(self, editor):
         """
         Public method to generate image text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .ImageMarkupDialog import ImageMarkupDialog
+
         dlg = ImageMarkupDialog(ImageMarkupDialog.HtmlMode)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            address, altText, title, originalSize, width, height = (
-                dlg.getData()
-            )
-            
+            address, altText, title, originalSize, width, height = dlg.getData()
+
             markup = '<img src="{0}"'.format(address)
             if altText:
                 markup = '{0} alt="{1}"'.format(markup, altText)
             if title:
                 markup = '{0} title="{1}"'.format(markup, title)
             if not originalSize:
-                markup = '{0} width="{1}" height="{2}"'.format(
-                    markup, width, height)
-            markup = '{0} />'.format(markup)
-            
+                markup = '{0} width="{1}" height="{2}"'.format(markup, width, height)
+            markup = "{0} />".format(markup)
+
             editor.beginUndoAction()
             editor.insert(markup)
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline, cindex + len(markup))
             editor.endUndoAction()
-    
+
     def hasBulletedList(self):
         """
         Public method to indicate the availability of bulleted list markup.
-        
+
         @return flag indicating the availability of bulleted list markup
         @rtype bool
         """
         return True
-    
+
     def bulletedList(self, editor):
         """
         Public method to generate bulleted list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, "ul")
-    
+
     def hasNumberedList(self):
         """
         Public method to indicate the availability of numbered list markup.
-        
+
         @return flag indicating the availability of numbered list markup
         @rtype bool
         """
         return True
-    
+
     def numberedList(self, editor):
         """
         Public method to generate numbered list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, "ol")
-    
+
     def __makeList(self, editor, listType):
         """
         Private method to generate the desired list markup.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param listType type of the desired list (should be ul or ol)
@@ -361,13 +361,11 @@
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
-            startLine, startIndex, endLine, endIndex = (
-                editor.getSelection()
-            )
+            startLine, startIndex, endLine, endIndex = editor.getSelection()
             if endIndex == 0:
                 endLine -= 1
             for line in range(startLine, endLine + 1):
@@ -375,28 +373,29 @@
                 editor.insertAt("  <li>", line, 0)
             if line == editor.lines() - 1:
                 editor.insertAt(lineSeparator, line, 1000)
-            editor.insertAt("</{1}>{0}".format(lineSeparator, listType),
-                            endLine + 1, 0)
-            editor.insertAt("<{1}>{0}".format(lineSeparator, listType),
-                            startLine, 0)
+            editor.insertAt("</{1}>{0}".format(lineSeparator, listType), endLine + 1, 0)
+            editor.insertAt("<{1}>{0}".format(lineSeparator, listType), startLine, 0)
             editor.setCursorPosition(endLine + 3, 0)
         else:
             listElements, ok = QInputDialog.getInt(
                 None,
-                QCoreApplication.translate(
-                    "HtmlProvider", "Create List"),
+                QCoreApplication.translate("HtmlProvider", "Create List"),
                 QCoreApplication.translate(
-                    "HtmlProvider", "Enter desired number of list elements:"),
-                0, 0, 99, 1)
+                    "HtmlProvider", "Enter desired number of list elements:"
+                ),
+                0,
+                0,
+                99,
+                1,
+            )
             if ok:
                 if listElements == 0:
                     listElements = 1
                 cline, cindex = editor.getCursorPosition()
-                listBody = (
-                    listElements * "  <li></li>{0}".format(lineSeparator)
+                listBody = listElements * "  <li></li>{0}".format(lineSeparator)
+                markup = "<{1}>{0}{2}</{1}>{0}".format(
+                    lineSeparator, listType, listBody
                 )
-                markup = "<{1}>{0}{2}</{1}>{0}".format(
-                    lineSeparator, listType, listBody)
                 if cindex == 0:
                     editor.insertAt(markup, cline, cindex)
                     editor.setCursorPosition(cline + 1, 6)
--- a/src/eric7/QScintilla/MarkupProviders/HyperlinkMarkupDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/HyperlinkMarkupDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,11 +17,11 @@
     """
     Class implementing a dialog to enter data to insert a hyperlink.
     """
-    def __init__(self, textMayBeEmpty, targetMayBeEmpty, noTitle=False,
-                 parent=None):
+
+    def __init__(self, textMayBeEmpty, targetMayBeEmpty, noTitle=False, parent=None):
         """
         Constructor
-        
+
         @param textMayBeEmpty flag indicating, that the link text may
             be empty
         @type bool
@@ -35,56 +35,52 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__allowEmptyText = textMayBeEmpty
         self.__allowEmptyTarget = targetMayBeEmpty
-        
+
         self.titelEdit.setEnabled(not noTitle)
-        
+
         self.__updateOkButton()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOkButton(self):
         """
         Private method to update the state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            (bool(self.textEdit.text()) or self.__allowEmptyText) and
-            (bool(self.targetEdit.text()) or self.__allowEmptyTarget)
+            (bool(self.textEdit.text()) or self.__allowEmptyText)
+            and (bool(self.targetEdit.text()) or self.__allowEmptyTarget)
         )
-    
+
     @pyqtSlot(str)
     def on_textEdit_textChanged(self, txt):
         """
         Private slot handling a change of the link text.
-        
+
         @param txt link text
         @type str
         """
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_targetEdit_textChanged(self, txt):
         """
         Private slot handling a change of the link target.
-        
+
         @param txt link target
         @type str
         """
         self.__updateOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the link text, link target and the optional
             link title
         @rtype tuple of (str, str, str)
         """
-        return (
-            self.textEdit.text(),
-            self.targetEdit.text(),
-            self.titelEdit.text()
-        )
+        return (self.textEdit.text(), self.targetEdit.text(), self.titelEdit.text())
--- a/src/eric7/QScintilla/MarkupProviders/ImageMarkupDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/ImageMarkupDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,14 +22,15 @@
     """
     Class implementing a dialog to enter data for an image markup.
     """
+
     HtmlMode = 0
     MarkDownMode = 1
     RestMode = 2
-    
+
     def __init__(self, mode, parent=None):
         """
         Constructor
-        
+
         @param mode mode of the dialog
         @type int
         @param parent reference to the parent widget
@@ -37,7 +38,7 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if mode == ImageMarkupDialog.MarkDownMode:
             self.sizeCheckBox.setEnabled(False)
             self.aspectRatioCheckBox.setEnabled(False)
@@ -45,39 +46,38 @@
             self.heightSpinBox.setEnabled(False)
         elif mode == ImageMarkupDialog.RestMode:
             self.titleEdit.setEnabled(False)
-        
+
         self.__mode = mode
         self.__originalImageSize = QSize()
-    
+
         filters = {
-            'bmp': self.tr("Windows Bitmap File (*.bmp)"),
-            'cur': self.tr("Windows Cursor File (*.cur)"),
-            'dds': self.tr("DirectDraw-Surface File (*.dds)"),
-            'gif': self.tr("Graphic Interchange Format File (*.gif)"),
-            'icns': self.tr("Apple Icon File (*.icns)"),
-            'ico': self.tr("Windows Icon File (*.ico)"),
-            'jp2': self.tr("JPEG2000 File (*.jp2)"),
-            'jpg': self.tr("JPEG File (*.jpg)"),
-            'jpeg': self.tr("JPEG File (*.jpeg)"),
-            'mng': self.tr("Multiple-Image Network Graphics File (*.mng)"),
-            'pbm': self.tr("Portable Bitmap File (*.pbm)"),
-            'pcx': self.tr("Paintbrush Bitmap File (*.pcx)"),
-            'pgm': self.tr("Portable Graymap File (*.pgm)"),
-            'png': self.tr("Portable Network Graphics File (*.png)"),
-            'ppm': self.tr("Portable Pixmap File (*.ppm)"),
-            'sgi': self.tr("Silicon Graphics Image File (*.sgi)"),
-            'svg': self.tr("Scalable Vector Graphics File (*.svg)"),
-            'svgz': self.tr("Compressed Scalable Vector Graphics File"
-                            " (*.svgz)"),
-            'tga': self.tr("Targa Graphic File (*.tga)"),
-            'tif': self.tr("TIFF File (*.tif)"),
-            'tiff': self.tr("TIFF File (*.tiff)"),
-            'wbmp': self.tr("WAP Bitmap File (*.wbmp)"),
-            'webp': self.tr("WebP Image File (*.webp)"),
-            'xbm': self.tr("X11 Bitmap File (*.xbm)"),
-            'xpm': self.tr("X11 Pixmap File (*.xpm)"),
+            "bmp": self.tr("Windows Bitmap File (*.bmp)"),
+            "cur": self.tr("Windows Cursor File (*.cur)"),
+            "dds": self.tr("DirectDraw-Surface File (*.dds)"),
+            "gif": self.tr("Graphic Interchange Format File (*.gif)"),
+            "icns": self.tr("Apple Icon File (*.icns)"),
+            "ico": self.tr("Windows Icon File (*.ico)"),
+            "jp2": self.tr("JPEG2000 File (*.jp2)"),
+            "jpg": self.tr("JPEG File (*.jpg)"),
+            "jpeg": self.tr("JPEG File (*.jpeg)"),
+            "mng": self.tr("Multiple-Image Network Graphics File (*.mng)"),
+            "pbm": self.tr("Portable Bitmap File (*.pbm)"),
+            "pcx": self.tr("Paintbrush Bitmap File (*.pcx)"),
+            "pgm": self.tr("Portable Graymap File (*.pgm)"),
+            "png": self.tr("Portable Network Graphics File (*.png)"),
+            "ppm": self.tr("Portable Pixmap File (*.ppm)"),
+            "sgi": self.tr("Silicon Graphics Image File (*.sgi)"),
+            "svg": self.tr("Scalable Vector Graphics File (*.svg)"),
+            "svgz": self.tr("Compressed Scalable Vector Graphics File" " (*.svgz)"),
+            "tga": self.tr("Targa Graphic File (*.tga)"),
+            "tif": self.tr("TIFF File (*.tif)"),
+            "tiff": self.tr("TIFF File (*.tiff)"),
+            "wbmp": self.tr("WAP Bitmap File (*.wbmp)"),
+            "webp": self.tr("WebP Image File (*.webp)"),
+            "xbm": self.tr("X11 Bitmap File (*.xbm)"),
+            "xpm": self.tr("X11 Pixmap File (*.xpm)"),
         }
-        
+
         inputFormats = []
         readFormats = QImageReader.supportedImageFormats()
         for readFormat in readFormats:
@@ -88,17 +88,17 @@
         if filters["png"] in inputFormats:
             inputFormats.remove(filters["png"])
             inputFormats.insert(0, filters["png"])
-        self.imagePicker.setFilters(';;'.join(inputFormats))
+        self.imagePicker.setFilters(";;".join(inputFormats))
         self.imagePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.sizeCheckBox.setChecked(True)
         self.aspectRatioCheckBox.setChecked(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.__updateOkButton()
-    
+
     def __updateOkButton(self):
         """
         Private slot to set the state of the OK button.
@@ -106,15 +106,14 @@
         enable = bool(self.imagePicker.text())
         if self.__mode == ImageMarkupDialog.MarkDownMode:
             enable = enable and bool(self.altTextEdit.text())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_imagePicker_textChanged(self, address):
         """
         Private slot handling changes of the image path.
-        
+
         @param address image address (URL or local path)
         @type str
         """
@@ -131,22 +130,22 @@
                 self.heightSpinBox.setValue(image.height())
                 self.__originalImageSize = image.size()
                 self.__aspectRatio = (
-                    float(self.__originalImageSize.height()) /
-                    self.__originalImageSize.width()
+                    float(self.__originalImageSize.height())
+                    / self.__originalImageSize.width()
                 )
         else:
             self.widthSpinBox.setValue(0)
             self.heightSpinBox.setValue(0)
             self.__originalImageSize = QSize()
             self.__aspectRatio = 1
-        
+
         self.__updateOkButton()
-    
+
     @pyqtSlot(str)
     def on_altTextEdit_textChanged(self, txt):
         """
         Private slot handling changes of the alternative text.
-        
+
         @param txt alternative text
         @type str
         """
@@ -156,60 +155,54 @@
     def on_sizeCheckBox_toggled(self, checked):
         """
         Private slot to reset the width and height spin boxes.
-        
+
         @param checked flag indicating the state of the check box
         @type bool
         """
         if checked:
             self.widthSpinBox.setValue(self.__originalImageSize.width())
             self.heightSpinBox.setValue(self.__originalImageSize.height())
-    
+
     @pyqtSlot(bool)
     def on_aspectRatioCheckBox_toggled(self, checked):
         """
         Private slot to adjust the height to match the original aspect ratio.
-        
+
         @param checked flag indicating the state of the check box
         @type bool
         """
         if checked and self.__originalImageSize.isValid():
             height = self.widthSpinBox.value() * self.__aspectRatio
             self.heightSpinBox.setValue(height)
-    
+
     @pyqtSlot(int)
     def on_widthSpinBox_valueChanged(self, width):
         """
         Private slot to adjust the height spin box.
-        
+
         @param width width for the image
         @type int
         """
-        if (
-            self.aspectRatioCheckBox.isChecked() and
-            self.widthSpinBox.hasFocus()
-        ):
+        if self.aspectRatioCheckBox.isChecked() and self.widthSpinBox.hasFocus():
             height = width * self.__aspectRatio
             self.heightSpinBox.setValue(height)
-    
+
     @pyqtSlot(int)
     def on_heightSpinBox_valueChanged(self, height):
         """
         Private slot to adjust the width spin box.
-        
+
         @param height height for the image
         @type int
         """
-        if (
-            self.aspectRatioCheckBox.isChecked() and
-            self.heightSpinBox.hasFocus()
-        ):
+        if self.aspectRatioCheckBox.isChecked() and self.heightSpinBox.hasFocus():
             width = height / self.__aspectRatio
             self.widthSpinBox.setValue(width)
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return tuple containing the image address, alternative text,
             title text, flag to keep the original size, width and height
         @rtype tuple of (str, str, str, bool, int, int)
--- a/src/eric7/QScintilla/MarkupProviders/MarkdownProvider.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/MarkdownProvider.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,88 +17,89 @@
     """
     Class implementing the Markdown markup provider.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def kind(self):
         """
         Public method to get the markup kind.
-        
+
         @return string with markup kind
         @rtype str
         """
         return "markdown"
-    
+
     def hasBold(self):
         """
         Public method to indicate the availability of bold markup.
-        
+
         @return flag indicating the availability of bold markup
         @rtype bool
         """
         return True
-    
+
     def bold(self, editor):
         """
         Public method to generate bold text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("**", editor)
-    
+
     def hasItalic(self):
         """
         Public method to indicate the availability of italic markup.
-        
+
         @return flag indicating the availability of italic markup
         @rtype bool
         """
         return True
-    
+
     def italic(self, editor):
         """
         Public method to generate italic text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("_", editor)
-    
+
     def hasStrikethrough(self):
         """
         Public method to indicate the availability of strikethrough markup.
-        
+
         @return flag indicating the availability of strikethrough markup
         @rtype bool
         """
         return True
-    
+
     def strikethrough(self, editor):
         """
         Public method to generate strikethrough text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("~~", editor)
-    
+
     def headerLevels(self):
         """
         Public method to determine the available header levels.
-        
+
         @return supported header levels
         @rtype int
         """
         return 6
-    
+
     def header(self, editor, level):
         """
         Public method to generate a header.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param level header level
@@ -106,70 +107,69 @@
         """
         if editor is None or level > self.headerLevels():
             return
-        
+
         editor.beginUndoAction()
         cline, cindex = editor.getCursorPosition()
         editor.insertAt(level * "#" + " ", cline, 0)
         editor.setCursorPosition(cline, level + 1)
         editor.endUndoAction()
-    
+
     def hasCode(self):
         """
         Public method to indicate the availability of inline code markup.
-        
+
         @return flag indicating the availability of inline code markup
         @rtype bool
         """
         return True
-    
+
     def code(self, editor):
         """
         Public method to generate inline code text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("`", editor)
-    
+
     def hasCodeBlock(self):
         """
         Public method to indicate the availability of code block markup.
-        
+
         @return flag indicating the availability of code block markup
         @rtype bool
         """
         return True
-    
+
     def codeBlock(self, editor):
         """
         Public method to generate code block text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
-            newText = "```{0}{1}```{0}".format(
-                lineSeparator, editor.selectedText())
+            newText = "```{0}{1}```{0}".format(lineSeparator, editor.selectedText())
             editor.replaceSelectedText(newText)
         else:
             editor.insert("```{0}{0}```{0}".format(lineSeparator))
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline + 1, 0)
         editor.endUndoAction()
-    
+
     def __insertMarkup(self, markup, editor):
         """
         Private method to insert the specified markup.
-        
+
         If the editor has selected text, this text is enclosed by the given
         markup. If no text is selected, the markup is inserted at the cursor
         position and the cursor is positioned in between.
-        
+
         @param markup markup string to be inserted
         @type str
         @param editor reference to the editor to work on
@@ -177,7 +177,7 @@
         """
         if editor is None:
             return
-        
+
         editor.beginUndoAction()
         if editor.hasSelectedText():
             newText = "{0}{1}{0}".format(markup, editor.selectedText())
@@ -187,64 +187,65 @@
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline, cindex + len(markup))
         editor.endUndoAction()
-    
+
     def hasHyperlink(self):
         """
         Public method to indicate the availability of hyperlink markup.
-        
+
         @return flag indicating the availability of hyperlink markup
         @rtype bool
         """
         return True
-    
+
     def hyperlink(self, editor):
         """
         Public method to generate hyperlink text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .HyperlinkMarkupDialog import HyperlinkMarkupDialog
+
         dlg = HyperlinkMarkupDialog(False, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             text, target, title = dlg.getData()
-            
+
             link = "[{0}]".format(text)
             if target and title:
                 link = '{0}({1} "{2}")'.format(link, target, title)
             elif target:
-                link = '{0}({1})'.format(link, target)
+                link = "{0}({1})".format(link, target)
             elif title:
                 link = '{0}("{1}")'.format(link, title)
-            
+
             editor.beginUndoAction()
             cline, cindex = editor.getCursorPosition()
             editor.insert(link)
             editor.setCursorPosition(cline, cindex + len(link))
             editor.endUndoAction()
-    
+
     def hasLine(self):
         """
         Public method to indicate the availability of a horizontal line markup.
-        
+
         @return flag indicating the availability of a horizontal line markup
         @rtype bool
         """
         return True
-    
+
     def line(self, editor):
         """
         Public method to generate a horizontal line text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         markup = "{0}-----{0}{0}".format(lineSeparator)
@@ -252,110 +253,109 @@
         cline, cindex = editor.getCursorPosition()
         editor.setCursorPosition(cline + 3, 0)
         editor.endUndoAction()
-    
+
     def hasQuote(self):
         """
         Public method to indicate the availability of block quote markup.
-        
+
         @return flag indicating the availability of block quote markup
         @rtype bool
         """
         return True
-    
+
     def quote(self, editor):
         """
         Public method to generate block quote text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         editor.beginUndoAction()
         markup = "> "
         sline, sindex, eline, eindex = editor.getSelection()
         for line in range(sline, eline + 1 if eindex > 0 else eline):
             editor.insertAt(markup, line, 0)
         editor.endUndoAction()
-    
+
     def hasImage(self):
         """
         Public method to indicate the availability of image markup.
-        
+
         @return flag indicating the availability of image markup
         @rtype bool
         """
         return True
-    
+
     def image(self, editor):
         """
         Public method to generate image text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .ImageMarkupDialog import ImageMarkupDialog
+
         dlg = ImageMarkupDialog(ImageMarkupDialog.MarkDownMode)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            address, altText, title, originalSize, width, height = (
-                dlg.getData()
-            )
-            
+            address, altText, title, originalSize, width, height = dlg.getData()
+
             if title:
                 markup = '![{0}]({1} "{2}")'.format(altText, address, title)
             else:
-                markup = '![{0}]({1})'.format(altText, address)
-            
+                markup = "![{0}]({1})".format(altText, address)
+
             editor.beginUndoAction()
             editor.insert(markup)
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline, cindex + len(markup))
             editor.endUndoAction()
-    
+
     def hasBulletedList(self):
         """
         Public method to indicate the availability of bulleted list markup.
-        
+
         @return flag indicating the availability of bulleted list markup
         @rtype bool
         """
         return True
-    
+
     def bulletedList(self, editor):
         """
         Public method to generate bulleted list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, False)
-    
+
     def hasNumberedList(self):
         """
         Public method to indicate the availability of numbered list markup.
-        
+
         @return flag indicating the availability of numbered list markup
         @rtype bool
         """
         return True
-    
+
     def numberedList(self, editor):
         """
         Public method to generate numbered list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, True)
-    
+
     def __makeList(self, editor, numberedList):
         """
         Private method to generate the desired list markup.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param numberedList flag indicating the generation of a numbered list
@@ -363,14 +363,12 @@
         """
         if editor is None:
             return
-        
+
         markup = "  1. " if numberedList else "  * "
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
-            startLine, startIndex, endLine, endIndex = (
-                editor.getSelection()
-            )
+            startLine, startIndex, endLine, endIndex = editor.getSelection()
             if endIndex == 0:
                 endLine -= 1
             for line in range(startLine, endLine + 1):
@@ -379,19 +377,20 @@
         else:
             listElements, ok = QInputDialog.getInt(
                 None,
-                QCoreApplication.translate(
-                    "MarkdownProvider", "Create List"),
+                QCoreApplication.translate("MarkdownProvider", "Create List"),
                 QCoreApplication.translate(
-                    "MarkdownProvider",
-                    "Enter desired number of list elements:"),
-                0, 0, 99, 1)
+                    "MarkdownProvider", "Enter desired number of list elements:"
+                ),
+                0,
+                0,
+                99,
+                1,
+            )
             if ok:
                 if listElements == 0:
                     listElements = 1
                 cline, cindex = editor.getCursorPosition()
-                listBody = (
-                    listElements * "{1}{0}".format(lineSeparator, markup)
-                )
+                listBody = listElements * "{1}{0}".format(lineSeparator, markup)
                 if cindex == 0:
                     editor.insertAt(listBody, cline, cindex)
                     editor.setCursorPosition(cline, len(markup))
--- a/src/eric7/QScintilla/MarkupProviders/MarkupBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/MarkupBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,239 +11,240 @@
 class MarkupBase:
     """
     Class implementing the base class for the markup providers.
-    
+
     Note: Derived classes need only implement those method they provide
     functionality for. This base class implements do nothing variants for
     all methods.
     """
+
     def __init__(self):
         """
         Constructor
         """
         pass
-    
+
     def kind(self):
         """
         Public method to get the markup kind.
-        
+
         @return markup kind all lowercased
         @rtype str
         """
         return "none"
-    
+
     def hasBold(self):
         """
         Public method to indicate the availability of bold markup.
-        
+
         @return flag indicating the availability of bold markup
         @rtype bool
         """
         return False
-    
+
     def bold(self, editor):
         """
         Public method to generate bold text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasItalic(self):
         """
         Public method to indicate the availability of italic markup.
-        
+
         @return flag indicating the availability of italic markup
         @rtype bool
         """
         return False
-    
+
     def italic(self, editor):
         """
         Public method to generate italic text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasStrikethrough(self):
         """
         Public method to indicate the availability of strikethrough markup.
-        
+
         @return flag indicating the availability of strikethrough markup
         @rtype bool
         """
         return False
-    
+
     def strikethrough(self, editor):
         """
         Public method to generate strikethrough text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def headerLevels(self):
         """
         Public method to determine the available header levels.
-        
+
         @return supported header levels
         @rtype int
         """
         return 0
-    
+
     def header(self, editor, level):
         """
         Public method to generate a header.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param level header level
         @type int
         """
         pass
-    
+
     def hasCode(self):
         """
         Public method to indicate the availability of inline code markup.
-        
+
         @return flag indicating the availability of inline code markup
         @rtype bool
         """
         return False
-    
+
     def code(self, editor):
         """
         Public method to generate inline code text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasCodeBlock(self):
         """
         Public method to indicate the availability of code block markup.
-        
+
         @return flag indicating the availability of code block markup
         @rtype bool
         """
         return False
-    
+
     def codeBlock(self, editor):
         """
         Public method to generate code block text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasHyperlink(self):
         """
         Public method to indicate the availability of hyperlink markup.
-        
+
         @return flag indicating the availability of hyperlink markup
         @rtype bool
         """
         return False
-    
+
     def hyperlink(self, editor):
         """
         Public method to generate hyperlink text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasLine(self):
         """
         Public method to indicate the availability of a horizontal line markup.
-        
+
         @return flag indicating the availability of a horizontal line markup
         @rtype bool
         """
         return False
-    
+
     def line(self, editor):
         """
         Public method to generate a horizontal line text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasQuote(self):
         """
         Public method to indicate the availability of block quote markup.
-        
+
         @return flag indicating the availability of block quote markup
         @rtype bool
         """
         return False
-    
+
     def quote(self, editor):
         """
         Public method to generate block quote text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasImage(self):
         """
         Public method to indicate the availability of image markup.
-        
+
         @return flag indicating the availability of image markup
         @rtype bool
         """
         return False
-    
+
     def image(self, editor):
         """
         Public method to generate image text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasBulletedList(self):
         """
         Public method to indicate the availability of bulleted list markup.
-        
+
         @return flag indicating the availability of bulleted list markup
         @rtype bool
         """
         return False
-    
+
     def bulletedList(self, editor):
         """
         Public method to generate bulleted list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         pass
-    
+
     def hasNumberedList(self):
         """
         Public method to indicate the availability of numbered list markup.
-        
+
         @return flag indicating the availability of numbered list markup
         @rtype bool
         """
         return False
-    
+
     def numberedList(self, editor):
         """
         Public method to generate numbered list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
--- a/src/eric7/QScintilla/MarkupProviders/RestructuredTextProvider.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/RestructuredTextProvider.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,72 +17,73 @@
     """
     Class implementing the reStructured Text markup provider.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__headerChars = ["=", "-", "~", "+", "#", "^"]
-    
+
     def kind(self):
         """
         Public method to get the markup kind.
-        
+
         @return string with markup kind
         @rtype str
         """
         return "rest"
-    
+
     def hasBold(self):
         """
         Public method to indicate the availability of bold markup.
-        
+
         @return flag indicating the availability of bold markup
         @rtype bool
         """
         return True
-    
+
     def bold(self, editor):
         """
         Public method to generate bold text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("**", editor)
-    
+
     def hasItalic(self):
         """
         Public method to indicate the availability of italic markup.
-        
+
         @return flag indicating the availability of italic markup
         @rtype bool
         """
         return True
-    
+
     def italic(self, editor):
         """
         Public method to generate italic text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("*", editor)
-    
+
     def headerLevels(self):
         """
         Public method to determine the available header levels.
-        
+
         @return supported header levels
         @rtype int
         """
         return len(self.__headerChars)
-    
+
     def header(self, editor, level):
         """
         Public method to generate a header.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param level header level
@@ -90,7 +91,7 @@
         """
         if editor is None or level > self.headerLevels():
             return
-        
+
         editor.beginUndoAction()
         cline, cindex = editor.getCursorPosition()
         if editor.hasSelection() and cindex == 0:
@@ -100,48 +101,48 @@
             editor.insertAt(lineSeparator, cline, len(editor.text(cline)))
         lineLength = len(editor.text(cline)) - len(lineSeparator)
         editor.insertAt(
-            lineLength * self.__headerChars[level - 1] + lineSeparator,
-            cline + 1, 0)
+            lineLength * self.__headerChars[level - 1] + lineSeparator, cline + 1, 0
+        )
         editor.setCursorPosition(cline + 2, 0)
         editor.endUndoAction()
-    
+
     def hasCode(self):
         """
         Public method to indicate the availability of inline code markup.
-        
+
         @return flag indicating the availability of inline code markup
         @rtype bool
         """
         return True
-    
+
     def code(self, editor):
         """
         Public method to generate inline code text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__insertMarkup("``", editor)
-    
+
     def hasCodeBlock(self):
         """
         Public method to indicate the availability of code block markup.
-        
+
         @return flag indicating the availability of code block markup
         @rtype bool
         """
         return True
-    
+
     def codeBlock(self, editor):
         """
         Public method to generate code block text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
@@ -158,15 +159,15 @@
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline + 2, 4)
         editor.endUndoAction()
-    
+
     def __insertMarkup(self, markup, editor):
         """
         Private method to insert the specified markup.
-        
+
         If the editor has selected text, this text is enclosed by the given
         markup. If no text is selected, the markup is inserted at the cursor
         position and the cursor is positioned in between.
-        
+
         @param markup markup string to be inserted
         @type str
         @param editor reference to the editor to work on
@@ -174,7 +175,7 @@
         """
         if editor is None:
             return
-        
+
         editor.beginUndoAction()
         if editor.hasSelectedText():
             newText = "{0}{1}{0}".format(markup, editor.selectedText())
@@ -184,41 +185,42 @@
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline, cindex + len(markup))
         editor.endUndoAction()
-    
+
     def hasHyperlink(self):
         """
         Public method to indicate the availability of hyperlink markup.
-        
+
         @return flag indicating the availability of hyperlink markup
         @rtype bool
         """
         return True
-    
+
     def hyperlink(self, editor):
         """
         Public method to generate hyperlink text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .HyperlinkMarkupDialog import HyperlinkMarkupDialog
+
         dlg = HyperlinkMarkupDialog(False, True, noTitle=True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             text, target, _ = dlg.getData()
-            
+
             link1 = "`{0}`_".format(text)
             link2 = ".. _`{0}`:".format(text)
             if target:
                 link2 = "{0} {1}".format(link2, target)
-            
+
             lineSeparator = editor.getLineSeparator()
             editor.beginUndoAction()
             cline, cindex = editor.getCursorPosition()
             editor.insert(link1)
-            
+
             line = cline
             while line < editor.lines():
                 if editor.text(line).strip() == "":
@@ -241,29 +243,29 @@
                 else:
                     sep = lineSeparator
                 editor.insertAt("{0}{1}".format(link2, sep), line, 0)
-            
+
             editor.setCursorPosition(cline, cindex + len(link1))
             editor.endUndoAction()
-    
+
     def hasLine(self):
         """
         Public method to indicate the availability of a horizontal line markup.
-        
+
         @return flag indicating the availability of a horizontal line markup
         @rtype bool
         """
         return True
-    
+
     def line(self, editor):
         """
         Public method to generate a horizontal line text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         markup = "{0}-----{0}{0}".format(lineSeparator)
@@ -271,26 +273,26 @@
         cline, cindex = editor.getCursorPosition()
         editor.setCursorPosition(cline + 3, 0)
         editor.endUndoAction()
-    
+
     def hasQuote(self):
         """
         Public method to indicate the availability of block quote markup.
-        
+
         @return flag indicating the availability of block quote markup
         @rtype bool
         """
         return True
-    
+
     def quote(self, editor):
         """
         Public method to generate block quote text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         markup = "> "
@@ -300,33 +302,32 @@
         editor.insertAt("::{0}{0}".format(lineSeparator), sline, 0)
         editor.setCursorPosition(eline + 2, eindex)
         editor.endUndoAction()
-    
+
     def hasImage(self):
         """
         Public method to indicate the availability of image markup.
-        
+
         @return flag indicating the availability of image markup
         @rtype bool
         """
         return True
-    
+
     def image(self, editor):
         """
         Public method to generate image text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         if editor is None:
             return
-        
+
         from .ImageMarkupDialog import ImageMarkupDialog
+
         dlg = ImageMarkupDialog(ImageMarkupDialog.RestMode)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            address, altText, title, originalSize, width, height = (
-                dlg.getData()
-            )
-            
+            address, altText, title, originalSize, width, height = dlg.getData()
+
             lineSeparator = editor.getLineSeparator()
             markup = ".. image:: {0}{1}".format(address, lineSeparator)
             lines = 1
@@ -337,53 +338,53 @@
                 markup += "   :height: {0}px{1}".format(height, lineSeparator)
                 markup += "   :width: {0}px{1}".format(width, lineSeparator)
                 lines += 2
-            
+
             editor.beginUndoAction()
             editor.insert(markup)
             cline, cindex = editor.getCursorPosition()
             editor.setCursorPosition(cline + lines, 0)
             editor.endUndoAction()
-    
+
     def hasBulletedList(self):
         """
         Public method to indicate the availability of bulleted list markup.
-        
+
         @return flag indicating the availability of bulleted list markup
         @rtype bool
         """
         return True
-    
+
     def bulletedList(self, editor):
         """
         Public method to generate bulleted list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, False)
-    
+
     def hasNumberedList(self):
         """
         Public method to indicate the availability of numbered list markup.
-        
+
         @return flag indicating the availability of numbered list markup
         @rtype bool
         """
         return True
-    
+
     def numberedList(self, editor):
         """
         Public method to generate numbered list text.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         """
         self.__makeList(editor, True)
-    
+
     def __makeList(self, editor, numberedList):
         """
         Private method to generate the desired list markup.
-        
+
         @param editor reference to the editor to work on
         @type Editor
         @param numberedList flag indicating the generation of a numbered list
@@ -391,14 +392,12 @@
         """
         if editor is None:
             return
-        
+
         markup = "  #. " if numberedList else "  * "
         lineSeparator = editor.getLineSeparator()
         editor.beginUndoAction()
         if editor.hasSelectedText():
-            startLine, startIndex, endLine, endIndex = (
-                editor.getSelection()
-            )
+            startLine, startIndex, endLine, endIndex = editor.getSelection()
             if endIndex == 0:
                 endLine -= 1
             for line in range(startLine, endLine + 1):
@@ -407,19 +406,20 @@
         else:
             listElements, ok = QInputDialog.getInt(
                 None,
-                QCoreApplication.translate(
-                    "RestructuredTextProvider", "Create List"),
+                QCoreApplication.translate("RestructuredTextProvider", "Create List"),
                 QCoreApplication.translate(
-                    "RestructuredTextProvider",
-                    "Enter desired number of list elements:"),
-                0, 0, 99, 1)
+                    "RestructuredTextProvider", "Enter desired number of list elements:"
+                ),
+                0,
+                0,
+                99,
+                1,
+            )
             if ok:
                 if listElements == 0:
                     listElements = 1
                 cline, cindex = editor.getCursorPosition()
-                listBody = (
-                    listElements * "{1}{0}".format(lineSeparator, markup)
-                )
+                listBody = listElements * "{1}{0}".format(lineSeparator, markup)
                 if cindex == 0:
                     editor.insertAt(listBody, cline, cindex)
                     editor.setCursorPosition(cline, len(markup))
--- a/src/eric7/QScintilla/MarkupProviders/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MarkupProviders/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,7 +15,7 @@
 def getMarkupProvider(editor):
     """
     Public method to get a markup provider for the given editor.
-    
+
     @param editor reference to the editor to get the markup provider for
     @type Editor
     @return markup provider
@@ -23,33 +23,34 @@
     """
     if editor is not None:
         fn = editor.getFileName()
-        
+
         if fn:
             extension = os.path.normcase(os.path.splitext(fn)[1][1:])
         else:
             extension = ""
         if (
-            extension in Preferences.getEditor(
-                "PreviewHtmlFileNameExtensions") or
-            editor.getLanguage() == "HTML"
+            extension in Preferences.getEditor("PreviewHtmlFileNameExtensions")
+            or editor.getLanguage() == "HTML"
         ):
             from .HtmlProvider import HtmlProvider
+
             return HtmlProvider()
         elif (
-            extension in Preferences.getEditor(
-                "PreviewMarkdownFileNameExtensions") or
-            editor.getLanguage().lower() == "markdown"
+            extension in Preferences.getEditor("PreviewMarkdownFileNameExtensions")
+            or editor.getLanguage().lower() == "markdown"
         ):
             from .MarkdownProvider import MarkdownProvider
+
             return MarkdownProvider()
         elif (
-            extension in Preferences.getEditor(
-                "PreviewRestFileNameExtensions") or
-            editor.getLanguage().lower() == "restructuredtext"
+            extension in Preferences.getEditor("PreviewRestFileNameExtensions")
+            or editor.getLanguage().lower() == "restructuredtext"
         ):
             from .RestructuredTextProvider import RestructuredTextProvider
+
             return RestructuredTextProvider()
-    
+
     # no supported markup provider identified
     from .MarkupBase import MarkupBase
+
     return MarkupBase()
--- a/src/eric7/QScintilla/MiniEditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/MiniEditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,15 +15,26 @@
 import editorconfig
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QSignalMapper, QPoint, QTimer, QSize,
-    QCoreApplication
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QSignalMapper,
+    QPoint,
+    QTimer,
+    QSize,
+    QCoreApplication,
 )
-from PyQt6.QtGui import (
-    QKeySequence, QPalette, QFont, QPixmap, QActionGroup, QAction
-)
+from PyQt6.QtGui import QKeySequence, QPalette, QFont, QPixmap, QActionGroup, QAction
 from PyQt6.QtWidgets import (
-    QWidget, QWhatsThis, QDialog, QInputDialog, QApplication,
-    QMenu, QVBoxLayout, QHBoxLayout, QLabel
+    QWidget,
+    QWhatsThis,
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QMenu,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLabel,
 )
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog
 from PyQt6.Qsci import QsciScintilla
@@ -51,103 +62,102 @@
     Class implementing a QsciScintillaCompat subclass for handling focus
     events.
     """
+
     EncloseChars = {
         '"': '"',
         "'": "'",
         "(": "()",
         ")": "()",
-        "{": "{}",          # __IGNORE_WARNING_M613__
-        "}": "{}",          # __IGNORE_WARNING_M613__
+        "{": "{}",  # __IGNORE_WARNING_M613__
+        "}": "{}",  # __IGNORE_WARNING_M613__
         "[": "[]",
         "]": "[]",
         "<": "<>",
         ">": "<>",
     }
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.enableMultiCursorSupport()
-        
+
         self.mw = parent
-    
+
     def getFileName(self):
         """
         Public method to return the name of the file being displayed.
-        
+
         @return filename of the displayed file
         @rtype str
         """
         return self.mw.getFileName()
-    
+
     def editorCommand(self, cmd):
         """
         Public method to perform a simple editor command.
-        
+
         @param cmd the scintilla command to be performed (integer)
         """
         if cmd == QsciScintilla.SCI_DELETEBACK:
             line, index = self.getCursorPosition()
-            text = self.text(line)[index - 1:index + 1]
-            matchingPairs = ['()', '[]', '{}', '<>', "''", '""']
+            text = self.text(line)[index - 1 : index + 1]
+            matchingPairs = ["()", "[]", "{}", "<>", "''", '""']
             # __IGNORE_WARNING_M613__
             if text in matchingPairs:
                 self.delete()
-        
+
         super().editorCommand(cmd)
-    
+
     def keyPressEvent(self, ev):
         """
         Protected method to handle the user input a key at a time.
-        
+
         @param ev key event
         @type QKeyEvent
         """
+
         def encloseSelectedText(encString):
             """
             Local function to enclose the current selection with some
             characters.
-            
+
             @param encString string to use to enclose the selection
                 (one or two characters)
             @type str
             """
             startChar = encString[0]
             endChar = encString[1] if len(encString) == 2 else startChar
-            
+
             sline, sindex, eline, eindex = self.getSelection()
             replaceText = startChar + self.selectedText() + endChar
             self.beginUndoAction()
             self.replaceSelectedText(replaceText)
             self.endUndoAction()
             self.setSelection(sline, sindex + 1, eline, eindex + 1)
-        
+
         txt = ev.text()
-        
+
         # See it is text to insert.
         if len(txt) and txt >= " ":
-            if (
-                self.hasSelectedText() and
-                txt in MiniScintilla.EncloseChars
-            ):
+            if self.hasSelectedText() and txt in MiniScintilla.EncloseChars:
                 encloseSelectedText(MiniScintilla.EncloseChars[txt])
                 ev.accept()
                 return
-            
+
             super().keyPressEvent(ev)
         else:
             ev.ignore()
-    
+
     def mousePressEvent(self, event):
         """
         Protected method to handle the mouse press event.
-        
+
         @param event the mouse press event
         @type QMouseEvent
         """
@@ -157,57 +167,54 @@
         elif event.button() == Qt.MouseButton.XButton2:
             self.redo()
             event.accept()
-        elif (
-            event.button() == Qt.MouseButton.LeftButton and
-            bool(event.modifiers() & (
-                Qt.KeyboardModifier.MetaModifier |
-                Qt.KeyboardModifier.AltModifier
-            ))
+        elif event.button() == Qt.MouseButton.LeftButton and bool(
+            event.modifiers()
+            & (Qt.KeyboardModifier.MetaModifier | Qt.KeyboardModifier.AltModifier)
         ):
             line, index = self.lineIndexFromPoint(event.position().toPoint())
             self.addCursor(line, index)
             event.accept()
         else:
             super().mousePressEvent(event)
-    
+
     def focusInEvent(self, event):
         """
         Protected method called when the editor receives focus.
-        
+
         This method checks for modifications of the current file and
         rereads it upon request. The cursor is placed at the current position
         assuming, that it is in the vicinity of the old position after the
         reread.
-        
+
         @param event the event object
         @type QFocusEvent
         """
         self.mw.editorActGrp.setEnabled(True)
         with contextlib.suppress(AttributeError):
             self.setCaretWidth(self.mw.caretWidth)
-        
+
         self.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         super().focusInEvent(event)
-    
+
     def focusOutEvent(self, event):
         """
         Protected method called when the editor loses focus.
-        
+
         @param event the event object
         @type QFocusEvent
         """
         self.mw.editorActGrp.setEnabled(False)
         self.setCaretWidth(0)
-        
+
         super().focusOutEvent(event)
-        
+
     def removeTrailingWhitespace(self):
         """
         Public method to remove trailing whitespace.
         """
-        searchRE = r"[ \t]+$"    # whitespace at the end of a line
-        
+        searchRE = r"[ \t]+$"  # whitespace at the end of a line
+
         ok = self.findFirstTarget(searchRE, True, False, False, 0, 0)
         self.beginUndoAction()
         while ok:
@@ -219,27 +226,28 @@
 class MiniEditor(EricMainWindow):
     """
     Class implementing an editor for simple editing tasks.
-    
+
     @signal editorSaved() emitted after the file has been saved
     @signal languageChanged(str) emitted when the editors language was set. The
         language is passed as a parameter.
     @signal editorRenamed(str) emitted after the editor got a new name
         (i.e. after a 'Save As')
     @signal cursorLineChanged(int) emitted when the cursor line was changed
-    
+
     @signal refreshed() dummy signal to emulate the Editor interface
     """
+
     editorSaved = pyqtSignal()
     languageChanged = pyqtSignal(str)
     editorRenamed = pyqtSignal(str)
     cursorLineChanged = pyqtSignal(int)
-    
+
     refreshed = pyqtSignal()
-    
+
     def __init__(self, filename="", filetype="", parent=None, name=None):
         """
         Constructor
-        
+
         @param filename name of the file to open (string)
         @param filetype type of the source file (string)
         @param parent reference to the parent widget (QWidget)
@@ -249,44 +257,43 @@
         if name is not None:
             self.setObjectName(name)
         self.setWindowIcon(UI.PixmapCache.getIcon("editor"))
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.__textEdit = MiniScintilla(self)
         self.__textEdit.clearSearchIndicators = self.clearSearchIndicators
         self.__textEdit.setSearchIndicator = self.setSearchIndicator
         self.__textEdit.setUtf8(True)
-        
+
         self.getCursorPosition = self.__textEdit.getCursorPosition
         self.text = self.__textEdit.text
         self.getZoom = self.__textEdit.getZoom
         self.zoomTo = self.__textEdit.zoomTo
         self.zoomIn = self.__textEdit.zoomIn
         self.zoomOut = self.__textEdit.zoomOut
-        
+
         self.__curFile = filename
         self.__lastLine = 0
-        
-        self.srHistory = {
-            "search": [],
-            "replace": []
-        }
+
+        self.srHistory = {"search": [], "replace": []}
         from .SearchReplaceWidget import SearchReplaceWidget
+
         self.__searchWidget = SearchReplaceWidget(False, self, self)
         self.__replaceWidget = SearchReplaceWidget(True, self, self)
-        
+
         from .EditorOutline import EditorOutlineView
+
         self.__sourceOutline = EditorOutlineView(self, populate=False)
         self.__sourceOutline.setMaximumWidth(
-            Preferences.getEditor("SourceOutlineWidth"))
-        
+            Preferences.getEditor("SourceOutlineWidth")
+        )
+
         hlayout = QHBoxLayout()
         hlayout.setContentsMargins(0, 0, 0, 0)
         hlayout.setSpacing(1)
         hlayout.addWidget(self.__textEdit)
         hlayout.addWidget(self.__sourceOutline)
-        
+
         centralWidget = QWidget()
         layout = QVBoxLayout()
         layout.setContentsMargins(1, 1, 1, 1)
@@ -297,68 +304,66 @@
         self.setCentralWidget(centralWidget)
         self.__searchWidget.hide()
         self.__replaceWidget.hide()
-        
+
         self.lexer_ = None
         self.apiLanguage = ""
         self.filetype = ""
-        
+
         self.__loadEditorConfig(filename)
-        
+
         self.__createActions()
         self.__createMenus()
         self.__createToolBars()
         self.__createStatusBar()
-        
+
         self.__loadConfiguration()
         self.__readSettings()
-        
+
         # clear QScintilla defined keyboard commands
         # we do our own handling through the view manager
         self.__textEdit.clearAlternateKeys()
         self.__textEdit.clearKeys()
-        
+
         # initialise the mark occurrences timer
         self.__markOccurrencesTimer = QTimer(self)
         self.__markOccurrencesTimer.setSingleShot(True)
         self.__markOccurrencesTimer.setInterval(
-            Preferences.getEditor("MarkOccurrencesTimeout"))
+            Preferences.getEditor("MarkOccurrencesTimeout")
+        )
         self.__markOccurrencesTimer.timeout.connect(self.__markOccurrences)
         self.__markedText = ""
-        
+
         self.__changeTimer = QTimer(self)
         self.__changeTimer.setSingleShot(True)
         self.__changeTimer.setInterval(5 * 1000)
         self.__textEdit.textChanged.connect(self.__resetChangeTimer)
-        
+
         self.__textEdit.textChanged.connect(self.__documentWasModified)
         self.__textEdit.modificationChanged.connect(self.__modificationChanged)
-        self.__textEdit.cursorPositionChanged.connect(
-            self.__cursorPositionChanged)
+        self.__textEdit.cursorPositionChanged.connect(self.__cursorPositionChanged)
         self.__textEdit.linesChanged.connect(self.__resizeLinenoMargin)
-        
-        self.__textEdit.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        self.__textEdit.customContextMenuRequested.connect(
-            self.__contextMenuRequested)
-        
+
+        self.__textEdit.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+        self.__textEdit.customContextMenuRequested.connect(self.__contextMenuRequested)
+
         self.__textEdit.selectionChanged.connect(
-            lambda: self.__searchWidget.selectionChanged(self.__textEdit))
+            lambda: self.__searchWidget.selectionChanged(self.__textEdit)
+        )
         self.__textEdit.selectionChanged.connect(
-            lambda: self.__replaceWidget.selectionChanged(self.__textEdit))
-        
+            lambda: self.__replaceWidget.selectionChanged(self.__textEdit)
+        )
+
         if filename:
             self.__loadFile(filename, filetype)
         else:
             self.__setCurrentFile("")
             self.encoding = self.__getEditorConfig("DefaultEncoding")
-        
+
         self.__checkActions()
-        
+
         self.__sourceOutline.setActive(True)
         self.__sourceOutline.setVisible(
-            self.__sourceOutline.isSupportedLanguage(
-                self.getLanguage()
-            )
+            self.__sourceOutline.isSupportedLanguage(self.getLanguage())
         )
         self.__changeTimer.timeout.connect(self.__sourceOutline.repopulate)
         self.languageChanged.connect(self.__editorChanged)
@@ -367,7 +372,7 @@
     def closeEvent(self, event):
         """
         Protected method to handle the close event.
-        
+
         @param event close event (QCloseEvent)
         """
         if self.__maybeSave():
@@ -375,7 +380,7 @@
             event.accept()
         else:
             event.ignore()
-    
+
     def __newFile(self):
         """
         Private slot to create a new file.
@@ -383,9 +388,9 @@
         if self.__maybeSave():
             self.__textEdit.clear()
             self.__setCurrentFile("")
-        
+
         self.__checkActions()
-    
+
     def __open(self):
         """
         Private slot to open a file.
@@ -395,34 +400,34 @@
             if fileName:
                 self.__loadFile(fileName)
         self.__checkActions()
-    
+
     def __save(self):
         """
         Private slot to save a file.
-        
+
         @return flag indicating success (boolean)
         """
         if not self.__curFile:
             return self.__saveAs()
         else:
             return self.__saveFile(self.__curFile)
-    
+
     def __saveAs(self):
         """
         Private slot to save a file with a new name.
-        
+
         @return flag indicating success (boolean)
         """
         fileName = EricFileDialog.getSaveFileName(self)
         if not fileName:
             return False
-        
+
         result = self.__saveFile(fileName)
-        
+
         self.editorRenamed.emit(fileName)
-        
+
         return result
-    
+
     def __saveCopy(self):
         """
         Private slot to save a copy of the file with a new name.
@@ -430,9 +435,9 @@
         fileName = EricFileDialog.getSaveFileName(self)
         if not fileName:
             return
-        
+
         self.__writeFile(fileName)
-    
+
     def __about(self):
         """
         Private slot to show a little About message.
@@ -444,48 +449,50 @@
                 "The eric Mini Editor is an editor component"
                 " based on QScintilla. It may be used for simple"
                 " editing tasks, that don't need the power of"
-                " a full blown editor."))
-    
+                " a full blown editor."
+            ),
+        )
+
     def __aboutQt(self):
         """
         Private slot to handle the About Qt dialog.
         """
         EricMessageBox.aboutQt(self, "eric Mini Editor")
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-    
+
     def __documentWasModified(self):
         """
         Private slot to handle a change in the documents modification status.
         """
         self.setWindowModified(self.__textEdit.isModified())
-    
+
     def __checkActions(self, setSb=True):
         """
         Private slot to check some actions for their enable/disable status
         and set the statusbar info.
-        
+
         @param setSb flag indicating an update of the status bar is wanted
             (boolean)
         """
         self.saveAct.setEnabled(self.__textEdit.isModified())
-        
+
         self.undoAct.setEnabled(self.__textEdit.isUndoAvailable())
         self.redoAct.setEnabled(self.__textEdit.isRedoAvailable())
-        
+
         if setSb:
             line, pos = self.getCursorPosition()
             lang = self.getLanguage()
             self.__setSbFile(line + 1, pos, lang)
-    
+
     def __setSbFile(self, line=None, pos=None, language=None, zoom=None):
         """
         Private method to set the file info in the status bar.
-        
+
         @param line line number to display
         @type int
         @param pos character position to display
@@ -496,29 +503,30 @@
         @type int
         """
         if not self.__curFile:
-            writ = '   '
+            writ = "   "
         else:
             if os.access(self.__curFile, os.W_OK):
-                writ = ' rw'
+                writ = " rw"
             else:
-                writ = ' ro'
-        
+                writ = " ro"
+
         self.sbWritable.setText(writ)
-        
+
         if line is None:
-            line = ''
-        self.sbLine.setText(self.tr('Line: {0:5}').format(line))
-        
+            line = ""
+        self.sbLine.setText(self.tr("Line: {0:5}").format(line))
+
         if pos is None:
-            pos = ''
-        self.sbPos.setText(self.tr('Pos: {0:5}').format(pos))
-        
+            pos = ""
+        self.sbPos.setText(self.tr("Pos: {0:5}").format(pos))
+
         if language is None:
             pixmap = QPixmap()
         elif language == "":
             pixmap = UI.PixmapCache.getPixmap("fileText")
         else:
             import QScintilla.Lexers
+
             pixmap = QScintilla.Lexers.getLanguageIcon(language, True)
         self.sbLanguage.setPixmap(pixmap)
         if pixmap.isNull():
@@ -526,32 +534,32 @@
             self.sbLanguage.setToolTip("")
         else:
             self.sbLanguage.setText("")
-            self.sbLanguage.setToolTip(
-                self.tr('Language: {0}').format(language))
-        
+            self.sbLanguage.setToolTip(self.tr("Language: {0}").format(language))
+
         if zoom is None:
             self.sbZoom.setValue(self.getZoom())
         else:
             self.sbZoom.setValue(zoom)
-    
+
     def __readShortcut(self, act, category):
         """
         Private function to read a single keyboard shortcut from the settings.
-        
+
         @param act reference to the action object (EricAction)
         @param category category the action belongs to (string)
         """
         if act.objectName():
             accel = Preferences.getSettings().value(
-                "Shortcuts/{0}/{1}/Accel".format(category, act.objectName()))
+                "Shortcuts/{0}/{1}/Accel".format(category, act.objectName())
+            )
             if accel is not None:
                 act.setShortcut(QKeySequence(accel))
             accel = Preferences.getSettings().value(
-                "Shortcuts/{0}/{1}/AltAccel".format(
-                    category, act.objectName()))
+                "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName())
+            )
             if accel is not None:
                 act.setAlternateShortcut(QKeySequence(accel), removeEmpty=True)
-    
+
     def __createActions(self):
         """
         Private method to create the actions.
@@ -562,14 +570,14 @@
         self.searchActions = []
         self.viewActions = []
         self.configActions = []
-        
+
         self.__createFileActions()
         self.__createEditActions()
         self.__createHelpActions()
         self.__createSearchActions()
         self.__createViewActions()
         self.__createConfigActions()
-        
+
         # read the keyboard shortcuts and make them identical to the main
         # eric shortcuts
         for act in self.helpActions + self.configActions:
@@ -582,1885 +590,2342 @@
             self.__readShortcut(act, "Search")
         for act in self.viewActions:
             self.__readShortcut(act, "View")
-    
+
     def __createFileActions(self):
         """
         Private method to create the File actions.
         """
         self.newAct = EricAction(
-            self.tr('New'),
+            self.tr("New"),
             UI.PixmapCache.getIcon("new"),
-            self.tr('&New'),
+            self.tr("&New"),
             QKeySequence(self.tr("Ctrl+N", "File|New")),
-            0, self, 'vm_file_new')
-        self.newAct.setStatusTip(self.tr('Open an empty editor window'))
-        self.newAct.setWhatsThis(self.tr(
-            """<b>New</b>"""
-            """<p>An empty editor window will be created.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_new",
+        )
+        self.newAct.setStatusTip(self.tr("Open an empty editor window"))
+        self.newAct.setWhatsThis(
+            self.tr(
+                """<b>New</b>""" """<p>An empty editor window will be created.</p>"""
+            )
+        )
         self.newAct.triggered.connect(self.__newFile)
         self.fileActions.append(self.newAct)
-        
+
         self.openAct = EricAction(
-            self.tr('Open'),
+            self.tr("Open"),
             UI.PixmapCache.getIcon("open"),
-            self.tr('&Open...'),
+            self.tr("&Open..."),
             QKeySequence(self.tr("Ctrl+O", "File|Open")),
-            0, self, 'vm_file_open')
-        self.openAct.setStatusTip(self.tr('Open a file'))
-        self.openAct.setWhatsThis(self.tr(
-            """<b>Open a file</b>"""
-            """<p>You will be asked for the name of a file to be opened.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_open",
+        )
+        self.openAct.setStatusTip(self.tr("Open a file"))
+        self.openAct.setWhatsThis(
+            self.tr(
+                """<b>Open a file</b>"""
+                """<p>You will be asked for the name of a file to be opened.</p>"""
+            )
+        )
         self.openAct.triggered.connect(self.__open)
         self.fileActions.append(self.openAct)
-        
+
         self.saveAct = EricAction(
-            self.tr('Save'),
+            self.tr("Save"),
             UI.PixmapCache.getIcon("fileSave"),
-            self.tr('&Save'),
+            self.tr("&Save"),
             QKeySequence(self.tr("Ctrl+S", "File|Save")),
-            0, self, 'vm_file_save')
-        self.saveAct.setStatusTip(self.tr('Save the current file'))
-        self.saveAct.setWhatsThis(self.tr(
-            """<b>Save File</b>"""
-            """<p>Save the contents of current editor window.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_save",
+        )
+        self.saveAct.setStatusTip(self.tr("Save the current file"))
+        self.saveAct.setWhatsThis(
+            self.tr(
+                """<b>Save File</b>"""
+                """<p>Save the contents of current editor window.</p>"""
+            )
+        )
         self.saveAct.triggered.connect(self.__save)
         self.fileActions.append(self.saveAct)
-        
+
         self.saveAsAct = EricAction(
-            self.tr('Save as'),
+            self.tr("Save as"),
             UI.PixmapCache.getIcon("fileSaveAs"),
-            self.tr('Save &as...'),
+            self.tr("Save &as..."),
             QKeySequence(self.tr("Shift+Ctrl+S", "File|Save As")),
-            0, self, 'vm_file_save_as')
-        self.saveAsAct.setStatusTip(self.tr(
-            'Save the current file to a new one'))
-        self.saveAsAct.setWhatsThis(self.tr(
-            """<b>Save File as</b>"""
-            """<p>Save the contents of current editor window to a new file."""
-            """ The file can be entered in a file selection dialog.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_save_as",
+        )
+        self.saveAsAct.setStatusTip(self.tr("Save the current file to a new one"))
+        self.saveAsAct.setWhatsThis(
+            self.tr(
+                """<b>Save File as</b>"""
+                """<p>Save the contents of current editor window to a new file."""
+                """ The file can be entered in a file selection dialog.</p>"""
+            )
+        )
         self.saveAsAct.triggered.connect(self.__saveAs)
         self.fileActions.append(self.saveAsAct)
-        
+
         self.saveCopyAct = EricAction(
-            self.tr('Save Copy'),
+            self.tr("Save Copy"),
             UI.PixmapCache.getIcon("fileSaveCopy"),
-            self.tr('Save &Copy...'),
-            0, 0, self, 'vm_file_save_copy')
-        self.saveCopyAct.setStatusTip(self.tr(
-            'Save a copy of the current file'))
-        self.saveCopyAct.setWhatsThis(self.tr(
-            """<b>Save Copy</b>"""
-            """<p>Save a copy of the contents of current editor window."""
-            """ The file can be entered in a file selection dialog.</p>"""
-        ))
+            self.tr("Save &Copy..."),
+            0,
+            0,
+            self,
+            "vm_file_save_copy",
+        )
+        self.saveCopyAct.setStatusTip(self.tr("Save a copy of the current file"))
+        self.saveCopyAct.setWhatsThis(
+            self.tr(
+                """<b>Save Copy</b>"""
+                """<p>Save a copy of the contents of current editor window."""
+                """ The file can be entered in a file selection dialog.</p>"""
+            )
+        )
         self.saveCopyAct.triggered.connect(self.__saveCopy)
         self.fileActions.append(self.saveCopyAct)
-        
+
         self.closeAct = EricAction(
-            self.tr('Close'),
+            self.tr("Close"),
             UI.PixmapCache.getIcon("close"),
-            self.tr('&Close'),
+            self.tr("&Close"),
             QKeySequence(self.tr("Ctrl+W", "File|Close")),
-            0, self, 'vm_file_close')
-        self.closeAct.setStatusTip(self.tr('Close the editor window'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close Window</b>"""
-            """<p>Close the current window.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the editor window"))
+        self.closeAct.setWhatsThis(
+            self.tr("""<b>Close Window</b>""" """<p>Close the current window.</p>""")
+        )
         self.closeAct.triggered.connect(self.close)
         self.fileActions.append(self.closeAct)
-        
+
         self.printAct = EricAction(
-            self.tr('Print'),
+            self.tr("Print"),
             UI.PixmapCache.getIcon("print"),
-            self.tr('&Print'),
+            self.tr("&Print"),
             QKeySequence(self.tr("Ctrl+P", "File|Print")),
-            0, self, 'vm_file_print')
-        self.printAct.setStatusTip(self.tr('Print the current file'))
-        self.printAct.setWhatsThis(self.tr(
-            """<b>Print File</b>"""
-            """<p>Print the contents of the current file.</p>"""
-        ))
+            0,
+            self,
+            "vm_file_print",
+        )
+        self.printAct.setStatusTip(self.tr("Print the current file"))
+        self.printAct.setWhatsThis(
+            self.tr(
+                """<b>Print File</b>"""
+                """<p>Print the contents of the current file.</p>"""
+            )
+        )
         self.printAct.triggered.connect(self.__printFile)
         self.fileActions.append(self.printAct)
-        
+
         self.printPreviewAct = EricAction(
-            self.tr('Print Preview'),
+            self.tr("Print Preview"),
             UI.PixmapCache.getIcon("printPreview"),
-            QCoreApplication.translate('ViewManager', 'Print Preview'),
-            0, 0, self, 'vm_file_print_preview')
-        self.printPreviewAct.setStatusTip(self.tr(
-            'Print preview of the current file'))
-        self.printPreviewAct.setWhatsThis(self.tr(
-            """<b>Print Preview</b>"""
-            """<p>Print preview of the current file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Print Preview"),
+            0,
+            0,
+            self,
+            "vm_file_print_preview",
+        )
+        self.printPreviewAct.setStatusTip(self.tr("Print preview of the current file"))
+        self.printPreviewAct.setWhatsThis(
+            self.tr(
+                """<b>Print Preview</b>"""
+                """<p>Print preview of the current file.</p>"""
+            )
+        )
         self.printPreviewAct.triggered.connect(self.__printPreviewFile)
         self.fileActions.append(self.printPreviewAct)
-    
+
     def __createEditActions(self):
         """
         Private method to create the Edit actions.
         """
         self.undoAct = EricAction(
-            self.tr('Undo'),
+            self.tr("Undo"),
             UI.PixmapCache.getIcon("editUndo"),
-            self.tr('&Undo'),
+            self.tr("&Undo"),
             QKeySequence(self.tr("Ctrl+Z", "Edit|Undo")),
             QKeySequence(self.tr("Alt+Backspace", "Edit|Undo")),
-            self, 'vm_edit_undo')
-        self.undoAct.setStatusTip(self.tr('Undo the last change'))
-        self.undoAct.setWhatsThis(self.tr(
-            """<b>Undo</b>"""
-            """<p>Undo the last change done in the current editor.</p>"""
-        ))
+            self,
+            "vm_edit_undo",
+        )
+        self.undoAct.setStatusTip(self.tr("Undo the last change"))
+        self.undoAct.setWhatsThis(
+            self.tr(
+                """<b>Undo</b>"""
+                """<p>Undo the last change done in the current editor.</p>"""
+            )
+        )
         self.undoAct.triggered.connect(self.__undo)
         self.editActions.append(self.undoAct)
-        
+
         self.redoAct = EricAction(
-            self.tr('Redo'),
+            self.tr("Redo"),
             UI.PixmapCache.getIcon("editRedo"),
-            self.tr('&Redo'),
+            self.tr("&Redo"),
             QKeySequence(self.tr("Ctrl+Shift+Z", "Edit|Redo")),
-            0, self, 'vm_edit_redo')
-        self.redoAct.setStatusTip(self.tr('Redo the last change'))
-        self.redoAct.setWhatsThis(self.tr(
-            """<b>Redo</b>"""
-            """<p>Redo the last change done in the current editor.</p>"""
-        ))
+            0,
+            self,
+            "vm_edit_redo",
+        )
+        self.redoAct.setStatusTip(self.tr("Redo the last change"))
+        self.redoAct.setWhatsThis(
+            self.tr(
+                """<b>Redo</b>"""
+                """<p>Redo the last change done in the current editor.</p>"""
+            )
+        )
         self.redoAct.triggered.connect(self.__redo)
         self.editActions.append(self.redoAct)
-        
+
         self.cutAct = EricAction(
-            self.tr('Cut'),
+            self.tr("Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            self.tr('Cu&t'),
+            self.tr("Cu&t"),
             QKeySequence(self.tr("Ctrl+X", "Edit|Cut")),
             QKeySequence(self.tr("Shift+Del", "Edit|Cut")),
-            self, 'vm_edit_cut')
-        self.cutAct.setStatusTip(self.tr('Cut the selection'))
-        self.cutAct.setWhatsThis(self.tr(
-            """<b>Cut</b>"""
-            """<p>Cut the selected text of the current editor to the"""
-            """ clipboard.</p>"""
-        ))
+            self,
+            "vm_edit_cut",
+        )
+        self.cutAct.setStatusTip(self.tr("Cut the selection"))
+        self.cutAct.setWhatsThis(
+            self.tr(
+                """<b>Cut</b>"""
+                """<p>Cut the selected text of the current editor to the"""
+                """ clipboard.</p>"""
+            )
+        )
         self.cutAct.triggered.connect(self.__textEdit.cut)
         self.editActions.append(self.cutAct)
-        
+
         self.copyAct = EricAction(
-            self.tr('Copy'),
+            self.tr("Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr('&Copy'),
+            self.tr("&Copy"),
             QKeySequence(self.tr("Ctrl+C", "Edit|Copy")),
             QKeySequence(self.tr("Ctrl+Ins", "Edit|Copy")),
-            self, 'vm_edit_copy')
-        self.copyAct.setStatusTip(self.tr('Copy the selection'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy the selected text of the current editor to the"""
-            """ clipboard.</p>"""
-        ))
+            self,
+            "vm_edit_copy",
+        )
+        self.copyAct.setStatusTip(self.tr("Copy the selection"))
+        self.copyAct.setWhatsThis(
+            self.tr(
+                """<b>Copy</b>"""
+                """<p>Copy the selected text of the current editor to the"""
+                """ clipboard.</p>"""
+            )
+        )
         self.copyAct.triggered.connect(self.__textEdit.copy)
         self.editActions.append(self.copyAct)
-        
+
         self.pasteAct = EricAction(
-            self.tr('Paste'),
+            self.tr("Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            self.tr('&Paste'),
+            self.tr("&Paste"),
             QKeySequence(self.tr("Ctrl+V", "Edit|Paste")),
             QKeySequence(self.tr("Shift+Ins", "Edit|Paste")),
-            self, 'vm_edit_paste')
-        self.pasteAct.setStatusTip(self.tr(
-            'Paste the last cut/copied text'))
-        self.pasteAct.setWhatsThis(self.tr(
-            """<b>Paste</b>"""
-            """<p>Paste the last cut/copied text from the clipboard to"""
-            """ the current editor.</p>"""
-        ))
+            self,
+            "vm_edit_paste",
+        )
+        self.pasteAct.setStatusTip(self.tr("Paste the last cut/copied text"))
+        self.pasteAct.setWhatsThis(
+            self.tr(
+                """<b>Paste</b>"""
+                """<p>Paste the last cut/copied text from the clipboard to"""
+                """ the current editor.</p>"""
+            )
+        )
         self.pasteAct.triggered.connect(self.__textEdit.paste)
         self.editActions.append(self.pasteAct)
-        
+
         self.deleteAct = EricAction(
-            self.tr('Clear'),
+            self.tr("Clear"),
             UI.PixmapCache.getIcon("editDelete"),
-            self.tr('Cl&ear'),
+            self.tr("Cl&ear"),
             QKeySequence(self.tr("Alt+Shift+C", "Edit|Clear")),
             0,
-            self, 'vm_edit_clear')
-        self.deleteAct.setStatusTip(self.tr('Clear all text'))
-        self.deleteAct.setWhatsThis(self.tr(
-            """<b>Clear</b>"""
-            """<p>Delete all text of the current editor.</p>"""
-        ))
+            self,
+            "vm_edit_clear",
+        )
+        self.deleteAct.setStatusTip(self.tr("Clear all text"))
+        self.deleteAct.setWhatsThis(
+            self.tr(
+                """<b>Clear</b>""" """<p>Delete all text of the current editor.</p>"""
+            )
+        )
         self.deleteAct.triggered.connect(self.__textEdit.clear)
         self.editActions.append(self.deleteAct)
-        
+
         self.cutAct.setEnabled(False)
         self.copyAct.setEnabled(False)
         self.__textEdit.copyAvailable.connect(self.cutAct.setEnabled)
         self.__textEdit.copyAvailable.connect(self.copyAct.setEnabled)
-        
+
         ####################################################################
         ## Below follow the actions for QScintilla standard commands.
         ####################################################################
-        
+
         self.esm = QSignalMapper(self)
         try:
             self.esm.mappedInt.connect(self.__textEdit.editorCommand)
         except AttributeError:
             # pre Qt 5.15
             self.esm.mapped[int].connect(self.__textEdit.editorCommand)
-        
+
         self.editorActGrp = createActionGroup(self)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Left')), 0,
-            self.editorActGrp, 'vm_edit_move_left_char')
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_char",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFT)
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+B"))
+            )
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Right')),
-            0, self.editorActGrp, 'vm_edit_move_right_char')
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Up')), 0,
-            self.editorActGrp, 'vm_edit_move_up_line')
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+P')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+P"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Down')), 0,
-            self.editorActGrp, 'vm_edit_move_down_line')
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+N')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+N"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one word part'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_left_word_part')
+            QCoreApplication.translate("ViewManager", "Move left one word part"),
+            QCoreApplication.translate("ViewManager", "Move left one word part"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Left"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one word part'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_right_word_part')
+            QCoreApplication.translate("ViewManager", "Move right one word part"),
+            QCoreApplication.translate("ViewManager", "Move right one word part"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Right"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_left_word')
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Left"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Left"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_right_word')
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Right"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Right"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
+                "ViewManager", "Move to first visible character in document line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_first_visible_char')
+                "ViewManager", "Move to first visible character in document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOME)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Move to start of display line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Move to start of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_start_line')
+            QCoreApplication.translate("ViewManager", "Move to start of display line"),
+            QCoreApplication.translate("ViewManager", "Move to start of display line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_start_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Left"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Move to end of document line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Move to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_line')
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view down one line'),
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Down')),
-            0, self.editorActGrp, 'vm_edit_scroll_down_line')
+            QCoreApplication.translate("ViewManager", "Scroll view down one line"),
+            QCoreApplication.translate("ViewManager", "Scroll view down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_down_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view up one line'),
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+Up')),
-            0, self.editorActGrp, 'vm_edit_scroll_up_line')
+            QCoreApplication.translate("ViewManager", "Scroll view up one line"),
+            QCoreApplication.translate("ViewManager", "Scroll view up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_up_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one paragraph'),
-            QCoreApplication.translate('ViewManager', 'Move up one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Alt+Up')),
-            0, self.editorActGrp, 'vm_edit_move_up_para')
+            QCoreApplication.translate("ViewManager", "Move up one paragraph"),
+            QCoreApplication.translate("ViewManager", "Move up one paragraph"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARAUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move down one paragraph'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move down one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Down')),
-            0, self.editorActGrp, 'vm_edit_move_down_para')
+            QCoreApplication.translate("ViewManager", "Move down one paragraph"),
+            QCoreApplication.translate("ViewManager", "Move down one paragraph"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARADOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgUp')), 0,
-            self.editorActGrp, 'vm_edit_move_up_page')
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgDown')),
-            0, self.editorActGrp, 'vm_edit_move_down_page')
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+V')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+V"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move to start of document'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move to start of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_start_text')
+            QCoreApplication.translate("ViewManager", "Move to start of document"),
+            QCoreApplication.translate("ViewManager", "Move to start of document"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_start_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Up')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Up"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTART)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move to end of document'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move to end of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_text')
+            QCoreApplication.translate("ViewManager", "Move to end of document"),
+            QCoreApplication.translate("ViewManager", "Move to end of document"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Down')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Down"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Tab')), 0,
-            self.editorActGrp, 'vm_edit_indent_one_level')
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Tab")),
+            0,
+            self.editorActGrp,
+            "vm_edit_indent_one_level",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_TAB)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Unindent one level'),
-            QCoreApplication.translate('ViewManager', 'Unindent one level'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Tab')),
-            0, self.editorActGrp, 'vm_edit_unindent_one_level')
+            QCoreApplication.translate("ViewManager", "Unindent one level"),
+            QCoreApplication.translate("ViewManager", "Unindent one level"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Tab")),
+            0,
+            self.editorActGrp,
+            "vm_edit_unindent_one_level",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_BACKTAB)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one character'),
+                "ViewManager", "Extend selection left one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Left')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_left_char')
+                "ViewManager", "Extend selection left one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+B"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection right one character'),
+                "ViewManager", "Extend selection right one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Right')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_right_char')
+                "ViewManager", "Extend selection right one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Up')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_up_line')
+            QCoreApplication.translate("ViewManager", "Extend selection up one line"),
+            QCoreApplication.translate("ViewManager", "Extend selection up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+P')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+P"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection down one line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Down')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_down_line')
+            QCoreApplication.translate("ViewManager", "Extend selection down one line"),
+            QCoreApplication.translate("ViewManager", "Extend selection down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+N')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+N"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection left one word part'),
+                "ViewManager", "Extend selection left one word part"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection left one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_left_word_part')
+                "ViewManager", "Extend selection left one word part"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Left")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection right one word part'),
+                "ViewManager", "Extend selection right one word part"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection right one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_right_word_part')
+                "ViewManager", "Extend selection right one word part"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_left_word')
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Left")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Left")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
+                "ViewManager", "Extend selection right one word"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_right_word')
+                "ViewManager", "Extend selection right one word"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_first_visible_char')
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
+                "ViewManager", "Extend selection to end of document line"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_line')
+                "ViewManager", "Extend selection to end of document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one paragraph'),
+                "ViewManager", "Extend selection up one paragraph"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+Up')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_up_para')
+                "ViewManager", "Extend selection up one paragraph"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARAUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one paragraph'),
+                "ViewManager", "Extend selection down one paragraph"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+Down')),
+                "ViewManager", "Extend selection down one paragraph"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+Down")),
             0,
-            self.editorActGrp, 'vm_edit_extend_selection_down_para')
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARADOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one page'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+PgUp')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_up_page')
+            QCoreApplication.translate("ViewManager", "Extend selection up one page"),
+            QCoreApplication.translate("ViewManager", "Extend selection up one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection down one page'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection down one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+PgDown')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_down_page')
+            QCoreApplication.translate("ViewManager", "Extend selection down one page"),
+            QCoreApplication.translate("ViewManager", "Extend selection down one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+V')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+V"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to start of document'),
+                "ViewManager", "Extend selection to start of document"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to start of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_start_text')
+                "ViewManager", "Extend selection to start of document"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_start_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Up')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+Up"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Home')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Home")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTARTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document'),
+                "ViewManager", "Extend selection to end of document"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_text')
+                "ViewManager", "Extend selection to end of document"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Down')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Down")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+End')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+End")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTENDEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Backspace')),
-            0, self.editorActGrp, 'vm_edit_delete_previous_char')
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Backspace")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_previous_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+H')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+H"))
+            )
         else:
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Backspace')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Shift+Backspace")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACK)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Delete previous character if not at start of line'),
+                "ViewManager", "Delete previous character if not at start of line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Delete previous character if not at start of line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_delet_previous_char_not_line_start')
+                "ViewManager", "Delete previous character if not at start of line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_delet_previous_char_not_line_start",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACKNOTLINE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Del')), 0,
-            self.editorActGrp, 'vm_edit_delete_current_char')
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_current_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+D')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+D"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CLEAR)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Backspace')),
-            0, self.editorActGrp, 'vm_edit_delete_word_left')
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Backspace")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_word_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Del')),
-            0, self.editorActGrp, 'vm_edit_delete_word_right')
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_word_right",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+Backspace')),
-            0, self.editorActGrp, 'vm_edit_delete_line_left')
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Shift+Backspace")
+            ),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_line_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINELEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_delete_line_right')
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_line_right",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+K')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+K"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Del')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Del")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINERIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Return')),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Enter')),
-            self.editorActGrp, 'vm_edit_insert_line')
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Return")),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Enter")),
+            self.editorActGrp,
+            "vm_edit_insert_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_NEWLINE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+L')),
-            0, self.editorActGrp, 'vm_edit_delete_current_line')
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+L")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDELETE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Duplicate current line'),
-            QCoreApplication.translate('ViewManager',
-                                       'Duplicate current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+D')),
-            0, self.editorActGrp, 'vm_edit_duplicate_current_line')
+            QCoreApplication.translate("ViewManager", "Duplicate current line"),
+            QCoreApplication.translate("ViewManager", "Duplicate current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+D")),
+            0,
+            self.editorActGrp,
+            "vm_edit_duplicate_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDUPLICATE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Swap current and previous lines'),
+                "ViewManager", "Swap current and previous lines"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Swap current and previous lines'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+T')),
-            0, self.editorActGrp, 'vm_edit_swap_current_previous_line')
+                "ViewManager", "Swap current and previous lines"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+T")),
+            0,
+            self.editorActGrp,
+            "vm_edit_swap_current_previous_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINETRANSPOSE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Reverse selected lines'),
-            QCoreApplication.translate('ViewManager',
-                                       'Reverse selected lines'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Meta+Alt+R')),
-            0, self.editorActGrp, 'vm_edit_reverse selected_lines')
+            QCoreApplication.translate("ViewManager", "Reverse selected lines"),
+            QCoreApplication.translate("ViewManager", "Reverse selected lines"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Alt+R")),
+            0,
+            self.editorActGrp,
+            "vm_edit_reverse selected_lines",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEREVERSE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Cut current line'),
-            QCoreApplication.translate('ViewManager', 'Cut current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+L')),
-            0, self.editorActGrp, 'vm_edit_cut_current_line')
+            QCoreApplication.translate("ViewManager", "Cut current line"),
+            QCoreApplication.translate("ViewManager", "Cut current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+L")),
+            0,
+            self.editorActGrp,
+            "vm_edit_cut_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINECUT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Copy current line'),
-            QCoreApplication.translate('ViewManager', 'Copy current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+T')),
-            0, self.editorActGrp, 'vm_edit_copy_current_line')
+            QCoreApplication.translate("ViewManager", "Copy current line"),
+            QCoreApplication.translate("ViewManager", "Copy current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+T")),
+            0,
+            self.editorActGrp,
+            "vm_edit_copy_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINECOPY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Toggle insert/overtype'),
-            QCoreApplication.translate('ViewManager',
-                                       'Toggle insert/overtype'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ins')), 0,
-            self.editorActGrp, 'vm_edit_toggle_insert_overtype')
+            QCoreApplication.translate("ViewManager", "Toggle insert/overtype"),
+            QCoreApplication.translate("ViewManager", "Toggle insert/overtype"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ins")),
+            0,
+            self.editorActGrp,
+            "vm_edit_toggle_insert_overtype",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_EDITTOGGLEOVERTYPE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Convert selection to lower case'),
+                "ViewManager", "Convert selection to lower case"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Convert selection to lower case'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+U')),
-            0, self.editorActGrp, 'vm_edit_convert_selection_lower')
+                "ViewManager", "Convert selection to lower case"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+U")),
+            0,
+            self.editorActGrp,
+            "vm_edit_convert_selection_lower",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LOWERCASE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Convert selection to upper case'),
+                "ViewManager", "Convert selection to upper case"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Convert selection to upper case'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+U')),
-            0, self.editorActGrp, 'vm_edit_convert_selection_upper')
+                "ViewManager", "Convert selection to upper case"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+U")),
+            0,
+            self.editorActGrp,
+            "vm_edit_convert_selection_upper",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_UPPERCASE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of display line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_displayed_line')
+            QCoreApplication.translate("ViewManager", "Move to end of display line"),
+            QCoreApplication.translate("ViewManager", "Move to end of display line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_displayed_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Right"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to end of display line'),
+                "ViewManager", "Extend selection to end of display line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to end of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_displayed_line')
+                "ViewManager", "Extend selection to end of display line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_displayed_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAYEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Formfeed'),
-            QCoreApplication.translate('ViewManager', 'Formfeed'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_formfeed')
+            QCoreApplication.translate("ViewManager", "Formfeed"),
+            QCoreApplication.translate("ViewManager", "Formfeed"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_formfeed",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_FORMFEED)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Esc')), 0,
-            self.editorActGrp, 'vm_edit_escape')
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Esc")),
+            0,
+            self.editorActGrp,
+            "vm_edit_escape",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CANCEL)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one line'),
+                "ViewManager", "Extend rectangular selection down one line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Ctrl+Down')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_down_line')
+                "ViewManager", "Extend rectangular selection down one line"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+N')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+N")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one line'),
+                "ViewManager", "Extend rectangular selection up one line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Ctrl+Up')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_up_line')
+                "ViewManager", "Extend rectangular selection up one line"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+P')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+P")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUPRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection left one character'),
+                "ViewManager", "Extend rectangular selection left one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Ctrl+Left')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_left_char')
+                "ViewManager", "Extend rectangular selection left one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_left_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+B')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+B")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection right one character'),
+                "ViewManager", "Extend rectangular selection right one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Ctrl+Right')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_right_char')
+                "ViewManager", "Extend rectangular selection right one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+F')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+F")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to first'
-                ' visible character in document line'),
+                "ViewManager",
+                "Extend rectangular selection to first"
+                " visible character in document line",
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to first'
-                ' visible character in document line'),
-            0, 0,
+                "ViewManager",
+                "Extend rectangular selection to first"
+                " visible character in document line",
+            ),
+            0,
+            0,
             self.editorActGrp,
-            'vm_edit_extend_rect_selection_first_visible_char')
+            "vm_edit_extend_rect_selection_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Home')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Home")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOMERECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to end of document line'),
+                "ViewManager", "Extend rectangular selection to end of document line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_end_line')
+                "ViewManager", "Extend rectangular selection to end of document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+E')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+E")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one page'),
+                "ViewManager", "Extend rectangular selection up one page"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+PgUp')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_up_page')
+                "ViewManager", "Extend rectangular selection up one page"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one page'),
+                "ViewManager", "Extend rectangular selection down one page"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+PgDown')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_down_page')
+                "ViewManager", "Extend rectangular selection down one page"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+V')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+V")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Duplicate current selection'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Duplicate current selection'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+D')),
-            0, self.editorActGrp, 'vm_edit_duplicate_current_selection')
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+D")),
+            0,
+            self.editorActGrp,
+            "vm_edit_duplicate_current_selection",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_SELECTIONDUPLICATE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_SCROLLTOSTART"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll to start of document'),
+                    "ViewManager", "Scroll to start of document"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll to start of document'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_start_text')
+                    "ViewManager", "Scroll to start of document"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_start_text",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Home')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Home"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_SCROLLTOSTART)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_SCROLLTOEND"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Scroll to end of document'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Scroll to end of document'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_end_text')
+                QCoreApplication.translate("ViewManager", "Scroll to end of document"),
+                QCoreApplication.translate("ViewManager", "Scroll to end of document"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_end_text",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'End')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "End"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_SCROLLTOEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VERTICALCENTRECARET"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll vertically to center current line'),
+                    "ViewManager", "Scroll vertically to center current line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll vertically to center current line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_vertically_center')
+                    "ViewManager", "Scroll vertically to center current line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_vertically_center",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+L')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Meta+L"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_VERTICALCENTRECARET)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDRIGHTEND"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Move to end of next word'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Move to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_end_next_word')
+                QCoreApplication.translate("ViewManager", "Move to end of next word"),
+                QCoreApplication.translate("ViewManager", "Move to end of next word"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Alt+Right')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Right"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDRIGHTENDEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of next word'),
+                    "ViewManager", "Extend selection to end of next word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_end_next_word')
+                    "ViewManager", "Extend selection to end of next word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Alt+Shift+Right')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTENDEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDLEFTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to end of previous word'),
+                    "ViewManager", "Move to end of previous word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to end of previous word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_end_previous_word')
+                    "ViewManager", "Move to end of previous word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_end_previous_word",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDLEFTENDEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of previous word'),
+                    "ViewManager", "Extend selection to end of previous word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of previous word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_end_previous_word')
+                    "ViewManager", "Extend selection to end of previous word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_end_previous_word",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTENDEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOME"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to start of document line'),
+                    "ViewManager", "Move to start of document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to start of document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_start_document_line')
+                    "ViewManager", "Move to start of document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_start_document_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+A')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Meta+A"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOME)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of document line'),
+                    "ViewManager", "Extend selection to start of document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of document line'),
-                0, 0,
+                    "ViewManager", "Extend selection to start of document line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_document_line')
+                "vm_edit_extend_selection_start_document_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+Shift+A')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Meta+Shift+A")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOME)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMERECTEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend rectangular selection to start of document line'),
+                    "ViewManager",
+                    "Extend rectangular selection to start of document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend rectangular selection to start of document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_rect_start_line')
+                    "ViewManager",
+                    "Extend rectangular selection to start of document line",
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_rect_start_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Meta+Alt+Shift+A')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+A")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMERECTEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEDISPLAYEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display line'),
+                    "ViewManager", "Extend selection to start of display line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display line'),
-                0, 0,
+                    "ViewManager", "Extend selection to start of display line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_display_line')
+                "vm_edit_extend_selection_start_display_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Ctrl+Shift+Left')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Ctrl+Shift+Left")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAYEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to start of display or document line'),
+                    "ViewManager", "Move to start of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to start of display or document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_start_display_document_line')
+                    "ViewManager", "Move to start of display or document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display or document line'),
+                    "ViewManager",
+                    "Extend selection to start of display or document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display or document line'),
-                0, 0,
+                    "ViewManager",
+                    "Extend selection to start of display or document line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_display_document_line')
+                "vm_edit_extend_selection_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VCHOMEWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to first visible character in display'
-                    ' or document line'),
+                    "ViewManager",
+                    "Move to first visible character in display" " or document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to first visible character in display'
-                    ' or document line'),
-                0, 0,
+                    "ViewManager",
+                    "Move to first visible character in display" " or document line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_move_first_visible_char_document_line')
+                "vm_edit_move_first_visible_char_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VCHOMEWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to first visible character in'
-                    ' display or document line'),
+                    "ViewManager",
+                    "Extend selection to first visible character in"
+                    " display or document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to first visible character in'
-                    ' display or document line'),
-                0, 0,
+                    "ViewManager",
+                    "Extend selection to first visible character in"
+                    " display or document line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_first_visible_char_document_line')
+                "vm_edit_extend_selection_first_visible_char_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_LINEENDWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to end of display or document line'),
+                    "ViewManager", "Move to end of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to end of display or document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_end_start_display_document_line')
+                    "ViewManager", "Move to end of display or document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_end_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_LINEENDWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_LINEENDWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to end of display or document line'),
+                    "ViewManager", "Extend selection to end of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to end of display or document line'),
-                0, 0,
+                    "ViewManager", "Extend selection to end of display or document line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_end_display_document_line')
+                "vm_edit_extend_selection_end_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_LINEENDWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEUP"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move up one page'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move up one page'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_stuttered_move_up_page')
+                QCoreApplication.translate("ViewManager", "Stuttered move up one page"),
+                QCoreApplication.translate("ViewManager", "Stuttered move up one page"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_stuttered_move_up_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEUP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEUPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Stuttered extend selection up one page'),
+                    "ViewManager", "Stuttered extend selection up one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Stuttered extend selection up one page'),
-                0, 0,
+                    "ViewManager", "Stuttered extend selection up one page"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_stuttered_extend_selection_up_page')
+                "vm_edit_stuttered_extend_selection_up_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEUPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEDOWN"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move down one page'),
+                    "ViewManager", "Stuttered move down one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move down one page'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_stuttered_move_down_page')
+                    "ViewManager", "Stuttered move down one page"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_stuttered_move_down_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEDOWN)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEDOWNEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Stuttered extend selection down one page'),
+                    "ViewManager", "Stuttered extend selection down one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Stuttered extend selection down one page'),
-                0, 0,
+                    "ViewManager", "Stuttered extend selection down one page"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_stuttered_extend_selection_down_page')
+                "vm_edit_stuttered_extend_selection_down_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEDOWNEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_DELWORDRIGHTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Delete right to end of next word'),
+                    "ViewManager", "Delete right to end of next word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Delete right to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_delete_right_end_next_word')
+                    "ViewManager", "Delete right to end of next word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_delete_right_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Alt+Del')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Del"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_MOVESELECTEDLINESUP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move selected lines up one line'),
+                    "ViewManager", "Move selected lines up one line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move selected lines up one line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_selection_up_one_line')
+                    "ViewManager", "Move selected lines up one line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_selection_up_one_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_MOVESELECTEDLINESUP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_MOVESELECTEDLINESDOWN"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move selected lines down one line'),
+                    "ViewManager", "Move selected lines down one line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move selected lines down one line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_selection_down_one_line')
+                    "ViewManager", "Move selected lines down one line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_selection_down_one_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_MOVESELECTEDLINESDOWN)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager',
-                'Duplicate current selection'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Duplicate current selection'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Shift+D')),
-            0, self.editorActGrp, 'vm_edit_duplicate_current_selection')
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+D")),
+            0,
+            self.editorActGrp,
+            "vm_edit_duplicate_current_selection",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_SELECTIONDUPLICATE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         self.__textEdit.addActions(self.editorActGrp.actions())
-    
+
     def __createSearchActions(self):
         """
         Private method defining the user interface actions for the search
             commands.
         """
         self.searchAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search'),
+            QCoreApplication.translate("ViewManager", "Search"),
             UI.PixmapCache.getIcon("find"),
-            QCoreApplication.translate('ViewManager', '&Search...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+F", "Search|Search")),
+            QCoreApplication.translate("ViewManager", "&Search..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+F", "Search|Search")
+            ),
             0,
-            self, 'vm_search')
+            self,
+            "vm_search",
+        )
         self.searchAct.setStatusTip(
-            QCoreApplication.translate('ViewManager', 'Search for a text'))
-        self.searchAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search</b>"""
-            """<p>Search for some text in the current editor. A"""
-            """ dialog is shown to enter the searchtext and options"""
-            """ for the search.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search for a text")
+        )
+        self.searchAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search</b>"""
+                """<p>Search for some text in the current editor. A"""
+                """ dialog is shown to enter the searchtext and options"""
+                """ for the search.</p>""",
+            )
+        )
         self.searchAct.triggered.connect(self.showSearchWidget)
         self.searchActions.append(self.searchAct)
-        
+
         self.searchNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search next'),
+            QCoreApplication.translate("ViewManager", "Search next"),
             UI.PixmapCache.getIcon("findNext"),
-            QCoreApplication.translate('ViewManager', 'Search &next'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "F3", "Search|Search next")),
+            QCoreApplication.translate("ViewManager", "Search &next"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "F3", "Search|Search next")
+            ),
             0,
-            self, 'vm_search_next')
-        self.searchNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search next occurrence of text'))
-        self.searchNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search next</b>"""
-            """<p>Search the next occurrence of some text in the current"""
-            """ editor. The previously entered searchtext and options are"""
-            """ reused.</p>"""
-        ))
+            self,
+            "vm_search_next",
+        )
+        self.searchNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search next occurrence of text")
+        )
+        self.searchNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search next</b>"""
+                """<p>Search the next occurrence of some text in the current"""
+                """ editor. The previously entered searchtext and options are"""
+                """ reused.</p>""",
+            )
+        )
         self.searchNextAct.triggered.connect(self.__searchNext)
         self.searchActions.append(self.searchNextAct)
-        
+
         self.searchPrevAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search previous'),
+            QCoreApplication.translate("ViewManager", "Search previous"),
             UI.PixmapCache.getIcon("findPrev"),
-            QCoreApplication.translate('ViewManager', 'Search &previous'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+F3", "Search|Search previous")),
+            QCoreApplication.translate("ViewManager", "Search &previous"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+F3", "Search|Search previous"
+                )
+            ),
             0,
-            self, 'vm_search_previous')
-        self.searchPrevAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search previous occurrence of text'))
-        self.searchPrevAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search previous</b>"""
-            """<p>Search the previous occurrence of some text in the"""
-            """ current editor. The previously entered searchtext and"""
-            """ options are reused.</p>"""
-        ))
+            self,
+            "vm_search_previous",
+        )
+        self.searchPrevAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search previous occurrence of text"
+            )
+        )
+        self.searchPrevAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search previous</b>"""
+                """<p>Search the previous occurrence of some text in the"""
+                """ current editor. The previously entered searchtext and"""
+                """ options are reused.</p>""",
+            )
+        )
         self.searchPrevAct.triggered.connect(self.__searchPrev)
         self.searchActions.append(self.searchPrevAct)
-        
+
         self.searchClearMarkersAct = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Clear search markers'),
+            QCoreApplication.translate("ViewManager", "Clear search markers"),
             UI.PixmapCache.getIcon("findClear"),
-            QCoreApplication.translate('ViewManager', 'Clear search markers'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+3", "Search|Clear search markers")),
+            QCoreApplication.translate("ViewManager", "Clear search markers"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+3", "Search|Clear search markers"
+                )
+            ),
             0,
-            self, 'vm_clear_search_markers')
-        self.searchClearMarkersAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear all displayed search markers'))
-        self.searchClearMarkersAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear search markers</b>"""
-            """<p>Clear all displayed search markers.</p>"""
-        ))
-        self.searchClearMarkersAct.triggered.connect(
-            self.__searchClearMarkers)
+            self,
+            "vm_clear_search_markers",
+        )
+        self.searchClearMarkersAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Clear all displayed search markers"
+            )
+        )
+        self.searchClearMarkersAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear search markers</b>"""
+                """<p>Clear all displayed search markers.</p>""",
+            )
+        )
+        self.searchClearMarkersAct.triggered.connect(self.__searchClearMarkers)
         self.searchActions.append(self.searchClearMarkersAct)
-        
+
         self.replaceAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Replace'),
-            QCoreApplication.translate('ViewManager', '&Replace...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+R", "Search|Replace")),
+            QCoreApplication.translate("ViewManager", "Replace"),
+            QCoreApplication.translate("ViewManager", "&Replace..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+R", "Search|Replace")
+            ),
             0,
-            self, 'vm_search_replace')
-        self.replaceAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace some text'))
-        self.replaceAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace</b>"""
-            """<p>Search for some text in the current editor and replace"""
-            """ it. A dialog is shown to enter the searchtext, the"""
-            """ replacement text and options for the search and replace.</p>"""
-        ))
+            self,
+            "vm_search_replace",
+        )
+        self.replaceAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace some text")
+        )
+        self.replaceAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace</b>"""
+                """<p>Search for some text in the current editor and replace"""
+                """ it. A dialog is shown to enter the searchtext, the"""
+                """ replacement text and options for the search and replace.</p>""",
+            )
+        )
         self.replaceAct.triggered.connect(self.showReplaceWidget)
         self.searchActions.append(self.replaceAct)
-        
+
         self.replaceAndSearchAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace and Search'),
+            QCoreApplication.translate("ViewManager", "Replace and Search"),
             UI.PixmapCache.getIcon("editReplaceSearch"),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace and Search'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Meta+R", "Search|Replace and Search")),
+            QCoreApplication.translate("ViewManager", "Replace and Search"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Meta+R", "Search|Replace and Search"
+                )
+            ),
             0,
-            self, 'vm_replace_search')
-        self.replaceAndSearchAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Replace the found text and search the next occurrence'))
-        self.replaceAndSearchAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace and Search</b>"""
-            """<p>Replace the found occurrence of text in the current"""
-            """ editor and search for the next one. The previously entered"""
-            """ search text and options are reused.</p>"""
-        ))
-        self.replaceAndSearchAct.triggered.connect(
-            self.__replaceWidget.replaceSearch)
+            self,
+            "vm_replace_search",
+        )
+        self.replaceAndSearchAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Replace the found text and search the next occurrence"
+            )
+        )
+        self.replaceAndSearchAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace and Search</b>"""
+                """<p>Replace the found occurrence of text in the current"""
+                """ editor and search for the next one. The previously entered"""
+                """ search text and options are reused.</p>""",
+            )
+        )
+        self.replaceAndSearchAct.triggered.connect(self.__replaceWidget.replaceSearch)
         self.searchActions.append(self.replaceAndSearchAct)
-        
+
         self.replaceSelectionAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace Occurrence'),
+            QCoreApplication.translate("ViewManager", "Replace Occurrence"),
             UI.PixmapCache.getIcon("editReplace"),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace Occurrence'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Meta+R", "Search|Replace Occurrence")),
+            QCoreApplication.translate("ViewManager", "Replace Occurrence"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Meta+R", "Search|Replace Occurrence"
+                )
+            ),
             0,
-            self, 'vm_replace_occurrence')
-        self.replaceSelectionAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace the found text'))
-        self.replaceSelectionAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace Occurrence</b>"""
-            """<p>Replace the found occurrence of the search text in the"""
-            """ current editor.</p>"""
-        ))
-        self.replaceSelectionAct.triggered.connect(
-            self.__replaceWidget.replace)
-        self.searchActions.append(self.replaceSelectionAct)
-        
-        self.replaceAllAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace All'),
-            UI.PixmapCache.getIcon("editReplaceAll"),
+            self,
+            "vm_replace_occurrence",
+        )
+        self.replaceSelectionAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace the found text")
+        )
+        self.replaceSelectionAct.setWhatsThis(
             QCoreApplication.translate(
-                'ViewManager', 'Replace All'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Meta+R", "Search|Replace All")),
+                "ViewManager",
+                """<b>Replace Occurrence</b>"""
+                """<p>Replace the found occurrence of the search text in the"""
+                """ current editor.</p>""",
+            )
+        )
+        self.replaceSelectionAct.triggered.connect(self.__replaceWidget.replace)
+        self.searchActions.append(self.replaceSelectionAct)
+
+        self.replaceAllAct = EricAction(
+            QCoreApplication.translate("ViewManager", "Replace All"),
+            UI.PixmapCache.getIcon("editReplaceAll"),
+            QCoreApplication.translate("ViewManager", "Replace All"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+Meta+R", "Search|Replace All"
+                )
+            ),
             0,
-            self, 'vm_replace_all')
-        self.replaceAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace search text occurrences'))
-        self.replaceAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace All</b>"""
-            """<p>Replace all occurrences of the search text in the current"""
-            """ editor.</p>"""
-        ))
-        self.replaceAllAct.triggered.connect(
-            self.__replaceWidget.replaceAll)
+            self,
+            "vm_replace_all",
+        )
+        self.replaceAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace search text occurrences")
+        )
+        self.replaceAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace All</b>"""
+                """<p>Replace all occurrences of the search text in the current"""
+                """ editor.</p>""",
+            )
+        )
+        self.replaceAllAct.triggered.connect(self.__replaceWidget.replaceAll)
         self.searchActions.append(self.replaceAllAct)
-    
+
     def __createViewActions(self):
         """
         Private method to create the View actions.
         """
         self.zoomInAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom in'),
+            QCoreApplication.translate("ViewManager", "Zoom in"),
             UI.PixmapCache.getIcon("zoomIn"),
-            QCoreApplication.translate('ViewManager', 'Zoom &in'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl++", "View|Zoom in")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom In", "View|Zoom in")),
-            self, 'vm_view_zoom_in')
-        self.zoomInAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom in on the text'))
-        self.zoomInAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom in</b>"""
-            """<p>Zoom in on the text. This makes the text bigger.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &in"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl++", "View|Zoom in")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom In", "View|Zoom in")
+            ),
+            self,
+            "vm_view_zoom_in",
+        )
+        self.zoomInAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom in on the text")
+        )
+        self.zoomInAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the text. This makes the text bigger.</p>""",
+            )
+        )
         self.zoomInAct.triggered.connect(self.__zoomIn)
         self.viewActions.append(self.zoomInAct)
-        
+
         self.zoomOutAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom out'),
+            QCoreApplication.translate("ViewManager", "Zoom out"),
             UI.PixmapCache.getIcon("zoomOut"),
-            QCoreApplication.translate('ViewManager', 'Zoom &out'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+-", "View|Zoom out")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom Out", "View|Zoom out")),
-            self, 'vm_view_zoom_out')
-        self.zoomOutAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom out on the text'))
-        self.zoomOutAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom out</b>"""
-            """<p>Zoom out on the text. This makes the text smaller.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &out"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+-", "View|Zoom out")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom Out", "View|Zoom out")
+            ),
+            self,
+            "vm_view_zoom_out",
+        )
+        self.zoomOutAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom out on the text")
+        )
+        self.zoomOutAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the text. This makes the text smaller.</p>""",
+            )
+        )
         self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.viewActions.append(self.zoomOutAct)
-        
+
         self.zoomResetAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom reset'),
+            QCoreApplication.translate("ViewManager", "Zoom reset"),
             UI.PixmapCache.getIcon("zoomReset"),
-            QCoreApplication.translate('ViewManager', 'Zoom &reset'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+0", "View|Zoom reset")),
+            QCoreApplication.translate("ViewManager", "Zoom &reset"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+0", "View|Zoom reset")
+            ),
             0,
-            self, 'vm_view_zoom_reset')
-        self.zoomResetAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Reset the zoom of the text'))
-        self.zoomResetAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom reset</b>"""
-            """<p>Reset the zoom of the text. """
-            """This sets the zoom factor to 100%.</p>"""
-        ))
+            self,
+            "vm_view_zoom_reset",
+        )
+        self.zoomResetAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Reset the zoom of the text")
+        )
+        self.zoomResetAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom reset</b>"""
+                """<p>Reset the zoom of the text. """
+                """This sets the zoom factor to 100%.</p>""",
+            )
+        )
         self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.viewActions.append(self.zoomResetAct)
-        
+
         self.zoomToAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom'),
+            QCoreApplication.translate("ViewManager", "Zoom"),
             UI.PixmapCache.getIcon("zoomTo"),
-            QCoreApplication.translate('ViewManager', '&Zoom'),
-            0, 0,
-            self, 'vm_view_zoom')
-        self.zoomToAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom the text'))
-        self.zoomToAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom</b>"""
-            """<p>Zoom the text. This opens a dialog where the"""
-            """ desired size can be entered.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Zoom"),
+            0,
+            0,
+            self,
+            "vm_view_zoom",
+        )
+        self.zoomToAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom the text")
+        )
+        self.zoomToAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom</b>"""
+                """<p>Zoom the text. This opens a dialog where the"""
+                """ desired size can be entered.</p>""",
+            )
+        )
         self.zoomToAct.triggered.connect(self.__zoom)
         self.viewActions.append(self.zoomToAct)
-    
+
     def __createHelpActions(self):
         """
         Private method to create the Help actions.
         """
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'about_eric')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "about_eric"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.helpActions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'about_qt')
+            self.tr("About Qt"), self.tr("About &Qt"), 0, 0, self, "about_qt"
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.helpActions.append(self.aboutQtAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1", "Help|What's This?'")),
-            0, self, 'help_help_whats_this')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be"""
-            """ accessed using the context help button in the titlebar."""
-            """</p>"""
-        ))
+            0,
+            self,
+            "help_help_whats_this",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be"""
+                """ accessed using the context help button in the titlebar."""
+                """</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.helpActions.append(self.whatsThisAct)
-    
+
     def __createConfigActions(self):
         """
         Private method to create the Settings actions.
         """
         self.prefAct = EricAction(
-            self.tr('Preferences'),
+            self.tr("Preferences"),
             UI.PixmapCache.getIcon("configure"),
-            self.tr('&Preferences...'),
-            0, 0, self, 'hexEditor_settings_preferences')
-        self.prefAct.setStatusTip(self.tr(
-            'Set the prefered configuration'))
-        self.prefAct.setWhatsThis(self.tr(
-            """<b>Preferences</b>"""
-            """<p>Set the configuration items of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("&Preferences..."),
+            0,
+            0,
+            self,
+            "hexEditor_settings_preferences",
+        )
+        self.prefAct.setStatusTip(self.tr("Set the prefered configuration"))
+        self.prefAct.setWhatsThis(
+            self.tr(
+                """<b>Preferences</b>"""
+                """<p>Set the configuration items of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.prefAct.triggered.connect(self.__showPreferences)
         self.prefAct.setMenuRole(QAction.MenuRole.PreferencesRole)
         self.configActions.append(self.prefAct)
-    
+
     def __createMenus(self):
         """
         Private method to create the menus of the menu bar.
@@ -2476,7 +2941,7 @@
         self.fileMenu.addAction(self.printAct)
         self.fileMenu.addSeparator()
         self.fileMenu.addAction(self.closeAct)
-        
+
         self.editMenu = self.menuBar().addMenu(self.tr("&Edit"))
         self.editMenu.addAction(self.undoAct)
         self.editMenu.addAction(self.redoAct)
@@ -2486,7 +2951,7 @@
         self.editMenu.addAction(self.pasteAct)
         self.editMenu.addAction(self.deleteAct)
         self.editMenu.addSeparator()
-        
+
         self.searchMenu = self.menuBar().addMenu(self.tr("&Search"))
         self.searchMenu.addAction(self.searchAct)
         self.searchMenu.addAction(self.searchNextAct)
@@ -2496,26 +2961,26 @@
         self.searchMenu.addAction(self.replaceAndSearchAct)
         self.searchMenu.addAction(self.replaceSelectionAct)
         self.searchMenu.addAction(self.replaceAllAct)
-        
+
         self.viewMenu = self.menuBar().addMenu(self.tr("&View"))
         self.viewMenu.addAction(self.zoomInAct)
         self.viewMenu.addAction(self.zoomOutAct)
         self.viewMenu.addAction(self.zoomResetAct)
         self.viewMenu.addAction(self.zoomToAct)
-        
+
         self.settingsMenu = self.menuBar().addMenu(self.tr("Se&ttings"))
         self.settingsMenu.addAction(self.prefAct)
-       
+
         self.menuBar().addSeparator()
-        
+
         self.helpMenu = self.menuBar().addMenu(self.tr("&Help"))
         self.helpMenu.addAction(self.aboutAct)
         self.helpMenu.addAction(self.aboutQtAct)
         self.helpMenu.addSeparator()
         self.helpMenu.addAction(self.whatsThisAct)
-        
+
         self.__initContextMenu()
-    
+
     def __createToolBars(self):
         """
         Private method to create the various toolbars.
@@ -2532,7 +2997,7 @@
         filetb.addAction(self.printAct)
         filetb.addSeparator()
         filetb.addAction(self.closeAct)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setIconSize(UI.Config.ToolBarIconSize)
         edittb.addAction(self.undoAct)
@@ -2542,29 +3007,29 @@
         edittb.addAction(self.copyAct)
         edittb.addAction(self.pasteAct)
         edittb.addAction(self.deleteAct)
-        
+
         findtb = self.addToolBar(self.tr("Search"))
         findtb.setIconSize(UI.Config.ToolBarIconSize)
         findtb.addAction(self.searchAct)
         findtb.addAction(self.searchNextAct)
         findtb.addAction(self.searchPrevAct)
         findtb.addAction(self.searchClearMarkersAct)
-        
+
         viewtb = self.addToolBar(self.tr("View"))
         viewtb.setIconSize(UI.Config.ToolBarIconSize)
         viewtb.addAction(self.zoomInAct)
         viewtb.addAction(self.zoomOutAct)
         viewtb.addAction(self.zoomResetAct)
         viewtb.addAction(self.zoomToAct)
-        
+
         settingstb = self.addToolBar(self.tr("Settings"))
         settingstb.setIconSize(UI.Config.ToolBarIconSize)
         settingstb.addAction(self.prefAct)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-    
+
     def __createStatusBar(self):
         """
         Private method to initialize the status bar.
@@ -2574,57 +3039,74 @@
 
         self.sbLanguage = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbLanguage)
-        self.sbLanguage.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the"""
-            """ editor language.</p>"""
-        ))
+        self.sbLanguage.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the"""
+                """ editor language.</p>"""
+            )
+        )
         self.sbLanguage.clicked.connect(self.__showLanguagesMenu)
 
         self.sbWritable = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbWritable)
-        self.sbWritable.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays an indication of the"""
-            """ editors files writability.</p>"""
-        ))
+        self.sbWritable.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays an indication of the"""
+                """ editors files writability.</p>"""
+            )
+        )
 
         self.sbLine = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbLine)
-        self.sbLine.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the line number of"""
-            """ the editor.</p>"""
-        ))
+        self.sbLine.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the line number of"""
+                """ the editor.</p>"""
+            )
+        )
 
         self.sbPos = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbPos)
-        self.sbPos.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the cursor position"""
-            """ of the editor.</p>"""
-        ))
-        
+        self.sbPos.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the cursor position"""
+                """ of the editor.</p>"""
+            )
+        )
+
         self.sbZoom = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
             UI.PixmapCache.getPixmap("zoomReset"),
-            self.__statusBar)
+            self.__statusBar,
+        )
         self.__statusBar.addPermanentWidget(self.sbZoom)
-        self.sbZoom.setWhatsThis(self.tr(
-            """<p>This part of the status bar allows zooming the editor."""
-            """</p>"""
-        ))
+        self.sbZoom.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar allows zooming the editor."""
+                """</p>"""
+            )
+        )
         self.sbZoom.valueChanged.connect(self.__zoomTo)
-        
+
         self.__statusBar.showMessage(self.tr("Ready"))
-    
+
     def __showPreferences(self):
         """
         Private slot to set the preferences.
         """
         from Preferences.ConfigurationDialog import (
-            ConfigurationDialog, ConfigurationMode
+            ConfigurationDialog,
+            ConfigurationMode,
         )
+
         dlg = ConfigurationDialog(
-            None, 'Configuration', True, fromEric=True,
-            displayMode=ConfigurationMode.EDITORMODE)
+            None,
+            "Configuration",
+            True,
+            fromEric=True,
+            displayMode=ConfigurationMode.EDITORMODE,
+        )
         dlg.preferencesChanged.connect(self.__preferencesChanged)
         dlg.show()
         dlg.showConfigurationPageByName("interfacePage")
@@ -2634,17 +3116,18 @@
             dlg.setPreferences()
             Preferences.syncPreferences()
             self.__preferencesChanged()
-    
+
     @pyqtSlot()
     def __preferencesChanged(self):
         """
         Private slot to handle a configuration change.
         """
         self.__loadConfiguration()
-        
+
         self.__markOccurrencesTimer.setInterval(
-            Preferences.getEditor("MarkOccurrencesTimeout"))
-    
+            Preferences.getEditor("MarkOccurrencesTimeout")
+        )
+
     @pyqtSlot()
     def __loadConfiguration(self):
         """
@@ -2653,7 +3136,7 @@
         self.__setTextDisplay()
         self.__setMargins()
         self.__setEolMode()
-    
+
     def __readSettings(self):
         """
         Private method to read the settings remembered last time.
@@ -2663,7 +3146,7 @@
         size = settings.value("MiniEditor/Size", QSize(800, 600))
         self.resize(size)
         self.move(pos)
-    
+
     def __writeSettings(self):
         """
         Private method to write the settings for reuse.
@@ -2671,11 +3154,11 @@
         settings = Preferences.getSettings()
         settings.setValue("MiniEditor/Position", self.pos())
         settings.setValue("MiniEditor/Size", self.size())
-    
+
     def __maybeSave(self):
         """
         Private method to ask the user to save the file, if it was modified.
-        
+
         @return flag indicating, if it is ok to continue (boolean)
         """
         if self.__textEdit.isModified():
@@ -2683,68 +3166,71 @@
                 self,
                 self.tr("eric Mini Editor"),
                 self.tr("The document has unsaved changes."),
-                self.__save)
+                self.__save,
+            )
             return ret
         return True
-    
+
     def __loadFile(self, fileName, filetype=None):
         """
         Private method to load the given file.
-        
+
         @param fileName name of the file to load (string)
         @param filetype type of the source file (string)
         """
         self.__loadEditorConfig(fileName=fileName)
-        
+
         try:
             with EricOverrideCursor():
-                encoding = self.__getEditorConfig("DefaultEncoding",
-                                                  nodefault=True)
+                encoding = self.__getEditorConfig("DefaultEncoding", nodefault=True)
                 if encoding:
                     txt, self.encoding = Utilities.readEncodedFileWithEncoding(
-                        fileName, encoding)
+                        fileName, encoding
+                    )
                 else:
                     txt, self.encoding = Utilities.readEncodedFile(fileName)
         except (UnicodeDecodeError, OSError) as why:
             EricMessageBox.critical(
-                self, self.tr('Open File'),
-                self.tr('<p>The file <b>{0}</b> could not be opened.</p>'
-                        '<p>Reason: {1}</p>')
-                .format(fileName, str(why)))
+                self,
+                self.tr("Open File"),
+                self.tr(
+                    "<p>The file <b>{0}</b> could not be opened.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(fileName, str(why)),
+            )
             return
-        
+
         with EricOverrideCursor():
             self.__textEdit.setText(txt)
-            
+
             if filetype is None:
                 self.filetype = ""
             else:
                 self.filetype = filetype
             self.__setCurrentFile(fileName)
-            
+
             self.__textEdit.setModified(False)
             self.setWindowModified(False)
-            
+
             self.__convertTabs()
-            
+
             eolMode = self.__getEditorConfig("EOLMode", nodefault=True)
             if eolMode is None:
                 fileEol = self.__textEdit.detectEolString(txt)
                 self.__textEdit.setEolModeByEolString(fileEol)
             else:
                 self.__textEdit.convertEols(eolMode)
-        
+
         self.__statusBar.showMessage(self.tr("File loaded"), 2000)
-    
+
     def __convertTabs(self):
         """
         Private slot to convert tabulators to spaces.
         """
         if (
-            (not self.__getEditorConfig("TabForIndentation")) and
-            Preferences.getEditor("ConvertTabsOnLoad") and
-            not (self.lexer_ and
-                 self.lexer_.alwaysKeepTabs())
+            (not self.__getEditorConfig("TabForIndentation"))
+            and Preferences.getEditor("ConvertTabsOnLoad")
+            and not (self.lexer_ and self.lexer_.alwaysKeepTabs())
         ):
             txt = self.__textEdit.text()
             txtExpanded = txt.expandtabs(self.__getEditorConfig("TabWidth"))
@@ -2752,126 +3238,129 @@
                 self.__textEdit.beginUndoAction()
                 self.__textEdit.setText(txt)
                 self.__textEdit.endUndoAction()
-                
+
                 self.__textEdit.setModified(True)
                 self.setWindowModified(True)
 
     def __saveFile(self, fileName):
         """
         Private method to save to the given file.
-        
+
         @param fileName name of the file to save to
         @type str
         @return flag indicating success
         @rtype bool
         """
         res = self.__writeFile(fileName)
-        
+
         if res:
             self.editorSaved.emit()
             self.__setCurrentFile(fileName)
-        
+
         self.__checkActions()
-        
+
         return res
-    
+
     def __writeFile(self, fileName):
         """
         Private method to write the current editor text to a file.
-        
+
         @param fileName name of the file to be written to
         @type str
         @return flag indicating success
         @rtype bool
         """
         config = self.__loadEditorConfigObject(fileName)
-        
+
         eol = self.__getEditorConfig("EOLMode", nodefault=True, config=config)
         if eol is not None:
             self.__textEdit.convertEols(eol)
-        
+
         if self.__getEditorConfig("StripTrailingWhitespace", config=config):
             self.__textEdit.removeTrailingWhitespace()
-        
+
         txt = self.__textEdit.text()
-        
+
         if self.__getEditorConfig("InsertFinalNewline", config=config):
             eol = self.__textEdit.getLineSeparator()
             if eol:
                 if len(txt) >= len(eol):
-                    if txt[-len(eol):] != eol:
+                    if txt[-len(eol) :] != eol:
                         txt += eol
                 else:
                     txt += eol
-        
+
         # now write text to the file
         try:
             with EricOverrideCursor():
                 editorConfigEncoding = self.__getEditorConfig(
-                    "DefaultEncoding", nodefault=True, config=config)
+                    "DefaultEncoding", nodefault=True, config=config
+                )
                 self.encoding = Utilities.writeEncodedFile(
-                    fileName, txt, self.encoding,
-                    forcedEncoding=editorConfigEncoding)
+                    fileName, txt, self.encoding, forcedEncoding=editorConfigEncoding
+                )
         except (OSError, Utilities.CodingError, UnicodeError) as why:
             EricMessageBox.critical(
-                self, self.tr('Save File'),
-                self.tr('<p>The file <b>{0}</b> could not be saved.<br/>'
-                        'Reason: {1}</p>')
-                .format(fileName, str(why)))
+                self,
+                self.tr("Save File"),
+                self.tr(
+                    "<p>The file <b>{0}</b> could not be saved.<br/>" "Reason: {1}</p>"
+                ).format(fileName, str(why)),
+            )
             return False
-        
+
         self.__statusBar.showMessage(self.tr("File saved"), 2000)
-        
+
         return True
-    
+
     def setWindowModified(self, modified):
         """
         Public method to set the window modification status.
-        
+
         @param modified flag indicating the modification status
         @type bool
         """
         if "[*]" not in self.windowTitle():
-            self.setWindowTitle(self.tr("[*] - {0}")
-                                .format(self.tr("Mini Editor")))
+            self.setWindowTitle(self.tr("[*] - {0}").format(self.tr("Mini Editor")))
         super().setWindowModified(modified)
-        
+
     def __setCurrentFile(self, fileName):
         """
         Private method to register the file name of the current file.
-        
+
         @param fileName name of the file to register (string)
         """
         self.__curFile = fileName
-        
+
         shownName = (
             self.tr("Untitled")
-            if not self.__curFile else
-            self.__strippedName(self.__curFile)
+            if not self.__curFile
+            else self.__strippedName(self.__curFile)
         )
-        
-        self.setWindowTitle(self.tr("{0}[*] - {1}")
-                            .format(shownName, self.tr("Mini Editor")))
-        
+
+        self.setWindowTitle(
+            self.tr("{0}[*] - {1}").format(shownName, self.tr("Mini Editor"))
+        )
+
         self.__textEdit.setModified(False)
         self.setWindowModified(False)
-        
+
         self.setLanguage(self.__bindName(self.__textEdit.text(0)))
-        
+
         self.__loadEditorConfig()
 
     def getFileName(self):
         """
         Public method to return the name of the file being displayed.
-        
+
         @return filename of the displayed file (string)
         """
         return self.__curFile
-    
+
     def __strippedName(self, fullFileName):
         """
         Private method to return the filename part of the given path.
-        
+
         @param fullFileName full pathname of the given file (string)
         @return filename part (string)
         """
@@ -2880,68 +3369,69 @@
     def __modificationChanged(self, m):
         """
         Private slot to handle the modificationChanged signal.
-        
+
         @param m modification status
         """
         self.setWindowModified(m)
         self.__checkActions()
-    
+
     def __cursorPositionChanged(self, line, pos):
         """
         Private slot to handle the cursorPositionChanged signal.
-        
+
         @param line line number of the cursor
         @param pos position in line of the cursor
         """
         lang = self.getLanguage()
         self.__setSbFile(line + 1, pos, lang)
-        
+
         if Preferences.getEditor("MarkOccurrencesEnabled"):
             self.__markOccurrencesTimer.stop()
             self.__markOccurrencesTimer.start()
-        
+
         if self.__lastLine != line:
             self.cursorLineChanged.emit(line)
             self.__lastLine = line
-    
+
     def __undo(self):
         """
         Private method to undo the last recorded change.
         """
         self.__textEdit.undo()
         self.__checkActions()
-    
+
     def __redo(self):
         """
         Private method to redo the last recorded change.
         """
         self.__textEdit.redo()
         self.__checkActions()
-    
+
     def __selectAll(self):
         """
         Private slot handling the select all context menu action.
         """
         self.__textEdit.selectAll(True)
-    
+
     def __deselectAll(self):
         """
         Private slot handling the deselect all context menu action.
         """
         self.__textEdit.selectAll(False)
-    
+
     def __setMargins(self):
         """
         Private method to configure the margins.
         """
         # set the settings for all margins
-        self.__textEdit.setMarginsFont(
-            Preferences.getEditorOtherFonts("MarginsFont"))
+        self.__textEdit.setMarginsFont(Preferences.getEditorOtherFonts("MarginsFont"))
         self.__textEdit.setMarginsForegroundColor(
-            Preferences.getEditorColour("MarginsForeground"))
+            Preferences.getEditorColour("MarginsForeground")
+        )
         self.__textEdit.setMarginsBackgroundColor(
-            Preferences.getEditorColour("MarginsBackground"))
-        
+            Preferences.getEditorColour("MarginsBackground")
+        )
+
         # set margin 0 settings
         linenoMargin = Preferences.getEditor("LinenoMargin")
         self.__textEdit.setMarginLineNumbers(0, linenoMargin)
@@ -2949,10 +3439,10 @@
             self.__resizeLinenoMargin()
         else:
             self.__textEdit.setMarginWidth(0, 16)
-        
+
         # set margin 1 settings
         self.__textEdit.setMarginWidth(1, 0)
-        
+
         # set margin 2 settings
         self.__textEdit.setMarginWidth(2, 16)
         if Preferences.getEditor("FoldingMargin"):
@@ -2960,14 +3450,15 @@
             self.__textEdit.setFolding(folding)
             self.__textEdit.setFoldMarginColors(
                 Preferences.getEditorColour("FoldmarginBackground"),
-                Preferences.getEditorColour("FoldmarginBackground"))
+                Preferences.getEditorColour("FoldmarginBackground"),
+            )
             self.__textEdit.setFoldMarkersColors(
                 Preferences.getEditorColour("FoldMarkersForeground"),
-                Preferences.getEditorColour("FoldMarkersBackground"))
+                Preferences.getEditorColour("FoldMarkersBackground"),
+            )
         else:
-            self.__textEdit.setFolding(
-                QsciScintilla.FoldStyle.NoFoldStyle.value)
-    
+            self.__textEdit.setFolding(QsciScintilla.FoldStyle.NoFoldStyle.value)
+
     def __resizeLinenoMargin(self):
         """
         Private slot to resize the line numbers margin.
@@ -2975,89 +3466,99 @@
         linenoMargin = Preferences.getEditor("LinenoMargin")
         if linenoMargin:
             self.__textEdit.setMarginWidth(
-                0, '8' * (len(str(self.__textEdit.lines())) + 1))
-    
+                0, "8" * (len(str(self.__textEdit.lines())) + 1)
+            )
+
     def __setTabAndIndent(self):
         """
         Private method to set indentation size and style and tab width.
         """
         self.__textEdit.setTabWidth(self.__getEditorConfig("TabWidth"))
-        self.__textEdit.setIndentationWidth(
-            self.__getEditorConfig("IndentWidth"))
+        self.__textEdit.setIndentationWidth(self.__getEditorConfig("IndentWidth"))
         if self.lexer_ and self.lexer_.alwaysKeepTabs():
             self.__textEdit.setIndentationsUseTabs(True)
         else:
             self.__textEdit.setIndentationsUseTabs(
-                self.__getEditorConfig("TabForIndentation"))
-    
+                self.__getEditorConfig("TabForIndentation")
+            )
+
     def __setTextDisplay(self):
         """
         Private method to configure the text display.
         """
         self.__setTabAndIndent()
-        
+
         self.__textEdit.setTabIndents(Preferences.getEditor("TabIndents"))
-        self.__textEdit.setBackspaceUnindents(
-            Preferences.getEditor("TabIndents"))
-        self.__textEdit.setIndentationGuides(
-            Preferences.getEditor("IndentationGuides"))
+        self.__textEdit.setBackspaceUnindents(Preferences.getEditor("TabIndents"))
+        self.__textEdit.setIndentationGuides(Preferences.getEditor("IndentationGuides"))
         self.__textEdit.setIndentationGuidesBackgroundColor(
-            Preferences.getEditorColour("IndentationGuidesBackground"))
+            Preferences.getEditorColour("IndentationGuidesBackground")
+        )
         self.__textEdit.setIndentationGuidesForegroundColor(
-            Preferences.getEditorColour("IndentationGuidesForeground"))
+            Preferences.getEditorColour("IndentationGuidesForeground")
+        )
         if Preferences.getEditor("ShowWhitespace"):
             self.__textEdit.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsVisible)
+                QsciScintilla.WhitespaceVisibility.WsVisible
+            )
             self.__textEdit.setWhitespaceForegroundColor(
-                Preferences.getEditorColour("WhitespaceForeground"))
+                Preferences.getEditorColour("WhitespaceForeground")
+            )
             self.__textEdit.setWhitespaceBackgroundColor(
-                Preferences.getEditorColour("WhitespaceBackground"))
-            self.__textEdit.setWhitespaceSize(
-                Preferences.getEditor("WhitespaceSize"))
+                Preferences.getEditorColour("WhitespaceBackground")
+            )
+            self.__textEdit.setWhitespaceSize(Preferences.getEditor("WhitespaceSize"))
         else:
             self.__textEdit.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsInvisible)
+                QsciScintilla.WhitespaceVisibility.WsInvisible
+            )
         self.__textEdit.setEolVisibility(Preferences.getEditor("ShowEOL"))
         self.__textEdit.setAutoIndent(Preferences.getEditor("AutoIndentation"))
         if Preferences.getEditor("BraceHighlighting"):
-            self.__textEdit.setBraceMatching(
-                QsciScintilla.BraceMatch.SloppyBraceMatch)
+            self.__textEdit.setBraceMatching(QsciScintilla.BraceMatch.SloppyBraceMatch)
         else:
-            self.__textEdit.setBraceMatching(
-                QsciScintilla.BraceMatch.NoBraceMatch)
+            self.__textEdit.setBraceMatching(QsciScintilla.BraceMatch.NoBraceMatch)
         self.__textEdit.setMatchedBraceForegroundColor(
-            Preferences.getEditorColour("MatchingBrace"))
+            Preferences.getEditorColour("MatchingBrace")
+        )
         self.__textEdit.setMatchedBraceBackgroundColor(
-            Preferences.getEditorColour("MatchingBraceBack"))
+            Preferences.getEditorColour("MatchingBraceBack")
+        )
         self.__textEdit.setUnmatchedBraceForegroundColor(
-            Preferences.getEditorColour("NonmatchingBrace"))
+            Preferences.getEditorColour("NonmatchingBrace")
+        )
         self.__textEdit.setUnmatchedBraceBackgroundColor(
-            Preferences.getEditorColour("NonmatchingBraceBack"))
+            Preferences.getEditorColour("NonmatchingBraceBack")
+        )
         if Preferences.getEditor("CustomSelectionColours"):
             self.__textEdit.setSelectionBackgroundColor(
-                Preferences.getEditorColour("SelectionBackground"))
+                Preferences.getEditorColour("SelectionBackground")
+            )
         else:
             self.__textEdit.setSelectionBackgroundColor(
-                QApplication.palette().color(QPalette.ColorRole.Highlight))
+                QApplication.palette().color(QPalette.ColorRole.Highlight)
+            )
         if Preferences.getEditor("ColourizeSelText"):
             self.__textEdit.resetSelectionForegroundColor()
         elif Preferences.getEditor("CustomSelectionColours"):
             self.__textEdit.setSelectionForegroundColor(
-                Preferences.getEditorColour("SelectionForeground"))
+                Preferences.getEditorColour("SelectionForeground")
+            )
         else:
             self.__textEdit.setSelectionForegroundColor(
-                QApplication.palette().color(
-                    QPalette.ColorRole.HighlightedText))
-        self.__textEdit.setSelectionToEol(
-            Preferences.getEditor("ExtendSelectionToEol"))
+                QApplication.palette().color(QPalette.ColorRole.HighlightedText)
+            )
+        self.__textEdit.setSelectionToEol(Preferences.getEditor("ExtendSelectionToEol"))
         self.__textEdit.setCaretForegroundColor(
-            Preferences.getEditorColour("CaretForeground"))
+            Preferences.getEditorColour("CaretForeground")
+        )
         self.__textEdit.setCaretLineBackgroundColor(
-            Preferences.getEditorColour("CaretLineBackground"))
-        self.__textEdit.setCaretLineVisible(
-            Preferences.getEditor("CaretLineVisible"))
+            Preferences.getEditorColour("CaretLineBackground")
+        )
+        self.__textEdit.setCaretLineVisible(Preferences.getEditor("CaretLineVisible"))
         self.__textEdit.setCaretLineAlwaysVisible(
-            Preferences.getEditor("CaretLineAlwaysVisible"))
+            Preferences.getEditor("CaretLineAlwaysVisible")
+        )
         self.caretWidth = Preferences.getEditor("CaretWidth")
         self.__textEdit.setCaretWidth(self.caretWidth)
         self.caretLineFrameWidth = Preferences.getEditor("CaretLineFrameWidth")
@@ -3070,46 +3571,44 @@
         if edgeMode:
             self.__textEdit.setEdgeColumn(Preferences.getEditor("EdgeColumn"))
             self.__textEdit.setEdgeColor(Preferences.getEditorColour("Edge"))
-        
+
         wrapVisualFlag = Preferences.getEditor("WrapVisualFlag")
         self.__textEdit.setWrapMode(Preferences.getEditor("WrapLongLinesMode"))
         self.__textEdit.setWrapVisualFlags(wrapVisualFlag, wrapVisualFlag)
-        self.__textEdit.setWrapIndentMode(
-            Preferences.getEditor("WrapIndentMode"))
-        self.__textEdit.setWrapStartIndent(
-            Preferences.getEditor("WrapStartIndent"))
-        
+        self.__textEdit.setWrapIndentMode(Preferences.getEditor("WrapIndentMode"))
+        self.__textEdit.setWrapStartIndent(Preferences.getEditor("WrapStartIndent"))
+
         self.searchIndicator = QsciScintilla.INDIC_CONTAINER
         self.__textEdit.indicatorDefine(
-            self.searchIndicator, QsciScintilla.INDIC_BOX,
-            Preferences.getEditorColour("SearchMarkers"))
-        
+            self.searchIndicator,
+            QsciScintilla.INDIC_BOX,
+            Preferences.getEditorColour("SearchMarkers"),
+        )
+
         self.__textEdit.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         if Preferences.getEditor("OverrideEditAreaColours"):
-            self.__textEdit.setColor(
-                Preferences.getEditorColour("EditAreaForeground"))
-            self.__textEdit.setPaper(
-                Preferences.getEditorColour("EditAreaBackground"))
-        
+            self.__textEdit.setColor(Preferences.getEditorColour("EditAreaForeground"))
+            self.__textEdit.setPaper(Preferences.getEditorColour("EditAreaBackground"))
+
         self.__textEdit.setVirtualSpaceOptions(
-            Preferences.getEditor("VirtualSpaceOptions"))
-        
+            Preferences.getEditor("VirtualSpaceOptions")
+        )
+
         # to avoid errors due to line endings by pasting
-        self.__textEdit.SendScintilla(
-            QsciScintilla.SCI_SETPASTECONVERTENDINGS, True)
-    
+        self.__textEdit.SendScintilla(QsciScintilla.SCI_SETPASTECONVERTENDINGS, True)
+
     def __setEolMode(self):
         """
         Private method to configure the eol mode of the editor.
         """
         eolMode = self.__getEditorConfig("EOLMode")
         self.__textEdit.setEolMode(eolMode)
-        
+
     def __setMonospaced(self, on):
         """
         Private method to set/reset a monospaced font.
-        
+
         @param on flag to indicate usage of a monospace font (boolean)
         """
         if on:
@@ -3120,38 +3619,33 @@
             if not self.lexer_:
                 self.__textEdit.clearStyles()
                 self.__setMargins()
-            self.__textEdit.setFont(
-                Preferences.getEditorOtherFonts("DefaultFont"))
-        
+            self.__textEdit.setFont(Preferences.getEditorOtherFonts("DefaultFont"))
+
         self.useMonospaced = on
-    
+
     def __printFile(self):
         """
         Private slot to print the text.
         """
         from .Printer import Printer
+
         printer = Printer(mode=QPrinter.PrinterMode.HighResolution)
         sb = self.statusBar()
         printDialog = QPrintDialog(printer, self)
         if self.__textEdit.hasSelectedText():
             printDialog.setOption(
-                QAbstractPrintDialog.PrintDialogOption.PrintSelection,
-                True)
+                QAbstractPrintDialog.PrintDialogOption.PrintSelection, True
+            )
         if printDialog.exec() == QDialog.DialogCode.Accepted:
-            sb.showMessage(self.tr('Printing...'))
+            sb.showMessage(self.tr("Printing..."))
             QApplication.processEvents()
             if self.__curFile:
                 printer.setDocName(pathlib.Path(self.__curFile).name)
             else:
                 printer.setDocName(self.tr("Untitled"))
-            if (
-                printDialog.printRange() ==
-                QAbstractPrintDialog.PrintRange.Selection
-            ):
+            if printDialog.printRange() == QAbstractPrintDialog.PrintRange.Selection:
                 # get the selection
-                fromLine, fromIndex, toLine, toIndex = (
-                    self.__textEdit.getSelection()
-                )
+                fromLine, fromIndex, toLine, toIndex = self.__textEdit.getSelection()
                 if toIndex == 0:
                     toLine -= 1
                 # QScintilla seems to print one line more than told
@@ -3159,21 +3653,21 @@
             else:
                 res = printer.printRange(self.__textEdit)
             if res:
-                sb.showMessage(self.tr('Printing completed'), 2000)
+                sb.showMessage(self.tr("Printing completed"), 2000)
             else:
-                sb.showMessage(self.tr('Error while printing'), 2000)
+                sb.showMessage(self.tr("Error while printing"), 2000)
             QApplication.processEvents()
         else:
-            sb.showMessage(self.tr('Printing aborted'), 2000)
+            sb.showMessage(self.tr("Printing aborted"), 2000)
             QApplication.processEvents()
-    
+
     def __printPreviewFile(self):
         """
         Private slot to show a print preview of the text.
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
         from .Printer import Printer
-        
+
         printer = Printer(mode=QPrinter.PrinterMode.HighResolution)
         if self.__curFile:
             printer.setDocName(pathlib.Path(self.__curFile).name)
@@ -3182,36 +3676,36 @@
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested.connect(self.__printPreview)
         preview.exec()
-    
+
     def __printPreview(self, printer):
         """
         Private slot to generate a print preview.
-        
+
         @param printer reference to the printer object
             (QScintilla.Printer.Printer)
         """
         printer.printRange(self.__textEdit)
-    
+
     #########################################################
     ## Methods needed by the context menu
     #########################################################
-    
+
     def __contextMenuRequested(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         self.contextMenu.popup(self.mapToGlobal(coord))
-    
+
     def __initContextMenu(self):
         """
         Private method used to setup the context menu.
         """
         self.contextMenu = QMenu()
-        
+
         self.languagesMenu = self.__initContextMenuLanguages()
-        
+
         self.contextMenu.addAction(self.undoAct)
         self.contextMenu.addAction(self.redoAct)
         self.contextMenu.addSeparator()
@@ -3219,47 +3713,46 @@
         self.contextMenu.addAction(self.copyAct)
         self.contextMenu.addAction(self.pasteAct)
         self.contextMenu.addSeparator()
-        self.contextMenu.addAction(self.tr('Select all'), self.__selectAll)
-        self.contextMenu.addAction(
-            self.tr('Deselect all'), self.__deselectAll)
+        self.contextMenu.addAction(self.tr("Select all"), self.__selectAll)
+        self.contextMenu.addAction(self.tr("Deselect all"), self.__deselectAll)
         self.contextMenu.addSeparator()
         self.languagesMenuAct = self.contextMenu.addMenu(self.languagesMenu)
         self.contextMenu.addSeparator()
         self.contextMenu.addAction(self.printPreviewAct)
         self.contextMenu.addAction(self.printAct)
-    
+
     def __initContextMenuLanguages(self):
         """
         Private method used to setup the Languages context sub menu.
-        
+
         @return reference to the generated menu (QMenu)
         """
         menu = QMenu(self.tr("Languages"))
-        
+
         self.languagesActGrp = QActionGroup(self)
         self.noLanguageAct = menu.addAction(self.tr("No Language"))
         self.noLanguageAct.setCheckable(True)
         self.noLanguageAct.setData("None")
         self.languagesActGrp.addAction(self.noLanguageAct)
         menu.addSeparator()
-        
+
         from . import Lexers
+
         self.supportedLanguages = {}
         supportedLanguages = Lexers.getSupportedLanguages()
         languages = sorted(supportedLanguages.keys())
         for language in languages:
             if language != "Guessed":
-                self.supportedLanguages[language] = (
-                    supportedLanguages[language][:2]
-                )
+                self.supportedLanguages[language] = supportedLanguages[language][:2]
                 act = menu.addAction(
                     UI.PixmapCache.getIcon(supportedLanguages[language][2]),
-                    self.supportedLanguages[language][0])
+                    self.supportedLanguages[language][0],
+                )
                 act.setCheckable(True)
                 act.setData(language)
                 self.supportedLanguages[language].append(act)
                 self.languagesActGrp.addAction(act)
-        
+
         menu.addSeparator()
         self.pygmentsAct = menu.addAction(self.tr("Guessed"))
         self.pygmentsAct.setCheckable(True)
@@ -3267,12 +3760,12 @@
         self.languagesActGrp.addAction(self.pygmentsAct)
         self.pygmentsSelAct = menu.addAction(self.tr("Alternatives"))
         self.pygmentsSelAct.setData("Alternatives")
-        
+
         menu.triggered.connect(self.__languageMenuTriggered)
         menu.aboutToShow.connect(self.__showContextMenuLanguages)
-        
+
         return menu
-    
+
     def __showContextMenuLanguages(self):
         """
         Private slot handling the aboutToShow signal of the languages context
@@ -3280,31 +3773,33 @@
         """
         if self.apiLanguage.startswith("Pygments|"):
             self.pygmentsSelAct.setText(
-                self.tr("Alternatives ({0})").format(
-                    self.getLanguage(normalized=False)))
+                self.tr("Alternatives ({0})").format(self.getLanguage(normalized=False))
+            )
         else:
             self.pygmentsSelAct.setText(self.tr("Alternatives"))
-    
+
     def __showLanguagesMenu(self, pos):
         """
         Private slot to show the Languages menu of the status bar.
-        
+
         @param pos position the menu should be shown at (QPoint)
         """
         self.languagesMenu.exec(pos)
-    
+
     def __selectPygmentsLexer(self):
         """
         Private method to select a specific pygments lexer.
-        
+
         @return name of the selected pygments lexer
         @rtype str
         """
         from pygments.lexers import get_all_lexers
+
         lexerList = sorted(lex[0] for lex in get_all_lexers())
         try:
             lexerSel = lexerList.index(
-                self.getLanguage(normalized=False, forPygments=True))
+                self.getLanguage(normalized=False, forPygments=True)
+            )
         except ValueError:
             lexerSel = 0
         lexerName, ok = QInputDialog.getItem(
@@ -3313,16 +3808,17 @@
             self.tr("Select the Pygments lexer to apply."),
             lexerList,
             lexerSel,
-            False)
+            False,
+        )
         if ok and lexerName:
             return lexerName
         else:
             return ""
-    
+
     def __languageMenuTriggered(self, act):
         """
         Private method to handle the selection of a lexer language.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         if act == self.noLanguageAct:
@@ -3337,35 +3833,31 @@
             language = act.data()
             if language:
                 self.setLanguage(self.supportedLanguages[language][1])
-        
+
     def __resetLanguage(self):
         """
         Private method used to reset the language selection.
         """
-        if (
-            self.lexer_ is not None and
-            (self.lexer_.lexer() == "container" or
-             self.lexer_.lexer() is None)
+        if self.lexer_ is not None and (
+            self.lexer_.lexer() == "container" or self.lexer_.lexer() is None
         ):
             self.__textEdit.SCN_STYLENEEDED.disconnect(self.__styleNeeded)
-        
+
         self.apiLanguage = ""
         self.lexer_ = None
         self.__textEdit.setLexer()
         self.__setMonospaced(self.useMonospaced)
-        
+
         if Preferences.getEditor("OverrideEditAreaColours"):
-            self.__textEdit.setColor(
-                Preferences.getEditorColour("EditAreaForeground"))
-            self.__textEdit.setPaper(
-                Preferences.getEditorColour("EditAreaBackground"))
-        
+            self.__textEdit.setColor(Preferences.getEditorColour("EditAreaForeground"))
+            self.__textEdit.setPaper(Preferences.getEditorColour("EditAreaBackground"))
+
         self.languageChanged.emit(self.apiLanguage)
-        
+
     def setLanguage(self, filename, initTextDisplay=True, pyname=""):
         """
         Public method to set a lexer language.
-        
+
         @param filename filename used to determine the associated lexer
             language (string)
         @param initTextDisplay flag indicating an initialization of the text
@@ -3375,18 +3867,18 @@
         self.__bindLexer(filename, pyname=pyname)
         self.__textEdit.recolor()
         self.__checkLanguage()
-        
+
         # set the text display
         if initTextDisplay:
             self.__setTextDisplay()
             self.__setMargins()
-        
+
         self.languageChanged.emit(self.apiLanguage)
 
     def getLanguage(self, normalized=True, forPygments=False):
         """
         Public method to retrieve the language of the editor.
-        
+
         @param normalized flag indicating to normalize some Pygments
             lexer names
         @type bool
@@ -3396,10 +3888,7 @@
         @return language of the editor
         @rtype str
         """
-        if (
-            self.apiLanguage == "Guessed" or
-            self.apiLanguage.startswith("Pygments|")
-        ):
+        if self.apiLanguage == "Guessed" or self.apiLanguage.startswith("Pygments|"):
             lang = self.lexer_.name()
             if normalized:
                 # adjust some Pygments lexer names
@@ -3407,7 +3896,7 @@
                     lang = "Python3"
                 elif lang == "Protocol Buffer":
                     lang = "Protocol"
-                    
+
         else:
             lang = self.apiLanguage
             if forPygments:
@@ -3417,7 +3906,7 @@
                 elif lang == "Protocol":
                     lang = "Protocol Buffer"
         return lang
-    
+
     def __checkLanguage(self):
         """
         Private method to check the selected language of the language submenu.
@@ -3432,22 +3921,20 @@
                 act.setChecked(False)
         else:
             self.supportedLanguages[self.apiLanguage][2].setChecked(True)
-    
+
     def __bindLexer(self, filename, pyname=""):
         """
         Private slot to set the correct lexer depending on language.
-        
+
         @param filename filename used to determine the associated lexer
             language (string)
         @param pyname name of the pygments lexer to use (string)
         """
-        if (
-            self.lexer_ is not None and
-            (self.lexer_.lexer() == "container" or
-             self.lexer_.lexer() is None)
+        if self.lexer_ is not None and (
+            self.lexer_.lexer() == "container" or self.lexer_.lexer() is None
         ):
             self.__textEdit.SCN_STYLENEEDED.disconnect(self.__styleNeeded)
-        
+
         filename = os.path.basename(filename)
         language = Preferences.getEditorLexerAssoc(filename)
         if language == "Python":
@@ -3455,20 +3942,21 @@
         if language.startswith("Pygments|"):
             pyname = language.split("|", 1)[1]
             language = ""
-        
+
         if not self.filetype:
             if not language and pyname:
                 self.filetype = pyname
             else:
                 self.filetype = language
-        
+
         from . import Lexers
+
         self.lexer_ = Lexers.getLexer(language, self.__textEdit, pyname=pyname)
         if self.lexer_ is None:
             self.__textEdit.setLexer()
             self.apiLanguage = ""
             return
-        
+
         if pyname:
             if pyname.startswith("Pygments|"):
                 self.apiLanguage = pyname
@@ -3488,12 +3976,12 @@
         self.__textEdit.setLexer(self.lexer_)
         if self.lexer_.lexer() == "container" or self.lexer_.lexer() is None:
             self.__textEdit.SCN_STYLENEEDED.connect(self.__styleNeeded)
-        
+
         # get the font for style 0 and set it as the default font
         key = (
-            'Scintilla/Guessed/style0/font'
-            if pyname and pyname.startswith("Pygments|") else
-            'Scintilla/{0}/style0/font'.format(self.lexer_.language())
+            "Scintilla/Guessed/style0/font"
+            if pyname and pyname.startswith("Pygments|")
+            else "Scintilla/{0}/style0/font".format(self.lexer_.language())
         )
         fdesc = Preferences.getSettings().value(key)
         if fdesc is not None:
@@ -3502,32 +3990,32 @@
         self.lexer_.readSettings(Preferences.getSettings(), "Scintilla")
         if self.lexer_.hasSubstyles():
             self.lexer_.readSubstyles(self.__textEdit)
-        
+
         # now set the lexer properties
         self.lexer_.initProperties()
-        
+
         self.lexer_.setDefaultColor(self.lexer_.color(0))
         self.lexer_.setDefaultPaper(self.lexer_.paper(0))
-    
+
     def __styleNeeded(self, position):
         """
         Private slot to handle the need for more styling.
-        
+
         @param position end position, that needs styling (integer)
         """
         self.lexer_.styleText(self.__textEdit.getEndStyled(), position)
-    
+
     def __bindName(self, line0):
         """
         Private method to generate a dummy filename for binding a lexer.
-        
+
         @param line0 first line of text to use in the generation process
             (string)
         @return dummy file name to be used for binding a lexer (string)
         """
         bindName = ""
         line0 = line0.lower()
-        
+
         # check first line if it does not start with #!
         if line0.startswith(("<html", "<!doctype html", "<?php")):
             bindName = "dummy.html"
@@ -3537,25 +4025,23 @@
             bindName = "dummy.diff"
         elif line0.startswith("\\documentclass"):
             bindName = "dummy.tex"
-        
+
         if not bindName and self.filetype:
             # check filetype
             from . import Lexers
+
             supportedLanguages = Lexers.getSupportedLanguages()
             if self.filetype in supportedLanguages:
                 bindName = supportedLanguages[self.filetype][1]
             elif self.filetype in ["Python", "Python3", "MicroPython"]:
                 bindName = "dummy.py"
-        
+
         if not bindName and line0.startswith("#!"):
             # #! marker detection
-            if (
-                "python3" in line0 or
-                "python" in line0
-            ):
+            if "python3" in line0 or "python" in line0:
                 bindName = "dummy.py"
                 self.filetype = "Python3"
-            elif ("/bash" in line0 or "/sh" in line0):
+            elif "/bash" in line0 or "/sh" in line0:
                 bindName = "dummy.sh"
             elif "ruby" in line0:
                 bindName = "dummy.rb"
@@ -3567,7 +4053,7 @@
             elif "dmd" in line0:
                 bindName = "dummy.d"
                 self.filetype = "D"
-        
+
         if not bindName:
             # mode line detection: -*- mode: python -*-
             match = re.search(r"mode[:=]\s*([-\w_.]+)", line0)
@@ -3586,48 +4072,48 @@
                 elif mode in ["dmd", "d"]:
                     bindName = "dummy.d"
                     self.filetype = "D"
-        
+
         if not bindName:
             bindName = self.__curFile
-        
+
         return bindName
-    
+
     ##########################################################
     ## Methods needed for the search functionality
     ##########################################################
-    
+
     def getSRHistory(self, key):
         """
         Public method to get the search or replace history list.
-        
+
         @param key list to return (must be 'search' or 'replace')
         @return the requested history list (list of strings)
         """
         return self.srHistory[key][:]
-    
+
     def textForFind(self):
         """
         Public method to determine the selection or the current word for the
         next find operation.
-        
+
         @return selection or current word (string)
         """
         if self.__textEdit.hasSelectedText():
             text = self.__textEdit.selectedText()
-            if '\r' in text or '\n' in text:
+            if "\r" in text or "\n" in text:
                 # the selection contains at least a newline, it is
                 # unlikely to be the expression to search for
-                return ''
-            
+                return ""
+
             return text
-        
+
         # no selected text, determine the word at the current position
         return self.__getCurrentWord()
-    
+
     def __getWord(self, line, index):
         """
         Private method to get the word at a position.
-        
+
         @param line number of line to look at
         @type int
         @param index position to look at
@@ -3639,31 +4125,31 @@
         if wc is None:
             pattern = r"\b[\w_]+\b"
         else:
-            wc = re.sub(r'\w', "", wc)
+            wc = re.sub(r"\w", "", wc)
             pattern = r"\b[\w{0}]+\b".format(re.escape(wc))
         rx = (
             re.compile(pattern)
-            if self.__textEdit.caseSensitive() else
-            re.compile(pattern, re.IGNORECASE)
+            if self.__textEdit.caseSensitive()
+            else re.compile(pattern, re.IGNORECASE)
         )
-        
+
         text = self.text(line)
         for match in rx.finditer(text):
             start, end = match.span()
             if start <= index <= end:
                 return match.group()
-        
+
         return ""
-    
+
     def __getCurrentWord(self):
         """
         Private method to get the word at the current position.
-        
+
         @return the word at that current position
         """
         line, index = self.getCursorPosition()
         return self.__getWord(line, index)
-        
+
     def showSearchWidget(self):
         """
         Public method to show the search widget.
@@ -3671,7 +4157,7 @@
         self.__replaceWidget.hide()
         self.__searchWidget.show()
         self.__searchWidget.show(self.textForFind())
-    
+
     def __searchNext(self):
         """
         Private slot to handle the search next action.
@@ -3680,7 +4166,7 @@
             self.__replaceWidget.findNext()
         else:
             self.__searchWidget.findNext()
-    
+
     def __searchPrev(self):
         """
         Private slot to handle the search previous action.
@@ -3689,45 +4175,44 @@
             self.__replaceWidget.findPrev()
         else:
             self.__searchWidget.findPrev()
-    
+
     def showReplaceWidget(self):
         """
         Public method to show the replace widget.
         """
         self.__searchWidget.hide()
         self.__replaceWidget.show(self.textForFind())
-    
+
     def __searchClearMarkers(self):
         """
         Private method to clear the search markers of the active window.
         """
         self.clearSearchIndicators()
-    
+
     def activeWindow(self):
         """
         Public method to fulfill the ViewManager interface.
-        
+
         @return reference to the text edit component (QsciScintillaCompat)
         """
         return self.__textEdit
-    
+
     def setSearchIndicator(self, startPos, indicLength):
         """
         Public method to set a search indicator for the given range.
-        
+
         @param startPos start position of the indicator (integer)
         @param indicLength length of the indicator (integer)
         """
-        self.__textEdit.setIndicatorRange(
-            self.searchIndicator, startPos, indicLength)
-    
+        self.__textEdit.setIndicatorRange(self.searchIndicator, startPos, indicLength)
+
     def clearSearchIndicators(self):
         """
         Public method to clear all search indicators.
         """
         self.__textEdit.clearAllIndicators(self.searchIndicator)
         self.__markedText = ""
-    
+
     def __markOccurrences(self):
         """
         Private method to mark all occurrences of the current word.
@@ -3736,51 +4221,52 @@
         if not word:
             self.clearSearchIndicators()
             return
-        
+
         if self.__markedText == word:
             return
-        
+
         self.clearSearchIndicators()
         ok = self.__textEdit.findFirstTarget(
-            word, False, self.__textEdit.caseSensitive(), True, 0, 0)
+            word, False, self.__textEdit.caseSensitive(), True, 0, 0
+        )
         while ok:
             tgtPos, tgtLen = self.__textEdit.getFoundTarget()
             self.setSearchIndicator(tgtPos, tgtLen)
             ok = self.__textEdit.findNextTarget()
         self.__markedText = word
-    
+
     ##########################################################
     ## Methods exhibiting some QScintilla API methods
     ##########################################################
-    
+
     def setText(self, txt, filetype=None):
         """
         Public method to set the text programatically.
-        
+
         @param txt text to be set (string)
         @param filetype type of the source file (string)
         """
         self.__textEdit.setText(txt)
-        
+
         if filetype is None:
             self.filetype = ""
         else:
             self.filetype = filetype
-        
+
         eolMode = self.__getEditorConfig("EOLMode", nodefault=True)
         if eolMode is None:
             fileEol = self.__textEdit.detectEolString(txt)
             self.__textEdit.setEolModeByEolString(fileEol)
         else:
             self.__textEdit.convertEols(eolMode)
-        
+
         self.__textEdit.setModified(False)
         self.setWindowModified(False)
-    
+
     def gotoLine(self, line, pos=1):
         """
         Public slot to jump to the beginning of a line.
-        
+
         @param line line number to go to
         @type int
         @param pos position in line to go to
@@ -3790,38 +4276,38 @@
         self.__textEdit.ensureLineVisible(line - 1)
         self.__textEdit.setFirstVisibleLine(line - 1)
         self.__textEdit.ensureCursorVisible()
-    
+
     #######################################################################
     ## Methods implementing the interface to EditorConfig
     #######################################################################
-    
+
     def __loadEditorConfig(self, fileName=""):
         """
         Private method to load the EditorConfig properties.
-        
+
         @param fileName name of the file
         @type str
         """
         if not fileName:
             fileName = self.__curFile
-        
+
         self.__editorConfig = self.__loadEditorConfigObject(fileName)
-        
+
         if fileName:
             self.__setTabAndIndent()
-    
+
     def __loadEditorConfigObject(self, fileName):
         """
         Private method to load the EditorConfig properties for the given
         file name.
-        
+
         @param fileName name of the file
         @type str
         @return EditorConfig dictionary
         @rtype dict
         """
         editorConfig = {}
-        
+
         if fileName:
             try:
                 editorConfig = editorconfig.get_properties(fileName)
@@ -3829,21 +4315,23 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("EditorConfig Properties"),
-                    self.tr("""<p>The EditorConfig properties for file"""
-                            """ <b>{0}</b> could not be loaded.</p>""")
-                    .format(fileName))
-        
+                    self.tr(
+                        """<p>The EditorConfig properties for file"""
+                        """ <b>{0}</b> could not be loaded.</p>"""
+                    ).format(fileName),
+                )
+
         return editorConfig
-    
+
     def __getEditorConfig(self, option, nodefault=False, config=None):
         """
         Private method to get the requested option via EditorConfig.
-        
+
         If there is no EditorConfig defined, the equivalent built-in option
         will be used (Preferences.getEditor(). The option must be given as the
         Preferences option key. The mapping to the EditorConfig option name
         will be done within this method.
-        
+
         @param option Preferences option key
         @type str
         @param nodefault flag indicating to not get the default value from
@@ -3857,7 +4345,7 @@
         """
         if config is None:
             config = self.__editorConfig
-        
+
         if not config:
             if nodefault:
                 return None
@@ -3867,7 +4355,7 @@
                     # no override
                     value = Preferences.getEditor(option)
                 return value
-        
+
         try:
             if option == "EOLMode":
                 value = config["end_of_line"]
@@ -3897,20 +4385,20 @@
                 value = config["indent_style"] == "tab"
         except KeyError:
             value = None
-        
+
         if value is None and not nodefault:
             # use Preferences as default in case of error
             value = self.__getOverrideValue(option)
             if value is None:
                 # no override
                 value = Preferences.getEditor(option)
-        
+
         return value
-    
+
     def __getOverrideValue(self, option):
         """
         Private method to get an override value for the current file type.
-        
+
         @param option Preferences option key
         @type str
         @return override value; None in case nothing is defined
@@ -3924,71 +4412,71 @@
                     return overrides[self.filetype][0]
                 elif option == "IndentWidth":
                     return overrides[self.filetype][1]
-        
+
         return None
-    
+
     #######################################################################
     ## Methods supporting the outline view below
     #######################################################################
-    
+
     def __resetChangeTimer(self):
         """
         Private slot to reset the parse timer.
         """
         self.__changeTimer.stop()
         self.__changeTimer.start()
-    
+
     def __editorChanged(self):
         """
         Private slot handling changes of the editor language or file name.
         """
-        supported = self.__sourceOutline.isSupportedLanguage(
-            self.getLanguage())
-        
+        supported = self.__sourceOutline.isSupportedLanguage(self.getLanguage())
+
         self.__sourceOutline.setVisible(supported)
-        
+
         line, pos = self.getCursorPosition()
         lang = self.getLanguage()
         self.__setSbFile(line + 1, pos, language=lang)
-    
+
     #######################################################################
     ## Methods supporting zooming
     #######################################################################
-    
+
     def __zoomIn(self):
         """
         Private method to handle the zoom in action.
         """
         self.zoomIn()
         self.sbZoom.setValue(self.getZoom())
-        
+
     def __zoomOut(self):
         """
         Private method to handle the zoom out action.
         """
         self.zoomOut()
         self.sbZoom.setValue(self.getZoom())
-        
+
     def __zoomReset(self):
         """
         Private method to reset the zoom factor.
         """
         self.__zoomTo(0)
-        
+
     def __zoom(self):
         """
         Private method to handle the zoom action.
         """
         from QScintilla.ZoomDialog import ZoomDialog
+
         dlg = ZoomDialog(self.getZoom(), self, None, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             value = dlg.getZoomSize()
             self.__zoomTo(value)
-        
+
     def __zoomTo(self, value):
         """
         Private slot to zoom to a given value.
-        
+
         @param value zoom value to be set (integer)
         """
         self.zoomTo(value)
--- a/src/eric7/QScintilla/Printer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Printer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,14 +19,15 @@
     """
     Class implementing the QsciPrinter with a header.
     """
+
     def __init__(self, mode=QPrinter.PrinterMode.ScreenResolution):
         """
         Constructor
-        
+
         @param mode mode of the printer (QPrinter.PrinterMode)
         """
         super().__init__(mode)
-        
+
         self.setMagnification(Preferences.getPrinter("Magnification"))
         if Preferences.getPrinter("ColorMode"):
             self.setColorMode(QPrinter.ColorMode.Color)
@@ -36,12 +37,14 @@
             self.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             self.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        self.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        self.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
@@ -49,25 +52,25 @@
         self.time = QTime.currentTime().toString(Qt.DateFormat.RFC2822Date)
         self.date = QDate.currentDate().toString(Qt.DateFormat.RFC2822Date)
         self.headerFont = Preferences.getPrinter("HeaderFont")
-        
+
     def formatPage(self, painter, drawing, area, pagenr):
         """
         Public method to generate a header line.
-        
+
         @param painter the paint canvas (QPainter)
         @param drawing flag indicating that something should be drawn
         @param area the drawing area (QRect)
         @param pagenr the page number (int)
         """
         fn = self.docName()
-        
+
         header = QCoreApplication.translate(
-            'Printer', '{0} - Printed on {1}, {2} - Page {3}'
+            "Printer", "{0} - Printed on {1}, {2} - Page {3}"
         ).format(fn, self.date, self.time, pagenr)
-        
+
         painter.save()
-        painter.setFont(self.headerFont)    # set our header font
-        painter.setPen(QColor(Qt.GlobalColor.black))            # set color
+        painter.setFont(self.headerFont)  # set our header font
+        painter.setPen(QColor(Qt.GlobalColor.black))  # set color
         if drawing:
             fm = painter.fontMetrics()
             try:
@@ -76,6 +79,8 @@
                 fmWidth = fm.width(header)
             painter.drawText(
                 area.right() - fmWidth,
-                area.top() + painter.fontMetrics().ascent(), header)
+                area.top() + painter.fontMetrics().ascent(),
+                header,
+            )
         area.setTop(area.top() + painter.fontMetrics().height() + 5)
         painter.restore()
--- a/src/eric7/QScintilla/QsciScintillaCompat.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/QsciScintillaCompat.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,9 @@
 from PyQt6.QtGui import QPalette, QColor
 from PyQt6.QtWidgets import QApplication, QListWidget
 from PyQt6.Qsci import (
-    QsciScintillaBase, QsciScintilla,
-    QSCINTILLA_VERSION as QSCIQSCINTILLA_VERSION
+    QsciScintillaBase,
+    QsciScintilla,
+    QSCINTILLA_VERSION as QSCIQSCINTILLA_VERSION,
 )
 
 ###############################################################################
@@ -23,33 +24,35 @@
 def QSCINTILLA_VERSION():
     """
     Module function to return the QScintilla version.
-    
+
     @return QScintilla version (integer)
     """
     return QSCIQSCINTILLA_VERSION
-    
+
+
 ###############################################################################
 
 
 class QsciScintillaCompat(QsciScintilla):
     """
     Class implementing a compatability interface to QsciScintilla.
-    
+
     This class implements all the functions, that were added to
     QsciScintilla incrementally. This class ensures compatibility
     to older versions of QsciScintilla.
-    
+
     @signal zoomValueChanged(int) emitted to signal a change of the zoom value
     """
+
     zoomValueChanged = pyqtSignal(int)
-    
+
     ArrowFoldStyle = QsciScintilla.FoldStyle.BoxedTreeFoldStyle.value + 1
     ArrowTreeFoldStyle = ArrowFoldStyle + 1
-    
-    UserSeparator = '\x04'
-    
+
+    UserSeparator = "\x04"
+
     IndicatorStyleMax = QsciScintilla.INDIC_GRADIENTCENTRE
-    
+
     # Maps PyQt6.QFont.Weight to the weights used by QScintilla
     QFontWeightMapping = {
         100: 0,
@@ -62,84 +65,88 @@
         800: 81,
         900: 87,
     }
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.zoom = 0
-        
+
         self.__targetSearchFlags = 0
         self.__targetSearchExpr = ""
         self.__targetSearchStart = 0
         self.__targetSearchEnd = -1
         self.__targetSearchActive = False
-        
+
         self.__modified = False
-        
+
         self.userListActivated.connect(self.__completionListSelected)
         self.modificationChanged.connect(self.__modificationChanged)
-        
+
         self.setAutoCompletionWidgetSize(40, 5)
-    
+
     def __modificationChanged(self, m):
         """
         Private slot to handle the modificationChanged signal.
-        
+
         @param m modification status (boolean)
         """
         self.__modified = m
-    
+
     def isModified(self):
         """
         Public method to return the modification status.
-        
+
         @return flag indicating the modification status (boolean)
         """
         return self.__modified
-    
+
     def setModified(self, m):
         """
         Public slot to set the modification status.
-        
+
         @param m new modification status (boolean)
         """
         self.__modified = m
         super().setModified(m)
         self.modificationChanged.emit(m)
-    
+
     def setLexer(self, lex=None):
         """
         Public method to set the lexer.
-        
+
         @param lex the lexer to be set or None to reset it.
         """
         super().setLexer(lex)
         if lex is None:
             self.clearStyles()
-    
+
     def clearStyles(self):
         """
         Public method to set the styles according the selected Qt style.
         """
         palette = QApplication.palette()
-        self.SendScintilla(QsciScintilla.SCI_STYLESETFORE,
-                           QsciScintilla.STYLE_DEFAULT,
-                           palette.color(QPalette.ColorRole.Text))
-        self.SendScintilla(QsciScintilla.SCI_STYLESETBACK,
-                           QsciScintilla.STYLE_DEFAULT,
-                           palette.color(QPalette.ColorRole.Base))
+        self.SendScintilla(
+            QsciScintilla.SCI_STYLESETFORE,
+            QsciScintilla.STYLE_DEFAULT,
+            palette.color(QPalette.ColorRole.Text),
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_STYLESETBACK,
+            QsciScintilla.STYLE_DEFAULT,
+            palette.color(QPalette.ColorRole.Base),
+        )
         self.SendScintilla(QsciScintilla.SCI_STYLECLEARALL)
         self.SendScintilla(QsciScintilla.SCI_CLEARDOCUMENTSTYLE)
-    
+
     def monospacedStyles(self, font):
         """
         Public method to set the current style to be monospaced.
-        
+
         @param font font to be used (QFont)
         """
         try:
@@ -147,11 +154,10 @@
         except AttributeError:
             rangeLow = list(range(32))
         try:
-            rangeHigh = list(range(self.STYLE_LASTPREDEFINED + 1,
-                                   self.STYLE_MAX + 1))
+            rangeHigh = list(range(self.STYLE_LASTPREDEFINED + 1, self.STYLE_MAX + 1))
         except AttributeError:
             rangeHigh = list(range(40, 128))
-        
+
         f = font.family().encode("utf-8")
         ps = font.pointSize()
         weight = -QsciScintillaCompat.QFontWeightMapping[font.weight()]
@@ -162,116 +168,113 @@
             self.SendScintilla(QsciScintilla.SCI_STYLESETFONT, style, f)
             self.SendScintilla(QsciScintilla.SCI_STYLESETSIZE, style, ps)
             try:
-                self.SendScintilla(
-                    QsciScintilla.SCI_STYLESETWEIGHT, style, weight)
+                self.SendScintilla(QsciScintilla.SCI_STYLESETWEIGHT, style, weight)
             except AttributeError:
                 self.SendScintilla(QsciScintilla.SCI_STYLESETBOLD, style, bold)
             self.SendScintilla(QsciScintilla.SCI_STYLESETITALIC, style, italic)
-            self.SendScintilla(
-                QsciScintilla.SCI_STYLESETUNDERLINE, style, underline)
-    
+            self.SendScintilla(QsciScintilla.SCI_STYLESETUNDERLINE, style, underline)
+
     def linesOnScreen(self):
         """
         Public method to get the amount of visible lines.
-        
+
         @return amount of visible lines (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_LINESONSCREEN)
-    
+
     def lineAt(self, pos):
         """
         Public method to calculate the line at a position.
-        
+
         This variant is able to calculate the line for positions in the
         margins and for empty lines.
-        
+
         @param pos position to calculate the line for (integer or QPoint)
         @return linenumber at position or -1, if there is no line at pos
             (integer, zero based)
         """
         scipos = (
             pos
-            if isinstance(pos, int) else
-            self.SendScintilla(QsciScintilla.SCI_POSITIONFROMPOINT,
-                               pos.x(), pos.y())
+            if isinstance(pos, int)
+            else self.SendScintilla(
+                QsciScintilla.SCI_POSITIONFROMPOINT, pos.x(), pos.y()
+            )
         )
         line = self.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, scipos)
         if line >= self.lines():
             line = -1
         return line
-    
+
     def currentPosition(self):
         """
         Public method to get the current position.
-        
+
         @return absolute position of the cursor (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETCURRENTPOS)
-    
+
     def styleAt(self, pos):
         """
         Public method to get the style at a position in the text.
-        
+
         @param pos position in the text (integer)
         @return style at the requested position or 0, if the position
             is negative or past the end of the document (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETSTYLEAT, pos)
-    
+
     def currentStyle(self):
         """
         Public method to get the style at the current position.
-        
+
         @return style at the current position (integer)
         """
         return self.styleAt(self.currentPosition())
-    
+
     def getSubStyleRange(self, styleNr):
         """
         Public method to get the sub style range for given style number.
-        
+
         @param styleNr Number of the base style
         @type int
         @return start index of the sub style and their count
         @rtype int, int
         """
-        start = self.SendScintilla(QsciScintilla.SCI_GETSUBSTYLESSTART,
-                                   styleNr)
-        count = self.SendScintilla(QsciScintilla.SCI_GETSUBSTYLESLENGTH,
-                                   styleNr)
+        start = self.SendScintilla(QsciScintilla.SCI_GETSUBSTYLESSTART, styleNr)
+        count = self.SendScintilla(QsciScintilla.SCI_GETSUBSTYLESLENGTH, styleNr)
         return start, count
-    
+
     def getEndStyled(self):
         """
         Public method to get the last styled position.
-        
+
         @return end position of the last styling run (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETENDSTYLED)
-    
+
     def startStyling(self, pos, mask):
         """
         Public method to prepare styling.
-        
+
         @param pos styling positition to start at (integer)
         @param mask mask of bits to use for styling (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_STARTSTYLING, pos, mask)
-    
+
     def setStyling(self, length, style):
         """
         Public method to style some text.
-        
+
         @param length length of text to style (integer)
         @param style style to set for text (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_SETSTYLING, length, style)
-    
+
     def charAt(self, pos):
         """
         Public method to get the character at a position in the text observing
         multibyte characters.
-        
+
         @param pos position in the text (integer)
         @return character at the requested position or empty string, if the
             position is negative or past the end of the document (string)
@@ -290,7 +293,7 @@
                 pos += 1
                 ch += self.byteAt(pos)
             try:
-                return ch.decode('utf8')
+                return ch.decode("utf8")
             except UnicodeDecodeError:
                 if pos > 0:
                     # try it one position before; maybe we are in the
@@ -300,12 +303,12 @@
                     return ""
         else:
             return ch.decode()
-    
+
     def byteAt(self, pos):
         """
         Public method to get the raw character (bytes) at a position in the
         text.
-        
+
         @param pos position in the text (integer)
         @return raw character at the requested position or empty bytes, if the
             position is negative or past the end of the document (bytes)
@@ -316,68 +319,67 @@
         if char < 0:
             char += 256
         return bytearray((char,))
-    
+
     def foldLevelAt(self, line):
         """
         Public method to get the fold level of a line of the document.
-        
+
         @param line line number (integer)
         @return fold level of the given line (integer)
         """
         lvl = self.SendScintilla(QsciScintilla.SCI_GETFOLDLEVEL, line)
         return (
-            (lvl & QsciScintilla.SC_FOLDLEVELNUMBERMASK) -
-            QsciScintilla.SC_FOLDLEVELBASE
-        )
-    
+            lvl & QsciScintilla.SC_FOLDLEVELNUMBERMASK
+        ) - QsciScintilla.SC_FOLDLEVELBASE
+
     def foldFlagsAt(self, line):
         """
         Public method to get the fold flags of a line of the document.
-        
+
         @param line line number (integer)
         @return fold flags of the given line (integer)
         """
         lvl = self.SendScintilla(QsciScintilla.SCI_GETFOLDLEVEL, line)
         return lvl & ~QsciScintilla.SC_FOLDLEVELNUMBERMASK
-    
+
     def foldHeaderAt(self, line):
         """
         Public method to determine, if a line of the document is a fold header
         line.
-        
+
         @param line line number (integer)
         @return flag indicating a fold header line (boolean)
         """
         lvl = self.SendScintilla(QsciScintilla.SCI_GETFOLDLEVEL, line)
         return lvl & QsciScintilla.SC_FOLDLEVELHEADERFLAG
-    
+
     def foldExpandedAt(self, line):
         """
         Public method to determine, if a fold is expanded.
-        
+
         @param line line number (integer)
         @return flag indicating the fold expansion state of the line (boolean)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETFOLDEXPANDED, line)
-    
+
     def setIndentationGuideView(self, view):
         """
         Public method to set the view of the indentation guides.
-        
+
         @param view view of the indentation guides (SC_IV_NONE, SC_IV_REAL,
             SC_IV_LOOKFORWARD or SC_IV_LOOKBOTH)
         """
         self.SendScintilla(QsciScintilla.SCI_SETINDENTATIONGUIDES, view)
-    
+
     def indentationGuideView(self):
         """
         Public method to get the indentation guide view.
-        
+
         @return indentation guide view (SC_IV_NONE, SC_IV_REAL,
             SC_IV_LOOKFORWARD or SC_IV_LOOKBOTH)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETINDENTATIONGUIDES)
-    
+
     ###########################################################################
     ## methods below are missing from QScintilla
     ###########################################################################
@@ -385,7 +387,7 @@
     def setAutoCompletionWidgetSize(self, chars, lines):
         """
         Public method to set the size of completion and user lists.
-        
+
         @param chars max. number of chars to show
         @type int
         @param lines max. number of lines to show
@@ -393,222 +395,219 @@
         """
         self.SendScintilla(QsciScintilla.SCI_AUTOCSETMAXWIDTH, chars)
         self.SendScintilla(QsciScintilla.SCI_AUTOCSETMAXHEIGHT, lines)
-        
+
     def zoomIn(self, zoom=1):
         """
         Public method used to increase the zoom factor.
-        
+
         @param zoom zoom factor increment (integer)
         """
         super().zoomIn(zoom)
-    
+
     def zoomOut(self, zoom=1):
         """
         Public method used to decrease the zoom factor.
-        
+
         @param zoom zoom factor decrement (integer)
         """
         super().zoomOut(zoom)
-    
+
     def zoomTo(self, zoom):
         """
         Public method used to zoom to a specific zoom factor.
-        
+
         @param zoom zoom factor (integer)
         """
         self.zoom = zoom
         super().zoomTo(zoom)
         self.zoomValueChanged.emit(self.zoom)
-    
+
     def getZoom(self):
         """
         Public method used to retrieve the current zoom factor.
-        
+
         @return zoom factor (integer)
         """
         return self.zoom
-    
+
     def editorCommand(self, cmd):
         """
         Public method to perform a simple editor command.
-        
+
         @param cmd the scintilla command to be performed (integer)
         """
         self.SendScintilla(cmd)
-    
+
     def scrollVertical(self, lines):
         """
         Public method to scroll the text area.
-        
+
         @param lines number of lines to scroll (negative scrolls up,
             positive scrolls down) (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_LINESCROLL, 0, lines)
-    
+
     def moveCursorToEOL(self):
         """
         Public method to move the cursor to the end of line.
         """
         self.SendScintilla(QsciScintilla.SCI_LINEEND)
-    
+
     def moveCursorLeft(self):
         """
         Public method to move the cursor left.
         """
         self.SendScintilla(QsciScintilla.SCI_CHARLEFT)
-    
+
     def moveCursorRight(self):
         """
         Public method to move the cursor right.
         """
         self.SendScintilla(QsciScintilla.SCI_CHARRIGHT)
-    
+
     def moveCursorWordLeft(self):
         """
         Public method to move the cursor left one word.
         """
         self.SendScintilla(QsciScintilla.SCI_WORDLEFT)
-    
+
     def moveCursorWordRight(self):
         """
         Public method to move the cursor right one word.
         """
         self.SendScintilla(QsciScintilla.SCI_WORDRIGHT)
-    
+
     def newLineBelow(self):
         """
         Public method to insert a new line below the current one.
         """
         self.SendScintilla(QsciScintilla.SCI_LINEEND)
         self.SendScintilla(QsciScintilla.SCI_NEWLINE)
-    
+
     def deleteBack(self):
         """
         Public method to delete the character to the left of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_DELETEBACK)
-    
+
     def delete(self):
         """
         Public method to delete the character to the right of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_CLEAR)
-    
+
     def deleteWordLeft(self):
         """
         Public method to delete the word to the left of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_DELWORDLEFT)
-    
+
     def deleteWordRight(self):
         """
         Public method to delete the word to the right of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_DELWORDRIGHT)
-    
+
     def deleteLineLeft(self):
         """
         Public method to delete the line to the left of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_DELLINELEFT)
-    
+
     def deleteLineRight(self):
         """
         Public method to delete the line to the right of the cursor.
         """
         self.SendScintilla(QsciScintilla.SCI_DELLINERIGHT)
-    
+
     def extendSelectionLeft(self):
         """
         Public method to extend the selection one character to the left.
         """
         self.SendScintilla(QsciScintilla.SCI_CHARLEFTEXTEND)
-    
+
     def extendSelectionRight(self):
         """
         Public method to extend the selection one character to the right.
         """
         self.SendScintilla(QsciScintilla.SCI_CHARRIGHTEXTEND)
-    
+
     def extendSelectionWordLeft(self):
         """
         Public method to extend the selection one word to the left.
         """
         self.SendScintilla(QsciScintilla.SCI_WORDLEFTEXTEND)
-    
+
     def extendSelectionWordRight(self):
         """
         Public method to extend the selection one word to the right.
         """
         self.SendScintilla(QsciScintilla.SCI_WORDRIGHTEXTEND)
-    
+
     def extendSelectionToBOL(self):
         """
         Public method to extend the selection to the beginning of the line.
         """
         self.SendScintilla(QsciScintilla.SCI_VCHOMEEXTEND)
-    
+
     def extendSelectionToEOL(self):
         """
         Public method to extend the selection to the end of the line.
         """
         self.SendScintilla(QsciScintilla.SCI_LINEENDEXTEND)
-    
+
     def hasSelection(self):
         """
         Public method to check for a selection.
-        
+
         @return flag indicating the presence of a selection (boolean)
         """
         return self.getSelection()[0] != -1
-    
+
     def hasSelectedText(self):
         """
         Public method to indicate the presence of selected text.
-        
+
         This is an overriding method to cope with a bug in QsciScintilla.
-        
+
         @return flag indicating the presence of selected text (boolean)
         """
         return bool(self.selectedText())
-    
+
     def selectionIsRectangle(self):
         """
         Public method to check, if the current selection is rectangular.
-        
+
         @return flag indicating a rectangular selection (boolean)
         """
         startLine, startIndex, endLine, endIndex = self.getSelection()
         return (
-            startLine != -1 and
-            startLine != endLine and
-            self.SendScintilla(QsciScintilla.SCI_SELECTIONISRECTANGLE)
+            startLine != -1
+            and startLine != endLine
+            and self.SendScintilla(QsciScintilla.SCI_SELECTIONISRECTANGLE)
         )
-    
+
     def getRectangularSelection(self):
         """
         Public method to retrieve the start and end of a rectangular selection.
-        
+
         @return tuple with start line and index and end line and index
             (tuple of four int)
         """
         if not self.selectionIsRectangle():
             return (-1, -1, -1, -1)
-        
-        startPos = self.SendScintilla(
-            QsciScintilla.SCI_GETRECTANGULARSELECTIONANCHOR)
-        endPos = self.SendScintilla(
-            QsciScintilla.SCI_GETRECTANGULARSELECTIONCARET)
+
+        startPos = self.SendScintilla(QsciScintilla.SCI_GETRECTANGULARSELECTIONANCHOR)
+        endPos = self.SendScintilla(QsciScintilla.SCI_GETRECTANGULARSELECTIONCARET)
         startLine, startIndex = self.lineIndexFromPosition(startPos)
         endLine, endIndex = self.lineIndexFromPosition(endPos)
-        
+
         return (startLine, startIndex, endLine, endIndex)
-    
-    def setRectangularSelection(self, startLine, startIndex, endLine,
-                                endIndex):
+
+    def setRectangularSelection(self, startLine, startIndex, endLine, endIndex):
         """
         Public method to set a rectangular selection.
-        
+
         @param startLine line number of the start of the selection (int)
         @param startIndex index number of the start of the selection (int)
         @param endLine line number of the end of the selection (int)
@@ -616,42 +615,39 @@
         """
         startPos = self.positionFromLineIndex(startLine, startIndex)
         endPos = self.positionFromLineIndex(endLine, endIndex)
-        
-        self.SendScintilla(
-            QsciScintilla.SCI_SETRECTANGULARSELECTIONANCHOR, startPos)
-        self.SendScintilla(
-            QsciScintilla.SCI_SETRECTANGULARSELECTIONCARET, endPos)
-    
+
+        self.SendScintilla(QsciScintilla.SCI_SETRECTANGULARSELECTIONANCHOR, startPos)
+        self.SendScintilla(QsciScintilla.SCI_SETRECTANGULARSELECTIONCARET, endPos)
+
     def getSelectionCount(self):
         """
         Public method to get the number of active selections.
-        
+
         @return number of active selection (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETSELECTIONS)
-    
+
     def getSelectionN(self, index):
         """
         Public method to get the start and end of a selection given by its
         index.
-        
+
         @param index index of the selection (integer)
         @return tuple with start line and index and end line and index
             (tuple of four int) for the given selection
         """
-        startPos = self.SendScintilla(
-            QsciScintilla.SCI_GETSELECTIONNSTART, index)
+        startPos = self.SendScintilla(QsciScintilla.SCI_GETSELECTIONNSTART, index)
         endPos = self.SendScintilla(QsciScintilla.SCI_GETSELECTIONNEND, index)
         startLine, startIndex = self.lineIndexFromPosition(startPos)
         endLine, endIndex = self.lineIndexFromPosition(endPos)
-        
+
         return (startLine, startIndex, endLine, endIndex)
-    
+
     def getSelections(self):
         """
         Public method to get the start and end coordinates of all active
         selections.
-        
+
         @return list of tuples with start line and index and end line and index
             of each active selection (list of tuples of four int)
         """
@@ -659,244 +655,241 @@
         for index in range(self.getSelectionCount()):
             selections.append(self.getSelectionN(index))
         return selections
-    
+
     def addCursor(self, line, index):
         """
         Public method to add an additional cursor.
-        
+
         @param line line number for the cursor
         @type int
         @param index index number for the cursor
         @type int
         """
         pos = self.positionFromLineIndex(line, index)
-        
+
         if self.getSelectionCount() == 0:
             self.SendScintilla(QsciScintilla.SCI_SETSELECTION, pos, pos)
         else:
             self.SendScintilla(QsciScintilla.SCI_ADDSELECTION, pos, pos)
-    
+
     def enableMultiCursorSupport(self):
         """
         Public method to enable support for multi cursor editing.
         """
         # typing should insert in all selections at the same time
         self.SendScintilla(QsciScintilla.SCI_SETMULTIPLESELECTION, True)
-        self.SendScintilla(QsciScintilla.SCI_SETADDITIONALSELECTIONTYPING,
-                           True)
-    
+        self.SendScintilla(QsciScintilla.SCI_SETADDITIONALSELECTIONTYPING, True)
+
     def setVirtualSpaceOptions(self, options):
         """
         Public method to set the virtual space usage options.
-        
+
         @param options usage options to set (integer, 0 to 3)
         """
         self.SendScintilla(QsciScintilla.SCI_SETVIRTUALSPACEOPTIONS, options)
-    
+
     def getLineSeparator(self):
         """
         Public method to get the line separator for the current eol mode.
-        
+
         @return eol string (string)
         """
         m = self.eolMode()
         if m == QsciScintilla.EolMode.EolWindows:
-            eol = '\r\n'
+            eol = "\r\n"
         elif m == QsciScintilla.EolMode.EolUnix:
-            eol = '\n'
+            eol = "\n"
         elif m == QsciScintilla.EolMode.EolMac:
-            eol = '\r'
+            eol = "\r"
         else:
-            eol = ''
+            eol = ""
         return eol
-    
+
     def getEolIndicator(self):
         """
         Public method to get the eol indicator for the current eol mode.
-        
+
         @return eol indicator (string)
         """
         m = self.eolMode()
         if m == QsciScintilla.EolMode.EolWindows:
-            eol = 'CRLF'
+            eol = "CRLF"
         elif m == QsciScintilla.EolMode.EolUnix:
-            eol = 'LF'
+            eol = "LF"
         elif m == QsciScintilla.EolMode.EolMac:
-            eol = 'CR'
+            eol = "CR"
         else:
-            eol = ''
+            eol = ""
         return eol
-    
+
     def setEolModeByEolString(self, eolStr):
         """
         Public method to set the eol mode given the eol string.
-        
+
         @param eolStr eol string (string)
         """
-        if eolStr == '\r\n':
+        if eolStr == "\r\n":
             self.setEolMode(QsciScintilla.EolMode.EolWindows)
-        elif eolStr == '\n':
+        elif eolStr == "\n":
             self.setEolMode(QsciScintilla.EolMode.EolUnix)
-        elif eolStr == '\r':
+        elif eolStr == "\r":
             self.setEolMode(QsciScintilla.EolMode.EolMac)
-    
+
     def detectEolString(self, txt):
         """
         Public method to determine the eol string used.
-        
+
         @param txt text from which to determine the eol string (string)
         @return eol string (string)
         """
         if len(txt.split("\r\n", 1)) == 2:
-            return '\r\n'
+            return "\r\n"
         elif len(txt.split("\n", 1)) == 2:
-            return '\n'
+            return "\n"
         elif len(txt.split("\r", 1)) == 2:
-            return '\r'
+            return "\r"
         else:
             return None
-    
+
     def getCursorFlashTime(self):
         """
         Public method to get the flash (blink) time of the cursor in
         milliseconds.
-        
+
         The flash time is the time required to display, invert and restore the
         caret display. Usually the text cursor is displayed for half the cursor
         flash time, then hidden for the same amount of time.
-        
+
         @return flash time of the cursor in milliseconds (integer)
         """
         return 2 * self.SendScintilla(QsciScintilla.SCI_GETCARETPERIOD)
-    
+
     def setCursorFlashTime(self, time):
         """
         Public method to set the flash (blink) time of the cursor in
         milliseconds.
-        
+
         The flash time is the time required to display, invert and restore the
         caret display. Usually the text cursor is displayed for half the cursor
         flash time, then hidden for the same amount of time.
-        
+
         @param time flash time of the cursor in milliseconds (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_SETCARETPERIOD, time // 2)
-    
+
     def getCaretLineAlwaysVisible(self):
         """
         Public method to determine, if the caret line is visible even if
         the editor doesn't have the focus.
-        
+
         @return flag indicating an always visible caret line (boolean)
         """
         try:
-            return self.SendScintilla(
-                QsciScintilla.SCI_GETCARETLINEVISIBLEALWAYS)
+            return self.SendScintilla(QsciScintilla.SCI_GETCARETLINEVISIBLEALWAYS)
         except AttributeError:
             return False
-    
+
     def setCaretLineAlwaysVisible(self, alwaysVisible):
         """
         Public method to set the caret line visible even if the editor doesn't
         have the focus.
-        
+
         @param alwaysVisible flag indicating that the caret line shall be
             visible even if the editor doesn't have the focus (boolean)
         """
         with contextlib.suppress(AttributeError):
             self.SendScintilla(
-                QsciScintilla.SCI_SETCARETLINEVISIBLEALWAYS, alwaysVisible)
-    
+                QsciScintilla.SCI_SETCARETLINEVISIBLEALWAYS, alwaysVisible
+            )
+
     def canPaste(self):
         """
         Public method to test, if the paste action is available (i.e. if the
         clipboard contains some text).
-        
+
         @return flag indicating the availability of 'paste'
         @rtype bool
         """
         return self.SendScintilla(QsciScintilla.SCI_CANPASTE)
-    
+
     ###########################################################################
     ## methods to perform searches in target range
     ###########################################################################
-    
+
     def positionFromPoint(self, point):
         """
         Public method to calculate the scintilla position from a point in the
         window.
-        
+
         @param point point in the window (QPoint)
         @return scintilla position (integer) or -1 to indicate, that the point
             is not near any character
         """
-        return self.SendScintilla(QsciScintilla.SCI_POSITIONFROMPOINTCLOSE,
-                                  point.x(), point.y())
-    
+        return self.SendScintilla(
+            QsciScintilla.SCI_POSITIONFROMPOINTCLOSE, point.x(), point.y()
+        )
+
     def positionBefore(self, pos):
         """
         Public method to get the position before the given position taking into
         account multibyte characters.
-        
+
         @param pos position (integer)
         @return position before the given one (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_POSITIONBEFORE, pos)
-    
+
     def positionAfter(self, pos):
         """
         Public method to get the position after the given position taking into
         account multibyte characters.
-        
+
         @param pos position (integer)
         @return position after the given one (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_POSITIONAFTER, pos)
-    
+
     def lineEndPosition(self, line):
         """
         Public method to determine the line end position of the given line.
-        
+
         @param line line number (integer)
         @return position of the line end disregarding line end characters
             (integer)
         """
         return self.SendScintilla(QsciScintilla.SCI_GETLINEENDPOSITION, line)
-    
+
     def __doSearchTarget(self):
         """
         Private method to perform the search in target.
-        
+
         @return flag indicating a successful search (boolean)
         """
         if self.__targetSearchStart == self.__targetSearchEnd:
             self.__targetSearchActive = False
             return False
-        
-        self.SendScintilla(QsciScintilla.SCI_SETTARGETSTART,
-                           self.__targetSearchStart)
-        self.SendScintilla(QsciScintilla.SCI_SETTARGETEND,
-                           self.__targetSearchEnd)
-        self.SendScintilla(QsciScintilla.SCI_SETSEARCHFLAGS,
-                           self.__targetSearchFlags)
+
+        self.SendScintilla(QsciScintilla.SCI_SETTARGETSTART, self.__targetSearchStart)
+        self.SendScintilla(QsciScintilla.SCI_SETTARGETEND, self.__targetSearchEnd)
+        self.SendScintilla(QsciScintilla.SCI_SETSEARCHFLAGS, self.__targetSearchFlags)
         targetSearchExpr = self._encodeString(self.__targetSearchExpr)
-        pos = self.SendScintilla(QsciScintilla.SCI_SEARCHINTARGET,
-                                 len(targetSearchExpr),
-                                 targetSearchExpr)
-        
+        pos = self.SendScintilla(
+            QsciScintilla.SCI_SEARCHINTARGET, len(targetSearchExpr), targetSearchExpr
+        )
+
         if pos == -1:
             self.__targetSearchActive = False
             return False
-        
+
         targend = self.SendScintilla(QsciScintilla.SCI_GETTARGETEND)
         self.__targetSearchStart = targend
-        
+
         return True
-    
+
     def getFoundTarget(self):
         """
         Public method to get the recently found target.
-        
+
         @return found target as a tuple of starting position and target length
             (integer, integer)
         """
@@ -906,14 +899,25 @@
             return (spos, epos - spos)
         else:
             return (0, 0)
-    
-    def findFirstTarget(self, expr_, re_, cs_, wo_,
-                        begline=-1, begindex=-1, endline=-1, endindex=-1,
-                        ws_=False, posix=False, cxx11=False):
+
+    def findFirstTarget(
+        self,
+        expr_,
+        re_,
+        cs_,
+        wo_,
+        begline=-1,
+        begindex=-1,
+        endline=-1,
+        endindex=-1,
+        ws_=False,
+        posix=False,
+        cxx11=False,
+    ):
         """
         Public method to search in a specified range of text without
         setting the selection.
-        
+
         @param expr_ search expression
         @type str
         @param re_ flag indicating a regular expression
@@ -956,70 +960,68 @@
             if cxx11:
                 self.__targetSearchFlags |= QsciScintilla.SCFIND_CXX11REGEX
             # defined for QScintilla >= 2.11.0
-        
+
         if begline < 0 or begindex < 0:
             self.__targetSearchStart = self.SendScintilla(
-                QsciScintilla.SCI_GETCURRENTPOS)
+                QsciScintilla.SCI_GETCURRENTPOS
+            )
         else:
-            self.__targetSearchStart = self.positionFromLineIndex(
-                begline, begindex)
-        
+            self.__targetSearchStart = self.positionFromLineIndex(begline, begindex)
+
         if endline < 0 or endindex < 0:
-            self.__targetSearchEnd = self.SendScintilla(
-                QsciScintilla.SCI_GETTEXTLENGTH)
+            self.__targetSearchEnd = self.SendScintilla(QsciScintilla.SCI_GETTEXTLENGTH)
         else:
-            self.__targetSearchEnd = self.positionFromLineIndex(
-                endline, endindex)
-        
+            self.__targetSearchEnd = self.positionFromLineIndex(endline, endindex)
+
         self.__targetSearchExpr = expr_
-        
+
         if self.__targetSearchExpr:
             self.__targetSearchActive = True
-            
+
             return self.__doSearchTarget()
-        
+
         return False
-    
+
     def findNextTarget(self):
         """
         Public method to find the next occurrence in the target range.
-        
+
         @return flag indicating a successful search (boolean)
         """
         if not self.__targetSearchActive:
             return False
-        
+
         return self.__doSearchTarget()
-    
+
     def replaceTarget(self, replaceStr):
         """
         Public method to replace the string found by the last search in target.
-        
+
         @param replaceStr replacement string or regexp (string)
         """
         if not self.__targetSearchActive:
             return
-        
+
         cmd = (
             QsciScintilla.SCI_REPLACETARGETRE
-            if self.__targetSearchFlags & QsciScintilla.SCFIND_REGEXP else
-            QsciScintilla.SCI_REPLACETARGET
+            if self.__targetSearchFlags & QsciScintilla.SCFIND_REGEXP
+            else QsciScintilla.SCI_REPLACETARGET
         )
         r = self._encodeString(replaceStr)
-        
+
         start = self.SendScintilla(QsciScintilla.SCI_GETTARGETSTART)
         self.SendScintilla(cmd, len(r), r)
-        
+
         self.__targetSearchStart = start + len(r)
-    
+
     ###########################################################################
     ## indicator handling methods
     ###########################################################################
-    
+
     def indicatorDefine(self, indicator, style, color):
         """
         Public method to define the appearance of an indicator.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param style style to be used for the indicator
@@ -1040,50 +1042,53 @@
         @exception ValueError the indicator or style are not valid
         """
         if (
-            indicator < QsciScintilla.INDIC_CONTAINER or
-            indicator > QsciScintilla.INDIC_MAX
+            indicator < QsciScintilla.INDIC_CONTAINER
+            or indicator > QsciScintilla.INDIC_MAX
         ):
             raise ValueError("indicator number out of range")
-        
-        if (
-            style < QsciScintilla.INDIC_PLAIN or
-            style > self.IndicatorStyleMax
-        ):
+
+        if style < QsciScintilla.INDIC_PLAIN or style > self.IndicatorStyleMax:
             raise ValueError("style out of range")
-        
+
         self.SendScintilla(QsciScintilla.SCI_INDICSETSTYLE, indicator, style)
         self.SendScintilla(QsciScintilla.SCI_INDICSETFORE, indicator, color)
         with contextlib.suppress(AttributeError):
-            self.SendScintilla(QsciScintilla.SCI_INDICSETALPHA, indicator,
-                               color.alpha())
+            self.SendScintilla(
+                QsciScintilla.SCI_INDICSETALPHA, indicator, color.alpha()
+            )
             if style in (
-                QsciScintilla.INDIC_ROUNDBOX, QsciScintilla.INDIC_STRAIGHTBOX,
-                QsciScintilla.INDIC_DOTBOX, QsciScintilla.INDIC_FULLBOX,
+                QsciScintilla.INDIC_ROUNDBOX,
+                QsciScintilla.INDIC_STRAIGHTBOX,
+                QsciScintilla.INDIC_DOTBOX,
+                QsciScintilla.INDIC_FULLBOX,
             ):
                 # set outline alpha less transparent
-                self.SendScintilla(QsciScintilla.SCI_INDICSETOUTLINEALPHA,
-                                   indicator, color.alpha() + 20)
-    
+                self.SendScintilla(
+                    QsciScintilla.SCI_INDICSETOUTLINEALPHA,
+                    indicator,
+                    color.alpha() + 20,
+                )
+
     def setCurrentIndicator(self, indicator):
         """
         Public method to set the current indicator.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @exception ValueError the indicator or style are not valid
         """
         if (
-            indicator < QsciScintilla.INDIC_CONTAINER or
-            indicator > QsciScintilla.INDIC_MAX
+            indicator < QsciScintilla.INDIC_CONTAINER
+            or indicator > QsciScintilla.INDIC_MAX
         ):
             raise ValueError("indicator number out of range")
-        
+
         self.SendScintilla(QsciScintilla.SCI_SETINDICATORCURRENT, indicator)
-    
+
     def setIndicatorRange(self, indicator, spos, length):
         """
         Public method to set an indicator for the given range.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param spos position of the indicator start (integer)
@@ -1091,11 +1096,11 @@
         """
         self.setCurrentIndicator(indicator)
         self.SendScintilla(QsciScintilla.SCI_INDICATORFILLRANGE, spos, length)
-    
+
     def setIndicator(self, indicator, sline, sindex, eline, eindex):
         """
         Public method to set an indicator for the given range.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param sline line number of the indicator start (integer)
@@ -1106,11 +1111,11 @@
         spos = self.positionFromLineIndex(sline, sindex)
         epos = self.positionFromLineIndex(eline, eindex)
         self.setIndicatorRange(indicator, spos, epos - spos)
-    
+
     def clearIndicatorRange(self, indicator, spos, length):
         """
         Public method to clear an indicator for the given range.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param spos position of the indicator start (integer)
@@ -1118,11 +1123,11 @@
         """
         self.setCurrentIndicator(indicator)
         self.SendScintilla(QsciScintilla.SCI_INDICATORCLEARRANGE, spos, length)
-    
+
     def clearIndicator(self, indicator, sline, sindex, eline, eindex):
         """
         Public method to clear an indicator for the given range.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param sline line number of the indicator start (integer)
@@ -1133,33 +1138,32 @@
         spos = self.positionFromLineIndex(sline, sindex)
         epos = self.positionFromLineIndex(eline, eindex)
         self.clearIndicatorRange(indicator, spos, epos - spos)
-    
+
     def clearAllIndicators(self, indicator):
         """
         Public method to clear all occurrences of an indicator.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         """
         self.clearIndicatorRange(indicator, 0, self.length())
-    
+
     def hasIndicator(self, indicator, pos):
         """
         Public method to test for the existence of an indicator.
-        
+
         @param indicator number of the indicator (integer,
             QsciScintilla.INDIC_CONTAINER .. QsciScintilla.INDIC_MAX)
         @param pos position to test (integer)
         @return flag indicating the existence of the indicator (boolean)
         """
-        res = self.SendScintilla(QsciScintilla.SCI_INDICATORVALUEAT,
-                                 indicator, pos)
+        res = self.SendScintilla(QsciScintilla.SCI_INDICATORVALUEAT, indicator, pos)
         return res
-    
+
     def showFindIndicator(self, sline, sindex, eline, eindex):
         """
         Public method to show the find indicator for the given range.
-        
+
         @param sline line number of the indicator start (integer)
         @param sindex index of the indicator start (integer)
         @param eline line number of the indicator end (integer)
@@ -1169,11 +1173,11 @@
             spos = self.positionFromLineIndex(sline, sindex)
             epos = self.positionFromLineIndex(eline, eindex)
             self.SendScintilla(QsciScintilla.SCI_FINDINDICATORSHOW, spos, epos)
-    
+
     def flashFindIndicator(self, sline, sindex, eline, eindex):
         """
         Public method to flash the find indicator for the given range.
-        
+
         @param sline line number of the indicator start (integer)
         @param sindex index of the indicator start (integer)
         @param eline line number of the indicator end (integer)
@@ -1182,47 +1186,97 @@
         if hasattr(QsciScintilla, "SCI_FINDINDICATORFLASH"):
             spos = self.positionFromLineIndex(sline, sindex)
             epos = self.positionFromLineIndex(eline, eindex)
-            self.SendScintilla(QsciScintilla.SCI_FINDINDICATORFLASH,
-                               spos, epos)
-    
+            self.SendScintilla(QsciScintilla.SCI_FINDINDICATORFLASH, spos, epos)
+
     def hideFindIndicator(self):
         """
         Public method to hide the find indicator.
         """
         if hasattr(QsciScintilla, "SCI_FINDINDICATORHIDE"):
             self.SendScintilla(QsciScintilla.SCI_FINDINDICATORHIDE)
-    
+
     def getIndicatorStartPos(self, indicator, pos):
         """
         Public method to get the start position of an indicator at a position.
-        
+
         @param indicator ID of the indicator (integer)
         @param pos position within the indicator (integer)
         @return start position of the indicator (integer)
         """
-        return self.SendScintilla(QsciScintilla.SCI_INDICATORSTART,
-                                  indicator, pos)
-    
+        return self.SendScintilla(QsciScintilla.SCI_INDICATORSTART, indicator, pos)
+
     def getIndicatorEndPos(self, indicator, pos):
         """
         Public method to get the end position of an indicator at a position.
-        
+
         @param indicator ID of the indicator (integer)
         @param pos position within the indicator (integer)
         @return end position of the indicator (integer)
         """
-        return self.SendScintilla(QsciScintilla.SCI_INDICATOREND,
-                                  indicator, pos)
-    
+        return self.SendScintilla(QsciScintilla.SCI_INDICATOREND, indicator, pos)
+
     def gotoPreviousIndicator(self, indicator, wrap):
         """
         Public method to move the cursor to the previous position of an
         indicator.
-        
+
         This method ensures, that the position found is visible (i.e. unfolded
         and inside the visible range). The text containing the indicator is
         selected.
-        
+
+        @param indicator ID of the indicator to search (integer)
+        @param wrap flag indicating to wrap around at the beginning of the
+            text (boolean)
+        @return flag indicating if the indicator was found (boolean)
+        """
+        pos = self.SendScintilla(QsciScintilla.SCI_GETCURRENTPOS)
+        docLen = self.SendScintilla(QsciScintilla.SCI_GETTEXTLENGTH)
+        isInIndicator = self.hasIndicator(indicator, pos)
+        posStart = self.getIndicatorStartPos(indicator, pos)
+        posEnd = self.getIndicatorEndPos(indicator, pos)
+
+        if posStart == 0 and posEnd == docLen - 1:
+            # indicator does not exist
+            return False
+
+        if posStart <= 0:
+            if not wrap:
+                return False
+
+            isInIndicator = self.hasIndicator(indicator, docLen - 1)
+            posStart = self.getIndicatorStartPos(indicator, docLen - 1)
+
+        if isInIndicator:
+            # get out of it
+            posStart = self.getIndicatorStartPos(indicator, posStart - 1)
+            if posStart <= 0:
+                if not wrap:
+                    return False
+
+                posStart = self.getIndicatorStartPos(indicator, docLen - 1)
+
+        newPos = posStart - 1
+        posStart = self.getIndicatorStartPos(indicator, newPos)
+        posEnd = self.getIndicatorEndPos(indicator, newPos)
+
+        if self.hasIndicator(indicator, posStart):
+            # found it
+            line, index = self.lineIndexFromPosition(posEnd)
+            self.ensureLineVisible(line)
+            self.SendScintilla(QsciScintilla.SCI_SETSEL, posEnd, posStart)
+            self.SendScintilla(QsciScintilla.SCI_SCROLLCARET)
+            return True
+
+        return False
+
+    def gotoNextIndicator(self, indicator, wrap):
+        """
+        Public method to move the cursor to the next position of an indicator.
+
+        This method ensures, that the position found is visible (i.e. unfolded
+        and inside the visible range). The text containing the indicator is
+        selected.
+
         @param indicator ID of the indicator to search (integer)
         @param wrap flag indicating to wrap around at the beginning of the
             text (boolean)
@@ -1233,84 +1287,31 @@
         isInIndicator = self.hasIndicator(indicator, pos)
         posStart = self.getIndicatorStartPos(indicator, pos)
         posEnd = self.getIndicatorEndPos(indicator, pos)
-        
+
         if posStart == 0 and posEnd == docLen - 1:
             # indicator does not exist
             return False
-        
-        if posStart <= 0:
-            if not wrap:
-                return False
-            
-            isInIndicator = self.hasIndicator(indicator, docLen - 1)
-            posStart = self.getIndicatorStartPos(indicator, docLen - 1)
-        
-        if isInIndicator:
-            # get out of it
-            posStart = self.getIndicatorStartPos(indicator, posStart - 1)
-            if posStart <= 0:
-                if not wrap:
-                    return False
-                
-                posStart = self.getIndicatorStartPos(indicator, docLen - 1)
-        
-        newPos = posStart - 1
-        posStart = self.getIndicatorStartPos(indicator, newPos)
-        posEnd = self.getIndicatorEndPos(indicator, newPos)
-        
-        if self.hasIndicator(indicator, posStart):
-            # found it
-            line, index = self.lineIndexFromPosition(posEnd)
-            self.ensureLineVisible(line)
-            self.SendScintilla(QsciScintilla.SCI_SETSEL, posEnd, posStart)
-            self.SendScintilla(QsciScintilla.SCI_SCROLLCARET)
-            return True
-        
-        return False
-    
-    def gotoNextIndicator(self, indicator, wrap):
-        """
-        Public method to move the cursor to the next position of an indicator.
-        
-        This method ensures, that the position found is visible (i.e. unfolded
-        and inside the visible range). The text containing the indicator is
-        selected.
-        
-        @param indicator ID of the indicator to search (integer)
-        @param wrap flag indicating to wrap around at the beginning of the
-            text (boolean)
-        @return flag indicating if the indicator was found (boolean)
-        """
-        pos = self.SendScintilla(QsciScintilla.SCI_GETCURRENTPOS)
-        docLen = self.SendScintilla(QsciScintilla.SCI_GETTEXTLENGTH)
-        isInIndicator = self.hasIndicator(indicator, pos)
-        posStart = self.getIndicatorStartPos(indicator, pos)
-        posEnd = self.getIndicatorEndPos(indicator, pos)
-        
-        if posStart == 0 and posEnd == docLen - 1:
-            # indicator does not exist
-            return False
-        
+
         if posEnd >= docLen:
             if not wrap:
                 return False
-            
+
             isInIndicator = self.hasIndicator(indicator, 0)
             posEnd = self.getIndicatorEndPos(indicator, 0)
-        
+
         if isInIndicator:
             # get out of it
             posEnd = self.getIndicatorEndPos(indicator, posEnd)
             if posEnd >= docLen:
                 if not wrap:
                     return False
-                
+
                 posEnd = self.getIndicatorEndPos(indicator, 0)
-        
+
         newPos = posEnd + 1
         posStart = self.getIndicatorStartPos(indicator, newPos)
         posEnd = self.getIndicatorEndPos(indicator, newPos)
-        
+
         if self.hasIndicator(indicator, posStart):
             # found it
             line, index = self.lineIndexFromPosition(posEnd)
@@ -1318,147 +1319,195 @@
             self.SendScintilla(QsciScintilla.SCI_SETSEL, posStart, posEnd)
             self.SendScintilla(QsciScintilla.SCI_SCROLLCARET)
             return True
-        
+
         return False
-    
+
     ###########################################################################
     ## methods to perform folding related stuff
     ###########################################################################
-    
+
     def __setFoldMarker(self, marknr, mark=QsciScintilla.SC_MARK_EMPTY):
         """
         Private method to define a fold marker.
-        
+
         @param marknr marker number to define (integer)
         @param mark fold mark symbol to be used (integer)
         """
         self.SendScintilla(QsciScintilla.SCI_MARKERDEFINE, marknr, mark)
-        
+
         if mark != QsciScintilla.SC_MARK_EMPTY:
-            self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                               marknr, QColor(Qt.GlobalColor.white))
-            self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                               marknr, QColor(Qt.GlobalColor.black))
-    
+            self.SendScintilla(
+                QsciScintilla.SCI_MARKERSETFORE, marknr, QColor(Qt.GlobalColor.white)
+            )
+            self.SendScintilla(
+                QsciScintilla.SCI_MARKERSETBACK, marknr, QColor(Qt.GlobalColor.black)
+            )
+
     def setFolding(self, style, margin=2):
         """
         Public method to set the folding style and margin.
-        
+
         @param style folding style to set (integer)
         @param margin margin number (integer)
         """
         if isinstance(style, QsciScintilla.FoldStyle):
             super().setFolding(QsciScintilla.FoldStyle(style), margin)
         else:
-            super().setFolding(
-                QsciScintilla.FoldStyle.PlainFoldStyle, margin)
-            
+            super().setFolding(QsciScintilla.FoldStyle.PlainFoldStyle, margin)
+
             if style == self.ArrowFoldStyle:
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDER,
-                                     QsciScintilla.SC_MARK_ARROW)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEROPEN,
-                                     QsciScintilla.SC_MARK_ARROWDOWN)
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDER, QsciScintilla.SC_MARK_ARROW
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDEROPEN, QsciScintilla.SC_MARK_ARROWDOWN
+                )
                 self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERSUB)
                 self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERTAIL)
                 self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEREND)
                 self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEROPENMID)
                 self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL)
             elif style == self.ArrowTreeFoldStyle:
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDER,
-                                     QsciScintilla.SC_MARK_ARROW)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEROPEN,
-                                     QsciScintilla.SC_MARK_ARROWDOWN)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERSUB,
-                                     QsciScintilla.SC_MARK_VLINE)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERTAIL,
-                                     QsciScintilla.SC_MARK_LCORNER)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEREND,
-                                     QsciScintilla.SC_MARK_ARROW)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDEROPENMID,
-                                     QsciScintilla.SC_MARK_ARROWDOWN)
-                self.__setFoldMarker(QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL,
-                                     QsciScintilla.SC_MARK_TCORNER)
-    
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDER, QsciScintilla.SC_MARK_ARROW
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDEROPEN, QsciScintilla.SC_MARK_ARROWDOWN
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDERSUB, QsciScintilla.SC_MARK_VLINE
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDERTAIL, QsciScintilla.SC_MARK_LCORNER
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDEREND, QsciScintilla.SC_MARK_ARROW
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDEROPENMID,
+                    QsciScintilla.SC_MARK_ARROWDOWN,
+                )
+                self.__setFoldMarker(
+                    QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL,
+                    QsciScintilla.SC_MARK_TCORNER,
+                )
+
     def setFoldMarkersColors(self, foreColor, backColor):
         """
         Public method to set the foreground and background colors of the
         fold markers.
-        
+
         @param foreColor foreground color (QColor)
         @param backColor background color (QColor)
         """
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDER, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDER, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDEROPEN, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDEROPEN, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDEROPENMID, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDEROPENMID, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDERSUB, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDERSUB, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDERTAIL, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDERTAIL, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL, backColor)
-        
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETFORE,
-                           QsciScintilla.SC_MARKNUM_FOLDEREND, foreColor)
-        self.SendScintilla(QsciScintilla.SCI_MARKERSETBACK,
-                           QsciScintilla.SC_MARKNUM_FOLDEREND, backColor)
-    
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE, QsciScintilla.SC_MARKNUM_FOLDER, foreColor
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK, QsciScintilla.SC_MARKNUM_FOLDER, backColor
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDEROPEN,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDEROPEN,
+            backColor,
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDEROPENMID,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDEROPENMID,
+            backColor,
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDERSUB,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDERSUB,
+            backColor,
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDERTAIL,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDERTAIL,
+            backColor,
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDERMIDTAIL,
+            backColor,
+        )
+
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETFORE,
+            QsciScintilla.SC_MARKNUM_FOLDEREND,
+            foreColor,
+        )
+        self.SendScintilla(
+            QsciScintilla.SCI_MARKERSETBACK,
+            QsciScintilla.SC_MARKNUM_FOLDEREND,
+            backColor,
+        )
+
     def getVisibleLineFromDocLine(self, docLine):
         """
         Public method to convert a document line number to a visible line
         number (i.e. respect folded lines and annotations).
-        
+
         @param docLine document line number to be converted
         @type int
         @return visible line number
         @rtype int
         """
-        return self.SendScintilla(QsciScintilla.SCI_VISIBLEFROMDOCLINE,
-                                  docLine)
-    
+        return self.SendScintilla(QsciScintilla.SCI_VISIBLEFROMDOCLINE, docLine)
+
     def getDocLineFromVisibleLine(self, displayLine):
         """
         Public method to convert a visible line number to a document line
         number (i.e. respect folded lines and annotations).
-        
+
         @param displayLine display line number to be converted
         @type int
         @return document line number
         @rtype int
         """
-        return self.SendScintilla(QsciScintilla.SCI_DOCLINEFROMVISIBLE,
-                                  displayLine)
-    
+        return self.SendScintilla(QsciScintilla.SCI_DOCLINEFROMVISIBLE, displayLine)
+
     ###########################################################################
     ## interface methods to the standard keyboard command set
     ###########################################################################
-    
+
     def clearKeys(self):
         """
         Public method to clear the key commands.
         """
         # call into the QsciCommandSet
         self.standardCommands().clearKeys()
-        
+
     def clearAlternateKeys(self):
         """
         Public method to clear the alternate key commands.
@@ -1469,44 +1518,44 @@
     ###########################################################################
     ## specialized event handlers
     ###########################################################################
-    
+
     def focusOutEvent(self, event):
         """
         Protected method called when the editor loses focus.
-        
+
         @param event event object (QFocusEvent)
         """
         if self.isListActive():
             if event.reason() in [
                 Qt.FocusReason.ActiveWindowFocusReason,
-                Qt.FocusReason.OtherFocusReason
+                Qt.FocusReason.OtherFocusReason,
             ]:
                 aw = QApplication.activeWindow()
                 if aw is None or aw.parent() is not self:
                     self.cancelList()
             else:
                 self.cancelList()
-        
+
         if self.isCallTipActive():
             if event.reason() in [
                 Qt.FocusReason.ActiveWindowFocusReason,
-                Qt.FocusReason.OtherFocusReason
+                Qt.FocusReason.OtherFocusReason,
             ]:
                 aw = QApplication.activeWindow()
                 if aw is None or aw.parent() is not self:
                     self.cancelCallTips()
             else:
                 self.cancelCallTips()
-        
+
         super().focusOutEvent(event)
-    
+
     def event(self, evt):
         """
         Public method to handle events.
-        
+
         Note: We are not interested in the standard QsciScintilla event
         handling because we do it ourselves.
-        
+
         @param evt event object to handle (QEvent)
         @return result of the event handling (boolean)
         """
@@ -1519,7 +1568,7 @@
     def getFileName(self):
         """
         Public method to return the name of the file being displayed.
-        
+
         @return filename of the displayed file (string)
         """
         p = self.parent()
@@ -1530,55 +1579,56 @@
                 return p.getFileName()
             except AttributeError:
                 return ""
-    
+
     ###########################################################################
     ## replacements for buggy methods
     ###########################################################################
-    
+
     def showUserList(self, listId, lst):
         """
         Public method to show a user supplied list.
-        
+
         @param listId id of the list (integer)
         @param lst list to be show (list of strings)
         """
         if listId <= 0:
             return
-        
+
         # Setup seperator for user lists
-        self.SendScintilla(
-            QsciScintilla.SCI_AUTOCSETSEPARATOR, ord(self.UserSeparator))
+        self.SendScintilla(QsciScintilla.SCI_AUTOCSETSEPARATOR, ord(self.UserSeparator))
         self.SendScintilla(
-            QsciScintilla.SCI_USERLISTSHOW, listId,
-            self._encodeString(self.UserSeparator.join(lst)))
-        
+            QsciScintilla.SCI_USERLISTSHOW,
+            listId,
+            self._encodeString(self.UserSeparator.join(lst)),
+        )
+
         self.updateUserListSize()
-    
+
     def autoCompleteFromDocument(self):
         """
         Public method to resize list box after creation.
         """
         super().autoCompleteFromDocument()
         self.updateUserListSize()
-    
+
     def autoCompleteFromAPIs(self):
         """
         Public method to resize list box after creation.
         """
         super().autoCompleteFromAPIs()
         self.updateUserListSize()
-    
+
     def autoCompleteFromAll(self):
         """
         Public method to resize list box after creation.
         """
         super().autoCompleteFromAll()
         self.updateUserListSize()
-    
+
     ###########################################################################
     ## work-around for buggy behavior
     ###########################################################################
-    
+
     def updateUserListSize(self):
         """
         Public method to resize the completion list to fit with contents.
@@ -1589,37 +1639,38 @@
             hScrollbar = userListWidget.horizontalScrollBar()
             if hScrollbar.isVisible():
                 hScrollbarHeight = hScrollbar.sizeHint().height()
-                
+
                 geom = userListWidget.geometry()
                 geom.setHeight(geom.height() + hScrollbarHeight)
-                
+
                 charPos = self.SendScintilla(QsciScintilla.SCI_GETCURRENTPOS)
                 currentYPos = self.SendScintilla(
-                    QsciScintilla.SCI_POINTYFROMPOSITION, 0, charPos)
+                    QsciScintilla.SCI_POINTYFROMPOSITION, 0, charPos
+                )
                 if geom.y() < currentYPos:
                     geom.setY(geom.y() - hScrollbarHeight)
                     moveY = True
                 else:
                     moveY = False
-                
+
                 userListWidget.setGeometry(geom)
                 if moveY:
                     userListWidget.move(geom.x(), geom.y() - hScrollbarHeight)
-    
+
     def __completionListSelected(self, listId, txt):
         """
         Private slot to handle the selection from the completion list.
-        
+
         Note: This works around an issue of some window managers taking
         focus away from the application when clicked inside a completion
         list but not giving it back when an item is selected via a
         double-click.
-        
+
         @param listId the ID of the user list (integer)
         @param txt the selected text (string)
         """
         self.activateWindow()
-    
+
     def updateVerticalScrollBar(self):
         """
         Public method to update the vertical scroll bar to reflect the
@@ -1628,15 +1679,15 @@
         # Workaround because Scintilla.Redraw isn't implemented
         self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0)
         self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 1)
-    
+
     ###########################################################################
     ## utility methods
     ###########################################################################
-    
+
     def _encodeString(self, string):
         """
         Protected method to encode a string depending on the current mode.
-        
+
         @param string string to be encoded (str)
         @return encoded string (bytes)
         """
@@ -1647,49 +1698,51 @@
                 return string.encode("utf-8")
             else:
                 return string.encode("latin-1")
-    
+
     #########################################################################
     ## Methods below are missing from QScintilla.
     #########################################################################
 
     if "setWrapStartIndent" not in QsciScintilla.__dict__:
+
         def setWrapStartIndent(self, indent):
             """
             Public method to set a the amount of characters wrapped sublines
             shall be indented.
-            
+
             @param indent amount of characters to indent
             @type int
             """
             self.SendScintilla(QsciScintilla.SCI_SETWRAPSTARTINDENT, indent)
-    
+
     if "getGlobalCursorPosition" not in QsciScintilla.__dict__:
+
         def getGlobalCursorPosition(self):
             """
             Public method to determine the point of the cursor.
-            
+
             @return point of the cursor
             @rtype QPoint
             """
             pos = self.currentPosition()
-            x = self.SendScintilla(QsciScintilla.SCI_POINTXFROMPOSITION,
-                                   0, pos)
-            y = self.SendScintilla(QsciScintilla.SCI_POINTYFROMPOSITION,
-                                   0, pos)
+            x = self.SendScintilla(QsciScintilla.SCI_POINTXFROMPOSITION, 0, pos)
+            y = self.SendScintilla(QsciScintilla.SCI_POINTYFROMPOSITION, 0, pos)
             return QPoint(x, y)
-    
+
     if "cancelCallTips" not in QsciScintilla.__dict__:
+
         def cancelCallTips(self):
             """
             Public method to cancel displayed call tips.
             """
             self.SendScintilla(QsciScintilla.SCI_CALLTIPCANCEL)
-    
+
     if "lineIndexFromPoint" not in QsciScintilla.__dict__:
+
         def lineIndexFromPoint(self, point):
             """
             Public method to convert a point to line and index.
-            
+
             @param point point to be converted
             @type QPoin
             @return tuple containing the line number and index number
@@ -1697,7 +1750,8 @@
             """
             pos = self.positionFromPoint(point)
             return self.lineIndexFromPosition(pos)
-    
+
+
 ##    #########################################################################
 ##    ## Methods below have been added to QScintilla starting with version 2.x.
 ##    #########################################################################
--- a/src/eric7/QScintilla/SearchReplaceWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/SearchReplaceWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,12 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, pyqtSlot, QEvent
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QToolButton, QScrollArea, QSizePolicy, QFrame
+    QWidget,
+    QHBoxLayout,
+    QToolButton,
+    QScrollArea,
+    QSizePolicy,
+    QFrame,
 )
 
 from .Editor import Editor
@@ -28,15 +33,16 @@
 class SearchReplaceWidget(QWidget):
     """
     Class implementing the search and replace widget.
-    
+
     @signal searchListChanged() emitted to indicate a change of the search list
     """
+
     searchListChanged = pyqtSignal()
-    
+
     def __init__(self, replace, vm, parent=None, sliding=False):
         """
         Constructor
-        
+
         @param replace flag indicating a replace widget is called
         @param vm reference to the viewmanager object
         @param parent parent widget of this widget (QWidget)
@@ -44,18 +50,19 @@
             sliding widget (boolean)
         """
         super().__init__(parent)
-        
+
         self.__viewmanager = vm
         self.__isMiniEditor = vm is parent
         self.__replace = replace
         self.__sliding = sliding
         if sliding:
             self.__topWidget = parent
-        
-        self.findHistory = vm.getSRHistory('search')
+
+        self.findHistory = vm.getSRHistory("search")
         if replace:
             from .Ui_ReplaceWidget import Ui_ReplaceWidget
-            self.replaceHistory = vm.getSRHistory('replace')
+
+            self.replaceHistory = vm.getSRHistory("replace")
             self.ui = Ui_ReplaceWidget()
             whatsThis = self.tr(
                 """<b>Find and Replace</b>
@@ -67,6 +74,7 @@
             )
         else:
             from .Ui_SearchWidget import Ui_SearchWidget
+
             self.ui = Ui_SearchWidget()
             whatsThis = self.tr(
                 """<b>Find</b>
@@ -78,7 +86,7 @@
         self.ui.setupUi(self)
         if not replace:
             self.ui.wrapCheckBox.setChecked(True)
-        
+
         whatsThis += self.tr(
             """<table border="0">
 <tr><td><code>.</code></td><td>Matches any character</td></tr>
@@ -127,100 +135,117 @@
 """
         )
         self.setWhatsThis(whatsThis)
-        
+
         # set icons
         self.ui.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
-        self.ui.findPrevButton.setIcon(
-            UI.PixmapCache.getIcon("1leftarrow"))
-        self.ui.findNextButton.setIcon(
-            UI.PixmapCache.getIcon("1rightarrow"))
-        self.ui.extendButton.setIcon(
-            UI.PixmapCache.getIcon("2rightarrow"))
-        
+        self.ui.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
+        self.ui.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
+        self.ui.extendButton.setIcon(UI.PixmapCache.getIcon("2rightarrow"))
+
         if replace:
-            self.ui.replaceButton.setIcon(
-                UI.PixmapCache.getIcon("editReplace"))
+            self.ui.replaceButton.setIcon(UI.PixmapCache.getIcon("editReplace"))
             self.ui.replaceSearchButton.setIcon(
-                UI.PixmapCache.getIcon("editReplaceSearch"))
-            self.ui.replaceAllButton.setIcon(
-                UI.PixmapCache.getIcon("editReplaceAll"))
-        
+                UI.PixmapCache.getIcon("editReplaceSearch")
+            )
+            self.ui.replaceAllButton.setIcon(UI.PixmapCache.getIcon("editReplaceAll"))
+
         # set line edit completers
         self.ui.findtextCombo.setCompleter(None)
         self.ui.findtextCombo.lineEdit().returnPressed.connect(
-            self.__findByReturnPressed)
+            self.__findByReturnPressed
+        )
         if replace:
             self.ui.replacetextCombo.setCompleter(None)
             self.ui.replacetextCombo.lineEdit().returnPressed.connect(
-                self.on_replaceButton_clicked)
-        
+                self.on_replaceButton_clicked
+            )
+
         self.ui.findtextCombo.lineEdit().textEdited.connect(self.__quickSearch)
-        self.ui.caseCheckBox.toggled.connect(
-            self.__updateQuickSearchMarkers)
-        self.ui.wordCheckBox.toggled.connect(
-            self.__updateQuickSearchMarkers)
-        self.ui.regexpCheckBox.toggled.connect(
-            self.__updateQuickSearchMarkers)
-        
-        self.__findtextComboStyleSheet = (
-            self.ui.findtextCombo.styleSheet()
-        )
-        
+        self.ui.caseCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
+        self.ui.wordCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
+        self.ui.regexpCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
+
+        self.__findtextComboStyleSheet = self.ui.findtextCombo.styleSheet()
+
         # define actions
         self.findNextAct = EricAction(
-            self.tr('Find Next'),
-            self.tr('Find Next'),
-            0, 0, self, 'search_widget_find_next')
+            self.tr("Find Next"),
+            self.tr("Find Next"),
+            0,
+            0,
+            self,
+            "search_widget_find_next",
+        )
         self.findNextAct.triggered.connect(self.on_findNextButton_clicked)
         self.findNextAct.setShortcutContext(
-            Qt.ShortcutContext.WidgetWithChildrenShortcut)
-        
+            Qt.ShortcutContext.WidgetWithChildrenShortcut
+        )
+
         self.findPrevAct = EricAction(
-            self.tr('Find Prev'),
-            self.tr('Find Prev'),
-            0, 0, self, 'search_widget_find_prev')
+            self.tr("Find Prev"),
+            self.tr("Find Prev"),
+            0,
+            0,
+            self,
+            "search_widget_find_prev",
+        )
         self.findPrevAct.triggered.connect(self.on_findPrevButton_clicked)
         self.findPrevAct.setShortcutContext(
-            Qt.ShortcutContext.WidgetWithChildrenShortcut)
-        
+            Qt.ShortcutContext.WidgetWithChildrenShortcut
+        )
+
         if replace:
             self.replaceAndSearchAct = EricAction(
                 self.tr("Replace and Search"),
                 self.tr("Replace and Search"),
-                0, 0, self, "replace_widget_replace_search")
+                0,
+                0,
+                self,
+                "replace_widget_replace_search",
+            )
             self.replaceAndSearchAct.triggered.connect(
-                self.on_replaceSearchButton_clicked)
+                self.on_replaceSearchButton_clicked
+            )
             self.replaceAndSearchAct.setEnabled(False)
             self.replaceAndSearchAct.setShortcutContext(
-                Qt.ShortcutContext.WidgetWithChildrenShortcut)
-            
+                Qt.ShortcutContext.WidgetWithChildrenShortcut
+            )
+
             self.replaceSelectionAct = EricAction(
                 self.tr("Replace Occurrence"),
                 self.tr("Replace Occurrence"),
-                0, 0, self, "replace_widget_replace_occurrence")
-            self.replaceSelectionAct.triggered.connect(
-                self.on_replaceButton_clicked)
+                0,
+                0,
+                self,
+                "replace_widget_replace_occurrence",
+            )
+            self.replaceSelectionAct.triggered.connect(self.on_replaceButton_clicked)
             self.replaceSelectionAct.setEnabled(False)
             self.replaceSelectionAct.setShortcutContext(
-                Qt.ShortcutContext.WidgetWithChildrenShortcut)
-            
+                Qt.ShortcutContext.WidgetWithChildrenShortcut
+            )
+
             self.replaceAllAct = EricAction(
                 self.tr("Replace All"),
                 self.tr("Replace All"),
-                0, 0, self, "replace_widget_replace_all")
-            self.replaceAllAct.triggered.connect(
-                self.on_replaceAllButton_clicked)
+                0,
+                0,
+                self,
+                "replace_widget_replace_all",
+            )
+            self.replaceAllAct.triggered.connect(self.on_replaceAllButton_clicked)
             self.replaceAllAct.setEnabled(False)
             self.replaceAllAct.setShortcutContext(
-                Qt.ShortcutContext.WidgetWithChildrenShortcut)
-        
+                Qt.ShortcutContext.WidgetWithChildrenShortcut
+            )
+
         self.addAction(self.findNextAct)
         self.addAction(self.findPrevAct)
         if replace:
             self.addAction(self.replaceAndSearchAct)
             self.addAction(self.replaceSelectionAct)
             self.addAction(self.replaceAllAct)
-        
+
         # disable search and replace buttons and actions
         self.__setFindNextEnabled(False)
         self.__setFindPrevEnabled(False)
@@ -228,97 +253,98 @@
             self.__setReplaceAndSearchEnabled(False)
             self.__setReplaceSelectionEnabled(False)
             self.__setReplaceAllEnabled(False)
-        
+
         self.adjustSize()
-        
+
         self.havefound = False
         self.__pos = None
         self.__findBackwards = False
         self.__selections = []
         self.__finding = False
-    
+
     def __setShortcuts(self):
         """
         Private method to set the local action's shortcuts to the same key
         sequences as in the view manager.
         """
         if not self.__isMiniEditor:
-            self.findNextAct.setShortcuts(
-                self.__viewmanager.searchNextAct.shortcuts())
-            self.findPrevAct.setShortcuts(
-                self.__viewmanager.searchPrevAct.shortcuts())
-            
+            self.findNextAct.setShortcuts(self.__viewmanager.searchNextAct.shortcuts())
+            self.findPrevAct.setShortcuts(self.__viewmanager.searchPrevAct.shortcuts())
+
             if self.__replace:
                 self.replaceAndSearchAct.setShortcuts(
-                    self.__viewmanager.replaceAndSearchAct.shortcuts())
+                    self.__viewmanager.replaceAndSearchAct.shortcuts()
+                )
                 self.replaceSelectionAct.setShortcuts(
-                    self.__viewmanager.replaceSelectionAct.shortcuts())
+                    self.__viewmanager.replaceSelectionAct.shortcuts()
+                )
                 self.replaceAllAct.setShortcuts(
-                    self.__viewmanager.replaceAllAct.shortcuts())
-    
+                    self.__viewmanager.replaceAllAct.shortcuts()
+                )
+
     def __setFindNextEnabled(self, enable):
         """
         Private method to set the enabled state of "Find Next".
-        
+
         @param enable flag indicating the enable state to be set
         @type bool
         """
         self.ui.findNextButton.setEnabled(enable)
         self.findNextAct.setEnabled(enable)
-    
+
     def __setFindPrevEnabled(self, enable):
         """
         Private method to set the enabled state of "Find Prev".
-        
+
         @param enable flag indicating the enable state to be set
         @type bool
         """
         self.ui.findPrevButton.setEnabled(enable)
         self.findPrevAct.setEnabled(enable)
-    
+
     def __setReplaceAndSearchEnabled(self, enable):
         """
         Private method to set the enabled state of "Replace And Search".
-        
+
         @param enable flag indicating the enable state to be set
         @type bool
         """
         self.ui.replaceSearchButton.setEnabled(enable)
         self.replaceAndSearchAct.setEnabled(enable)
-    
+
     def __setReplaceSelectionEnabled(self, enable):
         """
         Private method to set the enabled state of "Replace Occurrence".
-        
+
         @param enable flag indicating the enable state to be set
         @type bool
         """
         self.ui.replaceButton.setEnabled(enable)
         self.replaceSelectionAct.setEnabled(enable)
-    
+
     def __setReplaceAllEnabled(self, enable):
         """
         Private method to set the enabled state of "Replace All".
-        
+
         @param enable flag indicating the enable state to be set
         @type bool
         """
         self.ui.replaceAllButton.setEnabled(enable)
         self.replaceAllAct.setEnabled(enable)
-    
+
     def changeEvent(self, evt):
         """
         Protected method handling state changes.
-        
+
         @param evt event containing the state change (QEvent)
         """
         if evt.type() == QEvent.Type.FontChange:
             self.adjustSize()
-    
+
     def __selectionBoundary(self, selections=None):
         """
         Private method to calculate the current selection boundary.
-        
+
         @param selections optional parameter giving the selections to
             calculate the boundary for (list of tuples of four integer)
         @return tuple of start line and index and end line and index
@@ -327,32 +353,33 @@
         if selections is None:
             selections = self.__selections
         if selections:
-            lineNumbers = (
-                [sel[0] for sel in selections] +
-                [sel[2] for sel in selections]
+            lineNumbers = [sel[0] for sel in selections] + [
+                sel[2] for sel in selections
+            ]
+            indexNumbers = [sel[1] for sel in selections] + [
+                sel[3] for sel in selections
+            ]
+            startLine, startIndex, endLine, endIndex = (
+                min(lineNumbers),
+                min(indexNumbers),
+                max(lineNumbers),
+                max(indexNumbers),
             )
-            indexNumbers = (
-                [sel[1] for sel in selections] +
-                [sel[3] for sel in selections]
-            )
-            startLine, startIndex, endLine, endIndex = (
-                min(lineNumbers), min(indexNumbers),
-                max(lineNumbers), max(indexNumbers))
         else:
             startLine, startIndex, endLine, endIndex = -1, -1, -1, -1
-        
+
         return startLine, startIndex, endLine, endIndex
-    
+
     @pyqtSlot(str)
     def on_findtextCombo_editTextChanged(self, txt):
         """
         Private slot to enable/disable the find buttons.
-        
+
         @param txt text of the find text combo
         @type str
         """
         enable = bool(txt)
-        
+
         self.__setFindNextEnabled(enable)
         self.__setFindPrevEnabled(enable)
         self.ui.extendButton.setEnabled(enable)
@@ -360,12 +387,12 @@
             self.__setReplaceSelectionEnabled(False)
             self.__setReplaceAndSearchEnabled(False)
             self.__setReplaceAllEnabled(enable)
-    
+
     @pyqtSlot(str)
     def __quickSearch(self, txt):
         """
         Private slot to search for the entered text while typing.
-        
+
         @param txt text of the search edit
         @type str
         """
@@ -373,12 +400,16 @@
         aw.hideFindIndicator()
         if Preferences.getEditor("QuickSearchMarkersEnabled"):
             self.__quickSearchMarkOccurrences(txt)
-        
+
         lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
-        posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
-                     self.ui.regexpCheckBox.isChecked())
-        cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
-                     self.ui.regexpCheckBox.isChecked())
+        posixMode = (
+            Preferences.getEditor("SearchRegexpMode") == 0
+            and self.ui.regexpCheckBox.isChecked()
+        )
+        cxx11Mode = (
+            Preferences.getEditor("SearchRegexpMode") == 1
+            and self.ui.regexpCheckBox.isChecked()
+        )
         ok = aw.findFirst(
             txt,
             self.ui.regexpCheckBox.isChecked(),
@@ -386,55 +417,63 @@
             self.ui.wordCheckBox.isChecked(),
             self.ui.wrapCheckBox.isChecked(),
             not self.__findBackwards,
-            lineFrom, indexFrom,
+            lineFrom,
+            indexFrom,
             posix=posixMode,
-            cxx11=cxx11Mode
+            cxx11=cxx11Mode,
         )
         if ok:
             sline, sindex, eline, eindex = aw.getSelection()
             aw.showFindIndicator(sline, sindex, eline, eindex)
-        
+
         if not txt:
-            ok = True   # reset the color in case of an empty text
-        
+            ok = True  # reset the color in case of an empty text
+
         self.__setSearchEditColors(ok)
-    
+
     def __quickSearchMarkOccurrences(self, txt):
         """
         Private method to mark all occurrences of the search text.
-        
+
         @param txt text to search for (string)
         """
         aw = self.__viewmanager.activeWindow()
-        
+
         lineFrom = 0
         indexFrom = 0
         lineTo = -1
         indexTo = -1
-        
+
         aw.clearSearchIndicators()
-        posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
-                     self.ui.regexpCheckBox.isChecked())
-        cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
-                     self.ui.regexpCheckBox.isChecked())
+        posixMode = (
+            Preferences.getEditor("SearchRegexpMode") == 0
+            and self.ui.regexpCheckBox.isChecked()
+        )
+        cxx11Mode = (
+            Preferences.getEditor("SearchRegexpMode") == 1
+            and self.ui.regexpCheckBox.isChecked()
+        )
         ok = aw.findFirstTarget(
             txt,
             self.ui.regexpCheckBox.isChecked(),
             self.ui.caseCheckBox.isChecked(),
             self.ui.wordCheckBox.isChecked(),
-            lineFrom, indexFrom, lineTo, indexTo,
+            lineFrom,
+            indexFrom,
+            lineTo,
+            indexTo,
             posix=posixMode,
-            cxx11=cxx11Mode
+            cxx11=cxx11Mode,
         )
         while ok:
             tgtPos, tgtLen = aw.getFoundTarget()
             aw.setSearchIndicator(tgtPos, tgtLen)
             ok = aw.findNextTarget()
-    
+
     def __setSearchEditColors(self, ok):
         """
         Private method to set the search edit colors.
-        
+
         @param ok flag indicating a match
         @type bool
         """
@@ -443,9 +482,8 @@
                 "color: #000000; background-color: #ff6666;"
             )
         else:
-            self.ui.findtextCombo.setStyleSheet(
-                self.__findtextComboStyleSheet)
-    
+            self.ui.findtextCombo.setStyleSheet(self.__findtextComboStyleSheet)
+
     @pyqtSlot()
     def on_extendButton_clicked(self):
         """
@@ -454,15 +492,15 @@
         aw = self.__viewmanager.activeWindow()
         if aw is None:
             return
-        
+
         txt = self.ui.findtextCombo.currentText()
         if not txt:
             return
-        
+
         line, index = aw.getCursorPosition()
         text = aw.text(line)
-        
-        rx = re.compile(r'[^\w_]')
+
+        rx = re.compile(r"[^\w_]")
         match = rx.search(text, index)
         if match:
             end = match.start()
@@ -472,25 +510,25 @@
                 self.ui.findtextCombo.setEditText(txt)
                 self.ui.findtextCombo.lineEdit().selectAll()
                 self.__quickSearch(txt)
-    
+
     @pyqtSlot(bool)
     def __updateQuickSearchMarkers(self, on):
         """
         Private slot to handle the selection of the various check boxes.
-        
+
         @param on status of the check box (ignored)
         @type bool
         """
         txt = self.ui.findtextCombo.currentText()
         self.__quickSearch(txt)
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next occurrence of text.
         """
         self.findNext()
-    
+
     def findNext(self):
         """
         Public slot to find the next occurrence of text.
@@ -501,10 +539,10 @@
             else:
                 self.__viewmanager.showSearchWidget()
             return
-        
+
         self.__findBackwards = False
         txt = self.ui.findtextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.findHistory:
@@ -513,7 +551,7 @@
         self.ui.findtextCombo.clear()
         self.ui.findtextCombo.addItems(self.findHistory)
         self.searchListChanged.emit()
-        
+
         ok = self.__findNextPrev(txt, False)
         self.__setSearchEditColors(ok)
         if ok:
@@ -522,8 +560,8 @@
                 self.__setReplaceAndSearchEnabled(True)
         else:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("'{0}' was not found.").format(txt))
+                self, self.windowTitle(), self.tr("'{0}' was not found.").format(txt)
+            )
 
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
@@ -531,7 +569,7 @@
         Private slot to find the previous occurrence of text.
         """
         self.findPrev()
-    
+
     def findPrev(self):
         """
         Public slot to find the next previous of text.
@@ -539,10 +577,10 @@
         if not self.havefound or not self.ui.findtextCombo.currentText():
             self.show(self.__viewmanager.textForFind())
             return
-        
+
         self.__findBackwards = True
         txt = self.ui.findtextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.findHistory:
@@ -551,7 +589,7 @@
         self.ui.findtextCombo.clear()
         self.ui.findtextCombo.addItems(self.findHistory)
         self.searchListChanged.emit()
-        
+
         ok = self.__findNextPrev(txt, True)
         self.__setSearchEditColors(ok)
         if ok:
@@ -560,9 +598,9 @@
                 self.__setReplaceAndSearchEnabled(True)
         else:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("'{0}' was not found.").format(txt))
-    
+                self, self.windowTitle(), self.tr("'{0}' was not found.").format(txt)
+            )
+
     def __findByReturnPressed(self):
         """
         Private slot to handle the returnPressed signal of the findtext
@@ -572,11 +610,11 @@
             self.findPrev()
         else:
             self.findNext()
-    
+
     def __markOccurrences(self, txt):
         """
         Private method to mark all occurrences of the search text.
-        
+
         @param txt text to search for (string)
         """
         aw = self.__viewmanager.activeWindow()
@@ -586,19 +624,28 @@
         indexTo = -1
         if self.ui.selectionCheckBox.isChecked():
             lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary()
-        posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
-                     self.ui.regexpCheckBox.isChecked())
-        cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
-                     self.ui.regexpCheckBox.isChecked())
-        
+        posixMode = (
+            Preferences.getEditor("SearchRegexpMode") == 0
+            and self.ui.regexpCheckBox.isChecked()
+        )
+        cxx11Mode = (
+            Preferences.getEditor("SearchRegexpMode") == 1
+            and self.ui.regexpCheckBox.isChecked()
+        )
+
         aw.clearSearchIndicators()
         ok = aw.findFirstTarget(
             txt,
             self.ui.regexpCheckBox.isChecked(),
             self.ui.caseCheckBox.isChecked(),
             self.ui.wordCheckBox.isChecked(),
-            lineFrom, indexFrom, lineTo, indexTo,
-            posix=posixMode, cxx11=cxx11Mode)
+            lineFrom,
+            indexFrom,
+            lineTo,
+            indexTo,
+            posix=posixMode,
+            cxx11=cxx11Mode,
+        )
         while ok:
             tgtPos, tgtLen = aw.getFoundTarget()
             if tgtLen == 0:
@@ -607,11 +654,7 @@
                 lineFrom, indexFrom = aw.lineIndexFromPosition(tgtPos)
                 lineTo, indexTo = aw.lineIndexFromPosition(tgtPos + tgtLen)
                 for sel in self.__selections:
-                    if (
-                        lineFrom == sel[0] and
-                        indexFrom >= sel[1] and
-                        indexTo <= sel[3]
-                    ):
+                    if lineFrom == sel[0] and indexFrom >= sel[1] and indexTo <= sel[3]:
                         indicate = True
                         break
                 else:
@@ -624,31 +667,31 @@
         with contextlib.suppress(AttributeError):
             aw.updateMarkerMap()
             # ignore it for MiniEditor
-    
+
     def __findNextPrev(self, txt, backwards):
         """
         Private method to find the next occurrence of the search text.
-        
+
         @param txt text to search for (string)
         @param backwards flag indicating a backwards search (boolean)
         @return flag indicating success (boolean)
         """
         self.__finding = True
-        
+
         if Preferences.getEditor("SearchMarkersEnabled"):
             self.__markOccurrences(txt)
-        
+
         aw = self.__viewmanager.activeWindow()
         aw.hideFindIndicator()
         cline, cindex = aw.getCursorPosition()
-        
+
         ok = True
         lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
         boundary = self.__selectionBoundary()
         if backwards:
             if (
-                self.ui.selectionCheckBox.isChecked() and
-                (lineFrom, indexFrom, lineTo, indexTo) == boundary
+                self.ui.selectionCheckBox.isChecked()
+                and (lineFrom, indexFrom, lineTo, indexTo) == boundary
             ):
                 # initial call
                 line, index = boundary[2:]
@@ -661,13 +704,13 @@
                     line = lineFrom
                     index = indexFrom
             if (
-                self.ui.selectionCheckBox.isChecked() and
-                line == boundary[0] and
-                index >= 0 and
-                index < boundary[1]
+                self.ui.selectionCheckBox.isChecked()
+                and line == boundary[0]
+                and index >= 0
+                and index < boundary[1]
             ):
                 ok = False
-            
+
             if ok and index < 0:
                 line -= 1
                 if self.ui.selectionCheckBox.isChecked():
@@ -689,20 +732,24 @@
                         index = aw.lineLength(line)
         else:
             if (
-                self.ui.selectionCheckBox.isChecked() and
-                (lineFrom, indexFrom, lineTo, indexTo) == boundary
+                self.ui.selectionCheckBox.isChecked()
+                and (lineFrom, indexFrom, lineTo, indexTo) == boundary
             ):
                 # initial call
                 line, index = boundary[:2]
             else:
                 line = lineTo
                 index = indexTo
-        
+
         if ok:
-            posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
-                         self.ui.regexpCheckBox.isChecked())
-            cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
-                         self.ui.regexpCheckBox.isChecked())
+            posixMode = (
+                Preferences.getEditor("SearchRegexpMode") == 0
+                and self.ui.regexpCheckBox.isChecked()
+            )
+            cxx11Mode = (
+                Preferences.getEditor("SearchRegexpMode") == 1
+                and self.ui.regexpCheckBox.isChecked()
+            )
             ok = aw.findFirst(
                 txt,
                 self.ui.regexpCheckBox.isChecked(),
@@ -710,37 +757,34 @@
                 self.ui.wordCheckBox.isChecked(),
                 self.ui.wrapCheckBox.isChecked(),
                 not backwards,
-                line, index,
+                line,
+                index,
                 posix=posixMode,
-                cxx11=cxx11Mode)
-        
+                cxx11=cxx11Mode,
+            )
+
         if ok and self.ui.selectionCheckBox.isChecked():
             lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
             if len(self.__selections) > 1:
                 for sel in self.__selections:
-                    if (
-                        lineFrom == sel[0] and
-                        indexFrom >= sel[1] and
-                        indexTo <= sel[3]
-                    ):
+                    if lineFrom == sel[0] and indexFrom >= sel[1] and indexTo <= sel[3]:
                         ok = True
                         break
                 else:
                     ok = False
             elif (
-                (lineFrom == boundary[0] and indexFrom >= boundary[1]) or
-                (lineFrom > boundary[0] and lineFrom < boundary[2]) or
-                (lineFrom == boundary[2] and indexFrom <= boundary[3])
+                (lineFrom == boundary[0] and indexFrom >= boundary[1])
+                or (lineFrom > boundary[0] and lineFrom < boundary[2])
+                or (lineFrom == boundary[2] and indexFrom <= boundary[3])
             ):
                 ok = True
             else:
                 ok = False
             if not ok and len(self.__selections) > 1:
                 # try again
-                while (
-                    not ok and
-                    ((backwards and lineFrom >= boundary[0]) or
-                     (not backwards and lineFrom <= boundary[2]))
+                while not ok and (
+                    (backwards and lineFrom >= boundary[0])
+                    or (not backwards and lineFrom <= boundary[2])
                 ):
                     for ind in range(len(self.__selections)):
                         if lineFrom == self.__selections[ind][0]:
@@ -750,15 +794,11 @@
                                     line, index = self.__selections[ind][2:]
                                 else:
                                     if ind > 0:
-                                        line, index = (
-                                            self.__selections[ind - 1][2:]
-                                        )
+                                        line, index = self.__selections[ind - 1][2:]
                             else:
                                 if after:
                                     if ind < len(self.__selections) - 1:
-                                        line, index = (
-                                            self.__selections[ind + 1][:2]
-                                        )
+                                        line, index = self.__selections[ind + 1][:2]
                                 else:
                                     line, index = self.__selections[ind][:2]
                             break
@@ -771,20 +811,20 @@
                         self.ui.wordCheckBox.isChecked(),
                         self.ui.wrapCheckBox.isChecked(),
                         not backwards,
-                        line, index,
+                        line,
+                        index,
                         posix=posixMode,
-                        cxx11=cxx11Mode)
+                        cxx11=cxx11Mode,
+                    )
                     if ok:
-                        lineFrom, indexFrom, lineTo, indexTo = (
-                            aw.getSelection()
-                        )
+                        lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
                         if (
-                            lineFrom < boundary[0] or
-                            lineFrom > boundary[2] or
-                            indexFrom < boundary[1] or
-                            indexFrom > boundary[3] or
-                            indexTo < boundary[1] or
-                            indexTo > boundary[3]
+                            lineFrom < boundary[0]
+                            or lineFrom > boundary[2]
+                            or indexFrom < boundary[1]
+                            or indexFrom > boundary[3]
+                            or indexTo < boundary[1]
+                            or indexTo > boundary[3]
                         ):
                             ok = False
                             break
@@ -802,59 +842,56 @@
                         self.ui.wordCheckBox.isChecked(),
                         self.ui.wrapCheckBox.isChecked(),
                         not backwards,
-                        line, index,
+                        line,
+                        index,
                         posix=posixMode,
-                        cxx11=cxx11Mode)
+                        cxx11=cxx11Mode,
+                    )
                     if ok:
-                        lineFrom, indexFrom, lineTo, indexTo = (
-                            aw.getSelection()
-                        )
+                        lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
                         if len(self.__selections) > 1:
                             for sel in self.__selections:
                                 if (
-                                    lineFrom == sel[0] and
-                                    indexFrom >= sel[1] and
-                                    indexTo <= sel[3]
+                                    lineFrom == sel[0]
+                                    and indexFrom >= sel[1]
+                                    and indexTo <= sel[3]
                                 ):
                                     ok = True
                                     break
                             else:
                                 ok = False
                         elif (
-                            (lineFrom == boundary[0] and
-                             indexFrom >= boundary[1]) or
-                            (lineFrom > boundary[0] and
-                             lineFrom < boundary[2]) or
-                            (lineFrom == boundary[2] and
-                             indexFrom <= boundary[3])
+                            (lineFrom == boundary[0] and indexFrom >= boundary[1])
+                            or (lineFrom > boundary[0] and lineFrom < boundary[2])
+                            or (lineFrom == boundary[2] and indexFrom <= boundary[3])
                         ):
                             ok = True
                         else:
                             ok = False
                 else:
                     ok = False
-            
+
             if not ok:
                 aw.selectAll(False)
                 aw.setCursorPosition(cline, cindex)
                 aw.ensureCursorVisible()
-        
+
         if ok:
             sline, sindex, eline, eindex = aw.getSelection()
             aw.showFindIndicator(sline, sindex, eline, eindex)
-        
+
         self.__finding = False
-        
+
         return ok
 
-    def __showFind(self, text=''):
+    def __showFind(self, text=""):
         """
         Private method to display this widget in find mode.
-        
+
         @param text text to be shown in the findtext edit (string)
         """
         self.__replace = False
-        
+
         self.__setSearchEditColors(True)
         self.ui.findtextCombo.clear()
         self.ui.findtextCombo.addItems(self.findHistory)
@@ -862,74 +899,72 @@
         self.ui.findtextCombo.lineEdit().selectAll()
         self.ui.findtextCombo.setFocus()
         self.on_findtextCombo_editTextChanged(text)
-        
+
         self.ui.caseCheckBox.setChecked(False)
         self.ui.wordCheckBox.setChecked(False)
         self.ui.wrapCheckBox.setChecked(True)
         self.ui.regexpCheckBox.setChecked(False)
-        
+
         aw = self.__viewmanager.activeWindow()
         self.updateSelectionCheckBox(aw)
-        
+
         self.havefound = True
         self.__findBackwards = False
-        
+
         self.__setShortcuts()
-    
+
     def selectionChanged(self, editor):
         """
         Public slot tracking changes of selected text.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         self.updateSelectionCheckBox(editor)
-    
+
     @pyqtSlot(Editor)
     def updateSelectionCheckBox(self, editor):
         """
         Public slot to update the selection check box.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         if not self.__finding and isinstance(editor, Editor):
             if editor.hasSelectedText():
                 selections = editor.getSelections()
-                line1, index1, line2, index2 = (
-                    self.__selectionBoundary(selections)
-                )
+                line1, index1, line2, index2 = self.__selectionBoundary(selections)
                 if line1 != line2:
                     self.ui.selectionCheckBox.setEnabled(True)
                     self.ui.selectionCheckBox.setChecked(True)
                     self.__selections = selections
                     return
-            
+
             self.ui.selectionCheckBox.setEnabled(False)
             self.ui.selectionCheckBox.setChecked(False)
             self.__selections = []
-    
+
     def replace(self):
         """
         Public method to replace the current selection.
         """
         if self.ui.replaceButton.isEnabled():
             self.__doReplace(False)
-    
+
     def replaceSearch(self):
         """
         Public method to replace the current selection and search again.
         """
         if self.ui.replaceSearchButton.isEnabled():
             self.__doReplace(True)
-    
+
     @pyqtSlot()
     def on_replaceButton_clicked(self):
         """
         Private slot to replace one occurrence of text.
         """
         self.__doReplace(False)
-    
+
     @pyqtSlot()
     def on_replaceSearchButton_clicked(self):
         """
@@ -937,26 +972,26 @@
         one.
         """
         self.__doReplace(True)
-    
+
     def __doReplace(self, searchNext):
         """
         Private method to replace one occurrence of text.
-        
+
         @param searchNext flag indicating to search for the next occurrence
         (boolean).
         """
         self.__finding = True
-        
+
         # Check enabled status due to dual purpose usage of this method
         if (
-            not self.ui.replaceButton.isEnabled() and
-            not self.ui.replaceSearchButton.isEnabled()
+            not self.ui.replaceButton.isEnabled()
+            and not self.ui.replaceSearchButton.isEnabled()
         ):
             return
-        
+
         ftxt = self.ui.findtextCombo.currentText()
         rtxt = self.ui.replacetextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if rtxt in self.replaceHistory:
@@ -964,46 +999,48 @@
         self.replaceHistory.insert(0, rtxt)
         self.ui.replacetextCombo.clear()
         self.ui.replacetextCombo.addItems(self.replaceHistory)
-        
+
         aw = self.__viewmanager.activeWindow()
         aw.hideFindIndicator()
         aw.replace(rtxt)
-        
+
         if searchNext:
             ok = self.__findNextPrev(ftxt, self.__findBackwards)
             self.__setSearchEditColors(ok)
-            
+
             if not ok:
                 self.__setReplaceSelectionEnabled(False)
                 self.__setReplaceAndSearchEnabled(False)
                 EricMessageBox.information(
-                    self, self.windowTitle(),
-                    self.tr("'{0}' was not found.").format(ftxt))
+                    self,
+                    self.windowTitle(),
+                    self.tr("'{0}' was not found.").format(ftxt),
+                )
         else:
             self.__setReplaceSelectionEnabled(False)
             self.__setReplaceAndSearchEnabled(False)
             self.__setSearchEditColors(True)
-        
+
         self.__finding = False
-    
+
     def replaceAll(self):
         """
         Public method to replace all occurrences.
         """
         if self.ui.replaceAllButton.isEnabled():
             self.on_replaceAllButton_clicked()
-    
+
     @pyqtSlot()
     def on_replaceAllButton_clicked(self):
         """
         Private slot to replace all occurrences of text.
         """
         self.__finding = True
-        
+
         replacements = 0
         ftxt = self.ui.findtextCombo.currentText()
         rtxt = self.ui.replacetextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if ftxt in self.findHistory:
@@ -1011,13 +1048,13 @@
         self.findHistory.insert(0, ftxt)
         self.ui.findtextCombo.clear()
         self.ui.findtextCombo.addItems(self.findHistory)
-        
+
         if rtxt in self.replaceHistory:
             self.replaceHistory.remove(rtxt)
         self.replaceHistory.insert(0, rtxt)
         self.ui.replacetextCombo.clear()
         self.ui.replacetextCombo.addItems(self.replaceHistory)
-        
+
         aw = self.__viewmanager.activeWindow()
         aw.hideFindIndicator()
         cline, cindex = aw.getCursorPosition()
@@ -1027,36 +1064,40 @@
         else:
             line = 0
             index = 0
-        posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
-                     self.ui.regexpCheckBox.isChecked())
-        cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
-                     self.ui.regexpCheckBox.isChecked())
+        posixMode = (
+            Preferences.getEditor("SearchRegexpMode") == 0
+            and self.ui.regexpCheckBox.isChecked()
+        )
+        cxx11Mode = (
+            Preferences.getEditor("SearchRegexpMode") == 1
+            and self.ui.regexpCheckBox.isChecked()
+        )
         ok = aw.findFirst(
             ftxt,
             self.ui.regexpCheckBox.isChecked(),
             self.ui.caseCheckBox.isChecked(),
             self.ui.wordCheckBox.isChecked(),
-            False, True, line, index,
+            False,
+            True,
+            line,
+            index,
             posix=posixMode,
-            cxx11=cxx11Mode)
-        
+            cxx11=cxx11Mode,
+        )
+
         if ok and self.ui.selectionCheckBox.isChecked():
             lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
             if len(self.__selections) > 1:
                 for sel in self.__selections:
-                    if (
-                        lineFrom == sel[0] and
-                        indexFrom >= sel[1] and
-                        indexTo <= sel[3]
-                    ):
+                    if lineFrom == sel[0] and indexFrom >= sel[1] and indexTo <= sel[3]:
                         ok = True
                         break
                 else:
                     ok = False
             elif (
-                (lineFrom == boundary[0] and indexFrom >= boundary[1]) or
-                (lineFrom > boundary[0] and lineFrom < boundary[2]) or
-                (lineFrom == boundary[2] and indexFrom <= boundary[3])
+                (lineFrom == boundary[0] and indexFrom >= boundary[1])
+                or (lineFrom > boundary[0] and lineFrom < boundary[2])
+                or (lineFrom == boundary[2] and indexFrom <= boundary[3])
             ):
                 ok = True
             else:
@@ -1069,9 +1110,7 @@
                             after = indexTo > self.__selections[ind][3]
                             if after:
                                 if ind < len(self.__selections) - 1:
-                                    line, index = (
-                                        self.__selections[ind + 1][:2]
-                                    )
+                                    line, index = self.__selections[ind + 1][:2]
                             else:
                                 line, index = self.__selections[ind][:2]
                         break
@@ -1082,31 +1121,33 @@
                         self.ui.regexpCheckBox.isChecked(),
                         self.ui.caseCheckBox.isChecked(),
                         self.ui.wordCheckBox.isChecked(),
-                        False, True, line, index,
+                        False,
+                        True,
+                        line,
+                        index,
                         posix=posixMode,
-                        cxx11=cxx11Mode)
+                        cxx11=cxx11Mode,
+                    )
                     if ok:
-                        lineFrom, indexFrom, lineTo, indexTo = (
-                            aw.getSelection()
-                        )
+                        lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
                         if (
-                            lineFrom < boundary[0] or
-                            lineFrom > boundary[2] or
-                            indexFrom < boundary[1] or
-                            indexFrom > boundary[3] or
-                            indexTo < boundary[1] or
-                            indexTo > boundary[3]
+                            lineFrom < boundary[0]
+                            or lineFrom > boundary[2]
+                            or indexFrom < boundary[1]
+                            or indexFrom > boundary[3]
+                            or indexTo < boundary[1]
+                            or indexTo > boundary[3]
                         ):
                             ok = False
                             break
-            
+
             if not ok:
                 aw.selectAll(False)
                 aw.setCursorPosition(cline, cindex)
                 aw.ensureCursorVisible()
-        
+
         found = ok
-        
+
         aw.beginUndoAction()
         wordWrap = self.ui.wrapCheckBox.isChecked()
         self.ui.wrapCheckBox.setChecked(False)
@@ -1120,31 +1161,33 @@
             self.ui.wrapCheckBox.setChecked(True)
         self.__setReplaceSelectionEnabled(False)
         self.__setReplaceAndSearchEnabled(False)
-        
+
         if found:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("Replaced {0} occurrences.")
-                .format(replacements))
+                self,
+                self.windowTitle(),
+                self.tr("Replaced {0} occurrences.").format(replacements),
+            )
         else:
             EricMessageBox.information(
-                self, self.windowTitle(),
-                self.tr("Nothing replaced because '{0}' was not found.")
-                .format(ftxt))
-        
+                self,
+                self.windowTitle(),
+                self.tr("Nothing replaced because '{0}' was not found.").format(ftxt),
+            )
+
         aw.setCursorPosition(cline, cindex)
         aw.ensureCursorVisible()
-        
+
         self.__finding = False
-        
-    def __showReplace(self, text=''):
+
+    def __showReplace(self, text=""):
         """
         Private slot to display this widget in replace mode.
-        
+
         @param text text to be shown in the findtext edit
         """
         self.__replace = True
-        
+
         self.__setSearchEditColors(True)
         self.ui.findtextCombo.clear()
         self.ui.findtextCombo.addItems(self.findHistory)
@@ -1152,17 +1195,17 @@
         self.ui.findtextCombo.lineEdit().selectAll()
         self.ui.findtextCombo.setFocus()
         self.on_findtextCombo_editTextChanged(text)
-        
+
         self.ui.replacetextCombo.clear()
         self.ui.replacetextCombo.addItems(self.replaceHistory)
-        self.ui.replacetextCombo.setEditText('')
-        
+        self.ui.replacetextCombo.setEditText("")
+
         self.ui.caseCheckBox.setChecked(False)
         self.ui.wordCheckBox.setChecked(False)
         self.ui.regexpCheckBox.setChecked(False)
-        
+
         self.havefound = True
-        
+
         aw = self.__viewmanager.activeWindow()
         self.updateSelectionCheckBox(aw)
         if aw.hasSelectedText():
@@ -1170,13 +1213,13 @@
             if line1 == line2:
                 aw.setSelection(line1, index1, line1, index1)
                 self.findNext()
-        
+
         self.__setShortcuts()
 
-    def show(self, text=''):
+    def show(self, text=""):
         """
         Public slot to show the widget.
-        
+
         @param text text to be shown in the findtext edit (string)
         """
         if self.__replace:
@@ -1194,16 +1237,16 @@
         aw = self.__viewmanager.activeWindow()
         if aw:
             aw.hideFindIndicator()
-        
+
         if self.__sliding:
             self.__topWidget.close()
         else:
             self.close()
-    
+
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event (QKeyEvent)
         """
         if event.key() == Qt.Key.Key_Escape:
@@ -1221,64 +1264,68 @@
 class SearchReplaceSlidingWidget(QWidget):
     """
     Class implementing the search and replace widget with sliding behavior.
-    
+
     @signal searchListChanged() emitted to indicate a change of the search list
     """
+
     searchListChanged = pyqtSignal()
-    
+
     def __init__(self, replace, vm, parent=None):
         """
         Constructor
-        
+
         @param replace flag indicating a replace widget is called
         @param vm reference to the viewmanager object
         @param parent parent widget of this widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.__searchReplaceWidget = SearchReplaceWidget(
-            replace, vm, self, True)
-        
+
+        self.__searchReplaceWidget = SearchReplaceWidget(replace, vm, self, True)
+
         self.__layout = QHBoxLayout(self)
         self.setLayout(self.__layout)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__layout.setAlignment(Qt.AlignmentFlag.AlignTop)
-        
+
         self.__leftButton = QToolButton(self)
         self.__leftButton.setArrowType(Qt.ArrowType.LeftArrow)
         self.__leftButton.setSizePolicy(
-            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding)
+            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding
+        )
         self.__leftButton.setAutoRepeat(True)
-        
+
         self.__scroller = QScrollArea(self)
         self.__scroller.setWidget(self.__searchReplaceWidget)
         self.__scroller.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         self.__scroller.setFrameShape(QFrame.Shape.NoFrame)
         self.__scroller.setVerticalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+            Qt.ScrollBarPolicy.ScrollBarAlwaysOff
+        )
         self.__scroller.setHorizontalScrollBarPolicy(
-            Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
+            Qt.ScrollBarPolicy.ScrollBarAlwaysOff
+        )
         self.__scroller.setWidgetResizable(False)
-        
+
         self.__rightButton = QToolButton(self)
         self.__rightButton.setArrowType(Qt.ArrowType.RightArrow)
         self.__rightButton.setSizePolicy(
-            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding)
+            QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding
+        )
         self.__rightButton.setAutoRepeat(True)
-        
+
         self.__layout.addWidget(self.__leftButton)
         self.__layout.addWidget(self.__scroller)
         self.__layout.addWidget(self.__rightButton)
-        
+
         self.setMaximumHeight(self.__searchReplaceWidget.sizeHint().height())
         self.adjustSize()
-        
-        self.__searchReplaceWidget.searchListChanged.connect(
-            self.searchListChanged)
+
+        self.__searchReplaceWidget.searchListChanged.connect(self.searchListChanged)
         self.__leftButton.clicked.connect(self.__slideLeft)
         self.__rightButton.clicked.connect(self.__slideRight)
-    
+
     def changeEvent(self, evt):
         """
         Protected method handling state changes.
@@ -1286,86 +1333,85 @@
         @param evt event containing the state change (QEvent)
         """
         if evt.type() == QEvent.Type.FontChange:
-            self.setMaximumHeight(
-                self.__searchReplaceWidget.sizeHint().height())
+            self.setMaximumHeight(self.__searchReplaceWidget.sizeHint().height())
             self.adjustSize()
-    
+
     def findNext(self):
         """
         Public slot to find the next occurrence of text.
         """
         self.__searchReplaceWidget.findNext()
-    
+
     def findPrev(self):
         """
         Public slot to find the next previous of text.
         """
         self.__searchReplaceWidget.findPrev()
-    
+
     def replace(self):
         """
         Public method to replace the current selection.
         """
         self.__searchReplaceWidget.replace()
-    
+
     def replaceSearch(self):
         """
         Public method to replace the current selection and search again.
         """
         self.__searchReplaceWidget.replaceSearch()
-    
+
     def replaceAll(self):
         """
         Public method to replace all occurrences.
         """
         self.__searchReplaceWidget.replaceAll()
-    
+
     def selectionChanged(self, editor):
         """
         Public slot tracking changes of selected text.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         self.__searchReplaceWidget.updateSelectionCheckBox(editor)
-    
+
     @pyqtSlot(Editor)
     def updateSelectionCheckBox(self, editor):
         """
         Public slot to update the selection check box.
-        
+
         @param editor reference to the editor (Editor)
         """
         self.__searchReplaceWidget.updateSelectionCheckBox(editor)
 
-    def show(self, text=''):
+    def show(self, text=""):
         """
         Public slot to show the widget.
-        
+
         @param text text to be shown in the findtext edit (string)
         """
         self.__searchReplaceWidget.show(text)
         super().show()
         self.__enableScrollerButtons()
-    
+
     def __slideLeft(self):
         """
         Private slot to move the widget to the left, i.e. show contents to the
         right.
         """
         self.__slide(True)
-    
+
     def __slideRight(self):
         """
         Private slot to move the widget to the right, i.e. show contents to
         the left.
         """
         self.__slide(False)
-    
+
     def __slide(self, toLeft):
         """
         Private method to move the sliding widget.
-        
+
         @param toLeft flag indicating to move to the left (boolean)
         """
         scrollBar = self.__scroller.horizontalScrollBar()
@@ -1379,7 +1425,7 @@
             newValue = scrollBar.maximum()
         scrollBar.setValue(newValue)
         self.__enableScrollerButtons()
-    
+
     def __enableScrollerButtons(self):
         """
         Private method to set the enabled state of the scroll buttons.
@@ -1387,13 +1433,13 @@
         scrollBar = self.__scroller.horizontalScrollBar()
         self.__leftButton.setEnabled(scrollBar.value() > 0)
         self.__rightButton.setEnabled(scrollBar.value() < scrollBar.maximum())
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt reference to the resize event (QResizeEvent)
         """
         self.__enableScrollerButtons()
-        
+
         super().resizeEvent(evt)
--- a/src/eric7/QScintilla/Shell.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/Shell.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,8 +16,14 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent
 from PyQt6.QtGui import QClipboard, QPalette, QFont, QShortcut
 from PyQt6.QtWidgets import (
-    QDialog, QInputDialog, QApplication, QMenu, QWidget, QHBoxLayout,
-    QVBoxLayout, QSizePolicy
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QMenu,
+    QWidget,
+    QHBoxLayout,
+    QVBoxLayout,
+    QSizePolicy,
 )
 from PyQt6.Qsci import QsciScintilla
 
@@ -38,10 +44,11 @@
     """
     Class implementing the containing widget for the shell.
     """
+
     def __init__(self, dbs, vm, project, horizontal=True, parent=None):
         """
         Constructor
-        
+
         @param dbs reference to the debug server object
         @type DebugServer
         @param vm reference to the viewmanager object
@@ -54,15 +61,17 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__shell = Shell(dbs, vm, project, False, self)
-        
+
         from UI.SearchWidget import SearchWidget
+
         self.__searchWidget = SearchWidget(self.__shell, self, horizontal)
-        self.__searchWidget.setSizePolicy(QSizePolicy.Policy.Fixed,
-                                          QSizePolicy.Policy.Preferred)
+        self.__searchWidget.setSizePolicy(
+            QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred
+        )
         self.__searchWidget.hide()
-        
+
         if horizontal:
             self.__layout = QHBoxLayout(self)
         else:
@@ -70,24 +79,23 @@
         self.__layout.setContentsMargins(1, 1, 1, 1)
         self.__layout.addWidget(self.__shell)
         self.__layout.addWidget(self.__searchWidget)
-        
+
         self.__searchWidget.searchNext.connect(self.__shell.searchNext)
         self.__searchWidget.searchPrevious.connect(self.__shell.searchPrev)
-        self.__shell.searchStringFound.connect(
-            self.__searchWidget.searchStringFound)
-    
+        self.__shell.searchStringFound.connect(self.__searchWidget.searchStringFound)
+
     def showFind(self, txt=""):
         """
         Public method to display the search widget.
-        
+
         @param txt text to be shown in the combo (string)
         """
         self.__searchWidget.showFind(txt)
-    
+
     def shell(self):
         """
         Public method to get a reference to the shell widget.
-        
+
         @return reference to the shell widget (Shell)
         """
         return self.__shell
@@ -97,6 +105,7 @@
     """
     Class defining the shell history styles.
     """
+
     DISABLED = 0
     LINUXSTYLE = 1
     WINDOWSSTYLE = 2
@@ -105,10 +114,10 @@
 class Shell(QsciScintillaCompat):
     """
     Class implementing a graphical Python shell.
-    
+
     A user can enter commands that are executed in the remote
     Python interpreter.
-    
+
     @signal searchStringFound(bool) emitted to indicate the search
         result
     @signal historyStyleChanged(ShellHistoryStyle) emitted to indicate a
@@ -117,15 +126,16 @@
     @signal virtualEnvironmentChanged(str) emitted to signal the new virtual
         environment of the shell
     """
+
     searchStringFound = pyqtSignal(bool)
     historyStyleChanged = pyqtSignal(ShellHistoryStyle)
     queueText = pyqtSignal(str)
     virtualEnvironmentChanged = pyqtSignal(str)
-    
+
     def __init__(self, dbs, vm, project, windowedVariant, parent=None):
         """
         Constructor
-        
+
         @param dbs reference to the debug server object
         @type DebugServer
         @param vm reference to the viewmanager object
@@ -139,90 +149,95 @@
         """
         super().__init__(parent)
         self.setUtf8(True)
-        
+
         self.vm = vm
         self.__mainWindow = parent
         self.__lastSearch = ()
         self.__windowed = windowedVariant
         self.__currentVenv = ""
         self.__currentWorkingDirectory = ""
-        
+
         self.linesepRegExp = r"\r\n|\n|\r"
-        
-        self.passive = ((not self.__windowed) and
-                        Preferences.getDebugger("PassiveDbgEnabled"))
+
+        self.passive = (not self.__windowed) and Preferences.getDebugger(
+            "PassiveDbgEnabled"
+        )
         if self.passive:
-            self.setWindowTitle(self.tr('Shell - Passive'))
+            self.setWindowTitle(self.tr("Shell - Passive"))
         else:
-            self.setWindowTitle(self.tr('Shell'))
-        
+            self.setWindowTitle(self.tr("Shell"))
+
         if self.__windowed:
-            self.setWhatsThis(self.tr(
-                """<b>The Shell Window</b>"""
-                """<p>You can use the cursor keys while entering commands."""
-                """ There is also a history of commands that can be recalled"""
-                """ using the up and down cursor keys while holding down the"""
-                """ Ctrl-key. This can be switched to just the up and down"""
-                """ cursor keys on the Shell page of the configuration"""
-                """ dialog. Pressing these keys after some text has been"""
-                """ entered will start an incremental search.</p>"""
-                """<p>The shell has some special commands. '%restart' kills"""
-                """ the shell and starts a new one. '%clear' clears the"""
-                """ display of the shell window. '%start' is used to start a"""
-                """ shell for a virtual environment and should be followed"""
-                """ by a virtual environment name. '%start' without a"""
-                """ virtual environment name starts the default shell."""
-                """ Available virtual environments may be listed with the"""
-                """ '%envs' or '%environments' commands. The active virtual"""
-                """ environment can be questioned by the '%which' command."""
-                """ '%quit' or '%exit' is used to exit the application."""
-                """ These commands (except '%environments', '%envs' and"""
-                """ '%which') are available through the window menus as"""
-                """ well.</p>"""
-                """<p>Pressing the Tab key after some text has been entered"""
-                """ will show a list of possible completions. The relevant"""
-                """ entry may be selected from this list. If only one entry"""
-                """ is available, this will be inserted automatically.</p>"""
-            ))
+            self.setWhatsThis(
+                self.tr(
+                    """<b>The Shell Window</b>"""
+                    """<p>You can use the cursor keys while entering commands."""
+                    """ There is also a history of commands that can be recalled"""
+                    """ using the up and down cursor keys while holding down the"""
+                    """ Ctrl-key. This can be switched to just the up and down"""
+                    """ cursor keys on the Shell page of the configuration"""
+                    """ dialog. Pressing these keys after some text has been"""
+                    """ entered will start an incremental search.</p>"""
+                    """<p>The shell has some special commands. '%restart' kills"""
+                    """ the shell and starts a new one. '%clear' clears the"""
+                    """ display of the shell window. '%start' is used to start a"""
+                    """ shell for a virtual environment and should be followed"""
+                    """ by a virtual environment name. '%start' without a"""
+                    """ virtual environment name starts the default shell."""
+                    """ Available virtual environments may be listed with the"""
+                    """ '%envs' or '%environments' commands. The active virtual"""
+                    """ environment can be questioned by the '%which' command."""
+                    """ '%quit' or '%exit' is used to exit the application."""
+                    """ These commands (except '%environments', '%envs' and"""
+                    """ '%which') are available through the window menus as"""
+                    """ well.</p>"""
+                    """<p>Pressing the Tab key after some text has been entered"""
+                    """ will show a list of possible completions. The relevant"""
+                    """ entry may be selected from this list. If only one entry"""
+                    """ is available, this will be inserted automatically.</p>"""
+                )
+            )
         else:
-            self.setWhatsThis(self.tr(
-                """<b>The Shell Window</b>"""
-                """<p>This is simply an interpreter running in a window. The"""
-                """ interpreter is the one that is used to run the program"""
-                """ being debugged. This means that you can execute any"""
-                """ command while the program being debugged is running.</p>"""
-                """<p>You can use the cursor keys while entering commands."""
-                """ There is also a history of commands that can be recalled"""
-                """ using the up and down cursor keys while holding down the"""
-                """ Ctrl-key. This can be switched to just the up and down"""
-                """ cursor keys on the Shell page of the configuration"""
-                """ dialog. Pressing these keys after some text has been"""
-                """ entered will start an incremental search.</p>"""
-                """<p>The shell has some special commands. '%restart' kills"""
-                """ the shell and starts a new one. '%clear' clears the"""
-                """ display of the shell window. '%start' is used to start a"""
-                """ shell for a virtual environment and should be followed"""
-                """ by a virtual environment name. '%start' without a"""
-                """ virtual environment name starts the default shell."""
-                """ Available virtual environments may be listed with the"""
-                """ '%envs' or '%environments' commands. The active virtual"""
-                """ environment can be questioned by the '%which' command."""
-                """ These commands (except '%environments' and '%envs') are"""
-                """ available through the context menu as well.</p>"""
-                """<p>Pressing the Tab key after some text has been entered"""
-                """ will show a list of possible completions. The relevant"""
-                """ entry may be selected from this list. If only one entry"""
-                """ is available, this will be inserted automatically.</p>"""
-                """<p>In passive debugging mode the shell is only available"""
-                """ after the program to be debugged has connected to the"""
-                """ IDE until it has finished. This is indicated by a"""
-                """ different prompt and by an indication in the window"""
-                """ caption.</p>"""
-            ))
-        
+            self.setWhatsThis(
+                self.tr(
+                    """<b>The Shell Window</b>"""
+                    """<p>This is simply an interpreter running in a window. The"""
+                    """ interpreter is the one that is used to run the program"""
+                    """ being debugged. This means that you can execute any"""
+                    """ command while the program being debugged is running.</p>"""
+                    """<p>You can use the cursor keys while entering commands."""
+                    """ There is also a history of commands that can be recalled"""
+                    """ using the up and down cursor keys while holding down the"""
+                    """ Ctrl-key. This can be switched to just the up and down"""
+                    """ cursor keys on the Shell page of the configuration"""
+                    """ dialog. Pressing these keys after some text has been"""
+                    """ entered will start an incremental search.</p>"""
+                    """<p>The shell has some special commands. '%restart' kills"""
+                    """ the shell and starts a new one. '%clear' clears the"""
+                    """ display of the shell window. '%start' is used to start a"""
+                    """ shell for a virtual environment and should be followed"""
+                    """ by a virtual environment name. '%start' without a"""
+                    """ virtual environment name starts the default shell."""
+                    """ Available virtual environments may be listed with the"""
+                    """ '%envs' or '%environments' commands. The active virtual"""
+                    """ environment can be questioned by the '%which' command."""
+                    """ These commands (except '%environments' and '%envs') are"""
+                    """ available through the context menu as well.</p>"""
+                    """<p>Pressing the Tab key after some text has been entered"""
+                    """ will show a list of possible completions. The relevant"""
+                    """ entry may be selected from this list. If only one entry"""
+                    """ is available, this will be inserted automatically.</p>"""
+                    """<p>In passive debugging mode the shell is only available"""
+                    """ after the program to be debugged has connected to the"""
+                    """ IDE until it has finished. This is indicated by a"""
+                    """ different prompt and by an indication in the window"""
+                    """ caption.</p>"""
+                )
+            )
+
         self.userListActivated.connect(self.__completionListSelected)
         self.linesChanged.connect(self.__resizeLinenoMargin)
-        
+
         if self.__windowed:
             self.__showStdOutErr = True
         else:
@@ -242,10 +257,10 @@
         dbs.clientSignal.connect(self.__clientSignal)
         dbs.mainClientExit.connect(self.__writePrompt)
         self.dbs = dbs
-        
+
         # will register a method to get the debugger ID to work with
         self.__getSelectedDebuggerId = None
-        
+
         # Make sure we have prompts.
         if self.passive:
             sys.ps1 = self.tr("Passive >>> ")
@@ -258,7 +273,7 @@
             sys.ps2
         except AttributeError:
             sys.ps2 = "... "
-        
+
         # Initialize instance variables.
         self.__initialise()
         self.prline = 0
@@ -266,9 +281,9 @@
         self.inDragDrop = False
         self.lexer_ = None
         self.completionText = ""
-        
-        self.clientType = ''
-        
+
+        self.clientType = ""
+
         # Initialize history
         self.__historyLists = {}
         self.__maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
@@ -279,116 +294,108 @@
         # remove obsolete shell histories (Python and Ruby)
         for clientType in ["Python", "Ruby"]:
             Preferences.getSettings().remove("Shell/Histories/" + clientType)
-        
+
         # clear QScintilla defined keyboard commands
         # we do our own handling through the view manager
         self.clearAlternateKeys()
         self.clearKeys()
         self.__actionsAdded = False
-        
+
         if self.passive:
             self.__getBanner()
-        
+
         if not self.__windowed:
             # Create a little language context menu
-            self.lmenu = QMenu(self.tr('Start'))
+            self.lmenu = QMenu(self.tr("Start"))
             self.lmenu.aboutToShow.connect(self.__showStartMenu)
             self.lmenu.triggered.connect(self.__startDebugClient)
-            
+
             # Create the history context menu
-            self.hmenu = QMenu(self.tr('History'))
-            self.hmenu.addAction(self.tr('Select entry'), self.selectHistory)
-            self.hmenu.addAction(self.tr('Show'), self.showHistory)
-            self.hmenu.addAction(self.tr('Clear'), self.clearHistory)
-            
+            self.hmenu = QMenu(self.tr("History"))
+            self.hmenu.addAction(self.tr("Select entry"), self.selectHistory)
+            self.hmenu.addAction(self.tr("Show"), self.showHistory)
+            self.hmenu.addAction(self.tr("Clear"), self.clearHistory)
+
             # Create a little context menu
             self.menu = QMenu(self)
-            self.menu.addAction(self.tr('Cut'), self.cut)
-            self.menu.addAction(self.tr('Copy'), self.copy)
-            self.menu.addAction(self.tr('Paste'), self.paste)
+            self.menu.addAction(self.tr("Cut"), self.cut)
+            self.menu.addAction(self.tr("Copy"), self.copy)
+            self.menu.addAction(self.tr("Paste"), self.paste)
             self.menu.addMenu(self.hmenu).setEnabled(self.isHistoryEnabled())
-            
+
             self.menu.addSeparator()
-            self.menu.addAction(self.tr('Find'), self.__find)
+            self.menu.addAction(self.tr("Find"), self.__find)
             self.menu.addSeparator()
-            self.menu.addAction(self.tr('Clear'), self.clear)
-            self.menu.addAction(self.tr('Restart'), self.doRestart)
-            self.menu.addAction(
-                self.tr('Restart and Clear'), self.doClearRestart)
+            self.menu.addAction(self.tr("Clear"), self.clear)
+            self.menu.addAction(self.tr("Restart"), self.doRestart)
+            self.menu.addAction(self.tr("Restart and Clear"), self.doClearRestart)
             self.menu.addSeparator()
             self.menu.addMenu(self.lmenu)
-            self.menu.addAction(self.tr('Active Name'), self.__showVenvName)
+            self.menu.addAction(self.tr("Active Name"), self.__showVenvName)
             self.menu.addSeparator()
             self.menu.addAction(self.tr("Save Contents..."), self.saveContents)
             self.menu.addSeparator()
             self.menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.__bindLexer()
         self.__setTextDisplay()
         self.__setMargin0()
-        
+
         # set the autocompletion and calltips function
         self.__setAutoCompletion()
         self.__setCallTips()
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.incrementalSearchString = ""
         self.incrementalSearchActive = False
-        
+
         self.supportedEditorCommands = {
             QsciScintilla.SCI_LINEDELETE: self.__clearCurrentLine,
             QsciScintilla.SCI_TAB: self.__QScintillaTab,
             QsciScintilla.SCI_NEWLINE: self.__QScintillaNewline,
-            
             QsciScintilla.SCI_DELETEBACK: self.__QScintillaDeleteBack,
             QsciScintilla.SCI_CLEAR: self.__QScintillaDelete,
             QsciScintilla.SCI_DELWORDLEFT: self.__QScintillaDeleteWordLeft,
             QsciScintilla.SCI_DELWORDRIGHT: self.__QScintillaDeleteWordRight,
             QsciScintilla.SCI_DELLINELEFT: self.__QScintillaDeleteLineLeft,
             QsciScintilla.SCI_DELLINERIGHT: self.__QScintillaDeleteLineRight,
-            
             QsciScintilla.SCI_CHARLEFT: self.__QScintillaCharLeft,
             QsciScintilla.SCI_CHARRIGHT: self.__QScintillaCharRight,
             QsciScintilla.SCI_WORDLEFT: self.__QScintillaWordLeft,
             QsciScintilla.SCI_WORDRIGHT: self.__QScintillaWordRight,
             QsciScintilla.SCI_VCHOME: self.__QScintillaVCHome,
             QsciScintilla.SCI_LINEEND: self.__QScintillaLineEnd,
-            
             QsciScintilla.SCI_LINEUP: self.__QScintillaCursorCommand,
             QsciScintilla.SCI_LINEDOWN: self.__QScintillaCursorCommand,
             QsciScintilla.SCI_LINESCROLLUP: self.__QScintillaCursorCommand,
             QsciScintilla.SCI_LINESCROLLDOWN: self.__QScintillaCursorCommand,
-            
             QsciScintilla.SCI_PAGEUP: self.__QScintillaAutoCompletionCommand,
             QsciScintilla.SCI_PAGEDOWN: self.__QScintillaAutoCompletionCommand,
-            
             QsciScintilla.SCI_CHARLEFTEXTEND: self.__QScintillaCharLeftExtend,
             QsciScintilla.SCI_CHARRIGHTEXTEND: self.extendSelectionRight,
             QsciScintilla.SCI_WORDLEFTEXTEND: self.__QScintillaWordLeftExtend,
             QsciScintilla.SCI_WORDRIGHTEXTEND: self.extendSelectionWordRight,
             QsciScintilla.SCI_VCHOMEEXTEND: self.__QScintillaVCHomeExtend,
             QsciScintilla.SCI_LINEENDEXTEND: self.extendSelectionToEOL,
-            
             QsciScintilla.SCI_CANCEL: self.__QScintillaCancel,
         }
-        
-        self.__historyNavigateByCursor = (
-            Preferences.getShell("HistoryNavigateByCursor")
+
+        self.__historyNavigateByCursor = Preferences.getShell("HistoryNavigateByCursor")
+
+        self.__queuedText = ""
+        self.__blockTextProcessing = False
+        self.queueText.connect(
+            self.__concatenateText, Qt.ConnectionType.QueuedConnection
         )
-        
-        self.__queuedText = ''
-        self.__blockTextProcessing = False
-        self.queueText.connect(self.__concatenateText,
-                               Qt.ConnectionType.QueuedConnection)
-        
+
         self.__project = project
         if self.__project:
             self.__project.projectOpened.connect(self.__projectOpened)
             self.__project.projectClosed.connect(self.__projectClosed)
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-    
+
     def __showStartMenu(self):
         """
         Private slot to prepare the start submenu.
@@ -400,43 +407,44 @@
         if self.__project.isOpen():
             self.lmenu.addSeparator()
             self.lmenu.addAction(self.tr("Project"))
-        
+
     def __resizeLinenoMargin(self):
         """
         Private slot to resize the line numbers margin.
         """
         linenoMargin = Preferences.getShell("LinenoMargin")
         if linenoMargin:
-            self.setMarginWidth(0, '8' * (len(str(self.lines())) + 1))
-        
+            self.setMarginWidth(0, "8" * (len(str(self.lines())) + 1))
+
     def closeShell(self):
         """
         Public method to shutdown the shell.
         """
         for clientType in self.__historyLists:
             self.saveHistory(clientType)
-        
-    def __bindLexer(self, language='Python3'):
+
+    def __bindLexer(self, language="Python3"):
         """
         Private slot to set the lexer.
-        
+
         @param language lexer language to set (string)
         """
         self.language = language
         if Preferences.getShell("SyntaxHighlightingEnabled"):
             from . import Lexers
+
             self.lexer_ = Lexers.getLexer(self.language, self)
         else:
             self.lexer_ = None
-        
+
         if self.lexer_ is None:
             self.setLexer(None)
             font = Preferences.getShell("MonospacedFont")
             self.monospacedStyles(font)
             return
-        
+
         # get the font for style 0 and set it as the default font
-        key = 'Scintilla/{0}/style0/font'.format(self.lexer_.language())
+        key = "Scintilla/{0}/style0/font".format(self.lexer_.language())
         fdesc = Preferences.getSettings().value(key)
         if fdesc is not None:
             font = QFont([fdesc[0]], int(fdesc[1]))
@@ -445,28 +453,26 @@
         self.lexer_.readSettings(Preferences.getSettings(), "Scintilla")
         if self.lexer_.hasSubstyles():
             self.lexer_.readSubstyles(self)
-        
+
         # initialize the lexer APIs settings
         api = self.vm.getAPIsManager().getAPIs(self.language)
         if api is not None:
             api = api.getQsciAPIs()
             if api is not None:
                 self.lexer_.setAPIs(api)
-        
+
         self.lexer_.setDefaultColor(self.lexer_.color(0))
         self.lexer_.setDefaultPaper(self.lexer_.paper(0))
-        
+
     def __setMargin0(self):
         """
         Private method to configure margin 0.
         """
         # set the settings for all margins
         self.setMarginsFont(Preferences.getShell("MarginsFont"))
-        self.setMarginsForegroundColor(
-            Preferences.getEditorColour("MarginsForeground"))
-        self.setMarginsBackgroundColor(
-            Preferences.getEditorColour("MarginsBackground"))
-        
+        self.setMarginsForegroundColor(Preferences.getEditorColour("MarginsForeground"))
+        self.setMarginsBackgroundColor(Preferences.getEditorColour("MarginsBackground"))
+
         # set margin 0 settings
         linenoMargin = Preferences.getShell("LinenoMargin")
         self.setMarginLineNumbers(0, linenoMargin)
@@ -474,60 +480,65 @@
             self.__resizeLinenoMargin()
         else:
             self.setMarginWidth(0, 0)
-        
+
         # disable margins 1 and 2
         self.setMarginWidth(1, 0)
         self.setMarginWidth(2, 0)
-        
+
     def __setTextDisplay(self):
         """
         Private method to configure the text display.
         """
         self.setTabWidth(Preferences.getEditor("TabWidth"))
         if Preferences.getEditor("ShowWhitespace"):
-            self.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsVisible)
+            self.setWhitespaceVisibility(QsciScintilla.WhitespaceVisibility.WsVisible)
             with contextlib.suppress(AttributeError):
                 self.setWhitespaceForegroundColor(
-                    Preferences.getEditorColour("WhitespaceForeground"))
+                    Preferences.getEditorColour("WhitespaceForeground")
+                )
                 self.setWhitespaceBackgroundColor(
-                    Preferences.getEditorColour("WhitespaceBackground"))
-                self.setWhitespaceSize(
-                    Preferences.getEditor("WhitespaceSize"))
+                    Preferences.getEditorColour("WhitespaceBackground")
+                )
+                self.setWhitespaceSize(Preferences.getEditor("WhitespaceSize"))
         else:
-            self.setWhitespaceVisibility(
-                QsciScintilla.WhitespaceVisibility.WsInvisible)
+            self.setWhitespaceVisibility(QsciScintilla.WhitespaceVisibility.WsInvisible)
         self.setEolVisibility(Preferences.getEditor("ShowEOL"))
         if Preferences.getEditor("BraceHighlighting"):
             self.setBraceMatching(QsciScintilla.BraceMatch.SloppyBraceMatch)
         else:
             self.setBraceMatching(QsciScintilla.BraceMatch.NoBraceMatch)
         self.setMatchedBraceForegroundColor(
-            Preferences.getEditorColour("MatchingBrace"))
+            Preferences.getEditorColour("MatchingBrace")
+        )
         self.setMatchedBraceBackgroundColor(
-            Preferences.getEditorColour("MatchingBraceBack"))
+            Preferences.getEditorColour("MatchingBraceBack")
+        )
         self.setUnmatchedBraceForegroundColor(
-            Preferences.getEditorColour("NonmatchingBrace"))
+            Preferences.getEditorColour("NonmatchingBrace")
+        )
         self.setUnmatchedBraceBackgroundColor(
-            Preferences.getEditorColour("NonmatchingBraceBack"))
+            Preferences.getEditorColour("NonmatchingBraceBack")
+        )
         if Preferences.getEditor("CustomSelectionColours"):
             self.setSelectionBackgroundColor(
-                Preferences.getEditorColour("SelectionBackground"))
+                Preferences.getEditorColour("SelectionBackground")
+            )
         else:
             self.setSelectionBackgroundColor(
-                QApplication.palette().color(QPalette.ColorRole.Highlight))
+                QApplication.palette().color(QPalette.ColorRole.Highlight)
+            )
         if Preferences.getEditor("ColourizeSelText"):
             self.resetSelectionForegroundColor()
         elif Preferences.getEditor("CustomSelectionColours"):
             self.setSelectionForegroundColor(
-                Preferences.getEditorColour("SelectionForeground"))
+                Preferences.getEditorColour("SelectionForeground")
+            )
         else:
             self.setSelectionForegroundColor(
-                QApplication.palette().color(
-                    QPalette.ColorRole.HighlightedText))
+                QApplication.palette().color(QPalette.ColorRole.HighlightedText)
+            )
         self.setSelectionToEol(Preferences.getEditor("ExtendSelectionToEol"))
-        self.setCaretForegroundColor(
-            Preferences.getEditorColour("CaretForeground"))
+        self.setCaretForegroundColor(Preferences.getEditorColour("CaretForeground"))
         self.setCaretLineVisible(False)
         self.caretWidth = Preferences.getEditor("CaretWidth")
         self.setCaretWidth(self.caretWidth)
@@ -537,17 +548,17 @@
             self.setWrapMode(QsciScintilla.WrapMode.WrapNone)
         self.useMonospaced = Preferences.getShell("UseMonospacedFont")
         self.__setMonospaced(self.useMonospaced)
-        
+
         self.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         if Preferences.getEditor("OverrideEditAreaColours"):
             self.setColor(Preferences.getEditorColour("EditAreaForeground"))
             self.setPaper(Preferences.getEditorColour("EditAreaBackground"))
-        
+
     def __setMonospaced(self, on):
         """
         Private method to set/reset a monospaced font.
-        
+
         @param on flag to indicate usage of a monospace font (boolean)
         """
         if on:
@@ -559,76 +570,78 @@
                 self.clearStyles()
                 self.__setMargin0()
             self.setFont(Preferences.getShell("MonospacedFont"))
-        
+
         self.useMonospaced = on
-        
-    def __setAutoCompletion(self, language='Python'):
+
+    def __setAutoCompletion(self, language="Python"):
         """
         Private method to configure the autocompletion function.
-        
+
         @param language of the autocompletion set to set (string)
         """
         self.setAutoCompletionCaseSensitivity(
-            Preferences.getEditor("AutoCompletionCaseSensitivity"))
+            Preferences.getEditor("AutoCompletionCaseSensitivity")
+        )
         self.setAutoCompletionThreshold(-1)
-        
+
         self.racEnabled = Preferences.getShell("AutoCompletionEnabled")
-        
+
         self.setAutoCompletionWidgetSize(
             Preferences.getEditor("AutoCompletionMaxChars"),
-            Preferences.getEditor("AutoCompletionMaxLines")
+            Preferences.getEditor("AutoCompletionMaxLines"),
         )
-        
-    def __setCallTips(self, language='Python'):
+
+    def __setCallTips(self, language="Python"):
         """
         Private method to configure the calltips function.
-        
+
         @param language of the calltips set to set (string)
         """
         if Preferences.getShell("CallTipsEnabled"):
             self.setCallTipsBackgroundColor(
-                Preferences.getEditorColour("CallTipsBackground"))
+                Preferences.getEditorColour("CallTipsBackground")
+            )
             self.setCallTipsForegroundColor(
-                Preferences.getEditorColour("CallTipsForeground"))
+                Preferences.getEditorColour("CallTipsForeground")
+            )
             self.setCallTipsHighlightColor(
-                Preferences.getEditorColour("CallTipsHighlight"))
+                Preferences.getEditorColour("CallTipsHighlight")
+            )
             self.setCallTipsVisible(Preferences.getEditor("CallTipsVisible"))
             calltipsStyle = Preferences.getEditor("CallTipsStyle")
             if calltipsStyle == QsciScintilla.CallTipsStyle.CallTipsNoContext:
-                self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle.CallTipsNoContext)
+                self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsNoContext)
             elif (
-                calltipsStyle ==
-                    QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
+                calltipsStyle
+                == QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
             ):
                 self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle
-                    .CallTipsNoAutoCompletionContext)
+                    QsciScintilla.CallTipsStyle.CallTipsNoAutoCompletionContext
+                )
             else:
-                self.setCallTipsStyle(
-                    QsciScintilla.CallTipsStyle.CallTipsContext)
+                self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsContext)
         else:
             self.setCallTipsStyle(QsciScintilla.CallTipsStyle.CallTipsNone)
-        
+
     def setDebuggerUI(self, ui):
         """
         Public method to set the debugger UI.
-        
+
         @param ui reference to the debugger UI object (DebugUI)
         """
         ui.exceptionInterrupt.connect(self.__writePrompt)
         self.registerDebuggerIdMethod(ui.getSelectedDebuggerId)
-    
+
     def registerDebuggerIdMethod(self, method):
         """
         Public method to register a method to get the debugger ID to send data
         to.
-        
+
         @param method reference to the method
         @type function
         """
         self.__getSelectedDebuggerId = method
-        
+
     def __initialise(self):
         """
         Private method to get ready for a new remote interpreter.
@@ -642,11 +655,11 @@
         self.clientCapabilities = 0
         self.inCommandExecution = False
         self.interruptCommandExecution = False
-        
+
     def __clientCapabilities(self, cap, clType, venvName):
         """
         Private slot to handle the reporting of the clients capabilities.
-        
+
         @param cap client capabilities
         @type int
         @param clType type of the debug client
@@ -664,34 +677,37 @@
             self.__setAutoCompletion(self.clientType)
             self.__setCallTips(self.clientType)
             self.racEnabled = (
-                Preferences.getShell("AutoCompletionEnabled") and
-                (cap & HasCompleter) > 0
+                Preferences.getShell("AutoCompletionEnabled")
+                and (cap & HasCompleter) > 0
             )
-            
+
             if self.clientType not in self.__historyLists:
                 # load history list
                 self.loadHistory(self.clientType)
             self.__history = self.__historyLists[self.clientType]
             self.__setHistoryIndex()
-        
+
         self.virtualEnvironmentChanged.emit(venvName)
         Preferences.setShell("LastVirtualEnvironment", venvName)
-    
+
     def __setHistoryIndex(self, index=None):
         """
         Private method to set the initial history index.
-        
+
         @param index index value to be set
         @type int or None
         """
         if index is None:
             # determine based on history style
             if (
-                self.clientType and
-                self.__historyStyle == ShellHistoryStyle.WINDOWSSTYLE
+                self.clientType
+                and self.__historyStyle == ShellHistoryStyle.WINDOWSSTYLE
             ):
-                idx = int(Preferences.getSettings().value(
-                    "Shell/HistoryIndexes/" + self.clientType, -1))
+                idx = int(
+                    Preferences.getSettings().value(
+                        "Shell/HistoryIndexes/" + self.clientType, -1
+                    )
+                )
                 if idx >= len(self.__history):
                     idx = -1
                 self.__histidx = idx
@@ -702,42 +718,43 @@
             if self.__histidx >= len(self.__history):
                 self.__histidx = -1
             if (
-                self.clientType and
-                self.__historyStyle == ShellHistoryStyle.WINDOWSSTYLE
+                self.clientType
+                and self.__historyStyle == ShellHistoryStyle.WINDOWSSTYLE
             ):
                 Preferences.getSettings().setValue(
-                    "Shell/HistoryIndexes/" + self.clientType, self.__histidx)
-    
+                    "Shell/HistoryIndexes/" + self.clientType, self.__histidx
+                )
+
     def __isHistoryIndexValid(self):
         """
         Private method to test, if the history index is valid.
-        
+
         @return flag indicating validity
         @rtype bool
         """
-        return (0 <= self.__histidx < len(self.__history))
-    
+        return 0 <= self.__histidx < len(self.__history)
+
     def getHistoryIndex(self):
         """
         Public method to get the current value of the history index.
-        
+
         @return history index
         @rtype int
         """
         return self.__histidx
-    
+
     def loadHistory(self, clientType):
         """
         Public method to load the history for the given client type.
-        
+
         @param clientType type of the debug client (string)
         """
         hl = Preferences.getSettings().value("Shell/Histories/" + clientType)
         if hl is not None:
-            self.__historyLists[clientType] = hl[-self.__maxHistoryEntries:]
+            self.__historyLists[clientType] = hl[-self.__maxHistoryEntries :]
         else:
             self.__historyLists[clientType] = []
-        
+
     def reloadHistory(self):
         """
         Public method to reload the history of the currently selected client
@@ -746,22 +763,22 @@
         self.loadHistory(self.clientType)
         self.__history = self.__historyLists[self.clientType]
         self.__setHistoryIndex()
-        
+
     def saveHistory(self, clientType):
         """
         Public method to save the history for the given client type.
-        
+
         @param clientType type of the debug client (string)
         """
         if clientType in self.__historyLists:
             Preferences.getSettings().setValue(
-                "Shell/Histories/" + clientType,
-                self.__historyLists[clientType])
-        
+                "Shell/Histories/" + clientType, self.__historyLists[clientType]
+            )
+
     def getHistory(self, clientType):
         """
         Public method to get the history for the given client type.
-        
+
         @param clientType type of the debug client (string).
             If it is None, the current history is returned.
         @return reference to the history list (list of strings)
@@ -772,7 +789,7 @@
             return self.__historyLists[clientType]
         else:
             return []
-        
+
     def clearHistory(self):
         """
         Public slot to clear the current history.
@@ -783,7 +800,7 @@
         else:
             self.__history = []
         self.__setHistoryIndex(index=-1)
-        
+
     def selectHistory(self):
         """
         Public slot to select a history entry to execute.
@@ -794,24 +811,26 @@
         cmd, ok = QInputDialog.getItem(
             self,
             self.tr("Select History"),
-            self.tr("Select the history entry to execute"
-                    " (most recent shown last)."),
+            self.tr("Select the history entry to execute" " (most recent shown last)."),
             self.__history,
-            current, False)
+            current,
+            False,
+        )
         if ok:
             self.__insertHistory(cmd)
-        
+
     def showHistory(self):
         """
         Public slot to show the shell history dialog.
         """
         from .ShellHistoryDialog import ShellHistoryDialog
+
         dlg = ShellHistoryDialog(self.__history, self.vm, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__historyLists[self.clientType], idx = dlg.getHistory()
             self.__history = self.__historyLists[self.clientType]
             self.__setHistoryIndex(index=idx)
-        
+
     def clearAllHistories(self):
         """
         Public method to clear all available histories and sync them.
@@ -821,33 +840,33 @@
             self.__historyLists[clientType] = []
             self.saveHistory(clientType)
         Preferences.getSettings().endGroup()
-        
+
         self.clearHistory()
-        
+
     def getClientType(self):
         """
         Public slot to get the clients type.
-        
+
         @return client type (string)
         """
         return self.clientType
-        
+
     def __getBanner(self):
         """
         Private method to get the banner for the remote interpreter.
-        
+
         It requests the interpreter version and platform running on the
         debug client side.
         """
         if self.passive:
-            self.__writeBanner('', '', '', '')
+            self.__writeBanner("", "", "", "")
         else:
             self.dbs.remoteBanner()
-        
+
     def __writeBanner(self, version, platform, venvName):
         """
         Private method to write a banner with info from the debug client.
-        
+
         @param version interpreter version string
         @type str
         @param platform platform of the remote interpreter
@@ -857,34 +876,34 @@
         """
         super().clear()
         if self.passive and not self.dbs.isConnected():
-            self.__write(self.tr('Passive Debug Mode'))
-            self.__write(self.tr('\nNot connected'))
+            self.__write(self.tr("Passive Debug Mode"))
+            self.__write(self.tr("\nNot connected"))
         else:
             self.__currentVenv = venvName
             version = version.replace("#", self.tr("No."))
             if platform != "":
-                self.__write(self.tr('{0} on {1}').format(version, platform))
+                self.__write(self.tr("{0} on {1}").format(version, platform))
             else:
                 self.__write(version)
             if venvName:
                 self.__write("\n[{0}]".format(venvName))
-            
+
             self.virtualEnvironmentChanged.emit(venvName)
             Preferences.setShell("LastVirtualEnvironment", venvName)
-        self.__write('\n')
-        
+        self.__write("\n")
+
         self.__write(sys.ps1)
-        
+
     def __writePrompt(self):
         """
         Private method to write the prompt using a write queue.
         """
         self.queueText.emit(self.inContinue and sys.ps2 or sys.ps1)
-    
+
     def __clientStatement(self, more):
         """
         Private method to handle the response from the debugger client.
-        
+
         @param more flag indicating that more user input is required
         @type bool
         """
@@ -892,44 +911,42 @@
             self.inContinue = more
             self.__writePrompt()
         self.inCommandExecution = False
-    
+
     def __clientException(self, exceptionType, exceptionMessage, stackTrace):
         """
         Private method to handle an exception of the client.
-        
+
         @param exceptionType type of exception raised (string)
         @param exceptionMessage message given by the exception (string)
         @param stackTrace list of stack entries (list of string)
         """
-        self .__clientError()
-        
+        self.__clientError()
+
         if (
-            not self.__windowed and
-            Preferences.getDebugger("ShowExceptionInShell") and
-            exceptionType
+            not self.__windowed
+            and Preferences.getDebugger("ShowExceptionInShell")
+            and exceptionType
         ):
             if stackTrace:
                 self.__write(
-                    self.tr('Exception "{0}"\n{1}\nFile: {2}, Line: {3}\n')
-                    .format(
+                    self.tr('Exception "{0}"\n{1}\nFile: {2}, Line: {3}\n').format(
                         exceptionType,
                         exceptionMessage,
                         stackTrace[0][0],
-                        stackTrace[0][1]
+                        stackTrace[0][1],
                     )
                 )
             else:
                 self.__write(
-                    self.tr('Exception "{0}"\n{1}\n')
-                    .format(
-                        exceptionType,
-                        exceptionMessage)
+                    self.tr('Exception "{0}"\n{1}\n').format(
+                        exceptionType, exceptionMessage
+                    )
                 )
-        
+
     def __clientSyntaxError(self, message, filename, lineNo, characterNo):
         """
         Private method to handle a syntax error in the debugged program.
-        
+
         @param message message of the syntax error (string)
         @param filename translated filename of the syntax error position
             (string)
@@ -937,25 +954,23 @@
         @param characterNo character number of the syntax error position
             (integer)
         """
-        self .__clientError()
-        
-        if (
-            not self.__windowed and
-            Preferences.getDebugger("ShowExceptionInShell")
-        ):
+        self.__clientError()
+
+        if not self.__windowed and Preferences.getDebugger("ShowExceptionInShell"):
             if message is None:
                 self.__write(self.tr("Unspecified syntax error.\n"))
             else:
                 self.__write(
-                    self.tr('Syntax error "{1}" in file {0} at line {2},'
-                            ' character {3}.\n')
-                        .format(filename, message, lineNo, characterNo)
+                    self.tr(
+                        'Syntax error "{1}" in file {0} at line {2},'
+                        " character {3}.\n"
+                    ).format(filename, message, lineNo, characterNo)
                 )
-        
+
     def __clientSignal(self, message, filename, lineNo, funcName, funcArgs):
         """
         Private method to handle a signal generated on the client side.
-        
+
         @param message message of the syntax error
         @type str
         @param filename translated filename of the syntax error position
@@ -968,13 +983,14 @@
         @type str
         """
         self.__clientError()
-        
+
         self.__write(
-            self.tr("""Signal "{0}" generated in file {1} at line {2}.\n"""
-                    """Function: {3}({4})""")
-                .format(message, filename, lineNo, funcName, funcArgs)
+            self.tr(
+                """Signal "{0}" generated in file {1} at line {2}.\n"""
+                """Function: {3}({4})"""
+            ).format(message, filename, lineNo, funcName, funcArgs)
         )
-        
+
     def __clientError(self):
         """
         Private method to handle an error in the client.
@@ -982,20 +998,20 @@
         self.inCommandExecution = False
         self.interruptCommandExecution = True
         self.inContinue = False
-        
+
     def __getEndPos(self):
         """
         Private method to return the line and column of the last character.
-        
+
         @return tuple of two values (int, int) giving the line and column
         """
         line = self.lines() - 1
         return (line, len(self.text(line)))
-        
+
     def __writeQueued(self, s):
         """
         Private method to display some text using a write queue.
-        
+
         @param s text to be displayed (string)
         """
         self.queueText.emit(s)
@@ -1003,38 +1019,38 @@
     def __concatenateText(self, text):
         """
         Private slot to queue text and process it in one step.
-        
+
         @param text text to be appended
         @type str
         """
         self.__queuedText += text
         if self.__blockTextProcessing:
             return
-        
+
         self.__blockTextProcessing = True
         # Get all text which is still waiting for output
         QApplication.processEvents()
-        
+
         # Finally process the accumulated text
         self.__flushQueuedText()
-    
+
     def __flushQueuedText(self):
         """
         Private slot to flush the accumulated text output.
         """
         self.__write(self.__queuedText)
-        
-        self.__queuedText = ''
+
+        self.__queuedText = ""
         self.__blockTextProcessing = False
-        
+
         # little trick to get the cursor position registered within QScintilla
         self.SendScintilla(QsciScintilla.SCI_CHARLEFT)
         self.SendScintilla(QsciScintilla.SCI_CHARRIGHT)
-    
+
     def __write(self, s):
         """
         Private method to display some text without queuing.
-        
+
         @param s text to be displayed
         @type str
         """
@@ -1044,27 +1060,27 @@
         self.prline, self.prcol = self.getCursorPosition()
         self.ensureCursorVisible()
         self.ensureLineVisible(self.prline)
-        
+
     def __writeStdOut(self, s):
         """
         Private method to display some text with StdOut label.
-        
+
         @param s text to be displayed (string)
         """
         self.__write(self.tr("StdOut: {0}").format(s))
-        
+
     def __writeStdErr(self, s):
         """
         Private method to display some text with StdErr label.
-        
+
         @param s text to be displayed (string)
         """
         self.__write(self.tr("StdErr: {0}").format(s))
-        
+
     def __raw_input(self, prompt, echo, debuggerId):
         """
         Private method to handle raw input.
-        
+
         @param prompt the input prompt
         @type str
         @param echo flag indicating an echoing of the input
@@ -1080,11 +1096,11 @@
             self.__inRawMode = True
             self.__echoInput = echo
             self.__rawModeDebuggerId = debuggerId
-            
+
             # Get all text which is still waiting for output
             QApplication.processEvents()
             self.__flushQueuedText()
-            
+
             self.__write(self.tr("<{0}> {1}").format(debuggerId, prompt))
             line, col = self.__getEndPos()
             self.setCursorPosition(line, col)
@@ -1096,11 +1112,11 @@
             self.prompt = buf
             # move cursor to end of line
             self.moveCursorToEOL()
-        
+
     def paste(self, lines=None):
         """
         Public slot to handle the paste action.
-        
+
         @param lines list of lines to be inserted
         @type list of str
         """
@@ -1108,11 +1124,11 @@
             line, col = self.getCursorPosition()
             lastLine = self.text(line)
             if lastLine.startswith(sys.ps1):
-                lastLine = lastLine[len(sys.ps1):]
+                lastLine = lastLine[len(sys.ps1) :]
                 col -= len(sys.ps1)
                 prompt = sys.ps1
             elif lastLine.startswith(sys.ps2):
-                lastLine = lastLine[len(sys.ps2):]
+                lastLine = lastLine[len(sys.ps2) :]
                 col -= len(sys.ps2)
                 prompt = sys.ps2
             else:
@@ -1120,7 +1136,7 @@
             if col < 0:
                 col = 0
                 prompt = ""
-            
+
             # Remove if text is selected
             if self.hasSelectedText():
                 lineFrom, indexFrom, lineTo, indexTo = self.getSelection()
@@ -1137,20 +1153,20 @@
 
             self.setCursorPosition(line, len(prompt))
             self.deleteLineRight()
-            
+
             if lines is None:
                 lines = QApplication.clipboard().text()
-            
+
             lines = lastLine[:col] + lines + lastLine[col:]
             self.executeLines(lines)
             line, _ = self.getCursorPosition()
             pos = len(self.text(line)) - (len(lastLine) - col)
             self.setCursorPosition(line, pos)
-    
+
     def executeLines(self, lines, historyIndex=None):
         """
         Public method to execute a set of lines as multiple commands.
-        
+
         @param lines multiple lines of text to be executed as
             single commands
         @type str
@@ -1160,47 +1176,47 @@
         lines = lines.splitlines(True)
         if not lines:
             return
-        
+
         indentLen = self.__indentLength(lines[0])
         for line in lines:
             if line.startswith(sys.ps1):
-                line = line[len(sys.ps1) + indentLen:]
+                line = line[len(sys.ps1) + indentLen :]
             elif line.startswith(sys.ps2):
-                line = line[len(sys.ps2) + indentLen:]
+                line = line[len(sys.ps2) + indentLen :]
             else:
                 line = line[indentLen:]
-            
+
             if line.endswith(("\r\n", "\r", "\n")):
                 fullline = True
                 cmd = line.rstrip()
             else:
                 fullline = False
-            
+
             self.incrementalSearchActive = True
             self.__insertTextAtEnd(line)
             if fullline:
                 self.incrementalSearchActive = False
-                
+
                 self.__executeCommand(cmd, historyIndex=historyIndex)
                 if self.interruptCommandExecution:
                     self.__executeCommand("")
                     break
-    
+
     def __indentLength(self, line):
         """
         Private method to determine the indentation length of the given line.
-        
+
         @param line line to determine the indentation length for
         @type str
         @return indentation length
         @rtype int
         """
         if line.startswith(sys.ps1):
-            line = line[len(sys.ps1):]
+            line = line[len(sys.ps1) :]
         # If line starts with sys.ps2 or neither don't manipulate the line.
         indentLen = len(line) - len(line.lstrip())
         return indentLen
-    
+
     def __clearCurrentLine(self):
         """
         Private method to clear the line containing the cursor.
@@ -1214,42 +1230,42 @@
             col = 0
         self.setCursorPosition(line, col)
         self.deleteLineRight()
-        
+
     def __insertText(self, s):
         """
         Private method to insert some text at the current cursor position.
-        
+
         @param s text to be inserted (string)
         """
         line, col = self.getCursorPosition()
         self.insertAt(Utilities.filterAnsiSequences(s), line, col)
         self.setCursorPosition(line, col + len(s))
-        
+
     def __insertTextAtEnd(self, s):
         """
         Private method to insert some text at the end of the command line.
-        
+
         @param s text to be inserted (string)
         """
         line, col = self.__getEndPos()
         self.setCursorPosition(line, col)
         self.insert(Utilities.filterAnsiSequences(s))
         self.prline, _ = self.getCursorPosition()
-        
+
     def __insertTextNoEcho(self, s):
         """
         Private method to insert some text at the end of the buffer without
         echoing it.
-        
+
         @param s text to be inserted (string)
         """
         self.buff += s
         self.prline, self.prcol = self.getCursorPosition()
-        
+
     def mousePressEvent(self, event):
         """
         Protected method to handle the mouse press event.
-        
+
         @param event the mouse press event (QMouseEvent)
         """
         self.setFocus()
@@ -1258,11 +1274,11 @@
             self.paste(lines)
         else:
             super().mousePressEvent(event)
-        
+
     def wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event (QWheelEvent)
         """
         if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
@@ -1273,26 +1289,26 @@
                 self.zoomIn()
             evt.accept()
             return
-        
+
         super().wheelEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, if the event was handled (boolean)
         """
         if evt.type() == QEvent.Type.Gesture:
             self.gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event (QGestureEvent
         """
         pinch = evt.gesture(Qt.GestureType.PinchGesture)
@@ -1310,11 +1326,11 @@
                     pinch.setTotalScaleFactor(3.0)
                 self.zoomTo(zoom)
             evt.accept()
-    
+
     def editorCommand(self, cmd):
         """
         Public method to perform an editor command.
-        
+
         @param cmd the scintilla command to be performed
         """
         try:
@@ -1323,24 +1339,24 @@
             self.supportedEditorCommands[cmd](cmd)
         except KeyError:
             pass
-        
+
     def __isCursorOnLastLine(self):
         """
         Private method to check, if the cursor is on the last line.
-        
+
         @return flag indicating that the cursor is on the last line (boolean)
         """
         cline, ccol = self.getCursorPosition()
         return cline == self.lines() - 1
-        
+
     def keyPressEvent(self, ev):
         """
         Protected method to handle the user input a key at a time.
-        
+
         @param ev key event (QKeyEvent)
         """
         txt = ev.text()
-        
+
         # See it is text to insert.
         if len(txt) and txt >= " ":
             if not self.__isCursorOnLastLine():
@@ -1353,26 +1369,25 @@
                 self.incrementalSearchActive = True
                 if ac and self.racEnabled:
                     self.dbs.remoteCompletion(
-                        self.__getSelectedDebuggerId(),
-                        self.completionText + txt
+                        self.__getSelectedDebuggerId(), self.completionText + txt
                     )
             else:
                 self.__insertTextNoEcho(txt)
         else:
             ev.ignore()
-        
+
     def __QScintillaCommand(self, cmd):
         """
         Private method to send the command to QScintilla.
-        
+
         @param cmd QScintilla command
         """
         self.SendScintilla(cmd)
-        
+
     def __QScintillaTab(self, cmd):
         """
         Private method to handle the Tab key.
-        
+
         @param cmd QScintilla command
         """
         if self.isListActive():
@@ -1384,19 +1399,16 @@
                 buf = buf.replace(sys.ps1, "")
             if buf.startswith(sys.ps2):
                 buf = buf.replace(sys.ps2, "")
-            if self.inContinue and not buf[:index - len(sys.ps2)].strip():
+            if self.inContinue and not buf[: index - len(sys.ps2)].strip():
                 self.SendScintilla(cmd)
             elif self.racEnabled:
-                self.dbs.remoteCompletion(
-                    self.__getSelectedDebuggerId(),
-                    buf
-                )
-        
+                self.dbs.remoteCompletion(self.__getSelectedDebuggerId(), buf)
+
     def __QScintillaLeftDeleteCommand(self, method):
         """
         Private method to handle a QScintilla delete command working to
         the left.
-        
+
         @param method shell method to execute
         """
         if self.__isCursorOnLastLine():
@@ -1404,7 +1416,7 @@
             db = 0
             ac = self.isListActive()
             oldLength = len(self.text(line))
-            
+
             if self.text(line).startswith(sys.ps1):
                 if col > len(sys.ps1):
                     method()
@@ -1419,22 +1431,21 @@
             if db and ac and self.racEnabled and self.completionText:
                 delta = len(self.text(line)) - oldLength
                 self.dbs.remoteCompletion(
-                    self.__getSelectedDebuggerId(),
-                    self.completionText[:delta]
+                    self.__getSelectedDebuggerId(), self.completionText[:delta]
                 )
-        
+
     def __QScintillaDeleteBack(self):
         """
         Private method to handle the Backspace key.
         """
         self.__QScintillaLeftDeleteCommand(self.deleteBack)
-        
+
     def __QScintillaDeleteWordLeft(self):
         """
         Private method to handle the Delete Word Left command.
         """
         self.__QScintillaLeftDeleteCommand(self.deleteWordLeft)
-        
+
     def __QScintillaDelete(self):
         """
         Private method to handle the delete command.
@@ -1452,7 +1463,7 @@
                     self.delete()
             else:
                 self.delete()
-        
+
     def __QScintillaDeleteLineLeft(self):
         """
         Private method to handle the Delete Line Left command.
@@ -1460,7 +1471,7 @@
         if self.__isCursorOnLastLine():
             if self.isListActive():
                 self.cancelList()
-            
+
             line, col = self.getCursorPosition()
             if self.text(line).startswith(sys.ps1):
                 prompt = sys.ps1
@@ -1468,15 +1479,15 @@
                 prompt = sys.ps2
             else:
                 prompt = ""
-            
+
             self.deleteLineLeft()
             self.insertAt(prompt, line, 0)
             self.setCursorPosition(line, len(prompt))
-        
+
     def __QScintillaNewline(self, cmd):
         """
         Private method to handle the Return key.
-        
+
         @param cmd QScintilla command
         """
         if self.__isCursorOnLastLine():
@@ -1492,7 +1503,7 @@
                     buf = buf.replace(sys.ps1, "")
                 if buf.startswith(sys.ps2):
                     buf = buf.replace(sys.ps2, "")
-                self.insert('\n')
+                self.insert("\n")
                 self.__executeCommand(buf)
         else:
             txt = ""
@@ -1505,16 +1516,16 @@
                     txt = self.text(line)[:indexTo]
             else:
                 txt = self.text(line)[col:].rstrip()
-            
+
             if txt:
                 line, col = self.__getEndPos()
                 self.setCursorPosition(line, col)
                 self.insert(txt)
-        
+
     def __QScintillaLeftCommand(self, method, allLinesAllowed=False):
         """
         Private method to handle a QScintilla command working to the left.
-        
+
         @param method shell method to execute
         @param allLinesAllowed flag indicating that the command may be executed
             on any line (boolean)
@@ -1531,58 +1542,58 @@
                 method()
         else:
             method()
-        
+
     def __QScintillaCharLeft(self):
         """
         Private method to handle the Cursor Left command.
         """
         self.__QScintillaLeftCommand(self.moveCursorLeft)
-        
+
     def __QScintillaWordLeft(self):
         """
         Private method to handle the Cursor Word Left command.
         """
         self.__QScintillaLeftCommand(self.moveCursorWordLeft)
-        
+
     def __QScintillaRightCommand(self, method):
         """
         Private method to handle a QScintilla command working to the right.
-        
+
         @param method shell method to execute
         """
         if self.__isCursorOnLastLine():
             method()
         else:
             method()
-        
+
     def __QScintillaCharRight(self):
         """
         Private method to handle the Cursor Right command.
         """
         self.__QScintillaRightCommand(self.moveCursorRight)
-        
+
     def __QScintillaWordRight(self):
         """
         Private method to handle the Cursor Word Right command.
         """
         self.__QScintillaRightCommand(self.moveCursorWordRight)
-        
+
     def __QScintillaDeleteWordRight(self):
         """
         Private method to handle the Delete Word Right command.
         """
         self.__QScintillaRightCommand(self.deleteWordRight)
-        
+
     def __QScintillaDeleteLineRight(self):
         """
         Private method to handle the Delete Line Right command.
         """
         self.__QScintillaRightCommand(self.deleteLineRight)
-        
+
     def __QScintillaVCHome(self, cmd):
         """
         Private method to handle the Home key.
-        
+
         @param cmd QScintilla command
         """
         if self.isListActive():
@@ -1596,22 +1607,22 @@
             else:
                 col = 0
             self.setCursorPosition(line, col)
-        
+
     def __QScintillaLineEnd(self, cmd):
         """
         Private method to handle the End key.
-        
+
         @param cmd QScintilla command
         """
         if self.isListActive():
             self.SendScintilla(cmd)
         elif self.__isCursorOnLastLine():
             self.moveCursorToEOL()
-    
+
     def __QScintillaCursorCommand(self, cmd):
         """
         Private method to handle the cursor commands.
-        
+
         @param cmd QScintilla command
         """
         if self.isListActive() or self.isCallTipActive():
@@ -1636,27 +1647,27 @@
                     self.__QScintillaHistoryUp(cmd)
                 elif cmd == QsciScintilla.SCI_LINESCROLLDOWN:
                     self.__QScintillaHistoryDown(cmd)
-    
+
     def __QScintillaLineUp(self, cmd):
         """
         Private method to handle the cursor up command.
-        
+
         @param cmd QScintilla command
         """
         self.SendScintilla(QsciScintilla.SCI_LINEUP)
-    
+
     def __QScintillaLineDown(self, cmd):
         """
         Private method to handle the cursor down command.
-        
+
         @param cmd QScintilla command
         """
         self.SendScintilla(QsciScintilla.SCI_LINEDOWN)
-    
+
     def __QScintillaHistoryUp(self, cmd):
         """
         Private method to handle the history up command.
-        
+
         @param cmd QScintilla command
         """
         if self.isHistoryEnabled():
@@ -1667,12 +1678,12 @@
             if buf.startswith(sys.ps2):
                 buf = buf.replace(sys.ps2, "")
             if buf and self.incrementalSearchActive:
-                if (
-                    self.incrementalSearchString and
-                    buf.startswith(self.incrementalSearchString)
+                if self.incrementalSearchString and buf.startswith(
+                    self.incrementalSearchString
                 ):
                     idx, found = self.__rsearchHistory(
-                        self.incrementalSearchString, self.__histidx)
+                        self.incrementalSearchString, self.__histidx
+                    )
                     if found and idx >= 0:
                         self.__setHistoryIndex(index=idx)
                         self.__useHistory()
@@ -1697,11 +1708,11 @@
                     elif self.__histidx > 0:
                         self.__setHistoryIndex(index=self.__histidx - 1)
                         self.__useHistory()
-    
+
     def __QScintillaHistoryDown(self, cmd):
         """
         Private method to handle the history down command.
-        
+
         @param cmd QScintilla command
         """
         if self.isHistoryEnabled():
@@ -1712,12 +1723,12 @@
             if buf.startswith(sys.ps2):
                 buf = buf.replace(sys.ps2, "")
             if buf and self.incrementalSearchActive:
-                if (
-                    self.incrementalSearchString and
-                    buf.startswith(self.incrementalSearchString)
+                if self.incrementalSearchString and buf.startswith(
+                    self.incrementalSearchString
                 ):
                     idx, found = self.__searchHistory(
-                        self.incrementalSearchString, self.__histidx)
+                        self.incrementalSearchString, self.__histidx
+                    )
                     if found and idx >= 0:
                         self.__setHistoryIndex(index=idx)
                         self.__useHistory()
@@ -1739,7 +1750,7 @@
                     if self.__isHistoryIndexValid():
                         self.__setHistoryIndex(index=self.__histidx + 1)
                         self.__useHistory()
-    
+
     def __QScintillaCancel(self):
         """
         Private method to handle the ESC command.
@@ -1750,19 +1761,19 @@
             if self.incrementalSearchActive:
                 self.__resetIncrementalHistorySearch()
             self.__insertHistory("")
-    
+
     def __QScintillaCharLeftExtend(self):
         """
         Private method to handle the Extend Selection Left command.
         """
         self.__QScintillaLeftCommand(self.extendSelectionLeft, True)
-        
+
     def __QScintillaWordLeftExtend(self):
         """
         Private method to handle the Extend Selection Left one word command.
         """
         self.__QScintillaLeftCommand(self.extendSelectionWordLeft, True)
-        
+
     def __QScintillaVCHomeExtend(self):
         """
         Private method to handle the Extend Selection to start of line command.
@@ -1774,25 +1785,25 @@
             col = len(sys.ps2)
         else:
             col = 0
-        
+
         self.extendSelectionToBOL()
         while col > 0:
             self.extendSelectionRight()
             col -= 1
-        
+
     def __QScintillaAutoCompletionCommand(self, cmd):
         """
         Private method to handle a command for autocompletion only.
-        
+
         @param cmd QScintilla command
         """
         if self.isListActive() or self.isCallTipActive():
             self.SendScintilla(cmd)
-        
+
     def __executeCommand(self, cmd, historyIndex=None):
         """
         Private slot to execute a command.
-        
+
         @param cmd command to be executed by debug client
         @type str
         @param historyIndex history index to be set
@@ -1803,12 +1814,13 @@
             self.interruptCommandExecution = False
             if not cmd:
                 # make sure cmd is a string
-                cmd = ''
-            
+                cmd = ""
+
             # History Handling
             if self.isHistoryEnabled():
                 if cmd != "" and (
-                        len(self.__history) == 0 or self.__history[-1] != cmd):
+                    len(self.__history) == 0 or self.__history[-1] != cmd
+                ):
                     if len(self.__history) == self.__maxHistoryEntries:
                         del self.__history[0]
                     self.__history.append(cmd)
@@ -1817,15 +1829,15 @@
                 elif self.__historyStyle == ShellHistoryStyle.WINDOWSSTYLE:
                     if historyIndex is None:
                         if (
-                            self.__histidx - 1 > 0 and
-                            cmd != self.__history[self.__histidx - 1]
+                            self.__histidx - 1 > 0
+                            and cmd != self.__history[self.__histidx - 1]
                         ):
                             self.__setHistoryIndex(index=-1)
                     else:
                         self.__setHistoryIndex(historyIndex)
-            
+
             if cmd.startswith("%"):
-                if cmd == '%start' or cmd.startswith('%start '):
+                if cmd == "%start" or cmd.startswith("%start "):
                     if not self.passive:
                         cmdList = cmd.split(None, 1)
                         if len(cmdList) < 2:
@@ -1838,8 +1850,7 @@
                                     self.dbs.startClient(
                                         False,
                                         forProject=True,
-                                        workingDir=self.__project
-                                        .getProjectPath()
+                                        workingDir=self.__project.getProjectPath(),
                                     )
                                     self.__currentWorkingDirectory = (
                                         self.__project.getProjectPath()
@@ -1848,8 +1859,7 @@
                                     self.dbs.startClient(
                                         False,
                                         venvName=self.__currentVenv,
-                                        workingDir=self
-                                        .__currentWorkingDirectory
+                                        workingDir=self.__currentWorkingDirectory,
                                     )
                                     # same as reset
                             else:
@@ -1857,52 +1867,48 @@
                                 self.__currentWorkingDirectory = ""
                         self.__getBanner()
                         return
-                elif cmd == '%clear':
+                elif cmd == "%clear":
                     # Display the banner.
                     self.__getBanner()
                     if not self.passive:
                         return
                     else:
-                        cmd = ''
-                elif cmd in ['%reset', '%restart']:
+                        cmd = ""
+                elif cmd in ["%reset", "%restart"]:
                     self.dbs.startClient(
-                        False, venvName=self.__currentVenv,
-                        workingDir=self.__currentWorkingDirectory)
+                        False,
+                        venvName=self.__currentVenv,
+                        workingDir=self.__currentWorkingDirectory,
+                    )
                     if self.passive:
                         return
                     else:
-                        cmd = ''
-                elif cmd in ['%envs', '%environments']:
+                        cmd = ""
+                elif cmd in ["%envs", "%environments"]:
                     venvs = (
-                        ericApp().getObject("VirtualEnvManager")
-                        .getVirtualenvNames()
+                        ericApp().getObject("VirtualEnvManager").getVirtualenvNames()
                     )
-                    s = (
-                        self.tr('Available Virtual Environments:\n{0}\n')
-                        .format('\n'.join(
-                            "- {0}".format(venv)
-                            for venv in sorted(venvs)
-                        ))
+                    s = self.tr("Available Virtual Environments:\n{0}\n").format(
+                        "\n".join("- {0}".format(venv) for venv in sorted(venvs))
                     )
                     self.__write(s)
                     self.__clientStatement(False)
                     return
-                elif cmd == '%which':
+                elif cmd == "%which":
                     s = self.tr("Current Virtual Environment: '{0}'\n").format(
-                        self.__currentVenv)
+                        self.__currentVenv
+                    )
                     self.__write(s)
                     self.__clientStatement(False)
                     return
                 elif (
-                    cmd in ["%quit", "%quit()", "%exit", "%exit()"] and
-                    self.__windowed
+                    cmd in ["%quit", "%quit()", "%exit", "%exit()"] and self.__windowed
                 ):
                     # call main window quit()
                     self.vm.quit()
                     return
             else:
-                self.dbs.remoteStatement(
-                    self.__getSelectedDebuggerId(), cmd)
+                self.dbs.remoteStatement(self.__getSelectedDebuggerId(), cmd)
                 while self.inCommandExecution:
                     with contextlib.suppress(KeyboardInterrupt):
                         QApplication.processEvents()
@@ -1911,25 +1917,26 @@
                 cmd = self.buff
                 self.buff = ""
             elif cmd:
-                cmd = cmd[len(self.prompt):]
+                cmd = cmd[len(self.prompt) :]
             self.__inRawMode = False
             self.__echoInput = True
-            
+
             self.dbs.remoteRawInput(self.__rawModeDebuggerId, cmd)
-            
+
             if self.__rawModeQueue:
                 debuggerId, prompt, echo = self.__rawModeQueue.pop(0)
                 self.__raw_input(prompt, echo, debuggerId)
-    
+
     def __showVenvName(self):
         """
         Private method to show the name of the active virtual environment.
         """
         s = "\n" + self.tr("Current Virtual Environment: '{0}'\n").format(
-            self.__currentVenv)
+            self.__currentVenv
+        )
         self.__write(s)
         self.__clientStatement(False)
-    
+
     def __useHistory(self):
         """
         Private method to display a command from the history.
@@ -1939,32 +1946,33 @@
         else:
             cmd = ""
             self.__resetIncrementalHistorySearch()
-        
+
         self.__insertHistory(cmd)
 
     def __insertHistory(self, cmd):
         """
         Private method to insert a command selected from the history.
-        
+
         @param cmd history entry to be inserted (string)
         """
         self.setCursorPosition(self.prline, self.prcol)
-        self.setSelection(self.prline, self.prcol,
-                          self.prline, self.lineLength(self.prline))
+        self.setSelection(
+            self.prline, self.prcol, self.prline, self.lineLength(self.prline)
+        )
         self.removeSelectedText()
         self.__insertText(cmd)
-    
+
     def __resetIncrementalHistorySearch(self):
         """
         Private method to reset the incremental history search.
         """
         self.incrementalSearchString = ""
         self.incrementalSearchActive = False
-    
+
     def __searchHistory(self, txt, startIdx=-1):
         """
         Private method used to search the history.
-        
+
         @param txt text to match at the beginning
         @type str
         @param startIdx index to start search from
@@ -1974,19 +1982,15 @@
         @rtype tuple of (int, bool)
         """
         idx = 0 if startIdx == -1 else startIdx + 1
-        while (
-            idx < len(self.__history) and
-            not self.__history[idx].startswith(txt)
-        ):
+        while idx < len(self.__history) and not self.__history[idx].startswith(txt):
             idx += 1
-        found = (idx < len(self.__history) and
-                 self.__history[idx].startswith(txt))
+        found = idx < len(self.__history) and self.__history[idx].startswith(txt)
         return idx, found
-        
+
     def __rsearchHistory(self, txt, startIdx=-1):
         """
         Private method used to reverse search the history.
-        
+
         @param txt text to match at the beginning
         @type str
         @param startIdx index to start search from
@@ -1996,79 +2000,78 @@
         @rtype tuple of (int, bool)
         """
         idx = len(self.__history) - 1 if startIdx == -1 else startIdx - 1
-        while (
-            idx >= 0 and
-            not self.__history[idx].startswith(txt)
-        ):
+        while idx >= 0 and not self.__history[idx].startswith(txt):
             idx -= 1
         found = idx >= 0 and self.__history[idx].startswith(txt)
         return idx, found
-        
+
     def focusNextPrevChild(self, nextChild):
         """
         Public method to stop Tab moving to the next window.
-        
+
         While the user is entering a multi-line command, the movement to
         the next window by the Tab key being pressed is suppressed.
-        
+
         @param nextChild next window
         @return flag indicating the movement
         """
         if nextChild and self.inContinue:
             return False
-        
+
         return QsciScintillaCompat.focusNextPrevChild(self, nextChild)
-        
+
     def contextMenuEvent(self, ev):
         """
         Protected method to show our own context menu.
-        
+
         @param ev context menu event (QContextMenuEvent)
         """
         if not self.__windowed:
             self.menu.popup(ev.globalPos())
             ev.accept()
-        
+
     def clear(self):
         """
         Public slot to clear the display.
         """
         # Display the banner.
         self.__getBanner()
-        
+
     def doClearRestart(self):
         """
         Public slot to handle the 'restart and clear' context menu entry.
         """
         self.doRestart()
         self.clear()
-        
+
     def doRestart(self):
         """
         Public slot to handle the 'restart' context menu entry.
         """
-        self.dbs.startClient(False, venvName=self.__currentVenv,
-                             workingDir=self.__currentWorkingDirectory)
-        
+        self.dbs.startClient(
+            False,
+            venvName=self.__currentVenv,
+            workingDir=self.__currentWorkingDirectory,
+        )
+
     def __startDebugClient(self, action):
         """
         Private slot to start a debug client according to the action
         triggered.
-        
+
         @param action context menu action that was triggered (QAction)
         """
         venvName = action.text()
         if venvName == self.tr("Project"):
             if self.__project.isOpen():
-                self.__currentWorkingDirectory = (
-                    self.__project.getProjectPath()
-                )
-            self.dbs.startClient(False, forProject=True,
-                                 workingDir=self.__currentWorkingDirectory)
+                self.__currentWorkingDirectory = self.__project.getProjectPath()
+            self.dbs.startClient(
+                False, forProject=True, workingDir=self.__currentWorkingDirectory
+            )
         else:
             self.dbs.startClient(False, venvName=venvName)
         self.__getBanner()
-        
+
     def handlePreferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
@@ -2076,30 +2079,29 @@
         # rebind the lexer
         self.__bindLexer(self.language)
         self.recolor()
-        
+
         # set margin 0 configuration
         self.__setTextDisplay()
         self.__setMargin0()
-        
+
         # set the autocompletion and calltips function
         self.__setAutoCompletion()
         self.__setCallTips()
-        
+
         # do the history related stuff
         self.__maxHistoryEntries = Preferences.getShell("MaxHistoryEntries")
         for key in list(self.__historyLists.keys()):
-            self.__historyLists[key] = (
-                self.__historyLists[key][-self.__maxHistoryEntries:]
-            )
+            self.__historyLists[key] = self.__historyLists[key][
+                -self.__maxHistoryEntries :
+            ]
         self.__historyStyle = Preferences.getShell("HistoryStyle")
         self.__historyWrap = Preferences.getShell("HistoryWrap")
         self.__setHistoryIndex()
         if not self.__windowed:
             self.hmenu.menuAction().setEnabled(self.isHistoryEnabled())
-        self.__historyNavigateByCursor = Preferences.getShell(
-            "HistoryNavigateByCursor")
+        self.__historyNavigateByCursor = Preferences.getShell("HistoryNavigateByCursor")
         self.historyStyleChanged.emit(self.__historyStyle)
-        
+
         # do stdout /stderr stuff
         showStdOutErr = Preferences.getShell("ShowStdOutErr")
         if self.__showStdOutErr != showStdOutErr:
@@ -2110,18 +2112,18 @@
                 self.dbs.clientProcessStdout.disconnect(self.__writeStdOut)
                 self.dbs.clientProcessStderr.disconnect(self.__writeStdErr)
             self.__showStdOutErr = showStdOutErr
-    
+
     @pyqtSlot(list, str)
     def __showCompletions(self, completions, text):
         """
         Private method to display the possible completions.
-        
+
         @param completions list of possible completions (list of strings)
         @param text text that is about to be completed (string)
         """
         if len(completions) == 0:
             return
-        
+
         if len(completions) > 1:
             completions.sort()
             self.showUserList(1, completions)
@@ -2132,11 +2134,11 @@
                 txt = txt.replace(text, "")
             self.__insertText(txt)
             self.completionText = ""
-        
+
     def __completionListSelected(self, listId, txt):
         """
         Private slot to handle the selection from the completion list.
-        
+
         @param listId the ID of the user list (should be 1) (integer)
         @param txt the selected text (string)
         """
@@ -2145,41 +2147,38 @@
                 txt = txt.replace(self.completionText, "")
             self.__insertText(txt)
             self.completionText = ""
-    
+
     #################################################################
     ## Drag and Drop Support
     #################################################################
-    
+
     def dragEnterEvent(self, event):
         """
         Protected method to handle the drag enter event.
-        
+
         @param event the drag enter event (QDragEnterEvent)
         """
-        self.inDragDrop = (
-            event.mimeData().hasUrls() or
-            event.mimeData().hasText()
-        )
+        self.inDragDrop = event.mimeData().hasUrls() or event.mimeData().hasText()
         if self.inDragDrop:
             event.acceptProposedAction()
         else:
             super().dragEnterEvent(event)
-        
+
     def dragMoveEvent(self, event):
         """
         Protected method to handle the drag move event.
-        
+
         @param event the drag move event (QDragMoveEvent)
         """
         if self.inDragDrop:
             event.accept()
         else:
             super().dragMoveEvent(event)
-        
+
     def dragLeaveEvent(self, event):
         """
         Protected method to handle the drag leave event.
-        
+
         @param event the drag leave event (QDragLeaveEvent)
         """
         if self.inDragDrop:
@@ -2187,11 +2186,11 @@
             event.accept()
         else:
             super().dragLeaveEvent(event)
-        
+
     def dropEvent(self, event):
         """
         Protected method to handle the drop event.
-        
+
         @param event the drop event (QDropEvent)
         """
         if event.mimeData().hasUrls() and not self.__windowed:
@@ -2204,8 +2203,10 @@
                         EricMessageBox.information(
                             self,
                             self.tr("Drop Error"),
-                            self.tr("""<p><b>{0}</b> is not a file.</p>""")
-                            .format(fname))
+                            self.tr("""<p><b>{0}</b> is not a file.</p>""").format(
+                                fname
+                            ),
+                        )
             event.acceptProposedAction()
         elif event.mimeData().hasText():
             s = event.mimeData().text()
@@ -2215,13 +2216,13 @@
             del s
         else:
             super().dropEvent(event)
-        
+
         self.inDragDrop = False
-        
+
     def focusInEvent(self, event):
         """
         Protected method called when the shell receives focus.
-        
+
         @param event the event object (QFocusEvent)
         """
         if not self.__actionsAdded:
@@ -2230,15 +2231,21 @@
             self.addActions(self.vm.viewActGrp.actions())
             if not self.__windowed:
                 self.__searchShortcut = QShortcut(
-                    self.vm.searchAct.shortcut(), self,
-                    self.__find, self.__find)
+                    self.vm.searchAct.shortcut(), self, self.__find, self.__find
+                )
                 self.__searchNextShortcut = QShortcut(
-                    self.vm.searchNextAct.shortcut(), self,
-                    self.__searchNext, self.__searchNext)
+                    self.vm.searchNextAct.shortcut(),
+                    self,
+                    self.__searchNext,
+                    self.__searchNext,
+                )
                 self.__searchPrevShortcut = QShortcut(
-                    self.vm.searchPrevAct.shortcut(), self,
-                    self.__searchPrev, self.__searchPrev)
-        
+                    self.vm.searchPrevAct.shortcut(),
+                    self,
+                    self.__searchPrev,
+                    self.__searchPrev,
+                )
+
         with contextlib.suppress(AttributeError):
             self.vm.editActGrp.setEnabled(False)
             self.vm.editorActGrp.setEnabled(True)
@@ -2251,13 +2258,13 @@
             self.__searchPrevShortcut.setEnabled(True)
         self.setCaretWidth(self.caretWidth)
         self.setCursorFlashTime(QApplication.cursorFlashTime())
-        
+
         super().focusInEvent(event)
-        
+
     def focusOutEvent(self, event):
         """
         Protected method called when the shell loses focus.
-        
+
         @param event the event object (QFocusEvent)
         """
         with contextlib.suppress(AttributeError):
@@ -2268,13 +2275,13 @@
             self.__searchPrevShortcut.setEnabled(False)
         self.setCaretWidth(0)
         super().focusOutEvent(event)
-        
+
     def insert(self, txt):
         """
         Public slot to insert text at the current cursor position.
-        
+
         The cursor is advanced to the end of the inserted text.
-        
+
         @param txt text to be inserted (string)
         """
         txt = Utilities.filterAnsiSequences(txt)
@@ -2284,31 +2291,31 @@
         if re.search(self.linesepRegExp, txt) is not None:
             line += 1
         self.setCursorPosition(line, col + length)
-        
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("shellPage")
-    
+
     def __find(self):
         """
         Private slot to show the find widget.
         """
         txt = self.selectedText()
         self.__mainWindow.showFind(txt)
-    
+
     def __searchNext(self):
         """
         Private method to search for the next occurrence.
         """
         if self.__lastSearch:
             self.searchNext(*self.__lastSearch)
-    
+
     def searchNext(self, txt, caseSensitive, wholeWord, regexp):
         """
         Public method to search the next occurrence of the given text.
-        
+
         @param txt text to search for
         @type str
         @param caseSensitive flag indicating to perform a case sensitive
@@ -2324,21 +2331,28 @@
         posixMode = Preferences.getEditor("SearchRegexpMode") == 0 and regexp
         cxx11Mode = Preferences.getEditor("SearchRegexpMode") == 1 and regexp
         ok = self.findFirst(
-            txt, regexp, caseSensitive, wholeWord, True, forward=True,
-            posix=posixMode, cxx11=cxx11Mode)
+            txt,
+            regexp,
+            caseSensitive,
+            wholeWord,
+            True,
+            forward=True,
+            posix=posixMode,
+            cxx11=cxx11Mode,
+        )
         self.searchStringFound.emit(ok)
-    
+
     def __searchPrev(self):
         """
         Private method to search for the next occurrence.
         """
         if self.__lastSearch:
             self.searchPrev(*self.__lastSearch)
-    
+
     def searchPrev(self, txt, caseSensitive, wholeWord, regexp):
         """
         Public method to search the previous occurrence of the given text.
-        
+
         @param txt text to search for
         @type str
         @param caseSensitive flag indicating to perform a case sensitive
@@ -2358,29 +2372,37 @@
         posixMode = Preferences.getEditor("SearchRegexpMode") == 0 and regexp
         cxx11Mode = Preferences.getEditor("SearchRegexpMode") == 1 and regexp
         ok = self.findFirst(
-            txt, regexp, caseSensitive, wholeWord, True,
-            forward=False, line=line, index=index, posix=posixMode,
-            cxx11=cxx11Mode)
+            txt,
+            regexp,
+            caseSensitive,
+            wholeWord,
+            True,
+            forward=False,
+            line=line,
+            index=index,
+            posix=posixMode,
+            cxx11=cxx11Mode,
+        )
         self.searchStringFound.emit(ok)
-    
+
     def historyStyle(self):
         """
         Public method to get the shell history style.
-        
+
         @return shell history style
         @rtype ShellHistoryStyle
         """
         return self.__historyStyle
-    
+
     def isHistoryEnabled(self):
         """
         Public method to check, if the history is enabled.
-        
+
         @return flag indicating if history is enabled
         @rtype bool
         """
         return self.__historyStyle != ShellHistoryStyle.DISABLED
-    
+
     def saveContents(self):
         """
         Public method to save the current contents to a file.
@@ -2393,13 +2415,13 @@
                 Preferences.getMultiProject("Workspace"),
                 self.tr("Text Files (*.txt);;All Files (*)"),
                 None,
-                EricFileDialog.DontConfirmOverwrite
+                EricFileDialog.DontConfirmOverwrite,
             )
-            
+
             if fn:
                 if fn.endswith("."):
                     fn = fn[:-1]
-                
+
                 fpath = pathlib.Path(fn)
                 if not fpath.suffix:
                     ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -2409,9 +2431,12 @@
                     res = EricMessageBox.yesNo(
                         self,
                         self.tr("Save Shell Contents"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fpath),
-                        icon=EricMessageBox.Warning)
+                        self.tr(
+                            "<p>The file <b>{0}</b> already exists."
+                            " Overwrite it?</p>"
+                        ).format(fpath),
+                        icon=EricMessageBox.Warning,
+                    )
                     if not res:
                         return
             try:
@@ -2421,24 +2446,27 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Save Shell Contents"),
-                    self.tr('<p>The file <b>{0}</b> could not be saved.<br/>'
-                            'Reason: {1}</p>')
-                    .format(fpath, str(why)))
-    
+                    self.tr(
+                        "<p>The file <b>{0}</b> could not be saved.<br/>"
+                        "Reason: {1}</p>"
+                    ).format(fpath, str(why)),
+                )
+
     #################################################################
     ## Project Support
     #################################################################
-    
+
     def __projectOpened(self):
         """
         Private slot to start the shell for the opened project.
         """
         if Preferences.getProject("RestartShellForProject"):
-            self.dbs.startClient(False, forProject=True,
-                                 workingDir=self.__project.getProjectPath())
+            self.dbs.startClient(
+                False, forProject=True, workingDir=self.__project.getProjectPath()
+            )
             self.__currentWorkingDirectory = self.__project.getProjectPath()
             self.__getBanner()
-    
+
     def __projectClosed(self):
         """
         Private slot to restart the default shell when the project is closed.
@@ -2447,5 +2475,6 @@
             self.dbs.startClient(False)
             self.__getBanner()
 
+
 #
 # eflag: noqa = M601
--- a/src/eric7/QScintilla/ShellHistoryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/ShellHistoryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the shell history dialog.
     """
+
     def __init__(self, history, vm, shell):
         """
         Constructor
-        
+
         @param history reference to the current shell history
         @type list of str
         @param vm reference to the viewmanager object
@@ -32,42 +33,42 @@
         """
         super().__init__(shell)
         self.setupUi(self)
-        
+
         self.__vm = vm
         self.__shell = shell
-        
+
         self.historyList.addItems(history)
         index = shell.getHistoryIndex()
         if index < 0 or index >= len(history):
             self.historyList.setCurrentRow(
-                self.historyList.count() - 1,
-                QItemSelectionModel.SelectionFlag.Select)
+                self.historyList.count() - 1, QItemSelectionModel.SelectionFlag.Select
+            )
         else:
             self.historyList.setCurrentRow(
-                index, QItemSelectionModel.SelectionFlag.Select)
+                index, QItemSelectionModel.SelectionFlag.Select
+            )
         self.historyList.scrollToItem(self.historyList.currentItem())
-    
+
     @pyqtSlot()
     def on_historyList_itemSelectionChanged(self):
         """
         Private slot to handle a change of the selection.
         """
         selected = len(self.historyList.selectedItems()) > 0
-        self.copyButton.setEnabled(selected and
-                                   self.__vm.activeWindow() is not None)
+        self.copyButton.setEnabled(selected and self.__vm.activeWindow() is not None)
         self.deleteButton.setEnabled(selected)
         self.executeButton.setEnabled(selected)
-    
+
     @pyqtSlot(QListWidgetItem)
     def on_historyList_itemDoubleClicked(self, item):
         """
         Private slot to handle a double click of an item.
-        
+
         @param item reference to the item that was double clicked
             (QListWidgetItem)
         """
         self.on_executeButton_clicked()
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -78,7 +79,7 @@
             del ditm
         self.historyList.scrollToItem(self.historyList.currentItem())
         self.historyList.setFocus()
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -96,7 +97,7 @@
             txt = eol.join(lines) + eol
             aw.insert(txt)
         self.historyList.setFocus()
-    
+
     @pyqtSlot()
     def on_executeButton_clicked(self):
         """
@@ -109,13 +110,11 @@
             if itm.isSelected():
                 lines.append(itm.text())
         cmds = os.linesep.join(lines) + os.linesep
-        self.__shell.executeLines(
-            cmds,
-            historyIndex=self.historyList.currentRow())
-        
+        self.__shell.executeLines(cmds, historyIndex=self.historyList.currentRow())
+
         # reload the list because shell modified it
         self.on_reloadButton_clicked()
-    
+
     @pyqtSlot()
     def on_reloadButton_clicked(self):
         """
@@ -123,24 +122,25 @@
         """
         history = self.__shell.getHistory(None)
         index = self.__shell.getHistoryIndex()
-        
+
         self.historyList.clear()
         self.historyList.addItems(history)
         if index < 0 or index >= len(history):
             self.historyList.setCurrentRow(
-                self.historyList.count() - 1,
-                QItemSelectionModel.SelectionFlag.Select)
+                self.historyList.count() - 1, QItemSelectionModel.SelectionFlag.Select
+            )
         else:
             self.historyList.setCurrentRow(
-                index, QItemSelectionModel.SelectionFlag.Select)
+                index, QItemSelectionModel.SelectionFlag.Select
+            )
         self.historyList.scrollToItem(self.historyList.currentItem())
-        
+
         self.historyList.setFocus(Qt.FocusReason.OtherFocusReason)
-        
+
     def getHistory(self):
         """
         Public method to retrieve the history from the dialog.
-        
+
         @return tuple containing the list of history entries and the
             current row
         @rtype tuple of (list of str, int)
--- a/src/eric7/QScintilla/ShellWindow.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/ShellWindow.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,13 +9,9 @@
 
 import os
 
-from PyQt6.QtCore import (
-    Qt, QCoreApplication, QPoint, QSize, QSignalMapper, QProcess
-)
+from PyQt6.QtCore import Qt, QCoreApplication, QPoint, QSize, QSignalMapper, QProcess
 from PyQt6.QtGui import QKeySequence, QAction
-from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QApplication, QWhatsThis, QDialog
-)
+from PyQt6.QtWidgets import QWidget, QVBoxLayout, QApplication, QWhatsThis, QDialog
 from PyQt6.Qsci import QsciScintilla
 
 from EricWidgets.EricMainWindow import EricMainWindow
@@ -44,10 +40,11 @@
     """
     Class implementing a stand alone shell window.
     """
+
     def __init__(self, originalPathString, parent=None, name=None):
         """
         Constructor
-        
+
         @param originalPathString original PATH environment variable
         @type str
         @param parent reference to the parent widget
@@ -60,26 +57,25 @@
             self.setObjectName(name)
         self.setWindowIcon(UI.PixmapCache.getIcon("shell"))
         self.setWindowTitle(self.tr("eric Shell"))
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.__lastDebuggerId = ""
-        
+
         # initialize the APIs manager
         self.__apisManager = APIsManager(parent=self)
-        
+
         # initialize the debug server and shell widgets
-        self.__debugServer = DebugServer(originalPathString,
-                                         preventPassiveDebugging=True,
-                                         parent=self)
+        self.__debugServer = DebugServer(
+            originalPathString, preventPassiveDebugging=True, parent=self
+        )
         self.__debugServer.clientDebuggerId.connect(self.__clientDebuggerId)
-        
+
         self.__shell = Shell(self.__debugServer, self, None, True, self)
         self.__shell.registerDebuggerIdMethod(self.getDebuggerId)
-        
+
         self.__searchWidget = SearchWidget(self.__shell, self, showLine=True)
-        
+
         centralWidget = QWidget()
         layout = QVBoxLayout()
         layout.setContentsMargins(1, 1, 1, 1)
@@ -88,36 +84,34 @@
         centralWidget.setLayout(layout)
         self.setCentralWidget(centralWidget)
         self.__searchWidget.hide()
-        
+
         self.__searchWidget.searchNext.connect(self.__shell.searchNext)
         self.__searchWidget.searchPrevious.connect(self.__shell.searchPrev)
-        self.__shell.searchStringFound.connect(
-            self.__searchWidget.searchStringFound)
-        
+        self.__shell.searchStringFound.connect(self.__searchWidget.searchStringFound)
+
         self.__shell.zoomValueChanged.connect(self.__zoomValueChanged)
-        
+
         self.__createActions()
         self.__createMenus()
         self.__createToolBars()
         self.__createStatusBar()
-        
+
         self.__readSettings()
-        
+
         self.__shell.historyStyleChanged.connect(self.__historyStyleChanged)
-        
+
         # Generate the virtual environment manager and register it
         self.virtualenvManager = VirtualenvManager(self)
         ericApp().registerObject("VirtualEnvManager", self.virtualenvManager)
-        
-        self.__shell.virtualEnvironmentChanged.connect(
-            self.__virtualEnvironmentChanged)
-        
+
+        self.__shell.virtualEnvironmentChanged.connect(self.__virtualEnvironmentChanged)
+
         # now start the debug client with the most recently used virtual
         # environment
         self.__debugServer.startClient(
             False, venvName=Preferences.getShell("LastVirtualEnvironment")
         )
-        
+
         # set the keyboard input interval
         interval = Preferences.getUI("KeyboardInputInterval")
         if interval > 0:
@@ -126,7 +120,7 @@
     def closeEvent(self, event):
         """
         Protected method to handle the close event.
-        
+
         @param event close event
         @type QCloseEvent
         """
@@ -134,31 +128,31 @@
         self.__debugServer.shutdownServer()
         self.__shell.closeShell()
         Preferences.syncPreferences()
-        
+
         event.accept()
-    
+
     def __clientDebuggerId(self, debuggerId):
         """
         Private slot to receive the ID of a newly connected debugger backend.
-        
+
         @param debuggerId ID of a newly connected debugger backend
         @type str
         """
         self.__lastDebuggerId = debuggerId
-    
+
     def getDebuggerId(self):
         """
         Public method to get the most recently registered debugger ID.
-        
+
         @return debugger ID
         @rtype str
         """
         return self.__lastDebuggerId
-    
+
     ##################################################################
     ## Below are API handling methods
     ##################################################################
-    
+
     def getAPIsManager(self):
         """
         Public method to get a reference to the APIs manager.
@@ -166,15 +160,15 @@
         @return the APIs manager object (eric7.QScintilla.APIsManager)
         """
         return self.__apisManager
-    
+
     ##################################################################
     ## Below are action related methods
     ##################################################################
-    
+
     def __readShortcut(self, act, category):
         """
         Private function to read a single keyboard shortcut from the settings.
-        
+
         @param act reference to the action object
         @type EricAction
         @param category category the action belongs to
@@ -182,15 +176,16 @@
         """
         if act.objectName():
             accel = Preferences.getSettings().value(
-                "Shortcuts/{0}/{1}/Accel".format(category, act.objectName()))
+                "Shortcuts/{0}/{1}/Accel".format(category, act.objectName())
+            )
             if accel is not None:
                 act.setShortcut(QKeySequence(accel))
             accel = Preferences.getSettings().value(
-                "Shortcuts/{0}/{1}/AltAccel".format(
-                    category, act.objectName()))
+                "Shortcuts/{0}/{1}/AltAccel".format(category, act.objectName())
+            )
             if accel is not None:
                 act.setAlternateShortcut(QKeySequence(accel), removeEmpty=True)
-    
+
     def __createActions(self):
         """
         Private method to create the actions.
@@ -200,16 +195,16 @@
         self.searchActions = []
         self.viewActions = []
         self.helpActions = []
-        
+
         self.viewActGrp = createActionGroup(self)
-        
+
         self.__createFileActions()
         self.__createEditActions()
         self.__createSearchActions()
         self.__createViewActions()
         self.__createHelpActions()
         self.__createHistoryActions()
-        
+
         # read the keyboard shortcuts and make them identical to the main
         # eric shortcuts
         for act in self.helpActions:
@@ -220,88 +215,115 @@
             self.__readShortcut(act, "View")
         for act in self.searchActions:
             self.__readShortcut(act, "Search")
-    
+
     def __createFileActions(self):
         """
         Private method defining the user interface actions for the file
         commands.
         """
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'quit')
-        self.exitAct.setStatusTip(self.tr('Quit the Shell'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit the Shell</b>"""
-            """<p>This quits the Shell window.</p>"""
-        ))
+            0,
+            self,
+            "quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the Shell"))
+        self.exitAct.setWhatsThis(
+            self.tr(
+                """<b>Quit the Shell</b>""" """<p>This quits the Shell window.</p>"""
+            )
+        )
         self.exitAct.triggered.connect(self.quit)
         self.exitAct.setMenuRole(QAction.MenuRole.QuitRole)
         self.fileActions.append(self.exitAct)
-        
+
         self.newWindowAct = EricAction(
-            self.tr('New Window'),
+            self.tr("New Window"),
             UI.PixmapCache.getIcon("newWindow"),
-            self.tr('New &Window'),
+            self.tr("New &Window"),
             QKeySequence(self.tr("Ctrl+Shift+N", "File|New Window")),
-            0, self, 'new_window')
-        self.newWindowAct.setStatusTip(self.tr(
-            'Open a new Shell window'))
-        self.newWindowAct.setWhatsThis(self.tr(
-            """<b>New Window</b>"""
-            """<p>This opens a new instance of the Shell window.</p>"""
-        ))
+            0,
+            self,
+            "new_window",
+        )
+        self.newWindowAct.setStatusTip(self.tr("Open a new Shell window"))
+        self.newWindowAct.setWhatsThis(
+            self.tr(
+                """<b>New Window</b>"""
+                """<p>This opens a new instance of the Shell window.</p>"""
+            )
+        )
         self.newWindowAct.triggered.connect(self.__newWindow)
         self.fileActions.append(self.newWindowAct)
-        
+
         self.restartAct = EricAction(
-            self.tr('Restart'),
+            self.tr("Restart"),
             UI.PixmapCache.getIcon("restart"),
-            self.tr('Restart'),
-            0, 0, self, 'shell_restart')
-        self.restartAct.setStatusTip(self.tr(
-            'Restart the shell'))
-        self.restartAct.setWhatsThis(self.tr(
-            """<b>Restart</b>"""
-            """<p>Restart the shell for the currently selected"""
-            """ environment.</p>"""
-        ))
+            self.tr("Restart"),
+            0,
+            0,
+            self,
+            "shell_restart",
+        )
+        self.restartAct.setStatusTip(self.tr("Restart the shell"))
+        self.restartAct.setWhatsThis(
+            self.tr(
+                """<b>Restart</b>"""
+                """<p>Restart the shell for the currently selected"""
+                """ environment.</p>"""
+            )
+        )
         self.restartAct.triggered.connect(self.__shell.doRestart)
         self.fileActions.append(self.restartAct)
-        
+
         self.clearRestartAct = EricAction(
-            self.tr('Restart and Clear'),
+            self.tr("Restart and Clear"),
             UI.PixmapCache.getIcon("restartDelete"),
-            self.tr('Restart and Clear'),
-            Qt.Key.Key_F4, 0, self, 'shell_clear_restart')
-        self.clearRestartAct.setStatusTip(self.tr(
-            'Clear the window and restart the shell'))
-        self.clearRestartAct.setWhatsThis(self.tr(
-            """<b>Restart and Clear</b>"""
-            """<p>Clear the shell window and restart the shell for the"""
-            """ currently selected environment.</p>"""
-        ))
+            self.tr("Restart and Clear"),
+            Qt.Key.Key_F4,
+            0,
+            self,
+            "shell_clear_restart",
+        )
+        self.clearRestartAct.setStatusTip(
+            self.tr("Clear the window and restart the shell")
+        )
+        self.clearRestartAct.setWhatsThis(
+            self.tr(
+                """<b>Restart and Clear</b>"""
+                """<p>Clear the shell window and restart the shell for the"""
+                """ currently selected environment.</p>"""
+            )
+        )
         self.clearRestartAct.triggered.connect(self.__shell.doClearRestart)
         self.fileActions.append(self.clearRestartAct)
-        
+
         self.saveContentsAct = EricAction(
-            self.tr('Save Contents'),
+            self.tr("Save Contents"),
             UI.PixmapCache.getIcon("fileSave"),
-            self.tr('Save Contents...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+S", "File|Save")),
-            0, self, 'vm_file_save')
-        self.saveContentsAct.setStatusTip(self.tr(
-            'Save the current contents of the shell to a file'))
-        self.saveContentsAct.setWhatsThis(self.tr(
-            """<b>Save Contents</b>"""
-            """<p>Save the current contents of the shell to a file.</p>"""
-        ))
+            self.tr("Save Contents..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+S", "File|Save")
+            ),
+            0,
+            self,
+            "vm_file_save",
+        )
+        self.saveContentsAct.setStatusTip(
+            self.tr("Save the current contents of the shell to a file")
+        )
+        self.saveContentsAct.setWhatsThis(
+            self.tr(
+                """<b>Save Contents</b>"""
+                """<p>Save the current contents of the shell to a file.</p>"""
+            )
+        )
         self.saveContentsAct.triggered.connect(self.__shell.saveContents)
         self.fileActions.append(self.saveContentsAct)
-    
+
     def __createEditActions(self):
         """
         Private method defining the user interface actions for the edit
@@ -309,723 +331,917 @@
         """
         self.editActGrp = createActionGroup(self)
         self.copyActGrp = createActionGroup(self.editActGrp)
-        
+
         self.cutAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Cut'),
+            QCoreApplication.translate("ViewManager", "Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            QCoreApplication.translate('ViewManager', 'Cu&t'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+X", "Edit|Cut")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Del", "Edit|Cut")),
-            self.copyActGrp, 'vm_edit_cut')
-        self.cutAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Cut the selection'))
-        self.cutAct.setWhatsThis(self.tr(
-            """<b>Cut</b>"""
-            """<p>Cut the selected text to the clipboard.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Cu&t"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+X", "Edit|Cut")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Shift+Del", "Edit|Cut")
+            ),
+            self.copyActGrp,
+            "vm_edit_cut",
+        )
+        self.cutAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Cut the selection")
+        )
+        self.cutAct.setWhatsThis(
+            self.tr(
+                """<b>Cut</b>""" """<p>Cut the selected text to the clipboard.</p>"""
+            )
+        )
         self.cutAct.triggered.connect(self.__shell.cut)
         self.editActions.append(self.cutAct)
-        
+
         self.copyAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Copy'),
+            QCoreApplication.translate("ViewManager", "Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            QCoreApplication.translate('ViewManager', '&Copy'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+C", "Edit|Copy")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Ins", "Edit|Copy")),
-            self.copyActGrp, 'vm_edit_copy')
-        self.copyAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Copy the selection'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy the selected text to the clipboard.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Copy"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+C", "Edit|Copy")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Ins", "Edit|Copy")
+            ),
+            self.copyActGrp,
+            "vm_edit_copy",
+        )
+        self.copyAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Copy the selection")
+        )
+        self.copyAct.setWhatsThis(
+            self.tr(
+                """<b>Copy</b>""" """<p>Copy the selected text to the clipboard.</p>"""
+            )
+        )
         self.copyAct.triggered.connect(self.__shell.copy)
         self.editActions.append(self.copyAct)
-        
+
         self.pasteAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Paste'),
+            QCoreApplication.translate("ViewManager", "Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            QCoreApplication.translate('ViewManager', '&Paste'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+V", "Edit|Paste")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Ins", "Edit|Paste")),
-            self.copyActGrp, 'vm_edit_paste')
-        self.pasteAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Paste the last cut/copied text'))
-        self.pasteAct.setWhatsThis(self.tr(
-            """<b>Paste</b>"""
-            """<p>Paste the last cut/copied text from the clipboard.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Paste"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+V", "Edit|Paste")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Shift+Ins", "Edit|Paste")
+            ),
+            self.copyActGrp,
+            "vm_edit_paste",
+        )
+        self.pasteAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Paste the last cut/copied text")
+        )
+        self.pasteAct.setWhatsThis(
+            self.tr(
+                """<b>Paste</b>"""
+                """<p>Paste the last cut/copied text from the clipboard.</p>"""
+            )
+        )
         self.pasteAct.triggered.connect(self.__shell.paste)
         self.editActions.append(self.pasteAct)
-        
+
         self.clearAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear'),
+            QCoreApplication.translate("ViewManager", "Clear"),
             UI.PixmapCache.getIcon("editDelete"),
-            QCoreApplication.translate('ViewManager', 'Clear'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Shift+C", "Edit|Clear")),
+            QCoreApplication.translate("ViewManager", "Clear"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Alt+Shift+C", "Edit|Clear")
+            ),
             0,
-            self.copyActGrp, 'vm_edit_clear')
-        self.clearAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear all text'))
-        self.clearAct.setWhatsThis(self.tr(
-            """<b>Clear</b>"""
-            """<p>Delete all text.</p>"""
-        ))
+            self.copyActGrp,
+            "vm_edit_clear",
+        )
+        self.clearAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear all text")
+        )
+        self.clearAct.setWhatsThis(
+            self.tr("""<b>Clear</b>""" """<p>Delete all text.</p>""")
+        )
         self.clearAct.triggered.connect(self.__shell.clear)
         self.editActions.append(self.clearAct)
-        
+
         self.cutAct.setEnabled(False)
         self.copyAct.setEnabled(False)
         self.__shell.copyAvailable.connect(self.cutAct.setEnabled)
         self.__shell.copyAvailable.connect(self.copyAct.setEnabled)
-        
+
         ####################################################################
         ## Below follow the actions for QScintilla standard commands.
         ####################################################################
-        
+
         self.esm = QSignalMapper(self)
         try:
             self.esm.mappedInt.connect(self.__shell.editorCommand)
         except AttributeError:
             # pre Qt 5.15
             self.esm.mapped[int].connect(self.__shell.editorCommand)
-        
+
         self.editorActGrp = createActionGroup(self)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+L')),
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+L")),
             0,
-            self.editorActGrp, 'vm_edit_delete_current_line')
+            self.editorActGrp,
+            "vm_edit_delete_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDELETE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Tab')), 0,
-            self.editorActGrp, 'vm_edit_indent_one_level')
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Tab")),
+            0,
+            self.editorActGrp,
+            "vm_edit_indent_one_level",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_TAB)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Return')),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Enter')),
-            self.editorActGrp, 'vm_edit_insert_line')
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Return")),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Enter")),
+            self.editorActGrp,
+            "vm_edit_insert_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_NEWLINE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Backspace')),
-            0, self.editorActGrp, 'vm_edit_delete_previous_char')
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Backspace")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_previous_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+H')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+H"))
+            )
         else:
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Backspace')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Shift+Backspace")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACK)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Del')),
-            0, self.editorActGrp, 'vm_edit_delete_current_char')
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_current_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+D')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+D"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CLEAR)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Backspace')),
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Backspace")),
             0,
-            self.editorActGrp, 'vm_edit_delete_word_left')
+            self.editorActGrp,
+            "vm_edit_delete_word_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Del')),
-            0, self.editorActGrp, 'vm_edit_delete_word_right')
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_word_right",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+Backspace')),
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Shift+Backspace")
+            ),
             0,
-            self.editorActGrp, 'vm_edit_delete_line_left')
+            self.editorActGrp,
+            "vm_edit_delete_line_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINELEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_delete_line_right')
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_line_right",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+K')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+K"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Del')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Del")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINERIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Left')), 0,
-            self.editorActGrp, 'vm_edit_move_left_char')
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_char",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFT)
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+B"))
+            )
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Right')),
-            0, self.editorActGrp, 'vm_edit_move_right_char')
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_left_word')
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Left"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Left"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_right_word')
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_word",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Right"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
+                "ViewManager", "Move to first visible character in document line"
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_first_visible_char')
+                "ViewManager", "Move to first visible character in document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOME)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of document line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_line')
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Up')), 0,
-            self.editorActGrp, 'vm_edit_move_up_line')
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+P')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+P"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Down')), 0,
-            self.editorActGrp, 'vm_edit_move_down_line')
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+N')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+N"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            self.tr('Move forward one history entry'),
-            self.tr('Move forward one history entry'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Down')),
-            0, self.editorActGrp, 'vm_edit_scroll_down_line')
+            self.tr("Move forward one history entry"),
+            self.tr("Move forward one history entry"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_down_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            self.tr('Move back one history entry'),
-            self.tr('Move back one history entry'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+Up')),
-            0, self.editorActGrp, 'vm_edit_scroll_up_line')
+            self.tr("Move back one history entry"),
+            self.tr("Move back one history entry"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_up_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgUp')), 0,
-            self.editorActGrp, 'vm_edit_move_up_page')
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgDown')),
-            0, self.editorActGrp, 'vm_edit_move_down_page')
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+V')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+V"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Esc')), 0,
-            self.editorActGrp, 'vm_edit_escape')
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Esc")),
+            0,
+            self.editorActGrp,
+            "vm_edit_escape",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CANCEL)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one character'),
+                "ViewManager", "Extend selection left one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Left')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_left_char')
+                "ViewManager", "Extend selection left one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+B"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one character'),
+                "ViewManager", "Extend selection right one character"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Right')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_right_char')
+                "ViewManager", "Extend selection right one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_left_word')
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Left")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Left")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
+                "ViewManager", "Extend selection right one word"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_right_word')
+                "ViewManager", "Extend selection right one word"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_first_visible_char')
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
+                "ViewManager", "Extend selection to end of document line"
+            ),
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_line')
+                "ViewManager", "Extend selection to end of document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-    
+
     def __createSearchActions(self):
         """
         Private method defining the user interface actions for the search
         commands.
         """
         self.searchActGrp = createActionGroup(self)
-        
+
         self.searchAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search'),
+            QCoreApplication.translate("ViewManager", "Search"),
             UI.PixmapCache.getIcon("find"),
-            QCoreApplication.translate('ViewManager', '&Search...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+F", "Search|Search")),
+            QCoreApplication.translate("ViewManager", "&Search..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+F", "Search|Search")
+            ),
             0,
-            self, 'vm_search')
-        self.searchAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text'))
-        self.searchAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search</b>"""
-            """<p>Search for some text in the shell window. A"""
-            """ dialog is shown to enter the search text and options"""
-            """ for the search.</p>"""
-        ))
+            self,
+            "vm_search",
+        )
+        self.searchAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search for a text")
+        )
+        self.searchAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search</b>"""
+                """<p>Search for some text in the shell window. A"""
+                """ dialog is shown to enter the search text and options"""
+                """ for the search.</p>""",
+            )
+        )
         self.searchAct.triggered.connect(self.__showFind)
         self.searchActions.append(self.searchAct)
-        
+
         self.searchNextAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Search next'),
+            QCoreApplication.translate("ViewManager", "Search next"),
             UI.PixmapCache.getIcon("findNext"),
-            QCoreApplication.translate('ViewManager', 'Search &next'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "F3", "Search|Search next")),
+            QCoreApplication.translate("ViewManager", "Search &next"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "F3", "Search|Search next")
+            ),
             0,
-            self, 'vm_search_next')
-        self.searchNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search next occurrence of text'))
-        self.searchNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search next</b>"""
-            """<p>Search the next occurrence of some text in the shell"""
-            """ window. The previously entered search text and options are"""
-            """ reused.</p>"""
-        ))
+            self,
+            "vm_search_next",
+        )
+        self.searchNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search next occurrence of text")
+        )
+        self.searchNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search next</b>"""
+                """<p>Search the next occurrence of some text in the shell"""
+                """ window. The previously entered search text and options are"""
+                """ reused.</p>""",
+            )
+        )
         self.searchNextAct.triggered.connect(
-            self.__searchWidget.on_findNextButton_clicked)
+            self.__searchWidget.on_findNextButton_clicked
+        )
         self.searchActions.append(self.searchNextAct)
-        
+
         self.searchPrevAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search previous'),
+            QCoreApplication.translate("ViewManager", "Search previous"),
             UI.PixmapCache.getIcon("findPrev"),
-            QCoreApplication.translate('ViewManager', 'Search &previous'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+F3", "Search|Search previous")),
+            QCoreApplication.translate("ViewManager", "Search &previous"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+F3", "Search|Search previous"
+                )
+            ),
             0,
-            self, 'vm_search_previous')
-        self.searchPrevAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search previous occurrence of text'))
-        self.searchPrevAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search previous</b>"""
-            """<p>Search the previous occurrence of some text in the shell"""
-            """ window. The previously entered search text and options are"""
-            """ reused.</p>"""
-        ))
+            self,
+            "vm_search_previous",
+        )
+        self.searchPrevAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search previous occurrence of text"
+            )
+        )
+        self.searchPrevAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search previous</b>"""
+                """<p>Search the previous occurrence of some text in the shell"""
+                """ window. The previously entered search text and options are"""
+                """ reused.</p>""",
+            )
+        )
         self.searchPrevAct.triggered.connect(
-            self.__searchWidget.on_findPrevButton_clicked)
+            self.__searchWidget.on_findPrevButton_clicked
+        )
         self.searchActions.append(self.searchPrevAct)
-    
+
     def __createViewActions(self):
         """
         Private method defining the user interface actions for the view
         commands.
         """
         self.viewActGrp = createActionGroup(self)
-        
+
         self.zoomInAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom in'),
+            QCoreApplication.translate("ViewManager", "Zoom in"),
             UI.PixmapCache.getIcon("zoomIn"),
-            QCoreApplication.translate('ViewManager', 'Zoom &in'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl++", "View|Zoom in")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom In", "View|Zoom in")),
-            self.viewActGrp, 'vm_view_zoom_in')
-        self.zoomInAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom in on the text'))
-        self.zoomInAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom in</b>"""
-            """<p>Zoom in on the text. This makes the text bigger.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &in"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl++", "View|Zoom in")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom In", "View|Zoom in")
+            ),
+            self.viewActGrp,
+            "vm_view_zoom_in",
+        )
+        self.zoomInAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom in on the text")
+        )
+        self.zoomInAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the text. This makes the text bigger.</p>""",
+            )
+        )
         self.zoomInAct.triggered.connect(self.__zoomIn)
         self.viewActions.append(self.zoomInAct)
-        
+
         self.zoomOutAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom out'),
+            QCoreApplication.translate("ViewManager", "Zoom out"),
             UI.PixmapCache.getIcon("zoomOut"),
-            QCoreApplication.translate('ViewManager', 'Zoom &out'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+-", "View|Zoom out")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom Out", "View|Zoom out")),
-            self.viewActGrp, 'vm_view_zoom_out')
-        self.zoomOutAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom out on the text'))
-        self.zoomOutAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom out</b>"""
-            """<p>Zoom out on the text. This makes the text smaller.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &out"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+-", "View|Zoom out")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom Out", "View|Zoom out")
+            ),
+            self.viewActGrp,
+            "vm_view_zoom_out",
+        )
+        self.zoomOutAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom out on the text")
+        )
+        self.zoomOutAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the text. This makes the text smaller.</p>""",
+            )
+        )
         self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.viewActions.append(self.zoomOutAct)
-        
+
         self.zoomResetAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom reset'),
+            QCoreApplication.translate("ViewManager", "Zoom reset"),
             UI.PixmapCache.getIcon("zoomReset"),
-            QCoreApplication.translate('ViewManager', 'Zoom &reset'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+0", "View|Zoom reset")),
+            QCoreApplication.translate("ViewManager", "Zoom &reset"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+0", "View|Zoom reset")
+            ),
             0,
-            self.viewActGrp, 'vm_view_zoom_reset')
-        self.zoomResetAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Reset the zoom of the text'))
-        self.zoomResetAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom reset</b>"""
-            """<p>Reset the zoom of the text. """
-            """This sets the zoom factor to 100%.</p>"""
-        ))
+            self.viewActGrp,
+            "vm_view_zoom_reset",
+        )
+        self.zoomResetAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Reset the zoom of the text")
+        )
+        self.zoomResetAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom reset</b>"""
+                """<p>Reset the zoom of the text. """
+                """This sets the zoom factor to 100%.</p>""",
+            )
+        )
         self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.viewActions.append(self.zoomResetAct)
-        
+
         self.zoomToAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom'),
+            QCoreApplication.translate("ViewManager", "Zoom"),
             UI.PixmapCache.getIcon("zoomTo"),
-            QCoreApplication.translate('ViewManager', '&Zoom'),
-            0, 0,
-            self.viewActGrp, 'vm_view_zoom')
-        self.zoomToAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom the text'))
-        self.zoomToAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom</b>"""
-            """<p>Zoom the text. This opens a dialog where the"""
-            """ desired size can be entered.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Zoom"),
+            0,
+            0,
+            self.viewActGrp,
+            "vm_view_zoom",
+        )
+        self.zoomToAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom the text")
+        )
+        self.zoomToAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom</b>"""
+                """<p>Zoom the text. This opens a dialog where the"""
+                """ desired size can be entered.</p>""",
+            )
+        )
         self.zoomToAct.triggered.connect(self.__zoom)
         self.viewActions.append(self.zoomToAct)
-    
+
     def __createHistoryActions(self):
         """
         Private method defining the user interface actions for the history
         commands.
         """
         self.showHistoryAct = EricAction(
-            self.tr('Show History'),
+            self.tr("Show History"),
             UI.PixmapCache.getIcon("history"),
-            self.tr('&Show History...'),
-            0, 0,
-            self, 'shell_show_history')
-        self.showHistoryAct.setStatusTip(self.tr(
-            "Show the shell history in a dialog"))
+            self.tr("&Show History..."),
+            0,
+            0,
+            self,
+            "shell_show_history",
+        )
+        self.showHistoryAct.setStatusTip(self.tr("Show the shell history in a dialog"))
         self.showHistoryAct.triggered.connect(self.__shell.showHistory)
-        
+
         self.clearHistoryAct = EricAction(
-            self.tr('Clear History'),
+            self.tr("Clear History"),
             UI.PixmapCache.getIcon("historyClear"),
-            self.tr('&Clear History...'),
-            0, 0,
-            self, 'shell_clear_history')
-        self.clearHistoryAct.setStatusTip(self.tr(
-            "Clear the shell history"))
+            self.tr("&Clear History..."),
+            0,
+            0,
+            self,
+            "shell_clear_history",
+        )
+        self.clearHistoryAct.setStatusTip(self.tr("Clear the shell history"))
         self.clearHistoryAct.triggered.connect(self.__shell.clearHistory)
-        
+
         self.selectHistoryAct = EricAction(
-            self.tr('Select History Entry'),
-            self.tr('Select History &Entry'),
-            0, 0,
-            self, 'shell_select_history')
-        self.selectHistoryAct.setStatusTip(self.tr(
-            "Select an entry of the shell history"))
+            self.tr("Select History Entry"),
+            self.tr("Select History &Entry"),
+            0,
+            0,
+            self,
+            "shell_select_history",
+        )
+        self.selectHistoryAct.setStatusTip(
+            self.tr("Select an entry of the shell history")
+        )
         self.selectHistoryAct.triggered.connect(self.__shell.selectHistory)
-    
+
     def __createHelpActions(self):
         """
         Private method to create the Help actions.
         """
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'about_eric')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "about_eric"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.helpActions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'about_qt')
+            self.tr("About Qt"), self.tr("About &Qt"), 0, 0, self, "about_qt"
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.helpActions.append(self.aboutQtAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1", "Help|What's This?'")),
-            0, self, 'help_help_whats_this')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be"""
-            """ accessed using the context help button in the titlebar."""
-            """</p>"""
-        ))
+            0,
+            self,
+            "help_help_whats_this",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be"""
+                """ accessed using the context help button in the titlebar."""
+                """</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.helpActions.append(self.whatsThisAct)
-    
+
     def __showFind(self):
         """
         Private method to display the search widget.
         """
         txt = self.__shell.selectedText()
         self.showFind(txt)
-    
+
     def showFind(self, txt=""):
         """
         Public method to display the search widget.
-        
+
         @param txt text to be shown in the combo
         @type str
         """
         self.__searchWidget.showFind(txt)
-    
+
     def activeWindow(self):
         """
         Public method to get a reference to the active shell.
-        
+
         @return reference to the shell widget
         @rtype Shell
         """
         return self.__shell
-    
+
     def __readSettings(self):
         """
         Private method to read the settings remembered last time.
@@ -1035,7 +1251,7 @@
         size = settings.value("ShellWindow/Size", QSize(800, 600))
         self.resize(size)
         self.move(pos)
-    
+
     def __writeSettings(self):
         """
         Private method to write the settings for reuse.
@@ -1043,13 +1259,13 @@
         settings = Preferences.getSettings()
         settings.setValue("ShellWindow/Position", self.pos())
         settings.setValue("ShellWindow/Size", self.size())
-        
+
     def quit(self):
         """
         Public method to quit the application.
         """
         ericApp().closeAllWindows()
-    
+
     def __newWindow(self):
         """
         Private slot to start a new instance of eric.
@@ -1058,11 +1274,11 @@
         eric7 = os.path.join(getConfig("ericDir"), "eric7_shell.py")
         args = [eric7]
         QProcess.startDetached(program, args)
-    
+
     def __virtualEnvironmentChanged(self, venvName):
         """
         Private slot handling a change of the shell's virtual environment.
-        
+
         @param venvName name of the virtual environment of the shell
         @type str
         """
@@ -1070,65 +1286,66 @@
             self.setWindowTitle(self.tr("eric Shell [{0}]").format(venvName))
         else:
             self.setWindowTitle(self.tr("eric Shell"))
-    
+
     ##################################################################
     ## Below are the action methods for the view menu
     ##################################################################
-    
+
     def __zoomIn(self):
         """
         Private method to handle the zoom in action.
         """
         self.__shell.zoomIn()
         self.__sbZoom.setValue(self.__shell.getZoom())
-        
+
     def __zoomOut(self):
         """
         Private method to handle the zoom out action.
         """
         self.__shell.zoomOut()
         self.__sbZoom.setValue(self.__shell.getZoom())
-        
+
     def __zoomReset(self):
         """
         Private method to reset the zoom factor.
         """
         self.__shell.zoomTo(0)
         self.__sbZoom.setValue(self.__shell.getZoom())
-        
+
     def __zoom(self):
         """
         Private method to handle the zoom action.
         """
         from QScintilla.ZoomDialog import ZoomDialog
+
         dlg = ZoomDialog(self.__shell.getZoom(), self, None, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             value = dlg.getZoomSize()
             self.__zoomTo(value)
-        
+
     def __zoomTo(self, value):
         """
         Private slot to zoom to a given value.
-        
+
         @param value zoom value to be set
         @type int
         """
         self.__shell.zoomTo(value)
         self.__sbZoom.setValue(self.__shell.getZoom())
-        
+
     def __zoomValueChanged(self, value):
         """
         Private slot to handle changes of the zoom value.
-        
+
         @param value new zoom value
         @type int
         """
         self.__sbZoom.setValue(value)
-    
+
     ##################################################################
     ## Below are the action methods for the help menu
     ##################################################################
-    
+
     def __about(self):
         """
         Private slot to show a little About message.
@@ -1139,24 +1356,26 @@
             self.tr(
                 "The eric Shell is a standalone shell window."
                 " It uses the same backend as the debugger of"
-                " the full IDE, but is executed independently."))
-    
+                " the full IDE, but is executed independently."
+            ),
+        )
+
     def __aboutQt(self):
         """
         Private slot to handle the About Qt dialog.
         """
         EricMessageBox.aboutQt(self, "eric Shell Window")
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-    
+
     ##################################################################
     ## Below are the main menu handling methods
     ##################################################################
-    
+
     def __createMenus(self):
         """
         Private method to create the menus of the menu bar.
@@ -1171,7 +1390,7 @@
         self.__fileMenu.addAction(self.saveContentsAct)
         self.__fileMenu.addSeparator()
         self.__fileMenu.addAction(self.exitAct)
-        
+
         self.__editMenu = self.menuBar().addMenu(self.tr("&Edit"))
         self.__editMenu.setTearOffEnabled(True)
         self.__editMenu.addAction(self.cutAct)
@@ -1182,34 +1401,34 @@
         self.__editMenu.addAction(self.searchAct)
         self.__editMenu.addAction(self.searchNextAct)
         self.__editMenu.addAction(self.searchPrevAct)
-        
+
         self.__viewMenu = self.menuBar().addMenu(self.tr("&View"))
         self.__viewMenu.setTearOffEnabled(True)
         self.__viewMenu.addAction(self.zoomInAct)
         self.__viewMenu.addAction(self.zoomOutAct)
         self.__viewMenu.addAction(self.zoomResetAct)
         self.__viewMenu.addAction(self.zoomToAct)
-        
+
         self.__historyMenu = self.menuBar().addMenu(self.tr("Histor&y"))
         self.__historyMenu.setTearOffEnabled(True)
         self.__historyMenu.addAction(self.selectHistoryAct)
         self.__historyMenu.addAction(self.showHistoryAct)
         self.__historyMenu.addAction(self.clearHistoryAct)
         self.__historyMenu.setEnabled(self.__shell.isHistoryEnabled())
-        
+
         self.__startMenu = self.menuBar().addMenu(self.tr("&Start"))
         self.__startMenu.aboutToShow.connect(self.__showStartMenu)
         self.__startMenu.triggered.connect(self.__startShell)
-        
+
         self.menuBar().addSeparator()
-        
+
         self.__helpMenu = self.menuBar().addMenu(self.tr("&Help"))
         self.__helpMenu.setTearOffEnabled(True)
         self.__helpMenu.addAction(self.aboutAct)
         self.__helpMenu.addAction(self.aboutQtAct)
         self.__helpMenu.addSeparator()
         self.__helpMenu.addAction(self.whatsThisAct)
-    
+
     def __showStartMenu(self):
         """
         Private slot to prepare the language menu.
@@ -1217,21 +1436,21 @@
         self.__startMenu.clear()
         for venvName in sorted(self.virtualenvManager.getVirtualenvNames()):
             self.__startMenu.addAction(venvName)
-    
+
     def __startShell(self, action):
         """
         Private slot to start a shell according to the action triggered.
-        
+
         @param action menu action that was triggered (QAction)
         """
         venvName = action.text()
         self.__debugServer.startClient(False, venvName=venvName)
         self.__debugServer.remoteBanner()
-    
+
     ##################################################################
     ## Below are the toolbar handling methods
     ##################################################################
-    
+
     def __createToolBars(self):
         """
         Private method to create the various toolbars.
@@ -1246,41 +1465,41 @@
         filetb.addAction(self.saveContentsAct)
         filetb.addSeparator()
         filetb.addAction(self.exitAct)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setIconSize(UI.Config.ToolBarIconSize)
         edittb.addAction(self.cutAct)
         edittb.addAction(self.copyAct)
         edittb.addAction(self.pasteAct)
         edittb.addAction(self.clearAct)
-        
+
         findtb = self.addToolBar(self.tr("Find"))
         findtb.setIconSize(UI.Config.ToolBarIconSize)
         findtb.addAction(self.searchAct)
         findtb.addAction(self.searchNextAct)
         findtb.addAction(self.searchPrevAct)
-        
+
         viewtb = self.addToolBar(self.tr("View"))
         viewtb.setIconSize(UI.Config.ToolBarIconSize)
         viewtb.addAction(self.zoomInAct)
         viewtb.addAction(self.zoomOutAct)
         viewtb.addAction(self.zoomResetAct)
         viewtb.addAction(self.zoomToAct)
-        
+
         self.__historyToolbar = self.addToolBar(self.tr("History"))
         self.__historyToolbar.setIconSize(UI.Config.ToolBarIconSize)
         self.__historyToolbar.addAction(self.showHistoryAct)
         self.__historyToolbar.addAction(self.clearHistoryAct)
         self.__historyToolbar.setEnabled(self.__shell.isHistoryEnabled())
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-    
+
     ##################################################################
     ## Below are the status bar handling methods
     ##################################################################
-    
+
     def __createStatusBar(self):
         """
         Private slot to set up the status bar.
@@ -1292,19 +1511,20 @@
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
             UI.PixmapCache.getPixmap("zoomReset"),
-            self.__statusBar)
+            self.__statusBar,
+        )
         self.__statusBar.addPermanentWidget(self.__sbZoom)
-        self.__sbZoom.setWhatsThis(self.tr(
-            """<p>This part of the status bar allows zooming the  shell.</p>"""
-        ))
-        
+        self.__sbZoom.setWhatsThis(
+            self.tr("""<p>This part of the status bar allows zooming the  shell.</p>""")
+        )
+
         self.__sbZoom.valueChanged.connect(self.__zoomTo)
         self.__sbZoom.setValue(0)
-    
+
     def __historyStyleChanged(self, historyStyle):
         """
         Private slot to handle a change of the shell history style.
-        
+
         @param historyStyle style to be used for the history
         @type ShellHistoryStyle
         """
--- a/src/eric7/QScintilla/SortOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/SortOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,27 +16,28 @@
     """
     Class implementing a dialog to enter the sort options for a line sort.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the selected options.
-        
+
         @return tuple of three flags indicating ascending order, alphanumeric
             sort and case sensitivity (tuple of three boolean)
         """
         return (
             self.ascendingButton.isChecked(),
             self.alnumButton.isChecked(),
-            self.respectCaseButton.isChecked()
+            self.respectCaseButton.isChecked(),
         )
--- a/src/eric7/QScintilla/SpellChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/SpellChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,15 +25,15 @@
     """
     Class implementing a pyenchant based spell checker.
     """
+
     # class attributes to be used as defaults
     _spelling_lang = None
     _spelling_dict = None
-    
-    def __init__(self, editor, indicator, defaultLanguage=None,
-                 checkRegion=None):
+
+    def __init__(self, editor, indicator, defaultLanguage=None, checkRegion=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor)
         @param indicator spell checking indicator
         @param defaultLanguage the language to be used as the default
@@ -43,7 +43,7 @@
             region
         """
         super().__init__(editor)
-        
+
         self.editor = editor
         self.indicator = indicator
         if defaultLanguage is not None:
@@ -54,55 +54,53 @@
             self.__checkRegion = lambda r: True
         self.minimumWordSize = 3
         self.lastCheckedLine = -1
-        
+
         self.__ignoreWords = []
         self.__replaceWords = {}
-    
+
     @classmethod
     def getAvailableLanguages(cls):
         """
         Class method to get all available languages.
-        
+
         @return list of available languages (list of strings)
         """
         with contextlib.suppress(NameError):
             return enchant.list_languages()
         return []
-    
+
     @classmethod
     def isAvailable(cls):
         """
         Class method to check, if spellchecking is available.
-        
+
         @return flag indicating availability (boolean)
         """
         if Preferences.getEditor("SpellCheckingEnabled"):
             with contextlib.suppress(NameError, AttributeError):
                 return len(enchant.list_languages()) > 0
         return False
-    
+
     @classmethod
     def getDefaultPath(cls, isException=False):
         """
         Class method to get the default path names of the user dictionaries.
-        
+
         @param isException flag indicating to return the name of the default
             exception dictionary (boolean)
         @return file name of the default user dictionary or the default user
             exception dictionary (string)
         """
         if isException:
-            return os.path.join(
-                Utilities.getConfigDir(), "spelling", "pel.dic")
+            return os.path.join(Utilities.getConfigDir(), "spelling", "pel.dic")
         else:
-            return os.path.join(
-                Utilities.getConfigDir(), "spelling", "pwl.dic")
-    
+            return os.path.join(Utilities.getConfigDir(), "spelling", "pwl.dic")
+
     @classmethod
     def getUserDictionaryPath(cls, isException=False):
         """
         Class method to get the path name of a user dictionary file.
-        
+
         @param isException flag indicating to return the name of the user
             exception dictionary (boolean)
         @return file name of the user dictionary or the user exception
@@ -117,12 +115,12 @@
             if not dicFile:
                 dicFile = SpellChecker.getDefaultPath()
         return dicFile
-    
+
     @classmethod
     def _getDict(cls, lang, pwl="", pel=""):
         """
         Protected class method to get a new dictionary.
-        
+
         @param lang the language to be used as the default (string).
             The string should be in language locale format (e.g. en_US, de).
         @param pwl name of the personal/project word list (string)
@@ -134,13 +132,13 @@
             d = os.path.dirname(pwl)
             if not os.path.exists(d):
                 os.makedirs(d)
-        
+
         if not pel:
             pel = SpellChecker.getUserDictionaryPath(False)
             d = os.path.dirname(pel)
             if not os.path.exists(d):
                 os.makedirs(d)
-        
+
         try:
             d = enchant.DictWithPWL(lang, pwl, pel)
         except Exception:
@@ -148,53 +146,52 @@
             # can't catch the enchant.DictNotFound error.
             d = None
         return d
-    
+
     @classmethod
     def setDefaultLanguage(cls, language):
         """
         Class method to set the default language.
-        
+
         @param language the language to be used as the default (string).
             The string should be in language locale format (e.g. en_US, de).
         """
         cls._spelling_lang = language
         cls._spelling_dict = cls._getDict(language)
-    
+
     def setLanguage(self, language, pwl="", pel=""):
         """
         Public method to set the current language.
-        
+
         @param language the language to be used as the default (string).
             The string should be in language locale format (e.g. en_US, de).
         @param pwl name of the personal/project word list (string)
         @param pel name of the personal/project exclude list (string)
         """
         self._spelling_lang = language
-        self._spelling_dict = self._getDict(language, pwl=pwl,
-                                            pel=pel)
-    
+        self._spelling_dict = self._getDict(language, pwl=pwl, pel=pel)
+
     def getLanguage(self):
         """
         Public method to get the current language.
-        
+
         @return current language in language locale format (string)
         """
         return self._spelling_lang
-    
+
     def setMinimumWordSize(self, size):
         """
         Public method to set the minimum word size.
-        
+
         @param size minimum word size (integer)
         """
         if size > 0:
             self.minimumWordSize = size
-    
+
     def __getNextWord(self, pos, endPosition):
         """
         Private method to get the next word in the text after the given
         position.
-        
+
         @param pos position to start word extraction (integer)
         @param endPosition position to stop word extraction (integer)
         @return tuple of three values (the extracted word (string),
@@ -202,7 +199,7 @@
         """
         if pos < 0 or pos >= endPosition:
             return "", -1, -1
-        
+
         ch = self.editor.charAt(pos)
         # 1. skip non-word characters
         while pos < endPosition and not ch.isalnum():
@@ -211,7 +208,7 @@
         if pos == endPosition:
             return "", -1, -1
         startPos = pos
-        
+
         # 2. extract the word
         word = ""
         while pos < endPosition and ch.isalnum():
@@ -223,11 +220,11 @@
             return self.__getNextWord(endPos, endPosition)
         else:
             return word, startPos, endPos
-    
+
     def getContext(self, wordStart, wordEnd):
         """
         Public method to get the context of a faulty word.
-        
+
         @param wordStart the starting position of the word (integer)
         @param wordEnd the ending position of the word (integer)
         @return tuple of the leading and trailing context (string, string)
@@ -236,80 +233,79 @@
         eline, eindex = self.editor.lineIndexFromPosition(wordEnd)
         text = self.editor.text(sline)
         return (text[:sindex], text[eindex:])
-    
+
     def getError(self):
         """
         Public method to get information about the last error found.
-        
+
         @return tuple of last faulty word (string), starting position of the
             faulty word (integer) and ending position of the faulty word
             (integer)
         """
         return (self.word, self.wordStart, self.wordEnd)
-    
+
     def initCheck(self, startPos, endPos):
         """
         Public method to initialize a spell check.
-        
+
         @param startPos position to start at (integer)
         @param endPos position to end at (integer)
         @return flag indicating successful initialization (boolean)
         """
         if startPos == endPos:
             return False
-        
+
         spell = self._spelling_dict
         if spell is None:
             return False
-        
-        self.editor.clearIndicatorRange(
-            self.indicator, startPos, endPos - startPos)
-        
+
+        self.editor.clearIndicatorRange(self.indicator, startPos, endPos - startPos)
+
         self.pos = startPos
         self.endPos = endPos
         self.word = ""
         self.wordStart = -1
         self.wordEnd = -1
         return True
-    
+
     def __checkDocumentPart(self, startPos, endPos):
         """
         Private method to check some part of the document.
-        
+
         @param startPos position to start at (integer)
         @param endPos position to end at (integer)
         """
         if not self.initCheck(startPos, endPos):
             return
-        
+
         while True:
             try:
                 next(self)
-                self.editor.setIndicatorRange(self.indicator, self.wordStart,
-                                              self.wordEnd - self.wordStart)
+                self.editor.setIndicatorRange(
+                    self.indicator, self.wordStart, self.wordEnd - self.wordStart
+                )
             except StopIteration:
                 break
-    
+
     def __incrementalCheck(self):
         """
         Private method to check the document incrementally.
         """
         if self.lastCheckedLine < 0:
             return
-        
+
         linesChunk = Preferences.getEditor("AutoSpellCheckChunkSize")
-        self.checkLines(self.lastCheckedLine,
-                        self.lastCheckedLine + linesChunk)
+        self.checkLines(self.lastCheckedLine, self.lastCheckedLine + linesChunk)
         self.lastCheckedLine = self.lastCheckedLine + linesChunk + 1
         if self.lastCheckedLine >= self.editor.lines():
             self.lastCheckedLine = -1
         else:
             QTimer.singleShot(0, self.__incrementalCheck)
-    
+
     def checkWord(self, pos, atEnd=False):
         """
         Public method to check the word at position pos.
-        
+
         @param pos position to check at (integer)
         @param atEnd flag indicating the position is at the end of the word
             to check (boolean)
@@ -317,20 +313,19 @@
         spell = self._spelling_dict
         if spell is None:
             return
-        
+
         if atEnd:
             pos = self.editor.positionBefore(pos)
-        
+
         if pos >= 0 and self.__checkRegion(pos):
             pos0 = pos
-            pos1 = 0xffffffff
+            pos1 = 0xFFFFFFFF
             if not self.editor.charAt(pos).isalnum():
                 line, index = self.editor.lineIndexFromPosition(pos)
-                self.editor.clearIndicator(
-                    self.indicator, line, index, line, index + 1)
+                self.editor.clearIndicator(self.indicator, line, index, line, index + 1)
                 pos1 = self.editor.positionAfter(pos)
                 pos0 = self.editor.positionBefore(pos)
-            
+
             for pos in [pos0, pos1]:
                 if self.editor.charAt(pos).isalnum():
                     line, index = self.editor.lineIndexFromPosition(pos)
@@ -343,36 +338,37 @@
                     else:
                         ok = True
                     start, end = self.editor.getWordBoundaries(
-                        line, index, useWordChars=False)
+                        line, index, useWordChars=False
+                    )
                     if ok:
                         self.editor.clearIndicator(
-                            self.indicator, line, start, line, end)
+                            self.indicator, line, start, line, end
+                        )
                     else:
                         # spell check indicated an error
-                        self.editor.setIndicator(
-                            self.indicator, line, start, line, end)
-    
+                        self.editor.setIndicator(self.indicator, line, start, line, end)
+
     def checkLines(self, firstLine, lastLine):
         """
         Public method to check some lines of text.
-        
+
         @param firstLine line number of first line to check (integer)
         @param lastLine line number of last line to check (integer)
         """
         startPos = self.editor.positionFromLineIndex(firstLine, 0)
-        
+
         if lastLine >= self.editor.lines():
             lastLine = self.editor.lines() - 1
         endPos = self.editor.lineEndPosition(lastLine)
-        
+
         self.__checkDocumentPart(startPos, endPos)
-    
+
     def checkDocument(self):
         """
         Public method to check the complete document.
         """
         self.__checkDocumentPart(0, self.editor.length())
-    
+
     def checkDocumentIncrementally(self):
         """
         Public method to check the document incrementally.
@@ -380,29 +376,32 @@
         spell = self._spelling_dict
         if spell is None:
             return
-        
+
         if Preferences.getEditor("AutoSpellCheckingEnabled"):
             self.lastCheckedLine = 0
             QTimer.singleShot(0, self.__incrementalCheck)
-    
+
     def stopIncrementalCheck(self):
         """
         Public method to stop an incremental check.
         """
         self.lastCheckedLine = -1
-    
+
     def checkSelection(self):
         """
         Public method to check the current selection.
         """
-        selStartLine, selStartIndex, selEndLine, selEndIndex = (
-            self.editor.getSelection()
-        )
+        (
+            selStartLine,
+            selStartIndex,
+            selEndLine,
+            selEndIndex,
+        ) = self.editor.getSelection()
         self.__checkDocumentPart(
             self.editor.positionFromLineIndex(selStartLine, selStartIndex),
-            self.editor.positionFromLineIndex(selEndLine, selEndIndex)
+            self.editor.positionFromLineIndex(selEndLine, selEndIndex),
         )
-    
+
     def checkCurrentPage(self):
         """
         Public method to check the currently visible page.
@@ -410,18 +409,17 @@
         startLine = self.editor.firstVisibleLine()
         endLine = startLine + self.editor.linesOnScreen()
         self.checkLines(startLine, endLine)
-    
+
     def clearAll(self):
         """
         Public method to clear all spelling markers.
         """
-        self.editor.clearIndicatorRange(
-            self.indicator, 0, self.editor.length())
-    
+        self.editor.clearIndicatorRange(self.indicator, 0, self.editor.length())
+
     def getSuggestions(self, word):
         """
         Public method to get suggestions for the given word.
-        
+
         @param word word to get suggestions for (string)
         @return list of suggestions (list of strings)
         """
@@ -431,11 +429,11 @@
             with contextlib.suppress(enchant.errors.Error):
                 suggestions = spell.suggest(word)
         return suggestions
-    
+
     def add(self, word=None):
         """
         Public method to add a word to the personal word list.
-        
+
         @param word word to add (string)
         """
         spell = self._spelling_dict
@@ -443,34 +441,34 @@
             if word is None:
                 word = self.word
             spell.add(word)
-    
+
     def remove(self, word):
         """
         Public method to add a word to the personal exclude list.
-        
+
         @param word word to add (string)
         """
         spell = self._spelling_dict
         if spell:
             spell.remove(word)
-    
+
     def ignoreAlways(self, word=None):
         """
         Public method to tell the checker, to always ignore the given word
         or the current word.
-        
+
         @param word word to be ignored (string)
         """
         if word is None:
             word = self.word
         if word not in self.__ignoreWords:
             self.__ignoreWords.append(word)
-    
+
     def replace(self, replacement):
         """
         Public method to tell the checker to replace the current word with
         the replacement string.
-        
+
         @param replacement replacement string (string)
         """
         sline, sindex = self.editor.lineIndexFromPosition(self.wordStart)
@@ -481,45 +479,43 @@
         self.editor.insert(replacement)
         self.editor.endUndoAction()
         self.pos += len(replacement) - len(self.word)
-    
+
     def replaceAlways(self, replacement):
         """
         Public method to tell the checker to always replace the current word
         with the replacement string.
-        
+
         @param replacement replacement string (string)
         """
         self.__replaceWords[self.word] = replacement
         self.replace(replacement)
-    
+
     ##################################################################
     ## Methods below implement the iterator protocol
     ##################################################################
-    
+
     def __iter__(self):
         """
         Special method to create an iterator.
-        
+
         @return self
         """
         return self
-    
+
     def __next__(self):
         """
         Special method to advance to the next error.
-        
+
         @return self
         @exception StopIteration raised to indicate the end of the iteration
         """
         spell = self._spelling_dict
         if spell:
             while self.pos < self.endPos and self.pos >= 0:
-                word, wordStart, wordEnd = self.__getNextWord(
-                    self.pos, self.endPos)
+                word, wordStart, wordEnd = self.__getNextWord(self.pos, self.endPos)
                 self.pos = wordEnd
-                if (
-                    (wordEnd - wordStart) >= self.minimumWordSize and
-                    self.__checkRegion(wordStart)
+                if (wordEnd - wordStart) >= self.minimumWordSize and self.__checkRegion(
+                    wordStart
                 ):
                     with contextlib.suppress(enchant.errors.Error):
                         if spell.check(word):
@@ -533,5 +529,5 @@
                         self.replace(self.__replaceWords[word])
                         continue
                     return self
-        
+
         raise StopIteration
--- a/src/eric7/QScintilla/SpellCheckingDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/SpellCheckingDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing the spell checking dialog.
     """
+
     def __init__(self, spellChecker, startPos, endPos, parent=None):
         """
         Constructor
-        
+
         @param spellChecker reference to the spell checker (SpellChecker)
         @param startPos position to start spell checking (integer)
         @param endPos end position for spell checking (integer)
@@ -30,19 +31,18 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__spell = spellChecker
-        self.languageLabel.setText(
-            "<b>{0}</b>".format(self.__spell.getLanguage()))
+        self.languageLabel.setText("<b>{0}</b>".format(self.__spell.getLanguage()))
         if not self.__spell.initCheck(startPos, endPos):
             self.__enableButtons(False)
         else:
             self.__advance()
-    
+
     def __enableButtons(self, enable):
         """
         Private method to set the buttons enabled state.
-        
+
         @param enable enable state (boolean)
         """
         self.addButton.setEnabled(enable)
@@ -50,7 +50,7 @@
         self.ignoreAllButton.setEnabled(enable)
         self.replaceButton.setEnabled(enable)
         self.replaceAllButton.setEnabled(enable)
-    
+
     def __advance(self):
         """
         Private method to advance to the next error.
@@ -63,48 +63,49 @@
             self.changeEdit.setText("")
             self.suggestionsList.clear()
             return
-        
+
         self.__enableButtons(True)
         self.word, self.wordStart, self.wordEnd = self.__spell.getError()
-        lcontext, rcontext = self.__spell.getContext(
-            self.wordStart, self.wordEnd)
+        lcontext, rcontext = self.__spell.getContext(self.wordStart, self.wordEnd)
         self.changeEdit.setText(self.word)
         self.contextLabel.setText(
             '{0}<font color="#FF0000">{1}</font>{2}'.format(
                 Utilities.html_encode(lcontext),
                 self.word,
-                Utilities.html_encode(rcontext)))
+                Utilities.html_encode(rcontext),
+            )
+        )
         suggestions = self.__spell.getSuggestions(self.word)
         self.suggestionsList.clear()
         self.suggestionsList.addItems(suggestions)
-    
+
     @pyqtSlot(str)
     def on_changeEdit_textChanged(self, text):
         """
         Private method to handle a change of the replacement text.
-        
+
         @param text contents of the line edit (string)
         """
         self.replaceButton.setEnabled(text != "")
         self.replaceAllButton.setEnabled(text != "")
-    
+
     @pyqtSlot(str)
     def on_suggestionsList_currentTextChanged(self, currentText):
         """
         Private method to handle the selection of a suggestion.
-        
+
         @param currentText the currently selected text (string)
         """
         if currentText:
             self.changeEdit.setText(currentText)
-    
+
     @pyqtSlot()
     def on_ignoreButton_clicked(self):
         """
         Private slot to ignore the found error.
         """
         self.__advance()
-    
+
     @pyqtSlot()
     def on_ignoreAllButton_clicked(self):
         """
@@ -112,7 +113,7 @@
         """
         self.__spell.ignoreAlways()
         self.__advance()
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -120,7 +121,7 @@
         """
         self.__spell.add()
         self.__advance()
-    
+
     @pyqtSlot()
     def on_replaceButton_clicked(self):
         """
@@ -128,7 +129,7 @@
         """
         self.__spell.replace(self.changeEdit.text())
         self.__advance()
-    
+
     @pyqtSlot()
     def on_replaceAllButton_clicked(self):
         """
--- a/src/eric7/QScintilla/SpellingDictionaryEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/SpellingDictionaryEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,51 +20,52 @@
     Class implementing a dialog to edit the various spell checking
     dictionaries.
     """
+
     def __init__(self, data, info, parent=None):
         """
         Constructor
-        
+
         @param data contents to be edited (string)
         @param info info string to show at the header (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.infoLabel.setText(info)
-        
+
         self.__model = QStringListModel(
-            [line.strip() for line in data.splitlines() if line.strip()],
-            self)
+            [line.strip() for line in data.splitlines() if line.strip()], self
+        )
         self.__model.sort(0)
         self.__proxyModel = QSortFilterProxyModel(self)
-        self.__proxyModel.setFilterCaseSensitivity(
-            Qt.CaseSensitivity.CaseInsensitive)
+        self.__proxyModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
         self.__proxyModel.setDynamicSortFilter(True)
         self.__proxyModel.setSourceModel(self.__model)
         self.wordList.setModel(self.__proxyModel)
-        
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
-        
+
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
+
         self.removeButton.clicked.connect(self.wordList.removeSelected)
         self.removeAllButton.clicked.connect(self.wordList.removeAll)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to handle adding an entry.
         """
         self.__model.insertRow(self.__model.rowCount())
-        self.wordList.edit(
-            self.__proxyModel.index(self.__model.rowCount() - 1, 0))
-    
+        self.wordList.edit(self.__proxyModel.index(self.__model.rowCount() - 1, 0))
+
     def getData(self):
         """
         Public method to get the data.
-        
+
         @return data of the dialog (string)
         """
-        return os.linesep.join(
-            [line.strip() for line in self.__model.stringList()
-             if line.strip()]) + os.linesep
+        return (
+            os.linesep.join(
+                [line.strip() for line in self.__model.stringList() if line.strip()]
+            )
+            + os.linesep
+        )
--- a/src/eric7/QScintilla/TypingCompleters/CompleterBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/TypingCompleters/CompleterBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,26 +18,27 @@
     """
     Class implementing the base class for all completers.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor)
         @param parent reference to the parent object (QObject)
             If parent is None, we set the editor as the parent.
         """
         if parent is None:
             parent = editor
-        
+
         super().__init__(parent)
-        
+
         self.editor = editor
         self.enabled = False
-    
+
     def setEnabled(self, enable):
         """
         Public slot to set the enabled state.
-        
+
         @param enable flag indicating the new enabled state (boolean)
         """
         if enable:
@@ -47,34 +48,34 @@
             if self.enabled:
                 self.editor.SCN_CHARADDED.disconnect(self.charAdded)
         self.enabled = enable
-    
+
     def isEnabled(self):
         """
         Public method to get the enabled state.
-        
+
         @return enabled state (boolean)
         """
         return self.enabled
-    
+
     def charAdded(self, charNumber):
         """
         Public slot called to handle the user entering a character.
-        
+
         Note 1: this slot must be overridden by subclasses implementing the
         specific behavior for the language.
-        
+
         Note 2: charNumber can be greater than 255 because the editor is
         in UTF-8 mode by default.
-        
+
         @param charNumber value of the character entered (integer)
         """
-        pass    # just do nothing
-    
+        pass  # just do nothing
+
     def readSettings(self):
         """
         Public slot called to reread the configuration parameters.
-        
+
         Note: this slot should be overridden by subclasses having
         configurable parameters.
         """
-        pass    # just do nothing
+        pass  # just do nothing
--- a/src/eric7/QScintilla/TypingCompleters/CompleterPython.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/TypingCompleters/CompleterPython.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,144 +21,130 @@
     """
     Class implementing typing completer for Python.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(editor, parent)
-        
-        self.__defRX = re.compile(
-            r"^[ \t]*(def|cdef|cpdef) \w+\(")
+
+        self.__defRX = re.compile(r"^[ \t]*(def|cdef|cpdef) \w+\(")
         self.__defSelfRX = re.compile(
-            r"^[ \t]*(def|cdef|cpdef) \w+\([ \t]*self[ \t]*[,)]")
+            r"^[ \t]*(def|cdef|cpdef) \w+\([ \t]*self[ \t]*[,)]"
+        )
         self.__defClsRX = re.compile(
-            r"^[ \t]*(def|cdef|cpdef) \w+\([ \t]*cls[ \t]*[,)]")
-        self.__classRX = re.compile(
-            r"^[ \t]*(cdef[ \t]+)?class \w+\(")
+            r"^[ \t]*(def|cdef|cpdef) \w+\([ \t]*cls[ \t]*[,)]"
+        )
+        self.__classRX = re.compile(r"^[ \t]*(cdef[ \t]+)?class \w+\(")
         self.__importRX = re.compile(r"^[ \t]*from [\w.]+ ")
         self.__classmethodRX = re.compile(r"^[ \t]*@classmethod")
         self.__staticmethodRX = re.compile(r"^[ \t]*@staticmethod")
-        
+
         self.__defOnlyRX = re.compile(r"^[ \t]*def ")
-        
+
         self.__ifRX = re.compile(r"^[ \t]*if ")
         self.__elifRX = re.compile(r"^[ \t]*elif ")
         self.__elseRX = re.compile(r"^[ \t]*else:")
-        
+
         self.__tryRX = re.compile(r"^[ \t]*try:")
         self.__finallyRX = re.compile(r"^[ \t]*finally:")
         self.__exceptRX = re.compile(r"^[ \t]*except ")
         self.__exceptcRX = re.compile(r"^[ \t]*except:")
-        
+
         self.__whileRX = re.compile(r"^[ \t]*while ")
         self.__forRX = re.compile(r"^[ \t]*for ")
-        
+
         self.readSettings()
-    
+
     def readSettings(self):
         """
         Public slot called to reread the configuration parameters.
         """
-        self.setEnabled(
-            Preferences.getEditorTyping("Python/EnabledTypingAids"))
+        self.setEnabled(Preferences.getEditorTyping("Python/EnabledTypingAids"))
         self.__insertClosingBrace = Preferences.getEditorTyping(
-            "Python/InsertClosingBrace")
-        self.__indentBrace = Preferences.getEditorTyping(
-            "Python/IndentBrace")
-        self.__skipBrace = Preferences.getEditorTyping(
-            "Python/SkipBrace")
-        self.__insertQuote = Preferences.getEditorTyping(
-            "Python/InsertQuote")
-        self.__dedentElse = Preferences.getEditorTyping(
-            "Python/DedentElse")
-        self.__dedentExcept = Preferences.getEditorTyping(
-            "Python/DedentExcept")
-        self.__insertImport = Preferences.getEditorTyping(
-            "Python/InsertImport")
-        self.__importBraceType = Preferences.getEditorTyping(
-            "Python/ImportBraceType")
-        self.__insertSelf = Preferences.getEditorTyping(
-            "Python/InsertSelf")
-        self.__insertBlank = Preferences.getEditorTyping(
-            "Python/InsertBlank")
-        self.__colonDetection = Preferences.getEditorTyping(
-            "Python/ColonDetection")
-        self.__dedentDef = Preferences.getEditorTyping(
-            "Python/DedentDef")
+            "Python/InsertClosingBrace"
+        )
+        self.__indentBrace = Preferences.getEditorTyping("Python/IndentBrace")
+        self.__skipBrace = Preferences.getEditorTyping("Python/SkipBrace")
+        self.__insertQuote = Preferences.getEditorTyping("Python/InsertQuote")
+        self.__dedentElse = Preferences.getEditorTyping("Python/DedentElse")
+        self.__dedentExcept = Preferences.getEditorTyping("Python/DedentExcept")
+        self.__insertImport = Preferences.getEditorTyping("Python/InsertImport")
+        self.__importBraceType = Preferences.getEditorTyping("Python/ImportBraceType")
+        self.__insertSelf = Preferences.getEditorTyping("Python/InsertSelf")
+        self.__insertBlank = Preferences.getEditorTyping("Python/InsertBlank")
+        self.__colonDetection = Preferences.getEditorTyping("Python/ColonDetection")
+        self.__dedentDef = Preferences.getEditorTyping("Python/DedentDef")
 
     def charAdded(self, charNumber):
         """
         Public slot called to handle the user entering a character.
-        
+
         @param charNumber value of the character entered (integer)
         """
         char = chr(charNumber)
-        if char not in ['(', ')', '{', '}', '[', ']', ' ', ',', "'", '"',
-                        '\n', ':']:
+        if char not in ["(", ")", "{", "}", "[", "]", " ", ",", "'", '"', "\n", ":"]:
             return  # take the short route
-        
+
         line, col = self.editor.getCursorPosition()
-        
+
         if (
-            self.__inComment(line, col) or
-            (char != '"' and self.__inDoubleQuotedString()) or
-            (char != '"' and self.__inTripleDoubleQuotedString()) or
-            (char != "'" and self.__inSingleQuotedString()) or
-            (char != "'" and self.__inTripleSingleQuotedString())
+            self.__inComment(line, col)
+            or (char != '"' and self.__inDoubleQuotedString())
+            or (char != '"' and self.__inTripleDoubleQuotedString())
+            or (char != "'" and self.__inSingleQuotedString())
+            or (char != "'" and self.__inTripleSingleQuotedString())
         ):
             return
-        
+
         # open parenthesis
         # insert closing parenthesis and self
-        if char == '(':
+        if char == "(":
             txt = self.editor.text(line)[:col]
             self.editor.beginUndoAction()
-            if (
-                self.__insertSelf and
-                self.__defRX.fullmatch(txt) is not None
-            ):
+            if self.__insertSelf and self.__defRX.fullmatch(txt) is not None:
                 if self.__isClassMethodDef():
-                    self.editor.insert('cls')
+                    self.editor.insert("cls")
                     self.editor.setCursorPosition(line, col + 3)
                 elif self.__isStaticMethodDef():
                     # nothing to insert
                     pass
                 elif self.__isClassMethod():
-                    self.editor.insert('self')
+                    self.editor.insert("self")
                     self.editor.setCursorPosition(line, col + 4)
             if self.__insertClosingBrace:
                 if (
-                    self.__defRX.fullmatch(txt) is not None or
-                    self.__classRX.fullmatch(txt) is not None
+                    self.__defRX.fullmatch(txt) is not None
+                    or self.__classRX.fullmatch(txt) is not None
                 ):
-                    self.editor.insert('):')
+                    self.editor.insert("):")
                 else:
-                    self.editor.insert(')')
+                    self.editor.insert(")")
             self.editor.endUndoAction()
-        
+
         # closing parenthesis
         # skip matching closing parenthesis
-        elif char in [')', '}', ']']:
+        elif char in [")", "}", "]"]:
             txt = self.editor.text(line)
             if col < len(txt) and char == txt[col] and self.__skipBrace:
                 self.editor.setSelection(line, col, line, col + 1)
                 self.editor.removeSelectedText()
-        
+
         # space
         # insert import, dedent to if for elif, dedent to try for except,
         # dedent def
-        elif char == ' ':
+        elif char == " ":
             txt = self.editor.text(line)[:col]
             if self.__insertImport and self.__importRX.fullmatch(txt):
                 self.editor.beginUndoAction()
                 if self.__importBraceType:
-                    self.editor.insert('import ()')
+                    self.editor.insert("import ()")
                     self.editor.setCursorPosition(line, col + 8)
                 else:
-                    self.editor.insert('import ')
+                    self.editor.insert("import ")
                     self.editor.setCursorPosition(line, col + 7)
                 self.editor.endUndoAction()
             elif self.__dedentElse and self.__elifRX.fullmatch(txt):
@@ -167,36 +153,36 @@
                 self.__dedentExceptToTry(False)
             elif self.__dedentDef and self.__defOnlyRX.fullmatch(txt):
                 self.__dedentDefStatement()
-        
+
         # comma
         # insert blank
-        elif char == ',' and self.__insertBlank:
-            self.editor.insert(' ')
+        elif char == "," and self.__insertBlank:
+            self.editor.insert(" ")
             self.editor.setCursorPosition(line, col + 1)
-        
+
         # open curly brace
         # insert closing brace
-        elif char == '{' and self.__insertClosingBrace:
-            self.editor.insert('}')
-        
+        elif char == "{" and self.__insertClosingBrace:
+            self.editor.insert("}")
+
         # open bracket
         # insert closing bracket
-        elif char == '[' and self.__insertClosingBrace:
-            self.editor.insert(']')
-        
+        elif char == "[" and self.__insertClosingBrace:
+            self.editor.insert("]")
+
         # double quote
         # insert double quote
         elif char == '"' and self.__insertQuote:
             self.editor.insert('"')
-        
+
         # quote
         # insert quote
-        elif char == '\'' and self.__insertQuote:
-            self.editor.insert('\'')
-        
+        elif char == "'" and self.__insertQuote:
+            self.editor.insert("'")
+
         # colon
         # skip colon, dedent to if for else:
-        elif char == ':':
+        elif char == ":":
             text = self.editor.text(line)
             if col < len(text) and char == text[col]:
                 if self.__colonDetection:
@@ -210,10 +196,10 @@
                     self.__dedentExceptToTry(True)
                 elif self.__dedentExcept and self.__finallyRX.fullmatch(txt):
                     self.__dedentFinallyToTry()
-        
+
         # new line
         # indent to opening brace
-        elif char == '\n' and self.__indentBrace:
+        elif char == "\n" and self.__indentBrace:
             txt = self.editor.text(line - 1)
             if re.search(":\r?\n", txt) is None:
                 self.editor.beginUndoAction()
@@ -238,12 +224,10 @@
                             closeCount = len(re.findall(r"[)}\]]", txt2))
                             index -= 1
                         if openCount > closeCount and lastOpenIndex > col:
-                            self.editor.insert(
-                                ' ' * (lastOpenIndex - col + 1))
-                            self.editor.setCursorPosition(
-                                line, lastOpenIndex + 1)
+                            self.editor.insert(" " * (lastOpenIndex - col + 1))
+                            self.editor.setCursorPosition(line, lastOpenIndex + 1)
                 self.editor.endUndoAction()
-   
+
     def __dedentToIf(self):
         """
         Private method to dedent the last line to the last if statement with
@@ -257,13 +241,14 @@
             edInd = self.editor.indentation(ifLine)
             if rxIndex(self.__elseRX, txt) == 0 and edInd <= indentation:
                 indentation = edInd - 1
-            elif (rxIndex(self.__ifRX, txt) == 0 or
-                  rxIndex(self.__elifRX, txt) == 0) and edInd <= indentation:
+            elif (
+                rxIndex(self.__ifRX, txt) == 0 or rxIndex(self.__elifRX, txt) == 0
+            ) and edInd <= indentation:
                 self.editor.cancelList()
                 self.editor.setIndentation(line, edInd)
                 break
             ifLine -= 1
-    
+
     def __dedentElseToIfWhileForTry(self):
         """
         Private method to dedent the line of the else statement to the last
@@ -277,31 +262,28 @@
         while ifLine >= 0:
             txt = self.editor.text(ifLine)
             edInd = self.editor.indentation(ifLine)
-            if (
-                (rxIndex(self.__elseRX, txt) == 0 and
-                 edInd <= indentation) or
-                (rxIndex(self.__elifRX, txt) == 0 and
-                 edInd == indentation and
-                 edInd == prevInd)
+            if (rxIndex(self.__elseRX, txt) == 0 and edInd <= indentation) or (
+                rxIndex(self.__elifRX, txt) == 0
+                and edInd == indentation
+                and edInd == prevInd
             ):
                 indentation = edInd - 1
             elif (
-                (rxIndex(self.__ifRX, txt) == 0 or
-                 rxIndex(self.__whileRX, txt) == 0 or
-                 rxIndex(self.__forRX, txt) == 0 or
-                 rxIndex(self.__tryRX, txt) == 0) and
-                edInd <= indentation
-            ):
+                rxIndex(self.__ifRX, txt) == 0
+                or rxIndex(self.__whileRX, txt) == 0
+                or rxIndex(self.__forRX, txt) == 0
+                or rxIndex(self.__tryRX, txt) == 0
+            ) and edInd <= indentation:
                 self.editor.cancelList()
                 self.editor.setIndentation(line, edInd)
                 break
             ifLine -= 1
-    
+
     def __dedentExceptToTry(self, hasColon):
         """
         Private method to dedent the line of the except statement to the last
         try statement with less (or equal) indentation.
-        
+
         @param hasColon flag indicating the except type (boolean)
         """
         line, col = self.editor.getCursorPosition()
@@ -311,18 +293,18 @@
             txt = self.editor.text(tryLine)
             edInd = self.editor.indentation(tryLine)
             if (
-                (rxIndex(self.__exceptcRX, txt) == 0 or
-                 rxIndex(self.__finallyRX, txt) == 0) and
-                edInd <= indentation
-            ):
+                rxIndex(self.__exceptcRX, txt) == 0
+                or rxIndex(self.__finallyRX, txt) == 0
+            ) and edInd <= indentation:
                 indentation = edInd - 1
-            elif (rxIndex(self.__exceptRX, txt) == 0 or
-                  rxIndex(self.__tryRX, txt) == 0) and edInd <= indentation:
+            elif (
+                rxIndex(self.__exceptRX, txt) == 0 or rxIndex(self.__tryRX, txt) == 0
+            ) and edInd <= indentation:
                 self.editor.cancelList()
                 self.editor.setIndentation(line, edInd)
                 break
             tryLine -= 1
-    
+
     def __dedentFinallyToTry(self):
         """
         Private method to dedent the line of the except statement to the last
@@ -337,16 +319,15 @@
             if rxIndex(self.__finallyRX, txt) == 0 and edInd <= indentation:
                 indentation = edInd - 1
             elif (
-                (rxIndex(self.__tryRX, txt) == 0 or
-                 rxIndex(self.__exceptcRX, txt) == 0 or
-                 rxIndex(self.__exceptRX, txt) == 0) and
-                edInd <= indentation
-            ):
+                rxIndex(self.__tryRX, txt) == 0
+                or rxIndex(self.__exceptcRX, txt) == 0
+                or rxIndex(self.__exceptRX, txt) == 0
+            ) and edInd <= indentation:
                 self.editor.cancelList()
                 self.editor.setIndentation(line, edInd)
                 break
             tryLine -= 1
-    
+
     def __dedentDefStatement(self):
         """
         Private method to dedent the line of the def statement to a previous
@@ -370,11 +351,11 @@
                 self.editor.setIndentation(line, newInd)
                 break
             tryLine -= 1
-    
+
     def __isClassMethod(self):
         """
         Private method to check, if the user is defining a class method.
-        
+
         @return flag indicating the definition of a class method (boolean)
         """
         line, col = self.editor.getCursorPosition()
@@ -383,59 +364,62 @@
         while curLine >= 0:
             txt = self.editor.text(curLine)
             if (
-                ((rxIndex(self.__defSelfRX, txt) == 0 or
-                  rxIndex(self.__defClsRX, txt) == 0) and
-                 self.editor.indentation(curLine) == indentation) or
-                (rxIndex(self.__classRX, txt) == 0 and
-                 self.editor.indentation(curLine) < indentation)
+                (
+                    rxIndex(self.__defSelfRX, txt) == 0
+                    or rxIndex(self.__defClsRX, txt) == 0
+                )
+                and self.editor.indentation(curLine) == indentation
+            ) or (
+                rxIndex(self.__classRX, txt) == 0
+                and self.editor.indentation(curLine) < indentation
             ):
                 return True
             elif (
-                rxIndex(self.__defRX, txt) == 0 and
-                self.editor.indentation(curLine) <= indentation
+                rxIndex(self.__defRX, txt) == 0
+                and self.editor.indentation(curLine) <= indentation
             ):
                 return False
             curLine -= 1
         return False
-    
+
     def __isClassMethodDef(self):
         """
         Private method to check, if the user is defing a class method
         (@classmethod).
-        
+
         @return flag indicating the definition of a class method (boolean)
         """
         line, col = self.editor.getCursorPosition()
         indentation = self.editor.indentation(line)
         curLine = line - 1
         if (
-            rxIndex(self.__classmethodRX, self.editor.text(curLine)) == 0 and
-            self.editor.indentation(curLine) == indentation
+            rxIndex(self.__classmethodRX, self.editor.text(curLine)) == 0
+            and self.editor.indentation(curLine) == indentation
         ):
             return True
         return False
-    
+
     def __isStaticMethodDef(self):
         """
         Private method to check, if the user is defing a static method
         (@staticmethod) method.
-        
+
         @return flag indicating the definition of a static method (boolean)
         """
         line, col = self.editor.getCursorPosition()
         indentation = self.editor.indentation(line)
         curLine = line - 1
         if (
-            rxIndex(self.__staticmethodRX, self.editor.text(curLine)) == 0 and
-            self.editor.indentation(curLine) == indentation
+            rxIndex(self.__staticmethodRX, self.editor.text(curLine)) == 0
+            and self.editor.indentation(curLine) == indentation
         ):
             return True
         return False
-    
+
     def __inComment(self, line, col):
         """
         Private method to check, if the cursor is inside a comment.
-        
+
         @param line current line (integer)
         @param col current position within line (integer)
         @return flag indicating, if the cursor is inside a comment (boolean)
@@ -448,49 +432,43 @@
                 return True
             col -= 1
         return False
-    
+
     def __inDoubleQuotedString(self):
         """
         Private method to check, if the cursor is within a double quoted
         string.
-        
+
         @return flag indicating, if the cursor is inside a double
             quoted string (boolean)
         """
         return self.editor.currentStyle() == QsciLexerPython.DoubleQuotedString
-    
+
     def __inTripleDoubleQuotedString(self):
         """
         Private method to check, if the cursor is within a triple double
         quoted string.
-        
+
         @return flag indicating, if the cursor is inside a triple double
             quoted string (boolean)
         """
-        return (
-            self.editor.currentStyle() ==
-            QsciLexerPython.TripleDoubleQuotedString
-        )
-    
+        return self.editor.currentStyle() == QsciLexerPython.TripleDoubleQuotedString
+
     def __inSingleQuotedString(self):
         """
         Private method to check, if the cursor is within a single quoted
         string.
-        
+
         @return flag indicating, if the cursor is inside a single
             quoted string (boolean)
         """
         return self.editor.currentStyle() == QsciLexerPython.SingleQuotedString
-    
+
     def __inTripleSingleQuotedString(self):
         """
         Private method to check, if the cursor is within a triple single
         quoted string.
-        
+
         @return flag indicating, if the cursor is inside a triple single
             quoted string (boolean)
         """
-        return (
-            self.editor.currentStyle() ==
-            QsciLexerPython.TripleSingleQuotedString
-        )
+        return self.editor.currentStyle() == QsciLexerPython.TripleSingleQuotedString
--- a/src/eric7/QScintilla/TypingCompleters/CompleterRuby.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/TypingCompleters/CompleterRuby.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,117 +20,112 @@
     """
     Class implementing typing completer for Ruby.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object (QScintilla.Editor)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(editor, parent)
-        
+
         self.__beginRX = re.compile(r"""^=begin """)
         self.__beginNlRX = re.compile(r"""^=begin\r?\n""")
         self.__hereRX = re.compile(r"""<<-?['"]?(\w*)['"]?\r?\n""")
-        
+
         self.readSettings()
-    
+
     def readSettings(self):
         """
         Public slot called to reread the configuration parameters.
         """
         self.setEnabled(Preferences.getEditorTyping("Ruby/EnabledTypingAids"))
         self.__insertClosingBrace = Preferences.getEditorTyping(
-            "Ruby/InsertClosingBrace")
-        self.__indentBrace = Preferences.getEditorTyping(
-            "Ruby/IndentBrace")
-        self.__skipBrace = Preferences.getEditorTyping(
-            "Ruby/SkipBrace")
-        self.__insertQuote = Preferences.getEditorTyping(
-            "Ruby/InsertQuote")
-        self.__insertBlank = Preferences.getEditorTyping(
-            "Ruby/InsertBlank")
-        self.__insertHereDoc = Preferences.getEditorTyping(
-            "Ruby/InsertHereDoc")
-        self.__insertInlineDoc = Preferences.getEditorTyping(
-            "Ruby/InsertInlineDoc")
+            "Ruby/InsertClosingBrace"
+        )
+        self.__indentBrace = Preferences.getEditorTyping("Ruby/IndentBrace")
+        self.__skipBrace = Preferences.getEditorTyping("Ruby/SkipBrace")
+        self.__insertQuote = Preferences.getEditorTyping("Ruby/InsertQuote")
+        self.__insertBlank = Preferences.getEditorTyping("Ruby/InsertBlank")
+        self.__insertHereDoc = Preferences.getEditorTyping("Ruby/InsertHereDoc")
+        self.__insertInlineDoc = Preferences.getEditorTyping("Ruby/InsertInlineDoc")
 
     def charAdded(self, charNumber):
         """
         Public slot called to handle the user entering a character.
-        
+
         @param charNumber value of the character entered (integer)
         """
         char = chr(charNumber)
-        if char not in ['(', ')', '{', '}', '[', ']', ',', "'", '"',
-                        '\n', ' ']:
+        if char not in ["(", ")", "{", "}", "[", "]", ",", "'", '"', "\n", " "]:
             return  # take the short route
-        
+
         line, col = self.editor.getCursorPosition()
-        
+
         if (
-            self.__inComment(line, col) or
-            self.__inDoubleQuotedString() or
-            self.__inSingleQuotedString() or
-            self.__inHereDocument() or
-            self.__inInlineDocument()
+            self.__inComment(line, col)
+            or self.__inDoubleQuotedString()
+            or self.__inSingleQuotedString()
+            or self.__inHereDocument()
+            or self.__inInlineDocument()
         ):
             return
-        
+
         # open parenthesis
         # insert closing parenthesis and self
-        if char == '(':
+        if char == "(":
             txt = self.editor.text(line)[:col]
             if self.__insertClosingBrace:
-                self.editor.insert(')')
-        
+                self.editor.insert(")")
+
         # closing parenthesis
         # skip matching closing parenthesis
-        elif char in [')', '}', ']']:
+        elif char in [")", "}", "]"]:
             txt = self.editor.text(line)
             if col < len(txt) and char == txt[col] and self.__skipBrace:
                 self.editor.setSelection(line, col, line, col + 1)
                 self.editor.removeSelectedText()
-        
+
         # space
         # complete inline documentation
-        elif char == ' ':
+        elif char == " ":
             txt = self.editor.text(line)[:col]
             if self.__insertInlineDoc and self.__beginRX.fullmatch(txt):
-                self.editor.insert('=end')
-        
+                self.editor.insert("=end")
+
         # comma
         # insert blank
-        elif char == ',' and self.__insertBlank:
-            self.editor.insert(' ')
+        elif char == "," and self.__insertBlank:
+            self.editor.insert(" ")
             self.editor.setCursorPosition(line, col + 1)
-        
+
         # open curly brace
         # insert closing brace
-        elif char == '{' and self.__insertClosingBrace:
-            self.editor.insert('}')
-        
+        elif char == "{" and self.__insertClosingBrace:
+            self.editor.insert("}")
+
         # open bracket
         # insert closing bracket
-        elif char == '[' and self.__insertClosingBrace:
-            self.editor.insert(']')
-        
+        elif char == "[" and self.__insertClosingBrace:
+            self.editor.insert("]")
+
         # double quote
         # insert double quote
         elif char == '"' and self.__insertQuote:
             self.editor.insert('"')
-        
+
         # quote
         # insert quote
-        elif char == '\'' and self.__insertQuote:
-            self.editor.insert('\'')
-        
+        elif char == "'" and self.__insertQuote:
+            self.editor.insert("'")
+
         # new line
         # indent to opening brace, complete inline documentation
-        elif char == '\n':
+        elif char == "\n":
             txt = self.editor.text(line - 1)
             if self.__insertInlineDoc and self.__beginNlRX.fullmatch(txt):
-                self.editor.insert('=end')
+                self.editor.insert("=end")
             elif self.__insertHereDoc and self.__hereRX.fullmatch(txt):
                 self.editor.insert(self.__hereRX.fullmatch(txt).group(1))
             elif self.__indentBrace and re.search(":\r?\n", txt) is None:
@@ -155,14 +150,13 @@
                             closeCount = len(re.findall(r"[)}\]]", txt2))
                             index -= 1
                         if openCount > closeCount and lastOpenIndex > col:
-                            self.editor.insert(' ' * (lastOpenIndex - col + 1))
-                            self.editor.setCursorPosition(line,
-                                                          lastOpenIndex + 1)
-    
+                            self.editor.insert(" " * (lastOpenIndex - col + 1))
+                            self.editor.setCursorPosition(line, lastOpenIndex + 1)
+
     def __inComment(self, line, col):
         """
         Private method to check, if the cursor is inside a comment.
-        
+
         @param line current line (integer)
         @param col current position within line (integer)
         @return flag indicating, if the cursor is inside a comment (boolean)
@@ -175,40 +169,40 @@
                 return True
             col -= 1
         return False
-    
+
     def __inDoubleQuotedString(self):
         """
         Private method to check, if the cursor is within a double quoted
         string.
-        
+
         @return flag indicating, if the cursor is inside a double
             quoted string (boolean)
         """
         return self.editor.currentStyle() == QsciLexerRuby.DoubleQuotedString
-    
+
     def __inSingleQuotedString(self):
         """
         Private method to check, if the cursor is within a single quoted
         string.
-        
+
         @return flag indicating, if the cursor is inside a single
             quoted string (boolean)
         """
         return self.editor.currentStyle() == QsciLexerRuby.SingleQuotedString
-    
+
     def __inHereDocument(self):
         """
         Private method to check, if the cursor is within a here document.
-        
+
         @return flag indicating, if the cursor is inside a here document
             (boolean)
         """
         return self.editor.currentStyle() == QsciLexerRuby.HereDocument
-    
+
     def __inInlineDocument(self):
         """
         Private method to check, if the cursor is within an inline document.
-        
+
         @return flag indicating, if the cursor is inside an inline document
             (boolean)
         """
--- a/src/eric7/QScintilla/TypingCompleters/CompleterYaml.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/TypingCompleters/CompleterYaml.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,138 +20,132 @@
     """
     Class implementing typing completer for Python.
     """
+
     def __init__(self, editor, parent=None):
         """
         Constructor
-        
+
         @param editor reference to the editor object
         @type QScintilla.Editor
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(editor, parent)
-        
+
         self.readSettings()
-    
+
     def readSettings(self):
         """
         Public slot called to reread the configuration parameters.
         """
-        self.setEnabled(
-            Preferences.getEditorTyping("Yaml/EnabledTypingAids"))
+        self.setEnabled(Preferences.getEditorTyping("Yaml/EnabledTypingAids"))
         self.__insertClosingBrace = Preferences.getEditorTyping(
-            "Yaml/InsertClosingBrace")
-        self.__skipBrace = Preferences.getEditorTyping(
-            "Yaml/SkipBrace")
-        self.__insertQuote = Preferences.getEditorTyping(
-            "Yaml/InsertQuote")
-        self.__autoIndentation = Preferences.getEditorTyping(
-            "Yaml/AutoIndentation")
-        self.__colonDetection = Preferences.getEditorTyping(
-            "Yaml/ColonDetection")
-        self.__insertBlankDash = Preferences.getEditorTyping(
-            "Yaml/InsertBlankDash")
-        self.__insertBlankColon = Preferences.getEditorTyping(
-            "Yaml/InsertBlankColon")
+            "Yaml/InsertClosingBrace"
+        )
+        self.__skipBrace = Preferences.getEditorTyping("Yaml/SkipBrace")
+        self.__insertQuote = Preferences.getEditorTyping("Yaml/InsertQuote")
+        self.__autoIndentation = Preferences.getEditorTyping("Yaml/AutoIndentation")
+        self.__colonDetection = Preferences.getEditorTyping("Yaml/ColonDetection")
+        self.__insertBlankDash = Preferences.getEditorTyping("Yaml/InsertBlankDash")
+        self.__insertBlankColon = Preferences.getEditorTyping("Yaml/InsertBlankColon")
         self.__insertBlankQuestion = Preferences.getEditorTyping(
-            "Yaml/InsertBlankQuestion")
-        self.__insertBlankComma = Preferences.getEditorTyping(
-            "Yaml/InsertBlankComma")
-    
+            "Yaml/InsertBlankQuestion"
+        )
+        self.__insertBlankComma = Preferences.getEditorTyping("Yaml/InsertBlankComma")
+
     def charAdded(self, charNumber):
         """
         Public slot called to handle the user entering a character.
-        
+
         @param charNumber value of the character entered
         @type int
         """
         char = chr(charNumber)
-        if char not in ['{', '}', '[', ']', "'", '"', '-', ':', '?', ',',
-                        '\n']:
+        if char not in ["{", "}", "[", "]", "'", '"', "-", ":", "?", ",", "\n"]:
             return  # take the short route
-        
+
         line, col = self.editor.getCursorPosition()
-        
+
         if self.__inComment(line, col):
             return
-        
+
         # open curly brace
         # insert closing brace
-        if char == '{' and self.__insertClosingBrace:
-            self.editor.insert('}')
-        
+        if char == "{" and self.__insertClosingBrace:
+            self.editor.insert("}")
+
         # open bracket
         # insert closing bracket
-        elif char == '[' and self.__insertClosingBrace:
-            self.editor.insert(']')
-        
+        elif char == "[" and self.__insertClosingBrace:
+            self.editor.insert("]")
+
         # closing parenthesis
         # skip matching closing parenthesis
-        elif char in ['}', ']']:
+        elif char in ["}", "]"]:
             txt = self.editor.text(line)
             if col < len(txt) and char == txt[col] and self.__skipBrace:
                 self.editor.setSelection(line, col, line, col + 1)
                 self.editor.removeSelectedText()
-        
+
         # colon
         # 1. skip colon if not last character
         # 2. insert blank if last character
-        elif char == ':':
+        elif char == ":":
             text = self.editor.text(line)
             if col < len(text) and char == text[col]:
                 if self.__colonDetection:
                     self.editor.setSelection(line, col, line, col + 1)
                     self.editor.removeSelectedText()
             elif self.__insertBlankColon and col == len(text.rstrip()):
-                self.editor.insert(' ')
+                self.editor.insert(" ")
                 self.editor.setCursorPosition(line, col + 1)
-        
+
         # dash, question mark or comma
         # insert blank
         elif (
-            (char == '-' and self.__insertBlankDash) or
-            (char == '?' and self.__insertBlankQuestion) or
-            (char == ',' and self.__insertBlankComma)
+            (char == "-" and self.__insertBlankDash)
+            or (char == "?" and self.__insertBlankQuestion)
+            or (char == "," and self.__insertBlankComma)
         ):
-            self.editor.insert(' ')
+            self.editor.insert(" ")
             self.editor.setCursorPosition(line, col + 1)
-        
+
         # double quote
         # insert double quote
         elif char == '"' and self.__insertQuote:
             self.editor.insert('"')
-        
+
         # quote
         # insert quote
         elif char == "'" and self.__insertQuote:
             self.editor.insert("'")
-        
+
         # new line
         # indent after line ending with ':'
-        elif char == '\n' and self.__autoIndentation:
+        elif char == "\n" and self.__autoIndentation:
             txt = self.editor.text(line - 1)
             match = re.search(
                 "(?:\||\|-|\|\+|>|>-|>\+|-|:)(\s*)\r?\n",
                 # __IGNORE_WARNING_W605__
-                txt)
+                txt,
+            )
             if match is not None:
                 startBlanks = match.start(1)
                 endBlanks = match.end(1)
                 if startBlanks != -1 and startBlanks != endBlanks:
                     # previous line ends with whitespace, e.g. caused by
                     # blank insertion above
-                    self.editor.setSelection(line - 1, startBlanks,
-                                             line - 1, endBlanks)
+                    self.editor.setSelection(line - 1, startBlanks, line - 1, endBlanks)
                     self.editor.removeSelectedText()
-                
+
                 self.editor.indent(line)
                 self.editor.setCursorPosition(line, 0)
                 self.editor.editorCommand(QsciScintilla.SCI_VCHOME)
-    
+
     def __inComment(self, line, col):
         """
         Private method to check, if the cursor is inside a comment.
-        
+
         @param line current line
         @type int
         @param col current position within line
--- a/src/eric7/QScintilla/TypingCompleters/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/TypingCompleters/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,7 @@
 def getCompleter(language, editor, parent=None):
     """
     Module function to instantiate a lexer object for a given language.
-    
+
     @param language language of the lexer (string)
     @param editor reference to the editor object (QScintilla.Editor)
     @param parent reference to the parent object (QObject)
@@ -20,12 +20,15 @@
     try:
         if language in ["Python", "Python3", "MicroPython", "Cython"]:
             from .CompleterPython import CompleterPython
+
             return CompleterPython(editor, parent)
         elif language == "Ruby":
             from .CompleterRuby import CompleterRuby
+
             return CompleterRuby(editor, parent)
         elif language == "YAML":
             from .CompleterYaml import CompleterYaml
+
             return CompleterYaml(editor, parent)
         else:
             return None
--- a/src/eric7/QScintilla/ZoomDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/QScintilla/ZoomDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to select the zoom scale.
     """
+
     def __init__(self, zoom, parent, name=None, modal=False):
         """
         Constructor
-        
+
         @param zoom zoom factor to show in the spinbox
         @param parent parent widget of this dialog (QWidget)
         @param name name of this dialog (string)
@@ -30,17 +31,17 @@
             self.setObjectName(name)
         self.setupUi(self)
         self.setModal(modal)
-        
+
         self.zoomSpinBox.setValue(zoom)
         self.zoomSpinBox.selectAll()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getZoomSize(self):
         """
         Public method to retrieve the zoom size.
-        
+
         @return zoom size (int)
         """
         return self.zoomSpinBox.value()
--- a/src/eric7/Sessions/SessionFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Sessions/SessionFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,23 +24,24 @@
     """
     Class representing the session JSON file.
     """
+
     def __init__(self, isGlobal: bool, parent: QObject = None):
         """
         Constructor
-        
+
         @param isGlobal flag indicating a file for a global session
         @type bool
         @param parent reference to the parent object (defaults to None)
         @type QObject (optional)
         """
         super().__init__(parent)
-        
+
         self.__isGlobal = isGlobal
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the session data to a session JSON file.
-        
+
         @param filename name of the session file
         @type str
         @return flag indicating a successful write
@@ -53,36 +54,31 @@
         vm = ericApp().getObject("ViewManager")
         dbg = ericApp().getObject("DebugUI")
         dbs = ericApp().getObject("DebugServer")
-        
+
         # prepare the session data dictionary
         # step 0: header
         sessionDict = {}
         sessionDict["header"] = {}
         if not self.__isGlobal:
-            sessionDict["header"]["comment"] = (
-                "eric session file for project {0}"
-                .format(project.getProjectName())
-            )
-        sessionDict["header"]["warning"] = (
-            "This file was generated automatically, do not edit."
-        )
-        
+            sessionDict["header"][
+                "comment"
+            ] = "eric session file for project {0}".format(project.getProjectName())
+        sessionDict["header"][
+            "warning"
+        ] = "This file was generated automatically, do not edit."
+
         if Preferences.getProject("TimestampFile") or self.__isGlobal:
-            sessionDict["header"]["saved"] = (
-                time.strftime('%Y-%m-%d, %H:%M:%S')
-            )
-        
+            sessionDict["header"]["saved"] = time.strftime("%Y-%m-%d, %H:%M:%S")
+
         # step 1: open multi project and project for global session
         sessionDict["MultiProject"] = ""
         sessionDict["Project"] = ""
         if self.__isGlobal:
             if multiProject.isOpen():
-                sessionDict["MultiProject"] = (
-                    multiProject.getMultiProjectFile()
-                )
+                sessionDict["MultiProject"] = multiProject.getMultiProjectFile()
             if project.isOpen():
                 sessionDict["Project"] = project.getProjectFile()
-        
+
         # step 2: all open (project) filenames and the active editor
         if vm.canSplit():
             sessionDict["ViewManagerSplits"] = {
@@ -94,8 +90,8 @@
                 "Count": 0,
                 "Orientation": 1,
             }
-        
-        editorsDict = {}    # remember editors by file name to detect clones
+
+        editorsDict = {}  # remember editors by file name to detect clones
         sessionDict["Editors"] = []
         allOpenEditorLists = vm.getOpenEditorsForSession()
         for splitIndex, openEditorList in enumerate(allOpenEditorLists):
@@ -117,7 +113,7 @@
                         "Editorindex": editorIndex,
                     }
                     sessionDict["Editors"].append(editorDict)
-        
+
         aw = vm.getActiveName()
         sessionDict["ActiveWindow"] = {}
         if aw and (self.__isGlobal or project.isProjectFile(aw)):
@@ -126,7 +122,7 @@
                 "Filename": aw,
                 "Cursor": ed.getCursorPosition(),
             }
-        
+
         # step 3: breakpoints
         allBreaks = Preferences.getProject("SessionAllBreakpoints")
         projectFiles = project.getSources(True)
@@ -135,15 +131,13 @@
             sessionDict["Breakpoints"] = bpModel.getAllBreakpoints()
         else:
             sessionDict["Breakpoints"] = [
-                bp
-                for bp in bpModel.getAllBreakpoints()
-                if bp[0] in projectFiles
+                bp for bp in bpModel.getAllBreakpoints() if bp[0] in projectFiles
             ]
-        
+
         # step 4: watch expressions
         wpModel = dbs.getWatchPointModel()
         sessionDict["Watchpoints"] = wpModel.getAllWatchpoints()
-        
+
         # step 5: debug info
         if self.__isGlobal:
             if len(dbg.scriptsHistory):
@@ -163,9 +157,7 @@
             else:
                 dbgEnv = ""
             if len(dbg.multiprocessNoDebugHistory):
-                dbgMultiprocessNoDebug = (
-                    dbg.multiprocessNoDebugHistory[0]
-                )
+                dbgMultiprocessNoDebug = dbg.multiprocessNoDebugHistory[0]
             else:
                 dbgMultiprocessNoDebug = ""
             sessionDict["DebugInfo"] = {
@@ -201,7 +193,7 @@
                 "MultiprocessNoDebug": project.dbgMultiprocessNoDebug,
                 "GlobalConfigOverride": project.dbgGlobalConfigOverride,
             }
-        
+
         # step 6: bookmarks
         bookmarksList = []
         for fileName in editorsDict:
@@ -209,26 +201,29 @@
                 editor = editorsDict[fileName]
                 bookmarks = editor.getBookmarks()
                 if bookmarks:
-                    bookmarksList.append({
-                        "Filename": fileName,
-                        "Lines": bookmarks,
-                    })
+                    bookmarksList.append(
+                        {
+                            "Filename": fileName,
+                            "Lines": bookmarks,
+                        }
+                    )
         sessionDict["Bookmarks"] = bookmarksList
-        
+
         # step 7: state of the various project browsers
         browsersList = []
         for browserName in projectBrowser.getProjectBrowserNames():
-            expandedItems = (
-                projectBrowser.getProjectBrowser(browserName)
-                .getExpandedItemNames()
-            )
+            expandedItems = projectBrowser.getProjectBrowser(
+                browserName
+            ).getExpandedItemNames()
             if expandedItems:
-                browsersList.append({
-                    "Name": browserName,
-                    "ExpandedItems": expandedItems,
-                })
+                browsersList.append(
+                    {
+                        "Name": browserName,
+                        "ExpandedItems": expandedItems,
+                    }
+                )
         sessionDict["ProjectBrowserStates"] = browsersList
-        
+
         try:
             jsonString = json.dumps(sessionDict, indent=2)
             with open(filename, "w") as f:
@@ -241,16 +236,16 @@
                     self.tr(
                         "<p>The session file <b>{0}</b> could not be"
                         " written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the session data from a session JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful read
@@ -267,10 +262,10 @@
                 self.tr(
                     "<p>The session file <b>{0}</b> could not be read.</p>"
                     "<p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         # get references to objects we need
         project = ericApp().getObject("Project")
         projectBrowser = ericApp().getObject("ProjectBrowser")
@@ -278,35 +273,35 @@
         vm = ericApp().getObject("ViewManager")
         dbg = ericApp().getObject("DebugUI")
         dbs = ericApp().getObject("DebugServer")
-        
+
         # step 1: multi project and project
         # =================================
         if sessionDict["MultiProject"]:
             multiProject.openMultiProject(sessionDict["MultiProject"], False)
         if sessionDict["Project"]:
             project.openProject(sessionDict["Project"], False)
-        
+
         # step 2: (project) filenames and the active editor
         # =================================================
         vm.setSplitOrientation(
             Qt.Orientation(sessionDict["ViewManagerSplits"]["Orientation"])
         )
         vm.setSplitCount(sessionDict["ViewManagerSplits"]["Count"])
-        
+
         editorsDict = {}
         for editorDict in sessionDict["Editors"]:
             if editorDict["Clone"] and editorDict["Filename"] in editorsDict:
                 editor = editorsDict[editorDict["Filename"]]
                 ed = vm.newEditorView(
-                    editorDict["Filename"], editor, editor.getFileType(),
-                    indexes=(editorDict["Splitindex"],
-                             editorDict["Editorindex"])
+                    editorDict["Filename"],
+                    editor,
+                    editor.getFileType(),
+                    indexes=(editorDict["Splitindex"], editorDict["Editorindex"]),
                 )
             else:
                 ed = vm.openSourceFile(
                     editorDict["Filename"],
-                    indexes=(editorDict["Splitindex"],
-                             editorDict["Editorindex"])
+                    indexes=(editorDict["Splitindex"], editorDict["Editorindex"]),
                 )
                 editorsDict[editorDict["Filename"]] = ed
             if ed is not None:
@@ -315,28 +310,28 @@
                     ed.recolor()
                     ed.setContractedFolds(editorDict["Folds"])
                     ed.setCursorPosition(*editorDict["Cursor"])
-        
+
         # step 3: breakpoints
         # ===================
         bpModel = dbs.getBreakPointModel()
         bpModel.addBreakPoints(sessionDict["Breakpoints"])
-        
+
         # step 4: watch expressions
         # =========================
         wpModel = dbs.getWatchPointModel()
         wpModel.addWatchPoints(sessionDict["Watchpoints"])
-        
+
         # step 5: debug info
         # ==================
         debugInfoDict = sessionDict["DebugInfo"]
-        
+
         # adjust for newer session types
         if "GlobalConfigOverride" not in debugInfoDict:
             debugInfoDict["GlobalConfigOverride"] = {
                 "enable": False,
                 "redirect": True,
             }
-        
+
         dbg.lastUsedVenvName = debugInfoDict["VirtualEnv"]
         with contextlib.suppress(KeyError):
             dbg.setScriptsHistory(debugInfoDict["ScriptName"])
@@ -351,8 +346,7 @@
         dbg.setAutoContinue(debugInfoDict["AutoContinue"])
         dbg.setEnableMultiprocess(debugInfoDict["EnableMultiprocess"])
         dbg.setMultiprocessNoDebugHistory(debugInfoDict["MultiprocessNoDebug"])
-        dbg.setEnableGlobalConfigOverride(
-            debugInfoDict["GlobalConfigOverride"])
+        dbg.setEnableGlobalConfigOverride(debugInfoDict["GlobalConfigOverride"])
         if not self.__isGlobal:
             project.setDbgInfo(
                 debugInfoDict["VirtualEnv"],
@@ -369,7 +363,7 @@
                 debugInfoDict["MultiprocessNoDebug"],
                 debugInfoDict["GlobalConfigOverride"],
             )
-        
+
         # step 6: bookmarks
         # =================
         for bookmark in sessionDict["Bookmarks"]:
@@ -377,14 +371,14 @@
             if editor is not None:
                 for lineno in bookmark["Lines"]:
                     editor.toggleBookmark(lineno)
-        
+
         # step 7: state of the various project browsers
         # =============================================
         for browserState in sessionDict["ProjectBrowserStates"]:
             browser = projectBrowser.getProjectBrowser(browserState["Name"])
             if browser is not None:
                 browser.expandItemsByName(browserState["ExpandedItems"])
-        
+
         # step 8: active window
         # =====================
         if sessionDict["ActiveWindow"]:
@@ -393,5 +387,5 @@
             if ed is not None:
                 ed.setCursorPosition(*sessionDict["ActiveWindow"]["Cursor"])
                 ed.ensureCursorVisible()
-        
+
         return True
--- a/src/eric7/Snapshot/SnapWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,13 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    pyqtSlot, Qt, QTimer, QPoint, QMimeData, QLocale, QStandardPaths
+    pyqtSlot,
+    Qt,
+    QTimer,
+    QPoint,
+    QMimeData,
+    QLocale,
+    QStandardPaths,
 )
 from PyQt6.QtGui import QImageWriter, QPixmap, QDrag, QKeySequence, QShortcut
 from PyQt6.QtWidgets import QWidget, QApplication
@@ -37,147 +43,166 @@
     """
     Class implementing the snapshot widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSaveAs"))
         self.takeButton.setIcon(UI.PixmapCache.getIcon("cameraPhoto"))
         self.copyButton.setIcon(UI.PixmapCache.getIcon("editCopy"))
         self.copyPreviewButton.setIcon(UI.PixmapCache.getIcon("editCopy"))
         self.setWindowIcon(UI.PixmapCache.getIcon("ericSnap"))
-        
+
         if Globals.isWaylandSession():
             from .SnapshotWaylandGrabber import SnapshotWaylandGrabber
+
             self.__grabber = SnapshotWaylandGrabber(self)
         else:
             from .SnapshotDefaultGrabber import SnapshotDefaultGrabber
+
             self.__grabber = SnapshotDefaultGrabber(self)
             self.decorationsCheckBox.hide()
             self.mouseCursorCheckBox.hide()
         self.__grabber.grabbed.connect(self.__captured)
         supportedModes = self.__grabber.supportedModes()
-        
+
         if SnapshotModes.FULLSCREEN in supportedModes:
-            self.modeCombo.addItem(self.tr("Fullscreen"),
-                                   SnapshotModes.FULLSCREEN)
+            self.modeCombo.addItem(self.tr("Fullscreen"), SnapshotModes.FULLSCREEN)
         if (
-            SnapshotModes.SELECTEDSCREEN in supportedModes and
-            len(QApplication.screens()) > 1
+            SnapshotModes.SELECTEDSCREEN in supportedModes
+            and len(QApplication.screens()) > 1
         ):
-            self.modeCombo.addItem(self.tr("Select Screen"),
-                                   SnapshotModes.SELECTEDSCREEN)
+            self.modeCombo.addItem(
+                self.tr("Select Screen"), SnapshotModes.SELECTEDSCREEN
+            )
         if SnapshotModes.SELECTEDWINDOW in supportedModes:
-            self.modeCombo.addItem(self.tr("Select Window"),
-                                   SnapshotModes.SELECTEDWINDOW)
+            self.modeCombo.addItem(
+                self.tr("Select Window"), SnapshotModes.SELECTEDWINDOW
+            )
         if SnapshotModes.RECTANGLE in supportedModes:
-            self.modeCombo.addItem(self.tr("Rectangular Selection"),
-                                   SnapshotModes.RECTANGLE)
+            self.modeCombo.addItem(
+                self.tr("Rectangular Selection"), SnapshotModes.RECTANGLE
+            )
         if SnapshotModes.ELLIPSE in supportedModes:
-            self.modeCombo.addItem(self.tr("Elliptical Selection"),
-                                   SnapshotModes.ELLIPSE)
+            self.modeCombo.addItem(
+                self.tr("Elliptical Selection"), SnapshotModes.ELLIPSE
+            )
         if SnapshotModes.FREEHAND in supportedModes:
-            self.modeCombo.addItem(self.tr("Freehand Selection"),
-                                   SnapshotModes.FREEHAND)
+            self.modeCombo.addItem(
+                self.tr("Freehand Selection"), SnapshotModes.FREEHAND
+            )
         mode = int(Preferences.getSettings().value("Snapshot/Mode", 0))
         index = self.modeCombo.findData(SnapshotModes(mode))
         if index == -1:
             index = 0
         self.modeCombo.setCurrentIndex(index)
-        
+
         delay = int(Preferences.getSettings().value("Snapshot/Delay", 0))
         self.delaySpin.setValue(delay)
-        
+
         picturesLocation = QStandardPaths.writableLocation(
-            QStandardPaths.StandardLocation.PicturesLocation)
+            QStandardPaths.StandardLocation.PicturesLocation
+        )
         self.__filename = Preferences.getSettings().value(
             "Snapshot/Filename",
-            os.path.join(picturesLocation,
-                         self.tr("snapshot") + "1.png"))
-        
+            os.path.join(picturesLocation, self.tr("snapshot") + "1.png"),
+        )
+
         self.__snapshot = QPixmap()
         self.__savedPosition = QPoint()
         self.__modified = False
         self.__locale = QLocale()
-        
+
         self.__initFileFilters()
         self.__initShortcuts()
-        
+
         self.preview.startDrag.connect(self.__dragSnapshot)
-        
+
         self.__updateTimer = QTimer()
         self.__updateTimer.setSingleShot(True)
         self.__updateTimer.timeout.connect(self.__updatePreview)
-        
+
         self.__updateCaption()
         self.takeButton.setFocus()
-    
+
     def __initFileFilters(self):
         """
         Private method to define the supported image file filters.
         """
         filters = {
-            'bmp': self.tr("Windows Bitmap File (*.bmp)"),
-            'gif': self.tr("Graphic Interchange Format File (*.gif)"),
-            'ico': self.tr("Windows Icon File (*.ico)"),
-            'jpg': self.tr("JPEG File (*.jpg)"),
-            'mng': self.tr("Multiple-Image Network Graphics File (*.mng)"),
-            'pbm': self.tr("Portable Bitmap File (*.pbm)"),
-            'pcx': self.tr("Paintbrush Bitmap File (*.pcx)"),
-            'pgm': self.tr("Portable Graymap File (*.pgm)"),
-            'png': self.tr("Portable Network Graphics File (*.png)"),
-            'ppm': self.tr("Portable Pixmap File (*.ppm)"),
-            'sgi': self.tr("Silicon Graphics Image File (*.sgi)"),
-            'svg': self.tr("Scalable Vector Graphics File (*.svg)"),
-            'tga': self.tr("Targa Graphic File (*.tga)"),
-            'tif': self.tr("TIFF File (*.tif)"),
-            'xbm': self.tr("X11 Bitmap File (*.xbm)"),
-            'xpm': self.tr("X11 Pixmap File (*.xpm)"),
+            "bmp": self.tr("Windows Bitmap File (*.bmp)"),
+            "gif": self.tr("Graphic Interchange Format File (*.gif)"),
+            "ico": self.tr("Windows Icon File (*.ico)"),
+            "jpg": self.tr("JPEG File (*.jpg)"),
+            "mng": self.tr("Multiple-Image Network Graphics File (*.mng)"),
+            "pbm": self.tr("Portable Bitmap File (*.pbm)"),
+            "pcx": self.tr("Paintbrush Bitmap File (*.pcx)"),
+            "pgm": self.tr("Portable Graymap File (*.pgm)"),
+            "png": self.tr("Portable Network Graphics File (*.png)"),
+            "ppm": self.tr("Portable Pixmap File (*.ppm)"),
+            "sgi": self.tr("Silicon Graphics Image File (*.sgi)"),
+            "svg": self.tr("Scalable Vector Graphics File (*.svg)"),
+            "tga": self.tr("Targa Graphic File (*.tga)"),
+            "tif": self.tr("TIFF File (*.tif)"),
+            "xbm": self.tr("X11 Bitmap File (*.xbm)"),
+            "xpm": self.tr("X11 Pixmap File (*.xpm)"),
         }
-        
+
         outputFormats = []
         writeFormats = QImageWriter.supportedImageFormats()
         for writeFormat in writeFormats:
             with contextlib.suppress(KeyError):
                 outputFormats.append(filters[bytes(writeFormat).decode()])
         outputFormats.sort()
-        self.__outputFilter = ';;'.join(outputFormats)
-        
-        self.__defaultFilter = filters['png']
-    
+        self.__outputFilter = ";;".join(outputFormats)
+
+        self.__defaultFilter = filters["png"]
+
     def __initShortcuts(self):
         """
         Private method to initialize the keyboard shortcuts.
         """
         self.__quitShortcut = QShortcut(
-            QKeySequence(QKeySequence.StandardKey.Quit), self, self.close)
-        
+            QKeySequence(QKeySequence.StandardKey.Quit), self, self.close
+        )
+
         self.__copyShortcut = QShortcut(
-            QKeySequence(QKeySequence.StandardKey.Copy), self,
-            self.copyButton.animateClick)
-        
+            QKeySequence(QKeySequence.StandardKey.Copy),
+            self,
+            self.copyButton.animateClick,
+        )
+
         self.__quickSaveShortcut = QShortcut(
-            QKeySequence(Qt.Key.Key_Q), self, self.__quickSave)
-        
+            QKeySequence(Qt.Key.Key_Q), self, self.__quickSave
+        )
+
         self.__save1Shortcut = QShortcut(
-            QKeySequence(QKeySequence.StandardKey.Save), self,
-            self.saveButton.animateClick)
+            QKeySequence(QKeySequence.StandardKey.Save),
+            self,
+            self.saveButton.animateClick,
+        )
         self.__save2Shortcut = QShortcut(
-            QKeySequence(Qt.Key.Key_S), self, self.saveButton.animateClick)
-        
+            QKeySequence(Qt.Key.Key_S), self, self.saveButton.animateClick
+        )
+
         self.__grab1Shortcut = QShortcut(
             QKeySequence(QKeySequence.StandardKey.New),
-            self, self.takeButton.animateClick)
+            self,
+            self.takeButton.animateClick,
+        )
         self.__grab2Shortcut = QShortcut(
-            QKeySequence(Qt.Key.Key_N), self, self.takeButton.animateClick)
+            QKeySequence(Qt.Key.Key_N), self, self.takeButton.animateClick
+        )
         self.__grab3Shortcut = QShortcut(
-            QKeySequence(Qt.Key.Key_Space), self, self.takeButton.animateClick)
-    
+            QKeySequence(Qt.Key.Key_Space), self, self.takeButton.animateClick
+        )
+
     def __quickSave(self):
         """
         Private slot to save the snapshot bypassing the file selection dialog.
@@ -185,12 +210,12 @@
         if not self.__snapshot.isNull():
             while os.path.exists(self.__filename):
                 self.__autoIncFilename()
-            
+
             if self.__saveImage(self.__filename):
                 self.__modified = False
                 self.__autoIncFilename()
                 self.__updateCaption()
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -199,33 +224,34 @@
         if not self.__snapshot.isNull():
             while os.path.exists(self.__filename):
                 self.__autoIncFilename()
-            
+
             fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
                 self,
                 self.tr("Save Snapshot"),
                 self.__filename,
                 self.__outputFilter,
                 self.__defaultFilter,
-                EricFileDialog.DontConfirmOverwrite)
+                EricFileDialog.DontConfirmOverwrite,
+            )
             if not fileName:
                 return
-            
+
             fpath = pathlib.Path(fileName)
             if not fpath.suffix:
                 ex = selectedFilter.split("(*")[1].split(")")[0]
                 if ex:
                     fpath = fpath.with_suffix(ex)
-            
+
             if self.__saveImage(str(fpath)):
                 self.__modified = False
                 self.__filename = str(fpath)
                 self.__autoIncFilename()
                 self.__updateCaption()
-    
+
     def __saveImage(self, fileName):
         """
         Private method to save the snapshot.
-        
+
         @param fileName name of the file to save to (string)
         @return flag indicating success (boolean)
         """
@@ -233,32 +259,36 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Snapshot"),
-                self.tr("<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fileName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fileName),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return False
-        
+
         ok = self.__snapshot.save(fileName)
         if not ok:
             EricMessageBox.warning(
-                self, self.tr("Save Snapshot"),
-                self.tr("Cannot write file '{0}'.").format(fileName))
-        
+                self,
+                self.tr("Save Snapshot"),
+                self.tr("Cannot write file '{0}'.").format(fileName),
+            )
+
         return ok
-    
+
     def __autoIncFilename(self):
         """
         Private method to auto-increment the file name.
         """
         # Extract the file name
         name = os.path.basename(self.__filename)
-        
+
         # If the name contains a number, then increment it.
         numSearch = re.compile("(^|[^\\d])(\\d+)")
         # We want to match as far left as possible, and when the number is
         # at the start of the name.
-        
+
         # Does it have a number?
         matches = list(numSearch.finditer(name))
         if matches:
@@ -267,22 +297,21 @@
             start = match.start(2)
             # Only the second group is of interest.
             numAsStr = match.group(2)
-            number = "{0:0{width}d}".format(
-                int(numAsStr) + 1, width=len(numAsStr))
-            name = name[:start] + number + name[start + len(numAsStr):]
+            number = "{0:0{width}d}".format(int(numAsStr) + 1, width=len(numAsStr))
+            name = name[:start] + number + name[start + len(numAsStr) :]
         else:
             # no number
-            start = name.rfind('.')
+            start = name.rfind(".")
             if start != -1:
                 # has a '.' somewhere, e.g. it has an extension
-                name = name[:start] + '-1' + name[start:]
+                name = name[:start] + "-1" + name[start:]
             else:
                 # no extension, just tack it on to the end
-                name += '-1'
-        
+                name += "-1"
+
         self.__filename = os.path.join(os.path.dirname(self.__filename), name)
         self.__updateCaption()
-    
+
     @pyqtSlot()
     def on_takeButton_clicked(self):
         """
@@ -290,14 +319,14 @@
         """
         self.__savedPosition = self.pos()
         self.hide()
-        
+
         self.__grabber.grab(
             self.modeCombo.itemData(self.modeCombo.currentIndex()),
             self.delaySpin.value(),
             self.mouseCursorCheckBox.isChecked(),
             self.decorationsCheckBox.isChecked(),
         )
-    
+
     def __redisplay(self):
         """
         Private method to redisplay the window.
@@ -307,11 +336,11 @@
             self.move(self.__savedPosition)
         self.show()
         self.raise_()
-        
+
         self.saveButton.setEnabled(not self.__snapshot.isNull())
         self.copyButton.setEnabled(not self.__snapshot.isNull())
         self.copyPreviewButton.setEnabled(not self.__snapshot.isNull())
-    
+
     @pyqtSlot()
     def on_copyButton_clicked(self):
         """
@@ -319,46 +348,47 @@
         """
         if not self.__snapshot.isNull():
             QApplication.clipboard().setPixmap(QPixmap(self.__snapshot))
-    
+
     @pyqtSlot()
     def on_copyPreviewButton_clicked(self):
         """
         Private slot to copy the snapshot preview to the clipboard.
         """
         QApplication.clipboard().setPixmap(self.preview.pixmap())
-    
+
     def __captured(self, pixmap):
         """
         Private slot to show a preview of the snapshot.
-        
+
         @param pixmap pixmap of the snapshot (QPixmap)
         """
         self.__snapshot = QPixmap(pixmap)
-        
+
         self.__redisplay()
         self.__modified = not pixmap.isNull()
         self.__updateCaption()
-    
+
     def __updatePreview(self):
         """
         Private slot to update the preview picture.
         """
-        self.preview.setToolTip(self.tr(
-            "Preview of the snapshot image ({0} x {1})").format(
-            self.__locale.toString(self.__snapshot.width()),
-            self.__locale.toString(self.__snapshot.height()))
+        self.preview.setToolTip(
+            self.tr("Preview of the snapshot image ({0} x {1})").format(
+                self.__locale.toString(self.__snapshot.width()),
+                self.__locale.toString(self.__snapshot.height()),
+            )
         )
         self.preview.setPreview(self.__snapshot)
         self.preview.adjustSize()
-    
+
     def resizeEvent(self, evt):
         """
         Protected method handling a resizing of the window.
-        
+
         @param evt resize event (QResizeEvent)
         """
         self.__updateTimer.start(200)
-    
+
     def __dragSnapshot(self):
         """
         Private slot handling the dragging of the preview picture.
@@ -369,62 +399,57 @@
         drag.setMimeData(mimeData)
         drag.setPixmap(self.preview.pixmap())
         drag.exec(Qt.DropAction.CopyAction)
-    
+
     def closeEvent(self, evt):
         """
         Protected method handling the close event.
-        
+
         @param evt close event (QCloseEvent)
         """
         if self.__modified:
             res = EricMessageBox.question(
                 self,
                 self.tr("eric Snapshot"),
-                self.tr(
-                    """The application contains an unsaved snapshot."""),
-                EricMessageBox.Abort |
-                EricMessageBox.Discard |
-                EricMessageBox.Save
+                self.tr("""The application contains an unsaved snapshot."""),
+                EricMessageBox.Abort | EricMessageBox.Discard | EricMessageBox.Save,
             )
             if res == EricMessageBox.Abort:
                 evt.ignore()
                 return
             elif res == EricMessageBox.Save:
                 self.on_saveButton_clicked()
-        
-        Preferences.getSettings().setValue(
-            "Snapshot/Delay", self.delaySpin.value())
+
+        Preferences.getSettings().setValue("Snapshot/Delay", self.delaySpin.value())
         modeData = self.modeCombo.itemData(self.modeCombo.currentIndex())
         if modeData is not None:
-            Preferences.getSettings().setValue(
-                "Snapshot/Mode",
-                modeData.value)
-        Preferences.getSettings().setValue(
-            "Snapshot/Filename", self.__filename)
+            Preferences.getSettings().setValue("Snapshot/Mode", modeData.value)
+        Preferences.getSettings().setValue("Snapshot/Filename", self.__filename)
         Preferences.getSettings().sync()
-    
+
     def __updateCaption(self):
         """
         Private method to update the window caption.
         """
-        self.setWindowTitle("{0}[*] - {1}".format(
-            os.path.basename(self.__filename),
-            self.tr("eric Snapshot")))
+        self.setWindowTitle(
+            "{0}[*] - {1}".format(
+                os.path.basename(self.__filename), self.tr("eric Snapshot")
+            )
+        )
         self.setWindowModified(self.__modified)
         self.pathNameEdit.setText(os.path.dirname(self.__filename))
-    
+
     @pyqtSlot(int)
     def on_modeCombo_currentIndexChanged(self, index):
         """
         Private slot handling the selection of a screenshot mode.
-        
+
         @param index index of the selection
         @type int
         """
         isWindowMode = False
         if index >= 0:
             mode = self.modeCombo.itemData(index)
-            isWindowMode = (mode == SnapshotModes.SELECTEDWINDOW)
-        
+            isWindowMode = mode == SnapshotModes.SELECTEDWINDOW
+
         self.decorationsCheckBox.setEnabled(isWindowMode)
         self.decorationsCheckBox.setChecked(isWindowMode)
--- a/src/eric7/Snapshot/SnapshotDefaultGrabber.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotDefaultGrabber.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,34 +19,35 @@
 class SnapshotDefaultGrabber(QObject):
     """
     Class implementing a grabber object for non-Wayland desktops.
-    
+
     @signal grabbed(QPixmap) emitted after the grab operation is finished
     """
+
     grabbed = pyqtSignal(QPixmap)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__grabber = None
-        self.__grabberWidget = QWidget(
-            None, Qt.WindowType.X11BypassWindowManagerHint)
+        self.__grabberWidget = QWidget(None, Qt.WindowType.X11BypassWindowManagerHint)
         self.__grabberWidget.move(-10000, -10000)
         self.__grabberWidget.installEventFilter(self)
-        
+
         from .SnapshotTimer import SnapshotTimer
+
         self.__grabTimer = SnapshotTimer()
         self.__grabTimer.timeout.connect(self.__grabTimerTimeout)
-    
+
     def supportedModes(self):
         """
         Public method to get the supported screenshot modes.
-        
+
         @return tuple of supported screenshot modes
         @rtype tuple of SnapshotModes
         """
@@ -57,12 +58,11 @@
             SnapshotModes.FREEHAND,
             SnapshotModes.ELLIPSE,
         )
-    
-    def grab(self, mode, delay=0, captureCursor=False,
-             captureDecorations=False):
+
+    def grab(self, mode, delay=0, captureCursor=False, captureDecorations=False):
         """
         Public method to perform a grab operation potentially after a delay.
-        
+
         @param mode screenshot mode
         @type ScreenshotModes
         @param delay delay in seconds
@@ -79,7 +79,7 @@
             self.__grabTimer.start(delay)
         else:
             QTimer.singleShot(200, self.__startUndelayedGrab)
-    
+
     def __grabTimerTimeout(self):
         """
         Private slot to perform a delayed grab operation.
@@ -92,7 +92,7 @@
             self.__grabFreehand()
         else:
             self.__performGrab(self.__mode)
-    
+
     def __startUndelayedGrab(self):
         """
         Private slot to perform an undelayed grab operation.
@@ -109,49 +109,51 @@
             else:
                 self.__grabberWidget.show()
                 self.__grabberWidget.grabMouse(Qt.CursorShape.CrossCursor)
-    
+
     def __grabRectangle(self):
         """
         Private method to grab a rectangular screen region.
         """
         from .SnapshotRegionGrabber import SnapshotRegionGrabber
-        self.__grabber = SnapshotRegionGrabber(
-            mode=SnapshotRegionGrabber.Rectangle)
+
+        self.__grabber = SnapshotRegionGrabber(mode=SnapshotRegionGrabber.Rectangle)
         self.__grabber.grabbed.connect(self.__captured)
-    
+
     def __grabEllipse(self):
         """
         Private method to grab an elliptical screen region.
         """
         from .SnapshotRegionGrabber import SnapshotRegionGrabber
-        self.__grabber = SnapshotRegionGrabber(
-            mode=SnapshotRegionGrabber.Ellipse)
+
+        self.__grabber = SnapshotRegionGrabber(mode=SnapshotRegionGrabber.Ellipse)
         self.__grabber.grabbed.connect(self.__captured)
-    
+
     def __grabFreehand(self):
         """
         Private method to grab a non-rectangular screen region.
         """
         from .SnapshotFreehandGrabber import SnapshotFreehandGrabber
+
         self.__grabber = SnapshotFreehandGrabber()
         self.__grabber.grabbed.connect(self.__captured)
-    
+
     def __performGrab(self, mode):
         """
         Private method to perform a screen grab other than a selected region.
-        
+
         @param mode screenshot mode
         @type SnapshotModes
         """
         self.__grabberWidget.releaseMouse()
         self.__grabberWidget.hide()
         self.__grabTimer.stop()
-        
+
         if mode == SnapshotModes.FULLSCREEN:
             screen = QGuiApplication.screens()[0]
             vgeom = screen.availableVirtualGeometry()
             snapshot = screen.grabWindow(
-                0, vgeom.x(), vgeom.y(), vgeom.width(), vgeom.height())
+                0, vgeom.x(), vgeom.y(), vgeom.width(), vgeom.height()
+            )
         elif mode == SnapshotModes.SELECTEDSCREEN:
             screen = QGuiApplication.screenAt(QCursor.pos())
             sgeom = screen.geometry()
@@ -163,42 +165,38 @@
             else:
                 # Linux variant
                 # Windows variant
-                snapshot = screen.grabWindow(
-                    0, 0, 0, sgeom.width(), sgeom.height())
+                snapshot = screen.grabWindow(0, 0, 0, sgeom.width(), sgeom.height())
         else:
             snapshot = QPixmap()
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def __captured(self, pixmap):
         """
         Private slot to show a preview of the snapshot.
-        
+
         @param pixmap pixmap of the snapshot (QPixmap)
         """
         self.__grabber.close()
         snapshot = QPixmap(pixmap)
-        
+
         self.__grabber.grabbed.disconnect(self.__captured)
         self.__grabber = None
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def eventFilter(self, obj, evt):
         """
         Public method to handle event for other objects.
-        
+
         @param obj reference to the object (QObject)
         @param evt reference to the event (QEvent)
         @return flag indicating that the event should be filtered out (boolean)
         """
-        if (
-            obj == self.__grabberWidget and
-            evt.type() == QEvent.Type.MouseButtonPress
-        ):
+        if obj == self.__grabberWidget and evt.type() == QEvent.Type.MouseButtonPress:
             if QWidget.mouseGrabber() != self.__grabberWidget:
                 return False
             if evt.button() == Qt.MouseButton.LeftButton:
                 self.__performGrab(self.__mode)
-        
+
         return False
--- a/src/eric7/Snapshot/SnapshotFreehandGrabber.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotFreehandGrabber.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,17 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QRect, QPoint, QTimer, QLocale
 from PyQt6.QtGui import (
-    QPixmap, QColor, QRegion, QPainter, QPalette, QPolygon, QPen, QBrush,
-    QPaintEngine, QGuiApplication, QCursor
+    QPixmap,
+    QColor,
+    QRegion,
+    QPainter,
+    QPalette,
+    QPolygon,
+    QPen,
+    QBrush,
+    QPaintEngine,
+    QGuiApplication,
+    QCursor,
 )
 from PyQt6.QtWidgets import QWidget, QToolTip
 
@@ -20,7 +29,7 @@
 def drawPolygon(painter, polygon, outline, fill=None):
     """
     Module function to draw a polygon with the given parameters.
-    
+
     @param painter reference to the painter to be used (QPainter)
     @param polygon polygon to be drawn (QPolygon)
     @param outline color of the outline (QColor)
@@ -28,9 +37,14 @@
     """
     clip = QRegion(polygon)
     clip -= QRegion(polygon)
-    pen = QPen(outline, 1, Qt.PenStyle.SolidLine, Qt.PenCapStyle.SquareCap,
-               Qt.PenJoinStyle.BevelJoin)
-    
+    pen = QPen(
+        outline,
+        1,
+        Qt.PenStyle.SolidLine,
+        Qt.PenCapStyle.SquareCap,
+        Qt.PenJoinStyle.BevelJoin,
+    )
+
     painter.save()
     painter.setClipRegion(clip)
     painter.setPen(pen)
@@ -45,23 +59,24 @@
 class SnapshotFreehandGrabber(QWidget):
     """
     Class implementing a grabber widget for a freehand snapshot region.
-    
+
     @signal grabbed(QPixmap) emitted after the region was grabbed
     """
+
     grabbed = pyqtSignal(QPixmap)
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__(
             None,
-            Qt.WindowType.X11BypassWindowManagerHint |
-            Qt.WindowType.WindowStaysOnTopHint |
-            Qt.WindowType.FramelessWindowHint |
-            Qt.WindowType.Tool
+            Qt.WindowType.X11BypassWindowManagerHint
+            | Qt.WindowType.WindowStaysOnTopHint
+            | Qt.WindowType.FramelessWindowHint
+            | Qt.WindowType.Tool,
         )
-        
+
         self.__selection = QPolygon()
         self.__mouseDown = False
         self.__newSelection = False
@@ -71,19 +86,20 @@
         self.__dragStartPoint = QPoint()
         self.__selectionBeforeDrag = QPolygon()
         self.__locale = QLocale()
-        
+
         self.__helpTextRect = QRect()
         self.__helpText = self.tr(
             "Select a region using the mouse. To take the snapshot,"
-            " press the Enter key or double click. Press Esc to quit.")
-        
+            " press the Enter key or double click. Press Esc to quit."
+        )
+
         self.__pixmap = QPixmap()
         self.__pBefore = QPoint()
-        
+
         self.setMouseTracking(True)
-        
+
         QTimer.singleShot(200, self.__initialize)
-    
+
     def __initialize(self):
         """
         Private slot to initialize the rest of the widget.
@@ -93,14 +109,16 @@
             screen = QGuiApplication.screenAt(QCursor.pos())
             geom = screen.geometry()
             self.__pixmap = screen.grabWindow(
-                0, geom.x(), geom.y(), geom.width(), geom.height())
+                0, geom.x(), geom.y(), geom.width(), geom.height()
+            )
         else:
             # Linux variant
             # Windows variant
             screen = QGuiApplication.screens()[0]
             geom = screen.availableVirtualGeometry()
             self.__pixmap = screen.grabWindow(
-                0, geom.x(), geom.y(), geom.width(), geom.height())
+                0, geom.x(), geom.y(), geom.width(), geom.height()
+            )
         self.resize(self.__pixmap.size())
         self.move(geom.x(), geom.y())
         self.setCursor(Qt.CursorShape.CrossCursor)
@@ -109,41 +127,47 @@
         self.grabMouse()
         self.grabKeyboard()
         self.activateWindow()
-    
+
     def paintEvent(self, evt):
         """
         Protected method handling paint events.
-        
+
         @param evt paint event (QPaintEvent)
         """
-        if self.__grabbing:     # grabWindow() should just get the background
+        if self.__grabbing:  # grabWindow() should just get the background
             return
-        
+
         painter = QPainter(self)
         pal = QPalette(QToolTip.palette())
         font = QToolTip.font()
-        
-        handleColor = pal.color(QPalette.ColorGroup.Active,
-                                QPalette.ColorRole.Highlight)
+
+        handleColor = pal.color(
+            QPalette.ColorGroup.Active, QPalette.ColorRole.Highlight
+        )
         handleColor.setAlpha(160)
         overlayColor = QColor(0, 0, 0, 160)
-        textColor = pal.color(QPalette.ColorGroup.Active,
-                              QPalette.ColorRole.Text)
-        textBackgroundColor = pal.color(QPalette.ColorGroup.Active,
-                                        QPalette.ColorRole.Base)
+        textColor = pal.color(QPalette.ColorGroup.Active, QPalette.ColorRole.Text)
+        textBackgroundColor = pal.color(
+            QPalette.ColorGroup.Active, QPalette.ColorRole.Base
+        )
         painter.drawPixmap(0, 0, self.__pixmap)
         painter.setFont(font)
-        
+
         pol = QPolygon(self.__selection)
         if not self.__selection.boundingRect().isNull():
             # Draw outline around selection.
             # Important: the 1px-wide outline is *also* part of the
             # captured free-region
-            pen = QPen(handleColor, 1, Qt.PenStyle.SolidLine,
-                       Qt.PenCapStyle.SquareCap, Qt.PenJoinStyle.BevelJoin)
+            pen = QPen(
+                handleColor,
+                1,
+                Qt.PenStyle.SolidLine,
+                Qt.PenCapStyle.SquareCap,
+                Qt.PenJoinStyle.BevelJoin,
+            )
             painter.setPen(pen)
             painter.drawPolygon(pol)
-            
+
             # Draw the grey area around the selection.
             grey = QRegion(self.rect())
             grey -= QRegion(pol)
@@ -153,23 +177,26 @@
             painter.drawRect(self.rect())
             painter.setClipRect(self.rect())
             drawPolygon(painter, pol, handleColor)
-        
+
         if self.__showHelp:
             painter.setPen(textColor)
             painter.setBrush(textBackgroundColor)
             self.__helpTextRect = painter.boundingRect(
                 self.rect().adjusted(2, 2, -2, -2),
-                Qt.TextFlag.TextWordWrap, self.__helpText).translated(0, 0)
+                Qt.TextFlag.TextWordWrap,
+                self.__helpText,
+            ).translated(0, 0)
             self.__helpTextRect.adjust(-2, -2, 4, 2)
-            drawPolygon(painter, self.__helpTextRect, textColor,
-                        textBackgroundColor)
+            drawPolygon(painter, self.__helpTextRect, textColor, textBackgroundColor)
             painter.drawText(
                 self.__helpTextRect.adjusted(3, 3, -3, -3),
-                Qt.TextFlag.TextWordWrap, self.__helpText)
-        
+                Qt.TextFlag.TextWordWrap,
+                self.__helpText,
+            )
+
         if self.__selection.isEmpty():
             return
-        
+
         # The grabbed region is everything which is covered by the drawn
         # rectangles (border included). This means that there is no 0px
         # selection, since a 0px wide rectangle will always be drawn as a line.
@@ -178,90 +205,86 @@
             self.__locale.toString(boundingRect.x()),
             self.__locale.toString(boundingRect.y()),
             self.__locale.toString(boundingRect.width()),
-            self.__locale.toString(boundingRect.height())
+            self.__locale.toString(boundingRect.height()),
         )
-        textRect = painter.boundingRect(self.rect(),
-                                        Qt.AlignmentFlag.AlignLeft, txt)
+        textRect = painter.boundingRect(self.rect(), Qt.AlignmentFlag.AlignLeft, txt)
         boundingRect = textRect.adjusted(-4, 0, 0, 0)
-        
+
         polBoundingRect = pol.boundingRect()
         if (
-            (textRect.width() <
-             polBoundingRect.width() - 2 * self.__handleSize) and
-            (textRect.height() <
-             polBoundingRect.height() - 2 * self.__handleSize) and
-            polBoundingRect.width() > 100 and
-            polBoundingRect.height() > 100
+            (textRect.width() < polBoundingRect.width() - 2 * self.__handleSize)
+            and (textRect.height() < polBoundingRect.height() - 2 * self.__handleSize)
+            and polBoundingRect.width() > 100
+            and polBoundingRect.height() > 100
         ):
             # center, unsuitable for small selections
             boundingRect.moveCenter(polBoundingRect.center())
             textRect.moveCenter(polBoundingRect.center())
         elif (
-            polBoundingRect.y() - 3 > textRect.height() and
-            polBoundingRect.x() + textRect.width() < self.rect().width()
+            polBoundingRect.y() - 3 > textRect.height()
+            and polBoundingRect.x() + textRect.width() < self.rect().width()
         ):
             # on top, left aligned
             boundingRect.moveBottomLeft(
-                QPoint(polBoundingRect.x(), polBoundingRect.y() - 3))
+                QPoint(polBoundingRect.x(), polBoundingRect.y() - 3)
+            )
             textRect.moveBottomLeft(
-                QPoint(polBoundingRect.x() + 2, polBoundingRect.y() - 3))
+                QPoint(polBoundingRect.x() + 2, polBoundingRect.y() - 3)
+            )
         elif polBoundingRect.x() - 3 > textRect.width():
             # left, top aligned
             boundingRect.moveTopRight(
-                QPoint(polBoundingRect.x() - 3, polBoundingRect.y()))
-            textRect.moveTopRight(
-                QPoint(polBoundingRect.x() - 5, polBoundingRect.y()))
+                QPoint(polBoundingRect.x() - 3, polBoundingRect.y())
+            )
+            textRect.moveTopRight(QPoint(polBoundingRect.x() - 5, polBoundingRect.y()))
         elif (
-            (polBoundingRect.bottom() + 3 + textRect.height() <
-             self.rect().bottom()) and
-            polBoundingRect.right() > textRect.width()
-        ):
+            polBoundingRect.bottom() + 3 + textRect.height() < self.rect().bottom()
+        ) and polBoundingRect.right() > textRect.width():
             # at bottom, right aligned
             boundingRect.moveTopRight(
-                QPoint(polBoundingRect.right(), polBoundingRect.bottom() + 3))
+                QPoint(polBoundingRect.right(), polBoundingRect.bottom() + 3)
+            )
             textRect.moveTopRight(
-                QPoint(polBoundingRect.right() - 2,
-                       polBoundingRect.bottom() + 3))
-        elif (
-            polBoundingRect.right() + textRect.width() + 3 <
-            self.rect().width()
-        ):
+                QPoint(polBoundingRect.right() - 2, polBoundingRect.bottom() + 3)
+            )
+        elif polBoundingRect.right() + textRect.width() + 3 < self.rect().width():
             # right, bottom aligned
             boundingRect.moveBottomLeft(
-                QPoint(polBoundingRect.right() + 3, polBoundingRect.bottom()))
+                QPoint(polBoundingRect.right() + 3, polBoundingRect.bottom())
+            )
             textRect.moveBottomLeft(
-                QPoint(polBoundingRect.right() + 5, polBoundingRect.bottom()))
-        
+                QPoint(polBoundingRect.right() + 5, polBoundingRect.bottom())
+            )
+
         # If the above didn't catch it, you are running on a very
         # tiny screen...
         drawPolygon(painter, boundingRect, textColor, textBackgroundColor)
         painter.drawText(textRect, Qt.AlignmentFlag.AlignHCenter, txt)
-        
+
         if (
-            (polBoundingRect.height() > self.__handleSize * 2 and
-             polBoundingRect.width() > self.__handleSize * 2) or
-            not self.__mouseDown
-        ):
+            polBoundingRect.height() > self.__handleSize * 2
+            and polBoundingRect.width() > self.__handleSize * 2
+        ) or not self.__mouseDown:
             painter.setBrush(Qt.GlobalColor.transparent)
             painter.setClipRegion(QRegion(pol))
             painter.drawPolygon(QPolygon(self.rect()))
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse button presses.
-        
+
         @param evt mouse press event (QMouseEvent)
         """
         self.__pBefore = evt.position().toPoint()
-        
-        self.__showHelp = not self.__helpTextRect.contains(
-            evt.position().toPoint())
+
+        self.__showHelp = not self.__helpTextRect.contains(evt.position().toPoint())
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__mouseDown = True
             self.__dragStartPoint = evt.position().toPoint()
             self.__selectionBeforeDrag = QPolygon(self.__selection)
-            if not self.__selection.containsPoint(evt.position().toPoint(),
-                                                  Qt.FillRule.WindingFill):
+            if not self.__selection.containsPoint(
+                evt.position().toPoint(), Qt.FillRule.WindingFill
+            ):
                 self.__newSelection = True
                 self.__selection = QPolygon()
             else:
@@ -271,19 +294,18 @@
             self.__selection = QPolygon()
             self.setCursor(Qt.CursorShape.CrossCursor)
         self.update()
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse movements.
-        
+
         @param evt mouse move event (QMouseEvent)
         """
-        shouldShowHelp = not self.__helpTextRect.contains(
-            evt.position().toPoint())
+        shouldShowHelp = not self.__helpTextRect.contains(evt.position().toPoint())
         if shouldShowHelp != self.__showHelp:
             self.__showHelp = shouldShowHelp
             self.update()
-        
+
         if self.__mouseDown:
             if self.__newSelection:
                 p = evt.position().toPoint()
@@ -294,43 +316,45 @@
                 self.__pBefore = evt.position().toPoint()
                 # save position for next iteration
                 self.__selection.translate(p)
-            
+
             self.update()
         else:
             if self.__selection.boundingRect().isEmpty():
                 return
-            
-            if self.__selection.containsPoint(evt.position().toPoint(),
-                                              Qt.FillRule.WindingFill):
+
+            if self.__selection.containsPoint(
+                evt.position().toPoint(), Qt.FillRule.WindingFill
+            ):
                 self.setCursor(Qt.CursorShape.OpenHandCursor)
             else:
                 self.setCursor(Qt.CursorShape.CrossCursor)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse button releases.
-        
+
         @param evt mouse release event (QMouseEvent)
         """
         self.__mouseDown = False
         self.__newSelection = False
-        if self.__selection.containsPoint(evt.position().toPoint(),
-                                          Qt.FillRule.WindingFill):
+        if self.__selection.containsPoint(
+            evt.position().toPoint(), Qt.FillRule.WindingFill
+        ):
             self.setCursor(Qt.CursorShape.OpenHandCursor)
         self.update()
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double clicks.
-        
+
         @param evt mouse double click event (QMouseEvent)
         """
         self.__grabRegion()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key presses.
-        
+
         @param evt key press event (QKeyEvent)
         """
         if evt.key() == Qt.Key.Key_Escape:
@@ -339,7 +363,7 @@
             self.__grabRegion()
         else:
             evt.ignore()
-    
+
     def __grabRegion(self):
         """
         Private method to grab the selected region (i.e. do the snapshot).
@@ -347,34 +371,31 @@
         pol = QPolygon(self.__selection)
         if not pol.isEmpty():
             self.__grabbing = True
-            
+
             xOffset = self.__pixmap.rect().x() - pol.boundingRect().x()
             yOffset = self.__pixmap.rect().y() - pol.boundingRect().y()
             translatedPol = pol.translated(xOffset, yOffset)
-            
+
             pixmap2 = QPixmap(pol.boundingRect().size())
             pixmap2.fill(Qt.GlobalColor.transparent)
-            
+
             pt = QPainter()
             pt.begin(pixmap2)
-            if pt.paintEngine().hasFeature(
-                QPaintEngine.PaintEngineFeature.PorterDuff
-            ):
+            if pt.paintEngine().hasFeature(QPaintEngine.PaintEngineFeature.PorterDuff):
                 pt.setRenderHints(
-                    QPainter.RenderHint.Antialiasing |
-                    QPainter.RenderHint.SmoothPixmapTransform,
-                    True)
+                    QPainter.RenderHint.Antialiasing
+                    | QPainter.RenderHint.SmoothPixmapTransform,
+                    True,
+                )
                 pt.setBrush(Qt.GlobalColor.black)
                 pt.setPen(QPen(QBrush(Qt.GlobalColor.black), 0.5))
                 pt.drawPolygon(translatedPol)
-                pt.setCompositionMode(
-                    QPainter.CompositionMode.CompositionMode_SourceIn)
+                pt.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceIn)
             else:
                 pt.setClipRegion(QRegion(translatedPol))
-                pt.setCompositionMode(
-                    QPainter.CompositionMode.CompositionMode_Source)
-            
+                pt.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source)
+
             pt.drawPixmap(pixmap2.rect(), self.__pixmap, pol.boundingRect())
             pt.end()
-            
+
             self.grabbed.emit(pixmap2)
--- a/src/eric7/Snapshot/SnapshotModes.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotModes.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,6 +14,7 @@
     """
     Class implementing the snapshot modes.
     """
+
     FULLSCREEN = 0
     SELECTEDSCREEN = 1
     RECTANGLE = 2
--- a/src/eric7/Snapshot/SnapshotPreview.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotPreview.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,68 +14,70 @@
 class SnapshotPreview(QLabel):
     """
     Class implementing the snapshot preview label.
-    
+
     @signal startDrag() emitted to indicate the start of a drag operation
     """
+
     startDrag = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.setAlignment(Qt.AlignmentFlag.AlignHCenter |
-                          Qt.AlignmentFlag.AlignCenter)
+
+        self.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignCenter)
         self.setCursor(Qt.CursorShape.OpenHandCursor)
-        
+
         self.__mouseClickPoint = QPoint(0, 0)
-    
+
     def setPreview(self, preview):
         """
         Public slot to set the preview picture.
-        
+
         @param preview preview picture to be shown (QPixmap)
         """
         pixmap = (
             preview.scaled(
-                self.width(), self.height(),
+                self.width(),
+                self.height(),
                 Qt.AspectRatioMode.KeepAspectRatio,
-                Qt.TransformationMode.SmoothTransformation)
-            if not preview.isNull() else
-            preview
+                Qt.TransformationMode.SmoothTransformation,
+            )
+            if not preview.isNull()
+            else preview
         )
         self.setPixmap(pixmap)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse button presses.
-        
+
         @param evt mouse button press event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__mouseClickPoint = evt.position().toPoint()
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse button releases.
-        
+
         @param evt mouse button release event (QMouseEvent)
         """
         self.__mouseClickPoint = QPoint(0, 0)
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse moves.
-        
+
         @param evt mouse move event (QMouseEvent)
         """
         if (
-            self.__mouseClickPoint != QPoint(0, 0) and (
-                evt.position().toPoint() - self.__mouseClickPoint
-            ).manhattanLength() > QApplication.startDragDistance()
+            self.__mouseClickPoint != QPoint(0, 0)
+            and (evt.position().toPoint() - self.__mouseClickPoint).manhattanLength()
+            > QApplication.startDragDistance()
         ):
             self.__mouseClickPoint = QPoint(0, 0)
             self.startDrag.emit()
--- a/src/eric7/Snapshot/SnapshotRegionGrabber.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotRegionGrabber.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,16 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QRect, QPoint, QTimer, QLocale
 from PyQt6.QtGui import (
-    QPixmap, QColor, QRegion, QPainter, QPalette, QPaintEngine, QPen, QBrush,
-    QGuiApplication, QCursor
+    QPixmap,
+    QColor,
+    QRegion,
+    QPainter,
+    QPalette,
+    QPaintEngine,
+    QPen,
+    QBrush,
+    QGuiApplication,
+    QCursor,
 )
 from PyQt6.QtWidgets import QWidget, QToolTip
 
@@ -20,7 +28,7 @@
 def drawRect(painter, rect, outline, fill=None):
     """
     Module function to draw a rectangle with the given parameters.
-    
+
     @param painter reference to the painter to be used (QPainter)
     @param rect rectangle to be drawn (QRect)
     @param outline color of the outline (QColor)
@@ -28,7 +36,7 @@
     """
     clip = QRegion(rect)
     clip = clip.subtracted(QRegion(rect.adjusted(1, 1, -1, -1)))
-    
+
     painter.save()
     painter.setClipRegion(clip)
     painter.setPen(Qt.PenStyle.NoPen)
@@ -44,21 +52,22 @@
 class SnapshotRegionGrabber(QWidget):
     """
     Class implementing a grabber widget for a rectangular snapshot region.
-    
+
     @signal grabbed(QPixmap) emitted after the region was grabbed
     """
+
     grabbed = pyqtSignal(QPixmap)
-    
+
     StrokeMask = 0
     FillMask = 1
-    
+
     Rectangle = 0
     Ellipse = 1
-    
+
     def __init__(self, mode=Rectangle):
         """
         Constructor
-        
+
         @param mode region grabber mode (SnapshotRegionGrabber.Rectangle or
             SnapshotRegionGrabber.Ellipse)
         @exception ValueError raised to indicate a bad value for the 'mode'
@@ -66,17 +75,16 @@
         """
         super().__init__(
             None,
-            Qt.WindowType.X11BypassWindowManagerHint |
-            Qt.WindowType.WindowStaysOnTopHint |
-            Qt.WindowType.FramelessWindowHint |
-            Qt.WindowType.Tool
+            Qt.WindowType.X11BypassWindowManagerHint
+            | Qt.WindowType.WindowStaysOnTopHint
+            | Qt.WindowType.FramelessWindowHint
+            | Qt.WindowType.Tool,
         )
-        
-        if mode not in [SnapshotRegionGrabber.Rectangle,
-                        SnapshotRegionGrabber.Ellipse]:
+
+        if mode not in [SnapshotRegionGrabber.Rectangle, SnapshotRegionGrabber.Ellipse]:
             raise ValueError("Bad value for 'mode' parameter.")
         self.__mode = mode
-        
+
         self.__selection = QRect()
         self.__mouseDown = False
         self.__newSelection = False
@@ -87,7 +95,7 @@
         self.__dragStartPoint = QPoint()
         self.__selectionBeforeDrag = QRect()
         self.__locale = QLocale()
-        
+
         # naming conventions for handles
         # T top, B bottom, R Right, L left
         # 2 letters: a corner
@@ -100,20 +108,28 @@
         self.__THandle = QRect(0, 0, self.__handleSize, self.__handleSize)
         self.__RHandle = QRect(0, 0, self.__handleSize, self.__handleSize)
         self.__BHandle = QRect(0, 0, self.__handleSize, self.__handleSize)
-        self.__handles = [self.__TLHandle, self.__TRHandle, self.__BLHandle,
-                          self.__BRHandle, self.__LHandle, self.__THandle,
-                          self.__RHandle, self.__BHandle]
+        self.__handles = [
+            self.__TLHandle,
+            self.__TRHandle,
+            self.__BLHandle,
+            self.__BRHandle,
+            self.__LHandle,
+            self.__THandle,
+            self.__RHandle,
+            self.__BHandle,
+        ]
         self.__helpTextRect = QRect()
         self.__helpText = self.tr(
             "Select a region using the mouse. To take the snapshot, press"
-            " the Enter key or double click. Press Esc to quit.")
-        
+            " the Enter key or double click. Press Esc to quit."
+        )
+
         self.__pixmap = QPixmap()
-        
+
         self.setMouseTracking(True)
-        
+
         QTimer.singleShot(200, self.__initialize)
-    
+
     def __initialize(self):
         """
         Private slot to initialize the rest of the widget.
@@ -123,14 +139,16 @@
             screen = QGuiApplication.screenAt(QCursor.pos())
             geom = screen.geometry()
             self.__pixmap = screen.grabWindow(
-                0, geom.x(), geom.y(), geom.width(), geom.height())
+                0, geom.x(), geom.y(), geom.width(), geom.height()
+            )
         else:
             # Linux variant
             # Windows variant
             screen = QGuiApplication.screens()[0]
             geom = screen.availableVirtualGeometry()
             self.__pixmap = screen.grabWindow(
-                0, geom.x(), geom.y(), geom.width(), geom.height())
+                0, geom.x(), geom.y(), geom.width(), geom.height()
+            )
         self.resize(self.__pixmap.size())
         self.move(geom.x(), geom.y())
         self.setCursor(Qt.CursorShape.CrossCursor)
@@ -139,31 +157,32 @@
         self.grabMouse()
         self.grabKeyboard()
         self.activateWindow()
-    
+
     def paintEvent(self, evt):
         """
         Protected method handling paint events.
-        
+
         @param evt paint event (QPaintEvent)
         """
-        if self.__grabbing:     # grabWindow() should just get the background
+        if self.__grabbing:  # grabWindow() should just get the background
             return
-        
+
         painter = QPainter(self)
         pal = QPalette(QToolTip.palette())
         font = QToolTip.font()
-        
-        handleColor = pal.color(QPalette.ColorGroup.Active,
-                                QPalette.ColorRole.Highlight)
+
+        handleColor = pal.color(
+            QPalette.ColorGroup.Active, QPalette.ColorRole.Highlight
+        )
         handleColor.setAlpha(160)
         overlayColor = QColor(0, 0, 0, 160)
-        textColor = pal.color(QPalette.ColorGroup.Active,
-                              QPalette.ColorRole.Text)
-        textBackgroundColor = pal.color(QPalette.ColorGroup.Active,
-                                        QPalette.ColorRole.Base)
+        textColor = pal.color(QPalette.ColorGroup.Active, QPalette.ColorRole.Text)
+        textBackgroundColor = pal.color(
+            QPalette.ColorGroup.Active, QPalette.ColorRole.Base
+        )
         painter.drawPixmap(0, 0, self.__pixmap)
         painter.setFont(font)
-        
+
         r = QRect(self.__selection)
         if not self.__selection.isNull():
             grey = QRegion(self.rect())
@@ -178,23 +197,26 @@
             painter.drawRect(self.rect())
             painter.setClipRect(self.rect())
             drawRect(painter, r, handleColor)
-        
+
         if self.__showHelp:
             painter.setPen(textColor)
             painter.setBrush(textBackgroundColor)
             self.__helpTextRect = painter.boundingRect(
                 self.rect().adjusted(2, 2, -2, -2),
-                Qt.TextFlag.TextWordWrap, self.__helpText).translated(0, 0)
+                Qt.TextFlag.TextWordWrap,
+                self.__helpText,
+            ).translated(0, 0)
             self.__helpTextRect.adjust(-2, -2, 4, 2)
-            drawRect(painter, self.__helpTextRect, textColor,
-                     textBackgroundColor)
+            drawRect(painter, self.__helpTextRect, textColor, textBackgroundColor)
             painter.drawText(
                 self.__helpTextRect.adjusted(3, 3, -3, -3),
-                Qt.TextFlag.TextWordWrap, self.__helpText)
-        
+                Qt.TextFlag.TextWordWrap,
+                self.__helpText,
+            )
+
         if self.__selection.isNull():
             return
-        
+
         # The grabbed region is everything which is covered by the drawn
         # rectangles (border included). This means that there is no 0px
         # selection, since a 0px wide rectangle will always be drawn as a line.
@@ -202,24 +224,23 @@
             self.__locale.toString(self.__selection.x()),
             self.__locale.toString(self.__selection.y()),
             self.__locale.toString(self.__selection.width()),
-            self.__locale.toString(self.__selection.height())
+            self.__locale.toString(self.__selection.height()),
         )
-        textRect = painter.boundingRect(self.rect(),
-                                        Qt.AlignmentFlag.AlignLeft, txt)
+        textRect = painter.boundingRect(self.rect(), Qt.AlignmentFlag.AlignLeft, txt)
         boundingRect = textRect.adjusted(-4, 0, 0, 0)
-        
+
         if (
-            textRect.width() < r.width() - 2 * self.__handleSize and
-            textRect.height() < r.height() - 2 * self.__handleSize and
-            r.width() > 100 and
-            r.height() > 100
+            textRect.width() < r.width() - 2 * self.__handleSize
+            and textRect.height() < r.height() - 2 * self.__handleSize
+            and r.width() > 100
+            and r.height() > 100
         ):
             # center, unsuitable for small selections
             boundingRect.moveCenter(r.center())
             textRect.moveCenter(r.center())
         elif (
-            r.y() - 3 > textRect.height() and
-            r.x() + textRect.width() < self.rect().width()
+            r.y() - 3 > textRect.height()
+            and r.x() + textRect.width() < self.rect().width()
         ):
             # on top, left aligned
             boundingRect.moveBottomLeft(QPoint(r.x(), r.y() - 3))
@@ -229,8 +250,8 @@
             boundingRect.moveTopRight(QPoint(r.x() - 3, r.y()))
             textRect.moveTopRight(QPoint(r.x() - 5, r.y()))
         elif (
-            r.bottom() + 3 + textRect.height() < self.rect().bottom() and
-            r.right() > textRect.width()
+            r.bottom() + 3 + textRect.height() < self.rect().bottom()
+            and r.right() > textRect.width()
         ):
             # at bottom, right aligned
             boundingRect.moveTopRight(QPoint(r.right(), r.bottom() + 3))
@@ -239,38 +260,34 @@
             # right, bottom aligned
             boundingRect.moveBottomLeft(QPoint(r.right() + 3, r.bottom()))
             textRect.moveBottomLeft(QPoint(r.right() + 5, r.bottom()))
-        
+
         # If the above didn't catch it, you are running on a very
         # tiny screen...
         drawRect(painter, boundingRect, textColor, textBackgroundColor)
         painter.drawText(textRect, Qt.AlignmentFlag.AlignHCenter, txt)
-        
+
         if (
-            (r.height() > self.__handleSize * 2 and
-             r.width() > self.__handleSize * 2) or
-            not self.__mouseDown
-        ):
+            r.height() > self.__handleSize * 2 and r.width() > self.__handleSize * 2
+        ) or not self.__mouseDown:
             self.__updateHandles()
             painter.setPen(Qt.PenStyle.NoPen)
             painter.setBrush(handleColor)
-            painter.setClipRegion(
-                self.__handleMask(SnapshotRegionGrabber.StrokeMask))
+            painter.setClipRegion(self.__handleMask(SnapshotRegionGrabber.StrokeMask))
             painter.drawRect(self.rect())
             handleColor.setAlpha(60)
             painter.setBrush(handleColor)
-            painter.setClipRegion(
-                self.__handleMask(SnapshotRegionGrabber.FillMask))
+            painter.setClipRegion(self.__handleMask(SnapshotRegionGrabber.FillMask))
             painter.drawRect(self.rect())
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt resize event (QResizeEvent)
         """
         if self.__selection.isNull():
             return
-        
+
         r = QRect(self.__selection)
         r.setTopLeft(self.__limitPointToRect(r.topLeft(), self.rect()))
         r.setBottomRight(self.__limitPointToRect(r.bottomRight(), self.rect()))
@@ -279,15 +296,14 @@
             self.__selection = QRect()
         else:
             self.__selection = self.__normalizeSelection(r)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse button presses.
-        
+
         @param evt mouse press event (QMouseEvent)
         """
-        self.__showHelp = not self.__helpTextRect.contains(
-            evt.position().toPoint())
+        self.__showHelp = not self.__helpTextRect.contains(evt.position().toPoint())
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__mouseDown = True
             self.__dragStartPoint = evt.position().toPoint()
@@ -302,77 +318,84 @@
             self.__selection = QRect()
             self.setCursor(Qt.CursorShape.CrossCursor)
         self.update()
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse movements.
-        
+
         @param evt mouse move event (QMouseEvent)
         """
-        shouldShowHelp = not self.__helpTextRect.contains(
-            evt.position().toPoint())
+        shouldShowHelp = not self.__helpTextRect.contains(evt.position().toPoint())
         if shouldShowHelp != self.__showHelp:
             self.__showHelp = shouldShowHelp
             self.update()
-        
+
         if self.__mouseDown:
             if self.__newSelection:
                 p = evt.position().toPoint()
                 r = self.rect()
                 self.__selection = self.__normalizeSelection(
-                    QRect(self.__dragStartPoint,
-                          self.__limitPointToRect(p, r)))
+                    QRect(self.__dragStartPoint, self.__limitPointToRect(p, r))
+                )
             elif self.__mouseOverHandle is None:
                 # moving the whole selection
                 r = self.rect().normalized()
                 s = self.__selectionBeforeDrag.normalized()
-                p = (
-                    s.topLeft() + evt.position().toPoint() -
-                    self.__dragStartPoint
+                p = s.topLeft() + evt.position().toPoint() - self.__dragStartPoint
+                r.setBottomRight(
+                    r.bottomRight() - QPoint(s.width(), s.height()) + QPoint(1, 1)
                 )
-                r.setBottomRight(
-                    r.bottomRight() - QPoint(s.width(), s.height()) +
-                    QPoint(1, 1))
                 if not r.isNull() and r.isValid():
                     self.__selection.moveTo(self.__limitPointToRect(p, r))
             else:
                 # dragging a handle
                 r = QRect(self.__selectionBeforeDrag)
                 offset = evt.position().toPoint() - self.__dragStartPoint
-                
+
                 if self.__mouseOverHandle in [
-                        self.__TLHandle, self.__THandle, self.__TRHandle]:
+                    self.__TLHandle,
+                    self.__THandle,
+                    self.__TRHandle,
+                ]:
                     r.setTop(r.top() + offset.y())
-                
+
                 if self.__mouseOverHandle in [
-                        self.__TLHandle, self.__LHandle, self.__BLHandle]:
+                    self.__TLHandle,
+                    self.__LHandle,
+                    self.__BLHandle,
+                ]:
                     r.setLeft(r.left() + offset.x())
-                
+
                 if self.__mouseOverHandle in [
-                        self.__BLHandle, self.__BHandle, self.__BRHandle]:
+                    self.__BLHandle,
+                    self.__BHandle,
+                    self.__BRHandle,
+                ]:
                     r.setBottom(r.bottom() + offset.y())
-                
+
                 if self.__mouseOverHandle in [
-                        self.__TRHandle, self.__RHandle, self.__BRHandle]:
+                    self.__TRHandle,
+                    self.__RHandle,
+                    self.__BRHandle,
+                ]:
                     r.setRight(r.right() + offset.x())
-                
+
                 r.setTopLeft(self.__limitPointToRect(r.topLeft(), self.rect()))
-                r.setBottomRight(
-                    self.__limitPointToRect(r.bottomRight(), self.rect()))
+                r.setBottomRight(self.__limitPointToRect(r.bottomRight(), self.rect()))
                 self.__selection = self.__normalizeSelection(r)
-            
+
             self.update()
         else:
             if self.__selection.isNull():
                 return
-            
+
             found = False
             for r in self.__handles:
                 if r.contains(evt.position().toPoint()):
                     self.__mouseOverHandle = r
                     found = True
                     break
-            
+
             if not found:
                 self.__mouseOverHandle = None
                 if self.__selection.contains(evt.position().toPoint()):
@@ -380,46 +403,41 @@
                 else:
                     self.setCursor(Qt.CursorShape.CrossCursor)
             else:
-                if self.__mouseOverHandle in [self.__TLHandle,
-                                              self.__BRHandle]:
+                if self.__mouseOverHandle in [self.__TLHandle, self.__BRHandle]:
                     self.setCursor(Qt.CursorShape.SizeFDiagCursor)
-                elif self.__mouseOverHandle in [self.__TRHandle,
-                                                self.__BLHandle]:
+                elif self.__mouseOverHandle in [self.__TRHandle, self.__BLHandle]:
                     self.setCursor(Qt.CursorShape.SizeBDiagCursor)
-                elif self.__mouseOverHandle in [self.__LHandle,
-                                                self.__RHandle]:
+                elif self.__mouseOverHandle in [self.__LHandle, self.__RHandle]:
                     self.setCursor(Qt.CursorShape.SizeHorCursor)
-                elif self.__mouseOverHandle in [self.__THandle,
-                                                self.__BHandle]:
+                elif self.__mouseOverHandle in [self.__THandle, self.__BHandle]:
                     self.setCursor(Qt.CursorShape.SizeVerCursor)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse button releases.
-        
+
         @param evt mouse release event (QMouseEvent)
         """
         self.__mouseDown = False
         self.__newSelection = False
-        if (
-            self.__mouseOverHandle is None and
-            self.__selection.contains(evt.position().toPoint())
+        if self.__mouseOverHandle is None and self.__selection.contains(
+            evt.position().toPoint()
         ):
             self.setCursor(Qt.CursorShape.OpenHandCursor)
         self.update()
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double clicks.
-        
+
         @param evt mouse double click event (QMouseEvent)
         """
         self.__grabRect()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key presses.
-        
+
         @param evt key press event (QKeyEvent)
         """
         if evt.key() == Qt.Key.Key_Escape:
@@ -428,32 +446,28 @@
             self.__grabRect()
         else:
             evt.ignore()
-    
+
     def __updateHandles(self):
         """
         Private method to update the handles.
         """
         r = QRect(self.__selection)
         s2 = self.__handleSize // 2
-        
+
         self.__TLHandle.moveTopLeft(r.topLeft())
         self.__TRHandle.moveTopRight(r.topRight())
         self.__BLHandle.moveBottomLeft(r.bottomLeft())
         self.__BRHandle.moveBottomRight(r.bottomRight())
-        
-        self.__LHandle.moveTopLeft(
-            QPoint(r.x(), r.y() + r.height() // 2 - s2))
-        self.__THandle.moveTopLeft(
-            QPoint(r.x() + r.width() // 2 - s2, r.y()))
-        self.__RHandle.moveTopRight(
-            QPoint(r.right(), r.y() + r.height() // 2 - s2))
-        self.__BHandle.moveBottomLeft(
-            QPoint(r.x() + r.width() // 2 - s2, r.bottom()))
-    
+
+        self.__LHandle.moveTopLeft(QPoint(r.x(), r.y() + r.height() // 2 - s2))
+        self.__THandle.moveTopLeft(QPoint(r.x() + r.width() // 2 - s2, r.y()))
+        self.__RHandle.moveTopRight(QPoint(r.right(), r.y() + r.height() // 2 - s2))
+        self.__BHandle.moveBottomLeft(QPoint(r.x() + r.width() // 2 - s2, r.bottom()))
+
     def __handleMask(self, maskType):
         """
         Private method to calculate the handle mask.
-        
+
         @param maskType type of the mask to be used
             (SnapshotRegionGrabber.FillMask or
             SnapshotRegionGrabber.StrokeMask)
@@ -467,11 +481,11 @@
             else:
                 mask += QRegion(rect.adjusted(1, 1, -1, -1))
         return mask
-    
+
     def __limitPointToRect(self, point, rect):
         """
         Private method to limit the given point to the given rectangle.
-        
+
         @param point point to be limited (QPoint)
         @param rect rectangle the point shall be limited to (QRect)
         @return limited point (QPoint)
@@ -490,11 +504,11 @@
         else:
             q.setY(rect.bottom())
         return q
-    
+
     def __normalizeSelection(self, sel):
         """
         Private method to normalize the given selection.
-        
+
         @param sel selection to be normalized (QRect)
         @return normalized selection (QRect)
         """
@@ -510,7 +524,7 @@
             rect.setTop(top + height - 1)
             rect.setBottom(top)
         return rect
-    
+
     def __grabRect(self):
         """
         Private method to grab the selected rectangle (i.e. do the snapshot).
@@ -519,37 +533,39 @@
             ell = QRegion(self.__selection, QRegion.RegionType.Ellipse)
             if not ell.isEmpty():
                 self.__grabbing = True
-                
+
                 xOffset = self.__pixmap.rect().x() - ell.boundingRect().x()
                 yOffset = self.__pixmap.rect().y() - ell.boundingRect().y()
                 translatedEll = ell.translated(xOffset, yOffset)
-                
+
                 pixmap2 = QPixmap(ell.boundingRect().size())
                 pixmap2.fill(Qt.GlobalColor.transparent)
-                
+
                 pt = QPainter()
                 pt.begin(pixmap2)
                 if pt.paintEngine().hasFeature(
                     QPaintEngine.PaintEngineFeature.PorterDuff
                 ):
                     pt.setRenderHints(
-                        QPainter.RenderHint.Antialiasing |
-                        QPainter.RenderHint.SmoothPixmapTransform,
-                        True)
+                        QPainter.RenderHint.Antialiasing
+                        | QPainter.RenderHint.SmoothPixmapTransform,
+                        True,
+                    )
                     pt.setBrush(Qt.GlobalColor.black)
                     pt.setPen(QPen(QBrush(Qt.GlobalColor.black), 0.5))
                     pt.drawEllipse(translatedEll.boundingRect())
                     pt.setCompositionMode(
-                        QPainter.CompositionMode.CompositionMode_SourceIn)
+                        QPainter.CompositionMode.CompositionMode_SourceIn
+                    )
                 else:
                     pt.setClipRegion(translatedEll)
                     pt.setCompositionMode(
-                        QPainter.CompositionMode.CompositionMode_Source)
-                
-                pt.drawPixmap(pixmap2.rect(), self.__pixmap,
-                              ell.boundingRect())
+                        QPainter.CompositionMode.CompositionMode_Source
+                    )
+
+                pt.drawPixmap(pixmap2.rect(), self.__pixmap, ell.boundingRect())
                 pt.end()
-                
+
                 self.grabbed.emit(pixmap2)
         else:
             r = QRect(self.__selection)
--- a/src/eric7/Snapshot/SnapshotTimer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotTimer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,55 +15,57 @@
 class SnapshotTimer(QWidget):
     """
     Class implementing the snapshot timer widget.
-    
+
     @signal timeout() emitted after the timer timed out
     """
+
     timeout = pyqtSignal()
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__(None)
-        
+
         self.setWindowFlags(
-            Qt.WindowType.WindowStaysOnTopHint |
-            Qt.WindowType.FramelessWindowHint |
-            Qt.WindowType.X11BypassWindowManagerHint
+            Qt.WindowType.WindowStaysOnTopHint
+            | Qt.WindowType.FramelessWindowHint
+            | Qt.WindowType.X11BypassWindowManagerHint
         )
-        
+
         self.__timer = QTimer()
         self.__textRect = QRect()
         self.__time = 0
         self.__length = 0
         self.__toggle = True
-        
+
         # text is taken from paintEvent with maximum number plus some margin
         try:
-            fmWidth = self.fontMetrics().horizontalAdvance(self.tr(
-                "Snapshot will be taken in %n seconds", "", 99))
+            fmWidth = self.fontMetrics().horizontalAdvance(
+                self.tr("Snapshot will be taken in %n seconds", "", 99)
+            )
         except AttributeError:
-            fmWidth = self.fontMetrics().width(self.tr(
-                "Snapshot will be taken in %n seconds", "", 99))
+            fmWidth = self.fontMetrics().width(
+                self.tr("Snapshot will be taken in %n seconds", "", 99)
+            )
         self.resize(fmWidth + 6, self.fontMetrics().height() + 4)
-        
+
         self.__timer.timeout.connect(self.__bell)
-    
+
     def start(self, seconds):
         """
         Public method to start the timer.
-        
+
         @param seconds timeout value (integer)
         """
         screenGeom = QApplication.screens()[0].geometry()
-        self.move(screenGeom.width() // 2 - self.size().width() // 2,
-                  screenGeom.top())
+        self.move(screenGeom.width() // 2 - self.size().width() // 2, screenGeom.top())
         self.__toggle = True
         self.__time = 0
         self.__length = seconds
         self.__timer.start(1000)
         self.show()
-    
+
     def stop(self):
         """
         Public method to stop the timer.
@@ -71,7 +73,7 @@
         self.setVisible(False)
         self.hide()
         self.__timer.stop()
-    
+
     def __bell(self):
         """
         Private slot handling timer timeouts.
@@ -82,53 +84,59 @@
             if self.__time == self.__length:
                 self.__timer.stop()
                 self.timeout.emit()
-        
+
         self.__time += 1
         self.__toggle = not self.__toggle
         self.update()
-    
+
     def paintEvent(self, evt):
         """
         Protected method handling paint events.
-        
+
         @param evt paint event (QPaintEvent)
         """
         painter = QPainter(self)
-        
+
         if self.__time < self.__length:
             pal = QToolTip.palette()
-            textBackgroundColor = pal.color(QPalette.ColorGroup.Active,
-                                            QPalette.ColorRole.Base)
+            textBackgroundColor = pal.color(
+                QPalette.ColorGroup.Active, QPalette.ColorRole.Base
+            )
             if self.__toggle:
-                textColor = pal.color(QPalette.ColorGroup.Active,
-                                      QPalette.ColorRole.Text)
+                textColor = pal.color(
+                    QPalette.ColorGroup.Active, QPalette.ColorRole.Text
+                )
             else:
-                textColor = pal.color(QPalette.ColorGroup.Active,
-                                      QPalette.ColorRole.Base)
+                textColor = pal.color(
+                    QPalette.ColorGroup.Active, QPalette.ColorRole.Base
+                )
             painter.setPen(textColor)
             painter.setBrush(textBackgroundColor)
-            helpText = self.tr("Snapshot will be taken in %n seconds", "",
-                               self.__length - self.__time)
+            helpText = self.tr(
+                "Snapshot will be taken in %n seconds", "", self.__length - self.__time
+            )
             textRect = painter.boundingRect(
                 self.rect().adjusted(2, 2, -2, -2),
                 Qt.AlignmentFlag.AlignHCenter | Qt.TextFlag.TextSingleLine,
-                helpText)
+                helpText,
+            )
             painter.drawText(
                 textRect,
                 Qt.AlignmentFlag.AlignHCenter | Qt.TextFlag.TextSingleLine,
-                helpText)
-    
+                helpText,
+            )
+
     def enterEvent(self, evt):
         """
         Protected method handling the mouse cursor entering the widget.
-        
+
         @param evt enter event (QEvent)
         """
         screenGeom = QApplication.screens()[0].geometry()
         if self.x() == screenGeom.left():
             self.move(
-                screenGeom.x() +
-                (screenGeom.width() // 2 - self.size().width() // 2),
-                screenGeom.top())
+                screenGeom.x() + (screenGeom.width() // 2 - self.size().width() // 2),
+                screenGeom.top(),
+            )
         else:
             self.move(screenGeom.topLeft())
--- a/src/eric7/Snapshot/SnapshotWaylandGrabber.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Snapshot/SnapshotWaylandGrabber.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,6 +17,7 @@
 
 try:
     from PyQt6.QtDBus import QDBusInterface, QDBusMessage
+
     DBusAvailable = True
 except ImportError:
     DBusAvailable = False
@@ -31,28 +32,30 @@
 class SnapshotWaylandGrabber(QObject):
     """
     Class implementing a grabber object for non-Wayland desktops.
-    
+
     @signal grabbed(QPixmap) emitted after the grab operation is finished
     """
+
     grabbed = pyqtSignal(QPixmap)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         from .SnapshotTimer import SnapshotTimer
+
         self.__grabTimer = SnapshotTimer()
         self.__grabTimer.timeout.connect(self.__performGrab)
-    
+
     def supportedModes(self):
         """
         Public method to get the supported screenshot modes.
-        
+
         @return tuple of supported screenshot modes
         @rtype tuple of SnapshotModes
         """
@@ -72,12 +75,11 @@
             )
         else:
             return ()
-    
-    def grab(self, mode, delay=0, captureCursor=False,
-             captureDecorations=False):
+
+    def grab(self, mode, delay=0, captureCursor=False, captureDecorations=False):
         """
         Public method to perform a grab operation potentially after a delay.
-        
+
         @param mode screenshot mode
         @type ScreenshotModes
         @param delay delay in seconds
@@ -92,7 +94,7 @@
             # just to play it safe
             self.grabbed.emit(QPixmap())
             return
-        
+
         self.__mode = mode
         self.__captureCursor = captureCursor
         self.__captureDecorations = captureDecorations
@@ -100,19 +102,21 @@
             self.__grabTimer.start(delay)
         else:
             QTimer.singleShot(200, self.__performGrab)
-    
+
     def __performGrab(self):
         """
         Private method to perform the grab operations.
-        
+
         @exception RuntimeError raised to indicate an unsupported grab mode
         """
         if self.__mode not in (
-            SnapshotModes.FULLSCREEN, SnapshotModes.SELECTEDSCREEN,
-            SnapshotModes.SELECTEDWINDOW, SnapshotModes.RECTANGLE,
+            SnapshotModes.FULLSCREEN,
+            SnapshotModes.SELECTEDSCREEN,
+            SnapshotModes.SELECTEDWINDOW,
+            SnapshotModes.RECTANGLE,
         ):
             raise RuntimeError("unsupported grab mode given")
-        
+
         if self.__mode == SnapshotModes.FULLSCREEN:
             self.__grabFullscreen()
         elif self.__mode == SnapshotModes.SELECTEDSCREEN:
@@ -121,23 +125,18 @@
             self.__grabSelectedWindow()
         else:
             self.__grabRectangle()
-    
+
     def __grabFullscreen(self):
         """
         Private method to grab the complete desktop.
         """
         snapshot = QPixmap()
-        
+
         if Globals.isKdeDesktop():
             interface = QDBusInterface(
-                "org.kde.KWin",
-                "/Screenshot",
-                "org.kde.kwin.Screenshot"
+                "org.kde.KWin", "/Screenshot", "org.kde.kwin.Screenshot"
             )
-            reply = interface.call(
-                "screenshotFullscreen",
-                self.__captureCursor
-            )
+            reply = interface.call("screenshotFullscreen", self.__captureCursor)
             if self.__checkReply(reply, 1):
                 filename = reply.arguments()[0]
                 if filename:
@@ -149,29 +148,24 @@
             interface = QDBusInterface(
                 "org.gnome.Shell",
                 "/org/gnome/Shell/Screenshot",
-                "org.gnome.Shell.Screenshot"
+                "org.gnome.Shell.Screenshot",
             )
-            reply = interface.call(
-                "Screenshot",
-                self.__captureCursor,
-                False,
-                path
-            )
+            reply = interface.call("Screenshot", self.__captureCursor, False, path)
             if self.__checkReply(reply, 2):
                 filename = reply.arguments()[1]
                 if filename:
                     snapshot = QPixmap(filename)
                     with contextlib.suppress(OSError):
                         os.remove(filename)
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def __grabSelectedScreen(self):
         """
         Private method to grab a selected screen.
         """
         snapshot = QPixmap()
-        
+
         if Globals.isKdeDesktop():
             screen = QApplication.screenAt(QCursor.pos())
             try:
@@ -179,18 +173,12 @@
             except ValueError:
                 # default to screen 0
                 screenId = 0
-            
+
             # Step 2: grab the screen
             interface = QDBusInterface(
-                "org.kde.KWin",
-                "/Screenshot",
-                "org.kde.kwin.Screenshot"
+                "org.kde.KWin", "/Screenshot", "org.kde.kwin.Screenshot"
             )
-            reply = interface.call(
-                "screenshotScreen",
-                screenId,
-                self.__captureCursor
-            )
+            reply = interface.call("screenshotScreen", screenId, self.__captureCursor)
             if self.__checkReply(reply, 1):
                 filename = reply.arguments()[0]
                 if filename:
@@ -203,14 +191,14 @@
             interface = QDBusInterface(
                 "org.gnome.Shell",
                 "/org/gnome/Shell/Screenshot",
-                "org.gnome.Shell.Screenshot"
+                "org.gnome.Shell.Screenshot",
             )
             reply = interface.call(
                 "ScreenshotWindow",
                 self.__captureDecorations,
                 self.__captureCursor,
                 False,
-                path
+                path,
             )
             if self.__checkReply(reply, 2):
                 filename = reply.arguments()[1]
@@ -218,22 +206,22 @@
                     snapshot = QPixmap(filename)
                     with contextlib.suppress(OSError):
                         os.remove(filename)
-                    
+
                     # Step 2: extract the area of the screen containing
                     #         the cursor
                     if not snapshot.isNull():
                         screen = QApplication.screenAt(QCursor.pos())
                         geom = screen.geometry()
                         snapshot = snapshot.copy(geom)
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def __grabSelectedWindow(self):
         """
         Private method to grab a selected window.
         """
         snapshot = QPixmap()
-        
+
         if Globals.isKdeDesktop():
             mask = 0
             if self.__captureDecorations:
@@ -241,14 +229,9 @@
             if self.__captureCursor:
                 mask |= 2
             interface = QDBusInterface(
-                "org.kde.KWin",
-                "/Screenshot",
-                "org.kde.kwin.Screenshot"
+                "org.kde.KWin", "/Screenshot", "org.kde.kwin.Screenshot"
             )
-            reply = interface.call(
-                "interactive",
-                mask
-            )
+            reply = interface.call("interactive", mask)
             if self.__checkReply(reply, 1):
                 filename = reply.arguments()[0]
                 if filename:
@@ -260,14 +243,14 @@
             interface = QDBusInterface(
                 "org.gnome.Shell",
                 "/org/gnome/Shell/Screenshot",
-                "org.gnome.Shell.Screenshot"
+                "org.gnome.Shell.Screenshot",
             )
             reply = interface.call(
                 "ScreenshotWindow",
                 self.__captureDecorations,
                 self.__captureCursor,
                 False,
-                path
+                path,
             )
             if self.__checkReply(reply, 2):
                 filename = reply.arguments()[1]
@@ -275,33 +258,30 @@
                     snapshot = QPixmap(filename)
                     with contextlib.suppress(OSError):
                         os.remove(filename)
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def __grabRectangle(self):
         """
         Private method to grab a rectangular desktop area.
         """
         snapshot = QPixmap()
-        
+
         if Globals.isGnomeDesktop():
             # Step 1: let the user select the area
             interface = QDBusInterface(
                 "org.gnome.Shell",
                 "/org/gnome/Shell/Screenshot",
-                "org.gnome.Shell.Screenshot"
+                "org.gnome.Shell.Screenshot",
             )
             reply = interface.call("SelectArea")
             if self.__checkReply(reply, 4):
                 x, y, width, height = reply.arguments()[:4]
-                
+
                 # Step 2: grab the selected area
                 path = self.__temporaryFilename()
                 reply = interface.call(
-                    "ScreenshotArea",
-                    x, y, width, height,
-                    False,
-                    path
+                    "ScreenshotArea", x, y, width, height, False, path
                 )
                 if self.__checkReply(reply, 2):
                     filename = reply.arguments()[1]
@@ -309,13 +289,13 @@
                         snapshot = QPixmap(filename)
                         with contextlib.suppress(OSError):
                             os.remove(filename)
-        
+
         self.grabbed.emit(snapshot)
-    
+
     def __checkReply(self, reply, argumentsCount):
         """
         Private method to check, if a reply is valid.
-        
+
         @param reply reference to the reply message
         @type QDBusMessage
         @param argumentsCount number of expected arguments
@@ -326,45 +306,51 @@
         if reply.type() == QDBusMessage.MessageType.ReplyMessage:
             if len(reply.arguments()) == argumentsCount:
                 return True
-            
+
             EricMessageBox.warning(
                 None,
                 self.tr("Screenshot Error"),
-                self.tr("<p>Received an unexpected number of reply arguments."
-                        " Expected {0} but got {1}</p>").format(
+                self.tr(
+                    "<p>Received an unexpected number of reply arguments."
+                    " Expected {0} but got {1}</p>"
+                ).format(
                     argumentsCount,
                     len(reply.arguments()),
-                ))
-        
+                ),
+            )
+
         elif reply.type() == QDBusMessage.MessageType.ErrorMessage:
             EricMessageBox.warning(
                 None,
                 self.tr("Screenshot Error"),
-                self.tr("<p>Received error <b>{0}</b> from DBus while"
-                        " performing screenshot.</p><p>{1}</p>").format(
+                self.tr(
+                    "<p>Received error <b>{0}</b> from DBus while"
+                    " performing screenshot.</p><p>{1}</p>"
+                ).format(
                     reply.errorName(),
                     reply.errorMessage(),
-                ))
-        
+                ),
+            )
+
         elif reply.type() == QDBusMessage.MessageType.InvalidMessage:
             EricMessageBox.warning(
-                None,
-                self.tr("Screenshot Error"),
-                self.tr("Received an invalid reply."))
-        
+                None, self.tr("Screenshot Error"), self.tr("Received an invalid reply.")
+            )
+
         else:
             EricMessageBox.warning(
                 None,
                 self.tr("Screenshot Error"),
-                self.tr("Received an unexpected reply."))
-        
+                self.tr("Received an unexpected reply."),
+            )
+
         return False
-    
+
     def __temporaryFilename(self):
         """
         Private method to generate a temporary filename.
-        
+
         @return path name for a unique, temporary file
         @rtype str
         """
-        return "/tmp/eric-snap-{0}.png".format(uuid.uuid4().hex)   # secok
+        return "/tmp/eric-snap-{0}.png".format(uuid.uuid4().hex)  # secok
--- a/src/eric7/SqlBrowser/SqlBrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/SqlBrowser/SqlBrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,57 +26,62 @@
     """
     Class implementing the SQL Browser main window.
     """
+
     def __init__(self, connections=None, parent=None):
         """
         Constructor
-        
+
         @param connections list of database connections to add
             (list of strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setObjectName("SqlBrowser")
-        
+
         if connections is None:
             connections = []
-        
+
         self.setWindowTitle(self.tr("SQL Browser"))
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         from .SqlBrowserWidget import SqlBrowserWidget
+
         self.__browser = SqlBrowserWidget(self)
         self.setCentralWidget(self.__browser)
-        
+
         self.__browser.statusMessage.connect(self.statusBar().showMessage)
-        
+
         self.__initActions()
         self.__initMenus()
         self.__initToolbars()
-        
+
         self.resize(self.__browser.size())
-        
+
         self.__warnings = []
-        
+
         for connection in connections:
             url = QUrl(connection, QUrl.ParsingMode.TolerantMode)
             if not url.isValid():
-                self.__warnings.append(
-                    self.tr("Invalid URL: {0}").format(connection))
+                self.__warnings.append(self.tr("Invalid URL: {0}").format(connection))
                 continue
-            
-            err = self.__browser.addConnection(url.scheme(), url.path(),
-                                               url.userName(), url.password(),
-                                               url.host(), url.port(-1))
+
+            err = self.__browser.addConnection(
+                url.scheme(),
+                url.path(),
+                url.userName(),
+                url.password(),
+                url.host(),
+                url.port(-1),
+            )
             if err.type() != QSqlError.ErrorType.NoError:
                 self.__warnings.append(
-                    self.tr("Unable to open connection: {0}".format(
-                        err.text())))
-        
+                    self.tr("Unable to open connection: {0}".format(err.text()))
+                )
+
         QTimer.singleShot(0, self.__uiStartUp)
-    
+
     def __uiStartUp(self):
         """
         Private slot to do some actions after the UI has started and the main
@@ -84,94 +89,103 @@
         """
         for warning in self.__warnings:
             EricMessageBox.warning(
-                self,
-                self.tr("SQL Browser startup problem"),
-                warning)
-        
+                self, self.tr("SQL Browser startup problem"), warning
+            )
+
         if len(QSqlDatabase.connectionNames()) == 0:
             self.__browser.addConnectionByDialog()
-    
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         # list of all actions
         self.__actions = []
-        
+
         self.addConnectionAct = EricAction(
-            self.tr('Add Connection'),
+            self.tr("Add Connection"),
             UI.PixmapCache.getIcon("databaseConnection"),
-            self.tr('Add &Connection...'),
-            0, 0, self, 'sql_file_add_connection')
-        self.addConnectionAct.setStatusTip(self.tr(
-            'Open a dialog to add a new database connection'))
-        self.addConnectionAct.setWhatsThis(self.tr(
-            """<b>Add Connection</b>"""
-            """<p>This opens a dialog to add a new database"""
-            """ connection.</p>"""
-        ))
-        self.addConnectionAct.triggered.connect(
-            self.__browser.addConnectionByDialog)
+            self.tr("Add &Connection..."),
+            0,
+            0,
+            self,
+            "sql_file_add_connection",
+        )
+        self.addConnectionAct.setStatusTip(
+            self.tr("Open a dialog to add a new database connection")
+        )
+        self.addConnectionAct.setWhatsThis(
+            self.tr(
+                """<b>Add Connection</b>"""
+                """<p>This opens a dialog to add a new database"""
+                """ connection.</p>"""
+            )
+        )
+        self.addConnectionAct.triggered.connect(self.__browser.addConnectionByDialog)
         self.__actions.append(self.addConnectionAct)
-        
+
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'sql_file_quit')
-        self.exitAct.setStatusTip(self.tr('Quit the SQL browser'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the SQL browser.</p>"""
-        ))
+            0,
+            self,
+            "sql_file_quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the SQL browser"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the SQL browser.</p>""")
+        )
         self.exitAct.triggered.connect(ericApp().closeAllWindows)
-        
+
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'sql_help_about')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""
-        ))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "sql_help_about"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.__actions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'sql_help_about_qt')
+            self.tr("About Qt"), self.tr("About &Qt"), 0, 0, self, "sql_help_about_qt"
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.__actions.append(self.aboutQtAct)
-    
+
     def __initMenus(self):
         """
         Private method to create the menus.
         """
         mb = self.menuBar()
-        
-        menu = mb.addMenu(self.tr('&File'))
+
+        menu = mb.addMenu(self.tr("&File"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.addConnectionAct)
         menu.addSeparator()
         menu.addAction(self.exitAct)
-        
+
         mb.addSeparator()
-        
-        menu = mb.addMenu(self.tr('&Help'))
+
+        menu = mb.addMenu(self.tr("&Help"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
-    
+
     def __initToolbars(self):
         """
         Private method to create the toolbars.
@@ -182,7 +196,7 @@
         filetb.addAction(self.addConnectionAct)
         filetb.addSeparator()
         filetb.addAction(self.exitAct)
-    
+
     def __about(self):
         """
         Private slot to show the about information.
@@ -195,9 +209,9 @@
                 """<p>The SQL browser window is a little tool to examine """
                 """the data and the schema of a database and to execute """
                 """queries on a database.</p>"""
-            )
+            ),
         )
-    
+
     def __aboutQt(self):
         """
         Private slot to show info about Qt.
--- a/src/eric7/SqlBrowser/SqlBrowserWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/SqlBrowser/SqlBrowserWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,11 @@
 from PyQt6.QtGui import QStandardItemModel
 from PyQt6.QtWidgets import QWidget, QDialog, QAbstractItemView
 from PyQt6.QtSql import (
-    QSqlDatabase, QSqlError, QSqlTableModel, QSqlQueryModel, QSqlQuery
+    QSqlDatabase,
+    QSqlError,
+    QSqlTableModel,
+    QSqlQueryModel,
+    QSqlQuery,
 )
 
 from EricWidgets import EricMessageBox
@@ -22,25 +26,26 @@
 class SqlBrowserWidget(QWidget, Ui_SqlBrowserWidget):
     """
     Class implementing the SQL Browser widget.
-    
+
     @signal statusMessage(str) emitted to show a status message
     """
+
     statusMessage = pyqtSignal(str)
-    
+
     cCount = 0
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.table.addAction(self.insertRowAction)
         self.table.addAction(self.deleteRowAction)
-        
+
         if len(QSqlDatabase.drivers()) == 0:
             EricMessageBox.information(
                 self,
@@ -48,16 +53,16 @@
                 self.tr(
                     """This tool requires at least one Qt database driver. """
                     """Please check the Qt documentation how to build the """
-                    """Qt SQL plugins."""))
-        
-        self.connections.tableActivated.connect(
-            self.on_connections_tableActivated)
-        self.connections.schemaRequested.connect(
-            self.on_connections_schemaRequested)
+                    """Qt SQL plugins."""
+                ),
+            )
+
+        self.connections.tableActivated.connect(self.on_connections_tableActivated)
+        self.connections.schemaRequested.connect(self.on_connections_schemaRequested)
         self.connections.cleared.connect(self.on_connections_cleared)
-        
+
         self.statusMessage.emit(self.tr("Ready"))
-    
+
     @pyqtSlot()
     def on_clearButton_clicked(self):
         """
@@ -65,7 +70,7 @@
         """
         self.sqlEdit.clear()
         self.sqlEdit.setFocus()
-    
+
     @pyqtSlot()
     def on_executeButton_clicked(self):
         """
@@ -73,39 +78,39 @@
         """
         self.executeQuery()
         self.sqlEdit.setFocus()
-    
+
     @pyqtSlot()
     def on_insertRowAction_triggered(self):
         """
         Private slot handling the action to insert a new row.
         """
         self.__insertRow()
-    
+
     @pyqtSlot()
     def on_deleteRowAction_triggered(self):
         """
         Private slot handling the action to delete a row.
         """
         self.__deleteRow()
-    
+
     @pyqtSlot(str)
     def on_connections_tableActivated(self, table):
         """
         Private slot to show the contents of a table.
-        
+
         @param table name of the table for which to show the contents (string)
         """
         self.showTable(table)
-    
+
     @pyqtSlot(str)
     def on_connections_schemaRequested(self, table):
         """
         Private slot to show the schema of a table.
-        
+
         @param table name of the table for which to show the schema (string)
         """
         self.showSchema(table)
-    
+
     @pyqtSlot()
     def on_connections_cleared(self):
         """
@@ -113,15 +118,14 @@
         """
         model = QStandardItemModel(self.table)
         self.table.setModel(model)
-        self.table.setEditTriggers(
-            QAbstractItemView.EditTrigger.NoEditTriggers)
-        
+        self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
+
         self.updateActions()
-    
+
     def addConnection(self, driver, dbName, user, password, host, port):
         """
         Public method to add a database connection.
-        
+
         @param driver name of the Qt database driver (string)
         @param dbName name of the database (string)
         @param user user name (string)
@@ -131,45 +135,45 @@
         @return SQL error object (QSqlError)
         """
         err = QSqlError()
-        
+
         self.__class__.cCount += 1
         db = QSqlDatabase.addDatabase(
-            driver.upper(), "Browser{0:d}".format(self.__class__.cCount))
+            driver.upper(), "Browser{0:d}".format(self.__class__.cCount)
+        )
         db.setDatabaseName(dbName)
         db.setHostName(host)
         db.setPort(port)
         if not db.open(user, password):
             err = db.lastError()
             db = QSqlDatabase()
-            QSqlDatabase.removeDatabase(
-                "Browser{0:d}".format(self.__class__.cCount))
-        
+            QSqlDatabase.removeDatabase("Browser{0:d}".format(self.__class__.cCount))
+
         self.connections.refresh()
-        
+
         return err
-    
+
     def addConnectionByDialog(self):
         """
         Public slot to add a database connection via an input dialog.
         """
         from .SqlConnectionDialog import SqlConnectionDialog
+
         dlg = SqlConnectionDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             driver, dbName, user, password, host, port = dlg.getData()
-            err = self.addConnection(
-                driver, dbName, user, password, host, port)
-            
+            err = self.addConnection(driver, dbName, user, password, host, port)
+
             if err.type() != QSqlError.ErrorType.NoError:
                 EricMessageBox.warning(
                     self,
                     self.tr("Unable to open database"),
-                    self.tr(
-                        """An error occurred while opening the connection."""))
-    
+                    self.tr("""An error occurred while opening the connection."""),
+                )
+
     def showTable(self, table):
         """
         Public slot to show the contents of a table.
-        
+
         @param table name of the table to be shown (string)
         """
         model = QSqlTableModel(self.table, self.connections.currentDatabase())
@@ -180,28 +184,28 @@
             self.statusMessage.emit(model.lastError().text())
         self.table.setModel(model)
         self.table.setEditTriggers(
-            QAbstractItemView.EditTrigger.DoubleClicked |
-            QAbstractItemView.EditTrigger.EditKeyPressed)
-        
+            QAbstractItemView.EditTrigger.DoubleClicked
+            | QAbstractItemView.EditTrigger.EditKeyPressed
+        )
+
         self.table.resizeColumnsToContents()
-        
-        self.table.selectionModel().currentRowChanged.connect(
-            self.updateActions)
-        
+
+        self.table.selectionModel().currentRowChanged.connect(self.updateActions)
+
         self.updateActions()
-    
+
     def showSchema(self, table):
         """
         Public slot to show the schema of a table.
-        
+
         @param table name of the table to be shown (string)
         """
         rec = self.connections.currentDatabase().record(table)
         model = QStandardItemModel(self.table)
-        
+
         model.insertRows(0, rec.count())
         model.insertColumns(0, 7)
-        
+
         model.setHeaderData(0, Qt.Orientation.Horizontal, "Fieldname")
         model.setHeaderData(1, Qt.Orientation.Horizontal, "Type")
         model.setHeaderData(2, Qt.Orientation.Horizontal, "Length")
@@ -209,17 +213,17 @@
         model.setHeaderData(4, Qt.Orientation.Horizontal, "Required")
         model.setHeaderData(5, Qt.Orientation.Horizontal, "Auto Value")
         model.setHeaderData(6, Qt.Orientation.Horizontal, "Default Value")
-        
+
         for i in range(rec.count()):
             fld = rec.field(i)
             model.setData(model.index(i, 0), fld.name())
             if fld.typeID() == -1:
-                model.setData(model.index(i, 1),
-                              QVariant.typeToName(fld.type()))
+                model.setData(model.index(i, 1), QVariant.typeToName(fld.type()))
             else:
                 model.setData(
-                    model.index(i, 1), "{0} ({1})".format(
-                        QVariant.typeToName(fld.type()), fld.typeID()))
+                    model.index(i, 1),
+                    "{0} ({1})".format(QVariant.typeToName(fld.type()), fld.typeID()),
+                )
             if fld.length() < 0:
                 model.setData(model.index(i, 2), "?")
             else:
@@ -234,25 +238,24 @@
                 model.setData(model.index(i, 4), bool(fld.requiredStatus()))
             model.setData(model.index(i, 5), fld.isAutoValue())
             model.setData(model.index(i, 6), fld.defaultValue())
-        
+
         self.table.setModel(model)
-        self.table.setEditTriggers(
-            QAbstractItemView.EditTrigger.NoEditTriggers)
-        
+        self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
+
         self.table.resizeColumnsToContents()
-        
+
         self.updateActions()
-    
+
     def updateActions(self):
         """
         Public slot to update the actions.
         """
         enableIns = isinstance(self.table.model(), QSqlTableModel)
         enableDel = enableIns & self.table.currentIndex().isValid()
-        
+
         self.insertRowAction.setEnabled(enableIns)
         self.deleteRowAction.setEnabled(enableDel)
-    
+
     def __insertRow(self):
         """
         Private slot to insert a row into the database table.
@@ -260,14 +263,14 @@
         model = self.table.model()
         if not isinstance(model, QSqlTableModel):
             return
-        
+
         insertIndex = self.table.currentIndex()
         row = 0 if insertIndex.row() == -1 else insertIndex.row()
         model.insertRow(row)
         insertIndex = model.index(row, 0)
         self.table.setCurrentIndex(insertIndex)
         self.table.edit(insertIndex)
-    
+
     def __deleteRow(self):
         """
         Private slot to delete a row from the database table.
@@ -275,38 +278,41 @@
         model = self.table.model()
         if not isinstance(model, QSqlTableModel):
             return
-        
+
         model.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)
-        
+
         currentSelection = self.table.selectionModel().selectedIndexes()
         for selectedIndex in currentSelection:
             if selectedIndex.column() != 0:
                 continue
             model.removeRow(selectedIndex.row())
-        
+
         model.submitAll()
         model.setEditStrategy(QSqlTableModel.EditStrategy.OnRowChange)
-        
+
         self.updateActions()
-    
+
     def executeQuery(self):
         """
         Public slot to execute the entered query.
         """
         model = QSqlQueryModel(self.table)
-        model.setQuery(QSqlQuery(
-            self.sqlEdit.toPlainText(), self.connections.currentDatabase()))
+        model.setQuery(
+            QSqlQuery(self.sqlEdit.toPlainText(), self.connections.currentDatabase())
+        )
         self.table.setModel(model)
-        
+
         if model.lastError().type() != QSqlError.ErrorType.NoError:
             self.statusMessage.emit(model.lastError().text())
         elif model.query().isSelect():
             self.statusMessage.emit(self.tr("Query OK."))
         else:
             self.statusMessage.emit(
-                self.tr("Query OK, number of affected rows: {0}")
-                    .format(model.query().numRowsAffected()))
-        
+                self.tr("Query OK, number of affected rows: {0}").format(
+                    model.query().numRowsAffected()
+                )
+            )
+
         self.table.resizeColumnsToContents()
-        
+
         self.updateActions()
--- a/src/eric7/SqlBrowser/SqlConnectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/SqlBrowser/SqlConnectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,22 +20,22 @@
     """
     Class implementing a dialog to enter the connection parameters.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.databasePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
-        self.okButton = self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok)
-        
+
+        self.okButton = self.buttonBox.button(QDialogButtonBox.StandardButton.Ok)
+
         drivers = QSqlDatabase.drivers()
-        
+
         # remove compatibility names
         if "QMYSQL3" in drivers:
             drivers.remove("QMYSQL3")
@@ -47,14 +47,14 @@
             drivers.remove("QPSQL7")
         if "QTDS7" in drivers:
             drivers.remove("QTDS7")
-        
+
         self.driverCombo.addItems(drivers)
-        
+
         self.__updateDialog()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateDialog(self):
         """
         Private slot to update the dialog depending on its contents.
@@ -64,35 +64,35 @@
             self.databasePicker.setPickerEnabled(True)
         else:
             self.databasePicker.setPickerEnabled(False)
-        
+
         if self.databasePicker.text() == "" or driver == "":
             self.okButton.setEnabled(False)
         else:
             self.okButton.setEnabled(True)
-    
+
     @pyqtSlot(int)
     def on_driverCombo_activated(self, index):
         """
         Private slot handling the selection of a database driver.
-        
+
         @param index index of the selected entry
         @type int
         """
         self.__updateDialog()
-    
+
     @pyqtSlot(str)
     def on_databasePicker_textChanged(self, txt):
         """
         Private slot handling the change of the database name.
-        
+
         @param txt text of the edit (string)
         """
         self.__updateDialog()
-    
+
     def getData(self):
         """
         Public method to retrieve the connection data.
-        
+
         @return tuple giving the driver name (string), the database name
             (string), the user name (string), the password (string), the
             host name (string) and the port (integer)
--- a/src/eric7/SqlBrowser/SqlConnectionWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/SqlBrowser/SqlConnectionWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,11 @@
 from PyQt6.QtCore import pyqtSignal, Qt
 from PyQt6.QtGui import QAction
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QTreeWidget, QVBoxLayout, QTreeWidgetItem
+    QWidget,
+    QHeaderView,
+    QTreeWidget,
+    QVBoxLayout,
+    QTreeWidgetItem,
 )
 from PyQt6.QtSql import QSqlDatabase
 
@@ -18,63 +22,64 @@
 class SqlConnectionWidget(QWidget):
     """
     Class implementing a widget showing the SQL connections.
-    
+
     @signal tableActivated(str) emitted after the entry for a table has been
         activated
     @signal schemaRequested(str) emitted when the schema display is requested
     @signal cleared() emitted after the connection tree has been cleared
     """
+
     tableActivated = pyqtSignal(str)
     schemaRequested = pyqtSignal(str)
     cleared = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         layout = QVBoxLayout(self)
         layout.setContentsMargins(0, 0, 0, 0)
-        
+
         self.__connectionTree = QTreeWidget(self)
         self.__connectionTree.setObjectName("connectionTree")
         self.__connectionTree.setHeaderLabels([self.tr("Database")])
         self.__connectionTree.header().setSectionResizeMode(
-            QHeaderView.ResizeMode.Stretch)
+            QHeaderView.ResizeMode.Stretch
+        )
         refreshAction = QAction(self.tr("Refresh"), self.__connectionTree)
-        self.__schemaAction = QAction(
-            self.tr("Show Schema"), self.__connectionTree)
-        
+        self.__schemaAction = QAction(self.tr("Show Schema"), self.__connectionTree)
+
         refreshAction.triggered.connect(self.refresh)
         self.__schemaAction.triggered.connect(self.showSchema)
-        
+
         self.__connectionTree.addAction(refreshAction)
         self.__connectionTree.addAction(self.__schemaAction)
         self.__connectionTree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.ActionsContextMenu)
-        
+            Qt.ContextMenuPolicy.ActionsContextMenu
+        )
+
         layout.addWidget(self.__connectionTree)
-        
+
         self.__activating = False
-        
+
         self.__connectionTree.itemActivated.connect(self.__itemActivated)
-        self.__connectionTree.currentItemChanged.connect(
-            self.__currentItemChanged)
-        
+        self.__connectionTree.currentItemChanged.connect(self.__currentItemChanged)
+
         self.__activeDb = ""
-    
+
     def refresh(self):
         """
         Public slot to refresh the connection tree.
         """
         self.__connectionTree.clear()
         self.cleared.emit()
-        
+
         connectionNames = QSqlDatabase.connectionNames()
-        
+
         foundActiveDb = False
         for name in connectionNames:
             root = QTreeWidgetItem(self.__connectionTree)
@@ -88,11 +93,11 @@
                 for table in tables:
                     itm = QTreeWidgetItem(root)
                     itm.setText(0, table)
-        
+
         if not foundActiveDb and connectionNames:
             self.__activeDb = connectionNames[0]
             self.__setActive(self.__connectionTree.topLevelItem(0))
-    
+
     def showSchema(self):
         """
         Public slot to show schema data of a database.
@@ -102,17 +107,17 @@
             return
         self.__setActive(cItm.parent())
         self.schemaRequested.emit(cItm.text(0))
-    
+
     def __itemActivated(self, itm, column):
         """
         Private slot handling the activation of an item.
-        
+
         @param itm reference to the item (QTreeWidgetItem)
         @param column column that was activated (integer)
         """
         if itm is None:
             return
-        
+
         if not self.__activating:
             self.__activating = True
             if itm.parent() is None:
@@ -121,22 +126,23 @@
                 self.__setActive(itm.parent())
                 self.tableActivated.emit(itm.text(0))
             self.__activating = False
-    
+
     def __currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current item.
-        
+
         @param current reference to the new current item (QTreeWidgetItem)
         @param previous reference to the previous current item
             (QTreeWidgetItem)
         """
         self.__schemaAction.setEnabled(
-            current is not None and current.parent() is not None)
-    
+            current is not None and current.parent() is not None
+        )
+
     def __dbCaption(self, db):
         """
         Private method to assemble a string for the caption.
-        
+
         @param db reference to the database object (QSqlDatabase)
         @return caption string (string)
         """
@@ -147,41 +153,41 @@
             nm += "@"
         nm += db.databaseName()
         return nm
-    
+
     def __setBold(self, itm, bold):
         """
         Private slot to set the font to bold.
-        
+
         @param itm reference to the item to be changed (QTreeWidgetItem)
         @param bold flag indicating bold (boolean)
         """
         font = itm.font(0)
         font.setBold(bold)
         itm.setFont(0, font)
-    
+
     def currentDatabase(self):
         """
         Public method to get the current database.
-        
+
         @return reference to the current database (QSqlDatabase)
         """
         return QSqlDatabase.database(self.__activeDb)
-    
+
     def __setActive(self, itm):
         """
         Private slot to set an item to active.
-        
+
         @param itm reference to the item to set as the active item
             (QTreeWidgetItem)
         """
         for index in range(self.__connectionTree.topLevelItemCount()):
             if self.__connectionTree.topLevelItem(index).font(0).bold():
-                self.__setBold(
-                    self.__connectionTree.topLevelItem(index), False)
-        
+                self.__setBold(self.__connectionTree.topLevelItem(index), False)
+
         if itm is None:
             return
-        
+
         self.__setBold(itm, True)
         self.__activeDb = QSqlDatabase.connectionNames()[
-            self.__connectionTree.indexOfTopLevelItem(itm)]
+            self.__connectionTree.indexOfTopLevelItem(itm)
+        ]
--- a/src/eric7/Tasks/Task.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/Task.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,6 +23,7 @@
     """
     Class defining the task types.
     """
+
     NONE = 255
     FIXME = 0
     TODO = 1
@@ -36,6 +37,7 @@
     """
     Class defining the task priorities.
     """
+
     HIGH = 0
     NORMAL = 1
     LOW = 2
@@ -45,38 +47,50 @@
     """
     Class implementing the task data structure.
     """
+
     TaskType2IconName = {
-        TaskType.FIXME: "taskFixme",                # __NO-TASK__
-        TaskType.TODO: "taskTodo",                  # __NO-TASK__
-        TaskType.WARNING: "taskWarning",            # __NO-TASK__
-        TaskType.NOTE: "taskNote",                  # __NO-TASK__
-        TaskType.TEST: "taskTest",                  # __NO-TASK__
-        TaskType.DOCU: "taskDocu",                  # __NO-TASK__
+        TaskType.FIXME: "taskFixme",  # __NO-TASK__
+        TaskType.TODO: "taskTodo",  # __NO-TASK__
+        TaskType.WARNING: "taskWarning",  # __NO-TASK__
+        TaskType.NOTE: "taskNote",  # __NO-TASK__
+        TaskType.TEST: "taskTest",  # __NO-TASK__
+        TaskType.DOCU: "taskDocu",  # __NO-TASK__
     }
     TaskType2ColorName = {
-        TaskType.FIXME: "TasksFixmeColor",          # __NO-TASK__
-        TaskType.TODO: "TasksTodoColor",            # __NO-TASK__
-        TaskType.WARNING: "TasksWarningColor",      # __NO-TASK__
-        TaskType.NOTE: "TasksNoteColor",            # __NO-TASK__
-        TaskType.TEST: "TasksTestColor",            # __NO-TASK__
-        TaskType.DOCU: "TasksDocuColor",            # __NO-TASK__
+        TaskType.FIXME: "TasksFixmeColor",  # __NO-TASK__
+        TaskType.TODO: "TasksTodoColor",  # __NO-TASK__
+        TaskType.WARNING: "TasksWarningColor",  # __NO-TASK__
+        TaskType.NOTE: "TasksNoteColor",  # __NO-TASK__
+        TaskType.TEST: "TasksTestColor",  # __NO-TASK__
+        TaskType.DOCU: "TasksDocuColor",  # __NO-TASK__
     }
     TaskType2MarkersName = {
-        TaskType.FIXME: "TasksFixmeMarkers",        # __NO-TASK__
-        TaskType.TODO: "TasksTodoMarkers",          # __NO-TASK__
-        TaskType.WARNING: "TasksWarningMarkers",    # __NO-TASK__
-        TaskType.NOTE: "TasksNoteMarkers",          # __NO-TASK__
-        TaskType.TEST: "TasksTestMarkers",          # __NO-TASK__
-        TaskType.DOCU: "TasksDocuMarkers",          # __NO-TASK__
+        TaskType.FIXME: "TasksFixmeMarkers",  # __NO-TASK__
+        TaskType.TODO: "TasksTodoMarkers",  # __NO-TASK__
+        TaskType.WARNING: "TasksWarningMarkers",  # __NO-TASK__
+        TaskType.NOTE: "TasksNoteMarkers",  # __NO-TASK__
+        TaskType.TEST: "TasksTestMarkers",  # __NO-TASK__
+        TaskType.DOCU: "TasksDocuMarkers",  # __NO-TASK__
     }
-    
-    def __init__(self, summary, priority=TaskPriority.NORMAL, filename="",
-                 lineno=0, completed=False, _time=0, isProjectTask=False,
-                 taskType=TaskType.TODO, project=None, description="",
-                 uid="", parentUid=""):
+
+    def __init__(
+        self,
+        summary,
+        priority=TaskPriority.NORMAL,
+        filename="",
+        lineno=0,
+        completed=False,
+        _time=0,
+        isProjectTask=False,
+        taskType=TaskType.TODO,
+        project=None,
+        description="",
+        uid="",
+        parentUid="",
+    ):
         """
         Constructor
-        
+
         @param summary summary text of the task
         @type str
         @param priority priority of the task
@@ -104,7 +118,7 @@
         @type str
         """
         super().__init__()
-        
+
         self.summary = summary
         self.description = description
         self.filename = filename
@@ -118,16 +132,16 @@
         else:
             self.uid = QUuid.createUuid().toString()
         self.parentUid = parentUid
-        
+
         if isProjectTask:
             self.filename = self.project.getRelativePath(self.filename)
-            
+
         self.setData(0, Qt.ItemDataRole.DisplayRole, "")
         self.setData(1, Qt.ItemDataRole.DisplayRole, "")
         self.setData(2, Qt.ItemDataRole.DisplayRole, self.summary)
         self.setData(3, Qt.ItemDataRole.DisplayRole, self.filename)
         self.setData(4, Qt.ItemDataRole.DisplayRole, self.lineno or "")
-        
+
         if self.completed:
             self.setIcon(0, UI.PixmapCache.getIcon("taskCompleted"))
             strikeOut = True
@@ -138,12 +152,12 @@
             f = self.font(column)
             f.setStrikeOut(strikeOut)
             self.setFont(column, f)
-        
+
         self.setPriority(priority)
-        
+
         self.setTaskType(taskType)
         self.setTextAlignment(4, Qt.AlignmentFlag.AlignRight)
-    
+
     def colorizeTask(self):
         """
         Public slot to set the colors of the task item.
@@ -155,41 +169,41 @@
         for col in range(5):
             with contextlib.suppress(KeyError):
                 self.setBackground(
-                    col, Preferences.getTasks(
-                        Task.TaskType2ColorName[self.taskType]))
-            
+                    col, Preferences.getTasks(Task.TaskType2ColorName[self.taskType])
+                )
+
             if self._isProjectTask:
                 self.setFont(col, boldFont)
             else:
                 self.setFont(col, nonBoldFont)
-    
+
     def setSummary(self, summary):
         """
         Public slot to update the description.
-        
+
         @param summary summary text of the task (string)
         """
         self.summary = summary
         self.setText(2, self.summary)
-    
+
     def setDescription(self, description):
         """
         Public slot to update the description field.
-        
+
         @param description descriptive text of the task
         @type str
         """
         self.description = description
-    
+
     def setPriority(self, priority):
         """
         Public slot to update the priority.
-        
+
         @param priority priority of the task
         @type TaskPriority
         """
         self.priority = priority
-        
+
         if self.priority == TaskPriority.NORMAL:
             self.setIcon(1, UI.PixmapCache.getIcon("empty"))
         elif self.priority == TaskPriority.HIGH:
@@ -198,28 +212,29 @@
             self.setIcon(1, UI.PixmapCache.getIcon("taskPrioLow"))
         else:
             self.setIcon(1, UI.PixmapCache.getIcon("empty"))
-    
+
     def setTaskType(self, taskType):
         """
         Public method to update the task type.
-        
+
         @param taskType type of the task
         @type TaskType
         """
         self.taskType = taskType
-        
+
         try:
-            self.setIcon(2, UI.PixmapCache.getIcon(
-                Task.TaskType2IconName[self.taskType]))
+            self.setIcon(
+                2, UI.PixmapCache.getIcon(Task.TaskType2IconName[self.taskType])
+            )
         except KeyError:
             self.setIcon(2, UI.PixmapCache.getIcon("empty"))
-        
+
         self.colorizeTask()
-    
+
     def setCompleted(self, completed):
         """
         Public slot to update the completed flag.
-        
+
         @param completed flag indicating completion status (boolean)
         """
         self.completed = completed
@@ -233,92 +248,92 @@
             f = self.font(column)
             f.setStrikeOut(strikeOut)
             self.setFont(column, f)
-        
+
         # set the completion status for all children
         for index in range(self.childCount()):
             self.child(index).setCompleted(completed)
-    
+
     def isCompleted(self):
         """
         Public slot to return the completion status.
-        
+
         @return flag indicating the completion status (boolean)
         """
         return self.completed
-    
+
     def getFilename(self):
         """
         Public method to retrieve the task's filename.
-        
+
         @return filename (string)
         """
         if self._isProjectTask and self.filename:
             return os.path.join(self.project.getProjectPath(), self.filename)
         else:
             return self.filename
-    
+
     def isFileTask(self):
         """
         Public slot to get an indication, if this task is related to a file.
-        
+
         @return flag indicating a file task (boolean)
         """
         return self.filename != ""
-    
+
     def getLineno(self):
         """
         Public method to retrieve the task's linenumber.
-        
+
         @return linenumber (integer)
         """
         return self.lineno
-    
+
     def getUuid(self):
         """
         Public method to get the task's uid.
-        
+
         @return uid (string)
         """
         return self.uid
-    
+
     def getParentUuid(self):
         """
         Public method to get the parent task's uid.
-        
+
         @return parent uid (string)
         """
         return self.parentUid
-    
+
     def setProjectTask(self, pt):
         """
         Public method to set the project relation flag.
-        
+
         @param pt flag indicating a project task (boolean)
         """
         self._isProjectTask = pt
         self.colorizeTask()
-    
+
     def isProjectTask(self):
         """
         Public slot to return the project relation status.
-        
+
         @return flag indicating the project relation status (boolean)
         """
         return self._isProjectTask
-    
+
     def isProjectFileTask(self):
         """
         Public slot to get an indication, if this task is related to a
         project file.
-        
+
         @return flag indicating a project file task (boolean)
         """
         return self._isProjectTask and self.filename != ""
-    
+
     def toDict(self):
         """
         Public method to convert the task data to a dictionary.
-        
+
         @return dictionary containing the task data
         @rtype dict
         """
--- a/src/eric7/Tasks/TaskFilter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/TaskFilter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,38 +17,39 @@
     """
     Class implementing a filter for tasks.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.active = False
-        
+
         self.summaryFilter = None
         self.filenameFilter = ""
         self.typeFilter = TaskType.NONE
         # task type
-        
+
         self.scopeFilter = None
-        #- global (False) or project (True)
-        
+        # - global (False) or project (True)
+
         self.statusFilter = None
-        #- not completed (False) or completed (True)
-        
+        # - not completed (False) or completed (True)
+
         self.prioritiesFilter = None
-        #- list of priorities
-    
+        # - list of priorities
+
     def setActive(self, enabled):
         """
         Public method to activate the filter.
-        
+
         @param enabled flag indicating the activation state (boolean)
         """
         self.active = enabled
-    
+
     def setSummaryFilter(self, filterStr):
         """
         Public method to set the description filter.
-        
+
         @param filterStr a regular expression for the description filter
             to set (string) or None
         """
@@ -56,109 +57,96 @@
             self.summaryFilter = None
         else:
             self.summaryFilter = re.compile(filterStr)
-    
+
     def setFileNameFilter(self, filterStr):
         """
         Public method to set the filename filter.
-        
+
         @param filterStr a wildcard expression for the filename filter
             to set (string) or None
         """
         self.filenameFilter = filterStr
-    
+
     def setTypeFilter(self, taskType):
         """
         Public method to set the type filter.
-        
+
         @param taskType type of the task
         @type TaskType
         """
         self.typeFilter = taskType
-        
+
     def setScopeFilter(self, scope):
         """
         Public method to set the scope filter.
-        
+
         @param scope flag indicating a project task (boolean) or None
         """
         self.scopeFilter = scope
-        
+
     def setStatusFilter(self, status):
         """
         Public method to set the status filter.
-        
+
         @param status flag indicating a completed task (boolean) or None
         """
         self.statusFilter = status
-        
+
     def setPrioritiesFilter(self, priorities):
         """
         Public method to set the priorities filter.
-        
+
         @param priorities list of task priorities or None
         @type list of TaskPriority or None
         """
         self.prioritiesFilter = priorities
-        
+
     def hasActiveFilter(self):
         """
         Public method to check for active filters.
-        
+
         @return flag indicating an active filter was found (boolean)
         """
         return (
-            self.summaryFilter is not None or
-            bool(self.filenameFilter) or
-            self.typeFilter != TaskType.NONE or
-            self.scopeFilter is not None or
-            self.statusFilter is not None or
-            self.prioritiesFilter is not None
+            self.summaryFilter is not None
+            or bool(self.filenameFilter)
+            or self.typeFilter != TaskType.NONE
+            or self.scopeFilter is not None
+            or self.statusFilter is not None
+            or self.prioritiesFilter is not None
         )
-        
+
     def showTask(self, task):
         """
         Public method to check, if a task should be shown.
-        
+
         @param task reference to the task object to check (Task)
         @return flag indicating whether the task should be shown (boolean)
         """
         if not self.active:
             return True
-        
-        if (
-            self.summaryFilter and
-            self.summaryFilter.search(task.summary) is None
-        ):
+
+        if self.summaryFilter and self.summaryFilter.search(task.summary) is None:
             return False
-        
-        if (
-            self.filenameFilter and
-            not fnmatch.fnmatch(task.filename, self.filenameFilter)
-        ):
-            return False
-        
-        if (
-            self.typeFilter != TaskType.NONE and
-            self.typeFilter != task.taskType
+
+        if self.filenameFilter and not fnmatch.fnmatch(
+            task.filename, self.filenameFilter
         ):
             return False
-        
+
+        if self.typeFilter != TaskType.NONE and self.typeFilter != task.taskType:
+            return False
+
+        if self.scopeFilter is not None and self.scopeFilter != task._isProjectTask:
+            return False
+
+        if self.statusFilter is not None and self.statusFilter != task.completed:
+            return False
+
         if (
-            self.scopeFilter is not None and
-            self.scopeFilter != task._isProjectTask
+            self.prioritiesFilter is not None
+            and task.priority not in self.prioritiesFilter
         ):
             return False
-        
-        if (
-            self.statusFilter is not None and
-            self.statusFilter != task.completed
-        ):
-            return False
-        
-        if (
-            self.prioritiesFilter is not None and
-            task.priority not in self.prioritiesFilter
-        ):
-            return False
-        
+
         return True
--- a/src/eric7/Tasks/TaskFilterConfigDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/TaskFilterConfigDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,16 +18,17 @@
     """
     Class implementing the task filter configuration dialog.
     """
+
     def __init__(self, taskFilter, parent=None):
         """
         Constructor
-        
+
         @param taskFilter the task filter object to be configured
         @param parent the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.typeCombo.addItem("", TaskType.NONE)
         self.typeCombo.addItem(self.tr("Bugfix"), TaskType.FIXME)
         self.typeCombo.addItem(self.tr("Warning"), TaskType.WARNING)
@@ -35,32 +36,30 @@
         self.typeCombo.addItem(self.tr("Note"), TaskType.NOTE)
         self.typeCombo.addItem(self.tr("Test"), TaskType.TEST)
         self.typeCombo.addItem(self.tr("Documentation"), TaskType.DOCU)
-        
-        if (
-            taskFilter.summaryFilter is None or
-            not taskFilter.summaryFilter.pattern
-        ):
+
+        if taskFilter.summaryFilter is None or not taskFilter.summaryFilter.pattern:
             self.summaryGroup.setChecked(False)
             self.summaryEdit.clear()
         else:
             self.summaryGroup.setChecked(True)
             self.summaryEdit.setText(taskFilter.summaryFilter.pattern)
-        
+
         if not taskFilter.filenameFilter:
             self.filenameGroup.setChecked(False)
             self.filenameEdit.clear()
         else:
             self.filenameGroup.setChecked(True)
             self.filenameEdit.setText(taskFilter.filenameFilter)
-        
+
         if taskFilter.typeFilter == TaskType.NONE:
             self.typeGroup.setChecked(False)
             self.typeCombo.setCurrentIndex(0)
         else:
             self.typeGroup.setChecked(True)
             self.typeCombo.setCurrentIndex(
-                self.typeCombo.findData(taskFilter.typeFilter))
-        
+                self.typeCombo.findData(taskFilter.typeFilter)
+            )
+
         if taskFilter.scopeFilter is None:
             self.scopeGroup.setChecked(False)
             self.globalRadioButton.setChecked(True)
@@ -70,7 +69,7 @@
                 self.projectRadioButton.setChecked(True)
             else:
                 self.globalRadioButton.setChecked(True)
-        
+
         if taskFilter.statusFilter is None:
             self.statusGroup.setChecked(False)
             self.uncompletedRadioButton.setChecked(True)
@@ -80,7 +79,7 @@
                 self.completedRadioButton.setChecked(True)
             else:
                 self.uncompletedRadioButton.setChecked(True)
-        
+
         if taskFilter.prioritiesFilter is None:
             self.priorityGroup.setChecked(False)
             self.priorityHighCheckBox.setChecked(False)
@@ -89,40 +88,41 @@
         else:
             self.priorityGroup.setChecked(True)
             self.priorityHighCheckBox.setChecked(
-                TaskPriority.HIGH in taskFilter.prioritiesFilter)
+                TaskPriority.HIGH in taskFilter.prioritiesFilter
+            )
             self.priorityNormalCheckBox.setChecked(
-                TaskPriority.NORMAL in taskFilter.prioritiesFilter)
+                TaskPriority.NORMAL in taskFilter.prioritiesFilter
+            )
             self.priorityLowCheckBox.setChecked(
-                TaskPriority.LOW in taskFilter.prioritiesFilter)
-        
+                TaskPriority.LOW in taskFilter.prioritiesFilter
+            )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def configureTaskFilter(self, taskFilter):
         """
         Public method to set the parameters of the task filter object.
-        
+
         @param taskFilter the task filter object to be configured
         """
         if self.summaryGroup.isChecked():
             taskFilter.setSummaryFilter(self.summaryEdit.text())
         else:
             taskFilter.setSummaryFilter(None)
-        
+
         if self.filenameGroup.isChecked():
             taskFilter.setFileNameFilter(self.filenameEdit.text())
         else:
             taskFilter.setFileNameFilter("")
-        
+
         if self.typeGroup.isChecked():
             taskFilter.setTypeFilter(
-                TaskType(
-                    self.typeCombo.itemData(self.typeCombo.currentIndex())
-                )
+                TaskType(self.typeCombo.itemData(self.typeCombo.currentIndex()))
             )
         else:
             taskFilter.setTypeFilter(TaskType.NONE)
-        
+
         if self.scopeGroup.isChecked():
             if self.projectRadioButton.isChecked():
                 taskFilter.setScopeFilter(True)
@@ -130,7 +130,7 @@
                 taskFilter.setScopeFilter(False)
         else:
             taskFilter.setScopeFilter(None)
-        
+
         if self.statusGroup.isChecked():
             if self.completedRadioButton.isChecked():
                 taskFilter.setStatusFilter(True)
@@ -138,7 +138,7 @@
                 taskFilter.setStatusFilter(False)
         else:
             taskFilter.setStatusFilter(None)
-        
+
         if self.priorityGroup.isChecked():
             priorities = []
             if self.priorityHighCheckBox.isChecked():
--- a/src/eric7/Tasks/TaskPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/TaskPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing the task properties dialog.
     """
+
     def __init__(self, task=None, parent=None, projectOpen=False):
         """
         Constructor
-        
+
         @param task the task object to be shown
         @type Task
         @param parent the parent widget
@@ -35,22 +36,22 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.filenameCompleter = EricFileCompleter(self.filenameEdit)
-        
+
         self.typeCombo.addItem(self.tr("Bugfix"), TaskType.FIXME)
         self.typeCombo.addItem(self.tr("Warning"), TaskType.WARNING)
         self.typeCombo.addItem(self.tr("ToDo"), TaskType.TODO)
         self.typeCombo.addItem(self.tr("Note"), TaskType.NOTE)
         self.typeCombo.addItem(self.tr("Test"), TaskType.TEST)
         self.typeCombo.addItem(self.tr("Documentation"), TaskType.DOCU)
-        
+
         if task is not None:
             self.summaryEdit.setText(task.summary)
             self.descriptionEdit.setText(task.description)
             self.creationLabel.setText(
-                time.strftime("%Y-%m-%d, %H:%M:%S",
-                              time.localtime(task.created)))
+                time.strftime("%Y-%m-%d, %H:%M:%S", time.localtime(task.created))
+            )
             self.priorityCombo.setCurrentIndex(task.priority.value)
             self.projectCheckBox.setChecked(task._isProjectTask)
             self.completedCheckBox.setChecked(task.completed)
@@ -62,14 +63,14 @@
             self.__setMode(bool(task.filename), projectOpen)
         else:
             self.projectCheckBox.setChecked(projectOpen)
-            self.typeCombo.setCurrentIndex(2)   # TaskType.TODO
+            self.typeCombo.setCurrentIndex(2)  # TaskType.TODO
             self.__setMode(False, projectOpen)
-    
+
     def __setMode(self, isFileTask, projectOpen):
         """
         Private method to show or hide dialog elements depending on the task
         kind.
-        
+
         @param isFileTask flag indicating a file task (i.e. extracted task)
         @type bool
         @param projectOpen flag indicating status of the project
@@ -80,44 +81,46 @@
             self.descriptionEdit.hide()
             self.descriptionLabel.hide()
             self.manualTaskFrame.hide()
-            
+
             msh = self.minimumSizeHint()
             self.resize(max(self.width(), msh.width()), msh.height())
         else:
             self.fileTaskFrame.hide()
-        
+
         self.summaryEdit.setReadOnly(isFileTask)
         self.projectCheckBox.setEnabled(projectOpen and not isFileTask)
-    
+
     def isManualTaskMode(self):
         """
         Public method to check, if the dialog is in manual task mode.
-        
+
         @return flag indicating manual task mode
         @rtype bool
         """
         return not self.__isFileTaskMode
-    
+
     def setSubTaskMode(self, projectTask):
         """
         Public slot to set the sub-task mode.
-        
+
         @param projectTask flag indicating a project related task (boolean)
         """
         self.projectCheckBox.setChecked(projectTask)
         self.projectCheckBox.setEnabled(False)
-    
+
     def getData(self):
         """
         Public method to retrieve the dialogs data.
-        
+
         @return tuple of description, priority, type, completion flag,
                 project flag and long text
         @rtype tuple of (str, TaskPriority, TaskType, bool, bool, str)
         """
-        return (self.summaryEdit.text(),
-                TaskPriority(self.priorityCombo.currentIndex()),
-                TaskType(self.typeCombo.currentData()),
-                self.completedCheckBox.isChecked(),
-                self.projectCheckBox.isChecked(),
-                self.descriptionEdit.toPlainText())
+        return (
+            self.summaryEdit.text(),
+            TaskPriority(self.priorityCombo.currentIndex()),
+            TaskType(self.typeCombo.currentData()),
+            self.completedCheckBox.isChecked(),
+            self.projectCheckBox.isChecked(),
+            self.descriptionEdit.toPlainText(),
+        )
--- a/src/eric7/Tasks/TaskViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/TaskViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,8 +18,15 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QThread
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QTreeWidget, QDialog, QInputDialog, QApplication,
-    QMenu, QAbstractItemView, QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QTreeWidget,
+    QDialog,
+    QInputDialog,
+    QApplication,
+    QMenu,
+    QAbstractItemView,
+    QTreeWidgetItem,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -34,152 +41,147 @@
 import Utilities
 
 from Utilities.AutoSaver import AutoSaver
-    
+
 
 class TaskViewer(QTreeWidget):
     """
     Class implementing the task viewer.
-    
+
     @signal displayFile(str, int) emitted to go to a file task
     """
+
     displayFile = pyqtSignal(str, int)
-    
+
     def __init__(self, parent, project):
         """
         Constructor
-        
+
         @param parent the parent (QWidget)
         @param project reference to the project object
         """
         super().__init__(parent)
-        
+
         self.setSortingEnabled(True)
         self.setExpandsOnDoubleClick(False)
-        
+
         self.__headerItem = QTreeWidgetItem(
-            ["", "", self.tr("Summary"), self.tr("Filename"),
-             self.tr("Line"), ""])
-        self.__headerItem.setIcon(
-            0, UI.PixmapCache.getIcon("taskCompleted"))
-        self.__headerItem.setIcon(
-            1, UI.PixmapCache.getIcon("taskPriority"))
+            ["", "", self.tr("Summary"), self.tr("Filename"), self.tr("Line"), ""]
+        )
+        self.__headerItem.setIcon(0, UI.PixmapCache.getIcon("taskCompleted"))
+        self.__headerItem.setIcon(1, UI.PixmapCache.getIcon("taskPriority"))
         self.setHeaderItem(self.__headerItem)
-        
+
         self.header().setSortIndicator(2, Qt.SortOrder.AscendingOrder)
         self.__resizeColumns()
-        
+
         self.tasks = []
         self.copyTask = None
         self.projectOpen = False
         self.project = project
         self.__projectTasksScanFilter = ""
-        
+
         from .TaskFilter import TaskFilter
+
         self.taskFilter = TaskFilter()
         self.taskFilter.setActive(False)
-        
+
         self.__projectTasksSaveTimer = AutoSaver(self, self.saveProjectTasks)
         self.__projectTaskExtractionThread = ProjectTaskExtractionThread()
         self.__projectTaskExtractionThread.taskFound.connect(self.addFileTask)
-        
-        self.__projectTasksMenu = QMenu(
-            self.tr("P&roject Tasks"), self)
+
+        self.__projectTasksMenu = QMenu(self.tr("P&roject Tasks"), self)
         self.__projectTasksMenu.addAction(
-            self.tr("&Regenerate project tasks"),
-            self.regenerateProjectTasks)
+            self.tr("&Regenerate project tasks"), self.regenerateProjectTasks
+        )
         self.__projectTasksMenu.addSeparator()
         self.__projectTasksMenu.addAction(
-            self.tr("&Configure scan options"),
-            self.__configureProjectTasksScanOptions)
-        
+            self.tr("&Configure scan options"), self.__configureProjectTasksScanOptions
+        )
+
         self.__menu = QMenu(self)
         self.__menu.addAction(self.tr("&New Task..."), self.__newTask)
         self.subtaskItem = self.__menu.addAction(
-            self.tr("New &Sub-Task..."), self.__newSubTask)
+            self.tr("New &Sub-Task..."), self.__newSubTask
+        )
         self.__menu.addSeparator()
-        self.projectTasksMenuItem = self.__menu.addMenu(
-            self.__projectTasksMenu)
+        self.projectTasksMenuItem = self.__menu.addMenu(self.__projectTasksMenu)
         self.__menu.addSeparator()
-        self.gotoItem = self.__menu.addAction(
-            self.tr("&Go To"), self.__goToTask)
+        self.gotoItem = self.__menu.addAction(self.tr("&Go To"), self.__goToTask)
         self.__menu.addSeparator()
-        self.copyItem = self.__menu.addAction(
-            self.tr("&Copy"), self.__copyTask)
-        self.pasteItem = self.__menu.addAction(
-            self.tr("&Paste"), self.__pasteTask)
+        self.copyItem = self.__menu.addAction(self.tr("&Copy"), self.__copyTask)
+        self.pasteItem = self.__menu.addAction(self.tr("&Paste"), self.__pasteTask)
         self.pasteMainItem = self.__menu.addAction(
-            self.tr("Paste as &Main Task"), self.__pasteMainTask)
-        self.deleteItem = self.__menu.addAction(
-            self.tr("&Delete"), self.__deleteTask)
+            self.tr("Paste as &Main Task"), self.__pasteMainTask
+        )
+        self.deleteItem = self.__menu.addAction(self.tr("&Delete"), self.__deleteTask)
         self.__menu.addSeparator()
         self.markCompletedItem = self.__menu.addAction(
-            self.tr("&Mark Completed"), self.__markCompleted)
-        self.__menu.addAction(
-            self.tr("Delete Completed &Tasks"), self.__deleteCompleted)
-        self.__menu.addSeparator()
+            self.tr("&Mark Completed"), self.__markCompleted
+        )
         self.__menu.addAction(
-            self.tr("P&roperties..."), self.__editTaskProperties)
+            self.tr("Delete Completed &Tasks"), self.__deleteCompleted
+        )
         self.__menu.addSeparator()
-        self.__menuFilteredAct = self.__menu.addAction(
-            self.tr("&Filtered display"))
+        self.__menu.addAction(self.tr("P&roperties..."), self.__editTaskProperties)
+        self.__menu.addSeparator()
+        self.__menuFilteredAct = self.__menu.addAction(self.tr("&Filtered display"))
         self.__menuFilteredAct.setCheckable(True)
         self.__menuFilteredAct.setChecked(False)
         self.__menuFilteredAct.triggered[bool].connect(self.__activateFilter)
         self.__menu.addAction(
-            self.tr("Filter c&onfiguration..."), self.__configureFilter)
+            self.tr("Filter c&onfiguration..."), self.__configureFilter
+        )
         self.__menu.addSeparator()
-        self.__menu.addAction(
-            self.tr("Resi&ze columns"), self.__resizeColumns)
+        self.__menu.addAction(self.tr("Resi&ze columns"), self.__resizeColumns)
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.__backMenu = QMenu(self)
         self.__backMenu.addAction(self.tr("&New Task..."), self.__newTask)
         self.__backMenu.addSeparator()
-        self.backProjectTasksMenuItem = self.__backMenu.addMenu(
-            self.__projectTasksMenu)
+        self.backProjectTasksMenuItem = self.__backMenu.addMenu(self.__projectTasksMenu)
         self.__backMenu.addSeparator()
         self.backPasteItem = self.__backMenu.addAction(
-            self.tr("&Paste"), self.__pasteTask)
+            self.tr("&Paste"), self.__pasteTask
+        )
         self.backPasteMainItem = self.__backMenu.addAction(
-            self.tr("Paste as &Main Task"), self.__pasteMainTask)
+            self.tr("Paste as &Main Task"), self.__pasteMainTask
+        )
         self.__backMenu.addSeparator()
         self.backDeleteCompletedItem = self.__backMenu.addAction(
-            self.tr("Delete Completed &Tasks"), self.__deleteCompleted)
+            self.tr("Delete Completed &Tasks"), self.__deleteCompleted
+        )
         self.__backMenu.addSeparator()
         self.__backMenuFilteredAct = self.__backMenu.addAction(
-            self.tr("&Filtered display"))
+            self.tr("&Filtered display")
+        )
         self.__backMenuFilteredAct.setCheckable(True)
         self.__backMenuFilteredAct.setChecked(False)
-        self.__backMenuFilteredAct.triggered[bool].connect(
-            self.__activateFilter)
-        self.__backMenu.addAction(
-            self.tr("Filter c&onfiguration..."), self.__configureFilter)
-        self.__backMenu.addSeparator()
+        self.__backMenuFilteredAct.triggered[bool].connect(self.__activateFilter)
         self.__backMenu.addAction(
-            self.tr("Resi&ze columns"), self.__resizeColumns)
+            self.tr("Filter c&onfiguration..."), self.__configureFilter
+        )
+        self.__backMenu.addSeparator()
+        self.__backMenu.addAction(self.tr("Resi&ze columns"), self.__resizeColumns)
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(
-            self.tr("Configure..."), self.__configure)
-        
+        self.__backMenu.addAction(self.tr("Configure..."), self.__configure)
+
         self.__activating = False
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.itemActivated.connect(self.__taskItemActivated)
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__generateTopLevelItems()
-    
+
     def __generateTopLevelItems(self):
         """
         Private method to generate the 'Extracted Tasks' item.
         """
-        self.__extractedItem = QTreeWidgetItem(self,
-                                               [self.tr("Extracted Tasks")])
-        self.__manualItem = QTreeWidgetItem(self,
-                                            [self.tr("Manual Tasks")])
+        self.__extractedItem = QTreeWidgetItem(self, [self.tr("Extracted Tasks")])
+        self.__manualItem = QTreeWidgetItem(self, [self.tr("Manual Tasks")])
         for itm in [self.__extractedItem, self.__manualItem]:
             itm.setFirstColumnSpanned(True)
             itm.setExpanded(True)
@@ -187,7 +189,7 @@
             font = itm.font(0)
             font.setUnderline(True)
             itm.setFont(0, font)
-    
+
     def __checkTopLevelItems(self):
         """
         Private slot to check the 'Extracted Tasks' item for children.
@@ -198,42 +200,42 @@
                 if itm.child(index).isHidden():
                     visibleCount -= 1
             itm.setHidden(visibleCount == 0)
-    
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.sortItems(self.sortColumn(), self.header().sortIndicatorOrder())
-    
+
     def __resizeColumns(self):
         """
         Private method to resize the list columns.
         """
         self.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.header().setStretchLastSection(True)
-    
+
     def findParentTask(self, parentUid):
         """
         Public method to find a parent task by its ID.
-        
+
         @param parentUid uid of the parent task (string)
         @return reference to the task (Task)
         """
         if not parentUid:
             return None
-        
+
         parentTask = None
         for task in self.tasks:
             if task.getUuid() == parentUid:
                 parentTask = task
                 break
-        
+
         return parentTask
-    
+
     def containsTask(self, taskToTest):
         """
         Public method to test, if a task is already in the tasks list.
-        
+
         @param taskToTest task to look for
         @type Task
         @return flag indicating the existence of the task
@@ -242,36 +244,36 @@
         if taskToTest is None:
             # play it safe
             return False
-        
+
         return any(
-            (task.summary == taskToTest.summary) and
-            (task.filename == taskToTest.filename) and
-            (task.lineno == taskToTest.lineno)
+            (task.summary == taskToTest.summary)
+            and (task.filename == taskToTest.filename)
+            and (task.lineno == taskToTest.lineno)
             for task in self.tasks
         )
-    
+
     def __refreshDisplay(self):
         """
         Private method to refresh the display.
         """
         for task in self.tasks:
             task.setHidden(not self.taskFilter.showTask(task))
-        
+
         self.__checkTopLevelItems()
         self.__resort()
         self.__resizeColumns()
-    
+
     def __taskItemActivated(self, itm, col):
         """
         Private slot to handle the activation of an item.
-        
+
         @param itm reference to the activated item (QTreeWidgetItem)
         @param col column the item was activated in (integer)
         """
         if (
-            not self.__activating and
-            itm is not self.__extractedItem and
-            itm is not self.__manualItem
+            not self.__activating
+            and itm is not self.__extractedItem
+            and itm is not self.__manualItem
         ):
             self.__activating = True
             fn = itm.getFilename()
@@ -288,16 +290,12 @@
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the list.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         itm = self.itemAt(coord)
         coord = self.mapToGlobal(coord)
-        if (
-            itm is None or
-            itm is self.__extractedItem or
-            itm is self.__manualItem
-        ):
+        if itm is None or itm is self.__extractedItem or itm is self.__manualItem:
             self.backProjectTasksMenuItem.setEnabled(self.projectOpen)
             if self.copyTask:
                 self.backPasteItem.setEnabled(True)
@@ -305,8 +303,7 @@
             else:
                 self.backPasteItem.setEnabled(False)
                 self.backPasteMainItem.setEnabled(False)
-            self.backDeleteCompletedItem.setEnabled(
-                bool(self.tasks))
+            self.backDeleteCompletedItem.setEnabled(bool(self.tasks))
             self.__backMenu.popup(coord)
         else:
             self.projectTasksMenuItem.setEnabled(self.projectOpen)
@@ -328,24 +325,34 @@
             else:
                 self.pasteItem.setEnabled(False)
                 self.pasteMainItem.setEnabled(False)
-            
+
             self.__menu.popup(coord)
-    
+
     def setProjectOpen(self, o=False):
         """
         Public slot to set the project status.
-        
+
         @param o flag indicating the project status
         """
         self.projectOpen = o
-    
-    def addTask(self, summary, priority=TaskPriority.NORMAL, filename="",
-                lineno=0, completed=False, _time=0, isProjectTask=False,
-                taskType=TaskType.TODO, description="", uid="",
-                parentTask=None):
+
+    def addTask(
+        self,
+        summary,
+        priority=TaskPriority.NORMAL,
+        filename="",
+        lineno=0,
+        completed=False,
+        _time=0,
+        isProjectTask=False,
+        taskType=TaskType.TODO,
+        description="",
+        uid="",
+        parentTask=None,
+    ):
         """
         Public slot to add a task.
-        
+
         @param summary summary text of the task
         @type str
         @param priority priority of the task
@@ -387,9 +394,20 @@
                 parentUid = parentTask.getUuid()
             else:
                 parentUid = ""
-        task = Task(summary, priority, filename, lineno, completed,
-                    _time, isProjectTask, taskType,
-                    self.project, description, uid, parentUid)
+        task = Task(
+            summary,
+            priority,
+            filename,
+            lineno,
+            completed,
+            _time,
+            isProjectTask,
+            taskType,
+            self.project,
+            description,
+            uid,
+            parentUid,
+        )
         if not self.containsTask(task):
             self.tasks.append(task)
             if parentTask:
@@ -400,23 +418,24 @@
             else:
                 self.__manualItem.addChild(task)
             task.setHidden(not self.taskFilter.showTask(task))
-            
+
             self.__checkTopLevelItems()
             self.__resort()
             self.__resizeColumns()
-            
+
             if isProjectTask:
                 self.__projectTasksSaveTimer.changeOccurred()
-            
+
             return task
         else:
             return None
-    
-    def addFileTask(self, summary, filename, lineno, taskType=TaskType.TODO,
-                    description=""):
+
+    def addFileTask(
+        self, summary, filename, lineno, taskType=TaskType.TODO, description=""
+    ):
         """
         Public slot to add a file related task.
-        
+
         @param summary summary text of the task
         @type str
         @param filename filename containing the task
@@ -428,30 +447,33 @@
         @param description explanatory text of the task
         @type str
         """
-        self.addTask(summary, filename=filename, lineno=lineno,
-                     isProjectTask=(
-                         self.project and
-                         self.project.isProjectSource(filename)),
-                     taskType=TaskType(taskType), description=description)
-    
+        self.addTask(
+            summary,
+            filename=filename,
+            lineno=lineno,
+            isProjectTask=(self.project and self.project.isProjectSource(filename)),
+            taskType=TaskType(taskType),
+            description=description,
+        )
+
     def getProjectTasks(self):
         """
         Public method to retrieve all project related tasks.
-        
+
         @return copy of tasks (list of Task)
         """
         tasks = [task for task in self.tasks if task.isProjectTask()]
         return tasks[:]
-    
+
     def getGlobalTasks(self):
         """
         Public method to retrieve all non project related tasks.
-        
+
         @return copy of tasks (list of Task)
         """
         tasks = [task for task in self.tasks if not task.isProjectTask()]
         return tasks[:]
-    
+
     def clearTasks(self):
         """
         Public slot to clear all tasks from display.
@@ -459,18 +481,17 @@
         self.tasks = []
         self.clear()
         self.__generateTopLevelItems()
-    
+
     def clearProjectTasks(self, fileOnly=False):
         """
         Public slot to clear project related tasks.
-        
+
         @param fileOnly flag indicating to clear only file related
             project tasks (boolean)
         """
         for task in reversed(self.tasks[:]):
-            if (
-                (fileOnly and task.isProjectFileTask()) or
-                (not fileOnly and task.isProjectTask())
+            if (fileOnly and task.isProjectFileTask()) or (
+                not fileOnly and task.isProjectTask()
             ):
                 if self.copyTask == task:
                     self.copyTask = None
@@ -478,15 +499,15 @@
                 parent.removeChild(task)
                 self.tasks.remove(task)
                 del task
-        
+
         self.__checkTopLevelItems()
         self.__resort()
         self.__resizeColumns()
-    
+
     def clearFileTasks(self, filename, conditionally=False):
         """
         Public slot to clear all tasks related to a file.
-        
+
         @param filename name of the file (string)
         @param conditionally flag indicating to clear the tasks of the file
             checking some conditions (boolean)
@@ -506,25 +527,28 @@
                 if task.isProjectTask:
                     self.__projectTasksSaveTimer.changeOccurred()
                 del task
-        
+
         self.__checkTopLevelItems()
         self.__resort()
         self.__resizeColumns()
-    
+
     def __editTaskProperties(self):
         """
         Private slot to handle the "Properties" context menu entry.
         """
         from .TaskPropertiesDialog import TaskPropertiesDialog
+
         task = self.currentItem()
-        dlg = TaskPropertiesDialog(task, parent=self,
-                                   projectOpen=self.projectOpen)
-        if (
-            dlg.exec() == QDialog.DialogCode.Accepted and
-            dlg.isManualTaskMode()
-        ):
-            (summary, priority, taskType, completed, isProjectTask,
-             description) = dlg.getData()
+        dlg = TaskPropertiesDialog(task, parent=self, projectOpen=self.projectOpen)
+        if dlg.exec() == QDialog.DialogCode.Accepted and dlg.isManualTaskMode():
+            (
+                summary,
+                priority,
+                taskType,
+                completed,
+                isProjectTask,
+                description,
+            ) = dlg.getData()
             task.setSummary(summary)
             task.setPriority(priority)
             task.setTaskType(taskType)
@@ -532,46 +556,69 @@
             task.setProjectTask(isProjectTask)
             task.setDescription(description)
             self.__projectTasksSaveTimer.changeOccurred()
-    
+
     def __newTask(self):
         """
         Private slot to handle the "New Task" context menu entry.
         """
         from .TaskPropertiesDialog import TaskPropertiesDialog
-        dlg = TaskPropertiesDialog(None, parent=self,
-                                   projectOpen=self.projectOpen)
+
+        dlg = TaskPropertiesDialog(None, parent=self, projectOpen=self.projectOpen)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (summary, priority, taskType, completed, isProjectTask,
-             description) = dlg.getData()
-            self.addTask(summary, priority, completed=completed,
-                         isProjectTask=isProjectTask, taskType=taskType,
-                         description=description)
-    
+            (
+                summary,
+                priority,
+                taskType,
+                completed,
+                isProjectTask,
+                description,
+            ) = dlg.getData()
+            self.addTask(
+                summary,
+                priority,
+                completed=completed,
+                isProjectTask=isProjectTask,
+                taskType=taskType,
+                description=description,
+            )
+
     def __newSubTask(self):
         """
         Private slot to handle the "New Sub-Task" context menu entry.
         """
         parentTask = self.currentItem()
         projectTask = parentTask.isProjectTask()
-        
+
         from .TaskPropertiesDialog import TaskPropertiesDialog
-        dlg = TaskPropertiesDialog(None, parent=self,
-                                   projectOpen=self.projectOpen)
+
+        dlg = TaskPropertiesDialog(None, parent=self, projectOpen=self.projectOpen)
         dlg.setSubTaskMode(projectTask)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (summary, priority, taskType, completed, isProjectTask,
-             description) = dlg.getData()
-            self.addTask(summary, priority, completed=completed,
-                         isProjectTask=isProjectTask, taskType=taskType,
-                         description=description, parentTask=parentTask)
-    
+            (
+                summary,
+                priority,
+                taskType,
+                completed,
+                isProjectTask,
+                description,
+            ) = dlg.getData()
+            self.addTask(
+                summary,
+                priority,
+                completed=completed,
+                isProjectTask=isProjectTask,
+                taskType=taskType,
+                description=description,
+                parentTask=parentTask,
+            )
+
     def __markCompleted(self):
         """
         Private slot to handle the "Mark Completed" context menu entry.
         """
         task = self.currentItem()
         task.setCompleted(True)
-    
+
     def __deleteCompleted(self):
         """
         Private slot to handle the "Delete Completed Tasks" context menu entry.
@@ -586,23 +633,23 @@
                 if task.isProjectTask:
                     self.__projectTasksSaveTimer.changeOccurred()
                 del task
-        
+
         self.__checkTopLevelItems()
         self.__resort()
         self.__resizeColumns()
-        
+
         ci = self.currentItem()
         if ci:
             ind = self.indexFromItem(ci, self.currentColumn())
             self.scrollTo(ind, QAbstractItemView.ScrollHint.PositionAtCenter)
-    
+
     def __copyTask(self):
         """
         Private slot to handle the "Copy" context menu entry.
         """
         task = self.currentItem()
         self.copyTask = task
-    
+
     def __pasteTask(self):
         """
         Private slot to handle the "Paste" context menu entry.
@@ -611,29 +658,33 @@
             parent = self.copyTask.parent()
             if not isinstance(parent, Task):
                 parent = None
-            
-            self.addTask(self.copyTask.summary,
-                         priority=self.copyTask.priority,
-                         completed=self.copyTask.completed,
-                         description=self.copyTask.description,
-                         isProjectTask=self.copyTask._isProjectTask,
-                         parentTask=parent)
-    
+
+            self.addTask(
+                self.copyTask.summary,
+                priority=self.copyTask.priority,
+                completed=self.copyTask.completed,
+                description=self.copyTask.description,
+                isProjectTask=self.copyTask._isProjectTask,
+                parentTask=parent,
+            )
+
     def __pasteMainTask(self):
         """
         Private slot to handle the "Paste as Main Task" context menu entry.
         """
         if self.copyTask:
-            self.addTask(self.copyTask.summary,
-                         priority=self.copyTask.priority,
-                         completed=self.copyTask.completed,
-                         description=self.copyTask.description,
-                         isProjectTask=self.copyTask._isProjectTask)
-    
+            self.addTask(
+                self.copyTask.summary,
+                priority=self.copyTask.priority,
+                completed=self.copyTask.completed,
+                description=self.copyTask.description,
+                isProjectTask=self.copyTask._isProjectTask,
+            )
+
     def __deleteSubTasks(self, task):
         """
         Private method to delete all sub-tasks.
-        
+
         @param task task to delete sub-tasks of (Task)
         """
         for subtask in task.takeChildren():
@@ -642,18 +693,18 @@
             if subtask.childCount() > 0:
                 self.__deleteSubTasks(subtask)
             self.tasks.remove(subtask)
-    
+
     def __deleteTask(self, task=None):
         """
         Private slot to delete a task.
-        
+
         @param task task to be deleted
         @type Task
         """
         if task is None:
             # called via "Delete Task" context menu entry
             task = self.currentItem()
-        
+
         if self.copyTask is task:
             self.copyTask = None
         if task.childCount() > 0:
@@ -664,16 +715,16 @@
         if task.isProjectTask:
             self.__projectTasksSaveTimer.changeOccurred()
         del task
-        
+
         self.__checkTopLevelItems()
         self.__resort()
         self.__resizeColumns()
-        
+
         ci = self.currentItem()
         if ci:
             ind = self.indexFromItem(ci, self.currentColumn())
             self.scrollTo(ind, QAbstractItemView.ScrollHint.PositionAtCenter)
-    
+
     def __goToTask(self):
         """
         Private slot to handle the "Go To" context menu entry.
@@ -691,7 +742,7 @@
     def __activateFilter(self, on):
         """
         Private slot to handle the "Filtered display" context menu entry.
-        
+
         @param on flag indicating the filter state (boolean)
         """
         if on and not self.taskFilter.hasActiveFilter():
@@ -700,24 +751,27 @@
                 self.tr("Activate task filter"),
                 self.tr(
                     """The task filter doesn't have any active filters."""
-                    """ Do you want to configure the filter settings?"""),
-                yesDefault=True)
+                    """ Do you want to configure the filter settings?"""
+                ),
+                yesDefault=True,
+            )
             if not res:
                 on = False
             else:
                 self.__configureFilter()
                 on = self.taskFilter.hasActiveFilter()
-        
+
         self.taskFilter.setActive(on)
         self.__menuFilteredAct.setChecked(on)
         self.__backMenuFilteredAct.setChecked(on)
         self.__refreshDisplay()
-    
+
     def __configureFilter(self):
         """
         Private slot to handle the "Configure filter" context menu entry.
         """
         from .TaskFilterConfigDialog import TaskFilterConfigDialog
+
         dlg = TaskFilterConfigDialog(self.taskFilter)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.configureTaskFilter(self.taskFilter)
@@ -730,17 +784,20 @@
         scanFilter, ok = QInputDialog.getText(
             self,
             self.tr("Scan Filter Patterns"),
-            self.tr("Enter filename patterns of files"
-                    " to be excluded separated by a comma:"),
+            self.tr(
+                "Enter filename patterns of files"
+                " to be excluded separated by a comma:"
+            ),
             QLineEdit.EchoMode.Normal,
-            self.__projectTasksScanFilter)
+            self.__projectTasksScanFilter,
+        )
         if ok:
             self.__projectTasksScanFilter = scanFilter
-    
+
     def regenerateProjectTasks(self, quiet=False):
         """
         Public slot to regenerate project related tasks.
-        
+
         @param quiet flag indicating quiet operation
         @type bool
         """
@@ -749,44 +806,50 @@
             for taskType, markersName in Task.TaskType2MarkersName.items()
         }
         files = self.project.pdata["SOURCES"]
-        
+
         # apply file filter
-        filterList = [f.strip()
-                      for f in self.__projectTasksScanFilter.split(",")
-                      if f.strip()]
+        filterList = [
+            f.strip() for f in self.__projectTasksScanFilter.split(",") if f.strip()
+        ]
         if filterList:
             for scanFilter in filterList:
-                files = [f for f in files
-                         if not fnmatch.fnmatch(f, scanFilter)]
-        
+                files = [f for f in files if not fnmatch.fnmatch(f, scanFilter)]
+
         # remove all project tasks
         self.clearProjectTasks(fileOnly=True)
-        
+
         # now process them
         if quiet:
             ppath = self.project.getProjectPath()
             self.__projectTaskExtractionThread.scan(
-                markers, [os.path.join(ppath, f) for f in files])
+                markers, [os.path.join(ppath, f) for f in files]
+            )
         else:
             progress = EricProgressDialog(
                 self.tr("Extracting project tasks..."),
-                self.tr("Abort"), 0, len(files), self.tr("%v/%m Files"), self)
+                self.tr("Abort"),
+                0,
+                len(files),
+                self.tr("%v/%m Files"),
+                self,
+            )
             progress.setMinimumDuration(0)
             progress.setWindowTitle(self.tr("Tasks"))
-            
+
             ppath = self.project.getProjectPath()
-            
+
             now = time.monotonic()
             for count, file in enumerate(files):
                 progress.setLabelText(
-                    self.tr("Extracting project tasks...\n{0}").format(file))
+                    self.tr("Extracting project tasks...\n{0}").format(file)
+                )
                 progress.setValue(count)
                 if time.monotonic() - now > 0.01:
                     QApplication.processEvents()
                     now = time.monotonic()
                 if progress.wasCanceled():
                     break
-                
+
                 fn = os.path.join(ppath, file)
                 # read the file and split it into textlines
                 try:
@@ -796,15 +859,15 @@
                     count += 1
                     progress.setValue(count)
                     continue
-                
+
                 # now search tasks and record them
                 for lineIndex, line in enumerate(lines, start=1):
                     shouldBreak = False
-                    
+
                     if line.endswith("__NO-TASK__"):
                         # ignore potential task marker
                         continue
-                    
+
                     for taskType, taskMarkers in markers.items():
                         for taskMarker in taskMarkers:
                             index = line.find(taskMarker)
@@ -815,42 +878,42 @@
                                 break
                         if shouldBreak:
                             break
-            
+
             progress.setValue(len(files))
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("tasksPage")
-    
+
     def saveProjectTasks(self):
         """
         Public method to write the project tasks.
         """
         if self.projectOpen and Preferences.getProject("TasksProjectAutoSave"):
             self.project.writeTasks()
-    
+
     def stopProjectTaskExtraction(self):
         """
         Public method to stop the project task extraction thread.
         """
         self.__projectTaskExtractionThread.requestInterrupt()
         self.__projectTaskExtractionThread.wait()
-    
+
     def getTasksScanFilter(self) -> str:
         """
         Public method to get the project scan filter.
-        
+
         @return project scan filter
         @rtype str
         """
         return self.__projectTasksScanFilter.strip()
-    
+
     def setTasksScanFilter(self, filterStr: str):
         """
         Public method to set the project scan filter.
-        
+
         @param filterStr project scan filter
         @type str
         """
@@ -860,35 +923,36 @@
 class ProjectTaskExtractionThread(QThread):
     """
     Class implementing a thread to extract tasks related to a project.
-    
+
     @signal taskFound(str, str, int, TaskType) emitted with the task
         description, the file name, the line number and task type to signal
         the presence of a task
     """
+
     taskFound = pyqtSignal(str, str, int, TaskType)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__()
-        
+
         self.__lock = threading.Lock()
         self.__interrupt = False
-    
+
     def requestInterrupt(self):
         """
         Public method to request iterruption of the thread.
         """
         if self.isRunning():
             self.__interrupt = True
-    
+
     def scan(self, markers, files):
         """
         Public method to scan the given list of files for tasks.
-        
+
         @param markers dictionary of defined task markers
         @type dict of lists of str
         @param files list of file names to be scanned
@@ -900,10 +964,10 @@
             self.__markers = {}
             for markerType in markers:
                 self.__markers[markerType] = markers[markerType][:]
-            
+
             if not self.isRunning():
                 self.start(QThread.Priority.LowPriority)
-    
+
     def run(self):
         """
         Public thread method to scan the given files.
@@ -913,37 +977,36 @@
             markers = {}
             for markerType in self.__markers:
                 markers[markerType] = self.__markers[markerType][:]
-        
+
         for fn in files:
             if self.__interrupt:
                 break
-            
+
             # read the file and split it into textlines
             try:
                 text, encoding = Utilities.readEncodedFile(fn)
                 lines = text.splitlines()
             except (UnicodeError, OSError):
                 continue
-            
+
             # now search tasks and record them
             for lineIndex, line in enumerate(lines, start=1):
                 if self.__interrupt:
                     break
-                
+
                 found = False
-                
+
                 if line.endswith("__NO-TASK__"):
                     # ignore potential task marker
                     continue
-                
+
                 for taskType, taskMarkers in markers.items():
                     for taskMarker in taskMarkers:
                         index = line.find(taskMarker)
                         if index > -1:
                             task = line[index:]
                             with self.__lock:
-                                self.taskFound.emit(task, fn, lineIndex,
-                                                    taskType)
+                                self.taskFound.emit(task, fn, lineIndex, taskType)
                             found = True
                             break
                     if found:
--- a/src/eric7/Tasks/TasksFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tasks/TasksFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,10 +25,11 @@
     """
     Class representing the tasks JSON file.
     """
+
     def __init__(self, isGlobal: bool, parent: QObject = None):
         """
         Constructor
-        
+
         @param isGlobal flag indicating a file for global tasks
         @type bool
         @param parent reference to the parent object (defaults to None)
@@ -36,11 +37,11 @@
         """
         super().__init__(parent)
         self.__isGlobal = isGlobal
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the tasks data to a tasks JSON file.
-        
+
         @param filename name of the tasks file
         @type str
         @return flag indicating a successful write
@@ -52,14 +53,12 @@
         if self.__isGlobal:
             tasksDict["header"] = {
                 "comment": "eric tasks file",
-                "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
-                "warning": (
-                    "This file was generated automatically, do not edit."
-                ),
+                "saved": time.strftime("%Y-%m-%d, %H:%M:%S"),
+                "warning": ("This file was generated automatically, do not edit."),
             }
             # step 1: project scan filter
             tasksDict["ProjectScanFilter"] = ""
-            
+
             # step 2: tasks
             tasksDict["Tasks"] = [
                 task.toDict()
@@ -68,26 +67,23 @@
         else:
             tasksDict["header"] = {
                 "comment": "eric tasks file for project {0}".format(
-                    ericApp().getObject("Project").getProjectName()),
-                "warning": (
-                    "This file was generated automatically, do not edit."
+                    ericApp().getObject("Project").getProjectName()
                 ),
+                "warning": ("This file was generated automatically, do not edit."),
             }
             if Preferences.getProject("TimestampFile"):
-                tasksDict["header"]["saved"] = (
-                    time.strftime('%Y-%m-%d, %H:%M:%S')
-                )
+                tasksDict["header"]["saved"] = time.strftime("%Y-%m-%d, %H:%M:%S")
             # step 1: project scan filter
             tasksDict["ProjectScanFilter"] = (
                 ericApp().getObject("TaskViewer").getTasksScanFilter()
             )
-            
+
             # step 2: tasks
             tasksDict["Tasks"] = [
                 task.toDict()
                 for task in ericApp().getObject("TaskViewer").getProjectTasks()
             ]
-        
+
         try:
             jsonString = json.dumps(tasksDict, indent=2)
             with open(filename, "w") as f:
@@ -100,16 +96,16 @@
                     self.tr(
                         "<p>The tasks file <b>{0}</b> could not be"
                         " written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the tasks data from a task JSON file.
-        
+
         @param filename name of the project file
         @type str
         @return flag indicating a successful read
@@ -126,28 +122,33 @@
                 self.tr(
                     "<p>The tasks file <b>{0}</b> could not be read.</p>"
                     "<p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         viewer = ericApp().getObject("TaskViewer")
         if tasksDict["ProjectScanFilter"]:
             viewer.setTasksScanFilter(tasksDict["ProjectScanFilter"])
-        
+
         addedTasks = []
         for task in tasksDict["Tasks"]:
             addedTask = viewer.addTask(
-                task["summary"], priority=TaskPriority(task["priority"]),
-                filename=task["filename"], lineno=task["lineno"],
-                completed=task["completed"], _time=task["created"],
+                task["summary"],
+                priority=TaskPriority(task["priority"]),
+                filename=task["filename"],
+                lineno=task["lineno"],
+                completed=task["completed"],
+                _time=task["created"],
                 isProjectTask=not self.__isGlobal,
                 taskType=TaskType(task["type"]),
-                description=task["description"], uid=task["uid"],
-                parentTask=task["parent_uid"])
+                description=task["description"],
+                uid=task["uid"],
+                parentTask=task["parent_uid"],
+            )
             if addedTask:
                 addedTasks.append((addedTask, task["expanded"]))
-        
+
         for task, expanded in addedTasks:
             task.setExpanded(expanded)
-        
+
         return True
--- a/src/eric7/Templates/TemplateMultipleVariablesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Templates/TemplateMultipleVariablesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,19 @@
 
 from PyQt6.QtCore import QSize, Qt
 from PyQt6.QtWidgets import (
-    QSizePolicy, QSpacerItem, QWidget, QHBoxLayout, QLineEdit, QPushButton,
-    QTextEdit, QDialog, QScrollArea, QFrame, QGridLayout, QVBoxLayout, QLabel
+    QSizePolicy,
+    QSpacerItem,
+    QWidget,
+    QHBoxLayout,
+    QLineEdit,
+    QPushButton,
+    QTextEdit,
+    QDialog,
+    QScrollArea,
+    QFrame,
+    QGridLayout,
+    QVBoxLayout,
+    QLabel,
 )
 
 
@@ -18,32 +29,32 @@
     """
     Class implementing a dialog for entering multiple template variables.
     """
+
     def __init__(self, variables, parent=None):
         """
         Constructor
-        
+
         @param variables list of template variable names (list of strings)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
 
         self.TemplateMultipleVariablesDialogLayout = QVBoxLayout(self)
-        self.TemplateMultipleVariablesDialogLayout.setContentsMargins(
-            6, 6, 6, 6)
+        self.TemplateMultipleVariablesDialogLayout.setContentsMargins(6, 6, 6, 6)
         self.TemplateMultipleVariablesDialogLayout.setSpacing(6)
         self.TemplateMultipleVariablesDialogLayout.setObjectName(
-            "TemplateMultipleVariablesDialogLayout")
+            "TemplateMultipleVariablesDialogLayout"
+        )
         self.setLayout(self.TemplateMultipleVariablesDialogLayout)
 
         # generate the scrollarea
         self.variablesView = QScrollArea(self)
         self.variablesView.setObjectName("variablesView")
-        self.TemplateMultipleVariablesDialogLayout.addWidget(
-            self.variablesView)
-        
+        self.TemplateMultipleVariablesDialogLayout.addWidget(self.variablesView)
+
         self.variablesView.setWidgetResizable(True)
         self.variablesView.setFrameStyle(QFrame.Shape.NoFrame)
-        
+
         self.top = QWidget(self)
         self.variablesView.setWidget(self.top)
         self.grid = QGridLayout(self.top)
@@ -69,7 +80,8 @@
             self.variablesEntries[var] = t
         # add a spacer to make the entries aligned at the top
         spacer = QSpacerItem(
-            20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
+            20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+        )
         self.grid.addItem(spacer, self.grid.rowCount(), 1)
         self.variablesEntries[variables[0]].setFocus()
         self.top.adjustSize()
@@ -79,9 +91,10 @@
         layout1.setContentsMargins(0, 0, 0, 0)
         layout1.setSpacing(6)
         layout1.setObjectName("layout1")
-        
+
         spacer1 = QSpacerItem(
-            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         layout1.addItem(spacer1)
 
         self.okButton = QPushButton(self)
@@ -92,11 +105,12 @@
         self.cancelButton = QPushButton(self)
         self.cancelButton.setObjectName("cancelButton")
         layout1.addWidget(self.cancelButton)
-        
+
         spacer2 = QSpacerItem(
-            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         layout1.addItem(spacer2)
-        
+
         self.TemplateMultipleVariablesDialogLayout.addLayout(layout1)
 
         # set the texts of the standard widgets
@@ -113,7 +127,7 @@
     def getVariables(self):
         """
         Public method to get the values for all variables.
-        
+
         @return dictionary with the variable as a key and its value (string)
         """
         values = {}
--- a/src/eric7/Templates/TemplatePropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Templates/TemplatePropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing the templates properties dialog.
     """
+
     def __init__(self, parent, groupMode=False, itm=None):
         """
         Constructor
-        
+
         @param parent the parent widget (QWidget)
         @param groupMode flag indicating group mode (boolean)
         @param itm item (TemplateEntry or TemplateGroup) to
@@ -33,35 +34,39 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.templateEdit.setFont(Preferences.getTemplates("EditorFont"))
-        
+
         if not groupMode:
-            self.nameEdit.setWhatsThis(self.tr(
-                """<b>Template name<b><p>Enter the name of the template."""
-                """ Templates may be autocompleted upon this name."""
-                """ In order to support autocompletion. the template name"""
-                """ must only consist of letters (a-z and A-Z),"""
-                """ digits (0-9) and underscores (_).</p>"""
-            ))
+            self.nameEdit.setWhatsThis(
+                self.tr(
+                    """<b>Template name<b><p>Enter the name of the template."""
+                    """ Templates may be autocompleted upon this name."""
+                    """ In order to support autocompletion. the template name"""
+                    """ must only consist of letters (a-z and A-Z),"""
+                    """ digits (0-9) and underscores (_).</p>"""
+                )
+            )
             self.__nameValidator = QRegularExpressionValidator(
-                QRegularExpression("[a-zA-Z0-9_]+"), self.nameEdit)
+                QRegularExpression("[a-zA-Z0-9_]+"), self.nameEdit
+            )
             self.nameEdit.setValidator(self.__nameValidator)
-        
+
         import QScintilla.Lexers
+
         self.languages = [("All", self.tr("All"))]
         supportedLanguages = QScintilla.Lexers.getSupportedLanguages()
         languages = sorted(supportedLanguages.keys())
         for language in languages:
             self.languages.append((language, supportedLanguages[language][0]))
-        
+
         self.groupMode = groupMode
         if groupMode:
             self.groupLabel.setText(self.tr("Language:"))
             for lang, langDisp in self.languages:
                 self.groupCombo.addItem(
-                    QScintilla.Lexers.getLanguageIcon(lang, False),
-                    langDisp)
+                    QScintilla.Lexers.getLanguageIcon(lang, False), langDisp
+                )
             self.templateLabel.setEnabled(False)
             self.templateEdit.setEnabled(False)
             self.templateEdit.setPlainText(self.tr("GROUP"))
@@ -73,7 +78,7 @@
             for group in parent.getGroupNames():
                 groups.append(group)
             self.groupCombo.addItems(groups)
-        
+
         if itm is not None:
             self.nameEdit.setText(itm.getName())
             if groupMode:
@@ -86,25 +91,26 @@
                 self.setSelectedGroup(itm.getGroupName())
                 self.templateEdit.setPlainText(itm.getTemplateText())
                 self.descriptionEdit.setText(itm.getDescription())
-            
+
             self.nameEdit.selectAll()
-        
+
         self.__helpDialog = None
 
     def keyPressEvent(self, ev):
         """
         Protected method to handle the user pressing the escape key.
-        
+
         @param ev key event (QKeyEvent)
         """
         if ev.key() == Qt.Key.Key_Escape:
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Close dialog"),
-                self.tr("""Do you really want to close the dialog?"""))
+                self.tr("""Do you really want to close the dialog?"""),
+            )
             if not res:
                 self.reject()
-    
+
     @pyqtSlot()
     def on_helpButton_clicked(self):
         """
@@ -112,6 +118,7 @@
         """
         if self.__helpDialog is None:
             from EricWidgets.EricSimpleHelpDialog import EricSimpleHelpDialog
+
             self.__helpDialog = EricSimpleHelpDialog(
                 title=self.tr("Template Help"),
                 label=self.tr("<b>Template Help</b>"),
@@ -202,13 +209,14 @@
                     """ anything different, please use the configuration"""
                     """ dialog to do so.</p>"""
                 ),
-                parent=self)
+                parent=self,
+            )
         self.__helpDialog.show()
-        
+
     def setSelectedGroup(self, name):
         """
         Public method to select a group.
-        
+
         @param name name of the group to be selected (string)
         """
         index = self.groupCombo.findText(name)
@@ -217,18 +225,20 @@
     def getData(self):
         """
         Public method to get the data entered into the dialog.
-        
+
         @return a tuple of two strings (name, language), if the dialog is in
             group mode, and a tuple of four strings (name, description, group
             name, template) otherwise.
         """
         if self.groupMode:
-            return (self.nameEdit.text(),
-                    self.languages[self.groupCombo.currentIndex()][0]
-                    )
+            return (
+                self.nameEdit.text(),
+                self.languages[self.groupCombo.currentIndex()][0],
+            )
         else:
-            return (self.nameEdit.text(),
-                    self.descriptionEdit.text(),
-                    self.groupCombo.currentText(),
-                    self.templateEdit.toPlainText()
-                    )
+            return (
+                self.nameEdit.text(),
+                self.descriptionEdit.text(),
+                self.groupCombo.currentText(),
+                self.templateEdit.toPlainText(),
+            )
--- a/src/eric7/Templates/TemplateSingleVariableDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Templates/TemplateSingleVariableDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,22 +16,23 @@
     """
     Class implementing a dialog for entering a single template variable.
     """
+
     def __init__(self, variable, parent=None):
         """
         Constructor
-        
+
         @param variable template variable name (string)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.variableLabel.setText(variable)
 
     def getVariable(self):
         """
         Public method to get the value for the variable.
-        
+
         @return value for the template variable (string)
         """
         return self.variableEdit.toPlainText()
--- a/src/eric7/Templates/TemplateViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Templates/TemplateViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,9 +13,7 @@
 import re
 
 from PyQt6.QtCore import QFile, QIODevice, Qt, QCoreApplication
-from PyQt6.QtWidgets import (
-    QTreeWidget, QDialog, QApplication, QMenu, QTreeWidgetItem
-)
+from PyQt6.QtWidgets import QTreeWidget, QDialog, QApplication, QMenu, QTreeWidgetItem
 
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox, EricFileDialog
@@ -32,10 +30,11 @@
     """
     Class implementing a template group.
     """
+
     def __init__(self, parent, name, language="All"):
         """
         Constructor
-        
+
         @param parent parent widget of the template group (QWidget)
         @param name name of the group (string)
         @param language programming language for the group (string)
@@ -43,16 +42,16 @@
         self.name = name
         self.language = language
         self.entries = {}
-        
+
         super().__init__(parent, [name])
-        
+
         if Preferences.getTemplates("ShowTooltip"):
             self.setToolTip(0, language)
-    
+
     def setName(self, name):
         """
         Public method to update the name of the group.
-        
+
         @param name name of the group (string)
         """
         self.name = name
@@ -61,15 +60,15 @@
     def getName(self):
         """
         Public method to get the name of the group.
-        
+
         @return name of the group (string)
         """
         return self.name
-        
+
     def setLanguage(self, language):
         """
         Public method to update the name of the group.
-        
+
         @param language programming language for the group (string)
         """
         self.language = language
@@ -79,15 +78,15 @@
     def getLanguage(self):
         """
         Public method to get the name of the group.
-        
+
         @return language of the group (string)
         """
         return self.language
-        
+
     def addEntry(self, name, description, template, quiet=False):
         """
         Public method to add a template entry to this group.
-        
+
         @param name name of the entry (string)
         @param description description of the entry to add (string)
         @param template template text of the entry (string)
@@ -97,41 +96,38 @@
             if not quiet:
                 EricMessageBox.critical(
                     None,
-                    QCoreApplication.translate("TemplateGroup",
-                                               "Add Template"),
+                    QCoreApplication.translate("TemplateGroup", "Add Template"),
                     QCoreApplication.translate(
                         "TemplateGroup",
                         """<p>The group <b>{0}</b> already contains a"""
-                        """ template named <b>{1}</b>.</p>""")
-                    .format(self.name, name))
+                        """ template named <b>{1}</b>.</p>""",
+                    ).format(self.name, name),
+                )
             return
-        
+
         self.entries[name] = TemplateEntry(self, name, description, template)
-        
-        if (
-            Preferences.getTemplates("AutoOpenGroups") and
-            not self.isExpanded()
-        ):
+
+        if Preferences.getTemplates("AutoOpenGroups") and not self.isExpanded():
             self.setExpanded(True)
-    
+
     def removeEntry(self, name):
         """
         Public method to remove a template entry from this group.
-        
+
         @param name name of the entry to be removed (string)
         """
         if name in self.entries:
             index = self.indexOfChild(self.entries[name])
             self.takeChild(index)
             del self.entries[name]
-            
+
             if (
-                len(self.entries) == 0 and
-                Preferences.getTemplates("AutoOpenGroups") and
-                self.isExpanded()
+                len(self.entries) == 0
+                and Preferences.getTemplates("AutoOpenGroups")
+                and self.isExpanded()
             ):
                 self.setExpanded(False)
-    
+
     def removeAllEntries(self):
         """
         Public method to remove all template entries of this group.
@@ -142,16 +138,16 @@
     def hasEntry(self, name):
         """
         Public method to check, if the group has an entry with the given name.
-        
+
         @param name name of the entry to check for (string)
         @return flag indicating existence (boolean)
         """
         return name in self.entries
-    
+
     def getEntry(self, name):
         """
         Public method to get an entry.
-        
+
         @param name name of the entry to retrieve (string)
         @return reference to the entry (TemplateEntry)
         """
@@ -164,7 +160,7 @@
         """
         Public method to get the names of all entries, who's name starts with
         the given string.
-        
+
         @param beginning string denoting the beginning of the template name
             (string)
         @return list of entry names found (list of strings)
@@ -173,13 +169,13 @@
         for name in self.entries:
             if name.startswith(beginning):
                 names.append(name)
-        
+
         return names
 
     def getAllEntries(self):
         """
         Public method to retrieve all entries.
-        
+
         @return list of all entries (list of TemplateEntry)
         """
         return list(self.entries.values())
@@ -189,10 +185,11 @@
     """
     Class immplementing a template entry.
     """
+
     def __init__(self, parent, name, description, templateText):
         """
         Constructor
-        
+
         @param parent parent widget of the template entry (QWidget)
         @param name name of the entry (string)
         @param description descriptive text for the template (string)
@@ -202,7 +199,7 @@
         self.description = description
         self.template = templateText
         self.__extractVariables()
-        
+
         super().__init__(parent, [self.__displayText()])
         if Preferences.getTemplates("ShowTooltip"):
             self.setToolTip(0, self.template)
@@ -210,20 +207,20 @@
     def __displayText(self):
         """
         Private method to generate the display text.
-        
+
         @return display text (string)
         """
         txt = (
             "{0} - {1}".format(self.name, self.description)
-            if self.description else
-            self.name
+            if self.description
+            else self.name
         )
         return txt
-    
+
     def setName(self, name):
         """
         Public method to update the name of the entry.
-        
+
         @param name name of the entry (string)
         """
         self.name = name
@@ -232,7 +229,7 @@
     def getName(self):
         """
         Public method to get the name of the entry.
-        
+
         @return name of the entry (string)
         """
         return self.name
@@ -240,7 +237,7 @@
     def setDescription(self, description):
         """
         Public method to update the description of the entry.
-        
+
         @param description description of the entry (string)
         """
         self.description = description
@@ -249,7 +246,7 @@
     def getDescription(self):
         """
         Public method to get the description of the entry.
-        
+
         @return description of the entry (string)
         """
         return self.description
@@ -257,15 +254,15 @@
     def getGroupName(self):
         """
         Public method to get the name of the group this entry belongs to.
-        
+
         @return name of the group containing this entry (string)
         """
         return self.parent().getName()
-        
+
     def setTemplateText(self, templateText):
         """
         Public method to update the template text.
-        
+
         @param templateText text of the template entry (string)
         """
         self.template = templateText
@@ -276,7 +273,7 @@
     def getTemplateText(self):
         """
         Public method to get the template text.
-        
+
         @return the template text (string)
         """
         return self.template
@@ -284,7 +281,7 @@
     def getExpandedText(self, varDict, indent):
         """
         Public method to get the template text with all variables expanded.
-        
+
         @param varDict dictionary containing the texts of each variable
             with the variable name as key.
         @param indent indentation of the line receiving he expanded
@@ -296,8 +293,8 @@
         for var, val in list(varDict.items()):
             txt = (
                 self.__expandFormattedVariable(var, val, txt)
-                if var in self.formatedVariables else
-                txt.replace(var, val)
+                if var in self.formatedVariables
+                else txt.replace(var, val)
             )
         sepchar = Preferences.getTemplates("SeparatorChar")
         txt = txt.replace("{0}{1}".format(sepchar, sepchar), sepchar)
@@ -316,7 +313,7 @@
     def __expandFormattedVariable(self, var, val, txt):
         """
         Private method to expand a template variable with special formatting.
-        
+
         @param var template variable name (string)
         @param val value of the template variable (string)
         @param txt template text (string)
@@ -326,22 +323,21 @@
         for line in txt.splitlines():
             ind = line.find(var)
             if ind >= 0:
-                variableFormat = var[1:-1].split(':', 1)[1]
-                if variableFormat == 'rl':
+                variableFormat = var[1:-1].split(":", 1)[1]
+                if variableFormat == "rl":
                     prefix = line[:ind]
-                    postfix = line[ind + len(var):]
+                    postfix = line[ind + len(var) :]
                     for v in val.splitlines():
-                        t = "{0}{1}{2}{3}{4}".format(
-                            t, os.linesep, prefix, v, postfix)
-                elif variableFormat == 'ml':
+                        t = "{0}{1}{2}{3}{4}".format(t, os.linesep, prefix, v, postfix)
+                elif variableFormat == "ml":
                     indent = line.replace(line.lstrip(), "")
                     prefix = line[:ind]
-                    postfix = line[ind + len(var):]
+                    postfix = line[ind + len(var) :]
                     for count, v in enumerate(val.splitlines()):
                         t = (
                             "{0}{1}{2}{3}".format(t, os.linesep, indent, v)
-                            if count else
-                            "{0}{1}{2}{3}".format(t, os.linesep, prefix, v)
+                            if count
+                            else "{0}{1}{2}{3}".format(t, os.linesep, prefix, v)
                         )
                     t = "{0}{1}".format(t, postfix)
                 else:
@@ -353,7 +349,7 @@
     def getVariables(self):
         """
         Public method to get the list of variables.
-        
+
         @return list of variables (list of strings)
         """
         return self.variables
@@ -364,8 +360,7 @@
         """
         sepchar = Preferences.getTemplates("SeparatorChar")
         variablesPattern = re.compile(
-            r"""\{0}[a-zA-Z][a-zA-Z0-9_]*(?::(?:ml|rl))?\{1}""".format(
-                sepchar, sepchar)
+            r"""\{0}[a-zA-Z][a-zA-Z0-9_]*(?::(?:ml|rl))?\{1}""".format(sepchar, sepchar)
         )
         variables = variablesPattern.findall(self.template)
         self.variables = []
@@ -373,7 +368,7 @@
         for var in variables:
             if var not in self.variables:
                 self.variables.append(var)
-            if var.find(':') >= 0 and var not in self.formatedVariables:
+            if var.find(":") >= 0 and var not in self.formatedVariables:
                 self.formatedVariables.append(var)
 
 
@@ -381,27 +376,29 @@
     """
     Class implementing the template viewer.
     """
+
     def __init__(self, parent, viewmanager):
         """
         Constructor
-        
+
         @param parent the parent (QWidget)
         @param viewmanager reference to the viewmanager object
         """
         super().__init__(parent)
-        
+
         self.viewmanager = viewmanager
         self.groups = {}
-        
+
         self.setHeaderLabels(["Template"])
         self.header().hide()
         self.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         self.setRootIsDecorated(True)
         self.setAlternatingRowColors(True)
-        
+
         self.__menu = QMenu(self)
         self.applyAct = self.__menu.addAction(
-            self.tr("Apply"), self.__templateItemActivated)
+            self.tr("Apply"), self.__templateItemActivated
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Add entry..."), self.__addEntry)
         self.__menu.addAction(self.tr("Add group..."), self.__addGroup)
@@ -413,47 +410,45 @@
         self.__menu.addAction(self.tr("Export..."), self.__export)
         self.__menu.addAction(self.tr("Reload"), self.__reload)
         self.__menu.addSeparator()
-        self.__menu.addAction(
-            self.tr("Help about Templates..."), self.__showHelp)
+        self.__menu.addAction(self.tr("Help about Templates..."), self.__showHelp)
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.__backMenu = QMenu(self)
         self.__backMenu.addAction(self.tr("Add group..."), self.__addGroup)
         self.__backMenu.addSeparator()
         self.bmSaveAct = self.__backMenu.addAction(self.tr("Save"), self.save)
         self.__backMenu.addAction(self.tr("Import..."), self.__import)
         self.bmExportAct = self.__backMenu.addAction(
-            self.tr("Export..."), self.__export)
+            self.tr("Export..."), self.__export
+        )
         self.__backMenu.addAction(self.tr("Reload"), self.__reload)
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(
-            self.tr("Help about Templates..."), self.__showHelp)
+        self.__backMenu.addAction(self.tr("Help about Templates..."), self.__showHelp)
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(
-            self.tr("Configure..."), self.__configure)
-        
+        self.__backMenu.addAction(self.tr("Configure..."), self.__configure)
+
         self.__activating = False
         self.__dirty = False
-        
+
         self.__templatesFile = TemplatesFile(self)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.itemActivated.connect(self.__templateItemActivated)
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
     def __resort(self):
         """
         Private method to resort the tree.
         """
         self.sortItems(self.sortColumn(), self.header().sortIndicatorOrder())
-        
+
     def __templateItemActivated(self, itm=None, col=0):
         """
         Private slot to handle the activation of an item.
-        
+
         @param itm reference to the activated item (QTreeWidgetItem)
         @param col column the item was activated in (integer)
         """
@@ -463,11 +458,11 @@
             if isinstance(itm, TemplateEntry):
                 self.applyTemplate(itm)
             self.__activating = False
-        
+
     def __showContextMenu(self, coord):
         """
         Private slot to show the context menu of the list.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         itm = self.itemAt(coord)
@@ -478,49 +473,51 @@
             self.__backMenu.popup(coord)
         else:
             self.applyAct.setEnabled(
-                self.viewmanager.activeWindow() is not None and
-                isinstance(itm, TemplateEntry))
+                self.viewmanager.activeWindow() is not None
+                and isinstance(itm, TemplateEntry)
+            )
             self.saveAct.setEnabled(self.__dirty)
             self.__menu.popup(coord)
-    
+
     def __addEntry(self):
         """
         Private slot to handle the Add Entry context menu action.
         """
         itm = self.currentItem()
         groupName = (
-            itm.getName()
-            if isinstance(itm, TemplateGroup) else
-            itm.getGroupName()
+            itm.getName() if isinstance(itm, TemplateGroup) else itm.getGroupName()
         )
-        
+
         from .TemplatePropertiesDialog import TemplatePropertiesDialog
+
         dlg = TemplatePropertiesDialog(self)
         dlg.setSelectedGroup(groupName)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, description, groupName, template = dlg.getData()
             self.addEntry(groupName, name, description, template)
             self.__dirty = True
-        
+
     def __addGroup(self):
         """
         Private slot to handle the Add Group context menu action.
         """
         from .TemplatePropertiesDialog import TemplatePropertiesDialog
+
         dlg = TemplatePropertiesDialog(self, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             name, language = dlg.getData()
             self.addGroup(name, language)
             self.__dirty = True
-        
+
     def __edit(self):
         """
         Private slot to handle the Edit context menu action.
         """
         itm = self.currentItem()
         editGroup = not isinstance(itm, TemplateEntry)
-        
+
         from .TemplatePropertiesDialog import TemplatePropertiesDialog
+
         dlg = TemplatePropertiesDialog(self, editGroup, itm)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             if editGroup:
@@ -530,7 +527,7 @@
                 name, description, groupName, template = dlg.getData()
                 self.changeEntry(itm, name, groupName, description, template)
             self.__dirty = True
-        
+
     def __remove(self):
         """
         Private slot to handle the Remove context menu action.
@@ -539,8 +536,10 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Remove Template"),
-            self.tr("""<p>Do you really want to remove <b>{0}</b>?</p>""")
-            .format(itm.getName()))
+            self.tr("""<p>Do you really want to remove <b>{0}</b>?</p>""").format(
+                itm.getName()
+            ),
+        )
         if not res:
             return
 
@@ -567,10 +566,13 @@
             self,
             self.tr("Import Templates"),
             "",
-            self.tr("Templates Files (*.ecj);;"
-                    "XML Templates Files (*.e4c);;"
-                    "All Files (*)"))
-        
+            self.tr(
+                "Templates Files (*.ecj);;"
+                "XML Templates Files (*.e4c);;"
+                "All Files (*)"
+            ),
+        )
+
         if fn:
             self.readTemplates(fn)
             self.__dirty = True
@@ -583,11 +585,11 @@
             self,
             self.tr("Export Templates"),
             "",
-            self.tr("Templates Files (*.ecj);;"
-                    "All Files (*)"),
+            self.tr("Templates Files (*.ecj);;" "All Files (*)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if fn:
             fpath = pathlib.Path(fn)
             if not fpath.suffix:
@@ -598,14 +600,17 @@
                 ok = EricMessageBox.yesNo(
                     self,
                     self.tr("Export Templates"),
-                    self.tr("""<p>The templates file <b>{0}</b> exists"""
-                            """ already. Overwrite it?</p>""").format(fpath))
+                    self.tr(
+                        """<p>The templates file <b>{0}</b> exists"""
+                        """ already. Overwrite it?</p>"""
+                    ).format(fpath),
+                )
             else:
                 ok = True
-            
+
             if ok:
                 self.writeTemplates(str(fpath))
-    
+
     def __reload(self):
         """
         Private slot to reload the templates.
@@ -616,16 +621,18 @@
                 self.tr("Reload Templates"),
                 self.tr(
                     """The templates contain unsaved changes. Shall these"""
-                    """ changes be discarded?"""),
-                icon=EricMessageBox.Warning)
+                    """ changes be discarded?"""
+                ),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         self.clear()
         self.groups = {}
-        
+
         self.readTemplates()
-    
+
     def __showHelp(self):
         """
         Private method to show some help.
@@ -642,12 +649,14 @@
                 """<p><b>Template entries</b> are the actual templates."""
                 """ They are grouped by the template groups. Help about"""
                 """ how to define them is available in the template edit"""
-                """ dialog.</p>"""))
+                """ dialog.</p>"""
+            ),
+        )
 
     def __getPredefinedVars(self):
         """
         Private method to return predefined variables.
-        
+
         @return dictionary of predefined variables and their values
         """
         project = ericApp().getObject("Project")
@@ -656,16 +665,16 @@
         sepchar = Preferences.getTemplates("SeparatorChar")
         keyfmt = sepchar + "{0}" + sepchar
         varValues = {
-            keyfmt.format('date'): now.date().isoformat(),
-            keyfmt.format('year'): str(now.date().year),
-            keyfmt.format('time'): now.time().strftime("%H:%M:%S"),
+            keyfmt.format("date"): now.date().isoformat(),
+            keyfmt.format("year"): str(now.date().year),
+            keyfmt.format("time"): now.time().strftime("%H:%M:%S"),
         }
 
         if project.name:
-            varValues[keyfmt.format('project_name')] = project.name
+            varValues[keyfmt.format("project_name")] = project.name
 
         if project.ppath:
-            varValues[keyfmt.format('project_path')] = project.ppath
+            varValues[keyfmt.format("project_path")] = project.ppath
 
         path_name = editor.getFileName()
         if path_name:
@@ -675,68 +684,68 @@
                 ext = ext[1:]
             path_name_rel = project.getRelativePath(path_name)
             dir_name_rel = project.getRelativePath(dir_name)
-            varValues.update({
-                keyfmt.format('path_name'): path_name,
-                keyfmt.format('path_name_rel'): path_name_rel,
-                keyfmt.format('dir_name'): dir_name,
-                keyfmt.format('dir_name_rel'): dir_name_rel,
-                keyfmt.format('file_name'): file_name,
-                keyfmt.format('base_name'): base_name,
-                keyfmt.format('ext'): ext
-            })
-        
-        varValues[keyfmt.format('clipboard:ml')] = (
-            QApplication.clipboard().text()
-        )
-        varValues[keyfmt.format('clipboard')] = QApplication.clipboard().text()
+            varValues.update(
+                {
+                    keyfmt.format("path_name"): path_name,
+                    keyfmt.format("path_name_rel"): path_name_rel,
+                    keyfmt.format("dir_name"): dir_name,
+                    keyfmt.format("dir_name_rel"): dir_name_rel,
+                    keyfmt.format("file_name"): file_name,
+                    keyfmt.format("base_name"): base_name,
+                    keyfmt.format("ext"): ext,
+                }
+            )
+
+        varValues[keyfmt.format("clipboard:ml")] = QApplication.clipboard().text()
+        varValues[keyfmt.format("clipboard")] = QApplication.clipboard().text()
 
         if editor.hasSelectedText():
-            varValues[keyfmt.format('cur_select:ml')] = editor.selectedText()
-            varValues[keyfmt.format('cur_select')] = editor.selectedText()
+            varValues[keyfmt.format("cur_select:ml")] = editor.selectedText()
+            varValues[keyfmt.format("cur_select")] = editor.selectedText()
         else:
-            varValues[keyfmt.format('cur_select:ml')] = os.linesep
-            varValues[keyfmt.format('cur_select')] = ""
+            varValues[keyfmt.format("cur_select:ml")] = os.linesep
+            varValues[keyfmt.format("cur_select")] = ""
 
-        varValues[keyfmt.format('insertion')] = "i_n_s_e_r_t_i_o_n"
-        
-        varValues[keyfmt.format('select_start')] = "s_e_l_e_c_t_s_t_a_r_t"
-        varValues[keyfmt.format('select_end')] = "s_e_l_e_c_t_e_n_d"
+        varValues[keyfmt.format("insertion")] = "i_n_s_e_r_t_i_o_n"
+
+        varValues[keyfmt.format("select_start")] = "s_e_l_e_c_t_s_t_a_r_t"
+        varValues[keyfmt.format("select_end")] = "s_e_l_e_c_t_e_n_d"
 
         return varValues
 
     def applyTemplate(self, itm):
         """
         Public method to apply the template.
-        
+
         @param itm reference to the template item to apply (TemplateEntry)
         """
         editor = self.viewmanager.activeWindow()
         if editor is None:
             return
-        
+
         ok = False
         variables = itm.getVariables()
         varValues = self.__getPredefinedVars()
-        
+
         # Remove predefined variables from list so user doesn't have to fill
         # these values out in the dialog.
         for v in list(varValues.keys()):
             if v in variables:
                 variables.remove(v)
-        
+
         if variables:
             if Preferences.getTemplates("SingleDialog"):
                 from .TemplateMultipleVariablesDialog import (
-                    TemplateMultipleVariablesDialog
+                    TemplateMultipleVariablesDialog,
                 )
+
                 dlg = TemplateMultipleVariablesDialog(variables, self)
                 if dlg.exec() == QDialog.DialogCode.Accepted:
                     varValues.update(dlg.getVariables())
                     ok = True
             else:
-                from .TemplateSingleVariableDialog import (
-                    TemplateSingleVariableDialog
-                )
+                from .TemplateSingleVariableDialog import TemplateSingleVariableDialog
+
                 for var in variables:
                     dlg = TemplateSingleVariableDialog(var, self)
                     if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -747,10 +756,9 @@
                 ok = True
         else:
             ok = True
-        
+
         if ok:
-            line = editor.text(
-                editor.getCursorPosition()[0]).replace(os.linesep, "")
+            line = editor.text(editor.getCursorPosition()[0]).replace(os.linesep, "")
             indent = line.replace(line.lstrip(), "")
             txt, lines, count = itm.getExpandedText(varValues, indent)
             # It should be done in this way to allow undo
@@ -760,19 +768,16 @@
                 editor.removeSelectedText()
             else:
                 line, index = editor.getCursorPosition()
-            
+
             if lines == 1:
                 count += index
             else:
                 if len(indent) > 0:
                     count += len(indent)
-            
+
             if "i_n_s_e_r_t_i_o_n" in txt and "s_e_l_e_c_t" in txt:
-                txt = (
-                    "'Insertion and selection can not be in"
-                    " template together'"
-                )
-            
+                txt = "'Insertion and selection can not be in" " template together'"
+
             if "i_n_s_e_r_t_i_o_n" in txt:
                 lines = 1
                 for aline in txt.splitlines():
@@ -787,7 +792,7 @@
                         break
                     else:
                         lines += 1
-            
+
             setselect = False
             if "s_e_l_e_c_t_s_t_a_r_t" in txt and "s_e_l_e_c_t_e_n_d" in txt:
                 setselect = True
@@ -807,22 +812,21 @@
                         break
                     else:
                         lineb += 1
-            
+
             editor.insert(txt)
-            
+
             if setselect:
-                editor.setSelection(line + linea - 1, posa,
-                                    line + lineb - 1, posb)
+                editor.setSelection(line + linea - 1, posa, line + lineb - 1, posb)
             else:
                 editor.setCursorPosition(line + lines - 1, count)
-                
+
             editor.endUndoAction()
             editor.setFocus()
 
     def applyNamedTemplate(self, templateName, groupName=None):
         """
         Public method to apply a template given a template name.
-        
+
         @param templateName name of the template item to apply (string)
         @param groupName name of the group to get the entry from (string).
             None or empty means to apply the first template found with the
@@ -840,34 +844,33 @@
             if template is not None:
                 self.applyTemplate(template)
                 break
-    
+
     def addEntry(self, groupName, name, description, template, quiet=False):
         """
         Public method to add a template entry.
-        
+
         @param groupName name of the group to add to (string)
         @param name name of the entry to add (string)
         @param description description of the entry to add (string)
         @param template template text of the entry (string)
         @param quiet flag indicating quiet operation (boolean)
         """
-        self.groups[groupName].addEntry(
-            name, description, template, quiet=quiet)
+        self.groups[groupName].addEntry(name, description, template, quiet=quiet)
         self.__resort()
-    
+
     def hasGroup(self, name):
         """
         Public method to check, if a group with the given name exists.
-        
+
         @param name name of the group to be checked for (string)
         @return flag indicating an existing group (boolean)
         """
         return name in self.groups
-    
+
     def addGroup(self, name, language="All"):
         """
         Public method to add a group.
-        
+
         @param name name of the group to be added (string)
         @param language programming language for the group (string)
         """
@@ -878,7 +881,7 @@
     def changeGroup(self, oldname, newname, language="All"):
         """
         Public method to rename a group.
-        
+
         @param oldname old name of the group (string)
         @param newname new name of the group (string)
         @param language programming language for the group (string)
@@ -888,30 +891,32 @@
                 EricMessageBox.warning(
                     self,
                     self.tr("Edit Template Group"),
-                    self.tr("""<p>A template group with the name"""
-                            """ <b>{0}</b> already exists.</p>""")
-                    .format(newname))
+                    self.tr(
+                        """<p>A template group with the name"""
+                        """ <b>{0}</b> already exists.</p>"""
+                    ).format(newname),
+                )
                 return
-            
+
             self.groups[newname] = self.groups[oldname]
             del self.groups[oldname]
             self.groups[newname].setName(newname)
-        
+
         self.groups[newname].setLanguage(language)
         self.__resort()
 
     def getAllGroups(self):
         """
         Public method to get all groups.
-        
+
         @return list of all groups (list of TemplateGroup)
         """
         return list(self.groups.values())
-    
+
     def getGroupNames(self):
         """
         Public method to get all group names.
-        
+
         @return list of all group names (list of strings)
         """
         groups = sorted(list(self.groups.keys())[:])
@@ -920,7 +925,7 @@
     def removeGroup(self, itm):
         """
         Public method to remove a group.
-        
+
         @param itm template group to be removed (TemplateGroup)
         """
         name = itm.getName()
@@ -932,7 +937,7 @@
     def removeEntry(self, itm):
         """
         Public method to remove a template entry.
-        
+
         @param itm template entry to be removed (TemplateEntry)
         """
         groupName = itm.getGroupName()
@@ -941,7 +946,7 @@
     def changeEntry(self, itm, name, groupName, description, template):
         """
         Public method to change a template entry.
-        
+
         @param itm template entry to be changed (TemplateEntry)
         @param name new name for the entry (string)
         @param groupName name of the group the entry should belong to
@@ -954,57 +959,55 @@
             self.groups[itm.getGroupName()].removeEntry(itm.getName())
             self.groups[groupName].addEntry(name, description, template)
             return
-        
+
         if itm.getName() != name:
             # entry was renamed
             self.groups[groupName].removeEntry(itm.getName())
             self.groups[groupName].addEntry(name, description, template)
             return
-        
+
         tmpl = self.groups[groupName].getEntry(name)
         tmpl.setDescription(description)
         tmpl.setTemplateText(template)
         self.__resort()
-    
+
     def writeTemplates(self, filename=None):
         """
         Public method to write the templates data to a JSON file (.ecj).
-        
+
         @param filename name of a templates file to write
         @type str
         @return flag indicating success
         @rtype bool
         """
         if filename is None:
-            filename = os.path.join(
-                Utilities.getConfigDir(), "eric7templates.ecj")
-        
+            filename = os.path.join(Utilities.getConfigDir(), "eric7templates.ecj")
+
         return self.__templatesFile.writeFile(filename)
-    
+
     def readTemplates(self, filename=None):
         """
         Public method to read in the templates file (.e4c).
-        
+
         @param filename name of a templates file to read
         @type str
         """
         if filename is None:
             # new JSON based file first
-            filename = os.path.join(
-                Utilities.getConfigDir(), "eric7templates.ecj")
+            filename = os.path.join(Utilities.getConfigDir(), "eric7templates.ecj")
             if not os.path.exists(filename):
                 # old XML based file second
-                filename = os.path.join(
-                    Utilities.getConfigDir(), "eric7templates.e4c")
+                filename = os.path.join(Utilities.getConfigDir(), "eric7templates.e4c")
                 if not os.path.exists(filename):
                     return
-        
+
         if filename.endswith(".ecj"):
             self.__templatesFile.readFile(filename)
         else:
             f = QFile(filename)
             if f.open(QIODevice.OpenModeFlag.ReadOnly):
                 from EricXML.TemplatesReader import TemplatesReader
+
                 reader = TemplatesReader(f, viewer=self)
                 reader.readXML()
                 f.close()
@@ -1013,20 +1016,20 @@
                     self,
                     self.tr("Read Templates"),
                     self.tr(
-                        "<p>The templates file <b>{0}</b> could not be read."
-                        "</p>")
-                    .format(filename))
-    
+                        "<p>The templates file <b>{0}</b> could not be read." "</p>"
+                    ).format(filename),
+                )
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("templatesPage")
-    
+
     def hasTemplate(self, entryName, groupName=None):
         """
         Public method to check, if an entry of the given name exists.
-        
+
         @param entryName name of the entry to check for (string)
         @param groupName name of the group to check for the entry (string).
             None or empty means to check all groups.
@@ -1039,14 +1042,14 @@
                 groups = []
         else:
             groups = list(self.groups.values())
-        
+
         return any(group.hasEntry(entryName) for group in groups)
-    
+
     def getTemplateNames(self, start, groupName=None):
         """
         Public method to get the names of templates starting with the
         given string.
-        
+
         @param start start string of the name (string)
         @param groupName name of the group to get the entry from (string).
             None or empty means to look in all groups.
--- a/src/eric7/Templates/TemplatesFile.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Templates/TemplatesFile.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class representing the templates JSON file.
     """
+
     def __init__(self, viewer: TemplateViewer, parent: QObject = None):
         """
         Constructor
-        
+
         @param viewer reference to the template viewer object
         @type TemplateViewer
         @param parent reference to the parent object (defaults to None)
@@ -35,11 +36,11 @@
         """
         super().__init__(parent)
         self.__viewer = viewer
-    
+
     def writeFile(self, filename: str) -> bool:
         """
         Public method to write the templates data to a templates JSON file.
-        
+
         @param filename name of the templates file
         @type str
         @return flag indicating a successful write
@@ -49,29 +50,31 @@
         # step 0: header
         templatesDict["header"] = {
             "comment": "eric templates file",
-            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
-            "warning": (
-                "This file was generated automatically, do not edit."
-            ),
+            "saved": time.strftime("%Y-%m-%d, %H:%M:%S"),
+            "warning": ("This file was generated automatically, do not edit."),
         }
-        
+
         # step 1: template groups and templates
         templateGroups = []
         for group in self.__viewer.getAllGroups():
             templates = []
             for template in group.getAllEntries():
-                templates.append({
-                    "name": template.getName(),
-                    "description": template.getDescription().strip(),
-                    "text": template.getTemplateText()
-                })
-            templateGroups.append({
-                "name": group.getName(),
-                "language": group.getLanguage(),
-                "templates": templates,
-            })
+                templates.append(
+                    {
+                        "name": template.getName(),
+                        "description": template.getDescription().strip(),
+                        "text": template.getTemplateText(),
+                    }
+                )
+            templateGroups.append(
+                {
+                    "name": group.getName(),
+                    "language": group.getLanguage(),
+                    "templates": templates,
+                }
+            )
         templatesDict["template_groups"] = templateGroups
-        
+
         try:
             jsonString = json.dumps(templatesDict, indent=2)
             with open(filename, "w") as f:
@@ -84,16 +87,16 @@
                     self.tr(
                         "<p>The templates file <b>{0}</b> could not be"
                         " written.</p><p>Reason: {1}</p>"
-                    ).format(filename, str(err))
+                    ).format(filename, str(err)),
                 )
                 return False
-        
+
         return True
-    
+
     def readFile(self, filename: str) -> bool:
         """
         Public method to read the templates data from a templates JSON file.
-        
+
         @param filename name of the templates file
         @type str
         @return flag indicating a successful read
@@ -110,18 +113,19 @@
                 self.tr(
                     "<p>The templates file <b>{0}</b> could not be read.</p>"
                     "<p>Reason: {1}</p>"
-                ).format(filename, str(err))
+                ).format(filename, str(err)),
             )
             return False
-        
+
         for templateGroup in templatesDict["template_groups"]:
-            self.__viewer.addGroup(templateGroup["name"],
-                                   templateGroup["language"])
+            self.__viewer.addGroup(templateGroup["name"], templateGroup["language"])
             for template in templateGroup["templates"]:
-                self.__viewer.addEntry(templateGroup["name"],
-                                       template["name"],
-                                       template["description"],
-                                       template["text"],
-                                       quiet=True)
-        
+                self.__viewer.addEntry(
+                    templateGroup["name"],
+                    template["name"],
+                    template["description"],
+                    template["text"],
+                    quiet=True,
+                )
+
         return True
--- a/src/eric7/Testing/Interfaces/PytestExecutor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/PytestExecutor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,20 +22,21 @@
     """
     Class implementing the executor for the 'pytest' framework.
     """
+
     module = "pytest"
     name = "pytest"
-    
+
     runner = os.path.join(os.path.dirname(__file__), "PytestRunner.py")
-    
+
     def __init__(self, testWidget):
         """
         Constructor
-        
+
         @param testWidget reference to the unit test widget
         @type TestingWidget
         """
         super().__init__(testWidget)
-        
+
         self.__statusDisplayMapping = {
             "failed": self.tr("Failure"),
             "skipped": self.tr("Skipped"),
@@ -43,14 +44,14 @@
             "xpassed": self.tr("Unexpected Success"),
             "passed": self.tr("Success"),
         }
-        
+
         self.__config = None
-    
+
     def getVersions(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return dictionary containing the framework name and version and the
@@ -67,14 +68,14 @@
                     if line.startswith("{") and line.endswith("}"):
                         with contextlib.suppress(json.JSONDecodeError):
                             return json.loads(line)
-        
+
         return {}
-    
+
     def hasCoverage(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return flag indicating the availability of coverage functionality
@@ -82,15 +83,14 @@
         """
         versions = self.getVersions(interpreter)
         if "plugins" in versions:
-            return any(plugin["name"] == "pytest-cov"
-                       for plugin in versions["plugins"])
-        
+            return any(plugin["name"] == "pytest-cov" for plugin in versions["plugins"])
+
         return False
-    
+
     def createArguments(self, config):
         """
         Public method to create the arguments needed to start the test process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @return list of process arguments
@@ -108,38 +108,36 @@
             str(self.reader.port()),
             "--quiet",
         ]
-        
+
         if config.failFast:
             args.append("--exitfirst")
-        
+
         if config.failedOnly:
             args.append("--last-failed")
         else:
             args.append("--cache-clear")
-        
+
         if config.collectCoverage:
-            args.extend([
-                "--cov=.",
-                "--cov-report="
-            ])
+            args.extend(["--cov=.", "--cov-report="])
             if not config.eraseCoverage:
                 args.append("--cov-append")
-        
+
         if config.testFilename:
             if config.testName:
-                args.append("{0}::{1}".format(
-                    config.testFilename,
-                    config.testName.replace(".", "::")
-                ))
+                args.append(
+                    "{0}::{1}".format(
+                        config.testFilename, config.testName.replace(".", "::")
+                    )
+                )
             else:
                 args.append(config.testFilename)
-        
+
         return args
-    
+
     def start(self, config, pythonpath):
         """
         Public method to start the testing process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @param pythonpath list of directories to be added to the Python path
@@ -147,75 +145,69 @@
         """
         self.reader = EricJsonReader(name="Unittest Reader", parent=self)
         self.reader.dataReceived.connect(self.__processData)
-        
+
         self.__config = config
-        
+
         if config.discoveryStart:
             pythonpath.insert(0, os.path.abspath(config.discoveryStart))
         elif config.testFilename:
-            pythonpath.insert(
-                0, os.path.abspath(os.path.dirname(config.testFilename)))
-        
+            pythonpath.insert(0, os.path.abspath(os.path.dirname(config.testFilename)))
+
         if config.discover:
             self.__rootdir = config.discoveryStart
         elif config.testFilename:
             self.__rootdir = os.path.dirname(config.testFilename)
         else:
             self.__rootdir = ""
-        
+
         super().start(config, pythonpath)
-    
+
     def finished(self):
         """
         Public method handling the unit test process been finished.
-        
+
         This method should read the results (if necessary) and emit the signal
         testFinished.
         """
         if self.__config.collectCoverage:
-            self.coverageDataSaved.emit(
-                os.path.join(self.__rootdir, ".coverage"))
-        
+            self.coverageDataSaved.emit(os.path.join(self.__rootdir, ".coverage"))
+
         self.__config = None
-        
+
         self.reader.close()
-        
+
         output = self.readAllOutput()
         self.testFinished.emit([], output)
-    
+
     @pyqtSlot(object)
     def __processData(self, data):
         """
         Private slot to process the received data.
-        
+
         @param data data object received
         @type dict
         """
         # test configuration
         if data["event"] == "config":
             self.__rootdir = data["root"]
-        
+
         # error collecting tests
         elif data["event"] == "collecterror":
             name = self.__normalizeModuleName(data["nodeid"])
             self.collectError.emit([(name, data["report"])])
-        
+
         # tests collected
         elif data["event"] == "collected":
-            self.collected.emit([
-                (data["nodeid"],
-                 self.__nodeid2testname(data["nodeid"]),
-                 "")
-            ])
-        
+            self.collected.emit(
+                [(data["nodeid"], self.__nodeid2testname(data["nodeid"]), "")]
+            )
+
         # test started
         elif data["event"] == "starttest":
             self.startTest.emit(
-                (data["nodeid"],
-                 self.__nodeid2testname(data["nodeid"]),
-                 "")
+                (data["nodeid"], self.__nodeid2testname(data["nodeid"]), "")
             )
-        
+
         # test result
         elif data["event"] == "result":
             if data["status"] in ("failed", "xpassed") or data["with_error"]:
@@ -224,81 +216,82 @@
                 category = TestResultCategory.OK
             else:
                 category = TestResultCategory.SKIP
-            
+
             status = (
                 self.tr("Error")
-                if data["with_error"] else
-                self.__statusDisplayMapping[data["status"]]
+                if data["with_error"]
+                else self.__statusDisplayMapping[data["status"]]
             )
-            
+
             message = data.get("message", "")
             extraText = data.get("report", "")
             reportPhase = data.get("report_phase")
             if reportPhase in ("setup", "teardown"):
-                message = (
-                    self.tr("ERROR at {0}: {1}", "phase, message")
-                    .format(reportPhase, message)
+                message = self.tr("ERROR at {0}: {1}", "phase, message").format(
+                    reportPhase, message
                 )
-                extraText = (
-                    self.tr("ERROR at {0}: {1}", "phase, extra text")
-                    .format(reportPhase, extraText)
+                extraText = self.tr("ERROR at {0}: {1}", "phase, extra text").format(
+                    reportPhase, extraText
                 )
             sections = data.get("sections", [])
             if sections:
                 extraText += "\n"
                 for heading, text in sections:
                     extraText += "----- {0} -----\n{1}".format(heading, text)
-            
+
             duration = data.get("duration_s", None)
             if duration:
                 # convert to ms
                 duration *= 1000
-            
+
             filename = data["filename"]
             if self.__rootdir:
                 filename = os.path.join(self.__rootdir, filename)
-            
-            self.testResult.emit(TestResult(
-                category=category,
-                status=status,
-                name=self.__nodeid2testname(data["nodeid"]),
-                id=data["nodeid"],
-                description="",
-                message=message,
-                extra=extraText.rstrip().splitlines(),
-                duration=duration,
-                filename=filename,
-                lineno=data.get("linenumber", 0) + 1,
-                # pytest reports 0-based line numbers
-            ))
-        
+
+            self.testResult.emit(
+                TestResult(
+                    category=category,
+                    status=status,
+                    name=self.__nodeid2testname(data["nodeid"]),
+                    id=data["nodeid"],
+                    description="",
+                    message=message,
+                    extra=extraText.rstrip().splitlines(),
+                    duration=duration,
+                    filename=filename,
+                    lineno=data.get("linenumber", 0) + 1,
+                    # pytest reports 0-based line numbers
+                )
+            )
+
         # test run finished
         elif data["event"] == "finished":
             self.testRunFinished.emit(data["tests"], data["duration_s"])
-    
+
     def __normalizeModuleName(self, name):
         r"""
         Private method to convert a module name reported by pytest to Python
         conventions.
-        
+
         This method strips the extensions '.pyw' and '.py' first and replaces
         '/' and '\' thereafter.
-        
+
         @param name module name reported by pytest
         @type str
         @return module name iaw. Python conventions
         @rtype str
         """
-        return (name
-                .replace(".pyw", "")
-                .replace(".py", "")
-                .replace("/", ".")
-                .replace("\\", "."))
-    
+        return (
+            name.replace(".pyw", "")
+            .replace(".py", "")
+            .replace("/", ".")
+            .replace("\\", ".")
+        )
+
     def __nodeid2testname(self, nodeid):
         """
         Private method to convert a nodeid to a test name.
-        
+
         @param nodeid nodeid to be converted
         @type str
         @return test name
--- a/src/eric7/Testing/Interfaces/PytestRunner.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/PytestRunner.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,71 +12,69 @@
 import sys
 import time
 
-sys.path.insert(
-    2,
-    os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
-)
+sys.path.insert(2, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
 
 
-class GetPluginVersionsPlugin():
+class GetPluginVersionsPlugin:
     """
     Class implementing a pytest plugin to extract the version info of all
     installed plugins.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.versions = []
-    
+
     def pytest_cmdline_main(self, config):
         """
         Public method called for performing the main command line action.
-        
+
         @param config pytest config object
         @type Config
         """
         pluginInfo = config.pluginmanager.list_plugin_distinfo()
         if pluginInfo:
             for _plugin, dist in pluginInfo:
-                self.versions.append({
-                    "name": dist.project_name,
-                    "version": dist.version
-                })
-    
+                self.versions.append(
+                    {"name": dist.project_name, "version": dist.version}
+                )
+
     def getVersions(self):
         """
         Public method to get the assembled list of plugin versions.
-        
+
         @return list of collected plugin versions
         @rtype list of dict
         """
         return self.versions
 
 
-class EricPlugin():
+class EricPlugin:
     """
     Class implementing a pytest plugin which reports the data in a format
     suitable for the PytestExecutor.
     """
+
     def __init__(self, writer):
         """
         Constructor
-        
+
         @param writer reference to the object to write the results to
         @type EricJsonWriter
         """
         self.__writer = writer
-        
+
         self.__testsRun = 0
-    
+
     def __initializeReportData(self):
         """
         Private method to initialize attributes for data collection.
         """
-        self.__status = '---'
+        self.__status = "---"
         self.__duration = 0
         self.__report = []
         self.__reportPhase = ""
@@ -84,52 +82,53 @@
         self.__hadError = False
         self.__wasSkipped = False
         self.__wasXfail = False
-    
+
     def pytest_report_header(self, config, startdir):
         """
         Public method called by pytest before any reporting.
-        
+
         @param config reference to the configuration object
         @type Config
         @param startdir starting directory
         @type LocalPath
         """
-        self.__writer.write({
-            "event": "config",
-            "root": str(config.rootdir)
-        })
-    
+        self.__writer.write({"event": "config", "root": str(config.rootdir)})
+
     def pytest_collectreport(self, report):
         """
         Public method called by pytest after the tests have been collected.
-        
+
         @param report reference to the report object
         @type CollectReport
         """
         if report.outcome == "failed":
-            self.__writer.write({
-                "event": "collecterror",
-                "nodeid": report.nodeid,
-                "report": str(report.longrepr),
-            })
-    
+            self.__writer.write(
+                {
+                    "event": "collecterror",
+                    "nodeid": report.nodeid,
+                    "report": str(report.longrepr),
+                }
+            )
+
     def pytest_itemcollected(self, item):
         """
         Public malled by pytest after a test item has been collected.
-        
+
         @param item reference to the collected test item
         @type Item
         """
-        self.__writer.write({
-            "event": "collected",
-            "nodeid": item.nodeid,
-            "name": item.name,
-        })
-    
+        self.__writer.write(
+            {
+                "event": "collected",
+                "nodeid": item.nodeid,
+                "name": item.name,
+            }
+        )
+
     def pytest_runtest_logstart(self, nodeid, location):
         """
         Public method called by pytest before running a test.
-        
+
         @param nodeid node id of the test item
         @type str
         @param location tuple containing the file name, the line number and
@@ -137,19 +136,21 @@
         @type tuple of (str, int, str)
         """
         self.__testsRun += 1
-        
-        self.__writer.write({
-            "event": "starttest",
-            "nodeid": nodeid,
-        })
-        
+
+        self.__writer.write(
+            {
+                "event": "starttest",
+                "nodeid": nodeid,
+            }
+        )
+
         self.__initializeReportData()
-    
+
     def pytest_runtest_logreport(self, report):
         """
         Public method called by pytest when a test phase (setup, call and
             teardown) has been completed.
-        
+
         @param report reference to the test report object
         @type TestReport
         """
@@ -161,33 +162,32 @@
                 self.__hadError = True
             elif report.outcome == "skipped":
                 self.__wasSkipped = True
-        
+
         if hasattr(report, "wasxfail"):
             self.__wasXfail = True
             self.__report.append(report.wasxfail)
             self.__reportPhase = report.when
-        
+
         self.__sections = report.sections
-        
+
         if report.longrepr:
             self.__reportPhase = report.when
             if (
-                hasattr(report.longrepr, "reprcrash") and
-                report.longrepr.reprcrash is not None
+                hasattr(report.longrepr, "reprcrash")
+                and report.longrepr.reprcrash is not None
             ):
-                self.__report.append(
-                    report.longrepr.reprcrash.message)
+                self.__report.append(report.longrepr.reprcrash.message)
             if isinstance(report.longrepr, tuple):
                 self.__report.append(report.longrepr[2])
             elif isinstance(report.longrepr, str):
                 self.__report.append(report.longrepr)
             else:
                 self.__report.append(str(report.longrepr))
-    
+
     def pytest_runtest_logfinish(self, nodeid, location):
         """
         Public method called by pytest after a test has been completed.
-        
+
         @param nodeid node id of the test item
         @type str
         @param location tuple containing the file name, the line number and
@@ -195,14 +195,10 @@
         @type tuple of (str, int, str)
         """
         if self.__wasXfail:
-            self.__status = (
-                "xpassed"
-                if self.__status == "passed" else
-                "xfailed"
-            )
+            self.__status = "xpassed" if self.__status == "passed" else "xfailed"
         elif self.__wasSkipped:
             self.__status = "skipped"
-        
+
         data = {
             "event": "result",
             "status": self.__status,
@@ -218,37 +214,39 @@
             messageLines = self.__report[0].rstrip().splitlines()
             data["message"] = messageLines[0]
         data["report"] = "\n".join(self.__report)
-        
+
         self.__writer.write(data)
-    
+
     def pytest_sessionstart(self, session):
         """
         Public method called by pytest before performing collection and
         entering the run test loop.
-        
+
         @param session reference to the session object
         @type Session
         """
         self.__totalStartTime = time.monotonic_ns()
         self.__testsRun = 0
-    
+
     def pytest_sessionfinish(self, session, exitstatus):
         """
         Public method called by pytest after the whole test run finished.
-        
+
         @param session reference to the session object
         @type Session
         @param exitstatus exit status
         @type int or ExitCode
         """
         stopTime = time.monotonic_ns()
-        duration = (stopTime - self.__totalStartTime) / 1_000_000_000   # s
-        
-        self.__writer.write({
-            "event": "finished",
-            "duration_s": duration,
-            "tests": self.__testsRun,
-        })
+        duration = (stopTime - self.__totalStartTime) / 1_000_000_000  # s
+
+        self.__writer.write(
+            {
+                "event": "finished",
+                "duration_s": duration,
+                "tests": self.__testsRun,
+            }
+        )
 
 
 def getVersions():
@@ -258,44 +256,47 @@
     """
     try:
         import pytest
+
         versions = {
             "name": "pytest",
             "version": pytest.__version__,
             "plugins": [],
         }
-        
+
         # --capture=sys needed on Windows to avoid
         # ValueError: saved filedescriptor not valid anymore
         plugin = GetPluginVersionsPlugin()
-        pytest.main(['--version', '--capture=sys'], plugins=[plugin])
+        pytest.main(["--version", "--capture=sys"], plugins=[plugin])
         versions["plugins"] = plugin.getVersions()
     except ImportError:
         versions = {}
-    
+
     print(json.dumps(versions))
     sys.exit(0)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     command = sys.argv[1]
     if command == "installed":
         try:
-            import pytest           # __IGNORE_WARNING__
+            import pytest  # __IGNORE_WARNING__
+
             sys.exit(0)
         except ImportError:
             sys.exit(1)
-    
+
     elif command == "versions":
         getVersions()
-    
+
     elif command == "runtest":
         import pytest
         from EricNetwork.EricJsonStreamWriter import EricJsonWriter
+
         writer = EricJsonWriter(sys.argv[2], int(sys.argv[3]))
         pytest.main(sys.argv[4:], plugins=[EricPlugin(writer)])
         writer.close()
         sys.exit(0)
-    
+
     sys.exit(42)
 
 #
--- a/src/eric7/Testing/Interfaces/TestExecutorBase.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/TestExecutorBase.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,6 +21,7 @@
     """
     Class defining the supported result categories.
     """
+
     RUNNING = 0
     FAIL = 1
     OK = 2
@@ -33,17 +34,18 @@
     """
     Class containing the test result data.
     """
-    category: TestResultCategory    # result category
-    status: str                     # test status
-    name: str                       # test name
-    id: str                         # test id
-    description: str = ""           # short description of test
-    message: str = ""               # short result message
-    extra: list = None              # additional information text
-    duration: float = None          # test duration
-    filename: str = None            # file name of a failed test
-    lineno: int = None              # line number of a failed test
-    subtestResult: bool = False     # flag indicating the result of a subtest
+
+    category: TestResultCategory  # result category
+    status: str  # test status
+    name: str  # test name
+    id: str  # test id
+    description: str = ""  # short description of test
+    message: str = ""  # short result message
+    extra: list = None  # additional information text
+    duration: float = None  # test duration
+    filename: str = None  # file name of a failed test
+    lineno: int = None  # line number of a failed test
+    subtestResult: bool = False  # flag indicating the result of a subtest
 
 
 @dataclass
@@ -51,22 +53,23 @@
     """
     Class containing the test run configuration.
     """
-    interpreter: str                # path of the Python interpreter
-    discover: bool                  # auto discovery flag
-    discoveryStart: str             # start directory for auto discovery
-    testFilename: str               # name of the test script
-    testName: str                   # name of the test function
-    failFast: bool                  # stop on first fail
-    failedOnly: bool                # run failed tests only
-    collectCoverage: bool           # coverage collection flag
-    eraseCoverage: bool             # erase coverage data first
-    coverageFile: str               # name of the coverage data file
+
+    interpreter: str  # path of the Python interpreter
+    discover: bool  # auto discovery flag
+    discoveryStart: str  # start directory for auto discovery
+    testFilename: str  # name of the test script
+    testName: str  # name of the test function
+    failFast: bool  # stop on first fail
+    failedOnly: bool  # run failed tests only
+    collectCoverage: bool  # coverage collection flag
+    eraseCoverage: bool  # erase coverage data first
+    coverageFile: str  # name of the coverage data file
 
 
 class TestExecutorBase(QObject):
     """
     Base class for test framework specific implementations.
-    
+
     @signal collected(list of tuple of (str, str, str)) emitted after all tests
         have been collected. Tuple elements are the test id, the test name and
         a short description of the test.
@@ -87,6 +90,7 @@
     @signal coverageDataSaved(str) emitted after the coverage data was saved.
         The element is the absolute path of the coverage data file.
     """
+
     collected = pyqtSignal(list)
     collectError = pyqtSignal(list)
     startTest = pyqtSignal(tuple)
@@ -96,29 +100,29 @@
     testRunFinished = pyqtSignal(int, float)
     stop = pyqtSignal()
     coverageDataSaved = pyqtSignal(str)
-    
+
     module = ""
     name = ""
     runner = ""
-    
+
     def __init__(self, testWidget):
         """
         Constructor
-        
+
         @param testWidget reference to the unit test widget
         @type TestingWidget
         """
         super().__init__(testWidget)
-        
+
         self.__process = None
-    
+
     @classmethod
     def isInstalled(cls, interpreter):
         """
         Class method to check whether a test framework is installed.
-        
+
         The test is performed by checking, if a module loader can found.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return flag indicating the test framework module is installed
@@ -130,14 +134,14 @@
             if proc.waitForFinished(3000):
                 exitCode = proc.exitCode()
                 return exitCode == 0
-        
+
         return False
-    
+
     def getVersions(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return dictionary containing the framework name and version and the
@@ -147,14 +151,14 @@
             derived classes
         """
         raise NotImplementedError
-        
+
         return {}
-    
+
     def hasCoverage(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return flag indicating the availability of coverage functionality
@@ -163,13 +167,13 @@
             derived classes
         """
         raise NotImplementedError
-        
+
         return False
-    
+
     def createArguments(self, config):
         """
         Public method to create the arguments needed to start the test process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @return list of process arguments
@@ -178,13 +182,13 @@
             derived classes
         """
         raise NotImplementedError
-        
+
         return []
-    
+
     def _prepareProcess(self, workDir, pythonpath):
         """
         Protected method to prepare a process object to be started.
-        
+
         @param workDir working directory
         @type str
         @param pythonpath list of directories to be added to the Python path
@@ -193,25 +197,24 @@
         @rtype QProcess
         """
         process = QProcess(self)
-        process.setProcessChannelMode(
-            QProcess.ProcessChannelMode.MergedChannels)
+        process.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
         process.setWorkingDirectory(workDir)
         process.finished.connect(self.finished)
         if pythonpath:
             env = QProcessEnvironment.systemEnvironment()
-            currentPythonPath = env.value('PYTHONPATH', None)
+            currentPythonPath = env.value("PYTHONPATH", None)
             newPythonPath = os.pathsep.join(pythonpath)
             if currentPythonPath:
                 newPythonPath += os.pathsep + currentPythonPath
-            env.insert('PYTHONPATH', newPythonPath)
+            env.insert("PYTHONPATH", newPythonPath)
             process.setProcessEnvironment(env)
-        
+
         return process
-    
+
     def start(self, config, pythonpath):
         """
         Public method to start the testing process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @param pythonpath list of directories to be added to the Python path
@@ -220,8 +223,8 @@
         """
         workDir = (
             config.discoveryStart
-            if config.discover else
-            os.path.dirname(config.testFilename)
+            if config.discover
+            else os.path.dirname(config.testFilename)
         )
         self.__process = self._prepareProcess(workDir, pythonpath)
         testArgs = self.createArguments(config)
@@ -230,23 +233,23 @@
         running = self.__process.waitForStarted()
         if not running:
             raise RuntimeError
-    
+
     def finished(self):
         """
         Public method handling the unit test process been finished.
-        
+
         This method should read the results (if necessary) and emit the signal
         testFinished.
-        
+
         @exception NotImplementedError this method needs to be implemented by
             derived classes
         """
         raise NotImplementedError
-    
+
     def readAllOutput(self, process=None):
         """
         Public method to read all output of the test process.
-        
+
         @param process reference to the process object
         @type QProcess
         @return test process output
@@ -255,25 +258,24 @@
         if process is None:
             process = self.__process
         output = (
-            str(process.readAllStandardOutput(),
+            str(
+                process.readAllStandardOutput(),
                 Preferences.getSystem("IOEncoding"),
-                'replace').strip()
-            if process else
-            ""
+                "replace",
+            ).strip()
+            if process
+            else ""
         )
         return output
-    
+
     def stopIfRunning(self):
         """
         Public method to stop the testing process, if it is running.
         """
-        if (
-            self.__process and
-            self.__process.state() == QProcess.ProcessState.Running
-        ):
+        if self.__process and self.__process.state() == QProcess.ProcessState.Running:
             self.__process.terminate()
             self.__process.waitForFinished(2000)
             self.__process.kill()
             self.__process.waitForFinished(3000)
-            
+
             self.stop.emit()
--- a/src/eric7/Testing/Interfaces/TestFrameworkRegistry.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/TestFrameworkRegistry.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,10 +11,10 @@
 import copy
 
 
-class TestFrameworkRegistry():
+class TestFrameworkRegistry:
     """
     Class implementing a simple registry of test framework interfaces.
-    
+
     The test executor for a framework is responsible for running the tests,
     receiving the results and preparing them for display. It must implement
     the interface of TestExecutorBase.
@@ -23,27 +23,28 @@
     can then create the assoicated test executor when '.createExecutor()' is
     called.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.__frameworks = {}
-    
+
     def register(self, executorClass):
         """
         Public method to register a test framework executor.
-        
+
         @param executorClass class implementing the test framework executor
         @type TestExecutorBase
         """
         self.__frameworks[executorClass.name] = executorClass
-    
+
     def createExecutor(self, framework, widget):
         """
         Public method to create a test framework executor.
-        
+
         Note: The executor classes have to be registered first.
-        
+
         @param framework name of the test framework
         @type str
         @param widget reference to the unit test widget
@@ -53,11 +54,11 @@
         """
         cls = self.__frameworks[framework]
         return cls(widget)
-    
+
     def getFrameworks(self):
         """
         Public method to get a copy of the registered frameworks.
-        
+
         @return  copy of the registered frameworks
         @rtype dict
         """
--- a/src/eric7/Testing/Interfaces/UnittestExecutor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/UnittestExecutor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,20 +23,21 @@
     """
     Class implementing the executor for the standard 'unittest' framework.
     """
+
     module = "unittest"
     name = "unittest"
-    
+
     runner = os.path.join(os.path.dirname(__file__), "UnittestRunner.py")
-    
+
     def __init__(self, testWidget):
         """
         Constructor
-        
+
         @param testWidget reference to the unit test widget
         @type TestingWidget
         """
         super().__init__(testWidget)
-        
+
         self.__statusCategoryMapping = {
             "failure": TestResultCategory.FAIL,
             "error": TestResultCategory.FAIL,
@@ -45,7 +46,7 @@
             "unexpected success": TestResultCategory.FAIL,
             "success": TestResultCategory.OK,
         }
-        
+
         self.__statusDisplayMapping = {
             "failure": self.tr("Failure"),
             "error": self.tr("Error"),
@@ -54,14 +55,14 @@
             "unexpected success": self.tr("Unexpected Success"),
             "success": self.tr("Success"),
         }
-        
+
         self.__testWidget = testWidget
-    
+
     def getVersions(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return dictionary containing the framework name and version and the
@@ -76,25 +77,25 @@
                 versionsStr = self.readAllOutput(proc)
                 with contextlib.suppress(json.JSONDecodeError):
                     return json.loads(versionsStr)
-        
+
         return {}
-    
+
     def hasCoverage(self, interpreter):
         """
         Public method to get the test framework version and version information
         of its installed plugins.
-        
+
         @param interpreter interpreter to be used for the test
         @type str
         @return flag indicating the availability of coverage functionality
         @rtype bool
         """
         return True
-    
+
     def createArguments(self, config):
         """
         Public method to create the arguments needed to start the test process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @return list of process arguments
@@ -106,17 +107,19 @@
             self.reader.address(),
             str(self.reader.port()),
         ]
-        
+
         if config.discover:
-            args.extend([
-                "discover",
-                "--start-directory",
-                config.discoveryStart,
-            ])
-        
+            args.extend(
+                [
+                    "discover",
+                    "--start-directory",
+                    config.discoveryStart,
+                ]
+            )
+
         if config.failFast:
             args.append("--failfast")
-        
+
         if config.collectCoverage:
             args.append("--cover")
             if config.eraseCoverage:
@@ -124,7 +127,7 @@
             if config.coverageFile:
                 args.append("--cover-file")
                 args.append(config.coverageFile)
-        
+
         if config.failedOnly:
             args.append("--failed-only")
             if config.testFilename:
@@ -133,13 +136,13 @@
         elif config.testFilename:
             args.append(config.testFilename)
             args.append(config.testName if config.testName else "suite")
-        
+
         return args
-    
+
     def start(self, config, pythonpath):
         """
         Public method to start the testing process.
-        
+
         @param config configuration for the test execution
         @type TestConfig
         @param pythonpath list of directories to be added to the Python path
@@ -147,45 +150,43 @@
         """
         self.reader = EricJsonReader(name="Unittest Reader", parent=self)
         self.reader.dataReceived.connect(self.__processData)
-        
+
         super().start(config, pythonpath)
-    
+
     def finished(self):
         """
         Public method handling the unit test process been finished.
-        
+
         This method should read the results (if necessary) and emit the signal
         testFinished.
         """
         self.reader.close()
-        
+
         output = self.readAllOutput()
         self.testFinished.emit([], output)
-    
+
     @pyqtSlot(object)
     def __processData(self, data):
         """
         Private slot to process the received data.
-        
+
         @param data data object received
         @type dict
         """
         # error collecting tests
         if data["event"] == "collecterror":
             self.collectError.emit([("", data["error"])])
-        
+
         # tests collected
         elif data["event"] == "collected":
-            self.collected.emit([
-                (t["id"], t["name"], t["description"]) for t in data["tests"]
-            ])
-        
+            self.collected.emit(
+                [(t["id"], t["name"], t["description"]) for t in data["tests"]]
+            )
+
         # test started
         elif data["event"] == "started":
-            self.startTest.emit(
-                (data["id"], data["name"], data["description"])
-            )
-        
+            self.startTest.emit((data["id"], data["name"], data["description"]))
+
         # test result
         elif data["event"] == "result":
             filename, lineno = None, None
@@ -193,36 +194,39 @@
             if tracebackLines:
                 # find the last entry matching the pattern
                 for index in range(len(tracebackLines) - 1, -1, -1):
-                    fmatch = re.search(r'File "(.*?)", line (\d*?),.*',
-                                       tracebackLines[index])
+                    fmatch = re.search(
+                        r'File "(.*?)", line (\d*?),.*', tracebackLines[index]
+                    )
                     if fmatch:
                         break
                 if fmatch:
                     filename = fmatch.group(1)
                     lineno = int(fmatch.group(2))
-                
+
             message = data.get("shortmsg", "")
             if not message and tracebackLines:
                 message = tracebackLines[-1].split(":", 1)[1].strip()
-            
-            self.testResult.emit(TestResult(
-                category=self.__statusCategoryMapping[data["status"]],
-                status=self.__statusDisplayMapping[data["status"]],
-                name=data["name"],
-                id=data["id"],
-                description=data["description"],
-                message=message,
-                extra=tracebackLines,
-                duration=data.get("duration_ms", None),
-                filename=filename,
-                lineno=lineno,
-                subtestResult=data.get("subtest", False)
-            ))
-        
+
+            self.testResult.emit(
+                TestResult(
+                    category=self.__statusCategoryMapping[data["status"]],
+                    status=self.__statusDisplayMapping[data["status"]],
+                    name=data["name"],
+                    id=data["id"],
+                    description=data["description"],
+                    message=message,
+                    extra=tracebackLines,
+                    duration=data.get("duration_ms", None),
+                    filename=filename,
+                    lineno=lineno,
+                    subtestResult=data.get("subtest", False),
+                )
+            )
+
         # test run finished
         elif data["event"] == "finished":
             self.testRunFinished.emit(data["tests"], data["duration_s"])
-        
+
         # coverage data
         elif data["event"] == "coverage":
             self.coverageDataSaved.emit(data["file"])
--- a/src/eric7/Testing/Interfaces/UnittestRunner.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/Interfaces/UnittestRunner.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,10 +13,7 @@
 import time
 import unittest
 
-sys.path.insert(
-    2,
-    os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
-)
+sys.path.insert(2, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
 
 
 class EricTestResult(unittest.TestResult):
@@ -24,10 +21,11 @@
     Class implementing a TestResult derivative to send the data via a network
     connection.
     """
+
     def __init__(self, writer, failfast):
         """
         Constructor
-        
+
         @param writer reference to the object to write the results to
         @type EricJsonWriter
         @param failfast flag indicating to stop at the first error
@@ -37,13 +35,13 @@
         self.__writer = writer
         self.failfast = failfast
         self.__testsRun = 0
-        
+
         self.__currentTestStatus = {}
-    
+
     def addFailure(self, test, err):
         """
         Public method called if a test failed.
-        
+
         @param test reference to the test object
         @type TestCase
         @param err tuple containing the exception data like sys.exc_info
@@ -52,16 +50,18 @@
         """
         super().addFailure(test, err)
         tracebackLines = self._exc_info_to_string(err, test)
-        
-        self.__currentTestStatus.update({
-            "status": "failure",
-            "traceback": tracebackLines,
-        })
-    
+
+        self.__currentTestStatus.update(
+            {
+                "status": "failure",
+                "traceback": tracebackLines,
+            }
+        )
+
     def addError(self, test, err):
         """
         Public method called if a test errored.
-        
+
         @param test reference to the test object
         @type TestCase
         @param err tuple containing the exception data like sys.exc_info
@@ -70,32 +70,36 @@
         """
         super().addError(test, err)
         tracebackLines = self._exc_info_to_string(err, test)
-        
-        self.__currentTestStatus.update({
-            "status": "error",
-            "traceback": tracebackLines,
-        })
-    
+
+        self.__currentTestStatus.update(
+            {
+                "status": "error",
+                "traceback": tracebackLines,
+            }
+        )
+
     def addSkip(self, test, reason):
         """
         Public method called if a test was skipped.
-        
+
         @param test reference to the test object
         @type TestCase
         @param reason reason for skipping the test
         @type str
         """
         super().addSkip(test, reason)
-        
-        self.__currentTestStatus.update({
-            "status": "skipped",
-            "shortmsg": reason,
-        })
-    
+
+        self.__currentTestStatus.update(
+            {
+                "status": "skipped",
+                "shortmsg": reason,
+            }
+        )
+
     def addExpectedFailure(self, test, err):
         """
         Public method called if a test failed expected.
-        
+
         @param test reference to the test object
         @type TestCase
         @param err tuple containing the exception data like sys.exc_info
@@ -104,27 +108,29 @@
         """
         super().addExpectedFailure(test, err)
         tracebackLines = self._exc_info_to_string(err, test)
-        
-        self.__currentTestStatus.update({
-            "status": "expected failure",
-            "traceback": tracebackLines,
-        })
-    
+
+        self.__currentTestStatus.update(
+            {
+                "status": "expected failure",
+                "traceback": tracebackLines,
+            }
+        )
+
     def addUnexpectedSuccess(self, test):
         """
         Public method called if a test succeeded expectedly.
-        
+
         @param test reference to the test object
         @type TestCase
         """
         super().addUnexpectedSuccess(test)
-        
+
         self.__currentTestStatus["status"] = "unexpected success"
-    
+
     def addSubTest(self, test, subtest, err):
         """
         Public method called for each subtest to record its result.
-        
+
         @param test reference to the test object
         @type TestCase
         @param subtest reference to the subtest object
@@ -136,46 +142,46 @@
         if err is not None:
             super().addSubTest(test, subtest, err)
             tracebackLines = self._exc_info_to_string(err, test)
-            status = (
-                "failure"
-                if issubclass(err[0], test.failureException) else
-                "error"
-            )
-            
+            status = "failure" if issubclass(err[0], test.failureException) else "error"
+
             # record the last subtest fail status as the overall status
             self.__currentTestStatus["status"] = status
-            
-            self.__writer.write({
-                "event": "result",
-                "status": status,
-                "name": str(subtest),
-                "id": subtest.id(),
-                "description": subtest.shortDescription(),
-                "traceback": tracebackLines,
-                "subtest": True,
-            })
-            
+
+            self.__writer.write(
+                {
+                    "event": "result",
+                    "status": status,
+                    "name": str(subtest),
+                    "id": subtest.id(),
+                    "description": subtest.shortDescription(),
+                    "traceback": tracebackLines,
+                    "subtest": True,
+                }
+            )
+
             if self.failfast:
                 self.stop()
         else:
-            self.__writer.write({
-                "event": "result",
-                "status": "success",
-                "name": str(subtest),
-                "id": subtest.id(),
-                "description": subtest.shortDescription(),
-                "subtest": True,
-            })
-    
+            self.__writer.write(
+                {
+                    "event": "result",
+                    "status": "success",
+                    "name": str(subtest),
+                    "id": subtest.id(),
+                    "description": subtest.shortDescription(),
+                    "subtest": True,
+                }
+            )
+
     def startTest(self, test):
         """
         Public method called at the start of a test.
-        
+
         @param test reference to the test object
         @type TestCase
         """
         super().startTest(test)
-        
+
         self.__testsRun += 1
         self.__currentTestStatus = {
             "event": "result",
@@ -185,57 +191,61 @@
             "description": test.shortDescription(),
             "subtest": False,
         }
-        
-        self.__writer.write({
-            "event": "started",
-            "name": str(test),
-            "id": test.id(),
-            "description": test.shortDescription(),
-        })
-        
+
+        self.__writer.write(
+            {
+                "event": "started",
+                "name": str(test),
+                "id": test.id(),
+                "description": test.shortDescription(),
+            }
+        )
+
         self.__startTime = time.monotonic_ns()
-    
+
     def stopTest(self, test):
         """
         Public method called at the end of a test.
-        
+
         @param test reference to the test object
         @type TestCase
         """
         stopTime = time.monotonic_ns()
-        duration = (stopTime - self.__startTime) / 1_000_000     # ms
-        
+        duration = (stopTime - self.__startTime) / 1_000_000  # ms
+
         super().stopTest(test)
-        
+
         self.__currentTestStatus["duration_ms"] = duration
         self.__writer.write(self.__currentTestStatus)
-    
+
     def startTestRun(self):
         """
         Public method called once before any tests are executed.
         """
         self.__totalStartTime = time.monotonic_ns()
         self.__testsRun = 0
-    
+
     def stopTestRun(self):
         """
         Public method called once after all tests are executed.
         """
         stopTime = time.monotonic_ns()
-        duration = (stopTime - self.__totalStartTime) / 1_000_000_000   # s
-        
-        self.__writer.write({
-            "event": "finished",
-            "duration_s": duration,
-            "tests": self.__testsRun,
-        })
+        duration = (stopTime - self.__totalStartTime) / 1_000_000_000  # s
+
+        self.__writer.write(
+            {
+                "event": "finished",
+                "duration_s": duration,
+                "tests": self.__testsRun,
+            }
+        )
 
 
 def _assembleTestCasesList(suite):
     """
     Protected function to assemble a list of test cases included in a test
     suite.
-    
+
     @param suite test suite to be inspected
     @type unittest.TestSuite
     @return list of tuples containing the test case ID, the string
@@ -249,27 +259,26 @@
         else:
             testId = test.id()
             if (
-                "ModuleImportFailure" not in testId and
-                "LoadTestsFailure" not in testId and
-                "_FailedTest" not in testId
+                "ModuleImportFailure" not in testId
+                and "LoadTestsFailure" not in testId
+                and "_FailedTest" not in testId
             ):
-                testCases.append(
-                    (testId, str(test), test.shortDescription())
-                )
+                testCases.append((testId, str(test), test.shortDescription()))
     return testCases
 
 
 def runtest(argv):
     """
     Function to run the tests.
-    
+
     @param argv list of command line parameters.
     @type list of str
     """
     from EricNetwork.EricJsonStreamWriter import EricJsonWriter
+
     writer = EricJsonWriter(argv[0], int(argv[1]))
     del argv[:2]
-    
+
     # process arguments
     if argv[0] == "discover":
         discover = True
@@ -280,11 +289,11 @@
     else:
         discover = False
         discoveryStart = ""
-    
+
     failfast = "--failfast" in argv
     if failfast:
         argv.remove("--failfast")
-    
+
     collectCoverage = "--cover" in argv
     if collectCoverage:
         argv.remove("--cover")
@@ -294,10 +303,10 @@
     if "--cover-file" in argv:
         index = argv.index("--cover-file")
         covDataFile = argv[index + 1]
-        del argv[index:index + 2]
+        del argv[index : index + 2]
     else:
         covDataFile = ""
-    
+
     if argv and argv[0] == "--failed-only":
         if discover:
             testFileName = ""
@@ -312,42 +321,44 @@
         else:
             testFileName, testName = argv[:2]
             del argv[:2]
-        
+
         testCases = argv[:]
-    
+
     if testFileName:
         sys.path.insert(1, os.path.dirname(os.path.abspath(testFileName)))
     elif discoveryStart:
         sys.path.insert(1, os.path.abspath(discoveryStart))
-    
+
     # setup test coverage
     if collectCoverage:
         if not covDataFile:
             if discover:
                 covname = os.path.join(discoveryStart, "test")
             elif testFileName:
-                covname = os.path.splitext(
-                    os.path.abspath(testFileName))[0]
+                covname = os.path.splitext(os.path.abspath(testFileName))[0]
             else:
                 covname = "test"
             covDataFile = "{0}.coverage".format(covname)
         if not os.path.isabs(covDataFile):
             covDataFile = os.path.abspath(covDataFile)
-        
+
         sys.path.insert(
             2,
-            os.path.abspath(os.path.join(
-                os.path.dirname(__file__), "..", "..", "DebugClients", "Python"
-            ))
+            os.path.abspath(
+                os.path.join(
+                    os.path.dirname(__file__), "..", "..", "DebugClients", "Python"
+                )
+            ),
         )
         from DebugClients.Python.coverage import Coverage
+
         cover = Coverage(data_file=covDataFile)
         if coverageErase:
             cover.erase()
         cover.start()
     else:
         cover = None
-    
+
     try:
         testLoader = unittest.TestLoader()
         if discover and not failed:
@@ -357,38 +368,36 @@
                 test = testLoader.discover(discoveryStart)
         else:
             if testFileName:
-                module = __import__(os.path.splitext(
-                    os.path.basename(testFileName))[0])
+                module = __import__(os.path.splitext(os.path.basename(testFileName))[0])
             else:
                 module = None
             if failed:
                 if module:
-                    failed = [t.split(".", 1)[1]
-                              for t in failed]
-                test = testLoader.loadTestsFromNames(
-                    failed, module)
+                    failed = [t.split(".", 1)[1] for t in failed]
+                test = testLoader.loadTestsFromNames(failed, module)
             else:
-                test = testLoader.loadTestsFromName(
-                    testName, module)
+                test = testLoader.loadTestsFromName(testName, module)
     except Exception as err:
         print("Exception:", str(err))
-        writer.write({
-            "event": "collecterror",
-            "error": str(err),
-        })
+        writer.write(
+            {
+                "event": "collecterror",
+                "error": str(err),
+            }
+        )
         sys.exit(1)
-    
+
     collectedTests = {
         "event": "collected",
         "tests": [
             {"id": id, "name": name, "description": desc}
             for id, name, desc in _assembleTestCasesList(test)
-        ]
+        ],
     }
     writer.write(collectedTests)
-    
+
     testResult = EricTestResult(writer, failfast)
-    startTestRun = getattr(testResult, 'startTestRun', None)
+    startTestRun = getattr(testResult, "startTestRun", None)
     if startTestRun is not None:
         startTestRun()
     try:
@@ -397,25 +406,29 @@
         if cover:
             cover.stop()
             cover.save()
-            writer.write({
-                "event": "coverage",
-                "file": covDataFile,
-            })
-        stopTestRun = getattr(testResult, 'stopTestRun', None)
+            writer.write(
+                {
+                    "event": "coverage",
+                    "file": covDataFile,
+                }
+            )
+        stopTestRun = getattr(testResult, "stopTestRun", None)
         if stopTestRun is not None:
             stopTestRun()
-    
+
     writer.close()
     sys.exit(0)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     if len(sys.argv) > 1:
         command = sys.argv[1]
         if command == "installed":
             sys.exit(0)
-        
+
         elif command == "versions":
             import platform
+
             versions = {
                 "name": "unittest",
                 "version": platform.python_version(),
@@ -423,11 +436,11 @@
             }
             print(json.dumps(versions))
             sys.exit(0)
-        
+
         elif command == "runtest":
             runtest(sys.argv[2:])
             sys.exit(0)
-    
+
     sys.exit(42)
 
 #
--- a/src/eric7/Testing/TestResultsTree.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/TestResultsTree.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,8 +16,13 @@
 from operator import attrgetter
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QAbstractItemModel, QCoreApplication,
-    QModelIndex, QPoint
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QAbstractItemModel,
+    QCoreApplication,
+    QModelIndex,
+    QPoint,
 )
 from PyQt6.QtGui import QBrush, QColor
 from PyQt6.QtWidgets import QMenu, QTreeView
@@ -28,39 +33,40 @@
 
 from .Interfaces.TestExecutorBase import TestResultCategory
 
-TopLevelId = 2 ** 32 - 1
+TopLevelId = 2**32 - 1
 
 
 class TestResultsModel(QAbstractItemModel):
     """
     Class implementing the item model containing the test data.
-    
+
     @signal summary(str) emitted whenever the model data changes. The element
         is a summary of the test results of the model.
     """
+
     summary = pyqtSignal(str)
-    
+
     Headers = [
         QCoreApplication.translate("TestResultsModel", "Status"),
         QCoreApplication.translate("TestResultsModel", "Name"),
         QCoreApplication.translate("TestResultsModel", "Message"),
         QCoreApplication.translate("TestResultsModel", "Duration [ms]"),
     ]
-    
+
     StatusColumn = 0
     NameColumn = 1
     MessageColumn = 2
     DurationColumn = 3
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (defaults to None)
         @type QObject (optional)
         """
         super().__init__(parent)
-        
+
         if ericApp().usesDarkPalette():
             self.__backgroundColors = {
                 TestResultCategory.RUNNING: None,
@@ -77,14 +83,14 @@
                 TestResultCategory.SKIP: QBrush(QColor("#c5c5c5")),
                 TestResultCategory.PENDING: QBrush(QColor("#6fbaff")),
             }
-        
+
         self.__testResults = []
-    
+
     def index(self, row, column, parent=QModelIndex()):
         """
         Public method to generate an index for the given row and column to
         identify the item.
-        
+
         @param row row for the index
         @type int
         @param column column for the index
@@ -96,18 +102,18 @@
         """
         if not self.hasIndex(row, column, parent):  # check bounds etc.
             return QModelIndex()
-        
+
         if not parent.isValid():
             # top level item
             return self.createIndex(row, column, TopLevelId)
         else:
             testResultIndex = parent.row()
             return self.createIndex(row, column, testResultIndex)
-    
+
     def data(self, index, role):
         """
         Public method to get the data for the various columns and roles.
-        
+
         @param index index of the data to be returned
         @type QModelIndex
         @param role role designating the data to return
@@ -117,11 +123,11 @@
         """
         if not index.isValid():
             return None
-        
+
         row = index.row()
         column = index.column()
         idx = index.internalId()
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if idx != TopLevelId:
                 if bool(self.__testResults[idx].extra):
@@ -138,8 +144,8 @@
                 duration = self.__testResults[row].duration
                 return (
                     ""
-                    if duration is None else
-                    locale.format_string("%.2f", duration, grouping=True)
+                    if duration is None
+                    else locale.format_string("%.2f", duration, grouping=True)
                 )
         elif role == Qt.ItemDataRole.ToolTipRole:
             if idx == TopLevelId and column == TestResultsModel.NameColumn:
@@ -155,18 +161,17 @@
         elif role == Qt.ItemDataRole.TextAlignmentRole:
             if idx == TopLevelId and column == TestResultsModel.DurationColumn:
                 return Qt.AlignmentFlag.AlignRight.value
-        elif role == Qt.ItemDataRole.UserRole:      # __IGNORE_WARNING_Y102__
+        elif role == Qt.ItemDataRole.UserRole:  # __IGNORE_WARNING_Y102__
             if idx == TopLevelId:
                 testresult = self.__testResults[row]
                 return (testresult.filename, testresult.lineno)
-        
+
         return None
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header string for the various sections.
-        
+
         @param section section number
         @type int
         @param orientation orientation of the header
@@ -177,17 +182,17 @@
         @rtype str
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             return TestResultsModel.Headers[section]
         else:
             return None
-    
+
     def parent(self, index):
         """
         Public method to get the parent of the item pointed to by index.
-        
+
         @param index index of the item
         @type QModelIndex
         @return index of the parent item
@@ -195,17 +200,17 @@
         """
         if not index.isValid():
             return QModelIndex()
-        
+
         idx = index.internalId()
         if idx == TopLevelId:
             return QModelIndex()
         else:
             return self.index(idx, 0)
-    
+
     def rowCount(self, parent=QModelIndex()):
         """
         Public method to get the number of row for a given parent index.
-        
+
         @param parent index of the parent item (defaults to QModelIndex())
         @type QModelIndex (optional)
         @return number of rows
@@ -213,20 +218,20 @@
         """
         if not parent.isValid():
             return len(self.__testResults)
-        
+
         if (
-            parent.internalId() == TopLevelId and
-            parent.column() == 0 and
-            self.__testResults[parent.row()].extra is not None
+            parent.internalId() == TopLevelId
+            and parent.column() == 0
+            and self.__testResults[parent.row()].extra is not None
         ):
             return len(self.__testResults[parent.row()].extra)
-        
+
         return 0
 
     def columnCount(self, parent=QModelIndex()):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of the parent item (defaults to QModelIndex())
         @type QModelIndex (optional)
         @return number of columns
@@ -236,7 +241,7 @@
             return len(TestResultsModel.Headers)
         else:
             return 1
-    
+
     def clear(self):
         """
         Public method to clear the model data.
@@ -244,22 +249,23 @@
         self.beginResetModel()
         self.__testResults.clear()
         self.endResetModel()
-        
+
         self.summary.emit("")
-    
+
     def sort(self, column, order):
         """
         Public method to sort the model data by column in order.
-        
+
         @param column sort column number
         @type int
         @param order sort order
         @type Qt.SortOrder
-        """             # __IGNORE_WARNING_D234r__
+        """  # __IGNORE_WARNING_D234r__
+
         def durationKey(result):
             """
             Function to generate a key for duration sorting
-            
+
             @param result result object
             @type TestResult
             @return sort key
@@ -270,43 +276,44 @@
         self.beginResetModel()
         reverse = order == Qt.SortOrder.DescendingOrder
         if column == TestResultsModel.StatusColumn:
-            self.__testResults.sort(key=attrgetter('category', 'status'),
-                                    reverse=reverse)
+            self.__testResults.sort(
+                key=attrgetter("category", "status"), reverse=reverse
+            )
         elif column == TestResultsModel.NameColumn:
-            self.__testResults.sort(key=attrgetter('name'), reverse=reverse)
+            self.__testResults.sort(key=attrgetter("name"), reverse=reverse)
         elif column == TestResultsModel.MessageColumn:
-            self.__testResults.sort(key=attrgetter('message'), reverse=reverse)
+            self.__testResults.sort(key=attrgetter("message"), reverse=reverse)
         elif column == TestResultsModel.DurationColumn:
             self.__testResults.sort(key=durationKey, reverse=reverse)
         self.endResetModel()
-    
+
     def getTestResults(self):
         """
         Public method to get the list of test results managed by the model.
-        
+
         @return list of test results managed by the model
         @rtype list of TestResult
         """
         return copy.deepcopy(self.__testResults)
-    
+
     def setTestResults(self, testResults):
         """
         Public method to set the list of test results of the model.
-        
+
         @param testResults test results to be managed by the model
         @type list of TestResult
         """
         self.beginResetModel()
         self.__testResults = copy.deepcopy(testResults)
         self.endResetModel()
-        
+
         self.summary.emit(self.__summary())
-    
+
     def addTestResults(self, testResults):
         """
         Public method to add test results to the ones already managed by the
         model.
-        
+
         @param testResults test results to be added to the model
         @type list of TestResult
         """
@@ -315,21 +322,21 @@
         self.beginInsertRows(QModelIndex(), firstRow, lastRow)
         self.__testResults.extend(testResults)
         self.endInsertRows()
-        
+
         self.summary.emit(self.__summary())
-    
+
     def updateTestResults(self, testResults):
         """
         Public method to update the data of managed test result items.
-        
+
         @param testResults test results to be updated
         @type list of TestResult
         """
         minIndex = None
         maxIndex = None
-        
+
         testResultsToBeAdded = []
-        
+
         for testResult in testResults:
             for (index, currentResult) in enumerate(self.__testResults):
                 if currentResult.id == testResult.id:
@@ -340,117 +347,122 @@
                     else:
                         minIndex = min(minIndex, index)
                         maxIndex = max(maxIndex, index)
-                    
+
                     break
             else:
                 # Test result with given id was not found.
                 # Just add it to the list (could be a sub test)
                 testResultsToBeAdded.append(testResult)
-        
+
         if minIndex is not None:
             self.dataChanged.emit(
                 self.index(minIndex, 0),
-                self.index(maxIndex, len(TestResultsModel.Headers) - 1)
+                self.index(maxIndex, len(TestResultsModel.Headers) - 1),
             )
-            
+
             self.summary.emit(self.__summary())
-        
+
         if testResultsToBeAdded:
             self.addTestResults(testResultsToBeAdded)
-    
+
     def getFailedTests(self):
         """
         Public method to extract the test ids of all failed tests.
-        
+
         @return test ids of all failed tests
         @rtype list of str
         """
         failedIds = [
-            res.id for res in self.__testResults if (
-                res.category == TestResultCategory.FAIL and
-                not res.subtestResult
-            )
+            res.id
+            for res in self.__testResults
+            if (res.category == TestResultCategory.FAIL and not res.subtestResult)
         ]
         return failedIds
-    
+
     def __summary(self):
         """
         Private method to generate a test results summary text.
-        
+
         @return test results summary text
         @rtype str
         """
         if len(self.__testResults) == 0:
             return self.tr("No results to show")
-        
+
         counts = Counter(res.category for res in self.__testResults)
         if all(
             counts[category] == 0
-            for category in (TestResultCategory.FAIL, TestResultCategory.OK,
-                             TestResultCategory.SKIP)
+            for category in (
+                TestResultCategory.FAIL,
+                TestResultCategory.OK,
+                TestResultCategory.SKIP,
+            )
         ):
             return self.tr("Collected %n test(s)", "", len(self.__testResults))
-        
+
         return self.tr(
             "%n test(s)/subtest(s) total, {0} failed, {1} passed,"
             " {2} skipped, {3} pending",
-            "", len(self.__testResults)
+            "",
+            len(self.__testResults),
         ).format(
             counts[TestResultCategory.FAIL],
             counts[TestResultCategory.OK],
             counts[TestResultCategory.SKIP],
-            counts[TestResultCategory.PENDING]
+            counts[TestResultCategory.PENDING],
         )
 
 
 class TestResultsTreeView(QTreeView):
     """
     Class implementing a tree view to show the test result data.
-    
+
     @signal goto(str, int) emitted to go to the position given by file name
         and line number
     """
+
     goto = pyqtSignal(str, int)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
-        
+
         self.setItemsExpandable(True)
         self.setExpandsOnDoubleClick(False)
         self.setSortingEnabled(True)
-        
+
         self.header().setDefaultAlignment(Qt.AlignmentFlag.AlignCenter)
         self.header().setSortIndicatorShown(False)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
-        
+
         # connect signals and slots
         self.doubleClicked.connect(self.__gotoTestDefinition)
         self.customContextMenuRequested.connect(self.__showContextMenu)
-        
+
         self.header().sortIndicatorChanged.connect(self.sortByColumn)
         self.header().sortIndicatorChanged.connect(
-            lambda column, order: self.header().setSortIndicatorShown(True))
-    
+            lambda column, order: self.header().setSortIndicatorShown(True)
+        )
+
     def reset(self):
         """
         Public method to reset the internal state of the view.
         """
         super().reset()
-        
+
         self.resizeColumns()
         self.spanFirstColumn(0, self.model().rowCount() - 1)
-    
+
     def rowsInserted(self, parent, startRow, endRow):
         """
         Public method called when rows are inserted.
-        
+
         @param parent model index of the parent item
         @type QModelIndex
         @param startRow first row been inserted
@@ -459,14 +471,14 @@
         @type int
         """
         super().rowsInserted(parent, startRow, endRow)
-        
+
         self.resizeColumns()
         self.spanFirstColumn(startRow, endRow)
-    
+
     def dataChanged(self, topLeft, bottomRight, roles=[]):
         """
         Public method called when the model data has changed.
-        
+
         @param topLeft index of the top left element
         @type QModelIndex
         @param bottomRight index of the bottom right element
@@ -475,28 +487,28 @@
         @type list of Qt.ItemDataRole (optional)
         """
         super().dataChanged(topLeft, bottomRight, roles)
-        
+
         self.resizeColumns()
         while topLeft.parent().isValid():
             topLeft = topLeft.parent()
         while bottomRight.parent().isValid():
             bottomRight = bottomRight.parent()
         self.spanFirstColumn(topLeft.row(), bottomRight.row())
-    
+
     def resizeColumns(self):
         """
         Public method to resize the columns to their contents.
         """
         for column in range(self.model().columnCount()):
             self.resizeColumnToContents(column)
-    
+
     def spanFirstColumn(self, startRow, endRow):
         """
         Public method to make the first column span the row for second level
         items.
-        
+
         These items contain the test results.
-        
+
         @param startRow index of the first row to span
         @type QModelIndex
         @param endRow index of the last row (including) to span
@@ -507,15 +519,15 @@
             index = model.index(row, 0)
             for i in range(model.rowCount(index)):
                 self.setFirstColumnSpanned(i, index, True)
-    
+
     def __canonicalIndex(self, index):
         """
         Private method to create the canonical index for a given index.
-        
+
         The canonical index is the index of the first column of the test
         result entry (i.e. the top-level item). If the index is invalid,
         None is returned.
-        
+
         @param index index to determine the canonical index for
         @type QModelIndex
         @return index of the firt column of the associated top-level item index
@@ -523,17 +535,17 @@
         """
         if not index.isValid():
             return None
-        
+
         while index.parent().isValid():  # find the top-level node
             index = index.parent()
         index = index.sibling(index.row(), 0)  # go to first column
         return index
-    
+
     @pyqtSlot(QModelIndex)
     def __gotoTestDefinition(self, index):
         """
         Private slot to show the test definition.
-        
+
         @param index index for the double-clicked item
         @type QModelIndex
         """
@@ -543,30 +555,30 @@
             if lineno is None:
                 lineno = 1
             self.goto.emit(filename, lineno)
-    
+
     @pyqtSlot(QPoint)
     def __showContextMenu(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos relative position for the context menu
         @type QPoint
         """
         index = self.indexAt(pos)
         cindex = self.__canonicalIndex(index)
-        
+
         contextMenu = (
             self.__createContextMenu(cindex)
-            if cindex else
-            self.__createBackgroundContextMenu()
+            if cindex
+            else self.__createBackgroundContextMenu()
         )
         contextMenu.exec(self.mapToGlobal(pos))
-    
+
     def __createContextMenu(self, index):
         """
         Private method to create a context menu for the item pointed to by the
         given index.
-        
+
         @param index index of the item
         @type QModelIndex
         @return created context menu
@@ -574,38 +586,36 @@
         """
         menu = QMenu(self)
         if self.isExpanded(index):
-            menu.addAction(self.tr("Collapse"),
-                           lambda: self.collapse(index))
+            menu.addAction(self.tr("Collapse"), lambda: self.collapse(index))
         else:
-            act = menu.addAction(self.tr("Expand"),
-                                 lambda: self.expand(index))
+            act = menu.addAction(self.tr("Expand"), lambda: self.expand(index))
             act.setEnabled(self.model().hasChildren(index))
         menu.addSeparator()
-        
-        act = menu.addAction(self.tr("Show Source"),
-                             lambda: self.__gotoTestDefinition(index))
-        act.setEnabled(
-            self.model().data(index, Qt.ItemDataRole.UserRole) is not None
+
+        act = menu.addAction(
+            self.tr("Show Source"), lambda: self.__gotoTestDefinition(index)
         )
+        act.setEnabled(self.model().data(index, Qt.ItemDataRole.UserRole) is not None)
         menu.addSeparator()
-        
+
         menu.addAction(self.tr("Collapse All"), self.collapseAll)
         menu.addAction(self.tr("Expand All"), self.expandAll)
-        
+
         return menu
-    
+
     def __createBackgroundContextMenu(self):
         """
         Private method to create a context menu for the background.
-        
+
         @return created context menu
         @rtype QMenu
         """
         menu = QMenu(self)
         menu.addAction(self.tr("Collapse All"), self.collapseAll)
         menu.addAction(self.tr("Expand All"), self.expandAll)
-        
+
         return menu
 
+
 #
 # eflag: noqa = M821, M822
--- a/src/eric7/Testing/TestingWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/TestingWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,9 +13,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QEvent, QCoreApplication
-from PyQt6.QtWidgets import (
-    QAbstractButton, QComboBox, QDialogButtonBox, QWidget
-)
+from PyQt6.QtWidgets import QAbstractButton, QComboBox, QDialogButtonBox, QWidget
 
 from EricWidgets import EricMessageBox
 from EricWidgets.EricApplication import ericApp
@@ -26,18 +24,18 @@
 
 from .TestResultsTree import TestResultsModel, TestResultsTreeView
 from .Interfaces import Frameworks
-from .Interfaces.TestExecutorBase import (
-    TestConfig, TestResult, TestResultCategory
-)
+from .Interfaces.TestExecutorBase import TestConfig, TestResult, TestResultCategory
 from .Interfaces.TestFrameworkRegistry import TestFrameworkRegistry
 
 import Preferences
 import UI.PixmapCache
 
 from Globals import (
-    recentNameTestDiscoverHistory, recentNameTestFileHistory,
-    recentNameTestNameHistory, recentNameTestFramework,
-    recentNameTestEnvironment
+    recentNameTestDiscoverHistory,
+    recentNameTestFileHistory,
+    recentNameTestNameHistory,
+    recentNameTestFramework,
+    recentNameTestEnvironment,
 )
 
 
@@ -45,26 +43,28 @@
     """
     Class defining the various modes of the testing widget.
     """
-    IDLE = 0            # idle, no test were run yet
-    RUNNING = 1         # test run being performed
-    STOPPED = 2         # test run finished
+
+    IDLE = 0  # idle, no test were run yet
+    RUNNING = 1  # test run being performed
+    STOPPED = 2  # test run finished
 
 
 class TestingWidget(QWidget, Ui_TestingWidget):
     """
     Class implementing a widget to orchestrate unit test execution.
-    
+
     @signal testFile(str, int, bool) emitted to show the source of a
        test file
     @signal testRunStopped() emitted after a test run has finished
     """
+
     testFile = pyqtSignal(str, int, bool)
     testRunStopped = pyqtSignal()
-    
+
     def __init__(self, testfile=None, parent=None):
         """
         Constructor
-        
+
         @param testfile file name of the test to load
         @type str
         @param parent reference to the parent widget (defaults to None)
@@ -72,86 +72,101 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__resultsModel = TestResultsModel(self)
         self.__resultsModel.summary.connect(self.__setStatusLabel)
         self.__resultsTree = TestResultsTreeView(self)
         self.__resultsTree.setModel(self.__resultsModel)
         self.__resultsTree.goto.connect(self.__showSource)
         self.resultsGroupBox.layout().addWidget(self.__resultsTree)
-        
-        self.versionsButton.setIcon(
-            UI.PixmapCache.getIcon("info"))
-        self.clearHistoriesButton.setIcon(
-            UI.PixmapCache.getIcon("clearPrivateData"))
-        
+
+        self.versionsButton.setIcon(UI.PixmapCache.getIcon("info"))
+        self.clearHistoriesButton.setIcon(UI.PixmapCache.getIcon("clearPrivateData"))
+
         self.testsuitePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.testsuitePicker.setInsertPolicy(
-            QComboBox.InsertPolicy.InsertAtTop)
+        self.testsuitePicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.testsuitePicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+
         self.discoveryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        self.discoveryPicker.setInsertPolicy(
-            QComboBox.InsertPolicy.InsertAtTop)
+        self.discoveryPicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.discoveryPicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+
         self.testComboBox.lineEdit().setClearButtonEnabled(True)
-        
+
         # create some more dialog buttons for orchestration
         self.__showLogButton = self.buttonBox.addButton(
-            self.tr("Show Output..."),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Show Output..."), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__showLogButton.setToolTip(
-            self.tr("Show the output of the test runner process"))
-        self.__showLogButton.setWhatsThis(self.tr(
-            """<b>Show Output...</b"""
-            """<p>This button opens a dialog containing the output of the"""
-            """ test runner process of the most recent run.</p>"""))
-        
+            self.tr("Show the output of the test runner process")
+        )
+        self.__showLogButton.setWhatsThis(
+            self.tr(
+                """<b>Show Output...</b"""
+                """<p>This button opens a dialog containing the output of the"""
+                """ test runner process of the most recent run.</p>"""
+            )
+        )
+
         self.__showCoverageButton = self.buttonBox.addButton(
-            self.tr("Show Coverage..."),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Show Coverage..."), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__showCoverageButton.setToolTip(
-            self.tr("Show code coverage in a new dialog"))
-        self.__showCoverageButton.setWhatsThis(self.tr(
-            """<b>Show Coverage...</b>"""
-            """<p>This button opens a dialog containing the collected code"""
-            """ coverage data.</p>"""))
-        
+            self.tr("Show code coverage in a new dialog")
+        )
+        self.__showCoverageButton.setWhatsThis(
+            self.tr(
+                """<b>Show Coverage...</b>"""
+                """<p>This button opens a dialog containing the collected code"""
+                """ coverage data.</p>"""
+            )
+        )
+
         self.__startButton = self.buttonBox.addButton(
-            self.tr("Start"), QDialogButtonBox.ButtonRole.ActionRole)
-        
-        self.__startButton.setToolTip(self.tr(
-            "Start the selected testsuite"))
-        self.__startButton.setWhatsThis(self.tr(
-            """<b>Start Test</b>"""
-            """<p>This button starts the test run.</p>"""))
-        
+            self.tr("Start"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+
+        self.__startButton.setToolTip(self.tr("Start the selected testsuite"))
+        self.__startButton.setWhatsThis(
+            self.tr(
+                """<b>Start Test</b>""" """<p>This button starts the test run.</p>"""
+            )
+        )
+
         self.__startFailedButton = self.buttonBox.addButton(
-            self.tr("Rerun Failed"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Rerun Failed"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__startFailedButton.setToolTip(
-            self.tr("Reruns failed tests of the selected testsuite"))
-        self.__startFailedButton.setWhatsThis(self.tr(
-            """<b>Rerun Failed</b>"""
-            """<p>This button reruns all failed tests of the most recent"""
-            """ test run.</p>"""))
-        
+            self.tr("Reruns failed tests of the selected testsuite")
+        )
+        self.__startFailedButton.setWhatsThis(
+            self.tr(
+                """<b>Rerun Failed</b>"""
+                """<p>This button reruns all failed tests of the most recent"""
+                """ test run.</p>"""
+            )
+        )
+
         self.__stopButton = self.buttonBox.addButton(
-            self.tr("Stop"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Stop"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__stopButton.setToolTip(self.tr("Stop the running test"))
-        self.__stopButton.setWhatsThis(self.tr(
-            """<b>Stop Test</b>"""
-            """<p>This button stops a running test.</p>"""))
-        
+        self.__stopButton.setWhatsThis(
+            self.tr(
+                """<b>Stop Test</b>""" """<p>This button stops a running test.</p>"""
+            )
+        )
+
         self.setWindowFlags(
-            self.windowFlags() |
-            Qt.WindowType.WindowContextHelpButtonHint
+            self.windowFlags() | Qt.WindowType.WindowContextHelpButtonHint
         )
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.setWindowTitle(self.tr("Testing"))
-        
+
         try:
             # we are called from within the eric IDE
             self.__venvManager = ericApp().getObject("VirtualEnvManager")
@@ -161,63 +176,65 @@
         except KeyError:
             # we were called as a standalone application
             from VirtualEnv.VirtualenvManager import VirtualenvManager
+
             self.__venvManager = VirtualenvManager(self)
             self.__venvManager.virtualEnvironmentAdded.connect(
-                self.__populateVenvComboBox)
+                self.__populateVenvComboBox
+            )
             self.__venvManager.virtualEnvironmentRemoved.connect(
-                self.__populateVenvComboBox)
+                self.__populateVenvComboBox
+            )
             self.__venvManager.virtualEnvironmentChanged.connect(
-                self.__populateVenvComboBox)
+                self.__populateVenvComboBox
+            )
             ericApp().registerObject("VirtualEnvManager", self.__venvManager)
-            
+
             self.__project = None
-        
+
         self.__discoverHistory = []
         self.__fileHistory = []
         self.__testNameHistory = []
         self.__recentFramework = ""
         self.__recentEnvironment = ""
         self.__failedTests = []
-        
+
         self.__coverageFile = ""
         self.__coverageDialog = None
-        
+
         self.__editors = []
         self.__testExecutor = None
         self.__recentLog = ""
-        
+
         # connect some signals
-        self.discoveryPicker.editTextChanged.connect(
-            self.__resetResults)
-        self.testsuitePicker.editTextChanged.connect(
-            self.__resetResults)
-        self.testComboBox.editTextChanged.connect(
-            self.__resetResults)
-        
+        self.discoveryPicker.editTextChanged.connect(self.__resetResults)
+        self.testsuitePicker.editTextChanged.connect(self.__resetResults)
+        self.testComboBox.editTextChanged.connect(self.__resetResults)
+
         self.__frameworkRegistry = TestFrameworkRegistry()
         for framework in Frameworks:
             self.__frameworkRegistry.register(framework)
-        
+
         self.__setIdleMode()
-        
+
         self.__loadRecent()
         self.__populateVenvComboBox()
-        
+
         if self.__project and self.__project.isOpen():
             self.venvComboBox.setCurrentText(self.__project.getProjectVenv())
             self.frameworkComboBox.setCurrentText(
-                self.__project.getProjectTestingFramework())
+                self.__project.getProjectTestingFramework()
+            )
             self.__insertDiscovery(self.__project.getProjectPath())
         else:
             self.__insertDiscovery("")
-        
+
         self.__insertTestFile(testfile)
         self.__insertTestName("")
-        
+
         self.clearHistoriesButton.clicked.connect(self.clearRecent)
-        
+
         self.tabWidget.setCurrentIndex(0)
-    
+
     def __populateVenvComboBox(self):
         """
         Private method to (re-)populate the virtual environments selector.
@@ -225,13 +242,12 @@
         currentText = self.venvComboBox.currentText()
         if not currentText:
             currentText = self.__recentEnvironment
-        
+
         self.venvComboBox.clear()
         self.venvComboBox.addItem("")
-        self.venvComboBox.addItems(
-            sorted(self.__venvManager.getVirtualenvNames()))
+        self.venvComboBox.addItems(sorted(self.__venvManager.getVirtualenvNames()))
         self.venvComboBox.setCurrentText(currentText)
-    
+
     def __populateTestFrameworkComboBox(self):
         """
         Private method to (re-)populate the test framework selector.
@@ -239,62 +255,59 @@
         currentText = self.frameworkComboBox.currentText()
         if not currentText:
             currentText = self.__recentFramework
-        
+
         self.frameworkComboBox.clear()
-        
+
         if bool(self.venvComboBox.currentText()):
             interpreter = self.__venvManager.getVirtualenvInterpreter(
-                self.venvComboBox.currentText())
+                self.venvComboBox.currentText()
+            )
             self.frameworkComboBox.addItem("")
             for index, (name, executor) in enumerate(
-                sorted(self.__frameworkRegistry.getFrameworks().items()),
-                start=1
+                sorted(self.__frameworkRegistry.getFrameworks().items()), start=1
             ):
                 isInstalled = executor.isInstalled(interpreter)
                 entry = (
-                    name
-                    if isInstalled else
-                    self.tr("{0} (not available)").format(name)
+                    name if isInstalled else self.tr("{0} (not available)").format(name)
                 )
                 self.frameworkComboBox.addItem(entry)
-                self.frameworkComboBox.model().item(index).setEnabled(
-                    isInstalled)
-            
+                self.frameworkComboBox.model().item(index).setEnabled(isInstalled)
+
             self.frameworkComboBox.setCurrentText(self.__recentFramework)
-    
+
     def getResultsModel(self):
         """
         Public method to get a reference to the model containing the test
         result data.
-        
+
         @return reference to the test results model
         @rtype TestResultsModel
         """
         return self.__resultsModel
-    
+
     def hasFailedTests(self):
         """
         Public method to check for failed tests.
-        
+
         @return flag indicating the existence of failed tests
         @rtype bool
         """
         return bool(self.__resultsModel.getFailedTests())
-        
+
     def getFailedTests(self):
         """
         Public method to get the list of failed tests (if any).
-        
+
         @return list of IDs of failed tests
         @rtype list of str
         """
         return self.__failedTests[:]
-    
+
     @pyqtSlot(str)
     def __insertHistory(self, widget, history, item):
         """
         Private slot to insert an item into a history object.
-        
+
         @param widget reference to the widget
         @type QComboBox or EricComboPathPicker
         @param history array containing the history
@@ -311,24 +324,23 @@
         widget.clear()
         widget.addItems(history)
         widget.setEditText(item)
-    
+
     @pyqtSlot(str)
     def __insertDiscovery(self, start):
         """
         Private slot to insert the discovery start directory into the
         discoveryPicker object.
-        
+
         @param start start directory name to be inserted
         @type str
         """
-        self.__insertHistory(self.discoveryPicker, self.__discoverHistory,
-                             start)
-    
+        self.__insertHistory(self.discoveryPicker, self.__discoverHistory, start)
+
     @pyqtSlot(str)
     def setTestFile(self, testFile, forProject=False):
         """
         Public slot to set the given test file as the current one.
-        
+
         @param testFile path of the test file
         @type str
         @param forProject flag indicating that this call is for a project
@@ -337,93 +349,92 @@
         """
         if testFile:
             self.__insertTestFile(testFile)
-        
+
         self.discoverCheckBox.setChecked(forProject or not bool(testFile))
-        
+
         if forProject:
             self.__projectOpened()
-        
+
         self.tabWidget.setCurrentIndex(0)
-    
+
     @pyqtSlot(str)
     def __insertTestFile(self, prog):
         """
         Private slot to insert a test file name into the testsuitePicker
         object.
-        
+
         @param prog test file name to be inserted
         @type str
         """
-        self.__insertHistory(self.testsuitePicker, self.__fileHistory,
-                             prog)
-    
+        self.__insertHistory(self.testsuitePicker, self.__fileHistory, prog)
+
     @pyqtSlot(str)
     def __insertTestName(self, testName):
         """
         Private slot to insert a test name into the testComboBox object.
-        
+
         @param testName name of the test to be inserted
         @type str
         """
-        self.__insertHistory(self.testComboBox, self.__testNameHistory,
-                             testName)
-    
+        self.__insertHistory(self.testComboBox, self.__testNameHistory, testName)
+
     def __loadRecent(self):
         """
         Private method to load the most recently used lists.
         """
         Preferences.Prefs.rsettings.sync()
-        
+
         # 1. recently selected test framework and virtual environment
         self.__recentEnvironment = Preferences.Prefs.rsettings.value(
-            recentNameTestEnvironment, "")
+            recentNameTestEnvironment, ""
+        )
         self.__recentFramework = Preferences.Prefs.rsettings.value(
-            recentNameTestFramework, "")
-        
+            recentNameTestFramework, ""
+        )
+
         # 2. discovery history
         self.__discoverHistory = []
-        rs = Preferences.Prefs.rsettings.value(
-            recentNameTestDiscoverHistory)
+        rs = Preferences.Prefs.rsettings.value(recentNameTestDiscoverHistory)
         if rs is not None:
             recent = [f for f in Preferences.toList(rs) if os.path.exists(f)]
-            self.__discoverHistory = recent[
-                :Preferences.getDebugger("RecentNumber")]
-        
+            self.__discoverHistory = recent[: Preferences.getDebugger("RecentNumber")]
+
         # 3. test file history
         self.__fileHistory = []
-        rs = Preferences.Prefs.rsettings.value(
-            recentNameTestFileHistory)
+        rs = Preferences.Prefs.rsettings.value(recentNameTestFileHistory)
         if rs is not None:
             recent = [f for f in Preferences.toList(rs) if os.path.exists(f)]
-            self.__fileHistory = recent[
-                :Preferences.getDebugger("RecentNumber")]
-        
+            self.__fileHistory = recent[: Preferences.getDebugger("RecentNumber")]
+
         # 4. test name history
         self.__testNameHistory = []
-        rs = Preferences.Prefs.rsettings.value(
-            recentNameTestNameHistory)
+        rs = Preferences.Prefs.rsettings.value(recentNameTestNameHistory)
         if rs is not None:
             recent = [n for n in Preferences.toList(rs) if n]
-            self.__testNameHistory = recent[
-                :Preferences.getDebugger("RecentNumber")]
-    
+            self.__testNameHistory = recent[: Preferences.getDebugger("RecentNumber")]
+
     def __saveRecent(self):
         """
         Private method to save the most recently used lists.
         """
         Preferences.Prefs.rsettings.setValue(
-            recentNameTestEnvironment, self.__recentEnvironment)
+            recentNameTestEnvironment, self.__recentEnvironment
+        )
         Preferences.Prefs.rsettings.setValue(
-            recentNameTestFramework, self.__recentFramework)
+            recentNameTestFramework, self.__recentFramework
+        )
         Preferences.Prefs.rsettings.setValue(
-            recentNameTestDiscoverHistory, self.__discoverHistory)
+            recentNameTestDiscoverHistory, self.__discoverHistory
+        )
         Preferences.Prefs.rsettings.setValue(
-            recentNameTestFileHistory, self.__fileHistory)
+            recentNameTestFileHistory, self.__fileHistory
+        )
         Preferences.Prefs.rsettings.setValue(
-            recentNameTestNameHistory, self.__testNameHistory)
-        
+            recentNameTestNameHistory, self.__testNameHistory
+        )
+
         Preferences.Prefs.rsettings.sync()
-    
+
     @pyqtSlot()
     def clearRecent(self):
         """
@@ -433,15 +444,15 @@
         self.__discoverHistory = []
         self.__fileHistory = []
         self.__testNameHistory = []
-        
+
         # clear widgets with histories
         self.discoveryPicker.clear()
         self.testsuitePicker.clear()
         self.testComboBox.clear()
-        
+
         # sync histories
         self.__saveRecent()
-    
+
     @pyqtSlot()
     def __resetResults(self):
         """
@@ -449,94 +460,87 @@
         """
         self.__totalCount = 0
         self.__runCount = 0
-        
+
         self.progressCounterRunCount.setText("0")
         self.progressCounterRemCount.setText("0")
         self.progressProgressBar.setMaximum(100)
         self.progressProgressBar.setValue(0)
-        
+
         self.statusLabel.clear()
-        
+
         self.__resultsModel.clear()
         self.__updateButtonBoxButtons()
-    
+
     @pyqtSlot()
     def __updateButtonBoxButtons(self):
         """
         Private slot to update the state of the buttons of the button box.
         """
         failedAvailable = bool(self.__resultsModel.getFailedTests())
-        
+
         # Start button
-        if self.__mode in (
-            TestingWidgetModes.IDLE, TestingWidgetModes.STOPPED
-        ):
+        if self.__mode in (TestingWidgetModes.IDLE, TestingWidgetModes.STOPPED):
             self.__startButton.setEnabled(
-                bool(self.venvComboBox.currentText()) and
-                bool(self.frameworkComboBox.currentText()) and
-                (
-                    (self.discoverCheckBox.isChecked() and
-                     bool(self.discoveryPicker.currentText())) or
-                    bool(self.testsuitePicker.currentText())
+                bool(self.venvComboBox.currentText())
+                and bool(self.frameworkComboBox.currentText())
+                and (
+                    (
+                        self.discoverCheckBox.isChecked()
+                        and bool(self.discoveryPicker.currentText())
+                    )
+                    or bool(self.testsuitePicker.currentText())
                 )
             )
             self.__startButton.setDefault(
-                self.__mode == TestingWidgetModes.IDLE or
-                not failedAvailable
+                self.__mode == TestingWidgetModes.IDLE or not failedAvailable
             )
         else:
             self.__startButton.setEnabled(False)
             self.__startButton.setDefault(False)
-        
+
         # Start Failed button
         self.__startFailedButton.setEnabled(
-            self.__mode == TestingWidgetModes.STOPPED and
-            failedAvailable
+            self.__mode == TestingWidgetModes.STOPPED and failedAvailable
         )
         self.__startFailedButton.setDefault(
-            self.__mode == TestingWidgetModes.STOPPED and
-            failedAvailable
+            self.__mode == TestingWidgetModes.STOPPED and failedAvailable
         )
-        
+
         # Stop button
-        self.__stopButton.setEnabled(
-            self.__mode == TestingWidgetModes.RUNNING)
-        self.__stopButton.setDefault(
-            self.__mode == TestingWidgetModes.RUNNING)
-        
+        self.__stopButton.setEnabled(self.__mode == TestingWidgetModes.RUNNING)
+        self.__stopButton.setDefault(self.__mode == TestingWidgetModes.RUNNING)
+
         # Code coverage button
         self.__showCoverageButton.setEnabled(
-            self.__mode == TestingWidgetModes.STOPPED and
-            bool(self.__coverageFile) and
-            (
-                (self.discoverCheckBox.isChecked() and
-                 bool(self.discoveryPicker.currentText())) or
-                bool(self.testsuitePicker.currentText())
+            self.__mode == TestingWidgetModes.STOPPED
+            and bool(self.__coverageFile)
+            and (
+                (
+                    self.discoverCheckBox.isChecked()
+                    and bool(self.discoveryPicker.currentText())
+                )
+                or bool(self.testsuitePicker.currentText())
             )
         )
-        
+
         # Log output button
         self.__showLogButton.setEnabled(bool(self.__recentLog))
-        
+
         # Close button
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ).setEnabled(self.__mode in (
-            TestingWidgetModes.IDLE, TestingWidgetModes.STOPPED
-        ))
-    
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(
+            self.__mode in (TestingWidgetModes.IDLE, TestingWidgetModes.STOPPED)
+        )
+
     @pyqtSlot()
     def __updateProgress(self):
         """
         Private slot update the progress indicators.
         """
-        self.progressCounterRunCount.setText(
-            str(self.__runCount))
-        self.progressCounterRemCount.setText(
-            str(self.__totalCount - self.__runCount))
+        self.progressCounterRunCount.setText(str(self.__runCount))
+        self.progressCounterRemCount.setText(str(self.__totalCount - self.__runCount))
         self.progressProgressBar.setMaximum(self.__totalCount)
         self.progressProgressBar.setValue(self.__runCount)
-    
+
     @pyqtSlot()
     def __setIdleMode(self):
         """
@@ -546,26 +550,26 @@
         self.__updateButtonBoxButtons()
         self.progressGroupBox.hide()
         self.tabWidget.setCurrentIndex(0)
-    
+
     @pyqtSlot()
     def __setRunningMode(self):
         """
         Private slot to switch the widget to running mode.
         """
         self.__mode = TestingWidgetModes.RUNNING
-        
+
         self.__totalCount = 0
         self.__runCount = 0
-        
+
         self.__coverageFile = ""
-        
+
         self.sbLabel.setText(self.tr("Running"))
         self.tabWidget.setCurrentIndex(1)
         self.__updateButtonBoxButtons()
         self.__updateProgress()
-        
+
         self.progressGroupBox.show()
-    
+
     @pyqtSlot()
     def __setStoppedMode(self):
         """
@@ -574,21 +578,21 @@
         self.__mode = TestingWidgetModes.STOPPED
         if self.__totalCount == 0:
             self.progressProgressBar.setMaximum(100)
-        
+
         self.progressGroupBox.hide()
-        
+
         self.__updateButtonBoxButtons()
-        
+
         self.testRunStopped.emit()
-        
+
         self.raise_()
         self.activateWindow()
-    
+
     @pyqtSlot(bool)
     def on_discoverCheckBox_toggled(self, checked):
         """
         Private slot handling state changes of the 'discover' checkbox.
-        
+
         @param checked state of the checkbox
         @type bool
         """
@@ -596,11 +600,10 @@
             if self.__project and self.__project.isOpen():
                 self.__insertDiscovery(self.__project.getProjectPath())
             else:
-                self.__insertDiscovery(
-                    Preferences.getMultiProject("Workspace"))
-        
+                self.__insertDiscovery(Preferences.getMultiProject("Workspace"))
+
         self.__resetResults()
-    
+
     @pyqtSlot()
     def on_testsuitePicker_aboutToShowPathPickerDialog(self):
         """
@@ -608,33 +611,36 @@
         """
         if self.__project:
             # we were called from within eric
-            py3Extensions = ' '.join([
-                "*{0}".format(ext)
-                for ext in
-                ericApp().getObject("DebugServer").getExtensions('Python3')
-            ])
-            fileFilter = self.tr(
-                "Python3 Files ({0});;All Files (*)"
-            ).format(py3Extensions)
+            py3Extensions = " ".join(
+                [
+                    "*{0}".format(ext)
+                    for ext in ericApp()
+                    .getObject("DebugServer")
+                    .getExtensions("Python3")
+                ]
+            )
+            fileFilter = self.tr("Python3 Files ({0});;All Files (*)").format(
+                py3Extensions
+            )
         else:
             # standalone application
             fileFilter = self.tr("Python Files (*.py);;All Files (*)")
         self.testsuitePicker.setFilters(fileFilter)
-        
+
         defaultDirectory = (
             self.__project.getProjectPath()
-            if self.__project and self.__project.isOpen() else
-            Preferences.getMultiProject("Workspace")
+            if self.__project and self.__project.isOpen()
+            else Preferences.getMultiProject("Workspace")
         )
         if not defaultDirectory:
             defaultDirectory = os.path.expanduser("~")
         self.testsuitePicker.setDefaultDirectory(defaultDirectory)
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
@@ -649,33 +655,33 @@
             self.__showCoverageDialog()
         elif button == self.__showLogButton:
             self.__showLogOutput()
-    
+
     @pyqtSlot(int)
     def on_venvComboBox_currentIndexChanged(self, index):
         """
         Private slot handling the selection of a virtual environment.
-        
+
         @param index index of the selected environment
         @type int
         """
         self.__populateTestFrameworkComboBox()
         self.__updateButtonBoxButtons()
-        
+
         self.versionsButton.setEnabled(bool(self.venvComboBox.currentText()))
-        
+
         self.__updateCoverage()
-    
+
     @pyqtSlot(int)
     def on_frameworkComboBox_currentIndexChanged(self, index):
         """
         Private slot handling the selection of a test framework.
-        
+
         @param index index of the selected framework
         @type int
         """
         self.__resetResults()
         self.__updateCoverage()
-    
+
     @pyqtSlot()
     def __updateCoverage(self):
         """
@@ -683,21 +689,19 @@
         the selected framework's capabilities.
         """
         hasCoverage = False
-        
+
         venvName = self.venvComboBox.currentText()
         if venvName:
             framework = self.frameworkComboBox.currentText()
             if framework:
-                interpreter = self.__venvManager.getVirtualenvInterpreter(
-                    venvName)
-                executor = self.__frameworkRegistry.createExecutor(
-                    framework, self)
+                interpreter = self.__venvManager.getVirtualenvInterpreter(venvName)
+                executor = self.__frameworkRegistry.createExecutor(framework, self)
                 hasCoverage = executor.hasCoverage(interpreter)
-        
+
         self.coverageCheckBox.setEnabled(hasCoverage)
         if not hasCoverage:
             self.coverageCheckBox.setChecked(False)
-    
+
     @pyqtSlot()
     def on_versionsButton_clicked(self):
         """
@@ -705,69 +709,58 @@
         """
         venvName = self.venvComboBox.currentText()
         if venvName:
-            headerText = self.tr("<h3>Versions of Frameworks and their"
-                                 " Plugins</h3>")
+            headerText = self.tr("<h3>Versions of Frameworks and their" " Plugins</h3>")
             versionsText = ""
             interpreter = self.__venvManager.getVirtualenvInterpreter(venvName)
-            for framework in sorted(
-                self.__frameworkRegistry.getFrameworks().keys()
-            ):
-                executor = self.__frameworkRegistry.createExecutor(
-                    framework, self)
+            for framework in sorted(self.__frameworkRegistry.getFrameworks().keys()):
+                executor = self.__frameworkRegistry.createExecutor(framework, self)
                 versions = executor.getVersions(interpreter)
                 if versions:
                     txt = "<p><strong>{0} {1}</strong>".format(
-                        versions["name"], versions["version"])
-                    
+                        versions["name"], versions["version"]
+                    )
+
                     if versions["plugins"]:
                         txt += "<table>"
                         for pluginVersion in versions["plugins"]:
-                            txt += self.tr(
-                                "<tr><td>{0}</td><td>{1}</td></tr>"
-                            ).format(
+                            txt += self.tr("<tr><td>{0}</td><td>{1}</td></tr>").format(
                                 pluginVersion["name"], pluginVersion["version"]
                             )
                         txt += "</table>"
                     txt += "</p>"
-                    
+
                     versionsText += txt
-            
+
             if not versionsText:
                 versionsText = self.tr("No version information available.")
-            
+
             EricMessageBox.information(
-                self,
-                self.tr("Versions"),
-                headerText + versionsText
+                self, self.tr("Versions"), headerText + versionsText
             )
-    
+
     @pyqtSlot()
     def startTests(self, failedOnly=False):
         """
         Public slot to start the test run.
-        
+
         @param failedOnly flag indicating to run only failed tests
         @type bool
         """
         if self.__mode == TestingWidgetModes.RUNNING:
             return
-        
+
         self.__recentLog = ""
-        
+
         self.__recentEnvironment = self.venvComboBox.currentText()
         self.__recentFramework = self.frameworkComboBox.currentText()
-        
-        self.__failedTests = (
-            self.__resultsModel.getFailedTests()
-            if failedOnly else
-            []
-        )
+
+        self.__failedTests = self.__resultsModel.getFailedTests() if failedOnly else []
         discover = self.discoverCheckBox.isChecked()
         if discover:
             discoveryStart = self.discoveryPicker.currentText()
             testFileName = ""
             testName = ""
-            
+
             if discoveryStart:
                 self.__insertDiscovery(discoveryStart)
         else:
@@ -778,21 +771,20 @@
             testName = self.testComboBox.currentText()
             if testName:
                 self.__insertTestName(testName)
-        
+
         self.sbLabel.setText(self.tr("Preparing Testsuite"))
         QCoreApplication.processEvents()
-        
+
         if self.__project:
             mainScript = self.__project.getMainScript(True)
             coverageFile = (
-                os.path.splitext(mainScript)[0] + ".coverage"
-                if mainScript else
-                ""
+                os.path.splitext(mainScript)[0] + ".coverage" if mainScript else ""
             )
         else:
             coverageFile = ""
         interpreter = self.__venvManager.getVirtualenvInterpreter(
-            self.__recentEnvironment)
+            self.__recentEnvironment
+        )
         config = TestConfig(
             interpreter=interpreter,
             discover=discover,
@@ -805,9 +797,10 @@
             eraseCoverage=self.coverageEraseCheckBox.isChecked(),
             coverageFile=coverageFile,
         )
-        
+
         self.__testExecutor = self.__frameworkRegistry.createExecutor(
-            self.__recentFramework, self)
+            self.__recentFramework, self
+        )
         self.__testExecutor.collected.connect(self.__testsCollected)
         self.__testExecutor.collectError.connect(self.__testsCollectError)
         self.__testExecutor.startTest.connect(self.__testStarted)
@@ -817,23 +810,24 @@
         self.__testExecutor.stop.connect(self.__testsStopped)
         self.__testExecutor.coverageDataSaved.connect(self.__coverageData)
         self.__testExecutor.testRunAboutToBeStarted.connect(
-            self.__testRunAboutToBeStarted)
-        
+            self.__testRunAboutToBeStarted
+        )
+
         self.__setRunningMode()
         self.__testExecutor.start(config, [])
-    
+
     @pyqtSlot()
     def __stopTests(self):
         """
         Private slot to stop the current test run.
         """
         self.__testExecutor.stopIfRunning()
-    
+
     @pyqtSlot(list)
     def __testsCollected(self, testNames):
         """
         Private slot handling the 'collected' signal of the executor.
-        
+
         @param testNames list of tuples containing the test id, the test name
             and a description of collected tests
         @type list of tuple of (str, str, str)
@@ -845,85 +839,89 @@
                 name=name,
                 id=id,
                 message=desc,
-            ) for id, name, desc in testNames
+            )
+            for id, name, desc in testNames
         ]
         self.__resultsModel.addTestResults(testResults)
-        
+
         self.__totalCount += len(testResults)
         self.__updateProgress()
-    
+
     @pyqtSlot(list)
     def __testsCollectError(self, errors):
         """
         Private slot handling the 'collectError' signal of the executor.
-        
+
         @param errors list of tuples containing the test name and a description
             of the error
         @type list of tuple of (str, str)
         """
         testResults = []
-        
+
         for testFile, error in errors:
             if testFile:
-                testResults.append(TestResult(
-                    category=TestResultCategory.FAIL,
-                    status=self.tr("Failure"),
-                    name=testFile,
-                    id=testFile,
-                    message=self.tr("Collection Error"),
-                    extra=error.splitlines()
-                ))
+                testResults.append(
+                    TestResult(
+                        category=TestResultCategory.FAIL,
+                        status=self.tr("Failure"),
+                        name=testFile,
+                        id=testFile,
+                        message=self.tr("Collection Error"),
+                        extra=error.splitlines(),
+                    )
+                )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Collection Error"),
                     self.tr(
-                        "<p>There was an error while collecting tests."
-                        "</p><p>{0}</p>"
-                    ).format("<br/>".join(error.splitlines()))
+                        "<p>There was an error while collecting tests." "</p><p>{0}</p>"
+                    ).format("<br/>".join(error.splitlines())),
                 )
-        
+
         if testResults:
             self.__resultsModel.addTestResults(testResults)
-    
+
     @pyqtSlot(tuple)
     def __testStarted(self, test):
         """
         Private slot handling the 'startTest' signal of the executor.
-        
+
         @param test tuple containing the id, name and short description of the
             tests about to be run
         @type tuple of (str, str, str)
         """
-        self.__resultsModel.updateTestResults([
-            TestResult(
-                category=TestResultCategory.RUNNING,
-                status=self.tr("running"),
-                id=test[0],
-                name=test[1],
-                message="" if test[2] is None else test[2],
-            )
-        ])
-    
+        self.__resultsModel.updateTestResults(
+            [
+                TestResult(
+                    category=TestResultCategory.RUNNING,
+                    status=self.tr("running"),
+                    id=test[0],
+                    name=test[1],
+                    message="" if test[2] is None else test[2],
+                )
+            ]
+        )
+
     @pyqtSlot(TestResult)
     def __processTestResult(self, result):
         """
         Private slot to handle the receipt of a test result object.
-        
+
         @param result test result object
         @type TestResult
         """
         if not result.subtestResult:
             self.__runCount += 1
         self.__updateProgress()
-        
+
         self.__resultsModel.updateTestResults([result])
-    
+
     @pyqtSlot(list, str)
     def __testProcessFinished(self, results, output):
         """
         Private slot to handle the 'testFinished' signal of the executor.
-        
+
         @param results list of test result objects (if not sent via the
             'testResult' signal
         @type list of TestResult
@@ -931,17 +929,17 @@
         @type str
         """
         self.__recentLog = output
-        
+
         self.__setStoppedMode()
         self.__testExecutor = None
-        
+
         self.__adjustPendingState()
-    
+
     @pyqtSlot(int, float)
     def __testRunFinished(self, noTests, duration):
         """
         Private slot to handle the 'testRunFinished' signal of the executor.
-        
+
         @param noTests number of tests run by the executor
         @type int
         @param duration time needed in seconds to run the tests
@@ -952,18 +950,18 @@
                 locale.format_string("%.3f", duration, grouping=True)
             )
         )
-        
+
         self.__setStoppedMode()
-    
+
     @pyqtSlot()
     def __testsStopped(self):
         """
         Private slot to handle the 'stop' signal of the executor.
         """
         self.sbLabel.setText(self.tr("Ran %n test(s)", "", self.__runCount))
-        
+
         self.__setStoppedMode()
-    
+
     @pyqtSlot()
     def __testRunAboutToBeStarted(self):
         """
@@ -971,7 +969,7 @@
         executor.
         """
         self.__resultsModel.clear()
-    
+
     def __adjustPendingState(self):
         """
         Private method to change the status indicator of all still pending
@@ -983,20 +981,20 @@
                 result.category = TestResultCategory.SKIP
                 result.status = self.tr("not run")
                 newResults.append(result)
-        
+
         if newResults:
             self.__resultsModel.updateTestResults(newResults)
-    
+
     @pyqtSlot(str)
     def __coverageData(self, coverageFile):
         """
         Private slot to handle the 'coverageData' signal of the executor.
-        
+
         @param coverageFile file containing the coverage data
         @type str
         """
         self.__coverageFile = coverageFile
-    
+
     @pyqtSlot()
     def __showCoverageDialog(self):
         """
@@ -1005,40 +1003,41 @@
         """
         if self.__coverageDialog is None:
             from DataViews.PyCoverageDialog import PyCoverageDialog
+
             self.__coverageDialog = PyCoverageDialog(self)
             self.__coverageDialog.openFile.connect(self.__openEditor)
-        
+
         testDir = (
             self.discoveryPicker.currentText()
-            if self.discoverCheckBox.isChecked() else
-            os.path.dirname(self.testsuitePicker.currentText())
+            if self.discoverCheckBox.isChecked()
+            else os.path.dirname(self.testsuitePicker.currentText())
         )
         if testDir:
             self.__coverageDialog.show()
             self.__coverageDialog.start(self.__coverageFile, testDir)
-    
+
     @pyqtSlot()
     def __showLogOutput(self):
         """
         Private slot to show the output of the most recent test run.
         """
         from EricWidgets.EricPlainTextDialog import EricPlainTextDialog
+
         dlg = EricPlainTextDialog(
-            title=self.tr("Test Run Output"),
-            text=self.__recentLog
+            title=self.tr("Test Run Output"), text=self.__recentLog
         )
         dlg.exec()
-    
+
     @pyqtSlot(str)
     def __setStatusLabel(self, statusText):
         """
         Private slot to set the status label to the text sent by the model.
-        
+
         @param statusText text to be shown
         @type str
         """
         self.statusLabel.setText(f"<b>{statusText}</b>")
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
@@ -1046,9 +1045,10 @@
         """
         self.venvComboBox.setCurrentText(self.__project.getProjectVenv())
         self.frameworkComboBox.setCurrentText(
-            self.__project.getProjectTestingFramework())
+            self.__project.getProjectTestingFramework()
+        )
         self.__insertDiscovery(self.__project.getProjectPath())
-    
+
     @pyqtSlot()
     def __projectClosed(self):
         """
@@ -1057,12 +1057,12 @@
         self.venvComboBox.setCurrentText("")
         self.frameworkComboBox.setCurrentText("")
         self.__insertDiscovery("")
-    
+
     @pyqtSlot(str, int)
     def __showSource(self, filename, lineno):
         """
         Private slot to show the source of a traceback in an editor.
-        
+
         @param filename file name of the file to be shown
         @type str
         @param lineno line number to go to in the file
@@ -1073,35 +1073,36 @@
             self.testFile.emit(filename, lineno, True)
         else:
             self.__openEditor(filename, lineno)
-    
+
     def __openEditor(self, filename, linenumber=1):
         """
         Private method to open an editor window for the given file.
-        
+
         Note: This method opens an editor window when the testing dialog
         is called as a standalone application.
-        
+
         @param filename path of the file to be opened
         @type str
         @param linenumber line number to place the cursor at (defaults to 1)
         @type int (optional)
         """
         from QScintilla.MiniEditor import MiniEditor
+
         editor = MiniEditor(filename, "Python3", self)
         editor.gotoLine(linenumber)
         editor.show()
-        
+
         self.__editors.append(editor)
-    
+
     def closeEvent(self, event):
         """
         Protected method to handle the close event.
-        
+
         @param event close event
         @type QCloseEvent
         """
         event.accept()
-        
+
         for editor in self.__editors:
             with contextlib.suppress(Exception):
                 editor.close()
@@ -1111,10 +1112,11 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, testfile=None, parent=None):
         """
         Constructor
-        
+
         @param testfile file name of the test script to open
         @type str
         @param parent reference to the parent widget
@@ -1126,17 +1128,16 @@
         size = self.__cw.size()
         self.setCentralWidget(self.__cw)
         self.resize(size)
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.__cw.buttonBox.accepted.connect(self.close)
         self.__cw.buttonBox.rejected.connect(self.close)
-    
+
     def eventFilter(self, obj, event):
         """
         Public method to filter events.
-        
+
         @param obj reference to the object the event is meant for (QObject)
         @param event reference to the event object (QEvent)
         @return flag indicating, whether the event was handled (boolean)
@@ -1144,7 +1145,7 @@
         if event.type() == QEvent.Type.Close:
             QCoreApplication.exit(0)
             return True
-        
+
         return False
 
 
@@ -1152,11 +1153,8 @@
     """
     Function to clear the saved history lists.
     """
-    Preferences.Prefs.rsettings.setValue(
-        recentNameTestDiscoverHistory, [])
-    Preferences.Prefs.rsettings.setValue(
-        recentNameTestFileHistory, [])
-    Preferences.Prefs.rsettings.setValue(
-        recentNameTestNameHistory, [])
-    
+    Preferences.Prefs.rsettings.setValue(recentNameTestDiscoverHistory, [])
+    Preferences.Prefs.rsettings.setValue(recentNameTestFileHistory, [])
+    Preferences.Prefs.rsettings.setValue(recentNameTestNameHistory, [])
+
     Preferences.Prefs.rsettings.sync()
--- a/src/eric7/Testing/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Testing/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def supportedLanguages():
     """
     Function to get a list of supported programming languages.
-    
+
     @return list of supported programming languages
     @rtype list of str
     """
@@ -25,7 +25,7 @@
     """
     Function to check, if the given programming language is supported by any
     testing framework.
-    
+
     @param language programming language
     @type str
     @return flag indicating support
--- a/src/eric7/Toolbox/SingleApplication.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Toolbox/SingleApplication.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,20 +21,21 @@
     """
     Class implementing the single application server base class.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name this server is listening to (string)
         """
         super().__init__()
-        
+
         res = self.listen(name)
         if not res:
             # maybe it crashed last time
             self.removeServer(name)
             self.listen(name)
-        
+
         self.newConnection.connect(self.__newConnection)
 
         self.qsock = None
@@ -61,36 +62,38 @@
         """
         while self.qsock and self.qsock.canReadLine():
             line = bytes(self.qsock.readLine()).decode()
-            
-##            print(line)          ## debug         # __IGNORE_WARNING_M891__
-            
+
+            ##print(line)          ## debug         # __IGNORE_WARNING_M891__
+
             try:
                 commandDict = json.loads(line.strip())
             except (TypeError, ValueError) as err:
                 EricMessageBox.critical(
                     None,
                     self.tr("Single Application Protocol Error"),
-                    self.tr("""<p>The response received from the single"""
-                            """ application client could not be decoded."""
-                            """ Please report this issue with the received"""
-                            """ data to the eric bugs email address.</p>"""
-                            """<p>Error: {0}</p>"""
-                            """<p>Data:<br/>{1}</p>""").format(
-                        str(err), Utilities.html_encode(line.strip())),
-                    EricMessageBox.Ok)
+                    self.tr(
+                        """<p>The response received from the single"""
+                        """ application client could not be decoded."""
+                        """ Please report this issue with the received"""
+                        """ data to the eric bugs email address.</p>"""
+                        """<p>Error: {0}</p>"""
+                        """<p>Data:<br/>{1}</p>"""
+                    ).format(str(err), Utilities.html_encode(line.strip())),
+                    EricMessageBox.Ok,
+                )
                 return
-            
+
             command = commandDict["command"]
             arguments = commandDict["arguments"]
-            
+
             self.handleCommand(command, arguments)
-    
+
     def __disconnected(self):
         """
         Private method to handle the closure of the socket.
         """
         self.qsock = None
-    
+
     def shutdown(self):
         """
         Public method used to shut down the server.
@@ -98,17 +101,17 @@
         if self.qsock is not None:
             self.qsock.readyRead.disconnect(self.__parseLine)
             self.qsock.disconnected.disconnect(self.__disconnected)
-        
+
         self.qsock = None
-        
+
         self.close()
 
     def handleCommand(self, command, arguments):
         """
         Public slot to handle the command sent by the client.
-        
+
         <b>Note</b>: This method must be overridden by subclasses.
-        
+
         @param command command sent by the client
         @type str
         @param arguments list of command arguments
@@ -123,19 +126,20 @@
     """
     Class implementing the single application client base class.
     """
+
     def __init__(self, name):
         """
         Constructor
-        
+
         @param name name of the local server to connect to (string)
         """
         self.name = name
         self.connected = False
-        
+
     def connect(self, timeout=10000):
         """
         Public method to connect the single application client to its server.
-        
+
         @param timeout connection timeout value in milliseconds
         @type int
         @return value indicating success or an error number. Value is one of:
@@ -155,30 +159,30 @@
                 return 0
             else:
                 return -err.value
-        
+
     def disconnect(self):
         """
         Public method to disconnect from the Single Appliocation server.
         """
         self.sock.disconnectFromServer()
         self.connected = False
-    
+
     def processArgs(self, args):
         """
         Public method to process the command line args passed to the UI.
-        
+
         <b>Note</b>: This method must be overridden by subclasses.
-        
+
         @param args command line args (list of strings)
         @exception RuntimeError raised to indicate that this method must be
             implemented by a subclass
         """
         raise RuntimeError("'processArgs' must be overridden")
-    
+
     def sendCommand(self, command, arguments):
         """
         Public method to send the command to the application server.
-        
+
         @param command command to be sent to the server
         @type str
         @param arguments list of command arguments
@@ -189,15 +193,15 @@
                 "command": command,
                 "arguments": arguments,
             }
-            self.sock.write(QByteArray(
-                "{0}\n".format(json.dumps(commandDict)).encode()
-            ))
+            self.sock.write(
+                QByteArray("{0}\n".format(json.dumps(commandDict)).encode())
+            )
             self.sock.flush()
-        
+
     def errstr(self):
         """
         Public method to return a meaningful error string for the last error.
-        
+
         @return error string for the last error (string)
         """
         return self.sock.errorString()
--- a/src/eric7/Toolbox/Startup.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Toolbox/Startup.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,22 +27,24 @@
 def usage(appinfo, optlen=12):
     """
     Module function to show the usage information.
-    
+
     @param appinfo dictionary describing the application
     @param optlen length of the field for the commandline option (integer)
     """
     options = [
         ("--version", "show the program's version number and exit"),
-        ("-h, --help", "show this help message and exit")
+        ("-h, --help", "show this help message and exit"),
     ]
     options.extend(appinfo["options"])
-    
-    print("""\n"""
-          """Usage: {bin} [OPTIONS] {arg}\n"""
-          """\n"""
-          """{name} - {description}\n"""
-          """\n"""
-          """Options:""".format(**appinfo))
+
+    print(
+        """\n"""
+        """Usage: {bin} [OPTIONS] {arg}\n"""
+        """\n"""
+        """{name} - {description}\n"""
+        """\n"""
+        """Options:""".format(**appinfo)
+    )
     for opt in options:
         print("  {0}  {1}".format(opt[0].ljust(optlen), opt[1]))
     sys.exit(0)
@@ -51,41 +53,39 @@
 def version(appinfo):
     """
     Module function to show the version information.
-    
+
     @param appinfo dictionary describing the application
     """
-    print("""\n"""
-          """{name} {version}\n"""
-          """\n"""
-          """{description}\n"""
-          """\n"""
-          """Copyright (c) 2002 - 2022 Detlev Offenbach"""
-          """ <detlev@die-offenbachs.de>\n"""
-          """This is free software; see LICENSE.GPL3 for copying"""
-          """ conditions.\n"""
-          """There is NO warranty; not even for MERCHANTABILITY or FITNESS"""
-          """ FOR A\n"""
-          """PARTICULAR PURPOSE.""".format(**appinfo))
+    print(
+        """\n"""
+        """{name} {version}\n"""
+        """\n"""
+        """{description}\n"""
+        """\n"""
+        """Copyright (c) 2002 - 2022 Detlev Offenbach"""
+        """ <detlev@die-offenbachs.de>\n"""
+        """This is free software; see LICENSE.GPL3 for copying"""
+        """ conditions.\n"""
+        """There is NO warranty; not even for MERCHANTABILITY or FITNESS"""
+        """ FOR A\n"""
+        """PARTICULAR PURPOSE.""".format(**appinfo)
+    )
     sys.exit(0)
 
 
 def handleArgs(argv, appinfo):
     """
     Module function to handle the always present commandline options.
-    
+
     @param argv list of commandline parameters (list of strings)
     @param appinfo dictionary describing the application
     @return index of the '--' option (integer). This is used to tell
         the application, that all additional options don't belong to
         the application.
     """
-    ddindex = 30000     # arbitrarily large number
-    args = {
-        "--version": version,
-        "--help": usage,
-        "-h": usage
-    }
-    if '--' in argv:
+    ddindex = 30000  # arbitrarily large number
+    args = {"--version": version, "--help": usage, "-h": usage}
+    if "--" in argv:
         ddindex = argv.index("--")
     for a in args:
         if a in argv and argv.index(a) < ddindex:
@@ -107,7 +107,7 @@
         loaded = trans.load(tn, directory)
         if loaded:
             return (trans, True)
-    
+
     print("Warning: translation file '" + tn + "'could not be loaded.")
     print("Using default.")
     return (None, False)
@@ -116,12 +116,12 @@
 def initializeResourceSearchPath(application):
     """
     Module function to initialize the default mime source factory.
-    
+
     @param application reference to the application object
     @type EricApplication
     """
     import Preferences
-    
+
     defaultIconPaths = getDefaultIconPaths(application)
     iconPaths = Preferences.getIcons("Path")
     for iconPath in iconPaths:
@@ -135,14 +135,14 @@
 def getDefaultIconPaths(application):
     """
     Module function to determine the default icon paths.
-    
+
     @param application reference to the application object
     @type EricApplication
     @return list of default icon paths
     @rtype list of str
     """
     import Preferences
-    
+
     defaultIconsPath = Preferences.getIcons("DefaultIconsPath")
     if defaultIconsPath == "automatic":
         if application.usesDarkPalette():
@@ -151,10 +151,10 @@
         else:
             # light desktop
             defaultIconsPath = "breeze-light"
-    
+
     return [
-        os.path.join(getConfig('ericIconDir'), defaultIconsPath),
-        os.path.join(getConfig('ericIconDir'), defaultIconsPath, "languages"),
+        os.path.join(getConfig("ericIconDir"), defaultIconsPath),
+        os.path.join(getConfig("ericIconDir"), defaultIconsPath, "languages"),
     ]
 
 
@@ -166,7 +166,7 @@
         os.path.join(Globals.getPyQt6ModulesDirectory(), "plugins"),
         os.path.join(Globals.getPyQt6ModulesDirectory(), "Qt6", "plugins"),
     )
-    
+
     libraryPaths = QApplication.libraryPaths()
     for libPath in libPaths:
         if os.path.exists(libPath):
@@ -175,6 +175,7 @@
                 libraryPaths.insert(0, libPath)
     QApplication.setLibraryPaths(libraryPaths)
 
+
 # the translator must not be deleted, therefore we save them here
 loaded_translators = {}
 
@@ -182,7 +183,7 @@
 def loadTranslators(qtTransDir, app, translationFiles=()):
     """
     Module function to load all required translations.
-    
+
     @param qtTransDir directory of the Qt translations files (string)
     @param app reference to the application object (QApplication)
     @param translationFiles tuple of additional translations to
@@ -190,12 +191,18 @@
     @return the requested locale (string)
     """
     import Preferences
-    
+
     global loaded_translators
-    
+
     translations = (
-        "qt", "qt_help", "qtbase", "qtmultimedia", "qtserialport",
-        "qtwebengine", "qtwebsockets", "eric7"
+        "qt",
+        "qt_help",
+        "qtbase",
+        "qtmultimedia",
+        "qtserialport",
+        "qtwebengine",
+        "qtwebsockets",
+        "eric7",
     ) + translationFiles
     loc = Preferences.getUILanguage()
     if loc is None:
@@ -204,7 +211,7 @@
     if loc == "System":
         loc = QLocale.system().name()
     if loc != "C":
-        dirs = [getConfig('ericTranslationsDir'), Globals.getConfigDir()]
+        dirs = [getConfig("ericTranslationsDir"), Globals.getConfigDir()]
         if qtTransDir is not None:
             dirs.append(qtTransDir)
 
@@ -223,14 +230,21 @@
     return loc
 
 
-def simpleAppStartup(argv, appinfo, mwFactory, quitOnLastWindowClosed=True,
-                     app=None, raiseIt=True, installErrorHandler=False):
+def simpleAppStartup(
+    argv,
+    appinfo,
+    mwFactory,
+    quitOnLastWindowClosed=True,
+    app=None,
+    raiseIt=True,
+    installErrorHandler=False,
+):
     """
     Module function to start up an application that doesn't need a specialized
     start up.
-    
+
     This function is used by all of eric's helper programs.
-    
+
     @param argv list of commandline parameters (list of strings)
     @param appinfo dictionary describing the application
     @param mwFactory factory function generating the main widget. This
@@ -249,10 +263,10 @@
     @return exit result (integer)
     """
     global application
-    
+
     if "__PYVENV_LAUNCHER__" in os.environ:
         del os.environ["__PYVENV_LAUNCHER__"]
-    
+
     handleArgs(argv, appinfo)
     if app is None:
         # set the library paths for plugins
@@ -260,40 +274,41 @@
         app = EricApplication(argv)
         application = app
     app.setQuitOnLastWindowClosed(quitOnLastWindowClosed)
-    
+
     # the following code depends upon a valid application object
     import Preferences
-    
+
     # set the application style sheet
     app.setStyleSheetFile(Preferences.getUI("StyleSheet"))
-    
+
     initializeResourceSearchPath(app)
     QApplication.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-    
+
     qtTransDir = Preferences.getQtTranslationsDir()
     if not qtTransDir:
-        qtTransDir = QLibraryInfo.path(
-            QLibraryInfo.LibraryPath.TranslationsPath)
+        qtTransDir = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
     loadTranslators(qtTransDir, app, ("qscintilla",))
     # qscintilla needed for web browser
-    
+
     w = mwFactory(argv)
     if w is None:
         return 100
-    
+
     if quitOnLastWindowClosed:
         app.lastWindowClosed.connect(app.quit)
     w.show()
     if raiseIt:
         w.raise_()
-    
+
     if installErrorHandler:
         # generate a graphical error handler
         from EricWidgets import EricErrorMessage
+
         eMsg = EricErrorMessage.qtHandler()
         eMsg.setMinimumSize(600, 400)
-    
+
     return app.exec()
 
+
 #
 # eflag: noqa = M801
--- a/src/eric7/Tools/TRPreviewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tools/TRPreviewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,13 +12,28 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    QDir, QTimer, pyqtSignal, QEvent, QSize, QTranslator, QObject, Qt,
-    QCoreApplication
+    QDir,
+    QTimer,
+    pyqtSignal,
+    QEvent,
+    QSize,
+    QTranslator,
+    QObject,
+    Qt,
+    QCoreApplication,
 )
 from PyQt6.QtGui import QKeySequence, QAction
 from PyQt6.QtWidgets import (
-    QSizePolicy, QSpacerItem, QWidget, QHBoxLayout, QWhatsThis, QMdiArea,
-    QApplication, QComboBox, QVBoxLayout, QLabel
+    QSizePolicy,
+    QSpacerItem,
+    QWidget,
+    QHBoxLayout,
+    QWhatsThis,
+    QMdiArea,
+    QApplication,
+    QComboBox,
+    QVBoxLayout,
+    QLabel,
 )
 from PyQt6 import uic
 
@@ -33,43 +48,42 @@
 import Preferences
 
 
-noTranslationName = QCoreApplication.translate(
-    "TRPreviewer", "<No translation>")
+noTranslationName = QCoreApplication.translate("TRPreviewer", "<No translation>")
 
 
 class TRPreviewer(EricMainWindow):
     """
     Class implementing the UI Previewer main window.
     """
+
     def __init__(self, filenames=None, parent=None, name=None):
         """
         Constructor
-        
+
         @param filenames filenames of form and/or translation files to load
         @param parent parent widget of this window (QWidget)
         @param name name of this window (string)
         """
         self.mainWidget = None
         self.currentFile = QDir.currentPath()
-        
+
         super().__init__(parent)
         if not name:
             self.setObjectName("TRPreviewer")
         else:
             self.setObjectName(name)
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.resize(QSize(800, 600).expandedTo(self.minimumSizeHint()))
         self.statusBar()
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.setWindowTitle(self.tr("Translations Previewer"))
 
         self.cw = QWidget(self)
         self.cw.setObjectName("qt_central_widget")
-        
+
         self.TRPreviewerLayout = QVBoxLayout(self.cw)
         self.TRPreviewerLayout.setContentsMargins(6, 6, 6, 6)
         self.TRPreviewerLayout.setSpacing(6)
@@ -80,8 +94,7 @@
         self.languageLayout.setSpacing(6)
         self.languageLayout.setObjectName("languageLayout")
 
-        self.languageLabel = QLabel(
-            self.tr("Select language file"), self.cw)
+        self.languageLabel = QLabel(self.tr("Select language file"), self.cw)
         self.languageLabel.setObjectName("languageLabel")
         self.languageLayout.addWidget(self.languageLabel)
 
@@ -90,11 +103,13 @@
         self.languageCombo.setEditable(False)
         self.languageCombo.setToolTip(self.tr("Select language file"))
         self.languageCombo.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         self.languageLayout.addWidget(self.languageCombo)
-        
+
         languageSpacer = QSpacerItem(
-            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         self.languageLayout.addItem(languageSpacer)
         self.TRPreviewerLayout.addLayout(self.languageLayout)
 
@@ -104,32 +119,32 @@
         self.preview.lastWidgetClosed.connect(self.__updateActions)
 
         self.setCentralWidget(self.cw)
-        
+
         self.languageCombo.activated[int].connect(self.__setTranslation)
-        
+
         self.translations = TranslationsDict(self.languageCombo, self)
-        self.translations.translationChanged.connect(
-            self.preview.rebuildWidgets)
-        
+        self.translations.translationChanged.connect(self.preview.rebuildWidgets)
+
         self.__initActions()
         self.__initMenus()
         self.__initToolbars()
-        
+
         self.__updateActions()
-        
+
         # fire up the single application server
         from .TRSingleApplication import TRSingleApplicationServer
+
         self.SAServer = TRSingleApplicationServer(self)
         self.SAServer.loadForm.connect(self.preview.loadWidget)
         self.SAServer.loadTranslation.connect(self.translations.add)
-        
+
         # defere loading of a UI file until we are shown
         self.filesToLoad = [] if filenames is None else filenames[:]
-        
+
     def show(self):
         """
         Public slot to show this dialog.
-        
+
         This overloaded slot loads a UI file to be previewed after
         the main window has been shown. This way, previewing a dialog
         doesn't interfere with showing the main window.
@@ -140,141 +155,152 @@
             first = True
             for fn in filenames:
                 fpath = pathlib.Path(fn)
-                if fpath.suffix.lower() == '.ui':
+                if fpath.suffix.lower() == ".ui":
                     self.preview.loadWidget(fn)
-                elif fpath.suffix.lower() == '.qm':
+                elif fpath.suffix.lower() == ".qm":
                     self.translations.add(fn, first)
                     first = False
-            
+
             self.__updateActions()
-        
+
     def closeEvent(self, event):
         """
         Protected event handler for the close event.
-        
+
         @param event close event (QCloseEvent)
         """
         if self.SAServer is not None:
             self.SAServer.shutdown()
             self.SAServer = None
         event.accept()
-        
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         self.openUIAct = QAction(
-            UI.PixmapCache.getIcon("openUI"),
-            self.tr('&Open UI Files...'), self)
-        self.openUIAct.setStatusTip(self.tr('Open UI files for display'))
-        self.openUIAct.setWhatsThis(self.tr(
-            """<b>Open UI Files</b>"""
-            """<p>This opens some UI files for display.</p>"""
-        ))
+            UI.PixmapCache.getIcon("openUI"), self.tr("&Open UI Files..."), self
+        )
+        self.openUIAct.setStatusTip(self.tr("Open UI files for display"))
+        self.openUIAct.setWhatsThis(
+            self.tr(
+                """<b>Open UI Files</b>"""
+                """<p>This opens some UI files for display.</p>"""
+            )
+        )
         self.openUIAct.triggered.connect(self.__openWidget)
-        
+
         self.openQMAct = QAction(
             UI.PixmapCache.getIcon("openQM"),
-            self.tr('Open &Translation Files...'), self)
-        self.openQMAct.setStatusTip(self.tr(
-            'Open Translation files for display'))
-        self.openQMAct.setWhatsThis(self.tr(
-            """<b>Open Translation Files</b>"""
-            """<p>This opens some translation files for display.</p>"""
-        ))
+            self.tr("Open &Translation Files..."),
+            self,
+        )
+        self.openQMAct.setStatusTip(self.tr("Open Translation files for display"))
+        self.openQMAct.setWhatsThis(
+            self.tr(
+                """<b>Open Translation Files</b>"""
+                """<p>This opens some translation files for display.</p>"""
+            )
+        )
         self.openQMAct.triggered.connect(self.__openTranslation)
-        
+
         self.reloadAct = QAction(
-            UI.PixmapCache.getIcon("reload"),
-            self.tr('&Reload Translations'), self)
-        self.reloadAct.setStatusTip(self.tr(
-            'Reload the loaded translations'))
-        self.reloadAct.setWhatsThis(self.tr(
-            """<b>Reload Translations</b>"""
-            """<p>This reloads the translations for the loaded"""
-            """ languages.</p>"""
-        ))
+            UI.PixmapCache.getIcon("reload"), self.tr("&Reload Translations"), self
+        )
+        self.reloadAct.setStatusTip(self.tr("Reload the loaded translations"))
+        self.reloadAct.setWhatsThis(
+            self.tr(
+                """<b>Reload Translations</b>"""
+                """<p>This reloads the translations for the loaded"""
+                """ languages.</p>"""
+            )
+        )
         self.reloadAct.triggered.connect(self.translations.reload)
-        
-        self.exitAct = QAction(
-            UI.PixmapCache.getIcon("exit"), self.tr('&Quit'), self)
-        self.exitAct.setShortcut(QKeySequence(
-            self.tr("Ctrl+Q", "File|Quit")))
-        self.exitAct.setStatusTip(self.tr('Quit the application'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the application.</p>"""
-        ))
+
+        self.exitAct = QAction(UI.PixmapCache.getIcon("exit"), self.tr("&Quit"), self)
+        self.exitAct.setShortcut(QKeySequence(self.tr("Ctrl+Q", "File|Quit")))
+        self.exitAct.setStatusTip(self.tr("Quit the application"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the application.</p>""")
+        )
         self.exitAct.triggered.connect(ericApp().closeAllWindows)
-        
+
         self.whatsThisAct = QAction(
-            UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'), self)
+            UI.PixmapCache.getIcon("whatsThis"), self.tr("&What's This?"), self
+        )
         self.whatsThisAct.setShortcut(QKeySequence(self.tr("Shift+F1")))
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be accessed"""
-            """ using the context help button in the titlebar.</p>"""
-        ))
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be accessed"""
+                """ using the context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
 
-        self.aboutAct = QAction(self.tr('&About'), self)
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""
-        ))
+        self.aboutAct = QAction(self.tr("&About"), self)
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
-        
-        self.aboutQtAct = QAction(self.tr('About &Qt'), self)
+
+        self.aboutQtAct = QAction(self.tr("About &Qt"), self)
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
-        
-        self.tileAct = QAction(self.tr('&Tile'), self)
-        self.tileAct.setStatusTip(self.tr('Tile the windows'))
-        self.tileAct.setWhatsThis(self.tr(
-            """<b>Tile the windows</b>"""
-            """<p>Rearrange and resize the windows so that they are"""
-            """ tiled.</p>"""
-        ))
+
+        self.tileAct = QAction(self.tr("&Tile"), self)
+        self.tileAct.setStatusTip(self.tr("Tile the windows"))
+        self.tileAct.setWhatsThis(
+            self.tr(
+                """<b>Tile the windows</b>"""
+                """<p>Rearrange and resize the windows so that they are"""
+                """ tiled.</p>"""
+            )
+        )
         self.tileAct.triggered.connect(self.preview.tileSubWindows)
-        
-        self.cascadeAct = QAction(self.tr('&Cascade'), self)
-        self.cascadeAct.setStatusTip(self.tr('Cascade the windows'))
-        self.cascadeAct.setWhatsThis(self.tr(
-            """<b>Cascade the windows</b>"""
-            """<p>Rearrange and resize the windows so that they are"""
-            """ cascaded.</p>"""
-        ))
+
+        self.cascadeAct = QAction(self.tr("&Cascade"), self)
+        self.cascadeAct.setStatusTip(self.tr("Cascade the windows"))
+        self.cascadeAct.setWhatsThis(
+            self.tr(
+                """<b>Cascade the windows</b>"""
+                """<p>Rearrange and resize the windows so that they are"""
+                """ cascaded.</p>"""
+            )
+        )
         self.cascadeAct.triggered.connect(self.preview.cascadeSubWindows)
-        
+
         self.closeAct = QAction(
-            UI.PixmapCache.getIcon("close"), self.tr('&Close'), self)
-        self.closeAct.setShortcut(QKeySequence(self.tr(
-            "Ctrl+W", "File|Close")))
-        self.closeAct.setStatusTip(self.tr('Close the current window'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close Window</b>"""
-            """<p>Close the current window.</p>"""
-        ))
+            UI.PixmapCache.getIcon("close"), self.tr("&Close"), self
+        )
+        self.closeAct.setShortcut(QKeySequence(self.tr("Ctrl+W", "File|Close")))
+        self.closeAct.setStatusTip(self.tr("Close the current window"))
+        self.closeAct.setWhatsThis(
+            self.tr("""<b>Close Window</b>""" """<p>Close the current window.</p>""")
+        )
         self.closeAct.triggered.connect(self.preview.closeWidget)
-        
-        self.closeAllAct = QAction(self.tr('Clos&e All'), self)
-        self.closeAllAct.setStatusTip(self.tr('Close all windows'))
-        self.closeAllAct.setWhatsThis(self.tr(
-            """<b>Close All Windows</b>"""
-            """<p>Close all windows.</p>"""
-        ))
+
+        self.closeAllAct = QAction(self.tr("Clos&e All"), self)
+        self.closeAllAct.setStatusTip(self.tr("Close all windows"))
+        self.closeAllAct.setWhatsThis(
+            self.tr("""<b>Close All Windows</b>""" """<p>Close all windows.</p>""")
+        )
         self.closeAllAct.triggered.connect(self.preview.closeAllWidgets)
 
     def __initMenus(self):
@@ -283,7 +309,7 @@
         """
         mb = self.menuBar()
 
-        menu = mb.addMenu(self.tr('&File'))
+        menu = mb.addMenu(self.tr("&File"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.openUIAct)
         menu.addAction(self.openQMAct)
@@ -293,15 +319,15 @@
         menu.addAction(self.closeAllAct)
         menu.addSeparator()
         menu.addAction(self.exitAct)
-        
-        self.windowMenu = mb.addMenu(self.tr('&Window'))
+
+        self.windowMenu = mb.addMenu(self.tr("&Window"))
         self.windowMenu.setTearOffEnabled(True)
         self.windowMenu.aboutToShow.connect(self.__showWindowMenu)
         self.windowMenu.triggered.connect(self.preview.toggleSelectedWidget)
-        
+
         mb.addSeparator()
-        
-        menu = mb.addMenu(self.tr('&Help'))
+
+        menu = mb.addMenu(self.tr("&Help"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
@@ -321,17 +347,17 @@
         filetb.addAction(self.closeAct)
         filetb.addSeparator()
         filetb.addAction(self.exitAct)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-        
+
     def __updateActions(self):
         """
         Private slot to update the actions state.
@@ -346,7 +372,7 @@
             self.closeAllAct.setEnabled(False)
             self.tileAct.setEnabled(False)
             self.cascadeAct.setEnabled(False)
-        
+
         if self.translations.hasTranslations():
             self.reloadAct.setEnabled(True)
         else:
@@ -364,15 +390,15 @@
                 """<p>The TR Previewer loads and displays Qt User-Interface"""
                 """ files and translation files and shows dialogs for a"""
                 """ selected language.</p>"""
-            )
+            ),
         )
-    
+
     def __aboutQt(self):
         """
         Private slot to show info about Qt.
         """
         EricMessageBox.aboutQt(self, self.tr("TR Previewer"))
-    
+
     def __openWidget(self):
         """
         Private slot to handle the Open Dialog action.
@@ -381,13 +407,14 @@
             None,
             self.tr("Select UI files"),
             "",
-            self.tr("Qt User-Interface Files (*.ui)"))
-        
+            self.tr("Qt User-Interface Files (*.ui)"),
+        )
+
         for fileName in fileNameList:
             self.preview.loadWidget(fileName)
-        
+
         self.__updateActions()
-    
+
     def __openTranslation(self):
         """
         Private slot to handle the Open Translation action.
@@ -396,25 +423,26 @@
             None,
             self.tr("Select translation files"),
             "",
-            self.tr("Qt Translation Files (*.qm)"))
-        
+            self.tr("Qt Translation Files (*.qm)"),
+        )
+
         first = True
         for fileName in fileNameList:
             self.translations.add(fileName, first)
             first = False
-        
+
         self.__updateActions()
-    
+
     def __setTranslation(self, index):
         """
         Private slot to activate a translation.
-        
+
         @param index index of the selected entry
         @type int
         """
         name = self.languageCombo.itemText(index)
         self.translations.set(name)
-    
+
     def __showWindowMenu(self):
         """
         Private slot to handle the aboutToShow signal of the window menu.
@@ -425,7 +453,7 @@
         self.windowMenu.addSeparator()
 
         self.preview.showWindowMenu(self.windowMenu)
-    
+
     def reloadTranslations(self):
         """
         Public slot to reload all translations.
@@ -437,6 +465,7 @@
     """
     Class to store the properties of a translation.
     """
+
     def __init__(self):
         """
         Constructor
@@ -449,33 +478,34 @@
 class TranslationsDict(QObject):
     """
     Class to store all loaded translations.
-    
+
     @signal translationChanged() emit after a translator was set
     """
+
     translationChanged = pyqtSignal()
-    
+
     def __init__(self, selector, parent):
         """
         Constructor
-        
+
         @param selector reference to the QComboBox used to show the
             available languages (QComboBox)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.selector = selector
         self.currentTranslator = None
         self.selector.addItem(noTranslationName)
         self.translations = []  # list of Translation objects
-    
+
     def add(self, fileName, setTranslation=True):
         """
         Public method to add a translation to the list.
-        
+
         If the translation file (*.qm) has not been loaded yet, it will
         be loaded automatically.
-        
+
         @param fileName name of the translation file to be added (string)
         @param setTranslation flag indicating, if this should be set as
             the active translation (boolean)
@@ -490,28 +520,30 @@
                     self.tr("Set Translator"),
                     self.tr(
                         """<p>The translation filename <b>{0}</b>"""
-                        """ is invalid.</p>""").format(fileName))
+                        """ is invalid.</p>"""
+                    ).format(fileName),
+                )
                 return
-            
+
             ntr.translator = self.loadTransFile(fileName)
             if ntr.translator is None:
                 return
-            
+
             self.selector.addItem(ntr.name)
             self.translations.append(ntr)
-        
+
         if setTranslation:
             tr = self.__findFileName(fileName)
             self.set(tr.name)
-    
+
     def set(self, name):
         """
         Public slot to set a translator by name.
-        
+
         @param name name (language) of the translator to set (string)
         """
         nTranslator = None
-        
+
         if name != noTranslationName:
             trans = self.__findName(name)
             if trans is None:
@@ -519,27 +551,28 @@
                     self.parent(),
                     self.tr("Set Translator"),
                     self.tr(
-                        """<p>The translator <b>{0}</b> is not known.</p>""")
-                    .format(name))
+                        """<p>The translator <b>{0}</b> is not known.</p>"""
+                    ).format(name),
+                )
                 return
-                
+
             nTranslator = trans.translator
-        
+
         if nTranslator == self.currentTranslator:
             return
-        
+
         if self.currentTranslator is not None:
             QApplication.removeTranslator(self.currentTranslator)
         if nTranslator is not None:
             QApplication.installTranslator(nTranslator)
         self.currentTranslator = nTranslator
-        
+
         self.selector.blockSignals(True)
         self.selector.setCurrentIndex(self.selector.findText(name))
         self.selector.blockSignals(False)
-        
+
         self.translationChanged.emit()
-    
+
     def reload(self):
         """
         Public method to reload all translators.
@@ -548,28 +581,28 @@
         if self.currentTranslator is not None:
             QApplication.removeTranslator(self.currentTranslator)
             self.currentTranslator = None
-        
+
         fileNames = []
         for trans in self.translations:
             trans.translator = None
             fileNames.append(trans.fileName)
         self.translations = []
         self.selector.clear()
-        
+
         self.selector.addItem(noTranslationName)
-        
+
         for fileName in fileNames:
             self.add(fileName, False)
-        
+
         if self.__haveName(cname):
             self.set(cname)
         else:
             self.set(noTranslationName)
-    
+
     def __findFileName(self, transFileName):
         """
         Private method to find a translation by file name.
-        
+
         @param transFileName file name of the translation file (string)
         @return reference to a translation object or None
         """
@@ -577,11 +610,11 @@
             if trans.fileName == transFileName:
                 return trans
         return None
-    
+
     def __findName(self, name):
         """
         Private method to find a translation by name.
-        
+
         @param name name (language) of the translation (string)
         @return reference to a translation object or None
         """
@@ -589,86 +622,88 @@
             if trans.name == name:
                 return trans
         return None
-    
+
     def __haveFileName(self, transFileName):
         """
         Private method to check for the presence of a translation.
-        
+
         @param transFileName file name of the translation file (string)
         @return flag indicating the presence of the translation (boolean)
         """
         return self.__findFileName(transFileName) is not None
-    
+
     def __haveName(self, name):
         """
         Private method to check for the presence of a named translation.
-        
+
         @param name name (language) of the translation (string)
         @return flag indicating the presence of the translation (boolean)
         """
         return self.__findName(name) is not None
-    
+
     def __uniqueName(self, transFileName):
         """
         Private method to generate a unique name.
-        
+
         @param transFileName file name of the translation file (string)
         @return unique name (string or None)
         """
         name = os.path.basename(transFileName)
         if not name:
             return None
-        
+
         uname = name
         cnt = 1
         while self.__haveName(uname):
             cnt += 1
             uname = "{0} <{1}>".format(name, cnt)
-        
+
         return uname
-    
+
     def __del(self, name):
         """
         Private method to delete a translator from the list of available
         translators.
-        
+
         @param name name of the translator to delete (string)
         """
         if name == noTranslationName:
             return
-        
+
         trans = self.__findName(name)
         if trans is None:
             return
-        
+
         if self.selector().currentText() == name:
             self.set(noTranslationName)
-        
+
         self.translations.remove(trans)
         del trans
-    
+
     def loadTransFile(self, transFileName):
         """
         Public slot to load a translation file.
-        
+
         @param transFileName file name of the translation file (string)
         @return reference to the new translator object (QTranslator)
         """
         tr = QTranslator()
         if tr.load(transFileName):
             return tr
-        
+
         EricMessageBox.warning(
             self.parent(),
             self.tr("Load Translator"),
-            self.tr("""<p>The translation file <b>{0}</b> could"""
-                    """ not be loaded.</p>""").format(transFileName))
+            self.tr(
+                """<p>The translation file <b>{0}</b> could""" """ not be loaded.</p>"""
+            ).format(transFileName),
+        )
         return None
 
     def hasTranslations(self):
         """
         Public method to check for loaded translations.
-        
+
         @return flag signaling if any translation was loaded (boolean)
         """
         return len(self.translations) > 0
@@ -678,10 +713,11 @@
     """
     Class to show a dynamically loaded widget (or dialog).
     """
+
     def __init__(self, uiFileName, parent=None, name=None):
         """
         Constructor
-        
+
         @param uiFileName name of the UI file to load (string)
         @param parent parent widget (QWidget)
         @param name name of this widget (string)
@@ -690,7 +726,7 @@
         if name:
             self.setObjectName(name)
             self.setWindowTitle(name)
-        
+
         self.__widget = None
         self.__uiFileName = uiFileName
         self.__layout = QHBoxLayout(self)
@@ -698,23 +734,23 @@
         self.__timer = QTimer(self)
         self.__timer.setSingleShot(True)
         self.__timer.timeout.connect(self.buildWidget)
-    
+
     def isValid(self):
         """
         Public method to return the validity of this widget view.
-        
+
         @return flag indicating the validity (boolean)
         """
         return self.__valid
-    
+
     def uiFileName(self):
         """
         Public method to retrieve the name of the UI file.
-        
+
         @return filename of the loaded UI file (string)
         """
         return self.__uiFileName
-    
+
     def buildWidget(self):
         """
         Public slot to load a UI file.
@@ -724,28 +760,29 @@
             self.__layout.removeWidget(self.__widget)
             del self.__widget
             self.__widget = None
-        
+
         with contextlib.suppress(Exception):
             self.__widget = uic.loadUi(self.__uiFileName)
-        
+
         if not self.__widget:
             EricMessageBox.warning(
                 self,
                 self.tr("Load UI File"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be loaded.</p>""")
-                .format(self.__uiFileName))
+                self.tr("""<p>The file <b>{0}</b> could not be loaded.</p>""").format(
+                    self.__uiFileName
+                ),
+            )
             self.__valid = False
             return
-        
+
         self.__widget.setParent(self)
         self.__layout.addWidget(self.__widget)
         self.__widget.show()
         self.__valid = True
         self.adjustSize()
-        
+
         self.__timer.stop()
-    
+
     def __rebuildWidget(self):
         """
         Private method to schedule a rebuild of the widget.
@@ -756,30 +793,31 @@
 class WidgetArea(QMdiArea):
     """
     Specialized MDI area to show the loaded widgets.
-    
+
     @signal lastWidgetClosed() emitted after the last widget was closed
     @signal rebuildWidgets() emitted to indicate a change of loaded widgets
     """
+
     lastWidgetClosed = pyqtSignal()
     rebuildWidgets = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
         self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
-        
+
         self.widgets = []
-    
+
     def loadWidget(self, uiFileName):
         """
         Public slot to load a UI file.
-        
+
         @param uiFileName name of the UI file to load (string)
         """
         wview = self.__findWidget(uiFileName)
@@ -790,35 +828,36 @@
                     self,
                     self.tr("Load UI File"),
                     self.tr(
-                        """<p>The file <b>{0}</b> could not be loaded.</p>""")
-                    .format(uiFileName))
+                        """<p>The file <b>{0}</b> could not be loaded.</p>"""
+                    ).format(uiFileName),
+                )
                 return
-            
+
             uname = name
             cnt = 1
             while self.findChild(WidgetView, uname) is not None:
                 cnt += 1
                 uname = "{0} <{1}>".format(name, cnt)
             name = uname
-            
+
             wview = WidgetView(uiFileName, self, name)
             wview.buildWidget()
             if not wview.isValid():
                 del wview
                 return
-            
+
             self.rebuildWidgets.connect(wview.buildWidget)
             wview.installEventFilter(self)
-            
+
             win = self.addSubWindow(wview)
             self.widgets.append(win)
-        
+
         wview.showNormal()
-    
+
     def eventFilter(self, obj, ev):
         """
         Public method called to filter an event.
-        
+
         @param obj object, that generated the event (QObject)
         @param ev the event, that was generated by object (QEvent)
         @return flag indicating if event was filtered out
@@ -828,26 +867,26 @@
                 self.widgets.remove(obj)
                 if len(self.widgets) == 0:
                     self.lastWidgetClosed.emit()
-        
+
         return QMdiArea.eventFilter(self, obj, ev)
-    
+
     def __findWidget(self, uiFileName):
         """
         Private method to find a specific widget view.
-        
+
         @param uiFileName filename of the loaded UI file (string)
         @return reference to the widget (WidgetView) or None
         """
         wviewList = self.findChildren(WidgetView)
         if wviewList is None:
             return None
-        
+
         for wview in wviewList:
             if wview.uiFileName() == uiFileName:
                 return wview
-        
+
         return None
-    
+
     def closeWidget(self):
         """
         Public slot to close the active window.
@@ -855,18 +894,18 @@
         aw = self.activeSubWindow()
         if aw is not None:
             aw.close()
-    
+
     def closeAllWidgets(self):
         """
         Public slot to close all windows.
         """
         for w in self.widgets[:]:
             w.close()
-    
+
     def showWindowMenu(self, windowMenu):
         """
         Public method to set up the widgets part of the Window menu.
-        
+
         @param windowMenu reference to the window menu
         """
         for idx, wid in enumerate(self.widgets):
@@ -874,32 +913,32 @@
             act.setData(idx)
             act.setCheckable(True)
             act.setChecked(not wid.isHidden())
-    
+
     def toggleSelectedWidget(self, act):
         """
         Public method to handle the toggle of a window.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         idx = act.data()
         if idx is not None:
             self.__toggleWidget(self.widgets[idx])
-    
+
     def __toggleWidget(self, w):
         """
         Private method to toggle a workspace window.
-        
+
         @param w window to be toggled
         """
         if w.isHidden():
             w.show()
         else:
             w.hide()
-    
+
     def hasWidgets(self):
         """
         Public method to check for loaded widgets.
-        
+
         @return flag signaling if any widget was loaded (boolean)
         """
         return len(self.widgets) > 0
--- a/src/eric7/Tools/TRSingleApplication.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tools/TRSingleApplication.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 
 from PyQt6.QtCore import pyqtSignal
 
-from Toolbox.SingleApplication import (
-    SingleApplicationClient, SingleApplicationServer
-)
+from Toolbox.SingleApplication import SingleApplicationClient, SingleApplicationServer
 
 ###########################################################################
 ## define some module global stuff
@@ -22,35 +20,36 @@
 SAFile = "eric7_trpreviewer"
 
 # define the protocol tokens
-SALoadForm = 'LoadForm'
-SALoadTranslation = 'LoadTranslation'
+SALoadForm = "LoadForm"
+SALoadTranslation = "LoadTranslation"
 
 
 class TRSingleApplicationServer(SingleApplicationServer):
     """
     Class implementing the single application server embedded within the
     Translations Previewer.
-    
+
     @signal loadForm(str) emitted to load a form file
     @signal loadTranslation(str, bool) emitted to load a translation file
     """
+
     loadForm = pyqtSignal(str)
     loadTranslation = pyqtSignal(str, bool)
-    
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         SingleApplicationServer.__init__(self, SAFile)
-        
+
         self.parent = parent
 
     def handleCommand(self, command, arguments):
         """
         Public slot to handle the command sent by the client.
-        
+
         @param command command sent by the client
         @type str
         @param arguments list of command arguments
@@ -65,16 +64,16 @@
     def __saLoadForm(self, fnames):
         """
         Private method used to handle the "Load Form" command.
-        
+
         @param fnames filenames of the forms to be loaded (list of strings)
         """
         for fname in fnames:
             self.loadForm.emit(fname)
-        
+
     def __saLoadTranslation(self, fnames):
         """
         Private method used to handle the "Load Translation" command.
-        
+
         @param fnames filenames of the translations to be loaded
             (list of strings)
         """
@@ -89,35 +88,36 @@
     Class implementing the single application client of the Translations
     Previewer.
     """
+
     def __init__(self):
         """
         Constructor
         """
         SingleApplicationClient.__init__(self, SAFile)
-        
+
     def processArgs(self, args):
         """
         Public method to process the command line args passed to the UI.
-        
+
         @param args list of files to open
         """
         # no args, return
         if args is None:
             return
-        
+
         uiFiles = []
         qmFiles = []
-        
+
         for arg in args:
             ext = os.path.splitext(arg)[1]
             ext = ext.lower()
-            
-            if ext == '.ui':
+
+            if ext == ".ui":
                 uiFiles.append(arg)
-            elif ext == '.qm':
+            elif ext == ".qm":
                 qmFiles.append(arg)
-        
+
         self.sendCommand(SALoadForm, uiFiles)
         self.sendCommand(SALoadTranslation, qmFiles)
-        
+
         self.disconnect()
--- a/src/eric7/Tools/TrayStarter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tools/TrayStarter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,173 +33,208 @@
     """
     Class implementing a starter for the system tray.
     """
+
     def __init__(self, settingsDir):
         """
         Constructor
-        
+
         @param settingsDir directory to be used for the settings files
         @type str
         """
         super().__init__(
-            UI.PixmapCache.getIcon(
-                Preferences.getTrayStarter("TrayStarterIcon")))
-        
+            UI.PixmapCache.getIcon(Preferences.getTrayStarter("TrayStarterIcon"))
+        )
+
         self.settingsDir = settingsDir
-        
+
         self.maxMenuFilePathLen = 75
-        
+
         self.rsettings = QSettings(
             QSettings.Format.IniFormat,
             QSettings.Scope.UserScope,
             Globals.settingsNameOrganization,
-            Globals.settingsNameRecent)
-        
+            Globals.settingsNameRecent,
+        )
+
         self.recentProjects = []
         self.__loadRecentProjects()
         self.recentMultiProjects = []
         self.__loadRecentMultiProjects()
         self.recentFiles = []
         self.__loadRecentFiles()
-        
+
         self.activated.connect(self.__activated)
-        
+
         self.__menu = QMenu(self.tr("eric tray starter"))
-        
-        self.recentProjectsMenu = QMenu(
-            self.tr('Recent Projects'), self.__menu)
-        self.recentProjectsMenu.aboutToShow.connect(
-            self.__showRecentProjectsMenu)
+
+        self.recentProjectsMenu = QMenu(self.tr("Recent Projects"), self.__menu)
+        self.recentProjectsMenu.aboutToShow.connect(self.__showRecentProjectsMenu)
         self.recentProjectsMenu.triggered.connect(self.__openRecent)
-        
+
         self.recentMultiProjectsMenu = QMenu(
-            self.tr('Recent Multiprojects'), self.__menu)
+            self.tr("Recent Multiprojects"), self.__menu
+        )
         self.recentMultiProjectsMenu.aboutToShow.connect(
-            self.__showRecentMultiProjectsMenu)
+            self.__showRecentMultiProjectsMenu
+        )
         self.recentMultiProjectsMenu.triggered.connect(self.__openRecent)
-        
-        self.recentFilesMenu = QMenu(self.tr('Recent Files'), self.__menu)
+
+        self.recentFilesMenu = QMenu(self.tr("Recent Files"), self.__menu)
         self.recentFilesMenu.aboutToShow.connect(self.__showRecentFilesMenu)
         self.recentFilesMenu.triggered.connect(self.__openRecent)
-        
-        act = self.__menu.addAction(
-            self.tr("eric tray starter"), self.__about)
+
+        act = self.__menu.addAction(self.tr("eric tray starter"), self.__about)
         font = act.font()
         font.setBold(True)
         act.setFont(font)
         self.__menu.addSeparator()
-        
-        self.__menu.addAction(
-            self.tr("Show Versions"), self.__showVersions)
+
+        self.__menu.addAction(self.tr("Show Versions"), self.__showVersions)
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
-            self.tr("QRegularExpression editor"),
-            self.__startQRegularExpression)
-        self.__menu.addAction(
-            self.tr("Python re editor"), self.__startPyRe)
+            self.tr("QRegularExpression editor"), self.__startQRegularExpression
+        )
+        self.__menu.addAction(self.tr("Python re editor"), self.__startPyRe)
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("uiPreviewer"),
-            self.tr("UI Previewer"), self.__startUIPreviewer)
+            self.tr("UI Previewer"),
+            self.__startUIPreviewer,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("trPreviewer"),
-            self.tr("Translations Previewer"), self.__startTRPreviewer)
+            self.tr("Translations Previewer"),
+            self.__startTRPreviewer,
+        )
         self.__menu.addAction(
-            UI.PixmapCache.getIcon("unittest"),
-            self.tr("Testing"), self.__startTesting)
+            UI.PixmapCache.getIcon("unittest"), self.tr("Testing"), self.__startTesting
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("diffFiles"),
-            self.tr("Compare Files"), self.__startDiff)
+            self.tr("Compare Files"),
+            self.__startDiff,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("compareFiles"),
-            self.tr("Compare Files side by side"), self.__startCompare)
+            self.tr("Compare Files side by side"),
+            self.__startCompare,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("sqlBrowser"),
-            self.tr("SQL Browser"), self.__startSqlBrowser)
+            self.tr("SQL Browser"),
+            self.__startSqlBrowser,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("ericSnap"),
-            self.tr("Snapshot"), self.__startSnapshot)
+            self.tr("Snapshot"),
+            self.__startSnapshot,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("iconEditor"),
-            self.tr("Icon Editor"), self.__startIconEditor)
+            self.tr("Icon Editor"),
+            self.__startIconEditor,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("pluginInstall"),
-            self.tr("Install Plugin"), self.__startPluginInstall)
+            self.tr("Install Plugin"),
+            self.__startPluginInstall,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("pluginUninstall"),
-            self.tr("Uninstall Plugin"), self.__startPluginUninstall)
+            self.tr("Uninstall Plugin"),
+            self.__startPluginUninstall,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("pluginRepository"),
-            self.tr("Plugin Repository"), self.__startPluginRepository)
+            self.tr("Plugin Repository"),
+            self.__startPluginRepository,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("virtualenv"),
-            self.tr("Virtual Environments"), self.__startVirtualenvManager)
+            self.tr("Virtual Environments"),
+            self.__startVirtualenvManager,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("configure"),
-            self.tr('Preferences'), self.__startPreferences)
+            self.tr("Preferences"),
+            self.__startPreferences,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("editor"),
-            self.tr("eric Mini Editor"), self.__startMiniEditor)
+            self.tr("eric Mini Editor"),
+            self.__startMiniEditor,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("hexEditor"),
-            self.tr("eric Hex Editor"), self.__startHexEditor)
+            self.tr("eric Hex Editor"),
+            self.__startHexEditor,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("shell"),
-            self.tr("eric Shell Window"), self.__startShell)
+            self.tr("eric Shell Window"),
+            self.__startShell,
+        )
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("ericWeb"),
-            self.tr("eric Web Browser"), self.__startWebBrowser)
+            self.tr("eric Web Browser"),
+            self.__startWebBrowser,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("ericWeb"),
             self.tr("eric Web Browser (with QtHelp)"),
-            self.__startWebBrowserQtHelp)
+            self.__startWebBrowserQtHelp,
+        )
         self.__menu.addAction(
             UI.PixmapCache.getIcon("ericWeb"),
             self.tr("eric Web Browser (Private Mode)"),
-            self.__startWebBrowserPrivate)
+            self.__startWebBrowserPrivate,
+        )
         self.__menu.addSeparator()
-        
+
         # recent files
         self.menuRecentFilesAct = self.__menu.addMenu(self.recentFilesMenu)
         # recent multi projects
         self.menuRecentMultiProjectsAct = self.__menu.addMenu(
-            self.recentMultiProjectsMenu)
+            self.recentMultiProjectsMenu
+        )
         # recent projects
-        self.menuRecentProjectsAct = self.__menu.addMenu(
-            self.recentProjectsMenu)
+        self.menuRecentProjectsAct = self.__menu.addMenu(self.recentProjectsMenu)
         self.__menu.addSeparator()
-        
+
         self.__menu.addAction(
-            UI.PixmapCache.getIcon("erict"),
-            self.tr("eric IDE"), self.__startEric)
+            UI.PixmapCache.getIcon("erict"), self.tr("eric IDE"), self.__startEric
+        )
         self.__menu.addSeparator()
-         
+
         self.__menu.addAction(
             UI.PixmapCache.getIcon("configure"),
-            self.tr('Configure Tray Starter'), self.__showPreferences)
+            self.tr("Configure Tray Starter"),
+            self.__showPreferences,
+        )
         self.__menu.addSeparator()
-       
+
         self.__menu.addAction(
-            UI.PixmapCache.getIcon("exit"),
-            self.tr('Quit'), ericApp().quit)
-    
+            UI.PixmapCache.getIcon("exit"), self.tr("Quit"), ericApp().quit
+        )
+
     def __loadRecentProjects(self):
         """
         Private method to load the recently opened project filenames.
@@ -209,7 +244,7 @@
             for f in rp:
                 if pathlib.Path(f).exists():
                     self.recentProjects.append(f)
-    
+
     def __loadRecentMultiProjects(self):
         """
         Private method to load the recently opened multi project filenames.
@@ -219,7 +254,7 @@
             for f in rmp:
                 if pathlib.Path(f).exists():
                     self.recentMultiProjects.append(f)
-    
+
     def __loadRecentFiles(self):
         """
         Private method to load the recently opened filenames.
@@ -229,48 +264,47 @@
             for f in rf:
                 if pathlib.Path(f).exists():
                     self.recentFiles.append(f)
-    
+
     def __activated(self, reason):
         """
         Private slot to handle the activated signal.
-        
+
         @param reason reason code of the signal
             (QSystemTrayIcon.ActivationReason)
         """
         if reason in (
             QSystemTrayIcon.ActivationReason.Context,
-            QSystemTrayIcon.ActivationReason.MiddleClick
+            QSystemTrayIcon.ActivationReason.MiddleClick,
         ):
             self.__showContextMenu()
         elif reason == QSystemTrayIcon.ActivationReason.DoubleClick:
             self.__startEric()
-    
+
     def __showContextMenu(self):
         """
         Private slot to show the context menu.
         """
         self.menuRecentProjectsAct.setEnabled(len(self.recentProjects) > 0)
-        self.menuRecentMultiProjectsAct.setEnabled(
-            len(self.recentMultiProjects) > 0)
+        self.menuRecentMultiProjectsAct.setEnabled(len(self.recentMultiProjects) > 0)
         self.menuRecentFilesAct.setEnabled(len(self.recentFiles) > 0)
-        
+
         pos = QCursor.pos()
         x = pos.x() - self.__menu.sizeHint().width()
         pos.setX(x > 0 and x or 0)
         y = pos.y() - self.__menu.sizeHint().height()
         pos.setY(y > 0 and y or 0)
         self.__menu.popup(pos)
-    
+
     def __startProc(self, applName, *applArgs):
         """
         Private method to start an eric application.
-        
+
         @param applName name of the eric application script (string)
         @param *applArgs variable list of application arguments
         """
         proc = QProcess()
         applPath = os.path.join(getConfig("ericDir"), applName)
-        
+
         args = []
         args.append(applPath)
         args.append("--config={0}".format(Utilities.getConfigDir()))
@@ -278,26 +312,26 @@
             args.append("--settings={0}".format(self.settingsDir))
         for arg in applArgs:
             args.append(arg)
-        
-        if (
-            not os.path.isfile(applPath) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(applPath) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start the process.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
+                    "<p>Could not start the process.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
                 ).format(applPath),
-                self.tr('OK'))
-    
+                self.tr("OK"),
+            )
+
     def __startMiniEditor(self):
         """
         Private slot to start the eric Mini Editor.
         """
         self.__startProc("eric7_editor.py")
-    
+
     def __startEric(self):
         """
         Private slot to start the eric IDE.
@@ -387,7 +421,7 @@
         Private slot to start the eric compare dialog.
         """
         self.__startProc("eric7_compare.py")
-    
+
     def __startSqlBrowser(self):
         """
         Private slot to start the eric sql browser dialog.
@@ -417,13 +451,13 @@
         Private slot to start the eric Python re editor dialog.
         """
         self.__startProc("eric7_re.py")
-    
+
     def __startHexEditor(self):
         """
         Private slot to start the eric hex editor dialog.
         """
         self.__startProc("eric7_hexeditor.py")
-    
+
     def __startShell(self):
         """
         Private slot to start the eric Shell window.
@@ -437,16 +471,18 @@
         self.recentProjects = []
         self.rsettings.sync()
         self.__loadRecentProjects()
-        
+
         self.recentProjectsMenu.clear()
-        
+
         for idx, rp in enumerate(self.recentProjects, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentProjectsMenu.addAction(
                 formatStr.format(
-                    idx, Utilities.compactPath(rp, self.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rp, self.maxMenuFilePathLen)
+                )
+            )
             act.setData(rp)
-    
+
     def __showRecentMultiProjectsMenu(self):
         """
         Private method to set up the recent multi projects menu.
@@ -454,16 +490,18 @@
         self.recentMultiProjects = []
         self.rsettings.sync()
         self.__loadRecentMultiProjects()
-        
+
         self.recentMultiProjectsMenu.clear()
-        
+
         for idx, rmp in enumerate(self.recentMultiProjects, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentMultiProjectsMenu.addAction(
                 formatStr.format(
-                    idx, Utilities.compactPath(rmp, self.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rmp, self.maxMenuFilePathLen)
+                )
+            )
             act.setData(rmp)
-    
+
     def __showRecentFilesMenu(self):
         """
         Private method to set up the recent files menu.
@@ -471,39 +509,45 @@
         self.recentFiles = []
         self.rsettings.sync()
         self.__loadRecentFiles()
-        
+
         self.recentFilesMenu.clear()
-        
+
         for idx, rf in enumerate(self.recentFiles, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentFilesMenu.addAction(
                 formatStr.format(
-                    idx, Utilities.compactPath(rf, self.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rf, self.maxMenuFilePathLen)
+                )
+            )
             act.setData(rf)
-    
+
     def __openRecent(self, act):
         """
         Private method to open a project or file from the list of recently
         opened projects or files.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         filename = act.data()
         if filename:
-            self.__startProc(
-                "eric7.py",
-                filename)
-    
+            self.__startProc("eric7.py", filename)
+
     def __showPreferences(self):
         """
         Private slot to set the preferences.
         """
         from Preferences.ConfigurationDialog import (
-            ConfigurationDialog, ConfigurationMode
+            ConfigurationDialog,
+            ConfigurationMode,
         )
+
         dlg = ConfigurationDialog(
-            None, 'Configuration', True, fromEric=True,
-            displayMode=ConfigurationMode.TRAYSTARTERMODE)
+            None,
+            "Configuration",
+            True,
+            fromEric=True,
+            displayMode=ConfigurationMode.TRAYSTARTERMODE,
+        )
         dlg.preferencesChanged.connect(self.preferencesChanged)
         dlg.show()
         dlg.showConfigurationPageByName("trayStarterPage")
@@ -513,30 +557,31 @@
             dlg.setPreferences()
             Preferences.syncPreferences()
             self.preferencesChanged()
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.setIcon(
-            UI.PixmapCache.getIcon(
-                Preferences.getTrayStarter("TrayStarterIcon")))
+            UI.PixmapCache.getIcon(Preferences.getTrayStarter("TrayStarterIcon"))
+        )
 
     def __about(self):
         """
         Private slot to handle the About dialog.
         """
         from Plugins.AboutPlugin.AboutDialog import AboutDialog
+
         dlg = AboutDialog()
         dlg.exec()
-    
+
     def __showVersions(self):
         """
         Private slot to handle the Versions dialog.
         """
         from PyQt6.QtCore import qVersion, PYQT_VERSION_STR
         from PyQt6.Qsci import QSCINTILLA_VERSION_STR
-        
+
         try:
             try:
                 from PyQt6 import sip
@@ -545,71 +590,64 @@
             sip_version_str = sip.SIP_VERSION_STR
         except (ImportError, AttributeError):
             sip_version_str = "sip version not available"
-        
-        versionText = self.tr(
-            """<h3>Version Numbers</h3>"""
-            """<table>""")
-        
+
+        versionText = self.tr("""<h3>Version Numbers</h3>""" """<table>""")
+
         # Python version
-        versionText += (
-            """<tr><td><b>Python</b></td><td>{0}</td></tr>"""
-            .format(sys.version.split()[0])
-        )
-        
-        # Qt version
-        versionText += (
-            """<tr><td><b>Qt</b></td><td>{0}</td></tr>"""
-            .format(qVersion())
+        versionText += """<tr><td><b>Python</b></td><td>{0}</td></tr>""".format(
+            sys.version.split()[0]
         )
-        
+
+        # Qt version
+        versionText += """<tr><td><b>Qt</b></td><td>{0}</td></tr>""".format(qVersion())
+
         # PyQt versions
-        versionText += (
-            """<tr><td><b>PyQt</b></td><td>{0}</td></tr>"""
-            .format(PYQT_VERSION_STR)
+        versionText += """<tr><td><b>PyQt</b></td><td>{0}</td></tr>""".format(
+            PYQT_VERSION_STR
         )
-        versionText += (
-            """<tr><td><b>sip</b></td><td>{0}</td></tr>"""
-            .format(sip_version_str)
+        versionText += """<tr><td><b>sip</b></td><td>{0}</td></tr>""".format(
+            sip_version_str
         )
-        versionText += (
-            """<tr><td><b>QScintilla</b></td><td>{0}</td></tr>"""
-            .format(QSCINTILLA_VERSION_STR)
+        versionText += """<tr><td><b>QScintilla</b></td><td>{0}</td></tr>""".format(
+            QSCINTILLA_VERSION_STR
         )
-        
+
         # webengine (chromium) version
         with contextlib.suppress(ImportError):
             from WebBrowser.Tools import WebBrowserTools
-            chromiumVersion, chromiumSecurityVersion = (
-                WebBrowserTools.getWebEngineVersions()[0:2]
-            )
-            versionText += (
-                """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>"""
-                .format(chromiumVersion)
+
+            (
+                chromiumVersion,
+                chromiumSecurityVersion,
+            ) = WebBrowserTools.getWebEngineVersions()[0:2]
+            versionText += """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>""".format(
+                chromiumVersion
             )
             if chromiumSecurityVersion:
                 versionText += self.tr(
                     """<tr><td><b>WebEngine (Security)</b></td>"""
                     """<td>{0}</td></tr>"""
                 ).format(chromiumSecurityVersion)
-        
+
         # eric7 version
-        versionText += (
-            """<tr><td><b>{0}</b></td><td>{1}</td></tr>"""
-            .format(Program, Version)
+        versionText += """<tr><td><b>{0}</b></td><td>{1}</td></tr>""".format(
+            Program, Version
         )
-        
+
         # desktop and session type
         desktop = Globals.desktopName()
         session = Globals.sessionType()
         if desktop or session:
             versionText += "<tr><td></td><td></td></tr>"
             if desktop:
-                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>"
-                                ).format(self.tr("Desktop"), desktop)
+                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format(
+                    self.tr("Desktop"), desktop
+                )
             if session:
-                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>"
-                                ).format(self.tr("Session Type"), session)
-        
+                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format(
+                    self.tr("Session Type"), session
+                )
+
         versionText += self.tr("""</table>""")
-        
+
         EricMessageBox.about(None, Program, versionText)
--- a/src/eric7/Tools/UIPreviewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tools/UIPreviewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,9 +13,20 @@
 from PyQt6.QtCore import QDir, QEvent, QSize, Qt
 from PyQt6.QtGui import QAction, QKeySequence, QImageWriter, QPainter
 from PyQt6.QtWidgets import (
-    QSizePolicy, QSpacerItem, QWidget, QHBoxLayout, QWhatsThis, QDialog,
-    QScrollArea, QApplication, QStyleFactory, QFrame, QMainWindow,
-    QComboBox, QVBoxLayout, QLabel
+    QSizePolicy,
+    QSpacerItem,
+    QWidget,
+    QHBoxLayout,
+    QWhatsThis,
+    QDialog,
+    QScrollArea,
+    QApplication,
+    QStyleFactory,
+    QFrame,
+    QMainWindow,
+    QComboBox,
+    QVBoxLayout,
+    QLabel,
 )
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog
 from PyQt6 import uic
@@ -35,35 +46,35 @@
     """
     Class implementing the UI Previewer main window.
     """
+
     def __init__(self, filename=None, parent=None, name=None):
         """
         Constructor
-        
+
         @param filename name of a UI file to load
         @param parent parent widget of this window (QWidget)
         @param name name of this window (string)
         """
         self.mainWidget = None
         self.currentFile = QDir.currentPath()
-        
+
         super().__init__(parent)
         if not name:
             self.setObjectName("UIPreviewer")
         else:
             self.setObjectName(name)
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.resize(QSize(600, 480).expandedTo(self.minimumSizeHint()))
         self.statusBar()
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.setWindowTitle(self.tr("UI Previewer"))
 
         self.cw = QWidget(self)
         self.cw.setObjectName("centralWidget")
-        
+
         self.UIPreviewerLayout = QVBoxLayout(self.cw)
         self.UIPreviewerLayout.setContentsMargins(6, 6, 6, 6)
         self.UIPreviewerLayout.setSpacing(6)
@@ -84,12 +95,13 @@
         self.styleCombo.setToolTip(self.tr("Select the GUI Theme"))
         self.styleLayout.addWidget(self.styleCombo)
         self.styleCombo.addItems(sorted(QStyleFactory().keys()))
-        currentStyle = Preferences.getSettings().value('UIPreviewer/style')
+        currentStyle = Preferences.getSettings().value("UIPreviewer/style")
         if currentStyle is not None:
             self.styleCombo.setCurrentIndex(int(currentStyle))
-        
+
         styleSpacer = QSpacerItem(
-            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         self.styleLayout.addItem(styleSpacer)
         self.UIPreviewerLayout.addLayout(self.styleLayout)
 
@@ -98,26 +110,27 @@
         self.previewSV.setFrameShape(QFrame.Shape.NoFrame)
         self.previewSV.setFrameShadow(QFrame.Shadow.Plain)
         self.previewSV.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding
+        )
         self.UIPreviewerLayout.addWidget(self.previewSV)
 
         self.setCentralWidget(self.cw)
-        
+
         self.styleCombo.activated[int].connect(self.__guiStyleSelected)
-        
+
         self.__initActions()
         self.__initMenus()
         self.__initToolbars()
-        
+
         self.__updateActions()
-        
+
         # defere loading of a UI file until we are shown
         self.fileToLoad = filename
-        
+
     def show(self):
         """
         Public slot to show this dialog.
-        
+
         This overloaded slot loads a UI file to be previewed after
         the main window has been shown. This way, previewing a dialog
         doesn't interfere with showing the main window.
@@ -126,113 +139,115 @@
         if self.fileToLoad is not None:
             fn, self.fileToLoad = (self.fileToLoad, None)
             self.__loadFile(fn)
-            
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         self.openAct = QAction(
-            UI.PixmapCache.getIcon("openUI"),
-            self.tr('&Open File'), self)
-        self.openAct.setShortcut(
-            QKeySequence(self.tr("Ctrl+O", "File|Open")))
-        self.openAct.setStatusTip(self.tr('Open a UI file for display'))
-        self.openAct.setWhatsThis(self.tr(
-            """<b>Open File</b>"""
-            """<p>This opens a new UI file for display.</p>"""
-        ))
+            UI.PixmapCache.getIcon("openUI"), self.tr("&Open File"), self
+        )
+        self.openAct.setShortcut(QKeySequence(self.tr("Ctrl+O", "File|Open")))
+        self.openAct.setStatusTip(self.tr("Open a UI file for display"))
+        self.openAct.setWhatsThis(
+            self.tr(
+                """<b>Open File</b>"""
+                """<p>This opens a new UI file for display.</p>"""
+            )
+        )
         self.openAct.triggered.connect(self.__openFile)
-        
+
         self.printAct = QAction(
-            UI.PixmapCache.getIcon("print"),
-            self.tr('&Print'), self)
-        self.printAct.setShortcut(
-            QKeySequence(self.tr("Ctrl+P", "File|Print")))
-        self.printAct.setStatusTip(self.tr('Print a screen capture'))
-        self.printAct.setWhatsThis(self.tr(
-            """<b>Print</b>"""
-            """<p>Print a screen capture.</p>"""
-        ))
+            UI.PixmapCache.getIcon("print"), self.tr("&Print"), self
+        )
+        self.printAct.setShortcut(QKeySequence(self.tr("Ctrl+P", "File|Print")))
+        self.printAct.setStatusTip(self.tr("Print a screen capture"))
+        self.printAct.setWhatsThis(
+            self.tr("""<b>Print</b>""" """<p>Print a screen capture.</p>""")
+        )
         self.printAct.triggered.connect(self.__printImage)
-        
+
         self.printPreviewAct = QAction(
-            UI.PixmapCache.getIcon("printPreview"),
-            self.tr('Print Preview'), self)
-        self.printPreviewAct.setStatusTip(self.tr(
-            'Print preview a screen capture'))
-        self.printPreviewAct.setWhatsThis(self.tr(
-            """<b>Print Preview</b>"""
-            """<p>Print preview a screen capture.</p>"""
-        ))
+            UI.PixmapCache.getIcon("printPreview"), self.tr("Print Preview"), self
+        )
+        self.printPreviewAct.setStatusTip(self.tr("Print preview a screen capture"))
+        self.printPreviewAct.setWhatsThis(
+            self.tr(
+                """<b>Print Preview</b>""" """<p>Print preview a screen capture.</p>"""
+            )
+        )
         self.printPreviewAct.triggered.connect(self.__printPreviewImage)
-        
+
         self.imageAct = QAction(
-            UI.PixmapCache.getIcon("screenCapture"),
-            self.tr('&Screen Capture'), self)
+            UI.PixmapCache.getIcon("screenCapture"), self.tr("&Screen Capture"), self
+        )
         self.imageAct.setShortcut(
-            QKeySequence(self.tr("Ctrl+S", "File|Screen Capture")))
-        self.imageAct.setStatusTip(self.tr(
-            'Save a screen capture to an image file'))
-        self.imageAct.setWhatsThis(self.tr(
-            """<b>Screen Capture</b>"""
-            """<p>Save a screen capture to an image file.</p>"""
-        ))
+            QKeySequence(self.tr("Ctrl+S", "File|Screen Capture"))
+        )
+        self.imageAct.setStatusTip(self.tr("Save a screen capture to an image file"))
+        self.imageAct.setWhatsThis(
+            self.tr(
+                """<b>Screen Capture</b>"""
+                """<p>Save a screen capture to an image file.</p>"""
+            )
+        )
         self.imageAct.triggered.connect(self.__saveImage)
-        
-        self.exitAct = QAction(
-            UI.PixmapCache.getIcon("exit"), self.tr('&Quit'), self)
-        self.exitAct.setShortcut(
-            QKeySequence(self.tr("Ctrl+Q", "File|Quit")))
-        self.exitAct.setStatusTip(self.tr('Quit the application'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the application.</p>"""
-        ))
+
+        self.exitAct = QAction(UI.PixmapCache.getIcon("exit"), self.tr("&Quit"), self)
+        self.exitAct.setShortcut(QKeySequence(self.tr("Ctrl+Q", "File|Quit")))
+        self.exitAct.setStatusTip(self.tr("Quit the application"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the application.</p>""")
+        )
         self.exitAct.triggered.connect(ericApp().closeAllWindows)
-        
+
         self.copyAct = QAction(
-            UI.PixmapCache.getIcon("editCopy"), self.tr('&Copy'), self)
-        self.copyAct.setShortcut(
-            QKeySequence(self.tr("Ctrl+C", "Edit|Copy")))
-        self.copyAct.setStatusTip(
-            self.tr('Copy screen capture to clipboard'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy screen capture to clipboard.</p>"""
-        ))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("&Copy"), self
+        )
+        self.copyAct.setShortcut(QKeySequence(self.tr("Ctrl+C", "Edit|Copy")))
+        self.copyAct.setStatusTip(self.tr("Copy screen capture to clipboard"))
+        self.copyAct.setWhatsThis(
+            self.tr("""<b>Copy</b>""" """<p>Copy screen capture to clipboard.</p>""")
+        )
         self.copyAct.triggered.connect(self.__copyImageToClipboard)
-        
+
         self.whatsThisAct = QAction(
-            UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'), self)
+            UI.PixmapCache.getIcon("whatsThis"), self.tr("&What's This?"), self
+        )
         self.whatsThisAct.setShortcut(QKeySequence(self.tr("Shift+F1")))
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and"""
-            """ how to use them. In dialogs, this feature can be accessed"""
-            """ using the context help button in the titlebar.</p>"""
-        ))
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and"""
+                """ how to use them. In dialogs, this feature can be accessed"""
+                """ using the context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
 
-        self.aboutAct = QAction(self.tr('&About'), self)
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""
-        ))
+        self.aboutAct = QAction(self.tr("&About"), self)
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
-                     
-        self.aboutQtAct = QAction(self.tr('About &Qt'), self)
+
+        self.aboutQtAct = QAction(self.tr("About &Qt"), self)
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
 
     def __initMenus(self):
@@ -241,7 +256,7 @@
         """
         mb = self.menuBar()
 
-        menu = mb.addMenu(self.tr('&File'))
+        menu = mb.addMenu(self.tr("&File"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.openAct)
         menu.addAction(self.imageAct)
@@ -250,14 +265,14 @@
         menu.addAction(self.printAct)
         menu.addSeparator()
         menu.addAction(self.exitAct)
-        
+
         menu = mb.addMenu(self.tr("&Edit"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.copyAct)
-        
+
         mb.addSeparator()
-        
-        menu = mb.addMenu(self.tr('&Help'))
+
+        menu = mb.addMenu(self.tr("&Help"))
         menu.setTearOffEnabled(True)
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
@@ -277,11 +292,11 @@
         filetb.addAction(self.printAct)
         filetb.addSeparator()
         filetb.addAction(self.exitAct)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setIconSize(UI.Config.ToolBarIconSize)
         edittb.addAction(self.copyAct)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
@@ -291,18 +306,18 @@
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-        
+
     def __guiStyleSelected(self, index):
         """
         Private slot to handle the selection of a GUI style.
-        
+
         @param index index of the selected entry
         @type int
         """
         selectedStyle = self.styleCombo.itemText(index)
         if self.mainWidget:
             self.__updateChildren(selectedStyle)
-    
+
     def __about(self):
         """
         Private slot to show the about information.
@@ -315,9 +330,9 @@
                 """<p>The UI Previewer loads and displays Qt User-Interface"""
                 """ files with various styles, which are selectable via a"""
                 """ selection list.</p>"""
-            )
+            ),
         )
-    
+
     def __aboutQt(self):
         """
         Private slot to show info about Qt.
@@ -332,14 +347,15 @@
             self,
             self.tr("Select UI file"),
             self.currentFile,
-            self.tr("Qt User-Interface Files (*.ui)"))
+            self.tr("Qt User-Interface Files (*.ui)"),
+        )
         if fn:
             self.__loadFile(fn)
-        
+
     def __loadFile(self, fn):
         """
         Private slot to load a ui file.
-        
+
         @param fn name of the ui file to be laoded
         @type str
         """
@@ -348,11 +364,11 @@
             self.previewSV.takeWidget()
             del self.mainWidget
             self.mainWidget = None
-            
+
         # load the file
         with contextlib.suppress(Exception):
             self.mainWidget = uic.loadUi(fn)
-        
+
         if self.mainWidget:
             self.currentFile = fn
             self.__updateChildren(self.styleCombo.currentText())
@@ -366,35 +382,37 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Load UI File"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be loaded.</p>""")
-                .format(fn))
+                self.tr("""<p>The file <b>{0}</b> could not be loaded.</p>""").format(
+                    fn
+                ),
+            )
         self.__updateActions()
-    
+
     def __updateChildren(self, sstyle):
         """
         Private slot to change the style of the show UI.
-        
+
         @param sstyle name of the selected style (string)
         """
         with EricOverrideCursor():
             qstyle = QStyleFactory.create(sstyle)
             self.mainWidget.setStyle(qstyle)
-            
+
             lst = self.mainWidget.findChildren(QWidget)
             for obj in lst:
                 with contextlib.suppress(AttributeError):
                     obj.setStyle(qstyle)
             del lst
-            
+
             self.mainWidget.hide()
             self.mainWidget.show()
-            
+
             self.lastQStyle = qstyle
             self.lastStyle = sstyle
             Preferences.getSettings().setValue(
-                'UIPreviewer/style', self.styleCombo.currentIndex())
-    
+                "UIPreviewer/style", self.styleCombo.currentIndex()
+            )
+
     def __updateActions(self):
         """
         Private slot to update the actions state.
@@ -423,11 +441,11 @@
             del self.mainWidget
             self.mainWidget = None
         self.__updateActions()
-    
+
     def eventFilter(self, obj, ev):
         """
         Public method called to filter an event.
-        
+
         @param obj object, that generated the event (QObject)
         @param ev the event, that was generated by object (QEvent)
         @return flag indicating if event was filtered out
@@ -443,49 +461,46 @@
                 return QMainWindow.eventFilter(self, obj, ev)
             else:
                 return False
-    
+
     def __saveImage(self):
         """
         Private slot to handle the Save Image menu action.
         """
         if self.mainWidget is None:
             EricMessageBox.critical(
-                self,
-                self.tr("Save Image"),
-                self.tr("""There is no UI file loaded."""))
+                self, self.tr("Save Image"), self.tr("""There is no UI file loaded.""")
+            )
             return
-        
+
         defaultExt = "PNG"
         filters = ""
         formats = QImageWriter.supportedImageFormats()
         for imageFormat in formats:
-            filters = "{0}*.{1} ".format(
-                filters, bytes(imageFormat).decode().lower())
+            filters = "{0}*.{1} ".format(filters, bytes(imageFormat).decode().lower())
         fileFilter = self.tr("Images ({0})").format(filters[:-1])
-        
+
         fname = EricFileDialog.getSaveFileName(
-            self,
-            self.tr("Save Image"),
-            "",
-            fileFilter)
+            self, self.tr("Save Image"), "", fileFilter
+        )
         if not fname:
             return
-        
+
         fpath = pathlib.Path(fname)
         ext = fpath.suffix.upper().replace(".", "")
         if not ext:
             ext = defaultExt
             fpath = fpath.with_suffix(".{0}".format(defaultExt.lower()))
-        
+
         pix = self.mainWidget.grab()
         self.__updateChildren(self.lastStyle)
         if not pix.save(str(fpath), str(ext)):
             EricMessageBox.critical(
                 self,
                 self.tr("Save Image"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be saved.</p>""")
-                .format(fpath))
+                self.tr("""<p>The file <b>{0}</b> could not be saved.</p>""").format(
+                    fpath
+                ),
+            )
 
     def __copyImageToClipboard(self):
         """
@@ -493,103 +508,109 @@
         """
         if self.mainWidget is None:
             EricMessageBox.critical(
-                self,
-                self.tr("Save Image"),
-                self.tr("""There is no UI file loaded."""))
+                self, self.tr("Save Image"), self.tr("""There is no UI file loaded.""")
+            )
             return
-        
+
         cb = QApplication.clipboard()
         cb.setPixmap(self.mainWidget.grab())
         self.__updateChildren(self.lastStyle)
-    
+
     def __printImage(self):
         """
         Private slot to handle the Print Image menu action.
         """
         if self.mainWidget is None:
             EricMessageBox.critical(
-                self,
-                self.tr("Print Image"),
-                self.tr("""There is no UI file loaded."""))
+                self, self.tr("Print Image"), self.tr("""There is no UI file loaded.""")
+            )
             return
-        
+
         settings = Preferences.getSettings()
         printer = QPrinter(QPrinter.PrinterMode.HighResolution)
         printer.setFullPage(True)
-        
+
         printerName = Preferences.getPrinter("UIPreviewer/printername")
         if printerName:
             printer.setPrinterName(printerName)
         printer.setPageSize(
-            QPrinter.PageSize(int(settings.value("UIPreviewer/pagesize"))))
+            QPrinter.PageSize(int(settings.value("UIPreviewer/pagesize")))
+        )
         printer.setPageOrder(
-            QPrinter.PageOrder(int(settings.value("UIPreviewer/pageorder"))))
-        printer.setOrientation(QPrinter.Orientation(
-            int(settings.value("UIPreviewer/orientation"))))
+            QPrinter.PageOrder(int(settings.value("UIPreviewer/pageorder")))
+        )
+        printer.setOrientation(
+            QPrinter.Orientation(int(settings.value("UIPreviewer/orientation")))
+        )
         printer.setColorMode(
-            QPrinter.ColorMode(int(settings.value("UIPreviewer/colormode"))))
-        
+            QPrinter.ColorMode(int(settings.value("UIPreviewer/colormode")))
+        )
+
         printDialog = QPrintDialog(printer, self)
         if printDialog.exec() == QDialog.DialogCode.Accepted:
             self.statusBar().showMessage(self.tr("Printing the image..."))
             self.__print(printer)
-            
+
             settings.setValue("UIPreviewer/printername", printer.printerName())
             settings.setValue("UIPreviewer/pagesize", printer.pageSize())
             settings.setValue("UIPreviewer/pageorder", printer.pageOrder())
             settings.setValue("UIPreviewer/orientation", printer.orientation())
             settings.setValue("UIPreviewer/colormode", printer.colorMode())
-        
-        self.statusBar().showMessage(
-            self.tr("Image sent to printer..."), 2000)
+
+        self.statusBar().showMessage(self.tr("Image sent to printer..."), 2000)
 
     def __printPreviewImage(self):
         """
         Private slot to handle the Print Preview menu action.
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
-        
+
         if self.mainWidget is None:
             EricMessageBox.critical(
                 self,
                 self.tr("Print Preview"),
-                self.tr("""There is no UI file loaded."""))
+                self.tr("""There is no UI file loaded."""),
+            )
             return
-        
+
         settings = Preferences.getSettings()
         printer = QPrinter(QPrinter.PrinterMode.HighResolution)
         printer.setFullPage(True)
-        
+
         printerName = Preferences.getPrinter("UIPreviewer/printername")
         if printerName:
             printer.setPrinterName(printerName)
         printer.setPageSize(
-            QPrinter.PageSize(int(settings.value("UIPreviewer/pagesize"))))
+            QPrinter.PageSize(int(settings.value("UIPreviewer/pagesize")))
+        )
         printer.setPageOrder(
-            QPrinter.PageOrder(int(settings.value("UIPreviewer/pageorder"))))
-        printer.setOrientation(QPrinter.Orientation(
-            int(settings.value("UIPreviewer/orientation"))))
+            QPrinter.PageOrder(int(settings.value("UIPreviewer/pageorder")))
+        )
+        printer.setOrientation(
+            QPrinter.Orientation(int(settings.value("UIPreviewer/orientation")))
+        )
         printer.setColorMode(
-            QPrinter.ColorMode(int(settings.value("UIPreviewer/colormode"))))
-        
+            QPrinter.ColorMode(int(settings.value("UIPreviewer/colormode")))
+        )
+
         preview = QPrintPreviewDialog(printer, self)
         preview.paintRequested.connect(self.__print)
         preview.exec()
-        
+
     def __print(self, printer):
         """
         Private slot to the actual printing.
-        
+
         @param printer reference to the printer object (QPrinter)
         """
         p = QPainter(printer)
         marginX = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).x() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).x()
+            printer.pageLayout().paintRectPixels(printer.resolution()).x()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).x()
         ) // 2
         marginY = (
-            printer.pageLayout().paintRectPixels(printer.resolution()).y() -
-            printer.pageLayout().fullRectPixels(printer.resolution()).y()
+            printer.pageLayout().paintRectPixels(printer.resolution()).y()
+            - printer.pageLayout().fullRectPixels(printer.resolution()).y()
         ) // 2
 
         # double the margin on bottom of page
@@ -603,10 +624,13 @@
         img = self.mainWidget.grab().toImage()
         self.__updateChildren(self.lastStyle)
         p.drawImage(
-            marginX, marginY, img.scaled(
-                width, height,
+            marginX,
+            marginY,
+            img.scaled(
+                width,
+                height,
                 Qt.AspectRatioMode.KeepAspectRatio,
-                Qt.TransformationMode.SmoothTransformation
-            )
+                Qt.TransformationMode.SmoothTransformation,
+            ),
         )
         p.end()
--- a/src/eric7/Tools/webBrowserSupport.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Tools/webBrowserSupport.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,9 +17,10 @@
 variant = "None"
 
 with contextlib.suppress(ImportError):
-    from PyQt6 import QtWebEngineWidgets    # __IGNORE_WARNING__
+    from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__
+
     variant = "QtWebEngine"
 
-print(variant)      # __IGNORE_WARNING_M801__
+print(variant)  # __IGNORE_WARNING_M801__
 
 sys.exit(0)
--- a/src/eric7/UI/AuthenticationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/AuthenticationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,11 +16,11 @@
     """
     Class implementing the authentication dialog for the help browser.
     """
-    def __init__(self, info, username, showSave=False, saveIt=False,
-                 parent=None):
+
+    def __init__(self, info, username, showSave=False, saveIt=False, parent=None):
         """
         Constructor
-        
+
         @param info information to be shown (string)
         @param username username as supplied by subversion (string)
         @param showSave flag to indicate to show the save checkbox (boolean)
@@ -29,43 +29,44 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.infoLabel.setText(info)
         self.usernameEdit.setText(username)
         self.saveCheckBox.setVisible(showSave)
         self.saveCheckBox.setChecked(saveIt)
-        
+
         self.iconLabel.setText("")
         self.iconLabel.setPixmap(
-            self.style().standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxQuestion)
-            .pixmap(32, 32))
-        
+            self.style()
+            .standardIcon(QStyle.StandardPixmap.SP_MessageBoxQuestion)
+            .pixmap(32, 32)
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def setData(self, username, password):
         """
         Public method to set the login data.
-        
+
         @param username username (string)
         @param password password (string)
         """
         self.usernameEdit.setText(username)
         self.passwordEdit.setText(password)
-    
+
     def getData(self):
         """
         Public method to retrieve the login data.
-        
+
         @return tuple of two string values (username, password)
         """
         return (self.usernameEdit.text(), self.passwordEdit.text())
-    
+
     def shallSave(self):
         """
         Public method to check, if the login data shall be saved.
-        
+
         @return flag indicating that the login data shall be saved (boolean)
         """
         return self.saveCheckBox.isChecked()
--- a/src/eric7/UI/Browser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Browser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,13 +11,24 @@
 import shutil
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QUrl, QCoreApplication, QItemSelectionModel,
-    QModelIndex, QElapsedTimer
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QUrl,
+    QCoreApplication,
+    QItemSelectionModel,
+    QModelIndex,
+    QElapsedTimer,
 )
 from PyQt6.QtGui import QAction, QDesktopServices
 from PyQt6.QtWidgets import (
-    QTreeView, QApplication, QMenu, QAbstractItemView, QInputDialog,
-    QLineEdit, QDialog
+    QTreeView,
+    QApplication,
+    QMenu,
+    QAbstractItemView,
+    QInputDialog,
+    QLineEdit,
+    QDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -25,10 +36,17 @@
 
 from Project.ProjectBrowserModel import ProjectBrowserSimpleDirectoryItem
 from .BrowserModel import (
-    BrowserModel, BrowserDirectoryItem, BrowserFileItem, BrowserClassItem,
-    BrowserMethodItem, BrowserClassAttributeItem, BrowserImportItem,
-    BrowserImportsItem, BrowserSysPathItem, BrowserGlobalsItem,
-    BrowserItemDirectory
+    BrowserModel,
+    BrowserDirectoryItem,
+    BrowserFileItem,
+    BrowserClassItem,
+    BrowserMethodItem,
+    BrowserClassAttributeItem,
+    BrowserImportItem,
+    BrowserImportsItem,
+    BrowserSysPathItem,
+    BrowserGlobalsItem,
+    BrowserItemDirectory,
 )
 from .BrowserSortFilterProxyModel import BrowserSortFilterProxyModel
 
@@ -41,11 +59,11 @@
 class Browser(QTreeView):
     """
     Class used to display a file system tree.
-    
+
     Via the context menu that
     is displayed by a right click the user can select various actions on
     the selected file.
-    
+
     @signal sourceFile(filename) emitted to open a Python file at a line (str)
     @signal sourceFile(filename, lineno) emitted to open a Python file at a
         line (str, int)
@@ -72,10 +90,11 @@
     @signal testFile(filename) emitted to open a Python file for a
         unit test (str)
     """
-    sourceFile = pyqtSignal((str, ), (str, int), (str, list), (str, int, str))
+
+    sourceFile = pyqtSignal((str,), (str, int), (str, list), (str, int, str))
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
-    trpreview = pyqtSignal((list, ), (list, bool))
+    trpreview = pyqtSignal((list,), (list, bool))
     projectFile = pyqtSignal(str)
     multiProjectFile = pyqtSignal(str)
     pixmapFile = pyqtSignal(str)
@@ -84,82 +103,83 @@
     umlFile = pyqtSignal(str)
     binaryFile = pyqtSignal(str)
     testFile = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.setWindowTitle(QCoreApplication.translate('Browser',
-                                                       'File-Browser'))
+
+        self.setWindowTitle(QCoreApplication.translate("Browser", "File-Browser"))
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__model = BrowserModel()
         self.__sortModel = BrowserSortFilterProxyModel()
         self.__sortModel.setSourceModel(self.__model)
         self.setModel(self.__sortModel)
-        
+
         self.selectedItemsFilter = [BrowserFileItem]
-        
+
         self._activating = False
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self._contextMenuRequested)
         self.activated.connect(self._openItem)
         self.expanded.connect(self._resizeColumns)
         self.collapsed.connect(self._resizeColumns)
-        
-        self.setWhatsThis(QCoreApplication.translate(
-            'Browser',
-            """<b>The Browser Window</b>"""
-            """<p>This allows you to easily navigate the hierarchy of"""
-            """ directories and files on your system, identify the Python"""
-            """ programs and open them up in a Source Viewer window. The"""
-            """ window displays several separate hierarchies.</p>"""
-            """<p>The first hierarchy is only shown if you have opened a"""
-            """ program for debugging and its root is the directory"""
-            """ containing that program. Usually all of the separate files"""
-            """ that make up a Python application are held in the same"""
-            """ directory, so this hierarchy gives you easy access to most"""
-            """ of what you will need.</p>"""
-            """<p>The next hierarchy is used to easily navigate the"""
-            """ directories that are specified in the Python"""
-            """ <tt>sys.path</tt> variable.</p>"""
-            """<p>The remaining hierarchies allow you navigate your system"""
-            """ as a whole. On a UNIX system there will be a hierarchy with"""
-            """ <tt>/</tt> at its root and another with the user home"""
-            """ directory. On a Windows system there will be a hierarchy for"""
-            """ each drive on the"""
-            """ system.</p>"""
-            """<p>Python programs (i.e. those with a <tt>.py</tt> file name"""
-            """ suffix) are identified in the hierarchies with a Python"""
-            """ icon. The right mouse button will popup a menu which lets"""
-            """ you open the file in a Source Viewer window, open the file"""
-            """ for debugging or use it for a test run.</p>"""
-            """<p>The context menu of a class, function or method allows you"""
-            """ to open the file defining this class, function or method and"""
-            """ will ensure, that the correct source line is visible.</p>"""
-            """<p>Qt-Designer files (i.e. those with a <tt>.ui</tt> file"""
-            """ name suffix) are shown with a Designer icon. The context"""
-            """ menu of these files allows you to start Qt-Designer with"""
-            """ that file.</p>"""
-            """<p>Qt-Linguist files (i.e. those with a <tt>.ts</tt> file"""
-            """ name suffix) are shown with a Linguist icon. The context"""
-            """ menu of these files allows you to start Qt-Linguist with"""
-            """ that file.</p>"""
-        ))
-        
+
+        self.setWhatsThis(
+            QCoreApplication.translate(
+                "Browser",
+                """<b>The Browser Window</b>"""
+                """<p>This allows you to easily navigate the hierarchy of"""
+                """ directories and files on your system, identify the Python"""
+                """ programs and open them up in a Source Viewer window. The"""
+                """ window displays several separate hierarchies.</p>"""
+                """<p>The first hierarchy is only shown if you have opened a"""
+                """ program for debugging and its root is the directory"""
+                """ containing that program. Usually all of the separate files"""
+                """ that make up a Python application are held in the same"""
+                """ directory, so this hierarchy gives you easy access to most"""
+                """ of what you will need.</p>"""
+                """<p>The next hierarchy is used to easily navigate the"""
+                """ directories that are specified in the Python"""
+                """ <tt>sys.path</tt> variable.</p>"""
+                """<p>The remaining hierarchies allow you navigate your system"""
+                """ as a whole. On a UNIX system there will be a hierarchy with"""
+                """ <tt>/</tt> at its root and another with the user home"""
+                """ directory. On a Windows system there will be a hierarchy for"""
+                """ each drive on the"""
+                """ system.</p>"""
+                """<p>Python programs (i.e. those with a <tt>.py</tt> file name"""
+                """ suffix) are identified in the hierarchies with a Python"""
+                """ icon. The right mouse button will popup a menu which lets"""
+                """ you open the file in a Source Viewer window, open the file"""
+                """ for debugging or use it for a test run.</p>"""
+                """<p>The context menu of a class, function or method allows you"""
+                """ to open the file defining this class, function or method and"""
+                """ will ensure, that the correct source line is visible.</p>"""
+                """<p>Qt-Designer files (i.e. those with a <tt>.ui</tt> file"""
+                """ name suffix) are shown with a Designer icon. The context"""
+                """ menu of these files allows you to start Qt-Designer with"""
+                """ that file.</p>"""
+                """<p>Qt-Linguist files (i.e. those with a <tt>.ts</tt> file"""
+                """ name suffix) are shown with a Linguist icon. The context"""
+                """ menu of these files allows you to start Qt-Linguist with"""
+                """ that file.</p>""",
+            )
+        )
+
         self.__createPopupMenus()
-        
-        self._init()    # perform common initialization tasks
-        
+
+        self._init()  # perform common initialization tasks
+
         self._keyboardSearchString = ""
         self._keyboardSearchTimer = QElapsedTimer()
         self._keyboardSearchTimer.invalidate()
-        
+
     def _init(self):
         """
         Protected method to perform initialization tasks common to this
@@ -167,205 +187,226 @@
         """
         self.setRootIsDecorated(True)
         self.setAlternatingRowColors(True)
-        
+
         header = self.header()
         header.setSortIndicator(0, Qt.SortOrder.AscendingOrder)
         header.setSortIndicatorShown(True)
         header.setSectionsClickable(True)
-        
+
         self.setSortingEnabled(True)
-        
-        self.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
-        
+
+        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
+
         self.header().setStretchLastSection(True)
         self.headerSize0 = 0
         self.layoutDisplay()
-        
+
     def layoutDisplay(self):
         """
         Public slot to perform a layout operation.
         """
         self._resizeColumns(QModelIndex())
         self._resort()
-        
+
     def _resizeColumns(self, index):
         """
         Protected slot to resize the view when items get expanded or collapsed.
-        
+
         @param index index of item (QModelIndex)
         """
         w = max(100, self.sizeHintForColumn(0))
         if w != self.headerSize0:
             self.header().resizeSection(0, w)
             self.headerSize0 = w
-    
+
     def _resort(self):
         """
         Protected slot to resort the tree.
         """
-        self.model().sort(self.header().sortIndicatorSection(),
-                          self.header().sortIndicatorOrder())
-        
+        self.model().sort(
+            self.header().sortIndicatorSection(), self.header().sortIndicatorOrder()
+        )
+
     def __createPopupMenus(self):
         """
         Private method to generate the various popup menus.
         """
         self.showHiddenFilesAct = QAction(
-            QCoreApplication.translate('Browser', 'Show Hidden Files'))
+            QCoreApplication.translate("Browser", "Show Hidden Files")
+        )
         self.showHiddenFilesAct.setCheckable(True)
         self.showHiddenFilesAct.toggled.connect(self._showHidden)
-        self.showHiddenFilesAct.setChecked(
-            Preferences.getUI("BrowsersListHiddenFiles"))
-        
-        self.__newMenu = QMenu(QCoreApplication.translate('Browser', "New"),
-                               self)
+        self.showHiddenFilesAct.setChecked(Preferences.getUI("BrowsersListHiddenFiles"))
+
+        self.__newMenu = QMenu(QCoreApplication.translate("Browser", "New"), self)
         self.__newMenu.addAction(
-            QCoreApplication.translate('Browser', 'Directory'),
-            self._newDirectory)
+            QCoreApplication.translate("Browser", "Directory"), self._newDirectory
+        )
         self.__newMenu.addAction(
-            QCoreApplication.translate('Browser', 'File'), self._newFile)
-        
+            QCoreApplication.translate("Browser", "File"), self._newFile
+        )
+
         # create the popup menu for source files
         self.sourceMenu = QMenu(self)
         self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Open'), self._openItem)
+            QCoreApplication.translate("Browser", "Open"), self._openItem
+        )
         self.testingAct = self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Run Test...'),
-            self.handleTesting)
+            QCoreApplication.translate("Browser", "Run Test..."), self.handleTesting
+        )
         self.sourceMenu.addSeparator()
         self.mimeTypeAct = self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Show Mime-Type'),
-            self.__showMimeType)
+            QCoreApplication.translate("Browser", "Show Mime-Type"), self.__showMimeType
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Refresh Source File'),
-            self.__refreshSource)
+            QCoreApplication.translate("Browser", "Refresh Source File"),
+            self.__refreshSource,
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Copy Path to Clipboard'),
-            self._copyToClipboard)
+            QCoreApplication.translate("Browser", "Copy Path to Clipboard"),
+            self._copyToClipboard,
+        )
         self.sourceMenu.addSeparator()
         self.sourceMenu.addAction(self.showHiddenFilesAct)
         self.sourceMenu.addSeparator()
         self.sourceMenu.addMenu(self.__newMenu)
         self.sourceMenu.addAction(
-            QCoreApplication.translate('Browser', 'Delete'),
-            self._deleteFileOrDirectory)
-        
+            QCoreApplication.translate("Browser", "Delete"), self._deleteFileOrDirectory
+        )
+
         # create the popup menu for general use
         self.menu = QMenu(self)
         self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Open'), self._openItem)
+            QCoreApplication.translate("Browser", "Open"), self._openItem
+        )
         self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Open in Hex Editor'),
-            self._openHexEditor)
+            QCoreApplication.translate("Browser", "Open in Hex Editor"),
+            self._openHexEditor,
+        )
         self.editPixmapAct = self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Open in Icon Editor'),
-            self._editPixmap)
+            QCoreApplication.translate("Browser", "Open in Icon Editor"),
+            self._editPixmap,
+        )
         self.openInEditorAct = self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Open in Editor'),
-            self._openFileInEditor)
+            QCoreApplication.translate("Browser", "Open in Editor"),
+            self._openFileInEditor,
+        )
         self.menu.addSeparator()
         self.mimeTypeAct = self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Show Mime-Type'),
-            self.__showMimeType)
+            QCoreApplication.translate("Browser", "Show Mime-Type"), self.__showMimeType
+        )
         self.menu.addSeparator()
         self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Copy Path to Clipboard'),
-            self._copyToClipboard)
+            QCoreApplication.translate("Browser", "Copy Path to Clipboard"),
+            self._copyToClipboard,
+        )
         self.menu.addSeparator()
         self.menu.addAction(self.showHiddenFilesAct)
         self.menu.addSeparator()
         self.menu.addMenu(self.__newMenu)
         self.menu.addAction(
-            QCoreApplication.translate('Browser', 'Delete'),
-            self._deleteFileOrDirectory)
-        
+            QCoreApplication.translate("Browser", "Delete"), self._deleteFileOrDirectory
+        )
+
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         self.multiMenu.addAction(
-            QCoreApplication.translate('Browser', 'Open'), self._openItem)
+            QCoreApplication.translate("Browser", "Open"), self._openItem
+        )
         self.multiMenu.addSeparator()
         self.multiMenu.addAction(self.showHiddenFilesAct)
         self.multiMenu.addSeparator()
         self.multiMenu.addAction(
-            QCoreApplication.translate('Browser', 'Delete'),
-            self.__deleteMultiple)
-        
+            QCoreApplication.translate("Browser", "Delete"), self.__deleteMultiple
+        )
+
         # create the directory menu
         self.dirMenu = QMenu(self)
         self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'New toplevel directory...'),
-            self.__newToplevelDir)
+            QCoreApplication.translate("Browser", "New toplevel directory..."),
+            self.__newToplevelDir,
+        )
         self.addAsTopLevelAct = self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Add as toplevel directory'),
-            self.__addAsToplevelDir)
+            QCoreApplication.translate("Browser", "Add as toplevel directory"),
+            self.__addAsToplevelDir,
+        )
         self.removeFromToplevelAct = self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Remove from toplevel'),
-            self.__removeToplevel)
+            QCoreApplication.translate("Browser", "Remove from toplevel"),
+            self.__removeToplevel,
+        )
         self.dirMenu.addSeparator()
         self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Refresh directory'),
-            self.__refreshDirectory)
+            QCoreApplication.translate("Browser", "Refresh directory"),
+            self.__refreshDirectory,
+        )
         self.dirMenu.addSeparator()
         self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Find in this directory'),
-            self.__findInDirectory)
+            QCoreApplication.translate("Browser", "Find in this directory"),
+            self.__findInDirectory,
+        )
         self.dirMenu.addAction(
-            QCoreApplication.translate(
-                'Browser', 'Find && Replace in this directory'),
-            self.__replaceInDirectory)
+            QCoreApplication.translate("Browser", "Find && Replace in this directory"),
+            self.__replaceInDirectory,
+        )
         self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Copy Path to Clipboard'),
-            self._copyToClipboard)
+            QCoreApplication.translate("Browser", "Copy Path to Clipboard"),
+            self._copyToClipboard,
+        )
         self.dirMenu.addSeparator()
         self.dirMenu.addAction(self.showHiddenFilesAct)
         self.dirMenu.addSeparator()
         self.dirMenu.addMenu(self.__newMenu)
         self.dirMenu.addAction(
-            QCoreApplication.translate('Browser', 'Delete'),
-            self._deleteFileOrDirectory)
-        
+            QCoreApplication.translate("Browser", "Delete"), self._deleteFileOrDirectory
+        )
+
         # create the attribute menu
-        self.gotoMenu = QMenu(QCoreApplication.translate('Browser', "Goto"),
-                              self)
+        self.gotoMenu = QMenu(QCoreApplication.translate("Browser", "Goto"), self)
         self.gotoMenu.aboutToShow.connect(self._showGotoMenu)
         self.gotoMenu.triggered.connect(self._gotoAttribute)
-        
+
         self.attributeMenu = QMenu(self)
         self.attributeMenu.addAction(
-            QCoreApplication.translate('Browser', 'New toplevel directory...'),
-            self.__newToplevelDir)
+            QCoreApplication.translate("Browser", "New toplevel directory..."),
+            self.__newToplevelDir,
+        )
         self.attributeMenu.addSeparator()
         self.attributeMenu.addMenu(self.gotoMenu)
-        
+
         # create the background menu
         self.backMenu = QMenu(self)
         self.backMenu.addAction(
-            QCoreApplication.translate('Browser', 'New toplevel directory...'),
-            self.__newToplevelDir)
+            QCoreApplication.translate("Browser", "New toplevel directory..."),
+            self.__newToplevelDir,
+        )
         self.backMenu.addSeparator()
         self.backMenu.addAction(self.showHiddenFilesAct)
 
     def mouseDoubleClickEvent(self, mouseEvent):
         """
         Protected method of QAbstractItemView.
-        
+
         Reimplemented to disable expanding/collapsing of items when
         double-clicking. Instead the double-clicked entry is opened.
-        
+
         @param mouseEvent the mouse event (QMouseEvent)
         """
         index = self.indexAt(mouseEvent.position().toPoint())
         if index.isValid():
             itm = self.model().item(index)
-            if isinstance(itm, (
-                    BrowserDirectoryItem, BrowserImportsItem,
-                    ProjectBrowserSimpleDirectoryItem, BrowserSysPathItem,
-                    BrowserGlobalsItem)):
+            if isinstance(
+                itm,
+                (
+                    BrowserDirectoryItem,
+                    BrowserImportsItem,
+                    ProjectBrowserSimpleDirectoryItem,
+                    BrowserSysPathItem,
+                    BrowserGlobalsItem,
+                ),
+            ):
                 self.setExpanded(index, not self.isExpanded(index))
             else:
                 self._openItem()
@@ -373,32 +414,32 @@
     def _contextMenuRequested(self, coord):
         """
         Protected slot to show the context menu of the listview.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         categories = self.getSelectedItemsCountCategorized(
-            [BrowserDirectoryItem, BrowserFileItem,
-             BrowserClassItem, BrowserMethodItem])
+            [BrowserDirectoryItem, BrowserFileItem, BrowserClassItem, BrowserMethodItem]
+        )
         cnt = categories["sum"]
         bfcnt = categories[str(BrowserFileItem)]
         if cnt > 1 and cnt == bfcnt:
             self.multiMenu.popup(self.mapToGlobal(coord))
         else:
             index = self.indexAt(coord)
-            
+
             if index.isValid():
                 self.setCurrentIndex(index)
                 flags = (
-                    QItemSelectionModel.SelectionFlag.ClearAndSelect |
-                    QItemSelectionModel.SelectionFlag.Rows
+                    QItemSelectionModel.SelectionFlag.ClearAndSelect
+                    | QItemSelectionModel.SelectionFlag.Rows
                 )
                 self.selectionModel().select(index, flags)
-                
+
                 itm = self.model().item(index)
                 coord = self.mapToGlobal(coord)
                 if isinstance(itm, BrowserFileItem):
                     if itm.isPython3File():
-                        if itm.fileName().endswith('.py'):
+                        if itm.fileName().endswith(".py"):
                             self.testingAct.setEnabled(True)
                         else:
                             self.testingAct.setEnabled(False)
@@ -408,8 +449,7 @@
                         self.openInEditorAct.setVisible(itm.isSvgFile())
                         self.menu.popup(coord)
                 elif isinstance(
-                    itm,
-                    (BrowserClassItem, BrowserMethodItem, BrowserImportItem)
+                    itm, (BrowserClassItem, BrowserMethodItem, BrowserImportItem)
                 ):
                     self.editPixmapAct.setVisible(False)
                     self.menu.popup(coord)
@@ -427,69 +467,72 @@
                     self.backMenu.popup(coord)
             else:
                 self.backMenu.popup(self.mapToGlobal(coord))
-        
+
     def _showGotoMenu(self):
         """
         Protected slot to prepare the goto submenu of the attribute menu.
         """
         self.gotoMenu.clear()
-        
+
         itm = self.model().item(self.currentIndex())
         linenos = itm.linenos()
         fileName = itm.fileName()
-        
+
         for lineno in sorted(linenos):
             act = self.gotoMenu.addAction(
-                QCoreApplication.translate(
-                    'Browser', "Line {0}").format(lineno))
+                QCoreApplication.translate("Browser", "Line {0}").format(lineno)
+            )
             act.setData([fileName, lineno])
-        
+
     def _gotoAttribute(self, act):
         """
         Protected slot to handle the selection of the goto menu.
-        
+
         @param act reference to the action (EricAction)
         """
         fileName, lineno = act.data()
         self.sourceFile[str, int].emit(fileName, lineno)
-        
+
     def handlePreferencesChanged(self):
         """
         Public slot used to handle the preferencesChanged signal.
         """
         self.model().preferencesChanged()
         self._resort()
-        
+
     def _openItem(self):
         """
         Protected slot to handle the open popup menu entry.
         """
         itmList = self.getSelectedItems(
-            [BrowserFileItem, BrowserClassItem,
-             BrowserMethodItem, BrowserClassAttributeItem,
-             BrowserImportItem])
-        
+            [
+                BrowserFileItem,
+                BrowserClassItem,
+                BrowserMethodItem,
+                BrowserClassAttributeItem,
+                BrowserImportItem,
+            ]
+        )
+
         if not self._activating:
             self._activating = True
             for itm in itmList:
                 if isinstance(itm, BrowserFileItem):
                     if (
-                        itm.isPython3File() or
-                        itm.isIdlFile() or
-                        itm.isProtobufFile() or
-                        itm.isResourcesFile()
+                        itm.isPython3File()
+                        or itm.isIdlFile()
+                        or itm.isProtobufFile()
+                        or itm.isResourcesFile()
                     ):
                         self.sourceFile[str].emit(itm.fileName())
                     elif itm.isRubyFile():
-                        self.sourceFile[str, int, str].emit(
-                            itm.fileName(), -1, "Ruby")
+                        self.sourceFile[str, int, str].emit(itm.fileName(), -1, "Ruby")
                     elif itm.isDFile():
-                        self.sourceFile[str, int, str].emit(
-                            itm.fileName(), -1, "D")
+                        self.sourceFile[str, int, str].emit(itm.fileName(), -1, "D")
                     elif itm.isDesignerFile():
                         self.designerFile.emit(itm.fileName())
                     elif itm.isLinguistFile():
-                        if itm.fileExt() == '.ts':
+                        if itm.fileExt() == ".ts":
                             self.linguistFile.emit(itm.fileName())
                         else:
                             self.trpreview.emit([itm.fileName()])
@@ -510,69 +553,77 @@
                             QDesktopServices.openUrl(QUrl(itm.fileName()))
                 elif isinstance(itm, BrowserClassItem):
                     self.sourceFile[str, int].emit(
-                        itm.fileName(), itm.classObject().lineno)
+                        itm.fileName(), itm.classObject().lineno
+                    )
                 elif isinstance(itm, BrowserMethodItem):
                     self.sourceFile[str, int].emit(
-                        itm.fileName(), itm.functionObject().lineno)
+                        itm.fileName(), itm.functionObject().lineno
+                    )
                 elif isinstance(itm, BrowserClassAttributeItem):
                     self.sourceFile[str, int].emit(
-                        itm.fileName(), itm.attributeObject().lineno)
+                        itm.fileName(), itm.attributeObject().lineno
+                    )
                 elif isinstance(itm, BrowserImportItem):
-                    self.sourceFile[str, list].emit(
-                        itm.fileName(), itm.linenos())
+                    self.sourceFile[str, list].emit(itm.fileName(), itm.linenos())
             self._activating = False
-        
+
     def __showMimeType(self):
         """
         Private slot to show the mime type of the selected entry.
         """
         itmList = self.getSelectedItems(
-            [BrowserFileItem, BrowserClassItem,
-             BrowserMethodItem, BrowserClassAttributeItem,
-             BrowserImportItem])
+            [
+                BrowserFileItem,
+                BrowserClassItem,
+                BrowserMethodItem,
+                BrowserClassAttributeItem,
+                BrowserImportItem,
+            ]
+        )
         if itmList:
             mimetype = Utilities.MimeTypes.mimeType(itmList[0].fileName())
             if mimetype is None:
                 EricMessageBox.warning(
                     self,
-                    QCoreApplication.translate('Browser', "Show Mime-Type"),
+                    QCoreApplication.translate("Browser", "Show Mime-Type"),
                     QCoreApplication.translate(
-                        'Browser',
-                        """The mime type of the file could not be"""
-                        """ determined."""))
+                        "Browser",
+                        """The mime type of the file could not be""" """ determined.""",
+                    ),
+                )
             elif mimetype.split("/")[0] == "text":
                 EricMessageBox.information(
                     self,
-                    QCoreApplication.translate('Browser', "Show Mime-Type"),
+                    QCoreApplication.translate("Browser", "Show Mime-Type"),
                     QCoreApplication.translate(
-                        'Browser',
-                        """The file has the mime type <b>{0}</b>.""")
-                    .format(mimetype))
+                        "Browser", """The file has the mime type <b>{0}</b>."""
+                    ).format(mimetype),
+                )
             else:
                 textMimeTypesList = Preferences.getUI("TextMimeTypes")
                 if mimetype in textMimeTypesList:
                     EricMessageBox.information(
                         self,
-                        QCoreApplication.translate(
-                            'Browser', "Show Mime-Type"),
+                        QCoreApplication.translate("Browser", "Show Mime-Type"),
                         QCoreApplication.translate(
-                            'Browser',
-                            """The file has the mime type <b>{0}</b>.""")
-                        .format(mimetype))
+                            "Browser", """The file has the mime type <b>{0}</b>."""
+                        ).format(mimetype),
+                    )
                 else:
                     ok = EricMessageBox.yesNo(
                         self,
+                        QCoreApplication.translate("Browser", "Show Mime-Type"),
                         QCoreApplication.translate(
-                            'Browser', "Show Mime-Type"),
-                        QCoreApplication.translate(
-                            'Browser',
+                            "Browser",
                             """The file has the mime type <b>{0}</b>."""
                             """<br/> Shall it be added to the list of"""
-                            """ text mime types?""").format(mimetype))
+                            """ text mime types?""",
+                        ).format(mimetype),
+                    )
                     if ok:
                         textMimeTypesList.append(mimetype)
                         Preferences.setUI("TextMimeTypes", textMimeTypesList)
-    
+
     def __refreshSource(self):
         """
         Private slot to refresh the structure of a source file.
@@ -580,37 +631,37 @@
         itmList = self.getSelectedItems([BrowserFileItem])
         if itmList:
             self.__model.repopulateFileItem(itmList[0])
-    
+
     def _editPixmap(self):
         """
         Protected slot to handle the open in icon editor popup menu entry.
         """
         itmList = self.getSelectedItems([BrowserFileItem])
-        
+
         for itm in itmList:
             if isinstance(itm, BrowserFileItem) and itm.isPixmapFile():
                 self.pixmapEditFile.emit(itm.fileName())
-        
+
     def _openHexEditor(self):
         """
         Protected slot to handle the open in hex editor popup menu entry.
         """
         itmList = self.getSelectedItems([BrowserFileItem])
-        
+
         for itm in itmList:
             if isinstance(itm, BrowserFileItem):
                 self.binaryFile.emit(itm.fileName())
-    
+
     def _openFileInEditor(self):
         """
         Protected slot to handle the Open in Editor menu action.
         """
         itmList = self.getSelectedItems([BrowserFileItem])
-        
+
         for itm in itmList:
             if Utilities.MimeTypes.isTextFile(itm.fileName()):
                 self.sourceFile.emit(itm.fileName())
-        
+
     def _copyToClipboard(self):
         """
         Protected method to copy the text shown for an entry to the clipboard.
@@ -623,23 +674,23 @@
                 fn = itm.dirName()
             except AttributeError:
                 fn = ""
-        
+
         if fn:
             cb = QApplication.clipboard()
             cb.setText(fn)
-    
+
     @pyqtSlot(bool)
     def _showHidden(self, checked):
         """
         Protected slot to show or hide hidden files.
-        
+
         @param checked flag indicating the state of the action
         @type bool
         """
         self.__sortModel.setShowHiddenFiles(checked)
         # remember the current state
         Preferences.setUI("BrowsersListHiddenFiles", checked)
-    
+
     def handleTesting(self):
         """
         Public slot to handle the testing popup menu entry.
@@ -653,20 +704,21 @@
 
         if pyfn is not None:
             self.testFile.emit(pyfn)
-        
+
     def __newToplevelDir(self):
         """
         Private slot to handle the New toplevel directory popup menu entry.
         """
         dname = EricFileDialog.getExistingDirectory(
             None,
-            QCoreApplication.translate('Browser', "New toplevel directory"),
+            QCoreApplication.translate("Browser", "New toplevel directory"),
             "",
-            EricFileDialog.ShowDirsOnly)
+            EricFileDialog.ShowDirsOnly,
+        )
         if dname:
             dname = os.path.abspath(Utilities.toNativeSeparators(dname))
             self.__model.addTopLevelDir(dname)
-        
+
     def __removeToplevel(self):
         """
         Private slot to handle the Remove from toplevel popup menu entry.
@@ -674,7 +726,7 @@
         index = self.currentIndex()
         sindex = self.model().mapToSource(index)
         self.__model.removeToplevelDir(sindex)
-        
+
     def __addAsToplevelDir(self):
         """
         Private slot to handle the Add as toplevel directory popup menu entry.
@@ -682,7 +734,7 @@
         index = self.currentIndex()
         dname = self.model().item(index).dirName()
         self.__model.addTopLevelDir(dname)
-        
+
     def __refreshDirectory(self):
         """
         Private slot to refresh a directory entry.
@@ -690,60 +742,58 @@
         index = self.currentIndex()
         refreshDir = self.model().item(index).dirName()
         self.__model.directoryChanged(refreshDir)
-        
+
     def __findInDirectory(self):
         """
         Private slot to handle the Find in directory popup menu entry.
         """
         index = self.currentIndex()
         searchDir = self.model().item(index).dirName()
-        
-        ericApp().getObject("UserInterface").showFindFilesWidget(
-            searchDir=searchDir)
-        
+
+        ericApp().getObject("UserInterface").showFindFilesWidget(searchDir=searchDir)
+
     def __replaceInDirectory(self):
         """
         Private slot to handle the Find&Replace in directory popup menu entry.
         """
         index = self.currentIndex()
         searchDir = self.model().item(index).dirName()
-        
-        ericApp().getObject("UserInterface").showReplaceFilesWidget(
-            searchDir=searchDir)
-        
+
+        ericApp().getObject("UserInterface").showReplaceFilesWidget(searchDir=searchDir)
+
     def handleProgramChange(self, fn):
         """
         Public slot to handle the programChange signal.
-        
+
         @param fn file name (string)
         """
         self.__model.programChange(os.path.dirname(fn))
-        
+
     def handleInterpreterChanged(self, interpreter):
         """
         Public slot to handle a change of the debug client's interpreter.
-        
+
         @param interpreter interpreter of the debug client (string)
         """
         self.__model.interpreterChanged(interpreter)
-        
+
     def wantedItem(self, itm, filterList=None):
         """
         Public method to check type of an item.
-        
+
         @param itm the item to check (BrowserItem)
         @param filterList list of classes to check against
         @return flag indicating item is a valid type (boolean)
         """
         if filterList is None:
             filterList = self.selectedItemsFilter
-        
+
         return any(isinstance(itm, typ) for typ in filterList)
-    
+
     def getSelectedItems(self, filterList=None):
         """
         Public method to get the selected items.
-        
+
         @param filterList list of classes to check against
         @return list of selected items (list of BrowserItem)
         """
@@ -755,11 +805,11 @@
                 if self.wantedItem(itm, filterList):
                     selectedItems.append(itm)
         return selectedItems
-        
+
     def getSelectedItemsCount(self, filterList=None):
         """
         Public method to get the count of items selected.
-        
+
         @param filterList list of classes to check against
         @return count of items selected (integer)
         """
@@ -771,11 +821,11 @@
                 if self.wantedItem(itm, filterList):
                     count += 1
         return count
-        
+
     def getSelectedItemsCountCategorized(self, filterList=None):
         """
         Public method to get a categorized count of selected items.
-        
+
         @param filterList list of classes to check against
         @return a dictionary containing the counts of items belonging
             to the individual filter classes. The keys of the dictionary
@@ -790,7 +840,7 @@
         categories["sum"] = 0
         for typ in filterList:
             categories[str(typ)] = 0
-        
+
         indexes = self.selectedIndexes()
         for index in indexes:
             if index.column() == 0:
@@ -799,75 +849,74 @@
                     if isinstance(itm, typ):
                         categories["sum"] += 1
                         categories[str(typ)] += 1
-        
+
         return categories
-        
+
     def saveToplevelDirs(self):
         """
         Public slot to save the toplevel directories.
         """
         self.__model.saveToplevelDirs()
-    
+
     def keyboardSearch(self, search):
         """
         Public function to search the tree via the keyboard.
-        
+
         @param search the character entered via the keyboard
         @type str
         """
         if self.model().rowCount() == 0:
             return
-        
+
         startIndex = (
             self.currentIndex()
-            if self.currentIndex().isValid() else
-            self.model().index(0, 0)
+            if self.currentIndex().isValid()
+            else self.model().index(0, 0)
         )
-        
+
         keyboardSearchTimeWasValid = self._keyboardSearchTimer.isValid()
         keyboardSearchTimeElapsed = self._keyboardSearchTimer.restart()
         if (
-            not search or
-            not keyboardSearchTimeWasValid or
-            keyboardSearchTimeElapsed >
-                QApplication.keyboardInputInterval()
+            not search
+            or not keyboardSearchTimeWasValid
+            or keyboardSearchTimeElapsed > QApplication.keyboardInputInterval()
         ):
             self._keyboardSearchString = search.lower()
         else:
             self._keyboardSearchString += search.lower()
-        
+
         index = startIndex
         found = False
         while True:
             name = self.model().data(index)
-            if (
-                name.lower().startswith(self._keyboardSearchString) and
-                self._keyboardSearchType(self.model().item(index))
-            ):
+            if name.lower().startswith(
+                self._keyboardSearchString
+            ) and self._keyboardSearchType(self.model().item(index)):
                 found = True
                 break
-            
+
             index = self.indexBelow(index)
             if not index.isValid():
                 index = self.model().index(0, 0)
             if index == startIndex:
                 break
-        
+
         if found:
             self.setCurrentIndex(index)
-    
+
     def _keyboardSearchType(self, item):
         """
         Protected method to check, if the item is of the correct type.
-        
+
         @param item reference to the item
         @type BrowserItem
         @return flag indicating a correct type
         @rtype bool
         """
         return isinstance(
-            item, (BrowserDirectoryItem, BrowserFileItem, BrowserSysPathItem))
-    
+            item, (BrowserDirectoryItem, BrowserFileItem, BrowserSysPathItem)
+        )
+
     @pyqtSlot()
     def _newDirectory(self):
         """
@@ -880,16 +929,19 @@
                 self,
                 self.tr("New Directory"),
                 self.tr("Name for new directory:"),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and bool(newName):
                 dirpath = os.path.join(dname, newName)
                 if os.path.exists(dirpath):
                     EricMessageBox.warning(
                         self,
                         self.tr("New Directory"),
-                        self.tr("A file or directory named <b>{0}</b> exists"
-                                " already. Aborting...")
-                        .format(newName))
+                        self.tr(
+                            "A file or directory named <b>{0}</b> exists"
+                            " already. Aborting..."
+                        ).format(newName),
+                    )
                 else:
                     try:
                         os.mkdir(dirpath, mode=0o751)
@@ -897,10 +949,12 @@
                         EricMessageBox.critical(
                             self,
                             self.tr("New Directory"),
-                            self.tr("<p>The directory <b>{0}</b> could not be"
-                                    " created.</p><p>Reason: {1}</p>")
-                            .format(newName, str(err)))
-    
+                            self.tr(
+                                "<p>The directory <b>{0}</b> could not be"
+                                " created.</p><p>Reason: {1}</p>"
+                            ).format(newName, str(err)),
+                        )
+
     @pyqtSlot()
     def _newFile(self):
         """
@@ -913,16 +967,19 @@
                 self,
                 self.tr("New File"),
                 self.tr("Name for new file:"),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if ok and bool(fname):
                 filepath = os.path.join(dname, fname)
                 if os.path.exists(filepath):
                     EricMessageBox.warning(
                         self,
                         self.tr("New File"),
-                        self.tr("A file or directory named <b>{0}</b> exists"
-                                " already. Aborting...")
-                        .format(fname))
+                        self.tr(
+                            "A file or directory named <b>{0}</b> exists"
+                            " already. Aborting..."
+                        ).format(fname),
+                    )
                 else:
                     try:
                         with open(filepath, "w"):
@@ -931,10 +988,12 @@
                         EricMessageBox.critical(
                             self,
                             self.tr("New File"),
-                            self.tr("<p>The file <b>{0}</b> could not be"
-                                    " created.</p><p>Reason: {1}</p>")
-                            .format(fname, str(err)))
-    
+                            self.tr(
+                                "<p>The file <b>{0}</b> could not be"
+                                " created.</p><p>Reason: {1}</p>"
+                            ).format(fname, str(err)),
+                        )
+
     @pyqtSlot()
     def _deleteFileOrDirectory(self):
         """
@@ -947,30 +1006,27 @@
                 self.__deleteDirectory(itm.dirName())
             else:
                 self.__deleteFile(itm.fileName())
-    
+
     def __deleteFile(self, fn):
         """
         Private method to delete a file.
-        
+
         @param fn filename to be deleted
         @type str
         """
         try:
             from send2trash import send2trash as s2t
-            trashMsg = self.tr("Do you really want to move this file to the"
-                               " trash?")
+
+            trashMsg = self.tr("Do you really want to move this file to the" " trash?")
         except ImportError:
             s2t = os.remove
             trashMsg = self.tr("Do you really want to delete this file?")
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
-            self.parent(),
-            self.tr("Delete File"),
-            trashMsg,
-            [fn])
+            self.parent(), self.tr("Delete File"), trashMsg, [fn]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             try:
                 s2t(fn)
@@ -980,34 +1036,33 @@
                     self.tr("Delete File"),
                     self.tr(
                         "<p>The selected file <b>{0}</b> could not be"
-                        " deleted.</p><p>Reason: {1}</p>")
-                    .format(fn, str(err))
+                        " deleted.</p><p>Reason: {1}</p>"
+                    ).format(fn, str(err)),
                 )
-    
+
     def __deleteDirectory(self, dn):
         """
         Private method to delete a directory.
-        
+
         @param dn directory name to be removed from the project
         @type str
         """
         try:
             from send2trash import send2trash
+
             s2tAvailable = True
-            trashMsg = self.tr("Do you really want to move this directory to"
-                               " the trash?")
+            trashMsg = self.tr(
+                "Do you really want to move this directory to" " the trash?"
+            )
         except ImportError:
             s2tAvailable = False
             trashMsg = self.tr("Do you really want to delete this directory?")
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
-            self.parent(),
-            self.tr("Delete Directory"),
-            trashMsg,
-            [dn])
+            self.parent(), self.tr("Delete Directory"), trashMsg, [dn]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             try:
                 if s2tAvailable:
@@ -1020,38 +1075,36 @@
                     self.tr("Delete Directory"),
                     self.tr(
                         "<p>The selected directory <b>{0}</b> could not be"
-                        " deleted.</p><p>Reason: {1}</p>")
-                    .format(dn, str(err))
+                        " deleted.</p><p>Reason: {1}</p>"
+                    ).format(dn, str(err)),
                 )
-    
+
     @pyqtSlot()
     def __deleteMultiple(self):
         """
         Private slot to delete multiple directories and files.
-        
+
         Note: The context menu for multi selection is only shown for file
         items.
         """
         fileNames = []
         for itm in self.getSelectedItems():
             fileNames.append(itm.fileName())
-        
+
         try:
             from send2trash import send2trash as s2t
-            trashMsg = self.tr("Do you really want to move these files to the"
-                               " trash?")
+
+            trashMsg = self.tr(
+                "Do you really want to move these files to the" " trash?"
+            )
         except ImportError:
             s2t = os.remove
             trashMsg = self.tr("Do you really want to delete these files?")
-        
-        from UI.DeleteFilesConfirmationDialog import (
-            DeleteFilesConfirmationDialog
-        )
+
+        from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
         dlg = DeleteFilesConfirmationDialog(
-            self.parent(),
-            self.tr("Delete Files"),
-            trashMsg,
-            sorted(fileNames)
+            self.parent(), self.tr("Delete Files"), trashMsg, sorted(fileNames)
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             for fn in fileNames:
@@ -1063,6 +1116,6 @@
                         self.tr("Delete File"),
                         self.tr(
                             "<p>The selected file <b>{0}</b> could not be"
-                            " deleted.</p><p>Reason: {1}</p>")
-                        .format(fn, str(err))
+                            " deleted.</p><p>Reason: {1}</p>"
+                        ).format(fn, str(err)),
                     )
--- a/src/eric7/UI/BrowserModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/BrowserModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,13 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    QDir, QModelIndex, QAbstractItemModel, QFileSystemWatcher, Qt, QProcess,
-    QCoreApplication
+    QDir,
+    QModelIndex,
+    QAbstractItemModel,
+    QFileSystemWatcher,
+    Qt,
+    QProcess,
+    QCoreApplication,
 )
 from PyQt6.QtGui import QImageReader, QFont
 from PyQt6.QtWidgets import QApplication
@@ -40,66 +45,66 @@
     """
     Class implementing the browser model.
     """
+
     def __init__(self, parent=None, nopopulate=False):
         """
         Constructor
-        
+
         @param parent reference to parent object (QObject)
         @param nopopulate flag indicating to not populate the model
             (boolean)
         """
         super().__init__(parent)
-        
+
         self.progDir = None
-        
+
         self.__sysPathInterpreter = ""
         self.__sysPathItem = None
-        
+
         if not nopopulate:
             self.watchedItems = {}
             self.watchedFileItems = {}
             self.watcher = QFileSystemWatcher(self)
             self.watcher.directoryChanged.connect(self.directoryChanged)
             self.watcher.fileChanged.connect(self.fileChanged)
-            
+
             rootData = QCoreApplication.translate("BrowserModel", "Name")
             self.rootItem = BrowserItem(None, rootData)
-            
+
             self.__populateModel()
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent item (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
-        item = (parent.internalPointer() if parent.isValid()
-                else self.rootItem)
-        
+
+        item = parent.internalPointer() if parent.isValid() else self.rootItem
+
         return item.columnCount() + 1
-    
+
     def data(self, index, role):
         """
         Public method to get data of an item.
-        
+
         @param index index of the data to retrieve (QModelIndex)
         @param role role of data (Qt.ItemDataRole)
         @return requested data
         """
         if not index.isValid():
             return None
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             item = index.internalPointer()
             if index.column() < item.columnCount():
                 return item.data(index.column())
             elif (
-                index.column() == item.columnCount() and
-                index.column() < self.columnCount(self.parent(index))
+                index.column() == item.columnCount()
+                and index.column() < self.columnCount(self.parent(index))
             ):
                 # This is for the case where an item under a multi-column
                 # parent doesn't have a value for all the columns
@@ -113,46 +118,45 @@
                 font = QFont(QApplication.font("QTreeView"))
                 font.setItalic(True)
                 return font
-        
+
         return None
-    
+
     def flags(self, index):
         """
         Public method to get the item flags.
-        
+
         @param index index of the data to retrieve (QModelIndex)
         @return requested flags (Qt.ItemFlags)
         """
         if not index.isValid():
             return Qt.ItemFlag.ItemIsEnabled
-        
+
         return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section number of section to get data for (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role role of data (Qt.ItemDataRole)
         @return requested header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             if section >= self.rootItem.columnCount():
                 return ""
             else:
                 return self.rootItem.data(section)
-        
+
         return None
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number of the new index (integer)
         @param column column number of the new index (integer)
         @param parent index of parent item (QModelIndex)
@@ -160,24 +164,20 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         # The model/view framework considers negative values out-of-bounds,
         # however in python they work when indexing into lists. So make sure
         # we return an invalid index for out-of-bounds row/col
         if (
-            row < 0 or
-            column < 0 or
-            row >= self.rowCount(parent) or
-            column >= self.columnCount(parent)
+            row < 0
+            or column < 0
+            or row >= self.rowCount(parent)
+            or column >= self.columnCount(parent)
         ):
             return QModelIndex()
-        
-        parentItem = (
-            parent.internalPointer()
-            if parent.isValid() else
-            self.rootItem
-        )
-        
+
+        parentItem = parent.internalPointer() if parent.isValid() else self.rootItem
+
         try:
             if not parentItem.isPopulated():
                 self.populateItem(parentItem)
@@ -188,68 +188,68 @@
             return self.createIndex(row, column, childItem)
         else:
             return QModelIndex()
-    
+
     def parent(self, index):
         """
         Public method to get the index of the parent object.
-        
+
         @param index index of the item (QModelIndex)
         @return index of parent item (QModelIndex)
         """
         if not index.isValid():
             return QModelIndex()
-        
+
         childItem = index.internalPointer()
         parentItem = childItem.parent()
-        
+
         if parentItem is None or parentItem == self.rootItem:
             return QModelIndex()
-        
+
         return self.createIndex(parentItem.row(), 0, parentItem)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows.
-        
+
         @param parent index of parent item (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         # Only the first column should have children
         if parent.column() > 0:
             return 0
-        
+
         if not parent.isValid():
             parentItem = self.rootItem
         else:
             parentItem = parent.internalPointer()
-            if not parentItem.isPopulated():    # lazy population
+            if not parentItem.isPopulated():  # lazy population
                 self.populateItem(parentItem)
-        
+
         return parentItem.childCount()
 
     def hasChildren(self, parent=None):
         """
         Public method to check for the presence of child items.
-        
+
         We always return True for normal items in order to do lazy
         population of the tree.
-        
+
         @param parent index of parent item (QModelIndex)
         @return flag indicating the presence of child items (boolean)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         # Only the first column should have children
         if parent.column() > 0:
             return 0
-        
+
         if not parent.isValid():
             return self.rootItem.childCount() > 0
-        
+
         if parent.internalPointer().isLazyPopulated():
             return True
         else:
@@ -262,31 +262,31 @@
         self.beginResetModel()
         self.rootItem.removeChildren()
         self.endResetModel()
-    
+
     def item(self, index):
         """
         Public method to get a reference to an item.
-        
+
         @param index index of the data to retrieve (QModelIndex)
         @return requested item reference (BrowserItem)
         """
         if not index.isValid():
             return None
-        
+
         return index.internalPointer()
-    
+
     def _addWatchedItem(self, itm):
         """
         Protected method to watch an item.
-        
+
         @param itm item to be watched (BrowserDirectoryItem)
         """
         if isinstance(itm, BrowserDirectoryItem):
             dirName = itm.dirName()
             if (
-                dirName != "" and
-                not dirName.startswith("//") and
-                not dirName.startswith("\\\\")
+                dirName != ""
+                and not dirName.startswith("//")
+                and not dirName.startswith("\\\\")
             ):
                 if dirName not in self.watcher.directories():
                     self.watcher.addPath(dirName)
@@ -295,11 +295,11 @@
                         self.watchedItems[dirName].append(itm)
                 else:
                     self.watchedItems[dirName] = [itm]
-    
+
     def _removeWatchedItem(self, itm):
         """
         Protected method to remove a watched item.
-        
+
         @param itm item to be removed (BrowserDirectoryItem)
         """
         if isinstance(itm, BrowserDirectoryItem):
@@ -310,26 +310,26 @@
                 if len(self.watchedItems[dirName]) == 0:
                     del self.watchedItems[dirName]
                     self.watcher.removePath(dirName)
-    
+
     def directoryChanged(self, path):
         """
         Public slot to handle the directoryChanged signal of the watcher.
-        
+
         @param path path of the directory (string)
         """
         if path not in self.watchedItems:
             # just ignore the situation we don't have a reference to the item
             return
-        
+
         dirFilter = QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
-        
+
         for itm in self.watchedItems[path]:
             oldCnt = itm.childCount()
-            
+
             qdir = QDir(itm.dirName())
-            
+
             entryInfoList = qdir.entryInfoList(dirFilter)
-            
+
             # step 1: check for new entries
             children = itm.children()
             for f in entryInfoList:
@@ -342,23 +342,21 @@
                         break
                 if childFound:
                     continue
-                
+
                 cnt = itm.childCount()
-                self.beginInsertRows(
-                    self.createIndex(itm.row(), 0, itm), cnt, cnt)
+                self.beginInsertRows(self.createIndex(itm.row(), 0, itm), cnt, cnt)
                 node = (
                     BrowserDirectoryItem(
-                        itm,
-                        Utilities.toNativeSeparators(f.absoluteFilePath()),
-                        False)
-                    if f.isDir() else
-                    BrowserFileItem(
-                        itm,
-                        Utilities.toNativeSeparators(f.absoluteFilePath()))
+                        itm, Utilities.toNativeSeparators(f.absoluteFilePath()), False
+                    )
+                    if f.isDir()
+                    else BrowserFileItem(
+                        itm, Utilities.toNativeSeparators(f.absoluteFilePath())
+                    )
                 )
                 self._addItem(node, itm)
                 self.endInsertRows()
-            
+
             # step 2: check for removed entries
             if len(entryInfoList) != itm.childCount():
                 for row in range(oldCnt - 1, -1, -1):
@@ -372,36 +370,35 @@
                             break
                     if entryFound:
                         continue
-                    
+
                     self._removeWatchedItem(child)
-                    self.beginRemoveRows(
-                        self.createIndex(itm.row(), 0, itm), row, row)
+                    self.beginRemoveRows(self.createIndex(itm.row(), 0, itm), row, row)
                     itm.removeChild(child)
                     self.endRemoveRows()
-    
+
     def __populateModel(self):
         """
         Private method to populate the browser model.
         """
         self.toplevelDirs = []
-        tdp = Preferences.getSettings().value('BrowserModel/ToplevelDirs')
+        tdp = Preferences.getSettings().value("BrowserModel/ToplevelDirs")
         if tdp:
             self.toplevelDirs = tdp
         else:
-            self.toplevelDirs.append(
-                Utilities.toNativeSeparators(QDir.homePath()))
+            self.toplevelDirs.append(Utilities.toNativeSeparators(QDir.homePath()))
             for d in QDir.drives():
-                self.toplevelDirs.append(Utilities.toNativeSeparators(
-                    d.absoluteFilePath()))
-        
+                self.toplevelDirs.append(
+                    Utilities.toNativeSeparators(d.absoluteFilePath())
+                )
+
         for d in self.toplevelDirs:
             itm = BrowserDirectoryItem(self.rootItem, d)
             self._addItem(itm, self.rootItem)
-    
+
     def interpreterChanged(self, interpreter):
         """
         Public method to handle a change of the debug client's interpreter.
-        
+
         @param interpreter interpreter of the debug client (string)
         """
         if interpreter and "python" in interpreter.lower():
@@ -412,12 +409,14 @@
                 # step 1: remove sys.path entry
                 if self.__sysPathItem is not None:
                     self.beginRemoveRows(
-                        QModelIndex(), self.__sysPathItem.row(),
-                        self.__sysPathItem.row())
+                        QModelIndex(),
+                        self.__sysPathItem.row(),
+                        self.__sysPathItem.row(),
+                    )
                     self.rootItem.removeChild(self.__sysPathItem)
                     self.endRemoveRows()
                     self.__sysPathItem = None
-                
+
                 if self.__sysPathInterpreter:
                     # step 2: add a new one
                     self.__sysPathItem = BrowserSysPathItem(self.rootItem)
@@ -426,97 +425,93 @@
             # remove sys.path entry
             if self.__sysPathItem is not None:
                 self.beginRemoveRows(
-                    QModelIndex(), self.__sysPathItem.row(),
-                    self.__sysPathItem.row())
+                    QModelIndex(), self.__sysPathItem.row(), self.__sysPathItem.row()
+                )
                 self.rootItem.removeChild(self.__sysPathItem)
                 self.endRemoveRows()
                 self.__sysPathItem = None
             self.__sysPathInterpreter = ""
-    
+
     def programChange(self, dirname):
         """
         Public method to change the entry for the directory of file being
         debugged.
-        
+
         @param dirname name of the directory containing the file (string)
         """
         if self.progDir:
             if dirname == self.progDir.dirName():
                 return
-            
+
             # remove old entry
             self._removeWatchedItem(self.progDir)
-            self.beginRemoveRows(
-                QModelIndex(), self.progDir.row(), self.progDir.row())
+            self.beginRemoveRows(QModelIndex(), self.progDir.row(), self.progDir.row())
             self.rootItem.removeChild(self.progDir)
             self.endRemoveRows()
             self.progDir = None
-        
+
         itm = BrowserDirectoryItem(self.rootItem, dirname)
         self.addItem(itm)
         self.progDir = itm
-    
+
     def addTopLevelDir(self, dirname):
         """
         Public method to add a new toplevel directory.
-        
+
         @param dirname name of the new toplevel directory (string)
         """
         if dirname not in self.toplevelDirs:
             itm = BrowserDirectoryItem(self.rootItem, dirname)
             self.addItem(itm)
             self.toplevelDirs.append(itm.dirName())
-    
+
     def removeToplevelDir(self, index):
         """
         Public method to remove a toplevel directory.
-        
+
         @param index index of the toplevel directory to be removed
             (QModelIndex)
         """
         if not index.isValid():
             return
-        
+
         item = index.internalPointer()
         self.beginRemoveRows(index.parent(), index.row(), index.row())
         self.rootItem.removeChild(item)
         self.endRemoveRows()
-        
+
         self.toplevelDirs.remove(item.dirName())
         self._removeWatchedItem(item)
-    
+
     def saveToplevelDirs(self):
         """
         Public slot to save the toplevel directories.
         """
         Preferences.getSettings().setValue(
-            'BrowserModel/ToplevelDirs', self.toplevelDirs)
-    
+            "BrowserModel/ToplevelDirs", self.toplevelDirs
+        )
+
     def _addItem(self, itm, parentItem):
         """
         Protected slot to add an item.
-        
+
         @param itm reference to item to add (BrowserItem)
         @param parentItem reference to item to add to (BrowserItem)
         """
         parentItem.appendChild(itm)
-    
+
     def addItem(self, itm, parent=None):
         """
         Public slot to add an item.
-        
+
         @param itm item to add (BrowserItem)
         @param parent index of parent item (QModelIndex)
         """
         if parent is None:
             parent = QModelIndex()
-        
-        parentItem = (
-            parent.internalPointer()
-            if parent.isValid() else
-            self.rootItem
-        )
-        
+
+        parentItem = parent.internalPointer() if parent.isValid() else self.rootItem
+
         cnt = parentItem.childCount()
         self.beginInsertRows(parent, cnt, cnt)
         self._addItem(itm, parentItem)
@@ -525,7 +520,7 @@
     def populateItem(self, parentItem, repopulate=False):
         """
         Public method to populate an item's subtree.
-        
+
         @param parentItem reference to the item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
@@ -545,39 +540,39 @@
     def populateDirectoryItem(self, parentItem, repopulate=False):
         """
         Public method to populate a directory item's subtree.
-        
+
         @param parentItem reference to the directory item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
         self._addWatchedItem(parentItem)
-        
+
         qdir = QDir(parentItem.dirName())
-        
-        dirFilter = (QDir.Filter.AllEntries |
-                     QDir.Filter.NoDotAndDotDot)
+
+        dirFilter = QDir.Filter.AllEntries | QDir.Filter.NoDotAndDotDot
         entryInfoList = qdir.entryInfoList(dirFilter)
         if len(entryInfoList) > 0:
             if repopulate:
                 self.beginInsertRows(
                     self.createIndex(parentItem.row(), 0, parentItem),
-                    0, len(entryInfoList) - 1)
+                    0,
+                    len(entryInfoList) - 1,
+                )
             for f in entryInfoList:
                 if f.isDir():
                     node = BrowserDirectoryItem(
                         parentItem,
                         Utilities.toNativeSeparators(f.absoluteFilePath()),
-                        False)
+                        False,
+                    )
                 else:
-                    fileFilters = Preferences.getUI(
-                        "BrowsersFileFilters").split(";")
+                    fileFilters = Preferences.getUI("BrowsersFileFilters").split(";")
                     if fileFilters:
                         fn = f.fileName()
-                        if any(fnmatch.fnmatch(fn, ff.strip())
-                               for ff in fileFilters):
+                        if any(fnmatch.fnmatch(fn, ff.strip()) for ff in fileFilters):
                             continue
                     node = BrowserFileItem(
-                        parentItem,
-                        Utilities.toNativeSeparators(f.absoluteFilePath()))
+                        parentItem, Utilities.toNativeSeparators(f.absoluteFilePath())
+                    )
                 self._addItem(node, parentItem)
             if repopulate:
                 self.endInsertRows()
@@ -585,7 +580,7 @@
     def populateSysPathItem(self, parentItem, repopulate=False):
         """
         Public method to populate a sys.path item's subtree.
-        
+
         @param parentItem reference to the sys.path item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
@@ -595,20 +590,24 @@
             proc.start(self.__sysPathInterpreter, ["-c", script])
             finished = proc.waitForFinished(3000)
             if finished:
-                procOutput = str(proc.readAllStandardOutput(),
-                                 Preferences.getSystem("IOEncoding"),
-                                 'replace')
+                procOutput = str(
+                    proc.readAllStandardOutput(),
+                    Preferences.getSystem("IOEncoding"),
+                    "replace",
+                )
                 syspath = [p for p in json.loads(procOutput) if p]
                 if len(syspath) > 0:
                     if repopulate:
                         self.beginInsertRows(
                             self.createIndex(parentItem.row(), 0, parentItem),
-                            0, len(syspath) - 1)
+                            0,
+                            len(syspath) - 1,
+                        )
                     for p in syspath:
                         node = (
                             BrowserDirectoryItem(parentItem, p)
-                            if os.path.isdir(p) else
-                            BrowserFileItem(parentItem, p)
+                            if os.path.isdir(p)
+                            else BrowserFileItem(parentItem, p)
                         )
                         self._addItem(node, parentItem)
                     if repopulate:
@@ -619,33 +618,33 @@
     def populateFileItem(self, parentItem, repopulate=False):
         """
         Public method to populate a file item's subtree.
-        
+
         @param parentItem reference to the file item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
         import Utilities.ClassBrowsers
+
         moduleName = parentItem.moduleName()
         fileName = parentItem.fileName()
         try:
             dictionary = Utilities.ClassBrowsers.readmodule(
-                moduleName, [parentItem.dirName()],
-                parentItem.isPython3File() or parentItem.isCythonFile())
+                moduleName,
+                [parentItem.dirName()],
+                parentItem.isPython3File() or parentItem.isCythonFile(),
+            )
         except ImportError:
             return
-        
+
         keys = list(dictionary.keys())
         if len(keys) > 0:
             if repopulate:
                 last = len(keys) - 1
-                if (
-                    "@@Coding@@" in keys and
-                    not Preferences.getUI("BrowserShowCoding")
-                ):
+                if "@@Coding@@" in keys and not Preferences.getUI("BrowserShowCoding"):
                     last -= 1
                 self.beginInsertRows(
-                    self.createIndex(parentItem.row(), 0, parentItem),
-                    0, last)
-            
+                    self.createIndex(parentItem.row(), 0, parentItem), 0, last
+                )
+
             for key in keys:
                 if key.startswith("@@"):
                     # special treatment done later
@@ -658,20 +657,23 @@
             if "@@Coding@@" in keys and Preferences.getUI("BrowserShowCoding"):
                 node = BrowserCodingItem(
                     parentItem,
-                    QCoreApplication.translate("BrowserModel", "Coding: {0}")
-                    .format(dictionary["@@Coding@@"].coding),
-                    dictionary["@@Coding@@"].linenumber)
+                    QCoreApplication.translate("BrowserModel", "Coding: {0}").format(
+                        dictionary["@@Coding@@"].coding
+                    ),
+                    dictionary["@@Coding@@"].linenumber,
+                )
                 self._addItem(node, parentItem)
             if "@@Globals@@" in keys:
                 node = BrowserGlobalsItem(
                     parentItem,
                     dictionary["@@Globals@@"].globals,
-                    QCoreApplication.translate("BrowserModel", "Globals"))
+                    QCoreApplication.translate("BrowserModel", "Globals"),
+                )
                 self._addItem(node, parentItem)
             if "@@Import@@" in keys or "@@ImportFrom@@" in keys:
                 node = BrowserImportsItem(
-                    parentItem,
-                    QCoreApplication.translate("BrowserModel", "Imports"))
+                    parentItem, QCoreApplication.translate("BrowserModel", "Imports")
+                )
                 self._addItem(node, parentItem)
                 if "@@Import@@" in keys:
                     for importedModule in (
@@ -681,26 +683,29 @@
                             node,
                             importedModule.importedModuleName,
                             importedModule.file,
-                            importedModule.linenos)
+                            importedModule.linenos,
+                        )
                         self._addItem(m_node, node)
-                        for importedName, linenos in (
-                            importedModule.importedNames.items()
-                        ):
+                        for (
+                            importedName,
+                            linenos,
+                        ) in importedModule.importedNames.items():
                             mn_node = BrowserImportItem(
                                 m_node,
                                 importedName,
                                 importedModule.file,
                                 linenos,
-                                isModule=False)
+                                isModule=False,
+                            )
                             self._addItem(mn_node, m_node)
-            
+
             if repopulate:
                 self.endInsertRows()
-        
+
         parentItem._populated = True
         if (
-            parentItem.type_ == BrowserItemFile and
-            fileName not in self.watchedFileItems
+            parentItem.type_ == BrowserItemFile
+            and fileName not in self.watchedFileItems
         ):
             # watch the file only in the file browser not the project viewer
             self.watcher.addPath(fileName)
@@ -709,7 +714,7 @@
     def repopulateFileItem(self, itm):
         """
         Public method to repopulate a file item.
-        
+
         @param itm reference to the item to be repopulated
         @type BrowserFileItem
         """
@@ -717,19 +722,19 @@
             if not itm.isPopulated():
                 # item is not populated yet, nothing to do
                 return
-            
+
             if itm.childCount():
                 index = self.createIndex(itm.row(), 0, itm)
                 self.beginRemoveRows(index, 0, itm.childCount() - 1)
                 itm.removeChildren()
                 self.endRemoveRows()
-            
+
             self.populateFileItem(itm, True)
 
     def fileChanged(self, fileName):
         """
         Public method to react upon file changes.
-        
+
         @param fileName path of the changed file
         @type str
         """
@@ -744,55 +749,56 @@
     def populateClassItem(self, parentItem, repopulate=False):
         """
         Public method to populate a class item's subtree.
-        
+
         @param parentItem reference to the class item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
         cl = parentItem.classObject()
         file_ = parentItem.fileName()
-        
+
         if cl is None:
             return
-        
+
         # build sorted list of names
         keys = []
         for name in list(cl.classes.keys()):
-            keys.append((name, 'c'))
+            keys.append((name, "c"))
         for name in list(cl.methods.keys()):
-            keys.append((name, 'm'))
-        
+            keys.append((name, "m"))
+
         if len(cl.attributes):
             node = BrowserClassAttributesItem(
-                parentItem, cl.attributes,
-                QCoreApplication.translate("BrowserModel", "Attributes"))
+                parentItem,
+                cl.attributes,
+                QCoreApplication.translate("BrowserModel", "Attributes"),
+            )
             if repopulate:
-                self.addItem(
-                    node, self.createIndex(parentItem.row(), 0, parentItem))
+                self.addItem(node, self.createIndex(parentItem.row(), 0, parentItem))
             else:
                 self._addItem(node, parentItem)
-        
+
         if len(cl.globals):
             node = BrowserClassAttributesItem(
-                parentItem, cl.globals,
+                parentItem,
+                cl.globals,
                 QCoreApplication.translate("BrowserModel", "Class Attributes"),
-                True)
+                True,
+            )
             if repopulate:
-                self.addItem(
-                    node, self.createIndex(parentItem.row(), 0, parentItem))
+                self.addItem(node, self.createIndex(parentItem.row(), 0, parentItem))
             else:
                 self._addItem(node, parentItem)
-        
+
         if len(keys) > 0:
             if repopulate:
                 self.beginInsertRows(
-                    self.createIndex(parentItem.row(), 0, parentItem),
-                    0, len(keys) - 1)
+                    self.createIndex(parentItem.row(), 0, parentItem), 0, len(keys) - 1
+                )
             for key, kind in keys:
-                if kind == 'c':
+                if kind == "c":
                     node = BrowserClassItem(parentItem, cl.classes[key], file_)
-                elif kind == 'm':
-                    node = BrowserMethodItem(parentItem, cl.methods[key],
-                                             file_)
+                elif kind == "m":
+                    node = BrowserMethodItem(parentItem, cl.methods[key], file_)
                 self._addItem(node, parentItem)
             if repopulate:
                 self.endInsertRows()
@@ -800,34 +806,33 @@
     def populateMethodItem(self, parentItem, repopulate=False):
         """
         Public method to populate a method item's subtree.
-        
+
         @param parentItem reference to the method item to be populated
         @param repopulate flag indicating a repopulation (boolean)
         """
         fn = parentItem.functionObject()
         file_ = parentItem.fileName()
-        
+
         if fn is None:
             return
-        
+
         # build sorted list of names
         keys = []
         for name in list(fn.classes.keys()):
-            keys.append((name, 'c'))
+            keys.append((name, "c"))
         for name in list(fn.methods.keys()):
-            keys.append((name, 'm'))
-        
+            keys.append((name, "m"))
+
         if len(keys) > 0:
             if repopulate:
                 self.beginInsertRows(
-                    self.createIndex(parentItem.row(), 0, parentItem),
-                    0, len(keys) - 1)
+                    self.createIndex(parentItem.row(), 0, parentItem), 0, len(keys) - 1
+                )
             for key, kind in keys:
-                if kind == 'c':
+                if kind == "c":
                     node = BrowserClassItem(parentItem, fn.classes[key], file_)
-                elif kind == 'm':
-                    node = BrowserMethodItem(parentItem, fn.methods[key],
-                                             file_)
+                elif kind == "m":
+                    node = BrowserMethodItem(parentItem, fn.methods[key], file_)
                 self._addItem(node, parentItem)
             if repopulate:
                 self.endInsertRows()
@@ -835,7 +840,7 @@
     def populateClassAttributesItem(self, parentItem, repopulate=False):
         """
         Public method to populate a class attributes item's subtree.
-        
+
         @param parentItem reference to the class attributes item to be
             populated
         @param repopulate flag indicating a repopulation (boolean)
@@ -844,16 +849,17 @@
         attributes = parentItem.attributes()
         if not attributes:
             return
-        
+
         keys = list(attributes.keys())
         if len(keys) > 0:
             if repopulate:
                 self.beginInsertRows(
-                    self.createIndex(parentItem.row(), 0, parentItem),
-                    0, len(keys) - 1)
+                    self.createIndex(parentItem.row(), 0, parentItem), 0, len(keys) - 1
+                )
             for key in keys:
-                node = BrowserClassAttributeItem(parentItem, attributes[key],
-                                                 classAttributes)
+                node = BrowserClassAttributeItem(
+                    parentItem, attributes[key], classAttributes
+                )
                 self._addItem(node, parentItem)
             if repopulate:
                 self.endInsertRows()
@@ -863,15 +869,16 @@
     """
     Class implementing the data structure for browser items.
     """
+
     def __init__(self, parent, data):
         """
         Constructor
-        
+
         @param parent reference to the parent item
         @param data single data of the item
         """
         self.childItems = []
-        
+
         self.parentItem = parent
         self.itemData = [data]
         self.type_ = BrowserItemRoot
@@ -879,67 +886,67 @@
         self._populated = True
         self._lazyPopulation = False
         self.symlink = False
-    
+
     def appendChild(self, child):
         """
         Public method to add a child to this item.
-        
+
         @param child reference to the child item to add (BrowserItem)
         """
         self.childItems.append(child)
         self._populated = True
-    
+
     def removeChild(self, child):
         """
         Public method to remove a child.
-        
+
         @param child reference to the child to remove (BrowserItem)
         """
         self.childItems.remove(child)
-    
+
     def removeChildren(self):
         """
         Public method to remove all children.
         """
         self.childItems = []
-    
+
     def child(self, row):
         """
         Public method to get a child id.
-        
+
         @param row number of child to get the id of (integer)
         @return reference to the child item (BrowserItem)
         """
         return self.childItems[row]
-    
+
     def children(self):
         """
         Public method to get the ids of all child items.
-        
+
         @return references to all child items (list of BrowserItem)
         """
         return self.childItems[:]
-    
+
     def childCount(self):
         """
         Public method to get the number of available child items.
-        
+
         @return number of child items (integer)
         """
         return len(self.childItems)
-    
+
     def columnCount(self):
         """
         Public method to get the number of available data items.
-        
+
         @return number of data items (integer)
         """
         return len(self.itemData)
-    
+
     def data(self, column):
         """
         Public method to get a specific data item.
-        
+
         @param column number of the requested data item (integer)
         @return stored data item
         """
@@ -947,70 +954,70 @@
             return self.itemData[column]
         except IndexError:
             return ""
-    
+
     def parent(self):
         """
         Public method to get the reference to the parent item.
-        
+
         @return reference to the parent item
         """
         return self.parentItem
-    
+
     def row(self):
         """
         Public method to get the row number of this item.
-        
+
         @return row number (integer)
         """
         try:
             return self.parentItem.childItems.index(self)
         except ValueError:
             return 0
-    
+
     def type(self):
         """
         Public method to get the item type.
-        
+
         @return type of the item
         """
         return self.type_
-    
+
     def isPublic(self):
         """
         Public method returning the public visibility status.
-        
+
         @return flag indicating public visibility (boolean)
         """
         return True
-    
+
     def getIcon(self):
         """
         Public method to get the items icon.
-        
+
         @return the icon (QIcon)
         """
         return self.icon
-    
+
     def isPopulated(self):
         """
         Public method to chek, if this item is populated.
-        
+
         @return population status (boolean)
         """
         return self._populated
-    
+
     def isLazyPopulated(self):
         """
         Public method to check, if this item should be populated lazyly.
-        
+
         @return lazy population flag (boolean)
         """
         return self._lazyPopulation
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
@@ -1020,11 +1027,11 @@
             return self.itemData[column] < other.itemData[column]
         except IndexError:
             return False
-    
+
     def isSymlink(self):
         """
         Public method to check, if the items is a symbolic link.
-        
+
         @return flag indicating a symbolic link (boolean)
         """
         return self.symlink
@@ -1034,10 +1041,11 @@
     """
     Class implementing the data structure for browser directory items.
     """
+
     def __init__(self, parent, dinfo, full=True):
         """
         Constructor
-        
+
         @param parent parent item
         @param dinfo dinfo is the string for the directory (string)
         @param full flag indicating full pathname should be displayed (boolean)
@@ -1045,12 +1053,12 @@
         self._dirName = os.path.abspath(dinfo)
         dn = self._dirName if full else os.path.basename(self._dirName)
         BrowserItem.__init__(self, parent, dn)
-        
+
         self.type_ = BrowserItemDirectory
         if (
-            not Utilities.isDrive(self._dirName) and
-            os.path.lexists(self._dirName) and
-            os.path.islink(self._dirName)
+            not Utilities.isDrive(self._dirName)
+            and os.path.lexists(self._dirName)
+            and os.path.islink(self._dirName)
         ):
             self.symlink = True
             self.icon = UI.PixmapCache.getSymlinkIcon("dirClosed")
@@ -1062,45 +1070,44 @@
     def setName(self, dinfo, full=True):
         """
         Public method to set the directory name.
-        
+
         @param dinfo dinfo is the string for the directory (string)
         @param full flag indicating full pathname should be displayed (boolean)
         """
         self._dirName = os.path.abspath(dinfo)
         dn = self._dirName if full else os.path.basename(self._dirName)
         self.itemData[0] = dn
-    
+
     def dirName(self):
         """
         Public method returning the directory name.
-        
+
         @return directory name (string)
         """
         return self._dirName
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
         return self._dirName
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if (
-            issubclass(other.__class__, BrowserFileItem) and
-            Preferences.getUI("BrowsersListFoldersFirst")
+        if issubclass(other.__class__, BrowserFileItem) and Preferences.getUI(
+            "BrowsersListFoldersFirst"
         ):
             return order == Qt.SortOrder.AscendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1108,23 +1115,24 @@
     """
     Class implementing the data structure for browser sys.path items.
     """
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent parent item
         """
         BrowserItem.__init__(self, parent, "sys.path")
-        
+
         self.type_ = BrowserItemSysPath
         self.icon = UI.PixmapCache.getIcon("filePython")
         self._populated = False
         self._lazyPopulation = True
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
         return "sys.path"
@@ -1134,25 +1142,26 @@
     """
     Class implementing the data structure for browser file items.
     """
+
     def __init__(self, parent, finfo, full=True, sourceLanguage=""):
         """
         Constructor
-        
+
         @param parent parent item
         @param finfo the string for the file (string)
         @param full flag indicating full pathname should be displayed (boolean)
         @param sourceLanguage source code language of the project (string)
         """
         BrowserItem.__init__(self, parent, os.path.basename(finfo))
-        
+
         self.type_ = BrowserItemFile
         self.fileext = os.path.splitext(finfo)[1].lower()
         self._filename = os.path.abspath(finfo)
         self._dirName = os.path.dirname(finfo)
         self.sourceLanguage = sourceLanguage
-        
-        self._moduleName = ''
-        
+
+        self._moduleName = ""
+
         pixName = ""
         if self.isPython3File():
             pixName = "filePython"
@@ -1172,7 +1181,7 @@
         elif self.isDesignerFile():
             pixName = "fileDesigner"
         elif self.isLinguistFile():
-            if self.fileext == '.ts':
+            if self.fileext == ".ts":
                 pixName = "fileLinguist"
             else:
                 pixName = "fileLinguist2"
@@ -1207,241 +1216,235 @@
             pixName = "fileUML"
         else:
             pixName = "fileMisc"
-        
+
         if os.path.lexists(self._filename) and os.path.islink(self._filename):
             self.symlink = True
             self.icon = UI.PixmapCache.getSymlinkIcon(pixName)
         else:
             self.icon = UI.PixmapCache.getIcon(pixName)
-    
+
     def setName(self, finfo, full=True):
         """
         Public method to set the directory name.
-        
+
         @param finfo the string for the file (string)
         @param full flag indicating full pathname should be displayed (boolean)
         """
         self._filename = os.path.abspath(finfo)
         self.itemData[0] = os.path.basename(finfo)
         if (
-            self.isPython3File() or
-            self.isRubyFile() or
-            self.isIdlFile() or
-            self.isProtobufFile()
+            self.isPython3File()
+            or self.isRubyFile()
+            or self.isIdlFile()
+            or self.isProtobufFile()
         ):
             self._dirName = os.path.dirname(finfo)
             self._moduleName = os.path.basename(finfo)
-    
+
     def fileName(self):
         """
         Public method returning the filename.
-        
+
         @return filename (string)
         """
         return self._filename
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
         return self._filename
-    
+
     def fileExt(self):
         """
         Public method returning the file extension.
-        
+
         @return file extension (string)
         """
         return self.fileext
-    
+
     def dirName(self):
         """
         Public method returning the directory name.
-        
+
         @return directory name (string)
         """
         return self._dirName
-    
+
     def moduleName(self):
         """
         Public method returning the module name.
-        
+
         @return module name (string)
         """
         return self._moduleName
-    
+
     def isPython3File(self):
         """
         Public method to check, if this file is a Python3 script.
-        
+
         @return flag indicating a Python3 file
         @rtype bool
         """
-        return (
-            self.fileext in Preferences.getPython("Python3Extensions") or
-            (self.fileext == "" and self.sourceLanguage == "Python3")
+        return self.fileext in Preferences.getPython("Python3Extensions") or (
+            self.fileext == "" and self.sourceLanguage == "Python3"
         )
-    
+
     def isCythonFile(self):
         """
         Public method to check, if this file is a Cython file.
-        
+
         @return flag indicating a Cython file
         @rtype bool
         """
-        return (
-            self.fileext in (".pyx", ".pxd", ".pxi") or
-            (self.fileext == "" and self.sourceLanguage == "Cython")
+        return self.fileext in (".pyx", ".pxd", ".pxi") or (
+            self.fileext == "" and self.sourceLanguage == "Cython"
         )
-    
+
     def isRubyFile(self):
         """
         Public method to check, if this file is a Ruby script.
-        
+
         @return flag indicating a Ruby file
         @rtype bool
         """
-        return (
-            self.fileext == '.rb' or
-            (self.fileext == "" and self.sourceLanguage == "Ruby")
+        return self.fileext == ".rb" or (
+            self.fileext == "" and self.sourceLanguage == "Ruby"
         )
-    
+
     def isDesignerFile(self):
         """
         Public method to check, if this file is a Qt-Designer file.
-        
+
         @return flag indicating a Qt-Designer file
         @rtype bool
         """
-        return self.fileext == '.ui'
-    
+        return self.fileext == ".ui"
+
     def isLinguistFile(self):
         """
         Public method to check, if this file is a Qt-Linguist file.
-        
+
         @return flag indicating a Qt-Linguist file
         @rtype bool
         """
-        return self.fileext in ['.ts', '.qm']
-    
+        return self.fileext in [".ts", ".qm"]
+
     def isResourcesFile(self):
         """
         Public method to check, if this file is a Qt-Resources file.
-        
+
         @return flag indicating a Qt-Resources file
         @rtype bool
         """
-        return self.fileext == '.qrc'
-    
+        return self.fileext == ".qrc"
+
     def isProjectFile(self):
         """
         Public method to check, if this file is an eric project file.
-        
+
         @return flag indicating an eric project file
         @rtype bool
         """
-        return self.fileext in ('.epj', '.e4p')
-    
+        return self.fileext in (".epj", ".e4p")
+
     def isMultiProjectFile(self):
         """
         Public method to check, if this file is an eric multi project file.
-        
+
         @return flag indicating an eric project file
         @rtype bool
         """
-        return self.fileext in ('.emj', '.e4m', '.e5m')
-    
+        return self.fileext in (".emj", ".e4m", ".e5m")
+
     def isIdlFile(self):
         """
         Public method to check, if this file is a CORBA IDL file.
-        
+
         @return flag indicating a CORBA IDL file
         @rtype bool
         """
-        return self.fileext == '.idl'
-    
+        return self.fileext == ".idl"
+
     def isProtobufFile(self):
         """
         Public method to check, if this file is a Google Protocol Buffer file.
-        
+
         @return flag indicating a protobuf file
         @rtype bool
         """
         return self.fileext == ".proto"
-    
+
     def isJavaScriptFile(self):
         """
         Public method to check, if this file is a JavaScript file.
-        
+
         @return flag indicating a JavaScript file
         @rtype bool
         """
-        return self.fileext == '.js'
-    
+        return self.fileext == ".js"
+
     def isPixmapFile(self):
         """
         Public method to check, if this file is a pixmap file.
-        
+
         @return flag indicating a pixmap file
         @rtype bool
         """
         return self.fileext[1:] in QImageReader.supportedImageFormats()
-    
+
     def isSvgFile(self):
         """
         Public method to check, if this file is a SVG file.
-        
+
         @return flag indicating a SVG file
         @rtype bool
         """
-        return self.fileext == '.svg'
-    
+        return self.fileext == ".svg"
+
     def isDFile(self):
         """
         Public method to check, if this file is a D file.
-        
+
         @return flag indicating a D file (boolean)
         """
-        return (
-            self.fileext in ['.d', '.di'] or
-            (self.fileext == "" and self.sourceLanguage == "D")
+        return self.fileext in [".d", ".di"] or (
+            self.fileext == "" and self.sourceLanguage == "D"
         )
-    
+
     def isEricGraphicsFile(self):
         """
         Public method to check, if this is an eric graphics file.
-        
+
         @return flag indicating an eric graphics file
         @rtype bool
         """
-        return self.fileext in ('.egj', '.e5g')
-    
+        return self.fileext in (".egj", ".e5g")
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if (
-            not issubclass(other.__class__, BrowserFileItem) and
-            Preferences.getUI("BrowsersListFoldersFirst")
+        if not issubclass(other.__class__, BrowserFileItem) and Preferences.getUI(
+            "BrowsersListFoldersFirst"
         ):
             return order == Qt.SortOrder.DescendingOrder
-        
+
         if issubclass(other.__class__, BrowserFileItem):
-            sinit = os.path.basename(self._filename).startswith('__init__.py')
-            oinit = os.path.basename(other.fileName()).startswith(
-                '__init__.py')
+            sinit = os.path.basename(self._filename).startswith("__init__.py")
+            oinit = os.path.basename(other.fileName()).startswith("__init__.py")
             if sinit and not oinit:
                 return order == Qt.SortOrder.AscendingOrder
             if not sinit and oinit:
                 return order == Qt.SortOrder.DescendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1449,16 +1452,17 @@
     """
     Class implementing the data structure for browser class items.
     """
+
     def __init__(self, parent, cl, filename):
         """
         Constructor
-        
+
         @param parent parent item
         @param cl Class object to be shown
         @param filename filename of the file defining this class
         """
         name = cl.name
-        if hasattr(cl, 'super') and cl.super:
+        if hasattr(cl, "super") and cl.super:
             supers = []
             for sup in cl.super:
                 try:
@@ -1469,24 +1473,25 @@
                     sname = sup
                 supers.append(sname)
             name += "({0})".format(", ".join(supers))
-        
+
         BrowserItem.__init__(self, parent, name)
-        
+
         self.type_ = BrowserItemClass
         self._name = name
         self._classObject = cl
         self._filename = filename
-        
+
         import Utilities.ClassBrowsers.ClbrBaseClasses
+
         self.isfunction = isinstance(
-            self._classObject,
-            Utilities.ClassBrowsers.ClbrBaseClasses.Function)
+            self._classObject, Utilities.ClassBrowsers.ClbrBaseClasses.Function
+        )
         self.ismodule = isinstance(
-            self._classObject,
-            Utilities.ClassBrowsers.ClbrBaseClasses.Module)
+            self._classObject, Utilities.ClassBrowsers.ClbrBaseClasses.Module
+        )
         self.isenum = isinstance(
-            self._classObject,
-            Utilities.ClassBrowsers.ClbrBaseClasses.Enum)
+            self._classObject, Utilities.ClassBrowsers.ClbrBaseClasses.Enum
+        )
         if self.isfunction:
             if cl.isPrivate():
                 self.icon = UI.PixmapCache.getIcon("method_private")
@@ -1495,14 +1500,16 @@
             else:
                 self.icon = UI.PixmapCache.getIcon("method")
             self.itemData[0] = "{0}({1})".format(
-                name, ", ".join(self._classObject.parameters))
+                name, ", ".join(self._classObject.parameters)
+            )
             if self._classObject.annotation:
                 self.itemData[0] = "{0} {1}".format(
-                    self.itemData[0], self._classObject.annotation)
-            #- if no defaults are wanted
-            #- ....format(name,
-            #-            ", ".join([e.split('=')[0].strip()
-            #-                       for e in self._classObject.parameters]))
+                    self.itemData[0], self._classObject.annotation
+                )
+            # - if no defaults are wanted
+            # - ....format(name,
+            # -            ", ".join([e.split('=')[0].strip()
+            # -                       for e in self._classObject.parameters]))
         elif self.ismodule:
             self.icon = UI.PixmapCache.getIcon("module")
         elif self.isenum:
@@ -1514,86 +1521,79 @@
                 self.icon = UI.PixmapCache.getIcon("class_protected")
             else:
                 self.icon = UI.PixmapCache.getIcon("class")
-        if (
-            self._classObject and
-            (self._classObject.methods or
-             self._classObject.classes or
-             self._classObject.attributes or
-             self._classObject.globals)
+        if self._classObject and (
+            self._classObject.methods
+            or self._classObject.classes
+            or self._classObject.attributes
+            or self._classObject.globals
         ):
             self._populated = False
             self._lazyPopulation = True
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
-        return '{0}@@{1}'.format(self._filename, self.lineno())
-    
+        return "{0}@@{1}".format(self._filename, self.lineno())
+
     def fileName(self):
         """
         Public method returning the filename.
-        
+
         @return filename (string)
         """
         return self._filename
-    
+
     def classObject(self):
         """
         Public method returning the class object.
-        
+
         @return reference to the class object
         """
         return self._classObject
-    
+
     def lineno(self):
         """
         Public method returning the line number defining this object.
-        
+
         @return line number defining the object (integer)
         """
         return self._classObject.lineno
-    
+
     def boundaries(self):
         """
         Public method returning the boundaries of the method definition.
-        
+
         @return tuple with start end end line number (integer, integer)
         """
         return (self._classObject.lineno, self._classObject.endlineno)
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if issubclass(
-            other.__class__,
-            (BrowserCodingItem, BrowserClassAttributesItem)
-        ):
+        if issubclass(other.__class__, (BrowserCodingItem, BrowserClassAttributesItem)):
             return order == Qt.SortOrder.DescendingOrder
-        
-        if (
-            Preferences.getUI("BrowsersListContentsByOccurrence") and
-            column == 0
-        ):
+
+        if Preferences.getUI("BrowsersListContentsByOccurrence") and column == 0:
             if order == Qt.SortOrder.AscendingOrder:
                 return self.lineno() < other.lineno()
             else:
                 return self.lineno() > other.lineno()
-        
+
         return BrowserItem.lessThan(self, other, column, order)
-    
+
     def isPublic(self):
         """
         Public method returning the public visibility status.
-        
+
         @return flag indicating public visibility (boolean)
         """
         return self._classObject.isPublic()
@@ -1603,30 +1603,32 @@
     """
     Class implementing the data structure for browser method items.
     """
+
     def __init__(self, parent, fn, filename):
         """
         Constructor
-        
+
         @param parent parent item
         @param fn Function object to be shown
         @param filename filename of the file defining this class (string)
         """
         name = fn.name
         BrowserItem.__init__(self, parent, name)
-        
+
         import Utilities.ClassBrowsers.ClbrBaseClasses
+
         self.type_ = BrowserItemMethod
         self._name = name
         self._functionObject = fn
         self._filename = filename
         if (
-            self._functionObject.modifier ==
-            Utilities.ClassBrowsers.ClbrBaseClasses.Function.Static
+            self._functionObject.modifier
+            == Utilities.ClassBrowsers.ClbrBaseClasses.Function.Static
         ):
             self.icon = UI.PixmapCache.getIcon("method_static")
         elif (
-            self._functionObject.modifier ==
-            Utilities.ClassBrowsers.ClbrBaseClasses.Function.Class
+            self._functionObject.modifier
+            == Utilities.ClassBrowsers.ClbrBaseClasses.Function.Class
         ):
             self.icon = UI.PixmapCache.getIcon("method_class")
         elif self._functionObject.isPrivate():
@@ -1636,93 +1638,91 @@
         else:
             self.icon = UI.PixmapCache.getIcon("method")
         self.itemData[0] = "{0}({1})".format(
-            name, ", ".join(self._functionObject.parameters))
+            name, ", ".join(self._functionObject.parameters)
+        )
         if self._functionObject.annotation:
             self.itemData[0] = "{0} {1}".format(
-                self.itemData[0], self._functionObject.annotation)
+                self.itemData[0], self._functionObject.annotation
+            )
         # if no defaults are wanted
         # ....format(name,
         #            ", ".join([e.split('=')[0].strip()
         #                       for e in self._functionObject.parameters]))
-        if (
-            self._functionObject and
-            (self._functionObject.methods or self._functionObject.classes)
+        if self._functionObject and (
+            self._functionObject.methods or self._functionObject.classes
         ):
             self._populated = False
             self._lazyPopulation = True
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
-        return '{0}@@{1}'.format(self._filename, self.lineno())
-    
+        return "{0}@@{1}".format(self._filename, self.lineno())
+
     def fileName(self):
         """
         Public method returning the filename.
-        
+
         @return filename (string)
         """
         return self._filename
-    
+
     def functionObject(self):
         """
         Public method returning the function object.
-        
+
         @return reference to the function object
         """
         return self._functionObject
-    
+
     def lineno(self):
         """
         Public method returning the line number defining this object.
-        
+
         @return line number defining the object (integer)
         """
         return self._functionObject.lineno
-    
+
     def boundaries(self):
         """
         Public method returning the boundaries of the method definition.
-        
+
         @return tuple with start end end line number (integer, integer)
         """
         return (self._functionObject.lineno, self._functionObject.endlineno)
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
         if issubclass(other.__class__, BrowserMethodItem):
-            if self._name.startswith('__init__'):
+            if self._name.startswith("__init__"):
                 return order == Qt.SortOrder.AscendingOrder
-            if other._name.startswith('__init__'):
+            if other._name.startswith("__init__"):
                 return order == Qt.SortOrder.DescendingOrder
         elif issubclass(other.__class__, BrowserClassAttributesItem):
             return order == Qt.SortOrder.DescendingOrder
-        
-        if (
-            Preferences.getUI("BrowsersListContentsByOccurrence") and
-            column == 0
-        ):
+
+        if Preferences.getUI("BrowsersListContentsByOccurrence") and column == 0:
             if order == Qt.SortOrder.AscendingOrder:
                 return self.lineno() < other.lineno()
             else:
                 return self.lineno() > other.lineno()
-        
+
         return BrowserItem.lessThan(self, other, column, order)
-    
+
     def isPublic(self):
         """
         Public method returning the public visibility status.
-        
+
         @return flag indicating public visibility (boolean)
         """
         return self._functionObject.isPublic()
@@ -1732,17 +1732,18 @@
     """
     Class implementing the data structure for browser class attributes items.
     """
+
     def __init__(self, parent, attributes, text, isClass=False):
         """
         Constructor
-        
+
         @param parent parent item
         @param attributes list of attributes
         @param text text to be shown by this item (string)
         @param isClass flag indicating class attributes (boolean)
         """
         BrowserItem.__init__(self, parent, text)
-        
+
         self.type_ = BrowserItemAttributes
         self._attributes = attributes.copy()
         self._populated = False
@@ -1752,35 +1753,35 @@
         else:
             self.icon = UI.PixmapCache.getIcon("attributes")
         self.__isClass = isClass
-    
+
     def name(self):
         """
         Public method to return the name of the item.
-        
+
         @return name of the item (string)
         """
-        return '{0}@@{1}'.format(self.parentItem.name(), self.data(0))
-    
+        return "{0}@@{1}".format(self.parentItem.name(), self.data(0))
+
     def attributes(self):
         """
         Public method returning the attribute list.
-        
+
         @return reference to the list of attributes
         """
         return self._attributes
-    
+
     def isClassAttributes(self):
         """
         Public method returning the attributes type.
-        
+
         @return flag indicating class attributes (boolean)
         """
         return self.__isClass
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
@@ -1788,12 +1789,9 @@
         """
         if issubclass(other.__class__, BrowserCodingItem):
             return order == Qt.SortOrder.DescendingOrder
-        elif issubclass(
-            other.__class__,
-            (BrowserClassItem, BrowserMethodItem)
-        ):
+        elif issubclass(other.__class__, (BrowserClassItem, BrowserMethodItem)):
             return order == Qt.SortOrder.AscendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1801,16 +1799,17 @@
     """
     Class implementing the data structure for browser class attribute items.
     """
+
     def __init__(self, parent, attribute, isClass=False):
         """
         Constructor
-        
+
         @param parent parent item
         @param attribute reference to the attribute object
         @param isClass flag indicating a class attribute (boolean)
         """
         BrowserItem.__init__(self, parent, attribute.name)
-        
+
         self.type_ = BrowserItemAttribute
         self._attributeObject = attribute
         self.__public = attribute.isPublic()
@@ -1822,65 +1821,62 @@
             self.icon = UI.PixmapCache.getIcon("attribute_protected")
         else:
             self.icon = UI.PixmapCache.getIcon("attribute")
-    
+
     def isPublic(self):
         """
         Public method returning the public visibility status.
-        
+
         @return flag indicating public visibility (boolean)
         """
         return self.__public
-    
+
     def attributeObject(self):
         """
         Public method returning the class object.
-        
+
         @return reference to the class object
         """
         return self._attributeObject
-    
+
     def fileName(self):
         """
         Public method returning the filename.
-        
+
         @return filename (string)
         """
         return self._attributeObject.file
-    
+
     def lineno(self):
         """
         Public method returning the line number defining this object.
-        
+
         @return line number defining the object (integer)
         """
         return self._attributeObject.lineno
-    
+
     def linenos(self):
         """
         Public method returning the line numbers this object is assigned to.
-        
+
         @return line number the object is assigned to (list of integers)
         """
         return self._attributeObject.linenos[:]
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if (
-            Preferences.getUI("BrowsersListContentsByOccurrence") and
-            column == 0
-        ):
+        if Preferences.getUI("BrowsersListContentsByOccurrence") and column == 0:
             if order == Qt.SortOrder.AscendingOrder:
                 return self.lineno() < other.lineno()
             else:
                 return self.lineno() > other.lineno()
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1888,10 +1884,11 @@
     """
     Class implementing the data structure for browser globals items.
     """
+
     def __init__(self, parent, attributes, text):
         """
         Constructor
-        
+
         @param parent parent item
         @param attributes list of attributes
         @param text text to be shown by this item (string)
@@ -1903,10 +1900,11 @@
     """
     Class implementing the data structure for browser coding items.
     """
+
     def __init__(self, parent, text, linenumber):
         """
         Constructor
-        
+
         @param parent parent item
         @type BrowserItem
         @param text text to be shown by this item
@@ -1915,25 +1913,25 @@
         @type int
         """
         BrowserItem.__init__(self, parent, text)
-        
+
         self.type_ = BrowserItemCoding
         self.icon = UI.PixmapCache.getIcon("textencoding")
-        
+
         self.__lineno = linenumber
-    
+
     def lineno(self):
         """
         Public method returning the line number of the coding line.
-        
+
         @return line number defining the coding line
         @rtype int
         """
         return self.__lineno
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
@@ -1941,10 +1939,10 @@
         """
         if issubclass(
             other.__class__,
-            (BrowserClassItem, BrowserClassAttributesItem, BrowserImportItem)
+            (BrowserClassItem, BrowserClassAttributesItem, BrowserImportItem),
         ):
             return order == Qt.SortOrder.AscendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1952,33 +1950,31 @@
     """
     Class implementing the data structure for browser import items.
     """
+
     def __init__(self, parent, text):
         """
         Constructor
-        
+
         @param parent parent item
         @param text text to be shown by this item (string)
         """
         BrowserItem.__init__(self, parent, text)
-        
+
         self.type_ = BrowserItemImports
         self.icon = UI.PixmapCache.getIcon("imports")
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if issubclass(
-            other.__class__,
-            (BrowserClassItem, BrowserClassAttributesItem)
-        ):
+        if issubclass(other.__class__, (BrowserClassItem, BrowserClassAttributesItem)):
             return order == Qt.SortOrder.AscendingOrder
-        
+
         return BrowserItem.lessThan(self, other, column, order)
 
 
@@ -1987,10 +1983,11 @@
     Class implementing the data structure for browser imported module and
     imported names items.
     """
+
     def __init__(self, parent, text, filename, lineNumbers, isModule=True):
         """
         Constructor
-        
+
         @param parent parent item
         @param text text to be shown by this item (string)
         @param filename name of the file (string)
@@ -1999,56 +1996,53 @@
         @param isModule flag indicating a module item entry (boolean)
         """
         BrowserItem.__init__(self, parent, text)
-        
+
         self.__filename = filename
         self.__linenos = lineNumbers[:]
-        
+
         self.type_ = BrowserItemImport
         if isModule:
             self.icon = UI.PixmapCache.getIcon("importedModule")
         else:
             self.icon = UI.PixmapCache.getIcon("importedName")
-    
+
     def fileName(self):
         """
         Public method returning the filename.
-        
+
         @return filename (string)
         """
         return self.__filename
-    
+
     def lineno(self):
         """
         Public method returning the line number of the first import.
-        
+
         @return line number of the first import (integer)
         """
         return self.__linenos[0]
-    
+
     def linenos(self):
         """
         Public method returning the line numbers of all imports.
-        
+
         @return line numbers of all imports (list of integers)
         """
         return self.__linenos[:]
-    
+
     def lessThan(self, other, column, order):
         """
         Public method to check, if the item is less than the other one.
-        
+
         @param other reference to item to compare against (BrowserItem)
         @param column column number to use for the comparison (integer)
         @param order sort order (Qt.SortOrder) (for special sorting)
         @return true, if this item is less than other (boolean)
         """
-        if (
-            Preferences.getUI("BrowsersListContentsByOccurrence") and
-            column == 0
-        ):
+        if Preferences.getUI("BrowsersListContentsByOccurrence") and column == 0:
             if order == Qt.SortOrder.AscendingOrder:
                 return self.lineno() < other.lineno()
             else:
                 return self.lineno() > other.lineno()
-        
+
         return BrowserItem.lessThan(self, other, column, order)
--- a/src/eric7/UI/BrowserSortFilterProxyModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/BrowserSortFilterProxyModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,21 +20,22 @@
     """
     Class implementing the browser sort filter proxy model.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
         self.hideNonPublic = Preferences.getUI("BrowsersHideNonPublic")
         self.hideHiddenFiles = not Preferences.getUI("BrowsersListHiddenFiles")
-        
+
     def sort(self, column, order):
         """
         Public method to sort the items.
-        
+
         @param column column number to sort on
         @type int
         @param order sort order for the sort
@@ -43,15 +44,15 @@
         self.__sortColumn = column
         self.__sortOrder = order
         super().sort(column, order)
-        
+
     def lessThan(self, left, right):
         """
         Public method used to sort the displayed items.
-        
+
         It implements a special sorting function that takes into account,
         if folders should be shown first, and that __init__ is always the first
         method of a class.
-        
+
         @param left index of left item
         @type QModelIndex
         @param right index of right item
@@ -61,16 +62,16 @@
         """
         le = left.model() and left.model().item(left) or None
         ri = right.model() and right.model().item(right) or None
-        
+
         if le and ri:
             return le.lessThan(ri, self.__sortColumn, self.__sortOrder)
-        
+
         return False
-        
+
     def item(self, index):
         """
         Public method to get a reference to an item.
-        
+
         @param index index of the data to retrieve
         @type QModelIndex
         @return requested item reference
@@ -78,17 +79,17 @@
         """
         if not index.isValid():
             return None
-        
+
         sindex = self.mapToSource(index)
         return self.sourceModel().item(sindex)
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check for the presence of child items.
-        
+
         We always return True for normal items in order to do lazy
         population of the tree.
-        
+
         @param parent index of parent item
         @type QModelIndex
         @return flag indicating the presence of child items
@@ -102,12 +103,12 @@
     def filterAcceptsRow(self, source_row, source_parent):
         """
         Public method to filter rows.
-        
+
         It implements a filter to suppress the display of hidden files and
         directories (i.e. those starting with a '.') and the display of non
         public classes, methods and attributes. These filters are independent
         of each other.
-        
+
         @param source_row row number (in the source model) of item
         @type int
         @param source_parent index of parent item (in the source model)
@@ -126,9 +127,9 @@
                     return not os.path.basename(itm.fileName()).startswith(".")
             elif self.hideNonPublic:
                 return itm.isPublic()
-        
+
         return True
-    
+
     def preferencesChanged(self):
         """
         Public slot called to handle a change of the preferences settings.
@@ -137,11 +138,11 @@
         if self.hideNonPublic != hideNonPublic:
             self.hideNonPublic = hideNonPublic
             self.invalidateFilter()
-    
+
     def setShowHiddenFiles(self, show):
         """
         Public method to set, whether hidden files should be shown.
-        
+
         @param show flag indicating if hidden files (i.e. those starting
             with '.' shall be shown
         @type bool
--- a/src/eric7/UI/ClearPrivateDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/ClearPrivateDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,23 +16,24 @@
     """
     Class implementing a dialog to select which private data to clear.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the data from the dialog.
-        
+
         @return flags indicating which data to clear
             (recent files, recent projects, recent multi projects,
              debug histories, shell histories, test histories,
--- a/src/eric7/UI/CodeDocumentationViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/CodeDocumentationViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,12 +11,20 @@
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QUrl, QTimer
 from PyQt6.QtGui import QCursor
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QSizePolicy,
-    QLineEdit, QTextBrowser, QToolTip
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLabel,
+    QComboBox,
+    QSizePolicy,
+    QLineEdit,
+    QTextBrowser,
+    QToolTip,
 )
 
 from EricWidgets.EricTextEditSearchWidget import (
-    EricTextEditSearchWidget, EricTextEditType
+    EricTextEditSearchWidget,
+    EricTextEditType,
 )
 from EricWidgets.EricApplication import ericApp
 
@@ -25,7 +33,7 @@
 from .CodeDocumentationViewerTemplate import (
     prepareDocumentationViewerHtmlDocument,
     prepareDocumentationViewerHtmlDocWarningDocument,
-    prepareDocumentationViewerHtmlWarningDocument
+    prepareDocumentationViewerHtmlWarningDocument,
 )
 
 
@@ -33,109 +41,109 @@
     """
     Class implementing a rich text documentation viewer.
     """
+
     EmpytDocument_Light = (
-        '''<!DOCTYPE html>\n'''
-        '''<html lang="EN">\n'''
-        '''<head>\n'''
-        '''<style type="text/css">\n'''
-        '''html {background-color: #ffffff;}\n'''
-        '''body {background-color: #ffffff;\n'''
-        '''      color: #000000;\n'''
-        '''      margin: 0px 10px 10px 10px;\n'''
-        '''}\n'''
-        '''</style'''
-        '''</head>\n'''
-        '''<body>\n'''
-        '''</body>\n'''
-        '''</html>'''
+        """<!DOCTYPE html>\n"""
+        """<html lang="EN">\n"""
+        """<head>\n"""
+        """<style type="text/css">\n"""
+        """html {background-color: #ffffff;}\n"""
+        """body {background-color: #ffffff;\n"""
+        """      color: #000000;\n"""
+        """      margin: 0px 10px 10px 10px;\n"""
+        """}\n"""
+        """</style"""
+        """</head>\n"""
+        """<body>\n"""
+        """</body>\n"""
+        """</html>"""
     )
     EmpytDocument_Dark = (
-        '''<!DOCTYPE html>\n'''
-        '''<html lang="EN">\n'''
-        '''<head>\n'''
-        '''<style type="text/css">\n'''
-        '''html {background-color: #262626;}\n'''
-        '''body {background-color: #262626;\n'''
-        '''      color: #ffffff;\n'''
-        '''      margin: 0px 10px 10px 10px;\n'''
-        '''}\n'''
-        '''</style'''
-        '''</head>\n'''
-        '''<body>\n'''
-        '''</body>\n'''
-        '''</html>'''
+        """<!DOCTYPE html>\n"""
+        """<html lang="EN">\n"""
+        """<head>\n"""
+        """<style type="text/css">\n"""
+        """html {background-color: #262626;}\n"""
+        """body {background-color: #262626;\n"""
+        """      color: #ffffff;\n"""
+        """      margin: 0px 10px 10px 10px;\n"""
+        """}\n"""
+        """</style"""
+        """</head>\n"""
+        """<body>\n"""
+        """</body>\n"""
+        """</html>"""
     )
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setObjectName("DocumentationViewerWidget")
-        
+
         self.__verticalLayout = QVBoxLayout(self)
         self.__verticalLayout.setObjectName("verticalLayout")
         self.__verticalLayout.setContentsMargins(0, 0, 0, 0)
-        
+
         try:
             from PyQt6.QtWebEngineCore import QWebEngineSettings
             from PyQt6.QtWebEngineWidgets import QWebEngineView
+
             self.__contents = QWebEngineView(self)
             self.__contents.page().linkHovered.connect(self.__showLink)
             self.__contents.settings().setAttribute(
-                QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled,
-                False)
+                QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled, False
+            )
             self.__viewerType = EricTextEditType.QWEBENGINEVIEW
         except ImportError:
             self.__contents = QTextBrowser(self)
             self.__contents.setOpenExternalLinks(True)
             self.__viewerType = EricTextEditType.QTEXTBROWSER
-        
-        sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred,
-                                 QSizePolicy.Policy.Expanding)
+
+        sizePolicy = QSizePolicy(
+            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding
+        )
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.__contents.sizePolicy().hasHeightForWidth())
+        sizePolicy.setHeightForWidth(self.__contents.sizePolicy().hasHeightForWidth())
         self.__contents.setSizePolicy(sizePolicy)
-        self.__contents.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.NoContextMenu)
+        self.__contents.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
         if self.__viewerType != EricTextEditType.QTEXTBROWSER:
             self.__contents.setUrl(QUrl("about:blank"))
         self.__verticalLayout.addWidget(self.__contents)
-        
+
         self.__searchWidget = EricTextEditSearchWidget(self, False)
         self.__searchWidget.setFocusPolicy(Qt.FocusPolicy.WheelFocus)
         self.__searchWidget.setObjectName("searchWidget")
         self.__verticalLayout.addWidget(self.__searchWidget)
-        
-        self.__searchWidget.attachTextEdit(
-            self.__contents, editType=self.__viewerType)
-    
+
+        self.__searchWidget.attachTextEdit(self.__contents, editType=self.__viewerType)
+
     @pyqtSlot(str)
     def __showLink(self, urlStr):
         """
         Private slot to show the hovered link in a tooltip.
-        
+
         @param urlStr hovered URL
         @type str
         """
         QToolTip.showText(QCursor.pos(), urlStr, self.__contents)
-    
+
     def setHtml(self, html):
         """
         Public method to set the HTML text of the widget.
-        
+
         @param html HTML text to be shown
         @type str
         """
         self.__contents.setEnabled(False)
         self.__contents.setHtml(html)
         self.__contents.setEnabled(True)
-    
+
     def clear(self):
         """
         Public method to clear the shown contents.
@@ -148,100 +156,103 @@
             else:
                 self.__contents.setHtml(self.EmpytDocument_Light)
 
-    
+
 class CodeDocumentationViewer(QWidget):
     """
     Class implementing a widget to show some source code information provided
     by plug-ins.
-    
+
     @signal providerAdded() emitted to indicate the availability of a new
         provider
     @signal providerRemoved() emitted to indicate the removal of a provider
     """
+
     providerAdded = pyqtSignal()
     providerRemoved = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.__setupUi()
-        
+
         self.__ui = parent
-        
+
         self.__providers = {}
         self.__selectedProvider = ""
         self.__disabledProvider = "disabled"
-        
+
         self.__shuttingDown = False
         self.__startingUp = True
-        
+
         self.__lastDocumentation = None
         self.__requestingEditor = None
-        
+
         self.__unregisterTimer = QTimer(self)
-        self.__unregisterTimer.setInterval(30000)   # 30 seconds
+        self.__unregisterTimer.setInterval(30000)  # 30 seconds
         self.__unregisterTimer.setSingleShot(True)
         self.__unregisterTimer.timeout.connect(self.__unregisterTimerTimeout)
         self.__mostRecentlyUnregisteredProvider = None
-    
+
     def __setupUi(self):
         """
         Private method to generate the UI layout.
         """
         self.setObjectName("CodeDocumentationViewer")
-        
+
         self.verticalLayout = QVBoxLayout(self)
         self.verticalLayout.setObjectName("verticalLayout")
         self.verticalLayout.setContentsMargins(3, 3, 3, 3)
-        
+
         # top row 1 of widgets
         self.horizontalLayout1 = QHBoxLayout()
         self.horizontalLayout1.setObjectName("horizontalLayout1")
-        
+
         self.label = QLabel(self)
         self.label.setObjectName("label")
         self.label.setText(self.tr("Code Info Provider:"))
-        self.label.setAlignment(Qt.AlignmentFlag.AlignRight |
-                                Qt.AlignmentFlag.AlignVCenter)
+        self.label.setAlignment(
+            Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter
+        )
         self.horizontalLayout1.addWidget(self.label)
-        
+
         self.providerComboBox = QComboBox(self)
-        sizePolicy = QSizePolicy(
-            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
+        sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
         sizePolicy.setHeightForWidth(
-            self.providerComboBox.sizePolicy().hasHeightForWidth())
+            self.providerComboBox.sizePolicy().hasHeightForWidth()
+        )
         self.providerComboBox.setSizePolicy(sizePolicy)
         self.providerComboBox.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToContents)
+            QComboBox.SizeAdjustPolicy.AdjustToContents
+        )
         self.providerComboBox.setObjectName("providerComboBox")
-        self.providerComboBox.setToolTip(
-            self.tr("Select the code info provider"))
+        self.providerComboBox.setToolTip(self.tr("Select the code info provider"))
         self.providerComboBox.addItem(self.tr("<disabled>"), "disabled")
         self.horizontalLayout1.addWidget(self.providerComboBox)
-        
+
         # top row 2 of widgets
         self.objectLineEdit = QLineEdit(self)
         self.objectLineEdit.setReadOnly(True)
         self.objectLineEdit.setObjectName("objectLineEdit")
-        
+
         self.verticalLayout.addLayout(self.horizontalLayout1)
         self.verticalLayout.addWidget(self.objectLineEdit)
-        
+
         # Rich Text (Web) Documentation Viewer
         self.__viewerWidget = DocumentationViewerWidget(self)
         self.__viewerWidget.setObjectName("__viewerWidget")
         self.verticalLayout.addWidget(self.__viewerWidget)
-        
+
         self.providerComboBox.currentIndexChanged[int].connect(
-            self.on_providerComboBox_currentIndexChanged)
-    
+            self.on_providerComboBox_currentIndexChanged
+        )
+
     def finalizeSetup(self):
         """
         Public method to finalize the setup of the documentation viewer.
@@ -257,12 +268,11 @@
         self.__selectedProvider = provider
         if index == 0:
             self.__showDisabledMessage()
-    
-    def registerProvider(self, providerName, providerDisplay, provider,
-                         supported):
+
+    def registerProvider(self, providerName, providerDisplay, provider, supported):
         """
         Public method register a source docu provider.
-        
+
         @param providerName name of the provider (must be unique)
         @type str
         @param providerDisplay visible name of the provider
@@ -276,73 +286,72 @@
             already registered
         """
         if providerName in self.__providers:
-            raise KeyError(
-                "Provider '{0}' already registered.".format(providerName))
-        
+            raise KeyError("Provider '{0}' already registered.".format(providerName))
+
         self.__providers[providerName] = (provider, supported)
         self.providerComboBox.addItem(providerDisplay, providerName)
-        
+
         self.providerAdded.emit()
-        
+
         if (
-            self.__unregisterTimer.isActive() and
-            providerName == self.__mostRecentlyUnregisteredProvider
+            self.__unregisterTimer.isActive()
+            and providerName == self.__mostRecentlyUnregisteredProvider
         ):
             # this is assumed to be a plug-in reload
             self.__unregisterTimer.stop()
             self.__mostRecentlyUnregisteredProvider = None
             self.__selectProvider(providerName)
-    
+
     def unregisterProvider(self, providerName):
         """
         Public method register a source docu provider.
-        
+
         @param providerName name of the provider (must be unique)
         @type str
         """
         if providerName in self.__providers:
             if providerName == self.__selectedProvider:
                 self.providerComboBox.setCurrentIndex(0)
-                
+
                 # in case this is just a temporary unregistration (< 30s)
                 # e.g. when the plug-in is re-installed or updated
                 self.__mostRecentlyUnregisteredProvider = providerName
                 self.__unregisterTimer.start()
-            
+
             del self.__providers[providerName]
             index = self.providerComboBox.findData(providerName)
             self.providerComboBox.removeItem(index)
-            
+
             self.providerRemoved.emit()
-    
+
     @pyqtSlot()
     def __unregisterTimerTimeout(self):
         """
         Private slot handling the timeout signal of the unregister timer.
         """
         self.__mostRecentlyUnregisteredProvider = None
-    
+
     def isSupportedLanguage(self, language):
         """
         Public method to check, if the given language is supported by the
         selected provider.
-        
+
         @param language editor programming language to check
         @type str
         @return flag indicating the support status
         @rtype bool
         """
         supported = False
-        
+
         if self.__selectedProvider != self.__disabledProvider:
             supported = self.__providers[self.__selectedProvider][1](language)
-        
+
         return supported
-    
+
     def getProviders(self):
         """
         Public method to get a list of providers and their visible strings.
-        
+
         @return list containing the providers and their visible strings
         @rtype list of tuple of (str,str)
         """
@@ -351,13 +360,13 @@
             provider = self.providerComboBox.itemData(index)
             text = self.providerComboBox.itemText(index)
             providers.append((provider, text))
-        
+
         return providers
-    
+
     def showInfo(self, editor):
         """
         Public method to request code documentation data from a provider.
-        
+
         @param editor reference to the editor to request code docu for
         @type Editor
         """
@@ -367,26 +376,27 @@
             # try again one index before
             word = editor.getWord(line, index - 1)
         self.objectLineEdit.setText(word)
-        
+
         if self.__selectedProvider != self.__disabledProvider:
             self.__viewerWidget.clear()
             self.__providers[self.__selectedProvider][0](editor)
-    
-    def documentationReady(self, documentationInfo, isWarning=False,
-                           isDocWarning=False):
+
+    def documentationReady(
+        self, documentationInfo, isWarning=False, isDocWarning=False
+    ):
         """
         Public method to provide the documentation info to the viewer.
-        
+
         If documentationInfo is a dictionary, it should contain these
         (optional) keys and data:
-        
+
         name: the name of the inspected object
         argspec: its arguments specification
         note: A phrase describing the type of object (function or method) and
             the module it belongs to.
         docstring: its documentation string
         typ: its type information
-        
+
         @param documentationInfo dictionary containing the source docu data
         @type dict or str
         @param isWarning flag indicating a warning page
@@ -395,83 +405,86 @@
         @type bool
         """
         self.__ui.activateCodeDocumentationViewer(switchFocus=False)
-        
+
         if not isWarning and not isDocWarning:
             self.__lastDocumentation = documentationInfo
-        
+
         if not documentationInfo:
             if self.__selectedProvider == self.__disabledProvider:
                 self.__showDisabledMessage()
             else:
-                self.documentationReady(self.tr("No documentation available"),
-                                        isDocWarning=True)
+                self.documentationReady(
+                    self.tr("No documentation available"), isDocWarning=True
+                )
         else:
             if isWarning:
-                html = prepareDocumentationViewerHtmlWarningDocument(
-                    documentationInfo)
+                html = prepareDocumentationViewerHtmlWarningDocument(documentationInfo)
             elif isDocWarning:
                 html = prepareDocumentationViewerHtmlDocWarningDocument(
-                    documentationInfo)
+                    documentationInfo
+                )
             elif isinstance(documentationInfo, dict):
-                html = prepareDocumentationViewerHtmlDocument(
-                    documentationInfo)
+                html = prepareDocumentationViewerHtmlDocument(documentationInfo)
             else:
                 html = documentationInfo
             self.__viewerWidget.setHtml(html)
-    
+
     def __showDisabledMessage(self):
         """
         Private method to show a message giving the reason for being disabled.
         """
         if len(self.__providers) == 0:
             self.documentationReady(
-                self.tr("No source code documentation provider has been"
-                        " registered. This function has been disabled."),
-                isWarning=True)
+                self.tr(
+                    "No source code documentation provider has been"
+                    " registered. This function has been disabled."
+                ),
+                isWarning=True,
+            )
         else:
             self.documentationReady(
-                self.tr("This function has been disabled."),
-                isWarning=True)
-    
+                self.tr("This function has been disabled."), isWarning=True
+            )
+
     @pyqtSlot(int)
     def on_providerComboBox_currentIndexChanged(self, index):
         """
         Private slot to handle the selection of a provider.
-        
+
         @param index index of the selected provider
         @type int
         """
         if not self.__shuttingDown and not self.__startingUp:
             self.__viewerWidget.clear()
             self.objectLineEdit.clear()
-            
+
             provider = self.providerComboBox.itemData(index)
             if provider == self.__disabledProvider:
                 self.__showDisabledMessage()
             else:
                 self.__lastDocumentation = None
-            
+
             Preferences.setDocuViewer("Provider", provider)
             self.__selectedProvider = provider
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         self.__shuttingDown = True
         Preferences.setDocuViewer("Provider", self.__selectedProvider)
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         provider = Preferences.getDocuViewer("Provider")
         self.__selectProvider(provider)
-    
+
     def __selectProvider(self, provider):
         """
         Private method to select a provider programmatically.
-        
+
         @param provider name of the provider to be selected
         @type str
         """
--- a/src/eric7/UI/CodeDocumentationViewerTemplate.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/CodeDocumentationViewerTemplate.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,7 +25,7 @@
 def _stylesheet():
     """
     Function to get the stylesheet matching the desktop environment.
-    
+
     @return stylesheet
     @rtype str
     """
@@ -33,18 +33,20 @@
     if not _stylesheetsCache[stylesheetType]:
         # load the stylesheet from file
         stylesheetFilePath = os.path.join(
-            os.path.dirname(__file__), "data",
-            "documentViewerStyle-{0}.css".format(stylesheetType))
+            os.path.dirname(__file__),
+            "data",
+            "documentViewerStyle-{0}.css".format(stylesheetType),
+        )
         with open(stylesheetFilePath, "r") as f:
             _stylesheetsCache[stylesheetType] = f.read()
-    
+
     return _stylesheetsCache[stylesheetType]
 
 
 def prepareDocumentationViewerHtmlDocument(documentationInfo):
     """
     Public function to prepare the HTML document.
-    
+
     @param documentationInfo dictionary containing the various documentation
         parts
     @type dict
@@ -64,16 +66,16 @@
         </body>
         </html>
     """
-    
+
     headerTemplate = """
         @TITLE@
         @METADATA@
     """
-    
+
     titleTemplate = """
         <div class="title"><h1>@NAME@</h1></div>
     """
-    
+
     metadataTemplate = """
         <div class="metadata">
         @ARGSPEC@
@@ -81,77 +83,68 @@
         @NOTE@
         </div>
     """
-    
+
     argspecTemplate = QCoreApplication.translate(
         "CodeDocumentationViewer",
         '<p><b>Definition:</b> <span class="def">@NAME@@ARGSPEC@</span></p>',
-        "Just translate 'Definition:' and leave the rest intact.")
-    
+        "Just translate 'Definition:' and leave the rest intact.",
+    )
+
     typeTemplate = QCoreApplication.translate(
         "CodeDocumentationViewer",
         "<p><b>Type:</b> @TYPE@</p>",
-        "Just translate 'Type:' and leave the rest intact.")
-    
+        "Just translate 'Type:' and leave the rest intact.",
+    )
+
     noteTemplate = QCoreApplication.translate(
         "CodeDocumentationViewer",
         "<p><b>Note:</b> @NOTE@</p>",
-        "Just translate 'Note:' and leave the rest intact.")
-    
+        "Just translate 'Note:' and leave the rest intact.",
+    )
+
     docstringTemplate = """
         <div class="docstring">
         @DOCSTRING@
         </div>
     """
-    
+
     name = documentationInfo["name"]
     if name:
         title = titleTemplate.replace("@NAME@", name)
         if "argspec" in documentationInfo and documentationInfo["argspec"]:
             argspec = Utilities.html_encode(documentationInfo["argspec"])
-            for char in ['=', ',', '(', ')', '*', '**']:
+            for char in ["=", ",", "(", ")", "*", "**"]:
                 argspec = argspec.replace(
-                    char,
-                    '<span class="argspec-highlight">{0}</span>'.format(
-                        char))
-            argspec = (
-                argspecTemplate
-                .replace("@NAME@", name)
-                .replace("@ARGSPEC@", argspec)
+                    char, '<span class="argspec-highlight">{0}</span>'.format(char)
+                )
+            argspec = argspecTemplate.replace("@NAME@", name).replace(
+                "@ARGSPEC@", argspec
             )
         else:
-            argspec = (
-                argspecTemplate
-                .replace("@NAME@", name)
-                .replace("@ARGSPEC@", "")
-            )
-        
+            argspec = argspecTemplate.replace("@NAME@", name).replace("@ARGSPEC@", "")
+
         if "typ" in documentationInfo and documentationInfo["typ"]:
-            typeInfo = typeTemplate.replace("@TYPE@",
-                                            documentationInfo["typ"])
+            typeInfo = typeTemplate.replace("@TYPE@", documentationInfo["typ"])
         else:
             typeInfo = ""
-        
+
         if "note" in documentationInfo and documentationInfo["note"]:
-            note = noteTemplate.replace("@NOTE@",
-                                        documentationInfo["note"])
+            note = noteTemplate.replace("@NOTE@", documentationInfo["note"])
         else:
             note = ""
-        
+
         metaData = (
-            metadataTemplate
-            .replace("@ARGSPEC@", argspec)
+            metadataTemplate.replace("@ARGSPEC@", argspec)
             .replace("@TYPE@", typeInfo)
             .replace("@NOTE@", note)
         )
-        
-        header = (
-            headerTemplate
-            .replace("@TITLE@", title)
-            .replace("@METADATA@", metaData)
+
+        header = headerTemplate.replace("@TITLE@", title).replace(
+            "@METADATA@", metaData
         )
     else:
         header = ""
-    
+
     if "docstring" in documentationInfo and documentationInfo["docstring"]:
         docstring = (
             documentationInfo["docstring"]
@@ -161,13 +154,12 @@
         )
         docstring = docstringTemplate.replace("@DOCSTRING@", docstring)
     else:
-        docstring = (
-            """<div class="hr"></div><div id="doc-warning">{0}</div>"""
-            .format(QCoreApplication.translate(
-                "CodeDocumentationViewer",
-                "No further documentation available"))
+        docstring = """<div class="hr"></div><div id="doc-warning">{0}</div>""".format(
+            QCoreApplication.translate(
+                "CodeDocumentationViewer", "No further documentation available"
+            )
         )
-    
+
     return (
         mainTemplate.format(_stylesheet())
         .replace("@HEADER@", header)
@@ -178,7 +170,7 @@
 def prepareDocumentationViewerHtmlDocWarningDocument(text):
     """
     Public function to prepare a HTML warning document.
-    
+
     @param text warning text to be shown
     @type str
     @return prepared HTML document
@@ -196,17 +188,14 @@
         </body>
         </html>
     """
-    
-    return (
-        mainTemplate.format(_stylesheet())
-        .replace("@TEXT@", text)
-    )
+
+    return mainTemplate.format(_stylesheet()).replace("@TEXT@", text)
 
 
 def prepareDocumentationViewerHtmlWarningDocument(text):
     """
     Public function to prepare a HTML warning document.
-    
+
     @param text warning text to be shown
     @type str
     @return prepared HTML document
@@ -224,8 +213,5 @@
         </body>
         </html>
     """
-    
-    return (
-        mainTemplate.format(_stylesheet())
-        .replace("@TEXT@", text)
-    )
+
+    return mainTemplate.format(_stylesheet()).replace("@TEXT@", text)
--- a/src/eric7/UI/CompareDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/CompareDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,7 +30,7 @@
     """
     Compare two sequences of lines; generate the delta for display side by
     side.
-    
+
     @param a first sequence of lines (list of strings)
     @param b second sequence of lines (list of strings)
     @param linenumberwidth width (in characters) of the linenumbers (integer)
@@ -49,37 +49,49 @@
     def removeMarkers(line):
         """
         Internal function to remove all diff markers.
-        
+
         @param line line to work on (string)
         @return line without diff markers (string)
         """
         return (
-            line
-            .replace('\0+', "")
-            .replace('\0-', "")
-            .replace('\0^', "")
-            .replace('\1', "")
+            line.replace("\0+", "")
+            .replace("\0-", "")
+            .replace("\0^", "")
+            .replace("\1", "")
         )
 
     linenumberformat = "{{0:{0:d}d}}".format(linenumberwidth)
-    emptylineno = ' ' * linenumberwidth
-    
-    for (ln1, l1), (ln2, l2), flag in _mdiff(a, b, None, None,
-                                             IS_CHARACTER_JUNK):
+    emptylineno = " " * linenumberwidth
+
+    for (ln1, l1), (ln2, l2), flag in _mdiff(a, b, None, None, IS_CHARACTER_JUNK):
         if not flag:
-            yield ('e', linenumberformat.format(ln1), l1,
-                   linenumberformat.format(ln2), l2)
+            yield (
+                "e",
+                linenumberformat.format(ln1),
+                l1,
+                linenumberformat.format(ln2),
+                l2,
+            )
             continue
         if ln2 == "" and l2 in ("\r\n", "\n", "\r"):
-            yield ('d', linenumberformat.format(ln1), removeMarkers(l1),
-                   emptylineno, l2)
+            yield (
+                "d",
+                linenumberformat.format(ln1),
+                removeMarkers(l1),
+                emptylineno,
+                l2,
+            )
             continue
         if ln1 == "" and l1 in ("\r\n", "\n", "\r"):
-            yield ('i', emptylineno, l1,
-                   linenumberformat.format(ln2), removeMarkers(l2))
+            yield (
+                "i",
+                emptylineno,
+                l1,
+                linenumberformat.format(ln2),
+                removeMarkers(l2),
+            )
             continue
-        yield ('r', linenumberformat.format(ln1), l1,
-               linenumberformat.format(ln2), l2)
+        yield ("r", linenumberformat.format(ln1), l1, linenumberformat.format(ln2), l2)
 
 
 class CompareDialog(QWidget, Ui_CompareDialog):
@@ -87,63 +99,66 @@
     Class implementing a dialog to compare two files and show the result side
     by side.
     """
+
     def __init__(self, files=None, parent=None):
         """
         Constructor
-        
+
         @param files list of files to compare and their label
             (list of two tuples of two strings)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if files is None:
             files = []
-        
+
         self.file1Picker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.file2Picker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.diffButton = self.buttonBox.addButton(
-            self.tr("Compare"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Compare"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.diffButton.setToolTip(
-            self.tr("Press to perform the comparison of the two files"))
+            self.tr("Press to perform the comparison of the two files")
+        )
         self.diffButton.setEnabled(False)
         self.diffButton.setDefault(True)
-        
+
         self.firstButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
         self.upButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         self.downButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
         self.lastButton.setIcon(UI.PixmapCache.getIcon("2downarrow"))
-        
-        self.totalLabel.setText(self.tr('Total: {0}').format(0))
-        self.changedLabel.setText(self.tr('Changed: {0}').format(0))
-        self.addedLabel.setText(self.tr('Added: {0}').format(0))
-        self.deletedLabel.setText(self.tr('Deleted: {0}').format(0))
-        
-        self.updateInterval = 20    # update every 20 lines
-        
+
+        self.totalLabel.setText(self.tr("Total: {0}").format(0))
+        self.changedLabel.setText(self.tr("Changed: {0}").format(0))
+        self.addedLabel.setText(self.tr("Added: {0}").format(0))
+        self.deletedLabel.setText(self.tr("Deleted: {0}").format(0))
+
+        self.updateInterval = 20  # update every 20 lines
+
         self.vsb1 = self.contents_1.verticalScrollBar()
         self.hsb1 = self.contents_1.horizontalScrollBar()
         self.vsb2 = self.contents_2.verticalScrollBar()
         self.hsb2 = self.contents_2.horizontalScrollBar()
-        
+
         self.on_synchronizeCheckBox_toggled(True)
-        
+
         self.__generateFormats()
-        
+
         # connect some of our widgets explicitly
         self.file1Picker.textChanged.connect(self.__fileChanged)
         self.file2Picker.textChanged.connect(self.__fileChanged)
         self.vsb1.valueChanged.connect(self.__scrollBarMoved)
         self.vsb1.valueChanged.connect(self.vsb2.setValue)
         self.vsb2.valueChanged.connect(self.vsb1.setValue)
-        
+
         self.diffParas = []
         self.currentDiffPos = -1
-        
+
         self.markerPattern = r"\0\+|\0\^|\0\-"
-        
+
         if len(files) == 2:
             self.filesGroup.hide()
             self.file1Picker.setText(files[0][1])
@@ -155,7 +170,7 @@
         else:
             self.file1Label.hide()
             self.file2Label.hide()
-    
+
     def __generateFormats(self):
         """
         Private method to generate the various text formats.
@@ -166,33 +181,35 @@
         self.contents_2.setFontFamily(font.family())
         self.contents_2.setFontPointSize(font.pointSize())
         self.fontHeight = QFontMetrics(self.contents_1.currentFont()).height()
-        
+
         self.cNormalFormat = self.contents_1.currentCharFormat()
         self.cInsertedFormat = self.contents_1.currentCharFormat()
         self.cInsertedFormat.setBackground(
-            QBrush(Preferences.getDiffColour("AddedColor")))
+            QBrush(Preferences.getDiffColour("AddedColor"))
+        )
         self.cDeletedFormat = self.contents_1.currentCharFormat()
         self.cDeletedFormat.setBackground(
-            QBrush(Preferences.getDiffColour("RemovedColor")))
+            QBrush(Preferences.getDiffColour("RemovedColor"))
+        )
         self.cReplacedFormat = self.contents_1.currentCharFormat()
         self.cReplacedFormat.setBackground(
-            QBrush(Preferences.getDiffColour("ReplacedColor")))
-    
+            QBrush(Preferences.getDiffColour("ReplacedColor"))
+        )
+
     def show(self, filename=None):
         """
         Public slot to show the dialog.
-        
+
         @param filename name of a file to use as the first file (string)
         """
         if filename:
             self.file1Picker.setText(filename)
         super().show()
-        
-    def __appendText(self, pane, linenumber, line, charFormat,
-                     interLine=False):
+
+    def __appendText(self, pane, linenumber, line, charFormat, interLine=False):
         """
         Private method to append text to the end of the contents pane.
-        
+
         @param pane text edit widget to append text to (QTextedit)
         @param linenumber number of line to insert (string)
         @param line text to insert (string)
@@ -207,8 +224,8 @@
             pane.insertPlainText("{0} ".format(linenumber))
             for txt in re.split(self.markerPattern, line):
                 if txt:
-                    if txt.count('\1'):
-                        txt1, txt = txt.split('\1', 1)
+                    if txt.count("\1"):
+                        txt1, txt = txt.split("\1", 1)
                         tc = pane.textCursor()
                         tc.movePosition(QTextCursor.MoveOperation.End)
                         pane.setTextCursor(tc)
@@ -225,12 +242,12 @@
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.diffButton:
             self.on_diffButton_clicked()
-        
+
     @pyqtSlot()
     def on_diffButton_clicked(self):
         """
@@ -244,9 +261,10 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Compare Files"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be read.</p>""")
-                .format(filename1))
+                self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                    filename1
+                ),
+            )
             return
 
         filename2 = self.file2Picker.text()
@@ -257,17 +275,18 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Compare Files"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be read.</p>""")
-                .format(filename2))
+                self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                    filename2
+                ),
+            )
             return
-        
+
         self.__compare(lines1, lines2)
-        
+
     def compare(self, lines1, lines2, name1="", name2=""):
         """
         Public method to compare two lists of text.
-        
+
         @param lines1 text to compare against (string or list of strings)
         @param lines2 text to compare (string or list of strings)
         @param name1 name to be shown for the first text (string)
@@ -282,55 +301,55 @@
             self.file2Picker.setReadOnly(True)
         self.diffButton.setEnabled(False)
         self.diffButton.hide()
-        
+
         if isinstance(lines1, str):
             lines1 = lines1.splitlines(True)
         if isinstance(lines2, str):
             lines2 = lines2.splitlines(True)
-        
+
         self.__compare(lines1, lines2)
-        
+
     def __compare(self, lines1, lines2):
         """
         Private method to compare two lists of text.
-        
+
         @param lines1 text to compare against (list of strings)
         @param lines2 text to compare (list of strings)
         """
         self.contents_1.clear()
         self.contents_2.clear()
-        
+
         self.__generateFormats()
-        
+
         # counters for changes
         added = 0
         deleted = 0
         changed = 0
-        
+
         self.diffParas = []
         self.currentDiffPos = -1
-        oldOpcode = ''
+        oldOpcode = ""
         for paras, (opcode, ln1, l1, ln2, l2) in enumerate(
             sbsdiff(lines1, lines2), start=1
         ):
-            if opcode in 'idr':
+            if opcode in "idr":
                 if oldOpcode != opcode:
                     oldOpcode = opcode
                     self.diffParas.append(paras)
                     # update counters
-                    if opcode == 'i':
+                    if opcode == "i":
                         added += 1
-                    elif opcode == 'd':
+                    elif opcode == "d":
                         deleted += 1
-                    elif opcode == 'r':
+                    elif opcode == "r":
                         changed += 1
-                if opcode == 'i':
+                if opcode == "i":
                     format1 = self.cNormalFormat
                     format2 = self.cInsertedFormat
-                elif opcode == 'd':
+                elif opcode == "d":
                     format1 = self.cDeletedFormat
                     format2 = self.cNormalFormat
-                elif opcode == 'r':
+                elif opcode == "r":
                     if ln1.strip():
                         format1 = self.cReplacedFormat
                     else:
@@ -340,31 +359,30 @@
                     else:
                         format2 = self.cNormalFormat
             else:
-                oldOpcode = ''
+                oldOpcode = ""
                 format1 = self.cNormalFormat
                 format2 = self.cNormalFormat
-            self.__appendText(self.contents_1, ln1, l1, format1, opcode == 'r')
-            self.__appendText(self.contents_2, ln2, l2, format2, opcode == 'r')
+            self.__appendText(self.contents_1, ln1, l1, format1, opcode == "r")
+            self.__appendText(self.contents_2, ln2, l2, format2, opcode == "r")
             if not (paras % self.updateInterval):
                 QApplication.processEvents()
-        
+
         self.vsb1.setValue(0)
         self.vsb2.setValue(0)
         self.firstButton.setEnabled(False)
         self.upButton.setEnabled(False)
         self.downButton.setEnabled(
-            len(self.diffParas) > 0 and
-            (self.vsb1.isVisible() or self.vsb2.isVisible()))
+            len(self.diffParas) > 0 and (self.vsb1.isVisible() or self.vsb2.isVisible())
+        )
         self.lastButton.setEnabled(
-            len(self.diffParas) > 0 and
-            (self.vsb1.isVisible() or self.vsb2.isVisible()))
-        
-        self.totalLabel.setText(self.tr('Total: {0}')
-                                    .format(added + deleted + changed))
-        self.changedLabel.setText(self.tr('Changed: {0}').format(changed))
-        self.addedLabel.setText(self.tr('Added: {0}').format(added))
-        self.deletedLabel.setText(self.tr('Deleted: {0}').format(deleted))
-        
+            len(self.diffParas) > 0 and (self.vsb1.isVisible() or self.vsb2.isVisible())
+        )
+
+        self.totalLabel.setText(self.tr("Total: {0}").format(added + deleted + changed))
+        self.changedLabel.setText(self.tr("Changed: {0}").format(changed))
+        self.addedLabel.setText(self.tr("Added: {0}").format(added))
+        self.deletedLabel.setText(self.tr("Deleted: {0}").format(deleted))
+
         # move to the first difference
         self.downButton.click()
 
@@ -376,31 +394,31 @@
             value = (self.diffParas[self.currentDiffPos] - 1) * self.fontHeight
             self.vsb1.setValue(value)
             self.vsb2.setValue(value)
-    
+
     def __scrollBarMoved(self, value):
         """
         Private slot to enable the buttons and set the current diff position
         depending on scrollbar position.
-        
+
         @param value scrollbar position (integer)
         """
         tPos = value / self.fontHeight + 1
         bPos = (value + self.vsb1.pageStep()) / self.fontHeight + 1
-        
+
         self.currentDiffPos = -1
-        
+
         if self.diffParas:
             self.firstButton.setEnabled(tPos > self.diffParas[0])
             self.upButton.setEnabled(tPos > self.diffParas[0])
             self.downButton.setEnabled(bPos < self.diffParas[-1])
             self.lastButton.setEnabled(bPos < self.diffParas[-1])
-            
+
             if tPos >= self.diffParas[0]:
                 for diffPos in self.diffParas:
                     self.currentDiffPos += 1
                     if tPos <= diffPos:
                         break
-    
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -408,7 +426,7 @@
         """
         self.currentDiffPos -= 1
         self.__moveTextToCurrentDiffPos()
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -416,7 +434,7 @@
         """
         self.currentDiffPos += 1
         self.__moveTextToCurrentDiffPos()
-    
+
     @pyqtSlot()
     def on_firstButton_clicked(self):
         """
@@ -424,7 +442,7 @@
         """
         self.currentDiffPos = 0
         self.__moveTextToCurrentDiffPos()
-    
+
     @pyqtSlot()
     def on_lastButton_clicked(self):
         """
@@ -432,15 +450,12 @@
         """
         self.currentDiffPos = len(self.diffParas) - 1
         self.__moveTextToCurrentDiffPos()
-    
+
     def __fileChanged(self):
         """
         Private slot to enable/disable the Compare button.
         """
-        if (
-            not self.file1Picker.text() or
-            not self.file2Picker.text()
-        ):
+        if not self.file1Picker.text() or not self.file2Picker.text():
             self.diffButton.setEnabled(False)
         else:
             self.diffButton.setEnabled(True)
@@ -449,7 +464,7 @@
     def on_synchronizeCheckBox_toggled(self, sync):
         """
         Private slot to connect or disconnect the scrollbars of the displays.
-        
+
         @param sync flag indicating synchronisation status (boolean)
         """
         if sync:
@@ -465,29 +480,29 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, files=None, parent=None):
         """
         Constructor
-        
+
         @param files list of files to compare and their label
             (list of two tuples of two strings)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw = CompareDialog(files, self)
         self.cw.installEventFilter(self)
         size = self.cw.size()
         self.setCentralWidget(self.cw)
         self.resize(size)
-    
+
     def eventFilter(self, obj, event):
         """
         Public method to filter events.
-        
+
         @param obj reference to the object the event is meant for (QObject)
         @param event reference to the event object (QEvent)
         @return flag indicating, whether the event was handled (boolean)
@@ -495,5 +510,5 @@
         if event.type() == QEvent.Type.Close:
             QApplication.exit()
             return True
-        
+
         return False
--- a/src/eric7/UI/DeleteFilesConfirmationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/DeleteFilesConfirmationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implementing a dialog to confirm deletion of multiple files.
     """
+
     def __init__(self, parent, caption, message, files):
         """
         Constructor
-        
+
         @param parent parent of this dialog (QWidget)
         @param caption window title for the dialog (string)
         @param message message to be shown (string)
@@ -28,30 +29,23 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setModal(True)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Yes).setAutoDefault(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.No).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.No).setFocus()
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Yes).setAutoDefault(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.No).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.No).setFocus()
+
         self.setWindowTitle(caption)
         self.message.setText(message)
-        
+
         self.filesList.addItems(files)
 
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Yes
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Yes):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.No
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.No):
             self.reject()
--- a/src/eric7/UI/DiffDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/DiffDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -32,89 +32,93 @@
     """
     Class implementing a dialog to compare two files.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.file1Picker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.file2Picker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.diffButton = self.buttonBox.addButton(
-            self.tr("Compare"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Compare"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.diffButton.setToolTip(
-            self.tr("Press to perform the comparison of the two files"))
+            self.tr("Press to perform the comparison of the two files")
+        )
         self.saveButton = self.buttonBox.addButton(
-            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole)
-        self.saveButton.setToolTip(
-            self.tr("Save the output to a patch file"))
+            self.tr("Save"), QDialogButtonBox.ButtonRole.ActionRole
+        )
+        self.saveButton.setToolTip(self.tr("Save the output to a patch file"))
         self.diffButton.setEnabled(False)
         self.saveButton.setEnabled(False)
         self.diffButton.setDefault(True)
-        
+
         self.searchWidget.attachTextEdit(self.contents)
-        
-        self.filename1 = ''
-        self.filename2 = ''
-        
-        self.updateInterval = 20    # update every 20 lines
-        
+
+        self.filename1 = ""
+        self.filename2 = ""
+
+        self.updateInterval = 20  # update every 20 lines
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.contents.document().setDefaultFont(font)
-        
+
         self.highlighter = DiffHighlighter(self.contents.document())
-        
+
         # connect some of our widgets explicitly
         self.file1Picker.textChanged.connect(self.__fileChanged)
         self.file2Picker.textChanged.connect(self.__fileChanged)
-        
+
     def show(self, filename=None):
         """
         Public slot to show the dialog.
-        
+
         @param filename name of a file to use as the first file (string)
         """
         if filename:
             self.file1Picker.setText(filename)
         super().show()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.diffButton:
             self.on_diffButton_clicked()
         elif button == self.saveButton:
             self.on_saveButton_clicked()
-        
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to handle the Save button press.
-        
+
         It saves the diff shown in the dialog to a file in the local
         filesystem.
         """
         dname, fname = Utilities.splitPath(self.filename2)
-        fname = "{0}.diff".format(self.filename2) if fname != '.' else dname
-            
+        fname = "{0}.diff".format(self.filename2) if fname != "." else dname
+
         fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Save Diff"),
             fname,
             self.tr("Patch Files (*.diff)"),
             None,
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fname:
             return
-        
+
         fpath = pathlib.Path(fname)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
@@ -124,23 +128,29 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Diff"),
-                self.tr("<p>The patch file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fpath),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The patch file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fpath),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return
-        
+
         txt = self.contents.toPlainText()
         try:
-            with fpath.open("w", encoding="utf-8") as f, \
-                    contextlib.suppress(UnicodeError):
+            with fpath.open("w", encoding="utf-8") as f, contextlib.suppress(
+                UnicodeError
+            ):
                 f.write(txt)
         except OSError as why:
             EricMessageBox.critical(
-                self, self.tr('Save Diff'),
+                self,
+                self.tr("Save Diff"),
                 self.tr(
-                    '<p>The patch file <b>{0}</b> could not be saved.<br />'
-                    'Reason: {1}</p>').format(fpath, str(why)))
+                    "<p>The patch file <b>{0}</b> could not be saved.<br />"
+                    "Reason: {1}</p>"
+                ).format(fpath, str(why)),
+            )
 
     @pyqtSlot()
     def on_diffButton_clicked(self):
@@ -159,9 +169,10 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Compare Files"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be read.</p>""")
-                .format(self.filename1))
+                self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                    self.filename1
+                ),
+            )
             return
 
         self.filename2 = Utilities.toNativeSeparators(self.file2Picker.text())
@@ -176,47 +187,47 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Compare Files"),
-                self.tr(
-                    """<p>The file <b>{0}</b> could not be read.</p>""")
-                .format(self.filename2))
+                self.tr("""<p>The file <b>{0}</b> could not be read.</p>""").format(
+                    self.filename2
+                ),
+            )
             return
-        
+
         self.contents.clear()
         self.highlighter.regenerateRules()
         self.saveButton.setEnabled(False)
-        
+
         if self.unifiedRadioButton.isChecked():
             self.__generateUnifiedDiff(
-                lines1, lines2, self.filename1, self.filename2,
-                filemtime1, filemtime2)
+                lines1, lines2, self.filename1, self.filename2, filemtime1, filemtime2
+            )
         else:
             self.__generateContextDiff(
-                lines1, lines2, self.filename1, self.filename2,
-                filemtime1, filemtime2)
-        
+                lines1, lines2, self.filename1, self.filename2, filemtime1, filemtime2
+            )
+
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.contents.setTextCursor(tc)
         self.contents.ensureCursorVisible()
-        
+
         self.saveButton.setEnabled(True)
 
     def __appendText(self, txt):
         """
         Private method to append text to the end of the contents pane.
-        
+
         @param txt text to insert (string)
         """
         tc = self.contents.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.End)
         self.contents.setTextCursor(tc)
         self.contents.insertPlainText(txt)
-        
-    def __generateUnifiedDiff(self, a, b, fromfile, tofile,
-                              fromfiledate, tofiledate):
+
+    def __generateUnifiedDiff(self, a, b, fromfile, tofile, fromfiledate, tofiledate):
         """
         Private slot to generate a unified diff output.
-        
+
         @param a first sequence of lines (list of strings)
         @param b second sequence of lines (list of strings)
         @param fromfile filename of the first file (string)
@@ -230,15 +241,14 @@
             self.__appendText(line)
             if not (paras % self.updateInterval):
                 QApplication.processEvents()
-            
+
         if self.contents.toPlainText().strip() == "":
-            self.__appendText(self.tr('There is no difference.'))
+            self.__appendText(self.tr("There is no difference."))
 
-    def __generateContextDiff(self, a, b, fromfile, tofile,
-                              fromfiledate, tofiledate):
+    def __generateContextDiff(self, a, b, fromfile, tofile, fromfiledate, tofiledate):
         """
         Private slot to generate a context diff output.
-        
+
         @param a first sequence of lines (list of strings)
         @param b second sequence of lines (list of strings)
         @param fromfile filename of the first file (string)
@@ -252,18 +262,15 @@
             self.__appendText(line)
             if not (paras % self.updateInterval):
                 QApplication.processEvents()
-            
+
         if self.contents.toPlainText().strip() == "":
-            self.__appendText(self.tr('There is no difference.'))
+            self.__appendText(self.tr("There is no difference."))
 
     def __fileChanged(self):
         """
         Private slot to enable/disable the Compare button.
         """
-        if (
-            not self.file1Picker.text() or
-            not self.file2Picker.text()
-        ):
+        if not self.file1Picker.text() or not self.file2Picker.text():
             self.diffButton.setEnabled(False)
         else:
             self.diffButton.setEnabled(True)
@@ -273,27 +280,27 @@
     """
     Main window class for the standalone dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.cw = DiffDialog(self)
         self.cw.installEventFilter(self)
         size = self.cw.size()
         self.setCentralWidget(self.cw)
         self.resize(size)
-    
+
     def eventFilter(self, obj, event):
         """
         Public method to filter events.
-        
+
         @param obj reference to the object the event is meant for (QObject)
         @param event reference to the event object (QEvent)
         @return flag indicating, whether the event was handled (boolean)
@@ -301,5 +308,5 @@
         if event.type() == QEvent.Type.Close:
             QApplication.exit()
             return True
-        
+
         return False
--- a/src/eric7/UI/DiffHighlighter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/DiffHighlighter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,19 +7,18 @@
 Module implementing a syntax highlighter for unified and context diff outputs.
 """
 
-from EricGui.EricGenericDiffHighlighter import (
-    TERMINAL, EricGenericDiffHighlighter
-)
+from EricGui.EricGenericDiffHighlighter import TERMINAL, EricGenericDiffHighlighter
 
 
 class DiffHighlighter(EricGenericDiffHighlighter):
     """
     Class implementing a diff highlighter for Git.
     """
+
     def __init__(self, doc):
         """
         Constructor
-        
+
         @param doc reference to the text document (QTextDocument)
         """
         super().__init__(doc)
@@ -28,34 +27,31 @@
         """
         Public method to generate the rule set.
         """
-        diffHeaderBold = self.makeFormat(fg=self.textColor,
-                                         bg=self.headerColor,
-                                         bold=True)
-        diffContext = self.makeFormat(fg=self.textColor,
-                                      bg=self.contextColor)
+        diffHeaderBold = self.makeFormat(
+            fg=self.textColor, bg=self.headerColor, bold=True
+        )
+        diffContext = self.makeFormat(fg=self.textColor, bg=self.contextColor)
 
-        diffAdded = self.makeFormat(fg=self.textColor,
-                                    bg=self.addedColor)
-        diffRemoved = self.makeFormat(fg=self.textColor,
-                                      bg=self.removedColor)
-        diffReplaced = self.makeFormat(fg=self.textColor,
-                                       bg=self.replacedColor)
-        
-        diffBarRegex = TERMINAL(r'^\*+$')
+        diffAdded = self.makeFormat(fg=self.textColor, bg=self.addedColor)
+        diffRemoved = self.makeFormat(fg=self.textColor, bg=self.removedColor)
+        diffReplaced = self.makeFormat(fg=self.textColor, bg=self.replacedColor)
+
+        diffBarRegex = TERMINAL(r"^\*+$")
 
-        diffOldRegex = TERMINAL(r'^--- ')
-        diffNewRegex = TERMINAL(r'^\+\+\+ |^\*\*\*')
-        diffContextRegex = TERMINAL(r'^@@ ')
-        
-        diffAddedRegex = TERMINAL(r'^[+>]')
-        diffRemovedRegex = TERMINAL(r'^[-<]')
-        diffReplacedRegex = TERMINAL(r'^!')
-        
-        self.createRules((diffBarRegex, diffHeaderBold),
-                         (diffOldRegex, diffRemoved),
-                         (diffNewRegex, diffAdded),
-                         (diffContextRegex, diffContext),
-                         (diffAddedRegex, diffAdded),
-                         (diffRemovedRegex, diffRemoved),
-                         (diffReplacedRegex, diffReplaced),
-                         )
+        diffOldRegex = TERMINAL(r"^--- ")
+        diffNewRegex = TERMINAL(r"^\+\+\+ |^\*\*\*")
+        diffContextRegex = TERMINAL(r"^@@ ")
+
+        diffAddedRegex = TERMINAL(r"^[+>]")
+        diffRemovedRegex = TERMINAL(r"^[-<]")
+        diffReplacedRegex = TERMINAL(r"^!")
+
+        self.createRules(
+            (diffBarRegex, diffHeaderBold),
+            (diffOldRegex, diffRemoved),
+            (diffNewRegex, diffAdded),
+            (diffContextRegex, diffContext),
+            (diffAddedRegex, diffAdded),
+            (diffRemovedRegex, diffRemoved),
+            (diffReplacedRegex, diffReplaced),
+        )
--- a/src/eric7/UI/EmailDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/EmailDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,8 +15,12 @@
 from PyQt6.QtCore import Qt, pyqtSlot
 from PyQt6.QtGui import QTextOption
 from PyQt6.QtWidgets import (
-    QHeaderView, QLineEdit, QDialog, QInputDialog, QDialogButtonBox,
-    QTreeWidgetItem
+    QHeaderView,
+    QLineEdit,
+    QDialog,
+    QInputDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
 )
 
 from EricWidgets import EricMessageBox, EricFileDialog
@@ -46,50 +50,58 @@
     """
     Class implementing a dialog to send bug reports or feature requests.
     """
+
     def __init__(self, mode="bug", parent=None):
         """
         Constructor
-        
+
         @param mode mode of this dialog (string, "bug" or "feature")
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.message.setWordWrapMode(QTextOption.WrapMode.WordWrap)
-        
+
         self.__mode = mode
         if self.__mode == "feature":
             self.setWindowTitle(self.tr("Send feature request"))
-            self.msgLabel.setText(self.tr(
-                "Enter your &feature request below."
-                " Version information is added automatically."))
+            self.msgLabel.setText(
+                self.tr(
+                    "Enter your &feature request below."
+                    " Version information is added automatically."
+                )
+            )
             self.__toAddress = FeatureAddress
         else:
             # default is bug
-            self.msgLabel.setText(self.tr(
-                "Enter your &bug description below."
-                " Version information is added automatically."))
+            self.msgLabel.setText(
+                self.tr(
+                    "Enter your &bug description below."
+                    " Version information is added automatically."
+                )
+            )
             self.__toAddress = BugAddress
-        
+
         self.sendButton = self.buttonBox.addButton(
-            self.tr("Send"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Send"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.sendButton.setEnabled(False)
         self.sendButton.setDefault(True)
-        
+
         self.googleHelpButton = self.buttonBox.addButton(
-            self.tr("Google Mail API Help"),
-            QDialogButtonBox.ButtonRole.HelpRole)
-        
+            self.tr("Google Mail API Help"), QDialogButtonBox.ButtonRole.HelpRole
+        )
+
         height = self.height()
         self.mainSplitter.setSizes([int(0.7 * height), int(0.3 * height)])
-        
-        self.attachments.headerItem().setText(
-            self.attachments.columnCount(), "")
+
+        self.attachments.headerItem().setText(self.attachments.columnCount(), "")
         self.attachments.header().setSectionResizeMode(
-            QHeaderView.ResizeMode.Interactive)
-        
+            QHeaderView.ResizeMode.Interactive
+        )
+
         sig = Preferences.getUser("Signature")
         if sig:
             self.message.setPlainText(sig)
@@ -97,37 +109,38 @@
             cursor.setPosition(0)
             self.message.setTextCursor(cursor)
             self.message.ensureCursorVisible()
-        
+
         self.__deleteFiles = []
-        
+
         self.__helpDialog = None
         self.__googleMail = None
-    
+
     def keyPressEvent(self, ev):
         """
         Protected method to handle the user pressing the escape key.
-        
+
         @param ev key event (QKeyEvent)
         """
         if ev.key() == Qt.Key.Key_Escape:
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Close dialog"),
-                self.tr("""Do you really want to close the dialog?"""))
+                self.tr("""Do you really want to close the dialog?"""),
+            )
             if res:
                 self.reject()
-        
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
         if button == self.sendButton:
             self.on_sendButton_clicked()
         elif button == self.googleHelpButton:
             self.on_googleHelpButton_clicked()
-        
+
     def on_buttonBox_rejected(self):
         """
         Private slot to handle the rejected signal of the button box.
@@ -135,10 +148,11 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Close dialog"),
-            self.tr("""Do you really want to close the dialog?"""))
+            self.tr("""Do you really want to close the dialog?"""),
+        )
         if res:
             self.reject()
-    
+
     @pyqtSlot()
     def on_googleHelpButton_clicked(self):
         """
@@ -147,21 +161,24 @@
         if self.__helpDialog is None:
             try:
                 from EricNetwork.EricGoogleMail import GoogleMailHelp
+
                 helpStr = GoogleMailHelp()
             except ImportError:
                 from EricNetwork.EricGoogleMailHelpers import getInstallCommand
+
                 helpStr = self.tr(
                     "<p>The Google Mail Client API is not installed."
                     " Use <code>{0}</code> to install it.</p>"
                 ).format(getInstallCommand())
-            
+
             from EricWidgets.EricSimpleHelpDialog import EricSimpleHelpDialog
+
             self.__helpDialog = EricSimpleHelpDialog(
-                title=self.tr("Gmail API Help"),
-                helpStr=helpStr, parent=self)
-        
+                title=self.tr("Gmail API Help"), helpStr=helpStr, parent=self
+            )
+
         self.__helpDialog.show()
-    
+
     @pyqtSlot()
     def on_sendButton_clicked(self):
         """
@@ -169,10 +186,10 @@
         """
         msg = (
             self.__createMultipartMail()
-            if self.attachments.topLevelItemCount() else
-            self.__createSimpleMail()
+            if self.attachments.topLevelItemCount()
+            else self.__createSimpleMail()
         )
-        
+
         if Preferences.getUser("UseGoogleMailOAuth2"):
             self.__sendmailGoogle(msg)
         else:
@@ -180,7 +197,7 @@
             if ok:
                 self.__deleteAttachedFiles()
                 self.accept()
-    
+
     def __deleteAttachedFiles(self):
         """
         Private method to delete attached files.
@@ -188,11 +205,11 @@
         for f in self.__deleteFiles:
             with contextlib.suppress(OSError):
                 os.remove(f)
-    
+
     def __encodedText(self, txt):
         """
         Private method to create a MIMEText message with correct encoding.
-        
+
         @param txt text to be put into the MIMEText object (string)
         @return MIMEText object
         """
@@ -202,11 +219,11 @@
         except UnicodeEncodeError:
             coding = Preferences.getSystem("StringEncoding")
             return MIMEText(txt.encode(coding), _charset=coding)
-        
+
     def __encodedHeader(self, txt):
         """
         Private method to create a correctly encoded mail header.
-        
+
         @param txt header text to encode (string)
         @return encoded header (email.header.Header)
         """
@@ -216,11 +233,11 @@
         except UnicodeEncodeError:
             coding = Preferences.getSystem("StringEncoding")
             return Header(txt, coding)
-        
+
     def __createSimpleMail(self):
         """
         Private method to create a simple mail message.
-        
+
         @return prepared mail message
         @rtype email.mime.text.MIMEText
         """
@@ -228,81 +245,85 @@
             self.message.toPlainText(),
             Utilities.generateVersionInfo("\r\n"),
             Utilities.generatePluginsVersionInfo("\r\n"),
-            Utilities.generateDistroInfo("\r\n"))
-        
+            Utilities.generateDistroInfo("\r\n"),
+        )
+
         msg = self.__encodedText(msgtext)
-        msg['From'] = Preferences.getUser("Email")
-        msg['To'] = self.__toAddress
-        subject = '[eric7] {0}'.format(self.subject.text())
-        msg['Subject'] = self.__encodedHeader(subject)
-        
+        msg["From"] = Preferences.getUser("Email")
+        msg["To"] = self.__toAddress
+        subject = "[eric7] {0}".format(self.subject.text())
+        msg["Subject"] = self.__encodedHeader(subject)
+
         return msg
-        
+
     def __createMultipartMail(self):
         """
         Private method to create a multipart mail message.
-        
+
         @return prepared mail message
         @rtype email.mime.text.MIMEMultipart
         """
-        mpPreamble = ("This is a MIME-encoded message with attachments. "
-                      "If you see this message, your mail client is not "
-                      "capable of displaying the attachments.")
-        
+        mpPreamble = (
+            "This is a MIME-encoded message with attachments. "
+            "If you see this message, your mail client is not "
+            "capable of displaying the attachments."
+        )
+
         msgtext = "{0}\r\n----\r\n{1}\r\n----\r\n{2}\r\n----\r\n{3}".format(
             self.message.toPlainText(),
             Utilities.generateVersionInfo("\r\n"),
             Utilities.generatePluginsVersionInfo("\r\n"),
-            Utilities.generateDistroInfo("\r\n"))
-        
+            Utilities.generateDistroInfo("\r\n"),
+        )
+
         # first part of multipart mail explains format
         msg = MIMEMultipart()
-        msg['From'] = Preferences.getUser("Email")
-        msg['To'] = self.__toAddress
-        subject = '[eric7] {0}'.format(self.subject.text())
-        msg['Subject'] = self.__encodedHeader(subject)
+        msg["From"] = Preferences.getUser("Email")
+        msg["To"] = self.__toAddress
+        subject = "[eric7] {0}".format(self.subject.text())
+        msg["Subject"] = self.__encodedHeader(subject)
         msg.preamble = mpPreamble
-        msg.epilogue = ''
-        
+        msg.epilogue = ""
+
         # second part is intended to be read
         att = self.__encodedText(msgtext)
         msg.attach(att)
-        
+
         # next parts contain the attachments
         for index in range(self.attachments.topLevelItemCount()):
             itm = self.attachments.topLevelItem(index)
-            maintype, subtype = itm.text(1).split('/', 1)
+            maintype, subtype = itm.text(1).split("/", 1)
             fname = itm.text(0)
             name = os.path.basename(fname)
-            
-            if maintype == 'text':
-                with open(fname, 'r', encoding="utf-8") as f:
+
+            if maintype == "text":
+                with open(fname, "r", encoding="utf-8") as f:
                     txt = f.read()
                 try:
                     txt.encode("us-ascii")
                     att = MIMEText(txt, _subtype=subtype)
                 except UnicodeEncodeError:
                     att = MIMEText(
-                        txt.encode("utf-8"), _subtype=subtype,
-                        _charset="utf-8")
-            elif maintype == 'image':
-                with open(fname, 'rb') as f:
+                        txt.encode("utf-8"), _subtype=subtype, _charset="utf-8"
+                    )
+            elif maintype == "image":
+                with open(fname, "rb") as f:
                     att = MIMEImage(f.read(), _subtype=subtype)
-            elif maintype == 'audio':
-                with open(fname, 'rb') as f:
+            elif maintype == "audio":
+                with open(fname, "rb") as f:
                     att = MIMEAudio(f.read(), _subtype=subtype)
             else:
-                with open(fname, 'rb') as f:
+                with open(fname, "rb") as f:
                     att = MIMEApplication(f.read())
-            att.add_header('Content-Disposition', 'attachment', filename=name)
+            att.add_header("Content-Disposition", "attachment", filename=name)
             msg.attach(att)
-            
+
         return msg
 
     def __sendmail(self, msg):
         """
         Private method to actually send the message.
-        
+
         @param msg the message to be sent (string)
         @return flag indicating success (boolean)
         """
@@ -311,11 +332,13 @@
             if encryption == "SSL":
                 server = smtplib.SMTP_SSL(
                     Preferences.getUser("MailServer"),
-                    Preferences.getUser("MailServerPort"))
+                    Preferences.getUser("MailServerPort"),
+                )
             else:
                 server = smtplib.SMTP(
                     Preferences.getUser("MailServer"),
-                    Preferences.getUser("MailServerPort"))
+                    Preferences.getUser("MailServerPort"),
+                )
                 if encryption == "TLS":
                     server.starttls()
             if Preferences.getUser("MailServerAuthentication"):
@@ -326,13 +349,13 @@
                         self,
                         self.tr("Mail Server Password"),
                         self.tr("Enter your mail server password"),
-                        QLineEdit.EchoMode.Password)
+                        QLineEdit.EchoMode.Password,
+                    )
                     if not ok:
                         # abort
                         return False
                 try:
-                    server.login(Preferences.getUser("MailServerUser"),
-                                 password)
+                    server.login(Preferences.getUser("MailServerUser"), password)
                 except (smtplib.SMTPException, OSError) as e:
                     if isinstance(e, smtplib.SMTPResponseException):
                         errorStr = e.smtp_error.decode()
@@ -346,17 +369,17 @@
                         self,
                         self.tr("Send Message"),
                         self.tr(
-                            """<p>Authentication failed.<br>Reason: {0}</p>""")
-                        .format(errorStr),
-                        EricMessageBox.Critical)
+                            """<p>Authentication failed.<br>Reason: {0}</p>"""
+                        ).format(errorStr),
+                        EricMessageBox.Critical,
+                    )
                     if res:
                         return self.__sendmail(msg)
                     else:
                         return False
 
             with EricOverrideCursor():
-                server.sendmail(Preferences.getUser("Email"), self.__toAddress,
-                                msg)
+                server.sendmail(Preferences.getUser("Email"), self.__toAddress, msg)
                 server.quit()
         except (smtplib.SMTPException, OSError) as e:
             if isinstance(e, smtplib.SMTPResponseException):
@@ -370,37 +393,38 @@
             res = EricMessageBox.retryAbort(
                 self,
                 self.tr("Send Message"),
-                self.tr(
-                    """<p>Message could not be sent.<br>Reason: {0}</p>""")
-                .format(errorStr),
-                EricMessageBox.Critical)
+                self.tr("""<p>Message could not be sent.<br>Reason: {0}</p>""").format(
+                    errorStr
+                ),
+                EricMessageBox.Critical,
+            )
             if res:
                 return self.__sendmail(msg)
             else:
                 return False
         return True
-    
+
     def __sendmailGoogle(self, msg):
         """
         Private method to actually send the message via Google Mail.
-        
+
         @param msg email message to be sent
         @type email.mime.text.MIMEBase
         """
         from EricNetwork.EricGoogleMail import EricGoogleMail
-        
+
         if self.__googleMail is None:
             self.__googleMail = EricGoogleMail(self)
             self.__googleMail.sendResult.connect(self.__gmailSendResult)
-        
+
         self.__googleMail.sendMessage(msg)
-    
+
     @pyqtSlot(bool, str)
     def __gmailSendResult(self, ok, message):
         """
         Private slot handling the send result reported by the Google Mail
         interface.
-        
+
         @param ok flag indicating success
         @type bool
         @param message message from the interface
@@ -414,26 +438,24 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Send Message via Gmail"),
-                self.tr(
-                    """<p>Message could not be sent.<br>Reason: {0}</p>""")
-                .format(message)
+                self.tr("""<p>Message could not be sent.<br>Reason: {0}</p>""").format(
+                    message
+                ),
             )
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to handle the Add... button.
         """
-        fname = EricFileDialog.getOpenFileName(
-            self,
-            self.tr("Attach file"))
+        fname = EricFileDialog.getOpenFileName(self, self.tr("Attach file"))
         if fname:
             self.attachFile(fname, False)
-        
+
     def attachFile(self, fname, deleteFile):
         """
         Public method to add an attachment.
-        
+
         @param fname name of the file to be attached (string)
         @param deleteFile flag indicating to delete the file after it has
             been sent (boolean)
@@ -443,12 +465,13 @@
             mimeType = "application/octet-stream"
         QTreeWidgetItem(self.attachments, [fname, mimeType])
         self.attachments.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.attachments.header().setStretchLastSection(True)
-        
+
         if deleteFile:
             self.__deleteFiles.append(fname)
-        
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -457,23 +480,24 @@
         itm = self.attachments.currentItem()
         if itm is not None:
             itm = self.attachments.takeTopLevelItem(
-                self.attachments.indexOfTopLevelItem(itm))
+                self.attachments.indexOfTopLevelItem(itm)
+            )
             del itm
-        
+
     def on_subject_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of the subject edit.
-        
+
         @param txt changed text (string)
         """
         self.sendButton.setEnabled(
-            self.subject.text() != "" and
-            self.message.toPlainText() != "")
-        
+            self.subject.text() != "" and self.message.toPlainText() != ""
+        )
+
     def on_message_textChanged(self):
         """
         Private slot to handle the textChanged signal of the message edit.
         """
         self.sendButton.setEnabled(
-            self.subject.text() != "" and
-            self.message.toPlainText() != "")
+            self.subject.text() != "" and self.message.toPlainText() != ""
+        )
--- a/src/eric7/UI/ErrorLogDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/ErrorLogDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,10 +20,11 @@
     """
     Class implementing a dialog to display an error log.
     """
+
     def __init__(self, logFile, showMode, parent=None):
         """
         Constructor
-        
+
         @param logFile name of the log file containing the error info (string)
         @param showMode flag indicating to just show the error log message
             (boolean)
@@ -32,29 +33,29 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         pixmap = (
-            self.style().standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxQuestion)
+            self.style()
+            .standardIcon(QStyle.StandardPixmap.SP_MessageBoxQuestion)
             .pixmap(32, 32)
         )
         self.icon.setPixmap(pixmap)
-        
+
         if showMode:
             self.icon.hide()
             self.label.hide()
             self.deleteButton.setText(self.tr("Delete"))
             self.keepButton.setText(self.tr("Close"))
             self.setWindowTitle(self.tr("Error Log"))
-        
+
         self.__ui = parent
         self.__logFile = logFile
-        
+
         with contextlib.suppress(OSError):
             with open(logFile, "r", encoding="utf-8") as f:
                 txt = f.read()
             self.logEdit.setPlainText(txt)
-    
+
     @pyqtSlot()
     def on_emailButton_clicked(self):
         """
@@ -62,8 +63,9 @@
         """
         self.accept()
         self.__ui.showEmailDialog(
-            "bug", attachFile=self.__logFile, deleteAttachFile=True)
-    
+            "bug", attachFile=self.__logFile, deleteAttachFile=True
+        )
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -72,7 +74,7 @@
         if os.path.exists(self.__logFile):
             os.remove(self.__logFile)
         self.accept()
-    
+
     @pyqtSlot()
     def on_keepButton_clicked(self):
         """
--- a/src/eric7/UI/FindFileWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/FindFileWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,8 +14,14 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QUrl
 from PyQt6.QtGui import QCursor, QDesktopServices, QImageReader
 from PyQt6.QtWidgets import (
-    QWidget, QApplication, QMenu, QTreeWidgetItem, QComboBox, QDialog,
-    QDialogButtonBox, QVBoxLayout
+    QWidget,
+    QApplication,
+    QMenu,
+    QTreeWidgetItem,
+    QComboBox,
+    QDialog,
+    QDialogButtonBox,
+    QVBoxLayout,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -33,14 +39,14 @@
     """
     Class implementing a widget to search for text in files and replace it
     with some other text.
-    
+
     The occurrences found are displayed in a tree showing the file name,
     the line number and the text found. The file will be opened upon a double
     click onto the respective entry of the list. If the widget is in replace
     mode the line below shows the text after replacement. Replacements can
     be authorized by ticking them on. Pressing the replace button performs
     all ticked replacement operations.
-    
+
     @signal sourceFile(str, int, str, int, int) emitted to open a source file
         at a specificline
     @signal designerFile(str) emitted to open a Qt-Designer file
@@ -50,6 +56,7 @@
     @signal svgFile(str) emitted to open a SVG file
     @signal umlFile(str) emitted to open an eric UML file
     """
+
     sourceFile = pyqtSignal(str, int, str, int, int)
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
@@ -57,17 +64,17 @@
     pixmapFile = pyqtSignal(str)
     svgFile = pyqtSignal(str)
     umlFile = pyqtSignal(str)
-    
+
     lineRole = Qt.ItemDataRole.UserRole + 1
     startRole = Qt.ItemDataRole.UserRole + 2
     endRole = Qt.ItemDataRole.UserRole + 3
     replaceRole = Qt.ItemDataRole.UserRole + 4
     md5Role = Qt.ItemDataRole.UserRole + 5
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this dialog (defaults to None)
@@ -75,76 +82,78 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         self.caseToolButton.setIcon(UI.PixmapCache.getIcon("caseSensitive"))
         self.wordToolButton.setIcon(UI.PixmapCache.getIcon("wholeWord"))
         self.regexpToolButton.setIcon(UI.PixmapCache.getIcon("regexp"))
-        
+
         self.dirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.dirPicker.setInsertPolicy(QComboBox.InsertPolicy.InsertAtTop)
         self.dirPicker.setSizeAdjustPolicy(
-            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon)
-        
+            QComboBox.SizeAdjustPolicy.AdjustToMinimumContentsLengthWithIcon
+        )
+
         self.stopButton.setEnabled(False)
         self.stopButton.clicked.connect(self.__stopSearch)
         self.stopButton.setIcon(UI.PixmapCache.getIcon("stopLoading"))
         self.stopButton.setAutoDefault(False)
-        
+
         self.findButton.setEnabled(False)
         self.findButton.clicked.connect(self.__doSearch)
         self.findButton.setIcon(UI.PixmapCache.getIcon("find"))
         self.findButton.setAutoDefault(False)
-        
+
         self.clearButton.setEnabled(False)
         self.clearButton.clicked.connect(self.__clearResults)
         self.clearButton.setIcon(UI.PixmapCache.getIcon("clear"))
         self.clearButton.setAutoDefault(False)
-        
+
         self.replaceButton.setIcon(UI.PixmapCache.getIcon("editReplace"))
         self.replaceButton.setAutoDefault(False)
-        
+
         self.modeToggleButton.clicked.connect(self.__toggleReplaceMode)
-        
+
         self.findProgressLabel.setMaximumWidth(550)
-        
+
         self.searchHistory = Preferences.toList(
-            Preferences.getSettings().value(
-                "FindFileWidget/SearchHistory"))
+            Preferences.getSettings().value("FindFileWidget/SearchHistory")
+        )
         self.findtextCombo.lineEdit().setClearButtonEnabled(True)
         self.findtextCombo.lineEdit().returnPressed.connect(self.__doSearch)
         self.findtextCombo.setCompleter(None)
         self.findtextCombo.addItems(self.searchHistory)
         self.findtextCombo.setEditText("")
-        
+
         self.replaceHistory = Preferences.toList(
-            Preferences.getSettings().value(
-                "FindFileWidget/ReplaceHistory"))
+            Preferences.getSettings().value("FindFileWidget/ReplaceHistory")
+        )
         self.replacetextCombo.lineEdit().setClearButtonEnabled(True)
         self.replacetextCombo.lineEdit().returnPressed.connect(self.__doSearch)
         self.replacetextCombo.setCompleter(None)
         self.replacetextCombo.addItems(self.replaceHistory)
         self.replacetextCombo.setEditText("")
-        
+
         self.dirHistory = Preferences.toList(
-            Preferences.getSettings().value(
-                "FindFileWidget/DirectoryHistory"))
+            Preferences.getSettings().value("FindFileWidget/DirectoryHistory")
+        )
         self.dirPicker.addItems(self.dirHistory)
         self.dirPicker.setText("")
-        
-        self.excludeHiddenCheckBox.setChecked(Preferences.toBool(
-            Preferences.getSettings().value(
-                "FindFileWidget/ExcludeHidden", True)
-        ))
-        
+
+        self.excludeHiddenCheckBox.setChecked(
+            Preferences.toBool(
+                Preferences.getSettings().value("FindFileWidget/ExcludeHidden", True)
+            )
+        )
+
         # ensure the file type tab is the current one
         self.fileOptionsWidget.setCurrentWidget(self.fileTypeTab)
-        
+
         self.project = project
         self.project.projectOpened.connect(self.__projectOpened)
         self.project.projectClosed.connect(self.__projectClosed)
-        
+
         self.__standardListFont = self.findList.font()
         self.findList.headerItem().setText(self.findList.columnCount(), "")
         self.findList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
@@ -152,35 +161,35 @@
         self.findList.setExpandsOnDoubleClick(False)
 
         # Qt Designer form files
-        self.filterForms = r'.*\.ui$'
-        self.formsExt = ['*.ui']
-        
+        self.filterForms = r".*\.ui$"
+        self.formsExt = ["*.ui"]
+
         # Corba interface files
-        self.filterInterfaces = r'.*\.idl$'
-        self.interfacesExt = ['*.idl']
-        
+        self.filterInterfaces = r".*\.idl$"
+        self.interfacesExt = ["*.idl"]
+
         # Protobuf protocol files
-        self.filterProtocols = r'.*\.proto$'
-        self.protocolsExt = ['*.proto']
-        
+        self.filterProtocols = r".*\.proto$"
+        self.protocolsExt = ["*.proto"]
+
         # Qt resources files
-        self.filterResources = r'.*\.qrc$'
-        self.resourcesExt = ['*.qrc']
-        
+        self.filterResources = r".*\.qrc$"
+        self.resourcesExt = ["*.qrc"]
+
         self.__cancelSearch = False
         self.__lastFileItem = None
         self.__populating = False
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
-        
+
         self.__replaceMode = True
         self.__toggleReplaceMode()
-    
+
     def __createItem(self, file, line, text, start, end, replTxt="", md5=""):
         """
         Private method to create an entry in the file list.
-        
+
         @param file filename of file
         @type str
         @param line line number
@@ -203,11 +212,12 @@
             self.__lastFileItem.setExpanded(True)
             if self.__replaceMode:
                 self.__lastFileItem.setFlags(
-                    self.__lastFileItem.flags() |
-                    Qt.ItemFlag.ItemIsUserCheckable |
-                    Qt.ItemFlag.ItemIsAutoTristate)
+                    self.__lastFileItem.flags()
+                    | Qt.ItemFlag.ItemIsUserCheckable
+                    | Qt.ItemFlag.ItemIsAutoTristate
+                )
             self.__lastFileItem.setData(0, self.md5Role, md5)
-        
+
         itm = QTreeWidgetItem(self.__lastFileItem)
         itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
         itm.setData(0, Qt.ItemDataRole.DisplayRole, line)
@@ -217,17 +227,15 @@
         itm.setData(0, self.endRole, end)
         itm.setData(0, self.replaceRole, replTxt)
         if self.__replaceMode:
-            itm.setFlags(itm.flags() |
-                         Qt.ItemFlag.ItemIsUserCheckable)
+            itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             itm.setCheckState(0, Qt.CheckState.Checked)
             self.replaceButton.setEnabled(True)
-    
-    def activate(self, replaceMode=False, txt="", searchDir="",
-                 openFiles=False):
+
+    def activate(self, replaceMode=False, txt="", searchDir="", openFiles=False):
         """
         Public method to activate the widget with a given mode, a text
         to search for and some search parameters.
-        
+
         @param replaceMode flag indicating replacement mode (defaults to False)
         @type bool (optional)
         @param txt text to be searched for (defaults to "")
@@ -244,51 +252,51 @@
         else:
             self.projectButton.setEnabled(False)
             self.dirButton.setChecked(True)
-            
+
         self.findtextCombo.setEditText(txt)
         self.findtextCombo.lineEdit().selectAll()
         self.findtextCombo.setFocus()
-        
+
         if self.__replaceMode != replaceMode:
             self.__toggleReplaceMode()
-        
+
         if searchDir:
             self.__setSearchDirectory(searchDir)
         if openFiles:
             self.__setOpenFiles()
-    
+
     @pyqtSlot()
     def __toggleReplaceMode(self):
         """
         Private slot to toggle the dialog mode.
         """
         self.__replaceMode = not self.__replaceMode
-        
+
         # change some interface elements and properties
         self.findList.clear()
         self.clearButton.setEnabled(False)
-        
+
         if self.__replaceMode:
             self.replaceButton.show()
             self.replaceLabel.show()
             self.replacetextCombo.show()
-            
+
             self.replaceButton.setEnabled(False)
             self.replacetextCombo.setEditText("")
-            
+
             font = Preferences.getEditorOtherFonts("MonospacedFont")
             self.findList.setFont(font)
-            
+
             self.modeToggleButton.setIcon(UI.PixmapCache.getIcon("1uparrow"))
         else:
             self.replaceLabel.hide()
             self.replacetextCombo.hide()
             self.replaceButton.hide()
-            
+
             self.findList.setFont(self.__standardListFont)
-            
+
             self.modeToggleButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
@@ -296,7 +304,7 @@
         """
         self.projectButton.setEnabled(True)
         self.projectButton.setChecked(True)
-    
+
     @pyqtSlot()
     def __projectClosed(self):
         """
@@ -305,123 +313,125 @@
         self.projectButton.setEnabled(False)
         if self.projectButton.isChecked():
             self.dirButton.setChecked(True)
-    
+
     @pyqtSlot(str)
     def on_findtextCombo_editTextChanged(self, text):
         """
         Private slot to handle the editTextChanged signal of the find
         text combo.
-        
+
         @param text (ignored)
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot(str)
     def on_replacetextCombo_editTextChanged(self, text):
         """
         Private slot to handle the editTextChanged signal of the replace
         text combo.
-        
+
         @param text (ignored)
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot(str)
     def on_dirPicker_editTextChanged(self, text):
         """
         Private slot to handle the textChanged signal of the directory
         picker.
-        
+
         @param text (ignored)
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot()
     def on_projectButton_clicked(self):
         """
         Private slot to handle the selection of the 'Project' radio button.
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot()
     def on_dirButton_clicked(self):
         """
         Private slot to handle the selection of the 'Directory' radio button.
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot()
     def on_openFilesButton_clicked(self):
         """
         Private slot to handle the selection of the 'Open Files' radio button.
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot()
     def on_filterCheckBox_clicked(self):
         """
         Private slot to handle the selection of the file filter check box.
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot(str)
     def on_filterEdit_textEdited(self, text):
         """
         Private slot to handle the textChanged signal of the file filter edit.
-        
+
         @param text (ignored)
         """
         self.__enableFindButton()
-    
+
     @pyqtSlot()
     def __enableFindButton(self):
         """
         Private slot called to enable the find button.
         """
         if (
-            self.findtextCombo.currentText() == "" or
-            (self.dirButton.isChecked() and
-             (self.dirPicker.currentText() == "" or
-              not os.path.exists(os.path.abspath(
-                self.dirPicker.currentText())))) or
-            (self.filterCheckBox.isChecked() and
-             self.filterEdit.text() == "")
+            self.findtextCombo.currentText() == ""
+            or (
+                self.dirButton.isChecked()
+                and (
+                    self.dirPicker.currentText() == ""
+                    or not os.path.exists(os.path.abspath(self.dirPicker.currentText()))
+                )
+            )
+            or (self.filterCheckBox.isChecked() and self.filterEdit.text() == "")
         ):
             self.findButton.setEnabled(False)
         else:
             self.findButton.setEnabled(True)
-    
+
     def __stripEol(self, txt):
         """
         Private method to strip the eol part.
-        
+
         @param txt line of text that should be treated
         @type str
         @return text with eol stripped
         @rtype str
         """
         return txt.replace("\r", "").replace("\n", "")
-    
+
     @pyqtSlot()
     def __stopSearch(self):
         """
         Private slot to handle the stop button being pressed.
         """
         self.__cancelSearch = True
-    
+
     @pyqtSlot()
     def __doSearch(self):
         """
         Private slot to handle the find button being pressed.
         """
         if (
-            self.__replaceMode and
-            not ericApp().getObject("ViewManager").checkAllDirty()
+            self.__replaceMode
+            and not ericApp().getObject("ViewManager").checkAllDirty()
         ):
             return
-        
+
         self.__cancelSearch = False
-        
+
         if self.filterCheckBox.isChecked():
             fileFilter = self.filterEdit.text()
             fileFilterList = [
@@ -429,17 +439,15 @@
                 for filter in fileFilter.split(";")
             ]
             filterRe = re.compile("|".join(fileFilterList))
-        
+
         if self.projectButton.isChecked():
             if self.filterCheckBox.isChecked():
                 files = [
                     self.project.getRelativePath(file)
-                    for file in
-                    self.__getFileList(
+                    for file in self.__getFileList(
                         self.project.getProjectPath(),
                         filterRe,
-                        excludeHiddenDirs=self.excludeHiddenCheckBox
-                        .isChecked(),
+                        excludeHiddenDirs=self.excludeHiddenCheckBox.isChecked(),
                     )
                 ]
             else:
@@ -457,57 +465,81 @@
         elif self.dirButton.isChecked():
             if not self.filterCheckBox.isChecked():
                 filters = []
-                if (
-                    self.project.isOpen() and
-                    os.path.abspath(self.dirPicker.currentText()).startswith(
-                        self.project.getProjectPath())
-                ):
+                if self.project.isOpen() and os.path.abspath(
+                    self.dirPicker.currentText()
+                ).startswith(self.project.getProjectPath()):
                     if self.sourcesCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*")
-                            ) for assoc in
-                            self.project.getFiletypeAssociations("SOURCES")
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in self.project.getFiletypeAssociations(
+                                    "SOURCES"
+                                )
+                            ]
+                        )
                     if self.formsCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*")
-                            ) for assoc in
-                            self.project.getFiletypeAssociations("FORMS")
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in self.project.getFiletypeAssociations(
+                                    "FORMS"
+                                )
+                            ]
+                        )
                     if self.interfacesCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*")
-                            ) for assoc in
-                            self.project.getFiletypeAssociations("INTERFACES")
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in self.project.getFiletypeAssociations(
+                                    "INTERFACES"
+                                )
+                            ]
+                        )
                     if self.protocolsCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*")
-                            ) for assoc in
-                            self.project.getFiletypeAssociations("PROTOCOLS")
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in self.project.getFiletypeAssociations(
+                                    "PROTOCOLS"
+                                )
+                            ]
+                        )
                     if self.resourcesCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*")
-                            ) for assoc in
-                            self.project.getFiletypeAssociations("RESOURCES")
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in self.project.getFiletypeAssociations(
+                                    "RESOURCES"
+                                )
+                            ]
+                        )
                 else:
                     if self.sourcesCheckBox.isChecked():
-                        filters.extend([
-                            "^{0}$".format(
-                                assoc.replace(".", r"\.").replace("*", ".*"))
-                            for assoc in list(
-                                Preferences.getEditorLexerAssocs().keys())
-                            if assoc not in
-                            self.formsExt + self.interfacesExt +
-                            self.protocolsExt + self.resourcesExt
-                        ])
+                        filters.extend(
+                            [
+                                "^{0}$".format(
+                                    assoc.replace(".", r"\.").replace("*", ".*")
+                                )
+                                for assoc in list(
+                                    Preferences.getEditorLexerAssocs().keys()
+                                )
+                                if assoc
+                                not in self.formsExt
+                                + self.interfacesExt
+                                + self.protocolsExt
+                                + self.resourcesExt
+                            ]
+                        )
                     if self.formsCheckBox.isChecked():
                         filters.append(self.filterForms)
                     if self.interfacesCheckBox.isChecked():
@@ -528,11 +560,11 @@
             vm = ericApp().getObject("ViewManager")
             vm.checkAllDirty()
             files = vm.getOpenFilenames()
-        
+
         self.findList.clear()
         QApplication.processEvents()
         self.findProgress.setMaximum(len(files))
-        
+
         # retrieve the values
         reg = self.regexpToolButton.isChecked()
         wo = self.wordToolButton.isChecked()
@@ -550,8 +582,11 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Invalid search expression"),
-                self.tr("""<p>The search expression is not valid.</p>"""
-                        """<p>Error: {0}</p>""").format(str(why)))
+                self.tr(
+                    """<p>The search expression is not valid.</p>"""
+                    """<p>Error: {0}</p>"""
+                ).format(str(why)),
+            )
             self.stopButton.setEnabled(False)
             self.findButton.setEnabled(True)
             return
@@ -562,12 +597,12 @@
         self.findtextCombo.clear()
         self.findtextCombo.addItems(self.searchHistory)
         Preferences.getSettings().setValue(
-            "FindFileWidget/SearchHistory",
-            self.searchHistory[:30])
+            "FindFileWidget/SearchHistory", self.searchHistory[:30]
+        )
         Preferences.getSettings().setValue(
-            "FindFileWidget/ExcludeHidden",
-            self.excludeHiddenCheckBox.isChecked())
-        
+            "FindFileWidget/ExcludeHidden", self.excludeHiddenCheckBox.isChecked()
+        )
+
         if self.__replaceMode:
             replTxt = self.replacetextCombo.currentText()
             if replTxt in self.replaceHistory:
@@ -576,9 +611,9 @@
             self.replacetextCombo.clear()
             self.replacetextCombo.addItems(self.replaceHistory)
             Preferences.getSettings().setValue(
-                "FindFileWidget/ReplaceHistory",
-                self.replaceHistory[:30])
-        
+                "FindFileWidget/ReplaceHistory", self.replaceHistory[:30]
+            )
+
         if self.dirButton.isChecked():
             searchDir = self.dirPicker.currentText()
             if searchDir in self.dirHistory:
@@ -588,14 +623,14 @@
             self.dirPicker.addItems(self.dirHistory)
             self.dirPicker.setText(self.dirHistory[0])
             Preferences.getSettings().setValue(
-                "FindFileWidget/DirectoryHistory",
-                self.dirHistory[:30])
-        
+                "FindFileWidget/DirectoryHistory", self.dirHistory[:30]
+            )
+
         # set the button states
         self.stopButton.setEnabled(True)
         self.findButton.setEnabled(False)
         self.clearButton.setEnabled(False)
-        
+
         # now go through all the files
         self.__populating = True
         self.findList.setUpdatesEnabled(False)
@@ -606,11 +641,11 @@
             found = False
             if self.__cancelSearch:
                 break
-            
+
             fn = (
                 os.path.join(self.project.getProjectPath(), file)
-                if self.projectButton.isChecked() else
-                file
+                if self.projectButton.isChecked()
+                else file
             )
             # read the file and split it into textlines
             try:
@@ -619,13 +654,13 @@
             except (UnicodeError, OSError):
                 self.findProgress.setValue(progress)
                 continue
-            
+
             now = time.monotonic()
             # now perform the search and display the lines found
             for count, line in enumerate(lines, start=1):
                 if self.__cancelSearch:
                     break
-                
+
                 contains = search.search(line)
                 if contains:
                     occurrences += 1
@@ -642,41 +677,43 @@
                     if self.__replaceMode:
                         if len(rline) > 1024:
                             rline = "{0} ...".format(line[:1024])
-                        line = "- {0}\n+ {1}".format(
-                            line, self.__stripEol(rline))
-                    self.__createItem(file, count, line, start, end,
-                                      rline, hashStr)
-                
+                        line = "- {0}\n+ {1}".format(line, self.__stripEol(rline))
+                    self.__createItem(file, count, line, start, end, rline, hashStr)
+
                 if time.monotonic() - now > 0.01:
                     QApplication.processEvents()
                     now = time.monotonic()
-            
+
             if found:
                 fileOccurrences += 1
             self.findProgress.setValue(progress)
-        
+
         if not files:
             self.findProgress.setMaximum(1)
             self.findProgress.setValue(1)
-        
+
         resultFormat = self.tr("{0} / {1}", "occurrences / files")
-        self.findProgressLabel.setPath(resultFormat.format(
-            self.tr("%n occurrence(s)", "", occurrences),
-            self.tr("%n file(s)", "", fileOccurrences)))
-        
+        self.findProgressLabel.setPath(
+            resultFormat.format(
+                self.tr("%n occurrence(s)", "", occurrences),
+                self.tr("%n file(s)", "", fileOccurrences),
+            )
+        )
+
         self.findList.setUpdatesEnabled(True)
-        self.findList.sortItems(self.findList.sortColumn(),
-                                self.findList.header().sortIndicatorOrder())
+        self.findList.sortItems(
+            self.findList.sortColumn(), self.findList.header().sortIndicatorOrder()
+        )
         self.findList.resizeColumnToContents(1)
         if self.__replaceMode:
             self.findList.header().resizeSection(0, self.__section0Size + 30)
         self.findList.header().setStretchLastSection(True)
         self.__populating = False
-        
+
         self.stopButton.setEnabled(False)
         self.findButton.setEnabled(True)
         self.clearButton.setEnabled(self.findList.topLevelItemCount() != 0)
-    
+
     @pyqtSlot()
     def __clearResults(self):
         """
@@ -687,14 +724,14 @@
         self.clearButton.setEnabled(False)
         self.findProgressLabel.setPath("")
         self.findProgress.setValue(0)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_findList_itemDoubleClicked(self, itm, column):
         """
         Private slot to handle the double click on a file item.
-        
+
         It emits a signal depending on the file extension.
-        
+
         @param itm the double clicked tree item
         @type QTreeWidgetItem
         @param column column that was double clicked (ignored)
@@ -710,14 +747,14 @@
             line = 1
             start = 0
             end = 0
-        
+
         fileName = (
             os.path.join(self.project.getProjectPath(), file)
-            if self.project.isOpen() else
-            file
+            if self.project.isOpen()
+            else file
         )
         fileExt = os.path.splitext(fileName)[1]
-        
+
         if fileExt == ".ui":
             self.designerFile.emit(fileName)
         elif fileExt == ".ts":
@@ -735,12 +772,13 @@
                 self.sourceFile.emit(fileName, line, "", start, end)
             else:
                 QDesktopServices.openUrl(QUrl(fileName))
-    
-    def __getFileList(self, path, filterRe, excludeHiddenDirs=False,
-                      excludeHiddenFiles=False):
+
+    def __getFileList(
+        self, path, filterRe, excludeHiddenDirs=False, excludeHiddenFiles=False
+    ):
         """
         Private method to get a list of files to search.
-        
+
         @param path the root directory to search in
         @type str
         @param filterRe regular expression defining the filter
@@ -756,34 +794,39 @@
         path = os.path.abspath(path)
         files = []
         for dirname, dirs, filenames in os.walk(path):
-            files.extend([
-                os.path.join(dirname, f) for f in filenames
-                if (not (excludeHiddenFiles and f.startswith(".")) and
-                    re.match(filterRe, f))
-            ])
+            files.extend(
+                [
+                    os.path.join(dirname, f)
+                    for f in filenames
+                    if (
+                        not (excludeHiddenFiles and f.startswith("."))
+                        and re.match(filterRe, f)
+                    )
+                ]
+            )
             if excludeHiddenDirs:
                 for d in dirs[:]:
-                    if d .startswith("."):
+                    if d.startswith("."):
                         dirs.remove(d)
         return files
-    
+
     def __setSearchDirectory(self, searchDir):
         """
         Private slot to set the name of the directory to search in.
-        
+
         @param searchDir name of the directory to search in
         @type str
         """
         self.dirButton.setChecked(True)
         self.dirPicker.setEditText(Utilities.toNativeSeparators(searchDir))
-    
+
     @pyqtSlot()
     def __setOpenFiles(self):
         """
         Private slot to set the mode to search in open files.
         """
         self.openFilesButton.setChecked(True)
-    
+
     @pyqtSlot()
     def on_replaceButton_clicked(self):
         """
@@ -791,24 +834,24 @@
         """
         self.findProgress.setMaximum(self.findList.topLevelItemCount())
         self.findProgress.setValue(0)
-        
+
         for index in range(self.findList.topLevelItemCount()):
             itm = self.findList.topLevelItem(index)
-            if itm.checkState(0) in [Qt.CheckState.PartiallyChecked,
-                                     Qt.CheckState.Checked]:
+            if itm.checkState(0) in [
+                Qt.CheckState.PartiallyChecked,
+                Qt.CheckState.Checked,
+            ]:
                 file = itm.text(0)
                 origHash = itm.data(0, self.md5Role)
-                
+
                 if self.projectButton.isChecked():
                     fn = os.path.join(self.project.getProjectPath(), file)
                 else:
                     fn = file
-                
+
                 # read the file and split it into textlines
                 try:
-                    text, encoding, hashStr = (
-                        Utilities.readEncodedFileWithHash(fn)
-                    )
+                    text, encoding, hashStr = Utilities.readEncodedFileWithHash(fn)
                     lines = text.splitlines(True)
                 except (UnicodeError, OSError) as err:
                     EricMessageBox.critical(
@@ -816,12 +859,12 @@
                         self.tr("Replace in Files"),
                         self.tr(
                             """<p>Could not read the file <b>{0}</b>."""
-                            """ Skipping it.</p><p>Reason: {1}</p>""")
-                        .format(fn, str(err))
+                            """ Skipping it.</p><p>Reason: {1}</p>"""
+                        ).format(fn, str(err)),
                     )
                     self.findProgress.setValue(index)
                     continue
-                
+
                 # Check the original and the current hash. Skip the file,
                 # if hashes are different.
                 if origHash != hashStr:
@@ -831,12 +874,12 @@
                         self.tr(
                             """<p>The current and the original hash of the"""
                             """ file <b>{0}</b> are different. Skipping it."""
-                            """</p><p>Hash 1: {1}</p><p>Hash 2: {2}</p>""")
-                        .format(fn, origHash, hashStr)
+                            """</p><p>Hash 1: {1}</p><p>Hash 2: {2}</p>"""
+                        ).format(fn, origHash, hashStr),
                     )
                     self.findProgress.setValue(index)
                     continue
-                
+
                 # replace the lines authorized by the user
                 for cindex in range(itm.childCount()):
                     citm = itm.child(cindex)
@@ -844,7 +887,7 @@
                         line = citm.data(0, self.lineRole)
                         rline = citm.data(0, self.replaceRole)
                         lines[line - 1] = rline
-                
+
                 # write the file
                 txt = "".join(lines)
                 try:
@@ -855,35 +898,34 @@
                         self.tr("Replace in Files"),
                         self.tr(
                             """<p>Could not save the file <b>{0}</b>."""
-                            """ Skipping it.</p><p>Reason: {1}</p>""")
-                        .format(fn, str(err))
+                            """ Skipping it.</p><p>Reason: {1}</p>"""
+                        ).format(fn, str(err)),
                     )
-            
+
             self.findProgress.setValue(index + 1)
-        
+
         self.findProgressLabel.setPath("")
-        
+
         self.findList.clear()
         self.replaceButton.setEnabled(False)
         self.findButton.setEnabled(True)
         self.clearButton.setEnabled(False)
-    
+
     @pyqtSlot(QPoint)
     def __contextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request.
-        
+
         @param pos position the context menu shall be shown
         @type QPoint
         """
         menu = QMenu(self)
-        
+
         menu.addAction(self.tr("Open"), self.__openFile)
-        menu.addAction(self.tr("Copy Path to Clipboard"),
-                       self.__copyToClipboard)
-        
+        menu.addAction(self.tr("Copy Path to Clipboard"), self.__copyToClipboard)
+
         menu.exec(QCursor.pos())
-    
+
     @pyqtSlot()
     def __openFile(self):
         """
@@ -891,7 +933,7 @@
         """
         itm = self.findList.selectedItems()[0]
         self.on_findList_itemDoubleClicked(itm, 0)
-    
+
     @pyqtSlot()
     def __copyToClipboard(self):
         """
@@ -899,7 +941,7 @@
         """
         itm = self.findList.selectedItems()[0]
         fn = itm.parent().text(0) if itm.parent() else itm.text(0)
-        
+
         cb = QApplication.clipboard()
         cb.setText(fn)
 
@@ -908,14 +950,14 @@
     """
     Class implementing a dialog to search for text in files and replace it
     with some other text.
-    
+
     The occurrences found are displayed in a tree showing the file name,
     the line number and the text found. The file will be opened upon a double
     click onto the respective entry of the list. If the widget is in replace
     mode the line below shows the text after replacement. Replacements can
     be authorized by ticking them on. Pressing the replace button performs
     all ticked replacement operations.
-    
+
     @signal sourceFile(str, int, str, int, int) emitted to open a source file
         at a specificline
     @signal designerFile(str) emitted to open a Qt-Designer file
@@ -925,6 +967,7 @@
     @signal svgFile(str) emitted to open a SVG file
     @signal umlFile(str) emitted to open an eric UML file
     """
+
     sourceFile = pyqtSignal(str, int, str, int, int)
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
@@ -932,11 +975,11 @@
     pixmapFile = pyqtSignal(str)
     svgFile = pyqtSignal(str)
     umlFile = pyqtSignal(str)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this dialog (defaults to None)
@@ -944,24 +987,23 @@
         """
         super().__init__(parent)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__layout = QVBoxLayout()
-        
+
         self.__findWidget = FindFileWidget(project, self)
         self.__layout.addWidget(self.__findWidget)
-        
+
         self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close,
-            Qt.Orientation.Horizontal,
-            self
+            QDialogButtonBox.StandardButton.Close, Qt.Orientation.Horizontal, self
         )
-        self.__buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setAutoDefault(False)
+        self.__buttonBox.button(QDialogButtonBox.StandardButton.Close).setAutoDefault(
+            False
+        )
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.setLayout(self.__layout)
         self.resize(600, 800)
-        
+
         # connect the widgets
         self.__findWidget.sourceFile.connect(self.sourceFile)
         self.__findWidget.designerFile.connect(self.designerFile)
@@ -970,16 +1012,15 @@
         self.__findWidget.pixmapFile.connect(self.pixmapFile)
         self.__findWidget.svgFile.connect(self.svgFile)
         self.__findWidget.umlFile.connect(self.umlFile)
-        
+
         self.__buttonBox.accepted.connect(self.accept)
         self.__buttonBox.rejected.connect(self.reject)
-    
-    def activate(self, replaceMode=False, txt="", searchDir="",
-                 openFiles=False):
+
+    def activate(self, replaceMode=False, txt="", searchDir="", openFiles=False):
         """
         Public method to activate the dialog with a given mode, a text
         to search for and some search parameters.
-        
+
         @param replaceMode flag indicating replacement mode (defaults to False)
         @type bool (optional)
         @param txt text to be searched for (defaults to "")
@@ -990,9 +1031,10 @@
             (defaults to False)
         @type bool (optional)
         """
-        self.__findWidget.activate(replaceMode=replaceMode, txt=txt,
-                                   searchDir=searchDir, openFiles=openFiles)
-        
+        self.__findWidget.activate(
+            replaceMode=replaceMode, txt=txt, searchDir=searchDir, openFiles=openFiles
+        )
+
         self.raise_()
         self.activateWindow()
         self.show()
--- a/src/eric7/UI/FindLocationWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/FindLocationWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,13 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl
 from PyQt6.QtGui import QDesktopServices, QImageReader
 from PyQt6.QtWidgets import (
-    QWidget, QHeaderView, QApplication, QTreeWidgetItem, QDialog,
-    QDialogButtonBox, QVBoxLayout
+    QWidget,
+    QHeaderView,
+    QApplication,
+    QTreeWidgetItem,
+    QDialog,
+    QDialogButtonBox,
+    QVBoxLayout,
 )
 
 from EricWidgets.EricPathPicker import EricPathPickerModes
@@ -29,11 +34,11 @@
 class FindLocationWidget(QWidget, Ui_FindLocationWidget):
     """
     Class implementing a widget to search for files.
-    
+
     The occurrences found are displayed in a QTreeWidget showing the
     filename and the pathname. The file will be opened upon a double click
     onto the respective entry of the list or by pressing the open button.
-    
+
     @signal sourceFile(str) emitted to open a file in the editor
     @signal designerFile(str) emitted to open a Qt-Designer file
     @signal linguistFile(str) emitted to open a Qt-Linguist (*.ts) file
@@ -42,6 +47,7 @@
     @signal svgFile(str) emitted to open a SVG file
     @signal umlFile(str) emitted to open an eric UML file
     """
+
     sourceFile = pyqtSignal(str)
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
@@ -49,11 +55,11 @@
     pixmapFile = pyqtSignal(str)
     svgFile = pyqtSignal(str)
     umlFile = pyqtSignal(str)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this dialog
@@ -61,59 +67,59 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setContentsMargins(0, 3, 0, 0)
-        
+
         self.searchDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        
+
         self.fileList.headerItem().setText(self.fileList.columnCount(), "")
-        
+
         self.stopButton.setEnabled(False)
         self.stopButton.setIcon(UI.PixmapCache.getIcon("stopLoading"))
         self.stopButton.setAutoDefault(False)
         self.stopButton.clicked.connect(self.__stopSearch)
-        
+
         self.findButton.setIcon(UI.PixmapCache.getIcon("find"))
         self.findButton.setAutoDefault(False)
         self.findButton.clicked.connect(self.__searchFile)
-        
+
         self.clearButton.setEnabled(False)
         self.clearButton.setIcon(UI.PixmapCache.getIcon("clear"))
         self.clearButton.setAutoDefault(False)
         self.clearButton.clicked.connect(self.__clearResults)
-        
+
         self.openButton.setEnabled(False)
         self.openButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.openButton.setAutoDefault(False)
         self.openButton.clicked.connect(self.__openFile)
-        
+
         self.__project = project
         self.__project.projectOpened.connect(self.__projectOpened)
         self.__project.projectClosed.connect(self.__projectClosed)
-        
+
         self.extsepLabel.setText(os.extsep)
-        
+
         self.__shouldStop = False
-        
+
         self.fileNameEdit.returnPressed.connect(self.__searchFile)
         self.fileExtEdit.returnPressed.connect(self.__searchFile)
-        
+
         self.__projectClosed()
-    
+
     @pyqtSlot()
     def __stopSearch(self):
         """
         Private slot to handle the stop button being pressed.
         """
         self.__shouldStop = True
-    
+
     @pyqtSlot()
     def __openFile(self, itm=None):
         """
         Private slot to open a file.
-        
+
         It emits a signal depending on the file extension.
-        
+
         @param itm item to be opened
         @type QTreeWidgetItem
         """
@@ -124,7 +130,7 @@
             filePath = itm.text(1)
             fileExt = os.path.splitext(fileName)[1]
             fullName = os.path.join(filePath, fileName)
-            
+
             if fileExt == ".ui":
                 self.designerFile.emit(fullName)
             elif fileExt == ".ts":
@@ -142,7 +148,7 @@
                     self.sourceFile.emit(fullName)
                 else:
                     QDesktopServices.openUrl(QUrl(fullName))
-    
+
     @pyqtSlot()
     def __searchFile(self):
         """
@@ -150,49 +156,44 @@
         """
         fileName = self.fileNameEdit.text()
         fileExt = self.fileExtEdit.text()
-        
+
         self.findStatusLabel.clear()
-        
+
         patternFormat = (
-            "{0}{1}{2}"
-            if "*" in fileName or "?" in fileName else
-            "{0}*{1}{2}"
+            "{0}{1}{2}" if "*" in fileName or "?" in fileName else "{0}*{1}{2}"
         )
-        
-        fileNamePatterns = [patternFormat.format(
-            fileName or "*", os.extsep, fileExt or "*")]
-        
+
+        fileNamePatterns = [
+            patternFormat.format(fileName or "*", os.extsep, fileExt or "*")
+        ]
+
         if not fileExt:
             # search for files without extension as well
             if "*" in fileName or "?" in fileName:
                 patternFormat = "{0}"
             else:
                 patternFormat = "{0}*"
-            
+
             fileNamePatterns.append(patternFormat.format(fileName or "*"))
-        
+
         searchPaths = []
-        if (
-            self.searchDirCheckBox.isChecked() and
-            self.searchDirPicker.text() != ""
-        ):
+        if self.searchDirCheckBox.isChecked() and self.searchDirPicker.text() != "":
             searchPaths.append(self.searchDirPicker.text())
         if self.projectCheckBox.isChecked():
             searchPaths.append(self.__project.getProjectPath())
         if self.syspathCheckBox.isChecked():
             searchPaths.extend(sys.path)
-        
+
         self.fileList.clear()
         locations = {}
         self.__shouldStop = False
         self.stopButton.setEnabled(True)
         self.clearButton.setEnabled(False)
         QApplication.processEvents()
-        
+
         for path in searchPaths:
             if os.path.isdir(path):
-                files = direntries(path, True, fileNamePatterns,
-                                   False, self.checkStop)
+                files = direntries(path, True, fileNamePatterns, False, self.checkStop)
                 if files:
                     for file in files:
                         fp, fn = os.path.split(file)
@@ -205,21 +206,20 @@
                             locations[fn] = [fp]
                         QTreeWidgetItem(self.fileList, [fn, fp])
                     QApplication.processEvents()
-        
+
         del locations
         self.stopButton.setEnabled(False)
-        self.fileList.sortItems(self.fileList.sortColumn(),
-                                Qt.SortOrder.AscendingOrder)
-        self.fileList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.fileList.sortItems(self.fileList.sortColumn(), Qt.SortOrder.AscendingOrder)
+        self.fileList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.fileList.header().resizeSection(0, self.width() // 2)
         self.fileList.header().setStretchLastSection(True)
-        
-        self.findStatusLabel.setText(self.tr(
-            "%n file(s) found", "", self.fileList.topLevelItemCount()))
-        
+
+        self.findStatusLabel.setText(
+            self.tr("%n file(s) found", "", self.fileList.topLevelItemCount())
+        )
+
         self.clearButton.setEnabled(self.fileList.topLevelItemCount() != 0)
-    
+
     @pyqtSlot()
     def __clearResults(self):
         """
@@ -228,55 +228,55 @@
         self.fileList.clear()
         self.clearButton.setEnabled(False)
         self.openButton.setEnabled(False)
-    
+
     def checkStop(self):
         """
         Public method to check, if the search should be stopped.
-        
+
         @return flag indicating the search should be stopped
         @rtype bool
         """
         QApplication.processEvents()
         return self.__shouldStop
-    
+
     @pyqtSlot(str)
     def on_searchDirPicker_textChanged(self, text):
         """
         Private slot to handle the textChanged signal of the search directory
         edit.
-        
+
         @param text text of the search dir edit
         @type str
         """
         self.searchDirCheckBox.setEnabled(text != "")
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def on_fileList_itemActivated(self, itm, column):
         """
         Private slot to handle the double click on a file item.
-        
+
         It emits the signal sourceFile or designerFile depending on the
         file extension.
-        
+
         @param itm the double clicked listview item
         @type QTreeWidgetItem
         @param column column that was double clicked (ignored)
         @type int
         """
         self.__openFile(itm)
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_fileList_currentItemChanged(self, current, previous):
         """
         Private slot handling a change of the current item.
-        
+
         @param current current item
         @type QTreeWidgetItem
         @param previous prevoius current item
         @type QTreeWidgetItem
         """
         self.openButton.setEnabled(current is not None)
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
@@ -284,7 +284,7 @@
         """
         self.projectCheckBox.setEnabled(True)
         self.projectCheckBox.setChecked(True)
-    
+
     @pyqtSlot()
     def __projectClosed(self):
         """
@@ -292,7 +292,7 @@
         """
         self.projectCheckBox.setEnabled(False)
         self.projectCheckBox.setChecked(False)
-    
+
     @pyqtSlot()
     def activate(self):
         """
@@ -305,11 +305,11 @@
 class FindLocationDialog(QDialog):
     """
     Class implementing a dialog to search for files.
-    
+
     The occurrences found are displayed in a QTreeWidget showing the
     filename and the pathname. The file will be opened upon a double click
     onto the respective entry of the list or by pressing the open button.
-    
+
     @signal sourceFile(str) emitted to open a file in the editor
     @signal designerFile(str) emitted to open a Qt-Designer file
     @signal linguistFile(str) emitted to open a Qt-Linguist (*.ts) file
@@ -318,6 +318,7 @@
     @signal svgFile(str) emitted to open a SVG file
     @signal umlFile(str) emitted to open an eric UML file
     """
+
     sourceFile = pyqtSignal(str)
     designerFile = pyqtSignal(str)
     linguistFile = pyqtSignal(str)
@@ -325,11 +326,11 @@
     pixmapFile = pyqtSignal(str)
     svgFile = pyqtSignal(str)
     umlFile = pyqtSignal(str)
-    
+
     def __init__(self, project, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param parent parent widget of this dialog (defaults to None)
@@ -337,24 +338,23 @@
         """
         super().__init__(parent)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__layout = QVBoxLayout()
-        
+
         self.__findWidget = FindLocationWidget(project, self)
         self.__layout.addWidget(self.__findWidget)
-        
+
         self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close,
-            Qt.Orientation.Horizontal,
-            self
+            QDialogButtonBox.StandardButton.Close, Qt.Orientation.Horizontal, self
         )
-        self.__buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setAutoDefault(False)
+        self.__buttonBox.button(QDialogButtonBox.StandardButton.Close).setAutoDefault(
+            False
+        )
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.setLayout(self.__layout)
         self.resize(600, 800)
-        
+
         # connect the widgets
         self.__findWidget.sourceFile.connect(self.sourceFile)
         self.__findWidget.designerFile.connect(self.designerFile)
@@ -363,16 +363,16 @@
         self.__findWidget.pixmapFile.connect(self.pixmapFile)
         self.__findWidget.svgFile.connect(self.svgFile)
         self.__findWidget.umlFile.connect(self.umlFile)
-        
+
         self.__buttonBox.accepted.connect(self.accept)
         self.__buttonBox.rejected.connect(self.reject)
-    
+
     def activate(self):
         """
         Public method to activate the dialog.
         """
         self.__findWidget.activate()
-        
+
         self.raise_()
         self.activateWindow()
         self.show()
--- a/src/eric7/UI/Info.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Info.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,14 +8,11 @@
 """
 
 
-Program = 'eric7'
-Version = '@@VERSION@@ (rev. @@REVISION@@)'
-VersionOnly = '@@VERSION@@'
-Copyright = (
-    'Copyright (c) 2002 - 2022 Detlev Offenbach'
-    ' <detlev@die-offenbachs.de>'
-)
-CopyrightShort = '(c) 2002 - 2022 Detlev Offenbach'
-BugAddress = 'eric-bugs@eric-ide.python-projects.org'
-FeatureAddress = 'eric-featurerequest@eric-ide.python-projects.org'
+Program = "eric7"
+Version = "@@VERSION@@ (rev. @@REVISION@@)"
+VersionOnly = "@@VERSION@@"
+Copyright = "Copyright (c) 2002 - 2022 Detlev Offenbach" " <detlev@die-offenbachs.de>"
+CopyrightShort = "(c) 2002 - 2022 Detlev Offenbach"
+BugAddress = "eric-bugs@eric-ide.python-projects.org"
+FeatureAddress = "eric-featurerequest@eric-ide.python-projects.org"
 Homepage = "https://eric-ide.python-projects.org/index.html"
--- a/src/eric7/UI/InstallInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/InstallInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,103 +25,116 @@
     """
     Class implementing a dialog to show information about the installation.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__deleteButton = self.buttonBox.addButton(
-            self.tr("Delete Info"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Delete Info"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__deleteButton.clicked.connect(self.on_deleteButton_clicked)
         self.__updateButton = self.buttonBox.addButton(
-            self.tr("Upgrade Instructions"),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Upgrade Instructions"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__updateButton.clicked.connect(self.on_updateButton_clicked)
-        
+
         self.__edited = False
         self.__loaded = True
-        
+
         self.editButton.setIcon(UI.PixmapCache.getIcon("infoEdit"))
         self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSave"))
-        
+
         infoFileName = Globals.getInstallInfoFilePath()
-        
+
         self.__deleteButton.setEnabled(os.path.exists(infoFileName))
-        
+
         try:
             with open(infoFileName, "r") as infoFile:
                 self.__info = json.load(infoFile)
-            
+
             if Globals.isWindowsPlatform():
                 self.sudoLabel1.setText(self.tr("Installed as Administrator:"))
             else:
                 self.sudoLabel1.setText(self.tr("Installed with sudo:"))
             self.sudoLabel2.setText(
-                self.tr("Yes") if self.__info["sudo"] else self.tr("No"))
+                self.tr("Yes") if self.__info["sudo"] else self.tr("No")
+            )
             self.userLabel.setText(self.__info["user"])
             self.installedFromEdit.setText(self.__info["install_cwd"])
             self.interpreteEdit.setText(self.__info["exe"])
             self.commandEdit.setText(self.__info["argv"])
             self.installPathEdit.setText(self.__info["eric"])
             self.virtenvLabel.setText(
-                self.tr("Yes") if self.__info["virtualenv"] else self.tr("No"))
+                self.tr("Yes") if self.__info["virtualenv"] else self.tr("No")
+            )
             self.remarksEdit.setPlainText(self.__info["remarks"])
             if self.__info["pip"]:
-                self.pipLabel.setText(self.tr(
-                    "'eric-ide' was installed from PyPI using the pip"
-                    " command."))
+                self.pipLabel.setText(
+                    self.tr(
+                        "'eric-ide' was installed from PyPI using the pip" " command."
+                    )
+                )
             else:
                 self.pipLabel.hide()
             if self.__info["guessed"]:
-                self.guessLabel.setText(self.tr(
-                    "The information shown in this dialog was guessed at"
-                    " the first start of eric."))
+                self.guessLabel.setText(
+                    self.tr(
+                        "The information shown in this dialog was guessed at"
+                        " the first start of eric."
+                    )
+                )
             else:
                 self.guessLabel.hide()
             if self.__info["edited"]:
-                self.userProvidedLabel.setText(self.tr(
-                    "The installation information was provided by the user."
-                ))
+                self.userProvidedLabel.setText(
+                    self.tr("The installation information was provided by the user.")
+                )
             else:
                 self.userProvidedLabel.hide()
             if self.__info["installed_on"]:
                 self.installDateTimeLabel.setText(
-                    self.__info["installed_on"] if self.__info["installed_on"]
-                    else self.tr("unknown"))
-            
+                    self.__info["installed_on"]
+                    if self.__info["installed_on"]
+                    else self.tr("unknown")
+                )
+
             self.__updateButton.setEnabled(bool(self.__info["exe"]))
         except OSError as err:
             EricMessageBox.critical(
                 self,
                 self.tr("Load Install Information"),
-                self.tr("<p>The file containing the install information could"
-                        " not be read.</p><p>Reason: {0}</p>""")
-                .format(str(err))
+                self.tr(
+                    "<p>The file containing the install information could"
+                    " not be read.</p><p>Reason: {0}</p>"
+                    ""
+                ).format(str(err)),
             )
             self.__loaded = False
             self.__info = {}
-            
+
             self.__updateButton.setEnabled(False)
-    
+
     def wasLoaded(self):
         """
         Public method to check, if the install data was loaded.
-        
+
         @return flag indicating the data was loaded
         @rtype bool
         """
         return self.__loaded
-    
+
     @pyqtSlot(bool)
     def on_editButton_toggled(self, checked):
         """
         Private slot to switch the dialog into edit mode.
-        
+
         @param checked flag giving the button check state
         @type bool
         """
@@ -130,10 +143,10 @@
         self.commandEdit.setReadOnly(not checked)
         self.installPathEdit.setReadOnly(not checked)
         self.remarksEdit.setReadOnly(not checked)
-        
+
         if checked:
             self.__edited = True
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -141,7 +154,7 @@
         """
         if self.__edited:
             self.__saveData()
-    
+
     @pyqtSlot()
     def reject(self):
         """
@@ -151,14 +164,17 @@
             yes = EricMessageBox.yesNo(
                 self,
                 self.tr("Install Information"),
-                self.tr("""The install information was edited. Unsaved"""
-                        """ changes will be lost. Save first?"""),
-                yesDefault=True)
+                self.tr(
+                    """The install information was edited. Unsaved"""
+                    """ changes will be lost. Save first?"""
+                ),
+                yesDefault=True,
+            )
             if yes:
                 self.__saveData()
-        
+
         super().reject()
-    
+
     def __saveData(self):
         """
         Private method to save the data.
@@ -177,7 +193,7 @@
             self.__info["eric_edited"] = True
         self.__info["remarks"] = self.remarksEdit.toPlainText()
         self.__info["edited"] = True
-        
+
         infoFileName = Globals.getInstallInfoFilePath()
         try:
             with open(infoFileName, "w") as infoFile:
@@ -188,11 +204,13 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Save Install Information"),
-                self.tr("<p>The file containing the install information could"
-                        " not be written.</p><p>Reason: {0}</p>""")
-                .format(str(err))
+                self.tr(
+                    "<p>The file containing the install information could"
+                    " not be written.</p><p>Reason: {0}</p>"
+                    ""
+                ).format(str(err)),
             )
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -201,20 +219,23 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Delete Installation Information"),
-            self.tr("""Do you really want to delete the installation"""
-                    """ information? It will be recreated at the next"""
-                    """ start."""))
+            self.tr(
+                """Do you really want to delete the installation"""
+                """ information? It will be recreated at the next"""
+                """ start."""
+            ),
+        )
         if not res:
             return
-        
+
         infoFileName = Globals.getInstallInfoFilePath()
         os.remove(infoFileName)
-        
+
         # local data will be deleted automatically
         self.__edited = False
-        
+
         self.close()
-    
+
     @pyqtSlot()
     def on_updateButton_clicked(self):
         """
@@ -222,37 +243,39 @@
         """
         updateTextList = []
         cmdPrefix = ""
-        
+
         if self.__info["sudo"]:
             if Globals.isWindowsPlatform():
                 updateTextList.append(
-                    self.tr("Perform the following step(s) with Administrator"
-                            " privileges.\n"))
+                    self.tr(
+                        "Perform the following step(s) with Administrator"
+                        " privileges.\n"
+                    )
+                )
             else:
                 cmdPrefix = "sudo "
-        
+
         if self.__info["pip"]:
             updateTextList.append(
                 "{0}{1} -m pip install --upgrade eric-ide".format(
-                    cmdPrefix, self.__info["exe"],
+                    cmdPrefix,
+                    self.__info["exe"],
                 )
             )
         else:
-            if (
-                "install_cwd" in self.__info and
-                bool(self.__info["install_cwd"])
-            ):
-                updateTextList.append(
-                    "cd {0}".format(self.__info["install_cwd"])
-                )
+            if "install_cwd" in self.__info and bool(self.__info["install_cwd"]):
+                updateTextList.append("cd {0}".format(self.__info["install_cwd"]))
             updateTextList.append(
                 "{0}{1} {2}".format(
-                    cmdPrefix, self.__info["exe"], self.__info["argv"],
+                    cmdPrefix,
+                    self.__info["exe"],
+                    self.__info["argv"],
                 )
             )
-        
+
         from EricWidgets.EricPlainTextDialog import EricPlainTextDialog
+
         dlg = EricPlainTextDialog(
-            title=self.tr("Upgrade Instructions"),
-            text="\n".join(updateTextList))
+            title=self.tr("Upgrade Instructions"), text="\n".join(updateTextList)
+        )
         dlg.exec()
--- a/src/eric7/UI/LogView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/LogView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,12 @@
 from PyQt6.QtCore import pyqtSignal, Qt, QRegularExpression
 from PyQt6.QtGui import QBrush, QTextCursor, QTextDocument
 from PyQt6.QtWidgets import (
-    QTextEdit, QApplication, QMenu, QWidget, QHBoxLayout, QSizePolicy
+    QTextEdit,
+    QApplication,
+    QMenu,
+    QWidget,
+    QHBoxLayout,
+    QSizePolicy,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -24,66 +29,70 @@
     """
     Class implementing the containing widget for the log viewer.
     """
+
     def __init__(self, ui, parent=None):
         """
         Constructor
-        
+
         @param ui reference to the main window (UserInterface)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__ui = ui
-        
+
         self.__logViewer = LogViewerEdit(self)
         from .SearchWidget import SearchWidget
+
         self.__searchWidget = SearchWidget(self.__logViewer, self)
         self.__searchWidget.setSizePolicy(
-            QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred
+        )
         self.__searchWidget.hide()
-        
+
         self.__layout = QHBoxLayout(self)
         self.__layout.setContentsMargins(1, 1, 1, 1)
         self.__layout.addWidget(self.__logViewer)
         self.__layout.addWidget(self.__searchWidget)
-        
+
         self.__searchWidget.searchNext.connect(self.__logViewer.searchNext)
         self.__searchWidget.searchPrevious.connect(self.__logViewer.searchPrev)
         self.__logViewer.searchStringFound.connect(
-            self.__searchWidget.searchStringFound)
-        
+            self.__searchWidget.searchStringFound
+        )
+
     def appendToStdout(self, txt):
         """
         Public slot to appand text to the "stdout" tab.
-        
+
         @param txt text to be appended (string)
         """
         added = self.__logViewer.appendToStdout(txt)
         if added:
             self.__ui.showLogViewer()
-        
+
     def appendToStderr(self, txt):
         """
         Public slot to appand text to the "stderr" tab.
-        
+
         @param txt text to be appended (string)
         """
         added = self.__logViewer.appendToStderr(txt)
         if added:
             self.__ui.showLogViewer()
-        
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of the preferences.
         """
         self.__logViewer.preferencesChanged()
-        
+
     def showFind(self, txt=""):
         """
         Public method to display the search widget.
-        
+
         @param txt text to be shown in the combo (string)
         """
         self.__searchWidget.showFind(txt)
@@ -92,62 +101,62 @@
 class LogViewerEdit(QTextEdit):
     """
     Class providing a specialized text edit for displaying logging information.
-    
+
     @signal searchStringFound(found) emitted to indicate the search result
         (boolean)
     """
+
     searchStringFound = pyqtSignal(bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setAcceptRichText(False)
         self.setLineWrapMode(QTextEdit.LineWrapMode.NoWrap)
         self.setReadOnly(True)
-        
+
         self.__mainWindow = parent
         self.__lastSearch = ()
-        
+
         # create the context menu
         self.__menu = QMenu(self)
-        self.__menu.addAction(self.tr('Clear'), self.clear)
-        self.__menu.addAction(self.tr('Copy'), self.copy)
+        self.__menu.addAction(self.tr("Clear"), self.clear)
+        self.__menu.addAction(self.tr("Copy"), self.copy)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr('Find'), self.__find)
+        self.__menu.addAction(self.tr("Find"), self.__find)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr('Select All'), self.selectAll)
+        self.__menu.addAction(self.tr("Select All"), self.selectAll)
         self.__menu.addSeparator()
         self.__menu.addAction(self.tr("Configure..."), self.__configure)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__handleShowContextMenu)
-        
+
         self.cNormalFormat = self.currentCharFormat()
         self.cErrorFormat = self.currentCharFormat()
-        self.cErrorFormat.setForeground(
-            QBrush(Preferences.getUI("LogStdErrColour")))
-        
+        self.cErrorFormat.setForeground(QBrush(Preferences.getUI("LogStdErrColour")))
+
         self.__stdoutFilter = Preferences.getUI("LogViewerStdoutFilter")
         self.__stderrFilter = Preferences.getUI("LogViewerStderrFilter")
         self.__stdxxxFilter = Preferences.getUI("LogViewerStdxxxFilter")
-        
+
     def __handleShowContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         coord = self.mapToGlobal(coord)
         self.__menu.popup(coord)
-        
+
     def __appendText(self, txt, isErrorMessage=False):
         """
         Private method to append text to the end.
-        
+
         @param txt text to insert (string)
         @param isErrorMessage flag indicating to insert error text (boolean)
         """
@@ -160,11 +169,11 @@
             self.setCurrentCharFormat(self.cNormalFormat)
         self.insertPlainText(Utilities.filterAnsiSequences(txt))
         self.ensureCursorVisible()
-        
+
     def __filterMessage(self, message, isErrorMessage=False):
         """
         Private method to filter messages.
-        
+
         @param message message to be checked (string)
         @param isErrorMessage flag indicating to check an error message
             (boolean)
@@ -172,71 +181,70 @@
             (boolean)
         """
         message = Utilities.filterAnsiSequences(message)
-        
+
         filters = (
             self.__stderrFilter + self.__stdxxxFilter
-            if isErrorMessage else
-            self.__stdoutFilter + self.__stdxxxFilter
+            if isErrorMessage
+            else self.__stdoutFilter + self.__stdxxxFilter
         )
-        
+
         return any(msgFilter in message for msgFilter in filters)
-        
+
     def appendToStdout(self, txt):
         """
         Public slot to appand text to the "stdout" tab.
-        
+
         @param txt text to be appended (string)
         @return flag indicating text was appended (boolean)
         """
         if self.__filterMessage(txt, isErrorMessage=False):
             return False
-        
+
         self.__appendText(txt, isErrorMessage=False)
         QApplication.processEvents()
         return True
-        
+
     def appendToStderr(self, txt):
         """
         Public slot to appand text to the "stderr" tab.
-        
+
         @param txt text to be appended (string)
         @return flag indicating text was appended (boolean)
         """
         if self.__filterMessage(txt, isErrorMessage=True):
             return False
-        
+
         self.__appendText(txt, isErrorMessage=True)
         QApplication.processEvents()
         return True
-        
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of the preferences.
         """
-        self.cErrorFormat.setForeground(
-            QBrush(Preferences.getUI("LogStdErrColour")))
-        
+        self.cErrorFormat.setForeground(QBrush(Preferences.getUI("LogStdErrColour")))
+
         self.__stdoutFilter = Preferences.getUI("LogViewerStdoutFilter")
         self.__stderrFilter = Preferences.getUI("LogViewerStderrFilter")
         self.__stdxxxFilter = Preferences.getUI("LogViewerStdxxxFilter")
-        
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
         ericApp().getObject("UserInterface").showPreferences("logViewerPage")
-        
+
     def __find(self):
         """
         Private slot to show the find widget.
         """
         txt = self.textCursor().selectedText()
         self.__mainWindow.showFind(txt)
-        
+
     def searchNext(self, txt, caseSensitive, wholeWord, regexp):
         """
         Public method to search the next occurrence of the given text.
-        
+
         @param txt text to search for
         @type str
         @param caseSensitive flag indicating to perform a case sensitive
@@ -255,22 +263,24 @@
         if wholeWord:
             flags |= QTextDocument.FindFlag.FindWholeWords
         ok = (
-            self.find(QRegularExpression(
-                txt,
-                QRegularExpression.PatternOption.NoPatternOption
-                if caseSensitive
-                else QRegularExpression.PatternOption.CaseInsensitiveOption),
-                flags
+            self.find(
+                QRegularExpression(
+                    txt,
+                    QRegularExpression.PatternOption.NoPatternOption
+                    if caseSensitive
+                    else QRegularExpression.PatternOption.CaseInsensitiveOption,
+                ),
+                flags,
             )
-            if regexp else
-            self.find(txt, flags)
+            if regexp
+            else self.find(txt, flags)
         )
         self.searchStringFound.emit(ok)
-        
+
     def searchPrev(self, txt, caseSensitive, wholeWord, regexp):
         """
         Public method to search the previous occurrence of the given text.
-        
+
         @param txt text to search for
         @type str
         @param caseSensitive flag indicating to perform a case sensitive
@@ -289,22 +299,24 @@
         if wholeWord:
             flags |= QTextDocument.FindFlag.FindWholeWords
         ok = (
-            self.find(QRegularExpression(
-                txt,
-                QRegularExpression.PatternOption.NoPatternOption
-                if caseSensitive
-                else QRegularExpression.PatternOption.CaseInsensitiveOption),
-                flags
+            self.find(
+                QRegularExpression(
+                    txt,
+                    QRegularExpression.PatternOption.NoPatternOption
+                    if caseSensitive
+                    else QRegularExpression.PatternOption.CaseInsensitiveOption,
+                ),
+                flags,
             )
-            if regexp else
-            self.find(txt, flags)
+            if regexp
+            else self.find(txt, flags)
         )
         self.searchStringFound.emit(ok)
-        
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key press events.
-        
+
         @param evt key press event (QKeyEvent)
         """
         if evt.modifiers() == Qt.KeyboardModifier.ControlModifier:
@@ -321,17 +333,17 @@
                 evt.accept()
                 return
         elif (
-            evt.modifiers() == Qt.KeyboardModifier.NoModifier and
-            evt.key() == Qt.Key.Key_F3 and
-            self.__lastSearch
+            evt.modifiers() == Qt.KeyboardModifier.NoModifier
+            and evt.key() == Qt.Key.Key_F3
+            and self.__lastSearch
         ):
             self.searchNext(*self.__lastSearch)
             evt.accept()
             return
         elif (
-            evt.modifiers() == Qt.KeyboardModifier.ShiftModifier and
-            evt.key() == Qt.Key.Key_F3 and
-            self.__lastSearch
+            evt.modifiers() == Qt.KeyboardModifier.ShiftModifier
+            and evt.key() == Qt.Key.Key_F3
+            and self.__lastSearch
         ):
             self.searchPrev(*self.__lastSearch)
             evt.accept()
--- a/src/eric7/UI/NotificationWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/NotificationWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,6 +24,7 @@
     """
     Class implementing the notification types.
     """
+
     INFORMATION = 0
     WARNING = 1
     CRITICAL = 2
@@ -34,13 +35,15 @@
     """
     Class implementing a Notification widget.
     """
+
     NotificationStyleSheetTemplate = "color:{0};background-color:{1};"
-    
-    def __init__(self, icon, heading, text,
-                 kind=NotificationTypes.INFORMATION, parent=None):
+
+    def __init__(
+        self, icon, heading, text, kind=NotificationTypes.INFORMATION, parent=None
+    ):
         """
         Constructor
-        
+
         @param icon icon to be used
         @type QPixmap
         @param heading heading to be used
@@ -54,29 +57,29 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.layout().setAlignment(
             self.verticalLayout,
-            Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter
+            Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter,
         )
-        
+
         self.setStyleSheet(NotificationFrame.getStyleSheet(kind))
-        
+
         if icon is None:
             icon = NotificationFrame.getIcon(kind)
         self.icon.setPixmap(icon)
-        
+
         self.heading.setText(heading)
         self.text.setText(text)
-        
+
         self.show()
         self.adjustSize()
-    
+
     @classmethod
     def getIcon(cls, kind):
         """
         Class method to get the icon for a specific notification kind.
-        
+
         @param kind notification kind
         @type NotificationTypes
         @return icon for the notification kind
@@ -84,18 +87,18 @@
         """
         if kind == NotificationTypes.CRITICAL:
             return UI.PixmapCache.getPixmap("notificationCritical48")
-        elif kind == NotificationTypes.WARNING:                 # __NO-TASK__
+        elif kind == NotificationTypes.WARNING:  # __NO-TASK__
             return UI.PixmapCache.getPixmap("notificationWarning48")
         elif kind == NotificationTypes.INFORMATION:
             return UI.PixmapCache.getPixmap("notificationInformation48")
         else:
             return UI.PixmapCache.getPixmap("notification48")
-    
+
     @classmethod
     def getStyleSheet(cls, kind):
         """
         Class method to get a style sheet for specific notification kind.
-        
+
         @param kind notification kind
         @type NotificationTypes
         @return string containing the style sheet for the notification kind
@@ -104,12 +107,12 @@
         if kind == NotificationTypes.CRITICAL:
             return NotificationFrame.NotificationStyleSheetTemplate.format(
                 Preferences.getUI("NotificationCriticalForeground"),
-                Preferences.getUI("NotificationCriticalBackground")
+                Preferences.getUI("NotificationCriticalBackground"),
             )
-        elif kind == NotificationTypes.WARNING:                 # __NO-TASK__
+        elif kind == NotificationTypes.WARNING:  # __NO-TASK__
             return NotificationFrame.NotificationStyleSheetTemplate.format(
                 Preferences.getUI("NotificationWarningForeground"),
-                Preferences.getUI("NotificationWarningBackground")
+                Preferences.getUI("NotificationWarningBackground"),
             )
         else:
             return ""
@@ -119,10 +122,11 @@
     """
     Class implementing a Notification list widget.
     """
+
     def __init__(self, parent=None, setPosition=False):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param setPosition flag indicating to set the display
@@ -130,36 +134,37 @@
         @type bool
         """
         super().__init__(parent)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.setLayout(self.__layout)
-        
+
         self.__timeout = 5000
         self.__dragPosition = QPoint()
         self.__timers = {}
         self.__notifications = []
-        
+
         self.__settingPosition = setPosition
-        
+
         flags = (
-            Qt.WindowType.Tool |
-            Qt.WindowType.FramelessWindowHint |
-            Qt.WindowType.WindowStaysOnTopHint |
-            Qt.WindowType.X11BypassWindowManagerHint
+            Qt.WindowType.Tool
+            | Qt.WindowType.FramelessWindowHint
+            | Qt.WindowType.WindowStaysOnTopHint
+            | Qt.WindowType.X11BypassWindowManagerHint
         )
         if Globals.isWindowsPlatform():
             flags |= Qt.WindowType.ToolTip
         self.setWindowFlags(flags)
-        
+
         if self.__settingPosition:
             self.setCursor(Qt.CursorShape.OpenHandCursor)
-    
-    def showNotification(self, icon, heading, text,
-                         kind=NotificationTypes.INFORMATION, timeout=0):
+
+    def showNotification(
+        self, icon, heading, text, kind=NotificationTypes.INFORMATION, timeout=0
+    ):
         """
         Public method to show a notification.
-        
+
         @param icon icon to be used
         @type QPixmap
         @param heading heading to be used
@@ -173,30 +178,29 @@
         @type int
         """
         notificationFrame = NotificationFrame(
-            icon, heading, text, kind=kind, parent=self)
+            icon, heading, text, kind=kind, parent=self
+        )
         self.__layout.addWidget(notificationFrame)
         self.__notifications.append(notificationFrame)
-        
+
         self.show()
-        
+
         self.__adjustSizeAndPosition()
-        
+
         if timeout:
             timer = QTimer()
             self.__timers[id(notificationFrame)] = timer
             timer.setSingleShot(True)
-            timer.timeout.connect(
-                lambda: self.__removeNotification(notificationFrame)
-            )
+            timer.timeout.connect(lambda: self.__removeNotification(notificationFrame))
             timer.setInterval(timeout * 1000)
             timer.start()
-    
+
     def __adjustSizeAndPosition(self):
         """
         Private slot to adjust the notification list widget size and position.
         """
         self.adjustSize()
-        
+
         if not self.__settingPosition:
             pos = Preferences.getUI("NotificationPosition")
             try:
@@ -204,9 +208,10 @@
             except AttributeError:
                 # < Qt 5.15
                 from PyQt6.QtGui import QGuiApplication
+
                 screen = QGuiApplication.screenAt(pos)
             screenGeom = screen.geometry()
-            
+
             newX = pos.x()
             newY = pos.y()
             if newX < screenGeom.x():
@@ -217,40 +222,40 @@
                 newX = screenGeom.width() - self.width()
             if newY + self.height() > screenGeom.height():
                 newY = screenGeom.height() - self.height()
-            
+
             self.move(newX, newY)
-    
+
     def __removeNotification(self, notification):
         """
         Private method to remove a notification from the list.
-        
+
         @param notification reference to the notification to be removed
         @type NotificationFrame
         """
         notification.hide()
-        
+
         # delete timer of an auto close notification
         key = id(notification)
         if key in self.__timers:
             self.__timers[key].stop()
             del self.__timers[key]
-        
+
         # delete the notification
         index = self.__layout.indexOf(notification)
         self.__layout.takeAt(index)
         with contextlib.suppress(ValueError):
             self.__notifications.remove(notification)
             notification.deleteLater()
-        
+
         if self.__layout.count():
             self.__adjustSizeAndPosition()
         else:
             self.hide()
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle presses of a mouse button.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if not self.__settingPosition:
@@ -259,30 +264,27 @@
                 clickedNotification = clickedLabel.parent()
                 self.__removeNotification(clickedNotification)
             return
-        
+
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__dragPosition = (
                 evt.globalPosition().toPoint() - self.frameGeometry().topLeft()
             )
             self.setCursor(Qt.CursorShape.ClosedHandCursor)
             evt.accept()
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle releases of a mouse button.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
-        if (
-            self.__settingPosition and
-            evt.button() == Qt.MouseButton.LeftButton
-        ):
+        if self.__settingPosition and evt.button() == Qt.MouseButton.LeftButton:
             self.setCursor(Qt.CursorShape.OpenHandCursor)
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle dragging the window.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.buttons() & Qt.MouseButton.LeftButton:
--- a/src/eric7/UI/NumbersWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/NumbersWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,39 +21,40 @@
     """
     Class implementing a model for entering binary numbers.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__bits = 0
         self.__value = 0
-    
+
     def rowCount(self, parent):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of columns (integer)
         """
         return 1
-    
+
     def columnCount(self, parent):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of columns (integer)
         """
         return self.__bits
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
@@ -63,67 +64,66 @@
                 return Qt.CheckState.Checked
             else:
                 return Qt.CheckState.Unchecked
-        
+
         elif role == Qt.ItemDataRole.DisplayRole:
             return ""
-        
+
         return None
-    
+
     def flags(self, index):
         """
         Public method to get flags from the model.
-        
+
         @param index index to get flags for (QModelIndex)
         @return flags (Qt.ItemFlags)
         """
         return (
-            Qt.ItemFlag.ItemIsUserCheckable |
-            Qt.ItemFlag.ItemIsEnabled |
-            Qt.ItemFlag.ItemIsSelectable
+            Qt.ItemFlag.ItemIsUserCheckable
+            | Qt.ItemFlag.ItemIsEnabled
+            | Qt.ItemFlag.ItemIsSelectable
         )
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get header data from the model.
-        
+
         @param section section number (integer)
         @param orientation orientation (Qt.Orientation)
         @param role role of the data to retrieve (Qt.ItemDataRole)
         @return requested data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             return str(self.__bits - section - 1)
-        
+
         return QAbstractTableModel.headerData(self, section, orientation, role)
-    
+
     def setBits(self, bits):
         """
         Public slot to set the number of bits.
-        
+
         @param bits number of bits to show (integer)
         """
         self.beginResetModel()
         self.__bits = bits
         self.endResetModel()
-    
+
     def setValue(self, value):
         """
         Public slot to set the value to show.
-        
+
         @param value value to show (integer)
         """
         self.beginResetModel()
         self.__value = value
         self.endResetModel()
-    
+
     def setBitsAndValue(self, bits, value):
         """
         Public slot to set the number of bits and the value to show.
-        
+
         @param bits number of bits to show (integer)
         @param value value to show (integer)
         """
@@ -131,19 +131,19 @@
         self.__value = value
         self.beginResetModel()
         self.endResetModel()
-    
+
     def getValue(self):
         """
         Public slot to get the current value.
-        
+
         @return current value of the model (integer)
         """
         return self.__value
-    
+
     def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
         """
         Public method to set the data of a node cell.
-        
+
         @param index index of the node cell (QModelIndex)
         @param value value to be set
         @param role role of the data (integer)
@@ -151,41 +151,42 @@
         """
         if role == Qt.ItemDataRole.CheckStateRole:
             if Qt.CheckState(value) == Qt.CheckState.Checked:
-                self.__value |= (1 << self.__bits - index.column() - 1)
+                self.__value |= 1 << self.__bits - index.column() - 1
             else:
                 self.__value &= ~(1 << self.__bits - index.column() - 1)
             self.dataChanged.emit(index, index)
             return True
-        
+
         return False
 
 
 class NumbersWidget(QWidget, Ui_NumbersWidget):
     """
     Class implementing a widget to show numbers in different formats.
-    
+
     @signal insertNumber(str) emitted after the user has entered a number
             and selected the number format
     """
+
     insertNumber = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__badNumberSheet = (
             "background-color: #b31b1b;"
-            if ericApp().usesDarkPalette() else
-            "background-color: #ffa0a0;"
+            if ericApp().usesDarkPalette()
+            else "background-color: #ffa0a0;"
         )
-        
+
         self.binInButton.setIcon(UI.PixmapCache.getIcon("2downarrow"))
         self.binOutButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
         self.octInButton.setIcon(UI.PixmapCache.getIcon("2downarrow"))
@@ -194,92 +195,93 @@
         self.decOutButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
         self.hexInButton.setIcon(UI.PixmapCache.getIcon("2downarrow"))
         self.hexOutButton.setIcon(UI.PixmapCache.getIcon("2uparrow"))
-        
+
         self.formatBox.addItem(self.tr("Auto"), 0)
         self.formatBox.addItem(self.tr("Dec"), 10)
         self.formatBox.addItem(self.tr("Hex"), 16)
         self.formatBox.addItem(self.tr("Oct"), 8)
         self.formatBox.addItem(self.tr("Bin"), 2)
-        
+
         self.sizeBox.addItem("8", 8)
         self.sizeBox.addItem("16", 16)
         self.sizeBox.addItem("32", 32)
         self.sizeBox.addItem("64", 64)
-        
+
         self.__input = 0
         self.__inputValid = True
         self.__bytes = 1
-        
+
         self.__model = BinaryModel(self)
         self.binTable.setModel(self.__model)
         self.binTable.horizontalHeader().setSectionResizeMode(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.__model.setBitsAndValue(self.__bytes * 8, self.__input)
         self.__model.dataChanged.connect(self.__binModelDataChanged)
-    
+
     def __formatNumbers(self, numberFormat):
         """
         Private method to format the various number inputs.
-        
+
         @param numberFormat number format indicator (integer)
         """
         self.__block(True)
-        
+
         self.binEdit.setStyleSheet("")
         self.octEdit.setStyleSheet("")
         self.decEdit.setStyleSheet("")
         self.hexEdit.setStyleSheet("")
-        
+
         # determine byte count
         byteCount = 8
         tmp = self.__input
         for _ in range(8):
-            c = (tmp & 0xff00000000000000) >> 7 * 8
+            c = (tmp & 0xFF00000000000000) >> 7 * 8
             if c != 0 and self.__input >= 0:
                 break
-            if c != 0xff and self.__input < 0:
+            if c != 0xFF and self.__input < 0:
                 break
             tmp <<= 8
             byteCount -= 1
         if byteCount == 0:
             byteCount = 1
         self.__bytes = byteCount
-        
+
         bytesIn = self.sizeBox.itemData(self.sizeBox.currentIndex()) // 8
         if bytesIn and byteCount > bytesIn:
             self.sizeBox.setStyleSheet(self.__badNumberSheet)
         else:
             self.sizeBox.setStyleSheet("")
-        
+
         # octal
         if numberFormat != 8:
             self.octEdit.setText("{0:0{1}o}".format(self.__input, bytesIn * 3))
-        
+
         # decimal
         if numberFormat != 10:
             self.decEdit.setText("{0:d}".format(self.__input))
-        
+
         # hexadecimal
         if numberFormat != 16:
             self.hexEdit.setText("{0:0{1}x}".format(self.__input, bytesIn * 2))
-        
+
         # octal
         if numberFormat != 8:
             self.octEdit.setText("{0:0{1}o}".format(self.__input, bytesIn * 3))
-        
+
         # binary
         if numberFormat != 2:
             num = "{0:0{1}b}".format(self.__input, bytesIn * 8)
             self.binEdit.setText(num)
-        
+
         self.__model.setBitsAndValue(len(self.binEdit.text()), self.__input)
-        
+
         self.__block(False)
-    
+
     def __block(self, b):
         """
         Private slot to block some signals.
-        
+
         @param b flah indicating the blocking state (boolean)
         """
         self.hexEdit.blockSignals(b)
@@ -287,16 +289,16 @@
         self.octEdit.blockSignals(b)
         self.binEdit.blockSignals(b)
         self.binTable.blockSignals(b)
-    
+
     @pyqtSlot(int)
     def on_sizeBox_valueChanged(self, value):
         """
         Private slot handling a change of the bit size.
-        
+
         @param value selected bit size (integer)
         """
         self.__formatNumbers(10)
-    
+
     @pyqtSlot()
     def on_byteOrderButton_clicked(self):
         """
@@ -305,17 +307,17 @@
         bytesIn = self.sizeBox.itemData(self.sizeBox.currentIndex()) // 8
         if bytesIn == 0:
             bytesIn = self.__bytes
-        
+
         tmp1 = self.__input
         tmp2 = 0
         for _ in range(bytesIn):
             tmp2 <<= 8
-            tmp2 |= tmp1 & 0xff
+            tmp2 |= tmp1 & 0xFF
             tmp1 >>= 8
-        
+
         self.__input = tmp2
         self.__formatNumbers(0)
-    
+
     @pyqtSlot()
     def on_binInButton_clicked(self):
         """
@@ -324,15 +326,15 @@
         number = ericApp().getObject("ViewManager").getNumber()
         if number == "":
             return
-        
+
         self.binEdit.setText(number)
         self.binEdit.setFocus()
-    
+
     @pyqtSlot(str)
     def on_binEdit_textChanged(self, txt):
         """
         Private slot to handle input of a binary number.
-        
+
         @param txt text entered (string)
         """
         try:
@@ -340,23 +342,23 @@
             self.__inputValid = True
         except ValueError:
             self.__inputValid = False
-        
+
         if self.__inputValid:
             self.__formatNumbers(2)
         else:
             self.binEdit.setStyleSheet(self.__badNumberSheet)
-    
+
     @pyqtSlot()
     def on_binOutButton_clicked(self):
         """
         Private slot to send a binary number.
         """
         self.insertNumber.emit(self.binEdit.text())
-    
+
     def __binModelDataChanged(self, start, end):
         """
         Private slot to handle a change of the binary model value by the user.
-        
+
         @param start start index (QModelIndex)
         @param end end index (QModelIndex)
         """
@@ -364,7 +366,7 @@
         bytesIn = self.sizeBox.itemData(self.sizeBox.currentIndex()) // 8
         num = "{0:0{1}b}".format(val, bytesIn * 8)
         self.binEdit.setText(num)
-    
+
     @pyqtSlot()
     def on_octInButton_clicked(self):
         """
@@ -373,15 +375,15 @@
         number = ericApp().getObject("ViewManager").getNumber()
         if number == "":
             return
-        
+
         self.octEdit.setText(number)
         self.octEdit.setFocus()
-    
+
     @pyqtSlot(str)
     def on_octEdit_textChanged(self, txt):
         """
         Private slot to handle input of an octal number.
-        
+
         @param txt text entered (string)
         """
         try:
@@ -389,19 +391,19 @@
             self.__inputValid = True
         except ValueError:
             self.__inputValid = False
-        
+
         if self.__inputValid:
             self.__formatNumbers(8)
         else:
             self.octEdit.setStyleSheet(self.__badNumberSheet)
-    
+
     @pyqtSlot()
     def on_octOutButton_clicked(self):
         """
         Private slot to send an octal number.
         """
         self.insertNumber.emit(self.octEdit.text())
-    
+
     @pyqtSlot()
     def on_decInButton_clicked(self):
         """
@@ -410,15 +412,15 @@
         number = ericApp().getObject("ViewManager").getNumber()
         if number == "":
             return
-        
+
         self.decEdit.setText(number)
         self.decEdit.setFocus()
-    
+
     @pyqtSlot(str)
     def on_decEdit_textChanged(self, txt):
         """
         Private slot to handle input of a decimal number.
-        
+
         @param txt text entered (string)
         """
         try:
@@ -426,19 +428,19 @@
             self.__inputValid = True
         except ValueError:
             self.__inputValid = False
-        
+
         if self.__inputValid:
             self.__formatNumbers(10)
         else:
             self.decEdit.setStyleSheet(self.__badNumberSheet)
-    
+
     @pyqtSlot()
     def on_decOutButton_clicked(self):
         """
         Private slot to send a decimal number.
         """
         self.insertNumber.emit(self.decEdit.text())
-    
+
     @pyqtSlot()
     def on_hexInButton_clicked(self):
         """
@@ -447,15 +449,15 @@
         number = ericApp().getObject("ViewManager").getNumber()
         if number == "":
             return
-        
+
         self.hexEdit.setText(number)
         self.hexEdit.setFocus()
-    
+
     @pyqtSlot(str)
     def on_hexEdit_textChanged(self, txt):
         """
         Private slot to handle input of a hexadecimal number.
-        
+
         @param txt text entered (string)
         """
         try:
@@ -463,12 +465,12 @@
             self.__inputValid = True
         except ValueError:
             self.__inputValid = False
-        
+
         if self.__inputValid:
             self.__formatNumbers(16)
         else:
             self.hexEdit.setStyleSheet(self.__badNumberSheet)
-    
+
     @pyqtSlot()
     def on_hexOutButton_clicked(self):
         """
--- a/src/eric7/UI/PixmapCache.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/PixmapCache.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,8 +17,9 @@
     """
     Class implementing a pixmap cache for icons.
     """
+
     SupportedExtensions = [".svgz", ".svg", ".png"]
-    
+
     def __init__(self):
         """
         Constructor
@@ -40,11 +41,10 @@
         if key:
             basename, ext = os.path.splitext(key)
             if size and not size.isEmpty():
-                key = "{0}_{1}_{2}".format(
-                    basename, size.width(), size.height())
+                key = "{0}_{1}_{2}".format(basename, size.width(), size.height())
             else:
                 key = basename
-            
+
             try:
                 return self.pixmapCache[key]
             except KeyError:
@@ -64,32 +64,33 @@
                         break
                 else:
                     pm = QPixmap()
-                
+
                 self.pixmapCache[key] = pm
                 return self.pixmapCache[key]
-        
+
         return QPixmap()
 
     def addSearchPath(self, path):
         """
         Public method to add a path to the search path.
-        
+
         @param path path to add
         @type str
         """
         if path not in self.searchPath:
             self.searchPath.append(path)
-    
+
     def removeSearchPath(self, path):
         """
         Public method to remove a path from the search path.
-        
+
         @param path path to remove
         @type str
         """
         if path in self.searchPath:
             self.searchPath.remove(path)
 
+
 pixCache = PixmapCache()
 
 
@@ -197,7 +198,7 @@
 def removeSearchPath(path, cache=pixCache):
     """
     Public method to remove a path from the search path.
-    
+
     @param path path to remove
     @type str
     @param cache reference to the pixmap cache object
--- a/src/eric7/UI/Previewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Previewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,132 +20,129 @@
     Class implementing a previewer widget containing a stack of
     specialized previewers.
     """
+
     def __init__(self, viewmanager, parent=None):
         """
         Constructor
-        
+
         @param viewmanager reference to the viewmanager object
         @type ViewManager
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__vm = viewmanager
-        
+
         self.__firstShow = True
-        
+
         self.__htmlPreviewer = None
         self.__qssPreviewer = None
-        
+
         # Don't update too often because the UI might become sluggish
         self.__typingTimer = QTimer()
         self.__typingTimer.setInterval(
-            Preferences.getEditor("PreviewRefreshWaitTimer"))   # default 500ms
+            Preferences.getEditor("PreviewRefreshWaitTimer")
+        )  # default 500ms
         self.__typingTimer.timeout.connect(self.__processEditor)
-        
+
         self.__vm.editorChangedEd.connect(self.__editorChanged)
         self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged)
         self.__vm.editorTextChanged.connect(self.__editorTextChanged)
 
         self.__vm.previewStateChanged.connect(self.__previewStateChanged)
-        
+
         self.hide()
-    
+
     def setSplitter(self, splitter):
         """
         Public method to set the splitter.
-        
+
         @param splitter reference to the embedding splitter
         @type QSplitter
         """
         self.__splitter = splitter
         self.__splitter.splitterMoved.connect(self.__splitterMoved)
-    
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
         Public slot handling a change of preferences.
         """
-        self.__typingTimer.setInterval(
-            Preferences.getEditor("PreviewRefreshWaitTimer"))
-    
+        self.__typingTimer.setInterval(Preferences.getEditor("PreviewRefreshWaitTimer"))
+
     def show(self):
         """
         Public method to show the preview widget.
         """
         super().show()
         if self.__firstShow:
-            self.__splitter.restoreState(
-                Preferences.getUI("PreviewSplitterState"))
+            self.__splitter.restoreState(Preferences.getUI("PreviewSplitterState"))
             self.__firstShow = False
         self.__typingTimer.start()
-    
+
     def hide(self):
         """
         Public method to hide the preview widget.
         """
         super().hide()
         self.__typingTimer.stop()
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         self.__typingTimer.stop()
         self.__htmlPreviewer and self.__htmlPreviewer.shutdown()
-    
+
     def __splitterMoved(self):
         """
         Private slot to handle the movement of the embedding splitter's handle.
         """
         state = self.__splitter.saveState()
         Preferences.setUI("PreviewSplitterState", state)
-    
+
     def __editorChanged(self, editor):
         """
         Private slot to handle a change of the current editor.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         if editor is None:
             self.hide()
             return
-        
-        if (
-            Preferences.getUI("ShowFilePreview") and
-            self.__isPreviewable(editor)
-        ):
+
+        if Preferences.getUI("ShowFilePreview") and self.__isPreviewable(editor):
             self.show()
             self.__processEditor()
         else:
             self.hide()
-    
+
     def __editorLanguageChanged(self, editor):
         """
         Private slot to handle a change of the current editor's language.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         self.__editorChanged(editor)
-    
+
     def __editorTextChanged(self, editor):
         """
         Private slot to handle changes of an editor's text.
-        
+
         @param editor reference to the editor
         @type Editor
         """
         if self.isVisible():
             self.__typingTimer.stop()
             self.__typingTimer.start()
-    
+
     def __previewStateChanged(self, on):
         """
         Private slot to toggle the display of the preview.
-        
+
         @param on flag indicating to show a preview
         @type bool
         """
@@ -154,12 +151,12 @@
             self.show()
         else:
             self.hide()
-    
+
     def __isPreviewable(self, editor):
         """
         Private method to check, if a preview can be shown for the given
         editor.
-        
+
         @param editor reference to an editor
         @type Editor
         @return flag indicating if a preview can be shown
@@ -168,64 +165,65 @@
         if editor:
             if bool(editor.getFileName()):
                 extension = os.path.normcase(
-                    os.path.splitext(editor.getFileName())[1][1:])
+                    os.path.splitext(editor.getFileName())[1][1:]
+                )
                 return extension in (
-                    Preferences.getEditor("PreviewHtmlFileNameExtensions") +
-                    Preferences.getEditor(
-                        "PreviewMarkdownFileNameExtensions") +
-                    Preferences.getEditor("PreviewRestFileNameExtensions") +
-                    Preferences.getEditor("PreviewQssFileNameExtensions")
+                    Preferences.getEditor("PreviewHtmlFileNameExtensions")
+                    + Preferences.getEditor("PreviewMarkdownFileNameExtensions")
+                    + Preferences.getEditor("PreviewRestFileNameExtensions")
+                    + Preferences.getEditor("PreviewQssFileNameExtensions")
                 )
             elif editor.getLanguage().lower() in [
-                    "html", "markdown", "restructuredtext", "qss"]:
+                "html",
+                "markdown",
+                "restructuredtext",
+                "qss",
+            ]:
                 return True
-        
+
         return False
-    
+
     def __processEditor(self):
         """
         Private slot to schedule the processing of the current editor's text.
         """
         self.__typingTimer.stop()
-        
+
         editor = self.__vm.activeWindow()
         if editor is not None:
             fn = editor.getFileName()
-            
+
             if fn:
                 extension = os.path.normcase(os.path.splitext(fn)[1][1:])
             else:
                 extension = ""
             if (
-                extension in Preferences.getEditor(
-                    "PreviewHtmlFileNameExtensions") or
-                editor.getLanguage().lower() == "html"
+                extension in Preferences.getEditor("PreviewHtmlFileNameExtensions")
+                or editor.getLanguage().lower() == "html"
             ):
                 language = "HTML"
             elif (
-                extension in Preferences.getEditor(
-                    "PreviewMarkdownFileNameExtensions") or
-                editor.getLanguage().lower() == "markdown"
+                extension in Preferences.getEditor("PreviewMarkdownFileNameExtensions")
+                or editor.getLanguage().lower() == "markdown"
             ):
                 language = "Markdown"
             elif (
-                extension in Preferences.getEditor(
-                    "PreviewRestFileNameExtensions") or
-                editor.getLanguage().lower() == "restructuredtext"
+                extension in Preferences.getEditor("PreviewRestFileNameExtensions")
+                or editor.getLanguage().lower() == "restructuredtext"
             ):
                 language = "ReST"
             elif (
-                extension in Preferences.getEditor(
-                    "PreviewQssFileNameExtensions") or
-                editor.getLanguage().lower() == "qss"
+                extension in Preferences.getEditor("PreviewQssFileNameExtensions")
+                or editor.getLanguage().lower() == "qss"
             ):
                 language = "QSS"
             else:
                 language = ""
-            
+
             if language in ["HTML", "Markdown", "ReST"]:
                 if self.__htmlPreviewer is None:
                     from .Previewers.PreviewerHTML import PreviewerHTML
+
                     self.__htmlPreviewer = PreviewerHTML()
                     self.addWidget(self.__htmlPreviewer)
                 self.setCurrentWidget(self.__htmlPreviewer)
@@ -233,6 +231,7 @@
             elif language == "QSS":
                 if self.__qssPreviewer is None:
                     from .Previewers.PreviewerQSS import PreviewerQSS
+
                     self.__qssPreviewer = PreviewerQSS()
                     self.addWidget(self.__qssPreviewer)
                 self.setCurrentWidget(self.__qssPreviewer)
--- a/src/eric7/UI/Previewers/MarkdownExtensions.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Previewers/MarkdownExtensions.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,22 +21,19 @@
 ## License: GNU GPLv3
 ######################################################################
 
-MermaidRegex = re.compile(
-    r"^(?P<mermaid_sign>[\~\`]){3}[ \t]*[Mm]ermaid[ \t]*$"
-)
-MermaidRegexFullText = re.compile(
-    r"([\~\`]){3}[ \t]*[Mm]ermaid"
-)
+MermaidRegex = re.compile(r"^(?P<mermaid_sign>[\~\`]){3}[ \t]*[Mm]ermaid[ \t]*$")
+MermaidRegexFullText = re.compile(r"([\~\`]){3}[ \t]*[Mm]ermaid")
 
 
 class MermaidPreprocessor(Preprocessor):
     """
     Class implementing a markdown pre-processor for Mermaid.
     """
+
     def run(self, lines):
         """
         Public method to do the pre-processing.
-        
+
         @param lines text lines to be processed
         @type list of str
         @return processed lines
@@ -69,15 +66,11 @@
                 new_lines.append('<div class="mermaid">')
                 m_start = None
             elif m_end:
-                new_lines.append('</div>')
+                new_lines.append("</div>")
                 new_lines.append("")
                 m_end = None
             elif in_mermaid_code:
-                new_lines.append(
-                    line.strip()
-                    .replace("<", "&lt;")
-                    .replace(">", "&gt;")
-                )
+                new_lines.append(line.strip().replace("<", "&lt;").replace(">", "&gt;"))
             else:
 
                 new_lines.append(line)
@@ -85,7 +78,7 @@
             old_line = line
 
         if is_mermaid:
-            new_lines.append('')
+            new_lines.append("")
 
         return new_lines
 
@@ -94,16 +87,18 @@
     """
     Class implementing a Markdown Extension for Mermaid.
     """
+
     def extendMarkdown(self, md, md_globals):
         """
         Public method to register the extension.
-        
+
         @param md reference to markdown
         @param md_globals global config parameters
         """
-        md.preprocessors.register(MermaidPreprocessor(md), 'mermaid', 35)
+        md.preprocessors.register(MermaidPreprocessor(md), "mermaid", 35)
         md.registerExtension(self)
 
+
 ######################################################################
 ## Some extension to some basic additions
 ######################################################################
@@ -112,30 +107,36 @@
 class SimplePatternExtension(Extension):
     """
     Class implementing a Markdown extension for ~, ~~, ^, ^^ and ==.
-    
+
     Note: This is a very simple pattern extension that might conflict with
     formulas set for MathJax. Use the 'pymdown-extensions' package in this
     case.
     """
-    DEL_RE = r'(~~)(.+?)~~'
-    SUB_RE = r'(~)(.+?)~'
-    INS_RE = r'(\^\^)(.*?)\^\^'
-    SUP_RE = r'(\^)(.*?)\^'
-    MARK_RE = r'(==)(.*?)=='
-    
+
+    DEL_RE = r"(~~)(.+?)~~"
+    SUB_RE = r"(~)(.+?)~"
+    INS_RE = r"(\^\^)(.*?)\^\^"
+    SUP_RE = r"(\^)(.*?)\^"
+    MARK_RE = r"(==)(.*?)=="
+
     def extendMarkdown(self, md):
         """
         Public method to register the extension.
-        
+
         @param md reference to markdown
         """
         md.inlinePatterns.register(
-            SimpleTagInlineProcessor(self.SUB_RE, 'sub'), 'subscript', 30)
+            SimpleTagInlineProcessor(self.SUB_RE, "sub"), "subscript", 30
+        )
         md.inlinePatterns.register(
-            SimpleTagInlineProcessor(self.DEL_RE, 'del'), 'deleted', 40)
+            SimpleTagInlineProcessor(self.DEL_RE, "del"), "deleted", 40
+        )
         md.inlinePatterns.register(
-            SimpleTagInlineProcessor(self.SUP_RE, 'sup'), 'superscript', 30)
+            SimpleTagInlineProcessor(self.SUP_RE, "sup"), "superscript", 30
+        )
         md.inlinePatterns.register(
-            SimpleTagInlineProcessor(self.INS_RE, 'ins'), 'inserted', 40)
+            SimpleTagInlineProcessor(self.INS_RE, "ins"), "inserted", 40
+        )
         md.inlinePatterns.register(
-            SimpleTagInlineProcessor(self.MARK_RE, 'mark'), 'mark', 40)
+            SimpleTagInlineProcessor(self.MARK_RE, "mark"), "mark", 40
+        )
--- a/src/eric7/UI/Previewers/PreviewerHTML.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Previewers/PreviewerHTML.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,12 @@
 from PyQt6.QtCore import pyqtSlot, pyqtSignal, Qt, QUrl, QThread
 from PyQt6.QtGui import QCursor
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QLabel, QCheckBox, QSizePolicy, QToolTip
+    QWidget,
+    QVBoxLayout,
+    QLabel,
+    QCheckBox,
+    QSizePolicy,
+    QToolTip,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -32,194 +37,199 @@
     """
     Class implementing a previewer widget for HTML, Markdown and ReST files.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__layout = QVBoxLayout(self)
-        
+
         self.titleLabel = QLabel(self)
         self.titleLabel.setWordWrap(True)
         self.titleLabel.setTextInteractionFlags(
-            Qt.TextInteractionFlag.NoTextInteraction)
+            Qt.TextInteractionFlag.NoTextInteraction
+        )
         self.__layout.addWidget(self.titleLabel)
-        
+
         self.__previewAvailable = True
-        
+
         try:
             from PyQt6.QtWebEngineWidgets import QWebEngineView
+
             self.previewView = QWebEngineView(self)
             self.previewView.page().linkHovered.connect(self.__showLink)
         except ImportError:
             self.__previewAvailable = False
-            self.titleLabel.setText(self.tr(
-                "<b>HTML Preview is not available!<br/>"
-                "Install PyQt6-WebEngine.</b>"))
+            self.titleLabel.setText(
+                self.tr(
+                    "<b>HTML Preview is not available!<br/>"
+                    "Install PyQt6-WebEngine.</b>"
+                )
+            )
             self.titleLabel.setAlignment(Qt.AlignmentFlag.AlignHCenter)
             self.__layout.addStretch()
             return
-        
-        sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred,
-                                 QSizePolicy.Policy.Expanding)
+
+        sizePolicy = QSizePolicy(
+            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding
+        )
         sizePolicy.setHorizontalStretch(0)
         sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(
-            self.previewView.sizePolicy().hasHeightForWidth())
+        sizePolicy.setHeightForWidth(self.previewView.sizePolicy().hasHeightForWidth())
         self.previewView.setSizePolicy(sizePolicy)
-        self.previewView.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.NoContextMenu)
+        self.previewView.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
         self.previewView.setUrl(QUrl("about:blank"))
         self.__layout.addWidget(self.previewView)
-        
+
         self.jsCheckBox = QCheckBox(self.tr("Enable JavaScript"), self)
-        self.jsCheckBox.setToolTip(self.tr(
-            "Select to enable JavaScript for HTML previews"))
+        self.jsCheckBox.setToolTip(
+            self.tr("Select to enable JavaScript for HTML previews")
+        )
         self.__layout.addWidget(self.jsCheckBox)
-        
-        self.ssiCheckBox = QCheckBox(self.tr("Enable Server Side Includes"),
-                                     self)
-        self.ssiCheckBox.setToolTip(self.tr(
-            "Select to enable support for Server Side Includes"))
+
+        self.ssiCheckBox = QCheckBox(self.tr("Enable Server Side Includes"), self)
+        self.ssiCheckBox.setToolTip(
+            self.tr("Select to enable support for Server Side Includes")
+        )
         self.__layout.addWidget(self.ssiCheckBox)
-        
+
         self.jsCheckBox.clicked[bool].connect(self.on_jsCheckBox_clicked)
         self.ssiCheckBox.clicked[bool].connect(self.on_ssiCheckBox_clicked)
         self.previewView.titleChanged.connect(self.on_previewView_titleChanged)
-        
-        self.jsCheckBox.setChecked(
-            Preferences.getUI("ShowFilePreviewJS"))
-        self.ssiCheckBox.setChecked(
-            Preferences.getUI("ShowFilePreviewSSI"))
-        
+
+        self.jsCheckBox.setChecked(Preferences.getUI("ShowFilePreviewJS"))
+        self.ssiCheckBox.setChecked(Preferences.getUI("ShowFilePreviewSSI"))
+
         self.__scrollBarPositions = {}
         self.__vScrollBarAtEnd = {}
         self.__hScrollBarAtEnd = {}
-        
+
         self.__processingThread = PreviewProcessingThread()
         self.__processingThread.htmlReady.connect(self.__setHtml)
 
         self.__previewedPath = None
         self.__previewedEditor = None
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         if self.__previewAvailable:
             self.__processingThread.wait()
-    
+
     @pyqtSlot(bool)
     def on_jsCheckBox_clicked(self, checked):
         """
         Private slot to enable/disable JavaScript.
-        
+
         @param checked state of the checkbox (boolean)
         """
         Preferences.setUI("ShowFilePreviewJS", checked)
         self.__setJavaScriptEnabled(checked)
-    
+
     def __setJavaScriptEnabled(self, enable):
         """
         Private method to enable/disable JavaScript.
-        
+
         @param enable flag indicating the enable state (boolean)
         """
         self.jsCheckBox.setChecked(enable)
-        
+
         settings = self.previewView.settings()
         settings.setAttribute(settings.JavascriptEnabled, enable)
-        
+
         self.processEditor()
-    
+
     @pyqtSlot(bool)
     def on_ssiCheckBox_clicked(self, checked):
         """
         Private slot to enable/disable SSI.
-        
+
         @param checked state of the checkbox (boolean)
         """
         Preferences.setUI("ShowFilePreviewSSI", checked)
         self.processEditor()
-    
+
     @pyqtSlot(str)
     def __showLink(self, urlStr):
         """
         Private slot to show the hovered link in a tooltip.
-        
+
         @param urlStr hovered URL
         @type str
         """
         QToolTip.showText(QCursor.pos(), urlStr, self.previewView)
-    
+
     def processEditor(self, editor=None):
         """
         Public slot to process an editor's text.
-        
+
         @param editor editor to be processed (Editor)
         """
         if not self.__previewAvailable:
             return
-        
+
         if editor is None:
             editor = self.__previewedEditor
         else:
             self.__previewedEditor = editor
-        
+
         if editor is not None:
             fn = editor.getFileName()
-            
+
             if fn:
                 extension = os.path.normcase(os.path.splitext(fn)[1][1:])
             else:
                 extension = ""
             if (
-                extension in Preferences.getEditor(
-                    "PreviewHtmlFileNameExtensions") or
-                editor.getLanguage() == "HTML"
+                extension in Preferences.getEditor("PreviewHtmlFileNameExtensions")
+                or editor.getLanguage() == "HTML"
             ):
                 language = "HTML"
             elif (
-                extension in Preferences.getEditor(
-                    "PreviewMarkdownFileNameExtensions") or
-                editor.getLanguage().lower() == "markdown"
+                extension in Preferences.getEditor("PreviewMarkdownFileNameExtensions")
+                or editor.getLanguage().lower() == "markdown"
             ):
                 language = "Markdown"
             elif (
-                extension in Preferences.getEditor(
-                    "PreviewRestFileNameExtensions") or
-                editor.getLanguage().lower() == "restructuredtext"
+                extension in Preferences.getEditor("PreviewRestFileNameExtensions")
+                or editor.getLanguage().lower() == "restructuredtext"
             ):
                 language = "ReST"
             else:
-                self.__setHtml(fn, self.tr(
-                    "<p>No preview available for this type of file.</p>"))
+                self.__setHtml(
+                    fn, self.tr("<p>No preview available for this type of file.</p>")
+                )
                 return
-            
+
             if fn:
                 rootPath = os.path.dirname(os.path.abspath(fn))
             else:
                 rootPath = ""
-            
+
             if bool(editor.text()):
                 self.__processingThread.process(
-                    fn, language, editor.text(),
-                    self.ssiCheckBox.isChecked(), rootPath,
+                    fn,
+                    language,
+                    editor.text(),
+                    self.ssiCheckBox.isChecked(),
+                    rootPath,
                     Preferences.getEditor("PreviewRestUseSphinx"),
                     Preferences.getEditor("PreviewMarkdownNLtoBR"),
-                    Preferences.getEditor(
-                        "PreviewMarkdownUsePyMdownExtensions"),
+                    Preferences.getEditor("PreviewMarkdownUsePyMdownExtensions"),
                     Preferences.getEditor("PreviewMarkdownHTMLFormat"),
-                    Preferences.getEditor("PreviewRestDocutilsHTMLFormat"))
+                    Preferences.getEditor("PreviewRestDocutilsHTMLFormat"),
+                )
 
     def __setHtml(self, filePath, html, rootPath):
         """
         Private method to set the HTML to the view and restore the scroll bars
         positions.
-        
+
         @param filePath file path of the previewed editor
         @type str
         @param html processed HTML text ready to be shown
@@ -228,38 +238,39 @@
         @type str
         """
         self.__previewedPath = Utilities.normcasepath(
-            Utilities.fromNativeSeparators(filePath))
+            Utilities.fromNativeSeparators(filePath)
+        )
         self.__saveScrollBarPositions()
-        self.previewView.page().loadFinished.connect(
-            self.__restoreScrollBarPositions)
+        self.previewView.page().loadFinished.connect(self.__restoreScrollBarPositions)
         if not filePath:
             filePath = "/"
         baseUrl = (
             QUrl.fromLocalFile(rootPath + "/index.html")
-            if rootPath else
-            QUrl.fromLocalFile(filePath)
+            if rootPath
+            else QUrl.fromLocalFile(filePath)
         )
         self.previewView.setHtml(html, baseUrl=baseUrl)
         if self.__previewedEditor:
             self.__previewedEditor.setFocus()
-    
+
     @pyqtSlot(str)
     def on_previewView_titleChanged(self, title):
         """
         Private slot to handle a change of the title.
-        
+
         @param title new title (string)
         """
         if title:
             self.titleLabel.setText(self.tr("Preview - {0}").format(title))
         else:
             self.titleLabel.setText(self.tr("Preview"))
-    
+
     def __saveScrollBarPositions(self):
         """
         Private method to save scroll bar positions for a previewed editor.
         """
         from PyQt6.QtCore import QPoint
+
         try:
             pos = self.previewView.scrollPosition()
         except AttributeError:
@@ -285,32 +296,33 @@
         """
         if self.__previewedPath not in self.__scrollBarPositions:
             return
-        
+
         pos = self.__scrollBarPositions[self.__previewedPath]
         self.previewView.page().runJavaScript(
-            "window.scrollTo({0}, {1});".format(pos.x(), pos.y()))
-    
+            "window.scrollTo({0}, {1});".format(pos.x(), pos.y())
+        )
+
     def __execJavaScript(self, script):
         """
         Private function to execute a JavaScript function Synchroneously.
-        
+
         @param script JavaScript script source to be executed
         @type str
         @return result of the script
         @rtype depending upon script result
         """
         from PyQt6.QtCore import QEventLoop
+
         loop = QEventLoop()
         resultDict = {"res": None}
-        
+
         def resultCallback(res, resDict=resultDict):
             if loop and loop.isRunning():
                 resDict["res"] = res
                 loop.quit()
-        
-        self.previewView.page().runJavaScript(
-            script, resultCallback)
-        
+
+        self.previewView.page().runJavaScript(script, resultCallback)
+
         loop.exec()
         return resultDict["res"]
 
@@ -319,29 +331,40 @@
     """
     Class implementing a thread to process some text into HTML usable by the
     previewer view.
-    
+
     @signal htmlReady(str, str, str) emitted with the file name, the processed
         HTML and the web site root path to signal the availability of the
         processed HTML
     """
+
     htmlReady = pyqtSignal(str, str, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__()
-        
+
         self.__lock = threading.Lock()
-    
-    def process(self, filePath, language, text, ssiEnabled, rootPath,
-                useSphinx, convertNewLineToBreak, usePyMdownExtensions,
-                markdownHtmlFormat, restDocutilsHtmlFormat):
+
+    def process(
+        self,
+        filePath,
+        language,
+        text,
+        ssiEnabled,
+        rootPath,
+        useSphinx,
+        convertNewLineToBreak,
+        usePyMdownExtensions,
+        markdownHtmlFormat,
+        restDocutilsHtmlFormat,
+    ):
         """
         Public method to convert the given text to HTML.
-        
+
         @param filePath file path of the text
         @type str
         @param language language of the text
@@ -380,7 +403,7 @@
             self.__restDocutilsHtmlFormat = restDocutilsHtmlFormat
             if not self.isRunning():
                 self.start(QThread.Priority.LowPriority)
-    
+
     def run(self):
         """
         Public thread method to convert the stored data.
@@ -398,27 +421,45 @@
                 usePyMdownExtensions = self.__usePyMdownExtensions
                 markdownHtmlFormat = self.__markdownHtmlFormat
                 restDocutilsHtmlFormat = self.__restDocutilsHtmlFormat
-            
+
                 self.__haveData = False
 
-            html = self.__getHtml(language, text, ssiEnabled, filePath,
-                                  rootPath, useSphinx, convertNewLineToBreak,
-                                  usePyMdownExtensions, markdownHtmlFormat,
-                                  restDocutilsHtmlFormat)
-            
+            html = self.__getHtml(
+                language,
+                text,
+                ssiEnabled,
+                filePath,
+                rootPath,
+                useSphinx,
+                convertNewLineToBreak,
+                usePyMdownExtensions,
+                markdownHtmlFormat,
+                restDocutilsHtmlFormat,
+            )
+
             with self.__lock:
                 if not self.__haveData:
                     self.htmlReady.emit(filePath, html, rootPath)
                     break
                 # else - next iteration
-    
-    def __getHtml(self, language, text, ssiEnabled, filePath, rootPath,
-                  useSphinx, convertNewLineToBreak, usePyMdownExtensions,
-                  markdownHtmlFormat, restDocutilsHtmlFormat):
+
+    def __getHtml(
+        self,
+        language,
+        text,
+        ssiEnabled,
+        filePath,
+        rootPath,
+        useSphinx,
+        convertNewLineToBreak,
+        usePyMdownExtensions,
+        markdownHtmlFormat,
+        restDocutilsHtmlFormat,
+    ):
         """
         Private method to process the given text depending upon the given
         language.
-        
+
         @param language language of the text
         @type str
         @param text to be processed
@@ -453,20 +494,19 @@
             return self.__processRootPath(html, rootPath)
         elif language == "Markdown":
             return self.__convertMarkdown(
-                text, convertNewLineToBreak, usePyMdownExtensions,
-                markdownHtmlFormat)
+                text, convertNewLineToBreak, usePyMdownExtensions, markdownHtmlFormat
+            )
         elif language == "ReST":
             return self.__convertReST(text, useSphinx, restDocutilsHtmlFormat)
         else:
-            return self.tr(
-                "<p>No preview available for this type of file.</p>")
-    
+            return self.tr("<p>No preview available for this type of file.</p>")
+
     def __processSSI(self, txt, filename, root):
         """
         Private method to process the given text for SSI statements.
-        
+
         Note: Only a limited subset of SSI statements are supported.
-        
+
         @param txt text to be processed (string)
         @param filename name of the file associated with the given text
             (string)
@@ -475,18 +515,19 @@
         """
         if not filename:
             return txt
-        
+
         # SSI include
         incRe = re.compile(
             r"""<!--#include[ \t]+(virtual|file)=[\"']([^\"']+)[\"']\s*-->""",
-            re.IGNORECASE)
+            re.IGNORECASE,
+        )
         baseDir = os.path.dirname(os.path.abspath(filename))
         docRoot = root if root != "" else baseDir
         while True:
             incMatch = incRe.search(txt)
             if incMatch is None:
                 break
-            
+
             if incMatch.group(1) == "virtual":
                 incFile = Utilities.normjoinpath(docRoot, incMatch.group(2))
             elif incMatch.group(1) == "file":
@@ -503,14 +544,14 @@
             else:
                 # remove SSI include
                 incTxt = ""
-            txt = txt[:incMatch.start(0)] + incTxt + txt[incMatch.end(0):]
-        
+            txt = txt[: incMatch.start(0)] + incTxt + txt[incMatch.end(0) :]
+
         return txt
-    
+
     def __processRootPath(self, txt, root):
         """
         Private method to adjust absolute references to the given root path.
-        
+
         @param txt text to be processed
         @type str
         @param root directory of the document root
@@ -520,31 +561,36 @@
         """
         if not root:
             return txt
-        
+
         root = Utilities.fromNativeSeparators(root)
         if not root.endswith("/"):
             root += "/"
         rootLen = len(root)
-        
-        refRe = re.compile(
-            r"""(href|src)=[\\"']/([^\\"']+)[\\"']""",
-            re.IGNORECASE)
+
+        refRe = re.compile(r"""(href|src)=[\\"']/([^\\"']+)[\\"']""", re.IGNORECASE)
         pos = 0
         while True:
             refMatch = refRe.search(txt, pos)
             if refMatch is None:
                 break
-            
-            txt = (txt[:refMatch.start(0)] + refMatch.group(1) + '="' + root +
-                   refMatch.group(2) + '"' + txt[refMatch.end(0):])
+
+            txt = (
+                txt[: refMatch.start(0)]
+                + refMatch.group(1)
+                + '="'
+                + root
+                + refMatch.group(2)
+                + '"'
+                + txt[refMatch.end(0) :]
+            )
             pos = refMatch.end(0) + rootLen
-        
+
         return txt
-    
+
     def __convertReST(self, text, useSphinx, restDocutilsHtmlFormat):
         """
         Private method to convert ReST text into HTML.
-        
+
         @param text text to be processed (string)
         @param useSphinx flag indicating to use Sphinx to generate the
             ReST preview (boolean)
@@ -556,16 +602,16 @@
             return self.__convertReSTSphinx(text)
         else:
             return self.__convertReSTDocutils(text, restDocutilsHtmlFormat)
-    
+
     def __convertReSTSphinx(self, text):
         """
         Private method to convert ReST text into HTML using 'sphinx'.
-        
+
         @param text text to be processed (string)
         @return processed HTML (string)
         """
         try:
-            from sphinx.application import Sphinx   # __IGNORE_EXCEPTION__
+            from sphinx.application import Sphinx  # __IGNORE_EXCEPTION__
         except ImportError:
             return self.tr(
                 """<p>ReStructuredText preview requires the"""
@@ -574,86 +620,99 @@
                 """ <a href="http://pypi.python.org/pypi/Sphinx">"""
                 """this page.</a></p>"""
                 """<p>Alternatively you may disable Sphinx usage"""
-                """ on the Editor, Filehandling configuration page.</p>""")
-        
+                """ on the Editor, Filehandling configuration page.</p>"""
+            )
+
         srcTempDir = tempfile.mkdtemp(prefix="eric-rest-src-")
         outTempDir = tempfile.mkdtemp(prefix="eric-rest-out-")
         doctreeTempDir = tempfile.mkdtemp(prefix="eric-rest-doctree-")
         try:
-            filename = 'sphinx_preview'
+            filename = "sphinx_preview"
             basePath = os.path.join(srcTempDir, filename)
-            with open(basePath + '.rst', 'w', encoding='utf-8') as fh:
+            with open(basePath + ".rst", "w", encoding="utf-8") as fh:
                 fh.write(text)
-            
-            overrides = {'html_add_permalinks': False,
-                         'html_copy_source': False,
-                         'html_title': 'Sphinx preview',
-                         'html_use_index': False,
-                         'html_use_modindex': False,
-                         'html_use_smartypants': True,
-                         'master_doc': filename}
-            app = Sphinx(srcdir=srcTempDir, confdir=None, outdir=outTempDir,
-                         doctreedir=doctreeTempDir, buildername='html',
-                         confoverrides=overrides, status=None,
-                         warning=io.StringIO())
+
+            overrides = {
+                "html_add_permalinks": False,
+                "html_copy_source": False,
+                "html_title": "Sphinx preview",
+                "html_use_index": False,
+                "html_use_modindex": False,
+                "html_use_smartypants": True,
+                "master_doc": filename,
+            }
+            app = Sphinx(
+                srcdir=srcTempDir,
+                confdir=None,
+                outdir=outTempDir,
+                doctreedir=doctreeTempDir,
+                buildername="html",
+                confoverrides=overrides,
+                status=None,
+                warning=io.StringIO(),
+            )
             app.build(force_all=True, filenames=None)
 
             basePath = os.path.join(outTempDir, filename)
-            with open(basePath + '.html', 'r', encoding='utf-8') as fh:
+            with open(basePath + ".html", "r", encoding="utf-8") as fh:
                 html = fh.read()
         finally:
             shutil.rmtree(srcTempDir)
             shutil.rmtree(outTempDir)
             shutil.rmtree(doctreeTempDir)
-        
+
         return html
-    
+
     def __convertReSTDocutils(self, text, htmlFormat):
         """
         Private method to convert ReST text into HTML using 'docutils'.
-        
+
         @param text text to be processed (string)
         @param htmlFormat HTML format to be generated (string)
         @return processed HTML (string)
         """
-        if 'sphinx' in sys.modules:
+        if "sphinx" in sys.modules:
             # Make sure any Sphinx polution of docutils has been removed.
-            unloadKeys = [k for k in sys.modules.keys()
-                          if k.startswith(('docutils', 'sphinx'))]
+            unloadKeys = [
+                k for k in sys.modules.keys() if k.startswith(("docutils", "sphinx"))
+            ]
             for key in unloadKeys:
                 sys.modules.pop(key)
-        
+
         try:
-            import docutils.core    # __IGNORE_EXCEPTION__
-            import docutils.utils   # __IGNORE_EXCEPTION__
+            import docutils.core  # __IGNORE_EXCEPTION__
+            import docutils.utils  # __IGNORE_EXCEPTION__
         except ImportError:
             return self.tr(
                 """<p>ReStructuredText preview requires the"""
                 """ <b>python-docutils</b> package.<br/>Install it with"""
                 """ your package manager, 'pip install docutils' or see"""
                 """ <a href="http://pypi.python.org/pypi/docutils">"""
-                """this page.</a></p>""")
-        
+                """this page.</a></p>"""
+            )
+
         # redirect sys.stderr because we are not interested in it here
         origStderr = sys.stderr
         sys.stderr = io.StringIO()
         try:
             html = docutils.core.publish_string(
-                text, writer_name=htmlFormat.lower()).decode("utf-8")
+                text, writer_name=htmlFormat.lower()
+            ).decode("utf-8")
         except docutils.utils.SystemMessage as err:
             errStr = str(err).split(":")[-1].replace("\n", "<br/>")
-            return self.tr(
-                """<p>Docutils returned an error:</p><p>{0}</p>"""
-            ).format(errStr)
-        
+            return self.tr("""<p>Docutils returned an error:</p><p>{0}</p>""").format(
+                errStr
+            )
+
         sys.stderr = origStderr
         return html
-    
-    def __convertMarkdown(self, text, convertNewLineToBreak,
-                          usePyMdownExtensions, htmlFormat):
+
+    def __convertMarkdown(
+        self, text, convertNewLineToBreak, usePyMdownExtensions, htmlFormat
+    ):
         """
         Private method to convert Markdown text into HTML.
-        
+
         @param text text to be processed
         @type str
         @param convertNewLineToBreak flag indicating to convert new lines
@@ -668,53 +727,59 @@
         @rtype str
         """
         try:
-            import markdown     # __IGNORE_EXCEPTION__
+            import markdown  # __IGNORE_EXCEPTION__
         except ImportError:
             return self.tr(
                 """<p>Markdown preview requires the <b>Markdown</b> """
                 """package.<br/>Install it with your package manager,"""
                 """ 'pip install Markdown' or see """
                 """<a href="http://pythonhosted.org/Markdown/install.html">"""
-                """installation instructions.</a></p>""")
-        
+                """installation instructions.</a></p>"""
+            )
+
         from . import PreviewerHTMLStyles
         from . import MarkdownExtensions
-        
+
         extensions = []
-        
+
         mermaidNeeded = False
-        if (
-            Preferences.getEditor("PreviewMarkdownMermaid") and
-            MarkdownExtensions.MermaidRegexFullText.search(text)
-        ):
+        if Preferences.getEditor(
+            "PreviewMarkdownMermaid"
+        ) and MarkdownExtensions.MermaidRegexFullText.search(text):
             extensions.append(MarkdownExtensions.MermaidExtension())
             mermaidNeeded = True
-        
+
         if convertNewLineToBreak:
-            extensions.append('nl2br')
-        
+            extensions.append("nl2br")
+
         pyMdown = False
         if usePyMdownExtensions:
             with contextlib.suppress(ImportError):
-                import pymdownx     # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+                import pymdownx  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+
                 # PyPI package is 'pymdown-extensions'
-                
-                extensions.extend([
-                    'toc',
-                    'pymdownx.extra', 'pymdownx.caret', 'pymdownx.emoji',
-                    'pymdownx.mark', 'pymdownx.tilde', 'pymdownx.keys',
-                    'pymdownx.tasklist', 'pymdownx.smartsymbols',
-                ])
+
+                extensions.extend(
+                    [
+                        "toc",
+                        "pymdownx.extra",
+                        "pymdownx.caret",
+                        "pymdownx.emoji",
+                        "pymdownx.mark",
+                        "pymdownx.tilde",
+                        "pymdownx.keys",
+                        "pymdownx.tasklist",
+                        "pymdownx.smartsymbols",
+                    ]
+                )
                 pyMdown = True
-        
+
         if not pyMdown:
-            extensions.extend(['extra', 'toc'])
-            
+            extensions.extend(["extra", "toc"])
+
             # version 2.0 supports only extension names, not instances
-            if (
-                markdown.version_info[0] > 2 or
-                (markdown.version_info[0] == 2 and
-                 markdown.version_info[1] > 0)
+            if markdown.version_info[0] > 2 or (
+                markdown.version_info[0] == 2 and markdown.version_info[1] > 0
             ):
                 extensions.append(MarkdownExtensions.SimplePatternExtension())
 
@@ -727,15 +792,14 @@
             )
             # prepare text for mathjax
             text = (
-                text
-                .replace(r"\(", r"\\(")
+                text.replace(r"\(", r"\\(")
                 .replace(r"\)", r"\\)")
                 .replace(r"\[", r"\\[")
                 .replace(r"\]", r"\\]")
             )
         else:
             mathjax = ""
-        
+
         if mermaidNeeded:
             mermaid = (
                 "<script type='text/javascript' id='Mermaid-script'"
@@ -759,47 +823,49 @@
         else:
             mermaid = ""
             mermaid_initialize = ""
-        
+
         htmlFormat = Preferences.getEditor("PreviewMarkdownHTMLFormat").lower()
-        body = markdown.markdown(text, extensions=extensions,
-                                 output_format=htmlFormat.lower())
+        body = markdown.markdown(
+            text, extensions=extensions, output_format=htmlFormat.lower()
+        )
         style = (
-            (PreviewerHTMLStyles.css_markdown_dark +
-             PreviewerHTMLStyles.css_pygments_dark)
-            if ericApp().usesDarkPalette() else
-            (PreviewerHTMLStyles.css_markdown_light +
-             PreviewerHTMLStyles.css_pygments_light)
+            (
+                PreviewerHTMLStyles.css_markdown_dark
+                + PreviewerHTMLStyles.css_pygments_dark
+            )
+            if ericApp().usesDarkPalette()
+            else (
+                PreviewerHTMLStyles.css_markdown_light
+                + PreviewerHTMLStyles.css_pygments_light
+            )
         )
-        
+
         if htmlFormat == "xhtml1":
             head = (
-                '''<!DOCTYPE html PUBLIC "-//W3C//DTD'''
-                ''' XHTML 1.0 Transitional//EN"\n'''
-                ''' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional'''
-                '''.dtd">\n'''
-                '''<html xmlns="http://www.w3.org/1999/xhtml">\n'''
+                """<!DOCTYPE html PUBLIC "-//W3C//DTD"""
+                """ XHTML 1.0 Transitional//EN"\n"""
+                """ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional"""
+                """.dtd">\n"""
+                """<html xmlns="http://www.w3.org/1999/xhtml">\n"""
             )
         elif htmlFormat == "html5":
-            head = (
-                '''<!DOCTYPE html>\n'''
-                '''<html lang="EN">\n'''
-            )
+            head = """<!DOCTYPE html>\n""" """<html lang="EN">\n"""
         else:
             head = '<html lang="EN">\n'
-        head += '''<head>\n'''
+        head += """<head>\n"""
         head += (
-            '''<meta name="Generator" content="eric" />\n'''
-            '''<meta http-equiv="Content-Type" '''
-            '''content="text/html; charset=utf-8" />\n'''
-            '''{0}'''
-            '''{1}'''
-            '''<style type="text/css">'''
-            '''{2}'''
-            '''</style>\n'''
-            '''</head>\n'''
-            '''<body>\n'''
+            """<meta name="Generator" content="eric" />\n"""
+            """<meta http-equiv="Content-Type" """
+            """content="text/html; charset=utf-8" />\n"""
+            """{0}"""
+            """{1}"""
+            """<style type="text/css">"""
+            """{2}"""
+            """</style>\n"""
+            """</head>\n"""
+            """<body>\n"""
         ).format(mathjax, mermaid, style)
-        
-        foot = '''\n</body>\n</html>\n'''
-        
+
+        foot = """\n</body>\n</html>\n"""
+
         return head + body + mermaid_initialize + foot
--- a/src/eric7/UI/Previewers/PreviewerQSS.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/Previewers/PreviewerQSS.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QWidget, QMenu, QLabel, QHeaderView, QListWidgetItem
-)
+from PyQt6.QtWidgets import QWidget, QMenu, QLabel, QHeaderView, QListWidgetItem
 
 from EricWidgets.EricPathPicker import EricPathPickerModes
 from EricWidgets.EricApplication import ericApp
@@ -30,90 +28,88 @@
     """
     Class implementing a previewer widget for Qt style sheet files.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         styleIconsPath = ericApp().getStyleIconsPath()
-        self.styleIconsPathPicker.setMode(
-            EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
+        self.styleIconsPathPicker.setMode(EricPathPickerModes.DIRECTORY_SHOW_FILES_MODE)
         self.styleIconsPathPicker.setDefaultDirectory(styleIconsPath)
-        
+
         self.__lastEditor = None
-        
+
         # menu for the tool buttons
         self.__toolButtonMenu_1 = QMenu(self)
         self.__toolButtonMenu_1.addAction(self.tr("Action 1.1"))
         self.__toolButtonMenu_1.addSeparator()
         self.__toolButtonMenu_1.addAction(self.tr("Action 2.1"))
         self.toolButton_1.setMenu(self.__toolButtonMenu_1)
-        
+
         self.__toolButtonMenu_2 = QMenu(self)
         self.__toolButtonMenu_2.addAction(self.tr("Action 1.2"))
         self.__toolButtonMenu_2.addSeparator()
         self.__toolButtonMenu_2.addAction(self.tr("Action 2.2"))
         self.toolButton_2.setMenu(self.__toolButtonMenu_2)
-        
+
         self.__toolButtonMenu_3 = QMenu(self)
         self.__toolButtonMenu_3.addAction(self.tr("Action 1.3"))
         self.__toolButtonMenu_3.addSeparator()
         self.__toolButtonMenu_3.addAction(self.tr("Action 2.3"))
         self.toolButton_3.setMenu(self.__toolButtonMenu_3)
-        
+
         # a MDI window
         self.__mdi = self.mdiArea.addSubWindow(QLabel(self.tr("MDI")))
         self.__mdi.resize(160, 80)
-        
+
         # tree and table widgets
-        self.tree.header().setSectionResizeMode(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.tree.header().setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
         self.table.horizontalHeader().setSectionResizeMode(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.tree.topLevelItem(0).setExpanded(True)
-        
+
         # icon list widget
         for iconName, labelText in (
             ("filePython", self.tr("Python")),
             ("fileRuby", self.tr("Ruby")),
             ("fileJavascript", self.tr("JavaScript")),
         ):
-            self.iconsListWidget.addItem(QListWidgetItem(
-                UI.PixmapCache.getIcon(iconName), labelText))
-    
+            self.iconsListWidget.addItem(
+                QListWidgetItem(UI.PixmapCache.getIcon(iconName), labelText)
+            )
+
     @pyqtSlot(str)
     def on_styleIconsPathPicker_textChanged(self, txt):
         """
         Private slot handling a change of the style icons path.
-        
+
         @param txt name of the style icons directory
         @type str
         """
         self.processEditor(self.__lastEditor)
-    
+
     def processEditor(self, editor=None):
         """
         Public slot to process an editor's text.
-        
+
         @param editor editor to be processed (Editor)
         """
         self.__lastEditor = editor
-        
+
         if editor is not None:
             fn = editor.getFileName()
-            
+
             if fn:
                 extension = os.path.normcase(os.path.splitext(fn)[1][1:])
             else:
                 extension = ""
-            if (
-                extension in Preferences.getEditor(
-                    "PreviewQssFileNameExtensions")
-            ):
+            if extension in Preferences.getEditor("PreviewQssFileNameExtensions"):
                 styleSheet = editor.text()
                 if styleSheet:
                     styleIconsPath = self.styleIconsPathPicker.text()
@@ -123,26 +119,29 @@
                             # default ist the 'StyleIcons' subdirectory of the
                             # icons directory
                             styleIconsPath = os.path.join(
-                                getConfig('ericIconDir'), "StyleIcons")
-                    
-                    styleIconsPath = Utilities.fromNativeSeparators(
-                        styleIconsPath)
+                                getConfig("ericIconDir"), "StyleIcons"
+                            )
+
+                    styleIconsPath = Utilities.fromNativeSeparators(styleIconsPath)
                     styleSheet = styleSheet.replace("${path}", styleIconsPath)
                     self.scrollAreaWidgetContents.setStyleSheet(styleSheet)
                 else:
                     self.scrollAreaWidgetContents.setStyleSheet("")
                 self.toolButton_1.menu().setStyleSheet(
-                    self.scrollAreaWidgetContents.styleSheet())
+                    self.scrollAreaWidgetContents.styleSheet()
+                )
                 self.toolButton_2.menu().setStyleSheet(
-                    self.scrollAreaWidgetContents.styleSheet())
+                    self.scrollAreaWidgetContents.styleSheet()
+                )
                 self.toolButton_3.menu().setStyleSheet(
-                    self.scrollAreaWidgetContents.styleSheet())
-    
+                    self.scrollAreaWidgetContents.styleSheet()
+                )
+
     @pyqtSlot(int)
     def on_checkBox_stateChanged(self, state):
         """
         Private slot to synchronize the checkbox state.
-        
+
         @param state state of the enabled check box
         @type int
         """
--- a/src/eric7/UI/PythonAstViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/PythonAstViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,11 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer
 from PyQt6.QtGui import QBrush
 from PyQt6.QtWidgets import (
-    QTreeWidget, QTreeWidgetItem, QAbstractItemView, QWidget, QVBoxLayout
+    QTreeWidget,
+    QTreeWidgetItem,
+    QAbstractItemView,
+    QWidget,
+    QVBoxLayout,
 )
 
 from asttokens import ASTTokens
@@ -28,56 +32,57 @@
     Class implementing a widget to visualize the Python AST for some Python
     sources.
     """
+
     StartLineRole = Qt.ItemDataRole.UserRole
     StartIndexRole = Qt.ItemDataRole.UserRole + 1
     EndLineRole = Qt.ItemDataRole.UserRole + 2
     EndIndexRole = Qt.ItemDataRole.UserRole + 3
-    
+
     def __init__(self, viewmanager, parent=None):
         """
         Constructor
-        
+
         @param viewmanager reference to the viewmanager object
         @type ViewManager
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__layout = QVBoxLayout(self)
         self.setLayout(self.__layout)
         self.__astWidget = QTreeWidget(self)
         self.__layout.addWidget(self.__astWidget)
         self.__layout.setContentsMargins(0, 0, 0, 0)
-        
+
         self.__vm = viewmanager
         self.__vmConnected = False
-        
+
         self.__editor = None
         self.__source = ""
-        
-        self.__astWidget.setHeaderLabels([self.tr("Node"),
-                                          self.tr("Code Range")])
+
+        self.__astWidget.setHeaderLabels([self.tr("Node"), self.tr("Code Range")])
         self.__astWidget.setSortingEnabled(False)
         self.__astWidget.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
+            QAbstractItemView.SelectionBehavior.SelectRows
+        )
         self.__astWidget.setSelectionMode(
-            QAbstractItemView.SelectionMode.SingleSelection)
+            QAbstractItemView.SelectionMode.SingleSelection
+        )
         self.__astWidget.setAlternatingRowColors(True)
-        
-        self.__errorColor = QBrush(
-            Preferences.getPython("ASTViewerErrorColor"))
-        
+
+        self.__errorColor = QBrush(Preferences.getPython("ASTViewerErrorColor"))
+
         self.__astWidget.itemClicked.connect(self.__astItemClicked)
-        
+
         self.__vm.astViewerStateChanged.connect(self.__astViewerStateChanged)
-        
+
         self.hide()
-    
+
     def __editorChanged(self, editor):
         """
         Private slot to handle a change of the current editor.
-        
+
         @param editor reference to the current editor
         @type Editor
         """
@@ -87,21 +92,21 @@
             self.__editor = editor
             if self.__editor:
                 self.__loadAST()
-    
+
     def __editorSaved(self, editor):
         """
         Private slot to reload the AST after the connected editor was saved.
-        
+
         @param editor reference to the editor that performed a save action
         @type Editor
         """
         if editor and editor is self.__editor:
             self.__loadAST()
-    
+
     def __editorDoubleClicked(self, editor, pos, buttons):
         """
         Private slot to handle a mouse button double click in the editor.
-        
+
         @param editor reference to the editor, that emitted the signal
         @type Editor
         @param pos position of the double click
@@ -113,70 +118,67 @@
             if editor.isModified():
                 # reload the source
                 QTimer.singleShot(0, self.__loadAST)
-            
+
             # highlight the corresponding entry
             QTimer.singleShot(0, self.__selectItemForEditorSelection)
             QTimer.singleShot(0, self.__grabFocus)
-    
+
     def __editorLanguageChanged(self, editor):
         """
         Private slot to handle a change of the editor language.
-        
+
         @param editor reference to the editor which changed language
         @type Editor
         """
         if editor is self.__editor:
             QTimer.singleShot(0, self.__loadDIS)
-    
+
     def __lastEditorClosed(self):
         """
         Private slot to handle the last editor closed signal of the view
         manager.
         """
         self.hide()
-    
+
     def show(self):
         """
         Public slot to show the AST viewer.
         """
         super().show()
-        
+
         if not self.__vmConnected:
             self.__vm.editorChangedEd.connect(self.__editorChanged)
             self.__vm.editorSavedEd.connect(self.__editorSaved)
             self.__vm.editorDoubleClickedEd.connect(self.__editorDoubleClicked)
-            self.__vm.editorLanguageChanged.connect(
-                self.__editorLanguageChanged)
+            self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged)
             self.__vmConnected = True
-    
+
     def hide(self):
         """
         Public slot to hide the AST viewer.
         """
         super().hide()
-        
+
         if self.__editor:
             self.__editor.clearAllHighlights()
-        
+
         if self.__vmConnected:
             self.__vm.editorChangedEd.disconnect(self.__editorChanged)
             self.__vm.editorSavedEd.disconnect(self.__editorSaved)
-            self.__vm.editorDoubleClickedEd.disconnect(
-                self.__editorDoubleClicked)
-            self.__vm.editorLanguageChanged.disconnect(
-                self.__editorLanguageChanged)
+            self.__vm.editorDoubleClickedEd.disconnect(self.__editorDoubleClicked)
+            self.__vm.editorLanguageChanged.disconnect(self.__editorLanguageChanged)
             self.__vmConnected = False
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         self.__editor = None
-    
+
     def __astViewerStateChanged(self, on):
         """
         Private slot to toggle the display of the AST viewer.
-        
+
         @param on flag indicating to show the AST
         @type bool
         """
@@ -189,11 +191,11 @@
         else:
             self.hide()
             self.__editor = None
-    
+
     def __createErrorItem(self, error):
         """
         Private method to create a top level error item.
-        
+
         @param error error message
         @type str
         @return generated item
@@ -203,35 +205,33 @@
         itm.setFirstColumnSpanned(True)
         itm.setForeground(0, self.__errorColor)
         return itm
-    
+
     def __loadAST(self):
         """
         Private method to generate the AST from the source of the current
         editor and visualize it.
         """
         if not self.__editor:
-            self.__createErrorItem(self.tr(
-                "No editor has been opened."
-            ))
+            self.__createErrorItem(self.tr("No editor has been opened."))
             return
-        
+
         self.__astWidget.clear()
         self.__editor.clearAllHighlights()
-        
+
         source = self.__editor.text()
         if not source.strip():
             # empty editor or white space only
-            self.__createErrorItem(self.tr(
-                "The current editor does not contain any source code."
-            ))
+            self.__createErrorItem(
+                self.tr("The current editor does not contain any source code.")
+            )
             return
-        
+
         if not self.__editor.isPyFile():
-            self.__createErrorItem(self.tr(
-                "The current editor does not contain Python source code."
-            ))
+            self.__createErrorItem(
+                self.tr("The current editor does not contain Python source code.")
+            )
             return
-        
+
         with EricOverrideCursor():
             try:
                 # generate the AST
@@ -241,23 +241,23 @@
             except Exception as exc:
                 self.__createErrorItem(str(exc))
                 astValid = False
-            
+
             if astValid:
                 self.setUpdatesEnabled(False)
-                
+
                 # populate the AST tree
                 self.__populateNode(self.tr("Module"), root, self.__astWidget)
                 self.__selectItemForEditorSelection()
                 QTimer.singleShot(0, self.__resizeColumns)
-                
+
                 self.setUpdatesEnabled(True)
-        
+
         self.__grabFocus()
-    
+
     def __populateNode(self, name, nodeOrFields, parent):
         """
         Private method to populate the tree view with a node.
-        
+
         @param name name of the node
         @type str
         @param nodeOrFields reference to the node or a list node fields
@@ -277,52 +277,48 @@
         else:
             fields = []
             value = repr(nodeOrFields)
-        
+
         text = self.tr("{0}: {1}").format(name, value)
         itm = QTreeWidgetItem(parent, [text])
         itm.setExpanded(True)
-        
-        if (
-            hasattr(nodeOrFields, "lineno") and
-            hasattr(nodeOrFields, "col_offset")
-        ):
+
+        if hasattr(nodeOrFields, "lineno") and hasattr(nodeOrFields, "col_offset"):
             itm.setData(0, self.StartLineRole, nodeOrFields.lineno)
             itm.setData(0, self.StartIndexRole, nodeOrFields.col_offset)
             startStr = self.tr("{0},{1}").format(
-                nodeOrFields.lineno, nodeOrFields.col_offset)
+                nodeOrFields.lineno, nodeOrFields.col_offset
+            )
             endStr = ""
-            
-            if (
-                hasattr(nodeOrFields, "end_lineno") and
-                hasattr(nodeOrFields, "end_col_offset")
+
+            if hasattr(nodeOrFields, "end_lineno") and hasattr(
+                nodeOrFields, "end_col_offset"
             ):
                 itm.setData(0, self.EndLineRole, nodeOrFields.end_lineno)
-                itm.setData(0, self.EndIndexRole,
-                            nodeOrFields.end_col_offset)
+                itm.setData(0, self.EndIndexRole, nodeOrFields.end_col_offset)
                 endStr = self.tr("{0},{1}").format(
-                    nodeOrFields.end_lineno, nodeOrFields.end_col_offset)
+                    nodeOrFields.end_lineno, nodeOrFields.end_col_offset
+                )
             else:
                 itm.setData(0, self.EndLineRole, nodeOrFields.lineno)
-                itm.setData(0, self.EndIndexRole,
-                            nodeOrFields.col_offset + 1)
+                itm.setData(0, self.EndIndexRole, nodeOrFields.col_offset + 1)
             if endStr:
                 rangeStr = self.tr("{0}  -  {1}").format(startStr, endStr)
             else:
                 rangeStr = startStr
-            
+
             itm.setText(1, rangeStr)
-        
+
         for fieldName, fieldValue in fields:
             self.__populateNode(fieldName, fieldValue, itm)
-    
+
     def __markTextRanges(self, tree, source):
         """
         Private method to modify the AST nodes with end_lineno and
         end_col_offset information.
-        
+
         Note: The modifications are only done for nodes containing lineno and
         col_offset attributes.
-        
+
         @param tree reference to the AST to be modified
         @type ast.AST
         @param source source code the AST was created from
@@ -330,17 +326,17 @@
         """
         ASTTokens(source, tree=tree)
         for child in ast.walk(tree):
-            if hasattr(child, 'last_token'):
+            if hasattr(child, "last_token"):
                 child.end_lineno, child.end_col_offset = child.last_token.end
-                if hasattr(child, 'lineno'):
+                if hasattr(child, "lineno"):
                     # Fixes problems with some nodes like binop
                     child.lineno, child.col_offset = child.first_token.start
-    
+
     def __findClosestContainingNode(self, node, textRange):
         """
         Private method to search for the AST node that contains a range
         closest.
-        
+
         @param node AST node to start searching at
         @type ast.AST
         @param textRange tuple giving the start and end positions
@@ -351,27 +347,28 @@
         if textRange in [(-1, -1, -1, -1), (0, -1, 0, -1)]:
             # no valid range, i.e. no selection
             return None
-        
+
         # first look among children
         for child in ast.iter_child_nodes(node):
             result = self.__findClosestContainingNode(child, textRange)
             if result is not None:
                 return result
-        
+
         # no suitable child was found
         if hasattr(node, "lineno") and self.__rangeContainsSmaller(
-            (node.lineno, node.col_offset, node.end_lineno,
-             node.end_col_offset), textRange):
+            (node.lineno, node.col_offset, node.end_lineno, node.end_col_offset),
+            textRange,
+        ):
             return node
         else:
             # nope
             return None
-    
+
     def __findClosestContainingItem(self, itm, textRange):
         """
         Private method to search for the tree item that contains a range
         closest.
-        
+
         @param itm tree item to start searching at
         @type QTreeWidgetItem
         @param textRange tuple giving the start and end positions
@@ -382,59 +379,69 @@
         if textRange in [(-1, -1, -1, -1), (0, -1, 0, -1)]:
             # no valid range, i.e. no selection
             return None
-        
+
         lineno = itm.data(0, self.StartLineRole)
         if lineno is not None and not self.__rangeContainsSmallerOrEqual(
-           (itm.data(0, self.StartLineRole), itm.data(0, self.StartIndexRole),
-            itm.data(0, self.EndLineRole), itm.data(0, self.EndIndexRole)),
-           textRange):
+            (
+                itm.data(0, self.StartLineRole),
+                itm.data(0, self.StartIndexRole),
+                itm.data(0, self.EndLineRole),
+                itm.data(0, self.EndIndexRole),
+            ),
+            textRange,
+        ):
             return None
-        
+
         # first look among children
         for index in range(itm.childCount()):
             child = itm.child(index)
             result = self.__findClosestContainingItem(child, textRange)
             if result is not None:
                 return result
-        
+
         # no suitable child was found
         lineno = itm.data(0, self.StartLineRole)
         if lineno is not None and self.__rangeContainsSmallerOrEqual(
-           (itm.data(0, self.StartLineRole), itm.data(0, self.StartIndexRole),
-            itm.data(0, self.EndLineRole), itm.data(0, self.EndIndexRole)),
-           textRange):
+            (
+                itm.data(0, self.StartLineRole),
+                itm.data(0, self.StartIndexRole),
+                itm.data(0, self.EndLineRole),
+                itm.data(0, self.EndIndexRole),
+            ),
+            textRange,
+        ):
             return itm
         else:
             # nope
             return None
-    
+
     def __resizeColumns(self):
         """
         Private method to resize the columns to suitable values.
         """
         for col in range(self.__astWidget.columnCount()):
             self.__astWidget.resizeColumnToContents(col)
-        
+
         rangeSize = self.__astWidget.columnWidth(1) + 10
         # 10 px extra for the range
         nodeSize = max(400, self.__astWidget.viewport().width() - rangeSize)
         self.__astWidget.setColumnWidth(0, nodeSize)
         self.__astWidget.setColumnWidth(1, rangeSize)
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt resize event
         @type QResizeEvent
         """
         # just adjust the sizes of the columns
         self.__resizeColumns()
-    
+
     def __rangeContainsSmaller(self, first, second):
         """
         Private method to check, if second is contained in first.
-        
+
         @param first text range to check against
         @type tuple of (int, int, int, int)
         @param second text range to check for
@@ -448,15 +455,15 @@
         secondEnd = second[2:]
 
         return (
-            (firstStart < secondStart and firstEnd > secondEnd) or
-            (firstStart == secondStart and firstEnd > secondEnd) or
-            (firstStart < secondStart and firstEnd == secondEnd)
+            (firstStart < secondStart and firstEnd > secondEnd)
+            or (firstStart == secondStart and firstEnd > secondEnd)
+            or (firstStart < secondStart and firstEnd == secondEnd)
         )
-    
+
     def __rangeContainsSmallerOrEqual(self, first, second):
         """
         Private method to check, if second is contained in or equal to first.
-        
+
         @param first text range to check against
         @type tuple of (int, int, int, int)
         @param second text range to check for
@@ -465,69 +472,69 @@
         @rtype bool
         """
         return first == second or self.__rangeContainsSmaller(first, second)
-    
+
     def __clearSelection(self):
         """
         Private method to clear all selected items.
         """
         for itm in self.__astWidget.selectedItems():
             itm.setSelected(False)
-    
+
     def __selectItemForEditorSelection(self):
         """
         Private slot to select the item corresponding to an editor selection.
         """
         # step 1: clear all selected items
         self.__clearSelection()
-        
+
         # step 2: retrieve the editor selection
         selection = self.__editor.getSelection()
         # make the line numbers 1-based
-        selection = (selection[0] + 1, selection[1],
-                     selection[2] + 1, selection[3])
-        
+        selection = (selection[0] + 1, selection[1], selection[2] + 1, selection[3])
+
         # step 3: search the corresponding item, scroll to it and select it
         itm = self.__findClosestContainingItem(
-            self.__astWidget.topLevelItem(0), selection)
+            self.__astWidget.topLevelItem(0), selection
+        )
         if itm:
             self.__astWidget.scrollToItem(
-                itm, QAbstractItemView.ScrollHint.PositionAtCenter)
+                itm, QAbstractItemView.ScrollHint.PositionAtCenter
+            )
             itm.setSelected(True)
-    
+
     def __grabFocus(self):
         """
         Private method to grab the input focus.
         """
         self.__astWidget.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def __astItemClicked(self, itm, column):
         """
         Private slot handling a user click on an AST node item.
-        
+
         @param itm reference to the clicked item
         @type QTreeWidgetItem
         @param column column number of the click
         @type int
         """
         self.__editor.clearAllHighlights()
-        
+
         if itm is not None:
             startLine = itm.data(0, self.StartLineRole)
             if startLine is not None:
                 startIndex = itm.data(0, self.StartIndexRole)
                 endLine = itm.data(0, self.EndLineRole)
                 endIndex = itm.data(0, self.EndIndexRole)
-                
-                self.__editor.gotoLine(startLine, firstVisible=True,
-                                       expand=True)
-                self.__editor.setHighlight(startLine - 1, startIndex,
-                                           endLine - 1, endIndex)
-    
+
+                self.__editor.gotoLine(startLine, firstVisible=True, expand=True)
+                self.__editor.setHighlight(
+                    startLine - 1, startIndex, endLine - 1, endIndex
+                )
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
         Public slot handling changes of the AST viewer settings.
         """
-        self.__errorColor = QBrush(
-            Preferences.getPython("ASTViewerErrorColor"))
+        self.__errorColor = QBrush(Preferences.getPython("ASTViewerErrorColor"))
--- a/src/eric7/UI/PythonDisViewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/PythonDisViewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,9 +16,7 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QTimer
 from PyQt6.QtGui import QBrush
-from PyQt6.QtWidgets import (
-    QTreeWidgetItem, QAbstractItemView, QWidget, QMenu
-)
+from PyQt6.QtWidgets import QTreeWidgetItem, QAbstractItemView, QWidget, QMenu
 
 from EricWidgets.EricApplication import ericApp
 from EricGui.EricOverrideCursor import EricOverrideCursor
@@ -32,6 +30,7 @@
     """
     Class implementing the disassembly viewer operation modes.
     """
+
     SOURCEDISASSEMBLY = 0
     TRACEBACK = 1
 
@@ -41,16 +40,17 @@
     Class implementing a widget to visualize the Python Disassembly for some
     Python sources.
     """
+
     StartLineRole = Qt.ItemDataRole.UserRole
     EndLineRole = Qt.ItemDataRole.UserRole + 1
     CodeInfoRole = Qt.ItemDataRole.UserRole + 2
-    
-    def __init__(self, viewmanager,
-                 mode=PythonDisViewerModes.SOURCEDISASSEMBLY,
-                 parent=None):
+
+    def __init__(
+        self, viewmanager, mode=PythonDisViewerModes.SOURCEDISASSEMBLY, parent=None
+    ):
         """
         Constructor
-        
+
         @param viewmanager reference to the viewmanager object
         @type ViewManager
         @param mode operation mode of the viewer
@@ -60,84 +60,86 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowTitle(self.tr("Disassembly"))
-        
+
         self.__vm = viewmanager
         self.__vmConnected = False
-        
+
         self.__mode = mode
-        
+
         self.__editor = None
         self.__source = ""
-        
+
         self.disWidget.setHeaderLabels(
-            [self.tr("Line"), self.tr("Offset"), self.tr("Operation"),
-             self.tr("Parameters"), self.tr("Interpreted Parameters")])
-        self.codeInfoWidget.setHeaderLabels(
-            [self.tr("Key"), self.tr("Value")])
-        
+            [
+                self.tr("Line"),
+                self.tr("Offset"),
+                self.tr("Operation"),
+                self.tr("Parameters"),
+                self.tr("Interpreted Parameters"),
+            ]
+        )
+        self.codeInfoWidget.setHeaderLabels([self.tr("Key"), self.tr("Value")])
+
         self.__disMenu = QMenu(self.disWidget)
         if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY:
             self.__codeInfoAct = self.__disMenu.addAction(
-                self.tr("Show Code Info"), self.__showCodeInfo)
+                self.tr("Show Code Info"), self.__showCodeInfo
+            )
             self.__disMenu.addSeparator()
-        self.__disMenu.addAction(
-            self.tr('Expand All'), self.__expandAllDis)
-        self.__disMenu.addAction(
-            self.tr('Collapse All'), self.__collapseAllDis)
+        self.__disMenu.addAction(self.tr("Expand All"), self.__expandAllDis)
+        self.__disMenu.addAction(self.tr("Collapse All"), self.__collapseAllDis)
         self.__disMenu.addSeparator()
-        self.__disMenu.addAction(
-            self.tr('Configure...'), self.__configure)
-        
+        self.__disMenu.addAction(self.tr("Configure..."), self.__configure)
+
         self.__codeInfoMenu = QMenu(self.codeInfoWidget)
         if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY:
-            self.__codeInfoMenu.addAction(
-                self.tr("Hide"), self.codeInfoWidget.hide)
-        self.__codeInfoMenu.addAction(
-            self.tr('Expand All'), self.__expandAllCodeInfo)
-        self.__codeInfoMenu.addAction(
-            self.tr('Collapse All'), self.__collapseAllCodeInfo)
-        self.__codeInfoMenu.addSeparator()
+            self.__codeInfoMenu.addAction(self.tr("Hide"), self.codeInfoWidget.hide)
+        self.__codeInfoMenu.addAction(self.tr("Expand All"), self.__expandAllCodeInfo)
         self.__codeInfoMenu.addAction(
-            self.tr('Configure...'), self.__configure)
-        
-        self.__errorColor = QBrush(
-            Preferences.getPython("DisViewerErrorColor"))
+            self.tr("Collapse All"), self.__collapseAllCodeInfo
+        )
+        self.__codeInfoMenu.addSeparator()
+        self.__codeInfoMenu.addAction(self.tr("Configure..."), self.__configure)
+
+        self.__errorColor = QBrush(Preferences.getPython("DisViewerErrorColor"))
         self.__currentInstructionColor = QBrush(
-            Preferences.getPython("DisViewerCurrentColor"))
-        self.__jumpTargetColor = QBrush(
-            Preferences.getPython("DisViewerLabeledColor"))
-        
+            Preferences.getPython("DisViewerCurrentColor")
+        )
+        self.__jumpTargetColor = QBrush(Preferences.getPython("DisViewerLabeledColor"))
+
         self.__showCodeInfoDetails = Preferences.getPython(
-            "DisViewerExpandCodeInfoDetails")
-        
+            "DisViewerExpandCodeInfoDetails"
+        )
+
         if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY:
             self.disWidget.itemClicked.connect(self.__disItemClicked)
         self.disWidget.itemCollapsed.connect(self.__resizeDisColumns)
         self.disWidget.itemExpanded.connect(self.__resizeDisColumns)
         self.disWidget.customContextMenuRequested.connect(
-            self.__disContextMenuRequested)
-        
+            self.__disContextMenuRequested
+        )
+
         self.codeInfoWidget.itemCollapsed.connect(self.__resizeCodeInfoColumns)
         self.codeInfoWidget.itemExpanded.connect(self.__resizeCodeInfoColumns)
         self.codeInfoWidget.customContextMenuRequested.connect(
-            self.__codeInfoContextMenuRequested)
-        
+            self.__codeInfoContextMenuRequested
+        )
+
         if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY:
-            self.__vm.disViewerStateChanged.connect(
-                self.__disViewerStateChanged)
-            
+            self.__vm.disViewerStateChanged.connect(self.__disViewerStateChanged)
+
             self.codeInfoWidget.hide()
             self.hide()
-        
+
         elif self.__mode == PythonDisViewerModes.TRACEBACK:
             self.__styleLabels()
-    
+
     def __disContextMenuRequested(self, coord):
         """
         Private slot to show the context menu of the disassembly widget.
-        
+
         @param coord position of the mouse pointer
         @type QPoint
         """
@@ -145,16 +147,16 @@
             itm = self.disWidget.itemAt(coord)
             self.__codeInfoAct.setEnabled(bool(itm.data(0, self.CodeInfoRole)))
             self.disWidget.setCurrentItem(itm)
-        
+
         if self.disWidget.topLevelItemCount() > 0:
             # don't show context menu on empty list
             coord = self.disWidget.mapToGlobal(coord)
             self.__disMenu.popup(coord)
-    
+
     def __editorChanged(self, editor):
         """
         Private slot to handle a change of the current editor.
-        
+
         @param editor reference to the current editor
         @type Editor
         """
@@ -164,22 +166,22 @@
             self.__editor = editor
             if self.__editor:
                 self.__loadDIS()
-    
+
     def __editorSaved(self, editor):
         """
         Private slot to reload the Disassembly after the connected editor was
         saved.
-        
+
         @param editor reference to the editor that performed a save action
         @type Editor
         """
         if editor and editor is self.__editor:
             self.__loadDIS()
-    
+
     def __editorLineChanged(self, editor, lineno):
         """
         Private slot to handle a mouse button double click in the editor.
-        
+
         @param editor reference to the editor, that emitted the signal
         @type Editor
         @param lineno line number of the editor's cursor (zero based)
@@ -189,76 +191,71 @@
             if editor.isModified():
                 # reload the source
                 QTimer.singleShot(0, self.__loadDIS)
-            
+
             # highlight the corresponding entry
             QTimer.singleShot(0, self.__selectItemForEditorLine)
-    
+
     def __editorLanguageChanged(self, editor):
         """
         Private slot to handle a change of the editor language.
-        
+
         @param editor reference to the editor which changed language
         @type Editor
         """
         if editor is self.__editor:
             QTimer.singleShot(0, self.__loadDIS)
-    
+
     def __lastEditorClosed(self):
         """
         Private slot to handle the last editor closed signal of the view
         manager.
         """
         self.hide()
-    
+
     def show(self):
         """
         Public slot to show the DIS viewer.
         """
         super().show()
-        
+
         if (
-            self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY and
-            not self.__vmConnected
+            self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY
+            and not self.__vmConnected
         ):
             self.__vm.editorChangedEd.connect(self.__editorChanged)
             self.__vm.editorSavedEd.connect(self.__editorSaved)
             self.__vm.editorLineChangedEd.connect(self.__editorLineChanged)
-            self.__vm.editorLanguageChanged.connect(
-                self.__editorLanguageChanged)
+            self.__vm.editorLanguageChanged.connect(self.__editorLanguageChanged)
             self.__vmConnected = True
-        
+
         self.__styleLabels()
-    
+
     def hide(self):
         """
         Public slot to hide the DIS viewer.
         """
         super().hide()
-        
+
         if self.__editor:
             self.__editor.clearAllHighlights()
-        
-        if (
-            self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY and
-            self.__vmConnected
-        ):
+
+        if self.__mode == PythonDisViewerModes.SOURCEDISASSEMBLY and self.__vmConnected:
             self.__vm.editorChangedEd.disconnect(self.__editorChanged)
             self.__vm.editorSavedEd.disconnect(self.__editorSaved)
             self.__vm.editorLineChangedEd.disconnect(self.__editorLineChanged)
-            self.__vm.editorLanguageChanged.disconnect(
-                self.__editorLanguageChanged)
+            self.__vm.editorLanguageChanged.disconnect(self.__editorLanguageChanged)
             self.__vmConnected = False
-    
+
     def shutdown(self):
         """
         Public method to perform shutdown actions.
         """
         self.__editor = None
-    
+
     def __disViewerStateChanged(self, on):
         """
         Private slot to toggle the display of the Disassembly viewer.
-        
+
         @param on flag indicating to show the Disassembly
         @type bool
         """
@@ -272,7 +269,7 @@
             else:
                 self.hide()
                 self.__editor = None
-    
+
     def __expandAllDis(self):
         """
         Private slot to expand all items of the disassembly widget.
@@ -281,7 +278,7 @@
         self.disWidget.expandAll()
         self.disWidget.blockSignals(block)
         self.__resizeDisColumns()
-    
+
     def __collapseAllDis(self):
         """
         Private slot to collapse all items of the disassembly widget.
@@ -290,11 +287,11 @@
         self.disWidget.collapseAll()
         self.disWidget.blockSignals(block)
         self.__resizeDisColumns()
-    
+
     def __createErrorItem(self, error):
         """
         Private method to create a top level error item.
-        
+
         @param error error message
         @type str
         @return generated item
@@ -304,11 +301,11 @@
         itm.setFirstColumnSpanned(True)
         itm.setForeground(0, self.__errorColor)
         return itm
-    
+
     def __createTitleItem(self, title, line, parentItem):
         """
         Private method to create a title item.
-        
+
         @param title titel string for the item
         @type str
         @param line start line of the titled disassembly
@@ -321,16 +318,16 @@
         itm = QTreeWidgetItem(parentItem, [title])
         itm.setFirstColumnSpanned(True)
         itm.setExpanded(True)
-        
+
         itm.setData(0, self.StartLineRole, line)
         itm.setData(0, self.EndLineRole, line)
-        
+
         return itm
-    
+
     def __createInstructionItem(self, instr, parent, lasti=-1):
         """
         Private method to create an item for the given instruction.
-        
+
         @param instr instruction the item should be based on
         @type dis.Instruction
         @param parent reference to the parent item
@@ -356,8 +353,8 @@
             fields.append(repr(instr.arg))
             # Column: Opcode argument details
             if instr.argrepr:
-                fields.append('(' + instr.argrepr + ')')
-        
+                fields.append("(" + instr.argrepr + ")")
+
         itm = QTreeWidgetItem(parent, fields)
         for col in (0, 1, 3):
             itm.setTextAlignment(col, Qt.AlignmentFlag.AlignRight)
@@ -379,9 +376,9 @@
         if foreground:
             for col in range(itm.columnCount()):
                 itm.setForeground(col, foreground)
-        
+
         itm.setExpanded(True)
-        
+
         if instr.starts_line:
             itm.setData(0, self.StartLineRole, instr.starts_line)
             itm.setData(0, self.EndLineRole, instr.starts_line)
@@ -391,26 +388,28 @@
             itm.setData(0, self.StartLineRole, lineno)
             itm.setData(0, self.EndLineRole, lineno)
         return itm
-    
+
     def __updateItemEndLine(self, itm):
         """
         Private method to update an items end line based on its children.
-        
+
         @param itm reference to the item to be updated
         @type QTreeWidgetItem
         """
         endLine = (
-            max(itm.child(index).data(0, self.EndLineRole)
-                for index in range(itm.childCount()))
-            if itm.childCount() else
-            itm.data(0, self.StartLineRole)
+            max(
+                itm.child(index).data(0, self.EndLineRole)
+                for index in range(itm.childCount())
+            )
+            if itm.childCount()
+            else itm.data(0, self.StartLineRole)
         )
         itm.setData(0, self.EndLineRole, endLine)
-    
+
     def __createCodeInfo(self, co):
         """
         Private method to create a dictionary containing the code info data.
-        
+
         @param co reference to the code object to generate the info for
         @type code
         @return dictionary containing the code info data
@@ -436,9 +435,9 @@
         except AttributeError:
             # does not exist prior to 3.8.0
             codeInfoDict["posonlyargcount"] = 0
-        
+
         return codeInfoDict
-    
+
     def __loadDIS(self):
         """
         Private method to generate the Disassembly from the source of the
@@ -447,84 +446,82 @@
         if self.__mode != PythonDisViewerModes.SOURCEDISASSEMBLY:
             # wrong mode, just return
             return
-        
+
         if not self.__editor:
-            self.__createErrorItem(self.tr(
-                "No editor has been opened."
-            ))
+            self.__createErrorItem(self.tr("No editor has been opened."))
             return
-        
+
         self.clear()
         self.__editor.clearAllHighlights()
         self.codeInfoWidget.hide()
-        
+
         source = self.__editor.text()
         if not source.strip():
             # empty editor or white space only
-            self.__createErrorItem(self.tr(
-                "The current editor does not contain any source code."
-            ))
+            self.__createErrorItem(
+                self.tr("The current editor does not contain any source code.")
+            )
             return
-        
+
         if not self.__editor.isPyFile():
-            self.__createErrorItem(self.tr(
-                "The current editor does not contain Python source code."
-            ))
+            self.__createErrorItem(
+                self.tr("The current editor does not contain Python source code.")
+            )
             return
-        
+
         filename = self.__editor.getFileName()
         filename = os.path.basename(filename) if filename else "<dis>"
-        
+
         with EricOverrideCursor():
             try:
                 codeObject = tryCompile(source, filename)
             except Exception as exc:
                 codeObject = None
                 self.__createErrorItem(str(exc))
-            
+
             if codeObject:
                 self.setUpdatesEnabled(False)
                 block = self.disWidget.blockSignals(True)
-                
+
                 self.__disassembleObject(codeObject, self.disWidget, filename)
                 QTimer.singleShot(0, self.__resizeDisColumns)
-                
+
                 self.disWidget.blockSignals(block)
                 self.setUpdatesEnabled(True)
-    
+
     @pyqtSlot(dict)
     def showDisassembly(self, disassembly):
         """
         Public slot to receive a code disassembly from the debug client.
-        
+
         @param disassembly dictionary containing the disassembly information
         @type dict
         """
         if (
-            self.__mode == PythonDisViewerModes.TRACEBACK and
-            disassembly and
-            "instructions" in disassembly and
-            disassembly["instructions"]
+            self.__mode == PythonDisViewerModes.TRACEBACK
+            and disassembly
+            and "instructions" in disassembly
+            and disassembly["instructions"]
         ):
             self.disWidget.clear()
-            
+
             self.setUpdatesEnabled(False)
             block = self.disWidget.blockSignals(True)
-            
+
             titleItem = self.__createTitleItem(
                 self.tr("Disassembly of last traceback"),
                 disassembly["firstlineno"],
-                self.disWidget
+                self.disWidget,
             )
-            
+
             lasti = disassembly["lasti"]
             lastStartItem = None
             for instrDict in disassembly["instructions"]:
                 instr = dis.Instruction(
                     instrDict["opname"],
-                    0,                              # dummy value
+                    0,  # dummy value
                     instrDict["arg"],
-                    "",                             # dummy value
+                    "",  # dummy value
                     instrDict["argrepr"],
                     instrDict["offset"],
                     instrDict["lineno"],
@@ -534,33 +531,33 @@
                     if lastStartItem:
                         self.__updateItemEndLine(lastStartItem)
                     lastStartItem = self.__createInstructionItem(
-                        instr, titleItem, lasti=lasti)
+                        instr, titleItem, lasti=lasti
+                    )
                 else:
-                    self.__createInstructionItem(
-                        instr, lastStartItem, lasti=lasti)
+                    self.__createInstructionItem(instr, lastStartItem, lasti=lasti)
             if lastStartItem:
                 self.__updateItemEndLine(lastStartItem)
-            
+
             QTimer.singleShot(0, self.__resizeDisColumns)
-            
+
             self.disWidget.blockSignals(block)
             self.setUpdatesEnabled(True)
-            
+
             if lasti:
                 lastInstructions = self.disWidget.findItems(
                     "{0:d}".format(lasti),
-                    Qt.MatchFlag.MatchFixedString |
-                    Qt.MatchFlag.MatchRecursive,
-                    1
+                    Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchRecursive,
+                    1,
                 )
                 if lastInstructions:
                     self.disWidget.scrollToItem(
                         lastInstructions[0],
-                        QAbstractItemView.ScrollHint.PositionAtCenter)
-            
+                        QAbstractItemView.ScrollHint.PositionAtCenter,
+                    )
+
             if "codeinfo" in disassembly:
                 self.__showCodeInfoData(disassembly["codeinfo"])
-    
+
     def __resizeDisColumns(self):
         """
         Private method to resize the columns of the disassembly widget to
@@ -568,30 +565,30 @@
         """
         for col in range(self.disWidget.columnCount()):
             self.disWidget.resizeColumnToContents(col)
-    
+
     def resizeEvent(self, evt):
         """
         Protected method to handle resize events.
-        
+
         @param evt resize event
         @type QResizeEvent
         """
         # just adjust the sizes of the columns
         self.__resizeDisColumns()
         self.__resizeCodeInfoColumns()
-    
+
     def __clearSelection(self):
         """
         Private method to clear all selected items.
         """
         for itm in self.disWidget.selectedItems():
             itm.setSelected(False)
-    
+
     def __selectChildren(self, itm, lineno):
         """
         Private method to select children of the given item covering the given
         line number.
-        
+
         @param itm reference to the item
         @type QTreeWidgetItem
         @param lineno line number to base the selection on
@@ -600,16 +597,18 @@
         for index in range(itm.childCount()):
             child = itm.child(index)
             if (
-                child.data(0, self.StartLineRole) <= lineno <=
-                child.data(0, self.EndLineRole)
+                child.data(0, self.StartLineRole)
+                <= lineno
+                <= child.data(0, self.EndLineRole)
             ):
                 child.setSelected(True)
                 self.__selectChildren(child, lineno)
-            
+
             if child.data(0, self.StartLineRole) == lineno:
                 self.disWidget.scrollToItem(
-                    child, QAbstractItemView.ScrollHint.PositionAtCenter)
-    
+                    child, QAbstractItemView.ScrollHint.PositionAtCenter
+                )
+
     def __selectItemForEditorLine(self):
         """
         Private slot to select the items corresponding with the cursor line
@@ -617,45 +616,45 @@
         """
         # step 1: clear all selected items
         self.__clearSelection()
-        
+
         # step 2: retrieve the editor cursor line
         cline, cindex = self.__editor.getCursorPosition()
         # make the line numbers 1-based
         cline += 1
-        
+
         for index in range(self.disWidget.topLevelItemCount()):
             itm = self.disWidget.topLevelItem(index)
             if (
-                itm.data(0, self.StartLineRole) <= cline <=
-                itm.data(0, self.EndLineRole)
+                itm.data(0, self.StartLineRole)
+                <= cline
+                <= itm.data(0, self.EndLineRole)
             ):
                 itm.setSelected(True)
                 self.__selectChildren(itm, cline)
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def __disItemClicked(self, itm, column):
         """
         Private slot handling a user click on a Disassembly node item.
-        
+
         @param itm reference to the clicked item
         @type QTreeWidgetItem
         @param column column number of the click
         @type int
         """
         self.__editor.clearAllHighlights()
-        
+
         if itm is not None:
             startLine = itm.data(0, self.StartLineRole)
             endLine = itm.data(0, self.EndLineRole)
-            
-            self.__editor.gotoLine(startLine, firstVisible=True,
-                                   expand=True)
+
+            self.__editor.gotoLine(startLine, firstVisible=True, expand=True)
             self.__editor.setHighlight(startLine - 1, 0, endLine, -1)
-    
+
     def __disassembleObject(self, co, parentItem, parentName="", lasti=-1):
         """
         Private method to disassemble the given code object recursively.
-        
+
         @param co code object to be disassembled
         @type code object
         @param parentItem reference to the parent item
@@ -674,51 +673,50 @@
             else:
                 name = co.co_name
             title = self.tr("Code Object '{0}'").format(name)
-        titleItem = self.__createTitleItem(title, co.co_firstlineno,
-                                           parentItem)
+        titleItem = self.__createTitleItem(title, co.co_firstlineno, parentItem)
         codeInfo = self.__createCodeInfo(co)
         if codeInfo:
             titleItem.setData(0, self.CodeInfoRole, codeInfo)
-        
+
         lastStartItem = None
         for instr in dis.get_instructions(co):
             if instr.starts_line:
                 if lastStartItem:
                     self.__updateItemEndLine(lastStartItem)
                 lastStartItem = self.__createInstructionItem(
-                    instr, titleItem, lasti=lasti)
+                    instr, titleItem, lasti=lasti
+                )
             else:
                 self.__createInstructionItem(instr, lastStartItem, lasti=lasti)
         if lastStartItem:
             self.__updateItemEndLine(lastStartItem)
-        
+
         for x in co.co_consts:
-            if hasattr(x, 'co_code'):
-                self.__disassembleObject(x, titleItem, parentName=name,
-                                         lasti=lasti)
-        
+            if hasattr(x, "co_code"):
+                self.__disassembleObject(x, titleItem, parentName=name, lasti=lasti)
+
         self.__updateItemEndLine(titleItem)
-    
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
         Public slot handling changes of the Disassembly viewer settings.
         """
-        self.__errorColor = QBrush(
-            Preferences.getPython("DisViewerErrorColor"))
+        self.__errorColor = QBrush(Preferences.getPython("DisViewerErrorColor"))
         self.__currentInstructionColor = QBrush(
-            Preferences.getPython("DisViewerCurrentColor"))
-        self.__jumpTargetColor = QBrush(
-            Preferences.getPython("DisViewerLabeledColor"))
-        
+            Preferences.getPython("DisViewerCurrentColor")
+        )
+        self.__jumpTargetColor = QBrush(Preferences.getPython("DisViewerLabeledColor"))
+
         self.__showCodeInfoDetails = Preferences.getPython(
-            "DisViewerExpandCodeInfoDetails")
-        
+            "DisViewerExpandCodeInfoDetails"
+        )
+
         if self.isVisible():
             self.__loadDIS()
-        
+
         self.__styleLabels()
-    
+
     def __styleLabels(self):
         """
         Private method to style the info labels iaw. selected colors.
@@ -732,17 +730,15 @@
         font = self.currentInfoLabel.font()
         font.setItalic(True)
         self.currentInfoLabel.setFont(font)
-        
+
         # labeled instruction
         self.labeledInfoLabel.setStyleSheet(
-            "QLabel {{ color : {0}; }}".format(
-                self.__jumpTargetColor.color().name()
-            )
+            "QLabel {{ color : {0}; }}".format(self.__jumpTargetColor.color().name())
         )
         font = self.labeledInfoLabel.font()
         font.setBold(True)
         self.labeledInfoLabel.setFont(font)
-    
+
     @pyqtSlot()
     def clear(self):
         """
@@ -750,7 +746,7 @@
         """
         self.disWidget.clear()
         self.codeInfoWidget.clear()
-    
+
     def __showCodeInfo(self):
         """
         Private slot handling the context menu action to show code info.
@@ -760,72 +756,78 @@
         if codeInfo:
             self.codeInfoWidget.show()
             self.__showCodeInfoData(codeInfo)
-    
+
     def __showCodeInfoData(self, codeInfo):
         """
         Private method to show the passed code info data.
-        
+
         @param codeInfo dictionary containing the code info data
         @type dict
         """
+
         def createCodeInfoItems(title, infoList):
             """
             Function to create code info items for the given list.
-            
+
             @param title title string for the list
             @type str
             @param infoList list of info strings
             @type list of str
             """
-            parent = QTreeWidgetItem(self.codeInfoWidget,
-                                     [title, str(len(infoList))])
+            parent = QTreeWidgetItem(self.codeInfoWidget, [title, str(len(infoList))])
             parent.setExpanded(self.__showCodeInfoDetails)
-            
+
             for index, value in enumerate(infoList):
                 itm = QTreeWidgetItem(parent, [str(index), str(value)])
                 itm.setTextAlignment(0, Qt.AlignmentFlag.AlignRight)
-        
+
         self.codeInfoWidget.clear()
-        
+
         if codeInfo:
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Name"), codeInfo["name"]])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Filename"), codeInfo["filename"]])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("First Line"), str(codeInfo["firstlineno"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Argument Count"), str(codeInfo["argcount"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Positional-only Arguments"),
-                str(codeInfo["posonlyargcount"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Keyword-only Arguments"),
-                str(codeInfo["kwonlyargcount"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Number of Locals"), str(codeInfo["nlocals"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Stack Size"), str(codeInfo["stacksize"])])
-            QTreeWidgetItem(self.codeInfoWidget, [
-                self.tr("Flags"), codeInfo["flags"]])
+            QTreeWidgetItem(self.codeInfoWidget, [self.tr("Name"), codeInfo["name"]])
+            QTreeWidgetItem(
+                self.codeInfoWidget, [self.tr("Filename"), codeInfo["filename"]]
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget,
+                [self.tr("First Line"), str(codeInfo["firstlineno"])],
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget,
+                [self.tr("Argument Count"), str(codeInfo["argcount"])],
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget,
+                [
+                    self.tr("Positional-only Arguments"),
+                    str(codeInfo["posonlyargcount"]),
+                ],
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget,
+                [self.tr("Keyword-only Arguments"), str(codeInfo["kwonlyargcount"])],
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget,
+                [self.tr("Number of Locals"), str(codeInfo["nlocals"])],
+            )
+            QTreeWidgetItem(
+                self.codeInfoWidget, [self.tr("Stack Size"), str(codeInfo["stacksize"])]
+            )
+            QTreeWidgetItem(self.codeInfoWidget, [self.tr("Flags"), codeInfo["flags"]])
             if codeInfo["consts"]:
-                createCodeInfoItems(self.tr("Constants"),
-                                    codeInfo["consts"])
+                createCodeInfoItems(self.tr("Constants"), codeInfo["consts"])
             if codeInfo["names"]:
-                createCodeInfoItems(self.tr("Names"),
-                                    codeInfo["names"])
+                createCodeInfoItems(self.tr("Names"), codeInfo["names"])
             if codeInfo["varnames"]:
-                createCodeInfoItems(self.tr("Variable Names"),
-                                    codeInfo["varnames"])
+                createCodeInfoItems(self.tr("Variable Names"), codeInfo["varnames"])
             if codeInfo["freevars"]:
-                createCodeInfoItems(self.tr("Free Variables"),
-                                    codeInfo["freevars"])
+                createCodeInfoItems(self.tr("Free Variables"), codeInfo["freevars"])
             if codeInfo["cellvars"]:
-                createCodeInfoItems(self.tr("Cell Variables"),
-                                    codeInfo["cellvars"])
-            
+                createCodeInfoItems(self.tr("Cell Variables"), codeInfo["cellvars"])
+
             QTimer.singleShot(0, self.__resizeCodeInfoColumns)
-    
+
     def __resizeCodeInfoColumns(self):
         """
         Private method to resize the columns of the code info widget to
@@ -833,7 +835,7 @@
         """
         for col in range(self.codeInfoWidget.columnCount()):
             self.codeInfoWidget.resizeColumnToContents(col)
-    
+
     def __expandAllCodeInfo(self):
         """
         Private slot to expand all items of the code info widget.
@@ -842,7 +844,7 @@
         self.codeInfoWidget.expandAll()
         self.codeInfoWidget.blockSignals(block)
         self.__resizeCodeInfoColumns()
-    
+
     def __collapseAllCodeInfo(self):
         """
         Private slot to collapse all items of the code info widget.
@@ -851,11 +853,11 @@
         self.codeInfoWidget.collapseAll()
         self.codeInfoWidget.blockSignals(block)
         self.__resizeCodeInfoColumns()
-    
+
     def __codeInfoContextMenuRequested(self, coord):
         """
         Private slot to show the context menu of the code info widget.
-        
+
         @param coord position of the mouse pointer
         @type QPoint
         """
@@ -863,20 +865,19 @@
             # don't show context menu on empty list
             coord = self.codeInfoWidget.mapToGlobal(coord)
             self.__codeInfoMenu.popup(coord)
-    
+
     def __configure(self):
         """
         Private method to open the configuration dialog.
         """
-        ericApp().getObject("UserInterface").showPreferences(
-            "pythonPage")
+        ericApp().getObject("UserInterface").showPreferences("pythonPage")
 
 
 def tryCompile(source, name):
     """
     Function to attempt to compile the given source, first as an
     expression and then as a statement if the first approach fails.
-    
+
     @param source source code string to be compiled
     @type str
     @param name name of the file containing the source
@@ -885,16 +886,16 @@
     @rtype code object
     """
     try:
-        c = compile(source, name, 'eval')
+        c = compile(source, name, "eval")
     except SyntaxError:
-        c = compile(source, name, 'exec')
+        c = compile(source, name, "exec")
     return c
 
 
 def linestarts(co, filename="", getall=True):
     """
     Function to get the line starts for the given code object.
-    
+
     @param co reference to the compiled code object or the source code
     @type code object or str
     @param filename name of the source file (optional)
@@ -911,10 +912,10 @@
             co = tryCompile(co, fn)
         except SyntaxError:
             return []
-    
+
     starts = [inst[1] for inst in dis.findlinestarts(co)]
     if getall:
         for x in co.co_consts:
-            if hasattr(x, 'co_code'):
+            if hasattr(x, "co_code"):
                 starts.extend(linestarts(x))
     return sorted(starts)
--- a/src/eric7/UI/SearchWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/SearchWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,19 +16,20 @@
 class SearchWidget(QWidget):
     """
     Class implementing the search box for the shell and log viewer.
-    
+
     @signal searchNext(text, caseSensitive, wholeWord, regexp) emitted when the
         user pressed the next button (string, boolean, boolean)
     @signal searchPrevious(text, caseSensitive, wholeWord, regexp) emitted when
         the user pressed the previous button (string, boolean, boolean)
     """
+
     searchNext = pyqtSignal(str, bool, bool, bool)
     searchPrevious = pyqtSignal(str, bool, bool, bool)
-    
+
     def __init__(self, mainWindow, parent=None, spacer=True, showLine=False):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window
         @type QWidget
         @param parent reference to the parent widget
@@ -40,20 +41,21 @@
         @type bool
         """
         super().__init__(parent)
-        
+
         if showLine:
             from .Ui_SearchWidgetLine import Ui_SearchWidgetLine
+
             self.__ui = Ui_SearchWidgetLine()
         else:
             from .Ui_SearchWidget import Ui_SearchWidget
+
             self.__ui = Ui_SearchWidget()
         self.__ui.setupUi(self)
-        
+
         if not showLine:
             if spacer:
                 spacerItem = QSpacerItem(
-                    20, 1,
-                    QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
+                    20, 1, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
                 )
                 self.__ui.verticalLayout.addItem(spacerItem)
             else:
@@ -62,44 +64,42 @@
                 sizePolicy = self.__ui.findtextCombo.sizePolicy()
                 sizePolicy.setHorizontalPolicy(QSizePolicy.Policy.Expanding)
                 self.__ui.findtextCombo.setSizePolicy(sizePolicy)
-        
+
         self.__mainWindow = mainWindow
         self.__findBackwards = True
-        
-        self.__ui.closeButton.setIcon(
-            UI.PixmapCache.getIcon("close"))
-        self.__ui.findPrevButton.setIcon(
-            UI.PixmapCache.getIcon("1leftarrow"))
-        self.__ui.findNextButton.setIcon(
-            UI.PixmapCache.getIcon("1rightarrow"))
-        
+
+        self.__ui.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
+        self.__ui.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
+        self.__ui.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
+
         self.findHistory = []
-        
+
         self.__ui.findtextCombo.setCompleter(None)
         self.__ui.findtextCombo.lineEdit().returnPressed.connect(
-            self.__findByReturnPressed)
-        
+            self.__findByReturnPressed
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def on_closeButton_clicked(self):
         """
         Private slot to close the widget.
         """
         self.close()
-    
+
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event (QKeyEvent)
         """
         if event.key() == Qt.Key.Key_Escape:
             self.__mainWindow.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
             event.accept()
             self.close()
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
@@ -109,9 +109,9 @@
         if not txt and not self.isVisible():
             self.showFind()
             return
-        
+
         self.__findBackwards = False
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.findHistory:
@@ -119,14 +119,14 @@
         self.findHistory.insert(0, txt)
         self.__ui.findtextCombo.clear()
         self.__ui.findtextCombo.addItems(self.findHistory)
-        
+
         self.searchNext.emit(
             txt,
             self.__ui.caseCheckBox.isChecked(),
             self.__ui.wordCheckBox.isChecked(),
             self.__ui.regexpCheckBox.isChecked(),
         )
-    
+
     @pyqtSlot()
     def on_findPrevButton_clicked(self):
         """
@@ -136,9 +136,9 @@
         if not txt and not self.isVisible():
             self.showFind()
             return
-        
+
         self.__findBackwards = True
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.findHistory:
@@ -146,32 +146,32 @@
         self.findHistory.insert(0, txt)
         self.__ui.findtextCombo.clear()
         self.__ui.findtextCombo.addItems(self.findHistory)
-        
+
         self.searchPrevious.emit(
             txt,
             self.__ui.caseCheckBox.isChecked(),
             self.__ui.wordCheckBox.isChecked(),
             self.__ui.regexpCheckBox.isChecked(),
         )
-    
+
     @pyqtSlot(str)
     def on_findtextCombo_editTextChanged(self, txt):
         """
         Private slot to enable/disable the find buttons.
-        
+
         @param txt text of the combobox (string)
         """
         self.__setSearchButtons(txt != "")
-    
+
     def __setSearchButtons(self, enabled):
         """
         Private slot to set the state of the search buttons.
-        
+
         @param enabled flag indicating the state (boolean)
         """
         self.__ui.findPrevButton.setEnabled(enabled)
         self.__ui.findNextButton.setEnabled(enabled)
-    
+
     def __findByReturnPressed(self):
         """
         Private slot to handle the returnPressed signal of the findtext
@@ -185,27 +185,26 @@
     def showFind(self, txt=""):
         """
         Public method to display this widget.
-        
+
         @param txt text to be shown in the combo (string)
         """
         self.__ui.findtextCombo.clear()
         self.__ui.findtextCombo.addItems(self.findHistory)
         self.__ui.findtextCombo.setEditText(txt)
         self.__ui.findtextCombo.setFocus()
-        
+
         self.__setSearchButtons(txt != "")
-        
+
         self.show()
-    
+
     def searchStringFound(self, found):
         """
         Public slot to indicate that the search string was found.
-        
+
         @param found flag indicating success (boolean)
         """
         if found:
             self.__ui.statusLabel.clear()
         else:
             txt = self.__ui.findtextCombo.currentText()
-            self.__ui.statusLabel.setText(
-                self.tr("'{0}' was not found.").format(txt))
+            self.__ui.statusLabel.setText(self.tr("'{0}' was not found.").format(txt))
--- a/src/eric7/UI/SplashScreen.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/SplashScreen.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,32 +21,31 @@
     """
     Class implementing a splashscreen for eric.
     """
+
     def __init__(self):
         """
         Constructor
         """
-        ericPic = QPixmap(
-            os.path.join(getConfig('ericPixDir'), 'ericSplash.png'))
+        ericPic = QPixmap(os.path.join(getConfig("ericPixDir"), "ericSplash.png"))
         self.labelAlignment = (
-            Qt.AlignmentFlag.AlignBottom |
-            Qt.AlignmentFlag.AlignRight |
-            Qt.AlignmentFlag.AlignAbsolute
+            Qt.AlignmentFlag.AlignBottom
+            | Qt.AlignmentFlag.AlignRight
+            | Qt.AlignmentFlag.AlignAbsolute
         )
         super().__init__(ericPic)
         self.show()
         QApplication.processEvents()
-        
+
     def showMessage(self, msg):
         """
         Public method to show a message in the bottom part of the splashscreen.
-        
+
         @param msg message to be shown (string)
         """
         logging.debug(msg)
-        super().showMessage(
-            msg, self.labelAlignment, QColor(Qt.GlobalColor.white))
+        super().showMessage(msg, self.labelAlignment, QColor(Qt.GlobalColor.white))
         QApplication.processEvents()
-        
+
     def clearMessage(self):
         """
         Public method to clear the message shown.
@@ -58,34 +57,35 @@
 class NoneSplashScreen:
     """
     Class implementing a "None" splashscreen for eric.
-    
+
     This class implements the same interface as the real splashscreen,
     but simply does nothing.
     """
+
     def __init__(self):
         """
         Constructor
         """
         pass
-        
+
     def showMessage(self, msg):
         """
         Public method to show a message in the bottom part of the splashscreen.
-        
+
         @param msg message to be shown (string)
         """
         logging.debug(msg)
-        
+
     def clearMessage(self):
         """
         Public method to clear the message shown.
         """
         pass
-        
+
     def finish(self, widget):
         """
         Public method to finish the splash screen.
-        
+
         @param widget widget to wait for (QWidget)
         """
         pass
--- a/src/eric7/UI/SymbolsWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/SymbolsWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,13 @@
 import html.entities
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, QAbstractTableModel, QModelIndex, Qt,
-    QItemSelectionModel, QLocale
+    pyqtSlot,
+    pyqtSignal,
+    QAbstractTableModel,
+    QModelIndex,
+    Qt,
+    QItemSelectionModel,
+    QLocale,
 )
 from PyQt6.QtGui import QColor
 from PyQt6.QtWidgets import QWidget, QHeaderView, QAbstractItemView
@@ -30,16 +35,17 @@
     """
     Class implementing the model for the symbols widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__locale = QLocale()
-        
+
         self.__headerData = [
             self.tr("Code"),
             self.tr("Char"),
@@ -47,321 +53,309 @@
             self.tr("HTML"),
             self.tr("Name"),
         ]
-        
+
         self.__isDark = ericApp().usesDarkPalette()
-        
+
         self.__tables = [
             # first   last     display name
-            (0x0, 0x1f, self.tr("Control Characters")),
-            (0x20, 0x7f, self.tr("Basic Latin")),
-            (0x80, 0xff, self.tr("Latin-1 Supplement")),
-            (0x100, 0x17f, self.tr("Latin Extended-A")),
-            (0x180, 0x24f, self.tr("Latin Extended-B")),
-            (0x250, 0x2af, self.tr("IPA Extensions")),
-            (0x2b0, 0x2ff, self.tr("Spacing Modifier Letters")),
-            (0x300, 0x36f, self.tr("Combining Diacritical Marks")),
-            (0x370, 0x3ff, self.tr("Greek and Coptic")),
-            (0x400, 0x4ff, self.tr("Cyrillic")),
-            (0x500, 0x52f, self.tr("Cyrillic Supplement")),
-            (0x530, 0x58f, self.tr("Armenian")),
-            (0x590, 0x5ff, self.tr("Hebrew")),
-            (0x600, 0x6ff, self.tr("Arabic")),
-            (0x700, 0x74f, self.tr("Syriac")),
-            (0x780, 0x7bf, self.tr("Thaana")),
-            (0x7c0, 0x7ff, self.tr("N'Ko")),
-            (0x800, 0x83f, self.tr("Samaritan")),
-            (0x840, 0x85f, self.tr("Mandaic")),
-            (0x8a0, 0x8ff, self.tr("Arabic Extended-A")),
-            (0x900, 0x97f, self.tr("Devanagari")),
-            (0x980, 0x9ff, self.tr("Bengali")),
-            (0xa00, 0xa7f, self.tr("Gurmukhi")),
-            (0xa80, 0xaff, self.tr("Gujarati")),
-            (0xb00, 0xb7f, self.tr("Oriya")),
-            (0xb80, 0xbff, self.tr("Tamil")),
-            (0xc00, 0xc7f, self.tr("Telugu")),
-            (0xc80, 0xcff, self.tr("Kannada")),
-            (0xd00, 0xd7f, self.tr("Malayalam")),
-            (0xd80, 0xdff, self.tr("Sinhala")),
-            (0xe00, 0xe7f, self.tr("Thai")),
-            (0xe80, 0xeff, self.tr("Lao")),
-            (0xf00, 0xfff, self.tr("Tibetan")),
-            (0x1000, 0x109f, self.tr("Myanmar")),
-            (0x10a0, 0x10ff, self.tr("Georgian")),
-            (0x1100, 0x11ff, self.tr("Hangul Jamo")),
-            (0x1200, 0x137f, self.tr("Ethiopic")),
-            (0x1380, 0x139f, self.tr("Ethiopic Supplement")),
-            (0x13a0, 0x13ff, self.tr("Cherokee")),
-            (0x1400, 0x167f,
-             self.tr("Unified Canadian Aboriginal Syllabics")),
-            (0x1680, 0x169f, self.tr("Ogham")),
-            (0x16a0, 0x16ff, self.tr("Runic")),
-            (0x1700, 0x171f, self.tr("Tagalog")),
-            (0x1720, 0x173f, self.tr("Hanunoo")),
-            (0x1740, 0x175f, self.tr("Buhid")),
-            (0x1760, 0x177f, self.tr("Tagbanwa")),
-            (0x1780, 0x17ff, self.tr("Khmer")),
-            (0x1800, 0x18af, self.tr("Mongolian")),
-            (0x18b0, 0x18ff,
-             self.tr("Unified Canadian Aboriginal Syllabics Extended")),
-            (0x1900, 0x194f, self.tr("Limbu")),
-            (0x1950, 0x197f, self.tr("Tai Le")),
-            (0x19e0, 0x19ff, self.tr("Khmer Symbols")),
-            (0x1a00, 0x1a1f, self.tr("Buginese")),
-            (0x1a20, 0x1aaf, self.tr("Tai Tham")),
-            (0x1b00, 0x1b7f, self.tr("Balinese")),
-            (0x1b80, 0x1bbf, self.tr("Sundanese")),
-            (0x1bc0, 0x1bff, self.tr("Batak")),
-            (0x1c00, 0x1c4f, self.tr("Lepcha")),
-            (0x1c50, 0x1c7f, self.tr("Ol Chiki")),
-            (0x1cc0, 0x1ccf, self.tr("Sundanese Supplement")),
-            (0x1cd0, 0x1cff, self.tr("Vedic Extensions")),
-            (0x1d00, 0x1d7f, self.tr("Phonetic Extensions")),
-            (0x1d80, 0x1dbf, self.tr("Phonetic Extensions Supplement")),
-            (0x1dc0, 0x1dff,
-             self.tr("Combining Diacritical Marks Supplement")),
-            (0x1e00, 0x1eff, self.tr("Latin Extended Additional")),
-            (0x1f00, 0x1fff, self.tr("Greek Extended")),
-            (0x2000, 0x206f, self.tr("General Punctuation")),
-            (0x2070, 0x209f, self.tr("Superscripts and Subscripts")),
-            (0x20a0, 0x20cf, self.tr("Currency Symbols")),
-            (0x20d0, 0x20ff, self.tr("Combining Diacritical Marks")),
-            (0x2100, 0x214f, self.tr("Letterlike Symbols")),
-            (0x2150, 0x218f, self.tr("Number Forms")),
-            (0x2190, 0x21ff, self.tr("Arcolumns")),
-            (0x2200, 0x22ff, self.tr("Mathematical Operators")),
-            (0x2300, 0x23ff, self.tr("Miscellaneous Technical")),
-            (0x2400, 0x243f, self.tr("Control Pictures")),
-            (0x2440, 0x245f, self.tr("Optical Character Recognition")),
-            (0x2460, 0x24ff, self.tr("Enclosed Alphanumerics")),
-            (0x2500, 0x257f, self.tr("Box Drawing")),
-            (0x2580, 0x259f, self.tr("Block Elements")),
-            (0x25A0, 0x25ff, self.tr("Geometric Shapes")),
-            (0x2600, 0x26ff, self.tr("Miscellaneous Symbols")),
-            (0x2700, 0x27bf, self.tr("Dingbats")),
-            (0x27c0, 0x27ef,
-             self.tr("Miscellaneous Mathematical Symbols-A")),
-            (0x27f0, 0x27ff, self.tr("Supplement Arcolumns-A")),
-            (0x2800, 0x28ff, self.tr("Braille Patterns")),
-            (0x2900, 0x297f, self.tr("Supplement Arcolumns-B")),
-            (0x2980, 0x29ff,
-             self.tr("Miscellaneous Mathematical Symbols-B")),
-            (0x2a00, 0x2aff,
-             self.tr("Supplemental Mathematical Operators")),
-            (0x2b00, 0x2bff,
-             self.tr("Miscellaneous Symbols and Arcolumns")),
-            (0x2c00, 0x2c5f, self.tr("Glagolitic")),
-            (0x2c60, 0x2c7f, self.tr("Latin Extended-C")),
-            (0x2c80, 0x2cff, self.tr("Coptic")),
-            (0x2d00, 0x2d2f, self.tr("Georgian Supplement")),
-            (0x2d30, 0x2d7f, self.tr("Tifinagh")),
-            (0x2d80, 0x2ddf, self.tr("Ethiopic Extended")),
-            (0x2de0, 0x2dff, self.tr("Cyrillic Extended-A")),
-            (0x2e00, 0x2e7f, self.tr("Supplemental Punctuation")),
-            (0x2e80, 0x2eff, self.tr("CJK Radicals Supplement")),
-            (0x2f00, 0x2fdf, self.tr("KangXi Radicals")),
-            (0x2ff0, 0x2fff, self.tr("Ideographic Description Chars")),
-            (0x3000, 0x303f, self.tr("CJK Symbols and Punctuation")),
-            (0x3040, 0x309f, self.tr("Hiragana")),
-            (0x30a0, 0x30ff, self.tr("Katakana")),
-            (0x3100, 0x312f, self.tr("Bopomofo")),
-            (0x3130, 0x318f, self.tr("Hangul Compatibility Jamo")),
-            (0x3190, 0x319f, self.tr("Kanbun")),
-            (0x31a0, 0x31bf, self.tr("Bopomofo Extended")),
-            (0x31c0, 0x31ef, self.tr("CJK Strokes")),
-            (0x31f0, 0x31ff, self.tr("Katakana Phonetic Extensions")),
-            (0x3200, 0x32ff, self.tr("Enclosed CJK Letters and Months")),
-            (0x3300, 0x33ff, self.tr("CJK Compatibility")),
-            (0x3400, 0x4dbf, self.tr("CJK Unified Ideogr. Ext. A")),
-            (0x4dc0, 0x4dff, self.tr("Yijing Hexagram Symbols")),
-            (0x4e00, 0x9fff, self.tr("CJK Unified Ideographs")),
-            (0xa000, 0xa48f, self.tr("Yi Syllables")),
-            (0xa490, 0xa4cf, self.tr("Yi Radicals")),
-            (0xa4d0, 0xa4ff, self.tr("Lisu")),
-            (0xa500, 0xa63f, self.tr("Vai")),
-            (0xa640, 0xa69f, self.tr("Cyrillic Extended-B")),
-            (0xa6a0, 0xa6ff, self.tr("Bamum")),
-            (0xa700, 0xa71f, self.tr("Modifier Tone Letters")),
-            (0xa720, 0xa7ff, self.tr("Latin Extended-D")),
-            (0xa800, 0xa82f, self.tr("Syloti Nagri")),
-            (0xa830, 0xa83f, self.tr("Common Indic Number Forms")),
-            (0xa840, 0xa87f, self.tr("Phags-pa")),
-            (0xa880, 0xa8df, self.tr("Saurashtra")),
-            (0xa8e0, 0xa8ff, self.tr("Devanagari Extended")),
-            (0xa900, 0xa92f, self.tr("Kayah Li")),
-            (0xa930, 0xa95f, self.tr("Rejang")),
-            (0xa960, 0xa97f, self.tr("Hangul Jamo Extended-A")),
-            (0xa980, 0xa9df, self.tr("Javanese")),
-            (0xaa00, 0xaa5f, self.tr("Cham")),
-            (0xaa60, 0xaa7f, self.tr("Myanmar Extended-A")),
-            (0xaa80, 0xaadf, self.tr("Tai Viet")),
-            (0xaae0, 0xaaff, self.tr("Meetei Mayek Extensions")),
-            (0xab00, 0xab2f, self.tr("Ethiopic Extended-A")),
-            (0xabc0, 0xabff, self.tr("Meetei Mayek")),
-            (0xac00, 0xd7af, self.tr("Hangul Syllables")),
-            (0xd7b0, 0xd7ff, self.tr("Hangul Jamo Extended-B")),
-            (0xd800, 0xdb7f, self.tr("High Surrogates")),
-            (0xdb80, 0xdbff, self.tr("High Private Use Surrogates")),
-            (0xdc00, 0xdfff, self.tr("Low Surrogates")),
-            (0xe000, 0xf8ff, self.tr("Private Use")),
-            (0xf900, 0xfaff, self.tr("CJK Compatibility Ideographs")),
-            (0xfb00, 0xfb4f, self.tr("Alphabetic Presentation Forms")),
-            (0xfb50, 0xfdff, self.tr("Arabic Presentation Forms-A")),
-            (0xfe00, 0xfe0f, self.tr("Variation Selectors")),
-            (0xfe10, 0xfe1f, self.tr("Vertical Forms")),
-            (0xfe20, 0xfe2f, self.tr("Combining Half Marks")),
-            (0xfe30, 0xfe4f, self.tr("CJK Compatibility Forms")),
-            (0xfe50, 0xfe6f, self.tr("Small Form Variants")),
-            (0xfe70, 0xfeff, self.tr("Arabic Presentation Forms-B")),
-            (0xff00, 0xffef, self.tr("Half- and Fullwidth Forms")),
-            (0xfff0, 0xffff, self.tr("Specials")),
+            (0x0, 0x1F, self.tr("Control Characters")),
+            (0x20, 0x7F, self.tr("Basic Latin")),
+            (0x80, 0xFF, self.tr("Latin-1 Supplement")),
+            (0x100, 0x17F, self.tr("Latin Extended-A")),
+            (0x180, 0x24F, self.tr("Latin Extended-B")),
+            (0x250, 0x2AF, self.tr("IPA Extensions")),
+            (0x2B0, 0x2FF, self.tr("Spacing Modifier Letters")),
+            (0x300, 0x36F, self.tr("Combining Diacritical Marks")),
+            (0x370, 0x3FF, self.tr("Greek and Coptic")),
+            (0x400, 0x4FF, self.tr("Cyrillic")),
+            (0x500, 0x52F, self.tr("Cyrillic Supplement")),
+            (0x530, 0x58F, self.tr("Armenian")),
+            (0x590, 0x5FF, self.tr("Hebrew")),
+            (0x600, 0x6FF, self.tr("Arabic")),
+            (0x700, 0x74F, self.tr("Syriac")),
+            (0x780, 0x7BF, self.tr("Thaana")),
+            (0x7C0, 0x7FF, self.tr("N'Ko")),
+            (0x800, 0x83F, self.tr("Samaritan")),
+            (0x840, 0x85F, self.tr("Mandaic")),
+            (0x8A0, 0x8FF, self.tr("Arabic Extended-A")),
+            (0x900, 0x97F, self.tr("Devanagari")),
+            (0x980, 0x9FF, self.tr("Bengali")),
+            (0xA00, 0xA7F, self.tr("Gurmukhi")),
+            (0xA80, 0xAFF, self.tr("Gujarati")),
+            (0xB00, 0xB7F, self.tr("Oriya")),
+            (0xB80, 0xBFF, self.tr("Tamil")),
+            (0xC00, 0xC7F, self.tr("Telugu")),
+            (0xC80, 0xCFF, self.tr("Kannada")),
+            (0xD00, 0xD7F, self.tr("Malayalam")),
+            (0xD80, 0xDFF, self.tr("Sinhala")),
+            (0xE00, 0xE7F, self.tr("Thai")),
+            (0xE80, 0xEFF, self.tr("Lao")),
+            (0xF00, 0xFFF, self.tr("Tibetan")),
+            (0x1000, 0x109F, self.tr("Myanmar")),
+            (0x10A0, 0x10FF, self.tr("Georgian")),
+            (0x1100, 0x11FF, self.tr("Hangul Jamo")),
+            (0x1200, 0x137F, self.tr("Ethiopic")),
+            (0x1380, 0x139F, self.tr("Ethiopic Supplement")),
+            (0x13A0, 0x13FF, self.tr("Cherokee")),
+            (0x1400, 0x167F, self.tr("Unified Canadian Aboriginal Syllabics")),
+            (0x1680, 0x169F, self.tr("Ogham")),
+            (0x16A0, 0x16FF, self.tr("Runic")),
+            (0x1700, 0x171F, self.tr("Tagalog")),
+            (0x1720, 0x173F, self.tr("Hanunoo")),
+            (0x1740, 0x175F, self.tr("Buhid")),
+            (0x1760, 0x177F, self.tr("Tagbanwa")),
+            (0x1780, 0x17FF, self.tr("Khmer")),
+            (0x1800, 0x18AF, self.tr("Mongolian")),
+            (0x18B0, 0x18FF, self.tr("Unified Canadian Aboriginal Syllabics Extended")),
+            (0x1900, 0x194F, self.tr("Limbu")),
+            (0x1950, 0x197F, self.tr("Tai Le")),
+            (0x19E0, 0x19FF, self.tr("Khmer Symbols")),
+            (0x1A00, 0x1A1F, self.tr("Buginese")),
+            (0x1A20, 0x1AAF, self.tr("Tai Tham")),
+            (0x1B00, 0x1B7F, self.tr("Balinese")),
+            (0x1B80, 0x1BBF, self.tr("Sundanese")),
+            (0x1BC0, 0x1BFF, self.tr("Batak")),
+            (0x1C00, 0x1C4F, self.tr("Lepcha")),
+            (0x1C50, 0x1C7F, self.tr("Ol Chiki")),
+            (0x1CC0, 0x1CCF, self.tr("Sundanese Supplement")),
+            (0x1CD0, 0x1CFF, self.tr("Vedic Extensions")),
+            (0x1D00, 0x1D7F, self.tr("Phonetic Extensions")),
+            (0x1D80, 0x1DBF, self.tr("Phonetic Extensions Supplement")),
+            (0x1DC0, 0x1DFF, self.tr("Combining Diacritical Marks Supplement")),
+            (0x1E00, 0x1EFF, self.tr("Latin Extended Additional")),
+            (0x1F00, 0x1FFF, self.tr("Greek Extended")),
+            (0x2000, 0x206F, self.tr("General Punctuation")),
+            (0x2070, 0x209F, self.tr("Superscripts and Subscripts")),
+            (0x20A0, 0x20CF, self.tr("Currency Symbols")),
+            (0x20D0, 0x20FF, self.tr("Combining Diacritical Marks")),
+            (0x2100, 0x214F, self.tr("Letterlike Symbols")),
+            (0x2150, 0x218F, self.tr("Number Forms")),
+            (0x2190, 0x21FF, self.tr("Arcolumns")),
+            (0x2200, 0x22FF, self.tr("Mathematical Operators")),
+            (0x2300, 0x23FF, self.tr("Miscellaneous Technical")),
+            (0x2400, 0x243F, self.tr("Control Pictures")),
+            (0x2440, 0x245F, self.tr("Optical Character Recognition")),
+            (0x2460, 0x24FF, self.tr("Enclosed Alphanumerics")),
+            (0x2500, 0x257F, self.tr("Box Drawing")),
+            (0x2580, 0x259F, self.tr("Block Elements")),
+            (0x25A0, 0x25FF, self.tr("Geometric Shapes")),
+            (0x2600, 0x26FF, self.tr("Miscellaneous Symbols")),
+            (0x2700, 0x27BF, self.tr("Dingbats")),
+            (0x27C0, 0x27EF, self.tr("Miscellaneous Mathematical Symbols-A")),
+            (0x27F0, 0x27FF, self.tr("Supplement Arcolumns-A")),
+            (0x2800, 0x28FF, self.tr("Braille Patterns")),
+            (0x2900, 0x297F, self.tr("Supplement Arcolumns-B")),
+            (0x2980, 0x29FF, self.tr("Miscellaneous Mathematical Symbols-B")),
+            (0x2A00, 0x2AFF, self.tr("Supplemental Mathematical Operators")),
+            (0x2B00, 0x2BFF, self.tr("Miscellaneous Symbols and Arcolumns")),
+            (0x2C00, 0x2C5F, self.tr("Glagolitic")),
+            (0x2C60, 0x2C7F, self.tr("Latin Extended-C")),
+            (0x2C80, 0x2CFF, self.tr("Coptic")),
+            (0x2D00, 0x2D2F, self.tr("Georgian Supplement")),
+            (0x2D30, 0x2D7F, self.tr("Tifinagh")),
+            (0x2D80, 0x2DDF, self.tr("Ethiopic Extended")),
+            (0x2DE0, 0x2DFF, self.tr("Cyrillic Extended-A")),
+            (0x2E00, 0x2E7F, self.tr("Supplemental Punctuation")),
+            (0x2E80, 0x2EFF, self.tr("CJK Radicals Supplement")),
+            (0x2F00, 0x2FDF, self.tr("KangXi Radicals")),
+            (0x2FF0, 0x2FFF, self.tr("Ideographic Description Chars")),
+            (0x3000, 0x303F, self.tr("CJK Symbols and Punctuation")),
+            (0x3040, 0x309F, self.tr("Hiragana")),
+            (0x30A0, 0x30FF, self.tr("Katakana")),
+            (0x3100, 0x312F, self.tr("Bopomofo")),
+            (0x3130, 0x318F, self.tr("Hangul Compatibility Jamo")),
+            (0x3190, 0x319F, self.tr("Kanbun")),
+            (0x31A0, 0x31BF, self.tr("Bopomofo Extended")),
+            (0x31C0, 0x31EF, self.tr("CJK Strokes")),
+            (0x31F0, 0x31FF, self.tr("Katakana Phonetic Extensions")),
+            (0x3200, 0x32FF, self.tr("Enclosed CJK Letters and Months")),
+            (0x3300, 0x33FF, self.tr("CJK Compatibility")),
+            (0x3400, 0x4DBF, self.tr("CJK Unified Ideogr. Ext. A")),
+            (0x4DC0, 0x4DFF, self.tr("Yijing Hexagram Symbols")),
+            (0x4E00, 0x9FFF, self.tr("CJK Unified Ideographs")),
+            (0xA000, 0xA48F, self.tr("Yi Syllables")),
+            (0xA490, 0xA4CF, self.tr("Yi Radicals")),
+            (0xA4D0, 0xA4FF, self.tr("Lisu")),
+            (0xA500, 0xA63F, self.tr("Vai")),
+            (0xA640, 0xA69F, self.tr("Cyrillic Extended-B")),
+            (0xA6A0, 0xA6FF, self.tr("Bamum")),
+            (0xA700, 0xA71F, self.tr("Modifier Tone Letters")),
+            (0xA720, 0xA7FF, self.tr("Latin Extended-D")),
+            (0xA800, 0xA82F, self.tr("Syloti Nagri")),
+            (0xA830, 0xA83F, self.tr("Common Indic Number Forms")),
+            (0xA840, 0xA87F, self.tr("Phags-pa")),
+            (0xA880, 0xA8DF, self.tr("Saurashtra")),
+            (0xA8E0, 0xA8FF, self.tr("Devanagari Extended")),
+            (0xA900, 0xA92F, self.tr("Kayah Li")),
+            (0xA930, 0xA95F, self.tr("Rejang")),
+            (0xA960, 0xA97F, self.tr("Hangul Jamo Extended-A")),
+            (0xA980, 0xA9DF, self.tr("Javanese")),
+            (0xAA00, 0xAA5F, self.tr("Cham")),
+            (0xAA60, 0xAA7F, self.tr("Myanmar Extended-A")),
+            (0xAA80, 0xAADF, self.tr("Tai Viet")),
+            (0xAAE0, 0xAAFF, self.tr("Meetei Mayek Extensions")),
+            (0xAB00, 0xAB2F, self.tr("Ethiopic Extended-A")),
+            (0xABC0, 0xABFF, self.tr("Meetei Mayek")),
+            (0xAC00, 0xD7AF, self.tr("Hangul Syllables")),
+            (0xD7B0, 0xD7FF, self.tr("Hangul Jamo Extended-B")),
+            (0xD800, 0xDB7F, self.tr("High Surrogates")),
+            (0xDB80, 0xDBFF, self.tr("High Private Use Surrogates")),
+            (0xDC00, 0xDFFF, self.tr("Low Surrogates")),
+            (0xE000, 0xF8FF, self.tr("Private Use")),
+            (0xF900, 0xFAFF, self.tr("CJK Compatibility Ideographs")),
+            (0xFB00, 0xFB4F, self.tr("Alphabetic Presentation Forms")),
+            (0xFB50, 0xFDFF, self.tr("Arabic Presentation Forms-A")),
+            (0xFE00, 0xFE0F, self.tr("Variation Selectors")),
+            (0xFE10, 0xFE1F, self.tr("Vertical Forms")),
+            (0xFE20, 0xFE2F, self.tr("Combining Half Marks")),
+            (0xFE30, 0xFE4F, self.tr("CJK Compatibility Forms")),
+            (0xFE50, 0xFE6F, self.tr("Small Form Variants")),
+            (0xFE70, 0xFEFF, self.tr("Arabic Presentation Forms-B")),
+            (0xFF00, 0xFFEF, self.tr("Half- and Fullwidth Forms")),
+            (0xFFF0, 0xFFFF, self.tr("Specials")),
         ]
-        if sys.maxunicode > 0xffff:
-            self.__tables.extend([
-                (0x10000, 0x1007f, self.tr("Linear B Syllabary")),
-                (0x10080, 0x100ff, self.tr("Linear B Ideograms")),
-                (0x10100, 0x1013f, self.tr("Aegean Numbers")),
-                (0x10140, 0x1018f, self.tr("Ancient Greek Numbers")),
-                (0x10190, 0x101cf, self.tr("Ancient Symbols")),
-                (0x101d0, 0x101ff, self.tr("Phaistos Disc")),
-                (0x10280, 0x1029f, self.tr("Lycian")),
-                (0x102a0, 0x102df, self.tr("Carian")),
-                (0x10300, 0x1032f, self.tr("Old Italic")),
-                (0x10330, 0x1034f, self.tr("Gothic")),
-                (0x10380, 0x1039f, self.tr("Ugaritic")),
-                (0x103a0, 0x103df, self.tr("Old Persian")),
-                (0x10400, 0x1044f, self.tr("Deseret")),
-                (0x10450, 0x1047f, self.tr("Shavian")),
-                (0x10480, 0x104af, self.tr("Osmanya")),
-                (0x10800, 0x1083f, self.tr("Cypriot Syllabary")),
-                (0x10840, 0x1085f, self.tr("Imperial Aramaic")),
-                (0x10900, 0x1091f, self.tr("Phoenician")),
-                (0x10920, 0x1093f, self.tr("Lydian")),
-                (0x10980, 0x1099f, self.tr("Meroitic Hieroglyphs")),
-                (0x109a0, 0x109ff, self.tr("Meroitic Cursive")),
-                (0x10a00, 0x10a5f, self.tr("Kharoshthi")),
-                (0x10a60, 0x10a7f, self.tr("Old South Arabian")),
-                (0x10b00, 0x10b3f, self.tr("Avestan")),
-                (0x10b40, 0x10b5f, self.tr("Inscriptional Parthian")),
-                (0x10b60, 0x10b7f, self.tr("Inscriptional Pahlavi")),
-                (0x10c00, 0x10c4f, self.tr("Old Turkic")),
-                (0x10e60, 0x10e7f, self.tr("Rumi Numeral Symbols")),
-                (0x11000, 0x1107f, self.tr("Brahmi")),
-                (0x11080, 0x110cf, self.tr("Kaithi")),
-                (0x110d0, 0x110ff, self.tr("Sora Sompeng")),
-                (0x11100, 0x1114f, self.tr("Chakma")),
-                (0x11180, 0x111df, self.tr("Sharada")),
-                (0x11680, 0x116cf, self.tr("Takri")),
-                (0x12000, 0x123ff, self.tr("Cuneiform")),
-                (0x12400, 0x1247f,
-                 self.tr("Cuneiform Numbers and Punctuation")),
-                (0x13000, 0x1342f, self.tr("Egyptian Hieroglyphs")),
-                (0x16800, 0x16a3f, self.tr("Bamum Supplement")),
-                (0x16f00, 0x16f9f, self.tr("Miao")),
-                (0x1b000, 0x1b0ff, self.tr("Kana Supplement")),
-                (0x1d000, 0x1d0ff, self.tr("Byzantine Musical Symbols")),
-                (0x1d100, 0x1d1ff, self.tr("Musical Symbols")),
-                (0x1d200, 0x1d24f,
-                 self.tr("Ancient Greek Musical Notation")),
-                (0x1d300, 0x1d35f, self.tr("Tai Xuan Jing Symbols")),
-                (0x1d360, 0x1d37f,
-                 self.tr("Counting Rod Numerals")),
-                (0x1d400, 0x1d7ff,
-                 self.tr("Mathematical Alphanumeric Symbols")),
-                (0x1ee00, 0x1eeff,
-                 self.tr("Arabic Mathematical Alphabetic Symbols")),
-                (0x1f000, 0x1f02f, self.tr("Mahjong Tiles")),
-                (0x1f030, 0x1f09f, self.tr("Domino Tiles")),
-                (0x1f0a0, 0x1f0ff, self.tr("Playing Cards")),
-                (0x1f100, 0x1f1ff,
-                 self.tr("Enclosed Alphanumeric Supplement")),
-                (0x1f200, 0x1f2ff,
-                 self.tr("Enclosed Ideographic Supplement")),
-                (0x1f300, 0x1f5ff,
-                 self.tr("Miscellaneous Symbols And Pictographs")),
-                (0x1f600, 0x1f64f, self.tr("Emoticons")),
-                (0x1f680, 0x1f6ff, self.tr("Transport And Map Symbols")),
-                (0x1f700, 0x1f77f, self.tr("Alchemical Symbols")),
-                (0x20000, 0x2a6df, self.tr("CJK Unified Ideogr. Ext. B")),
-                (0x2a700, 0x2b73f,
-                 self.tr("CJK Unified Ideographs Extension C")),
-                (0x2b740, 0x2b81f,
-                 self.tr("CJK Unified Ideographs Extension D")),
-                (0x2f800, 0x2fa1f,
-                 self.tr("CJK Compatapility Ideogr. Suppl.")),
-                (0xe0000, 0xe007f, self.tr("Tags")),
-                (0xe0100, 0xe01ef,
-                 self.tr("Variation Selectors Supplement")),
-                (0xf0000, 0xfffff,
-                 self.tr("Supplementary Private Use Area-A")),
-                (0x100000, 0x10ffff,
-                 self.tr("Supplementary Private Use Area-B")),
-            ])
+        if sys.maxunicode > 0xFFFF:
+            self.__tables.extend(
+                [
+                    (0x10000, 0x1007F, self.tr("Linear B Syllabary")),
+                    (0x10080, 0x100FF, self.tr("Linear B Ideograms")),
+                    (0x10100, 0x1013F, self.tr("Aegean Numbers")),
+                    (0x10140, 0x1018F, self.tr("Ancient Greek Numbers")),
+                    (0x10190, 0x101CF, self.tr("Ancient Symbols")),
+                    (0x101D0, 0x101FF, self.tr("Phaistos Disc")),
+                    (0x10280, 0x1029F, self.tr("Lycian")),
+                    (0x102A0, 0x102DF, self.tr("Carian")),
+                    (0x10300, 0x1032F, self.tr("Old Italic")),
+                    (0x10330, 0x1034F, self.tr("Gothic")),
+                    (0x10380, 0x1039F, self.tr("Ugaritic")),
+                    (0x103A0, 0x103DF, self.tr("Old Persian")),
+                    (0x10400, 0x1044F, self.tr("Deseret")),
+                    (0x10450, 0x1047F, self.tr("Shavian")),
+                    (0x10480, 0x104AF, self.tr("Osmanya")),
+                    (0x10800, 0x1083F, self.tr("Cypriot Syllabary")),
+                    (0x10840, 0x1085F, self.tr("Imperial Aramaic")),
+                    (0x10900, 0x1091F, self.tr("Phoenician")),
+                    (0x10920, 0x1093F, self.tr("Lydian")),
+                    (0x10980, 0x1099F, self.tr("Meroitic Hieroglyphs")),
+                    (0x109A0, 0x109FF, self.tr("Meroitic Cursive")),
+                    (0x10A00, 0x10A5F, self.tr("Kharoshthi")),
+                    (0x10A60, 0x10A7F, self.tr("Old South Arabian")),
+                    (0x10B00, 0x10B3F, self.tr("Avestan")),
+                    (0x10B40, 0x10B5F, self.tr("Inscriptional Parthian")),
+                    (0x10B60, 0x10B7F, self.tr("Inscriptional Pahlavi")),
+                    (0x10C00, 0x10C4F, self.tr("Old Turkic")),
+                    (0x10E60, 0x10E7F, self.tr("Rumi Numeral Symbols")),
+                    (0x11000, 0x1107F, self.tr("Brahmi")),
+                    (0x11080, 0x110CF, self.tr("Kaithi")),
+                    (0x110D0, 0x110FF, self.tr("Sora Sompeng")),
+                    (0x11100, 0x1114F, self.tr("Chakma")),
+                    (0x11180, 0x111DF, self.tr("Sharada")),
+                    (0x11680, 0x116CF, self.tr("Takri")),
+                    (0x12000, 0x123FF, self.tr("Cuneiform")),
+                    (0x12400, 0x1247F, self.tr("Cuneiform Numbers and Punctuation")),
+                    (0x13000, 0x1342F, self.tr("Egyptian Hieroglyphs")),
+                    (0x16800, 0x16A3F, self.tr("Bamum Supplement")),
+                    (0x16F00, 0x16F9F, self.tr("Miao")),
+                    (0x1B000, 0x1B0FF, self.tr("Kana Supplement")),
+                    (0x1D000, 0x1D0FF, self.tr("Byzantine Musical Symbols")),
+                    (0x1D100, 0x1D1FF, self.tr("Musical Symbols")),
+                    (0x1D200, 0x1D24F, self.tr("Ancient Greek Musical Notation")),
+                    (0x1D300, 0x1D35F, self.tr("Tai Xuan Jing Symbols")),
+                    (0x1D360, 0x1D37F, self.tr("Counting Rod Numerals")),
+                    (0x1D400, 0x1D7FF, self.tr("Mathematical Alphanumeric Symbols")),
+                    (
+                        0x1EE00,
+                        0x1EEFF,
+                        self.tr("Arabic Mathematical Alphabetic Symbols"),
+                    ),
+                    (0x1F000, 0x1F02F, self.tr("Mahjong Tiles")),
+                    (0x1F030, 0x1F09F, self.tr("Domino Tiles")),
+                    (0x1F0A0, 0x1F0FF, self.tr("Playing Cards")),
+                    (0x1F100, 0x1F1FF, self.tr("Enclosed Alphanumeric Supplement")),
+                    (0x1F200, 0x1F2FF, self.tr("Enclosed Ideographic Supplement")),
+                    (
+                        0x1F300,
+                        0x1F5FF,
+                        self.tr("Miscellaneous Symbols And Pictographs"),
+                    ),
+                    (0x1F600, 0x1F64F, self.tr("Emoticons")),
+                    (0x1F680, 0x1F6FF, self.tr("Transport And Map Symbols")),
+                    (0x1F700, 0x1F77F, self.tr("Alchemical Symbols")),
+                    (0x20000, 0x2A6DF, self.tr("CJK Unified Ideogr. Ext. B")),
+                    (0x2A700, 0x2B73F, self.tr("CJK Unified Ideographs Extension C")),
+                    (0x2B740, 0x2B81F, self.tr("CJK Unified Ideographs Extension D")),
+                    (0x2F800, 0x2FA1F, self.tr("CJK Compatapility Ideogr. Suppl.")),
+                    (0xE0000, 0xE007F, self.tr("Tags")),
+                    (0xE0100, 0xE01EF, self.tr("Variation Selectors Supplement")),
+                    (0xF0000, 0xFFFFF, self.tr("Supplementary Private Use Area-A")),
+                    (0x100000, 0x10FFFF, self.tr("Supplementary Private Use Area-B")),
+                ]
+            )
         self.__currentTableIndex = 0
-    
+
     def getTableNames(self):
         """
         Public method to get a list of table names.
-        
+
         @return list of table names (list of strings)
         """
         return [table[2] for table in self.__tables]
-    
+
     def getTableBoundaries(self, index):
         """
         Public method to get the first and last character position
         of the given table.
-        
+
         @param index index of the character table (integer)
         @return first and last character position (integer, integer)
         """
         return self.__tables[index][0], self.__tables[index][1]
-    
+
     def getTableIndex(self):
         """
         Public method to get the current table index.
-        
+
         @return current table index (integer)
         """
         return self.__currentTableIndex
-    
+
     def selectTable(self, index):
         """
         Public method to select the shown character table.
-        
+
         @param index index of the character table (integer)
         """
         self.beginResetModel()
         self.__currentTableIndex = index
         self.endResetModel()
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get header data from the model.
-        
+
         @param section section number (integer)
         @param orientation orientation (Qt.Orientation)
         @param role role of the data to retrieve (Qt.ItemDataRole)
         @return requested data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             return self.__headerData[section]
-        
+
         return QAbstractTableModel.headerData(self, section, orientation, role)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         symbolId = self.__tables[self.__currentTableIndex][0] + index.row()
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             col = index.column()
             if col == 0:
@@ -372,20 +366,16 @@
                 return "0x{0:04x}".format(symbolId)
             elif col == 3:
                 if symbolId in html.entities.codepoint2name:
-                    return "&{0};".format(
-                        html.entities.codepoint2name[symbolId])
+                    return "&{0};".format(html.entities.codepoint2name[symbolId])
             elif col == 4:
-                return unicodedata.name(chr(symbolId), '').title()
-        
-        if (
-            role == Qt.ItemDataRole.BackgroundRole and
-            index.column() == 0
-        ):
+                return unicodedata.name(chr(symbolId), "").title()
+
+        if role == Qt.ItemDataRole.BackgroundRole and index.column() == 0:
             if self.__isDark:
                 return QColor("#4d4d4d")
             else:
                 return QColor(Qt.GlobalColor.lightGray)
-        
+
         if role == Qt.ItemDataRole.ForegroundRole:
             char = chr(symbolId)
             if self.__isDark:
@@ -414,19 +404,16 @@
                     return QColor(Qt.GlobalColor.darkMagenta)
                 else:
                     return QColor(Qt.GlobalColor.darkGray)
-        
-        if (
-            role == Qt.ItemDataRole.TextAlignmentRole and
-            index.column() in [0, 1, 3]
-        ):
+
+        if role == Qt.ItemDataRole.TextAlignmentRole and index.column() in [0, 1, 3]:
             return Qt.AlignmentFlag.AlignHCenter.value
-        
+
         return None
-    
+
     def columnCount(self, parent):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of columns (integer)
         """
@@ -434,11 +421,11 @@
             return 0
         else:
             return len(self.__headerData)
-    
+
     def rowCount(self, parent):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of columns (integer)
         """
@@ -447,58 +434,64 @@
         else:
             first, last = self.__tables[self.__currentTableIndex][:2]
             return last - first + 1
-    
+
     def __isDigit(self, char):
         """
         Private method to check, if a character is a digit.
-        
+
         @param char character to test (one character string)
         @return flag indicating a digit (boolean)
         """
         return unicodedata.category(str(char)) == "Nd"
-    
+
     def __isLetter(self, char):
         """
         Private method to check, if a character is a letter.
-        
+
         @param char character to test (one character string)
         @return flag indicating a letter (boolean)
         """
-        return unicodedata.category(str(char)) in ["Lu", "Ll", "Lt", "Lm",
-                                                   "Lo"]
-    
+        return unicodedata.category(str(char)) in ["Lu", "Ll", "Lt", "Lm", "Lo"]
+
     def __isMark(self, char):
         """
         Private method to check, if a character is a mark character.
-        
+
         @param char character to test (one character string)
         @return flag indicating a mark character (boolean)
         """
         return unicodedata.category(str(char)) in ["Mn", "Mc", "Me"]
-    
+
     def __isSymbol(self, char):
         """
         Private method to check, if a character is a symbol.
-        
+
         @param char character to test (one character string)
         @return flag indicating a symbol (boolean)
         """
         return unicodedata.category(str(char)) in ["Sm", "Sc", "Sk", "So"]
-    
+
     def __isPunct(self, char):
         """
         Private method to check, if a character is a punctuation character.
-        
+
         @param char character to test (one character string)
         @return flag indicating a punctuation character (boolean)
         """
-        return unicodedata.category(str(char)) in ["Pc", "Pd", "Ps", "Pe",
-                                                   "Pi", "Pf", "Po"]
-    
+        return unicodedata.category(str(char)) in [
+            "Pc",
+            "Pd",
+            "Ps",
+            "Pe",
+            "Pi",
+            "Pf",
+            "Po",
+        ]
+
     def getLocale(self):
         """
         Public method to get the used locale.
-        
+
         @return used locale
         @rtype QLocale
         """
@@ -508,29 +501,32 @@
 class SymbolsWidget(QWidget, Ui_SymbolsWidget):
     """
     Class implementing a widget to select a symbol in various formats.
-    
+
     @signal insertSymbol(str) emitted after the user has selected a symbol
     """
+
     insertSymbol = pyqtSignal(str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
-        
+
         self.__model = SymbolsModel(self)
         self.symbolsTable.setModel(self.__model)
         self.symbolsTable.selectionModel().currentRowChanged.connect(
-            self.__currentRowChanged)
-        
+            self.__currentRowChanged
+        )
+
         self.symbolsTable.horizontalHeader().setSectionResizeMode(
-            QHeaderView.ResizeMode.Fixed)
+            QHeaderView.ResizeMode.Fixed
+        )
         fm = self.fontMetrics()
         try:
             em = fm.horizontalAdvance("M")
@@ -541,75 +537,74 @@
         self.symbolsTable.horizontalHeader().resizeSection(2, em * 6)
         self.symbolsTable.horizontalHeader().resizeSection(3, em * 8)
         self.symbolsTable.horizontalHeader().resizeSection(4, em * 85)
-        self.symbolsTable.verticalHeader().setDefaultSectionSize(
-            fm.height() + 4)
-        
-        tableIndex = int(
-            Preferences.getSettings().value("Symbols/CurrentTable", 1))
+        self.symbolsTable.verticalHeader().setDefaultSectionSize(fm.height() + 4)
+
+        tableIndex = int(Preferences.getSettings().value("Symbols/CurrentTable", 1))
         self.tableCombo.addItems(self.__model.getTableNames())
         self.tableCombo.setCurrentIndex(tableIndex)
-        
+
         index = self.__model.index(
-            int(Preferences.getSettings().value("Symbols/Top", 0)),
-            0)
-        self.symbolsTable.scrollTo(
-            index, QAbstractItemView.ScrollHint.PositionAtTop)
+            int(Preferences.getSettings().value("Symbols/Top", 0)), 0
+        )
+        self.symbolsTable.scrollTo(index, QAbstractItemView.ScrollHint.PositionAtTop)
         self.symbolsTable.selectionModel().setCurrentIndex(
             index,
-            QItemSelectionModel.SelectionFlag.SelectCurrent |
-            QItemSelectionModel.SelectionFlag.Rows
+            QItemSelectionModel.SelectionFlag.SelectCurrent
+            | QItemSelectionModel.SelectionFlag.Rows,
         )
-    
+
     @pyqtSlot(QModelIndex)
     def on_symbolsTable_activated(self, index):
         """
         Private slot to signal the selection of a symbol.
-        
+
         @param index index of the selected symbol (QModelIndex)
         """
         txt = self.__model.data(index)
         if txt:
             self.insertSymbol.emit(txt)
-    
+
     @pyqtSlot()
     def on_symbolSpinBox_editingFinished(self):
         """
         Private slot to move the table to the entered symbol id.
         """
         symbolId = self.symbolSpinBox.value()
-        first, last = self.__model.getTableBoundaries(
-            self.__model.getTableIndex())
+        first, last = self.__model.getTableBoundaries(self.__model.getTableIndex())
         row = symbolId - first
         self.symbolsTable.selectRow(row)
         self.symbolsTable.scrollTo(
-            self.__model.index(row, 0),
-            QAbstractItemView.ScrollHint.PositionAtCenter)
-    
+            self.__model.index(row, 0), QAbstractItemView.ScrollHint.PositionAtCenter
+        )
+
     @pyqtSlot(int)
     def on_tableCombo_currentIndexChanged(self, index):
         """
         Private slot to select the current character table.
-        
+
         @param index index of the character table (integer)
         """
         self.symbolsTable.setUpdatesEnabled(False)
         self.__model.selectTable(index)
         self.symbolsTable.setUpdatesEnabled(True)
         self.symbolsTable.resizeColumnsToContents()
-        
+
         first, last = self.__model.getTableBoundaries(index)
         self.symbolSpinBox.setMinimum(first)
         self.symbolSpinBox.setMaximum(last)
-        
+
         Preferences.getSettings().setValue("Symbols/CurrentTable", index)
-    
+
     def __currentRowChanged(self, current, previous):
         """
         Private slot recording the currently selected row.
-        
+
         @param current current index (QModelIndex)
         @param previous previous current index (QModelIndex)
         """
         Preferences.getSettings().setValue("Symbols/Top", current.row())
-        self.symbolSpinBox.setValue(self.__model.getLocale().toInt(
-            self.__model.data(self.__model.index(current.row(), 0)))[0])
+        self.symbolSpinBox.setValue(
+            self.__model.getLocale().toInt(
+                self.__model.data(self.__model.index(current.row(), 0))
+            )[0]
+        )
--- a/src/eric7/UI/UserInterface.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/UserInterface.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,15 +19,36 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSlot, QTimer, QFile, pyqtSignal, PYQT_VERSION_STR, QDate, QIODevice,
-    qVersion, QProcess, QSize, QUrl, QObject, Qt, QUuid, QThread, QUrlQuery
+    pyqtSlot,
+    QTimer,
+    QFile,
+    pyqtSignal,
+    PYQT_VERSION_STR,
+    QDate,
+    QIODevice,
+    qVersion,
+    QProcess,
+    QSize,
+    QUrl,
+    QObject,
+    Qt,
+    QUuid,
+    QThread,
+    QUrlQuery,
 )
-from PyQt6.QtGui import (
-    QAction, QKeySequence, QDesktopServices, QSessionManager
-)
+from PyQt6.QtGui import QAction, QKeySequence, QDesktopServices, QSessionManager
 from PyQt6.QtWidgets import (
-    QSizePolicy, QWidget, QWhatsThis, QToolBar, QDialog, QSplitter,
-    QApplication, QMenu, QVBoxLayout, QDockWidget, QLabel
+    QSizePolicy,
+    QWidget,
+    QWhatsThis,
+    QToolBar,
+    QDialog,
+    QSplitter,
+    QApplication,
+    QMenu,
+    QVBoxLayout,
+    QDockWidget,
+    QLabel,
 )
 from PyQt6.Qsci import QSCINTILLA_VERSION_STR
 from PyQt6.QtNetwork import QNetworkProxyFactory, QNetworkAccessManager
@@ -57,12 +78,13 @@
 
 from EricNetwork.EricNetworkIcon import EricNetworkIcon
 from EricNetwork.EricNetworkProxyFactory import (
-    EricNetworkProxyFactory, proxyAuthenticationRequired
+    EricNetworkProxyFactory,
+    proxyAuthenticationRequired,
 )
+
 try:
-    from EricNetwork.EricSslErrorHandler import (
-        EricSslErrorHandler, EricSslErrorState
-    )
+    from EricNetwork.EricSslErrorHandler import EricSslErrorHandler, EricSslErrorState
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -73,17 +95,18 @@
 class Redirector(QObject):
     """
     Helper class used to redirect stdout and stderr to the log window.
-    
+
     @signal appendStderr(str) emitted to write data to stderr logger
     @signal appendStdout(str) emitted to write data to stdout logger
     """
+
     appendStderr = pyqtSignal(str)
     appendStdout = pyqtSignal(str)
-    
+
     def __init__(self, stderr, parent=None):
         """
         Constructor
-        
+
         @param stderr flag indicating stderr is being redirected
         @type bool
         @param parent reference to the parent object
@@ -91,12 +114,12 @@
         """
         super().__init__(parent)
         self.stderr = stderr
-        self.buffer = ''
-        
+        self.buffer = ""
+
     def __nWrite(self, n):
         """
         Private method used to write data.
-        
+
         @param n max number of bytes to write
         """
         if n:
@@ -106,26 +129,26 @@
             else:
                 self.appendStdout.emit(line)
             self.buffer = self.buffer[n:]
-            
+
     def __bufferedWrite(self):
         """
         Private method returning number of characters to write.
-        
+
         @return number of characters buffered or length of buffered line
             (integer)
         """
-        return self.buffer.rfind('\n') + 1
-        
+        return self.buffer.rfind("\n") + 1
+
     def flush(self):
         """
         Public method used to flush the buffered data.
         """
         self.__nWrite(len(self.buffer))
-        
+
     def write(self, s):
         """
         Public method used to write data.
-        
+
         @param s data to be written (it must support the str-method)
         """
         self.buffer += str(s)
@@ -135,7 +158,7 @@
 class UserInterface(EricMainWindow):
     """
     Class implementing the main user interface.
-    
+
     @signal appendStderr(str) emitted to write data to stderr logger
     @signal appendStdout(str) emitted to write data to stdout logger
     @signal preferencesChanged() emitted after the preferences were changed
@@ -147,6 +170,7 @@
     @signal onlineStateChanged(online) emitted to indicate a change of the
         network state
     """
+
     appendStderr = pyqtSignal(str)
     appendStdout = pyqtSignal(str)
     preferencesChanged = pyqtSignal()
@@ -154,22 +178,32 @@
     showMenu = pyqtSignal(str, QMenu)
     masterPasswordChanged = pyqtSignal(str, str)
     onlineStateChanged = pyqtSignal(bool)
-    
+
     maxFilePathLen = 100
     maxMenuFilePathLen = 75
-    
+
     LeftSide = 1
     BottomSide = 2
     RightSide = 3
-    
+
     ErrorLogFileName = "eric7_error.log"
-    
-    def __init__(self, app, locale, splash, plugin, disabledPlugins,
-                 noOpenAtStartup, noCrashOpenAtStartup, disableCrashSession,
-                 restartArguments, originalPathString):
+
+    def __init__(
+        self,
+        app,
+        locale,
+        splash,
+        plugin,
+        disabledPlugins,
+        noOpenAtStartup,
+        noCrashOpenAtStartup,
+        disableCrashSession,
+        restartArguments,
+        originalPathString,
+    ):
         """
         Constructor
-        
+
         @param app reference to the application object
         @type EricApplication
         @param locale locale to be used by the UI
@@ -198,31 +232,30 @@
         @type str
         """
         super().__init__()
-        
+
         self.__restartArgs = restartArguments[:]
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.maxEditorPathLen = Preferences.getUI("CaptionFilenameLength")
         self.locale = locale
         self.__openAtStartup = not noOpenAtStartup
         self.__noCrashOpenAtStartup = noCrashOpenAtStartup
         self.__disableCrashSession = disableCrashSession
         self.__disabledPlugins = disabledPlugins[:]
-        
+
         self.__originalPathString = originalPathString
-        
+
         if app.usesSmallScreen():
             # override settings for small screens
             Preferences.setUI("LayoutType", "Sidebars")
             Preferences.setUI("CombinedLeftRightSidebar", True)
             Preferences.setUI("IconBarSize", "sm")
-        
+
         self.__layoutType = Preferences.getUI("LayoutType")
-        
+
         self.passiveMode = Preferences.getDebugger("PassiveDbgEnabled")
-        
+
         g = Preferences.getGeometry("MainGeometry")
         if g.isEmpty():
             s = QSize(1280, 720)
@@ -230,114 +263,128 @@
         else:
             self.restoreGeometry(g)
         self.__startup = True
-        
+
         if Preferences.getUI("UseSystemProxy"):
             QNetworkProxyFactory.setUseSystemConfiguration(True)
         else:
             self.__proxyFactory = EricNetworkProxyFactory()
-            QNetworkProxyFactory.setApplicationProxyFactory(
-                self.__proxyFactory)
+            QNetworkProxyFactory.setApplicationProxyFactory(self.__proxyFactory)
             QNetworkProxyFactory.setUseSystemConfiguration(False)
-        
+
         self.capProject = ""
         self.capEditor = ""
         self.captionShowsFilename = Preferences.getUI("CaptionShowsFilename")
-        
+
         QApplication.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.setWindowIcon(UI.PixmapCache.getIcon("eric"))
         self.__setWindowCaption()
-        
+
         # load the view profiles
         self.profiles = Preferences.getUI("ViewProfiles")
-        
+
         splash.showMessage(self.tr("Initializing Basic Services..."))
-        
+
         # Generate the conda interface
         logging.debug("Creating Conda Interface...")
         from CondaInterface.Conda import Conda
+
         self.condaInterface = Conda(self)
         ericApp().registerObject("Conda", self.condaInterface)
-        
+
         # Generate the pip interface
         logging.debug("Creating Pip Interface...")
         from PipInterface.Pip import Pip
+
         self.pipInterface = Pip(self)
         ericApp().registerObject("Pip", self.pipInterface)
-        
+
         # Generate the virtual environment manager
         logging.debug("Creating Virtual Environments Manager...")
         from VirtualEnv.VirtualenvManager import VirtualenvManager
+
         self.virtualenvManager = VirtualenvManager(self)
         # register it early because it is needed very soon
         ericApp().registerObject("VirtualEnvManager", self.virtualenvManager)
-        
+
         # Generate an empty project object and multi project object
         logging.debug("Creating Project Manager...")
         from Project.Project import Project
+
         self.project = Project(self)
         ericApp().registerObject("Project", self.project)
-        
+
         from MultiProject.MultiProject import MultiProject
+
         logging.debug("Creating Multi-Project Manager...")
         self.multiProject = MultiProject(self.project, self)
-        
+
         # Generate the debug server object
         logging.debug("Creating Debug Server...")
         from Debugger.DebugServer import DebugServer
+
         self.__debugServer = DebugServer(
-            self.__originalPathString, project=self.project, parent=self)
-        
+            self.__originalPathString, project=self.project, parent=self
+        )
+
         # Create the background service object
         from Utilities.BackgroundService import BackgroundService
+
         self.backgroundService = BackgroundService(self)
-        
+
         splash.showMessage(self.tr("Initializing Plugin Manager..."))
-        
+
         # Initialize the Plugin Manager (Plugins are initialized later
         from PluginManager.PluginManager import PluginManager
-        self.pluginManager = PluginManager(self, self.__disabledPlugins,
-                                           develPlugin=plugin)
-        
+
+        self.pluginManager = PluginManager(
+            self, self.__disabledPlugins, develPlugin=plugin
+        )
+
         splash.showMessage(self.tr("Generating Main User Interface..."))
-        
+
         self.__webBrowserProcess = None
         self.__webBrowserClient = None
         self.__webBrowserSAName = QUuid.createUuid().toString()[1:-1]
-        
+
         # set spellchecker defaults
         from QScintilla.SpellChecker import SpellChecker
+
         SpellChecker.setDefaultLanguage(
-            Preferences.getEditor("SpellCheckingDefaultLanguage"))
-        
+            Preferences.getEditor("SpellCheckingDefaultLanguage")
+        )
+
         with contextlib.suppress(ImportError, AttributeError):
             from EricWidgets.EricSpellCheckedTextEdit import SpellCheckMixin
+
             pwl = SpellChecker.getUserDictionaryPath(isException=False)
             pel = SpellChecker.getUserDictionaryPath(isException=True)
             SpellCheckMixin.setDefaultLanguage(
-                Preferences.getEditor("SpellCheckingDefaultLanguage"),
-                pwl, pel)
-        
+                Preferences.getEditor("SpellCheckingDefaultLanguage"), pwl, pel
+            )
+
         logging.debug("Creating Application Objects...")
         self.__createObjects()
-        
+
         # Create the main window now so that we can connect QActions to it.
         logging.debug("Creating Layout...")
         self.__createLayout()
         self.__currentRightWidget = None
         self.__currentBottomWidget = None
-        
+
         # Generate the debugger part of the ui
         logging.debug("Creating Debugger UI...")
         from Debugger.DebugUI import DebugUI
-        self.debuggerUI = DebugUI(self, self.viewmanager, self.__debugServer,
-                                  self.debugViewer, self.project)
+
+        self.debuggerUI = DebugUI(
+            self, self.viewmanager, self.__debugServer, self.debugViewer, self.project
+        )
         self.debugViewer.setDebugger(self.debuggerUI)
         self.shell.setDebuggerUI(self.debuggerUI)
-        
+
         # Generate the redirection helpers
         self.stdout = Redirector(False, self)
         self.stderr = Redirector(True, self)
-        
+
         # set a few dialog members for non-modal dialogs created on demand
         self.programsDialog = None
         self.shortcutsDialog = None
@@ -351,133 +398,151 @@
         self.__readingSession = False
         self.__versionsDialog = None
         self.__configurationDialog = None
-        
+
         # now setup the connections
         splash.showMessage(self.tr("Setting up connections..."))
-        
+
         self.debugViewer.exceptionLogger.sourceFile.connect(
-            self.viewmanager.openSourceFile)
-        
+            self.viewmanager.openSourceFile
+        )
+
         self.debugViewer.sourceFile.connect(self.viewmanager.showDebugSource)
-        
+
         self.taskViewer.displayFile.connect(self.viewmanager.openSourceFile)
-        
+
         self.projectBrowser.psBrowser.sourceFile[str].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.psBrowser.sourceFile[str, int].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.psBrowser.sourceFile[str, list].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.psBrowser.sourceFile[str, int, str].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.psBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
-        self.projectBrowser.psBrowser.testFile.connect(
-            self.__startTestScript)
-        
+            self.viewmanager.closeWindow
+        )
+        self.projectBrowser.psBrowser.testFile.connect(self.__startTestScript)
+
         self.projectBrowser.pfBrowser.designerFile.connect(self.__designer)
         self.projectBrowser.pfBrowser.sourceFile.connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.pfBrowser.uipreview.connect(self.__UIPreviewer)
         self.projectBrowser.pfBrowser.trpreview.connect(self.__TRPreviewer)
         self.projectBrowser.pfBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.pfBrowser.appendStderr.connect(self.appendToStderr)
-        
+
         self.projectBrowser.prBrowser.sourceFile.connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.prBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.prBrowser.appendStderr.connect(self.appendToStderr)
-        
+
         self.projectBrowser.ptBrowser.linguistFile.connect(self.__linguist)
         self.projectBrowser.ptBrowser.sourceFile.connect(
-            self.viewmanager.openSourceFile)
-        self.projectBrowser.ptBrowser.trpreview[list].connect(
-            self.__TRPreviewer)
-        self.projectBrowser.ptBrowser.trpreview[list, bool].connect(
-            self.__TRPreviewer)
+            self.viewmanager.openSourceFile
+        )
+        self.projectBrowser.ptBrowser.trpreview[list].connect(self.__TRPreviewer)
+        self.projectBrowser.ptBrowser.trpreview[list, bool].connect(self.__TRPreviewer)
         self.projectBrowser.ptBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.ptBrowser.appendStdout.connect(self.appendToStdout)
         self.projectBrowser.ptBrowser.appendStderr.connect(self.appendToStderr)
-        
+
         self.projectBrowser.piBrowser.sourceFile[str].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.piBrowser.sourceFile[str, int].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.piBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.piBrowser.appendStdout.connect(self.appendToStdout)
         self.projectBrowser.piBrowser.appendStderr.connect(self.appendToStderr)
-        
+
         self.projectBrowser.ppBrowser.sourceFile[str].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.ppBrowser.sourceFile[str, int].connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.ppBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.ppBrowser.appendStdout.connect(self.appendToStdout)
         self.projectBrowser.ppBrowser.appendStderr.connect(self.appendToStderr)
-        
+
         self.projectBrowser.poBrowser.sourceFile.connect(
-            self.viewmanager.openSourceFile)
+            self.viewmanager.openSourceFile
+        )
         self.projectBrowser.poBrowser.closeSourceWindow.connect(
-            self.viewmanager.closeWindow)
+            self.viewmanager.closeWindow
+        )
         self.projectBrowser.poBrowser.pixmapEditFile.connect(self.__editPixmap)
         self.projectBrowser.poBrowser.pixmapFile.connect(self.__showPixmap)
         self.projectBrowser.poBrowser.svgFile.connect(self.__showSvg)
         self.projectBrowser.poBrowser.umlFile.connect(self.__showUml)
         self.projectBrowser.poBrowser.binaryFile.connect(self.__openHexEditor)
-        
+
         self.project.sourceFile.connect(self.viewmanager.openSourceFile)
         self.project.designerFile.connect(self.__designer)
         self.project.linguistFile.connect(self.__linguist)
         self.project.projectOpened.connect(self.viewmanager.projectOpened)
         self.project.projectClosed.connect(self.viewmanager.projectClosed)
-        self.project.projectFileRenamed.connect(
-            self.viewmanager.projectFileRenamed)
+        self.project.projectFileRenamed.connect(self.viewmanager.projectFileRenamed)
         self.project.lexerAssociationsChanged.connect(
-            self.viewmanager.projectLexerAssociationsChanged)
+            self.viewmanager.projectLexerAssociationsChanged
+        )
         self.project.newProject.connect(self.__newProject)
         self.project.projectOpened.connect(self.__projectOpened)
         self.project.projectOpened.connect(self.__activateProjectBrowser)
         self.project.projectClosed.connect(self.__projectClosed)
         self.project.projectClosed.connect(
-            self.backgroundService.preferencesOrProjectChanged)
+            self.backgroundService.preferencesOrProjectChanged
+        )
         self.project.projectOpened.connect(self.__writeCrashSession)
         self.project.projectClosed.connect(self.__writeCrashSession)
         self.project.appendStdout.connect(self.appendToStdout)
         self.project.appendStderr.connect(self.appendToStderr)
-        
-        self.multiProject.multiProjectOpened.connect(
-            self.__activateMultiProjectBrowser)
-        self.multiProject.multiProjectOpened.connect(
-            self.__writeCrashSession)
-        self.multiProject.multiProjectClosed.connect(
-            self.__writeCrashSession)
-        
+
+        self.multiProject.multiProjectOpened.connect(self.__activateMultiProjectBrowser)
+        self.multiProject.multiProjectOpened.connect(self.__writeCrashSession)
+        self.multiProject.multiProjectClosed.connect(self.__writeCrashSession)
+
         self.debuggerUI.resetUI.connect(self.viewmanager.handleResetUI)
         self.debuggerUI.resetUI.connect(self.debugViewer.handleResetUI)
         self.debuggerUI.resetUI.connect(self.__debuggingDone)
         self.debuggerUI.debuggingStarted.connect(self.__programChange)
         self.debuggerUI.debuggingStarted.connect(self.__debuggingStarted)
         self.debuggerUI.compileForms.connect(
-            self.projectBrowser.pfBrowser.compileChangedForms)
+            self.projectBrowser.pfBrowser.compileChangedForms
+        )
         self.debuggerUI.compileResources.connect(
-            self.projectBrowser.prBrowser.compileChangedResources)
+            self.projectBrowser.prBrowser.compileChangedResources
+        )
         self.debuggerUI.executeMake.connect(self.project.executeMake)
         self.debuggerUI.appendStdout.connect(self.appendToStdout)
-        
+
         self.__debugServer.clientDisassembly.connect(
-            self.debugViewer.disassemblyViewer.showDisassembly)
+            self.debugViewer.disassemblyViewer.showDisassembly
+        )
         self.__debugServer.clientProcessStdout.connect(self.appendToStdout)
         self.__debugServer.clientProcessStderr.connect(self.appendToStderr)
         self.__debugServer.appendStdout.connect(self.appendToStdout)
-        
+
         self.stdout.appendStdout.connect(self.appendToStdout)
         self.stderr.appendStderr.connect(self.appendToStderr)
-        
+
         self.preferencesChanged.connect(self.viewmanager.preferencesChanged)
         self.reloadAPIs.connect(self.viewmanager.getAPIsManager().reloadAPIs)
         self.preferencesChanged.connect(self.logViewer.preferencesChanged)
@@ -485,47 +550,50 @@
         self.appendStderr.connect(self.logViewer.appendToStderr)
         self.preferencesChanged.connect(self.shell.handlePreferencesChanged)
         self.preferencesChanged.connect(self.project.handlePreferencesChanged)
+        self.preferencesChanged.connect(self.projectBrowser.handlePreferencesChanged)
         self.preferencesChanged.connect(
-            self.projectBrowser.handlePreferencesChanged)
+            self.projectBrowser.psBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.psBrowser.handlePreferencesChanged)
+            self.projectBrowser.pfBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.pfBrowser.handlePreferencesChanged)
-        self.preferencesChanged.connect(
-            self.projectBrowser.prBrowser.handlePreferencesChanged)
+            self.projectBrowser.prBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.ptBrowser.handlePreferencesChanged)
+            self.projectBrowser.ptBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.piBrowser.handlePreferencesChanged)
+            self.projectBrowser.piBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.ppBrowser.handlePreferencesChanged)
+            self.projectBrowser.ppBrowser.handlePreferencesChanged
+        )
         self.preferencesChanged.connect(
-            self.projectBrowser.poBrowser.handlePreferencesChanged)
-        self.preferencesChanged.connect(
-            self.taskViewer.handlePreferencesChanged)
+            self.projectBrowser.poBrowser.handlePreferencesChanged
+        )
+        self.preferencesChanged.connect(self.taskViewer.handlePreferencesChanged)
         self.preferencesChanged.connect(self.pluginManager.preferencesChanged)
         self.preferencesChanged.connect(self.__debugServer.preferencesChanged)
         self.preferencesChanged.connect(self.debugViewer.preferencesChanged)
         self.preferencesChanged.connect(
-            self.backgroundService.preferencesOrProjectChanged)
+            self.backgroundService.preferencesOrProjectChanged
+        )
         self.preferencesChanged.connect(self.__previewer.preferencesChanged)
         self.preferencesChanged.connect(self.__astViewer.preferencesChanged)
         self.preferencesChanged.connect(self.__disViewer.preferencesChanged)
-        
+
         if self.browser is not None:
-            self.browser.sourceFile[str].connect(
-                self.viewmanager.openSourceFile)
-            self.browser.sourceFile[str, int].connect(
-                self.viewmanager.openSourceFile)
-            self.browser.sourceFile[str, list].connect(
-                self.viewmanager.openSourceFile)
+            self.browser.sourceFile[str].connect(self.viewmanager.openSourceFile)
+            self.browser.sourceFile[str, int].connect(self.viewmanager.openSourceFile)
+            self.browser.sourceFile[str, list].connect(self.viewmanager.openSourceFile)
             self.browser.sourceFile[str, int, str].connect(
-                self.viewmanager.openSourceFile)
+                self.viewmanager.openSourceFile
+            )
             self.browser.designerFile.connect(self.__designer)
             self.browser.linguistFile.connect(self.__linguist)
             self.browser.projectFile.connect(self.project.openProject)
-            self.browser.multiProjectFile.connect(
-                self.multiProject.openMultiProject)
+            self.browser.multiProjectFile.connect(self.multiProject.openMultiProject)
             self.browser.pixmapEditFile.connect(self.__editPixmap)
             self.browser.pixmapFile.connect(self.__showPixmap)
             self.browser.svgFile.connect(self.__showSvg)
@@ -533,83 +601,73 @@
             self.browser.binaryFile.connect(self.__openHexEditor)
             self.browser.testFile.connect(self.__startTestScript)
             self.browser.trpreview.connect(self.__TRPreviewer)
-            
-            self.debuggerUI.debuggingStarted.connect(
-                self.browser.handleProgramChange)
-            
+
+            self.debuggerUI.debuggingStarted.connect(self.browser.handleProgramChange)
+
             self.__debugServer.clientInterpreterChanged.connect(
-                self.browser.handleInterpreterChanged)
-            
-            self.preferencesChanged.connect(
-                self.browser.handlePreferencesChanged)
-        
+                self.browser.handleInterpreterChanged
+            )
+
+            self.preferencesChanged.connect(self.browser.handlePreferencesChanged)
+
         if self.codeDocumentationViewer is not None:
             self.preferencesChanged.connect(
-                self.codeDocumentationViewer.preferencesChanged)
-        
+                self.codeDocumentationViewer.preferencesChanged
+            )
+
         self.viewmanager.editorSaved.connect(self.project.repopulateItem)
         self.viewmanager.lastEditorClosed.connect(self.__lastEditorClosed)
         self.viewmanager.editorOpened.connect(self.__editorOpened)
         self.viewmanager.changeCaption.connect(self.__setWindowCaption)
         self.viewmanager.checkActions.connect(self.__checkActions)
-        self.viewmanager.editorChanged.connect(
-            self.projectBrowser.handleEditorChanged)
+        self.viewmanager.editorChanged.connect(self.projectBrowser.handleEditorChanged)
         self.viewmanager.editorLineChanged.connect(
-            self.projectBrowser.handleEditorLineChanged)
+            self.projectBrowser.handleEditorLineChanged
+        )
         self.viewmanager.editorOpened.connect(self.__writeCrashSession)
         self.viewmanager.editorClosed.connect(self.__writeCrashSession)
         self.viewmanager.editorRenamed.connect(self.__writeCrashSession)
         self.viewmanager.editorChanged.connect(self.__writeCrashSession)
-        
+
         self.shell.zoomValueChanged.connect(
-            lambda v: self.viewmanager.zoomValueChanged(v, self.shell))
-        
+            lambda v: self.viewmanager.zoomValueChanged(v, self.shell)
+        )
+
         if self.cooperation is not None:
-            self.viewmanager.checkActions.connect(
-                self.cooperation.checkEditorActions)
-            self.preferencesChanged.connect(
-                self.cooperation.preferencesChanged)
-            self.cooperation.shareEditor.connect(
-                self.viewmanager.shareEditor)
-            self.cooperation.startEdit.connect(
-                self.viewmanager.startSharedEdit)
-            self.cooperation.sendEdit.connect(
-                self.viewmanager.sendSharedEdit)
-            self.cooperation.cancelEdit.connect(
-                self.viewmanager.cancelSharedEdit)
-            self.cooperation.connected.connect(
-                self.viewmanager.shareConnected)
-            self.cooperation.editorCommand.connect(
-                self.viewmanager.receive)
-            self.viewmanager.setCooperationClient(
-                self.cooperation.getClient())
-        
+            self.viewmanager.checkActions.connect(self.cooperation.checkEditorActions)
+            self.preferencesChanged.connect(self.cooperation.preferencesChanged)
+            self.cooperation.shareEditor.connect(self.viewmanager.shareEditor)
+            self.cooperation.startEdit.connect(self.viewmanager.startSharedEdit)
+            self.cooperation.sendEdit.connect(self.viewmanager.sendSharedEdit)
+            self.cooperation.cancelEdit.connect(self.viewmanager.cancelSharedEdit)
+            self.cooperation.connected.connect(self.viewmanager.shareConnected)
+            self.cooperation.editorCommand.connect(self.viewmanager.receive)
+            self.viewmanager.setCooperationClient(self.cooperation.getClient())
+
         if self.symbolsViewer is not None:
-            self.symbolsViewer.insertSymbol.connect(
-                self.viewmanager.insertSymbol)
-        
+            self.symbolsViewer.insertSymbol.connect(self.viewmanager.insertSymbol)
+
         if self.numbersViewer is not None:
-            self.numbersViewer.insertNumber.connect(
-                self.viewmanager.insertNumber)
-        
+            self.numbersViewer.insertNumber.connect(self.viewmanager.insertNumber)
+
         if self.irc is not None:
             self.irc.autoConnected.connect(self.__ircAutoConnected)
-        
+
         # create the toolbar manager object
         self.toolbarManager = EricToolBarManager(self, self)
         self.toolbarManager.setMainWindow(self)
-        
+
         # Initialize the tool groups and list of started tools
         splash.showMessage(self.tr("Initializing Tools..."))
         self.toolGroups, self.currentToolGroup = Preferences.readToolGroups()
         self.toolProcs = []
         self.__initExternalToolsActions()
-        
+
         # redirect handling of http, https and file URLs to ourselves
         QDesktopServices.setUrlHandler("file", self.handleUrl)
         QDesktopServices.setUrlHandler("http", self.handleUrl)
         QDesktopServices.setUrlHandler("https", self.handleUrl)
-        
+
         # register all relevant objects
         splash.showMessage(self.tr("Registering Objects..."))
         ericApp().registerObject("UserInterface", self)
@@ -634,18 +692,16 @@
         if self.numbersViewer is not None:
             ericApp().registerObject("Numbers", self.numbersViewer)
         if self.codeDocumentationViewer is not None:
-            ericApp().registerObject("DocuViewer",
-                                     self.codeDocumentationViewer)
+            ericApp().registerObject("DocuViewer", self.codeDocumentationViewer)
         if self.microPythonWidget is not None:
             ericApp().registerObject("MicroPython", self.microPythonWidget)
         ericApp().registerObject("JediAssistant", self.jediAssistant)
-        ericApp().registerObject("PluginRepositoryViewer",
-                                 self.pluginRepositoryViewer)
-        
+        ericApp().registerObject("PluginRepositoryViewer", self.pluginRepositoryViewer)
+
         # create the various JSON file interfaces
         self.__sessionFile = SessionFile(True)
         self.__tasksFile = TasksFile(True)
-        
+
         # Initialize the actions, menus, toolbars and statusbar
         splash.showMessage(self.tr("Initializing Actions..."))
         self.__initActions()
@@ -655,37 +711,36 @@
         self.__initToolbars()
         splash.showMessage(self.tr("Initializing Statusbar..."))
         self.__initStatusbar()
-        
+
         # connect the appFocusChanged signal after all actions are ready
         app.focusChanged.connect(self.viewmanager.appFocusChanged)
-        
+
         # Initialize the instance variables.
         self.currentProg = None
         self.isProg = False
         self.__testingEditorOpen = False
         self.__testingProjectOpen = False
-        
+
         self.inDragDrop = False
         self.setAcceptDrops(True)
-        
+
         self.currentProfile = None
-        
+
         self.shutdownCalled = False
         self.inCloseEvent = False
 
         # now redirect stdout and stderr
         # TODO: release - reenable redirection
-##        sys.stdout = self.stdout          # __IGNORE_WARNING_M891__
-##        sys.stderr = self.stderr          # __IGNORE_WARNING_M891__
+        ##        sys.stdout = self.stdout          # __IGNORE_WARNING_M891__
+        ##        sys.stderr = self.stderr          # __IGNORE_WARNING_M891__
 
         # now fire up the single application server
         if Preferences.getUI("SingleApplicationMode"):
-            splash.showMessage(
-                self.tr("Initializing Single Application Server..."))
+            splash.showMessage(self.tr("Initializing Single Application Server..."))
             self.SAServer = EricSingleApplicationServer()
         else:
             self.SAServer = None
-        
+
         # now finalize the plugin manager setup
         splash.showMessage(self.tr("Initializing Plugins..."))
         self.pluginManager.finalizeSetup()
@@ -697,27 +752,28 @@
         if Preferences.getPluginManager("StartupCleanup"):
             splash.showMessage(self.tr("Cleaning Plugins Download Area..."))
             from PluginManager.PluginRepositoryDialog import (
-                PluginRepositoryDownloadCleanup
-            )
+                PluginRepositoryDownloadCleanup,
+            )
+
             PluginRepositoryDownloadCleanup(quiet=True)
-        
+
         # now read the keyboard shortcuts for all the actions
         from Preferences import Shortcuts
+
         Shortcuts.readShortcuts()
-        
+
         # restore toolbar manager state
         splash.showMessage(self.tr("Restoring Toolbarmanager..."))
-        self.toolbarManager.restoreState(
-            Preferences.getUI("ToolbarManagerState"))
-        
+        self.toolbarManager.restoreState(Preferences.getUI("ToolbarManagerState"))
+
         if self.codeDocumentationViewer is not None:
             # finalize the initialization of the code documentation viewer
             self.codeDocumentationViewer.finalizeSetup()
-        
+
         # now activate the initial view profile
         splash.showMessage(self.tr("Setting View Profile..."))
         self.__setEditProfile()
-        
+
         # special treatment for the VCS toolbars
         for tb in self.getToolbarsByCategory("vcs"):
             tb.setVisible(False)
@@ -726,16 +782,16 @@
         tb.setEnabled(True)
         if Preferences.getVCS("ShowVcsToolbar"):
             tb.setVisible(True)
-        
+
         # now read the saved tasks
         splash.showMessage(self.tr("Reading Tasks..."))
         self.__readTasks()
-        
+
         if self.templateViewer is not None:
             # now read the saved templates
             splash.showMessage(self.tr("Reading Templates..."))
             self.templateViewer.readTemplates()
-        
+
         # now start the debug client with the most recently used virtual
         # environment
         splash.showMessage(self.tr("Starting Debugger..."))
@@ -745,39 +801,41 @@
             )
         else:
             self.__debugServer.startClient(False)
-        
+
         # attributes for the network objects
         self.__networkManager = QNetworkAccessManager(self)
         self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
+            proxyAuthenticationRequired
+        )
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
             self.__networkManager.sslErrors.connect(self.__sslErrors)
         self.__replies = []
-        
+
         # attributes for the last shown configuration page and the
         # extended configuration entries
         self.__lastConfigurationPageName = ""
         self.__expandedConfigurationEntries = []
-        
+
         # set the keyboard input interval
         interval = Preferences.getUI("KeyboardInputInterval")
         if interval > 0:
             QApplication.setKeyboardInputInterval(interval)
-        
+
         # connect to the desktop environment session manager
-        app.commitDataRequest.connect(self.__commitData,
-                                      Qt.ConnectionType.DirectConnection)
-        
+        app.commitDataRequest.connect(
+            self.__commitData, Qt.ConnectionType.DirectConnection
+        )
+
     def networkAccessManager(self):
         """
         Public method to get a reference to the network access manager object.
-        
+
         @return reference to the network access manager object
         @rtype QNetworkAccessManager
         """
         return self.__networkManager
-    
+
     def __createObjects(self):
         """
         Private method to create the various application objects.
@@ -785,174 +843,199 @@
         # Create the view manager depending on the configuration setting
         logging.debug("Creating Viewmanager...")
         import ViewManager
+
         self.viewmanager = ViewManager.factory(
-            self, self, self.__debugServer, self.pluginManager)
-        
+            self, self, self.__debugServer, self.pluginManager
+        )
+
         # Create previewer
         logging.debug("Creating Previewer...")
         from .Previewer import Previewer
+
         self.__previewer = Previewer(self.viewmanager)
-        
+
         # Create AST viewer
         logging.debug("Creating Python AST Viewer")
         from .PythonAstViewer import PythonAstViewer
+
         self.__astViewer = PythonAstViewer(self.viewmanager)
-        
+
         # Create DIS viewer
         logging.debug("Creating Python Disassembly Viewer")
         from .PythonDisViewer import PythonDisViewer
+
         self.__disViewer = PythonDisViewer(self.viewmanager)
-        
+
         # Create the project browser
         logging.debug("Creating Project Browser...")
         from Project.ProjectBrowser import ProjectBrowser
+
         self.projectBrowser = ProjectBrowser(self.project)
-        
+
         # Create the multi project browser
         logging.debug("Creating Multiproject Browser...")
         from MultiProject.MultiProjectBrowser import MultiProjectBrowser
-        self.multiProjectBrowser = MultiProjectBrowser(
-            self.multiProject, self.project)
-        
+
+        self.multiProjectBrowser = MultiProjectBrowser(self.multiProject, self.project)
+
         # Create the task viewer part of the user interface
         logging.debug("Creating Task Viewer...")
         from Tasks.TaskViewer import TaskViewer
+
         self.taskViewer = TaskViewer(None, self.project)
-        
+
         # Create the log viewer part of the user interface
         logging.debug("Creating Log Viewer...")
         from .LogView import LogViewer
+
         self.logViewer = LogViewer(self)
-        
+
         # Create the debug viewer
         logging.debug("Creating Debug Viewer...")
         from Debugger.DebugViewer import DebugViewer
+
         self.debugViewer = DebugViewer(self.__debugServer)
-        
+
         # Create the shell
         logging.debug("Creating Shell...")
         from QScintilla.Shell import ShellAssembly
+
         self.shellAssembly = ShellAssembly(
-            self.__debugServer, self.viewmanager, self.project, True)
+            self.__debugServer, self.viewmanager, self.project, True
+        )
         self.shell = self.shellAssembly.shell()
-        
+
         if Preferences.getUI("ShowTemplateViewer"):
             # Create the template viewer part of the user interface
             logging.debug("Creating Template Viewer...")
             from Templates.TemplateViewer import TemplateViewer
-            self.templateViewer = TemplateViewer(
-                None, self.viewmanager)
+
+            self.templateViewer = TemplateViewer(None, self.viewmanager)
         else:
             logging.debug("Template Viewer disabled")
             self.templateViewer = None
-        
+
         if Preferences.getUI("ShowFileBrowser"):
             # Create the file browser
             logging.debug("Creating File Browser...")
             from .Browser import Browser
+
             self.browser = Browser()
         else:
             logging.debug("File Browser disabled")
             self.browser = None
-        
+
         if Preferences.getUI("ShowSymbolsViewer"):
             # Create the symbols viewer
             logging.debug("Creating Symbols Viewer...")
             from .SymbolsWidget import SymbolsWidget
+
             self.symbolsViewer = SymbolsWidget()
         else:
             logging.debug("Symbols Viewer disabled")
             self.symbolsViewer = None
-        
+
         if Preferences.getUI("ShowCodeDocumentationViewer"):
             # Create the code documentation viewer
             logging.debug("Creating Code Documentation Viewer...")
             from .CodeDocumentationViewer import CodeDocumentationViewer
+
             self.codeDocumentationViewer = CodeDocumentationViewer(self)
         else:
             logging.debug("Code Documentation Viewer disabled")
             self.codeDocumentationViewer = None
-        
+
         if Preferences.getUI("ShowPyPIPackageManager"):
             # Create the PyPI package manager
             logging.debug("Creating PyPI Package Manager...")
             from PipInterface.PipPackagesWidget import PipPackagesWidget
+
             self.pipWidget = PipPackagesWidget(self.pipInterface)
         else:
             logging.debug("PyPI Package Manager disabled")
             self.pipWidget = None
-        
+
         if Preferences.getUI("ShowCondaPackageManager"):
             # Create the conda package manager
             logging.debug("Creating Conda Package Manager...")
             from CondaInterface.CondaPackagesWidget import CondaPackagesWidget
+
             self.condaWidget = CondaPackagesWidget(self.condaInterface)
         else:
             logging.debug("Conda Package Manager disabled")
             self.condaWidget = None
-        
+
         if Preferences.getUI("ShowCooperation"):
             # Create the chat part of the user interface
             logging.debug("Creating Chat Widget...")
             from Cooperation.ChatWidget import ChatWidget
+
             self.cooperation = ChatWidget(self)
         else:
             logging.debug("Chat Widget disabled")
             self.cooperation = None
-        
+
         if Preferences.getUI("ShowIrc"):
             # Create the IRC part of the user interface
             logging.debug("Creating IRC Widget...")
             from Network.IRC.IrcWidget import IrcWidget
+
             self.irc = IrcWidget(self)
         else:
             logging.debug("IRC Widget disabled")
             self.irc = None
-        
+
         if Preferences.getUI("ShowMicroPython"):
             # Create the MicroPython part of the user interface
             logging.debug("Creating MicroPython Widget...")
             from MicroPython.MicroPythonWidget import MicroPythonWidget
+
             self.microPythonWidget = MicroPythonWidget(self)
         else:
             logging.debug("MicroPython Widget disabled")
             self.microPythonWidget = None
-        
+
         if Preferences.getUI("ShowNumbersViewer"):
             # Create the numbers viewer
             logging.debug("Creating Numbers Viewer...")
             from .NumbersWidget import NumbersWidget
+
             self.numbersViewer = NumbersWidget()
         else:
             logging.debug("Numbers Viewer disabled")
             self.numbersViewer = None
-        
+
         # Create the Jedi Assistant
         logging.debug("Creating Jedi Assistant...")
         from JediInterface.AssistantJedi import AssistantJedi
-        self.jediAssistant = AssistantJedi(
-            self, self.viewmanager, self.project)
-        
+
+        self.jediAssistant = AssistantJedi(self, self.viewmanager, self.project)
+
         # Create the plug-ins repository viewer
         from PluginManager.PluginRepositoryDialog import PluginRepositoryWidget
+
         self.pluginRepositoryViewer = PluginRepositoryWidget(
-            self.pluginManager, integrated=True, parent=self)
+            self.pluginManager, integrated=True, parent=self
+        )
         self.pluginRepositoryViewer.closeAndInstall.connect(
-            self.__installDownloadedPlugins)
-        
+            self.__installDownloadedPlugins
+        )
+
         # Create the virtual environments management widget
         from VirtualEnv.VirtualenvManagerWidgets import VirtualenvManagerWidget
+
         self.__virtualenvManagerWidget = VirtualenvManagerWidget(
-            self.virtualenvManager, self)
-        
+            self.virtualenvManager, self
+        )
+
         self.__findFileDialog = None
         self.__replaceFileDialog = None
         if Preferences.getUI("ShowFindFileWidget"):
             # Create the find in files widget
             from .FindFileWidget import FindFileWidget
+
             self.__findFileWidget = FindFileWidget(self.project, self)
-            self.__findFileWidget.sourceFile.connect(
-                self.viewmanager.openSourceFile)
+            self.__findFileWidget.sourceFile.connect(self.viewmanager.openSourceFile)
             self.__findFileWidget.designerFile.connect(self.__designer)
             self.__findFileWidget.linguistFile.connect(self.__linguist)
             self.__findFileWidget.trpreview.connect(self.__TRPreviewer)
@@ -961,14 +1044,16 @@
             self.__findFileWidget.umlFile.connect(self.__showUml)
         else:
             self.__findFileWidget = None
-        
+
         self.__findLocationDialog = None
         if Preferences.getUI("ShowFindLocationWidget"):
             # Create the find location (file) widget
             from .FindLocationWidget import FindLocationWidget
+
             self.__findLocationWidget = FindLocationWidget(self.project, self)
             self.__findLocationWidget.sourceFile.connect(
-                self.viewmanager.openSourceFile)
+                self.viewmanager.openSourceFile
+            )
             self.__findLocationWidget.designerFile.connect(self.__designer)
             self.__findLocationWidget.linguistFile.connect(self.__linguist)
             self.__findLocationWidget.trpreview.connect(self.__TRPreviewer)
@@ -977,28 +1062,29 @@
             self.__findLocationWidget.umlFile.connect(self.__showUml)
         else:
             self.__findLocationWidget = None
-        
+
         # Create the VCS Status widget
         from VCS.StatusWidget import StatusWidget
-        self.__vcsStatusWidget = StatusWidget(
-            self.project, self.viewmanager, self)
-        
+
+        self.__vcsStatusWidget = StatusWidget(self.project, self.viewmanager, self)
+
         if (
-            Preferences.getUI("ShowInternalHelpViewer") or
-            Preferences.getHelp("HelpViewerType") == 0
+            Preferences.getUI("ShowInternalHelpViewer")
+            or Preferences.getHelp("HelpViewerType") == 0
         ):
             # Create the embedded help viewer
             logging.debug("Creating Internal Help Viewer...")
             from HelpViewer.HelpViewerWidget import HelpViewerWidget
+
             self.__helpViewerWidget = HelpViewerWidget(self)
         else:
             logging.debug("Internal Help Viewer disabled...")
             self.__helpViewerWidget = None
-    
+
     def __createLayout(self):
         """
         Private method to create the layout of the various windows.
-        
+
         @exception ValueError raised to indicate an invalid layout type
         """
         leftWidget = QWidget()
@@ -1009,22 +1095,23 @@
         layout.addWidget(self.viewmanager.searchWidget())
         layout.addWidget(self.viewmanager.replaceWidget())
         self.viewmanager.mainWidget().setSizePolicy(
-            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding
+        )
         leftWidget.setLayout(layout)
         self.viewmanager.searchWidget().hide()
         self.viewmanager.replaceWidget().hide()
-        
+
         splitter = QSplitter(Qt.Orientation.Horizontal)
         splitter.addWidget(leftWidget)
         self.setCentralWidget(splitter)
-        
+
         self.__previewer.setSplitter(splitter)
         splitter.addWidget(self.__previewer)
-        
+
         splitter.addWidget(self.__astViewer)
-        
+
         splitter.addWidget(self.__disViewer)
-        
+
         # Initialize the widgets of the layouts to None
         self.lToolbox = None
         self.rToolbox = None
@@ -1032,260 +1119,303 @@
         self.leftSidebar = None
         self.rightSidebar = None
         self.bottomSidebar = None
-        
+
         # Create layout with toolbox windows embedded in dock windows
         if self.__layoutType == "Toolboxes":
             logging.debug("Creating toolboxes...")
             self.__createToolboxesLayout()
-        
+
         # Create layout with sidebar windows embedded in dock windows
         elif self.__layoutType == "Sidebars":
             logging.debug("Creating sidebars...")
             self.__createSidebarsLayout()
-        
+
         else:
-            raise ValueError("Wrong layout type given ({0})".format(
-                self.__layoutType))
+            raise ValueError("Wrong layout type given ({0})".format(self.__layoutType))
         logging.debug("Created Layout")
 
     def __createToolboxesLayout(self):
         """
         Private method to create the Toolboxes layout.
         """
-        from EricWidgets.EricToolBox import (
-            EricVerticalToolBox, EricHorizontalToolBox
-        )
-        
+        from EricWidgets.EricToolBox import EricVerticalToolBox, EricHorizontalToolBox
+
         logging.debug("Creating Toolboxes Layout...")
-        
+
         # Create the left toolbox
         self.lToolboxDock = self.__createDockWindow("lToolboxDock")
         self.lToolbox = EricVerticalToolBox(self.lToolboxDock)
-        self.__setupDockWindow(self.lToolboxDock,
-                               Qt.DockWidgetArea.LeftDockWidgetArea,
-                               self.lToolbox,
-                               self.tr("Left Toolbox"))
-        
+        self.__setupDockWindow(
+            self.lToolboxDock,
+            Qt.DockWidgetArea.LeftDockWidgetArea,
+            self.lToolbox,
+            self.tr("Left Toolbox"),
+        )
+
         # Create the horizontal toolbox
         self.hToolboxDock = self.__createDockWindow("hToolboxDock")
         self.hToolbox = EricHorizontalToolBox(self.hToolboxDock)
-        self.__setupDockWindow(self.hToolboxDock,
-                               Qt.DockWidgetArea.BottomDockWidgetArea,
-                               self.hToolbox,
-                               self.tr("Horizontal Toolbox"))
-        
+        self.__setupDockWindow(
+            self.hToolboxDock,
+            Qt.DockWidgetArea.BottomDockWidgetArea,
+            self.hToolbox,
+            self.tr("Horizontal Toolbox"),
+        )
+
         # Create the right toolbox
         self.rToolboxDock = self.__createDockWindow("rToolboxDock")
         self.rToolbox = EricVerticalToolBox(self.rToolboxDock)
-        self.__setupDockWindow(self.rToolboxDock,
-                               Qt.DockWidgetArea.RightDockWidgetArea,
-                               self.rToolbox,
-                               self.tr("Right Toolbox"))
-        
+        self.__setupDockWindow(
+            self.rToolboxDock,
+            Qt.DockWidgetArea.RightDockWidgetArea,
+            self.rToolbox,
+            self.tr("Right Toolbox"),
+        )
+
         ####################################################
         ## Populate the left toolbox
         ####################################################
-        
-        self.lToolbox.addItem(self.multiProjectBrowser,
-                              UI.PixmapCache.getIcon("multiProjectViewer"),
-                              self.tr("Multiproject-Viewer"))
-        
-        self.lToolbox.addItem(self.projectBrowser,
-                              UI.PixmapCache.getIcon("projectViewer"),
-                              self.tr("Project-Viewer"))
-        
+
+        self.lToolbox.addItem(
+            self.multiProjectBrowser,
+            UI.PixmapCache.getIcon("multiProjectViewer"),
+            self.tr("Multiproject-Viewer"),
+        )
+
+        self.lToolbox.addItem(
+            self.projectBrowser,
+            UI.PixmapCache.getIcon("projectViewer"),
+            self.tr("Project-Viewer"),
+        )
+
         if self.__findFileWidget:
-            self.lToolbox.addItem(self.__findFileWidget,
-                                  UI.PixmapCache.getIcon("find"),
-                                  self.tr("Find/Replace In Files"))
-        
+            self.lToolbox.addItem(
+                self.__findFileWidget,
+                UI.PixmapCache.getIcon("find"),
+                self.tr("Find/Replace In Files"),
+            )
+
         if self.__findLocationWidget:
-            self.lToolbox.addItem(self.__findLocationWidget,
-                                  UI.PixmapCache.getIcon("findLocation"),
-                                  self.tr("Find File"))
-        
-        self.lToolbox.addItem(self.__vcsStatusWidget,
-                              UI.PixmapCache.getIcon("tbVcsStatus"),
-                              self.tr("VCS Status"))
-        
+            self.lToolbox.addItem(
+                self.__findLocationWidget,
+                UI.PixmapCache.getIcon("findLocation"),
+                self.tr("Find File"),
+            )
+
+        self.lToolbox.addItem(
+            self.__vcsStatusWidget,
+            UI.PixmapCache.getIcon("tbVcsStatus"),
+            self.tr("VCS Status"),
+        )
+
         if self.templateViewer:
-            self.lToolbox.addItem(self.templateViewer,
-                                  UI.PixmapCache.getIcon("templateViewer"),
-                                  self.tr("Template-Viewer"))
-        
+            self.lToolbox.addItem(
+                self.templateViewer,
+                UI.PixmapCache.getIcon("templateViewer"),
+                self.tr("Template-Viewer"),
+            )
+
         if self.browser:
-            self.lToolbox.addItem(self.browser,
-                                  UI.PixmapCache.getIcon("browser"),
-                                  self.tr("File-Browser"))
-        
+            self.lToolbox.addItem(
+                self.browser, UI.PixmapCache.getIcon("browser"), self.tr("File-Browser")
+            )
+
         if self.symbolsViewer:
-            self.lToolbox.addItem(self.symbolsViewer,
-                                  UI.PixmapCache.getIcon("symbols"),
-                                  self.tr("Symbols"))
-        
+            self.lToolbox.addItem(
+                self.symbolsViewer,
+                UI.PixmapCache.getIcon("symbols"),
+                self.tr("Symbols"),
+            )
+
         ####################################################
         ## Populate the right toolbox
         ####################################################
-        
-        self.rToolbox.addItem(self.debugViewer,
-                              UI.PixmapCache.getIcon("debugViewer"),
-                              self.tr("Debug-Viewer"))
-        
+
+        self.rToolbox.addItem(
+            self.debugViewer,
+            UI.PixmapCache.getIcon("debugViewer"),
+            self.tr("Debug-Viewer"),
+        )
+
         if self.codeDocumentationViewer:
-            self.rToolbox.addItem(self.codeDocumentationViewer,
-                                  UI.PixmapCache.getIcon("codeDocuViewer"),
-                                  self.tr("Code Documentation Viewer"))
-        
+            self.rToolbox.addItem(
+                self.codeDocumentationViewer,
+                UI.PixmapCache.getIcon("codeDocuViewer"),
+                self.tr("Code Documentation Viewer"),
+            )
+
         if self.__helpViewerWidget:
-            self.rToolbox.addItem(self.__helpViewerWidget,
-                                  UI.PixmapCache.getIcon("help"),
-                                  self.tr("Help Viewer"))
-        
-        self.rToolbox.addItem(self.pluginRepositoryViewer,
-                              UI.PixmapCache.getIcon("pluginRepository"),
-                              self.tr("Plugin Repository"))
-        
-        self.rToolbox.addItem(self.__virtualenvManagerWidget,
-                              UI.PixmapCache.getIcon("virtualenv"),
-                              self.tr("Virtual Environments"))
-        
+            self.rToolbox.addItem(
+                self.__helpViewerWidget,
+                UI.PixmapCache.getIcon("help"),
+                self.tr("Help Viewer"),
+            )
+
+        self.rToolbox.addItem(
+            self.pluginRepositoryViewer,
+            UI.PixmapCache.getIcon("pluginRepository"),
+            self.tr("Plugin Repository"),
+        )
+
+        self.rToolbox.addItem(
+            self.__virtualenvManagerWidget,
+            UI.PixmapCache.getIcon("virtualenv"),
+            self.tr("Virtual Environments"),
+        )
+
         if self.pipWidget:
-            self.rToolbox.addItem(self.pipWidget,
-                                  UI.PixmapCache.getIcon("pypi"),
-                                  self.tr("PyPI"))
-        
+            self.rToolbox.addItem(
+                self.pipWidget, UI.PixmapCache.getIcon("pypi"), self.tr("PyPI")
+            )
+
         if self.condaWidget:
-            self.rToolbox.addItem(self.condaWidget,
-                                  UI.PixmapCache.getIcon("miniconda"),
-                                  self.tr("Conda"))
-        
+            self.rToolbox.addItem(
+                self.condaWidget, UI.PixmapCache.getIcon("miniconda"), self.tr("Conda")
+            )
+
         if self.cooperation:
-            self.rToolbox.addItem(self.cooperation,
-                                  UI.PixmapCache.getIcon("cooperation"),
-                                  self.tr("Cooperation"))
-        
+            self.rToolbox.addItem(
+                self.cooperation,
+                UI.PixmapCache.getIcon("cooperation"),
+                self.tr("Cooperation"),
+            )
+
         if self.irc:
-            self.rToolbox.addItem(self.irc,
-                                  UI.PixmapCache.getIcon("irc"),
-                                  self.tr("IRC"))
-        
+            self.rToolbox.addItem(
+                self.irc, UI.PixmapCache.getIcon("irc"), self.tr("IRC")
+            )
+
         if self.microPythonWidget:
-            self.rToolbox.addItem(self.microPythonWidget,
-                                  UI.PixmapCache.getIcon("micropython"),
-                                  self.tr("MicroPython"))
-        
+            self.rToolbox.addItem(
+                self.microPythonWidget,
+                UI.PixmapCache.getIcon("micropython"),
+                self.tr("MicroPython"),
+            )
+
         ####################################################
         ## Populate the bottom toolbox
         ####################################################
-        
-        self.hToolbox.addItem(self.shellAssembly,
-                              UI.PixmapCache.getIcon("shell"),
-                              self.tr("Shell"))
-        
-        self.hToolbox.addItem(self.taskViewer,
-                              UI.PixmapCache.getIcon("task"),
-                              self.tr("Task-Viewer"))
-
-        self.hToolbox.addItem(self.logViewer,
-                              UI.PixmapCache.getIcon("logViewer"),
-                              self.tr("Log-Viewer"))
-        
+
+        self.hToolbox.addItem(
+            self.shellAssembly, UI.PixmapCache.getIcon("shell"), self.tr("Shell")
+        )
+
+        self.hToolbox.addItem(
+            self.taskViewer, UI.PixmapCache.getIcon("task"), self.tr("Task-Viewer")
+        )
+
+        self.hToolbox.addItem(
+            self.logViewer, UI.PixmapCache.getIcon("logViewer"), self.tr("Log-Viewer")
+        )
+
         if self.numbersViewer:
-            self.hToolbox.addItem(self.numbersViewer,
-                                  UI.PixmapCache.getIcon("numbers"),
-                                  self.tr("Numbers"))
-        
+            self.hToolbox.addItem(
+                self.numbersViewer,
+                UI.PixmapCache.getIcon("numbers"),
+                self.tr("Numbers"),
+            )
+
         ####################################################
         ## Set the start index of each toolbox
         ####################################################
-        
+
         self.lToolbox.setCurrentIndex(0)
         self.rToolbox.setCurrentIndex(0)
         self.hToolbox.setCurrentIndex(0)
-        
+
     def __createSidebarsLayout(self):
         """
         Private method to create the Sidebars layout.
         """
         from EricWidgets.EricSideBar import EricSideBar, EricSideBarSide
-        
+
         logging.debug("Creating Sidebars Layout...")
-        
+
         # Create the left sidebar
-        self.leftSidebar = EricSideBar(EricSideBarSide.WEST,
-                                       Preferences.getUI("IconBarSize"))
+        self.leftSidebar = EricSideBar(
+            EricSideBarSide.WEST, Preferences.getUI("IconBarSize")
+        )
         self.leftSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
-        
+
         # Create the bottom sidebar
-        self.bottomSidebar = EricSideBar(EricSideBarSide.SOUTH,
-                                         Preferences.getUI("IconBarSize"))
+        self.bottomSidebar = EricSideBar(
+            EricSideBarSide.SOUTH, Preferences.getUI("IconBarSize")
+        )
         self.bottomSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
-        
+
         # Create the right sidebar
         if Preferences.getUI("CombinedLeftRightSidebar"):
             # combine left and right sidebar on the left side
             self.rightSidebar = None
         else:
             self.rightSidebar = EricSideBar(
-                EricSideBarSide.EAST, Preferences.getUI("IconBarSize"))
-            self.rightSidebar.setIconBarColor(
-                Preferences.getUI("IconBarColor"))
-            
+                EricSideBarSide.EAST, Preferences.getUI("IconBarSize")
+            )
+            self.rightSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
+
         ####################################################
         ## Populate the left side bar
         ####################################################
-        
+
         self.leftSidebar.addTab(
             self.multiProjectBrowser,
             UI.PixmapCache.getIcon("sbMultiProjectViewer96"),
-            self.tr("Multiproject-Viewer"))
-        
+            self.tr("Multiproject-Viewer"),
+        )
+
         self.leftSidebar.addTab(
             self.projectBrowser,
             UI.PixmapCache.getIcon("sbProjectViewer96"),
-            self.tr("Project-Viewer"))
-        
+            self.tr("Project-Viewer"),
+        )
+
         if self.__findFileWidget:
             self.leftSidebar.addTab(
                 self.__findFileWidget,
                 UI.PixmapCache.getIcon("sbFind96"),
-                self.tr("Find/Replace In Files"))
-        
+                self.tr("Find/Replace In Files"),
+            )
+
         if self.__findLocationWidget:
             self.leftSidebar.addTab(
                 self.__findLocationWidget,
                 UI.PixmapCache.getIcon("sbFindLocation96"),
-                self.tr("Find File"))
-        
+                self.tr("Find File"),
+            )
+
         self.leftSidebar.addTab(
             self.__vcsStatusWidget,
             UI.PixmapCache.getIcon("sbVcsStatus96"),
-            self.tr("VCS Status"))
-        
+            self.tr("VCS Status"),
+        )
+
         if self.templateViewer:
             self.leftSidebar.addTab(
                 self.templateViewer,
                 UI.PixmapCache.getIcon("sbTemplateViewer96"),
-                self.tr("Template-Viewer"))
-        
+                self.tr("Template-Viewer"),
+            )
+
         if self.browser:
             self.leftSidebar.addTab(
                 self.browser,
                 UI.PixmapCache.getIcon("sbFileBrowser96"),
-                self.tr("File-Browser"))
-        
+                self.tr("File-Browser"),
+            )
+
         if self.symbolsViewer:
             self.leftSidebar.addTab(
                 self.symbolsViewer,
                 UI.PixmapCache.getIcon("sbSymbolsViewer96"),
-                self.tr("Symbols"))
+                self.tr("Symbols"),
+            )
 
         ##############################################################
         ## Populate the right side bar or combined left sidebar
         ##############################################################
-        
+
         sidebar = self.rightSidebar or self.leftSidebar
-        
+
         if sidebar is self.leftSidebar:
             # place debug viewer after 'VCS Status' widget
             index = self.leftSidebar.indexOf(self.__vcsStatusWidget) + 1
@@ -1293,94 +1423,109 @@
                 index,
                 self.debugViewer,
                 UI.PixmapCache.getIcon("sbDebugViewer96"),
-                self.tr("Debug-Viewer"))
+                self.tr("Debug-Viewer"),
+            )
         else:
             sidebar.addTab(
                 self.debugViewer,
                 UI.PixmapCache.getIcon("sbDebugViewer96"),
-                self.tr("Debug-Viewer"))
-        
+                self.tr("Debug-Viewer"),
+            )
+
         if self.codeDocumentationViewer:
             sidebar.addTab(
                 self.codeDocumentationViewer,
                 UI.PixmapCache.getIcon("sbCodeDocuViewer96"),
-                self.tr("Code Documentation Viewer"))
-        
+                self.tr("Code Documentation Viewer"),
+            )
+
         if self.__helpViewerWidget:
             sidebar.addTab(
                 self.__helpViewerWidget,
                 UI.PixmapCache.getIcon("sbHelpViewer96"),
-                self.tr("Help Viewer"))
-        
+                self.tr("Help Viewer"),
+            )
+
         sidebar.addTab(
             self.pluginRepositoryViewer,
             UI.PixmapCache.getIcon("sbPluginRepository96"),
-            self.tr("Plugin Repository"))
-        
+            self.tr("Plugin Repository"),
+        )
+
         sidebar.addTab(
             self.__virtualenvManagerWidget,
             UI.PixmapCache.getIcon("sbVirtenvManager96"),
-            self.tr("Virtual Environments"))
-        
+            self.tr("Virtual Environments"),
+        )
+
         if self.pipWidget:
             sidebar.addTab(
-                self.pipWidget, UI.PixmapCache.getIcon("sbPyPI96"),
-                self.tr("PyPI"))
-        
+                self.pipWidget, UI.PixmapCache.getIcon("sbPyPI96"), self.tr("PyPI")
+            )
+
         if self.condaWidget:
             sidebar.addTab(
-                self.condaWidget, UI.PixmapCache.getIcon("sbMiniconda96"),
-                self.tr("Conda"))
+                self.condaWidget,
+                UI.PixmapCache.getIcon("sbMiniconda96"),
+                self.tr("Conda"),
+            )
 
         if self.cooperation:
             sidebar.addTab(
-                self.cooperation, UI.PixmapCache.getIcon("sbCooperation96"),
-                self.tr("Cooperation"))
-        
+                self.cooperation,
+                UI.PixmapCache.getIcon("sbCooperation96"),
+                self.tr("Cooperation"),
+            )
+
         if self.irc:
-            sidebar.addTab(
-                self.irc, UI.PixmapCache.getIcon("sbIrc96"),
-                self.tr("IRC"))
-        
+            sidebar.addTab(self.irc, UI.PixmapCache.getIcon("sbIrc96"), self.tr("IRC"))
+
         if self.microPythonWidget:
             sidebar.addTab(
                 self.microPythonWidget,
                 UI.PixmapCache.getIcon("sbMicroPython96"),
-                self.tr("MicroPython"))
-        
+                self.tr("MicroPython"),
+            )
+
         ####################################################
         ## Populate the bottom side bar
         ####################################################
-        
-        self.bottomSidebar.addTab(self.shellAssembly,
-                                  UI.PixmapCache.getIcon("sbShell96"),
-                                  self.tr("Shell"))
-        
-        self.bottomSidebar.addTab(self.taskViewer,
-                                  UI.PixmapCache.getIcon("sbTasksViewer96"),
-                                  self.tr("Task-Viewer"))
-
-        self.bottomSidebar.addTab(self.logViewer,
-                                  UI.PixmapCache.getIcon("sbLogViewer96"),
-                                  self.tr("Log-Viewer"))
-        
+
+        self.bottomSidebar.addTab(
+            self.shellAssembly, UI.PixmapCache.getIcon("sbShell96"), self.tr("Shell")
+        )
+
+        self.bottomSidebar.addTab(
+            self.taskViewer,
+            UI.PixmapCache.getIcon("sbTasksViewer96"),
+            self.tr("Task-Viewer"),
+        )
+
+        self.bottomSidebar.addTab(
+            self.logViewer,
+            UI.PixmapCache.getIcon("sbLogViewer96"),
+            self.tr("Log-Viewer"),
+        )
+
         if self.numbersViewer:
-            self.bottomSidebar.addTab(self.numbersViewer,
-                                      UI.PixmapCache.getIcon("sbNumbers96"),
-                                      self.tr("Numbers"))
-        
+            self.bottomSidebar.addTab(
+                self.numbersViewer,
+                UI.PixmapCache.getIcon("sbNumbers96"),
+                self.tr("Numbers"),
+            )
+
         ####################################################
         ## Set the start index of each side bar
         ####################################################
-        
+
         self.leftSidebar.setCurrentIndex(0)
         if self.rightSidebar:
             self.rightSidebar.setCurrentIndex(0)
         self.bottomSidebar.setCurrentIndex(0)
-        
+
         # create the central widget
         logging.debug("Creating central widget...")
-        cw = self.centralWidget()   # save the current central widget
+        cw = self.centralWidget()  # save the current central widget
         self.horizontalSplitter = QSplitter(Qt.Orientation.Horizontal)
         self.horizontalSplitter.setChildrenCollapsible(False)
         self.verticalSplitter = QSplitter(Qt.Orientation.Vertical)
@@ -1392,11 +1537,11 @@
         if self.rightSidebar:
             self.horizontalSplitter.addWidget(self.rightSidebar)
         self.setCentralWidget(self.horizontalSplitter)
-        
+
     def addSideWidget(self, side, widget, icon, label):
         """
         Public method to add a widget to the sides.
-        
+
         @param side side to add the widget to
         @type int (one of UserInterface.LeftSide, UserInterface.BottomSide,
             UserInterface.RightSide)
@@ -1407,8 +1552,11 @@
         @param label label text to be shown
         @type str
         """
-        if side in [UserInterface.LeftSide, UserInterface.BottomSide,
-                    UserInterface.RightSide]:
+        if side in [
+            UserInterface.LeftSide,
+            UserInterface.BottomSide,
+            UserInterface.RightSide,
+        ]:
             if self.__layoutType == "Toolboxes":
                 if side == UserInterface.LeftSide:
                     self.lToolbox.addItem(widget, icon, label)
@@ -1426,11 +1574,11 @@
                         self.rightSidebar.addTab(widget, icon, label)
                     else:
                         self.leftSidebar.addTab(widget, icon, label)
-    
+
     def removeSideWidget(self, widget):
         """
         Public method to remove a widget added using addSideWidget().
-        
+
         @param widget reference to the widget to remove
         @type QWidget
         """
@@ -1440,23 +1588,21 @@
                 if index != -1:
                     container.removeItem(index)
         elif self.__layoutType == "Sidebars":
-            for container in [self.leftSidebar, self.bottomSidebar,
-                              self.rightSidebar]:
+            for container in [self.leftSidebar, self.bottomSidebar, self.rightSidebar]:
                 if container is not None:
                     index = container.indexOf(widget)
                     if index != -1:
                         container.removeTab(index)
-    
+
     def showSideWidget(self, widget):
         """
         Public method to show a specific widget placed in the side widgets.
-        
+
         @param widget reference to the widget to be shown
         @type QWidget
         """
         if self.__layoutType == "Toolboxes":
-            for dock in [self.lToolboxDock, self.hToolboxDock,
-                         self.rToolboxDock]:
+            for dock in [self.lToolboxDock, self.hToolboxDock, self.rToolboxDock]:
                 container = dock.widget()
                 index = container.indexOf(widget)
                 if index != -1:
@@ -1464,15 +1610,14 @@
                     container.setCurrentIndex(index)
                     dock.raise_()
         elif self.__layoutType == "Sidebars":
-            for container in [self.leftSidebar, self.bottomSidebar,
-                              self.rightSidebar]:
+            for container in [self.leftSidebar, self.bottomSidebar, self.rightSidebar]:
                 if container is not None:
                     index = container.indexOf(widget)
                     if index != -1:
                         container.show()
                         container.setCurrentIndex(index)
                         container.raise_()
-    
+
     def showLogViewer(self):
         """
         Public method to show the Log-Viewer.
@@ -1486,11 +1631,11 @@
                 self.bottomSidebar.show()
                 self.bottomSidebar.setCurrentWidget(self.logViewer)
                 self.bottomSidebar.raise_()
-        
+
     def __openOnStartup(self, startupType=None):
         """
         Private method to open the last file, project or multiproject.
-        
+
         @param startupType type of startup requested (string, one of
             "Nothing", "File", "Project", "MultiProject" or "Session")
         """
@@ -1501,7 +1646,7 @@
             "MultiProject": 3,
             "Session": 4,
         }
-        
+
         if startupType is None:
             startup = Preferences.getUI("OpenOnStartup")
         else:
@@ -1509,7 +1654,7 @@
                 startup = startupTypeMapping[startupType]
             except KeyError:
                 startup = Preferences.getUI("OpenOnStartup")
-        
+
         if startup == 0:
             # open nothing
             pass
@@ -1531,11 +1676,11 @@
         elif startup == 4:
             # open from session file
             self.__readSession()
-        
+
     def processArgs(self, args):
         """
         Public method to process the command line args passed to the UI.
-        
+
         @param args list of files to open<br />
             The args are processed one at a time. All arguments after a
             '--' option are considered debug arguments to the program
@@ -1547,62 +1692,62 @@
         # check and optionally read a crash session and ignore any arguments
         if self.__readCrashSession():
             return
-        
+
         # no args, return
         if args is None:
             if self.__openAtStartup:
                 self.__openOnStartup()
             return
-        
+
         opens = 0
-        
+
         # holds space delimited list of command args, if any
         argsStr = None
         # flag indicating '--' options was found
         ddseen = False
-        
-        argChars = ['-', '/'] if Utilities.isWindowsPlatform() else ['-']
+
+        argChars = ["-", "/"] if Utilities.isWindowsPlatform() else ["-"]
 
         for arg in args:
             # handle a request to start with last session
-            if arg == '--start-file':
+            if arg == "--start-file":
                 self.__openOnStartup("File")
                 # ignore all further arguments
                 return
-            elif arg == '--start-multi':
+            elif arg == "--start-multi":
                 self.__openOnStartup("MultiProject")
                 # ignore all further arguments
                 return
-            elif arg == '--start-project':
+            elif arg == "--start-project":
                 self.__openOnStartup("Project")
                 # ignore all further arguments
                 return
-            elif arg == '--start-session':
+            elif arg == "--start-session":
                 self.__openOnStartup("Session")
                 # ignore all further arguments
                 return
-            
-            if arg == '--' and not ddseen:
+
+            if arg == "--" and not ddseen:
                 ddseen = True
                 continue
-            
+
             if arg[0] in argChars or ddseen:
                 if argsStr is None:
                     argsStr = arg
                 else:
                     argsStr = "{0} {1}".format(argsStr, arg)
                 continue
-            
+
             try:
                 ext = os.path.splitext(arg)[1]
                 ext = os.path.normcase(ext)
             except IndexError:
                 ext = ""
 
-            if ext in ('.epj', '.e4p'):
+            if ext in (".epj", ".e4p"):
                 self.project.openProject(arg)
                 opens += 1
-            elif ext in ('.emj', '.e4m', '.e5m'):
+            elif ext in (".emj", ".e4m", ".e5m"):
                 self.multiProject.openMultiProject(arg)
                 opens += 1
             else:
@@ -1612,17 +1757,17 @@
         # store away any args we had
         if argsStr is not None:
             self.debuggerUI.setArgvHistory(argsStr)
-        
+
         if opens == 0 and self.__openAtStartup:
             # no files, project or multiproject was given
             self.__openOnStartup()
-    
+
     def processInstallInfoFile(self):
         """
         Public method to process the file containing installation information.
         """
         import Globals
-        
+
         installInfoFile = Globals.getInstallInfoFilePath()
         if not os.path.exists(installInfoFile):
             filename = os.path.join(getConfig("ericDir"), "eric7install.json")
@@ -1630,8 +1775,7 @@
                 # eric was installed via the install.py script
                 shutil.copy2(filename, installInfoFile)
             else:
-                filename = os.path.join(getConfig("ericDir"),
-                                        "eric7installpip.json")
+                filename = os.path.join(getConfig("ericDir"), "eric7installpip.json")
                 if os.path.exists(filename):
                     # eric was installed via pip (i.e. eric-ide)
                     with contextlib.suppress(OSError):
@@ -1640,25 +1784,26 @@
                             installInfo = json.load(infoFile)
                         installInfo["guessed"] = True
                         installInfo["eric"] = getConfig("ericDir")
-                        installInfo["virtualenv"] = (
-                            installInfo["eric"].startswith(
-                                os.path.expanduser("~"))
+                        installInfo["virtualenv"] = installInfo["eric"].startswith(
+                            os.path.expanduser("~")
                         )
                         if installInfo["virtualenv"]:
                             installInfo["user"] = getpass.getuser()
                             installInfo["exe"] = sys.executable
                         installInfo["installed"] = True
                         installInfo["installed_on"] = installDateTime.strftime(
-                            "%Y-%m-%d %H:%M:%S")
+                            "%Y-%m-%d %H:%M:%S"
+                        )
                         installInfo["sudo"] = not os.access(
-                            installInfo["eric"], os.W_OK)
+                            installInfo["eric"], os.W_OK
+                        )
                         with open(installInfoFile, "w") as infoFile:
                             json.dump(installInfo, infoFile, indent=2)
         else:
             changed = False
             with open(installInfoFile, "r") as infoFile:
                 installInfo = json.load(infoFile)
-            
+
             # 1. adapt stored file to latest format
             if "install_cwd" not in installInfo:
                 installInfo["install_cwd"] = ""
@@ -1667,23 +1812,19 @@
             if "installed_on" not in installInfo:
                 installInfo["installed_on"] = ""
                 changed = True
-            
+
             # 2. merge new data into stored file
             filename = os.path.join(getConfig("ericDir"), "eric7install.json")
             if os.path.exists(filename):
                 # eric was updated via the install.py script
-                if (
-                    os.path.getmtime(filename) >
-                    os.path.getmtime(installInfoFile)
-                ):
+                if os.path.getmtime(filename) > os.path.getmtime(installInfoFile):
                     if not installInfo["edited"]:
                         shutil.copy2(filename, installInfoFile)
                     else:
                         with open(filename, "r") as infoFile:
                             installInfo2 = json.load(infoFile)
                         if not installInfo["install_cwd_edited"]:
-                            installInfo2["install_cwd"] = installInfo[
-                                "install_cwd"]
+                            installInfo2["install_cwd"] = installInfo["install_cwd"]
                         if not installInfo["exe_edited"]:
                             installInfo2["exe"] = installInfo["exe"]
                         if not installInfo["argv_edited"]:
@@ -1693,37 +1834,35 @@
                         installInfo = installInfo2
                         changed = True
             else:
-                filename = os.path.join(getConfig("ericDir"),
-                                        "eric7installpip.json")
-                if (
-                    os.path.exists(filename) and
-                    os.path.getmtime(filename) >
-                    os.path.getmtime(installInfoFile)
-                ):
+                filename = os.path.join(getConfig("ericDir"), "eric7installpip.json")
+                if os.path.exists(filename) and os.path.getmtime(
+                    filename
+                ) > os.path.getmtime(installInfoFile):
                     # eric was updated via pip (i.e. eric-ide)
                     # just update the installation date and time
                     installDateTime = datetime.datetime.now(tz=None)
                     installInfo["installed_on"] = installDateTime.strftime(
-                        "%Y-%m-%d %H:%M:%S")
+                        "%Y-%m-%d %H:%M:%S"
+                    )
                     changed = True
-            
+
             if changed:
                 with open(installInfoFile, "w") as infoFile:
                     json.dump(installInfo, infoFile, indent=2)
-    
+
     def __createDockWindow(self, name):
         """
         Private method to create a dock window with common properties.
-        
+
         @param name object name of the new dock window (string)
         @return the generated dock window (QDockWindow)
         """
         dock = QDockWidget()
         dock.setObjectName(name)
         dock.setFeatures(
-            QDockWidget.DockWidgetFeature.DockWidgetClosable |
-            QDockWidget.DockWidgetFeature.DockWidgetMovable |
-            QDockWidget.DockWidgetFeature.DockWidgetFloatable
+            QDockWidget.DockWidgetFeature.DockWidgetClosable
+            | QDockWidget.DockWidgetFeature.DockWidgetMovable
+            | QDockWidget.DockWidgetFeature.DockWidgetFloatable
         )
         return dock
 
@@ -1731,7 +1870,7 @@
         """
         Private method to configure the dock window created with
         __createDockWindow().
-        
+
         @param dock the dock window (QDockWindow)
         @param where dock area to be docked to (Qt.DockWidgetArea)
         @param widget widget to be shown in the dock window (QWidget)
@@ -1747,7 +1886,7 @@
     def __setWindowCaption(self, editor=None, project=None):
         """
         Private method to set the caption of the Main Window.
-        
+
         @param editor filename to be displayed (string)
         @param project project name to be displayed (string)
         """
@@ -1755,617 +1894,795 @@
             self.capEditor = Utilities.compactPath(editor, self.maxFilePathLen)
         if project is not None:
             self.capProject = project
-        
+
         if self.passiveMode:
             if not self.capProject and not self.capEditor:
-                self.setWindowTitle(
-                    self.tr("{0} - Passive Mode").format(Program))
+                self.setWindowTitle(self.tr("{0} - Passive Mode").format(Program))
             elif self.capProject and not self.capEditor:
                 self.setWindowTitle(
-                    self.tr("{0} - {1} - Passive Mode")
-                        .format(self.capProject, Program))
+                    self.tr("{0} - {1} - Passive Mode").format(self.capProject, Program)
+                )
             elif not self.capProject and self.capEditor:
                 self.setWindowTitle(
-                    self.tr("{0} - {1} - Passive Mode")
-                        .format(self.capEditor, Program))
+                    self.tr("{0} - {1} - Passive Mode").format(self.capEditor, Program)
+                )
             else:
                 self.setWindowTitle(
-                    self.tr("{0} - {1} - {2} - Passive Mode")
-                    .format(self.capProject, self.capEditor, Program))
+                    self.tr("{0} - {1} - {2} - Passive Mode").format(
+                        self.capProject, self.capEditor, Program
+                    )
+                )
         else:
             if not self.capProject and not self.capEditor:
                 self.setWindowTitle(Program)
             elif self.capProject and not self.capEditor:
-                self.setWindowTitle(
-                    "{0} - {1}".format(self.capProject, Program))
+                self.setWindowTitle("{0} - {1}".format(self.capProject, Program))
             elif not self.capProject and self.capEditor:
+                self.setWindowTitle("{0} - {1}".format(self.capEditor, Program))
+            else:
                 self.setWindowTitle(
-                    "{0} - {1}".format(self.capEditor, Program))
-            else:
-                self.setWindowTitle("{0} - {1} - {2}".format(
-                    self.capProject, self.capEditor, Program))
-        
+                    "{0} - {1} - {2}".format(self.capProject, self.capEditor, Program)
+                )
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         self.actions = []
         self.wizardsActions = []
-        
+
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'quit')
-        self.exitAct.setStatusTip(self.tr('Quit the IDE'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit the IDE</b>"""
-            """<p>This quits the IDE. Any unsaved changes may be saved"""
-            """ first. Any Python program being debugged will be stopped"""
-            """ and the preferences will be written to disc.</p>"""
-        ))
+            0,
+            self,
+            "quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the IDE"))
+        self.exitAct.setWhatsThis(
+            self.tr(
+                """<b>Quit the IDE</b>"""
+                """<p>This quits the IDE. Any unsaved changes may be saved"""
+                """ first. Any Python program being debugged will be stopped"""
+                """ and the preferences will be written to disc.</p>"""
+            )
+        )
         self.exitAct.triggered.connect(self.__quit)
         self.exitAct.setMenuRole(QAction.MenuRole.QuitRole)
         self.actions.append(self.exitAct)
 
         self.restartAct = EricAction(
-            self.tr('Restart'),
+            self.tr("Restart"),
             UI.PixmapCache.getIcon("restart"),
-            self.tr('Restart'),
+            self.tr("Restart"),
             QKeySequence(self.tr("Ctrl+Shift+Q", "File|Quit")),
-            0, self, 'restart_eric')
-        self.restartAct.setStatusTip(self.tr('Restart the IDE'))
-        self.restartAct.setWhatsThis(self.tr(
-            """<b>Restart the IDE</b>"""
-            """<p>This restarts the IDE. Any unsaved changes may be saved"""
-            """ first. Any Python program being debugged will be stopped"""
-            """ and the preferences will be written to disc.</p>"""
-        ))
+            0,
+            self,
+            "restart_eric",
+        )
+        self.restartAct.setStatusTip(self.tr("Restart the IDE"))
+        self.restartAct.setWhatsThis(
+            self.tr(
+                """<b>Restart the IDE</b>"""
+                """<p>This restarts the IDE. Any unsaved changes may be saved"""
+                """ first. Any Python program being debugged will be stopped"""
+                """ and the preferences will be written to disc.</p>"""
+            )
+        )
         self.restartAct.triggered.connect(self.__restart)
         self.actions.append(self.restartAct)
 
         self.saveSessionAct = EricAction(
-            self.tr('Save session'),
-            self.tr('Save session...'),
-            0, 0, self, 'save_session_to_file')
-        self.saveSessionAct.setStatusTip(self.tr('Save session'))
-        self.saveSessionAct.setWhatsThis(self.tr(
-            """<b>Save session...</b>"""
-            """<p>This saves the current session to disk. A dialog is"""
-            """ opened to select the file name.</p>"""
-        ))
+            self.tr("Save session"),
+            self.tr("Save session..."),
+            0,
+            0,
+            self,
+            "save_session_to_file",
+        )
+        self.saveSessionAct.setStatusTip(self.tr("Save session"))
+        self.saveSessionAct.setWhatsThis(
+            self.tr(
+                """<b>Save session...</b>"""
+                """<p>This saves the current session to disk. A dialog is"""
+                """ opened to select the file name.</p>"""
+            )
+        )
         self.saveSessionAct.triggered.connect(self.__saveSessionToFile)
         self.actions.append(self.saveSessionAct)
 
         self.loadSessionAct = EricAction(
-            self.tr('Load session'),
-            self.tr('Load session...'),
-            0, 0, self, 'load_session_from_file')
-        self.loadSessionAct.setStatusTip(self.tr('Load session'))
-        self.loadSessionAct.setWhatsThis(self.tr(
-            """<b>Load session...</b>"""
-            """<p>This loads a session saved to disk previously. A dialog is"""
-            """ opened to select the file name.</p>"""
-        ))
+            self.tr("Load session"),
+            self.tr("Load session..."),
+            0,
+            0,
+            self,
+            "load_session_from_file",
+        )
+        self.loadSessionAct.setStatusTip(self.tr("Load session"))
+        self.loadSessionAct.setWhatsThis(
+            self.tr(
+                """<b>Load session...</b>"""
+                """<p>This loads a session saved to disk previously. A dialog is"""
+                """ opened to select the file name.</p>"""
+            )
+        )
         self.loadSessionAct.triggered.connect(self.__loadSessionFromFile)
         self.actions.append(self.loadSessionAct)
 
         self.newWindowAct = EricAction(
-            self.tr('New Window'),
+            self.tr("New Window"),
             UI.PixmapCache.getIcon("newWindow"),
-            self.tr('New &Window'),
+            self.tr("New &Window"),
             QKeySequence(self.tr("Ctrl+Shift+N", "File|New Window")),
-            0, self, 'new_window')
-        self.newWindowAct.setStatusTip(self.tr(
-            'Open a new eric instance'))
-        self.newWindowAct.setWhatsThis(self.tr(
-            """<b>New Window</b>"""
-            """<p>This opens a new instance of the eric IDE.</p>"""
-        ))
+            0,
+            self,
+            "new_window",
+        )
+        self.newWindowAct.setStatusTip(self.tr("Open a new eric instance"))
+        self.newWindowAct.setWhatsThis(
+            self.tr(
+                """<b>New Window</b>"""
+                """<p>This opens a new instance of the eric IDE.</p>"""
+            )
+        )
         self.newWindowAct.triggered.connect(self.__newWindow)
         self.actions.append(self.newWindowAct)
-        self.newWindowAct.setEnabled(
-            not Preferences.getUI("SingleApplicationMode"))
-        
+        self.newWindowAct.setEnabled(not Preferences.getUI("SingleApplicationMode"))
+
         self.viewProfileActGrp = createActionGroup(self, "viewprofiles", True)
-        
+
         self.setEditProfileAct = EricAction(
-            self.tr('Edit Profile'),
+            self.tr("Edit Profile"),
             UI.PixmapCache.getIcon("viewProfileEdit"),
-            self.tr('Edit Profile'),
-            0, 0,
-            self.viewProfileActGrp, 'edit_profile', True)
-        self.setEditProfileAct.setStatusTip(self.tr(
-            'Activate the edit view profile'))
-        self.setEditProfileAct.setWhatsThis(self.tr(
-            """<b>Edit Profile</b>"""
-            """<p>Activate the "Edit View Profile". Windows being shown,"""
-            """ if this profile is active, may be configured with the"""
-            """ "View Profile Configuration" dialog.</p>"""
-        ))
+            self.tr("Edit Profile"),
+            0,
+            0,
+            self.viewProfileActGrp,
+            "edit_profile",
+            True,
+        )
+        self.setEditProfileAct.setStatusTip(self.tr("Activate the edit view profile"))
+        self.setEditProfileAct.setWhatsThis(
+            self.tr(
+                """<b>Edit Profile</b>"""
+                """<p>Activate the "Edit View Profile". Windows being shown,"""
+                """ if this profile is active, may be configured with the"""
+                """ "View Profile Configuration" dialog.</p>"""
+            )
+        )
         self.setEditProfileAct.triggered.connect(self.__setEditProfile)
         self.actions.append(self.setEditProfileAct)
-        
+
         self.setDebugProfileAct = EricAction(
-            self.tr('Debug Profile'),
+            self.tr("Debug Profile"),
             UI.PixmapCache.getIcon("viewProfileDebug"),
-            self.tr('Debug Profile'),
-            0, 0,
-            self.viewProfileActGrp, 'debug_profile', True)
-        self.setDebugProfileAct.setStatusTip(
-            self.tr('Activate the debug view profile'))
-        self.setDebugProfileAct.setWhatsThis(self.tr(
-            """<b>Debug Profile</b>"""
-            """<p>Activate the "Debug View Profile". Windows being shown,"""
-            """ if this profile is active, may be configured with the"""
-            """ "View Profile Configuration" dialog.</p>"""
-        ))
+            self.tr("Debug Profile"),
+            0,
+            0,
+            self.viewProfileActGrp,
+            "debug_profile",
+            True,
+        )
+        self.setDebugProfileAct.setStatusTip(self.tr("Activate the debug view profile"))
+        self.setDebugProfileAct.setWhatsThis(
+            self.tr(
+                """<b>Debug Profile</b>"""
+                """<p>Activate the "Debug View Profile". Windows being shown,"""
+                """ if this profile is active, may be configured with the"""
+                """ "View Profile Configuration" dialog.</p>"""
+            )
+        )
         self.setDebugProfileAct.triggered.connect(self.setDebugProfile)
         self.actions.append(self.setDebugProfileAct)
-        
+
         self.pbActivateAct = EricAction(
-            self.tr('Project-Viewer'),
-            self.tr('&Project-Viewer'),
+            self.tr("Project-Viewer"),
+            self.tr("&Project-Viewer"),
             QKeySequence(self.tr("Alt+Shift+P")),
-            0, self,
-            'project_viewer_activate')
-        self.pbActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Project-Viewer window."))
-        self.pbActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Project-Viewer</b>"""
-            """<p>This switches the input focus to the Project-Viewer"""
-            """ window.</p>"""
-        ))
+            0,
+            self,
+            "project_viewer_activate",
+        )
+        self.pbActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Project-Viewer window.")
+        )
+        self.pbActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Project-Viewer</b>"""
+                """<p>This switches the input focus to the Project-Viewer"""
+                """ window.</p>"""
+            )
+        )
         self.pbActivateAct.triggered.connect(self.__activateProjectBrowser)
         self.actions.append(self.pbActivateAct)
         self.addAction(self.pbActivateAct)
 
         self.mpbActivateAct = EricAction(
-            self.tr('Multiproject-Viewer'),
-            self.tr('&Multiproject-Viewer'),
+            self.tr("Multiproject-Viewer"),
+            self.tr("&Multiproject-Viewer"),
             QKeySequence(self.tr("Alt+Shift+M")),
-            0, self,
-            'multi_project_viewer_activate')
-        self.mpbActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Multiproject-Viewer window."))
-        self.mpbActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Multiproject-Viewer</b>"""
-            """<p>This switches the input focus to the Multiproject-Viewer"""
-            """ window.</p>"""
-        ))
-        self.mpbActivateAct.triggered.connect(
-            self.__activateMultiProjectBrowser)
+            0,
+            self,
+            "multi_project_viewer_activate",
+        )
+        self.mpbActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Multiproject-Viewer window.")
+        )
+        self.mpbActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Multiproject-Viewer</b>"""
+                """<p>This switches the input focus to the Multiproject-Viewer"""
+                """ window.</p>"""
+            )
+        )
+        self.mpbActivateAct.triggered.connect(self.__activateMultiProjectBrowser)
         self.actions.append(self.mpbActivateAct)
         self.addAction(self.mpbActivateAct)
 
         self.debugViewerActivateAct = EricAction(
-            self.tr('Debug-Viewer'),
-            self.tr('&Debug-Viewer'),
+            self.tr("Debug-Viewer"),
+            self.tr("&Debug-Viewer"),
             QKeySequence(self.tr("Alt+Shift+D")),
-            0, self,
-            'debug_viewer_activate')
-        self.debugViewerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Debug-Viewer window."))
-        self.debugViewerActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Debug-Viewer</b>"""
-            """<p>This switches the input focus to the Debug-Viewer"""
-            """ window.</p>"""
-        ))
-        self.debugViewerActivateAct.triggered.connect(
-            self.activateDebugViewer)
+            0,
+            self,
+            "debug_viewer_activate",
+        )
+        self.debugViewerActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Debug-Viewer window.")
+        )
+        self.debugViewerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Debug-Viewer</b>"""
+                """<p>This switches the input focus to the Debug-Viewer"""
+                """ window.</p>"""
+            )
+        )
+        self.debugViewerActivateAct.triggered.connect(self.activateDebugViewer)
         self.actions.append(self.debugViewerActivateAct)
         self.addAction(self.debugViewerActivateAct)
 
         self.shellActivateAct = EricAction(
-            self.tr('Shell'),
-            self.tr('&Shell'),
+            self.tr("Shell"),
+            self.tr("&Shell"),
             QKeySequence(self.tr("Alt+Shift+S")),
-            0, self,
-            'interpreter_shell_activate')
-        self.shellActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Shell window."))
-        self.shellActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Shell</b>"""
-            """<p>This switches the input focus to the Shell window.</p>"""
-        ))
+            0,
+            self,
+            "interpreter_shell_activate",
+        )
+        self.shellActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Shell window.")
+        )
+        self.shellActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Shell</b>"""
+                """<p>This switches the input focus to the Shell window.</p>"""
+            )
+        )
         self.shellActivateAct.triggered.connect(self.__activateShell)
         self.actions.append(self.shellActivateAct)
         self.addAction(self.shellActivateAct)
-        
+
         if self.browser is not None:
             self.browserActivateAct = EricAction(
-                self.tr('File-Browser'),
-                self.tr('&File-Browser'),
+                self.tr("File-Browser"),
+                self.tr("&File-Browser"),
                 QKeySequence(self.tr("Alt+Shift+F")),
-                0, self,
-                'file_browser_activate')
-            self.browserActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the File-Browser window."))
-            self.browserActivateAct.setWhatsThis(self.tr(
-                """<b>Activate File-Browser</b>"""
-                """<p>This switches the input focus to the File-Browser"""
-                """ window.</p>"""
-            ))
+                0,
+                self,
+                "file_browser_activate",
+            )
+            self.browserActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the File-Browser window.")
+            )
+            self.browserActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate File-Browser</b>"""
+                    """<p>This switches the input focus to the File-Browser"""
+                    """ window.</p>"""
+                )
+            )
             self.browserActivateAct.triggered.connect(self.__activateBrowser)
             self.actions.append(self.browserActivateAct)
             self.addAction(self.browserActivateAct)
 
         self.logViewerActivateAct = EricAction(
-            self.tr('Log-Viewer'),
-            self.tr('Lo&g-Viewer'),
+            self.tr("Log-Viewer"),
+            self.tr("Lo&g-Viewer"),
             QKeySequence(self.tr("Alt+Shift+G")),
-            0, self,
-            'log_viewer_activate')
-        self.logViewerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Log-Viewer window."))
-        self.logViewerActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Log-Viewer</b>"""
-            """<p>This switches the input focus to the Log-Viewer"""
-            """ window.</p>"""
-        ))
-        self.logViewerActivateAct.triggered.connect(
-            self.__activateLogViewer)
+            0,
+            self,
+            "log_viewer_activate",
+        )
+        self.logViewerActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Log-Viewer window.")
+        )
+        self.logViewerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Log-Viewer</b>"""
+                """<p>This switches the input focus to the Log-Viewer"""
+                """ window.</p>"""
+            )
+        )
+        self.logViewerActivateAct.triggered.connect(self.__activateLogViewer)
         self.actions.append(self.logViewerActivateAct)
         self.addAction(self.logViewerActivateAct)
 
         self.taskViewerActivateAct = EricAction(
-            self.tr('Task-Viewer'),
-            self.tr('&Task-Viewer'),
+            self.tr("Task-Viewer"),
+            self.tr("&Task-Viewer"),
             QKeySequence(self.tr("Alt+Shift+T")),
-            0, self,
-            'task_viewer_activate')
-        self.taskViewerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Task-Viewer window."))
-        self.taskViewerActivateAct.setWhatsThis(self.tr(
-            """<b>Activate Task-Viewer</b>"""
-            """<p>This switches the input focus to the Task-Viewer"""
-            """ window.</p>"""
-        ))
-        self.taskViewerActivateAct.triggered.connect(
-            self.__activateTaskViewer)
+            0,
+            self,
+            "task_viewer_activate",
+        )
+        self.taskViewerActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Task-Viewer window.")
+        )
+        self.taskViewerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Activate Task-Viewer</b>"""
+                """<p>This switches the input focus to the Task-Viewer"""
+                """ window.</p>"""
+            )
+        )
+        self.taskViewerActivateAct.triggered.connect(self.__activateTaskViewer)
         self.actions.append(self.taskViewerActivateAct)
         self.addAction(self.taskViewerActivateAct)
-        
+
         if self.templateViewer is not None:
             self.templateViewerActivateAct = EricAction(
-                self.tr('Template-Viewer'),
-                self.tr('Templ&ate-Viewer'),
+                self.tr("Template-Viewer"),
+                self.tr("Templ&ate-Viewer"),
                 QKeySequence(self.tr("Alt+Shift+A")),
-                0, self,
-                'template_viewer_activate')
-            self.templateViewerActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Template-Viewer window."))
-            self.templateViewerActivateAct.setWhatsThis(self.tr(
-                """<b>Activate Template-Viewer</b>"""
-                """<p>This switches the input focus to the Template-Viewer"""
-                """ window.</p>"""
-            ))
+                0,
+                self,
+                "template_viewer_activate",
+            )
+            self.templateViewerActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Template-Viewer window.")
+            )
+            self.templateViewerActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate Template-Viewer</b>"""
+                    """<p>This switches the input focus to the Template-Viewer"""
+                    """ window.</p>"""
+                )
+            )
             self.templateViewerActivateAct.triggered.connect(
-                self.__activateTemplateViewer)
+                self.__activateTemplateViewer
+            )
             self.actions.append(self.templateViewerActivateAct)
             self.addAction(self.templateViewerActivateAct)
-        
+
         if self.lToolbox:
             self.ltAct = EricAction(
-                self.tr('Left Toolbox'),
-                self.tr('&Left Toolbox'), 0, 0, self, 'vertical_toolbox', True)
-            self.ltAct.setStatusTip(self.tr('Toggle the Left Toolbox window'))
-            self.ltAct.setWhatsThis(self.tr(
-                """<b>Toggle the Left Toolbox window</b>"""
-                """<p>If the Left Toolbox window is hidden then display it."""
-                """ If it is displayed then close it.</p>"""
-            ))
+                self.tr("Left Toolbox"),
+                self.tr("&Left Toolbox"),
+                0,
+                0,
+                self,
+                "vertical_toolbox",
+                True,
+            )
+            self.ltAct.setStatusTip(self.tr("Toggle the Left Toolbox window"))
+            self.ltAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the Left Toolbox window</b>"""
+                    """<p>If the Left Toolbox window is hidden then display it."""
+                    """ If it is displayed then close it.</p>"""
+                )
+            )
             self.ltAct.triggered.connect(self.__toggleLeftToolbox)
             self.actions.append(self.ltAct)
         else:
             self.ltAct = None
-        
+
         if self.rToolbox:
             self.rtAct = EricAction(
-                self.tr('Right Toolbox'),
-                self.tr('&Right Toolbox'),
-                0, 0, self, 'vertical_toolbox', True)
-            self.rtAct.setStatusTip(self.tr('Toggle the Right Toolbox window'))
-            self.rtAct.setWhatsThis(self.tr(
-                """<b>Toggle the Right Toolbox window</b>"""
-                """<p>If the Right Toolbox window is hidden then display it."""
-                """ If it is displayed then close it.</p>"""
-            ))
+                self.tr("Right Toolbox"),
+                self.tr("&Right Toolbox"),
+                0,
+                0,
+                self,
+                "vertical_toolbox",
+                True,
+            )
+            self.rtAct.setStatusTip(self.tr("Toggle the Right Toolbox window"))
+            self.rtAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the Right Toolbox window</b>"""
+                    """<p>If the Right Toolbox window is hidden then display it."""
+                    """ If it is displayed then close it.</p>"""
+                )
+            )
             self.rtAct.triggered.connect(self.__toggleRightToolbox)
             self.actions.append(self.rtAct)
         else:
             self.rtAct = None
-        
+
         if self.hToolbox:
             self.htAct = EricAction(
-                self.tr('Horizontal Toolbox'),
-                self.tr('&Horizontal Toolbox'), 0, 0, self,
-                'horizontal_toolbox', True)
-            self.htAct.setStatusTip(self.tr(
-                'Toggle the Horizontal Toolbox window'))
-            self.htAct.setWhatsThis(self.tr(
-                """<b>Toggle the Horizontal Toolbox window</b>"""
-                """<p>If the Horizontal Toolbox window is hidden then"""
-                """ display it. If it is displayed then close it.</p>"""
-            ))
+                self.tr("Horizontal Toolbox"),
+                self.tr("&Horizontal Toolbox"),
+                0,
+                0,
+                self,
+                "horizontal_toolbox",
+                True,
+            )
+            self.htAct.setStatusTip(self.tr("Toggle the Horizontal Toolbox window"))
+            self.htAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the Horizontal Toolbox window</b>"""
+                    """<p>If the Horizontal Toolbox window is hidden then"""
+                    """ display it. If it is displayed then close it.</p>"""
+                )
+            )
             self.htAct.triggered.connect(self.__toggleHorizontalToolbox)
             self.actions.append(self.htAct)
         else:
             self.htAct = None
-        
+
         if self.leftSidebar:
             self.lsbAct = EricAction(
-                self.tr('Left Sidebar'),
-                self.tr('&Left Sidebar'),
-                0, 0, self, 'left_sidebar', True)
-            self.lsbAct.setStatusTip(self.tr('Toggle the left sidebar window'))
-            self.lsbAct.setWhatsThis(self.tr(
-                """<b>Toggle the left sidebar window</b>"""
-                """<p>If the left sidebar window is hidden then display it."""
-                """ If it is displayed then close it.</p>"""
-            ))
+                self.tr("Left Sidebar"),
+                self.tr("&Left Sidebar"),
+                0,
+                0,
+                self,
+                "left_sidebar",
+                True,
+            )
+            self.lsbAct.setStatusTip(self.tr("Toggle the left sidebar window"))
+            self.lsbAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the left sidebar window</b>"""
+                    """<p>If the left sidebar window is hidden then display it."""
+                    """ If it is displayed then close it.</p>"""
+                )
+            )
             self.lsbAct.triggered.connect(self.__toggleLeftSidebar)
             self.actions.append(self.lsbAct)
         else:
             self.lsbAct = None
-        
+
         if self.rightSidebar:
             self.rsbAct = EricAction(
-                self.tr('Right Sidebar'),
-                self.tr('&Right Sidebar'),
-                0, 0, self, 'right_sidebar', True)
-            self.rsbAct.setStatusTip(self.tr(
-                'Toggle the right sidebar window'))
-            self.rsbAct.setWhatsThis(self.tr(
-                """<b>Toggle the right sidebar window</b>"""
-                """<p>If the right sidebar window is hidden then display it."""
-                """ If it is displayed then close it.</p>"""
-            ))
+                self.tr("Right Sidebar"),
+                self.tr("&Right Sidebar"),
+                0,
+                0,
+                self,
+                "right_sidebar",
+                True,
+            )
+            self.rsbAct.setStatusTip(self.tr("Toggle the right sidebar window"))
+            self.rsbAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the right sidebar window</b>"""
+                    """<p>If the right sidebar window is hidden then display it."""
+                    """ If it is displayed then close it.</p>"""
+                )
+            )
             self.rsbAct.triggered.connect(self.__toggleRightSidebar)
             self.actions.append(self.rsbAct)
         else:
             self.rsbAct = None
-        
+
         if self.bottomSidebar:
             self.bsbAct = EricAction(
-                self.tr('Bottom Sidebar'),
-                self.tr('&Bottom Sidebar'), 0, 0, self,
-                'bottom_sidebar', True)
-            self.bsbAct.setStatusTip(self.tr(
-                'Toggle the bottom sidebar window'))
-            self.bsbAct.setWhatsThis(self.tr(
-                """<b>Toggle the bottom sidebar window</b>"""
-                """<p>If the bottom sidebar window is hidden then display"""
-                """ it. If it is displayed then close it.</p>"""
-            ))
+                self.tr("Bottom Sidebar"),
+                self.tr("&Bottom Sidebar"),
+                0,
+                0,
+                self,
+                "bottom_sidebar",
+                True,
+            )
+            self.bsbAct.setStatusTip(self.tr("Toggle the bottom sidebar window"))
+            self.bsbAct.setWhatsThis(
+                self.tr(
+                    """<b>Toggle the bottom sidebar window</b>"""
+                    """<p>If the bottom sidebar window is hidden then display"""
+                    """ it. If it is displayed then close it.</p>"""
+                )
+            )
             self.bsbAct.triggered.connect(self.__toggleBottomSidebar)
             self.actions.append(self.bsbAct)
         else:
             self.bsbAct = None
-        
+
         if self.cooperation is not None:
             self.cooperationViewerActivateAct = EricAction(
-                self.tr('Cooperation-Viewer'),
-                self.tr('Co&operation-Viewer'),
+                self.tr("Cooperation-Viewer"),
+                self.tr("Co&operation-Viewer"),
                 QKeySequence(self.tr("Alt+Shift+O")),
-                0, self,
-                'cooperation_viewer_activate')
-            self.cooperationViewerActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Cooperation-Viewer window."))
-            self.cooperationViewerActivateAct.setWhatsThis(self.tr(
-                """<b>Activate Cooperation-Viewer</b>"""
-                """<p>This switches the input focus to the"""
-                """ Cooperation-Viewer window.</p>"""
-            ))
+                0,
+                self,
+                "cooperation_viewer_activate",
+            )
+            self.cooperationViewerActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Cooperation-Viewer window.")
+            )
+            self.cooperationViewerActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate Cooperation-Viewer</b>"""
+                    """<p>This switches the input focus to the"""
+                    """ Cooperation-Viewer window.</p>"""
+                )
+            )
             self.cooperationViewerActivateAct.triggered.connect(
-                self.activateCooperationViewer)
+                self.activateCooperationViewer
+            )
             self.actions.append(self.cooperationViewerActivateAct)
             self.addAction(self.cooperationViewerActivateAct)
-        
+
         if self.irc is not None:
             self.ircActivateAct = EricAction(
-                self.tr('IRC'),
-                self.tr('&IRC'),
+                self.tr("IRC"),
+                self.tr("&IRC"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+I")),
-                0, self,
-                'irc_widget_activate')
-            self.ircActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the IRC window."))
-            self.ircActivateAct.setWhatsThis(self.tr(
-                """<b>Activate IRC</b>"""
-                """<p>This switches the input focus to the IRC window.</p>"""
-            ))
-            self.ircActivateAct.triggered.connect(
-                self.__activateIRC)
+                0,
+                self,
+                "irc_widget_activate",
+            )
+            self.ircActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the IRC window.")
+            )
+            self.ircActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate IRC</b>"""
+                    """<p>This switches the input focus to the IRC window.</p>"""
+                )
+            )
+            self.ircActivateAct.triggered.connect(self.__activateIRC)
             self.actions.append(self.ircActivateAct)
             self.addAction(self.ircActivateAct)
-        
+
         if self.symbolsViewer is not None:
             self.symbolsViewerActivateAct = EricAction(
-                self.tr('Symbols-Viewer'),
-                self.tr('S&ymbols-Viewer'),
+                self.tr("Symbols-Viewer"),
+                self.tr("S&ymbols-Viewer"),
                 QKeySequence(self.tr("Alt+Shift+Y")),
-                0, self,
-                'symbols_viewer_activate')
-            self.symbolsViewerActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Symbols-Viewer window."))
-            self.symbolsViewerActivateAct.setWhatsThis(self.tr(
-                """<b>Activate Symbols-Viewer</b>"""
-                """<p>This switches the input focus to the Symbols-Viewer"""
-                """ window.</p>"""
-            ))
+                0,
+                self,
+                "symbols_viewer_activate",
+            )
+            self.symbolsViewerActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Symbols-Viewer window.")
+            )
+            self.symbolsViewerActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate Symbols-Viewer</b>"""
+                    """<p>This switches the input focus to the Symbols-Viewer"""
+                    """ window.</p>"""
+                )
+            )
             self.symbolsViewerActivateAct.triggered.connect(
-                self.__activateSymbolsViewer)
+                self.__activateSymbolsViewer
+            )
             self.actions.append(self.symbolsViewerActivateAct)
             self.addAction(self.symbolsViewerActivateAct)
-        
+
         if self.numbersViewer is not None:
             self.numbersViewerActivateAct = EricAction(
-                self.tr('Numbers-Viewer'),
-                self.tr('Num&bers-Viewer'),
+                self.tr("Numbers-Viewer"),
+                self.tr("Num&bers-Viewer"),
                 QKeySequence(self.tr("Alt+Shift+B")),
-                0, self,
-                'numbers_viewer_activate')
-            self.numbersViewerActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Numbers-Viewer window."))
-            self.numbersViewerActivateAct.setWhatsThis(self.tr(
-                """<b>Activate Numbers-Viewer</b>"""
-                """<p>This switches the input focus to the Numbers-Viewer"""
-                """ window.</p>"""
-            ))
+                0,
+                self,
+                "numbers_viewer_activate",
+            )
+            self.numbersViewerActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Numbers-Viewer window.")
+            )
+            self.numbersViewerActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Activate Numbers-Viewer</b>"""
+                    """<p>This switches the input focus to the Numbers-Viewer"""
+                    """ window.</p>"""
+                )
+            )
             self.numbersViewerActivateAct.triggered.connect(
-                self.__activateNumbersViewer)
+                self.__activateNumbersViewer
+            )
             self.actions.append(self.numbersViewerActivateAct)
             self.addAction(self.numbersViewerActivateAct)
-        
+
         if self.codeDocumentationViewer is not None:
             self.codeDocumentationViewerActivateAct = EricAction(
-                self.tr('Code Documentation Viewer'),
-                self.tr('Code Documentation Viewer'),
+                self.tr("Code Documentation Viewer"),
+                self.tr("Code Documentation Viewer"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+D")),
-                0, self,
-                'code_documentation_viewer_activate')
-            self.codeDocumentationViewerActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Code Documentation Viewer"
-                " window."))
-            self.codeDocumentationViewerActivateAct.setWhatsThis(self.tr(
-                """<b>Code Documentation Viewer</b>"""
-                """<p>This switches the input focus to the Code"""
-                """ Documentation Viewer window.</p>"""
-            ))
+                0,
+                self,
+                "code_documentation_viewer_activate",
+            )
+            self.codeDocumentationViewerActivateAct.setStatusTip(
+                self.tr(
+                    "Switch the input focus to the Code Documentation Viewer" " window."
+                )
+            )
+            self.codeDocumentationViewerActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Code Documentation Viewer</b>"""
+                    """<p>This switches the input focus to the Code"""
+                    """ Documentation Viewer window.</p>"""
+                )
+            )
             self.codeDocumentationViewerActivateAct.triggered.connect(
-                self.activateCodeDocumentationViewer)
+                self.activateCodeDocumentationViewer
+            )
             self.actions.append(self.codeDocumentationViewerActivateAct)
             self.addAction(self.codeDocumentationViewerActivateAct)
-        
+
         if self.pipWidget is not None:
             self.pipWidgetActivateAct = EricAction(
-                self.tr('PyPI'),
-                self.tr('PyPI'),
+                self.tr("PyPI"),
+                self.tr("PyPI"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+P")),
-                0, self,
-                'pip_widget_activate')
-            self.pipWidgetActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the PyPI window."))
-            self.pipWidgetActivateAct.setWhatsThis(self.tr(
-                """<b>PyPI</b>"""
-                """<p>This switches the input focus to the PyPI window.</p>"""
-            ))
-            self.pipWidgetActivateAct.triggered.connect(
-                self.__activatePipWidget)
+                0,
+                self,
+                "pip_widget_activate",
+            )
+            self.pipWidgetActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the PyPI window.")
+            )
+            self.pipWidgetActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>PyPI</b>"""
+                    """<p>This switches the input focus to the PyPI window.</p>"""
+                )
+            )
+            self.pipWidgetActivateAct.triggered.connect(self.__activatePipWidget)
             self.actions.append(self.pipWidgetActivateAct)
             self.addAction(self.pipWidgetActivateAct)
-        
+
         if self.condaWidget is not None:
             self.condaWidgetActivateAct = EricAction(
-                self.tr('Conda'),
-                self.tr('Conda'),
+                self.tr("Conda"),
+                self.tr("Conda"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+C")),
-                0, self,
-                'conda_widget_activate')
-            self.condaWidgetActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Conda window."))
-            self.condaWidgetActivateAct.setWhatsThis(self.tr(
-                """<b>Conda</b>"""
-                """<p>This switches the input focus to the Conda window.</p>"""
-            ))
-            self.condaWidgetActivateAct.triggered.connect(
-                self.__activateCondaWidget)
+                0,
+                self,
+                "conda_widget_activate",
+            )
+            self.condaWidgetActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Conda window.")
+            )
+            self.condaWidgetActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Conda</b>"""
+                    """<p>This switches the input focus to the Conda window.</p>"""
+                )
+            )
+            self.condaWidgetActivateAct.triggered.connect(self.__activateCondaWidget)
             self.actions.append(self.condaWidgetActivateAct)
             self.addAction(self.condaWidgetActivateAct)
-        
+
         if self.microPythonWidget is not None:
             self.microPythonWidgetActivateAct = EricAction(
-                self.tr('MicroPython'),
-                self.tr('MicroPython'),
+                self.tr("MicroPython"),
+                self.tr("MicroPython"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+M")),
-                0, self,
-                'micropython_widget_activate')
-            self.microPythonWidgetActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the MicroPython window."))
-            self.microPythonWidgetActivateAct.setWhatsThis(self.tr(
-                """<b>MicroPython</b>"""
-                """<p>This switches the input focus to the MicroPython"""
-                """ window.</p>"""
-            ))
+                0,
+                self,
+                "micropython_widget_activate",
+            )
+            self.microPythonWidgetActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the MicroPython window.")
+            )
+            self.microPythonWidgetActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>MicroPython</b>"""
+                    """<p>This switches the input focus to the MicroPython"""
+                    """ window.</p>"""
+                )
+            )
             self.microPythonWidgetActivateAct.triggered.connect(
-                self.__activateMicroPython)
+                self.__activateMicroPython
+            )
             self.actions.append(self.microPythonWidgetActivateAct)
             self.addAction(self.microPythonWidgetActivateAct)
-        
+
         self.pluginRepositoryViewerActivateAct = EricAction(
-            self.tr('Plugin Repository'),
-            self.tr('Plugin Repository'),
+            self.tr("Plugin Repository"),
+            self.tr("Plugin Repository"),
             QKeySequence(self.tr("Ctrl+Alt+Shift+R")),
-            0, self,
-            'plugin_repository_viewer_activate')
-        self.pluginRepositoryViewerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Plugin Repository window."))
-        self.pluginRepositoryViewerActivateAct.setWhatsThis(self.tr(
-            """<b>Plugin Repository</b>"""
-            """<p>This switches the input focus to the Plugin Repository"""
-            """ window.</p>"""
-        ))
+            0,
+            self,
+            "plugin_repository_viewer_activate",
+        )
+        self.pluginRepositoryViewerActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the Plugin Repository window.")
+        )
+        self.pluginRepositoryViewerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Plugin Repository</b>"""
+                """<p>This switches the input focus to the Plugin Repository"""
+                """ window.</p>"""
+            )
+        )
         self.pluginRepositoryViewerActivateAct.triggered.connect(
-            self.activatePluginRepositoryViewer)
+            self.activatePluginRepositoryViewer
+        )
         self.actions.append(self.pluginRepositoryViewerActivateAct)
         self.addAction(self.pluginRepositoryViewerActivateAct)
-        
+
         self.virtualenvManagerActivateAct = EricAction(
-            self.tr('Virtual Environments'),
-            self.tr('Virtual Environments'),
+            self.tr("Virtual Environments"),
+            self.tr("Virtual Environments"),
             QKeySequence(self.tr("Ctrl+Alt+V")),
-            0, self,
-            'virtualenv_manager_activate')
-        self.virtualenvManagerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the Virtual Environments Manager"
-            " window."))
-        self.virtualenvManagerActivateAct.setWhatsThis(self.tr(
-            """<b>Virtual Environments</b>"""
-            """<p>This switches the input focus to the Virtual Environments"""
-            """ Manager window.</p>"""
-        ))
+            0,
+            self,
+            "virtualenv_manager_activate",
+        )
+        self.virtualenvManagerActivateAct.setStatusTip(
+            self.tr(
+                "Switch the input focus to the Virtual Environments Manager" " window."
+            )
+        )
+        self.virtualenvManagerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Virtual Environments</b>"""
+                """<p>This switches the input focus to the Virtual Environments"""
+                """ Manager window.</p>"""
+            )
+        )
         self.virtualenvManagerActivateAct.triggered.connect(
-            self.activateVirtualenvManager)
+            self.activateVirtualenvManager
+        )
         self.actions.append(self.virtualenvManagerActivateAct)
         self.addAction(self.virtualenvManagerActivateAct)
-        
+
         if self.__findFileWidget is not None:
             self.findFileActivateAct = EricAction(
                 self.tr("Find/Replace In Files"),
                 self.tr("Find/Replace In Files"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+F")),
-                0, self,
-                'find_file_activate')
-            self.findFileActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Find/Replace In Files window."))
-            self.findFileActivateAct.setWhatsThis(self.tr(
-                """<b>Find/Replace In Files</b>"""
-                """<p>This switches the input focus to the Find/Replace In"""
-                """ Files window.</p>"""
-            ))
-            self.findFileActivateAct.triggered.connect(
-                self.__activateFindFileWidget)
+                0,
+                self,
+                "find_file_activate",
+            )
+            self.findFileActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Find/Replace In Files window.")
+            )
+            self.findFileActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Find/Replace In Files</b>"""
+                    """<p>This switches the input focus to the Find/Replace In"""
+                    """ Files window.</p>"""
+                )
+            )
+            self.findFileActivateAct.triggered.connect(self.__activateFindFileWidget)
             self.actions.append(self.findFileActivateAct)
             self.addAction(self.findFileActivateAct)
-        
+
         if self.__findLocationWidget is not None:
             self.findLocationActivateAct = EricAction(
                 self.tr("Find File"),
                 self.tr("Find File"),
                 QKeySequence(self.tr("Ctrl+Alt+Shift+L")),
-                0, self,
-                'find_location_activate')
-            self.findLocationActivateAct.setStatusTip(self.tr(
-                "Switch the input focus to the Find File window."))
-            self.findLocationActivateAct.setWhatsThis(self.tr(
-                """<b>Find File</b>"""
-                """<p>This switches the input focus to the Find File window."""
-                """</p>"""
-            ))
+                0,
+                self,
+                "find_location_activate",
+            )
+            self.findLocationActivateAct.setStatusTip(
+                self.tr("Switch the input focus to the Find File window.")
+            )
+            self.findLocationActivateAct.setWhatsThis(
+                self.tr(
+                    """<b>Find File</b>"""
+                    """<p>This switches the input focus to the Find File window."""
+                    """</p>"""
+                )
+            )
             self.findLocationActivateAct.triggered.connect(
-                self.__activateFindLocationWidget)
+                self.__activateFindLocationWidget
+            )
             self.actions.append(self.findLocationActivateAct)
             self.addAction(self.findLocationActivateAct)
 
@@ -2373,855 +2690,1109 @@
             self.tr("VCS Status List"),
             self.tr("VCS Status List"),
             QKeySequence(self.tr("Alt+Shift+V")),
-            0, self,
-            'vcs_status_list_activate')
-        self.vcsStatusListActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the VCS Status List window."))
-        self.vcsStatusListActivateAct.setWhatsThis(self.tr(
-            """<b>VCS Status List</b>"""
-            """<p>This switches the input focus to the VCS Status List"""
-            """ window.</p>"""
-        ))
-        self.vcsStatusListActivateAct.triggered.connect(
-            self.__activateVcsStatusList)
+            0,
+            self,
+            "vcs_status_list_activate",
+        )
+        self.vcsStatusListActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the VCS Status List window.")
+        )
+        self.vcsStatusListActivateAct.setWhatsThis(
+            self.tr(
+                """<b>VCS Status List</b>"""
+                """<p>This switches the input focus to the VCS Status List"""
+                """ window.</p>"""
+            )
+        )
+        self.vcsStatusListActivateAct.triggered.connect(self.__activateVcsStatusList)
         self.actions.append(self.vcsStatusListActivateAct)
         self.addAction(self.vcsStatusListActivateAct)
-        
+
         self.helpViewerActivateAct = EricAction(
             self.tr("Help Viewer"),
             self.tr("Help Viewer"),
             QKeySequence(self.tr("Alt+Shift+H")),
-            0, self,
-            'help_viewer_activate')
-        self.helpViewerActivateAct.setStatusTip(self.tr(
-            "Switch the input focus to the embedded Help Viewer window."))
-        self.helpViewerActivateAct.setWhatsThis(self.tr(
-            """<b>Help Viewer</b>"""
-            """<p>This switches the input focus to the embedded Help Viewer"""
-            """ window. It will show HTML help files and help from Qt help"""
-            """ collections.</p><p>If called with a word selected, this word"""
-            """ is searched in the Qt help collection.</p>"""
-        ))
-        self.helpViewerActivateAct.triggered.connect(
-            self.__activateHelpViewerWidget)
+            0,
+            self,
+            "help_viewer_activate",
+        )
+        self.helpViewerActivateAct.setStatusTip(
+            self.tr("Switch the input focus to the embedded Help Viewer window.")
+        )
+        self.helpViewerActivateAct.setWhatsThis(
+            self.tr(
+                """<b>Help Viewer</b>"""
+                """<p>This switches the input focus to the embedded Help Viewer"""
+                """ window. It will show HTML help files and help from Qt help"""
+                """ collections.</p><p>If called with a word selected, this word"""
+                """ is searched in the Qt help collection.</p>"""
+            )
+        )
+        self.helpViewerActivateAct.triggered.connect(self.__activateHelpViewerWidget)
         self.actions.append(self.helpViewerActivateAct)
         self.addAction(self.helpViewerActivateAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1")),
-            0, self, 'whatsThis')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow with"""
-            """ a question mark, and you can click on the interface elements"""
-            """ to get a short description of what they do and how to use"""
-            """ them. In dialogs, this feature can be accessed using the"""
-            """ context help button in the titlebar.</p>"""
-        ))
+            0,
+            self,
+            "whatsThis",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow with"""
+                """ a question mark, and you can click on the interface elements"""
+                """ to get a short description of what they do and how to use"""
+                """ them. In dialogs, this feature can be accessed using the"""
+                """ context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.actions.append(self.whatsThisAct)
 
         self.helpviewerAct = EricAction(
-            self.tr('Helpviewer'),
+            self.tr("Helpviewer"),
             UI.PixmapCache.getIcon("help"),
-            self.tr('&Helpviewer...'),
+            self.tr("&Helpviewer..."),
             QKeySequence(self.tr("F1")),
-            0, self, 'helpviewer')
-        self.helpviewerAct.setStatusTip(self.tr(
-            'Open the helpviewer window'))
-        self.helpviewerAct.setWhatsThis(self.tr(
-            """<b>Helpviewer</b>"""
-            """<p>Display the eric web browser. This window will show"""
-            """ HTML help files and help from Qt help collections. It"""
-            """ has the capability to navigate to links, set bookmarks,"""
-            """ print the displayed help and some more features. You may"""
-            """ use it to browse the internet as well</p><p>If called"""
-            """ with a word selected, this word is searched in the Qt help"""
-            """ collection.</p>"""
-        ))
+            0,
+            self,
+            "helpviewer",
+        )
+        self.helpviewerAct.setStatusTip(self.tr("Open the helpviewer window"))
+        self.helpviewerAct.setWhatsThis(
+            self.tr(
+                """<b>Helpviewer</b>"""
+                """<p>Display the eric web browser. This window will show"""
+                """ HTML help files and help from Qt help collections. It"""
+                """ has the capability to navigate to links, set bookmarks,"""
+                """ print the displayed help and some more features. You may"""
+                """ use it to browse the internet as well</p><p>If called"""
+                """ with a word selected, this word is searched in the Qt help"""
+                """ collection.</p>"""
+            )
+        )
         self.helpviewerAct.triggered.connect(self.__helpViewer)
         self.actions.append(self.helpviewerAct)
-        
+
         self.__initQtDocActions()
         self.__initPythonDocActions()
         self.__initEricDocAction()
         self.__initPySideDocActions()
-      
+
         self.versionAct = EricAction(
-            self.tr('Show Versions'),
-            self.tr('Show &Versions'),
-            0, 0, self, 'show_versions')
-        self.versionAct.setStatusTip(self.tr(
-            'Display version information'))
-        self.versionAct.setWhatsThis(self.tr(
-            """<b>Show Versions</b>"""
-            """<p>Display version information.</p>"""
-        ))
+            self.tr("Show Versions"),
+            self.tr("Show &Versions"),
+            0,
+            0,
+            self,
+            "show_versions",
+        )
+        self.versionAct.setStatusTip(self.tr("Display version information"))
+        self.versionAct.setWhatsThis(
+            self.tr(
+                """<b>Show Versions</b>""" """<p>Display version information.</p>"""
+            )
+        )
         self.versionAct.triggered.connect(self.__showVersions)
         self.actions.append(self.versionAct)
 
         self.showErrorLogAct = EricAction(
-            self.tr('Show Error Log'),
-            self.tr('Show Error &Log...'),
-            0, 0, self, 'show_error_log')
-        self.showErrorLogAct.setStatusTip(self.tr('Show Error Log'))
-        self.showErrorLogAct.setWhatsThis(self.tr(
-            """<b>Show Error Log...</b>"""
-            """<p>Opens a dialog showing the most recent error log.</p>"""
-        ))
+            self.tr("Show Error Log"),
+            self.tr("Show Error &Log..."),
+            0,
+            0,
+            self,
+            "show_error_log",
+        )
+        self.showErrorLogAct.setStatusTip(self.tr("Show Error Log"))
+        self.showErrorLogAct.setWhatsThis(
+            self.tr(
+                """<b>Show Error Log...</b>"""
+                """<p>Opens a dialog showing the most recent error log.</p>"""
+            )
+        )
         self.showErrorLogAct.triggered.connect(self.__showErrorLog)
         self.actions.append(self.showErrorLogAct)
-        
+
         self.showInstallInfoAct = EricAction(
-            self.tr('Show Install Info'),
-            self.tr('Show Install &Info...'),
-            0, 0, self, 'show_install_info')
-        self.showInstallInfoAct.setStatusTip(self.tr(
-            'Show Installation Information'))
-        self.showInstallInfoAct.setWhatsThis(self.tr(
-            """<b>Show Install Info...</b>"""
-            """<p>Opens a dialog showing some information about the"""
-            """ installation process.</p>"""
-        ))
+            self.tr("Show Install Info"),
+            self.tr("Show Install &Info..."),
+            0,
+            0,
+            self,
+            "show_install_info",
+        )
+        self.showInstallInfoAct.setStatusTip(self.tr("Show Installation Information"))
+        self.showInstallInfoAct.setWhatsThis(
+            self.tr(
+                """<b>Show Install Info...</b>"""
+                """<p>Opens a dialog showing some information about the"""
+                """ installation process.</p>"""
+            )
+        )
         self.showInstallInfoAct.triggered.connect(self.__showInstallInfo)
         self.actions.append(self.showInstallInfoAct)
-        
+
         self.reportBugAct = EricAction(
-            self.tr('Report Bug'),
-            self.tr('Report &Bug...'),
-            0, 0, self, 'report_bug')
-        self.reportBugAct.setStatusTip(self.tr('Report a bug'))
-        self.reportBugAct.setWhatsThis(self.tr(
-            """<b>Report Bug...</b>"""
-            """<p>Opens a dialog to report a bug.</p>"""
-        ))
+            self.tr("Report Bug"), self.tr("Report &Bug..."), 0, 0, self, "report_bug"
+        )
+        self.reportBugAct.setStatusTip(self.tr("Report a bug"))
+        self.reportBugAct.setWhatsThis(
+            self.tr(
+                """<b>Report Bug...</b>""" """<p>Opens a dialog to report a bug.</p>"""
+            )
+        )
         self.reportBugAct.triggered.connect(self.__reportBug)
         self.actions.append(self.reportBugAct)
-        
+
         self.requestFeatureAct = EricAction(
-            self.tr('Request Feature'),
-            self.tr('Request &Feature...'),
-            0, 0, self, 'request_feature')
-        self.requestFeatureAct.setStatusTip(self.tr(
-            'Send a feature request'))
-        self.requestFeatureAct.setWhatsThis(self.tr(
-            """<b>Request Feature...</b>"""
-            """<p>Opens a dialog to send a feature request.</p>"""
-        ))
+            self.tr("Request Feature"),
+            self.tr("Request &Feature..."),
+            0,
+            0,
+            self,
+            "request_feature",
+        )
+        self.requestFeatureAct.setStatusTip(self.tr("Send a feature request"))
+        self.requestFeatureAct.setWhatsThis(
+            self.tr(
+                """<b>Request Feature...</b>"""
+                """<p>Opens a dialog to send a feature request.</p>"""
+            )
+        )
         self.requestFeatureAct.triggered.connect(self.__requestFeature)
         self.actions.append(self.requestFeatureAct)
 
         self.testingActGrp = createActionGroup(self)
-        
+
         self.testingDialogAct = EricAction(
-            self.tr('Testing'),
+            self.tr("Testing"),
             UI.PixmapCache.getIcon("unittest"),
-            self.tr('&Testing...'),
-            0, 0, self.testingActGrp, 'unittest')
-        self.testingDialogAct.setStatusTip(self.tr('Start the testing dialog'))
-        self.testingDialogAct.setWhatsThis(self.tr(
-            """<b>Testing</b>"""
-            """<p>Perform test runs. The dialog gives the"""
-            """ ability to select and run a test suite or"""
-            """ auto discover them.</p>"""
-        ))
+            self.tr("&Testing..."),
+            0,
+            0,
+            self.testingActGrp,
+            "unittest",
+        )
+        self.testingDialogAct.setStatusTip(self.tr("Start the testing dialog"))
+        self.testingDialogAct.setWhatsThis(
+            self.tr(
+                """<b>Testing</b>"""
+                """<p>Perform test runs. The dialog gives the"""
+                """ ability to select and run a test suite or"""
+                """ auto discover them.</p>"""
+            )
+        )
         self.testingDialogAct.triggered.connect(self.__startTesting)
         self.actions.append(self.testingDialogAct)
 
         self.restartTestAct = EricAction(
-            self.tr('Restart Last Test'),
+            self.tr("Restart Last Test"),
             UI.PixmapCache.getIcon("unittestRestart"),
-            self.tr('&Restart Last Test...'),
-            0, 0, self.testingActGrp, 'unittest_restart')
-        self.restartTestAct.setStatusTip(self.tr('Restarts the last test'))
-        self.restartTestAct.setWhatsThis(self.tr(
-            """<b>Restart Last Test</b>"""
-            """<p>Restarts the test performed last.</p>"""
-        ))
+            self.tr("&Restart Last Test..."),
+            0,
+            0,
+            self.testingActGrp,
+            "unittest_restart",
+        )
+        self.restartTestAct.setStatusTip(self.tr("Restarts the last test"))
+        self.restartTestAct.setWhatsThis(
+            self.tr(
+                """<b>Restart Last Test</b>"""
+                """<p>Restarts the test performed last.</p>"""
+            )
+        )
         self.restartTestAct.triggered.connect(self.__restartTest)
         self.restartTestAct.setEnabled(False)
         self.actions.append(self.restartTestAct)
-        
+
         self.rerunFailedTestsAct = EricAction(
-            self.tr('Rerun Failed Tests'),
+            self.tr("Rerun Failed Tests"),
             UI.PixmapCache.getIcon("unittestRerunFailed"),
-            self.tr('Rerun Failed Tests...'),
-            0, 0, self.testingActGrp, 'unittest_rerun_failed')
-        self.rerunFailedTestsAct.setStatusTip(self.tr(
-            'Rerun failed tests of the last run'))
-        self.rerunFailedTestsAct.setWhatsThis(self.tr(
-            """<b>Rerun Failed Tests</b>"""
-            """<p>Rerun all tests that failed during the last test run.</p>"""
-        ))
+            self.tr("Rerun Failed Tests..."),
+            0,
+            0,
+            self.testingActGrp,
+            "unittest_rerun_failed",
+        )
+        self.rerunFailedTestsAct.setStatusTip(
+            self.tr("Rerun failed tests of the last run")
+        )
+        self.rerunFailedTestsAct.setWhatsThis(
+            self.tr(
+                """<b>Rerun Failed Tests</b>"""
+                """<p>Rerun all tests that failed during the last test run.</p>"""
+            )
+        )
         self.rerunFailedTestsAct.triggered.connect(self.__rerunFailedTests)
         self.rerunFailedTestsAct.setEnabled(False)
         self.actions.append(self.rerunFailedTestsAct)
-        
+
         self.testScriptAct = EricAction(
-            self.tr('Test Script'),
+            self.tr("Test Script"),
             UI.PixmapCache.getIcon("unittestScript"),
-            self.tr('Test &Script...'),
-            0, 0, self.testingActGrp, 'unittest_script')
-        self.testScriptAct.setStatusTip(self.tr(
-            'Run tests of the current script'))
-        self.testScriptAct.setWhatsThis(self.tr(
-            """<b>Test Script</b>"""
-            """<p>Run tests with the current script.</p>"""
-        ))
+            self.tr("Test &Script..."),
+            0,
+            0,
+            self.testingActGrp,
+            "unittest_script",
+        )
+        self.testScriptAct.setStatusTip(self.tr("Run tests of the current script"))
+        self.testScriptAct.setWhatsThis(
+            self.tr(
+                """<b>Test Script</b>""" """<p>Run tests with the current script.</p>"""
+            )
+        )
         self.testScriptAct.triggered.connect(self.__startTestScript)
         self.testScriptAct.setEnabled(False)
         self.actions.append(self.testScriptAct)
-        
+
         self.testProjectAct = EricAction(
-            self.tr('Test Project'),
+            self.tr("Test Project"),
             UI.PixmapCache.getIcon("unittestProject"),
-            self.tr('Test &Project...'),
-            0, 0, self.testingActGrp, 'unittest_project')
-        self.testProjectAct.setStatusTip(self.tr(
-            'Run tests of the current project'))
-        self.testProjectAct.setWhatsThis(self.tr(
-            """<b>Test Project</b>"""
-            """<p>Run test of the current project.</p>"""
-        ))
+            self.tr("Test &Project..."),
+            0,
+            0,
+            self.testingActGrp,
+            "unittest_project",
+        )
+        self.testProjectAct.setStatusTip(self.tr("Run tests of the current project"))
+        self.testProjectAct.setWhatsThis(
+            self.tr(
+                """<b>Test Project</b>""" """<p>Run test of the current project.</p>"""
+            )
+        )
         self.testProjectAct.triggered.connect(self.__startTestProject)
         self.testProjectAct.setEnabled(False)
         self.actions.append(self.testProjectAct)
-        
+
         # check for Qt5 designer and linguist
         if Utilities.isWindowsPlatform():
             designerExe = os.path.join(
                 Utilities.getQtBinariesPath(),
-                "{0}.exe".format(Utilities.generateQtToolName("designer")))
+                "{0}.exe".format(Utilities.generateQtToolName("designer")),
+            )
         elif Utilities.isMacPlatform():
             designerExe = Utilities.getQtMacBundle("designer")
         else:
             designerExe = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("designer"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("designer")
+            )
         if os.path.exists(designerExe):
             self.designer4Act = EricAction(
-                self.tr('Qt-Designer'),
+                self.tr("Qt-Designer"),
                 UI.PixmapCache.getIcon("designer4"),
-                self.tr('Qt-&Designer...'),
-                0, 0, self, 'qt_designer4')
-            self.designer4Act.setStatusTip(self.tr('Start Qt-Designer'))
-            self.designer4Act.setWhatsThis(self.tr(
-                """<b>Qt-Designer</b>"""
-                """<p>Start Qt-Designer.</p>"""
-            ))
+                self.tr("Qt-&Designer..."),
+                0,
+                0,
+                self,
+                "qt_designer4",
+            )
+            self.designer4Act.setStatusTip(self.tr("Start Qt-Designer"))
+            self.designer4Act.setWhatsThis(
+                self.tr("""<b>Qt-Designer</b>""" """<p>Start Qt-Designer.</p>""")
+            )
             self.designer4Act.triggered.connect(self.__designer)
             self.actions.append(self.designer4Act)
         else:
             self.designer4Act = None
-        
+
         if Utilities.isWindowsPlatform():
             linguistExe = os.path.join(
                 Utilities.getQtBinariesPath(),
-                "{0}.exe".format(Utilities.generateQtToolName("linguist")))
+                "{0}.exe".format(Utilities.generateQtToolName("linguist")),
+            )
         elif Utilities.isMacPlatform():
             linguistExe = Utilities.getQtMacBundle("linguist")
         else:
             linguistExe = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("linguist"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("linguist")
+            )
         if os.path.exists(linguistExe):
             self.linguist4Act = EricAction(
-                self.tr('Qt-Linguist'),
+                self.tr("Qt-Linguist"),
                 UI.PixmapCache.getIcon("linguist4"),
-                self.tr('Qt-&Linguist...'),
-                0, 0, self, 'qt_linguist4')
-            self.linguist4Act.setStatusTip(self.tr('Start Qt-Linguist'))
-            self.linguist4Act.setWhatsThis(self.tr(
-                """<b>Qt-Linguist</b>"""
-                """<p>Start Qt-Linguist.</p>"""
-            ))
+                self.tr("Qt-&Linguist..."),
+                0,
+                0,
+                self,
+                "qt_linguist4",
+            )
+            self.linguist4Act.setStatusTip(self.tr("Start Qt-Linguist"))
+            self.linguist4Act.setWhatsThis(
+                self.tr("""<b>Qt-Linguist</b>""" """<p>Start Qt-Linguist.</p>""")
+            )
             self.linguist4Act.triggered.connect(self.__linguist)
             self.actions.append(self.linguist4Act)
         else:
             self.linguist4Act = None
-    
+
         self.uipreviewerAct = EricAction(
-            self.tr('UI Previewer'),
+            self.tr("UI Previewer"),
             UI.PixmapCache.getIcon("uiPreviewer"),
-            self.tr('&UI Previewer...'),
-            0, 0, self, 'ui_previewer')
-        self.uipreviewerAct.setStatusTip(self.tr('Start the UI Previewer'))
-        self.uipreviewerAct.setWhatsThis(self.tr(
-            """<b>UI Previewer</b>"""
-            """<p>Start the UI Previewer.</p>"""
-        ))
+            self.tr("&UI Previewer..."),
+            0,
+            0,
+            self,
+            "ui_previewer",
+        )
+        self.uipreviewerAct.setStatusTip(self.tr("Start the UI Previewer"))
+        self.uipreviewerAct.setWhatsThis(
+            self.tr("""<b>UI Previewer</b>""" """<p>Start the UI Previewer.</p>""")
+        )
         self.uipreviewerAct.triggered.connect(self.__UIPreviewer)
         self.actions.append(self.uipreviewerAct)
-        
+
         self.trpreviewerAct = EricAction(
-            self.tr('Translations Previewer'),
+            self.tr("Translations Previewer"),
             UI.PixmapCache.getIcon("trPreviewer"),
-            self.tr('&Translations Previewer...'),
-            0, 0, self, 'tr_previewer')
-        self.trpreviewerAct.setStatusTip(self.tr(
-            'Start the Translations Previewer'))
-        self.trpreviewerAct.setWhatsThis(self.tr(
-            """<b>Translations Previewer</b>"""
-            """<p>Start the Translations Previewer.</p>"""
-        ))
+            self.tr("&Translations Previewer..."),
+            0,
+            0,
+            self,
+            "tr_previewer",
+        )
+        self.trpreviewerAct.setStatusTip(self.tr("Start the Translations Previewer"))
+        self.trpreviewerAct.setWhatsThis(
+            self.tr(
+                """<b>Translations Previewer</b>"""
+                """<p>Start the Translations Previewer.</p>"""
+            )
+        )
         self.trpreviewerAct.triggered.connect(self.__TRPreviewer)
         self.actions.append(self.trpreviewerAct)
-        
+
         self.diffAct = EricAction(
-            self.tr('Compare Files'),
+            self.tr("Compare Files"),
             UI.PixmapCache.getIcon("diffFiles"),
-            self.tr('&Compare Files...'),
-            0, 0, self, 'diff_files')
-        self.diffAct.setStatusTip(self.tr('Compare two files'))
-        self.diffAct.setWhatsThis(self.tr(
-            """<b>Compare Files</b>"""
-            """<p>Open a dialog to compare two files.</p>"""
-        ))
+            self.tr("&Compare Files..."),
+            0,
+            0,
+            self,
+            "diff_files",
+        )
+        self.diffAct.setStatusTip(self.tr("Compare two files"))
+        self.diffAct.setWhatsThis(
+            self.tr(
+                """<b>Compare Files</b>"""
+                """<p>Open a dialog to compare two files.</p>"""
+            )
+        )
         self.diffAct.triggered.connect(self.__compareFiles)
         self.actions.append(self.diffAct)
 
         self.compareAct = EricAction(
-            self.tr('Compare Files side by side'),
+            self.tr("Compare Files side by side"),
             UI.PixmapCache.getIcon("compareFiles"),
-            self.tr('Compare &Files side by side...'),
-            0, 0, self, 'compare_files')
-        self.compareAct.setStatusTip(self.tr('Compare two files'))
-        self.compareAct.setWhatsThis(self.tr(
-            """<b>Compare Files side by side</b>"""
-            """<p>Open a dialog to compare two files and show the result"""
-            """ side by side.</p>"""
-        ))
+            self.tr("Compare &Files side by side..."),
+            0,
+            0,
+            self,
+            "compare_files",
+        )
+        self.compareAct.setStatusTip(self.tr("Compare two files"))
+        self.compareAct.setWhatsThis(
+            self.tr(
+                """<b>Compare Files side by side</b>"""
+                """<p>Open a dialog to compare two files and show the result"""
+                """ side by side.</p>"""
+            )
+        )
         self.compareAct.triggered.connect(self.__compareFilesSbs)
         self.actions.append(self.compareAct)
 
         self.sqlBrowserAct = EricAction(
-            self.tr('SQL Browser'),
+            self.tr("SQL Browser"),
             UI.PixmapCache.getIcon("sqlBrowser"),
-            self.tr('SQL &Browser...'),
-            0, 0, self, 'sql_browser')
-        self.sqlBrowserAct.setStatusTip(self.tr('Browse a SQL database'))
-        self.sqlBrowserAct.setWhatsThis(self.tr(
-            """<b>SQL Browser</b>"""
-            """<p>Browse a SQL database.</p>"""
-        ))
+            self.tr("SQL &Browser..."),
+            0,
+            0,
+            self,
+            "sql_browser",
+        )
+        self.sqlBrowserAct.setStatusTip(self.tr("Browse a SQL database"))
+        self.sqlBrowserAct.setWhatsThis(
+            self.tr("""<b>SQL Browser</b>""" """<p>Browse a SQL database.</p>""")
+        )
         self.sqlBrowserAct.triggered.connect(self.__sqlBrowser)
         self.actions.append(self.sqlBrowserAct)
 
         self.miniEditorAct = EricAction(
-            self.tr('Mini Editor'),
+            self.tr("Mini Editor"),
             UI.PixmapCache.getIcon("editor"),
-            self.tr('Mini &Editor...'),
-            0, 0, self, 'mini_editor')
-        self.miniEditorAct.setStatusTip(self.tr('Mini Editor'))
-        self.miniEditorAct.setWhatsThis(self.tr(
-            """<b>Mini Editor</b>"""
-            """<p>Open a dialog with a simplified editor.</p>"""
-        ))
+            self.tr("Mini &Editor..."),
+            0,
+            0,
+            self,
+            "mini_editor",
+        )
+        self.miniEditorAct.setStatusTip(self.tr("Mini Editor"))
+        self.miniEditorAct.setWhatsThis(
+            self.tr(
+                """<b>Mini Editor</b>"""
+                """<p>Open a dialog with a simplified editor.</p>"""
+            )
+        )
         self.miniEditorAct.triggered.connect(self.__openMiniEditor)
         self.actions.append(self.miniEditorAct)
 
         self.hexEditorAct = EricAction(
-            self.tr('Hex Editor'),
+            self.tr("Hex Editor"),
             UI.PixmapCache.getIcon("hexEditor"),
-            self.tr('&Hex Editor...'),
-            0, 0, self, 'hex_editor')
-        self.hexEditorAct.setStatusTip(self.tr(
-            'Start the eric Hex Editor'))
-        self.hexEditorAct.setWhatsThis(self.tr(
-            """<b>Hex Editor</b>"""
-            """<p>Starts the eric Hex Editor for viewing or editing"""
-            """ binary files.</p>"""
-        ))
+            self.tr("&Hex Editor..."),
+            0,
+            0,
+            self,
+            "hex_editor",
+        )
+        self.hexEditorAct.setStatusTip(self.tr("Start the eric Hex Editor"))
+        self.hexEditorAct.setWhatsThis(
+            self.tr(
+                """<b>Hex Editor</b>"""
+                """<p>Starts the eric Hex Editor for viewing or editing"""
+                """ binary files.</p>"""
+            )
+        )
         self.hexEditorAct.triggered.connect(self.__openHexEditor)
         self.actions.append(self.hexEditorAct)
 
         self.webBrowserAct = EricAction(
-            self.tr('eric Web Browser'),
+            self.tr("eric Web Browser"),
             UI.PixmapCache.getIcon("ericWeb"),
-            self.tr('eric &Web Browser...'),
-            0, 0, self, 'web_browser')
-        self.webBrowserAct.setStatusTip(self.tr(
-            'Start the eric Web Browser'))
-        self.webBrowserAct.setWhatsThis(self.tr(
-            """<b>eric Web Browser</b>"""
-            """<p>Browse the Internet with the eric Web Browser.</p>"""
-        ))
+            self.tr("eric &Web Browser..."),
+            0,
+            0,
+            self,
+            "web_browser",
+        )
+        self.webBrowserAct.setStatusTip(self.tr("Start the eric Web Browser"))
+        self.webBrowserAct.setWhatsThis(
+            self.tr(
+                """<b>eric Web Browser</b>"""
+                """<p>Browse the Internet with the eric Web Browser.</p>"""
+            )
+        )
         self.webBrowserAct.triggered.connect(self.__startWebBrowser)
         self.actions.append(self.webBrowserAct)
 
         self.iconEditorAct = EricAction(
-            self.tr('Icon Editor'),
+            self.tr("Icon Editor"),
             UI.PixmapCache.getIcon("iconEditor"),
-            self.tr('&Icon Editor...'),
-            0, 0, self, 'icon_editor')
-        self.iconEditorAct.setStatusTip(self.tr(
-            'Start the eric Icon Editor'))
-        self.iconEditorAct.setWhatsThis(self.tr(
-            """<b>Icon Editor</b>"""
-            """<p>Starts the eric Icon Editor for editing simple icons.</p>"""
-        ))
+            self.tr("&Icon Editor..."),
+            0,
+            0,
+            self,
+            "icon_editor",
+        )
+        self.iconEditorAct.setStatusTip(self.tr("Start the eric Icon Editor"))
+        self.iconEditorAct.setWhatsThis(
+            self.tr(
+                """<b>Icon Editor</b>"""
+                """<p>Starts the eric Icon Editor for editing simple icons.</p>"""
+            )
+        )
         self.iconEditorAct.triggered.connect(self.__editPixmap)
         self.actions.append(self.iconEditorAct)
 
         self.snapshotAct = EricAction(
-            self.tr('Snapshot'),
+            self.tr("Snapshot"),
             UI.PixmapCache.getIcon("ericSnap"),
-            self.tr('&Snapshot...'),
-            0, 0, self, 'snapshot')
-        self.snapshotAct.setStatusTip(self.tr(
-            'Take snapshots of a screen region'))
-        self.snapshotAct.setWhatsThis(self.tr(
-            """<b>Snapshot</b>"""
-            """<p>This opens a dialog to take snapshots of a screen"""
-            """ region.</p>"""
-        ))
+            self.tr("&Snapshot..."),
+            0,
+            0,
+            self,
+            "snapshot",
+        )
+        self.snapshotAct.setStatusTip(self.tr("Take snapshots of a screen region"))
+        self.snapshotAct.setWhatsThis(
+            self.tr(
+                """<b>Snapshot</b>"""
+                """<p>This opens a dialog to take snapshots of a screen"""
+                """ region.</p>"""
+            )
+        )
         self.snapshotAct.triggered.connect(self.__snapshot)
         self.actions.append(self.snapshotAct)
 
         self.prefAct = EricAction(
-            self.tr('Preferences'),
+            self.tr("Preferences"),
             UI.PixmapCache.getIcon("configure"),
-            self.tr('&Preferences...'),
-            0, 0, self, 'preferences')
-        self.prefAct.setStatusTip(self.tr(
-            'Set the prefered configuration'))
-        self.prefAct.setWhatsThis(self.tr(
-            """<b>Preferences</b>"""
-            """<p>Set the configuration items of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("&Preferences..."),
+            0,
+            0,
+            self,
+            "preferences",
+        )
+        self.prefAct.setStatusTip(self.tr("Set the prefered configuration"))
+        self.prefAct.setWhatsThis(
+            self.tr(
+                """<b>Preferences</b>"""
+                """<p>Set the configuration items of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.prefAct.triggered.connect(self.showPreferences)
         self.prefAct.setMenuRole(QAction.MenuRole.PreferencesRole)
         self.actions.append(self.prefAct)
 
         self.prefExportAct = EricAction(
-            self.tr('Export Preferences'),
+            self.tr("Export Preferences"),
             UI.PixmapCache.getIcon("configureExport"),
-            self.tr('E&xport Preferences...'),
-            0, 0, self, 'export_preferences')
-        self.prefExportAct.setStatusTip(self.tr(
-            'Export the current configuration'))
-        self.prefExportAct.setWhatsThis(self.tr(
-            """<b>Export Preferences</b>"""
-            """<p>Export the current configuration to a file.</p>"""
-        ))
+            self.tr("E&xport Preferences..."),
+            0,
+            0,
+            self,
+            "export_preferences",
+        )
+        self.prefExportAct.setStatusTip(self.tr("Export the current configuration"))
+        self.prefExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export Preferences</b>"""
+                """<p>Export the current configuration to a file.</p>"""
+            )
+        )
         self.prefExportAct.triggered.connect(self.__exportPreferences)
         self.actions.append(self.prefExportAct)
 
         self.prefImportAct = EricAction(
-            self.tr('Import Preferences'),
+            self.tr("Import Preferences"),
             UI.PixmapCache.getIcon("configureImport"),
-            self.tr('I&mport Preferences...'),
-            0, 0, self, 'import_preferences')
-        self.prefImportAct.setStatusTip(self.tr(
-            'Import a previously exported configuration'))
-        self.prefImportAct.setWhatsThis(self.tr(
-            """<b>Import Preferences</b>"""
-            """<p>Import a previously exported configuration.</p>"""
-        ))
+            self.tr("I&mport Preferences..."),
+            0,
+            0,
+            self,
+            "import_preferences",
+        )
+        self.prefImportAct.setStatusTip(
+            self.tr("Import a previously exported configuration")
+        )
+        self.prefImportAct.setWhatsThis(
+            self.tr(
+                """<b>Import Preferences</b>"""
+                """<p>Import a previously exported configuration.</p>"""
+            )
+        )
         self.prefImportAct.triggered.connect(self.__importPreferences)
         self.actions.append(self.prefImportAct)
 
         self.themeExportAct = EricAction(
-            self.tr('Export Theme'),
+            self.tr("Export Theme"),
             UI.PixmapCache.getIcon("themeExport"),
-            self.tr('Export Theme...'),
-            0, 0, self, 'export_theme')
-        self.themeExportAct.setStatusTip(self.tr(
-            'Export the current theme'))
-        self.themeExportAct.setWhatsThis(self.tr(
-            """<b>Export Theme</b>"""
-            """<p>Export the current theme to a file.</p>"""
-        ))
+            self.tr("Export Theme..."),
+            0,
+            0,
+            self,
+            "export_theme",
+        )
+        self.themeExportAct.setStatusTip(self.tr("Export the current theme"))
+        self.themeExportAct.setWhatsThis(
+            self.tr(
+                """<b>Export Theme</b>"""
+                """<p>Export the current theme to a file.</p>"""
+            )
+        )
         self.themeExportAct.triggered.connect(self.__exportTheme)
         self.actions.append(self.themeExportAct)
 
         self.themeImportAct = EricAction(
-            self.tr('Import Theme'),
+            self.tr("Import Theme"),
             UI.PixmapCache.getIcon("themeImport"),
-            self.tr('Import Theme...'),
-            0, 0, self, 'import_theme')
-        self.themeImportAct.setStatusTip(self.tr(
-            'Import a previously exported theme'))
-        self.themeImportAct.setWhatsThis(self.tr(
-            """<b>Import Theme</b>"""
-            """<p>Import a previously exported theme.</p>"""
-        ))
+            self.tr("Import Theme..."),
+            0,
+            0,
+            self,
+            "import_theme",
+        )
+        self.themeImportAct.setStatusTip(self.tr("Import a previously exported theme"))
+        self.themeImportAct.setWhatsThis(
+            self.tr(
+                """<b>Import Theme</b>"""
+                """<p>Import a previously exported theme.</p>"""
+            )
+        )
         self.themeImportAct.triggered.connect(self.__importTheme)
         self.actions.append(self.themeImportAct)
 
         self.reloadAPIsAct = EricAction(
-            self.tr('Reload APIs'),
-            self.tr('Reload &APIs'),
-            0, 0, self, 'reload_apis')
-        self.reloadAPIsAct.setStatusTip(self.tr(
-            'Reload the API information'))
-        self.reloadAPIsAct.setWhatsThis(self.tr(
-            """<b>Reload APIs</b>"""
-            """<p>Reload the API information.</p>"""
-        ))
+            self.tr("Reload APIs"), self.tr("Reload &APIs"), 0, 0, self, "reload_apis"
+        )
+        self.reloadAPIsAct.setStatusTip(self.tr("Reload the API information"))
+        self.reloadAPIsAct.setWhatsThis(
+            self.tr("""<b>Reload APIs</b>""" """<p>Reload the API information.</p>""")
+        )
         self.reloadAPIsAct.triggered.connect(self.__reloadAPIs)
         self.actions.append(self.reloadAPIsAct)
 
         self.showExternalToolsAct = EricAction(
-            self.tr('Show external tools'),
+            self.tr("Show external tools"),
             UI.PixmapCache.getIcon("showPrograms"),
-            self.tr('Show external &tools'),
-            0, 0, self, 'show_external_tools')
-        self.showExternalToolsAct.setStatusTip(self.tr(
-            'Show external tools'))
-        self.showExternalToolsAct.setWhatsThis(self.tr(
-            """<b>Show external tools</b>"""
-            """<p>Opens a dialog to show the path and versions of all"""
-            """ extenal tools used by eric.</p>"""
-        ))
-        self.showExternalToolsAct.triggered.connect(
-            self.__showExternalTools)
+            self.tr("Show external &tools"),
+            0,
+            0,
+            self,
+            "show_external_tools",
+        )
+        self.showExternalToolsAct.setStatusTip(self.tr("Show external tools"))
+        self.showExternalToolsAct.setWhatsThis(
+            self.tr(
+                """<b>Show external tools</b>"""
+                """<p>Opens a dialog to show the path and versions of all"""
+                """ extenal tools used by eric.</p>"""
+            )
+        )
+        self.showExternalToolsAct.triggered.connect(self.__showExternalTools)
         self.actions.append(self.showExternalToolsAct)
 
         self.configViewProfilesAct = EricAction(
-            self.tr('View Profiles'),
+            self.tr("View Profiles"),
             UI.PixmapCache.getIcon("configureViewProfiles"),
-            self.tr('&View Profiles...'),
-            0, 0, self, 'view_profiles')
-        self.configViewProfilesAct.setStatusTip(self.tr(
-            'Configure view profiles'))
-        self.configViewProfilesAct.setWhatsThis(self.tr(
-            """<b>View Profiles</b>"""
-            """<p>Configure the view profiles. With this dialog you may"""
-            """ set the visibility of the various windows for the"""
-            """ predetermined view profiles.</p>"""
-        ))
-        self.configViewProfilesAct.triggered.connect(
-            self.__configViewProfiles)
+            self.tr("&View Profiles..."),
+            0,
+            0,
+            self,
+            "view_profiles",
+        )
+        self.configViewProfilesAct.setStatusTip(self.tr("Configure view profiles"))
+        self.configViewProfilesAct.setWhatsThis(
+            self.tr(
+                """<b>View Profiles</b>"""
+                """<p>Configure the view profiles. With this dialog you may"""
+                """ set the visibility of the various windows for the"""
+                """ predetermined view profiles.</p>"""
+            )
+        )
+        self.configViewProfilesAct.triggered.connect(self.__configViewProfiles)
         self.actions.append(self.configViewProfilesAct)
 
         self.configToolBarsAct = EricAction(
-            self.tr('Toolbars'),
+            self.tr("Toolbars"),
             UI.PixmapCache.getIcon("toolbarsConfigure"),
-            self.tr('Tool&bars...'),
-            0, 0, self, 'configure_toolbars')
-        self.configToolBarsAct.setStatusTip(self.tr('Configure toolbars'))
-        self.configToolBarsAct.setWhatsThis(self.tr(
-            """<b>Toolbars</b>"""
-            """<p>Configure the toolbars. With this dialog you may"""
-            """ change the actions shown on the various toolbars and"""
-            """ define your own toolbars.</p>"""
-        ))
+            self.tr("Tool&bars..."),
+            0,
+            0,
+            self,
+            "configure_toolbars",
+        )
+        self.configToolBarsAct.setStatusTip(self.tr("Configure toolbars"))
+        self.configToolBarsAct.setWhatsThis(
+            self.tr(
+                """<b>Toolbars</b>"""
+                """<p>Configure the toolbars. With this dialog you may"""
+                """ change the actions shown on the various toolbars and"""
+                """ define your own toolbars.</p>"""
+            )
+        )
         self.configToolBarsAct.triggered.connect(self.__configToolBars)
         self.actions.append(self.configToolBarsAct)
 
         self.shortcutsAct = EricAction(
-            self.tr('Keyboard Shortcuts'),
+            self.tr("Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("configureShortcuts"),
-            self.tr('Keyboard &Shortcuts...'),
-            0, 0, self, 'keyboard_shortcuts')
-        self.shortcutsAct.setStatusTip(self.tr(
-            'Set the keyboard shortcuts'))
-        self.shortcutsAct.setWhatsThis(self.tr(
-            """<b>Keyboard Shortcuts</b>"""
-            """<p>Set the keyboard shortcuts of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("Keyboard &Shortcuts..."),
+            0,
+            0,
+            self,
+            "keyboard_shortcuts",
+        )
+        self.shortcutsAct.setStatusTip(self.tr("Set the keyboard shortcuts"))
+        self.shortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Keyboard Shortcuts</b>"""
+                """<p>Set the keyboard shortcuts of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.shortcutsAct.triggered.connect(self.__configShortcuts)
         self.actions.append(self.shortcutsAct)
 
         self.exportShortcutsAct = EricAction(
-            self.tr('Export Keyboard Shortcuts'),
+            self.tr("Export Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("exportShortcuts"),
-            self.tr('&Export Keyboard Shortcuts...'),
-            0, 0, self, 'export_keyboard_shortcuts')
-        self.exportShortcutsAct.setStatusTip(self.tr(
-            'Export the keyboard shortcuts'))
-        self.exportShortcutsAct.setWhatsThis(self.tr(
-            """<b>Export Keyboard Shortcuts</b>"""
-            """<p>Export the keyboard shortcuts of the application.</p>"""
-        ))
+            self.tr("&Export Keyboard Shortcuts..."),
+            0,
+            0,
+            self,
+            "export_keyboard_shortcuts",
+        )
+        self.exportShortcutsAct.setStatusTip(self.tr("Export the keyboard shortcuts"))
+        self.exportShortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Export Keyboard Shortcuts</b>"""
+                """<p>Export the keyboard shortcuts of the application.</p>"""
+            )
+        )
         self.exportShortcutsAct.triggered.connect(self.__exportShortcuts)
         self.actions.append(self.exportShortcutsAct)
 
         self.importShortcutsAct = EricAction(
-            self.tr('Import Keyboard Shortcuts'),
+            self.tr("Import Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("importShortcuts"),
-            self.tr('&Import Keyboard Shortcuts...'),
-            0, 0, self, 'import_keyboard_shortcuts')
-        self.importShortcutsAct.setStatusTip(self.tr(
-            'Import the keyboard shortcuts'))
-        self.importShortcutsAct.setWhatsThis(self.tr(
-            """<b>Import Keyboard Shortcuts</b>"""
-            """<p>Import the keyboard shortcuts of the application.</p>"""
-        ))
+            self.tr("&Import Keyboard Shortcuts..."),
+            0,
+            0,
+            self,
+            "import_keyboard_shortcuts",
+        )
+        self.importShortcutsAct.setStatusTip(self.tr("Import the keyboard shortcuts"))
+        self.importShortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Import Keyboard Shortcuts</b>"""
+                """<p>Import the keyboard shortcuts of the application.</p>"""
+            )
+        )
         self.importShortcutsAct.triggered.connect(self.__importShortcuts)
         self.actions.append(self.importShortcutsAct)
 
         if SSL_AVAILABLE:
             self.certificatesAct = EricAction(
-                self.tr('Manage SSL Certificates'),
+                self.tr("Manage SSL Certificates"),
                 UI.PixmapCache.getIcon("certificates"),
-                self.tr('Manage SSL Certificates...'),
-                0, 0, self, 'manage_ssl_certificates')
-            self.certificatesAct.setStatusTip(self.tr(
-                'Manage the saved SSL certificates'))
-            self.certificatesAct.setWhatsThis(self.tr(
-                """<b>Manage SSL Certificates...</b>"""
-                """<p>Opens a dialog to manage the saved SSL certificates."""
-                """</p>"""
-            ))
-            self.certificatesAct.triggered.connect(
-                self.__showCertificatesDialog)
+                self.tr("Manage SSL Certificates..."),
+                0,
+                0,
+                self,
+                "manage_ssl_certificates",
+            )
+            self.certificatesAct.setStatusTip(
+                self.tr("Manage the saved SSL certificates")
+            )
+            self.certificatesAct.setWhatsThis(
+                self.tr(
+                    """<b>Manage SSL Certificates...</b>"""
+                    """<p>Opens a dialog to manage the saved SSL certificates."""
+                    """</p>"""
+                )
+            )
+            self.certificatesAct.triggered.connect(self.__showCertificatesDialog)
             self.actions.append(self.certificatesAct)
-        
+
         self.editMessageFilterAct = EricAction(
-            self.tr('Edit Message Filters'),
+            self.tr("Edit Message Filters"),
             UI.PixmapCache.getIcon("warning"),
-            self.tr('Edit Message Filters...'),
-            0, 0, self, 'manage_message_filters')
-        self.editMessageFilterAct.setStatusTip(self.tr(
-            'Edit the message filters used to suppress unwanted messages'))
-        self.editMessageFilterAct.setWhatsThis(self.tr(
-            """<b>Edit Message Filters</b>"""
-            """<p>Opens a dialog to edit the message filters used to"""
-            """ suppress unwanted messages been shown in an error"""
-            """ window.</p>"""
-        ))
-        self.editMessageFilterAct.triggered.connect(
-            EricErrorMessage.editMessageFilters)
+            self.tr("Edit Message Filters..."),
+            0,
+            0,
+            self,
+            "manage_message_filters",
+        )
+        self.editMessageFilterAct.setStatusTip(
+            self.tr("Edit the message filters used to suppress unwanted messages")
+        )
+        self.editMessageFilterAct.setWhatsThis(
+            self.tr(
+                """<b>Edit Message Filters</b>"""
+                """<p>Opens a dialog to edit the message filters used to"""
+                """ suppress unwanted messages been shown in an error"""
+                """ window.</p>"""
+            )
+        )
+        self.editMessageFilterAct.triggered.connect(EricErrorMessage.editMessageFilters)
         self.actions.append(self.editMessageFilterAct)
 
         self.clearPrivateDataAct = EricAction(
-            self.tr('Clear private data'),
+            self.tr("Clear private data"),
             UI.PixmapCache.getIcon("clearPrivateData"),
-            self.tr('Clear private data'),
-            0, 0,
-            self, 'clear_private_data')
-        self.clearPrivateDataAct.setStatusTip(self.tr(
-            'Clear private data'))
-        self.clearPrivateDataAct.setWhatsThis(self.tr(
-            """<b>Clear private data</b>"""
-            """<p>Clears the private data like the various list of"""
-            """ recently opened files, projects or multi projects.</p>"""
-        ))
-        self.clearPrivateDataAct.triggered.connect(
-            self.__clearPrivateData)
+            self.tr("Clear private data"),
+            0,
+            0,
+            self,
+            "clear_private_data",
+        )
+        self.clearPrivateDataAct.setStatusTip(self.tr("Clear private data"))
+        self.clearPrivateDataAct.setWhatsThis(
+            self.tr(
+                """<b>Clear private data</b>"""
+                """<p>Clears the private data like the various list of"""
+                """ recently opened files, projects or multi projects.</p>"""
+            )
+        )
+        self.clearPrivateDataAct.triggered.connect(self.__clearPrivateData)
         self.actions.append(self.clearPrivateDataAct)
-        
+
         self.viewmanagerActivateAct = EricAction(
-            self.tr('Activate current editor'),
-            self.tr('Activate current editor'),
+            self.tr("Activate current editor"),
+            self.tr("Activate current editor"),
             QKeySequence(self.tr("Alt+Shift+E")),
-            0, self, 'viewmanager_activate')
-        self.viewmanagerActivateAct.triggered.connect(
-            self.__activateViewmanager)
+            0,
+            self,
+            "viewmanager_activate",
+        )
+        self.viewmanagerActivateAct.triggered.connect(self.__activateViewmanager)
         self.actions.append(self.viewmanagerActivateAct)
         self.addAction(self.viewmanagerActivateAct)
 
         self.nextTabAct = EricAction(
-            self.tr('Show next'),
-            self.tr('Show next'),
-            QKeySequence(self.tr('Ctrl+Alt+Tab')), 0,
-            self, 'view_next_tab')
+            self.tr("Show next"),
+            self.tr("Show next"),
+            QKeySequence(self.tr("Ctrl+Alt+Tab")),
+            0,
+            self,
+            "view_next_tab",
+        )
         self.nextTabAct.triggered.connect(self.__showNext)
         self.actions.append(self.nextTabAct)
         self.addAction(self.nextTabAct)
-        
+
         self.prevTabAct = EricAction(
-            self.tr('Show previous'),
-            self.tr('Show previous'),
-            QKeySequence(self.tr('Shift+Ctrl+Alt+Tab')), 0,
-            self, 'view_previous_tab')
+            self.tr("Show previous"),
+            self.tr("Show previous"),
+            QKeySequence(self.tr("Shift+Ctrl+Alt+Tab")),
+            0,
+            self,
+            "view_previous_tab",
+        )
         self.prevTabAct.triggered.connect(self.__showPrevious)
         self.actions.append(self.prevTabAct)
         self.addAction(self.prevTabAct)
-        
+
         self.switchTabAct = EricAction(
-            self.tr('Switch between tabs'),
-            self.tr('Switch between tabs'),
-            QKeySequence(self.tr('Ctrl+1')), 0,
-            self, 'switch_tabs')
+            self.tr("Switch between tabs"),
+            self.tr("Switch between tabs"),
+            QKeySequence(self.tr("Ctrl+1")),
+            0,
+            self,
+            "switch_tabs",
+        )
         self.switchTabAct.triggered.connect(self.__switchTab)
         self.actions.append(self.switchTabAct)
         self.addAction(self.switchTabAct)
-        
+
         self.pluginInfoAct = EricAction(
-            self.tr('Plugin Infos'),
+            self.tr("Plugin Infos"),
             UI.PixmapCache.getIcon("plugin"),
-            self.tr('&Plugin Infos...'), 0, 0, self, 'plugin_infos')
-        self.pluginInfoAct.setStatusTip(self.tr('Show Plugin Infos'))
-        self.pluginInfoAct.setWhatsThis(self.tr(
-            """<b>Plugin Infos...</b>"""
-            """<p>This opens a dialog, that show some information about"""
-            """ loaded plugins.</p>"""
-        ))
+            self.tr("&Plugin Infos..."),
+            0,
+            0,
+            self,
+            "plugin_infos",
+        )
+        self.pluginInfoAct.setStatusTip(self.tr("Show Plugin Infos"))
+        self.pluginInfoAct.setWhatsThis(
+            self.tr(
+                """<b>Plugin Infos...</b>"""
+                """<p>This opens a dialog, that show some information about"""
+                """ loaded plugins.</p>"""
+            )
+        )
         self.pluginInfoAct.triggered.connect(self.__showPluginInfo)
         self.actions.append(self.pluginInfoAct)
-        
+
         self.pluginInstallAct = EricAction(
-            self.tr('Install Plugins'),
+            self.tr("Install Plugins"),
             UI.PixmapCache.getIcon("pluginInstall"),
-            self.tr('&Install Plugins...'),
-            0, 0, self, 'plugin_install')
-        self.pluginInstallAct.setStatusTip(self.tr('Install Plugins'))
-        self.pluginInstallAct.setWhatsThis(self.tr(
-            """<b>Install Plugins...</b>"""
-            """<p>This opens a dialog to install or update plugins.</p>"""
-        ))
+            self.tr("&Install Plugins..."),
+            0,
+            0,
+            self,
+            "plugin_install",
+        )
+        self.pluginInstallAct.setStatusTip(self.tr("Install Plugins"))
+        self.pluginInstallAct.setWhatsThis(
+            self.tr(
+                """<b>Install Plugins...</b>"""
+                """<p>This opens a dialog to install or update plugins.</p>"""
+            )
+        )
         self.pluginInstallAct.triggered.connect(self.__installPlugins)
         self.actions.append(self.pluginInstallAct)
-        
+
         self.pluginDeinstallAct = EricAction(
-            self.tr('Uninstall Plugin'),
+            self.tr("Uninstall Plugin"),
             UI.PixmapCache.getIcon("pluginUninstall"),
-            self.tr('&Uninstall Plugin...'),
-            0, 0, self, 'plugin_deinstall')
-        self.pluginDeinstallAct.setStatusTip(self.tr('Uninstall Plugin'))
-        self.pluginDeinstallAct.setWhatsThis(self.tr(
-            """<b>Uninstall Plugin...</b>"""
-            """<p>This opens a dialog to uninstall a plugin.</p>"""
-        ))
+            self.tr("&Uninstall Plugin..."),
+            0,
+            0,
+            self,
+            "plugin_deinstall",
+        )
+        self.pluginDeinstallAct.setStatusTip(self.tr("Uninstall Plugin"))
+        self.pluginDeinstallAct.setWhatsThis(
+            self.tr(
+                """<b>Uninstall Plugin...</b>"""
+                """<p>This opens a dialog to uninstall a plugin.</p>"""
+            )
+        )
         self.pluginDeinstallAct.triggered.connect(self.__deinstallPlugin)
         self.actions.append(self.pluginDeinstallAct)
 
         self.pluginRepoAct = EricAction(
-            self.tr('Plugin Repository'),
+            self.tr("Plugin Repository"),
             UI.PixmapCache.getIcon("pluginRepository"),
-            self.tr('Plugin &Repository...'),
-            0, 0, self, 'plugin_repository')
-        self.pluginRepoAct.setStatusTip(self.tr(
-            'Show Plugins available for download'))
-        self.pluginRepoAct.setWhatsThis(self.tr(
-            """<b>Plugin Repository...</b>"""
-            """<p>This opens a dialog, that shows a list of plugins """
-            """available on the Internet.</p>"""
-        ))
+            self.tr("Plugin &Repository..."),
+            0,
+            0,
+            self,
+            "plugin_repository",
+        )
+        self.pluginRepoAct.setStatusTip(self.tr("Show Plugins available for download"))
+        self.pluginRepoAct.setWhatsThis(
+            self.tr(
+                """<b>Plugin Repository...</b>"""
+                """<p>This opens a dialog, that shows a list of plugins """
+                """available on the Internet.</p>"""
+            )
+        )
         self.pluginRepoAct.triggered.connect(self.__showPluginsAvailable)
         self.actions.append(self.pluginRepoAct)
-        
+
         # initialize viewmanager actions
         self.viewmanager.initActions()
-        
+
         # initialize debugger actions
         self.debuggerUI.initActions()
-        
+
         # initialize project actions
         self.project.initActions()
-        
+
         # initialize multi project actions
         self.multiProject.initActions()
-    
+
     def __initQtDocActions(self):
         """
         Private slot to initialize the action to show the Qt documentation.
         """
         self.qt5DocAct = EricAction(
-            self.tr('Qt5 Documentation'),
-            self.tr('Qt5 Documentation'),
-            0, 0, self, 'qt5_documentation')
-        self.qt5DocAct.setStatusTip(self.tr('Open Qt5 Documentation'))
-        self.qt5DocAct.setWhatsThis(self.tr(
-            """<b>Qt5 Documentation</b>"""
-            """<p>Display the Qt5 Documentation. Dependent upon your"""
-            """ settings, this will either show the help in Eric's internal"""
-            """ help viewer/web browser, or execute a web browser or Qt"""
-            """ Assistant. </p>"""
-        ))
+            self.tr("Qt5 Documentation"),
+            self.tr("Qt5 Documentation"),
+            0,
+            0,
+            self,
+            "qt5_documentation",
+        )
+        self.qt5DocAct.setStatusTip(self.tr("Open Qt5 Documentation"))
+        self.qt5DocAct.setWhatsThis(
+            self.tr(
+                """<b>Qt5 Documentation</b>"""
+                """<p>Display the Qt5 Documentation. Dependent upon your"""
+                """ settings, this will either show the help in Eric's internal"""
+                """ help viewer/web browser, or execute a web browser or Qt"""
+                """ Assistant. </p>"""
+            )
+        )
         self.qt5DocAct.triggered.connect(lambda: self.__showQtDoc(5))
         self.actions.append(self.qt5DocAct)
-      
+
         self.qt6DocAct = EricAction(
-            self.tr('Qt6 Documentation'),
-            self.tr('Qt6 Documentation'),
-            0, 0, self, 'qt6_documentation')
-        self.qt6DocAct.setStatusTip(self.tr('Open Qt6 Documentation'))
-        self.qt6DocAct.setWhatsThis(self.tr(
-            """<b>Qt6 Documentation</b>"""
-            """<p>Display the Qt6 Documentation. Dependent upon your"""
-            """ settings, this will either show the help in Eric's internal"""
-            """ help viewer/web browser, or execute a web browser or Qt"""
-            """ Assistant. </p>"""
-        ))
+            self.tr("Qt6 Documentation"),
+            self.tr("Qt6 Documentation"),
+            0,
+            0,
+            self,
+            "qt6_documentation",
+        )
+        self.qt6DocAct.setStatusTip(self.tr("Open Qt6 Documentation"))
+        self.qt6DocAct.setWhatsThis(
+            self.tr(
+                """<b>Qt6 Documentation</b>"""
+                """<p>Display the Qt6 Documentation. Dependent upon your"""
+                """ settings, this will either show the help in Eric's internal"""
+                """ help viewer/web browser, or execute a web browser or Qt"""
+                """ Assistant. </p>"""
+            )
+        )
         self.qt6DocAct.triggered.connect(lambda: self.__showQtDoc(6))
         self.actions.append(self.qt6DocAct)
-      
+
         self.pyqt5DocAct = EricAction(
-            self.tr('PyQt5 Documentation'),
-            self.tr('PyQt5 Documentation'),
-            0, 0, self, 'pyqt5_documentation')
-        self.pyqt5DocAct.setStatusTip(self.tr(
-            'Open PyQt5 Documentation'))
-        self.pyqt5DocAct.setWhatsThis(self.tr(
-            """<b>PyQt5 Documentation</b>"""
-            """<p>Display the PyQt5 Documentation. Dependent upon your"""
-            """ settings, this will either show the help in Eric's"""
-            """ internal help viewer/web browser, or execute a web"""
-            """ browser or Qt Assistant. </p>"""
-        ))
-        self.pyqt5DocAct.triggered.connect(
-            lambda: self.__showPyQtDoc(variant=5))
+            self.tr("PyQt5 Documentation"),
+            self.tr("PyQt5 Documentation"),
+            0,
+            0,
+            self,
+            "pyqt5_documentation",
+        )
+        self.pyqt5DocAct.setStatusTip(self.tr("Open PyQt5 Documentation"))
+        self.pyqt5DocAct.setWhatsThis(
+            self.tr(
+                """<b>PyQt5 Documentation</b>"""
+                """<p>Display the PyQt5 Documentation. Dependent upon your"""
+                """ settings, this will either show the help in Eric's"""
+                """ internal help viewer/web browser, or execute a web"""
+                """ browser or Qt Assistant. </p>"""
+            )
+        )
+        self.pyqt5DocAct.triggered.connect(lambda: self.__showPyQtDoc(variant=5))
         self.actions.append(self.pyqt5DocAct)
-      
+
         self.pyqt6DocAct = EricAction(
-            self.tr('PyQt6 Documentation'),
-            self.tr('PyQt6 Documentation'),
-            0, 0, self, 'pyqt6_documentation')
-        self.pyqt6DocAct.setStatusTip(self.tr(
-            'Open PyQt6 Documentation'))
-        self.pyqt6DocAct.setWhatsThis(self.tr(
-            """<b>PyQt6 Documentation</b>"""
-            """<p>Display the PyQt6 Documentation. Dependent upon your"""
-            """ settings, this will either show the help in Eric's"""
-            """ internal help viewer/web browser, or execute a web"""
-            """ browser or Qt Assistant. </p>"""
-        ))
-        self.pyqt6DocAct.triggered.connect(
-            lambda: self.__showPyQtDoc(variant=6))
+            self.tr("PyQt6 Documentation"),
+            self.tr("PyQt6 Documentation"),
+            0,
+            0,
+            self,
+            "pyqt6_documentation",
+        )
+        self.pyqt6DocAct.setStatusTip(self.tr("Open PyQt6 Documentation"))
+        self.pyqt6DocAct.setWhatsThis(
+            self.tr(
+                """<b>PyQt6 Documentation</b>"""
+                """<p>Display the PyQt6 Documentation. Dependent upon your"""
+                """ settings, this will either show the help in Eric's"""
+                """ internal help viewer/web browser, or execute a web"""
+                """ browser or Qt Assistant. </p>"""
+            )
+        )
+        self.pyqt6DocAct.triggered.connect(lambda: self.__showPyQtDoc(variant=6))
         self.actions.append(self.pyqt6DocAct)
-    
+
     def __initPythonDocActions(self):
         """
         Private slot to initialize the actions to show the Python
         documentation.
         """
         self.pythonDocAct = EricAction(
-            self.tr('Python 3 Documentation'),
-            self.tr('Python 3 Documentation'),
-            0, 0, self, 'python3_documentation')
-        self.pythonDocAct.setStatusTip(self.tr(
-            'Open Python 3 Documentation'))
-        self.pythonDocAct.setWhatsThis(self.tr(
-            """<b>Python 3 Documentation</b>"""
-            """<p>Display the Python 3 documentation. If no documentation"""
-            """ directory is configured, the location of the Python 3"""
-            """ documentation is assumed to be the doc directory underneath"""
-            """ the location of the Python 3 executable on Windows and"""
-            """ <i>/usr/share/doc/packages/python/html</i> on Unix. Set"""
-            """ PYTHON3DOCDIR in your environment to override this.</p>"""
-        ))
+            self.tr("Python 3 Documentation"),
+            self.tr("Python 3 Documentation"),
+            0,
+            0,
+            self,
+            "python3_documentation",
+        )
+        self.pythonDocAct.setStatusTip(self.tr("Open Python 3 Documentation"))
+        self.pythonDocAct.setWhatsThis(
+            self.tr(
+                """<b>Python 3 Documentation</b>"""
+                """<p>Display the Python 3 documentation. If no documentation"""
+                """ directory is configured, the location of the Python 3"""
+                """ documentation is assumed to be the doc directory underneath"""
+                """ the location of the Python 3 executable on Windows and"""
+                """ <i>/usr/share/doc/packages/python/html</i> on Unix. Set"""
+                """ PYTHON3DOCDIR in your environment to override this.</p>"""
+            )
+        )
         self.pythonDocAct.triggered.connect(self.__showPythonDoc)
         self.actions.append(self.pythonDocAct)
-    
+
     def __initEricDocAction(self):
         """
         Private slot to initialize the action to show the eric documentation.
         """
         self.ericDocAct = EricAction(
             self.tr("eric API Documentation"),
-            self.tr('eric API Documentation'),
-            0, 0, self, 'eric_documentation')
-        self.ericDocAct.setStatusTip(self.tr(
-            "Open eric API Documentation"))
-        self.ericDocAct.setWhatsThis(self.tr(
-            """<b>eric API Documentation</b>"""
-            """<p>Display the eric API documentation. The location for the"""
-            """ documentation is the Documentation/Source subdirectory of"""
-            """ the eric installation directory.</p>"""
-        ))
+            self.tr("eric API Documentation"),
+            0,
+            0,
+            self,
+            "eric_documentation",
+        )
+        self.ericDocAct.setStatusTip(self.tr("Open eric API Documentation"))
+        self.ericDocAct.setWhatsThis(
+            self.tr(
+                """<b>eric API Documentation</b>"""
+                """<p>Display the eric API documentation. The location for the"""
+                """ documentation is the Documentation/Source subdirectory of"""
+                """ the eric installation directory.</p>"""
+            )
+        )
         self.ericDocAct.triggered.connect(self.__showEricDoc)
         self.actions.append(self.ericDocAct)
-        
+
     def __initPySideDocActions(self):
         """
         Private slot to initialize the actions to show the PySide
@@ -3229,60 +3800,69 @@
         """
         if Utilities.checkPyside(variant=2):
             self.pyside2DocAct = EricAction(
-                self.tr('PySide2 Documentation'),
-                self.tr('PySide2 Documentation'),
-                0, 0, self, 'pyside2_documentation')
-            self.pyside2DocAct.setStatusTip(self.tr(
-                'Open PySide2 Documentation'))
-            self.pyside2DocAct.setWhatsThis(self.tr(
-                """<b>PySide2 Documentation</b>"""
-                """<p>Display the PySide2 Documentation. Dependent upon your"""
-                """ settings, this will either show the help in Eric's"""
-                """ internal help viewer/web browser, or execute a web"""
-                """ browser or Qt Assistant. </p>"""
-            ))
+                self.tr("PySide2 Documentation"),
+                self.tr("PySide2 Documentation"),
+                0,
+                0,
+                self,
+                "pyside2_documentation",
+            )
+            self.pyside2DocAct.setStatusTip(self.tr("Open PySide2 Documentation"))
+            self.pyside2DocAct.setWhatsThis(
+                self.tr(
+                    """<b>PySide2 Documentation</b>"""
+                    """<p>Display the PySide2 Documentation. Dependent upon your"""
+                    """ settings, this will either show the help in Eric's"""
+                    """ internal help viewer/web browser, or execute a web"""
+                    """ browser or Qt Assistant. </p>"""
+                )
+            )
             self.pyside2DocAct.triggered.connect(
-                lambda: self.__showPySideDoc(variant=2))
+                lambda: self.__showPySideDoc(variant=2)
+            )
             self.actions.append(self.pyside2DocAct)
         else:
             self.pyside2DocAct = None
-        
+
         if Utilities.checkPyside(variant=6):
             self.pyside6DocAct = EricAction(
-                self.tr('PySide6 Documentation'),
-                self.tr('PySide6 Documentation'),
-                0, 0, self, 'pyside6_documentation')
-            self.pyside6DocAct.setStatusTip(self.tr(
-                'Open PySide6 Documentation'))
-            self.pyside6DocAct.setWhatsThis(self.tr(
-                """<b>PySide6 Documentation</b>"""
-                """<p>Display the PySide6 Documentation. Dependent upon your"""
-                """ settings, this will either show the help in Eric's"""
-                """ internal help viewer/web browser, or execute a web"""
-                """ browser or Qt Assistant. </p>"""
-            ))
+                self.tr("PySide6 Documentation"),
+                self.tr("PySide6 Documentation"),
+                0,
+                0,
+                self,
+                "pyside6_documentation",
+            )
+            self.pyside6DocAct.setStatusTip(self.tr("Open PySide6 Documentation"))
+            self.pyside6DocAct.setWhatsThis(
+                self.tr(
+                    """<b>PySide6 Documentation</b>"""
+                    """<p>Display the PySide6 Documentation. Dependent upon your"""
+                    """ settings, this will either show the help in Eric's"""
+                    """ internal help viewer/web browser, or execute a web"""
+                    """ browser or Qt Assistant. </p>"""
+                )
+            )
             self.pyside6DocAct.triggered.connect(
-                lambda: self.__showPySideDoc(variant=6))
+                lambda: self.__showPySideDoc(variant=6)
+            )
             self.actions.append(self.pyside6DocAct)
         else:
             self.pyside6DocAct = None
-    
+
     def __initMenus(self):
         """
         Private slot to create the menus.
         """
         self.__menus = {}
         mb = self.menuBar()
-        if (
-            Utilities.isLinuxPlatform() and
-            not Preferences.getUI("UseNativeMenuBar")
-        ):
+        if Utilities.isLinuxPlatform() and not Preferences.getUI("UseNativeMenuBar"):
             mb.setNativeMenuBar(False)
-        
+
         ##############################################################
         ## File menu
         ##############################################################
-        
+
         self.__menus["file"] = self.viewmanager.initFileMenu()
         mb.addMenu(self.__menus["file"])
         self.__menus["file"].addSeparator()
@@ -3295,97 +3875,95 @@
         sep = self.__menus["file"].insertSeparator(act)
         self.__menus["file"].insertAction(sep, self.newWindowAct)
         self.__menus["file"].aboutToShow.connect(self.__showFileMenu)
-        
+
         ##############################################################
         ## Edit menu
         ##############################################################
-        
+
         self.__menus["edit"] = self.viewmanager.initEditMenu()
         mb.addMenu(self.__menus["edit"])
-        
+
         ##############################################################
         ## Search menu
         ##############################################################
-        
+
         self.__menus["search"] = self.viewmanager.initSearchMenu()
         mb.addMenu(self.__menus["search"])
-        
+
         ##############################################################
         ## View menu
         ##############################################################
-        
+
         self.__menus["view"] = self.viewmanager.initViewMenu()
         mb.addMenu(self.__menus["view"])
 
         ##############################################################
         ## Bookmarks menu
         ##############################################################
-        
+
         self.__menus["bookmarks"] = self.viewmanager.initBookmarkMenu()
         mb.addMenu(self.__menus["bookmarks"])
         self.__menus["bookmarks"].setTearOffEnabled(True)
-        
+
         ##############################################################
         ## Multiproject menu
         ##############################################################
-        
+
         self.__menus["multiproject"] = self.multiProject.initMenu()
         mb.addMenu(self.__menus["multiproject"])
-        
+
         ##############################################################
         ## Project menu
         ##############################################################
-        
-        self.__menus["project"], self.__menus["project_tools"] = (
-            self.project.initMenus()
-        )
+
+        (
+            self.__menus["project"],
+            self.__menus["project_tools"],
+        ) = self.project.initMenus()
         mb.addMenu(self.__menus["project"])
         mb.addMenu(self.__menus["project_tools"])
-        
+
         ##############################################################
         ## Start and Debug menus
         ##############################################################
-        
-        self.__menus["start"], self.__menus["debug"] = (
-            self.debuggerUI.initMenus()
-        )
+
+        self.__menus["start"], self.__menus["debug"] = self.debuggerUI.initMenus()
         mb.addMenu(self.__menus["start"])
         mb.addMenu(self.__menus["debug"])
-        
+
         ##############################################################
         ## Extras menu
         ##############################################################
-        
-        self.__menus["extras"] = QMenu(self.tr('E&xtras'), self)
+
+        self.__menus["extras"] = QMenu(self.tr("E&xtras"), self)
         self.__menus["extras"].setTearOffEnabled(True)
         self.__menus["extras"].aboutToShow.connect(self.__showExtrasMenu)
         mb.addMenu(self.__menus["extras"])
         self.viewmanager.addToExtrasMenu(self.__menus["extras"])
-        
+
         ##############################################################
         ## Extras/Wizards menu
         ##############################################################
-        
-        self.__menus["wizards"] = QMenu(self.tr('Wi&zards'), self)
+
+        self.__menus["wizards"] = QMenu(self.tr("Wi&zards"), self)
         self.__menus["wizards"].setTearOffEnabled(True)
         self.__menus["wizards"].aboutToShow.connect(self.__showWizardsMenu)
-        self.wizardsMenuAct = self.__menus["extras"].addMenu(
-            self.__menus["wizards"])
+        self.wizardsMenuAct = self.__menus["extras"].addMenu(self.__menus["wizards"])
         self.wizardsMenuAct.setEnabled(False)
-        
+
         ##############################################################
         ## Extras/Macros menu
         ##############################################################
-        
+
         self.__menus["macros"] = self.viewmanager.initMacroMenu()
         self.__menus["extras"].addMenu(self.__menus["macros"])
         self.__menus["extras"].addSeparator()
-        
+
         ##############################################################
         ## Extras/Plugins menu
         ##############################################################
-        
-        pluginsMenu = QMenu(self.tr('P&lugins'), self)
+
+        pluginsMenu = QMenu(self.tr("P&lugins"), self)
         pluginsMenu.setIcon(UI.PixmapCache.getIcon("plugin"))
         pluginsMenu.setTearOffEnabled(True)
         pluginsMenu.addAction(self.pluginInfoAct)
@@ -3394,17 +3972,16 @@
         pluginsMenu.addSeparator()
         pluginsMenu.addAction(self.pluginRepoAct)
         pluginsMenu.addSeparator()
-        pluginsMenu.addAction(
-            self.tr("Configure..."), self.__pluginsConfigure)
-        
+        pluginsMenu.addAction(self.tr("Configure..."), self.__pluginsConfigure)
+
         self.__menus["extras"].addMenu(pluginsMenu)
         self.__menus["extras"].addSeparator()
-    
+
         ##############################################################
         ## Extras/Unittest menu
         ##############################################################
-        
-        self.__menus["testing"] = QMenu(self.tr('&Testing'), self)
+
+        self.__menus["testing"] = QMenu(self.tr("&Testing"), self)
         self.__menus["testing"].setTearOffEnabled(True)
         self.__menus["testing"].addAction(self.testingDialogAct)
         self.__menus["testing"].addSeparator()
@@ -3413,29 +3990,29 @@
         self.__menus["testing"].addSeparator()
         self.__menus["testing"].addAction(self.testScriptAct)
         self.__menus["testing"].addAction(self.testProjectAct)
-        
+
         self.__menus["extras"].addMenu(self.__menus["testing"])
         self.__menus["extras"].addSeparator()
-        
+
         ##############################################################
         ## Extras/Builtin,Plugin,User tools menus
         ##############################################################
-        
+
         self.toolGroupsMenu = QMenu(self.tr("Select Tool Group"), self)
         self.toolGroupsMenu.aboutToShow.connect(self.__showToolGroupsMenu)
         self.toolGroupsMenu.triggered.connect(self.__toolGroupSelected)
         self.toolGroupsMenuTriggered = False
         self.__initToolsMenus(self.__menus["extras"])
         self.__menus["extras"].addSeparator()
-        
+
         ##############################################################
         ## Settings menu
         ##############################################################
-        
-        self.__menus["settings"] = QMenu(self.tr('Se&ttings'), self)
+
+        self.__menus["settings"] = QMenu(self.tr("Se&ttings"), self)
         mb.addMenu(self.__menus["settings"])
         self.__menus["settings"].setTearOffEnabled(True)
-        
+
         self.__menus["settings"].addAction(self.prefAct)
         self.__menus["settings"].addAction(self.prefExportAct)
         self.__menus["settings"].addAction(self.prefImportAct)
@@ -3460,28 +4037,27 @@
         self.__menus["settings"].addAction(self.editMessageFilterAct)
         self.__menus["settings"].addSeparator()
         self.__menus["settings"].addAction(self.clearPrivateDataAct)
-        
+
         ##############################################################
         ## Window menu
         ##############################################################
-        
-        self.__menus["window"] = QMenu(self.tr('&Window'), self)
+
+        self.__menus["window"] = QMenu(self.tr("&Window"), self)
         mb.addMenu(self.__menus["window"])
         self.__menus["window"].setTearOffEnabled(True)
         self.__menus["window"].aboutToShow.connect(self.__showWindowMenu)
-        
+
         ##############################################################
         ## Window/Windows menu
         ##############################################################
-        
-        self.__menus["subwindow"] = QMenu(self.tr("&Windows"),
-                                          self.__menus["window"])
+
+        self.__menus["subwindow"] = QMenu(self.tr("&Windows"), self.__menus["window"])
         self.__menus["subwindow"].setTearOffEnabled(True)
-        
+
         # central park
         self.__menus["subwindow"].addSection(self.tr("Central Park"))
         self.__menus["subwindow"].addAction(self.viewmanagerActivateAct)
-        
+
         # left side
         self.__menus["subwindow"].addSection(self.tr("Left Side"))
         self.__menus["subwindow"].addAction(self.mpbActivateAct)
@@ -3499,32 +4075,27 @@
             self.__menus["subwindow"].addAction(self.browserActivateAct)
         if self.symbolsViewer is not None:
             self.__menus["subwindow"].addAction(self.symbolsViewerActivateAct)
-        
+
         # right side
         if self.rightSidebar:
             self.__menus["subwindow"].addSection(self.tr("Right Side"))
             self.__menus["subwindow"].addAction(self.debugViewerActivateAct)
         if self.codeDocumentationViewer is not None:
-            self.__menus["subwindow"].addAction(
-                self.codeDocumentationViewerActivateAct)
-        self.__menus["subwindow"].addAction(
-            self.helpViewerActivateAct)
-        self.__menus["subwindow"].addAction(
-            self.pluginRepositoryViewerActivateAct)
+            self.__menus["subwindow"].addAction(self.codeDocumentationViewerActivateAct)
+        self.__menus["subwindow"].addAction(self.helpViewerActivateAct)
+        self.__menus["subwindow"].addAction(self.pluginRepositoryViewerActivateAct)
         self.__menus["subwindow"].addAction(self.virtualenvManagerActivateAct)
         if self.pipWidget is not None:
             self.__menus["subwindow"].addAction(self.pipWidgetActivateAct)
         if self.condaWidget is not None:
             self.__menus["subwindow"].addAction(self.condaWidgetActivateAct)
         if self.cooperation is not None:
-            self.__menus["subwindow"].addAction(
-                self.cooperationViewerActivateAct)
+            self.__menus["subwindow"].addAction(self.cooperationViewerActivateAct)
         if self.irc is not None:
             self.__menus["subwindow"].addAction(self.ircActivateAct)
         if self.microPythonWidget is not None:
-            self.__menus["subwindow"].addAction(
-                self.microPythonWidgetActivateAct)
-        
+            self.__menus["subwindow"].addAction(self.microPythonWidgetActivateAct)
+
         # bottom side
         self.__menus["subwindow"].addSection(self.tr("Bottom Side"))
         self.__menus["subwindow"].addAction(self.shellActivateAct)
@@ -3532,20 +4103,19 @@
         self.__menus["subwindow"].addAction(self.logViewerActivateAct)
         if self.numbersViewer is not None:
             self.__menus["subwindow"].addAction(self.numbersViewerActivateAct)
-        
+
         # plug-in provided windows
         self.__menus["subwindow"].addSection(self.tr("Plug-ins"))
-        
+
         ##############################################################
         ## Window/Toolbars menu
         ##############################################################
-        
-        self.__menus["toolbars"] = QMenu(
-            self.tr("&Toolbars"), self.__menus["window"])
+
+        self.__menus["toolbars"] = QMenu(self.tr("&Toolbars"), self.__menus["window"])
         self.__menus["toolbars"].setTearOffEnabled(True)
         self.__menus["toolbars"].aboutToShow.connect(self.__showToolbarsMenu)
         self.__menus["toolbars"].triggered.connect(self.__TBMenuTriggered)
-        
+
         self.__showWindowMenu()  # to initialize these actions
 
         mb.addSeparator()
@@ -3553,8 +4123,8 @@
         ##############################################################
         ## Help menu
         ##############################################################
-        
-        self.__menus["help"] = QMenu(self.tr('&Help'), self)
+
+        self.__menus["help"] = QMenu(self.tr("&Help"), self)
         mb.addMenu(self.__menus["help"])
         self.__menus["help"].setTearOffEnabled(True)
         if self.helpviewerAct:
@@ -3581,15 +4151,15 @@
         self.__menus["help"].addSeparator()
         self.__menus["help"].addAction(self.whatsThisAct)
         self.__menus["help"].aboutToShow.connect(self.__showHelpMenu)
-    
+
     def getToolBarIconSize(self):
         """
         Public method to get the toolbar icon size.
-        
+
         @return toolbar icon size (QSize)
         """
         return Config.ToolBarIconSize
-    
+
     def __initToolbars(self):
         """
         Private slot to create the toolbars.
@@ -3609,28 +4179,28 @@
         helptb = QToolBar(self.tr("Help"), self)
         profilestb = QToolBar(self.tr("Profiles"), self)
         pluginstb = QToolBar(self.tr("Plugins"), self)
-        
+
         toolstb.setIconSize(Config.ToolBarIconSize)
         testingtb.setIconSize(Config.ToolBarIconSize)
         settingstb.setIconSize(Config.ToolBarIconSize)
         helptb.setIconSize(Config.ToolBarIconSize)
         profilestb.setIconSize(Config.ToolBarIconSize)
         pluginstb.setIconSize(Config.ToolBarIconSize)
-        
+
         toolstb.setObjectName("ToolsToolbar")
         testingtb.setObjectName("UnittestToolbar")
         settingstb.setObjectName("SettingsToolbar")
         helptb.setObjectName("HelpToolbar")
         profilestb.setObjectName("ProfilesToolbar")
         pluginstb.setObjectName("PluginsToolbar")
-        
+
         toolstb.setToolTip(self.tr("Tools"))
         testingtb.setToolTip(self.tr("Unittest"))
         settingstb.setToolTip(self.tr("Settings"))
         helptb.setToolTip(self.tr("Help"))
         profilestb.setToolTip(self.tr("Profiles"))
         pluginstb.setToolTip(self.tr("Plugins"))
-        
+
         filetb.addSeparator()
         filetb.addAction(self.restartAct)
         filetb.addAction(self.exitAct)
@@ -3638,7 +4208,7 @@
         sep = filetb.insertSeparator(act)
         filetb.insertAction(sep, self.newWindowAct)
         self.toolbarManager.addToolBar(filetb, filetb.windowTitle())
-        
+
         # setup the testing toolbar
         testingtb.addAction(self.testingDialogAct)
         testingtb.addSeparator()
@@ -3648,7 +4218,7 @@
         testingtb.addAction(self.testScriptAct)
         testingtb.addAction(self.testProjectAct)
         self.toolbarManager.addToolBar(testingtb, testingtb.windowTitle())
-        
+
         # setup the tools toolbar
         if self.designer4Act is not None:
             toolstb.addAction(self.designer4Act)
@@ -3670,7 +4240,7 @@
             toolstb.addSeparator()
             toolstb.addAction(self.webBrowserAct)
         self.toolbarManager.addToolBar(toolstb, toolstb.windowTitle())
-        
+
         # setup the settings toolbar
         settingstb.addAction(self.prefAct)
         settingstb.addAction(self.configViewProfilesAct)
@@ -3678,32 +4248,35 @@
         settingstb.addAction(self.shortcutsAct)
         settingstb.addAction(self.showExternalToolsAct)
         self.toolbarManager.addToolBar(settingstb, settingstb.windowTitle())
-        self.toolbarManager.addActions([
-            self.exportShortcutsAct,
-            self.importShortcutsAct,
-            self.prefExportAct,
-            self.prefImportAct,
-            self.themeExportAct,
-            self.themeImportAct,
-            self.showExternalToolsAct,
-            self.editMessageFilterAct,
-            self.clearPrivateDataAct,
-        ], settingstb.windowTitle())
+        self.toolbarManager.addActions(
+            [
+                self.exportShortcutsAct,
+                self.importShortcutsAct,
+                self.prefExportAct,
+                self.prefImportAct,
+                self.themeExportAct,
+                self.themeImportAct,
+                self.showExternalToolsAct,
+                self.editMessageFilterAct,
+                self.clearPrivateDataAct,
+            ],
+            settingstb.windowTitle(),
+        )
         if SSL_AVAILABLE:
             self.toolbarManager.addAction(
-                self.certificatesAct, settingstb.windowTitle())
-        
+                self.certificatesAct, settingstb.windowTitle()
+            )
+
         # setup the help toolbar
         helptb.addAction(self.whatsThisAct)
         self.toolbarManager.addToolBar(helptb, helptb.windowTitle())
         if self.helpviewerAct:
-            self.toolbarManager.addAction(self.helpviewerAct,
-                                          helptb.windowTitle())
-        
+            self.toolbarManager.addAction(self.helpviewerAct, helptb.windowTitle())
+
         # setup the view profiles toolbar
         profilestb.addActions(self.viewProfileActGrp.actions())
         self.toolbarManager.addToolBar(profilestb, profilestb.windowTitle())
-        
+
         # setup the plugins toolbar
         pluginstb.addAction(self.pluginInfoAct)
         pluginstb.addAction(self.pluginInstallAct)
@@ -3711,7 +4284,7 @@
         pluginstb.addSeparator()
         pluginstb.addAction(self.pluginRepoAct)
         self.toolbarManager.addToolBar(pluginstb, pluginstb.windowTitle())
-        
+
         # add the various toolbars
         self.addToolBar(filetb)
         self.addToolBar(edittb)
@@ -3730,7 +4303,7 @@
         self.addToolBar(testingtb)
         self.addToolBar(profilestb)
         self.addToolBar(pluginstb)
-        
+
         # hide toolbars not wanted in the initial layout
         searchtb.hide()
         viewtb.hide()
@@ -3752,37 +4325,36 @@
         self.__toolbars["project"] = [projecttb.windowTitle(), projecttb, ""]
         self.__toolbars["tools"] = [toolstb.windowTitle(), toolstb, ""]
         self.__toolbars["help"] = [helptb.windowTitle(), helptb, ""]
-        self.__toolbars["settings"] = [settingstb.windowTitle(), settingstb,
-                                       ""]
-        self.__toolbars["bookmarks"] = [bookmarktb.windowTitle(), bookmarktb,
-                                        ""]
+        self.__toolbars["settings"] = [settingstb.windowTitle(), settingstb, ""]
+        self.__toolbars["bookmarks"] = [bookmarktb.windowTitle(), bookmarktb, ""]
         self.__toolbars["testing"] = [testingtb.windowTitle(), testingtb, ""]
-        self.__toolbars["view_profiles"] = [profilestb.windowTitle(),
-                                            profilestb, ""]
+        self.__toolbars["view_profiles"] = [profilestb.windowTitle(), profilestb, ""]
         self.__toolbars["plugins"] = [pluginstb.windowTitle(), pluginstb, ""]
-        self.__toolbars["multiproject"] = [multiprojecttb.windowTitle(),
-                                           multiprojecttb, ""]
-        self.__toolbars["spelling"] = [spellingtb.windowTitle(), spellingtb,
-                                       ""]
+        self.__toolbars["multiproject"] = [
+            multiprojecttb.windowTitle(),
+            multiprojecttb,
+            "",
+        ]
+        self.__toolbars["spelling"] = [spellingtb.windowTitle(), spellingtb, ""]
         self.__toolbars["vcs"] = [vcstb.windowTitle(), vcstb, "vcs"]
-        
+
     def __initDebugToolbarsLayout(self):
         """
         Private slot to initialize the toolbars layout for the debug profile.
         """
         # Step 1: set the edit profile to be sure
         self.__setEditProfile()
-        
+
         # Step 2: switch to debug profile and do the layout
         initSize = self.size()
         self.setDebugProfile()
         self.__toolbars["project"][1].hide()
         self.__toolbars["debug"][1].show()
         self.resize(initSize)
-        
+
         # Step 3: switch back to edit profile
         self.__setEditProfile()
-        
+
     def __initStatusbar(self):
         """
         Private slot to set up the status bar.
@@ -3792,71 +4364,92 @@
 
         self.sbLanguage = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbLanguage)
-        self.sbLanguage.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the"""
-            """ current editors language.</p>"""
-        ))
+        self.sbLanguage.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the"""
+                """ current editors language.</p>"""
+            )
+        )
 
         self.sbEncoding = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbEncoding)
-        self.sbEncoding.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the"""
-            """ current editors encoding.</p>"""
-        ))
+        self.sbEncoding.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the"""
+                """ current editors encoding.</p>"""
+            )
+        )
 
         self.sbEol = EricClickableLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbEol)
-        self.sbEol.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the"""
-            """ current editors eol setting.</p>"""
-        ))
+        self.sbEol.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the"""
+                """ current editors eol setting.</p>"""
+            )
+        )
 
         self.sbWritable = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbWritable)
-        self.sbWritable.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays an indication of the"""
-            """ current editors files writability.</p>"""
-        ))
+        self.sbWritable.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays an indication of the"""
+                """ current editors files writability.</p>"""
+            )
+        )
 
         self.sbLine = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbLine)
-        self.sbLine.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the line number of"""
-            """ the current editor.</p>"""
-        ))
+        self.sbLine.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the line number of"""
+                """ the current editor.</p>"""
+            )
+        )
 
         self.sbPos = QLabel(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbPos)
-        self.sbPos.setWhatsThis(self.tr(
-            """<p>This part of the status bar displays the cursor position"""
-            """ of the current editor.</p>"""
-        ))
-        
+        self.sbPos.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar displays the cursor position"""
+                """ of the current editor.</p>"""
+            )
+        )
+
         self.sbZoom = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
             UI.PixmapCache.getPixmap("zoomReset"),
-            self.__statusBar)
+            self.__statusBar,
+        )
         self.__statusBar.addPermanentWidget(self.sbZoom)
-        self.sbZoom.setWhatsThis(self.tr(
-            """<p>This part of the status bar allows zooming the current"""
-            """ editor or shell.</p>"""
-        ))
-        
+        self.sbZoom.setWhatsThis(
+            self.tr(
+                """<p>This part of the status bar allows zooming the current"""
+                """ editor or shell.</p>"""
+            )
+        )
+
         self.viewmanager.setSbInfo(
-            self.sbLine, self.sbPos, self.sbWritable, self.sbEncoding,
-            self.sbLanguage, self.sbEol, self.sbZoom)
+            self.sbLine,
+            self.sbPos,
+            self.sbWritable,
+            self.sbEncoding,
+            self.sbLanguage,
+            self.sbEol,
+            self.sbZoom,
+        )
 
         from VCS.StatusMonitorLed import StatusMonitorLedWidget
-        self.sbVcsMonitorLed = StatusMonitorLedWidget(
-            self.project, self.__statusBar)
+
+        self.sbVcsMonitorLed = StatusMonitorLedWidget(self.project, self.__statusBar)
         self.__statusBar.addPermanentWidget(self.sbVcsMonitorLed)
-        
+
         self.networkIcon = EricNetworkIcon(self.__statusBar)
         self.__statusBar.addPermanentWidget(self.networkIcon)
         self.networkIcon.onlineStateChanged.connect(self.onlineStateChanged)
         self.networkIcon.onlineStateChanged.connect(self.__onlineStateChanged)
-    
+
     def __initExternalToolsActions(self):
         """
         Private slot to create actions for the configured external tools.
@@ -3865,17 +4458,18 @@
         for toolGroup in self.toolGroups:
             category = self.tr("External Tools/{0}").format(toolGroup[0])
             for tool in toolGroup[1]:
-                if tool['menutext'] != '--':
-                    act = QAction(UI.PixmapCache.getIcon(tool['icon']),
-                                  tool['menutext'], self)
-                    act.setObjectName("{0}@@{1}".format(toolGroup[0],
-                                      tool['menutext']))
+                if tool["menutext"] != "--":
+                    act = QAction(
+                        UI.PixmapCache.getIcon(tool["icon"]), tool["menutext"], self
+                    )
+                    act.setObjectName("{0}@@{1}".format(toolGroup[0], tool["menutext"]))
                     act.triggered.connect(
-                        functools.partial(self.__toolActionTriggered, act))
+                        functools.partial(self.__toolActionTriggered, act)
+                    )
                     self.toolGroupActions[act.objectName()] = act
-                    
+
                     self.toolbarManager.addAction(act, category)
-    
+
     def __updateExternalToolsActions(self):
         """
         Private method to update the external tools actions for the current
@@ -3888,79 +4482,80 @@
         for key in self.toolGroupActions:
             if key.startswith(groupkey):
                 groupActionKeys.append(key)
-        
+
         # step 2: build keys for all actions i.a.w. current configuration
         ckeys = []
         for tool in toolGroup[1]:
-            if tool['menutext'] != '--':
-                ckeys.append("{0}@@{1}".format(toolGroup[0], tool['menutext']))
-        
+            if tool["menutext"] != "--":
+                ckeys.append("{0}@@{1}".format(toolGroup[0], tool["menutext"]))
+
         # step 3: remove all actions not configured any more
         for key in groupActionKeys:
             if key not in ckeys:
                 self.toolbarManager.removeAction(self.toolGroupActions[key])
                 self.toolGroupActions[key].triggered.disconnect()
                 del self.toolGroupActions[key]
-        
+
         # step 4: add all newly configured tools
         category = self.tr("External Tools/{0}").format(toolGroup[0])
         for tool in toolGroup[1]:
-            if tool['menutext'] != '--':
-                key = "{0}@@{1}".format(toolGroup[0], tool['menutext'])
+            if tool["menutext"] != "--":
+                key = "{0}@@{1}".format(toolGroup[0], tool["menutext"])
                 if key not in groupActionKeys:
-                    act = QAction(UI.PixmapCache.getIcon(tool['icon']),
-                                  tool['menutext'], self)
+                    act = QAction(
+                        UI.PixmapCache.getIcon(tool["icon"]), tool["menutext"], self
+                    )
                     act.setObjectName(key)
                     act.triggered.connect(
-                        functools.partial(self.__toolActionTriggered, act))
+                        functools.partial(self.__toolActionTriggered, act)
+                    )
                     self.toolGroupActions[key] = act
-                    
+
                     self.toolbarManager.addAction(act, category)
-    
+
     def __showFileMenu(self):
         """
         Private slot to display the File menu.
         """
         self.showMenu.emit("File", self.__menus["file"])
-    
+
     def __showExtrasMenu(self):
         """
         Private slot to display the Extras menu.
         """
         self.showMenu.emit("Extras", self.__menus["extras"])
-    
+
     def __showWizardsMenu(self):
         """
         Private slot to display the Wizards menu.
         """
         self.showMenu.emit("Wizards", self.__menus["wizards"])
-    
+
     def __showHelpMenu(self):
         """
         Private slot to display the Help menu.
         """
         self.showErrorLogAct.setEnabled(self.__hasErrorLog())
-        
+
         infoFileName = Globals.getInstallInfoFilePath()
         self.showInstallInfoAct.setEnabled(os.path.exists(infoFileName))
-        
+
         self.showMenu.emit("Help", self.__menus["help"])
-    
+
     def __showSettingsMenu(self):
         """
         Private slot to show the Settings menu.
         """
-        self.editMessageFilterAct.setEnabled(
-            EricErrorMessage.messageHandlerInstalled())
-        
+        self.editMessageFilterAct.setEnabled(EricErrorMessage.messageHandlerInstalled())
+
         self.showMenu.emit("Settings", self.__menus["settings"])
-    
+
     def __showNext(self):
         """
         Private slot used to show the next tab or file.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'nextTab'):
+        while fwidget and not hasattr(fwidget, "nextTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.nextTab()
@@ -3970,34 +4565,34 @@
         Private slot used to show the previous tab or file.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'prevTab'):
+        while fwidget and not hasattr(fwidget, "prevTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.prevTab()
-    
+
     def __switchTab(self):
         """
         Private slot used to switch between the current and the previous
         current tab.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'switchTab'):
+        while fwidget and not hasattr(fwidget, "switchTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.switchTab()
-    
+
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-        
+
     def __showVersions(self):
         """
         Private slot to handle the Versions dialog.
         """
         from .VersionsDialog import VersionsDialog
-        
+
         try:
             try:
                 from PyQt6 import sip
@@ -4006,96 +4601,100 @@
             sip_version_str = sip.SIP_VERSION_STR
         except (ImportError, AttributeError):
             sip_version_str = "sip version not available"
-        
+
         sizeStr = "64-Bit" if sys.maxsize > 2**32 else "32-Bit"
-        
-        versionText = self.tr(
-            """<h2>Version Numbers</h2>"""
-            """<table>""")
-        
+
+        versionText = self.tr("""<h2>Version Numbers</h2>""" """<table>""")
+
         # Python version
-        versionText += (
-            """<tr><td><b>Python</b></td><td>{0}, {1}</td></tr>"""
-        ).format(sys.version.split()[0], sizeStr)
-        
+        versionText += ("""<tr><td><b>Python</b></td><td>{0}, {1}</td></tr>""").format(
+            sys.version.split()[0], sizeStr
+        )
+
         # Qt version
-        versionText += (
-            """<tr><td><b>Qt</b></td><td>{0}</td></tr>"""
-        ).format(qVersion())
-        
+        versionText += ("""<tr><td><b>Qt</b></td><td>{0}</td></tr>""").format(
+            qVersion()
+        )
+
         # PyQt versions
-        versionText += (
-            """<tr><td><b>PyQt6</b></td><td>{0}</td></tr>"""
-        ).format(PYQT_VERSION_STR)
+        versionText += ("""<tr><td><b>PyQt6</b></td><td>{0}</td></tr>""").format(
+            PYQT_VERSION_STR
+        )
         with contextlib.suppress(ImportError, AttributeError):
             from PyQt6 import QtCharts
+
             versionText += (
                 """<tr><td><b>PyQt6-Charts</b></td><td>{0}</td></tr>"""
             ).format(QtCharts.PYQT_CHART_VERSION_STR)
         with contextlib.suppress(ImportError, AttributeError):
             from PyQt6 import QtWebEngineCore
+
             versionText += (
                 """<tr><td><b>PyQt6-WebEngine</b></td><td>{0}</td></tr>"""
             ).format(QtWebEngineCore.PYQT_WEBENGINE_VERSION_STR)
         versionText += (
             """<tr><td><b>PyQt6-QScintilla</b></td><td>{0}</td></tr>"""
         ).format(QSCINTILLA_VERSION_STR)
-        versionText += (
-            """<tr><td><b>sip</b></td><td>{0}</td></tr>"""
-        ).format(sip_version_str)
-        
+        versionText += ("""<tr><td><b>sip</b></td><td>{0}</td></tr>""").format(
+            sip_version_str
+        )
+
         # webengine (chromium) version
         with contextlib.suppress(ImportError):
             from WebBrowser.Tools import WebBrowserTools
-            chromiumVersion, chromiumSecurityVersion = (
-                WebBrowserTools.getWebEngineVersions()[0:2]
-            )
-            versionText += (
-                """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>"""
-                .format(chromiumVersion)
+
+            (
+                chromiumVersion,
+                chromiumSecurityVersion,
+            ) = WebBrowserTools.getWebEngineVersions()[0:2]
+            versionText += """<tr><td><b>WebEngine</b></td><td>{0}</td></tr>""".format(
+                chromiumVersion
             )
             if chromiumSecurityVersion:
                 versionText += self.tr(
                     """<tr><td><b>WebEngine (Security)</b></td>"""
                     """<td>{0}</td></tr>"""
                 ).format(chromiumSecurityVersion)
-        
+
         # eric7 version
-        versionText += ("""<tr><td><b>{0}</b></td><td>{1}</td></tr>"""
-                        ).format(Program, Version)
-        
+        versionText += ("""<tr><td><b>{0}</b></td><td>{1}</td></tr>""").format(
+            Program, Version
+        )
+
         # desktop and session type
         desktop = Globals.desktopName()
         session = Globals.sessionType()
         if desktop or session:
             versionText += "<tr><td></td><td></td></tr>"
             if desktop:
-                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>"
-                                ).format(self.tr("Desktop"), desktop)
+                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format(
+                    self.tr("Desktop"), desktop
+                )
             if session:
-                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>"
-                                ).format(self.tr("Session Type"), session)
-        
+                versionText += ("<tr><td><b>{0}</b></td><td>{1}</td></tr>").format(
+                    self.tr("Session Type"), session
+                )
+
         versionText += self.tr("""</table>""")
-        
+
         VersionsDialog(self, Program, versionText)
-        
+
     def __reportBug(self):
         """
         Private slot to handle the Report Bug dialog.
         """
         self.showEmailDialog("bug")
-        
+
     def __requestFeature(self):
         """
         Private slot to handle the Feature Request dialog.
         """
         self.showEmailDialog("feature")
-        
+
     def showEmailDialog(self, mode, attachFile=None, deleteAttachFile=False):
         """
         Public slot to show the email dialog in a given mode.
-        
+
         @param mode mode of the email dialog (string, "bug" or "feature")
         @param attachFile name of a file to attach to the email (string)
         @param deleteAttachFile flag indicating to delete the attached file
@@ -4105,29 +4704,32 @@
             self.__showSystemEmailClient(mode, attachFile, deleteAttachFile)
         else:
             if not Preferences.getUser("UseGoogleMailOAuth2") and (
-                Preferences.getUser("Email") == "" or
-                    Preferences.getUser("MailServer") == ""):
+                Preferences.getUser("Email") == ""
+                or Preferences.getUser("MailServer") == ""
+            ):
                 EricMessageBox.critical(
                     self,
                     self.tr("Report Bug"),
                     self.tr(
                         """Email address or mail server address is empty."""
                         """ Please configure your Email settings in the"""
-                        """ Preferences Dialog."""))
+                        """ Preferences Dialog."""
+                    ),
+                )
                 self.showPreferences("emailPage")
                 return
-                
+
             from .EmailDialog import EmailDialog
+
             self.dlg = EmailDialog(mode=mode)
             if attachFile is not None:
                 self.dlg.attachFile(attachFile, deleteAttachFile)
             self.dlg.show()
-        
-    def __showSystemEmailClient(self, mode, attachFile=None,
-                                deleteAttachFile=False):
+
+    def __showSystemEmailClient(self, mode, attachFile=None, deleteAttachFile=False):
         """
         Private slot to show the system email dialog.
-        
+
         @param mode mode of the email dialog (string, "bug" or "feature")
         @param attachFile name of a file to put into the body of the
             email (string)
@@ -4145,59 +4747,60 @@
             body = "\r\n----\r\n{0}\r\n----\r\n{1}\r\n----\r\n{2}".format(
                 Utilities.generateVersionInfo("\r\n"),
                 Utilities.generatePluginsVersionInfo("\r\n"),
-                Utilities.generateDistroInfo("\r\n"))
-        
+                Utilities.generateDistroInfo("\r\n"),
+            )
+
         url = QUrl("mailto:{0}".format(address))
         urlQuery = QUrlQuery(url)
         urlQuery.addQueryItem("subject", subject)
         urlQuery.addQueryItem("body", body)
         url.setQuery(urlQuery)
         QDesktopServices.openUrl(url)
-        
+
     def checkForErrorLog(self):
         """
         Public method to check for the presence of an error log and ask the
         user, what to do with it.
         """
         if Preferences.getUI("CheckErrorLog"):
-            logFile = os.path.join(Utilities.getConfigDir(),
-                                   self.ErrorLogFileName)
+            logFile = os.path.join(Utilities.getConfigDir(), self.ErrorLogFileName)
             if os.path.exists(logFile):
                 from .ErrorLogDialog import ErrorLogDialog
+
                 dlg = ErrorLogDialog(logFile, False, self)
                 dlg.exec()
-        
+
     def __hasErrorLog(self):
         """
         Private method to check, if an error log file exists.
-        
+
         @return flag indicating the existence of an error log file (boolean)
         """
-        logFile = os.path.join(Utilities.getConfigDir(),
-                               self.ErrorLogFileName)
+        logFile = os.path.join(Utilities.getConfigDir(), self.ErrorLogFileName)
         return os.path.exists(logFile)
-        
+
     def __showErrorLog(self):
         """
         Private slot to show the most recent error log message.
         """
-        logFile = os.path.join(Utilities.getConfigDir(),
-                               self.ErrorLogFileName)
+        logFile = os.path.join(Utilities.getConfigDir(), self.ErrorLogFileName)
         if os.path.exists(logFile):
             from .ErrorLogDialog import ErrorLogDialog
+
             dlg = ErrorLogDialog(logFile, True, self)
             dlg.show()
-    
+
     def __showInstallInfo(self):
         """
         Private slot to show a dialog containing information about the
         installation process.
         """
         from .InstallInfoDialog import InstallInfoDialog
+
         dlg = InstallInfoDialog(self)
         if dlg.wasLoaded():
             dlg.exec()
-    
+
     def __compareFiles(self):
         """
         Private slot to handle the Compare Files dialog.
@@ -4206,9 +4809,10 @@
         fn = aw and aw.getFileName() or None
         if self.diffDlg is None:
             from .DiffDialog import DiffDialog
+
             self.diffDlg = DiffDialog()
         self.diffDlg.show(fn)
-        
+
     def __compareFilesSbs(self):
         """
         Private slot to handle the Compare Files dialog.
@@ -4217,64 +4821,66 @@
         fn = aw and aw.getFileName() or None
         if self.compareDlg is None:
             from .CompareDialog import CompareDialog
+
             self.compareDlg = CompareDialog()
         self.compareDlg.show(fn)
-        
+
     def __openMiniEditor(self):
         """
         Private slot to show a mini editor window.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         editor = MiniEditor(parent=self)
         editor.show()
-        
+
     def addEricActions(self, actions, actionType):
         """
         Public method to add actions to the list of actions.
-        
+
         @param actions list of actions to be added (list of EricAction)
         @param actionType string denoting the action set to add to.
             It must be one of "ui" or "wizards".
         """
-        if actionType == 'ui':
+        if actionType == "ui":
             self.actions.extend(actions)
-        elif actionType == 'wizards':
+        elif actionType == "wizards":
             self.wizardsActions.extend(actions)
-        
-    def removeEricActions(self, actions, actionType='ui'):
+
+    def removeEricActions(self, actions, actionType="ui"):
         """
         Public method to remove actions from the list of actions.
-        
+
         @param actions list of actions (list of EricAction)
         @param actionType string denoting the action set to remove from.
             It must be one of "ui" or "wizards".
         """
         for act in actions:
             with contextlib.suppress(ValueError):
-                if actionType == 'ui':
+                if actionType == "ui":
                     self.actions.remove(act)
-                elif actionType == 'wizards':
+                elif actionType == "wizards":
                     self.wizardsActions.remove(act)
-        
+
     def getActions(self, actionType):
         """
         Public method to get a list of all actions.
-        
+
         @param actionType string denoting the action set to get.
             It must be one of "ui" or "wizards".
         @return list of all actions (list of EricAction)
         """
-        if actionType == 'ui':
+        if actionType == "ui":
             return self.actions[:]
-        elif actionType == 'wizards':
+        elif actionType == "wizards":
             return self.wizardsActions[:]
         else:
             return []
-        
+
     def getMenuAction(self, menuName, actionName):
         """
         Public method to get a reference to an action of a menu.
-        
+
         @param menuName name of the menu to search in (string)
         @param actionName object name of the action to search for
             (string)
@@ -4284,17 +4890,17 @@
             menu = self.__menus[menuName]
         except KeyError:
             return None
-        
+
         for act in menu.actions():
             if act.objectName() == actionName:
                 return act
-        
+
         return None
-        
+
     def getMenuBarAction(self, menuName):
         """
         Public method to get a reference to an action of the main menu.
-        
+
         @param menuName name of the menu to search in (string)
         @return reference to the menu bar action (QAction)
         """
@@ -4302,13 +4908,13 @@
             menu = self.__menus[menuName]
         except KeyError:
             return None
-        
+
         return menu.menuAction()
-        
+
     def getMenu(self, name):
         """
         Public method to get a reference to a specific menu.
-        
+
         @param name name of the menu (string)
         @return reference to the menu (QMenu)
         """
@@ -4316,14 +4922,14 @@
             return self.__menus[name]
         except KeyError:
             return None
-        
+
     def registerToolbar(self, name, text, toolbar, category=""):
         """
         Public method to register a toolbar.
-        
+
         This method must be called in order to make a toolbar manageable by the
         UserInterface object.
-        
+
         @param name name of the toolbar. This is used as the key into
             the dictionary of toolbar references.
         @type str
@@ -4338,13 +4944,13 @@
         """
         if name in self.__toolbars:
             raise KeyError("Toolbar '{0}' already registered.".format(name))
-        
+
         self.__toolbars[name] = [text, toolbar, category]
-        
+
     def reregisterToolbar(self, name, text, category=""):
         """
         Public method to change the visible text for the named toolbar.
-        
+
         @param name name of the toolbar to be changed
         @type str
         @param text new user visible text for the toolbar entry
@@ -4355,20 +4961,20 @@
         if name in self.__toolbars:
             self.__toolbars[name][0] = text
             self.__toolbars[name][2] = category
-        
+
     def unregisterToolbar(self, name):
         """
         Public method to unregister a toolbar.
-        
+
         @param name name of the toolbar (string).
         """
         if name in self.__toolbars:
             del self.__toolbars[name]
-        
+
     def getToolbar(self, name):
         """
         Public method to get a reference to a specific toolbar.
-        
+
         @param name name of the toolbar (string)
         @return reference to the toolbar entry (tuple of string and QToolBar)
         """
@@ -4376,12 +4982,12 @@
             return self.__toolbars[name]
         except KeyError:
             return None
-    
+
     def getToolbarsByCategory(self, category):
         """
         Public method to get a list of toolbars belonging to a given toolbar
         category.
-        
+
         @param category toolbar category
         @type str
         @return list of toolbars
@@ -4392,29 +4998,29 @@
             with contextlib.suppress(IndexError):
                 if self.__toolbars[tbName][2] == category:
                     toolbars.append(self.__toolbars[tbName][1])
-        
+
         return toolbars
-    
+
     def getLocale(self):
         """
         Public method to get the locale of the IDE.
-        
+
         @return locale of the IDE (string or None)
         """
         return self.locale
-        
+
     def __quit(self):
         """
         Private method to quit the application.
         """
         if self.__shutdown():
             ericApp().closeAllWindows()
-    
+
     @pyqtSlot()
     def __restart(self, ask=False):
         """
         Private method to restart the application.
-        
+
         @param ask flag indicating to ask the user for permission
         @type bool
         """
@@ -4422,98 +5028,104 @@
             EricMessageBox.yesNo(
                 self,
                 self.tr("Restart application"),
-                self.tr(
-                    """The application needs to be restarted. Do it now?"""),
-                yesDefault=True)
-            if ask else
-            True
-        )
-        
+                self.tr("""The application needs to be restarted. Do it now?"""),
+                yesDefault=True,
+            )
+            if ask
+            else True
+        )
+
         if res and self.__shutdown():
             ericApp().closeAllWindows()
             program = Globals.getPythonExecutable()
             args = ["-m", "eric7", "--start-session"]
             args.extend(self.__restartArgs)
             QProcess.startDetached(program, args)
-    
+
     @pyqtSlot()
     def upgradePyQt(self):
         """
         Public slot to upgrade the PyQt packages of the eric7 environment.
-        
+
         @return flag indicating a successful upgrade
         @rtype bool
         """
         yes = EricMessageBox.yesNo(
             None,
             self.tr("Upgrade PyQt"),
-            self.tr("""eric needs to be closed in order to upgrade PyQt. It"""
-                    """ will be restarted once the upgrade process has"""
-                    """ finished. This may take some time.\n\nShall the"""
-                    """ upgrade be done now?""")
-        )
-        
+            self.tr(
+                """eric needs to be closed in order to upgrade PyQt. It"""
+                """ will be restarted once the upgrade process has"""
+                """ finished. This may take some time.\n\nShall the"""
+                """ upgrade be done now?"""
+            ),
+        )
+
         if yes and self.__shutdown():
             self.__performUpgrade("pyqt")
             return True
-        
+
         return False
-    
+
     @pyqtSlot()
     def upgradeEric(self):
         """
         Public slot to upgrade the eric-ide package of the eric7 environment.
-        
+
         @return flag indicating a successful upgrade
         @rtype bool
         """
         yes = EricMessageBox.yesNo(
             None,
             self.tr("Upgrade Eric"),
-            self.tr("""eric needs to be closed in order to be upgraded. It"""
-                    """ will be restarted once the upgrade process has"""
-                    """ finished. This may take some time.\n\nShall the"""
-                    """ upgrade be done now?""")
-        )
-        
+            self.tr(
+                """eric needs to be closed in order to be upgraded. It"""
+                """ will be restarted once the upgrade process has"""
+                """ finished. This may take some time.\n\nShall the"""
+                """ upgrade be done now?"""
+            ),
+        )
+
         if yes and self.__shutdown():
             self.__performUpgrade("eric")
             return True
-        
+
         return False
-    
+
     @pyqtSlot()
     def upgradeEricPyQt(self):
         """
         Public slot to upgrade the eric-ide and Pyqt packages of the eric7
         environment.
-        
+
         @return flag indicating a successful upgrade
         @rtype bool
         """
         yes = EricMessageBox.yesNo(
             None,
             self.tr("Upgrade Eric"),
-            self.tr("""eric needs to be closed in order to upgrade eric and"""
-                    """ PyQt. It will be restarted once the upgrade process"""
-                    """ has finished. This may take some time.\n\n Shall"""
-                    """ the upgrade be done now?""")
-        )
-        
+            self.tr(
+                """eric needs to be closed in order to upgrade eric and"""
+                """ PyQt. It will be restarted once the upgrade process"""
+                """ has finished. This may take some time.\n\n Shall"""
+                """ the upgrade be done now?"""
+            ),
+        )
+
         if yes and self.__shutdown():
             self.__performUpgrade("ericpyqt")
             return True
-        
+
         return False
-    
+
     def __performUpgrade(self, upgradeType):
         """
         Private method to perform the requested upgrade operation.
-        
+
         This action needs to shut down eric first, start a non-PyQt application
         performing the upgrade of the PyQt packages via pip and restart eric
         with the passed arguments. The upgrade process is not visible.
-        
+
         @param upgradeType upgrade operation (one of 'eric', 'ericpyqt',
             'pyqt')
         @type str
@@ -4522,18 +5134,16 @@
         program = Globals.getPythonExecutable()
         ericStartArgs = ["-m", "eric7", "--start-session"]
         ericStartArgs.extend(self.__restartArgs)
-        
-        upgrader = os.path.join(
-            os.path.dirname(__file__), "upgrader.py"
-        )
+
+        upgrader = os.path.join(os.path.dirname(__file__), "upgrader.py")
         upgraderArgs = [
             upgrader,
             "--type={0}".format(upgradeType),
             "--delay={0}".format(Preferences.getUI("UpgraderDelay")),
-            "--"
+            "--",
         ] + ericStartArgs
         QProcess.startDetached(program, upgraderArgs)
-    
+
     def __newWindow(self):
         """
         Private slot to start a new instance of eric.
@@ -4544,11 +5154,11 @@
             eric7 = os.path.join(getConfig("ericDir"), "eric7.py")
             args = [eric7]
             QProcess.startDetached(program, args)
-        
+
     def __initToolsMenus(self, menu):
         """
         Private slot to initialize the various tool menus.
-        
+
         @param menu reference to the parent menu
         @type QMenu
         """
@@ -4568,70 +5178,69 @@
         btMenu.addAction(self.snapshotAct)
         if self.webBrowserAct:
             btMenu.addAction(self.webBrowserAct)
-        
+
         ptMenu = QMenu(self.tr("&Plugin Tools"), self)
         ptMenu.aboutToShow.connect(self.__showPluginToolsMenu)
-        
+
         utMenu = QMenu(self.tr("&User Tools"), self)
         utMenu.triggered.connect(self.__toolExecute)
         utMenu.aboutToShow.connect(self.__showUserToolsMenu)
-        
+
         menu.addMenu(btMenu)
         menu.addMenu(ptMenu)
         menu.addMenu(utMenu)
-        
+
         self.__menus["builtin_tools"] = btMenu
         self.__menus["plugin_tools"] = ptMenu
         self.__menus["user_tools"] = utMenu
-        
+
     def __showPluginToolsMenu(self):
         """
         Private slot to show the Plugin Tools menu.
         """
         self.showMenu.emit("PluginTools", self.__menus["plugin_tools"])
-        
+
     def __showUserToolsMenu(self):
         """
         Private slot to display the User Tools menu.
         """
         self.__menus["user_tools"].clear()
-        
+
         self.__menus["user_tools"].addMenu(self.toolGroupsMenu)
         act = self.__menus["user_tools"].addAction(
-            self.tr("Configure Tool Groups ..."),
-            self.__toolGroupsConfiguration)
+            self.tr("Configure Tool Groups ..."), self.__toolGroupsConfiguration
+        )
         act.setData(-1)
         act = self.__menus["user_tools"].addAction(
-            self.tr("Configure current Tool Group ..."),
-            self.__toolsConfiguration)
+            self.tr("Configure current Tool Group ..."), self.__toolsConfiguration
+        )
         act.setData(-2)
         act.setEnabled(self.currentToolGroup >= 0)
         self.__menus["user_tools"].addSeparator()
-        
+
         # add the configurable entries
         try:
-            for idx, tool in enumerate(
-                self.toolGroups[self.currentToolGroup][1]
-            ):
-                if tool['menutext'] == '--':
+            for idx, tool in enumerate(self.toolGroups[self.currentToolGroup][1]):
+                if tool["menutext"] == "--":
                     self.__menus["user_tools"].addSeparator()
                 else:
                     act = self.__menus["user_tools"].addAction(
-                        UI.PixmapCache.getIcon(tool['icon']),
-                        tool['menutext'])
+                        UI.PixmapCache.getIcon(tool["icon"]), tool["menutext"]
+                    )
                     act.setData(idx)
         except IndexError:
             # the current tool group might have been deleted
             act = self.__menus["user_tools"].addAction(
-                self.tr("No User Tools Configured"))
+                self.tr("No User Tools Configured")
+            )
             act.setData(-3)
-        
+
     def __showToolGroupsMenu(self):
         """
         Private slot to display the Tool Groups menu.
         """
         self.toolGroupsMenu.clear()
-        
+
         # add the configurable tool groups
         if self.toolGroups:
             for idx, toolGroup in enumerate(self.toolGroups):
@@ -4642,30 +5251,29 @@
                     font.setBold(True)
                     act.setFont(font)
         else:
-            act = self.toolGroupsMenu.addAction(
-                self.tr("No User Tools Configured"))
+            act = self.toolGroupsMenu.addAction(self.tr("No User Tools Configured"))
             act.setData(-3)
-        
+
     def __toolGroupSelected(self, act):
         """
         Private slot to set the current tool group.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         self.toolGroupsMenuTriggered = True
         idx = act.data()
         if idx is not None:
             self.currentToolGroup = idx
-        
+
     def __showWindowMenu(self):
         """
         Private slot to display the Window menu.
         """
         self.__menus["window"].clear()
-        
+
         self.__menus["window"].addActions(self.viewProfileActGrp.actions())
         self.__menus["window"].addSeparator()
-        
+
         if self.__layoutType == "Toolboxes":
             self.__menus["window"].addAction(self.ltAct)
             self.ltAct.setChecked(not self.lToolboxDock.isHidden())
@@ -4681,34 +5289,34 @@
                 self.rsbAct.setChecked(not self.rightSidebar.isHidden())
             self.__menus["window"].addAction(self.bsbAct)
             self.bsbAct.setChecked(not self.bottomSidebar.isHidden())
-        
+
         # Insert menu entry for sub-windows
         self.__menus["window"].addSeparator()
         self.__menus["window"].addMenu(self.__menus["subwindow"])
-        
+
         # Insert menu entry for toolbar settings
         self.__menus["window"].addSeparator()
         self.__menus["window"].addMenu(self.__menus["toolbars"])
-        
+
         # Now do any Source Viewer related stuff.
         self.viewmanager.showWindowMenu(self.__menus["window"])
-        
+
         self.showMenu.emit("Window", self.__menus["window"])
-        
+
     def __showSubWindowMenu(self):
         """
         Private slot to display the Window menu of the Window menu.
         """
         self.showMenu.emit("Subwindows", self.__menus["subwindow"])
-        
+
     def __populateToolbarsMenu(self, menu):
         """
         Private method to populate a toolbars menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         for name, (text, tb, _category) in sorted(
             self.__toolbars.items(), key=lambda t: t[1][0]
         ):
@@ -4721,20 +5329,20 @@
         act.setData("__SHOW__")
         act = menu.addAction(self.tr("&Hide all"))
         act.setData("__HIDE__")
-        
+
     def createPopupMenu(self):
         """
         Public method to create the toolbars menu for Qt.
-        
+
         @return toolbars menu (QMenu)
         """
         menu = QMenu(self)
         menu.triggered.connect(self.__TBPopupMenuTriggered)
-        
+
         self.__populateToolbarsMenu(menu)
-        
+
         return menu
-        
+
     def __showToolbarsMenu(self):
         """
         Private slot to display the Toolbars menu.
@@ -4745,7 +5353,7 @@
         """
         Private method to handle the toggle of a toolbar via the Window->
         Toolbars submenu.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         name = act.data()
@@ -4772,7 +5380,7 @@
         """
         Private method to handle the toggle of a toolbar via the QMainWindow
         Toolbars popup menu.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         name = act.data()
@@ -4792,11 +5400,11 @@
                     tb.hide()
             if self.__menus["toolbars"].isTearOffMenuVisible():
                 self.__menus["toolbars"].hideTearOffMenu()
-        
+
     def __saveCurrentViewProfile(self, save):
         """
         Private slot to save the window geometries of the active profile.
-        
+
         @param save flag indicating that the current profile should
             be saved (boolean)
         """
@@ -4810,7 +5418,7 @@
                     self.profiles[self.currentProfile][2][0] = state
                     state = self.verticalSplitter.saveState()
                     self.profiles[self.currentProfile][2][1] = state
-                    
+
                     state = self.leftSidebar.saveState()
                     self.profiles[self.currentProfile][2][2] = state
                     state = self.bottomSidebar.saveState()
@@ -4818,35 +5426,27 @@
                     if self.rightSidebar:
                         state = self.rightSidebar.saveState()
                         self.profiles[self.currentProfile][2][4] = state
-            
+
             # step 2: save the visibility of the windows of the active profile
             if self.__layoutType == "Toolboxes":
-                self.profiles[self.currentProfile][1][0] = (
-                    self.lToolboxDock.isVisible()
-                )
-                self.profiles[self.currentProfile][1][1] = (
-                    self.hToolboxDock.isVisible()
-                )
-                self.profiles[self.currentProfile][1][2] = (
-                    self.rToolboxDock.isVisible()
-                )
+                self.profiles[self.currentProfile][1][0] = self.lToolboxDock.isVisible()
+                self.profiles[self.currentProfile][1][1] = self.hToolboxDock.isVisible()
+                self.profiles[self.currentProfile][1][2] = self.rToolboxDock.isVisible()
             elif self.__layoutType == "Sidebars":
-                self.profiles[self.currentProfile][1][0] = (
-                    self.leftSidebar.isVisible()
-                )
-                self.profiles[self.currentProfile][1][1] = (
-                    self.bottomSidebar.isVisible()
-                )
+                self.profiles[self.currentProfile][1][0] = self.leftSidebar.isVisible()
+                self.profiles[self.currentProfile][1][
+                    1
+                ] = self.bottomSidebar.isVisible()
                 if self.rightSidebar:
-                    self.profiles[self.currentProfile][1][2] = (
-                        self.rightSidebar.isVisible()
-                    )
+                    self.profiles[self.currentProfile][1][
+                        2
+                    ] = self.rightSidebar.isVisible()
             Preferences.setUI("ViewProfiles", self.profiles)
-    
+
     def __activateViewProfile(self, name, save=True):
         """
         Private slot to activate a view profile.
-        
+
         @param name name of the profile to be activated (string)
         @param save flag indicating that the current profile should
             be saved (boolean)
@@ -4854,7 +5454,7 @@
         if self.currentProfile != name or not save:
             # step 1: save the active profile
             self.__saveCurrentViewProfile(save)
-            
+
             # step 2: set the window geometries of the new profile
             if self.__layoutType in ["Toolboxes", "Sidebars"]:
                 state = self.profiles[name][0]
@@ -4867,7 +5467,7 @@
                     state = self.profiles[name][2][1]
                     if not state.isEmpty():
                         self.verticalSplitter.restoreState(state)
-                    
+
                     state = self.profiles[name][2][2]
                     if state:
                         self.leftSidebar.restoreState(state)
@@ -4878,18 +5478,23 @@
                         state = self.profiles[name][2][4]
                         if state:
                             self.rightSidebar.restoreState(state)
-                
+
                 if self.__layoutType == "Toolboxes":
                     # set the corner usages
-                    self.setCorner(Qt.Corner.TopLeftCorner,
-                                   Qt.DockWidgetArea.LeftDockWidgetArea)
-                    self.setCorner(Qt.Corner.BottomLeftCorner,
-                                   Qt.DockWidgetArea.LeftDockWidgetArea)
-                    self.setCorner(Qt.Corner.TopRightCorner,
-                                   Qt.DockWidgetArea.RightDockWidgetArea)
-                    self.setCorner(Qt.Corner.BottomRightCorner,
-                                   Qt.DockWidgetArea.RightDockWidgetArea)
-            
+                    self.setCorner(
+                        Qt.Corner.TopLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea
+                    )
+                    self.setCorner(
+                        Qt.Corner.BottomLeftCorner, Qt.DockWidgetArea.LeftDockWidgetArea
+                    )
+                    self.setCorner(
+                        Qt.Corner.TopRightCorner, Qt.DockWidgetArea.RightDockWidgetArea
+                    )
+                    self.setCorner(
+                        Qt.Corner.BottomRightCorner,
+                        Qt.DockWidgetArea.RightDockWidgetArea,
+                    )
+
             # step 3: activate the windows of the new profile
             if self.__layoutType == "Toolboxes":
                 self.lToolboxDock.setVisible(self.profiles[name][1][0])
@@ -4900,20 +5505,20 @@
                 self.bottomSidebar.setVisible(self.profiles[name][1][1])
                 if self.rightSidebar:
                     self.rightSidebar.setVisible(self.profiles[name][1][2])
-            
+
             # step 4: remember the new profile
             self.currentProfile = name
-            
+
             # step 5: make sure that cursor of the shell is visible
             self.shell.ensureCursorVisible()
-            
+
             # step 6: make sure, that the toolbars and window menu are
             #         shown correctly
             if self.__menus["toolbars"].isTearOffMenuVisible():
                 self.__showToolbarsMenu()
             if self.__menus["window"].isTearOffMenuVisible():
                 self.__showWindowMenu()
-        
+
     def __debuggingStarted(self):
         """
         Private slot to handle the start of a debugging session.
@@ -4933,7 +5538,7 @@
                 self.leftSidebar.setCurrentWidget(self.debugViewer)
             self.__currentBottomWidget = self.bottomSidebar.currentWidget()
             self.bottomSidebar.setCurrentWidget(self.shellAssembly)
-        
+
     def __debuggingDone(self):
         """
         Private slot to handle the end of a debugging session.
@@ -4947,33 +5552,31 @@
         elif self.__layoutType == "Sidebars":
             if self.__currentRightWidget:
                 if self.rightSidebar:
-                    self.rightSidebar.setCurrentWidget(
-                        self.__currentRightWidget)
+                    self.rightSidebar.setCurrentWidget(self.__currentRightWidget)
                 else:
-                    self.leftSidebar.setCurrentWidget(
-                        self.__currentRightWidget)
+                    self.leftSidebar.setCurrentWidget(self.__currentRightWidget)
             if self.__currentBottomWidget:
                 self.bottomSidebar.setCurrentWidget(self.__currentBottomWidget)
         self.__currentRightWidget = None
         self.__currentBottomWidget = None
         self.__activateViewmanager()
-        
+
     @pyqtSlot()
     def __setEditProfile(self, save=True):
         """
         Private slot to activate the edit view profile.
-        
+
         @param save flag indicating that the current profile should
             be saved (boolean)
         """
         self.__activateViewProfile("edit", save)
         self.setEditProfileAct.setChecked(True)
-        
+
     @pyqtSlot()
     def setDebugProfile(self, save=True):
         """
         Public slot to activate the debug view profile.
-        
+
         @param save flag indicating that the current profile should
             be saved (boolean)
         """
@@ -4981,40 +5584,40 @@
         self.viewmanager.replaceWidget().hide()
         self.__activateViewProfile("debug", save)
         self.setDebugProfileAct.setChecked(True)
-        
+
     def getViewProfile(self):
         """
         Public method to get the current view profile.
-        
+
         @return the name of the current view profile (string)
         """
         return self.currentProfile
-    
+
     def getLayoutType(self):
         """
         Public method to get the current layout type.
-        
+
         @return current layout type
         @rtype str
         """
         return self.__layoutType
-    
+
     def __activateLeftRightSidebarWidget(self, widget):
         """
         Private method to activate the given widget in the left or right
         sidebar.
-        
+
         @param widget reference to the widget to be activated
         @type QWidget
         """
         sidebar = (
             self.leftSidebar
-            if Preferences.getUI("CombinedLeftRightSidebar") else
-            self.rightSidebar
+            if Preferences.getUI("CombinedLeftRightSidebar")
+            else self.rightSidebar
         )
         sidebar.show()
         sidebar.setCurrentWidget(widget)
-    
+
     def __activateProjectBrowser(self):
         """
         Private slot to handle the activation of the project browser.
@@ -5026,8 +5629,9 @@
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.projectBrowser)
         self.projectBrowser.currentWidget().setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-        
+            Qt.FocusReason.ActiveWindowFocusReason
+        )
+
     def __activateMultiProjectBrowser(self):
         """
         Private slot to handle the activation of the project browser.
@@ -5038,9 +5642,8 @@
         elif self.__layoutType == "Sidebars":
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.multiProjectBrowser)
-        self.multiProjectBrowser.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-        
+        self.multiProjectBrowser.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
     def activateDebugViewer(self):
         """
         Public slot to handle the activation of the debug viewer.
@@ -5051,8 +5654,9 @@
         elif self.__layoutType == "Sidebars":
             self.__activateLeftRightSidebarWidget(self.debugViewer)
         self.debugViewer.currentWidget().setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-        
+            Qt.FocusReason.ActiveWindowFocusReason
+        )
+
     def __activateShell(self):
         """
         Private slot to handle the activation of the Shell window.
@@ -5064,7 +5668,7 @@
             self.__shellParent.show()
             self.__shellParent.setCurrentWidget(self.shellAssembly)
         self.shell.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateLogViewer(self):
         """
         Private slot to handle the activation of the Log Viewer.
@@ -5076,7 +5680,7 @@
             self.bottomSidebar.show()
             self.bottomSidebar.setCurrentWidget(self.logViewer)
         self.logViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateTaskViewer(self):
         """
         Private slot to handle the activation of the Task Viewer.
@@ -5088,7 +5692,7 @@
             self.bottomSidebar.show()
             self.bottomSidebar.setCurrentWidget(self.taskViewer)
         self.taskViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateTemplateViewer(self):
         """
         Private slot to handle the activation of the Template Viewer.
@@ -5100,9 +5704,8 @@
             elif self.__layoutType == "Sidebars":
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.templateViewer)
-            self.templateViewer.setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
-        
+            self.templateViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
     def __activateBrowser(self):
         """
         Private slot to handle the activation of the file browser.
@@ -5115,7 +5718,7 @@
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.browser)
             self.browser.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __toggleLeftToolbox(self):
         """
         Private slot to handle the toggle of the Left Toolbox window.
@@ -5124,11 +5727,12 @@
         shown = self.__toggleWindow(self.lToolboxDock)
         if shown:
             self.lToolbox.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def __toggleRightToolbox(self):
         """
         Private slot to handle the toggle of the Right Toolbox window.
@@ -5137,11 +5741,12 @@
         shown = self.__toggleWindow(self.rToolboxDock)
         if shown:
             self.rToolbox.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def __toggleHorizontalToolbox(self):
         """
         Private slot to handle the toggle of the Horizontal Toolbox window.
@@ -5150,11 +5755,12 @@
         shown = self.__toggleWindow(self.hToolboxDock)
         if shown:
             self.hToolbox.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def __toggleLeftSidebar(self):
         """
         Private slot to handle the toggle of the left sidebar window.
@@ -5163,11 +5769,12 @@
         shown = self.__toggleWindow(self.leftSidebar)
         if shown:
             self.leftSidebar.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def __toggleRightSidebar(self):
         """
         Private slot to handle the toggle of the right sidebar window.
@@ -5176,11 +5783,12 @@
         shown = self.__toggleWindow(self.rightSidebar)
         if shown:
             self.rightSidebar.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def __toggleBottomSidebar(self):
         """
         Private slot to handle the toggle of the bottom sidebar window.
@@ -5189,11 +5797,12 @@
         shown = self.__toggleWindow(self.bottomSidebar)
         if shown:
             self.bottomSidebar.currentWidget().setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
+                Qt.FocusReason.ActiveWindowFocusReason
+            )
         else:
             if hasFocus:
                 self.__activateViewmanager()
-        
+
     def activateCooperationViewer(self):
         """
         Public slot to handle the activation of the cooperation window.
@@ -5205,7 +5814,7 @@
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.cooperation)
             self.cooperation.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateIRC(self):
         """
         Private slot to handle the activation of the IRC window.
@@ -5217,7 +5826,7 @@
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.irc)
             self.irc.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateSymbolsViewer(self):
         """
         Private slot to handle the activation of the Symbols Viewer.
@@ -5230,7 +5839,7 @@
                 self.leftSidebar.show()
                 self.leftSidebar.setCurrentWidget(self.symbolsViewer)
             self.symbolsViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateNumbersViewer(self):
         """
         Private slot to handle the activation of the Numbers Viewer.
@@ -5243,7 +5852,7 @@
                 self.bottomSidebar.show()
                 self.bottomSidebar.setCurrentWidget(self.numbersViewer)
             self.numbersViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-        
+
     def __activateViewmanager(self):
         """
         Private slot to handle the activation of the current editor.
@@ -5251,11 +5860,11 @@
         aw = self.viewmanager.activeWindow()
         if aw is not None:
             aw.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-    
+
     def activateCodeDocumentationViewer(self, switchFocus=True):
         """
         Public slot to handle the activation of the Code Documentation Viewer.
-        
+
         @param switchFocus flag indicating to transfer the input focus
         @type bool
         """
@@ -5264,12 +5873,12 @@
                 self.rToolboxDock.show()
                 self.rToolbox.setCurrentWidget(self.codeDocumentationViewer)
             elif self.__layoutType == "Sidebars":
-                self.__activateLeftRightSidebarWidget(
-                    self.codeDocumentationViewer)
+                self.__activateLeftRightSidebarWidget(self.codeDocumentationViewer)
             if switchFocus:
                 self.codeDocumentationViewer.setFocus(
-                    Qt.FocusReason.ActiveWindowFocusReason)
-    
+                    Qt.FocusReason.ActiveWindowFocusReason
+                )
+
     def __activatePipWidget(self):
         """
         Private slot to handle the activation of the PyPI manager widget.
@@ -5281,7 +5890,7 @@
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.pipWidget)
             self.pipWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-    
+
     def __activateCondaWidget(self):
         """
         Private slot to handle the activation of the Conda manager widget.
@@ -5293,7 +5902,7 @@
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.condaWidget)
             self.condaWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
-    
+
     def __activateMicroPython(self):
         """
         Private slot to handle the activation of the MicroPython widget.
@@ -5304,13 +5913,12 @@
                 self.rToolbox.setCurrentWidget(self.microPythonWidget)
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.microPythonWidget)
-            self.microPythonWidget.setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
-    
+            self.microPythonWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
     def __toggleWindow(self, w):
         """
         Private method to toggle a workspace editor window.
-        
+
         @param w reference to the workspace editor window
         @return flag indicating, if the window was shown (boolean)
         """
@@ -5320,50 +5928,48 @@
         else:
             w.hide()
             return False
-        
+
     def __toolsConfiguration(self):
         """
         Private slot to handle the tools configuration menu entry.
         """
         from Preferences.ToolConfigurationDialog import ToolConfigurationDialog
-        dlg = ToolConfigurationDialog(
-            self.toolGroups[self.currentToolGroup][1], self)
+
+        dlg = ToolConfigurationDialog(self.toolGroups[self.currentToolGroup][1], self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.toolGroups[self.currentToolGroup][1] = dlg.getToollist()
             self.__updateExternalToolsActions()
-        
+
     def __toolGroupsConfiguration(self):
         """
         Private slot to handle the tool groups configuration menu entry.
         """
         from Preferences.ToolGroupConfigurationDialog import (
-            ToolGroupConfigurationDialog
-        )
-        dlg = ToolGroupConfigurationDialog(
-            self.toolGroups, self.currentToolGroup, self)
+            ToolGroupConfigurationDialog,
+        )
+
+        dlg = ToolGroupConfigurationDialog(self.toolGroups, self.currentToolGroup, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.toolGroups, self.currentToolGroup = dlg.getToolGroups()
-    
+
     def __createTestingDialog(self):
         """
         Private slot to generate the testing dialog on demand.
         """
         if self.__testingWidget is None:
             from Testing.TestingWidget import TestingWidget
+
             self.__testingWidget = TestingWidget()
-            self.__testingWidget.testFile.connect(
-                self.viewmanager.setFileLine)
-            self.__testingWidget.testRunStopped.connect(
-                self.__testingStopped)
-    
+            self.__testingWidget.testFile.connect(self.viewmanager.setFileLine)
+            self.__testingWidget.testRunStopped.connect(self.__testingStopped)
+
     def __testingStopped(self):
         """
         Private slot to handle the end of a test run.
         """
-        self.rerunFailedTestsAct.setEnabled(
-            self.__testingWidget.hasFailedTests())
+        self.rerunFailedTestsAct.setEnabled(self.__testingWidget.hasFailedTests())
         self.restartTestAct.setEnabled(True)
-    
+
     def __startTesting(self):
         """
         Private slot for displaying the testing dialog.
@@ -5371,14 +5977,14 @@
         self.__createTestingDialog()
         self.__testingWidget.show()
         self.__testingWidget.raise_()
-    
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __startTestScript(self, testFile=None):
         """
         Private slot for displaying the testing dialog and run the current
         script.
-        
+
         @param testFile file containing the tests to be run
         @type str
         """
@@ -5386,15 +5992,14 @@
             aw = self.viewmanager.activeWindow()
             fn = aw.getFileName()
             testFile = [
-                f for f in Utilities.getTestFileNames(fn) + [fn]
-                if os.path.exists(f)
+                f for f in Utilities.getTestFileNames(fn) + [fn] if os.path.exists(f)
             ][0]
-        
+
         self.__startTesting()
         self.__testingWidget.setTestFile(testFile, forProject=False)
         self.restartTestAct.setEnabled(False)
         self.rerunFailedTestsAct.setEnabled(False)
-    
+
     @pyqtSlot()
     def __startTestProject(self):
         """
@@ -5405,15 +6010,14 @@
         fn = self.project.getMainScript(True)
         if fn:
             testFile = [
-                f for f in Utilities.getTestFileNames(fn) + [fn]
-                if os.path.exists(f)
+                f for f in Utilities.getTestFileNames(fn) + [fn] if os.path.exists(f)
             ][0]
-        
+
         self.__startTesting()
         self.__testingWidget.setTestFile(testFile, forProject=True)
         self.restartTestAct.setEnabled(False)
         self.rerunFailedTestsAct.setEnabled(False)
-        
+
     def __restartTest(self):
         """
         Private slot to display the testing dialog and rerun the last
@@ -5421,7 +6025,7 @@
         """
         self.__startTesting()
         self.__testingWidget.startTests()
-        
+
     def __rerunFailedTests(self):
         """
         Private slot to display the testing dialog and rerun all failed tests
@@ -5429,13 +6033,13 @@
         """
         self.__startTesting()
         self.__testingWidget.startTests(failedOnly=True)
-    
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __designer(self, fn=None):
         """
         Private slot to start the Qt-Designer executable.
-        
+
         @param fn filename of the form to be opened
         @type str
         """
@@ -5447,178 +6051,175 @@
                 else:
                     EricMessageBox.critical(
                         self,
-                        self.tr('Problem'),
+                        self.tr("Problem"),
                         self.tr(
-                            '<p>The file <b>{0}</b> does not exist or'
-                            ' is zero length.</p>')
-                        .format(fn))
+                            "<p>The file <b>{0}</b> does not exist or"
+                            " is zero length.</p>"
+                        ).format(fn),
+                    )
                     return
             except OSError:
                 EricMessageBox.critical(
                     self,
-                    self.tr('Problem'),
+                    self.tr("Problem"),
                     self.tr(
-                        '<p>The file <b>{0}</b> does not exist or'
-                        ' is zero length.</p>')
-                    .format(fn))
+                        "<p>The file <b>{0}</b> does not exist or"
+                        " is zero length.</p>"
+                    ).format(fn),
+                )
                 return
-        
+
         if Utilities.isMacPlatform():
-            designer, args = Utilities.prepareQtMacBundle(
-                "designer", args)
+            designer, args = Utilities.prepareQtMacBundle("designer", args)
         else:
             designer = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("designer"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("designer")
+            )
             if Utilities.isWindowsPlatform():
-                designer += '.exe'
-        
+                designer += ".exe"
+
         if designer:
             proc = QProcess()
             if not proc.startDetached(designer, args):
                 EricMessageBox.critical(
                     self,
-                    self.tr('Process Generation Error'),
+                    self.tr("Process Generation Error"),
                     self.tr(
-                        '<p>Could not start Qt-Designer.<br>'
-                        'Ensure that it is available as <b>{0}</b>.</p>'
-                    ).format(designer)
+                        "<p>Could not start Qt-Designer.<br>"
+                        "Ensure that it is available as <b>{0}</b>.</p>"
+                    ).format(designer),
                 )
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not find the Qt-Designer executable.<br>'
-                    'Ensure that it is installed and optionally configured on'
-                    ' the Qt configuration page.</p>'
-                )
-            )
-    
+                    "<p>Could not find the Qt-Designer executable.<br>"
+                    "Ensure that it is installed and optionally configured on"
+                    " the Qt configuration page.</p>"
+                ),
+            )
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __linguist(self, fn=None):
         """
         Private slot to start the Qt-Linguist executable.
-        
+
         @param fn filename of the translation file to be opened
         @type str
         """
         args = []
         if fn is not None:
-            fn = fn.replace('.qm', '.ts')
+            fn = fn.replace(".qm", ".ts")
             try:
-                if (
-                    os.path.isfile(fn) and
-                    os.path.getsize(fn) and
-                    fn not in args
-                ):
+                if os.path.isfile(fn) and os.path.getsize(fn) and fn not in args:
                     args.append(fn)
                 else:
                     EricMessageBox.critical(
                         self,
-                        self.tr('Problem'),
+                        self.tr("Problem"),
                         self.tr(
-                            '<p>The file <b>{0}</b> does not exist or'
-                            ' is zero length.</p>')
-                        .format(fn))
+                            "<p>The file <b>{0}</b> does not exist or"
+                            " is zero length.</p>"
+                        ).format(fn),
+                    )
                     return
             except OSError:
                 EricMessageBox.critical(
                     self,
-                    self.tr('Problem'),
+                    self.tr("Problem"),
                     self.tr(
-                        '<p>The file <b>{0}</b> does not exist or'
-                        ' is zero length.</p>')
-                    .format(fn))
+                        "<p>The file <b>{0}</b> does not exist or"
+                        " is zero length.</p>"
+                    ).format(fn),
+                )
                 return
-        
+
         if Utilities.isMacPlatform():
-            linguist, args = Utilities.prepareQtMacBundle(
-                "linguist", args)
+            linguist, args = Utilities.prepareQtMacBundle("linguist", args)
         else:
             linguist = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("linguist"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("linguist")
+            )
             if Utilities.isWindowsPlatform():
-                linguist += '.exe'
-        
+                linguist += ".exe"
+
         if linguist:
             proc = QProcess()
             if not proc.startDetached(linguist, args):
                 EricMessageBox.critical(
                     self,
-                    self.tr('Process Generation Error'),
+                    self.tr("Process Generation Error"),
                     self.tr(
-                        '<p>Could not start Qt-Linguist.<br>'
-                        'Ensure that it is available as <b>{0}</b>.</p>'
-                    ).format(linguist)
+                        "<p>Could not start Qt-Linguist.<br>"
+                        "Ensure that it is available as <b>{0}</b>.</p>"
+                    ).format(linguist),
                 )
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not find the Qt-Linguist executable.<br>'
-                    'Ensure that it is installed and optionally configured on'
-                    ' the Qt configuration page.</p>'
-                )
-            )
-    
+                    "<p>Could not find the Qt-Linguist executable.<br>"
+                    "Ensure that it is installed and optionally configured on"
+                    " the Qt configuration page.</p>"
+                ),
+            )
+
     def __assistant(self, home=None):
         """
         Private slot to start the Qt-Assistant executable.
-        
+
         @param home full pathname of a file to display
         @type str
         """
         args = []
         if home:
-            args.append('-showUrl')
+            args.append("-showUrl")
             args.append(home)
-        
+
         if Utilities.isMacPlatform():
-            assistant, args = Utilities.prepareQtMacBundle(
-                "assistant", args)
+            assistant, args = Utilities.prepareQtMacBundle("assistant", args)
         else:
             assistant = os.path.join(
-                Utilities.getQtBinariesPath(),
-                Utilities.generateQtToolName("assistant"))
+                Utilities.getQtBinariesPath(), Utilities.generateQtToolName("assistant")
+            )
             if Utilities.isWindowsPlatform():
-                assistant += '.exe'
-        
+                assistant += ".exe"
+
         if assistant:
             proc = QProcess()
             if not proc.startDetached(assistant, args):
                 EricMessageBox.critical(
                     self,
-                    self.tr('Process Generation Error'),
+                    self.tr("Process Generation Error"),
                     self.tr(
-                        '<p>Could not start Qt-Assistant.<br>'
-                        'Ensure that it is available as <b>{0}</b>.</p>'
-                    ).format(assistant)
+                        "<p>Could not start Qt-Assistant.<br>"
+                        "Ensure that it is available as <b>{0}</b>.</p>"
+                    ).format(assistant),
                 )
         else:
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not find the Qt-Assistant executable.<br>'
-                    'Ensure that it is installed and optionally configured on'
-                    ' the Qt configuration page.</p>'
-                )
-            )
-    
+                    "<p>Could not find the Qt-Assistant executable.<br>"
+                    "Ensure that it is installed and optionally configured on"
+                    " the Qt configuration page.</p>"
+                ),
+            )
+
     def __startWebBrowser(self):
         """
         Private slot to start the eric web browser.
         """
         self.launchHelpViewer("")
-        
+
     def __customViewer(self, home=None):
         """
         Private slot to start a custom viewer.
-        
+
         @param home full pathname of a file to display (string)
         """
         customViewer = Preferences.getHelp("CustomViewer")
@@ -5628,58 +6229,62 @@
                 self.tr("Help"),
                 self.tr(
                     """Currently no custom viewer is selected."""
-                    """ Please use the preferences dialog to specify one."""))
+                    """ Please use the preferences dialog to specify one."""
+                ),
+            )
             return
-            
+
         proc = QProcess()
         args = []
         if home:
             args.append(home)
-        
+
         if not proc.startDetached(customViewer, args):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start custom viewer.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(customViewer))
-        
+                    "<p>Could not start custom viewer.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(customViewer),
+            )
+
     def __chmViewer(self, home=None):
         """
         Private slot to start the win help viewer to show *.chm files.
-        
+
         @param home full pathname of a file to display (string)
         """
         if home:
             proc = QProcess()
             args = []
             args.append(home)
-            
+
             if not proc.startDetached("hh", args):
                 EricMessageBox.critical(
                     self,
-                    self.tr('Process Generation Error'),
+                    self.tr("Process Generation Error"),
                     self.tr(
-                        '<p>Could not start the help viewer.<br>'
-                        'Ensure that it is available as <b>hh</b>.</p>'
-                    ))
-        
+                        "<p>Could not start the help viewer.<br>"
+                        "Ensure that it is available as <b>hh</b>.</p>"
+                    ),
+                )
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __UIPreviewer(self, fn=None):
         """
         Private slot to start the UI Previewer executable.
-        
+
         @param fn filename of the form to be previewed (string)
         """
         proc = QProcess()
-        
+
         viewer = os.path.join(getConfig("ericDir"), "eric7_uipreviewer.py")
-        
+
         args = []
         args.append(viewer)
-        
+
         if fn is not None:
             try:
                 if os.path.isfile(fn) and os.path.getsize(fn):
@@ -5687,53 +6292,55 @@
                 else:
                     EricMessageBox.critical(
                         self,
-                        self.tr('Problem'),
+                        self.tr("Problem"),
                         self.tr(
-                            '<p>The file <b>{0}</b> does not exist or'
-                            ' is zero length.</p>')
-                        .format(fn))
+                            "<p>The file <b>{0}</b> does not exist or"
+                            " is zero length.</p>"
+                        ).format(fn),
+                    )
                     return
             except OSError:
                 EricMessageBox.critical(
                     self,
-                    self.tr('Problem'),
+                    self.tr("Problem"),
                     self.tr(
-                        '<p>The file <b>{0}</b> does not exist or'
-                        ' is zero length.</p>')
-                    .format(fn))
+                        "<p>The file <b>{0}</b> does not exist or"
+                        " is zero length.</p>"
+                    ).format(fn),
+                )
                 return
-                
-        if (
-            not os.path.isfile(viewer) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(viewer) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start UI Previewer.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(viewer))
-        
+                    "<p>Could not start UI Previewer.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(viewer),
+            )
+
     @pyqtSlot()
     @pyqtSlot(list)
     @pyqtSlot(list, bool)
     def __TRPreviewer(self, fileNames=None, ignore=False):
         """
         Private slot to start the Translation Previewer executable.
-        
+
         @param fileNames filenames of forms and/or translations to be previewed
             (list of strings)
         @param ignore flag indicating non existing files should be ignored
             (boolean)
         """
         proc = QProcess()
-        
+
         viewer = os.path.join(getConfig("ericDir"), "eric7_trpreviewer.py")
-        
+
         args = []
         args.append(viewer)
-        
+
         if fileNames is not None:
             for fn in fileNames:
                 try:
@@ -5743,303 +6350,310 @@
                         if not ignore:
                             EricMessageBox.critical(
                                 self,
-                                self.tr('Problem'),
+                                self.tr("Problem"),
                                 self.tr(
-                                    '<p>The file <b>{0}</b> does not exist or'
-                                    ' is zero length.</p>')
-                                .format(fn))
+                                    "<p>The file <b>{0}</b> does not exist or"
+                                    " is zero length.</p>"
+                                ).format(fn),
+                            )
                             return
                 except OSError:
                     if not ignore:
                         EricMessageBox.critical(
                             self,
-                            self.tr('Problem'),
+                            self.tr("Problem"),
                             self.tr(
-                                '<p>The file <b>{0}</b> does not exist or'
-                                ' is zero length.</p>')
-                            .format(fn))
+                                "<p>The file <b>{0}</b> does not exist or"
+                                " is zero length.</p>"
+                            ).format(fn),
+                        )
                         return
-        
-        if (
-            not os.path.isfile(viewer) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(viewer) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start Translation Previewer.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(viewer))
-        
+                    "<p>Could not start Translation Previewer.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(viewer),
+            )
+
     def __sqlBrowser(self):
         """
         Private slot to start the SQL browser tool.
         """
         proc = QProcess()
-        
+
         browser = os.path.join(getConfig("ericDir"), "eric7_sqlbrowser.py")
-        
+
         args = []
         args.append(browser)
-        
-        if (
-            not os.path.isfile(browser) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(browser) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start SQL Browser.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(browser))
-        
+                    "<p>Could not start SQL Browser.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(browser),
+            )
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __openHexEditor(self, fn=""):
         """
         Private slot to open the hex editor window.
-        
+
         @param fn filename of the file to show (string)
         """
         from HexEdit.HexEditMainWindow import HexEditMainWindow
+
         dlg = HexEditMainWindow(fn, self, fromEric=True, project=self.project)
         dlg.show()
-        
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __editPixmap(self, fn=""):
         """
         Private slot to show a pixmap in a dialog.
-        
+
         @param fn filename of the file to show (string)
         """
         from IconEditor.IconEditorWindow import IconEditorWindow
+
         dlg = IconEditorWindow(fn, self, fromEric=True, project=self.project)
         dlg.show()
-        
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __showPixmap(self, fn):
         """
         Private slot to show a pixmap in a dialog.
-        
+
         @param fn filename of the file to show (string)
         """
         from Graphics.PixmapDiagram import PixmapDiagram
+
         dlg = PixmapDiagram(fn, self)
         if dlg.getStatus():
             dlg.show()
-        
+
     @pyqtSlot()
     @pyqtSlot(str)
     def __showSvg(self, fn):
         """
         Private slot to show a SVG file in a dialog.
-        
+
         @param fn filename of the file to show (string)
         """
         from Graphics.SvgDiagram import SvgDiagram
+
         dlg = SvgDiagram(fn, self)
         dlg.show()
-        
+
     @pyqtSlot(str)
     def __showUml(self, fn):
         """
         Private slot to show an eric graphics file in a dialog.
-        
+
         @param fn name of the file to be shown
         @type str
         """
         from Graphics.UMLDialog import UMLDialog, UMLDialogType
+
         dlg = UMLDialog(UMLDialogType.NO_DIAGRAM, self.project, parent=self)
         if dlg.load(fn):
             dlg.show(fromFile=True)
-    
+
     def __snapshot(self):
         """
         Private slot to start the snapshot tool.
         """
         proc = QProcess()
-        
+
         snap = os.path.join(getConfig("ericDir"), "eric7_snap.py")
-        
+
         args = []
         args.append(snap)
-        
-        if (
-            not os.path.isfile(snap) or
-            not proc.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(snap) or not proc.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start Snapshot tool.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
-                ).format(snap))
-        
+                    "<p>Could not start Snapshot tool.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
+                ).format(snap),
+            )
+
     def __toolActionTriggered(self, act):
         """
         Private slot called by external tools toolbar actions.
-        
+
         @param act reference to the action that triggered the slot
         @type QAction
         """
-        toolGroupName, toolMenuText = act.objectName().split('@@', 1)
+        toolGroupName, toolMenuText = act.objectName().split("@@", 1)
         for toolGroup in self.toolGroups:
             if toolGroup[0] == toolGroupName:
                 for tool in toolGroup[1]:
-                    if tool['menutext'] == toolMenuText:
+                    if tool["menutext"] == toolMenuText:
                         self.__startToolProcess(tool)
                         return
-                
+
                 EricMessageBox.information(
                     self,
                     self.tr("External Tools"),
                     self.tr(
                         """No tool entry found for external tool '{0}' """
-                        """in tool group '{1}'.""")
-                    .format(toolMenuText, toolGroupName))
+                        """in tool group '{1}'."""
+                    ).format(toolMenuText, toolGroupName),
+                )
                 return
-        
+
         EricMessageBox.information(
             self,
             self.tr("External Tools"),
-            self.tr("""No toolgroup entry '{0}' found.""")
-            .format(toolGroupName)
-        )
-    
+            self.tr("""No toolgroup entry '{0}' found.""").format(toolGroupName),
+        )
+
     def __toolExecute(self, act):
         """
         Private slot to execute a particular tool.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         if self.toolGroupsMenuTriggered:
             # ignore actions triggered from the select tool group submenu
             self.toolGroupsMenuTriggered = False
             return
-        
+
         if self.currentToolGroup < 0:
             # it was an action not to be handled here
             return
-        
+
         idx = act.data()
         if idx is not None and idx >= 0:
             tool = self.toolGroups[self.currentToolGroup][1][idx]
             self.__startToolProcess(tool)
-    
+
     def __startToolProcess(self, tool):
         """
         Private slot to start an external tool process.
-        
+
         @param tool list of tool entries
         """
         proc = QProcess()
         procData = (None,)
-        program = tool['executable']
+        program = tool["executable"]
         args = []
-        argv = Utilities.parseOptionString(tool['arguments'])
+        argv = Utilities.parseOptionString(tool["arguments"])
         args.extend(argv)
-        t = self.tr("Starting process '{0} {1}'.\n"
-                    ).format(program, tool['arguments'])
+        t = self.tr("Starting process '{0} {1}'.\n").format(program, tool["arguments"])
         self.appendToStdout(t)
-        
+
         proc.finished.connect(self.__toolFinished)
-        if tool['redirect'] != 'no':
+        if tool["redirect"] != "no":
             proc.readyReadStandardOutput.connect(self.__processToolStdout)
             proc.readyReadStandardError.connect(self.__processToolStderr)
-            if tool['redirect'] in ["insert", "replaceSelection"]:
+            if tool["redirect"] in ["insert", "replaceSelection"]:
                 aw = self.viewmanager.activeWindow()
-                procData = (aw, tool['redirect'], [])
+                procData = (aw, tool["redirect"], [])
                 if aw is not None:
                     aw.beginUndoAction()
-        
+
         proc.start(program, args)
         if not proc.waitForStarted():
             EricMessageBox.critical(
                 self,
-                self.tr('Process Generation Error'),
+                self.tr("Process Generation Error"),
                 self.tr(
-                    '<p>Could not start the tool entry <b>{0}</b>.<br>'
-                    'Ensure that it is available as <b>{1}</b>.</p>')
-                .format(tool['menutext'], tool['executable']))
+                    "<p>Could not start the tool entry <b>{0}</b>.<br>"
+                    "Ensure that it is available as <b>{1}</b>.</p>"
+                ).format(tool["menutext"], tool["executable"]),
+            )
         else:
             self.toolProcs.append((program, proc, procData))
-            if tool['redirect'] == 'no':
+            if tool["redirect"] == "no":
                 proc.closeReadChannel(QProcess.ProcessChannel.StandardOutput)
                 proc.closeReadChannel(QProcess.ProcessChannel.StandardError)
                 proc.closeWriteChannel()
-        
+
     def __processToolStdout(self):
         """
         Private slot to handle the readyReadStdout signal of a tool process.
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         # loop through all running tool processes
         for program, toolProc, toolProcData in self.toolProcs:
             toolProc.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-            
-            if (
-                toolProcData[0] is None or
-                toolProcData[1] not in ["insert", "replaceSelection"]
-            ):
+
+            if toolProcData[0] is None or toolProcData[1] not in [
+                "insert",
+                "replaceSelection",
+            ]:
                 # not connected to an editor or wrong mode
                 while toolProc.canReadLine():
-                    output = str(toolProc.readLine(), ioEncoding, 'replace')
+                    output = str(toolProc.readLine(), ioEncoding, "replace")
                     s = "{0} - {1}".format(program, output)
                     self.appendToStdout(s)
             else:
                 if toolProcData[1] == "insert":
-                    text = str(toolProc.readAll(), ioEncoding, 'replace')
+                    text = str(toolProc.readAll(), ioEncoding, "replace")
                     toolProcData[0].insert(text)
                 elif toolProcData[1] == "replaceSelection":
-                    text = str(toolProc.readAll(), ioEncoding, 'replace')
+                    text = str(toolProc.readAll(), ioEncoding, "replace")
                     toolProcData[2].append(text)
-        
+
     def __processToolStderr(self):
         """
         Private slot to handle the readyReadStderr signal of a tool process.
         """
         ioEncoding = Preferences.getSystem("IOEncoding")
-        
+
         # loop through all running tool processes
         for program, toolProc, _toolProcData in self.toolProcs:
             toolProc.setReadChannel(QProcess.ProcessChannel.StandardError)
-            
+
             while toolProc.canReadLine():
-                error = str(toolProc.readLine(), ioEncoding, 'replace')
+                error = str(toolProc.readLine(), ioEncoding, "replace")
                 s = "{0} - {1}".format(program, error)
                 self.appendToStderr(s)
-        
+
     def __toolFinished(self, exitCode, exitStatus):
         """
         Private slot to handle the finished signal of a tool process.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
         exitedProcs = []
-        
+
         # loop through all running tool processes
         for program, toolProc, toolProcData in self.toolProcs:
             if toolProc.state() == QProcess.ProcessState.NotRunning:
                 exitedProcs.append((program, toolProc, toolProcData))
                 if toolProcData[0] is not None:
                     if toolProcData[1] == "replaceSelection":
-                        text = ''.join(toolProcData[2])
+                        text = "".join(toolProcData[2])
                         toolProcData[0].replace(text)
                     toolProcData[0].endUndoAction()
-        
+
         # now delete the exited procs from the list of running processes
         for proc in exitedProcs:
             self.toolProcs.remove(proc)
             t = self.tr("Process '{0}' has exited.\n").format(proc[0])
             self.appendToStdout(t)
-    
+
     def __showPythonDoc(self):
         """
         Private slot to show the Python 3 documentation.
@@ -6049,43 +6663,45 @@
             if Utilities.isWindowsPlatform():
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
                 interpreter = (
-                    ericApp().getObject("VirtualEnvManager")
+                    ericApp()
+                    .getObject("VirtualEnvManager")
                     .getVirtualenvInterpreter(venvName)
                 )
                 if interpreter:
                     default = os.path.join(os.path.dirname(interpreter), "doc")
                 else:
                     default = ""
-                pythonDocDir = Utilities.getEnvironmentEntry(
-                    "PYTHON3DOCDIR", default)
+                pythonDocDir = Utilities.getEnvironmentEntry("PYTHON3DOCDIR", default)
             else:
                 pythonDocDir = Utilities.getEnvironmentEntry(
-                    "PYTHON3DOCDIR",
-                    '/usr/share/doc/packages/python3/html')
+                    "PYTHON3DOCDIR", "/usr/share/doc/packages/python3/html"
+                )
         if not pythonDocDir.startswith(("http://", "https://", "qthelp://")):
             if pythonDocDir.startswith("file://"):
                 pythonDocDir = pythonDocDir[7:]
             if not os.path.splitext(pythonDocDir)[1]:
-                home = Utilities.normjoinpath(pythonDocDir, 'index.html')
-                
+                home = Utilities.normjoinpath(pythonDocDir, "index.html")
+
                 if Utilities.isWindowsPlatform() and not os.path.exists(home):
                     pyversion = sys.hexversion >> 16
-                    vers = "{0:d}{1:d}".format((pyversion >> 8) & 0xff,
-                                               pyversion & 0xff)
-                    home = os.path.join(
-                        pythonDocDir, "python{0}.chm".format(vers))
+                    vers = "{0:d}{1:d}".format(
+                        (pyversion >> 8) & 0xFF, pyversion & 0xFF
+                    )
+                    home = os.path.join(pythonDocDir, "python{0}.chm".format(vers))
             else:
                 home = pythonDocDir
-            
+
             if not os.path.exists(home):
                 EricMessageBox.warning(
                     self,
                     self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
+                    self.tr(
+                        """<p>The documentation starting point"""
+                        """ "<b>{0}</b>" could not be found.</p>"""
+                    ).format(home),
+                )
                 return
-            
+
             if not home.endswith(".chm"):
                 if Utilities.isWindowsPlatform():
                     home = "file:///" + Utilities.fromNativeSeparators(home)
@@ -6093,7 +6709,7 @@
                     home = "file://" + home
         else:
             home = pythonDocDir
-        
+
         if home.endswith(".chm"):
             self.__chmViewer(home)
         else:
@@ -6115,7 +6731,7 @@
     def __showQtDoc(self, version):
         """
         Private method to show the Qt documentation.
-        
+
         @param version Qt version to show documentation for
         @type int
         """
@@ -6123,7 +6739,7 @@
             qtDocDir = Preferences.getQtDocDir(version)
         else:
             return
-        
+
         if qtDocDir.startswith("qthelp://"):
             if not os.path.splitext(qtDocDir)[1]:
                 home = qtDocDir + "/index.html"
@@ -6135,24 +6751,26 @@
             if qtDocDir.startswith("file://"):
                 qtDocDir = qtDocDir[7:]
             if not os.path.splitext(qtDocDir)[1]:
-                home = Utilities.normjoinpath(qtDocDir, 'index.html')
+                home = Utilities.normjoinpath(qtDocDir, "index.html")
             else:
                 home = qtDocDir
-            
+
             if not os.path.exists(home):
                 EricMessageBox.warning(
                     self,
                     self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
+                    self.tr(
+                        """<p>The documentation starting point"""
+                        """ "<b>{0}</b>" could not be found.</p>"""
+                    ).format(home),
+                )
                 return
-            
+
             if Utilities.isWindowsPlatform():
                 home = "file:///" + Utilities.fromNativeSeparators(home)
             else:
                 home = "file://" + home
-        
+
         hvType = Preferences.getHelp("HelpViewerType")
         if hvType == 0:
             self.__activateHelpViewerWidget(urlStr=home)
@@ -6167,27 +6785,31 @@
             self.__webBrowser(home)
         else:
             self.__customViewer(home)
-        
+
     def __showPyQtDoc(self, variant=5):
         """
         Private slot to show the PyQt5/6 documentation.
-        
+
         @param variant PyQt variant to show documentation for (5 or 6)
         @type int or str
         """
         pyqtDocDir = Preferences.getHelp("PyQt{0}DocDir".format(variant))
         if not pyqtDocDir:
             pyqtDocDir = Utilities.getEnvironmentEntry(
-                "PYQT{0}DOCDIR".format(variant), None)
-        
+                "PYQT{0}DOCDIR".format(variant), None
+            )
+
         if not pyqtDocDir:
             EricMessageBox.warning(
                 self,
                 self.tr("Documentation"),
-                self.tr("""<p>The PyQt{0} documentation starting point"""
-                        """ has not been configured.</p>""").format(variant))
+                self.tr(
+                    """<p>The PyQt{0} documentation starting point"""
+                    """ has not been configured.</p>"""
+                ).format(variant),
+            )
             return
-        
+
         if not pyqtDocDir.startswith(("http://", "https://", "qthelp://")):
             home = ""
             if pyqtDocDir:
@@ -6195,10 +6817,8 @@
                     pyqtDocDir = pyqtDocDir[7:]
                 if not os.path.splitext(pyqtDocDir)[1]:
                     possibleHomes = [
-                        Utilities.normjoinpath(
-                            pyqtDocDir, 'index.html'),
-                        Utilities.normjoinpath(
-                            pyqtDocDir, 'class_reference.html'),
+                        Utilities.normjoinpath(pyqtDocDir, "index.html"),
+                        Utilities.normjoinpath(pyqtDocDir, "class_reference.html"),
                     ]
                     for possibleHome in possibleHomes:
                         if os.path.exists(possibleHome):
@@ -6206,23 +6826,25 @@
                             break
                 else:
                     home = pyqtDocDir
-            
+
             if not home or not os.path.exists(home):
                 EricMessageBox.warning(
                     self,
                     self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
+                    self.tr(
+                        """<p>The documentation starting point"""
+                        """ "<b>{0}</b>" could not be found.</p>"""
+                    ).format(home),
+                )
                 return
-            
+
             if Utilities.isWindowsPlatform():
                 home = "file:///" + Utilities.fromNativeSeparators(home)
             else:
                 home = "file://" + home
         else:
             home = pyqtDocDir
-        
+
         hvType = Preferences.getHelp("HelpViewerType")
         if hvType == 0:
             self.__activateHelpViewerWidget(urlStr=home)
@@ -6237,7 +6859,7 @@
             self.__webBrowser(home)
         else:
             self.__customViewer(home)
-        
+
     def __showEricDoc(self):
         """
         Private slot to show the Eric documentation.
@@ -6245,23 +6867,26 @@
         home = Preferences.getHelp("EricDocDir")
         if not home:
             home = Utilities.normjoinpath(
-                getConfig('ericDocDir'), "Source", "index.html")
-        
+                getConfig("ericDocDir"), "Source", "index.html"
+            )
+
         if not home.startswith(("http://", "https://", "qthelp://")):
             if not os.path.exists(home):
                 EricMessageBox.warning(
                     self,
                     self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
+                    self.tr(
+                        """<p>The documentation starting point"""
+                        """ "<b>{0}</b>" could not be found.</p>"""
+                    ).format(home),
+                )
                 return
-            
+
             if Utilities.isWindowsPlatform():
                 home = "file:///" + Utilities.fromNativeSeparators(home)
             else:
                 home = "file://" + home
-        
+
         hvType = Preferences.getHelp("HelpViewerType")
         if hvType == 0:
             self.__activateHelpViewerWidget(urlStr=home)
@@ -6276,52 +6901,56 @@
             self.__webBrowser(home)
         else:
             self.__customViewer(home)
-    
+
     def __showPySideDoc(self, variant=2):
         """
         Private slot to show the PySide2/PySide6 documentation.
-        
+
         @param variant PySide variant (2 or 6)
         @type int or str
         """
         pysideDocDir = Preferences.getHelp("PySide{0}DocDir".format(variant))
         if not pysideDocDir:
             pysideDocDir = Utilities.getEnvironmentEntry(
-                "PYSIDE{0}DOCDIR".format(variant), None)
-        
+                "PYSIDE{0}DOCDIR".format(variant), None
+            )
+
         if not pysideDocDir:
             EricMessageBox.warning(
                 self,
                 self.tr("Documentation"),
-                self.tr("""<p>The PySide{0} documentation starting point"""
-                        """ has not been configured.</p>""").format(
-                    variant)
+                self.tr(
+                    """<p>The PySide{0} documentation starting point"""
+                    """ has not been configured.</p>"""
+                ).format(variant),
             )
             return
-        
+
         if not pysideDocDir.startswith(("http://", "https://", "qthelp://")):
             if pysideDocDir.startswith("file://"):
                 pysideDocDir = pysideDocDir[7:]
             if not os.path.splitext(pysideDocDir)[1]:
-                home = Utilities.normjoinpath(pysideDocDir, 'index.html')
+                home = Utilities.normjoinpath(pysideDocDir, "index.html")
             else:
                 home = pysideDocDir
             if not os.path.exists(home):
                 EricMessageBox.warning(
                     self,
                     self.tr("Documentation Missing"),
-                    self.tr("""<p>The documentation starting point"""
-                            """ "<b>{0}</b>" could not be found.</p>""")
-                    .format(home))
+                    self.tr(
+                        """<p>The documentation starting point"""
+                        """ "<b>{0}</b>" could not be found.</p>"""
+                    ).format(home),
+                )
                 return
-            
+
             if Utilities.isWindowsPlatform():
                 home = "file:///" + Utilities.fromNativeSeparators(home)
             else:
                 home = "file://" + home
         else:
             home = pysideDocDir
-        
+
         hvType = Preferences.getHelp("HelpViewerType")
         if hvType == 0:
             self.__activateHelpViewerWidget(urlStr=home)
@@ -6336,21 +6965,21 @@
             self.__webBrowser(home)
         else:
             self.__customViewer(home)
-    
+
     @pyqtSlot(QUrl)
     def handleUrl(self, url):
         """
         Public slot to handle opening a URL.
-        
+
         @param url URL to be shown
         @type QUrl
         """
         self.launchHelpViewer(url)
-    
+
     def launchHelpViewer(self, home, searchWord=None, useSingle=False):
         """
         Public slot to start the help viewer/web browser.
-        
+
         @param home filename of file to be shown or URL to be opened
         @type str or QUrl
         @param searchWord word to search for
@@ -6360,22 +6989,21 @@
         """
         if isinstance(home, QUrl):
             home = home.toString(QUrl.UrlFormattingOption.None_)
-        
+
         if len(home) > 0:
             homeUrl = QUrl(home)
             if not homeUrl.scheme():
                 home = QUrl.fromLocalFile(home).toString()
-        
-        launchResult = self.__launchExternalWebBrowser(
-            home, searchWord=searchWord)
+
+        launchResult = self.__launchExternalWebBrowser(home, searchWord=searchWord)
         if not launchResult:
             self.__webBrowser(home)
-    
+
     def __launchExternalWebBrowser(self, home, searchWord=None):
         """
         Private method to start an external web browser and communicate with
         it.
-        
+
         @param home filename of file to be shown or URL to be opened
         @type str
         @param searchWord word to search for
@@ -6386,11 +7014,10 @@
         clientArgs = []
         if searchWord:
             clientArgs.append("--search={0}".format(searchWord))
-        
+
         if self.__webBrowserProcess is None:
             webBrowsers = [
-                os.path.join(
-                    os.path.dirname(__file__), "..", "eric7_browser.py"),
+                os.path.join(os.path.dirname(__file__), "..", "eric7_browser.py"),
                 # QtWebEngine based web browser
             ]
             process = QProcess()
@@ -6401,17 +7028,19 @@
                     "--qthelp",
                     "--single",
                     "--name={0}".format(self.__webBrowserSAName),
-                    home
+                    home,
                 ]
                 process.start(Globals.getPythonExecutable(), args)
                 if not process.waitForStarted():
                     EricMessageBox.warning(
                         self,
                         self.tr("Start Web Browser"),
-                        self.tr("""The eric web browser could not be"""
-                                """ started."""))
+                        self.tr(
+                            """The eric web browser could not be""" """ started."""
+                        ),
+                    )
                     return False
-                
+
                 res = self.__connectToWebBrowser(process)
                 if res == 1:
                     # connection unsuccessful
@@ -6424,22 +7053,22 @@
                     continue
             else:
                 return False
-            
+
             process.finished.connect(self.__webBrowserFinished)
             self.__webBrowserProcess = process
-            
+
         else:
             clientArgs.append("--newtab={0}".format(home))
-        
+
         if clientArgs and self.__webBrowserClient:
             self.__webBrowserClient.processArgs(clientArgs, disconnect=False)
-        
+
         return True
-    
+
     def __connectToWebBrowser(self, process):
         """
         Private method to connect to a started web browser.
-        
+
         @param process reference to the started web browser process
         @type QProcess
         @return error indication (1 = connection not possible, 0 = ok,
@@ -6447,11 +7076,10 @@
         @rtype int
         """
         from WebBrowser.WebBrowserSingleApplication import (
-            WebBrowserSingleApplicationClient
-        )
-        
-        webBrowserClient = WebBrowserSingleApplicationClient(
-            self.__webBrowserSAName)
+            WebBrowserSingleApplicationClient,
+        )
+
+        webBrowserClient = WebBrowserSingleApplicationClient(self.__webBrowserSAName)
         connectCount = 30
         while connectCount:
             res = webBrowserClient.connect()
@@ -6462,9 +7090,9 @@
                 QThread.msleep(1000)
                 QApplication.processEvents()
             if (
-                process.state() == QProcess.ProcessState.NotRunning and
-                process.exitStatus() == QProcess.ExitStatus.NormalExit and
-                process.exitCode() == 100
+                process.state() == QProcess.ProcessState.NotRunning
+                and process.exitStatus() == QProcess.ExitStatus.NormalExit
+                and process.exitCode() == 100
             ):
                 # Process exited prematurely due to missing pre-requisites
                 return -1
@@ -6472,28 +7100,29 @@
             EricMessageBox.warning(
                 self,
                 self.tr("Start Web Browser"),
-                self.tr("""<p>The eric web browser is not started.</p>"""
-                        """<p>Reason: {0}</p>""").format(
-                    webBrowserClient.errstr())
+                self.tr(
+                    """<p>The eric web browser is not started.</p>"""
+                    """<p>Reason: {0}</p>"""
+                ).format(webBrowserClient.errstr()),
             )
             return 1
-        
+
         self.__webBrowserClient = webBrowserClient
         return 0
-    
+
     def __webBrowserFinished(self):
         """
         Private slot handling the end of the external web browser process.
         """
         self.__webBrowserProcess = None
         self.__webBrowserClient = None
-    
+
     def __webBrowserShutdown(self):
         """
         Private method to shut down the web browser.
         """
         self.__webBrowserClient.processArgs(["--shutdown"], disconnect=False)
-    
+
     def __helpViewer(self):
         """
         Private slot to start an empty help viewer/web browser.
@@ -6501,56 +7130,56 @@
         searchWord = self.viewmanager.textForFind(False)
         if searchWord == "":
             searchWord = None
-        
+
         self.launchHelpViewer("", searchWord=searchWord)
-    
+
     def __webBrowser(self, home=""):
         """
         Private slot to start the eric web browser.
-        
+
         @param home full pathname of a file to display (string)
         """
         started = QDesktopServices.openUrl(QUrl(home))
         if not started:
             EricMessageBox.critical(
-                self,
-                self.tr('Open Browser'),
-                self.tr('Could not start a web browser'))
+                self, self.tr("Open Browser"), self.tr("Could not start a web browser")
+            )
 
     @pyqtSlot()
     @pyqtSlot(str)
     def showPreferences(self, pageName=None):
         """
         Public slot to set the preferences.
-        
+
         @param pageName name of the configuration page to show (string)
         """
         if self.__configurationDialog is None:
             # only one invocation at a time is allowed
             from Preferences.ConfigurationDialog import ConfigurationDialog
+
             self.__configurationDialog = ConfigurationDialog(
-                self, 'Configuration',
+                self,
+                "Configuration",
                 expandedEntries=self.__expandedConfigurationEntries,
             )
             self.__configurationDialog.preferencesChanged.connect(
-                self.__preferencesChanged)
+                self.__preferencesChanged
+            )
             self.__configurationDialog.masterPasswordChanged.connect(
-                self.__masterPasswordChanged)
+                self.__masterPasswordChanged
+            )
             self.__configurationDialog.show()
             if pageName is not None:
-                self.__configurationDialog.showConfigurationPageByName(
-                    pageName)
+                self.__configurationDialog.showConfigurationPageByName(pageName)
             elif self.__lastConfigurationPageName:
                 self.__configurationDialog.showConfigurationPageByName(
-                    self.__lastConfigurationPageName)
+                    self.__lastConfigurationPageName
+                )
             else:
                 self.__configurationDialog.showConfigurationPageByName("empty")
             self.__configurationDialog.exec()
             QApplication.processEvents()
-            if (
-                self.__configurationDialog.result() ==
-                QDialog.DialogCode.Accepted
-            ):
+            if self.__configurationDialog.result() == QDialog.DialogCode.Accepted:
                 self.__configurationDialog.setPreferences()
                 Preferences.syncPreferences()
                 self.__preferencesChanged()
@@ -6560,17 +7189,17 @@
             self.__expandedConfigurationEntries = (
                 self.__configurationDialog.getExpandedEntries()
             )
-            
+
             self.__configurationDialog.deleteLater()
             self.__configurationDialog = None
-    
+
     @pyqtSlot()
     def __exportPreferences(self):
         """
         Private slot to export the current preferences.
         """
         Preferences.exportPreferences()
-    
+
     @pyqtSlot()
     def __importPreferences(self):
         """
@@ -6578,32 +7207,33 @@
         """
         Preferences.importPreferences()
         self.__preferencesChanged()
-    
+
     @pyqtSlot()
     def __exportTheme(self):
         """
         Private slot to export the current theme to a file.
         """
         from Preferences.ThemeManager import ThemeManager
+
         ThemeManager().exportTheme()
-    
+
     @pyqtSlot()
     def __importTheme(self):
         """
         Private slot to import a previously exported theme.
         """
         from Preferences.ThemeManager import ThemeManager
+
         if ThemeManager().importTheme():
             self.__preferencesChanged()
-    
+
     @pyqtSlot()
     def __preferencesChanged(self):
         """
         Private slot to handle a change of the preferences.
         """
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         if Preferences.getUI("SingleApplicationMode"):
             if self.SAServer is None:
                 self.SAServer = EricSingleApplicationServer()
@@ -6611,26 +7241,19 @@
             if self.SAServer is not None:
                 self.SAServer.shutdown()
                 self.SAServer = None
-        self.newWindowAct.setEnabled(
-            not Preferences.getUI("SingleApplicationMode"))
-        
+        self.newWindowAct.setEnabled(not Preferences.getUI("SingleApplicationMode"))
+
         if self.__layoutType == "Sidebars":
-            self.leftSidebar.setIconBarColor(
-                Preferences.getUI("IconBarColor"))
-            self.leftSidebar.setIconBarSize(
-                Preferences.getUI("IconBarSize"))
-            
-            self.bottomSidebar.setIconBarColor(
-                Preferences.getUI("IconBarColor"))
-            self.bottomSidebar.setIconBarSize(
-                Preferences.getUI("IconBarSize"))
-            
+            self.leftSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
+            self.leftSidebar.setIconBarSize(Preferences.getUI("IconBarSize"))
+
+            self.bottomSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
+            self.bottomSidebar.setIconBarSize(Preferences.getUI("IconBarSize"))
+
             if self.rightSidebar:
-                self.rightSidebar.setIconBarColor(
-                    Preferences.getUI("IconBarColor"))
-                self.rightSidebar.setIconBarSize(
-                    Preferences.getUI("IconBarSize"))
-        
+                self.rightSidebar.setIconBarColor(Preferences.getUI("IconBarColor"))
+                self.rightSidebar.setIconBarSize(Preferences.getUI("IconBarSize"))
+
         self.maxEditorPathLen = Preferences.getUI("CaptionFilenameLength")
         self.captionShowsFilename = Preferences.getUI("CaptionShowsFilename")
         if not self.captionShowsFilename:
@@ -6642,74 +7265,76 @@
                 self.__setWindowCaption(editor=fn)
             else:
                 self.__setWindowCaption(editor="")
-        
+
         self.performVersionCheck()
-        
+
         from QScintilla.SpellChecker import SpellChecker
+
         SpellChecker.setDefaultLanguage(
-            Preferences.getEditor("SpellCheckingDefaultLanguage"))
-        
+            Preferences.getEditor("SpellCheckingDefaultLanguage")
+        )
+
         with contextlib.suppress(ImportError, AttributeError):
             from EricWidgets.EricSpellCheckedTextEdit import SpellCheckMixin
+
             pwl = SpellChecker.getUserDictionaryPath(isException=False)
             pel = SpellChecker.getUserDictionaryPath(isException=True)
             SpellCheckMixin.setDefaultLanguage(
-                Preferences.getEditor("SpellCheckingDefaultLanguage"),
-                pwl, pel)
-        
+                Preferences.getEditor("SpellCheckingDefaultLanguage"), pwl, pel
+            )
+
         if Preferences.getUI("UseSystemProxy"):
             QNetworkProxyFactory.setUseSystemConfiguration(True)
         else:
             self.__proxyFactory = EricNetworkProxyFactory()
-            QNetworkProxyFactory.setApplicationProxyFactory(
-                self.__proxyFactory)
+            QNetworkProxyFactory.setApplicationProxyFactory(self.__proxyFactory)
             QNetworkProxyFactory.setUseSystemConfiguration(False)
-        
+
         from HexEdit.HexEditMainWindow import HexEditMainWindow
+
         for hexEditor in HexEditMainWindow.windows:
             hexEditor.preferencesChanged()
-        
+
         # set the keyboard input interval
         interval = Preferences.getUI("KeyboardInputInterval")
         if interval > 0:
             QApplication.setKeyboardInputInterval(interval)
         else:
             QApplication.setKeyboardInputInterval(-1)
-        
+
         if not self.__disableCrashSession:
             if Preferences.getUI("CrashSessionEnabled"):
                 self.__writeCrashSession()
             else:
                 self.__deleteCrashSession()
-        
+
         self.preferencesChanged.emit()
-    
+
     def __masterPasswordChanged(self, oldPassword, newPassword):
         """
         Private slot to handle the change of the master password.
-        
+
         @param oldPassword current master password (string)
         @param newPassword new master password (string)
         """
         import Globals
-        
+
         self.masterPasswordChanged.emit(oldPassword, newPassword)
         Preferences.convertPasswords(oldPassword, newPassword)
         variant = Globals.getWebBrowserSupport()
         if variant == "QtWebEngine":
-            from WebBrowser.Passwords.PasswordManager import (
-                PasswordManager
-            )
+            from WebBrowser.Passwords.PasswordManager import PasswordManager
+
             pwManager = PasswordManager()
             pwManager.masterPasswordChanged(oldPassword, newPassword)
         Utilities.crypto.changeRememberedMaster(newPassword)
-        
+
     def __reloadAPIs(self):
         """
         Private slot to reload the api information.
         """
         self.reloadAPIs.emit()
-        
+
     def __showExternalTools(self):
         """
         Private slot to display a dialog show a list of external tools used
@@ -6717,46 +7342,50 @@
         """
         if self.programsDialog is None:
             from Preferences.ProgramsDialog import ProgramsDialog
+
             self.programsDialog = ProgramsDialog(self)
         self.programsDialog.show()
-        
+
     def __configViewProfiles(self):
         """
         Private slot to configure the various view profiles.
         """
         from Preferences.ViewProfileDialog import ViewProfileDialog
-        dlg = ViewProfileDialog(self.__layoutType, self.profiles['edit'][1],
-                                self.profiles['debug'][1])
+
+        dlg = ViewProfileDialog(
+            self.__layoutType, self.profiles["edit"][1], self.profiles["debug"][1]
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             edit, debug = dlg.getVisibilities()
-            self.profiles['edit'][1] = edit
-            self.profiles['debug'][1] = debug
+            self.profiles["edit"][1] = edit
+            self.profiles["debug"][1] = debug
             Preferences.setUI("ViewProfiles", self.profiles)
             if self.currentProfile == "edit":
                 self.__setEditProfile(False)
             elif self.currentProfile == "debug":
                 self.setDebugProfile(False)
-        
+
     def __configToolBars(self):
         """
         Private slot to configure the various toolbars.
         """
         from EricWidgets.EricToolBarDialog import EricToolBarDialog
+
         dlg = EricToolBarDialog(self.toolbarManager)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            Preferences.setUI(
-                "ToolbarManagerState", self.toolbarManager.saveState())
-        
+            Preferences.setUI("ToolbarManagerState", self.toolbarManager.saveState())
+
     def __configShortcuts(self):
         """
         Private slot to configure the keyboard shortcuts.
         """
         if self.shortcutsDialog is None:
             from Preferences.ShortcutsDialog import ShortcutsDialog
+
             self.shortcutsDialog = ShortcutsDialog(self)
         self.shortcutsDialog.populate()
         self.shortcutsDialog.show()
-        
+
     def __exportShortcuts(self):
         """
         Private slot to export the keyboard shortcuts.
@@ -6767,29 +7396,34 @@
             "",
             self.tr("Keyboard Shortcuts File (*.ekj)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fn:
             return
-        
+
         fpath = pathlib.Path(fn)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fpath = fpath.with_suffix(ex)
-        
+
         ok = (
             EricMessageBox.yesNo(
                 self,
                 self.tr("Export Keyboard Shortcuts"),
-                self.tr("""<p>The keyboard shortcuts file <b>{0}</b> exists"""
-                        """ already. Overwrite it?</p>""").format(fpath))
-            if fpath.exists() else
-            True
-        )
-        
+                self.tr(
+                    """<p>The keyboard shortcuts file <b>{0}</b> exists"""
+                    """ already. Overwrite it?</p>"""
+                ).format(fpath),
+            )
+            if fpath.exists()
+            else True
+        )
+
         if ok:
             from Preferences import Shortcuts
+
             Shortcuts.exportShortcuts(str(fpath))
 
     def __importShortcuts(self):
@@ -6800,35 +7434,45 @@
             None,
             self.tr("Import Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard Shortcuts File (*.ekj);;"
-                    "XML Keyboard shortcut file (*.e4k)"))
-        
+            self.tr(
+                "Keyboard Shortcuts File (*.ekj);;" "XML Keyboard shortcut file (*.e4k)"
+            ),
+        )
+
         if fn:
             from Preferences import Shortcuts
+
             Shortcuts.importShortcuts(fn)
 
     def __showCertificatesDialog(self):
         """
         Private slot to show the certificates management dialog.
         """
-        from EricNetwork.EricSslCertificatesDialog import (
-            EricSslCertificatesDialog
-        )
-        
+        from EricNetwork.EricSslCertificatesDialog import EricSslCertificatesDialog
+
         dlg = EricSslCertificatesDialog(self)
         dlg.exec()
-        
+
     def __clearPrivateData(self):
         """
         Private slot to clear the private data lists.
         """
         from .ClearPrivateDataDialog import ClearPrivateDataDialog
+
         dlg = ClearPrivateDataDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             # recent files, recent projects, recent multi  projects,
             # debug histories, shell histories
-            (files, projects, multiProjects, debug, shell, testing, vcs,
-             plugins) = dlg.getData()
+            (
+                files,
+                projects,
+                multiProjects,
+                debug,
+                shell,
+                testing,
+                vcs,
+                plugins,
+            ) = dlg.getData()
             if files:
                 # clear list of recently opened files
                 self.viewmanager.clearRecent()
@@ -6848,6 +7492,7 @@
                 # clear the unit test histories
                 if self.__testingWidget is None:
                     from Testing.TestingWidget import clearSavedHistories
+
                     clearSavedHistories()
                 else:
                     self.__testingWidget.clearRecent()
@@ -6857,26 +7502,26 @@
             if plugins:
                 # clear private data of plug-ins not covered above
                 self.pluginManager.clearPluginsPrivateData("")
-            
+
             Preferences.syncPreferences()
-    
+
     def __newProject(self):
         """
         Private slot to handle the NewProject signal.
         """
         self.__setWindowCaption(project=self.project.name)
-        
+
     def __projectOpened(self):
         """
         Private slot to handle the projectOpened signal.
         """
         import Testing
+
         self.__setWindowCaption(project=self.project.name)
-        supported = Testing.isLanguageSupported(
-            self.project.getProjectLanguage())
+        supported = Testing.isLanguageSupported(self.project.getProjectLanguage())
         self.testProjectAct.setEnabled(supported)
         self.__testingProjectOpen = supported
-        
+
     def __projectClosed(self):
         """
         Private slot to handle the projectClosed signal.
@@ -6887,13 +7532,13 @@
             self.restartTestAct.setEnabled(False)
             self.rerunFailedTestsAct.setEnabled(False)
         self.__testingProjectOpen = False
-        
+
     def __programChange(self, fn):
         """
         Private slot to handle the programChange signal.
-        
+
         This primarily is here to set the currentProg variable.
-        
+
         @param fn filename to be set as current prog (string)
         """
         # Delete the old program if there was one.
@@ -6901,7 +7546,7 @@
             del self.currentProg
 
         self.currentProg = os.path.normpath(fn)
-        
+
     def __lastEditorClosed(self):
         """
         Private slot to handle the lastEditorClosed signal.
@@ -6913,48 +7558,49 @@
             self.restartTestAct.setEnabled(False)
             self.rerunFailedTestsAct.setEnabled(False)
         self.__setWindowCaption(editor="")
-        
+
     def __editorOpened(self, fn):
         """
         Private slot to handle the editorOpened signal.
-        
+
         @param fn filename of the opened editor (string)
         """
-        self.wizardsMenuAct.setEnabled(
-            len(self.__menus["wizards"].actions()) > 0)
-        
+        self.wizardsMenuAct.setEnabled(len(self.__menus["wizards"].actions()) > 0)
+
         if fn and str(fn) != "None":
             import Testing
+
             if Testing.isLanguageSupported(
                 self.viewmanager.getOpenEditor(fn).getFileType()
             ):
                 self.testScriptAct.setEnabled(True)
                 self.__testingEditorOpen = True
-        
+
     def __checkActions(self, editor):
         """
         Private slot to check some actions for their enable/disable status.
-        
+
         @param editor editor window
         """
         fn = editor.getFileName() if editor else None
-        
+
         if fn:
             import Testing
+
             if Testing.isLanguageSupported(editor.getFileType()):
                 self.testScriptAct.setEnabled(True)
                 self.__testingEditorOpen = True
                 return
-        
+
         self.testScriptAct.setEnabled(False)
-    
+
     def __writeTasks(self):
         """
         Private slot to write the tasks data to a JSON file (.etj).
         """
         fn = os.path.join(Utilities.getConfigDir(), "eric7tasks.etj")
         self.__tasksFile.writeFile(fn)
-    
+
     def __readTasks(self):
         """
         Private slot to read in the tasks file (.etj or .e6t).
@@ -6970,6 +7616,7 @@
                 f = QFile(fn)
                 if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from EricXML.TasksReader import TasksReader
+
                     reader = TasksReader(f, viewer=self.taskViewer)
                     reader.readXML()
                     f.close()
@@ -6978,14 +7625,14 @@
                         self,
                         self.tr("Read Tasks"),
                         self.tr(
-                            "<p>The tasks file <b>{0}</b> could not be"
-                            " read.</p>")
-                        .format(fn))
-        
+                            "<p>The tasks file <b>{0}</b> could not be" " read.</p>"
+                        ).format(fn),
+                    )
+
     def __writeSession(self, filename="", crashSession=False):
         """
         Private slot to write the session data to a JSON file (.esj).
-        
+
         @param filename name of a session file to write
         @type str
         @param crashSession flag indicating to write a crash session file
@@ -6996,18 +7643,16 @@
         if filename:
             fn = filename
         elif crashSession:
-            fn = os.path.join(Utilities.getConfigDir(),
-                              "eric7_crash_session.esj")
+            fn = os.path.join(Utilities.getConfigDir(), "eric7_crash_session.esj")
         else:
-            fn = os.path.join(Utilities.getConfigDir(),
-                              "eric7session.esj")
-        
+            fn = os.path.join(Utilities.getConfigDir(), "eric7session.esj")
+
         return self.__sessionFile.writeFile(fn)
-    
+
     def __readSession(self, filename=""):
         """
         Private slot to read in the session file (.esj or .e5s).
-        
+
         @param filename name of a session file to read
         @type str
         @return flag indicating success
@@ -7016,20 +7661,19 @@
         if filename:
             fn = filename
         else:
-            fn = os.path.join(Utilities.getConfigDir(),
-                              "eric7session.esj")
+            fn = os.path.join(Utilities.getConfigDir(), "eric7session.esj")
             if not os.path.exists(fn):
-                fn = os.path.join(Utilities.getConfigDir(),
-                                  "eric7session.e5s")
+                fn = os.path.join(Utilities.getConfigDir(), "eric7session.e5s")
                 if not os.path.exists(fn):
                     EricMessageBox.critical(
                         self,
                         self.tr("Read Session"),
-                        self.tr("<p>The session file <b>{0}</b> could not"
-                                " be read.</p>")
-                        .format(fn))
+                        self.tr(
+                            "<p>The session file <b>{0}</b> could not" " be read.</p>"
+                        ).format(fn),
+                    )
                     fn = ""
-        
+
         res = False
         if fn:
             if fn.endswith(".esj"):
@@ -7042,6 +7686,7 @@
                 f = QFile(fn)
                 if f.open(QIODevice.OpenModeFlag.ReadOnly):
                     from EricXML.SessionReader import SessionReader
+
                     self.__readingSession = True
                     reader = SessionReader(f, True)
                     reader.readXML()
@@ -7052,15 +7697,16 @@
                     EricMessageBox.critical(
                         self,
                         self.tr("Read session"),
-                        self.tr("<p>The session file <b>{0}</b> could not be"
-                                " read.</p>")
-                        .format(fn))
-        
+                        self.tr(
+                            "<p>The session file <b>{0}</b> could not be" " read.</p>"
+                        ).format(fn),
+                    )
+
         # Write a crash session after a session was read.
         self.__writeCrashSession()
-        
+
         return res
-    
+
     def __saveSessionToFile(self):
         """
         Private slot to save a session to disk.
@@ -7070,19 +7716,20 @@
             self.tr("Save Session"),
             Utilities.getHomeDir(),
             self.tr("eric Session Files (*.esj)"),
-            "")
-        
+            "",
+        )
+
         if not sessionFile:
             return
-        
+
         fpath = pathlib.Path(sessionFile)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fpath = fpath.with_suffix(ex)
-        
+
         self.__writeSession(filename=str(fpath))
-    
+
     def __loadSessionFromFile(self):
         """
         Private slot to load a session from disk.
@@ -7091,80 +7738,81 @@
             self,
             self.tr("Load session"),
             Utilities.getHomeDir(),
-            self.tr("eric Session Files (*.esj);;"
-                    "eric XML Session Files (*.e5s)"))
-        
+            self.tr("eric Session Files (*.esj);;" "eric XML Session Files (*.e5s)"),
+        )
+
         if not sessionFile:
             return
-        
+
         self.__readSession(filename=sessionFile)
-    
+
     def __deleteCrashSession(self):
         """
         Private slot to delete the crash session file.
         """
         for ext in (".esj", ".e5s"):
-            fn = os.path.join(Utilities.getConfigDir(),
-                              f"eric7_crash_session{ext}")
+            fn = os.path.join(Utilities.getConfigDir(), f"eric7_crash_session{ext}")
             if os.path.exists(fn):
                 with contextlib.suppress(OSError):
                     os.remove(fn)
-    
+
     def __writeCrashSession(self):
         """
         Private slot to write a crash session file.
         """
         if (
-            not self.__readingSession and
-            not self.__disableCrashSession and
-            Preferences.getUI("CrashSessionEnabled")
+            not self.__readingSession
+            and not self.__disableCrashSession
+            and Preferences.getUI("CrashSessionEnabled")
         ):
             self.__writeSession(crashSession=True)
-    
+
     def __readCrashSession(self):
         """
         Private method to check for and read a crash session.
-        
+
         @return flag indicating a crash session file was found and read
         @rtype bool
         """
         res = False
         if (
-            not self.__disableCrashSession and
-            not self.__noCrashOpenAtStartup and
-            Preferences.getUI("OpenCrashSessionOnStartup")
+            not self.__disableCrashSession
+            and not self.__noCrashOpenAtStartup
+            and Preferences.getUI("OpenCrashSessionOnStartup")
         ):
-            fn = os.path.join(Utilities.getConfigDir(),
-                              "eric7_crash_session.esj")
+            fn = os.path.join(Utilities.getConfigDir(), "eric7_crash_session.esj")
             if os.path.exists(fn):
                 yes = EricMessageBox.yesNo(
                     self,
                     self.tr("Crash Session found!"),
-                    self.tr("""A session file of a crashed session was"""
-                            """ found. Shall this session be restored?"""))
+                    self.tr(
+                        """A session file of a crashed session was"""
+                        """ found. Shall this session be restored?"""
+                    ),
+                )
                 if yes:
                     res = self.__readSession(filename=fn)
-        
+
         return res
-    
+
     def showFindFileByNameDialog(self):
         """
         Public slot to show the Find File by Name dialog.
         """
         if self.findFileNameDialog is None:
             from .FindFileNameDialog import FindFileNameDialog
+
             self.findFileNameDialog = FindFileNameDialog(self.project)
-            self.findFileNameDialog.sourceFile.connect(
-                self.viewmanager.openSourceFile)
+            self.findFileNameDialog.sourceFile.connect(self.viewmanager.openSourceFile)
             self.findFileNameDialog.designerFile.connect(self.__designer)
         self.findFileNameDialog.show()
         self.findFileNameDialog.raise_()
         self.findFileNameDialog.activateWindow()
-    
+
     def showFindFilesWidget(self, txt="", searchDir="", openFiles=False):
         """
         Public slot to show the Find In Files widget.
-        
+
         @param txt text to search for (defaults to "")
         @type str (optional)
         @param searchDir directory to search in (defaults to "")
@@ -7177,15 +7825,17 @@
             # embedded tool
             self.__activateFindFileWidget()
             self.__findFileWidget.activate(
-                replaceMode=False, txt=txt, searchDir=searchDir,
-                openFiles=openFiles)
+                replaceMode=False, txt=txt, searchDir=searchDir, openFiles=openFiles
+            )
         else:
             # external dialog
             if self.__findFileDialog is None:
                 from .FindFileWidget import FindFileDialog
+
                 self.__findFileDialog = FindFileDialog(self.project, self)
                 self.__findFileDialog.sourceFile.connect(
-                    self.viewmanager.openSourceFile)
+                    self.viewmanager.openSourceFile
+                )
                 self.__findFileDialog.designerFile.connect(self.__designer)
                 self.__findFileDialog.linguistFile.connect(self.__linguist)
                 self.__findFileDialog.trpreview.connect(self.__TRPreviewer)
@@ -7193,13 +7843,13 @@
                 self.__findFileDialog.svgFile.connect(self.__showSvg)
                 self.__findFileDialog.umlFile.connect(self.__showUml)
             self.__findFileDialog.activate(
-                replaceMode=False, txt=txt, searchDir=searchDir,
-                openFiles=openFiles)
-    
+                replaceMode=False, txt=txt, searchDir=searchDir, openFiles=openFiles
+            )
+
     def showReplaceFilesWidget(self, txt="", searchDir="", openFiles=False):
         """
         Public slot to show the Find In Files widget in replace mode.
-        
+
         @param txt text to search for (defaults to "")
         @type str (optional)
         @param searchDir directory to search in (defaults to "")
@@ -7212,15 +7862,17 @@
             # embedded tool
             self.__activateFindFileWidget()
             self.__findFileWidget.activate(
-                replaceMode=True, txt=txt, searchDir=searchDir,
-                openFiles=openFiles)
+                replaceMode=True, txt=txt, searchDir=searchDir, openFiles=openFiles
+            )
         else:
             # external dialog
             if self.__replaceFileDialog is None:
                 from .FindFileWidget import FindFileDialog
+
                 self.__replaceFileDialog = FindFileDialog(self.project, self)
                 self.__replaceFileDialog.sourceFile.connect(
-                    self.viewmanager.openSourceFile)
+                    self.viewmanager.openSourceFile
+                )
                 self.__replaceFileDialog.designerFile.connect(self.__designer)
                 self.__replaceFileDialog.linguistFile.connect(self.__linguist)
                 self.__replaceFileDialog.trpreview.connect(self.__TRPreviewer)
@@ -7228,9 +7880,9 @@
                 self.__replaceFileDialog.svgFile.connect(self.__showSvg)
                 self.__replaceFileDialog.umlFile.connect(self.__showUml)
             self.__replaceFileDialog.activate(
-                replaceMode=True, txt=txt, searchDir=searchDir,
-                openFiles=openFiles)
-    
+                replaceMode=True, txt=txt, searchDir=searchDir, openFiles=openFiles
+            )
+
     def __activateFindFileWidget(self):
         """
         Private slot to activate the Find In Files widget.
@@ -7241,11 +7893,10 @@
         elif self.__layoutType == "Sidebars":
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.__findFileWidget)
-        self.__findFileWidget.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-        
+        self.__findFileWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
         self.__findFileWidget.activate()
-    
+
     def showFindLocationWidget(self):
         """
         Public method to show the Find File widget.
@@ -7257,10 +7908,11 @@
             # external dialog
             if self.__findLocationDialog is None:
                 from .FindLocationWidget import FindLocationDialog
-                self.__findLocationDialog = FindLocationDialog(self.project,
-                                                               self)
+
+                self.__findLocationDialog = FindLocationDialog(self.project, self)
                 self.__findLocationDialog.sourceFile.connect(
-                    self.viewmanager.openSourceFile)
+                    self.viewmanager.openSourceFile
+                )
                 self.__findLocationDialog.designerFile.connect(self.__designer)
                 self.__findLocationDialog.linguistFile.connect(self.__linguist)
                 self.__findLocationDialog.trpreview.connect(self.__TRPreviewer)
@@ -7268,7 +7920,7 @@
                 self.__findLocationDialog.svgFile.connect(self.__showSvg)
                 self.__findLocationDialog.umlFile.connect(self.__showUml)
             self.__findLocationDialog.activate()
-    
+
     def __activateFindLocationWidget(self):
         """
         Private method to activate the Find File widget.
@@ -7279,11 +7931,10 @@
         elif self.__layoutType == "Sidebars":
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.__findLocationWidget)
-        self.__findLocationWidget.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-        
+        self.__findLocationWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
         self.__findLocationWidget.activate()
-    
+
     def __activateVcsStatusList(self):
         """
         Private slot to activate the VCS Status List.
@@ -7294,13 +7945,12 @@
         elif self.__layoutType == "Sidebars":
             self.leftSidebar.show()
             self.leftSidebar.setCurrentWidget(self.__vcsStatusWidget)
-        self.__vcsStatusWidget.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-    
+        self.__vcsStatusWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
     def __activateHelpViewerWidget(self, urlStr=None):
         """
         Private method to activate the embedded Help Viewer window.
-        
+
         @param urlStr URL to be shown
         @type str
         """
@@ -7310,74 +7960,75 @@
                 self.rToolbox.setCurrentWidget(self.__helpViewerWidget)
             elif self.__layoutType == "Sidebars":
                 self.__activateLeftRightSidebarWidget(self.__helpViewerWidget)
-            self.__helpViewerWidget.setFocus(
-                Qt.FocusReason.ActiveWindowFocusReason)
-            
+            self.__helpViewerWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
             url = None
             searchWord = None
-            
+
             if urlStr:
                 url = QUrl(urlStr)
                 if not url.isValid():
                     url = None
-            
+
             if url is None:
                 searchWord = self.viewmanager.textForFind(False)
                 if searchWord == "":
                     searchWord = None
-            
+
             self.__helpViewerWidget.activate(searchWord=searchWord, url=url)
-    
+
     ##########################################################
     ## Below are slots to handle StdOut and StdErr
     ##########################################################
-    
+
     def appendToStdout(self, s):
         """
         Public slot to append text to the stdout log viewer tab.
-        
+
         @param s output to be appended (string)
         """
         self.appendStdout.emit(s)
-    
+
     def appendToStderr(self, s):
         """
         Public slot to append text to the stderr log viewer tab.
-        
+
         @param s output to be appended (string)
         """
         self.appendStderr.emit(s)
-    
+
     ##########################################################
     ## Below are slots needed by the plugin menu
     ##########################################################
-    
+
     def __showPluginInfo(self):
         """
         Private slot to show the plugin info dialog.
         """
         from PluginManager.PluginInfoDialog import PluginInfoDialog
+
         self.__pluginInfoDialog = PluginInfoDialog(self.pluginManager, self)
         self.__pluginInfoDialog.show()
-        
+
     @pyqtSlot()
     def __installPlugins(self, pluginFileNames=None):
         """
         Private slot to show a dialog to install a new plugin.
-        
+
         @param pluginFileNames list of plugin files suggested for
             installation list of strings
         """
         from PluginManager.PluginInstallDialog import PluginInstallDialog
+
         self.__pluginInstallDialog = PluginInstallDialog(
             self.pluginManager,
             [] if pluginFileNames is None else pluginFileNames[:],
-            self)
+            self,
+        )
         self.__pluginInstallDialog.setModal(False)
-        self.__pluginInstallDialog.finished.connect(
-            self.__pluginInstallFinished)
+        self.__pluginInstallDialog.finished.connect(self.__pluginInstallFinished)
         self.__pluginInstallDialog.show()
-        
+
     @pyqtSlot()
     def __pluginInstallFinished(self):
         """
@@ -7387,101 +8038,101 @@
             self.__pluginInstallDialog.deleteLater()
             del self.__pluginInstallDialog
             self.__restart(ask=True)
-        
+
         self.pluginRepositoryViewer.reloadList()
-        
+
     def __deinstallPlugin(self):
         """
         Private slot to show a dialog to uninstall a plugin.
         """
         from PluginManager.PluginUninstallDialog import PluginUninstallDialog
+
         dlg = PluginUninstallDialog(self.pluginManager, self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __showPluginsAvailable(self):
         """
         Private slot to show the plugins available for download.
         """
         from PluginManager.PluginRepositoryDialog import PluginRepositoryDialog
+
         dlg = PluginRepositoryDialog(self.pluginManager, self)
         res = dlg.exec()
         if res == (QDialog.DialogCode.Accepted + 1):
             self.__installPlugins(dlg.getDownloadedPlugins())
-        
+
     def __pluginsConfigure(self):
         """
         Private slot to show the plugin manager configuration page.
         """
         self.showPreferences("pluginManagerPage")
-        
+
     def checkPluginUpdatesAvailable(self):
         """
         Public method to check the availability of updates of plug-ins.
         """
         if self.isOnline():
             self.pluginManager.checkPluginUpdatesAvailable()
-    
+
     @pyqtSlot()
     def __installDownloadedPlugins(self):
         """
         Private slot to handle the installation of plugins downloaded via the
         plugin repository viewer.
         """
-        self.__installPlugins(
-            self.pluginRepositoryViewer.getDownloadedPlugins())
-    
+        self.__installPlugins(self.pluginRepositoryViewer.getDownloadedPlugins())
+
     @pyqtSlot()
     def activatePluginRepositoryViewer(self):
         """
         Public slot to activate the plugin repository viewer.
         """
         self.pluginRepositoryViewer.reloadList()
-        
+
         if self.__layoutType == "Toolboxes":
             self.rToolboxDock.show()
             self.rToolbox.setCurrentWidget(self.pluginRepositoryViewer)
         elif self.__layoutType == "Sidebars":
             self.__activateLeftRightSidebarWidget(self.pluginRepositoryViewer)
-        self.pluginRepositoryViewer.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
-    
+        self.pluginRepositoryViewer.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
+
     #################################################################
     ## Drag and Drop Support
     #################################################################
-    
+
     def dragEnterEvent(self, event):
         """
         Protected method to handle the drag enter event.
-        
+
         @param event the drag enter event (QDragEnterEvent)
         """
         self.inDragDrop = event.mimeData().hasUrls()
         if self.inDragDrop:
             event.acceptProposedAction()
-        
+
     def dragMoveEvent(self, event):
         """
         Protected method to handle the drag move event.
-        
+
         @param event the drag move event (QDragMoveEvent)
         """
         if self.inDragDrop:
             event.acceptProposedAction()
-        
+
     def dragLeaveEvent(self, event):
         """
         Protected method to handle the drag leave event.
-        
+
         @param event the drag leave event (QDragLeaveEvent)
         """
         if self.inDragDrop:
             self.inDragDrop = False
-        
+
     def dropEvent(self, event):
         """
         Protected method to handle the drop event.
-        
+
         @param event the drop event (QDropEvent)
         """
         if event.mimeData().hasUrls():
@@ -7495,11 +8146,13 @@
                         EricMessageBox.information(
                             self,
                             self.tr("Drop Error"),
-                            self.tr("""<p><b>{0}</b> is not a file.</p>""")
-                            .format(fname))
-        
+                            self.tr("""<p><b>{0}</b> is not a file.</p>""").format(
+                                fname
+                            ),
+                        )
+
         self.inDragDrop = False
-    
+
     ##########################################################
     ## Below are methods needed for shutting down the IDE
     ##########################################################
@@ -7507,9 +8160,9 @@
     def closeEvent(self, event):
         """
         Protected event handler for the close event.
-        
+
         This event handler saves the preferences.
-        
+
         @param event close event (QCloseEvent)
         """
         if self.__shutdown():
@@ -7523,101 +8176,100 @@
     def __shutdown(self):
         """
         Private method to perform all necessary steps to close down the IDE.
-        
+
         @return flag indicating success
         """
         if self.shutdownCalled:
             return True
-        
+
         if self.__webBrowserProcess is not None:
             self.__webBrowserShutdown()
-        
+
         if self.irc is not None and not self.irc.shutdown():
             return False
-        
+
         sessionCreated = self.__writeSession()
-        
+
         self.__astViewer.hide()
-        
+
         if not self.project.closeProject(shutdown=True):
             return False
-        
+
         if not self.multiProject.closeMultiProject():
             return False
-        
+
         if not self.viewmanager.closeViewManager():
             return False
-        
+
         QDesktopServices.unsetUrlHandler("file")
         QDesktopServices.unsetUrlHandler("http")
         QDesktopServices.unsetUrlHandler("https")
-        
+
         if sessionCreated and not self.__disableCrashSession:
             self.__deleteCrashSession()
-        
+
         if self.codeDocumentationViewer is not None:
             self.codeDocumentationViewer.shutdown()
-        
+
         self.__previewer.shutdown()
-        
+
         self.__astViewer.shutdown()
-        
+
         self.shell.closeShell()
-        
+
         self.__writeTasks()
-        
+
         if self.templateViewer is not None:
             self.templateViewer.save()
-        
+
         if not self.debuggerUI.shutdownServer():
             return False
         self.debuggerUI.shutdown()
-        
+
         self.backgroundService.shutdown()
-        
+
         if self.cooperation is not None:
             self.cooperation.shutdown()
-        
+
         if self.__helpViewerWidget is not None:
             self.__helpViewerWidget.shutdown()
-        
+
         self.pluginManager.doShutdown()
-        
+
         if self.SAServer is not None:
             self.SAServer.shutdown()
             self.SAServer = None
-        
+
         # set proxy factory to None to avoid crashes
         QNetworkProxyFactory.setApplicationProxyFactory(None)
-        
+
         Preferences.setGeometry("MainMaximized", self.isMaximized())
         if not self.isMaximized():
             Preferences.setGeometry("MainGeometry", self.saveGeometry())
-        
+
         if self.browser is not None:
             self.browser.saveToplevelDirs()
-        
-        Preferences.setUI(
-            "ToolbarManagerState", self.toolbarManager.saveState())
+
+        Preferences.setUI("ToolbarManagerState", self.toolbarManager.saveState())
         self.__saveCurrentViewProfile(True)
         Preferences.saveToolGroups(self.toolGroups, self.currentToolGroup)
         Preferences.syncPreferences()
         self.shutdownCalled = True
         return True
-    
+
     def isOnline(self):
         """
         Public method to get the online state.
-        
+
         @return online state
         @rtype bool
         """
         return self.networkIcon.isOnline()
-    
+
     def __onlineStateChanged(self, online):
         """
         Private slot handling changes in online state.
-        
+
         @param online flag indicating the online state
         @type bool
         """
@@ -7627,7 +8279,7 @@
     ##############################################
     ## Below are methods to check for new versions
     ##############################################
-    
+
     def performVersionCheck(self):
         """
         Public method to check for an update even if not installed via PyPI.
@@ -7642,25 +8294,23 @@
                     return
                 elif period in [2, 3, 4]:
                     lastCheck = Preferences.getSettings().value(
-                        "Updates/LastCheckDate", QDate(1970, 1, 1))
+                        "Updates/LastCheckDate", QDate(1970, 1, 1)
+                    )
                     if lastCheck.isValid():
                         now = QDate.currentDate()
                         if (
-                            (period == 2 and
-                             lastCheck.day() == now.day()) or
-                            (period == 3 and lastCheck.daysTo(now) < 7) or
-                            (period == 4 and (lastCheck.daysTo(now) <
-                                              lastCheck.daysInMonth()))
+                            (period == 2 and lastCheck.day() == now.day())
+                            or (period == 3 and lastCheck.daysTo(now) < 7)
+                            or (
+                                period == 4
+                                and (lastCheck.daysTo(now) < lastCheck.daysInMonth())
+                            )
                         ):
                             # daily, weekly, monthly
                             return
-            
-            availableVersions = (
-                self.pipInterface.getPackageVersions("eric-ide")
-            )
-            updateAvailable = bool(
-                [v for v in availableVersions if v > VersionOnly]
-            )
+
+            availableVersions = self.pipInterface.getPackageVersions("eric-ide")
+            updateAvailable = bool([v for v in availableVersions if v > VersionOnly])
             if updateAvailable:
                 EricMessageBox.information(
                     self,
@@ -7669,20 +8319,20 @@
                         """A newer version of the <b>eric-ide</b> package is"""
                         """ available at <a href="{0}/eric-ide/">"""
                         """PyPI</a>."""
-                    ).format(self.pipInterface.getIndexUrlPypi())
+                    ).format(self.pipInterface.getIndexUrlPypi()),
                 )
-    
+
     def __sslErrors(self, reply, errors):
         """
         Private slot to handle SSL errors.
-        
+
         @param reply reference to the reply object (QNetworkReply)
         @param errors list of SSL errors (list of QSslError)
         """
         ignored = self.__sslErrorHandler.sslErrorsReply(reply, errors)[0]
         if ignored == EricSslErrorState.NOT_IGNORED:
             self.__downloadCancelled = True
-    
+
     #######################################
     ## Below are methods for various checks
     #######################################
@@ -7694,15 +8344,17 @@
         """
         if not Preferences.isConfigured():
             self.__initDebugToolbarsLayout()
-            
+
             if Preferences.hasEric6Configuration():
                 yes = EricMessageBox.yesNo(
                     self,
                     self.tr("First time usage"),
-                    self.tr("eric7 has not been configured yet but an eric6"
-                            " configuration was found. Shall this be"
-                            " imported?"),
-                    yesDefault=True
+                    self.tr(
+                        "eric7 has not been configured yet but an eric6"
+                        " configuration was found. Shall this be"
+                        " imported?"
+                    ),
+                    yesDefault=True,
                 )
                 if yes:
                     Preferences.importEric6Configuration()
@@ -7710,12 +8362,15 @@
                 EricMessageBox.information(
                     self,
                     self.tr("First time usage"),
-                    self.tr("""eric has not been configured yet. """
-                            """The configuration dialog will be started."""))
-            
+                    self.tr(
+                        """eric has not been configured yet. """
+                        """The configuration dialog will be started."""
+                    ),
+                )
+
             self.showPreferences()
             Preferences.setConfigured()
-    
+
     def checkProjectsWorkspace(self):
         """
         Public method to check, if a projects workspace has been configured. If
@@ -7724,7 +8379,7 @@
         if not Preferences.isConfigured():
             # eric hasn't been configured at all
             self.checkConfigurationStatus()
-        
+
         workspace = Preferences.getMultiProject("Workspace")
         if workspace == "":
             default = Utilities.getHomeDir()
@@ -7732,14 +8387,15 @@
                 None,
                 self.tr("Select Workspace Directory"),
                 default,
-                EricFileDialog.Option(0))
+                EricFileDialog.Option(0),
+            )
             Preferences.setMultiProject("Workspace", workspace)
-    
+
     def versionIsNewer(self, required, snapshot=None):
         """
         Public method to check, if the eric version is good compared to
         the required version.
-        
+
         @param required required version (string)
         @param snapshot required snapshot version (string)
         @return flag indicating, that the version is newer than the required
@@ -7748,11 +8404,11 @@
         if VersionOnly.startswith("@@"):
             # development version, always newer
             return True
-        
+
         if VersionOnly.startswith("rev_"):
             # installed from cloned sources, always newer
             return True
-        
+
         if "snapshot-" in VersionOnly:
             # check snapshot version
             if snapshot is None:
@@ -7760,7 +8416,7 @@
             else:
                 vers = VersionOnly.split("snapshot-")[1]
                 return vers > snapshot
-        
+
         versionTuple = self.__versionToTuple(VersionOnly)
         if isinstance(required, str):
             required = self.__versionToTuple(required)
@@ -7770,11 +8426,11 @@
             # some mismatching types, assume newer
             res = True
         return res
-    
+
     def __versionToTuple(self, version):
         """
         Private method to convert a version string into a tuple.
-        
+
         @param version version string
         @type str
         @return version tuple
@@ -7791,7 +8447,7 @@
                     continue
                 versionParts.append(part)
         return tuple(versionParts)
-    
+
     #################################
     ## Below are some utility methods
     #################################
@@ -7799,48 +8455,49 @@
     def __getFloatingGeometry(self, w):
         """
         Private method to get the geometry of a floating windows.
-        
+
         @param w reference to the widget to be saved (QWidget)
         @return list giving the widget's geometry and its visibility
         """
         s = w.size()
         p = w.pos()
         return [p.x(), p.y(), s.width(), s.height(), not w.isHidden()]
-    
+
     def getOriginalPathString(self):
         """
         Public method to get the original PATH environment variable
         (i.e. before modifications by eric and PyQt5).
-        
+
         @return original PATH environment variable
         @rtype str
         """
         return self.__originalPathString
-    
+
     ############################
     ## some event handlers below
     ############################
-    
+
     def showEvent(self, evt):
         """
         Protected method to handle the show event.
-        
+
         @param evt reference to the show event (QShowEvent)
         """
         if self.__startup:
             if Preferences.getGeometry("MainMaximized"):
                 self.setWindowState(Qt.WindowState.WindowMaximized)
             self.__startup = False
-    
+
     ##########################################
     ## Support for desktop notifications below
     ##########################################
-    
-    def showNotification(self, icon, heading, text,
-                         kind=NotificationTypes.INFORMATION, timeout=None):
+
+    def showNotification(
+        self, icon, heading, text, kind=NotificationTypes.INFORMATION, timeout=None
+    ):
         """
         Public method to show a desktop notification.
-        
+
         @param icon icon to be shown in the notification
         @type QPixmap
         @param heading heading of the notification
@@ -7855,51 +8512,53 @@
         """
         if self.__notification is None:
             from .NotificationWidget import NotificationWidget
+
             self.__notification = NotificationWidget(parent=self)
         if timeout is None:
             timeout = Preferences.getUI("NotificationTimeout")
-        self.__notification.showNotification(icon, heading, text, kind=kind,
-                                             timeout=timeout)
-    
+        self.__notification.showNotification(
+            icon, heading, text, kind=kind, timeout=timeout
+        )
+
     #########################
     ## Support for IRC  below
     #########################
-    
+
     def autoConnectIrc(self):
         """
         Public method to initiate the IRC auto connection.
         """
         if self.irc is not None:
             self.irc.autoConnect()
-    
+
     def __ircAutoConnected(self):
         """
         Private slot handling the automatic connection of the IRC client.
         """
         self.__activateIRC()
-    
+
     ##############################################
     ## Support for Code Documentation Viewer below
     ##############################################
-    
+
     def documentationViewer(self):
         """
         Public method to provide a reference to the code documentation viewer.
-        
+
         @return reference to the code documentation viewer
         @rtype CodeDocumentationViewer
         """
         return self.codeDocumentationViewer
-    
+
     ###############################################
     ## Support for Desktop session management below
     ###############################################
-    
+
     def __commitData(self, manager: QSessionManager):
         """
         Private slot to commit unsaved data when instructed by the desktop
         session manager.
-        
+
         @param manager reference to the desktop session manager
         @type QSessionManager
         """
@@ -7908,13 +8567,15 @@
                 res = EricMessageBox.warning(
                     self,
                     self.tr("Unsaved Data Detected"),
-                    self.tr("Some editors contain unsaved data. Shall these"
-                            " be saved?"),
-                    EricMessageBox.Abort |
-                    EricMessageBox.Discard |
-                    EricMessageBox.Save |
+                    self.tr(
+                        "Some editors contain unsaved data. Shall these" " be saved?"
+                    ),
+                    EricMessageBox.Abort
+                    | EricMessageBox.Discard
+                    | EricMessageBox.Save
+                    | EricMessageBox.SaveAll,
                     EricMessageBox.SaveAll,
-                    EricMessageBox.SaveAll)
+                )
                 if res == EricMessageBox.SaveAll:
                     manager.release()
                     self.viewmanager.saveAllEditors()
@@ -7933,11 +8594,11 @@
                 # We did not get permission to interact, play it safe and
                 # save all data.
                 self.viewmanager.saveAllEditors()
-    
+
     ############################################################
     ## Interface to the virtual environment manager widget below
     ############################################################
-    
+
     @pyqtSlot()
     def activateVirtualenvManager(self):
         """
@@ -7947,7 +8608,5 @@
             self.rToolboxDock.show()
             self.rToolbox.setCurrentWidget(self.__virtualenvManagerWidget)
         elif self.__layoutType == "Sidebars":
-            self.__activateLeftRightSidebarWidget(
-                self.__virtualenvManagerWidget)
-        self.__virtualenvManagerWidget.setFocus(
-            Qt.FocusReason.ActiveWindowFocusReason)
+            self.__activateLeftRightSidebarWidget(self.__virtualenvManagerWidget)
+        self.__virtualenvManagerWidget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
--- a/src/eric7/UI/VersionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/VersionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog to show the versions of various components.
     """
+
     def __init__(self, parent, title, text):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type UserInterface
         @param title dialog title
@@ -37,31 +38,29 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__ui = parent
         icon = QGuiApplication.windowIcon().pixmap(64, 64)
-        
+
         self.setWindowTitle(title)
         self.iconLabel.setPixmap(icon)
         self.textLabel.setText(text)
-        
+
         self.__checkUpdateButton = self.buttonBox.addButton(
-            self.tr("Check for Upgrades..."),
-            QDialogButtonBox.ButtonRole.ActionRole
+            self.tr("Check for Upgrades..."), QDialogButtonBox.ButtonRole.ActionRole
         )
         self.__checkUpdateButton.clicked.connect(self.__checkForUpdate)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setDefault(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setFocus(
-                Qt.FocusReason.OtherFocusReason)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setDefault(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setFocus(
+            Qt.FocusReason.OtherFocusReason
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
         self.exec()
-    
+
     @pyqtSlot()
     def __checkForUpdate(self):
         """
@@ -69,62 +68,53 @@
         package are available.
         """
         msg = ""
-        
+
         pip = ericApp().getObject("Pip")
         venvManager = ericApp().getObject("VirtualEnvManager")
-        
+
         environmentName = (
             venvManager.environmentForInterpreter(sys.executable)[0]
             # just the name is needed
         )
-        
+
         if environmentName:
             with EricOverrideCursor():
                 pyqtUpdateAvailable = pip.checkPackageOutdated(
-                    "pyqt6", environmentName)[0]
+                    "pyqt6", environmentName
+                )[0]
                 ericUpdateAvailable = pip.checkPackageOutdated(
-                    "eric-ide", environmentName)[0]
-            
+                    "eric-ide", environmentName
+                )[0]
+
             if pyqtUpdateAvailable or ericUpdateAvailable:
                 self.buttonBox.removeButton(self.__checkUpdateButton)
                 self.__checkUpdateButton = None
             else:
                 msg = self.tr("No upgrades available.")
-            
+
             if ericUpdateAvailable:
                 self.__upgradeEricButton = self.buttonBox.addButton(
-                    self.tr("Upgrade eric7..."),
-                    QDialogButtonBox.ButtonRole.ActionRole
+                    self.tr("Upgrade eric7..."), QDialogButtonBox.ButtonRole.ActionRole
                 )
                 self.__upgradeEricButton.clicked.connect(self.__ui.upgradeEric)
-                msg += self.tr(
-                    "<p>An upgrade of <b>eric7</b> is available.</p>")
-            
+                msg += self.tr("<p>An upgrade of <b>eric7</b> is available.</p>")
+
             if pyqtUpdateAvailable:
                 self.__upgradePyQtButton = self.buttonBox.addButton(
-                    self.tr("Upgrade PyQt6..."),
-                    QDialogButtonBox.ButtonRole.ActionRole
+                    self.tr("Upgrade PyQt6..."), QDialogButtonBox.ButtonRole.ActionRole
                 )
                 self.__upgradePyQtButton.clicked.connect(self.__ui.upgradePyQt)
-                msg += self.tr(
-                    "<p>An upgrade of <b>PyQt6</b> is available.</p>")
-            
+                msg += self.tr("<p>An upgrade of <b>PyQt6</b> is available.</p>")
+
             if ericUpdateAvailable and pyqtUpdateAvailable:
                 self.__upgradeBothButton = self.buttonBox.addButton(
-                    self.tr("Upgrade Both..."),
-                    QDialogButtonBox.ButtonRole.ActionRole
+                    self.tr("Upgrade Both..."), QDialogButtonBox.ButtonRole.ActionRole
                 )
-                self.__upgradeBothButton.clicked.connect(
-                    self.__ui.upgradeEricPyQt)
-            
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setDefault(True)
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setFocus(
-                    Qt.FocusReason.OtherFocusReason)
-            
-            EricMessageBox.information(
-                self,
-                self.tr("Check for Upgrades"),
-                msg
+                self.__upgradeBothButton.clicked.connect(self.__ui.upgradeEricPyQt)
+
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setDefault(True)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setFocus(
+                Qt.FocusReason.OtherFocusReason
             )
+
+            EricMessageBox.information(self, self.tr("Check for Upgrades"), msg)
--- a/src/eric7/UI/upgrader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/UI/upgrader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,9 +18,14 @@
 
 
 _pyqtPackages = [
-    "pyqt6", "pyqt6-sip", "pyqt6-webengine", "pyqt6-charts",
-    "pyqt6-qscintilla", "pyqt6-qt6", "pyqt6-webengine-qt6",
-    "pyqt6-charts-qt6"
+    "pyqt6",
+    "pyqt6-sip",
+    "pyqt6-webengine",
+    "pyqt6-charts",
+    "pyqt6-qscintilla",
+    "pyqt6-qt6",
+    "pyqt6-webengine-qt6",
+    "pyqt6-charts-qt6",
 ]
 _ericPackages = ["eric-ide"]
 
@@ -28,25 +33,25 @@
 def doUpgrade(packages):
     """
     Function to upgrade the given packages via pip.
-    
+
     @param packages list of packages to be upgraded
     @type list of str
     @return flag indicating a successful installation
     @rtype bool
     """
-    exitCode = subprocess.run(                  # secok
-        [sys.executable, "-m", "pip", "install", "--prefer-binary",
-         "--upgrade"] + packages
+    exitCode = subprocess.run(  # secok
+        [sys.executable, "-m", "pip", "install", "--prefer-binary", "--upgrade"]
+        + packages
     ).returncode
-    ok = (exitCode == 0)
-    
+    ok = exitCode == 0
+
     return ok
 
 
 def startEric(args):
     """
     Function to start eric with the given arguments.
-    
+
     @param args list containing the start arguments
     @type list of str
     """
@@ -63,27 +68,27 @@
     except ValueError:
         # '--' was not found. Start eric with all parameters given.
         ddindex = 0
-    
-    ericStartArgs = sys.argv[ddindex + 1:] if bool(ddindex) else []
+
+    ericStartArgs = sys.argv[ddindex + 1 :] if bool(ddindex) else []
     if not ericStartArgs:
         # create default start arguments
         ericStartArgs = ["-m", "eric7", "--start-session"]
-    
+
     upgraderArgs = sys.argv[1:ddindex] if bool(ddindex) else sys.argv[:]
-    
+
     upgradeType = ""
     upgradeDelay = 2
-    
+
     for arg in upgraderArgs:
         if arg.startswith("--delay="):
             with contextlib.suppress(ValueError):
                 upgradeDelay = int(arg.split("=")[1].strip())
         elif arg.startswith("--type="):
             upgradeType = arg.split("=")[1].strip()
-    
+
     # wait a few seconds to give eric the chance to fully shut down
     time.sleep(upgradeDelay)
-    
+
     # now perform the upgrade and start eric, if it was successful
     if upgradeType == "pyqt":
         ok = doUpgrade(_pyqtPackages)
@@ -93,12 +98,13 @@
         ok = doUpgrade(_ericPackages + _pyqtPackages)
     else:
         ok = False
-    
+
     if ok:
         startEric(ericStartArgs)
         sys.exit(0)
     else:
         sys.exit(1)
 
+
 if __name__ == "__main__":
     main()
--- a/src/eric7/Utilities/AutoSaver.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/AutoSaver.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,57 +14,58 @@
     """
     Class implementing the auto saver.
     """
+
     AUTOSAVE_IN = 1000 * 3
     MAXWAIT = 1000 * 15
-    
+
     def __init__(self, parent, save):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         @param save slot to be called to perform the save operation
         @exception RuntimeError raised, if no parent is given
         """
         super().__init__(parent)
-        
+
         if parent is None:
             raise RuntimeError("AutoSaver: parent must not be None.")
-        
+
         self.__save = save
-        
+
         self.__timer = QBasicTimer()
         self.__firstChange = None
-    
+
     def changeOccurred(self):
         """
         Public slot handling a change.
         """
         if self.__firstChange is None:
             self.__firstChange = QTime.currentTime()
-        
+
         if self.__firstChange.msecsTo(QTime.currentTime()) > self.MAXWAIT:
             self.saveIfNeccessary()
         else:
             self.__timer.start(self.AUTOSAVE_IN, self)
-    
+
     def timerEvent(self, evt):
         """
         Protected method handling timer events.
-        
+
         @param evt reference to the timer event (QTimerEvent)
         """
         if evt.timerId() == self.__timer.timerId():
             self.saveIfNeccessary()
         else:
             super().timerEvent(evt)
-    
+
     def saveIfNeccessary(self):
         """
         Public method to activate the save operation.
         """
         if not self.__timer.isActive():
             return
-        
+
         self.__timer.stop()
         self.__firstChange = None
         self.__save()
--- a/src/eric7/Utilities/BackgroundClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/BackgroundClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing the main part of the background client.
     """
+
     def __init__(self, host, port, maxProcs):
         """
         Constructor
-        
+
         @param host ip address the background service is listening
         @type str
         @param port port of the background service
@@ -38,16 +39,16 @@
         """
         self.services = {}
         self.batchServices = {}
-        
+
         self.connection = socket.create_connection((host, port))
-        ver = b'Python3'
+        ver = b"Python3"
         self.connection.sendall(ver)
         self.__maxProcs = maxProcs
 
     def __initClientService(self, fn, path, module):
         """
         Private method to import the given module and register it as service.
-        
+
         @param fn service name to register
         @type str
         @param path contains the path to the module
@@ -62,12 +63,10 @@
             importedModule = __import__(module, globals(), locals(), [], 0)
             self.services[fn] = importedModule.initService()
             with contextlib.suppress(AttributeError):
-                self.batchServices["batch_" + fn] = (
-                    importedModule.initBatchService()
-                )
-            return 'ok'
+                self.batchServices["batch_" + fn] = importedModule.initBatchService()
+            return "ok"
         except ImportError as err:
-            return 'Import Error: ' + str(err)
+            return "Import Error: " + str(err)
         except Exception as err:
             return str(err)
 
@@ -75,7 +74,7 @@
         """
         Private method to send a job response back to the BackgroundService
         server.
-        
+
         @param fx remote function name to execute
         @type str
         @param fn filename for identification
@@ -83,116 +82,130 @@
         @param data return value(s)
         @type any basic datatype
         """
-        if not isinstance(data, (
-            dict, list, tuple, str, int, float, bool, type(None),
-        )):
+        if not isinstance(
+            data,
+            (
+                dict,
+                list,
+                tuple,
+                str,
+                int,
+                float,
+                bool,
+                type(None),
+            ),
+        ):
             # handle sending of objects of unsupported types
             data = str(data)
-        
+
         packedData = json.dumps([fx, fn, data])
-        packedData = bytes(packedData, 'utf-8')
-        header = struct.pack(
-            b'!II', len(packedData), adler32(packedData) & 0xffffffff)
+        packedData = bytes(packedData, "utf-8")
+        header = struct.pack(b"!II", len(packedData), adler32(packedData) & 0xFFFFFFFF)
         self.connection.sendall(header)
         self.connection.sendall(packedData)
 
     def __receive(self, length):
         """
         Private method to receive the given length of bytes.
-        
+
         @param length bytes to receive
         @type int
         @return received bytes or None if connection closed
         @rtype bytes
         """
-        data = b''
+        data = b""
         while len(data) < length:
             newData = self.connection.recv(length - len(data))
             if not newData:
                 return None
             data += newData
         return data
-    
+
     def __peek(self, length):
         """
         Private method to peek the given length of bytes.
-        
+
         @param length bytes to receive
         @type int
         @return received bytes
         @rtype bytes
         """
-        data = b''
+        data = b""
         self.connection.setblocking(False)
         try:
             with contextlib.suppress(OSError):
                 data = self.connection.recv(length, socket.MSG_PEEK)
         finally:
             self.connection.setblocking(True)
-        
+
         return data
-    
+
     def __cancelled(self):
         """
         Private method to check for a job cancellation.
-        
+
         @return flag indicating a cancellation
         @rtype bool
         """
-        msg = self.__peek(struct.calcsize(b'!II') + 6)
+        msg = self.__peek(struct.calcsize(b"!II") + 6)
         if msg[-6:] == b"CANCEL":
             # get rid of the message data
-            self.__receive(struct.calcsize(b'!II') + 6)
+            self.__receive(struct.calcsize(b"!II") + 6)
             return True
         else:
             return False
-    
+
     def run(self):
         """
         Public method implementing the main loop of the client.
-        
+
         @exception RuntimeError raised if hashes don't match
         """
         try:
             while True:
-                header = self.__receive(struct.calcsize(b'!II'))
+                header = self.__receive(struct.calcsize(b"!II"))
                 # Leave main loop if connection was closed.
                 if not header:
                     break
-                
-                length, datahash = struct.unpack(b'!II', header)
+
+                length, datahash = struct.unpack(b"!II", header)
                 messageType = self.__receive(6)
                 packedData = self.__receive(length)
-                
+
                 if messageType != b"JOB   ":
                     continue
-                
-                if adler32(packedData) & 0xffffffff != datahash:
-                    raise RuntimeError('Hashes not equal')
-                
-                packedData = packedData.decode('utf-8')
-                
+
+                if adler32(packedData) & 0xFFFFFFFF != datahash:
+                    raise RuntimeError("Hashes not equal")
+
+                packedData = packedData.decode("utf-8")
+
                 fx, fn, data = json.loads(packedData)
-                if fx == 'INIT':
+                if fx == "INIT":
                     ret = self.__initClientService(fn, *data)
                 elif fx.startswith("batch_"):
                     callback = self.batchServices.get(fx)
                     if callback:
-                        callback(data, self.__send, fx, self.__cancelled,
-                                 maxProcesses=self.__maxProcs)
+                        callback(
+                            data,
+                            self.__send,
+                            fx,
+                            self.__cancelled,
+                            maxProcesses=self.__maxProcs,
+                        )
                         ret = "__DONE__"
                     else:
-                        ret = 'Unknown batch service.'
+                        ret = "Unknown batch service."
                 else:
                     callback = self.services.get(fx)
                     if callback:
                         ret = callback(fn, *data)
                     else:
-                        ret = 'Unknown service.'
-                
+                        ret = "Unknown service."
+
                 if isinstance(ret, Exception):
                     ret = str(ret)
-                
+
                 self.__send(fx, fn, ret)
         except OSError:
             pass
@@ -203,9 +216,8 @@
             tbinfofile.seek(0)
             tbinfo = tbinfofile.read()
             del exctb
-            self.__send(
-                'EXCEPTION', '?', [str(exctype), str(excval), tbinfo])
-        
+            self.__send("EXCEPTION", "?", [str(exctype), str(excval), tbinfo])
+
         finally:
             # Give time to process latest response on server side
             time.sleep(0.5)
@@ -213,18 +225,21 @@
                 self.connection.shutdown(socket.SHUT_RDWR)
                 self.connection.close()
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     if len(sys.argv) != 5:
-        print('Host, port, max. processes and Python library path parameters'
-              ' are missing. Aborting...')
+        print(
+            "Host, port, max. processes and Python library path parameters"
+            " are missing. Aborting..."
+        )
         sys.exit(1)
-    
+
     host, port, maxProcs, pyLibraryPath = sys.argv[1:]
-    
+
     # insert pyLibraryPath into the search path because external stuff might
     # be installed in the eric (virtual) environment
     sys.path.insert(1, pyLibraryPath)
-    
+
     backgroundClient = BackgroundClient(host, int(port), int(maxProcs))
     # Start the main loop
     backgroundClient.run()
--- a/src/eric7/Utilities/BackgroundService.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/BackgroundService.py	Wed Jul 13 14:55:47 2022 +0200
@@ -29,20 +29,21 @@
 class BackgroundService(QTcpServer):
     """
     Class implementing the main part of the background service.
-    
+
     @signal serviceNotAvailable(function, language, filename, message)
         emitted to indicate the non-availability of a service function
         (str, str, str, str)
     @signal batchJobDone(function, language) emitted to indicate the end of
         a batch job (str, str)
     """
+
     serviceNotAvailable = pyqtSignal(str, str, str, str)
     batchJobDone = pyqtSignal(str, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
@@ -56,32 +57,33 @@
         self.services = {}
 
         networkInterface = Preferences.getDebugger("NetworkInterface")
-        if networkInterface == "all" or '.' in networkInterface:
-            self.hostAddress = '127.0.0.1'
+        if networkInterface == "all" or "." in networkInterface:
+            self.hostAddress = "127.0.0.1"
         else:
-            self.hostAddress = '::1'
+            self.hostAddress = "::1"
         self.listen(QHostAddress(self.hostAddress))
 
         self.newConnection.connect(self.on_newConnection)
-        
+
         port = self.serverPort()
         ## Note: Need the port if started external in debugger:
-        print('Background Service listening on: {0:d}'.format(port))
+        print("Background Service listening on: {0:d}".format(port))
         # __IGNORE_WARNING__
         venvName = Preferences.getDebugger("Python3VirtualEnv")
-        interpreter = ericApp().getObject(
-            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        interpreter = (
+            ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        )
         if not interpreter:
             interpreter = Globals.getPythonExecutable()
         if interpreter:
             process = self.__startExternalClient(interpreter, port)
             if process:
-                self.processes['Python3'] = process, interpreter
+                self.processes["Python3"] = process, interpreter
 
     def __startExternalClient(self, interpreter, port):
         """
         Private method to start the background client as external process.
-        
+
         @param interpreter path and name of the executable to start
         @type str
         @param port socket port to which the interpreter should connect
@@ -91,12 +93,12 @@
         """
         if interpreter == "" or not Utilities.isinpath(interpreter):
             return None
-        
+
         backgroundClient = os.path.join(
-            os.path.dirname(__file__), "BackgroundClient.py")
+            os.path.dirname(__file__), "BackgroundClient.py"
+        )
         proc = QProcess(self)
-        proc.setProcessChannelMode(
-            QProcess.ProcessChannelMode.ForwardedChannels)
+        proc.setProcessChannelMode(QProcess.ProcessChannelMode.ForwardedChannels)
         args = [
             backgroundClient,
             self.hostAddress,
@@ -108,7 +110,7 @@
         if not proc.waitForStarted(10000):
             proc = None
         return proc
-    
+
     def __processQueue(self):
         """
         Private method to take the next service request and send it to the
@@ -119,11 +121,11 @@
             self.isWorking = lang
             self.runningJob = fx, lang, fn, data
             self.__send(fx, lang, fn, data)
-    
+
     def __send(self, fx, lang, fn, data):
         """
         Private method to send a job request to one of the clients.
-        
+
         @param fx remote function name to execute
         @type str
         @param lang language to connect to
@@ -136,30 +138,32 @@
         self.__cancelled = False
         connection = self.connections.get(lang)
         if connection is None:
-            if fx != 'INIT':
+            if fx != "INIT":
                 # Avoid growing recursion depth which could itself result in an
                 # exception
                 QTimer.singleShot(
                     0,
                     lambda: self.serviceNotAvailable.emit(
-                        fx, lang, fn, self.tr(
-                            '{0} not configured.').format(lang)))
+                        fx, lang, fn, self.tr("{0} not configured.").format(lang)
+                    ),
+                )
             # Reset flag and continue processing queue
             self.isWorking = None
             self.__processQueue()
         else:
             packedData = json.dumps([fx, fn, data])
-            packedData = bytes(packedData, 'utf-8')
+            packedData = bytes(packedData, "utf-8")
             header = struct.pack(
-                b'!II', len(packedData), adler32(packedData) & 0xffffffff)
+                b"!II", len(packedData), adler32(packedData) & 0xFFFFFFFF
+            )
             connection.write(header)
-            connection.write(b'JOB   ')    # 6 character message type
+            connection.write(b"JOB   ")  # 6 character message type
             connection.write(packedData)
 
     def __receive(self, lang):
         """
         Private method to receive the response from the clients.
-        
+
         @param lang language of the incoming connection
         @type str
         @exception RuntimeError raised if hashes don't match
@@ -169,34 +173,34 @@
             if self.__cancelled:
                 connection.readAll()
                 continue
-            
-            header = connection.read(struct.calcsize(b'!II'))
-            length, datahash = struct.unpack(b'!II', header)
-            
-            packedData = b''
+
+            header = connection.read(struct.calcsize(b"!II"))
+            length, datahash = struct.unpack(b"!II", header)
+
+            packedData = b""
             while len(packedData) < length:
                 maxSize = length - len(packedData)
                 if connection.bytesAvailable() < maxSize:
                     connection.waitForReadyRead(50)
                 packedData += connection.read(maxSize)
 
-            if adler32(packedData) & 0xffffffff != datahash:
-                raise RuntimeError('Hashes not equal')
-            packedData = packedData.decode('utf-8')
+            if adler32(packedData) & 0xFFFFFFFF != datahash:
+                raise RuntimeError("Hashes not equal")
+            packedData = packedData.decode("utf-8")
             # "check" if is's a tuple of 3 values
             fx, fn, data = json.loads(packedData)
-            
-            if fx == 'INIT':
+
+            if fx == "INIT":
                 if data != "ok":
                     EricMessageBox.critical(
                         None,
                         self.tr("Initialization of Background Service"),
                         self.tr(
                             "<p>Initialization of Background Service"
-                            " <b>{0}</b> failed.</p><p>Reason: {1}</p>")
-                        .format(fn, data)
+                            " <b>{0}</b> failed.</p><p>Reason: {1}</p>"
+                        ).format(fn, data),
                     )
-            elif fx == 'EXCEPTION':
+            elif fx == "EXCEPTION":
                 # Remove connection because it'll close anyway
                 self.connections.pop(lang, None)
                 # Call sys.excepthook(type, value, traceback) to emulate the
@@ -219,26 +223,31 @@
                         "</ul></p>"
                         "<p>Note: The client can be restarted by opening and"
                         " accepting the preferences dialog or reloading/"
-                        "changing the project.</p>").format(lang),
-                    EricMessageBox.Yes |
-                    EricMessageBox.No |
-                    EricMessageBox.Retry,
-                    EricMessageBox.Yes)
-                
+                        "changing the project.</p>"
+                    ).format(lang),
+                    EricMessageBox.Yes | EricMessageBox.No | EricMessageBox.Retry,
+                    EricMessageBox.Yes,
+                )
+
                 if res == EricMessageBox.Retry:
                     self.enqueueRequest(*self.runningJob)
                 else:
                     fx, lng, fn, data = self.runningJob
                     with contextlib.suppress(KeyError, TypeError):
-                        self.services[(fx, lng)][3](fx, lng, fn, self.tr(
-                            "An error in Eric's background client stopped the"
-                            " service.")
+                        self.services[(fx, lng)][3](
+                            fx,
+                            lng,
+                            fn,
+                            self.tr(
+                                "An error in Eric's background client stopped the"
+                                " service."
+                            ),
                         )
                 if res != EricMessageBox.No:
                     self.isWorking = None
                     self.restartService(lang, True)
                     return
-            elif data == 'Unknown service.':
+            elif data == "Unknown service.":
                 callback = self.services.get((fx, lang))
                 if callback:
                     callback[3](fx, lang, fn, data)
@@ -251,7 +260,7 @@
                             callback[2](fn, *data)
                         elif isinstance(data, str):
                             callback[3](fx, lang, fn, data)
-                    if data == 'Unknown batch service.':
+                    if data == "Unknown batch service.":
                         self.batchJobDone.emit(fx, lang)
                         self.__cancelled = True
                 else:
@@ -260,7 +269,7 @@
                 callback = self.services.get((fx, lang))
                 if callback:
                     callback[2](fn, *data)
-        
+
         self.isWorking = None
         self.__processQueue()
 
@@ -269,21 +278,22 @@
         Public slot to restart the built in languages.
         """
         venvName = Preferences.getDebugger("Python3VirtualEnv")
-        interpreter = ericApp().getObject(
-            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        interpreter = (
+            ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        )
         if not interpreter:
             interpreter = Globals.getPythonExecutable()
-        
+
         # Tweak the processes list to reflect the changed interpreter
-        proc, inter = self.processes.pop('Python3', [None, None])
-        self.processes['Python3'] = proc, interpreter
-        
-        self.restartService('Python3')
+        proc, inter = self.processes.pop("Python3", [None, None])
+        self.processes["Python3"] = proc, interpreter
+
+        self.restartService("Python3")
 
     def restartService(self, language, forceKill=False):
         """
         Public method to restart a given language.
-        
+
         @param language to restart
         @type str
         @param forceKill flag to kill a running task
@@ -293,20 +303,20 @@
             proc, interpreter = self.processes.pop(language)
         except KeyError:
             return
-        
+
         # Don't kill a process if it's still working
         if not forceKill:
             while self.isWorking is not None:
                 QThread.msleep(100)
                 QApplication.processEvents()
-        
+
         conn = self.connections.pop(language, None)
         if conn:
             conn.blockSignals(True)
             conn.close()
         if proc:
             proc.close()
-        
+
         if interpreter:
             port = self.serverPort()
             process = self.__startExternalClient(interpreter, port)
@@ -316,10 +326,10 @@
     def enqueueRequest(self, fx, lang, fn, data):
         """
         Public method implementing a queued processing of incoming events.
-        
+
         Duplicate service requests update an older request to avoid overrun or
         starving of the services.
-        
+
         @param fx function name of the service
         @type str
         @param lang language to connect to
@@ -330,7 +340,7 @@
         @type any basic datatype
         """
         args = [fx, lang, fn, data]
-        if fx == 'INIT':
+        if fx == "INIT":
             self.__queue.insert(0, args)
         else:
             for pendingArg in self.__queue:
@@ -342,40 +352,47 @@
             else:
                 self.__queue.append(args)
         self.__processQueue()
-    
+
     def requestCancel(self, fx, lang):
         """
         Public method to ask a batch job to terminate.
-        
+
         @param fx function name of the service
         @type str
         @param lang language to connect to
         @type str
         """
         self.__cancelled = True
-        
+
         entriesToRemove = []
         for pendingArg in self.__queue:
             if pendingArg[:2] == [fx, lang]:
                 entriesToRemove.append(pendingArg)
         for entryToRemove in entriesToRemove:
             self.__queue.remove(entryToRemove)
-        
+
         connection = self.connections.get(lang)
         if connection is None:
             return
         else:
-            header = struct.pack(b'!II', 0, 0)
+            header = struct.pack(b"!II", 0, 0)
             connection.write(header)
-            connection.write(b'CANCEL')    # 6 character message type
-    
+            connection.write(b"CANCEL")  # 6 character message type
+
     def serviceConnect(
-            self, fx, lang, modulepath, module, callback,
-            onErrorCallback=None, onBatchDone=None):
+        self,
+        fx,
+        lang,
+        modulepath,
+        module,
+        callback,
+        onErrorCallback=None,
+        onBatchDone=None,
+    ):
         """
         Public method to announce a new service to the background
         service/client.
-        
+
         @param fx function name of the service
         @type str
         @param lang language of the new service
@@ -391,19 +408,17 @@
         @param onBatchDone function called when a batch job is done
         @type function
         """
-        self.services[(fx, lang)] = (
-            modulepath, module, callback, onErrorCallback
-        )
-        self.enqueueRequest('INIT', lang, fx, [modulepath, module])
+        self.services[(fx, lang)] = (modulepath, module, callback, onErrorCallback)
+        self.enqueueRequest("INIT", lang, fx, [modulepath, module])
         if onErrorCallback:
             self.serviceNotAvailable.connect(onErrorCallback)
         if onBatchDone:
             self.batchJobDone.connect(onBatchDone)
-    
+
     def serviceDisconnect(self, fx, lang):
         """
         Public method to remove the service from the service list.
-        
+
         @param fx function name of the service
         @type function
         @param lang language of the service
@@ -421,23 +436,21 @@
         if not connection.waitForReadyRead(1000):
             return
         lang = connection.read(64)
-        lang = lang.decode('utf-8')
+        lang = lang.decode("utf-8")
         # Avoid hanging of eric on shutdown
         if self.connections.get(lang):
             self.connections[lang].close()
         if self.isWorking == lang:
             self.isWorking = None
         self.connections[lang] = connection
-        connection.readyRead.connect(
-            lambda: self.__receive(lang))
-        connection.disconnected.connect(
-            lambda: self.on_disconnectSocket(lang))
-            
+        connection.readyRead.connect(lambda: self.__receive(lang))
+        connection.disconnected.connect(lambda: self.on_disconnectSocket(lang))
+
         for (fx, lng), args in self.services.items():
             if lng == lang:
                 # Register service with modulepath and module
-                self.enqueueRequest('INIT', lng, fx, args[:2])
-        
+                self.enqueueRequest("INIT", lng, fx, args[:2])
+
         # Syntax check the open editors again
         try:
             vm = ericApp().getObject("ViewManager")
@@ -450,7 +463,7 @@
     def on_disconnectSocket(self, lang):
         """
         Private slot called when connection to a client is lost.
-        
+
         @param lang client language which connection is lost
         @type str
         """
@@ -458,21 +471,27 @@
         if conn:
             conn.close()
             fx, lng, fn, data = self.runningJob
-            if fx != 'INIT' and lng == lang:
-                self.services[(fx, lng)][3](fx, lng, fn, self.tr(
-                    "Eric's background client disconnected because of an"
-                    " unknown reason.")
+            if fx != "INIT" and lng == lang:
+                self.services[(fx, lng)][3](
+                    fx,
+                    lng,
+                    fn,
+                    self.tr(
+                        "Eric's background client disconnected because of an"
+                        " unknown reason."
+                    ),
                 )
             self.isWorking = None
-            
+
             res = EricMessageBox.yesNo(
                 None,
-                self.tr('Background client disconnected.'),
+                self.tr("Background client disconnected."),
                 self.tr(
-                    'The background client for <b>{0}</b> disconnected because'
-                    ' of an unknown reason.<br>Should it be restarted?'
+                    "The background client for <b>{0}</b> disconnected because"
+                    " of an unknown reason.<br>Should it be restarted?"
                 ).format(lang),
-                yesDefault=True)
+                yesDefault=True,
+            )
             if res:
                 self.restartService(lang)
 
@@ -482,13 +501,13 @@
         shutting down.
         """
         self.close()
-        
+
         for connection in self.connections.values():
             connection.readyRead.disconnect()
             connection.disconnected.disconnect()
             connection.close()
             connection.deleteLater()
-        
+
         for process, _interpreter in self.processes.values():
             process.close()
             if not process.waitForFinished(10000):
--- a/src/eric7/Utilities/ClassBrowsers/ClbrBaseClasses.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/ClbrBaseClasses.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,11 @@
     """
     Class implementing the base of all class browser objects.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this object
         @type str
         @param name name of this object
@@ -29,12 +30,12 @@
         self.name = name
         self.file = file
         self.lineno = lineno
-        self.endlineno = -1     # marker for "not set"
-        
+        self.endlineno = -1  # marker for "not set"
+
     def setEndLine(self, endLineNo):
         """
         Public method to set the ending line number.
-        
+
         @param endLineNo number of the last line
         @type int
         """
@@ -45,10 +46,11 @@
     """
     Class implementing the base of all complex class browser objects.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this object
         @type str
         @param name name of this object
@@ -63,22 +65,22 @@
         self.attributes = {}
         self.classes = {}
         self.globals = {}
-        
+
     def _addmethod(self, name, function):
         """
         Protected method to add information about a method.
-        
+
         @param name name of method to be added
         @type str
         @param function Function object to be added
         @type Function
         """
         self.methods[name] = function
-        
+
     def _getmethod(self, name):
         """
         Protected method to retrieve a method by name.
-        
+
         @param name name of the method (string)
         @type str
         @return the named method
@@ -88,11 +90,11 @@
             return self.methods[name]
         except KeyError:
             return None
-        
+
     def _addglobal(self, attr):
         """
         Protected method to add information about global variables.
-        
+
         @param attr Attribute object to be added
         @type Attribute
         """
@@ -100,11 +102,11 @@
             self.globals[attr.name] = attr
         else:
             self.globals[attr.name].addAssignment(attr.lineno)
-        
+
     def _getglobal(self, name):
         """
         Protected method to retrieve a global variable by name.
-        
+
         @param name name of the global variable
         @type str
         @return the named global variable
@@ -114,11 +116,11 @@
             return self.globals[name]
         except KeyError:
             return None
-        
+
     def _addattribute(self, attr):
         """
         Protected method to add information about attributes.
-        
+
         @param attr Attribute object to be added
         @type Attribute
         """
@@ -126,11 +128,11 @@
             self.attributes[attr.name] = attr
         else:
             self.attributes[attr.name].addAssignment(attr.lineno)
-        
+
     def _getattribute(self, name):
         """
         Protected method to retrieve an attribute by name.
-        
+
         @param name name of the attribute
         @type str
         @return the named attribute
@@ -140,11 +142,11 @@
             return self.attributes[name]
         except KeyError:
             return None
-        
+
     def _addclass(self, name, _class):
         """
         Protected method method to add a nested class to this class.
-        
+
         @param name name of the class
         @type str
         @param _class Class object to be added
@@ -157,45 +159,46 @@
     """
     Class implementing the base class of all visibility mixins.
     """
+
     def isPrivate(self):
         """
         Public method to check, if the visibility is Private.
-        
+
         @return flag indicating Private visibility
         @rtype bool
         """
         return self.visibility == 0
-        
+
     def isProtected(self):
         """
         Public method to check, if the visibility is Protected.
-        
+
         @return flag indicating Protected visibility
         @rtype bool
         """
         return self.visibility == 1
-        
+
     def isPublic(self):
         """
         Public method to check, if the visibility is Public.
-        
+
         @return flag indicating Public visibility
         @rtype bool
         """
         return self.visibility == 2
-        
+
     def setPrivate(self):
         """
         Public method to set the visibility to Private.
         """
         self.visibility = 0
-        
+
     def setProtected(self):
         """
         Public method to set the visibility to Protected.
         """
         self.visibility = 1
-        
+
     def setPublic(self):
         """
         Public method to set the visibility to Public.
@@ -207,10 +210,11 @@
     """
     Class to represent an attribute.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this attribute
         @type str
         @param name name of this attribute
@@ -221,13 +225,13 @@
         @type int
         """
         _ClbrBase.__init__(self, module, name, file, lineno)
-        
+
         self.linenos = [lineno]
-    
+
     def addAssignment(self, lineno):
         """
         Public method to add another assignment line number.
-        
+
         @param lineno line number of the additional attribute assignment
         @type int
         """
@@ -239,10 +243,11 @@
     """
     Class to represent a class.
     """
+
     def __init__(self, module, name, superClasses, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @type str
         @param name name of this class
@@ -264,10 +269,11 @@
     """
     Class to represent a module.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this module
         @type str
         @param name name of this module
@@ -284,15 +290,25 @@
     """
     Class to represent a function or method.
     """
+
     General = 0
     Static = 1
     Class = 2
-    
-    def __init__(self, module, name, file, lineno, signature='', separator=',',
-                 modifierType=General, annotation=""):
+
+    def __init__(
+        self,
+        module,
+        name,
+        file,
+        lineno,
+        signature="",
+        separator=",",
+        modifierType=General,
+        annotation="",
+    ):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @type str
         @param name name of this function
@@ -320,10 +336,11 @@
     """
     Class to represent a source coding.
     """
+
     def __init__(self, module, file, lineno, coding):
         """
         Constructor
-        
+
         @param module name of the module containing this coding statement
         @type str
         @param file filename containing this coding statement
@@ -342,10 +359,11 @@
     """
     Class to represent an enum definition.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this enum
         @type str
         @param name name of this enum
--- a/src/eric7/Utilities/ClassBrowsers/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -30,8 +30,14 @@
 JS_SOURCE = 131
 PROTO_SOURCE = 132
 
-SUPPORTED_TYPES = [PY_SOURCE, PTL_SOURCE, RB_SOURCE, IDL_SOURCE, JS_SOURCE,
-                   PROTO_SOURCE]
+SUPPORTED_TYPES = [
+    PY_SOURCE,
+    PTL_SOURCE,
+    RB_SOURCE,
+    IDL_SOURCE,
+    JS_SOURCE,
+    PROTO_SOURCE,
+]
 
 __extensions = {
     "IDL": [".idl"],
@@ -46,7 +52,7 @@
     """
     Read a source file and return a dictionary of classes, functions, modules,
     etc. .
-    
+
     The real work of parsing the source file is delegated to the individual
     file parsers.
 
@@ -61,48 +67,51 @@
     """
     ext = os.path.splitext(module)[1].lower()
     path = [] if path is None else path[:]
-    
+
     if ext in __extensions["IDL"]:
         from . import idlclbr
+
         dictionary = idlclbr.readmodule_ex(module, path)
         idlclbr._modules.clear()
     elif ext in __extensions["ProtoBuf"]:
         from . import protoclbr
+
         dictionary = protoclbr.readmodule_ex(module, path)
         protoclbr._modules.clear()
     elif ext in __extensions["Ruby"]:
         from . import rbclbr
+
         dictionary = rbclbr.readmodule_ex(module, path)
         rbclbr._modules.clear()
     elif ext in __extensions["JavaScript"]:
         from . import jsclbr
+
         dictionary = jsclbr.readmodule_ex(module, path)
         jsclbr._modules.clear()
-    elif (
-        ext in Preferences.getPython("Python3Extensions") or
-        isPyFile
-    ):
+    elif ext in Preferences.getPython("Python3Extensions") or isPyFile:
         from . import pyclbr
+
         dictionary = pyclbr.readmodule_ex(module, path, isPyFile=isPyFile)
         pyclbr._modules.clear()
     else:
         # try Python if it is without extension
         from . import pyclbr
+
         dictionary = pyclbr.readmodule_ex(module, path)
         pyclbr._modules.clear()
-    
+
     return dictionary
 
 
 def find_module(name, path, isPyFile=False):
     """
     Module function to extend the Python module finding mechanism.
-    
+
     This function searches for files in the given list of paths. If the
     file name doesn't have an extension or an extension of .py, the normal
     Python search implemented in the imp module is used. For all other
     supported files only the paths list is searched.
-    
+
     @param name file name or module name to search for
     @type str
     @param path search paths
@@ -115,69 +124,68 @@
     @exception ImportError The file or module wasn't found.
     """
     ext = os.path.splitext(name)[1].lower()
-    
+
     if ext in __extensions["Ruby"]:
-        for p in path:      # only search in path
-            pathname = os.path.join(p, name)
-            if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', RB_SOURCE))
-                # __IGNORE_WARNING_Y115__
-        raise ImportError
-    
-    elif ext in __extensions["IDL"]:
-        for p in path:      # only search in path
+        for p in path:  # only search in path
             pathname = os.path.join(p, name)
             if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', IDL_SOURCE))
+                return (open(pathname), pathname, (ext, "r", RB_SOURCE))
                 # __IGNORE_WARNING_Y115__
         raise ImportError
-    
-    elif ext in __extensions["ProtoBuf"]:
-        for p in path:      # only search in path
+
+    elif ext in __extensions["IDL"]:
+        for p in path:  # only search in path
             pathname = os.path.join(p, name)
             if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', PROTO_SOURCE))
+                return (open(pathname), pathname, (ext, "r", IDL_SOURCE))
                 # __IGNORE_WARNING_Y115__
         raise ImportError
-    
-    elif ext in __extensions["JavaScript"]:
-        for p in path:      # only search in path
+
+    elif ext in __extensions["ProtoBuf"]:
+        for p in path:  # only search in path
             pathname = os.path.join(p, name)
             if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', JS_SOURCE))
+                return (open(pathname), pathname, (ext, "r", PROTO_SOURCE))
                 # __IGNORE_WARNING_Y115__
         raise ImportError
-    
-    elif ext == '.ptl':
-        for p in path:      # only search in path
+
+    elif ext in __extensions["JavaScript"]:
+        for p in path:  # only search in path
             pathname = os.path.join(p, name)
             if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', PTL_SOURCE))
+                return (open(pathname), pathname, (ext, "r", JS_SOURCE))
                 # __IGNORE_WARNING_Y115__
         raise ImportError
-    
-    elif (
-        name.lower().endswith(
-            tuple(Preferences.getPython("Python3Extensions"))) or
-        isPyFile
-    ):
-        for p in path:      # search in path
+
+    elif ext == ".ptl":
+        for p in path:  # only search in path
             pathname = os.path.join(p, name)
             if os.path.exists(pathname):
-                return (open(pathname), pathname, (ext, 'r', PY_SOURCE))
+                return (open(pathname), pathname, (ext, "r", PTL_SOURCE))
+                # __IGNORE_WARNING_Y115__
+        raise ImportError
+
+    elif (
+        name.lower().endswith(tuple(Preferences.getPython("Python3Extensions")))
+        or isPyFile
+    ):
+        for p in path:  # search in path
+            pathname = os.path.join(p, name)
+            if os.path.exists(pathname):
+                return (open(pathname), pathname, (ext, "r", PY_SOURCE))
                 # __IGNORE_WARNING_Y115__
     raise ImportError
-    
+
     # standard Python module file
-    if name.lower().endswith('.py'):
+    if name.lower().endswith(".py"):
         name = name[:-3]
-    
+
     spec = importlib.machinery.PathFinder.find_spec(name, path)
     if spec is None:
         raise ImportError
     if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
         ext = os.path.splitext(spec.origin)[-1]
-        return (open(spec.origin), spec.origin, (ext, 'r', PY_SOURCE))
+        return (open(spec.origin), spec.origin, (ext, "r", PY_SOURCE))
         # __IGNORE_WARNING_Y115__
-    
+
     raise ImportError
--- a/src/eric7/Utilities/ClassBrowsers/idlclbr.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/idlclbr.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 from . import ClbrBaseClasses
 
 SUPPORTED_TYPES = [ClassBrowsers.IDL_SOURCE]
-    
+
 _getnext = re.compile(
     r"""
     (?P<String>
@@ -83,20 +83,22 @@
 |   (?P<End>
         [ \t]* } [ \t]* ;
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 # function to replace comments
 _commentsub = re.compile(r"""//[^\n]*\n|//[^\n]*$""").sub
 # function to normalize whitespace
 _normalize = re.compile(r"""[ \t]{2,}""").sub
 
-_modules = {}                           # cache of modules we've seen
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
     """
     Mixin class implementing the notion of visibility.
     """
+
     def __init__(self):
         """
         Constructor
@@ -108,10 +110,11 @@
     """
     Class to represent a CORBA IDL module.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this module
         @type str
         @param name name of this module
@@ -129,10 +132,11 @@
     """
     Class to represent a CORBA IDL interface.
     """
+
     def __init__(self, module, name, superClasses, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this interface
         @type str
         @param name name of this interface
@@ -145,8 +149,7 @@
         @param lineno line number of the interface definition
         @type int
         """
-        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file,
-                                       lineno)
+        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file, lineno)
         VisibilityMixin.__init__(self)
 
 
@@ -154,11 +157,11 @@
     """
     Class to represent a CORBA IDL function.
     """
-    def __init__(self, module, name, file, lineno, signature='',
-                 separator=','):
+
+    def __init__(self, module, name, file, lineno, signature="", separator=","):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @type str
         @param name name of this function
@@ -172,8 +175,9 @@
         @param separator string separating the parameters
         @type str
         """
-        ClbrBaseClasses.Function.__init__(self, module, name, file, lineno,
-                                          signature, separator)
+        ClbrBaseClasses.Function.__init__(
+            self, module, name, file, lineno, signature, separator
+        )
         VisibilityMixin.__init__(self)
 
 
@@ -181,10 +185,11 @@
     """
     Class to represent a CORBA IDL attribute.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this attribute
         @type str
         @param name name of this attribute
@@ -211,7 +216,7 @@
     @rtype dict
     """
     global _modules
-    
+
     if module in _modules:
         # we've seen this file before...
         return _modules[module]
@@ -233,7 +238,7 @@
         # can't do anything with this module
         _modules[module] = {}
         return {}
-    
+
     _modules[module] = scan(src, file, module)
     return _modules[module]
 
@@ -241,7 +246,7 @@
 def scan(src, file, module):
     """
     Public method to scan the given source text.
-    
+
     @param src source text to be scanned
     @type str
     @param file file name associated with the source text
@@ -251,10 +256,11 @@
     @return dictionary containing the extracted data
     @rtype dict
     """
+
     def calculateEndline(lineno, lines):
         """
         Function to calculate the end line.
-        
+
         @param lineno line number to start at (one based)
         @type int
         @param lines list of source lines
@@ -278,11 +284,11 @@
         else:
             # nothing found
             return -1
-    
+
     def calculateMethodEndline(lineno, lines):
         """
         Function to calculate the end line.
-        
+
         @param lineno line number to start at (one based)
         @type int
         @param lines list of source lines
@@ -299,7 +305,7 @@
             return lineno + 1
         else:
             return -1
-    
+
     # convert eol markers the Python style
     src = src.replace("\r\n", "\n").replace("\r", "\n")
     srcLines = src.splitlines()
@@ -309,7 +315,7 @@
 
     classstack = []  # stack of (class, indent) pairs
     indent = 0
-    
+
     lineno, last_lineno_pos = 1, 0
     i = 0
     while True:
@@ -323,10 +329,10 @@
             thisindent = indent
             meth_name = m.group("MethodName")
             meth_sig = m.group("MethodSignature")
-            meth_sig = meth_sig and meth_sig.replace('\\\n', '') or ''
-            meth_sig = _commentsub('', meth_sig)
-            meth_sig = _normalize(' ', meth_sig)
-            lineno += src.count('\n', last_lineno_pos, start)
+            meth_sig = meth_sig and meth_sig.replace("\\\n", "") or ""
+            meth_sig = _commentsub("", meth_sig)
+            meth_sig = _normalize(" ", meth_sig)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             # close all interfaces/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
@@ -336,20 +342,17 @@
                 cur_class = classstack[-1][0]
                 if isinstance(cur_class, (Interface, Module)):
                     # it's a method
-                    f = Function(None, meth_name,
-                                 file, lineno, meth_sig)
+                    f = Function(None, meth_name, file, lineno, meth_sig)
                     cur_class._addmethod(meth_name, f)
                 # else it's a nested def
                 else:
                     f = None
             else:
                 # it's a function
-                f = Function(module, meth_name,
-                             file, lineno, meth_sig)
+                f = Function(module, meth_name, file, lineno, meth_sig)
                 if meth_name in dict_counts:
                     dict_counts[meth_name] += 1
-                    meth_name = "{0}_{1:d}".format(
-                        meth_name, dict_counts[meth_name])
+                    meth_name = "{0}_{1:d}".format(meth_name, dict_counts[meth_name])
                 else:
                     dict_counts[meth_name] = 0
                 dictionary[meth_name] = f
@@ -368,17 +371,16 @@
             # close all interfaces/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
                 del classstack[-1]
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             class_name = m.group("InterfaceName")
             inherit = m.group("InterfaceSupers")
             if inherit:
                 # the interface inherits from other interfaces
                 inherit = inherit[1:].strip()
-                inherit = [_commentsub('', inherit)]
+                inherit = [_commentsub("", inherit)]
             # remember this interface
-            cur_class = Interface(module, class_name, inherit,
-                                  file, lineno)
+            cur_class = Interface(module, class_name, inherit, file, lineno)
             endline = calculateEndline(lineno, srcLines)
             cur_class.setEndLine(endline)
             if not classstack:
@@ -395,7 +397,7 @@
             # close all interfaces/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
                 del classstack[-1]
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             module_name = m.group("ModuleName")
             # remember this module
@@ -407,16 +409,16 @@
             classstack.append((cur_class, thisindent))
 
         elif m.start("Attribute") >= 0:
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             index = -1
             while index >= -len(classstack):
                 if (
-                    classstack[index][0] is not None and
-                    not isinstance(classstack[index][0], Function) and
-                    classstack[index][1] < indent
+                    classstack[index][0] is not None
+                    and not isinstance(classstack[index][0], Function)
+                    and classstack[index][1] < indent
                 ):
-                    attributes = m.group("AttributeNames").split(',')
+                    attributes = m.group("AttributeNames").split(",")
                     ro = m.group("AttributeReadonly")
                     for attribute in attributes:
                         attr = Attribute(module, attribute, file, lineno)
--- a/src/eric7/Utilities/ClassBrowsers/jsclbr.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/jsclbr.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,21 +17,22 @@
 from . import ClbrBaseClasses
 
 SUPPORTED_TYPES = [ClassBrowsers.JS_SOURCE]
-    
-_modules = {}   # cache of modules we've seen
+
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
     """
     Mixin class implementing the notion of visibility.
     """
+
     def __init__(self):
         """
         Constructor
         """
-        if self.name.startswith('__'):
+        if self.name.startswith("__"):
             self.setPrivate()
-        elif self.name.startswith('_'):
+        elif self.name.startswith("_"):
             self.setProtected()
         else:
             self.setPublic()
@@ -41,11 +42,11 @@
     """
     Class to represent a Python function.
     """
-    def __init__(self, module, name, file, lineno, signature='',
-                 separator=','):
+
+    def __init__(self, module, name, file, lineno, signature="", separator=","):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @param name name of this function
         @param file filename containing this class
@@ -53,8 +54,9 @@
         @param signature parameterlist of the method
         @param separator string separating the parameters
         """
-        ClbrBaseClasses.Function.__init__(self, module, name, file, lineno,
-                                          signature, separator)
+        ClbrBaseClasses.Function.__init__(
+            self, module, name, file, lineno, signature, separator
+        )
         VisibilityMixin.__init__(self)
 
 
@@ -62,10 +64,11 @@
     """
     Class to represent a class attribute.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param file filename containing this attribute
@@ -79,10 +82,11 @@
     """
     Class implementing a visitor going through the parsed tree.
     """
+
     def __init__(self, src, module, filename):
         """
         Constructor
-        
+
         @param src source to be parsed (string)
         @param module name of the module (string)
         @param filename file name (string)
@@ -91,22 +95,22 @@
         self.__dict_counts = {}
         self.__root = None
         self.__stack = []
-        
+
         self.__module = module
         self.__file = filename
         self.__source = src
-        
+
         # normalize line endings
         self.__source = self.__source.replace("\r\n", "\n").replace("\r", "\n")
-        
+
         # ensure source ends with an eol
-        if bool(self.__source) and self.__source[-1] != '\n':
-            self.__source = self.__source + '\n'
-    
+        if bool(self.__source) and self.__source[-1] != "\n":
+            self.__source = self.__source + "\n"
+
     def parse(self):
         """
         Public method to parse the source.
-        
+
         @return dictionary containing the parsed information
         """
         try:
@@ -118,28 +122,28 @@
         except jsTokenizer.ParseError:
             # ignore syntax errors of the tokenizer
             pass
-        
+
         return self.__dict
-    
+
     def __visit(self, root):
         """
         Private method implementing the visit logic delegating to interesting
         methods.
-        
+
         @param root root node to visit
         """
+
         def call(n):
-            getattr(self, "visit_{0}".format(n.type),
-                    self.visit_noop)(n)
-        
+            getattr(self, "visit_{0}".format(n.type), self.visit_noop)(n)
+
         call(root)
         for node in root:
             self.__visit(node)
-    
+
     def visit_noop(self, node):
         """
         Public method to ignore the given node.
-        
+
         @param node reference to the node (jasy.script.parse.Node.Node)
         """
         pass
@@ -147,18 +151,17 @@
     def visit_function(self, node):
         """
         Public method to treat a function node.
-        
+
         @param node reference to the node (jasy.script.parse.Node.Node)
         """
         if (
-            node.type == "function" and
-            getattr(node, "name", None) and
-            node.functionForm == "declared_form"
+            node.type == "function"
+            and getattr(node, "name", None)
+            and node.functionForm == "declared_form"
         ):
             if self.__stack and self.__stack[-1].endlineno < node.line:
                 del self.__stack[-1]
-            endline = node.line + self.__source.count(
-                '\n', node.start, node.end)
+            endline = node.line + self.__source.count("\n", node.start, node.end)
             if getattr(node, "params", None):
                 func_sig = ", ".join([p.value for p in node.params])
             else:
@@ -166,19 +169,18 @@
             if self.__stack:
                 # it's a nested function
                 cur_func = self.__stack[-1]
-                f = Function(None, node.name,
-                             self.__file, node.line, func_sig)
+                f = Function(None, node.name, self.__file, node.line, func_sig)
                 f.setEndLine(endline)
                 cur_func._addmethod(node.name, f)
             else:
-                f = Function(self.__module, node.name,
-                             self.__file, node.line, func_sig)
+                f = Function(self.__module, node.name, self.__file, node.line, func_sig)
                 f.setEndLine(endline)
                 func_name = node.name
                 if func_name in self.__dict_counts:
                     self.__dict_counts[func_name] += 1
                     func_name = "{0}_{1:d}".format(
-                        func_name, self.__dict_counts[func_name])
+                        func_name, self.__dict_counts[func_name]
+                    )
                 else:
                     self.__dict_counts[func_name] = 0
                 self.__dict[func_name] = f
@@ -187,14 +189,13 @@
     def visit_property_init(self, node):
         """
         Public method to treat a property_init node.
-        
+
         @param node reference to the node (jasy.script.parse.Node.Node)
         """
         if node.type == "property_init" and node[1].type == "function":
             if self.__stack and self.__stack[-1].endlineno < node[0].line:
                 del self.__stack[-1]
-            endline = node[0].line + self.__source.count(
-                '\n', node.start, node[1].end)
+            endline = node[0].line + self.__source.count("\n", node.start, node[1].end)
             if getattr(node[1], "params", None):
                 func_sig = ", ".join([p.value for p in node[1].params])
             else:
@@ -202,34 +203,64 @@
             if self.__stack:
                 # it's a nested function
                 cur_func = self.__stack[-1]
-                f = Function(None, node[0].value,
-                             self.__file, node[0].line, func_sig)
+                f = Function(None, node[0].value, self.__file, node[0].line, func_sig)
                 f.setEndLine(endline)
                 cur_func._addmethod(node[0].value, f)
             else:
-                f = Function(self.__module, node[0].value,
-                             self.__file, node[0].line, func_sig)
+                f = Function(
+                    self.__module, node[0].value, self.__file, node[0].line, func_sig
+                )
                 f.setEndLine(endline)
                 func_name = node[0].value
                 if func_name in self.__dict_counts:
                     self.__dict_counts[func_name] += 1
                     func_name = "{0}_{1:d}".format(
-                        func_name, self.__dict_counts[func_name])
+                        func_name, self.__dict_counts[func_name]
+                    )
                 else:
                     self.__dict_counts[func_name] = 0
                 self.__dict[func_name] = f
             self.__stack.append(f)
-    
+
     def visit_var(self, node):
         """
         Public method to treat a variable node.
-        
+
         @param node reference to the node (jasy.script.parse.Node.Node)
         """
         if (
-            node.type == "var" and
-            node.parent.type == "script" and
-            node.getChildrenLength()
+            node.type == "var"
+            and node.parent.type == "script"
+            and node.getChildrenLength()
+        ):
+            if self.__stack and self.__stack[-1].endlineno < node[0].line:
+                del self.__stack[-1]
+            if self.__stack:
+                # function variables
+                for var in node:
+                    attr = Attribute(self.__module, var.name, self.__file, var.line)
+                    self.__stack[-1]._addattribute(attr)
+            else:
+                # global variable
+                if "@@Globals@@" not in self.__dict:
+                    self.__dict["@@Globals@@"] = ClbrBaseClasses.ClbrBase(
+                        self.__module, "Globals", self.__file, 0
+                    )
+                for var in node:
+                    self.__dict["@@Globals@@"]._addglobal(
+                        Attribute(self.__module, var.name, self.__file, var.line)
+                    )
+
+    def visit_const(self, node):
+        """
+        Public method to treat a constant node.
+
+        @param node reference to the node (jasy.script.parse.Node.Node)
+        """
+        if (
+            node.type == "const"
+            and node.parent.type == "script"
+            and node.getChildrenLength()
         ):
             if self.__stack and self.__stack[-1].endlineno < node[0].line:
                 del self.__stack[-1]
@@ -237,45 +268,21 @@
                 # function variables
                 for var in node:
                     attr = Attribute(
-                        self.__module, var.name, self.__file, var.line)
+                        self.__module, "const " + var.name, self.__file, var.line
+                    )
                     self.__stack[-1]._addattribute(attr)
             else:
                 # global variable
                 if "@@Globals@@" not in self.__dict:
                     self.__dict["@@Globals@@"] = ClbrBaseClasses.ClbrBase(
-                        self.__module, "Globals", self.__file, 0)
-                for var in node:
-                    self.__dict["@@Globals@@"]._addglobal(Attribute(
-                        self.__module, var.name, self.__file, var.line))
-    
-    def visit_const(self, node):
-        """
-        Public method to treat a constant node.
-        
-        @param node reference to the node (jasy.script.parse.Node.Node)
-        """
-        if (
-            node.type == "const" and
-            node.parent.type == "script" and
-            node.getChildrenLength()
-        ):
-            if self.__stack and self.__stack[-1].endlineno < node[0].line:
-                del self.__stack[-1]
-            if self.__stack:
-                # function variables
-                for var in node:
-                    attr = Attribute(self.__module, "const " + var.name,
-                                     self.__file, var.line)
-                    self.__stack[-1]._addattribute(attr)
-            else:
-                # global variable
-                if "@@Globals@@" not in self.__dict:
-                    self.__dict["@@Globals@@"] = ClbrBaseClasses.ClbrBase(
-                        self.__module, "Globals", self.__file, 0)
+                        self.__module, "Globals", self.__file, 0
+                    )
                 for var in node:
                     self.__dict["@@Globals@@"]._addglobal(
-                        Attribute(self.__module, "const " + var.name,
-                                  self.__file, var.line))
+                        Attribute(
+                            self.__module, "const " + var.name, self.__file, var.line
+                        )
+                    )
 
 
 def readmodule_ex(module, path=None):
@@ -287,7 +294,7 @@
     @return the resulting dictionary
     """
     global _modules
-    
+
     if module in _modules:
         # we've seen this file before...
         return _modules[module]
@@ -309,7 +316,7 @@
         # can't do anything with this module
         _modules[module] = {}
         return {}
-    
+
     _modules[module] = scan(src, file, module)
     return _modules[module]
 
@@ -317,7 +324,7 @@
 def scan(src, file, module):
     """
     Public method to scan the given source text.
-    
+
     @param src source text to be scanned
     @type str
     @param file file name associated with the source text
@@ -329,7 +336,7 @@
     """
     # convert eol markers the Python style
     src = src.replace("\r\n", "\n").replace("\r", "\n")
-    
+
     dictionary = {}
 
     visitor = Visitor(src, module, file)
--- a/src/eric7/Utilities/ClassBrowsers/protoclbr.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/protoclbr.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,7 @@
 from . import ClbrBaseClasses
 
 SUPPORTED_TYPES = [ClassBrowsers.PROTO_SOURCE]
-    
+
 _getnext = re.compile(
     r"""
     (?P<String>
@@ -79,20 +79,22 @@
 |   (?P<End>
         [ \t]* } [ \t]* ;?
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 # function to replace comments
 _commentsub = re.compile(r"""//[^\n]*\n|//[^\n]*$""").sub
 # function to normalize whitespace
 _normalize = re.compile(r"""[ \t]{2,}""").sub
 
-_modules = {}                           # cache of modules we've seen
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
     """
     Mixin class implementing the notion of visibility.
     """
+
     def __init__(self):
         """
         Constructor
@@ -104,10 +106,11 @@
     """
     Class to represent a ProtoBuf Message.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this message
         @type str
         @param name name of this message
@@ -125,10 +128,11 @@
     """
     Class to represent a ProtoBuf Enum.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this enum
         @type str
         @param name name of this enum
@@ -146,10 +150,11 @@
     """
     Class to represent a ProtoBuf Service.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this service
         @type str
         @param name name of this service
@@ -159,8 +164,7 @@
         @param lineno linenumber of the service definition
         @type int
         """
-        ClbrBaseClasses.Class.__init__(self, module, name, None, file,
-                                       lineno)
+        ClbrBaseClasses.Class.__init__(self, module, name, None, file, lineno)
         VisibilityMixin.__init__(self)
 
 
@@ -168,10 +172,11 @@
     """
     Class to represent a ProtoBuf Service Method.
     """
+
     def __init__(self, name, file, lineno, signature, returns):
         """
         Constructor
-        
+
         @param name name of this service method
         @type str
         @param file filename containing this service method
@@ -183,9 +188,15 @@
         @param returns return type of the service method
         @type str
         """
-        ClbrBaseClasses.Function.__init__(self, None, name, file, lineno,
-                                          signature,
-                                          annotation="-> {0}".format(returns))
+        ClbrBaseClasses.Function.__init__(
+            self,
+            None,
+            name,
+            file,
+            lineno,
+            signature,
+            annotation="-> {0}".format(returns),
+        )
         VisibilityMixin.__init__(self)
 
 
@@ -202,7 +213,7 @@
     @rtype dict
     """
     global _modules
-    
+
     if module in _modules:
         # we've seen this file before...
         return _modules[module]
@@ -224,7 +235,7 @@
         # can't do anything with this module
         _modules[module] = {}
         return {}
-    
+
     _modules[module] = scan(src, file, module)
     return _modules[module]
 
@@ -232,7 +243,7 @@
 def scan(src, file, module):
     """
     Public method to scan the given source text.
-    
+
     @param src source text to be scanned
     @type str
     @param file file name associated with the source text
@@ -242,10 +253,11 @@
     @return dictionary containing the extracted data
     @rtype dict
     """
+
     def calculateEndline(lineno, lines):
         """
         Function to calculate the end line.
-        
+
         @param lineno line number to start at (one based)
         @type int
         @param lines list of source lines
@@ -269,7 +281,7 @@
         else:
             # nothing found
             return -1
-    
+
     # convert eol markers the Python style
     src = src.replace("\r\n", "\n").replace("\r", "\n")
     srcLines = src.splitlines()
@@ -292,14 +304,14 @@
             thisindent = indent
             meth_name = m.group("MethodName")
             meth_sig = m.group("MethodSignature")
-            meth_sig = meth_sig and meth_sig.replace('\\\n', '') or ''
-            meth_sig = _commentsub('', meth_sig)
-            meth_sig = _normalize(' ', meth_sig)
+            meth_sig = meth_sig and meth_sig.replace("\\\n", "") or ""
+            meth_sig = _commentsub("", meth_sig)
+            meth_sig = _normalize(" ", meth_sig)
             meth_return = m.group("MethodReturn")
-            meth_return = meth_return and meth_return.replace('\\\n', '') or ''
-            meth_return = _commentsub('', meth_return)
-            meth_return = _normalize(' ', meth_return)
-            lineno += src.count('\n', last_lineno_pos, start)
+            meth_return = meth_return and meth_return.replace("\\\n", "") or ""
+            meth_return = _commentsub("", meth_return)
+            meth_return = _normalize(" ", meth_return)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             # close all interfaces/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
@@ -309,8 +321,7 @@
                 cur_class = classstack[-1][0]
                 if isinstance(cur_class, Service):
                     # it's a method
-                    f = ServiceMethod(meth_name, file, lineno, meth_sig,
-                                      meth_return)
+                    f = ServiceMethod(meth_name, file, lineno, meth_sig, meth_return)
                     cur_class._addmethod(meth_name, f)
                 # else it's a nested def
                 else:
@@ -330,7 +341,7 @@
             # we found a message definition
             thisindent = indent
             indent += 1
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             message_name = m.group("MessageName")
             # close all messages/services indented at least as much
@@ -354,7 +365,7 @@
             # close all messages/services indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
                 del classstack[-1]
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             enum_name = m.group("EnumName")
             # remember this Enum
@@ -375,7 +386,7 @@
             # close all messages/services indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
                 del classstack[-1]
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             service_name = m.group("ServiceName")
             # remember this Service
--- a/src/eric7/Utilities/ClassBrowsers/pyclbr.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/pyclbr.py	Wed Jul 13 14:55:47 2022 +0200
@@ -132,24 +132,26 @@
             |
             (?: [^#;\\\n]* (?: \\\n )* )* )
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 _commentsub = re.compile(r"""#[^\n]*\n|#[^\n]*$""").sub
 
-_modules = {}                           # cache of modules we've seen
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
     """
     Mixin class implementing the notion of visibility.
     """
+
     def __init__(self):
         """
         Constructor
         """
-        if self.name.startswith('__'):
+        if self.name.startswith("__"):
             self.setPrivate()
-        elif self.name.startswith('_'):
+        elif self.name.startswith("_"):
             self.setProtected()
         else:
             self.setPublic()
@@ -159,18 +161,18 @@
     """
     Class to represent a Python class.
     """
+
     def __init__(self, module, name, superClasses, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param superClasses list of class names this class is inherited from
         @param file filename containing this class
         @param lineno linenumber of the class definition
         """
-        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file,
-                                       lineno)
+        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file, lineno)
         VisibilityMixin.__init__(self)
 
 
@@ -178,11 +180,21 @@
     """
     Class to represent a Python function.
     """
-    def __init__(self, module, name, file, lineno, signature='', separator=',',
-                 modifierType=ClbrBaseClasses.Function.General, annotation=""):
+
+    def __init__(
+        self,
+        module,
+        name,
+        file,
+        lineno,
+        signature="",
+        separator=",",
+        modifierType=ClbrBaseClasses.Function.General,
+        annotation="",
+    ):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @param name name of this function
         @param file filename containing this class
@@ -192,9 +204,17 @@
         @param modifierType type of the function
         @param annotation return annotation
         """
-        ClbrBaseClasses.Function.__init__(self, module, name, file, lineno,
-                                          signature, separator, modifierType,
-                                          annotation)
+        ClbrBaseClasses.Function.__init__(
+            self,
+            module,
+            name,
+            file,
+            lineno,
+            signature,
+            separator,
+            modifierType,
+            annotation,
+        )
         VisibilityMixin.__init__(self)
 
 
@@ -202,10 +222,11 @@
     """
     Class to represent a class attribute.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param file filename containing this attribute
@@ -219,43 +240,46 @@
     """
     Class to represent the list of public identifiers.
     """
+
     def __init__(self, module, file, lineno, idents):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @param file filename containing this class
         @param lineno linenumber of the class definition
         @param idents list of public identifiers
         """
         self.module = module
-        self.name = '__all__'
+        self.name = "__all__"
         self.file = file
         self.lineno = lineno
-        self.identifiers = [e.replace('"', '').replace("'", "").strip()
-                            for e in idents.split(',')]
+        self.identifiers = [
+            e.replace('"', "").replace("'", "").strip() for e in idents.split(",")
+        ]
 
 
 class Imports:
     """
     Class to represent the list of imported modules.
     """
+
     def __init__(self, module, file):
         """
         Constructor
-        
+
         @param module name of the module containing the import (string)
         @param file file name containing the import (string)
         """
         self.module = module
-        self.name = 'import'
+        self.name = "import"
         self.file = file
         self.imports = {}
-    
+
     def addImport(self, moduleName, names, lineno):
         """
         Public method to add a list of imported names.
-        
+
         @param moduleName name of the imported module (string)
         @param names list of names (list of strings)
         @param lineno line number of the import
@@ -266,11 +290,11 @@
         else:
             module = self.imports[moduleName]
         module.addImport(lineno, names)
-    
+
     def getImport(self, moduleName):
         """
         Public method to get an imported module item.
-        
+
         @param moduleName name of the imported module (string)
         @return imported module item (ImportedModule) or None
         """
@@ -278,11 +302,11 @@
             return self.imports[moduleName]
         else:
             return None
-    
+
     def getImports(self):
         """
         Public method to get all imported module names.
-        
+
         @return dictionary of imported module names with name as key and list
             of line numbers of imports as value
         """
@@ -293,39 +317,40 @@
     """
     Class to represent an imported module.
     """
+
     def __init__(self, module, file, importedModule):
         """
         Constructor
-        
+
         @param module name of the module containing the import (string)
         @param file file name containing the import (string)
         @param importedModule name of the imported module (string)
         """
         self.module = module
-        self.name = 'import'
+        self.name = "import"
         self.file = file
         self.importedModuleName = importedModule
         self.linenos = []
         self.importedNames = {}
         # dictionary of imported names with name as key and list of line
         # numbers as value
-    
+
     def addImport(self, lineno, importedNames):
         """
         Public method to add a list of imported names.
-        
+
         @param lineno line number of the import
         @param importedNames list of imported names (list of strings)
         """
         if lineno not in self.linenos:
             self.linenos.append(lineno)
-        
+
         for name in importedNames:
             if name not in self.importedNames:
                 self.importedNames[name] = [lineno]
             else:
                 self.importedNames[name].append(lineno)
-    
+
 
 def readmodule_ex(module, path=None, inpackage=False, isPyFile=False):
     """
@@ -334,7 +359,7 @@
     Search for MODULE in PATH and sys.path, read and parse the
     module and return a dictionary with one entry for each class
     found in the module.
-    
+
     @param module name of the module file
     @type str
     @param path path the module should be searched in
@@ -347,7 +372,7 @@
     @rtype dict
     """
     global _modules
-    
+
     if module in _modules:
         # we've seen this module before...
         return _modules[module]
@@ -361,14 +386,14 @@
     f = None
     if inpackage:
         try:
-            f, file, (suff, mode, type) = ClassBrowsers.find_module(
-                module, path)
+            f, file, (suff, mode, type) = ClassBrowsers.find_module(module, path)
         except ImportError:
             f = None
     if f is None:
         fullpath = path[:] + sys.path[:]
         f, file, (suff, mode, type) = ClassBrowsers.find_module(
-            module, fullpath, isPyFile)
+            module, fullpath, isPyFile
+        )
     if f:
         f.close()
     if type not in SUPPORTED_TYPES:
@@ -382,7 +407,7 @@
         # can't do anything with this module
         _modules[module] = {}
         return {}
-    
+
     _modules[module] = scan(src, file, module)
     return _modules[module]
 
@@ -390,7 +415,7 @@
 def scan(src, file, module):
     """
     Public method to scan the given source text.
-    
+
     @param src source text to be scanned
     @type str
     @param file file name associated with the source text
@@ -400,10 +425,11 @@
     @return dictionary containing the extracted data
     @rtype dict
     """
+
     def calculateEndline(lineno, lines, indent):
         """
         Function to calculate the end line of a class or method/function.
-        
+
         @param lineno line number to start at (one based)
         @type int
         @param lines list of source lines
@@ -423,23 +449,23 @@
                 if lineIndent <= indent:
                     return lineno
             lineno += 1
-        
+
         # nothing found
         return -1
-    
+
     # convert eol markers the Python style
     src = src.replace("\r\n", "\n").replace("\r", "\n")
     srcLines = src.splitlines()
-    
+
     dictionary = {}
     dict_counts = {}
-    
+
     classstack = []  # stack of (class, indent) pairs
     conditionalsstack = []  # stack of indents of conditional defines
     deltastack = []
     deltaindent = 0
     deltaindentcalculated = False
-    
+
     lineno, last_lineno_pos = 1, 0
     i = 0
     modifierType = ClbrBaseClasses.Function.General
@@ -453,18 +479,18 @@
         if m.start("MethodModifier") >= 0:
             modifierIndent = _indent(m.group("MethodModifierIndent"))
             modifierType = m.group("MethodModifierType")
-        
+
         elif m.start("Method") >= 0:
             # found a method definition or function
             thisindent = _indent(m.group("MethodIndent"))
             meth_name = m.group("MethodName")
             meth_sig = m.group("MethodSignature")
-            meth_sig = meth_sig.replace('\\\n', '')
-            meth_sig = _commentsub('', meth_sig)
+            meth_sig = meth_sig.replace("\\\n", "")
+            meth_sig = _commentsub("", meth_sig)
             meth_ret = m.group("MethodReturnAnnotation")
-            meth_ret = meth_ret.replace('\\\n', '')
-            meth_ret = _commentsub('', meth_ret)
-            lineno += src.count('\n', last_lineno_pos, start)
+            meth_ret = meth_ret.replace("\\\n", "")
+            meth_ret = _commentsub("", meth_ret)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if modifierType and modifierIndent == thisindent:
                 if modifierType == "@staticmethod":
@@ -484,10 +510,7 @@
                         deltaindentcalculated = True
                     thisindent -= deltaindent
                 else:
-                    while (
-                        conditionalsstack and
-                        conditionalsstack[-1] >= thisindent
-                    ):
+                    while conditionalsstack and conditionalsstack[-1] >= thisindent:
                         del conditionalsstack[-1]
                         if deltastack:
                             del deltastack[-1]
@@ -500,21 +523,32 @@
                 cur_class = classstack[-1][0]
                 if cur_class:
                     # it's a method/nested def
-                    f = Function(None, meth_name,
-                                 file, lineno, meth_sig, annotation=meth_ret,
-                                 modifierType=modifier)
+                    f = Function(
+                        None,
+                        meth_name,
+                        file,
+                        lineno,
+                        meth_sig,
+                        annotation=meth_ret,
+                        modifierType=modifier,
+                    )
                     cur_class._addmethod(meth_name, f)
                 else:
                     f = None
             else:
                 # it's a function
-                f = Function(module, meth_name,
-                             file, lineno, meth_sig, annotation=meth_ret,
-                             modifierType=modifier)
+                f = Function(
+                    module,
+                    meth_name,
+                    file,
+                    lineno,
+                    meth_sig,
+                    annotation=meth_ret,
+                    modifierType=modifier,
+                )
                 if meth_name in dict_counts:
                     dict_counts[meth_name] += 1
-                    meth_name = "{0}_{1:d}".format(
-                        meth_name, dict_counts[meth_name])
+                    meth_name = "{0}_{1:d}".format(meth_name, dict_counts[meth_name])
                 else:
                     dict_counts[meth_name] = 0
                 dictionary[meth_name] = f
@@ -522,7 +556,7 @@
                 endlineno = calculateEndline(lineno, srcLines, thisindent)
                 f.setEndLine(endlineno)
                 classstack.append((f, thisindent))  # Marker for nested fns
-            
+
             # reset the modifier settings
             modifierType = ClbrBaseClasses.Function.General
             modifierIndent = -1
@@ -536,22 +570,22 @@
             # close all classes indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
                 del classstack[-1]
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             class_name = m.group("ClassName")
             inherit = m.group("ClassSupers")
             if inherit:
                 # the class inherits from other classes
                 inherit = inherit[1:-1].strip()
-                inherit = _commentsub('', inherit)
+                inherit = _commentsub("", inherit)
                 names = []
-                for n in inherit.split(','):
+                for n in inherit.split(","):
                     n = n.strip()
                     if n in dictionary:
                         # we know this super class
                         n = dictionary[n]
                     else:
-                        c = n.split('.')
+                        c = n.split(".")
                         if len(c) > 1:
                             # super class
                             # is of the
@@ -574,24 +608,19 @@
                         deltaindentcalculated = True
                     thisindent -= deltaindent
                 else:
-                    while (
-                        conditionalsstack and
-                        conditionalsstack[-1] >= thisindent
-                    ):
+                    while conditionalsstack and conditionalsstack[-1] >= thisindent:
                         del conditionalsstack[-1]
                         if deltastack:
                             del deltastack[-1]
                     deltaindentcalculated = False
             # remember this class
-            cur_class = Class(module, class_name, inherit,
-                              file, lineno)
+            cur_class = Class(module, class_name, inherit, file, lineno)
             endlineno = calculateEndline(lineno, srcLines, thisindent)
             cur_class.setEndLine(endlineno)
             if not classstack:
                 if class_name in dict_counts:
                     dict_counts[class_name] += 1
-                    class_name = "{0}_{1:d}".format(
-                        class_name, dict_counts[class_name])
+                    class_name = "{0}_{1:d}".format(class_name, dict_counts[class_name])
                 else:
                     dict_counts[class_name] = 0
                 dictionary[class_name] = cur_class
@@ -600,16 +629,14 @@
             classstack.append((cur_class, thisindent))
 
         elif m.start("Attribute") >= 0:
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             index = -1
             while index >= -len(classstack):
-                if (
-                    classstack[index][0] is not None and
-                    not isinstance(classstack[index][0], Function)
+                if classstack[index][0] is not None and not isinstance(
+                    classstack[index][0], Function
                 ):
-                    attr = Attribute(
-                        module, m.group("AttributeName"), file, lineno)
+                    attr = Attribute(module, m.group("AttributeName"), file, lineno)
                     classstack[index][0]._addattribute(attr)
                     break
                 else:
@@ -617,24 +644,26 @@
 
         elif m.start("Main") >= 0:
             # 'main' part of the script, reset class stack
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             classstack = []
 
         elif m.start("Variable") >= 0:
             thisindent = _indent(m.group("VariableIndent"))
             variable_name = m.group("VariableName")
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if thisindent == 0 or not classstack:
                 # global variable, reset class stack first
                 classstack = []
-                
+
                 if "@@Globals@@" not in dictionary:
                     dictionary["@@Globals@@"] = ClbrBaseClasses.ClbrBase(
-                        module, "Globals", file, lineno)
+                        module, "Globals", file, lineno
+                    )
                 dictionary["@@Globals@@"]._addglobal(
-                    Attribute(module, variable_name, file, lineno))
+                    Attribute(module, variable_name, file, lineno)
+                )
             else:
                 index = -1
                 while index >= -len(classstack):
@@ -643,46 +672,51 @@
                     else:
                         if isinstance(classstack[index][0], Class):
                             classstack[index][0]._addglobal(
-                                Attribute(module, variable_name, file, lineno))
+                                Attribute(module, variable_name, file, lineno)
+                            )
                         break
 
         elif m.start("Publics") >= 0:
             idents = m.group("Identifiers")
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             pubs = Publics(module, file, lineno, idents)
-            dictionary['__all__'] = pubs
-        
+            dictionary["__all__"] = pubs
+
         elif m.start("Import") >= 0:
-            #- import module
-            names = [n.strip() for n in
-                     "".join(m.group("ImportList").splitlines())
-                     .replace("\\", "").split(',')]
-            lineno += src.count('\n', last_lineno_pos, start)
+            # - import module
+            names = [
+                n.strip()
+                for n in "".join(m.group("ImportList").splitlines())
+                .replace("\\", "")
+                .split(",")
+            ]
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if "@@Import@@" not in dictionary:
                 dictionary["@@Import@@"] = Imports(module, file)
             for name in names:
                 dictionary["@@Import@@"].addImport(name, [], lineno)
-        
+
         elif m.start("ImportFrom") >= 0:
-            #- from module import stuff
+            # - from module import stuff
             mod = m.group("ImportFromPath")
-            namesLines = (m.group("ImportFromList")
-                          .replace("(", "").replace(")", "")
-                          .replace("\\", "")
-                          .strip().splitlines())
-            namesLines = [line.split("#")[0].strip()
-                          for line in namesLines]
-            names = [n.strip() for n in
-                     "".join(namesLines)
-                     .split(',')]
-            lineno += src.count('\n', last_lineno_pos, start)
+            namesLines = (
+                m.group("ImportFromList")
+                .replace("(", "")
+                .replace(")", "")
+                .replace("\\", "")
+                .strip()
+                .splitlines()
+            )
+            namesLines = [line.split("#")[0].strip() for line in namesLines]
+            names = [n.strip() for n in "".join(namesLines).split(",")]
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if "@@Import@@" not in dictionary:
                 dictionary["@@Import@@"] = Imports(module, file)
             dictionary["@@Import@@"].addImport(mod, names, lineno)
-        
+
         elif m.start("ConditionalDefine") >= 0:
             # a conditional function/method definition
             thisindent = _indent(m.group("ConditionalDefineIndent"))
@@ -692,35 +726,36 @@
                     del deltastack[-1]
             conditionalsstack.append(thisindent)
             deltaindentcalculated = False
-        
+
         elif m.start("CodingLine") >= 0:
             # a coding statement
             coding = m.group("Coding")
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if "@@Coding@@" not in dictionary:
                 dictionary["@@Coding@@"] = ClbrBaseClasses.Coding(
-                    module, file, lineno, coding)
+                    module, file, lineno, coding
+                )
 
-    if '__all__' in dictionary:
+    if "__all__" in dictionary:
         # set visibility of all top level elements
-        pubs = dictionary['__all__']
+        pubs = dictionary["__all__"]
         for key in dictionary:
-            if key == '__all__' or key.startswith("@@"):
+            if key == "__all__" or key.startswith("@@"):
                 continue
             if key in pubs.identifiers:
                 dictionary[key].setPublic()
             else:
                 dictionary[key].setPrivate()
-        del dictionary['__all__']
-    
+        del dictionary["__all__"]
+
     return dictionary
 
 
 def _indent(ws):
     """
     Module function to return the indentation depth.
-    
+
     @param ws the whitespace to be checked (string)
     @return length of the whitespace string (integer)
     """
--- a/src/eric7/Utilities/ClassBrowsers/rbclbr.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ClassBrowsers/rbclbr.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 from . import ClbrBaseClasses
 
 SUPPORTED_TYPES = [ClassBrowsers.RB_SOURCE]
-    
+
 _getnext = re.compile(
     r"""
     (?P<String>
@@ -156,17 +156,19 @@
             end \b [^_]
         )
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 _commentsub = re.compile(r"""#[^\n]*\n|#[^\n]*$""").sub
 
-_modules = {}                           # cache of modules we've seen
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
     """
     Mixin class implementing the notion of visibility.
     """
+
     def __init__(self):
         """
         Constructor
@@ -178,18 +180,18 @@
     """
     Class to represent a Ruby class.
     """
+
     def __init__(self, module, name, superClasses, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param superClasses list of class names this class is inherited from
         @param file filename containing this class
         @param lineno linenumber of the class definition
         """
-        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file,
-                                       lineno)
+        ClbrBaseClasses.Class.__init__(self, module, name, superClasses, file, lineno)
         VisibilityMixin.__init__(self)
 
 
@@ -197,10 +199,11 @@
     """
     Class to represent a Ruby module.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param file filename containing this class
@@ -214,11 +217,11 @@
     """
     Class to represent a Ruby function.
     """
-    def __init__(self, module, name, file, lineno, signature='',
-                 separator=','):
+
+    def __init__(self, module, name, file, lineno, signature="", separator=","):
         """
         Constructor
-        
+
         @param module name of the module containing this function
         @param name name of this function
         @param file filename containing this class
@@ -226,8 +229,9 @@
         @param signature parameterlist of the method
         @param separator string separating the parameters
         """
-        ClbrBaseClasses.Function.__init__(self, module, name, file, lineno,
-                                          signature, separator)
+        ClbrBaseClasses.Function.__init__(
+            self, module, name, file, lineno, signature, separator
+        )
         VisibilityMixin.__init__(self)
 
 
@@ -235,10 +239,11 @@
     """
     Class to represent a class or module attribute.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of the module containing this class
         @param name name of this class
         @param file filename containing this attribute
@@ -258,7 +263,7 @@
     @return the resulting dictionary
     """
     global _modules
-    
+
     if module in _modules:
         # we've seen this file before...
         return _modules[module]
@@ -280,7 +285,7 @@
         # can't do anything with this module
         _modules[module] = {}
         return {}
-    
+
     _modules[module] = scan(src, file, module)
     return _modules[module]
 
@@ -288,7 +293,7 @@
 def scan(src, file, module):
     """
     Public method to scan the given source text.
-    
+
     @param src source text to be scanned
     @type str
     @param file file name associated with the source text
@@ -305,7 +310,7 @@
     dict_counts = {}
 
     classstack = []  # stack of (class, indent) pairs
-    acstack = []    # stack of (access control, indent) pairs
+    acstack = []  # stack of (access control, indent) pairs
     indent = 0
 
     lineno, last_lineno_pos = 1, 0
@@ -323,18 +328,18 @@
             thisindent = indent
             indent += 1
             meth_name = (
-                m.group("MethodName") or
-                m.group("MethodName2") or
-                m.group("MethodName3")
+                m.group("MethodName")
+                or m.group("MethodName2")
+                or m.group("MethodName3")
             )
             meth_sig = m.group("MethodSignature")
-            meth_sig = meth_sig and meth_sig.replace('\\\n', '') or ''
-            meth_sig = _commentsub('', meth_sig)
-            lineno += src.count('\n', last_lineno_pos, start)
+            meth_sig = meth_sig and meth_sig.replace("\\\n", "") or ""
+            meth_sig = _commentsub("", meth_sig)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
-            if meth_name.startswith('self.'):
+            if meth_name.startswith("self."):
                 meth_name = meth_name[5:]
-            elif meth_name.startswith('self::'):
+            elif meth_name.startswith("self::"):
                 meth_name = meth_name[6:]
             # close all classes/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
@@ -349,8 +354,7 @@
                 cur_class = classstack[-1][0]
                 if isinstance(cur_class, (Class, Module)):
                     # it's a method
-                    f = Function(None, meth_name,
-                                 file, lineno, meth_sig)
+                    f = Function(None, meth_name, file, lineno, meth_sig)
                     cur_class._addmethod(meth_name, f)
                 else:
                     f = cur_class
@@ -366,12 +370,10 @@
                 # else it's a nested def
             else:
                 # it's a function
-                f = Function(module, meth_name,
-                             file, lineno, meth_sig)
+                f = Function(module, meth_name, file, lineno, meth_sig)
                 if meth_name in dict_counts:
                     dict_counts[meth_name] += 1
-                    meth_name = "{0}_{1:d}".format(
-                        meth_name, dict_counts[meth_name])
+                    meth_name = "{0}_{1:d}".format(meth_name, dict_counts[meth_name])
                 else:
                     dict_counts[meth_name] = 0
                 dictionary[meth_name] = f
@@ -385,10 +387,10 @@
             classstack.append((f, thisindent))  # Marker for nested fns
 
         elif (
-            m.start("String") >= 0 or
-            m.start("Comment") >= 0 or
-            m.start("ClassIgnored") >= 0 or
-            m.start("BeginEnd") >= 0
+            m.start("String") >= 0
+            or m.start("Comment") >= 0
+            or m.start("ClassIgnored") >= 0
+            or m.start("BeginEnd") >= 0
         ):
             pass
 
@@ -396,7 +398,7 @@
             # we found a class definition
             thisindent = indent
             indent += 1
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             # close all classes/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
@@ -409,10 +411,9 @@
             if inherit:
                 # the class inherits from other classes
                 inherit = inherit[1:].strip()
-                inherit = [_commentsub('', inherit)]
+                inherit = [_commentsub("", inherit)]
             # remember this class
-            cur_class = Class(module, class_name, inherit,
-                              file, lineno)
+            cur_class = Class(module, class_name, inherit, file, lineno)
             if not classstack:
                 if class_name in dictionary:
                     cur_class = dictionary[class_name]
@@ -441,7 +442,7 @@
             # we found a module definition
             thisindent = indent
             indent += 1
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             # close all classes/modules indented at least as much
             while classstack and classstack[-1][1] >= thisindent:
@@ -483,8 +484,8 @@
                 while index >= -len(acstack):
                     if acstack[index][1] < indent:
                         actype = (
-                            m.group("AccessControlType") or
-                            m.group("AccessControlType2").split('_')[0]
+                            m.group("AccessControlType")
+                            or m.group("AccessControlType2").split("_")[0]
                         )
                         acstack[index][0] = actype.lower()
                         break
@@ -494,18 +495,18 @@
                 index = -1
                 while index >= -len(classstack):
                     if (
-                        classstack[index][0] is not None and
-                        not isinstance(classstack[index][0], Function) and
-                        classstack[index][1] < indent
+                        classstack[index][0] is not None
+                        and not isinstance(classstack[index][0], Function)
+                        and classstack[index][1] < indent
                     ):
                         parent = classstack[index][0]
                         actype = (
-                            m.group("AccessControlType") or
-                            m.group("AccessControlType2").split('_')[0]
+                            m.group("AccessControlType")
+                            or m.group("AccessControlType2").split("_")[0]
                         )
                         actype = actype.lower()
                         for name in aclist.split(","):
-                            name = name.strip()[1:]   # get rid of leading ':'
+                            name = name.strip()[1:]  # get rid of leading ':'
                             acmeth = parent._getmethod(name)
                             if acmeth is None:
                                 continue
@@ -520,17 +521,16 @@
                         index -= 1
 
         elif m.start("Attribute") >= 0:
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             index = -1
             while index >= -len(classstack):
                 if (
-                    classstack[index][0] is not None and
-                    not isinstance(classstack[index][0], Function) and
-                    classstack[index][1] < indent
+                    classstack[index][0] is not None
+                    and not isinstance(classstack[index][0], Function)
+                    and classstack[index][1] < indent
                 ):
-                    attr = Attribute(
-                        module, m.group("AttributeName"), file, lineno)
+                    attr = Attribute(module, m.group("AttributeName"), file, lineno)
                     classstack[index][0]._addattribute(attr)
                     break
                 else:
@@ -540,25 +540,25 @@
                     lastGlobalEntry = None
 
         elif m.start("Attr") >= 0:
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             index = -1
             while index >= -len(classstack):
                 if (
-                    classstack[index][0] is not None and
-                    not isinstance(classstack[index][0], Function) and
-                    classstack[index][1] < indent
+                    classstack[index][0] is not None
+                    and not isinstance(classstack[index][0], Function)
+                    and classstack[index][1] < indent
                 ):
                     parent = classstack[index][0]
                     if m.group("AttrType") is None:
                         nv = m.group("AttrList").split(",")
                         if not nv:
                             break
-                        name = nv[0].strip()[1:]    # get rid of leading ':'
+                        name = nv[0].strip()[1:]  # get rid of leading ':'
                         attr = (
-                            parent._getattribute("@" + name) or
-                            parent._getattribute("@@" + name) or
-                            Attribute(module, "@" + name, file, lineno)
+                            parent._getattribute("@" + name)
+                            or parent._getattribute("@@" + name)
+                            or Attribute(module, "@" + name, file, lineno)
                         )
                         if len(nv) == 1 or nv[1].strip() == "false":
                             attr.setProtected()
@@ -568,11 +568,11 @@
                     else:
                         access = m.group("AttrType")
                         for name in m.group("AttrList").split(","):
-                            name = name.strip()[1:]   # get rid of leading ':'
+                            name = name.strip()[1:]  # get rid of leading ':'
                             attr = (
-                                parent._getattribute("@" + name) or
-                                parent._getattribute("@@" + name) or
-                                Attribute(module, "@" + name, file, lineno)
+                                parent._getattribute("@" + name)
+                                or parent._getattribute("@@" + name)
+                                or Attribute(module, "@" + name, file, lineno)
                             )
                             if access == "_accessor":
                                 attr.setPublic()
@@ -600,14 +600,15 @@
                     indent = classstack[-1][1]
                 else:
                     indent = 0
-        
+
         elif m.start("CodingLine") >= 0:
             # a coding statement
             coding = m.group("Coding")
-            lineno += src.count('\n', last_lineno_pos, start)
+            lineno += src.count("\n", last_lineno_pos, start)
             last_lineno_pos = start
             if "@@Coding@@" not in dictionary:
                 dictionary["@@Coding@@"] = ClbrBaseClasses.Coding(
-                    module, file, lineno, coding)
+                    module, file, lineno, coding
+                )
 
     return dictionary
--- a/src/eric7/Utilities/FtpUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/FtpUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,6 +18,7 @@
     """
     Exception class raised, if a parser issue was detected.
     """
+
     pass
 
 
@@ -25,6 +26,7 @@
     """
     Class to parse lines returned by a FTP LIST command.
     """
+
     MonthnamesNumbers = {
         "jan": 1,
         "feb": 2,
@@ -39,66 +41,62 @@
         "nov": 11,
         "dec": 12,
     }
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__parseLine = self.__parseUnixLine
         self.__modeSwitchAllowed = True
-    
+
     def __ignoreLine(self, line):
         """
         Private method to check, if the line should be ignored.
-        
+
         @param line to check (string)
         @return flag indicating to ignore the line (boolean)
         """
-        return (
-            line.strip() == "" or
-            line.strip().lower().startswith("total ")
-        )
-    
+        return line.strip() == "" or line.strip().lower().startswith("total ")
+
     def __parseUnixMode(self, modeString, urlInfo):
         """
         Private method to parse a Unix mode string modifying the
         given URL info object.
-        
+
         @param modeString mode string to be parsed (string)
         @param urlInfo reference to the URL info object (EricUrlInfo)
         @exception FtpDirLineParserError Raised if the mode cannot be parsed.
         """
         if len(modeString) != 10:
-            raise FtpDirLineParserError(
-                "invalid mode string '{0}'".format(modeString))
-        
+            raise FtpDirLineParserError("invalid mode string '{0}'".format(modeString))
+
         modeString = modeString.lower()
-        
+
         permission = 0
-        if modeString[1] != '-':
+        if modeString[1] != "-":
             permission |= EricUrlPermission.READ_OWNER
-        if modeString[2] != '-':
+        if modeString[2] != "-":
             permission |= EricUrlPermission.WRITE_OWNER
-        if modeString[3] != '-':
+        if modeString[3] != "-":
             permission |= EricUrlPermission.EXE_OWNER
-        if modeString[4] != '-':
+        if modeString[4] != "-":
             permission |= EricUrlPermission.READ_GROUP
-        if modeString[5] != '-':
+        if modeString[5] != "-":
             permission |= EricUrlPermission.WRITE_GROUP
-        if modeString[6] != '-':
+        if modeString[6] != "-":
             permission |= EricUrlPermission.EXE_GROUP
-        if modeString[7] != '-':
+        if modeString[7] != "-":
             permission |= EricUrlPermission.READ_OTHER
-        if modeString[8] != '-':
+        if modeString[8] != "-":
             permission |= EricUrlPermission.WRITE_OTHER
-        if modeString[9] != '-':
+        if modeString[9] != "-":
             permission |= EricUrlPermission.EXE_OTHER
         urlInfo.setPermissions(permission)
-        
+
         if modeString[0] == "d":
             urlInfo.setDir(True)
             urlInfo.setFile(False)
@@ -111,12 +109,12 @@
             urlInfo.setDir(False)
             urlInfo.setFile(True)
             urlInfo.setSymLink(False)
-    
+
     def __parseUnixTime(self, monthAbbreviation, day, yearOrTime, urlInfo):
         """
         Private method to parse a Unix date and time indication modifying
         the given URL info object.
-        
+
 
         Date time strings in Unix-style directory listings typically
         have one of these formats:
@@ -124,7 +122,7 @@
           <li>"Nov 23 02:33" (month name, day of month, time)</li>
           <li>"May 26  2005" (month name, day of month, year)</li>
         </ul>
-        
+
         @param monthAbbreviation abbreviation of the month name (string)
         @param day day of the month (string)
         @param yearOrTime string giving the year or a time (string)
@@ -133,33 +131,32 @@
             not recognized.
         """
         try:
-            month = FtpDirLineParser.MonthnamesNumbers[
-                monthAbbreviation.lower()]
+            month = FtpDirLineParser.MonthnamesNumbers[monthAbbreviation.lower()]
         except KeyError:
             raise FtpDirLineParserError(
-                "illegal month abbreviation '{0}'".format(
-                    monthAbbreviation))
+                "illegal month abbreviation '{0}'".format(monthAbbreviation)
+            )
         day = int(day)
-        if ':' in yearOrTime:
+        if ":" in yearOrTime:
             year = QDate.currentDate().year()
-            hour, minute = yearOrTime.split(':')
+            hour, minute = yearOrTime.split(":")
             hour = int(hour)
             minute = int(minute)
         else:
             year = int(yearOrTime)
             hour = 0
             minute = 0
-        
+
         lastModified = QDateTime(QDate(year, month, day), QTime(hour, minute))
         urlInfo.setLastModified(lastModified)
-    
+
     def __splitUnixLine(self, line):
         """
         Private method to split a line of a Unix like directory listing.
-       
+
         It splits the line into meta data, number of links, user, group, size,
         month, day, year or time and name.
-        
+
         @param line directory line to split (string)
         @return tuple of nine strings giving the meta data,
             number of links, user, group, size, month, day, year or time
@@ -173,9 +170,8 @@
         fieldCountWithoutUserID = 8
         fieldCountWithUserID = fieldCountWithoutUserID + 1
         if len(lineParts) < fieldCountWithoutUserID:
-            raise FtpDirLineParserError(
-                "line '{0}' cannot be parsed".format(line))
-        
+            raise FtpDirLineParserError("line '{0}' cannot be parsed".format(line))
+
         # If we have a valid format (either with or without user id field),
         # the field with index 5 is either the month abbreviation or a day.
         try:
@@ -188,23 +184,31 @@
             lineParts = line.split(None, fieldCountWithoutUserID - 1)
             userFieldIndex = 2
             lineParts.insert(userFieldIndex, "")
-        
+
         return lineParts
-    
+
     def __parseUnixLine(self, line):
         """
         Private method to parse a Unix style directory listing line.
-        
+
         @param line directory line to be parsed (string)
         @return URL info object containing the valid data (EricUrlInfo)
         """
-        modeString, nlink, user, group, size, month, day, yearOrTime, name = (
-            self.__splitUnixLine(line)
-        )
-        
+        (
+            modeString,
+            nlink,
+            user,
+            group,
+            size,
+            month,
+            day,
+            yearOrTime,
+            name,
+        ) = self.__splitUnixLine(line)
+
         if name in [".", ".."]:
             return None
-        
+
         urlInfo = EricUrlInfo()
         self.__parseUnixMode(modeString, urlInfo)
         self.__parseUnixTime(month, day, yearOrTime, urlInfo)
@@ -216,9 +220,9 @@
         if i >= 0:
             name = name[:i]
         urlInfo.setName(name)
-        
+
         return urlInfo
-    
+
     def __parseWindowsTime(self, date, time, urlInfo):
         """
         Private method to parse a Windows date and time indication modifying
@@ -227,7 +231,7 @@
         Date time strings in Windows-style directory listings typically
         have the format "10-23-12 03:25PM" (month-day_of_month-two_digit_year,
         hour:minute, am/pm).
-        
+
         @param date date string (string)
         @param time time string (string)
         @param urlInfo reference to the URL info object (EricUrlInfo)
@@ -235,30 +239,28 @@
             recognized.
         """
         try:
-            month, day, year = [int(part) for part in date.split('-')]
+            month, day, year = [int(part) for part in date.split("-")]
             year = 1900 + year if year >= 70 else 2000 + year
         except (ValueError, IndexError):
-            raise FtpDirLineParserError(
-                "illegal date string '{0}'".format(month))
+            raise FtpDirLineParserError("illegal date string '{0}'".format(month))
         try:
             hour, minute, am_pm = time[0:2], time[3:5], time[5]
             hour = int(hour)
             minute = int(minute)
         except (ValueError, IndexError):
-            raise FtpDirLineParserError(
-                "illegal time string '{0}'".format(month))
-        if hour == 12 and am_pm == 'A':
+            raise FtpDirLineParserError("illegal time string '{0}'".format(month))
+        if hour == 12 and am_pm == "A":
             hour = 0
-        if hour != 12 and am_pm == 'P':
+        if hour != 12 and am_pm == "P":
             hour += 12
-        
+
         lastModified = QDateTime(QDate(year, month, day), QTime(hour, minute))
         urlInfo.setLastModified(lastModified)
-    
+
     def __parseWindowsLine(self, line):
         """
         Private method to parse a Windows style directory listing line.
-        
+
         @param line directory line to be parsed (string)
         @return URL info object containing the valid data (EricUrlInfo)
         @exception FtpDirLineParserError Raised if the line is not of a
@@ -268,12 +270,11 @@
             date, time, dirOrSize, name = line.split(None, 3)
         except ValueError:
             # "unpack list of wrong size"
-            raise FtpDirLineParserError(
-                "line '{0}' cannot be parsed".format(line))
-        
+            raise FtpDirLineParserError("line '{0}' cannot be parsed".format(line))
+
         if name in [".", ".."]:
             return None
-        
+
         urlInfo = EricUrlInfo()
         self.__parseWindowsTime(date, time, urlInfo)
         if dirOrSize.lower() == "<dir>":
@@ -285,48 +286,50 @@
             try:
                 urlInfo.setSize(int(dirOrSize))
             except ValueError:
-                raise FtpDirLineParserError(
-                    "illegal size '{0}'".format(dirOrSize))
+                raise FtpDirLineParserError("illegal size '{0}'".format(dirOrSize))
         urlInfo.setName(name)
-        
+
         ext = os.path.splitext(name.lower())[1]
         urlInfo.setSymLink(ext == ".lnk")
-        
+
         permissions = (
-            EricUrlPermission.READ_OWNER | EricUrlPermission.WRITE_OWNER |
-            EricUrlPermission.READ_GROUP | EricUrlPermission.WRITE_GROUP |
-            EricUrlPermission.READ_OTHER | EricUrlPermission.WRITE_OTHER
+            EricUrlPermission.READ_OWNER
+            | EricUrlPermission.WRITE_OWNER
+            | EricUrlPermission.READ_GROUP
+            | EricUrlPermission.WRITE_GROUP
+            | EricUrlPermission.READ_OTHER
+            | EricUrlPermission.WRITE_OTHER
         )
         if ext in [".exe", ".com", ".bat", ".cmd"]:
             permissions |= (
-                EricUrlPermission.EXE_OWNER |
-                EricUrlPermission.EXE_GROUP |
-                EricUrlPermission.EXE_OTHER
+                EricUrlPermission.EXE_OWNER
+                | EricUrlPermission.EXE_GROUP
+                | EricUrlPermission.EXE_OTHER
             )
         urlInfo.setPermissions(permissions)
-        
+
         return urlInfo
-    
+
     def parseLine(self, line):
         """
         Public method to parse a directory listing line.
-        
+
         This implementation support Unix and Windows style directory
         listings. It tries Unix style first and if that fails switches
         to Windows style. If that fails as well, an exception is raised.
-        
+
         @param line directory line to be parsed (string)
         @return URL info object containing the valid data (EricUrlInfo)
         """
         if self.__ignoreLine(line):
             return None
-        
+
         try:
             return self.__parseLine(line)
         except FtpDirLineParserError:
             if not self.__modeSwitchAllowed:
                 raise
-            
+
             self.__parseLine = self.__parseWindowsLine
             self.__modeSwitchAllowed = False
             return self.__parseLine(line)
--- a/src/eric7/Utilities/GetSysPath.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/GetSysPath.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,8 @@
 if __name__ == "__main__":
     # print sys.path to stdout
     print(json.dumps(sys.path))
-    
+
     sys.exit(0)
-    
+
 #
 # eflag: noqa = M701, M801
--- a/src/eric7/Utilities/MimeTypes.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/MimeTypes.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,7 +15,7 @@
 def isTextFile(filename):
     """
     Function to test, if the given file is a text (i.e. editable) file.
-    
+
     @param filename name of the file to be checked
     @type str
     @return flag indicating an editable file
@@ -23,16 +23,16 @@
     """
     type_ = mimetypes.guess_type(filename)[0]
     return (
-        type_ is None or
-        type_.split("/")[0] == "text" or
-        type_ in Preferences.getUI("TextMimeTypes")
+        type_ is None
+        or type_.split("/")[0] == "text"
+        or type_ in Preferences.getUI("TextMimeTypes")
     )
 
 
 def mimeType(filename):
     """
     Function to get the mime type of a file.
-    
+
     @param filename name of the file to be checked
     @type str
     @return mime type of the file
--- a/src/eric7/Utilities/ModuleParser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/ModuleParser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,8 +23,15 @@
 import Utilities
 from functools import reduce
 
-__all__ = ["Module", "Class", "Function", "Attribute", "RbModule",
-           "readModule", "getTypeFromTypeName"]
+__all__ = [
+    "Module",
+    "Class",
+    "Function",
+    "Attribute",
+    "RbModule",
+    "readModule",
+    "getTypeFromTypeName",
+]
 
 TABWIDTH = 4
 
@@ -46,7 +53,7 @@
 def getTypeFromTypeName(name):
     """
     Module function to determine the module type given the module type name.
-    
+
     @param name module type name (string)
     @return module type or -1 for failure (integer)
     """
@@ -204,7 +211,8 @@
         (?: (?: if | elif ) [ \t]+ [^:]* | else [ \t]* ) :
         (?= \s* (?: async [ \t]+ )? def)
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 _rb_getnext = re.compile(
     r"""
@@ -341,55 +349,57 @@
             end \b [^_]
         )
     )""",
-    re.VERBOSE | re.DOTALL | re.MULTILINE).search
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
 
 _hashsub = re.compile(r"""^([ \t]*)#[ \t]?""", re.MULTILINE).sub
 
 _commentsub = re.compile(r"""#[^\n]*\n|#[^\n]*$""").sub
 
-_modules = {}                           # cache of modules we've seen
+_modules = {}  # cache of modules we've seen
 
 
 class VisibilityBase:
     """
     Class implementing the visibility aspect of all objects.
     """
+
     def isPrivate(self):
         """
         Public method to check, if the visibility is Private.
-        
+
         @return flag indicating Private visibility (boolean)
         """
         return self.visibility == 0
-        
+
     def isProtected(self):
         """
         Public method to check, if the visibility is Protected.
-        
+
         @return flag indicating Protected visibility (boolean)
         """
         return self.visibility == 1
-        
+
     def isPublic(self):
         """
         Public method to check, if the visibility is Public.
-        
+
         @return flag indicating Public visibility (boolean)
         """
         return self.visibility == 2
-        
+
     def setPrivate(self):
         """
         Public method to set the visibility to Private.
         """
         self.visibility = 0
-        
+
     def setProtected(self):
         """
         Public method to set the visibility to Protected.
         """
         self.visibility = 1
-        
+
     def setPublic(self):
         """
         Public method to set the visibility to Public.
@@ -401,10 +411,11 @@
     """
     Class to represent a Python module.
     """
+
     def __init__(self, name, file=None, moduleType=None):
         """
         Constructor
-        
+
         @param name name of this module (string)
         @param file filename of file containing this module (string)
         @param moduleType type of this module
@@ -421,7 +432,7 @@
         self.globals = {}
         self.imports = []
         self.from_imports = {}
-        self.package = '.'.join(name.split('.')[:-1])
+        self.package = ".".join(name.split(".")[:-1])
         self.type = moduleType
         if moduleType in [PY_SOURCE, PTL_SOURCE]:
             self._getnext = _py_getnext
@@ -429,11 +440,11 @@
             self._getnext = _rb_getnext
         else:
             self._getnext = None
-    
+
     def addClass(self, name, _class):
         """
         Public method to add information about a class.
-        
+
         @param name name of class to be added (string)
         @param _class Class object to be added
         """
@@ -443,11 +454,11 @@
         else:
             self.classes_counts[name] = 0
         self.classes[name] = _class
-    
+
     def addModule(self, name, module):
         """
         Public method to add information about a Ruby module.
-        
+
         @param name name of module to be added (string)
         @param module Module object to be added
         """
@@ -457,11 +468,11 @@
         else:
             self.modules_counts[name] = 0
         self.modules[name] = module
-    
+
     def addFunction(self, name, function):
         """
         Public method to add information about a function.
-        
+
         @param name name of function to be added (string)
         @param function Function object to be added
         """
@@ -471,11 +482,11 @@
         else:
             self.functions_counts[name] = 0
         self.functions[name] = function
-    
+
     def addGlobal(self, name, attr):
         """
         Public method to add information about global variables.
-        
+
         @param name name of the global to add (string)
         @param attr Attribute object to be added
         """
@@ -483,20 +494,20 @@
             self.globals[name] = attr
         else:
             self.globals[name].addAssignment(attr.lineno)
-    
+
     def addDescription(self, description):
         """
         Public method to store the modules docstring.
-        
+
         @param description the docstring to be stored (string)
         """
         self.description = description
-    
+
     def scan(self, src):
         """
         Public method to scan the source text and retrieve the relevant
         information.
-        
+
         @param src the source text to be scanned (string)
         """
         # convert eol markers the Python style
@@ -505,32 +516,32 @@
             self.__py_scan(src)
         elif self.type == RB_SOURCE:
             self.__rb_scan(src)
-    
+
     def __py_setVisibility(self, objectRef):
         """
         Private method to set the visibility of an object.
-        
+
         @param objectRef reference to the object (Attribute, Class or Function)
         """
-        if objectRef.name.startswith('__'):
+        if objectRef.name.startswith("__"):
             objectRef.setPrivate()
-        elif objectRef.name.startswith('_'):
+        elif objectRef.name.startswith("_"):
             objectRef.setProtected()
         else:
             objectRef.setPublic()
-    
+
     def __py_scan(self, src):
         """
         Private method to scan the source text of a Python module and retrieve
         the relevant information.
-        
+
         @param src the source text to be scanned (string)
         """
         # __IGNORE_WARNING_D234__
         def calculateEndline(lineno, lines, indent):
             """
             Function to calculate the end line of a class or method/function.
-            
+
             @param lineno line number to start at (one based)
             @type int
             @param lines list of source lines
@@ -550,12 +561,12 @@
                     if lineIndent <= indent:
                         return lineno
                 lineno += 1
-            
+
             # nothing found
             return -1
-        
+
         srcLines = src.splitlines()
-        
+
         lineno, last_lineno_pos = 1, 0
         classstack = []  # stack of (class, indent) pairs
         conditionalsstack = []  # stack of indents of conditional defines
@@ -572,30 +583,30 @@
             if not m:
                 break
             start, i = m.span()
-            
+
             if m.start("MethodModifier") >= 0:
                 modifierIndent = _indent(m.group("MethodModifierIndent"))
                 modifierType = m.group("MethodModifierType")
-            
+
             elif m.start("Method") >= 0:
                 # found a method definition or function
                 thisindent = _indent(m.group("MethodIndent"))
                 meth_name = m.group("MethodName")
                 meth_sig = m.group("MethodSignature")
-                meth_sig = meth_sig.replace('\\\n', '')
+                meth_sig = meth_sig.replace("\\\n", "")
                 meth_ret = m.group("MethodReturnAnnotation")
-                meth_ret = meth_ret.replace('\\\n', '')
+                meth_ret = meth_ret.replace("\\\n", "")
                 if m.group("MethodPyQtSignature") is not None:
                     meth_pyqtSig = (
                         m.group("MethodPyQtSignature")
-                        .replace('\\\n', '')
-                        .split('result')[0]
-                        .split('name')[0]
+                        .replace("\\\n", "")
+                        .split("result")[0]
+                        .split("name")[0]
                         .strip("\"', \t")
                     )
                 else:
                     meth_pyqtSig = None
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 if modifierType and modifierIndent == thisindent:
                     if modifierType == "@staticmethod":
@@ -610,17 +621,12 @@
                 if conditionalsstack:
                     if thisindent > conditionalsstack[-1]:
                         if not deltaindentcalculated:
-                            deltastack.append(
-                                thisindent - conditionalsstack[-1])
-                            deltaindent = reduce(
-                                lambda x, y: x + y, deltastack)
+                            deltastack.append(thisindent - conditionalsstack[-1])
+                            deltaindent = reduce(lambda x, y: x + y, deltastack)
                             deltaindentcalculated = 1
                         thisindent -= deltaindent
                     else:
-                        while (
-                            conditionalsstack and
-                            conditionalsstack[-1] >= thisindent
-                        ):
+                        while conditionalsstack and conditionalsstack[-1] >= thisindent:
                             del conditionalsstack[-1]
                             if deltastack:
                                 del deltastack[-1]
@@ -636,81 +642,96 @@
                         csi -= 1
                         if cur_class is None:
                             continue
-                        
+
                         if isinstance(cur_class, Class):
                             # it's a class method
                             f = Function(
-                                None, meth_name, None, lineno,
-                                meth_sig, meth_pyqtSig, modifierType=modifier,
-                                annotation=meth_ret)
+                                None,
+                                meth_name,
+                                None,
+                                lineno,
+                                meth_sig,
+                                meth_pyqtSig,
+                                modifierType=modifier,
+                                annotation=meth_ret,
+                            )
                             self.__py_setVisibility(f)
                             cur_class.addMethod(meth_name, f)
                             break
                     else:
                         # it's a nested function of a module function
                         f = Function(
-                            self.name, meth_name, self.file, lineno,
-                            meth_sig, meth_pyqtSig, modifierType=modifier,
-                            annotation=meth_ret)
+                            self.name,
+                            meth_name,
+                            self.file,
+                            lineno,
+                            meth_sig,
+                            meth_pyqtSig,
+                            modifierType=modifier,
+                            annotation=meth_ret,
+                        )
                         self.__py_setVisibility(f)
                         self.addFunction(meth_name, f)
                 else:
                     # it's a module function
-                    f = Function(self.name, meth_name, self.file, lineno,
-                                 meth_sig, meth_pyqtSig, modifierType=modifier,
-                                 annotation=meth_ret)
+                    f = Function(
+                        self.name,
+                        meth_name,
+                        self.file,
+                        lineno,
+                        meth_sig,
+                        meth_pyqtSig,
+                        modifierType=modifier,
+                        annotation=meth_ret,
+                    )
                     self.__py_setVisibility(f)
                     self.addFunction(meth_name, f)
                 endlineno = calculateEndline(lineno, srcLines, thisindent)
                 f.setEndLine(endlineno)
                 cur_obj = f
                 classstack.append((None, thisindent))  # Marker for nested fns
-                
+
                 # reset the modifier settings
                 modifierType = Function.General
                 modifierIndent = -1
-            
+
             elif m.start("Docstring") >= 0:
                 contents = m.group("DocstringContents3")
                 if contents is not None:
                     contents = _hashsub(r"\1", contents)
                 else:
-                    if self.file.lower().endswith('.ptl'):
+                    if self.file.lower().endswith(".ptl"):
                         contents = ""
                     else:
-                        contents = (
-                            m.group("DocstringContents1") or
-                            m.group("DocstringContents2")
+                        contents = m.group("DocstringContents1") or m.group(
+                            "DocstringContents2"
                         )
                 if cur_obj:
                     cur_obj.addDescription(contents)
-            
+
             elif m.start("String") >= 0:
-                if (
-                    modulelevel and (
-                        src[start - len('\r\n'):start] == '\r\n' or
-                        src[start - len('\n'):start] == '\n' or
-                        src[start - len('\r'):start] == '\r'
-                    )
+                if modulelevel and (
+                    src[start - len("\r\n") : start] == "\r\n"
+                    or src[start - len("\n") : start] == "\n"
+                    or src[start - len("\r") : start] == "\r"
                 ):
                     contents = m.group("StringContents3")
                     if contents is not None:
                         contents = _hashsub(r"\1", contents)
                     else:
-                        if self.file.lower().endswith('.ptl'):
+                        if self.file.lower().endswith(".ptl"):
                             contents = ""
                         else:
-                            contents = (
-                                m.group("StringContents1") or
-                                m.group("StringContents2")
+                            contents = m.group("StringContents1") or m.group(
+                                "StringContents2"
                             )
                     if cur_obj:
                         cur_obj.addDescription(contents)
-            
+
             elif m.start("Class") >= 0:
                 # we found a class definition
                 thisindent = _indent(m.group("ClassIndent"))
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 # close all classes indented at least as much
                 while classstack and classstack[-1][1] >= thisindent:
@@ -720,16 +741,16 @@
                 if inherit:
                     # the class inherits from other classes
                     inherit = inherit[1:-1].strip()
-                    inherit = _commentsub('', inherit)
+                    inherit = _commentsub("", inherit)
                     names = []
-                    for n in inherit.split(','):
+                    for n in inherit.split(","):
                         n = n.strip()
                         if n:
                             if n in self.classes:
                                 # we know this super class
                                 n = self.classes[n].name
                             else:
-                                c = n.split('.')
+                                c = n.split(".")
                                 if len(c) > 1:
                                     # super class is of the
                                     # form module.class:
@@ -745,26 +766,18 @@
                 if conditionalsstack:
                     if thisindent > conditionalsstack[-1]:
                         if not deltaindentcalculated:
-                            deltastack.append(
-                                thisindent - conditionalsstack[-1]
-                            )
-                            deltaindent = reduce(
-                                lambda x, y: x + y, deltastack
-                            )
+                            deltastack.append(thisindent - conditionalsstack[-1])
+                            deltaindent = reduce(lambda x, y: x + y, deltastack)
                             deltaindentcalculated = True
                         thisindent -= deltaindent
                     else:
-                        while (
-                            conditionalsstack and
-                            conditionalsstack[-1] >= thisindent
-                        ):
+                        while conditionalsstack and conditionalsstack[-1] >= thisindent:
                             del conditionalsstack[-1]
                             if deltastack:
                                 del deltastack[-1]
                         deltaindentcalculated = False
                 # remember this class
-                cur_class = Class(self.name, class_name, inherit,
-                                  self.file, lineno)
+                cur_class = Class(self.name, class_name, inherit, self.file, lineno)
                 self.__py_setVisibility(cur_class)
                 endlineno = calculateEndline(lineno, srcLines, thisindent)
                 cur_class.setEndLine(endlineno)
@@ -772,39 +785,38 @@
                 self.addClass(class_name, cur_class)
                 # add nested classes to the module
                 classstack.append((cur_class, thisindent))
-            
+
             elif m.start("Attribute") >= 0:
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 index = -1
                 while index >= -len(classstack):
                     if classstack[index][0] is not None:
                         attrName = m.group("AttributeName")
-                        attr = Attribute(
-                            self.name, attrName, self.file, lineno)
+                        attr = Attribute(self.name, attrName, self.file, lineno)
                         self.__py_setVisibility(attr)
                         classstack[index][0].addAttribute(attrName, attr)
                         break
                     else:
                         index -= 1
-            
+
             elif m.start("Main") >= 0:
                 # 'main' part of the script, reset class stack
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 classstack = []
-            
+
             elif m.start("Variable") >= 0:
                 thisindent = _indent(m.group("VariableIndent"))
                 variable_name = m.group("VariableName")
                 isSignal = m.group("VariableSignal") != ""
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 if thisindent == 0:
                     # global variable
                     attr = Attribute(
-                        self.name, variable_name, self.file, lineno,
-                        isSignal=isSignal)
+                        self.name, variable_name, self.file, lineno, isSignal=isSignal
+                    )
                     self.__py_setVisibility(attr)
                     self.addGlobal(variable_name, attr)
                 else:
@@ -813,74 +825,77 @@
                         if classstack[index][1] >= thisindent:
                             index -= 1
                         else:
-                            if (
-                                classstack[index][0] is not None and
-                                isinstance(classstack[index][0], Class)
+                            if classstack[index][0] is not None and isinstance(
+                                classstack[index][0], Class
                             ):
                                 attr = Attribute(
-                                    self.name, variable_name, self.file,
-                                    lineno, isSignal=isSignal)
+                                    self.name,
+                                    variable_name,
+                                    self.file,
+                                    lineno,
+                                    isSignal=isSignal,
+                                )
                                 self.__py_setVisibility(attr)
-                                classstack[index][0].addGlobal(
-                                    variable_name, attr)
+                                classstack[index][0].addGlobal(variable_name, attr)
                             break
 
             elif m.start("Import") >= 0:
-                #- import module
-                names = [n.strip() for n in
-                         "".join(m.group("ImportList").splitlines())
-                         .replace("\\", "").split(',')]
+                # - import module
+                names = [
+                    n.strip()
+                    for n in "".join(m.group("ImportList").splitlines())
+                    .replace("\\", "")
+                    .split(",")
+                ]
                 self.imports.extend(
-                    [name for name in names
-                     if name not in self.imports])
-            
+                    [name for name in names if name not in self.imports]
+                )
+
             elif m.start("ImportFrom") >= 0:
-                #- from module import stuff
+                # - from module import stuff
                 mod = m.group("ImportFromPath")
-                namesLines = (m.group("ImportFromList")
-                              .replace("(", "").replace(")", "")
-                              .replace("\\", "")
-                              .strip().splitlines())
-                namesLines = [line.split("#")[0].strip()
-                              for line in namesLines]
-                names = [n.strip() for n in
-                         "".join(namesLines)
-                         .split(',')]
+                namesLines = (
+                    m.group("ImportFromList")
+                    .replace("(", "")
+                    .replace(")", "")
+                    .replace("\\", "")
+                    .strip()
+                    .splitlines()
+                )
+                namesLines = [line.split("#")[0].strip() for line in namesLines]
+                names = [n.strip() for n in "".join(namesLines).split(",")]
                 if mod not in self.from_imports:
                     self.from_imports[mod] = []
                 self.from_imports[mod].extend(
-                    [name for name in names
-                     if name not in self.from_imports[mod]])
-            
+                    [name for name in names if name not in self.from_imports[mod]]
+                )
+
             elif m.start("ConditionalDefine") >= 0:
                 # a conditional function/method definition
                 thisindent = _indent(m.group("ConditionalDefineIndent"))
-                while (
-                    conditionalsstack and
-                    conditionalsstack[-1] >= thisindent
-                ):
+                while conditionalsstack and conditionalsstack[-1] >= thisindent:
                     del conditionalsstack[-1]
                     if deltastack:
                         del deltastack[-1]
                 conditionalsstack.append(thisindent)
                 deltaindentcalculated = 0
-            
+
             elif m.start("Comment") >= 0 and modulelevel:
                 continue
-            
+
             modulelevel = False
-    
+
     def __rb_scan(self, src):
         """
         Private method to scan the source text of a Python module and retrieve
         the relevant information.
-        
+
         @param src the source text to be scanned
         @type str
         """
         lineno, last_lineno_pos = 1, 0
         classstack = []  # stack of (class, indent) pairs
-        acstack = []    # stack of (access control, indent) pairs
+        acstack = []  # stack of (access control, indent) pairs
         indent = 0
         i = 0
         cur_obj = self
@@ -890,30 +905,28 @@
             if not m:
                 break
             start, i = m.span()
-            
+
             if m.start("Method") >= 0:
                 # found a method definition or function
                 thisindent = indent
                 indent += 1
                 meth_name = (
-                    m.group("MethodName") or
-                    m.group("MethodName2") or
-                    m.group("MethodName3")
+                    m.group("MethodName")
+                    or m.group("MethodName2")
+                    or m.group("MethodName3")
                 )
                 meth_sig = m.group("MethodSignature")
-                meth_sig = meth_sig and meth_sig.replace('\\\n', '') or ''
-                lineno += src.count('\n', last_lineno_pos, start)
+                meth_sig = meth_sig and meth_sig.replace("\\\n", "") or ""
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
-                if meth_name.startswith('self.'):
+                if meth_name.startswith("self."):
                     meth_name = meth_name[5:]
-                elif meth_name.startswith('self::'):
+                elif meth_name.startswith("self::"):
                     meth_name = meth_name[6:]
                 # close all classes/modules indented at least as much
                 while classstack and classstack[-1][1] >= thisindent:
-                    if (
-                        classstack[-1][0] is not None and
-                        isinstance(classstack[-1][0],
-                                   (Class, Function, RbModule))
+                    if classstack[-1][0] is not None and isinstance(
+                        classstack[-1][0], (Class, Function, RbModule)
                     ):
                         # record the end line of this class, function or module
                         classstack[-1][0].setEndLine(lineno - 1)
@@ -928,17 +941,15 @@
                         csi -= 1
                         if cur_class is None:
                             continue
-                        
+
                         if isinstance(cur_class, (Class, RbModule)):
                             # it's a class/module method
-                            f = Function(None, meth_name,
-                                         None, lineno, meth_sig)
+                            f = Function(None, meth_name, None, lineno, meth_sig)
                             cur_class.addMethod(meth_name, f)
                             break
                     else:
                         # it's a nested function of a module function
-                        f = Function(
-                            self.name, meth_name, self.file, lineno, meth_sig)
+                        f = Function(self.name, meth_name, self.file, lineno, meth_sig)
                         self.addFunction(meth_name, f)
                     # set access control
                     if acstack:
@@ -951,8 +962,7 @@
                             f.setPublic()
                 else:
                     # it's a function
-                    f = Function(
-                        self.name, meth_name, self.file, lineno, meth_sig)
+                    f = Function(self.name, meth_name, self.file, lineno, meth_sig)
                     self.addFunction(meth_name, f)
                 if not classstack:
                     if lastGlobalEntry:
@@ -962,26 +972,24 @@
                     cur_obj.setEndLine(lineno - 1)
                 cur_obj = f
                 classstack.append((None, thisindent))  # Marker for nested fns
-            
+
             elif m.start("Docstring") >= 0:
                 contents = m.group("DocstringContents")
                 if contents is not None:
                     contents = _hashsub(r"\1", contents)
                 if cur_obj:
                     cur_obj.addDescription(contents)
-            
+
             elif m.start("Class") >= 0:
                 # we found a class definition
                 thisindent = indent
                 indent += 1
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 # close all classes/modules indented at least as much
                 while classstack and classstack[-1][1] >= thisindent:
-                    if (
-                        classstack[-1][0] is not None and
-                        isinstance(classstack[-1][0],
-                                   (Class, Function, RbModule))
+                    if classstack[-1][0] is not None and isinstance(
+                        classstack[-1][0], (Class, Function, RbModule)
                     ):
                         # record the end line of this class, function or module
                         classstack[-1][0].setEndLine(lineno - 1)
@@ -991,10 +999,9 @@
                 if inherit:
                     # the class inherits from other classes
                     inherit = inherit[1:].strip()
-                    inherit = [_commentsub('', inherit)]
+                    inherit = [_commentsub("", inherit)]
                 # remember this class
-                cur_class = Class(self.name, class_name, inherit,
-                                  self.file, lineno)
+                cur_class = Class(self.name, class_name, inherit, self.file, lineno)
                 # add nested classes to the file
                 if classstack and isinstance(classstack[-1][0], RbModule):
                     parent_obj = classstack[-1][0]
@@ -1003,9 +1010,9 @@
                 if class_name in parent_obj.classes:
                     cur_class = parent_obj.classes[class_name]
                 elif (
-                    classstack and
-                    isinstance(classstack[-1][0], Class) and
-                    class_name == "self"
+                    classstack
+                    and isinstance(classstack[-1][0], Class)
+                    and class_name == "self"
                 ):
                     cur_class = classstack[-1][0]
                 else:
@@ -1020,27 +1027,24 @@
                     del acstack[-1]
                 acstack.append(["public", thisindent])
                 # default access control is 'public'
-            
+
             elif m.start("Module") >= 0:
                 # we found a module definition
                 thisindent = indent
                 indent += 1
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 # close all classes/modules indented at least as much
                 while classstack and classstack[-1][1] >= thisindent:
-                    if (
-                        classstack[-1][0] is not None and
-                        isinstance(classstack[-1][0],
-                                   (Class, Function, RbModule))
+                    if classstack[-1][0] is not None and isinstance(
+                        classstack[-1][0], (Class, Function, RbModule)
                     ):
                         # record the end line of this class, function or module
                         classstack[-1][0].setEndLine(lineno - 1)
                     del classstack[-1]
                 module_name = m.group("ModuleName")
                 # remember this class
-                cur_class = RbModule(self.name, module_name,
-                                     self.file, lineno)
+                cur_class = RbModule(self.name, module_name, self.file, lineno)
                 # add nested Ruby modules to the file
                 if module_name in self.modules:
                     cur_class = self.modules[module_name]
@@ -1056,7 +1060,7 @@
                     del acstack[-1]
                 acstack.append(["public", thisindent])
                 # default access control is 'public'
-            
+
             elif m.start("AccessControl") >= 0:
                 aclist = m.group("AccessControlList")
                 if aclist is None:
@@ -1064,8 +1068,8 @@
                     while index >= -len(acstack):
                         if acstack[index][1] < indent:
                             actype = (
-                                m.group("AccessControlType") or
-                                m.group("AccessControlType2").split('_')[0]
+                                m.group("AccessControlType")
+                                or m.group("AccessControlType2").split("_")[0]
                             )
                             acstack[index][0] = actype.lower()
                             break
@@ -1075,14 +1079,14 @@
                     index = -1
                     while index >= -len(classstack):
                         if (
-                            classstack[index][0] is not None and
-                            not isinstance(classstack[index][0], Function) and
-                            classstack[index][1] < indent
+                            classstack[index][0] is not None
+                            and not isinstance(classstack[index][0], Function)
+                            and classstack[index][1] < indent
                         ):
                             parent = classstack[index][0]
                             actype = (
-                                m.group("AccessControlType") or
-                                m.group("AccessControlType2").split('_')[0]
+                                m.group("AccessControlType")
+                                or m.group("AccessControlType2").split("_")[0]
                             )
                             actype = actype.lower()
                             for name in aclist.split(","):
@@ -1102,18 +1106,17 @@
                             index -= 1
 
             elif m.start("Attribute") >= 0:
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 index = -1
                 while index >= -len(classstack):
                     if (
-                        classstack[index][0] is not None and
-                        not isinstance(classstack[index][0], Function) and
-                        classstack[index][1] < indent
+                        classstack[index][0] is not None
+                        and not isinstance(classstack[index][0], Function)
+                        and classstack[index][1] < indent
                     ):
                         attrName = m.group("AttributeName")
-                        attr = Attribute(
-                            self.name, attrName, self.file, lineno)
+                        attr = Attribute(self.name, attrName, self.file, lineno)
                         if attrName.startswith("@@") or attrName[0].isupper():
                             classstack[index][0].addGlobal(attrName, attr)
                         else:
@@ -1124,22 +1127,21 @@
                 else:
                     attrName = m.group("AttributeName")
                     if attrName[0] != "@":
-                        attr = Attribute(
-                            self.name, attrName, self.file, lineno)
+                        attr = Attribute(self.name, attrName, self.file, lineno)
                         self.addGlobal(attrName, attr)
                     if lastGlobalEntry:
                         lastGlobalEntry.setEndLine(lineno - 1)
                     lastGlobalEntry = None
-            
+
             elif m.start("Attr") >= 0:
-                lineno += src.count('\n', last_lineno_pos, start)
+                lineno += src.count("\n", last_lineno_pos, start)
                 last_lineno_pos = start
                 index = -1
                 while index >= -len(classstack):
                     if (
-                        classstack[index][0] is not None and
-                        not isinstance(classstack[index][0], Function) and
-                        classstack[index][1] < indent
+                        classstack[index][0] is not None
+                        and not isinstance(classstack[index][0], Function)
+                        and classstack[index][1] < indent
                     ):
                         parent = classstack[index][0]
                         if m.group("AttrType") is None:
@@ -1149,10 +1151,9 @@
                             # get rid of leading ':'
                             name = nv[0].strip()[1:]
                             attr = (
-                                parent.getAttribute("@" + name) or
-                                parent.getAttribute("@@" + name) or
-                                Attribute(
-                                    self.name, "@" + name, self.file, lineno)
+                                parent.getAttribute("@" + name)
+                                or parent.getAttribute("@@" + name)
+                                or Attribute(self.name, "@" + name, self.file, lineno)
                             )
                             if len(nv) == 1 or nv[1].strip() == "false":
                                 attr.setProtected()
@@ -1165,11 +1166,11 @@
                                 # get rid of leading ':'
                                 name = name.strip()[1:]
                                 attr = (
-                                    parent.getAttribute("@" + name) or
-                                    parent.getAttribute("@@" + name) or
-                                    Attribute(
-                                        self.name, "@" + name, self.file,
-                                        lineno)
+                                    parent.getAttribute("@" + name)
+                                    or parent.getAttribute("@@" + name)
+                                    or Attribute(
+                                        self.name, "@" + name, self.file, lineno
+                                    )
                                 )
                                 if access == "_accessor":
                                     attr.setPublic()
@@ -1186,7 +1187,7 @@
             elif m.start("Begin") >= 0:
                 # a begin of a block we are not interested in
                 indent += 1
-            
+
             elif m.start("End") >= 0:
                 # an end of a block
                 indent -= 1
@@ -1197,20 +1198,20 @@
                         indent = classstack[-1][1]
                     else:
                         indent = 0
-            
+
             elif (
-                m.start("String") >= 0 or
-                m.start("Comment") >= 0 or
-                m.start("ClassIgnored") >= 0 or
-                m.start("BeginEnd") >= 0
+                m.start("String") >= 0
+                or m.start("Comment") >= 0
+                or m.start("ClassIgnored") >= 0
+                or m.start("BeginEnd") >= 0
             ):
                 pass
-    
+
     def createHierarchy(self):
         """
         Public method to build the inheritance hierarchy for all classes of
         this module.
-        
+
         @return A dictionary with inheritance hierarchies.
         """
         hierarchy = {}
@@ -1219,17 +1220,17 @@
         for module in self.modules:
             self.assembleHierarchy(module, self.modules, [module], hierarchy)
         return hierarchy
-    
+
     def assembleHierarchy(self, name, classes, path, result):
         """
         Public method to assemble the inheritance hierarchy.
-        
+
         This method will traverse the class hierarchy, from a given class
         and build up a nested dictionary of super-classes. The result is
         intended to be inverted, i.e. the highest level are the super classes.
-        
+
         This code is borrowed from Boa Constructor.
-        
+
         @param name name of class to assemble hierarchy (string)
         @param classes A dictionary of classes to look in.
         @param path
@@ -1242,21 +1243,21 @@
                     rv[class_] = {}
                     exhausted = path + [class_]
                     exhausted.reverse()
-                    self.addPathToHierarchy(
-                        exhausted, result, self.addPathToHierarchy)
+                    self.addPathToHierarchy(exhausted, result, self.addPathToHierarchy)
                 else:
                     rv[class_] = self.assembleHierarchy(
-                        class_, classes, path + [class_], result)
-        
+                        class_, classes, path + [class_], result
+                    )
+
         if len(rv) == 0:
             exhausted = path
             exhausted.reverse()
             self.addPathToHierarchy(exhausted, result, self.addPathToHierarchy)
-    
+
     def addPathToHierarchy(self, path, result, fn):
         """
         Public method to put the exhausted path into the result dictionary.
-        
+
         @param path the exhausted path of classes
         @param result the result dictionary
         @param fn function to call for classe that are already part of the
@@ -1269,27 +1270,27 @@
             for part in path:
                 result[part] = {}
                 result = result[part]
-    
+
     def getName(self):
         """
         Public method to retrieve the modules name.
-        
+
         @return module name (string)
         """
         return self.name
-    
+
     def getFileName(self):
         """
         Public method to retrieve the modules filename.
-        
+
         @return module filename (string)
         """
         return self.file
-    
+
     def getType(self):
         """
         Public method to get the type of the module's source.
-        
+
         @return type of the modules's source (string)
         """
         if self.type in [PY_SOURCE, PTL_SOURCE]:
@@ -1305,10 +1306,11 @@
     """
     Class to represent a Python class.
     """
+
     def __init__(self, module, name, superClasses, file, lineno):
         """
         Constructor
-        
+
         @param module name of module containing this class (string)
         @param name name of the class (string)
         @param superClasses list of classnames this class is inherited from
@@ -1326,23 +1328,23 @@
         self.globals = {}
         self.file = file
         self.lineno = lineno
-        self.endlineno = -1     # marker for "not set"
+        self.endlineno = -1  # marker for "not set"
         self.description = ""
         self.setPublic()
 
     def addMethod(self, name, function):
         """
         Public method to add information about a method.
-        
+
         @param name name of method to be added (string)
         @param function Function object to be added
         """
         self.methods[name] = function
-    
+
     def getMethod(self, name):
         """
         Public method to retrieve a method by name.
-        
+
         @param name name of the method (string)
         @return the named method or None
         """
@@ -1350,11 +1352,11 @@
             return self.methods[name]
         except KeyError:
             return None
-    
+
     def addAttribute(self, name, attr):
         """
         Public method to add information about attributes.
-        
+
         @param name name of the attribute to add (string)
         @param attr Attribute object to be added
         """
@@ -1362,11 +1364,11 @@
             self.attributes[name] = attr
         else:
             self.attributes[name].addAssignment(attr.lineno)
-    
+
     def getAttribute(self, name):
         """
         Public method to retrieve an attribute by name.
-        
+
         @param name name of the attribute (string)
         @return the named attribute or None
         """
@@ -1374,11 +1376,11 @@
             return self.attributes[name]
         except KeyError:
             return None
-    
+
     def addGlobal(self, name, attr):
         """
         Public method to add information about global (class) variables.
-        
+
         @param name name of the global to add (string)
         @param attr Attribute object to be added
         """
@@ -1386,19 +1388,19 @@
             self.globals[name] = attr
         else:
             self.globals[name].addAssignment(attr.lineno)
-    
+
     def addDescription(self, description):
         """
         Public method to store the class docstring.
-        
+
         @param description the docstring to be stored (string)
         """
         self.description = description
-    
+
     def setEndLine(self, endLineNo):
         """
         Public method to record the number of the last line of a class.
-        
+
         @param endLineNo number of the last line (integer)
         """
         self.endlineno = endLineNo
@@ -1408,10 +1410,11 @@
     """
     Class to represent a Ruby module.
     """
+
     def __init__(self, module, name, file, lineno):
         """
         Constructor
-        
+
         @param module name of module containing this class (string)
         @param name name of the class (string)
         @param file name of file containing this class (string)
@@ -1419,11 +1422,11 @@
         """
         Class.__init__(self, module, name, None, file, lineno)
         self.classes = {}
-    
+
     def addClass(self, name, _class):
         """
         Public method to add information about a class.
-        
+
         @param name name of class to be added (string)
         @param _class Class object to be added
         """
@@ -1434,15 +1437,25 @@
     """
     Class to represent a Python function or method.
     """
+
     General = 0
     Static = 1
     Class = 2
-    
-    def __init__(self, module, name, file, lineno, signature='',
-                 pyqtSignature=None, modifierType=General, annotation=""):
+
+    def __init__(
+        self,
+        module,
+        name,
+        file,
+        lineno,
+        signature="",
+        pyqtSignature=None,
+        modifierType=General,
+        annotation="",
+    ):
         """
         Constructor
-        
+
         @param module name of module containing this function (string)
         @param name name of the function (string)
         @param file name of file containing this function (string)
@@ -1456,27 +1469,27 @@
         self.name = name
         self.file = file
         self.lineno = lineno
-        self.endlineno = -1     # marker for "not set"
-        signature = _commentsub('', signature)
-        self.parameters = [e.strip() for e in signature.split(',')]
+        self.endlineno = -1  # marker for "not set"
+        signature = _commentsub("", signature)
+        self.parameters = [e.strip() for e in signature.split(",")]
         self.description = ""
         self.pyqtSignature = pyqtSignature
         self.modifier = modifierType
         self.annotation = annotation
         self.setPublic()
-    
+
     def addDescription(self, description):
         """
         Public method to store the functions docstring.
-        
+
         @param description the docstring to be stored (string)
         """
         self.description = description
-    
+
     def setEndLine(self, endLineNo):
         """
         Public method to record the number of the last line of a class.
-        
+
         @param endLineNo number of the last line (integer)
         """
         self.endlineno = endLineNo
@@ -1486,10 +1499,11 @@
     """
     Class to represent a Python function or method.
     """
+
     def __init__(self, module, name, file, lineno, isSignal=False):
         """
         Constructor
-        
+
         @param module name of module containing this function (string)
         @param name name of the function (string)
         @param file name of file containing this function (string)
@@ -1503,11 +1517,11 @@
         self.isSignal = isSignal
         self.setPublic()
         self.linenos = [lineno]
-    
+
     def addAssignment(self, lineno):
         """
         Public method to add another assignment line number.
-        
+
         @param lineno linenumber of the additional attribute assignment
             (integer)
         """
@@ -1515,15 +1529,22 @@
             self.linenos.append(lineno)
 
 
-def readModule(module, path=None, inpackage=False, basename="",
-               extensions=None, caching=True, ignoreBuiltinModules=False):
+def readModule(
+    module,
+    path=None,
+    inpackage=False,
+    basename="",
+    extensions=None,
+    caching=True,
+    ignoreBuiltinModules=False,
+):
     """
     Function to read a module file and parse it.
 
     The module is searched in path and sys.path, read and parsed.
     If the module was parsed before, the information is taken
     from a cache in order to speed up processing.
-    
+
     @param module name of the module to be parsed (string)
     @param path search path for the module (list of strings)
     @param inpackage flag indicating that module is inside a
@@ -1540,73 +1561,69 @@
         module information (Module)
     """
     global _modules
-    
+
     _extensions = (
-        ['.py', '.pyw', '.ptl', '.rb']
-        if extensions is None else
-        extensions[:]
+        [".py", ".pyw", ".ptl", ".rb"] if extensions is None else extensions[:]
     )
     with contextlib.suppress(ValueError):
-        _extensions.remove('.py')
-    
+        _extensions.remove(".py")
+
     modname = module
-    
+
     if os.path.exists(module):
         path = [os.path.dirname(module)]
         if module.lower().endswith(".py"):
             module = module[:-3]
         if (
-            os.path.exists(os.path.join(path[0], "__init__.py")) or
-            os.path.exists(os.path.join(path[0], "__init__.rb")) or
-            inpackage
+            os.path.exists(os.path.join(path[0], "__init__.py"))
+            or os.path.exists(os.path.join(path[0], "__init__.rb"))
+            or inpackage
         ):
             if basename:
                 module = module.replace(basename, "")
             if os.path.isabs(module):
-                modname = os.path.splitdrive(module)[1][len(os.sep):]
+                modname = os.path.splitdrive(module)[1][len(os.sep) :]
             else:
                 modname = module
-            modname = modname.replace(os.sep, '.')
+            modname = modname.replace(os.sep, ".")
             inpackage = 1
         else:
             modname = os.path.basename(module)
         for ext in _extensions:
             if modname.lower().endswith(ext):
-                modname = modname[:-len(ext)]
+                modname = modname[: -len(ext)]
                 break
         module = os.path.basename(module)
-    
+
     if caching and modname in _modules:
         # we've seen this module before...
         return _modules[modname]
-    
+
     if not ignoreBuiltinModules and module in sys.builtin_module_names:
         # this is a built-in module
         mod = Module(modname, None, None)
         if caching:
             _modules[modname] = mod
         return mod
-    
+
     # search the path for the module
     path = [] if path is None else path[:]
     f = None
     if inpackage:
         try:
-            f, file, (suff, mode, moduleType) = find_module(
-                module, path, _extensions)
+            f, file, (suff, mode, moduleType) = find_module(module, path, _extensions)
         except ImportError:
             f = None
     if f is None:
         fullpath = path[:] + sys.path[:]
-        f, file, (suff, mode, moduleType) = find_module(
-            module, fullpath, _extensions)
+        f, file, (suff, mode, moduleType) = find_module(module, fullpath, _extensions)
     if f:
         f.close()
     if moduleType not in SUPPORTED_TYPES:
         # not supported source, can't do anything with this module
         _modules[modname] = Module(modname, None, None)
         return _modules[modname]
-    
+
     mod = Module(modname, file, moduleType)
     with contextlib.suppress(UnicodeError, OSError):
         src = Utilities.readEncodedFile(file)[0]
@@ -1619,7 +1636,7 @@
 def _indent(ws):
     """
     Protected function to determine the indent width of a whitespace string.
-    
+
     @param ws The whitespace string to be cheked. (string)
     @return Length of the whitespace string after tab expansion.
     """
@@ -1629,12 +1646,12 @@
 def find_module(name, path, extensions):
     """
     Module function to extend the Python module finding mechanism.
-    
+
     This function searches for files in the given path. If the filename
     doesn't have an extension or an extension of .py, the normal search
     implemented in the imp module is used. For all other supported files
     only path is searched.
-    
+
     @param name filename or modulename to search for (string)
     @param path search path (list of strings)
     @param extensions list of extensions, which should be considered valid
@@ -1645,43 +1662,43 @@
     """
     for ext in extensions:
         if name.lower().endswith(ext):
-            for p in path:      # only search in path
+            for p in path:  # only search in path
                 if os.path.exists(os.path.join(p, name)):
                     pathname = os.path.join(p, name)
-                    if ext == '.ptl':
+                    if ext == ".ptl":
                         # Quixote page template
                         return (
-                            open(pathname), pathname,
-                            # __IGNORE_WARNING_Y115__
-                            ('.ptl', 'r', PTL_SOURCE)
+                            open(pathname),  # __IGNORE_WARNING_Y115__
+                            pathname,
+                            (".ptl", "r", PTL_SOURCE),
                         )
-                    elif ext == '.rb':
+                    elif ext == ".rb":
                         # Ruby source file
                         return (
-                            open(pathname), pathname,
-                            # __IGNORE_WARNING_Y115__
-                            ('.rb', 'r', RB_SOURCE)
+                            open(pathname),  # __IGNORE_WARNING_Y115__
+                            pathname,
+                            (".rb", "r", RB_SOURCE),
                         )
                     else:
                         return (
-                            open(pathname), pathname,
-                            # __IGNORE_WARNING_Y115__
-                            (ext, 'r', PY_SOURCE)
+                            open(pathname),  # __IGNORE_WARNING_Y115__
+                            pathname,
+                            (ext, "r", PY_SOURCE),
                         )
             raise ImportError
-    
+
     # standard Python module file
-    if name.lower().endswith('.py'):
+    if name.lower().endswith(".py"):
         name = name[:-3]
-    
+
     spec = importlib.machinery.PathFinder.find_spec(name, path)
     if spec is None:
         raise ImportError
     if isinstance(spec.loader, importlib.machinery.SourceFileLoader):
         ext = os.path.splitext(spec.origin)[-1]
-        return (open(spec.origin), spec.origin, (ext, 'r', PY_SOURCE))
+        return (open(spec.origin), spec.origin, (ext, "r", PY_SOURCE))
         # __IGNORE_WARNING_Y115__
-    
+
     raise ImportError
 
 
@@ -1690,18 +1707,18 @@
     Module function to reset the list of modules already parsed.
     """
     _modules.clear()
-    
+
 
 def resetParsedModule(module, basename=""):
     """
     Module function to clear one module from the list of parsed modules.
-    
+
     @param module Name of the module to be parsed (string)
     @param basename a path basename. This basename is deleted from
         the filename of the module file to be cleared. (string)
     """
     modname = module
-    
+
     if os.path.exists(module):
         path = [os.path.dirname(module)]
         if module.lower().endswith(".py"):
@@ -1709,17 +1726,14 @@
         if os.path.exists(os.path.join(path[0], "__init__.py")):
             if basename:
                 module = module.replace(basename, "")
-            modname = module.replace(os.sep, '.')
+            modname = module.replace(os.sep, ".")
         else:
             modname = os.path.basename(module)
-        if (
-            modname.lower().endswith(".ptl") or
-            modname.lower().endswith(".pyw")
-        ):
+        if modname.lower().endswith(".ptl") or modname.lower().endswith(".pyw"):
             modname = modname[:-4]
         elif modname.lower().endswith(".rb"):
             modname = modname[:-3]
         module = os.path.basename(module)
-    
+
     if modname in _modules:
         del _modules[modname]
--- a/src/eric7/Utilities/MouseUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/MouseUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,46 +14,63 @@
 if Globals.isMacPlatform():
     __modifier2String = {
         Qt.KeyboardModifier.ShiftModifier: QCoreApplication.translate(
-            "MouseUtilities", "Shift"),
+            "MouseUtilities", "Shift"
+        ),
         Qt.KeyboardModifier.AltModifier: QCoreApplication.translate(
-            "MouseUtilities", "Alt"),
+            "MouseUtilities", "Alt"
+        ),
         Qt.KeyboardModifier.ControlModifier: QCoreApplication.translate(
-            "MouseUtilities", "Cmd"),
+            "MouseUtilities", "Cmd"
+        ),
         Qt.KeyboardModifier.MetaModifier: QCoreApplication.translate(
-            "MouseUtilities", "Ctrl"),
+            "MouseUtilities", "Ctrl"
+        ),
     }
-    __modifierOrder = [Qt.KeyboardModifier.MetaModifier,
-                       Qt.KeyboardModifier.AltModifier,
-                       Qt.KeyboardModifier.ShiftModifier,
-                       Qt.KeyboardModifier.ControlModifier]
+    __modifierOrder = [
+        Qt.KeyboardModifier.MetaModifier,
+        Qt.KeyboardModifier.AltModifier,
+        Qt.KeyboardModifier.ShiftModifier,
+        Qt.KeyboardModifier.ControlModifier,
+    ]
 else:
     __modifier2String = {
         Qt.KeyboardModifier.ShiftModifier: QCoreApplication.translate(
-            "MouseUtilities", "Shift"),
+            "MouseUtilities", "Shift"
+        ),
         Qt.KeyboardModifier.AltModifier: QCoreApplication.translate(
-            "MouseUtilities", "Alt"),
+            "MouseUtilities", "Alt"
+        ),
         Qt.KeyboardModifier.ControlModifier: QCoreApplication.translate(
-            "MouseUtilities", "Ctrl"),
+            "MouseUtilities", "Ctrl"
+        ),
         Qt.KeyboardModifier.MetaModifier: QCoreApplication.translate(
-            "MouseUtilities", "Meta"),
+            "MouseUtilities", "Meta"
+        ),
     }
-    __modifierOrder = [Qt.KeyboardModifier.MetaModifier,
-                       Qt.KeyboardModifier.ControlModifier,
-                       Qt.KeyboardModifier.AltModifier,
-                       Qt.KeyboardModifier.ShiftModifier]
+    __modifierOrder = [
+        Qt.KeyboardModifier.MetaModifier,
+        Qt.KeyboardModifier.ControlModifier,
+        Qt.KeyboardModifier.AltModifier,
+        Qt.KeyboardModifier.ShiftModifier,
+    ]
 
 
 __button2String = {
     Qt.MouseButton.LeftButton: QCoreApplication.translate(
-        "MouseUtilities", "Left Button"),
+        "MouseUtilities", "Left Button"
+    ),
     Qt.MouseButton.RightButton: QCoreApplication.translate(
-        "MouseUtilities", "Right Button"),
+        "MouseUtilities", "Right Button"
+    ),
     Qt.MouseButton.MiddleButton: QCoreApplication.translate(
-        "MouseUtilities", "Middle Button"),
+        "MouseUtilities", "Middle Button"
+    ),
     Qt.MouseButton.XButton1: QCoreApplication.translate(
-        "MouseUtilities", "Extra Button 1"),
+        "MouseUtilities", "Extra Button 1"
+    ),
     Qt.MouseButton.XButton2: QCoreApplication.translate(
-        "MouseUtilities", "Extra Button 2"),
+        "MouseUtilities", "Extra Button 2"
+    ),
 }
 
 
@@ -61,7 +78,7 @@
     """
     Function to convert a modifier and mouse button combination to a
     displayable string.
-    
+
     @param modifiers keyboard modifiers of the handler
     @type Qt.KeyboardModifiers
     @param button mouse button of the handler
@@ -71,7 +88,7 @@
     """
     if button not in __button2String:
         return ""
-    
+
     parts = []
     for mod in __modifierOrder:
         if modifiers & mod:
--- a/src/eric7/Utilities/PasswordChecker.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/PasswordChecker.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,45 +14,42 @@
     """
     Class implementing a checker for password strength.
     """
+
     Complexity_VeryWeak = 0
     Complexity_Weak = 1
     Complexity_Good = 2
     Complexity_Strong = 3
     Complexity_VeryStrong = 4
-    
+
     Status_Failed = 0
     Status_Passed = 1
     Status_Exceeded = 2
-    
+
     def __init__(self):
         """
         Constructor
         """
-        self.score = {
-            "count": 0,
-            "adjusted": 0,
-            "beforeRedundancy": 0
-        }
-        
+        self.score = {"count": 0, "adjusted": 0, "beforeRedundancy": 0}
+
         # complexity index
         self.complexity = {
             "limits": [20, 50, 60, 80, 100],
-            "value": self.Complexity_VeryWeak
+            "value": self.Complexity_VeryWeak,
         }
-        
+
         # check categories follow
-        
+
         # length of the password
         self.passwordLength = {
             "count": 0,
             "minimum": 6,
             "status": self.Status_Failed,
             "rating": 0,
-            "factor": 0.5,      # per character bonus
-            "bonus": 10,        # minimum reached? Get a bonus.
-            "penalty": -20,     # if we stay under minimum, we get punished
+            "factor": 0.5,  # per character bonus
+            "bonus": 10,  # minimum reached? Get a bonus.
+            "penalty": -20,  # if we stay under minimum, we get punished
         }
-        
+
         # recommended password length
         self.recommendedPasswordLength = {
             "count": 0,
@@ -63,7 +60,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # Basic requirements are:
         # 1) Password Length
         # 2) Uppercase letter use
@@ -72,26 +69,26 @@
         # 5) Symbol use
         self.basicRequirements = {
             "count": 0,
-            "minimum": 3,       # have to be matched to get the bonus
+            "minimum": 3,  # have to be matched to get the bonus
             "status": self.Status_Failed,
             "rating": 0,
             "factor": 1.0,
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # how much redundancy is permitted, if the password is
         # long enough. we will skip the redudancy penalty if this
         # number is not exceeded (meaning redundancy < this number)
         self.redundancy = {
-            "value": 1,         # 1 means, not double characters,
-                                # default to start
-            "permitted": 2.0,   # 2 means, in average every character
-                                # can occur twice
+            "value": 1,  # 1 means, not double characters,
+            # default to start
+            "permitted": 2.0,  # 2 means, in average every character
+            # can occur twice
             "status": self.Status_Failed,
             "rating": 0,
         }
-        
+
         # number of uppercase letters, such as A-Z
         self.uppercaseLetters = {
             "count": 0,
@@ -102,7 +99,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # number of lowercase letters, such as a-z
         self.lowercaseLetters = {
             "count": 0,
@@ -113,7 +110,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # number of numeric characters
         self.numerics = {
             "count": 0,
@@ -124,7 +121,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # number of symbol characters
         self.symbols = {
             "count": 0,
@@ -135,7 +132,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # number of dedicated symbols in the middle
         self.middleSymbols = {
             "count": 0,
@@ -146,7 +143,7 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # number of dedicated numbers in the middle
         self.middleNumerics = {
             "count": 0,
@@ -157,13 +154,12 @@
             "bonus": 10,
             "penalty": -10,
         }
-        
+
         # how many sequential characters should be checked
         # such as "abc" or "MNO" to be not part of the password
         self.sequentialLetters = {
             "data": "abcdefghijklmnopqrstuvwxyz",
             "length": 3,
-            
             "count": 0,
             "status": self.Status_Failed,
             "rating": 0,
@@ -171,13 +167,12 @@
             "bonus": 0,
             "penalty": -10,
         }
-        
+
         # how many sequential characters should be checked
         # such as "123" to be not part of the password
         self.sequentialNumerics = {
             "data": "0123456789",
             "length": 3,
-            
             "count": 0,
             "status": self.Status_Failed,
             "rating": 0,
@@ -185,34 +180,37 @@
             "bonus": 0,
             "penalty": -10,
         }
-        
+
         # keyboard patterns to check, typical sequences from your
         # keyboard
         self.keyboardPatterns = {
             # German and English keyboard text
             "data": [
-                "qwertzuiop", "asdfghjkl", "yxcvbnm", "!\"§$%&/()=",    # de
-                "1234567890",   # de numbers
-                "qaywsxedcrfvtgbzhnujmik,ol.pö-üä+#",   # de up-down
-                
-                "qwertyuiop", "asdfghjkl", "zyxcvbnm", "!@#$%^&*()_",   # en
-                "1234567890",   # en numbers
+                "qwertzuiop",
+                "asdfghjkl",
+                "yxcvbnm",
+                '!"§$%&/()=',  # de
+                "1234567890",  # de numbers
+                "qaywsxedcrfvtgbzhnujmik,ol.pö-üä+#",  # de up-down
+                "qwertyuiop",
+                "asdfghjkl",
+                "zyxcvbnm",
+                "!@#$%^&*()_",  # en
+                "1234567890",  # en numbers
                 "qazwsxedcrfvtgbyhnujmik,ol.p;/[']\\",  # en up-down
             ],
-            "length": 4,    # how long is the pattern to check and blame for?
-            
-            "count": 0,     # how many of these pattern can be found
+            "length": 4,  # how long is the pattern to check and blame for?
+            "count": 0,  # how many of these pattern can be found
             "status": self.Status_Failed,
             "rating": 0,
-            "factor": -1.0,     # each occurrence is punished with that factor
+            "factor": -1.0,  # each occurrence is punished with that factor
             "bonus": 0,
             "penalty": -10,
         }
-        
+
         # check for repeated sequences, like in catcat
         self.repeatedSequences = {
             "length": 3,
-            
             "count": 0,
             "status": self.Status_Failed,
             "rating": 0,
@@ -220,11 +218,10 @@
             "bonus": 0,
             "penalty": -10,
         }
-        
+
         # check for repeated mirrored sequences, like in tactac
         self.mirroredSequences = {
             "length": 3,
-            
             "count": 0,
             "status": self.Status_Failed,
             "rating": 0,
@@ -232,25 +229,25 @@
             "bonus": 0,
             "penalty": -10,
         }
-        
+
         self.uppercaseRe = re.compile("[A-Z]")
         self.lowercaseRe = re.compile("[a-z]")
         self.numberRe = re.compile("[0-9]")
         self.symbolRe = re.compile("[^a-zA-Z0-9]")
-    
+
     def __strReverse(self, string):
         """
         Private method to reverse a string.
-        
+
         @param string string to be reversed (string)
         @return reversed string (string)
         """
         return "".join(reversed(string))
-    
+
     def __determineStatus(self, value):
         """
         Private method to determine the status.
-        
+
         @param value value to check (integer)
         @return status (Status_Failed, Status_Passed, Status_Exceeded)
         """
@@ -260,11 +257,11 @@
             return self.Status_Exceeded
         else:
             return self.Status_Failed
-    
+
     def __determineBinaryStatus(self, value):
         """
         Private method to determine a binary status.
-        
+
         @param value value to check (integer)
         @return status (Status_Failed, Status_Passed)
         """
@@ -272,11 +269,11 @@
             return self.Status_Passed
         else:
             return self.Status_Failed
-    
+
     def checkPassword(self, password):
         """
         Public method to check a given password.
-        
+
         @param password password to be checked (string)
         @return indication for the password strength (Complexity_VeryWeak,
             Complexity_Weak, Complexity_Good, Complexity_Strong,
@@ -285,7 +282,7 @@
         # how long is the password?
         self.passwordLength["count"] = len(password)
         self.recommendedPasswordLength["count"] = len(password)
-        
+
         # Loop through password to check for Symbol, Numeric, Lowercase
         # and Uppercase pattern matches
         for index in range(len(password)):
@@ -301,7 +298,7 @@
                 if index > 0 and index < len(password) - 1:
                     self.middleSymbols["count"] += 1
                 self.symbols["count"] += 1
-        
+
         # check the variance of symbols or better the redundancy
         # makes only sense for at least two characters
         if len(password) > 1:
@@ -314,345 +311,352 @@
                         break
                 if not found:
                     uniqueCharacters.append(password[index1])
-            
+
             # calculate a redundancy number
             self.redundancy["value"] = len(password) / len(uniqueCharacters)
-        
+
         # Check for sequential alpha string patterns (forward and reverse)
         # but only, if the string has already a length to check for, does
         # not make sense to check the password "ab" for the sequential data
         # "abc"
         lowercasedPassword = password.lower()
-        
+
         if self.passwordLength["count"] >= self.sequentialLetters["length"]:
-            for index in range(len(self.sequentialLetters["data"]) -
-                               self.sequentialLetters["length"] + 1):
+            for index in range(
+                len(self.sequentialLetters["data"])
+                - self.sequentialLetters["length"]
+                + 1
+            ):
                 fwd = self.sequentialLetters["data"][
-                    index:index + self.sequentialLetters["length"]]
+                    index : index + self.sequentialLetters["length"]
+                ]
                 rev = self.__strReverse(fwd)
                 if lowercasedPassword.find(fwd) != -1:
                     self.sequentialLetters["count"] += 1
                 if lowercasedPassword.find(rev) != -1:
                     self.sequentialLetters["count"] += 1
-        
+
         # Check for sequential numeric string patterns (forward and reverse)
         if self.passwordLength["count"] >= self.sequentialNumerics["length"]:
-            for index in range(len(self.sequentialNumerics["data"]) -
-                               self.sequentialNumerics["length"] + 1):
+            for index in range(
+                len(self.sequentialNumerics["data"])
+                - self.sequentialNumerics["length"]
+                + 1
+            ):
                 fwd = self.sequentialNumerics["data"][
-                    index:index + self.sequentialNumerics["length"]]
+                    index : index + self.sequentialNumerics["length"]
+                ]
                 rev = self.__strReverse(fwd)
                 if lowercasedPassword.find(fwd) != -1:
                     self.sequentialNumerics["count"] += 1
                 if lowercasedPassword.find(rev) != -1:
                     self.sequentialNumerics["count"] += 1
-        
+
         # Check common keyboard patterns
         patternsMatched = []
         if self.passwordLength["count"] >= self.keyboardPatterns["length"]:
             for pattern in self.keyboardPatterns["data"]:
-                for index in range(
-                        len(pattern) - self.keyboardPatterns["length"] + 1):
-                    fwd = pattern[index:index +
-                                  self.keyboardPatterns["length"]]
+                for index in range(len(pattern) - self.keyboardPatterns["length"] + 1):
+                    fwd = pattern[index : index + self.keyboardPatterns["length"]]
                     rev = self.__strReverse(fwd)
                     if (
-                        lowercasedPassword.find(fwd) != -1 and
-                        fwd not in patternsMatched
+                        lowercasedPassword.find(fwd) != -1
+                        and fwd not in patternsMatched
                     ):
                         self.keyboardPatterns["count"] += 1
                         patternsMatched.append(fwd)
                     if (
-                        lowercasedPassword.find(rev) != -1 and
-                        fwd not in patternsMatched
+                        lowercasedPassword.find(rev) != -1
+                        and fwd not in patternsMatched
                     ):
                         self.keyboardPatterns["count"] += 1
                         patternsMatched.append(rev)
-        
+
         # Try to find repeated sequences of characters.
         if self.passwordLength["count"] >= self.repeatedSequences["length"]:
-            for index in range(len(lowercasedPassword) -
-                               self.repeatedSequences["length"] + 1):
+            for index in range(
+                len(lowercasedPassword) - self.repeatedSequences["length"] + 1
+            ):
                 fwd = lowercasedPassword[
-                    index:index + self.repeatedSequences["length"]]
-                if lowercasedPassword.find(
-                   fwd, index + self.repeatedSequences["length"]) != -1:
+                    index : index + self.repeatedSequences["length"]
+                ]
+                if (
+                    lowercasedPassword.find(
+                        fwd, index + self.repeatedSequences["length"]
+                    )
+                    != -1
+                ):
                     self.repeatedSequences["count"] += 1
-        
+
         # Try to find mirrored sequences of characters.
         if self.passwordLength["count"] >= self.mirroredSequences["length"]:
-            for index in range(len(lowercasedPassword) -
-                               self.mirroredSequences["length"] + 1):
+            for index in range(
+                len(lowercasedPassword) - self.mirroredSequences["length"] + 1
+            ):
                 fwd = lowercasedPassword[
-                    index:index + self.mirroredSequences["length"]]
+                    index : index + self.mirroredSequences["length"]
+                ]
                 rev = self.__strReverse(fwd)
-                if lowercasedPassword.find(
-                   fwd, index + self.mirroredSequences["length"]) != -1:
+                if (
+                    lowercasedPassword.find(
+                        fwd, index + self.mirroredSequences["length"]
+                    )
+                    != -1
+                ):
                     self.mirroredSequences["count"] += 1
-        
+
         # Initial score based on length
         self.score["count"] = (
             self.passwordLength["count"] * self.passwordLength["factor"]
         )
-        
+
         # passwordLength
         # credit additional length or punish "under" length
         if self.passwordLength["count"] >= self.passwordLength["minimum"]:
             # credit additional characters over minimum
             self.passwordLength["rating"] = (
-                self.passwordLength["bonus"] +
-                (self.passwordLength["count"] -
-                 self.passwordLength["minimum"]) *
-                self.passwordLength["factor"]
+                self.passwordLength["bonus"]
+                + (self.passwordLength["count"] - self.passwordLength["minimum"])
+                * self.passwordLength["factor"]
             )
         else:
             self.passwordLength["rating"] = self.passwordLength["penalty"]
         self.score["count"] += self.passwordLength["rating"]
-        
+
         # recommendedPasswordLength
         # Credit reaching the recommended password length or put a
         # penalty on it
-        if (
-            self.passwordLength["count"] >=
-            self.recommendedPasswordLength["minimum"]
-        ):
+        if self.passwordLength["count"] >= self.recommendedPasswordLength["minimum"]:
             self.recommendedPasswordLength["rating"] = (
-                self.recommendedPasswordLength["bonus"] +
-                (self.passwordLength["count"] -
-                 self.recommendedPasswordLength["minimum"]) *
-                self.recommendedPasswordLength["factor"]
+                self.recommendedPasswordLength["bonus"]
+                + (
+                    self.passwordLength["count"]
+                    - self.recommendedPasswordLength["minimum"]
+                )
+                * self.recommendedPasswordLength["factor"]
             )
         else:
-            self.recommendedPasswordLength["rating"] = (
-                self.recommendedPasswordLength["penalty"]
-            )
+            self.recommendedPasswordLength["rating"] = self.recommendedPasswordLength[
+                "penalty"
+            ]
         self.score["count"] += self.recommendedPasswordLength["rating"]
-        
+
         # lowercaseLetters
         # Honor or punish the lowercase letter use
         if self.lowercaseLetters["count"] > 0:
             self.lowercaseLetters["rating"] = (
-                self.lowercaseLetters["bonus"] +
-                self.lowercaseLetters["count"] *
-                self.lowercaseLetters["factor"]
+                self.lowercaseLetters["bonus"]
+                + self.lowercaseLetters["count"] * self.lowercaseLetters["factor"]
             )
         else:
             self.lowercaseLetters["rating"] = self.lowercaseLetters["penalty"]
         self.score["count"] += self.lowercaseLetters["rating"]
-        
+
         # uppercaseLetters
         # Honor or punish the lowercase letter use
         if self.uppercaseLetters["count"] > 0:
             self.uppercaseLetters["rating"] = (
-                self.uppercaseLetters["bonus"] +
-                self.uppercaseLetters["count"] *
-                self.uppercaseLetters["factor"]
+                self.uppercaseLetters["bonus"]
+                + self.uppercaseLetters["count"] * self.uppercaseLetters["factor"]
             )
         else:
             self.uppercaseLetters["rating"] = self.uppercaseLetters["penalty"]
         self.score["count"] += self.uppercaseLetters["rating"]
-        
+
         # numerics
         # Honor or punish the numerics use
         if self.numerics["count"] > 0:
             self.numerics["rating"] = (
-                self.numerics["bonus"] +
-                self.numerics["count"] * self.numerics["factor"]
+                self.numerics["bonus"]
+                + self.numerics["count"] * self.numerics["factor"]
             )
         else:
             self.numerics["rating"] = self.numerics["penalty"]
         self.score["count"] += self.numerics["rating"]
-        
+
         # symbols
         # Honor or punish the symbols use
         if self.symbols["count"] > 0:
             self.symbols["rating"] = (
-                self.symbols["bonus"] +
-                self.symbols["count"] * self.symbols["factor"]
+                self.symbols["bonus"] + self.symbols["count"] * self.symbols["factor"]
             )
         else:
             self.symbols["rating"] = self.symbols["penalty"]
         self.score["count"] += self.symbols["rating"]
-        
+
         # middleSymbols
         # Honor or punish the middle symbols use
         if self.middleSymbols["count"] > 0:
             self.middleSymbols["rating"] = (
-                self.middleSymbols["bonus"] +
-                self.middleSymbols["count"] * self.middleSymbols["factor"]
+                self.middleSymbols["bonus"]
+                + self.middleSymbols["count"] * self.middleSymbols["factor"]
             )
         else:
             self.middleSymbols["rating"] = self.middleSymbols["penalty"]
         self.score["count"] += self.middleSymbols["rating"]
-        
+
         # middleNumerics
         # Honor or punish the middle numerics use
         if self.middleNumerics["count"] > 0:
             self.middleNumerics["rating"] = (
-                self.middleNumerics["bonus"] +
-                self.middleNumerics["count"] * self.middleNumerics["factor"]
+                self.middleNumerics["bonus"]
+                + self.middleNumerics["count"] * self.middleNumerics["factor"]
             )
         else:
             self.middleNumerics["rating"] = self.middleNumerics["penalty"]
         self.score["count"] += self.middleNumerics["rating"]
-        
+
         # sequentialLetters
         # Honor or punish the sequential letter use
         if self.sequentialLetters["count"] == 0:
             self.sequentialLetters["rating"] = (
-                self.sequentialLetters["bonus"] +
-                self.sequentialLetters["count"] *
-                self.sequentialLetters["factor"]
+                self.sequentialLetters["bonus"]
+                + self.sequentialLetters["count"] * self.sequentialLetters["factor"]
             )
         else:
-            self.sequentialLetters["rating"] = (
-                self.sequentialLetters["penalty"]
-            )
+            self.sequentialLetters["rating"] = self.sequentialLetters["penalty"]
         self.score["count"] += self.sequentialLetters["rating"]
-        
+
         # sequentialNumerics
         # Honor or punish the sequential numerics use
         if self.sequentialNumerics["count"] == 0:
             self.sequentialNumerics["rating"] = (
-                self.sequentialNumerics["bonus"] +
-                self.sequentialNumerics["count"] *
-                self.sequentialNumerics["factor"]
+                self.sequentialNumerics["bonus"]
+                + self.sequentialNumerics["count"] * self.sequentialNumerics["factor"]
             )
         else:
-            self.sequentialNumerics["rating"] = (
-                self.sequentialNumerics["penalty"]
-            )
+            self.sequentialNumerics["rating"] = self.sequentialNumerics["penalty"]
         self.score["count"] += self.sequentialNumerics["rating"]
-        
+
         # keyboardPatterns
         # Honor or punish the keyboard patterns use
         if self.keyboardPatterns["count"] == 0:
             self.keyboardPatterns["rating"] = (
-                self.keyboardPatterns["bonus"] +
-                self.keyboardPatterns["count"] *
-                self.keyboardPatterns["factor"]
+                self.keyboardPatterns["bonus"]
+                + self.keyboardPatterns["count"] * self.keyboardPatterns["factor"]
             )
         else:
             self.keyboardPatterns["rating"] = self.keyboardPatterns["penalty"]
         self.score["count"] += self.keyboardPatterns["rating"]
-        
+
         # Count our basicRequirements and set the status
         self.basicRequirements["count"] = 0
-        
+
         # password length
         self.passwordLength["status"] = self.__determineStatus(
-            self.passwordLength["count"] - self.passwordLength["minimum"])
+            self.passwordLength["count"] - self.passwordLength["minimum"]
+        )
         if self.passwordLength["status"] != self.Status_Failed:
             # requirement met
             self.basicRequirements["count"] += 1
-        
+
         # uppercase letters
         self.uppercaseLetters["status"] = self.__determineStatus(
-            self.uppercaseLetters["count"] - self.uppercaseLetters["minimum"])
+            self.uppercaseLetters["count"] - self.uppercaseLetters["minimum"]
+        )
         if self.uppercaseLetters["status"] != self.Status_Failed:
             # requirement met
             self.basicRequirements["count"] += 1
-        
+
         # lowercase letters
         self.lowercaseLetters["status"] = self.__determineStatus(
-            self.lowercaseLetters["count"] - self.lowercaseLetters["minimum"])
+            self.lowercaseLetters["count"] - self.lowercaseLetters["minimum"]
+        )
         if self.lowercaseLetters["status"] != self.Status_Failed:
             # requirement met
             self.basicRequirements["count"] += 1
-        
+
         # numerics
         self.numerics["status"] = self.__determineStatus(
-            self.numerics["count"] - self.numerics["minimum"])
+            self.numerics["count"] - self.numerics["minimum"]
+        )
         if self.numerics["status"] != self.Status_Failed:
             # requirement met
             self.basicRequirements["count"] += 1
-        
+
         # symbols
         self.symbols["status"] = self.__determineStatus(
-            self.symbols["count"] - self.symbols["minimum"])
+            self.symbols["count"] - self.symbols["minimum"]
+        )
         if self.symbols["status"] != self.Status_Failed:
             # requirement met
             self.basicRequirements["count"] += 1
-        
+
         # judge the requirement status
         self.basicRequirements["status"] = self.__determineStatus(
-            self.basicRequirements["count"] -
-            self.basicRequirements["minimum"])
+            self.basicRequirements["count"] - self.basicRequirements["minimum"]
+        )
         if self.basicRequirements["status"] != self.Status_Failed:
             self.basicRequirements["rating"] = (
-                self.basicRequirements["bonus"] +
-                self.basicRequirements["factor"] *
-                self.basicRequirements["count"]
+                self.basicRequirements["bonus"]
+                + self.basicRequirements["factor"] * self.basicRequirements["count"]
             )
         else:
-            self.basicRequirements["rating"] = (
-                self.basicRequirements["penalty"]
-            )
+            self.basicRequirements["rating"] = self.basicRequirements["penalty"]
         self.score["count"] += self.basicRequirements["rating"]
-        
+
         # beyond basic requirements
         self.recommendedPasswordLength["status"] = self.__determineStatus(
-            self.recommendedPasswordLength["count"] -
-            self.recommendedPasswordLength["minimum"])
+            self.recommendedPasswordLength["count"]
+            - self.recommendedPasswordLength["minimum"]
+        )
         self.middleNumerics["status"] = self.__determineStatus(
-            self.middleNumerics["count"] -
-            self.middleNumerics["minimum"])
+            self.middleNumerics["count"] - self.middleNumerics["minimum"]
+        )
         self.middleSymbols["status"] = self.__determineStatus(
-            self.middleSymbols["count"] -
-            self.middleSymbols["minimum"])
+            self.middleSymbols["count"] - self.middleSymbols["minimum"]
+        )
         self.sequentialLetters["status"] = self.__determineBinaryStatus(
-            self.sequentialLetters["count"])
+            self.sequentialLetters["count"]
+        )
         self.sequentialNumerics["status"] = self.__determineBinaryStatus(
-            self.sequentialNumerics["count"])
+            self.sequentialNumerics["count"]
+        )
         self.keyboardPatterns["status"] = self.__determineBinaryStatus(
-            self.keyboardPatterns["count"])
+            self.keyboardPatterns["count"]
+        )
         self.repeatedSequences["status"] = self.__determineBinaryStatus(
-            self.repeatedSequences["count"])
+            self.repeatedSequences["count"]
+        )
         self.mirroredSequences["status"] = self.__determineBinaryStatus(
-            self.mirroredSequences["count"])
-        
+            self.mirroredSequences["count"]
+        )
+
         # we apply them only, if the length is not awesome
         if self.recommendedPasswordLength["status"] != self.Status_Exceeded:
             # repeatedSequences
             # Honor or punish the use of repeated sequences
             if self.repeatedSequences["count"] == 0:
-                self.repeatedSequences["rating"] = (
-                    self.repeatedSequences["bonus"]
-                )
+                self.repeatedSequences["rating"] = self.repeatedSequences["bonus"]
             else:
                 self.repeatedSequences["rating"] = (
-                    self.repeatedSequences["penalty"] +
-                    self.repeatedSequences["count"] *
-                    self.repeatedSequences["factor"]
+                    self.repeatedSequences["penalty"]
+                    + self.repeatedSequences["count"] * self.repeatedSequences["factor"]
                 )
-            
+
             # mirroredSequences
             # Honor or punish the use of mirrored sequences
             if self.mirroredSequences["count"] == 0:
-                self.mirroredSequences["rating"] = (
-                    self.mirroredSequences["bonus"]
-                )
+                self.mirroredSequences["rating"] = self.mirroredSequences["bonus"]
             else:
                 self.mirroredSequences["rating"] = (
-                    self.mirroredSequences["penalty"] +
-                    self.mirroredSequences["count"] *
-                    self.mirroredSequences["factor"]
+                    self.mirroredSequences["penalty"]
+                    + self.mirroredSequences["count"] * self.mirroredSequences["factor"]
                 )
-        
+
         # save value before redundancy
         self.score["beforeRedundancy"] = self.score["count"]
-        
+
         # apply the redundancy
         # is the password length requirement fulfilled?
         if (
-            self.recommendedPasswordLength[
-                "status"] != self.Status_Exceeded and
-            self.score["count"] > 0
+            self.recommendedPasswordLength["status"] != self.Status_Exceeded
+            and self.score["count"] > 0
         ):
             # full penalty, because password is not long enough, only for
             # a positive score
             self.score["count"] *= 1.0 / self.redundancy["value"]
-        
+
         # level it out
         if self.score["count"] > 100:
             self.score["adjusted"] = 100
@@ -660,11 +664,11 @@
             self.score["adjusted"] = 0
         else:
             self.score["adjusted"] = self.score["count"]
-        
+
         # judge it
         for index in range(len(self.complexity["limits"])):
             if self.score["adjusted"] <= self.complexity["limits"][index]:
                 self.complexity["value"] = index
                 break
-        
+
         return self.complexity["value"]
--- a/src/eric7/Utilities/PySideImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/PySideImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,26 +13,28 @@
     pySideVariant = "2"
     if len(sys.argv) == 2:
         pySideVariant = sys.argv[1].replace("--variant=", "")
-    
+
     if pySideVariant == "1":
         # no PySide support anymore
         ret = 1
-    
+
     elif pySideVariant == "2":
         try:
-            import PySide2       # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+            import PySide2  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+
             ret = 0
         except ImportError:
             ret = 1
-    
+
     elif pySideVariant == "6":
         try:
-            import PySide6       # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+            import PySide6  # __IGNORE_EXCEPTION__ __IGNORE_WARNING__
+
             ret = 0
         except ImportError:
             ret = 1
-    
+
     else:
         ret = 1
-    
+
     sys.exit(ret)
--- a/src/eric7/Utilities/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,14 +18,14 @@
 import pathlib
 import re
 import shlex
-import subprocess           # secok
+import subprocess  # secok
 import sys
 
 
 def __showwarning(message, category, filename, lineno, file=None, line=""):
     """
     Module function to raise a SyntaxError for a SyntaxWarning.
-    
+
     @param message warning object
     @param category type object of the warning
     @param filename name of the file causing the warning (string)
@@ -39,24 +39,40 @@
         err.filename = filename
         err.lineno = lineno
         raise err
-    
+
+
 import warnings
+
 warnings.showwarning = __showwarning
 
 from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF32
 
 from PyQt6.QtCore import (
-    qVersion, PYQT_VERSION_STR, QDir, QProcess, QByteArray, QCoreApplication,
-    QCryptographicHash
+    qVersion,
+    PYQT_VERSION_STR,
+    QDir,
+    QProcess,
+    QByteArray,
+    QCoreApplication,
+    QCryptographicHash,
 )
 from PyQt6.Qsci import QSCINTILLA_VERSION_STR, QsciScintilla
 
 # import these methods into the Utilities namespace
 from Globals import (  # __IGNORE_WARNING__
-    isWindowsPlatform, isLinuxPlatform, isMacPlatform, desktopName,
-    sessionType, getConfigDir, setConfigDir, getPythonLibraryDirectory,
-    getPyQt6ModulesDirectory, getQtBinariesPath, getPyQtToolsPath,
-    qVersionTuple, getPythonExecutable
+    isWindowsPlatform,
+    isLinuxPlatform,
+    isMacPlatform,
+    desktopName,
+    sessionType,
+    getConfigDir,
+    setConfigDir,
+    getPythonLibraryDirectory,
+    getPyQt6ModulesDirectory,
+    getQtBinariesPath,
+    getPyQtToolsPath,
+    qVersionTuple,
+    getPythonExecutable,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -66,57 +82,110 @@
 import Preferences
 from Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheck import (
     # __IGNORE_WARNING__
-    normalizeCode)
+    normalizeCode,
+)
 
 from eric7config import getConfig
 
 configDir = None
 
 codingBytes_regexps = [
-    (5, re.compile(br'''coding[:=]\s*([-\w_.]+)''')),
-    (1, re.compile(br'''<\?xml.*\bencoding\s*=\s*['"]([-\w_.]+)['"]\?>''')),
+    (5, re.compile(rb"""coding[:=]\s*([-\w_.]+)""")),
+    (1, re.compile(rb"""<\?xml.*\bencoding\s*=\s*['"]([-\w_.]+)['"]\?>""")),
 ]
 coding_regexps = [
-    (5, re.compile(r'''coding[:=]\s*([-\w_.]+)''')),
-    (1, re.compile(r'''<\?xml.*\bencoding\s*=\s*['"]([-\w_.]+)['"]\?>''')),
+    (5, re.compile(r"""coding[:=]\s*([-\w_.]+)""")),
+    (1, re.compile(r"""<\?xml.*\bencoding\s*=\s*['"]([-\w_.]+)['"]\?>""")),
 ]
 
 supportedCodecs = [
-    'utf-8',
-    
-    'iso-8859-1', 'iso-8859-2', 'iso-8859-3',
-    'iso-8859-4', 'iso-8859-5', 'iso-8859-6', 'iso-8859-7',
-    'iso-8859-8', 'iso-8859-9', 'iso-8859-10', 'iso-8859-11',
-    'iso-8859-13', 'iso-8859-14', 'iso-8859-15', 'iso-8859-16',
-    'latin-1',
-    
-    'koi8-r', 'koi8-t', 'koi8-u',
-    
-    'utf-7',
-    'utf-16', 'utf-16-be', 'utf-16-le',
-    'utf-32', 'utf-32-be', 'utf-32-le',
-    
-    'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720',
-    'cp737', 'cp775', 'cp850', 'cp852', 'cp855', 'cp856',
-    'cp857', 'cp858', 'cp860', 'cp861', 'cp862', 'cp863',
-    'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875',
-    'cp932', 'cp949', 'cp950', 'cp1006', 'cp1026', 'cp1125',
-    'cp1140',
-    
-    'windows-1250', 'windows-1251', 'windows-1252', 'windows-1253',
-    'windows-1254', 'windows-1255', 'windows-1256', 'windows-1257',
-    'windows-1258',
-    
-    'gb2312', 'hz', 'gb18030', 'gbk',
-    
-    'iso-2022-jp', 'iso-2022-jp-1', 'iso-2022-jp-2', 'iso-2022-jp-2004',
-    'iso-2022-jp-3', 'iso-2022-jp-ext', 'iso-2022-kr',
-    
-    'mac-cyrillic', 'mac-greek', 'mac-iceland', 'mac-latin2',
-    'mac-roman', 'mac-turkish',
-    
-    'ascii',
-    'big5-tw', 'big5-hkscs',
+    "utf-8",
+    "iso-8859-1",
+    "iso-8859-2",
+    "iso-8859-3",
+    "iso-8859-4",
+    "iso-8859-5",
+    "iso-8859-6",
+    "iso-8859-7",
+    "iso-8859-8",
+    "iso-8859-9",
+    "iso-8859-10",
+    "iso-8859-11",
+    "iso-8859-13",
+    "iso-8859-14",
+    "iso-8859-15",
+    "iso-8859-16",
+    "latin-1",
+    "koi8-r",
+    "koi8-t",
+    "koi8-u",
+    "utf-7",
+    "utf-16",
+    "utf-16-be",
+    "utf-16-le",
+    "utf-32",
+    "utf-32-be",
+    "utf-32-le",
+    "cp037",
+    "cp273",
+    "cp424",
+    "cp437",
+    "cp500",
+    "cp720",
+    "cp737",
+    "cp775",
+    "cp850",
+    "cp852",
+    "cp855",
+    "cp856",
+    "cp857",
+    "cp858",
+    "cp860",
+    "cp861",
+    "cp862",
+    "cp863",
+    "cp864",
+    "cp865",
+    "cp866",
+    "cp869",
+    "cp874",
+    "cp875",
+    "cp932",
+    "cp949",
+    "cp950",
+    "cp1006",
+    "cp1026",
+    "cp1125",
+    "cp1140",
+    "windows-1250",
+    "windows-1251",
+    "windows-1252",
+    "windows-1253",
+    "windows-1254",
+    "windows-1255",
+    "windows-1256",
+    "windows-1257",
+    "windows-1258",
+    "gb2312",
+    "hz",
+    "gb18030",
+    "gbk",
+    "iso-2022-jp",
+    "iso-2022-jp-1",
+    "iso-2022-jp-2",
+    "iso-2022-jp-2004",
+    "iso-2022-jp-3",
+    "iso-2022-jp-ext",
+    "iso-2022-kr",
+    "mac-cyrillic",
+    "mac-greek",
+    "mac-iceland",
+    "mac-latin2",
+    "mac-roman",
+    "mac-turkish",
+    "ascii",
+    "big5-tw",
+    "big5-hkscs",
 ]
 
 
@@ -125,44 +194,45 @@
     Class implementing an exception, which is raised, if a given coding is
     incorrect.
     """
+
     def __init__(self, coding):
         """
         Constructor
-        
+
         @param coding coding to include in the message (string)
         """
         self.errorMessage = QCoreApplication.translate(
-            "CodingError",
-            "The coding '{0}' is wrong for the given text.").format(coding)
-        
+            "CodingError", "The coding '{0}' is wrong for the given text."
+        ).format(coding)
+
     def __repr__(self):
         """
         Special method returning a representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self.errorMessage)
-        
+
     def __str__(self):
         """
         Special method returning a string representation of the exception.
-        
+
         @return string representing the error message
         """
         return str(self.errorMessage)
-    
+
 
 def get_codingBytes(text):
     """
     Function to get the coding of a bytes text.
-    
+
     @param text bytes text to inspect (bytes)
     @return coding string
     """
     lines = text.splitlines()
     for coding in codingBytes_regexps:
         coding_re = coding[1]
-        head = lines[:coding[0]]
+        head = lines[: coding[0]]
         for line in head:
             m = coding_re.search(line)
             if m:
@@ -173,14 +243,14 @@
 def get_coding(text):
     """
     Function to get the coding of a text.
-    
+
     @param text text to inspect (string)
     @return coding string
     """
     lines = text.splitlines()
     for coding in coding_regexps:
         coding_re = coding[1]
-        head = lines[:coding[0]]
+        head = lines[: coding[0]]
         for line in head:
             m = coding_re.search(line)
             if m:
@@ -191,7 +261,7 @@
 def readEncodedFile(filename):
     """
     Function to read a file and decode its contents into proper text.
-    
+
     @param filename name of the file to read (string)
     @return tuple of decoded text and encoding (string, string)
     """
@@ -204,85 +274,85 @@
     """
     Function to read a file, calculate a hash value and decode its contents
     into proper text.
-    
+
     @param filename name of the file to read (string)
     @return tuple of decoded text, encoding and hash value (string, string,
         string)
     """
     with open(filename, "rb") as f:
         text = f.read()
-    hashStr = str(QCryptographicHash.hash(
-        QByteArray(text), QCryptographicHash.Algorithm.Md5).toHex(),
-        encoding="ASCII")
-    return decode(text) + (hashStr, )
+    hashStr = str(
+        QCryptographicHash.hash(
+            QByteArray(text), QCryptographicHash.Algorithm.Md5
+        ).toHex(),
+        encoding="ASCII",
+    )
+    return decode(text) + (hashStr,)
 
 
 def decode(text):
     """
     Function to decode some byte text into a string.
-    
+
     @param text byte text to decode (bytes)
     @return tuple of decoded text and encoding (string, string)
     """
     with contextlib.suppress(UnicodeError, LookupError):
         if text.startswith(BOM_UTF8):
             # UTF-8 with BOM
-            return str(text[len(BOM_UTF8):], 'utf-8'), 'utf-8-bom'
+            return str(text[len(BOM_UTF8) :], "utf-8"), "utf-8-bom"
         elif text.startswith(BOM_UTF16):
             # UTF-16 with BOM
-            return str(text[len(BOM_UTF16):], 'utf-16'), 'utf-16'
+            return str(text[len(BOM_UTF16) :], "utf-16"), "utf-16"
         elif text.startswith(BOM_UTF32):
             # UTF-32 with BOM
-            return str(text[len(BOM_UTF32):], 'utf-32'), 'utf-32'
+            return str(text[len(BOM_UTF32) :], "utf-32"), "utf-32"
         coding = get_codingBytes(text)
         if coding:
             return str(text, coding), coding
-    
+
     # Assume UTF-8
     with contextlib.suppress(UnicodeError, LookupError):
-        return str(text, 'utf-8'), 'utf-8-guessed'
-    
+        return str(text, "utf-8"), "utf-8-guessed"
+
     guess = None
     if Preferences.getEditor("AdvancedEncodingDetection"):
         # Try the universal character encoding detector
         try:
             import chardet
+
             guess = chardet.detect(text)
-            if (
-                guess and
-                guess['confidence'] > 0.95 and
-                guess['encoding'] is not None
-            ):
-                codec = guess['encoding'].lower()
-                return str(text, codec), '{0}-guessed'.format(codec)
+            if guess and guess["confidence"] > 0.95 and guess["encoding"] is not None:
+                codec = guess["encoding"].lower()
+                return str(text, codec), "{0}-guessed".format(codec)
         except (UnicodeError, LookupError):
             pass
         except ImportError:
             pass
-    
+
     # Try default encoding
     with contextlib.suppress(UnicodeError, LookupError):
         codec = Preferences.getEditor("DefaultEncoding")
-        return str(text, codec), '{0}-default'.format(codec)
-    
+        return str(text, codec), "{0}-default".format(codec)
+
     if (
-        Preferences.getEditor("AdvancedEncodingDetection") and
-        guess and
-        guess['encoding'] is not None
+        Preferences.getEditor("AdvancedEncodingDetection")
+        and guess
+        and guess["encoding"] is not None
     ):
         # Use the guessed one even if confidence level is low
         with contextlib.suppress(UnicodeError, LookupError):
-            codec = guess['encoding'].lower()
-            return str(text, codec), '{0}-guessed'.format(codec)
-    
+            codec = guess["encoding"].lower()
+            return str(text, codec), "{0}-guessed".format(codec)
+
     # Assume UTF-8 loosing information
-    return str(text, "utf-8", "ignore"), 'utf-8-ignore'
+    return str(text, "utf-8", "ignore"), "utf-8-ignore"
 
 
 def readEncodedFileWithEncoding(filename, encoding):
     """
     Function to read a file and decode its contents into proper text.
-    
+
     @param filename name of the file to read (string)
     @param encoding encoding to be used to read the file (string)
     @return tuple of decoded text and encoding (string, string)
@@ -291,15 +361,15 @@
         text = f.read()
     if encoding:
         with contextlib.suppress(UnicodeError, LookupError):
-            return str(text, encoding), '{0}-selected'.format(encoding)
-        
+            return str(text, encoding), "{0}-selected".format(encoding)
+
         # Try default encoding
         with contextlib.suppress(UnicodeError, LookupError):
             codec = Preferences.getEditor("DefaultEncoding")
-            return str(text, codec), '{0}-default'.format(codec)
-        
+            return str(text, codec), "{0}-default".format(codec)
+
         # Assume UTF-8 loosing information
-        return str(text, "utf-8", "ignore"), 'utf-8-ignore'
+        return str(text, "utf-8", "ignore"), "utf-8-ignore"
     else:
         return decode(text)
 
@@ -307,7 +377,7 @@
 def writeEncodedFile(filename, text, origEncoding, forcedEncoding=""):
     """
     Function to write a file with properly encoded text.
-    
+
     @param filename name of the file to read
     @type str
     @param text text to be written
@@ -321,17 +391,17 @@
     @rtype str
     """
     etext, encoding = encode(text, origEncoding, forcedEncoding=forcedEncoding)
-    
+
     with open(filename, "wb") as f:
         f.write(etext)
-    
+
     return encoding
 
 
 def encode(text, origEncoding, forcedEncoding=""):
     """
     Function to encode text into a byte text.
-    
+
     @param text text to be encoded
     @type str
     @param origEncoding type of the original encoding
@@ -344,8 +414,8 @@
     @exception CodingError raised to indicate an invalid encoding
     """
     encoding = None
-    if origEncoding == 'utf-8-bom':
-        etext, encoding = BOM_UTF8 + text.encode("utf-8"), 'utf-8-bom'
+    if origEncoding == "utf-8-bom":
+        etext, encoding = BOM_UTF8 + text.encode("utf-8"), "utf-8-bom"
     else:
         # Try declared coding spec
         coding = get_coding(text)
@@ -358,46 +428,45 @@
         else:
             if forcedEncoding:
                 with contextlib.suppress(UnicodeError, LookupError):
-                    etext, encoding = (
-                        text.encode(forcedEncoding), forcedEncoding)
+                    etext, encoding = (text.encode(forcedEncoding), forcedEncoding)
                     # if forced encoding is incorrect, ignore it
-            
+
             if encoding is None:
                 # Try the original encoding
                 if origEncoding and origEncoding.endswith(
-                        ('-selected', '-default', '-guessed', '-ignore')):
+                    ("-selected", "-default", "-guessed", "-ignore")
+                ):
                     coding = (
-                        origEncoding
-                        .replace("-selected", "")
+                        origEncoding.replace("-selected", "")
                         .replace("-default", "")
                         .replace("-guessed", "")
                         .replace("-ignore", "")
                     )
                     with contextlib.suppress(UnicodeError, LookupError):
                         etext, encoding = text.encode(coding), coding
-                
+
                 if encoding is None:
                     # Try configured default
                     with contextlib.suppress(UnicodeError, LookupError):
                         codec = Preferences.getEditor("DefaultEncoding")
                         etext, encoding = text.encode(codec), codec
-                    
+
                     if encoding is None:
                         # Try saving as ASCII
                         with contextlib.suppress(UnicodeError):
-                            etext, encoding = text.encode('ascii'), 'ascii'
-                        
+                            etext, encoding = text.encode("ascii"), "ascii"
+
                         if encoding is None:
                             # Save as UTF-8 without BOM
-                            etext, encoding = text.encode('utf-8'), 'utf-8'
-    
+                            etext, encoding = text.encode("utf-8"), "utf-8"
+
     return etext, encoding
 
 
 def decodeString(text):
     """
     Function to decode a string containing Unicode encoded characters.
-    
+
     @param text text containing encoded chars (string)
     @return decoded text (string)
     """
@@ -405,7 +474,7 @@
     index = 0
     while index < len(text):
         if text[index] == "\\":
-            qb = QByteArray.fromHex(text[index:index + 4].encode())
+            qb = QByteArray.fromHex(text[index : index + 4].encode())
             buf += bytes(qb)
             index += 4
         else:
@@ -413,12 +482,12 @@
             index += 1
     buf = buf.replace(b"\x00", b"")
     return decodeBytes(buf)
-    
+
 
 def decodeBytes(buffer):
     """
     Function to decode some byte text into a string.
-    
+
     @param buffer byte buffer to decode (bytes)
     @return decoded text (string)
     """
@@ -426,44 +495,45 @@
     with contextlib.suppress(UnicodeError, LookupError):
         if buffer.startswith(BOM_UTF8):
             # UTF-8 with BOM
-            return str(buffer[len(BOM_UTF8):], encoding='utf-8')
+            return str(buffer[len(BOM_UTF8) :], encoding="utf-8")
         elif buffer.startswith(BOM_UTF16):
             # UTF-16 with BOM
-            return str(buffer[len(BOM_UTF16):], encoding='utf-16')
+            return str(buffer[len(BOM_UTF16) :], encoding="utf-16")
         elif buffer.startswith(BOM_UTF32):
             # UTF-32 with BOM
-            return str(buffer[len(BOM_UTF32):], encoding='utf-32')
-    
+            return str(buffer[len(BOM_UTF32) :], encoding="utf-32")
+
     # try UTF-8
     with contextlib.suppress(UnicodeError):
         return str(buffer, encoding="utf-8")
-    
+
     # try codec detection
     try:
         import chardet
+
         guess = chardet.detect(buffer)
-        if guess and guess['encoding'] is not None:
-            codec = guess['encoding'].lower()
+        if guess and guess["encoding"] is not None:
+            codec = guess["encoding"].lower()
             return str(buffer, encoding=codec)
     except (UnicodeError, LookupError):
         pass
     except ImportError:
         pass
-    
+
     return str(buffer, encoding="utf-8", errors="ignore")
 
 
 def readStringFromStream(stream):
     """
     Module function to read a string from the given stream.
-    
+
     @param stream data stream opened for reading (QDataStream)
     @return string read from the stream (string)
     """
     data = stream.readString()
     if data is None:
         data = b""
-    return data.decode('utf-8')
+    return data.decode("utf-8")
 
 
 _escape = re.compile("[&<>\"'\u0080-\uffff]")
@@ -480,7 +550,7 @@
 def escape_entities(m, escmap=_escape_map):
     """
     Function to encode html entities.
-    
+
     @param m the match object
     @param escmap the map of entities to encode
     @return the converted text (string)
@@ -490,12 +560,12 @@
     if text is None:
         text = "&#{0:d};".format(ord(char))
     return text
-    
+
 
 def html_encode(text, pattern=_escape):
     """
     Function to correctly encode a text for html.
-    
+
     @param text text to be encoded (string)
     @param pattern search pattern for text to be encoded (string)
     @return the encoded text (string)
@@ -505,25 +575,26 @@
     text = pattern.sub(escape_entities, text)
     return text
 
-_uescape = re.compile('[\u0080-\uffff]')
+
+_uescape = re.compile("[\u0080-\uffff]")
 
 
 def escape_uentities(m):
     """
     Function to encode html entities.
-    
+
     @param m the match object
     @return the converted text (string)
     """
     char = m.group()
     text = "&#{0:d};".format(ord(char))
     return text
-    
+
 
 def html_uencode(text, pattern=_uescape):
     """
     Function to correctly encode a unicode text for html.
-    
+
     @param text text to be encoded (string)
     @param pattern search pattern for text to be encoded (string)
     @return the encoded text (string)
@@ -533,13 +604,14 @@
     text = pattern.sub(escape_uentities, text)
     return text
 
-_uunescape = re.compile(r'&#\d+;')
+
+_uunescape = re.compile(r"&#\d+;")
 
 
 def unescape_uentities(m):
     """
     Function to decode html entities.
-    
+
     @param m the match object
     @return the converted text (string)
     """
@@ -551,7 +623,7 @@
 def html_udecode(text, pattern=_uunescape):
     """
     Function to correctly decode a html text to a unicode text.
-    
+
     @param text text to be decoded (string)
     @param pattern search pattern for text to be decoded (string)
     @return the decoded text (string)
@@ -565,20 +637,20 @@
 def convertLineEnds(text, eol):
     """
     Function to convert the end of line characters.
-    
+
     @param text text to be converted (string)
     @param eol new eol setting (string)
     @return text with converted eols (string)
     """
-    if eol == '\r\n':
+    if eol == "\r\n":
         regexp = re.compile(r"""(\r(?!\n)|(?<!\r)\n)""")
-        return regexp.sub(lambda m, eol='\r\n': eol, text)
-    elif eol == '\n':
+        return regexp.sub(lambda m, eol="\r\n": eol, text)
+    elif eol == "\n":
         regexp = re.compile(r"""(\r\n|\r)""")
-        return regexp.sub(lambda m, eol='\n': eol, text)
-    elif eol == '\r':
+        return regexp.sub(lambda m, eol="\n": eol, text)
+    elif eol == "\r":
         regexp = re.compile(r"""(\r\n|\n)""")
-        return regexp.sub(lambda m, eol='\r': eol, text)
+        return regexp.sub(lambda m, eol="\r": eol, text)
     else:
         return text
 
@@ -586,7 +658,7 @@
 def linesep():
     """
     Function to return the line separator used by the editor.
-    
+
     @return line separator used by the editor (string)
     """
     eolMode = Preferences.getEditor("EOLMode")
@@ -601,7 +673,7 @@
 def extractFlags(text):
     """
     Function to extract eric specific flags out of the given text.
-    
+
     Flags are contained in comments and are introduced by 'eflag:'.
     The rest of the line is interpreted as 'key = value'. value is
     analyzed for being an integer or float value. If that fails, it
@@ -609,7 +681,7 @@
     character, it is assumed to be a boolean flag. Flags are expected
     at the very end of a file. The search is ended, if a line without
     the 'eflag:' marker is found.
-    
+
     @param text text to be scanned (string)
     @return dictionary of string, boolean, complex, float and int
     """
@@ -621,18 +693,18 @@
         except ValueError:
             # no flag found, don't look any further
             break
-        
-        flag = line[index + 6:].strip()
+
+        flag = line[index + 6 :].strip()
         if "=" in flag:
             key, value = flag.split("=", 1)
             key = key.strip()
             value = value.strip()
-            
+
             if value.lower() in ["true", "false", "yes", "no", "ok"]:
                 # it is a flag
                 flags[key] = value.lower() in ["true", "yes", "ok"]
                 continue
-            
+
             try:
                 # interpret as int first
                 value = int(value)
@@ -640,7 +712,7 @@
                 with contextlib.suppress(ValueError):
                     # interpret as float next
                     value = float(value)
-            
+
             flags[key] = value
         else:
             # treat it as a boolean
@@ -649,14 +721,14 @@
                 flags[flag[1:]] = False
             else:
                 flags[flag] = True
-    
+
     return flags
 
 
 def extractFlagsFromFile(filename):
     """
     Function to extract eric specific flags out of the given file.
-    
+
     @param filename name of the file to be scanned (string)
     @return dictionary of string, boolean, complex, float and int
     """
@@ -664,7 +736,7 @@
         source, encoding = readEncodedFile(filename)
     except (UnicodeError, OSError):
         return {}
-    
+
     return extractFlags(source)
 
 
@@ -672,7 +744,7 @@
     """
     Function to extract flags starting and ending with '__' from a line
     comment.
-    
+
     @param line line to extract flags from (string)
     @param startComment string identifying the start of the comment (string)
     @param endComment string identifying the end of a comment (string)
@@ -680,25 +752,27 @@
     @return list containing the extracted flags (list of strings)
     """
     flags = []
-    
-    if not flagsLine or (
-       flagsLine and line.strip().startswith(startComment)):
+
+    if not flagsLine or (flagsLine and line.strip().startswith(startComment)):
         pos = line.rfind(startComment)
         if pos >= 0:
-            comment = line[pos + len(startComment):].strip()
+            comment = line[pos + len(startComment) :].strip()
             if endComment:
                 endPos = line.rfind(endComment)
                 if endPos >= 0:
                     comment = comment[:endPos]
-            flags = [f.strip() for f in comment.split()
-                     if (f.startswith("__") and f.endswith("__"))]
+            flags = [
+                f.strip()
+                for f in comment.split()
+                if (f.startswith("__") and f.endswith("__"))
+            ]
     return flags
 
 
 def filterAnsiSequences(txt):
     """
     Function to filter out ANSI escape sequences (color only).
-    
+
     @param txt text to be filtered
     @type str
     @return text without ANSI escape sequences
@@ -706,21 +780,21 @@
     """
     ntxt = txt[:]
     while True:
-        start = ntxt.find("\33[")    # find escape character
+        start = ntxt.find("\33[")  # find escape character
         if start == -1:
             break
         end = ntxt.find("m", start)
         if end == -1:
             break
-        ntxt = ntxt[:start] + ntxt[end + 1:]
-    
+        ntxt = ntxt[:start] + ntxt[end + 1 :]
+
     return ntxt
 
 
 def toNativeSeparators(path):
     """
     Function returning a path, that is using native separator characters.
-    
+
     @param path path to be converted
     @type str
     @return path with converted separator characters
@@ -732,7 +806,7 @@
 def fromNativeSeparators(path):
     """
     Function returning a path, that is using "/" separator characters.
-    
+
     @param path path to be converted
     @type str
     @return path with converted separator characters
@@ -745,7 +819,7 @@
     """
     Function returning a path, that is normalized with respect to its case
     and references.
-    
+
     @param path file path (string)
     @return case normalized path (string)
     """
@@ -756,7 +830,7 @@
     """
     Function returning an absolute path, that is normalized with respect to
     its case and references.
-    
+
     @param path file path (string)
     @return absolute, normalized path (string)
     """
@@ -766,7 +840,7 @@
 def normjoinpath(a, *p):
     """
     Function returning a normalized path of the joined parts passed into it.
-    
+
     @param a first path to be joined (string)
     @param p variable number of path parts to be joined (string)
     @return normalized path (string)
@@ -778,7 +852,7 @@
     """
     Function returning a normalized, absolute path of the joined parts passed
     into it.
-    
+
     @param a first path to be joined (string)
     @param p variable number of path parts to be joind (string)
     @return absolute, normalized path (string)
@@ -789,32 +863,31 @@
 def isinpath(file):
     """
     Function to check for an executable file.
-    
+
     @param file filename of the executable to check (string)
     @return flag to indicate, if the executable file is accessible
         via the searchpath defined by the PATH environment variable.
     """
     if os.path.isabs(file):
         return os.access(file, os.X_OK)
-    
+
     if os.path.exists(os.path.join(os.curdir, file)):
         return os.access(os.path.join(os.curdir, file), os.X_OK)
-    
-    path = getEnvironmentEntry('PATH')
-    
+
+    path = getEnvironmentEntry("PATH")
+
     # environment variable not defined
     if path is None:
         return False
-    
+
     dirs = path.split(os.pathsep)
-    return any(os.access(os.path.join(directory, file), os.X_OK)
-               for directory in dirs)
+    return any(os.access(os.path.join(directory, file), os.X_OK) for directory in dirs)
 
 
 def startswithPath(path, start):
     """
     Function to check, if a path starts with a given start path.
-    
+
     @param path path to be checked
     @type str
     @param start start path
@@ -823,12 +896,8 @@
         path
     @rtype bool
     """
-    return (
-        bool(start) and
-        (
-            path == start or
-            normcasepath(path).startswith(normcasepath(start + "/"))
-        )
+    return bool(start) and (
+        path == start or normcasepath(path).startswith(normcasepath(start + "/"))
     )
 
 
@@ -836,7 +905,7 @@
     """
     Function to convert a file path to a path relative to a start path
     with universal separators.
-    
+
     @param path file or directory name to convert (string)
     @param start start path (string)
     @return relative path or unchanged path, if path does not start with
@@ -849,7 +918,7 @@
     """
     Public method to convert a path relative to a start path to an
     absolute path.
-    
+
     @param path file or directory name to convert (string)
     @param start start path (string)
     @return absolute path (string)
@@ -863,7 +932,7 @@
     """
     Public method to convert a path relative to a start path with
     universal separators to an absolute path.
-    
+
     @param path file or directory name to convert (string)
     @param start start path (string)
     @return absolute path with native separators (string)
@@ -876,7 +945,7 @@
 def getExecutablePath(file):
     """
     Function to build the full path of an executable file from the environment.
-    
+
     @param file filename of the executable to check (string)
     @return full executable name, if the executable file is accessible
         via the searchpath defined by the PATH environment variable, or an
@@ -887,49 +956,49 @@
             return file
         else:
             return ""
-        
+
     cur_path = os.path.join(os.curdir, file)
     if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
         return cur_path
 
-    path = os.getenv('PATH')
-    
+    path = os.getenv("PATH")
+
     # environment variable not defined
     if path is None:
         return ""
-        
+
     dirs = path.split(os.pathsep)
     for directory in dirs:
         exe = os.path.join(directory, file)
         if os.access(exe, os.X_OK):
             return exe
-            
+
     return ""
-    
+
 
 def getExecutablePaths(file):
     """
     Function to build all full path of an executable file from the environment.
-    
+
     @param file filename of the executable (string)
     @return list of full executable names (list of strings), if the executable
         file is accessible via the searchpath defined by the PATH environment
         variable, or an empty list otherwise.
     """
     paths = []
-    
+
     if os.path.isabs(file):
         if os.access(file, os.X_OK):
             return [file]
         else:
             return []
-        
+
     cur_path = os.path.join(os.curdir, file)
     if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
         paths.append(cur_path)
 
-    path = os.getenv('PATH')
-    
+    path = os.getenv("PATH")
+
     # environment variable not defined
     if path is not None:
         dirs = path.split(os.pathsep)
@@ -937,19 +1006,19 @@
             exe = os.path.join(directory, file)
             if os.access(exe, os.X_OK) and exe not in paths:
                 paths.append(exe)
-    
+
     return paths
-    
+
 
 def getWindowsExecutablePath(file):
     """
     Function to build the full path of an executable file from the environment
     on Windows platforms.
-    
+
     First an executable with the extension .exe is searched for, thereafter
     such with the extensions .cmd or .bat and finally the given file name as
     is. The first match is returned.
-    
+
     @param file filename of the executable to check (string)
     @return full executable name, if the executable file is accessible
         via the searchpath defined by the PATH environment variable, or an
@@ -960,34 +1029,34 @@
             return file
         else:
             return ""
-    
+
     filenames = [file + ".exe", file + ".cmd", file + ".bat", file]
-    
+
     for filename in filenames:
         cur_path = os.path.join(os.curdir, filename)
         if os.path.exists(cur_path) and os.access(cur_path, os.X_OK):
             return os.path.abspath(cur_path)
 
-    path = os.getenv('PATH')
-    
+    path = os.getenv("PATH")
+
     # environment variable not defined
     if path is None:
         return ""
-        
+
     dirs = path.split(os.pathsep)
     for directory in dirs:
         for filename in filenames:
             exe = os.path.join(directory, filename)
             if os.access(exe, os.X_OK):
                 return exe
-    
+
     return ""
-    
+
 
 def isExecutable(exe):
     """
     Function to check, if a file is executable.
-    
+
     @param exe filename of the executable to check (string)
     @return flag indicating executable status (boolean)
     """
@@ -997,7 +1066,7 @@
 def isDrive(path):
     """
     Function to check, if a path is a Windows drive.
-    
+
     @param path path name to be checked
     @type str
     @return flag indicating a Windows drive
@@ -1006,20 +1075,20 @@
     isDrive = False
     drive, directory = os.path.splitdrive(path)
     if (
-        drive and
-        len(drive) == 2 and
-        drive.endswith(":") and
-        directory in ["", "\\", "/"]
+        drive
+        and len(drive) == 2
+        and drive.endswith(":")
+        and directory in ["", "\\", "/"]
     ):
         isDrive = True
-    
+
     return isDrive
-    
+
 
 def samepath(f1, f2):
     """
     Function to compare two paths.
-    
+
     @param f1 first path for the compare (string)
     @param f2 second path for the compare (string)
     @return flag indicating whether the two paths represent the
@@ -1027,20 +1096,17 @@
     """
     if f1 is None or f2 is None:
         return False
-    
-    if (
-        normcaseabspath(os.path.realpath(f1)) ==
-        normcaseabspath(os.path.realpath(f2))
-    ):
+
+    if normcaseabspath(os.path.realpath(f1)) == normcaseabspath(os.path.realpath(f2)):
         return True
-    
+
     return False
 
 
 def samefilepath(f1, f2):
     """
     Function to compare two paths. Strips the filename.
-    
+
     @param f1 first filepath for the compare (string)
     @param f2 second filepath for the compare (string)
     @return flag indicating whether the two paths represent the
@@ -1048,13 +1114,15 @@
     """
     if f1 is None or f2 is None:
         return False
-    
-    if (normcaseabspath(os.path.dirname(os.path.realpath(f1))) ==
-            normcaseabspath(os.path.dirname(os.path.realpath(f2)))):
+
+    if normcaseabspath(os.path.dirname(os.path.realpath(f1))) == normcaseabspath(
+        os.path.dirname(os.path.realpath(f2))
+    ):
         return True
-    
+
     return False
 
+
 try:
     EXTSEP = os.extsep
 except AttributeError:
@@ -1064,7 +1132,7 @@
 def splitPath(name):
     """
     Function to split a pathname into a directory part and a file part.
-    
+
     @param name path name (string)
     @return a tuple of 2 strings (dirname, filename).
     """
@@ -1079,10 +1147,10 @@
 def joinext(prefix, ext):
     """
     Function to join a file extension to a path.
-    
+
     The leading "." of ext is replaced by a platform specific extension
     separator if necessary.
-    
+
     @param prefix the basepart of the filename (string)
     @param ext the extension part (string)
     @return the complete filename (string)
@@ -1096,7 +1164,7 @@
 def compactPath(path, width, measure=len):
     """
     Function to return a compacted path fitting inside the given width.
-    
+
     @param path path to be compacted (string)
     @param width width for the compacted path (integer)
     @param measure reference to a function used to measure the length of the
@@ -1105,9 +1173,9 @@
     """
     if measure(path) <= width:
         return path
-    
-    ellipsis = '...'
-    
+
+    ellipsis = "..."
+
     head, tail = os.path.split(path)
     mid = len(head) // 2
     head1 = head[:mid]
@@ -1128,13 +1196,14 @@
             return path
         tail = tail[1:]
     return ""
-    
+
 
-def direntries(path, filesonly=False, pattern=None, followsymlinks=True,
-               checkStop=None):
+def direntries(
+    path, filesonly=False, pattern=None, followsymlinks=True, checkStop=None
+):
     """
     Function returning a list of all files and directories.
-    
+
     @param path root of the tree to check
     @type str
     @param filesonly flag indicating that only files are wanted
@@ -1158,29 +1227,32 @@
         for entry in entries:
             if checkStop and checkStop():
                 break
-            
-            if entry in ['.svn',
-                         '.hg',
-                         '.git',
-                         '.ropeproject',
-                         '.eric7project',
-                         '.jedi']:
+
+            if entry in [
+                ".svn",
+                ".hg",
+                ".git",
+                ".ropeproject",
+                ".eric7project",
+                ".jedi",
+            ]:
                 continue
-            
+
             fentry = os.path.join(path, entry)
             if (
-                pattern and
-                not os.path.isdir(fentry) and
-                not any(fnmatch.fnmatch(entry, p) for p in patterns)
+                pattern
+                and not os.path.isdir(fentry)
+                and not any(fnmatch.fnmatch(entry, p) for p in patterns)
             ):
                 # entry doesn't fit the given pattern
                 continue
-                
+
             if os.path.isdir(fentry):
                 if os.path.islink(fentry) and not followsymlinks:
                     continue
                 files += direntries(
-                    fentry, filesonly, pattern, followsymlinks, checkStop)
+                    fentry, filesonly, pattern, followsymlinks, checkStop
+                )
             else:
                 files.append(fentry)
     except OSError:
@@ -1193,7 +1265,7 @@
 def getDirs(path, excludeDirs):
     """
     Function returning a list of all directories below path.
-    
+
     @param path root of the tree to check
     @param excludeDirs basename of directories to ignore
     @return list of all directories found
@@ -1205,9 +1277,8 @@
 
     dirs = []
     for name in names:
-        if (
-            os.path.isdir(os.path.join(path, name)) and
-            not os.path.islink(os.path.join(path, name))
+        if os.path.isdir(os.path.join(path, name)) and not os.path.islink(
+            os.path.join(path, name)
         ):
             exclude = 0
             for e in excludeDirs:
@@ -1227,7 +1298,7 @@
 def findVolume(volumeName, findAll=False):
     """
     Function to find the directory belonging to a given volume name.
-    
+
     @param volumeName name of the volume to search for
     @type str
     @param findAll flag indicating to get the directories for all volumes
@@ -1239,13 +1310,13 @@
     """
     volumeDirectories = []
     volumeDirectory = None
-    
+
     if isWindowsPlatform():
         # we are on a Windows platform
         def getVolumeName(diskName):
             """
             Local function to determine the volume of a disk or device.
-            
+
             Each disk or external device connected to windows has an
             attribute called "volume name". This function returns the
             volume name for the given disk/device.
@@ -1254,10 +1325,17 @@
             """
             volumeNameBuffer = ctypes.create_unicode_buffer(1024)
             ctypes.windll.kernel32.GetVolumeInformationW(
-                ctypes.c_wchar_p(diskName), volumeNameBuffer,
-                ctypes.sizeof(volumeNameBuffer), None, None, None, None, 0)
+                ctypes.c_wchar_p(diskName),
+                volumeNameBuffer,
+                ctypes.sizeof(volumeNameBuffer),
+                None,
+                None,
+                None,
+                None,
+                0,
+            )
             return volumeNameBuffer.value
-        
+
         #
         # In certain circumstances, volumes are allocated to USB
         # storage devices which cause a Windows popup to raise if their
@@ -1282,12 +1360,11 @@
         # we are on a Linux or macOS platform
         for mountCommand in ["mount", "/sbin/mount", "/usr/sbin/mount"]:
             with contextlib.suppress(FileNotFoundError):
-                mountOutput = subprocess.run(               # secok
+                mountOutput = subprocess.run(  # secok
                     mountCommand, check=True, capture_output=True, text=True
                 ).stdout.splitlines()
                 mountedVolumes = [
-                    x.split(" type")[0].split(maxsplit=2)[2]
-                    for x in mountOutput
+                    x.split(" type")[0].split(maxsplit=2)[2] for x in mountOutput
                 ]
                 if findAll:
                     for volume in mountedVolumes:
@@ -1302,7 +1379,7 @@
                             break
                     if volumeDirectory:
                         break
-    
+
     if findAll:
         return volumeDirectories
     else:
@@ -1312,11 +1389,11 @@
 def getTestFileNames(fn):
     """
     Function to build the potential file names of a test file.
-    
+
     The file names for the test file is built by prepending the string
     "test" and "test_" to the file name passed into this function and
     by appending the string "_test".
-    
+
     @param fn file name basis to be used for the test file names
     @type str
     @return file names of the corresponding test file
@@ -1327,18 +1404,16 @@
     prefixes = ["test", "test_"]
     postfixes = ["_test"]
     return [
-        os.path.join(dn, "{0}{1}{2}".format(prefix, fn, ext))
-        for prefix in prefixes
+        os.path.join(dn, "{0}{1}{2}".format(prefix, fn, ext)) for prefix in prefixes
     ] + [
-        os.path.join(dn, "{0}{1}{2}".format(fn, postfix, ext))
-        for postfix in postfixes
+        os.path.join(dn, "{0}{1}{2}".format(fn, postfix, ext)) for postfix in postfixes
     ]
 
 
 def getCoverageFileNames(fn):
     """
     Function to build a list of coverage data file names.
-    
+
     @param fn file name basis to be used for the coverage data file
     @type str
     @return list of existing coverage data files
@@ -1355,7 +1430,7 @@
 def getCoverageFileName(fn, mustExist=True):
     """
     Function to build a file name for a coverage data file.
-    
+
     @param fn file name basis to be used for the coverage data file name
     @type str
     @param mustExist flag indicating to check that the file exists (defaults
@@ -1378,7 +1453,7 @@
 def getProfileFileNames(fn):
     """
     Function to build a list of profile data file names.
-    
+
     @param fn file name basis to be used for the profile data file
     @type str
     @return list of existing profile data files
@@ -1395,7 +1470,7 @@
 def getProfileFileName(fn, mustExist=True):
     """
     Function to build a file name for a profile data file.
-    
+
     @param fn file name basis to be used for the profile data file name
     @type str
     @param mustExist flag indicating to check that the file exists (defaults
@@ -1418,7 +1493,7 @@
 def parseOptionString(s):
     """
     Function used to convert an option string into a list of options.
-    
+
     @param s option string
     @type str
     @return list of options
@@ -1431,19 +1506,19 @@
 def _percentReplacementFunc(matchobj):
     """
     Protected function called for replacing % codes.
-    
+
     @param matchobj match object for the code
     @type re.Match
     @return replacement string
     @rtype str
     """
     return getPercentReplacement(matchobj.group(0))
-    
+
 
 def getPercentReplacement(code):
     """
     Function to get the replacement for code.
-    
+
     @param code code indicator
     @type str
     @return replacement string
@@ -1517,12 +1592,12 @@
     else:
         # unknown code, just return it
         return code
-    
+
 
 def getPercentReplacementHelp():
     """
     Function to get the help text for the supported %-codes.
-    
+
     @returns help text (string)
     """
     return QCoreApplication.translate(
@@ -1542,33 +1617,35 @@
         """<tr><td>%U</td><td>username of the current user</td></tr>"""
         """<tr><td>%%</td><td>the percent sign</td></tr>"""
         """</table>"""
-        """</p>""")
+        """</p>""",
+    )
 
 
 def getUserName():
     """
     Function to get the user name.
-    
+
     @return user name (string)
     """
     user = getpass.getuser()
-    
+
     if isWindowsPlatform() and not user:
         return win32_GetUserName()
-    
+
     return user
 
 
 def getRealName():
     """
     Function to get the real name of the user.
-    
+
     @return real name of the user (string)
     """
     if isWindowsPlatform():
         return win32_getRealName()
     else:
         import pwd
+
         user = getpass.getuser()
         return pwd.getpwnam(user).pw_gecos
 
@@ -1576,16 +1653,16 @@
 def getHomeDir():
     """
     Function to get a users home directory.
-    
+
     @return home directory (string)
     """
     return QDir.homePath()
-    
+
 
 def getPythonLibPath():
     """
     Function to determine the path to Python's library.
-    
+
     @return path to the Python library (string)
     """
     pyFullVers = sys.version.split()[0]
@@ -1604,14 +1681,14 @@
         except AttributeError:
             syslib = "lib"
         libDir = sys.prefix + "/" + syslib + "/python" + pyVers
-        
+
     return libDir
-    
+
 
 def getPythonVersion():
     """
     Function to get the Python version (major, minor) as an integer value.
-    
+
     @return An integer representing major and minor version number (integer)
     """
     return sys.hexversion >> 16
@@ -1620,7 +1697,7 @@
 def determinePythonVersion(filename, source, editor=None):
     """
     Function to determine the python version of a given file.
-    
+
     @param filename name of the file with extension (str)
     @param source of the file (str)
     @param editor reference to the editor, if the file is opened
@@ -1632,11 +1709,11 @@
         "MicroPython": 3,
         "Cython": 3,
     }
-    
+
     if not editor:
-        viewManager = ericApp().getObject('ViewManager')
+        viewManager = ericApp().getObject("ViewManager")
         editor = viewManager.getOpenEditor(filename)
-    
+
     # Maybe the user has changed the language
     if editor and editor.getFileType() in pyAssignment:
         return pyAssignment[editor.getFileType()]
@@ -1648,25 +1725,27 @@
         flags = extractFlags(source)
         ext = os.path.splitext(filename)[1]
         py3Ext = Preferences.getPython("Python3Extensions")
-        project = ericApp().getObject('Project')
+        project = ericApp().getObject("Project")
         basename = os.path.basename(filename)
-        
+
         if "FileType" in flags:
             pyVer = pyAssignment.get(flags["FileType"], 0)
         elif project.isOpen() and project.isProjectFile(filename):
             language = project.getEditorLexerAssoc(basename)
             if not language:
                 language = Preferences.getEditorLexerAssoc(basename)
-            if language == 'Python3':
+            if language == "Python3":
                 pyVer = pyAssignment[language]
-        
+
         if pyVer:
             # Skip the next tests
             pass
-        elif (Preferences.getProject("DeterminePyFromProject") and
-              project.isOpen() and
-              project.isProjectFile(filename) and
-              ext in py3Ext):
+        elif (
+            Preferences.getProject("DeterminePyFromProject")
+            and project.isOpen()
+            and project.isProjectFile(filename)
+            and ext in py3Ext
+        ):
             pyVer = pyAssignment.get(project.getProjectLanguage(), 0)
         elif ext in py3Ext:
             pyVer = 3
@@ -1675,15 +1754,12 @@
                 line0 = source.splitlines()[0]
             else:
                 line0 = source[0]
-            if (
-                line0.startswith("#!") and
-                (("python3" in line0) or ("python" in line0))
-            ):
+            if line0.startswith("#!") and (("python3" in line0) or ("python" in line0)):
                 pyVer = 3
-        
+
         if pyVer == 0 and ext in py3Ext:
             pyVer = 3
-    
+
     return pyVer
 
 
@@ -1691,7 +1767,7 @@
     """
     Function to get the index (start position) of a regular expression match
     within some text.
-    
+
     @param rx regular expression object as created by re.compile()
     @type re.Pattern
     @param txt text to be scanned
@@ -1714,7 +1790,7 @@
 def getEnvironmentEntry(key, default=None):
     """
     Module function to get an environment entry.
-    
+
     @param key key of the requested environment entry (string)
     @param default value to be returned, if the environment doesn't contain
         the requested entry (string)
@@ -1724,15 +1800,16 @@
     pattern = "^{0}[ \t]*=".format(key)
     filterRe = (
         re.compile(pattern, re.IGNORECASE)
-        if isWindowsPlatform() else
-        re.compile(pattern)
+        if isWindowsPlatform()
+        else re.compile(pattern)
     )
-    
-    entries = [e for e in QProcess.systemEnvironment()
-               if filterRe.search(e) is not None]
+
+    entries = [
+        e for e in QProcess.systemEnvironment() if filterRe.search(e) is not None
+    ]
     if not entries:
         return default
-    
+
     # if there are multiple entries, just consider the first one
     ename, value = entries[0].split("=", 1)
     return value.strip()
@@ -1741,7 +1818,7 @@
 def hasEnvironmentEntry(key):
     """
     Module function to check, if the environment contains an entry.
-    
+
     @param key key of the requested environment entry
     @type str
     @return flag indicating the presence of the requested entry
@@ -1750,14 +1827,16 @@
     pattern = "^{0}[ \t]*=".format(key)
     filterRe = (
         re.compile(pattern, re.IGNORECASE)
-        if isWindowsPlatform() else
-        re.compile(pattern)
+        if isWindowsPlatform()
+        else re.compile(pattern)
     )
-    
-    entries = [e for e in QProcess.systemEnvironment()
-               if filterRe.search(e) is not None]
+
+    entries = [
+        e for e in QProcess.systemEnvironment() if filterRe.search(e) is not None
+    ]
     return len(entries) > 0
 
+
 ###############################################################################
 ## Qt utility functions below
 ###############################################################################
@@ -1767,40 +1846,41 @@
     """
     Module function to generate the executable name for a Qt tool like
     designer.
-    
+
     @param toolname base name of the tool (string)
     @return the Qt tool name without extension (string)
     """
-    return "{0}{1}{2}".format(Preferences.getQt("QtToolsPrefix"),
-                              toolname,
-                              Preferences.getQt("QtToolsPostfix")
-                              )
+    return "{0}{1}{2}".format(
+        Preferences.getQt("QtToolsPrefix"),
+        toolname,
+        Preferences.getQt("QtToolsPostfix"),
+    )
 
 
 def getQtMacBundle(toolname):
     """
     Module function to determine the correct Mac OS X bundle name for Qt tools.
-    
+
     @param toolname  plain name of the tool (e.g. "designer") (string)
     @return bundle name of the Qt tool (string)
     """
     qtDir = getQtBinariesPath()
     bundles = [
-        os.path.join(
-            qtDir, 'bin', generateQtToolName(toolname.capitalize())) + ".app",
-        os.path.join(qtDir, 'bin', generateQtToolName(toolname)) + ".app",
-        os.path.join(
-            qtDir, generateQtToolName(toolname.capitalize())) + ".app",
+        os.path.join(qtDir, "bin", generateQtToolName(toolname.capitalize())) + ".app",
+        os.path.join(qtDir, "bin", generateQtToolName(toolname)) + ".app",
+        os.path.join(qtDir, generateQtToolName(toolname.capitalize())) + ".app",
         os.path.join(qtDir, generateQtToolName(toolname)) + ".app",
     ]
     if toolname == "designer":
         # support the standalone Qt Designer installer from
         # https://build-system.fman.io/qt-designer-download
         designer = "Qt Designer.app"
-        bundles.extend([
-            os.path.join(qtDir, 'bin', designer),
-            os.path.join(qtDir, designer),
-        ])
+        bundles.extend(
+            [
+                os.path.join(qtDir, "bin", designer),
+                os.path.join(qtDir, designer),
+            ]
+        )
     for bundle in bundles:
         if os.path.exists(bundle):
             return bundle
@@ -1831,6 +1911,7 @@
 
     return ("open", newArgs)
 
+
 ###############################################################################
 ## PyQt utility functions below
 ###############################################################################
@@ -1839,7 +1920,7 @@
 def generatePyQtToolPath(toolname, alternatives=None):
     """
     Module function to generate the executable path for a PyQt tool.
-    
+
     @param toolname base name of the tool
     @type str
     @param alternatives list of alternative tool names to try
@@ -1858,14 +1939,15 @@
             exe = getWindowsExecutablePath(toolname)
         else:
             exe = toolname
-    
+
     if not isinpath(exe) and alternatives:
         ex_ = generatePyQtToolPath(alternatives[0], alternatives[1:])
         if isinpath(ex_):
             exe = ex_
-    
+
     return exe
 
+
 ###############################################################################
 ## PySide2/PySide6 utility functions below
 ###############################################################################
@@ -1874,7 +1956,7 @@
 def generatePySideToolPath(toolname, variant=2):
     """
     Module function to generate the executable path for a PySide2/PySide6 tool.
-    
+
     @param toolname base name of the tool
     @type str
     @param variant indicator for the PySide variant
@@ -1886,29 +1968,30 @@
         hasPyside = checkPyside(variant)
         if not hasPyside:
             return ""
-        
+
         venvName = Preferences.getQt("PySide{0}VenvName".format(variant))
         if not venvName:
             venvName = Preferences.getDebugger("Python3VirtualEnv")
-        interpreter = ericApp().getObject(
-            "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        interpreter = (
+            ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
+        )
         if interpreter == "" or not isinpath(interpreter):
             interpreter = getPythonExecutable()
         prefix = os.path.dirname(interpreter)
         if not prefix.endswith("Scripts"):
             prefix = os.path.join(prefix, "Scripts")
-        return os.path.join(prefix, toolname + '.exe')
+        return os.path.join(prefix, toolname + ".exe")
     else:
         # step 1: check, if the user has configured a tools path
         path = Preferences.getQt("PySide{0}ToolsDir".format(variant))
         if path:
             return os.path.join(path, toolname)
-        
+
         # step 2: determine from used Python interpreter
         dirName = os.path.dirname(sys.executable)
         if os.path.exists(os.path.join(dirName, toolname)):
             return os.path.join(dirName, toolname)
-        
+
         return toolname
 
 
@@ -1916,7 +1999,7 @@
 def checkPyside(variant=2):
     """
     Module function to check the presence of PySide2/PySide6.
-    
+
     @param variant indicator for the PySide variant
     @type int or str
     @return flags indicating the presence of PySide2/PySide6
@@ -1925,13 +2008,13 @@
     venvName = Preferences.getQt("PySide{0}VenvName".format(variant))
     if not venvName:
         venvName = Preferences.getDebugger("Python3VirtualEnv")
-    interpreter = ericApp().getObject(
-        "VirtualEnvManager").getVirtualenvInterpreter(venvName)
+    interpreter = (
+        ericApp().getObject("VirtualEnvManager").getVirtualenvInterpreter(venvName)
+    )
     if interpreter == "" or not isinpath(interpreter):
         interpreter = getPythonExecutable()
-    
-    checker = os.path.join(
-        getConfig('ericDir'), "Utilities", "PySideImporter.py")
+
+    checker = os.path.join(getConfig("ericDir"), "Utilities", "PySideImporter.py")
     args = [checker, "--variant={0}".format(variant)]
     proc = QProcess()
     proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
@@ -1939,15 +2022,16 @@
     finished = proc.waitForFinished(30000)
     return finished and proc.exitCode() == 0
 
+
 ###############################################################################
 ## Other utility functions below
 ###############################################################################
 
 
-def generateVersionInfo(linesep='\n'):
+def generateVersionInfo(linesep="\n"):
     """
     Module function to generate a string with various version infos.
-    
+
     @param linesep string to be used to separate lines
     @type str
     @return string with version infos
@@ -1961,34 +2045,38 @@
         sip_version_str = sip.SIP_VERSION_STR
     except (ImportError, AttributeError):
         sip_version_str = "sip version not available"
-    
+
     sizeStr = "64-Bit" if sys.maxsize > 2**32 else "32-Bit"
-    
+
     info = ["Version Numbers:"]
-    
+
     info.append("  Python {0}, {1}".format(sys.version.split()[0], sizeStr))
     info.append("  Qt {0}".format(qVersion()))
     info.append("  PyQt6 {0}".format(PYQT_VERSION_STR))
     try:
         from PyQt6 import QtCharts
-        info.append("  PyQt6-Charts {0}".format(
-            QtCharts.PYQT_CHART_VERSION_STR))
+
+        info.append("  PyQt6-Charts {0}".format(QtCharts.PYQT_CHART_VERSION_STR))
     except (ImportError, AttributeError):
         info.append("  PyQt6-Charts not installed")
     try:
         from PyQt6 import QtWebEngineCore
-        info.append("  PyQt6-WebEngine {0}".format(
-            QtWebEngineCore.PYQT_WEBENGINE_VERSION_STR))
+
+        info.append(
+            "  PyQt6-WebEngine {0}".format(QtWebEngineCore.PYQT_WEBENGINE_VERSION_STR)
+        )
     except (ImportError, AttributeError):
         info.append("  PyQt6-WebEngine not installed")
     info.append("  PyQt6-QScintilla {0}".format(QSCINTILLA_VERSION_STR))
     info.append("  sip {0}".format(sip_version_str))
     with contextlib.suppress(ImportError):
-        from PyQt6 import QtWebEngineWidgets    # __IGNORE_WARNING__
+        from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__
         from WebBrowser.Tools import WebBrowserTools
-        chromiumVersion, chromiumSecurityVersion = (
-            WebBrowserTools.getWebEngineVersions()[0:2]
-        )
+
+        (
+            chromiumVersion,
+            chromiumSecurityVersion,
+        ) = WebBrowserTools.getWebEngineVersions()[0:2]
         info.append("  WebEngine {0}".format(chromiumVersion))
         if chromiumSecurityVersion:
             info.append("    (Security) {0}".format(chromiumSecurityVersion))
@@ -2004,14 +2092,14 @@
     if session:
         info.append("")
         info.append("Session Type: {0}".format(session))
-    
+
     return linesep.join(info)
 
 
-def generatePluginsVersionInfo(linesep='\n'):
+def generatePluginsVersionInfo(linesep="\n"):
     """
     Module function to generate a string with plugins version infos.
-    
+
     @param linesep string to be used to separate lines
     @type str
     @return string with plugins version infos
@@ -2025,19 +2113,20 @@
             versions = {}
             for pinfo in pm.getPluginInfos():
                 versions[pinfo["module_name"]] = pinfo["version"]
-            
+
             info.append("Plugins Version Numbers:")
             for pluginModuleName in sorted(versions.keys()):
-                info.append("  {0} {1}".format(
-                    pluginModuleName, versions[pluginModuleName]))
-    
+                info.append(
+                    "  {0} {1}".format(pluginModuleName, versions[pluginModuleName])
+                )
+
     return linesep.join(info)
 
 
-def generateDistroInfo(linesep='\n'):
+def generateDistroInfo(linesep="\n"):
     """
     Module function to generate a string with distribution infos.
-    
+
     @param linesep string to be used to separate lines
     @type str
     @return string with distribution infos
@@ -2054,18 +2143,18 @@
                         lines = f.read().splitlines()
                 except OSError:
                     continue
-                
-                info.append('  {0}'.format(rfile))
-                info.extend(['    {0}'.format(line) for line in lines])
+
+                info.append("  {0}".format(rfile))
+                info.extend(["    {0}".format(line) for line in lines])
                 info.append("")
-    
+
     return linesep.join(info)
 
 
 def toBool(dataStr):
     """
     Module function to convert a string to a boolean value.
-    
+
     @param dataStr string to be converted (string)
     @return converted boolean value (boolean)
     """
@@ -2081,7 +2170,7 @@
     """
     Module function to get the Python path (sys.path) of a specific
     interpreter.
-    
+
     @param interpreter Python interpreter executable to get sys.path for
     @type str
     @return list containing sys.path of the interpreter; an empty list
@@ -2089,11 +2178,10 @@
     @rtype list of str
     """
     import json
-    
+
     sysPath = []
-    
-    getSysPathSkript = os.path.join(
-        os.path.dirname(__file__), "GetSysPath.py")
+
+    getSysPathSkript = os.path.join(os.path.dirname(__file__), "GetSysPath.py")
     args = [getSysPathSkript]
     proc = QProcess()
     proc.setProcessChannelMode(QProcess.ProcessChannelMode.MergedChannels)
@@ -2106,9 +2194,10 @@
             sysPath = json.loads(sysPathResult)
             if "" in sysPath:
                 sysPath.remove("")
-    
+
     return sysPath
 
+
 ###############################################################################
 ## posix compatibility functions below
 ###############################################################################
@@ -2123,40 +2212,42 @@
 def win32_Kill(pid):
     """
     Function to provide an os.kill equivalent for Win32.
-    
+
     @param pid process id (integer)
     @return result of the kill (boolean)
     """
     import win32api
+
     handle = win32api.OpenProcess(1, 0, pid)
-    return (0 != win32api.TerminateProcess(handle, 0))
+    return 0 != win32api.TerminateProcess(handle, 0)
 
 
 def win32_GetUserName():
     """
     Function to get the user name under Win32.
-    
+
     @return user name (string)
     """
     try:
         import win32api
+
         return win32api.GetUserName()
     except ImportError:
         try:
-            u = getEnvironmentEntry('USERNAME')
+            u = getEnvironmentEntry("USERNAME")
         except KeyError:
-            u = getEnvironmentEntry('username', None)
+            u = getEnvironmentEntry("username", None)
         return u
 
 
 def win32_getRealName():
     """
     Function to get the user's real name (aka. display name) under Win32.
-    
+
     @return real name of the current user (string)
     """
     import ctypes
-    
+
     GetUserNameEx = ctypes.windll.secur32.GetUserNameExW
     NameDisplay = 3
 
--- a/src/eric7/Utilities/crypto/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/crypto/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -33,32 +33,27 @@
 def pwEncode(pw):
     """
     Module function to encode a password.
-    
+
     @param pw password to encode (string)
     @return encoded password (string)
     """
     pop = (
-        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-        ".,;:-_!$?*+#"
+        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ".,;:-_!$?*+#"
     )
-    rpw = (
-        "".join(random.sample(pop, 32)) +
-        pw +
-        "".join(random.sample(pop, 32))
-    )
+    rpw = "".join(random.sample(pop, 32)) + pw + "".join(random.sample(pop, 32))
     return EncodeMarker + base64.b64encode(rpw.encode("utf-8")).decode("ascii")
 
 
 def pwDecode(epw):
     """
     Module function to decode a password.
-    
+
     @param epw encoded password to decode (string)
     @return decoded password (string)
     """
     if not epw.startswith(EncodeMarker):
         return epw  # it was not encoded using pwEncode
-    
+
     return base64.b64decode(epw[3:].encode("ascii"))[32:-32].decode("utf-8")
 
 
@@ -67,14 +62,16 @@
     Private module function to get the password from the user.
     """
     global MasterPassword
-    
+
     pw, ok = QInputDialog.getText(
         None,
         QCoreApplication.translate("Crypto", "Master Password"),
         QCoreApplication.translate("Crypto", "Enter the master password:"),
-        QLineEdit.EchoMode.Password)
+        QLineEdit.EchoMode.Password,
+    )
     if ok:
         from .py3PBKDF2 import verifyPassword
+
         masterPassword = Preferences.getUser("MasterPassword")
         try:
             if masterPassword:
@@ -83,18 +80,19 @@
                 else:
                     EricMessageBox.warning(
                         None,
-                        QCoreApplication.translate(
-                            "Crypto", "Master Password"),
+                        QCoreApplication.translate("Crypto", "Master Password"),
                         QCoreApplication.translate(
-                            "Crypto",
-                            """The given password is incorrect."""))
+                            "Crypto", """The given password is incorrect."""
+                        ),
+                    )
             else:
                 EricMessageBox.critical(
                     None,
                     QCoreApplication.translate("Crypto", "Master Password"),
                     QCoreApplication.translate(
-                        "Crypto",
-                        """There is no master password registered."""))
+                        "Crypto", """There is no master password registered."""
+                    ),
+                )
         except ValueError as why:
             EricMessageBox.warning(
                 None,
@@ -102,13 +100,15 @@
                 QCoreApplication.translate(
                     "Crypto",
                     """<p>The given password cannot be verified.</p>"""
-                    """<p>Reason: {0}""".format(str(why))))
+                    """<p>Reason: {0}""".format(str(why)),
+                ),
+            )
 
 
 def pwEncrypt(pw, masterPW=None):
     """
     Module function to encrypt a password.
-    
+
     @param pw password to encrypt (string)
     @param masterPW password to be used for encryption (string)
     @return encrypted password (string) and flag indicating
@@ -119,29 +119,37 @@
             __getMasterPassword()
             if MasterPassword is None:
                 return "", False
-        
+
         masterPW = pwDecode(MasterPassword)
-    
+
     from .py3PBKDF2 import hashPasswordTuple
+
     digestname, iterations, salt, pwHash = hashPasswordTuple(masterPW)
     key = pwHash[:32]
     from .py3AES import encryptData
+
     try:
         cipher = encryptData(key, pw.encode("utf-8"))
     except ValueError:
         return "", False
-    return CryptoMarker + Delimiter.join([
-        digestname,
-        str(iterations),
-        base64.b64encode(salt).decode("ascii"),
-        base64.b64encode(cipher).decode("ascii")
-    ]), True
+    return (
+        CryptoMarker
+        + Delimiter.join(
+            [
+                digestname,
+                str(iterations),
+                base64.b64encode(salt).decode("ascii"),
+                base64.b64encode(cipher).decode("ascii"),
+            ]
+        ),
+        True,
+    )
 
 
 def pwDecrypt(epw, masterPW=None):
     """
     Module function to decrypt a password.
-    
+
     @param epw hashed password to decrypt (string)
     @param masterPW password to be used for decryption (string)
     @return decrypted password (string) and flag indicating
@@ -149,18 +157,18 @@
     """
     if not epw.startswith(CryptoMarker):
         return epw, False  # it was not encoded using pwEncrypt
-    
+
     if masterPW is None:
         if MasterPassword is None:
             __getMasterPassword()
             if MasterPassword is None:
                 return "", False
-        
+
         masterPW = pwDecode(MasterPassword)
-    
+
     from .py3AES import decryptData
     from .py3PBKDF2 import rehashPassword
-    
+
     hashParameters, epw = epw[3:].rsplit(Delimiter, 1)
     try:
         # recreate the key used to encrypt
@@ -174,7 +182,7 @@
 def pwReencrypt(epw, oldPassword, newPassword):
     """
     Module function to re-encrypt a password.
-    
+
     @param epw hashed password to re-encrypt (string)
     @param oldPassword password used to encrypt (string)
     @param newPassword new password to be used (string)
@@ -191,9 +199,9 @@
 def pwRecode(epw, oldPassword, newPassword):
     """
     Module function to re-encode a password.
-    
+
     In case of an error the encoded password is returned unchanged.
-    
+
     @param epw encoded password to re-encode (string)
     @param oldPassword password used to encode (string)
     @param newPassword new password to be used (string)
@@ -201,35 +209,35 @@
     """
     if epw == "":
         return epw
-    
+
     if newPassword == "":
         plaintext, ok = pwDecrypt(epw)
-        return (pwEncode(plaintext) if ok else epw)
+        return pwEncode(plaintext) if ok else epw
     else:
         if oldPassword == "":
             plaintext = pwDecode(epw)
             cipher, ok = pwEncrypt(plaintext, newPassword)
-            return (cipher if ok else epw)
+            return cipher if ok else epw
         else:
             npw, ok = pwReencrypt(epw, oldPassword, newPassword)
-            return (npw if ok else epw)
+            return npw if ok else epw
 
 
 def pwConvert(pw, encode=True):
     """
     Module function to convert a plaintext password to the encoded form or
     vice versa.
-    
+
     If there is an error, an empty code is returned for the encode function
     or the given encoded password for the decode function.
-    
+
     @param pw password to encode (string)
     @param encode flag indicating an encode or decode function (boolean)
     @return encoded or decoded password (string)
     """
     if pw == "":
         return pw
-    
+
     if encode:
         # plain text -> encoded
         if Preferences.getUser("UseMasterPassword"):
@@ -243,13 +251,13 @@
             plain, ok = pwDecrypt(pw)
         else:
             plain, ok = pwDecode(pw), True
-        return (plain if ok else pw)
+        return plain if ok else pw
 
 
 def changeRememberedMaster(newPassword):
     """
     Module function to change the remembered master password.
-    
+
     @param newPassword new password to be used (string)
     """
     global MasterPassword
@@ -259,7 +267,7 @@
 def dataEncrypt(data, password, keyLength=32, hashIterations=10000):
     """
     Module function to encrypt a password.
-    
+
     @param data data to encrypt (bytes)
     @param password password to be used for encryption (string)
     @param keyLength length of the key to be generated for encryption
@@ -271,26 +279,33 @@
     """
     from .py3AES import encryptData
     from .py3PBKDF2 import hashPasswordTuple
-    
+
     digestname, iterations, salt, pwHash = hashPasswordTuple(
-        password, iterations=hashIterations)
+        password, iterations=hashIterations
+    )
     key = pwHash[:keyLength]
     try:
         cipher = encryptData(key, data)
     except ValueError:
         return b"", False
-    return CryptoMarker.encode("utf-8") + Delimiter.encode("utf-8").join([
-        digestname.encode("utf-8"),
-        str(iterations).encode("utf-8"),
-        base64.b64encode(salt),
-        base64.b64encode(cipher)
-    ]), True
+    return (
+        CryptoMarker.encode("utf-8")
+        + Delimiter.encode("utf-8").join(
+            [
+                digestname.encode("utf-8"),
+                str(iterations).encode("utf-8"),
+                base64.b64encode(salt),
+                base64.b64encode(cipher),
+            ]
+        ),
+        True,
+    )
 
 
 def dataDecrypt(edata, password, keyLength=32):
     """
     Module function to decrypt a password.
-    
+
     @param edata hashed data to decrypt (string)
     @param password password to be used for decryption (string)
     @param keyLength length of the key to be generated for decryption
@@ -300,10 +315,10 @@
     """
     if not edata.startswith(CryptoMarker.encode("utf-8")):
         return edata, False  # it was not encoded using dataEncrypt
-    
+
     from .py3AES import decryptData
     from .py3PBKDF2 import rehashPassword
-    
+
     hashParametersBytes, edata = edata[3:].rsplit(Delimiter.encode("utf-8"), 1)
     hashParameters = hashParametersBytes.decode()
     try:
--- a/src/eric7/Utilities/crypto/py3AES.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/crypto/py3AES.py	Wed Jul 13 14:55:47 2022 +0200
@@ -32,7 +32,7 @@
 def append_PKCS7_padding(b):
     """
     Function to pad the given data to a multiple of 16-bytes by PKCS7 padding.
-    
+
     @param b data to be padded (bytes)
     @return padded data (bytes)
     """
@@ -43,18 +43,16 @@
 def strip_PKCS7_padding(b):
     """
     Function to strip off PKCS7 padding.
-    
+
     @param b data to be stripped (bytes)
     @return stripped data (bytes)
     @exception ValueError data padding is invalid
     """
     if len(b) % 16 or not b:
-        raise ValueError(
-            "Data of len {0} can't be PCKS7-padded".format(len(b)))
+        raise ValueError("Data of len {0} can't be PCKS7-padded".format(len(b)))
     numpads = b[-1]
     if numpads > 16:
-        raise ValueError(
-            "Data ending with {0} can't be PCKS7-padded".format(b[-1]))
+        raise ValueError("Data ending with {0} can't be PCKS7-padded".format(b[-1]))
     return b[:-numpads]
 
 
@@ -62,6 +60,7 @@
     """
     Class implementing the Advanced Encryption Standard algorithm.
     """
+
     # valid key sizes
     KeySize = {
         "SIZE_128": 16,
@@ -70,87 +69,788 @@
     }
 
     # Rijndael S-box
-    sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67,
-            0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59,
-            0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7,
-            0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1,
-            0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05,
-            0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83,
-            0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29,
-            0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
-            0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa,
-            0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c,
-            0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc,
-            0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
-            0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,
-            0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee,
-            0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49,
-            0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
-            0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4,
-            0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6,
-            0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,
-            0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9,
-            0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e,
-            0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1,
-            0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0,
-            0x54, 0xbb, 0x16]
+    sbox = [
+        0x63,
+        0x7C,
+        0x77,
+        0x7B,
+        0xF2,
+        0x6B,
+        0x6F,
+        0xC5,
+        0x30,
+        0x01,
+        0x67,
+        0x2B,
+        0xFE,
+        0xD7,
+        0xAB,
+        0x76,
+        0xCA,
+        0x82,
+        0xC9,
+        0x7D,
+        0xFA,
+        0x59,
+        0x47,
+        0xF0,
+        0xAD,
+        0xD4,
+        0xA2,
+        0xAF,
+        0x9C,
+        0xA4,
+        0x72,
+        0xC0,
+        0xB7,
+        0xFD,
+        0x93,
+        0x26,
+        0x36,
+        0x3F,
+        0xF7,
+        0xCC,
+        0x34,
+        0xA5,
+        0xE5,
+        0xF1,
+        0x71,
+        0xD8,
+        0x31,
+        0x15,
+        0x04,
+        0xC7,
+        0x23,
+        0xC3,
+        0x18,
+        0x96,
+        0x05,
+        0x9A,
+        0x07,
+        0x12,
+        0x80,
+        0xE2,
+        0xEB,
+        0x27,
+        0xB2,
+        0x75,
+        0x09,
+        0x83,
+        0x2C,
+        0x1A,
+        0x1B,
+        0x6E,
+        0x5A,
+        0xA0,
+        0x52,
+        0x3B,
+        0xD6,
+        0xB3,
+        0x29,
+        0xE3,
+        0x2F,
+        0x84,
+        0x53,
+        0xD1,
+        0x00,
+        0xED,
+        0x20,
+        0xFC,
+        0xB1,
+        0x5B,
+        0x6A,
+        0xCB,
+        0xBE,
+        0x39,
+        0x4A,
+        0x4C,
+        0x58,
+        0xCF,
+        0xD0,
+        0xEF,
+        0xAA,
+        0xFB,
+        0x43,
+        0x4D,
+        0x33,
+        0x85,
+        0x45,
+        0xF9,
+        0x02,
+        0x7F,
+        0x50,
+        0x3C,
+        0x9F,
+        0xA8,
+        0x51,
+        0xA3,
+        0x40,
+        0x8F,
+        0x92,
+        0x9D,
+        0x38,
+        0xF5,
+        0xBC,
+        0xB6,
+        0xDA,
+        0x21,
+        0x10,
+        0xFF,
+        0xF3,
+        0xD2,
+        0xCD,
+        0x0C,
+        0x13,
+        0xEC,
+        0x5F,
+        0x97,
+        0x44,
+        0x17,
+        0xC4,
+        0xA7,
+        0x7E,
+        0x3D,
+        0x64,
+        0x5D,
+        0x19,
+        0x73,
+        0x60,
+        0x81,
+        0x4F,
+        0xDC,
+        0x22,
+        0x2A,
+        0x90,
+        0x88,
+        0x46,
+        0xEE,
+        0xB8,
+        0x14,
+        0xDE,
+        0x5E,
+        0x0B,
+        0xDB,
+        0xE0,
+        0x32,
+        0x3A,
+        0x0A,
+        0x49,
+        0x06,
+        0x24,
+        0x5C,
+        0xC2,
+        0xD3,
+        0xAC,
+        0x62,
+        0x91,
+        0x95,
+        0xE4,
+        0x79,
+        0xE7,
+        0xC8,
+        0x37,
+        0x6D,
+        0x8D,
+        0xD5,
+        0x4E,
+        0xA9,
+        0x6C,
+        0x56,
+        0xF4,
+        0xEA,
+        0x65,
+        0x7A,
+        0xAE,
+        0x08,
+        0xBA,
+        0x78,
+        0x25,
+        0x2E,
+        0x1C,
+        0xA6,
+        0xB4,
+        0xC6,
+        0xE8,
+        0xDD,
+        0x74,
+        0x1F,
+        0x4B,
+        0xBD,
+        0x8B,
+        0x8A,
+        0x70,
+        0x3E,
+        0xB5,
+        0x66,
+        0x48,
+        0x03,
+        0xF6,
+        0x0E,
+        0x61,
+        0x35,
+        0x57,
+        0xB9,
+        0x86,
+        0xC1,
+        0x1D,
+        0x9E,
+        0xE1,
+        0xF8,
+        0x98,
+        0x11,
+        0x69,
+        0xD9,
+        0x8E,
+        0x94,
+        0x9B,
+        0x1E,
+        0x87,
+        0xE9,
+        0xCE,
+        0x55,
+        0x28,
+        0xDF,
+        0x8C,
+        0xA1,
+        0x89,
+        0x0D,
+        0xBF,
+        0xE6,
+        0x42,
+        0x68,
+        0x41,
+        0x99,
+        0x2D,
+        0x0F,
+        0xB0,
+        0x54,
+        0xBB,
+        0x16,
+    ]
 
     # Rijndael Inverted S-box
-    rsbox = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3,
-             0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f,
-             0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54,
-             0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b,
-             0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24,
-             0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8,
-             0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d,
-             0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
-             0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab,
-             0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3,
-             0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1,
-             0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
-             0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
-             0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9,
-             0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d,
-             0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
-             0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0,
-             0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07,
-             0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60,
-             0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f,
-             0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5,
-             0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b,
-             0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55,
-             0x21, 0x0c, 0x7d]
+    rsbox = [
+        0x52,
+        0x09,
+        0x6A,
+        0xD5,
+        0x30,
+        0x36,
+        0xA5,
+        0x38,
+        0xBF,
+        0x40,
+        0xA3,
+        0x9E,
+        0x81,
+        0xF3,
+        0xD7,
+        0xFB,
+        0x7C,
+        0xE3,
+        0x39,
+        0x82,
+        0x9B,
+        0x2F,
+        0xFF,
+        0x87,
+        0x34,
+        0x8E,
+        0x43,
+        0x44,
+        0xC4,
+        0xDE,
+        0xE9,
+        0xCB,
+        0x54,
+        0x7B,
+        0x94,
+        0x32,
+        0xA6,
+        0xC2,
+        0x23,
+        0x3D,
+        0xEE,
+        0x4C,
+        0x95,
+        0x0B,
+        0x42,
+        0xFA,
+        0xC3,
+        0x4E,
+        0x08,
+        0x2E,
+        0xA1,
+        0x66,
+        0x28,
+        0xD9,
+        0x24,
+        0xB2,
+        0x76,
+        0x5B,
+        0xA2,
+        0x49,
+        0x6D,
+        0x8B,
+        0xD1,
+        0x25,
+        0x72,
+        0xF8,
+        0xF6,
+        0x64,
+        0x86,
+        0x68,
+        0x98,
+        0x16,
+        0xD4,
+        0xA4,
+        0x5C,
+        0xCC,
+        0x5D,
+        0x65,
+        0xB6,
+        0x92,
+        0x6C,
+        0x70,
+        0x48,
+        0x50,
+        0xFD,
+        0xED,
+        0xB9,
+        0xDA,
+        0x5E,
+        0x15,
+        0x46,
+        0x57,
+        0xA7,
+        0x8D,
+        0x9D,
+        0x84,
+        0x90,
+        0xD8,
+        0xAB,
+        0x00,
+        0x8C,
+        0xBC,
+        0xD3,
+        0x0A,
+        0xF7,
+        0xE4,
+        0x58,
+        0x05,
+        0xB8,
+        0xB3,
+        0x45,
+        0x06,
+        0xD0,
+        0x2C,
+        0x1E,
+        0x8F,
+        0xCA,
+        0x3F,
+        0x0F,
+        0x02,
+        0xC1,
+        0xAF,
+        0xBD,
+        0x03,
+        0x01,
+        0x13,
+        0x8A,
+        0x6B,
+        0x3A,
+        0x91,
+        0x11,
+        0x41,
+        0x4F,
+        0x67,
+        0xDC,
+        0xEA,
+        0x97,
+        0xF2,
+        0xCF,
+        0xCE,
+        0xF0,
+        0xB4,
+        0xE6,
+        0x73,
+        0x96,
+        0xAC,
+        0x74,
+        0x22,
+        0xE7,
+        0xAD,
+        0x35,
+        0x85,
+        0xE2,
+        0xF9,
+        0x37,
+        0xE8,
+        0x1C,
+        0x75,
+        0xDF,
+        0x6E,
+        0x47,
+        0xF1,
+        0x1A,
+        0x71,
+        0x1D,
+        0x29,
+        0xC5,
+        0x89,
+        0x6F,
+        0xB7,
+        0x62,
+        0x0E,
+        0xAA,
+        0x18,
+        0xBE,
+        0x1B,
+        0xFC,
+        0x56,
+        0x3E,
+        0x4B,
+        0xC6,
+        0xD2,
+        0x79,
+        0x20,
+        0x9A,
+        0xDB,
+        0xC0,
+        0xFE,
+        0x78,
+        0xCD,
+        0x5A,
+        0xF4,
+        0x1F,
+        0xDD,
+        0xA8,
+        0x33,
+        0x88,
+        0x07,
+        0xC7,
+        0x31,
+        0xB1,
+        0x12,
+        0x10,
+        0x59,
+        0x27,
+        0x80,
+        0xEC,
+        0x5F,
+        0x60,
+        0x51,
+        0x7F,
+        0xA9,
+        0x19,
+        0xB5,
+        0x4A,
+        0x0D,
+        0x2D,
+        0xE5,
+        0x7A,
+        0x9F,
+        0x93,
+        0xC9,
+        0x9C,
+        0xEF,
+        0xA0,
+        0xE0,
+        0x3B,
+        0x4D,
+        0xAE,
+        0x2A,
+        0xF5,
+        0xB0,
+        0xC8,
+        0xEB,
+        0xBB,
+        0x3C,
+        0x83,
+        0x53,
+        0x99,
+        0x61,
+        0x17,
+        0x2B,
+        0x04,
+        0x7E,
+        0xBA,
+        0x77,
+        0xD6,
+        0x26,
+        0xE1,
+        0x69,
+        0x14,
+        0x63,
+        0x55,
+        0x21,
+        0x0C,
+        0x7D,
+    ]
 
     # Rijndael Rcon
-    Rcon = [0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
-            0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,
-            0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
-            0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66,
-            0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
-            0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
-            0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
-            0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61,
-            0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-            0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
-            0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
-            0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
-            0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a,
-            0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
-            0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-            0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
-            0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4,
-            0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
-            0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08,
-            0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
-            0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
-            0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2,
-            0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74,
-            0xe8, 0xcb]
+    Rcon = [
+        0x8D,
+        0x01,
+        0x02,
+        0x04,
+        0x08,
+        0x10,
+        0x20,
+        0x40,
+        0x80,
+        0x1B,
+        0x36,
+        0x6C,
+        0xD8,
+        0xAB,
+        0x4D,
+        0x9A,
+        0x2F,
+        0x5E,
+        0xBC,
+        0x63,
+        0xC6,
+        0x97,
+        0x35,
+        0x6A,
+        0xD4,
+        0xB3,
+        0x7D,
+        0xFA,
+        0xEF,
+        0xC5,
+        0x91,
+        0x39,
+        0x72,
+        0xE4,
+        0xD3,
+        0xBD,
+        0x61,
+        0xC2,
+        0x9F,
+        0x25,
+        0x4A,
+        0x94,
+        0x33,
+        0x66,
+        0xCC,
+        0x83,
+        0x1D,
+        0x3A,
+        0x74,
+        0xE8,
+        0xCB,
+        0x8D,
+        0x01,
+        0x02,
+        0x04,
+        0x08,
+        0x10,
+        0x20,
+        0x40,
+        0x80,
+        0x1B,
+        0x36,
+        0x6C,
+        0xD8,
+        0xAB,
+        0x4D,
+        0x9A,
+        0x2F,
+        0x5E,
+        0xBC,
+        0x63,
+        0xC6,
+        0x97,
+        0x35,
+        0x6A,
+        0xD4,
+        0xB3,
+        0x7D,
+        0xFA,
+        0xEF,
+        0xC5,
+        0x91,
+        0x39,
+        0x72,
+        0xE4,
+        0xD3,
+        0xBD,
+        0x61,
+        0xC2,
+        0x9F,
+        0x25,
+        0x4A,
+        0x94,
+        0x33,
+        0x66,
+        0xCC,
+        0x83,
+        0x1D,
+        0x3A,
+        0x74,
+        0xE8,
+        0xCB,
+        0x8D,
+        0x01,
+        0x02,
+        0x04,
+        0x08,
+        0x10,
+        0x20,
+        0x40,
+        0x80,
+        0x1B,
+        0x36,
+        0x6C,
+        0xD8,
+        0xAB,
+        0x4D,
+        0x9A,
+        0x2F,
+        0x5E,
+        0xBC,
+        0x63,
+        0xC6,
+        0x97,
+        0x35,
+        0x6A,
+        0xD4,
+        0xB3,
+        0x7D,
+        0xFA,
+        0xEF,
+        0xC5,
+        0x91,
+        0x39,
+        0x72,
+        0xE4,
+        0xD3,
+        0xBD,
+        0x61,
+        0xC2,
+        0x9F,
+        0x25,
+        0x4A,
+        0x94,
+        0x33,
+        0x66,
+        0xCC,
+        0x83,
+        0x1D,
+        0x3A,
+        0x74,
+        0xE8,
+        0xCB,
+        0x8D,
+        0x01,
+        0x02,
+        0x04,
+        0x08,
+        0x10,
+        0x20,
+        0x40,
+        0x80,
+        0x1B,
+        0x36,
+        0x6C,
+        0xD8,
+        0xAB,
+        0x4D,
+        0x9A,
+        0x2F,
+        0x5E,
+        0xBC,
+        0x63,
+        0xC6,
+        0x97,
+        0x35,
+        0x6A,
+        0xD4,
+        0xB3,
+        0x7D,
+        0xFA,
+        0xEF,
+        0xC5,
+        0x91,
+        0x39,
+        0x72,
+        0xE4,
+        0xD3,
+        0xBD,
+        0x61,
+        0xC2,
+        0x9F,
+        0x25,
+        0x4A,
+        0x94,
+        0x33,
+        0x66,
+        0xCC,
+        0x83,
+        0x1D,
+        0x3A,
+        0x74,
+        0xE8,
+        0xCB,
+        0x8D,
+        0x01,
+        0x02,
+        0x04,
+        0x08,
+        0x10,
+        0x20,
+        0x40,
+        0x80,
+        0x1B,
+        0x36,
+        0x6C,
+        0xD8,
+        0xAB,
+        0x4D,
+        0x9A,
+        0x2F,
+        0x5E,
+        0xBC,
+        0x63,
+        0xC6,
+        0x97,
+        0x35,
+        0x6A,
+        0xD4,
+        0xB3,
+        0x7D,
+        0xFA,
+        0xEF,
+        0xC5,
+        0x91,
+        0x39,
+        0x72,
+        0xE4,
+        0xD3,
+        0xBD,
+        0x61,
+        0xC2,
+        0x9F,
+        0x25,
+        0x4A,
+        0x94,
+        0x33,
+        0x66,
+        0xCC,
+        0x83,
+        0x1D,
+        0x3A,
+        0x74,
+        0xE8,
+        0xCB,
+    ]
 
     def __getSBoxValue(self, num):
         """
         Private method to retrieve a given S-Box value.
-        
+
         @param num position of the value (integer)
         @return value of the S-Box (integer)
         """
@@ -159,7 +859,7 @@
     def __getSBoxInvert(self, num):
         """
         Private method to retrieve a given Inverted S-Box value.
-        
+
         @param num position of the value (integer)
         @return value of the Inverted S-Box (integer)
         """
@@ -171,7 +871,7 @@
 
         Rotate the data word eight bits to the left: eg,
         rotate(1d2c3a4f) == 2c3a4f1d.
-        
+
         @param data data of size 4 (bytearray)
         @return rotated data (bytearray)
         """
@@ -180,7 +880,7 @@
     def __getRconValue(self, num):
         """
         Private method to retrieve a given Rcon value.
-        
+
         @param num position of the value (integer)
         @return Rcon value (integer)
         """
@@ -189,7 +889,7 @@
     def __core(self, data, iteration):
         """
         Private method performing the key schedule core operation.
-        
+
         @param data data to operate on (bytearray)
         @param iteration iteration counter (integer)
         @return modified data (bytearray)
@@ -209,7 +909,7 @@
         Private method performing Rijndael's key expansion.
 
         Expands a 128, 192 or 256 bit key into a 176, 208 or 240 bit key.
-        
+
         @param key key to be expanded (bytes or bytearray)
         @param size size of the key in bytes (16, 24 or 32)
         @param expandedKeySize size of the expanded key (integer)
@@ -227,7 +927,7 @@
 
         while currentSize < expandedKeySize:
             # assign the previous 4 bytes to the temporary value t
-            t = expandedKey[currentSize - 4:currentSize]
+            t = expandedKey[currentSize - 4 : currentSize]
 
             # every 16, 24, 32 bytes we apply the core schedule to t
             # and increment rconIteration afterwards
@@ -235,10 +935,7 @@
                 t = self.__core(t, rconIteration)
                 rconIteration += 1
             # For 256-bit keys, we add an extra sbox to the calculation
-            if (
-                size == self.KeySize["SIZE_256"] and
-                ((currentSize % size) == 16)
-            ):
+            if size == self.KeySize["SIZE_256"] and ((currentSize % size) == 16):
                 for ll in range(4):
                     t[ll] = self.__getSBoxValue(t[ll])
 
@@ -246,17 +943,15 @@
             # expanded key. This becomes the next four bytes in the expanded
             # key.
             for m in range(4):
-                expandedKey[currentSize] = (
-                    expandedKey[currentSize - size] ^ t[m]
-                )
-                currentSize += 1        # __IGNORE_WARNING_Y113__
+                expandedKey[currentSize] = expandedKey[currentSize - size] ^ t[m]
+                currentSize += 1  # __IGNORE_WARNING_Y113__
 
         return expandedKey
 
     def __addRoundKey(self, state, roundKey):
         """
         Private method to add (XORs) the round key to the state.
-        
+
         @param state state to be changed (bytearray)
         @param roundKey key to be used for the modification (bytearray)
         @return modified state (bytearray)
@@ -269,7 +964,7 @@
     def __createRoundKey(self, expandedKey, roundKeyPointer):
         """
         Private method to create a round key.
-        
+
         @param expandedKey expanded key to be used (bytearray)
         @param roundKeyPointer position within the expanded key (integer)
         @return round key (bytearray)
@@ -284,7 +979,7 @@
         """
         Private method to perform a Galois multiplication of 8 bit characters
         a and b.
-        
+
         @param a first factor (byte)
         @param b second factor (byte)
         @return result (byte)
@@ -298,7 +993,7 @@
             # keep a 8 bit
             a &= 0xFF
             if hi_bit_set:
-                a ^= 0x1b
+                a ^= 0x1B
             b >>= 1
         return p
 
@@ -306,7 +1001,7 @@
         """
         Private method to substitute all the values from the state with the
         value in the SBox using the state value as index for the SBox.
-        
+
         @param state state to be worked on (bytearray)
         @param isInv flag indicating an inverse operation (boolean)
         @return modified state (bytearray)
@@ -321,7 +1016,7 @@
         """
         Private method to iterate over the 4 rows and call __shiftRow() with
         that row.
-        
+
         @param state state to be worked on (bytearray)
         @param isInv flag indicating an inverse operation (boolean)
         @return modified state (bytearray)
@@ -334,7 +1029,7 @@
     def __shiftRow(self, state, statePointer, nbr, isInv):
         """
         Private method to shift the bytes of a row to the left.
-        
+
         @param state state to be worked on (bytearray)
         @param statePointer index into the state (integer)
         @param nbr number of positions to shift (integer)
@@ -344,21 +1039,21 @@
         state = state[:]
         for _ in range(nbr):
             if isInv:
-                state[statePointer:statePointer + 4] = (
-                    state[statePointer + 3:statePointer + 4] +
-                    state[statePointer:statePointer + 3]
+                state[statePointer : statePointer + 4] = (
+                    state[statePointer + 3 : statePointer + 4]
+                    + state[statePointer : statePointer + 3]
                 )
             else:
-                state[statePointer:statePointer + 4] = (
-                    state[statePointer + 1:statePointer + 4] +
-                    state[statePointer:statePointer + 1]
+                state[statePointer : statePointer + 4] = (
+                    state[statePointer + 1 : statePointer + 4]
+                    + state[statePointer : statePointer + 1]
                 )
         return state
 
     def __mixColumns(self, state, isInv):
         """
         Private method to perform a galois multiplication of the 4x4 matrix.
-        
+
         @param state state to be worked on (bytearray)
         @param isInv flag indicating an inverse operation (boolean)
         @return modified state (bytearray)
@@ -367,11 +1062,11 @@
         # iterate over the 4 columns
         for i in range(4):
             # construct one column by slicing over the 4 rows
-            column = state[i:i + 16:4]
+            column = state[i : i + 16 : 4]
             # apply the __mixColumn on one column
             column = self.__mixColumn(column, isInv)
             # put the values back into the state
-            state[i:i + 16:4] = column
+            state[i : i + 16 : 4] = column
 
         return state
 
@@ -380,7 +1075,7 @@
         """
         Private method to perform a galois multiplication of 1 column the
         4x4 matrix.
-        
+
         @param column column to be worked on (bytearray)
         @param isInv flag indicating an inverse operation (boolean)
         @return modified column (bytearray)
@@ -391,20 +1086,28 @@
         g = self.__galois_multiplication
 
         column[0] = (
-            g(cpy[0], mult[0]) ^ g(cpy[3], mult[1]) ^
-            g(cpy[2], mult[2]) ^ g(cpy[1], mult[3])
+            g(cpy[0], mult[0])
+            ^ g(cpy[3], mult[1])
+            ^ g(cpy[2], mult[2])
+            ^ g(cpy[1], mult[3])
         )
         column[1] = (
-            g(cpy[1], mult[0]) ^ g(cpy[0], mult[1]) ^
-            g(cpy[3], mult[2]) ^ g(cpy[2], mult[3])
+            g(cpy[1], mult[0])
+            ^ g(cpy[0], mult[1])
+            ^ g(cpy[3], mult[2])
+            ^ g(cpy[2], mult[3])
         )
         column[2] = (
-            g(cpy[2], mult[0]) ^ g(cpy[1], mult[1]) ^
-            g(cpy[0], mult[2]) ^ g(cpy[3], mult[3])
+            g(cpy[2], mult[0])
+            ^ g(cpy[1], mult[1])
+            ^ g(cpy[0], mult[2])
+            ^ g(cpy[3], mult[3])
         )
         column[3] = (
-            g(cpy[3], mult[0]) ^ g(cpy[2], mult[1]) ^
-            g(cpy[1], mult[2]) ^ g(cpy[0], mult[3])
+            g(cpy[3], mult[0])
+            ^ g(cpy[2], mult[1])
+            ^ g(cpy[1], mult[2])
+            ^ g(cpy[0], mult[3])
         )
         return column
 
@@ -412,7 +1115,7 @@
         """
         Private method to apply the 4 operations of the forward round in
         sequence.
-        
+
         @param state state to be worked on (bytearray)
         @param roundKey round key to be used (bytearray)
         @return modified state (bytearray)
@@ -427,7 +1130,7 @@
         """
         Private method to apply the 4 operations of the inverse round in
         sequence.
-        
+
         @param state state to be worked on (bytearray)
         @param roundKey round key to be used (bytearray)
         @return modified state (bytearray)
@@ -441,60 +1144,60 @@
     def __aes_main(self, state, expandedKey, nbrRounds):
         """
         Private method to do the AES encryption for one round.
-        
+
         Perform the initial operations, the standard round, and the
         final operations of the forward AES, creating a round key for
         each round.
-        
+
+        @param state state to be worked on (bytearray)
+        @param expandedKey expanded key to be used (bytearray)
+        @param nbrRounds number of rounds to be done (integer)
+        @return modified state (bytearray)
+        """
+        state = self.__addRoundKey(state, self.__createRoundKey(expandedKey, 0))
+        i = 1
+        while i < nbrRounds:
+            state = self.__aes_round(state, self.__createRoundKey(expandedKey, 16 * i))
+            i += 1
+        state = self.__subBytes(state, False)
+        state = self.__shiftRows(state, False)
+        state = self.__addRoundKey(
+            state, self.__createRoundKey(expandedKey, 16 * nbrRounds)
+        )
+        return state
+
+    def __aes_invMain(self, state, expandedKey, nbrRounds):
+        """
+        Private method to do the inverse AES encryption for one round.
+
+        Perform the initial operations, the standard round, and the
+        final operations of the inverse AES, creating a round key for
+        each round.
+
         @param state state to be worked on (bytearray)
         @param expandedKey expanded key to be used (bytearray)
         @param nbrRounds number of rounds to be done (integer)
         @return modified state (bytearray)
         """
         state = self.__addRoundKey(
-            state, self.__createRoundKey(expandedKey, 0))
-        i = 1
-        while i < nbrRounds:
-            state = self.__aes_round(
-                state, self.__createRoundKey(expandedKey, 16 * i))
-            i += 1
-        state = self.__subBytes(state, False)
-        state = self.__shiftRows(state, False)
-        state = self.__addRoundKey(
-            state, self.__createRoundKey(expandedKey, 16 * nbrRounds))
-        return state
-
-    def __aes_invMain(self, state, expandedKey, nbrRounds):
-        """
-        Private method to do the inverse AES encryption for one round.
-        
-        Perform the initial operations, the standard round, and the
-        final operations of the inverse AES, creating a round key for
-        each round.
-        
-        @param state state to be worked on (bytearray)
-        @param expandedKey expanded key to be used (bytearray)
-        @param nbrRounds number of rounds to be done (integer)
-        @return modified state (bytearray)
-        """
-        state = self.__addRoundKey(
-            state, self.__createRoundKey(expandedKey, 16 * nbrRounds))
+            state, self.__createRoundKey(expandedKey, 16 * nbrRounds)
+        )
         i = nbrRounds - 1
         while i > 0:
             state = self.__aes_invRound(
-                state, self.__createRoundKey(expandedKey, 16 * i))
+                state, self.__createRoundKey(expandedKey, 16 * i)
+            )
             i -= 1
         state = self.__shiftRows(state, True)
         state = self.__subBytes(state, True)
-        state = self.__addRoundKey(
-            state, self.__createRoundKey(expandedKey, 0))
+        state = self.__addRoundKey(state, self.__createRoundKey(expandedKey, 0))
         return state
 
     def encrypt(self, iput, key, size):
         """
         Public method to encrypt a 128 bit input block against the given key
         of size specified.
-        
+
         @param iput input data (bytearray)
         @param key key to be used (bytes or bytearray)
         @param size key size (16, 24 or 32)
@@ -503,7 +1206,7 @@
         """
         if size not in self.KeySize.values():
             raise ValueError("Wrong key size given ({0}).".format(size))
-        
+
         output = bytearray(16)
         # the number of rounds
         nbrRounds = 0
@@ -552,7 +1255,7 @@
         """
         Public method to decrypt a 128 bit input block against the given key
         of size specified.
-        
+
         @param iput input data (bytearray)
         @param key key to be used (bytes or bytearray)
         @param size key size (16, 24 or 32)
@@ -561,14 +1264,14 @@
         """
         if size not in self.KeySize.values():
             raise ValueError("Wrong key size given ({0}).".format(size))
-        
+
         output = bytearray(16)
         # the number of rounds
         nbrRounds = 0
         # the 128 bit block to decode
         block = bytearray(16)
         # set the number of rounds
-        
+
         if size == self.KeySize["SIZE_128"]:
             nbrRounds = 10
         elif size == self.KeySize["SIZE_192"]:
@@ -607,6 +1310,7 @@
     """
     Class implementing the different AES mode of operations.
     """
+
     aes = AES()
 
     # structure of supported modes of operation
@@ -619,7 +1323,7 @@
     def __extractBytes(self, inputData, start, end, mode):
         """
         Private method to extract a range of bytes from the input.
-        
+
         @param inputData input data (bytes)
         @param start start index (integer)
         @param end end index (integer)
@@ -628,8 +1332,7 @@
         """
         if end - start > 16:
             end = start + 16
-        ar = (bytearray(16) if mode == self.ModeOfOperation["CBC"]
-              else bytearray())
+        ar = bytearray(16) if mode == self.ModeOfOperation["CBC"] else bytearray()
 
         i = start
         j = 0
@@ -644,7 +1347,7 @@
     def encrypt(self, inputData, mode, key, size, IV):
         """
         Public method to perform the encryption operation.
-        
+
         @param inputData data to be encrypted (bytes)
         @param mode mode of operation (0, 1 or 2)
         @param key key to be used (bytes)
@@ -655,8 +1358,7 @@
         @exception ValueError key size is invalid or decrypted data is invalid
         """
         if len(key) % size:
-            raise ValueError("Illegal size ({0}) for key '{1}'.".format(
-                size, key))
+            raise ValueError("Illegal size ({0}) for key '{1}'.".format(size, key))
         if len(IV) % 16:
             raise ValueError("IV is not a multiple of 16.")
         # the AES input/output
@@ -733,7 +1435,7 @@
     def decrypt(self, cipherIn, originalsize, mode, key, size, IV):
         """
         Public method to perform the decryption operation.
-        
+
         @param cipherIn data to be decrypted (bytes)
         @param originalsize unencrypted string length (required for CBC)
             (integer)
@@ -745,8 +1447,7 @@
         @exception ValueError key size is invalid or decrypted data is invalid
         """
         if len(key) % size:
-            raise ValueError("Illegal size ({0}) for key '{1}'.".format(
-                size, key))
+            raise ValueError("Illegal size ({0}) for key '{1}'.".format(size, key))
         if len(IV) % 16:
             raise ValueError("IV is not a multiple of 16.")
         # the AES input/output
@@ -822,7 +1523,7 @@
 def encryptData(key, data, mode=AESModeOfOperation.ModeOfOperation["CBC"]):
     """
     Module function to encrypt the given data with the given key.
-    
+
     @param key key to be used for encryption (bytes)
     @param data data to be encrypted (bytes)
     @param mode mode of operations (0, 1 or 2)
@@ -834,7 +1535,7 @@
         data = append_PKCS7_padding(data)
     keysize = len(key)
     if keysize not in AES.KeySize.values():
-        raise ValueError('invalid key size: {0}'.format(keysize))
+        raise ValueError("invalid key size: {0}".format(keysize))
     # create a new iv using random data
     iv = bytearray([i for i in os.urandom(16)])
     moo = AESModeOfOperation()
@@ -848,7 +1549,7 @@
 def decryptData(key, data, mode=AESModeOfOperation.ModeOfOperation["CBC"]):
     """
     Module function to decrypt the given data with the given key.
-    
+
     @param key key to be used for decryption (bytes)
     @param data data to be decrypted (with initialization vector prepended)
         (bytes)
@@ -859,7 +1560,7 @@
     key = bytearray(key)
     keysize = len(key)
     if keysize not in AES.KeySize.values():
-        raise ValueError('invalid key size: {0}'.format(keysize))
+        raise ValueError("invalid key size: {0}".format(keysize))
     # iv is first 16 bytes
     iv = bytearray(data[:16])
     data = bytearray(data[16:])
--- a/src/eric7/Utilities/crypto/py3PBKDF2.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/crypto/py3PBKDF2.py	Wed Jul 13 14:55:47 2022 +0200
@@ -27,7 +27,7 @@
 def pbkdf2(password, salt, iterations, digestMod):
     """
     Module function to hash a password according to the PBKDF2 specification.
-    
+
     @param password clear text password (bytes)
     @param salt salt value (bytes)
     @param iterations number of times hash function should be applied (integer)
@@ -40,11 +40,12 @@
     return pwHash
 
 
-def hashPasswordTuple(password, digestMod=hashlib.sha512, iterations=10000,
-                      saltSize=32):
+def hashPasswordTuple(
+    password, digestMod=hashlib.sha512, iterations=10000, saltSize=32
+):
     """
     Module function to hash a password according to the PBKDF2 specification.
-    
+
     @param password clear text password (string)
     @param digestMod hash function
     @param iterations number of times hash function should be applied (integer)
@@ -59,11 +60,10 @@
     return digestname, iterations, salt, pwHash
 
 
-def hashPassword(password, digestMod=hashlib.sha512, iterations=10000,
-                 saltSize=32):
+def hashPassword(password, digestMod=hashlib.sha512, iterations=10000, saltSize=32):
     """
     Module function to hash a password according to the PBKDF2 specification.
-    
+
     @param password clear text password (string)
     @param digestMod hash function
     @param iterations number of times hash function should be applied (integer)
@@ -71,19 +71,22 @@
     @return hashed password entry according to PBKDF2 specification (string)
     """
     digestname, iterations, salt, pwHash = hashPasswordTuple(
-        password, digestMod, iterations, saltSize)
-    return Delimiter.join([
-        digestname,
-        str(iterations),
-        base64.b64encode(salt).decode("ascii"),
-        base64.b64encode(pwHash).decode("ascii")
-    ])
+        password, digestMod, iterations, saltSize
+    )
+    return Delimiter.join(
+        [
+            digestname,
+            str(iterations),
+            base64.b64encode(salt).decode("ascii"),
+            base64.b64encode(pwHash).decode("ascii"),
+        ]
+    )
 
 
 def verifyPassword(password, pwHash):
     """
     Module function to verify a password against a hash encoded password.
-    
+
     @param password clear text password (string)
     @param pwHash hash encoded password in the form
         'digestmod$iterations$salt$hashed_password' as produced by the
@@ -97,14 +100,16 @@
     except ValueError:
         raise ValueError(
             "Expected hash encoded password in format "
-            "'digestmod{0}iterations{0}salt{0}hashed_password"
-            .format(Delimiter))
-    
+            "'digestmod{0}iterations{0}salt{0}hashed_password".format(Delimiter)
+        )
+
     if digestname not in Hashes.keys():
         raise ValueError(
-            "Unsupported hash algorithm '{0}' for hash encoded password '{1}'."
-            .format(digestname, pwHash))
-    
+            "Unsupported hash algorithm '{0}' for hash encoded password '{1}'.".format(
+                digestname, pwHash
+            )
+        )
+
     iterations = int(iterations)
     salt = base64.b64decode(salt.encode("ascii"))
     pwHash = base64.b64decode(pwHash.encode("ascii"))
@@ -115,7 +120,7 @@
 def rehashPassword(password, hashParameters):
     """
     Module function to recreate a password hash given the hash parameters.
-    
+
     @param password clear text password (string)
     @param hashParameters hash parameters in the form
         'digestmod$iterations$salt' (string)
@@ -128,13 +133,16 @@
     except ValueError:
         raise ValueError(
             "Expected hash parameters string in format "
-            "'digestmod{0}iterations{0}salt".format(Delimiter))
-    
+            "'digestmod{0}iterations{0}salt".format(Delimiter)
+        )
+
     if digestname not in Hashes.keys():
         raise ValueError(
-            "Unsupported hash algorithm '{0}' for hash parameters '{1}'."
-            .format(digestname, hashParameters))
-    
+            "Unsupported hash algorithm '{0}' for hash parameters '{1}'.".format(
+                digestname, hashParameters
+            )
+        )
+
     iterations = int(iterations)
     salt = base64.b64decode(salt.encode("ascii"))
     password = password.encode("utf-8")
--- a/src/eric7/Utilities/uic.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Utilities/uic.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,7 +15,7 @@
     """
     Local function to create the Python source file name for the compiled
     .ui file.
-    
+
     @param py_dir suggested name of the directory (string)
     @param py_file suggested name for the compile source file (string)
     @return tuple of directory name (string) and source file name (string)
@@ -27,7 +27,7 @@
     """
     Module function to compile the .ui files of a directory tree to Python
     sources.
-    
+
     @param directory name of a directory to scan for .ui files (string)
     @param recurse flag indicating to recurse into subdirectories (boolean)
     """
--- a/src/eric7/VCS/CommandOptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/CommandOptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,64 +18,76 @@
     """
     Class implementing the VCS command options dialog.
     """
+
     def __init__(self, vcs, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         opt = vcs.vcsGetOptions()
-        self.globalEdit.setText(" ".join(opt['global']))
-        self.commitEdit.setText(" ".join(opt['commit']))
-        self.checkoutEdit.setText(" ".join(opt['checkout']))
-        self.updateEdit.setText(" ".join(opt['update']))
-        self.addEdit.setText(" ".join(opt['add']))
-        self.removeEdit.setText(" ".join(opt['remove']))
-        self.diffEdit.setText(" ".join(opt['diff']))
-        self.logEdit.setText(" ".join(opt['log']))
-        self.historyEdit.setText(" ".join(opt['history']))
-        self.statusEdit.setText(" ".join(opt['status']))
-        self.tagEdit.setText(" ".join(opt['tag']))
-        self.exportEdit.setText(" ".join(opt['export']))
-        
+        self.globalEdit.setText(" ".join(opt["global"]))
+        self.commitEdit.setText(" ".join(opt["commit"]))
+        self.checkoutEdit.setText(" ".join(opt["checkout"]))
+        self.updateEdit.setText(" ".join(opt["update"]))
+        self.addEdit.setText(" ".join(opt["add"]))
+        self.removeEdit.setText(" ".join(opt["remove"]))
+        self.diffEdit.setText(" ".join(opt["diff"]))
+        self.logEdit.setText(" ".join(opt["log"]))
+        self.historyEdit.setText(" ".join(opt["history"]))
+        self.statusEdit.setText(" ".join(opt["status"]))
+        self.tagEdit.setText(" ".join(opt["tag"]))
+        self.exportEdit.setText(" ".join(opt["export"]))
+
         # modify the what's this help
-        for widget in [self.globalEdit, self.commitEdit, self.checkoutEdit,
-                       self.updateEdit, self.addEdit, self.removeEdit,
-                       self.diffEdit, self.logEdit, self.historyEdit,
-                       self.statusEdit, self.tagEdit, self.exportEdit]:
+        for widget in [
+            self.globalEdit,
+            self.commitEdit,
+            self.checkoutEdit,
+            self.updateEdit,
+            self.addEdit,
+            self.removeEdit,
+            self.diffEdit,
+            self.logEdit,
+            self.historyEdit,
+            self.statusEdit,
+            self.tagEdit,
+            self.exportEdit,
+        ]:
             t = widget.whatsThis()
             if t:
                 t += Utilities.getPercentReplacementHelp()
                 widget.setWhatsThis(t)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-        
+
     def getOptions(self):
         """
         Public method used to retrieve the entered options.
-        
+
         @return dictionary of strings giving the options for each supported
             vcs command
         """
         opt = {}
-        opt['global'] = Utilities.parseOptionString(self.globalEdit.text())
-        opt['commit'] = Utilities.parseOptionString(self.commitEdit.text())
-        opt['checkout'] = Utilities.parseOptionString(self.checkoutEdit.text())
-        opt['update'] = Utilities.parseOptionString(self.updateEdit.text())
-        opt['add'] = Utilities.parseOptionString(self.addEdit.text())
-        opt['remove'] = Utilities.parseOptionString(self.removeEdit.text())
-        opt['diff'] = Utilities.parseOptionString(self.diffEdit.text())
-        opt['log'] = Utilities.parseOptionString(self.logEdit.text())
-        opt['history'] = Utilities.parseOptionString(self.historyEdit.text())
-        opt['status'] = Utilities.parseOptionString(self.statusEdit.text())
-        opt['tag'] = Utilities.parseOptionString(self.tagEdit.text())
-        opt['export'] = Utilities.parseOptionString(self.exportEdit.text())
+        opt["global"] = Utilities.parseOptionString(self.globalEdit.text())
+        opt["commit"] = Utilities.parseOptionString(self.commitEdit.text())
+        opt["checkout"] = Utilities.parseOptionString(self.checkoutEdit.text())
+        opt["update"] = Utilities.parseOptionString(self.updateEdit.text())
+        opt["add"] = Utilities.parseOptionString(self.addEdit.text())
+        opt["remove"] = Utilities.parseOptionString(self.removeEdit.text())
+        opt["diff"] = Utilities.parseOptionString(self.diffEdit.text())
+        opt["log"] = Utilities.parseOptionString(self.logEdit.text())
+        opt["history"] = Utilities.parseOptionString(self.historyEdit.text())
+        opt["status"] = Utilities.parseOptionString(self.statusEdit.text())
+        opt["tag"] = Utilities.parseOptionString(self.tagEdit.text())
+        opt["export"] = Utilities.parseOptionString(self.exportEdit.text())
         return opt
 
+
 #
 # eflag: noqa = C112
--- a/src/eric7/VCS/ProjectBrowserHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/ProjectBrowserHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,8 +17,9 @@
 from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
 
 from Project.ProjectBrowserModel import (
-    ProjectBrowserSimpleDirectoryItem, ProjectBrowserFileItem,
-    ProjectBrowserDirectoryItem
+    ProjectBrowserSimpleDirectoryItem,
+    ProjectBrowserFileItem,
+    ProjectBrowserDirectoryItem,
 )
 
 import Preferences
@@ -28,11 +29,19 @@
     """
     Class implementing the base class of the VCS project browser helper.
     """
-    def __init__(self, vcsObject, browserObject, projectObject,
-                 isTranslationsBrowser, parent=None, name=None):
+
+    def __init__(
+        self,
+        vcsObject,
+        browserObject,
+        projectObject,
+        isTranslationsBrowser,
+        parent=None,
+        name=None,
+    ):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param browserObject reference to the project browser object
         @param projectObject reference to the project object
@@ -44,18 +53,17 @@
         super().__init__(parent)
         if name:
             self.setObjectName(name)
-        
+
         self.vcs = vcsObject
         self.browser = browserObject
         self.isTranslationsBrowser = isTranslationsBrowser
         self.project = projectObject
-    
-    def addVCSMenus(self, mainMenu, multiMenu, backMenu, dirMenu,
-                    dirMultiMenu):
+
+    def addVCSMenus(self, mainMenu, multiMenu, backMenu, dirMenu, dirMultiMenu):
         """
         Public method to add the VCS entries to the various project browser
         menus.
-        
+
         @param mainMenu reference to the main menu (QPopupMenu)
         @param multiMenu reference to the multiple selection menu (QPopupMenu)
         @param backMenu reference to the background menu (QPopupMenu)
@@ -68,85 +76,89 @@
         self._addVCSMenuBack(backMenu)
         self._addVCSMenuDir(dirMenu)
         self._addVCSMenuDirMulti(dirMultiMenu)
-    
+
     def showContextMenu(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the file status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def showContextMenuMulti(self, menu, standardItems):
         """
         Public slot called before the context menu (multiple selections) is
         shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the files status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def showContextMenuDir(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that
             need activation/deactivation depending on the overall VCS status
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def showContextMenuDirMulti(self, menu, standardItems):
         """
         Public slot called before the context menu is shown.
-        
+
         It enables/disables the VCS menu entries depending on the overall
         VCS status and the directory status.
-        
+
         @param menu reference to the menu to be shown
         @param standardItems array of standard items that need
             activation/deactivation depending on the overall VCS status
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
+        raise RuntimeError("Not implemented")
 
     ###########################################################################
     ## General menu handling methods below
     ###########################################################################
-    
+
     def _VCSUpdate(self):
         """
         Protected slot called by the context menu to update a file from the
         VCS repository.
         """
         if self.isTranslationsBrowser:
-            names = [itm.dirName()
-                     for itm in self.browser.getSelectedItems(
-                         [ProjectBrowserSimpleDirectoryItem])]
+            names = [
+                itm.dirName()
+                for itm in self.browser.getSelectedItems(
+                    [ProjectBrowserSimpleDirectoryItem]
+                )
+            ]
             if not names:
-                names = [itm.fileName()
-                         for itm in self.browser.getSelectedItems(
-                             [ProjectBrowserFileItem])]
+                names = [
+                    itm.fileName()
+                    for itm in self.browser.getSelectedItems([ProjectBrowserFileItem])
+                ]
         else:
             names = []
             for itm in self.browser.getSelectedItems():
@@ -156,20 +168,24 @@
                     name = itm.dirName()
                 names.append(name)
         self.vcs.vcsUpdate(names)
-        
+
     def _VCSCommit(self):
         """
         Protected slot called by the context menu to commit the changes to the
         VCS repository.
         """
         if self.isTranslationsBrowser:
-            names = [itm.dirName()
-                     for itm in self.browser.getSelectedItems(
-                         [ProjectBrowserSimpleDirectoryItem])]
+            names = [
+                itm.dirName()
+                for itm in self.browser.getSelectedItems(
+                    [ProjectBrowserSimpleDirectoryItem]
+                )
+            ]
             if not names:
-                names = [itm.fileName()
-                         for itm in self.browser.getSelectedItems(
-                             [ProjectBrowserFileItem])]
+                names = [
+                    itm.fileName()
+                    for itm in self.browser.getSelectedItems([ProjectBrowserFileItem])
+                ]
         else:
             names = []
             for itm in self.browser.getSelectedItems():
@@ -182,16 +198,15 @@
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
-        self.vcs.vcsCommit(names, '')
-        
+        self.vcs.vcsCommit(names, "")
+
     def _VCSAdd(self):
         """
         Protected slot called by the context menu to add the selected file to
         the VCS repository.
         """
         if self.isTranslationsBrowser:
-            items = self.browser.getSelectedItems(
-                [ProjectBrowserSimpleDirectoryItem])
+            items = self.browser.getSelectedItems([ProjectBrowserSimpleDirectoryItem])
             if items:
                 names = [itm.dirName() for itm in items]
                 qnames = []
@@ -201,7 +216,7 @@
                 qnames = []
                 for itm in items:
                     name = itm.fileName()
-                    if name.endswith('.qm'):
+                    if name.endswith(".qm"):
                         qnames.append(name)
                     else:
                         names.append(name)
@@ -214,10 +229,10 @@
                     name = itm.dirName()
                 names.append(name)
             qnames = []
-        
+
         if not len(names + qnames):
             return
-        
+
         if len(names + qnames) == 1:
             if names:
                 self.vcs.vcsAdd(names[0], os.path.isdir(names[0]))
@@ -235,11 +250,11 @@
                     self.vcs.vcsAddBinary(qnames)
         for fn in names + qnames:
             self._updateVCSStatus(fn)
-        
+
     def _VCSAddTree(self):
         """
         Protected slot called by the context menu.
-        
+
         It is used to add the selected
         directory tree to the VCS repository.
         """
@@ -253,57 +268,57 @@
         self.vcs.vcsAddTree(names)
         for fn in names:
             self._updateVCSStatus(fn)
-        
+
     def _VCSRemove(self):
         """
         Protected slot called by the context menu to remove the selected file
         from the VCS repository.
         """
         if self.isTranslationsBrowser:
-            items = self.browser.getSelectedItems(
-                [ProjectBrowserSimpleDirectoryItem])
+            items = self.browser.getSelectedItems([ProjectBrowserSimpleDirectoryItem])
             if items:
-                return      # not supported
-            
+                return  # not supported
+
             isRemoveDirs = False
             items = self.browser.getSelectedItems([ProjectBrowserFileItem])
             names = [itm.fileName() for itm in items]
-            
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 QCoreApplication.translate(
-                    "VcsProjectBrowserHelper",
-                    "Remove from repository (and disk)"),
+                    "VcsProjectBrowserHelper", "Remove from repository (and disk)"
+                ),
                 QCoreApplication.translate(
                     "VcsProjectBrowserHelper",
                     "Do you really want to remove these translation files from"
-                    " the repository (and disk)?"),
-                names)
+                    " the repository (and disk)?",
+                ),
+                names,
+            )
         else:
             items = self.browser.getSelectedItems()
-            isRemoveDirs = (
-                len(items) == self.browser.getSelectedItemsCount(
-                    [ProjectBrowserSimpleDirectoryItem,
-                     ProjectBrowserDirectoryItem])
+            isRemoveDirs = len(items) == self.browser.getSelectedItemsCount(
+                [ProjectBrowserSimpleDirectoryItem, ProjectBrowserDirectoryItem]
             )
             if isRemoveDirs:
                 names = [itm.dirName() for itm in items]
             else:
                 names = [itm.fileName() for itm in items]
-            files = [self.browser.project.getRelativePath(name)
-                     for name in names]
-            
+            files = [self.browser.project.getRelativePath(name) for name in names]
+
             dlg = DeleteFilesConfirmationDialog(
                 self.parent(),
                 QCoreApplication.translate(
-                    "VcsProjectBrowserHelper",
-                    "Remove from repository (and disk)"),
+                    "VcsProjectBrowserHelper", "Remove from repository (and disk)"
+                ),
                 QCoreApplication.translate(
                     "VcsProjectBrowserHelper",
                     "Do you really want to remove these files/directories"
-                    " from the repository (and disk)?"),
-                files)
-        
+                    " from the repository (and disk)?",
+                ),
+                files,
+            )
+
         if dlg.exec() == QDialog.DialogCode.Accepted:
             status = self.vcs.vcsRemove(names)
             if status:
@@ -312,7 +327,7 @@
                     # remove directories from Project
                 else:
                     self.browser._removeFile()  # remove file(s) from project
-        
+
     def _VCSLogBrowser(self):
         """
         Protected slot called by the context menu to show the log browser for a
@@ -326,7 +341,7 @@
             fn = itm.dirName()
             isFile = False
         self.vcs.vcsLogBrowser(fn, isFile=isFile)
-        
+
     def _VCSDiff(self):
         """
         Protected slot called by the context menu to show the difference of a
@@ -340,14 +355,13 @@
                 name = itm.dirName()
             names.append(name)
         self.vcs.vcsDiff(names)
-        
+
     def _VCSStatus(self):
         """
         Protected slot called by the context menu to show the status of a file.
         """
         if self.isTranslationsBrowser:
-            items = self.browser.getSelectedItems(
-                [ProjectBrowserSimpleDirectoryItem])
+            items = self.browser.getSelectedItems([ProjectBrowserSimpleDirectoryItem])
             if items:
                 names = [itm.dirName() for itm in items]
             else:
@@ -388,12 +402,13 @@
         except AttributeError:
             name = itm.dirName()
         self.vcs.vcsMerge(name)
-    
+
     def _VCSInfoDisplay(self):
         """
         Protected slot called to show some vcs information.
         """
         from .RepositoryInfoDialog import VcsRepositoryInfoDialog
+
         info = self.vcs.vcsRepositoryInfos(self.project.ppath)
         dlg = VcsRepositoryInfoDialog(None, info)
         dlg.exec()
@@ -401,7 +416,7 @@
     def _updateVCSStatus(self, name):
         """
         Protected method to update the VCS status of an item.
-        
+
         @param name filename or directoryname of the item to be updated
             (string)
         """
--- a/src/eric7/VCS/ProjectHelper.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/ProjectHelper.py	Wed Jul 13 14:55:47 2022 +0200
@@ -28,10 +28,11 @@
     """
     Class implementing the base class of the VCS project helper.
     """
+
     def __init__(self, vcsObject, projectObject, parent=None, name=None):
         """
         Constructor
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         @param parent parent widget (QWidget)
@@ -40,97 +41,114 @@
         super().__init__(parent)
         if name:
             self.setObjectName(name)
-        
+
         self.vcs = vcsObject
         self.project = projectObject
-        
+
         self.actions = []
-        
+
         self.vcsAddAct = None
-        
+
         self.initActions()
-        
+
     def setObjects(self, vcsObject, projectObject):
         """
         Public method to set references to the vcs and project objects.
-        
+
         @param vcsObject reference to the vcs object
         @param projectObject reference to the project object
         """
         self.vcs = vcsObject
         self.project = projectObject
-    
+
     def initActions(self):
         """
         Public method to generate the action objects.
         """
         self.vcsNewAct = EricAction(
-            QCoreApplication.translate(
-                "VcsProjectHelper", 'New from repository'),
+            QCoreApplication.translate("VcsProjectHelper", "New from repository"),
             UI.PixmapCache.getIcon("vcsCheckout"),
+            QCoreApplication.translate("VcsProjectHelper", "&New from repository..."),
+            0,
+            0,
+            self,
+            "vcs_new",
+        )
+        self.vcsNewAct.setStatusTip(
             QCoreApplication.translate(
-                "VcsProjectHelper", '&New from repository...'),
-            0, 0, self, 'vcs_new')
-        self.vcsNewAct.setStatusTip(QCoreApplication.translate(
-            "VcsProjectHelper",
-            'Create a new project from the VCS repository'
-        ))
-        self.vcsNewAct.setWhatsThis(QCoreApplication.translate(
-            "VcsProjectHelper",
-            """<b>New from repository</b>"""
-            """<p>This creates a new local project from the VCS"""
-            """ repository.</p>"""
-        ))
+                "VcsProjectHelper", "Create a new project from the VCS repository"
+            )
+        )
+        self.vcsNewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "VcsProjectHelper",
+                """<b>New from repository</b>"""
+                """<p>This creates a new local project from the VCS"""
+                """ repository.</p>""",
+            )
+        )
         self.vcsNewAct.triggered.connect(self._vcsCheckout)
         self.actions.append(self.vcsNewAct)
-        
+
         self.vcsExportAct = EricAction(
-            QCoreApplication.translate(
-                "VcsProjectHelper", 'Export from repository'),
+            QCoreApplication.translate("VcsProjectHelper", "Export from repository"),
             UI.PixmapCache.getIcon("vcsExport"),
             QCoreApplication.translate(
-                "VcsProjectHelper", '&Export from repository...'),
-            0, 0, self, 'vcs_export')
-        self.vcsExportAct.setStatusTip(QCoreApplication.translate(
-            "VcsProjectHelper",
-            'Export a project from the repository'
-        ))
-        self.vcsExportAct.setWhatsThis(QCoreApplication.translate(
-            "VcsProjectHelper",
-            """<b>Export from repository</b>"""
-            """<p>This exports a project from the repository.</p>"""
-        ))
+                "VcsProjectHelper", "&Export from repository..."
+            ),
+            0,
+            0,
+            self,
+            "vcs_export",
+        )
+        self.vcsExportAct.setStatusTip(
+            QCoreApplication.translate(
+                "VcsProjectHelper", "Export a project from the repository"
+            )
+        )
+        self.vcsExportAct.setWhatsThis(
+            QCoreApplication.translate(
+                "VcsProjectHelper",
+                """<b>Export from repository</b>"""
+                """<p>This exports a project from the repository.</p>""",
+            )
+        )
         self.vcsExportAct.triggered.connect(self._vcsExport)
         self.actions.append(self.vcsExportAct)
-        
+
         self.vcsAddAct = EricAction(
-            QCoreApplication.translate(
-                "VcsProjectHelper", 'Add to repository'),
+            QCoreApplication.translate("VcsProjectHelper", "Add to repository"),
             UI.PixmapCache.getIcon("vcsCommit"),
+            QCoreApplication.translate("VcsProjectHelper", "&Add to repository..."),
+            0,
+            0,
+            self,
+            "vcs_add",
+        )
+        self.vcsAddAct.setStatusTip(
             QCoreApplication.translate(
-                "VcsProjectHelper", '&Add to repository...'),
-            0, 0, self, 'vcs_add')
-        self.vcsAddAct.setStatusTip(QCoreApplication.translate(
-            "VcsProjectHelper",
-            'Add the local project to the VCS repository'
-        ))
-        self.vcsAddAct.setWhatsThis(QCoreApplication.translate(
-            "VcsProjectHelper",
-            """<b>Add to repository</b>"""
-            """<p>This adds (imports) the local project to the VCS"""
-            """ repository.</p>"""
-        ))
+                "VcsProjectHelper", "Add the local project to the VCS repository"
+            )
+        )
+        self.vcsAddAct.setWhatsThis(
+            QCoreApplication.translate(
+                "VcsProjectHelper",
+                """<b>Add to repository</b>"""
+                """<p>This adds (imports) the local project to the VCS"""
+                """ repository.</p>""",
+            )
+        )
         self.vcsAddAct.triggered.connect(self._vcsImport)
         self.actions.append(self.vcsAddAct)
-    
+
     def initMenu(self, menu):
         """
         Public method to generate the VCS menu.
-        
+
         @param menu reference to the menu to be populated (QMenu)
         """
         menu.clear()
-        
+
         menu.addAction(self.vcsNewAct)
         menu.addAction(self.vcsExportAct)
         menu.addSeparator()
@@ -140,62 +158,64 @@
     def initToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the toolbar generated (QToolBar)
         """
-        return None     # __IGNORE_WARNING_M831__
-    
+        return None  # __IGNORE_WARNING_M831__
+
     def initBasicToolbar(self, ui, toolbarManager):
         """
         Public slot to initialize the basic VCS toolbar.
-        
+
         @param ui reference to the main window (UserInterface)
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the toolbar generated (QToolBar)
         """
-        tb = QToolBar(QCoreApplication.translate("VcsProjectHelper", "VCS"),
-                      ui)
+        tb = QToolBar(QCoreApplication.translate("VcsProjectHelper", "VCS"), ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("VersionControlToolbar")
-        tb.setToolTip(QCoreApplication.translate("VcsProjectHelper", 'VCS'))
-        
+        tb.setToolTip(QCoreApplication.translate("VcsProjectHelper", "VCS"))
+
         tb.addAction(self.vcsNewAct)
         tb.addAction(self.vcsExportAct)
         tb.addSeparator()
         tb.addAction(self.vcsAddAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
-        
+
         return tb
-    
+
     def showMenu(self):
         """
         Public slot called before the vcs menu is shown.
         """
         if self.vcsAddAct:
             self.vcsAddAct.setEnabled(self.project and self.project.isOpen())
-    
+
     @pyqtSlot()
     def _vcsCheckout(self, export=False):
         """
         Protected slot used to create a local project from the repository.
-        
+
         @param export flag indicating whether an export or a checkout
                 should be performed
         """
         if not self.project or not self.project.checkDirty():
             return
-        
-        vcsSystemsDict = ericApp().getObject(
-            "PluginManager").getPluginDisplayStrings("version_control")
+
+        vcsSystemsDict = (
+            ericApp()
+            .getObject("PluginManager")
+            .getPluginDisplayStrings("version_control")
+        )
         if not vcsSystemsDict:
             # no version control system found
             return
-        
+
         vcsSystemsDisplay = []
         keys = sorted(vcsSystemsDict.keys())
         for key in keys:
@@ -204,22 +224,24 @@
             None,
             QCoreApplication.translate("VcsProjectHelper", "New Project"),
             QCoreApplication.translate(
-                "VcsProjectHelper",
-                "Select version control system for the project"),
+                "VcsProjectHelper", "Select version control system for the project"
+            ),
             vcsSystemsDisplay,
-            0, False)
+            0,
+            False,
+        )
         if not ok:
             return
-        
+
         selectedVcsSystem = None
         for vcsSystem, vcsSystemDisplay in list(vcsSystemsDict.items()):
             if vcsSystemDisplay == vcsSelected:
                 selectedVcsSystem = vcsSystem
                 break
-        
+
         if not self.project.closeProject():
             return
-        
+
         vcs = self.project.initVCS(selectedVcsSystem)
         if vcs is not None:
             vcsdlg = vcs.vcsNewProjectOptionsDialog()
@@ -229,20 +251,22 @@
                 if vcs.vcsSupportCommandOptions():
                     vcores = EricMessageBox.yesNo(
                         self.parent(),
-                        QCoreApplication.translate(
-                            "VcsProjectHelper", "New Project"),
+                        QCoreApplication.translate("VcsProjectHelper", "New Project"),
                         QCoreApplication.translate(
                             "VcsProjectHelper",
                             """Would you like to edit the VCS command"""
-                            """ options?"""))
+                            """ options?""",
+                        ),
+                    )
                 else:
                     vcores = False
                 if vcores:
                     from .CommandOptionsDialog import VcsCommandOptionsDialog
+
                     codlg = VcsCommandOptionsDialog(vcs)
                     if codlg.exec() == QDialog.DialogCode.Accepted:
                         vcs.vcsSetOptions(codlg.getOptions())
-                
+
                 # create the project directory if it doesn't exist already
                 if not os.path.isdir(projectdir):
                     try:
@@ -251,15 +275,17 @@
                         EricMessageBox.critical(
                             self.parent(),
                             QCoreApplication.translate(
-                                "VcsProjectHelper",
-                                "Create project directory"),
+                                "VcsProjectHelper", "Create project directory"
+                            ),
                             QCoreApplication.translate(
                                 "VcsProjectHelper",
                                 "<p>The project directory <b>{0}</b> could not"
-                                " be created.</p>").format(projectdir))
+                                " be created.</p>",
+                            ).format(projectdir),
+                        )
                         self.project.resetVCS()
                         return
-                
+
                 # create the project from the VCS
                 vcs.vcsSetDataFromDict(vcsDataDict)
                 if export:
@@ -282,17 +308,19 @@
                             pfilename, ok = QInputDialog.getItem(
                                 None,
                                 QCoreApplication.translate(
-                                    "VcsProjectHelper",
-                                    "New project from repository"),
+                                    "VcsProjectHelper", "New project from repository"
+                                ),
                                 QCoreApplication.translate(
-                                    "VcsProjectHelper",
-                                    "Select a project file to open."),
-                                pfilenamelist, 0, False)
+                                    "VcsProjectHelper", "Select a project file to open."
+                                ),
+                                pfilenamelist,
+                                0,
+                                False,
+                            )
                             if ok:
-                                self.project.openProject(
-                                    str(dpath / pfilename))
+                                self.project.openProject(str(dpath / pfilename))
                         if export:
-                            self.project.pdata["VCS"] = 'None'
+                            self.project.pdata["VCS"] = "None"
                             self.project.vcs = self.project.initVCS()
                             self.project.setDirty(True)
                             self.project.saveProject()
@@ -300,21 +328,22 @@
                         res = EricMessageBox.yesNo(
                             self.parent(),
                             QCoreApplication.translate(
-                                "VcsProjectHelper",
-                                "New project from repository"),
+                                "VcsProjectHelper", "New project from repository"
+                            ),
                             QCoreApplication.translate(
                                 "VcsProjectHelper",
                                 "The project retrieved from the repository"
                                 " does not contain an eric project file"
-                                " (*.epj). Create it?"),
-                            yesDefault=True)
+                                " (*.epj). Create it?",
+                            ),
+                            yesDefault=True,
+                        )
                         if res:
                             self.project.ppath = projectdir
                             self.project.opened = True
-                            
-                            from Project.PropertiesDialog import (
-                                PropertiesDialog
-                            )
+
+                            from Project.PropertiesDialog import PropertiesDialog
+
                             dlg = PropertiesDialog(self.project, False)
                             if dlg.exec() == QDialog.DialogCode.Accepted:
                                 dlg.storeData()
@@ -324,7 +353,8 @@
                                 if self.project.pdata["MAINSCRIPT"]:
                                     ms = os.path.join(
                                         self.project.ppath,
-                                        self.project.pdata["MAINSCRIPT"])
+                                        self.project.pdata["MAINSCRIPT"],
+                                    )
                                     if os.path.exists(ms):
                                         self.project.appendFile(ms)
                                 else:
@@ -338,24 +368,29 @@
                                         self.parent(),
                                         QCoreApplication.translate(
                                             "VcsProjectHelper",
-                                            "New project from repository"),
+                                            "New project from repository",
+                                        ),
                                         QCoreApplication.translate(
                                             "VcsProjectHelper",
                                             "Shall the project file be added"
-                                            " to the repository?"),
-                                        yesDefault=True)
+                                            " to the repository?",
+                                        ),
+                                        yesDefault=True,
+                                    )
                                     if res:
-                                        self.project.vcs.vcsAdd(
-                                            self.project.pfile)
+                                        self.project.vcs.vcsAdd(self.project.pfile)
                 else:
                     EricMessageBox.critical(
                         self.parent(),
                         QCoreApplication.translate(
-                            "VcsProjectHelper", "New project from repository"),
+                            "VcsProjectHelper", "New project from repository"
+                        ),
                         QCoreApplication.translate(
                             "VcsProjectHelper",
                             """The project could not be retrieved from"""
-                            """ the repository."""))
+                            """ the repository.""",
+                        ),
+                    )
                     self.project.resetVCS()
 
     def _vcsExport(self):
@@ -367,12 +402,13 @@
     def _vcsImport(self):
         """
         Protected slot used to import the local project into the repository.
-        
+
         <b>NOTE</b>:
             This does not necessarily make the local project a vcs controlled
             project. You may have to checkout the project from the repository
             in order to accomplish that.
         """
+
         def revertChanges():
             """
             Local function to revert the changes made to the project object.
@@ -386,18 +422,21 @@
             self.initMenu(self.project.vcsMenu)
             self.project.setDirty(True)
             self.project.saveProject()
-        
+
         pdata_vcs = self.project.pdata["VCS"]
         pdata_vcsoptions = copy.deepcopy(self.project.pdata["VCSOPTIONS"])
         pdata_vcsother = copy.deepcopy(self.project.pdata["VCSOTHERDATA"])
         vcs = self.project.vcs
         vcsHelper = self.project.vcsProjectHelper
-        vcsSystemsDict = ericApp().getObject(
-            "PluginManager").getPluginDisplayStrings("version_control")
+        vcsSystemsDict = (
+            ericApp()
+            .getObject("PluginManager")
+            .getPluginDisplayStrings("version_control")
+        )
         if not vcsSystemsDict:
             # no version control system found
             return
-        
+
         vcsSystemsDisplay = []
         keys = sorted(vcsSystemsDict.keys())
         for key in keys:
@@ -406,25 +445,28 @@
             None,
             QCoreApplication.translate("VcsProjectHelper", "Import Project"),
             QCoreApplication.translate(
-                "VcsProjectHelper",
-                "Select version control system for the project"),
+                "VcsProjectHelper", "Select version control system for the project"
+            ),
             vcsSystemsDisplay,
-            0, False)
+            0,
+            False,
+        )
         if not ok:
             return
-        
+
         selectedVcsSystem = None
         for vcsSystem, vcsSystemDisplay in list(vcsSystemsDict.items()):
             if vcsSystemDisplay == vcsSelected:
                 selectedVcsSystem = vcsSystem
                 break
-        
+
         if selectedVcsSystem is not None:
             self.project.pdata["VCS"] = selectedVcsSystem
             self.project.vcs = self.project.initVCS(selectedVcsSystem)
             if self.project.vcs is not None:
                 vcsdlg = self.project.vcs.vcsOptionsDialog(
-                    self.project, self.project.name, 1)
+                    self.project, self.project.name, 1
+                )
                 if vcsdlg.exec() == QDialog.DialogCode.Accepted:
                     vcsDataDict = vcsdlg.getData()
                     # edit VCS command options
@@ -432,17 +474,19 @@
                         vcores = EricMessageBox.yesNo(
                             self.parent(),
                             QCoreApplication.translate(
-                                "VcsProjectHelper", "Import Project"),
+                                "VcsProjectHelper", "Import Project"
+                            ),
                             QCoreApplication.translate(
                                 "VcsProjectHelper",
                                 """Would you like to edit the VCS command"""
-                                """ options?"""))
+                                """ options?""",
+                            ),
+                        )
                     else:
                         vcores = False
                     if vcores:
-                        from .CommandOptionsDialog import (
-                            VcsCommandOptionsDialog
-                        )
+                        from .CommandOptionsDialog import VcsCommandOptionsDialog
+
                         codlg = VcsCommandOptionsDialog(self.project.vcs)
                         if codlg.exec() == QDialog.DialogCode.Accepted:
                             self.project.vcs.vcsSetOptions(codlg.getOptions())
@@ -450,7 +494,8 @@
                     self.project.vcs.vcsSetDataFromDict(vcsDataDict)
                     self.project.saveProject()
                     isVcsControlled = self.project.vcs.vcsImport(
-                        vcsDataDict, self.project.ppath)[0]
+                        vcsDataDict, self.project.ppath
+                    )[0]
                     if isVcsControlled:
                         # reopen the project
                         self.project.openProject(self.project.pfile)
@@ -469,19 +514,20 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         shouldReopen = self.vcs.vcsUpdate(self.project.ppath)
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 QCoreApplication.translate("VcsProjectHelper", "Update"),
                 QCoreApplication.translate(
-                    "VcsProjectHelper",
-                    """The project should be reread. Do this now?"""),
-                yesDefault=True)
+                    "VcsProjectHelper", """The project should be reread. Do this now?"""
+                ),
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-        
+
     def _vcsCommit(self):
         """
         Protected slot used to commit changes to the local project to the
@@ -490,33 +536,35 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         if Preferences.getVCS("AutoSaveProject"):
             self.project.saveProject()
         if Preferences.getVCS("AutoSaveFiles"):
             self.project.saveAllScripts()
-        self.vcs.vcsCommit(self.project.ppath, '')
-        
+        self.vcs.vcsCommit(self.project.ppath, "")
+
     def _vcsRemove(self):
         """
         Protected slot used to remove the local project from the repository.
-        
+
         Depending on the parameters set in the vcs object the project
         may be removed from the local disk as well.
         """
         if self.vcs is None:
             # just in case
             return
-        
+
         res = EricMessageBox.yesNo(
             self.parent(),
             QCoreApplication.translate(
-                "VcsProjectHelper",
-                "Remove project from repository"),
+                "VcsProjectHelper", "Remove project from repository"
+            ),
             QCoreApplication.translate(
                 "VcsProjectHelper",
                 "Dou you really want to remove this project from"
-                " the repository (and disk)?"))
+                " the repository (and disk)?",
+            ),
+        )
         if res:
             self.vcs.vcsRemove(self.project.ppath, True)
             self._vcsCommit()
@@ -525,7 +573,7 @@
                 self.setDirty(False)
                 self.project.closeProject()
                 shutil.rmtree(ppath, True)
-        
+
     def _vcsCommandOptions(self):
         """
         Protected slot to edit the VCS command options.
@@ -533,14 +581,15 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         if self.vcs.vcsSupportCommandOptions():
             from .CommandOptionsDialog import VcsCommandOptionsDialog
+
             codlg = VcsCommandOptionsDialog(self.vcs)
             if codlg.exec() == QDialog.DialogCode.Accepted:
                 self.vcs.vcsSetOptions(codlg.getOptions())
                 self.project.setDirty(True)
-        
+
     def _vcsLogBrowser(self):
         """
         Protected slot used to show the log of the local project with a
@@ -549,9 +598,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsLogBrowser(self.project.ppath)
-        
+
     def _vcsDiff(self):
         """
         Protected slot used to show the difference of the local project to
@@ -560,9 +609,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsDiff(self.project.ppath)
-        
+
     def _vcsStatus(self):
         """
         Protected slot used to show the status of the local project.
@@ -570,9 +619,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsStatus(self.project.ppath)
-        
+
     def _vcsTag(self):
         """
         Protected slot used to tag the local project in the repository.
@@ -580,9 +629,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsTag(self.project.ppath)
-        
+
     def _vcsRevert(self):
         """
         Protected slot used to revert changes made to the local project.
@@ -590,9 +639,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsRevert(self.project.ppath)
-        
+
     def _vcsSwitch(self):
         """
         Protected slot used to switch the local project to another tag/branch.
@@ -600,19 +649,20 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         shouldReopen = self.vcs.vcsSwitch(self.project.ppath)
         if shouldReopen:
             res = EricMessageBox.yesNo(
                 self.parent(),
                 QCoreApplication.translate("VcsProjectHelper", "Switch"),
                 QCoreApplication.translate(
-                    "VcsProjectHelper",
-                    """The project should be reread. Do this now?"""),
-                yesDefault=True)
+                    "VcsProjectHelper", """The project should be reread. Do this now?"""
+                ),
+                yesDefault=True,
+            )
             if res:
                 self.project.reopenProject()
-        
+
     def _vcsMerge(self):
         """
         Protected slot used to merge changes of a tag/revision into the local
@@ -621,9 +671,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsMerge(self.project.ppath)
-        
+
     def _vcsCleanup(self):
         """
         Protected slot used to cleanup the local project.
@@ -631,9 +681,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsCleanup(self.project.ppath)
-        
+
     def _vcsCommand(self):
         """
         Protected slot used to execute an arbitrary vcs command.
@@ -641,7 +691,7 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         self.vcs.vcsCommandLine(self.project.ppath)
 
     def _vcsInfoDisplay(self):
@@ -651,8 +701,9 @@
         if self.vcs is None:
             # just in case
             return
-        
+
         from .RepositoryInfoDialog import VcsRepositoryInfoDialog
+
         info = self.vcs.vcsRepositoryInfos(self.project.ppath)
         dlg = VcsRepositoryInfoDialog(None, info)
         dlg.exec()
--- a/src/eric7/VCS/RepositoryInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/RepositoryInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,10 +16,11 @@
     """
     Class implemting a dialog to show repository information.
     """
+
     def __init__(self, parent, info):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         @param info info data to show (string)
         """
--- a/src/eric7/VCS/StatusMonitorLed.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/StatusMonitorLed.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,19 +22,19 @@
     Class implementing a LED to indicate the status of the VCS status monitor
     thread.
     """
+
     def __init__(self, project, parent):
         """
         Constructor
-        
+
         @param project reference to the project object (Project.Project)
         @param parent reference to the parent object (QWidget)
         """
-        super().__init__(
-            parent, shape=EricLedType.RECTANGULAR, rectRatio=1.0)
-        
+        super().__init__(parent, shape=EricLedType.RECTANGULAR, rectRatio=1.0)
+
         self.__vcsClean = True
         self.project = project
-        
+
         self.vcsMonitorLedColors = {
             "off": QColor(Qt.GlobalColor.lightGray),
             "ok": QColor(Qt.GlobalColor.green),
@@ -42,88 +42,86 @@
             "op": QColor(Qt.GlobalColor.yellow),
             "send": QColor(Qt.GlobalColor.blue),
             "wait": QColor(Qt.GlobalColor.cyan),
-            "timeout": QColor(Qt.GlobalColor.darkRed)
+            "timeout": QColor(Qt.GlobalColor.darkRed),
         }
         self.__on = False
-        
-        self.setWhatsThis(self.tr(
-            """<p>This LED indicates the operating"""
-            """ status of the VCS monitor thread (off = monitoring off,"""
-            """ green = monitoring on and ok, red = monitoring on, but"""
-            """ not ok, yellow = checking VCS status). A status description"""
-            """ is given in the tooltip.</p>"""
-        ))
-        self.setToolTip(
-            self.tr("Repository status checking is switched off")
+
+        self.setWhatsThis(
+            self.tr(
+                """<p>This LED indicates the operating"""
+                """ status of the VCS monitor thread (off = monitoring off,"""
+                """ green = monitoring on and ok, red = monitoring on, but"""
+                """ not ok, yellow = checking VCS status). A status description"""
+                """ is given in the tooltip.</p>"""
+            )
         )
+        self.setToolTip(self.tr("Repository status checking is switched off"))
         self.setColor(self.vcsMonitorLedColors["off"])
-        
+
         # define a context menu
         self.__menu = QMenu(self)
         self.__checkAct = self.__menu.addAction(
-            self.tr("Check status"), self.__checkStatus)
+            self.tr("Check status"), self.__checkStatus
+        )
         self.__intervalAct = self.__menu.addAction(
-            self.tr("Set interval..."), self.__setInterval)
+            self.tr("Set interval..."), self.__setInterval
+        )
         self.__menu.addSeparator()
-        self.__onAct = self.__menu.addAction(
-            self.tr("Switch on"), self.__switchOn)
-        self.__offAct = self.__menu.addAction(
-            self.tr("Switch off"), self.__switchOff)
+        self.__onAct = self.__menu.addAction(self.tr("Switch on"), self.__switchOn)
+        self.__offAct = self.__menu.addAction(self.tr("Switch off"), self.__switchOff)
         self.__checkActions()
-        
+
         # connect signals to our slots
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self._showContextMenu)
-        self.project.vcsStatusMonitorStatus.connect(
-            self.__projectVcsMonitorStatus)
+        self.project.vcsStatusMonitorStatus.connect(self.__projectVcsMonitorStatus)
         self.project.getModel().vcsStateChanged.connect(self.__vcsStateChanged)
         self.clicked.connect(self.__ledClicked)
-    
+
     def __checkActions(self):
         """
         Private method to set the enabled status of the context menu actions.
         """
         vcsStatusMonitorInterval = (
             self.project.pudata["VCSSTATUSMONITORINTERVAL"]
-            if self.project.pudata["VCSSTATUSMONITORINTERVAL"] else
-            Preferences.getVCS("StatusMonitorInterval")
+            if self.project.pudata["VCSSTATUSMONITORINTERVAL"]
+            else Preferences.getVCS("StatusMonitorInterval")
         )
         self.__checkAct.setEnabled(self.__on)
         self.__intervalAct.setEnabled(self.__on)
-        self.__onAct.setEnabled(
-            (not self.__on) and vcsStatusMonitorInterval > 0)
+        self.__onAct.setEnabled((not self.__on) and vcsStatusMonitorInterval > 0)
         self.__offAct.setEnabled(self.__on)
-        
+
     def __projectVcsMonitorStatus(self, status, statusMsg):
         """
         Private method to receive the status monitor status.
-        
+
         @param status status of the monitoring thread (string, ok, nok or off)
         @param statusMsg explanotory text for the signaled status (string)
         """
         self.setColor(self.vcsMonitorLedColors[status])
         self.setToolTip(statusMsg)
-        
-        self.__on = status != 'off'
-    
+
+        self.__on = status != "off"
+
     def _showContextMenu(self, coord):
         """
         Protected slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         if not self.project.isOpen():
             return
-        
+
         self.__checkActions()
         self.__menu.popup(self.mapToGlobal(coord))
-    
+
     def __checkStatus(self):
         """
         Private slot to initiate a new status check.
         """
         self.project.checkVCSStatus()
-    
+
     def __setInterval(self):
         """
         Private slot to change the status check interval.
@@ -133,34 +131,37 @@
             self.tr("VCS Status Monitor"),
             self.tr("Enter monitor interval [s]"),
             self.project.getStatusMonitorInterval(),
-            0, 3600, 1)
+            0,
+            3600,
+            1,
+        )
         if ok:
             self.project.setStatusMonitorInterval(interval)
-    
+
     def __switchOn(self):
         """
         Private slot to switch the status monitor thread to On.
         """
         self.project.startStatusMonitor()
-    
+
     def __switchOff(self):
         """
         Private slot to switch the status monitor thread to Off.
         """
         self.project.stopStatusMonitor()
-    
+
     def __vcsStateChanged(self, state):
         """
         Private slot to handle a change in the vcs state.
-        
+
         @param state new vcs state (string)
         """
         self.__vcsClean = state == " "
-    
+
     def __ledClicked(self, pos):
         """
         Private slot to react upon clicks on the LED.
-        
+
         @param pos position of the click (QPoint)
         """
         if self.__on:
@@ -179,35 +180,35 @@
     Class implementing a widget containing a LED to indicate the status of the
     VCS status monitor thread and a short info message.
     """
+
     def __init__(self, project, parent):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project.Project
         @param parent reference to the parent object
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__layout = QHBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
-        
+
         self.__led = StatusMonitorLed(project, self)
         self.__infoLabel = QLabel(self)
-        
+
         self.__layout.addWidget(self.__led)
         self.__layout.addWidget(self.__infoLabel)
-        
+
         self.__projectVcsStatusMonitorInfo("")
-        
-        project.vcsStatusMonitorInfo.connect(
-            self.__projectVcsStatusMonitorInfo)
-    
+
+        project.vcsStatusMonitorInfo.connect(self.__projectVcsStatusMonitorInfo)
+
     def __projectVcsStatusMonitorInfo(self, info):
         """
         Private slot handling the receipt of an info message.
-        
+
         @param info received info message
         @type str
         """
--- a/src/eric7/VCS/StatusMonitorThread.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/StatusMonitorThread.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,15 +9,13 @@
 
 import contextlib
 
-from PyQt6.QtCore import (
-    QThread, QMutex, QWaitCondition, pyqtSignal, QCoreApplication
-)
+from PyQt6.QtCore import QThread, QMutex, QWaitCondition, pyqtSignal, QCoreApplication
 
 
 class VcsStatusMonitorThread(QThread):
     """
     Class implementing the VCS status monitor thread base class.
-    
+
     @signal vcsStatusMonitorData(list of str) emitted to update the VCS status
     @signal vcsStatusMonitorAllData(dict) emitted to signal all VCS status
         (key is project relative file name, value is status)
@@ -26,15 +24,16 @@
     @signal vcsStatusMonitorInfo(str) emitted to signal some info of the
         monitoring thread
     """
+
     vcsStatusMonitorData = pyqtSignal(list)
     vcsStatusMonitorAllData = pyqtSignal(dict)
     vcsStatusMonitorStatus = pyqtSignal(str, str)
     vcsStatusMonitorInfo = pyqtSignal(str)
-    
+
     def __init__(self, interval, project, vcs, parent=None):
         """
         Constructor
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object (Project)
         @param vcs reference to the version control object
@@ -42,24 +41,24 @@
         """
         super().__init__(parent)
         self.setObjectName("VcsStatusMonitorThread")
-        
+
         self.setTerminationEnabled(True)
-        
+
         self.projectDir = project.getProjectPath()
         self.project = project
         self.vcs = vcs
-        
+
         self.interval = interval
         self.autoUpdate = False
-        
+
         self.statusList = []
         self.reportedStates = {}
         self.shouldUpdate = False
-        
+
         self.monitorMutex = QMutex()
         self.monitorCondition = QWaitCondition()
         self.__stopIt = False
-    
+
     def run(self):
         """
         Public method implementing the tasks action.
@@ -68,8 +67,11 @@
             # perform the checking task
             self.statusList = []
             self.vcsStatusMonitorStatus.emit(
-                "wait", QCoreApplication.translate(
-                    "VcsStatusMonitorThread", "Waiting for lock"))
+                "wait",
+                QCoreApplication.translate(
+                    "VcsStatusMonitorThread", "Waiting for lock"
+                ),
+            )
             try:
                 locked = self.vcs.vcsExecutionMutex.tryLock(5000)
             except TypeError:
@@ -77,9 +79,11 @@
             if locked:
                 try:
                     self.vcsStatusMonitorStatus.emit(
-                        "op", QCoreApplication.translate(
-                            "VcsStatusMonitorThread",
-                            "Checking repository status"))
+                        "op",
+                        QCoreApplication.translate(
+                            "VcsStatusMonitorThread", "Checking repository status"
+                        ),
+                    )
                     res, statusMsg = self._performMonitor()
                     infoMsg = self._getInfo()
                 finally:
@@ -89,38 +93,42 @@
                 else:
                     status = "nok"
                 self.vcsStatusMonitorStatus.emit(
-                    "send", QCoreApplication.translate(
-                        "VcsStatusMonitorThread", "Sending data"))
+                    "send",
+                    QCoreApplication.translate(
+                        "VcsStatusMonitorThread", "Sending data"
+                    ),
+                )
                 self.vcsStatusMonitorData.emit(self.statusList)
                 self.vcsStatusMonitorAllData.emit(self.reportedStates)
                 self.vcsStatusMonitorStatus.emit(status, statusMsg)
                 self.vcsStatusMonitorInfo.emit(infoMsg)
             else:
                 self.vcsStatusMonitorStatus.emit(
-                    "timeout", QCoreApplication.translate(
-                        "VcsStatusMonitorThread",
-                        "Timed out waiting for lock"))
+                    "timeout",
+                    QCoreApplication.translate(
+                        "VcsStatusMonitorThread", "Timed out waiting for lock"
+                    ),
+                )
                 self.vcsStatusMonitorInfo.emit("")
-            
+
             if self.autoUpdate and self.shouldUpdate:
                 self.vcs.vcsUpdate(self.projectDir, True)
-                continue    # check again
+                continue  # check again
                 self.shouldUpdate = False
-            
+
             # wait until interval has expired checking for a stop condition
             self.monitorMutex.lock()
             if not self.__stopIt:
-                self.monitorCondition.wait(
-                    self.monitorMutex, self.interval * 1000)
+                self.monitorCondition.wait(self.monitorMutex, self.interval * 1000)
             self.monitorMutex.unlock()
-        
+
         self._shutdown()
         self.exit()
-    
+
     def setInterval(self, interval):
         """
         Public method to change the monitor interval.
-        
+
         @param interval new interval in seconds (integer)
         """
         locked = self.monitorMutex.tryLock()
@@ -128,31 +136,31 @@
         self.monitorCondition.wakeAll()
         if locked:
             self.monitorMutex.unlock()
-    
+
     def getInterval(self):
         """
         Public method to get the monitor interval.
-        
+
         @return interval in seconds (integer)
         """
         return self.interval
-    
+
     def setAutoUpdate(self, auto):
         """
         Public method to enable the auto update function.
-        
+
         @param auto status of the auto update function (boolean)
         """
         self.autoUpdate = auto
-    
+
     def getAutoUpdate(self):
         """
         Public method to retrieve the status of the auto update function.
-        
+
         @return status of the auto update function (boolean)
         """
         return self.autoUpdate
-    
+
     def checkStatus(self):
         """
         Public method to wake up the status monitor thread.
@@ -161,7 +169,7 @@
         self.monitorCondition.wakeAll()
         if locked:
             self.monitorMutex.unlock()
-    
+
     def stop(self):
         """
         Public method to stop the monitor thread.
@@ -175,7 +183,7 @@
     def clearCachedState(self, name):
         """
         Public method to clear the cached VCS state of a file/directory.
-        
+
         @param name name of the entry to be cleared (string)
         """
         key = self.project.getRelativePath(name)
@@ -185,7 +193,7 @@
     def _performMonitor(self):
         """
         Protected method implementing the real monitoring action.
-        
+
         This method must be overridden and populate the statusList member
         variable with a list of strings giving the status in the first column
         and the path relative to the project directory starting with the
@@ -201,32 +209,32 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @return tuple of flag indicating successful operation (boolean) and
             a status message in case of non successful operation (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return ()
-    
+
     def _getInfo(self):
         """
         Protected method implementing the real info action.
-        
+
         This method should be overridden and create a short info message to be
         shown in the main window status bar right next to the status indicator.
-        
+
         @return short info message
         @rtype str
         """
         return ""
-    
+
     def _shutdown(self):
         """
         Protected method performing shutdown actions.
-        
+
         The default implementation does nothing.
         """
         pass
--- a/src/eric7/VCS/StatusWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/StatusWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,9 +12,19 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QEvent
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QSizePolicy, QListView,
-    QListWidget, QListWidgetItem, QToolButton, QAbstractItemView, QMenu,
-    QGroupBox, QDialog
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLabel,
+    QSizePolicy,
+    QListView,
+    QListWidget,
+    QListWidgetItem,
+    QToolButton,
+    QAbstractItemView,
+    QMenu,
+    QGroupBox,
+    QDialog,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -31,12 +41,13 @@
     """
     Class implementing a VCS Status widget for the sidebar/toolbox.
     """
+
     StatusDataRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, project, viewmanager, parent=None):
         """
         Constructor
-        
+
         @param project reference to the project object
         @type Project
         @param viewmanager reference to the viewmanager object
@@ -46,62 +57,62 @@
         """
         super().__init__(parent)
         self.setObjectName("VcsStatusWidget")
-        
+
         self.__project = project
         self.__vm = viewmanager
-        
+
         self.__layout = QVBoxLayout()
         self.__layout.setObjectName("MainLayout")
         self.__layout.setContentsMargins(0, 3, 0, 0)
         self.__topLayout = QHBoxLayout()
         self.__topLayout.setObjectName("topLayout")
-        
+
         # Create the top area
         self.__infoLabel = QLabel(self)
         self.__infoLabel.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         self.__topLayout.addWidget(self.__infoLabel)
-        
+
         self.__commitToggleButton = QToolButton(self)
         self.__commitToggleButton.setIcon(UI.PixmapCache.getIcon("check"))
         self.__commitToggleButton.setToolTip(
-            self.tr("Press to toggle the commit markers"))
+            self.tr("Press to toggle the commit markers")
+        )
         self.__commitToggleButton.clicked.connect(self.__toggleCheckMark)
         self.__topLayout.addWidget(self.__commitToggleButton)
-        
+
         self.__commitButton = QToolButton(self)
         self.__commitButton.setIcon(UI.PixmapCache.getIcon("vcsCommit"))
         self.__commitButton.setToolTip(
-            self.tr("Press to commit the marked entries with options"))
+            self.tr("Press to commit the marked entries with options")
+        )
         self.__commitButton.clicked.connect(self.__commit)
         self.__topLayout.addWidget(self.__commitButton)
-        
+
         self.__addButton = QToolButton(self)
         self.__addButton.setIcon(UI.PixmapCache.getIcon("vcsAdd"))
         self.__addButton.setToolTip(
-            self.tr("Press to add the selected, untracked entries"))
+            self.tr("Press to add the selected, untracked entries")
+        )
         self.__addButton.clicked.connect(self.__addUntracked)
         self.__topLayout.addWidget(self.__addButton)
-        
+
         self.__reloadButton = QToolButton(self)
         self.__reloadButton.setIcon(UI.PixmapCache.getIcon("reload"))
-        self.__reloadButton.setToolTip(
-            self.tr("Press to reload the status list"))
+        self.__reloadButton.setToolTip(self.tr("Press to reload the status list"))
         self.__reloadButton.clicked.connect(self.__reload)
         self.__topLayout.addWidget(self.__reloadButton)
-        
+
         self.__actionsButton = QToolButton(self)
-        self.__actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
-        self.__actionsButton.setToolTip(
-            self.tr("Select action from menu"))
-        self.__actionsButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
+        self.__actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
+        self.__actionsButton.setToolTip(self.tr("Select action from menu"))
+        self.__actionsButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
         self.__topLayout.addWidget(self.__actionsButton)
-        
+
         self.__layout.addLayout(self.__topLayout)
         ###################################################################
-        
+
         # Create the middle part
         self.__statusList = QListWidget(self)
         self.__statusList.setAlternatingRowColors(True)
@@ -109,74 +120,72 @@
         self.__statusList.setViewMode(QListView.ViewMode.ListMode)
         self.__statusList.setTextElideMode(Qt.TextElideMode.ElideLeft)
         self.__statusList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
-        self.__statusList.itemSelectionChanged.connect(
-            self.__updateEnabledStates)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
+        self.__statusList.itemSelectionChanged.connect(self.__updateEnabledStates)
         self.__statusList.itemDoubleClicked.connect(self.__itemDoubleClicked)
         self.__statusList.itemChanged.connect(self.__updateEnabledStates)
         self.__layout.addWidget(self.__statusList)
         ###################################################################
-        
+
         # create the Quick Commit area
         self.__quickCommitGroup = QGroupBox(self.tr("Quick Commit"), self)
         self.__quickCommitLayout = QVBoxLayout()
         self.__quickCommitEdit = EricSpellCheckedTextEdit(self)
         self.__quickCommitEdit.setSizePolicy(
-            QSizePolicy.Policy.Expanding,
-            QSizePolicy.Policy.Preferred)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         self.__quickCommitEdit.setMaximumHeight(100)
         self.__quickCommitEdit.setTabChangesFocus(True)
         self.__quickCommitEdit.installEventFilter(self)
-        self.__quickCommitEdit.textChanged.connect(
-            self.__quickCommitEditTextChanged)
+        self.__quickCommitEdit.textChanged.connect(self.__quickCommitEditTextChanged)
         self.__quickCommitLayout.addWidget(self.__quickCommitEdit)
-        
+
         self.__quickCommitLayout2 = QHBoxLayout()
         self.__quickCommitLayout2.addStretch()
-        
+
         self.__quickCommitHistoryButton = QToolButton(self)
-        self.__quickCommitHistoryButton.setIcon(
-            UI.PixmapCache.getIcon("history"))
+        self.__quickCommitHistoryButton.setIcon(UI.PixmapCache.getIcon("history"))
         self.__quickCommitHistoryButton.setToolTip(
-            self.tr("Select commit message from previous commits"))
-        self.__quickCommitHistoryButton.clicked.connect(
-            self.__selectQuickCommitMessage)
+            self.tr("Select commit message from previous commits")
+        )
+        self.__quickCommitHistoryButton.clicked.connect(self.__selectQuickCommitMessage)
         self.__quickCommitLayout2.addWidget(self.__quickCommitHistoryButton)
-        
+
         self.__quickCommitHistoryClearButton = QToolButton(self)
         self.__quickCommitHistoryClearButton.setIcon(
-            UI.PixmapCache.getIcon("historyClear"))
+            UI.PixmapCache.getIcon("historyClear")
+        )
         self.__quickCommitHistoryClearButton.setToolTip(
-            self.tr("Clear the list of saved commit messages"))
-        self.__quickCommitHistoryClearButton.clicked.connect(
-            self.__clearCommitMessages)
-        self.__quickCommitLayout2.addWidget(
-            self.__quickCommitHistoryClearButton)
-        
+            self.tr("Clear the list of saved commit messages")
+        )
+        self.__quickCommitHistoryClearButton.clicked.connect(self.__clearCommitMessages)
+        self.__quickCommitLayout2.addWidget(self.__quickCommitHistoryClearButton)
+
         self.__quickCommitButton = QToolButton(self)
-        self.__quickCommitButton.setIcon(
-            UI.PixmapCache.getIcon("vcsCommit"))
+        self.__quickCommitButton.setIcon(UI.PixmapCache.getIcon("vcsCommit"))
         self.__quickCommitButton.setToolTip(
-            self.tr("Press to commit the marked entries"))
+            self.tr("Press to commit the marked entries")
+        )
         self.__quickCommitButton.clicked.connect(self.__quickCommit)
         self.__quickCommitLayout2.addWidget(self.__quickCommitButton)
-        
+
         self.__quickCommitLayout.addLayout(self.__quickCommitLayout2)
         self.__quickCommitGroup.setLayout(self.__quickCommitLayout)
         self.__layout.addWidget(self.__quickCommitGroup)
         ###################################################################
-        
+
         self.setLayout(self.__layout)
-        
+
         self.__statusIcons = {
-            "A": "vcs-added",    # added
-            "M": "vcs-modified",    # modified
-            "O": "vcs-removed",    # removed
-            "R": "vcs-renamed",    # renamed
-            "U": "vcs-update-required",    # update needed
-            "Z": "vcs-conflicting",    # conflict
-            "?": "vcs-untracked",    # not tracked
-            "!": "vcs-missing",    # missing
+            "A": "vcs-added",  # added
+            "M": "vcs-modified",  # modified
+            "O": "vcs-removed",  # removed
+            "R": "vcs-renamed",  # renamed
+            "U": "vcs-update-required",  # update needed
+            "Z": "vcs-conflicting",  # conflict
+            "?": "vcs-untracked",  # not tracked
+            "!": "vcs-missing",  # missing
         }
         self.__statusTexts = {
             "A": self.tr("added"),
@@ -188,27 +197,25 @@
             "?": self.tr("not tracked"),
             "!": self.tr("missing"),
         }
-        
+
         self.__initActionsMenu()
-        
+
         self.__reset()
-        
+
         if self.__project.isOpen():
             self.__projectOpened()
         else:
             self.__projectClosed()
-        
+
         self.__addedItemsText = []
-        
+
         self.__project.projectOpened.connect(self.__projectOpened)
         self.__project.projectClosed.connect(self.__projectClosed)
-        self.__project.projectPropertiesChanged.connect(
-            self.__setProjectSpellCheckData)
+        self.__project.projectPropertiesChanged.connect(self.__setProjectSpellCheckData)
         self.__project.vcsCommitted.connect(self.__committed)
         self.__project.vcsStatusMonitorInfo.connect(self.__setInfoText)
-        self.__project.vcsStatusMonitorAllData.connect(
-            self.__processStatusData)
-    
+        self.__project.vcsStatusMonitorAllData.connect(self.__processStatusData)
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -216,81 +223,95 @@
         self.__actionsMenu = QMenu()
         self.__actionsMenu.setToolTipsVisible(True)
         self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu)
-        
+
         self.__commitAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsCommit"),
-            self.tr("Commit"), self.__commit)
-        self.__commitAct.setToolTip(self.tr(
-            "Commit the marked entries with options"))
+            UI.PixmapCache.getIcon("vcsCommit"), self.tr("Commit"), self.__commit
+        )
+        self.__commitAct.setToolTip(self.tr("Commit the marked entries with options"))
         self.__commitSelectAct = self.__actionsMenu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll)
+            self.tr("Select all for commit"), self.__commitSelectAll
+        )
         self.__commitDeselectAct = self.__actionsMenu.addAction(
-            self.tr("Unselect all from commit"), self.__commitDeselectAll)
-        
+            self.tr("Unselect all from commit"), self.__commitDeselectAll
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__addAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsAdd"),
-            self.tr("Add"), self.__addUntracked)
-        self.__addAct.setToolTip(self.tr(
-            "Add the selected, untracked entries"))
+            UI.PixmapCache.getIcon("vcsAdd"), self.tr("Add"), self.__addUntracked
+        )
+        self.__addAct.setToolTip(self.tr("Add the selected, untracked entries"))
         self.__addAllAct = self.__actionsMenu.addAction(
-            self.tr("Add All"), self.__addAllUntracked)
-        self.__addAllAct.setToolTip(self.tr(
-            "Add all untracked entries"))
-        
+            self.tr("Add All"), self.__addAllUntracked
+        )
+        self.__addAllAct.setToolTip(self.tr("Add all untracked entries"))
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__diffAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsDiff"),
-            self.tr("Differences"), self.__diff)
-        self.__diffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry in a"
-            " separate dialog"))
+            UI.PixmapCache.getIcon("vcsDiff"), self.tr("Differences"), self.__diff
+        )
+        self.__diffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry in a" " separate dialog"
+            )
+        )
         self.__sbsDiffAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsSbsDiff"),
-            self.tr("Differences Side-By-Side"), self.__sbsDiff)
-        self.__sbsDiffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry side-by-side in"
-            " a separate dialog"))
+            self.tr("Differences Side-By-Side"),
+            self.__sbsDiff,
+        )
+        self.__sbsDiffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry side-by-side in"
+                " a separate dialog"
+            )
+        )
         self.__diffAllAct = self.__actionsMenu.addAction(
-            self.tr("All Differences"), self.__diffAll)
-        self.__diffAllAct.setToolTip(self.tr(
-            "Shows the differences of all entries in a separate dialog"))
-        
+            self.tr("All Differences"), self.__diffAll
+        )
+        self.__diffAllAct.setToolTip(
+            self.tr("Shows the differences of all entries in a separate dialog")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__revertAct = self.__actionsMenu.addAction(
-            UI.PixmapCache.getIcon("vcsRevert"),
-            self.tr("Revert"), self.__revert)
-        self.__revertAct.setToolTip(self.tr(
-            "Reverts the changes of the selected files"))
-        
+            UI.PixmapCache.getIcon("vcsRevert"), self.tr("Revert"), self.__revert
+        )
+        self.__revertAct.setToolTip(
+            self.tr("Reverts the changes of the selected files")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__forgetAct = self.__actionsMenu.addAction(
-            self.tr("Forget Missing"), self.__forgetMissing)
-        self.__forgetAct.setToolTip(self.tr(
-            "Forgets about the selected missing files"))
+            self.tr("Forget Missing"), self.__forgetMissing
+        )
+        self.__forgetAct.setToolTip(self.tr("Forgets about the selected missing files"))
         self.__restoreAct = self.__actionsMenu.addAction(
-            self.tr("Restore Missing"), self.__restoreMissing)
-        self.__restoreAct.setToolTip(self.tr(
-            "Restores the selected missing files"))
+            self.tr("Restore Missing"), self.__restoreMissing
+        )
+        self.__restoreAct.setToolTip(self.tr("Restores the selected missing files"))
         self.__actionsMenu.addSeparator()
-        
+
         self.__editAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("open"),
-            self.tr("Edit Conflict"), self.__editConflict)
-        self.__editAct.setToolTip(self.tr(
-            "Edit the selected conflicting file"))
+            self.tr("Edit Conflict"),
+            self.__editConflict,
+        )
+        self.__editAct.setToolTip(self.tr("Edit the selected conflicting file"))
         self.__resolvedAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsResolved"),
-            self.tr("Conflict Resolved"), self.__conflictResolved)
-        self.__resolvedAct.setToolTip(self.tr(
-            "Mark the selected conflicting file as resolved"))
-        
+            self.tr("Conflict Resolved"),
+            self.__conflictResolved,
+        )
+        self.__resolvedAct.setToolTip(
+            self.tr("Mark the selected conflicting file as resolved")
+        )
+
         self.__actionsButton.setMenu(self.__actionsMenu)
-    
+
     @pyqtSlot()
     def __projectOpened(self):
         """
@@ -298,7 +319,7 @@
         """
         self.__reloadButton.setEnabled(True)
         self.__setProjectSpellCheckData()
-    
+
     @pyqtSlot()
     def __setProjectSpellCheckData(self):
         """
@@ -307,50 +328,49 @@
         """
         pwl, pel = self.__project.getProjectDictionaries()
         language = self.__project.getProjectSpellLanguage()
-        self.__quickCommitEdit.setLanguageWithPWL(
-            language, pwl or None, pel or None)
-    
+        self.__quickCommitEdit.setLanguageWithPWL(language, pwl or None, pel or None)
+
     @pyqtSlot()
     def __projectClosed(self):
         """
         Private slot to handle the closing of a project.
         """
         self.__infoLabel.setText(self.tr("No project open."))
-        
+
         self.__reloadButton.setEnabled(False)
-        
+
         self.__reset()
-    
+
     @pyqtSlot(str)
     def __setInfoText(self, info):
         """
         Private slot to set the info label text.
-        
+
         @param info text to be shown
         @type str
         """
         self.__infoLabel.setText(info)
-    
+
     @pyqtSlot()
     def __reload(self):
         """
         Private slot to reload the status list.
         """
         self.__project.checkVCSStatus()
-    
+
     def __reset(self):
         """
         Private method to reset the widget to default.
         """
         self.__statusList.clear()
-        
+
         self.__commitToggleButton.setEnabled(False)
         self.__commitButton.setEnabled(False)
         self.__addButton.setEnabled(False)
-        
+
         self.__quickCommitEdit.clear()
         self.__quickCommitGroup.setEnabled(False)
-    
+
     def __updateEnabledStates(self):
         """
         Private method to set the enabled states depending on the list state.
@@ -358,18 +378,18 @@
         modified = len(self.__getModifiedItems())
         unversioned = len(self.__getSelectedUnversionedItems())
         commitable = len(self.__getCommitableItems())
-        
+
         self.__commitToggleButton.setEnabled(modified)
         self.__commitButton.setEnabled(commitable)
         self.__addButton.setEnabled(unversioned)
-        
+
         self.__quickCommitGroup.setEnabled(commitable)
-    
+
     @pyqtSlot(dict)
     def __processStatusData(self, data):
         """
         Private slot to process the status data emitted by the project.
-        
+
         Each entry of the status data consists of a status flag and and the
         path relative to the project directory starting with the third column.
         The known status flags are:
@@ -384,50 +404,48 @@
             <li>"!" path is missing</li>
             <li>" " path is back at normal</li>
         </ul>
-        
+
         @param data dictionary containing the status data
         @type dict
         """
         # step 1: remember all currently checked entries
         checkedEntries = [itm.text() for itm in self.__getCommitableItems()]
-        selectedEntries = [itm.text()
-                           for itm in self.__statusList.selectedItems()]
-        knownEntries = [self.__statusList.item(row).text()
-                        for row in range(self.__statusList.count())]
-        
+        selectedEntries = [itm.text() for itm in self.__statusList.selectedItems()]
+        knownEntries = [
+            self.__statusList.item(row).text()
+            for row in range(self.__statusList.count())
+        ]
+
         # step 2: clear the list and re-populate it with new data
         self.__statusList.clear()
-        
+
         block = self.__statusList.blockSignals(True)
         for name, status in data.items():
             if status:
                 itm = QListWidgetItem(name, self.__statusList)
                 with contextlib.suppress(KeyError):
                     itm.setToolTip(self.__statusTexts[status])
-                    itm.setIcon(UI.PixmapCache.getIcon(
-                        self.__statusIcons[status]))
+                    itm.setIcon(UI.PixmapCache.getIcon(self.__statusIcons[status]))
                 itm.setData(self.StatusDataRole, status)
                 if status in "AMOR":
-                    itm.setFlags(
-                        itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
+                    itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
                     if (
-                        name in checkedEntries or
-                        name not in knownEntries or
-                        name in self.__addedItemsText
+                        name in checkedEntries
+                        or name not in knownEntries
+                        or name in self.__addedItemsText
                     ):
                         itm.setCheckState(Qt.CheckState.Checked)
                     else:
                         itm.setCheckState(Qt.CheckState.Unchecked)
                 else:
-                    itm.setFlags(
-                        itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
+                    itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable)
                 itm.setSelected(name in selectedEntries)
-        
+
         self.__statusList.sortItems(Qt.SortOrder.AscendingOrder)
         self.__statusList.blockSignals(block)
-        
+
         self.__updateEnabledStates()
-    
+
     @pyqtSlot()
     def __toggleCheckMark(self):
         """
@@ -435,38 +453,39 @@
         """
         itemList = (
             self.__statusList.selectedItems()
-            if len(self.__statusList.selectedItems()) else
-            [self.__statusList.item(row)
-             for row in range(self.__statusList.count())]
+            if len(self.__statusList.selectedItems())
+            else [
+                self.__statusList.item(row) for row in range(self.__statusList.count())
+            ]
         )
         for itm in itemList:
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if itm.checkState() == Qt.CheckState.Unchecked:
                     itm.setCheckState(Qt.CheckState.Checked)
                 else:
                     itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     def __setCheckMark(self, checked):
         """
         Private method to set or unset all check marks.
-        
+
         @param checked check mark state to be set
         @type bool
         """
         for row in range(self.__statusList.count()):
             itm = self.__statusList.item(row)
             if (
-                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                Qt.ItemFlag.ItemIsUserCheckable
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
             ):
                 if checked:
                     itm.setCheckState(Qt.CheckState.Checked)
                 else:
                     itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     @pyqtSlot()
     def __commit(self):
         """
@@ -474,105 +493,111 @@
         """
         projectPath = self.__project.getProjectPath()
         names = []
-        
+
         for row in range(self.__statusList.count()):
             itm = self.__statusList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
                 names.append(os.path.join(projectPath, itm.text()))
-        
+
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Commit"),
-                self.tr("""There are no entries selected to be"""
-                        """ committed."""))
+                self.tr("""There are no entries selected to be""" """ committed."""),
+            )
             return
-        
+
         if Preferences.getVCS("AutoSaveFiles"):
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
         vcs = self.__project.getVcs()
-        vcs and vcs.vcsCommit(names, '')
-    
+        vcs and vcs.vcsCommit(names, "")
+
     @pyqtSlot()
     def __committed(self):
         """
         Private slot called after the commit has been completed.
         """
         self.__reload()
-    
+
     @pyqtSlot()
     def __commitSelectAll(self):
         """
         Private slot to select all entries for commit.
         """
         self.__setCheckMark(True)
-    
+
     @pyqtSlot()
     def __commitDeselectAll(self):
         """
         Private slot to deselect all entries from commit.
         """
         self.__setCheckMark(False)
-    
+
     @pyqtSlot()
     def __addUntracked(self, allItems=False):
         """
         Private slot to add the selected untracked entries.
-        
+
         @param allItems flag indicating to show the differences of all files
             (defaults to False)
         @type bool (optional)
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [
-            os.path.join(projectPath, itm.text())
-            for itm in self.__getUnversionedItems()
-        ] if allItems else [
-            os.path.join(projectPath, itm.text())
-            for itm in self.__getSelectedUnversionedItems()
-        ]
-        
+
+        names = (
+            [
+                os.path.join(projectPath, itm.text())
+                for itm in self.__getUnversionedItems()
+            ]
+            if allItems
+            else [
+                os.path.join(projectPath, itm.text())
+                for itm in self.__getSelectedUnversionedItems()
+            ]
+        )
+
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Add"),
-                self.tr("""There are no unversioned entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no unversioned entries""" """ available/selected."""
+                ),
+            )
             return
-        
-        self.__addedItemsText = [
-            itm.text() for itm in self.__getUnversionedItems()
-        ] if allItems else [
-            itm.text() for itm in self.__getSelectedUnversionedItems()
-        ]
-        
+
+        self.__addedItemsText = (
+            [itm.text() for itm in self.__getUnversionedItems()]
+            if allItems
+            else [itm.text() for itm in self.__getSelectedUnversionedItems()]
+        )
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsAdd(names)
         self.__reload()
-    
+
     @pyqtSlot(QListWidgetItem)
     def __itemDoubleClicked(self, itm):
         """
         Private slot to handle double clicking an item.
-        
+
         @param itm reference to the double clicked item
         @type QListWidgetItem
         """
         projectPath = self.__project.getProjectPath()
-        
+
         if itm.data(self.StatusDataRole) in "MZ":
             # modified and conflicting items
             name = os.path.join(projectPath, itm.text())
             vcs = self.__project.getVcs()
             vcs and vcs.vcsDiff(name)
-    
+
     ###########################################################################
     ## Menu handling methods
     ###########################################################################
-    
+
     def __showActionsMenu(self):
         """
         Private slot to prepare the actions button menu before it is shown.
@@ -599,28 +624,26 @@
         self.__commitDeselectAct.setEnabled(commitable)
         self.__editAct.setEnabled(conflicting == 1)
         self.__resolvedAct.setEnabled(conflicting)
-    
+
     def __getCommitableItems(self):
         """
         Private method to retrieve all entries the user wants to commit.
-        
+
         @return list of all items, the user has checked
         @rtype list of QListWidgetItem
         """
         commitableItems = []
         for row in range(self.__statusList.count()):
             itm = self.__statusList.item(row)
-            if (
-                itm.checkState() == Qt.CheckState.Checked
-            ):
+            if itm.checkState() == Qt.CheckState.Checked:
                 commitableItems.append(itm)
         return commitableItems
-    
+
     def __getCommitableUnselectedItems(self):
         """
         Private method to retrieve all entries the user may commit but hasn't
         selected.
-        
+
         @return list of all items, the user has checked
         @rtype list of QListWidgetItem
         """
@@ -628,17 +651,16 @@
         for row in range(self.__statusList.count()):
             itm = self.__statusList.item(row)
             if (
-                (itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                 Qt.ItemFlag.ItemIsUserCheckable) and
-                itm.checkState() == Qt.CheckState.Unchecked
-            ):
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
+            ) and itm.checkState() == Qt.CheckState.Unchecked:
                 items.append(itm)
         return items
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         @rtype list of QListWidgetItem
         """
@@ -648,23 +670,26 @@
             if itm.data(self.StatusDataRole) in "AMOR":
                 items.append(itm)
         return items
-    
+
     def __getSelectedModifiedItems(self):
         """
         Private method to retrieve all selected entries, that have a modified
         status.
-        
+
         @return list of all selected entries with a modified status
         @rtype list of QListWidgetItem
         """
-        return [itm for itm in self.__statusList.selectedItems()
-                if itm.data(self.StatusDataRole) in "AMOR"]
-    
+        return [
+            itm
+            for itm in self.__statusList.selectedItems()
+            if itm.data(self.StatusDataRole) in "AMOR"
+        ]
+
     def __getUnversionedItems(self):
         """
         Private method to retrieve all entries, that have an unversioned
         status.
-        
+
         @return list of all items with an unversioned status
         @rtype list of QListWidgetItem
         """
@@ -674,209 +699,238 @@
             if itm.data(self.StatusDataRole) == "?":
                 items.append(itm)
         return items
-    
+
     def __getSelectedUnversionedItems(self):
         """
         Private method to retrieve all selected entries, that have an
         unversioned status.
-        
+
         @return list of all items with an unversioned status
         @rtype list of QListWidgetItem
         """
-        return [itm for itm in self.__statusList.selectedItems()
-                if itm.data(self.StatusDataRole) == "?"]
-    
+        return [
+            itm
+            for itm in self.__statusList.selectedItems()
+            if itm.data(self.StatusDataRole) == "?"
+        ]
+
     def __getMissingItems(self):
         """
         Private method to retrieve all entries, that have a missing status.
-        
+
         @return list of all items with a missing status
         @rtype list of QListWidgetItem
         """
-        return [itm for itm in self.__statusList.selectedItems()
-                if itm.data(self.StatusDataRole) == "!"]
-    
+        return [
+            itm
+            for itm in self.__statusList.selectedItems()
+            if itm.data(self.StatusDataRole) == "!"
+        ]
+
     def __getSelectedConflictingItems(self):
         """
         Private method to retrieve all selected entries, that have a conflict
         status.
-        
+
         @return list of all selected entries with a conflict status
         @rtype list of QListWidgetItem
         """
-        return [itm for itm in self.__statusList.selectedItems()
-                if itm.data(self.StatusDataRole) == "Z"]
-    
+        return [
+            itm
+            for itm in self.__statusList.selectedItems()
+            if itm.data(self.StatusDataRole) == "Z"
+        ]
+
     @pyqtSlot()
     def __addAllUntracked(self):
         """
         Private slot to handle the Add All action menu entry.
         """
         self.__addUntracked(allItems=True)
-    
+
     @pyqtSlot()
     def __diff(self, allItems=False):
         """
         Private slot to handle the Differences action menu entry.
-        
+
         @param allItems flag indicating to show the differences of all files
             (defaults to False)
         @type bool (optional)
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [
-            os.path.join(projectPath, itm.text())
-            for itm in self.__getModifiedItems()
-        ] if allItems else [
-            os.path.join(projectPath, itm.text())
-            for itm in self.__getSelectedModifiedItems()
-        ]
+
+        names = (
+            [os.path.join(projectPath, itm.text()) for itm in self.__getModifiedItems()]
+            if allItems
+            else [
+                os.path.join(projectPath, itm.text())
+                for itm in self.__getSelectedModifiedItems()
+            ]
+        )
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsDiff(names)
-    
+
     @pyqtSlot()
     def __diffAll(self):
         """
         Private slot to handle the All Differences action menu entry.
         """
         self.__diff(allItems=True)
-    
+
     @pyqtSlot()
     def __sbsDiff(self):
         """
         Private slot to handle the Side-By-Side Differences action menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [os.path.join(projectPath, itm.text())
-                 for itm in self.__getSelectedModifiedItems()]
+
+        names = [
+            os.path.join(projectPath, itm.text())
+            for itm in self.__getSelectedModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences Side-By-Side"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
         elif len(names) > 1:
             EricMessageBox.information(
                 self,
                 self.tr("Differences Side-By-Side"),
-                self.tr("""Only one file with uncommitted changes"""
-                        """ must be selected."""))
+                self.tr(
+                    """Only one file with uncommitted changes"""
+                    """ must be selected."""
+                ),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsSbsDiff(names[0])
-    
+
     @pyqtSlot()
     def __revert(self):
         """
         Private slot to handle the Revert action menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [os.path.join(projectPath, itm.text())
-                 for itm in self.__getSelectedModifiedItems()]
+
+        names = [
+            os.path.join(projectPath, itm.text())
+            for itm in self.__getSelectedModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Revert"),
-                self.tr("""There are no uncommitted changes"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no uncommitted changes""" """ available/selected."""
+                ),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsRevert(names)
         self.__reload()
-    
+
     @pyqtSlot()
     def __forgetMissing(self):
         """
         Private slot to handle the Forget action menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [os.path.join(projectPath, itm.text())
-                 for itm in self.__getMissingItems()]
+
+        names = [
+            os.path.join(projectPath, itm.text()) for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Forget Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsForget(names)
         self.__reload()
-    
+
     @pyqtSlot()
     def __restoreMissing(self):
         """
         Private slot to handle the Restore Missing context menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [os.path.join(projectPath, itm.text())
-                 for itm in self.__getMissingItems()]
+
+        names = [
+            os.path.join(projectPath, itm.text()) for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Restore Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsRevert(names)
         self.__reload()
-    
+
     @pyqtSlot()
     def __editConflict(self):
         """
         Private slot to handle the Edit Conflict action menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
+
         itm = self.__getSelectedConflictingItems()[0]
         filename = os.path.join(projectPath, itm.text())
         if Utilities.MimeTypes.isTextFile(filename):
             self.__vm.getEditor(filename)
-    
+
     @pyqtSlot()
     def __conflictResolved(self):
         """
         Private slot to handle the Conflict Resolved action menu entry.
         """
         projectPath = self.__project.getProjectPath()
-        
-        names = [os.path.join(projectPath, itm.text())
-                 for itm in self.__getSelectedConflictingItems()]
+
+        names = [
+            os.path.join(projectPath, itm.text())
+            for itm in self.__getSelectedConflictingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Conflict Resolved"),
-                self.tr("""There are no conflicting entries"""
-                        """ available/selected."""))
+                self.tr(
+                    """There are no conflicting entries""" """ available/selected."""
+                ),
+            )
             return
-        
+
         vcs = self.__project.getVcs()
         vcs and vcs.vcsResolved(names)
         self.__reload()
-    
+
     #######################################################################
     ## Quick Commit handling methods
     #######################################################################
-    
+
     @pyqtSlot()
     def __selectQuickCommitMessage(self):
         """
@@ -892,13 +946,13 @@
                 title=self.tr("Quick Commit"),
                 message=self.tr("Select your commit message:"),
                 doubleClickOk=True,
-                parent=self
+                parent=self,
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 selection = dlg.getSelection()
                 if selection:
                     self.__quickCommitEdit.setPlainText(selection[0])
-    
+
     @pyqtSlot()
     def __clearCommitMessages(self):
         """
@@ -906,7 +960,7 @@
         """
         vcs = self.__project.getVcs()
         vcs and vcs.vcsClearCommitMessages()
-    
+
     @pyqtSlot()
     def __quickCommit(self):
         """
@@ -915,44 +969,43 @@
         """
         projectPath = self.__project.getProjectPath()
         names = []
-        
+
         for row in range(self.__statusList.count()):
             itm = self.__statusList.item(row)
             if itm.checkState() == Qt.CheckState.Checked:
                 names.append(os.path.join(projectPath, itm.text()))
-        
+
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Commit"),
-                self.tr("""There are no entries selected to be"""
-                        """ committed."""))
+                self.tr("""There are no entries selected to be""" """ committed."""),
+            )
             return
-        
+
         if Preferences.getVCS("AutoSaveFiles"):
             vm = ericApp().getObject("ViewManager")
             for name in names:
                 vm.saveEditor(name)
-        
+
         commitMessage = self.__quickCommitEdit.toPlainText()
         vcs = self.__project.getVcs()
         if vcs:
             vcs.vcsCommit(names, commitMessage, noDialog=True)
             vcs.vcsAddCommitMessage(commitMessage)
             self.__quickCommitEdit.clear()
-    
+
     @pyqtSlot()
     def __quickCommitEditTextChanged(self):
         """
         Private slot to react upon changes of the quick commit text.
         """
-        self.__quickCommitButton.setEnabled(bool(
-            self.__quickCommitEdit.toPlainText()))
-    
+        self.__quickCommitButton.setEnabled(bool(self.__quickCommitEdit.toPlainText()))
+
     def eventFilter(self, obj, evt):
         """
         Public method to process some events for the Commit edit.
-        
+
         @param obj reference to the object the event was meant for
         @type QObject
         @param evt reference to the event object
@@ -961,10 +1014,10 @@
         @rtype bool
         """
         if (
-            obj is self.__quickCommitEdit and
-            evt.type() == QEvent.Type.KeyPress and
-            evt.key() in (Qt.Key.Key_Return, Qt.Key.Key_Enter) and
-            evt.modifiers() == Qt.KeyboardModifier.ControlModifier
+            obj is self.__quickCommitEdit
+            and evt.type() == QEvent.Type.KeyPress
+            and evt.key() in (Qt.Key.Key_Return, Qt.Key.Key_Enter)
+            and evt.modifiers() == Qt.KeyboardModifier.ControlModifier
         ):
             # Ctrl-Enter or Ctrl-Return => commit
             self.__quickCommitButton.animateClick()
--- a/src/eric7/VCS/VersionControl.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/VersionControl.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,14 @@
 import os
 
 from PyQt6.QtCore import (
-    QObject, QThread, QMutex, QProcess, Qt, pyqtSignal, QCoreApplication,
-    QLockFile
+    QObject,
+    QThread,
+    QMutex,
+    QProcess,
+    Qt,
+    pyqtSignal,
+    QCoreApplication,
+    QLockFile,
 )
 from PyQt6.QtWidgets import QApplication
 
@@ -28,10 +34,10 @@
     """
     Class implementing an abstract base class to be subclassed by all specific
     VCS interfaces.
-    
+
     It defines the vcs interface to be implemented by subclasses
     and the common methods.
-    
+
     @signal committed() emitted after the commit action has completed
     @signal vcsStatusMonitorData(list of str) emitted to update the VCS status
     @signal vcsStatusMonitorAllData(dict) emitted to signal all VCS status
@@ -43,23 +49,24 @@
     @signal vcsStatusChanged() emitted to indicate a change of the overall
         VCS status
     """
+
     committed = pyqtSignal()
     vcsStatusMonitorData = pyqtSignal(list)
     vcsStatusMonitorAllData = pyqtSignal(dict)
     vcsStatusMonitorStatus = pyqtSignal(str, str)
     vcsStatusMonitorInfo = pyqtSignal(str)
     vcsStatusChanged = pyqtSignal()
-    
+
     canBeCommitted = 1  # Indicates that a file/directory is in the vcs.
-    canBeAdded = 2      # Indicates that a file/directory is not in vcs.
-    
+    canBeAdded = 2  # Indicates that a file/directory is not in vcs.
+
     commitHistoryLock = "commitHistory.lock"
     commitHistoryData = "commitHistory.json"
-    
+
     def __init__(self, parent=None, name=None):
         """
         Constructor
-        
+
         @param parent parent widget (QWidget)
         @param name name of this object (string)
         """
@@ -67,68 +74,68 @@
         if name:
             self.setObjectName(name)
         self.defaultOptions = {
-            'global': [''],
-            'commit': [''],
-            'checkout': [''],
-            'update': [''],
-            'add': [''],
-            'remove': [''],
-            'diff': [''],
-            'log': [''],
-            'history': [''],
-            'status': [''],
-            'tag': [''],
-            'export': ['']
+            "global": [""],
+            "commit": [""],
+            "checkout": [""],
+            "update": [""],
+            "add": [""],
+            "remove": [""],
+            "diff": [""],
+            "log": [""],
+            "history": [""],
+            "status": [""],
+            "tag": [""],
+            "export": [""],
         }
         self.interestingDataKeys = []
         self.options = {}
         self.otherData = {}
         self.canDetectBinaries = True
-        
+
         self.statusMonitorThread = None
         self.vcsExecutionMutex = QMutex()
-        
+
     def vcsShutdown(self):
         """
         Public method used to shutdown the vcs interface.
-        
+
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsExists(self):
         """
         Public method used to test for the presence of the vcs.
-        
+
         @return tuple of flag indicating the existence and a string
             giving an error message in case of failure
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return (False, "")
-        
+
     def vcsInit(self, vcsDir, noDialog=False):
         """
         Public method used to initialize the vcs.
-        
+
         @param vcsDir name of the VCS directory (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return flag indicating success (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsConvertProject(self, vcsDataDict, project, addAll=True):
         """
         Public method to convert an uncontrolled project to a version
         controlled project.
-        
+
         @param vcsDataDict dictionary of data required for the conversion
         @type dict
         @param project reference to the project object
@@ -138,12 +145,12 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsImport(self, vcsDataDict, projectDir, noDialog=False, addAll=True):
         """
         Public method used to import the project into the vcs.
-        
+
         @param vcsDataDict dictionary of data required for the import
         @type dict
         @param projectDir project directory (string)
@@ -158,14 +165,14 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return (False, False)
-        
+
     def vcsCheckout(self, vcsDataDict, projectDir, noDialog=False):
         """
         Public method used to check the project out of the vcs.
-        
+
         @param vcsDataDict dictionary of data required for the checkout
         @param projectDir project directory to create (string)
         @param noDialog flag indicating quiet operations
@@ -173,29 +180,29 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsExport(self, vcsDataDict, projectDir):
         """
         Public method used to export a directory from the vcs.
-        
+
         @param vcsDataDict dictionary of data required for the export
         @param projectDir project directory to create (string)
         @return flag indicating an execution without errors (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsCommit(self, name, message, noDialog=False):
         """
         Public method used to make the change of a file/directory permanent in
         the vcs.
-        
+
         @param name file/directory name to be committed (string)
         @param message message for this operation (string)
         @param noDialog flag indicating quiet operations (boolean)
@@ -203,71 +210,68 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-    
+
     def vcsCommitMessages(self):
         """
         Public method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return []
-    
+
     def _vcsProjectCommitMessages(self):
         """
         Protected method to get the list of saved commit messages.
-        
+
         @return list of saved commit messages
         @rtype list of str
         """
         messages = []
         if Preferences.getVCS("PerProjectCommitHistory"):
-            projectMgmtDir = (
-                ericApp().getObject("Project").getProjectManagementDir()
-            )
+            projectMgmtDir = ericApp().getObject("Project").getProjectManagementDir()
             with contextlib.suppress(OSError, json.JSONDecodeError):
-                with open(os.path.join(projectMgmtDir,
-                                       VersionControl.commitHistoryData),
-                          "r") as f:
+                with open(
+                    os.path.join(projectMgmtDir, VersionControl.commitHistoryData), "r"
+                ) as f:
                     jsonString = f.read()
                 messages = json.loads(jsonString)
-        
+
         return messages
-    
+
     def vcsAddCommitMessage(self, message):
         """
         Public method to add a commit message to the list of saved messages.
-        
+
         @param message message to be added
         @type str
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def _vcsAddProjectCommitMessage(self, message):
         """
         Protected method to add a commit message to the list of project
         specific saved messages.
-        
+
         @param message message to be added
         @type str
         @return flag indicating success
         @rtype bool
         """
         if Preferences.getVCS("PerProjectCommitHistory"):
-            projectMgmtDir = (
-                ericApp().getObject("Project").getProjectManagementDir()
+            projectMgmtDir = ericApp().getObject("Project").getProjectManagementDir()
+            lockFile = QLockFile(
+                os.path.join(projectMgmtDir, VersionControl.commitHistoryLock)
             )
-            lockFile = QLockFile(
-                os.path.join(projectMgmtDir, VersionControl.commitHistoryLock))
             if lockFile.lock():
                 noMessages = Preferences.getVCS("CommitMessages")
                 messages = self.vcsCommitMessages()
@@ -275,56 +279,57 @@
                     messages.remove(message)
                 messages.insert(0, message)
                 del messages[noMessages:]
-                
+
                 with contextlib.suppress(TypeError, OSError):
                     jsonString = json.dumps(messages, indent=2)
-                    with open(os.path.join(projectMgmtDir,
-                                           VersionControl.commitHistoryData),
-                              "w") as f:
+                    with open(
+                        os.path.join(projectMgmtDir, VersionControl.commitHistoryData),
+                        "w",
+                    ) as f:
                         f.write(jsonString)
                 lockFile.unlock()
                 return True
-        
+
         return False
-    
+
     def vcsClearCommitMessages(self):
         """
         Public method to clear the list of saved messages.
-        
+
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def _vcsClearProjectCommitMessages(self):
         """
         Protected method to clear the list of project specific saved messages.
-        
+
         @return flag indicating success
         @rtype bool
         """
         if Preferences.getVCS("PerProjectCommitHistory"):
-            projectMgmtDir = (
-                ericApp().getObject("Project").getProjectManagementDir()
+            projectMgmtDir = ericApp().getObject("Project").getProjectManagementDir()
+            lockFile = QLockFile(
+                os.path.join(projectMgmtDir, VersionControl.commitHistoryLock)
             )
-            lockFile = QLockFile(
-                os.path.join(projectMgmtDir, VersionControl.commitHistoryLock))
             if lockFile.lock():
                 with contextlib.suppress(TypeError, OSError):
                     jsonString = json.dumps([], indent=2)
-                    with open(os.path.join(projectMgmtDir,
-                                           VersionControl.commitHistoryData),
-                              "w") as f:
+                    with open(
+                        os.path.join(projectMgmtDir, VersionControl.commitHistoryData),
+                        "w",
+                    ) as f:
                         f.write(jsonString)
                 lockFile.unlock()
                 return True
-        
+
         return False
-    
+
     def vcsUpdate(self, name, noDialog=False):
         """
         Public method used to update a file/directory in the vcs.
-        
+
         @param name file/directory name to be updated (string)
         @param noDialog flag indicating quiet operations (boolean)
         @return flag indicating, that the update contained an add
@@ -332,47 +337,47 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsAdd(self, name, isDir=False, noDialog=False):
         """
         Public method used to add a file/directory in the vcs.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @param noDialog flag indicating quiet operations (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsAddBinary(self, name, isDir=False):
         """
         Public method used to add a file/directory in binary mode in the vcs.
-        
+
         @param name file/directory name to be added (string)
         @param isDir flag indicating name is a directory (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsAddTree(self, path):
         """
         Public method to add a directory tree rooted at path in the vcs.
-        
+
         @param path root directory of the tree to be added (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsRemove(self, name, project=False, noDialog=False):
         """
         Public method used to add a file/directory in the vcs.
-        
+
         @param name file/directory name to be removed (string)
         @param project flag indicating deletion of a project tree (boolean)
         @param noDialog flag indicating quiet operations
@@ -380,14 +385,14 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsMove(self, name, project, target=None, noDialog=False):
         """
         Public method used to move a file/directory.
-        
+
         @param name file/directory name to be moved (string)
         @param project reference to the project object
         @param target new name of the file/directory (string)
@@ -396,38 +401,38 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsLogBrowser(self, name, isFile=False):
         """
         Public method used to view the log of a file/directory in the vcs
         with a log browser dialog.
-        
+
         @param name file/directory name to show the log for (string)
         @param isFile flag indicating log for a file is to be shown
             (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsDiff(self, name):
         """
         Public method used to view the diff of a file/directory in the vcs.
-        
+
         @param name file/directory name to be diffed (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def vcsSbsDiff(self, name, extended=False, revisions=None):
         """
         Public method used to view the difference of a file to the Mercurial
         repository side-by-side.
-        
+
         @param name file name to be diffed
         @type str
         @param extended flag indicating the extended variant
@@ -437,32 +442,32 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def vcsStatus(self, name):
         """
         Public method used to view the status of a file/directory in the vcs.
-        
+
         @param name file/directory name to show the status for (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsTag(self, name):
         """
         Public method used to set the tag of a file/directory in the vcs.
-        
+
         @param name file/directory name to be tagged (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsRevert(self, name):
         """
         Public method used to revert changes made to a file/directory.
-        
+
         @param name file/directory name to be reverted
         @type str
         @return flag indicating, that the update contained an add
@@ -471,64 +476,64 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-    
+
     def vcsForget(self, name):
         """
         Public method used to remove a file from the repository.
-        
+
         @param name file/directory name to be removed
         @type str or list of str
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def vcsSwitch(self, name):
         """
         Public method used to switch a directory to a different tag/branch.
-        
+
         @param name directory name to be switched (string)
         @return flag indicating, that the switch contained an add
             or delete (boolean)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def vcsMerge(self, name):
         """
         Public method used to merge a tag/branch into the local project.
-        
+
         @param name file/directory name to be merged (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsRegisteredState(self, name):
         """
         Public method used to get the registered state of a file in the vcs.
-        
+
         @param name filename to check (string)
         @return a combination of canBeCommited and canBeAdded or
             0 in order to signal an error
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return 0
-        
+
     def vcsAllRegisteredStates(self, names, dname):
         """
         Public method used to get the registered states of a number of files
         in the vcs.
-        
+
         @param names dictionary with all filenames to be checked as keys
         @param dname directory to check in (string)
         @return the received dictionary completed with a combination of
@@ -536,46 +541,46 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return {}
-        
+
     def vcsName(self):
         """
         Public method returning the name of the vcs.
-        
+
         @return name of the vcs (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return ""
-        
+
     def vcsCleanup(self, name):
         """
         Public method used to cleanup the local copy.
-        
+
         @param name directory name to be cleaned up (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsCommandLine(self, name):
         """
         Public method used to execute arbitrary vcs commands.
-        
+
         @param name directory name of the working directory (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsOptionsDialog(self, project, archive, editable=False, parent=None):
         """
         Public method to get a dialog to enter repository info.
-        
+
         @param project reference to the project object
         @param archive name of the project in the repository (string)
         @param editable flag indicating that the project name is editable
@@ -584,38 +589,37 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsNewProjectOptionsDialog(self, parent=None):
         """
         Public method to get a dialog to enter repository info for getting a
         new project.
-        
+
         @param parent parent widget (QWidget)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def vcsRepositoryInfos(self, ppath):
         """
         Public method to retrieve information about the repository.
-        
+
         @param ppath local path to get the repository infos (string)
         @return string with ready formated info for display (string)
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return ""
-        
-    def vcsGetProjectBrowserHelper(self, browser, project,
-                                   isTranslationsBrowser=False):
+
+    def vcsGetProjectBrowserHelper(self, browser, project, isTranslationsBrowser=False):
         """
         Public method to instanciate a helper object for the different
         project browsers.
-        
+
         @param browser reference to the project browser object
         @param project reference to the project object
         @param isTranslationsBrowser flag indicating, the helper is requested
@@ -624,57 +628,57 @@
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
-        return None                         # __IGNORE_WARNING_M831__
-        
+        raise RuntimeError("Not implemented")
+
+        return None  # __IGNORE_WARNING_M831__
+
     def vcsGetProjectHelper(self, project):
         """
         Public method to instanciate a helper object for the project.
-        
+
         @param project reference to the project object
         @return the project helper object
         @exception RuntimeError to indicate that this method must be
             implemented by a subclass
         """
-        raise RuntimeError('Not implemented')
-        
-        return None                         # __IGNORE_WARNING_M831__
-    
+        raise RuntimeError("Not implemented")
+
+        return None  # __IGNORE_WARNING_M831__
+
     #####################################################################
     ## methods above need to be implemented by a subclass
     #####################################################################
-    
+
     def clearStatusCache(self):
         """
         Public method to clear the status cache.
         """
         pass
-        
+
     def vcsInitConfig(self, project):
         """
         Public method to initialize the VCS configuration.
-        
+
         This method could ensure, that certain files or directories are
         exclude from being version controlled.
-        
+
         @param project reference to the project (Project)
         """
         pass
-        
+
     def vcsSupportCommandOptions(self):
         """
         Public method to signal the support of user settable command options.
-        
+
         @return flag indicating the support  of user settable command options
             (boolean)
         """
         return True
-    
+
     def vcsSetOptions(self, options):
         """
         Public method used to set the options for the vcs.
-        
+
         @param options a dictionary of option strings with keys as
                 defined by the default options
         """
@@ -682,11 +686,11 @@
             for key in options:
                 with contextlib.suppress(KeyError):
                     self.options[key] = options[key]
-        
+
     def vcsGetOptions(self):
         """
         Public method used to retrieve the options of the vcs.
-        
+
         @return a dictionary of option strings that can be passed to
             vcsSetOptions.
         """
@@ -694,67 +698,66 @@
             return self.options
         else:
             return self.defaultOptions
-        
+
     def vcsSetOtherData(self, data):
         """
         Public method used to set vcs specific data.
-        
+
         @param data a dictionary of vcs specific data
         """
         for key in data:
             with contextlib.suppress(KeyError):
                 self.otherData[key] = data[key]
-        
+
     def vcsGetOtherData(self):
         """
         Public method used to retrieve vcs specific data.
-        
+
         @return a dictionary of vcs specific data
         """
         return self.otherData
-        
+
     def vcsSetData(self, key, value):
         """
         Public method used to set an entry in the otherData dictionary.
-        
+
         @param key the key of the data (string)
         @param value the value of the data
         """
         if key in self.interestingDataKeys:
             self.otherData[key] = value
-        
+
     def vcsSetDataFromDict(self, dictionary):
         """
         Public method used to set entries in the otherData dictionary.
-        
+
         @param dictionary dictionary to pick entries from
         """
         for key in self.interestingDataKeys:
             if key in dictionary:
                 self.otherData[key] = dictionary[key]
-    
+
     def vcsResolved(self, name):
         """
         Public method used to resolve conflicts of a file/directory.
-        
+
         @param name file/directory name to be resolved
         @type str
         """
         # default implementation just refreshes the status
         self.checkVCSStatus()
-    
+
     #####################################################################
     ## below are some utility methods
     #####################################################################
-    
-    def startSynchronizedProcess(self, proc, program, arguments,
-                                 workingDir=None):
+
+    def startSynchronizedProcess(self, proc, program, arguments, workingDir=None):
         """
         Public method to start a synchroneous process.
-        
+
         This method starts a process and waits
         for its end while still serving the Qt event loop.
-        
+
         @param proc process to start (QProcess)
         @param program path of the executable to start (string)
         @param arguments list of arguments for the process (list of strings)
@@ -763,7 +766,7 @@
         """
         if proc is None:
             return False
-            
+
         if workingDir:
             proc.setWorkingDirectory(workingDir)
         proc.start(program, arguments)
@@ -772,26 +775,27 @@
             EricMessageBox.critical(
                 None,
                 QCoreApplication.translate(
-                    "VersionControl", 'Process Generation Error'),
+                    "VersionControl", "Process Generation Error"
+                ),
                 QCoreApplication.translate(
                     "VersionControl",
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format(program))
+                    "The process {0} could not be started. "
+                    "Ensure, that it is in the search path.",
+                ).format(program),
+            )
             return False
         else:
             while proc.state() == QProcess.ProcessState.Running:
                 QThread.msleep(300)
                 QApplication.processEvents()
-            return (
-                (proc.exitStatus() == QProcess.ExitStatus.NormalExit) and
-                (proc.exitCode() == 0)
+            return (proc.exitStatus() == QProcess.ExitStatus.NormalExit) and (
+                proc.exitCode() == 0
             )
-        
+
     def splitPath(self, name):
         """
         Public method splitting name into a directory part and a file part.
-        
+
         @param name path name (string)
         @return a tuple of 2 strings (dirname, filename).
         """
@@ -801,12 +805,12 @@
         else:
             dn, fn = os.path.split(name)
         return (dn, fn)
-    
+
     def splitPathList(self, names):
         """
         Public method splitting the list of names into a common directory part
         and a file list.
-        
+
         @param names list of paths (list of strings)
         @return a tuple of string and list of strings (dirname, filenamelist)
         """
@@ -814,7 +818,7 @@
         if dname:
             if not dname.endswith(os.sep):
                 dname = os.path.dirname(dname) + os.sep
-            fnames = [n.replace(dname, '') for n in names]
+            fnames = [n.replace(dname, "") for n in names]
             dname = os.path.dirname(dname)
             return (dname, fnames)
         else:
@@ -824,24 +828,24 @@
         """
         Public method to add an argument list to the already present
         arguments.
-        
+
         @param args current arguments list (list of strings)
         @param argslist list of arguments (list of strings)
         """
         for arg in argslist:
-            if arg != '':
+            if arg != "":
                 args.append(arg)
-    
+
     ###########################################################################
     ## VCS status monitor thread related methods
     ###########################################################################
-    
+
     def __statusMonitorStatus(self, status, statusMsg):
         """
         Private slot to receive the status monitor status.
-        
+
         It simply re-emits the received status.
-        
+
         @param status status of the monitoring thread
         @type str (one of ok, nok or off)
         @param statusMsg explanotory text for the signaled status
@@ -853,74 +857,74 @@
     def __statusMonitorData(self, statusList):
         """
         Private method to receive the status monitor data update.
-        
+
         It simply re-emits the received status list.
-        
+
         @param statusList list of status records
         @type list of str
         """
         self.vcsStatusMonitorData.emit(statusList)
         QCoreApplication.processEvents()
-    
+
     def __statusMonitorAllData(self, statusDict):
         """
         Private method to receive all status monitor data.
-        
+
         It simply re-emits the received status list.
-        
+
         @param statusDict dictionary of status records
         @type dict
         """
         self.vcsStatusMonitorAllData.emit(statusDict)
         QCoreApplication.processEvents()
-    
+
     def __statusMonitorInfo(self, info):
         """
         Private slot to receive the status monitor info message.
-        
+
         It simply re-emits the received info message.
-        
+
         @param info received info message
         @type str
         """
         self.vcsStatusMonitorInfo.emit(info)
         QCoreApplication.processEvents()
-    
+
     def startStatusMonitor(self, project):
         """
         Public method to start the VCS status monitor thread.
-        
+
         @param project reference to the project object
         @return reference to the monitor thread (QThread)
         """
         vcsStatusMonitorInterval = (
             project.pudata["VCSSTATUSMONITORINTERVAL"]
-            if project.pudata["VCSSTATUSMONITORINTERVAL"] else
-            Preferences.getVCS("StatusMonitorInterval")
+            if project.pudata["VCSSTATUSMONITORINTERVAL"]
+            else Preferences.getVCS("StatusMonitorInterval")
         )
         if vcsStatusMonitorInterval > 0:
             self.statusMonitorThread = self._createStatusMonitorThread(
-                vcsStatusMonitorInterval, project)
+                vcsStatusMonitorInterval, project
+            )
             if self.statusMonitorThread is not None:
                 self.statusMonitorThread.vcsStatusMonitorData.connect(
-                    self.__statusMonitorData,
-                    Qt.ConnectionType.QueuedConnection)
+                    self.__statusMonitorData, Qt.ConnectionType.QueuedConnection
+                )
                 self.statusMonitorThread.vcsStatusMonitorAllData.connect(
-                    self.__statusMonitorAllData,
-                    Qt.ConnectionType.QueuedConnection)
+                    self.__statusMonitorAllData, Qt.ConnectionType.QueuedConnection
+                )
                 self.statusMonitorThread.vcsStatusMonitorStatus.connect(
-                    self.__statusMonitorStatus,
-                    Qt.ConnectionType.QueuedConnection)
+                    self.__statusMonitorStatus, Qt.ConnectionType.QueuedConnection
+                )
                 self.statusMonitorThread.vcsStatusMonitorInfo.connect(
-                    self.__statusMonitorInfo,
-                    Qt.ConnectionType.QueuedConnection)
-                self.statusMonitorThread.setAutoUpdate(
-                    Preferences.getVCS("AutoUpdate"))
+                    self.__statusMonitorInfo, Qt.ConnectionType.QueuedConnection
+                )
+                self.statusMonitorThread.setAutoUpdate(Preferences.getVCS("AutoUpdate"))
                 self.statusMonitorThread.start()
         else:
             self.statusMonitorThread = None
         return self.statusMonitorThread
-    
+
     def stopStatusMonitor(self):
         """
         Public method to stop the VCS status monitor thread.
@@ -928,13 +932,17 @@
         if self.statusMonitorThread is not None:
             self.__statusMonitorData(["--RESET--"])
             self.statusMonitorThread.vcsStatusMonitorData.disconnect(
-                self.__statusMonitorData)
+                self.__statusMonitorData
+            )
             self.statusMonitorThread.vcsStatusMonitorAllData.disconnect(
-                self.__statusMonitorAllData)
+                self.__statusMonitorAllData
+            )
             self.statusMonitorThread.vcsStatusMonitorStatus.disconnect(
-                self.__statusMonitorStatus)
+                self.__statusMonitorStatus
+            )
             self.statusMonitorThread.vcsStatusMonitorInfo.disconnect(
-                self.__statusMonitorInfo)
+                self.__statusMonitorInfo
+            )
             self.statusMonitorThread.stop()
             self.statusMonitorThread.wait(10000)
             if not self.statusMonitorThread.isFinished():
@@ -944,14 +952,15 @@
             self.__statusMonitorStatus(
                 "off",
                 QCoreApplication.translate(
-                    "VersionControl",
-                    "Repository status checking is switched off"))
+                    "VersionControl", "Repository status checking is switched off"
+                ),
+            )
             self.__statusMonitorInfo("")
-    
+
     def setStatusMonitorInterval(self, interval, project):
         """
         Public method to change the monitor interval.
-        
+
         @param interval new interval in seconds (integer)
         @param project reference to the project object
         """
@@ -962,67 +971,67 @@
                 self.statusMonitorThread.setInterval(interval)
         else:
             self.startStatusMonitor(project)
-    
+
     def getStatusMonitorInterval(self):
         """
         Public method to get the monitor interval.
-        
+
         @return interval in seconds (integer)
         """
         if self.statusMonitorThread is not None:
             return self.statusMonitorThread.getInterval()
         else:
             return 0
-    
+
     def setStatusMonitorAutoUpdate(self, auto):
         """
         Public method to enable the auto update function.
-        
+
         @param auto status of the auto update function (boolean)
         """
         if self.statusMonitorThread is not None:
             self.statusMonitorThread.setAutoUpdate(auto)
-    
+
     def getStatusMonitorAutoUpdate(self):
         """
         Public method to retrieve the status of the auto update function.
-        
+
         @return status of the auto update function (boolean)
         """
         if self.statusMonitorThread is not None:
             return self.statusMonitorThread.getAutoUpdate()
         else:
             return False
-    
+
     def checkVCSStatus(self):
         """
         Public method to wake up the VCS status monitor thread.
         """
         self.vcsStatusChanged.emit()
-        
+
         if self.statusMonitorThread is not None:
             self.statusMonitorThread.checkStatus()
-    
+
     def clearStatusMonitorCachedState(self, name):
         """
         Public method to clear the cached VCS state of a file/directory.
-        
+
         @param name name of the entry to be cleared (string)
         """
         if self.statusMonitorThread is not None:
             self.statusMonitorThread.clearCachedState(name)
-        
+
     def _createStatusMonitorThread(self, interval, project):
         """
         Protected method to create an instance of the VCS status monitor
         thread.
-        
+
         Note: This method should be overwritten in subclasses in order to
         support VCS status monitoring.
-        
+
         @param interval check interval for the monitor thread in seconds
             (integer)
         @param project reference to the project object
         @return reference to the monitor thread (QThread)
         """
-        return None     # __IGNORE_WARNING_M831__
+        return None  # __IGNORE_WARNING_M831__
--- a/src/eric7/VCS/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VCS/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,7 +24,7 @@
 def factory(vcs):
     """
     Modul factory function to generate the right vcs object.
-    
+
     @param vcs name of the VCS system to be used (string)
     @return the instantiated VCS object
     """
@@ -32,9 +32,8 @@
     if pluginManager is None:
         # that should not happen
         vc = None
-    
-    vc = pluginManager.getPluginObject("version_control", vcs,
-                                       maybeActive=True)
+
+    vc = pluginManager.getPluginObject("version_control", vcs, maybeActive=True)
     if vc is None:
         # try alternative vcs interfaces assuming, that there is a common
         # indicator for the alternatives
@@ -44,10 +43,11 @@
                     for vcsSystem, _vcsSystemDisplay in vcsData:
                         if vcsSystem != vcs:
                             vc = pluginManager.getPluginObject(
-                                "version_control", vcsSystem, maybeActive=True)
+                                "version_control", vcsSystem, maybeActive=True
+                            )
                             if vc is not None:
                                 return vc
-    
+
     return vc
 
 
@@ -57,15 +57,16 @@
 def getBasicHelper(project):
     """
     Module function to get a reference to the basic project helper singleton.
-    
+
     @param project reference to the project object (Project)
     @return reference to the basic VCS project helper singleton
         (VcsProjectHelper)
     """
     global VcsBasicHelperSingleton
-    
+
     if VcsBasicHelperSingleton is None:
         from .ProjectHelper import VcsProjectHelper
+
         VcsBasicHelperSingleton = VcsProjectHelper(None, project)
-    
+
     return VcsBasicHelperSingleton
--- a/src/eric7/ViewManager/BookmarkedFilesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/ViewManager/BookmarkedFilesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,42 +22,41 @@
     """
     Class implementing a configuration dialog for the bookmarked files menu.
     """
+
     def __init__(self, bookmarks, parent=None):
         """
         Constructor
-        
+
         @param bookmarks list of bookmarked files (list of strings)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.bookmarks = bookmarks[:]
         for bookmark in self.bookmarks:
             itm = QListWidgetItem(bookmark, self.filesList)
             if not pathlib.Path(bookmark).exists():
                 itm.setBackground(QColor(Qt.GlobalColor.red))
-            
+
         if len(self.bookmarks):
             self.filesList.setCurrentRow(0)
-        
+
     def on_filePicker_textChanged(self, txt):
         """
         Private slot to handle the textChanged signal of the file edit.
-        
+
         @param txt the text of the file edit (string)
         """
         self.addButton.setEnabled(txt != "")
-        self.changeButton.setEnabled(
-            txt != "" and
-            self.filesList.currentRow() != -1)
-        
+        self.changeButton.setEnabled(txt != "" and self.filesList.currentRow() != -1)
+
     def on_filesList_currentRowChanged(self, row):
         """
         Private slot to set the lineedit depending on the selected entry.
-        
+
         @param row the current row (integer)
         """
         if row == -1:
@@ -72,10 +71,10 @@
             self.downButton.setEnabled(row != maxIndex)
             self.deleteButton.setEnabled(True)
             self.changeButton.setEnabled(True)
-            
+
             bookmark = self.bookmarks[row]
             self.filePicker.setText(bookmark)
-        
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -90,7 +89,7 @@
             self.bookmarks.append(bookmark)
         row = self.filesList.currentRow()
         self.on_filesList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_changeButton_clicked(self):
         """
@@ -105,7 +104,7 @@
             itm.setBackground(QColor(Qt.GlobalColor.red))
         else:
             itm.setBackground(QColor())
-        
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -117,7 +116,7 @@
         del self.bookmarks[row]
         row = self.filesList.currentRow()
         self.on_filesList_currentRowChanged(row)
-        
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -128,7 +127,7 @@
         if row == rows - 1:
             # we're already at the end
             return
-        
+
         self.__swap(row, row + 1)
         itm = self.filesList.takeItem(row)
         self.filesList.insertItem(row + 1, itm)
@@ -138,7 +137,7 @@
             self.downButton.setEnabled(False)
         else:
             self.downButton.setEnabled(True)
-        
+
     @pyqtSlot()
     def on_upButton_clicked(self):
         """
@@ -148,7 +147,7 @@
         if row == 0:
             # we're already at the top
             return
-        
+
         self.__swap(row - 1, row)
         itm = self.filesList.takeItem(row)
         self.filesList.insertItem(row - 1, itm)
@@ -158,19 +157,19 @@
         else:
             self.upButton.setEnabled(True)
         self.downButton.setEnabled(True)
-        
+
     def getBookmarkedFiles(self):
         """
         Public method to retrieve the tools list.
-        
+
         @return a list of filenames (list of strings)
         """
         return self.bookmarks
-        
+
     def __swap(self, itm1, itm2):
         """
         Private method used two swap two list entries given by their index.
-        
+
         @param itm1 index of first entry (int)
         @param itm2 index of second entry (int)
         """
--- a/src/eric7/ViewManager/ViewManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/ViewManager/ViewManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,12 +13,16 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QSignalMapper, QTimer, QPoint, QCoreApplication
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QSignalMapper,
+    QTimer,
+    QPoint,
+    QCoreApplication,
 )
 from PyQt6.QtGui import QKeySequence, QPixmap
-from PyQt6.QtWidgets import (
-    QToolBar, QDialog, QApplication, QMenu, QWidget
-)
+from PyQt6.QtWidgets import QToolBar, QDialog, QApplication, QMenu, QWidget
 from PyQt6.Qsci import QsciScintilla
 
 from EricWidgets.EricApplication import ericApp
@@ -41,10 +45,10 @@
 class ViewManager(QWidget):
     """
     Base class inherited by all specific view manager classes.
-    
+
     It defines the interface to be implemented by specific
     view manager classes and all common methods.
-    
+
     @signal changeCaption(str) emitted if a change of the caption is necessary
     @signal editorChanged(str) emitted when the current editor has changed
     @signal editorChangedEd(Editor) emitted when the current editor has changed
@@ -82,6 +86,7 @@
     @signal editorDoubleClickedEd(Editor, position, buttons) emitted to signal
         a mouse double click in an editor
     """
+
     changeCaption = pyqtSignal(str)
     editorChanged = pyqtSignal(str)
     editorChangedEd = pyqtSignal(Editor)
@@ -107,80 +112,78 @@
     editorLineChanged = pyqtSignal(str, int)
     editorLineChangedEd = pyqtSignal(Editor, int)
     editorDoubleClickedEd = pyqtSignal(Editor, QPoint, int)
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         # initialize the instance variables
         self.editors = []
         self.currentEditor = None
         self.untitledCount = 0
-        self.srHistory = {
-            "search": [],
-            "replace": []
-        }
+        self.srHistory = {"search": [], "replace": []}
         self.editorsCheckFocusIn = True
-        
+
         self.recent = []
         self.__loadRecent()
-        
+
         self.bookmarked = []
         bs = Preferences.getSettings().value("Bookmarked/Sources")
         if bs is not None:
             self.bookmarked = bs
-        
+
         # initialize the autosave timer
         self.autosaveInterval = Preferences.getEditor("AutosaveInterval")
         self.autosaveTimer = QTimer(self)
         self.autosaveTimer.setObjectName("AutosaveTimer")
         self.autosaveTimer.setSingleShot(True)
         self.autosaveTimer.timeout.connect(self.__autosave)
-        
+
         # initialize the APIs manager
         from QScintilla.APIsManager import APIsManager
+
         self.apisManager = APIsManager(parent=self)
-        
+
         self.__cooperationClient = None
-        
+
         self.__lastFocusWidget = None
-        
+
     def setReferences(self, ui, dbs):
         """
         Public method to set some references needed later on.
-        
+
         @param ui reference to the main user interface
         @param dbs reference to the debug server object
         """
         from QScintilla.SearchReplaceWidget import SearchReplaceSlidingWidget
-        
+
         self.ui = ui
         self.dbs = dbs
-        
+
         self.__searchWidget = SearchReplaceSlidingWidget(False, self, ui)
         self.__replaceWidget = SearchReplaceSlidingWidget(True, self, ui)
-        
+
         self.checkActions.connect(self.__searchWidget.updateSelectionCheckBox)
         self.checkActions.connect(self.__replaceWidget.updateSelectionCheckBox)
-        
+
     def searchWidget(self):
         """
         Public method to get a reference to the search widget.
-        
+
         @return reference to the search widget (SearchReplaceSlidingWidget)
         """
         return self.__searchWidget
-        
+
     def replaceWidget(self):
         """
         Public method to get a reference to the replace widget.
-        
+
         @return reference to the replace widget (SearchReplaceSlidingWidget)
         """
         return self.__replaceWidget
-        
+
     def __loadRecent(self):
         """
         Private method to load the recently opened filenames.
@@ -192,31 +195,32 @@
             for f in Preferences.toList(rs):
                 if pathlib.Path(f).exists():
                     self.recent.append(f)
-        
+
     def __saveRecent(self):
         """
         Private method to save the list of recently opened filenames.
         """
         Preferences.Prefs.rsettings.setValue(recentNameFiles, self.recent)
         Preferences.Prefs.rsettings.sync()
-        
+
     def getMostRecent(self):
         """
         Public method to get the most recently opened file.
-        
+
         @return path of the most recently opened file (string)
         """
         if len(self.recent):
             return self.recent[0]
         else:
             return None
-        
-    def setSbInfo(self, sbLine, sbPos, sbWritable, sbEncoding, sbLanguage,
-                  sbEol, sbZoom):
+
+    def setSbInfo(
+        self, sbLine, sbPos, sbWritable, sbEncoding, sbLanguage, sbEol, sbZoom
+    ):
         """
         Public method to transfer statusbar info from the user interface to
         viewmanager.
-        
+
         @param sbLine reference to the line number part of the statusbar
             (QLabel)
         @param sbPos reference to the character position part of the statusbar
@@ -240,19 +244,19 @@
         self.sbZoom = sbZoom
         self.sbZoom.valueChanged.connect(self.__zoomTo)
         self.__setSbFile(zoom=0)
-        
+
         self.sbLang.clicked.connect(self.__showLanguagesMenu)
         self.sbEol.clicked.connect(self.__showEolMenu)
         self.sbEnc.clicked.connect(self.__showEncodingsMenu)
-    
+
     ##################################################################
     ## Below are menu handling methods for status bar labels
     ##################################################################
-    
+
     def __showLanguagesMenu(self, pos):
         """
         Private slot to show the Languages menu of the current editor.
-        
+
         @param pos position the menu should be shown at (QPoint)
         """
         aw = self.activeWindow()
@@ -260,11 +264,11 @@
             menu = aw.getMenu("Languages")
             if menu is not None:
                 menu.exec(pos)
-    
+
     def __showEolMenu(self, pos):
         """
         Private slot to show the EOL menu of the current editor.
-        
+
         @param pos position the menu should be shown at (QPoint)
         """
         aw = self.activeWindow()
@@ -272,11 +276,11 @@
             menu = aw.getMenu("Eol")
             if menu is not None:
                 menu.exec(pos)
-    
+
     def __showEncodingsMenu(self, pos):
         """
         Private slot to show the Encodings menu of the current editor.
-        
+
         @param pos position the menu should be shown at (QPoint)
         """
         aw = self.activeWindow()
@@ -284,81 +288,81 @@
             menu = aw.getMenu("Encodings")
             if menu is not None:
                 menu.exec(pos)
-    
+
     ###########################################################################
     ## methods below need to be implemented by a subclass
     ###########################################################################
-    
+
     def canCascade(self):
         """
         Public method to signal if cascading of managed windows is available.
-        
+
         @return flag indicating cascading of windows is available
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def canTile(self):
         """
         Public method to signal if tiling of managed windows is available.
-        
+
         @return flag indicating tiling of windows is available
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
         return False
-        
+
     def tile(self):
         """
         Public method to tile the managed windows.
-        
+
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def cascade(self):
         """
         Public method to cascade the managed windows.
-        
+
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def activeWindow(self):
         """
         Public method to return the active (i.e. current) window.
-        
+
         @return reference to the active editor
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
-        return None                         # __IGNORE_WARNING_M831__
-        
+        raise RuntimeError("Not implemented")
+
+        return None  # __IGNORE_WARNING_M831__
+
     def _removeAllViews(self):
         """
         Protected method to remove all views (i.e. windows).
-        
+
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def _removeView(self, win):
         """
         Protected method to remove a view (i.e. window).
-        
+
         @param win editor window to be removed
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def _addView(self, win, fn=None, noName="", addNext=False, indexes=None):
         """
         Protected method to add a view (i.e. window).
-        
+
         @param win editor assembly to be added
         @type EditorAssembly
         @param fn filename of this editor
@@ -373,89 +377,89 @@
         @type tuple of two int
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def _showView(self, win, fn=None):
         """
         Protected method to show a view (i.e. window).
-        
+
         @param win editor assembly to be shown
         @param fn filename of this editor
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def showWindowMenu(self, windowMenu):
         """
         Public method to set up the viewmanager part of the Window menu.
-        
+
         @param windowMenu reference to the window menu
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def _initWindowActions(self):
         """
         Protected method to define the user interface actions for window
         handling.
-        
+
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def setEditorName(self, editor, newName):
         """
         Public method to change the displayed name of the editor.
-        
+
         @param editor editor window to be changed
         @param newName new name to be shown (string)
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-        
+        raise RuntimeError("Not implemented")
+
     def _modificationStatusChanged(self, m, editor):
         """
         Protected slot to handle the modificationStatusChanged signal.
-        
+
         @param m flag indicating the modification status (boolean)
         @param editor editor window changed
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     def mainWidget(self):
         """
         Public method to return a reference to the main Widget of a
         specific view manager subclass.
-        
+
         @exception RuntimeError Not implemented
         """
-        raise RuntimeError('Not implemented')
-    
+        raise RuntimeError("Not implemented")
+
     #####################################################################
     ## methods above need to be implemented by a subclass
     #####################################################################
-    
+
     def canSplit(self):
         """
         Public method to signal if splitting of the view is available.
-        
+
         @return flag indicating splitting of the view is available.
         """
         return False
-        
+
     def addSplit(self):
         """
         Public method used to split the current view.
         """
         pass
-        
+
     @pyqtSlot()
     def removeSplit(self, index=-1):
         """
         Public method used to remove the current split view or a split view
         by index.
-        
+
         @param index index of the split to be removed (-1 means to
             delete the current split)
         @type int
@@ -463,98 +467,98 @@
         @rtype bool
         """
         return False
-        
+
     def splitCount(self):
         """
         Public method to get the number of split views.
-        
+
         @return number of split views
         @rtype int
         """
         return 0
-        
+
     def setSplitCount(self, count):
         """
         Public method to set the number of split views.
-        
+
         @param count number of split views
         @type int
         """
         pass
-        
+
     def getSplitOrientation(self):
         """
         Public method to get the orientation of the split view.
-        
+
         @return orientation of the split (Qt.Orientation.Horizontal or
             Qt.Orientation.Vertical)
         """
         return Qt.Orientation.Vertical
-        
+
     def setSplitOrientation(self, orientation):
         """
         Public method used to set the orientation of the split view.
-        
+
         @param orientation orientation of the split
             (Qt.Orientation.Horizontal or Qt.Orientation.Vertical)
         """
         pass
-        
+
     def nextSplit(self):
         """
         Public slot used to move to the next split.
         """
         pass
-        
+
     def prevSplit(self):
         """
         Public slot used to move to the previous split.
         """
         pass
-        
+
     def eventFilter(self, qobject, event):
         """
         Public method called to filter an event.
-        
+
         @param qobject object, that generated the event (QObject)
         @param event the event, that was generated by object (QEvent)
         @return flag indicating if event was filtered out
         """
         return False
-    
+
     #####################################################################
     ## methods above need to be implemented by a subclass, that supports
     ## splitting of the viewmanager area.
     #####################################################################
-    
+
     def initActions(self):
         """
         Public method defining the user interface actions.
         """
         # list containing all edit actions
         self.editActions = []
-        
+
         # list containing all file actions
         self.fileActions = []
-        
+
         # list containing all search actions
         self.searchActions = []
-        
+
         # list containing all view actions
         self.viewActions = []
-        
+
         # list containing all window actions
         self.windowActions = []
-        
+
         # list containing all macro actions
         self.macroActions = []
-        
+
         # list containing all bookmark actions
         self.bookmarkActions = []
-        
+
         # list containing all spell checking actions
         self.spellingActions = []
-        
+
         self.__actions = {
             "bookmark": self.bookmarkActions,
             "edit": self.editActions,
@@ -565,7 +569,7 @@
             "view": self.viewActions,
             "window": self.windowActions,
         }
-        
+
         self._initWindowActions()
         self.__initFileActions()
         self.__initEditActions()
@@ -574,231 +578,306 @@
         self.__initMacroActions()
         self.__initBookmarkActions()
         self.__initSpellingActions()
-        
+
     ##################################################################
     ## Initialize the file related actions, file menu and toolbar
     ##################################################################
-    
+
     def __initFileActions(self):
         """
         Private method defining the user interface actions for file handling.
         """
         self.newAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'New'),
+            QCoreApplication.translate("ViewManager", "New"),
             UI.PixmapCache.getIcon("new"),
-            QCoreApplication.translate('ViewManager', '&New'),
+            QCoreApplication.translate("ViewManager", "&New"),
             QKeySequence(
-                QCoreApplication.translate('ViewManager', "Ctrl+N",
-                                           "File|New")),
-            0, self, 'vm_file_new')
+                QCoreApplication.translate("ViewManager", "Ctrl+N", "File|New")
+            ),
+            0,
+            self,
+            "vm_file_new",
+        )
         self.newAct.setStatusTip(
-            QCoreApplication.translate(
-                'ViewManager', 'Open an empty editor window'))
-        self.newAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>New</b>"""
-            """<p>An empty editor window will be created.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Open an empty editor window")
+        )
+        self.newAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>New</b>""" """<p>An empty editor window will be created.</p>""",
+            )
+        )
         self.newAct.triggered.connect(self.newEditor)
         self.fileActions.append(self.newAct)
-        
+
         self.openAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Open'),
+            QCoreApplication.translate("ViewManager", "Open"),
             UI.PixmapCache.getIcon("open"),
-            QCoreApplication.translate('ViewManager', '&Open...'),
+            QCoreApplication.translate("ViewManager", "&Open..."),
             QKeySequence(
-                QCoreApplication.translate('ViewManager', "Ctrl+O",
-                                           "File|Open")),
-            0, self, 'vm_file_open')
-        self.openAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Open a file'))
-        self.openAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Open a file</b>"""
-            """<p>You will be asked for the name of a file to be opened"""
-            """ in an editor window.</p>"""
-        ))
+                QCoreApplication.translate("ViewManager", "Ctrl+O", "File|Open")
+            ),
+            0,
+            self,
+            "vm_file_open",
+        )
+        self.openAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Open a file")
+        )
+        self.openAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Open a file</b>"""
+                """<p>You will be asked for the name of a file to be opened"""
+                """ in an editor window.</p>""",
+            )
+        )
         self.openAct.triggered.connect(self.__openFiles)
         self.fileActions.append(self.openAct)
-        
+
         self.closeActGrp = createActionGroup(self)
-        
+
         self.closeAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Close'),
+            QCoreApplication.translate("ViewManager", "Close"),
             UI.PixmapCache.getIcon("closeEditor"),
-            QCoreApplication.translate('ViewManager', '&Close'),
+            QCoreApplication.translate("ViewManager", "&Close"),
             QKeySequence(
-                QCoreApplication.translate('ViewManager', "Ctrl+W",
-                                           "File|Close")),
-            0, self.closeActGrp, 'vm_file_close')
+                QCoreApplication.translate("ViewManager", "Ctrl+W", "File|Close")
+            ),
+            0,
+            self.closeActGrp,
+            "vm_file_close",
+        )
         self.closeAct.setStatusTip(
-            QCoreApplication.translate('ViewManager',
-                                       'Close the current window'))
-        self.closeAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Close Window</b>"""
-            """<p>Close the current window.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Close the current window")
+        )
+        self.closeAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Close Window</b>""" """<p>Close the current window.</p>""",
+            )
+        )
         self.closeAct.triggered.connect(self.closeCurrentWindow)
         self.fileActions.append(self.closeAct)
-        
+
         self.closeAllAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Close All'),
-            QCoreApplication.translate('ViewManager', 'Clos&e All'),
-            0, 0, self.closeActGrp, 'vm_file_close_all')
+            QCoreApplication.translate("ViewManager", "Close All"),
+            QCoreApplication.translate("ViewManager", "Clos&e All"),
+            0,
+            0,
+            self.closeActGrp,
+            "vm_file_close_all",
+        )
         self.closeAllAct.setStatusTip(
-            QCoreApplication.translate('ViewManager',
-                                       'Close all editor windows'))
-        self.closeAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Close All Windows</b>"""
-            """<p>Close all editor windows.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Close all editor windows")
+        )
+        self.closeAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Close All Windows</b>""" """<p>Close all editor windows.</p>""",
+            )
+        )
         self.closeAllAct.triggered.connect(self.closeAllWindows)
         self.fileActions.append(self.closeAllAct)
-        
+
         self.closeActGrp.setEnabled(False)
-        
+
         self.saveActGrp = createActionGroup(self)
-        
+
         self.saveAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Save'),
+            QCoreApplication.translate("ViewManager", "Save"),
             UI.PixmapCache.getIcon("fileSave"),
-            QCoreApplication.translate('ViewManager', '&Save'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+S", "File|Save")),
-            0, self.saveActGrp, 'vm_file_save')
+            QCoreApplication.translate("ViewManager", "&Save"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+S", "File|Save")
+            ),
+            0,
+            self.saveActGrp,
+            "vm_file_save",
+        )
         self.saveAct.setStatusTip(
-            QCoreApplication.translate('ViewManager', 'Save the current file'))
-        self.saveAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Save File</b>"""
-            """<p>Save the contents of current editor window.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Save the current file")
+        )
+        self.saveAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Save File</b>"""
+                """<p>Save the contents of current editor window.</p>""",
+            )
+        )
         self.saveAct.triggered.connect(self.saveCurrentEditor)
         self.fileActions.append(self.saveAct)
-        
+
         self.saveAsAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Save as'),
+            QCoreApplication.translate("ViewManager", "Save as"),
             UI.PixmapCache.getIcon("fileSaveAs"),
-            QCoreApplication.translate('ViewManager', 'Save &as...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Ctrl+S", "File|Save As")),
-            0, self.saveActGrp, 'vm_file_save_as')
-        self.saveAsAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Save the current file to a new one'))
-        self.saveAsAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Save File as</b>"""
-            """<p>Save the contents of current editor window to a new file."""
-            """ The file can be entered in a file selection dialog.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Save &as..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+Ctrl+S", "File|Save As"
+                )
+            ),
+            0,
+            self.saveActGrp,
+            "vm_file_save_as",
+        )
+        self.saveAsAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Save the current file to a new one"
+            )
+        )
+        self.saveAsAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Save File as</b>"""
+                """<p>Save the contents of current editor window to a new file."""
+                """ The file can be entered in a file selection dialog.</p>""",
+            )
+        )
         self.saveAsAct.triggered.connect(self.saveAsCurrentEditor)
         self.fileActions.append(self.saveAsAct)
-        
+
         self.saveCopyAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Save Copy'),
+            QCoreApplication.translate("ViewManager", "Save Copy"),
             UI.PixmapCache.getIcon("fileSaveCopy"),
-            QCoreApplication.translate('ViewManager', 'Save &Copy...'),
-            0, 0, self.saveActGrp, 'vm_file_save_copy')
-        self.saveCopyAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Save a copy of the current file'))
-        self.saveCopyAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Save Copy</b>"""
-            """<p>Save a copy of the contents of current editor window."""
-            """ The file can be entered in a file selection dialog.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Save &Copy..."),
+            0,
+            0,
+            self.saveActGrp,
+            "vm_file_save_copy",
+        )
+        self.saveCopyAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Save a copy of the current file")
+        )
+        self.saveCopyAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Save Copy</b>"""
+                """<p>Save a copy of the contents of current editor window."""
+                """ The file can be entered in a file selection dialog.</p>""",
+            )
+        )
         self.saveCopyAct.triggered.connect(self.saveCopyCurrentEditor)
         self.fileActions.append(self.saveCopyAct)
-        
+
         self.saveAllAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Save all'),
+            QCoreApplication.translate("ViewManager", "Save all"),
             UI.PixmapCache.getIcon("fileSaveAll"),
-            QCoreApplication.translate('ViewManager', 'Save a&ll'),
-            0, 0, self.saveActGrp, 'vm_file_save_all')
-        self.saveAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Save all files'))
-        self.saveAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Save All Files</b>"""
-            """<p>Save the contents of all editor windows.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Save a&ll"),
+            0,
+            0,
+            self.saveActGrp,
+            "vm_file_save_all",
+        )
+        self.saveAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Save all files")
+        )
+        self.saveAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Save All Files</b>"""
+                """<p>Save the contents of all editor windows.</p>""",
+            )
+        )
         self.saveAllAct.triggered.connect(self.saveAllEditors)
         self.fileActions.append(self.saveAllAct)
-        
+
         self.saveActGrp.setEnabled(False)
 
         self.printAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Print'),
+            QCoreApplication.translate("ViewManager", "Print"),
             UI.PixmapCache.getIcon("print"),
-            QCoreApplication.translate('ViewManager', '&Print'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+P", "File|Print")),
-            0, self, 'vm_file_print')
-        self.printAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Print the current file'))
-        self.printAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Print File</b>"""
-            """<p>Print the contents of current editor window.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Print"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+P", "File|Print")
+            ),
+            0,
+            self,
+            "vm_file_print",
+        )
+        self.printAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Print the current file")
+        )
+        self.printAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Print File</b>"""
+                """<p>Print the contents of current editor window.</p>""",
+            )
+        )
         self.printAct.triggered.connect(self.printCurrentEditor)
         self.printAct.setEnabled(False)
         self.fileActions.append(self.printAct)
-        
+
         self.printPreviewAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Print Preview'),
+            QCoreApplication.translate("ViewManager", "Print Preview"),
             UI.PixmapCache.getIcon("printPreview"),
-            QCoreApplication.translate('ViewManager', 'Print Preview'),
-            0, 0, self, 'vm_file_print_preview')
-        self.printPreviewAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Print preview of the current file'))
-        self.printPreviewAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Print Preview</b>"""
-            """<p>Print preview of the current editor window.</p>"""
-        ))
-        self.printPreviewAct.triggered.connect(
-            self.printPreviewCurrentEditor)
+            QCoreApplication.translate("ViewManager", "Print Preview"),
+            0,
+            0,
+            self,
+            "vm_file_print_preview",
+        )
+        self.printPreviewAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Print preview of the current file"
+            )
+        )
+        self.printPreviewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Print Preview</b>"""
+                """<p>Print preview of the current editor window.</p>""",
+            )
+        )
+        self.printPreviewAct.triggered.connect(self.printPreviewCurrentEditor)
         self.printPreviewAct.setEnabled(False)
         self.fileActions.append(self.printPreviewAct)
-        
+
         self.findLocationAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Find File'),
+            QCoreApplication.translate("ViewManager", "Find File"),
             UI.PixmapCache.getIcon("findLocation"),
-            QCoreApplication.translate('ViewManager', 'Find &File...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Ctrl+F", "File|Find File")),
-            0, self, 'vm_file_search_file')
-        self.findLocationAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a file by entering a search pattern'))
-        self.findLocationAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Find File</b>"""
-            """<p>This searches for a file by entering a search pattern.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Find &File..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Alt+Ctrl+F", "File|Find File"
+                )
+            ),
+            0,
+            self,
+            "vm_file_search_file",
+        )
+        self.findLocationAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search for a file by entering a search pattern"
+            )
+        )
+        self.findLocationAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Find File</b>"""
+                """<p>This searches for a file by entering a search pattern.</p>""",
+            )
+        )
         self.findLocationAct.triggered.connect(self.__findLocation)
         self.fileActions.append(self.findLocationAct)
-        
+
     def initFileMenu(self):
         """
         Public method to create the File menu.
-        
+
         @return the generated menu
         """
-        menu = QMenu(QCoreApplication.translate('ViewManager', '&File'),
-                     self.ui)
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&File"), self.ui)
         self.recentMenu = QMenu(
-            QCoreApplication.translate('ViewManager', 'Open &Recent Files'),
-            menu)
+            QCoreApplication.translate("ViewManager", "Open &Recent Files"), menu
+        )
         self.bookmarkedMenu = QMenu(
-            QCoreApplication.translate('ViewManager',
-                                       'Open &Bookmarked Files'),
-            menu)
+            QCoreApplication.translate("ViewManager", "Open &Bookmarked Files"), menu
+        )
         self.exportersMenu = self.__initContextMenuExporters()
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.newAct)
         menu.addAction(self.openAct)
         self.menuRecentAct = menu.addMenu(self.recentMenu)
@@ -817,31 +896,30 @@
         menu.addSeparator()
         menu.addAction(self.printPreviewAct)
         menu.addAction(self.printAct)
-        
+
         self.recentMenu.aboutToShow.connect(self.__showRecentMenu)
         self.recentMenu.triggered.connect(self.__openSourceFile)
         self.bookmarkedMenu.aboutToShow.connect(self.__showBookmarkedMenu)
         self.bookmarkedMenu.triggered.connect(self.__openSourceFile)
         menu.aboutToShow.connect(self.__showFileMenu)
-        
+
         self.exportersMenuAct.setEnabled(False)
-        
+
         return menu
-        
+
     def initFileToolbar(self, toolbarManager):
         """
         Public method to create the File toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'File'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "File"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("FileToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'File'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "File"))
+
         tb.addAction(self.newAct)
         tb.addAction(self.openAct)
         tb.addAction(self.closeAct)
@@ -850,1916 +928,2455 @@
         tb.addAction(self.saveAsAct)
         tb.addAction(self.saveCopyAct)
         tb.addAction(self.saveAllAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.printPreviewAct, tb.windowTitle())
         toolbarManager.addAction(self.printAct, tb.windowTitle())
-        
+
         return tb
-        
+
     def __initContextMenuExporters(self):
         """
         Private method used to setup the Exporters sub menu.
-        
+
         @return reference to the generated menu (QMenu)
         """
-        menu = QMenu(QCoreApplication.translate('ViewManager', "Export as"))
-        
+        menu = QMenu(QCoreApplication.translate("ViewManager", "Export as"))
+
         import QScintilla.Exporters
+
         supportedExporters = QScintilla.Exporters.getSupportedFormats()
         exporters = sorted(supportedExporters.keys())
         for exporter in exporters:
             act = menu.addAction(supportedExporters[exporter])
             act.setData(exporter)
-        
+
         menu.triggered.connect(self.__exportMenuTriggered)
-        
+
         return menu
-    
+
     ##################################################################
     ## Initialize the edit related actions, edit menu and toolbar
     ##################################################################
-    
+
     def __initEditActions(self):
         """
         Private method defining the user interface actions for the edit
             commands.
         """
         self.editActGrp = createActionGroup(self)
-        
+
         self.undoAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Undo'),
+            QCoreApplication.translate("ViewManager", "Undo"),
             UI.PixmapCache.getIcon("editUndo"),
-            QCoreApplication.translate('ViewManager', '&Undo'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Z", "Edit|Undo")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Backspace", "Edit|Undo")),
-            self.editActGrp, 'vm_edit_undo')
-        self.undoAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Undo the last change'))
-        self.undoAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Undo</b>"""
-            """<p>Undo the last change done in the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Undo"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Z", "Edit|Undo")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Alt+Backspace", "Edit|Undo")
+            ),
+            self.editActGrp,
+            "vm_edit_undo",
+        )
+        self.undoAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Undo the last change")
+        )
+        self.undoAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Undo</b>"""
+                """<p>Undo the last change done in the current editor.</p>""",
+            )
+        )
         self.undoAct.triggered.connect(self.__editUndo)
         self.editActions.append(self.undoAct)
-        
+
         self.redoAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Redo'),
+            QCoreApplication.translate("ViewManager", "Redo"),
             UI.PixmapCache.getIcon("editRedo"),
-            QCoreApplication.translate('ViewManager', '&Redo'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Shift+Z", "Edit|Redo")),
-            0,
-            self.editActGrp, 'vm_edit_redo')
-        self.redoAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Redo the last change'))
-        self.redoAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Redo</b>"""
-            """<p>Redo the last change done in the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Redo"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Shift+Z", "Edit|Redo")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_redo",
+        )
+        self.redoAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Redo the last change")
+        )
+        self.redoAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Redo</b>"""
+                """<p>Redo the last change done in the current editor.</p>""",
+            )
+        )
         self.redoAct.triggered.connect(self.__editRedo)
         self.editActions.append(self.redoAct)
-        
+
         self.revertAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Revert to last saved state'),
-            QCoreApplication.translate(
-                'ViewManager', 'Re&vert to last saved state'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Y", "Edit|Revert")),
-            0,
-            self.editActGrp, 'vm_edit_revert')
-        self.revertAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Revert to last saved state'))
-        self.revertAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Revert to last saved state</b>"""
-            """<p>Undo all changes up to the last saved state"""
-            """ of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Revert to last saved state"),
+            QCoreApplication.translate("ViewManager", "Re&vert to last saved state"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Y", "Edit|Revert")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_revert",
+        )
+        self.revertAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Revert to last saved state")
+        )
+        self.revertAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Revert to last saved state</b>"""
+                """<p>Undo all changes up to the last saved state"""
+                """ of the current editor.</p>""",
+            )
+        )
         self.revertAct.triggered.connect(self.__editRevert)
         self.editActions.append(self.revertAct)
-        
+
         self.copyActGrp = createActionGroup(self.editActGrp)
-        
+
         self.cutAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Cut'),
+            QCoreApplication.translate("ViewManager", "Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            QCoreApplication.translate('ViewManager', 'Cu&t'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+X", "Edit|Cut")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Del", "Edit|Cut")),
-            self.copyActGrp, 'vm_edit_cut')
-        self.cutAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Cut the selection'))
-        self.cutAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Cut</b>"""
-            """<p>Cut the selected text of the current editor to the"""
-            """ clipboard.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Cu&t"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+X", "Edit|Cut")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Shift+Del", "Edit|Cut")
+            ),
+            self.copyActGrp,
+            "vm_edit_cut",
+        )
+        self.cutAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Cut the selection")
+        )
+        self.cutAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Cut</b>"""
+                """<p>Cut the selected text of the current editor to the"""
+                """ clipboard.</p>""",
+            )
+        )
         self.cutAct.triggered.connect(self.__editCut)
         self.editActions.append(self.cutAct)
-        
+
         self.copyAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Copy'),
+            QCoreApplication.translate("ViewManager", "Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            QCoreApplication.translate('ViewManager', '&Copy'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+C", "Edit|Copy")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Ins", "Edit|Copy")),
-            self.copyActGrp, 'vm_edit_copy')
-        self.copyAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Copy the selection'))
-        self.copyAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Copy</b>"""
-            """<p>Copy the selected text of the current editor to the"""
-            """ clipboard.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Copy"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+C", "Edit|Copy")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Ins", "Edit|Copy")
+            ),
+            self.copyActGrp,
+            "vm_edit_copy",
+        )
+        self.copyAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Copy the selection")
+        )
+        self.copyAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Copy</b>"""
+                """<p>Copy the selected text of the current editor to the"""
+                """ clipboard.</p>""",
+            )
+        )
         self.copyAct.triggered.connect(self.__editCopy)
         self.editActions.append(self.copyAct)
-        
+
         self.pasteAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Paste'),
+            QCoreApplication.translate("ViewManager", "Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            QCoreApplication.translate('ViewManager', '&Paste'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+V", "Edit|Paste")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Ins", "Edit|Paste")),
-            self.copyActGrp, 'vm_edit_paste')
-        self.pasteAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Paste the last cut/copied text'))
-        self.pasteAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Paste</b>"""
-            """<p>Paste the last cut/copied text from the clipboard to"""
-            """ the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Paste"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+V", "Edit|Paste")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Shift+Ins", "Edit|Paste")
+            ),
+            self.copyActGrp,
+            "vm_edit_paste",
+        )
+        self.pasteAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Paste the last cut/copied text")
+        )
+        self.pasteAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Paste</b>"""
+                """<p>Paste the last cut/copied text from the clipboard to"""
+                """ the current editor.</p>""",
+            )
+        )
         self.pasteAct.triggered.connect(self.__editPaste)
         self.editActions.append(self.pasteAct)
-        
+
         self.deleteAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear'),
+            QCoreApplication.translate("ViewManager", "Clear"),
             UI.PixmapCache.getIcon("editDelete"),
-            QCoreApplication.translate('ViewManager', 'Clear'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Shift+C", "Edit|Clear")),
-            0,
-            self.copyActGrp, 'vm_edit_clear')
-        self.deleteAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear all text'))
-        self.deleteAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear</b>"""
-            """<p>Delete all text of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Clear"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Alt+Shift+C", "Edit|Clear")
+            ),
+            0,
+            self.copyActGrp,
+            "vm_edit_clear",
+        )
+        self.deleteAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear all text")
+        )
+        self.deleteAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear</b>""" """<p>Delete all text of the current editor.</p>""",
+            )
+        )
         self.deleteAct.triggered.connect(self.__editDelete)
         self.editActions.append(self.deleteAct)
-        
+
         self.joinAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Join Lines'),
-            QCoreApplication.translate('ViewManager', 'Join Lines'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+J", "Edit|Join Lines")),
-            0,
-            self.editActGrp, 'vm_edit_join_lines')
-        self.joinAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Join Lines'))
-        self.joinAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Join Lines</b>"""
-            """<p>Join the current and the next lines.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Join Lines"),
+            QCoreApplication.translate("ViewManager", "Join Lines"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+J", "Edit|Join Lines")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_join_lines",
+        )
+        self.joinAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Join Lines")
+        )
+        self.joinAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Join Lines</b>"""
+                """<p>Join the current and the next lines.</p>""",
+            )
+        )
         self.joinAct.triggered.connect(self.__editJoin)
         self.editActions.append(self.joinAct)
-        
+
         self.indentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Indent'),
+            QCoreApplication.translate("ViewManager", "Indent"),
             UI.PixmapCache.getIcon("editIndent"),
-            QCoreApplication.translate('ViewManager', '&Indent'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+I", "Edit|Indent")),
-            0,
-            self.editActGrp, 'vm_edit_indent')
-        self.indentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Indent line'))
-        self.indentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Indent</b>"""
-            """<p>Indents the current line or the lines of the"""
-            """ selection by one level.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Indent"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+I", "Edit|Indent")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_indent",
+        )
+        self.indentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Indent line")
+        )
+        self.indentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Indent</b>"""
+                """<p>Indents the current line or the lines of the"""
+                """ selection by one level.</p>""",
+            )
+        )
         self.indentAct.triggered.connect(self.__editIndent)
         self.editActions.append(self.indentAct)
-        
+
         self.unindentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Unindent'),
+            QCoreApplication.translate("ViewManager", "Unindent"),
             UI.PixmapCache.getIcon("editUnindent"),
-            QCoreApplication.translate('ViewManager', 'U&nindent'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Shift+I", "Edit|Unindent")),
-            0,
-            self.editActGrp, 'vm_edit_unindent')
-        self.unindentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Unindent line'))
-        self.unindentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Unindent</b>"""
-            """<p>Unindents the current line or the lines of the"""
-            """ selection by one level.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "U&nindent"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Shift+I", "Edit|Unindent"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_unindent",
+        )
+        self.unindentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Unindent line")
+        )
+        self.unindentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Unindent</b>"""
+                """<p>Unindents the current line or the lines of the"""
+                """ selection by one level.</p>""",
+            )
+        )
         self.unindentAct.triggered.connect(self.__editUnindent)
         self.editActions.append(self.unindentAct)
-        
+
         self.smartIndentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Smart indent'),
+            QCoreApplication.translate("ViewManager", "Smart indent"),
             UI.PixmapCache.getIcon("editSmartIndent"),
-            QCoreApplication.translate('ViewManager', 'Smart indent'),
-            0, 0,
-            self.editActGrp, 'vm_edit_smart_indent')
-        self.smartIndentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Smart indent Line or Selection'))
-        self.smartIndentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Smart indent</b>"""
-            """<p>Indents the current line or the lines of the"""
-            """ current selection smartly.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Smart indent"),
+            0,
+            0,
+            self.editActGrp,
+            "vm_edit_smart_indent",
+        )
+        self.smartIndentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Smart indent Line or Selection")
+        )
+        self.smartIndentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Smart indent</b>"""
+                """<p>Indents the current line or the lines of the"""
+                """ current selection smartly.</p>""",
+            )
+        )
         self.smartIndentAct.triggered.connect(self.__editSmartIndent)
         self.editActions.append(self.smartIndentAct)
-        
+
         self.commentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Comment'),
+            QCoreApplication.translate("ViewManager", "Comment"),
             UI.PixmapCache.getIcon("editComment"),
-            QCoreApplication.translate('ViewManager', 'C&omment'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+M", "Edit|Comment")),
-            0,
-            self.editActGrp, 'vm_edit_comment')
-        self.commentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Comment Line or Selection'))
-        self.commentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Comment</b>"""
-            """<p>Comments the current line or the lines of the"""
-            """ current selection.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "C&omment"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+M", "Edit|Comment")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_comment",
+        )
+        self.commentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Comment Line or Selection")
+        )
+        self.commentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Comment</b>"""
+                """<p>Comments the current line or the lines of the"""
+                """ current selection.</p>""",
+            )
+        )
         self.commentAct.triggered.connect(self.__editComment)
         self.editActions.append(self.commentAct)
-        
+
         self.uncommentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Uncomment'),
+            QCoreApplication.translate("ViewManager", "Uncomment"),
             UI.PixmapCache.getIcon("editUncomment"),
-            QCoreApplication.translate('ViewManager', 'Unco&mment'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Shift+M", "Edit|Uncomment")),
-            0,
-            self.editActGrp, 'vm_edit_uncomment')
-        self.uncommentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Uncomment Line or Selection'))
-        self.uncommentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Uncomment</b>"""
-            """<p>Uncomments the current line or the lines of the"""
-            """ current selection.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Unco&mment"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Shift+M", "Edit|Uncomment"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_uncomment",
+        )
+        self.uncommentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Uncomment Line or Selection")
+        )
+        self.uncommentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Uncomment</b>"""
+                """<p>Uncomments the current line or the lines of the"""
+                """ current selection.</p>""",
+            )
+        )
         self.uncommentAct.triggered.connect(self.__editUncomment)
         self.editActions.append(self.uncommentAct)
-        
+
         self.toggleCommentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Toggle Comment'),
+            QCoreApplication.translate("ViewManager", "Toggle Comment"),
             UI.PixmapCache.getIcon("editToggleComment"),
-            QCoreApplication.translate('ViewManager', 'Toggle Comment'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+#", "Edit|Toggle Comment")),
-            0,
-            self.editActGrp, 'vm_edit_toggle_comment')
-        self.toggleCommentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Toggle the comment of the current line, selection or'
-            ' comment block'))
-        self.toggleCommentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Toggle Comment</b>"""
-            """<p>If the current line does not start with a block comment,"""
-            """ the current line or selection is commented. If it is already"""
-            """ commented, this comment block is uncommented. </p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Toggle Comment"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+#", "Edit|Toggle Comment"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_toggle_comment",
+        )
+        self.toggleCommentAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager",
+                "Toggle the comment of the current line, selection or" " comment block",
+            )
+        )
+        self.toggleCommentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Toggle Comment</b>"""
+                """<p>If the current line does not start with a block comment,"""
+                """ the current line or selection is commented. If it is already"""
+                """ commented, this comment block is uncommented. </p>""",
+            )
+        )
         self.toggleCommentAct.triggered.connect(self.__editToggleComment)
         self.editActions.append(self.toggleCommentAct)
-        
+
         self.streamCommentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Stream Comment'),
-            QCoreApplication.translate('ViewManager', 'Stream Comment'),
-            0, 0,
-            self.editActGrp, 'vm_edit_stream_comment')
-        self.streamCommentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Stream Comment Line or Selection'))
-        self.streamCommentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Stream Comment</b>"""
-            """<p>Stream comments the current line or the current"""
-            """ selection.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Stream Comment"),
+            QCoreApplication.translate("ViewManager", "Stream Comment"),
+            0,
+            0,
+            self.editActGrp,
+            "vm_edit_stream_comment",
+        )
+        self.streamCommentAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Stream Comment Line or Selection"
+            )
+        )
+        self.streamCommentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Stream Comment</b>"""
+                """<p>Stream comments the current line or the current"""
+                """ selection.</p>""",
+            )
+        )
         self.streamCommentAct.triggered.connect(self.__editStreamComment)
         self.editActions.append(self.streamCommentAct)
-        
+
         self.boxCommentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Box Comment'),
-            QCoreApplication.translate('ViewManager', 'Box Comment'),
-            0, 0,
-            self.editActGrp, 'vm_edit_box_comment')
-        self.boxCommentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Box Comment Line or Selection'))
-        self.boxCommentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Box Comment</b>"""
-            """<p>Box comments the current line or the lines of the"""
-            """ current selection.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Box Comment"),
+            QCoreApplication.translate("ViewManager", "Box Comment"),
+            0,
+            0,
+            self.editActGrp,
+            "vm_edit_box_comment",
+        )
+        self.boxCommentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Box Comment Line or Selection")
+        )
+        self.boxCommentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Box Comment</b>"""
+                """<p>Box comments the current line or the lines of the"""
+                """ current selection.</p>""",
+            )
+        )
         self.boxCommentAct.triggered.connect(self.__editBoxComment)
         self.editActions.append(self.boxCommentAct)
-        
+
         self.selectBraceAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Select to brace'),
-            QCoreApplication.translate('ViewManager', 'Select to &brace'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+E", "Edit|Select to brace")),
-            0,
-            self.editActGrp, 'vm_edit_select_to_brace')
-        self.selectBraceAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Select text to the matching brace'))
-        self.selectBraceAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Select to brace</b>"""
-            """<p>Select text of the current editor to the matching"""
-            """ brace.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Select to brace"),
+            QCoreApplication.translate("ViewManager", "Select to &brace"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+E", "Edit|Select to brace"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_select_to_brace",
+        )
+        self.selectBraceAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Select text to the matching brace"
+            )
+        )
+        self.selectBraceAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Select to brace</b>"""
+                """<p>Select text of the current editor to the matching"""
+                """ brace.</p>""",
+            )
+        )
         self.selectBraceAct.triggered.connect(self.__editSelectBrace)
         self.editActions.append(self.selectBraceAct)
-        
+
         self.selectAllAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Select all'),
+            QCoreApplication.translate("ViewManager", "Select all"),
             UI.PixmapCache.getIcon("editSelectAll"),
-            QCoreApplication.translate('ViewManager', '&Select all'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+A", "Edit|Select all")),
-            0,
-            self.editActGrp, 'vm_edit_select_all')
-        self.selectAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Select all text'))
-        self.selectAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Select All</b>"""
-            """<p>Select all text of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Select all"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+A", "Edit|Select all")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_select_all",
+        )
+        self.selectAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Select all text")
+        )
+        self.selectAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Select All</b>"""
+                """<p>Select all text of the current editor.</p>""",
+            )
+        )
         self.selectAllAct.triggered.connect(self.__editSelectAll)
         self.editActions.append(self.selectAllAct)
-        
+
         self.deselectAllAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Deselect all'),
-            QCoreApplication.translate('ViewManager', '&Deselect all'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Ctrl+A", "Edit|Deselect all")),
-            0,
-            self.editActGrp, 'vm_edit_deselect_all')
-        self.deselectAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Deselect all text'))
-        self.deselectAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Deselect All</b>"""
-            """<p>Deselect all text of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Deselect all"),
+            QCoreApplication.translate("ViewManager", "&Deselect all"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Alt+Ctrl+A", "Edit|Deselect all"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_deselect_all",
+        )
+        self.deselectAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Deselect all text")
+        )
+        self.deselectAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Deselect All</b>"""
+                """<p>Deselect all text of the current editor.</p>""",
+            )
+        )
         self.deselectAllAct.triggered.connect(self.__editDeselectAll)
         self.editActions.append(self.deselectAllAct)
-        
+
         self.convertEOLAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Convert Line End Characters'),
-            QCoreApplication.translate(
-                'ViewManager', 'Convert &Line End Characters'),
-            0, 0,
-            self.editActGrp, 'vm_edit_convert_eol')
-        self.convertEOLAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Convert Line End Characters'))
-        self.convertEOLAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Convert Line End Characters</b>"""
-            """<p>Convert the line end characters to the currently set"""
-            """ type.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Convert Line End Characters"),
+            QCoreApplication.translate("ViewManager", "Convert &Line End Characters"),
+            0,
+            0,
+            self.editActGrp,
+            "vm_edit_convert_eol",
+        )
+        self.convertEOLAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Convert Line End Characters")
+        )
+        self.convertEOLAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Convert Line End Characters</b>"""
+                """<p>Convert the line end characters to the currently set"""
+                """ type.</p>""",
+            )
+        )
         self.convertEOLAct.triggered.connect(self.__convertEOL)
         self.editActions.append(self.convertEOLAct)
-        
+
         self.shortenEmptyAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Shorten empty lines'),
-            QCoreApplication.translate('ViewManager', 'Shorten empty lines'),
-            0, 0,
-            self.editActGrp, 'vm_edit_shorten_empty_lines')
-        self.shortenEmptyAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Shorten empty lines'))
-        self.shortenEmptyAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Shorten empty lines</b>"""
-            """<p>Shorten lines consisting solely of whitespace"""
-            """ characters.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Shorten empty lines"),
+            QCoreApplication.translate("ViewManager", "Shorten empty lines"),
+            0,
+            0,
+            self.editActGrp,
+            "vm_edit_shorten_empty_lines",
+        )
+        self.shortenEmptyAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Shorten empty lines")
+        )
+        self.shortenEmptyAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Shorten empty lines</b>"""
+                """<p>Shorten lines consisting solely of whitespace"""
+                """ characters.</p>""",
+            )
+        )
         self.shortenEmptyAct.triggered.connect(self.__shortenEmptyLines)
         self.editActions.append(self.shortenEmptyAct)
-        
+
         self.autoCompleteAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Complete'),
-            QCoreApplication.translate('ViewManager', '&Complete'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Space", "Edit|Complete")),
-            0,
-            self.editActGrp, 'vm_edit_autocomplete')
-        self.autoCompleteAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Complete current word'))
-        self.autoCompleteAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Complete</b>"""
-            """<p>Performs a completion of the word containing"""
-            """ the cursor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Complete"),
+            QCoreApplication.translate("ViewManager", "&Complete"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Space", "Edit|Complete")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_autocomplete",
+        )
+        self.autoCompleteAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Complete current word")
+        )
+        self.autoCompleteAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Complete</b>"""
+                """<p>Performs a completion of the word containing"""
+                """ the cursor.</p>""",
+            )
+        )
         self.autoCompleteAct.triggered.connect(self.__editAutoComplete)
         self.editActions.append(self.autoCompleteAct)
-        
+
         self.autoCompleteFromDocAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Complete from Document'),
-            QCoreApplication.translate(
-                'ViewManager', 'Complete from Document'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Shift+Space",
-                "Edit|Complete from Document")),
-            0,
-            self.editActGrp, 'vm_edit_autocomplete_from_document')
-        self.autoCompleteFromDocAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Complete current word from Document'))
-        self.autoCompleteFromDocAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Complete from Document</b>"""
-            """<p>Performs a completion from document of the word"""
-            """ containing the cursor.</p>"""
-        ))
-        self.autoCompleteFromDocAct.triggered.connect(
-            self.__editAutoCompleteFromDoc)
+            QCoreApplication.translate("ViewManager", "Complete from Document"),
+            QCoreApplication.translate("ViewManager", "Complete from Document"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Shift+Space", "Edit|Complete from Document"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_autocomplete_from_document",
+        )
+        self.autoCompleteFromDocAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Complete current word from Document"
+            )
+        )
+        self.autoCompleteFromDocAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Complete from Document</b>"""
+                """<p>Performs a completion from document of the word"""
+                """ containing the cursor.</p>""",
+            )
+        )
+        self.autoCompleteFromDocAct.triggered.connect(self.__editAutoCompleteFromDoc)
         self.editActions.append(self.autoCompleteFromDocAct)
-        
+
         self.autoCompleteFromAPIsAct = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Complete from APIs'),
-            QCoreApplication.translate('ViewManager',
-                                       'Complete from APIs'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+Space",
-                "Edit|Complete from APIs")),
-            0,
-            self.editActGrp, 'vm_edit_autocomplete_from_api')
-        self.autoCompleteFromAPIsAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Complete current word from APIs'))
-        self.autoCompleteFromAPIsAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Complete from APIs</b>"""
-            """<p>Performs a completion from APIs of the word"""
-            """ containing the cursor.</p>"""
-        ))
-        self.autoCompleteFromAPIsAct.triggered.connect(
-            self.__editAutoCompleteFromAPIs)
+            QCoreApplication.translate("ViewManager", "Complete from APIs"),
+            QCoreApplication.translate("ViewManager", "Complete from APIs"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Alt+Space", "Edit|Complete from APIs"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_autocomplete_from_api",
+        )
+        self.autoCompleteFromAPIsAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Complete current word from APIs")
+        )
+        self.autoCompleteFromAPIsAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Complete from APIs</b>"""
+                """<p>Performs a completion from APIs of the word"""
+                """ containing the cursor.</p>""",
+            )
+        )
+        self.autoCompleteFromAPIsAct.triggered.connect(self.__editAutoCompleteFromAPIs)
         self.editActions.append(self.autoCompleteFromAPIsAct)
-        
+
         self.autoCompleteFromAllAct = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Complete from Document and APIs'),
-            QCoreApplication.translate(
-                'ViewManager', 'Complete from Document and APIs'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Shift+Space",
-                "Edit|Complete from Document and APIs")),
-            0,
-            self.editActGrp, 'vm_edit_autocomplete_from_all')
-        self.autoCompleteFromAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Complete current word from Document and APIs'))
-        self.autoCompleteFromAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Complete from Document and APIs</b>"""
-            """<p>Performs a completion from document and APIs"""
-            """ of the word containing the cursor.</p>"""
-        ))
-        self.autoCompleteFromAllAct.triggered.connect(
-            self.__editAutoCompleteFromAll)
+                "ViewManager", "Complete from Document and APIs"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Complete from Document and APIs"
+            ),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager",
+                    "Alt+Shift+Space",
+                    "Edit|Complete from Document and APIs",
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_autocomplete_from_all",
+        )
+        self.autoCompleteFromAllAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Complete current word from Document and APIs"
+            )
+        )
+        self.autoCompleteFromAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Complete from Document and APIs</b>"""
+                """<p>Performs a completion from document and APIs"""
+                """ of the word containing the cursor.</p>""",
+            )
+        )
+        self.autoCompleteFromAllAct.triggered.connect(self.__editAutoCompleteFromAll)
         self.editActions.append(self.autoCompleteFromAllAct)
-        
+
         self.calltipsAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Calltip'),
-            QCoreApplication.translate('ViewManager', '&Calltip'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Meta+Alt+Space", "Edit|Calltip")),
-            0,
-            self.editActGrp, 'vm_edit_calltip')
-        self.calltipsAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Show Calltips'))
-        self.calltipsAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Calltip</b>"""
-            """<p>Show calltips based on the characters immediately to the"""
-            """ left of the cursor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Calltip"),
+            QCoreApplication.translate("ViewManager", "&Calltip"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Meta+Alt+Space", "Edit|Calltip"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_calltip",
+        )
+        self.calltipsAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Show Calltips")
+        )
+        self.calltipsAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Calltip</b>"""
+                """<p>Show calltips based on the characters immediately to the"""
+                """ left of the cursor.</p>""",
+            )
+        )
         self.calltipsAct.triggered.connect(self.__editShowCallTips)
         self.editActions.append(self.calltipsAct)
-        
+
         self.codeInfoAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Code Info'),
+            QCoreApplication.translate("ViewManager", "Code Info"),
             UI.PixmapCache.getIcon("codeDocuViewer"),
-            QCoreApplication.translate('ViewManager', 'Code Info'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+I", "Edit|Code Info")),
-            0,
-            self.editActGrp, 'vm_edit_codeinfo')
-        self.codeInfoAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Show Code Info'))
-        self.codeInfoAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Code Info</b>"""
-            """<p>Show code information based on the cursor position.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Code Info"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Alt+I", "Edit|Code Info"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_codeinfo",
+        )
+        self.codeInfoAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Show Code Info")
+        )
+        self.codeInfoAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Code Info</b>"""
+                """<p>Show code information based on the cursor position.</p>""",
+            )
+        )
         self.codeInfoAct.triggered.connect(self.__editShowCodeInfo)
         self.editActions.append(self.codeInfoAct)
-        
+
         self.sortAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Sort'),
-            QCoreApplication.translate('ViewManager', 'Sort'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+S", "Edit|Sort")),
-            0,
-            self.editActGrp, 'vm_edit_sort')
-        self.sortAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Sort the lines containing the rectangular selection'))
-        self.sortAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Sort</b>"""
-            """<p>Sort the lines spanned by a rectangular selection based on"""
-            """ the selection ignoring leading and trailing whitespace.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Sort"),
+            QCoreApplication.translate("ViewManager", "Sort"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Alt+S", "Edit|Sort")
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_sort",
+        )
+        self.sortAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Sort the lines containing the rectangular selection"
+            )
+        )
+        self.sortAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Sort</b>"""
+                """<p>Sort the lines spanned by a rectangular selection based on"""
+                """ the selection ignoring leading and trailing whitespace.</p>""",
+            )
+        )
         self.sortAct.triggered.connect(self.__editSortSelectedLines)
         self.editActions.append(self.sortAct)
-        
+
         self.docstringAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Generate Docstring'),
-            QCoreApplication.translate('ViewManager', 'Generate Docstring'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+D", "Edit|Generate Docstring")),
-            0,
-            self.editActGrp, 'vm_edit_generate_docstring')
-        self.docstringAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Generate a docstring for the current function/method'))
-        self.docstringAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Generate Docstring</b>"""
-            """<p>Generate a docstring for the current function/method if"""
-            """ the cursor is placed on the line starting the function"""
-            """ definition or on the line thereafter. The docstring is"""
-            """ inserted at the appropriate position and the cursor is"""
-            """ placed at the end of the description line.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Generate Docstring"),
+            QCoreApplication.translate("ViewManager", "Generate Docstring"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Alt+D", "Edit|Generate Docstring"
+                )
+            ),
+            0,
+            self.editActGrp,
+            "vm_edit_generate_docstring",
+        )
+        self.docstringAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Generate a docstring for the current function/method"
+            )
+        )
+        self.docstringAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Generate Docstring</b>"""
+                """<p>Generate a docstring for the current function/method if"""
+                """ the cursor is placed on the line starting the function"""
+                """ definition or on the line thereafter. The docstring is"""
+                """ inserted at the appropriate position and the cursor is"""
+                """ placed at the end of the description line.</p>""",
+            )
+        )
         self.docstringAct.triggered.connect(self.__editInsertDocstring)
         self.editActions.append(self.docstringAct)
-        
+
         self.editActGrp.setEnabled(False)
         self.copyActGrp.setEnabled(False)
-        
+
         ####################################################################
         ## Below follow the actions for QScintilla standard commands.
         ####################################################################
-        
+
         self.esm = QSignalMapper(self)
         self.esm.mappedInt.connect(self.__editorCommand)
-        
+
         self.editorActGrp = createActionGroup(self.editActGrp)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Left')), 0,
-            self.editorActGrp, 'vm_edit_move_left_char')
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QCoreApplication.translate("ViewManager", "Move left one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_char",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFT)
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+B"))
+            )
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Right')),
-            0, self.editorActGrp, 'vm_edit_move_right_char')
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QCoreApplication.translate("ViewManager", "Move right one character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QCoreApplication.translate('ViewManager', 'Move up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Up')), 0,
-            self.editorActGrp, 'vm_edit_move_up_line')
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QCoreApplication.translate("ViewManager", "Move up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+P')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+P"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QCoreApplication.translate('ViewManager', 'Move down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Down')), 0,
-            self.editorActGrp, 'vm_edit_move_down_line')
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QCoreApplication.translate("ViewManager", "Move down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+N')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+N"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one word part'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move left one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_left_word_part')
+            QCoreApplication.translate("ViewManager", "Move left one word part"),
+            QCoreApplication.translate("ViewManager", "Move left one word part"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Left"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one word part'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move right one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_right_word_part')
+            QCoreApplication.translate("ViewManager", "Move right one word part"),
+            QCoreApplication.translate("ViewManager", "Move right one word part"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Right"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            QCoreApplication.translate('ViewManager', 'Move left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_left_word')
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            QCoreApplication.translate("ViewManager", "Move left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Left"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Left"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            QCoreApplication.translate('ViewManager', 'Move right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_right_word')
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            QCoreApplication.translate("ViewManager", "Move right one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_right_word",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Right"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Move to first visible character in document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_first_visible_char')
+                "ViewManager", "Move to first visible character in document line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Move to first visible character in document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOME)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Move to start of display line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Move to start of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_start_line')
+            QCoreApplication.translate("ViewManager", "Move to start of display line"),
+            QCoreApplication.translate("ViewManager", "Move to start of display line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_start_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Left')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Left"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of document line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_line')
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            QCoreApplication.translate("ViewManager", "Move to end of document line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view down one line'),
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Down')),
-            0, self.editorActGrp, 'vm_edit_scroll_down_line')
+            QCoreApplication.translate("ViewManager", "Scroll view down one line"),
+            QCoreApplication.translate("ViewManager", "Scroll view down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_down_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view up one line'),
-            QCoreApplication.translate('ViewManager',
-                                       'Scroll view up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+Up')),
-            0, self.editorActGrp, 'vm_edit_scroll_up_line')
+            QCoreApplication.translate("ViewManager", "Scroll view up one line"),
+            QCoreApplication.translate("ViewManager", "Scroll view up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_scroll_up_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINESCROLLUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one paragraph'),
-            QCoreApplication.translate('ViewManager', 'Move up one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Alt+Up')),
-            0, self.editorActGrp, 'vm_edit_move_up_para')
+            QCoreApplication.translate("ViewManager", "Move up one paragraph"),
+            QCoreApplication.translate("ViewManager", "Move up one paragraph"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARAUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move down one paragraph'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move down one paragraph'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Down')),
-            0, self.editorActGrp, 'vm_edit_move_down_para')
+            QCoreApplication.translate("ViewManager", "Move down one paragraph"),
+            QCoreApplication.translate("ViewManager", "Move down one paragraph"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARADOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QCoreApplication.translate('ViewManager', 'Move up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgUp')), 0,
-            self.editorActGrp, 'vm_edit_move_up_page')
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QCoreApplication.translate("ViewManager", "Move up one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUP)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QCoreApplication.translate('ViewManager', 'Move down one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'PgDown')),
-            0, self.editorActGrp, 'vm_edit_move_down_page')
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QCoreApplication.translate("ViewManager", "Move down one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_move_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+V')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+V"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWN)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move to start of document'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move to start of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_start_text')
+            QCoreApplication.translate("ViewManager", "Move to start of document"),
+            QCoreApplication.translate("ViewManager", "Move to start of document"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_start_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Up')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Up"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTART)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Move to end of document'),
-            QCoreApplication.translate('ViewManager',
-                                       'Move to end of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_text')
+            QCoreApplication.translate("ViewManager", "Move to end of document"),
+            QCoreApplication.translate("ViewManager", "Move to end of document"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Down')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Down"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QCoreApplication.translate('ViewManager', 'Indent one level'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Tab')), 0,
-            self.editorActGrp, 'vm_edit_indent_one_level')
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QCoreApplication.translate("ViewManager", "Indent one level"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Tab")),
+            0,
+            self.editorActGrp,
+            "vm_edit_indent_one_level",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_TAB)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Unindent one level'),
-            QCoreApplication.translate('ViewManager', 'Unindent one level'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Tab')),
-            0, self.editorActGrp, 'vm_edit_unindent_one_level')
+            QCoreApplication.translate("ViewManager", "Unindent one level"),
+            QCoreApplication.translate("ViewManager", "Unindent one level"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Tab")),
+            0,
+            self.editorActGrp,
+            "vm_edit_unindent_one_level",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_BACKTAB)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one character'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Left')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_left_char')
+                "ViewManager", "Extend selection left one character"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection left one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+B')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+B"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one character'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Right')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_right_char')
+                "ViewManager", "Extend selection right one character"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection right one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+F')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+F"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Up')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_up_line')
+            QCoreApplication.translate("ViewManager", "Extend selection up one line"),
+            QCoreApplication.translate("ViewManager", "Extend selection up one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+P')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+P"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Down')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_down_line')
+            QCoreApplication.translate("ViewManager", "Extend selection down one line"),
+            QCoreApplication.translate("ViewManager", "Extend selection down one line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+N')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+N"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word part'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_left_word_part')
+                "ViewManager", "Extend selection left one word part"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection left one word part"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Left")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word part'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word part'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_right_word_part')
+                "ViewManager", "Extend selection right one word part"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection right one word part"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_word_part",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDPARTRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection left one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_left_word')
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            QCoreApplication.translate("ViewManager", "Extend selection left one word"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_left_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Left")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Left')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Left")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection right one word'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_right_word')
+                "ViewManager", "Extend selection right one word"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection right one word"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_right_word",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend selection to first visible character in document'
-                ' line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_first_visible_char')
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
+            QCoreApplication.translate(
+                "ViewManager",
+                "Extend selection to first visible character in document" " line",
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Home')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Home"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_line')
+                "ViewManager", "Extend selection to end of document line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection to end of document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+E')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+E"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Shift+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one paragraph'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one paragraph'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Shift+Up')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_selection_up_para')
+                "ViewManager", "Extend selection up one paragraph"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection up one paragraph"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARAUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one paragraph'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one paragraph'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Shift+Down')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_selection_down_para')
+                "ViewManager", "Extend selection down one paragraph"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection down one paragraph"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_para",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PARADOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one page'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection up one page'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+PgUp')),
-            0, self.editorActGrp, 'vm_edit_extend_selection_up_page')
+            QCoreApplication.translate("ViewManager", "Extend selection up one page"),
+            QCoreApplication.translate("ViewManager", "Extend selection up one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one page'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection down one page'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Shift+PgDown')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_selection_down_page')
+            QCoreApplication.translate("ViewManager", "Extend selection down one page"),
+            QCoreApplication.translate("ViewManager", "Extend selection down one page"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Shift+V')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Shift+V"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to start of document'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection to start of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_start_text')
+                "ViewManager", "Extend selection to start of document"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection to start of document"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_start_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Up')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+Up"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Home')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Home")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTSTARTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of document'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_text')
+                "ViewManager", "Extend selection to end of document"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection to end of document"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_text",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Down')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Down")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+End')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+End")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DOCUMENTENDEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete previous character'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Backspace')),
-            0, self.editorActGrp, 'vm_edit_delete_previous_char')
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QCoreApplication.translate("ViewManager", "Delete previous character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Backspace")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_previous_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+H')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+H"))
+            )
         else:
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Shift+Backspace')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Shift+Backspace")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACK)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Delete previous character if not at start of line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Delete previous character if not at start of line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_delet_previous_char_not_line_start')
+                "ViewManager", "Delete previous character if not at start of line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Delete previous character if not at start of line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_delet_previous_char_not_line_start",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELETEBACKNOTLINE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QCoreApplication.translate('ViewManager',
-                                       'Delete current character'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Del')),
-            0, self.editorActGrp, 'vm_edit_delete_current_char')
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QCoreApplication.translate("ViewManager", "Delete current character"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_current_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+D')))
+            act.setAlternateShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+D"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CLEAR)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QCoreApplication.translate('ViewManager', 'Delete word to left'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Backspace')),
-            0,
-            self.editorActGrp, 'vm_edit_delete_word_left')
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QCoreApplication.translate("ViewManager", "Delete word to left"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Backspace")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_word_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDLEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QCoreApplication.translate('ViewManager', 'Delete word to right'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Ctrl+Del')),
-            0, self.editorActGrp, 'vm_edit_delete_word_right')
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QCoreApplication.translate("ViewManager", "Delete word to right"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Del")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_word_right",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QCoreApplication.translate('ViewManager', 'Delete line to left'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+Backspace')),
-            0,
-            self.editorActGrp, 'vm_edit_delete_line_left')
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QCoreApplication.translate("ViewManager", "Delete line to left"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+Shift+Backspace")
+            ),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_line_left",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINELEFT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            QCoreApplication.translate('ViewManager', 'Delete line to right'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_delete_line_right')
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            QCoreApplication.translate("ViewManager", "Delete line to right"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_line_right",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+K')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Meta+K"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Del')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Del")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_DELLINERIGHT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QCoreApplication.translate('ViewManager', 'Insert new line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Return')),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Enter')),
-            self.editorActGrp, 'vm_edit_insert_line')
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QCoreApplication.translate("ViewManager", "Insert new line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Return")),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Enter")),
+            self.editorActGrp,
+            "vm_edit_insert_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_NEWLINE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Insert new line below current line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Insert new line below current line'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Shift+Return')),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Shift+Enter')),
-            self.editorActGrp, 'vm_edit_insert_line_below')
+                "ViewManager", "Insert new line below current line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Insert new line below current line"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Return")),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Shift+Enter")),
+            self.editorActGrp,
+            "vm_edit_insert_line_below",
+        )
         act.triggered.connect(self.__newLineBelow)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QCoreApplication.translate('ViewManager', 'Delete current line'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+L')),
-            0,
-            self.editorActGrp, 'vm_edit_delete_current_line')
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QCoreApplication.translate("ViewManager", "Delete current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+L")),
+            0,
+            self.editorActGrp,
+            "vm_edit_delete_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDELETE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Duplicate current line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Duplicate current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+D')),
-            0, self.editorActGrp, 'vm_edit_duplicate_current_line')
+            QCoreApplication.translate("ViewManager", "Duplicate current line"),
+            QCoreApplication.translate("ViewManager", "Duplicate current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+D")),
+            0,
+            self.editorActGrp,
+            "vm_edit_duplicate_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDUPLICATE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Swap current and previous lines'),
-            QCoreApplication.translate(
-                'ViewManager', 'Swap current and previous lines'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ctrl+T')),
-            0, self.editorActGrp, 'vm_edit_swap_current_previous_line')
+                "ViewManager", "Swap current and previous lines"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Swap current and previous lines"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+T")),
+            0,
+            self.editorActGrp,
+            "vm_edit_swap_current_previous_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINETRANSPOSE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager',
-                                       'Reverse selected lines'),
-            QCoreApplication.translate('ViewManager',
-                                       'Reverse selected lines'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Meta+Alt+R')),
-            0, self.editorActGrp, 'vm_edit_reverse selected_lines')
+            QCoreApplication.translate("ViewManager", "Reverse selected lines"),
+            QCoreApplication.translate("ViewManager", "Reverse selected lines"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Meta+Alt+R")),
+            0,
+            self.editorActGrp,
+            "vm_edit_reverse selected_lines",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEREVERSE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Cut current line'),
-            QCoreApplication.translate('ViewManager', 'Cut current line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+L')),
-            0, self.editorActGrp, 'vm_edit_cut_current_line')
+            QCoreApplication.translate("ViewManager", "Cut current line"),
+            QCoreApplication.translate("ViewManager", "Cut current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+L")),
+            0,
+            self.editorActGrp,
+            "vm_edit_cut_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINECUT)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Copy current line'),
-            QCoreApplication.translate('ViewManager', 'Copy current line'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+T')),
-            0,
-            self.editorActGrp, 'vm_edit_copy_current_line')
+            QCoreApplication.translate("ViewManager", "Copy current line"),
+            QCoreApplication.translate("ViewManager", "Copy current line"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+T")),
+            0,
+            self.editorActGrp,
+            "vm_edit_copy_current_line",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_LINECOPY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Toggle insert/overtype'),
-            QCoreApplication.translate(
-                'ViewManager', 'Toggle insert/overtype'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Ins')),
-            0, self.editorActGrp, 'vm_edit_toggle_insert_overtype')
+            QCoreApplication.translate("ViewManager", "Toggle insert/overtype"),
+            QCoreApplication.translate("ViewManager", "Toggle insert/overtype"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ins")),
+            0,
+            self.editorActGrp,
+            "vm_edit_toggle_insert_overtype",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_EDITTOGGLEOVERTYPE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of display line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Move to end of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_move_end_displayed_line')
+            QCoreApplication.translate("ViewManager", "Move to end of display line"),
+            QCoreApplication.translate("ViewManager", "Move to end of display line"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_move_end_displayed_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Right')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Right"))
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAY)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of display line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend selection to end of display line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_selection_end_displayed_line')
+                "ViewManager", "Extend selection to end of display line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend selection to end of display line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_selection_end_displayed_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Ctrl+Shift+Right')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Ctrl+Shift+Right")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDDISPLAYEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Formfeed'),
-            QCoreApplication.translate('ViewManager', 'Formfeed'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_formfeed')
+            QCoreApplication.translate("ViewManager", "Formfeed"),
+            QCoreApplication.translate("ViewManager", "Formfeed"),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_formfeed",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_FORMFEED)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QCoreApplication.translate('ViewManager', 'Escape'),
-            QKeySequence(QCoreApplication.translate('ViewManager', 'Esc')), 0,
-            self.editorActGrp, 'vm_edit_escape')
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QCoreApplication.translate("ViewManager", "Escape"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Esc")),
+            0,
+            self.editorActGrp,
+            "vm_edit_escape",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_CANCEL)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend rectangular selection down one line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend rectangular selection down one line'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Ctrl+Down')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_down_line')
+                "ViewManager", "Extend rectangular selection down one line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection down one line"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Down")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_down_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+N')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+N")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEDOWNRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Extend rectangular selection up one line'),
-            QCoreApplication.translate(
-                'ViewManager', 'Extend rectangular selection up one line'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Ctrl+Up')),
-            0, self.editorActGrp, 'vm_edit_extend_rect_selection_up_line')
+                "ViewManager", "Extend rectangular selection up one line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection up one line"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Up")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_up_line",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+P')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+P")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEUPRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection left one character'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection left one character'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Ctrl+Left')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_left_char')
+                "ViewManager", "Extend rectangular selection left one character"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection left one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Left")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_left_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+B')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+B")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARLEFTRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection right one character'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection right one character'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Ctrl+Right')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_right_char')
+                "ViewManager", "Extend rectangular selection right one character"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection right one character"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Ctrl+Right")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_right_char",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+F')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+F")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_CHARRIGHTRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to first visible character in'
-                ' document line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to first visible character in'
-                ' document line'),
-            0, 0,
+                "ViewManager",
+                "Extend rectangular selection to first visible character in"
+                " document line",
+            ),
+            QCoreApplication.translate(
+                "ViewManager",
+                "Extend rectangular selection to first visible character in"
+                " document line",
+            ),
+            0,
+            0,
             self.editorActGrp,
-            'vm_edit_extend_rect_selection_first_visible_char')
+            "vm_edit_extend_rect_selection_first_visible_char",
+        )
         if not isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+Home')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Alt+Shift+Home")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_VCHOMERECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to end of document line'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection to end of document line'),
-            0, 0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_end_line')
+                "ViewManager", "Extend rectangular selection to end of document line"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection to end of document line"
+            ),
+            0,
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_end_line",
+        )
         if isMacPlatform():
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+E')))
+            act.setShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+E")
+                )
+            )
         else:
-            act.setShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Alt+Shift+End')))
+            act.setShortcut(
+                QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+End"))
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_LINEENDRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one page'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection up one page'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Shift+PgUp')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_up_page')
+                "ViewManager", "Extend rectangular selection up one page"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection up one page"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+PgUp")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_up_page",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEUPRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
             QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one page'),
-            QCoreApplication.translate(
-                'ViewManager',
-                'Extend rectangular selection down one page'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Alt+Shift+PgDown')),
-            0,
-            self.editorActGrp, 'vm_edit_extend_rect_selection_down_page')
+                "ViewManager", "Extend rectangular selection down one page"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Extend rectangular selection down one page"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+PgDown")),
+            0,
+            self.editorActGrp,
+            "vm_edit_extend_rect_selection_down_page",
+        )
         if isMacPlatform():
-            act.setAlternateShortcut(QKeySequence(
-                QCoreApplication.translate('ViewManager', 'Meta+Alt+Shift+V')))
+            act.setAlternateShortcut(
+                QKeySequence(
+                    QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+V")
+                )
+            )
         self.esm.setMapping(act, QsciScintilla.SCI_PAGEDOWNRECTEXTEND)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         act = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Duplicate current selection'),
-            QCoreApplication.translate(
-                'ViewManager', 'Duplicate current selection'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+D')),
-            0,
-            self.editorActGrp, 'vm_edit_duplicate_current_selection')
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QCoreApplication.translate("ViewManager", "Duplicate current selection"),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+D")),
+            0,
+            self.editorActGrp,
+            "vm_edit_duplicate_current_selection",
+        )
         self.esm.setMapping(act, QsciScintilla.SCI_SELECTIONDUPLICATE)
         act.triggered.connect(self.esm.map)
         self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_SCROLLTOSTART"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll to start of document'),
+                    "ViewManager", "Scroll to start of document"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll to start of document'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_start_text')
+                    "ViewManager", "Scroll to start of document"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_start_text",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Home')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Home"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_SCROLLTOSTART)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_SCROLLTOEND"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Scroll to end of document'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Scroll to end of document'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_end_text')
+                QCoreApplication.translate("ViewManager", "Scroll to end of document"),
+                QCoreApplication.translate("ViewManager", "Scroll to end of document"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_end_text",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'End')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "End"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_SCROLLTOEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VERTICALCENTRECARET"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll vertically to center current line'),
+                    "ViewManager", "Scroll vertically to center current line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Scroll vertically to center current line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_scroll_vertically_center')
+                    "ViewManager", "Scroll vertically to center current line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_scroll_vertically_center",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+L')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Meta+L"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_VERTICALCENTRECARET)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDRIGHTEND"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Move to end of next word'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Move to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_end_next_word')
+                QCoreApplication.translate("ViewManager", "Move to end of next word"),
+                QCoreApplication.translate("ViewManager", "Move to end of next word"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Alt+Right')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Right"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDRIGHTENDEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of next word'),
+                    "ViewManager", "Extend selection to end of next word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_end_next_word')
+                    "ViewManager", "Extend selection to end of next word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Alt+Shift+Right')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Alt+Shift+Right")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDRIGHTENDEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDLEFTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to end of previous word'),
+                    "ViewManager", "Move to end of previous word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to end of previous word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_end_previous_word')
+                    "ViewManager", "Move to end of previous word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_end_previous_word",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_WORDLEFTENDEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of previous word'),
+                    "ViewManager", "Extend selection to end of previous word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Extend selection to end of previous word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_end_previous_word')
+                    "ViewManager", "Extend selection to end of previous word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_end_previous_word",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_WORDLEFTENDEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOME"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to start of document line'),
+                    "ViewManager", "Move to start of document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move to start of document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_start_document_line')
+                    "ViewManager", "Move to start of document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_start_document_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+A')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Meta+A"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOME)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of document line'),
+                    "ViewManager", "Extend selection to start of document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of document line'),
-                0, 0,
+                    "ViewManager", "Extend selection to start of document line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_document_line')
+                "vm_edit_extend_selection_start_document_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Meta+Shift+A')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Meta+Shift+A")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMERECTEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend rectangular selection to start of document line'),
+                    "ViewManager",
+                    "Extend rectangular selection to start of document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend rectangular selection to start of document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_select_rect_start_line')
+                    "ViewManager",
+                    "Extend rectangular selection to start of document line",
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_select_rect_start_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Meta+Alt+Shift+A')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Meta+Alt+Shift+A")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMERECTEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEDISPLAYEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display line'),
+                    "ViewManager", "Extend selection to start of display line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display line'),
-                0, 0,
+                    "ViewManager", "Extend selection to start of display line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_display_line')
+                "vm_edit_extend_selection_start_display_line",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager',
-                                               'Ctrl+Shift+Left')))
+                act.setShortcut(
+                    QKeySequence(
+                        QCoreApplication.translate("ViewManager", "Ctrl+Shift+Left")
+                    )
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEDISPLAYEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to start of display or document line'),
+                    "ViewManager", "Move to start of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to start of display or document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_start_display_document_line')
+                    "ViewManager", "Move to start of display or document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_HOMEWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display or document line'),
+                    "ViewManager",
+                    "Extend selection to start of display or document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to start of display or document line'),
-                0, 0,
+                    "ViewManager",
+                    "Extend selection to start of display or document line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_start_display_document_line')
+                "vm_edit_extend_selection_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_HOMEWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VCHOMEWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to first visible character in display or document'
-                    ' line'),
+                    "ViewManager",
+                    "Move to first visible character in display or document" " line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to first visible character in display or document'
-                    ' line'),
-                0, 0,
+                    "ViewManager",
+                    "Move to first visible character in display or document" " line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_move_first_visible_char_document_line')
+                "vm_edit_move_first_visible_char_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_VCHOMEWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to first visible character in'
-                    ' display or document line'),
+                    "ViewManager",
+                    "Extend selection to first visible character in"
+                    " display or document line",
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to first visible character in'
-                    ' display or document line'),
-                0, 0,
+                    "ViewManager",
+                    "Extend selection to first visible character in"
+                    " display or document line",
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_first_visible_char_document_line')
+                "vm_edit_extend_selection_first_visible_char_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_VCHOMEWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_LINEENDWRAP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to end of display or document line'),
+                    "ViewManager", "Move to end of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Move to end of display or document line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_end_start_display_document_line')
+                    "ViewManager", "Move to end of display or document line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_end_start_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_LINEENDWRAP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_LINEENDWRAPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to end of display or document line'),
+                    "ViewManager", "Extend selection to end of display or document line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager',
-                    'Extend selection to end of display or document line'),
-                0, 0,
+                    "ViewManager", "Extend selection to end of display or document line"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_extend_selection_end_display_document_line')
+                "vm_edit_extend_selection_end_display_document_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_LINEENDWRAPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEUP"):
             act = EricAction(
-                QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move up one page'),
-                QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move up one page'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_stuttered_move_up_page')
+                QCoreApplication.translate("ViewManager", "Stuttered move up one page"),
+                QCoreApplication.translate("ViewManager", "Stuttered move up one page"),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_stuttered_move_up_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEUP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEUPEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered extend selection up one page'),
+                    "ViewManager", "Stuttered extend selection up one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered extend selection up one page'),
-                0, 0,
+                    "ViewManager", "Stuttered extend selection up one page"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_stuttered_extend_selection_up_page')
+                "vm_edit_stuttered_extend_selection_up_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEUPEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEDOWN"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move down one page'),
+                    "ViewManager", "Stuttered move down one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered move down one page'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_stuttered_move_down_page')
+                    "ViewManager", "Stuttered move down one page"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_stuttered_move_down_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEDOWN)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_STUTTEREDPAGEDOWNEXTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered extend selection down one page'),
+                    "ViewManager", "Stuttered extend selection down one page"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Stuttered extend selection down one page'),
-                0, 0,
+                    "ViewManager", "Stuttered extend selection down one page"
+                ),
+                0,
+                0,
                 self.editorActGrp,
-                'vm_edit_stuttered_extend_selection_down_page')
+                "vm_edit_stuttered_extend_selection_down_page",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_STUTTEREDPAGEDOWNEXTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_DELWORDRIGHTEND"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Delete right to end of next word'),
+                    "ViewManager", "Delete right to end of next word"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Delete right to end of next word'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_delete_right_end_next_word')
+                    "ViewManager", "Delete right to end of next word"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_delete_right_end_next_word",
+            )
             if isMacPlatform():
-                act.setShortcut(QKeySequence(
-                    QCoreApplication.translate('ViewManager', 'Alt+Del')))
+                act.setShortcut(
+                    QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Del"))
+                )
             self.esm.setMapping(act, QsciScintilla.SCI_DELWORDRIGHTEND)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_MOVESELECTEDLINESUP"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move selected lines up one line'),
+                    "ViewManager", "Move selected lines up one line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move selected lines up one line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_selection_up_one_line')
+                    "ViewManager", "Move selected lines up one line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_selection_up_one_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_MOVESELECTEDLINESUP)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         if hasattr(QsciScintilla, "SCI_MOVESELECTEDLINESDOWN"):
             act = EricAction(
                 QCoreApplication.translate(
-                    'ViewManager', 'Move selected lines down one line'),
+                    "ViewManager", "Move selected lines down one line"
+                ),
                 QCoreApplication.translate(
-                    'ViewManager', 'Move selected lines down one line'),
-                0, 0,
-                self.editorActGrp, 'vm_edit_move_selection_down_one_line')
+                    "ViewManager", "Move selected lines down one line"
+                ),
+                0,
+                0,
+                self.editorActGrp,
+                "vm_edit_move_selection_down_one_line",
+            )
             self.esm.setMapping(act, QsciScintilla.SCI_MOVESELECTEDLINESDOWN)
             act.triggered.connect(self.esm.map)
             self.editActions.append(act)
-        
+
         self.editorActGrp.setEnabled(False)
-        
+
         self.editLowerCaseAct = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Convert selection to lower case'),
-            QCoreApplication.translate(
-                'ViewManager', 'Convert selection to lower case'),
-            QKeySequence(QCoreApplication.translate('ViewManager',
-                                                    'Alt+Shift+U')),
-            0, self.editActGrp, 'vm_edit_convert_selection_lower')
+                "ViewManager", "Convert selection to lower case"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Convert selection to lower case"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Alt+Shift+U")),
+            0,
+            self.editActGrp,
+            "vm_edit_convert_selection_lower",
+        )
         self.esm.setMapping(self.editLowerCaseAct, QsciScintilla.SCI_LOWERCASE)
         self.editLowerCaseAct.triggered.connect(self.esm.map)
         self.editActions.append(self.editLowerCaseAct)
-        
+
         self.editUpperCaseAct = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Convert selection to upper case'),
-            QCoreApplication.translate(
-                'ViewManager', 'Convert selection to upper case'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', 'Ctrl+Shift+U')),
-            0,
-            self.editActGrp, 'vm_edit_convert_selection_upper')
+                "ViewManager", "Convert selection to upper case"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Convert selection to upper case"
+            ),
+            QKeySequence(QCoreApplication.translate("ViewManager", "Ctrl+Shift+U")),
+            0,
+            self.editActGrp,
+            "vm_edit_convert_selection_upper",
+        )
         self.esm.setMapping(self.editUpperCaseAct, QsciScintilla.SCI_UPPERCASE)
         self.editUpperCaseAct.triggered.connect(self.esm.map)
         self.editActions.append(self.editUpperCaseAct)
-    
+
     def initEditMenu(self):
         """
         Public method to create the Edit menu.
-        
+
         @return the generated menu
         """
         autocompletionMenu = QMenu(
-            QCoreApplication.translate('ViewManager', 'Complete'),
-            self.ui)
+            QCoreApplication.translate("ViewManager", "Complete"), self.ui
+        )
         autocompletionMenu.setTearOffEnabled(True)
         autocompletionMenu.addAction(self.autoCompleteAct)
         autocompletionMenu.addSeparator()
         autocompletionMenu.addAction(self.autoCompleteFromDocAct)
         autocompletionMenu.addAction(self.autoCompleteFromAPIsAct)
         autocompletionMenu.addAction(self.autoCompleteFromAllAct)
-        
-        menu = QMenu(QCoreApplication.translate('ViewManager', '&Edit'),
-                     self.ui)
+
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&Edit"), self.ui)
         menu.setTearOffEnabled(True)
         menu.addAction(self.undoAct)
         menu.addAction(self.redoAct)
@@ -2802,23 +3419,22 @@
         menu.addSeparator()
         menu.addAction(self.shortenEmptyAct)
         menu.addAction(self.convertEOLAct)
-        
+
         return menu
-        
+
     def initEditToolbar(self, toolbarManager):
         """
         Public method to create the Edit toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'Edit'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "Edit"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("EditToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'Edit'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "Edit"))
+
         tb.addAction(self.undoAct)
         tb.addAction(self.redoAct)
         tb.addSeparator()
@@ -2830,18 +3446,18 @@
         tb.addAction(self.commentAct)
         tb.addAction(self.uncommentAct)
         tb.addAction(self.toggleCommentAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.smartIndentAct, tb.windowTitle())
         toolbarManager.addAction(self.indentAct, tb.windowTitle())
         toolbarManager.addAction(self.unindentAct, tb.windowTitle())
-        
+
         return tb
-        
+
     ##################################################################
     ## Initialize the search related actions and the search toolbar
     ##################################################################
-    
+
     def __initSearchActions(self):
         """
         Private method defining the user interface actions for the search
@@ -2849,425 +3465,546 @@
         """
         self.searchActGrp = createActionGroup(self)
         self.searchOpenFilesActGrp = createActionGroup(self)
-        
+
         self.searchAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search'),
+            QCoreApplication.translate("ViewManager", "Search"),
             UI.PixmapCache.getIcon("find"),
-            QCoreApplication.translate('ViewManager', '&Search...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+F", "Search|Search")),
-            0,
-            self.searchActGrp, 'vm_search')
-        self.searchAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text'))
-        self.searchAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search</b>"""
-            """<p>Search for some text in the current editor. A"""
-            """ dialog is shown to enter the searchtext and options"""
-            """ for the search.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Search..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+F", "Search|Search")
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search",
+        )
+        self.searchAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search for a text")
+        )
+        self.searchAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search</b>"""
+                """<p>Search for some text in the current editor. A"""
+                """ dialog is shown to enter the searchtext and options"""
+                """ for the search.</p>""",
+            )
+        )
         self.searchAct.triggered.connect(self.showSearchWidget)
         self.searchActions.append(self.searchAct)
-        
+
         self.searchNextAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Search next'),
+            QCoreApplication.translate("ViewManager", "Search next"),
             UI.PixmapCache.getIcon("findNext"),
-            QCoreApplication.translate('ViewManager', 'Search &next'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "F3", "Search|Search next")),
-            0,
-            self.searchActGrp, 'vm_search_next')
-        self.searchNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search next occurrence of text'))
-        self.searchNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search next</b>"""
-            """<p>Search the next occurrence of some text in the current"""
-            """ editor. The previously entered searchtext and options are"""
-            """ reused.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search &next"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "F3", "Search|Search next")
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_next",
+        )
+        self.searchNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search next occurrence of text")
+        )
+        self.searchNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search next</b>"""
+                """<p>Search the next occurrence of some text in the current"""
+                """ editor. The previously entered searchtext and options are"""
+                """ reused.</p>""",
+            )
+        )
         self.searchNextAct.triggered.connect(self.__searchNext)
         self.searchActions.append(self.searchNextAct)
-        
+
         self.searchPrevAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search previous'),
+            QCoreApplication.translate("ViewManager", "Search previous"),
             UI.PixmapCache.getIcon("findPrev"),
-            QCoreApplication.translate('ViewManager', 'Search &previous'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+F3", "Search|Search previous")),
-            0,
-            self.searchActGrp, 'vm_search_previous')
-        self.searchPrevAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search previous occurrence of text'))
-        self.searchPrevAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search previous</b>"""
-            """<p>Search the previous occurrence of some text in the current"""
-            """ editor. The previously entered searchtext and options are"""
-            """ reused.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search &previous"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+F3", "Search|Search previous"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_previous",
+        )
+        self.searchPrevAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search previous occurrence of text"
+            )
+        )
+        self.searchPrevAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search previous</b>"""
+                """<p>Search the previous occurrence of some text in the current"""
+                """ editor. The previously entered searchtext and options are"""
+                """ reused.</p>""",
+            )
+        )
         self.searchPrevAct.triggered.connect(self.__searchPrev)
         self.searchActions.append(self.searchPrevAct)
-        
+
         self.searchClearMarkersAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear search markers'),
+            QCoreApplication.translate("ViewManager", "Clear search markers"),
             UI.PixmapCache.getIcon("findClear"),
-            QCoreApplication.translate('ViewManager', 'Clear search markers'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+3", "Search|Clear search markers")),
-            0,
-            self.searchActGrp, 'vm_clear_search_markers')
-        self.searchClearMarkersAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear all displayed search markers'))
-        self.searchClearMarkersAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear search markers</b>"""
-            """<p>Clear all displayed search markers.</p>"""
-        ))
-        self.searchClearMarkersAct.triggered.connect(
-            self.__searchClearMarkers)
+            QCoreApplication.translate("ViewManager", "Clear search markers"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+3", "Search|Clear search markers"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_clear_search_markers",
+        )
+        self.searchClearMarkersAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Clear all displayed search markers"
+            )
+        )
+        self.searchClearMarkersAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear search markers</b>"""
+                """<p>Clear all displayed search markers.</p>""",
+            )
+        )
+        self.searchClearMarkersAct.triggered.connect(self.__searchClearMarkers)
         self.searchActions.append(self.searchClearMarkersAct)
-        
+
         self.searchNextWordAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Search current word forward'),
+            QCoreApplication.translate("ViewManager", "Search current word forward"),
             UI.PixmapCache.getIcon("findWordNext"),
-            QCoreApplication.translate(
-                'ViewManager', 'Search current word forward'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Ctrl+.", "Search|Search current word forward")),
-            0,
-            self.searchActGrp, 'vm_search_word_next')
-        self.searchNextWordAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Search next occurrence of the current word'))
-        self.searchNextWordAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search current word forward</b>"""
-            """<p>Search the next occurrence of the current word of the"""
-            """ current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search current word forward"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+.", "Search|Search current word forward"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_word_next",
+        )
+        self.searchNextWordAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search next occurrence of the current word"
+            )
+        )
+        self.searchNextWordAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search current word forward</b>"""
+                """<p>Search the next occurrence of the current word of the"""
+                """ current editor.</p>""",
+            )
+        )
         self.searchNextWordAct.triggered.connect(self.__findNextWord)
         self.searchActions.append(self.searchNextWordAct)
-        
+
         self.searchPrevWordAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Search current word backward'),
+            QCoreApplication.translate("ViewManager", "Search current word backward"),
             UI.PixmapCache.getIcon("findWordPrev"),
-            QCoreApplication.translate(
-                'ViewManager', 'Search current word backward'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Ctrl+,", "Search|Search current word backward")),
-            0,
-            self.searchActGrp, 'vm_search_word_previous')
-        self.searchPrevWordAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Search previous occurrence of the current word'))
-        self.searchPrevWordAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search current word backward</b>"""
-            """<p>Search the previous occurrence of the current word of the"""
-            """ current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search current word backward"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+,", "Search|Search current word backward"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_word_previous",
+        )
+        self.searchPrevWordAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search previous occurrence of the current word"
+            )
+        )
+        self.searchPrevWordAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search current word backward</b>"""
+                """<p>Search the previous occurrence of the current word of the"""
+                """ current editor.</p>""",
+            )
+        )
         self.searchPrevWordAct.triggered.connect(self.__findPrevWord)
         self.searchActions.append(self.searchPrevWordAct)
-        
+
         self.replaceAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Replace'),
-            QCoreApplication.translate('ViewManager', '&Replace...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+R", "Search|Replace")),
-            0,
-            self.searchActGrp, 'vm_search_replace')
-        self.replaceAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace some text'))
-        self.replaceAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace</b>"""
-            """<p>Search for some text in the current editor and replace it."""
-            """ A dialog is shown to enter the searchtext, the replacement"""
-            """ text and options for the search and replace.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Replace"),
+            QCoreApplication.translate("ViewManager", "&Replace..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+R", "Search|Replace")
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_replace",
+        )
+        self.replaceAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace some text")
+        )
+        self.replaceAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace</b>"""
+                """<p>Search for some text in the current editor and replace it."""
+                """ A dialog is shown to enter the searchtext, the replacement"""
+                """ text and options for the search and replace.</p>""",
+            )
+        )
         self.replaceAct.triggered.connect(self.showReplaceWidget)
         self.searchActions.append(self.replaceAct)
-        
+
         self.replaceAndSearchAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace and Search'),
+            QCoreApplication.translate("ViewManager", "Replace and Search"),
             UI.PixmapCache.getIcon("editReplaceSearch"),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace and Search'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Meta+R", "Search|Replace and Search")),
-            0,
-            self.searchActGrp, 'vm_replace_search')
-        self.replaceAndSearchAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Replace the found text and search the next occurrence'))
-        self.replaceAndSearchAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace and Search</b>"""
-            """<p>Replace the found occurrence of text in the current"""
-            """ editor and search for the next one. The previously entered"""
-            """ search text and options are reused.</p>"""
-        ))
-        self.replaceAndSearchAct.triggered.connect(
-            self.__replaceWidget.replaceSearch)
+            QCoreApplication.translate("ViewManager", "Replace and Search"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Meta+R", "Search|Replace and Search"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_replace_search",
+        )
+        self.replaceAndSearchAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Replace the found text and search the next occurrence"
+            )
+        )
+        self.replaceAndSearchAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace and Search</b>"""
+                """<p>Replace the found occurrence of text in the current"""
+                """ editor and search for the next one. The previously entered"""
+                """ search text and options are reused.</p>""",
+            )
+        )
+        self.replaceAndSearchAct.triggered.connect(self.__replaceWidget.replaceSearch)
         self.searchActions.append(self.replaceAndSearchAct)
-        
+
         self.replaceSelectionAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace Occurrence'),
+            QCoreApplication.translate("ViewManager", "Replace Occurrence"),
             UI.PixmapCache.getIcon("editReplace"),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace Occurrence'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Meta+R", "Search|Replace Occurrence")),
-            0,
-            self.searchActGrp, 'vm_replace_occurrence')
-        self.replaceSelectionAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace the found text'))
-        self.replaceSelectionAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace Occurrence</b>"""
-            """<p>Replace the found occurrence of the search text in the"""
-            """ current editor.</p>"""
-        ))
-        self.replaceSelectionAct.triggered.connect(
-            self.__replaceWidget.replace)
+            QCoreApplication.translate("ViewManager", "Replace Occurrence"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Meta+R", "Search|Replace Occurrence"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_replace_occurrence",
+        )
+        self.replaceSelectionAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace the found text")
+        )
+        self.replaceSelectionAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace Occurrence</b>"""
+                """<p>Replace the found occurrence of the search text in the"""
+                """ current editor.</p>""",
+            )
+        )
+        self.replaceSelectionAct.triggered.connect(self.__replaceWidget.replace)
         self.searchActions.append(self.replaceSelectionAct)
-        
+
         self.replaceAllAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace All'),
+            QCoreApplication.translate("ViewManager", "Replace All"),
             UI.PixmapCache.getIcon("editReplaceAll"),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace All'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Meta+R", "Search|Replace All")),
-            0,
-            self.searchActGrp, 'vm_replace_all')
-        self.replaceAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Replace search text occurrences'))
-        self.replaceAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace All</b>"""
-            """<p>Replace all occurrences of the search text in the current"""
-            """ editor.</p>"""
-        ))
-        self.replaceAllAct.triggered.connect(
-            self.__replaceWidget.replaceAll)
+            QCoreApplication.translate("ViewManager", "Replace All"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+Meta+R", "Search|Replace All"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_replace_all",
+        )
+        self.replaceAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Replace search text occurrences")
+        )
+        self.replaceAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace All</b>"""
+                """<p>Replace all occurrences of the search text in the current"""
+                """ editor.</p>""",
+            )
+        )
+        self.replaceAllAct.triggered.connect(self.__replaceWidget.replaceAll)
         self.searchActions.append(self.replaceAllAct)
-        
+
         self.gotoAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Goto Line'),
+            QCoreApplication.translate("ViewManager", "Goto Line"),
             UI.PixmapCache.getIcon("goto"),
-            QCoreApplication.translate('ViewManager', '&Goto Line...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+G", "Search|Goto Line")),
-            0,
-            self.searchActGrp, 'vm_search_goto_line')
-        self.gotoAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Goto Line'))
-        self.gotoAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Line</b>"""
-            """<p>Go to a specific line of text in the current editor."""
-            """ A dialog is shown to enter the linenumber.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Goto Line..."),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+G", "Search|Goto Line")
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_goto_line",
+        )
+        self.gotoAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Goto Line")
+        )
+        self.gotoAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Line</b>"""
+                """<p>Go to a specific line of text in the current editor."""
+                """ A dialog is shown to enter the linenumber.</p>""",
+            )
+        )
         self.gotoAct.triggered.connect(self.__goto)
         self.searchActions.append(self.gotoAct)
-        
+
         self.gotoBraceAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Goto Brace'),
+            QCoreApplication.translate("ViewManager", "Goto Brace"),
             UI.PixmapCache.getIcon("gotoBrace"),
-            QCoreApplication.translate('ViewManager', 'Goto &Brace'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+L", "Search|Goto Brace")),
-            0,
-            self.searchActGrp, 'vm_search_goto_brace')
-        self.gotoBraceAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Goto Brace'))
-        self.gotoBraceAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Brace</b>"""
-            """<p>Go to the matching brace in the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Goto &Brace"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+L", "Search|Goto Brace")
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_goto_brace",
+        )
+        self.gotoBraceAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Goto Brace")
+        )
+        self.gotoBraceAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Brace</b>"""
+                """<p>Go to the matching brace in the current editor.</p>""",
+            )
+        )
         self.gotoBraceAct.triggered.connect(self.__gotoBrace)
         self.searchActions.append(self.gotoBraceAct)
-        
+
         self.gotoLastEditAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Last Edit Location'),
+            QCoreApplication.translate("ViewManager", "Goto Last Edit Location"),
             UI.PixmapCache.getIcon("gotoLastEditPosition"),
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Last &Edit Location'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Ctrl+Shift+G", "Search|Goto Last Edit Location")),
-            0,
-            self.searchActGrp, 'vm_search_goto_last_edit_location')
+            QCoreApplication.translate("ViewManager", "Goto Last &Edit Location"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Shift+G", "Search|Goto Last Edit Location"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_goto_last_edit_location",
+        )
         self.gotoLastEditAct.setStatusTip(
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Last Edit Location'))
-        self.gotoLastEditAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Last Edit Location</b>"""
-            """<p>Go to the location of the last edit in the current"""
-            """ editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Goto Last Edit Location")
+        )
+        self.gotoLastEditAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Last Edit Location</b>"""
+                """<p>Go to the location of the last edit in the current"""
+                """ editor.</p>""",
+            )
+        )
         self.gotoLastEditAct.triggered.connect(self.__gotoLastEditPosition)
         self.searchActions.append(self.gotoLastEditAct)
-        
+
         self.gotoPreviousDefAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Previous Method or Class'),
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Previous Method or Class'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Ctrl+Shift+Up", "Search|Goto Previous Method or Class")),
-            0,
-            self.searchActGrp, 'vm_search_goto_previous_method_or_class')
+            QCoreApplication.translate("ViewManager", "Goto Previous Method or Class"),
+            QCoreApplication.translate("ViewManager", "Goto Previous Method or Class"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager",
+                    "Ctrl+Shift+Up",
+                    "Search|Goto Previous Method or Class",
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_goto_previous_method_or_class",
+        )
         self.gotoPreviousDefAct.setStatusTip(
             QCoreApplication.translate(
-                'ViewManager',
-                'Go to the previous method or class definition'))
-        self.gotoPreviousDefAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Previous Method or Class</b>"""
-            """<p>Goes to the line of the previous method or class"""
-            """ definition and highlights the name.</p>"""
-        ))
-        self.gotoPreviousDefAct.triggered.connect(
-            self.__gotoPreviousMethodClass)
+                "ViewManager", "Go to the previous method or class definition"
+            )
+        )
+        self.gotoPreviousDefAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Previous Method or Class</b>"""
+                """<p>Goes to the line of the previous method or class"""
+                """ definition and highlights the name.</p>""",
+            )
+        )
+        self.gotoPreviousDefAct.triggered.connect(self.__gotoPreviousMethodClass)
         self.searchActions.append(self.gotoPreviousDefAct)
-        
+
         self.gotoNextDefAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Next Method or Class'),
-            QCoreApplication.translate(
-                'ViewManager', 'Goto Next Method or Class'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Ctrl+Shift+Down", "Search|Goto Next Method or Class")),
-            0,
-            self.searchActGrp, 'vm_search_goto_next_method_or_class')
-        self.gotoNextDefAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Go to the next method or class definition'))
-        self.gotoNextDefAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Next Method or Class</b>"""
-            """<p>Goes to the line of the next method or class definition"""
-            """ and highlights the name.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Goto Next Method or Class"),
+            QCoreApplication.translate("ViewManager", "Goto Next Method or Class"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Shift+Down", "Search|Goto Next Method or Class"
+                )
+            ),
+            0,
+            self.searchActGrp,
+            "vm_search_goto_next_method_or_class",
+        )
+        self.gotoNextDefAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Go to the next method or class definition"
+            )
+        )
+        self.gotoNextDefAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Next Method or Class</b>"""
+                """<p>Goes to the line of the next method or class definition"""
+                """ and highlights the name.</p>""",
+            )
+        )
         self.gotoNextDefAct.triggered.connect(self.__gotoNextMethodClass)
         self.searchActions.append(self.gotoNextDefAct)
-        
+
         self.searchActGrp.setEnabled(False)
-        
+
         self.searchFilesAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Search in Files'),
+            QCoreApplication.translate("ViewManager", "Search in Files"),
             UI.PixmapCache.getIcon("projectFind"),
-            QCoreApplication.translate('ViewManager', 'Search in &Files...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Ctrl+F", "Search|Search Files")),
-            0,
-            self, 'vm_search_in_files')
-        self.searchFilesAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text in files'))
-        self.searchFilesAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search in Files</b>"""
-            """<p>Search for some text in the files of a directory tree"""
-            """ or the project. A window is shown to enter the searchtext"""
-            """ and options for the search and to display the result.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search in &Files..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+Ctrl+F", "Search|Search Files"
+                )
+            ),
+            0,
+            self,
+            "vm_search_in_files",
+        )
+        self.searchFilesAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search for a text in files")
+        )
+        self.searchFilesAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search in Files</b>"""
+                """<p>Search for some text in the files of a directory tree"""
+                """ or the project. A window is shown to enter the searchtext"""
+                """ and options for the search and to display the result.</p>""",
+            )
+        )
         self.searchFilesAct.triggered.connect(self.__searchFiles)
         self.searchActions.append(self.searchFilesAct)
-        
+
         self.replaceFilesAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Replace in Files'),
-            QCoreApplication.translate('ViewManager', 'Replace in F&iles...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+Ctrl+R", "Search|Replace in Files")),
-            0,
-            self, 'vm_replace_in_files')
-        self.replaceFilesAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text in files and replace it'))
-        self.replaceFilesAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace in Files</b>"""
-            """<p>Search for some text in the files of a directory tree"""
-            """ or the project and replace it. A window is shown to enter"""
-            """ the searchtext, the replacement text and options for the"""
-            """ search and to display the result.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Replace in Files"),
+            QCoreApplication.translate("ViewManager", "Replace in F&iles..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+Ctrl+R", "Search|Replace in Files"
+                )
+            ),
+            0,
+            self,
+            "vm_replace_in_files",
+        )
+        self.replaceFilesAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search for a text in files and replace it"
+            )
+        )
+        self.replaceFilesAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace in Files</b>"""
+                """<p>Search for some text in the files of a directory tree"""
+                """ or the project and replace it. A window is shown to enter"""
+                """ the searchtext, the replacement text and options for the"""
+                """ search and to display the result.</p>""",
+            )
+        )
         self.replaceFilesAct.triggered.connect(self.__replaceFiles)
         self.searchActions.append(self.replaceFilesAct)
-        
+
         self.searchOpenFilesAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Search in Open Files'),
+            QCoreApplication.translate("ViewManager", "Search in Open Files"),
             UI.PixmapCache.getIcon("documentFind"),
-            QCoreApplication.translate(
-                'ViewManager', 'Search in Open Files...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Meta+Ctrl+Alt+F", "Search|Search Open Files")),
-            0,
-            self.searchOpenFilesActGrp, 'vm_search_in_open_files')
-        self.searchOpenFilesAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text in open files'))
-        self.searchOpenFilesAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Search in Open Files</b>"""
-            """<p>Search for some text in the currently opened files."""
-            """ A window is shown to enter the search text"""
-            """ and options for the search and to display the result.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Search in Open Files..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Meta+Ctrl+Alt+F", "Search|Search Open Files"
+                )
+            ),
+            0,
+            self.searchOpenFilesActGrp,
+            "vm_search_in_open_files",
+        )
+        self.searchOpenFilesAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Search for a text in open files")
+        )
+        self.searchOpenFilesAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Search in Open Files</b>"""
+                """<p>Search for some text in the currently opened files."""
+                """ A window is shown to enter the search text"""
+                """ and options for the search and to display the result.</p>""",
+            )
+        )
         self.searchOpenFilesAct.triggered.connect(self.__searchOpenFiles)
         self.searchActions.append(self.searchOpenFilesAct)
-        
+
         self.replaceOpenFilesAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Replace in Open Files'),
-            QCoreApplication.translate(
-                'ViewManager', 'Replace in Open Files...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager',
-                "Meta+Ctrl+Alt+R", "Search|Replace in Open Files")),
-            0,
-            self.searchOpenFilesActGrp, 'vm_replace_in_open_files')
-        self.replaceOpenFilesAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Search for a text in open files and replace it'))
-        self.replaceOpenFilesAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Replace in Open Files</b>"""
-            """<p>Search for some text in the currently opened files"""
-            """ and replace it. A window is shown to enter"""
-            """ the search text, the replacement text and options for the"""
-            """ search and to display the result.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Replace in Open Files"),
+            QCoreApplication.translate("ViewManager", "Replace in Open Files..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Meta+Ctrl+Alt+R", "Search|Replace in Open Files"
+                )
+            ),
+            0,
+            self.searchOpenFilesActGrp,
+            "vm_replace_in_open_files",
+        )
+        self.replaceOpenFilesAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Search for a text in open files and replace it"
+            )
+        )
+        self.replaceOpenFilesAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Replace in Open Files</b>"""
+                """<p>Search for some text in the currently opened files"""
+                """ and replace it. A window is shown to enter"""
+                """ the search text, the replacement text and options for the"""
+                """ search and to display the result.</p>""",
+            )
+        )
         self.replaceOpenFilesAct.triggered.connect(self.__replaceOpenFiles)
         self.searchActions.append(self.replaceOpenFilesAct)
-        
+
         self.searchOpenFilesActGrp.setEnabled(False)
-    
+
     def initSearchMenu(self):
         """
         Public method to create the Search menu.
-        
+
         @return the generated menu
         @rtype QMenu
         """
-        menu = QMenu(
-            QCoreApplication.translate('ViewManager', '&Search'),
-            self.ui)
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&Search"), self.ui)
         menu.setTearOffEnabled(True)
         menu.addAction(self.searchAct)
         menu.addAction(self.searchNextAct)
@@ -3283,24 +4020,23 @@
         menu.addSeparator()
         menu.addAction(self.searchOpenFilesAct)
         menu.addAction(self.replaceOpenFilesAct)
-        
+
         return menu
-        
+
     def initSearchToolbar(self, toolbarManager):
         """
         Public method to create the Search toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
         @type EricToolBarManager
         @return generated toolbar
         @rtype QToolBar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'Search'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "Search"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("SearchToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'Search'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "Search"))
+
         tb.addAction(self.searchAct)
         tb.addAction(self.searchNextAct)
         tb.addAction(self.searchPrevAct)
@@ -3313,25 +4049,24 @@
         tb.addAction(self.searchOpenFilesAct)
         tb.addSeparator()
         tb.addAction(self.gotoLastEditAct)
-        
+
         tb.setAllowedAreas(
-            Qt.ToolBarArea.TopToolBarArea |
-            Qt.ToolBarArea.BottomToolBarArea
-        )
-        
+            Qt.ToolBarArea.TopToolBarArea | Qt.ToolBarArea.BottomToolBarArea
+        )
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.gotoAct, tb.windowTitle())
         toolbarManager.addAction(self.gotoBraceAct, tb.windowTitle())
         toolbarManager.addAction(self.replaceSelectionAct, tb.windowTitle())
         toolbarManager.addAction(self.replaceAllAct, tb.windowTitle())
         toolbarManager.addAction(self.replaceAndSearchAct, tb.windowTitle())
-        
+
         return tb
-    
+
     ##################################################################
     ## Initialize the view related actions, view menu and toolbar
     ##################################################################
-    
+
     def __initViewActions(self):
         """
         Private method defining the user interface actions for the view
@@ -3339,328 +4074,474 @@
         """
         self.viewActGrp = createActionGroup(self)
         self.viewFoldActGrp = createActionGroup(self)
-        
+
         self.zoomInAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom in'),
+            QCoreApplication.translate("ViewManager", "Zoom in"),
             UI.PixmapCache.getIcon("zoomIn"),
-            QCoreApplication.translate('ViewManager', 'Zoom &in'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl++", "View|Zoom in")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom In", "View|Zoom in")),
-            self.viewActGrp, 'vm_view_zoom_in')
-        self.zoomInAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom in on the text'))
-        self.zoomInAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom in</b>"""
-            """<p>Zoom in on the text. This makes the text bigger.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &in"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl++", "View|Zoom in")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom In", "View|Zoom in")
+            ),
+            self.viewActGrp,
+            "vm_view_zoom_in",
+        )
+        self.zoomInAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom in on the text")
+        )
+        self.zoomInAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the text. This makes the text bigger.</p>""",
+            )
+        )
         self.zoomInAct.triggered.connect(self.__zoomIn)
         self.viewActions.append(self.zoomInAct)
-        
+
         self.zoomOutAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom out'),
+            QCoreApplication.translate("ViewManager", "Zoom out"),
             UI.PixmapCache.getIcon("zoomOut"),
-            QCoreApplication.translate('ViewManager', 'Zoom &out'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+-", "View|Zoom out")),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Zoom Out", "View|Zoom out")),
-            self.viewActGrp, 'vm_view_zoom_out')
-        self.zoomOutAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom out on the text'))
-        self.zoomOutAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom out</b>"""
-            """<p>Zoom out on the text. This makes the text smaller.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &out"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+-", "View|Zoom out")
+            ),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Zoom Out", "View|Zoom out")
+            ),
+            self.viewActGrp,
+            "vm_view_zoom_out",
+        )
+        self.zoomOutAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom out on the text")
+        )
+        self.zoomOutAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the text. This makes the text smaller.</p>""",
+            )
+        )
         self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.viewActions.append(self.zoomOutAct)
-        
+
         self.zoomResetAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom reset'),
+            QCoreApplication.translate("ViewManager", "Zoom reset"),
             UI.PixmapCache.getIcon("zoomReset"),
-            QCoreApplication.translate('ViewManager', 'Zoom &reset'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+0", "View|Zoom reset")),
-            0,
-            self.viewActGrp, 'vm_view_zoom_reset')
-        self.zoomResetAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Reset the zoom of the text'))
-        self.zoomResetAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom reset</b>"""
-            """<p>Reset the zoom of the text. """
-            """This sets the zoom factor to 100%.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Zoom &reset"),
+            QKeySequence(
+                QCoreApplication.translate("ViewManager", "Ctrl+0", "View|Zoom reset")
+            ),
+            0,
+            self.viewActGrp,
+            "vm_view_zoom_reset",
+        )
+        self.zoomResetAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Reset the zoom of the text")
+        )
+        self.zoomResetAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom reset</b>"""
+                """<p>Reset the zoom of the text. """
+                """This sets the zoom factor to 100%.</p>""",
+            )
+        )
         self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.viewActions.append(self.zoomResetAct)
-        
+
         self.zoomToAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Zoom'),
+            QCoreApplication.translate("ViewManager", "Zoom"),
             UI.PixmapCache.getIcon("zoomTo"),
-            QCoreApplication.translate('ViewManager', '&Zoom'),
-            0, 0,
-            self.viewActGrp, 'vm_view_zoom')
-        self.zoomToAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Zoom the text'))
-        self.zoomToAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Zoom</b>"""
-            """<p>Zoom the text. This opens a dialog where the"""
-            """ desired size can be entered.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Zoom"),
+            0,
+            0,
+            self.viewActGrp,
+            "vm_view_zoom",
+        )
+        self.zoomToAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Zoom the text")
+        )
+        self.zoomToAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Zoom</b>"""
+                """<p>Zoom the text. This opens a dialog where the"""
+                """ desired size can be entered.</p>""",
+            )
+        )
         self.zoomToAct.triggered.connect(self.__zoom)
         self.viewActions.append(self.zoomToAct)
-        
+
         self.toggleAllAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Toggle all folds'),
-            QCoreApplication.translate('ViewManager', '&Toggle all folds'),
-            0, 0, self.viewFoldActGrp, 'vm_view_toggle_all_folds')
-        self.toggleAllAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Toggle all folds'))
-        self.toggleAllAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Toggle all folds</b>"""
-            """<p>Toggle all folds of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Toggle all folds"),
+            QCoreApplication.translate("ViewManager", "&Toggle all folds"),
+            0,
+            0,
+            self.viewFoldActGrp,
+            "vm_view_toggle_all_folds",
+        )
+        self.toggleAllAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Toggle all folds")
+        )
+        self.toggleAllAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Toggle all folds</b>"""
+                """<p>Toggle all folds of the current editor.</p>""",
+            )
+        )
         self.toggleAllAct.triggered.connect(self.__toggleAll)
         self.viewActions.append(self.toggleAllAct)
-        
+
         self.toggleAllChildrenAct = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'Toggle all folds (including children)'),
-            QCoreApplication.translate(
-                'ViewManager', 'Toggle all &folds (including children)'),
-            0, 0, self.viewFoldActGrp, 'vm_view_toggle_all_folds_children')
-        self.toggleAllChildrenAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Toggle all folds (including children)'))
-        self.toggleAllChildrenAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Toggle all folds (including children)</b>"""
-            """<p>Toggle all folds of the current editor including"""
-            """ all children.</p>"""
-        ))
-        self.toggleAllChildrenAct.triggered.connect(
-            self.__toggleAllChildren)
+                "ViewManager", "Toggle all folds (including children)"
+            ),
+            QCoreApplication.translate(
+                "ViewManager", "Toggle all &folds (including children)"
+            ),
+            0,
+            0,
+            self.viewFoldActGrp,
+            "vm_view_toggle_all_folds_children",
+        )
+        self.toggleAllChildrenAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Toggle all folds (including children)"
+            )
+        )
+        self.toggleAllChildrenAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Toggle all folds (including children)</b>"""
+                """<p>Toggle all folds of the current editor including"""
+                """ all children.</p>""",
+            )
+        )
+        self.toggleAllChildrenAct.triggered.connect(self.__toggleAllChildren)
         self.viewActions.append(self.toggleAllChildrenAct)
-        
+
         self.toggleCurrentAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Toggle current fold'),
-            QCoreApplication.translate('ViewManager', 'Toggle &current fold'),
-            0, 0, self.viewFoldActGrp, 'vm_view_toggle_current_fold')
-        self.toggleCurrentAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Toggle current fold'))
-        self.toggleCurrentAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Toggle current fold</b>"""
-            """<p>Toggle the folds of the current line of the current"""
-            """ editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Toggle current fold"),
+            QCoreApplication.translate("ViewManager", "Toggle &current fold"),
+            0,
+            0,
+            self.viewFoldActGrp,
+            "vm_view_toggle_current_fold",
+        )
+        self.toggleCurrentAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Toggle current fold")
+        )
+        self.toggleCurrentAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Toggle current fold</b>"""
+                """<p>Toggle the folds of the current line of the current"""
+                """ editor.</p>""",
+            )
+        )
         self.toggleCurrentAct.triggered.connect(self.__toggleCurrent)
         self.viewActions.append(self.toggleCurrentAct)
-        
+
         self.clearAllFoldsAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear all folds'),
-            QCoreApplication.translate('ViewManager', 'Clear &all folds'),
-            0, 0, self.viewFoldActGrp, 'vm_view_clear_all_folds')
-        self.clearAllFoldsAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear all folds'))
-        self.clearAllFoldsAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear all folds</b>"""
-            """<p>Clear all folds of the current editor, i.e. ensure that"""
-            """ all lines are displayed unfolded.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Clear all folds"),
+            QCoreApplication.translate("ViewManager", "Clear &all folds"),
+            0,
+            0,
+            self.viewFoldActGrp,
+            "vm_view_clear_all_folds",
+        )
+        self.clearAllFoldsAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear all folds")
+        )
+        self.clearAllFoldsAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear all folds</b>"""
+                """<p>Clear all folds of the current editor, i.e. ensure that"""
+                """ all lines are displayed unfolded.</p>""",
+            )
+        )
         self.clearAllFoldsAct.triggered.connect(self.__clearAllFolds)
         self.viewActions.append(self.clearAllFoldsAct)
-        
+
         self.unhighlightAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Remove all highlights'),
+            QCoreApplication.translate("ViewManager", "Remove all highlights"),
             UI.PixmapCache.getIcon("unhighlight"),
-            QCoreApplication.translate('ViewManager', 'Remove all highlights'),
-            0, 0,
-            self, 'vm_view_unhighlight')
-        self.unhighlightAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Remove all highlights'))
-        self.unhighlightAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Remove all highlights</b>"""
-            """<p>Remove the highlights of all editors.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Remove all highlights"),
+            0,
+            0,
+            self,
+            "vm_view_unhighlight",
+        )
+        self.unhighlightAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Remove all highlights")
+        )
+        self.unhighlightAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Remove all highlights</b>"""
+                """<p>Remove the highlights of all editors.</p>""",
+            )
+        )
         self.unhighlightAct.triggered.connect(self.__unhighlight)
         self.viewActions.append(self.unhighlightAct)
-        
+
         self.newDocumentViewAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'New Document View'),
+            QCoreApplication.translate("ViewManager", "New Document View"),
             UI.PixmapCache.getIcon("documentNewView"),
-            QCoreApplication.translate('ViewManager', 'New &Document View'),
-            0, 0, self, 'vm_view_new_document_view')
-        self.newDocumentViewAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Open a new view of the current document'))
-        self.newDocumentViewAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>New Document View</b>"""
-            """<p>Opens a new view of the current document. Both views show"""
-            """ the same document. However, the cursors may be positioned"""
-            """ independently.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "New &Document View"),
+            0,
+            0,
+            self,
+            "vm_view_new_document_view",
+        )
+        self.newDocumentViewAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Open a new view of the current document"
+            )
+        )
+        self.newDocumentViewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>New Document View</b>"""
+                """<p>Opens a new view of the current document. Both views show"""
+                """ the same document. However, the cursors may be positioned"""
+                """ independently.</p>""",
+            )
+        )
         self.newDocumentViewAct.triggered.connect(self.__newDocumentView)
         self.viewActions.append(self.newDocumentViewAct)
-        
+
         self.newDocumentSplitViewAct = EricAction(
             QCoreApplication.translate(
-                'ViewManager', 'New Document View (with new split)'),
+                "ViewManager", "New Document View (with new split)"
+            ),
             UI.PixmapCache.getIcon("splitVertical"),
             QCoreApplication.translate(
-                'ViewManager', 'New Document View (with new split)'),
-            0, 0, self, 'vm_view_new_document_split_view')
-        self.newDocumentSplitViewAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager',
-            'Open a new view of the current document in a new split'))
-        self.newDocumentSplitViewAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>New Document View</b>"""
-            """<p>Opens a new view of the current document in a new split."""
-            """ Both views show the same document. However, the cursors may"""
-            """ be positioned independently.</p>"""
-        ))
-        self.newDocumentSplitViewAct.triggered.connect(
-            self.__newDocumentSplitView)
+                "ViewManager", "New Document View (with new split)"
+            ),
+            0,
+            0,
+            self,
+            "vm_view_new_document_split_view",
+        )
+        self.newDocumentSplitViewAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Open a new view of the current document in a new split"
+            )
+        )
+        self.newDocumentSplitViewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>New Document View</b>"""
+                """<p>Opens a new view of the current document in a new split."""
+                """ Both views show the same document. However, the cursors may"""
+                """ be positioned independently.</p>""",
+            )
+        )
+        self.newDocumentSplitViewAct.triggered.connect(self.__newDocumentSplitView)
         self.viewActions.append(self.newDocumentSplitViewAct)
-        
+
         self.splitViewAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Split view'),
+            QCoreApplication.translate("ViewManager", "Split view"),
             UI.PixmapCache.getIcon("splitVertical"),
-            QCoreApplication.translate('ViewManager', '&Split view'),
-            0, 0, self, 'vm_view_split_view')
-        self.splitViewAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Add a split to the view'))
-        self.splitViewAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Split view</b>"""
-            """<p>Add a split to the view.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Split view"),
+            0,
+            0,
+            self,
+            "vm_view_split_view",
+        )
+        self.splitViewAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Add a split to the view")
+        )
+        self.splitViewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Split view</b>""" """<p>Add a split to the view.</p>""",
+            )
+        )
         self.splitViewAct.triggered.connect(self.__splitView)
         self.viewActions.append(self.splitViewAct)
-        
+
         self.splitOrientationAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Arrange horizontally'),
-            QCoreApplication.translate('ViewManager', 'Arrange &horizontally'),
-            0, 0, self, 'vm_view_arrange_horizontally', True)
-        self.splitOrientationAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Arrange the splitted views horizontally'))
-        self.splitOrientationAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Arrange horizontally</b>"""
-            """<p>Arrange the splitted views horizontally.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Arrange horizontally"),
+            QCoreApplication.translate("ViewManager", "Arrange &horizontally"),
+            0,
+            0,
+            self,
+            "vm_view_arrange_horizontally",
+            True,
+        )
+        self.splitOrientationAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Arrange the splitted views horizontally"
+            )
+        )
+        self.splitOrientationAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Arrange horizontally</b>"""
+                """<p>Arrange the splitted views horizontally.</p>""",
+            )
+        )
         self.splitOrientationAct.setChecked(False)
         self.splitOrientationAct.toggled[bool].connect(self.__splitOrientation)
         self.viewActions.append(self.splitOrientationAct)
-        
+
         self.splitRemoveAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Remove split'),
+            QCoreApplication.translate("ViewManager", "Remove split"),
             UI.PixmapCache.getIcon("remsplitVertical"),
-            QCoreApplication.translate('ViewManager', '&Remove split'),
-            0, 0, self, 'vm_view_remove_split')
-        self.splitRemoveAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Remove the current split'))
-        self.splitRemoveAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Remove split</b>"""
-            """<p>Remove the current split.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Remove split"),
+            0,
+            0,
+            self,
+            "vm_view_remove_split",
+        )
+        self.splitRemoveAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Remove the current split")
+        )
+        self.splitRemoveAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Remove split</b>""" """<p>Remove the current split.</p>""",
+            )
+        )
         self.splitRemoveAct.triggered.connect(self.removeSplit)
         self.viewActions.append(self.splitRemoveAct)
-        
+
         self.nextSplitAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next split'),
-            QCoreApplication.translate('ViewManager', '&Next split'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+N", "View|Next split")),
-            0,
-            self, 'vm_next_split')
-        self.nextSplitAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Move to the next split'))
-        self.nextSplitAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next split</b>"""
-            """<p>Move to the next split.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Next split"),
+            QCoreApplication.translate("ViewManager", "&Next split"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Alt+N", "View|Next split"
+                )
+            ),
+            0,
+            self,
+            "vm_next_split",
+        )
+        self.nextSplitAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Move to the next split")
+        )
+        self.nextSplitAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next split</b>""" """<p>Move to the next split.</p>""",
+            )
+        )
         self.nextSplitAct.triggered.connect(self.nextSplit)
         self.viewActions.append(self.nextSplitAct)
-        
+
         self.prevSplitAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Previous split'),
-            QCoreApplication.translate('ViewManager', '&Previous split'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+Alt+P", "View|Previous split")),
-            0, self, 'vm_previous_split')
-        self.prevSplitAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Move to the previous split'))
-        self.prevSplitAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous split</b>"""
-            """<p>Move to the previous split.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Previous split"),
+            QCoreApplication.translate("ViewManager", "&Previous split"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+Alt+P", "View|Previous split"
+                )
+            ),
+            0,
+            self,
+            "vm_previous_split",
+        )
+        self.prevSplitAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Move to the previous split")
+        )
+        self.prevSplitAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous split</b>""" """<p>Move to the previous split.</p>""",
+            )
+        )
         self.prevSplitAct.triggered.connect(self.prevSplit)
         self.viewActions.append(self.prevSplitAct)
-        
+
         self.previewAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Preview'),
+            QCoreApplication.translate("ViewManager", "Preview"),
             UI.PixmapCache.getIcon("previewer"),
-            QCoreApplication.translate('ViewManager', 'Preview'),
-            0, 0, self, 'vm_preview', True)
-        self.previewAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Preview the current file in the web browser'))
-        self.previewAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Preview</b>"""
-            """<p>This opens the web browser with a preview of"""
-            """ the current file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Preview"),
+            0,
+            0,
+            self,
+            "vm_preview",
+            True,
+        )
+        self.previewAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Preview the current file in the web browser"
+            )
+        )
+        self.previewAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Preview</b>"""
+                """<p>This opens the web browser with a preview of"""
+                """ the current file.</p>""",
+            )
+        )
         self.previewAct.setChecked(Preferences.getUI("ShowFilePreview"))
         self.previewAct.toggled[bool].connect(self.__previewEditor)
         self.viewActions.append(self.previewAct)
-        
+
         self.astViewerAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Python AST Viewer'),
+            QCoreApplication.translate("ViewManager", "Python AST Viewer"),
             UI.PixmapCache.getIcon("astTree"),
-            QCoreApplication.translate('ViewManager', 'Python AST Viewer'),
-            0, 0, self, 'vm_python_ast_viewer', True)
-        self.astViewerAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Show the AST for the current Python file'))
-        self.astViewerAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Python AST Viewer</b>"""
-            """<p>This opens the a tree view of the AST of the current"""
-            """ Python source file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Python AST Viewer"),
+            0,
+            0,
+            self,
+            "vm_python_ast_viewer",
+            True,
+        )
+        self.astViewerAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Show the AST for the current Python file"
+            )
+        )
+        self.astViewerAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Python AST Viewer</b>"""
+                """<p>This opens the a tree view of the AST of the current"""
+                """ Python source file.</p>""",
+            )
+        )
         self.astViewerAct.setChecked(False)
         self.astViewerAct.toggled[bool].connect(self.__astViewer)
         self.viewActions.append(self.astViewerAct)
-        
+
         self.disViewerAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Python Disassembly Viewer'),
+            QCoreApplication.translate("ViewManager", "Python Disassembly Viewer"),
             UI.PixmapCache.getIcon("disassembly"),
-            QCoreApplication.translate(
-                'ViewManager', 'Python Disassembly Viewer'),
-            0, 0, self, 'vm_python_dis_viewer', True)
-        self.disViewerAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Show the Disassembly for the current Python file'))
-        self.disViewerAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Python Disassembly Viewer</b>"""
-            """<p>This opens the a tree view of the Disassembly of the"""
-            """ current Python source file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Python Disassembly Viewer"),
+            0,
+            0,
+            self,
+            "vm_python_dis_viewer",
+            True,
+        )
+        self.disViewerAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Show the Disassembly for the current Python file"
+            )
+        )
+        self.disViewerAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Python Disassembly Viewer</b>"""
+                """<p>This opens the a tree view of the Disassembly of the"""
+                """ current Python source file.</p>""",
+            )
+        )
         self.disViewerAct.setChecked(False)
         self.disViewerAct.toggled[bool].connect(self.__disViewer)
         self.viewActions.append(self.disViewerAct)
-        
+
         self.viewActGrp.setEnabled(False)
         self.viewFoldActGrp.setEnabled(False)
         self.unhighlightAct.setEnabled(False)
@@ -3674,18 +4555,18 @@
         self.disViewerAct.setEnabled(False)
         self.newDocumentViewAct.setEnabled(False)
         self.newDocumentSplitViewAct.setEnabled(False)
-        
+
         self.splitOrientationAct.setChecked(
-            Preferences.getUI("SplitOrientationVertical"))
-        
+            Preferences.getUI("SplitOrientationVertical")
+        )
+
     def initViewMenu(self):
         """
         Public method to create the View menu.
-        
+
         @return the generated menu
         """
-        menu = QMenu(QCoreApplication.translate('ViewManager', '&View'),
-                     self.ui)
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&View"), self.ui)
         menu.setTearOffEnabled(True)
         menu.addActions(self.viewActGrp.actions())
         menu.addSeparator()
@@ -3706,23 +4587,22 @@
             menu.addAction(self.splitRemoveAct)
             menu.addAction(self.nextSplitAct)
             menu.addAction(self.prevSplitAct)
-        
+
         return menu
-        
+
     def initViewToolbar(self, toolbarManager):
         """
         Public method to create the View toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'View'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "View"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("ViewToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'View'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "View"))
+
         tb.addActions(self.viewActGrp.actions())
         tb.addSeparator()
         tb.addAction(self.previewAct)
@@ -3732,18 +4612,18 @@
         tb.addAction(self.newDocumentViewAct)
         if self.canSplit():
             tb.addAction(self.newDocumentSplitViewAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.unhighlightAct, tb.windowTitle())
         toolbarManager.addAction(self.splitViewAct, tb.windowTitle())
         toolbarManager.addAction(self.splitRemoveAct, tb.windowTitle())
-        
+
         return tb
-    
+
     ##################################################################
     ## Initialize the macro related actions and macro menu
     ##################################################################
-    
+
     def __initMacroActions(self):
         """
         Private method defining the user interface actions for the macro
@@ -3752,110 +4632,148 @@
         self.macroActGrp = createActionGroup(self)
 
         self.macroStartRecAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Start Macro Recording'),
-            QCoreApplication.translate(
-                'ViewManager', 'S&tart Macro Recording'),
-            0, 0, self.macroActGrp, 'vm_macro_start_recording')
-        self.macroStartRecAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Start Macro Recording'))
-        self.macroStartRecAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Start Macro Recording</b>"""
-            """<p>Start recording editor commands into a new macro.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Start Macro Recording"),
+            QCoreApplication.translate("ViewManager", "S&tart Macro Recording"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_start_recording",
+        )
+        self.macroStartRecAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Start Macro Recording")
+        )
+        self.macroStartRecAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Start Macro Recording</b>"""
+                """<p>Start recording editor commands into a new macro.</p>""",
+            )
+        )
         self.macroStartRecAct.triggered.connect(self.__macroStartRecording)
         self.macroActions.append(self.macroStartRecAct)
-        
+
         self.macroStopRecAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Stop Macro Recording'),
-            QCoreApplication.translate('ViewManager', 'Sto&p Macro Recording'),
-            0, 0, self.macroActGrp, 'vm_macro_stop_recording')
-        self.macroStopRecAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Stop Macro Recording'))
-        self.macroStopRecAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Stop Macro Recording</b>"""
-            """<p>Stop recording editor commands into a new macro.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Stop Macro Recording"),
+            QCoreApplication.translate("ViewManager", "Sto&p Macro Recording"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_stop_recording",
+        )
+        self.macroStopRecAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Stop Macro Recording")
+        )
+        self.macroStopRecAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Stop Macro Recording</b>"""
+                """<p>Stop recording editor commands into a new macro.</p>""",
+            )
+        )
         self.macroStopRecAct.triggered.connect(self.__macroStopRecording)
         self.macroActions.append(self.macroStopRecAct)
-        
+
         self.macroRunAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Run Macro'),
-            QCoreApplication.translate('ViewManager', '&Run Macro'),
-            0, 0, self.macroActGrp, 'vm_macro_run')
-        self.macroRunAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Run Macro'))
-        self.macroRunAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Run Macro</b>"""
-            """<p>Run a previously recorded editor macro.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Run Macro"),
+            QCoreApplication.translate("ViewManager", "&Run Macro"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_run",
+        )
+        self.macroRunAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Run Macro")
+        )
+        self.macroRunAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Run Macro</b>"""
+                """<p>Run a previously recorded editor macro.</p>""",
+            )
+        )
         self.macroRunAct.triggered.connect(self.__macroRun)
         self.macroActions.append(self.macroRunAct)
-        
+
         self.macroDeleteAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Delete Macro'),
-            QCoreApplication.translate('ViewManager', '&Delete Macro'),
-            0, 0, self.macroActGrp, 'vm_macro_delete')
-        self.macroDeleteAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Delete Macro'))
-        self.macroDeleteAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Delete Macro</b>"""
-            """<p>Delete a previously recorded editor macro.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Delete Macro"),
+            QCoreApplication.translate("ViewManager", "&Delete Macro"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_delete",
+        )
+        self.macroDeleteAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Delete Macro")
+        )
+        self.macroDeleteAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Delete Macro</b>"""
+                """<p>Delete a previously recorded editor macro.</p>""",
+            )
+        )
         self.macroDeleteAct.triggered.connect(self.__macroDelete)
         self.macroActions.append(self.macroDeleteAct)
-        
+
         self.macroLoadAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Load Macro'),
-            QCoreApplication.translate('ViewManager', '&Load Macro'),
-            0, 0, self.macroActGrp, 'vm_macro_load')
-        self.macroLoadAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Load Macro'))
-        self.macroLoadAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Load Macro</b>"""
-            """<p>Load an editor macro from a file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Load Macro"),
+            QCoreApplication.translate("ViewManager", "&Load Macro"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_load",
+        )
+        self.macroLoadAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Load Macro")
+        )
+        self.macroLoadAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Load Macro</b>""" """<p>Load an editor macro from a file.</p>""",
+            )
+        )
         self.macroLoadAct.triggered.connect(self.__macroLoad)
         self.macroActions.append(self.macroLoadAct)
-        
+
         self.macroSaveAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Save Macro'),
-            QCoreApplication.translate('ViewManager', '&Save Macro'),
-            0, 0, self.macroActGrp, 'vm_macro_save')
-        self.macroSaveAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Save Macro'))
-        self.macroSaveAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Save Macro</b>"""
-            """<p>Save a previously recorded editor macro to a file.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Save Macro"),
+            QCoreApplication.translate("ViewManager", "&Save Macro"),
+            0,
+            0,
+            self.macroActGrp,
+            "vm_macro_save",
+        )
+        self.macroSaveAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Save Macro")
+        )
+        self.macroSaveAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Save Macro</b>"""
+                """<p>Save a previously recorded editor macro to a file.</p>""",
+            )
+        )
         self.macroSaveAct.triggered.connect(self.__macroSave)
         self.macroActions.append(self.macroSaveAct)
-        
+
         self.macroActGrp.setEnabled(False)
-        
+
     def initMacroMenu(self):
         """
         Public method to create the Macro menu.
-        
+
         @return the generated menu
         """
-        menu = QMenu(QCoreApplication.translate('ViewManager', "&Macros"),
-                     self.ui)
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&Macros"), self.ui)
         menu.setTearOffEnabled(True)
         menu.addActions(self.macroActGrp.actions())
-        
+
         return menu
-    
+
     #####################################################################
     ## Initialize the bookmark related actions, bookmark menu and toolbar
     #####################################################################
-    
+
     def __initBookmarkActions(self):
         """
         Private method defining the user interface actions for the bookmarks
@@ -3864,283 +4782,370 @@
         self.bookmarkActGrp = createActionGroup(self)
 
         self.bookmarkToggleAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Toggle Bookmark'),
+            QCoreApplication.translate("ViewManager", "Toggle Bookmark"),
             UI.PixmapCache.getIcon("bookmarkToggle"),
-            QCoreApplication.translate('ViewManager', '&Toggle Bookmark'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Ctrl+T", "Bookmark|Toggle")),
-            0,
-            self.bookmarkActGrp, 'vm_bookmark_toggle')
-        self.bookmarkToggleAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Toggle Bookmark'))
-        self.bookmarkToggleAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Toggle Bookmark</b>"""
-            """<p>Toggle a bookmark at the current line of the current"""
-            """ editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Toggle Bookmark"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Alt+Ctrl+T", "Bookmark|Toggle"
+                )
+            ),
+            0,
+            self.bookmarkActGrp,
+            "vm_bookmark_toggle",
+        )
+        self.bookmarkToggleAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Toggle Bookmark")
+        )
+        self.bookmarkToggleAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Toggle Bookmark</b>"""
+                """<p>Toggle a bookmark at the current line of the current"""
+                """ editor.</p>""",
+            )
+        )
         self.bookmarkToggleAct.triggered.connect(self.__toggleBookmark)
         self.bookmarkActions.append(self.bookmarkToggleAct)
-        
+
         self.bookmarkNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next Bookmark'),
+            QCoreApplication.translate("ViewManager", "Next Bookmark"),
             UI.PixmapCache.getIcon("bookmarkNext"),
-            QCoreApplication.translate('ViewManager', '&Next Bookmark'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+PgDown", "Bookmark|Next")),
-            0,
-            self.bookmarkActGrp, 'vm_bookmark_next')
-        self.bookmarkNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Next Bookmark'))
-        self.bookmarkNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next Bookmark</b>"""
-            """<p>Go to next bookmark of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Next Bookmark"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+PgDown", "Bookmark|Next"
+                )
+            ),
+            0,
+            self.bookmarkActGrp,
+            "vm_bookmark_next",
+        )
+        self.bookmarkNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Next Bookmark")
+        )
+        self.bookmarkNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next Bookmark</b>"""
+                """<p>Go to next bookmark of the current editor.</p>""",
+            )
+        )
         self.bookmarkNextAct.triggered.connect(self.__nextBookmark)
         self.bookmarkActions.append(self.bookmarkNextAct)
-        
+
         self.bookmarkPreviousAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Previous Bookmark'),
+            QCoreApplication.translate("ViewManager", "Previous Bookmark"),
             UI.PixmapCache.getIcon("bookmarkPrevious"),
-            QCoreApplication.translate('ViewManager', '&Previous Bookmark'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Ctrl+PgUp", "Bookmark|Previous")),
-            0,
-            self.bookmarkActGrp, 'vm_bookmark_previous')
-        self.bookmarkPreviousAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Previous Bookmark'))
-        self.bookmarkPreviousAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous Bookmark</b>"""
-            """<p>Go to previous bookmark of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Previous Bookmark"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Ctrl+PgUp", "Bookmark|Previous"
+                )
+            ),
+            0,
+            self.bookmarkActGrp,
+            "vm_bookmark_previous",
+        )
+        self.bookmarkPreviousAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Previous Bookmark")
+        )
+        self.bookmarkPreviousAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous Bookmark</b>"""
+                """<p>Go to previous bookmark of the current editor.</p>""",
+            )
+        )
         self.bookmarkPreviousAct.triggered.connect(self.__previousBookmark)
         self.bookmarkActions.append(self.bookmarkPreviousAct)
-        
+
         self.bookmarkClearAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear Bookmarks'),
-            QCoreApplication.translate('ViewManager', '&Clear Bookmarks'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Alt+Ctrl+C", "Bookmark|Clear")),
-            0,
-            self.bookmarkActGrp, 'vm_bookmark_clear')
-        self.bookmarkClearAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear Bookmarks'))
-        self.bookmarkClearAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear Bookmarks</b>"""
-            """<p>Clear bookmarks of all editors.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Clear Bookmarks"),
+            QCoreApplication.translate("ViewManager", "&Clear Bookmarks"),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Alt+Ctrl+C", "Bookmark|Clear"
+                )
+            ),
+            0,
+            self.bookmarkActGrp,
+            "vm_bookmark_clear",
+        )
+        self.bookmarkClearAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear Bookmarks")
+        )
+        self.bookmarkClearAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear Bookmarks</b>"""
+                """<p>Clear bookmarks of all editors.</p>""",
+            )
+        )
         self.bookmarkClearAct.triggered.connect(self.__clearAllBookmarks)
         self.bookmarkActions.append(self.bookmarkClearAct)
-        
+
         self.syntaxErrorGotoAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Goto Syntax Error'),
+            QCoreApplication.translate("ViewManager", "Goto Syntax Error"),
             UI.PixmapCache.getIcon("syntaxErrorGoto"),
-            QCoreApplication.translate('ViewManager', '&Goto Syntax Error'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_syntaxerror_goto')
-        self.syntaxErrorGotoAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Goto Syntax Error'))
-        self.syntaxErrorGotoAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Goto Syntax Error</b>"""
-            """<p>Go to next syntax error of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Goto Syntax Error"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_syntaxerror_goto",
+        )
+        self.syntaxErrorGotoAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Goto Syntax Error")
+        )
+        self.syntaxErrorGotoAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Goto Syntax Error</b>"""
+                """<p>Go to next syntax error of the current editor.</p>""",
+            )
+        )
         self.syntaxErrorGotoAct.triggered.connect(self.__gotoSyntaxError)
         self.bookmarkActions.append(self.syntaxErrorGotoAct)
-        
+
         self.syntaxErrorClearAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Clear Syntax Errors'),
-            QCoreApplication.translate('ViewManager', 'Clear &Syntax Errors'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_syntaxerror_clear')
-        self.syntaxErrorClearAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear Syntax Errors'))
-        self.syntaxErrorClearAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear Syntax Errors</b>"""
-            """<p>Clear syntax errors of all editors.</p>"""
-        ))
-        self.syntaxErrorClearAct.triggered.connect(
-            self.__clearAllSyntaxErrors)
+            QCoreApplication.translate("ViewManager", "Clear Syntax Errors"),
+            QCoreApplication.translate("ViewManager", "Clear &Syntax Errors"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_syntaxerror_clear",
+        )
+        self.syntaxErrorClearAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear Syntax Errors")
+        )
+        self.syntaxErrorClearAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear Syntax Errors</b>"""
+                """<p>Clear syntax errors of all editors.</p>""",
+            )
+        )
+        self.syntaxErrorClearAct.triggered.connect(self.__clearAllSyntaxErrors)
         self.bookmarkActions.append(self.syntaxErrorClearAct)
-        
+
         self.warningsNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next warning message'),
+            QCoreApplication.translate("ViewManager", "Next warning message"),
             UI.PixmapCache.getIcon("warningNext"),
-            QCoreApplication.translate('ViewManager', '&Next warning message'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_warning_next')
-        self.warningsNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Next warning message'))
-        self.warningsNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next warning message</b>"""
-            """<p>Go to next line of the current editor"""
-            """ having a pyflakes warning.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Next warning message"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_warning_next",
+        )
+        self.warningsNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Next warning message")
+        )
+        self.warningsNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next warning message</b>"""
+                """<p>Go to next line of the current editor"""
+                """ having a pyflakes warning.</p>""",
+            )
+        )
         self.warningsNextAct.triggered.connect(self.__nextWarning)
         self.bookmarkActions.append(self.warningsNextAct)
-        
+
         self.warningsPreviousAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Previous warning message'),
+            QCoreApplication.translate("ViewManager", "Previous warning message"),
             UI.PixmapCache.getIcon("warningPrev"),
-            QCoreApplication.translate(
-                'ViewManager', '&Previous warning message'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_warning_previous')
-        self.warningsPreviousAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Previous warning message'))
-        self.warningsPreviousAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous warning message</b>"""
-            """<p>Go to previous line of the current editor"""
-            """ having a pyflakes warning.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Previous warning message"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_warning_previous",
+        )
+        self.warningsPreviousAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Previous warning message")
+        )
+        self.warningsPreviousAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous warning message</b>"""
+                """<p>Go to previous line of the current editor"""
+                """ having a pyflakes warning.</p>""",
+            )
+        )
         self.warningsPreviousAct.triggered.connect(self.__previousWarning)
         self.bookmarkActions.append(self.warningsPreviousAct)
-        
+
         self.warningsClearAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Clear Warning Messages'),
-            QCoreApplication.translate(
-                'ViewManager', 'Clear &Warning Messages'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_warnings_clear')
-        self.warningsClearAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Clear Warning Messages'))
-        self.warningsClearAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Clear Warning Messages</b>"""
-            """<p>Clear pyflakes warning messages of all editors.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Clear Warning Messages"),
+            QCoreApplication.translate("ViewManager", "Clear &Warning Messages"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_warnings_clear",
+        )
+        self.warningsClearAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Clear Warning Messages")
+        )
+        self.warningsClearAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Clear Warning Messages</b>"""
+                """<p>Clear pyflakes warning messages of all editors.</p>""",
+            )
+        )
         self.warningsClearAct.triggered.connect(self.__clearAllWarnings)
         self.bookmarkActions.append(self.warningsClearAct)
-        
+
         self.notcoveredNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next uncovered line'),
+            QCoreApplication.translate("ViewManager", "Next uncovered line"),
             UI.PixmapCache.getIcon("notcoveredNext"),
-            QCoreApplication.translate('ViewManager', '&Next uncovered line'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_uncovered_next')
-        self.notcoveredNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Next uncovered line'))
-        self.notcoveredNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next uncovered line</b>"""
-            """<p>Go to next line of the current editor marked as not"""
-            """ covered.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Next uncovered line"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_uncovered_next",
+        )
+        self.notcoveredNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Next uncovered line")
+        )
+        self.notcoveredNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next uncovered line</b>"""
+                """<p>Go to next line of the current editor marked as not"""
+                """ covered.</p>""",
+            )
+        )
         self.notcoveredNextAct.triggered.connect(self.__nextUncovered)
         self.bookmarkActions.append(self.notcoveredNextAct)
-        
+
         self.notcoveredPreviousAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Previous uncovered line'),
+            QCoreApplication.translate("ViewManager", "Previous uncovered line"),
             UI.PixmapCache.getIcon("notcoveredPrev"),
-            QCoreApplication.translate(
-                'ViewManager', '&Previous uncovered line'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_uncovered_previous')
-        self.notcoveredPreviousAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Previous uncovered line'))
-        self.notcoveredPreviousAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous uncovered line</b>"""
-            """<p>Go to previous line of the current editor marked"""
-            """ as not covered.</p>"""
-        ))
-        self.notcoveredPreviousAct.triggered.connect(
-            self.__previousUncovered)
+            QCoreApplication.translate("ViewManager", "&Previous uncovered line"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_uncovered_previous",
+        )
+        self.notcoveredPreviousAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Previous uncovered line")
+        )
+        self.notcoveredPreviousAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous uncovered line</b>"""
+                """<p>Go to previous line of the current editor marked"""
+                """ as not covered.</p>""",
+            )
+        )
+        self.notcoveredPreviousAct.triggered.connect(self.__previousUncovered)
         self.bookmarkActions.append(self.notcoveredPreviousAct)
-        
+
         self.taskNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next Task'),
+            QCoreApplication.translate("ViewManager", "Next Task"),
             UI.PixmapCache.getIcon("taskNext"),
-            QCoreApplication.translate('ViewManager', '&Next Task'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_task_next')
-        self.taskNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Next Task'))
-        self.taskNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next Task</b>"""
-            """<p>Go to next line of the current editor having a task.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Next Task"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_task_next",
+        )
+        self.taskNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Next Task")
+        )
+        self.taskNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next Task</b>"""
+                """<p>Go to next line of the current editor having a task.</p>""",
+            )
+        )
         self.taskNextAct.triggered.connect(self.__nextTask)
         self.bookmarkActions.append(self.taskNextAct)
-        
+
         self.taskPreviousAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Previous Task'),
+            QCoreApplication.translate("ViewManager", "Previous Task"),
             UI.PixmapCache.getIcon("taskPrev"),
-            QCoreApplication.translate(
-                'ViewManager', '&Previous Task'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_task_previous')
-        self.taskPreviousAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Previous Task'))
-        self.taskPreviousAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous Task</b>"""
-            """<p>Go to previous line of the current editor having a"""
-            """ task.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Previous Task"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_task_previous",
+        )
+        self.taskPreviousAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Previous Task")
+        )
+        self.taskPreviousAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous Task</b>"""
+                """<p>Go to previous line of the current editor having a"""
+                """ task.</p>""",
+            )
+        )
         self.taskPreviousAct.triggered.connect(self.__previousTask)
         self.bookmarkActions.append(self.taskPreviousAct)
-        
+
         self.changeNextAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Next Change'),
+            QCoreApplication.translate("ViewManager", "Next Change"),
             UI.PixmapCache.getIcon("changeNext"),
-            QCoreApplication.translate('ViewManager', '&Next Change'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_change_next')
-        self.changeNextAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Next Change'))
-        self.changeNextAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Next Change</b>"""
-            """<p>Go to next line of the current editor having a change"""
-            """ marker.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Next Change"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_change_next",
+        )
+        self.changeNextAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Next Change")
+        )
+        self.changeNextAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Next Change</b>"""
+                """<p>Go to next line of the current editor having a change"""
+                """ marker.</p>""",
+            )
+        )
         self.changeNextAct.triggered.connect(self.__nextChange)
         self.bookmarkActions.append(self.changeNextAct)
-        
+
         self.changePreviousAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Previous Change'),
+            QCoreApplication.translate("ViewManager", "Previous Change"),
             UI.PixmapCache.getIcon("changePrev"),
-            QCoreApplication.translate(
-                'ViewManager', '&Previous Change'),
-            0, 0,
-            self.bookmarkActGrp, 'vm_change_previous')
-        self.changePreviousAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Previous Change'))
-        self.changePreviousAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Previous Change</b>"""
-            """<p>Go to previous line of the current editor having"""
-            """ a change marker.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Previous Change"),
+            0,
+            0,
+            self.bookmarkActGrp,
+            "vm_change_previous",
+        )
+        self.changePreviousAct.setStatusTip(
+            QCoreApplication.translate("ViewManager", "Previous Change")
+        )
+        self.changePreviousAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Previous Change</b>"""
+                """<p>Go to previous line of the current editor having"""
+                """ a change marker.</p>""",
+            )
+        )
         self.changePreviousAct.triggered.connect(self.__previousChange)
         self.bookmarkActions.append(self.changePreviousAct)
-        
+
         self.bookmarkActGrp.setEnabled(False)
-        
+
     def initBookmarkMenu(self):
         """
         Public method to create the Bookmark menu.
-        
+
         @return the generated menu
         """
-        menu = QMenu(QCoreApplication.translate('ViewManager', '&Bookmarks'),
-                     self.ui)
+        menu = QMenu(QCoreApplication.translate("ViewManager", "&Bookmarks"), self.ui)
         self.bookmarksMenu = QMenu(
-            QCoreApplication.translate('ViewManager', '&Bookmarks'),
-            menu)
+            QCoreApplication.translate("ViewManager", "&Bookmarks"), menu
+        )
         menu.setTearOffEnabled(True)
-        
+
         menu.addAction(self.bookmarkToggleAct)
         menu.addAction(self.bookmarkNextAct)
         menu.addAction(self.bookmarkPreviousAct)
@@ -4163,27 +5168,26 @@
         menu.addSeparator()
         menu.addAction(self.changeNextAct)
         menu.addAction(self.changePreviousAct)
-        
+
         self.bookmarksMenu.aboutToShow.connect(self.__showBookmarksMenu)
         self.bookmarksMenu.triggered.connect(self.__bookmarkSelected)
         menu.aboutToShow.connect(self.__showBookmarkMenu)
-        
+
         return menu
-        
+
     def initBookmarkToolbar(self, toolbarManager):
         """
         Public method to create the Bookmark toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'Bookmarks'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "Bookmarks"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("BookmarksToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'Bookmarks'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "Bookmarks"))
+
         tb.addAction(self.bookmarkToggleAct)
         tb.addAction(self.bookmarkNextAct)
         tb.addAction(self.bookmarkPreviousAct)
@@ -4198,132 +5202,150 @@
         tb.addSeparator()
         tb.addAction(self.changeNextAct)
         tb.addAction(self.changePreviousAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
         toolbarManager.addAction(self.notcoveredNextAct, tb.windowTitle())
         toolbarManager.addAction(self.notcoveredPreviousAct, tb.windowTitle())
-        
+
         return tb
-    
+
     ##################################################################
     ## Initialize the spell checking related actions
     ##################################################################
-    
+
     def __initSpellingActions(self):
         """
         Private method to initialize the spell checking actions.
         """
         self.spellingActGrp = createActionGroup(self)
-        
+
         self.spellCheckAct = EricAction(
-            QCoreApplication.translate('ViewManager', 'Check spelling'),
+            QCoreApplication.translate("ViewManager", "Check spelling"),
             UI.PixmapCache.getIcon("spellchecking"),
-            QCoreApplication.translate(
-                'ViewManager', 'Check &spelling...'),
-            QKeySequence(QCoreApplication.translate(
-                'ViewManager', "Shift+F7", "Spelling|Spell Check")),
-            0,
-            self.spellingActGrp, 'vm_spelling_spellcheck')
-        self.spellCheckAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', 'Perform spell check of current editor'))
-        self.spellCheckAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Check spelling</b>"""
-            """<p>Perform a spell check of the current editor.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "Check &spelling..."),
+            QKeySequence(
+                QCoreApplication.translate(
+                    "ViewManager", "Shift+F7", "Spelling|Spell Check"
+                )
+            ),
+            0,
+            self.spellingActGrp,
+            "vm_spelling_spellcheck",
+        )
+        self.spellCheckAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "Perform spell check of current editor"
+            )
+        )
+        self.spellCheckAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Check spelling</b>"""
+                """<p>Perform a spell check of the current editor.</p>""",
+            )
+        )
         self.spellCheckAct.triggered.connect(self.__spellCheck)
         self.spellingActions.append(self.spellCheckAct)
-        
+
         self.autoSpellCheckAct = EricAction(
-            QCoreApplication.translate(
-                'ViewManager', 'Automatic spell checking'),
+            QCoreApplication.translate("ViewManager", "Automatic spell checking"),
             UI.PixmapCache.getIcon("autospellchecking"),
-            QCoreApplication.translate(
-                'ViewManager', '&Automatic spell checking'),
-            0, 0,
-            self.spellingActGrp, 'vm_spelling_autospellcheck', True)
-        self.autoSpellCheckAct.setStatusTip(QCoreApplication.translate(
-            'ViewManager', '(De-)Activate automatic spell checking'))
-        self.autoSpellCheckAct.setWhatsThis(QCoreApplication.translate(
-            'ViewManager',
-            """<b>Automatic spell checking</b>"""
-            """<p>Activate or deactivate the automatic spell checking"""
-            """ function of all editors.</p>"""
-        ))
+            QCoreApplication.translate("ViewManager", "&Automatic spell checking"),
+            0,
+            0,
+            self.spellingActGrp,
+            "vm_spelling_autospellcheck",
+            True,
+        )
+        self.autoSpellCheckAct.setStatusTip(
+            QCoreApplication.translate(
+                "ViewManager", "(De-)Activate automatic spell checking"
+            )
+        )
+        self.autoSpellCheckAct.setWhatsThis(
+            QCoreApplication.translate(
+                "ViewManager",
+                """<b>Automatic spell checking</b>"""
+                """<p>Activate or deactivate the automatic spell checking"""
+                """ function of all editors.</p>""",
+            )
+        )
         self.autoSpellCheckAct.setChecked(
-            Preferences.getEditor("AutoSpellCheckingEnabled"))
-        self.autoSpellCheckAct.triggered.connect(
-            self.__setAutoSpellChecking)
+            Preferences.getEditor("AutoSpellCheckingEnabled")
+        )
+        self.autoSpellCheckAct.triggered.connect(self.__setAutoSpellChecking)
         self.spellingActions.append(self.autoSpellCheckAct)
-        
+
         self.__enableSpellingActions()
-        
+
     def __enableSpellingActions(self):
         """
         Private method to set the enabled state of the spelling actions.
         """
         from QScintilla.SpellChecker import SpellChecker
+
         spellingAvailable = SpellChecker.isAvailable()
-        
-        self.spellCheckAct.setEnabled(
-            len(self.editors) != 0 and spellingAvailable)
+
+        self.spellCheckAct.setEnabled(len(self.editors) != 0 and spellingAvailable)
         self.autoSpellCheckAct.setEnabled(spellingAvailable)
-    
+
     def addToExtrasMenu(self, menu):
         """
         Public method to add some actions to the Extras menu.
-        
+
         @param menu reference to the menu to add actions to (QMenu)
         """
-        self.__editSpellingMenu = QMenu(QCoreApplication.translate(
-            'ViewManager', "Edit Dictionary"))
+        self.__editSpellingMenu = QMenu(
+            QCoreApplication.translate("ViewManager", "Edit Dictionary")
+        )
         self.__editProjectPwlAct = self.__editSpellingMenu.addAction(
-            QCoreApplication.translate('ViewManager', "Project Word List"),
-            self.__editProjectPWL)
+            QCoreApplication.translate("ViewManager", "Project Word List"),
+            self.__editProjectPWL,
+        )
         self.__editProjectPelAct = self.__editSpellingMenu.addAction(
-            QCoreApplication.translate(
-                'ViewManager', "Project Exception List"),
-            self.__editProjectPEL)
+            QCoreApplication.translate("ViewManager", "Project Exception List"),
+            self.__editProjectPEL,
+        )
         self.__editSpellingMenu.addSeparator()
         self.__editUserPwlAct = self.__editSpellingMenu.addAction(
-            QCoreApplication.translate('ViewManager', "User Word List"),
-            self.__editUserPWL)
+            QCoreApplication.translate("ViewManager", "User Word List"),
+            self.__editUserPWL,
+        )
         self.__editUserPelAct = self.__editSpellingMenu.addAction(
-            QCoreApplication.translate('ViewManager', "User Exception List"),
-            self.__editUserPEL)
-        self.__editSpellingMenu.aboutToShow.connect(
-            self.__showEditSpellingMenu)
-        
+            QCoreApplication.translate("ViewManager", "User Exception List"),
+            self.__editUserPEL,
+        )
+        self.__editSpellingMenu.aboutToShow.connect(self.__showEditSpellingMenu)
+
         menu.addAction(self.spellCheckAct)
         menu.addAction(self.autoSpellCheckAct)
         menu.addMenu(self.__editSpellingMenu)
         menu.addSeparator()
-    
+
     def initSpellingToolbar(self, toolbarManager):
         """
         Public method to create the Spelling toolbar.
-        
+
         @param toolbarManager reference to a toolbar manager object
             (EricToolBarManager)
         @return the generated toolbar
         """
-        tb = QToolBar(QCoreApplication.translate('ViewManager', 'Spelling'),
-                      self.ui)
+        tb = QToolBar(QCoreApplication.translate("ViewManager", "Spelling"), self.ui)
         tb.setIconSize(UI.Config.ToolBarIconSize)
         tb.setObjectName("SpellingToolbar")
-        tb.setToolTip(QCoreApplication.translate('ViewManager', 'Spelling'))
-        
+        tb.setToolTip(QCoreApplication.translate("ViewManager", "Spelling"))
+
         tb.addAction(self.spellCheckAct)
         tb.addAction(self.autoSpellCheckAct)
-        
+
         toolbarManager.addToolBar(tb, tb.windowTitle())
-        
+
         return tb
-    
+
     ##################################################################
     ## Methods and slots that deal with file and window handling
     ##################################################################
-    
+
     def __openFiles(self):
         """
         Private slot to open some files.
@@ -4333,20 +5355,22 @@
         #     2: Directory of currently active project
         #     3: CWD
         import QScintilla.Lexers
+
         fileFilter = self._getOpenFileFilter()
         progs = EricFileDialog.getOpenFileNamesAndFilter(
             self.ui,
-            QCoreApplication.translate('ViewManager', "Open files"),
+            QCoreApplication.translate("ViewManager", "Open files"),
             self._getOpenStartDir(),
             QScintilla.Lexers.getOpenFileFiltersList(True, True),
-            fileFilter)[0]
+            fileFilter,
+        )[0]
         for prog in progs:
             self.openFiles(prog)
-    
+
     def openFiles(self, prog):
         """
         Public slot to open some files.
-        
+
         @param prog name of file to be opened (string)
         """
         prog = os.path.abspath(prog)
@@ -4356,7 +5380,7 @@
     def checkDirty(self, editor, autosave=False):
         """
         Public method to check the dirty status and open a message window.
-        
+
         @param editor editor window to check
         @type Editor
         @param autosave flag indicating that the file should be saved
@@ -4371,7 +5395,7 @@
             # for the same file
             if fn and self.getOpenEditorCount(fn) > 1:
                 return True
-            
+
             if fn is None:
                 fn = editor.getNoName()
                 autosave = False
@@ -4380,32 +5404,33 @@
             else:
                 res = EricMessageBox.okToClearData(
                     self.ui,
-                    QCoreApplication.translate('ViewManager', "File Modified"),
+                    QCoreApplication.translate("ViewManager", "File Modified"),
                     QCoreApplication.translate(
-                        'ViewManager',
-                        """<p>The file <b>{0}</b> has unsaved changes.</p>""")
-                    .format(fn),
-                    editor.saveFile)
+                        "ViewManager",
+                        """<p>The file <b>{0}</b> has unsaved changes.</p>""",
+                    ).format(fn),
+                    editor.saveFile,
+                )
             if res:
                 self.setEditorName(editor, editor.getFileName())
             return res
-        
+
         return True
-        
+
     def checkAllDirty(self):
         """
         Public method to check the dirty status of all editors.
-        
+
         @return flag indicating successful reset of all dirty flags
         @rtype bool
         """
         return all(self.checkDirty(editor) for editor in self.editors)
-        
+
     def checkFileDirty(self, fn):
         """
         Public method to check the dirty status of an editor given its file
         name and open a message window.
-        
+
         @param fn file name of editor to be checked
         @type str
         @return flag indicating successful reset of the dirty flag
@@ -4416,24 +5441,24 @@
                 break
         else:
             return True
-        
+
         res = self.checkDirty(editor)
         return res
-    
+
     def hasDirtyEditor(self):
         """
         Public method to ask, if any of the open editors contains unsaved
         changes.
-        
+
         @return flag indicating at least one editor has unsaved changes
         @rtype bool
         """
         return any(editor.isModified() for editor in self.editors)
-    
+
     def closeEditor(self, editor, ignoreDirty=False):
         """
         Public method to close an editor window.
-        
+
         @param editor editor window to be closed
         @type Editor
         @param ignoreDirty flag indicating to ignore the 'dirty' status
@@ -4444,60 +5469,60 @@
         # save file if necessary
         if not ignoreDirty and not self.checkDirty(editor):
             return False
-        
+
         # get the filename of the editor for later use
         fn = editor.getFileName()
-        
+
         # remove the window
         editor.parent().shutdownTimer()
         self._removeView(editor)
         self.editors.remove(editor)
-        
+
         # send a signal, if it was the last editor for this filename
         if fn and self.getOpenEditor(fn) is None:
             self.editorClosed.emit(fn)
         self.editorClosedEd.emit(editor)
-        
+
         # send a signal, if it was the very last editor
         if not len(self.editors):
             self.__lastEditorClosed()
             self.lastEditorClosed.emit()
-        
+
         editor.deleteLater()
-        
+
         return True
-        
+
     def closeCurrentWindow(self):
         """
         Public method to close the current window.
-        
+
         @return flag indicating success (boolean)
         """
         aw = self.activeWindow()
         if aw is None:
             return False
-        
+
         res = self.closeEditor(aw)
         if res and aw == self.currentEditor:
             self.currentEditor = None
-        
+
         return res
-        
+
     def closeAllWindows(self, ignoreDirty=False):
         """
         Public method to close all editor windows.
-        
+
         @param ignoreDirty flag indicating to ignore the 'dirty' status
         @type bool
         """
         savedEditors = self.editors[:]
         for editor in savedEditors:
             self.closeEditor(editor, ignoreDirty=ignoreDirty)
-        
+
     def closeWindow(self, fn, ignoreDirty=False):
         """
         Public method to close an arbitrary source editor.
-        
+
         @param fn file name of the editor to be closed
         @type str
         @param ignoreDirty flag indicating to ignore the 'dirty' status
@@ -4510,26 +5535,26 @@
                 break
         else:
             return True
-        
+
         res = self.closeEditor(editor, ignoreDirty=ignoreDirty)
         if res and editor == self.currentEditor:
             self.currentEditor = None
-        
+
         return res
-        
+
     def closeEditorWindow(self, editor):
         """
         Public method to close an arbitrary source editor.
-        
+
         @param editor editor to be closed
         """
         if editor is None:
             return
-        
+
         res = self.closeEditor(editor)
         if res and editor == self.currentEditor:
             self.currentEditor = None
-        
+
     def exit(self):
         """
         Public method to handle the debugged program terminating.
@@ -4537,18 +5562,26 @@
         if self.currentEditor is not None:
             self.currentEditor.highlight()
             self.currentEditor = None
-        
+
         for editor in self.editors:
             editor.refreshCoverageAnnotations()
-        
+
         self.__setSbFile()
-        
-    def openSourceFile(self, fn, lineno=-1, filetype="",
-                       selStart=0, selEnd=0, pos=0, addNext=False,
-                       indexes=None):
+
+    def openSourceFile(
+        self,
+        fn,
+        lineno=-1,
+        filetype="",
+        selStart=0,
+        selEnd=0,
+        pos=0,
+        addNext=False,
+        indexes=None,
+    ):
         """
         Public slot to display a file in an editor.
-        
+
         @param fn name of file to be opened
         @type str
         @param lineno line number to place the cursor at or list of line
@@ -4573,15 +5606,16 @@
         @rtype Editor
         """
         try:
-            newWin, editor = self.getEditor(fn, filetype=filetype,
-                                            addNext=addNext, indexes=indexes)
+            newWin, editor = self.getEditor(
+                fn, filetype=filetype, addNext=addNext, indexes=indexes
+            )
         except (OSError, UnicodeDecodeError):
             return None
-        
+
         if newWin:
             self._modificationStatusChanged(editor.isModified(), editor)
         self._checkActions(editor)
-        
+
         cline, cindex = editor.getCursorPosition()
         cline += 1
         if isinstance(lineno, list):
@@ -4597,71 +5631,65 @@
                 line = -1
         else:
             line = lineno
-            
+
         if line >= 0 and line != cline:
             editor.ensureVisibleTop(line)
             editor.gotoLine(line, pos)
-            
+
             if selStart != selEnd:
                 editor.setSelection(line - 1, selStart, line - 1, selEnd)
-        
+
         # insert filename into list of recently opened files
         self.addToRecentList(fn)
-        
+
         return editor
-        
+
     def __connectEditor(self, editor):
         """
         Private method to establish all editor connections.
-        
+
         @param editor reference to the editor object to be connected
         """
-        editor.modificationStatusChanged.connect(
-            self._modificationStatusChanged)
+        editor.modificationStatusChanged.connect(self._modificationStatusChanged)
         editor.cursorChanged.connect(
-            lambda f, l, p: self.__cursorChanged(f, l, p, editor))
-        editor.editorSaved.connect(
-            lambda fn: self.__editorSaved(fn, editor))
-        editor.editorRenamed.connect(
-            lambda fn: self.__editorRenamed(fn, editor))
+            lambda f, l, p: self.__cursorChanged(f, l, p, editor)
+        )
+        editor.editorSaved.connect(lambda fn: self.__editorSaved(fn, editor))
+        editor.editorRenamed.connect(lambda fn: self.__editorRenamed(fn, editor))
         editor.breakpointToggled.connect(self.__breakpointToggled)
         editor.bookmarkToggled.connect(self.__bookmarkToggled)
         editor.syntaxerrorToggled.connect(self._syntaxErrorToggled)
         editor.coverageMarkersShown.connect(self.__coverageMarkersShown)
         editor.autoCompletionAPIsAvailable.connect(
-            lambda a: self.__editorAutoCompletionAPIsAvailable(a, editor))
+            lambda a: self.__editorAutoCompletionAPIsAvailable(a, editor)
+        )
         editor.undoAvailable.connect(self.undoAct.setEnabled)
         editor.redoAvailable.connect(self.redoAct.setEnabled)
         editor.taskMarkersUpdated.connect(self.__taskMarkersUpdated)
         editor.changeMarkersUpdated.connect(self.__changeMarkersUpdated)
-        editor.languageChanged.connect(
-            lambda: self.__editorConfigChanged(editor))
-        editor.eolChanged.connect(
-            lambda: self.__editorConfigChanged(editor))
-        editor.encodingChanged.connect(
-            lambda: self.__editorConfigChanged(editor))
+        editor.languageChanged.connect(lambda: self.__editorConfigChanged(editor))
+        editor.eolChanged.connect(lambda: self.__editorConfigChanged(editor))
+        editor.encodingChanged.connect(lambda: self.__editorConfigChanged(editor))
         editor.selectionChanged.connect(
-            lambda: self.__searchWidget.selectionChanged(editor))
-        editor.selectionChanged.connect(
-            lambda: self.__replaceWidget.selectionChanged(editor))
+            lambda: self.__searchWidget.selectionChanged(editor)
+        )
         editor.selectionChanged.connect(
-            lambda: self.__editorSelectionChanged(editor))
-        editor.lastEditPositionAvailable.connect(
-            self.__lastEditPositionAvailable)
-        editor.zoomValueChanged.connect(
-            lambda v: self.zoomValueChanged(v, editor))
+            lambda: self.__replaceWidget.selectionChanged(editor)
+        )
+        editor.selectionChanged.connect(lambda: self.__editorSelectionChanged(editor))
+        editor.lastEditPositionAvailable.connect(self.__lastEditPositionAvailable)
+        editor.zoomValueChanged.connect(lambda v: self.zoomValueChanged(v, editor))
         editor.mouseDoubleClick.connect(
-            lambda pos, buttons: self.__editorDoubleClicked(editor, pos,
-                                                            buttons))
-        
-        editor.languageChanged.connect(
-            lambda: self.editorLanguageChanged.emit(editor))
+            lambda pos, buttons: self.__editorDoubleClicked(editor, pos, buttons)
+        )
+
+        editor.languageChanged.connect(lambda: self.editorLanguageChanged.emit(editor))
         editor.textChanged.connect(lambda: self.editorTextChanged.emit(editor))
 
     def newEditorView(self, fn, caller, filetype="", indexes=None):
         """
         Public method to create a new editor displaying the given document.
-        
+
         @param fn filename of this view
         @type str
         @param caller reference to the editor calling this method
@@ -4675,17 +5703,17 @@
         @rtype Editor
         """
         editor, assembly = self.cloneEditor(caller, filetype, fn)
-        
+
         self._addView(assembly, fn, caller.getNoName(), indexes=indexes)
         self._modificationStatusChanged(editor.isModified(), editor)
         self._checkActions(editor)
-        
+
         return editor
 
     def cloneEditor(self, caller, filetype, fn):
         """
         Public method to clone an editor displaying the given document.
-        
+
         @param caller reference to the editor calling this method
         @param filetype type of the source file (string)
         @param fn filename of this view
@@ -4693,9 +5721,15 @@
             editor assembly object (EditorAssembly.EditorAssembly)
         """
         from QScintilla.EditorAssembly import EditorAssembly
-        assembly = EditorAssembly(self.dbs, fn, self, filetype=filetype,
-                                  editor=caller,
-                                  tv=ericApp().getObject("TaskViewer"))
+
+        assembly = EditorAssembly(
+            self.dbs,
+            fn,
+            self,
+            filetype=filetype,
+            editor=caller,
+            tv=ericApp().getObject("TaskViewer"),
+        )
         editor = assembly.getEditor()
         self.editors.append(editor)
         self.__connectEditor(editor)
@@ -4704,11 +5738,11 @@
         self.editorOpenedEd.emit(editor)
 
         return editor, assembly
-        
+
     def addToRecentList(self, fn):
         """
         Public slot to add a filename to the list of recently opened files.
-        
+
         @param fn name of the file to be added
         """
         for recent in self.recent[:]:
@@ -4719,24 +5753,24 @@
         if len(self.recent) > maxRecent:
             self.recent = self.recent[:maxRecent]
         self.__saveRecent()
-        
+
     def showDebugSource(self, fn, line):
         """
         Public method to open the given file and highlight the given line in
         it.
-        
+
         @param fn filename of editor to update (string)
         @param line line number to highlight (int)
         """
-        if not fn.startswith('<'):
+        if not fn.startswith("<"):
             self.openSourceFile(fn, line)
             self.setFileLine(fn, line)
-        
+
     def setFileLine(self, fn, line, error=False, syntaxError=False):
         """
         Public method to update the user interface when the current program
         or line changes.
-        
+
         @param fn filename of editor to update (string)
         @param line line number to highlight (int)
         @param error flag indicating an error highlight (boolean)
@@ -4746,26 +5780,32 @@
             newWin, self.currentEditor = self.getEditor(fn)
         except (OSError, UnicodeDecodeError):
             return
-        
+
         enc = self.currentEditor.getEncoding()
         lang = self.currentEditor.getLanguage()
         eol = self.currentEditor.getEolIndicator()
         zoom = self.currentEditor.getZoom()
-        self.__setSbFile(fn, line, encoding=enc, language=lang, eol=eol,
-                         zoom=zoom)
-        
+        self.__setSbFile(fn, line, encoding=enc, language=lang, eol=eol, zoom=zoom)
+
         # Change the highlighted line.
         self.currentEditor.highlight(line, error, syntaxError)
-        
+
         self.currentEditor.highlightVisible()
         self._checkActions(self.currentEditor, False)
-        
-    def __setSbFile(self, fn=None, line=None, pos=None,
-                    encoding=None, language=None, eol=None,
-                    zoom=None):
+
+    def __setSbFile(
+        self,
+        fn=None,
+        line=None,
+        pos=None,
+        encoding=None,
+        language=None,
+        eol=None,
+        zoom=None,
+    ):
         """
         Private method to set the file info in the status bar.
-        
+
         @param fn filename to display (string)
         @param line line number to display (int)
         @param pos character position to display (int)
@@ -4775,37 +5815,38 @@
         @param zoom zoom value (integer)
         """
         if not fn:
-            fn = ''
-            writ = '  '
+            fn = ""
+            writ = "  "
         else:
             if os.access(fn, os.W_OK):
-                writ = 'rw'
+                writ = "rw"
             else:
-                writ = 'ro'
+                writ = "ro"
         self.sbWritable.setText(writ)
-        
+
         if line is None:
-            line = ''
+            line = ""
         self.sbLine.setText(
-            QCoreApplication.translate('ViewManager', 'Line: {0:5}')
-            .format(line))
-        
+            QCoreApplication.translate("ViewManager", "Line: {0:5}").format(line)
+        )
+
         if pos is None:
-            pos = ''
+            pos = ""
         self.sbPos.setText(
-            QCoreApplication.translate('ViewManager', 'Pos: {0:5}')
-            .format(pos))
-        
+            QCoreApplication.translate("ViewManager", "Pos: {0:5}").format(pos)
+        )
+
         if encoding is None:
-            encoding = ''
+            encoding = ""
         self.sbEnc.setText(encoding)
-        
+
         if language is None:
             pixmap = QPixmap()
         elif language == "":
             pixmap = UI.PixmapCache.getPixmap("fileText")
         else:
             import QScintilla.Lexers
+
             pixmap = QScintilla.Lexers.getLanguageIcon(language, True)
         self.sbLang.setPixmap(pixmap)
         if pixmap.isNull():
@@ -4814,16 +5855,18 @@
         else:
             self.sbLang.setText("")
             self.sbLang.setToolTip(
-                QCoreApplication.translate('ViewManager', 'Language: {0}')
-                .format(language))
-        
+                QCoreApplication.translate("ViewManager", "Language: {0}").format(
+                    language
+                )
+            )
+
         if eol is None:
-            eol = ''
+            eol = ""
         self.sbEol.setPixmap(self.__eolPixmap(eol))
         self.sbEol.setToolTip(
-            QCoreApplication.translate('ViewManager', 'EOL Mode: {0}')
-            .format(eol))
-        
+            QCoreApplication.translate("ViewManager", "EOL Mode: {0}").format(eol)
+        )
+
         if zoom is None:
             if QApplication.focusWidget() == ericApp().getObject("Shell"):
                 aw = ericApp().getObject("Shell")
@@ -4833,11 +5876,11 @@
                 self.sbZoom.setValue(aw.getZoom())
         else:
             self.sbZoom.setValue(zoom)
-        
+
     def __eolPixmap(self, eolIndicator):
         """
         Private method to get an EOL pixmap for an EOL string.
-        
+
         @param eolIndicator eol indicator string (string)
         @return pixmap for the eol indicator (QPixmap)
         """
@@ -4850,18 +5893,18 @@
         else:
             pixmap = QPixmap()
         return pixmap
-        
+
     def __unhighlight(self):
         """
         Private slot to switch of all highlights.
         """
         self.unhighlight()
-        
+
     def unhighlight(self, current=False):
         """
         Public method to switch off all highlights or the highlight of
         the current editor.
-        
+
         @param current flag indicating only the current editor should be
             unhighlighted (boolean)
         """
@@ -4871,11 +5914,11 @@
         else:
             for editor in self.editors:
                 editor.highlight()
-        
+
     def getOpenFilenames(self):
         """
         Public method returning a list of the filenames of all editors.
-        
+
         @return list of all opened filenames (list of strings)
         """
         filenames = []
@@ -4884,16 +5927,16 @@
             if fn is not None and fn not in filenames and os.path.exists(fn):
                 # only return names of existing files
                 filenames.append(fn)
-        
+
         return filenames
-        
+
     def getEditor(self, fn, filetype="", addNext=False, indexes=None):
         """
         Public method to return the editor displaying the given file.
-        
+
         If there is no editor with the given file, a new editor window is
         created.
-        
+
         @param fn filename to look for
         @type str
         @param filetype type of the source file
@@ -4916,9 +5959,14 @@
                     break
             else:
                 from QScintilla.EditorAssembly import EditorAssembly
-                assembly = EditorAssembly(self.dbs, fn, self,
-                                          filetype=filetype,
-                                          tv=ericApp().getObject("TaskViewer"))
+
+                assembly = EditorAssembly(
+                    self.dbs,
+                    fn,
+                    self,
+                    filetype=filetype,
+                    tv=ericApp().getObject("TaskViewer"),
+                )
                 editor = assembly.getEditor()
                 self.editors.append(editor)
                 self.__connectEditor(editor)
@@ -4926,35 +5974,35 @@
                 self.editorOpened.emit(fn)
                 self.editorOpenedEd.emit(editor)
                 newWin = True
-        
+
         if newWin:
             self._addView(assembly, fn, addNext=addNext, indexes=indexes)
         else:
             self._showView(editor.parent(), fn)
-        
+
         return (newWin, editor)
-        
+
     def getOpenEditors(self):
         """
         Public method to get references to all open editors.
-        
+
         @return list of references to all open editors (list of
             QScintilla.editor)
         """
         return self.editors
-        
+
     def getOpenEditorsCount(self):
         """
         Public method to get the number of open editors.
-        
+
         @return number of open editors (integer)
         """
         return len(self.editors)
-        
+
     def getOpenEditor(self, fn):
         """
         Public method to return the editor displaying the given file.
-        
+
         @param fn filename to look for
         @return a reference to the editor displaying this file or None, if
             no editor was found
@@ -4962,13 +6010,13 @@
         for editor in self.editors:
             if Utilities.samepath(fn, editor.getFileName()):
                 return editor
-        
+
         return None
-        
+
     def getOpenEditorCount(self, fn):
         """
         Public method to return the count of editors displaying the given file.
-        
+
         @param fn filename to look for
         @return count of editors displaying this file (integer)
         """
@@ -4977,25 +6025,25 @@
             if Utilities.samepath(fn, editor.getFileName()):
                 count += 1
         return count
-        
+
     def getOpenEditorsForSession(self):
         """
         Public method to get a lists of all open editors.
-        
+
         The returned list contains one list per split view. If the view manager
         cannot split the view, only one list of editors is returned.
-        
+
         Note: This method should be implemented by subclasses.
-        
+
         @return list of list of editor references
         @rtype list of list of Editor
         """
         return [self.editors]
-        
+
     def getActiveName(self):
         """
         Public method to retrieve the filename of the active window.
-        
+
         @return filename of active window (string)
         """
         aw = self.activeWindow()
@@ -5003,11 +6051,11 @@
             return aw.getFileName()
         else:
             return None
-        
+
     def saveEditor(self, fn):
         """
         Public method to save a named editor file.
-        
+
         @param fn filename of editor to be saved (string)
         @return flag indicating success (boolean)
         """
@@ -5016,17 +6064,17 @@
                 break
         else:
             return True
-        
+
         if not editor.isModified():
             return True
         else:
             ok = editor.saveFile()
             return ok
-        
+
     def saveEditorEd(self, ed):
         """
         Public slot to save the contents of an editor.
-        
+
         @param ed editor to be saved
         @return flag indicating success (boolean)
         """
@@ -5040,7 +6088,7 @@
                 return ok
         else:
             return False
-        
+
     def saveCurrentEditor(self):
         """
         Public slot to save the contents of the current editor.
@@ -5051,14 +6099,14 @@
     def saveAsEditorEd(self, ed):
         """
         Public slot to save the contents of an editor to a new file.
-        
+
         @param ed editor to be saved
         """
         if ed:
             ok = ed.saveFileAs()
             if ok:
                 self.setEditorName(ed, ed.getFileName())
-        
+
     def saveAsCurrentEditor(self):
         """
         Public slot to save the contents of the current editor to a new file.
@@ -5070,12 +6118,12 @@
         """
         Public slot to save the contents of an editor to a new copy of
         the file.
-        
+
         @param ed editor to be saved
         """
         if ed:
             ed.saveFileCopy()
-        
+
     def saveCopyCurrentEditor(self):
         """
         Public slot to save the contents of the current editor to a new copy
@@ -5083,18 +6131,18 @@
         """
         aw = self.activeWindow()
         self.saveCopyEditorEd(aw)
-        
+
     def saveEditorsList(self, editors):
         """
         Public slot to save a list of editors.
-        
+
         @param editors list of editors to be saved
         """
         for editor in editors:
             ok = editor.saveFile()
             if ok:
                 self.setEditorName(editor, editor.getFileName())
-        
+
     def saveAllEditors(self):
         """
         Public slot to save the contents of all editors.
@@ -5103,29 +6151,31 @@
             ok = editor.saveFile()
             if ok:
                 self.setEditorName(editor, editor.getFileName())
-        
+
         # restart autosave timer
         if self.autosaveInterval > 0:
             self.autosaveTimer.start(self.autosaveInterval * 60000)
-        
+
     def __exportMenuTriggered(self, act):
         """
         Private method to handle the selection of an export format.
-        
+
         @param act reference to the action that was triggered (QAction)
         """
         aw = self.activeWindow()
         if aw:
             exporterFormat = act.data()
             aw.exportFile(exporterFormat)
-        
+
     def newEditor(self):
         """
         Public slot to generate a new empty editor.
         """
         from QScintilla.EditorAssembly import EditorAssembly
-        assembly = EditorAssembly(self.dbs, "", self,
-                                  tv=ericApp().getObject("TaskViewer"))
+
+        assembly = EditorAssembly(
+            self.dbs, "", self, tv=ericApp().getObject("TaskViewer")
+        )
         editor = assembly.getEditor()
         self.editors.append(editor)
         self.__connectEditor(editor)
@@ -5134,34 +6184,34 @@
         self._checkActions(editor)
         self.editorOpened.emit("")
         self.editorOpenedEd.emit(editor)
-        
+
     def printEditor(self, editor):
         """
         Public slot to print an editor.
-        
+
         @param editor editor to be printed
         @type Editor
         """
         if editor:
             editor.printFile()
-    
+
     def printCurrentEditor(self):
         """
         Public slot to print the contents of the current editor.
         """
         aw = self.activeWindow()
         self.printEditor(aw)
-        
+
     def printPreviewEditor(self, editor):
         """
         Public slot to show a print preview of an editor.
-        
+
         @param editor editor to be printed
         @type Editor
         """
         if editor:
             editor.printPreviewFile()
-    
+
     def printPreviewCurrentEditor(self):
         """
         Public slot to show a print preview of the current editor.
@@ -5169,76 +6219,78 @@
         aw = self.activeWindow()
         if aw:
             aw.printPreviewFile()
-        
+
     def __showFileMenu(self):
         """
         Private method to set up the file menu.
         """
         self.menuRecentAct.setEnabled(len(self.recent) > 0)
-        
+
     def __showRecentMenu(self):
         """
         Private method to set up recent files menu.
         """
         self.__loadRecent()
-        
+
         self.recentMenu.clear()
-        
+
         for idx, rs in enumerate(self.recent, start=1):
-            formatStr = '&{0:d}. {1}' if idx < 10 else '{0:d}. {1}'
+            formatStr = "&{0:d}. {1}" if idx < 10 else "{0:d}. {1}"
             act = self.recentMenu.addAction(
                 formatStr.format(
-                    idx,
-                    Utilities.compactPath(rs, self.ui.maxMenuFilePathLen)))
+                    idx, Utilities.compactPath(rs, self.ui.maxMenuFilePathLen)
+                )
+            )
             act.setData(rs)
             act.setEnabled(pathlib.Path(rs).exists())
-        
+
         self.recentMenu.addSeparator()
         self.recentMenu.addAction(
-            QCoreApplication.translate('ViewManager', '&Clear'),
-            self.clearRecent)
-        
+            QCoreApplication.translate("ViewManager", "&Clear"), self.clearRecent
+        )
+
     def __openSourceFile(self, act):
         """
         Private method to open a file from the list of recently opened files.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         file = act.data()
         if file:
             self.openSourceFile(file)
-        
+
     def clearRecent(self):
         """
         Public method to clear the recent files menu.
         """
         self.recent = []
         self.__saveRecent()
-        
+
     def __showBookmarkedMenu(self):
         """
         Private method to set up bookmarked files menu.
         """
         self.bookmarkedMenu.clear()
-        
+
         for rp in self.bookmarked:
             act = self.bookmarkedMenu.addAction(
-                Utilities.compactPath(rp, self.ui.maxMenuFilePathLen))
+                Utilities.compactPath(rp, self.ui.maxMenuFilePathLen)
+            )
             act.setData(rp)
             act.setEnabled(pathlib.Path(rp).exists())
-        
+
         if len(self.bookmarked):
             self.bookmarkedMenu.addSeparator()
         self.bookmarkedMenu.addAction(
-            QCoreApplication.translate('ViewManager', '&Add'),
-            self.__addBookmarked)
+            QCoreApplication.translate("ViewManager", "&Add"), self.__addBookmarked
+        )
         self.bookmarkedMenu.addAction(
-            QCoreApplication.translate('ViewManager', '&Edit...'),
-            self.__editBookmarked)
+            QCoreApplication.translate("ViewManager", "&Edit..."), self.__editBookmarked
+        )
         self.bookmarkedMenu.addAction(
-            QCoreApplication.translate('ViewManager', '&Clear'),
-            self.__clearBookmarked)
-        
+            QCoreApplication.translate("ViewManager", "&Clear"), self.__clearBookmarked
+        )
+
     def __addBookmarked(self):
         """
         Private method to add the current file to the list of bookmarked files.
@@ -5246,75 +6298,76 @@
         an = self.getActiveName()
         if an is not None and an not in self.bookmarked:
             self.bookmarked.append(an)
-        
+
     def __editBookmarked(self):
         """
         Private method to edit the list of bookmarked files.
         """
         from .BookmarkedFilesDialog import BookmarkedFilesDialog
+
         dlg = BookmarkedFilesDialog(self.bookmarked, self.ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.bookmarked = dlg.getBookmarkedFiles()
-        
+
     def __clearBookmarked(self):
         """
         Private method to clear the bookmarked files menu.
         """
         self.bookmarked = []
-        
+
     def projectOpened(self):
         """
         Public slot to handle the projectOpened signal.
         """
         for editor in self.editors:
             editor.projectOpened()
-        
+
         self.__editProjectPwlAct.setEnabled(True)
         self.__editProjectPelAct.setEnabled(True)
-    
+
     def projectClosed(self):
         """
         Public slot to handle the projectClosed signal.
         """
         for editor in self.editors:
             editor.projectClosed()
-        
+
         self.__editProjectPwlAct.setEnabled(False)
         self.__editProjectPelAct.setEnabled(False)
-    
+
     def projectFileRenamed(self, oldfn, newfn):
         """
         Public slot to handle the projectFileRenamed signal.
-        
+
         @param oldfn old filename of the file (string)
         @param newfn new filename of the file (string)
         """
         editor = self.getOpenEditor(oldfn)
         if editor:
             editor.fileRenamed(newfn)
-        
+
     def projectLexerAssociationsChanged(self):
         """
         Public slot to handle changes of the project lexer associations.
         """
         for editor in self.editors:
             editor.projectLexerAssociationsChanged()
-        
+
     def enableEditorsCheckFocusIn(self, enabled):
         """
         Public method to set a flag enabling the editors to perform focus in
         checks.
-        
+
         @param enabled flag indicating focus in checks should be performed
             (boolean)
         """
         self.editorsCheckFocusIn = enabled
-        
+
     def editorsCheckFocusInEnabled(self):
         """
         Public method returning the flag indicating editors should perform
         focus in checks.
-        
+
         @return flag indicating focus in checks should be performed (boolean)
         """
         return self.editorsCheckFocusIn
@@ -5324,11 +6377,11 @@
         Private method to handle the Find File action.
         """
         self.ui.showFindLocationWidget()
-    
+
     def appFocusChanged(self, old, now):
         """
         Public method to handle the global change of focus.
-        
+
         @param old reference to the widget loosing focus
         @type QWidget
         @param now reference to the widget gaining focus
@@ -5337,9 +6390,9 @@
         # Focus handling was changed with Qt 5.13.1; this copes with that
         if now is None:
             return
-        
+
         from QScintilla.Shell import Shell
-        
+
         if not isinstance(now, (Editor, Shell)):
             self.editActGrp.setEnabled(False)
             self.copyActGrp.setEnabled(False)
@@ -5348,35 +6401,35 @@
         else:
             self.sbZoom.setEnabled(True)
             self.sbZoom.setValue(now.getZoom())
-        
+
         if not isinstance(now, (Editor, Shell)):
             self.searchActGrp.setEnabled(False)
-        
+
         if not isinstance(now, (Editor, Shell)):
             self.__lastFocusWidget = old
-    
+
     ##################################################################
     ## Below are the action methods for the edit menu
     ##################################################################
-    
+
     def __editUndo(self):
         """
         Private method to handle the undo action.
         """
         self.activeWindow().undo()
-        
+
     def __editRedo(self):
         """
         Private method to handle the redo action.
         """
         self.activeWindow().redo()
-        
+
     def __editRevert(self):
         """
         Private method to handle the revert action.
         """
         self.activeWindow().revertToUnmodified()
-        
+
     def __editCut(self):
         """
         Private method to handle the cut action.
@@ -5385,7 +6438,7 @@
             ericApp().getObject("Shell").cut()
         else:
             self.activeWindow().cut()
-        
+
     def __editCopy(self):
         """
         Private method to handle the copy action.
@@ -5394,7 +6447,7 @@
             ericApp().getObject("Shell").copy()
         else:
             self.activeWindow().copy()
-        
+
     def __editPaste(self):
         """
         Private method to handle the paste action.
@@ -5403,7 +6456,7 @@
             ericApp().getObject("Shell").paste()
         else:
             self.activeWindow().paste()
-        
+
     def __editDelete(self):
         """
         Private method to handle the delete action.
@@ -5412,144 +6465,143 @@
             ericApp().getObject("Shell").clear()
         else:
             self.activeWindow().clear()
-        
+
     def __editJoin(self):
         """
         Private method to handle the join action.
         """
         self.activeWindow().joinLines()
-        
+
     def __editIndent(self):
         """
         Private method to handle the indent action.
         """
         self.activeWindow().indentLineOrSelection()
-        
+
     def __editUnindent(self):
         """
         Private method to handle the unindent action.
         """
         self.activeWindow().unindentLineOrSelection()
-        
+
     def __editSmartIndent(self):
         """
         Private method to handle the smart indent action.
         """
         self.activeWindow().smartIndentLineOrSelection()
-        
+
     def __editToggleComment(self):
         """
         Private method to handle the toggle comment action.
         """
         self.activeWindow().toggleCommentBlock()
-        
+
     def __editComment(self):
         """
         Private method to handle the comment action.
         """
         self.activeWindow().commentLineOrSelection()
-        
+
     def __editUncomment(self):
         """
         Private method to handle the uncomment action.
         """
         self.activeWindow().uncommentLineOrSelection()
-        
+
     def __editStreamComment(self):
         """
         Private method to handle the stream comment action.
         """
         self.activeWindow().streamCommentLineOrSelection()
-        
+
     def __editBoxComment(self):
         """
         Private method to handle the box comment action.
         """
         self.activeWindow().boxCommentLineOrSelection()
-        
+
     def __editSelectBrace(self):
         """
         Private method to handle the select to brace action.
         """
         self.activeWindow().selectToMatchingBrace()
-        
+
     def __editSelectAll(self):
         """
         Private method to handle the select all action.
         """
         self.activeWindow().selectAll(True)
-        
+
     def __editDeselectAll(self):
         """
         Private method to handle the select all action.
         """
         self.activeWindow().selectAll(False)
-        
+
     def __convertEOL(self):
         """
         Private method to handle the convert line end characters action.
         """
         aw = self.activeWindow()
         aw.convertEols(aw.eolMode())
-        
+
     def __shortenEmptyLines(self):
         """
         Private method to handle the shorten empty lines action.
         """
         self.activeWindow().shortenEmptyLines()
-        
+
     def __editAutoComplete(self):
         """
         Private method to handle the autocomplete action.
         """
         self.activeWindow().autoComplete()
-        
+
     def __editAutoCompleteFromDoc(self):
         """
         Private method to handle the autocomplete from document action.
         """
         self.activeWindow().autoCompleteFromDocument()
-        
+
     def __editAutoCompleteFromAPIs(self):
         """
         Private method to handle the autocomplete from APIs action.
         """
         self.activeWindow().autoCompleteFromAPIs()
-        
+
     def __editAutoCompleteFromAll(self):
         """
         Private method to handle the autocomplete from All action.
         """
         self.activeWindow().autoCompleteFromAll()
-        
+
     def __editorAutoCompletionAPIsAvailable(self, available, editor):
         """
         Private method to handle the availability of API autocompletion signal.
-        
+
         @param available flag indicating the availability of API
             autocompletion
         @type bool
         @param editor reference to the editor
         @type Editor
         """
-        self.autoCompleteAct.setEnabled(
-            editor.canProvideDynamicAutoCompletion())
+        self.autoCompleteAct.setEnabled(editor.canProvideDynamicAutoCompletion())
         self.autoCompleteFromAPIsAct.setEnabled(available)
         self.autoCompleteFromAllAct.setEnabled(available)
         self.calltipsAct.setEnabled(editor.canProvideCallTipps())
-        
+
     def __editShowCallTips(self):
         """
         Private method to handle the calltips action.
         """
         self.activeWindow().callTip()
-    
+
     def __editShowCodeInfo(self):
         """
         Private method to handle the code info action.
         """
         self.showEditorInfo(self.activeWindow())
-    
+
     ##################################################################
     ## Below are the action and utility methods for the search menu
     ##################################################################
@@ -5558,7 +6610,7 @@
         """
         Public method to determine the selection or the current word for the
         next find operation.
-        
+
         @param getCurrentWord flag indicating to return the current word, if
             no selected text was found (boolean)
         @return selection or current word (string)
@@ -5566,18 +6618,18 @@
         aw = self.activeWindow()
         if aw is None:
             return ""
-        
+
         return aw.getSearchText(not getCurrentWord)
-        
+
     def getSRHistory(self, key):
         """
         Public method to get the search or replace history list.
-        
+
         @param key list to return (must be 'search' or 'replace')
         @return the requested history list (list of strings)
         """
         return self.srHistory[key]
-        
+
     def showSearchWidget(self):
         """
         Public method to show the search widget.
@@ -5585,7 +6637,7 @@
         self.__replaceWidget.hide()
         self.__searchWidget.show()
         self.__searchWidget.show(self.textForFind())
-    
+
     def __searchNext(self):
         """
         Private slot to handle the search next action.
@@ -5594,7 +6646,7 @@
             self.__replaceWidget.findNext()
         else:
             self.__searchWidget.findNext()
-    
+
     def __searchPrev(self):
         """
         Private slot to handle the search previous action.
@@ -5603,107 +6655,107 @@
             self.__replaceWidget.findPrev()
         else:
             self.__searchWidget.findPrev()
-    
+
     def showReplaceWidget(self):
         """
         Public method to show the replace widget.
         """
         self.__searchWidget.hide()
         self.__replaceWidget.show(self.textForFind())
-        
+
     def __findNextWord(self):
         """
         Private slot to find the next occurrence of the current word of the
         current editor.
         """
         self.activeWindow().searchCurrentWordForward()
-        
+
     def __findPrevWord(self):
         """
         Private slot to find the previous occurrence of the current word of
         the current editor.
         """
         self.activeWindow().searchCurrentWordBackward()
-        
+
     def __searchClearMarkers(self):
         """
         Private method to clear the search markers of the active window.
         """
         self.activeWindow().clearSearchIndicators()
-        
+
     def __goto(self):
         """
         Private method to handle the goto action.
         """
         from QScintilla.GotoDialog import GotoDialog
-        
+
         aw = self.activeWindow()
         lines = aw.lines()
         curLine = aw.getCursorPosition()[0] + 1
         dlg = GotoDialog(lines, curLine, self.ui, None, True)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             aw.gotoLine(dlg.getLinenumber(), expand=True)
-        
+
     def __gotoBrace(self):
         """
         Private method to handle the goto brace action.
         """
         self.activeWindow().moveToMatchingBrace()
-        
+
     def __gotoLastEditPosition(self):
         """
         Private method to move the cursor to the last edit position.
         """
         self.activeWindow().gotoLastEditPosition()
-        
+
     def __lastEditPositionAvailable(self):
         """
         Private slot to handle the lastEditPositionAvailable signal of an
         editor.
         """
         self.gotoLastEditAct.setEnabled(True)
-        
+
     def __gotoNextMethodClass(self):
         """
         Private slot to go to the next Python/Ruby method or class definition.
         """
         self.activeWindow().gotoMethodClass(False)
-        
+
     def __gotoPreviousMethodClass(self):
         """
         Private slot to go to the previous Python/Ruby method or class
         definition.
         """
         self.activeWindow().gotoMethodClass(True)
-        
+
     def __searchFiles(self):
         """
         Private method to handle the search in files action.
         """
         self.ui.showFindFilesWidget(self.textForFind())
-        
+
     def __replaceFiles(self):
         """
         Private method to handle the replace in files action.
         """
         self.ui.showReplaceFilesWidget(self.textForFind())
-        
+
     def __searchOpenFiles(self):
         """
         Private method to handle the search in open files action.
         """
         self.ui.showFindFilesWidget(self.textForFind(), openFiles=True)
-        
+
     def __replaceOpenFiles(self):
         """
         Private method to handle the replace in open files action.
         """
         self.ui.showReplaceFilesWidget(self.textForFind(), openFiles=True)
-    
+
     ##################################################################
     ## Below are the action methods for the view menu
     ##################################################################
-    
+
     def __zoomIn(self):
         """
         Private method to handle the zoom in action.
@@ -5715,7 +6767,7 @@
             if aw:
                 aw.zoomIn()
                 self.sbZoom.setValue(aw.getZoom())
-        
+
     def __zoomOut(self):
         """
         Private method to handle the zoom out action.
@@ -5727,48 +6779,49 @@
             if aw:
                 aw.zoomOut()
                 self.sbZoom.setValue(aw.getZoom())
-    
+
     def __zoomReset(self):
         """
         Private method to reset the zoom factor.
         """
         self.__zoomTo(0)
-    
+
     def __zoom(self):
         """
         Private method to handle the zoom action.
         """
         aw = (
             ericApp().getObject("Shell")
-            if QApplication.focusWidget() == ericApp().getObject("Shell") else
-            self.activeWindow()
+            if QApplication.focusWidget() == ericApp().getObject("Shell")
+            else self.activeWindow()
         )
         if aw:
             from QScintilla.ZoomDialog import ZoomDialog
+
             dlg = ZoomDialog(aw.getZoom(), self.ui, None, True)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 value = dlg.getZoomSize()
                 self.__zoomTo(value)
-        
+
     def __zoomTo(self, value):
         """
         Private slot to zoom to a given value.
-        
+
         @param value zoom value to be set (integer)
         """
         aw = (
             ericApp().getObject("Shell")
-            if QApplication.focusWidget() == ericApp().getObject("Shell") else
-            self.activeWindow()
+            if QApplication.focusWidget() == ericApp().getObject("Shell")
+            else self.activeWindow()
         )
         if aw:
             aw.zoomTo(value)
             self.sbZoom.setValue(aw.getZoom())
-        
+
     def zoomValueChanged(self, value, zoomingWidget):
         """
         Public slot to handle changes of the zoom value.
-        
+
         @param value new zoom value
         @type int
         @param zoomingWidget reference to the widget triggering the slot
@@ -5776,12 +6829,12 @@
         """
         aw = (
             ericApp().getObject("Shell")
-            if QApplication.focusWidget() == ericApp().getObject("Shell") else
-            self.activeWindow()
+            if QApplication.focusWidget() == ericApp().getObject("Shell")
+            else self.activeWindow()
         )
         if aw and aw == zoomingWidget:
             self.sbZoom.setValue(value)
-    
+
     def __clearAllFolds(self):
         """
         Private method to handle the clear all folds action.
@@ -5789,7 +6842,7 @@
         aw = self.activeWindow()
         if aw:
             aw.clearFolds()
-        
+
     def __toggleAll(self):
         """
         Private method to handle the toggle all folds action.
@@ -5797,7 +6850,7 @@
         aw = self.activeWindow()
         if aw:
             aw.foldAll()
-        
+
     def __toggleAllChildren(self):
         """
         Private method to handle the toggle all folds (including children)
@@ -5806,7 +6859,7 @@
         aw = self.activeWindow()
         if aw:
             aw.foldAll(True)
-        
+
     def __toggleCurrent(self):
         """
         Private method to handle the toggle current fold action.
@@ -5814,7 +6867,7 @@
         aw = self.activeWindow()
         if aw:
             aw.toggleCurrentFold()
-        
+
     def __newDocumentView(self):
         """
         Private method to open a new view of the current editor.
@@ -5822,7 +6875,7 @@
         aw = self.activeWindow()
         if aw:
             self.newEditorView(aw.getFileName(), aw, aw.getFileType())
-        
+
     def __newDocumentSplitView(self):
         """
         Private method to open a new view of the current editor in a new split.
@@ -5831,136 +6884,134 @@
         if aw:
             self.addSplit()
             self.newEditorView(aw.getFileName(), aw, aw.getFileType())
-        
+
     def __splitView(self):
         """
         Private method to handle the split view action.
         """
         self.addSplit()
-        
+
     def __splitOrientation(self, checked):
         """
         Private method to handle the split orientation action.
-        
+
         @param checked flag indicating the checked state of the action
             (boolean). True means splitting horizontally.
         """
         if checked:
             self.setSplitOrientation(Qt.Orientation.Horizontal)
-            self.splitViewAct.setIcon(
-                UI.PixmapCache.getIcon("splitHorizontal"))
-            self.splitRemoveAct.setIcon(
-                UI.PixmapCache.getIcon("remsplitHorizontal"))
+            self.splitViewAct.setIcon(UI.PixmapCache.getIcon("splitHorizontal"))
+            self.splitRemoveAct.setIcon(UI.PixmapCache.getIcon("remsplitHorizontal"))
             self.newDocumentSplitViewAct.setIcon(
-                UI.PixmapCache.getIcon("splitHorizontal"))
+                UI.PixmapCache.getIcon("splitHorizontal")
+            )
         else:
             self.setSplitOrientation(Qt.Orientation.Vertical)
-            self.splitViewAct.setIcon(
-                UI.PixmapCache.getIcon("splitVertical"))
-            self.splitRemoveAct.setIcon(
-                UI.PixmapCache.getIcon("remsplitVertical"))
+            self.splitViewAct.setIcon(UI.PixmapCache.getIcon("splitVertical"))
+            self.splitRemoveAct.setIcon(UI.PixmapCache.getIcon("remsplitVertical"))
             self.newDocumentSplitViewAct.setIcon(
-                UI.PixmapCache.getIcon("splitVertical"))
+                UI.PixmapCache.getIcon("splitVertical")
+            )
         Preferences.setUI("SplitOrientationVertical", checked)
-    
+
     def __previewEditor(self, checked):
         """
         Private slot to handle a change of the preview selection state.
-        
+
         @param checked state of the action (boolean)
         """
         Preferences.setUI("ShowFilePreview", checked)
         self.previewStateChanged.emit(checked)
-    
+
     def __astViewer(self, checked):
         """
         Private slot to handle a change of the AST Viewer selection state.
-        
+
         @param checked state of the action (boolean)
         """
         self.astViewerStateChanged.emit(checked)
-    
+
     def __disViewer(self, checked):
         """
         Private slot to handle a change of the DIS Viewer selection state.
-        
+
         @param checked state of the action (boolean)
         """
         self.disViewerStateChanged.emit(checked)
-    
+
     ##################################################################
     ## Below are the action methods for the macro menu
     ##################################################################
-    
+
     def __macroStartRecording(self):
         """
         Private method to handle the start macro recording action.
         """
         self.activeWindow().macroRecordingStart()
-        
+
     def __macroStopRecording(self):
         """
         Private method to handle the stop macro recording action.
         """
         self.activeWindow().macroRecordingStop()
-        
+
     def __macroRun(self):
         """
         Private method to handle the run macro action.
         """
         self.activeWindow().macroRun()
-        
+
     def __macroDelete(self):
         """
         Private method to handle the delete macro action.
         """
         self.activeWindow().macroDelete()
-        
+
     def __macroLoad(self):
         """
         Private method to handle the load macro action.
         """
         self.activeWindow().macroLoad()
-        
+
     def __macroSave(self):
         """
         Private method to handle the save macro action.
         """
         self.activeWindow().macroSave()
-    
+
     ##################################################################
     ## Below are the action methods for the bookmarks menu
     ##################################################################
-    
+
     def __toggleBookmark(self):
         """
         Private method to handle the toggle bookmark action.
         """
         self.activeWindow().menuToggleBookmark()
-        
+
     def __nextBookmark(self):
         """
         Private method to handle the next bookmark action.
         """
         self.activeWindow().nextBookmark()
-    
+
     def __previousBookmark(self):
         """
         Private method to handle the previous bookmark action.
         """
         self.activeWindow().previousBookmark()
-    
+
     def __clearAllBookmarks(self):
         """
         Private method to handle the clear all bookmarks action.
         """
         for editor in self.editors:
             editor.clearBookmarks()
-        
+
         self.bookmarkNextAct.setEnabled(False)
         self.bookmarkPreviousAct.setEnabled(False)
         self.bookmarkClearAct.setEnabled(False)
-    
+
     def __showBookmarkMenu(self):
         """
         Private method to set up the bookmark menu.
@@ -5974,13 +7025,13 @@
                 self.menuBookmarksAct.setEnabled(True)
                 return
         self.menuBookmarksAct.setEnabled(False)
-        
+
     def __showBookmarksMenu(self):
         """
         Private method to handle the show bookmarks menu signal.
         """
         self.bookmarksMenu.clear()
-        
+
         filenames = self.getOpenFilenames()
         for filename in sorted(filenames):
             editor = self.getOpenEditor(filename)
@@ -5989,28 +7040,30 @@
                 act = self.bookmarksMenu.addAction(
                     "{0}{1}".format(
                         Utilities.compactPath(
-                            filename,
-                            self.ui.maxMenuFilePathLen - len(bmSuffix)),
-                        bmSuffix))
+                            filename, self.ui.maxMenuFilePathLen - len(bmSuffix)
+                        ),
+                        bmSuffix,
+                    )
+                )
                 act.setData([filename, bookmark])
-        
+
     def __bookmarkSelected(self, act):
         """
         Private method to handle the bookmark selected signal.
-        
+
         @param act reference to the action that triggered (QAction)
         """
         bmList = act.data()
         filename = bmList[0]
         line = bmList[1]
         self.openSourceFile(filename, line)
-        
+
     def __bookmarkToggled(self, editor):
         """
         Private slot to handle the bookmarkToggled signal.
-        
+
         It checks some bookmark actions and reemits the signal.
-        
+
         @param editor editor that sent the signal
         """
         if editor.hasBookmarks():
@@ -6022,26 +7075,26 @@
             self.bookmarkPreviousAct.setEnabled(False)
             self.bookmarkClearAct.setEnabled(False)
         self.bookmarkToggled.emit(editor)
-        
+
     def __gotoSyntaxError(self):
         """
         Private method to handle the goto syntax error action.
         """
         self.activeWindow().gotoSyntaxError()
-        
+
     def __clearAllSyntaxErrors(self):
         """
         Private method to handle the clear all syntax errors action.
         """
         for editor in self.editors:
             editor.clearSyntaxError()
-        
+
     def _syntaxErrorToggled(self, editor):
         """
         Protected slot to handle the syntaxerrorToggled signal.
-        
+
         It checks some syntax error actions and reemits the signal.
-        
+
         @param editor editor that sent the signal
         """
         if editor.hasSyntaxErrors():
@@ -6059,42 +7112,42 @@
             self.warningsPreviousAct.setEnabled(False)
             self.warningsClearAct.setEnabled(False)
         self.syntaxerrorToggled.emit(editor)
-        
+
     def __nextWarning(self):
         """
         Private method to handle the next warning action.
         """
         self.activeWindow().nextWarning()
-        
+
     def __previousWarning(self):
         """
         Private method to handle the previous warning action.
         """
         self.activeWindow().previousWarning()
-        
+
     def __clearAllWarnings(self):
         """
         Private method to handle the clear all warnings action.
         """
         for editor in self.editors:
             editor.clearWarnings()
-        
+
     def __nextUncovered(self):
         """
         Private method to handle the next uncovered action.
         """
         self.activeWindow().nextUncovered()
-        
+
     def __previousUncovered(self):
         """
         Private method to handle the previous uncovered action.
         """
         self.activeWindow().previousUncovered()
-        
+
     def __coverageMarkersShown(self, shown):
         """
         Private slot to handle the coverageMarkersShown signal.
-        
+
         @param shown flag indicating whether the markers were shown or cleared
         """
         if shown:
@@ -6103,11 +7156,11 @@
         else:
             self.notcoveredNextAct.setEnabled(False)
             self.notcoveredPreviousAct.setEnabled(False)
-        
+
     def __taskMarkersUpdated(self, editor):
         """
         Private slot to handle the taskMarkersUpdated signal.
-        
+
         @param editor editor that sent the signal
         """
         if editor.hasTaskMarkers():
@@ -6116,23 +7169,23 @@
         else:
             self.taskNextAct.setEnabled(False)
             self.taskPreviousAct.setEnabled(False)
-        
+
     def __nextTask(self):
         """
         Private method to handle the next task action.
         """
         self.activeWindow().nextTask()
-        
+
     def __previousTask(self):
         """
         Private method to handle the previous task action.
         """
         self.activeWindow().previousTask()
-        
+
     def __changeMarkersUpdated(self, editor):
         """
         Private slot to handle the changeMarkersUpdated signal.
-        
+
         @param editor editor that sent the signal
         """
         if editor.hasChangeMarkers():
@@ -6141,23 +7194,23 @@
         else:
             self.changeNextAct.setEnabled(False)
             self.changePreviousAct.setEnabled(False)
-        
+
     def __nextChange(self):
         """
         Private method to handle the next change action.
         """
         self.activeWindow().nextChange()
-        
+
     def __previousChange(self):
         """
         Private method to handle the previous change action.
         """
         self.activeWindow().previousChange()
-    
+
     ##################################################################
     ## Below are the action methods for the spell checking functions
     ##################################################################
-    
+
     def __showEditSpellingMenu(self):
         """
         Private method to set up the edit dictionaries menu.
@@ -6168,13 +7221,14 @@
         self.__editProjectPwlAct.setEnabled(projetOpen and bool(pwl))
         pel = ericApp().getObject("Project").getProjectDictionaries()[1]
         self.__editProjectPelAct.setEnabled(projetOpen and bool(pel))
-        
+
         from QScintilla.SpellChecker import SpellChecker
+
         pwl = SpellChecker.getUserDictionaryPath()
         self.__editUserPwlAct.setEnabled(bool(pwl))
         pel = SpellChecker.getUserDictionaryPath(True)
         self.__editUserPelAct.setEnabled(bool(pel))
-    
+
     def __setAutoSpellChecking(self):
         """
         Private slot to set the automatic spell checking of all editors.
@@ -6183,7 +7237,7 @@
         Preferences.setEditor("AutoSpellCheckingEnabled", enabled)
         for editor in self.editors:
             editor.setAutoSpellChecking()
-    
+
     def __spellCheck(self):
         """
         Private slot to perform a spell check of the current editor.
@@ -6191,41 +7245,43 @@
         aw = self.activeWindow()
         if aw:
             aw.checkSpelling()
-    
+
     def __editProjectPWL(self):
         """
         Private slot to edit the project word list.
         """
         pwl = ericApp().getObject("Project").getProjectDictionaries()[0]
         self.__editSpellingDictionary(pwl)
-    
+
     def __editProjectPEL(self):
         """
         Private slot to edit the project exception list.
         """
         pel = ericApp().getObject("Project").getProjectDictionaries()[1]
         self.__editSpellingDictionary(pel)
-    
+
     def __editUserPWL(self):
         """
         Private slot to edit the user word list.
         """
         from QScintilla.SpellChecker import SpellChecker
+
         pwl = SpellChecker.getUserDictionaryPath()
         self.__editSpellingDictionary(pwl)
-    
+
     def __editUserPEL(self):
         """
         Private slot to edit the user exception list.
         """
         from QScintilla.SpellChecker import SpellChecker
+
         pel = SpellChecker.getUserDictionaryPath(True)
         self.__editSpellingDictionary(pel)
-    
+
     def __editSpellingDictionary(self, dictionaryFile):
         """
         Private slot to edit the given spelling dictionary.
-        
+
         @param dictionaryFile file name of the dictionary to edit (string)
         """
         if os.path.exists(dictionaryFile):
@@ -6236,26 +7292,32 @@
                 EricMessageBox.critical(
                     self.ui,
                     QCoreApplication.translate(
-                        'ViewManager', "Edit Spelling Dictionary"),
+                        "ViewManager", "Edit Spelling Dictionary"
+                    ),
                     QCoreApplication.translate(
-                        'ViewManager',
+                        "ViewManager",
                         """<p>The spelling dictionary file <b>{0}</b> could"""
-                        """ not be read.</p><p>Reason: {1}</p>""").format(
-                        dictionaryFile, str(err)))
+                        """ not be read.</p><p>Reason: {1}</p>""",
+                    ).format(dictionaryFile, str(err)),
+                )
                 return
-            
+
             fileInfo = (
-                dictionaryFile if len(dictionaryFile) < 40
+                dictionaryFile
+                if len(dictionaryFile) < 40
                 else "...{0}".format(dictionaryFile[-40:])
             )
             from QScintilla.SpellingDictionaryEditDialog import (
-                SpellingDictionaryEditDialog
-            )
+                SpellingDictionaryEditDialog,
+            )
+
             dlg = SpellingDictionaryEditDialog(
                 data,
-                QCoreApplication.translate('ViewManager', "Editing {0}")
-                .format(fileInfo),
-                self.ui)
+                QCoreApplication.translate("ViewManager", "Editing {0}").format(
+                    fileInfo
+                ),
+                self.ui,
+            )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 data = dlg.getData()
                 try:
@@ -6265,27 +7327,31 @@
                     EricMessageBox.critical(
                         self.ui,
                         QCoreApplication.translate(
-                            'ViewManager', "Edit Spelling Dictionary"),
+                            "ViewManager", "Edit Spelling Dictionary"
+                        ),
                         QCoreApplication.translate(
-                            'ViewManager',
+                            "ViewManager",
                             """<p>The spelling dictionary file <b>{0}</b>"""
                             """ could not be written.</p>"""
-                            """<p>Reason: {1}</p>""").format(
-                            dictionaryFile, str(err)))
+                            """<p>Reason: {1}</p>""",
+                        ).format(dictionaryFile, str(err)),
+                    )
                     return
-                
+
                 self.ui.showNotification(
                     UI.PixmapCache.getPixmap("spellchecking48"),
                     QCoreApplication.translate(
-                        'ViewManager', "Edit Spelling Dictionary"),
+                        "ViewManager", "Edit Spelling Dictionary"
+                    ),
                     QCoreApplication.translate(
-                        'ViewManager',
-                        "The spelling dictionary was saved successfully."))
-    
+                        "ViewManager", "The spelling dictionary was saved successfully."
+                    ),
+                )
+
     ##################################################################
     ## Below are general utility methods
     ##################################################################
-    
+
     def handleResetUI(self):
         """
         Public slot to handle the resetUI signal.
@@ -6299,37 +7365,35 @@
             lang = editor.getLanguage()
             eol = editor.getEolIndicator()
             zoom = editor.getZoom()
-            self.__setSbFile(editor.getFileName(), line + 1, pos, enc, lang,
-                             eol, zoom)
-        
+            self.__setSbFile(editor.getFileName(), line + 1, pos, enc, lang, eol, zoom)
+
     def closeViewManager(self):
         """
         Public method to shutdown the viewmanager.
-        
+
         If it cannot close all editor windows, it aborts the shutdown process.
-        
+
         @return flag indicating success (boolean)
         """
         with contextlib.suppress(TypeError):
             ericApp().focusChanged.disconnect(self.appFocusChanged)
-        
+
         self.closeAllWindows()
         self.currentEditor = None
-        
+
         # save the list of recently opened projects
         self.__saveRecent()
-        
+
         # save the list of recently opened projects
-        Preferences.getSettings().setValue(
-            'Bookmarked/Sources', self.bookmarked)
-        
+        Preferences.getSettings().setValue("Bookmarked/Sources", self.bookmarked)
+
         res = len(self.editors) == 0
-        
+
         if not res:
             ericApp().focusChanged.connect(self.appFocusChanged)
-        
+
         return res
-        
+
     def __lastEditorClosed(self):
         """
         Private slot to handle the lastEditorClosed signal.
@@ -6357,26 +7421,26 @@
         self.bookmarkActGrp.setEnabled(False)
         self.__enableSpellingActions()
         self.__setSbFile(zoom=0)
-        
+
         # remove all split views, if this is supported
         if self.canSplit():
             while self.removeSplit():
                 pass
-        
+
         # stop the autosave timer
         if self.autosaveTimer.isActive():
             self.autosaveTimer.stop()
-        
+
         # hide search and replace widgets
         self.__searchWidget.hide()
         self.__replaceWidget.hide()
-        
+
         # hide the AST Viewer via its action
         self.astViewerAct.setChecked(False)
-        
+
         # hide the DIS Viewer via its action
         self.disViewerAct.setChecked(False)
-        
+
     def __editorOpened(self):
         """
         Private slot to handle the editorOpened signal.
@@ -6403,18 +7467,15 @@
         self.__enableSpellingActions()
         self.astViewerAct.setEnabled(True)
         self.disViewerAct.setEnabled(True)
-        
+
         # activate the autosave timer
-        if (
-            not self.autosaveTimer.isActive() and
-            self.autosaveInterval > 0
-        ):
+        if not self.autosaveTimer.isActive() and self.autosaveInterval > 0:
             self.autosaveTimer.start(self.autosaveInterval * 60000)
-        
+
     def __autosave(self):
         """
         Private slot to save the contents of all editors automatically.
-        
+
         Only named editors will be saved by the autosave timer.
         """
         for editor in self.editors:
@@ -6422,16 +7483,16 @@
                 ok = editor.saveFile()
                 if ok:
                     self.setEditorName(editor, editor.getFileName())
-        
+
         # restart autosave timer
         if self.autosaveInterval > 0:
             self.autosaveTimer.start(self.autosaveInterval * 60000)
-        
+
     def _checkActions(self, editor, setSb=True):
         """
         Protected slot to check some actions for their enable/disable status
         and set the statusbar info.
-        
+
         @param editor editor window
         @param setSb flag indicating an update of the status bar is wanted
             (boolean)
@@ -6439,12 +7500,11 @@
         if editor is not None:
             self.saveAct.setEnabled(editor.isModified())
             self.revertAct.setEnabled(editor.isModified())
-            
+
             self.undoAct.setEnabled(editor.isUndoAvailable())
             self.redoAct.setEnabled(editor.isRedoAvailable())
-            self.gotoLastEditAct.setEnabled(
-                editor.isLastEditPositionAvailable())
-            
+            self.gotoLastEditAct.setEnabled(editor.isLastEditPositionAvailable())
+
             lex = editor.getLexer()
             if lex is not None:
                 self.commentAct.setEnabled(lex.canBlockComment())
@@ -6456,7 +7516,7 @@
                 self.uncommentAct.setEnabled(False)
                 self.streamCommentAct.setEnabled(False)
                 self.boxCommentAct.setEnabled(False)
-            
+
             if editor.hasBookmarks():
                 self.bookmarkNextAct.setEnabled(True)
                 self.bookmarkPreviousAct.setEnabled(True)
@@ -6465,14 +7525,14 @@
                 self.bookmarkNextAct.setEnabled(False)
                 self.bookmarkPreviousAct.setEnabled(False)
                 self.bookmarkClearAct.setEnabled(False)
-            
+
             if editor.hasSyntaxErrors():
                 self.syntaxErrorGotoAct.setEnabled(True)
                 self.syntaxErrorClearAct.setEnabled(True)
             else:
                 self.syntaxErrorGotoAct.setEnabled(False)
                 self.syntaxErrorClearAct.setEnabled(False)
-            
+
             if editor.hasWarnings():
                 self.warningsNextAct.setEnabled(True)
                 self.warningsPreviousAct.setEnabled(True)
@@ -6481,51 +7541,50 @@
                 self.warningsNextAct.setEnabled(False)
                 self.warningsPreviousAct.setEnabled(False)
                 self.warningsClearAct.setEnabled(False)
-            
+
             if editor.hasCoverageMarkers():
                 self.notcoveredNextAct.setEnabled(True)
                 self.notcoveredPreviousAct.setEnabled(True)
             else:
                 self.notcoveredNextAct.setEnabled(False)
                 self.notcoveredPreviousAct.setEnabled(False)
-            
+
             if editor.hasTaskMarkers():
                 self.taskNextAct.setEnabled(True)
                 self.taskPreviousAct.setEnabled(True)
             else:
                 self.taskNextAct.setEnabled(False)
                 self.taskPreviousAct.setEnabled(False)
-            
+
             if editor.hasChangeMarkers():
                 self.changeNextAct.setEnabled(True)
                 self.changePreviousAct.setEnabled(True)
             else:
                 self.changeNextAct.setEnabled(False)
                 self.changePreviousAct.setEnabled(False)
-            
+
             if editor.canAutoCompleteFromAPIs():
                 self.autoCompleteFromAPIsAct.setEnabled(True)
                 self.autoCompleteFromAllAct.setEnabled(True)
             else:
                 self.autoCompleteFromAPIsAct.setEnabled(False)
                 self.autoCompleteFromAllAct.setEnabled(False)
-            self.autoCompleteAct.setEnabled(
-                editor.canProvideDynamicAutoCompletion())
+            self.autoCompleteAct.setEnabled(editor.canProvideDynamicAutoCompletion())
             self.calltipsAct.setEnabled(editor.canProvideCallTipps())
             self.codeInfoAct.setEnabled(self.__isEditorInfoSupportedEd(editor))
-            
+
             if editor.isPyFile() or editor.isRubyFile():
                 self.gotoPreviousDefAct.setEnabled(True)
                 self.gotoNextDefAct.setEnabled(True)
             else:
                 self.gotoPreviousDefAct.setEnabled(False)
                 self.gotoNextDefAct.setEnabled(False)
-            
+
             self.sortAct.setEnabled(editor.selectionIsRectangle())
             enable = editor.hasSelection()
             self.editUpperCaseAct.setEnabled(enable)
             self.editLowerCaseAct.setEnabled(enable)
-            
+
             if setSb:
                 line, pos = editor.getCursorPosition()
                 enc = editor.getEncoding()
@@ -6533,20 +7592,21 @@
                 eol = editor.getEolIndicator()
                 zoom = editor.getZoom()
                 self.__setSbFile(
-                    editor.getFileName(), line + 1, pos, enc, lang, eol, zoom)
-            
+                    editor.getFileName(), line + 1, pos, enc, lang, eol, zoom
+                )
+
             self.checkActions.emit(editor)
-        
+
         saveAllEnable = False
         for editor in self.editors:
             if editor.isModified():
                 saveAllEnable = True
         self.saveAllAct.setEnabled(saveAllEnable)
-        
+
     def preferencesChanged(self):
         """
         Public slot to handle the preferencesChanged signal.
-        
+
         This method performs the following actions
             <ul>
             <li>reread the colours for the syntax highlighting</li>
@@ -6558,35 +7618,29 @@
         """
         # reload the APIs
         self.apisManager.reloadAPIs()
-        
+
         # reload editor settings
         for editor in self.editors:
             zoom = editor.getZoom()
             editor.readSettings()
             editor.zoomTo(zoom)
-        
+
         # reload the autosave timer setting
         self.autosaveInterval = Preferences.getEditor("AutosaveInterval")
         if len(self.editors):
-            if (
-                self.autosaveTimer.isActive() and
-                self.autosaveInterval == 0
-            ):
+            if self.autosaveTimer.isActive() and self.autosaveInterval == 0:
                 self.autosaveTimer.stop()
-            elif (
-                not self.autosaveTimer.isActive() and
-                self.autosaveInterval > 0
-            ):
+            elif not self.autosaveTimer.isActive() and self.autosaveInterval > 0:
                 self.autosaveTimer.start(self.autosaveInterval * 60000)
-        
+
         self.__enableSpellingActions()
-        
+
     def __editorSaved(self, fn, editor):
         """
         Private slot to handle the editorSaved signal.
-        
+
         It simply re-emits the signal.
-        
+
         @param fn filename of the saved editor
         @type str
         @param editor reference to the editor
@@ -6594,13 +7648,13 @@
         """
         self.editorSaved.emit(fn)
         self.editorSavedEd.emit(editor)
-        
+
     def __editorRenamed(self, fn, editor):
         """
         Private slot to handle the editorRenamed signal.
-        
+
         It simply re-emits the signal.
-        
+
         @param fn filename of the renamed editor
         @type str
         @param editor reference to the editor
@@ -6608,13 +7662,13 @@
         """
         self.editorRenamed.emit(fn)
         self.editorRenamedEd.emit(editor)
-        
+
     def __cursorChanged(self, fn, line, pos, editor):
         """
         Private slot to handle the cursorChanged signal.
-        
+
         It emits the signal cursorChanged with parameter editor.
-        
+
         @param fn filename
         @type str
         @param line line number of the cursor
@@ -6629,14 +7683,14 @@
         eol = editor.getEolIndicator()
         self.__setSbFile(fn, line, pos, enc, lang, eol)
         self.cursorChanged.emit(editor)
-    
+
     def __editorDoubleClicked(self, editor, pos, buttons):
         """
         Private slot handling mouse double clicks of an editor.
-        
+
         Note: This method is simply a multiplexer to re-emit the signal
         with the editor prepended.
-        
+
         @param editor reference to the editor, that emitted the signal
         @type Editor
         @param pos position of the double click
@@ -6645,21 +7699,21 @@
         @type Qt.MouseButtons
         """
         self.editorDoubleClickedEd.emit(editor, pos, buttons)
-    
+
     def __breakpointToggled(self, editor):
         """
         Private slot to handle the breakpointToggled signal.
-        
+
         It simply reemits the signal.
-        
+
         @param editor editor that sent the signal
         """
         self.breakpointToggled.emit(editor)
-        
+
     def getActions(self, actionSetType):
         """
         Public method to get a list of all actions.
-        
+
         @param actionSetType string denoting the action set to get.
             It must be one of "edit", "file", "search", "view", "window",
             "macro", "bookmark" or "spelling".
@@ -6669,11 +7723,11 @@
             return self.__actions[actionSetType][:]
         except KeyError:
             return []
-        
+
     def __editorCommand(self, cmd):
         """
         Private method to send an editor command to the active window.
-        
+
         @param cmd the scintilla command to be sent
         """
         focusWidget = QApplication.focusWidget()
@@ -6683,7 +7737,7 @@
             aw = self.activeWindow()
             if aw:
                 aw.editorCommand(cmd)
-        
+
     def __newLineBelow(self):
         """
         Private method to insert a new line below the current one even if
@@ -6696,11 +7750,11 @@
             aw = self.activeWindow()
             if aw:
                 aw.newLineBelow()
-        
+
     def __editorConfigChanged(self, editor):
         """
         Private slot to handle changes of an editor's configuration.
-        
+
         @param editor reference to the editor
         @type Editor
         """
@@ -6711,13 +7765,14 @@
         eol = editor.getEolIndicator()
         zoom = editor.getZoom()
         self.__setSbFile(
-            fn, line + 1, pos, encoding=enc, language=lang, eol=eol, zoom=zoom)
+            fn, line + 1, pos, encoding=enc, language=lang, eol=eol, zoom=zoom
+        )
         self._checkActions(editor, False)
-    
+
     def __editorSelectionChanged(self, editor):
         """
         Private slot to handle changes of the current editors selection.
-        
+
         @param editor reference to the editor
         @type Editor
         """
@@ -6725,7 +7780,7 @@
         enable = editor.hasSelection()
         self.editUpperCaseAct.setEnabled(enable)
         self.editLowerCaseAct.setEnabled(enable)
-    
+
     def __editSortSelectedLines(self):
         """
         Private slot to sort the selected lines.
@@ -6733,7 +7788,7 @@
         editor = self.activeWindow()
         if editor:
             editor.sortLines()
-    
+
     def __editInsertDocstring(self):
         """
         Private method to insert a docstring.
@@ -6741,23 +7796,23 @@
         editor = self.activeWindow()
         if editor:
             editor.insertDocstring()
-    
+
     def showEditorInfo(self, editor):
         """
         Public method to show some information for a given editor.
-        
+
         @param editor editor to show information text for
         @type Editor
         """
         documentationViewer = self.ui.documentationViewer()
         if documentationViewer:
             documentationViewer.showInfo(editor)
-    
+
     def isEditorInfoSupported(self, language):
         """
         Public method to check, if a language is supported by the
         documentation viewer.
-        
+
         @param language editor programming language to check
         @type str
         @return flag indicating the support status
@@ -6768,12 +7823,12 @@
             return documentationViewer.isSupportedLanguage(language)
         else:
             return False
-    
+
     def __isEditorInfoSupportedEd(self, editor):
         """
         Private method to check, if an editor is supported by the
         documentation viewer.
-        
+
         @param editor reference to the editor to check for
         @type Editor
         @return flag indicating the support status
@@ -6781,58 +7836,50 @@
         """
         language = editor.getLanguage()
         return self.isEditorInfoSupported(language)
-    
+
     ##################################################################
     ## Below are protected utility methods
     ##################################################################
-    
+
     def _getOpenStartDir(self):
         """
         Protected method to return the starting directory for a file open
         dialog.
-        
+
         The appropriate starting directory is calculated
         using the following search order, until a match is found:<br />
             1: Directory of currently active editor<br />
             2: Directory of currently active Project<br />
             3: CWD
-        
+
         @return name of directory to start (string)
         """
         # if we have an active source, return its path
-        if (
-            self.activeWindow() is not None and
-            self.activeWindow().getFileName()
-        ):
+        if self.activeWindow() is not None and self.activeWindow().getFileName():
             return os.path.dirname(self.activeWindow().getFileName())
-        
+
         # check, if there is an active project and return its path
         elif ericApp().getObject("Project").isOpen():
             return ericApp().getObject("Project").ppath
-        
+
         else:
-            return (
-                Preferences.getMultiProject("Workspace") or
-                Utilities.getHomeDir()
-            )
-        
+            return Preferences.getMultiProject("Workspace") or Utilities.getHomeDir()
+
     def _getOpenFileFilter(self):
         """
         Protected method to return the active filename filter for a file open
         dialog.
-        
+
         The appropriate filename filter is determined by file extension of
         the currently active editor.
-        
+
         @return name of the filename filter (string) or None
         """
-        if (
-            self.activeWindow() is not None and
-            self.activeWindow().getFileName()
-        ):
+        if self.activeWindow() is not None and self.activeWindow().getFileName():
             ext = os.path.splitext(self.activeWindow().getFileName())[1]
             rx = re.compile(r".*\*\.{0}[ )].*".format(ext[1:]))
             import QScintilla.Lexers
+
             filters = QScintilla.Lexers.getOpenFileFiltersList()
             index = -1
             for i in range(len(filters)):
@@ -6845,11 +7892,11 @@
                 return filters[index]
         else:
             return Preferences.getEditor("DefaultOpenFilter")
-    
+
     ##################################################################
     ## Below are API handling methods
     ##################################################################
-    
+
     def getAPIsManager(self):
         """
         Public method to get a reference to the APIs manager.
@@ -6857,46 +7904,44 @@
         @return the APIs manager object (eric7.QScintilla.APIsManager)
         """
         return self.apisManager
-    
+
     #######################################################################
     ## Cooperation related methods
     #######################################################################
-    
+
     def setCooperationClient(self, client):
         """
         Public method to set a reference to the cooperation client.
-        
+
         @param client reference to the cooperation client (CooperationClient)
         """
         self.__cooperationClient = client
-    
+
     def isConnected(self):
         """
         Public method to check the connection status of the IDE.
-        
+
         @return flag indicating the connection status (boolean)
         """
         return self.__cooperationClient.hasConnections()
-    
+
     def send(self, fileName, message):
         """
         Public method to send an editor command to remote editors.
-        
+
         @param fileName file name of the editor (string)
         @param message command message to be sent (string)
         """
         project = ericApp().getObject("Project")
         if project.isProjectFile(fileName):
             self.__cooperationClient.sendEditorCommand(
-                project.getHash(),
-                project.getRelativeUniversalPath(fileName),
-                message
-            )
-    
+                project.getHash(), project.getRelativeUniversalPath(fileName), message
+            )
+
     def receive(self, projectHash, fileName, command):
         """
         Public slot to handle received editor commands.
-        
+
         @param projectHash hash of the project (string)
         @param fileName project relative file name of the editor (string)
         @param command command string (string)
@@ -6907,20 +7952,20 @@
             editor = self.getOpenEditor(fn)
             if editor:
                 editor.receive(command)
-    
+
     def shareConnected(self, connected):
         """
         Public slot to handle a change of the connected state.
-        
+
         @param connected flag indicating the connected state (boolean)
         """
         for editor in self.getOpenEditors():
             editor.shareConnected(connected)
-    
+
     def shareEditor(self, share):
         """
         Public slot to set the shared status of the current editor.
-        
+
         @param share flag indicating the share status (boolean)
         """
         aw = self.activeWindow()
@@ -6928,7 +7973,7 @@
             fn = aw.getFileName()
             if fn and ericApp().getObject("Project").isProjectFile(fn):
                 aw.shareEditor(share)
-    
+
     def startSharedEdit(self):
         """
         Public slot to start a shared edit session for the current editor.
@@ -6938,7 +7983,7 @@
             fn = aw.getFileName()
             if fn and ericApp().getObject("Project").isProjectFile(fn):
                 aw.startSharedEdit()
-    
+
     def sendSharedEdit(self):
         """
         Public slot to end a shared edit session for the current editor and
@@ -6949,7 +7994,7 @@
             fn = aw.getFileName()
             if fn and ericApp().getObject("Project").isProjectFile(fn):
                 aw.sendSharedEdit()
-    
+
     def cancelSharedEdit(self):
         """
         Public slot to cancel a shared edit session for the current editor.
@@ -6959,15 +8004,15 @@
             fn = aw.getFileName()
             if fn and ericApp().getObject("Project").isProjectFile(fn):
                 aw.cancelSharedEdit()
-    
+
     #######################################################################
     ## Symbols viewer related methods
     #######################################################################
-    
+
     def insertSymbol(self, txt):
         """
         Public slot to insert a symbol text into the active window.
-        
+
         @param txt text to be inserted (string)
         """
         if self.__lastFocusWidget == ericApp().getObject("Shell"):
@@ -6978,15 +8023,15 @@
                 curline, curindex = aw.getCursorPosition()
                 aw.insert(txt)
                 aw.setCursorPosition(curline, curindex + len(txt))
-    
+
     #######################################################################
     ## Numbers viewer related methods
     #######################################################################
-    
+
     def insertNumber(self, txt):
         """
         Public slot to insert a number text into the active window.
-        
+
         @param txt text to be inserted (string)
         """
         if self.__lastFocusWidget == ericApp().getObject("Shell"):
@@ -7002,11 +8047,11 @@
                 curline, curindex = aw.getCursorPosition()
                 aw.insert(txt)
                 aw.setCursorPosition(curline, curindex + len(txt))
-    
+
     def getNumber(self):
         """
         Public method to get a number from the active window.
-        
+
         @return selected text of the active window (string)
         """
         txt = ""
--- a/src/eric7/ViewManager/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/ViewManager/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,10 +26,10 @@
 def factory(parent, ui, dbs, pluginManager):
     """
     Modul factory function to generate the right viewmanager type.
-    
+
     The viewmanager is instantiated depending on the data set in
     the current preferences.
-    
+
     @param parent parent widget (QWidget)
     @param ui reference to the main UI object
     @param dbs reference to the debug server object
--- a/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,12 +24,23 @@
     """
     Class implementing a dialog to enter the data of a virtual environment.
     """
-    def __init__(self, manager, venvName="", venvDirectory="",
-                 venvInterpreter="", isGlobal=False, isConda=False,
-                 isRemote=False, execPath="", baseDir="", parent=None):
+
+    def __init__(
+        self,
+        manager,
+        venvName="",
+        venvDirectory="",
+        venvInterpreter="",
+        isGlobal=False,
+        isConda=False,
+        isRemote=False,
+        execPath="",
+        baseDir="",
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param manager reference to the virtual environment manager
         @type VirtualenvManager
         @param venvName logical name of a virtual environment for editing
@@ -54,98 +65,99 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__venvName = venvName
         self.__manager = manager
         self.__editMode = bool(venvName)
-        
+
         if self.__editMode:
             self.setWindowTitle(self.tr("Edit Virtual Environment"))
         else:
             self.setWindowTitle(self.tr("Add Virtual Environment"))
-        
+
         self.__envBaseDir = baseDir
         if not self.__envBaseDir:
             self.__envBaseDir = Utilities.getHomeDir()
-        
+
         self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.targetDirectoryPicker.setWindowTitle(
-            self.tr("Virtualenv Target Directory"))
+            self.tr("Virtualenv Target Directory")
+        )
         self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir)
-        
+
         self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pythonExecPicker.setWindowTitle(
-            self.tr("Python Interpreter"))
-        self.pythonExecPicker.setDefaultDirectory(
-            Globals.getPythonExecutable())
-        
-        self.execPathEdit.setToolTip(self.tr(
-            "Enter the executable search path to be prepended to the PATH"
-            " environment variable. Use '{0}' as the separator.").format(
-            os.pathsep)
+        self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter"))
+        self.pythonExecPicker.setDefaultDirectory(Globals.getPythonExecutable())
+
+        self.execPathEdit.setToolTip(
+            self.tr(
+                "Enter the executable search path to be prepended to the PATH"
+                " environment variable. Use '{0}' as the separator."
+            ).format(os.pathsep)
         )
-        
+
         self.nameEdit.setText(venvName)
         if venvDirectory:
-            self.targetDirectoryPicker.setText(venvDirectory,
-                                               toNative=not isRemote)
+            self.targetDirectoryPicker.setText(venvDirectory, toNative=not isRemote)
         else:
-            self.targetDirectoryPicker.setText(self.__envBaseDir,
-                                               toNative=not isRemote)
+            self.targetDirectoryPicker.setText(self.__envBaseDir, toNative=not isRemote)
         if not venvInterpreter and venvDirectory and not isRemote:
             py = self.__detectPythonInterpreter(venvDirectory)
             self.pythonExecPicker.setText(py)
         else:
-            self.pythonExecPicker.setText(venvInterpreter,
-                                          toNative=not isRemote)
-        
+            self.pythonExecPicker.setText(venvInterpreter, toNative=not isRemote)
+
         self.globalCheckBox.setChecked(isGlobal)
         self.anacondaCheckBox.setChecked(isConda)
         self.remoteCheckBox.setChecked(isRemote)
         self.execPathEdit.setText(execPath)
-        
+
         self.__updateOk()
-        
+
         self.nameEdit.setFocus(Qt.FocusReason.OtherFocusReason)
-    
+
     def __updateOk(self):
         """
         Private slot to update the state of the OK button.
         """
         enable = (
-            (bool(self.nameEdit.text()) and
-             (self.nameEdit.text() == self.__venvName or
-              self.__manager.isUnique(self.nameEdit.text())))
-            if self.__editMode else
-            (bool(self.nameEdit.text()) and
-             self.__manager.isUnique(self.nameEdit.text()))
-        )
-        
-        if not self.globalCheckBox.isChecked():
-            enable &= (
-                self.remoteCheckBox.isChecked() or (
-                    bool(self.targetDirectoryPicker.text()) and
-                    self.targetDirectoryPicker.text() != self.__envBaseDir and
-                    os.path.exists(self.targetDirectoryPicker.text())
+            (
+                bool(self.nameEdit.text())
+                and (
+                    self.nameEdit.text() == self.__venvName
+                    or self.__manager.isUnique(self.nameEdit.text())
                 )
             )
-        
-        enable = (
-            enable and
-            bool(self.pythonExecPicker.text()) and (
-                self.remoteCheckBox.isChecked() or
-                os.access(self.pythonExecPicker.text(), os.X_OK)
+            if self.__editMode
+            else (
+                bool(self.nameEdit.text())
+                and self.__manager.isUnique(self.nameEdit.text())
             )
         )
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        if not self.globalCheckBox.isChecked():
+            enable &= self.remoteCheckBox.isChecked() or (
+                bool(self.targetDirectoryPicker.text())
+                and self.targetDirectoryPicker.text() != self.__envBaseDir
+                and os.path.exists(self.targetDirectoryPicker.text())
+            )
+
+        enable = (
+            enable
+            and bool(self.pythonExecPicker.text())
+            and (
+                self.remoteCheckBox.isChecked()
+                or os.access(self.pythonExecPicker.text(), os.X_OK)
+            )
+        )
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     def __detectPythonInterpreter(self, venvDirectory):
         """
         Private method to search for a suitable Python interpreter inside an
         environment.
-        
+
         @param venvDirectory directory for the virtual environment
         @type str
         @return detected Python interpreter or empty string
@@ -159,102 +171,102 @@
                     os.path.join(venvDirectory, "python.exe"),
                 )
             else:
-                candidates = (
-                    os.path.join(venvDirectory, "bin", "python3"),
-                )
+                candidates = (os.path.join(venvDirectory, "bin", "python3"),)
             for py in candidates:
                 if os.path.exists(py):
                     return py
-        
+
         return ""
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the logical name.
-        
+
         @param txt current logical name
         @type str
         """
         self.__updateOk()
-    
+
     @pyqtSlot(str)
     def on_targetDirectoryPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the virtual environment directory.
-        
+
         @param txt virtual environment directory
         @type str
         """
         self.__updateOk()
-        
+
         if txt:
             self.pythonExecPicker.setDefaultDirectory(txt)
         else:
-            self.pythonExecPicker.setDefaultDirectory(
-                Globals.getPythonExecutable())
+            self.pythonExecPicker.setDefaultDirectory(Globals.getPythonExecutable())
         py = self.__detectPythonInterpreter(txt)
         if py:
             self.pythonExecPicker.setText(py)
-    
+
     @pyqtSlot(str)
     def on_pythonExecPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the virtual environment interpreter.
-        
+
         @param txt virtual environment interpreter
         @type str
         """
         self.__updateOk()
-    
+
     @pyqtSlot(bool)
     def on_globalCheckBox_toggled(self, checked):
         """
         Private slot handling a change of the global check box state.
-        
+
         @param checked state of the check box
         @type bool
         """
         self.__updateOk()
-    
+
     @pyqtSlot(bool)
     def on_remoteCheckBox_toggled(self, checked):
         """
         Private slot handling a change of the remote check box state.
-        
+
         @param checked state of the check box
         @type bool
         """
         self.__updateOk()
-    
+
     @pyqtSlot(bool)
     def on_anacondaCheckBox_clicked(self, checked):
         """
         Private slot handling a user click on this check box.
-        
+
         @param checked state of the check box
         @type bool
         """
         if checked and not bool(self.execPathEdit.text()):
             # prepopulate the execPathEdit widget
             if Utilities.isWindowsPlatform():
-                self.execPathEdit.setText(os.pathsep.join([
-                    self.targetDirectoryPicker.text(),
-                    os.path.join(self.targetDirectoryPicker.text(),
-                                 "Scripts"),
-                    os.path.join(self.targetDirectoryPicker.text(),
-                                 "Library", "bin"),
-                ]))
+                self.execPathEdit.setText(
+                    os.pathsep.join(
+                        [
+                            self.targetDirectoryPicker.text(),
+                            os.path.join(self.targetDirectoryPicker.text(), "Scripts"),
+                            os.path.join(
+                                self.targetDirectoryPicker.text(), "Library", "bin"
+                            ),
+                        ]
+                    )
+                )
             else:
                 self.execPathEdit.setText(
-                    os.path.join(self.targetDirectoryPicker.text(),
-                                 "bin"),
+                    os.path.join(self.targetDirectoryPicker.text(), "bin"),
                 )
-    
+
     def getData(self):
         """
         Public method to retrieve the entered data.
-        
+
         @return tuple containing the logical name, the directory, the
             interpreter of the virtual environment, a flag indicating a
             global environment, a flag indicating an Anaconda environment,
--- a/src/eric7/VirtualEnv/VirtualenvConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -31,10 +31,11 @@
     Class implementing a dialog to enter the parameters for the
     virtual environment.
     """
+
     def __init__(self, baseDir="", parent=None):
         """
         Constructor
-        
+
         @param baseDir base directory for the virtual environments
         @type str
         @param parent reference to the parent widget
@@ -42,70 +43,66 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if not baseDir:
             baseDir = Utilities.getHomeDir()
         self.__envBaseDir = baseDir
-        
+
         self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.targetDirectoryPicker.setWindowTitle(
-            self.tr("Virtualenv Target Directory"))
+            self.tr("Virtualenv Target Directory")
+        )
         self.targetDirectoryPicker.setText(baseDir)
         self.targetDirectoryPicker.setDefaultDirectory(baseDir)
-        
+
         self.extraSearchPathPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.extraSearchPathPicker.setWindowTitle(
-            self.tr("Extra Search Path for setuptools/pip"))
+            self.tr("Extra Search Path for setuptools/pip")
+        )
         self.extraSearchPathPicker.setDefaultDirectory(Utilities.getHomeDir())
-        
+
         self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pythonExecPicker.setWindowTitle(
-            self.tr("Python Interpreter"))
-        self.pythonExecPicker.setDefaultDirectory(
-            Globals.getPythonExecutable())
-        
-        self.condaTargetDirectoryPicker.setMode(
-            EricPathPickerModes.DIRECTORY_MODE)
+        self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter"))
+        self.pythonExecPicker.setDefaultDirectory(Globals.getPythonExecutable())
+
+        self.condaTargetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.condaTargetDirectoryPicker.setWindowTitle(
-            self.tr("Conda Environment Location"))
-        self.condaTargetDirectoryPicker.setDefaultDirectory(
-            Utilities.getHomeDir())
-        
-        self.condaCloneDirectoryPicker.setMode(
-            EricPathPickerModes.DIRECTORY_MODE)
+            self.tr("Conda Environment Location")
+        )
+        self.condaTargetDirectoryPicker.setDefaultDirectory(Utilities.getHomeDir())
+
+        self.condaCloneDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
         self.condaCloneDirectoryPicker.setWindowTitle(
-            self.tr("Conda Environment Location"))
-        self.condaCloneDirectoryPicker.setDefaultDirectory(
-            Utilities.getHomeDir())
-        
-        self.condaRequirementsFilePicker.setMode(
-            EricPathPickerModes.OPEN_FILE_MODE)
+            self.tr("Conda Environment Location")
+        )
+        self.condaCloneDirectoryPicker.setDefaultDirectory(Utilities.getHomeDir())
+
+        self.condaRequirementsFilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
         self.condaRequirementsFilePicker.setWindowTitle(
-            self.tr("Conda Requirements File"))
-        self.condaRequirementsFilePicker.setDefaultDirectory(
-            Utilities.getHomeDir())
+            self.tr("Conda Requirements File")
+        )
+        self.condaRequirementsFilePicker.setDefaultDirectory(Utilities.getHomeDir())
         self.condaRequirementsFilePicker.setFilters(
-            self.tr("Text Files (*.txt);;All Files (*)"))
-        
+            self.tr("Text Files (*.txt);;All Files (*)")
+        )
+
         self.__versionRe = re.compile(r""".*?(\d+\.\d+\.\d+).*""")
-        
+
         self.__virtualenvFound = False
         self.__pyvenvFound = False
         self.__condaFound = False
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.__mandatoryStyleSheet = (
             "QLineEdit {border: 2px solid; border-color: #dd8888}"
-            if ericApp().usesDarkPalette() else
-            "QLineEdit {border: 2px solid; border-color: #800000}"
+            if ericApp().usesDarkPalette()
+            else "QLineEdit {border: 2px solid; border-color: #800000}"
         )
         self.targetDirectoryPicker.setStyleSheet(self.__mandatoryStyleSheet)
         self.nameEdit.setStyleSheet(self.__mandatoryStyleSheet)
-        self.condaTargetDirectoryPicker.setStyleSheet(
-            self.__mandatoryStyleSheet)
+        self.condaTargetDirectoryPicker.setStyleSheet(self.__mandatoryStyleSheet)
         self.condaNameEdit.setStyleSheet(self.__mandatoryStyleSheet)
-        
+
         self.__setVirtualenvVersion()
         self.__setPyvenvVersion()
         self.__setCondaVersion()
@@ -115,45 +112,41 @@
             self.virtualenvButton.setChecked(True)
         elif self.__condaFound:
             self.condaButton.setChecked(True)
-        
+
         self.condaInsecureCheckBox.setEnabled(
-            CondaInterface.condaVersion() >= (4, 3, 18))
-        
+            CondaInterface.condaVersion() >= (4, 3, 18)
+        )
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __updateOK(self):
         """
         Private method to update the enabled status of the OK button.
         """
         if self.virtualenvButton.isChecked() or self.pyvenvButton.isChecked():
             enable = (
-                (self.__virtualenvFound or self.__pyvenvFound) and
-                bool(self.targetDirectoryPicker.text()) and
-                bool(self.nameEdit.text())
+                (self.__virtualenvFound or self.__pyvenvFound)
+                and bool(self.targetDirectoryPicker.text())
+                and bool(self.nameEdit.text())
             )
             enable &= self.targetDirectoryPicker.text() != self.__envBaseDir
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
         elif self.condaButton.isChecked():
-            enable = (
-                bool(self.condaNameEdit.text()) or
-                bool(self.condaTargetDirectoryPicker.text())
+            enable = bool(self.condaNameEdit.text()) or bool(
+                self.condaTargetDirectoryPicker.text()
             )
             if self.condaSpecialsGroup.isChecked():
                 if self.condaCloneButton.isChecked():
-                    enable &= (
-                        bool(self.condaCloneNameEdit.text()) or
-                        bool(self.condaCloneDirectoryPicker.text())
+                    enable &= bool(self.condaCloneNameEdit.text()) or bool(
+                        self.condaCloneDirectoryPicker.text()
                     )
                 elif self.condaRequirementsButton.isChecked():
                     enable &= bool(self.condaRequirementsFilePicker.text())
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-    
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
     def __updateUi(self):
         """
         Private method to update the UI depending on the selected
@@ -173,103 +166,104 @@
         self.noSetuptoolsCheckBox.setEnabled(enable)
         self.symlinkCheckBox.setEnabled(not enable)
         self.upgradeCheckBox.setEnabled(not enable)
-        
+
         # conda page
         enable = not self.condaSpecialsGroup.isChecked()
         self.condaPackagesEdit.setEnabled(enable)
         self.condaPythonEdit.setEnabled(enable)
         self.condaInsecureCheckBox.setEnabled(
-            enable and CondaInterface.condaVersion() >= (4, 3, 18))
+            enable and CondaInterface.condaVersion() >= (4, 3, 18)
+        )
         self.condaDryrunCheckBox.setEnabled(enable)
-        
+
         # select page
         if self.condaButton.isChecked():
             self.venvStack.setCurrentWidget(self.condaPage)
         else:
             self.venvStack.setCurrentWidget(self.venvPage)
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot handling a change of the virtual environment name.
-        
+
         @param txt name of the virtual environment
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_targetDirectoryPicker_textChanged(self, txt):
         """
         Private slot handling a change of the target directory.
-        
+
         @param txt target directory
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_pythonExecPicker_textChanged(self, txt):
         """
         Private slot to react to a change of the Python executable.
-        
+
         @param txt contents of the picker's line edit
         @type str
         """
         self.__setVirtualenvVersion()
         self.__setPyvenvVersion()
         self.__updateOK()
-    
+
     @pyqtSlot(bool)
     def on_virtualenvButton_toggled(self, checked):
         """
         Private slot to react to the selection of 'virtualenv'.
-        
+
         @param checked state of the checkbox
         @type bool
         """
         self.__updateUi()
-    
+
     @pyqtSlot(bool)
     def on_pyvenvButton_toggled(self, checked):
         """
         Private slot to react to the selection of 'pyvenv'.
-        
+
         @param checked state of the checkbox
         @type bool
         """
         self.__updateUi()
-    
+
     @pyqtSlot(bool)
     def on_condaButton_toggled(self, checked):
         """
         Private slot to react to the selection of 'conda'.
-        
+
         @param checked state of the checkbox
         @type bool
         """
         self.__updateUi()
-    
+
     @pyqtSlot(str)
     def on_condaNameEdit_textChanged(self, txt):
         """
         Private slot handling a change of the conda environment name.
-        
+
         @param txt environment name
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_condaTargetDirectoryPicker_textChanged(self, txt):
         """
         Private slot handling a change of the conda target directory.
-        
+
         @param txt target directory
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_condaSpecialsGroup_clicked(self):
         """
@@ -277,51 +271,51 @@
         """
         self.__updateOK()
         self.__updateUi()
-    
+
     @pyqtSlot(str)
     def on_condaCloneNameEdit_textChanged(self, txt):
         """
         Private slot handling a change of the conda source environment name.
-        
+
         @param txt name of the environment to be cloned
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_condaCloneDirectoryPicker_textChanged(self, txt):
         """
         Private slot handling a change of the cloned from directory.
-        
+
         @param txt target directory
         @type str
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_condaCloneButton_clicked(self):
         """
         Private slot handling the selection of the clone button.
         """
         self.__updateOK()
-    
+
     @pyqtSlot()
     def on_condaRequirementsButton_clicked(self):
         """
         Private slot handling the selection of the requirements button.
         """
         self.__updateOK()
-    
+
     @pyqtSlot(str)
     def on_condaRequirementsFilePicker_textChanged(self, txt):
         """
         Private slot handling a change of the requirements file entry.
-        
+
         @param txt current text of the requirements file entry
         @type str
         """
         self.__updateOK()
-    
+
     def __setVirtualenvVersion(self):
         """
         Private method to determine the virtualenv version and set the
@@ -329,36 +323,41 @@
         """
         calls = []
         if self.pythonExecPicker.text():
-            calls.append((self.pythonExecPicker.text(),
-                          ["-m", "virtualenv", "--version"]))
-        calls.extend([
-            (Globals.getPythonExecutable(), ["-m", "virtualenv", "--version"]),
-            ("virtualenv", ["--version"]),
-        ])
-        
+            calls.append(
+                (self.pythonExecPicker.text(), ["-m", "virtualenv", "--version"])
+            )
+        calls.extend(
+            [
+                (Globals.getPythonExecutable(), ["-m", "virtualenv", "--version"]),
+                ("virtualenv", ["--version"]),
+            ]
+        )
+
         proc = QProcess()
         for prog, args in calls:
             proc.start(prog, args)
-            
+
             if not proc.waitForStarted(5000):
                 # try next entry
                 continue
-            
+
             if not proc.waitForFinished(5000):
                 # process hangs, kill it
                 QTimer.singleShot(2000, proc.kill)
                 proc.waitForFinished(3000)
-                version = self.tr('<virtualenv did not finish within 5s.>')
+                version = self.tr("<virtualenv did not finish within 5s.>")
                 self.__virtualenvFound = False
                 break
-            
+
             if proc.exitCode() != 0:
                 # returned with error code, try next
                 continue
-            
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             match = re.match(self.__versionRe, output)
             if match:
                 self.__virtualenvFound = True
@@ -366,14 +365,15 @@
                 break
         else:
             self.__virtualenvFound = False
-            version = self.tr('<No suitable virtualenv found.>')
-        
-        self.virtualenvButton.setText(self.tr(
-            "virtualenv Version: {0}".format(version)))
+            version = self.tr("<No suitable virtualenv found.>")
+
+        self.virtualenvButton.setText(
+            self.tr("virtualenv Version: {0}".format(version))
+        )
         self.virtualenvButton.setEnabled(self.__virtualenvFound)
         if not self.__virtualenvFound:
             self.virtualenvButton.setChecked(False)
-    
+
     def __setPyvenvVersion(self):
         """
         Private method to determine the pyvenv version and set the respective
@@ -381,39 +381,42 @@
         """
         calls = []
         if self.pythonExecPicker.text():
-            calls.append((self.pythonExecPicker.text(),
-                          ["-m", "venv"]))
-        calls.extend([
-            (Globals.getPythonExecutable(), ["-m", "venv"]),
-            ("python3", ["-m", "venv"]),
-            ("python", ["-m", "venv"]),
-        ])
-        
+            calls.append((self.pythonExecPicker.text(), ["-m", "venv"]))
+        calls.extend(
+            [
+                (Globals.getPythonExecutable(), ["-m", "venv"]),
+                ("python3", ["-m", "venv"]),
+                ("python", ["-m", "venv"]),
+            ]
+        )
+
         proc = QProcess()
         for prog, args in calls:
             proc.start(prog, args)
-            
+
             if not proc.waitForStarted(5000):
                 # try next entry
                 continue
-            
+
             if not proc.waitForFinished(5000):
                 # process hangs, kill it
                 QTimer.singleShot(2000, proc.kill)
                 proc.waitForFinished(3000)
-                version = self.tr('<pyvenv did not finish within 5s.>')
+                version = self.tr("<pyvenv did not finish within 5s.>")
                 self.__pyvenvFound = False
                 break
-            
+
             if proc.exitCode() not in [0, 2]:
                 # returned with error code, try next
                 continue
-            
+
             proc.start(prog, ["--version"])
             proc.waitForFinished(5000)
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             match = re.match(self.__versionRe, output)
             if match:
                 self.__pyvenvFound = True
@@ -421,44 +424,44 @@
                 break
         else:
             self.__pyvenvFound = False
-            version = self.tr('<No suitable pyvenv found.>')
-        
-        self.pyvenvButton.setText(self.tr(
-            "pyvenv Version: {0}".format(version)))
+            version = self.tr("<No suitable pyvenv found.>")
+
+        self.pyvenvButton.setText(self.tr("pyvenv Version: {0}".format(version)))
         self.pyvenvButton.setEnabled(self.__pyvenvFound)
         if not self.__pyvenvFound:
             self.pyvenvButton.setChecked(False)
-    
+
     def __setCondaVersion(self):
         """
         Private method to determine the conda version and set the respective
         label.
         """
         self.__condaFound = bool(CondaInterface.condaVersion())
-        self.condaButton.setText(self.tr(
-            "conda Version: {0}".format(CondaInterface.condaVersionStr())))
+        self.condaButton.setText(
+            self.tr("conda Version: {0}".format(CondaInterface.condaVersionStr()))
+        )
         self.condaButton.setEnabled(self.__condaFound)
         if not self.__condaFound:
             self.condaButton.setChecked(False)
-    
+
     def __generateTargetDir(self):
         """
         Private method to generate a valid target directory path.
-        
+
         @return target directory path
         @rtype str
         """
         targetDirectory = Utilities.toNativeSeparators(
-            self.targetDirectoryPicker.text())
+            self.targetDirectoryPicker.text()
+        )
         if not os.path.isabs(targetDirectory):
-            targetDirectory = os.path.join(os.path.expanduser("~"),
-                                           targetDirectory)
+            targetDirectory = os.path.join(os.path.expanduser("~"), targetDirectory)
         return targetDirectory
-    
+
     def __generateArguments(self):
         """
         Private method to generate the process arguments.
-        
+
         @return process arguments
         @rtype list of str
         """
@@ -467,47 +470,50 @@
             if bool(self.condaNameEdit.text()):
                 args.extend(["--name", self.condaNameEdit.text()])
             if bool(self.condaTargetDirectoryPicker.text()):
-                args.extend(["--prefix",
-                             self.condaTargetDirectoryPicker.text()])
+                args.extend(["--prefix", self.condaTargetDirectoryPicker.text()])
             if self.condaSpecialsGroup.isChecked():
                 if self.condaCloneButton.isChecked():
                     if bool(self.condaCloneNameEdit.text()):
-                        args.extend(
-                            ["--clone", self.condaCloneNameEdit.text()]
-                        )
+                        args.extend(["--clone", self.condaCloneNameEdit.text()])
                     elif bool(self.condaCloneDirectoryPicker.text()):
-                        args.extend(["--clone",
-                                     self.condaCloneDirectoryPicker.text()])
+                        args.extend(["--clone", self.condaCloneDirectoryPicker.text()])
                 elif self.condaRequirementsButton.isChecked():
-                    args.extend(
-                        ["--file", self.condaRequirementsFilePicker.text()]
-                    )
+                    args.extend(["--file", self.condaRequirementsFilePicker.text()])
             if self.condaInsecureCheckBox.isChecked():
                 args.append("--insecure")
             if self.condaDryrunCheckBox.isChecked():
                 args.append("--dry-run")
             if not self.condaSpecialsGroup.isChecked():
                 if bool(self.condaPythonEdit.text()):
-                    args.append("python={0}".format(
-                        self.condaPythonEdit.text()))
+                    args.append("python={0}".format(self.condaPythonEdit.text()))
                 if bool(self.condaPackagesEdit.text()):
                     args.extend(self.condaPackagesEdit.text().split())
         else:
             if self.virtualenvButton.isChecked():
                 if self.extraSearchPathPicker.text():
-                    args.append("--extra-search-dir={0}".format(
-                        Utilities.toNativeSeparators(
-                            self.extraSearchPathPicker.text())))
+                    args.append(
+                        "--extra-search-dir={0}".format(
+                            Utilities.toNativeSeparators(
+                                self.extraSearchPathPicker.text()
+                            )
+                        )
+                    )
                 if self.promptPrefixEdit.text():
-                    args.append("--prompt={0}".format(
-                        self.promptPrefixEdit.text().replace(" ", "_")))
+                    args.append(
+                        "--prompt={0}".format(
+                            self.promptPrefixEdit.text().replace(" ", "_")
+                        )
+                    )
                 if self.pythonExecPicker.text():
-                    args.append("--python={0}".format(
-                        Utilities.toNativeSeparators(
-                            self.pythonExecPicker.text())))
+                    args.append(
+                        "--python={0}".format(
+                            Utilities.toNativeSeparators(self.pythonExecPicker.text())
+                        )
+                    )
                 elif self.versionComboBox.currentText():
-                    args.append("--python=python{0}".format(
-                        self.versionComboBox.currentText()))
+                    args.append(
+                        "--python=python{0}".format(self.versionComboBox.currentText())
+                    )
                 if self.verbositySpinBox.value() == 1:
                     args.append("--verbose")
                 elif self.verbositySpinBox.value() == -1:
@@ -539,13 +545,13 @@
                     args.append("--upgrade")
             targetDirectory = self.__generateTargetDir()
             args.append(targetDirectory)
-        
+
         return args
 
     def getData(self):
         """
         Public method to retrieve the dialog data.
-        
+
         @return dictionary containing the data for the two environment
             variants. The keys for both variants are 'arguments' containing the
             command line arguments, 'logicalName' containing the environment
@@ -566,20 +572,26 @@
             "logicalName": self.nameEdit.text(),
         }
         if self.condaButton.isChecked():
-            resultDict.update({
-                "envType": "conda",
-                "command": "create",
-            })
+            resultDict.update(
+                {
+                    "envType": "conda",
+                    "command": "create",
+                }
+            )
         else:
-            resultDict.update({
-                "envType": ("pyvenv" if self.pyvenvButton.isChecked() else
-                            "virtualenv"),
-                "openTarget": self.openCheckBox.isChecked(),
-                "createLog": self.logCheckBox.isChecked(),
-                "createScript": self.scriptCheckBox.isChecked(),
-                "targetDirectory": self.__generateTargetDir(),
-                "pythonExe": Utilities.toNativeSeparators(
-                    self.pythonExecPicker.text()),
-            })
-        
+            resultDict.update(
+                {
+                    "envType": (
+                        "pyvenv" if self.pyvenvButton.isChecked() else "virtualenv"
+                    ),
+                    "openTarget": self.openCheckBox.isChecked(),
+                    "createLog": self.logCheckBox.isChecked(),
+                    "createScript": self.scriptCheckBox.isChecked(),
+                    "targetDirectory": self.__generateTargetDir(),
+                    "pythonExe": Utilities.toNativeSeparators(
+                        self.pythonExecPicker.text()
+                    ),
+                }
+            )
+
         return resultDict
--- a/src/eric7/VirtualEnv/VirtualenvExecDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvExecDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,14 +22,15 @@
 class VirtualenvExecDialog(QDialog, Ui_VirtualenvExecDialog):
     """
     Class implementing the virtualenv execution dialog.
-    
+
     This class starts a QProcess and displays a dialog that
     shows the output of the virtualenv or pyvenv process.
     """
+
     def __init__(self, configuration, venvManager, parent=None):
         """
         Constructor
-        
+
         @param configuration dictionary containing the configuration parameters
             as returned by the command configuration dialog
         @type dict
@@ -40,12 +41,10 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__pyvenv = configuration["envType"] == "pyvenv"
         self.__targetDir = configuration["targetDirectory"]
         self.__openTarget = configuration["openTarget"]
@@ -53,20 +52,21 @@
         self.__createScript = configuration["createScript"]
         self.__venvName = configuration["logicalName"]
         self.__venvManager = venvManager
-        
+
         self.__process = None
         self.__cmd = ""
-        
+
         if self.__pyvenv:
             self.__calls = []
             if configuration["pythonExe"]:
-                self.__calls.append((configuration["pythonExe"],
-                                     ["-m", "venv"]))
-            self.__calls.extend([
-                (getPythonExecutable(), ["-m", "venv"]),
-                ("python3", ["-m", "venv"]),
-                ("python", ["-m", "venv"]),
-            ])
+                self.__calls.append((configuration["pythonExe"], ["-m", "venv"]))
+            self.__calls.extend(
+                [
+                    (getPythonExecutable(), ["-m", "venv"]),
+                    ("python3", ["-m", "venv"]),
+                    ("python", ["-m", "venv"]),
+                ]
+            )
         else:
             self.__calls = [
                 (getPythonExecutable(), ["-m", "virtualenv"]),
@@ -74,11 +74,11 @@
             ]
         self.__callIndex = 0
         self.__callArgs = []
-    
+
     def start(self, arguments):
         """
         Public slot to start the virtualenv command.
-        
+
         @param arguments commandline arguments for virtualenv/pyvenv program
             (list of strings)
         """
@@ -88,73 +88,64 @@
             self.errorGroup.hide()
             self.contents.clear()
             self.errors.clear()
-            
+
             self.__process = QProcess()
             self.__process.readyReadStandardOutput.connect(self.__readStdout)
             self.__process.readyReadStandardError.connect(self.__readStderr)
             self.__process.finished.connect(self.__finish)
-            
+
             if not self.__pyvenv:
                 for arg in arguments:
                     if arg.startswith("--python="):
                         prog = arg.replace("--python=", "")
-                        self.__calls.insert(
-                            0, (prog, ["-m", "virtualenv"]))
+                        self.__calls.insert(0, (prog, ["-m", "virtualenv"]))
                         break
             self.__callArgs = arguments
-        
+
         prog, args = self.__calls[self.__callIndex]
         args.extend(self.__callArgs)
         self.__cmd = "{0} {1}".format(prog, " ".join(args))
-        self.__logOutput(self.tr("Executing: {0}\n").format(
-            self.__cmd))
+        self.__logOutput(self.tr("Executing: {0}\n").format(self.__cmd))
         self.__process.start(prog, args)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.__logOutput(self.tr("Failed\n\n"))
             self.__nextAttempt()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish(0, 0, giveUp=True)
-    
+
     def __finish(self, exitCode, exitStatus, giveUp=False):
         """
         Private slot called when the process finished.
-        
+
         It is called when the process finished or
         the user pressed the button.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         @param giveUp flag indicating to not start another attempt (boolean)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         if not giveUp:
             if exitCode != 0:
                 self.__logOutput(self.tr("Failed\n\n"))
@@ -163,28 +154,26 @@
                     self.errorGroup.hide()
                     self.__nextAttempt()
                     return
-            
+
             self.__process = None
-            
+
             if self.__pyvenv:
-                self.__logOutput(self.tr('\npyvenv finished.\n'))
+                self.__logOutput(self.tr("\npyvenv finished.\n"))
             else:
-                self.__logOutput(self.tr('\nvirtualenv finished.\n'))
-            
+                self.__logOutput(self.tr("\nvirtualenv finished.\n"))
+
             if os.path.exists(self.__targetDir):
                 if self.__createScript:
                     self.__writeScriptFile()
-                
+
                 if self.__createLog:
                     self.__writeLogFile()
-                
+
                 if self.__openTarget:
-                    QDesktopServices.openUrl(QUrl.fromLocalFile(
-                        self.__targetDir))
-                
-                self.__venvManager.addVirtualEnv(self.__venvName,
-                                                 self.__targetDir)
-    
+                    QDesktopServices.openUrl(QUrl.fromLocalFile(self.__targetDir))
+
+                self.__venvManager.addVirtualEnv(self.__venvName, self.__targetDir)
+
     def __nextAttempt(self):
         """
         Private method to start another attempt.
@@ -195,64 +184,68 @@
         else:
             if self.__pyvenv:
                 self.__logError(
-                    self.tr('No suitable pyvenv program could be'
-                            ' started.\n'))
+                    self.tr("No suitable pyvenv program could be" " started.\n")
+                )
             else:
                 self.__logError(
-                    self.tr('No suitable virtualenv program could be'
-                            ' started.\n'))
+                    self.tr("No suitable virtualenv program could be" " started.\n")
+                )
             self.__cmd = ""
             self.__finish(0, 0, giveUp=True)
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            s = str(self.__process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__logOutput(s)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardError)
-        
+
         while self.__process.canReadLine():
-            s = str(self.__process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__logError(s)
-    
+
     def __logOutput(self, s):
         """
         Private method to log some output.
-        
+
         @param s output string to log (string)
         """
         self.contents.insertPlainText(s)
         self.contents.ensureCursorVisible()
-    
+
     def __logError(self, s):
         """
         Private method to log an error.
-        
+
         @param s error string to log (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(s)
         self.errors.ensureCursorVisible()
-    
+
     def __writeLogFile(self):
         """
         Private method to write a log file to the virtualenv directory.
@@ -260,12 +253,11 @@
         outtxt = self.contents.toPlainText()
         logFile = (
             os.path.join(self.__targetDir, "pyvenv.log")
-            if self.__pyvenv else
-            os.path.join(self.__targetDir, "virtualenv.log")
+            if self.__pyvenv
+            else os.path.join(self.__targetDir, "virtualenv.log")
         )
-        self.__logOutput(self.tr("\nWriting log file '{0}'.\n")
-                         .format(logFile))
-        
+        self.__logOutput(self.tr("\nWriting log file '{0}'.\n").format(logFile))
+
         try:
             with open(logFile, "w", encoding="utf-8") as f:
                 f.write(self.tr("Output:\n"))
@@ -277,10 +269,12 @@
                     f.write(errtxt)
         except OSError as err:
             self.__logError(
-                self.tr("""The logfile '{0}' could not be written.\n"""
-                        """Reason: {1}\n""").format(logFile, str(err)))
+                self.tr(
+                    """The logfile '{0}' could not be written.\n""" """Reason: {1}\n"""
+                ).format(logFile, str(err))
+            )
         self.__logOutput(self.tr("Done.\n"))
-    
+
     def __writeScriptFile(self):
         """
         Private method to write a script file to the virtualenv directory.
@@ -292,15 +286,17 @@
         else:
             script = os.path.join(self.__targetDir, basename + ".sh")
             txt = "#!/usr/bin/env sh\n\n" + self.__cmd
-        
-        self.__logOutput(self.tr("\nWriting script file '{0}'.\n")
-                         .format(script))
-        
+
+        self.__logOutput(self.tr("\nWriting script file '{0}'.\n").format(script))
+
         try:
             with open(script, "w", encoding="utf-8") as f:
                 f.write(txt)
         except OSError as err:
             self.__logError(
-                self.tr("""The script file '{0}' could not be written.\n"""
-                        """Reason: {1}\n""").format(script, str(err)))
+                self.tr(
+                    """The script file '{0}' could not be written.\n"""
+                    """Reason: {1}\n"""
+                ).format(script, str(err))
+            )
         self.__logOutput(self.tr("Done.\n"))
--- a/src/eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvInterpreterSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,22 +17,24 @@
 from EricWidgets.EricPathPicker import EricPathPickerModes
 
 from .Ui_VirtualenvInterpreterSelectionDialog import (
-    Ui_VirtualenvInterpreterSelectionDialog
+    Ui_VirtualenvInterpreterSelectionDialog,
 )
 
 import Globals
 
 
 class VirtualenvInterpreterSelectionDialog(
-        QDialog, Ui_VirtualenvInterpreterSelectionDialog):
+    QDialog, Ui_VirtualenvInterpreterSelectionDialog
+):
     """
     Class implementing a dialog to enter the interpreter for a virtual
     environment.
     """
+
     def __init__(self, venvName, venvDirectory, parent=None):
         """
         Constructor
-        
+
         @param venvName name for the virtual environment
         @type str
         @param venvDirectory directory of the virtual environment
@@ -42,13 +44,12 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pythonExecPicker.setWindowTitle(
-            self.tr("Python Interpreter"))
-        
+        self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter"))
+
         self.nameEdit.setText(venvName)
-        
+
         if venvDirectory:
             # try to determine a Python interpreter name
             if Globals.isWindowsPlatform():
@@ -56,39 +57,37 @@
                     os.path.join(venvDirectory, "Scripts", "python*.exe")
                 ) + glob.glob(os.path.join(venvDirectory, "python*.exe"))
             else:
-                candidates = glob.glob(
-                    os.path.join(venvDirectory, "bin", "python*")
-                )
+                candidates = glob.glob(os.path.join(venvDirectory, "bin", "python*"))
             self.pythonExecPicker.addItems(sorted(candidates))
             self.pythonExecPicker.setText("")
         else:
             self.pythonExecPicker.setText(venvDirectory)
-    
+
     def __updateOK(self):
         """
         Private method to update the enabled status of the OK button.
         """
         interpreterPath = self.pythonExecPicker.text()
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(interpreterPath) and
-            os.path.isfile(interpreterPath) and
-            os.access(interpreterPath, os.X_OK)
+            bool(interpreterPath)
+            and os.path.isfile(interpreterPath)
+            and os.access(interpreterPath, os.X_OK)
         )
-    
+
     @pyqtSlot(str)
     def on_pythonExecPicker_textChanged(self, txt):
         """
         Private slot to handle changes of the entered Python interpreter path.
-        
+
         @param txt entered Python interpreter path
         @type str
         """
         self.__updateOK()
-    
+
     def getData(self):
         """
         Public method to get the entered data.
-        
+
         @return path of the selected Python interpreter
         @rtype str
         """
--- a/src/eric7/VirtualEnv/VirtualenvManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,7 +26,7 @@
 class VirtualenvManager(QObject):
     """
     Class implementing an object to manage Python virtual environments.
-    
+
     @signal virtualEnvironmentAdded() emitted to indicate the addition of
         a virtual environment
     @signal virtualEnvironmentRemoved() emitted to indicate the removal and
@@ -36,38 +36,41 @@
     @signal virtualEnvironmentsListChanged() emitted to indicate a change of
         the list of virtual environments (may be used to refresh the list)
     """
+
     DefaultKey = "<default>"
-    
+
     virtualEnvironmentAdded = pyqtSignal()
     virtualEnvironmentRemoved = pyqtSignal()
     virtualEnvironmentChanged = pyqtSignal(str)
-    
+
     virtualEnvironmentsListChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__ui = parent
-        
+
         self.__loadSettings()
-    
+
     def __loadSettings(self):
         """
         Private slot to load the virtual environments.
         """
         self.__virtualEnvironmentsBaseDir = Preferences.getSettings().value(
-            "PyVenv/VirtualEnvironmentsBaseDir", "")
-        
+            "PyVenv/VirtualEnvironmentsBaseDir", ""
+        )
+
         venvString = Preferences.getSettings().value(
-            "PyVenv/VirtualEnvironments", "{}")     # __IGNORE_WARNING_M613__
+            "PyVenv/VirtualEnvironments", "{}"  # __IGNORE_WARNING_M613__
+        )
         environments = json.loads(venvString)
-        
+
         self.__virtualEnvironments = {}
         # each environment entry is a dictionary:
         #   path:           the directory of the virtual environment
@@ -83,9 +86,8 @@
         envsToDelete = []
         for venvName in environments:
             environment = environments[venvName]
-            if (
-                ("is_remote" in environment and environment["is_remote"]) or
-                os.access(environment["interpreter"], os.X_OK)
+            if ("is_remote" in environment and environment["is_remote"]) or os.access(
+                environment["interpreter"], os.X_OK
             ):
                 if "is_global" not in environment:
                     environment["is_global"] = environment["path"] == ""
@@ -96,17 +98,16 @@
                 if "exec_path" not in environment:
                     environment["exec_path"] = ""
                 self.__virtualEnvironments[venvName] = environment
-        
+
         # now remove unsupported environments
         for venvName in envsToDelete:
             del environments[venvName]
-        
+
         # check, if the interpreter used to run eric is in the environments
         defaultPy = Globals.getPythonExecutable()
         found = False
         for venvName in self.__virtualEnvironments:
-            if (defaultPy ==
-                    self.__virtualEnvironments[venvName]["interpreter"]):
+            if defaultPy == self.__virtualEnvironments[venvName]["interpreter"]:
                 found = True
                 break
         if not found:
@@ -120,23 +121,22 @@
                 "is_remote": False,
                 "exec_path": "",
             }
-        
+
         self.__saveSettings()
-    
+
     def __saveSettings(self):
         """
         Private slot to save the virtual environments.
         """
         Preferences.getSettings().setValue(
-            "PyVenv/VirtualEnvironmentsBaseDir",
-            self.__virtualEnvironmentsBaseDir)
-        
+            "PyVenv/VirtualEnvironmentsBaseDir", self.__virtualEnvironmentsBaseDir
+        )
+
         Preferences.getSettings().setValue(
-            "PyVenv/VirtualEnvironments",
-            json.dumps(self.__virtualEnvironments)
+            "PyVenv/VirtualEnvironments", json.dumps(self.__virtualEnvironments)
         )
         Preferences.syncPreferences()
-    
+
     @pyqtSlot()
     def reloadSettings(self):
         """
@@ -144,15 +144,15 @@
         """
         Preferences.syncPreferences()
         self.__loadSettings()
-    
+
     def getDefaultEnvironment(self):
         """
         Public method to get the default virtual environment.
-        
+
         Default is an environment with the key '<default>' or the first one
         having an interpreter matching sys.executable (i.e. the one used to
         execute eric with)
-        
+
         @return tuple containing the environment name and a dictionary
             containing a copy of the default virtual environment
         @rtype tuple of (str, dict)
@@ -160,17 +160,16 @@
         if VirtualenvManager.DefaultKey in self.__virtualEnvironments:
             return (
                 VirtualenvManager.DefaultKey,
-                copy.copy(
-                    self.__virtualEnvironments[VirtualenvManager.DefaultKey])
+                copy.copy(self.__virtualEnvironments[VirtualenvManager.DefaultKey]),
             )
-        
+
         else:
             return self.environmentForInterpreter(sys.executable)
-    
+
     def environmentForInterpreter(self, interpreter):
         """
         Public method to get the environment a given interpreter belongs to.
-        
+
         @param interpreter path of the interpreter
         @type str
         @return tuple containing the environment name and a dictionary
@@ -179,87 +178,91 @@
         """
         py = interpreter.replace("w.exe", ".exe")
         for venvName in self.__virtualEnvironments:
-            if (py == self.__virtualEnvironments[venvName]["interpreter"]):
-                return (
-                    venvName,
-                    copy.copy(self.__virtualEnvironments[venvName])
-                )
-        
+            if py == self.__virtualEnvironments[venvName]["interpreter"]:
+                return (venvName, copy.copy(self.__virtualEnvironments[venvName]))
+
         return ("", {})
-    
+
     @pyqtSlot()
     def createVirtualEnv(self, baseDir=""):
         """
         Public slot to create a new virtual environment.
-        
+
         @param baseDir base directory for the virtual environments
         @type str
         """
-        from .VirtualenvConfigurationDialog import (
-            VirtualenvConfigurationDialog
-        )
-        
+        from .VirtualenvConfigurationDialog import VirtualenvConfigurationDialog
+
         if not baseDir:
             baseDir = self.__virtualEnvironmentsBaseDir
-        
+
         dlg = VirtualenvConfigurationDialog(baseDir=baseDir)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             resultDict = dlg.getData()
-            
+
             if resultDict["envType"] == "conda":
                 # create the conda environment
                 conda = ericApp().getObject("Conda")
                 ok, prefix, interpreter = conda.createCondaEnvironment(
-                    resultDict["arguments"])
+                    resultDict["arguments"]
+                )
                 if ok and "--dry-run" not in resultDict["arguments"]:
-                    self.addVirtualEnv(resultDict["logicalName"],
-                                       prefix,
-                                       venvInterpreter=interpreter,
-                                       isConda=True)
+                    self.addVirtualEnv(
+                        resultDict["logicalName"],
+                        prefix,
+                        venvInterpreter=interpreter,
+                        isConda=True,
+                    )
             else:
                 # now do the call
                 from .VirtualenvExecDialog import VirtualenvExecDialog
+
                 dia = VirtualenvExecDialog(resultDict, self)
                 dia.show()
                 dia.start(resultDict["arguments"])
                 dia.exec()
-    
+
     @pyqtSlot()
     def upgradeVirtualEnv(self, venvName):
         """
         Public slot to upgrade a virtual environment.
-        
+
         @param venvName name of the virtual environment
         @type str
         """
         from .VirtualenvUpgradeConfigurationDialog import (
-            VirtualenvUpgradeConfigurationDialog
+            VirtualenvUpgradeConfigurationDialog,
         )
-        
+
         venvDirectory = self.getVirtualenvDirectory(venvName)
         if not os.path.exists(os.path.join(venvDirectory, "pyvenv.cfg")):
             # The environment was not created by the 'venv' module.
             return
-        
+
         dlg = VirtualenvUpgradeConfigurationDialog(venvName, venvDirectory)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             pythonExe, args, createLog = dlg.getData()
-            
-            from .VirtualenvUpgradeExecDialog import (
-                VirtualenvUpgradeExecDialog
-            )
-            dia = VirtualenvUpgradeExecDialog(
-                venvName, pythonExe, createLog, self)
+
+            from .VirtualenvUpgradeExecDialog import VirtualenvUpgradeExecDialog
+
+            dia = VirtualenvUpgradeExecDialog(venvName, pythonExe, createLog, self)
             dia.show()
             dia.start(args)
             dia.exec()
-    
-    def addVirtualEnv(self, venvName, venvDirectory, venvInterpreter="",
-                      isGlobal=False, isConda=False, isRemote=False,
-                      execPath=""):
+
+    def addVirtualEnv(
+        self,
+        venvName,
+        venvDirectory,
+        venvInterpreter="",
+        isGlobal=False,
+        isConda=False,
+        isRemote=False,
+        execPath="",
+    ):
         """
         Public method to add a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @param venvDirectory directory of the virtual environment
@@ -280,49 +283,61 @@
             ok = EricMessageBox.yesNo(
                 None,
                 self.tr("Add Virtual Environment"),
-                self.tr("""A virtual environment named <b>{0}</b> exists"""
-                        """ already. Shall it be replaced?""")
-                .format(venvName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    """A virtual environment named <b>{0}</b> exists"""
+                    """ already. Shall it be replaced?"""
+                ).format(venvName),
+                icon=EricMessageBox.Warning,
+            )
             if not ok:
                 from .VirtualenvNameDialog import VirtualenvNameDialog
+
                 dlg = VirtualenvNameDialog(
-                    list(self.__virtualEnvironments.keys()),
-                    venvName)
+                    list(self.__virtualEnvironments.keys()), venvName
+                )
                 if dlg.exec() != QDialog.DialogCode.Accepted:
                     return
-                
+
                 venvName = dlg.getName()
-        
+
         if not venvInterpreter:
             from .VirtualenvInterpreterSelectionDialog import (
-                VirtualenvInterpreterSelectionDialog
+                VirtualenvInterpreterSelectionDialog,
             )
+
             dlg = VirtualenvInterpreterSelectionDialog(venvName, venvDirectory)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 venvInterpreter = dlg.getData()
-        
+
         if venvInterpreter:
             self.__virtualEnvironments[venvName] = {
                 "path": venvDirectory,
                 "interpreter": venvInterpreter,
-                "variant": 3,                   # always 3
+                "variant": 3,  # always 3
                 "is_global": isGlobal,
                 "is_conda": isConda,
                 "is_remote": isRemote,
                 "exec_path": execPath,
             }
-            
+
             self.__saveSettings()
-            
+
             self.virtualEnvironmentAdded.emit()
             self.virtualEnvironmentsListChanged.emit()
-    
-    def setVirtualEnv(self, venvName, venvDirectory, venvInterpreter,
-                      isGlobal, isConda, isRemote, execPath):
+
+    def setVirtualEnv(
+        self,
+        venvName,
+        venvDirectory,
+        venvInterpreter,
+        isGlobal,
+        isConda,
+        isRemote,
+        execPath,
+    ):
         """
         Public method to change a virtual environment.
-        
+
         @param venvName logical name of the virtual environment
         @type str
         @param venvDirectory directory of the virtual environment
@@ -343,34 +358,44 @@
             EricMessageBox.yesNo(
                 None,
                 self.tr("Change Virtual Environment"),
-                self.tr("""A virtual environment named <b>{0}</b> does not"""
-                        """ exist. Aborting!""")
-                .format(venvName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    """A virtual environment named <b>{0}</b> does not"""
+                    """ exist. Aborting!"""
+                ).format(venvName),
+                icon=EricMessageBox.Warning,
+            )
             return
-        
+
         self.__virtualEnvironments[venvName] = {
             "path": venvDirectory,
             "interpreter": venvInterpreter,
-            "variant": 3,                   # always 3
+            "variant": 3,  # always 3
             "is_global": isGlobal,
             "is_conda": isConda,
             "is_remote": isRemote,
             "exec_path": execPath,
         }
-        
+
         self.__saveSettings()
-        
+
         self.virtualEnvironmentChanged.emit(venvName)
         self.virtualEnvironmentsListChanged.emit()
-    
-    def renameVirtualEnv(self, oldVenvName, venvName, venvDirectory,
-                         venvInterpreter, isGlobal, isConda,
-                         isRemote, execPath):
+
+    def renameVirtualEnv(
+        self,
+        oldVenvName,
+        venvName,
+        venvDirectory,
+        venvInterpreter,
+        isGlobal,
+        isConda,
+        isRemote,
+        execPath,
+    ):
         """
         Public method to substitute a virtual environment entry with a new
         name.
-        
+
         @param oldVenvName old name of the virtual environment
         @type str
         @param venvName logical name for the virtual environment
@@ -393,41 +418,53 @@
             EricMessageBox.yesNo(
                 None,
                 self.tr("Rename Virtual Environment"),
-                self.tr("""A virtual environment named <b>{0}</b> does not"""
-                        """ exist. Aborting!""")
-                .format(oldVenvName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    """A virtual environment named <b>{0}</b> does not"""
+                    """ exist. Aborting!"""
+                ).format(oldVenvName),
+                icon=EricMessageBox.Warning,
+            )
             return
-        
+
         del self.__virtualEnvironments[oldVenvName]
-        self.addVirtualEnv(venvName, venvDirectory, venvInterpreter,
-                           isGlobal, isConda, isRemote, execPath)
-    
+        self.addVirtualEnv(
+            venvName,
+            venvDirectory,
+            venvInterpreter,
+            isGlobal,
+            isConda,
+            isRemote,
+            execPath,
+        )
+
     def deleteVirtualEnvs(self, venvNames):
         """
         Public method to delete virtual environments from the list and disk.
-        
+
         @param venvNames list of logical names for the virtual environments
         @type list of str
         """
         venvMessages = []
         for venvName in venvNames:
-            if (
-                venvName in self.__virtualEnvironments and
-                bool(self.__virtualEnvironments[venvName]["path"])
+            if venvName in self.__virtualEnvironments and bool(
+                self.__virtualEnvironments[venvName]["path"]
             ):
-                venvMessages.append(self.tr("{0} - {1}").format(
-                    venvName, self.__virtualEnvironments[venvName]["path"]))
+                venvMessages.append(
+                    self.tr("{0} - {1}").format(
+                        venvName, self.__virtualEnvironments[venvName]["path"]
+                    )
+                )
         if venvMessages:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 None,
                 self.tr("Delete Virtual Environments"),
-                self.tr("""Do you really want to delete these virtual"""
-                        """ environments?"""),
-                venvMessages
+                self.tr(
+                    """Do you really want to delete these virtual"""
+                    """ environments?"""
+                ),
+                venvMessages,
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 for venvName in venvNames:
@@ -440,20 +477,20 @@
                                 del self.__virtualEnvironments[venvName]
                         else:
                             shutil.rmtree(
-                                self.__virtualEnvironments[venvName]["path"],
-                                True)
+                                self.__virtualEnvironments[venvName]["path"], True
+                            )
                             del self.__virtualEnvironments[venvName]
-                
+
                 self.__saveSettings()
-                
+
                 self.virtualEnvironmentRemoved.emit()
                 self.virtualEnvironmentsListChanged.emit()
-    
+
     def __isEnvironmentDeleteable(self, venvName):
         """
         Private method to check, if a virtual environment can be deleted from
         disk.
-        
+
         @param venvName name of the virtual environment
         @type str
         @return flag indicating it can be deleted
@@ -465,122 +502,122 @@
             ok &= bool(self.__virtualEnvironments[venvName]["path"])
             ok &= not self.__virtualEnvironments[venvName]["is_global"]
             ok &= not self.__virtualEnvironments[venvName]["is_remote"]
-            ok &= os.access(self.__virtualEnvironments[venvName]["path"],
-                            os.W_OK)
-        
+            ok &= os.access(self.__virtualEnvironments[venvName]["path"], os.W_OK)
+
         return ok
-    
+
     def removeVirtualEnvs(self, venvNames):
         """
         Public method to delete virtual environment from the list.
-        
+
         @param venvNames list of logical names for the virtual environments
         @type list of str
         """
         venvMessages = []
         for venvName in venvNames:
             if venvName in self.__virtualEnvironments:
-                venvMessages.append(self.tr("{0} - {1}").format(
-                    venvName, self.__virtualEnvironments[venvName]["path"]))
+                venvMessages.append(
+                    self.tr("{0} - {1}").format(
+                        venvName, self.__virtualEnvironments[venvName]["path"]
+                    )
+                )
         if venvMessages:
-            from UI.DeleteFilesConfirmationDialog import (
-                DeleteFilesConfirmationDialog
-            )
+            from UI.DeleteFilesConfirmationDialog import DeleteFilesConfirmationDialog
+
             dlg = DeleteFilesConfirmationDialog(
                 None,
                 self.tr("Remove Virtual Environments"),
-                self.tr("""Do you really want to remove these virtual"""
-                        """ environments?"""),
-                venvMessages
+                self.tr(
+                    """Do you really want to remove these virtual"""
+                    """ environments?"""
+                ),
+                venvMessages,
             )
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 for venvName in venvNames:
                     if venvName in self.__virtualEnvironments:
                         del self.__virtualEnvironments[venvName]
-                
+
                 self.__saveSettings()
-                
+
                 self.virtualEnvironmentRemoved.emit()
                 self.virtualEnvironmentsListChanged.emit()
-    
+
     def getEnvironmentEntries(self):
         """
         Public method to get a dictionary containing the defined virtual
         environment entries.
-        
+
         @return dictionary containing a copy of the defined virtual
             environments
         @rtype dict
         """
         return copy.deepcopy(self.__virtualEnvironments)
-    
+
     @pyqtSlot()
     def showVirtualenvManagerDialog(self, modal=False):
         """
         Public slot to show the virtual environment manager dialog.
-        
+
         @param modal flag indicating that the dialog should be shown in
             a blocking mode
         """
         if modal:
             from .VirtualenvManagerWidgets import VirtualenvManagerDialog
-            virtualenvManagerDialog = VirtualenvManagerDialog(
-                self, self.__ui)
+
+            virtualenvManagerDialog = VirtualenvManagerDialog(self, self.__ui)
             virtualenvManagerDialog.exec()
             self.virtualEnvironmentsListChanged.emit()
         else:
             self.__ui.activateVirtualenvManager()
-    
+
     def isUnique(self, venvName):
         """
         Public method to check, if the give logical name is unique.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @return flag indicating uniqueness
         @rtype bool
         """
         return venvName not in self.__virtualEnvironments
-    
+
     def getVirtualenvInterpreter(self, venvName):
         """
         Public method to get the interpreter for a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @return interpreter path
         @rtype str
         """
         if venvName in self.__virtualEnvironments:
-            return (
-                self.__virtualEnvironments[venvName]["interpreter"]
-                .replace("w.exe", ".exe")
+            return self.__virtualEnvironments[venvName]["interpreter"].replace(
+                "w.exe", ".exe"
             )
         else:
             return ""
-    
+
     def setVirtualEnvInterpreter(self, venvName, venvInterpreter):
         """
         Public method to change the interpreter for a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @param venvInterpreter interpreter path to be set
         @type str
         """
         if venvName in self.__virtualEnvironments:
-            self.__virtualEnvironments[venvName]["interpreter"] = (
-                venvInterpreter
-            )
+            self.__virtualEnvironments[venvName]["interpreter"] = venvInterpreter
             self.__saveSettings()
-            
+
             self.virtualEnvironmentChanged.emit(venvName)
             self.virtualEnvironmentsListChanged.emit()
-    
+
     def getVirtualenvDirectory(self, venvName):
         """
         Public method to get the directory of a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @return directory path
@@ -590,11 +627,11 @@
             return self.__virtualEnvironments[venvName]["path"]
         else:
             return ""
-    
+
     def getVirtualenvNames(self, noRemote=False, noConda=False):
         """
         Public method to get a list of defined virtual environments.
-        
+
         @param noRemote flag indicating to exclude environments for remote
             debugging
         @type bool
@@ -605,18 +642,20 @@
         """
         environments = list(self.__virtualEnvironments.keys())
         if noRemote:
-            environments = [name for name in environments
-                            if not self.isRemoteEnvironment(name)]
+            environments = [
+                name for name in environments if not self.isRemoteEnvironment(name)
+            ]
         if noConda:
-            environments = [name for name in environments
-                            if not self.isCondaEnvironment(name)]
-        
+            environments = [
+                name for name in environments if not self.isCondaEnvironment(name)
+            ]
+
         return environments
-    
+
     def isGlobalEnvironment(self, venvName):
         """
         Public method to test, if a given environment is a global one.
-        
+
         @param venvName logical name of the virtual environment
         @type str
         @return flag indicating a global environment
@@ -626,12 +665,12 @@
             return self.__virtualEnvironments[venvName]["is_global"]
         else:
             return False
-    
+
     def isCondaEnvironment(self, venvName):
         """
         Public method to test, if a given environment is an Anaconda
         environment.
-        
+
         @param venvName logical name of the virtual environment
         @type str
         @return flag indicating an Anaconda environment
@@ -641,12 +680,12 @@
             return self.__virtualEnvironments[venvName]["is_conda"]
         else:
             return False
-    
+
     def isRemoteEnvironment(self, venvName):
         """
         Public method to test, if a given environment is a remotely accessed
         environment.
-        
+
         @param venvName logical name of the virtual environment
         @type str
         @return flag indicating a remotely accessed environment
@@ -656,11 +695,11 @@
             return self.__virtualEnvironments[venvName]["is_remote"]
         else:
             return False
-    
+
     def getVirtualenvExecPath(self, venvName):
         """
         Public method to get the search path prefix of a virtual environment.
-        
+
         @param venvName logical name for the virtual environment
         @type str
         @return search path prefix
@@ -670,21 +709,21 @@
             return self.__virtualEnvironments[venvName]["exec_path"]
         else:
             return ""
-    
+
     def setVirtualEnvironmentsBaseDir(self, baseDir):
         """
         Public method to set the base directory for the virtual environments.
-        
+
         @param baseDir base directory for the virtual environments
         @type str
         """
         self.__virtualEnvironmentsBaseDir = baseDir
         self.__saveSettings()
-    
+
     def getVirtualEnvironmentsBaseDir(self):
         """
         Public method to set the base directory for the virtual environments.
-        
+
         @return base directory for the virtual environments
         @rtype str
         """
--- a/src/eric7/VirtualEnv/VirtualenvManagerWidgets.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvManagerWidgets.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,12 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt
 from PyQt6.QtWidgets import (
-    QWidget, QDialog, QDialogButtonBox, QTreeWidgetItem, QHeaderView,
-    QVBoxLayout
+    QWidget,
+    QDialog,
+    QDialogButtonBox,
+    QTreeWidgetItem,
+    QHeaderView,
+    QVBoxLayout,
 )
 
 from EricWidgets.EricPathPicker import EricPathPickerModes
@@ -30,15 +34,16 @@
     Class implementing a widget to manage the list of defined virtual
     environments.
     """
+
     IsGlobalRole = Qt.ItemDataRole.UserRole + 1
     IsCondaRole = Qt.ItemDataRole.UserRole + 2
     IsRemoteRole = Qt.ItemDataRole.UserRole + 3
     ExecPathRole = Qt.ItemDataRole.UserRole + 4
-    
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the virtual environment manager
         @type VirtualenvManager
         @param parent reference to the parent widget
@@ -46,9 +51,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__manager = manager
-        
+
         self.refreshButton.setIcon(UI.PixmapCache.getIcon("reload"))
         self.addButton.setIcon(UI.PixmapCache.getIcon("plus"))
         self.newButton.setIcon(UI.PixmapCache.getIcon("new"))
@@ -59,76 +64,75 @@
         self.deleteButton.setIcon(UI.PixmapCache.getIcon("fileDelete"))
         self.deleteAllButton.setIcon(UI.PixmapCache.getIcon("fileDeleteList"))
         self.saveButton.setIcon(UI.PixmapCache.getIcon("fileSave"))
-        
+
         baseDir = self.__manager.getVirtualEnvironmentsBaseDir()
         if not baseDir:
             baseDir = Utilities.getHomeDir()
-        
+
         self.envBaseDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        self.envBaseDirectoryPicker.setWindowTitle(
-            self.tr("Virtualenv Base Directory"))
+        self.envBaseDirectoryPicker.setWindowTitle(self.tr("Virtualenv Base Directory"))
         self.envBaseDirectoryPicker.setText(baseDir)
-        
+
         self.__populateVenvList()
         self.__updateButtons()
-        
+
         self.venvList.header().setSortIndicator(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.__manager.virtualEnvironmentsListChanged.connect(self.__refresh)
-    
+
     def __updateButtons(self):
         """
         Private method to update the enabled state of the various buttons.
         """
         selectedItemsCount = len(self.venvList.selectedItems())
         topLevelItemCount = self.venvList.topLevelItemCount()
-        
+
         deletableSelectedItemCount = 0
         for itm in self.venvList.selectedItems():
             if (
-                itm.text(0) != "<default>" and
-                bool(itm.text(1)) and
-                not itm.data(0, VirtualenvManagerWidget.IsGlobalRole) and
-                not itm.data(0, VirtualenvManagerWidget.IsRemoteRole)
+                itm.text(0) != "<default>"
+                and bool(itm.text(1))
+                and not itm.data(0, VirtualenvManagerWidget.IsGlobalRole)
+                and not itm.data(0, VirtualenvManagerWidget.IsRemoteRole)
             ):
                 deletableSelectedItemCount += 1
-        
+
         deletableItemCount = 0
         for index in range(topLevelItemCount):
             itm = self.venvList.topLevelItem(index)
             if (
-                itm.text(0) != "<default>" and
-                bool(itm.text(1)) and
-                not itm.data(0, VirtualenvManagerWidget.IsRemoteRole)
+                itm.text(0) != "<default>"
+                and bool(itm.text(1))
+                and not itm.data(0, VirtualenvManagerWidget.IsRemoteRole)
             ):
                 deletableItemCount += 1
-        
+
         canBeRemoved = (
-            selectedItemsCount == 1 and
-            self.venvList.selectedItems()[0].text(0) != "<default>"
+            selectedItemsCount == 1
+            and self.venvList.selectedItems()[0].text(0) != "<default>"
         )
         canAllBeRemoved = (
-            topLevelItemCount == 1 and
-            self.venvList.topLevelItem(0).text(0) != "<default>"
+            topLevelItemCount == 1
+            and self.venvList.topLevelItem(0).text(0) != "<default>"
         )
-        
+
         self.editButton.setEnabled(selectedItemsCount == 1)
-        
+
         self.removeButton.setEnabled(selectedItemsCount > 1 or canBeRemoved)
-        self.removeAllButton.setEnabled(
-            topLevelItemCount > 1 or canAllBeRemoved)
-        
+        self.removeAllButton.setEnabled(topLevelItemCount > 1 or canAllBeRemoved)
+
         self.deleteButton.setEnabled(deletableSelectedItemCount)
         self.deleteAllButton.setEnabled(deletableItemCount)
-        
+
         if selectedItemsCount == 1:
             venvName = self.venvList.selectedItems()[0].text(0)
             venvDirectory = self.__manager.getVirtualenvDirectory(venvName)
-            self.upgradeButton.setEnabled(os.path.exists(os.path.join(
-                venvDirectory, "pyvenv.cfg")))
+            self.upgradeButton.setEnabled(
+                os.path.exists(os.path.join(venvDirectory, "pyvenv.cfg"))
+            )
         else:
             self.upgradeButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -136,33 +140,45 @@
         """
         self.__manager.reloadSettings()
         self.__refresh()
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
         Private slot to add a new entry.
         """
         from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
+
         dlg = VirtualenvAddEditDialog(
-            self.__manager,
-            baseDir=self.envBaseDirectoryPicker.text()
+            self.__manager, baseDir=self.envBaseDirectoryPicker.text()
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
-             isRemote, execPath) = dlg.getData()
-            
+            (
+                venvName,
+                venvDirectory,
+                venvInterpreter,
+                isGlobal,
+                isConda,
+                isRemote,
+                execPath,
+            ) = dlg.getData()
+
             self.__manager.addVirtualEnv(
-                venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
-                isRemote, execPath)
-    
+                venvName,
+                venvDirectory,
+                venvInterpreter,
+                isGlobal,
+                isConda,
+                isRemote,
+                execPath,
+            )
+
     @pyqtSlot()
     def on_newButton_clicked(self):
         """
         Private slot to create a new virtual environment.
         """
-        self.__manager.createVirtualEnv(
-            baseDir=self.envBaseDirectoryPicker.text())
-    
+        self.__manager.createVirtualEnv(baseDir=self.envBaseDirectoryPicker.text())
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -170,37 +186,59 @@
         """
         selectedItem = self.venvList.selectedItems()[0]
         oldVenvName = selectedItem.text(0)
-        
+
         from .VirtualenvAddEditDialog import VirtualenvAddEditDialog
+
         dlg = VirtualenvAddEditDialog(
-            self.__manager, selectedItem.text(0),
-            selectedItem.text(1), selectedItem.text(2),
+            self.__manager,
+            selectedItem.text(0),
+            selectedItem.text(1),
+            selectedItem.text(2),
             selectedItem.data(0, VirtualenvManagerWidget.IsGlobalRole),
             selectedItem.data(0, VirtualenvManagerWidget.IsCondaRole),
             selectedItem.data(0, VirtualenvManagerWidget.IsRemoteRole),
             selectedItem.data(0, VirtualenvManagerWidget.ExecPathRole),
-            baseDir=self.envBaseDirectoryPicker.text()
+            baseDir=self.envBaseDirectoryPicker.text(),
         )
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            (venvName, venvDirectory, venvInterpreter, isGlobal, isConda,
-             isRemote, execPath) = dlg.getData()
+            (
+                venvName,
+                venvDirectory,
+                venvInterpreter,
+                isGlobal,
+                isConda,
+                isRemote,
+                execPath,
+            ) = dlg.getData()
             if venvName != oldVenvName:
                 self.__manager.renameVirtualEnv(
-                    oldVenvName, venvName, venvDirectory, venvInterpreter,
-                    isGlobal, isConda, isRemote, execPath)
+                    oldVenvName,
+                    venvName,
+                    venvDirectory,
+                    venvInterpreter,
+                    isGlobal,
+                    isConda,
+                    isRemote,
+                    execPath,
+                )
             else:
                 self.__manager.setVirtualEnv(
-                    venvName, venvDirectory, venvInterpreter, isGlobal,
-                    isConda, isRemote, execPath)
-    
+                    venvName,
+                    venvDirectory,
+                    venvInterpreter,
+                    isGlobal,
+                    isConda,
+                    isRemote,
+                    execPath,
+                )
+
     @pyqtSlot()
     def on_upgradeButton_clicked(self):
         """
         Private slot to upgrade a virtual environment.
         """
-        self.__manager.upgradeVirtualEnv(
-            self.venvList.selectedItems()[0].text(0))
-    
+        self.__manager.upgradeVirtualEnv(self.venvList.selectedItems()[0].text(0))
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -210,10 +248,10 @@
         selectedVenvs = []
         for itm in self.venvList.selectedItems():
             selectedVenvs.append(itm.text(0))
-        
+
         if selectedVenvs:
             self.__manager.removeVirtualEnvs(selectedVenvs)
-    
+
     @pyqtSlot()
     def on_removeAllButton_clicked(self):
         """
@@ -224,10 +262,10 @@
         for index in range(self.venvList.topLevelItemCount()):
             itm = self.venvList.topLevelItem(index)
             venvNames.append(itm.text(0))
-        
+
         if venvNames:
             self.__manager.removeVirtualEnvs(venvNames)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -236,10 +274,10 @@
         selectedVenvs = []
         for itm in self.venvList.selectedItems():
             selectedVenvs.append(itm.text(0))
-        
+
         if selectedVenvs:
             self.__manager.deleteVirtualEnvs(selectedVenvs)
-    
+
     @pyqtSlot()
     def on_deleteAllButton_clicked(self):
         """
@@ -249,17 +287,17 @@
         for index in range(self.venvList.topLevelItemCount()):
             itm = self.venvList.topLevelItem(index)
             venvNames.append(itm.text(0))
-        
+
         if venvNames:
             self.__manager.deleteVirtualEnvs(venvNames)
-    
+
     @pyqtSlot()
     def on_venvList_itemSelectionChanged(self):
         """
         Private slot handling a change of the selected items.
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def __refresh(self):
         """
@@ -269,40 +307,54 @@
         selectedVenvs = []
         for itm in self.venvList.selectedItems():
             selectedVenvs.append(itm.text(0))
-        
+
         # 2. clear the list
         self.venvList.clear()
-        
+
         # 3. re-populate the list
         self.__populateVenvList()
-        
+
         # 4. re-establish selection
         for venvName in selectedVenvs:
-            itms = self.venvList.findItems(
-                venvName, Qt.MatchFlag.MatchExactly, 0)
+            itms = self.venvList.findItems(venvName, Qt.MatchFlag.MatchExactly, 0)
             if itms:
                 itms[0].setSelected(True)
-    
+
     def __populateVenvList(self):
         """
         Private method to populate the list of virtual environments.
         """
         environments = self.__manager.getEnvironmentEntries()
         for venvName in environments:
-            itm = QTreeWidgetItem(self.venvList, [
-                venvName,
-                environments[venvName]["path"],
-                environments[venvName]["interpreter"],
-            ])
-            itm.setData(0, VirtualenvManagerWidget.IsGlobalRole,
-                        environments[venvName]["is_global"])
-            itm.setData(0, VirtualenvManagerWidget.IsCondaRole,
-                        environments[venvName]["is_conda"])
-            itm.setData(0, VirtualenvManagerWidget.IsRemoteRole,
-                        environments[venvName]["is_remote"])
-            itm.setData(0, VirtualenvManagerWidget.ExecPathRole,
-                        environments[venvName]["exec_path"])
-            
+            itm = QTreeWidgetItem(
+                self.venvList,
+                [
+                    venvName,
+                    environments[venvName]["path"],
+                    environments[venvName]["interpreter"],
+                ],
+            )
+            itm.setData(
+                0,
+                VirtualenvManagerWidget.IsGlobalRole,
+                environments[venvName]["is_global"],
+            )
+            itm.setData(
+                0,
+                VirtualenvManagerWidget.IsCondaRole,
+                environments[venvName]["is_conda"],
+            )
+            itm.setData(
+                0,
+                VirtualenvManagerWidget.IsRemoteRole,
+                environments[venvName]["is_remote"],
+            )
+            itm.setData(
+                0,
+                VirtualenvManagerWidget.ExecPathRole,
+                environments[venvName]["exec_path"],
+            )
+
             # show remote environments with underlined font
             if environments[venvName]["is_remote"]:
                 font = itm.font(0)
@@ -311,32 +363,31 @@
                     itm.setFont(column, font)
             else:
                 # local environments
-                
+
                 # show global environments with bold font
                 if environments[venvName]["is_global"]:
                     font = itm.font(0)
                     font.setBold(True)
                     for column in range(itm.columnCount()):
                         itm.setFont(column, font)
-                
+
                 # show Anaconda environments with italic font
                 if environments[venvName]["is_conda"]:
                     font = itm.font(0)
                     font.setItalic(True)
                     for column in range(itm.columnCount()):
                         itm.setFont(column, font)
-        
+
         self.__resizeSections()
-    
+
     def __resizeSections(self):
         """
         Private method to resize the sections of the environment list to their
         contents.
         """
-        self.venvList.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+        self.venvList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents)
         self.venvList.header().setStretchLastSection(True)
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
@@ -350,10 +401,11 @@
     """
     Class implementing the virtual environments manager dialog variant.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the virtual environment manager
         @type VirtualenvManager
         @param parent reference to the parent widget
@@ -361,22 +413,21 @@
         """
         super().__init__(parent)
         self.setSizeGripEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         self.setLayout(self.__layout)
-        
+
         self.cw = VirtualenvManagerWidget(manager, self)
         self.__layout.addWidget(self.cw)
-        
+
         self.buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close,
-            Qt.Orientation.Horizontal,
-            self)
+            QDialogButtonBox.StandardButton.Close, Qt.Orientation.Horizontal, self
+        )
         self.__layout.addWidget(self.buttonBox)
-        
+
         self.resize(700, 500)
         self.setWindowTitle(self.tr("Manage Virtual Environments"))
-        
+
         self.buttonBox.accepted.connect(self.accept)
         self.buttonBox.rejected.connect(self.reject)
 
@@ -385,34 +436,36 @@
     """
     Main window class for the standalone virtual environments manager.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         from VirtualEnv.VirtualenvManager import VirtualenvManager
+
         self.__virtualenvManager = VirtualenvManager(self)
-        
+
         self.__centralWidget = QWidget(self)
         self.__layout = QVBoxLayout(self.__centralWidget)
         self.__centralWidget.setLayout(self.__layout)
-        
+
         self.__virtualenvManagerWidget = VirtualenvManagerWidget(
-            self.__virtualenvManager, self.__centralWidget)
+            self.__virtualenvManager, self.__centralWidget
+        )
         self.__layout.addWidget(self.__virtualenvManagerWidget)
-        
+
         self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close,
-            Qt.Orientation.Horizontal,
-            self)
+            QDialogButtonBox.StandardButton.Close, Qt.Orientation.Horizontal, self
+        )
         self.__layout.addWidget(self.__buttonBox)
-        
+
         self.setCentralWidget(self.__centralWidget)
         self.resize(700, 500)
         self.setWindowTitle(self.tr("Manage Virtual Environments"))
-        
+
         self.__buttonBox.accepted.connect(self.close)
         self.__buttonBox.rejected.connect(self.close)
--- a/src/eric7/VirtualEnv/VirtualenvNameDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvNameDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     Class implementing a dialog to enter the logical name for a new virtual
     environment.
     """
+
     def __init__(self, environments, currentName, parent=None):
         """
         Constructor
-        
+
         @param environments list of environment names to be shown
         @type list of str
         @param currentName name to be shown in the name edit
@@ -32,29 +33,30 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.envsList.addItems(environments)
         self.nameEdit.setText(currentName)
-        
+
         self.nameEdit.setFocus(Qt.FocusReason.OtherFocusReason)
         self.nameEdit.selectAll()
-    
+
     @pyqtSlot(str)
     def on_nameEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the environment name.
-        
+
         @param txt contens of the name edit
         @type str
         """
         items = self.envsList.findItems(txt, Qt.MatchFlag.MatchExactly)
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            bool(txt) and len(items) == 0)
-    
+            bool(txt) and len(items) == 0
+        )
+
     def getName(self):
         """
         Public method to get the entered name.
-        
+
         @return name for the environment
         @rtype str
         """
--- a/src/eric7/VirtualEnv/VirtualenvUpgradeConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvUpgradeConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,7 +16,7 @@
 from EricWidgets.EricPathPicker import EricPathPickerModes
 
 from .Ui_VirtualenvUpgradeConfigurationDialog import (
-    Ui_VirtualenvUpgradeConfigurationDialog
+    Ui_VirtualenvUpgradeConfigurationDialog,
 )
 
 import Globals
@@ -31,10 +31,11 @@
     Class implementing a dialog to enter the virtual environment upgrade
     parameters.
     """
+
     def __init__(self, envName, envPath, parent=None):
         """
         Constructor
-        
+
         @param envName name of the environment to be upgraded
         @type str
         @param envPath directory of the environment to be upgraded
@@ -44,74 +45,74 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        self.pythonExecPicker.setWindowTitle(
-            self.tr("Python Interpreter"))
-        self.pythonExecPicker.setDefaultDirectory(
-            Globals.getPythonExecutable())
-        
+        self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter"))
+        self.pythonExecPicker.setDefaultDirectory(Globals.getPythonExecutable())
+
         self.envNameLabel.setText(envName)
         self.envDirectoryLabel.setText(envPath)
-        
+
         self.__versionRe = re.compile(r""".*?(\d+\.\d+\.\d+).*""")
-        
+
         self.upgradePythonCheckBox.toggled.connect(self.__updateOkButton)
         self.upgradeDepsCheckBox.toggled.connect(self.__updateOkButton)
-        self.pythonExecPicker.textChanged.connect(
-            self.__updateUpgradeDepsCheckBox)
-        
+        self.pythonExecPicker.textChanged.connect(self.__updateUpgradeDepsCheckBox)
+
         self.__updateUpgradeDepsCheckBox()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __getPyvenvVersion(self):
         """
         Private method to determine the version of the venv module.
-        
+
         @return tuple containing the venv modules version
         @rtype tuple of (int, int, int)
         """
         calls = []
         if self.pythonExecPicker.text():
-            calls.append((self.pythonExecPicker.text(),
-                          ["-m", "venv"]))
-        calls.extend([
-            (Globals.getPythonExecutable(), ["-m", "venv"]),
-            ("python3", ["-m", "venv"]),
-            ("python", ["-m", "venv"]),
-        ])
-        
+            calls.append((self.pythonExecPicker.text(), ["-m", "venv"]))
+        calls.extend(
+            [
+                (Globals.getPythonExecutable(), ["-m", "venv"]),
+                ("python3", ["-m", "venv"]),
+                ("python", ["-m", "venv"]),
+            ]
+        )
+
         proc = QProcess()
         for prog, args in calls:
             proc.start(prog, args)
-            
+
             if not proc.waitForStarted(5000):
                 # try next entry
                 continue
-            
+
             if not proc.waitForFinished(5000):
                 # process hangs, kill it and try next entry
                 QTimer.singleShot(2000, proc.kill)
                 proc.waitForFinished(3000)
                 continue
-            
+
             if proc.exitCode() not in [0, 2]:
                 # returned with error code, try next
                 continue
-            
+
             proc.start(prog, ["--version"])
             proc.waitForFinished(5000)
-            output = str(proc.readAllStandardOutput(),
-                         Preferences.getSystem("IOEncoding"),
-                         'replace').strip()
+            output = str(
+                proc.readAllStandardOutput(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            ).strip()
             match = re.match(self.__versionRe, output)
             if match:
                 return Globals.versionToTuple(match.group(1))
-        
-        return (0, 0, 0)    # dummy version tuple
-    
+
+        return (0, 0, 0)  # dummy version tuple
+
     @pyqtSlot()
     def __updateUpgradeDepsCheckBox(self):
         """
@@ -124,21 +125,21 @@
         else:
             self.upgradeDepsCheckBox.setEnabled(False)
             self.upgradeDepsCheckBox.setChecked(False)
-    
+
     @pyqtSlot()
     def __updateOkButton(self):
         """
         Private slot to set the enabled state of the OK button.
         """
         self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
-            self.upgradePythonCheckBox.isChecked() or
-            self.upgradeDepsCheckBox.isChecked()
+            self.upgradePythonCheckBox.isChecked()
+            or self.upgradeDepsCheckBox.isChecked()
         )
-    
+
     def getData(self):
         """
         Public method to retrieve the dialog data.
-        
+
         @return tuple containing the selected python executable, the list of
             arguments and a flag indicating to write a log file
         @rtype tuple of (str, list of str, bool)
@@ -149,7 +150,7 @@
         if self.upgradeDepsCheckBox.isChecked():
             args.append("--upgrade-deps")
         args.append(self.envDirectoryLabel.text())
-        
+
         return (
             Utilities.toNativeSeparators(self.pythonExecPicker.text()),
             args,
--- a/src/eric7/VirtualEnv/VirtualenvUpgradeExecDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/VirtualEnv/VirtualenvUpgradeExecDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,11 +22,11 @@
     """
     Class implementing the virtualenv upgrade execution dialog.
     """
-    def __init__(self, venvName, interpreter, createLog, venvManager,
-                 parent=None):
+
+    def __init__(self, venvName, interpreter, createLog, venvManager, parent=None):
         """
         Constructor
-        
+
         @param venvName name of the virtual environment to be upgraded
         @type str
         @param interpreter interpreter to be used for the upgrade
@@ -40,35 +40,35 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+
         self.__process = None
         self.__cmd = ""
-        
+
         self.__progs = []
         if interpreter:
             self.__progs.append(interpreter)
-        self.__progs.extend([
-            getPythonExecutable(),
-            "python3",
-            "python",
-        ])
+        self.__progs.extend(
+            [
+                getPythonExecutable(),
+                "python3",
+                "python",
+            ]
+        )
         self.__callIndex = 0
         self.__callArgs = []
-        
+
         self.__venvName = venvName
         self.__venvDirectory = ""
         self.__createLog = createLog
         self.__manager = venvManager
-    
+
     def start(self, arguments):
         """
         Public slot to start the virtualenv command.
-        
+
         @param arguments commandline arguments for virtualenv/pyvenv program
             (list of strings)
         """
@@ -78,66 +78,58 @@
             self.errorGroup.hide()
             self.contents.clear()
             self.errors.clear()
-            
+
             self.__process = QProcess()
             self.__process.readyReadStandardOutput.connect(self.__readStdout)
             self.__process.readyReadStandardError.connect(self.__readStderr)
             self.__process.finished.connect(self.__finish)
-            
+
             self.__callArgs = arguments
             self.__venvDirectory = arguments[-1]
-        
+
         prog = self.__progs[self.__callIndex]
         self.__cmd = "{0} {1}".format(prog, " ".join(arguments))
-        self.__logOutput(self.tr("Executing: {0}\n").format(
-            self.__cmd))
+        self.__logOutput(self.tr("Executing: {0}\n").format(self.__cmd))
         self.__process.start(prog, arguments)
         procStarted = self.__process.waitForStarted(5000)
         if not procStarted:
             self.__logOutput(self.tr("Failed\n\n"))
             self.__nextAttempt()
-    
+
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.accept()
-        elif button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.__finish(0, 0, giveUp=True)
-    
+
     def __finish(self, exitCode, exitStatus, giveUp=False):
         """
         Private slot called when the process finished.
-        
+
         It is called when the process finished or
         the user pressed the button.
-        
+
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         @param giveUp flag indicating to not start another attempt (boolean)
         """
         if (
-            self.__process is not None and
-            self.__process.state() != QProcess.ProcessState.NotRunning
+            self.__process is not None
+            and self.__process.state() != QProcess.ProcessState.NotRunning
         ):
             self.__process.terminate()
             QTimer.singleShot(2000, self.__process.kill)
             self.__process.waitForFinished(3000)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setEnabled(True)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close).setDefault(True)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True)
+
         if not giveUp:
             if exitCode != 0:
                 self.__logOutput(self.tr("Failed\n\n"))
@@ -146,16 +138,16 @@
                     self.errorGroup.hide()
                     self.__nextAttempt()
                     return
-            
+
             self.__process = None
-            
-            self.__logOutput(self.tr('\npyvenv finished.\n'))
-            
+
+            self.__logOutput(self.tr("\npyvenv finished.\n"))
+
             if self.__createLog:
                 self.__writeLogFile()
-            
+
             self.__changeVirtualEnvironmentInterpreter()
-    
+
     def __nextAttempt(self):
         """
         Private method to start another attempt.
@@ -165,69 +157,72 @@
             self.start(self.__callArgs)
         else:
             self.__logError(
-                self.tr('No suitable pyvenv program could be'
-                        ' started.\n'))
+                self.tr("No suitable pyvenv program could be" " started.\n")
+            )
             self.__cmd = ""
             self.__finish(0, 0, giveUp=True)
-    
+
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal.
-        
+
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardOutput)
-        
+
         while self.__process.canReadLine():
-            s = str(self.__process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__logOutput(s)
-    
+
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal.
-        
+
         It reads the error output of the process and inserts it into the
         error pane.
         """
         self.__process.setReadChannel(QProcess.ProcessChannel.StandardError)
-        
+
         while self.__process.canReadLine():
-            s = str(self.__process.readLine(),
-                    Preferences.getSystem("IOEncoding"),
-                    'replace')
+            s = str(
+                self.__process.readLine(),
+                Preferences.getSystem("IOEncoding"),
+                "replace",
+            )
             self.__logError(s)
-    
+
     def __logOutput(self, s):
         """
         Private method to log some output.
-        
+
         @param s output string to log (string)
         """
         self.contents.insertPlainText(s)
         self.contents.ensureCursorVisible()
-    
+
     def __logError(self, s):
         """
         Private method to log an error.
-        
+
         @param s error string to log (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(s)
         self.errors.ensureCursorVisible()
-    
+
     def __writeLogFile(self):
         """
         Private method to write a log file to the virtualenv directory.
         """
         outtxt = self.contents.toPlainText()
         logFile = os.path.join(self.__venvDirectory, "pyvenv_upgrade.log")
-        self.__logOutput(self.tr("\nWriting log file '{0}'.\n")
-                         .format(logFile))
-        
+        self.__logOutput(self.tr("\nWriting log file '{0}'.\n").format(logFile))
+
         try:
             with open(logFile, "w", encoding="utf-8") as f:
                 f.write(self.tr("Output:\n"))
@@ -239,25 +234,27 @@
                     f.write(errtxt)
         except OSError as err:
             self.__logError(
-                self.tr("""The logfile '{0}' could not be written.\n"""
-                        """Reason: {1}\n""").format(logFile, str(err)))
+                self.tr(
+                    """The logfile '{0}' could not be written.\n""" """Reason: {1}\n"""
+                ).format(logFile, str(err))
+            )
         self.__logOutput(self.tr("Done.\n"))
-    
+
     def __changeVirtualEnvironmentInterpreter(self):
         """
         Private method to change the interpreter of the upgraded virtual
         environment.
         """
         from .VirtualenvInterpreterSelectionDialog import (
-            VirtualenvInterpreterSelectionDialog
+            VirtualenvInterpreterSelectionDialog,
         )
-        
+
         venvInterpreter = ""
         dlg = VirtualenvInterpreterSelectionDialog(
-            self.__venvName, self.__venvDirectory)
+            self.__venvName, self.__venvDirectory
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             venvInterpreter = dlg.getData()
-        
+
         if venvInterpreter:
-            self.__manager.setVirtualEnvInterpreter(
-                self.__venvName, venvInterpreter)
+            self.__manager.setVirtualEnvInterpreter(self.__venvName, venvInterpreter)
--- a/src/eric7/WebBrowser/AdBlock/AdBlockDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing the AdBlock configuration dialog.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the AdBlock manager
         @type AdBlockManager
         @param parent reference to the parent object
@@ -34,36 +35,35 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__manager = manager
-        
+
         self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("adBlockPlus48"))
-        
-        self.updateSpinBox.setValue(
-            Preferences.getWebBrowser("AdBlockUpdatePeriod"))
-        
-        self.useLimitedEasyListCheckBox.setChecked(Preferences.getWebBrowser(
-            "AdBlockUseLimitedEasyList"))
-        
+
+        self.updateSpinBox.setValue(Preferences.getWebBrowser("AdBlockUpdatePeriod"))
+
+        self.useLimitedEasyListCheckBox.setChecked(
+            Preferences.getWebBrowser("AdBlockUseLimitedEasyList")
+        )
+
         self.adBlockGroup.setChecked(self.__manager.isEnabled())
         self.__manager.requiredSubscriptionLoaded.connect(self.addSubscription)
         self.__manager.enabledChanged.connect(self.__managerEnabledChanged)
-        
+
         self.__currentTreeWidget = None
         self.__currentSubscription = None
         self.__loaded = False
-        
+
         menu = QMenu(self)
         menu.aboutToShow.connect(self.__aboutToShowActionMenu)
         self.actionButton.setMenu(menu)
         self.actionButton.setIcon(UI.PixmapCache.getIcon("adBlockAction"))
-        self.actionButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
-        
+        self.actionButton.setPopupMode(QToolButton.ToolButtonPopupMode.InstantPopup)
+
         self.__load()
-        
+
         self.buttonBox.setFocus()
-    
+
     def __loadSubscriptions(self):
         """
         Private slot to load the AdBlock subscription rules.
@@ -71,34 +71,34 @@
         for index in range(self.subscriptionsTabWidget.count()):
             tree = self.subscriptionsTabWidget.widget(index)
             tree.refresh()
-    
+
     def __load(self):
         """
         Private slot to populate the tab widget with subscriptions.
         """
         if self.__loaded or not self.adBlockGroup.isChecked():
             return
-        
+
         from .AdBlockTreeWidget import AdBlockTreeWidget
+
         for subscription in self.__manager.subscriptions():
             tree = AdBlockTreeWidget(subscription, self.subscriptionsTabWidget)
             icon = (
                 UI.PixmapCache.getIcon("adBlockPlus")
-                if subscription.isEnabled() else
-                UI.PixmapCache.getIcon("adBlockPlusDisabled")
+                if subscription.isEnabled()
+                else UI.PixmapCache.getIcon("adBlockPlusDisabled")
             )
-            self.subscriptionsTabWidget.addTab(
-                tree, icon, subscription.title())
-        
+            self.subscriptionsTabWidget.addTab(tree, icon, subscription.title())
+
         self.__loaded = True
         QCoreApplication.processEvents()
-        
+
         QTimer.singleShot(50, self.__loadSubscriptions)
-    
+
     def addSubscription(self, subscription, refresh=True):
         """
         Public slot adding a subscription to the list.
-        
+
         @param subscription reference to the subscription to be
             added
         @type AdBlockSubscription
@@ -106,45 +106,42 @@
         @type bool
         """
         from .AdBlockTreeWidget import AdBlockTreeWidget
+
         tree = AdBlockTreeWidget(subscription, self.subscriptionsTabWidget)
         index = self.subscriptionsTabWidget.insertTab(
-            self.subscriptionsTabWidget.count() - 1, tree,
-            subscription.title())
+            self.subscriptionsTabWidget.count() - 1, tree, subscription.title()
+        )
         self.subscriptionsTabWidget.setCurrentIndex(index)
         QCoreApplication.processEvents()
         if refresh:
             tree.refresh()
         self.__setSubscriptionEnabled(subscription, True)
-    
+
     def __aboutToShowActionMenu(self):
         """
         Private slot to show the actions menu.
         """
         subscriptionEditable = (
-            self.__currentSubscription and
-            self.__currentSubscription.canEditRules()
+            self.__currentSubscription and self.__currentSubscription.canEditRules()
         )
         subscriptionRemovable = (
-            self.__currentSubscription and
-            self.__currentSubscription.canBeRemoved()
+            self.__currentSubscription and self.__currentSubscription.canBeRemoved()
         )
         subscriptionEnabled = (
-            self.__currentSubscription and
-            self.__currentSubscription.isEnabled()
+            self.__currentSubscription and self.__currentSubscription.isEnabled()
         )
-        
+
         menu = self.actionButton.menu()
         menu.clear()
-        
-        menu.addAction(
-            self.tr("Add Rule"), self.__addCustomRule
-        ).setEnabled(subscriptionEditable)
-        menu.addAction(
-            self.tr("Remove Rule"), self.__removeCustomRule
-        ).setEnabled(subscriptionEditable)
+
+        menu.addAction(self.tr("Add Rule"), self.__addCustomRule).setEnabled(
+            subscriptionEditable
+        )
+        menu.addAction(self.tr("Remove Rule"), self.__removeCustomRule).setEnabled(
+            subscriptionEditable
+        )
         menu.addSeparator()
-        menu.addAction(
-            self.tr("Browse Subscriptions..."), self.__browseSubscriptions)
+        menu.addAction(self.tr("Browse Subscriptions..."), self.__browseSubscriptions)
         menu.addAction(
             self.tr("Remove Subscription"), self.__removeSubscription
         ).setEnabled(subscriptionRemovable)
@@ -160,72 +157,77 @@
             self.tr("Update Subscription"), self.__updateSubscription
         ).setEnabled(not subscriptionEditable)
         menu.addAction(
-            self.tr("Update All Subscriptions"),
-            self.__updateAllSubscriptions)
+            self.tr("Update All Subscriptions"), self.__updateAllSubscriptions
+        )
         menu.addSeparator()
-        menu.addAction(self.tr("Learn more about writing rules..."),
-                       self.__learnAboutWritingFilters)
-    
+        menu.addAction(
+            self.tr("Learn more about writing rules..."),
+            self.__learnAboutWritingFilters,
+        )
+
     def addCustomRule(self, filterRule):
         """
         Public slot to add a custom AdBlock rule.
-        
+
         @param filterRule filter to be added
         @type string
         """
         self.subscriptionsTabWidget.setCurrentIndex(
-            self.subscriptionsTabWidget.count() - 1)
+            self.subscriptionsTabWidget.count() - 1
+        )
         self.__currentTreeWidget.addRule(filterRule)
-    
+
     def __addCustomRule(self):
         """
         Private slot to add a custom AdBlock rule.
         """
         self.__currentTreeWidget.addRule()
-    
+
     def __removeCustomRule(self):
         """
         Private slot to remove a custom AdBlock rule.
         """
         self.__currentTreeWidget.removeRule()
-    
+
     def __updateSubscription(self):
         """
         Private slot to update the selected subscription.
         """
         self.__currentSubscription.updateNow()
-    
+
     def __updateAllSubscriptions(self):
         """
         Private slot to update all subscriptions.
         """
         self.__manager.updateAllSubscriptions()
-    
+
     def __browseSubscriptions(self):
         """
         Private slot to browse the list of available AdBlock subscriptions.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         mw = WebBrowserWindow.mainWindow()
         mw.newTab("http://adblockplus.org/en/subscriptions")
         mw.raise_()
-    
+
     def __learnAboutWritingFilters(self):
         """
         Private slot to show the web page about how to write filters.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         mw = WebBrowserWindow.mainWindow()
         mw.newTab("http://adblockplus.org/en/filters")
         mw.raise_()
-    
+
     def __removeSubscription(self):
         """
         Private slot to remove the selected subscription.
         """
         requiresTitles = []
-        requiresSubscriptions = (
-            self.__manager.getRequiresSubscriptions(self.__currentSubscription)
+        requiresSubscriptions = self.__manager.getRequiresSubscriptions(
+            self.__currentSubscription
         )
         for subscription in requiresSubscriptions:
             requiresTitles.append(subscription.title())
@@ -233,19 +235,17 @@
             self.tr(
                 "<p>Do you really want to remove subscription"
                 " <b>{0}</b> and all subscriptions requiring it?</p>"
-                "<ul><li>{1}</li></ul>").format(
-                self.__currentSubscription.title(),
-                "</li><li>".join(requiresTitles))
-            if requiresTitles else
-            self.tr(
-                "<p>Do you really want to remove subscription"
-                " <b>{0}</b>?</p>").format(self.__currentSubscription.title())
+                "<ul><li>{1}</li></ul>"
+            ).format(
+                self.__currentSubscription.title(), "</li><li>".join(requiresTitles)
+            )
+            if requiresTitles
+            else self.tr(
+                "<p>Do you really want to remove subscription" " <b>{0}</b>?</p>"
+            ).format(self.__currentSubscription.title())
         )
-        res = EricMessageBox.yesNo(
-            self,
-            self.tr("Remove Subscription"),
-            message)
-        
+        res = EricMessageBox.yesNo(self, self.tr("Remove Subscription"), message)
+
         if res:
             removeSubscription = self.__currentSubscription
             removeTrees = [self.__currentTreeWidget]
@@ -255,20 +255,21 @@
                     removeTrees.append(tree)
             for tree in removeTrees:
                 self.subscriptionsTabWidget.removeTab(
-                    self.subscriptionsTabWidget.indexOf(tree))
+                    self.subscriptionsTabWidget.indexOf(tree)
+                )
             self.__manager.removeSubscription(removeSubscription)
-    
+
     def __switchSubscriptionEnabled(self):
         """
         Private slot to switch the enabled state of the selected subscription.
         """
         newState = not self.__currentSubscription.isEnabled()
         self.__setSubscriptionEnabled(self.__currentSubscription, newState)
-    
+
     def __setSubscriptionEnabled(self, subscription, enable):
         """
         Private slot to set the enabled state of a subscription.
-        
+
         @param subscription subscription to set the state for
         @type AdBlockSubscription
         @param enable state to set to
@@ -281,98 +282,98 @@
             icon = UI.PixmapCache.getIcon("adBlockPlus")
         else:
             # disable dependent ones as well
-            requiresSubscriptions = (
-                self.__manager.getRequiresSubscriptions(subscription)
+            requiresSubscriptions = self.__manager.getRequiresSubscriptions(
+                subscription
             )
             icon = UI.PixmapCache.getIcon("adBlockPlusDisabled")
         requiresSubscriptions.append(subscription)
         for sub in requiresSubscriptions:
             sub.setEnabled(enable)
-        
+
         for index in range(self.subscriptionsTabWidget.count()):
             tree = self.subscriptionsTabWidget.widget(index)
             if tree.subscription() in requiresSubscriptions:
                 self.subscriptionsTabWidget.setTabIcon(
-                    self.subscriptionsTabWidget.indexOf(tree), icon)
-    
+                    self.subscriptionsTabWidget.indexOf(tree), icon
+                )
+
     @pyqtSlot(int)
     def on_updateSpinBox_valueChanged(self, value):
         """
         Private slot to handle changes of the update period.
-        
+
         @param value update period
         @type int
         """
         if value != Preferences.getWebBrowser("AdBlockUpdatePeriod"):
             Preferences.setWebBrowser("AdBlockUpdatePeriod", value)
-            
+
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             manager = WebBrowserWindow.adBlockManager()
             for subscription in manager.subscriptions():
                 subscription.checkForUpdate()
-    
+
     @pyqtSlot(int)
     def on_subscriptionsTabWidget_currentChanged(self, index):
         """
         Private slot handling the selection of another tab.
-        
+
         @param index index of the new current tab
         @type int
         """
         if index != -1:
-            self.__currentTreeWidget = (
-                self.subscriptionsTabWidget.widget(index)
-            )
-            self.__currentSubscription = (
-                self.__currentTreeWidget.subscription()
-            )
-            
+            self.__currentTreeWidget = self.subscriptionsTabWidget.widget(index)
+            self.__currentSubscription = self.__currentTreeWidget.subscription()
+
             isEasyList = (
-                self.__currentSubscription.url().toString().startswith(
-                    self.__manager.getDefaultSubscriptionUrl())
+                self.__currentSubscription.url()
+                .toString()
+                .startswith(self.__manager.getDefaultSubscriptionUrl())
             )
             self.useLimitedEasyListCheckBox.setVisible(isEasyList)
-    
+
     @pyqtSlot(str)
     def on_searchEdit_textChanged(self, filterRule):
         """
         Private slot to set a new filter on the current widget.
-        
+
         @param filterRule filter to be set
         @type str
         """
         if self.__currentTreeWidget and self.adBlockGroup.isChecked():
             self.__currentTreeWidget.filterString(filterRule)
-    
+
     @pyqtSlot(bool)
     def on_adBlockGroup_toggled(self, state):
         """
         Private slot handling the enabling/disabling of AdBlock.
-        
+
         @param state state of the toggle
         @type bool
         """
         self.__manager.setEnabled(state)
-        
+
         if state:
             self.__load()
-    
+
     @pyqtSlot(bool)
     def on_useLimitedEasyListCheckBox_clicked(self, checked):
         """
         Private slot handling the selection of the limited EasyList.
-        
+
         @param checked flag indicating the state of the check box
         @type bool
         """
         self.__manager.setUseLimitedEasyList(
-            self.useLimitedEasyListCheckBox.isChecked())
-    
+            self.useLimitedEasyListCheckBox.isChecked()
+        )
+
     @pyqtSlot(bool)
     def __managerEnabledChanged(self, enabled):
         """
         Private slot handling a change of the AdBlock manager enabled state.
-        
+
         @param enabled flag indicating the enabled state
         @type bool
         """
--- a/src/eric7/WebBrowser/AdBlock/AdBlockExceptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockExceptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,42 +19,42 @@
     """
     Class implementing a dialog to configure the AdBlock exceptions.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("adBlockPlusGreen48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("adBlockPlusGreen48"))
+
         self.buttonBox.setFocus()
-    
+
     def load(self, hosts):
         """
         Public slot to load the list of excepted hosts.
-        
+
         @param hosts list of excepted hosts
         @type list of str
         """
         self.hostList.clear()
         self.hostList.addItems(hosts)
-    
+
     @pyqtSlot(str)
     def on_hostEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the host edit.
-        
+
         @param txt text of the edit
         @type str
         """
         self.addButton.setEnabled(bool(txt))
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -62,14 +62,14 @@
         """
         self.hostList.addItem(self.hostEdit.text())
         self.hostEdit.clear()
-    
+
     @pyqtSlot()
     def on_hostList_itemSelectionChanged(self):
         """
         Private slot handling a change of the number of selected items.
         """
         self.deleteButton.setEnabled(len(self.hostList.selectedItems()) > 0)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -79,7 +79,7 @@
             row = self.hostList.row(itm)
             removedItem = self.hostList.takeItem(row)
             del removedItem
-    
+
     def accept(self):
         """
         Public slot handling the acceptance of the dialog.
@@ -87,8 +87,9 @@
         hosts = []
         for row in range(self.hostList.count()):
             hosts.append(self.hostList.item(row).text())
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.adBlockManager().setExceptions(hosts)
-        
+
         super().accept()
--- a/src/eric7/WebBrowser/AdBlock/AdBlockIcon.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockIcon.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,31 +19,33 @@
     """
     Class implementing the AdBlock icon for the main window status bar.
     """
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type WebBrowserWindow
         """
         super().__init__(parent)
-        
+
         self.__mw = parent
         self.__menu = QMenu(self.tr("AdBlock"))
         self.__enabled = False
-        
+
         self.setMaximumHeight(16)
         self.setCursor(Qt.CursorShape.PointingHandCursor)
-        self.setToolTip(self.tr(
-            "AdBlock lets you block unwanted content on web pages."))
-        
+        self.setToolTip(
+            self.tr("AdBlock lets you block unwanted content on web pages.")
+        )
+
         self.__menu.aboutToShow.connect(self.__aboutToShowMenu)
         self.clicked.connect(self.__showMenu)
-    
+
     def setEnabled(self, enabled):
         """
         Public slot to set the enabled state.
-        
+
         @param enabled enabled state
         @type bool
         """
@@ -51,116 +53,116 @@
         if enabled:
             self.currentChanged()
         else:
-            self.setPixmap(
-                UI.PixmapCache.getPixmap("adBlockPlusDisabled16"))
-    
+            self.setPixmap(UI.PixmapCache.getPixmap("adBlockPlusDisabled16"))
+
     def __aboutToShowMenu(self):
         """
         Private slot to show the context menu.
         """
         self.__menu.clear()
-        
+
         manager = self.__mw.adBlockManager()
-        
+
         if manager.isEnabled():
             act = self.__menu.addAction(
                 UI.PixmapCache.getIcon("adBlockPlusDisabled"),
-                self.tr("Disable AdBlock"))
+                self.tr("Disable AdBlock"),
+            )
             act.triggered.connect(lambda: self.__enableAdBlock(False))
         else:
             act = self.__menu.addAction(
-                UI.PixmapCache.getIcon("adBlockPlus"),
-                self.tr("Enable AdBlock"))
+                UI.PixmapCache.getIcon("adBlockPlus"), self.tr("Enable AdBlock")
+            )
             act.triggered.connect(lambda: self.__enableAdBlock(True))
         self.__menu.addSeparator()
         if manager.isEnabled() and self.__mw.currentBrowser().url().host():
             if self.__isCurrentHostExcepted():
                 act = self.__menu.addAction(
                     UI.PixmapCache.getIcon("adBlockPlus"),
-                    self.tr("Remove AdBlock Exception"))
+                    self.tr("Remove AdBlock Exception"),
+                )
                 act.triggered.connect(lambda: self.__setException(False))
             else:
                 act = self.__menu.addAction(
                     UI.PixmapCache.getIcon("adBlockPlusGreen"),
-                    self.tr("Add AdBlock Exception"))
+                    self.tr("Add AdBlock Exception"),
+                )
                 act.triggered.connect(lambda: self.__setException(True))
         self.__menu.addAction(
             UI.PixmapCache.getIcon("adBlockPlusGreen"),
-            self.tr("AdBlock Exceptions..."), manager.showExceptionsDialog)
+            self.tr("AdBlock Exceptions..."),
+            manager.showExceptionsDialog,
+        )
         self.__menu.addSeparator()
         self.__menu.addAction(
             UI.PixmapCache.getIcon("adBlockPlus"),
-            self.tr("AdBlock Configuration..."), manager.showDialog)
-    
+            self.tr("AdBlock Configuration..."),
+            manager.showDialog,
+        )
+
     def menu(self):
         """
         Public method to get a reference to the menu.
-        
+
         @return reference to the menu
         @rtype QMenu
         """
         if self.__enabled:
-            self.__menu.setIcon(
-                UI.PixmapCache.getIcon("adBlockPlus"))
+            self.__menu.setIcon(UI.PixmapCache.getIcon("adBlockPlus"))
         else:
-            self.__menu.setIcon(
-                UI.PixmapCache.getIcon("adBlockPlusDisabled"))
-        
+            self.__menu.setIcon(UI.PixmapCache.getIcon("adBlockPlusDisabled"))
+
         return self.__menu
-    
+
     def __showMenu(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos position the context menu should be shown
         @type QPoint
         """
         self.__menu.exec(pos)
-    
+
     def __enableAdBlock(self, enable):
         """
         Private slot to enable or disable AdBlock.
-        
+
         @param enable flag indicating the desired enable state
         @type bool
         """
         self.__mw.adBlockManager().setEnabled(enable)
-    
+
     def __isCurrentHostExcepted(self):
         """
         Private method to check, if the host of the current browser is
         excepted.
-        
+
         @return flag indicating an exception
         @rtype bool
         """
         browser = self.__mw.currentBrowser()
         if browser is None:
             return False
-        
+
         urlHost = browser.page().url().host()
-        
-        return (
-            urlHost and
-            self.__mw.adBlockManager().isHostExcepted(urlHost)
-        )
-    
+
+        return urlHost and self.__mw.adBlockManager().isHostExcepted(urlHost)
+
     def currentChanged(self):
         """
         Public slot to handle a change of the current browser tab.
         """
         if self.__enabled:
             if self.__isCurrentHostExcepted():
-                self.setPixmap(
-                    UI.PixmapCache.getPixmap("adBlockPlusGreen16"))
+                self.setPixmap(UI.PixmapCache.getPixmap("adBlockPlusGreen16"))
             else:
                 self.setPixmap(UI.PixmapCache.getPixmap("adBlockPlus16"))
-    
+
     def __setException(self, enable):
         """
         Private slot to add or remove the current host from the list of
         exceptions.
-        
+
         @param enable flag indicating to set or remove an exception
         @type bool
         """
@@ -170,11 +172,11 @@
         else:
             self.__mw.adBlockManager().removeException(urlHost)
         self.currentChanged()
-    
+
     def sourceChanged(self, browser, url):
         """
         Public slot to handle URL changes.
-        
+
         @param browser reference to the browser
         @type WebBrowserView
         @param url new URL
--- a/src/eric7/WebBrowser/AdBlock/AdBlockManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 import contextlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, QObject, QUrl, QUrlQuery, QByteArray, QMutex
-)
+from PyQt6.QtCore import pyqtSignal, QObject, QUrl, QUrlQuery, QByteArray, QMutex
 from PyQt6.QtWebEngineCore import QWebEngineUrlRequestInfo
 
 from EricWidgets import EricMessageBox
@@ -31,26 +29,27 @@
 class AdBlockManager(QObject):
     """
     Class implementing the AdBlock manager.
-    
+
     @signal rulesChanged() emitted after some rule has changed
     @signal requiredSubscriptionLoaded(subscription) emitted to indicate
         loading of a required subscription is finished (AdBlockSubscription)
     @signal enabledChanged(enabled) emitted to indicate a change of the
         enabled state
     """
+
     rulesChanged = pyqtSignal()
     requiredSubscriptionLoaded = pyqtSignal(AdBlockSubscription)
     enabledChanged = pyqtSignal(bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__subscriptionsLoaded = False
         self.__enabled = False
@@ -61,9 +60,8 @@
         self.__subscriptions = []
         self.__exceptedHosts = Preferences.getWebBrowser("AdBlockExceptions")
         self.__saveTimer = AutoSaver(self, self.save)
-        self.__limitedEasyList = Preferences.getWebBrowser(
-            "AdBlockUseLimitedEasyList")
-        
+        self.__limitedEasyList = Preferences.getWebBrowser("AdBlockUseLimitedEasyList")
+
         self.__defaultSubscriptionUrlString = (
             "abp:subscribe?location="
             "https://easylist-downloads.adblockplus.org/easylist.txt&"
@@ -74,76 +72,77 @@
             "hoshsadiq/adblock-nocoin-list/master/nocoin.txt&"
             "title=NoCoin",
         )
-        self.__customSubscriptionUrlString = (
-            bytes(self.__customSubscriptionUrl().toEncoded()).decode()
-        )
-        
+        self.__customSubscriptionUrlString = bytes(
+            self.__customSubscriptionUrl().toEncoded()
+        ).decode()
+
         self.__mutex = QMutex()
         self.__matcher = AdBlockMatcher(self)
-        
+
         self.rulesChanged.connect(self.__saveTimer.changeOccurred)
         self.rulesChanged.connect(self.__rulesChanged)
-        
+
         self.__interceptor = AdBlockUrlInterceptor(self)
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        WebBrowserWindow.networkManager().installUrlInterceptor(
-            self.__interceptor)
-    
+
+        WebBrowserWindow.networkManager().installUrlInterceptor(self.__interceptor)
+
     def __rulesChanged(self):
         """
         Private slot handling a change of the AdBlock rules.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.mainWindow().reloadUserStyleSheet()
         self.__updateMatcher()
-    
+
     def close(self):
         """
         Public method to close the open search engines manager.
         """
         self.__adBlockDialog and self.__adBlockDialog.close()
-        (self.__adBlockExceptionsDialog and
-         self.__adBlockExceptionsDialog.close())
-        
+        (self.__adBlockExceptionsDialog and self.__adBlockExceptionsDialog.close())
+
         self.__saveTimer.saveIfNeccessary()
-    
+
     def isEnabled(self):
         """
         Public method to check, if blocking ads is enabled.
-        
+
         @return flag indicating the enabled state
         @rtype bool
         """
         if not self.__loaded:
             self.load()
-        
+
         return self.__enabled
-    
+
     def setEnabled(self, enabled):
         """
         Public slot to set the enabled state.
-        
+
         @param enabled flag indicating the enabled state
         @type bool
         """
         if self.isEnabled() == enabled:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         self.__enabled = enabled
         for mainWindow in WebBrowserWindow.mainWindows():
             mainWindow.adBlockIcon().setEnabled(enabled)
         if enabled:
             self.__loadSubscriptions()
-        
+
         self.rulesChanged.emit()
         self.enabledChanged.emit(enabled)
-    
+
     def block(self, info):
         """
         Public method to check, if a request should be blocked.
-        
+
         @param info request info object
         @type QWebEngineUrlRequestInfo
         @return flag indicating to block the request
@@ -152,93 +151,95 @@
         with EricMutexLocker(self.__mutex):
             if not self.isEnabled():
                 return False
-            
+
             urlString = bytes(info.requestUrl().toEncoded()).decode().lower()
             urlDomain = info.requestUrl().host().lower()
             urlScheme = info.requestUrl().scheme().lower()
-            
-            if (
-                not self.canRunOnScheme(urlScheme) or
-                not self.__canBeBlocked(info.firstPartyUrl())
+
+            if not self.canRunOnScheme(urlScheme) or not self.__canBeBlocked(
+                info.firstPartyUrl()
             ):
                 return False
-            
+
             res = False
             blockedRule = self.__matcher.match(info, urlDomain, urlString)
-            
+
             if blockedRule:
                 res = True
                 if (
-                    info.resourceType() ==
-                        QWebEngineUrlRequestInfo.ResourceType
-                        .ResourceTypeMainFrame
+                    info.resourceType()
+                    == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMainFrame
                 ):
                     url = QUrl("eric:adblock")
                     query = QUrlQuery()
                     query.addQueryItem("rule", blockedRule.filter())
                     query.addQueryItem(
-                        "subscription", blockedRule.subscription().title())
+                        "subscription", blockedRule.subscription().title()
+                    )
                     url.setQuery(query)
                     info.redirect(url)
                 else:
                     info.block(True)
-            
+
             return res
-    
+
     def canRunOnScheme(self, scheme):
         """
         Public method to check, if AdBlock can be performed on the scheme.
-        
+
         @param scheme scheme to check
         @type str
         @return flag indicating, that AdBlock can be performed
         @rtype bool
         """
         return scheme not in ["data", "eric", "qthelp", "qrc", "file", "abp"]
-    
+
     def page(self):
         """
         Public method to get a reference to the page block object.
-        
+
         @return reference to the page block object
         @rtype AdBlockPage
         """
         if self.__adBlockPage is None:
             from .AdBlockPage import AdBlockPage
+
             self.__adBlockPage = AdBlockPage(self)
         return self.__adBlockPage
-    
+
     def __customSubscriptionLocation(self):
         """
         Private method to generate the path for custom subscriptions.
-        
+
         @return URL for custom subscriptions
         @rtype QUrl
         """
-        dataDir = os.path.join(Utilities.getConfigDir(), "web_browser",
-                               "subscriptions")
+        dataDir = os.path.join(Utilities.getConfigDir(), "web_browser", "subscriptions")
         if not os.path.exists(dataDir):
             os.makedirs(dataDir)
         fileName = os.path.join(dataDir, "adblock_subscription_custom")
         return QUrl.fromLocalFile(fileName)
-    
+
     def __customSubscriptionUrl(self):
         """
         Private method to generate the URL for custom subscriptions.
-        
+
         @return URL for custom subscriptions
         @rtype QUrl
         """
         location = self.__customSubscriptionLocation()
         encodedUrl = bytes(location.toEncoded()).decode()
-        url = QUrl("abp:subscribe?location={0}&title={1}".format(
-            encodedUrl, self.tr("Custom Rules")))
+        url = QUrl(
+            "abp:subscribe?location={0}&title={1}".format(
+                encodedUrl, self.tr("Custom Rules")
+            )
+        )
         return url
-    
+
     def customRules(self):
         """
         Public method to get a subscription for custom rules.
-        
+
         @return subscription object for custom rules
         @rtype AdBlockSubscription
         """
@@ -246,28 +247,28 @@
         for subscription in self.__subscriptions:
             if subscription.location() == location:
                 return subscription
-        
+
         url = self.__customSubscriptionUrl()
         customAdBlockSubscription = AdBlockSubscription(url, True, self)
         self.addSubscription(customAdBlockSubscription)
         return customAdBlockSubscription
-    
+
     def subscriptions(self):
         """
         Public method to get all subscriptions.
-        
+
         @return list of subscriptions
         @rtype list of AdBlockSubscription
         """
         if not self.__loaded:
             self.load()
-        
+
         return self.__subscriptions[:]
-    
+
     def subscription(self, location):
         """
         Public method to get a subscription based on its location.
-        
+
         @param location location of the subscription to search for
         @type str
         @return subscription or None
@@ -277,20 +278,20 @@
             for subscription in self.__subscriptions:
                 if subscription.location().toString() == location:
                     return subscription
-        
+
         return None
-    
+
     def updateAllSubscriptions(self):
         """
         Public method to update all subscriptions.
         """
         for subscription in self.__subscriptions:
             subscription.updateNow()
-    
+
     def removeSubscription(self, subscription, emitSignal=True):
         """
         Public method to remove an AdBlock subscription.
-        
+
         @param subscription AdBlock subscription to be removed
         @type AdBlockSubscription
         @param emitSignal flag indicating to send a signal
@@ -298,12 +299,19 @@
         """
         if subscription is None:
             return
-        
-        if subscription.url().toString().startswith(
-            (self.__defaultSubscriptionUrlString,
-             self.__customSubscriptionUrlString)):
+
+        if (
+            subscription.url()
+            .toString()
+            .startswith(
+                (
+                    self.__defaultSubscriptionUrlString,
+                    self.__customSubscriptionUrlString,
+                )
+            )
+        ):
             return
-        
+
         with contextlib.suppress(ValueError):
             self.__subscriptions.remove(subscription)
             rulesFileName = subscription.rulesFileName()
@@ -313,11 +321,11 @@
                 self.removeSubscription(requiresSubscription, False)
             if emitSignal:
                 self.rulesChanged.emit()
-    
+
     def addSubscriptionFromUrl(self, url):
         """
         Public method to ad an AdBlock subscription given the abp URL.
-        
+
         @param url URL to subscribe an AdBlock subscription
         @type QUrl
         @return flag indicating success
@@ -325,58 +333,60 @@
         """
         if url.path() != "subscribe":
             return False
-        
+
         title = QUrl.fromPercentEncoding(
-            QByteArray(QUrlQuery(url).queryItemValue("title").encode()))
+            QByteArray(QUrlQuery(url).queryItemValue("title").encode())
+        )
         if not title:
             return False
-        
+
         res = EricMessageBox.yesNo(
             None,
             self.tr("Subscribe?"),
             self.tr(
-                """<p>Subscribe to this AdBlock subscription?</p>"""
-                """<p>{0}</p>""").format(title))
+                """<p>Subscribe to this AdBlock subscription?</p>""" """<p>{0}</p>"""
+            ).format(title),
+        )
         if res:
             from .AdBlockSubscription import AdBlockSubscription
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
-            
+
             dlg = WebBrowserWindow.adBlockManager().showDialog()
             subscription = AdBlockSubscription(
-                url, False,
-                WebBrowserWindow.adBlockManager())
+                url, False, WebBrowserWindow.adBlockManager()
+            )
             WebBrowserWindow.adBlockManager().addSubscription(subscription)
             dlg.addSubscription(subscription, False)
             dlg.setFocus()
             dlg.raise_()
-        
+
         return res
-    
+
     def addSubscription(self, subscription):
         """
         Public method to add an AdBlock subscription.
-        
+
         @param subscription AdBlock subscription to be added
         @type AdBlockSubscription
         """
         if subscription is None:
             return
-        
+
         self.__subscriptions.insert(-1, subscription)
-        
+
         subscription.rulesChanged.connect(self.rulesChanged)
         subscription.changed.connect(self.rulesChanged)
         subscription.enabledChanged.connect(self.rulesChanged)
-        
+
         self.rulesChanged.emit()
-    
+
     def save(self):
         """
         Public method to save the AdBlock subscriptions.
         """
         if not self.__loaded:
             return
-        
+
         Preferences.setWebBrowser("AdBlockEnabled", self.__enabled)
         if self.__subscriptionsLoaded:
             subscriptions = []
@@ -394,27 +404,27 @@
             for subscription in requiresSubscriptions:
                 subscriptions.insert(-1, subscription)  # custom should be last
             Preferences.setWebBrowser("AdBlockSubscriptions", subscriptions)
-    
+
     def load(self):
         """
         Public method to load the AdBlock subscriptions.
         """
         if self.__loaded:
             return
-        
+
         self.__loaded = True
-        
+
         self.__enabled = Preferences.getWebBrowser("AdBlockEnabled")
         if self.__enabled:
             self.__loadSubscriptions()
-    
+
     def __loadSubscriptions(self):
         """
         Private method to load the set of subscriptions.
         """
         if self.__subscriptionsLoaded:
             return
-        
+
         subscriptions = Preferences.getWebBrowser("AdBlockSubscriptions")
         if subscriptions:
             for subscription in subscriptions:
@@ -424,9 +434,9 @@
                 subscriptions.append(self.__customSubscriptionUrlString)
         else:
             subscriptions = (
-                [self.__defaultSubscriptionUrlString] +
-                list(self.__additionalDefaultSubscriptionUrlStrings) +
-                [self.__customSubscriptionUrlString]
+                [self.__defaultSubscriptionUrlString]
+                + list(self.__additionalDefaultSubscriptionUrlStrings)
+                + [self.__customSubscriptionUrlString]
             )
         for subscription in subscriptions:
             url = QUrl.fromEncoded(subscription.encode("utf-8"))
@@ -434,48 +444,48 @@
                 url,
                 subscription.startswith(self.__customSubscriptionUrlString),
                 self,
-                subscription.startswith(self.__defaultSubscriptionUrlString))
+                subscription.startswith(self.__defaultSubscriptionUrlString),
+            )
             adBlockSubscription.rulesChanged.connect(self.rulesChanged)
             adBlockSubscription.changed.connect(self.rulesChanged)
             adBlockSubscription.enabledChanged.connect(self.rulesChanged)
+            adBlockSubscription.rulesEnabledChanged.connect(self.__updateMatcher)
             adBlockSubscription.rulesEnabledChanged.connect(
-                self.__updateMatcher)
-            adBlockSubscription.rulesEnabledChanged.connect(
-                self.__saveTimer.changeOccurred)
+                self.__saveTimer.changeOccurred
+            )
             self.__subscriptions.append(adBlockSubscription)
-        
+
         self.__subscriptionsLoaded = True
-        
+
         self.__updateMatcher()
-    
+
     def loadRequiredSubscription(self, location, title):
         """
         Public method to load a subscription required by another one.
-        
+
         @param location location of the required subscription
         @type str
         @param title title of the required subscription
         @type str
         """
         # Step 1: check, if the subscription is in the list of subscriptions
-        urlString = "abp:subscribe?location={0}&title={1}".format(
-            location, title)
+        urlString = "abp:subscribe?location={0}&title={1}".format(location, title)
         for subscription in self.__subscriptions:
             if subscription.url().toString().startswith(urlString):
                 # We found it!
                 return
-        
+
         # Step 2: if it is not, get it
         url = QUrl.fromEncoded(urlString.encode("utf-8"))
         adBlockSubscription = AdBlockSubscription(url, False, self)
         self.addSubscription(adBlockSubscription)
         self.requiredSubscriptionLoaded.emit(adBlockSubscription)
-    
+
     def getRequiresSubscriptions(self, subscription):
         """
         Public method to get a list of subscriptions, that require the given
         one.
-        
+
         @param subscription subscription to check for
         @type AdBlockSubscription
         @return list of subscription requiring the given one
@@ -486,109 +496,108 @@
         for subscription in self.__subscriptions:
             if subscription.requiresLocation() == location:
                 subscriptions.append(subscription)
-        
+
         return subscriptions
-    
+
     def showDialog(self):
         """
         Public slot to show the AdBlock subscription management dialog.
-        
+
         @return reference to the dialog
         @rtype AdBlockDialog
         """
         if self.__adBlockDialog is None:
             from .AdBlockDialog import AdBlockDialog
+
             self.__adBlockDialog = AdBlockDialog(self)
-        
+
         self.__adBlockDialog.show()
         return self.__adBlockDialog
-    
+
     def elementHidingRules(self, url):
         """
         Public method to get the element hiding rules.
-        
-        
+
+
         @param url URL to get hiding rules for
         @type QUrl
         @return element hiding rules
         @rtype str
         """
         if (
-            not self.isEnabled() or
-            not self.canRunOnScheme(url.scheme()) or
-            not self.__canBeBlocked(url)
+            not self.isEnabled()
+            or not self.canRunOnScheme(url.scheme())
+            or not self.__canBeBlocked(url)
         ):
             return ""
-        
+
         return self.__matcher.elementHidingRules()
-    
+
     def elementHidingRulesForDomain(self, url):
         """
         Public method to get the element hiding rules for a domain.
-        
+
         @param url URL to get hiding rules for
         @type QUrl
         @return element hiding rules
         @rtype str
         """
         if (
-            not self.isEnabled() or
-            not self.canRunOnScheme(url.scheme()) or
-            not self.__canBeBlocked(url)
+            not self.isEnabled()
+            or not self.canRunOnScheme(url.scheme())
+            or not self.__canBeBlocked(url)
         ):
             return ""
-        
+
         return self.__matcher.elementHidingRulesForDomain(url.host())
-    
+
     def exceptions(self):
         """
         Public method to get a list of excepted hosts.
-        
+
         @return list of excepted hosts
         @rtype list of str
         """
         return self.__exceptedHosts
-    
+
     def setExceptions(self, hosts):
         """
         Public method to set the list of excepted hosts.
-        
+
         @param hosts list of excepted hosts
         @type list of str
         """
         self.__exceptedHosts = [host.lower() for host in hosts]
         Preferences.setWebBrowser("AdBlockExceptions", self.__exceptedHosts)
-    
+
     def addException(self, host):
         """
         Public method to add an exception.
-        
+
         @param host to be excepted
         @type str
         """
         host = host.lower()
         if host and host not in self.__exceptedHosts:
             self.__exceptedHosts.append(host)
-            Preferences.setWebBrowser(
-                "AdBlockExceptions", self.__exceptedHosts)
-    
+            Preferences.setWebBrowser("AdBlockExceptions", self.__exceptedHosts)
+
     def removeException(self, host):
         """
         Public method to remove an exception.
-        
+
         @param host to be removed from the list of exceptions
         @type str
         """
         host = host.lower()
         if host in self.__exceptedHosts:
             self.__exceptedHosts.remove(host)
-            Preferences.setWebBrowser(
-                "AdBlockExceptions", self.__exceptedHosts)
-    
+            Preferences.setWebBrowser("AdBlockExceptions", self.__exceptedHosts)
+
     def isHostExcepted(self, host):
         """
         Public slot to check, if a host is excepted.
-        
+
         @param host host to check
         @type str
         @return flag indicating an exception
@@ -596,77 +605,80 @@
         """
         host = host.lower()
         return host in self.__exceptedHosts
-    
+
     def showExceptionsDialog(self):
         """
         Public method to show the AdBlock Exceptions dialog.
-        
+
         @return reference to the exceptions dialog
         @rtype AdBlockExceptionsDialog
         """
         if self.__adBlockExceptionsDialog is None:
             from .AdBlockExceptionsDialog import AdBlockExceptionsDialog
+
             self.__adBlockExceptionsDialog = AdBlockExceptionsDialog()
-        
+
         self.__adBlockExceptionsDialog.load(self.__exceptedHosts)
         self.__adBlockExceptionsDialog.show()
         return self.__adBlockExceptionsDialog
-    
+
     def useLimitedEasyList(self):
         """
         Public method to test, if limited EasyList rules shall be used.
-        
+
         @return flag indicating limited EasyList rules
         @rtype bool
         """
         return self.__limitedEasyList
-    
+
     def setUseLimitedEasyList(self, limited):
         """
         Public method to set the limited EasyList flag.
-        
+
         @param limited flag indicating to use limited EasyList
         @type bool
         """
         self.__limitedEasyList = limited
-        
+
         for subscription in self.__subscriptions:
-            if subscription.url().toString().startswith(
-                    self.__defaultSubscriptionUrlString):
+            if (
+                subscription.url()
+                .toString()
+                .startswith(self.__defaultSubscriptionUrlString)
+            ):
                 subscription.updateNow()
-        
+
         Preferences.setWebBrowser("AdBlockUseLimitedEasyList", limited)
-    
+
     def getDefaultSubscriptionUrl(self):
         """
         Public method to get the default subscription URL.
-        
+
         @return default subscription URL
         @rtype str
         """
         return self.__defaultSubscriptionUrlString
-    
+
     def __updateMatcher(self):
         """
         Private slot to update the adblock matcher.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        WebBrowserWindow.networkManager().removeUrlInterceptor(
-            self.__interceptor)
-        
+
+        WebBrowserWindow.networkManager().removeUrlInterceptor(self.__interceptor)
+
         if self.__enabled:
             self.__matcher.update()
         else:
             self.__matcher.clear()
-        
-        WebBrowserWindow.networkManager().installUrlInterceptor(
-            self.__interceptor)
-    
+
+        WebBrowserWindow.networkManager().installUrlInterceptor(self.__interceptor)
+
     def __canBeBlocked(self, url):
         """
         Private method to check, if the given URL could be blocked (i.e. is
         not whitelisted).
-        
+
         @param url URL to be checked
         @type QUrl
         @return flag indicating that the given URL can be blocked
--- a/src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockMatcher.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,32 +17,33 @@
     """
     Class implementing the AdBlock matcher.
     """
+
     def __init__(self, manager):
         """
         Constructor
-        
+
         @param manager reference to the AdBlock manager object
         @type AdBlockManager
         """
         super().__init__(manager)
-        
+
         self.__manager = manager
-        
+
         self.__createdRules = []
         self.__networkExceptionRules = []
         self.__networkBlockRules = []
         self.__domainRestrictedCssRules = []
         self.__documentRules = []
         self.__elemhideRules = []
-        
+
         self.__elementHidingRules = ""
         self.__networkBlockTree = AdBlockSearchTree()
         self.__networkExceptionTree = AdBlockSearchTree()
-    
+
     def match(self, request, urlDomain, urlString):
         """
         Public method to match a request.
-        
+
         @param request URL request to be matched
         @type QWebEngineUrlRequestInfo
         @param urlDomain domain of the URL
@@ -55,38 +56,38 @@
         # exception rules
         if self.__networkExceptionTree.find(request, urlDomain, urlString):
             return None
-        
+
         for rule in self.__networkExceptionRules:
             if rule.networkMatch(request, urlDomain, urlString):
                 return None
-        
+
         # block rules
         rule = self.__networkBlockTree.find(request, urlDomain, urlString)
         if rule:
             return rule
-        
+
         for rule in self.__networkBlockRules:
             if rule.networkMatch(request, urlDomain, urlString):
                 return rule
-        
+
         return None
-    
+
     def adBlockDisabledForUrl(self, url):
         """
         Public method to check, if AdBlock is disabled for the given URL.
-        
+
         @param url URL to check
         @type QUrl
         @return flag indicating disabled state
         @rtype bool
         """
         return any(rule.urlMatch(url) for rule in self.__documentRules)
-    
+
     def elemHideDisabledForUrl(self, url):
         """
         Public method to check, if element hiding is disabled for the given
         URL.
-        
+
         @param url URL to check
         @type QUrl
         @return flag indicating disabled state
@@ -94,22 +95,22 @@
         """
         if self.adBlockDisabledForUrl(url):
             return True
-        
+
         return any(rule.urlMatch(url) for rule in self.__elemhideRules)
-    
+
     def elementHidingRules(self):
         """
         Public method to get the element hiding rules.
-        
+
         @return element hiding rules
         @rtype str
         """
         return self.__elementHidingRules
-    
+
     def elementHidingRulesForDomain(self, domain):
         """
         Public method to get the element hiding rules for the given domain.
-        
+
         @param domain domain name
         @type str
         @return element hiding rules
@@ -117,11 +118,11 @@
         """
         rules = ""
         addedRulesCount = 0
-        
+
         for rule in self.__domainRestrictedCssRules:
             if not rule.matchDomain(domain):
                 continue
-            
+
             if addedRulesCount == 1000:
                 rules += rule.cssSelector()
                 rules += "{display:none !important;}\n"
@@ -129,36 +130,36 @@
             else:
                 rules += rule.cssSelector() + ","
                 addedRulesCount += 1
-        
+
         if addedRulesCount != 0:
             rules = rules[:-1]
             rules += "{display:none !important;}\n"
-        
+
         return rules
-    
+
     def update(self):
         """
         Public slot to update the internal state.
         """
         self.clear()
-        
+
         cssRulesDict = {}
         exceptionCssRules = []
-        
+
         for subscription in self.__manager.subscriptions():
             if subscription.isEnabled():
                 for rule in subscription.allRules():
                     # Don't add internally disabled rules to the cache
                     if rule.isInternalDisabled():
                         continue
-                    
+
                     if rule.isCSSRule():
                         # Only enabled CSS rules are added to the cache because
                         # there is no enabled/disabled check on match. They are
                         # directly embedded to pages.
                         if not rule.isEnabled():
                             continue
-                        
+
                         if rule.isException():
                             exceptionCssRules.append(rule)
                         else:
@@ -173,28 +174,28 @@
                     else:
                         if not self.__networkBlockTree.add(rule):
                             self.__networkBlockRules.append(rule)
-        
+
         for rule in exceptionCssRules:
             try:
                 originalRule = cssRulesDict[rule.cssSelector()]
             except KeyError:
                 # If there is no such selector, the exception does nothing.
                 continue
-            
+
             copiedRule = AdBlockRule()
             copiedRule.copyFrom(originalRule)
             copiedRule.setOption(AdBlockRuleOption.DomainRestrictedOption)
             copiedRule.addBlockedDomains(rule.allowedDomains())
-            
+
             cssRulesDict[rule.cssSelector()] = copiedRule
             self.__createdRules.append(copiedRule)
-        
+
         # Excessive amount of selectors for one CSS rule is not what the
         # rendering engine likes. So split them up by 1.000 selectors.
         hidingRulesCount = 0
         for key in cssRulesDict:
             rule = cssRulesDict[key]
-            
+
             if rule.isDomainRestricted():
                 self.__domainRestrictedCssRules.append(rule)
             elif hidingRulesCount == 1000:
@@ -204,11 +205,11 @@
             else:
                 self.__elementHidingRules += rule.cssSelector() + ","
                 hidingRulesCount += 1
-        
+
         if hidingRulesCount != 0:
             self.__elementHidingRules = self.__elementHidingRules[:-1]
             self.__elementHidingRules += "{display:none !important;} "
-    
+
     def clear(self):
         """
         Public slot to clear the internal structures.
@@ -219,7 +220,7 @@
         self.__domainRestrictedCssRules = []
         self.__documentRules = []
         self.__elemhideRules = []
-        
+
         self.__elementHidingRules = ""
         self.__networkBlockTree.clear()
         self.__networkExceptionTree.clear()
--- a/src/eric7/WebBrowser/AdBlock/AdBlockPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,26 +17,28 @@
     """
     Class to apply AdBlock rules to a web page.
     """
+
     def hideBlockedPageEntries(self, page):
         """
         Public method to apply AdBlock rules to a web page.
-        
+
         @param page reference to the web page (HelpWebPage)
         """
         if page is None:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         manager = WebBrowserWindow.adBlockManager()
         if not manager.isEnabled():
             return
-        
+
         # apply global element hiding rules
         elementHiding = manager.elementHidingRules(page.url())
         if elementHiding:
             script = Scripts.setCss(elementHiding)
             page.runJavaScript(script, WebBrowserPage.SafeJsWorld)
-        
+
         # apply domain specific element hiding rules
         elementHiding = manager.elementHidingRulesForDomain(page.url())
         if elementHiding:
--- a/src/eric7/WebBrowser/AdBlock/AdBlockRule.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockRule.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def toSecondLevelDomain(url):
     """
     Module function to get a second level domain from the given URL.
-    
+
     @param url URL to extract domain from
     @type QUrl
     @return name of second level domain
@@ -27,17 +27,17 @@
     """
     topLevelDomain = EricTldExtractor.instance().tld(url.host())
     urlHost = url.host()
-    
+
     if not topLevelDomain or not urlHost:
         return ""
-    
-    domain = urlHost[:len(urlHost) - len(topLevelDomain)]
+
+    domain = urlHost[: len(urlHost) - len(topLevelDomain)]
     if domain.count(".") == 0:
         return urlHost
-    
+
     while domain.count(".") != 0:
-        domain = domain[domain.find(".") + 1:]
-    
+        domain = domain[domain.find(".") + 1 :]
+
     return domain + topLevelDomain
 
 
@@ -45,6 +45,7 @@
     """
     Class implementing the rule type enum.
     """
+
     CssRule = 0
     DomainMatchRule = 1
     RegExpMatchRule = 2
@@ -58,6 +59,7 @@
     """
     Class implementing the rule option enum.
     """
+
     NoOption = 0
     DomainRestrictedOption = 1
     ThirdPartyOption = 2
@@ -72,7 +74,7 @@
     MediaOption = 1024
     FontOption = 2048
     OtherOption = 4096
-    
+
     # Exception only options
     DocumentOption = 8192
     ElementHideOption = 16384
@@ -82,115 +84,114 @@
     """
     Class implementing the AdBlock rule.
     """
+
     def __init__(self, filterRule="", subscription=None):
         """
         Constructor
-        
+
         @param filterRule filter string of the rule
         @type str
         @param subscription reference to the subscription object
         @type AdBlockSubscription
         """
         self.__subscription = subscription
-        
+
         self.__regExp = None
         self.__stringMatchers = []
-        
+
         self.__blockedDomains = []
         self.__allowedDomains = []
-        
+
         self.__isEnabled = True
         self.__isException = False
         self.__isInternalDisabled = False
         self.__caseSensitivity = Qt.CaseSensitivity.CaseInsensitive
-        
+
         self.__type = AdBlockRuleType.StringContainsMatchRule
         self.__options = AdBlockRuleOption.NoOption
         self.__exceptions = AdBlockRuleOption.NoOption
-        
+
         self.setFilter(filterRule)
-    
+
     def subscription(self):
         """
         Public method to get the subscription this rule belongs to.
-        
+
         @return subscription of the rule
         @rtype AdBlockSubscription
         """
         return self.__subscription
-    
+
     def setSubscription(self, subscription):
         """
         Public method to set the subscription this rule belongs to.
-        
+
         @param subscription subscription of the rule
         @type AdBlockSubscription
         """
         self.__subscription = subscription
-    
+
     def filter(self):
         """
         Public method to get the rule filter string.
-        
+
         @return rule filter string
         @rtype str
         """
         return self.__filter
-    
+
     def setFilter(self, filterRule):
         """
         Public method to set the rule filter string.
-        
+
         @param filterRule rule filter string
         @type str
         """
         self.__filter = filterRule
         self.__parseFilter()
-    
+
     def __parseFilter(self):
         """
         Private method to parse the filter pattern.
         """
         parsedLine = self.__filter
-        
+
         # empty rule or just a comment
         if not parsedLine.strip() or parsedLine.startswith("!"):
             self.__isEnabled = False
             self.__isInternalDisabled = True
             self.__type = AdBlockRuleType.Invalid
             return
-        
+
         # CSS element hiding rule
         if "##" in parsedLine or "#@#" in parsedLine:
             self.__type = AdBlockRuleType.CssRule
             pos = parsedLine.find("#")
-            
+
             # domain restricted rule
             if not parsedLine.startswith("##"):
                 domains = parsedLine[:pos]
                 self.__parseDomains(domains, ",")
-            
+
             self.__isException = parsedLine[pos + 1] == "@"
             if self.__isException:
-                self.__matchString = parsedLine[pos + 3:]
+                self.__matchString = parsedLine[pos + 3 :]
             else:
-                self.__matchString = parsedLine[pos + 2:]
-            
+                self.__matchString = parsedLine[pos + 2 :]
+
             # CSS rule cannot have more options -> stop parsing
             return
-        
+
         # Exception always starts with @@
         if parsedLine.startswith("@@"):
             self.__isException = True
             parsedLine = parsedLine[2:]
-        
+
         # Parse all options following '$' character
         optionsIndex = parsedLine.find("$")
         if optionsIndex >= 0:
-            options = [opt
-                       for opt in parsedLine[optionsIndex + 1:].split(",")
-                       if opt]
-            
+            options = [opt for opt in parsedLine[optionsIndex + 1 :].split(",") if opt]
+
             handledOptions = 0
             for option in options:
                 if option.startswith("domain="):
@@ -201,57 +202,68 @@
                     handledOptions += 1
                 elif option.endswith("third-party"):
                     self.setOption(AdBlockRuleOption.ThirdPartyOption)
-                    self.__setException(AdBlockRuleOption.ThirdPartyOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.ThirdPartyOption, option.startswith("~")
+                    )
                     handledOptions += 1
                 elif option.endswith("object"):
                     self.setOption(AdBlockRuleOption.ObjectOption)
-                    self.__setException(AdBlockRuleOption.ObjectOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.ObjectOption, option.startswith("~")
+                    )
                     handledOptions += 1
                 elif option.endswith("subdocument"):
                     self.setOption(AdBlockRuleOption.SubdocumentOption)
-                    self.__setException(AdBlockRuleOption.SubdocumentOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.SubdocumentOption, option.startswith("~")
+                    )
                     handledOptions += 1
                 elif option.endswith("xmlhttprequest"):
                     self.setOption(AdBlockRuleOption.XMLHttpRequestOption)
-                    self.__setException(AdBlockRuleOption.XMLHttpRequestOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.XMLHttpRequestOption, option.startswith("~")
+                    )
                     handledOptions += 1
                 elif option.endswith("image"):
                     self.setOption(AdBlockRuleOption.ImageOption)
-                    self.__setException(AdBlockRuleOption.ImageOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.ImageOption, option.startswith("~")
+                    )
                 elif option.endswith("script"):
                     self.setOption(AdBlockRuleOption.ScriptOption)
-                    self.__setException(AdBlockRuleOption.ScriptOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.ScriptOption, option.startswith("~")
+                    )
                 elif option.endswith("stylesheet"):
                     self.setOption(AdBlockRuleOption.StyleSheetOption)
-                    self.__setException(AdBlockRuleOption.StyleSheetOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.StyleSheetOption, option.startswith("~")
+                    )
                 elif option.endswith("object-subrequest"):
                     self.setOption(AdBlockRuleOption.ObjectSubrequestOption)
                     self.__setException(
-                        AdBlockRuleOption.ObjectSubrequestOption,
-                        option.startswith("~"))
+                        AdBlockRuleOption.ObjectSubrequestOption, option.startswith("~")
+                    )
                 elif option.endswith("ping"):
                     self.setOption(AdBlockRuleOption.PingOption)
-                    self.__setException(AdBlockRuleOption.PingOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.PingOption, option.startswith("~")
+                    )
                 elif option.endswith("media"):
                     self.setOption(AdBlockRuleOption.MediaOption)
-                    self.__setException(AdBlockRuleOption.MediaOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.MediaOption, option.startswith("~")
+                    )
                 elif option.endswith("font"):
                     self.setOption(AdBlockRuleOption.FontOption)
-                    self.__setException(AdBlockRuleOption.FontOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.FontOption, option.startswith("~")
+                    )
                 elif option.endswith("other"):
                     self.setOption(AdBlockRuleOption.OtherOption)
-                    self.__setException(AdBlockRuleOption.OtherOption,
-                                        option.startswith("~"))
+                    self.__setException(
+                        AdBlockRuleOption.OtherOption, option.startswith("~")
+                    )
                 elif option == "document" and self.__isException:
                     self.setOption(AdBlockRuleOption.DocumentOption)
                     handledOptions += 1
@@ -262,16 +274,16 @@
                     # Hiding placeholders of blocked elements is enabled by
                     # default
                     handledOptions += 1
-            
+
             # If we don't handle all options, it's safer to just disable
             # this rule
             if handledOptions != len(options):
                 self.__isInternalDisabled = True
                 self.__type = AdBlockRuleType.Invalid
                 return
-            
+
             parsedLine = parsedLine[:optionsIndex]
-        
+
         # Rule is classic regexp
         if parsedLine.startswith("/") and parsedLine.endswith("/"):
             parsedLine = parsedLine[1:-1]
@@ -282,27 +294,27 @@
                 self.__regExp = re.compile(parsedLine, re.IGNORECASE)
             self.__stringMatchers = self.__parseRegExpFilter(parsedLine)
             return
-        
+
         # Remove starting / ending wildcards (*)
         if parsedLine.startswith("*"):
             parsedLine = parsedLine[1:]
         if parsedLine.endswith("*"):
             parsedLine = parsedLine[:-1]
-        
+
         # Fast string matching for domain here
         if self.__filterIsOnlyDomain(parsedLine):
             parsedLine = parsedLine[2:-1]
             self.__type = AdBlockRuleType.DomainMatchRule
             self.__matchString = parsedLine
             return
-        
+
         # If rule contains '|' only at the end, string matching can be used
         if self.__filterIsOnlyEndsMatch(parsedLine):
             parsedLine = parsedLine[:-1]
             self.__type = AdBlockRuleType.StringEndsMatchRule
             self.__matchString = parsedLine
             return
-        
+
         # If there is still a wildcard (*) or separator (^) or (|),
         # the rule must be modified to comply with re.
         if "*" in parsedLine or "^" in parsedLine or "|" in parsedLine:
@@ -314,32 +326,32 @@
                 self.__regExp = re.compile(pattern, re.IGNORECASE)
             self.__stringMatchers = self.__parseRegExpFilter(parsedLine)
             return
-        
+
         # This rule matches all URLs
         if len(parsedLine) == 0:
             if self.__options == AdBlockRuleOption.NoOption:
                 self.__isInternalDisabled = True
                 self.__type = AdBlockRuleType.Invalid
                 return
-            
+
             self.__type = AdBlockRuleType.MatchAllUrlsRule
             return
-        
+
         # no regexp required
         self.__type = AdBlockRuleType.StringContainsMatchRule
         self.__matchString = parsedLine
-    
+
     def __parseDomains(self, domains, separator):
         """
         Private method to parse a string with a domain list.
-        
+
         @param domains list of domains
         @type str
         @param separator separator character used by the list
         @type str
         """
         domainsList = [d for d in domains.split(separator) if d]
-        
+
         for domain in domainsList:
             if not domain:
                 continue
@@ -347,14 +359,14 @@
                 self.__blockedDomains.append(domain[1:])
             else:
                 self.__allowedDomains.append(domain)
-        
+
         if bool(self.__blockedDomains) or bool(self.__allowedDomains):
             self.setOption(AdBlockRuleOption.DomainRestrictedOption)
-    
+
     def networkMatch(self, request, domain, encodedUrl):
         """
         Public method to check the rule for a match.
-        
+
         @param request reference to the network request
         @type QWebEngineUrlRequestInfo
         @param domain domain name
@@ -365,124 +377,111 @@
         @rtype bool
         """
         if (
-            self.__type == AdBlockRuleType.CssRule or
-            not self.__isEnabled or
-            self.__isInternalDisabled
+            self.__type == AdBlockRuleType.CssRule
+            or not self.__isEnabled
+            or self.__isInternalDisabled
         ):
             return False
-        
+
         matched = self.__stringMatch(domain, encodedUrl)
-        
+
         if matched:
             # check domain restrictions
-            if (
-                self.__hasOption(AdBlockRuleOption.DomainRestrictedOption) and
-                not self.matchDomain(request.firstPartyUrl().host())
-            ):
+            if self.__hasOption(
+                AdBlockRuleOption.DomainRestrictedOption
+            ) and not self.matchDomain(request.firstPartyUrl().host()):
                 return False
-            
+
             # check third-party restrictions
-            if (
-                self.__hasOption(AdBlockRuleOption.ThirdPartyOption) and
-                not self.matchThirdParty(request)
-            ):
+            if self.__hasOption(
+                AdBlockRuleOption.ThirdPartyOption
+            ) and not self.matchThirdParty(request):
                 return False
-            
+
             # check object restrictions
-            if (
-                self.__hasOption(AdBlockRuleOption.ObjectOption) and
-                not self.matchObject(request)
-            ):
+            if self.__hasOption(
+                AdBlockRuleOption.ObjectOption
+            ) and not self.matchObject(request):
                 return False
-            
+
             # check subdocument restrictions
-            if (
-                self.__hasOption(AdBlockRuleOption.SubdocumentOption) and
-                not self.matchSubdocument(request)
-            ):
+            if self.__hasOption(
+                AdBlockRuleOption.SubdocumentOption
+            ) and not self.matchSubdocument(request):
                 return False
-            
+
             # check xmlhttprequest restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.XMLHttpRequestOption) and
-                not self.matchXmlHttpRequest(request)
+            if self.__hasOption(
+                AdBlockRuleOption.XMLHttpRequestOption
+            ) and not self.matchXmlHttpRequest(request):
+                return False
+
+            # check image restriction
+            if self.__hasOption(AdBlockRuleOption.ImageOption) and not self.matchImage(
+                request
             ):
                 return False
-            
-            # check image restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.ImageOption) and
-                not self.matchImage(request)
-            ):
-                return False
-            
+
             # check script restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.ScriptOption) and
-                not self.matchScript(request)
-            ):
+            if self.__hasOption(
+                AdBlockRuleOption.ScriptOption
+            ) and not self.matchScript(request):
+                return False
+
+            # check stylesheet restriction
+            if self.__hasOption(
+                AdBlockRuleOption.StyleSheetOption
+            ) and not self.matchStyleSheet(request):
                 return False
-            
-            # check stylesheet restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.StyleSheetOption) and
-                not self.matchStyleSheet(request)
+
+            # check object-subrequest restriction
+            if self.__hasOption(
+                AdBlockRuleOption.ObjectSubrequestOption
+            ) and not self.matchObjectSubrequest(request):
+                return False
+
+            # check ping restriction
+            if self.__hasOption(AdBlockRuleOption.PingOption) and not self.matchPing(
+                request
             ):
                 return False
-            
-            # check object-subrequest restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.ObjectSubrequestOption) and
-                not self.matchObjectSubrequest(request)
-            ):
-                return False
-            
-            # check ping restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.PingOption) and
-                not self.matchPing(request)
+
+            # check media restriction
+            if self.__hasOption(AdBlockRuleOption.MediaOption) and not self.matchMedia(
+                request
             ):
                 return False
-            
-            # check media restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.MediaOption) and
-                not self.matchMedia(request)
+
+            # check font restriction
+            if self.__hasOption(AdBlockRuleOption.FontOption) and not self.matchFont(
+                request
             ):
                 return False
-            
-            # check font restriction
-            if (
-                self.__hasOption(AdBlockRuleOption.FontOption) and
-                not self.matchFont(request)
-            ):
-                return False
-        
+
         return matched
-    
+
     def urlMatch(self, url):
         """
         Public method to check an URL against the rule.
-        
+
         @param url URL to check
         @type QUrl
         @return flag indicating a match
         @rtype bool
         """
-        if (
-            not self.__hasOption(AdBlockRuleOption.DocumentOption) and
-            not self.__hasOption(AdBlockRuleOption.ElementHideOption)
-        ):
+        if not self.__hasOption(
+            AdBlockRuleOption.DocumentOption
+        ) and not self.__hasOption(AdBlockRuleOption.ElementHideOption):
             return False
-        
+
         encodedUrl = bytes(url.toEncoded()).decode()
         domain = url.host()
         return self.__stringMatch(domain, encodedUrl)
-    
+
     def __stringMatch(self, domain, encodedUrl):
         """
         Private method to match a domain string.
-        
+
         @param domain domain to match
         @type str
         @param encodedUrl URL in encoded form
@@ -491,7 +490,7 @@
         @rtype bool
         """
         matched = False
-        
+
         if self.__type == AdBlockRuleType.StringContainsMatchRule:
             if self.__caseSensitivity == Qt.CaseSensitivity.CaseInsensitive:
                 matched = self.__matchString.lower() in encodedUrl.lower()
@@ -501,8 +500,7 @@
             matched = self.__isMatchingDomain(domain, self.__matchString)
         elif self.__type == AdBlockRuleType.StringEndsMatchRule:
             if self.__caseSensitivity == Qt.CaseSensitivity.CaseInsensitive:
-                matched = encodedUrl.lower().endswith(
-                    self.__matchString.lower())
+                matched = encodedUrl.lower().endswith(self.__matchString.lower())
             else:
                 matched = encodedUrl.endswith(self.__matchString)
         elif self.__type == AdBlockRuleType.RegExpMatchRule:
@@ -512,13 +510,13 @@
                 matched = self.__regExp.search(encodedUrl) is not None
         elif self.__type == AdBlockRuleType.MatchAllUrlsRule:
             matched = True
-        
+
         return matched
-    
+
     def matchDomain(self, domain):
         """
         Public method to match a domain.
-        
+
         @param domain domain name to check
         @type str
         @return flag indicating a match
@@ -526,28 +524,31 @@
         """
         if not self.__isEnabled:
             return False
-        
+
         if not self.__hasOption(AdBlockRuleOption.DomainRestrictedOption):
             return True
-        
+
         if len(self.__blockedDomains) == 0:
-            return any(self.__isMatchingDomain(domain, dom)
-                       for dom in self.__allowedDomains)
+            return any(
+                self.__isMatchingDomain(domain, dom) for dom in self.__allowedDomains
+            )
         elif len(self.__allowedDomains) == 0:
-            return all(not self.__isMatchingDomain(domain, dom)
-                       for dom in self.__blockedDomains)
+            return all(
+                not self.__isMatchingDomain(domain, dom)
+                for dom in self.__blockedDomains
+            )
         else:
-            return (
-                all(not self.__isMatchingDomain(domain, dom)
-                    for dom in self.__blockedDomains) and
-                any(self.__isMatchingDomain(domain, dom)
-                    for dom in self.__allowedDomains)
+            return all(
+                not self.__isMatchingDomain(domain, dom)
+                for dom in self.__blockedDomains
+            ) and any(
+                self.__isMatchingDomain(domain, dom) for dom in self.__allowedDomains
             )
-    
+
     def matchThirdParty(self, req):
         """
         Public method to match a third-party rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
@@ -556,203 +557,210 @@
         # Third-party matching should be performed on second-level domains
         firstPartyHost = toSecondLevelDomain(req.firstPartyUrl())
         host = toSecondLevelDomain(req.requestUrl())
-        
+
         match = firstPartyHost != host
-        
+
         if self.__hasException(AdBlockRuleOption.ThirdPartyOption):
             return not match
         else:
             return match
-    
+
     def matchObject(self, req):
         """
         Public method to match an object rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeObject)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeObject
+        )
+
         if self.__hasException(AdBlockRuleOption.ObjectOption):
             return not match
         else:
             return match
-    
+
     def matchSubdocument(self, req):
         """
         Public method to match a sub-document rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype boolean
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubFrame)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubFrame
+        )
+
         if self.__hasException(AdBlockRuleOption.SubdocumentOption):
             return not match
         else:
             return match
-    
+
     def matchXmlHttpRequest(self, req):
         """
         Public method to match a XmlHttpRequest rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr)
-        
+            req.resourceType() == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeXhr
+        )
+
         if self.__hasException(AdBlockRuleOption.XMLHttpRequestOption):
             return not match
         else:
             return match
-    
+
     def matchImage(self, req):
         """
         Public method to match an Image rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeImage)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeImage
+        )
+
         if self.__hasException(AdBlockRuleOption.ImageOption):
             return not match
         else:
             return match
-    
+
     def matchScript(self, req):
         """
         Public method to match a Script rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeScript)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeScript
+        )
+
         if self.__hasException(AdBlockRuleOption.ScriptOption):
             return not match
         else:
             return match
-    
+
     def matchStyleSheet(self, req):
         """
         Public method to match a StyleSheet rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeStylesheet)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeStylesheet
+        )
+
         if self.__hasException(AdBlockRuleOption.StyleSheetOption):
             return not match
         else:
             return match
-    
+
     def matchObjectSubrequest(self, req):
         """
         Public method to match an Object Subrequest rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype boolean
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubResource
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeSubResource
         )
         match = match or (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypePluginResource
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypePluginResource
         )
-        
+
         if self.__objectSubrequestException:
             return not match
         else:
             return match
-    
+
     def matchPing(self, req):
         """
         Public method to match a Ping rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypePing)
-        
+            req.resourceType() == QWebEngineUrlRequestInfo.ResourceType.ResourceTypePing
+        )
+
         if self.__hasException(AdBlockRuleOption.PingOption):
             return not match
         else:
             return match
-    
+
     def matchMedia(self, req):
         """
         Public method to match a Media rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMedia)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeMedia
+        )
+
         if self.__hasException(AdBlockRuleOption.MediaOption):
             return not match
         else:
             return match
-    
+
     def matchFont(self, req):
         """
         Public method to match a Font rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
         @rtype bool
         """
         match = (
-            req.resourceType() ==
-            QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFontResource)
-        
+            req.resourceType()
+            == QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFontResource
+        )
+
         if self.__hasException(AdBlockRuleOption.FontOption):
             return not match
         else:
             return match
-    
+
     def matchOther(self, req):
         """
         Public method to match any other rule.
-        
+
         @param req request object to check
         @type QWebEngineUrlRequestInfo
         @return flag indicating a match
@@ -767,140 +775,140 @@
             QWebEngineUrlRequestInfo.ResourceType.ResourceTypeFavicon,
             QWebEngineUrlRequestInfo.ResourceType.ResourceTypeUnknown,
         ]
-        
+
         if self.__hasException(AdBlockRuleOption.OtherOption):
             return not match
         else:
             return match
-    
+
     def isException(self):
         """
         Public method to check, if the rule defines an exception.
-        
+
         @return flag indicating an exception
         @rtype bool
         """
         return self.__isException
-    
+
     def setException(self, exception):
         """
         Public method to set the rule's exception flag.
-        
+
         @param exception flag indicating an exception rule
         @type bool
         """
         self.__isException = exception
-    
+
     def isEnabled(self):
         """
         Public method to check, if the rule is enabled.
-        
+
         @return flag indicating enabled state
         @rtype bool
         """
         return self.__isEnabled
-    
+
     def setEnabled(self, enabled):
         """
         Public method to set the rule's enabled state.
-        
+
         @param enabled flag indicating the new enabled state
         @type bool
         """
         self.__isEnabled = enabled
-    
+
     def isCSSRule(self):
         """
         Public method to check, if the rule is a CSS rule.
-        
+
         @return flag indicating a CSS rule
         @rtype bool
         """
         return self.__type == AdBlockRuleType.CssRule
-    
+
     def cssSelector(self):
         """
         Public method to get the CSS selector of the rule.
-        
+
         @return CSS selector
         @rtype str
         """
         return self.__matchString
-    
+
     def isDocument(self):
         """
         Public method to check, if this is a document rule.
-        
+
         @return flag indicating a document rule
         @rtype bool
         """
         return self.__hasOption(AdBlockRuleOption.DocumentOption)
-    
+
     def isElementHiding(self):
         """
         Public method to check, if this is an element hiding rule.
-        
+
         @return flag indicating an element hiding rule
         @rtype bool
         """
         return self.__hasOption(AdBlockRuleOption.ElementHideOption)
-    
+
     def isDomainRestricted(self):
         """
         Public method to check, if this rule is restricted by domain.
-        
+
         @return flag indicating a domain restriction
         @rtype bool
         """
         return self.__hasOption(AdBlockRuleOption.DomainRestrictedOption)
-    
+
     def isComment(self):
         """
         Public method to check, if this is a comment.
-        
+
         @return flag indicating a comment
         @rtype bool
         """
         return self.__filter.startswith("!")
-    
+
     def isHeader(self):
         """
         Public method to check, if this is a header.
-        
+
         @return flag indicating a header
         @rtype bool
         """
         return self.__filter.startswith("[Adblock")
-    
+
     def isSlow(self):
         """
         Public method to check, if this is a slow rule.
-        
+
         @return flag indicating a slow rule
         @rtype bool
         """
         return self.__regExp is not None
-    
+
     def isInternalDisabled(self):
         """
         Public method to check, if this rule was disabled internally.
-        
+
         @return flag indicating an internally disabled rule
         @rtype bool
         """
         return self.__isInternalDisabled
-    
+
     def __convertPatternToRegExp(self, wildcardPattern):
         """
         Private method to convert a wildcard pattern to a regular expression.
-        
+
         @param wildcardPattern string containing the wildcard pattern
         @type str
         @return string containing a regular expression
         @rtype string
         """
         pattern = wildcardPattern
-        
+
         # remove multiple wildcards
         pattern = re.sub(r"\*+", "*", pattern)
         # remove anchors following separator placeholder
@@ -912,9 +920,7 @@
         # escape special symbols
         pattern = re.sub(r"(\W)", r"\\\1", pattern)
         # process extended anchor at expression start
-        pattern = re.sub(
-            r"^\\\|\\\|",
-            r"^[\\w\-]+:\/+(?!\/)(?:[^\/]+\.)?", pattern)
+        pattern = re.sub(r"^\\\|\\\|", r"^[\\w\-]+:\/+(?!\/)(?:[^\/]+\.)?", pattern)
         # process separator placeholders
         pattern = re.sub(r"\\\^", r"(?:[^\\w\\d\-.%]|$)", pattern)
         # process anchor at expression start
@@ -923,45 +929,45 @@
         pattern = re.sub(r"\\\|$", "$", pattern)
         # replace wildcards by .*
         pattern = re.sub(r"\\\*", ".*", pattern)
-        
+
         return pattern
-    
+
     def __hasOption(self, opt):
         """
         Private method to check, if the given option has been set.
-        
+
         @param opt option to check for
         @type AdBlockRuleOption
         @return flag indicating the state of the option
         @rtype bool
         """
         return bool(self.__options & opt)
-    
+
     def setOption(self, opt):
         """
         Public method to set the given option.
-        
+
         @param opt option to be set
         @type AdBlockRuleOption
         """
         self.__options |= opt
-    
+
     def __hasException(self, opt):
         """
         Private method to check, if the given option has been set as an
         exception.
-        
+
         @param opt option to check for
         @type AdBlockRuleOption
         @return flag indicating the exception state of the option
         @rtype bool
         """
         return bool(self.__exceptions & opt)
-    
+
     def __setException(self, opt, on):
         """
         Private method to set the given option as an exception.
-        
+
         @param opt option to be set
         @type AdBlockRuleOption
         @param on flag indicating to set or unset the exception
@@ -971,11 +977,11 @@
             self.__exceptions |= opt
         else:
             self.__exceptions &= ~opt
-    
+
     def __filterIsOnlyDomain(self, filterString):
         """
         Private method to check, if the given filter is a domain only filter.
-        
+
         @param filterString filter string to be checked
         @type str
         @return flag indicating a domain only filter
@@ -983,15 +989,17 @@
         """
         if not filterString.endswith("^") or not filterString.startswith("||"):
             return False
-        
-        return all(filterChar not in ["/", ":", "?", "=", "&", "*"]
-                   for filterChar in filterString)
-    
+
+        return all(
+            filterChar not in ["/", ":", "?", "=", "&", "*"]
+            for filterChar in filterString
+        )
+
     def __filterIsOnlyEndsMatch(self, filterString):
         """
         Private method to check, if the given filter is to match against the
         end of a string.
-        
+
         @param filterString filter string to be checked
         @type str
         @return flag indicating a end of string match filter
@@ -1003,14 +1011,14 @@
                 return False
             elif filterChar == "|":
                 return index == len(filterString) - 1
-        
+
         return False
-    
+
     def __isMatchingDomain(self, domain, filterString):
         """
         Private method to check, if a given domain matches the given filter
         string.
-        
+
         @param domain domain to be checked
         @type str
         @param filterString filter string to check against
@@ -1020,19 +1028,19 @@
         """
         if filterString == domain:
             return True
-        
+
         if not domain.endswith(filterString):
             return False
-        
+
         index = domain.find(filterString)
-        
+
         return bool(index > 0 and domain[index - 1] == ".")
-    
+
     def __isMatchingRegExpStrings(self, url):
         """
         Private method to check the given URL against the fixed parts of
         the regexp.
-        
+
         @param url URL to be checked
         @type str
         @return flag indicating a match
@@ -1040,21 +1048,21 @@
         """
         if self.__regExp is not None:
             return all(matcher in url for matcher in self.__stringMatchers)
-        
+
         return True
-    
+
     def __parseRegExpFilter(self, filterString):
         """
         Private method to split the given regular expression into strings that
         can be used with 'in'.
-        
+
         @param filterString regexp filter string to be parsed
         @type str
         @return fixed string parts of the filter
         @rtype list of str
         """
         matchers = []
-        
+
         startPos = -1
         for index in range(len(filterString)):
             filterChar = filterString[index]
@@ -1063,80 +1071,80 @@
                 if len(sub) > 1:
                     matchers.append(sub)
                 startPos = index + 1
-        
+
         sub = filterString[startPos:]
         if len(sub) > 1:
             matchers.append(sub)
-        
+
         return list(set(matchers))
-    
+
     def ruleType(self):
         """
         Public method to get the rule type.
-        
+
         @return rule type
         @rtype AdBlockRuleType
         """
         return self.__type
-    
+
     def ruleOptions(self):
         """
         Public method to get the rule options.
-        
+
         @return rule options
         @rtype AdBlockRuleOption
         """
         return self.__options
-    
+
     def ruleExceptions(self):
         """
         Public method to get the rule exceptions.
-        
+
         @return rule exceptions
         @rtype AdBlockRuleOption
         """
         return self.__exceptions
-    
+
     def matchString(self):
         """
         Public method to get the match string.
-        
+
         @return match string
         @rtype str
         """
         return self.__matchString
-    
+
     def caseSensitivity(self):
         """
         Public method to get the case sensitivity.
-        
+
         @return case sensitivity
         @rtype Qt.CaseSensitivity
         """
         return self.__caseSensitivity
-    
+
     def allowedDomains(self):
         """
         Public method to get a copy of the list of allowed domains.
-        
+
         @return list of allowed domains
         @rtype list of str
         """
         return self.__allowedDomains[:]
-    
+
     def blockedDomains(self):
         """
         Public method to get a copy of the list of blocked domains.
-        
+
         @return list of blocked domains
         @rtype list of str
         """
         return self.__blockedDomains[:]
-    
+
     def addBlockedDomains(self, domains):
         """
         Public method to add to the list of blocked domains.
-        
+
         @param domains list of domains to be added
         @type str or list of str
         """
@@ -1144,26 +1152,25 @@
             self.__blockedDomains.extend(domains)
         else:
             self.__blockedDomains.append(domains)
-    
+
     def getRegExpAndMatchers(self):
         """
         Public method to get the regular expression and associated string
         matchers.
-        
+
         @return tuple containing the regular expression and the list of
             string matchers
         @rtype tuple of (re.Pattern, list of str)
         """
         if self.__regExp is not None:
-            return (re.compile(self.__regExp.pattern),
-                    self.__stringMatchers[:])
+            return (re.compile(self.__regExp.pattern), self.__stringMatchers[:])
         else:
             return (None, [])
-    
+
     def copyFrom(self, other):
         """
         Public method to copy another AdBlock rule.
-        
+
         @param other reference to the AdBlock rule to copy from
         @type AdBlockRule
         """
--- a/src/eric7/WebBrowser/AdBlock/AdBlockSearchTree.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockSearchTree.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,11 +14,12 @@
     """
     Class implementing the AdBlock search tree node.
     """
+
     def __init__(self):
         """
         Constructor
         """
-        self.char = ''
+        self.char = ""
         self.rule = None
         self.children = {}
 
@@ -27,23 +28,24 @@
     """
     Class implementing the AdBlock search tree.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self.__root = AdBlockSearchTreeNode()
-    
+
     def clear(self):
         """
         Public method to clear the search tree.
         """
         self.__deleteNode(self.__root)
         self.__root = AdBlockSearchTreeNode()
-    
+
     def add(self, rule):
         """
         Public method to add a rule to the search tree.
-        
+
         @param rule rule to be added
         @type AdBlockRule
         @return flag indicating a successful addition
@@ -51,14 +53,14 @@
         """
         if rule.ruleType() != AdBlockRuleType.StringContainsMatchRule:
             return False
-        
+
         filterString = rule.matchString()
-        
+
         if len(filterString) <= 0:
             return False
-        
+
         node = self.__root
-        
+
         for filterChar in filterString:
             try:
                 nextNode = node.children[filterChar]
@@ -67,15 +69,15 @@
                 nextNode.char = filterChar
                 node.children[filterChar] = nextNode
             node = nextNode
-        
+
         node.rule = rule
-        
+
         return True
-    
+
     def find(self, request, domain, urlString):
         """
         Public method to find a matching rule.
-        
+
         @param request URL request to be matched
         @type QWebEngineUrlRequestInfo
         @param domain domain of the URL
@@ -86,38 +88,39 @@
         @rtype AdBlockRule
         """
         length = len(urlString)
-        
+
         if length <= 0:
             return None
-        
+
         for index in range(length):
-            rule = self.__prefixSearch(request, domain, urlString,
-                                       urlString[index:], length - index)
+            rule = self.__prefixSearch(
+                request, domain, urlString, urlString[index:], length - index
+            )
             if rule:
                 return rule
-        
+
         return None
-    
+
     def __deleteNode(self, node):
         """
         Private method to delete a search tree node.
-        
+
         @param node reference to the node to be deleted
         @type AdBlockSearchTreeNode
         """
         if not node:
             return
-        
+
         for key in node.children:
             self.__deleteNode(node.children[key])
-        
+
         node.children = {}
         node = None
-    
+
     def __prefixSearch(self, request, domain, urlString, string, length):
         """
         Private method to perform a prefix search.
-        
+
         @param request URL request to be matched
         @type QWebEngineUrlRequestInfo
         @param domain domain of the URL
@@ -133,27 +136,24 @@
         """
         if length <= 0:
             return None
-        
+
         char = string[0]
-        
+
         try:
             node = self.__root.children[char]
         except KeyError:
             return None
-        
+
         for char in string[1:]:
-            if (
-                node.rule and
-                node.rule.networkMatch(request, domain, urlString)
-            ):
+            if node.rule and node.rule.networkMatch(request, domain, urlString):
                 return node.rule
-            
+
             try:
                 node = node.children[char]
             except KeyError:
                 return None
-        
+
         if node.rule and node.rule.networkMatch(request, domain, urlString):
             return node.rule
-        
+
         return None
--- a/src/eric7/WebBrowser/AdBlock/AdBlockSubscription.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockSubscription.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,8 +13,16 @@
 import base64
 
 from PyQt6.QtCore import (
-    pyqtSignal, Qt, QObject, QByteArray, QDateTime, QUrl, QUrlQuery,
-    QCryptographicHash, QDate, QTime
+    pyqtSignal,
+    Qt,
+    QObject,
+    QByteArray,
+    QDateTime,
+    QUrl,
+    QUrlQuery,
+    QCryptographicHash,
+    QDate,
+    QTime,
 )
 from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest
 
@@ -27,58 +35,61 @@
 class AdBlockSubscription(QObject):
     """
     Class implementing the AdBlock subscription.
-    
+
     @signal changed() emitted after the subscription has changed
     @signal rulesChanged() emitted after the subscription's rules have changed
     @signal enabledChanged(bool) emitted after the enabled state was changed
     @signal rulesEnabledChanged() emitted after a rule enabled state was
         changed
     """
+
     changed = pyqtSignal()
     rulesChanged = pyqtSignal()
     enabledChanged = pyqtSignal(bool)
     rulesEnabledChanged = pyqtSignal()
-    
+
     def __init__(self, url, custom, parent=None, default=False):
         """
         Constructor
-        
+
         @param url AdBlock URL for the subscription (QUrl)
         @param custom flag indicating a custom subscription (boolean)
         @param parent reference to the parent object (QObject)
         @param default flag indicating a default subscription (boolean)
         """
         super().__init__(parent)
-        
+
         self.__custom = custom
         self.__url = url.toEncoded()
         self.__enabled = False
         self.__downloading = None
         self.__defaultSubscription = default
-        
+
         self.__title = ""
         self.__location = QByteArray()
         self.__lastUpdate = QDateTime()
         self.__requiresLocation = ""
         self.__requiresTitle = ""
-        
-        self.__updatePeriod = 0     # update period in hours, 0 = use default
+
+        self.__updatePeriod = 0  # update period in hours, 0 = use default
         self.__remoteModified = QDateTime()
-        
-        self.__rules = []   # list containing all AdBlock rules
-        
+
+        self.__rules = []  # list containing all AdBlock rules
+
         self.__checksumRe = re.compile(
             r"""^\s*!\s*checksum[\s\-:]+([\w\+\/=]+).*\n""",
-            re.IGNORECASE | re.MULTILINE)
+            re.IGNORECASE | re.MULTILINE,
+        )
         self.__expiresRe = re.compile(
-            r"""(?:expires:|expires after)\s*(\d+)\s*(hour|h)?""",
-            re.IGNORECASE)
+            r"""(?:expires:|expires after)\s*(\d+)\s*(hour|h)?""", re.IGNORECASE
+        )
         self.__remoteModifiedRe = re.compile(
             r"""!\s*(?:Last modified|Updated):\s*(\d{1,2})\s*"""
             r"""(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*"""
             r"""(\d{2,4})\s*((\d{1,2}):(\d{2}))?""",
-            re.IGNORECASE)
-        
+            re.IGNORECASE,
+        )
+
         self.__monthNameToNumber = {
             "Jan": 1,
             "Feb": 2,
@@ -91,60 +102,67 @@
             "Sep": 9,
             "Oct": 10,
             "Nov": 11,
-            "Dec": 12
+            "Dec": 12,
         }
-        
+
         self.__parseUrl(url)
-    
+
     def __parseUrl(self, url):
         """
         Private method to parse the AdBlock URL for the subscription.
-        
+
         @param url AdBlock URL for the subscription
         @type QUrl
         """
         if url.scheme() != "abp":
             return
-        
+
         if url.path() != "subscribe":
             return
-        
+
         urlQuery = QUrlQuery(url)
         self.__title = QUrl.fromPercentEncoding(
-            QByteArray(urlQuery.queryItemValue("title").encode()))
+            QByteArray(urlQuery.queryItemValue("title").encode())
+        )
         self.__enabled = urlQuery.queryItemValue("enabled") != "false"
-        self.__location = QByteArray(QUrl.fromPercentEncoding(
-            QByteArray(urlQuery.queryItemValue("location").encode()))
-            .encode("utf-8"))
-        
+        self.__location = QByteArray(
+            QUrl.fromPercentEncoding(
+                QByteArray(urlQuery.queryItemValue("location").encode())
+            ).encode("utf-8")
+        )
+
         # Check for required subscription
         self.__requiresLocation = QUrl.fromPercentEncoding(
-            QByteArray(urlQuery.queryItemValue(
-                "requiresLocation").encode()))
+            QByteArray(urlQuery.queryItemValue("requiresLocation").encode())
+        )
         self.__requiresTitle = QUrl.fromPercentEncoding(
-            QByteArray(urlQuery.queryItemValue("requiresTitle").encode()))
+            QByteArray(urlQuery.queryItemValue("requiresTitle").encode())
+        )
         if self.__requiresLocation and self.__requiresTitle:
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             WebBrowserWindow.adBlockManager().loadRequiredSubscription(
-                self.__requiresLocation, self.__requiresTitle)
-        
+                self.__requiresLocation, self.__requiresTitle
+            )
+
         lastUpdateString = urlQuery.queryItemValue("lastUpdate")
-        self.__lastUpdate = QDateTime.fromString(lastUpdateString,
-                                                 Qt.DateFormat.ISODate)
-        
+        self.__lastUpdate = QDateTime.fromString(
+            lastUpdateString, Qt.DateFormat.ISODate
+        )
+
         self.__loadRules()
-    
+
     def url(self):
         """
         Public method to generate the URL for this subscription.
-        
+
         @return AdBlock URL for the subscription
         @rtype QUrl
         """
         url = QUrl()
         url.setScheme("abp")
         url.setPath("subscribe")
-        
+
         queryItems = []
         queryItems.append(("location", bytes(self.__location).decode()))
         queryItems.append(("title", self.__title))
@@ -155,124 +173,123 @@
             queryItems.append(("enabled", "false"))
         if self.__lastUpdate.isValid():
             queryItems.append(
-                ("lastUpdate",
-                 self.__lastUpdate.toString(Qt.DateFormat.ISODate))
+                ("lastUpdate", self.__lastUpdate.toString(Qt.DateFormat.ISODate))
             )
-        
+
         query = QUrlQuery()
         query.setQueryItems(queryItems)
         url.setQuery(query)
         return url
-    
+
     def isEnabled(self):
         """
         Public method to check, if the subscription is enabled.
-        
+
         @return flag indicating the enabled status
         @rtype bool
         """
         return self.__enabled
-    
+
     def setEnabled(self, enabled):
         """
         Public method to set the enabled status.
-        
+
         @param enabled flag indicating the enabled status
         @type bool
         """
         if self.__enabled == enabled:
             return
-        
+
         self.__enabled = enabled
         self.enabledChanged.emit(enabled)
-    
+
     def title(self):
         """
         Public method to get the subscription title.
-        
+
         @return subscription title
         @rtype string
         """
         return self.__title
-    
+
     def setTitle(self, title):
         """
         Public method to set the subscription title.
-        
+
         @param title subscription title
         @type str
         """
         if self.__title == title:
             return
-        
+
         self.__title = title
         self.changed.emit()
-    
+
     def location(self):
         """
         Public method to get the subscription location.
-        
+
         @return URL of the subscription location
         @rtype QUrl
         """
         return QUrl.fromEncoded(self.__location)
-    
+
     def setLocation(self, url):
         """
         Public method to set the subscription location.
-        
+
         @param url URL of the subscription location
         @type QUrl
         """
         if url == self.location():
             return
-        
+
         self.__location = url.toEncoded()
         self.__lastUpdate = QDateTime()
         self.changed.emit()
-    
+
     def requiresLocation(self):
         """
         Public method to get the location of a required subscription.
-        
+
         @return location of a required subscription
         @rtype str
         """
         return self.__requiresLocation
-    
+
     def lastUpdate(self):
         """
         Public method to get the date and time of the last update.
-        
+
         @return date and time of the last update
         @rtype QDateTime
         """
         return self.__lastUpdate
-    
+
     def rulesFileName(self):
         """
         Public method to get the name of the rules file.
-        
+
         @return name of the rules file
         @rtype str
         """
         if self.location().scheme() == "file":
             return self.location().toLocalFile()
-        
+
         if self.__location.isEmpty():
             return ""
-        
-        sha1 = bytes(QCryptographicHash.hash(
-            self.__location, QCryptographicHash.Algorithm.Sha1).toHex()
+
+        sha1 = bytes(
+            QCryptographicHash.hash(
+                self.__location, QCryptographicHash.Algorithm.Sha1
+            ).toHex()
         ).decode()
-        dataDir = os.path.join(
-            Utilities.getConfigDir(), "web_browser", "subscriptions")
+        dataDir = os.path.join(Utilities.getConfigDir(), "web_browser", "subscriptions")
         if not os.path.exists(dataDir):
             os.makedirs(dataDir)
-        fileName = os.path.join(
-            dataDir, "adblock_subscription_{0}".format(sha1))
+        fileName = os.path.join(dataDir, "adblock_subscription_{0}".format(sha1))
         return fileName
-    
+
     def __loadRules(self):
         """
         Private method to load the rules of the subscription.
@@ -286,15 +303,17 @@
                         EricMessageBox.warning(
                             None,
                             self.tr("Load subscription rules"),
-                            self.tr("""AdBlock file '{0}' does not start"""
-                                    """ with [Adblock.""")
-                            .format(fileName))
+                            self.tr(
+                                """AdBlock file '{0}' does not start"""
+                                """ with [Adblock."""
+                            ).format(fileName),
+                        )
                         f.close()
                         os.unlink(fileName)
                         self.__lastUpdate = QDateTime()
                     else:
                         from .AdBlockRule import AdBlockRule
-                        
+
                         self.__updatePeriod = 0
                         self.__remoteModified = QDateTime()
                         self.__rules = []
@@ -313,91 +332,98 @@
                                 else:
                                     # days
                                     self.__updatePeriod = int(period) * 24
-                            remoteModified = self.__remoteModifiedRe.search(
-                                line)
+                            remoteModified = self.__remoteModifiedRe.search(line)
                             if remoteModified:
-                                day, month, year, time, hour, minute = (
-                                    remoteModified.groups()
-                                )
+                                (
+                                    day,
+                                    month,
+                                    year,
+                                    time,
+                                    hour,
+                                    minute,
+                                ) = remoteModified.groups()
                                 self.__remoteModified.setDate(
-                                    QDate(int(year),
-                                          self.__monthNameToNumber[month],
-                                          int(day))
+                                    QDate(
+                                        int(year),
+                                        self.__monthNameToNumber[month],
+                                        int(day),
+                                    )
                                 )
                                 if time:
                                     self.__remoteModified.setTime(
-                                        QTime(int(hour), int(minute)))
+                                        QTime(int(hour), int(minute))
+                                    )
                                 else:
                                     # no time given, set it to 23:59
-                                    self.__remoteModified.setTime(
-                                        QTime(23, 59))
+                                    self.__remoteModified.setTime(QTime(23, 59))
                         self.changed.emit()
             except OSError as err:
                 EricMessageBox.warning(
                     None,
                     self.tr("Load subscription rules"),
                     self.tr(
-                        """Unable to read AdBlock file '{0}'.\nReason: {1}""")
-                    .format(fileName, str(err))
+                        """Unable to read AdBlock file '{0}'.\nReason: {1}"""
+                    ).format(fileName, str(err)),
                 )
-        
+
         elif not fileName.endswith("_custom"):
             self.__lastUpdate = QDateTime()
-        
+
         self.checkForUpdate()
-    
+
     def checkForUpdate(self):
         """
         Public method to check for an update.
         """
         updatePeriod = (
             self.__updatePeriod
-            if self.__updatePeriod else
-            Preferences.getWebBrowser("AdBlockUpdatePeriod") * 24
+            if self.__updatePeriod
+            else Preferences.getWebBrowser("AdBlockUpdatePeriod") * 24
         )
         if (
-            not self.__lastUpdate.isValid() or
-            (self.__remoteModified.isValid() and
-             self.__remoteModified.addSecs(updatePeriod * 3600) <
-                QDateTime.currentDateTime()) or
-            self.__lastUpdate.addSecs(updatePeriod * 3600) <
-                QDateTime.currentDateTime()
+            not self.__lastUpdate.isValid()
+            or (
+                self.__remoteModified.isValid()
+                and self.__remoteModified.addSecs(updatePeriod * 3600)
+                < QDateTime.currentDateTime()
+            )
+            or self.__lastUpdate.addSecs(updatePeriod * 3600)
+            < QDateTime.currentDateTime()
         ):
             self.updateNow()
-    
+
     def updateNow(self):
         """
         Public method to update the subscription immediately.
         """
         if self.__downloading is not None:
             return
-        
+
         if not self.location().isValid():
             return
-        
+
         if self.location().scheme() == "file":
             self.__lastUpdate = QDateTime.currentDateTime()
             self.__loadRules()
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        reply = WebBrowserWindow.networkManager().get(
-            QNetworkRequest(self.location()))
-        reply.finished.connect(
-            lambda: self.__rulesDownloaded(reply))
+
+        reply = WebBrowserWindow.networkManager().get(QNetworkRequest(self.location()))
+        reply.finished.connect(lambda: self.__rulesDownloaded(reply))
         self.__downloading = reply
-    
+
     def __rulesDownloaded(self, reply):
         """
         Private slot to deal with the downloaded rules.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         response = bytes(reply.readAll())
         reply.close()
         self.__downloading = None
-        
+
         if reply.error() != QNetworkReply.NetworkError.NoError:
             if not self.__defaultSubscription:
                 # don't show error if we try to load the default
@@ -406,29 +432,34 @@
                     self.tr("Downloading subscription rules"),
                     self.tr(
                         """<p>Subscription rules could not be"""
-                        """ downloaded.</p><p>Error: {0}</p>""")
-                    .format(reply.errorString()))
+                        """ downloaded.</p><p>Error: {0}</p>"""
+                    ).format(reply.errorString()),
+                )
             else:
                 # reset after first download attempt
                 self.__defaultSubscription = False
             return
-        
+
         if not response:
             EricMessageBox.warning(
                 None,
                 self.tr("Downloading subscription rules"),
-                self.tr("""Got empty subscription rules."""))
+                self.tr("""Got empty subscription rules."""),
+            )
             return
-        
+
         fileName = self.rulesFileName()
         try:
             with open(fileName, "wb") as f:
                 from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
                 if (
-                    WebBrowserWindow.adBlockManager().useLimitedEasyList() and
-                    self.url().toString().startswith(
-                        WebBrowserWindow.adBlockManager()
-                        .getDefaultSubscriptionUrl())
+                    WebBrowserWindow.adBlockManager().useLimitedEasyList()
+                    and self.url()
+                    .toString()
+                    .startswith(
+                        WebBrowserWindow.adBlockManager().getDefaultSubscriptionUrl()
+                    )
                 ):
                     limited = True
                     # ignore Third-party advertisers rules for performance
@@ -436,12 +467,14 @@
                     index = response.find(
                         b"!---------------------------"
                         b"Third-party advertisers"
-                        b"---------------------------!")
+                        b"---------------------------!"
+                    )
                     part1 = response[:index]
                     index = response.find(
                         b"!-----------------------"
                         b"Whitelists to fix broken sites"
-                        b"------------------------!")
+                        b"------------------------!"
+                    )
                     part2 = response[index:]
                     f.write(part1)
                     f.write(part2)
@@ -450,7 +483,7 @@
                     f.write(response)
                 f.close()
                 self.__lastUpdate = QDateTime.currentDateTime()
-                
+
                 if limited or self.__validateCheckSum(fileName):
                     self.__loadRules()
                 else:
@@ -459,15 +492,15 @@
             EricMessageBox.warning(
                 None,
                 self.tr("Downloading subscription rules"),
-                self.tr("""Unable to write to AdBlock file '{0}'.""")
-                .file(fileName))
+                self.tr("""Unable to write to AdBlock file '{0}'.""").file(fileName),
+            )
         self.__downloading = None
         reply.deleteLater()
-    
+
     def __validateCheckSum(self, fileName):
         """
         Private method to check the subscription file's checksum.
-        
+
         @param fileName name of the file containing the subscription
         @type str
         @return flag indicating a valid file. A file is considered
@@ -481,25 +514,23 @@
                 data = f.read()
         except (OSError, OSError):
             return False
-        
+
         match = re.search(self.__checksumRe, data)
         if match:
             expectedChecksum = match.group(1)
         else:
             # consider it as valid
             return True
-        
+
         # normalize the data
-        data = re.sub(r"\r", "", data)              # normalize eol
-        data = re.sub(r"\n+", "\n", data)           # remove empty lines
+        data = re.sub(r"\r", "", data)  # normalize eol
+        data = re.sub(r"\n+", "\n", data)  # remove empty lines
         data = re.sub(self.__checksumRe, "", data)  # remove checksum line
-        
+
         # calculate checksum
-        md5 = hashlib.md5()             # secok
+        md5 = hashlib.md5()  # secok
         md5.update(data.encode("utf-8"))
-        calculatedChecksum = (
-            base64.b64encode(md5.digest()).decode().rstrip("=")
-        )
+        calculatedChecksum = base64.b64encode(md5.digest()).decode().rstrip("=")
         if calculatedChecksum == expectedChecksum:
             return True
         else:
@@ -511,11 +542,11 @@
                     """ checksum.<br/>"""
                     """Found: {1}<br/>"""
                     """Calculated: {2}<br/>"""
-                    """Use it anyway?</p>""")
-                .format(self.__title, expectedChecksum,
-                        calculatedChecksum))
+                    """Use it anyway?</p>"""
+                ).format(self.__title, expectedChecksum, calculatedChecksum),
+            )
             return res
-    
+
     def saveRules(self):
         """
         Public method to save the subscription rules.
@@ -523,7 +554,7 @@
         fileName = self.rulesFileName()
         if not fileName:
             return
-        
+
         try:
             with open(fileName, "w", encoding="utf-8") as f:
                 if not self.__rules or not self.__rules[0].isHeader():
@@ -534,13 +565,13 @@
             EricMessageBox.warning(
                 None,
                 self.tr("Saving subscription rules"),
-                self.tr("""Unable to write to AdBlock file '{0}'.""")
-                .format(fileName))
-    
+                self.tr("""Unable to write to AdBlock file '{0}'.""").format(fileName),
+            )
+
     def rule(self, offset):
         """
         Public method to get a specific rule.
-        
+
         @param offset offset of the rule
         @type int
         @return requested rule
@@ -548,22 +579,22 @@
         """
         if offset >= len(self.__rules):
             return None
-        
+
         return self.__rules[offset]
-    
+
     def allRules(self):
         """
         Public method to get the list of rules.
-        
+
         @return list of rules
         @rtype list of AdBlockRule
         """
         return self.__rules[:]
-    
+
     def addRule(self, rule):
         """
         Public method to add a rule.
-        
+
         @param rule reference to the rule to add
         @type AdBlockRule
         @return offset of the rule
@@ -571,26 +602,26 @@
         """
         self.__rules.append(rule)
         self.rulesChanged.emit()
-        
+
         return len(self.__rules) - 1
-    
+
     def removeRule(self, offset):
         """
         Public method to remove a rule given the offset.
-        
+
         @param offset offset of the rule to remove
         @type int
         """
         if offset < 0 or offset > len(self.__rules):
             return
-        
+
         del self.__rules[offset]
         self.rulesChanged.emit()
-    
+
     def replaceRule(self, rule, offset):
         """
         Public method to replace a rule given the offset.
-        
+
         @param rule reference to the rule to set
         @type AdBlockRule
         @param offset offset of the rule to remove
@@ -600,34 +631,34 @@
         """
         if offset >= len(self.__rules):
             return None
-        
+
         self.__rules[offset] = rule
         self.rulesChanged.emit()
-        
+
         return self.__rules[offset]
-    
+
     def canEditRules(self):
         """
         Public method to check, if rules can be edited.
-        
+
         @return flag indicating rules may be edited
         @rtype bool
         """
         return self.__custom
-    
+
     def canBeRemoved(self):
         """
         Public method to check, if the subscription can be removed.
-        
+
         @return flag indicating removal is allowed
         @rtype bool
         """
         return not self.__custom and not self.__defaultSubscription
-    
+
     def setRuleEnabled(self, offset, enabled):
         """
         Public method to enable a specific rule.
-        
+
         @param offset offset of the rule
         @type int
         @param enabled new enabled state
@@ -637,13 +668,14 @@
         """
         if offset >= len(self.__rules):
             return None
-        
+
         rule = self.__rules[offset]
         rule.setEnabled(enabled)
         self.rulesEnabledChanged.emit()
-        
+
         if rule.isCSSRule():
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             WebBrowserWindow.mainWindow().reloadUserStyleSheet()
-        
+
         return rule
--- a/src/eric7/WebBrowser/AdBlock/AdBlockTreeWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockTreeWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,12 @@
 from PyQt6.QtCore import Qt
 from PyQt6.QtGui import QFont, QColor
 from PyQt6.QtWidgets import (
-    QAbstractItemView, QTreeWidgetItem, QInputDialog, QLineEdit, QMenu,
-    QApplication
+    QAbstractItemView,
+    QTreeWidgetItem,
+    QInputDialog,
+    QLineEdit,
+    QMenu,
+    QApplication,
 )
 
 from EricWidgets.EricTreeWidget import EricTreeWidget, EricTreeWidgetItemsState
@@ -23,63 +27,62 @@
     """
     Class implementing a tree widget for the AdBlock configuration dialog.
     """
+
     def __init__(self, subscription, parent=None):
         """
         Constructor
-        
+
         @param subscription reference to the subscription
         @type AdBlockSubscription
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__subscription = subscription
         self.__topItem = None
         self.__ruleToBeSelected = ""
         self.__itemChangingBlock = False
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.setDefaultItemShowMode(EricTreeWidgetItemsState.EXPANDED)
         self.setHeaderHidden(True)
         self.setAlternatingRowColors(True)
-        
+
         self.__darkMode = ericApp().usesDarkPalette()
-        
+
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
         self.itemChanged.connect(self.__itemChanged)
         self.__subscription.changed.connect(self.__subscriptionChanged)
         self.__subscription.rulesChanged.connect(self.__subscriptionChanged)
-    
+
     def subscription(self):
         """
         Public method to get a reference to the subscription.
-        
+
         @return reference to the subscription
         @rtype AdBlockSubscription
         """
         return self.__subscription
-    
+
     def showRule(self, rule):
         """
         Public method to highlight the given rule.
-        
+
         @param rule AdBlock rule to be shown
         @type AdBlockRule
         """
         if not bool(self.__topItem) and bool(rule):
             self.__ruleToBeSelected = rule.filter()
         elif self.__ruleToBeSelected:
-            items = self.findItems(
-                self.__ruleToBeSelected, Qt.MatchFlag.MatchRecursive)
+            items = self.findItems(self.__ruleToBeSelected, Qt.MatchFlag.MatchRecursive)
             if items:
                 item = items[0]
                 self.setCurrentItem(item)
-                self.scrollToItem(
-                    item, QAbstractItemView.ScrollHint.PositionAtCenter)
-            
+                self.scrollToItem(item, QAbstractItemView.ScrollHint.PositionAtCenter)
+
             self.__ruleToBeSelected = ""
-    
+
     def refresh(self):
         """
         Public method to refresh the tree.
@@ -87,17 +90,17 @@
         with EricOverrideCursor():
             self.__itemChangingBlock = True
             self.clear()
-            
+
             boldFont = QFont()
             boldFont.setBold(True)
-            
+
             self.__topItem = QTreeWidgetItem(self)
             self.__topItem.setText(0, self.__subscription.title())
             self.__topItem.setFont(0, boldFont)
             self.addTopLevelItem(self.__topItem)
-            
+
             allRules = self.__subscription.allRules()
-            
+
             for index, rule in enumerate(allRules):
                 item = QTreeWidgetItem(self.__topItem)
                 item.setText(0, rule.filter())
@@ -105,111 +108,109 @@
                 if self.__subscription.canEditRules():
                     item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable)
                 self.__adjustItemFeatures(item, rule)
-            
+
             self.expandAll()
             self.showRule(None)
             self.__itemChangingBlock = False
-    
+
     def addRule(self, filterRule=""):
         """
         Public slot to add a new rule.
-        
+
         @param filterRule filter to be added
         @type str
         """
         if not self.__subscription.canEditRules():
             return
-        
+
         if not filterRule:
             filterRule, ok = QInputDialog.getText(
                 self,
                 self.tr("Add Custom Rule"),
                 self.tr("Write your rule here:"),
-                QLineEdit.EchoMode.Normal)
+                QLineEdit.EchoMode.Normal,
+            )
             if not ok or filterRule == "":
                 return
-        
+
         from .AdBlockRule import AdBlockRule
+
         rule = AdBlockRule(filterRule, self.__subscription)
         self.__subscription.addRule(rule)
-    
+
     def removeRule(self):
         """
         Public slot to remove the current rule.
         """
         item = self.currentItem()
         if (
-            item is None or
-            not self.__subscription.canEditRules() or
-            item == self.__topItem
+            item is None
+            or not self.__subscription.canEditRules()
+            or item == self.__topItem
         ):
             return
-        
+
         offset = item.data(0, Qt.ItemDataRole.UserRole)
         self.__subscription.removeRule(offset)
         self.deleteItem(item)
-    
+
     def __contextMenuRequested(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos position for the menu
         @type QPoint
         """
         if not self.__subscription.canEditRules():
             return
-        
+
         item = self.itemAt(pos)
         if item is None:
             return
-        
+
         menu = QMenu()
         menu.addAction(self.tr("Add Rule"), self.addRule)
         menu.addSeparator()
         act = menu.addAction(self.tr("Remove Rule"), self.removeRule)
         if item.parent() is None:
             act.setDisabled(True)
-        
+
         menu.exec(self.viewport().mapToGlobal(pos))
-    
+
     def __itemChanged(self, itm):
         """
         Private slot to handle the change of an item.
-        
+
         @param itm changed item
         @type QTreeWidgetItem
         """
         if itm is None or self.__itemChangingBlock:
             return
-        
+
         self.__itemChangingBlock = True
-        
+
         offset = itm.data(0, Qt.ItemDataRole.UserRole)
         oldRule = self.__subscription.rule(offset)
-        
-        if (
-            itm.checkState(0) == Qt.CheckState.Unchecked and
-            oldRule.isEnabled()
-        ):
+
+        if itm.checkState(0) == Qt.CheckState.Unchecked and oldRule.isEnabled():
             # Disable rule
             rule = self.__subscription.setRuleEnabled(offset, False)
             self.__adjustItemFeatures(itm, rule)
-        elif (
-            itm.checkState(0) == Qt.CheckState.Checked and
-            not oldRule.isEnabled()
-        ):
+        elif itm.checkState(0) == Qt.CheckState.Checked and not oldRule.isEnabled():
             # Enable rule
             rule = self.__subscription.setRuleEnabled(offset, True)
             self.__adjustItemFeatures(itm, rule)
         elif self.__subscription.canEditRules():
             from .AdBlockRule import AdBlockRule
+
             # Custom rule has been changed
             rule = self.__subscription.replaceRule(
-                AdBlockRule(itm.text(0), self.__subscription), offset)
+                AdBlockRule(itm.text(0), self.__subscription), offset
+            )
             self.__adjustItemFeatures(itm, rule)
-        
+
         self.__itemChangingBlock = False
-    
+
     def __copyFilter(self):
         """
         Private slot to copy the current filter to the clipboard.
@@ -217,23 +218,23 @@
         item = self.currentItem()
         if item is not None:
             QApplication.clipboard().setText(item.text(0))
-    
+
     def __subscriptionChanged(self):
         """
         Private slot handling a subscription change.
         """
         self.refresh()
-        
+
         self.__itemChangingBlock = True
         self.__topItem.setText(
-            0, self.tr("{0} (recently updated)").format(
-                self.__subscription.title()))
+            0, self.tr("{0} (recently updated)").format(self.__subscription.title())
+        )
         self.__itemChangingBlock = False
-    
+
     def __adjustItemFeatures(self, itm, rule):
         """
         Private method to adjust an item.
-        
+
         @param itm item to be adjusted
         @type QTreeWidgetItem
         @param rule rule for the adjustment
@@ -246,17 +247,17 @@
                 itm.setForeground(0, QColor("#a3a3a3"))
             else:
                 itm.setForeground(0, QColor(Qt.GlobalColor.gray))
-            
+
             if not rule.isComment() and not rule.isHeader():
                 itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
                 itm.setCheckState(0, Qt.CheckState.Unchecked)
                 itm.setFont(0, font)
-            
+
             return
-        
+
         itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
         itm.setCheckState(0, Qt.CheckState.Checked)
-        
+
         if rule.isCSSRule():
             if self.__darkMode:
                 itm.setForeground(0, QColor("#7897d1"))
@@ -275,17 +276,17 @@
             else:
                 itm.setForeground(0, QColor("#000000"))
             itm.setFont(0, QFont())
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key presses.
-        
+
         @param evt key press event
         @type QKeyEvent
         """
         if (
-            evt.key() == Qt.Key.Key_C and
-            evt.modifiers() & Qt.KeyboardModifier.ControlModifier
+            evt.key() == Qt.Key.Key_C
+            and evt.modifiers() & Qt.KeyboardModifier.ControlModifier
         ):
             self.__copyFilter()
         elif evt.key() == Qt.Key.Key_Delete:
--- a/src/eric7/WebBrowser/AdBlock/AdBlockUrlInterceptor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AdBlock/AdBlockUrlInterceptor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,23 +14,24 @@
     """
     Class implementing an URL interceptor for AdBlock.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the AdBlock manager
         @type AdBlockManager
         @param parent referemce to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
-    
+
     def interceptRequest(self, info):
         """
         Public method to intercept a request.
-        
+
         @param info request info object
         @type QWebEngineUrlRequestInfo
         """
--- a/src/eric7/WebBrowser/AutoScroll/AutoScroller.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AutoScroll/AutoScroller.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,41 +25,41 @@
     """
     Class implementing the automatic scroller.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__view = None
-        
+
         self.__indicator = QLabel()
         self.__indicator.resize(32, 32)
         self.__indicator.setContentsMargins(0, 0, 0, 0)
         self.__indicator.installEventFilter(self)
-        
+
         self.__scroller = FrameScroller(self)
-        self.__scroller.setScrollDivider(
-            Preferences.getWebBrowser("AutoScrollDivider"))
-        
+        self.__scroller.setScrollDivider(Preferences.getWebBrowser("AutoScrollDivider"))
+
         self.__enabled = Preferences.getWebBrowser("AutoScrollEnabled")
-    
+
     def isEnabled(self):
         """
         Public method to get the enabled state.
-        
+
         @return enabled state
         @rtype bool
         """
         return self.__enabled
-    
+
     def mouseMove(self, evt):
         """
         Public method to handle mouse move events.
-        
+
         @param evt reference to the mouse move event
         @type QMouseEvent
         @return flag indicating, that the event was handled
@@ -70,25 +70,25 @@
             xlen = 0
             ylen = 0
             egp = evt.globalPosition().toPoint()
-            
+
             if rect.left() > egp.x():
                 xlen = egp.x() - rect.left()
             elif rect.right() < egp.x():
                 xlen = egp.x() - rect.right()
-            
+
             if rect.top() > egp.y():
                 ylen = egp.y() - rect.top()
             elif rect.bottom() < egp.y():
                 ylen = egp.y() - rect.bottom()
-            
+
             self.__scroller.startScrolling(xlen, ylen)
-        
+
         return False
-    
+
     def mousePress(self, view, evt):
         """
         Public method to handle mouse button presses.
-        
+
         @param view reference to the web view the button was pressed on
         @type WebBrowserView
         @param evt reference to the mouse button press event
@@ -98,26 +98,25 @@
         """
         if self.__enabled:
             middleButton = evt.buttons() == Qt.MouseButton.MiddleButton
-            
+
             if view:
                 # test for start
-                if (
-                    middleButton and
-                    (self.__view != view or not self.__indicator.isVisible())
+                if middleButton and (
+                    self.__view != view or not self.__indicator.isVisible()
                 ):
                     return self.__showIndicator(view, evt.position().toPoint())
-                
+
                 # test for stop
                 if self.__indicator.isVisible():
                     self.__stopScrolling()
                     return True
-        
+
         return False
-    
+
     def mouseRelease(self, evt):
         """
         Public method to handle mouse button releases.
-        
+
         @param evt reference to the mouse button release event
         @type QMouseEvent
         @return flag indicating, that the event was handled
@@ -125,25 +124,26 @@
         """
         if self.__enabled and self.__indicator.isVisible():
             if not self.__indicatorGlobalRect().contains(
-                    evt.globalPosition().toPoint()):
+                evt.globalPosition().toPoint()
+            ):
                 self.__stopScrolling()
             return True
-        
+
         return False
-    
+
     def wheel(self):
         """
         Public method to handle a mouse wheel event.
-        
+
         @return flag indicating, that the event was handled
         @rtype bool
         """
         if self.__enabled and self.__indicator.isVisible():
             self.__stopScrolling()
             return True
-        
+
         return False
-    
+
     def preferencesChanged(self):
         """
         Public method to handle a change of the settings.
@@ -153,14 +153,13 @@
             if self.__indicator.isVisible():
                 self.__stopScrolling()
             self.__enabled = enabled
-        
-        self.__scroller.setScrollDivider(
-            Preferences.getWebBrowser("AutoScrollDivider"))
-    
+
+        self.__scroller.setScrollDivider(Preferences.getWebBrowser("AutoScrollDivider"))
+
     def eventFilter(self, obj, evt):
         """
         Public method to handle event for an object.
-        
+
         @param obj refernce to the object sending the event
         @type QObject
         @param evt reference to the event to be handled
@@ -171,16 +170,19 @@
         if obj == self.__indicator:
             if evt.type() == QEvent.Type.Enter:
                 self.__scroller.stopScrolling()
-            elif evt.type() in [QEvent.Type.Wheel, QEvent.Type.Hide,
-                                QEvent.Type.MouseButtonPress]:
+            elif evt.type() in [
+                QEvent.Type.Wheel,
+                QEvent.Type.Hide,
+                QEvent.Type.MouseButtonPress,
+            ]:
                 self.__stopScrolling()
-        
+
         return False
-    
+
     def __showIndicator(self, view, pos):
         """
         Private method to show the auto scroll indicator.
-        
+
         @param view reference to the view to show the indicator on
         @type WebBrowserView
         @param pos position to show the indicator at
@@ -189,10 +191,10 @@
         @rtype bool
         """
         hit = view.page().hitTestContent(pos)
-        
+
         if hit.isContentEditable() or not hit.linkUrl().isEmpty():
             return False
-        
+
         jsSource = """
             var out = {
              vertical:
@@ -201,62 +203,61 @@
                 window.innerHeight > document.documentElement.clientHeight
             };
             out;"""
-        
+
         res = view.page().execJavaScript(jsSource)
         if res is None:
             return False
-        
+
         vertical = res["vertical"]
         horizontal = res["horizontal"]
         if not vertical and not horizontal:
             return False
-        
+
         if vertical and horizontal:
-            self.__indicator.setPixmap(
-                UI.PixmapCache.getPixmap("scrollAll"))
+            self.__indicator.setPixmap(UI.PixmapCache.getPixmap("scrollAll"))
         elif vertical:
-            self.__indicator.setPixmap(
-                UI.PixmapCache.getPixmap("scrollVertical"))
+            self.__indicator.setPixmap(UI.PixmapCache.getPixmap("scrollVertical"))
         else:
-            self.__indicator.setPixmap(
-                UI.PixmapCache.getPixmap("scrollHorizontal"))
-        
+            self.__indicator.setPixmap(UI.PixmapCache.getPixmap("scrollHorizontal"))
+
         self.__view = view
         p = QPoint(
             pos.x() - self.__indicator.pixmap().width() // 2,
-            pos.y() - self.__indicator.pixmap().height() // 2
+            pos.y() - self.__indicator.pixmap().height() // 2,
         )
-        
+
         self.__indicator.setParent(self.__view)
         self.__indicator.move(p)
         self.__indicator.show()
-        
+
         self.__scroller.setPage(view.page())
-        
+
         self.__view.inputWidget().grabMouse()
         QApplication.setOverrideCursor(Qt.CursorShape.ArrowCursor)
-        
+
         return True
-    
+
     def __stopScrolling(self):
         """
         Private method to stop scrolling.
         """
         self.__view.inputWidget().releaseMouse()
         QApplication.restoreOverrideCursor()
-        
+
         self.__indicator.hide()
         self.__indicator.setParent(None)
         self.__scroller.stopScrolling()
-    
+
     def __indicatorGlobalRect(self):
         """
         Private method to calculate the global indicator parameters.
-        
+
         @return global indicator parameters
         @rtype QRect
         """
         pos = self.__indicator.parentWidget().mapToGlobal(
-            self.__indicator.geometry().topLeft())
-        return QRect(pos.x(), pos.y(),
-                     self.__indicator.width(), self.__indicator.height())
+            self.__indicator.geometry().topLeft()
+        )
+        return QRect(
+            pos.x(), pos.y(), self.__indicator.width(), self.__indicator.height()
+        )
--- a/src/eric7/WebBrowser/AutoScroll/FrameScroller.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/AutoScroll/FrameScroller.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,56 +21,57 @@
     """
     Class implementing a web page scroller object.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__page = None
-        
+
         self.__lengthX = 0
         self.__lengthY = 0
         self.__divider = 8.0
-        
+
         self.__timer = QTimer(self)
         self.__timer.setInterval(10)
         self.__timer.timeout.connect(self.__scrollStep)
-    
+
     def setPage(self, page):
         """
         Public method to set the web page to be scrolled.
-        
+
         @param page page to be scrolled
         @type WebBrowserPage
         """
         self.__page = page
-    
+
     def scrollDivider(self):
         """
         Public method to get the current scroll divider value.
-        
+
         @return scroll divider
         @rtype float
         """
         return self.__divider
-    
+
     def setScrollDivider(self, divider):
         """
         Public method to set the scroll divider value.
-        
+
         @param divider scroll divider
         @type float
         """
         self.__divider = divider
-    
+
     def startScrolling(self, lengthX, lengthY):
         """
         Public method to start scrolling.
-        
+
         @param lengthX X distance from scroll indicator
         @type int
         @param lengthY Y distance from scroll indicator
@@ -78,18 +79,18 @@
         """
         self.__lengthX = lengthX
         self.__lengthY = lengthY
-        
+
         if not self.__lengthX and not self.__lengthY:
             self.__timer.stop()
         elif not self.__timer.isActive():
             self.__timer.start()
-    
+
     def stopScrolling(self):
         """
         Public method to stop scrolling.
         """
         self.__timer.stop()
-    
+
     @pyqtSlot()
     def __scrollStep(self):
         """
@@ -97,5 +98,5 @@
         """
         self.__page.scroll(
             math.ceil(self.__lengthX / self.__divider),
-            math.ceil(self.__lengthY / self.__divider)
+            math.ceil(self.__lengthY / self.__divider),
         )
--- a/src/eric7/WebBrowser/Bookmarks/AddBookmarkDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/AddBookmarkDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,48 +17,49 @@
     """
     Class implementing a proxy model used by the AddBookmarkDialog dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-    
+
     def columnCount(self, parent):
         """
         Public method to return the number of columns.
-        
+
         @param parent index of the parent (QModelIndex)
         @return number of columns (integer)
         """
         return min(1, QSortFilterProxyModel.columnCount(self, parent))
-    
+
     def filterAcceptsRow(self, sourceRow, sourceParent):
         """
         Public method to determine, if the row is acceptable.
-        
+
         @param sourceRow row number in the source model (integer)
         @param sourceParent index of the source item (QModelIndex)
         @return flag indicating acceptance (boolean)
         """
         idx = self.sourceModel().index(sourceRow, 0, sourceParent)
         return self.sourceModel().hasChildren(idx)
-    
+
     def filterAcceptsColumn(self, sourceColumn, sourceParent):
         """
         Public method to determine, if the column is acceptable.
-        
+
         @param sourceColumn column number in the source model (integer)
         @param sourceParent index of the source item (QModelIndex)
         @return flag indicating acceptance (boolean)
         """
         return sourceColumn == 0
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check, if a parent node has some children.
-        
+
         @param parent index of the parent node (QModelIndex)
         @return flag indicating the presence of children (boolean)
         """
@@ -72,31 +73,33 @@
     """
     Class implementing a dialog to add a bookmark or a bookmark folder.
     """
+
     def __init__(self, parent=None, bookmarksManager=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         @param bookmarksManager reference to the bookmarks manager
             object (BookmarksManager)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__bookmarksManager = bookmarksManager
         self.__addedNode = None
         self.__addFolder = False
-        
+
         if self.__bookmarksManager is None:
             import WebBrowser.WebBrowserWindow
+
             self.__bookmarksManager = (
                 WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
             )
-        
+
         self.__proxyModel = AddBookmarkProxyModel(self)
         model = self.__bookmarksManager.bookmarksModel()
         self.__proxyModel.setSourceModel(model)
-        
+
         self.__treeView = QTreeView(self)
         self.__treeView.setModel(self.__proxyModel)
         self.__treeView.expandAll()
@@ -106,89 +109,89 @@
         self.__treeView.setRootIsDecorated(False)
         self.__treeView.setIndentation(10)
         self.__treeView.show()
-        
+
         self.locationCombo.setModel(self.__proxyModel)
         self.locationCombo.setView(self.__treeView)
-        
+
         self.resize(self.sizeHint())
-    
+
     def setUrl(self, url):
         """
         Public slot to set the URL of the new bookmark.
-        
+
         @param url URL of the bookmark (string)
         """
         self.addressEdit.setText(url)
         self.resize(self.sizeHint())
-    
+
     def url(self):
         """
         Public method to get the URL of the bookmark.
-        
+
         @return URL of the bookmark (string)
         """
         return self.addressEdit.text()
-    
+
     def setTitle(self, title):
         """
         Public method to set the title of the new bookmark.
-        
+
         @param title title of the bookmark (string)
         """
         self.nameEdit.setText(title)
-    
+
     def title(self):
         """
         Public method to get the title of the bookmark.
-        
+
         @return title of the bookmark (string)
         """
         return self.nameEdit.text()
-    
+
     def setDescription(self, description):
         """
         Public method to set the description of the new bookmark.
-        
+
         @param description description of the bookamrk (string)
         """
         self.descriptionEdit.setPlainText(description)
-    
+
     def description(self):
         """
         Public method to get the description of the bookmark.
-        
+
         @return description of the bookamrk (string)
         """
         return self.descriptionEdit.toPlainText()
-    
+
     def setCurrentIndex(self, idx):
         """
         Public method to set the current index.
-        
+
         @param idx current index to be set (QModelIndex)
         """
         proxyIndex = self.__proxyModel.mapFromSource(idx)
         self.__treeView.setCurrentIndex(proxyIndex)
         self.locationCombo.setCurrentIndex(proxyIndex.row())
-    
+
     def currentIndex(self):
         """
         Public method to get the current index.
-        
+
         @return current index (QModelIndex)
         """
         idx = self.locationCombo.view().currentIndex()
         idx = self.__proxyModel.mapToSource(idx)
         return idx
-    
+
     def setFolder(self, folder):
         """
         Public method to set the dialog to "Add Folder" mode.
-        
+
         @param folder flag indicating "Add Folder" mode (boolean)
         """
         self.__addFolder = folder
-        
+
         if folder:
             self.setWindowTitle(self.tr("Add Folder"))
             self.addressEdit.setVisible(False)
@@ -197,52 +200,50 @@
             self.setWindowTitle(self.tr("Add Bookmark"))
             self.addressEdit.setVisible(True)
             self.addressLabel.setVisible(True)
-        
+
         self.resize(self.sizeHint())
-    
+
     def isFolder(self):
         """
         Public method to test, if the dialog is in "Add Folder" mode.
-        
+
         @return flag indicating "Add Folder" mode (boolean)
         """
         return self.__addFolder
-    
+
     def addedNode(self):
         """
         Public method to get a reference to the added bookmark node.
-        
+
         @return reference to the added bookmark node (BookmarkNode)
         """
         return self.__addedNode
-    
+
     def accept(self):
         """
         Public slot handling the acceptance of the dialog.
         """
         if (
-            (not self.__addFolder and not self.addressEdit.text()) or
-            not self.nameEdit.text()
-        ):
+            not self.__addFolder and not self.addressEdit.text()
+        ) or not self.nameEdit.text():
             super().accept()
             return
-        
+
         from .BookmarkNode import BookmarkNode
-        
+
         idx = self.currentIndex()
         if not idx.isValid():
             idx = self.__bookmarksManager.bookmarksModel().index(0, 0)
         parent = self.__bookmarksManager.bookmarksModel().node(idx)
-        
-        type_ = (BookmarkNode.Folder if self.__addFolder
-                 else BookmarkNode.Bookmark)
+
+        type_ = BookmarkNode.Folder if self.__addFolder else BookmarkNode.Bookmark
         bookmark = BookmarkNode(type_)
         bookmark.title = self.nameEdit.text()
         if not self.__addFolder:
             bookmark.url = self.addressEdit.text()
         bookmark.desc = self.descriptionEdit.toPlainText()
-        
+
         self.__bookmarksManager.addBookmark(parent, bookmark)
         self.__addedNode = bookmark
-        
+
         super().accept()
--- a/src/eric7/WebBrowser/Bookmarks/BookmarkNode.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarkNode.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,21 +14,22 @@
     """
     Class implementing the bookmark node type.
     """
+
     # possible bookmark node types
     Root = 0
     Folder = 1
     Bookmark = 2
     Separator = 3
-    
+
     # possible timestamp types
     TsAdded = 0
     TsModified = 1
     TsVisited = 2
-    
+
     def __init__(self, type_=Root, parent=None):
         """
         Constructor
-        
+
         @param type_ type of the bookmark node (BookmarkNode.Type)
         @param parent reference to the parent node (BookmarkNode)
         """
@@ -40,69 +41,69 @@
         self.modified = QDateTime()
         self.visited = QDateTime()
         self.visitCount = 0
-        
+
         self._children = []
         self._parent = parent
         self._type = type_
-        
+
         if parent is not None:
             parent.add(self)
-    
+
     def type(self):
         """
         Public method to get the bookmark's type.
-        
+
         @return bookmark type (BookmarkNode.Type)
         """
         return self._type
-    
+
     def setType(self, type_):
         """
         Public method to set the bookmark's type.
-        
+
         @param type_ type of the bookmark node (BookmarkNode.Type)
         """
         self._type = type_
-    
+
     def children(self):
         """
         Public method to get the list of child nodes.
-        
+
         @return list of all child nodes (list of BookmarkNode)
         """
         return self._children[:]
-    
+
     def parent(self):
         """
         Public method to get a reference to the parent node.
-        
+
         @return reference to the parent node (BookmarkNode)
         """
         return self._parent
-    
+
     def add(self, child, offset=-1):
         """
         Public method to add/insert a child node.
-        
+
         @param child reference to the node to add (BookmarkNode)
         @param offset position where to insert child (integer, -1 = append)
         """
         if child._type == BookmarkNode.Root:
             return
-        
+
         if child._parent is not None:
             child._parent.remove(child)
-        
+
         child._parent = self
         if offset == -1:
             self._children.append(child)
         else:
             self._children.insert(offset, child)
-    
+
     def remove(self, child):
         """
         Public method to remove a child node.
-        
+
         @param child reference to the child node (BookmarkNode)
         """
         child._parent = None
--- a/src/eric7/WebBrowser/Bookmarks/BookmarkPropertiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarkPropertiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,46 +16,48 @@
     """
     Class implementing a dialog to show and edit bookmark properties.
     """
+
     def __init__(self, node, parent=None):
         """
         Constructor
-        
+
         @param node reference to the bookmark (BookmarkNode)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         from .BookmarkNode import BookmarkNode
+
         self.__node = node
         if self.__node.type() == BookmarkNode.Folder:
             self.addressLabel.hide()
             self.addressEdit.hide()
             self.visitedLabel.hide()
-        
+
         self.nameEdit.setText(self.__node.title)
         self.descriptionEdit.setPlainText(self.__node.desc)
         self.addressEdit.setText(self.__node.url)
-        self.visitedLabel.setText(self.tr(
-            "Visited <b>{0}</b> times. Last visit on <b>{1}</b>.").format(
-            self.__node.visitCount,
-            self.__node.visited.toString("yyyy-MM-dd hh:mm")))
-    
+        self.visitedLabel.setText(
+            self.tr("Visited <b>{0}</b> times. Last visit on <b>{1}</b>.").format(
+                self.__node.visitCount, self.__node.visited.toString("yyyy-MM-dd hh:mm")
+            )
+        )
+
     def accept(self):
         """
         Public slot handling the acceptance of the dialog.
         """
         from .BookmarkNode import BookmarkNode
-        
+
         if (
-            (self.__node.type() == BookmarkNode.Bookmark and
-             not self.addressEdit.text()) or
-            not self.nameEdit.text()
-        ):
+            self.__node.type() == BookmarkNode.Bookmark and not self.addressEdit.text()
+        ) or not self.nameEdit.text():
             super().accept()
             return
-        
+
         import WebBrowser.WebBrowserWindow
+
         bookmarksManager = (
             WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
         )
@@ -70,5 +72,5 @@
         if description != self.__node.desc:
             self.__node.desc = description
             bookmarksManager.setNodeChanged(self.__node)
-        
+
         super().accept()
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,9 +9,7 @@
 
 from PyQt6.QtCore import pyqtSignal, Qt, QUrl, QModelIndex
 from PyQt6.QtGui import QFontMetrics, QCursor
-from PyQt6.QtWidgets import (
-    QDialog, QMenu, QApplication, QInputDialog, QLineEdit
-)
+from PyQt6.QtWidgets import QDialog, QMenu, QApplication, QInputDialog, QLineEdit
 
 from EricCore.EricTreeSortFilterProxyModel import EricTreeSortFilterProxyModel
 
@@ -21,22 +19,23 @@
 class BookmarksDialog(QDialog, Ui_BookmarksDialog):
     """
     Class implementing a dialog to manage bookmarks.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new
         background tab
     @signal newWindow(QUrl, str) emitted to open a URL in a new window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newBackgroundTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, parent=None, manager=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget
         @param manager reference to the bookmarks manager object
             (BookmarksManager)
@@ -44,22 +43,22 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__bookmarksManager = manager
         if self.__bookmarksManager is None:
             import WebBrowser.WebBrowserWindow
+
             self.__bookmarksManager = (
                 WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
             )
-        
+
         self.__bookmarksModel = self.__bookmarksManager.bookmarksModel()
         self.__proxyModel = EricTreeSortFilterProxyModel(self)
         self.__proxyModel.setFilterKeyColumn(-1)
         self.__proxyModel.setSourceModel(self.__bookmarksModel)
-        
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
-        
+
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
+
         self.bookmarksTree.setModel(self.__proxyModel)
         self.bookmarksTree.setExpanded(self.__proxyModel.index(0, 0), True)
         fm = QFontMetrics(self.font())
@@ -69,45 +68,44 @@
             header = fm.width("m") * 40
         self.bookmarksTree.header().resizeSection(0, header)
         self.bookmarksTree.header().setStretchLastSection(True)
-        self.bookmarksTree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        
+        self.bookmarksTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+
         self.bookmarksTree.activated.connect(self.__activated)
         self.bookmarksTree.customContextMenuRequested.connect(
-            self.__customContextMenuRequested)
-        
-        self.removeButton.clicked.connect(
-            self.bookmarksTree.removeSelected)
+            self.__customContextMenuRequested
+        )
+
+        self.removeButton.clicked.connect(self.bookmarksTree.removeSelected)
         self.addFolderButton.clicked.connect(self.__newFolder)
-        
+
         self.__expandNodes(self.__bookmarksManager.bookmarks())
-    
+
     def closeEvent(self, evt):
         """
         Protected method to handle the closing of the dialog.
-        
+
         @param evt reference to the event object (QCloseEvent) (ignored)
         """
         self.__shutdown()
-    
+
     def reject(self):
         """
         Public method called when the dialog is rejected.
         """
         self.__shutdown()
         super().reject()
-    
+
     def __shutdown(self):
         """
         Private method to perform shutdown actions for the dialog.
         """
         if self.__saveExpandedNodes(self.bookmarksTree.rootIndex()):
             self.__bookmarksManager.changeExpanded()
-    
+
     def __saveExpandedNodes(self, parent):
         """
         Private method to save the child nodes of an expanded node.
-        
+
         @param parent index of the parent node (QModelIndex)
         @return flag indicating a change (boolean)
         """
@@ -122,14 +120,14 @@
                 changed |= self.__saveExpandedNodes(child)
             else:
                 childNode.expanded = False
-            changed |= (wasExpanded != childNode.expanded)
-        
+            changed |= wasExpanded != childNode.expanded
+
         return changed
-    
+
     def __expandNodes(self, node):
         """
         Private method to expand all child nodes of a node.
-        
+
         @param node reference to the bookmark node to expand (BookmarkNode)
         """
         for childNode in node.children():
@@ -138,107 +136,105 @@
                 idx = self.__proxyModel.mapFromSource(idx)
                 self.bookmarksTree.setExpanded(idx, True)
                 self.__expandNodes(childNode)
-    
+
     def __customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request for the bookmarks tree.
-        
+
         @param pos position the context menu was requested (QPoint)
         """
         from .BookmarkNode import BookmarkNode
-        
+
         menu = QMenu()
         idx = self.bookmarksTree.indexAt(pos)
         idx = idx.sibling(idx.row(), 0)
         sourceIndex = self.__proxyModel.mapToSource(idx)
         node = self.__bookmarksModel.node(sourceIndex)
         if idx.isValid() and node.type() != BookmarkNode.Folder:
-            menu.addAction(
-                self.tr("&Open"), self.__openBookmarkInCurrentTab)
-            menu.addAction(
-                self.tr("Open in New &Tab"), self.__openBookmarkInNewTab)
+            menu.addAction(self.tr("&Open"), self.__openBookmarkInCurrentTab)
+            menu.addAction(self.tr("Open in New &Tab"), self.__openBookmarkInNewTab)
             menu.addAction(
                 self.tr("Open in New &Background Tab"),
-                self.__openBookmarkInNewBackgroundTab)
+                self.__openBookmarkInNewBackgroundTab,
+            )
             menu.addAction(
-                self.tr("Open in New &Window"), self.__openBookmarkInNewWindow)
+                self.tr("Open in New &Window"), self.__openBookmarkInNewWindow
+            )
             menu.addAction(
                 self.tr("Open in New Pri&vate Window"),
-                self.__openBookmarkInPrivateWindow)
+                self.__openBookmarkInPrivateWindow,
+            )
             menu.addSeparator()
         act = menu.addAction(self.tr("Edit &Name"), self.__editName)
-        act.setEnabled(idx.flags() & Qt.ItemFlag.ItemIsEditable ==
-                       Qt.ItemFlag.ItemIsEditable)
+        act.setEnabled(
+            idx.flags() & Qt.ItemFlag.ItemIsEditable == Qt.ItemFlag.ItemIsEditable
+        )
         if idx.isValid() and node.type() != BookmarkNode.Folder:
             menu.addAction(self.tr("Edit &Address"), self.__editAddress)
         menu.addSeparator()
-        act = menu.addAction(
-            self.tr("&Delete"), self.bookmarksTree.removeSelected)
-        act.setEnabled(idx.flags() & Qt.ItemFlag.ItemIsDragEnabled ==
-                       Qt.ItemFlag.ItemIsDragEnabled)
+        act = menu.addAction(self.tr("&Delete"), self.bookmarksTree.removeSelected)
+        act.setEnabled(
+            idx.flags() & Qt.ItemFlag.ItemIsDragEnabled == Qt.ItemFlag.ItemIsDragEnabled
+        )
         menu.addSeparator()
         act = menu.addAction(self.tr("&Properties..."), self.__edit)
-        act.setEnabled(idx.flags() & Qt.ItemFlag.ItemIsEditable ==
-                       Qt.ItemFlag.ItemIsEditable)
+        act.setEnabled(
+            idx.flags() & Qt.ItemFlag.ItemIsEditable == Qt.ItemFlag.ItemIsEditable
+        )
         if idx.isValid() and node.type() == BookmarkNode.Folder:
             menu.addSeparator()
             menu.addAction(self.tr("New &Folder..."), self.__newFolder)
         menu.exec(QCursor.pos())
-    
+
     def __activated(self, idx):
         """
         Private slot to handle the activation of an entry.
-        
+
         @param idx reference to the entry index (QModelIndex)
         """
-        if (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ControlModifier
-        ):
+        if QApplication.keyboardModifiers() & Qt.KeyboardModifier.ControlModifier:
             self.__openBookmarkInNewTab()
-        elif (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ShiftModifier
-        ):
+        elif QApplication.keyboardModifiers() & Qt.KeyboardModifier.ShiftModifier:
             self.__openBookmarkInNewWindow()
         else:
             self.__openBookmarkInCurrentTab()
-        
+
     def __openBookmarkInCurrentTab(self):
         """
         Private slot to open a bookmark in the current browser tab.
         """
         self.__openBookmark()
-    
+
     def __openBookmarkInNewTab(self):
         """
         Private slot to open a bookmark in a new browser tab.
         """
         self.__openBookmark(newTab=True)
-    
+
     def __openBookmarkInNewBackgroundTab(self):
         """
         Private slot to open a bookmark in a new browser tab.
         """
         self.__openBookmark(newTab=True, background=True)
-    
+
     def __openBookmarkInNewWindow(self):
         """
         Private slot to open a bookmark in a new browser window.
         """
         self.__openBookmark(newWindow=True)
-    
+
     def __openBookmarkInPrivateWindow(self):
         """
         Private slot to open a bookmark in a new private browser window.
         """
         self.__openBookmark(newWindow=True, privateWindow=True)
-    
-    def __openBookmark(self, newTab=False, newWindow=False,
-                       privateWindow=False, background=False):
+
+    def __openBookmark(
+        self, newTab=False, newWindow=False, privateWindow=False, background=False
+    ):
         """
         Private method to open a bookmark.
-        
+
         @param newTab flag indicating to open the bookmark in a new tab
         @type bool
         @param newWindow flag indicating to open the bookmark in a new window
@@ -252,19 +248,20 @@
         """
         from .BookmarkNode import BookmarkNode
         from .BookmarksModel import BookmarksModel
-        
+
         idx = self.bookmarksTree.currentIndex()
         sourceIndex = self.__proxyModel.mapToSource(idx)
         node = self.__bookmarksModel.node(sourceIndex)
         if (
-            not idx.parent().isValid() or
-            node is None or
-            node.type() == BookmarkNode.Folder
+            not idx.parent().isValid()
+            or node is None
+            or node.type() == BookmarkNode.Folder
         ):
             return
-        
+
         if newWindow:
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             url = idx.sibling(idx.row(), 1).data(BookmarksModel.UrlRole)
             if privateWindow:
                 WebBrowserWindow.mainWindow().newPrivateWindow(url)
@@ -274,24 +271,21 @@
             if newTab:
                 if background:
                     self.newBackgroundTab.emit(
-                        idx.sibling(idx.row(), 1).data(
-                            BookmarksModel.UrlRole),
-                        idx.sibling(idx.row(), 0).data(
-                            Qt.ItemDataRole.DisplayRole))
+                        idx.sibling(idx.row(), 1).data(BookmarksModel.UrlRole),
+                        idx.sibling(idx.row(), 0).data(Qt.ItemDataRole.DisplayRole),
+                    )
                 else:
                     self.newTab.emit(
-                        idx.sibling(idx.row(), 1).data(
-                            BookmarksModel.UrlRole),
-                        idx.sibling(idx.row(), 0).data(
-                            Qt.ItemDataRole.DisplayRole))
+                        idx.sibling(idx.row(), 1).data(BookmarksModel.UrlRole),
+                        idx.sibling(idx.row(), 0).data(Qt.ItemDataRole.DisplayRole),
+                    )
             else:
                 self.openUrl.emit(
-                    idx.sibling(idx.row(), 1).data(
-                        BookmarksModel.UrlRole),
-                    idx.sibling(idx.row(), 0).data(
-                        Qt.ItemDataRole.DisplayRole))
+                    idx.sibling(idx.row(), 1).data(BookmarksModel.UrlRole),
+                    idx.sibling(idx.row(), 0).data(Qt.ItemDataRole.DisplayRole),
+                )
         self.__bookmarksManager.incVisitCount(node)
-    
+
     def __editName(self):
         """
         Private slot to edit the name part of a bookmark.
@@ -299,7 +293,7 @@
         idx = self.bookmarksTree.currentIndex()
         idx = idx.sibling(idx.row(), 0)
         self.bookmarksTree.edit(idx)
-    
+
     def __editAddress(self):
         """
         Private slot to edit the address part of a bookmark.
@@ -307,52 +301,50 @@
         idx = self.bookmarksTree.currentIndex()
         idx = idx.sibling(idx.row(), 1)
         self.bookmarksTree.edit(idx)
-    
+
     def __edit(self):
         """
         Private slot to edit a bookmarks properties.
         """
         from .BookmarkPropertiesDialog import BookmarkPropertiesDialog
-        
+
         idx = self.bookmarksTree.currentIndex()
         sourceIndex = self.__proxyModel.mapToSource(idx)
         node = self.__bookmarksModel.node(sourceIndex)
         dlg = BookmarkPropertiesDialog(node)
         dlg.exec()
-    
+
     def __newFolder(self):
         """
         Private slot to add a new bookmarks folder.
         """
         from .BookmarkNode import BookmarkNode
-        
+
         currentIndex = self.bookmarksTree.currentIndex()
         idx = QModelIndex(currentIndex)
         sourceIndex = self.__proxyModel.mapToSource(idx)
         sourceNode = self.__bookmarksModel.node(sourceIndex)
-        row = -1    # append new folder as the last item per default
-        
-        if (
-            sourceNode is not None and
-            sourceNode.type() != BookmarkNode.Folder
-        ):
+        row = -1  # append new folder as the last item per default
+
+        if sourceNode is not None and sourceNode.type() != BookmarkNode.Folder:
             # If the selected item is not a folder, add a new folder to the
             # parent folder, but directly below the selected item.
             idx = idx.parent()
             row = currentIndex.row() + 1
-        
+
         if not idx.isValid():
             # Select bookmarks menu as default.
             idx = self.__proxyModel.index(1, 0)
-        
+
         idx = self.__proxyModel.mapToSource(idx)
         parent = self.__bookmarksModel.node(idx)
         title, ok = QInputDialog.getText(
             self,
             self.tr("New Bookmark Folder"),
             self.tr("Enter title for new bookmark folder:"),
-            QLineEdit.EchoMode.Normal)
-        
+            QLineEdit.EchoMode.Normal,
+        )
+
         if ok:
             if not title:
                 title = self.tr("New Folder")
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,59 +26,59 @@
     """
     Class implementing a dialog for importing bookmarks from other sources.
     """
+
     SourcesListIdRole = Qt.ItemDataRole.UserRole
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
-        
+
         self.sourcesList.setIconSize(QSize(48, 48))
         for icon, displayText, idText in BookmarksImporters.getImporters():
             itm = QListWidgetItem(icon, displayText, self.sourcesList)
             itm.setData(self.SourcesListIdRole, idText)
-        
+
         self.__currentPage = 0
         self.__selectedSource = ""
         self.__topLevelBookmarkNode = None
         self.__sourceFile = ""
         self.__sourceDir = ""
-        
+
         self.pagesWidget.setCurrentIndex(self.__currentPage)
         self.__enableNextButton()
-    
+
     def __enableNextButton(self):
         """
         Private slot to set the enabled state of the next button.
         """
         if self.__currentPage == 0:
-            self.nextButton.setEnabled(
-                len(self.sourcesList.selectedItems()) == 1)
+            self.nextButton.setEnabled(len(self.sourcesList.selectedItems()) == 1)
         elif self.__currentPage == 1:
             self.nextButton.setEnabled(self.filePicker.text() != "")
-    
+
     @pyqtSlot()
     def on_sourcesList_itemSelectionChanged(self):
         """
         Private slot to handle changes of the selection of the import source.
         """
         self.__enableNextButton()
-    
+
     @pyqtSlot(str)
     def on_filePicker_textChanged(self, txt):
         """
         Private slot handling changes of the file to import bookmarks form.
-        
+
         @param txt text of the line edit (string)
         """
         self.__enableNextButton()
-    
+
     @pyqtSlot()
     def on_nextButton_clicked(self):
         """
@@ -86,68 +86,72 @@
         """
         if self.sourcesList.currentItem() is None:
             return
-        
+
         if self.__currentPage == 0:
             self.__selectedSource = self.sourcesList.currentItem().data(
-                self.SourcesListIdRole)
-            (pixmap, sourceName, self.__sourceFile, info, prompt,
-             self.__sourceDir) = BookmarksImporters.getImporterInfo(
-                self.__selectedSource)
-            
+                self.SourcesListIdRole
+            )
+            (
+                pixmap,
+                sourceName,
+                self.__sourceFile,
+                info,
+                prompt,
+                self.__sourceDir,
+            ) = BookmarksImporters.getImporterInfo(self.__selectedSource)
+
             self.iconLabel.setPixmap(pixmap)
             self.importingFromLabel.setText(
-                self.tr("<b>Importing from {0}</b>").format(sourceName))
+                self.tr("<b>Importing from {0}</b>").format(sourceName)
+            )
             self.fileLabel1.setText(info)
             self.fileLabel2.setText(prompt)
-            self.standardDirLabel.setText(
-                "<i>{0}</i>".format(self.__sourceDir))
-            
+            self.standardDirLabel.setText("<i>{0}</i>".format(self.__sourceDir))
+
             self.nextButton.setText(self.tr("Finish"))
-            
+
             self.__currentPage += 1
             self.pagesWidget.setCurrentIndex(self.__currentPage)
             self.__enableNextButton()
-            
+
             if self.__selectedSource == "ie":
                 self.filePicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
             else:
                 self.filePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
                 if Globals.isMacPlatform():
-                    fileFilter = "*{0}".format(
-                        os.path.splitext(self.__sourceFile)[1])
+                    fileFilter = "*{0}".format(os.path.splitext(self.__sourceFile)[1])
                 else:
                     fileFilter = self.__sourceFile
                 self.filePicker.setFilters(fileFilter)
             self.filePicker.setDefaultDirectory(self.__sourceDir)
-        
+
         elif self.__currentPage == 1:
             if self.filePicker.text() == "":
                 return
-            
+
             importer = BookmarksImporters.getImporter(self.__selectedSource)
             importer.setPath(self.filePicker.text())
             if importer.open():
                 self.__topLevelBookmarkNode = importer.importedBookmarks()
             if importer.error():
                 EricMessageBox.critical(
-                    self,
-                    self.tr("Error importing bookmarks"),
-                    importer.errorString())
+                    self, self.tr("Error importing bookmarks"), importer.errorString()
+                )
                 return
-            
+
             self.accept()
-    
+
     @pyqtSlot()
     def on_cancelButton_clicked(self):
         """
         Private slot documentation goes here.
         """
         self.reject()
-    
+
     def getImportedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return top level bookmark (BookmarkNode)
         """
         return self.__topLevelBookmarkNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/BookmarksImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/BookmarksImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,65 +14,66 @@
     """
     Class implementing the base class for the bookmarks importers.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self._path = ""
         self._file = ""
         self._error = False
         self._errorString = ""
         self._id = sourceId
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         @exception NotImplementedError raised to indicate this method must
             be implemented by a subclass
         """
         raise NotImplementedError
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         It must return a flag indicating success (boolean).
-        
+
         @exception NotImplementedError raised to indicate this method must
             be implemented by a subclass
         """
         raise NotImplementedError
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         It must return the imported bookmarks (BookmarkNode).
-        
+
         @exception NotImplementedError raised to indicate this method must
             be implemented by a subclass
         """
         raise NotImplementedError
-    
+
     def error(self):
         """
         Public method to check for an error.
-        
+
         @return flag indicating an error (boolean)
         """
         return self._error
-    
+
     def errorString(self):
         """
         Public method to get the error description.
-        
+
         @return error description (string)
         """
         return self._errorString
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/ChromeImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/ChromeImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -30,17 +30,17 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId not in ("chrome", "chromium"):
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     if sourceId == "chrome":
         if Globals.isWindowsPlatform():
             standardDir = os.path.expandvars(
-                "%USERPROFILE%\\AppData\\Local\\Google\\Chrome\\"
-                "User Data\\Default")
+                "%USERPROFILE%\\AppData\\Local\\Google\\Chrome\\" "User Data\\Default"
+            )
         elif Globals.isMacPlatform():
             standardDir = os.path.expanduser(
-                "~/Library/Application Support/Google/Chrome/Default")
+                "~/Library/Application Support/Google/Chrome/Default"
+            )
         else:
             standardDir = os.path.expanduser("~/.config/google-chrome/Default")
         return (
@@ -51,17 +51,19 @@
                 "ChromeImporter",
                 """Google Chrome stores its bookmarks in the"""
                 """ <b>Bookmarks</b> text file. This file is usually"""
-                """ located in"""),
+                """ located in""",
+            ),
             QCoreApplication.translate(
                 "ChromeImporter",
-                """Please choose the file to begin importing bookmarks."""),
+                """Please choose the file to begin importing bookmarks.""",
+            ),
             standardDir,
         )
     else:
         if Globals.isWindowsPlatform():
             standardDir = os.path.expandvars(
-                "%USERPROFILE%\\AppData\\Local\\Google\\Chrome\\"
-                "User Data\\Default")
+                "%USERPROFILE%\\AppData\\Local\\Google\\Chrome\\" "User Data\\Default"
+            )
         else:
             standardDir = os.path.expanduser("~/.config/chromium/Default")
         return (
@@ -71,10 +73,12 @@
             QCoreApplication.translate(
                 "ChromeImporter",
                 """Chromium stores its bookmarks in the <b>Bookmarks</b>"""
-                """ text file. This file is usually located in"""),
+                """ text file. This file is usually located in""",
+            ),
             QCoreApplication.translate(
                 "ChromeImporter",
-                """Please choose the file to begin importing bookmarks."""),
+                """Please choose the file to begin importing bookmarks.""",
+            ),
             standardDir,
         )
 
@@ -83,42 +87,44 @@
     """
     Class implementing the Chrome bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist.").format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         try:
@@ -130,27 +136,27 @@
                 "File '{0}' cannot be read.\nReason: {1}"
             ).format(self.__fileName, str(err))
             return None
-        
+
         from ..BookmarkNode import BookmarkNode
+
         importRootNode = BookmarkNode(BookmarkNode.Folder)
         if contents["version"] == 1:
             self.__processRoots(contents["roots"], importRootNode)
-        
+
         if self._id == "chrome":
             importRootNode.title = self.tr("Google Chrome Import")
         elif self._id == "chromium":
             importRootNode.title = self.tr("Chromium Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
-    
+
     def __processRoots(self, data, rootNode):
         """
         Private method to process the bookmark roots.
-        
+
         @param data dictionary with the bookmarks data (dict)
         @param rootNode node to add the bookmarks to (BookmarkNode)
         """
@@ -159,15 +165,16 @@
                 self.__generateFolderNode(node, rootNode)
             elif node["type"] == "url":
                 self.__generateUrlNode(node, rootNode)
-    
+
     def __generateFolderNode(self, data, rootNode):
         """
         Private method to process a bookmarks folder.
-        
+
         @param data dictionary with the bookmarks data (dict)
         @param rootNode node to add the bookmarks to (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
+
         folder = BookmarkNode(BookmarkNode.Folder, rootNode)
         folder.title = data["name"].replace("&", "&&")
         for node in data["children"]:
@@ -175,15 +182,16 @@
                 self.__generateFolderNode(node, folder)
             elif node["type"] == "url":
                 self.__generateUrlNode(node, folder)
-    
+
     def __generateUrlNode(self, data, rootNode):
         """
         Private method to process a bookmarks node.
-        
+
         @param data dictionary with the bookmarks data (dict)
         @param rootNode node to add the bookmarks to (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
+
         bookmark = BookmarkNode(BookmarkNode.Bookmark, rootNode)
         bookmark.url = data["url"]
         bookmark.title = data["name"].replace("&", "&&")
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/FirefoxImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/FirefoxImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -30,15 +30,14 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId != "firefox":
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     if Globals.isWindowsPlatform():
-        standardDir = os.path.expandvars(
-            "%APPDATA%\\Mozilla\\Firefox\\Profiles")
+        standardDir = os.path.expandvars("%APPDATA%\\Mozilla\\Firefox\\Profiles")
     elif Globals.isMacPlatform():
         standardDir = os.path.expanduser(
-            "~/Library/Application Support/Firefox/Profiles")
+            "~/Library/Application Support/Firefox/Profiles"
+        )
     else:
         standardDir = os.path.expanduser("~/.mozilla/firefox")
     return (
@@ -49,10 +48,12 @@
             "FirefoxImporter",
             """Mozilla Firefox stores its bookmarks in the"""
             """ <b>places.sqlite</b> SQLite database. This file is"""
-            """ usually located in"""),
+            """ usually located in""",
+        ),
         QCoreApplication.translate(
             "FirefoxImporter",
-            """Please choose the file to begin importing bookmarks."""),
+            """Please choose the file to begin importing bookmarks.""",
+        ),
         standardDir,
     )
 
@@ -61,127 +62,129 @@
     """
     Class implementing the Chrome bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
         self.__db = None
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
-        
+
         try:
             self.__db = sqlite3.connect(self.__fileName)
         except sqlite3.DatabaseError as err:
             self._error = True
-            self._errorString = self.tr(
-                "Unable to open database.\nReason: {0}").format(str(err))
+            self._errorString = self.tr("Unable to open database.\nReason: {0}").format(
+                str(err)
+            )
             return False
-        
+
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
+
         importRootNode = BookmarkNode(BookmarkNode.Root)
-        
+
         # step 1: build the hierarchy of bookmark folders
         folders = {}
-        
+
         try:
             cursor = self.__db.cursor()
             cursor.execute(
                 "SELECT id, parent, title FROM moz_bookmarks "
-                "WHERE type = 2 and title !=''")
+                "WHERE type = 2 and title !=''"
+            )
             for row in cursor:
                 id_ = row[0]
                 parent = row[1]
                 title = row[2]
                 folder = (
                     BookmarkNode(BookmarkNode.Folder, folders[parent])
-                    if parent in folders else
-                    BookmarkNode(BookmarkNode.Folder, importRootNode)
+                    if parent in folders
+                    else BookmarkNode(BookmarkNode.Folder, importRootNode)
                 )
                 folder.title = title.replace("&", "&&")
                 folders[id_] = folder
         except sqlite3.DatabaseError as err:
             self._error = True
-            self._errorString = self.tr(
-                "Unable to open database.\nReason: {0}").format(str(err))
+            self._errorString = self.tr("Unable to open database.\nReason: {0}").format(
+                str(err)
+            )
             return None
-        
+
         try:
             cursor = self.__db.cursor()
             cursor.execute(
                 "SELECT parent, title, fk, position FROM moz_bookmarks"
-                " WHERE type = 1 and title != '' ORDER BY position")
+                " WHERE type = 1 and title != '' ORDER BY position"
+            )
             for row in cursor:
                 parent = row[0]
                 title = row[1]
                 placesId = row[2]
-                
+
                 cursor2 = self.__db.cursor()
                 cursor2.execute(
-                    "SELECT url FROM moz_places WHERE id = {0}"     # secok
-                    .format(placesId))
+                    "SELECT url FROM moz_places WHERE id = {0}".format(  # secok
+                        placesId
+                    )
+                )
                 row2 = cursor2.fetchone()
                 if row2:
                     url = QUrl(row2[0])
-                    if (
-                        not title or
-                        url.isEmpty() or
-                        url.scheme() in ["place", "about"]
-                    ):
+                    if not title or url.isEmpty() or url.scheme() in ["place", "about"]:
                         continue
-                    
+
                     if parent in folders:
-                        bookmark = BookmarkNode(BookmarkNode.Bookmark,
-                                                folders[parent])
+                        bookmark = BookmarkNode(BookmarkNode.Bookmark, folders[parent])
                     else:
-                        bookmark = BookmarkNode(BookmarkNode.Bookmark,
-                                                importRootNode)
+                        bookmark = BookmarkNode(BookmarkNode.Bookmark, importRootNode)
                     bookmark.url = url.toString()
                     bookmark.title = title.replace("&", "&&")
         except sqlite3.DatabaseError as err:
             self._error = True
-            self._errorString = self.tr(
-                "Unable to open database.\nReason: {0}").format(str(err))
+            self._errorString = self.tr("Unable to open database.\nReason: {0}").format(
+                str(err)
+            )
             return None
-        
+
         importRootNode.setType(BookmarkNode.Folder)
         if self._id == "firefox":
             importRootNode.title = self.tr("Mozilla Firefox Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/HtmlImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/HtmlImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given HTML source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -28,23 +28,22 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId != "html":
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     return (
         UI.PixmapCache.getPixmap("html"),
         "HTML Netscape Bookmarks",
-        QCoreApplication.translate(
-            "HtmlImporter",
-            "HTML Netscape Bookmarks") + " (*.htm *.html)",
+        QCoreApplication.translate("HtmlImporter", "HTML Netscape Bookmarks")
+        + " (*.htm *.html)",
         QCoreApplication.translate(
             "HtmlImporter",
             """You can import bookmarks from any browser that supports"""
             """ HTML exporting. This file has usually the extension"""
-            """ .htm or .html."""),
+            """ .htm or .html.""",
+        ),
         QCoreApplication.translate(
-            "HtmlImporter",
-            """Please choose the file to begin importing bookmarks."""),
+            "HtmlImporter", """Please choose the file to begin importing bookmarks."""
+        ),
         "",
     )
 
@@ -53,58 +52,58 @@
     """
     Class implementing the HTML bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
         self.__inFile = None
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
         from ..NsHtmlReader import NsHtmlReader
-        
+
         reader = NsHtmlReader()
         importRootNode = reader.read(self.__fileName)
-        
+
         importRootNode.setType(BookmarkNode.Folder)
         if self._id == "html":
             importRootNode.title = self.tr("HTML Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/IExplorerImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/IExplorerImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -29,13 +29,12 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId != "ie":
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     standardDir = (
         os.path.expandvars("%USERPROFILE%\\Favorites")
-        if Globals.isWindowsPlatform() else
-        ""
+        if Globals.isWindowsPlatform()
+        else ""
     )
     return (
         UI.PixmapCache.getPixmap("internet_explorer"),
@@ -45,10 +44,12 @@
             "IExplorerImporter",
             """Internet Explorer stores its bookmarks in the"""
             """ <b>Favorites</b> folder This folder is usually"""
-            """ located in"""),
+            """ located in""",
+        ),
         QCoreApplication.translate(
             "IExplorerImporter",
-            """Please choose the folder to begin importing bookmarks."""),
+            """Please choose the folder to begin importing bookmarks.""",
+        ),
         standardDir,
     )
 
@@ -57,68 +58,69 @@
     """
     Class implementing the Chrome bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "Folder '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("Folder '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         if not os.path.isdir(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "'{0}' is not a folder."
-            ).format(self.__fileName)
+            self._errorString = self.tr("'{0}' is not a folder.").format(
+                self.__fileName
+            )
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
-        
+
         folders = {}
-        
+
         importRootNode = BookmarkNode(BookmarkNode.Folder)
         folders[self.__fileName] = importRootNode
-        
+
         for directory, subdirs, files in os.walk(self.__fileName):
             for subdir in subdirs:
                 path = os.path.join(directory, subdir)
                 folder = (
                     BookmarkNode(BookmarkNode.Folder, folders[directory])
-                    if directory in folders else
-                    BookmarkNode(BookmarkNode.Folder, importRootNode)
+                    if directory in folders
+                    else BookmarkNode(BookmarkNode.Folder, importRootNode)
                 )
                 folder.title = subdir.replace("&", "&&")
                 folders[path] = folder
-            
+
             for file in files:
                 name, ext = os.path.splitext(file)
                 if ext.lower() == ".url":
@@ -135,19 +137,20 @@
                             break
                     if url:
                         if directory in folders:
-                            bookmark = BookmarkNode(BookmarkNode.Bookmark,
-                                                    folders[directory])
+                            bookmark = BookmarkNode(
+                                BookmarkNode.Bookmark, folders[directory]
+                            )
                         else:
-                            bookmark = BookmarkNode(BookmarkNode.Bookmark,
-                                                    importRootNode)
+                            bookmark = BookmarkNode(
+                                BookmarkNode.Bookmark, importRootNode
+                            )
                         bookmark.url = url
                         bookmark.title = name.replace("&", "&&")
-        
+
         if self._id == "ie":
             importRootNode.title = self.tr("Internet Explorer Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/OperaImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/OperaImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -29,14 +29,12 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId != "opera":
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     if Globals.isWindowsPlatform():
         standardDir = os.path.expandvars("%APPDATA%\\Opera\\Opera")
     elif Globals.isMacPlatform():
-        standardDir = os.path.expanduser(
-            "~/Library/Opera")
+        standardDir = os.path.expanduser("~/Library/Opera")
     else:
         standardDir = os.path.expanduser("~/.opera")
     return (
@@ -46,10 +44,11 @@
         QCoreApplication.translate(
             "OperaImporter",
             """Opera stores its bookmarks in the <b>bookmarks.adr</b> """
-            """text file. This file is usually located in"""),
+            """text file. This file is usually located in""",
+        ),
         QCoreApplication.translate(
-            "OperaImporter",
-            """Please choose the file to begin importing bookmarks."""),
+            "OperaImporter", """Please choose the file to begin importing bookmarks."""
+        ),
         standardDir,
     )
 
@@ -58,43 +57,44 @@
     """
     Class implementing the Opera bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         try:
@@ -106,13 +106,14 @@
                 "File '{0}' cannot be read.\nReason: {1}"
             ).format(self.__fileName, str(err))
             return None
-        
+
         folderStack = []
-        
+
         from ..BookmarkNode import BookmarkNode
+
         importRootNode = BookmarkNode(BookmarkNode.Folder)
         folderStack.append(importRootNode)
-        
+
         for line in contents.splitlines():
             line = line.strip()
             if line == "#FOLDER":
@@ -126,12 +127,11 @@
                 node.title = line.replace("NAME=", "").replace("&", "&&")
             elif line.startswith("URL="):
                 node.url = line.replace("URL=", "")
-        
+
         if self._id == "opera":
             importRootNode.title = self.tr("Opera Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/SafariImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/SafariImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -30,12 +30,10 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId != "safari":
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     if Globals.isWindowsPlatform():
-        standardDir = os.path.expandvars(
-            "%APPDATA%\\Apple Computer\\Safari")
+        standardDir = os.path.expandvars("%APPDATA%\\Apple Computer\\Safari")
     elif Globals.isMacPlatform():
         standardDir = os.path.expanduser("~/Library/Safari")
     else:
@@ -48,10 +46,11 @@
             "SafariImporter",
             """Apple Safari stores its bookmarks in the"""
             """ <b>Bookmarks.plist</b> file. This file is usually"""
-            """ located in"""),
+            """ located in""",
+        ),
         QCoreApplication.translate(
-            "SafariImporter",
-            """Please choose the file to begin importing bookmarks."""),
+            "SafariImporter", """Please choose the file to begin importing bookmarks."""
+        ),
         standardDir,
     )
 
@@ -60,43 +59,44 @@
     """
     Class implementing the Apple Safari bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         try:
@@ -105,34 +105,36 @@
         except (plistlib.InvalidFileException, OSError) as err:
             self._error = True
             self._errorString = self.tr(
-                "Bookmarks file cannot be read.\nReason: {0}".format(str(err)))
+                "Bookmarks file cannot be read.\nReason: {0}".format(str(err))
+            )
             return None
-        
+
         from ..BookmarkNode import BookmarkNode
+
         importRootNode = BookmarkNode(BookmarkNode.Folder)
         if (
-            bookmarksDict["WebBookmarkFileVersion"] == 1 and
-            bookmarksDict["WebBookmarkType"] == "WebBookmarkTypeList"
+            bookmarksDict["WebBookmarkFileVersion"] == 1
+            and bookmarksDict["WebBookmarkType"] == "WebBookmarkTypeList"
         ):
             self.__processChildren(bookmarksDict["Children"], importRootNode)
-        
+
         if self._id == "safari":
             importRootNode.title = self.tr("Apple Safari Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
-    
+
     def __processChildren(self, children, rootNode):
         """
         Private method to process the list of children.
-        
+
         @param children list of child nodes to be processed (list of dict)
         @param rootNode node to add the bookmarks to (BookmarkNode)
         """
         from ..BookmarkNode import BookmarkNode
+
         for child in children:
             if child["WebBookmarkType"] == "WebBookmarkTypeList":
                 folder = BookmarkNode(BookmarkNode.Folder, rootNode)
@@ -143,9 +145,7 @@
                 url = child["URLString"]
                 if url.startswith(("place:", "about:")):
                     continue
-                
+
                 bookmark = BookmarkNode(BookmarkNode.Bookmark, rootNode)
                 bookmark.url = url
-                bookmark.title = (
-                    child["URIDictionary"]["title"].replace("&", "&&")
-                )
+                bookmark.title = child["URIDictionary"]["title"].replace("&", "&&")
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/XbelImporter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/XbelImporter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given XBEL source id.
-    
+
     @param sourceId id of the browser ("chrome" or "chromium")
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -28,11 +28,11 @@
     @exception ValueError raised to indicate an invalid browser ID
     """
     if sourceId not in ("e5browser", "konqueror", "xbel"):
-        raise ValueError(
-            "Unsupported browser ID given ({0}).".format(sourceId))
-    
+        raise ValueError("Unsupported browser ID given ({0}).".format(sourceId))
+
     if sourceId == "e5browser":
         from ..BookmarksManager import BookmarksManager
+
         bookmarksFile = BookmarksManager.getFileName()
         return (
             UI.PixmapCache.getPixmap("ericWeb48"),
@@ -41,11 +41,12 @@
             QCoreApplication.translate(
                 "XbelImporter",
                 """eric Web Browser stores its bookmarks in the"""
-                """ <b>{0}</b> XML file. This file is usually located in"""
+                """ <b>{0}</b> XML file. This file is usually located in""",
             ).format(os.path.basename(bookmarksFile)),
             QCoreApplication.translate(
                 "XbelImporter",
-                """Please choose the file to begin importing bookmarks."""),
+                """Please choose the file to begin importing bookmarks.""",
+            ),
             os.path.dirname(bookmarksFile),
         )
     elif sourceId == "konqueror":
@@ -63,26 +64,30 @@
                 "XbelImporter",
                 """Konqueror stores its bookmarks in the"""
                 """ <b>bookmarks.xml</b> XML file. This file is usually"""
-                """ located in"""),
+                """ located in""",
+            ),
             QCoreApplication.translate(
                 "XbelImporter",
-                """Please choose the file to begin importing bookmarks."""),
+                """Please choose the file to begin importing bookmarks.""",
+            ),
             standardDir,
         )
     else:
         return (
             UI.PixmapCache.getPixmap("xbel"),
             "XBEL Bookmarks",
-            QCoreApplication.translate(
-                "XbelImporter", "XBEL Bookmarks") + " (*.xbel *.xml)",
+            QCoreApplication.translate("XbelImporter", "XBEL Bookmarks")
+            + " (*.xbel *.xml)",
             QCoreApplication.translate(
                 "XbelImporter",
                 """You can import bookmarks from any browser that supports"""
                 """ XBEL exporting. This file has usually the extension"""
-                """ .xbel or .xml."""),
+                """ .xbel or .xml.""",
+            ),
             QCoreApplication.translate(
                 "XbelImporter",
-                """Please choose the file to begin importing bookmarks."""),
+                """Please choose the file to begin importing bookmarks.""",
+            ),
             "",
         )
 
@@ -91,61 +96,61 @@
     """
     Class implementing the XBEL bookmarks importer.
     """
+
     def __init__(self, sourceId="", parent=None):
         """
         Constructor
-        
+
         @param sourceId source ID (string)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(sourceId, parent)
-        
+
         self.__fileName = ""
-    
+
     def setPath(self, path):
         """
         Public method to set the path of the bookmarks file or directory.
-        
+
         @param path bookmarks file or directory (string)
         """
         self.__fileName = path
-    
+
     def open(self):
         """
         Public method to open the bookmarks file.
-        
+
         @return flag indicating success (boolean)
         """
         if not os.path.exists(self.__fileName):
             self._error = True
-            self._errorString = self.tr(
-                "File '{0}' does not exist."
-            ).format(self.__fileName)
+            self._errorString = self.tr("File '{0}' does not exist.").format(
+                self.__fileName
+            )
             return False
         return True
-    
+
     def importedBookmarks(self):
         """
         Public method to get the imported bookmarks.
-        
+
         @return imported bookmarks (BookmarkNode)
         """
         from ..XbelReader import XbelReader
-        
+
         reader = XbelReader()
         importRootNode = reader.read(self.__fileName)
-        
+
         if reader.error() != QXmlStreamReader.Error.NoError:
             self._error = True
             self._errorString = self.tr(
                 """Error when importing bookmarks on line {0},"""
                 """ column {1}:\n{2}"""
-            ).format(reader.lineNumber(),
-                     reader.columnNumber(),
-                     reader.errorString())
+            ).format(reader.lineNumber(), reader.columnNumber(), reader.errorString())
             return None
-        
+
         from ..BookmarkNode import BookmarkNode
+
         importRootNode.setType(BookmarkNode.Folder)
         if self._id == "e5browser":
             importRootNode.title = self.tr("eric Web Browser Import")
@@ -154,8 +159,7 @@
         elif self._id == "xbel":
             importRootNode.title = self.tr("XBEL Import")
         else:
-            importRootNode.title = self.tr(
-                "Imported {0}"
-            ).format(QDate.currentDate().toString(
-                Qt.DateFormat.SystemLocaleShortDate))
+            importRootNode.title = self.tr("Imported {0}").format(
+                QDate.currentDate().toString(Qt.DateFormat.SystemLocaleShortDate)
+            )
         return importRootNode
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksImporters/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,47 +16,48 @@
 def getImporters():
     """
     Module function to get a list of supported importers.
-    
+
     @return list of tuples with an icon (QIcon), readable name (string) and
         internal name (string)
     """
     importers = []
     importers.append(
-        (UI.PixmapCache.getIcon("ericWeb48"), "eric Web Browser",
-         "e5browser"))
-    importers.append(
-        (UI.PixmapCache.getIcon("firefox"), "Mozilla Firefox", "firefox"))
-    importers.append(
-        (UI.PixmapCache.getIcon("chrome"), "Google Chrome", "chrome"))
+        (UI.PixmapCache.getIcon("ericWeb48"), "eric Web Browser", "e5browser")
+    )
+    importers.append((UI.PixmapCache.getIcon("firefox"), "Mozilla Firefox", "firefox"))
+    importers.append((UI.PixmapCache.getIcon("chrome"), "Google Chrome", "chrome"))
     if Globals.isLinuxPlatform():
+        importers.append((UI.PixmapCache.getIcon("chromium"), "Chromium", "chromium"))
         importers.append(
-            (UI.PixmapCache.getIcon("chromium"), "Chromium", "chromium"))
-        importers.append(
-            (UI.PixmapCache.getIcon("konqueror"), "Konqueror",
-             "konqueror"))
-    importers.append(
-        (UI.PixmapCache.getIcon("opera"), "Opera", "opera"))
-    importers.append(
-        (UI.PixmapCache.getIcon("safari"), "Apple Safari", "safari"))
+            (UI.PixmapCache.getIcon("konqueror"), "Konqueror", "konqueror")
+        )
+    importers.append((UI.PixmapCache.getIcon("opera"), "Opera", "opera"))
+    importers.append((UI.PixmapCache.getIcon("safari"), "Apple Safari", "safari"))
     if Globals.isWindowsPlatform():
         importers.append(
-            (UI.PixmapCache.getIcon("internet_explorer"),
-             "Internet Explorer", "ie"))
+            (UI.PixmapCache.getIcon("internet_explorer"), "Internet Explorer", "ie")
+        )
     importers.append(
-        (UI.PixmapCache.getIcon("xbel"),
-         QCoreApplication.translate("BookmarksImporters", "XBEL File"),
-         "xbel"))
+        (
+            UI.PixmapCache.getIcon("xbel"),
+            QCoreApplication.translate("BookmarksImporters", "XBEL File"),
+            "xbel",
+        )
+    )
     importers.append(
-        (UI.PixmapCache.getIcon("html"),
-         QCoreApplication.translate("BookmarksImporters", "HTML File"),
-         "html"))
+        (
+            UI.PixmapCache.getIcon("html"),
+            QCoreApplication.translate("BookmarksImporters", "HTML File"),
+            "html",
+        )
+    )
     return importers
 
 
 def getImporterInfo(sourceId):
     """
     Module function to get information for the given source id.
-    
+
     @param sourceId source id to get info for (string)
     @return tuple with an icon (QPixmap), readable name (string), name of
         the default bookmarks file (string), an info text (string),
@@ -66,24 +67,31 @@
     """
     if sourceId in ["e5browser", "xbel", "konqueror"]:
         from . import XbelImporter
+
         return XbelImporter.getImporterInfo(sourceId)
     elif sourceId == "html":
         from . import HtmlImporter
+
         return HtmlImporter.getImporterInfo(sourceId)
     elif sourceId in ["chrome", "chromium"]:
         from . import ChromeImporter
+
         return ChromeImporter.getImporterInfo(sourceId)
     elif sourceId == "opera":
         from . import OperaImporter
+
         return OperaImporter.getImporterInfo(sourceId)
     elif sourceId == "firefox":
         from . import FirefoxImporter
+
         return FirefoxImporter.getImporterInfo(sourceId)
     elif sourceId == "ie":
         from . import IExplorerImporter
+
         return IExplorerImporter.getImporterInfo(sourceId)
     elif sourceId == "safari":
         from . import SafariImporter
+
         return SafariImporter.getImporterInfo(sourceId)
     else:
         raise ValueError("Invalid importer ID given ({0}).".format(sourceId))
@@ -92,7 +100,7 @@
 def getImporter(sourceId, parent=None):
     """
     Module function to get an importer for the given source id.
-    
+
     @param sourceId source id to get an importer for (string)
     @param parent reference to the parent object (QObject)
     @return bookmarks importer (BookmarksImporter)
@@ -100,24 +108,31 @@
     """
     if sourceId in ["e5browser", "xbel", "konqueror"]:
         from . import XbelImporter
+
         return XbelImporter.XbelImporter(sourceId, parent)
     elif sourceId == "html":
         from . import HtmlImporter
+
         return HtmlImporter.HtmlImporter(sourceId, parent)
     elif sourceId in ["chrome", "chromium"]:
         from . import ChromeImporter
+
         return ChromeImporter.ChromeImporter(sourceId, parent)
     elif sourceId == "opera":
         from . import OperaImporter
+
         return OperaImporter.OperaImporter(sourceId, parent)
     elif sourceId == "firefox":
         from . import FirefoxImporter
+
         return FirefoxImporter.FirefoxImporter(sourceId, parent)
     elif sourceId == "ie":
         from . import IExplorerImporter
+
         return IExplorerImporter.IExplorerImporter(sourceId, parent)
     elif sourceId == "safari":
         from . import SafariImporter
+
         return SafariImporter.SafariImporter(sourceId, parent)
     else:
         raise ValueError("No importer for ID {0}.".format(sourceId))
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,15 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSignal, QT_TRANSLATE_NOOP, QObject, QFile, QIODevice, QXmlStreamReader,
-    QDateTime, QUrl, QCoreApplication
+    pyqtSignal,
+    QT_TRANSLATE_NOOP,
+    QObject,
+    QFile,
+    QIODevice,
+    QXmlStreamReader,
+    QDateTime,
+    QUrl,
+    QCoreApplication,
 )
 from PyQt6.QtGui import QUndoStack, QUndoCommand
 from PyQt6.QtWidgets import QDialog
@@ -36,7 +43,7 @@
 class BookmarksManager(QObject):
     """
     Class implementing the bookmarks manager.
-    
+
     @signal entryAdded(BookmarkNode) emitted after a bookmark node has been
         added
     @signal entryRemoved(BookmarkNode, int, BookmarkNode) emitted after a
@@ -46,27 +53,28 @@
     @signal bookmarksSaved() emitted after the bookmarks were saved
     @signal bookmarksReloaded() emitted after the bookmarks were reloaded
     """
+
     entryAdded = pyqtSignal(BookmarkNode)
     entryRemoved = pyqtSignal(BookmarkNode, int, BookmarkNode)
     entryChanged = pyqtSignal(BookmarkNode)
     bookmarksSaved = pyqtSignal()
     bookmarksReloaded = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
         self.entryAdded.connect(self.__saveTimer.changeOccurred)
         self.entryRemoved.connect(self.__saveTimer.changeOccurred)
         self.entryChanged.connect(self.__saveTimer.changeOccurred)
-        
+
         self.__initialize()
-    
+
     def __initialize(self):
         """
         Private method to initialize some data.
@@ -77,37 +85,36 @@
         self.__menu = None
         self.__bookmarksModel = None
         self.__commands = QUndoStack()
-    
+
     @classmethod
     def getFileName(cls):
         """
         Class method to get the file name of the bookmark file.
-        
+
         @return name of the bookmark file (string)
         """
-        return os.path.join(Utilities.getConfigDir(), "web_browser",
-                            "bookmarks.xbel")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "bookmarks.xbel")
+
     def close(self):
         """
         Public method to close the bookmark manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def undoRedoStack(self):
         """
         Public method to get a reference to the undo stack.
-        
+
         @return reference to the undo stack (QUndoStack)
         """
         return self.__commands
-    
+
     def changeExpanded(self):
         """
         Public method to handle a change of the expanded state.
         """
         self.__saveTimer.changeOccurred()
-    
+
     def reload(self):
         """
         Public method used to initiate a reloading of the bookmarks.
@@ -115,26 +122,28 @@
         self.__initialize()
         self.load()
         self.bookmarksReloaded.emit()
-    
+
     def load(self):
         """
         Public method to load the bookmarks.
-        
+
         @exception RuntimeError raised to indicate an error loading the
             bookmarks
         """
         if self.__loaded:
             return
-        
+
         self.__loaded = True
-        
+
         bookmarkFile = self.getFileName()
         if not QFile.exists(bookmarkFile):
-            bookmarkFile = QFile(os.path.join(
-                os.path.dirname(__file__), "DefaultBookmarks.xbel"))
+            bookmarkFile = QFile(
+                os.path.join(os.path.dirname(__file__), "DefaultBookmarks.xbel")
+            )
             bookmarkFile.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         from .XbelReader import XbelReader
+
         reader = XbelReader()
         self.__bookmarkRootNode = reader.read(bookmarkFile)
         if reader.error() != QXmlStreamReader.Error.NoError:
@@ -143,66 +152,62 @@
                 self.tr("Loading Bookmarks"),
                 self.tr(
                     """Error when loading bookmarks on line {0},"""
-                    """ column {1}:\n {2}""")
-                .format(reader.lineNumber(),
-                        reader.columnNumber(),
-                        reader.errorString()))
-        
+                    """ column {1}:\n {2}"""
+                ).format(
+                    reader.lineNumber(), reader.columnNumber(), reader.errorString()
+                ),
+            )
+
         others = []
-        for index in range(
-                len(self.__bookmarkRootNode.children()) - 1, -1, -1):
+        for index in range(len(self.__bookmarkRootNode.children()) - 1, -1, -1):
             node = self.__bookmarkRootNode.children()[index]
             if node.type() == BookmarkNode.Folder:
                 if (
-                    (node.title == self.tr("Toolbar Bookmarks") or
-                     node.title == BOOKMARKBAR) and
-                    self.__toolbar is None
-                ):
+                    node.title == self.tr("Toolbar Bookmarks")
+                    or node.title == BOOKMARKBAR
+                ) and self.__toolbar is None:
                     node.title = self.tr(BOOKMARKBAR)
                     self.__toolbar = node
-                
+
                 if (
-                    (node.title == self.tr("Menu") or
-                     node.title == BOOKMARKMENU) and
-                    self.__menu is None
-                ):
+                    node.title == self.tr("Menu") or node.title == BOOKMARKMENU
+                ) and self.__menu is None:
                     node.title = self.tr(BOOKMARKMENU)
                     self.__menu = node
             else:
                 others.append(node)
             self.__bookmarkRootNode.remove(node)
-        
+
         if len(self.__bookmarkRootNode.children()) > 0:
             raise RuntimeError("Error loading bookmarks.")
-        
+
         if self.__toolbar is None:
-            self.__toolbar = BookmarkNode(BookmarkNode.Folder,
-                                          self.__bookmarkRootNode)
+            self.__toolbar = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode)
             self.__toolbar.title = self.tr(BOOKMARKBAR)
         else:
             self.__bookmarkRootNode.add(self.__toolbar)
-        
+
         if self.__menu is None:
-            self.__menu = BookmarkNode(BookmarkNode.Folder,
-                                       self.__bookmarkRootNode)
+            self.__menu = BookmarkNode(BookmarkNode.Folder, self.__bookmarkRootNode)
             self.__menu.title = self.tr(BOOKMARKMENU)
         else:
             self.__bookmarkRootNode.add(self.__menu)
-        
+
         for node in others:
             self.__menu.add(node)
-    
+
     def save(self):
         """
         Public method to save the bookmarks.
         """
         if not self.__loaded:
             return
-        
+
         from .XbelWriter import XbelWriter
+
         writer = XbelWriter()
         bookmarkFile = self.getFileName()
-        
+
         # save root folder titles in English (i.e. not localized)
         self.__menu.title = BOOKMARKMENU
         self.__toolbar.title = BOOKMARKBAR
@@ -210,85 +215,86 @@
             EricMessageBox.warning(
                 None,
                 self.tr("Saving Bookmarks"),
-                self.tr("""Error saving bookmarks to <b>{0}</b>.""")
-                .format(bookmarkFile))
-        
+                self.tr("""Error saving bookmarks to <b>{0}</b>.""").format(
+                    bookmarkFile
+                ),
+            )
+
         # restore localized titles
         self.__menu.title = self.tr(BOOKMARKMENU)
         self.__toolbar.title = self.tr(BOOKMARKBAR)
-        
+
         self.bookmarksSaved.emit()
-    
+
     def addBookmark(self, parent, node, row=-1):
         """
         Public method to add a bookmark.
-        
+
         @param parent reference to the node to add to (BookmarkNode)
         @param node reference to the node to add (BookmarkNode)
         @param row row number (integer)
         """
         if not self.__loaded:
             return
-        
-        self.setTimestamp(node, BookmarkNode.TsAdded,
-                          QDateTime.currentDateTime())
-        
+
+        self.setTimestamp(node, BookmarkNode.TsAdded, QDateTime.currentDateTime())
+
         command = InsertBookmarksCommand(self, parent, node, row)
         self.__commands.push(command)
-    
+
     def removeBookmark(self, node):
         """
         Public method to remove a bookmark.
-        
+
         @param node reference to the node to be removed (BookmarkNode)
         """
         if not self.__loaded:
             return
-        
+
         parent = node.parent()
         row = parent.children().index(node)
         command = RemoveBookmarksCommand(self, parent, row)
         self.__commands.push(command)
-    
+
     def setTitle(self, node, newTitle):
         """
         Public method to set the title of a bookmark.
-        
+
         @param node reference to the node to be changed (BookmarkNode)
         @param newTitle title to be set (string)
         """
         if not self.__loaded:
             return
-        
+
         command = ChangeBookmarkCommand(self, node, newTitle, True)
         self.__commands.push(command)
-    
+
     def setUrl(self, node, newUrl):
         """
         Public method to set the URL of a bookmark.
-        
+
         @param node reference to the node to be changed (BookmarkNode)
         @param newUrl URL to be set (string)
         """
         if not self.__loaded:
             return
-        
+
         command = ChangeBookmarkCommand(self, node, newUrl, False)
         self.__commands.push(command)
-    
+
     def setNodeChanged(self, node):
         """
         Public method to signal changes of bookmarks other than title, URL
         or timestamp.
-        
+
         @param node reference to the bookmark (BookmarkNode)
         """
         self.__saveTimer.changeOccurred()
-    
+
     def setTimestamp(self, node, timestampType, timestamp):
         """
         Public method to set the URL of a bookmark.
-        
+
         @param node reference to the node to be changed (BookmarkNode)
         @param timestampType type of the timestamp to set
             (BookmarkNode.TsAdded, BookmarkNode.TsModified,
@@ -297,7 +303,7 @@
         """
         if not self.__loaded:
             return
-        
+
         if timestampType == BookmarkNode.TsAdded:
             node.added = timestamp
         elif timestampType == BookmarkNode.TsModified:
@@ -305,86 +311,88 @@
         elif timestampType == BookmarkNode.TsVisited:
             node.visited = timestamp
         self.__saveTimer.changeOccurred()
-    
+
     def incVisitCount(self, node):
         """
         Public method to increment the visit count of a bookmark.
-        
+
         @param node reference to the node to be changed (BookmarkNode)
         """
         if not self.__loaded:
             return
-        
+
         if node:
             node.visitCount += 1
             self.__saveTimer.changeOccurred()
-    
+
     def setVisitCount(self, node, count):
         """
         Public method to set the visit count of a bookmark.
-        
+
         @param node reference to the node to be changed (BookmarkNode)
         @param count visit count to be set (int or str)
         """
         with contextlib.suppress(ValueError):
             node.visitCount = int(count)
             self.__saveTimer.changeOccurred()
-    
+
     def bookmarks(self):
         """
         Public method to get a reference to the root bookmark node.
-        
+
         @return reference to the root bookmark node (BookmarkNode)
         """
         if not self.__loaded:
             self.load()
-        
+
         return self.__bookmarkRootNode
-    
+
     def menu(self):
         """
         Public method to get a reference to the bookmarks menu node.
-        
+
         @return reference to the bookmarks menu node (BookmarkNode)
         """
         if not self.__loaded:
             self.load()
-        
+
         return self.__menu
-    
+
     def toolbar(self):
         """
         Public method to get a reference to the bookmarks toolbar node.
-        
+
         @return reference to the bookmarks toolbar node (BookmarkNode)
         """
         if not self.__loaded:
             self.load()
-        
+
         return self.__toolbar
-    
+
     def bookmarksModel(self):
         """
         Public method to get a reference to the bookmarks model.
-        
+
         @return reference to the bookmarks model (BookmarksModel)
         """
         if self.__bookmarksModel is None:
             from .BookmarksModel import BookmarksModel
+
             self.__bookmarksModel = BookmarksModel(self, self)
         return self.__bookmarksModel
-    
+
     def importBookmarks(self):
         """
         Public method to import bookmarks.
         """
         from .BookmarksImportDialog import BookmarksImportDialog
+
         dlg = BookmarksImportDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             importRootNode = dlg.getImportedBookmarks()
             if importRootNode is not None:
                 self.addBookmark(self.menu(), importRootNode)
-    
+
     def exportBookmarks(self):
         """
         Public method to export the bookmarks.
@@ -393,35 +401,40 @@
             None,
             self.tr("Export Bookmarks"),
             "eric7_bookmarks.xbel",
-            self.tr("XBEL bookmarks (*.xbel);;"
-                    "XBEL bookmarks (*.xml);;"
-                    "HTML Bookmarks (*.html)"))
+            self.tr(
+                "XBEL bookmarks (*.xbel);;"
+                "XBEL bookmarks (*.xml);;"
+                "HTML Bookmarks (*.html)"
+            ),
+        )
         if not fileName:
             return
-        
+
         fpath = pathlib.Path(fileName)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fpath = fpath.with_suffix(ex)
-        
+
         if fpath.suffix == ".html":
             from .NsHtmlWriter import NsHtmlWriter
+
             writer = NsHtmlWriter()
         else:
             from .XbelWriter import XbelWriter
+
             writer = XbelWriter()
         if not writer.write(str(fpath), self.__bookmarkRootNode):
             EricMessageBox.critical(
                 None,
                 self.tr("Exporting Bookmarks"),
-                self.tr("""Error exporting bookmarks to <b>{0}</b>.""")
-                .format(fpath))
-    
+                self.tr("""Error exporting bookmarks to <b>{0}</b>.""").format(fpath),
+            )
+
     def faviconChanged(self, url):
         """
         Public slot to update the icon image for an URL.
-        
+
         @param url URL of the icon to update (QUrl or string)
         """
         if isinstance(url, QUrl):
@@ -429,11 +442,11 @@
         nodes = self.bookmarksForUrl(url)
         for node in nodes:
             self.bookmarksModel().entryChanged(node)
-    
+
     def bookmarkForUrl(self, url, start=StartRoot):
         """
         Public method to get a bookmark node for a given URL.
-        
+
         @param url URL of the bookmark to search for (QUrl or string)
         @param start indicator for the start of the search
             (StartRoot, StartMenu, StartToolBar)
@@ -447,16 +460,16 @@
             startNode = self.__bookmarkRootNode
         if startNode is None:
             return None
-        
+
         if isinstance(url, QUrl):
             url = url.toString()
-        
+
         return self.__searchBookmark(url, startNode)
-    
+
     def __searchBookmark(self, url, startNode):
         """
         Private method get a bookmark node for a given URL.
-        
+
         @param url URL of the bookmark to search for (string)
         @param startNode reference to the node to start searching
             (BookmarkNode)
@@ -466,19 +479,16 @@
         for node in startNode.children():
             if node.type() == BookmarkNode.Folder:
                 bm = self.__searchBookmark(url, node)
-            elif (
-                node.type() == BookmarkNode.Bookmark and
-                node.url == url
-            ):
+            elif node.type() == BookmarkNode.Bookmark and node.url == url:
                 bm = node
             if bm is not None:
                 return bm
         return None
-    
+
     def bookmarksForUrl(self, url, start=StartRoot):
         """
         Public method to get a list of bookmark nodes for a given URL.
-        
+
         @param url URL of the bookmarks to search for (QUrl or string)
         @param start indicator for the start of the search
             (StartRoot, StartMenu, StartToolBar)
@@ -492,16 +502,16 @@
             startNode = self.__bookmarkRootNode
         if startNode is None:
             return []
-        
+
         if isinstance(url, QUrl):
             url = url.toString()
-        
+
         return self.__searchBookmarks(url, startNode)
-    
+
     def __searchBookmarks(self, url, startNode):
         """
         Private method get a list of bookmark nodes for a given URL.
-        
+
         @param url URL of the bookmarks to search for (string)
         @param startNode reference to the node to start searching
             (BookmarkNode)
@@ -511,10 +521,7 @@
         for node in startNode.children():
             if node.type() == BookmarkNode.Folder:
                 bm.extend(self.__searchBookmarks(url, node))
-            elif (
-                node.type() == BookmarkNode.Bookmark and
-                node.url == url
-            ):
+            elif node.type() == BookmarkNode.Bookmark and node.url == url:
                 bm.append(node)
         return bm
 
@@ -523,18 +530,20 @@
     """
     Class implementing the Remove undo command.
     """
+
     def __init__(self, bookmarksManager, parent, row):
         """
         Constructor
-        
+
         @param bookmarksManager reference to the bookmarks manager
             (BookmarksManager)
         @param parent reference to the parent node (BookmarkNode)
         @param row row number of bookmark (integer)
         """
         super().__init__(
-            QCoreApplication.translate("BookmarksManager", "Remove Bookmark"))
-        
+            QCoreApplication.translate("BookmarksManager", "Remove Bookmark")
+        )
+
         self._row = row
         self._bookmarksManager = bookmarksManager
         try:
@@ -542,31 +551,31 @@
         except IndexError:
             self._node = BookmarkNode()
         self._parent = parent
-    
+
     def undo(self):
         """
         Public slot to perform the undo action.
         """
         self._parent.add(self._node, self._row)
         self._bookmarksManager.entryAdded.emit(self._node)
-    
+
     def redo(self):
         """
         Public slot to perform the redo action.
         """
         self._parent.remove(self._node)
-        self._bookmarksManager.entryRemoved.emit(
-            self._parent, self._row, self._node)
+        self._bookmarksManager.entryRemoved.emit(self._parent, self._row, self._node)
 
 
 class InsertBookmarksCommand(RemoveBookmarksCommand):
     """
     Class implementing the Insert undo command.
     """
+
     def __init__(self, bookmarksManager, parent, node, row):
         """
         Constructor
-        
+
         @param bookmarksManager reference to the bookmarks manager
             (BookmarksManager)
         @param parent reference to the parent node (BookmarkNode)
@@ -574,16 +583,15 @@
         @param row row number of bookmark (integer)
         """
         RemoveBookmarksCommand.__init__(self, bookmarksManager, parent, row)
-        self.setText(QCoreApplication.translate(
-            "BookmarksManager", "Insert Bookmark"))
+        self.setText(QCoreApplication.translate("BookmarksManager", "Insert Bookmark"))
         self._node = node
-    
+
     def undo(self):
         """
         Public slot to perform the undo action.
         """
         RemoveBookmarksCommand.redo(self)
-    
+
     def redo(self):
         """
         Public slot to perform the redo action.
@@ -595,10 +603,11 @@
     """
     Class implementing the Insert undo command.
     """
+
     def __init__(self, bookmarksManager, node, newValue, title):
         """
         Constructor
-        
+
         @param bookmarksManager reference to the bookmarks manager
             (BookmarksManager)
         @param node reference to the node to be changed (BookmarkNode)
@@ -607,21 +616,21 @@
             the URL (False) (boolean)
         """
         super().__init__()
-        
+
         self._bookmarksManager = bookmarksManager
         self._title = title
         self._newValue = newValue
         self._node = node
-        
+
         if self._title:
             self._oldValue = self._node.title
-            self.setText(QCoreApplication.translate(
-                "BookmarksManager", "Name Change"))
+            self.setText(QCoreApplication.translate("BookmarksManager", "Name Change"))
         else:
             self._oldValue = self._node.url
-            self.setText(QCoreApplication.translate(
-                "BookmarksManager", "Address Change"))
-    
+            self.setText(
+                QCoreApplication.translate("BookmarksManager", "Address Change")
+            )
+
     def undo(self):
         """
         Public slot to perform the undo action.
@@ -631,7 +640,7 @@
         else:
             self._node.url = self._oldValue
         self._bookmarksManager.entryChanged.emit(self._node)
-    
+
     def redo(self):
         """
         Public slot to perform the redo action.
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksMenu.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksMenu.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 class BookmarksMenu(EricModelMenu):
     """
     Class implementing the bookmarks menu base class.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL with the given title in
         the current tab
     @signal newTab(QUrl, str) emitted to open a URL with the given title in a
@@ -28,29 +28,30 @@
     @signal newWindow(QUrl, str) emitted to open a URL with the given title in
         a new window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         EricModelMenu.__init__(self, parent)
-        
+
         self.activated.connect(self.__activated)
         self.setStatusBarTextRole(BookmarksModel.UrlStringRole)
         self.setSeparatorRole(BookmarksModel.SeparatorRole)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
-    
+
     def createBaseMenu(self):
         """
         Public method to get the menu that is used to populate sub menu's.
-        
+
         @return reference to the menu (BookmarksMenu)
         """
         menu = BookmarksMenu(self)
@@ -58,138 +59,136 @@
         menu.newTab.connect(self.newTab)
         menu.newWindow.connect(self.newWindow)
         return menu
-    
+
     def __updateVisitCount(self, idx):
         """
         Private method to update the visit count of a bookmark.
-        
+
         @param idx index of the bookmark item (QModelIndex)
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         bookmarkNode = self.model().node(idx)
         manager = WebBrowserWindow.bookmarksManager()
         manager.incVisitCount(bookmarkNode)
-    
+
     def __activated(self, idx):
         """
         Private slot handling the activated signal.
-        
+
         @param idx index of the activated item (QModelIndex)
         """
         if self._keyboardModifiers & Qt.KeyboardModifier.ControlModifier:
             self.newTab.emit(
-                idx.data(BookmarksModel.UrlRole),
-                idx.data(Qt.ItemDataRole.DisplayRole))
+                idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+            )
         elif self._keyboardModifiers & Qt.KeyboardModifier.ShiftModifier:
             self.newWindow.emit(
-                idx.data(BookmarksModel.UrlRole),
-                idx.data(Qt.ItemDataRole.DisplayRole))
+                idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+            )
         else:
             self.openUrl.emit(
-                idx.data(BookmarksModel.UrlRole),
-                idx.data(Qt.ItemDataRole.DisplayRole))
+                idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+            )
         self.__updateVisitCount(idx)
-    
+
     def postPopulated(self):
         """
         Public method to add any actions after the tree.
         """
         if self.isEmpty():
             return
-        
+
         parent = self.rootIndex()
-        
+
         hasBookmarks = False
-        
+
         for i in range(parent.model().rowCount(parent)):
             child = parent.model().index(i, 0, parent)
-            
+
             if child.data(BookmarksModel.TypeRole) == BookmarkNode.Bookmark:
                 hasBookmarks = True
                 break
-        
+
         if not hasBookmarks:
             return
-        
+
         self.addSeparator()
         act = self.addAction(self.tr("Open all in Tabs"))
         act.triggered.connect(lambda: self.openAll(act))
-    
+
     def openAll(self, act):
         """
         Public slot to open all the menu's items.
-        
+
         @param act reference to the action object
         @type QAction
         """
         menu = act.parent()
         if menu is None:
             return
-        
+
         parent = menu.rootIndex()
         if not parent.isValid():
             return
-        
+
         for i in range(parent.model().rowCount(parent)):
             child = parent.model().index(i, 0, parent)
-            
+
             if child.data(BookmarksModel.TypeRole) != BookmarkNode.Bookmark:
                 continue
-            
+
             if i == 0:
                 self.openUrl.emit(
                     child.data(BookmarksModel.UrlRole),
-                    child.data(Qt.ItemDataRole.DisplayRole))
+                    child.data(Qt.ItemDataRole.DisplayRole),
+                )
             else:
                 self.newTab.emit(
                     child.data(BookmarksModel.UrlRole),
-                    child.data(Qt.ItemDataRole.DisplayRole))
+                    child.data(Qt.ItemDataRole.DisplayRole),
+                )
             self.__updateVisitCount(child)
-    
+
     def __contextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request.
-        
+
         @param pos position the context menu shall be shown (QPoint)
         """
         act = self.actionAt(pos)
-        
+
         if (
-            act is not None and
-            act not in self.menuActions and
-            self.index(act).isValid()
+            act is not None
+            and act not in self.menuActions
+            and self.index(act).isValid()
         ):
             menu = QMenu()
             v = act.data()
-            
+
             act2 = menu.addAction(self.tr("Open"))
             act2.setData(v)
-            act2.triggered.connect(
-                lambda: self.__openBookmark(act2))
+            act2.triggered.connect(lambda: self.__openBookmark(act2))
             act2 = menu.addAction(self.tr("Open in New Tab\tCtrl+LMB"))
             act2.setData(v)
-            act2.triggered.connect(
-                lambda: self.__openBookmarkInNewTab(act2))
+            act2.triggered.connect(lambda: self.__openBookmarkInNewTab(act2))
             act2 = menu.addAction(self.tr("Open in New Window"))
             act2.setData(v)
-            act2.triggered.connect(
-                lambda: self.__openBookmarkInNewWindow(act2))
+            act2.triggered.connect(lambda: self.__openBookmarkInNewWindow(act2))
             act2 = menu.addAction(self.tr("Open in New Private Window"))
             act2.setData(v)
-            act2.triggered.connect(
-                lambda: self.__openBookmarkInPrivateWindow(act2))
+            act2.triggered.connect(lambda: self.__openBookmarkInPrivateWindow(act2))
             menu.addSeparator()
-            
+
             act2 = menu.addAction(self.tr("Remove"))
             act2.setData(v)
             act2.triggered.connect(lambda: self.__removeBookmark(act2))
             menu.addSeparator()
-            
+
             act2 = menu.addAction(self.tr("Properties..."))
             act2.setData(v)
             act2.triggered.connect(lambda: self.__edit(act2))
-            
+
             execAct = menu.exec(QCursor.pos())
             if execAct is not None:
                 self.close()
@@ -197,121 +196,125 @@
                 while parent is not None and isinstance(parent, QMenu):
                     parent.close()
                     parent = parent.parent()
-    
+
     def __openBookmark(self, act):
         """
         Private slot to open a bookmark in the current browser tab.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.openUrl.emit(
-            idx.data(BookmarksModel.UrlRole),
-            idx.data(Qt.ItemDataRole.DisplayRole))
+            idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+        )
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInNewTab(self, act):
         """
         Private slot to open a bookmark in a new browser tab.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.newTab.emit(
-            idx.data(BookmarksModel.UrlRole),
-            idx.data(Qt.ItemDataRole.DisplayRole))
+            idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+        )
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInNewWindow(self, act):
         """
         Private slot to open a bookmark in a new window.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
         url = idx.data(BookmarksModel.UrlRole)
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.mainWindow().newWindow(url)
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInPrivateWindow(self, act):
         """
         Private slot to open a bookmark in a new private window.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
         url = idx.data(BookmarksModel.UrlRole)
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.mainWindow().newPrivateWindow(url)
         self.__updateVisitCount(idx)
-    
+
     def __removeBookmark(self, act):
         """
         Private slot to remove a bookmark.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
         self.removeEntry(idx)
-    
+
     def __edit(self, act):
         """
         Private slot to edit a bookmarks properties.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         from .BookmarkPropertiesDialog import BookmarkPropertiesDialog
-        
+
         idx = self.index(act)
         node = self.model().node(idx)
         dlg = BookmarkPropertiesDialog(node)
         dlg.exec()
 
+
 ##############################################################################
 
 
 class BookmarksMenuBarMenu(BookmarksMenu):
     """
     Class implementing a dynamically populated menu for bookmarks.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL with the given title in
         the current tab
     """
+
     openUrl = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         BookmarksMenu.__init__(self, parent)
-        
+
         self.__initialActions = []
-    
+
     def prePopulated(self):
         """
         Public method to add any actions before the tree.
-       
+
         @return flag indicating if any actions were added (boolean)
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         manager = WebBrowserWindow.bookmarksManager()
         self.setModel(manager.bookmarksModel())
         self.setRootIndex(manager.bookmarksModel().nodeIndex(manager.menu()))
-        
+
         # initial actions
         for act in self.__initialActions:
             if act == "--SEPARATOR--":
@@ -320,61 +323,57 @@
                 self.addAction(act)
         if len(self.__initialActions) != 0:
             self.addSeparator()
-        
-        self.createMenu(
-            manager.bookmarksModel().nodeIndex(manager.toolbar()),
-            1, self)
+
+        self.createMenu(manager.bookmarksModel().nodeIndex(manager.toolbar()), 1, self)
         return True
-    
+
     def postPopulated(self):
         """
         Public method to add any actions after the tree.
         """
         if self.isEmpty():
             return
-        
+
         parent = self.rootIndex()
-        
+
         hasBookmarks = False
-        
+
         for i in range(parent.model().rowCount(parent)):
             child = parent.model().index(i, 0, parent)
-            
+
             if child.data(BookmarksModel.TypeRole) == BookmarkNode.Bookmark:
                 hasBookmarks = True
                 break
-        
+
         if not hasBookmarks:
             return
-        
+
         self.addSeparator()
         act_1 = self.addAction(self.tr("Default Home Page"))
         act_1.setData("eric:home")
-        act_1.triggered.connect(
-            lambda: self.__defaultBookmarkTriggered(act_1))
+        act_1.triggered.connect(lambda: self.__defaultBookmarkTriggered(act_1))
         act_2 = self.addAction(self.tr("Speed Dial"))
         act_2.setData("eric:speeddial")
-        act_2.triggered.connect(
-            lambda: self.__defaultBookmarkTriggered(act_2))
+        act_2.triggered.connect(lambda: self.__defaultBookmarkTriggered(act_2))
         self.addSeparator()
         act_3 = self.addAction(self.tr("Open all in Tabs"))
         act_3.triggered.connect(lambda: self.openAll(act_3))
-    
+
     def setInitialActions(self, actions):
         """
         Public method to set the list of actions that should appear first in
         the menu.
-        
+
         @param actions list of initial actions (list of QAction)
         """
         self.__initialActions = actions[:]
         for act in self.__initialActions:
             self.addAction(act)
-    
+
     def __defaultBookmarkTriggered(self, act):
         """
         Private slot handling the default bookmark menu entries.
-        
+
         @param act reference to the action object
         @type QAction
         """
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,15 @@
 import contextlib
 
 from PyQt6.QtCore import (
-    Qt, QAbstractItemModel, QModelIndex, QUrl, QByteArray, QDataStream,
-    QIODevice, QBuffer, QMimeData
+    Qt,
+    QAbstractItemModel,
+    QModelIndex,
+    QUrl,
+    QByteArray,
+    QDataStream,
+    QIODevice,
+    QBuffer,
+    QMimeData,
 )
 
 import UI.PixmapCache
@@ -21,48 +28,49 @@
     """
     Class implementing the bookmark model.
     """
+
     TypeRole = Qt.ItemDataRole.UserRole + 1
     UrlRole = Qt.ItemDataRole.UserRole + 2
     UrlStringRole = Qt.ItemDataRole.UserRole + 3
     VisitCountRole = Qt.ItemDataRole.UserRole + 4
     SeparatorRole = Qt.ItemDataRole.UserRole + 5
-    
+
     MIMETYPE = "application/bookmarks.xbel"
-    
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the bookmark manager object
             (BookmarksManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__endMacro = False
         self.__bookmarksManager = manager
-        
+
         manager.entryAdded.connect(self.entryAdded)
         manager.entryRemoved.connect(self.entryRemoved)
         manager.entryChanged.connect(self.entryChanged)
-        
+
         self.__headers = [
             self.tr("Title"),
             self.tr("Address"),
         ]
-    
+
     def bookmarksManager(self):
         """
         Public method to get a reference to the bookmarks manager.
-        
+
         @return reference to the bookmarks manager object (BookmarksManager)
         """
         return self.__bookmarksManager
-    
+
     def nodeIndex(self, node):
         """
         Public method to get a model index.
-        
+
         @param node reference to the node to get the index for (BookmarkNode)
         @return model index (QModelIndex)
         """
@@ -70,16 +78,16 @@
         if parent is None:
             return QModelIndex()
         return self.createIndex(parent.children().index(node), 0, node)
-    
+
     def entryAdded(self, node):
         """
         Public slot to add a bookmark node.
-        
+
         @param node reference to the bookmark node to add (BookmarkNode)
         """
         if node is None or node.parent() is None:
             return
-        
+
         parent = node.parent()
         row = parent.children().index(node)
         # node was already added so remove before beginInsertRows is called
@@ -87,11 +95,11 @@
         self.beginInsertRows(self.nodeIndex(parent), row, row)
         parent.add(node, row)
         self.endInsertRows()
-    
+
     def entryRemoved(self, parent, row, node):
         """
         Public slot to remove a bookmark node.
-        
+
         @param parent reference to the parent bookmark node (BookmarkNode)
         @param row row number of the node (integer)
         @param node reference to the bookmark node to remove (BookmarkNode)
@@ -101,20 +109,20 @@
         self.beginRemoveRows(self.nodeIndex(parent), row, row)
         parent.remove(node)
         self.endRemoveRows()
-    
+
     def entryChanged(self, node):
         """
         Public method to change a node.
-        
+
         @param node reference to the bookmark node to change (BookmarkNode)
         """
         idx = self.nodeIndex(node)
         self.dataChanged.emit(idx, idx)
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove bookmarks from the model.
-        
+
         @param row row of the first bookmark to remove (integer)
         @param count number of bookmarks to remove (integer)
         @param parent index of the parent bookmark node (QModelIndex)
@@ -122,135 +130,133 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if row < 0 or count <= 0 or row + count > self.rowCount(parent):
             return False
-        
+
         bookmarkNode = self.node(parent)
-        children = bookmarkNode.children()[row:(row + count)]
+        children = bookmarkNode.children()[row : (row + count)]
         for node in children:
             if node in (
                 self.__bookmarksManager.menu(),
-                self.__bookmarksManager.toolbar()
+                self.__bookmarksManager.toolbar(),
             ):
                 continue
             self.__bookmarksManager.removeBookmark(node)
-        
+
         if self.__endMacro:
             self.__bookmarksManager.undoRedoStack().endMacro()
             self.__endMacro = False
-        
+
         return True
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
         return QAbstractItemModel.headerData(self, section, orientation, role)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index of bookmark to get data for (QModelIndex)
         @param role data role (integer)
         @return bookmark data
         """
         if not index.isValid() or index.model() != self:
             return None
-        
+
         from .BookmarkNode import BookmarkNode
-        
+
         bookmarkNode = self.node(index)
         if role in [Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole]:
             if bookmarkNode.type() == BookmarkNode.Separator:
                 if index.column() == 0:
-                    return 50 * '\xB7'
+                    return 50 * "\xB7"
                 elif index.column() == 1:
                     return ""
-            
+
             if index.column() == 0:
                 return bookmarkNode.title
             elif index.column() == 1:
                 return bookmarkNode.url
-        
+
         elif role == BookmarksModel.UrlRole:
             return QUrl(bookmarkNode.url)
-        
+
         elif role == BookmarksModel.UrlStringRole:
             return bookmarkNode.url
-        
+
         elif role == BookmarksModel.VisitCountRole:
             return bookmarkNode.visitCount
-        
+
         elif role == BookmarksModel.TypeRole:
             return bookmarkNode.type()
-        
+
         elif role == BookmarksModel.SeparatorRole:
             return bookmarkNode.type() == BookmarkNode.Separator
-        
-        elif (
-            role == Qt.ItemDataRole.DecorationRole and
-            index.column() == 0
-        ):
+
+        elif role == Qt.ItemDataRole.DecorationRole and index.column() == 0:
             if bookmarkNode.type() == BookmarkNode.Folder:
                 return UI.PixmapCache.getIcon("dirOpen")
             import WebBrowser.WebBrowserWindow
+
             return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
-                QUrl(bookmarkNode.url))
-        
+                QUrl(bookmarkNode.url)
+            )
+
         return None
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.column() > 0:
             return 0
         else:
             return len(self.__headers)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to determine the number of rows.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.column() > 0:
             return 0
-        
+
         if not parent.isValid():
             return len(self.__bookmarksManager.bookmarks().children())
-        
+
         itm = parent.internalPointer()
         return len(itm.children())
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to get a model index for a node cell.
-        
+
         @param row row number (integer)
         @param column column number (integer)
         @param parent index of the parent (QModelIndex)
@@ -258,129 +264,124 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if (
-            row < 0 or
-            column < 0 or
-            row >= self.rowCount(parent) or
-            column >= self.columnCount(parent)
+            row < 0
+            or column < 0
+            or row >= self.rowCount(parent)
+            or column >= self.columnCount(parent)
         ):
             return QModelIndex()
-        
+
         parentNode = self.node(parent)
         return self.createIndex(row, column, parentNode.children()[row])
-    
+
     def parent(self, index=None):
         """
         Public method to get the index of the parent node.
-        
+
         @param index index of the child node (QModelIndex)
         @return index of the parent node (QModelIndex)
         """
         if index is None:
             index = QModelIndex()
-        
+
         if not index.isValid():
             return QModelIndex()
-        
+
         itemNode = self.node(index)
         parentNode = itemNode.parent() if itemNode else None
-        
-        if (
-            parentNode is None or
-            parentNode == self.__bookmarksManager.bookmarks()
-        ):
+
+        if parentNode is None or parentNode == self.__bookmarksManager.bookmarks():
             return QModelIndex()
-        
+
         # get the parent's row
         grandParentNode = parentNode.parent()
         parentRow = grandParentNode.children().index(parentNode)
         return self.createIndex(parentRow, 0, parentNode)
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check, if a parent node has some children.
-        
+
         @param parent index of the parent node (QModelIndex)
         @return flag indicating the presence of children (boolean)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if not parent.isValid():
             return True
-        
+
         from .BookmarkNode import BookmarkNode
+
         parentNode = self.node(parent)
         return parentNode.type() == BookmarkNode.Folder
-    
+
     def flags(self, index):
         """
         Public method to get flags for a node cell.
-        
+
         @param index index of the node cell (QModelIndex)
         @return flags (Qt.ItemFlags)
         """
         if not index.isValid():
             return Qt.ItemFlag.NoItemFlags
-        
+
         node = self.node(index)
         type_ = node.type()
         flags = Qt.ItemFlag.ItemIsSelectable | Qt.ItemFlag.ItemIsEnabled
-        
+
         if self.hasChildren(index):
             flags |= Qt.ItemFlag.ItemIsDropEnabled
-        
-        if node in (
-            self.__bookmarksManager.menu(),
-            self.__bookmarksManager.toolbar()
-        ):
+
+        if node in (self.__bookmarksManager.menu(), self.__bookmarksManager.toolbar()):
             return flags
-        
+
         flags |= Qt.ItemFlag.ItemIsDragEnabled
-        
+
         from .BookmarkNode import BookmarkNode
-        if (
-            (index.column() == 0 and type_ != BookmarkNode.Separator) or
-            (index.column() == 1 and type_ == BookmarkNode.Bookmark)
+
+        if (index.column() == 0 and type_ != BookmarkNode.Separator) or (
+            index.column() == 1 and type_ == BookmarkNode.Bookmark
         ):
             flags |= Qt.ItemFlag.ItemIsEditable
-        
+
         return flags
-    
+
     def supportedDropActions(self):
         """
         Public method to report the supported drop actions.
-        
+
         @return supported drop actions (Qt.DropAction)
         """
         return Qt.DropAction.CopyAction | Qt.DropAction.MoveAction
-    
+
     def mimeTypes(self):
         """
         Public method to report the supported mime types.
-        
+
         @return supported mime types (list of strings)
         """
         return [self.MIMETYPE, "text/uri-list"]
-    
+
     def mimeData(self, indexes):
         """
         Public method to return the mime data.
-        
+
         @param indexes list of indexes (QModelIndexList)
         @return mime data (QMimeData)
         """
         from .XbelWriter import XbelWriter
-        
+
         data = QByteArray()
         stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly)
         urls = []
-        
+
         for index in indexes:
             if index.column() != 0 or not index.isValid():
                 continue
-            
+
             encodedData = QByteArray()
             buffer = QBuffer(encodedData)
             buffer.open(QIODevice.OpenModeFlag.ReadWrite)
@@ -389,16 +390,16 @@
             writer.write(buffer, parentNode)
             stream << encodedData
             urls.append(index.data(self.UrlRole))
-        
+
         mdata = QMimeData()
         mdata.setData(self.MIMETYPE, data)
         mdata.setUrls(urls)
         return mdata
-    
+
     def dropMimeData(self, data, action, row, column, parent):
         """
         Public method to accept the mime data of a drop action.
-        
+
         @param data reference to the mime data (QMimeData)
         @param action drop action requested (Qt.DropAction)
         @param row row number (integer)
@@ -408,71 +409,69 @@
         """
         if action == Qt.DropAction.IgnoreAction:
             return True
-        
+
         if column > 0:
             return False
-        
+
         parentNode = self.node(parent)
-        
+
         if not data.hasFormat(self.MIMETYPE):
             if not data.hasUrls():
                 return False
-            
+
             from .BookmarkNode import BookmarkNode
+
             node = BookmarkNode(BookmarkNode.Bookmark, parentNode)
             node.url = bytes(data.urls()[0].toEncoded()).decode()
-            
+
             if data.hasText():
                 node.title = data.text()
             else:
                 node.title = node.url
-            
+
             self.__bookmarksManager.addBookmark(parentNode, node, row)
             return True
-        
+
         ba = data.data(self.MIMETYPE)
         stream = QDataStream(ba, QIODevice.OpenModeFlag.ReadOnly)
         if stream.atEnd():
             return False
-        
+
         undoStack = self.__bookmarksManager.undoRedoStack()
         undoStack.beginMacro("Move Bookmarks")
-        
+
         from .XbelReader import XbelReader
+
         while not stream.atEnd():
             encodedData = QByteArray()
             stream >> encodedData
             buffer = QBuffer(encodedData)
             buffer.open(QIODevice.OpenModeFlag.ReadOnly)
-            
+
             reader = XbelReader()
             rootNode = reader.read(buffer)
             for bookmarkNode in rootNode.children():
                 rootNode.remove(bookmarkNode)
                 row = max(0, row)
-                self.__bookmarksManager.addBookmark(
-                    parentNode, bookmarkNode, row)
+                self.__bookmarksManager.addBookmark(parentNode, bookmarkNode, row)
                 self.__endMacro = True
-        
+
         return True
-    
+
     def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
         """
         Public method to set the data of a node cell.
-        
+
         @param index index of the node cell (QModelIndex)
         @param value value to be set
         @param role role of the data (integer)
         @return flag indicating success (boolean)
         """
-        if (
-            not index.isValid() or
-            (self.flags(index) & Qt.ItemFlag.ItemIsEditable) == 0
-        ):
+        if not index.isValid() or (self.flags(index) & Qt.ItemFlag.ItemIsEditable) == 0:
             return False
-        
+
         item = self.node(index)
-        
+
         if role in (Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole):
             if index.column() == 0:
                 self.__bookmarksManager.setTitle(item, value)
@@ -480,25 +479,25 @@
                 self.__bookmarksManager.setUrl(item, value)
             else:
                 return False
-        
+
         elif role == BookmarksModel.UrlRole:
             self.__bookmarksManager.setUrl(item, value.toString())
-        
+
         elif role == BookmarksModel.UrlStringRole:
             self.__bookmarksManager.setUrl(item, value)
-        
+
         elif role == BookmarksModel.VisitCountRole:
             self.__bookmarksManager.setVisitCount(item, value)
-        
+
         else:
             return False
-        
+
         return True
-    
+
     def node(self, index):
         """
         Public method to get a bookmark node given its index.
-        
+
         @param index index of the node (QModelIndex)
         @return bookmark node (BookmarkNode)
         """
--- a/src/eric7/WebBrowser/Bookmarks/BookmarksToolBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/BookmarksToolBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,256 +20,255 @@
 class BookmarksToolBar(EricModelToolBar):
     """
     Class implementing a tool bar showing bookmarks.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newWindow(QUrl, str) emitted to open a URL in a new window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, mainWindow, model, parent=None):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window (WebBrowserWindow)
         @param model reference to the bookmarks model (BookmarksModel)
         @param parent reference to the parent widget (QWidget)
         """
         EricModelToolBar.__init__(
-            self, QCoreApplication.translate("BookmarksToolBar", "Bookmarks"),
-            parent)
-        
+            self, QCoreApplication.translate("BookmarksToolBar", "Bookmarks"), parent
+        )
+
         self.__mw = mainWindow
         self.__bookmarksModel = model
-        
+
         self.__mw.bookmarksManager().bookmarksReloaded.connect(self.__rebuild)
-        
+
         self.setModel(model)
-        self.setRootIndex(model.nodeIndex(
-            self.__mw.bookmarksManager().toolbar()))
-        
+        self.setRootIndex(model.nodeIndex(self.__mw.bookmarksManager().toolbar()))
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
         self.activated.connect(self.__bookmarkActivated)
-        
+
         self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonTextBesideIcon)
-        
+
         self._build()
-    
+
     def __rebuild(self):
         """
         Private slot to rebuild the toolbar.
         """
-        self.__bookmarksModel = (
-            self.__mw.bookmarksManager().bookmarksModel()
-        )
+        self.__bookmarksModel = self.__mw.bookmarksManager().bookmarksModel()
         self.setModel(self.__bookmarksModel)
-        self.setRootIndex(self.__bookmarksModel.nodeIndex(
-            self.__mw.bookmarksManager().toolbar()))
+        self.setRootIndex(
+            self.__bookmarksModel.nodeIndex(self.__mw.bookmarksManager().toolbar())
+        )
         self._build()
-    
+
     def __contextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request.
-        
+
         @param pos position the context menu shall be shown (QPoint)
         """
         act = self.actionAt(pos)
         menu = QMenu()
-        
+
         if act is not None:
             v = act.data()
-            
+
             button = self.widgetForAction(act)
             if button.menu() is None:
                 act2 = menu.addAction(self.tr("Open"))
                 act2.setData(v)
-                act2.triggered.connect(
-                    lambda: self.__openBookmark(act2))
+                act2.triggered.connect(lambda: self.__openBookmark(act2))
                 act2 = menu.addAction(self.tr("Open in New Tab\tCtrl+LMB"))
                 act2.setData(v)
-                act2.triggered.connect(
-                    lambda: self.__openBookmarkInNewTab(act2))
+                act2.triggered.connect(lambda: self.__openBookmarkInNewTab(act2))
                 act2 = menu.addAction(self.tr("Open in New Window"))
                 act2.setData(v)
-                act2.triggered.connect(
-                    lambda: self.__openBookmarkInNewWindow(act2))
+                act2.triggered.connect(lambda: self.__openBookmarkInNewWindow(act2))
                 act2 = menu.addAction(self.tr("Open in New Private Window"))
                 act2.setData(v)
-                act2.triggered.connect(
-                    lambda: self.__openBookmarkInPrivateWindow(act2))
+                act2.triggered.connect(lambda: self.__openBookmarkInPrivateWindow(act2))
                 menu.addSeparator()
-            
+
             act2 = menu.addAction(self.tr("Remove"))
             act2.setData(v)
             act2.triggered.connect(lambda: self.__removeBookmark(act2))
             menu.addSeparator()
-            
+
             act2 = menu.addAction(self.tr("Properties..."))
             act2.setData(v)
             act2.triggered.connect(lambda: self.__edit(act2))
             menu.addSeparator()
-        
+
         menu.addAction(self.tr("Add Bookmark..."), self.__newBookmark)
         menu.addAction(self.tr("Add Folder..."), self.__newFolder)
-        
+
         menu.exec(QCursor.pos())
-    
+
     def __updateVisitCount(self, idx):
         """
         Private method to update the visit count of a bookmark.
-        
+
         @param idx index of the bookmark item (QModelIndex)
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         bookmarkNode = self.model().node(idx)
         manager = WebBrowserWindow.bookmarksManager()
         manager.incVisitCount(bookmarkNode)
-    
+
     def __bookmarkActivated(self, idx):
         """
         Private slot handling the activation of a bookmark.
-        
+
         @param idx index of the activated bookmark (QModelIndex)
         """
         if idx.isValid():
             if self._mouseButton == Qt.MouseButton.XButton1:
                 self.__mw.currentBrowser().triggerPageAction(
-                    QWebEnginePage.WebAction.Back)
+                    QWebEnginePage.WebAction.Back
+                )
             elif self._mouseButton == Qt.MouseButton.XButton2:
                 self.__mw.currentBrowser().triggerPageAction(
-                    QWebEnginePage.WebAction.Forward)
+                    QWebEnginePage.WebAction.Forward
+                )
             elif self._mouseButton == Qt.MouseButton.LeftButton:
-                if (
-                    self._keyboardModifiers &
-                    Qt.KeyboardModifier.ControlModifier
-                ):
+                if self._keyboardModifiers & Qt.KeyboardModifier.ControlModifier:
                     self.newTab.emit(
                         idx.data(BookmarksModel.UrlRole),
-                        idx.data(Qt.ItemDataRole.DisplayRole))
-                elif (
-                    self._keyboardModifiers &
-                    Qt.KeyboardModifier.ShiftModifier
-                ):
+                        idx.data(Qt.ItemDataRole.DisplayRole),
+                    )
+                elif self._keyboardModifiers & Qt.KeyboardModifier.ShiftModifier:
                     self.newWindow.emit(
                         idx.data(BookmarksModel.UrlRole),
-                        idx.data(Qt.ItemDataRole.DisplayRole))
+                        idx.data(Qt.ItemDataRole.DisplayRole),
+                    )
                 else:
                     self.openUrl.emit(
                         idx.data(BookmarksModel.UrlRole),
-                        idx.data(Qt.ItemDataRole.DisplayRole))
+                        idx.data(Qt.ItemDataRole.DisplayRole),
+                    )
                 self.__updateVisitCount(idx)
-    
+
     def __openBookmark(self, act):
         """
         Private slot to open a bookmark in the current browser tab.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.openUrl.emit(
-            idx.data(BookmarksModel.UrlRole),
-            idx.data(Qt.ItemDataRole.DisplayRole))
+            idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+        )
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInNewTab(self, act):
         """
         Private slot to open a bookmark in a new browser tab.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.newTab.emit(
-            idx.data(BookmarksModel.UrlRole),
-            idx.data(Qt.ItemDataRole.DisplayRole))
+            idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+        )
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInNewWindow(self, act):
         """
         Private slot to open a bookmark in a new window.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.newWindow.emit(
-            idx.data(BookmarksModel.UrlRole),
-            idx.data(Qt.ItemDataRole.DisplayRole))
+            idx.data(BookmarksModel.UrlRole), idx.data(Qt.ItemDataRole.DisplayRole)
+        )
         self.__updateVisitCount(idx)
-    
+
     def __openBookmarkInPrivateWindow(self, act):
         """
         Private slot to open a bookmark in a new private window.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
         url = idx.data(BookmarksModel.UrlRole)
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.mainWindow().newPrivateWindow(url)
         self.__updateVisitCount(idx)
-    
+
     def __removeBookmark(self, act):
         """
         Private slot to remove a bookmark.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         idx = self.index(act)
-        
+
         self.__bookmarksModel.removeRow(idx.row(), self.rootIndex())
-    
+
     def __newBookmark(self):
         """
         Private slot to add a new bookmark.
         """
         from .AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         dlg.setCurrentIndex(self.rootIndex())
         dlg.exec()
-    
+
     def __newFolder(self):
         """
         Private slot to add a new bookmarks folder.
         """
         from .AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         dlg.setCurrentIndex(self.rootIndex())
         dlg.setFolder(True)
         dlg.exec()
-    
+
     def _createMenu(self):
         """
         Protected method to create the menu for a tool bar action.
-        
+
         @return menu for a tool bar action (EricModelMenu)
         """
         from .BookmarksMenu import BookmarksMenu
+
         menu = BookmarksMenu(self)
         menu.openUrl.connect(self.openUrl)
         menu.newTab.connect(self.newTab)
         menu.newWindow.connect(self.newWindow)
         return menu
-    
+
     def __edit(self, act):
         """
         Private slot to edit a bookmarks properties.
-        
+
         @param act reference to the triggering action
         @type QAction
         """
         from .BookmarkPropertiesDialog import BookmarkPropertiesDialog
+
         idx = self.index(act)
         node = self.__bookmarksModel.node(idx)
         dlg = BookmarkPropertiesDialog(node)
--- a/src/eric7/WebBrowser/Bookmarks/NsHtmlReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/NsHtmlReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,14 +20,15 @@
     """
     Class implementing a reader object for Netscape HTML bookmark files.
     """
+
     indentSize = 4
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__folderRx = re.compile("<DT><H3(.*?)>(.*?)</H3>", re.IGNORECASE)
         self.__endFolderRx = re.compile("</DL>", re.IGNORECASE)
         self.__bookmarkRx = re.compile("<DT><A(.*?)>(.*?)</A>", re.IGNORECASE)
@@ -35,15 +36,14 @@
         self.__separatorRx = re.compile("<HR>", re.IGNORECASE)
         self.__urlRx = re.compile('HREF="(.*?)"', re.IGNORECASE)
         self.__addedRx = re.compile(r'ADD_DATE="(\d*?)"', re.IGNORECASE)
-        self.__modifiedRx = re.compile(r'LAST_MODIFIED="(\d*?)"',
-                                       re.IGNORECASE)
+        self.__modifiedRx = re.compile(r'LAST_MODIFIED="(\d*?)"', re.IGNORECASE)
         self.__visitedRx = re.compile(r'LAST_VISIT="(\d*?)"', re.IGNORECASE)
         self.__foldedRx = re.compile("FOLDED", re.IGNORECASE)
-    
+
     def read(self, fileNameOrDevice):
         """
         Public method to read a Netscape HTML bookmark file.
-        
+
         @param fileNameOrDevice name of the file to read (string)
             or reference to the device to read (QIODevice)
         @return reference to the root node (BookmarkNode)
@@ -56,25 +56,25 @@
                 return BookmarkNode(BookmarkNode.Root)
             f.open(QIODevice.OpenModeFlag.ReadOnly)
             dev = f
-        
+
         folders = []
         lastNode = None
-        
+
         root = BookmarkNode(BookmarkNode.Root)
         folders.append(root)
-        
+
         while not dev.atEnd():
             line = str(dev.readLine(), encoding="utf-8").rstrip()
             match = (
-                self.__folderRx.search(line) or
-                self.__endFolderRx.search(line) or
-                self.__bookmarkRx.search(line) or
-                self.__descRx.search(line) or
-                self.__separatorRx.search(line)
+                self.__folderRx.search(line)
+                or self.__endFolderRx.search(line)
+                or self.__bookmarkRx.search(line)
+                or self.__descRx.search(line)
+                or self.__separatorRx.search(line)
             )
             if match is None:
                 continue
-            
+
             if match.re is self.__folderRx:
                 # folder definition
                 arguments = match.group(1)
@@ -84,15 +84,14 @@
                 node.expanded = self.__foldedRx.search(arguments) is None
                 addedMatch = self.__addedRx.search(arguments)
                 if addedMatch is not None:
-                    node.added = QDateTime.fromSecsSinceEpoch(
-                        int(addedMatch.group(1)))
+                    node.added = QDateTime.fromSecsSinceEpoch(int(addedMatch.group(1)))
                 folders.append(node)
                 lastNode = node
-            
+
             elif match.re is self.__endFolderRx:
                 # end of folder definition
                 folders.pop()
-            
+
             elif match.re is self.__bookmarkRx:
                 # bookmark definition
                 arguments = match.group(1)
@@ -104,26 +103,22 @@
                     node.url = match1.group(1)
                 match1 = self.__addedRx.search(arguments)
                 if match1 is not None:
-                    node.added = QDateTime.fromSecsSinceEpoch(
-                        int(match1.group(1)))
+                    node.added = QDateTime.fromSecsSinceEpoch(int(match1.group(1)))
                 match1 = self.__modifiedRx.search(arguments)
                 if match1 is not None:
-                    node.modified = QDateTime.fromSecsSinceEpoch(
-                        int(match1.group(1)))
+                    node.modified = QDateTime.fromSecsSinceEpoch(int(match1.group(1)))
                 match1 = self.__visitedRx.search(arguments)
                 if match1 is not None:
-                    node.visited = QDateTime.fromSecsSinceEpoch(
-                        int(match1.group(1)))
+                    node.visited = QDateTime.fromSecsSinceEpoch(int(match1.group(1)))
                 lastNode = node
-            
+
             elif match.re is self.__descRx:
                 # description
                 if lastNode:
-                    lastNode.desc = Utilities.html_udecode(
-                        match.group(1))
-            
+                    lastNode.desc = Utilities.html_udecode(match.group(1))
+
             elif match.re is self.__separatorRx:
                 # separator definition
                 BookmarkNode(BookmarkNode.Separator, folders[-1])
-        
+
         return root
--- a/src/eric7/WebBrowser/Bookmarks/NsHtmlWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/NsHtmlWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,18 +19,19 @@
     Class implementing a writer object to generate Netscape HTML bookmark
     files.
     """
+
     indentSize = 4
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def write(self, fileNameOrDevice, root):
         """
         Public method to write an Netscape HTML bookmark file.
-        
+
         @param fileNameOrDevice name of the file to write (string)
             or device to write to (QIODevice)
         @param root root node of the bookmark tree (BookmarkNode)
@@ -42,14 +43,14 @@
             f = QFile(fileNameOrDevice)
             if root is None or not f.open(QIODevice.OpenModeFlag.WriteOnly):
                 return False
-        
+
         self.__dev = f
         return self.__write(root)
-    
+
     def __write(self, root):
         """
         Private method to write an Netscape HTML bookmark file.
-        
+
         @param root root node of the bookmark tree (BookmarkNode)
         @return flag indicating success (boolean)
         """
@@ -58,12 +59,13 @@
             "<!-- This is an automatically generated file.\n"
             "     It will be read and overwritten.\n"
             "     DO NOT EDIT! -->\n"
-            "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;"
-            " charset=UTF-8\">\n"
+            '<META HTTP-EQUIV="Content-Type" CONTENT="text/html;'
+            ' charset=UTF-8">\n'
             "<TITLE>Bookmarks</TITLE>\n"
             "<H1>Bookmarks</H1>\n"
             "\n"
-            "<DL><p>\n")
+            "<DL><p>\n"
+        )
         if root.type() == BookmarkNode.Root:
             for child in root.children():
                 self.__writeItem(child, self.indentSize)
@@ -71,11 +73,11 @@
             self.__writeItem(root, self.indentSize)
         self.__dev.write("</DL><p>\n")
         return True
-    
+
     def __writeItem(self, node, indent):
         """
         Private method to write an entry for a node.
-        
+
         @param node reference to the node to be written (BookmarkNode)
         @param indent size of the indentation (integer)
         """
@@ -85,80 +87,85 @@
             self.__writeBookmark(node, indent)
         elif node.type() == BookmarkNode.Separator:
             self.__writeSeparator(indent)
-    
+
     def __writeSeparator(self, indent):
         """
         Private method to write a separator.
-        
+
         @param indent size of the indentation (integer)
         """
         self.__dev.write(" " * indent)
         self.__dev.write("<HR>\n")
-    
+
     def __writeBookmark(self, node, indent):
         """
         Private method to write a bookmark node.
-        
+
         @param node reference to the node to be written (BookmarkNode)
         @param indent size of the indentation (integer)
         """
         added = (
-            " ADD_DATE=\"{0}\"".format(node.added.toTime_t())
-            if node.added.isValid() else
-            ""
+            ' ADD_DATE="{0}"'.format(node.added.toTime_t())
+            if node.added.isValid()
+            else ""
         )
         modified = (
-            " LAST_MODIFIED=\"{0}\"".format(node.modified.toTime_t())
-            if node.modified.isValid() else
-            ""
+            ' LAST_MODIFIED="{0}"'.format(node.modified.toTime_t())
+            if node.modified.isValid()
+            else ""
         )
         visited = (
-            " LAST_VISIT=\"{0}\"".format(node.visited.toTime_t())
-            if node.visited.isValid() else
-            ""
+            ' LAST_VISIT="{0}"'.format(node.visited.toTime_t())
+            if node.visited.isValid()
+            else ""
         )
-        
+
         self.__dev.write(" " * indent)
-        self.__dev.write("<DT><A HREF=\"{0}\"{1}{2}{3}>{4}</A>\n".format(
-            node.url, added, modified, visited,
-            Utilities.html_uencode(node.title)
-        ))
-        
+        self.__dev.write(
+            '<DT><A HREF="{0}"{1}{2}{3}>{4}</A>\n'.format(
+                node.url, added, modified, visited, Utilities.html_uencode(node.title)
+            )
+        )
+
         if node.desc:
             self.__dev.write(" " * indent)
-            self.__dev.write("<DD>{0}\n".format(
-                Utilities.html_uencode("".join(node.desc.splitlines()))))
-    
+            self.__dev.write(
+                "<DD>{0}\n".format(
+                    Utilities.html_uencode("".join(node.desc.splitlines()))
+                )
+            )
+
     def __writeFolder(self, node, indent):
         """
         Private method to write a bookmark node.
-        
+
         @param node reference to the node to be written (BookmarkNode)
         @param indent size of the indentation (integer)
         """
         folded = "" if node.expanded else " FOLDED"
-        
+
         added = (
-            " ADD_DATE=\"{0}\"".format(node.added.toTime_t())
-            if node.added.isValid() else
-            ""
+            ' ADD_DATE="{0}"'.format(node.added.toTime_t())
+            if node.added.isValid()
+            else ""
         )
-        
+
         self.__dev.write(" " * indent)
-        self.__dev.write("<DT><H3{0}{1}>{2}</H3>\n".format(
-            folded, added, Utilities.html_uencode(node.title)
-        ))
-        
+        self.__dev.write(
+            "<DT><H3{0}{1}>{2}</H3>\n".format(
+                folded, added, Utilities.html_uencode(node.title)
+            )
+        )
+
         if node.desc:
             self.__dev.write(" " * indent)
-            self.__dev.write("<DD>{0}\n".format(
-                "".join(node.desc.splitlines())))
-        
+            self.__dev.write("<DD>{0}\n".format("".join(node.desc.splitlines())))
+
         self.__dev.write(" " * indent)
         self.__dev.write("<DL><p>\n")
-        
+
         for child in node.children():
             self.__writeItem(child, indent + self.indentSize)
-        
+
         self.__dev.write(" " * indent)
         self.__dev.write("</DL><p>\n")
--- a/src/eric7/WebBrowser/Bookmarks/XbelReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/XbelReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,8 +8,14 @@
 """
 
 from PyQt6.QtCore import (
-    QXmlStreamReader, QXmlStreamEntityResolver, QIODevice, QFile,
-    QCoreApplication, QXmlStreamNamespaceDeclaration, QDateTime, Qt
+    QXmlStreamReader,
+    QXmlStreamEntityResolver,
+    QIODevice,
+    QFile,
+    QCoreApplication,
+    QXmlStreamNamespaceDeclaration,
+    QDateTime,
+    Qt,
 )
 
 from .BookmarkNode import BookmarkNode
@@ -19,10 +25,11 @@
     """
     Class implementing an XML entity resolver for bookmark files.
     """
+
     def resolveUndeclaredEntity(self, entity):
         """
         Public method to resolve undeclared entities.
-        
+
         @param entity entity to be resolved (string)
         @return resolved entity (string)
         """
@@ -35,19 +42,20 @@
     """
     Class implementing a reader object for XBEL bookmark files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__resolver = XmlEntityResolver()
         self.setEntityResolver(self.__resolver)
-    
+
     def read(self, fileNameOrDevice):
         """
         Public method to read an XBEL bookmark file.
-        
+
         @param fileNameOrDevice name of the file to read (string)
             or reference to the device to read (QIODevice)
         @return reference to the root node (BookmarkNode)
@@ -60,38 +68,37 @@
                 return BookmarkNode(BookmarkNode.Root)
             f.open(QIODevice.OpenModeFlag.ReadOnly)
             self.setDevice(f)
-        
+
         root = BookmarkNode(BookmarkNode.Root)
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 version = self.attributes().value("version")
-                if (
-                    self.name() == "xbel" and
-                    (not version or version == "1.0")
-                ):
+                if self.name() == "xbel" and (not version or version == "1.0"):
                     self.__readXBEL(root)
                 else:
-                    self.raiseError(QCoreApplication.translate(
-                        "XbelReader",
-                        "The file is not an XBEL version 1.0 file."))
-        
+                    self.raiseError(
+                        QCoreApplication.translate(
+                            "XbelReader", "The file is not an XBEL version 1.0 file."
+                        )
+                    )
+
         return root
-    
+
     def __readXBEL(self, node):
         """
         Private method to read and parse the XBEL file.
-        
+
         @param node reference to the node to attach to (BookmarkNode)
         """
         if not self.isStartElement() and self.name() != "xbel":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "folder":
                     self.__readFolder(node)
@@ -101,26 +108,27 @@
                     self.__readSeparator(node)
                 else:
                     self.__skipUnknownElement()
-    
+
     def __readFolder(self, node):
         """
         Private method to read and parse a folder subtree.
-        
+
         @param node reference to the node to attach to (BookmarkNode)
         """
         if not self.isStartElement() and self.name() != "folder":
             return
-        
+
         folder = BookmarkNode(BookmarkNode.Folder, node)
         folder.expanded = self.attributes().value("folded") == "no"
         folder.added = QDateTime.fromString(
-            self.attributes().value("added"), Qt.DateFormat.ISODate)
-        
+            self.attributes().value("added"), Qt.DateFormat.ISODate
+        )
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "title":
                     self.__readTitle(folder)
@@ -136,81 +144,85 @@
                     self.__readInfo()
                 else:
                     self.__skipUnknownElement()
-    
+
     def __readTitle(self, node):
         """
         Private method to read the title element.
-        
+
         @param node reference to the bookmark node title belongs to
             (BookmarkNode)
         """
         if not self.isStartElement() and self.name() != "title":
             return
-        
+
         node.title = self.readElementText()
-    
+
     def __readDescription(self, node):
         """
         Private method to read the desc element.
-        
+
         @param node reference to the bookmark node desc belongs to
             (BookmarkNode)
         """
         if not self.isStartElement() and self.name() != "desc":
             return
-        
+
         node.desc = self.readElementText()
-    
+
     def __readSeparator(self, node):
         """
         Private method to read a separator element.
-        
+
         @param node reference to the bookmark node the separator belongs to
             (BookmarkNode)
         """
         sep = BookmarkNode(BookmarkNode.Separator, node)
         sep.added = QDateTime.fromString(
-            self.attributes().value("added"), Qt.DateFormat.ISODate)
-        
+            self.attributes().value("added"), Qt.DateFormat.ISODate
+        )
+
         # empty elements have a start and end element
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "info":
                     self.__readInfo()
                 else:
                     self.__skipUnknownElement()
-    
+
     def __readBookmarkNode(self, node):
         """
         Private method to read and parse a bookmark subtree.
-        
+
         @param node reference to the node to attach to (BookmarkNode)
         """
         if not self.isStartElement() and self.name() != "bookmark":
             return
-        
+
         bookmark = BookmarkNode(BookmarkNode.Bookmark, node)
         bookmark.url = self.attributes().value("href")
         bookmark.added = QDateTime.fromString(
-            self.attributes().value("added"), Qt.DateFormat.ISODate)
+            self.attributes().value("added"), Qt.DateFormat.ISODate
+        )
         bookmark.modified = QDateTime.fromString(
-            self.attributes().value("modified"), Qt.DateFormat.ISODate)
+            self.attributes().value("modified"), Qt.DateFormat.ISODate
+        )
         bookmark.visited = QDateTime.fromString(
-            self.attributes().value("visited"), Qt.DateFormat.ISODate)
+            self.attributes().value("visited"), Qt.DateFormat.ISODate
+        )
         try:
             bookmark.visitCount = int(self.attributes().value("visitCount"))
         except ValueError:
             bookmark.visitCount = 0
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "title":
                     self.__readTitle(bookmark)
@@ -220,19 +232,19 @@
                     self.__readInfo()
                 else:
                     self.__skipUnknownElement()
-        
+
         if not bookmark.title:
-            bookmark.title = QCoreApplication.translate(
-                "XbelReader", "Unknown title")
-    
+            bookmark.title = QCoreApplication.translate("XbelReader", "Unknown title")
+
     def __readInfo(self):
         """
         Private method to read and parse an info subtree.
         """
-        self.addExtraNamespaceDeclaration(QXmlStreamNamespaceDeclaration(
-            "bookmark", "http://www.python.org"))
+        self.addExtraNamespaceDeclaration(
+            QXmlStreamNamespaceDeclaration("bookmark", "http://www.python.org")
+        )
         self.skipCurrentElement()
-    
+
     def __skipUnknownElement(self):
         """
         Private method to skip over all unknown elements.
--- a/src/eric7/WebBrowser/Bookmarks/XbelWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Bookmarks/XbelWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,18 +16,19 @@
     """
     Class implementing a writer object to generate XBEL bookmark files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.setAutoFormatting(True)
-    
+
     def write(self, fileNameOrDevice, root):
         """
         Public method to write an XBEL bookmark file.
-        
+
         @param fileNameOrDevice name of the file to write (string)
             or device to write to (QIODevice)
         @param root root node of the bookmark tree (BookmarkNode)
@@ -39,14 +40,14 @@
             f = QFile(fileNameOrDevice)
             if root is None or not f.open(QIODevice.OpenModeFlag.WriteOnly):
                 return False
-        
+
         self.setDevice(f)
         return self.__write(root)
-    
+
     def __write(self, root):
         """
         Private method to write an XBEL bookmark file.
-        
+
         @param root root node of the bookmark tree (BookmarkNode)
         @return flag indicating success (boolean)
         """
@@ -59,21 +60,20 @@
                 self.__writeItem(child)
         else:
             self.__writeItem(root)
-        
+
         self.writeEndDocument()
         return True
-    
+
     def __writeItem(self, node):
         """
         Private method to write an entry for a node.
-        
+
         @param node reference to the node to be written (BookmarkNode)
         """
         if node.type() == BookmarkNode.Folder:
             self.writeStartElement("folder")
             if node.added.isValid():
-                self.writeAttribute("added",
-                                    node.added.toString(Qt.DateFormat.ISODate))
+                self.writeAttribute("added", node.added.toString(Qt.DateFormat.ISODate))
             self.writeAttribute("folded", node.expanded and "no" or "yes")
             self.writeTextElement("title", node.title)
             for child in node.children():
@@ -84,14 +84,15 @@
             if node.url:
                 self.writeAttribute("href", node.url)
             if node.added.isValid():
-                self.writeAttribute("added",
-                                    node.added.toString(Qt.DateFormat.ISODate))
+                self.writeAttribute("added", node.added.toString(Qt.DateFormat.ISODate))
             if node.modified.isValid():
                 self.writeAttribute(
-                    "modified", node.modified.toString(Qt.DateFormat.ISODate))
+                    "modified", node.modified.toString(Qt.DateFormat.ISODate)
+                )
             if node.visited.isValid():
                 self.writeAttribute(
-                    "visited", node.visited.toString(Qt.DateFormat.ISODate))
+                    "visited", node.visited.toString(Qt.DateFormat.ISODate)
+                )
             self.writeAttribute("visitCount", str(node.visitCount))
             self.writeTextElement("title", node.title)
             if node.desc:
@@ -100,5 +101,4 @@
         elif node.type() == BookmarkNode.Separator:
             self.writeEmptyElement("separator")
             if node.added.isValid():
-                self.writeAttribute("added",
-                                    node.added.toString(Qt.DateFormat.ISODate))
+                self.writeAttribute("added", node.added.toString(Qt.DateFormat.ISODate))
--- a/src/eric7/WebBrowser/ClosedTabsManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/ClosedTabsManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,10 +14,11 @@
     """
     Class implementing a structure to store data about a closed tab.
     """
+
     def __init__(self, url=None, title="", position=-1):
         """
         Constructor
-        
+
         @param url URL of the closed tab (QUrl)
         @param title title of the closed tab (string)
         @param position index of the closed tab (integer)
@@ -25,93 +26,94 @@
         self.url = QUrl() if url is None else QUrl(url)
         self.title = title
         self.position = position
-    
+
     def __eq__(self, other):
         """
         Special method implementing the equality operator.
-        
+
         @param other reference to the object to compare against (ClosedTab)
         @return flag indicating equality of the tabs (boolean)
         """
         return (
-            self.url == other.url and
-            self.title == other.title and
-            self.position == other.position
+            self.url == other.url
+            and self.title == other.title
+            and self.position == other.position
         )
 
 
 class ClosedTabsManager(QObject):
     """
     Class implementing a manager for closed tabs.
-    
+
     @signal closedTabAvailable(boolean) emitted to signal a change of
         availability of closed tabs
     """
+
     closedTabAvailable = pyqtSignal(bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__()
-        
+
         self.__closedTabs = []
-    
+
     def recordBrowser(self, browser, position):
         """
         Public method to record the data of a browser about to be closed.
-        
+
         @param browser reference to the browser to be closed (HelpBrowser)
         @param position index of the tab to be closed (integer)
         """
         import WebBrowser.WebBrowserWindow
+
         if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
             return
-        
+
         if browser.url().isEmpty():
             return
-        
+
         tab = ClosedTab(browser.url(), browser.title(), position)
         self.__closedTabs.insert(0, tab)
         self.closedTabAvailable.emit(True)
-    
+
     def getClosedTabAt(self, index):
         """
         Public method to get the indexed closed tab.
-        
+
         @param index index of the tab to return (integer)
         @return requested tab (ClosedTab)
         """
         tab = (
             self.__closedTabs.pop(index)
-            if (len(self.__closedTabs) > 0 and
-                len(self.__closedTabs) > index) else
-            ClosedTab()
+            if (len(self.__closedTabs) > 0 and len(self.__closedTabs) > index)
+            else ClosedTab()
         )
         self.closedTabAvailable.emit(len(self.__closedTabs) > 0)
         return tab
-    
+
     def isClosedTabAvailable(self):
         """
         Public method to check for closed tabs.
-        
+
         @return flag indicating the availability of closed tab data (boolean)
         """
         return len(self.__closedTabs) > 0
-    
+
     def clearList(self):
         """
         Public method to clear the list of closed tabs.
         """
         self.__closedTabs = []
         self.closedTabAvailable.emit(False)
-    
+
     def allClosedTabs(self):
         """
         Public method to get a list of all closed tabs.
-        
+
         @return list of closed tabs (list of ClosedTab)
         """
         return self.__closedTabs
--- a/src/eric7/WebBrowser/CookieJar/CookieExceptionsModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/CookieJar/CookieExceptionsModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,29 +15,30 @@
     """
     Class implementing the cookie exceptions model.
     """
+
     def __init__(self, cookieJar, parent=None):
         """
         Constructor
-        
+
         @param cookieJar reference to the cookie jar (CookieJar)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__cookieJar = cookieJar
         self.__allowedCookies = self.__cookieJar.allowedCookies()
         self.__blockedCookies = self.__cookieJar.blockedCookies()
         self.__sessionCookies = self.__cookieJar.allowForSessionCookies()
-        
+
         self.__headers = [
             self.tr("Website"),
             self.tr("Status"),
         ]
-    
+
     def headerData(self, section, orientation, role):
         """
         Public method to get header data from the model.
-        
+
         @param section section number (integer)
         @param orientation orientation (Qt.Orientation)
         @param role role of the data to retrieve (Qt.ItemDataRole)
@@ -48,36 +49,36 @@
             height = fm.height() + fm.height() // 3
             try:
                 width = fm.horizontalAdvance(
-                    self.headerData(section, orientation,
-                                    Qt.ItemDataRole.DisplayRole))
+                    self.headerData(section, orientation, Qt.ItemDataRole.DisplayRole)
+                )
             except AttributeError:
                 width = fm.width(
-                    self.headerData(section, orientation,
-                                    Qt.ItemDataRole.DisplayRole))
+                    self.headerData(section, orientation, Qt.ItemDataRole.DisplayRole)
+                )
             return QSize(width, height)
-        
+
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             try:
                 return self.__headers[section]
             except IndexError:
                 return None
-        
+
         return QAbstractTableModel.headerData(self, section, orientation, role)
-    
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         if index.row() < 0 or index.row() >= self.rowCount():
             return None
-        
+
         if role in (Qt.ItemDataRole.DisplayRole, Qt.ItemDataRole.EditRole):
             row = index.row()
             if row < len(self.__allowedCookies):
@@ -87,7 +88,7 @@
                     return self.tr("Allow")
                 else:
                     return None
-            
+
             row -= len(self.__allowedCookies)
             if row < len(self.__blockedCookies):
                 if index.column() == 0:
@@ -96,7 +97,7 @@
                     return self.tr("Block")
                 else:
                     return None
-            
+
             row -= len(self.__blockedCookies)
             if row < len(self.__sessionCookies):
                 if index.column() == 0:
@@ -105,49 +106,49 @@
                     return self.tr("Allow For Session")
                 else:
                     return None
-            
+
             return None
-        
+
         return None
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return len(self.__headers)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid() or self.__cookieJar is None:
             return 0
         else:
             return (
-                len(self.__allowedCookies) +
-                len(self.__blockedCookies) +
-                len(self.__sessionCookies)
+                len(self.__allowedCookies)
+                + len(self.__blockedCookies)
+                + len(self.__sessionCookies)
             )
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row start row (integer)
         @param count number of rows to remove (integer)
         @param parent parent index (QModelIndex)
@@ -155,69 +156,78 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid() or self.__cookieJar is None:
             return False
-        
+
         lastRow = row + count - 1
         self.beginRemoveRows(parent, row, lastRow)
         for i in range(lastRow, row - 1, -1):
             rowToRemove = i
-            
+
             if rowToRemove < len(self.__allowedCookies):
                 del self.__allowedCookies[rowToRemove]
                 continue
-            
+
             rowToRemove -= len(self.__allowedCookies)
             if rowToRemove < len(self.__blockedCookies):
                 del self.__blockedCookies[rowToRemove]
                 continue
-            
+
             rowToRemove -= len(self.__blockedCookies)
             if rowToRemove < len(self.__sessionCookies):
                 del self.__sessionCookies[rowToRemove]
                 continue
-        
+
         self.__cookieJar.setAllowedCookies(self.__allowedCookies)
         self.__cookieJar.setBlockedCookies(self.__blockedCookies)
         self.__cookieJar.setAllowForSessionCookies(self.__sessionCookies)
         self.endRemoveRows()
-        
+
         return True
-    
+
     def addRule(self, host, rule):
         """
         Public method to add an exception rule.
-        
+
         @param host name of the host to add a rule for (string)
         @param rule type of rule to add (CookieJar.Allow, CookieJar.Block or
             CookieJar.AllowForSession)
         """
         if not host:
             return
-        
+
         from .CookieJar import CookieJar
-        
+
         if rule == CookieJar.Allow:
             self.__addHost(
-                host, self.__allowedCookies, self.__blockedCookies,
-                self.__sessionCookies)
+                host,
+                self.__allowedCookies,
+                self.__blockedCookies,
+                self.__sessionCookies,
+            )
             return
         elif rule == CookieJar.Block:
             self.__addHost(
-                host, self.__blockedCookies, self.__allowedCookies,
-                self.__sessionCookies)
+                host,
+                self.__blockedCookies,
+                self.__allowedCookies,
+                self.__sessionCookies,
+            )
             return
         elif rule == CookieJar.AllowForSession:
             self.__addHost(
-                host, self.__sessionCookies, self.__allowedCookies,
-                self.__blockedCookies)
+                host,
+                self.__sessionCookies,
+                self.__allowedCookies,
+                self.__blockedCookies,
+            )
             return
-    
+
     def __addHost(self, host, addList, removeList1, removeList2):
         """
         Private method to add a host to an exception list.
-        
+
         @param host name of the host to add (string)
         @param addList reference to the list to add it to (list of strings)
         @param removeList1 reference to first list to remove it from
@@ -231,20 +241,20 @@
                 removeList1.remove(host)
             if host in removeList2:
                 removeList2.remove(host)
-        
+
         # Avoid to have similar rules (with or without leading dot)
         # e.g. python-projects.org and .python-projects.org
-        otherRule = host[1:] if host.startswith(".") else '.' + host
+        otherRule = host[1:] if host.startswith(".") else "." + host
         if otherRule in addList:
             addList.remove(otherRule)
         if otherRule in removeList1:
             removeList1.remove(otherRule)
         if otherRule in removeList2:
             removeList2.remove(otherRule)
-        
+
         self.__cookieJar.setAllowedCookies(self.__allowedCookies)
         self.__cookieJar.setBlockedCookies(self.__blockedCookies)
         self.__cookieJar.setAllowForSessionCookies(self.__sessionCookies)
-        
+
         self.beginResetModel()
         self.endResetModel()
--- a/src/eric7/WebBrowser/CookieJar/CookieJar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/CookieJar/CookieJar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,11 +23,12 @@
     """
     Class implementing a QNetworkCookieJar subclass with various accept
     policies.
-    
+
     @signal cookiesChanged() emitted after the cookies have been changed
     """
+
     cookiesChanged = pyqtSignal()
-    
+
     AcceptAlways = 0
     AcceptNever = 1
     AcceptOnlyFromSitesNavigatedTo = 2
@@ -36,60 +37,61 @@
     KeepUntilExpire = 0
     KeepUntilExit = 1
     KeepMax = 1
-    
+
     Allow = 0
     Block = 1
     AllowForSession = 2
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__acceptCookies = self.AcceptOnlyFromSitesNavigatedTo
         self.__saveTimer = AutoSaver(self, self.__save)
-        
-        self.__cookiesFile = os.path.join(Utilities.getConfigDir(),
-                                          "web_browser", "cookies.ini")
-        
+
+        self.__cookiesFile = os.path.join(
+            Utilities.getConfigDir(), "web_browser", "cookies.ini"
+        )
+
         self.__store = WebBrowserWindow.webProfile().cookieStore()
         self.__store.setCookieFilter(self.__cookieFilter)
         self.__store.cookieAdded.connect(self.__cookieAdded)
         self.__store.cookieRemoved.connect(self.__cookieRemoved)
-        
+
         self.__load()
         self.__store.loadAllCookies()
-    
+
     def close(self):
         """
         Public slot to close the cookie jar.
         """
         if not self.__loaded:
             self.__load()
-        
+
         if self.__keepCookies == self.KeepUntilExit:
             self.clear()
         self.__saveTimer.saveIfNeccessary()
-    
+
     def clear(self):
         """
         Public method to clear all cookies.
         """
         if not self.__loaded:
             self.__load()
-        
+
         self.setAllCookies([])
         self.__store.deleteAllCookies()
         self.cookiesChanged.emit()
-    
+
     def removeCookies(self, cookies):
         """
         Public method to remove a list of cookies.
-        
+
         @param cookies list of cookies to be removed
         @type list of QNetworkCookie
         """
@@ -97,103 +99,105 @@
         for cookie in cookies:
             self.__store.deleteCookie(cookie)
         self.blockSignals(wasBlocked)
-        
+
         self.cookiesChanged.emit()
-    
+
     def removeCookie(self, cookie):
         """
         Public method to remove a cookie.
-        
+
         @param cookie cookie to be removed
         @type QNetworkCookie
         """
         self.__store.deleteCookie(cookie)
         self.cookiesChanged.emit()
-    
+
     def __load(self):
         """
         Private method to load the cookies settings.
         """
         if self.__loaded:
             return
-        
-        cookieSettings = QSettings(self.__cookiesFile,
-                                   QSettings.Format.IniFormat)
-        
+
+        cookieSettings = QSettings(self.__cookiesFile, QSettings.Format.IniFormat)
+
         # load exceptions
         self.__exceptionsBlock = Preferences.toList(
-            cookieSettings.value("Exceptions/block"))
+            cookieSettings.value("Exceptions/block")
+        )
         self.__exceptionsAllow = Preferences.toList(
-            cookieSettings.value("Exceptions/allow"))
+            cookieSettings.value("Exceptions/allow")
+        )
         self.__exceptionsAllowForSession = Preferences.toList(
-            cookieSettings.value("Exceptions/allowForSession"))
+            cookieSettings.value("Exceptions/allowForSession")
+        )
         self.__exceptionsBlock.sort()
         self.__exceptionsAllow.sort()
         self.__exceptionsAllowForSession.sort()
-        
+
         self.__acceptCookies = Preferences.getWebBrowser("AcceptCookies")
         self.__keepCookies = Preferences.getWebBrowser("KeepCookiesUntil")
         if self.__keepCookies == self.KeepUntilExit:
             self.clear()
-        
+
         self.__filterTrackingCookies = Preferences.toBool(
-            Preferences.getWebBrowser("FilterTrackingCookies"))
-        
+            Preferences.getWebBrowser("FilterTrackingCookies")
+        )
+
         self.__loaded = True
         self.cookiesChanged.emit()
-    
+
     def __save(self):
         """
         Private method to save the cookies settings.
         """
         if not self.__loaded:
             return
-        
-        cookieSettings = QSettings(self.__cookiesFile,
-                                   QSettings.Format.IniFormat)
-        
+
+        cookieSettings = QSettings(self.__cookiesFile, QSettings.Format.IniFormat)
+
         cookieSettings.setValue("Exceptions/block", self.__exceptionsBlock)
         cookieSettings.setValue("Exceptions/allow", self.__exceptionsAllow)
-        cookieSettings.setValue("Exceptions/allowForSession",
-                                self.__exceptionsAllowForSession)
-        
+        cookieSettings.setValue(
+            "Exceptions/allowForSession", self.__exceptionsAllowForSession
+        )
+
         Preferences.setWebBrowser("AcceptCookies", self.__acceptCookies)
         Preferences.setWebBrowser("KeepCookiesUntil", self.__keepCookies)
-        Preferences.setWebBrowser("FilterTrackingCookies",
-                                  self.__filterTrackingCookies)
-    
+        Preferences.setWebBrowser("FilterTrackingCookies", self.__filterTrackingCookies)
+
     @pyqtSlot(QNetworkCookie)
     def __cookieAdded(self, cookie):
         """
         Private slot handling the addition of a cookie.
-        
+
         @param cookie cookie which was added
         @type QNetworkCookie
         """
         if self.__rejectCookie(cookie, cookie.domain()):
             self.__store.deleteCookie(cookie)
             return
-        
+
         self.insertCookie(cookie)
         self.cookiesChanged.emit()
-    
+
     @pyqtSlot(QNetworkCookie)
     def __cookieRemoved(self, cookie):
         """
         Private slot handling the removal of a cookie.
-        
+
         @param cookie cookie which was removed
         @type QNetworkCookie
         """
         if self.deleteCookie(cookie):
             self.cookiesChanged.emit()
-    
+
     def __cookieFilter(self, request):
         """
         Private method to filter cookies.
-        
+
         Note: This method is used for Qt 5.11+ only.
-        
+
         @param request reference to the cookie filter request object
         @type QWebEngineCookieStore.FilterRequest
         @return flag indicating cookie access is allowed
@@ -201,31 +205,29 @@
         """
         if not self.__loaded:
             self.__load()
-        
+
         if self.__acceptCookies == self.AcceptNever:
-            res = self.__isOnDomainList(self.__exceptionsAllow,
-                                        request.origin.host())
+            res = self.__isOnDomainList(self.__exceptionsAllow, request.origin.host())
             if not res:
                 return False
-        
+
         if self.__acceptCookies == self.AcceptAlways:
-            res = self.__isOnDomainList(self.__exceptionsBlock,
-                                        request.origin.host())
+            res = self.__isOnDomainList(self.__exceptionsBlock, request.origin.host())
             if res:
                 return False
-        
+
         if (
-            self.__acceptCookies == self.AcceptOnlyFromSitesNavigatedTo and
-            request.thirdParty
+            self.__acceptCookies == self.AcceptOnlyFromSitesNavigatedTo
+            and request.thirdParty
         ):
             return False
-        
+
         return True
- 
+
     def __rejectCookie(self, cookie, cookieDomain):
         """
         Private method to test, if a cookie shall be rejected.
-        
+
         @param cookie cookie to be tested
         @type QNetworkCookie
         @param cookieDomain domain of the cookie
@@ -235,17 +237,17 @@
         """
         if not self.__loaded:
             self.__load()
-        
+
         if self.__acceptCookies == self.AcceptNever:
             res = self.__isOnDomainList(self.__exceptionsAllow, cookieDomain)
             if not res:
                 return True
-        
+
         if self.__acceptCookies == self.AcceptAlways:
             res = self.__isOnDomainList(self.__exceptionsBlock, cookieDomain)
             if res:
                 return True
-        
+
         if self.__acceptCookies == self.AcceptOnlyFromSitesNavigatedTo:
             mainWindow = WebBrowserWindow.mainWindow()
             if mainWindow is not None:
@@ -259,165 +261,165 @@
                     res = self.__matchDomain(cookieDomain, host)
                     if not res:
                         return True
-        
+
         if self.__filterTrackingCookies and cookie.name().startsWith(b"__utm"):
             return True
-        
+
         return False
-    
+
     def acceptPolicy(self):
         """
         Public method to get the accept policy.
-        
+
         @return current accept policy
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.__acceptCookies
-    
+
     def setAcceptPolicy(self, policy):
         """
         Public method to set the accept policy.
-        
+
         @param policy accept policy to be set
         """
         if not self.__loaded:
             self.__load()
-        
+
         if policy > self.AcceptMax:
             return
         if policy == self.__acceptCookies:
             return
-        
+
         self.__acceptCookies = policy
         self.__saveTimer.changeOccurred()
-    
+
     def keepPolicy(self):
         """
         Public method to get the keep policy.
-        
+
         @return keep policy
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.__keepCookies
-    
+
     def setKeepPolicy(self, policy):
         """
         Public method to set the keep policy.
-        
+
         @param policy keep policy to be set
         """
         if not self.__loaded:
             self.__load()
-        
+
         if policy > self.KeepMax:
             return
         if policy == self.__keepCookies:
             return
-        
+
         self.__keepCookies = policy
         self.__saveTimer.changeOccurred()
-    
+
     def blockedCookies(self):
         """
         Public method to return the list of blocked domains.
-        
+
         @return list of blocked domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.__exceptionsBlock
-    
+
     def allowedCookies(self):
         """
         Public method to return the list of allowed domains.
-        
+
         @return list of allowed domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.__exceptionsAllow
-    
+
     def allowForSessionCookies(self):
         """
         Public method to return the list of allowed session cookie domains.
-        
+
         @return list of allowed session cookie domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.__exceptionsAllowForSession
-    
+
     def setBlockedCookies(self, list_):
         """
         Public method to set the list of blocked domains.
-        
+
         @param list_ list of blocked domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         self.__exceptionsBlock = list_[:]
         self.__exceptionsBlock.sort()
         self.__saveTimer.changeOccurred()
-    
+
     def setAllowedCookies(self, list_):
         """
         Public method to set the list of allowed domains.
-        
+
         @param list_ list of allowed domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         self.__exceptionsAllow = list_[:]
         self.__exceptionsAllow.sort()
         self.__saveTimer.changeOccurred()
-    
+
     def setAllowForSessionCookies(self, list_):
         """
         Public method to set the list of allowed session cookie domains.
-        
+
         @param list_ list of allowed session cookie domains (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         self.__exceptionsAllowForSession = list_[:]
         self.__exceptionsAllowForSession.sort()
         self.__saveTimer.changeOccurred()
-    
+
     def filterTrackingCookies(self):
         """
         Public method to get the filter tracking cookies flag.
-        
+
         @return filter tracking cookies flag (boolean)
         """
         return self.__filterTrackingCookies
-    
+
     def setFilterTrackingCookies(self, filterTrackingCookies):
         """
         Public method to set the filter tracking cookies flag.
-        
+
         @param filterTrackingCookies filter tracking cookies flag (boolean)
         """
         if filterTrackingCookies == self.__filterTrackingCookies:
             return
-        
+
         self.__filterTrackingCookies = filterTrackingCookies
         self.__saveTimer.changeOccurred()
-    
+
     def __isOnDomainList(self, rules, domain):
         """
         Private method to check, if either the rule matches the domain exactly
         or the domain ends with ".rule".
-        
+
         @param rules list of rules (list of strings)
         @param domain domain name to check (string)
         @return flag indicating a match (boolean)
@@ -426,29 +428,25 @@
             if rule.startswith("."):
                 if domain.endswith(rule):
                     return True
-                
+
                 withoutDot = rule[1:]
                 if domain == withoutDot:
                     return True
             else:
-                domainEnding = domain[-(len(rule) + 1):]
-                if (
-                    domainEnding and
-                    domainEnding[0] == "." and
-                    domain.endswith(rule)
-                ):
+                domainEnding = domain[-(len(rule) + 1) :]
+                if domainEnding and domainEnding[0] == "." and domain.endswith(rule):
                     return True
-                
+
                 if rule == domain:
                     return True
-        
+
         return False
-    
+
     def __matchDomain(self, cookieDomain, siteDomain):
         """
         Private method to check, if a URLs host matches a cookie domain
         according to RFC 6265.
-        
+
         @param cookieDomain domain of the cookie
         @type str
         @param siteDomain domain or host of an URL
@@ -459,36 +457,36 @@
         if not siteDomain:
             # empty URLs always match
             return True
-        
+
         if cookieDomain.startswith("."):
             cookieDomain = cookieDomain[1:]
         if siteDomain.startswith("."):
             siteDomain = siteDomain[1:]
-        
+
         if cookieDomain == siteDomain:
             return True
-        
+
         if not siteDomain.endswith(cookieDomain):
             return False
-        
+
         index = siteDomain.find(cookieDomain)
         return index > 0 and siteDomain[index - 1] == "."
-    
+
     def cookies(self):
         """
         Public method to get the cookies of the cookie jar.
-        
+
         @return list of all cookies (list of QNetworkCookie)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return self.allCookies()
-    
+
     def cookieDomains(self):
         """
         Public method to get a list of all domains used by the cookies.
-        
+
         @return list of domain names
         @rtype list of str
         """
@@ -497,5 +495,5 @@
             domain = cookie.domain()
             if domain not in domains:
                 domains.append(domain)
-        
+
         return domains
--- a/src/eric7/WebBrowser/CookieJar/CookiesConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/CookieJar/CookiesConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,17 +19,18 @@
     """
     Class implementing the cookies configuration dialog.
     """
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__mw = parent
-        
+
         jar = self.__mw.cookieJar()
         acceptPolicy = jar.acceptPolicy()
         if acceptPolicy == CookieJar.AcceptAlways:
@@ -38,19 +39,18 @@
             self.acceptCombo.setCurrentIndex(1)
         elif acceptPolicy == CookieJar.AcceptOnlyFromSitesNavigatedTo:
             self.acceptCombo.setCurrentIndex(2)
-        
+
         keepPolicy = jar.keepPolicy()
         if keepPolicy == CookieJar.KeepUntilExpire:
             self.keepUntilCombo.setCurrentIndex(0)
         elif keepPolicy == CookieJar.KeepUntilExit:
             self.keepUntilCombo.setCurrentIndex(1)
-        
-        self.filterTrackingCookiesCheckbox.setChecked(
-            jar.filterTrackingCookies())
-        
+
+        self.filterTrackingCookiesCheckbox.setChecked(jar.filterTrackingCookies())
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def accept(self):
         """
         Public slot to accept the dialog.
@@ -62,35 +62,36 @@
             acceptPolicy = CookieJar.AcceptNever
         elif acceptSelection == 2:
             acceptPolicy = CookieJar.AcceptOnlyFromSitesNavigatedTo
-        
+
         keepSelection = self.keepUntilCombo.currentIndex()
         if keepSelection == 0:
             keepPolicy = CookieJar.KeepUntilExpire
         elif keepSelection == 1:
             keepPolicy = CookieJar.KeepUntilExit
-        
+
         jar = self.__mw.cookieJar()
         jar.setAcceptPolicy(acceptPolicy)
         jar.setKeepPolicy(keepPolicy)
-        jar.setFilterTrackingCookies(
-            self.filterTrackingCookiesCheckbox.isChecked())
-        
+        jar.setFilterTrackingCookies(self.filterTrackingCookiesCheckbox.isChecked())
+
         super().accept()
-    
+
     @pyqtSlot()
     def on_exceptionsButton_clicked(self):
         """
         Private slot to show the cookies exceptions dialog.
         """
         from .CookiesExceptionsDialog import CookiesExceptionsDialog
+
         dlg = CookiesExceptionsDialog(self.__mw.cookieJar())
         dlg.exec()
-    
+
     @pyqtSlot()
     def on_cookiesButton_clicked(self):
         """
         Private slot to show the cookies dialog.
         """
         from .CookiesDialog import CookiesDialog
+
         dlg = CookiesDialog(self.__mw.cookieJar())
         dlg.exec()
--- a/src/eric7/WebBrowser/CookieJar/CookiesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/CookieJar/CookiesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,48 +19,49 @@
     """
     Class implementing a dialog to show all cookies.
     """
+
     DomainRole = Qt.ItemDataRole.UserRole + 1
     CookieRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, cookieJar, parent=None):
         """
         Constructor
-        
+
         @param cookieJar reference to the cookie jar (CookieJar)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.addButton.setEnabled(False)
-        
+
         self.__cookieJar = cookieJar
-        
+
         self.__domainDict = {}
-        
-        self.cookiesTree.headerItem().setText(
-            self.cookiesTree.columnCount(), "")
-        
+
+        self.cookiesTree.headerItem().setText(self.cookiesTree.columnCount(), "")
+
         for cookie in self.__cookieJar.cookies():
             self.__addCookie(cookie)
         self.__resizeColumns()
-        
+
         self.cookiesTree.itemExpanded.connect(self.__resizeColumns)
         self.cookiesTree.itemCollapsed.connect(self.__resizeColumns)
-    
+
     @pyqtSlot()
     def __resizeColumns(self):
         """
         Private slot to resize the columns.
         """
         self.cookiesTree.header().resizeSections(
-            QHeaderView.ResizeMode.ResizeToContents)
+            QHeaderView.ResizeMode.ResizeToContents
+        )
         self.cookiesTree.header().setStretchLastSection(True)
-    
+
     def __cookieDomain(self, cookie):
         """
         Private method to extract the cookie domain.
-        
+
         @param cookie cookie to get the domain from
         @type QNetworkCookie
         @return domain of the cookie
@@ -70,11 +71,11 @@
         if domain.startswith("."):
             domain = domain[1:]
         return domain
-    
+
     def __addCookie(self, cookie):
         """
         Private method to add a cookie to the tree.
-        
+
         @param cookie reference to the cookie
         @type QNetworkCookie
         """
@@ -86,13 +87,13 @@
             newParent.setText(0, domain)
             newParent.setData(0, self.DomainRole, cookie.domain())
             self.__domainDict[domain] = newParent
-            
+
             itm = QTreeWidgetItem(newParent)
-        
+
         itm.setText(0, cookie.domain())
         itm.setText(1, bytes(cookie.name()).decode())
         itm.setData(0, self.CookieRole, cookie)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -101,14 +102,14 @@
         current = self.cookiesTree.currentItem()
         if current is None:
             return
-        
+
         from .CookiesExceptionsDialog import CookiesExceptionsDialog
-        
+
         domain = current.text(0)
         dlg = CookiesExceptionsDialog(self.__cookieJar, self)
         dlg.setDomainName(domain)
         dlg.exec()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -117,7 +118,7 @@
         current = self.cookiesTree.currentItem()
         if current is None:
             return
-        
+
         if current.childCount() == 0:
             # single cookie
             cookie = current.data(0, self.CookieRole)
@@ -135,7 +136,7 @@
             index = self.cookiesTree.indexOfTopLevelItem(current)
             self.cookiesTree.takeTopLevelItem(index)
             del current
-    
+
     @pyqtSlot()
     def on_removeAllButton_clicked(self):
         """
@@ -144,17 +145,18 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Remove All Cookies"),
-            self.tr("""Do you really want to remove all stored cookies?"""))
+            self.tr("""Do you really want to remove all stored cookies?"""),
+        )
         if res:
             self.__cookieJar.clear()
             self.__domainDict = {}
             self.cookiesTree.clear()
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_cookiesTree_currentItemChanged(self, current, previous):
         """
         Private slot to handle a change of the current item.
-        
+
         @param current reference to the current item
         @type QTreeWidgetItem
         @param previous reference to the previous current item
@@ -162,10 +164,10 @@
         """
         self.addButton.setEnabled(current is not None)
         self.removeButton.setEnabled(current is not None)
-        
+
         if current is None:
             return
-        
+
         if not current.text(1):
             # it is a cookie domain entry
             self.domain.setText(self.tr("<no cookie selected>"))
@@ -174,12 +176,12 @@
             self.secure.setText(self.tr("<no cookie selected>"))
             self.expiration.setText(self.tr("<no cookie selected>"))
             self.value.setText(self.tr("<no cookie selected>"))
-            
+
             self.removeButton.setText(self.tr("Remove Cookies"))
         else:
             # it is a cookie entry
             cookie = current.data(0, self.CookieRole)
-            
+
             self.domain.setText(cookie.domain())
             self.name.setText(bytes(cookie.name()).decode())
             self.path.setText(cookie.path())
@@ -191,17 +193,19 @@
                 self.expiration.setText(self.tr("Session Cookie"))
             else:
                 self.expiration.setText(
-                    cookie.expirationDate().toString("yyyy-MM-dd HH:mm:ss"))
+                    cookie.expirationDate().toString("yyyy-MM-dd HH:mm:ss")
+                )
             self.value.setText(
-                bytes(QByteArray.fromPercentEncoding(cookie.value())).decode())
-            
+                bytes(QByteArray.fromPercentEncoding(cookie.value())).decode()
+            )
+
             self.removeButton.setText(self.tr("Remove Cookie"))
-    
+
     @pyqtSlot(str)
     def on_searchEdit_textChanged(self, txt):
         """
         Private slot to search and filter the cookie tree.
-        
+
         @param txt text to search for
         @type str
         """
--- a/src/eric7/WebBrowser/CookieJar/CookiesExceptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/CookieJar/CookiesExceptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,34 +20,33 @@
     """
     Class implementing a dialog for the configuration of cookie exceptions.
     """
+
     def __init__(self, cookieJar, parent=None):
         """
         Constructor
-        
+
         @param cookieJar reference to the cookie jar (CookieJar)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__cookieJar = cookieJar
-        
-        self.removeButton.clicked.connect(
-            self.exceptionsTable.removeSelected)
-        self.removeAllButton.clicked.connect(
-            self.exceptionsTable.removeAll)
-        
+
+        self.removeButton.clicked.connect(self.exceptionsTable.removeSelected)
+        self.removeAllButton.clicked.connect(self.exceptionsTable.removeAll)
+
         self.exceptionsTable.verticalHeader().hide()
         self.__exceptionsModel = CookieExceptionsModel(cookieJar)
         self.__proxyModel = QSortFilterProxyModel(self)
         self.__proxyModel.setSourceModel(self.__exceptionsModel)
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
         self.exceptionsTable.setModel(self.__proxyModel)
-        
+
         self.domainEdit.setCompleter(
-            QCompleter(cookieJar.cookieDomains(), self.domainEdit))
-        
+            QCompleter(cookieJar.cookieDomains(), self.domainEdit)
+        )
+
         f = QFont()
         f.setPointSize(10)
         fm = QFontMetrics(f)
@@ -55,15 +54,14 @@
         self.exceptionsTable.verticalHeader().setDefaultSectionSize(height)
         self.exceptionsTable.verticalHeader().setMinimumSectionSize(-1)
         for section in range(self.__exceptionsModel.columnCount()):
-            header = self.exceptionsTable.horizontalHeader().sectionSizeHint(
-                section)
+            header = self.exceptionsTable.horizontalHeader().sectionSizeHint(section)
             if section == 0:
                 try:
                     header = fm.horizontalAdvance(
-                        "averagebiglonghost.averagedomain.info")
+                        "averagebiglonghost.averagedomain.info"
+                    )
                 except AttributeError:
-                    header = fm.width(
-                        "averagebiglonghost.averagedomain.info")
+                    header = fm.width("averagebiglonghost.averagedomain.info")
             elif section == 1:
                 try:
                     header = fm.horizontalAdvance(self.tr("Allow For Session"))
@@ -74,53 +72,56 @@
             except AttributeError:
                 buffer = fm.width("mm")
             header += buffer
-            self.exceptionsTable.horizontalHeader().resizeSection(
-                section, header)
-    
+            self.exceptionsTable.horizontalHeader().resizeSection(section, header)
+
     def setDomainName(self, domain):
         """
         Public method to set the domain to be displayed.
-        
+
         @param domain domain name to be displayed (string)
         """
         self.domainEdit.setText(domain)
-    
+
     @pyqtSlot(str)
     def on_domainEdit_textChanged(self, txt):
         """
         Private slot to handle a change of the domain edit text.
-        
+
         @param txt current text of the edit (string)
         """
         enabled = txt != ""
         self.blockButton.setEnabled(enabled)
         self.allowButton.setEnabled(enabled)
         self.allowForSessionButton.setEnabled(enabled)
-    
+
     @pyqtSlot()
     def on_blockButton_clicked(self):
         """
         Private slot to block cookies of a domain.
         """
         from .CookieJar import CookieJar
+
         self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Block)
         self.domainEdit.clear()
-    
+
     @pyqtSlot()
     def on_allowForSessionButton_clicked(self):
         """
         Private slot to allow cookies of a domain for the current session only.
         """
         from .CookieJar import CookieJar
-        self.__exceptionsModel.addRule(self.domainEdit.text(),
-                                       CookieJar.AllowForSession)
+
+        self.__exceptionsModel.addRule(
+            self.domainEdit.text(), CookieJar.AllowForSession
+        )
         self.domainEdit.clear()
-    
+
     @pyqtSlot()
     def on_allowButton_clicked(self):
         """
         Private slot to allow cookies of a domain.
         """
         from .CookieJar import CookieJar
+
         self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Allow)
         self.domainEdit.clear()
--- a/src/eric7/WebBrowser/Download/DownloadAskActionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadAskActionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to ask for a download action.
     """
+
     def __init__(self, fileName, mimeType, baseUrl, parent=None):
         """
         Constructor
-        
+
         @param fileName file name (string)
         @param mimeType mime type (string)
         @param baseUrl URL (string)
@@ -29,24 +30,24 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.infoLabel.setText("<b>{0}</b>".format(fileName))
         self.typeLabel.setText(mimeType)
         self.siteLabel.setText(baseUrl)
-        
+
         if (
-            not Preferences.getWebBrowser("VirusTotalEnabled") or
-            Preferences.getWebBrowser("VirusTotalServiceKey") == ""
+            not Preferences.getWebBrowser("VirusTotalEnabled")
+            or Preferences.getWebBrowser("VirusTotalServiceKey") == ""
         ):
             self.scanButton.setHidden(True)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getAction(self):
         """
         Public method to get the selected action.
-        
+
         @return selected action ("save", "open", "scan" or "cancel")
         """
         if self.openButton.isChecked():
--- a/src/eric7/WebBrowser/Download/DownloadItem.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadItem.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 import os
 import pathlib
 
-from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, QTime, QUrl, QStandardPaths, QDateTime
-)
+from PyQt6.QtCore import pyqtSlot, pyqtSignal, QTime, QUrl, QStandardPaths, QDateTime
 from PyQt6.QtGui import QDesktopServices
 from PyQt6.QtWidgets import QWidget, QStyle, QDialog
 from PyQt6.QtWebEngineCore import QWebEngineDownloadRequest
@@ -34,6 +32,7 @@
     """
     Class implementing the various download states.
     """
+
     Downloading = 0
     Successful = 1
     Cancelled = 2
@@ -42,19 +41,20 @@
 class DownloadItem(QWidget, Ui_DownloadItem):
     """
     Class implementing a widget controlling a download.
-    
+
     @signal statusChanged() emitted upon a status change of a download
     @signal downloadFinished(success) emitted when a download finished
     @signal progress(int, int) emitted to signal the download progress
     """
+
     statusChanged = pyqtSignal()
     downloadFinished = pyqtSignal(bool)
     progress = pyqtSignal(int, int)
-    
+
     def __init__(self, downloadRequest=None, pageUrl=None, parent=None):
         """
         Constructor
-        
+
         @param downloadRequest reference to the download object containing the
         download data.
         @type QWebEngineDownloadRequest
@@ -65,32 +65,32 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.fileIcon.setStyleSheet("background-color: transparent")
         self.datetimeLabel.setStyleSheet("background-color: transparent")
         self.filenameLabel.setStyleSheet("background-color: transparent")
         if ericApp().usesDarkPalette():
             self.infoLabel.setStyleSheet(
                 "color: #c0c0c0; background-color: transparent"
-            )      # light gray
+            )  # light gray
         else:
             self.infoLabel.setStyleSheet(
                 "color: #808080; background-color: transparent"
-            )      # dark gray
-        
+            )  # dark gray
+
         self.progressBar.setMaximum(0)
-        
+
         self.pauseButton.setIcon(UI.PixmapCache.getIcon("pause"))
         self.stopButton.setIcon(UI.PixmapCache.getIcon("stopLoading"))
         self.openButton.setIcon(UI.PixmapCache.getIcon("open"))
         self.openButton.setEnabled(False)
         self.openButton.setVisible(False)
-        
+
         self.__state = DownloadState.Downloading
-        
+
         icon = self.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)
         self.fileIcon.setPixmap(icon.pixmap(48, 48))
-        
+
         self.__downloadRequest = downloadRequest
         if pageUrl is None:
             self.__pageUrl = QUrl()
@@ -106,37 +106,36 @@
         self.__canceledFileSelect = False
         self.__autoOpen = False
         self.__downloadedDateTime = QDateTime()
-        
+
         self.__initialize()
-    
+
     def __initialize(self):
         """
         Private method to initialize the widget.
         """
         if self.__downloadRequest is None:
             return
-        
+
         self.__finishedDownloading = False
         self.__bytesReceived = 0
         self.__bytesTotal = -1
-        
+
         # start timer for the download estimation
         self.__downloadTime = QTime.currentTime()
-        
+
         # attach to the download item object
         self.__url = self.__downloadRequest.url()
-        self.__downloadRequest.receivedBytesChanged.connect(
-            self.__downloadProgress)
+        self.__downloadRequest.receivedBytesChanged.connect(self.__downloadProgress)
         self.__downloadRequest.isFinishedChanged.connect(self.__finished)
-        
+
         # reset info
         self.datetimeLabel.clear()
         self.datetimeLabel.hide()
         self.infoLabel.clear()
         self.progressBar.setValue(0)
         if (
-            self.__downloadRequest.state() ==
-            QWebEngineDownloadRequest.DownloadState.DownloadRequested
+            self.__downloadRequest.state()
+            == QWebEngineDownloadRequest.DownloadState.DownloadRequested
         ):
             self.__getFileName()
             if not self.__fileName:
@@ -147,22 +146,21 @@
         else:
             fileName = self.__downloadRequest.downloadFileName()
             self.__setFileName(fileName)
-    
+
     def __getFileName(self):
         """
         Private method to get the file name to save to from the user.
         """
         if self.__gettingFileName:
             return
-        
+
         savePage = self.__downloadRequest.isSavePageDownload()
-        
+
         documentLocation = QStandardPaths.writableLocation(
-            QStandardPaths.StandardLocation.DocumentsLocation)
-        downloadDirectory = (
-            WebBrowserWindow.downloadManager().downloadDirectory()
+            QStandardPaths.StandardLocation.DocumentsLocation
         )
-        
+        downloadDirectory = WebBrowserWindow.downloadManager().downloadDirectory()
+
         if self.__fileName:
             fileName = self.__fileName
             originalFileName = self.__originalFileName
@@ -170,99 +168,100 @@
             ask = False
         else:
             defaultFileName, originalFileName = self.__saveFileName(
-                documentLocation if savePage else downloadDirectory)
+                documentLocation if savePage else downloadDirectory
+            )
             fileName = defaultFileName
             self.__originalFileName = originalFileName
             ask = True
         self.__autoOpen = False
-        
+
         if not savePage:
             from .DownloadAskActionDialog import DownloadAskActionDialog
+
             url = self.__downloadRequest.url()
             mimetype = Utilities.MimeTypes.mimeType(originalFileName)
             dlg = DownloadAskActionDialog(
                 pathlib.Path(originalFileName).name,
                 mimetype,
                 "{0}://{1}".format(url.scheme(), url.authority()),
-                self)
-            
-            if (
-                dlg.exec() == QDialog.DialogCode.Rejected or
-                dlg.getAction() == "cancel"
-            ):
+                self,
+            )
+
+            if dlg.exec() == QDialog.DialogCode.Rejected or dlg.getAction() == "cancel":
                 self.progressBar.setVisible(False)
                 self.on_stopButton_clicked()
                 self.filenameLabel.setText(
                     self.tr("Download canceled: {0}").format(
-                        pathlib.Path(defaultFileName).name))
+                        pathlib.Path(defaultFileName).name
+                    )
+                )
                 self.__canceledFileSelect = True
                 self.__setDateTime()
                 return
-            
+
             if dlg.getAction() == "scan":
                 self.__mainWindow.requestVirusTotalScan(url)
-                
+
                 self.progressBar.setVisible(False)
                 self.on_stopButton_clicked()
                 self.filenameLabel.setText(
                     self.tr("VirusTotal scan scheduled: {0}").format(
-                        pathlib.Path(defaultFileName).name))
+                        pathlib.Path(defaultFileName).name
+                    )
+                )
                 self.__canceledFileSelect = True
                 return
-        
+
             self.__autoOpen = dlg.getAction() == "open"
-            
+
             tempLocation = QStandardPaths.writableLocation(
-                QStandardPaths.StandardLocation.TempLocation)
-            fileName = (
-                tempLocation + '/' +
-                pathlib.Path(fileName).stem
+                QStandardPaths.StandardLocation.TempLocation
             )
-            
+            fileName = tempLocation + "/" + pathlib.Path(fileName).stem
+
             if ask and not self.__autoOpen:
                 self.__gettingFileName = True
                 fileName = EricFileDialog.getSaveFileName(
-                    None,
-                    self.tr("Save File"),
-                    defaultFileName,
-                    "")
+                    None, self.tr("Save File"), defaultFileName, ""
+                )
                 self.__gettingFileName = False
-        
+
         if not fileName:
             self.progressBar.setVisible(False)
             self.on_stopButton_clicked()
             self.filenameLabel.setText(
-                self.tr("Download canceled: {0}")
-                    .format(pathlib.Path(defaultFileName).name))
+                self.tr("Download canceled: {0}").format(
+                    pathlib.Path(defaultFileName).name
+                )
+            )
             self.__canceledFileSelect = True
             self.__setDateTime()
             return
-        
+
         self.__setFileName(fileName)
-    
+
     def __setFileName(self, fileName):
         """
         Private method to set the file name to save the download into.
-        
+
         @param fileName name of the file to save into
         @type str
         """
         fpath = pathlib.Path(fileName)
-        WebBrowserWindow.downloadManager().setDownloadDirectory(
-            fpath.parent.resolve())
+        WebBrowserWindow.downloadManager().setDownloadDirectory(fpath.parent.resolve())
         self.filenameLabel.setText(fpath.name)
-        
+
         self.__fileName = str(fpath)
-        
+
         # check file path for saving
         saveDirPath = pathlib.Path(self.__fileName).parent()
         if not saveDirPath.exists():
             saveDirPath.mkdir(parents=True)
-    
+
     def __saveFileName(self, directory):
         """
         Private method to calculate a name for the file to download.
-        
+
         @param directory name of the directory to store the file into (string)
         @return proposed filename and original filename (string, string)
         """
@@ -270,12 +269,12 @@
         origName = fpath.name
         name = os.path.join(directory, origName)
         return name, origName
-    
+
     @pyqtSlot(bool)
     def on_pauseButton_clicked(self, checked):
         """
         Private slot to pause the download.
-        
+
         @param checked flag indicating the state of the button
         @type bool
         """
@@ -283,14 +282,14 @@
             self.__downloadRequest.pause()
         else:
             self.__downloadRequest.resume()
-    
+
     @pyqtSlot()
     def on_stopButton_clicked(self):
         """
         Private slot to stop the download.
         """
         self.cancelDownload()
-    
+
     def cancelDownload(self):
         """
         Public slot to stop the download.
@@ -307,28 +306,28 @@
         self.__downloadRequest.cancel()
         self.__setDateTime()
         self.downloadFinished.emit(False)
-    
+
     @pyqtSlot()
     def on_openButton_clicked(self):
         """
         Private slot to open the downloaded file.
         """
         self.openFile()
-    
+
     def openFile(self):
         """
         Public slot to open the downloaded file.
         """
         url = QUrl.fromLocalFile(pathlib.Path(self.__fileName).resolve())
         QDesktopServices.openUrl(url)
-    
+
     def openFolder(self):
         """
         Public slot to open the folder containing the downloaded file.
         """
         url = QUrl.fromLocalFile(pathlib.Path(self.__fileName).resolve())
         QDesktopServices.openUrl(url)
-    
+
     @pyqtSlot()
     def __downloadProgress(self):
         """
@@ -343,147 +342,144 @@
             totalValue = 100
         self.progressBar.setValue(currentValue)
         self.progressBar.setMaximum(totalValue)
-        
+
         self.progress.emit(currentValue, totalValue)
         self.__updateInfoLabel()
-    
+
     def downloadProgress(self):
         """
         Public method to get the download progress.
-        
+
         @return current download progress
         @rtype int
         """
         return self.progressBar.value()
-    
+
     def bytesTotal(self):
         """
         Public method to get the total number of bytes of the download.
-        
+
         @return total number of bytes (integer)
         """
         if self.__bytesTotal == -1:
             self.__bytesTotal = self.__downloadRequest.totalBytes()
         return self.__bytesTotal
-    
+
     def bytesReceived(self):
         """
         Public method to get the number of bytes received.
-        
+
         @return number of bytes received (integer)
         """
         return self.__bytesReceived
-    
+
     def remainingTime(self):
         """
         Public method to get an estimation for the remaining time.
-        
+
         @return estimation for the remaining time (float)
         """
         if not self.downloading():
             return -1.0
-        
+
         if self.bytesTotal() == -1:
             return -1.0
-        
+
         cSpeed = self.currentSpeed()
         timeRemaining = (
-            (self.bytesTotal() - self.bytesReceived()) / cSpeed
-            if cSpeed != 0 else
-            1
+            (self.bytesTotal() - self.bytesReceived()) / cSpeed if cSpeed != 0 else 1
         )
-        
+
         # ETA should never be 0
         if timeRemaining == 0:
             timeRemaining = 1
-        
+
         return timeRemaining
-    
+
     def currentSpeed(self):
         """
         Public method to get an estimation for the download speed.
-        
+
         @return estimation for the download speed (float)
         """
         if not self.downloading():
             return -1.0
-        
+
         return (
-            self.__bytesReceived * 1000.0 /
-            self.__downloadTime.msecsTo(QTime.currentTime())
+            self.__bytesReceived
+            * 1000.0
+            / self.__downloadTime.msecsTo(QTime.currentTime())
         )
-    
+
     def __updateInfoLabel(self):
         """
         Private method to update the info label.
         """
         bytesTotal = self.bytesTotal()
         running = not self.downloadedSuccessfully()
-        
+
         speed = self.currentSpeed()
         timeRemaining = self.remainingTime()
-        
+
         info = ""
         if running:
             remaining = ""
-            
+
             if bytesTotal > 0:
                 remaining = timeString(timeRemaining)
-            
-            info = self.tr(
-                "{0} of {1} ({2}/sec) {3}"
-            ).format(
+
+            info = self.tr("{0} of {1} ({2}/sec) {3}").format(
                 dataString(self.__bytesReceived),
-                bytesTotal == -1 and self.tr("?") or
-                dataString(bytesTotal),
+                bytesTotal == -1 and self.tr("?") or dataString(bytesTotal),
                 speedString(speed),
-                remaining
+                remaining,
             )
         else:
             if bytesTotal in (self.__bytesReceived, -1):
-                info = self.tr(
-                    "{0} downloaded"
-                ).format(dataString(self.__bytesReceived))
+                info = self.tr("{0} downloaded").format(
+                    dataString(self.__bytesReceived)
+                )
             else:
-                info = self.tr(
-                    "{0} of {1} - Stopped"
-                ).format(dataString(self.__bytesReceived),
-                         dataString(bytesTotal))
+                info = self.tr("{0} of {1} - Stopped").format(
+                    dataString(self.__bytesReceived), dataString(bytesTotal)
+                )
         self.infoLabel.setText(info)
-    
+
     def downloading(self):
         """
         Public method to determine, if a download is in progress.
-        
+
         @return flag indicating a download is in progress (boolean)
         """
         return self.__state == DownloadState.Downloading
-    
+
     def downloadedSuccessfully(self):
         """
         Public method to check for a successful download.
-        
+
         @return flag indicating a successful download (boolean)
         """
         return self.__state == DownloadState.Successful
-    
+
     def downloadCanceled(self):
         """
         Public method to check, if the download was cancelled.
-        
+
         @return flag indicating a canceled download (boolean)
         """
         return self.__state == DownloadState.Cancelled
-    
+
     def __finished(self):
         """
         Private slot to handle the download finished.
         """
         self.__finishedDownloading = True
-        
-        noError = (self.__downloadRequest.state() ==
-                   QWebEngineDownloadRequest.DownloadState.DownloadCompleted)
-        
+
+        noError = (
+            self.__downloadRequest.state()
+            == QWebEngineDownloadRequest.DownloadState.DownloadCompleted
+        )
+
         self.progressBar.setVisible(False)
         self.pauseButton.setEnabled(False)
         self.pauseButton.setVisible(False)
@@ -494,51 +490,51 @@
         self.__state = DownloadState.Successful
         self.__updateInfoLabel()
         self.__setDateTime()
-        
+
         self.__adjustSize()
-        
+
         self.statusChanged.emit()
         self.downloadFinished.emit(True)
-        
+
         if self.__autoOpen:
             self.openFile()
-    
+
     def canceledFileSelect(self):
         """
         Public method to check, if the user canceled the file selection.
-        
+
         @return flag indicating cancellation (boolean)
         """
         return self.__canceledFileSelect
-    
+
     def setIcon(self, icon):
         """
         Public method to set the download icon.
-        
+
         @param icon reference to the icon to be set (QIcon)
         """
         self.fileIcon.setPixmap(icon.pixmap(48, 48))
-    
+
     def fileName(self):
         """
         Public method to get the name of the output file.
-        
+
         @return name of the output file (string)
         """
         return self.__fileName
-    
+
     def absoluteFilePath(self):
         """
         Public method to get the absolute path of the output file.
-        
+
         @return absolute path of the output file (string)
         """
         return pathlib.Path(self.__fileName).resolve()
-    
+
     def getData(self):
         """
         Public method to get the relevant download data.
-        
+
         @return dictionary containing the URL, save location, done flag,
             the URL of the related web page and the date and time of the
             download
@@ -550,13 +546,13 @@
             "Location": self.__fileName,
             "Done": self.downloadedSuccessfully(),
             "PageURL": self.__pageUrl,
-            "Downloaded": self.__downloadedDateTime
+            "Downloaded": self.__downloadedDateTime,
         }
-    
+
     def setData(self, data):
         """
         Public method to set the relevant download data.
-        
+
         @param data dictionary containing the URL, save location, done flag,
             the URL of the related web page and the date and time of the
             download
@@ -566,15 +562,15 @@
         self.__url = data["URL"]
         self.__fileName = data["Location"]
         self.__pageUrl = data["PageURL"]
-        
+
         self.filenameLabel.setText(pathlib.Path(self.__fileName).name)
         self.infoLabel.setText(self.__fileName)
-        
+
         try:
             self.__setDateTime(data["Downloaded"])
         except KeyError:
             self.__setDateTime(QDateTime())
-        
+
         self.pauseButton.setEnabled(False)
         self.pauseButton.setVisible(False)
         self.stopButton.setEnabled(False)
@@ -586,38 +582,38 @@
         else:
             self.__state = DownloadState.Cancelled
         self.progressBar.setVisible(False)
-        
+
         self.__adjustSize()
-    
+
     def getInfoData(self):
         """
         Public method to get the text of the info label.
-        
+
         @return text of the info label (string)
         """
         return self.infoLabel.text()
-    
+
     def getPageUrl(self):
         """
         Public method to get the URL of the download page.
-        
+
         @return URL of the download page (QUrl)
         """
         return self.__pageUrl
-    
+
     def __adjustSize(self):
         """
         Private method to adjust the size of the download item.
         """
         self.ensurePolished()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __setDateTime(self, dateTime=None):
         """
         Private method to set the download date and time.
-        
+
         @param dateTime date and time to be set
         @type QDateTime
         """
--- a/src/eric7/WebBrowser/Download/DownloadManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,12 +8,16 @@
 """
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, Qt, QModelIndex, QFileInfo, QUrl, QBasicTimer
+    pyqtSlot,
+    pyqtSignal,
+    Qt,
+    QModelIndex,
+    QFileInfo,
+    QUrl,
+    QBasicTimer,
 )
 from PyQt6.QtGui import QCursor, QKeySequence, QShortcut
-from PyQt6.QtWidgets import (
-    QDialog, QStyle, QFileIconProvider, QMenu, QApplication
-)
+from PyQt6.QtWidgets import QDialog, QStyle, QFileIconProvider, QMenu, QApplication
 
 from EricWidgets import EricMessageBox
 from EricWidgets.EricApplication import ericApp
@@ -34,156 +38,159 @@
 class DownloadManager(QDialog, Ui_DownloadManager):
     """
     Class implementing the download manager.
-    
+
     @signal downloadsCountChanged() emitted to indicate a change of the
         count of download items
     """
+
     RemoveNever = 0
     RemoveExit = 1
     RemoveSuccessFullDownload = 2
-    
+
     UpdateTimerTimeout = 1000
-    
+
     downloadsCountChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__winTaskbarButton = None
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.__model = DownloadModel(self)
         self.__manager = WebBrowserWindow.networkManager()
-        
+
         self.__iconProvider = None
         self.__downloads = []
         self.__downloadDirectory = ""
         self.__loaded = False
-        
+
         self.__rowHeightMultiplier = 1.1
-        
+
         self.setDownloadDirectory(Preferences.getUI("DownloadPath"))
-        
+
         self.downloadsView.setShowGrid(False)
         self.downloadsView.verticalHeader().hide()
         self.downloadsView.horizontalHeader().hide()
         self.downloadsView.setAlternatingRowColors(True)
         self.downloadsView.horizontalHeader().setStretchLastSection(True)
         self.downloadsView.setModel(self.__model)
-        self.downloadsView.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.downloadsView.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.downloadsView.customContextMenuRequested.connect(
-            self.__customContextMenuRequested)
-        
+            self.__customContextMenuRequested
+        )
+
         self.__clearShortcut = QShortcut(QKeySequence("Ctrl+L"), self)
         self.__clearShortcut.activated.connect(self.on_cleanupButton_clicked)
-        
+
         self.__load()
-        
+
         self.__updateTimer = QBasicTimer()
-    
+
     def __customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request for the bookmarks tree.
-        
+
         @param pos position the context menu was requested (QPoint)
         """
         menu = QMenu()
-        
-        selectedRowsCount = len(
-            self.downloadsView.selectionModel().selectedRows())
-        
+
+        selectedRowsCount = len(self.downloadsView.selectionModel().selectedRows())
+
         if selectedRowsCount == 1:
             row = self.downloadsView.selectionModel().selectedRows()[0].row()
             itm = self.__downloads[row]
             if itm.downloadedSuccessfully():
                 menu.addAction(
                     UI.PixmapCache.getIcon("open"),
-                    self.tr("Open"), self.__contextMenuOpen)
+                    self.tr("Open"),
+                    self.__contextMenuOpen,
+                )
             elif itm.downloading():
                 menu.addAction(
                     UI.PixmapCache.getIcon("stopLoading"),
-                    self.tr("Cancel"), self.__contextMenuCancel)
+                    self.tr("Cancel"),
+                    self.__contextMenuCancel,
+                )
                 menu.addSeparator()
             menu.addAction(
-                self.tr("Open Containing Folder"),
-                self.__contextMenuOpenFolder)
+                self.tr("Open Containing Folder"), self.__contextMenuOpenFolder
+            )
             menu.addSeparator()
-            menu.addAction(
-                self.tr("Go to Download Page"),
-                self.__contextMenuGotoPage)
-            menu.addAction(
-                self.tr("Copy Download Link"),
-                self.__contextMenuCopyLink)
+            menu.addAction(self.tr("Go to Download Page"), self.__contextMenuGotoPage)
+            menu.addAction(self.tr("Copy Download Link"), self.__contextMenuCopyLink)
             menu.addSeparator()
         menu.addAction(self.tr("Select All"), self.__contextMenuSelectAll)
-        if (
-            selectedRowsCount > 1 or
-            (selectedRowsCount == 1 and
-             not self.__downloads[
-                self.downloadsView.selectionModel().selectedRows()[0].row()]
-                .downloading())
+        if selectedRowsCount > 1 or (
+            selectedRowsCount == 1
+            and not self.__downloads[
+                self.downloadsView.selectionModel().selectedRows()[0].row()
+            ].downloading()
         ):
             menu.addSeparator()
             menu.addAction(
-                self.tr("Remove From List"),
-                self.__contextMenuRemoveSelected)
-        
+                self.tr("Remove From List"), self.__contextMenuRemoveSelected
+            )
+
         menu.exec(QCursor.pos())
-    
+
     def shutdown(self):
         """
         Public method to stop the download manager.
         """
         self.save()
         self.close()
-    
+
     def activeDownloadsCount(self):
         """
         Public method to get the number of active downloads.
-        
+
         @return number of active downloads (integer)
         """
         count = 0
-        
+
         for download in self.__downloads:
             if download.downloading():
                 count += 1
         return count
-    
+
     def allowQuit(self):
         """
         Public method to check, if it is ok to quit.
-        
+
         @return flag indicating allowance to quit (boolean)
         """
         if self.activeDownloadsCount() > 0:
             res = EricMessageBox.yesNo(
                 self,
                 self.tr(""),
-                self.tr("""There are %n downloads in progress.\n"""
-                        """Do you want to quit anyway?""", "",
-                        self.activeDownloadsCount()),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    """There are %n downloads in progress.\n"""
+                    """Do you want to quit anyway?""",
+                    "",
+                    self.activeDownloadsCount(),
+                ),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 self.show()
                 return False
-        
+
         self.close()
         return True
-    
+
     def __testWebBrowserView(self, view, url):
         """
         Private method to test a web browser view against an URL.
-        
+
         @param view reference to the web browser view to be tested
         @type WebBrowserView
         @param url URL to test against
@@ -193,45 +200,43 @@
         """
         if view.tabWidget().count() < 2:
             return False
-        
+
         page = view.page()
         if page.history().count() != 0:
             return False
-        
-        if (
-            not page.url().isEmpty() and
-            page.url().host() == url.host()
-        ):
+
+        if not page.url().isEmpty() and page.url().host() == url.host():
             return True
-        
+
         requestedUrl = page.requestedUrl()
         if requestedUrl.isEmpty():
             requestedUrl = QUrl(view.tabWidget().urlBarForView(view).text())
         return requestedUrl.isEmpty() or requestedUrl.host() == url.host()
-    
+
     def __closeDownloadTab(self, url):
         """
         Private method to close an empty tab, that was opened only for loading
         the download URL.
-        
+
         @param url download URL
         @type QUrl
         """
         if self.__testWebBrowserView(
-           WebBrowserWindow.getWindow().currentBrowser(), url):
+            WebBrowserWindow.getWindow().currentBrowser(), url
+        ):
             WebBrowserWindow.getWindow().closeCurrentBrowser()
             return
-        
+
         for window in WebBrowserWindow.mainWindows():
             for browser in window.browsers():
                 if self.__testWebBrowserView(browser, url):
                     window.closeBrowser(browser)
                     return
-    
+
     def download(self, downloadRequest):
         """
         Public method to download a file.
-        
+
         @param downloadRequest reference to the download object containing the
         download data.
         @type QWebEngineDownloadRequest
@@ -239,60 +244,62 @@
         url = downloadRequest.url()
         if url.isEmpty():
             return
-        
+
         self.__closeDownloadTab(url)
-        
+
         # Safe Browsing
-        from WebBrowser.SafeBrowsing.SafeBrowsingManager import (
-            SafeBrowsingManager
-        )
+        from WebBrowser.SafeBrowsing.SafeBrowsingManager import SafeBrowsingManager
+
         if SafeBrowsingManager.isEnabled():
-            threatLists = (
-                WebBrowserWindow.safeBrowsingManager().lookupUrl(url)[0]
-            )
+            threatLists = WebBrowserWindow.safeBrowsingManager().lookupUrl(url)[0]
             if threatLists:
                 threatMessages = (
-                    WebBrowserWindow.safeBrowsingManager()
-                    .getThreatMessages(threatLists)
+                    WebBrowserWindow.safeBrowsingManager().getThreatMessages(
+                        threatLists
+                    )
                 )
                 res = EricMessageBox.warning(
                     WebBrowserWindow.getWindow(),
                     self.tr("Suspicuous URL detected"),
-                    self.tr("<p>The URL <b>{0}</b> was found in the Safe"
-                            " Browsing database.</p>{1}").format(
-                        url.toString(), "".join(threatMessages)),
+                    self.tr(
+                        "<p>The URL <b>{0}</b> was found in the Safe"
+                        " Browsing database.</p>{1}"
+                    ).format(url.toString(), "".join(threatMessages)),
                     EricMessageBox.Abort | EricMessageBox.Ignore,
-                    EricMessageBox.Abort)
+                    EricMessageBox.Abort,
+                )
                 if res == EricMessageBox.Abort:
                     downloadRequest.cancel()
                     return
-        
+
         window = WebBrowserWindow.getWindow()
         pageUrl = window.currentBrowser().url() if window else QUrl()
         from .DownloadItem import DownloadItem
-        itm = DownloadItem(downloadRequest=downloadRequest, pageUrl=pageUrl,
-                           parent=self)
+
+        itm = DownloadItem(
+            downloadRequest=downloadRequest, pageUrl=pageUrl, parent=self
+        )
         self.__addItem(itm)
-        
+
         if Preferences.getWebBrowser("DownloadManagerAutoOpen"):
             self.show()
         else:
             self.__startUpdateTimer()
-    
+
     def show(self):
         """
         Public slot to show the download manager dialog.
         """
         self.__startUpdateTimer()
-        
+
         super().show()
         self.activateWindow()
         self.raise_()
-    
+
     def __addItem(self, itm, append=False):
         """
         Private method to add a download to the list of downloads.
-        
+
         @param itm reference to the download item
         @type DownloadItem
         @param append flag indicating to append the item
@@ -300,7 +307,7 @@
         """
         itm.statusChanged.connect(lambda: self.__updateRow(itm))
         itm.downloadFinished.connect(self.__finished)
-        
+
         # insert at top of window
         row = self.downloadsCount() if append else 0
         self.__model.beginInsertRows(QModelIndex(), row, row)
@@ -309,153 +316,157 @@
         else:
             self.__downloads.insert(0, itm)
         self.__model.endInsertRows()
-        
+
         self.downloadsView.setIndexWidget(self.__model.index(row, 0), itm)
         icon = self.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)
         itm.setIcon(icon)
         self.downloadsView.setRowHeight(
-            row, int(itm.sizeHint().height() * self.__rowHeightMultiplier))
+            row, int(itm.sizeHint().height() * self.__rowHeightMultiplier)
+        )
         # just in case the download finished before the constructor returned
         self.__updateRow(itm)
         self.changeOccurred()
-        
+
         self.downloadsCountChanged.emit()
-    
+
     def __updateRow(self, itm):
         """
         Private slot to update a download item.
-        
+
         @param itm reference to the download item
         @type DownloadItem
         """
         if itm not in self.__downloads:
             return
-        
+
         row = self.__downloads.index(itm)
-        
+
         if self.__iconProvider is None:
             self.__iconProvider = QFileIconProvider()
-        
+
         icon = self.__iconProvider.icon(QFileInfo(itm.fileName()))
         if icon.isNull():
             icon = self.style().standardIcon(QStyle.StandardPixmap.SP_FileIcon)
         itm.setIcon(icon)
-        
+
         self.downloadsView.setRowHeight(
-            row,
-            int(itm.minimumSizeHint().height() * self.__rowHeightMultiplier))
-        
+            row, int(itm.minimumSizeHint().height() * self.__rowHeightMultiplier)
+        )
+
         remove = False
-        
+
         if (
-            itm.downloadedSuccessfully() and
-            self.removePolicy() == DownloadManager.RemoveSuccessFullDownload
+            itm.downloadedSuccessfully()
+            and self.removePolicy() == DownloadManager.RemoveSuccessFullDownload
         ):
             remove = True
-        
+
         if remove:
             self.__model.removeRow(row)
-        
+
         self.cleanupButton.setEnabled(
-            (self.downloadsCount() - self.activeDownloadsCount()) > 0)
-        
+            (self.downloadsCount() - self.activeDownloadsCount()) > 0
+        )
+
         # record the change
         self.changeOccurred()
-    
+
     def removePolicy(self):
         """
         Public method to get the remove policy.
-        
+
         @return remove policy (integer)
         """
         return Preferences.getWebBrowser("DownloadManagerRemovePolicy")
-    
+
     def setRemovePolicy(self, policy):
         """
         Public method to set the remove policy.
-        
+
         @param policy policy to be set
             (DownloadManager.RemoveExit, DownloadManager.RemoveNever,
              DownloadManager.RemoveSuccessFullDownload)
         """
-        if policy in (DownloadManager.RemoveExit,
-                      DownloadManager.RemoveNever,
-                      DownloadManager.RemoveSuccessFullDownload):
-            
+        if policy in (
+            DownloadManager.RemoveExit,
+            DownloadManager.RemoveNever,
+            DownloadManager.RemoveSuccessFullDownload,
+        ):
+
             if policy == self.removePolicy():
                 return
-            
-            Preferences.setWebBrowser("DownloadManagerRemovePolicy",
-                                      self.policy)
-    
+
+            Preferences.setWebBrowser("DownloadManagerRemovePolicy", self.policy)
+
     def save(self):
         """
         Public method to save the download settings.
         """
         if not self.__loaded:
             return
-        
+
         Preferences.setWebBrowser("DownloadManagerSize", self.size())
         Preferences.setWebBrowser("DownloadManagerPosition", self.pos())
         if self.removePolicy() == DownloadManager.RemoveExit:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if WebBrowserWindow.isPrivate():
             return
-        
+
         downloads = []
         for download in self.__downloads:
             downloads.append(download.getData())
         Preferences.setWebBrowser("DownloadManagerDownloads", downloads)
-    
+
     def __load(self):
         """
         Private method to load the download settings.
         """
         if self.__loaded:
             return
-        
+
         size = Preferences.getWebBrowser("DownloadManagerSize")
         if size.isValid():
             self.resize(size)
         pos = Preferences.getWebBrowser("DownloadManagerPosition")
         self.move(pos)
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.isPrivate():
             downloads = Preferences.getWebBrowser("DownloadManagerDownloads")
             for download in downloads:
-                if (
-                    not download["URL"].isEmpty() and
-                    bool(download["Location"])
-                ):
+                if not download["URL"].isEmpty() and bool(download["Location"]):
                     from .DownloadItem import DownloadItem
+
                     itm = DownloadItem(parent=self)
                     itm.setData(download)
                     self.__addItem(itm, append=True)
             self.cleanupButton.setEnabled(
-                (self.downloadsCount() - self.activeDownloadsCount()) > 0)
-        
+                (self.downloadsCount() - self.activeDownloadsCount()) > 0
+            )
+
         self.__loaded = True
-        
+
         self.downloadsCountChanged.emit()
-    
+
     def closeEvent(self, evt):
         """
         Protected event handler for the close event.
-        
+
         @param evt reference to the close event
         @type QCloseEvent
         """
         self.save()
-    
+
     def cleanup(self):
         """
         Public slot to cleanup the downloads.
         """
         self.on_cleanupButton_clicked()
-    
+
     @pyqtSlot()
     def on_cleanupButton_clicked(self):
         """
@@ -463,114 +474,111 @@
         """
         if self.downloadsCount() == 0:
             return
-        
+
         self.__model.removeRows(0, self.downloadsCount())
-        if (
-            self.downloadsCount() == 0 and
-            self.__iconProvider is not None
-        ):
+        if self.downloadsCount() == 0 and self.__iconProvider is not None:
             self.__iconProvider = None
-        
+
         self.changeOccurred()
-        
+
         self.downloadsCountChanged.emit()
-    
+
     def __finished(self, success):
         """
         Private slot to handle a finished download.
-        
+
         @param success flag indicating a successful download
         @type bool
         """
         if self.isVisible():
             QApplication.alert(self)
-        
+
         self.downloadsCountChanged.emit()
-        
+
         if self.activeDownloadsCount() == 0:
             # all active downloads are done
             if success and ericApp().activeWindow() is not self:
                 WebBrowserWindow.showNotification(
                     UI.PixmapCache.getPixmap("downloads48"),
                     self.tr("Downloads finished"),
-                    self.tr("All files have been downloaded.")
+                    self.tr("All files have been downloaded."),
                 )
                 if not Preferences.getWebBrowser("DownloadManagerAutoClose"):
                     self.raise_()
                     self.activateWindow()
-            
+
             self.__stopUpdateTimer()
             self.infoLabel.clear()
             self.setWindowTitle(self.tr("Download Manager"))
             if Globals.isWindowsPlatform():
                 self.__taskbarButton().progress().hide()
-            
+
             if Preferences.getWebBrowser("DownloadManagerAutoClose"):
                 self.close()
-    
+
     def setDownloadDirectory(self, directory):
         """
         Public method to set the current download directory.
-        
+
         @param directory current download directory (string)
         """
         self.__downloadDirectory = directory
         if self.__downloadDirectory != "":
             self.__downloadDirectory += "/"
-    
+
     def downloadDirectory(self):
         """
         Public method to get the current download directory.
-        
+
         @return current download directory (string)
         """
         return self.__downloadDirectory
-    
+
     def downloadsCount(self):
         """
         Public method to get the number of downloads.
-        
+
         @return number of downloads
         @rtype int
         """
         return len(self.__downloads)
-    
+
     def downloads(self):
         """
         Public method to get a reference to the downloads.
-        
+
         @return reference to the downloads (list of DownloadItem)
         """
         return self.__downloads
-    
+
     def changeOccurred(self):
         """
         Public method to signal a change.
         """
         self.__saveTimer.changeOccurred()
-    
+
     def __taskbarButton(self):
         """
         Private method to get a reference to the task bar button (Windows
         only).
-        
+
         @return reference to the task bar button
         @rtype QWinTaskbarButton or None
         """
         if Globals.isWindowsPlatform():
             from PyQt6.QtWinExtras import QWinTaskbarButton
+
             if self.__winTaskbarButton is None:
                 window = WebBrowserWindow.mainWindow()
-                self.__winTaskbarButton = QWinTaskbarButton(
-                    window.windowHandle())
+                self.__winTaskbarButton = QWinTaskbarButton(window.windowHandle())
                 self.__winTaskbarButton.progress().setRange(0, 100)
-        
+
         return self.__winTaskbarButton
-    
+
     def timerEvent(self, evt):
         """
         Protected event handler for timer events.
-        
+
         @param evt reference to the timer event
         @type QTimerEvent
         """
@@ -584,79 +592,79 @@
             else:
                 progresses = []
                 for itm in self.__downloads:
-                    if (
-                        itm is None or
-                        itm.downloadCanceled() or
-                        not itm.downloading()
-                    ):
+                    if itm is None or itm.downloadCanceled() or not itm.downloading():
                         continue
-                    
-                    progresses.append((
-                        itm.downloadProgress(),
-                        itm.remainingTime(),
-                        itm.currentSpeed()
-                    ))
-                
+
+                    progresses.append(
+                        (
+                            itm.downloadProgress(),
+                            itm.remainingTime(),
+                            itm.currentSpeed(),
+                        )
+                    )
+
                 if not progresses:
                     return
-                
+
                 remaining = 0
                 progress = 0
                 speed = 0.0
-                
+
                 for progressData in progresses:
                     if progressData[1] > remaining:
                         remaining = progressData[1]
                     progress += progressData[0]
                     speed += progressData[2]
                 progress /= len(progresses)
-                
+
                 if self.isVisible():
-                    self.infoLabel.setText(self.tr(
-                        "{0}% of %n file(s) ({1}) {2}", "",
-                        len(progresses)).format(
-                        progress,
-                        speedString(speed),
-                        timeString(remaining),
-                    ))
+                    self.infoLabel.setText(
+                        self.tr(
+                            "{0}% of %n file(s) ({1}) {2}", "", len(progresses)
+                        ).format(
+                            progress,
+                            speedString(speed),
+                            timeString(remaining),
+                        )
+                    )
                     self.setWindowTitle(self.tr("{0}% - Download Manager"))
-                
+
                 if Globals.isWindowsPlatform():
                     self.__taskbarButton().progress().show()
                     self.__taskbarButton().progress().setValue(progress)
-        
+
         super().timerEvent(evt)
-    
+
     def __startUpdateTimer(self):
         """
         Private slot to start the update timer.
         """
         if self.activeDownloadsCount() and not self.__updateTimer.isActive():
             self.__updateTimer.start(DownloadManager.UpdateTimerTimeout, self)
-    
+
     def __stopUpdateTimer(self):
         """
         Private slot to stop the update timer.
         """
         self.__updateTimer.stop()
-    
+
     ###########################################################################
     ## Context menu related methods below
     ###########################################################################
-    
+
     def __currentItem(self):
         """
         Private method to get a reference to the current item.
-        
+
         @return reference to the current item (DownloadItem)
         """
         index = self.downloadsView.currentIndex()
         if index and index.isValid():
             row = index.row()
             return self.__downloads[row]
-        
+
         return None
-    
+
     def __contextMenuOpen(self):
         """
         Private method to open the downloaded file.
@@ -664,7 +672,7 @@
         itm = self.__currentItem()
         if itm is not None:
             itm.openFile()
-    
+
     def __contextMenuOpenFolder(self):
         """
         Private method to open the folder containing the downloaded file.
@@ -672,7 +680,7 @@
         itm = self.__currentItem()
         if itm is not None:
             itm.openFolder()
-    
+
     def __contextMenuCancel(self):
         """
         Private method to cancel the current download.
@@ -680,7 +688,7 @@
         itm = self.__currentItem()
         if itm is not None:
             itm.cancelDownload()
-    
+
     def __contextMenuGotoPage(self):
         """
         Private method to open the download page.
@@ -689,7 +697,7 @@
         if itm is not None:
             url = itm.getPageUrl()
             WebBrowserWindow.mainWindow().openUrl(url, "")
-    
+
     def __contextMenuCopyLink(self):
         """
         Private method to copy the download link to the clipboard.
@@ -697,15 +705,16 @@
         itm = self.__currentItem()
         if itm is not None:
             url = itm.getPageUrl().toDisplayString(
-                QUrl.ComponentFormattingOption.FullyDecoded)
+                QUrl.ComponentFormattingOption.FullyDecoded
+            )
             QApplication.clipboard().setText(url)
-    
+
     def __contextMenuSelectAll(self):
         """
         Private method to select all downloads.
         """
         self.downloadsView.selectAll()
-    
+
     def __contextMenuRemoveSelected(self):
         """
         Private method to remove the selected downloads from the list.
--- a/src/eric7/WebBrowser/Download/DownloadManagerButton.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadManagerButton.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,36 +20,37 @@
     """
     Class implementing a tool button for the download manager.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__manager = WebBrowserWindow.downloadManager()
-        
+
         self.setObjectName("navigation_download_manager_button")
         self.setIcon(UI.PixmapCache.getIcon("downloads"))
         self.setToolTip(self.tr("Open Download Manager"))
         self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.setAutoRaise(True)
-        
+
         self.clicked.connect(self.__buttonClicked)
         self.__manager.downloadsCountChanged.connect(self.__updateState)
-        
+
         self.__updateState()
-    
+
     @pyqtSlot()
     def __buttonClicked(self):
         """
         Private slot handling a user clicking the button.
         """
         self.__manager.show()
-    
+
     @pyqtSlot()
     def __updateState(self):
         """
--- a/src/eric7/WebBrowser/Download/DownloadModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,23 +14,24 @@
     """
     Class implementing the download model.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the download manager
         @type DownloadManager
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
-    
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for
         @type QModelIndex
         @param role role of the data to retrieve
@@ -40,19 +41,19 @@
         """
         if index.row() < 0 or index.row() >= self.rowCount(index.parent()):
             return None
-        
+
         if (
-            role == Qt.ItemDataRole.ToolTipRole and
-            self.__manager.downloads()[index.row()].downloadedSuccessfully()
+            role == Qt.ItemDataRole.ToolTipRole
+            and self.__manager.downloads()[index.row()].downloadedSuccessfully()
         ):
             return self.__manager.downloads()[index.row()].getInfoData()
-        
+
         return None
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index
         @type QModelIndex
         @return number of rows
@@ -60,16 +61,16 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return self.__manager.downloadsCount()
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove downloads from the model.
-        
+
         @param row row of the first download to remove
         @type int
         @param count number of downloads to remove
@@ -81,13 +82,13 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         if row < 0 or count <= 0 or row + count > self.rowCount(parent):
             return False
-        
+
         lastRow = row + count - 1
         for i in range(lastRow, row - 1, -1):
             if not self.__manager.downloads()[i].downloading():
@@ -96,11 +97,11 @@
                 self.endRemoveRows()
         self.__manager.changeOccurred()
         return True
-    
+
     def flags(self, index):
         """
         Public method to get flags for an item.
-        
+
         @param index index of the node cell
         @type QModelIndex
         @return flags
@@ -108,19 +109,19 @@
         """
         if index.row() < 0 or index.row() >= self.rowCount(index.parent()):
             return Qt.ItemFlag.NoItemFlags
-        
+
         defaultFlags = QAbstractListModel.flags(self, index)
-        
+
         itm = self.__manager.downloads()[index.row()]
         if itm.downloadedSuccessfully():
             return defaultFlags | Qt.ItemFlag.ItemIsDragEnabled
-        
+
         return defaultFlags
-    
+
     def mimeData(self, indexes):
         """
         Public method to return the mime data.
-        
+
         @param indexes list of indexes
         @type QModelIndexList
         @return mime data
--- a/src/eric7/WebBrowser/Download/DownloadUtilities.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Download/DownloadUtilities.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,59 +13,65 @@
 def timeString(timeRemaining):
     """
     Module function to format the given time.
-    
+
     @param timeRemaining time to be formatted
     @type float
     @return time string
     @rtype str
     """
     if timeRemaining < 10:
-        return QCoreApplication.translate(
-            "DownloadUtilities", "few seconds remaining")
-    elif timeRemaining < 60:    # < 1 minute
+        return QCoreApplication.translate("DownloadUtilities", "few seconds remaining")
+    elif timeRemaining < 60:  # < 1 minute
         seconds = int(timeRemaining)
         return QCoreApplication.translate(
-            "DownloadUtilities", "%n seconds remaining", "", seconds)
+            "DownloadUtilities", "%n seconds remaining", "", seconds
+        )
     elif timeRemaining < 3600:  # < 1 hour
         minutes = int(timeRemaining / 60)
         return QCoreApplication.translate(
-            "DownloadUtilities", "%n minutes remaining", "", minutes)
+            "DownloadUtilities", "%n minutes remaining", "", minutes
+        )
     else:
         hours = int(timeRemaining / 3600)
         return QCoreApplication.translate(
-            "DownloadUtilities", "%n hours remaining", "", hours)
+            "DownloadUtilities", "%n hours remaining", "", hours
+        )
 
 
 def dataString(size):
     """
     Module function to generate a formatted size string.
-    
+
     @param size size to be formatted
     @type int
     @return formatted data string
     @rtype str
     """
     if size < 1024:
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.1f} Bytes").format(size)
+        return QCoreApplication.translate("DownloadUtilities", "{0:.1f} Bytes").format(
+            size
+        )
     elif size < 1024 * 1024:
         size /= 1024
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.1f} KiB").format(size)
+        return QCoreApplication.translate("DownloadUtilities", "{0:.1f} KiB").format(
+            size
+        )
     elif size < 1024 * 1024 * 1024:
         size /= 1024 * 1024
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.2f} MiB").format(size)
+        return QCoreApplication.translate("DownloadUtilities", "{0:.2f} MiB").format(
+            size
+        )
     else:
         size /= 1024 * 1024 * 1024
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.2f} GiB").format(size)
+        return QCoreApplication.translate("DownloadUtilities", "{0:.2f} GiB").format(
+            size
+        )
 
 
 def speedString(speed):
     """
     Module function to generate a formatted speed string.
-    
+
     @param speed speed to be formatted
     @type float
     @return formatted speed string
@@ -73,20 +79,23 @@
     """
     if speed < 0:
         return QCoreApplication.translate("DownloadUtilities", "Unknown speed")
-    
-    speed /= 1024       # kB
+
+    speed /= 1024  # kB
     if speed < 1024:
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.1f} KiB/s").format(speed)
-    
-    speed /= 1024       # MB
+        return QCoreApplication.translate("DownloadUtilities", "{0:.1f} KiB/s").format(
+            speed
+        )
+
+    speed /= 1024  # MB
     if speed < 1024:
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.2f} MiB/s").format(speed)
-    
-    speed /= 1024       # GB
+        return QCoreApplication.translate("DownloadUtilities", "{0:.2f} MiB/s").format(
+            speed
+        )
+
+    speed /= 1024  # GB
     if speed < 1024:
-        return QCoreApplication.translate(
-            "DownloadUtilities", "{0:.2f} GiB/s").format(speed)
-    
+        return QCoreApplication.translate("DownloadUtilities", "{0:.2f} GiB/s").format(
+            speed
+        )
+
     return ""
--- a/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,12 +22,13 @@
     """
     Class implementing the feature permission bar widget.
     """
+
     DefaultHeight = 30
-    
+
     def __init__(self, page, origin, feature, manager):
         """
         Constructor
-        
+
         @param page reference to the web page
         @type QWebView
         @param origin security origin requesting the feature
@@ -38,51 +39,54 @@
         @type FeaturePermissionManager
         """
         super().__init__(parent=page.view())
-        
+
         self.__origin = QUrl(origin)
         self.__feature = feature
         self.__page = page
         self.__manager = manager
-        
+
         self.__permissionFeatureTexts = {
-            QWebEnginePage.Feature.Geolocation:
-                self.tr("{0} wants to use your position."),
-            QWebEnginePage.Feature.MediaAudioCapture:
-                self.tr("{0} wants to use your microphone."),
-            QWebEnginePage.Feature.MediaVideoCapture:
-                self.tr("{0} wants to use your camera."),
-            QWebEnginePage.Feature.MediaAudioVideoCapture:
-                self.tr("{0} wants to use your microphone and camera."),
-            QWebEnginePage.Feature.MouseLock:
-                self.tr("{0} wants to lock your mouse."),
-            QWebEnginePage.Feature.DesktopVideoCapture:
-                self.tr("{0} wants to capture video of your screen."),
-            QWebEnginePage.Feature.DesktopAudioVideoCapture:
-                self.tr("{0} wants to capture audio and video of your"
-                        " screen."),
+            QWebEnginePage.Feature.Geolocation: self.tr(
+                "{0} wants to use your position."
+            ),
+            QWebEnginePage.Feature.MediaAudioCapture: self.tr(
+                "{0} wants to use your microphone."
+            ),
+            QWebEnginePage.Feature.MediaVideoCapture: self.tr(
+                "{0} wants to use your camera."
+            ),
+            QWebEnginePage.Feature.MediaAudioVideoCapture: self.tr(
+                "{0} wants to use your microphone and camera."
+            ),
+            QWebEnginePage.Feature.MouseLock: self.tr("{0} wants to lock your mouse."),
+            QWebEnginePage.Feature.DesktopVideoCapture: self.tr(
+                "{0} wants to capture video of your screen."
+            ),
+            QWebEnginePage.Feature.DesktopAudioVideoCapture: self.tr(
+                "{0} wants to capture audio and video of your" " screen."
+            ),
         }
         with contextlib.suppress(AttributeError):
             # this was re-added in Qt 5.13.0
             self.__permissionFeatureTexts[
-                QWebEnginePage.Feature.Notifications] = self.tr(
-                "{0} wants to use desktop notifications.")
-        
+                QWebEnginePage.Feature.Notifications
+            ] = self.tr("{0} wants to use desktop notifications.")
+
         self.__permissionFeatureIconNames = {
             QWebEnginePage.Feature.Geolocation: "geolocation",
             QWebEnginePage.Feature.MediaAudioCapture: "audiocapture",
             QWebEnginePage.Feature.MediaVideoCapture: "camera",
             QWebEnginePage.Feature.MediaAudioVideoCapture: "audio-video",
             QWebEnginePage.Feature.MouseLock: "mouse",
-            QWebEnginePage.Feature.DesktopVideoCapture:
-                "desktopVideoCapture",
-            QWebEnginePage.Feature.DesktopAudioVideoCapture:
-                "desktopAudioVideoCapture",
+            QWebEnginePage.Feature.DesktopVideoCapture: "desktopVideoCapture",
+            QWebEnginePage.Feature.DesktopAudioVideoCapture: "desktopAudioVideoCapture",
         }
         with contextlib.suppress(AttributeError):
             # this was re-added in Qt 5.13.0
             self.__permissionFeatureIconNames[
-                QWebEnginePage.Feature.Notifications] = "notification"
-        
+                QWebEnginePage.Feature.Notifications
+            ] = "notification"
+
         self.setAutoFillBackground(True)
         self.__layout = QHBoxLayout()
         self.setLayout(self.__layout)
@@ -96,8 +100,7 @@
         self.__rememberButton.setCheckable(True)
         self.__allowButton = QPushButton(self.tr("Allow"), self)
         self.__denyButton = QPushButton(self.tr("Deny"), self)
-        self.__discardButton = QPushButton(UI.PixmapCache.getIcon("close"),
-                                           "", self)
+        self.__discardButton = QPushButton(UI.PixmapCache.getIcon("close"), "", self)
         self.__allowButton.clicked.connect(self.__permissionGranted)
         self.__denyButton.clicked.connect(self.__permissionDenied)
         self.__discardButton.clicked.connect(self.__permissionUnknown)
@@ -105,25 +108,32 @@
         self.__layout.addWidget(self.__allowButton)
         self.__layout.addWidget(self.__denyButton)
         self.__layout.addWidget(self.__discardButton)
-        
+
         with contextlib.suppress(KeyError):
-            self.__iconLabel.setPixmap(UI.PixmapCache.getPixmap(
-                self.__permissionFeatureIconNames[self.__feature]))
-        
+            self.__iconLabel.setPixmap(
+                UI.PixmapCache.getPixmap(
+                    self.__permissionFeatureIconNames[self.__feature]
+                )
+            )
+
         try:
             self.__messageLabel.setText(
                 self.__permissionFeatureTexts[self.__feature].format(
-                    self.__origin.host()))
+                    self.__origin.host()
+                )
+            )
         except KeyError:
             self.__messageLabel.setText(
                 self.tr("{0} wants to use an unknown feature.").format(
-                    self.__origin.host()))
-        
+                    self.__origin.host()
+                )
+            )
+
         self.__page.loadStarted.connect(self.hide)
-        
+
         self.resize(self.__page.view().width(), self.height())
         self.startAnimation()
-    
+
     @pyqtSlot()
     def hide(self):
         """
@@ -131,52 +141,62 @@
         """
         self.__page.loadStarted.disconnect(self.hide)
         super().hide()
-    
+
     def __permissionDenied(self):
         """
         Private slot handling the user pressing the deny button.
         """
         if self.__page is None or self.__manager is None:
             return
-        
+
         self.__page.setFeaturePermission(
-            self.__origin, self.__feature,
-            QWebEnginePage.PermissionPolicy.PermissionDeniedByUser)
-        
+            self.__origin,
+            self.__feature,
+            QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+        )
+
         if self.__rememberButton.isChecked():
             self.__manager.rememberFeaturePermission(
-                self.__page.url().host(), self.__feature,
-                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser)
-        
+                self.__page.url().host(),
+                self.__feature,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            )
+
         self.hide()
-    
+
     def __permissionGranted(self):
         """
         Private slot handling the user pressing the allow button.
         """
         if self.__page is None or self.__manager is None:
             return
-        
+
         self.__page.setFeaturePermission(
-            self.__origin, self.__feature,
-            QWebEnginePage.PermissionPolicy.PermissionGrantedByUser)
-        
+            self.__origin,
+            self.__feature,
+            QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+        )
+
         if self.__rememberButton.isChecked():
             self.__manager.rememberFeaturePermission(
-                self.__page.url().host(), self.__feature,
-                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser)
-        
+                self.__page.url().host(),
+                self.__feature,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            )
+
         self.hide()
-    
+
     def __permissionUnknown(self):
         """
         Private slot handling the user closing the dialog without.
         """
         if self.__page is None or self.__manager is None:
             return
-        
+
         self.__page.setFeaturePermission(
-            self.__origin, self.__feature,
-            QWebEnginePage.PermissionPolicy.PermissionUnknown)
-        
+            self.__origin,
+            self.__feature,
+            QWebEnginePage.PermissionPolicy.PermissionUnknown,
+        )
+
         self.hide()
--- a/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,17 +19,18 @@
     """
     Class implementing the feature permission manager object.
     """
+
     SettingsKeyFormat = "WebBrowser/FeaturePermissions/{0}"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__featurePermissions = {
             QWebEnginePage.Feature.Geolocation: {
                 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
@@ -52,80 +53,92 @@
                 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
             },
             QWebEnginePage.Feature.DesktopVideoCapture: {
-                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser:
-                    [],
-                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser:
-                    [],
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
             },
             QWebEnginePage.Feature.DesktopAudioVideoCapture: {
-                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser:
-                    [],
-                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser:
-                    [],
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
             },
             QWebEnginePage.Feature.Notifications: {
                 QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: [],
                 QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: [],
-            }
+            },
         }
-        
+
         self.__featurePermissionsKeys = {
-            (QWebEnginePage.Feature.Geolocation,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "GeolocationGranted",
-            (QWebEnginePage.Feature.Geolocation,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "GeolocationDenied",
-            (QWebEnginePage.Feature.MediaAudioCapture,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "MediaAudioCaptureGranted",
-            (QWebEnginePage.Feature.MediaAudioCapture,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "MediaAudioCaptureDenied",
-            (QWebEnginePage.Feature.MediaVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "MediaVideoCaptureGranted",
-            (QWebEnginePage.Feature.MediaVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "MediaVideoCaptureDenied",
-            (QWebEnginePage.Feature.MediaAudioVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "MediaAudioVideoCaptureGranted",
-            (QWebEnginePage.Feature.MediaAudioVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "MediaAudioVideoCaptureDenied",
-            (QWebEnginePage.Feature.MouseLock,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "MouseLockGranted",
-            (QWebEnginePage.Feature.MouseLock,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "MouseLockDenied",
-            (QWebEnginePage.Feature.DesktopVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "DesktopVideoCaptureGranted",
-            (QWebEnginePage.Feature.DesktopVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "DesktopVideoCaptureDenied",
-            (QWebEnginePage.Feature.DesktopAudioVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "DesktopAudioVideoCaptureGranted",
-            (QWebEnginePage.Feature.DesktopAudioVideoCapture,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "DesktopAudioVideoCaptureDenied",
-            (QWebEnginePage.Feature.Notifications,
-             QWebEnginePage.PermissionPolicy.PermissionGrantedByUser):
-            "NotificationsGranted",
-            (QWebEnginePage.Feature.Notifications,
-             QWebEnginePage.PermissionPolicy.PermissionDeniedByUser):
-            "NotificationsDenied",
+            (
+                QWebEnginePage.Feature.Geolocation,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "GeolocationGranted",
+            (
+                QWebEnginePage.Feature.Geolocation,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "GeolocationDenied",
+            (
+                QWebEnginePage.Feature.MediaAudioCapture,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "MediaAudioCaptureGranted",
+            (
+                QWebEnginePage.Feature.MediaAudioCapture,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "MediaAudioCaptureDenied",
+            (
+                QWebEnginePage.Feature.MediaVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "MediaVideoCaptureGranted",
+            (
+                QWebEnginePage.Feature.MediaVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "MediaVideoCaptureDenied",
+            (
+                QWebEnginePage.Feature.MediaAudioVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "MediaAudioVideoCaptureGranted",
+            (
+                QWebEnginePage.Feature.MediaAudioVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "MediaAudioVideoCaptureDenied",
+            (
+                QWebEnginePage.Feature.MouseLock,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "MouseLockGranted",
+            (
+                QWebEnginePage.Feature.MouseLock,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "MouseLockDenied",
+            (
+                QWebEnginePage.Feature.DesktopVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "DesktopVideoCaptureGranted",
+            (
+                QWebEnginePage.Feature.DesktopVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "DesktopVideoCaptureDenied",
+            (
+                QWebEnginePage.Feature.DesktopAudioVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "DesktopAudioVideoCaptureGranted",
+            (
+                QWebEnginePage.Feature.DesktopAudioVideoCapture,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "DesktopAudioVideoCaptureDenied",
+            (
+                QWebEnginePage.Feature.Notifications,
+                QWebEnginePage.PermissionPolicy.PermissionGrantedByUser,
+            ): "NotificationsGranted",
+            (
+                QWebEnginePage.Feature.Notifications,
+                QWebEnginePage.PermissionPolicy.PermissionDeniedByUser,
+            ): "NotificationsDenied",
         }
-        
+
         self.__loaded = False
 
     def requestFeaturePermission(self, page, origin, feature):
         """
         Public method to request a feature permission.
-        
+
         @param page reference to the requesting web page
         @type QWebEnginePage
         @param origin security origin requesting the feature
@@ -135,26 +148,27 @@
         """
         if origin is None or origin.isEmpty():
             return
-        
+
         if not self.__loaded:
             self.__loadSettings()
-        
+
         host = origin.host()
-        
+
         if feature in self.__featurePermissions:
             for permission in self.__featurePermissions[feature]:
                 if host in self.__featurePermissions[feature][permission]:
                     page.setFeaturePermission(origin, feature, permission)
                     return
-        
+
         from .FeaturePermissionBar import FeaturePermissionBar
+
         bar = FeaturePermissionBar(page, origin, feature, self)
         bar.show()
-    
+
     def rememberFeaturePermission(self, host, feature, permission):
         """
         Public method to remember a user decision for a feature permission.
-        
+
         @param host host name to remember the decision for
         @type str
         @param feature feature to be remembered
@@ -163,12 +177,12 @@
         @type QWebEnginePage.PermissionPolicy
         """
         if (
-            feature in self.__featurePermissions and
-            host not in self.__featurePermissions[feature][permission]
+            feature in self.__featurePermissions
+            and host not in self.__featurePermissions[feature][permission]
         ):
             self.__featurePermissions[feature][permission].append(host)
             self.__saveSettings()
-    
+
     def __loadSettings(self):
         """
         Private method to load the remembered feature permissions.
@@ -176,37 +190,34 @@
         if self.__loaded:
             # no reloading allowed
             return
-        
-        for (feature, permission), key in (
-            self.__featurePermissionsKeys.items()
-        ):
-            self.__featurePermissions[feature][permission] = (
-                Globals.toList(Preferences.getSettings().value(
-                    FeaturePermissionManager.SettingsKeyFormat.format(key),
-                    []
-                ))
+
+        for (feature, permission), key in self.__featurePermissionsKeys.items():
+            self.__featurePermissions[feature][permission] = Globals.toList(
+                Preferences.getSettings().value(
+                    FeaturePermissionManager.SettingsKeyFormat.format(key), []
+                )
             )
-        
+
         self.__loaded = True
-    
+
     def __saveSettings(self):
         """
         Private method to save the remembered feature permissions.
         """
         if not self.__loaded:
             return
-        
+
         import WebBrowser.WebBrowserWindow
+
         if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
             return
-        
-        for (feature, permission), key in (
-                self.__featurePermissionsKeys.items()
-        ):
+
+        for (feature, permission), key in self.__featurePermissionsKeys.items():
             Preferences.getSettings().setValue(
                 FeaturePermissionManager.SettingsKeyFormat.format(key),
-                self.__featurePermissions[feature][permission])
-    
+                self.__featurePermissions[feature][permission],
+            )
+
     def showFeaturePermissionsDialog(self):
         """
         Public method to show a dialog to manage the remembered feature
@@ -214,8 +225,9 @@
         """
         if not self.__loaded:
             self.__loadSettings()
-        
+
         from .FeaturePermissionsDialog import FeaturePermissionsDialog
+
         dlg = FeaturePermissionsDialog(self.__featurePermissions)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             newFeaturePermissions = dlg.getData()
--- a/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import (
-    QDialog, QTreeWidgetItem, QTreeWidget, QAbstractItemView
-)
+from PyQt6.QtWidgets import QDialog, QTreeWidgetItem, QTreeWidget, QAbstractItemView
 from PyQt6.QtWebEngineCore import QWebEnginePage
 
 import UI.PixmapCache
@@ -22,10 +20,11 @@
     """
     Class implementing the feature permission dialog.
     """
+
     def __init__(self, featurePermissions, parent=None):
         """
         Constructor
-        
+
         @param featurePermissions dictionary with remembered feature
             permissions
         @type dict of dict of list
@@ -34,13 +33,14 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         # add the various lists
-        
+
         self.notifList = QTreeWidget()
         self.notifList.setAlternatingRowColors(True)
         self.notifList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
         self.notifList.setRootIsDecorated(False)
         self.notifList.setItemsExpandable(False)
         self.notifList.setAllColumnsShowFocus(True)
@@ -51,12 +51,12 @@
         self.tabWidget.addTab(
             self.notifList,
             UI.PixmapCache.getIcon("notification"),
-            self.tr("Notifications"))
-        
+            self.tr("Notifications"),
+        )
+
         self.geoList = QTreeWidget()
         self.geoList.setAlternatingRowColors(True)
-        self.geoList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.geoList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
         self.geoList.setRootIsDecorated(False)
         self.geoList.setItemsExpandable(False)
         self.geoList.setAllColumnsShowFocus(True)
@@ -65,14 +65,12 @@
         self.geoList.headerItem().setText(0, self.tr("Host"))
         self.geoList.headerItem().setText(1, self.tr("Permission"))
         self.tabWidget.addTab(
-            self.geoList,
-            UI.PixmapCache.getIcon("geolocation"),
-            self.tr("Geolocation"))
-        
+            self.geoList, UI.PixmapCache.getIcon("geolocation"), self.tr("Geolocation")
+        )
+
         self.micList = QTreeWidget()
         self.micList.setAlternatingRowColors(True)
-        self.micList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.micList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
         self.micList.setRootIsDecorated(False)
         self.micList.setItemsExpandable(False)
         self.micList.setAllColumnsShowFocus(True)
@@ -81,14 +79,12 @@
         self.micList.headerItem().setText(0, self.tr("Host"))
         self.micList.headerItem().setText(1, self.tr("Permission"))
         self.tabWidget.addTab(
-            self.micList,
-            UI.PixmapCache.getIcon("audiocapture"),
-            self.tr("Microphone"))
-        
+            self.micList, UI.PixmapCache.getIcon("audiocapture"), self.tr("Microphone")
+        )
+
         self.camList = QTreeWidget()
         self.camList.setAlternatingRowColors(True)
-        self.camList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+        self.camList.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
         self.camList.setRootIsDecorated(False)
         self.camList.setItemsExpandable(False)
         self.camList.setAllColumnsShowFocus(True)
@@ -97,14 +93,14 @@
         self.camList.headerItem().setText(0, self.tr("Host"))
         self.camList.headerItem().setText(1, self.tr("Permission"))
         self.tabWidget.addTab(
-            self.camList,
-            UI.PixmapCache.getIcon("camera"),
-            self.tr("Camera"))
-        
+            self.camList, UI.PixmapCache.getIcon("camera"), self.tr("Camera")
+        )
+
         self.micCamList = QTreeWidget()
         self.micCamList.setAlternatingRowColors(True)
         self.micCamList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
         self.micCamList.setRootIsDecorated(False)
         self.micCamList.setItemsExpandable(False)
         self.micCamList.setAllColumnsShowFocus(True)
@@ -115,12 +111,14 @@
         self.tabWidget.addTab(
             self.micCamList,
             UI.PixmapCache.getIcon("audio-video"),
-            self.tr("Microphone && Camera"))
-        
+            self.tr("Microphone && Camera"),
+        )
+
         self.mouseLockList = QTreeWidget()
         self.mouseLockList.setAlternatingRowColors(True)
         self.mouseLockList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
         self.mouseLockList.setRootIsDecorated(False)
         self.mouseLockList.setItemsExpandable(False)
         self.mouseLockList.setAllColumnsShowFocus(True)
@@ -129,14 +127,14 @@
         self.mouseLockList.headerItem().setText(0, self.tr("Host"))
         self.mouseLockList.headerItem().setText(1, self.tr("Permission"))
         self.tabWidget.addTab(
-            self.mouseLockList,
-            UI.PixmapCache.getIcon("mouse"),
-            self.tr("Mouse Lock"))
-        
+            self.mouseLockList, UI.PixmapCache.getIcon("mouse"), self.tr("Mouse Lock")
+        )
+
         self.deskVidList = QTreeWidget()
         self.deskVidList.setAlternatingRowColors(True)
         self.deskVidList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
         self.deskVidList.setRootIsDecorated(False)
         self.deskVidList.setItemsExpandable(False)
         self.deskVidList.setAllColumnsShowFocus(True)
@@ -147,12 +145,14 @@
         self.tabWidget.addTab(
             self.deskVidList,
             UI.PixmapCache.getIcon("desktopVideoCapture"),
-            self.tr("Desktop Video"))
-        
+            self.tr("Desktop Video"),
+        )
+
         self.deskAudVidList = QTreeWidget()
         self.deskAudVidList.setAlternatingRowColors(True)
         self.deskAudVidList.setSelectionMode(
-            QAbstractItemView.SelectionMode.ExtendedSelection)
+            QAbstractItemView.SelectionMode.ExtendedSelection
+        )
         self.deskAudVidList.setRootIsDecorated(False)
         self.deskAudVidList.setItemsExpandable(False)
         self.deskAudVidList.setAllColumnsShowFocus(True)
@@ -163,8 +163,9 @@
         self.tabWidget.addTab(
             self.deskAudVidList,
             UI.PixmapCache.getIcon("desktopAudioVideoCapture"),
-            self.tr("Desktop Audio && Video"))
-        
+            self.tr("Desktop Audio && Video"),
+        )
+
         self.setTabOrder(self.tabWidget, self.notifList)
         self.setTabOrder(self.notifList, self.geoList)
         self.setTabOrder(self.geoList, self.micList)
@@ -175,14 +176,12 @@
         self.setTabOrder(self.deskVidList, self.deskAudVidList)
         self.setTabOrder(self.deskAudVidList, self.removeButton)
         self.setTabOrder(self.removeButton, self.removeAllButton)
-        
+
         self.__permissionStrings = {
-            QWebEnginePage.PermissionPolicy.PermissionGrantedByUser:
-                self.tr("Allow"),
-            QWebEnginePage.PermissionPolicy.PermissionDeniedByUser:
-                self.tr("Deny"),
+            QWebEnginePage.PermissionPolicy.PermissionGrantedByUser: self.tr("Allow"),
+            QWebEnginePage.PermissionPolicy.PermissionDeniedByUser: self.tr("Deny"),
         }
-        
+
         self.__permissionsLists = {
             QWebEnginePage.Feature.Geolocation: self.geoList,
             QWebEnginePage.Feature.MediaAudioCapture: self.micList,
@@ -190,59 +189,55 @@
             QWebEnginePage.Feature.MediaAudioVideoCapture: self.micCamList,
             QWebEnginePage.Feature.MouseLock: self.mouseLockList,
             QWebEnginePage.Feature.DesktopVideoCapture: self.deskVidList,
-            QWebEnginePage.Feature.DesktopAudioVideoCapture:
-                self.deskAudVidList,
+            QWebEnginePage.Feature.DesktopAudioVideoCapture: self.deskAudVidList,
             QWebEnginePage.Feature.Notifications: self.notifList,
         }
-        
+
         for feature, permissionsList in self.__permissionsLists.items():
             for permission in featurePermissions[feature]:
                 for host in featurePermissions[feature][permission]:
                     itm = QTreeWidgetItem(
-                        permissionsList,
-                        [host, self.__permissionStrings[permission]])
+                        permissionsList, [host, self.__permissionStrings[permission]]
+                    )
                     itm.setData(0, Qt.ItemDataRole.UserRole, permission)
-        
+
         self.__previousCurrent = -1
         self.tabWidget.currentChanged.connect(self.__currentTabChanged)
         self.tabWidget.setCurrentIndex(0)
-    
+
     @pyqtSlot(int)
     def __currentTabChanged(self, index):
         """
         Private slot handling changes of the selected tab.
-        
+
         @param index index of the current tab
         @type int
         """
         if self.__previousCurrent >= 0:
             previousList = self.tabWidget.widget(self.__previousCurrent)
-            previousList.itemSelectionChanged.disconnect(
-                self.__itemSelectionChanged)
-        
+            previousList.itemSelectionChanged.disconnect(self.__itemSelectionChanged)
+
         self.__updateButtons()
-        
+
         currentList = self.tabWidget.currentWidget()
         currentList.itemSelectionChanged.connect(self.__itemSelectionChanged)
         self.__previousCurrent = index
-    
+
     def __updateButtons(self):
         """
         Private method to update the buttons.
         """
         currentList = self.tabWidget.currentWidget()
-        self.removeAllButton.setEnabled(
-            currentList.topLevelItemCount() > 0)
-        self.removeButton.setEnabled(
-            len(currentList.selectedItems()) > 0)
-    
+        self.removeAllButton.setEnabled(currentList.topLevelItemCount() > 0)
+        self.removeButton.setEnabled(len(currentList.selectedItems()) > 0)
+
     @pyqtSlot()
     def __itemSelectionChanged(self):
         """
         Private slot handling changes in the current list of selected items.
         """
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -254,7 +249,7 @@
             itm = currentList.takeTopLevelItem(row)
             del itm
         self.__updateButtons()
-    
+
     @pyqtSlot()
     def on_removeAllButton_clicked(self):
         """
@@ -262,14 +257,14 @@
         """
         currentList = self.tabWidget.currentWidget()
         while currentList.topLevelItemCount() > 0:
-            itm = currentList.takeTopLevelItem(0)      # __IGNORE_WARNING__
+            itm = currentList.takeTopLevelItem(0)  # __IGNORE_WARNING__
             del itm
         self.__updateButtons()
-    
+
     def getData(self):
         """
         Public method to retrieve the dialog contents.
-        
+
         @return new feature permission settings
         @rtype dict of dict of list
         """
@@ -284,5 +279,5 @@
                 host = itm.text(0)
                 permission = itm.data(0, Qt.ItemDataRole.UserRole)
                 featurePermissions[feature][permission].append(host)
-        
+
         return featurePermissions
--- a/src/eric7/WebBrowser/Feeds/FeedEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Feeds/FeedEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,66 +17,65 @@
     """
     Class implementing a dialog to edit feed data.
     """
+
     def __init__(self, urlString, title, parent=None):
         """
         Constructor
-        
+
         @param urlString feed URL (string)
         @param title feed title (string)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(False)
-        
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(False)
+
         self.titleEdit.setText(title)
         self.urlEdit.setText(urlString)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __setOkButton(self):
         """
         Private slot to enable or disable the OK button.
         """
         enable = True
-        
+
         enable = enable and bool(self.titleEdit.text())
-        
+
         urlString = self.urlEdit.text()
         enable = enable and bool(urlString)
         if urlString:
             url = QUrl(urlString)
             enable = enable and bool(url.scheme())
             enable = enable and bool(url.host())
-        
-        self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
-    
+
+        self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable)
+
     @pyqtSlot(str)
     def on_titleEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the feed title.
-        
+
         @param txt new feed title (string)
         """
         self.__setOkButton()
-    
+
     @pyqtSlot(str)
     def on_urlEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the feed URL.
-        
+
         @param txt new feed URL (string)
         """
         self.__setOkButton()
-    
+
     def getData(self):
         """
         Public method to get the entered feed data.
-        
+
         @return tuple of two strings giving the feed URL and feed title
             (string, string)
         """
--- a/src/eric7/WebBrowser/Feeds/FeedsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Feeds/FeedsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing a dialog to add RSS feeds.
     """
+
     def __init__(self, availableFeeds, browser, parent=None):
         """
         Constructor
-        
+
         @param availableFeeds list of available RSS feeds (list of tuple of
             two strings)
         @param browser reference to the browser widget (WebBrowserView)
@@ -33,11 +34,11 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("rss48"))
-        
+
         self.__browser = browser
-        
+
         self.__availableFeeds = availableFeeds[:]
         for row in range(len(self.__availableFeeds)):
             feed = self.__availableFeeds[row]
@@ -48,16 +49,15 @@
             label.setText(feed[0])
             self.feedsLayout.addWidget(label, row, 0)
             self.feedsLayout.addWidget(button, row, 1)
-            button.clicked.connect(
-                functools.partial(self.__addFeed, button))
-        
+            button.clicked.connect(functools.partial(self.__addFeed, button))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def __addFeed(self, button):
         """
         Private slot to add a RSS feed.
-        
+
         @param button reference to the feed button
         @type QPushButton
         """
@@ -65,28 +65,29 @@
         url = QUrl(urlString)
         if url.isRelative():
             url = self.__browser.url().resolved(url)
-            urlString = url.toDisplayString(
-                QUrl.ComponentFormattingOption.FullyDecoded)
-        
+            urlString = url.toDisplayString(QUrl.ComponentFormattingOption.FullyDecoded)
+
         if not url.isValid():
             return
-        
-        title = (button.feed[0] if button.feed[0]
-                 else self.__browser.url().host())
-        
+
+        title = button.feed[0] if button.feed[0] else self.__browser.url().host()
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         feedsManager = WebBrowserWindow.feedsManager()
         if feedsManager.addFeed(urlString, title, self.__browser.icon()):
             WebBrowserWindow.showNotification(
                 UI.PixmapCache.getPixmap("rss48"),
                 self.tr("Add RSS Feed"),
-                self.tr("""The feed was added successfully."""))
+                self.tr("""The feed was added successfully."""),
+            )
         else:
             WebBrowserWindow.showNotification(
                 UI.PixmapCache.getPixmap("rss48"),
                 self.tr("Add RSS Feed"),
                 self.tr("""The feed was already added before."""),
                 kind=NotificationTypes.WARNING,
-                timeout=0)
-        
+                timeout=0,
+            )
+
         self.close()
--- a/src/eric7/WebBrowser/Feeds/FeedsManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Feeds/FeedsManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,7 +23,7 @@
 class FeedsManager(QDialog, Ui_FeedsManager):
     """
     Class implementing a RSS feeds manager dialog.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new
@@ -32,53 +32,54 @@
     @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new
         private window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newBackgroundTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
     newPrivateWindow = pyqtSignal(QUrl, str)
-    
+
     UrlStringRole = Qt.ItemDataRole.UserRole
     ErrorDataRole = Qt.ItemDataRole.UserRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__wasShown = False
         self.__loaded = False
         self.__feeds = []
         self.__replies = {}
         # dict key is the id of the request object
         # dict value is a tuple of request and tree item
-        
-        self.feedsTree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+
+        self.feedsTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.feedsTree.customContextMenuRequested.connect(
-            self.__customContextMenuRequested)
+            self.__customContextMenuRequested
+        )
         self.feedsTree.itemActivated.connect(self.__itemActivated)
-    
+
     def show(self):
         """
         Public slot to show the feeds manager dialog.
         """
         super().show()
-        
+
         if not self.__wasShown:
             self.__enableButtons()
             self.on_reloadAllButton_clicked()
             self.__wasShown = True
-    
+
     def addFeed(self, urlString, title, icon):
         """
         Public method to add a feed.
-        
+
         @param urlString URL of the feed (string)
         @param title title of the feed (string)
         @param icon icon for the feed (QIcon)
@@ -86,14 +87,14 @@
         """
         if urlString == "":
             return False
-        
+
         if not self.__loaded:
             self.__load()
-        
+
         # step 1: check, if feed was already added
         if any(feed[0] == urlString for feed in self.__feeds):
             return False
-        
+
         # step 2: add the feed
         if icon.isNull():
             icon = UI.PixmapCache.getIcon("rss16")
@@ -101,41 +102,41 @@
         self.__feeds.append(feed)
         self.__addFeedItem(feed)
         self.__save()
-        
+
         return True
-    
+
     def __addFeedItem(self, feed):
         """
         Private slot to add a top level feed item.
-        
+
         @param feed tuple containing feed info (URL, title, icon)
             (string, string, QIcon)
         """
         itm = QTreeWidgetItem(self.feedsTree, [feed[1]])
         itm.setIcon(0, feed[2])
         itm.setData(0, FeedsManager.UrlStringRole, feed[0])
-    
+
     def __load(self):
         """
         Private method to load the feeds data.
         """
         self.__feeds = Preferences.getWebBrowser("RssFeeds")
         self.__loaded = True
-        
+
         # populate the feeds tree top level with the feeds
         self.feedsTree.clear()
         for feed in self.__feeds:
             self.__addFeedItem(feed)
-    
+
     def __save(self):
         """
         Private method to store the feeds data.
         """
         if not self.__loaded:
             self.__load()
-        
+
         Preferences.setWebBrowser("RssFeeds", self.__feeds)
-    
+
     @pyqtSlot()
     def on_reloadAllButton_clicked(self):
         """
@@ -143,11 +144,11 @@
         """
         if not self.__loaded:
             self.__load()
-        
+
         for index in range(self.feedsTree.topLevelItemCount()):
             itm = self.feedsTree.topLevelItem(index)
             self.__reloadFeed(itm)
-    
+
     @pyqtSlot()
     def on_reloadButton_clicked(self):
         """
@@ -155,7 +156,7 @@
         """
         itm = self.feedsTree.selectedItems()[0]
         self.__reloadFeed(itm)
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
@@ -164,7 +165,7 @@
         itm = self.feedsTree.selectedItems()[0]
         origTitle = itm.text(0)
         origUrlString = itm.data(0, FeedsManager.UrlStringRole)
-        
+
         feedToChange = None
         for feed in self.__feeds:
             if feed[0] == origUrlString:
@@ -172,8 +173,9 @@
                 break
         if feedToChange:
             feedIndex = self.__feeds.index(feedToChange)
-            
+
             from .FeedEditDialog import FeedEditDialog
+
             dlg = FeedEditDialog(origUrlString, origTitle)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 urlString, title = dlg.getData()
@@ -184,16 +186,18 @@
                             self.tr("Duplicate Feed URL"),
                             self.tr(
                                 """A feed with the URL {0} exists already."""
-                                """ Aborting...""".format(urlString)))
+                                """ Aborting...""".format(urlString)
+                            ),
+                        )
                         return
-                
+
                 self.__feeds[feedIndex] = (urlString, title, feedToChange[2])
                 self.__save()
-                
+
                 itm.setText(0, title)
                 itm.setData(0, FeedsManager.UrlStringRole, urlString)
                 self.__reloadFeed(itm)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -206,7 +210,9 @@
             self.tr("Delete Feed"),
             self.tr(
                 """<p>Do you really want to delete the feed"""
-                """ <b>{0}</b>?</p>""".format(title)))
+                """ <b>{0}</b>?</p>""".format(title)
+            ),
+        )
         if res:
             urlString = itm.data(0, FeedsManager.UrlStringRole)
             if urlString:
@@ -218,71 +224,73 @@
                 if feedToDelete:
                     self.__feeds.remove(feedToDelete)
                     self.__save()
-                
+
                 index = self.feedsTree.indexOfTopLevelItem(itm)
                 if index != -1:
                     self.feedsTree.takeTopLevelItem(index)
                     del itm
-    
+
     @pyqtSlot()
     def on_feedsTree_itemSelectionChanged(self):
         """
         Private slot to enable the various buttons depending on the selection.
         """
         self.__enableButtons()
-    
+
     def __enableButtons(self):
         """
         Private slot to disable/enable various buttons.
         """
         selItems = self.feedsTree.selectedItems()
-        enable = (len(selItems) == 1 and
-                  self.feedsTree.indexOfTopLevelItem(selItems[0]) != -1)
-        
+        enable = (
+            len(selItems) == 1 and self.feedsTree.indexOfTopLevelItem(selItems[0]) != -1
+        )
+
         self.reloadButton.setEnabled(enable)
         self.editButton.setEnabled(enable)
         self.deleteButton.setEnabled(enable)
-    
+
     def __reloadFeed(self, itm):
         """
         Private method to reload the given feed.
-        
+
         @param itm feed item to be reloaded (QTreeWidgetItem)
         """
         urlString = itm.data(0, FeedsManager.UrlStringRole)
         if urlString == "":
             return
-        
+
         for child in itm.takeChildren():
             del child
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         request = QNetworkRequest(QUrl(urlString))
         reply = WebBrowserWindow.networkManager().get(request)
         reply.finished.connect(lambda: self.__feedLoaded(reply))
         self.__replies[id(reply)] = (reply, itm)
-    
+
     def __feedLoaded(self, reply):
         """
         Private slot to extract the loaded feed data.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         if id(reply) not in self.__replies:
             return
-        
+
         topItem = self.__replies[id(reply)][1]
         del self.__replies[id(reply)]
-        
+
         if reply.error() == QNetworkReply.NetworkError.NoError:
             linkString = ""
             titleString = ""
-            
+
             xml = QXmlStreamReader()
             xmlData = reply.readAll()
             xml.addData(xmlData)
-            
+
             while not xml.atEnd():
                 xml.readNext()
                 if xml.isStartElement():
@@ -297,7 +305,7 @@
                         itm.setText(0, titleString)
                         itm.setData(0, FeedsManager.UrlStringRole, linkString)
                         itm.setIcon(0, UI.PixmapCache.getIcon("rss16"))
-                        
+
                         linkString = ""
                         titleString = ""
                 elif xml.isCharacters() and not xml.isWhitespace():
@@ -305,14 +313,15 @@
                         titleString = xml.text()
                     elif currentTag == "link":
                         linkString += xml.text()
-            
+
             if topItem.childCount() == 0:
                 itm = QTreeWidgetItem(topItem)
                 itm.setText(0, self.tr("Error fetching feed"))
                 itm.setData(0, FeedsManager.UrlStringRole, "")
-                itm.setData(0, FeedsManager.ErrorDataRole,
-                            str(xmlData, encoding="utf-8"))
-            
+                itm.setData(
+                    0, FeedsManager.ErrorDataRole, str(xmlData, encoding="utf-8")
+                )
+
             topItem.setExpanded(True)
         else:
             linkString = ""
@@ -321,105 +330,99 @@
             itm.setText(0, titleString)
             itm.setData(0, FeedsManager.UrlStringRole, linkString)
             topItem.setExpanded(True)
-    
+
     def __customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request for the feeds tree.
-        
+
         @param pos position the context menu was requested (QPoint)
         """
         itm = self.feedsTree.currentItem()
         if itm is None:
             return
-        
+
         if self.feedsTree.indexOfTopLevelItem(itm) != -1:
             return
-        
+
         urlString = itm.data(0, FeedsManager.UrlStringRole)
         if urlString:
             menu = QMenu()
-            menu.addAction(
-                self.tr("&Open"), self.__openMessageInCurrentTab)
-            menu.addAction(
-                self.tr("Open in New &Tab"), self.__openMessageInNewTab)
+            menu.addAction(self.tr("&Open"), self.__openMessageInCurrentTab)
+            menu.addAction(self.tr("Open in New &Tab"), self.__openMessageInNewTab)
             menu.addAction(
                 self.tr("Open in New &Background Tab"),
-                self.__openMessageInNewBackgroundTab)
+                self.__openMessageInNewBackgroundTab,
+            )
             menu.addAction(
-                self.tr("Open in New &Window"), self.__openMessageInNewWindow)
+                self.tr("Open in New &Window"), self.__openMessageInNewWindow
+            )
             menu.addAction(
                 self.tr("Open in New Pri&vate Window"),
-                self.__openMessageInPrivateWindow)
+                self.__openMessageInPrivateWindow,
+            )
             menu.addSeparator()
-            menu.addAction(self.tr("&Copy URL to Clipboard"),
-                           self.__copyUrlToClipboard)
+            menu.addAction(self.tr("&Copy URL to Clipboard"), self.__copyUrlToClipboard)
             menu.exec(QCursor.pos())
         else:
             errorString = itm.data(0, FeedsManager.ErrorDataRole)
             if errorString:
                 menu = QMenu()
-                menu.addAction(
-                    self.tr("&Show error data"), self.__showError)
+                menu.addAction(self.tr("&Show error data"), self.__showError)
                 menu.exec(QCursor.pos())
-    
+
     def __itemActivated(self, itm, column):
         """
         Private slot to handle the activation of an item.
-        
+
         @param itm reference to the activated item (QTreeWidgetItem)
         @param column column of the activation (integer)
         """
         if self.feedsTree.indexOfTopLevelItem(itm) != -1:
             return
-        
-        if (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ControlModifier
-        ):
+
+        if QApplication.keyboardModifiers() & Qt.KeyboardModifier.ControlModifier:
             self.__openMessageInNewTab()
-        elif (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ShiftModifier
-        ):
+        elif QApplication.keyboardModifiers() & Qt.KeyboardModifier.ShiftModifier:
             self.__openMessageInNewWindow()
         else:
             self.__openMessageInCurrentTab()
-        
+
     def __openMessageInCurrentTab(self):
         """
         Private slot to open a feed message in the current browser tab.
         """
         self.__openMessage()
-    
+
     def __openMessageInNewTab(self):
         """
         Private slot to open a feed message in a new browser tab.
         """
         self.__openMessage(newTab=True)
-    
+
     def __openMessageInNewBackgroundTab(self):
         """
         Private slot to open a feed message in a new background tab.
         """
         self.__openMessage(newTab=True, background=True)
-    
+
     def __openMessageInNewWindow(self):
         """
         Private slot to open a feed message in a new browser window.
         """
         self.__openMessage(newWindow=True)
-    
+
     def __openMessageInPrivateWindow(self):
         """
         Private slot to open a feed message in a new private browser window.
         """
         self.__openMessage(newWindow=True, privateWindow=True)
-    
-    def __openMessage(self, newTab=False, background=False,
-                      newWindow=False, privateWindow=False):
+
+    def __openMessage(
+        self, newTab=False, background=False, newWindow=False, privateWindow=False
+    ):
         """
         Private method to open a feed message.
-        
+
         @param newTab flag indicating to open the feed message in a new tab
         @type bool
         @param background flag indicating to open the bookmark in a new
@@ -434,11 +437,11 @@
         itm = self.feedsTree.currentItem()
         if itm is None:
             return
-        
+
         urlString = itm.data(0, FeedsManager.UrlStringRole)
         if urlString:
             title = itm.text(0)
-            
+
             if newTab:
                 if background:
                     self.newBackgroundTab.emit(QUrl(urlString), title)
@@ -455,7 +458,7 @@
             errorString = itm.data(0, FeedsManager.ErrorDataRole)
             if errorString:
                 self.__showError()
-    
+
     def __copyUrlToClipboard(self):
         """
         Private slot to copy the URL of the selected item to the clipboard.
@@ -463,14 +466,14 @@
         itm = self.feedsTree.currentItem()
         if itm is None:
             return
-        
+
         if self.feedsTree.indexOfTopLevelItem(itm) != -1:
             return
-        
+
         urlString = itm.data(0, FeedsManager.UrlStringRole)
         if urlString:
             QApplication.clipboard().setText(urlString)
-    
+
     def __showError(self):
         """
         Private slot to show error info for a failed load operation.
@@ -478,10 +481,9 @@
         itm = self.feedsTree.currentItem()
         if itm is None:
             return
-        
+
         errorStr = itm.data(0, FeedsManager.ErrorDataRole)
         if errorStr:
             EricMessageBox.critical(
-                self,
-                self.tr("Error loading feed"),
-                "{0}".format(errorStr))
+                self, self.tr("Error loading feed"), "{0}".format(errorStr)
+            )
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyAddScriptDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyAddScriptDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     """
     Class implementing a dialog for adding GreaseMonkey scripts..
     """
+
     def __init__(self, manager, script, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the GreaseMonkey manager
             (GreaseMonkeyManager)
         @param script GreaseMonkey script to be added (GreaseMonkeyScript)
@@ -35,72 +36,77 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("greaseMonkey48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("greaseMonkey48"))
+
         self.__manager = manager
         self.__script = script
-        
+
         runsAt = ""
         doesNotRunAt = ""
-        
+
         include = script.include()
         exclude = script.exclude()
-        
+
         if include:
             runsAt = self.tr("<p>runs at:<br/><i>{0}</i></p>").format(
-                "<br/>".join(include))
-        
+                "<br/>".join(include)
+            )
+
         if exclude:
-            doesNotRunAt = self.tr(
-                "<p>does not run at:<br/><i>{0}</i></p>").format(
-                "<br/>".join(exclude))
-        
+            doesNotRunAt = self.tr("<p>does not run at:<br/><i>{0}</i></p>").format(
+                "<br/>".join(exclude)
+            )
+
         scriptInfoTxt = "<p><b>{0}</b> {1}<br/>{2}</p>{3}{4}".format(
-            script.name(), script.version(), script.description(), runsAt,
-            doesNotRunAt)
+            script.name(), script.version(), script.description(), runsAt, doesNotRunAt
+        )
         self.scriptInfo.setHtml(scriptInfoTxt)
-        
+
         self.accepted.connect(self.__accepted)
-    
+
     @pyqtSlot()
     def on_showScriptSourceButton_clicked(self):
         """
         Private slot to show an editor window with the source code.
         """
         from WebBrowser.Tools import WebBrowserTools
-        
+
         tmpFileName = WebBrowserTools.ensureUniqueFilename(
-            os.path.join(QDir.tempPath(), "tmp-userscript.js"))
+            os.path.join(QDir.tempPath(), "tmp-userscript.js")
+        )
         if shutil.copy(self.__script.fileName(), tmpFileName):
             from QScintilla.MiniEditor import MiniEditor
+
             editor = MiniEditor(tmpFileName, "JavaScript", self)
             editor.show()
-    
+
     def __accepted(self):
         """
         Private slot handling the accepted signal.
         """
         if self.__manager.addScript(self.__script):
-            msg = self.tr(
-                "<p><b>{0}</b> installed successfully.</p>").format(
-                self.__script.name())
+            msg = self.tr("<p><b>{0}</b> installed successfully.</p>").format(
+                self.__script.name()
+            )
             success = True
         else:
             msg = self.tr("<p>Cannot install script.</p>")
             success = False
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if success:
             WebBrowserWindow.showNotification(
                 UI.PixmapCache.getPixmap("greaseMonkey48"),
                 self.tr("GreaseMonkey Script Installation"),
-                msg)
+                msg,
+            )
         else:
             WebBrowserWindow.showNotification(
                 UI.PixmapCache.getPixmap("greaseMonkey48"),
                 self.tr("GreaseMonkey Script Installation"),
                 msg,
                 kind=NotificationTypes.CRITICAL,
-                timeout=0)
+                timeout=0,
+            )
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,80 +13,78 @@
 
 from EricWidgets import EricMessageBox
 
-from .Ui_GreaseMonkeyConfigurationDialog import (
-    Ui_GreaseMonkeyConfigurationDialog
-)
+from .Ui_GreaseMonkeyConfigurationDialog import Ui_GreaseMonkeyConfigurationDialog
 
 import UI.PixmapCache
 
 
-class GreaseMonkeyConfigurationDialog(
-        QDialog, Ui_GreaseMonkeyConfigurationDialog):
+class GreaseMonkeyConfigurationDialog(QDialog, Ui_GreaseMonkeyConfigurationDialog):
     """
     Class implementing the GreaseMonkey scripts configuration dialog.
     """
+
     ScriptVersionRole = Qt.ItemDataRole.UserRole
     ScriptDescriptionRole = Qt.ItemDataRole.UserRole + 1
     ScriptRole = Qt.ItemDataRole.UserRole + 2
-    
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the manager object (GreaseMonkeyManager)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("greaseMonkey48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("greaseMonkey48"))
+
         self.__manager = manager
-        
+
         self.__loadScripts()
-        
+
         self.scriptsList.removeItemRequested.connect(self.__removeItem)
         self.scriptsList.itemChanged.connect(self.__itemChanged)
-    
+
     @pyqtSlot()
     def on_openDirectoryButton_clicked(self):
         """
         Private slot to open the GreaseMonkey scripts directory.
         """
-        QDesktopServices.openUrl(
-            QUrl.fromLocalFile(self.__manager.scriptsDirectory()))
-    
+        QDesktopServices.openUrl(QUrl.fromLocalFile(self.__manager.scriptsDirectory()))
+
     @pyqtSlot(str)
     def on_downloadLabel_linkActivated(self, link):
         """
         Private slot to open the greasyfork.org web site.
-        
+
         @param link URL (string)
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not link or "userscript.org" in link:
             # userscript.org is down, default to Greasy Fork.
             link = "https://greasyfork.org/"
         WebBrowserWindow.mainWindow().newTab(QUrl(link))
         self.close()
-    
+
     @pyqtSlot(QListWidgetItem)
     def on_scriptsList_itemDoubleClicked(self, item):
         """
         Private slot to show information about the selected script.
-        
+
         @param item reference to the double clicked item (QListWidgetItem)
         """
         script = self.__getScript(item)
         if script is not None:
             from .GreaseMonkeyConfigurationScriptInfoDialog import (
-                GreaseMonkeyConfigurationScriptInfoDialog
+                GreaseMonkeyConfigurationScriptInfoDialog,
             )
+
             infoDlg = GreaseMonkeyConfigurationScriptInfoDialog(script, self)
             infoDlg.exec()
-    
+
     def __loadScripts(self):
         """
         Private method to load all the available scripts.
@@ -99,11 +97,12 @@
                 icon = UI.PixmapCache.getIcon("greaseMonkeyScript")
             itm.setIcon(icon)
             itm.setData(
-                GreaseMonkeyConfigurationDialog.ScriptVersionRole,
-                script.version())
+                GreaseMonkeyConfigurationDialog.ScriptVersionRole, script.version()
+            )
             itm.setData(
                 GreaseMonkeyConfigurationDialog.ScriptDescriptionRole,
-                script.description())
+                script.description(),
+            )
             itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable)
             if script.isEnabled():
                 itm.setCheckState(Qt.CheckState.Checked)
@@ -111,9 +110,9 @@
                 itm.setCheckState(Qt.CheckState.Unchecked)
             itm.setData(GreaseMonkeyConfigurationDialog.ScriptRole, script)
             self.scriptsList.addItem(itm)
-        
+
         self.scriptsList.sortItems()
-        
+
         itemMoved = True
         while itemMoved:
             itemMoved = False
@@ -122,58 +121,59 @@
                 bottomItem = self.scriptsList.item(row + 1)
                 if topItem is None or bottomItem is None:
                     continue
-                
+
                 if (
-                    topItem.checkState() == Qt.CheckState.Unchecked and
-                    bottomItem.checkState == Qt.CheckState.Checked
+                    topItem.checkState() == Qt.CheckState.Unchecked
+                    and bottomItem.checkState == Qt.CheckState.Checked
                 ):
                     itm = self.scriptsList.takeItem(row + 1)
                     self.scriptsList.insertItem(row, itm)
                     itemMoved = True
-    
+
     def __getScript(self, itm):
         """
         Private method to get the script for the given item.
-        
+
         @param itm item to get script for (QListWidgetItem)
         @return reference to the script object (GreaseMonkeyScript)
         """
         if itm is None:
             return None
-        
+
         script = itm.data(GreaseMonkeyConfigurationDialog.ScriptRole)
         return script
-    
+
     def __removeItem(self, itm):
         """
         Private slot to remove a script item.
-        
+
         @param itm item to be removed (QListWidgetItem)
         """
         script = self.__getScript(itm)
         if script is None:
             return
-        
+
         removeIt = EricMessageBox.yesNo(
             self,
             self.tr("Remove Script"),
-            self.tr(
-                """<p>Are you sure you want to remove <b>{0}</b>?</p>""")
-            .format(script.name()))
+            self.tr("""<p>Are you sure you want to remove <b>{0}</b>?</p>""").format(
+                script.name()
+            ),
+        )
         if removeIt and self.__manager.removeScript(script):
             self.scriptsList.takeItem(self.scriptsList.row(itm))
             del itm
-    
+
     def __itemChanged(self, itm):
         """
         Private slot to handle changes of a script item.
-        
+
         @param itm changed item (QListWidgetItem)
         """
         script = self.__getScript(itm)
         if script is None:
             return
-        
+
         if itm.checkState() == Qt.CheckState.Checked:
             self.__manager.enableScript(script)
         else:
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,163 +22,193 @@
     Class implementing a delegate for the special list widget for GreaseMonkey
     scripts.
     """
+
     IconSize = 32
     RemoveIconSize = 16
     CheckBoxSize = 18
     MinPadding = 5
     ItemWidth = 200
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
-        self.__removePixmap = UI.PixmapCache.getIcon(
-            "greaseMonkeyTrash").pixmap(
-                GreaseMonkeyConfigurationListDelegate.RemoveIconSize)
+
+        self.__removePixmap = UI.PixmapCache.getIcon("greaseMonkeyTrash").pixmap(
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize
+        )
         self.__rowHeight = 0
         self.__padding = 0
-    
+
     def padding(self):
         """
         Public method to get the padding used.
-        
+
         @return padding used (integer)
         """
         return self.__padding
-    
+
     def paint(self, painter, option, index):
         """
         Public method to paint the specified list item.
-        
+
         @param painter painter object to paint to (QPainter)
         @param option style option used for painting (QStyleOptionViewItem)
         @param index model index of the item (QModelIndex)
         """
         opt = QStyleOptionViewItem(option)
         self.initStyleOption(opt, index)
-        
+
         widget = opt.widget
         style = widget.style() if widget is not None else QApplication.style()
         height = opt.rect.height()
         center = height // 2 + opt.rect.top()
-        
+
         # Prepare title font
         titleFont = QFont(opt.font)
         titleFont.setBold(True)
         titleFont.setPointSize(titleFont.pointSize() + 1)
-        
+
         titleMetrics = QFontMetrics(titleFont)
         colorRole = (
             QPalette.ColorRole.Text
-            if Globals.isWindowsPlatform() else
-            (QPalette.ColorRole.HighlightedText
-             if opt.state & QStyle.StateFlag.State_Selected else
-             QPalette.ColorRole.Text)
+            if Globals.isWindowsPlatform()
+            else (
+                QPalette.ColorRole.HighlightedText
+                if opt.state & QStyle.StateFlag.State_Selected
+                else QPalette.ColorRole.Text
+            )
         )
-        
+
         leftPos = self.__padding
         rightPos = (
-            opt.rect.right() - self.__padding -
-            GreaseMonkeyConfigurationListDelegate.RemoveIconSize
+            opt.rect.right()
+            - self.__padding
+            - GreaseMonkeyConfigurationListDelegate.RemoveIconSize
         )
-        
+
         # Draw background
         style.drawPrimitive(
-            QStyle.PrimitiveElement.PE_PanelItemViewItem, opt, painter, widget)
-        
+            QStyle.PrimitiveElement.PE_PanelItemViewItem, opt, painter, widget
+        )
+
         # Draw checkbox
-        checkBoxYPos = (
-            center -
-            GreaseMonkeyConfigurationListDelegate.CheckBoxSize // 2
-        )
+        checkBoxYPos = center - GreaseMonkeyConfigurationListDelegate.CheckBoxSize // 2
         opt2 = QStyleOptionViewItem(opt)
         if opt2.checkState == Qt.CheckState.Checked:
             opt2.state |= QStyle.StateFlag.State_On
         else:
             opt2.state |= QStyle.StateFlag.State_Off
         styleCheckBoxRect = style.subElementRect(
-            QStyle.SubElement.SE_CheckBoxIndicator, opt2, widget)
+            QStyle.SubElement.SE_CheckBoxIndicator, opt2, widget
+        )
         opt2.rect = QRect(
-            leftPos, checkBoxYPos,
-            styleCheckBoxRect.width(), styleCheckBoxRect.height())
+            leftPos, checkBoxYPos, styleCheckBoxRect.width(), styleCheckBoxRect.height()
+        )
         style.drawPrimitive(
-            QStyle.PrimitiveElement.PE_IndicatorCheckBox, opt2, painter,
-            widget)
+            QStyle.PrimitiveElement.PE_IndicatorCheckBox, opt2, painter, widget
+        )
         leftPos = opt2.rect.right() + self.__padding
-        
+
         # Draw icon
         iconYPos = center - GreaseMonkeyConfigurationListDelegate.IconSize // 2
-        iconRect = QRect(leftPos, iconYPos,
-                         GreaseMonkeyConfigurationListDelegate.IconSize,
-                         GreaseMonkeyConfigurationListDelegate.IconSize)
+        iconRect = QRect(
+            leftPos,
+            iconYPos,
+            GreaseMonkeyConfigurationListDelegate.IconSize,
+            GreaseMonkeyConfigurationListDelegate.IconSize,
+        )
         pixmap = index.data(Qt.ItemDataRole.DecorationRole).pixmap(
-            GreaseMonkeyConfigurationListDelegate.IconSize)
+            GreaseMonkeyConfigurationListDelegate.IconSize
+        )
         painter.drawPixmap(iconRect, pixmap)
         leftPos = iconRect.right() + self.__padding
-        
+
         # Draw script name
         name = index.data(Qt.ItemDataRole.DisplayRole)
         leftTitleEdge = leftPos + 2
         rightTitleEdge = rightPos - self.__padding
         try:
-            leftPosForVersion = (
-                titleMetrics.horizontalAdvance(name) + self.__padding
-            )
+            leftPosForVersion = titleMetrics.horizontalAdvance(name) + self.__padding
         except AttributeError:
             leftPosForVersion = titleMetrics.width(name) + self.__padding
-        nameRect = QRect(leftTitleEdge, opt.rect.top() + self.__padding,
-                         rightTitleEdge - leftTitleEdge, titleMetrics.height())
+        nameRect = QRect(
+            leftTitleEdge,
+            opt.rect.top() + self.__padding,
+            rightTitleEdge - leftTitleEdge,
+            titleMetrics.height(),
+        )
         painter.setFont(titleFont)
         style.drawItemText(
-            painter, nameRect,
-            Qt.AlignmentFlag.AlignLeft, opt.palette, True,
-            name, colorRole)
-        
+            painter,
+            nameRect,
+            Qt.AlignmentFlag.AlignLeft,
+            opt.palette,
+            True,
+            name,
+            colorRole,
+        )
+
         # Draw version
         version = index.data(Qt.ItemDataRole.UserRole)
         versionRect = QRect(
-            nameRect.x() + leftPosForVersion, nameRect.y(),
-            rightTitleEdge - leftTitleEdge, titleMetrics.height())
+            nameRect.x() + leftPosForVersion,
+            nameRect.y(),
+            rightTitleEdge - leftTitleEdge,
+            titleMetrics.height(),
+        )
         versionFont = titleFont
         painter.setFont(versionFont)
         style.drawItemText(
-            painter, versionRect,
-            Qt.AlignmentFlag.AlignLeft, opt.palette,
-            True, version, colorRole)
-        
+            painter,
+            versionRect,
+            Qt.AlignmentFlag.AlignLeft,
+            opt.palette,
+            True,
+            version,
+            colorRole,
+        )
+
         # Draw description
         infoYPos = nameRect.bottom() + opt.fontMetrics.leading()
         infoRect = QRect(
-            nameRect.x(), infoYPos,
-            nameRect.width(), opt.fontMetrics.height())
+            nameRect.x(), infoYPos, nameRect.width(), opt.fontMetrics.height()
+        )
         info = opt.fontMetrics.elidedText(
             index.data(Qt.ItemDataRole.UserRole + 1),
-            Qt.TextElideMode.ElideRight, infoRect.width())
+            Qt.TextElideMode.ElideRight,
+            infoRect.width(),
+        )
         painter.setFont(opt.font)
         style.drawItemText(
-            painter, infoRect,
+            painter,
+            infoRect,
             Qt.AlignmentFlag.AlignLeft | Qt.TextFlag.TextSingleLine,
-            opt.palette, True, info, colorRole)
-        
+            opt.palette,
+            True,
+            info,
+            colorRole,
+        )
+
         # Draw remove button
         removeIconYPos = (
-            center -
-            GreaseMonkeyConfigurationListDelegate.RemoveIconSize // 2
+            center - GreaseMonkeyConfigurationListDelegate.RemoveIconSize // 2
         )
         removeIconRect = QRect(
-            rightPos, removeIconYPos,
+            rightPos,
+            removeIconYPos,
+            GreaseMonkeyConfigurationListDelegate.RemoveIconSize,
             GreaseMonkeyConfigurationListDelegate.RemoveIconSize,
-            GreaseMonkeyConfigurationListDelegate.RemoveIconSize)
+        )
         painter.drawPixmap(removeIconRect, self.__removePixmap)
-    
+
     def sizeHint(self, option, index):
         """
         Public method to get a size hint for the specified list item.
-        
+
         @param option style option used for painting (QStyleOptionViewItem)
         @param index model index of the item (QModelIndex)
         @return size hint (QSize)
@@ -186,33 +216,28 @@
         if not self.__rowHeight:
             opt = QStyleOptionViewItem(option)
             self.initStyleOption(opt, index)
-            
+
             widget = opt.widget
-            style = (
-                widget.style() if widget is not None
-                else QApplication.style()
-            )
-            padding = style.pixelMetric(
-                QStyle.PixelMetric.PM_FocusFrameHMargin) + 1
-            
+            style = widget.style() if widget is not None else QApplication.style()
+            padding = style.pixelMetric(QStyle.PixelMetric.PM_FocusFrameHMargin) + 1
+
             titleFont = opt.font
             titleFont.setBold(True)
             titleFont.setPointSize(titleFont.pointSize() + 1)
-            
+
             self.__padding = (
                 padding
                 if padding > GreaseMonkeyConfigurationListDelegate.MinPadding
                 else GreaseMonkeyConfigurationListDelegate.MinPadding
             )
-            
+
             titleMetrics = QFontMetrics(titleFont)
-            
+
             self.__rowHeight = (
-                2 * self.__padding +
-                opt.fontMetrics.leading() +
-                opt.fontMetrics.height() +
-                titleMetrics.height()
+                2 * self.__padding
+                + opt.fontMetrics.leading()
+                + opt.fontMetrics.height()
+                + titleMetrics.height()
             )
-        
-        return QSize(GreaseMonkeyConfigurationListDelegate.ItemWidth,
-                     self.__rowHeight)
+
+        return QSize(GreaseMonkeyConfigurationListDelegate.ItemWidth, self.__rowHeight)
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,76 +10,71 @@
 from PyQt6.QtCore import pyqtSignal, QRect
 from PyQt6.QtWidgets import QListWidget, QListWidgetItem
 
-from .GreaseMonkeyConfigurationListDelegate import (
-    GreaseMonkeyConfigurationListDelegate
-)
+from .GreaseMonkeyConfigurationListDelegate import GreaseMonkeyConfigurationListDelegate
 
 
 class GreaseMonkeyConfigurationListWidget(QListWidget):
     """
     Class implementing a special list widget for GreaseMonkey scripts.
-    
+
     @signal removeItemRequested(item) emitted to indicate an item removal
         request (QListWidgetItem)
     """
+
     removeItemRequested = pyqtSignal(QListWidgetItem)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__delegate = GreaseMonkeyConfigurationListDelegate(self)
         self.setItemDelegate(self.__delegate)
-    
+
     def __containsRemoveIcon(self, pos):
         """
         Private method to check, if the given position is inside the remove
         icon.
-        
+
         @param pos position to check for (QPoint)
         @return flag indicating success (boolean)
         """
         itm = self.itemAt(pos)
         if itm is None:
             return False
-        
+
         rect = self.visualItemRect(itm)
         iconSize = GreaseMonkeyConfigurationListDelegate.RemoveIconSize
         removeIconXPos = rect.right() - self.__delegate.padding() - iconSize
         center = rect.height() // 2 + rect.top()
         removeIconYPos = center - iconSize // 2
-        
-        removeIconRect = QRect(removeIconXPos, removeIconYPos,
-                               iconSize, iconSize)
+
+        removeIconRect = QRect(removeIconXPos, removeIconYPos, iconSize, iconSize)
         return removeIconRect.contains(pos)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method handling presses of mouse buttons.
-        
+
         @param evt mouse press event (QMouseEvent)
         """
         if self.__containsRemoveIcon(evt.position().toPoint()):
-            self.removeItemRequested.emit(
-                self.itemAt(evt.position().toPoint()))
+            self.removeItemRequested.emit(self.itemAt(evt.position().toPoint()))
             return
-        
+
         super().mousePressEvent(evt)
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method handling mouse double click events.
-        
+
         @param evt mouse press event (QMouseEvent)
         """
         if self.__containsRemoveIcon(evt.position().toPoint()):
-            self.removeItemRequested.emit(
-                self.itemAt(evt.position().toPoint()))
+            self.removeItemRequested.emit(self.itemAt(evt.position().toPoint()))
             return
-        
-        super().mouseDoubleClickEvent(
-            evt)
+
+        super().mouseDoubleClickEvent(evt)
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationScriptInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationScriptInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,7 @@
 from PyQt6.QtWidgets import QDialog
 
 from .Ui_GreaseMonkeyConfigurationScriptInfoDialog import (
-    Ui_GreaseMonkeyConfigurationScriptInfoDialog
+    Ui_GreaseMonkeyConfigurationScriptInfoDialog,
 )
 
 from ..GreaseMonkeyScript import GreaseMonkeyScript
@@ -20,28 +20,28 @@
 
 
 class GreaseMonkeyConfigurationScriptInfoDialog(
-        QDialog, Ui_GreaseMonkeyConfigurationScriptInfoDialog):
+    QDialog, Ui_GreaseMonkeyConfigurationScriptInfoDialog
+):
     """
     Class implementing a dialog to show GreaseMonkey script information.
     """
+
     def __init__(self, script, parent=None):
         """
         Constructor
-        
+
         @param script reference to the script (GreaseMonkeyScript)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("greaseMonkey48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("greaseMonkey48"))
+
         self.__scriptFileName = script.fileName()
-        
-        self.setWindowTitle(
-            self.tr("Script Details of {0}").format(script.name()))
-        
+
+        self.setWindowTitle(self.tr("Script Details of {0}").format(script.name()))
+
         self.nameLabel.setText(script.fullName())
         self.versionLabel.setText(script.version())
         self.urlLabel.setText(script.downloadUrl().toString())
@@ -52,12 +52,13 @@
         self.descriptionBrowser.setHtml(script.description())
         self.runsAtBrowser.setHtml("<br/>".join(script.include()))
         self.doesNotRunAtBrowser.setHtml("<br/>".join(script.exclude()))
-    
+
     @pyqtSlot()
     def on_showScriptSourceButton_clicked(self):
         """
         Private slot to show an editor window with the script source code.
         """
         from QScintilla.MiniEditor import MiniEditor
+
         editor = MiniEditor(self.__scriptFileName, "JavaScript", self)
         editor.show()
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,22 @@
 class GreaseMonkeyDownloader(QObject):
     """
     Class implementing the downloader for GreaseMonkey scripts.
-    
+
     @signal finished(fileName) emitted to indicate the end of a script download
         (str)
     @signal error() emitted to indicate a script download error
     """
+
     finished = pyqtSignal(str)
     error = pyqtSignal()
-    
+
     DownloadMainScript = 1
     DownloadRequireScript = 2
-    
+
     def __init__(self, url, manager, mode):
         """
         Constructor
-        
+
         @param url URL to download script from
         @type QUrl
         @param manager reference to the GreaseMonkey manager
@@ -42,27 +43,26 @@
         @type int (one of DownloadMainScript, DownloadRequireScript)
         """
         super().__init__()
-        
+
         self.__manager = manager
-        
-        self.__reply = WebBrowserWindow.networkManager().get(
-            QNetworkRequest(url))
+
+        self.__reply = WebBrowserWindow.networkManager().get(QNetworkRequest(url))
         if mode == GreaseMonkeyDownloader.DownloadMainScript:
             self.__reply.finished.connect(self.__scriptDownloaded)
         else:
             self.__reply.finished.connect(self.__requireDownloaded)
-        
+
         self.__fileName = ""
-    
+
     def updateScript(self, fileName):
         """
         Public method to set the file name for the script to be downloaded.
-        
+
         @param fileName file name for the script
         @type str
         """
         self.__fileName = fileName
-    
+
     @pyqtSlot()
     def __scriptDownloaded(self):
         """
@@ -70,33 +70,35 @@
         """
         self.deleteLater()
         self.__reply.deleteLater()
-        
+
         if self.__reply.error() != QNetworkReply.NetworkError.NoError:
             self.error.emit()
             return
-        
+
         response = bytes(self.__reply.readAll()).decode()
-        
+
         if "// ==UserScript==" not in response:
             self.error.emit()
             return
-        
+
         if not self.__fileName:
             from WebBrowser.Tools import WebBrowserTools
+
             filePath = os.path.join(
                 self.__manager.scriptsDirectory(),
-                WebBrowserTools.getFileNameFromUrl(self.__reply.url()))
+                WebBrowserTools.getFileNameFromUrl(self.__reply.url()),
+            )
             self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath)
-        
+
         try:
             with open(self.__fileName, "w", encoding="utf-8") as f:
                 f.write(response)
         except OSError:
             self.error.emit()
             return
-        
+
         self.finished.emit(self.__fileName)
-    
+
     @pyqtSlot()
     def __requireDownloaded(self):
         """
@@ -104,52 +106,49 @@
         """
         self.deleteLater()
         self.__reply.deleteLater()
-        
+
         if self.__reply.error() != QNetworkReply.NetworkError.NoError:
             self.error.emit()
             return
-        
+
         response = bytes(self.__reply.readAll()).decode()
-        
+
         if not response:
             self.error.emit()
             return
-        
+
         settings = QSettings(
-            os.path.join(self.__manager.requireScriptsDirectory(),
-                         "requires.ini"),
-            QSettings.Format.IniFormat)
+            os.path.join(self.__manager.requireScriptsDirectory(), "requires.ini"),
+            QSettings.Format.IniFormat,
+        )
         settings.beginGroup("Files")
-        
+
         if not self.__fileName:
-            self.__fileName = settings.value(
-                self.__reply.request().url().toString())
+            self.__fileName = settings.value(self.__reply.request().url().toString())
             if not self.__fileName:
-                name = (
-                    pathlib.Path(self.__reply.request().url().path()).name
-                )
+                name = pathlib.Path(self.__reply.request().url().path()).name
                 if not name:
                     name = "require.js"
                 elif not name.endswith(".js"):
                     name += ".js"
-                filePath = os.path.join(
-                    self.__manager.requireScriptsDirectory(), name)
+                filePath = os.path.join(self.__manager.requireScriptsDirectory(), name)
                 from WebBrowser.Tools import WebBrowserTools
-                self.__fileName = WebBrowserTools.ensureUniqueFilename(
-                    filePath, "{0}")
+
+                self.__fileName = WebBrowserTools.ensureUniqueFilename(filePath, "{0}")
             if not pathlib.Path(self.__fileName).is_absolute():
                 self.__fileName = os.path.join(
-                    self.__manager.requireScriptsDirectory(),
-                    self.__fileName)
-        
+                    self.__manager.requireScriptsDirectory(), self.__fileName
+                )
+
         try:
             with open(self.__fileName, "w", encoding="utf-8") as f:
                 f.write(response)
         except OSError:
             self.error.emit()
             return
-        
-        settings.setValue(self.__reply.request().url().toString(),
-                          pathlib.Path(self.__fileName).name)
-        
+
+        settings.setValue(
+            self.__reply.request().url().toString(), pathlib.Path(self.__fileName).name
+        )
+
         self.finished.emit(self.__fileName)
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyJsObject.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyJsObject.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,36 +15,37 @@
     """
     Class implementing the Python side for GreaseMonkey scripts.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__settings = None
-    
+
     def setSettingsFile(self, name):
         """
         Public method to set the settings file for the GreaseMonkey parameters.
-        
+
         @param name name of the settings file
         @type str
         """
         if self.__settings is not None:
             self.__settings.sync()
             self.__settings = None
-        
+
         self.__settings = QSettings(name, QSettings.Format.IniFormat)
-    
+
     @pyqtSlot(str, str, str)
     def getValue(self, nspace, name, dValue):
         """
         Public slot to get the value for the named variable for the identified
         script.
-        
+
         @param nspace unique script id
         @type str
         @param name name of the variable
@@ -58,15 +59,15 @@
         sValue = self.__settings.value(vName, dValue)
         if not sValue:
             return dValue
-        
+
         return sValue
-    
+
     @pyqtSlot(str, str, str)
     def setValue(self, nspace, name, value):
         """
         Public slot to set the value for the named variable for the identified
         script.
-        
+
         @param nspace unique script id
         @type str
         @param name name of the variable
@@ -80,12 +81,12 @@
         self.__settings.setValue(vName, value)
         self.__settings.sync()
         return True
-    
+
     @pyqtSlot(str, str)
     def deleteValue(self, nspace, name):
         """
         Public slot to set delete the named variable for the identified script.
-        
+
         @param nspace unique script id
         @type str
         @param name name of the variable
@@ -97,12 +98,12 @@
         self.__settings.remove(vName)
         self.__settings.sync()
         return True
-    
+
     @pyqtSlot(str)
     def listValues(self, nspace):
         """
         Public slot to list the stored variables for the identified script.
-        
+
         @param nspace unique script id
         @type str
         @return list of stored variables
@@ -112,14 +113,14 @@
         self.__settings.beginGroup(nspaceName)
         keys = self.__settings.allKeys()
         self.__settings.endGroup()
-        
+
         return keys
-    
+
     @pyqtSlot(str)
     def setClipboard(self, text):
         """
         Public slot to set some clipboard text.
-        
+
         @param text text to be copied to the clipboard
         @type str
         """
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,8 +12,17 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QObject, QTimer, QDir, QSettings,
-    QMetaObject, QUrl, Q_ARG, QCoreApplication
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QObject,
+    QTimer,
+    QDir,
+    QSettings,
+    QMetaObject,
+    QUrl,
+    Q_ARG,
+    QCoreApplication,
 )
 from PyQt6.QtWidgets import QDialog
 
@@ -31,74 +40,81 @@
 class GreaseMonkeyManager(QObject):
     """
     Class implementing the manager for GreaseMonkey scripts.
-    
+
     @signal scriptsChanged() emitted to indicate a change of scripts
     """
+
     scriptsChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__disabledScripts = []
         self.__scripts = []
         self.__downloaders = []
-        
+
         self.__jsObject = GreaseMonkeyJsObject(self)
-        
+
         QTimer.singleShot(0, self.__load)
-    
+
     def showConfigurationDialog(self, parent=None):
         """
         Public method to show the configuration dialog.
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         from .GreaseMonkeyConfiguration import GreaseMonkeyConfigurationDialog
+
         self.__configDiaolg = (
             GreaseMonkeyConfigurationDialog.GreaseMonkeyConfigurationDialog(
-                self, parent)
+                self, parent
+            )
         )
         self.__configDiaolg.show()
-    
+
     def downloadScript(self, url):
         """
         Public method to download a GreaseMonkey script.
-        
+
         @param url URL to download script from
         @type QUrl
         """
         QMetaObject.invokeMethod(
-            self, "doDownloadScript", Qt.ConnectionType.QueuedConnection,
-            Q_ARG(QUrl, url))
-    
+            self,
+            "doDownloadScript",
+            Qt.ConnectionType.QueuedConnection,
+            Q_ARG(QUrl, url),
+        )
+
     @pyqtSlot(QUrl)
     def doDownloadScript(self, url):
         """
         Public slot to download a GreaseMonkey script.
-        
+
         Note: The download needed to be separated in the invoking part
         (s.a.) and the one doing the real download because the invoking
         part runs in a different thread (i.e. the web engine thread).
-        
+
         @param url URL to download script from
         @type QUrl
         """
         from .GreaseMonkeyDownloader import GreaseMonkeyDownloader
+
         downloader = GreaseMonkeyDownloader(
-            url, self, GreaseMonkeyDownloader.DownloadMainScript)
-        downloader.finished.connect(
-            lambda f: self.__downloaderFinished(f, downloader))
+            url, self, GreaseMonkeyDownloader.DownloadMainScript
+        )
+        downloader.finished.connect(lambda f: self.__downloaderFinished(f, downloader))
         self.__downloaders.append(downloader)
-    
+
     def __downloaderFinished(self, fileName, downloader):
         """
         Private slot to handle the completion of a script download.
-        
+
         @param fileName name of the downloaded script
         @type str
         @param downloader reference to the downloader object
@@ -106,73 +122,71 @@
         """
         if downloader in self.__downloaders:
             self.__downloaders.remove(downloader)
-            
+
             deleteScript = True
             from .GreaseMonkeyScript import GreaseMonkeyScript
+
             script = GreaseMonkeyScript(self, fileName)
             if script.isValid():
                 if not self.containsScript(script.fullName()):
-                    from .GreaseMonkeyAddScriptDialog import (
-                        GreaseMonkeyAddScriptDialog
-                    )
+                    from .GreaseMonkeyAddScriptDialog import GreaseMonkeyAddScriptDialog
+
                     dlg = GreaseMonkeyAddScriptDialog(self, script)
                     deleteScript = dlg.exec() != QDialog.DialogCode.Accepted
                 else:
                     EricMessageBox.information(
                         None,
                         QCoreApplication.translate(
-                            "GreaseMonkeyManager",
-                            "Install GreaseMonkey Script"),
+                            "GreaseMonkeyManager", "Install GreaseMonkey Script"
+                        ),
                         QCoreApplication.translate(
-                            "GreaseMonkeyManager",
-                            """'{0}' is already installed.""").format(
-                            script.fullName())
+                            "GreaseMonkeyManager", """'{0}' is already installed."""
+                        ).format(script.fullName()),
                     )
-            
+
             if deleteScript:
                 with contextlib.suppress(OSError):
                     os.remove(fileName)
-    
+
     def scriptsDirectory(self):
         """
         Public method to get the path of the scripts directory.
-        
+
         @return path of the scripts directory (string)
         """
-        return os.path.join(
-            Utilities.getConfigDir(), "web_browser", "greasemonkey")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "greasemonkey")
+
     def requireScriptsDirectory(self):
         """
         Public method to get the path of the scripts directory.
-        
+
         @return path of the scripts directory (string)
         """
         return os.path.join(self.scriptsDirectory(), "requires")
-    
+
     def requireScripts(self, urlList):
         """
         Public method to get the sources of all required scripts.
-        
+
         @param urlList list of URLs (list of string)
         @return sources of all required scripts (string)
         """
         requiresDir = QDir(self.requireScriptsDirectory())
         if not requiresDir.exists() or len(urlList) == 0:
             return ""
-        
+
         script = ""
-        
+
         settings = QSettings(
             os.path.join(self.requireScriptsDirectory(), "requires.ini"),
-            QSettings.Format.IniFormat)
+            QSettings.Format.IniFormat,
+        )
         settings.beginGroup("Files")
         for url in urlList:
             if settings.contains(url):
                 fileName = settings.value(url)
                 if not pathlib.Path(fileName).is_absolute():
-                    fileName = os.path.join(self.requireScriptsDirectory(),
-                                            fileName)
+                    fileName = os.path.join(self.requireScriptsDirectory(), fileName)
                 try:
                     with open(fileName, "r", encoding="utf-8") as f:
                         source = f.read().strip()
@@ -180,86 +194,85 @@
                     source = ""
                 if source:
                     script += source + "\n"
-        
+
         return script
-    
+
     def saveConfiguration(self):
         """
         Public method to save the configuration.
         """
-        Preferences.setWebBrowser("GreaseMonkeyDisabledScripts",
-                                  self.__disabledScripts)
-    
+        Preferences.setWebBrowser("GreaseMonkeyDisabledScripts", self.__disabledScripts)
+
     def allScripts(self):
         """
         Public method to get a list of all scripts.
-        
+
         @return list of all scripts (list of GreaseMonkeyScript)
         """
         return self.__scripts[:]
-    
+
     def containsScript(self, fullName):
         """
         Public method to check, if the given script exists.
-        
+
         @param fullName full name of the script (string)
         @return flag indicating the existence (boolean)
         """
         return any(script.fullName() == fullName for script in self.__scripts)
-    
+
     def enableScript(self, script):
         """
         Public method to enable the given script.
-        
+
         @param script script to be enabled (GreaseMonkeyScript)
         """
         script.setEnabled(True)
         fullName = script.fullName()
         if fullName in self.__disabledScripts:
             self.__disabledScripts.remove(fullName)
-        
+
         collection = WebBrowserWindow.webProfile().scripts()
         collection.insert(script.webScript())
-    
+
     def disableScript(self, script):
         """
         Public method to disable the given script.
-        
+
         @param script script to be disabled (GreaseMonkeyScript)
         """
         script.setEnabled(False)
         fullName = script.fullName()
         if fullName not in self.__disabledScripts:
             self.__disabledScripts.append(fullName)
-        
+
         collection = WebBrowserWindow.webProfile().scripts()
         foundScripts = collection.find(fullName)
         if foundScripts:
             collection.remove(foundScripts[0])
-    
+
     def addScript(self, script):
         """
         Public method to add a script.
-        
+
         @param script script to be added (GreaseMonkeyScript)
         @return flag indicating success (boolean)
         """
         if not script or not script.isValid():
             return False
-        
+
         self.__scripts.append(script)
         script.scriptChanged.connect(lambda: self.__scriptChanged(script))
-        
+
         collection = WebBrowserWindow.webProfile().scripts()
         collection.insert(script.webScript())
-        
+
         self.scriptsChanged.emit()
         return True
-    
+
     def removeScript(self, script, removeFile=True):
         """
         Public method to remove a script.
-        
+
         @param script script to be removed (GreaseMonkeyScript)
         @param removeFile flag indicating to remove the script file as well
             (bool)
@@ -267,35 +280,35 @@
         """
         if not script:
             return False
-        
+
         with contextlib.suppress(ValueError):
             self.__scripts.remove(script)
-        
+
         fullName = script.fullName()
         collection = WebBrowserWindow.webProfile().scripts()
         foundScripts = collection.find(fullName)
         if foundScripts:
             collection.remove(foundScripts[0])
-        
+
         if fullName in self.__disabledScripts:
             self.__disabledScripts.remove(fullName)
-        
+
         if removeFile:
             os.unlink(script.fileName())
             del script
-        
+
         self.scriptsChanged.emit()
         return True
-    
+
     def canRunOnScheme(self, scheme):
         """
         Public method to check, if scripts can be run on a scheme.
-        
+
         @param scheme scheme to check (string)
         @return flag indicating, that scripts can be run (boolean)
         """
         return scheme in ["http", "https", "data", "ftp"]
-    
+
     def __load(self):
         """
         Private slot to load the available scripts into the manager.
@@ -303,39 +316,43 @@
         scriptsDir = QDir(self.scriptsDirectory())
         if not scriptsDir.exists():
             scriptsDir.mkpath(self.scriptsDirectory())
-        
+
         if not scriptsDir.exists("requires"):
             scriptsDir.mkdir("requires")
-        
+
         self.__disabledScripts = Preferences.getWebBrowser(
-            "GreaseMonkeyDisabledScripts")
-        
+            "GreaseMonkeyDisabledScripts"
+        )
+
         from .GreaseMonkeyScript import GreaseMonkeyScript
+
         for fileName in scriptsDir.entryList(["*.js"], QDir.Filter.Files):
             absolutePath = scriptsDir.absoluteFilePath(fileName)
             script = GreaseMonkeyScript(self, absolutePath)
-            
+
             if not script.isValid():
                 del script
                 continue
-            
+
             self.__scripts.append(script)
-            
+
             if script.fullName() in self.__disabledScripts:
                 script.setEnabled(False)
             else:
                 collection = WebBrowserWindow.webProfile().scripts()
                 collection.insert(script.webScript())
-        
-        self.__jsObject.setSettingsFile(os.path.join(
-            Utilities.getConfigDir(), "web_browser",
-            "greasemonkey_values.ini"))
+
+        self.__jsObject.setSettingsFile(
+            os.path.join(
+                Utilities.getConfigDir(), "web_browser", "greasemonkey_values.ini"
+            )
+        )
         ExternalJsObject.registerExtraObject("GreaseMonkey", self.__jsObject)
-    
+
     def __scriptChanged(self, script):
         """
         Private slot handling a changed script.
-        
+
         @param script reference to the changed script
         @type GreaseMonkeyScript
         """
--- a/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,12 @@
 import re
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QObject, QUrl, QByteArray, QCryptographicHash
+    pyqtSignal,
+    pyqtSlot,
+    QObject,
+    QUrl,
+    QByteArray,
+    QCryptographicHash,
 )
 from PyQt6.QtGui import QIcon, QPixmap, QImage
 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply
@@ -27,227 +32,227 @@
 class GreaseMonkeyScript(QObject):
     """
     Class implementing the GreaseMonkey script.
-    
+
     @signal scriptChanged() emitted to indicate a script change
     @signal updatingChanged(bool) emitted to indicate a change of the
         updating state
     """
+
     DocumentStart = 0
     DocumentEnd = 1
     DocumentIdle = 2
-    
+
     scriptChanged = pyqtSignal()
     updatingChanged = pyqtSignal(bool)
-    
+
     def __init__(self, manager, path):
         """
         Constructor
-        
+
         @param manager reference to the manager object (GreaseMonkeyManager)
         @param path path of the Javascript file (string)
         """
         super().__init__(manager)
-        
+
         self.__manager = manager
         self.__fileWatcher = DelayedFileWatcher(parent=None)
-        
+
         self.__name = ""
         self.__namespace = "GreaseMonkeyNS"
         self.__description = ""
         self.__version = ""
-        
+
         self.__include = []
         self.__exclude = []
         self.__require = []
-        
+
         self.__icon = QIcon()
         self.__iconUrl = QUrl()
         self.__downloadUrl = QUrl()
         self.__updateUrl = QUrl()
         self.__startAt = GreaseMonkeyScript.DocumentEnd
-        
+
         self.__script = ""
         self.__fileName = path
         self.__enabled = True
         self.__valid = False
         self.__noFrames = False
-        
+
         self.__updating = False
-        
+
         self.__downloaders = []
         self.__iconReplies = []
-        
+
         self.__parseScript()
-        
-        self.__fileWatcher.delayedFileChanged.connect(
-            self.__watchedFileChanged)
-    
+
+        self.__fileWatcher.delayedFileChanged.connect(self.__watchedFileChanged)
+
     def isValid(self):
         """
         Public method to check the validity of the script.
-        
+
         @return flag indicating a valid script (boolean)
         """
         return self.__valid
-    
+
     def name(self):
         """
         Public method to get the name of the script.
-        
+
         @return name of the script (string)
         """
         return self.__name
-    
+
     def nameSpace(self):
         """
         Public method to get the name space of the script.
-        
+
         @return name space of the script (string)
         """
         return self.__namespace
-    
+
     def fullName(self):
         """
         Public method to get the full name of the script.
-        
+
         @return full name of the script (string)
         """
         return "{0}/{1}".format(self.__namespace, self.__name)
-    
+
     def description(self):
         """
         Public method to get the description of the script.
-        
+
         @return description of the script (string)
         """
         return self.__description
-    
+
     def version(self):
         """
         Public method to get the version of the script.
-        
+
         @return version of the script (string)
         """
         return self.__version
-    
+
     def icon(self):
         """
         Public method to get the icon of the script.
-        
+
         @return script icon
         @rtype QIcon
         """
         return self.__icon
-    
+
     def iconUrl(self):
         """
         Public method to get the icon URL of the script.
-        
+
         @return icon URL of the script (QUrl)
         """
         return QUrl(self.__iconUrl)
-    
+
     def downloadUrl(self):
         """
         Public method to get the download URL of the script.
-        
+
         @return download URL of the script (QUrl)
         """
         return QUrl(self.__downloadUrl)
-    
+
     def updateUrl(self):
         """
         Public method to get the update URL of the script.
-        
+
         @return update URL of the script (QUrl)
         """
         return QUrl(self.__updateUrl)
-    
+
     def startAt(self):
         """
         Public method to get the start point of the script.
-        
+
         @return start point of the script (DocumentStart or DocumentEnd)
         """
         return self.__startAt
-    
+
     def noFrames(self):
         """
         Public method to get the noFrames flag.
-        
+
         @return flag indicating to not run on sub frames
         @rtype bool
         """
         return self.__noFrames
-    
+
     def isEnabled(self):
         """
         Public method to check, if the script is enabled.
-        
+
         @return flag indicating an enabled state (boolean)
         """
         return self.__enabled and self.__valid
-    
+
     def setEnabled(self, enable):
         """
         Public method to enable a script.
-        
+
         @param enable flag indicating the new enabled state (boolean)
         """
         self.__enabled = enable
-    
+
     def include(self):
         """
         Public method to get the list of included URLs.
-        
+
         @return list of included URLs (list of strings)
         """
         return self.__include[:]
-    
+
     def exclude(self):
         """
         Public method to get the list of excluded URLs.
-        
+
         @return list of excluded URLs (list of strings)
         """
         return self.__exclude[:]
-    
+
     def require(self):
         """
         Public method to get the list of required scripts.
-        
+
         @return list of required scripts (list of strings)
         """
         return self.__require[:]
-    
+
     def fileName(self):
         """
         Public method to get the path of the Javascript file.
-        
+
         @return path of the Javascript file (string)
         """
         return self.__fileName
-    
+
     def isUpdating(self):
         """
         Public method to get the updating flag.
-        
+
         @return updating flag
         @rtype bool
         """
         return self.__updating
-    
+
     @pyqtSlot(str)
     def __watchedFileChanged(self, fileName):
         """
         Private slot handling changes of the script file.
-        
+
         @param fileName path of the script file
         @type str
         """
         if self.__fileName == fileName:
             self.__reloadScript()
-    
+
     def __parseScript(self):
         """
         Private method to parse the given script and populate the data
@@ -257,83 +262,80 @@
         self.__namespace = "GreaseMonkeyNS"
         self.__description = ""
         self.__version = ""
-        
+
         self.__include = []
         self.__exclude = []
         self.__require = []
-        
+
         self.__icon = QIcon()
         self.__iconUrl = QUrl()
         self.__downloadUrl = QUrl()
         self.__updateUrl = QUrl()
         self.__startAt = GreaseMonkeyScript.DocumentEnd
-        
+
         self.__script = ""
         self.__enabled = True
         self.__valid = False
         self.__noFrames = False
-        
+
         try:
             with open(self.__fileName, "r", encoding="utf-8") as f:
                 fileData = f.read()
         except OSError:
             # silently ignore because it shouldn't happen
             return
-        
+
         if self.__fileName not in self.__fileWatcher.files():
             self.__fileWatcher.addPath(self.__fileName)
-        
-        rx = re.compile(
-            r"""// ==UserScript==(.*)// ==/UserScript==""",
-            re.DOTALL
-        )
+
+        rx = re.compile(r"""// ==UserScript==(.*)// ==/UserScript==""", re.DOTALL)
         match = rx.search(fileData)
         if match is None:
             # invalid script file
             return
-        
+
         metaDataBlock = match.group(1).strip()
         if metaDataBlock == "":
             # invalid script file
             return
-        
+
         for line in metaDataBlock.splitlines():
             if not line.strip():
                 continue
-            
+
             if not line.startswith("// @"):
                 continue
-            
+
             line = line[3:].replace("\t", " ")
             index = line.find(" ")
-            
+
             key = line[:index].strip()
-            value = line[index + 1:].strip() if index > 0 else ""
-            
+            value = line[index + 1 :].strip() if index > 0 else ""
+
             if not key:
                 continue
-            
+
             if key == "@name":
                 self.__name = value
-            
+
             elif key == "@namespace":
                 self.__namespace = value
-            
+
             elif key == "@description":
                 self.__description = value
-            
+
             elif key == "@version":
                 self.__version = value
-            
+
             elif key in ["@include", "@match"]:
                 self.__include.append(value)
-            
+
             elif key in ["@exclude", "@exclude_match"]:
                 self.__exclude.append(value)
-            
+
             elif key == "@require":
                 self.__require.append(value)
-            
+
             elif key == "@run-at":
                 if value == "document-end":
                     self.__startAt = GreaseMonkeyScript.DocumentEnd
@@ -341,80 +343,79 @@
                     self.__startAt = GreaseMonkeyScript.DocumentStart
                 elif value == "document-idle":
                     self.__startAt = GreaseMonkeyScript.DocumentIdle
-            
+
             elif key == "@downloadURL" and self.__downloadUrl.isEmpty():
                 self.__downloadUrl = QUrl(value)
-            
+
             elif key == "@updateURL" and self.__updateUrl.isEmpty():
                 self.__updateUrl = QUrl(value)
-            
+
             elif key == "@icon":
                 self.__iconUrl = QUrl(value)
-            
+
             elif key == "@noframes":
                 self.__noFrames = True
-        
+
         self.__iconUrl = self.__downloadUrl.resolved(self.__iconUrl)
-        
+
         if not self.__include:
             self.__include.append("*")
-        
-        nspace = bytes(QCryptographicHash.hash(
-            QByteArray(self.fullName().encode("utf-8")),
-            QCryptographicHash.Algorithm.Md4).toHex()).decode("ascii")
+
+        nspace = bytes(
+            QCryptographicHash.hash(
+                QByteArray(self.fullName().encode("utf-8")),
+                QCryptographicHash.Algorithm.Md4,
+            ).toHex()
+        ).decode("ascii")
         valuesScript = values_js.format(nspace)
         self.__script = "(function(){{{0}\n{1}\n{2}\n}})();".format(
-            valuesScript, self.__manager.requireScripts(self.__require),
-            fileData
+            valuesScript, self.__manager.requireScripts(self.__require), fileData
         )
         self.__valid = True
-        
+
         self.__downloadIcon()
         self.__downloadRequires()
-    
+
     def webScript(self):
         """
         Public method to create a script object.
-        
+
         @return prepared script object
         @rtype QWebEngineScript
         """
         script = QWebEngineScript()
-        script.setSourceCode("{0}\n{1}".format(
-            bootstrap_js, self.__script
-        ))
+        script.setSourceCode("{0}\n{1}".format(bootstrap_js, self.__script))
         script.setName(self.fullName())
         script.setWorldId(WebBrowserPage.SafeJsWorld)
         script.setRunsOnSubFrames(not self.__noFrames)
         return script
-    
+
     def updateScript(self):
         """
         Public method to updated the script.
         """
         if not self.__downloadUrl.isValid() or self.__updating:
             return
-        
+
         self.__updating = True
         self.updatingChanged.emit(self.__updating)
-        
+
         downloader = GreaseMonkeyDownloader(
             self.__downloadUrl,
             self.__manager,
-            GreaseMonkeyDownloader.DownloadMainScript)
+            GreaseMonkeyDownloader.DownloadMainScript,
+        )
         downloader.updateScript(self.__fileName)
-        downloader.finished.connect(
-            lambda: self.__downloaderFinished(downloader))
-        downloader.error.connect(
-            lambda: self.__downloaderError(downloader))
+        downloader.finished.connect(lambda: self.__downloaderFinished(downloader))
+        downloader.error.connect(lambda: self.__downloaderError(downloader))
         self.__downloaders.append(downloader)
-        
+
         self.__downloadRequires()
-    
+
     def __downloaderFinished(self, downloader):
         """
         Private slot to handle a finished download.
-        
+
         @param downloader reference to the downloader object
         @type GreaseMonkeyDownloader
         """
@@ -422,11 +423,11 @@
             self.__downloaders.remove(downloader)
         self.__updating = False
         self.updatingChanged.emit(self.__updating)
-    
+
     def __downloaderError(self, downloader):
         """
         Private slot to handle a downloader error.
-        
+
         @param downloader reference to the downloader object
         @type GreaseMonkeyDownloader
         """
@@ -434,18 +435,18 @@
             self.__downloaders.remove(downloader)
         self.__updating = False
         self.updatingChanged.emit(self.__updating)
-    
+
     def __reloadScript(self):
         """
         Private method to reload the script.
         """
         self.__parseScript()
-        
+
         self.__manager.removeScript(self, False)
         self.__manager.addScript(self)
-        
+
         self.scriptChanged.emit()
-    
+
     def __downloadRequires(self):
         """
         Private method to download the required scripts.
@@ -455,35 +456,38 @@
                 downloader = GreaseMonkeyDownloader(
                     QUrl(urlStr),
                     self.__manager,
-                    GreaseMonkeyDownloader.DownloadRequireScript)
+                    GreaseMonkeyDownloader.DownloadRequireScript,
+                )
                 downloader.finished.connect(
-                    lambda: self.__requireDownloaded(downloader))
+                    lambda: self.__requireDownloaded(downloader)
+                )
                 downloader.error.connect(
-                    lambda: self.__requireDownloadError(downloader))
+                    lambda: self.__requireDownloadError(downloader)
+                )
                 self.__downloaders.append(downloader)
-    
+
     def __requireDownloaded(self, downloader):
         """
         Private slot to handle a finished download of a required script.
-        
+
         @param downloader reference to the downloader object
         @type GreaseMonkeyDownloader
         """
         if downloader in self.__downloaders:
             self.__downloaders.remove(downloader)
-        
+
         self.__reloadScript()
-    
+
     def __requireDownloadError(self, downloader):
         """
         Private slot to handle a downloader error.
-        
+
         @param downloader reference to the downloader object
         @type GreaseMonkeyDownloader
         """
         if downloader in self.__downloaders:
             self.__downloaders.remove(downloader)
-    
+
     def __downloadIcon(self):
         """
         Private slot to download the script icon.
@@ -493,17 +497,17 @@
             reply = WebBrowserWindow.networkManager().get(request)
             reply.finished.connect(lambda: self.__iconDownloaded(reply))
             self.__iconReplies.append(reply)
-    
+
     def __iconDownloaded(self, reply):
         """
         Private slot to handle a finished download of a script icon.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         if reply in self.__iconReplies:
             self.__iconReplies.remove(reply)
-        
+
         reply.deleteLater()
         if reply.error() == QNetworkReply.NetworkError.NoError:
             self.__icon = QPixmap.fromImage(QImage.fromData(reply.readAll()))
--- a/src/eric7/WebBrowser/History/HistoryCompleter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryCompleter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,42 +20,42 @@
     """
     Class implementing a special completer view for history based completions.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.horizontalHeader().hide()
         self.verticalHeader().hide()
-        
+
         self.setShowGrid(False)
-        
-        self.setSelectionBehavior(
-            QAbstractItemView.SelectionBehavior.SelectRows)
+
+        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
         self.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
         self.setTextElideMode(Qt.TextElideMode.ElideRight)
-        
+
         metrics = self.fontMetrics()
         self.verticalHeader().setDefaultSectionSize(metrics.height())
-    
+
     def resizeEvent(self, evt):
         """
         Protected method handling resize events.
-        
+
         @param evt reference to the resize event (QResizeEvent)
         """
         self.horizontalHeader().resizeSection(0, int(0.65 * self.width()))
         self.horizontalHeader().setStretchLastSection(True)
-        
+
         super().resizeEvent(evt)
-    
+
     def sizeHintForRow(self, row):
         """
         Public method to give a size hint for rows.
-        
+
         @param row row number (integer)
         @return desired row height (integer)
         """
@@ -67,27 +67,28 @@
     """
     Class implementing a special model for history based completions.
     """
+
     HistoryCompletionRole = HistoryFilterModel.MaxRole + 1
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__searchString = ""
         self.__searchMatcher = None
         self.__wordMatcher = None
         self.__isValid = False
-        
+
         self.setDynamicSortFilter(True)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index of history entry to get data for (QModelIndex)
         @param role data role (integer)
         @return history entry data
@@ -99,64 +100,65 @@
                 return "t"
             else:
                 return "f"
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if index.column() == 0:
                 role = HistoryModel.UrlStringRole
             else:
                 role = HistoryModel.TitleRole
-        
+
         return QSortFilterProxyModel.data(self, index, role)
-    
+
     def searchString(self):
         """
         Public method to get the current search string.
-        
+
         @return current search string (string)
         """
         return self.__searchString
-    
+
     def setSearchString(self, sstring):
         """
         Public method to set the current search string.
-        
+
         @param sstring new search string (string)
         """
         if sstring != self.__searchString:
             self.__searchString = sstring
             self.__searchMatcher = re.compile(
-                re.escape(self.__searchString), re.IGNORECASE)
+                re.escape(self.__searchString), re.IGNORECASE
+            )
             self.__wordMatcher = re.compile(
-                r"\b" + re.escape(self.__searchString), re.IGNORECASE)
+                r"\b" + re.escape(self.__searchString), re.IGNORECASE
+            )
             self.invalidateFilter()
-    
+
     def isValid(self):
         """
         Public method to check the model for validity.
-        
+
         @return flag indicating a valid status (boolean)
         """
         return self.__isValid
-    
+
     def setValid(self, valid):
         """
         Public method to set the model's validity.
-        
+
         @param valid flag indicating the new valid status (boolean)
         """
         if valid == self.__isValid:
             return
-        
+
         self.__isValid = valid
-        
+
         # tell the history completer that the model has changed
-        self.dataChanged.emit(self.index(0, 0), self.index(0,
-                              self.rowCount() - 1))
-    
+        self.dataChanged.emit(self.index(0, 0), self.index(0, self.rowCount() - 1))
+
     def filterAcceptsRow(self, sourceRow, sourceParent):
         """
         Public method to determine, if the row is acceptable.
-        
+
         @param sourceRow row number in the source model (integer)
         @param sourceParent index of the source item (QModelIndex)
         @return flag indicating acceptance (boolean)
@@ -166,21 +168,21 @@
             # title. It's already ensured, that the user doesn't accidentally
             # use regexp metacharacters (s. setSearchString()).
             idx = self.sourceModel().index(sourceRow, 0, sourceParent)
-            
+
             url = self.sourceModel().data(idx, HistoryModel.UrlStringRole)
             if self.__searchMatcher.search(url) is not None:
                 return True
-            
+
             title = self.sourceModel().data(idx, HistoryModel.TitleRole)
             if self.__searchMatcher.search(title) is not None:
                 return True
-        
+
         return False
-    
+
     def lessThan(self, left, right):
         """
         Public method used to sort the displayed items.
-        
+
         It implements a special sorting function based on the history entry's
         frequency giving a bonus to hits that match on a word boundary so that
         e.g. "dot.python-projects.org" is a better result for typing "dot" than
@@ -188,7 +190,7 @@
         not the entire URL, since while it makes sense to e.g. give
         "www.phoronix.com" a bonus for "ph", it does NOT make sense to give
         "www.yadda.com/foo.php" the bonus.
-        
+
         @param left index of left item
         @type QModelIndex
         @param right index of right item
@@ -196,30 +198,26 @@
         @return true, if left is less than right
         @rtype bool
         """
-        frequency_L = self.sourceModel().data(
-            left, HistoryFilterModel.FrequencyRole)
+        frequency_L = self.sourceModel().data(left, HistoryFilterModel.FrequencyRole)
         url_L = self.sourceModel().data(left, HistoryModel.UrlRole).host()
         title_L = self.sourceModel().data(left, HistoryModel.TitleRole)
-        
-        if (
-            self.__wordMatcher is not None and
-            (bool(self.__wordMatcher.search(url_L)) or
-             bool(self.__wordMatcher.search(title_L)))
+
+        if self.__wordMatcher is not None and (
+            bool(self.__wordMatcher.search(url_L))
+            or bool(self.__wordMatcher.search(title_L))
         ):
             frequency_L *= 2
-        
-        frequency_R = self.sourceModel().data(
-            right, HistoryFilterModel.FrequencyRole)
+
+        frequency_R = self.sourceModel().data(right, HistoryFilterModel.FrequencyRole)
         url_R = self.sourceModel().data(right, HistoryModel.UrlRole).host()
         title_R = self.sourceModel().data(right, HistoryModel.TitleRole)
-        
-        if (
-            self.__wordMatcher is not None and
-            (bool(self.__wordMatcher.search(url_R)) or
-             bool(self.__wordMatcher.search(title_R)))
+
+        if self.__wordMatcher is not None and (
+            bool(self.__wordMatcher.search(url_R))
+            or bool(self.__wordMatcher.search(title_R))
         ):
             frequency_R *= 2
-        
+
         # Sort results in descending frequency-derived score.
         return frequency_R < frequency_L
 
@@ -228,85 +226,85 @@
     """
     Class implementing a completer for the browser history.
     """
+
     def __init__(self, model, parent=None):
         """
         Constructor
-        
+
         @param model reference to the model (QAbstractItemModel)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(model, parent)
-        
+
         self.setPopup(HistoryCompletionView())
-        
+
         # Completion should be against the faked role.
         self.setCompletionRole(HistoryCompletionModel.HistoryCompletionRole)
-        
+
         # Since the completion role is faked, advantage of the sorted-model
         # optimizations in QCompleter can be taken.
         self.setCaseSensitivity(Qt.CaseSensitivity.CaseSensitive)
-        self.setModelSorting(
-            QCompleter.ModelSorting.CaseSensitivelySortedModel)
-        
+        self.setModelSorting(QCompleter.ModelSorting.CaseSensitivelySortedModel)
+
         self.__searchString = ""
         self.__filterTimer = QTimer(self)
         self.__filterTimer.setSingleShot(True)
         self.__filterTimer.timeout.connect(self.__updateFilter)
-    
+
     def pathFromIndex(self, idx):
         """
         Public method to get a path for a given index.
-        
+
         @param idx reference to the index (QModelIndex)
         @return the actual URL from the history (string)
         """
         return self.model().data(idx, HistoryModel.UrlStringRole)
-    
+
     def splitPath(self, path):
         """
         Public method to split the given path into strings, that are used to
         match at each level in the model.
-        
+
         @param path path to be split (string)
         @return list of path elements (list of strings)
         """
         if path == self.__searchString:
             return ["t"]
-        
+
         # Queue an update to the search string. Wait a bit, so that if the user
         # is quickly typing, the completer doesn't try to complete until they
         # pause.
         if self.__filterTimer.isActive():
             self.__filterTimer.stop()
         self.__filterTimer.start(150)
-        
+
         # If the previous search results are not a superset of the current
         # search results, tell the model that it is not valid yet.
         if not path.startswith(self.__searchString):
             self.model().setValid(False)
-        
+
         self.__searchString = path
-        
+
         # The actual filtering is done by the HistoryCompletionModel. Just
         # return a short dummy here so that QCompleter thinks everything
         # matched.
         return ["t"]
-    
+
     def __updateFilter(self):
         """
         Private slot to update the search string.
         """
         completionModel = self.model()
-        
+
         # Tell the HistoryCompletionModel about the new search string.
         completionModel.setSearchString(self.__searchString)
-        
+
         # Sort the model.
         completionModel.sort(0)
-        
+
         # Mark it valid.
         completionModel.setValid(True)
-        
+
         # Now update the QCompleter widget, but only if the user is still
         # typing a URL.
         if self.widget() is not None and self.widget().hasFocus():
--- a/src/eric7/WebBrowser/History/HistoryDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,7 +21,7 @@
 class HistoryDialog(QDialog, Ui_HistoryDialog):
     """
     Class implementing a dialog to manage history.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new
@@ -30,30 +30,32 @@
     @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new
         private window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newBackgroundTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
     newPrivateWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, parent=None, manager=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget
         @param manager reference to the history manager object (HistoryManager)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__historyManager = manager
         if self.__historyManager is None:
             import WebBrowser.WebBrowserWindow
+
             self.__historyManager = (
                 WebBrowser.WebBrowserWindow.WebBrowserWindow.historyManager()
             )
-        
+
         self.__model = self.__historyManager.historyTreeModel()
         self.__proxyModel = EricTreeSortFilterProxyModel(self)
         self.__proxyModel.setSortRole(HistoryModel.DateTimeRole)
@@ -69,114 +71,106 @@
         self.historyTree.header().resizeSection(0, header)
         self.historyTree.header().resizeSection(1, header)
         self.historyTree.header().setStretchLastSection(True)
-        self.historyTree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        
+        self.historyTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+
         self.historyTree.activated.connect(self.__activated)
         self.historyTree.customContextMenuRequested.connect(
-            self.__customContextMenuRequested)
-        
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
+            self.__customContextMenuRequested
+        )
+
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
         self.removeButton.clicked.connect(self.historyTree.removeSelected)
         self.removeAllButton.clicked.connect(self.__historyManager.clear)
-        
+
         self.__proxyModel.modelReset.connect(self.__modelReset)
-    
+
     def __modelReset(self):
         """
         Private slot handling a reset of the tree view's model.
         """
         self.historyTree.expandAll()
-    
+
     def __customContextMenuRequested(self, pos):
         """
         Private slot to handle the context menu request for the bookmarks tree.
-        
+
         @param pos position the context menu was requested (QPoint)
         """
         menu = QMenu()
         idx = self.historyTree.indexAt(pos)
         idx = idx.sibling(idx.row(), 0)
         if (
-            idx.isValid() and
-            not self.historyTree.model().hasChildren(idx) and
-            len(self.historyTree.selectionModel().selectedRows()) == 1
+            idx.isValid()
+            and not self.historyTree.model().hasChildren(idx)
+            and len(self.historyTree.selectionModel().selectedRows()) == 1
         ):
-            menu.addAction(
-                self.tr("&Open"),
-                self.__openHistoryInCurrentTab)
-            menu.addAction(
-                self.tr("Open in New &Tab"),
-                self.__openHistoryInNewTab)
+            menu.addAction(self.tr("&Open"), self.__openHistoryInCurrentTab)
+            menu.addAction(self.tr("Open in New &Tab"), self.__openHistoryInNewTab)
             menu.addAction(
                 self.tr("Open in New &Background Tab"),
-                self.__openHistoryInNewBackgroundTab)
+                self.__openHistoryInNewBackgroundTab,
+            )
             menu.addAction(
-                self.tr("Open in New &Window"),
-                self.__openHistoryInNewWindow)
+                self.tr("Open in New &Window"), self.__openHistoryInNewWindow
+            )
             menu.addAction(
                 self.tr("Open in New Pri&vate Window"),
-                self.__openHistoryInPrivateWindow)
+                self.__openHistoryInPrivateWindow,
+            )
             menu.addSeparator()
             menu.addAction(self.tr("&Copy"), self.__copyHistory)
         menu.addAction(self.tr("&Remove"), self.historyTree.removeSelected)
         menu.exec(QCursor.pos())
-    
+
     def __activated(self, idx):
         """
         Private slot to handle the activation of an entry.
-        
+
         @param idx reference to the entry index (QModelIndex)
         """
-        if (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ControlModifier
-        ):
+        if QApplication.keyboardModifiers() & Qt.KeyboardModifier.ControlModifier:
             self.__openHistoryInNewTab()
-        elif (
-            QApplication.keyboardModifiers() &
-            Qt.KeyboardModifier.ShiftModifier
-        ):
+        elif QApplication.keyboardModifiers() & Qt.KeyboardModifier.ShiftModifier:
             self.__openHistoryInNewWindow()
         else:
             self.__openHistoryInCurrentTab()
-        
+
     def __openHistoryInCurrentTab(self):
         """
         Private slot to open a history entry in the current browser tab.
         """
         self.__openHistory()
-    
+
     def __openHistoryInNewTab(self):
         """
         Private slot to open a history entry in a new browser tab.
         """
         self.__openHistory(newTab=True)
-    
+
     def __openHistoryInNewBackgroundTab(self):
         """
         Private slot to open a history entry in a new background tab.
         """
         self.__openHistory(newTab=True, background=True)
-    
+
     def __openHistoryInNewWindow(self):
         """
         Private slot to open a history entry in a new browser window.
         """
         self.__openHistory(newWindow=True)
-    
+
     def __openHistoryInPrivateWindow(self):
         """
         Private slot to open a history entry in a new private browser window.
         """
         self.__openHistory(newWindow=True, privateWindow=True)
-    
-    def __openHistory(self, newTab=False, background=False,
-                      newWindow=False, privateWindow=False):
+
+    def __openHistory(
+        self, newTab=False, background=False, newWindow=False, privateWindow=False
+    ):
         """
         Private method to open a history entry.
-        
+
         @param newTab flag indicating to open the feed message in a new tab
         @type bool
         @param background flag indicating to open the bookmark in a new
@@ -193,26 +187,26 @@
         if newTab:
             if background:
                 self.newBackgroundTab.emit(
-                    idx.data(HistoryModel.UrlRole),
-                    idx.data(HistoryModel.TitleRole))
+                    idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+                )
             else:
                 self.newTab.emit(
-                    idx.data(HistoryModel.UrlRole),
-                    idx.data(HistoryModel.TitleRole))
+                    idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+                )
         elif newWindow:
             if privateWindow:
                 self.newPrivateWindow.emit(
-                    idx.data(HistoryModel.UrlRole),
-                    idx.data(HistoryModel.TitleRole))
+                    idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+                )
             else:
                 self.newWindow.emit(
-                    idx.data(HistoryModel.UrlRole),
-                    idx.data(HistoryModel.TitleRole))
+                    idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+                )
         else:
             self.openUrl.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
-    
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
+
     def __copyHistory(self):
         """
         Private slot to copy a history entry's URL to the clipboard.
@@ -220,8 +214,8 @@
         idx = self.historyTree.currentIndex()
         if not idx.parent().isValid():
             return
-        
+
         url = idx.data(HistoryModel.UrlStringRole)
-        
+
         clipboard = QApplication.clipboard()
         clipboard.setText(url)
--- a/src/eric7/WebBrowser/History/HistoryFilterModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryFilterModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,36 +16,37 @@
     """
     Class storing some history data.
     """
+
     def __init__(self, offset, frequency=0):
         """
         Constructor
-        
+
         @param offset tail offset (integer)
         @param frequency frequency (integer)
         """
         self.tailOffset = offset
         self.frequency = frequency
-    
+
     def __eq__(self, other):
         """
         Special method implementing equality.
-        
+
         @param other reference to the object to check against (HistoryData)
         @return flag indicating equality (boolean)
         """
-        return (
-            self.tailOffset == other.tailOffset and
-            (self.frequency == -1 or other.frequency == -1 or
-             self.frequency == other.frequency)
+        return self.tailOffset == other.tailOffset and (
+            self.frequency == -1
+            or other.frequency == -1
+            or self.frequency == other.frequency
         )
-    
+
     def __lt__(self, other):
         """
         Special method determining less relation.
-        
+
         Note: Like the actual history entries the index mapping is sorted in
         reverse order by offset
-        
+
         @param other reference to the history data object to compare against
             (HistoryEntry)
         @return flag indicating less (boolean)
@@ -57,111 +58,111 @@
     """
     Class implementing the history filter model.
     """
+
     FrequencyRole = HistoryModel.MaxRole + 1
     MaxRole = FrequencyRole
-    
+
     def __init__(self, sourceModel, parent=None):
         """
         Constructor
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__filteredRows = []
         self.__historyDict = {}
         self.__scaleTime = QDateTime()
-        
+
         self.setSourceModel(sourceModel)
-    
+
     def historyContains(self, url):
         """
         Public method to check the history for an entry.
-        
+
         @param url URL to check for (string)
         @return flag indicating success (boolean)
         """
         self.__load()
         return url in self.__historyDict
-    
+
     def historyLocation(self, url):
         """
         Public method to get the row number of an entry in the source model.
-        
+
         @param url URL to check for (tring)
         @return row number in the source model (integer)
         """
         self.__load()
         if url not in self.__historyDict:
             return 0
-        
+
         return self.sourceModel().rowCount() - self.__historyDict[url]
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index of history entry to get data for (QModelIndex)
         @param role data role (integer)
         @return history entry data
         """
         if role == self.FrequencyRole and index.isValid():
             return self.__filteredRows[index.row()].frequency
-        
+
         return QAbstractProxyModel.data(self, index, role)
-    
+
     def setSourceModel(self, sourceModel):
         """
         Public method to set the source model.
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         """
         if self.sourceModel() is not None:
             self.sourceModel().modelReset.disconnect(self.__sourceReset)
             self.sourceModel().dataChanged.disconnect(self.__sourceDataChanged)
-            self.sourceModel().rowsInserted.disconnect(
-                self.__sourceRowsInserted)
+            self.sourceModel().rowsInserted.disconnect(self.__sourceRowsInserted)
             self.sourceModel().rowsRemoved.disconnect(self.__sourceRowsRemoved)
-        
+
         super().setSourceModel(sourceModel)
-        
+
         if self.sourceModel() is not None:
             self.__loaded = False
             self.sourceModel().modelReset.connect(self.__sourceReset)
             self.sourceModel().dataChanged.connect(self.__sourceDataChanged)
             self.sourceModel().rowsInserted.connect(self.__sourceRowsInserted)
             self.sourceModel().rowsRemoved.connect(self.__sourceRowsRemoved)
-    
+
     def __sourceDataChanged(self, topLeft, bottomRight):
         """
         Private slot to handle the change of data of the source model.
-        
+
         @param topLeft index of top left data element (QModelIndex)
         @param bottomRight index of bottom right data element (QModelIndex)
         """
         self.dataChanged.emit(
-            self.mapFromSource(topLeft), self.mapFromSource(bottomRight))
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+            self.mapFromSource(topLeft), self.mapFromSource(bottomRight)
+        )
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         return self.sourceModel().headerData(section, orientation, role)
-    
+
     def recalculateFrequencies(self):
         """
         Public method to recalculate the frequencies.
         """
         self.__sourceReset()
-    
+
     def __sourceReset(self):
         """
         Private slot to handle a reset of the source model.
@@ -169,49 +170,49 @@
         self.beginResetModel()
         self.__loaded = False
         self.endResetModel()
-    
+
     def rowCount(self, parent=None):
         """
         Public method to determine the number of rows.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         self.__load()
         if parent.isValid():
             return 0
         return len(self.__historyDict)
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         return self.sourceModel().columnCount(self.mapToSource(parent))
-    
+
     def mapToSource(self, proxyIndex):
         """
         Public method to map an index to the source model index.
-        
+
         @param proxyIndex reference to a proxy model index (QModelIndex)
         @return source model index (QModelIndex)
         """
         self.__load()
         sourceRow = self.sourceModel().rowCount() - proxyIndex.internalId()
         return self.sourceModel().index(sourceRow, proxyIndex.column())
-    
+
     def mapFromSource(self, sourceIndex):
         """
         Public method to map an index to the proxy model index.
-        
+
         @param sourceIndex reference to a source model index (QModelIndex)
         @return proxy model index (QModelIndex)
         """
@@ -219,20 +220,20 @@
         url = sourceIndex.data(HistoryModel.UrlStringRole)
         if url not in self.__historyDict:
             return QModelIndex()
-        
+
         sourceOffset = self.sourceModel().rowCount() - sourceIndex.row()
-        
+
         try:
             row = self.__filteredRows.index(HistoryData(sourceOffset, -1))
         except ValueError:
             return QModelIndex()
-        
+
         return self.createIndex(row, sourceIndex.column(), sourceOffset)
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number for the index (integer)
         @param column column number for the index (integer)
         @param parent index of the parent item (QModelIndex)
@@ -240,60 +241,60 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         self.__load()
         if (
-            row < 0 or
-            row >= self.rowCount(parent) or
-            column < 0 or
-            column >= self.columnCount(parent)
+            row < 0
+            or row >= self.rowCount(parent)
+            or column < 0
+            or column >= self.columnCount(parent)
         ):
             return QModelIndex()
-        
-        return self.createIndex(row, column,
-                                self.__filteredRows[row].tailOffset)
+
+        return self.createIndex(row, column, self.__filteredRows[row].tailOffset)
 
     def parent(self, index):
         """
         Public method to get the parent index.
-        
+
         @param index index of item to get parent (QModelIndex)
         @return index of parent (QModelIndex)
         """
         return QModelIndex()
-    
+
     def __load(self):
         """
         Private method to load the model data.
         """
         if self.__loaded:
             return
-        
+
         self.__filteredRows = []
         self.__historyDict = {}
         self.__scaleTime = QDateTime.currentDateTime()
-        
+
         for sourceRow in range(self.sourceModel().rowCount()):
             idx = self.sourceModel().index(sourceRow, 0)
             url = idx.data(HistoryModel.UrlStringRole)
             if url not in self.__historyDict:
                 sourceOffset = self.sourceModel().rowCount() - sourceRow
                 self.__filteredRows.append(
-                    HistoryData(sourceOffset, self.__frequencyScore(idx)))
+                    HistoryData(sourceOffset, self.__frequencyScore(idx))
+                )
                 self.__historyDict[url] = sourceOffset
             else:
                 # the url is known already, so just update the frequency score
                 row = self.__filteredRows.index(
-                    HistoryData(self.__historyDict[url], -1))
-                self.__filteredRows[row].frequency += self.__frequencyScore(
-                    idx)
-        
+                    HistoryData(self.__historyDict[url], -1)
+                )
+                self.__filteredRows[row].frequency += self.__frequencyScore(idx)
+
         self.__loaded = True
-    
+
     def __sourceRowsInserted(self, parent, start, end):
         """
         Private slot to handle the insertion of data in the source model.
-        
+
         @param parent reference to the parent index (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
@@ -301,41 +302,45 @@
         if start == end and start == 0:
             if not self.__loaded:
                 return
-            
+
             idx = self.sourceModel().index(start, 0, parent)
             url = idx.data(HistoryModel.UrlStringRole)
             currentFrequency = 0
             if url in self.__historyDict:
                 row = self.__filteredRows.index(
-                    HistoryData(self.__historyDict[url], -1))
+                    HistoryData(self.__historyDict[url], -1)
+                )
                 currentFrequency = self.__filteredRows[row].frequency
                 self.beginRemoveRows(QModelIndex(), row, row)
                 del self.__filteredRows[row]
                 del self.__historyDict[url]
                 self.endRemoveRows()
-            
+
             self.beginInsertRows(QModelIndex(), 0, 0)
             self.__filteredRows.insert(
-                0, HistoryData(
+                0,
+                HistoryData(
                     self.sourceModel().rowCount(),
-                    self.__frequencyScore(idx) + currentFrequency))
+                    self.__frequencyScore(idx) + currentFrequency,
+                ),
+            )
             self.__historyDict[url] = self.sourceModel().rowCount()
             self.endInsertRows()
-    
+
     def __sourceRowsRemoved(self, parent, start, end):
         """
         Private slot to handle the removal of data in the source model.
-        
+
         @param parent reference to the parent index (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
         """
         self.__sourceReset()
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row row of the first entry to remove (integer)
         @param count number of entries to remove (integer)
         @param parent index of the parent entry (QModelIndex)
@@ -343,27 +348,21 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if (
-            row < 0 or
-            count <= 0 or
-            row + count > self.rowCount(parent) or
-            parent.isValid()
+            row < 0
+            or count <= 0
+            or row + count > self.rowCount(parent)
+            or parent.isValid()
         ):
             return False
-        
+
         lastRow = row + count - 1
         self.sourceModel().rowsRemoved.disconnect(self.__sourceRowsRemoved)
         self.beginRemoveRows(parent, row, lastRow)
         oldCount = self.rowCount()
-        start = (
-            self.sourceModel().rowCount() -
-            self.__filteredRows[row].tailOffset
-        )
-        end = (
-            self.sourceModel().rowCount() -
-            self.__filteredRows[lastRow].tailOffset
-        )
+        start = self.sourceModel().rowCount() - self.__filteredRows[row].tailOffset
+        end = self.sourceModel().rowCount() - self.__filteredRows[lastRow].tailOffset
         self.sourceModel().removeRows(start, end - start + 1)
         self.endRemoveRows()
         self.sourceModel().rowsRemoved.connect(self.__sourceRowsRemoved)
@@ -372,27 +371,26 @@
             self.beginResetModel()
             self.endResetModel()
         return True
-    
+
     def __frequencyScore(self, sourceIndex):
         """
         Private method to calculate the frequency score.
-        
+
         @param sourceIndex index of the source model (QModelIndex)
         @return frequency score (integer)
         """
-        loadTime = self.sourceModel().data(
-            sourceIndex, HistoryModel.DateTimeRole)
+        loadTime = self.sourceModel().data(sourceIndex, HistoryModel.DateTimeRole)
         days = loadTime.daysTo(self.__scaleTime)
-        
+
         if days <= 1:
             return 100
-        elif days < 8:      # within the last week
+        elif days < 8:  # within the last week
             return 90
-        elif days < 15:     # within the last two weeks
+        elif days < 15:  # within the last two weeks
             return 70
-        elif days < 31:     # within the last month
+        elif days < 31:  # within the last month
             return 50
-        elif days < 91:     # within the last 3 months
+        elif days < 91:  # within the last 3 months
             return 30
         else:
             return 10
--- a/src/eric7/WebBrowser/History/HistoryManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,19 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QDateTime, QDate, QTime, QUrl, QTimer, QFile,
-    QIODevice, QByteArray, QDataStream, QTemporaryFile, QObject
+    pyqtSignal,
+    pyqtSlot,
+    QDateTime,
+    QDate,
+    QTime,
+    QUrl,
+    QTimer,
+    QFile,
+    QIODevice,
+    QByteArray,
+    QDataStream,
+    QTemporaryFile,
+    QObject,
 )
 
 from EricWidgets import EricMessageBox
@@ -30,10 +41,11 @@
     """
     Class implementing a history entry.
     """
+
     def __init__(self, url=None, dateTime=None, title=None, visitCount=None):
         """
         Constructor
-        
+
         @param url URL of the history entry (string)
         @param dateTime date and time this entry was created (QDateTime)
         @param title title string for the history entry (string)
@@ -43,37 +55,37 @@
         self.dateTime = dateTime and dateTime or QDateTime()
         self.title = title and title or ""
         self.visitCount = visitCount and visitCount or 0
-    
+
     def __eq__(self, other):
         """
         Special method determining equality.
-        
+
         @param other reference to the history entry to compare against
             (HistoryEntry)
         @return flag indicating equality (boolean)
         """
         return (
-            other.title == self.title and
-            other.url == self.url and
-            other.dateTime == self.dateTime
+            other.title == self.title
+            and other.url == self.url
+            and other.dateTime == self.dateTime
         )
-    
+
     def __lt__(self, other):
         """
         Special method determining less relation.
-        
+
         Note: History is sorted in reverse order by date and time
-        
+
         @param other reference to the history entry to compare against
             (HistoryEntry)
         @return flag indicating less (boolean)
         """
         return self.dateTime > other.dateTime
-    
+
     def userTitle(self):
         """
         Public method to get the title of the history entry.
-        
+
         @return title of the entry (string)
         """
         if not self.title:
@@ -82,11 +94,11 @@
                 return page
             return self.url
         return self.title
-    
+
     def isValid(self):
         """
         Public method to determine validity.
-        
+
         @return flag indicating validity
         @rtype bool
         """
@@ -96,7 +108,7 @@
 class HistoryManager(QObject):
     """
     Class implementing the history manager.
-    
+
     @signal historyCleared() emitted after the history has been cleared
     @signal historyReset() emitted after the history has been reset
     @signal entryAdded(HistoryEntry) emitted after a history entry has been
@@ -106,51 +118,50 @@
     @signal entryUpdated(int) emitted after a history entry has been updated
     @signal historySaved() emitted after the history was saved
     """
+
     historyCleared = pyqtSignal()
     historyReset = pyqtSignal()
     entryAdded = pyqtSignal(HistoryEntry)
     entryRemoved = pyqtSignal(HistoryEntry)
     entryUpdated = pyqtSignal(int)
     historySaved = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
         self.__daysToExpire = Preferences.getWebBrowser("HistoryLimit")
         self.__history = []
         self.__lastSavedUrl = ""
-        
+
         self.__expiredTimer = QTimer(self)
         self.__expiredTimer.setSingleShot(True)
         self.__expiredTimer.timeout.connect(self.__checkForExpired)
-        
+
         self.__frequencyTimer = QTimer(self)
         self.__frequencyTimer.setSingleShot(True)
         self.__frequencyTimer.timeout.connect(self.__refreshFrequencies)
-        
+
         self.entryAdded.connect(self.__saveTimer.changeOccurred)
         self.entryRemoved.connect(self.__saveTimer.changeOccurred)
-        
+
         self.__load()
-        
+
         from .HistoryModel import HistoryModel
         from .HistoryFilterModel import HistoryFilterModel
         from .HistoryTreeModel import HistoryTreeModel
-        
+
         self.__historyModel = HistoryModel(self, self)
-        self.__historyFilterModel = HistoryFilterModel(
-            self.__historyModel, self)
-        self.__historyTreeModel = HistoryTreeModel(
-            self.__historyFilterModel, self)
-        
+        self.__historyFilterModel = HistoryFilterModel(self.__historyModel, self)
+        self.__historyTreeModel = HistoryTreeModel(self.__historyFilterModel, self)
+
         self.__startFrequencyTimer()
-    
+
     def close(self):
         """
         Public method to close the history manager.
@@ -159,19 +170,19 @@
         if self.__daysToExpire == -2:
             self.clear()
         self.__saveTimer.saveIfNeccessary()
-    
+
     def history(self):
         """
         Public method to return the history.
-        
+
         @return reference to the list of history entries (list of HistoryEntry)
         """
         return self.__history[:]
-    
+
     def setHistory(self, history, loadedAndSorted=False):
         """
         Public method to set a new history.
-        
+
         @param history reference to the list of history entries to be set
             (list of HistoryEntry)
         @param loadedAndSorted flag indicating that the list is sorted
@@ -180,9 +191,9 @@
         self.__history = history[:]
         if not loadedAndSorted:
             self.__history.sort()
-        
+
         self.__checkForExpired()
-        
+
         if loadedAndSorted:
             try:
                 self.__lastSavedUrl = self.__history[0].url
@@ -192,11 +203,11 @@
             self.__lastSavedUrl = ""
             self.__saveTimer.changeOccurred()
         self.historyReset.emit()
-    
+
     def __findFirstHistoryEntry(self, url):
         """
         Private method to find the first entry for the given URL.
-        
+
         @param url URL to search for
         @type str
         @return first entry for the given URL
@@ -205,15 +216,15 @@
         for index in range(len(self.__history)):
             if url == self.__history[index].url:
                 return self.__history[index]
-        
+
         # not found, return an empty entry
         return HistoryEntry()
-    
+
     def __updateVisitCount(self, url, count):
         """
         Private method to update the visit count for all entries of the
         given URL.
-        
+
         @param url URL to be updated
         @type str
         @param count new visit count
@@ -222,21 +233,22 @@
         for index in range(len(self.__history)):
             if url == self.__history[index].url:
                 self.__history[index].visitCount = count
-    
+
     def addHistoryEntry(self, view):
         """
         Public method to add a history entry.
-        
+
         @param view reference to the view to add an entry for
         @type WebBrowserView
         """
         import WebBrowser.WebBrowserWindow
+
         if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
             return
-        
+
         url = view.url()
         title = view.title()
-        
+
         if url.scheme() not in ["eric", "about", "data", "chrome"]:
             cleanUrlStr = self.__cleanUrlStr(url)
             firstEntry = self.__findFirstHistoryEntry(cleanUrlStr)
@@ -245,19 +257,18 @@
                 self.__updateVisitCount(cleanUrlStr, visitCount)
             else:
                 visitCount = 1
-            itm = HistoryEntry(cleanUrlStr,
-                               QDateTime.currentDateTime(),
-                               title,
-                               visitCount)
+            itm = HistoryEntry(
+                cleanUrlStr, QDateTime.currentDateTime(), title, visitCount
+            )
             self.__history.insert(0, itm)
             self.entryAdded.emit(itm)
             if len(self.__history) == 1:
                 self.__checkForExpired()
-    
+
     def updateHistoryEntry(self, url, title):
         """
         Public method to update a history entry.
-        
+
         @param url URL of the entry to update (string)
         @param title title of the entry to update (string)
         """
@@ -271,31 +282,30 @@
                         self.__lastSavedUrl = self.__history[index].url
                     self.entryUpdated.emit(index)
                     break
-    
+
     def removeHistoryEntry(self, url, title=""):
         """
         Public method to remove a history entry.
-        
+
         @param url URL of the entry to remove (QUrl)
         @param title title of the entry to remove (string)
         """
         if url.scheme() not in ["eric", "about", "data", "chrome"]:
             cleanUrlStr = self.__cleanUrlStr(url)
             for index in range(len(self.__history)):
-                if (
-                    cleanUrlStr == self.__history[index].url and
-                    (not title or title == self.__history[index].title)
+                if cleanUrlStr == self.__history[index].url and (
+                    not title or title == self.__history[index].title
                 ):
                     itm = self.__history[index]
                     self.__lastSavedUrl = ""
                     self.__history.remove(itm)
                     self.entryRemoved.emit(itm)
                     break
-    
+
     def __cleanUrl(self, url):
         """
         Private method to generate a clean URL usable for the history entry.
-        
+
         @param url original URL
         @type QUrl
         @return cleaned URL
@@ -308,13 +318,13 @@
         if cleanurl.host():
             # convert host to lower case
             cleanurl.setHost(url.host().lower())
-        
+
         return cleanurl
-    
+
     def __cleanUrlStr(self, url):
         """
         Private method to generate a clean URL usable for the history entry.
-        
+
         @param url original URL
         @type QUrl
         @return cleaned URL
@@ -322,93 +332,92 @@
         """
         cleanurl = self.__cleanUrl(url)
         return cleanurl.toString()
-    
+
     def historyModel(self):
         """
         Public method to get a reference to the history model.
-        
+
         @return reference to the history model (HistoryModel)
         """
         return self.__historyModel
-    
+
     def historyFilterModel(self):
         """
         Public method to get a reference to the history filter model.
-        
+
         @return reference to the history filter model (HistoryFilterModel)
         """
         return self.__historyFilterModel
-    
+
     def historyTreeModel(self):
         """
         Public method to get a reference to the history tree model.
-        
+
         @return reference to the history tree model (HistoryTreeModel)
         """
         return self.__historyTreeModel
-    
+
     def __checkForExpired(self):
         """
         Private slot to check entries for expiration.
         """
         if self.__daysToExpire < 0 or len(self.__history) == 0:
             return
-        
+
         now = QDateTime.currentDateTime()
         nextTimeout = 0
-        
+
         while self.__history:
             checkForExpired = QDateTime(self.__history[-1].dateTime)
-            checkForExpired.setDate(
-                checkForExpired.date().addDays(self.__daysToExpire))
+            checkForExpired.setDate(checkForExpired.date().addDays(self.__daysToExpire))
             nextTimeout = (
                 7 * 86400
-                if now.daysTo(checkForExpired) > 7 else
-                now.secsTo(checkForExpired)
+                if now.daysTo(checkForExpired) > 7
+                else now.secsTo(checkForExpired)
             )
             if nextTimeout > 0:
                 break
-            
+
             itm = self.__history.pop(-1)
             self.__lastSavedUrl = ""
             self.entryRemoved.emit(itm)
         self.__saveTimer.saveIfNeccessary()
-        
+
         if nextTimeout > 0:
             self.__expiredTimer.start(nextTimeout * 1000)
-    
+
     def daysToExpire(self):
         """
         Public method to get the days for entry expiration.
-        
+
         @return days for entry expiration (integer)
         """
         return self.__daysToExpire
-    
+
     def setDaysToExpire(self, limit):
         """
         Public method to set the days for entry expiration.
-        
+
         @param limit days for entry expiration (integer)
         """
         if self.__daysToExpire == limit:
             return
-        
+
         self.__daysToExpire = limit
         self.__checkForExpired()
         self.__saveTimer.changeOccurred()
-    
+
     def preferencesChanged(self):
         """
         Public method to indicate a change of preferences.
         """
         self.setDaysToExpire(Preferences.getWebBrowser("HistoryLimit"))
-    
+
     @pyqtSlot()
     def clear(self, period=0):
         """
         Public slot to clear the complete history.
-        
+
         @param period history period in milliseconds to be cleared (integer)
         """
         if period == 0:
@@ -416,10 +425,8 @@
             self.historyReset.emit()
         else:
             breakMS = QDateTime.currentMSecsSinceEpoch() - period
-            while (
-                self.__history and
-                (QDateTime(self.__history[0].dateTime).toMSecsSinceEpoch() >
-                 breakMS)
+            while self.__history and (
+                QDateTime(self.__history[0].dateTime).toMSecsSinceEpoch() > breakMS
             ):
                 itm = self.__history.pop(0)
                 self.entryRemoved.emit(itm)
@@ -427,21 +434,21 @@
         self.__saveTimer.changeOccurred()
         self.__saveTimer.saveIfNeccessary()
         self.historyCleared.emit()
-    
+
     def getFileName(self):
         """
         Public method to get the file name of the history file.
-        
+
         @return name of the history file (string)
         """
         return os.path.join(Utilities.getConfigDir(), "web_browser", "history")
-    
+
     def reload(self):
         """
         Public method to reload the history.
         """
         self.__load()
-    
+
     def __load(self):
         """
         Private method to load the saved history entries from disk.
@@ -455,12 +462,13 @@
                 self.tr("Loading History"),
                 self.tr(
                     """<p>Unable to open history file <b>{0}</b>.<br/>"""
-                    """Reason: {1}</p>""")
-                .format(historyFile.fileName, historyFile.errorString()))
+                    """Reason: {1}</p>"""
+                ).format(historyFile.fileName, historyFile.errorString()),
+            )
             return
-        
+
         history = []
-        
+
         # double check, that the history file is sorted as it is read
         needToSort = False
         lastInsertedItem = HistoryEntry()
@@ -477,15 +485,15 @@
             itm.title = Utilities.readStringFromStream(stream)
             if ver == HISTORY_VERSION_60:
                 itm.visitCount = stream.readUInt32()
-            
+
             if not itm.dateTime.isValid():
                 continue
-            
+
             if itm == lastInsertedItem:
                 if not lastInsertedItem.title and len(history) > 0:
                     history[0].title = itm.title
                 continue
-            
+
             if ver == HISTORY_VERSION_42:
                 firstEntry = self.__findFirstHistoryEntry(itm.url)
                 if firstEntry.isValid():
@@ -494,24 +502,24 @@
                 else:
                     visitCount = 1
                 itm.visitCount = visitCount
-            
+
             if not needToSort and history and lastInsertedItem < itm:
                 needToSort = True
-            
+
             history.insert(0, itm)
             lastInsertedItem = itm
         historyFile.close()
-        
+
         if needToSort:
             history.sort()
-        
+
         self.setHistory(history, True)
-        
+
         # if the history had to be sorted, rewrite the history sorted
         if needToSort:
             self.__lastSavedUrl = ""
             self.__saveTimer.changeOccurred()
-    
+
     def save(self):
         """
         Public slot to save the history entries to disk.
@@ -519,7 +527,7 @@
         historyFile = QFile(self.getFileName())
         if not historyFile.exists():
             self.__lastSavedUrl = ""
-        
+
         saveAll = self.__lastSavedUrl == ""
         first = len(self.__history) - 1
         if not saveAll:
@@ -530,7 +538,7 @@
                     break
         if first == len(self.__history) - 1:
             saveAll = True
-        
+
         if saveAll:
             # use a temporary file when saving everything
             f = QTemporaryFile()
@@ -539,17 +547,18 @@
         else:
             f = historyFile
             opened = f.open(QIODevice.OpenModeFlag.Append)
-        
+
         if not opened:
             EricMessageBox.warning(
                 None,
                 self.tr("Saving History"),
                 self.tr(
                     """<p>Unable to open history file <b>{0}</b>.<br/>"""
-                    """Reason: {1}</p>""")
-                .format(f.fileName(), f.errorString()))
+                    """Reason: {1}</p>"""
+                ).format(f.fileName(), f.errorString()),
+            )
             return
-        
+
         for index in range(first, -1, -1):
             data = QByteArray()
             stream = QDataStream(data, QIODevice.OpenModeFlag.WriteOnly)
@@ -558,10 +567,10 @@
             stream.writeUInt32(HISTORY_VERSION_60)
             stream.writeString(itm.url.encode("utf-8"))
             stream << itm.dateTime
-            stream.writeString(itm.title.encode('utf-8'))
+            stream.writeString(itm.title.encode("utf-8"))
             stream.writeUInt32(itm.visitCount)
             f.write(data)
-        
+
         f.close()
         if saveAll:
             if historyFile.exists() and not historyFile.remove():
@@ -570,44 +579,44 @@
                     self.tr("Saving History"),
                     self.tr(
                         """<p>Error removing old history file <b>{0}</b>."""
-                        """<br/>Reason: {1}</p>""")
-                    .format(historyFile.fileName(),
-                            historyFile.errorString()))
+                        """<br/>Reason: {1}</p>"""
+                    ).format(historyFile.fileName(), historyFile.errorString()),
+                )
             if not f.copy(historyFile.fileName()):
                 EricMessageBox.warning(
                     None,
                     self.tr("Saving History"),
                     self.tr(
                         """<p>Error moving new history file over old one """
-                        """(<b>{0}</b>).<br/>Reason: {1}</p>""")
-                    .format(historyFile.fileName(), f.errorString()))
+                        """(<b>{0}</b>).<br/>Reason: {1}</p>"""
+                    ).format(historyFile.fileName(), f.errorString()),
+                )
             f.remove()  # get rid of the temporary file
         self.historySaved.emit()
         try:
             self.__lastSavedUrl = self.__history[0].url
         except IndexError:
             self.__lastSavedUrl = ""
-    
+
     def __refreshFrequencies(self):
         """
         Private slot to recalculate the refresh frequencies.
         """
         self.__historyFilterModel.recalculateFrequencies()
         self.__startFrequencyTimer()
-    
+
     def __startFrequencyTimer(self):
         """
         Private method to start the timer to recalculate the frequencies.
         """
         tomorrow = QDateTime(QDate.currentDate().addDays(1), QTime(3, 0))
-        self.__frequencyTimer.start(
-            QDateTime.currentDateTime().secsTo(tomorrow) * 1000)
-    
+        self.__frequencyTimer.start(QDateTime.currentDateTime().secsTo(tomorrow) * 1000)
+
     def siteVisitsCount(self, scheme, host):
         """
         Public method to get the visit count for a web site using the given
         scheme.
-        
+
         @param scheme scheme to look for
         @type str
         @param host host to look for
@@ -617,13 +626,13 @@
         """
         count = 0
         url = "{0}://{1}".format(scheme.lower(), host.lower())
-        
+
         seenUrls = []
-        
+
         for index in range(len(self.__history)):
             historyUrl = self.__history[index].url
             if historyUrl.startswith(url) and historyUrl not in seenUrls:
                 count += self.__history[index].visitCount
                 seenUrls.append(historyUrl)
-        
+
         return count
--- a/src/eric7/WebBrowser/History/HistoryMenu.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryMenu.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,13 @@
 import functools
 
 from PyQt6.QtCore import (
-    pyqtSignal, Qt, QMimeData, QUrl, QModelIndex, QSortFilterProxyModel,
-    QAbstractProxyModel
+    pyqtSignal,
+    Qt,
+    QMimeData,
+    QUrl,
+    QModelIndex,
+    QSortFilterProxyModel,
+    QAbstractProxyModel,
 )
 from PyQt6.QtWidgets import QMenu
 
@@ -27,129 +32,128 @@
 class HistoryMenuModel(QAbstractProxyModel):
     """
     Class implementing a model for the history menu.
-    
+
     It maps the first bunch of items of the source model to the root.
     """
+
     MOVEDROWS = 15
-    
+
     def __init__(self, sourceModel, parent=None):
         """
         Constructor
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__treeModel = sourceModel
-        
+
         self.setSourceModel(sourceModel)
-    
+
     def bumpedRows(self):
         """
         Public method to determine the number of rows moved to the root.
-        
+
         @return number of rows moved to the root (integer)
         """
         first = self.__treeModel.index(0, 0)
         if not first.isValid():
             return 0
         return min(self.__treeModel.rowCount(first), self.MOVEDROWS)
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         return self.__treeModel.columnCount(self.mapToSource(parent))
-    
+
     def rowCount(self, parent=None):
         """
         Public method to determine the number of rows.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.column() > 0:
             return 0
-        
+
         if not parent.isValid():
             folders = self.sourceModel().rowCount()
             bumpedItems = self.bumpedRows()
             if (
-                bumpedItems <= self.MOVEDROWS and
-                bumpedItems == self.sourceModel().rowCount(
-                    self.sourceModel().index(0, 0))
+                bumpedItems <= self.MOVEDROWS
+                and bumpedItems
+                == self.sourceModel().rowCount(self.sourceModel().index(0, 0))
             ):
                 folders -= 1
             return bumpedItems + folders
-        
-        if (
-            parent.internalId() == sys.maxsize and
-            parent.row() < self.bumpedRows()
-        ):
+
+        if parent.internalId() == sys.maxsize and parent.row() < self.bumpedRows():
             return 0
-        
+
         idx = self.mapToSource(parent)
         defaultCount = self.sourceModel().rowCount(idx)
         if idx == self.sourceModel().index(0, 0):
             return defaultCount - self.bumpedRows()
-        
+
         return defaultCount
-    
+
     def mapFromSource(self, sourceIndex):
         """
         Public method to map an index to the proxy model index.
-        
+
         @param sourceIndex reference to a source model index (QModelIndex)
         @return proxy model index (QModelIndex)
         """
         sourceRow = self.__treeModel.mapToSource(sourceIndex).row()
-        return self.createIndex(
-            sourceIndex.row(), sourceIndex.column(), sourceRow)
-    
+        return self.createIndex(sourceIndex.row(), sourceIndex.column(), sourceRow)
+
     def mapToSource(self, proxyIndex):
         """
         Public method to map an index to the source model index.
-        
+
         @param proxyIndex reference to a proxy model index (QModelIndex)
         @return source model index (QModelIndex)
         """
         if not proxyIndex.isValid():
             return QModelIndex()
-        
+
         if proxyIndex.internalId() == sys.maxsize:
             bumpedItems = self.bumpedRows()
             if proxyIndex.row() < bumpedItems:
                 return self.__treeModel.index(
-                    proxyIndex.row(), proxyIndex.column(),
-                    self.__treeModel.index(0, 0))
+                    proxyIndex.row(), proxyIndex.column(), self.__treeModel.index(0, 0)
+                )
             if (
-                bumpedItems <= self.MOVEDROWS and
-                bumpedItems == self.sourceModel().rowCount(
-                    self.__treeModel.index(0, 0))
+                bumpedItems <= self.MOVEDROWS
+                and bumpedItems
+                == self.sourceModel().rowCount(self.__treeModel.index(0, 0))
             ):
                 bumpedItems -= 1
-            return self.__treeModel.index(proxyIndex.row() - bumpedItems,
-                                          proxyIndex.column())
-        
+            return self.__treeModel.index(
+                proxyIndex.row() - bumpedItems, proxyIndex.column()
+            )
+
         historyIndex = self.__treeModel.sourceModel().index(
-            proxyIndex.internalId(), proxyIndex.column())
+            proxyIndex.internalId(), proxyIndex.column()
+        )
         treeIndex = self.__treeModel.mapFromSource(historyIndex)
         return treeIndex
-    
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number for the index (integer)
         @param column column number for the index (integer)
         @param parent index of the parent item (QModelIndex)
@@ -157,25 +161,24 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if (
-            row < 0 or
-            column < 0 or
-            column >= self.columnCount(parent) or
-            parent.column() > 0
+            row < 0
+            or column < 0
+            or column >= self.columnCount(parent)
+            or parent.column() > 0
         ):
             return QModelIndex()
-        
+
         if not parent.isValid():
             return self.createIndex(row, column, sys.maxsize)
-        
+
         treeIndexParent = self.mapToSource(parent)
-        
+
         bumpedItems = 0
         if treeIndexParent == self.sourceModel().index(0, 0):
             bumpedItems = self.bumpedRows()
-        treeIndex = self.__treeModel.index(
-            row + bumpedItems, column, treeIndexParent)
+        treeIndex = self.__treeModel.index(row + bumpedItems, column, treeIndexParent)
         historyIndex = self.__treeModel.mapToSource(treeIndex)
         historyRow = historyIndex.row()
         if historyRow == -1:
@@ -185,36 +188,33 @@
     def parent(self, index):
         """
         Public method to get the parent index.
-        
+
         @param index index of item to get parent (QModelIndex)
         @return index of parent (QModelIndex)
         """
         offset = index.internalId()
         if offset == sys.maxsize or not index.isValid():
             return QModelIndex()
-        
-        historyIndex = self.__treeModel.sourceModel().index(
-            index.internalId(), 0)
+
+        historyIndex = self.__treeModel.sourceModel().index(index.internalId(), 0)
         treeIndex = self.__treeModel.mapFromSource(historyIndex)
         treeIndexParent = treeIndex.parent()
-        
+
         sourceRow = self.sourceModel().mapToSource(treeIndexParent).row()
         bumpedItems = self.bumpedRows()
-        if (
-            bumpedItems <= self.MOVEDROWS and
-            bumpedItems == self.sourceModel().rowCount(
-                self.sourceModel().index(0, 0))
+        if bumpedItems <= self.MOVEDROWS and bumpedItems == self.sourceModel().rowCount(
+            self.sourceModel().index(0, 0)
         ):
             bumpedItems -= 1
-        
-        return self.createIndex(bumpedItems + treeIndexParent.row(),
-                                treeIndexParent.column(),
-                                sourceRow)
-    
+
+        return self.createIndex(
+            bumpedItems + treeIndexParent.row(), treeIndexParent.column(), sourceRow
+        )
+
     def mimeData(self, indexes):
         """
         Public method to return the mime data.
-        
+
         @param indexes list of indexes (QModelIndexList)
         @return mime data (QMimeData)
         """
@@ -222,7 +222,7 @@
         for index in indexes:
             url = index.data(HistoryModel.UrlRole)
             urls.append(url)
-        
+
         mdata = QMimeData()
         mdata.setUrls(urls)
         return mdata
@@ -232,48 +232,46 @@
     """
     Class implementing a model to show the most visited history entries.
     """
+
     def __init__(self, sourceModel, parent=None):
         """
         Constructor
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.setDynamicSortFilter(True)
         self.setSourceModel(sourceModel)
-    
+
     def lessThan(self, left, right):
         """
         Public method used to sort the displayed items.
-        
+
         @param left index of left item (QModelIndex)
         @param right index of right item (QModelIndex)
         @return true, if left is less than right (boolean)
         """
         from .HistoryFilterModel import HistoryFilterModel
-        frequency_L = self.sourceModel().data(
-            left, HistoryFilterModel.FrequencyRole)
-        dateTime_L = self.sourceModel().data(
-            left, HistoryModel.DateTimeRole)
-        frequency_R = self.sourceModel().data(
-            right, HistoryFilterModel.FrequencyRole)
-        dateTime_R = self.sourceModel().data(
-            right, HistoryModel.DateTimeRole)
-        
+
+        frequency_L = self.sourceModel().data(left, HistoryFilterModel.FrequencyRole)
+        dateTime_L = self.sourceModel().data(left, HistoryModel.DateTimeRole)
+        frequency_R = self.sourceModel().data(right, HistoryFilterModel.FrequencyRole)
+        dateTime_R = self.sourceModel().data(right, HistoryModel.DateTimeRole)
+
         # Sort results in descending frequency-derived score. If frequencies
         # are equal, sort on most recently viewed
         if frequency_R == frequency_L:
             return dateTime_R < dateTime_L
-        
+
         return frequency_R < frequency_L
 
 
 class HistoryMenu(EricModelMenu):
     """
     Class implementing the history menu.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new
@@ -282,128 +280,132 @@
     @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new
         private window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newBackgroundTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
     newPrivateWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, parent=None, tabWidget=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         @param tabWidget reference to the tab widget managing the browser
             tabs (HelpTabWidget
         """
         EricModelMenu.__init__(self, parent)
-        
+
         self.__tabWidget = tabWidget
         self.__mw = parent
-        
+
         self.__historyManager = None
         self.__historyMenuModel = None
         self.__initialActions = []
         self.__mostVisitedMenu = None
-        
+
         self.__closedTabsMenu = QMenu(self.tr("Closed Tabs"))
-        self.__closedTabsMenu.aboutToShow.connect(
-            self.__aboutToShowClosedTabsMenu)
+        self.__closedTabsMenu.aboutToShow.connect(self.__aboutToShowClosedTabsMenu)
         self.__tabWidget.closedTabsManager().closedTabAvailable.connect(
-            self.__closedTabAvailable)
-        
+            self.__closedTabAvailable
+        )
+
         self.setMaxRows(7)
-        
+
         self.activated.connect(self.__activated)
         self.setStatusBarTextRole(HistoryModel.UrlStringRole)
-    
+
     def __activated(self, idx):
         """
         Private slot handling the activated signal.
-        
+
         @param idx index of the activated item (QModelIndex)
         """
         if self._keyboardModifiers & Qt.KeyboardModifier.ControlModifier:
             self.newTab.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
         elif self._keyboardModifiers & Qt.KeyboardModifier.ShiftModifier:
             self.newWindow.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
         else:
             self.openUrl.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
-    
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
+
     def prePopulated(self):
         """
         Public method to add any actions before the tree.
-       
+
         @return flag indicating if any actions were added (boolean)
         """
         if self.__historyManager is None:
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             self.__historyManager = WebBrowserWindow.historyManager()
             self.__historyMenuModel = HistoryMenuModel(
-                self.__historyManager.historyTreeModel(), self)
+                self.__historyManager.historyTreeModel(), self
+            )
             self.setModel(self.__historyMenuModel)
-        
+
         # initial actions
         for act in self.__initialActions:
             self.addAction(act)
         if len(self.__initialActions) != 0:
             self.addSeparator()
         self.setFirstSeparator(self.__historyMenuModel.bumpedRows())
-        
+
         return False
-    
+
     def postPopulated(self):
         """
         Public method to add any actions after the tree.
         """
         if len(self.__historyManager.history()) > 0:
             self.addSeparator()
-        
+
         if self.__mostVisitedMenu is None:
             self.__mostVisitedMenu = HistoryMostVisitedMenu(10, self)
             self.__mostVisitedMenu.setTitle(self.tr("Most Visited"))
             self.__mostVisitedMenu.openUrl.connect(self.openUrl)
             self.__mostVisitedMenu.newTab.connect(self.newTab)
-            self.__mostVisitedMenu.newBackgroundTab.connect(
-                self.newBackgroundTab)
+            self.__mostVisitedMenu.newBackgroundTab.connect(self.newBackgroundTab)
             self.__mostVisitedMenu.newWindow.connect(self.newWindow)
-            self.__mostVisitedMenu.newPrivateWindow.connect(
-                self.newPrivateWindow)
+            self.__mostVisitedMenu.newPrivateWindow.connect(self.newPrivateWindow)
         self.addMenu(self.__mostVisitedMenu)
         act = self.addMenu(self.__closedTabsMenu)
         act.setIcon(UI.PixmapCache.getIcon("trash"))
         act.setEnabled(self.__tabWidget.canRestoreClosedTab())
         self.addSeparator()
-        
-        act = self.addAction(UI.PixmapCache.getIcon("history"),
-                             self.tr("Show All History..."))
+
+        act = self.addAction(
+            UI.PixmapCache.getIcon("history"), self.tr("Show All History...")
+        )
         act.triggered.connect(self.showHistoryDialog)
-        act = self.addAction(UI.PixmapCache.getIcon("historyClear"),
-                             self.tr("Clear History..."))
+        act = self.addAction(
+            UI.PixmapCache.getIcon("historyClear"), self.tr("Clear History...")
+        )
         act.triggered.connect(self.__clearHistoryDialog)
-    
+
     def setInitialActions(self, actions):
         """
         Public method to set the list of actions that should appear first in
         the menu.
-        
+
         @param actions list of initial actions (list of QAction)
         """
         self.__initialActions = actions[:]
         for act in self.__initialActions:
             self.addAction(act)
-    
+
     def showHistoryDialog(self):
         """
         Public slot to show the history dialog.
         """
         from .HistoryDialog import HistoryDialog
+
         dlg = HistoryDialog(self.__mw)
         dlg.openUrl.connect(self.openUrl)
         dlg.newTab.connect(self.newTab)
@@ -411,53 +413,55 @@
         dlg.newWindow.connect(self.newWindow)
         dlg.newPrivateWindow.connect(self.newPrivateWindow)
         dlg.show()
-    
+
     def __clearHistoryDialog(self):
         """
         Private slot to clear the history.
         """
         if self.__historyManager is not None and EricMessageBox.yesNo(
-                self,
-                self.tr("Clear History"),
-                self.tr("""Do you want to clear the history?""")):
+            self,
+            self.tr("Clear History"),
+            self.tr("""Do you want to clear the history?"""),
+        ):
             self.__historyManager.clear()
             self.__tabWidget.clearClosedTabsList()
-    
+
     def __aboutToShowClosedTabsMenu(self):
         """
         Private slot to populate the closed tabs menu.
         """
         fm = self.__closedTabsMenu.fontMetrics()
         try:
-            maxWidth = fm.horizontalAdvance('m') * 40
+            maxWidth = fm.horizontalAdvance("m") * 40
         except AttributeError:
-            maxWidth = fm.width('m') * 40
-        
+            maxWidth = fm.width("m") * 40
+
         import WebBrowser.WebBrowserWindow
+
         self.__closedTabsMenu.clear()
         for index, tab in enumerate(
             self.__tabWidget.closedTabsManager().allClosedTabs()
         ):
-            title = fm.elidedText(tab.title, Qt.TextElideMode.ElideRight,
-                                  maxWidth)
+            title = fm.elidedText(tab.title, Qt.TextElideMode.ElideRight, maxWidth)
             act = self.__closedTabsMenu.addAction(
-                WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(tab.url),
-                title)
+                WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(tab.url), title
+            )
             act.setData(index)
             act.triggered.connect(
-                functools.partial(self.__tabWidget.restoreClosedTab, act))
+                functools.partial(self.__tabWidget.restoreClosedTab, act)
+            )
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
-            self.tr("Restore All Closed Tabs"),
-            self.__tabWidget.restoreAllClosedTabs)
+            self.tr("Restore All Closed Tabs"), self.__tabWidget.restoreAllClosedTabs
+        )
         self.__closedTabsMenu.addAction(
-            self.tr("Clear List"),
-            self.__tabWidget.clearClosedTabsList)
-    
+            self.tr("Clear List"), self.__tabWidget.clearClosedTabsList
+        )
+
     def __closedTabAvailable(self, avail):
         """
         Private slot to handle changes of the availability of closed tabs.
-        
+
         @param avail flag indicating the availability of closed tabs (boolean)
         """
         self.__closedTabsMenu.setEnabled(avail)
@@ -466,7 +470,7 @@
 class HistoryMostVisitedMenu(EricModelMenu):
     """
     Class implementing the most visited history menu.
-    
+
     @signal openUrl(QUrl, str) emitted to open a URL in the current tab
     @signal newTab(QUrl, str) emitted to open a URL in a new tab
     @signal newBackgroundTab(QUrl, str) emitted to open a URL in a new
@@ -475,58 +479,61 @@
     @signal newPrivateWindow(QUrl, str) emitted to open a URL in a new
         private window
     """
+
     openUrl = pyqtSignal(QUrl, str)
     newTab = pyqtSignal(QUrl, str)
     newBackgroundTab = pyqtSignal(QUrl, str)
     newWindow = pyqtSignal(QUrl, str)
     newPrivateWindow = pyqtSignal(QUrl, str)
-    
+
     def __init__(self, count, parent=None):
         """
         Constructor
-        
+
         @param count maximum number of entries to be shown (integer)
         @param parent reference to the parent widget (QWidget)
         """
         EricModelMenu.__init__(self, parent)
-        
+
         self.__historyMenuModel = None
-        
+
         self.setMaxRows(count + 1)
-        
+
         self.setStatusBarTextRole(HistoryModel.UrlStringRole)
-    
+
     def __activated(self, idx):
         """
         Private slot handling the activated signal.
-        
+
         @param idx index of the activated item (QModelIndex)
         """
         if self._keyboardModifiers & Qt.KeyboardModifier.ControlModifier:
             self.newTab.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
         elif self._keyboardModifiers & Qt.KeyboardModifier.ShiftModifier:
             self.newWindow.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
         else:
             self.openUrl.emit(
-                idx.data(HistoryModel.UrlRole),
-                idx.data(HistoryModel.TitleRole))
-    
+                idx.data(HistoryModel.UrlRole), idx.data(HistoryModel.TitleRole)
+            )
+
     def prePopulated(self):
         """
         Public method to add any actions before the tree.
-       
+
         @return flag indicating if any actions were added (boolean)
         """
         if self.__historyMenuModel is None:
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             historyManager = WebBrowserWindow.historyManager()
             self.__historyMenuModel = HistoryMostVisitedMenuModel(
-                historyManager.historyFilterModel(), self)
+                historyManager.historyFilterModel(), self
+            )
             self.setModel(self.__historyMenuModel)
         self.__historyMenuModel.sort(0)
-        
+
         return False
--- a/src/eric7/WebBrowser/History/HistoryModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,6 +18,7 @@
     """
     Class implementing the history model.
     """
+
     DateRole = Qt.ItemDataRole.UserRole + 1
     DateTimeRole = Qt.ItemDataRole.UserRole + 2
     UrlRole = Qt.ItemDataRole.UserRole + 3
@@ -25,75 +26,70 @@
     TitleRole = Qt.ItemDataRole.UserRole + 5
     VisitCountRole = Qt.ItemDataRole.UserRole + 6
     MaxRole = VisitCountRole
-    
+
     def __init__(self, historyManager, parent=None):
         """
         Constructor
-        
+
         @param historyManager reference to the history manager object
             (HistoryManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__historyManager = historyManager
-        
-        self.__headers = [
-            self.tr("Title"),
-            self.tr("Address"),
-            self.tr("Visit Count")
-        ]
-        
+
+        self.__headers = [self.tr("Title"), self.tr("Address"), self.tr("Visit Count")]
+
         self.__historyManager.historyReset.connect(self.historyReset)
         self.__historyManager.entryRemoved.connect(self.historyReset)
         self.__historyManager.entryAdded.connect(self.entryAdded)
         self.__historyManager.entryUpdated.connect(self.entryUpdated)
-    
+
     def historyReset(self):
         """
         Public slot to reset the model.
         """
         self.beginResetModel()
         self.endResetModel()
-    
+
     def entryAdded(self):
         """
         Public slot to handle the addition of a history entry.
         """
         self.beginInsertRows(QModelIndex(), 0, 0)
         self.endInsertRows()
-    
+
     def entryUpdated(self, row):
         """
         Public slot to handle the update of a history entry.
-        
+
         @param row row number of the updated entry (integer)
         """
         idx = self.index(row, 0)
         self.dataChanged.emit(idx, idx)
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
         return QAbstractTableModel.headerData(self, section, orientation, role)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index of history entry to get data for (QModelIndex)
         @param role data role (integer)
         @return history entry data
@@ -101,7 +97,7 @@
         lst = self.__historyManager.history()
         if index.row() < 0 or index.row() > len(lst):
             return None
-        
+
         itm = lst[index.row()]
         if role == self.DateTimeRole:
             return itm.dateTime
@@ -122,49 +118,45 @@
                 return itm.url
             elif index.column() == 2:
                 return itm.visitCount
-        elif (
-            role == Qt.ItemDataRole.DecorationRole and
-            index.column() == 0
-        ):
-            return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
-                QUrl(itm.url))
-        
+        elif role == Qt.ItemDataRole.DecorationRole and index.column() == 0:
+            return WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(QUrl(itm.url))
+
         return None
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return len(self.__headers)
-    
+
     def rowCount(self, parent=None):
         """
         Public method to determine the number of rows.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return len(self.__historyManager.history())
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove history entries from the model.
-        
+
         @param row row of the first history entry to remove (integer)
         @param count number of history entries to remove (integer)
         @param parent index of the parent entry (QModelIndex)
@@ -172,10 +164,10 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         lastRow = row + count - 1
         self.beginRemoveRows(parent, row, lastRow)
         lst = self.__historyManager.history()[:]
--- a/src/eric7/WebBrowser/History/HistoryTreeModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/History/HistoryTreeModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,36 +20,36 @@
     """
     Class implementing the history tree model.
     """
+
     def __init__(self, sourceModel, parent=None):
         """
         Constructor
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__sourceRowCache = []
         self.__removingDown = False
-        
+
         self.setSourceModel(sourceModel)
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         return self.sourceModel().headerData(section, orientation, role)
-    
+
     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get data from the model.
-        
+
         @param index index of history entry to get data for (QModelIndex)
         @param role data role (integer)
         @return history entry data
@@ -66,104 +66,103 @@
                     return date.toString("yyyy-MM-dd")
                 if index.column() == 1:
                     return self.tr(
-                        "%n item(s)", "",
-                        self.rowCount(index.sibling(index.row(), 0)))
-        
+                        "%n item(s)", "", self.rowCount(index.sibling(index.row(), 0))
+                    )
+
         elif (
-            role == Qt.ItemDataRole.DecorationRole and
-            index.column() == 0 and
-            not index.parent().isValid()
+            role == Qt.ItemDataRole.DecorationRole
+            and index.column() == 0
+            and not index.parent().isValid()
         ):
             return UI.PixmapCache.getIcon("history")
-        
+
         elif (
-            role == HistoryModel.DateRole and
-            index.column() == 0 and
-            index.internalId() == 0
+            role == HistoryModel.DateRole
+            and index.column() == 0
+            and index.internalId() == 0
         ):
             offset = self.__sourceDateRow(index.row())
             idx = self.sourceModel().index(offset, 0)
             return idx.data(HistoryModel.DateRole)
-        
+
         return QAbstractProxyModel.data(self, index, role)
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of columns (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         return self.sourceModel().columnCount(self.mapToSource(parent))
-    
+
     def rowCount(self, parent=None):
         """
         Public method to determine the number of rows.
-        
+
         @param parent index of parent (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if (
-            parent.internalId() != 0 or
-            parent.column() > 0 or
-            self.sourceModel() is None
+            parent.internalId() != 0
+            or parent.column() > 0
+            or self.sourceModel() is None
         ):
             return 0
-        
+
         # row count OF dates
         if not parent.isValid():
             if self.__sourceRowCache:
                 return len(self.__sourceRowCache)
-            
+
             currentDate = QDate()
             rows = 0
             totalRows = self.sourceModel().rowCount()
-            
+
             for row in range(totalRows):
-                rowDate = self.sourceModel().index(row, 0).data(
-                    HistoryModel.DateRole)
+                rowDate = self.sourceModel().index(row, 0).data(HistoryModel.DateRole)
                 if rowDate != currentDate:
                     self.__sourceRowCache.append(row)
                     currentDate = rowDate
                     rows += 1
             return rows
-        
+
         # row count FOR a date
         start = self.__sourceDateRow(parent.row())
         end = self.__sourceDateRow(parent.row() + 1)
         return end - start
-    
+
     def __sourceDateRow(self, row):
         """
         Private method to translate the top level date row into the offset
         where that date starts.
-        
+
         @param row row number of the date (integer)
         @return offset where that date starts (integer)
         """
         if row <= 0:
             return 0
-        
+
         if len(self.__sourceRowCache) == 0:
             self.rowCount(QModelIndex())
-        
+
         if row >= len(self.__sourceRowCache):
             if self.sourceModel() is None:
                 return 0
             return self.sourceModel().rowCount()
-        
+
         return self.__sourceRowCache[row]
-    
+
     def mapToSource(self, proxyIndex):
         """
         Public method to map an index to the source model index.
-        
+
         @param proxyIndex reference to a proxy model index (QModelIndex)
         @return source model index (QModelIndex)
         """
@@ -172,12 +171,13 @@
             return QModelIndex()
         startDateRow = self.__sourceDateRow(offset - 1)
         return self.sourceModel().index(
-            startDateRow + proxyIndex.row(), proxyIndex.column())
-    
+            startDateRow + proxyIndex.row(), proxyIndex.column()
+        )
+
     def index(self, row, column, parent=None):
         """
         Public method to create an index.
-        
+
         @param row row number for the index (integer)
         @param column column number for the index (integer)
         @param parent index of the parent item (QModelIndex)
@@ -185,15 +185,15 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if (
-            row < 0 or
-            column < 0 or
-            column >= self.columnCount(parent) or
-            parent.column() > 0
+            row < 0
+            or column < 0
+            or column >= self.columnCount(parent)
+            or parent.column() > 0
         ):
             return QModelIndex()
-        
+
         if not parent.isValid():
             return self.createIndex(row, column, 0)
         return self.createIndex(row, column, parent.row() + 1)
@@ -201,7 +201,7 @@
     def parent(self, index):
         """
         Public method to get the parent index.
-        
+
         @param index index of item to get parent (QModelIndex)
         @return index of parent (QModelIndex)
         """
@@ -209,62 +209,63 @@
         if offset == 0 or not index.isValid():
             return QModelIndex()
         return self.createIndex(offset - 1, 0, 0)
-    
+
     def hasChildren(self, parent=None):
         """
         Public method to check, if an entry has some children.
-        
+
         @param parent index of the entry to check (QModelIndex)
         @return flag indicating the presence of children (boolean)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         grandparent = parent.parent()
         if not grandparent.isValid():
             return True
         return False
-    
+
     def flags(self, index):
         """
         Public method to get the item flags.
-        
+
         @param index index of the item (QModelIndex)
         @return flags (Qt.ItemFlags)
         """
         return (
             Qt.ItemFlag.NoItemFlags
-            if not index.isValid() else
-            (Qt.ItemFlag.ItemIsSelectable |
-             Qt.ItemFlag.ItemIsEnabled |
-             Qt.ItemFlag.ItemIsDragEnabled)
+            if not index.isValid()
+            else (
+                Qt.ItemFlag.ItemIsSelectable
+                | Qt.ItemFlag.ItemIsEnabled
+                | Qt.ItemFlag.ItemIsDragEnabled
+            )
         )
-    
+
     def setSourceModel(self, sourceModel):
         """
         Public method to set the source model.
-        
+
         @param sourceModel reference to the source model (QAbstractItemModel)
         """
         if self.sourceModel() is not None:
             self.sourceModel().modelReset.disconnect(self.__sourceReset)
             self.sourceModel().layoutChanged.disconnect(self.__sourceReset)
-            self.sourceModel().rowsInserted.disconnect(
-                self.__sourceRowsInserted)
+            self.sourceModel().rowsInserted.disconnect(self.__sourceRowsInserted)
             self.sourceModel().rowsRemoved.disconnect(self.__sourceRowsRemoved)
-        
+
         super().setSourceModel(sourceModel)
-        
+
         if self.sourceModel() is not None:
             self.__loaded = False
             self.sourceModel().modelReset.connect(self.__sourceReset)
             self.sourceModel().layoutChanged.connect(self.__sourceReset)
             self.sourceModel().rowsInserted.connect(self.__sourceRowsInserted)
             self.sourceModel().rowsRemoved.connect(self.__sourceRowsRemoved)
-        
+
         self.beginResetModel()
         self.endResetModel()
-    
+
     def __sourceReset(self):
         """
         Private slot to handle a reset of the source model.
@@ -272,11 +273,11 @@
         self.beginResetModel()
         self.__sourceRowCache = []
         self.endResetModel()
-    
+
     def __sourceRowsInserted(self, parent, start, end):
         """
         Private slot to handle the insertion of data in the source model.
-        
+
         @param parent reference to the parent index (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
@@ -287,7 +288,7 @@
                 self.__sourceRowCache = []
                 self.endResetModel()
                 return
-            
+
             self.__sourceRowCache = []
             treeIndex = self.mapFromSource(self.sourceModel().index(start, 0))
             treeParent = treeIndex.parent()
@@ -295,40 +296,39 @@
                 self.beginInsertRows(QModelIndex(), 0, 0)
                 self.endInsertRows()
             else:
-                self.beginInsertRows(treeParent, treeIndex.row(),
-                                     treeIndex.row())
+                self.beginInsertRows(treeParent, treeIndex.row(), treeIndex.row())
                 self.endInsertRows()
-    
+
     def mapFromSource(self, sourceIndex):
         """
         Public method to map an index to the proxy model index.
-        
+
         @param sourceIndex reference to a source model index (QModelIndex)
         @return proxy model index (QModelIndex)
         """
         if not sourceIndex.isValid():
             return QModelIndex()
-        
+
         if len(self.__sourceRowCache) == 0:
             self.rowCount(QModelIndex())
-        
+
         try:
             row = self.__sourceRowCache.index(sourceIndex.row())
         except ValueError:
             row = bisect.bisect_left(self.__sourceRowCache, sourceIndex.row())
         if (
-            row == len(self.__sourceRowCache) or
-            self.__sourceRowCache[row] != sourceIndex.row()
+            row == len(self.__sourceRowCache)
+            or self.__sourceRowCache[row] != sourceIndex.row()
         ):
             row -= 1
         dateRow = max(0, row)
         row = sourceIndex.row() - self.__sourceRowCache[dateRow]
         return self.createIndex(row, sourceIndex.column(), dateRow + 1)
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row row of the first entry to remove (integer)
         @param count number of entries to remove (integer)
         @param parent index of the parent entry (QModelIndex)
@@ -336,14 +336,10 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
-        if (
-            row < 0 or
-            count <= 0 or
-            row + count > self.rowCount(parent)
-        ):
+
+        if row < 0 or count <= 0 or row + count > self.rowCount(parent):
             return False
-        
+
         self.__removingDown = True
         if parent.isValid() and self.rowCount(parent) == count - row:
             self.beginRemoveRows(QModelIndex(), parent.row(), parent.row())
@@ -358,15 +354,14 @@
             for i in range(row + count - 1, row - 1, -1):
                 dateParent = self.index(i, 0)
                 offset = self.__sourceDateRow(dateParent.row())
-                if not self.sourceModel().removeRows(
-                        offset, self.rowCount(dateParent)):
+                if not self.sourceModel().removeRows(offset, self.rowCount(dateParent)):
                     return False
         return True
-    
+
     def __sourceRowsRemoved(self, parent, start, end):
         """
         Private slot to handle the removal of data in the source model.
-        
+
         @param parent reference to the parent index (QModelIndex)
         @param start start row (integer)
         @param end end row (integer)
@@ -376,7 +371,7 @@
             self.__sourceRowCache = []
             self.endResetModel()
             return
-        
+
         if not parent.isValid():
             if self.__sourceRowCache:
                 i = end
@@ -386,8 +381,8 @@
                     except ValueError:
                         ind = bisect.bisect_left(self.__sourceRowCache, i)
                     if (
-                        ind == len(self.__sourceRowCache) or
-                        self.__sourceRowCache[ind] != i
+                        ind == len(self.__sourceRowCache)
+                        or self.__sourceRowCache[ind] != i
                     ):
                         ind -= 1
                     row = max(0, ind)
@@ -404,7 +399,7 @@
                         i -= 1
                     for j in range(row, len(self.__sourceRowCache)):
                         self.__sourceRowCache[j] -= 1
-            
+
             if self.__removingDown:
                 self.endRemoveRows()
                 self.__removingDown = False
--- a/src/eric7/WebBrowser/ImageSearch/ImageSearchEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/ImageSearch/ImageSearchEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,48 +16,49 @@
     """
     Class implementing the image search engine.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__searchEngineNames = ["Google", "TinEye", "Yandex"]
-    
+
     def searchEngine(self):
         """
         Public method to get the name of the current search engine.
-        
+
         @return name of the current search engine
         @rtype str
         """
         return Preferences.getWebBrowser("ImageSearchEngine")
-    
+
     def setSearchEngine(self, searchEngine):
         """
         Public method to set the current search engine.
-        
+
         @param searchEngine name of the search engine
         @type str
         """
         Preferences.setWebBrowser("ImageSearchEngine", searchEngine)
-    
+
     def searchEngineNames(self):
         """
         Public method to get the list of supported search engines.
-        
+
         @return list of supported search engines
         @rtype list of str
         """
         return self.__searchEngineNames[:]
-    
+
     def getSearchQuery(self, imageUrl, searchEngine=None):
         """
         Public method to get the image search query URL.
-        
+
         @param imageUrl URL of the image to search for
         @type QUrl
         @param searchEngine name of the image search engine to be used
@@ -67,18 +68,21 @@
         """
         if not searchEngine:
             searchEngine = self.searchEngine()
-        
+
         searchEngine_l = searchEngine.lower()
-        if searchEngine_l == "google":              # __IGNORE_WARNING_Y116__
-            return QUrl("https://www.google.com/searchbyimage?"
-                        "site=search&image_url={0}".format(
-                            imageUrl.toString()))
+        if searchEngine_l == "google":  # __IGNORE_WARNING_Y116__
+            return QUrl(
+                "https://www.google.com/searchbyimage?"
+                "site=search&image_url={0}".format(imageUrl.toString())
+            )
         elif searchEngine_l == "yandex":
-            return QUrl("https://yandex.com/images/search?"
-                        "&img_url={0}&rpt=imageview".format(
-                            imageUrl.toString()))
+            return QUrl(
+                "https://yandex.com/images/search?"
+                "&img_url={0}&rpt=imageview".format(imageUrl.toString())
+            )
         elif searchEngine_l == "tineye":
-            return QUrl("http://www.tineye.com/search?url={0}".format(
-                imageUrl.toString()))
+            return QUrl(
+                "http://www.tineye.com/search?url={0}".format(imageUrl.toString())
+            )
         else:
             return QUrl()
--- a/src/eric7/WebBrowser/JavaScript/ExternalJsObject.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/JavaScript/ExternalJsObject.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,76 +25,77 @@
     """
     Class implementing the endpoint of our web channel.
     """
+
     extraObjects = {}
-    
+
     def __init__(self, page):
         """
         Constructor
-        
+
         @param page reference to the web page object
         @type WebBrowserPage
         """
         super().__init__(page)
-        
+
         self.__page = page
-        
+
         self.__startPage = None
         self.__passwordManager = None
-    
+
     def page(self):
         """
         Public method returning a reference to the web page object.
-        
+
         @return reference to the web page object
         @rtype WebBrowserPage
         """
         return self.__page
-    
+
     @pyqtProperty(QObject, constant=True)
     def passwordManager(self):
         """
         Public method to get a reference to the password manager JavaScript
         object.
-        
+
         @return reference to the password manager JavaScript object
         @rtype StartPageJsObject
         """
         if self.__passwordManager is None:
             self.__passwordManager = PasswordManagerJsObject(self)
-        
+
         return self.__passwordManager
-    
+
     @pyqtProperty(QObject, constant=True)
     def speedDial(self):
         """
         Public method returning a reference to a speed dial object.
-        
+
         @return reference to a speed dial object
         @rtype SpeedDial
         """
         if self.__page.url().toString() != "eric:speeddial":
             return None
-        
+
         return WebBrowserWindow.speedDial()
-    
+
     @pyqtProperty(QObject, constant=True)
     def startPage(self):
         """
         Public method to get a reference to the start page JavaScript object.
-        
+
         @return reference to the start page JavaScript object
         @rtype StartPageJsObject
         """
         if self.__startPage is None:
             self.__startPage = StartPageJsObject(self)
-        
+
         return self.__startPage
-    
+
     @classmethod
     def setupWebChannel(cls, channel, page):
         """
         Class method to setup the web channel.
-        
+
         @param channel reference to the channel
         @type QWebChannel
         @param page reference to the web page
@@ -102,26 +103,27 @@
         """
         channel.registerObject("eric_object", ExternalJsObject(page))
         for jsObject in cls.extraObjects:
-            channel.registerObject("eric_{0}".format(jsObject),
-                                   cls.extraObjects[jsObject])
-    
+            channel.registerObject(
+                "eric_{0}".format(jsObject), cls.extraObjects[jsObject]
+            )
+
     @classmethod
     def registerExtraObject(cls, name, jsObject):
         """
         Class method to register extra JavaScript objects.
-        
+
         @param name name for the object
         @type str
         @param jsObject reference to the JavaScript object to be registered
         @type QObject
         """
         cls.extraObjects[id] = jsObject
-    
+
     @classmethod
     def unregisterExtraObject(cls, name):
         """
         Class method to unregister extra JavaScript objects.
-        
+
         @param name name of the object
         @type str
         """
--- a/src/eric7/WebBrowser/JavaScript/PasswordManagerJsObject.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/JavaScript/PasswordManagerJsObject.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,22 +14,23 @@
     """
     Class implementing the Python side for calling the password manager.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type ExternalJsObject
         """
         super().__init__(parent)
-        
+
         self.__external = parent
-    
+
     @pyqtSlot(str, str, str, QByteArray)
     def formSubmitted(self, urlStr, userName, password, data):
         """
         Public slot passing form data to the password manager.
-        
+
         @param urlStr form submission URL
         @type str
         @param userName name of the user
@@ -40,5 +41,7 @@
         @type QByteArray
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.passwordManager().formSubmitted(
-            urlStr, userName, password, data, self.__external.page())
+            urlStr, userName, password, data, self.__external.page()
+        )
--- a/src/eric7/WebBrowser/JavaScript/StartPageJsObject.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/JavaScript/StartPageJsObject.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,36 +14,47 @@
     """
     Class implementing the Python side of the eric home page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type ExternalJsObject
         """
         super().__init__(parent)
-        
+
         self.__external = parent
-    
+
     @pyqtSlot(result=str)
     def providerString(self):
         """
         Public method to get a string for the search provider.
-        
+
         @return string for the search provider (string)
         """
-        return (self.tr("Search results provided by {0}")
-                .format(self.__external.page().view().mainWindow()
-                .openSearchManager().currentEngineName()))
-    
+        return self.tr("Search results provided by {0}").format(
+            self.__external.page()
+            .view()
+            .mainWindow()
+            .openSearchManager()
+            .currentEngineName()
+        )
+
     @pyqtSlot(str, result=str)
     def searchUrl(self, searchStr):
         """
         Public method to get the search URL for the given search term.
-        
+
         @param searchStr search term (string)
         @return search URL (string)
         """
         return bytes(
-            self.__external.page().view().mainWindow().openSearchManager()
-            .currentEngine().searchUrl(searchStr).toEncoded()).decode()
+            self.__external.page()
+            .view()
+            .mainWindow()
+            .openSearchManager()
+            .currentEngine()
+            .searchUrl(searchStr)
+            .toEncoded()
+        ).decode()
--- a/src/eric7/WebBrowser/Navigation/NavigationBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Navigation/NavigationBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,13 @@
 from PyQt6.QtCore import Qt, QUrl
 from PyQt6.QtGui import QAction
 from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QStyle, QToolButton, QSplitter, QSizePolicy, QMenu
+    QWidget,
+    QHBoxLayout,
+    QStyle,
+    QToolButton,
+    QSplitter,
+    QSizePolicy,
+    QMenu,
 )
 
 from EricWidgets.EricToolButton import EricToolButton
@@ -28,10 +34,11 @@
     """
     Class implementing the navigation bar.
     """
+
     def __init__(self, mainWindow, parent=None):
         """
         Constructor
-        
+
         @param mainWindow reference to the browser main window
         @type WebBrowserWindow
         @param parent reference to the parent widget
@@ -39,106 +46,102 @@
         """
         super().__init__(parent)
         self.setObjectName("navigationbar")
-        
+
         self.__mw = mainWindow
-        
+
         self.__layout = QHBoxLayout(self)
         margin = self.style().pixelMetric(
-            QStyle.PixelMetric.PM_ToolBarItemMargin, None, self)
+            QStyle.PixelMetric.PM_ToolBarItemMargin, None, self
+        )
         self.__layout.setContentsMargins(margin, margin, margin, margin)
         self.__layout.setSpacing(
             self.style().pixelMetric(
-                QStyle.PixelMetric.PM_ToolBarItemSpacing, None, self))
+                QStyle.PixelMetric.PM_ToolBarItemSpacing, None, self
+            )
+        )
         self.setLayout(self.__layout)
-        
+
         self.__backButton = EricToolButton(self)
         self.__backButton.setObjectName("navigation_back_button")
         self.__backButton.setToolTip(self.tr("Move one screen backward"))
-        self.__backButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__backButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.__backButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.__backButton.setAutoRaise(True)
-        self.__backButton.setIcon(
-            UI.PixmapCache.getIcon("back"))
+        self.__backButton.setIcon(UI.PixmapCache.getIcon("back"))
         self.__backButton.setEnabled(False)
-        
+
         self.__forwardButton = EricToolButton(self)
         self.__forwardButton.setObjectName("navigation_forward_button")
         self.__forwardButton.setToolTip(self.tr("Move one screen forward"))
-        self.__forwardButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__forwardButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.__forwardButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.__forwardButton.setAutoRaise(True)
-        self.__forwardButton.setIcon(
-            UI.PixmapCache.getIcon("forward"))
+        self.__forwardButton.setIcon(UI.PixmapCache.getIcon("forward"))
         self.__forwardButton.setEnabled(False)
-        
+
         self.__backNextLayout = QHBoxLayout()
         self.__backNextLayout.setContentsMargins(0, 0, 0, 0)
         self.__backNextLayout.setSpacing(0)
         self.__backNextLayout.addWidget(self.__backButton)
         self.__backNextLayout.addWidget(self.__forwardButton)
-        
+
         self.__reloadStopButton = ReloadStopButton(self)
-        
+
         self.__homeButton = EricToolButton(self)
         self.__homeButton.setObjectName("navigation_home_button")
         self.__homeButton.setToolTip(self.tr("Move to the initial screen"))
-        self.__homeButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+        self.__homeButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.__homeButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.__homeButton.setAutoRaise(True)
-        self.__homeButton.setIcon(
-            UI.PixmapCache.getIcon("home"))
-        
+        self.__homeButton.setIcon(UI.PixmapCache.getIcon("home"))
+
         self.__exitFullScreenButton = EricToolButton(self)
-        self.__exitFullScreenButton.setObjectName(
-            "navigation_exitfullscreen_button")
-        self.__exitFullScreenButton.setIcon(
-            UI.PixmapCache.getIcon("windowRestore"))
+        self.__exitFullScreenButton.setObjectName("navigation_exitfullscreen_button")
+        self.__exitFullScreenButton.setIcon(UI.PixmapCache.getIcon("windowRestore"))
         self.__exitFullScreenButton.setToolTip(self.tr("Exit Fullscreen"))
         self.__exitFullScreenButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+            Qt.ToolButtonStyle.ToolButtonIconOnly
+        )
         self.__exitFullScreenButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.__exitFullScreenButton.setAutoRaise(True)
         self.__exitFullScreenButton.clicked.connect(self.__mw.toggleFullScreen)
         self.__exitFullScreenButton.setVisible(False)
-        
+
         self.__downloadManagerButton = DownloadManagerButton(self)
-        
+
         self.__superMenuButton = EricToolButton(self)
-        self.__superMenuButton.setObjectName(
-            "navigation_supermenu_button")
+        self.__superMenuButton.setObjectName("navigation_supermenu_button")
         self.__superMenuButton.setIcon(UI.PixmapCache.getIcon("superMenu"))
         self.__superMenuButton.setToolTip(self.tr("Main Menu"))
         self.__superMenuButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
-        self.__superMenuButton.setToolButtonStyle(
-            Qt.ToolButtonStyle.ToolButtonIconOnly)
+            QToolButton.ToolButtonPopupMode.InstantPopup
+        )
+        self.__superMenuButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.__superMenuButton.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.__superMenuButton.setAutoRaise(True)
         self.__superMenuButton.setShowMenuInside(True)
-        
+
         self.__navigationSplitter = QSplitter(self)
         urlBar = self.__mw.tabWidget().stackedUrlBar()
         self.__navigationSplitter.addWidget(urlBar)
-        
-        from WebBrowser.WebBrowserWebSearchWidget import (
-            WebBrowserWebSearchWidget
+
+        from WebBrowser.WebBrowserWebSearchWidget import WebBrowserWebSearchWidget
+
+        self.__searchEdit = WebBrowserWebSearchWidget(self.__mw, self)
+        sizePolicy = QSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
         )
-        self.__searchEdit = WebBrowserWebSearchWidget(self.__mw, self)
-        sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding,
-                                 QSizePolicy.Policy.Preferred)
         sizePolicy.setHorizontalStretch(2)
         sizePolicy.setVerticalStretch(0)
         self.__searchEdit.setSizePolicy(sizePolicy)
         self.__searchEdit.search.connect(self.__mw.openUrl)
         self.__navigationSplitter.addWidget(self.__searchEdit)
-        
+
         self.__navigationSplitter.setSizePolicy(
-            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Maximum)
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Maximum
+        )
         self.__navigationSplitter.setCollapsible(0, False)
-        
+
         self.__layout.addLayout(self.__backNextLayout)
         self.__layout.addWidget(self.__reloadStopButton)
         self.__layout.addWidget(self.__homeButton)
@@ -146,21 +149,20 @@
         self.__layout.addWidget(self.__downloadManagerButton)
         self.__layout.addWidget(self.__exitFullScreenButton)
         self.__layout.addWidget(self.__superMenuButton)
-        
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__contextMenuRequested)
-        
+
         self.__backMenu = QMenu(self)
         self.__backMenu.triggered.connect(self.__navigationMenuActionTriggered)
         self.__backButton.setMenu(self.__backMenu)
         self.__backButton.aboutToShowMenu.connect(self.__showBackMenu)
-        
+
         self.__forwardMenu = QMenu(self)
-        self.__forwardMenu.triggered.connect(
-            self.__navigationMenuActionTriggered)
+        self.__forwardMenu.triggered.connect(self.__navigationMenuActionTriggered)
         self.__forwardButton.setMenu(self.__forwardMenu)
         self.__forwardButton.aboutToShowMenu.connect(self.__showForwardMenu)
-        
+
         self.__backButton.clicked.connect(self.__goBack)
         self.__backButton.middleClicked.connect(self.__goBackInNewTab)
         self.__backButton.controlClicked.connect(self.__goBackInNewTab)
@@ -172,61 +174,61 @@
         self.__homeButton.clicked.connect(self.__goHome)
         self.__homeButton.middleClicked.connect(self.__goHomeInNewTab)
         self.__homeButton.controlClicked.connect(self.__goHomeInNewTab)
-    
+
     def superMenuButton(self):
         """
         Public method to get a reference to the super menu button.
-        
+
         @return reference to the super menu button
         @rtype QToolButton
         """
         return self.__superMenuButton
-    
+
     def backButton(self):
         """
         Public method to get a reference to the back button.
-        
+
         @return reference to the back button
         @rtype QToolButton
         """
         return self.__backButton
-    
+
     def forwardButton(self):
         """
         Public method to get a reference to the forward button.
-        
+
         @return reference to the forward button
         @rtype QToolButton
         """
         return self.__forwardButton
-    
+
     def reloadStopButton(self):
         """
         Public method to get a reference to the reload/stop button.
-        
+
         @return reference to the reload/stop button
         @rtype QToolButton
         """
         return self.__reloadStopButton
-    
+
     def exitFullScreenButton(self):
         """
         Public method to get a reference to the exit full screen button.
-        
+
         @return reference to the exit full screen button
         @rtype QToolButton
         """
         return self.__exitFullScreenButton
-    
+
     def searchEdit(self):
         """
         Public method to get a reference to the web search edit.
-        
+
         @return reference to the web search edit
         @rtype WebBrowserWebSearchWidget
         """
         return self.__searchEdit
-    
+
     def __showBackMenu(self):
         """
         Private slot showing the backwards navigation menu.
@@ -235,7 +237,7 @@
         history = self.__mw.currentBrowser().history()
         backItems = history.backItems(20)
         # show max. 20 items
-        
+
         for item in reversed(backItems):
             act = QAction(self)
             act.setData(item)
@@ -243,11 +245,10 @@
             act.setIcon(icon)
             act.setText(item.title())
             self.__backMenu.addAction(act)
-        
+
         self.__backMenu.addSeparator()
-        self.__backMenu.addAction(self.tr("Clear History"),
-                                  self.__clearHistory)
-    
+        self.__backMenu.addAction(self.tr("Clear History"), self.__clearHistory)
+
     def __showForwardMenu(self):
         """
         Private slot showing the forwards navigation menu.
@@ -256,7 +257,7 @@
         history = self.__mw.currentBrowser().history()
         forwardItems = history.forwardItems(20)
         # show max. 20 items
-        
+
         for item in forwardItems:
             act = QAction(self)
             act.setData(item)
@@ -264,15 +265,14 @@
             act.setIcon(icon)
             act.setText(item.title())
             self.__forwardMenu.addAction(act)
-        
+
         self.__forwardMenu.addSeparator()
-        self.__forwardMenu.addAction(self.tr("Clear History"),
-                                     self.__clearHistory)
-    
+        self.__forwardMenu.addAction(self.tr("Clear History"), self.__clearHistory)
+
     def __navigationMenuActionTriggered(self, act):
         """
         Private slot to go to the selected page.
-        
+
         @param act reference to the action selected in the navigation menu
             (QAction)
         """
@@ -280,13 +280,13 @@
         if historyItem is not None:
             history = self.__mw.currentBrowser().history()
             history.goToItem(historyItem)
-    
+
     def __goBack(self):
         """
         Private slot called to handle the backward button.
         """
         self.__mw.currentBrowser().backward()
-    
+
     def __goBackInNewTab(self):
         """
         Private slot handling a middle click or Ctrl left click of the
@@ -295,16 +295,18 @@
         history = self.__mw.currentBrowser().history()
         if history.canGoBack():
             backItem = history.backItem()
-            self.__mw.newTab(link=backItem.url(),
-                             addNextTo=self.__mw.currentBrowser(),
-                             background=True)
-    
+            self.__mw.newTab(
+                link=backItem.url(),
+                addNextTo=self.__mw.currentBrowser(),
+                background=True,
+            )
+
     def __goForward(self):
         """
         Private slot called to handle the forward button.
         """
         self.__mw.currentBrowser().forward()
-    
+
     def __goForwardInNewTab(self):
         """
         Private slot handling a middle click or Ctrl left click of the
@@ -313,38 +315,40 @@
         history = self.__mw.currentBrowser().history()
         if history.canGoForward():
             forwardItem = history.forwardItem()
-            self.__mw.newTab(link=forwardItem.url(),
-                             addNextTo=self.__mw.currentBrowser(),
-                             background=True)
-    
+            self.__mw.newTab(
+                link=forwardItem.url(),
+                addNextTo=self.__mw.currentBrowser(),
+                background=True,
+            )
+
     def __goHome(self):
         """
         Private slot called to handle the home button.
         """
         self.__mw.currentBrowser().home()
-    
+
     def __goHomeInNewTab(self):
         """
         Private slot handling a middle click or Ctrl left click of the
         home button.
         """
         homeUrl = QUrl(Preferences.getWebBrowser("HomePage"))
-        self.__mw.newTab(link=homeUrl,
-                         addNextTo=self.__mw.currentBrowser(),
-                         background=True)
-    
+        self.__mw.newTab(
+            link=homeUrl, addNextTo=self.__mw.currentBrowser(), background=True
+        )
+
     def __reload(self):
         """
         Private slot called to handle the reload button.
         """
         self.__mw.currentBrowser().reloadBypassingCache()
-    
+
     def __stopLoad(self):
         """
         Private slot called to handle loading of the current page.
         """
         self.__mw.currentBrowser().stop()
-    
+
     def __clearHistory(self):
         """
         Private slot to clear the history of the current web browser tab.
@@ -354,11 +358,11 @@
             cb.history().clear()
             self.__mw.setForwardAvailable(cb.isForwardAvailable())
             self.__mw.setBackwardAvailable(cb.isBackwardAvailable())
-    
+
     def __contextMenuRequested(self, pos):
         """
         Private method to handle a context menu request.
-        
+
         @param pos position of the request
         @type QPoint
         """
--- a/src/eric7/WebBrowser/Navigation/NavigationContainer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Navigation/NavigationContainer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,28 +14,28 @@
     """
     Class implementing the navigation container widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setObjectName("navigationcontainer")
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__layout.setSpacing(0)
-        
+
         self.setLayout(self.__layout)
-        self.setSizePolicy(QSizePolicy.Policy.Preferred,
-                           QSizePolicy.Policy.Maximum)
-    
+        self.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum)
+
     def addWidget(self, widget):
         """
         Public method to add a widget to the container.
-        
+
         @param widget reference to the widget to be added
         @type QWidget
         """
--- a/src/eric7/WebBrowser/Navigation/ReloadStopButton.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Navigation/ReloadStopButton.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,33 +17,34 @@
 class ReloadStopButton(EricToolButton):
     """
     Class implementing a button alternating between reload and stop.
-    
+
     @signal reloadClicked() emitted to initiate a reload action
     @signal stopClicked() emitted to initiate a stop action
     """
+
     reloadClicked = pyqtSignal()
     stopClicked = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setObjectName("navigation_reloadstop_button")
         self.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.setAutoRaise(True)
-        
+
         self.__loading = False
-        
+
         self.clicked.connect(self.__buttonClicked)
-        
+
         self.__updateButton()
-    
+
     @pyqtSlot()
     def __buttonClicked(self):
         """
@@ -53,7 +54,7 @@
             self.stopClicked.emit()
         else:
             self.reloadClicked.emit()
-    
+
     @pyqtSlot()
     def __updateButton(self):
         """
@@ -65,11 +66,11 @@
         else:
             self.setIcon(UI.PixmapCache.getIcon("reload"))
             self.setToolTip(self.tr("Reload the current screen"))
-    
+
     def setLoading(self, loading):
         """
         Public method to set the loading state.
-        
+
         @param loading flag indicating the new loading state
         @type bool
         """
--- a/src/eric7/WebBrowser/Network/EricSchemeHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/EricSchemeHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,14 +14,14 @@
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
 
-from ..Tools.WebBrowserTools import (
-    getHtmlPage, getJavascript, pixmapFileToDataUrl
-)
+from ..Tools.WebBrowserTools import getHtmlPage, getJavascript, pixmapFileToDataUrl
 
 _SupportedPages = [
-    "adblock",                      # error page for URLs blocked by AdBlock
-    "home", "start", "startpage",   # eric home page
-    "speeddial",                    # eric speeddial
+    "adblock",  # error page for URLs blocked by AdBlock
+    "home",
+    "start",
+    "startpage",  # eric home page
+    "speeddial",  # eric speeddial
 ]
 
 
@@ -29,21 +29,22 @@
     """
     Class implementing a scheme handler for the eric: scheme.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__replies = []
-    
+
     def requestStarted(self, job):
         """
         Public method handling the URL request.
-        
+
         @param job URL request job
         @type QWebEngineUrlRequestJob
         """
@@ -51,11 +52,11 @@
         reply.closed.connect(lambda: self.__replyClosed(reply))
         self.__replies.append(reply)
         job.reply(b"text/html", reply)
-    
+
     def __replyClosed(self, reply):
         """
         Private slot handling the closed signal of a reply.
-        
+
         @param reply reference to the network reply
         @type EricSchemeReply
         """
@@ -66,41 +67,42 @@
 class EricSchemeReply(QIODevice):
     """
     Class implementing a reply for a requested eric: page.
-    
+
     @signal closed emitted to signal that the web engine has read
         the data
     """
+
     closed = pyqtSignal()
-    
+
     _speedDialPage = ""
-    
+
     def __init__(self, job, parent=None):
         """
         Constructor
-        
+
         @param job reference to the URL request
         @type QWebEngineUrlRequestJob
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__job = job
         self.__mutex = QMutex()
-        
+
         self.__pageName = self.__job.requestUrl().path()
         self.__buffer = QBuffer()
-        
+
         self.__loadPage()
-    
+
     def __loadPage(self):
         """
         Private method to load the requested page.
         """
         if self.__loaded:
             return
-        
+
         with EricMutexLocker(self.__mutex):
             if self.__pageName == "adblock":
                 contents = self.__adBlockPage()
@@ -110,46 +112,46 @@
                 contents = self.__speedDialPage()
             else:
                 contents = self.__errorPage()
-            
+
             self.__buffer.setData(contents.encode("utf-8"))
             self.__buffer.open(QIODevice.OpenModeFlag.ReadOnly)
             self.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         self.readyRead.emit()
-        
+
         self.__loaded = True
-    
+
     def bytesAvailable(self):
         """
         Public method to get the number of available bytes.
-        
+
         @return number of available bytes
         @rtype int
         """
         with EricMutexLocker(self.__mutex):
             return self.__buffer.bytesAvailable()
-    
+
     def readData(self, maxlen):
         """
         Public method to retrieve data from the reply object.
-        
+
         @param maxlen maximum number of bytes to read (integer)
         @return string containing the data (bytes)
         """
         with EricMutexLocker(self.__mutex):
             return self.__buffer.read(maxlen)
-    
+
     def close(self):
         """
         Public method used to cloase the reply.
         """
         super().close()
         self.closed.emit()
-    
+
     def __adBlockPage(self):
         """
         Private method to build the AdBlock page.
-        
+
         @return built AdBlock page
         @rtype str
         """
@@ -157,100 +159,94 @@
         rule = query.queryItemValue("rule")
         subscription = query.queryItemValue("subscription")
         title = self.tr("Content blocked by AdBlock Plus")
-        message = self.tr(
-            "Blocked by rule: <i>{0} ({1})</i>").format(rule, subscription)
-        
+        message = self.tr("Blocked by rule: <i>{0} ({1})</i>").format(
+            rule, subscription
+        )
+
         page = getHtmlPage("adblockPage.html")
-        page = page.replace(
-            "@FAVICON@", pixmapFileToDataUrl("adBlockPlus16.png", True))
-        page = page.replace(
-            "@IMAGE@", pixmapFileToDataUrl("adBlockPlus64.png", True))
+        page = page.replace("@FAVICON@", pixmapFileToDataUrl("adBlockPlus16.png", True))
+        page = page.replace("@IMAGE@", pixmapFileToDataUrl("adBlockPlus64.png", True))
         page = page.replace("@TITLE@", title)
         page = page.replace("@MESSAGE@", message)
-        
+
         return page
-    
+
     def __errorPage(self):
         """
         Private method to build the Error page.
-        
+
         @return built Error page
         @rtype str
         """
         page = getHtmlPage("ericErrorPage.html")
-        page = page.replace(
-            "@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
+        page = page.replace("@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
+        page = page.replace("@IMAGE@", pixmapFileToDataUrl("ericWeb32.png", True))
+        page = page.replace("@TITLE@", self.tr("Error accessing eric: URL"))
         page = page.replace(
-            "@IMAGE@", pixmapFileToDataUrl("ericWeb32.png", True))
-        page = page.replace(
-            "@TITLE@", self.tr("Error accessing eric: URL"))
-        page = page.replace(
-            "@MESSAGE@", self.tr(
+            "@MESSAGE@",
+            self.tr(
                 "The special URL <strong>{0}</strong> is not supported."
                 " Please use one of these."
-            ).format(self.__job.requestUrl().toDisplayString())
+            ).format(self.__job.requestUrl().toDisplayString()),
         )
         page = page.replace(
-            "@ERICLIST@", "<br/>".join([
-                '<a href="eric:{0}">{0}</a>'.format(u)
-                for u in sorted(_SupportedPages)
-            ])
+            "@ERICLIST@",
+            "<br/>".join(
+                [
+                    '<a href="eric:{0}">{0}</a>'.format(u)
+                    for u in sorted(_SupportedPages)
+                ]
+            ),
         )
-        
+
         return page
-    
+
     def __startPage(self):
         """
         Private method to build the Start page.
-        
+
         @return built Start page
         @rtype str
         """
         page = getHtmlPage("startPage.html")
-        page = page.replace(
-            "@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
-        page = page.replace(
-            "@IMAGE@", pixmapFileToDataUrl("ericWeb32.png", True))
-        page = page.replace(
-            "@TITLE@", self.tr("Welcome to eric Web Browser!"))
+        page = page.replace("@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
+        page = page.replace("@IMAGE@", pixmapFileToDataUrl("ericWeb32.png", True))
+        page = page.replace("@TITLE@", self.tr("Welcome to eric Web Browser!"))
         page = page.replace("@ERIC_LINK@", self.tr("About eric"))
         page = page.replace("@HEADER_TITLE@", self.tr("eric Web Browser"))
         page = page.replace("@SUBMIT@", self.tr("Search!"))
-        ltr = "LTR" if ericApp().isLeftToRight() else"RTL"
+        ltr = "LTR" if ericApp().isLeftToRight() else "RTL"
         page = page.replace("@QT_LAYOUT_DIRECTION@", ltr)
-        
+
         return page
-    
+
     def __speedDialPage(self):
         """
         Private method to create the Speeddial page.
-        
+
         @return prepared speeddial page
         @rtype str
         """
         if not self._speedDialPage:
             page = getHtmlPage("speeddialPage.html")
-            page = page.replace(
-                "@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
-            page = page.replace(
-                "@IMG_PLUS@", pixmapFileToDataUrl("plus.png", True))
-            page = page.replace(
-                "@IMG_CLOSE@", pixmapFileToDataUrl("close.png", True))
-            page = page.replace(
-                "@IMG_EDIT@", pixmapFileToDataUrl("edit.png", True))
+            page = page.replace("@FAVICON@", pixmapFileToDataUrl("ericWeb16.png", True))
+            page = page.replace("@IMG_PLUS@", pixmapFileToDataUrl("plus.png", True))
+            page = page.replace("@IMG_CLOSE@", pixmapFileToDataUrl("close.png", True))
+            page = page.replace("@IMG_EDIT@", pixmapFileToDataUrl("edit.png", True))
+            page = page.replace("@IMG_RELOAD@", pixmapFileToDataUrl("reload.png", True))
             page = page.replace(
-                "@IMG_RELOAD@", pixmapFileToDataUrl("reload.png", True))
-            page = page.replace(
-                "@IMG_SETTINGS@", pixmapFileToDataUrl("setting.png", True))
+                "@IMG_SETTINGS@", pixmapFileToDataUrl("setting.png", True)
+            )
             page = page.replace(
-                "@LOADING-IMG@", pixmapFileToDataUrl("loading.gif", True))
+                "@LOADING-IMG@", pixmapFileToDataUrl("loading.gif", True)
+            )
             page = page.replace(
-                "@BOX-BORDER@",
-                pixmapFileToDataUrl("box-border-small.png", True))
-            
+                "@BOX-BORDER@", pixmapFileToDataUrl("box-border-small.png", True)
+            )
+
             page = page.replace("@JQUERY@", getJavascript("jquery.js"))
             page = page.replace("@JQUERY-UI@", getJavascript("jquery-ui.js"))
-            
+
             page = page.replace("@SITE-TITLE@", self.tr("Speed Dial"))
             page = page.replace("@URL@", self.tr("URL"))
             page = page.replace("@TITLE@", self.tr("Title"))
@@ -260,34 +256,32 @@
             page = page.replace("@TITLE-EDIT@", self.tr("Edit"))
             page = page.replace("@TITLE-REMOVE@", self.tr("Remove"))
             page = page.replace("@TITLE-RELOAD@", self.tr("Reload"))
-            page = page.replace("@TITLE-WARN@",
-                                self.tr("Are you sure to remove this"
-                                        " speed dial?"))
-            page = page.replace("@TITLE-WARN-REL@",
-                                self.tr("Are you sure you want to reload"
-                                        " all speed dials?"))
-            page = page.replace("@TITLE-FETCHTITLE@",
-                                self.tr("Load title from page"))
-            page = page.replace("@SETTINGS-TITLE@",
-                                self.tr("Speed Dial Settings"))
+            page = page.replace(
+                "@TITLE-WARN@", self.tr("Are you sure to remove this" " speed dial?")
+            )
+            page = page.replace(
+                "@TITLE-WARN-REL@",
+                self.tr("Are you sure you want to reload" " all speed dials?"),
+            )
+            page = page.replace("@TITLE-FETCHTITLE@", self.tr("Load title from page"))
+            page = page.replace("@SETTINGS-TITLE@", self.tr("Speed Dial Settings"))
             page = page.replace("@ADD-TITLE@", self.tr("Add New Page"))
-            page = page.replace("@TXT_NRROWS@",
-                                self.tr("Maximum pages in a row:"))
-            page = page.replace("@TXT_SDSIZE@",
-                                self.tr("Change size of pages:"))
-            page = page.replace("@JAVASCRIPT_DISABLED@",
-                                self.tr("SpeedDial requires enabled"
-                                        " JavaScript."))
-            
+            page = page.replace("@TXT_NRROWS@", self.tr("Maximum pages in a row:"))
+            page = page.replace("@TXT_SDSIZE@", self.tr("Change size of pages:"))
+            page = page.replace(
+                "@JAVASCRIPT_DISABLED@",
+                self.tr("SpeedDial requires enabled" " JavaScript."),
+            )
+
             self._speedDialPage = page
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         dial = WebBrowserWindow.speedDial()
         page = (
-            self._speedDialPage
-            .replace("@INITIAL-SCRIPT@", dial.initialScript())
+            self._speedDialPage.replace("@INITIAL-SCRIPT@", dial.initialScript())
             .replace("@ROW-PAGES@", str(dial.pagesInRow()))
             .replace("@SD-SIZE@", str(dial.sdSize()))
         )
-        
+
         return page
--- a/src/eric7/WebBrowser/Network/NetworkManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/NetworkManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,15 +13,20 @@
 from PyQt6.QtCore import pyqtSignal, QByteArray
 from PyQt6.QtWidgets import QStyle, QDialog
 from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkProxy, QNetworkProxyFactory, QNetworkRequest
+    QNetworkAccessManager,
+    QNetworkProxy,
+    QNetworkProxyFactory,
+    QNetworkRequest,
 )
 
 from EricWidgets import EricMessageBox
 from EricWidgets.EricApplication import ericApp
 
 from EricNetwork.EricNetworkProxyFactory import proxyAuthenticationRequired
+
 try:
     from EricNetwork.EricSslErrorHandler import EricSslErrorHandler
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -37,94 +42,99 @@
 class NetworkManager(QNetworkAccessManager):
     """
     Class implementing a network manager.
-    
+
     @signal changed() emitted to indicate a change
     """
+
     changed = pyqtSignal()
-    
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine (QHelpEngine)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         from EricNetwork.EricNetworkProxyFactory import EricNetworkProxyFactory
-        
+
         self.__proxyFactory = EricNetworkProxyFactory()
         if Preferences.getUI("UseSystemProxy"):
             QNetworkProxyFactory.setUseSystemConfiguration(True)
         else:
-            QNetworkProxyFactory.setApplicationProxyFactory(
-                self.__proxyFactory)
+            QNetworkProxyFactory.setApplicationProxyFactory(self.__proxyFactory)
             QNetworkProxyFactory.setUseSystemConfiguration(False)
-        
+
         self.languagesChanged()
-        
+
         if SSL_AVAILABLE:
             self.__sslErrorHandler = EricSslErrorHandler(self)
             self.sslErrors.connect(self.__sslErrorHandlingSlot)
-        
+
         self.__temporarilyIgnoredSslErrors = {}
         self.__permanentlyIgnoredSslErrors = {}
         # dictionaries of permanently and temporarily ignored SSL errors
-        
+
         self.__insecureHosts = set()
-        
+
         self.__loaded = False
         self.__saveTimer = AutoSaver(self, self.__save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
         self.proxyAuthenticationRequired.connect(proxyAuthenticationRequired)
         self.authenticationRequired.connect(
-            lambda reply, auth: self.authentication(reply.url(), auth))
-        
+            lambda reply, auth: self.authentication(reply.url(), auth)
+        )
+
         from .EricSchemeHandler import EricSchemeHandler
+
         self.__ericSchemeHandler = EricSchemeHandler()
         WebBrowserWindow.webProfile().installUrlSchemeHandler(
-            QByteArray(b"eric"), self.__ericSchemeHandler)
-        
+            QByteArray(b"eric"), self.__ericSchemeHandler
+        )
+
         if engine:
             from .QtHelpSchemeHandler import QtHelpSchemeHandler
+
             self.__qtHelpSchemeHandler = QtHelpSchemeHandler(engine)
             WebBrowserWindow.webProfile().installUrlSchemeHandler(
-                QByteArray(b"qthelp"), self.__qtHelpSchemeHandler)
-        
+                QByteArray(b"qthelp"), self.__qtHelpSchemeHandler
+            )
+
         self.__interceptor = NetworkUrlInterceptor(self)
-        WebBrowserWindow.webProfile().setUrlRequestInterceptor(
-            self.__interceptor)
-        
+        WebBrowserWindow.webProfile().setUrlRequestInterceptor(self.__interceptor)
+
         WebBrowserWindow.cookieJar()
-    
+
     def __save(self):
         """
         Private slot to save the permanent SSL error exceptions.
         """
         if not self.__loaded:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.isPrivate():
             dbString = json.dumps(self.__permanentlyIgnoredSslErrors)
             Preferences.setWebBrowser("SslExceptionsDB", dbString)
-    
+
     def __load(self):
         """
         Private method to load the permanent SSL error exceptions.
         """
         if self.__loaded:
             return
-        
+
         dbString = Preferences.getWebBrowser("SslExceptionsDB")
         if dbString:
             with contextlib.suppress(ValueError):
                 db = json.loads(dbString)
                 self.__permanentlyIgnoredSslErrors = db
-        
+
         self.__loaded = True
-    
+
     def shutdown(self):
         """
         Public method to shut down the network manager.
@@ -133,36 +143,37 @@
         self.__loaded = False
         self.__temporarilyIgnoredSslErrors = {}
         self.__permanentlyIgnoredSslErrors = {}
-        
+
         # set proxy factory to None to avoid crashes
         QNetworkProxyFactory.setApplicationProxyFactory(None)
-    
+
     def showSslErrorExceptionsDialog(self):
         """
         Public method to show the SSL error exceptions dialog.
         """
         self.__load()
-        
+
         from .SslErrorExceptionsDialog import SslErrorExceptionsDialog
+
         dlg = SslErrorExceptionsDialog(self.__permanentlyIgnoredSslErrors)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__permanentlyIgnoredSslErrors = dlg.getSslErrorExceptions()
             self.changed.emit()
-    
+
     def clearSslExceptions(self):
         """
         Public method to clear the permanent SSL certificate error exceptions.
         """
         self.__load()
-        
+
         self.__permanentlyIgnoredSslErrors = {}
         self.changed.emit()
         self.__saveTimer.saveIfNeccessary()
-    
+
     def certificateError(self, error, view):
         """
         Public method to handle SSL certificate errors.
-        
+
         @param error object containing the certificate error information
         @type QWebEngineCertificateError
         @param view reference to a view to be used as parent for the dialog
@@ -172,40 +183,45 @@
         """
         if Preferences.getWebBrowser("AlwaysRejectFaultyCertificates"):
             return False
-        
+
         self.__load()
-        
+
         host = error.url().host()
-        
+
         self.__insecureHosts.add(host)
-        
+
         if (
-            host in self.__temporarilyIgnoredSslErrors and
-            error.error() in self.__temporarilyIgnoredSslErrors[host]
+            host in self.__temporarilyIgnoredSslErrors
+            and error.error() in self.__temporarilyIgnoredSslErrors[host]
         ):
             return True
-        
+
         if (
-            host in self.__permanentlyIgnoredSslErrors and
-            error.error() in self.__permanentlyIgnoredSslErrors[host]
+            host in self.__permanentlyIgnoredSslErrors
+            and error.error() in self.__permanentlyIgnoredSslErrors[host]
         ):
             return True
-        
+
         title = self.tr("SSL Certificate Error")
         msgBox = EricMessageBox.EricMessageBox(
             EricMessageBox.Warning,
             title,
-            self.tr("""<b>{0}</b>"""
-                    """<p>The host <b>{1}</b> you are trying to access has"""
-                    """ errors in the SSL certificate.</p>"""
-                    """<ul><li>{2}</li></ul>"""
-                    """<p>Would you like to make an exception?</p>""")
-            .format(title, host, error.errorDescription()),
-            modal=True, parent=view)
-        permButton = msgBox.addButton(self.tr("&Permanent accept"),
-                                      EricMessageBox.AcceptRole)
-        tempButton = msgBox.addButton(self.tr("&Temporary accept"),
-                                      EricMessageBox.AcceptRole)
+            self.tr(
+                """<b>{0}</b>"""
+                """<p>The host <b>{1}</b> you are trying to access has"""
+                """ errors in the SSL certificate.</p>"""
+                """<ul><li>{2}</li></ul>"""
+                """<p>Would you like to make an exception?</p>"""
+            ).format(title, host, error.errorDescription()),
+            modal=True,
+            parent=view,
+        )
+        permButton = msgBox.addButton(
+            self.tr("&Permanent accept"), EricMessageBox.AcceptRole
+        )
+        tempButton = msgBox.addButton(
+            self.tr("&Temporary accept"), EricMessageBox.AcceptRole
+        )
         msgBox.addButton(self.tr("&Reject"), EricMessageBox.RejectRole)
         msgBox.exec()
         if msgBox.clickedButton() == permButton:
@@ -221,11 +237,11 @@
             return True
         else:
             return False
-    
+
     def __sslErrorHandlingSlot(self, reply, errors):
         """
         Private slot to handle SSL errors for a network reply.
-        
+
         @param reply reference to the reply object
         @type QNetworkReply
         @param errors list of SSL errors
@@ -233,33 +249,33 @@
         """
         if Preferences.getWebBrowser("AlwaysRejectFaultyCertificates"):
             return
-        
+
         self.__load()
-        
+
         host = reply.url().host()
         if (
-            host in self.__permanentlyIgnoredSslErrors or
-            host in self.__temporarilyIgnoredSslErrors
+            host in self.__permanentlyIgnoredSslErrors
+            or host in self.__temporarilyIgnoredSslErrors
         ):
             reply.ignoreSslErrors()
         else:
             self.__sslErrorHandler.sslErrorsReply(reply, errors)
-    
+
     def isInsecureHost(self, host):
         """
         Public method to check a host against the list of insecure hosts.
-        
+
         @param host name of the host to be checked
         @type str
         @return flag indicating an insecure host
         @rtype bool
         """
         return host in self.__insecureHosts
-    
+
     def authentication(self, url, auth, page=None):
         """
         Public slot to handle an authentication request.
-        
+
         @param url URL requesting authentication
         @type QUrl
         @param auth reference to the authenticator object
@@ -267,30 +283,33 @@
         @param page reference to the web page
         @type QWebEnginePage or None
         """
-        urlRoot = (
-            "{0}://{1}".format(url.scheme(), url.authority())
-        )
+        urlRoot = "{0}://{1}".format(url.scheme(), url.authority())
         realm = auth.realm()
-        if not realm and 'realm' in auth.options():
+        if not realm and "realm" in auth.options():
             realm = auth.option("realm")
         info = (
-            self.tr("<b>Enter username and password for '{0}', realm '{1}'</b>"
-                    ).format(urlRoot, realm)
-            if realm else
-            self.tr("<b>Enter username and password for '{0}'</b>"
-                    ).format(urlRoot)
+            self.tr("<b>Enter username and password for '{0}', realm '{1}'</b>").format(
+                urlRoot, realm
+            )
+            if realm
+            else self.tr("<b>Enter username and password for '{0}'</b>").format(urlRoot)
         )
-        
+
         from UI.AuthenticationDialog import AuthenticationDialog
         import WebBrowser.WebBrowserWindow
-        
-        dlg = AuthenticationDialog(info, auth.user(),
-                                   Preferences.getUser("SavePasswords"),
-                                   Preferences.getUser("SavePasswords"))
+
+        dlg = AuthenticationDialog(
+            info,
+            auth.user(),
+            Preferences.getUser("SavePasswords"),
+            Preferences.getUser("SavePasswords"),
+        )
         if Preferences.getUser("SavePasswords"):
-            username, password = (
-                WebBrowser.WebBrowserWindow.WebBrowserWindow
-                .passwordManager().getLogin(url, realm)
+            (
+                username,
+                password,
+            ) = WebBrowser.WebBrowserWindow.WebBrowserWindow.passwordManager().getLogin(
+                url, realm
             )
             if username:
                 dlg.setData(username, password)
@@ -299,47 +318,50 @@
             auth.setUser(username)
             auth.setPassword(password)
             if Preferences.getUser("SavePasswords") and dlg.shallSave():
-                (
-                    WebBrowser.WebBrowserWindow.WebBrowserWindow
-                    .passwordManager().setLogin(
-                        url, realm, username, password)
-                )
+                pm = WebBrowser.WebBrowserWindow.WebBrowserWindow.passwordManager()
+                pm.setLogin(url, realm, username, password)
         else:
             if page is not None:
                 self.__showAuthenticationErrorPage(page, url)
-    
+
     def __showAuthenticationErrorPage(self, page, url):
         """
         Private method to show an authentication error page.
-        
+
         @param page reference to the page
         @type QWebEnginePage
         @param url reference to the URL requesting authentication
         @type QUrl
         """
         html = getHtmlPage("authenticationErrorPage.html")
-        html = html.replace("@IMAGE@", pixmapToDataUrl(
-            ericApp().style().standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxCritical).pixmap(48, 48)
-        ).toString())
-        html = html.replace("@FAVICON@", pixmapToDataUrl(
-            ericApp().style() .standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxCritical).pixmap(16, 16)
-        ).toString())
+        html = html.replace(
+            "@IMAGE@",
+            pixmapToDataUrl(
+                ericApp()
+                .style()
+                .standardIcon(QStyle.StandardPixmap.SP_MessageBoxCritical)
+                .pixmap(48, 48)
+            ).toString(),
+        )
+        html = html.replace(
+            "@FAVICON@",
+            pixmapToDataUrl(
+                ericApp()
+                .style()
+                .standardIcon(QStyle.StandardPixmap.SP_MessageBoxCritical)
+                .pixmap(16, 16)
+            ).toString(),
+        )
         html = html.replace("@TITLE@", self.tr("Authentication required"))
         html = html.replace("@H1@", self.tr("Authentication required"))
-        html = html.replace(
-            "@LI-1@",
-            self.tr("Authentication is required to access:"))
-        html = html.replace(
-            "@LI-2@",
-            '<a href="{0}">{0}</a>'.format(url.toString()))
+        html = html.replace("@LI-1@", self.tr("Authentication is required to access:"))
+        html = html.replace("@LI-2@", '<a href="{0}">{0}</a>'.format(url.toString()))
         page.setHtml(html, url)
-    
+
     def proxyAuthentication(self, requestUrl, auth, proxyHost):
         """
         Public slot to handle a proxy authentication request.
-        
+
         @param requestUrl requested URL
         @type QUrl
         @param auth reference to the authenticator object
@@ -352,60 +374,59 @@
             auth.setUser(proxy.user())
             auth.setPassword(proxy.password())
             return
-        
+
         proxyAuthenticationRequired(proxy, auth)
-    
+
     def languagesChanged(self):
         """
         Public slot to (re-)load the list of accepted languages.
         """
-        from WebBrowser.WebBrowserLanguagesDialog import (
-            WebBrowserLanguagesDialog
-        )
+        from WebBrowser.WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
+
         languages = Preferences.toList(
             Preferences.getSettings().value(
                 "WebBrowser/AcceptLanguages",
-                WebBrowserLanguagesDialog.defaultAcceptLanguages()))
+                WebBrowserLanguagesDialog.defaultAcceptLanguages(),
+            )
+        )
         self.__acceptLanguage = WebBrowserLanguagesDialog.httpString(languages)
-        
-        WebBrowserWindow.webProfile().setHttpAcceptLanguage(
-            self.__acceptLanguage)
-    
+
+        WebBrowserWindow.webProfile().setHttpAcceptLanguage(self.__acceptLanguage)
+
     def installUrlInterceptor(self, interceptor):
         """
         Public method to install an URL interceptor.
-        
+
         @param interceptor URL interceptor to be installed
         @type UrlInterceptor
         """
         self.__interceptor.installUrlInterceptor(interceptor)
-    
+
     def removeUrlInterceptor(self, interceptor):
         """
         Public method to remove an URL interceptor.
-        
+
         @param interceptor URL interceptor to be removed
         @type UrlInterceptor
         """
         self.__interceptor.removeUrlInterceptor(interceptor)
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.__interceptor.preferencesChanged()
-            
+
         if Preferences.getUI("UseSystemProxy"):
             QNetworkProxyFactory.setUseSystemConfiguration(True)
         else:
-            QNetworkProxyFactory.setApplicationProxyFactory(
-                self.__proxyFactory)
+            QNetworkProxyFactory.setApplicationProxyFactory(self.__proxyFactory)
             QNetworkProxyFactory.setUseSystemConfiguration(False)
-    
+
     def createRequest(self, op, request, data):
         """
         Public method to launch a network action.
-        
+
         @param op operation to be performed
         @type QNetworkAccessManager.Operation
         @param request request to be operated on
@@ -416,7 +437,6 @@
         @rtype QNetworkReply
         """
         req = QNetworkRequest(request)
-        req.setAttribute(
-            QNetworkRequest.Attribute.Http2AllowedAttribute, True)
-        
+        req.setAttribute(QNetworkRequest.Attribute.Http2AllowedAttribute, True)
+
         return super().createRequest(op, req, data)
--- a/src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/NetworkUrlInterceptor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,8 @@
 
 from PyQt6.QtCore import QMutex, QUrl
 from PyQt6.QtWebEngineCore import (
-    QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestInfo
+    QWebEngineUrlRequestInterceptor,
+    QWebEngineUrlRequestInfo,
 )
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
@@ -24,24 +25,25 @@
     """
     Class implementing an URL request handler.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__interceptors = []
         self.__mutex = QMutex()
-        
+
         self.__loadSettings()
-    
+
     def interceptRequest(self, info):
         """
         Public method handling an URL request.
-        
+
         @param info URL request information
         @type QWebEngineUrlRequestInfo
         """
@@ -50,66 +52,67 @@
             if self.__doNotTrack:
                 info.setHttpHeader(b"DNT", b"1")
                 info.setHttpHeader(b"X-Do-Not-Track", b"1")
-            
+
             # Send referrer header?
             if info.requestUrl().host() not in Preferences.getWebBrowser(
-                    "SendRefererWhitelist"):
+                "SendRefererWhitelist"
+            ):
                 self.__setRefererHeader(info)
-            
+
             # User Agents header
             userAgent = WebBrowserPage.userAgentForUrl(info.requestUrl())
             info.setHttpHeader(b"User-Agent", userAgent.encode())
-            
+
             for interceptor in self.__interceptors:
                 interceptor.interceptRequest(info)
-    
+
     def installUrlInterceptor(self, interceptor):
         """
         Public method to install an URL interceptor.
-        
+
         @param interceptor URL interceptor to be installed
         @type UrlInterceptor
         """
         with EricMutexLocker(self.__mutex):
             if interceptor not in self.__interceptors:
                 self.__interceptors.append(interceptor)
-    
+
     def removeUrlInterceptor(self, interceptor):
         """
         Public method to remove an URL interceptor.
-        
+
         @param interceptor URL interceptor to be removed
         @type UrlInterceptor
         """
         with EricMutexLocker(self.__mutex):
             if interceptor in self.__interceptors:
                 self.__interceptors.remove(interceptor)
-    
+
     def __loadSettings(self):
         """
         Private method to load the Network Manager settings.
         """
         with EricMutexLocker(self.__mutex):
-            self.__doNotTrack = Preferences.getWebBrowser(
-                "DoNotTrack")
-            self.__sendReferer = Preferences.getWebBrowser(
-                "RefererSendReferer")
+            self.__doNotTrack = Preferences.getWebBrowser("DoNotTrack")
+            self.__sendReferer = Preferences.getWebBrowser("RefererSendReferer")
             self.__refererDefaultPolicy = Preferences.getWebBrowser(
-                "RefererDefaultPolicy")
+                "RefererDefaultPolicy"
+            )
             self.__refererTrimmingPolicy = Preferences.getWebBrowser(
-                "RefererTrimmingPolicy")
-    
+                "RefererTrimmingPolicy"
+            )
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.__loadSettings()
-    
+
     def __setRefererHeader(self, info):
         """
         Private method to set the 'Referer' header depending on the configured
         rule set.
-        
+
         @param info URL request information
         @type QWebEngineUrlRequestInfo
         @see <a href="https://wiki.mozilla.org/Security/Referrer">
@@ -134,15 +137,18 @@
         #       3 = no-referrer-when-downgrade (default)
         # see: https://wiki.mozilla.org/Security/Referrer
         # see: https://www.w3.org/TR/referrer-policy/
-        
+
         if (
-            self.__sendReferer == 0 or
-            # never send referer header
-            
-            (self.__sendReferer == 1 and
-             (info.navigationType() !=
-              QWebEngineUrlRequestInfo.NavigationType.NavigationTypeLink))
-            # send referer header only on click
+            self.__sendReferer == 0
+            # never send referrer header
+            or (
+                self.__sendReferer == 1
+                and (
+                    info.navigationType()
+                    != QWebEngineUrlRequestInfo.NavigationType.NavigationTypeLink
+                )
+            )
+            # send referrer header only on click
         ):
             info.setHttpHeader(b"Referer", b"")
         else:
@@ -171,20 +177,20 @@
                     refererUrl = self.__refererOrigin(url)
             else:
                 # no-referrer-when-downgrade
-                if (
-                    url.scheme() in ("https", "wss") and
-                    not self.__potentiallyTrustworthy(url)
-                ):
+                if url.scheme() in (
+                    "https",
+                    "wss",
+                ) and not self.__potentiallyTrustworthy(url):
                     refererUrl = b""
                 else:
                     refererUrl = self.__trimmedReferer(url)
-            
+
             info.setHttpHeader(b"Referer", refererUrl)
-    
+
     def __sameOrigin(self, url1, url2):
         """
         Private method to test the "same origin" policy.
-        
+
         @param url1 first URL for the test
         @type QUrl
         @param url2 second URL for the test
@@ -192,17 +198,21 @@
         @return flag indicating that both URLs have the same origin
         @rtype bool
         """
-        origin1 = url1.url(QUrl.UrlFormattingOption.RemoveUserInfo |
-                           QUrl.UrlFormattingOption.RemovePath)
-        origin2 = url2.url(QUrl.UrlFormattingOption.RemoveUserInfo |
-                           QUrl.UrlFormattingOption.RemovePath)
-        
+        origin1 = url1.url(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+        origin2 = url2.url(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+
         return origin1 == origin2
-    
+
     def __potentiallyTrustworthy(self, url):
         """
         Private method to check, if the given URL is potentially trustworthy.
-        
+
         @param url URL to be checked
         @type QUrl
         @return flag indicating a potentially trustworthy URL
@@ -210,35 +220,34 @@
         """
         if url.scheme() == "data":
             return False
-        
+
         if url.toString() in ("about:blank", "about:srcdoc"):
             return True
-        
-        origin = url.adjusted(QUrl.UrlFormattingOption.RemoveUserInfo |
-                              QUrl.UrlFormattingOption.RemovePath)
-        
+
+        origin = url.adjusted(
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
+        )
+
         if origin.isEmpty() or origin.scheme() == "":
             return False
         if origin.scheme() in ("https", "wss"):
             return True
         if origin.host().startswith("127.") or origin.host().endswith(":1"):
             return True
-        if (
-            origin.host() == "localhost" or
-            origin.host().endswith(".localhost")
-        ):
+        if origin.host() == "localhost" or origin.host().endswith(".localhost"):
             return True
         if origin.scheme() == "file":
             return True
         if origin.scheme() in ("qrc", "qthelp", "eric"):
             return True
-        
+
         return False
-    
+
     def __trimmedReferer(self, url):
         """
         Private method to generate the trimmed referer header URL.
-        
+
         @param url URL to be trimmed as a referer header
         @type QUrl
         @return trimmed referer header URL
@@ -247,36 +256,36 @@
         if self.__refererTrimmingPolicy == 0:
             # send full URL (no trimming) (default)
             refererUrl = url.toEncoded(
-                QUrl.UrlFormattingOption.RemoveUserInfo |
-                QUrl.UrlFormattingOption.RemoveFragment
+                QUrl.UrlFormattingOption.RemoveUserInfo
+                | QUrl.UrlFormattingOption.RemoveFragment
             )
         elif self.__refererTrimmingPolicy == 1:
             # send the URL without its query string
             refererUrl = url.toEncoded(
-                QUrl.UrlFormattingOption.RemoveUserInfo |
-                QUrl.UrlFormattingOption.RemoveFragment |
-                QUrl.UrlFormattingOption.RemoveQuery
+                QUrl.UrlFormattingOption.RemoveUserInfo
+                | QUrl.UrlFormattingOption.RemoveFragment
+                | QUrl.UrlFormattingOption.RemoveQuery
             )
         else:
             # only send the origin (ensure trailing /)
             refererUrl = self.__refererOrigin(url)
-        
+
         return refererUrl
-    
+
     def __refererOrigin(self, url):
         """
         Private method to generate an origin referer header URL.
-        
+
         @param url URL to generate the header from
         @type QUrl
         @return origin referer header URL
         @rtype QByteArray or bytes
         """
         referer = url.toEncoded(
-            QUrl.UrlFormattingOption.RemoveUserInfo |
-            QUrl.UrlFormattingOption.RemovePath
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemovePath
         )
         if not referer.endsWith(b"/"):
             referer += b"/"
-        
+
         return referer
--- a/src/eric7/WebBrowser/Network/ProtocolHandlerManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/ProtocolHandlerManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,24 +21,25 @@
     """
     Class implementing the protocol handler manager.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__protocolHandlers = {}
         # dictionary of handlers with scheme as key
-        
+
         self.__load()
-    
+
     def protocolHandler(self, scheme):
         """
         Public method to get the protocol handler URL for a given scheme.
-        
+
         @param scheme scheme to look for
         @type str
         @return protocol handler URL
@@ -48,20 +49,20 @@
             return QUrl(self.__protocolHandlers[scheme])
         except KeyError:
             return QUrl()
-    
+
     def protocolHandlers(self):
         """
         Public method to get the registered protocol handlers.
-        
+
         @return dictionary containing the registered protocol handlers
         @rtype dict
         """
         return {s: QUrl(u) for s, u in self.__protocolHandlers.items()}
-    
+
     def addProtocolHandler(self, scheme, url):
         """
         Public method to add a protocol handler for a scheme.
-        
+
         @param scheme scheme of the protocol handler
         @type str
         @param url URL of the protocol handler
@@ -71,11 +72,11 @@
             self.__protocolHandlers[scheme] = url
             self.__registerHandler(scheme, url)
             self.__save()
-    
+
     def removeProtocolHandler(self, scheme):
         """
         Public method to remove the protocol handler for a given scheme.
-        
+
         @param scheme scheme to remove
         @type str
         """
@@ -83,88 +84,89 @@
             self.__unregisterHandler(scheme, self.__protocolHandlers[scheme])
             del self.__protocolHandlers[scheme]
             self.__save()
-    
+
     def __protocolHandlersFileName(self):
         """
         Private method to determine the protocol handlers file name.
-        
+
         @return name of the protocol handlers file
         @rtype str
         """
         return os.path.join(
-            Utilities.getConfigDir(), "web_browser", "protocol_handlers.json")
-    
+            Utilities.getConfigDir(), "web_browser", "protocol_handlers.json"
+        )
+
     def __load(self):
         """
         Private method to load the registered protocol handlers.
         """
         with contextlib.suppress(OSError):
-            with open(self.__protocolHandlersFileName(),
-                      "r") as protocolHandlersFile:
+            with open(self.__protocolHandlersFileName(), "r") as protocolHandlersFile:
                 protocolHandlersData = json.load(protocolHandlersFile)
-            
+
             if protocolHandlersData:
                 self.__protocolHandlers = {}
                 for scheme, urlStr in protocolHandlersData.items():
                     url = QUrl(urlStr)
                     self.__protocolHandlers[scheme] = url
                     self.__registerHandler(scheme, url)
-    
+
     def __save(self):
         """
         Private method to save the protocol handlers.
         """
-        protocolHandlers = {scheme: url.toString()
-                            for scheme, url in self.__protocolHandlers.items()}
-        
-        with open(self.__protocolHandlersFileName(),
-                  "w") as protocolHandlersFile:
+        protocolHandlers = {
+            scheme: url.toString() for scheme, url in self.__protocolHandlers.items()
+        }
+
+        with open(self.__protocolHandlersFileName(), "w") as protocolHandlersFile:
             json.dump(protocolHandlers, protocolHandlersFile, indent=2)
-    
+
     def __registerHandler(self, scheme, url):
         """
         Private method to register a protocol handler for a scheme.
-        
+
         @param scheme scheme of the protocol handler
         @type str
         @param url URL of the protocol handler
         @type QUrl
         """
         urlStr = url.toString().replace("%25s", "%s")
-        
+
         page = QWebEnginePage(self)
         page.loadFinished.connect(page.deleteLater)
-        page.registerProtocolHandlerRequested.connect(
-            lambda r: r.accept())
+        page.registerProtocolHandlerRequested.connect(lambda r: r.accept())
         page.setHtml(
             "<script>navigator.registerProtocolHandler('{0}', '{1}', '')"
             "</script>".format(scheme, urlStr),
-            url)
-    
+            url,
+        )
+
     def __unregisterHandler(self, scheme, url):
         """
         Private method to unregister a protocol handler for a scheme.
-        
+
         @param scheme scheme of the protocol handler
         @type str
         @param url URL of the protocol handler
         @type QUrl
         """
         urlStr = url.toString().replace("%25s", "%s")
-        
+
         page = QWebEnginePage(self)
         page.loadFinished.connect(page.deleteLater)
         page.setHtml(
             "<script>navigator.unregisterProtocolHandler('{0}', '{1}', '')"
             "</script>".format(scheme, urlStr),
-            url)
-    
+            url,
+        )
+
     def showProtocolHandlerManagerDialog(self):
         """
         Public method to show the protocol handler manager dialog.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
         from .ProtocolHandlerManagerDialog import ProtocolHandlerManagerDialog
-        
+
         dlg = ProtocolHandlerManagerDialog(self, WebBrowserWindow.getWindow())
         dlg.open()
--- a/src/eric7/WebBrowser/Network/ProtocolHandlerManagerDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/ProtocolHandlerManagerDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to manage registered protocol handlers.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the protocol handlers manager object
         @type ProtocolHandlerManager
         @param parent reference to the parent widget
@@ -29,23 +30,25 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
-        
+
         self.__manager = manager
         handlers = self.__manager.protocolHandlers()
         for scheme in sorted(handlers.keys()):
-            QTreeWidgetItem(self.protocolHandlersList,
-                            [scheme, handlers[scheme].toString()])
-        
+            QTreeWidgetItem(
+                self.protocolHandlersList, [scheme, handlers[scheme].toString()]
+            )
+
         self.on_protocolHandlersList_itemSelectionChanged()
-    
+
     @pyqtSlot()
     def on_protocolHandlersList_itemSelectionChanged(self):
         """
         Private slot handling a change of the selection.
         """
         self.deleteButton.setEnabled(
-            len(self.protocolHandlersList.selectedItems()) == 1)
-    
+            len(self.protocolHandlersList.selectedItems()) == 1
+        )
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -53,7 +56,8 @@
         """
         itm = self.protocolHandlersList.selectedItems()[0]
         self.__manager.removeProtocolHandler(itm.text(0))
-        
+
         self.protocolHandlersList.takeTopLevelItem(
-            self.protocolHandlersList.indexOfTopLevelItem(itm))
+            self.protocolHandlersList.indexOfTopLevelItem(itm)
+        )
         del itm
--- a/src/eric7/WebBrowser/Network/QtHelpSchemeHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/QtHelpSchemeHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,12 +10,8 @@
 import mimetypes
 import os
 
-from PyQt6.QtCore import (
-    pyqtSignal, QByteArray, QIODevice, QBuffer, QMutex
-)
-from PyQt6.QtWebEngineCore import (
-    QWebEngineUrlSchemeHandler, QWebEngineUrlRequestJob
-)
+from PyQt6.QtCore import pyqtSignal, QByteArray, QIODevice, QBuffer, QMutex
+from PyQt6.QtWebEngineCore import QWebEngineUrlSchemeHandler, QWebEngineUrlRequestJob
 
 from EricUtilities.EricMutexLocker import EricMutexLocker
 
@@ -58,25 +54,26 @@
     """
     Class implementing a scheme handler for the qthelp: scheme.
     """
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__engine = engine
-        
+
         self.__replies = []
-    
+
     def requestStarted(self, job):
         """
         Public method handling the URL request.
-        
+
         @param job URL request job
         @type QWebEngineUrlRequestJob
         """
@@ -87,11 +84,11 @@
             job.reply(reply.mimeType(), reply)
         else:
             job.fail(QWebEngineUrlRequestJob.Error.UrlInvalid)
-    
+
     def __replyClosed(self, reply):
         """
         Private slot handling the closed signal of a reply.
-        
+
         @param reply reference to the network reply
         @type QtHelpSchemeReply
         """
@@ -102,16 +99,17 @@
 class QtHelpSchemeReply(QIODevice):
     """
     Class implementing a reply for a requested qthelp: page.
-    
+
     @signal closed emitted to signal that the web engine has read
         the data
     """
+
     closed = pyqtSignal()
-    
+
     def __init__(self, job, engine, parent=None):
         """
         Constructor
-        
+
         @param job reference to the URL request
         @type QWebEngineUrlRequestJob
         @param engine reference to the help engine
@@ -120,97 +118,98 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__job = job
         self.__engine = engine
         self.__mutex = QMutex()
-        
+
         self.__buffer = QBuffer()
-        
+
         # determine mimetype
         url = self.__job.requestUrl()
         strUrl = url.toString()
-        
+
         # For some reason the url to load maybe wrong (passed from web engine)
         # though the css file and the references inside should work that way.
         # One possible problem might be that the css is loaded at the same
         # level as the html, thus a path inside the css like
         # (../images/foo.png) might cd out of the virtual folder
-        if (
-            not self.__engine.findFile(url).isValid() and
-            strUrl.startswith(QtDocPath)
-        ):
+        if not self.__engine.findFile(url).isValid() and strUrl.startswith(QtDocPath):
             newUrl = self.__job.requestUrl()
             if not newUrl.path().startswith("/qdoc/"):
                 newUrl.setPath("/qdoc" + newUrl.path())
                 url = newUrl
                 strUrl = url.toString()
-        
+
         self.__mimeType = mimetypes.guess_type(strUrl)[0]
         if self.__mimeType is None:
             # do our own (limited) guessing
             self.__mimeType = self.__mimeFromUrl(url)
-        
+
         self.__loadQtHelpPage(url)
-    
+
     def __loadQtHelpPage(self, url):
         """
         Private method to load the requested QtHelp page.
-        
+
         @param url URL of the requested page
         @type QUrl
         """
         data = (
             self.__engine.fileData(url)
-            if self.__engine.findFile(url).isValid() else
-            QByteArray(self.tr(
-                """<html>"""
-                """<head><title>Error 404...</title></head>"""
-                """<body><div align="center"><br><br>"""
-                """<h1>The page could not be found</h1><br>"""
-                """<h3>'{0}'</h3></div></body>"""
-                """</html>""").format(url.toString())
-                .encode("utf-8"))
+            if self.__engine.findFile(url).isValid()
+            else QByteArray(
+                self.tr(
+                    """<html>"""
+                    """<head><title>Error 404...</title></head>"""
+                    """<body><div align="center"><br><br>"""
+                    """<h1>The page could not be found</h1><br>"""
+                    """<h3>'{0}'</h3></div></body>"""
+                    """</html>"""
+                )
+                .format(url.toString())
+                .encode("utf-8")
+            )
         )
-        
+
         with EricMutexLocker(self.__mutex):
             self.__buffer.setData(data)
             self.__buffer.open(QIODevice.OpenModeFlag.ReadOnly)
             self.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         self.readyRead.emit()
-    
+
     def bytesAvailable(self):
         """
         Public method to get the number of available bytes.
-        
+
         @return number of available bytes
         @rtype int
         """
         with EricMutexLocker(self.__mutex):
             return self.__buffer.bytesAvailable()
-    
+
     def readData(self, maxlen):
         """
         Public method to retrieve data from the reply object.
-        
+
         @param maxlen maximum number of bytes to read (integer)
         @return string containing the data (bytes)
         """
         with EricMutexLocker(self.__mutex):
             return self.__buffer.read(maxlen)
-    
+
     def close(self):
         """
         Public method used to cloase the reply.
         """
         super().close()
         self.closed.emit()
-    
+
     def __mimeFromUrl(self, url):
         """
         Private method to guess the mime type given an URL.
-        
+
         @param url URL to guess the mime type from (QUrl)
         @return mime type for the given URL (string)
         """
@@ -220,11 +219,11 @@
             return ExtensionMap[ext]
         else:
             return "application/octet-stream"
-    
+
     def mimeType(self):
         """
         Public method to get the reply mime type.
-        
+
         @return mime type of the reply
         @rtype bytes
         """
--- a/src/eric7/WebBrowser/Network/SendRefererWhitelistDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/SendRefererWhitelistDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,30 +19,30 @@
     """
     Class implementing a dialog to manage the Send Referer whitelist.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__model = QStringListModel(
-            Preferences.getWebBrowser("SendRefererWhitelist"), self)
+            Preferences.getWebBrowser("SendRefererWhitelist"), self
+        )
         self.__model.sort(0)
         self.__proxyModel = QSortFilterProxyModel(self)
-        self.__proxyModel.setFilterCaseSensitivity(
-            Qt.CaseSensitivity.CaseInsensitive)
+        self.__proxyModel.setFilterCaseSensitivity(Qt.CaseSensitivity.CaseInsensitive)
         self.__proxyModel.setSourceModel(self.__model)
         self.whitelist.setModel(self.__proxyModel)
-        
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
-        
+
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
+
         self.removeButton.clicked.connect(self.whitelist.removeSelected)
         self.removeAllButton.clicked.connect(self.whitelist.removeAll)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -52,18 +52,17 @@
             self,
             self.tr("Send Referer Whitelist"),
             self.tr("Enter host name to add to the whitelist:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and host != "" and host not in self.__model.stringList():
             self.__model.insertRow(self.__model.rowCount())
-            self.__model.setData(
-                self.__model.index(self.__model.rowCount() - 1), host)
+            self.__model.setData(self.__model.index(self.__model.rowCount() - 1), host)
             self.__model.sort(0)
-    
+
     def accept(self):
         """
         Public method to accept the dialog data.
         """
-        Preferences.setWebBrowser(
-            "SendRefererWhitelist", self.__model.stringList())
-        
+        Preferences.setWebBrowser("SendRefererWhitelist", self.__model.stringList())
+
         super().accept()
--- a/src/eric7/WebBrowser/Network/SslErrorExceptionsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/SslErrorExceptionsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to edit the SSL error exceptions.
     """
+
     def __init__(self, errorsDict, parent=None):
         """
         Constructor
-        
+
         @param errorsDict error exceptions
         @type dict of list of int
         @param parent reference to the parent widget
@@ -29,63 +30,72 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__errorDescriptions = {
-            QWebEngineCertificateError.Type.SslPinnedKeyNotInCertificateChain:
-                self.tr("The certificate did not match the built-in public"
-                        " keys pinned for the host name."),
-            QWebEngineCertificateError.Type.CertificateCommonNameInvalid:
-                self.tr("The certificate's common name did not match the"
-                        " host name."),
-            QWebEngineCertificateError.Type.CertificateDateInvalid:
-                self.tr("The certificate is not valid at the current date"
-                        " and time."),
-            QWebEngineCertificateError.Type.CertificateAuthorityInvalid:
-                self.tr("The certificate is not signed by a trusted"
-                        " authority."),
-            QWebEngineCertificateError.Type.CertificateContainsErrors:
-                self.tr("The certificate contains errors."),
-            QWebEngineCertificateError.Type.CertificateNoRevocationMechanism:
-                self.tr("The certificate has no mechanism for determining if"
-                        " it has been revoked."),
-            QWebEngineCertificateError.Type
-            .CertificateUnableToCheckRevocation:
-                self.tr("Revocation information for the certificate is"
-                        " not available."),
-            QWebEngineCertificateError.Type.CertificateRevoked:
-                self.tr("The certificate has been revoked."),
-            QWebEngineCertificateError.Type.CertificateInvalid:
-                self.tr("The certificate is invalid."),
-            QWebEngineCertificateError.Type.CertificateWeakSignatureAlgorithm:
-                self.tr("The certificate is signed using a weak signature"
-                        " algorithm."),
-            QWebEngineCertificateError.Type.CertificateNonUniqueName:
-                self.tr("The host name specified in the certificate is"
-                        " not unique."),
-            QWebEngineCertificateError.Type.CertificateWeakKey:
-                self.tr("The certificate contains a weak key."),
-            QWebEngineCertificateError.Type
-            .CertificateNameConstraintViolation:
-                self.tr("The certificate claimed DNS names that are in"
-                        " violation of name constraints."),
-            QWebEngineCertificateError.Type.CertificateValidityTooLong:
-                self.tr("The certificate has a validity period that is"
-                        " too long."),
-            QWebEngineCertificateError.Type.CertificateTransparencyRequired:
-                self.tr("Certificate Transparency was required for this"
-                        " connection, but the server did not provide"
-                        " information that complied with the policy."),
-            QWebEngineCertificateError.Type
-            .CertificateKnownInterceptionBlocked:
-                self.tr("The certificate is known to be used for interception"
-                        " by an entity other than the device owner."),
-            QWebEngineCertificateError.Type.SslObsoleteVersion:
-                self.tr("The connection uses an obsolete version of SSL/TLS."),
-            QWebEngineCertificateError.Type.CertificateSymantecLegacy:
-                self.tr("The certificate is a legacy Symantec one that's no"
-                        " longer valid."),
+            QWebEngineCertificateError.Type.SslPinnedKeyNotInCertificateChain: self.tr(
+                "The certificate did not match the built-in public"
+                " keys pinned for the host name."
+            ),
+            QWebEngineCertificateError.Type.CertificateCommonNameInvalid: self.tr(
+                "The certificate's common name did not match the" " host name."
+            ),
+            QWebEngineCertificateError.Type.CertificateDateInvalid: self.tr(
+                "The certificate is not valid at the current date" " and time."
+            ),
+            QWebEngineCertificateError.Type.CertificateAuthorityInvalid: self.tr(
+                "The certificate is not signed by a trusted" " authority."
+            ),
+            QWebEngineCertificateError.Type.CertificateContainsErrors: self.tr(
+                "The certificate contains errors."
+            ),
+            QWebEngineCertificateError.Type.CertificateNoRevocationMechanism: self.tr(
+                "The certificate has no mechanism for determining if"
+                " it has been revoked."
+            ),
+            QWebEngineCertificateError.Type.CertificateUnableToCheckRevocation: self.tr(
+                "Revocation information for the certificate is" " not available."
+            ),
+            QWebEngineCertificateError.Type.CertificateRevoked: self.tr(
+                "The certificate has been revoked."
+            ),
+            QWebEngineCertificateError.Type.CertificateInvalid: self.tr(
+                "The certificate is invalid."
+            ),
+            QWebEngineCertificateError.Type.CertificateWeakSignatureAlgorithm: self.tr(
+                "The certificate is signed using a weak signature" " algorithm."
+            ),
+            QWebEngineCertificateError.Type.CertificateNonUniqueName: self.tr(
+                "The host name specified in the certificate is" " not unique."
+            ),
+            QWebEngineCertificateError.Type.CertificateWeakKey: self.tr(
+                "The certificate contains a weak key."
+            ),
+            QWebEngineCertificateError.Type.CertificateNameConstraintViolation: self.tr(
+                "The certificate claimed DNS names that are in"
+                " violation of name constraints."
+            ),
+            QWebEngineCertificateError.Type.CertificateValidityTooLong: self.tr(
+                "The certificate has a validity period that is" " too long."
+            ),
+            QWebEngineCertificateError.Type.CertificateTransparencyRequired: self.tr(
+                "Certificate Transparency was required for this"
+                " connection, but the server did not provide"
+                " information that complied with the policy."
+            ),
+            QWebEngineCertificateError.Type.CertificateKnownInterceptionBlocked: (
+                self.tr(
+                    "The certificate is known to be used for interception"
+                    " by an entity other than the device owner."
+                )
+            ),
+            QWebEngineCertificateError.Type.SslObsoleteVersion: self.tr(
+                "The connection uses an obsolete version of SSL/TLS."
+            ),
+            QWebEngineCertificateError.Type.CertificateSymantecLegacy: self.tr(
+                "The certificate is a legacy Symantec one that's no" " longer valid."
+            ),
         }
-        
+
         for host, errors in errorsDict.items():
             itm = QTreeWidgetItem(self.errorsTree, [host])
             self.errorsTree.setFirstItemColumnSpanned(itm, True)
@@ -95,14 +105,14 @@
                 except KeyError:
                     errorDesc = self.tr("No error description available.")
                 QTreeWidgetItem(itm, [str(error), errorDesc])
-        
+
         self.errorsTree.expandAll()
         for i in range(self.errorsTree.columnCount()):
             self.errorsTree.resizeColumnToContents(i)
         self.errorsTree.sortItems(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.__setRemoveButtons()
-    
+
     def __setRemoveButtons(self):
         """
         Private method to set the state of the 'remove' buttons.
@@ -112,37 +122,36 @@
             self.removeAllButton.setEnabled(False)
         else:
             self.removeAllButton.setEnabled(True)
-            self.removeButton.setEnabled(
-                len(self.errorsTree.selectedItems()) > 0)
-    
+            self.removeButton.setEnabled(len(self.errorsTree.selectedItems()) > 0)
+
     @pyqtSlot(QPoint)
     def on_errorsTree_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos cursor position
         @type QPoint
         """
         menu = QMenu()
         menu.addAction(
-            self.tr("Remove Selected"),
-            self.on_removeButton_clicked).setEnabled(
-            self.errorsTree.topLevelItemCount() > 0 and
-            len(self.errorsTree.selectedItems()) > 0)
+            self.tr("Remove Selected"), self.on_removeButton_clicked
+        ).setEnabled(
+            self.errorsTree.topLevelItemCount() > 0
+            and len(self.errorsTree.selectedItems()) > 0
+        )
         menu.addAction(
-            self.tr("Remove All"),
-            self.on_removeAllButton_clicked).setEnabled(
-            self.errorsTree.topLevelItemCount() > 0)
-        
+            self.tr("Remove All"), self.on_removeAllButton_clicked
+        ).setEnabled(self.errorsTree.topLevelItemCount() > 0)
+
         menu.exec(self.errorsTree.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def on_errorsTree_itemSelectionChanged(self):
         """
         Private slot handling the selection of entries.
         """
         self.__setRemoveButtons()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -156,30 +165,30 @@
                 index = self.errorsTree.indexOfTopLevelItem(itm)
                 self.errorsTree.takeTopLevelItem(index)
             del itm
-        
+
         # remove all hosts without an exception
         for index in range(self.errorsTree.topLevelItemCount() - 1, -1, -1):
             itm = self.errorsTree.topLevelItem(index)
             if itm.childCount() == 0:
                 self.errorsTree.takeTopLevelItem(index)
                 del itm
-    
+
     @pyqtSlot()
     def on_removeAllButton_clicked(self):
         """
         Private slot to remove all entries.
         """
         self.errorsTree.clear()
-    
+
     def getSslErrorExceptions(self):
         """
         Public method to retrieve the list of SSL error exceptions.
-        
+
         @return error exceptions
         @rtype dict of list of int
         """
         errors = {}
-        
+
         for index in range(self.errorsTree.topLevelItemCount()):
             itm = self.errorsTree.topLevelItem(index)
             host = itm.text(0)
@@ -187,5 +196,5 @@
             for cindex in range(itm.childCount()):
                 citm = itm.child(cindex)
                 errors[host].append(int(citm.text(0)))
-        
+
         return errors
--- a/src/eric7/WebBrowser/Network/UrlInterceptor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Network/UrlInterceptor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,19 +14,20 @@
     """
     Class implementing an URL interceptor base class.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent referemce to the parent object
         @type QObject
         """
         super().__init__(parent)
-    
+
     def interceptRequest(self, info):
         """
         Public method to intercept a request.
-        
+
         @param info request info object
         @type QWebEngineUrlRequestInfo
         """
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,32 +21,34 @@
     """
     Class implementing a dialog for the configuration of search engines.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.setModal(True)
-        
+
         self.__mw = parent
-        
-        self.__model = OpenSearchEngineModel(
-            self.__mw.openSearchManager(), self)
+
+        self.__model = OpenSearchEngineModel(self.__mw.openSearchManager(), self)
         self.enginesTable.setModel(self.__model)
         self.enginesTable.horizontalHeader().resizeSection(0, 200)
         self.enginesTable.horizontalHeader().setStretchLastSection(True)
         self.enginesTable.verticalHeader().hide()
         self.enginesTable.verticalHeader().setDefaultSectionSize(
-            1.2 * self.fontMetrics().height())
-        
+            1.2 * self.fontMetrics().height()
+        )
+
         self.enginesTable.selectionModel().selectionChanged.connect(
-            self.__selectionChanged)
+            self.__selectionChanged
+        )
         self.editButton.setEnabled(False)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -56,8 +58,9 @@
             self,
             self.tr("Add search engine"),
             "",
-            self.tr("OpenSearch (*.xml);;All Files (*)"))
-        
+            self.tr("OpenSearch (*.xml);;All Files (*)"),
+        )
+
         osm = self.__mw.openSearchManager()
         for fileName in fileNames:
             if not osm.addEngine(fileName):
@@ -66,8 +69,10 @@
                     self.tr("Add search engine"),
                     self.tr(
                         """{0} is not a valid OpenSearch 1.1 description or"""
-                        """ is already on your list.""").format(fileName))
-    
+                        """ is already on your list."""
+                    ).format(fileName),
+                )
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -77,44 +82,46 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Delete selected engines"),
-                self.tr("""You must have at least one search engine."""))
-        
+                self.tr("""You must have at least one search engine."""),
+            )
+
         self.enginesTable.removeSelected()
-    
+
     @pyqtSlot()
     def on_restoreButton_clicked(self):
         """
         Private slot to restore the default search engines.
         """
         self.__mw.openSearchManager().restoreDefaults()
-    
+
     @pyqtSlot()
     def on_editButton_clicked(self):
         """
         Private slot to edit the data of the current search engine.
         """
         from .OpenSearchEditDialog import OpenSearchEditDialog
-        
+
         rows = self.enginesTable.selectionModel().selectedRows()
         row = (
             self.enginesTable.selectionModel().currentIndex().row()
-            if len(rows) == 0 else
-            rows[0].row()
+            if len(rows) == 0
+            else rows[0].row()
         )
-        
+
         osm = self.__mw.openSearchManager()
         engineName = osm.allEnginesNames()[row]
         engine = osm.engine(engineName)
         dlg = OpenSearchEditDialog(engine, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             osm.enginesChanged()
-    
+
     def __selectionChanged(self, selected, deselected):
         """
         Private slot to handle a change of the selection.
-        
+
         @param selected item selection of selected items (QItemSelection)
         @param deselected item selection of deselected items (QItemSelection)
         """
         self.editButton.setEnabled(
-            len(self.enginesTable.selectionModel().selectedRows()) <= 1)
+            len(self.enginesTable.selectionModel().selectedRows()) <= 1
+        )
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchEditDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchEditDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,27 +16,28 @@
     """
     Class implementing a dialog to edit the data of a search engine.
     """
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the search engine (OpenSearchEngine)
         @param parent reference to the parent object (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__engine = engine
-        
+
         self.nameEdit.setText(engine.name())
         self.descriptionEdit.setText(engine.description())
         self.imageEdit.setText(engine.imageUrl())
         self.searchEdit.setText(engine.searchUrlTemplate())
         self.suggestionsEdit.setText(engine.suggestionsUrlTemplate())
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def accept(self):
         """
         Public slot to accept the data entered.
@@ -46,5 +47,5 @@
         self.__engine.setImageUrlAndLoad(self.imageEdit.text())
         self.__engine.setSearchUrlTemplate(self.searchEdit.text())
         self.__engine.setSuggestionsUrlTemplate(self.suggestionsEdit.text())
-        
+
         super().accept()
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchEngine.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchEngine.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,13 +11,18 @@
 import json
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QLocale, QUrl, QUrlQuery, QByteArray, QBuffer,
-    QIODevice, QObject
+    pyqtSignal,
+    pyqtSlot,
+    QLocale,
+    QUrl,
+    QUrlQuery,
+    QByteArray,
+    QBuffer,
+    QIODevice,
+    QObject,
 )
 from PyQt6.QtGui import QImage
-from PyQt6.QtNetwork import (
-    QNetworkRequest, QNetworkAccessManager, QNetworkReply
-)
+from PyQt6.QtNetwork import QNetworkRequest, QNetworkAccessManager, QNetworkReply
 
 from UI.Info import Program
 
@@ -28,30 +33,31 @@
 class OpenSearchEngine(QObject):
     """
     Class implementing the open search engine.
-    
+
     @signal imageChanged() emitted after the icon has been changed
     @signal suggestions(list of strings) emitted after the suggestions have
             been received
     """
+
     imageChanged = pyqtSignal()
     suggestions = pyqtSignal(list)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__suggestionsReply = None
         self.__networkAccessManager = None
         self._name = ""
         self._description = ""
         self._searchUrlTemplate = ""
         self._suggestionsUrlTemplate = ""
-        self._searchParameters = []            # list of two tuples
-        self._suggestionsParameters = []       # list of two tuples
+        self._searchParameters = []  # list of two tuples
+        self._suggestionsParameters = []  # list of two tuples
         self._imageUrl = ""
         self.__image = QImage()
         self.__iconMoved = False
@@ -61,14 +67,14 @@
             "get": QNetworkAccessManager.Operation.GetOperation,
             "post": QNetworkAccessManager.Operation.PostOperation,
         }
-        
+
         self.__replies = []
-    
+
     @classmethod
     def parseTemplate(cls, searchTerm, searchTemplate):
         """
         Class method to parse a search template.
-        
+
         @param searchTerm term to search for (string)
         @param searchTemplate template to be parsed (string)
         @return parsed template (string)
@@ -76,7 +82,7 @@
         locale = QLocale(Preferences.getWebBrowser("SearchLanguage"))
         language = locale.name().replace("_", "-")
         country = locale.name().split("_")[0].lower()
-        
+
         result = searchTemplate
         result = result.replace("{count}", "20")
         result = result.replace("{startIndex}", "0")
@@ -86,57 +92,57 @@
         result = result.replace("{inputEncoding}", "UTF-8")
         result = result.replace("{outputEncoding}", "UTF-8")
         result = result.replace(
-            "{searchTerms}",
-            bytes(QUrl.toPercentEncoding(searchTerm)).decode())
+            "{searchTerms}", bytes(QUrl.toPercentEncoding(searchTerm)).decode()
+        )
         result = re.sub(r"""\{([^\}]*:|)source\??\}""", Program, result)
 
         return result
-    
+
     @pyqtSlot(result=str)
     def name(self):
         """
         Public method to get the name of the engine.
-        
+
         @return name of the engine (string)
         """
         return self._name
-    
+
     def setName(self, name):
         """
         Public method to set the engine name.
-        
+
         @param name name of the engine (string)
         """
         self._name = name
-    
+
     def description(self):
         """
         Public method to get the description of the engine.
-        
+
         @return description of the engine (string)
         """
         return self._description
-    
+
     def setDescription(self, description):
         """
         Public method to set the engine description.
-        
+
         @param description description of the engine (string)
         """
         self._description = description
-    
+
     def searchUrlTemplate(self):
         """
         Public method to get the search URL template of the engine.
-        
+
         @return search URL template of the engine (string)
         """
         return self._searchUrlTemplate
-    
+
     def setSearchUrlTemplate(self, searchUrlTemplate):
         """
         Public method to set the engine search URL template.
-        
+
         The URL template is processed according to the specification:
         <a
           href="http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_URL_template_syntax">
@@ -159,238 +165,244 @@
         <tr><td>{*:source}</td>
           <td>application name, QCoreApplication::applicationName()</td></tr>
         </table>
-        
+
         @param searchUrlTemplate search URL template of the engine (string)
         """
         self._searchUrlTemplate = searchUrlTemplate
-    
+
     def searchUrl(self, searchTerm):
         """
         Public method to get a URL ready for searching.
-        
+
         @param searchTerm term to search for (string)
         @return URL (QUrl)
         """
         if not self._searchUrlTemplate:
             return QUrl()
-        
+
         ret = QUrl.fromEncoded(
-            self.parseTemplate(searchTerm, self._searchUrlTemplate)
-            .encode("utf-8"))
-        
+            self.parseTemplate(searchTerm, self._searchUrlTemplate).encode("utf-8")
+        )
+
         if self.__searchMethod != "post":
             urlQuery = QUrlQuery(ret)
             for parameter in self._searchParameters:
                 urlQuery.addQueryItem(
-                    parameter[0],
-                    self.parseTemplate(searchTerm, parameter[1]))
+                    parameter[0], self.parseTemplate(searchTerm, parameter[1])
+                )
             ret.setQuery(urlQuery)
-        
+
         return ret
-    
+
     def providesSuggestions(self):
         """
         Public method to check, if the engine provides suggestions.
-        
+
         @return flag indicating suggestions are provided (boolean)
         """
         return self._suggestionsUrlTemplate != ""
-    
+
     def suggestionsUrlTemplate(self):
         """
         Public method to get the search URL template of the engine.
-        
+
         @return search URL template of the engine (string)
         """
         return self._suggestionsUrlTemplate
-    
+
     def setSuggestionsUrlTemplate(self, suggestionsUrlTemplate):
         """
         Public method to set the engine suggestions URL template.
-        
+
         @param suggestionsUrlTemplate suggestions URL template of the
             engine (string)
         """
         self._suggestionsUrlTemplate = suggestionsUrlTemplate
-    
+
     def suggestionsUrl(self, searchTerm):
         """
         Public method to get a URL ready for suggestions.
-        
+
         @param searchTerm term to search for (string)
         @return URL (QUrl)
         """
         if not self._suggestionsUrlTemplate:
             return QUrl()
-        
-        ret = QUrl.fromEncoded(QByteArray(self.parseTemplate(
-            searchTerm, self._suggestionsUrlTemplate).encode("utf-8")))
-        
+
+        ret = QUrl.fromEncoded(
+            QByteArray(
+                self.parseTemplate(searchTerm, self._suggestionsUrlTemplate).encode(
+                    "utf-8"
+                )
+            )
+        )
+
         if self.__searchMethod != "post":
             urlQuery = QUrlQuery(ret)
             for parameter in self._suggestionsParameters:
                 urlQuery.addQueryItem(
-                    parameter[0],
-                    self.parseTemplate(searchTerm, parameter[1]))
+                    parameter[0], self.parseTemplate(searchTerm, parameter[1])
+                )
             ret.setQuery(urlQuery)
-        
+
         return ret
-    
+
     def searchParameters(self):
         """
         Public method to get the search parameters of the engine.
-        
+
         @return search parameters of the engine (list of two tuples)
         """
         return self._searchParameters[:]
-    
+
     def setSearchParameters(self, searchParameters):
         """
         Public method to set the engine search parameters.
-        
+
         @param searchParameters search parameters of the engine
             (list of two tuples)
         """
         self._searchParameters = searchParameters[:]
-    
+
     def suggestionsParameters(self):
         """
         Public method to get the suggestions parameters of the engine.
-        
+
         @return suggestions parameters of the engine (list of two tuples)
         """
         return self._suggestionsParameters[:]
-    
+
     def setSuggestionsParameters(self, suggestionsParameters):
         """
         Public method to set the engine suggestions parameters.
-        
+
         @param suggestionsParameters suggestions parameters of the
             engine (list of two tuples)
         """
         self._suggestionsParameters = suggestionsParameters[:]
-    
+
     def searchMethod(self):
         """
         Public method to get the HTTP request method used to perform search
         requests.
-        
+
         @return HTTP request method (string)
         """
         return self.__searchMethod
-    
+
     def setSearchMethod(self, method):
         """
         Public method to set the HTTP request method used to perform search
         requests.
-        
+
         @param method HTTP request method (string)
         """
         requestMethod = method.lower()
         if requestMethod not in self.__requestMethods:
             return
-        
+
         self.__searchMethod = requestMethod
-    
+
     def suggestionsMethod(self):
         """
         Public method to get the HTTP request method used to perform
         suggestions requests.
-        
+
         @return HTTP request method (string)
         """
         return self.__suggestionsMethod
-    
+
     def setSuggestionsMethod(self, method):
         """
         Public method to set the HTTP request method used to perform
         suggestions requests.
-        
+
         @param method HTTP request method (string)
         """
         requestMethod = method.lower()
         if requestMethod not in self.__requestMethods:
             return
-        
+
         self.__suggestionsMethod = requestMethod
-    
+
     def imageUrl(self):
         """
         Public method to get the image URL of the engine.
-        
+
         @return image URL of the engine (string)
         """
         return self._imageUrl
-    
+
     def setImageUrl(self, imageUrl):
         """
         Public method to set the engine image URL.
-        
+
         @param imageUrl image URL of the engine (string)
         """
         self._imageUrl = imageUrl
-    
+
     def setImageUrlAndLoad(self, imageUrl):
         """
         Public method to set the engine image URL.
-        
+
         @param imageUrl image URL of the engine (string)
         """
         self.setImageUrl(imageUrl)
         self.__iconMoved = False
         self.loadImage()
-    
+
     def loadImage(self):
         """
         Public method to load the image of the engine.
         """
         if self.__networkAccessManager is None or not self._imageUrl:
             return
-        
+
         reply = self.__networkAccessManager.get(
-            QNetworkRequest(QUrl.fromEncoded(self._imageUrl.encode("utf-8"))))
+            QNetworkRequest(QUrl.fromEncoded(self._imageUrl.encode("utf-8")))
+        )
         reply.finished.connect(lambda: self.__imageObtained(reply))
         self.__replies.append(reply)
-    
+
     def __imageObtained(self, reply):
         """
         Private slot to receive the image of the engine.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         response = reply.readAll()
-        
+
         reply.close()
         if reply in self.__replies:
             self.__replies.remove(reply)
         reply.deleteLater()
-        
+
         if response.isEmpty():
             return
-        
+
         if response.startsWith(b"<html>") or response.startsWith(b"HTML"):
             self.__iconMoved = True
             self.__image = QImage()
         else:
             self.__image.loadFromData(response)
         self.imageChanged.emit()
-    
+
     def image(self):
         """
         Public method to get the image of the engine.
-        
+
         @return image of the engine (QImage)
         """
         if not self.__iconMoved and self.__image.isNull():
             self.loadImage()
-        
+
         return self.__image
-    
+
     def setImage(self, image):
         """
         Public method to set the image of the engine.
-        
+
         @param image image to be set (QImage)
         """
         if not self._imageUrl:
@@ -398,131 +410,129 @@
             imageBuffer.open(QIODevice.OpenModeFlag.ReadWrite)
             if image.save(imageBuffer, "PNG"):
                 self._imageUrl = "data:image/png;base64,{0}".format(
-                    bytes(imageBuffer.buffer().toBase64()).decode())
-        
+                    bytes(imageBuffer.buffer().toBase64()).decode()
+                )
+
         self.__image = QImage(image)
         self.imageChanged.emit()
-    
+
     def isValid(self):
         """
         Public method to check, if the engine is valid.
-        
+
         @return flag indicating validity (boolean)
         """
         return self._name and self._searchUrlTemplate
-    
+
     def __eq__(self, other):
         """
         Special method implementing the == operator.
-        
+
         @param other reference to an open search engine (OpenSearchEngine)
         @return flag indicating equality (boolean)
         """
         if not isinstance(other, OpenSearchEngine):
             return NotImplemented
-        
+
         return (
-            self._name == other._name and
-            self._description == other._description and
-            self._imageUrl == other._imageUrl and
-            self._searchUrlTemplate == other._searchUrlTemplate and
-            self._suggestionsUrlTemplate == other._suggestionsUrlTemplate and
-            self._searchParameters == other._searchParameters and
-            self._suggestionsParameters == other._suggestionsParameters
+            self._name == other._name
+            and self._description == other._description
+            and self._imageUrl == other._imageUrl
+            and self._searchUrlTemplate == other._searchUrlTemplate
+            and self._suggestionsUrlTemplate == other._suggestionsUrlTemplate
+            and self._searchParameters == other._searchParameters
+            and self._suggestionsParameters == other._suggestionsParameters
         )
-    
+
     def __lt__(self, other):
         """
         Special method implementing the < operator.
-        
+
         @param other reference to an open search engine (OpenSearchEngine)
         @return flag indicating less than (boolean)
         """
         if not isinstance(other, OpenSearchEngine):
             return NotImplemented
-        
+
         return self._name < other._name
-    
+
     def requestSuggestions(self, searchTerm):
         """
         Public method to request suggestions.
-        
+
         @param searchTerm term to get suggestions for (string)
         """
         if not searchTerm or not self.providesSuggestions():
             return
-        
+
         if self.__networkAccessManager is None:
             return
-        
+
         if self.__suggestionsReply is not None:
-            self.__suggestionsReply.finished.disconnect(
-                self.__suggestionsObtained)
+            self.__suggestionsReply.finished.disconnect(self.__suggestionsObtained)
             self.__suggestionsReply.abort()
             self.__suggestionsReply.deleteLater()
             self.__suggestionsReply = None
-        
+
         if self.__suggestionsMethod not in self.__requestMethods:
             # ignore
             return
-        
+
         if self.__suggestionsMethod == "get":
             self.__suggestionsReply = self.networkAccessManager().get(
-                QNetworkRequest(self.suggestionsUrl(searchTerm)))
+                QNetworkRequest(self.suggestionsUrl(searchTerm))
+            )
         else:
             parameters = []
             for parameter in self._suggestionsParameters:
                 parameters.append(parameter[0] + "=" + parameter[1])
             data = "&".join(parameters)
             self.__suggestionsReply = self.networkAccessManager().post(
-                QNetworkRequest(self.suggestionsUrl(searchTerm)), data)
-        self.__suggestionsReply.finished.connect(
-            self.__suggestionsObtained)
-    
+                QNetworkRequest(self.suggestionsUrl(searchTerm)), data
+            )
+        self.__suggestionsReply.finished.connect(self.__suggestionsObtained)
+
     def __suggestionsObtained(self):
         """
         Private slot to receive the suggestions.
         """
-        if (
-            self.__suggestionsReply.error() ==
-            QNetworkReply.NetworkError.NoError
-        ):
+        if self.__suggestionsReply.error() == QNetworkReply.NetworkError.NoError:
             buffer = bytes(self.__suggestionsReply.readAll())
             response = Utilities.decodeBytes(buffer)
             response = response.strip()
-            
+
             self.__suggestionsReply.close()
             self.__suggestionsReply.deleteLater()
             self.__suggestionsReply = None
-            
+
             if len(response) == 0:
                 return
-            
+
             try:
                 result = json.loads(response)
             except ValueError:
                 return
-            
+
             try:
                 suggestions = result[1]
             except IndexError:
                 return
-            
+
             self.suggestions.emit(suggestions)
-    
+
     def networkAccessManager(self):
         """
         Public method to get a reference to the network access manager object.
-        
+
         @return reference to the network access manager object
             (QNetworkAccessManager)
         """
         return self.__networkAccessManager
-    
+
     def setNetworkAccessManager(self, networkAccessManager):
         """
         Public method to set the reference to the network access manager.
-        
+
         @param networkAccessManager reference to the network access manager
             object (QNetworkAccessManager)
         """
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchEngineAction.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchEngineAction.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,27 +15,30 @@
     """
     Class implementing a QAction subclass for open search.
     """
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the open search engine object
             (OpenSearchEngine)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__engine = engine
         if self.__engine.networkAccessManager() is None:
             import WebBrowser.WebBrowserWindow
+
             self.__engine.setNetworkAccessManager(
-                WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager())
-        
+                WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
+            )
+
         self.setText(engine.name())
         self.__imageChanged()
-        
+
         engine.imageChanged.connect(self.__imageChanged)
-    
+
     def __imageChanged(self):
         """
         Private slot handling a change of the associated image.
@@ -43,8 +46,11 @@
         image = self.__engine.image()
         if image.isNull():
             import WebBrowser.WebBrowserWindow
+
             self.setIcon(
                 WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
-                    QUrl(self.__engine.imageUrl())))
+                    QUrl(self.__engine.imageUrl())
+                )
+            )
         else:
             self.setIcon(QIcon(QPixmap.fromImage(image)))
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchEngineModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchEngineModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,28 +18,29 @@
     """
     Class implementing a model for search engines.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the search engine manager
             (OpenSearchManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
         manager.changed.connect(self.__enginesChanged)
-        
+
         self.__headers = [
             self.tr("Name"),
             self.tr("Keywords"),
         ]
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row start row (integer)
         @param count number of rows to remove (integer)
         @param parent parent index (QModelIndex)
@@ -47,108 +48,106 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         if count <= 0:
             return False
-        
+
         if self.rowCount() <= 1:
             return False
-        
+
         lastRow = row + count - 1
-        
+
         self.beginRemoveRows(parent, row, lastRow)
-        
+
         nameList = self.__manager.allEnginesNames()
         for index in range(row, lastRow + 1):
             self.__manager.removeEngine(nameList[index])
-        
+
         return True
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return self.__manager.enginesCount()
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex) (Unused)
         @return number of columns (integer)
         """
         return 2
-    
+
     def flags(self, index):
         """
         Public method to get flags for a model cell.
-        
+
         @param index index of the model cell (QModelIndex)
         @return flags (Qt.ItemFlags)
         """
         if index.column() == 1:
             return (
-                Qt.ItemFlag.ItemIsEnabled |
-                Qt.ItemFlag.ItemIsSelectable |
-                Qt.ItemFlag.ItemIsEditable
+                Qt.ItemFlag.ItemIsEnabled
+                | Qt.ItemFlag.ItemIsSelectable
+                | Qt.ItemFlag.ItemIsEditable
             )
         else:
-            return (
-                Qt.ItemFlag.ItemIsEnabled |
-                Qt.ItemFlag.ItemIsSelectable
-            )
-    
+            return Qt.ItemFlag.ItemIsEnabled | Qt.ItemFlag.ItemIsSelectable
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         if index.row() >= self.__manager.enginesCount() or index.row() < 0:
             return None
-        
-        engine = self.__manager.engine(
-            self.__manager.allEnginesNames()[index.row()])
-        
+
+        engine = self.__manager.engine(self.__manager.allEnginesNames()[index.row()])
+
         if engine is None:
             return None
-        
+
         if index.column() == 0:
             if role == Qt.ItemDataRole.DisplayRole:
                 return engine.name()
-                
+
             elif role == Qt.ItemDataRole.DecorationRole:
                 image = engine.image()
                 if image.isNull():
                     from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
                     icon = WebBrowserWindow.icon(QUrl(engine.imageUrl()))
                 else:
                     icon = QIcon(QPixmap.fromImage(image))
                 return icon
-                
+
             elif role == Qt.ItemDataRole.ToolTipRole:
-                description = self.tr(
-                    "<strong>Description:</strong> {0}"
-                ).format(engine.description())
+                description = self.tr("<strong>Description:</strong> {0}").format(
+                    engine.description()
+                )
                 if engine.providesSuggestions():
                     description += "<br/>"
                     description += self.tr(
-                        "<strong>Provides contextual suggestions</strong>")
-                
+                        "<strong>Provides contextual suggestions</strong>"
+                    )
+
                 return description
         elif index.column() == 1:
             if role in [Qt.ItemDataRole.EditRole, Qt.ItemDataRole.DisplayRole]:
@@ -157,14 +156,15 @@
                 return self.tr(
                     "Comma-separated list of keywords that may"
                     " be entered in the location bar followed by search terms"
-                    " to search with this engine")
-        
+                    " to search with this engine"
+                )
+
         return None
-    
+
     def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
         """
         Public method to set the data of a model cell.
-        
+
         @param index index of the model cell (QModelIndex)
         @param value value to be set
         @param role role of the data (integer)
@@ -172,39 +172,37 @@
         """
         if not index.isValid() or index.column() != 1:
             return False
-        
+
         if index.row() >= self.rowCount() or index.row() < 0:
             return False
-        
+
         if role != Qt.ItemDataRole.EditRole:
             return False
-        
+
         engineName = self.__manager.allEnginesNames()[index.row()]
         keywords = re.split("[ ,]+", value)
-        self.__manager.setKeywordsForEngine(
-            self.__manager.engine(engineName), keywords)
-        
+        self.__manager.setKeywordsForEngine(self.__manager.engine(engineName), keywords)
+
         return True
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
-        
+
         return None
-    
+
     def __enginesChanged(self):
         """
         Private slot handling a change of the registered engines.
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,9 +10,7 @@
 import os
 import contextlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, QObject, QUrl, QFile, QDir, QIODevice, QUrlQuery
-)
+from PyQt6.QtCore import pyqtSignal, QObject, QUrl, QFile, QDir, QIODevice, QUrlQuery
 from PyQt6.QtWidgets import QLineEdit, QInputDialog
 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply
 
@@ -27,164 +25,166 @@
 class OpenSearchManager(QObject):
     """
     Class implementing a manager for open search engines.
-    
+
     @signal changed() emitted to indicate a change
     @signal currentEngineChanged() emitted to indicate a change of
             the current search engine
     """
+
     changed = pyqtSignal()
     currentEngineChanged = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         if parent is None:
             parent = ericApp()
         super().__init__(parent)
-        
+
         self.__replies = []
         self.__engines = {}
         self.__keywords = {}
         self.__current = ""
         self.__loading = False
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
-        
+
         self.load()
-    
+
     def close(self):
         """
         Public method to close the open search engines manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def currentEngineName(self):
         """
         Public method to get the name of the current search engine.
-        
+
         @return name of the current search engine (string)
         """
         return self.__current
-    
+
     def setCurrentEngineName(self, name):
         """
         Public method to set the current engine by name.
-        
+
         @param name name of the new current engine (string)
         """
         if name not in self.__engines:
             return
-        
+
         self.__current = name
         self.currentEngineChanged.emit()
         self.changed.emit()
-    
+
     def currentEngine(self):
         """
         Public method to get a reference to the current engine.
-        
+
         @return reference to the current engine (OpenSearchEngine)
         """
         if not self.__current or self.__current not in self.__engines:
             return None
-        
+
         return self.__engines[self.__current]
-    
+
     def setCurrentEngine(self, engine):
         """
         Public method to set the current engine.
-        
+
         @param engine reference to the new current engine (OpenSearchEngine)
         """
         if engine is None:
             return
-        
+
         for engineName in self.__engines:
             if self.__engines[engineName] == engine:
                 self.setCurrentEngineName(engineName)
                 break
-    
+
     def engine(self, name):
         """
         Public method to get a reference to the named engine.
-        
+
         @param name name of the engine (string)
         @return reference to the engine (OpenSearchEngine)
         """
         if name not in self.__engines:
             return None
-        
+
         return self.__engines[name]
-    
+
     def engineExists(self, name):
         """
         Public method to check, if an engine exists.
-        
+
         @param name name of the engine (string)
         @return flag indicating an existing engine (boolean)
         """
         return name in self.__engines
-    
+
     def allEnginesNames(self):
         """
         Public method to get a list of all engine names.
-        
+
         @return sorted list of all engine names (list of strings)
         """
         return sorted(self.__engines.keys())
-    
+
     def enginesCount(self):
         """
         Public method to get the number of available engines.
-        
+
         @return number of engines (integer)
         """
         return len(self.__engines)
-    
+
     def addEngine(self, engine):
         """
         Public method to add a new search engine.
-        
+
         @param engine URL of the engine definition file (QUrl) or
             name of a file containing the engine definition (string)
             or reference to an engine object (OpenSearchEngine)
         @return flag indicating success (boolean)
         """
         from .OpenSearchEngine import OpenSearchEngine
+
         if isinstance(engine, QUrl):
             return self.__addEngineByUrl(engine)
         elif isinstance(engine, OpenSearchEngine):
             return self.__addEngineByEngine(engine)
         else:
             return self.__addEngineByFile(engine)
-    
+
     def __addEngineByUrl(self, url):
         """
         Private method to add a new search engine given its URL.
-        
+
         @param url URL of the engine definition file (QUrl)
         @return flag indicating success (boolean)
         """
         if not url.isValid():
             return False
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
 
         reply = WebBrowserWindow.networkManager().get(QNetworkRequest(url))
         reply.finished.connect(lambda: self.__engineFromUrlAvailable(reply))
         reply.setParent(self)
         self.__replies.append(reply)
-        
+
         return True
-    
+
     def __addEngineByFile(self, filename):
         """
         Private method to add a new search engine given a filename.
-        
+
         @param filename name of a file containing the engine definition
             (string)
         @return flag indicating success (boolean)
@@ -192,44 +192,45 @@
         file_ = QFile(filename)
         if not file_.open(QIODevice.OpenModeFlag.ReadOnly):
             return False
-        
+
         from .OpenSearchReader import OpenSearchReader
+
         reader = OpenSearchReader()
         engine = reader.read(file_)
-        
+
         if not self.__addEngineByEngine(engine):
             return False
-        
+
         return True
-    
+
     def __addEngineByEngine(self, engine):
         """
         Private method to add a new search engine given a reference to an
         engine.
-        
+
         @param engine reference to an engine object (OpenSearchEngine)
         @return flag indicating success (boolean)
         """
         if engine is None:
             return False
-        
+
         if not engine.isValid():
             return False
-        
+
         if engine.name() in self.__engines:
             return False
-        
+
         engine.setParent(self)
         self.__engines[engine.name()] = engine
-        
+
         self.changed.emit()
-        
+
         return True
-    
+
     def addEngineFromForm(self, res, view):
         """
         Public method to add a new search engine from a form.
-        
+
         @param res result of the JavaScript run on by
             WebBrowserView.__addSearchEngine()
         @type dict or None
@@ -238,165 +239,168 @@
         """
         if not res:
             return
-        
+
         method = res["method"]
         actionUrl = QUrl(res["action"])
         inputName = res["inputName"]
-        
+
         if method != "get":
             EricMessageBox.warning(
                 self,
                 self.tr("Method not supported"),
-                self.tr(
-                    """{0} method is not supported.""").format(method.upper()))
+                self.tr("""{0} method is not supported.""").format(method.upper()),
+            )
             return
-        
+
         if actionUrl.isRelative():
             actionUrl = view.url().resolved(actionUrl)
-        
+
         searchUrlQuery = QUrlQuery(actionUrl)
         searchUrlQuery.addQueryItem(inputName, "{searchTerms}")
-        
+
         inputFields = res["inputs"]
         for inputField in inputFields:
             name = inputField[0]
             value = inputField[1]
-            
+
             if not name or name == inputName or not value:
                 continue
-            
+
             searchUrlQuery.addQueryItem(name, value)
-        
+
         engineName, ok = QInputDialog.getText(
             view,
             self.tr("Engine name"),
             self.tr("Enter a name for the engine"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if not ok:
             return
-        
+
         actionUrl.setQuery(searchUrlQuery)
-        
+
         from .OpenSearchEngine import OpenSearchEngine
+
         engine = OpenSearchEngine()
         engine.setName(engineName)
         engine.setDescription(engineName)
         engine.setSearchUrlTemplate(
-            actionUrl.toDisplayString(
-                QUrl.ComponentFormattingOption.FullyDecoded))
+            actionUrl.toDisplayString(QUrl.ComponentFormattingOption.FullyDecoded)
+        )
         engine.setImage(view.icon().pixmap(16, 16).toImage())
-        
+
         self.__addEngineByEngine(engine)
-    
+
     def removeEngine(self, name):
         """
         Public method to remove an engine.
-        
+
         @param name name of the engine (string)
         """
         if len(self.__engines) <= 1:
             return
-        
+
         if name not in self.__engines:
             return
-        
+
         engine = self.__engines[name]
-        for keyword in [k for k in self.__keywords
-                        if self.__keywords[k] == engine]:
+        for keyword in [k for k in self.__keywords if self.__keywords[k] == engine]:
             del self.__keywords[keyword]
         del self.__engines[name]
-        
+
         file_ = QDir(self.enginesDirectory()).filePath(
-            self.generateEngineFileName(name))
+            self.generateEngineFileName(name)
+        )
         os.unlink(file_)
-        
+
         if name == self.__current:
             self.setCurrentEngineName(list(self.__engines.keys())[0])
-        
+
         self.changed.emit()
-    
+
     def generateEngineFileName(self, engineName):
         """
         Public method to generate a valid engine file name.
-        
+
         @param engineName name of the engine (string)
         @return valid engine file name (string)
         """
         fileName = ""
-        
+
         # strip special characters
         for c in engineName:
             if c.isspace():
-                fileName += '_'
+                fileName += "_"
                 continue
-            
+
             if c.isalnum():
                 fileName += c
-        
+
         fileName += ".xml"
-        
+
         return fileName
-    
+
     def saveDirectory(self, dirName):
         """
         Public method to save the search engine definitions to files.
-        
+
         @param dirName name of the directory to write the files to (string)
         """
         qdir = QDir()
         if not qdir.mkpath(dirName):
             return
         qdir.setPath(dirName)
-        
+
         from .OpenSearchWriter import OpenSearchWriter
+
         writer = OpenSearchWriter()
-        
+
         for engine in list(self.__engines.values()):
             name = self.generateEngineFileName(engine.name())
             fileName = qdir.filePath(name)
-            
+
             file = QFile(fileName)
             if not file.open(QIODevice.OpenModeFlag.WriteOnly):
                 continue
-            
+
             writer.write(file, engine)
-    
+
     def save(self):
         """
         Public method to save the search engines configuration.
         """
         if self.__loading:
             return
-        
+
         self.saveDirectory(self.enginesDirectory())
-        
+
         Preferences.setWebBrowser("WebSearchEngine", self.__current)
         keywords = []
         for k in self.__keywords:
             if self.__keywords[k]:
                 keywords.append((k, self.__keywords[k].name()))
         Preferences.setWebBrowser("WebSearchKeywords", keywords)
-    
+
     def loadDirectory(self, dirName):
         """
         Public method to load the search engine definitions from files.
-        
+
         @param dirName name of the directory to load the files from (string)
         @return flag indicating success (boolean)
         """
         if not os.path.exists(dirName):
             return False
-        
+
         success = False
-        
+
         qdir = QDir(dirName)
         for name in qdir.entryList(["*.xml"]):
             fileName = qdir.filePath(name)
             if self.__addEngineByFile(fileName):
                 success = True
-        
+
         return success
-    
+
     def load(self):
         """
         Public method to load the search engines configuration.
@@ -404,22 +408,19 @@
         self.__loading = True
         self.__current = Preferences.getWebBrowser("WebSearchEngine")
         keywords = Preferences.getWebBrowser("WebSearchKeywords")
-        
+
         if not self.loadDirectory(self.enginesDirectory()):
             self.restoreDefaults()
-        
+
         for keyword, engineName in keywords:
             self.__keywords[keyword] = self.engine(engineName)
-        
-        if (
-            self.__current not in self.__engines and
-            len(self.__engines) > 0
-        ):
+
+        if self.__current not in self.__engines and len(self.__engines) > 0:
             self.__current = list(self.__engines.keys())[0]
-        
+
         self.__loading = False
         self.currentEngineChanged.emit()
-    
+
     def restoreDefaults(self):
         """
         Public method to restore the default search engines.
@@ -427,86 +428,88 @@
         from .OpenSearchReader import OpenSearchReader
 
         reader = OpenSearchReader()
-        defaultEnginesDirectory = os.path.join(os.path.dirname(__file__),
-                                               "DefaultSearchEngines")
-        for engineFileName in (
-            QDir(defaultEnginesDirectory, "*.xml").entryList()
-        ):
-            engineFile = QFile(os.path.join(defaultEnginesDirectory,
-                                            engineFileName))
+        defaultEnginesDirectory = os.path.join(
+            os.path.dirname(__file__), "DefaultSearchEngines"
+        )
+        for engineFileName in QDir(defaultEnginesDirectory, "*.xml").entryList():
+            engineFile = QFile(os.path.join(defaultEnginesDirectory, engineFileName))
             if not engineFile.open(QIODevice.OpenModeFlag.ReadOnly):
                 continue
             engine = reader.read(engineFile)
             self.__addEngineByEngine(engine)
-    
+
     def enginesDirectory(self):
         """
         Public method to determine the directory containing the search engine
         descriptions.
-        
+
         @return directory name (string)
         """
-        return os.path.join(
-            Utilities.getConfigDir(), "web_browser", "searchengines")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "searchengines")
+
     def __confirmAddition(self, engine):
         """
         Private method to confirm the addition of a new search engine.
-        
+
         @param engine reference to the engine to be added (OpenSearchEngine)
         @return flag indicating the engine shall be added (boolean)
         """
         if engine is None or not engine.isValid():
             return False
-        
+
         host = QUrl(engine.searchUrlTemplate()).host()
-        
+
         res = EricMessageBox.yesNo(
             None,
             "",
             self.tr(
                 """<p>Do you want to add the following engine to your"""
                 """ list of search engines?<br/><br/>Name: {0}<br/>"""
-                """Searches on: {1}</p>""").format(engine.name(), host))
+                """Searches on: {1}</p>"""
+            ).format(engine.name(), host),
+        )
         return res
-    
+
     def __engineFromUrlAvailable(self, reply):
         """
         Private slot to add a search engine from the net.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         reply.close()
         if reply in self.__replies:
             self.__replies.remove(reply)
-        
+
         if reply.error() == QNetworkReply.NetworkError.NoError:
             from .OpenSearchReader import OpenSearchReader
+
             reader = OpenSearchReader()
             engine = reader.read(reply)
-            
+
             if not engine.isValid():
                 return
-            
+
             if self.engineExists(engine.name()):
                 return
-            
+
             if not self.__confirmAddition(engine):
                 return
-            
+
             if not self.__addEngineByEngine(engine):
                 return
         else:
             # some error happened
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             WebBrowserWindow.getWindow().statusBar().showMessage(
-                reply.errorString(), 10000)
-    
+                reply.errorString(), 10000
+            )
+
     def convertKeywordSearchToUrl(self, keywordSearch):
         """
         Public method to get the search URL for a keyword search.
-        
+
         @param keywordSearch search string for keyword search (string)
         @return search URL (QUrl)
         """
@@ -514,77 +517,77 @@
             keyword, term = keywordSearch.split(" ", 1)
         except ValueError:
             return QUrl()
-        
+
         if not term:
             return QUrl()
-        
+
         engine = self.engineForKeyword(keyword)
         if engine:
             return engine.searchUrl(term)
-        
+
         return QUrl()
-    
+
     def engineForKeyword(self, keyword):
         """
         Public method to get the engine for a keyword.
-        
+
         @param keyword keyword to get engine for (string)
         @return reference to the search engine object (OpenSearchEngine)
         """
         if keyword and keyword in self.__keywords:
             return self.__keywords[keyword]
-        
+
         return None
-    
+
     def setEngineForKeyword(self, keyword, engine):
         """
         Public method to set the engine for a keyword.
-        
+
         @param keyword keyword to get engine for (string)
         @param engine reference to the search engine object (OpenSearchEngine)
             or None to remove the keyword
         """
         if not keyword:
             return
-        
+
         if engine is None:
             with contextlib.suppress(KeyError):
                 del self.__keywords[keyword]
         else:
             self.__keywords[keyword] = engine
-        
+
         self.changed.emit()
-    
+
     def keywordsForEngine(self, engine):
         """
         Public method to get the keywords for a given engine.
-        
+
         @param engine reference to the search engine object (OpenSearchEngine)
         @return list of keywords (list of strings)
         """
         return [k for k in self.__keywords if self.__keywords[k] == engine]
-    
+
     def setKeywordsForEngine(self, engine, keywords):
         """
         Public method to set the keywords for an engine.
-        
+
         @param engine reference to the search engine object (OpenSearchEngine)
         @param keywords list of keywords (list of strings)
         """
         if engine is None:
             return
-        
+
         for keyword in self.keywordsForEngine(engine):
             del self.__keywords[keyword]
-        
+
         for keyword in keywords:
             if not keyword:
                 continue
-            
+
             self.__keywords[keyword] = engine
-        
+
         self.changed.emit()
-    
+
     def enginesChanged(self):
         """
         Public slot to tell the search engine manager, that something has
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,119 +14,116 @@
     """
     Class implementing a reader for open search engine descriptions.
     """
+
     def read(self, device):
         """
         Public method to read the description.
-        
+
         @param device device to read the description from (QIODevice)
         @return search engine object (OpenSearchEngine)
         """
         self.clear()
-        
+
         if not device.isOpen():
             device.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         self.setDevice(device)
         return self.__read()
-    
+
     def __read(self):
         """
         Private method to read and parse the description.
-        
+
         @return search engine object (OpenSearchEngine)
         """
         from .OpenSearchEngine import OpenSearchEngine
+
         engine = OpenSearchEngine()
-        
+
         while not self.isStartElement() and not self.atEnd():
             self.readNext()
-        
+
         if (
-            self.name() != "OpenSearchDescription" or
-            self.namespaceUri() != "http://a9.com/-/spec/opensearch/1.1/"
+            self.name() != "OpenSearchDescription"
+            or self.namespaceUri() != "http://a9.com/-/spec/opensearch/1.1/"
         ):
-            self.raiseError(QCoreApplication.translate(
-                "OpenSearchReader",
-                "The file is not an OpenSearch 1.1 file."))
+            self.raiseError(
+                QCoreApplication.translate(
+                    "OpenSearchReader", "The file is not an OpenSearch 1.1 file."
+                )
+            )
             return engine
-        
+
         while not self.atEnd():
             self.readNext()
-            
+
             if not self.isStartElement():
                 continue
-            
+
             if self.name() == "ShortName":
                 engine.setName(self.readElementText())
-                
+
             elif self.name() == "Description":
                 engine.setDescription(self.readElementText())
-                
+
             elif self.name() == "Url":
                 type_ = self.attributes().value("type")
                 url = self.attributes().value("template")
                 method = self.attributes().value("method")
-                
+
                 if (
-                    type_ == "application/x-suggestions+json" and
-                    engine.suggestionsUrlTemplate()
-                ):
-                    continue
-                
-                if (
-                    (not type_ or
-                     type_ in ("text/html", "application/xhtml+xml")) and
-                    engine.searchUrlTemplate()
+                    type_ == "application/x-suggestions+json"
+                    and engine.suggestionsUrlTemplate()
                 ):
                     continue
-                
+
+                if (
+                    not type_ or type_ in ("text/html", "application/xhtml+xml")
+                ) and engine.searchUrlTemplate():
+                    continue
+
                 if not url:
                     continue
-                
+
                 parameters = []
-                
+
                 self.readNext()
-                
+
                 while not (self.isEndElement() and self.name() == "Url"):
-                    if (
-                        not self.isStartElement() or
-                        (self.name() != "Param" and
-                         self.name() != "Parameter")
+                    if not self.isStartElement() or (
+                        self.name() != "Param" and self.name() != "Parameter"
                     ):
                         self.readNext()
                         continue
-                    
+
                     key = self.attributes().value("name")
                     value = self.attributes().value("value")
-                    
+
                     if key and value:
                         parameters.append((key, value))
-                    
+
                     while not self.isEndElement():
                         self.readNext()
-                
+
                 if type_ == "application/x-suggestions+json":
                     engine.setSuggestionsUrlTemplate(url)
                     engine.setSuggestionsParameters(parameters)
                     engine.setSuggestionsMethod(method)
-                elif (
-                    not type_ or
-                    type_ in ("text/html", "application/xhtml+xml")
-                ):
+                elif not type_ or type_ in ("text/html", "application/xhtml+xml"):
                     engine.setSearchUrlTemplate(url)
                     engine.setSearchParameters(parameters)
                     engine.setSearchMethod(method)
-                
+
             elif self.name() == "Image":
                 engine.setImageUrl(self.readElementText())
-            
+
             if (
-                engine.name() and
-                engine.description() and
-                engine.suggestionsUrlTemplate() and
-                engine.searchUrlTemplate() and
-                engine.imageUrl()
+                engine.name()
+                and engine.description()
+                and engine.suggestionsUrlTemplate()
+                and engine.searchUrlTemplate()
+                and engine.imageUrl()
             ):
                 break
-        
+
         return engine
--- a/src/eric7/WebBrowser/OpenSearch/OpenSearchWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/OpenSearch/OpenSearchWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,87 +14,85 @@
     """
     Class implementing a writer for open search engine descriptions.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.setAutoFormatting(True)
-    
+
     def write(self, device, engine):
         """
         Public method to write the description of an engine.
-        
+
         @param device reference to the device to write to (QIODevice)
         @param engine reference to the engine (OpenSearchEngine)
         @return flag indicating success (boolean)
         """
         if engine is None:
             return False
-        
-        if (
-            not device.isOpen() and
-            not device.open(QIODevice.OpenModeFlag.WriteOnly)
-        ):
+
+        if not device.isOpen() and not device.open(QIODevice.OpenModeFlag.WriteOnly):
             return False
-        
+
         self.setDevice(device)
         self.__write(engine)
         return True
-    
+
     def __write(self, engine):
         """
         Private method to write the description of an engine.
-        
+
         @param engine reference to the engine (OpenSearchEngine)
         """
         self.writeStartDocument()
         self.writeStartElement("OpenSearchDescription")
         self.writeDefaultNamespace("http://a9.com/-/spec/opensearch/1.1/")
-        
+
         if engine.name():
             self.writeTextElement("ShortName", engine.name())
-        
+
         if engine.description():
             self.writeTextElement("Description", engine.description())
-        
+
         if engine.searchUrlTemplate():
             self.writeStartElement("Url")
             self.writeAttribute("method", engine.searchMethod())
             self.writeAttribute("type", "text/html")
             self.writeAttribute("template", engine.searchUrlTemplate())
-            
+
             if len(engine.searchParameters()) > 0:
                 self.writeNamespace(
-                    "http://a9.com/-/spec/opensearch/extensions/"
-                    "parameters/1.0/", "p")
+                    "http://a9.com/-/spec/opensearch/extensions/" "parameters/1.0/", "p"
+                )
                 for parameter in engine.searchParameters():
                     self.writeStartElement("p:Parameter")
                     self.writeAttribute("name", parameter[0])
                     self.writeAttribute("value", parameter[1])
-            
+
             self.writeEndElement()
-        
+
         if engine.suggestionsUrlTemplate():
             self.writeStartElement("Url")
             self.writeAttribute("method", engine.suggestionsMethod())
             self.writeAttribute("type", "application/x-suggestions+json")
             self.writeAttribute("template", engine.suggestionsUrlTemplate())
-            
+
             if len(engine.suggestionsParameters()) > 0:
                 self.writeNamespace(
-                    "http://a9.com/-/spec/opensearch/extensions/"
-                    "parameters/1.0/", "p")
+                    "http://a9.com/-/spec/opensearch/extensions/" "parameters/1.0/", "p"
+                )
                 for parameter in engine.suggestionsParameters():
                     self.writeStartElement("p:Parameter")
                     self.writeAttribute("name", parameter[0])
                     self.writeAttribute("value", parameter[1])
-            
+
             self.writeEndElement()
-        
+
         if engine.imageUrl():
             self.writeTextElement("Image", engine.imageUrl())
-        
+
         self.writeEndElement()
         self.writeEndDocument()
--- a/src/eric7/WebBrowser/PageScreenDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/PageScreenDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,11 @@
     """
     Class implementing a dialog to save a screenshot of a web page.
     """
+
     def __init__(self, view, parent=None):
         """
         Constructor
-        
+
         @param view reference to the web view containing the page to be saved
             (WebBrowserView)
         @param parent reference to the parent widget (QWidget)
@@ -33,11 +34,11 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__view = view
         self.__createPixmap()
         self.pageScreenLabel.setPixmap(self.__pagePixmap)
-    
+
     def __createPixmap(self):
         """
         Private slot to create a pixmap of the associated view's page.
@@ -54,18 +55,19 @@
             "})()"
         )
         if res is not None:
-            image = QImage(QSize(res["width"], self.__view.height()),
-                           QImage.Format.Format_ARGB32)
+            image = QImage(
+                QSize(res["width"], self.__view.height()), QImage.Format.Format_ARGB32
+            )
             painter = QPainter(image)
             self.__view.render(painter)
             painter.end()
-            
+
             self.__pagePixmap = QPixmap.fromImage(image)
-    
+
     def __savePageScreen(self):
         """
         Private slot to save the page screen.
-        
+
         @return flag indicating success (boolean)
         """
         fileName = EricFileDialog.getSaveFileName(
@@ -73,44 +75,45 @@
             self.tr("Save Page Screen"),
             self.tr("screen.png"),
             self.tr("Portable Network Graphics File (*.png)"),
-            EricFileDialog.DontConfirmOverwrite)
+            EricFileDialog.DontConfirmOverwrite,
+        )
         if not fileName:
             return False
-        
+
         if pathlib.Path(fileName).exists():
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Save Page Screen"),
-                self.tr("<p>The file <b>{0}</b> already exists."
-                        " Overwrite it?</p>").format(fileName),
-                icon=EricMessageBox.Warning)
+                self.tr(
+                    "<p>The file <b>{0}</b> already exists." " Overwrite it?</p>"
+                ).format(fileName),
+                icon=EricMessageBox.Warning,
+            )
             if not res:
                 return False
-        
+
         res = self.__pagePixmap.save(fileName)
         if not res:
             EricMessageBox.warning(
                 self,
                 self.tr("Save Page Screen"),
-                self.tr("Cannot write file '{0}'.").format(fileName))
+                self.tr("Cannot write file '{0}'.").format(fileName),
+            )
             return False
-        
+
         return True
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle clicks of the dialog buttons.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Cancel
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel):
             self.reject()
         elif (
-            button == self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Save) and
-            self.__savePageScreen()
+            button == self.buttonBox.button(QDialogButtonBox.StandardButton.Save)
+            and self.__savePageScreen()
         ):
             self.accept()
--- a/src/eric7/WebBrowser/Passwords/LoginForm.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/LoginForm.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,6 +14,7 @@
     """
     Class implementing a data structure for login forms.
     """
+
     def __init__(self):
         """
         Constructor
@@ -21,14 +22,11 @@
         self.url = QUrl()
         self.name = ""
         self.postData = ""
-    
+
     def isValid(self):
         """
         Public method to test for validity.
-        
+
         @return flag indicating a valid form (boolean)
         """
-        return (
-            not self.url.isEmpty() and
-            bool(self.postData)
-        )
+        return not self.url.isEmpty() and bool(self.postData)
--- a/src/eric7/WebBrowser/Passwords/PasswordManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/PasswordManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,7 +10,12 @@
 import os
 
 from PyQt6.QtCore import (
-    pyqtSignal, QObject, QByteArray, QUrl, QCoreApplication, QXmlStreamReader
+    pyqtSignal,
+    QObject,
+    QByteArray,
+    QUrl,
+    QCoreApplication,
+    QXmlStreamReader,
 )
 from PyQt6.QtWidgets import QApplication
 from PyQt6.QtWebEngineCore import QWebEngineScript
@@ -31,21 +36,22 @@
 class PasswordManager(QObject):
     """
     Class implementing the password manager.
-    
+
     @signal changed() emitted to indicate a change
     @signal passwordsSaved() emitted after the passwords were saved
     """
+
     changed = pyqtSignal()
     passwordsSaved = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         # setup userscript to monitor forms
         script = QWebEngineScript()
         script.setName("_eric_passwordmonitor")
@@ -55,52 +61,53 @@
         script.setSourceCode(Scripts.setupFormObserver())
         profile = WebBrowser.WebBrowserWindow.WebBrowserWindow.webProfile()
         profile.scripts().insert(script)
-        
+
         self.__logins = {}
         self.__loginForms = {}
         self.__never = []
         self.__loaded = False
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
-    
+
     def clear(self):
         """
         Public slot to clear the saved passwords.
         """
         if not self.__loaded:
             self.__load()
-        
+
         self.__logins = {}
         self.__loginForms = {}
         self.__never = []
         self.__saveTimer.changeOccurred()
         self.__saveTimer.saveIfNeccessary()
-        
+
         self.changed.emit()
-    
+
     def getLogin(self, url, realm):
         """
         Public method to get the login credentials.
-        
+
         @param url URL to get the credentials for (QUrl)
         @param realm realm to get the credentials for (string)
         @return tuple containing the user name (string) and password (string)
         """
         if not self.__loaded:
             self.__load()
-        
+
         key = self.__createKey(url, realm)
         try:
             return self.__logins[key][0], Utilities.crypto.pwConvert(
-                self.__logins[key][1], encode=False)
+                self.__logins[key][1], encode=False
+            )
         except KeyError:
             return "", ""
-    
+
     def setLogin(self, url, realm, username, password):
         """
         Public method to set the login credentials.
-        
+
         @param url URL to set the credentials for (QUrl)
         @param realm realm to set the credentials for (string)
         @param username username for the login (string)
@@ -108,18 +115,18 @@
         """
         if not self.__loaded:
             self.__load()
-        
+
         key = self.__createKey(url, realm)
         self.__logins[key] = (
             username,
-            Utilities.crypto.pwConvert(password, encode=True)
+            Utilities.crypto.pwConvert(password, encode=True),
         )
         self.changed.emit()
-    
+
     def __createKey(self, url, realm):
         """
         Private method to create the key string for the login credentials.
-        
+
         @param url URL to get the credentials for (QUrl)
         @param realm realm to get the credentials for (string)
         @return key string (string)
@@ -129,89 +136,93 @@
             authority = authority[1:]
         key = (
             "{0}://{1} ({2})".format(url.scheme(), authority, realm)
-            if realm else
-            "{0}://{1}".format(url.scheme(), authority)
+            if realm
+            else "{0}://{1}".format(url.scheme(), authority)
         )
         return key
-    
+
     def getFileName(self):
         """
         Public method to get the file name of the passwords file.
-        
+
         @return name of the passwords file (string)
         """
-        return os.path.join(Utilities.getConfigDir(),
-                            "web_browser", "logins.xml")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "logins.xml")
+
     def save(self):
         """
         Public slot to save the login entries to disk.
         """
         if not self.__loaded:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.isPrivate():
             from .PasswordWriter import PasswordWriter
+
             loginFile = self.getFileName()
             writer = PasswordWriter()
             if not writer.write(
-                    loginFile, self.__logins, self.__loginForms, self.__never):
+                loginFile, self.__logins, self.__loginForms, self.__never
+            ):
                 EricMessageBox.critical(
                     None,
                     self.tr("Saving login data"),
                     self.tr(
-                        """<p>Login data could not be saved to"""
-                        """ <b>{0}</b></p>"""
-                    ).format(loginFile))
+                        """<p>Login data could not be saved to""" """ <b>{0}</b></p>"""
+                    ).format(loginFile),
+                )
             else:
                 self.passwordsSaved.emit()
-    
+
     def __load(self):
         """
         Private method to load the saved login credentials.
         """
         if self.__loaded:
             return
-        
+
         loginFile = self.getFileName()
         if os.path.exists(loginFile):
             from .PasswordReader import PasswordReader
+
             reader = PasswordReader()
-            self.__logins, self.__loginForms, self.__never = reader.read(
-                loginFile)
+            self.__logins, self.__loginForms, self.__never = reader.read(loginFile)
             if reader.error() != QXmlStreamReader.Error.NoError:
                 EricMessageBox.warning(
                     None,
                     self.tr("Loading login data"),
-                    self.tr("""Error when loading login data on"""
-                            """ line {0}, column {1}:\n{2}""")
-                    .format(reader.lineNumber(),
-                            reader.columnNumber(),
-                            reader.errorString()))
-        
+                    self.tr(
+                        """Error when loading login data on"""
+                        """ line {0}, column {1}:\n{2}"""
+                    ).format(
+                        reader.lineNumber(), reader.columnNumber(), reader.errorString()
+                    ),
+                )
+
         self.__loaded = True
-    
+
     def reload(self):
         """
         Public method to reload the login data.
         """
         if not self.__loaded:
             return
-        
+
         self.__loaded = False
         self.__load()
-    
+
     def close(self):
         """
         Public method to close the passwords manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def removePassword(self, site):
         """
         Public method to remove a password entry.
-        
+
         @param site web site name (string)
         """
         if site in self.__logins:
@@ -219,49 +230,50 @@
             if site in self.__loginForms:
                 del self.__loginForms[site]
             self.changed.emit()
-    
+
     def allSiteNames(self):
         """
         Public method to get a list of all site names.
-        
+
         @return sorted list of all site names (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return sorted(self.__logins.keys())
-    
+
     def sitesCount(self):
         """
         Public method to get the number of available sites.
-        
+
         @return number of sites (integer)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return len(self.__logins)
-    
+
     def siteInfo(self, site):
         """
         Public method to get a reference to the named site.
-        
+
         @param site web site name (string)
         @return tuple containing the user name (string) and password (string)
         """
         if not self.__loaded:
             self.__load()
-        
+
         if site not in self.__logins:
             return None
-        
+
         return self.__logins[site][0], Utilities.crypto.pwConvert(
-            self.__logins[site][1], encode=False)
-    
+            self.__logins[site][1], encode=False
+        )
+
     def formSubmitted(self, urlStr, userName, password, data, page):
         """
         Public method to record login data.
-        
+
         @param urlStr form submission URL
         @type str
         @param userName name of the user
@@ -276,16 +288,16 @@
         # shall passwords be saved?
         if not Preferences.getUser("SavePasswords"):
             return
-        
+
         if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
             return
-        
+
         if not self.__loaded:
             self.__load()
-        
+
         if urlStr in self.__never:
             return
-        
+
         if userName and password:
             url = QUrl(urlStr)
             url = self.__stripUrl(url)
@@ -298,13 +310,15 @@
                         """<b>Would you like to save this password?</b><br/>"""
                         """To review passwords you have saved and remove"""
                         """ them, use the password management dialog of the"""
-                        """ Settings menu."""),
-                    modal=True, parent=page.view())
+                        """ Settings menu."""
+                    ),
+                    modal=True,
+                    parent=page.view(),
+                )
                 neverButton = mb.addButton(
-                    self.tr("Never for this site"),
-                    EricMessageBox.DestructiveRole)
-                noButton = mb.addButton(
-                    self.tr("Not now"), EricMessageBox.RejectRole)
+                    self.tr("Never for this site"), EricMessageBox.DestructiveRole
+                )
+                noButton = mb.addButton(self.tr("Not now"), EricMessageBox.RejectRole)
                 mb.addButton(EricMessageBox.Yes)
                 mb.exec()
                 if mb.clickedButton() == neverButton:
@@ -312,111 +326,114 @@
                     return
                 elif mb.clickedButton() == noButton:
                     return
-        
+
             self.__logins[key] = (
                 userName,
-                Utilities.crypto.pwConvert(password, encode=True)
+                Utilities.crypto.pwConvert(password, encode=True),
             )
             from .LoginForm import LoginForm
+
             form = LoginForm()
             form.url = url
             form.name = userName
             form.postData = Utilities.crypto.pwConvert(
-                bytes(data).decode("utf-8"), encode=True)
+                bytes(data).decode("utf-8"), encode=True
+            )
             self.__loginForms[key] = form
             self.changed.emit()
-    
+
     def __stripUrl(self, url):
         """
         Private method to strip off all unneeded parts of a URL.
-        
+
         @param url URL to be stripped (QUrl)
         @return stripped URL (QUrl)
         """
         cleanUrl = QUrl(url)
         cleanUrl.setQuery("")
         cleanUrl.setUserInfo("")
-        
+
         authority = cleanUrl.authority()
         if authority.startswith("@"):
             authority = authority[1:]
-        cleanUrl = QUrl("{0}://{1}{2}".format(
-            cleanUrl.scheme(), authority, cleanUrl.path()))
+        cleanUrl = QUrl(
+            "{0}://{1}{2}".format(cleanUrl.scheme(), authority, cleanUrl.path())
+        )
         cleanUrl.setFragment("")
         return cleanUrl
-    
+
     def completePage(self, page):
         """
         Public slot to complete login forms with saved data.
-        
+
         @param page reference to the web page (WebBrowserPage)
         """
         if page is None:
             return
-        
+
         if not self.__loaded:
             self.__load()
-        
+
         url = page.url()
         url = self.__stripUrl(url)
         key = self.__createKey(url, "")
-        if (
-            key not in self.__loginForms or
-            key not in self.__logins
-        ):
+        if key not in self.__loginForms or key not in self.__logins:
             return
-        
+
         form = self.__loginForms[key]
         if form.url != url:
             return
-        
-        postData = QByteArray(Utilities.crypto.pwConvert(
-            form.postData, encode=False).encode("utf-8"))
+
+        postData = QByteArray(
+            Utilities.crypto.pwConvert(form.postData, encode=False).encode("utf-8")
+        )
         script = Scripts.completeFormData(postData)
         page.runJavaScript(script, WebBrowserPage.SafeJsWorld)
-    
+
     def masterPasswordChanged(self, oldPassword, newPassword):
         """
         Public slot to handle the change of the master password.
-        
+
         @param oldPassword current master password (string)
         @param newPassword new master password (string)
         """
         if not self.__loaded:
             self.__load()
-        
+
         progress = EricProgressDialog(
             self.tr("Re-encoding saved passwords..."),
-            None, 0, len(self.__logins) + len(self.__loginForms),
+            None,
+            0,
+            len(self.__logins) + len(self.__loginForms),
             self.tr("%v/%m Passwords"),
-            QApplication.activeModalWidget())
+            QApplication.activeModalWidget(),
+        )
         progress.setMinimumDuration(0)
         progress.setWindowTitle(self.tr("Passwords"))
         count = 0
-        
+
         # step 1: do the logins
         for key in self.__logins:
             progress.setValue(count)
             QCoreApplication.processEvents()
             username, pwHash = self.__logins[key]
-            pwHash = Utilities.crypto.pwRecode(
-                pwHash, oldPassword, newPassword)
+            pwHash = Utilities.crypto.pwRecode(pwHash, oldPassword, newPassword)
             self.__logins[key] = (username, pwHash)
             count += 1
-        
+
         # step 2: do the login forms
         for key in self.__loginForms:
             progress.setValue(count)
             QCoreApplication.processEvents()
             postData = self.__loginForms[key].postData
-            postData = Utilities.crypto.pwRecode(
-                postData, oldPassword, newPassword)
+            postData = Utilities.crypto.pwRecode(postData, oldPassword, newPassword)
             self.__loginForms[key].postData = postData
             count += 1
-        
+
         progress.setValue(len(self.__logins) + len(self.__loginForms))
         QCoreApplication.processEvents()
         self.changed.emit()
 
+
 #
 # eflag: noqa = Y113
--- a/src/eric7/WebBrowser/Passwords/PasswordModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/PasswordModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,55 +16,52 @@
     """
     Class implementing a model for password management.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the password manager (PasswordManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
         manager.changed.connect(self.__passwordsChanged)
-        
-        self.__headers = [
-            self.tr("Website"),
-            self.tr("Username"),
-            self.tr("Password")
-        ]
-        
+
+        self.__headers = [self.tr("Website"), self.tr("Username"), self.tr("Password")]
+
         self.__showPasswords = False
-    
+
     def setShowPasswords(self, on):
         """
         Public methods to show passwords.
-        
+
         @param on flag indicating if passwords shall be shown (boolean)
         """
         self.__showPasswords = on
         self.beginResetModel()
         self.endResetModel()
-    
+
     def showPasswords(self):
         """
         Public method to indicate, if passwords shall be shown.
-        
+
         @return flag indicating if passwords shall be shown (boolean)
         """
         return self.__showPasswords
-    
+
     def __passwordsChanged(self):
         """
         Private slot handling a change of the registered passwords.
         """
         self.beginResetModel()
         self.endResetModel()
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row start row (integer)
         @param count number of rows to remove (integer)
         @param parent parent index (QModelIndex)
@@ -72,42 +69,42 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         if count <= 0:
             return False
-        
+
         lastRow = row + count - 1
-        
+
         self.beginRemoveRows(parent, row, lastRow)
-        
+
         siteList = self.__manager.allSiteNames()
         for index in range(row, lastRow + 1):
             self.__manager.removePassword(siteList[index])
-        
+
         return True
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return self.__manager.sitesCount()
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex) (Unused)
         @return number of columns (integer)
         """
@@ -115,47 +112,46 @@
             return 3
         else:
             return 2
-    
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         if index.row() >= self.__manager.sitesCount() or index.row() < 0:
             return None
-        
+
         site = self.__manager.allSiteNames()[index.row()]
         siteInfo = self.__manager.siteInfo(site)
-        
+
         if siteInfo is None:
             return None
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if index.column() == 0:
                 return site
             elif index.column() in [1, 2]:
                 return siteInfo[index.column() - 1]
-        
+
         return None
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
-        
+
         return None
--- a/src/eric7/WebBrowser/Passwords/PasswordReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/PasswordReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,25 +7,24 @@
 Module implementing a class to read login data files.
 """
 
-from PyQt6.QtCore import (
-    QXmlStreamReader, QIODevice, QFile, QCoreApplication, QUrl
-)
+from PyQt6.QtCore import QXmlStreamReader, QIODevice, QFile, QCoreApplication, QUrl
 
 
 class PasswordReader(QXmlStreamReader):
     """
     Class implementing a reader object for login data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def read(self, fileNameOrDevice):
         """
         Public method to read a login data file.
-        
+
         @param fileNameOrDevice name of the file to read (string)
             or reference to the device to read (QIODevice)
         @return tuple containing the logins, forms and never URLs
@@ -33,7 +32,7 @@
         self.__logins = {}
         self.__loginForms = {}
         self.__never = []
-        
+
         if isinstance(fileNameOrDevice, QIODevice):
             self.setDevice(fileNameOrDevice)
         else:
@@ -42,35 +41,35 @@
                 return self.__logins, self.__loginForms, self.__never
             f.open(QIODevice.OpenModeFlag.ReadOnly)
             self.setDevice(f)
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 version = self.attributes().value("version")
-                if (
-                    self.name() == "Password" and
-                    (not version or version == "2.0")
-                ):
+                if self.name() == "Password" and (not version or version == "2.0"):
                     self.__readPasswords()
                 else:
-                    self.raiseError(QCoreApplication.translate(
-                        "PasswordReader",
-                        "The file is not a Passwords version 2.0 file."))
-        
+                    self.raiseError(
+                        QCoreApplication.translate(
+                            "PasswordReader",
+                            "The file is not a Passwords version 2.0 file.",
+                        )
+                    )
+
         return self.__logins, self.__loginForms, self.__never
-    
+
     def __readPasswords(self):
         """
         Private method to read and parse the login data file.
         """
         if not self.isStartElement() and self.name() != "Password":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 if self.name() == "Logins":
                     self.__readLogins()
@@ -80,14 +79,14 @@
                     self.__readNevers()
                 else:
                     self.__skipUnknownElement()
-    
+
     def __readLogins(self):
         """
         Private method to read the login information.
         """
         if not self.isStartElement() and self.name() != "Logins":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
@@ -95,7 +94,7 @@
                     continue
                 else:
                     break
-            
+
             if self.isStartElement():
                 if self.name() == "Login":
                     attributes = self.attributes()
@@ -105,30 +104,31 @@
                     self.__logins[key] = (user, password)
                 else:
                     self.__skipUnknownElement()
-    
+
     def __readForms(self):
         """
         Private method to read the forms information.
         """
         if not self.isStartElement() and self.name() != "Forms":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 if self.name() == "Form":
                     from .LoginForm import LoginForm
+
                     attributes = self.attributes()
                     key = attributes.value("key")
                     form = LoginForm()
                     form.url = QUrl(attributes.value("url"))
                     form.name = attributes.value("name")
-                    
+
                 elif self.name() == "PostData":
                     form.postData = self.readElementText()
                 else:
                     self.__skipUnknownElement()
-            
+
             if self.isEndElement():
                 if self.name() == "Form":
                     self.__loginForms[key] = form
@@ -137,14 +137,14 @@
                     continue
                 else:
                     break
-    
+
     def __readNevers(self):
         """
         Private method to read the never URLs.
         """
         if not self.isStartElement() and self.name() != "Nevers":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
@@ -152,24 +152,24 @@
                     continue
                 else:
                     break
-            
+
             if self.isStartElement():
                 if self.name() == "Never":
                     self.__never.append(self.attributes().value("url"))
                 else:
                     self.__skipUnknownElement()
-    
+
     def __skipUnknownElement(self):
         """
         Private method to skip over all unknown elements.
         """
         if not self.isStartElement():
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 self.__skipUnknownElement()
--- a/src/eric7/WebBrowser/Passwords/PasswordWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/PasswordWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,18 +14,19 @@
     """
     Class implementing a writer object to generate login data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.setAutoFormatting(True)
-    
+
     def write(self, fileNameOrDevice, logins, forms, nevers):
         """
         Public method to write an login data file.
-        
+
         @param fileNameOrDevice name of the file to write (string)
             or device to write to (QIODevice)
         @param logins dictionary with login data (user name, password)
@@ -39,14 +40,14 @@
             f = QFile(fileNameOrDevice)
             if not f.open(QIODevice.OpenModeFlag.WriteOnly):
                 return False
-        
+
         self.setDevice(f)
         return self.__write(logins, forms, nevers)
-    
+
     def __write(self, logins, forms, nevers):
         """
         Private method to write an login data file.
-        
+
         @param logins dictionary with login data (user name, password)
         @param forms list of forms data (list of LoginForm)
         @param nevers list of URLs to never store data for (list of strings)
@@ -56,21 +57,21 @@
         self.writeDTD("<!DOCTYPE passwords>")
         self.writeStartElement("Password")
         self.writeAttribute("version", "2.0")
-        
+
         if logins:
             self.__writeLogins(logins)
         if forms:
             self.__writeForms(forms)
         if nevers:
             self.__writeNevers(nevers)
-        
+
         self.writeEndDocument()
         return True
-    
+
     def __writeLogins(self, logins):
         """
         Private method to write the login data.
-        
+
         @param logins dictionary with login data (user name, password)
         """
         self.writeStartElement("Logins")
@@ -80,11 +81,11 @@
             self.writeAttribute("user", login[0])
             self.writeAttribute("password", login[1])
         self.writeEndElement()
-    
+
     def __writeForms(self, forms):
         """
         Private method to write forms data.
-        
+
         @param forms list of forms data (list of LoginForm)
         """
         self.writeStartElement("Forms")
@@ -96,11 +97,11 @@
             self.writeTextElement("PostData", form.postData)
             self.writeEndElement()
         self.writeEndElement()
-    
+
     def __writeNevers(self, nevers):
         """
         Private method to write the URLs never to store login data for.
-        
+
         @param nevers list of URLs to never store data for (list of strings)
         """
         self.writeStartElement("Nevers")
--- a/src/eric7/WebBrowser/Passwords/PasswordsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Passwords/PasswordsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,51 +20,49 @@
     """
     Class implementing a dialog to show all saved logins.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__showPasswordsText = self.tr("Show Passwords")
         self.__hidePasswordsText = self.tr("Hide Passwords")
         self.passwordsButton.setText(self.__showPasswordsText)
-        
-        self.removeButton.clicked.connect(
-            self.passwordsTable.removeSelected)
+
+        self.removeButton.clicked.connect(self.passwordsTable.removeSelected)
         self.removeAllButton.clicked.connect(self.passwordsTable.removeAll)
-        
+
         import WebBrowser.WebBrowserWindow
         from .PasswordModel import PasswordModel
-        
+
         self.passwordsTable.verticalHeader().hide()
         self.__passwordModel = PasswordModel(
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.passwordManager(),
-            self)
+            WebBrowser.WebBrowserWindow.WebBrowserWindow.passwordManager(), self
+        )
         self.__proxyModel = QSortFilterProxyModel(self)
         self.__proxyModel.setSourceModel(self.__passwordModel)
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
         self.passwordsTable.setModel(self.__proxyModel)
-        
+
         fm = QFontMetrics(QFont())
         height = fm.height() + fm.height() // 3
         self.passwordsTable.verticalHeader().setDefaultSectionSize(height)
         self.passwordsTable.verticalHeader().setMinimumSectionSize(-1)
-        
+
         self.__calculateHeaderSizes()
-    
+
     def __calculateHeaderSizes(self):
         """
         Private method to calculate the section sizes of the horizontal header.
         """
         fm = QFontMetrics(QFont())
         for section in range(self.__passwordModel.columnCount()):
-            header = self.passwordsTable.horizontalHeader().sectionSizeHint(
-                section)
+            header = self.passwordsTable.horizontalHeader().sectionSizeHint(section)
             if section == 0:
                 try:
                     header = fm.horizontalAdvance("averagebiglongsitename")
@@ -85,10 +83,9 @@
             except AttributeError:
                 buffer = fm.width("mm")
             header += buffer
-            self.passwordsTable.horizontalHeader().resizeSection(
-                section, header)
+            self.passwordsTable.horizontalHeader().resizeSection(section, header)
         self.passwordsTable.horizontalHeader().setStretchLastSection(True)
-    
+
     @pyqtSlot()
     def on_passwordsButton_clicked(self):
         """
@@ -101,7 +98,8 @@
             res = EricMessageBox.yesNo(
                 self,
                 self.tr("Saved Passwords"),
-                self.tr("""Do you really want to show passwords?"""))
+                self.tr("""Do you really want to show passwords?"""),
+            )
             if res:
                 self.__passwordModel.setShowPasswords(True)
                 self.passwordsButton.setText(self.__hidePasswordsText)
--- a/src/eric7/WebBrowser/PersonalInformationManager/PersonalDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/PersonalInformationManager/PersonalDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,17 +19,18 @@
     """
     Class implementing a dialog to enter personal data.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("pim48"))
-        
+
         self.firstnameEdit.setText(Preferences.getWebBrowser("PimFirstName"))
         self.lastnameEdit.setText(Preferences.getWebBrowser("PimLastName"))
         self.fullnameEdit.setText(Preferences.getWebBrowser("PimFullName"))
@@ -46,7 +47,7 @@
         self.special2Edit.setText(Preferences.getWebBrowser("PimSpecial2"))
         self.special3Edit.setText(Preferences.getWebBrowser("PimSpecial3"))
         self.special4Edit.setText(Preferences.getWebBrowser("PimSpecial4"))
-    
+
     def storeData(self):
         """
         Public method to store the entered personal information.
--- a/src/eric7/WebBrowser/PersonalInformationManager/PersonalInformationManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/PersonalInformationManager/PersonalInformationManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,6 +24,7 @@
     Class implementing the personal information manager used to complete form
     fields.
     """
+
     FullName = 0
     LastName = 1
     FirstName = 2
@@ -42,33 +43,30 @@
     Special4 = 15
     Max = 16
     Invalid = 256
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__loaded = False
         self.__allInfo = {}
         self.__infoMatches = {}
         self.__translations = {}
-        
+
         self.__view = None
         self.__clickedPos = QPoint()
-    
+
     def __loadSettings(self):
         """
         Private method to load the settings.
         """
-        self.__allInfo[self.FullName] = Preferences.getWebBrowser(
-            "PimFullName")
-        self.__allInfo[self.LastName] = Preferences.getWebBrowser(
-            "PimLastName")
-        self.__allInfo[self.FirstName] = Preferences.getWebBrowser(
-            "PimFirstName")
+        self.__allInfo[self.FullName] = Preferences.getWebBrowser("PimFullName")
+        self.__allInfo[self.LastName] = Preferences.getWebBrowser("PimLastName")
+        self.__allInfo[self.FirstName] = Preferences.getWebBrowser("PimFirstName")
         self.__allInfo[self.Email] = Preferences.getWebBrowser("PimEmail")
         self.__allInfo[self.Mobile] = Preferences.getWebBrowser("PimMobile")
         self.__allInfo[self.Phone] = Preferences.getWebBrowser("PimPhone")
@@ -77,17 +75,12 @@
         self.__allInfo[self.Zip] = Preferences.getWebBrowser("PimZip")
         self.__allInfo[self.State] = Preferences.getWebBrowser("PimState")
         self.__allInfo[self.Country] = Preferences.getWebBrowser("PimCountry")
-        self.__allInfo[self.HomePage] = Preferences.getWebBrowser(
-            "PimHomePage")
-        self.__allInfo[self.Special1] = Preferences.getWebBrowser(
-            "PimSpecial1")
-        self.__allInfo[self.Special2] = Preferences.getWebBrowser(
-            "PimSpecial2")
-        self.__allInfo[self.Special3] = Preferences.getWebBrowser(
-            "PimSpecial3")
-        self.__allInfo[self.Special4] = Preferences.getWebBrowser(
-            "PimSpecial4")
-        
+        self.__allInfo[self.HomePage] = Preferences.getWebBrowser("PimHomePage")
+        self.__allInfo[self.Special1] = Preferences.getWebBrowser("PimSpecial1")
+        self.__allInfo[self.Special2] = Preferences.getWebBrowser("PimSpecial2")
+        self.__allInfo[self.Special3] = Preferences.getWebBrowser("PimSpecial3")
+        self.__allInfo[self.Special4] = Preferences.getWebBrowser("PimSpecial4")
+
         self.__translations[self.FullName] = self.tr("Full Name")
         self.__translations[self.LastName] = self.tr("Last Name")
         self.__translations[self.FirstName] = self.tr("First Name")
@@ -104,7 +97,7 @@
         self.__translations[self.Special2] = self.tr("Custom 2")
         self.__translations[self.Special3] = self.tr("Custom 3")
         self.__translations[self.Special4] = self.tr("Custom 4")
-        
+
         self.__infoMatches[self.FullName] = ["fullname", "realname"]
         self.__infoMatches[self.LastName] = ["lastname", "surname"]
         self.__infoMatches[self.FirstName] = ["firstname", "name"]
@@ -117,23 +110,24 @@
         self.__infoMatches[self.State] = ["state", "region"]
         self.__infoMatches[self.Country] = ["country"]
         self.__infoMatches[self.HomePage] = ["homepage", "www"]
-        
+
         self.__loaded = True
-    
+
     def showConfigurationDialog(self):
         """
         Public method to show the configuration dialog.
         """
         from .PersonalDataDialog import PersonalDataDialog
+
         dlg = PersonalDataDialog()
         if dlg.exec() == QDialog.DialogCode.Accepted:
             dlg.storeData()
             self.__loadSettings()
-    
+
     def createSubMenu(self, menu, view, hitTestResult):
         """
         Public method to create the personal information sub-menu.
-        
+
         @param menu reference to the main menu (QMenu)
         @param view reference to the view (HelpBrowser)
         @param hitTestResult reference to the hit test result
@@ -141,73 +135,73 @@
         """
         self.__view = view
         self.__clickedPos = hitTestResult.pos()
-        
+
         if not hitTestResult.isContentEditable():
             return
-        
+
         if not self.__loaded:
             self.__loadSettings()
-        
+
         submenu = QMenu(self.tr("Insert Personal Information"), menu)
         submenu.setIcon(UI.PixmapCache.getIcon("pim"))
-        
+
         for key, info in sorted(self.__allInfo.items()):
             if info:
                 act = submenu.addAction(self.__translations[key])
                 act.setData(info)
-                act.triggered.connect(
-                    functools.partial(self.__insertData, act))
-        
+                act.triggered.connect(functools.partial(self.__insertData, act))
+
         submenu.addSeparator()
-        submenu.addAction(self.tr("Edit Personal Information"),
-                          self.showConfigurationDialog)
-        
+        submenu.addAction(
+            self.tr("Edit Personal Information"), self.showConfigurationDialog
+        )
+
         menu.addMenu(submenu)
         menu.addSeparator()
-    
+
     def __insertData(self, act):
         """
         Private slot to insert the selected personal information.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         if self.__view is None or self.__clickedPos.isNull():
             return
-        
+
         info = act.data()
         info = info.replace('"', '\\"')
-        
+
         source = """
             var e = document.elementFromPoint({0}, {1});
             if (e) {{
                 var v = e.value.substring(0, e.selectionStart);
                 v += "{2}" + e.value.substring(e.selectionEnd);
                 e.value = v;
-            }}""".format(self.__clickedPos.x(), self.__clickedPos.y(), info)
+            }}""".format(
+            self.__clickedPos.x(), self.__clickedPos.y(), info
+        )
         self.__view.page().runJavaScript(source, WebBrowserPage.SafeJsWorld)
-    
+
     def viewKeyPressEvent(self, view, evt):
         """
         Protected method to handle key press events we are interested in.
-        
+
         @param view reference to the view (HelpBrowser)
         @param evt reference to the key event (QKeyEvent)
         @return flag indicating handling of the event (boolean)
         """
         if view is None:
             return False
-        
+
         isEnter = evt.key() in [Qt.Key.Key_Return, Qt.Key.Key_Enter]
-        isControlModifier = (
-            evt.modifiers() & Qt.KeyboardModifier.ControlModifier
-        )
+        isControlModifier = evt.modifiers() & Qt.KeyboardModifier.ControlModifier
         if not isEnter or not isControlModifier:
             return False
-        
+
         if not self.__loaded:
             self.__loadSettings()
-        
+
         source = """
             var inputs = document.getElementsByTagName('input');
             var table = {0};
@@ -223,25 +217,27 @@
                         break;
                     }}
                 }}
-            }}""".format(self.__matchingJsTable())
+            }}""".format(
+            self.__matchingJsTable()
+        )
         view.page().runJavaScript(source, WebBrowserPage.SafeJsWorld)
-        
+
         return True
-    
+
     def connectPage(self, page):
         """
         Public method to allow the personal information manager to connect to
         the page.
-        
+
         @param page reference to the web page
         @type WebBrowserPage
         """
         page.loadFinished.connect(lambda ok: self.__pageLoadFinished(ok, page))
-    
+
     def __pageLoadFinished(self, ok, page):
         """
         Private slot to handle the completion of a page load.
-        
+
         @param ok flag indicating a successful load
         @type bool
         @param page reference to the web page object
@@ -249,10 +245,10 @@
         """
         if page is None or not ok:
             return
-        
+
         if not self.__loaded:
             self.__loadSettings()
-        
+
         source = """
             var inputs = document.getElementsByTagName('input');
             var table = {0};
@@ -270,13 +266,15 @@
                         break;
                     }}
                 }}
-            }}""".format(self.__matchingJsTable())
+            }}""".format(
+            self.__matchingJsTable()
+        )
         page.runJavaScript(source, WebBrowserPage.SafeJsWorld)
-    
+
     def __matchingJsTable(self):
         """
         Private method to create the common part of the JavaScript sources.
-        
+
         @return JavaScript source
         @rtype str
         """
--- a/src/eric7/WebBrowser/QtHelp/HelpDocsInstaller.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/HelpDocsInstaller.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,75 +23,138 @@
     """
     Class implementing the worker thread populating and updating the QtHelp
     documentation database.
-    
+
     @signal errorMessage(str) emitted, if an error occurred during
         the installation of the documentation
     @signal docsInstalled(bool) emitted after the installation has finished
     """
+
     errorMessage = pyqtSignal(str)
     docsInstalled = pyqtSignal(bool)
-    
+
     def __init__(self, collection):
         """
         Constructor
-        
+
         @param collection full pathname of the collection file
         @type str
         """
         super().__init__()
-        
+
         self.__abort = False
         self.__collection = collection
         self.__mutex = QMutex()
-    
+
     def stop(self):
         """
         Public slot to stop the installation procedure.
         """
         if not self.isRunning():
             return
-        
+
         self.__mutex.lock()
         self.__abort = True
         self.__mutex.unlock()
         self.wait()
-    
+
     def installDocs(self):
         """
         Public method to start the installation procedure.
         """
         self.start(QThread.Priority.LowPriority)
-    
+
     def run(self):
         """
         Public method executed by the thread.
         """
         engine = QHelpEngineCore(self.__collection)
         changes = False
-        
+
         qt5Docs = [
-            "activeqt", "qdoc", "qmake", "qt3d", "qt3drenderer",
-            "qtandroidextras", "qtassistant", "qtbluetooth", "qtcanvas3d",
-            "qtcharts", "qtcmake", "qtconcurrent", "qtcore", "qtdatavis3d",
-            "qtdatavisualization", "qtdbus", "qtdesigner",
-            "qtdistancefieldgenerator", "qtdoc", "qtenginio",
-            "qtenginiooverview", "qtenginoqml", "qtgamepad",
-            "qtgraphicaleffects", "qtgui", "qthelp", "qtimageformats",
-            "qtlabscalendar", "qtlabsplatform", "qtlabscontrols", "qtlinguist",
-            "qtlocation", "qtlottieanimation", "qtmaxextras", "qtmultimedia",
-            "qtmultimediawidgets", "qtnetwork", "qtnetworkauth", "qtnfc",
-            "qtopengl", "qtplatformheaders", "qtpositioning", "qtprintsupport",
-            "qtpurchasing", "qtqml", "qtqmlmodels", "qtqmltest", "qtquick",
-            "qtquick3d", "qtquickcontrols", "qtquickcontrols1",
-            "qtquickdialogs", "qtquickextras", "qtquicklayouts",
-            "qtquicktimeline", "qtremoteobjects", "qtscript", "qtscripttools",
-            "qtscxml", "qtsensors", "qtserialbus", "qtserialport",
-            "qtshadertools", "qtspeech", "qtsql", "qtsvg", "qttest",
-            "qttestlib", "qtuitools", "qtvirtualkeyboard",
-            "qtwaylandcompositor", "qtwebchannel", "qtwebengine",
-            "qtwebenginewidgets", "qtwebkit", "qtwebkitexamples",
-            "qtwebsockets", "qtwebview", "qtwidgets", "qtwinextras",
-            "qtx11extras", "qtxml", "qtxmlpatterns"]
+            "activeqt",
+            "qdoc",
+            "qmake",
+            "qt3d",
+            "qt3drenderer",
+            "qtandroidextras",
+            "qtassistant",
+            "qtbluetooth",
+            "qtcanvas3d",
+            "qtcharts",
+            "qtcmake",
+            "qtconcurrent",
+            "qtcore",
+            "qtdatavis3d",
+            "qtdatavisualization",
+            "qtdbus",
+            "qtdesigner",
+            "qtdistancefieldgenerator",
+            "qtdoc",
+            "qtenginio",
+            "qtenginiooverview",
+            "qtenginoqml",
+            "qtgamepad",
+            "qtgraphicaleffects",
+            "qtgui",
+            "qthelp",
+            "qtimageformats",
+            "qtlabscalendar",
+            "qtlabsplatform",
+            "qtlabscontrols",
+            "qtlinguist",
+            "qtlocation",
+            "qtlottieanimation",
+            "qtmaxextras",
+            "qtmultimedia",
+            "qtmultimediawidgets",
+            "qtnetwork",
+            "qtnetworkauth",
+            "qtnfc",
+            "qtopengl",
+            "qtplatformheaders",
+            "qtpositioning",
+            "qtprintsupport",
+            "qtpurchasing",
+            "qtqml",
+            "qtqmlmodels",
+            "qtqmltest",
+            "qtquick",
+            "qtquick3d",
+            "qtquickcontrols",
+            "qtquickcontrols1",
+            "qtquickdialogs",
+            "qtquickextras",
+            "qtquicklayouts",
+            "qtquicktimeline",
+            "qtremoteobjects",
+            "qtscript",
+            "qtscripttools",
+            "qtscxml",
+            "qtsensors",
+            "qtserialbus",
+            "qtserialport",
+            "qtshadertools",
+            "qtspeech",
+            "qtsql",
+            "qtsvg",
+            "qttest",
+            "qttestlib",
+            "qtuitools",
+            "qtvirtualkeyboard",
+            "qtwaylandcompositor",
+            "qtwebchannel",
+            "qtwebengine",
+            "qtwebenginewidgets",
+            "qtwebkit",
+            "qtwebkitexamples",
+            "qtwebsockets",
+            "qtwebview",
+            "qtwidgets",
+            "qtwinextras",
+            "qtx11extras",
+            "qtxml",
+            "qtxmlpatterns",
+        ]
         for qtDocs, version in [(qt5Docs, 5)]:
             for doc in qtDocs:
                 changes |= self.__installQtDoc(doc, version, engine)
@@ -101,16 +164,16 @@
                     self.__mutex.unlock()
                     return
                 self.__mutex.unlock()
-        
+
         changes |= self.__installEric7Doc(engine)
         engine = None
         del engine
         self.docsInstalled.emit(changes)
-    
+
     def __installQtDoc(self, name, version, engine):
         """
         Private method to install/update a Qt help document.
-        
+
         @param name name of the Qt help document
         @type str
         @param version Qt version of the help documents
@@ -122,75 +185,73 @@
         """
         versionKey = "qt_version_{0}@@{1}".format(version, name)
         info = engine.customValue(versionKey, "")
-        lst = info.split('|')
-        
+        lst = info.split("|")
+
         dt = None
         if len(lst) and lst[0]:
             dt = datetime.datetime.fromisoformat(lst[0])
-        
+
         qchFile = ""
         if len(lst) == 2:
             qchFile = lst[1]
-        
+
         if version == 5:
-            docsPath = pathlib.Path(QLibraryInfo.path(
-                QLibraryInfo.LibraryPath.DocumentationPath))
-            if (
-                not docsPath.is_dir() or
-                len(docsPath.glob("*.qch")) == 0
-            ):
+            docsPath = pathlib.Path(
+                QLibraryInfo.path(QLibraryInfo.LibraryPath.DocumentationPath)
+            )
+            if not docsPath.is_dir() or len(docsPath.glob("*.qch")) == 0:
                 docsPath = (
-                    docsPath.parents[2] / "Docs" /
-                    "Qt-{0}.{1}".format(*qVersionTuple())
+                    docsPath.parents[2] / "Docs" / "Qt-{0}.{1}".format(*qVersionTuple())
                 )
         else:
             # unsupported Qt version
             return False
-        
+
         files = docsPath.glob("*.qch")
         if not files:
-            engine.setCustomValue(versionKey, '|')
+            engine.setCustomValue(versionKey, "|")
             return False
-        
+
         for f in files:
             if f.stem == name:
                 namespace = QHelpEngineCore.namespaceName(str(f.resolve()))
                 if not namespace:
                     continue
-                
+
                 if (
-                    dt is not None and
-                    namespace in engine.registeredDocumentations() and
-                    (datetime.datetime.fromtimestamp(f.stat().st_mtime) ==
-                     dt) and
-                    qchFile == str(f.resolve())
+                    dt is not None
+                    and namespace in engine.registeredDocumentations()
+                    and (datetime.datetime.fromtimestamp(f.stat().st_mtime) == dt)
+                    and qchFile == str(f.resolve())
                 ):
                     return False
-                
+
                 if namespace in engine.registeredDocumentations():
                     engine.unregisterDocumentation(namespace)
-                
+
                 if not engine.registerDocumentation(str(f.resolve())):
                     self.errorMessage.emit(
                         self.tr(
                             """<p>The file <b>{0}</b> could not be"""
-                            """ registered. <br/>Reason: {1}</p>""")
-                        .format(f, engine.error())
+                            """ registered. <br/>Reason: {1}</p>"""
+                        ).format(f, engine.error())
                     )
                     return False
-                
+
                 engine.setCustomValue(
                     versionKey,
-                    datetime.datetime.fromtimestamp(f.stat().st_mtime)
-                    .isoformat() + '|' + str(f.resolve()))
+                    datetime.datetime.fromtimestamp(f.stat().st_mtime).isoformat()
+                    + "|"
+                    + str(f.resolve()),
+                )
                 return True
-        
+
         return False
-    
+
     def __installEric7Doc(self, engine):
         """
         Private method to install/update the eric help documentation.
-        
+
         @param engine reference to the help engine
         @type QHelpEngineCore
         @return flag indicating success
@@ -198,54 +259,55 @@
         """
         versionKey = "eric7_ide"
         info = engine.customValue(versionKey, "")
-        lst = info.split('|')
-        
+        lst = info.split("|")
+
         dt = None
         if len(lst) and lst[0]:
             dt = datetime.datetime.fromisoformat(lst[0])
-        
+
         qchFile = ""
         if len(lst) == 2:
             qchFile = lst[1]
-        
+
         docsPath = pathlib.Path(getConfig("ericDocDir")) / "Help"
-        
+
         files = docsPath.glob("*.qch")
         if not files:
-            engine.setCustomValue(versionKey, '|')
+            engine.setCustomValue(versionKey, "|")
             return False
-        
+
         for f in files:
             if f.name == "source.qch":
                 namespace = QHelpEngineCore.namespaceName(str(f.resolve()))
                 if not namespace:
                     continue
-                
+
                 if (
-                    dt is not None and
-                    namespace in engine.registeredDocumentations() and
-                    (datetime.datetime.fromtimestamp(f.stat().st_mtime) ==
-                     dt) and
-                    qchFile == str(f.resolve())
+                    dt is not None
+                    and namespace in engine.registeredDocumentations()
+                    and (datetime.datetime.fromtimestamp(f.stat().st_mtime) == dt)
+                    and qchFile == str(f.resolve())
                 ):
                     return False
-                
+
                 if namespace in engine.registeredDocumentations():
                     engine.unregisterDocumentation(namespace)
-                
+
                 if not engine.registerDocumentation(str(f.resolve())):
                     self.errorMessage.emit(
                         self.tr(
                             """<p>The file <b>{0}</b> could not be"""
-                            """ registered. <br/>Reason: {1}</p>""")
-                        .format(f, engine.error())
+                            """ registered. <br/>Reason: {1}</p>"""
+                        ).format(f, engine.error())
                     )
                     return False
-                
+
                 engine.setCustomValue(
                     versionKey,
-                    datetime.datetime.fromtimestamp(f.stat().st_mtime)
-                    .isoformat() + '|' + str(f.resolve()))
+                    datetime.datetime.fromtimestamp(f.stat().st_mtime).isoformat()
+                    + "|"
+                    + str(f.resolve()),
+                )
                 return True
-        
+
         return False
--- a/src/eric7/WebBrowser/QtHelp/HelpIndexWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/HelpIndexWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,15 +11,21 @@
 from PyQt6.QtGui import QGuiApplication, QClipboard
 from PyQt6.QtHelp import QHelpLink
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QMenu, QDialog,
-    QApplication
+    QWidget,
+    QVBoxLayout,
+    QHBoxLayout,
+    QLabel,
+    QLineEdit,
+    QMenu,
+    QDialog,
+    QApplication,
 )
 
 
 class HelpIndexWidget(QWidget):
     """
     Class implementing a window for showing the QtHelp index.
-    
+
     @signal escapePressed() emitted when the ESC key was pressed
     @signal openUrl(QUrl, str) emitted to open an entry in the current tab
     @signal newTab(QUrl, str) emitted to open an entry in a new tab
@@ -27,16 +33,17 @@
         new background tab
     @signal newWindow(QUrl, str) emitted to open an entry in a new window
     """
+
     escapePressed = pyqtSignal()
     openUrl = pyqtSignal(QUrl)
     newTab = pyqtSignal(QUrl)
     newBackgroundTab = pyqtSignal(QUrl)
     newWindow = pyqtSignal(QUrl)
-    
+
     def __init__(self, engine, internal=False, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         @param internal flag indicating the internal help viewer
@@ -45,22 +52,22 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__engine = engine
         self.__internal = internal
-        
+
         self.__searchEdit = None
         self.__index = None
-        
+
         self.__layout = QVBoxLayout(self)
         if internal:
             # no margins for the internal variant
             self.__layout.setContentsMargins(0, 0, 0, 0)
-        
+
         self.__searchEditLayout = QHBoxLayout()
         label = QLabel(self.tr("&Look for:"))
         self.__searchEditLayout.addWidget(label)
-        
+
         self.__searchEdit = QLineEdit()
         self.__searchEdit.setClearButtonEnabled(True)
         label.setBuddy(self.__searchEdit)
@@ -68,28 +75,25 @@
         self.__searchEdit.installEventFilter(self)
         self.__searchEditLayout.addWidget(self.__searchEdit)
         self.__layout.addLayout(self.__searchEditLayout)
-        
+
         self.__index = self.__engine.indexWidget()
-        self.__index.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
-        
+        self.__index.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+
         self.__engine.indexModel().indexCreationStarted.connect(
-            self.__disableSearchEdit)
-        self.__engine.indexModel().indexCreated.connect(
-            self.__enableSearchEdit)
+            self.__disableSearchEdit
+        )
+        self.__engine.indexModel().indexCreated.connect(self.__enableSearchEdit)
         self.__index.documentActivated.connect(self.__documentActivated)
         self.__index.documentsActivated.connect(self.__documentsActivated)
-        self.__index.customContextMenuRequested.connect(
-            self.__showContextMenu)
-        self.__searchEdit.returnPressed.connect(
-            self.__index.activateCurrentItem)
+        self.__index.customContextMenuRequested.connect(self.__showContextMenu)
+        self.__searchEdit.returnPressed.connect(self.__index.activateCurrentItem)
         self.__layout.addWidget(self.__index)
-    
+
     @pyqtSlot(QHelpLink, str)
     def __documentActivated(self, document, keyword, modifiers=None):
         """
         Private slot to handle the activation of a keyword entry.
-        
+
         @param document reference to a data structure containing the
             document info
         @type QHelpLink
@@ -102,25 +106,22 @@
             modifiers = QApplication.keyboardModifiers()
         if not document.url.isEmpty() and document.url.isValid():
             if modifiers & (
-                Qt.KeyboardModifier.ControlModifier |
                 Qt.KeyboardModifier.ControlModifier
+                | Qt.KeyboardModifier.ControlModifier
             ):
                 self.newBackgroundTab.emit(document.url)
             elif modifiers & Qt.KeyboardModifier.ControlModifier:
                 self.newTab.emit(document.url)
-            elif (
-                modifiers & Qt.KeyboardModifier.ShiftModifier and
-                not self.__internal
-            ):
+            elif modifiers & Qt.KeyboardModifier.ShiftModifier and not self.__internal:
                 self.newWindow.emit(document.url)
             else:
                 self.openUrl.emit(document.url)
-    
+
     def __documentsActivated(self, documents, helpKeyword):
         """
         Private slot to handle the activation of an entry with multiple help
         documents.
-        
+
         @param documents list of help document link data structures
         @type list of QHelpLink
         @param helpKeyword keyword for the entry
@@ -129,16 +130,16 @@
         modifiers = QApplication.keyboardModifiers()
         document = (
             documents[0]
-            if len(documents) == 1 else
-            self.__selectDocument(documents, helpKeyword)
+            if len(documents) == 1
+            else self.__selectDocument(documents, helpKeyword)
         )
         self.__documentActivated(document, helpKeyword, modifiers)
-    
+
     def __selectDocument(self, documents, helpKeyword):
         """
         Private method to give the user a chance to select among the
         given documents.
-        
+
         @param documents list of help document link data structures
         @type list of QHelpLink
         @param helpKeyword keyword for the documents
@@ -147,54 +148,55 @@
         @rtype QHelpLink
         """
         document = QHelpLink()
-        
+
         from .HelpTopicDialog import HelpTopicDialog
+
         dlg = HelpTopicDialog(self, helpKeyword, documents)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             document = dlg.document()
-        
+
         return document
-    
+
     def __filterIndices(self, indexFilter):
         """
         Private slot to filter the indexes according to the given filter.
-        
+
         @param indexFilter filter to be used
         @type str
         """
-        if '*' in indexFilter:
+        if "*" in indexFilter:
             self.__index.filterIndices(indexFilter, indexFilter)
         else:
             self.__index.filterIndices(indexFilter)
-    
+
     def __enableSearchEdit(self):
         """
         Private slot to enable the search edit.
         """
         self.__searchEdit.setEnabled(True)
         self.__filterIndices(self.__searchEdit.text())
-    
+
     def __disableSearchEdit(self):
         """
         Private slot to enable the search edit.
         """
         self.__searchEdit.setEnabled(False)
-    
+
     def focusInEvent(self, evt):
         """
         Protected method handling focus in events.
-        
+
         @param evt reference to the focus event object
         @type QFocusEvent
         """
         if evt.reason() != Qt.FocusReason.MouseFocusReason:
             self.__searchEdit.selectAll()
             self.__searchEdit.setFocus()
-    
+
     def eventFilter(self, watched, event):
         """
         Public method called to filter the event queue.
-        
+
         @param watched the QObject being watched
         @type QObject
         @param event the event that occurred
@@ -203,29 +205,32 @@
         @rtype bool
         """
         if (
-            self.__searchEdit and watched == self.__searchEdit and
-            event.type() == QEvent.Type.KeyPress
+            self.__searchEdit
+            and watched == self.__searchEdit
+            and event.type() == QEvent.Type.KeyPress
         ):
             idx = self.__index.currentIndex()
             if event.key() == Qt.Key.Key_Up:
                 idx = self.__index.model().index(
-                    idx.row() - 1, idx.column(), idx.parent())
+                    idx.row() - 1, idx.column(), idx.parent()
+                )
                 if idx.isValid():
                     self.__index.setCurrentIndex(idx)
             elif event.key() == Qt.Key.Key_Down:
                 idx = self.__index.model().index(
-                    idx.row() + 1, idx.column(), idx.parent())
+                    idx.row() + 1, idx.column(), idx.parent()
+                )
                 if idx.isValid():
                     self.__index.setCurrentIndex(idx)
             elif event.key() == Qt.Key.Key_Escape:
                 self.escapePressed.emit()
-        
+
         return QWidget.eventFilter(self, watched, event)
-    
+
     def __showContextMenu(self, pos):
         """
         Private slot showing the context menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
@@ -236,16 +241,18 @@
             if self.__internal:
                 newTab = menu.addAction(self.tr("Open Link in New Page"))
                 newBackgroundTab = menu.addAction(
-                    self.tr("Open Link in Background Page"))
+                    self.tr("Open Link in Background Page")
+                )
             else:
                 newTab = menu.addAction(self.tr("Open Link in New Tab"))
                 newBackgroundTab = menu.addAction(
-                    self.tr("Open Link in Background Tab"))
+                    self.tr("Open Link in Background Tab")
+                )
                 newWindow = menu.addAction(self.tr("Open Link in New Window"))
             menu.addSeparator()
             copyLink = menu.addAction(self.tr("Copy URL to Clipboard"))
             menu.move(self.__index.mapToGlobal(pos))
-            
+
             act = menu.exec()
             model = self.__index.model()
             if model is not None:
@@ -255,7 +262,7 @@
                     link = helpLinks[0].url
                 else:
                     link = self.__selectDocument(helpLinks, helpKeyword).url
-                
+
                 if not link.isEmpty() and link.isValid():
                     if act == curTab:
                         self.openUrl.emit(link)
@@ -268,6 +275,8 @@
                     elif act == copyLink:
                         # copy the URL to both clipboard areas
                         QGuiApplication.clipboard().setText(
-                            link.toString(), QClipboard.Mode.Clipboard)
+                            link.toString(), QClipboard.Mode.Clipboard
+                        )
                         QGuiApplication.clipboard().setText(
-                            link.toString(), QClipboard.Mode.Selection)
+                            link.toString(), QClipboard.Mode.Selection
+                        )
--- a/src/eric7/WebBrowser/QtHelp/HelpSearchWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/HelpSearchWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,15 +9,13 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl
 from PyQt6.QtGui import QGuiApplication, QClipboard
-from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QTextBrowser, QApplication, QMenu
-)
+from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextBrowser, QApplication, QMenu
 
 
 class HelpSearchWidget(QWidget):
     """
     Class implementing a window for showing the QtHelp index.
-    
+
     @signal escapePressed() emitted when the ESC key was pressed
     @signal openUrl(QUrl, str) emitted to open a search result entry in the
         current tab
@@ -28,16 +26,17 @@
     @signal newWindow(QUrl, str) emitted to open a search result entry in a
         new window
     """
+
     escapePressed = pyqtSignal()
     openUrl = pyqtSignal(QUrl)
     newTab = pyqtSignal(QUrl)
     newBackgroundTab = pyqtSignal(QUrl)
     newWindow = pyqtSignal(QUrl)
-    
+
     def __init__(self, engine, internal=False, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help search engine
         @type QHelpSearchEngine
         @param internal flag indicating the internal help viewer
@@ -46,92 +45,90 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__engine = engine
         self.__internal = internal
-        
+
         self.__layout = QVBoxLayout(self)
         if internal:
             # no margins for the internal variant
             self.__layout.setContentsMargins(0, 0, 0, 0)
-        
+
         self.__result = self.__engine.resultWidget()
         self.__query = self.__engine.queryWidget()
-        
+
         self.__layout.addWidget(self.__query)
         self.__layout.addWidget(self.__result)
-        
+
         self.setFocusProxy(self.__query)
-        
+
         self.__query.search.connect(self.__search)
         self.__result.requestShowLink.connect(self.__linkActivated)
-        
+
         self.__engine.searchingStarted.connect(self.__searchingStarted)
         self.__engine.searchingFinished.connect(self.__searchingFinished)
-        
+
         self.__browser = self.__result.findChildren(QTextBrowser)[0]
-    
+
     def __search(self):
         """
         Private slot to perform a search of the database.
         """
         query = self.__query.searchInput()
         self.__engine.search(query)
-    
+
     def __searchingStarted(self):
         """
         Private slot to handle the start of a search.
         """
         QApplication.setOverrideCursor(Qt.CursorShape.WaitCursor)
-    
+
     def __searchingFinished(self, hits):
         """
         Private slot to handle the end of the search.
-        
+
         @param hits number of hits (unused)
         @type int
         """
         QApplication.restoreOverrideCursor()
-    
+
     @pyqtSlot(QUrl)
     def __linkActivated(self, url):
         """
         Private slot handling the activation of an entry.
-        
+
         @param url URL of the activated entry
         @type QUrl
         """
         if not url.isEmpty() and url.isValid():
             buttons = QApplication.mouseButtons()
             modifiers = QApplication.keyboardModifiers()
-            
+
             if buttons & Qt.MouseButton.MiddleButton:
                 self.newTab.emit(url)
             else:
-                if (
-                    modifiers & (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    ) == (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    )
+                if modifiers & (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
+                ) == (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
                 ):
                     self.newBackgroundTab.emit(url)
                 elif modifiers & Qt.KeyboardModifier.ControlModifier:
                     self.newTab.emit(url)
                 elif (
-                    modifiers & Qt.KeyboardModifier.ShiftModifier and
-                    not self.__internal
+                    modifiers & Qt.KeyboardModifier.ShiftModifier
+                    and not self.__internal
                 ):
                     self.newWindow.emit(url)
                 else:
                     self.openUrl.emit(url)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key press events.
-        
+
         @param evt reference to the key press event
         @type QKeyEvent
         """
@@ -139,15 +136,15 @@
             self.escapePressed.emit()
         else:
             evt.ignore()
-    
+
     def contextMenuEvent(self, evt):
         """
         Protected method handling context menu events.
-        
+
         @param evt reference to the context menu event (QContextMenuEvent)
         """
         point = evt.globalPos()
-        
+
         if self.__browser:
             point = self.__browser.mapFromGlobal(point)
             if not self.__browser.rect().contains(point, True):
@@ -156,25 +153,23 @@
         else:
             point = self.__result.mapFromGlobal(point)
             link = self.__result.linkAt(point)
-        
+
         if link.isEmpty() or not link.isValid():
             return
-        
+
         menu = QMenu()
         curTab = menu.addAction(self.tr("Open Link"))
         if self.__internal:
             newTab = menu.addAction(self.tr("Open Link in New Page"))
-            newBackgroundTab = menu.addAction(
-                self.tr("Open Link in Background Page"))
+            newBackgroundTab = menu.addAction(self.tr("Open Link in Background Page"))
         else:
             newTab = menu.addAction(self.tr("Open Link in New Tab"))
-            newBackgroundTab = menu.addAction(
-                self.tr("Open Link in Background Tab"))
+            newBackgroundTab = menu.addAction(self.tr("Open Link in Background Tab"))
             newWindow = menu.addAction(self.tr("Open Link in New Window"))
         menu.addSeparator()
         copyLink = menu.addAction(self.tr("Copy URL to Clipboard"))
         menu.move(evt.globalPos())
-        
+
         act = menu.exec()
         if act == curTab:
             self.openUrl.emit(link)
@@ -187,6 +182,8 @@
         elif act == copyLink:
             # copy the URL to both clipboard areas
             QGuiApplication.clipboard().setText(
-                link.toString(), QClipboard.Mode.Clipboard)
+                link.toString(), QClipboard.Mode.Clipboard
+            )
             QGuiApplication.clipboard().setText(
-                link.toString(), QClipboard.Mode.Selection)
+                link.toString(), QClipboard.Mode.Selection
+            )
--- a/src/eric7/WebBrowser/QtHelp/HelpTocWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/HelpTocWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,7 +15,7 @@
 class HelpTocWidget(QWidget):
     """
     Class implementing a window for showing the QtHelp TOC.
-    
+
     @signal escapePressed() emitted when the ESC key was pressed
     @signal openUrl(QUrl, str) emitted to open an entry in the current tab
     @signal newTab(QUrl, str) emitted to open an entry in a new tab
@@ -23,16 +23,17 @@
         new background tab
     @signal newWindow(QUrl, str) emitted to open an entry in a new window
     """
+
     escapePressed = pyqtSignal()
     openUrl = pyqtSignal(QUrl)
     newTab = pyqtSignal(QUrl)
     newBackgroundTab = pyqtSignal(QUrl)
     newWindow = pyqtSignal(QUrl)
-    
+
     def __init__(self, engine, internal=False, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the help engine
         @type QHelpEngine
         @param internal flag indicating the internal help viewer
@@ -41,72 +42,68 @@
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__engine = engine
         self.__expandDepth = -2
-        
+
         self.__internal = internal
-        
+
         self.__tocWidget = self.__engine.contentWidget()
-        self.__tocWidget.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.__tocWidget.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.__tocWidget.setSortingEnabled(True)
-        
+
         self.__layout = QVBoxLayout(self)
         if internal:
             # no margins for the internal variant
             self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__layout.addWidget(self.__tocWidget)
-        
-        self.__tocWidget.customContextMenuRequested.connect(
-            self.__showContextMenu)
+
+        self.__tocWidget.customContextMenuRequested.connect(self.__showContextMenu)
         self.__tocWidget.linkActivated.connect(self.__linkActivated)
-        
+
         model = self.__tocWidget.model()
         model.contentsCreated.connect(self.__contentsCreated)
-    
+
     @pyqtSlot(QUrl)
     def __linkActivated(self, url):
         """
         Private slot handling the activation of an entry.
-        
+
         @param url URL of the activated entry
         @type QUrl
         """
         if not url.isEmpty() and url.isValid():
             buttons = QApplication.mouseButtons()
             modifiers = QApplication.keyboardModifiers()
-            
+
             if buttons & Qt.MouseButton.MiddleButton:
                 self.newTab.emit(url)
             else:
-                if (
-                    modifiers & (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    ) == (
-                        Qt.KeyboardModifier.ControlModifier |
-                        Qt.KeyboardModifier.ShiftModifier
-                    )
+                if modifiers & (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
+                ) == (
+                    Qt.KeyboardModifier.ControlModifier
+                    | Qt.KeyboardModifier.ShiftModifier
                 ):
                     self.newBackgroundTab.emit(url)
                 elif modifiers & Qt.KeyboardModifier.ControlModifier:
                     self.newTab.emit(url)
                 elif (
-                    modifiers & Qt.KeyboardModifier.ShiftModifier and
-                    not self.__internal
+                    modifiers & Qt.KeyboardModifier.ShiftModifier
+                    and not self.__internal
                 ):
                     self.newWindow.emit(url)
                 else:
                     self.openUrl.emit(url)
-    
+
     def __contentsCreated(self):
         """
         Private slot to be run after the contents was generated.
         """
         self.__tocWidget.sortByColumn(0, Qt.SortOrder.AscendingOrder)
         self.__expandTOC()
-    
+
     def __expandTOC(self):
         """
         Private slot to expand the table of contents.
@@ -114,11 +111,11 @@
         if self.__expandDepth > -2:
             self.expandToDepth(self.__expandDepth)
             self.__expandDepth = -2
-    
+
     def expandToDepth(self, depth):
         """
         Public slot to expand the table of contents to a specific depth.
-        
+
         @param depth depth to expand to (integer)
         """
         self.__expandDepth = depth
@@ -126,29 +123,29 @@
             self.__tocWidget.expandAll()
         else:
             self.__tocWidget.expandToDepth(depth)
-    
+
     def focusInEvent(self, evt):
         """
         Protected method handling focus in events.
-        
+
         @param evt reference to the focus event object (QFocusEvent)
         """
         if evt.reason() != Qt.FocusReason.MouseFocusReason:
             self.__tocWidget.setFocus()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key press events.
-        
+
         @param evt reference to the key press event (QKeyEvent)
         """
         if evt.key() == Qt.Key.Key_Escape:
             self.escapePressed.emit()
-    
+
     def syncToContent(self, url):
         """
         Public method to sync the TOC to the displayed page.
-        
+
         @param url URL of the displayed page (QUrl)
         @return flag indicating a successful synchronization (boolean)
         """
@@ -157,37 +154,35 @@
             return False
         self.__tocWidget.setCurrentIndex(idx)
         return True
-    
+
     def __showContextMenu(self, pos):
         """
         Private slot showing the context menu.
-        
+
         @param pos position to show the menu at (QPoint)
         """
         if not self.__tocWidget.indexAt(pos).isValid():
             return
-        
+
         model = self.__tocWidget.model()
         itm = model.contentItemAt(self.__tocWidget.currentIndex())
         link = itm.url()
         if link.isEmpty() or not link.isValid():
             return
-        
+
         menu = QMenu()
         curTab = menu.addAction(self.tr("Open Link"))
         if self.__internal:
             newTab = menu.addAction(self.tr("Open Link in New Page"))
-            newBackgroundTab = menu.addAction(
-                self.tr("Open Link in Background Page"))
+            newBackgroundTab = menu.addAction(self.tr("Open Link in Background Page"))
         else:
             newTab = menu.addAction(self.tr("Open Link in New Tab"))
-            newBackgroundTab = menu.addAction(
-                self.tr("Open Link in Background Tab"))
+            newBackgroundTab = menu.addAction(self.tr("Open Link in Background Tab"))
             newWindow = menu.addAction(self.tr("Open Link in New Window"))
         menu.addSeparator()
         copyLink = menu.addAction(self.tr("Copy URL to Clipboard"))
         menu.move(self.__tocWidget.mapToGlobal(pos))
-        
+
         act = menu.exec()
         if act == curTab:
             self.openUrl.emit(link)
@@ -200,6 +195,8 @@
         elif act == copyLink:
             # copy the URL to both clipboard areas
             QGuiApplication.clipboard().setText(
-                link.toString(), QClipboard.Mode.Clipboard)
+                link.toString(), QClipboard.Mode.Clipboard
+            )
             QGuiApplication.clipboard().setText(
-                link.toString(), QClipboard.Mode.Selection)
+                link.toString(), QClipboard.Mode.Selection
+            )
--- a/src/eric7/WebBrowser/QtHelp/HelpTopicDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/HelpTopicDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to select a help topic to display.
     """
+
     def __init__(self, parent, helpKeyword, documents):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         @param helpKeyword keyword for the link set
@@ -31,31 +32,32 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.label.setText(self.tr("Choose a &topic for <b>{0}</b>:")
-                           .format(helpKeyword))
-        
+
+        self.label.setText(
+            self.tr("Choose a &topic for <b>{0}</b>:").format(helpKeyword)
+        )
+
         for document in documents:
             itm = QListWidgetItem(document.title, self.topicsList)
             itm.setData(Qt.ItemDataRole.UserRole, document.url)
         if self.topicsList.count() > 0:
             self.topicsList.setCurrentRow(0)
         self.topicsList.setFocus()
-        
+
         self.topicsList.itemActivated.connect(self.accept)
-    
+
     def document(self):
         """
         Public method to retrieve the selected help topic.
-        
+
         @return help document link for the selected help topic
         @rtype QHelpLink
         """
         document = QHelpLink()
-        
+
         itm = self.topicsList.currentItem()
         if itm is not None:
             document.title = itm.text()
             document.url = itm.data(Qt.ItemDataRole.UserRole)
-        
+
         return document
--- a/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationConfigurationDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationConfigurationDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,7 +11,7 @@
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
 
 from .Ui_QtHelpDocumentationConfigurationDialog import (
-    Ui_QtHelpDocumentationConfigurationDialog
+    Ui_QtHelpDocumentationConfigurationDialog,
 )
 
 from .QtHelpDocumentationSettings import QtHelpDocumentationSettings
@@ -23,10 +23,11 @@
     """
     Class implementing a dialog to manage the QtHelp documentation database.
     """
+
     def __init__(self, engine, parent=None):
         """
         Constructor
-        
+
         @param engine reference to the Qt help engine
         @type QHelpEngineCore
         @param parent reference to the parent widget (defaults to None)
@@ -34,74 +35,65 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__engine = engine
-        
-        self.__settings = QtHelpDocumentationSettings.readSettings(
-            self.__engine)
-        
+
+        self.__settings = QtHelpDocumentationSettings.readSettings(self.__engine)
+
         self.documentationSettingsWidget.documentationSettingsChanged.connect(
-            self.__documentationSettingsChanged)
-        self.documentationSettingsWidget.setDocumentationSettings(
-            self.__settings)
-        
-        self.filterSettingsWidget.setAvailableComponents(
-            self.__settings.components())
-        self.filterSettingsWidget.setAvailableVersions(
-            self.__settings.versions())
+            self.__documentationSettingsChanged
+        )
+        self.documentationSettingsWidget.setDocumentationSettings(self.__settings)
+
+        self.filterSettingsWidget.setAvailableComponents(self.__settings.components())
+        self.filterSettingsWidget.setAvailableVersions(self.__settings.versions())
         self.filterSettingsWidget.readSettings(self.__engine.filterEngine())
-    
+
     @pyqtSlot(QtHelpDocumentationSettings)
     def __documentationSettingsChanged(self, settings):
         """
         Private slot to handle a change of the QtHelp documentation
         configuration.
-        
+
         @param settings reference to the documentation settings object
         @type QtHelpDocumentationSettings
         """
         self.__settings = settings
-        
-        self.filterSettingsWidget.setAvailableComponents(
-            self.__settings.components())
-        self.filterSettingsWidget.setAvailableVersions(
-            self.__settings.versions())
-    
+
+        self.filterSettingsWidget.setAvailableComponents(self.__settings.components())
+        self.filterSettingsWidget.setAvailableVersions(self.__settings.versions())
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked
         @type QAbstractButton
         """
-        if button == self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Apply):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Apply):
             self.__applyConfiguration()
-            
-            self.__settings = QtHelpDocumentationSettings.readSettings(
-                self.__engine)
-            
+
+            self.__settings = QtHelpDocumentationSettings.readSettings(self.__engine)
+
             self.filterSettingsWidget.setAvailableComponents(
-                self.__settings.components())
-            self.filterSettingsWidget.setAvailableVersions(
-                self.__settings.versions())
-            self.filterSettingsWidget.readSettings(
-                self.__engine.filterEngine())
-        elif button == self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok):
+                self.__settings.components()
+            )
+            self.filterSettingsWidget.setAvailableVersions(self.__settings.versions())
+            self.filterSettingsWidget.readSettings(self.__engine.filterEngine())
+        elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Ok):
             self.__applyConfiguration()
             self.accept()
-    
+
     def __applyConfiguration(self):
         """
         Private method to apply the current QtHelp documentation configuration.
         """
         changed = QtHelpDocumentationSettings.applySettings(
-            self.__engine, self.__settings)
-        changed |= self.filterSettingsWidget.applySettings(
-            self.__engine.filterEngine())
-        
+            self.__engine, self.__settings
+        )
+        changed |= self.filterSettingsWidget.applySettings(self.__engine.filterEngine())
+
         if changed:
             # In order to update the filter combobox and index widget according
             # to the new filter configuration.
--- a/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,24 +16,24 @@
 
 from EricWidgets import EricMessageBox
 
-from .Ui_QtHelpDocumentationSelectionDialog import (
-    Ui_QtHelpDocumentationSelectionDialog
-)
+from .Ui_QtHelpDocumentationSelectionDialog import Ui_QtHelpDocumentationSelectionDialog
 
 
 class QtHelpDocumentationSelectionDialog(
-        QDialog, Ui_QtHelpDocumentationSelectionDialog):
+    QDialog, Ui_QtHelpDocumentationSelectionDialog
+):
     """
     Class implementing a dialog to select QtHelp documentation sets to be
     installed.
     """
+
     AddMode = "Add"
     ManageMode = "Manage"
-    
+
     def __init__(self, helpDocuments, mode, parent=None):
         """
         Constructor
-        
+
         @param helpDocuments dictionary containing the lists of help documents
             to be shown
         @type dict of lists of str
@@ -44,27 +44,25 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if mode == QtHelpDocumentationSelectionDialog.AddMode:
             self.buttonBox.button(QDialogButtonBox.StandardButton.Close).hide()
         else:
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Ok).hide()
-            self.buttonBox.button(
-                QDialogButtonBox.StandardButton.Cancel).hide()
-        
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).hide()
+            self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).hide()
+
         for category in helpDocuments:
             parentItem = QTreeWidgetItem(self.documentationList, [category])
             for document in helpDocuments[category]:
-                item = QTreeWidgetItem(parentItem,
-                                       [os.path.basename(document)])
+                item = QTreeWidgetItem(parentItem, [os.path.basename(document)])
                 item.setData(0, Qt.ItemDataRole.UserRole, document)
-                parentItem.setData(0, Qt.ItemDataRole.UserRole,
-                                   os.path.dirname(document))
+                parentItem.setData(
+                    0, Qt.ItemDataRole.UserRole, os.path.dirname(document)
+                )
         self.documentationList.sortItems(0, Qt.SortOrder.AscendingOrder)
-        
+
         self.on_documentationList_itemSelectionChanged()
-    
+
     @pyqtSlot()
     def on_documentationList_itemSelectionChanged(self):
         """
@@ -77,10 +75,10 @@
                 selectedCategoriesCount += 1
             else:
                 selectedDocumentSetCount += 1
-        
+
         self.deleteButton.setEnabled(selectedDocumentSetCount > 0)
         self.deleteCategoryButton.setEnabled(selectedCategoriesCount > 0)
-    
+
     @pyqtSlot()
     def on_deleteButton_clicked(self):
         """
@@ -89,14 +87,16 @@
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Delete Documentation Sets"),
-            self.tr("""Shall the selected documentation sets really be"""
-                    """ deleted?"""))
+            self.tr(
+                """Shall the selected documentation sets really be""" """ deleted?"""
+            ),
+        )
         if yes:
             for itm in self.documentationList.selectedItems():
                 if itm.parent is None:
                     # it is a category item, skip it
                     continue
-                
+
                 category = itm.parent()
                 fileName = itm.data(0, Qt.ItemDataRole.UserRole)
                 try:
@@ -105,17 +105,19 @@
                     EricMessageBox.warning(
                         self,
                         self.tr("Delete Documentation Sets"),
-                        self.tr("""<p>The documentation set <b>{0}</b> could"""
-                                """ not be deleted.</p><p>Reason: {1}</p>""")
-                        .format(fileName, str(err)))
+                        self.tr(
+                            """<p>The documentation set <b>{0}</b> could"""
+                            """ not be deleted.</p><p>Reason: {1}</p>"""
+                        ).format(fileName, str(err)),
+                    )
                     continue
-                
+
                 category.removeChild(itm)
                 del itm
-                
+
                 if category.childCount() == 0:
                     self.__deleteCategory(category)
-    
+
     @pyqtSlot()
     def on_deleteCategoryButton_clicked(self):
         """
@@ -124,8 +126,11 @@
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Delete Documentation Sets"),
-            self.tr("""Shall the selected documentation set categories"""
-                    """ really be deleted?"""))
+            self.tr(
+                """Shall the selected documentation set categories"""
+                """ really be deleted?"""
+            ),
+        )
         if yes:
             categories = []
             for itm in self.documentationList.selectedItems():
@@ -133,7 +138,7 @@
                     categories.append(itm)
             for category in categories:
                 self.__deleteCategory(category)
-    
+
     @pyqtSlot()
     def on_deleteAllButton_clicked(self):
         """
@@ -142,33 +147,34 @@
         yes = EricMessageBox.yesNo(
             self,
             self.tr("Delete Documentation Sets"),
-            self.tr("""Shall all documentation sets really be deleted?"""))
+            self.tr("""Shall all documentation sets really be deleted?"""),
+        )
         if yes:
             categories = []
             for index in range(self.documentationList.topLevelItemCount()):
-                categories.append(
-                    self.documentationList.topLevelItem(index))
+                categories.append(self.documentationList.topLevelItem(index))
             for category in categories:
                 self.__deleteCategory(category)
-    
+
     def __deleteCategory(self, category):
         """
         Private method to delete a category.
-        
+
         @param category reference to the category item
         @type QTreeWidgetItem
         """
         categoryDir = category.data(0, Qt.ItemDataRole.UserRole)
         shutil.rmtree(categoryDir, True)
-        
+
         self.documentationList.takeTopLevelItem(
-            self.documentationList.indexOfTopLevelItem(category))
+            self.documentationList.indexOfTopLevelItem(category)
+        )
         del category
-    
+
     def getData(self):
         """
         Public method to retrieve the selected help documents.
-        
+
         @return list of QtHelp documentation sets to be installed
         @rtype set of str
         """
--- a/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettings.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettings.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,59 +18,60 @@
     """
     Class implementing a temporary store for QtHelp documentation settings.
     """
+
     def __init__(self):
         """
         Constructor
         """
         self._namespaceToComponent = {}
         self._componentToNamespace = collections.defaultdict(list)
-        
+
         self._namespaceToVersion = {}
         self._versionToNamespace = collections.defaultdict(list)
-        
+
         self._namespaceToFilename = {}
         self._filenameToNamespace = {}
-    
+
     def addDocumentation(self, filename):
         """
         Public method to a add a documentation file to the list.
-        
+
         @param filename name of the documentation file to add
         @type str
         @return flag indicating success
         @rtype bool
         """
         info = QCompressedHelpInfo.fromCompressedHelpFile(filename)
-        
+
         if info.isNull():
             return False
-        
+
         namespace = info.namespaceName()
-        
+
         if namespace in self._namespaceToFilename:
             return False
-        
+
         if filename in self._filenameToNamespace:
             return False
-        
+
         component = info.component()
         version = info.version()
-        
+
         self._namespaceToFilename[namespace] = filename
         self._filenameToNamespace[filename] = namespace
-        
+
         self._namespaceToComponent[namespace] = component
         self._componentToNamespace[component].append(namespace)
-        
+
         self._namespaceToVersion[namespace] = version
         self._versionToNamespace[version].append(namespace)
-        
+
         return True
-    
+
     def removeDocumentation(self, namespace):
         """
         Public method to remove the documentation of a given namespace.
-        
+
         @param namespace name of the namespace
         @type str
         @return flag indicating success
@@ -78,15 +79,15 @@
         """
         if not namespace:
             return False
-        
+
         try:
             filename = self._namespaceToFilename[namespace]
         except KeyError:
             return False
-        
+
         component = self._namespaceToComponent[namespace]
         version = self._namespaceToVersion[namespace]
-        
+
         del self._namespaceToComponent[namespace]
         del self._namespaceToVersion[namespace]
         del self._namespaceToFilename[namespace]
@@ -97,88 +98,88 @@
         self._versionToNamespace[version].remove(namespace)
         if len(self._versionToNamespace[version]) == 0:
             del self._versionToNamespace[version]
-        
+
         return True
-    
+
     def namespace(self, filename):
         """
         Public method to get the namespace defined by a QtHelp file.
-        
+
         @param filename name of the QtHelp file
         @type str
         @return name of the namespace
         @rtype str
         """
         return self._filenameToNamespace[filename]
-    
+
     def components(self):
         """
         Public method to get the list of components.
-        
+
         @return list of components
         @rtype list of str
         """
         return [k for k in self._componentToNamespace.keys()]
-    
+
     def versions(self):
         """
         Public method to get the list of versions.
-        
+
         @return list of versions
         @rtype list of QVersionNumber
         """
         return [k for k in self._versionToNamespace.keys()]
-    
+
     def namespaces(self):
         """
         Public method to get the list of namespaces.
-        
+
         @return list of namespaces
         @rtype list of str
         """
         return [k for k in self._namespaceToFilename.keys()]
-    
+
     def namespaceToFilename(self):
         """
         Public method to get the namespace to filename mapping.
-        
+
         @return dictionary containing the namespace to filename mapping
         @rtype dict
         """
         return copy.deepcopy(self._namespaceToFilename)
-    
+
     @staticmethod
     def readSettings(helpEngine):
         """
         Static method to read the QtHelp documentation configuration.
-        
+
         @param helpEngine reference to the QtHelp engine
         @type QHelpEngineCore
         @return reference to the created QtHelpDocumentationSettings object
         @rtype QtHelpDocumentationSettings
         """
         filterEngine = helpEngine.filterEngine()
-        
+
         docSettings = QtHelpDocumentationSettings()
         docSettings._namespaceToComponent = filterEngine.namespaceToComponent()
         docSettings._namespaceToVersion = filterEngine.namespaceToVersion()
-        
+
         for namespace, component in docSettings._namespaceToComponent.items():
             filename = helpEngine.documentationFileName(namespace)
             docSettings._namespaceToFilename[namespace] = filename
             docSettings._filenameToNamespace[filename] = namespace
             docSettings._componentToNamespace[component].append(namespace)
-        
+
         for namespace, version in docSettings._namespaceToVersion.items():
             docSettings._versionToNamespace[version].append(namespace)
-        
+
         return docSettings
-    
+
     @staticmethod
     def applySettings(helpEngine, settings):
         """
         Static method to apply the changed QtHelp documentation configuration.
-        
+
         @param helpEngine reference to the QtHelp engine
         @type QHelpEngineCore
         @param settings reference to the created QtHelpDocumentationSettings
@@ -188,19 +189,25 @@
         @rtype bool
         """
         currentSettings = QtHelpDocumentationSettings.readSettings(helpEngine)
-        
-        docsToRemove = [name for name in currentSettings._namespaceToFilename
-                        if name not in settings._namespaceToFilename]
-        docsToAdd = [filename for filename in settings._filenameToNamespace
-                     if filename not in currentSettings._filenameToNamespace]
-        
+
+        docsToRemove = [
+            name
+            for name in currentSettings._namespaceToFilename
+            if name not in settings._namespaceToFilename
+        ]
+        docsToAdd = [
+            filename
+            for filename in settings._filenameToNamespace
+            if filename not in currentSettings._filenameToNamespace
+        ]
+
         changed = False
         for namespace in docsToRemove:
             helpEngine.unregisterDocumentation(namespace)
             changed = True
-        
+
         for filename in docsToAdd:
             helpEngine.registerDocumentation(filename)
             changed = True
-        
+
         return changed
--- a/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettingsWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/QtHelp/QtHelpDocumentationSettingsWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,47 +13,46 @@
 from EricWidgets.EricApplication import ericApp
 from EricWidgets import EricMessageBox, EricFileDialog
 
-from .Ui_QtHelpDocumentationSettingsWidget import (
-    Ui_QtHelpDocumentationSettingsWidget
-)
+from .Ui_QtHelpDocumentationSettingsWidget import Ui_QtHelpDocumentationSettingsWidget
 
 from .QtHelpDocumentationSettings import QtHelpDocumentationSettings
 
 
-class QtHelpDocumentationSettingsWidget(QWidget,
-                                        Ui_QtHelpDocumentationSettingsWidget):
+class QtHelpDocumentationSettingsWidget(QWidget, Ui_QtHelpDocumentationSettingsWidget):
     """
     Class implementing a widget to manage the QtHelp documentation settings.
-    
+
     @signal documentationSettingsChanged(settings) emitted to signal a change
         of the documentation configuration
     """
+
     documentationSettingsChanged = pyqtSignal(QtHelpDocumentationSettings)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__settings = None
-        
+
         try:
             self.__pluginHelpDocuments = (
                 ericApp().getObject("PluginManager").getPluginQtHelpFiles()
             )
         except KeyError:
             from PluginManager.PluginManager import PluginManager
+
             pluginManager = PluginManager(self, doLoadPlugins=False)
             pluginManager.loadDocumentationSetPlugins()
             pluginManager.activatePlugins()
             self.__pluginHelpDocuments = pluginManager.getPluginQtHelpFiles()
         self.addPluginButton.setEnabled(bool(self.__pluginHelpDocuments))
-    
+
     @pyqtSlot()
     def on_removeDocumentsButton_clicked(self):
         """
@@ -62,16 +61,16 @@
         selectedItems = self.documentsList.selectedItems()[:]
         if not selectedItems:
             return
-        
+
         for itm in selectedItems:
             namespace = itm.text()
             self.documentsList.takeItem(self.documentsList.row(itm))
             del itm
-            
+
             self.__settings.removeDocumentation(namespace)
-        
+
         self.documentationSettingsChanged.emit(self.__settings)
-    
+
     @pyqtSlot()
     def on_addDocumentsButton_clicked(self):
         """
@@ -81,12 +80,13 @@
             self,
             self.tr("Add Documentation"),
             "",
-            self.tr("Qt Compressed Help Files (*.qch)"))
+            self.tr("Qt Compressed Help Files (*.qch)"),
+        )
         if not filenames:
             return
-        
+
         self.__registerDocumentation(filenames)
-    
+
     @pyqtSlot()
     def on_addPluginButton_clicked(self):
         """
@@ -94,82 +94,86 @@
         the help database.
         """
         from .QtHelpDocumentationSelectionDialog import (
-            QtHelpDocumentationSelectionDialog
+            QtHelpDocumentationSelectionDialog,
         )
+
         dlg = QtHelpDocumentationSelectionDialog(
-            self.__pluginHelpDocuments,
-            QtHelpDocumentationSelectionDialog.AddMode,
-            self)
+            self.__pluginHelpDocuments, QtHelpDocumentationSelectionDialog.AddMode, self
+        )
         if dlg.exec() == QDialog.DialogCode.Accepted:
             documents = dlg.getData()
             if documents:
                 self.__registerDocumentation(documents)
-    
+
     def __registerDocumentation(self, filenames):
         """
         Private method to register a given list of documentations.
-        
+
         @param filenames list of documentation files to be registered
         @type list of str
         """
         added = False
-        
+
         for filename in filenames:
             if not self.__settings.addDocumentation(filename):
                 EricMessageBox.warning(
                     self,
                     self.tr("Add Documentation"),
-                    self.tr("""The file <b>{0}</b> could not be added.""")
-                    .format(filename)
+                    self.tr("""The file <b>{0}</b> could not be added.""").format(
+                        filename
+                    ),
                 )
                 continue
-            
+
             if not added:
                 added = True
                 self.documentsList.clearSelection()
-            
+
             namespace = self.__settings.namespace(filename)
             itm = QListWidgetItem(namespace)
             self.documentsList.addItem(itm)
-            
+
             itm.setSelected(True)
         self.__applyDocumentsListFilter()
-        
+
         if added:
             self.documentationSettingsChanged.emit(self.__settings)
-    
+
     @pyqtSlot()
     def on_managePluginButton_clicked(self):
         """
         Private slot to manage the QtHelp documents provided by plug-ins.
         """
         from .QtHelpDocumentationSelectionDialog import (
-            QtHelpDocumentationSelectionDialog
+            QtHelpDocumentationSelectionDialog,
         )
+
         dlg = QtHelpDocumentationSelectionDialog(
             self.__pluginHelpDocuments,
             QtHelpDocumentationSelectionDialog.ManageMode,
-            self)
+            self,
+        )
         dlg.exec()
-    
+
     @pyqtSlot()
     def on_documentsList_itemSelectionChanged(self):
         """
         Private slot handling a change of the documents selection.
         """
         self.removeDocumentsButton.setEnabled(
-            len(self.documentsList.selectedItems()) != 0)
-    
+            len(self.documentsList.selectedItems()) != 0
+        )
+
     @pyqtSlot(str)
     def on_filterEdit_textChanged(self, txt):
         """
         Private slot to react on changes of the document filter text.
-        
+
         @param txt current entry of the filter
         @type str
         """
         self.__applyDocumentsListFilter()
-    
+
     @pyqtSlot()
     def __applyDocumentsListFilter(self):
         """
@@ -179,36 +183,36 @@
         for row in range(self.documentsList.count()):
             itm = self.documentsList.item(row)
             matches = filterStr == "" or filterStr in itm.text()
-            
+
             if not matches:
                 itm.setSelected(False)
             itm.setHidden(not matches)
-    
+
     def setDocumentationSettings(self, settings):
         """
         Public method to set the reference to the QtHelp documentation
         configuration object.
-        
+
         @param settings reference to the created QtHelpDocumentationSettings
             object
         @type QtHelpDocumentationSettings
         """
         self.__settings = settings
-        
+
         self.documentsList.clear()
-        
+
         for namespace in self.__settings.namespaces():
             itm = QListWidgetItem(namespace)
             self.documentsList.addItem(itm)
         self.__applyDocumentsListFilter()
-        
+
         self.removeDocumentsButton.setEnabled(False)
-    
+
     def documentationSettings(self):
         """
         Public method to get the reference to the QtHelp documentation
         configuration object.
-        
+
         @return reference to the created QtHelpDocumentationSettings object
         @rtype QtHelpDocumentationSettings
         """
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingAPIClient.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingAPIClient.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,8 +11,13 @@
 import base64
 
 from PyQt6.QtCore import (
-    pyqtSignal, QObject, QDateTime, QUrl, QByteArray, QCoreApplication,
-    QEventLoop
+    pyqtSignal,
+    QObject,
+    QDateTime,
+    QUrl,
+    QByteArray,
+    QCoreApplication,
+    QEventLoop,
 )
 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply
 
@@ -24,20 +29,21 @@
 class SafeBrowsingAPIClient(QObject):
     """
     Class implementing the low level interface for Google Safe Browsing.
-    
+
     @signal networkError(str) emitted to indicate a network error
     """
+
     ClientId = "eric7_API_client"
     ClientVersion = "2.0.0"
-    
+
     GsbUrlTemplate = "https://safebrowsing.googleapis.com/v4/{0}?key={1}"
-    
+
     networkError = pyqtSignal(str)
-    
+
     def __init__(self, apiKey, fairUse=True, parent=None):
         """
         Constructor
-        
+
         @param apiKey API key to be used
         @type str
         @param fairUse flag indicating to follow the fair use policy
@@ -46,33 +52,33 @@
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__apiKey = apiKey
         self.__fairUse = fairUse
-        
+
         self.__nextRequestNoSoonerThan = QDateTime()
         self.__failCount = 0
-        
+
         self.__lookupApiCache = {}
         # Temporary cache used by the lookup API (v4)
         # key: URL as string
         # value: dictionary with these entries:
         #   "validUntil": (QDateTime)
         #   "threatInfo": (list of ThreatList)
-    
+
     def setApiKey(self, apiKey):
         """
         Public method to set the API key.
-        
+
         @param apiKey API key to be set
         @type str
         """
         self.__apiKey = apiKey
-    
+
     def getThreatLists(self):
         """
         Public method to retrieve all available threat lists.
-        
+
         @return tuple containing list of threat lists and an error message
         @rtype tuple of (list of dict containing 'threatType', 'platformType'
             and 'threatEntryType', bool)
@@ -80,12 +86,11 @@
         url = QUrl(self.GsbUrlTemplate.format("threatLists", self.__apiKey))
         req = QNetworkRequest(url)
         reply = WebBrowserWindow.networkManager().get(req)
-        
+
         while reply.isRunning():
-            QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.AllEvents, 200)
+            QCoreApplication.processEvents(QEventLoop.ProcessEventsFlag.AllEvents, 200)
             # max. 200 ms processing
-        
+
         res = None
         error = ""
         if reply.error() != QNetworkReply.NetworkError.NoError:
@@ -94,18 +99,18 @@
         else:
             result = self.__extractData(reply)
             res = result["threatLists"]
-        
+
         reply.deleteLater()
         return res, error
-    
+
     #######################################################################
     ## Methods below implement the 'Update API (v4)'
     #######################################################################
-    
+
     def getThreatsUpdate(self, clientStates):
         """
         Public method to fetch hash prefix updates for the given threat list.
-        
+
         @param clientStates dictionary of client states with keys like
             (threatType, platformType, threatEntryType)
         @type dict
@@ -120,10 +125,12 @@
             },
             "listUpdateRequests": [],
         }
-        
-        for (threatType, platformType, threatEntryType), currentState in (
-            clientStates.items()
-        ):
+
+        for (
+            threatType,
+            platformType,
+            threatEntryType,
+        ), currentState in clientStates.items():
             requestBody["listUpdateRequests"].append(
                 {
                     "threatType": threatType,
@@ -132,23 +139,22 @@
                     "state": currentState,
                     "constraints": {
                         "supportedCompressions": ["RAW"],
-                    }
+                    },
                 }
             )
-        
+
         data = QByteArray(json.dumps(requestBody).encode("utf-8"))
-        url = QUrl(self.GsbUrlTemplate.format("threatListUpdates:fetch",
-                                              self.__apiKey))
+        url = QUrl(self.GsbUrlTemplate.format("threatListUpdates:fetch", self.__apiKey))
         req = QNetworkRequest(url)
-        req.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                      "application/json")
+        req.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader, "application/json"
+        )
         reply = WebBrowserWindow.networkManager().post(req, data)
-        
+
         while reply.isRunning():
-            QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.AllEvents, 200)
+            QCoreApplication.processEvents(QEventLoop.ProcessEventsFlag.AllEvents, 200)
             # max. 200 ms processing
-        
+
         res = None
         error = ""
         if reply.error() != QNetworkReply.NetworkError.NoError:
@@ -157,14 +163,14 @@
         else:
             result = self.__extractData(reply)
             res = result["listUpdateResponses"]
-        
+
         reply.deleteLater()
         return res, error
-    
+
     def getFullHashes(self, prefixes, clientState):
         """
         Public method to find full hashes matching hash prefixes.
-        
+
         @param prefixes list of hash prefixes to find
         @type list of bytes
         @param clientState dictionary of client states with keys like
@@ -187,56 +193,50 @@
                 "threatEntries": [],
             },
         }
-        
+
         for prefix in prefixes:
             requestBody["threatInfo"]["threatEntries"].append(
-                {"hash": base64.b64encode(prefix).decode("ascii")})
-        
-        for (threatType, platformType, threatEntryType), currentState in (
-            clientState.items()
-        ):
+                {"hash": base64.b64encode(prefix).decode("ascii")}
+            )
+
+        for (
+            threatType,
+            platformType,
+            threatEntryType,
+        ), currentState in clientState.items():
             requestBody["clientStates"].append(currentState)
             if threatType not in requestBody["threatInfo"]["threatTypes"]:
                 requestBody["threatInfo"]["threatTypes"].append(threatType)
-            if (
-                platformType not in
-                    requestBody["threatInfo"]["platformTypes"]
-            ):
-                requestBody["threatInfo"]["platformTypes"].append(
-                    platformType)
-            if (
-                threatEntryType not in
-                    requestBody["threatInfo"]["threatEntryTypes"]
-            ):
-                requestBody["threatInfo"]["threatEntryTypes"].append(
-                    threatEntryType)
-        
+            if platformType not in requestBody["threatInfo"]["platformTypes"]:
+                requestBody["threatInfo"]["platformTypes"].append(platformType)
+            if threatEntryType not in requestBody["threatInfo"]["threatEntryTypes"]:
+                requestBody["threatInfo"]["threatEntryTypes"].append(threatEntryType)
+
         data = QByteArray(json.dumps(requestBody).encode("utf-8"))
-        url = QUrl(self.GsbUrlTemplate.format("fullHashes:find",
-                                              self.__apiKey))
+        url = QUrl(self.GsbUrlTemplate.format("fullHashes:find", self.__apiKey))
         req = QNetworkRequest(url)
-        req.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                      "application/json")
+        req.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader, "application/json"
+        )
         reply = WebBrowserWindow.networkManager().post(req, data)
-        
+
         while reply.isRunning():
-            QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.AllEvents, 200)
+            QCoreApplication.processEvents(QEventLoop.ProcessEventsFlag.AllEvents, 200)
             # max. 200 ms processing
-        
+
         res = []
         if reply.error() != QNetworkReply.NetworkError.NoError:
             self.networkError.emit(reply.errorString())
         else:
             res = self.__extractData(reply)
-        
+
         reply.deleteLater()
         return res
-    
+
     def __extractData(self, reply):
         """
         Private method to extract the data of a network reply.
-        
+
         @param reply reference to the network reply object
         @type QNetworkReply
         @return extracted data
@@ -245,11 +245,11 @@
         result = json.loads(str(reply.readAll(), "utf-8"))
         self.__setWaitDuration(result.get("minimumWaitDuration"))
         return result
-    
+
     def __setWaitDuration(self, minimumWaitDuration):
         """
         Private method to set the minimum wait duration.
-        
+
         @param minimumWaitDuration duration to be set
         @type str
         """
@@ -257,39 +257,39 @@
             self.__nextRequestNoSoonerThan = QDateTime()
         else:
             waitDuration = int(float(minimumWaitDuration.rstrip("s")))
-            self.__nextRequestNoSoonerThan = (
-                QDateTime.currentDateTime().addSecs(waitDuration)
+            self.__nextRequestNoSoonerThan = QDateTime.currentDateTime().addSecs(
+                waitDuration
             )
-    
+
     def fairUseDelayExpired(self):
         """
         Public method to check, if the fair use wait period has expired.
-        
+
         @return flag indicating expiration
         @rtype bool
         """
         return (
-            self.__fairUse and
-            QDateTime.currentDateTime() >= self.__nextRequestNoSoonerThan
+            self.__fairUse
+            and QDateTime.currentDateTime() >= self.__nextRequestNoSoonerThan
         ) or not self.__fairUse
-    
+
     def getFairUseDelayExpirationDateTime(self):
         """
         Public method to get the date and time the fair use delay will expire.
-        
+
         @return fair use delay expiration date and time
         @rtype QDateTime
         """
         return self.__nextRequestNoSoonerThan
-    
+
     #######################################################################
     ## Methods below implement the 'Lookup API (v4)'
     #######################################################################
-    
+
     def lookupUrl(self, url, platforms):
         """
         Public method to send an URL to Google for checking.
-        
+
         @param url URL to be checked
         @type QUrl
         @param platforms list of platform types to check against
@@ -299,26 +299,26 @@
         @rtype tuple of (list of ThreatList, str)
         """
         error = ""
-        
+
         # sanitize the URL by removing user info and query data
         url = url.adjusted(
-            QUrl.UrlFormattingOption.RemoveUserInfo |
-            QUrl.UrlFormattingOption.RemoveQuery |
-            QUrl.UrlFormattingOption.RemoveFragment
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemoveQuery
+            | QUrl.UrlFormattingOption.RemoveFragment
         )
         urlStr = url.toString()
-        
+
         # check the local cache first
         if urlStr in self.__lookupApiCache:
             if (
-                self.__lookupApiCache[urlStr]["validUntil"] >
-                    QDateTime.currentDateTime()
+                self.__lookupApiCache[urlStr]["validUntil"]
+                > QDateTime.currentDateTime()
             ):
                 # cached entry is still valid
                 return self.__lookupApiCache[urlStr]["threatInfo"], error
             else:
                 del self.__lookupApiCache[urlStr]
-        
+
         # no valid entry found, ask the safe browsing server
         requestBody = {
             "client": {
@@ -328,27 +328,25 @@
             "threatInfo": {
                 "threatTypes": SafeBrowsingAPIClient.definedThreatTypes(),
                 "platformTypes": platforms,
-                "threatEntryTypes":
-                    SafeBrowsingAPIClient.definedThreatEntryTypes(),
+                "threatEntryTypes": SafeBrowsingAPIClient.definedThreatEntryTypes(),
                 "threatEntries": [
                     {"url": urlStr},
                 ],
             },
         }
-        
+
         data = QByteArray(json.dumps(requestBody).encode("utf-8"))
-        url = QUrl(self.GsbUrlTemplate.format("threatMatches:find",
-                                              self.__apiKey))
+        url = QUrl(self.GsbUrlTemplate.format("threatMatches:find", self.__apiKey))
         req = QNetworkRequest(url)
-        req.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                      "application/json")
+        req.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader, "application/json"
+        )
         reply = WebBrowserWindow.networkManager().post(req, data)
-        
+
         while reply.isRunning():
-            QCoreApplication.processEvents(
-                QEventLoop.ProcessEventsFlag.AllEvents, 200)
+            QCoreApplication.processEvents(QEventLoop.ProcessEventsFlag.AllEvents, 200)
             # max. 200 ms processing
-        
+
         threats = []
         if reply.error() != QNetworkReply.NetworkError.NoError:
             error = reply.errorString()
@@ -366,30 +364,29 @@
                     threats.append(threatInfo)
                     if "cacheDuration" in match:
                         cacheDurationSec = int(
-                            match["cacheDuration"].strip().rstrip("s")
-                            .split(".")[0])
+                            match["cacheDuration"].strip().rstrip("s").split(".")[0]
+                        )
                         if cacheDurationSec > cacheDuration:
                             cacheDuration = cacheDurationSec
                 if cacheDuration > 0 and bool(threats):
-                    validUntil = QDateTime.currentDateTime().addSecs(
-                        cacheDuration)
+                    validUntil = QDateTime.currentDateTime().addSecs(cacheDuration)
                     self.__lookupApiCache[urlStr] = {
                         "validUntil": validUntil,
-                        "threatInfo": threats
+                        "threatInfo": threats,
                     }
-        
+
         reply.deleteLater()
         return threats, error
-    
+
     #######################################################################
     ## Methods below implement global (class wide) functionality
     #######################################################################
-    
+
     @classmethod
     def getThreatMessage(cls, threatType):
         """
         Class method to get a warning message for the given threat type.
-        
+
         @param threatType threat type to get the message for
         @type str
         @return threat message
@@ -402,7 +399,8 @@
                 "<h3>Malware Warning</h3>"
                 "<p>The web site you are about to visit may try to install"
                 " harmful programs on your computer in order to steal or"
-                " destroy your data.</p>")
+                " destroy your data.</p>",
+            )
         elif threatType == "social_engineering":
             msg = QCoreApplication.translate(
                 "SafeBrowsingAPI",
@@ -410,41 +408,46 @@
                 "<p>The web site you are about to visit may try to trick you"
                 " into doing something dangerous online, such as revealing"
                 " passwords or personal information, usually through a fake"
-                " website.</p>")
+                " website.</p>",
+            )
         elif threatType == "unwanted_software":
             msg = QCoreApplication.translate(
                 "SafeBrowsingAPI",
                 "<h3>Unwanted Software Warning</h3>"
                 "<p>The software you are about to download may negatively"
-                " affect your browsing or computing experience.</p>")
+                " affect your browsing or computing experience.</p>",
+            )
         elif threatType == "potentially_harmful_application":
             msg = QCoreApplication.translate(
                 "SafeBrowsingAPI",
                 "<h3>Potentially Harmful Application</h3>"
                 "<p>The web site you are about to visit may try to trick you"
                 " into installing applications, that may negatively affect"
-                " your browsing experience.</p>")
+                " your browsing experience.</p>",
+            )
         elif threatType == "malicious_binary":
             msg = QCoreApplication.translate(
                 "SafeBrowsingAPI",
                 "<h3>Malicious Binary Warning</h3>"
                 "<p>The software you are about to download may be harmful"
-                " to your computer.</p>")
+                " to your computer.</p>",
+            )
         else:
             # unknow threat
             msg = QCoreApplication.translate(
                 "SafeBrowsingAPI",
                 "<h3>Unknown Threat Warning</h3>"
                 "<p>The web site you are about to visit was found in the Safe"
-                " Browsing Database but was not classified yet.</p>")
-        
+                " Browsing Database but was not classified yet.</p>",
+            )
+
         return msg
-    
+
     @classmethod
     def getThreatType(cls, threatType):
         """
         Class method to get a display string for a given threat type.
-        
+
         @param threatType threat type to get display string for
         @type str
         @return display string
@@ -452,44 +455,49 @@
         """
         threatType = threatType.lower()
         if threatType == "malware":
-            displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Malware")
+            displayString = QCoreApplication.translate("SafeBrowsingAPI", "Malware")
         elif threatType == "social_engineering":
-            displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Phishing")
+            displayString = QCoreApplication.translate("SafeBrowsingAPI", "Phishing")
         elif threatType == "unwanted_software":
             displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Unwanted Software")
+                "SafeBrowsingAPI", "Unwanted Software"
+            )
         elif threatType == "potentially_harmful_application":
             displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Harmful Application")
+                "SafeBrowsingAPI", "Harmful Application"
+            )
         elif threatType == "malcious_binary":
             displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Malicious Binary")
+                "SafeBrowsingAPI", "Malicious Binary"
+            )
         else:
             displayString = QCoreApplication.translate(
-                "SafeBrowsingAPI", "Unknown Threat")
-        
+                "SafeBrowsingAPI", "Unknown Threat"
+            )
+
         return displayString
-    
+
     @classmethod
     def definedThreatTypes(cls):
         """
         Class method to get all threat types defined in API v4.
-        
+
         @return list of defined threat types
         @rtype list of str
         """
         return [
-            "THREAT_TYPE_UNSPECIFIED", "MALWARE", "SOCIAL_ENGINEERING",
-            "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION",
+            "THREAT_TYPE_UNSPECIFIED",
+            "MALWARE",
+            "SOCIAL_ENGINEERING",
+            "UNWANTED_SOFTWARE",
+            "POTENTIALLY_HARMFUL_APPLICATION",
         ]
-    
+
     @classmethod
     def getThreatEntryString(cls, threatEntry):
         """
         Class method to get the threat entry string.
-        
+
         @param threatEntry threat entry type as defined in the v4 API
         @type str
         @return threat entry string
@@ -498,29 +506,29 @@
         if threatEntry == "URL":
             return "URL"
         elif threatEntry == "EXECUTABLE":
-            return QCoreApplication.translate(
-                "SafeBrowsingAPI", "executable program")
+            return QCoreApplication.translate("SafeBrowsingAPI", "executable program")
         else:
-            return QCoreApplication.translate(
-                "SafeBrowsingAPI", "unknown type")
-    
+            return QCoreApplication.translate("SafeBrowsingAPI", "unknown type")
+
     @classmethod
     def definedThreatEntryTypes(cls):
         """
         Class method to get all threat entry types defined in API v4.
-        
+
         @return list of all defined threat entry types
         @rtype list of str
         """
         return [
-            "THREAT_ENTRY_TYPE_UNSPECIFIED", "URL", "EXECUTABLE",
+            "THREAT_ENTRY_TYPE_UNSPECIFIED",
+            "URL",
+            "EXECUTABLE",
         ]
-    
+
     @classmethod
     def getPlatformString(cls, platformType):
         """
         Class method to get the platform string for a given platform type.
-        
+
         @param platformType platform type as defined in the v4 API
         @type str
         @return platform string
@@ -536,22 +544,21 @@
         }
         if platformType in platformStrings:
             return platformStrings[platformType]
-        
+
         if platformType == "ANY_PLATFORM":
-            return QCoreApplication.translate(
-                "SafeBrowsingAPI", "any defined platform")
+            return QCoreApplication.translate("SafeBrowsingAPI", "any defined platform")
         elif platformType == "ALL_PLATFORMS":
             return QCoreApplication.translate(
-                "SafeBrowsingAPI", "all defined platforms")
+                "SafeBrowsingAPI", "all defined platforms"
+            )
         else:
-            return QCoreApplication.translate(
-                "SafeBrowsingAPI", "unknown platform")
-    
+            return QCoreApplication.translate("SafeBrowsingAPI", "unknown platform")
+
     @classmethod
     def getPlatformTypes(cls, platform):
         """
         Class method to get the platform types for a given platform.
-        
+
         @param platform platform string
         @type str (one of 'linux', 'windows', 'macos')
         @return list of platform types as defined in the v4 API for the
@@ -560,10 +567,10 @@
         @exception ValueError raised to indicate an invalid platform string
         """
         platform = platform.lower()
-        
+
         if platform not in ("linux", "windows", "macos"):
             raise ValueError("Unsupported platform")
-        
+
         platformTypes = ["ANY_PLATFORM", "ALL_PLATFORMS"]
         if platform == "linux":
             platformTypes.append("LINUX")
@@ -571,18 +578,25 @@
             platformTypes.append("WINDOWS")
         else:
             platformTypes.append("OSX")
-        
+
         return platformTypes
-    
+
     @classmethod
     def definedPlatformTypes(cls):
         """
         Class method to get all platform types defined in API v4.
-        
+
         @return list of all defined platform types
         @rtype list of str
         """
         return [
-            "PLATFORM_TYPE_UNSPECIFIED", "WINDOWS", "LINUX", "ANDROID", "OSX",
-            "IOS", "ANY_PLATFORM", "ALL_PLATFORMS", "CHROME",
+            "PLATFORM_TYPE_UNSPECIFIED",
+            "WINDOWS",
+            "LINUX",
+            "ANDROID",
+            "OSX",
+            "IOS",
+            "ANY_PLATFORM",
+            "ALL_PLATFORMS",
+            "CHROME",
         ]
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingCache.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingCache.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,7 +17,11 @@
 import os
 
 from PyQt6.QtCore import (
-    QObject, QByteArray, QCryptographicHash, QCoreApplication, QEventLoop
+    QObject,
+    QByteArray,
+    QCryptographicHash,
+    QCoreApplication,
+    QEventLoop,
 )
 from PyQt6.QtSql import QSql, QSqlDatabase, QSqlQuery
 
@@ -28,6 +32,7 @@
     """
     Class implementing a cache for Google Safe Browsing.
     """
+
     create_threat_list_stmt = """
         CREATE TABLE threat_list
         (threat_type character varying(128) NOT NULL,
@@ -39,7 +44,7 @@
         )
     """
     drop_threat_list_stmt = """DROP TABLE IF EXISTS threat_list"""
-    
+
     create_full_hashes_stmt = """
         CREATE TABLE full_hash
         (value BLOB NOT NULL,
@@ -54,7 +59,7 @@
         )
     """
     drop_full_hashes_stmt = """DROP TABLE IF EXISTS full_hash"""
-    
+
     create_hash_prefix_stmt = """
         CREATE TABLE hash_prefix
         (value BLOB NOT NULL,
@@ -72,49 +77,49 @@
         )
     """
     drop_hash_prefix_stmt = """DROP TABLE IF EXISTS hash_prefix"""
-    
+
     create_full_hash_cue_idx = """
         CREATE INDEX idx_hash_prefix_cue ON hash_prefix (cue)
     """
     drop_full_hash_cue_idx = """DROP INDEX IF EXISTS idx_hash_prefix_cue"""
-    
+
     create_full_hash_expires_idx = """
         CREATE INDEX idx_full_hash_expires_at ON full_hash (expires_at)
     """
     drop_full_hash_expires_idx = """
         DROP INDEX IF EXISTS idx_full_hash_expires_at
     """
-    
+
     create_full_hash_value_idx = """
         CREATE INDEX idx_full_hash_value ON full_hash (value)
     """
     drop_full_hash_value_idx = """DROP INDEX IF EXISTS idx_full_hash_value"""
-    
+
     maxProcessEventsTime = 500
-    
+
     def __init__(self, dbPath, parent=None):
         """
         Constructor
-        
+
         @param dbPath path to store the cache DB into
         @type str
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         self.__connectionName = "SafeBrowsingCache"
-        
+
         if not os.path.exists(dbPath):
             os.makedirs(dbPath)
-        
+
         self.__dbFileName = os.path.join(dbPath, "SafeBrowsingCache.db")
         preparationNeeded = not os.path.exists(self.__dbFileName)
-        
+
         self.__openCacheDb()
         if preparationNeeded:
             self.prepareCacheDb()
-    
+
     def close(self):
         """
         Public method to close the database.
@@ -122,11 +127,11 @@
         if QSqlDatabase.database(self.__connectionName).isOpen():
             QSqlDatabase.database(self.__connectionName).close()
             QSqlDatabase.removeDatabase(self.__connectionName)
-    
+
     def __openCacheDb(self):
         """
         Private method to open the cache database.
-        
+
         @return flag indicating the open state
         @rtype bool
         """
@@ -141,7 +146,7 @@
         else:
             opened = True
         return opened
-    
+
     def prepareCacheDb(self):
         """
         Public method to prepare the cache database.
@@ -169,12 +174,12 @@
         finally:
             del query
             db.commit()
-    
+
     def lookupFullHashes(self, hashValues):
         """
         Public method to get a list of threat lists and expiration flag
         for the given hashes if a hash is blacklisted.
-        
+
         @param hashValues list of hash values to look up
         @type list of bytes
         @return list of tuples containing the threat list info and the
@@ -187,42 +192,42 @@
             FROM full_hash WHERE value IN ({0})
         """
         output = []
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
             try:
                 query = QSqlQuery(db)
-                query.prepare(
-                    queryStr.format(",".join(["?"] * len(hashValues))))
+                query.prepare(queryStr.format(",".join(["?"] * len(hashValues))))
                 for hashValue in hashValues:
                     query.addBindValue(
                         QByteArray(hashValue),
-                        QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary)
-                
+                        QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                    )
+
                 query.exec()
-                
-                while query.next():             # __IGNORE_WARNING_M523__
+
+                while query.next():  # __IGNORE_WARNING_M523__
                     threatType = query.value(0)
                     platformType = query.value(1)
                     threatEntryType = query.value(2)
                     hasExpired = bool(query.value(3))
-                    threatList = ThreatList(threatType, platformType,
-                                            threatEntryType)
+                    threatList = ThreatList(threatType, platformType, threatEntryType)
                     output.append((threatList, hasExpired))
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
                 del query
             finally:
                 db.commit()
-        
+
         return output
-    
+
     def lookupHashPrefix(self, prefixes):
         """
         Public method to look up hash prefixes in the local cache.
-        
+
         @param prefixes list of hash prefixes to look up
         @type list of bytes
         @return list of tuples containing the threat list, full hash and
@@ -235,42 +240,40 @@
             FROM hash_prefix WHERE cue IN ({0})
         """
         output = []
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
             try:
                 query = QSqlQuery(db)
-                query.prepare(
-                    queryStr.format(",".join(["?"] * len(prefixes))))
+                query.prepare(queryStr.format(",".join(["?"] * len(prefixes))))
                 for prefix in prefixes:
                     query.addBindValue(prefix)
-                
+
                 query.exec()
-                
-                while query.next():             # __IGNORE_WARNING_M523__
+
+                while query.next():  # __IGNORE_WARNING_M523__
                     fullHash = bytes(query.value(0))
                     threatType = query.value(1)
                     platformType = query.value(2)
                     threatEntryType = query.value(3)
                     negativeCacheExpired = bool(query.value(4))
-                    threatList = ThreatList(threatType, platformType,
-                                            threatEntryType)
+                    threatList = ThreatList(threatType, platformType, threatEntryType)
                     output.append((threatList, fullHash, negativeCacheExpired))
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
                 del query
             finally:
                 db.commit()
-        
+
         return output
-    
-    def storeFullHash(self, threatList, hashValue, cacheDuration,
-                      malwareThreatType):
+
+    def storeFullHash(self, threatList, hashValue, cacheDuration, malwareThreatType):
         """
         Public method to store full hash data in the cache database.
-        
+
         @param threatList threat list info object
         @type ThreatList
         @param hashValue hash to be stored
@@ -287,15 +290,15 @@
             VALUES
                 (?, ?, ?, ?, ?, current_timestamp)
         """
-        updateQueryStr = (
-            """
+        updateQueryStr = """
             UPDATE full_hash SET
             expires_at=datetime(current_timestamp, '+{0} SECONDS')
             WHERE value=? AND threat_type=? AND platform_type=? AND
             threat_entry_type=?
-            """.format(int(cacheDuration))
+            """.format(
+            int(cacheDuration)
         )
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -304,19 +307,21 @@
                 query.prepare(insertQueryStr)
                 query.addBindValue(
                     QByteArray(hashValue),
-                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary)
+                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                )
                 query.addBindValue(threatList.threatType)
                 query.addBindValue(threatList.platformType)
                 query.addBindValue(threatList.threatEntryType)
                 query.addBindValue(malwareThreatType)
                 query.exec()
                 del query
-                
+
                 query = QSqlQuery(db)
                 query.prepare(updateQueryStr)
                 query.addBindValue(
                     QByteArray(hashValue),
-                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary)
+                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                )
                 query.addBindValue(threatList.threatType)
                 query.addBindValue(threatList.platformType)
                 query.addBindValue(threatList.threatEntryType)
@@ -324,11 +329,11 @@
                 del query
             finally:
                 db.commit()
-    
+
     def deleteHashPrefixList(self, threatList):
         """
         Public method to delete hash prefixes for a given threat list.
-        
+
         @param threatList threat list info object
         @type ThreatList
         """
@@ -336,7 +341,7 @@
             DELETE FROM hash_prefix
                 WHERE threat_type=? AND platform_type=? AND threat_entry_type=?
         """
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -350,22 +355,22 @@
                 del query
             finally:
                 db.commit()
-    
+
     def cleanupFullHashes(self, keepExpiredFor=43200):
         """
         Public method to clean up full hash entries expired more than the
         given time.
-        
+
         @param keepExpiredFor time period in seconds of entries to be expired
         @type int or float
         """
-        queryStr = (
-            """
+        queryStr = """
             DELETE FROM full_hash
             WHERE expires_at=datetime(current_timestamp, '{0} SECONDS')
-            """.format(int(keepExpiredFor))
+            """.format(
+            int(keepExpiredFor)
         )
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -376,12 +381,11 @@
                 del query
             finally:
                 db.commit()
-    
-    def updateHashPrefixExpiration(self, threatList, hashPrefix,
-                                   negativeCacheDuration):
+
+    def updateHashPrefixExpiration(self, threatList, hashPrefix, negativeCacheDuration):
         """
         Public method to update the hash prefix expiration time.
-        
+
         @param threatList threat list info object
         @type ThreatList
         @param hashPrefix hash prefix
@@ -390,15 +394,15 @@
             in the cache
         @type int or float
         """
-        queryStr = (
-            """
+        queryStr = """
             UPDATE hash_prefix
             SET negative_expires_at=datetime(current_timestamp, '+{0} SECONDS')
             WHERE value=? AND threat_type=? AND platform_type=? AND
             threat_entry_type=?
-            """.format(int(negativeCacheDuration))
+            """.format(
+            int(negativeCacheDuration)
         )
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -407,7 +411,8 @@
                 query.prepare(queryStr)
                 query.addBindValue(
                     QByteArray(hashPrefix),
-                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary)
+                    QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                )
                 query.addBindValue(threatList.threatType)
                 query.addBindValue(threatList.platformType)
                 query.addBindValue(threatList.threatEntryType)
@@ -415,11 +420,11 @@
                 del query
             finally:
                 db.commit()
-    
+
     def getThreatLists(self):
         """
         Public method to get the available threat lists.
-        
+
         @return list of available threat lists
         @rtype list of tuples of (ThreatList, str)
         """
@@ -428,37 +433,37 @@
             FROM threat_list
         """
         output = []
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
             try:
                 query = QSqlQuery(db)
                 query.prepare(queryStr)
-                
+
                 query.exec()
-                
-                while query.next():             # __IGNORE_WARNING_M523__
+
+                while query.next():  # __IGNORE_WARNING_M523__
                     threatType = query.value(0)
                     platformType = query.value(1)
                     threatEntryType = query.value(2)
                     clientState = query.value(3)
-                    threatList = ThreatList(threatType, platformType,
-                                            threatEntryType)
+                    threatList = ThreatList(threatType, platformType, threatEntryType)
                     output.append((threatList, clientState))
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
                 del query
             finally:
                 db.commit()
-        
+
         return output
-    
+
     def addThreatList(self, threatList):
         """
         Public method to add a threat list to the cache.
-        
+
         @param threatList threat list to be added
         @type ThreatList
         """
@@ -467,7 +472,7 @@
                 (threat_type, platform_type, threat_entry_type, timestamp)
             VALUES (?, ?, ?, current_timestamp)
         """
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -481,11 +486,11 @@
                 del query
             finally:
                 db.commit()
-    
+
     def deleteThreatList(self, threatList):
         """
         Public method to delete a threat list from the cache.
-        
+
         @param threatList threat list to be deleted
         @type ThreatList
         """
@@ -493,7 +498,7 @@
             DELETE FROM threat_list
                 WHERE threat_type=? AND platform_type=? AND threat_entry_type=?
         """
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -507,11 +512,11 @@
                 del query
             finally:
                 db.commit()
-    
+
     def updateThreatListClientState(self, threatList, clientState):
         """
         Public method to update the client state of a threat list.
-        
+
         @param threatList threat list to update the client state for
         @type ThreatList
         @param clientState new client state
@@ -521,7 +526,7 @@
             UPDATE threat_list SET timestamp=current_timestamp, client_state=?
             WHERE threat_type=? AND platform_type=? AND threat_entry_type=?
         """
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -536,12 +541,12 @@
                 del query
             finally:
                 db.commit()
-    
+
     def hashPrefixListChecksum(self, threatList):
         """
         Public method to calculate the SHA256 checksum for an alphabetically
         sorted concatenated list of hash prefixes.
-        
+
         @param threatList threat list to calculate checksum for
         @type ThreatList
         @return SHA256 checksum
@@ -553,38 +558,38 @@
                 ORDER BY value
         """
         checksum = None
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
-            sha256Hash = QCryptographicHash(
-                QCryptographicHash.Algorithm.Sha256)
+            sha256Hash = QCryptographicHash(QCryptographicHash.Algorithm.Sha256)
             try:
                 query = QSqlQuery(db)
                 query.prepare(queryStr)
                 query.addBindValue(threatList.threatType)
                 query.addBindValue(threatList.platformType)
                 query.addBindValue(threatList.threatEntryType)
-                
+
                 query.exec()
-                
-                while query.next():             # __IGNORE_WARNING_M523__
+
+                while query.next():  # __IGNORE_WARNING_M523__
                     sha256Hash.addData(query.value(0))
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
                 del query
             finally:
                 db.commit()
-            
+
             checksum = bytes(sha256Hash.result())
-        
+
         return checksum
-    
+
     def populateHashPrefixList(self, threatList, prefixes):
         """
         Public method to populate the hash prefixes for a threat list.
-        
+
         @param threatList threat list of the hash prefixes
         @type ThreatList
         @param prefixes list of hash prefixes to be inserted
@@ -596,7 +601,7 @@
                  timestamp)
                 VALUES (?, ?, ?, ?, ?, current_timestamp)
         """
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -606,7 +611,8 @@
                     query.prepare(queryStr)
                     query.addBindValue(
                         QByteArray(prefix),
-                        QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary)
+                        QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                    )
                     query.addBindValue(prefix[:4].hex())
                     query.addBindValue(threatList.threatType)
                     query.addBindValue(threatList.platformType)
@@ -615,15 +621,16 @@
                     del query
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
             finally:
                 db.commit()
-    
+
     def getHashPrefixValuesToRemove(self, threatList, indexes):
         """
         Public method to get the hash prefix values to be removed from the
         cache.
-        
+
         @param threatList threat list to remove prefixes from
         @type ThreatList
         @param indexes list of indexes of prefixes to be removed
@@ -638,7 +645,7 @@
         """
         indexes = set(indexes)
         output = []
-        
+
         db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen():
             db.transaction()
@@ -648,54 +655,50 @@
                 query.addBindValue(threatList.threatType)
                 query.addBindValue(threatList.platformType)
                 query.addBindValue(threatList.threatEntryType)
-                
+
                 query.exec()
-                
+
                 index = 0
-                while query.next():         # __IGNORE_WARNING_M523__
+                while query.next():  # __IGNORE_WARNING_M523__
                     if index in indexes:
                         prefix = bytes(query.value(0))
                         output.append(prefix)
                     index += 1
                     QCoreApplication.processEvents(
                         QEventLoop.ProcessEventsFlag.AllEvents,
-                        self.maxProcessEventsTime)
+                        self.maxProcessEventsTime,
+                    )
                 del query
             finally:
                 db.commit()
-        
+
         return output
-    
+
     def removeHashPrefixIndices(self, threatList, indexes):
         """
         Public method to remove hash prefixes from the cache.
-        
+
         @param threatList threat list to delete hash prefixes of
         @type ThreatList
         @param indexes list of indexes of prefixes to be removed
         @type list of int
         """
-        queryStr = (
-            """
+        queryStr = """
             DELETE FROM hash_prefix
             WHERE threat_type=? AND platform_type=? AND
             threat_entry_type=? AND value IN ({0})
             """
-        )
         batchSize = 40
-        
-        prefixesToRemove = self.getHashPrefixValuesToRemove(
-            threatList, indexes)
+
+        prefixesToRemove = self.getHashPrefixValuesToRemove(threatList, indexes)
         if prefixesToRemove:
             db = QSqlDatabase.database(self.__connectionName)
             if db.isOpen():
                 db.transaction()
                 try:
                     for index in range(0, len(prefixesToRemove), batchSize):
-                        removeBatch = prefixesToRemove[
-                            index:(index + batchSize)
-                        ]
-                        
+                        removeBatch = prefixesToRemove[index : (index + batchSize)]
+
                         query = QSqlQuery(db)
                         query.prepare(
                             queryStr.format(",".join(["?"] * len(removeBatch)))
@@ -706,15 +709,17 @@
                         for prefix in removeBatch:
                             query.addBindValue(
                                 QByteArray(prefix),
-                                QSql.ParamTypeFlag.In |
-                                QSql.ParamTypeFlag.Binary)
+                                QSql.ParamTypeFlag.In | QSql.ParamTypeFlag.Binary,
+                            )
                         query.exec()
                         del query
                         QCoreApplication.processEvents(
                             QEventLoop.ProcessEventsFlag.AllEvents,
-                            self.maxProcessEventsTime)
+                            self.maxProcessEventsTime,
+                        )
                 finally:
                     db.commit()
 
+
 #
 # eflag: noqa = S608
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import pyqtSlot, Qt, QUrl, QDateTime
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton
 
 from EricWidgets import EricMessageBox
 from EricGui.EricOverrideCursor import EricOverrideCursor
@@ -25,10 +23,11 @@
     """
     Class implementing a dialog to configure safe browsing support.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the safe browsing manager
         @type SafeBrowsingManager
         @param parent reference to the parent widget
@@ -37,30 +36,26 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__manager = manager
         self.__manager.progressMessage.connect(self.__setProgressMessage)
         self.__manager.progress.connect(self.__setProgress)
-        
-        self.iconLabel.setPixmap(
-            UI.PixmapCache.getPixmap("safeBrowsing48"))
-        
+
+        self.iconLabel.setPixmap(UI.PixmapCache.getPixmap("safeBrowsing48"))
+
         self.__gsbHelpDialog = None
-        
+
         self.__enabled = Preferences.getWebBrowser("SafeBrowsingEnabled")
         self.__apiKey = Preferences.getWebBrowser("SafeBrowsingApiKey")
-        self.__filterPlatform = Preferences.getWebBrowser(
-            "SafeBrowsingFilterPlatform")
-        self.__automaticUpdate = Preferences.getWebBrowser(
-            "SafeBrowsingAutoUpdate")
-        self.__useLookupApi = Preferences.getWebBrowser(
-            "SafeBrowsingUseLookupApi")
-        
+        self.__filterPlatform = Preferences.getWebBrowser("SafeBrowsingFilterPlatform")
+        self.__automaticUpdate = Preferences.getWebBrowser("SafeBrowsingAutoUpdate")
+        self.__useLookupApi = Preferences.getWebBrowser("SafeBrowsingUseLookupApi")
+
         self.buttonBox.setFocus()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def show(self):
         """
         Public slot to show the dialog.
@@ -70,11 +65,11 @@
         self.gsbFilterPlatformCheckBox.setChecked(self.__filterPlatform)
         self.gsbAutoUpdateCheckBox.setChecked(self.__automaticUpdate)
         self.gsbLookupCheckBox.setChecked(self.__useLookupApi)
-        
+
         self.__updateCacheButtons()
-        
+
         super().show()
-    
+
     @pyqtSlot()
     def on_gsbHelpButton_clicked(self):
         """
@@ -84,31 +79,31 @@
         if self.__gsbHelpDialog is None:
             from EricWidgets.EricSimpleHelpDialog import EricSimpleHelpDialog
             from . import SafeBrowsingHelp
-            
+
             helpStr = SafeBrowsingHelp()
             self.__gsbHelpDialog = EricSimpleHelpDialog(
                 title=self.tr("Google Safe Browsing API Help"),
-                helpStr=helpStr, parent=self)
-        
+                helpStr=helpStr,
+                parent=self,
+            )
+
         self.__gsbHelpDialog.show()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot called by a button of the button box clicked.
-        
+
         @param button button that was clicked (QAbstractButton)
         """
-        if button == self.buttonBox.button(
-            QDialogButtonBox.StandardButton.Close
-        ):
+        if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close):
             self.close()
-    
+
     @pyqtSlot()
     def __save(self):
         """
         Private slot to save the configuration.
-        
+
         @return flag indicating success
         @rtype bool
         """
@@ -117,26 +112,23 @@
         self.__filterPlatform = self.gsbFilterPlatformCheckBox.isChecked()
         self.__automaticUpdate = self.gsbAutoUpdateCheckBox.isChecked()
         self.__useLookupApi = self.gsbLookupCheckBox.isChecked()
-        
+
         Preferences.setWebBrowser("SafeBrowsingEnabled", self.__enabled)
         Preferences.setWebBrowser("SafeBrowsingApiKey", self.__apiKey)
-        Preferences.setWebBrowser("SafeBrowsingFilterPlatform",
-                                  self.__filterPlatform)
-        Preferences.setWebBrowser("SafeBrowsingAutoUpdate",
-                                  self.__automaticUpdate)
-        Preferences.setWebBrowser("SafeBrowsingUseLookupApi",
-                                  self.__useLookupApi)
-        
+        Preferences.setWebBrowser("SafeBrowsingFilterPlatform", self.__filterPlatform)
+        Preferences.setWebBrowser("SafeBrowsingAutoUpdate", self.__automaticUpdate)
+        Preferences.setWebBrowser("SafeBrowsingUseLookupApi", self.__useLookupApi)
+
         self.__manager.configurationChanged()
-        
+
         self.__updateCacheButtons()
-        
+
         return True
-    
+
     def closeEvent(self, evt):
         """
         Protected method to handle close events.
-        
+
         @param evt reference to the close event
         @type QCloseEvent
         """
@@ -144,28 +136,26 @@
             evt.accept()
         else:
             evt.ignore()
-    
+
     def __isModified(self):
         """
         Private method to check, if the dialog contains modified data.
-        
+
         @return flag indicating the presence of modified data
         @rtype bool
         """
         return (
-            (self.__enabled != self.gsbGroupBox.isChecked()) or
-            (self.__apiKey != self.gsbApiKeyEdit.text()) or
-            (self.__filterPlatform !=
-                self.gsbFilterPlatformCheckBox.isChecked()) or
-            (self.__automaticUpdate !=
-                self.gsbAutoUpdateCheckBox.isChecked()) or
-            (self.__useLookupApi != self.gsbLookupCheckBox.isChecked())
+            (self.__enabled != self.gsbGroupBox.isChecked())
+            or (self.__apiKey != self.gsbApiKeyEdit.text())
+            or (self.__filterPlatform != self.gsbFilterPlatformCheckBox.isChecked())
+            or (self.__automaticUpdate != self.gsbAutoUpdateCheckBox.isChecked())
+            or (self.__useLookupApi != self.gsbLookupCheckBox.isChecked())
         )
-    
+
     def __okToClose(self):
         """
         Private method to check, if it is safe to close the dialog.
-        
+
         @return flag indicating safe to close
         @rtype bool
         """
@@ -174,22 +164,23 @@
                 self,
                 self.tr("Safe Browsing Management"),
                 self.tr("""The dialog contains unsaved changes."""),
-                self.__save)
+                self.__save,
+            )
             if not res:
                 return False
         return True
-    
+
     def __updateCacheButtons(self):
         """
         Private method to set enabled state of the cache buttons.
         """
         enable = self.__enabled and bool(self.__apiKey)
-        
+
         self.updateCacheButton.setEnabled(enable)
         self.clearCacheButton.setEnabled(enable)
-        
+
         self.showUpdateTimeButton.setEnabled(enable and self.__automaticUpdate)
-    
+
     @pyqtSlot()
     def on_updateCacheButton_clicked(self):
         """
@@ -198,9 +189,12 @@
         EricMessageBox.information(
             self,
             self.tr("Update Safe Browsing Cache"),
-            self.tr("""Updating the Safe Browsing cache might be a lengthy"""
-                    """ operation. Please be patient!"""))
-        
+            self.tr(
+                """Updating the Safe Browsing cache might be a lengthy"""
+                """ operation. Please be patient!"""
+            ),
+        )
+
         with EricOverrideCursor():
             ok, error = self.__manager.updateHashPrefixCache()
             self.__resetProgress()
@@ -209,15 +203,20 @@
                 EricMessageBox.critical(
                     self,
                     self.tr("Update Safe Browsing Cache"),
-                    self.tr("""<p>Updating the Safe Browsing cache failed."""
-                            """</p><p>Reason: {0}</p>""").format(error))
+                    self.tr(
+                        """<p>Updating the Safe Browsing cache failed."""
+                        """</p><p>Reason: {0}</p>"""
+                    ).format(error),
+                )
             else:
                 EricMessageBox.critical(
                     self,
                     self.tr("Update Safe Browsing Cache"),
-                    self.tr("""<p>Updating the Safe Browsing cache failed."""
-                            """</p>"""))
-    
+                    self.tr(
+                        """<p>Updating the Safe Browsing cache failed.""" """</p>"""
+                    ),
+                )
+
     @pyqtSlot()
     def on_clearCacheButton_clicked(self):
         """
@@ -226,17 +225,20 @@
         res = EricMessageBox.yesNo(
             self,
             self.tr("Clear Safe Browsing Cache"),
-            self.tr("""Do you really want to clear the Safe Browsing cache?"""
-                    """ Re-populating it might take some time."""))
+            self.tr(
+                """Do you really want to clear the Safe Browsing cache?"""
+                """ Re-populating it might take some time."""
+            ),
+        )
         if res:
             with EricOverrideCursor():
                 self.__manager.fullCacheCleanup()
-    
+
     @pyqtSlot(str, int)
     def __setProgressMessage(self, message, maximum):
         """
         Private slot to set the progress message and the maximum value.
-        
+
         @param message progress message to be set
         @type str
         @param maximum maximum value to be set
@@ -245,18 +247,18 @@
         self.progressLabel.setText(message)
         self.progressBar.setMaximum(maximum)
         self.progressBar.setValue(0)
-    
+
     @pyqtSlot(int)
     def __setProgress(self, value):
         """
         Private slot to set the progress value.
-        
+
         @param value progress value to be set
         @type int
         """
         if bool(self.progressLabel.text()):
             self.progressBar.setValue(value)
-    
+
     def __resetProgress(self):
         """
         Private method to reset the progress info.
@@ -264,23 +266,23 @@
         self.progressLabel.clear()
         self.progressBar.setMaximum(100)
         self.progressBar.setValue(0)
-    
+
     @pyqtSlot(str)
     def on_urlEdit_textChanged(self, text):
         """
         Private slot to handle changes of the entered URL text.
-        
+
         @param text entered URL text
         @type str
         """
         url = QUrl.fromUserInput(text)
         enable = (
-            url.isValid() and
-            bool(url.scheme()) and
-            url.scheme() not in self.__manager.getIgnoreSchemes()
+            url.isValid()
+            and bool(url.scheme())
+            and url.scheme() not in self.__manager.getIgnoreSchemes()
         )
         self.urlCheckButton.setEnabled(enable)
-    
+
     @pyqtSlot()
     def on_urlCheckButton_clicked(self):
         """
@@ -293,57 +295,60 @@
         urlStr = self.urlEdit.text()
         url = QUrl.fromUserInput(urlStr)
         threatLists, error = self.__manager.lookupUrl(url)
-        
+
         if error:
             EricMessageBox.warning(
                 self,
                 self.tr("Check URL"),
-                self.tr("<p>The Google Safe Browsing Server reported an"
-                        " error.</p><p>{0}</p>").format(error)
+                self.tr(
+                    "<p>The Google Safe Browsing Server reported an"
+                    " error.</p><p>{0}</p>"
+                ).format(error),
             )
         elif threatLists:
             threatMessages = self.__manager.getThreatMessages(threatLists)
             EricMessageBox.warning(
                 self,
                 self.tr("Check URL"),
-                self.tr("<p>The URL <b>{0}</b> was found in the Safe"
-                        " Browsing Database.</p>{1}").format(
-                    urlStr, "".join(threatMessages))
+                self.tr(
+                    "<p>The URL <b>{0}</b> was found in the Safe"
+                    " Browsing Database.</p>{1}"
+                ).format(urlStr, "".join(threatMessages)),
             )
         else:
             EricMessageBox.information(
                 self,
                 self.tr("Check URL"),
-                self.tr("<p>The URL <b>{0}</b> was not found in the Safe"
-                        " Browsing Database and may be considered safe."
-                        "</p>")
-                .format(urlStr)
+                self.tr(
+                    "<p>The URL <b>{0}</b> was not found in the Safe"
+                    " Browsing Database and may be considered safe."
+                    "</p>"
+                ).format(urlStr),
             )
-    
+
     @pyqtSlot()
     def on_saveButton_clicked(self):
         """
         Private slot to save the configuration data.
         """
         self.__save()
-    
+
     @pyqtSlot()
     def on_showUpdateTimeButton_clicked(self):
         """
         Private slot to show the time of the next automatic threat list update.
         """
-        nextUpdateDateTime = Preferences.getWebBrowser(
-            "SafeBrowsingUpdateDateTime")
+        nextUpdateDateTime = Preferences.getWebBrowser("SafeBrowsingUpdateDateTime")
         message = (
             self.tr("The next automatic threat list update will be done now.")
-            if (not nextUpdateDateTime.isValid() or
-                nextUpdateDateTime <= QDateTime.currentDateTime()) else
-            self.tr("<p>The next automatic threat list update will be done at"
-                    " <b>{0}</b>.</p>").format(
-                nextUpdateDateTime.toString("yyyy-MM-dd, HH:mm:ss"))
+            if (
+                not nextUpdateDateTime.isValid()
+                or nextUpdateDateTime <= QDateTime.currentDateTime()
+            )
+            else self.tr(
+                "<p>The next automatic threat list update will be done at"
+                " <b>{0}</b>.</p>"
+            ).format(nextUpdateDateTime.toString("yyyy-MM-dd, HH:mm:ss"))
         )
-        
-        EricMessageBox.information(
-            self,
-            self.tr("Update Time"),
-            message)
+
+        EricMessageBox.information(self, self.tr("Update Time"), message)
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingInfoWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingInfoWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,36 +17,38 @@
     """
     Class implementing a widget to show some threat information.
     """
+
     def __init__(self, info, parent=None):
         """
         Constructor
-        
+
         @param info information string to be shown
         @type str
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.setMinimumWidth(500)
-        
+
         layout = QHBoxLayout(self)
-        
+
         iconLabel = QLabel(self)
         iconLabel.setPixmap(UI.PixmapCache.getPixmap("safeBrowsing48"))
         layout.addWidget(iconLabel, 0, Qt.AlignmentFlag.AlignTop)
-        
+
         infoLabel = QLabel(self)
         infoLabel.setWordWrap(True)
-        infoLabel.setSizePolicy(QSizePolicy.Policy.Expanding,
-                                QSizePolicy.Policy.Expanding)
+        infoLabel.setSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding
+        )
         infoLabel.setText(info)
         layout.addWidget(infoLabel, 0, Qt.AlignmentFlag.AlignTop)
-    
+
     def showAt(self, pos):
         """
         Public method to show the widget.
-        
+
         @param pos position to show at
         @type QPoint
         """
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingLabel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingLabel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,54 +14,55 @@
 class SafeBrowsingLabel(QLabel):
     """
     Class implementing a label to show some Safe Browsing info.
-    
+
     @signal clicked(pos) emitted to indicate a click of the label (QPoint)
     """
+
     clicked = pyqtSignal(QPoint)
-    
+
     nokStyle = "QLabel { color : white; background-color : red; }"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.setCursor(Qt.CursorShape.PointingHandCursor)
-        
+
         self.setStyleSheet(SafeBrowsingLabel.nokStyle)
-        
+
         self.__threatType = ""
         self.__threatMessages = ""
-        
+
         self.__deafultText = self.tr("Malicious Site")
         self.__updateLabel()
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse release events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.clicked.emit(evt.globalPosition().toPoint())
         else:
             super().mouseReleaseEvent(evt)
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double click events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.clicked.emit(evt.globalPosition().toPoint())
         else:
             super().mouseDoubleClickEvent(evt)
-    
+
     @pyqtSlot()
     def __updateLabel(self):
         """
@@ -71,12 +72,12 @@
             self.setText(self.__threatType)
         else:
             self.setText(self.__deafultText)
-    
+
     @pyqtSlot(str, str)
     def setThreatInfo(self, threatType, threatMessages):
         """
         Public slot to set threat information.
-        
+
         @param threatType threat type
         @type str
         @param threatMessages more verbose info about detected threats
@@ -84,13 +85,13 @@
         """
         self.__threatType = threatType
         self.__threatMessages = threatMessages
-        
+
         self.__updateLabel()
-    
+
     def getThreatInfo(self):
         """
         Public method to get the threat info text.
-        
+
         @return threat info text
         @rtype str
         """
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,13 @@
 import base64
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QObject, QCoreApplication, QUrl, QDateTime, QTimer
+    pyqtSignal,
+    pyqtSlot,
+    QObject,
+    QCoreApplication,
+    QUrl,
+    QDateTime,
+    QTimer,
 )
 
 import Preferences
@@ -36,47 +42,48 @@
 class SafeBrowsingManager(QObject):
     """
     Class implementing the interface for Google Safe Browsing.
-    
+
     @signal progressMessage(message,maximum) emitted to give a message for the
         action about to be performed and the maximum value
     @signal progress(current) emitted to signal the current progress
     """
+
     progressMessage = pyqtSignal(str, int)
     progress = pyqtSignal(int)
-    
-    enabled = (
-        Preferences.getWebBrowser("SafeBrowsingEnabled") and
-        bool(Preferences.getWebBrowser("SafeBrowsingApiKey"))
+
+    enabled = Preferences.getWebBrowser("SafeBrowsingEnabled") and bool(
+        Preferences.getWebBrowser("SafeBrowsingApiKey")
     )
-    
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.__apiKey = Preferences.getWebBrowser("SafeBrowsingApiKey")
         if self.__apiKey:
-            self.__apiClient = SafeBrowsingAPIClient(self.__apiKey,
-                                                     parent=self)
+            self.__apiClient = SafeBrowsingAPIClient(self.__apiKey, parent=self)
         else:
             self.__apiClient = None
-        
+
         gsbCachePath = os.path.join(
-            Utilities.getConfigDir(), "web_browser", "safe_browsing")
+            Utilities.getConfigDir(), "web_browser", "safe_browsing"
+        )
         self.__cache = SafeBrowsingCache(gsbCachePath, self)
-        
+
         self.__gsbDialog = None
         self.__setPlatforms()
         self.__setLookupMethod()
-        
+
         self.__updatingThreatLists = False
         self.__threatListsUpdateTimer = QTimer(self)
         self.__threatListsUpdateTimer.setSingleShot(True)
         self.__threatListsUpdateTimer.timeout.connect(
-            self.__threatListsUpdateTimerTimeout)
+            self.__threatListsUpdateTimerTimeout
+        )
         self.__setAutoUpdateThreatLists()
-    
+
     def configurationChanged(self):
         """
         Public method to handle changes of the settings.
@@ -88,17 +95,16 @@
                 if self.__apiClient:
                     self.__apiClient.setApiKey(self.__apiKey)
                 else:
-                    self.__apiClient = SafeBrowsingAPIClient(self.__apiKey,
-                                                             parent=self)
-        
-        SafeBrowsingManager.enabled = (
-            Preferences.getWebBrowser("SafeBrowsingEnabled") and
-            bool(self.__apiKey))
-        
+                    self.__apiClient = SafeBrowsingAPIClient(self.__apiKey, parent=self)
+
+        SafeBrowsingManager.enabled = Preferences.getWebBrowser(
+            "SafeBrowsingEnabled"
+        ) and bool(self.__apiKey)
+
         self.__setPlatforms()
         self.__setLookupMethod()
         self.__setAutoUpdateThreatLists()
-    
+
     def __setPlatforms(self):
         """
         Private method to set the platforms to be checked against.
@@ -113,43 +119,42 @@
                 # treat all other platforms like linux
                 platform = "linux"
             self.__platforms = SafeBrowsingAPIClient.getPlatformTypes(platform)
-    
+
     def __setLookupMethod(self):
         """
         Private method to set the lookup method (Update API or Lookup API).
         """
-        self.__useLookupApi = Preferences.getWebBrowser(
-            "SafeBrowsingUseLookupApi")
-    
+        self.__useLookupApi = Preferences.getWebBrowser("SafeBrowsingUseLookupApi")
+
     @classmethod
     def isEnabled(cls):
         """
         Class method to check, if safe browsing is enabled.
-        
+
         @return flag indicating the enabled state
         @rtype bool
         """
         return cls.enabled
-    
+
     def close(self):
         """
         Public method to close the safe browsing interface.
         """
         self.__cache.close()
-    
+
     def fairUseDelayExpired(self):
         """
         Public method to check, if the fair use wait period has expired.
-        
+
         @return flag indicating expiration
         @rtype bool
         """
         return self.isEnabled() and self.__apiClient.fairUseDelayExpired()
-    
+
     def __showNotificationMessage(self, message, timeout=5):
         """
         Private method to show some message in a notification widget.
-        
+
         @param message message to be shown
         @type str
         @param timeout amount of time in seconds the message should be shown
@@ -157,13 +162,13 @@
         @type int
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         kind = (
             NotificationTypes.CRITICAL
-            if timeout == 0 else
-            NotificationTypes.INFORMATION
+            if timeout == 0
+            else NotificationTypes.INFORMATION
         )
-        
+
         WebBrowserWindow.showNotification(
             UI.PixmapCache.getPixmap("safeBrowsing48"),
             self.tr("Google Safe Browsing"),
@@ -171,24 +176,23 @@
             kind=kind,
             timeout=timeout,
         )
-    
+
     def __setAutoUpdateThreatLists(self):
         """
         Private method to set auto update for the threat lists.
         """
-        autoUpdateEnabled = (
-            Preferences.getWebBrowser("SafeBrowsingAutoUpdate") and
-            not Preferences.getWebBrowser("SafeBrowsingUseLookupApi")
-        )
+        autoUpdateEnabled = Preferences.getWebBrowser(
+            "SafeBrowsingAutoUpdate"
+        ) and not Preferences.getWebBrowser("SafeBrowsingUseLookupApi")
         if autoUpdateEnabled and self.isEnabled():
-            nextUpdateDateTime = Preferences.getWebBrowser(
-                "SafeBrowsingUpdateDateTime")
+            nextUpdateDateTime = Preferences.getWebBrowser("SafeBrowsingUpdateDateTime")
             if nextUpdateDateTime.isValid():
                 interval = (
-                    QDateTime.currentDateTime().secsTo(nextUpdateDateTime) + 2
+                    QDateTime.currentDateTime().secsTo(nextUpdateDateTime)
+                    + 2
                     # 2 seconds extra wait time; interval in milliseconds
                 )
-                
+
                 if interval < 5:
                     interval = 5
                     # minimum 5 seconds interval
@@ -199,7 +203,7 @@
         else:
             if self.__threatListsUpdateTimer.isActive():
                 self.__threatListsUpdateTimer.stop()
-    
+
     @pyqtSlot()
     def __threatListsUpdateTimerTimeout(self):
         """
@@ -207,58 +211,56 @@
         """
         ok = False
         if self.isEnabled():
-            self.__showNotificationMessage(
-                self.tr("Updating threat lists..."), 0)
+            self.__showNotificationMessage(self.tr("Updating threat lists..."), 0)
             ok = self.updateHashPrefixCache()[0]
             if ok:
-                self.__showNotificationMessage(
-                    self.tr("Updating threat lists done."))
+                self.__showNotificationMessage(self.tr("Updating threat lists done."))
             else:
                 self.__showNotificationMessage(
-                    self.tr("Updating threat lists failed."),
-                    timeout=0)
-        
+                    self.tr("Updating threat lists failed."), timeout=0
+                )
+
         if ok:
-            nextUpdateDateTime = (
-                self.__apiClient.getFairUseDelayExpirationDateTime()
+            nextUpdateDateTime = self.__apiClient.getFairUseDelayExpirationDateTime()
+            Preferences.setWebBrowser("SafeBrowsingUpdateDateTime", nextUpdateDateTime)
+            self.__threatListsUpdateTimer.start(
+                (QDateTime.currentDateTime().secsTo(nextUpdateDateTime) + 2) * 1000
             )
-            Preferences.setWebBrowser("SafeBrowsingUpdateDateTime",
-                                      nextUpdateDateTime)
-            self.__threatListsUpdateTimer.start(
-                (QDateTime.currentDateTime().secsTo(nextUpdateDateTime) + 2) *
-                1000)
             # 2 seconds extra wait time; interval in milliseconds
         else:
-            Preferences.setWebBrowser("SafeBrowsingUpdateDateTime",
-                                      QDateTime())
-    
+            Preferences.setWebBrowser("SafeBrowsingUpdateDateTime", QDateTime())
+
     def updateHashPrefixCache(self):
         """
         Public method to load or update the locally cached threat lists.
-        
+
         @return flag indicating success and an error message
         @rtype tuple of (bool, str)
         """
         if not self.isEnabled():
             return False, self.tr("Safe Browsing is disabled.")
-        
+
         if not self.__apiClient.fairUseDelayExpired():
             return (
                 False,
-                self.tr("The fair use wait period has not expired yet."
-                        "Expiration will be at {0}.").format(
-                    self.__apiClient.getFairUseDelayExpirationDateTime()
-                    .toString("yyyy-MM-dd, HH:mm:ss"))
+                self.tr(
+                    "The fair use wait period has not expired yet."
+                    "Expiration will be at {0}."
+                ).format(
+                    self.__apiClient.getFairUseDelayExpirationDateTime().toString(
+                        "yyyy-MM-dd, HH:mm:ss"
+                    )
+                ),
             )
-        
+
         self.__updatingThreatLists = True
         ok = True
         errorMessage = ""
-        
+
         # step 1: remove expired hashes
         self.__cache.cleanupFullHashes()
         QCoreApplication.processEvents()
-        
+
         # step 2: update threat lists
         threatListsForRemove = {}
         for threatList, _clientState in self.__cache.getThreatLists():
@@ -266,44 +268,37 @@
         threatLists, error = self.__apiClient.getThreatLists()
         if error:
             return False, error
-        
+
         maximum = len(threatLists)
         self.progressMessage.emit(self.tr("Updating threat lists"), maximum)
         for current, entry in enumerate(threatLists, start=1):
             self.progress.emit(current)
             QCoreApplication.processEvents()
             threatList = ThreatList.fromApiEntry(entry)
-            if (
-                self.__platforms is None or
-                threatList.platformType in self.__platforms
-            ):
+            if self.__platforms is None or threatList.platformType in self.__platforms:
                 self.__cache.addThreatList(threatList)
                 key = repr(threatList)
                 if key in threatListsForRemove:
                     del threatListsForRemove[key]
-        
+
         maximum = len(threatListsForRemove.values())
-        self.progressMessage.emit(self.tr("Deleting obsolete threat lists"),
-                                  maximum)
-        for current, threatList in enumerate(
-            threatListsForRemove.values(), start=1
-        ):
+        self.progressMessage.emit(self.tr("Deleting obsolete threat lists"), maximum)
+        for current, threatList in enumerate(threatListsForRemove.values(), start=1):
             self.progress.emit(current)
             QCoreApplication.processEvents()
             self.__cache.deleteHashPrefixList(threatList)
             self.__cache.deleteThreatList(threatList)
         del threatListsForRemove
-        
+
         # step 3: update threats
         threatLists = self.__cache.getThreatLists()
         clientStates = {}
         for threatList, clientState in threatLists:
             clientStates[threatList.asTuple()] = clientState
-        threatsUpdateResponses, error = self.__apiClient.getThreatsUpdate(
-            clientStates)
+        threatsUpdateResponses, error = self.__apiClient.getThreatsUpdate(clientStates)
         if error:
             return False, error
-        
+
         maximum = len(threatsUpdateResponses)
         self.progressMessage.emit(self.tr("Updating hash prefixes"), maximum)
         for current, response in enumerate(threatsUpdateResponses, start=1):
@@ -314,45 +309,47 @@
                 self.__cache.deleteHashPrefixList(responseThreatList)
             for removal in response.get("removals", []):
                 self.__cache.removeHashPrefixIndices(
-                    responseThreatList, removal["rawIndices"]["indices"])
+                    responseThreatList, removal["rawIndices"]["indices"]
+                )
                 QCoreApplication.processEvents()
             for addition in response.get("additions", []):
                 hashPrefixList = HashPrefixList(
                     addition["rawHashes"]["prefixSize"],
-                    base64.b64decode(addition["rawHashes"]["rawHashes"]))
-                self.__cache.populateHashPrefixList(responseThreatList,
-                                                    hashPrefixList)
+                    base64.b64decode(addition["rawHashes"]["rawHashes"]),
+                )
+                self.__cache.populateHashPrefixList(responseThreatList, hashPrefixList)
                 QCoreApplication.processEvents()
             expectedChecksum = base64.b64decode(response["checksum"]["sha256"])
-            if self.__verifyThreatListChecksum(responseThreatList,
-                                               expectedChecksum):
+            if self.__verifyThreatListChecksum(responseThreatList, expectedChecksum):
                 self.__cache.updateThreatListClientState(
-                    responseThreatList, response["newClientState"])
+                    responseThreatList, response["newClientState"]
+                )
             else:
                 ok = False
                 errorMessage = self.tr(
                     "Local cache checksum does not match the server. Consider"
-                    " cleaning the cache. Threat update has been aborted.")
-        
+                    " cleaning the cache. Threat update has been aborted."
+                )
+
         self.__updatingThreatLists = False
-        
+
         return ok, errorMessage
-    
+
     def isUpdatingThreatLists(self):
         """
         Public method to check, if we are in the process of updating the
         threat lists.
-        
+
         @return flag indicating an update process is active
         @rtype bool
         """
         return self.__updatingThreatLists
-    
+
     def __verifyThreatListChecksum(self, threatList, remoteChecksum):
         """
         Private method to verify the local checksum of a threat list with the
         checksum of the safe browsing server.
-        
+
         @param threatList threat list to calculate checksum for
         @type ThreatList
         @param remoteChecksum SHA256 checksum as reported by the Google server
@@ -362,13 +359,13 @@
         """
         localChecksum = self.__cache.hashPrefixListChecksum(threatList)
         return remoteChecksum == localChecksum
-    
+
     def fullCacheCleanup(self):
         """
         Public method to clean up the cache completely.
         """
         self.__cache.prepareCacheDb()
-    
+
     def showSafeBrowsingDialog(self):
         """
         Public slot to show the safe browsing management dialog.
@@ -376,15 +373,17 @@
         if self.__gsbDialog is None:
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
             from .SafeBrowsingDialog import SafeBrowsingDialog
+
             self.__gsbDialog = SafeBrowsingDialog(
-                self, parent=WebBrowserWindow.mainWindow())
-        
+                self, parent=WebBrowserWindow.mainWindow()
+            )
+
         self.__gsbDialog.show()
-    
+
     def lookupUrl(self, url):
         """
         Public method to lookup an URL.
-        
+
         @param url URL to be checked
         @type str or QUrl
         @return tuple containing the list of threat lists the URL was found in
@@ -396,33 +395,32 @@
             if self.__useLookupApi:
                 if isinstance(url, str):
                     url = QUrl(url.strip())
-                
+
                 if url.isEmpty():
                     raise ValueError("Empty URL given.")
-                
-                listNames, error = self.__apiClient.lookupUrl(
-                    url, self.__platforms)
+
+                listNames, error = self.__apiClient.lookupUrl(url, self.__platforms)
                 return listNames, error
             else:
                 if isinstance(url, QUrl):
                     urlStr = url.toString().strip()
                 else:
                     urlStr = url.strip()
-                
+
                 if not urlStr:
                     raise ValueError("Empty URL given.")
-                
+
                 urlHashes = SafeBrowsingUrl(urlStr).hashes()
                 listNames = self.__lookupHashes(urlHashes)
-                
+
                 return listNames, ""
-        
+
         return None, ""
-    
+
     def __lookupHashes(self, fullHashes):
         """
         Private method to lookup the given hashes.
-        
+
         @param fullHashes list of hashes to lookup
         @type list of bytes
         @return names of threat lists hashes were found in
@@ -431,65 +429,66 @@
         fullHashes = list(fullHashes)
         cues = [fh[:4].hex() for fh in fullHashes]
         result = []
-        
+
         matchingPrefixes = {}
         matchingFullHashes = set()
         isPotentialThreat = False
         # Lookup hash prefixes which match full URL hash
-        for _threatList, hashPrefix, negativeCacheExpired in (
-            self.__cache.lookupHashPrefix(cues)
-        ):
+        for (
+            _threatList,
+            hashPrefix,
+            negativeCacheExpired,
+        ) in self.__cache.lookupHashPrefix(cues):
             for fullHash in fullHashes:
                 if fullHash.startswith(hashPrefix):
                     isPotentialThreat = True
                     # consider hash prefix negative cache as expired if it
                     # is expired in at least one threat list
-                    matchingPrefixes[hashPrefix] = matchingPrefixes.get(
-                        hashPrefix, False) or negativeCacheExpired
+                    matchingPrefixes[hashPrefix] = (
+                        matchingPrefixes.get(hashPrefix, False) or negativeCacheExpired
+                    )
                     matchingFullHashes.add(fullHash)
-            
+
         # if none matches, url hash is clear
         if not isPotentialThreat:
             return []
-        
+
         # if there is non-expired full hash, URL is blacklisted
         matchingExpiredThreatLists = set()
-        for threatList, hasExpired in self.__cache.lookupFullHashes(
-                matchingFullHashes):
+        for threatList, hasExpired in self.__cache.lookupFullHashes(matchingFullHashes):
             if hasExpired:
                 matchingExpiredThreatLists.add(threatList)
             else:
                 result.append(threatList)
         if result:
             return result
-        
+
         # If there are no matching expired full hash entries and negative
         # cache is still current for all prefixes, consider it safe.
         if (
-            len(matchingExpiredThreatLists) == 0 and
-            sum(map(int, matchingPrefixes.values())) == 0
+            len(matchingExpiredThreatLists) == 0
+            and sum(map(int, matchingPrefixes.values())) == 0
         ):
             return []
-        
+
         # Now it can be assumed that there are expired matching full hash
         # entries and/or cache prefix entries with expired negative cache.
         # Both require full hash synchronization.
         self.__syncFullHashes(matchingPrefixes.keys())
-        
+
         # Now repeat full hash lookup
-        for threatList, hasExpired in self.__cache.lookupFullHashes(
-                matchingFullHashes):
+        for threatList, hasExpired in self.__cache.lookupFullHashes(matchingFullHashes):
             if not hasExpired:
                 result.append(threatList)
-        
+
         return result
-    
+
     def __syncFullHashes(self, hashPrefixes):
         """
         Private method to download full hashes matching given prefixes.
-        
+
         This also updates the cache expiration timestamps.
-        
+
         @param hashPrefixes list of hash prefixes to get full hashes for
         @type list of bytes
         """
@@ -497,10 +496,9 @@
         clientStates = {}
         for threatList, clientState in threatLists:
             clientStates[threatList.asTuple()] = clientState
-        
-        fullHashResponses = self.__apiClient.getFullHashes(
-            hashPrefixes, clientStates)
-        
+
+        fullHashResponses = self.__apiClient.getFullHashes(hashPrefixes, clientStates)
+
         # update negative cache for each hash prefix
         # store full hash with positive cache bumped up
         for match in fullHashResponses["matches"]:
@@ -515,21 +513,24 @@
                     malwareThreatType = value
                     if not isinstance(malwareThreatType, str):
                         malwareThreatType = malwareThreatType.decode()
-            self.__cache.storeFullHash(threatList, hashValue, cacheDuration,
-                                       malwareThreatType)
-        
+            self.__cache.storeFullHash(
+                threatList, hashValue, cacheDuration, malwareThreatType
+            )
+
         negativeCacheDuration = int(
-            fullHashResponses["negativeCacheDuration"].rstrip("s"))
+            fullHashResponses["negativeCacheDuration"].rstrip("s")
+        )
         for prefixValue in hashPrefixes:
             for threatList, _clientState in threatLists:
                 self.__cache.updateHashPrefixExpiration(
-                    threatList, prefixValue, negativeCacheDuration)
-    
+                    threatList, prefixValue, negativeCacheDuration
+                )
+
     @classmethod
     def getIgnoreSchemes(cls):
         """
         Class method to get the schemes not to be checked.
-        
+
         @return list of schemes to be ignored
         @rtype list of str
         """
@@ -542,28 +543,24 @@
             "abp",
             "file",
         ]
-    
+
     def getThreatMessage(self, threatType):
         """
         Public method to get a warning message for the given threat type.
-        
+
         @param threatType threat type to get the message for
         @type str
         @return threat message
         @rtype str
         """
-        msg = (
-            self.__apiClient.getThreatMessage(threatType)
-            if self.__apiClient else
-            ""
-        )
-        
+        msg = self.__apiClient.getThreatMessage(threatType) if self.__apiClient else ""
+
         return msg
-    
+
     def getThreatMessages(self, threatLists):
         """
         Public method to get threat messages for the given threats.
-        
+
         @param threatLists list of threat lists to get a message for
         @type list of ThreatList
         @return list of threat messages, one per unique threat type
@@ -572,19 +569,19 @@
         threatTypes = set()
         for threatList in threatLists:
             threatTypes.add(threatList.threatType)
-        
+
         messages = []
         if self.__apiClient:
             for threatType in sorted(threatTypes):
                 msg = self.__apiClient.getThreatMessage(threatType)
                 messages.append(msg)
-        
+
         return messages
-    
+
     def getThreatType(self, threatList):
         """
         Public method to get a display string for a given threat type.
-        
+
         @param threatList threat list to get display string for
         @type str
         @return display string
@@ -592,14 +589,13 @@
         """
         displayString = ""
         if self.__apiClient:
-            displayString = self.__apiClient.getThreatType(
-                threatList.threatType)
+            displayString = self.__apiClient.getThreatType(threatList.threatType)
         return displayString
-    
+
     def getPlatformString(self, platformType):
         """
         Public method to get the platform string for a given platform type.
-        
+
         @param platformType platform type as defined in the v4 API
         @type str
         @return platform string
@@ -609,11 +605,11 @@
             return self.__apiClient.getPlatformString(platformType)
         else:
             return ""
-    
+
     def getThreatEntryString(self, threatEntry):
         """
         Public method to get the threat entry string.
-        
+
         @param threatEntry threat entry type as defined in the v4 API
         @type str
         @return threat entry string
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingThreatList.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingThreatList.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,11 @@
     """
     Class implementing the threat list info.
     """
+
     def __init__(self, threatType, platformType, threatEntryType):
         """
         Constructor
-        
+
         @param threatType threat type
         @type str
         @param platformType platform type
@@ -32,19 +33,18 @@
         """
         Class method to instantiate a threat list given a threat list entry
         dictionary.
-        
+
         @param entry threat list entry dictionary
         @type dict
         @return instantiated object
         @rtype ThreatList
         """
-        return cls(entry['threatType'], entry['platformType'],
-                   entry['threatEntryType'])
+        return cls(entry["threatType"], entry["platformType"], entry["threatEntryType"])
 
     def asTuple(self):
         """
         Public method to convert the object to a tuple.
-        
+
         @return tuple containing the threat list info
         @rtype tuple of (str, str, str)
         """
@@ -53,21 +53,22 @@
     def __repr__(self):
         """
         Special method to generate a printable representation.
-        
+
         @return printable representation
         @rtype str
         """
-        return '/'.join(self.asTuple())
+        return "/".join(self.asTuple())
 
 
 class HashPrefixList:
     """
     Class implementing a container for threat list data.
     """
+
     def __init__(self, prefixLength, rawHashes):
         """
         Constructor
-        
+
         @param prefixLength length of each hash prefix
         @type int
         @param rawHashes raw hash prefixes of given length concatenated and
@@ -76,24 +77,25 @@
         """
         self.__prefixLength = prefixLength
         self.__rawHashes = rawHashes
-    
+
     def __len__(self):
         """
         Special method to calculate the number of entries.
-        
+
         @return length
         @rtype int
         """
         return len(self.__rawHashes) // self.__prefixLength
-    
+
     def __iter__(self):
         """
         Special method to iterate over the raw hashes.
-        
+
         @return iterator object
         @rtype iterator
         """
         n = self.__prefixLength
-        return (self.__rawHashes[index:index + n]
-                for index in range(0, len(self.__rawHashes), n)
-                )
+        return (
+            self.__rawHashes[index : index + n]
+            for index in range(0, len(self.__rawHashes), n)
+        )
--- a/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingUrl.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/SafeBrowsingUrl.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,6 +22,7 @@
     """
     Class implementing an URL representation suitable for Google Safe Browsing.
     """
+
     #
     # Modeled after the URL class of the gglsbl package.
     # https://github.com/afilipovich/gglsbl
@@ -29,35 +30,36 @@
     def __init__(self, url):
         """
         Constructor
-        
+
         @param url URL to be embedded
         @type str
         """
         self.__url = url
-    
+
     def hashes(self):
         """
         Public method to get the hashes of all possible permutations of the URL
         in canonical form.
-        
+
         @yield URL hashes
         @ytype bytes
         """
         for variant in self.permutations(self.canonical()):
             urlHash = self.digest(variant)
             yield urlHash
-    
+
     def canonical(self):
         """
         Public method to convert the URL to the canonical form.
-        
+
         @return canonical form of the URL
         @rtype str
         """
+
         def fullUnescape(u):
             """
             Method to recursively unescape an URL.
-            
+
             @param u URL string to unescape
             @type str
             @return unescaped URL string
@@ -68,25 +70,25 @@
                 return uu
             else:
                 return fullUnescape(uu)
-        
+
         def quote(s):
             """
             Method to quote a string.
-            
+
             @param string to be quoted
             @type str
             @return quoted string
             @rtype str
             """
-            safeChars = '!"$&\'()*+,-./:;<=>?@[\\]^_`{|}~'
+            safeChars = "!\"$&'()*+,-./:;<=>?@[\\]^_`{|}~"
             return urllib.parse.quote(s, safe=safeChars)
-        
+
         url = self.__url.strip()
-        url = url.replace('\n', '').replace('\r', '').replace('\t', '')
-        url = url.split('#', 1)[0]
-        if url.startswith('//'):
+        url = url.replace("\n", "").replace("\r", "").replace("\t", "")
+        url = url.split("#", 1)[0]
+        if url.startswith("//"):
             url = Preferences.getWebBrowser("DefaultScheme")[:-3] + url
-        if len(url.split('://')) <= 1:
+        if len(url.split("://")) <= 1:
             url = Preferences.getWebBrowser("DefaultScheme") + url
         url = quote(fullUnescape(url))
         urlParts = urllib.parse.urlsplit(url)
@@ -97,65 +99,66 @@
         host = fullUnescape(urlParts.hostname)
         path = fullUnescape(urlParts.path)
         query = urlParts.query
-        if not query and '?' not in url:
+        if not query and "?" not in url:
             query = None
         if not path:
-            path = '/'
-        path = posixpath.normpath(path).replace('//', '/')
-        if path[-1] != '/':
-            path += '/'
+            path = "/"
+        path = posixpath.normpath(path).replace("//", "/")
+        if path[-1] != "/":
+            path += "/"
         port = urlParts.port
-        host = host.strip('.')
-        host = re.sub(r'\.+', '.', host).lower()
+        host = host.strip(".")
+        host = re.sub(r"\.+", ".", host).lower()
         if host.isdigit():
             with contextlib.suppress(Exception):
                 host = socket.inet_ntoa(struct.pack("!I", int(host)))
-        if host.startswith('0x') and '.' not in host:
+        if host.startswith("0x") and "." not in host:
             with contextlib.suppress(Exception):
                 host = socket.inet_ntoa(struct.pack("!I", int(host, 16)))
         quotedPath = quote(path)
         quotedHost = quote(host)
         if port is not None:
-            quotedHost = '{0}:{1}'.format(quotedHost, port)
-        canonicalUrl = '{0}://{1}{2}'.format(protocol, quotedHost, quotedPath)
+            quotedHost = "{0}:{1}".format(quotedHost, port)
+        canonicalUrl = "{0}://{1}{2}".format(protocol, quotedHost, quotedPath)
         if query is not None:
-            canonicalUrl = '{0}?{1}'.format(canonicalUrl, query)
+            canonicalUrl = "{0}?{1}".format(canonicalUrl, query)
         return canonicalUrl
-    
+
     @staticmethod
     def permutations(url):
         """
         Static method to determine all permutations of host name and path
         which can be applied to blacklisted URLs.
-        
+
         @param url URL string to be permuted
         @type str
         @yield permutated URL strings
         @ytype str
         """
+
         def hostPermutations(host):
             """
             Method to generate the permutations of the host name.
-            
+
             @param host host name
             @type str
             @yield permutated host names
             @ytype str
             """
-            if re.match(r'\d+\.\d+\.\d+\.\d+', host):
+            if re.match(r"\d+\.\d+\.\d+\.\d+", host):
                 yield host
                 return
-            parts = host.split('.')
+            parts = host.split(".")
             partsLen = min(len(parts), 5)
             if partsLen > 4:
                 yield host
             for i in range(partsLen - 1):
-                yield '.'.join(parts[i - partsLen:])
-        
+                yield ".".join(parts[i - partsLen :])
+
         def pathPermutations(path):
             """
             Method to generate the permutations of the path.
-            
+
             @param path path to be processed
             @type str
             @yield permutated paths
@@ -163,25 +166,25 @@
             """
             yield path
             query = None
-            if '?' in path:
-                path, query = path.split('?', 1)
+            if "?" in path:
+                path, query = path.split("?", 1)
             if query is not None:
                 yield path
-            pathParts = path.split('/')[0:-1]
-            curPath = ''
+            pathParts = path.split("/")[0:-1]
+            curPath = ""
             for i in range(min(4, len(pathParts))):
-                curPath = curPath + pathParts[i] + '/'
+                curPath = curPath + pathParts[i] + "/"
                 yield curPath
-        
+
         protocol, addressStr = urllib.parse.splittype(url)
         host, path = urllib.parse.splithost(addressStr)
         user, host = urllib.parse.splituser(host)
         host, port = urllib.parse.splitport(host)
-        host = host.strip('/')
+        host = host.strip("/")
         seenPermutations = set()
         for h in hostPermutations(host):
             for p in pathPermutations(path):
-                u = '{0}{1}'.format(h, p)
+                u = "{0}{1}".format(h, p)
                 if u not in seenPermutations:
                     yield u
                     seenPermutations.add(u)
@@ -190,10 +193,10 @@
     def digest(url):
         """
         Static method to calculate the SHA256 digest of an URL string.
-        
+
         @param url URL string
         @type str
         @return SHA256 digest of the URL string
         @rtype bytes
         """
-        return hashlib.sha256(url.encode('utf-8')).digest()
+        return hashlib.sha256(url.encode("utf-8")).digest()
--- a/src/eric7/WebBrowser/SafeBrowsing/__init__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SafeBrowsing/__init__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,7 @@
     """
     Module function to get some help about how to enable the Google Mail
     OAuth2 service.
-    
+
     @return help text
     @rtype str
     """
--- a/src/eric7/WebBrowser/SearchWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SearchWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,93 +20,91 @@
     """
     Class implementing the search bar for the web browser.
     """
+
     def __init__(self, mainWindow, parent=None):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window (QMainWindow)
         @param parent parent widget of this dialog (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__mainWindow = mainWindow
-        
+
         self.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
         self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow"))
         self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow"))
-        
+
         self.__defaultBaseColor = (
-            self.findtextCombo.lineEdit().palette().color(
-                QPalette.ColorRole.Base)
+            self.findtextCombo.lineEdit().palette().color(QPalette.ColorRole.Base)
         )
         self.__defaultTextColor = (
-            self.findtextCombo.lineEdit().palette().color(
-                QPalette.ColorRole.Text)
+            self.findtextCombo.lineEdit().palette().color(QPalette.ColorRole.Text)
         )
-        
+
         self.__findHistory = []
         self.__havefound = False
         self.__findBackwards = False
-        
+
         self.findtextCombo.setCompleter(None)
-        self.findtextCombo.lineEdit().returnPressed.connect(
-            self.__findByReturnPressed)
-        self.findtextCombo.lineEdit().textEdited.connect(
-            self.__searchTextEdited)
+        self.findtextCombo.lineEdit().returnPressed.connect(self.__findByReturnPressed)
+        self.findtextCombo.lineEdit().textEdited.connect(self.__searchTextEdited)
 
     def on_findtextCombo_editTextChanged(self, txt):
         """
         Private slot to enable/disable the find buttons.
-        
+
         @param txt text of the combobox (string)
         """
         self.findPrevButton.setEnabled(txt != "")
         self.findNextButton.setEnabled(txt != "")
-    
+
     def __searchTextEdited(self, txt):
         """
         Private slot to perform an incremental search.
-        
+
         @param txt current text of the search combos line edit (string)
             (unused)
         """
         self.__findNextPrev()
-    
+
     def __findNextPrev(self):
         """
         Private slot to find the next occurrence of text.
         """
         self.infoLabel.clear()
         self.__setFindtextComboBackground(False)
-        
+
         if not self.findtextCombo.currentText():
             return
-        
+
         self.__mainWindow.currentBrowser().findNextPrev(
             self.findtextCombo.currentText(),
             self.caseCheckBox.isChecked(),
             self.__findBackwards,
-            self.__findNextPrevCallback)
-    
+            self.__findNextPrevCallback,
+        )
+
     def __findNextPrevCallback(self, result):
         """
         Private method to process the result of the last search.
-        
+
         @param result reference to the search result
         @type QWebEngineFindTextResult
         """
         if result.numberOfMatches() == 0:
             self.infoLabel.setText(self.tr("Expression was not found."))
             self.__setFindtextComboBackground(True)
-    
+
     @pyqtSlot()
     def on_findNextButton_clicked(self):
         """
         Private slot to find the next occurrence.
         """
         txt = self.findtextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.__findHistory:
@@ -114,10 +112,10 @@
         self.__findHistory.insert(0, txt)
         self.findtextCombo.clear()
         self.findtextCombo.addItems(self.__findHistory)
-        
+
         self.__findBackwards = False
         self.__findNextPrev()
-    
+
     def findNext(self):
         """
         Public slot to find the next occurrence.
@@ -125,7 +123,7 @@
         if not self.__havefound or not self.findtextCombo.currentText():
             self.showFind()
             return
-        
+
         self.on_findNextButton_clicked()
 
     @pyqtSlot()
@@ -134,7 +132,7 @@
         Private slot to find the previous occurrence.
         """
         txt = self.findtextCombo.currentText()
-        
+
         # This moves any previous occurrence of this statement to the head
         # of the list and updates the combobox
         if txt in self.__findHistory:
@@ -142,10 +140,10 @@
         self.__findHistory.insert(0, txt)
         self.findtextCombo.clear()
         self.findtextCombo.addItems(self.__findHistory)
-        
+
         self.__findBackwards = True
         self.__findNextPrev()
-    
+
     def findPrevious(self):
         """
         Public slot to find the previous occurrence.
@@ -153,9 +151,9 @@
         if not self.__havefound or not self.findtextCombo.currentText():
             self.showFind()
             return
-        
+
         self.on_findPrevButton_clicked()
-    
+
     def __findByReturnPressed(self):
         """
         Private slot to handle the returnPressed signal of the findtext
@@ -172,27 +170,28 @@
         """
         self.__havefound = True
         self.__findBackwards = False
-        
+
         self.findtextCombo.clear()
         self.findtextCombo.addItems(self.__findHistory)
-        self.findtextCombo.setEditText('')
+        self.findtextCombo.setEditText("")
         self.findtextCombo.setFocus()
-        
+
         self.caseCheckBox.setChecked(False)
-        
+
         if self.__mainWindow.currentBrowser().hasSelection():
             self.findtextCombo.setEditText(
-                self.__mainWindow.currentBrowser().selectedText())
-        
+                self.__mainWindow.currentBrowser().selectedText()
+            )
+
         self.__setFindtextComboBackground(False)
         self.show()
-    
+
     def __resetSearch(self):
         """
         Private method to reset the last search.
         """
         self.__mainWindow.currentBrowser().findText("")
-    
+
     @pyqtSlot()
     def on_closeButton_clicked(self):
         """
@@ -200,11 +199,11 @@
         """
         self.__resetSearch()
         self.close()
-    
+
     def keyPressEvent(self, event):
         """
         Protected slot to handle key press events.
-        
+
         @param event reference to the key press event (QKeyEvent)
         """
         if event.key() == Qt.Key.Key_Escape:
@@ -214,18 +213,18 @@
             event.accept()
             self.__resetSearch()
             self.close()
-    
+
     def __setFindtextComboBackground(self, error):
         """
         Private slot to change the findtext combo background to indicate
         errors.
-        
+
         @param error flag indicating an error condition (boolean)
         """
         styleSheet = (
             "color: #000000; background-color: #ff6666"
-            if error else
-            f"color: {self.__defaultTextColor};"
+            if error
+            else f"color: {self.__defaultTextColor};"
             f" background-color: {self.__defaultBaseColor}"
         )
         self.findtextCombo.setStyleSheet(styleSheet)
--- a/src/eric7/WebBrowser/Session/SessionManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Session/SessionManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,13 +15,26 @@
 import shutil
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, Qt, QObject, QTimer, QDir, QFileSystemWatcher,
-    QByteArray, QDateTime
+    pyqtSlot,
+    pyqtSignal,
+    Qt,
+    QObject,
+    QTimer,
+    QDir,
+    QFileSystemWatcher,
+    QByteArray,
+    QDateTime,
 )
 from PyQt6.QtGui import QActionGroup
 from PyQt6.QtWidgets import (
-    QApplication, QInputDialog, QLineEdit, QDialog, QDialogButtonBox, QLabel,
-    QComboBox, QVBoxLayout
+    QApplication,
+    QInputDialog,
+    QLineEdit,
+    QDialog,
+    QDialogButtonBox,
+    QLabel,
+    QComboBox,
+    QVBoxLayout,
 )
 
 from EricWidgets import EricMessageBox
@@ -35,6 +48,7 @@
     """
     Class implementing a data structure to store meta data for a session.
     """
+
     def __init__(self):
         """
         Constructor
@@ -49,55 +63,55 @@
 class SessionManager(QObject):
     """
     Class implementing the session manager.
-    
+
     @signal sessionsMetaDataChanged() emitted to indicate a change of the
         list of session meta data
     """
+
     sessionsMetaDataChanged = pyqtSignal()
-    
+
     SwitchSession = 1
     CloneSession = 2
     ReplaceSession = SwitchSession | 4
     RestoreSession = 8
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
+
         sessionsDirName = self.getSessionsDirectory()
         sessionsDir = QDir(sessionsDirName)
         if not sessionsDir.exists():
             sessionsDir.mkpath(sessionsDirName)
-        
+
         self.__sessionMetaData = []
         # list containing meta data about saved sessions
-        
+
         self.__sessionDefault = os.path.join(sessionsDirName, "session.json")
-        self.__sessionBackup1 = os.path.join(sessionsDirName,
-                                             "session.json.old")
-        self.__sessionBackup2 = os.path.join(sessionsDirName,
-                                             "session.json.old1")
-        
-        self.__lastActiveSession = Preferences.getWebBrowser(
-            "SessionLastActivePath")
+        self.__sessionBackup1 = os.path.join(sessionsDirName, "session.json.old")
+        self.__sessionBackup2 = os.path.join(sessionsDirName, "session.json.old1")
+
+        self.__lastActiveSession = Preferences.getWebBrowser("SessionLastActivePath")
         if not os.path.exists(self.__lastActiveSession):
             self.__lastActiveSession = self.__sessionDefault
-        
+
         self.__sessionsDirectoryWatcher = QFileSystemWatcher(
-            [self.getSessionsDirectory()], self)
+            [self.getSessionsDirectory()], self
+        )
         self.__sessionsDirectoryWatcher.directoryChanged.connect(
-            self.__sessionDirectoryChanged)
-        
+            self.__sessionDirectoryChanged
+        )
+
         self.__backupSavedSession()
-        
+
         self.__autoSaveTimer = None
         self.__shutdown = False
-    
+
     def activateTimer(self):
         """
         Public method to activate the session save timer.
@@ -107,41 +121,40 @@
             self.__autoSaveTimer.setSingleShot(True)
             self.__autoSaveTimer.timeout.connect(self.__autoSaveSession)
             self.__initSessionSaveTimer()
-    
+
     def preferencesChanged(self):
         """
         Public slot to react upon changes of the settings.
         """
         self.__initSessionSaveTimer()
-    
+
     def getSessionsDirectory(self):
         """
         Public method to get the directory sessions are stored in.
-        
+
         @return name of the sessions directory
         @rtype str
         """
-        return os.path.join(Utilities.getConfigDir(),
-                            "web_browser", "sessions")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "sessions")
+
     def defaultSessionFile(self):
         """
         Public method to get the name of the default session file.
-        
+
         @return name of the default session file
         @rtype str
         """
         return self.__sessionDefault
-    
+
     def lastActiveSessionFile(self):
         """
         Public method to get the name of the last active session file.
-        
+
         @return name of the last active session file
         @rtype str
         """
         return self.__lastActiveSession
-    
+
     def shutdown(self):
         """
         Public method to perform any shutdown actions.
@@ -150,79 +163,77 @@
         if not self.__shutdown:
             self.__autoSaveSession(startTimer=False)
         self.__shutdown = True
-    
+
     def autoSaveSession(self):
         """
         Public method to save the current session state.
         """
         self.__autoSaveSession(startTimer=False)
-    
+
     def __initSessionSaveTimer(self):
         """
         Private slot to initialize the auto save timer.
         """
-        self.__autoSaveInterval = Preferences.getWebBrowser(
-            "SessionAutoSaveInterval") * 1000
-        
+        self.__autoSaveInterval = (
+            Preferences.getWebBrowser("SessionAutoSaveInterval") * 1000
+        )
+
         if Preferences.getWebBrowser("SessionAutoSave"):
             if not self.__autoSaveTimer.isActive():
                 self.__autoSaveTimer.start(self.__autoSaveInterval)
         else:
             self.__autoSaveTimer.stop()
-    
+
     @pyqtSlot()
     def __autoSaveSession(self, startTimer=True):
         """
         Private slot to save the current session state.
-        
+
         @param startTimer flag indicating to restart the timer
         @type bool
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         if not WebBrowserWindow.isPrivate():
-            Preferences.setWebBrowser("SessionLastActivePath",
-                                      self.__lastActiveSession)
+            Preferences.setWebBrowser("SessionLastActivePath", self.__lastActiveSession)
             self.writeCurrentSession(self.__lastActiveSession)
-        
+
         if startTimer:
             self.__autoSaveTimer.start(self.__autoSaveInterval)
-    
+
     def writeCurrentSession(self, sessionFileName):
         """
         Public method to write the current session to the given file name.
-        
+
         @param sessionFileName file name of the session
         @type str
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         sessionData = {"Windows": []}
-        
+
         activeWindow = WebBrowserWindow.getWindow()
         for window in WebBrowserWindow.mainWindows():
             data = window.tabWidget().getSessionData()
-            
+
             # add window geometry
             geometry = window.saveGeometry()
             data["WindowGeometry"] = bytes(geometry.toBase64()).decode("ascii")
-            
+
             sessionData["Windows"].append(data)
-            
+
             if window is activeWindow:
-                sessionData["CurrentWindowIndex"] = (
-                    len(sessionData["Windows"]) - 1
-                )
-        
+                sessionData["CurrentWindowIndex"] = len(sessionData["Windows"]) - 1
+
         if sessionData["Windows"]:
             with open(sessionFileName, "w") as sessionFile:
                 json.dump(sessionData, sessionFile, indent=2)
-    
+
     @classmethod
     def readSessionFromFile(cls, sessionFileName):
         """
         Class method to read the session data from a file.
-        
+
         @param sessionFileName file name of the session file
         @type str
         @return dictionary containing the session data
@@ -235,14 +246,14 @@
                 sessionData = {}
         except OSError:
             sessionData = {}
-        
+
         return sessionData
-    
+
     @classmethod
     def isValidSession(cls, session):
         """
         Class method to check the validity of a session.
-        
+
         @param session dictionary containing the session data
         @type dict
         @return flag indicating validity
@@ -250,121 +261,121 @@
         """
         if not session:
             return False
-        
+
         if "Windows" not in session:
             return False
-        
+
         if not session["Windows"]:
             return False
-        
+
         return True
-    
+
     def __backupSavedSession(self):
         """
         Private method to backup the most recently saved session.
         """
         if os.path.exists(self.__lastActiveSession):
-            
+
             if os.path.exists(self.__sessionBackup1):
                 os.unlink(self.__sessionBackup2)
                 shutil.copy(self.__sessionBackup1, self.__sessionBackup2)
-            
+
             os.unlink(self.__sessionBackup1)
             shutil.copy(self.__lastActiveSession, self.__sessionBackup1)
-    
+
     def sessionMetaData(self, includeBackups=False):
         """
         Public method to get the sessions meta data.
-        
+
         @param includeBackups flag indicating to include backup sessions
         @type bool
         @return list of session meta data
         @rtype list of SessionMetaData
         """
         self.__fillMetaDataList()
-        
+
         metaDataList = self.__sessionMetaData[:]
-        
+
         if includeBackups and os.path.exists(self.__sessionBackup1):
             data = SessionMetaData()
             data.name = self.tr("Backup 1")
             data.filePath = self.__sessionBackup1
             data.isBackup = True
             metaDataList.append(data)
-        
+
         if includeBackups and os.path.exists(self.__sessionBackup2):
             data = SessionMetaData()
             data.name = self.tr("Backup 2")
             data.filePath = self.__sessionBackup2
             data.isBackup = True
             metaDataList.append(data)
-        
+
         return metaDataList
-    
+
     def __fillMetaDataList(self):
         """
         Private method to fill the sessions meta data list.
-        
+
         The sessions meta data list is only populated, if the variable holding
         it is empty (i.e. it is populated on demand).
         """
         if self.__sessionMetaData:
             return
-        
+
         sessionFiles = pathlib.Path(self.getSessionsDirectory()).glob("*.json")
-        
+
         for sessionFile in sessionFiles:
             sessionData = self.readSessionFromFile(sessionFile.resolve())
             if not sessionData or not sessionData["Windows"]:
                 continue
-            
+
             data = SessionMetaData()
             data.name = sessionFile.stem
             data.filePath = sessionFile.resolve()
-            
+
             if sessionFile == pathlib.Path(self.defaultSessionFile()):
                 data.name = self.tr("Default Session")
                 data.isDefault = True
-            
+
             if self.__isActive(sessionFile):
                 data.isActive = True
-            
+
             if data.isDefault:
                 # default session is always first
                 self.__sessionMetaData.insert(0, data)
             else:
                 self.__sessionMetaData.append(data)
-    
+
     def __isActive(self, filePath):
         """
         Private method to check, if a given file is the active one.
-        
+
         @param filePath path of the session file to be checked
         @type str or pathlib.Path
         @return flag indicating the active file
         @rtype bool
         """
         return pathlib.Path(filePath) == pathlib.Path(self.__lastActiveSession)
-    
+
     @pyqtSlot()
     def __sessionDirectoryChanged(self):
         """
         Private slot handling changes of the sessions directory.
         """
         self.__sessionMetaData = []
-        
+
         self.sessionsMetaDataChanged.emit()
-    
+
     @pyqtSlot()
     def aboutToShowSessionsMenu(self, menu):
         """
         Public slot to populate the sessions selection menu.
-        
+
         @param menu reference to the menu about to be shown
         @type QMenu
         """
         menu.clear()
-        
+
         actionGroup = QActionGroup(menu)
         sessions = self.sessionMetaData(includeBackups=False)
         for session in sessions:
@@ -373,24 +384,23 @@
             act.setChecked(session.isActive)
             act.setData(session.filePath)
             actionGroup.addAction(act)
-            act.triggered.connect(
-                functools.partial(self.__sessionActTriggered, act))
-    
+            act.triggered.connect(functools.partial(self.__sessionActTriggered, act))
+
     @pyqtSlot()
     def __sessionActTriggered(self, act):
         """
         Private slot to handle the menu selection of a session.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         path = act.data()
         self.switchToSession(path)
-    
+
     def openSession(self, sessionFilePath, flags=0):
         """
         Public method to open a session from a given session file.
-        
+
         @param sessionFilePath name of the session file to get session from
         @type str
         @param flags flags determining the open mode
@@ -398,93 +408,84 @@
         """
         if self.__isActive(sessionFilePath):
             return
-        
+
         sessionData = self.readSessionFromFile(sessionFilePath)
         if not sessionData or not sessionData["Windows"]:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         window = WebBrowserWindow.mainWindow()
-        
-        if ((flags & SessionManager.SwitchSession) ==
-                SessionManager.SwitchSession):
+
+        if (flags & SessionManager.SwitchSession) == SessionManager.SwitchSession:
             # save the current session
             self.writeCurrentSession(self.__lastActiveSession)
-            
+
             # create new window for the new session
             window = window.newWindow(restoreSession=True)
-            
+
             # close all existing windows
             for win in WebBrowserWindow.mainWindows()[:]:
                 if win is not window:
                     win.forceClose()
-            
-            if (
-                (flags & SessionManager.ReplaceSession) !=
-                SessionManager.ReplaceSession
-            ):
-                self.__lastActiveSession = (
-                    pathlib.Path(sessionFilePath).resolve()
-                )
+
+            if (flags & SessionManager.ReplaceSession) != SessionManager.ReplaceSession:
+                self.__lastActiveSession = pathlib.Path(sessionFilePath).resolve()
                 self.__sessionMetaData = []
-        
+
         self.restoreSessionFromData(window, sessionData)
-    
+
     @classmethod
     def restoreSessionFromData(cls, window=None, sessionData=None):
         """
         Class method to restore a session from a session data dictionary.
-        
+
         @param window reference to main window to restore to
         @type WebBrowserWindow
         @param sessionData dictionary containing the session data
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if window is None:
             window = WebBrowserWindow.mainWindow()
-        
+
         with EricOverrideCursor():
             # restore session for first window
             data = sessionData["Windows"].pop(0)
             window.tabWidget().loadFromSessionData(data)
             if "WindowGeometry" in data:
-                geometry = QByteArray.fromBase64(
-                    data["WindowGeometry"].encode("ascii"))
+                geometry = QByteArray.fromBase64(data["WindowGeometry"].encode("ascii"))
                 window.restoreGeometry(geometry)
             QApplication.processEvents()
-            
+
             # restore additional windows
             for data in sessionData["Windows"]:
-                window = (
-                    WebBrowserWindow.mainWindow().newWindow(
-                        restoreSession=True)
-                )
+                window = WebBrowserWindow.mainWindow().newWindow(restoreSession=True)
                 window.tabWidget().loadFromSessionData(data)
                 if "WindowGeometry" in data:
                     geometry = QByteArray.fromBase64(
-                        data["WindowGeometry"].encode("ascii"))
+                        data["WindowGeometry"].encode("ascii")
+                    )
                     window.restoreGeometry(geometry)
                 QApplication.processEvents()
-        
+
         if "CurrentWindowIndex" in sessionData:
             currentWindowIndex = sessionData["CurrentWindowIndex"]
             with contextlib.suppress(IndexError):
-                currentWindow = (
-                    WebBrowserWindow.mainWindows()[currentWindowIndex]
-                )
+                currentWindow = WebBrowserWindow.mainWindows()[currentWindowIndex]
                 QTimer.singleShot(0, lambda: currentWindow.raise_())
-    
+
     def renameSession(self, sessionFilePath, flags=0):
         """
         Public method to rename or clone a session.
-        
+
         @param sessionFilePath name of the session file
         @type str
         @param flags flags determining a rename or clone operation
         @type int
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         suggestedName = pathlib.Path(sessionFilePath).stem
         if flags & SessionManager.CloneSession:
             suggestedName += "_cloned"
@@ -497,31 +498,37 @@
             title,
             self.tr("Please enter a new name:"),
             QLineEdit.EchoMode.Normal,
-            suggestedName)
-        
+            suggestedName,
+        )
+
         if not ok:
             return
-        
+
         if not newName.endswith(".json"):
             newName += ".json"
-        
+
         newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
         if os.path.exists(newSessionPath):
             EricMessageBox.information(
                 WebBrowserWindow.getWindow(),
                 title,
-                self.tr("""The session file "{0}" exists already. Please"""
-                        """ enter another name.""").format(newName))
+                self.tr(
+                    """The session file "{0}" exists already. Please"""
+                    """ enter another name."""
+                ).format(newName),
+            )
             self.renameSession(sessionFilePath, flags)
             return
-        
+
         if flags & SessionManager.CloneSession:
             if not shutil.copy(sessionFilePath, newSessionPath):
                 EricMessageBox.critical(
                     WebBrowserWindow.getWindow(),
                     title,
-                    self.tr("""An error occurred while cloning the session"""
-                            """ file."""))
+                    self.tr(
+                        """An error occurred while cloning the session""" """ file."""
+                    ),
+                )
                 return
         else:
             try:
@@ -530,69 +537,78 @@
                 EricMessageBox.critical(
                     WebBrowserWindow.getWindow(),
                     title,
-                    self.tr("""An error occurred while renaming the session"""
-                            """ file."""))
+                    self.tr(
+                        """An error occurred while renaming the session""" """ file."""
+                    ),
+                )
                 return
             if self.__isActive(sessionFilePath):
                 self.__lastActiveSession = newSessionPath
                 self.__sessionMetaData = []
-    
+
     def saveSession(self):
         """
         Public method to save the current session.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         newName, ok = QInputDialog.getText(
             WebBrowserWindow.getWindow(),
             self.tr("Save Session"),
             self.tr("Please enter a name for the session:"),
             QLineEdit.EchoMode.Normal,
             self.tr("Saved Session ({0})").format(
-                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")))
-        
+                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")
+            ),
+        )
+
         if not ok:
             return
-        
+
         if not newName.endswith(".json"):
             newName += ".json"
-        
+
         newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
         if os.path.exists(newSessionPath):
             EricMessageBox.information(
                 WebBrowserWindow.getWindow(),
                 self.tr("Save Session"),
-                self.tr("""The session file "{0}" exists already. Please"""
-                        """ enter another name.""").format(newName))
+                self.tr(
+                    """The session file "{0}" exists already. Please"""
+                    """ enter another name."""
+                ).format(newName),
+            )
             self.saveSession()
             return
-        
+
         self.writeCurrentSession(newSessionPath)
-    
+
     def replaceSession(self, sessionFilePath):
         """
         Public method to replace the current session with the given one.
-        
+
         @param sessionFilePath file name of the session file to replace with
         @type str
         @return flag indicating success
         @rtype bool
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         res = EricMessageBox.yesNo(
             WebBrowserWindow.getWindow(),
             self.tr("Restore Backup"),
-            self.tr("""Are you sure you want to replace the current"""
-                    """ session?"""))
+            self.tr("""Are you sure you want to replace the current""" """ session?"""),
+        )
         if res:
             self.openSession(sessionFilePath, SessionManager.ReplaceSession)
             return True
         else:
             return False
-    
+
     def switchToSession(self, sessionFilePath):
         """
         Public method to switch the current session to the given one.
-        
+
         @param sessionFilePath file name of the session file to switch to
         @type str
         @return flag indicating success
@@ -600,134 +616,142 @@
         """
         self.openSession(sessionFilePath, SessionManager.SwitchSession)
         return True
-    
+
     def cloneSession(self, sessionFilePath):
         """
         Public method to clone a session.
-        
+
         @param sessionFilePath file name of the session file to be cloned
         @type str
         """
         self.renameSession(sessionFilePath, SessionManager.CloneSession)
-    
+
     def deleteSession(self, sessionFilePath):
         """
         Public method to delete a session.
-        
+
         @param sessionFilePath file name of the session file to be deleted
         @type str
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         sfp = pathlib.Path(sessionFilePath)
         res = EricMessageBox.yesNo(
             WebBrowserWindow.getWindow(),
             self.tr("Delete Session"),
-            self.tr("""Are you sure you want to delete session "{0}"?""")
-            .format(sfp.stem))
+            self.tr("""Are you sure you want to delete session "{0}"?""").format(
+                sfp.stem
+            ),
+        )
         if res:
             sfp.unlink()
-    
+
     def newSession(self):
         """
         Public method to start a new session.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         newName, ok = QInputDialog.getText(
             WebBrowserWindow.getWindow(),
             self.tr("New Session"),
             self.tr("Please enter a name for the new session:"),
             QLineEdit.EchoMode.Normal,
             self.tr("New Session ({0})").format(
-                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")))
-        
+                QDateTime.currentDateTime().toString("yyyy-MM-dd HH-mm-ss")
+            ),
+        )
+
         if not ok:
             return
-        
+
         if not newName.endswith(".json"):
             newName += ".json"
-        
+
         newSessionPath = os.path.join(self.getSessionsDirectory(), newName)
         if os.path.exists(newSessionPath):
             EricMessageBox.information(
                 WebBrowserWindow.getWindow(),
                 self.tr("New Session"),
-                self.tr("""The session file "{0}" exists already. Please"""
-                        """ enter another name.""").format(newName))
+                self.tr(
+                    """The session file "{0}" exists already. Please"""
+                    """ enter another name."""
+                ).format(newName),
+            )
             self.newSession()
             return
-        
+
         self.writeCurrentSession(self.__lastActiveSession)
-        
+
         # create new window for the new session and close all existing windows
         window = WebBrowserWindow.mainWindow().newWindow()
         for win in WebBrowserWindow.mainWindows():
             if win is not window:
                 win.forceClose()
-        
+
         self.__lastActiveSession = newSessionPath
         self.__autoSaveSession()
-    
+
     def showSessionManagerDialog(self):
         """
         Public method to show the session manager dialog.
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
         from .SessionManagerDialog import SessionManagerDialog
-        
+
         dlg = SessionManagerDialog(WebBrowserWindow.getWindow())
         dlg.open()
-    
+
     def selectSession(self):
         """
         Public method to select a session to be restored.
-        
+
         @return name of the session file to be restored
         @rtype str
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         self.__fillMetaDataList()
-        
+
         if self.__sessionMetaData:
             # skip, if no session file available
-            dlg = QDialog(WebBrowserWindow.getWindow(),
-                          Qt.WindowType.WindowStaysOnTopHint)
+            dlg = QDialog(
+                WebBrowserWindow.getWindow(), Qt.WindowType.WindowStaysOnTopHint
+            )
             lbl = QLabel(self.tr("Please select the startup session:"))
             combo = QComboBox(dlg)
             buttonBox = QDialogButtonBox(
-                QDialogButtonBox.StandardButton.Ok |
-                QDialogButtonBox.StandardButton.Cancel,
-                dlg)
+                QDialogButtonBox.StandardButton.Ok
+                | QDialogButtonBox.StandardButton.Cancel,
+                dlg,
+            )
             buttonBox.accepted.connect(dlg.accept)
             buttonBox.rejected.connect(dlg.reject)
-            
+
             layout = QVBoxLayout()
             layout.addWidget(lbl)
             layout.addWidget(combo)
             layout.addWidget(buttonBox)
             dlg.setLayout(layout)
-            
+
             lastActiveSessionFilePath = pathlib.Path(self.__lastActiveSession)
-            
+
             for metaData in self.__sessionMetaData:
-                if (
-                    pathlib.Path(metaData.filePath) !=
-                    lastActiveSessionFilePath
-                ):
+                if pathlib.Path(metaData.filePath) != lastActiveSessionFilePath:
                     combo.addItem(metaData.name, metaData.filePath)
                 else:
                     combo.insertItem(
                         0,
                         self.tr("{0} (last session)").format(metaData.name),
-                        metaData.filePath
+                        metaData.filePath,
                     )
             combo.setCurrentIndex(0)
-            
+
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 session = combo.currentData()
                 if session is None:
                     self.__lastActiveSession = self.__sessionDefault
                 else:
                     self.__lastActiveSession = session
-        
+
         return self.__lastActiveSession
--- a/src/eric7/WebBrowser/Session/SessionManagerDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Session/SessionManagerDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,62 +23,66 @@
     """
     Class implementing a dialog to manage sessions.
     """
+
     SessionFileRole = Qt.ItemDataRole.UserRole
     BackupSessionRole = Qt.ItemDataRole.UserRole + 1
     ActiveSessionRole = Qt.ItemDataRole.UserRole + 2
     DefaultSessionRole = Qt.ItemDataRole.UserRole + 3
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
-        
+
         self.newButton.clicked.connect(self.__newSession)
         self.renameButton.clicked.connect(self.__renameSession)
         self.cloneButton.clicked.connect(self.__cloneSession)
         self.deleteButton.clicked.connect(self.__deleteSession)
         self.switchButton.clicked.connect(self.__switchToSession)
         self.sessionsList.currentItemChanged.connect(self.__updateButtons)
-        
+
         self.__refresh()
         WebBrowserWindow.sessionManager().sessionsMetaDataChanged.connect(
-            self.__refresh)
-    
+            self.__refresh
+        )
+
     @pyqtSlot()
     def __refresh(self):
         """
         Private slot to refresh the list of sessions.
         """
         self.sessionsList.clear()
-        
+
         sessions = WebBrowserWindow.sessionManager().sessionMetaData(
-            includeBackups=True)
+            includeBackups=True
+        )
         for session in sessions:
             if pathlib.Path(session.filePath).exists():
                 itm = QTreeWidgetItem()
                 itm.setText(0, session.name)
-                itm.setText(1, datetime.datetime.fromtimestamp(
-                    pathlib.Path(session.filePath).stat().st_mtime)
-                    .isoformat(sep=" ", timespec="minutes"))
-                itm.setData(0, SessionManagerDialog.SessionFileRole,
-                            session.filePath)
-                itm.setData(0, SessionManagerDialog.BackupSessionRole,
-                            session.isBackup)
-                itm.setData(0, SessionManagerDialog.ActiveSessionRole,
-                            session.isActive)
-                itm.setData(0, SessionManagerDialog.DefaultSessionRole,
-                            session.isDefault)
+                itm.setText(
+                    1,
+                    datetime.datetime.fromtimestamp(
+                        pathlib.Path(session.filePath).stat().st_mtime
+                    ).isoformat(sep=" ", timespec="minutes"),
+                )
+                itm.setData(0, SessionManagerDialog.SessionFileRole, session.filePath)
+                itm.setData(0, SessionManagerDialog.BackupSessionRole, session.isBackup)
+                itm.setData(0, SessionManagerDialog.ActiveSessionRole, session.isActive)
+                itm.setData(
+                    0, SessionManagerDialog.DefaultSessionRole, session.isDefault
+                )
                 self.__updateSessionItem(itm)
                 self.sessionsList.addTopLevelItem(itm)
-        
+
         self.__updateButtons()
-    
+
     def __updateButtons(self):
         """
         Private method to update the button state.
@@ -88,11 +92,12 @@
             isBackup = itm.data(0, SessionManagerDialog.BackupSessionRole)
             isActive = itm.data(0, SessionManagerDialog.ActiveSessionRole)
             isDefault = itm.data(0, SessionManagerDialog.DefaultSessionRole)
-            
+
             self.renameButton.setEnabled(not isDefault and not isBackup)
             self.cloneButton.setEnabled(not isBackup)
-            self.deleteButton.setEnabled(not isBackup and not isDefault and
-                                         not isActive)
+            self.deleteButton.setEnabled(
+                not isBackup and not isDefault and not isActive
+            )
             self.switchButton.setEnabled(not isActive)
             if isBackup:
                 self.switchButton.setText(self.tr("Restore"))
@@ -104,71 +109,73 @@
             self.deleteButton.setEnabled(False)
             self.switchButton.setEnabled(False)
             self.switchButton.setText(self.tr("Switch To"))
-    
+
     def __updateSessionItem(self, itm):
         """
         Private method to set various item properties.
-        
+
         @param itm reference to the item to be updated
         @type QTreeWidgetItem
         """
         isBackup = itm.data(0, SessionManagerDialog.BackupSessionRole)
         isActive = itm.data(0, SessionManagerDialog.ActiveSessionRole)
         isDefault = itm.data(0, SessionManagerDialog.DefaultSessionRole)
-        
+
         font = itm.font(0)
-        
+
         if isBackup:
-            color = self.palette().color(QPalette.ColorGroup.Disabled,
-                                         QPalette.ColorRole.WindowText)
+            color = self.palette().color(
+                QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText
+            )
             itm.setForeground(0, color)
             itm.setForeground(1, color)
-        
+
         if isActive:
             font.setBold(True)
             itm.setFont(0, font)
             itm.setFont(1, font)
-        
+
         if isDefault:
             font.setItalic(True)
             itm.setFont(0, font)
             itm.setFont(1, font)
-    
+
     def showEvent(self, evt):
         """
         Protected method handling the dialog being shown.
-        
+
         @param evt reference to the event object
         @type QShowEvent
         """
         super().showEvent(evt)
         self.__resizeViewHeader()
-    
+
     def resizeEvent(self, evt):
         """
         Protected method handling the dialog being resized.
-        
+
         @param evt reference to the event object
         @type QResizeEvent
         """
         super().resizeEvent(evt)
         self.__resizeViewHeader()
-    
+
     def __resizeViewHeader(self):
         """
         Private method to resize the session column of the list.
         """
         headerWidth = self.sessionsList.header().width()
         self.sessionsList.header().resizeSection(
-            0, int(headerWidth - headerWidth / 2.5))
-    
+            0, int(headerWidth - headerWidth / 2.5)
+        )
+
     @pyqtSlot()
     def __newSession(self):
         """
         Private slot to create a new session.
         """
         WebBrowserWindow.sessionManager().newSession()
-    
+
     @pyqtSlot()
     def __renameSession(self):
         """
@@ -177,11 +184,11 @@
         itm = self.sessionsList.currentItem()
         if itm is None:
             return
-        
+
         filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
         if filePath:
             WebBrowserWindow.sessionManager().renameSession(filePath)
-    
+
     @pyqtSlot()
     def __cloneSession(self):
         """
@@ -190,11 +197,11 @@
         itm = self.sessionsList.currentItem()
         if itm is None:
             return
-        
+
         filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
         if filePath:
             WebBrowserWindow.sessionManager().cloneSession(filePath)
-    
+
     @pyqtSlot()
     def __deleteSession(self):
         """
@@ -203,11 +210,11 @@
         itm = self.sessionsList.currentItem()
         if itm is None:
             return
-        
+
         filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
         if filePath:
             WebBrowserWindow.sessionManager().deleteSession(filePath)
-    
+
     @pyqtSlot()
     def __switchToSession(self):
         """
@@ -216,17 +223,13 @@
         itm = self.sessionsList.currentItem()
         if itm is None:
             return
-        
+
         filePath = itm.data(0, SessionManagerDialog.SessionFileRole)
         if filePath:
             if itm.data(0, SessionManagerDialog.BackupSessionRole):
-                res = (
-                    WebBrowserWindow.sessionManager().replaceSession(filePath)
-                )
+                res = WebBrowserWindow.sessionManager().replaceSession(filePath)
             else:
-                res = (
-                    WebBrowserWindow.sessionManager().switchToSession(filePath)
-                )
-            
+                res = WebBrowserWindow.sessionManager().switchToSession(filePath)
+
             if res:
                 self.close()
--- a/src/eric7/WebBrowser/SiteInfo/SiteInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SiteInfo/SiteInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,11 +11,17 @@
 from PyQt6.QtGui import QPixmap, QImage, QPainter, QColor, QBrush
 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply
 from PyQt6.QtWidgets import (
-    QDialog, QTreeWidgetItem, QGraphicsScene, QMenu, QApplication,
-    QGraphicsPixmapItem
+    QDialog,
+    QTreeWidgetItem,
+    QGraphicsScene,
+    QMenu,
+    QApplication,
+    QGraphicsPixmapItem,
 )
+
 try:
-    from PyQt6.QtNetwork import QSslCertificate     # __IGNORE_WARNING__
+    from PyQt6.QtNetwork import QSslCertificate  # __IGNORE_WARNING__
+
     SSL = True
 except ImportError:
     SSL = False
@@ -37,38 +43,34 @@
     """
     Class implementing a dialog to show some information about a site.
     """
+
     securityStyleFormat = "QLabel {{ background-color : {0}; }}"
-    
+
     def __init__(self, browser, parent=None):
         """
         Constructor
-        
+
         @param browser reference to the browser window (HelpBrowser)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         # put icons
-        self.tabWidget.setTabIcon(
-            0, UI.PixmapCache.getIcon("siteinfo-general"))
-        self.tabWidget.setTabIcon(
-            1, UI.PixmapCache.getIcon("siteinfo-media"))
+        self.tabWidget.setTabIcon(0, UI.PixmapCache.getIcon("siteinfo-general"))
+        self.tabWidget.setTabIcon(1, UI.PixmapCache.getIcon("siteinfo-media"))
         if SSL:
-            self.tabWidget.setTabIcon(
-                2, UI.PixmapCache.getIcon("siteinfo-security"))
-        
+            self.tabWidget.setTabIcon(2, UI.PixmapCache.getIcon("siteinfo-security"))
+
         self.__imageReply = None
-        
+
         self.__baseUrl = browser.url()
         title = browser.title()
         sslInfo = browser.page().getSslCertificateChain()
-        
-        #prepare background of image preview
-        self.__imagePreviewStandardBackground = (
-            self.imagePreview.backgroundBrush()
-        )
+
+        # prepare background of image preview
+        self.__imagePreviewStandardBackground = self.imagePreview.backgroundBrush()
         color1 = QColor(220, 220, 220)
         color2 = QColor(160, 160, 160)
         self.__tilePixmap = QPixmap(8, 8)
@@ -77,72 +79,73 @@
         tilePainter.fillRect(0, 0, 4, 4, color2)
         tilePainter.fillRect(4, 4, 4, 4, color2)
         tilePainter.end()
-        
+
         # populate General tab
         self.heading.setText("<b>{0}</b>".format(title))
         self.siteAddressLabel.setText(self.__baseUrl.toString())
         if self.__baseUrl.scheme() in ["https"]:
-            if WebBrowserWindow.networkManager().isInsecureHost(
-                self.__baseUrl.host()
-            ):
+            if WebBrowserWindow.networkManager().isInsecureHost(self.__baseUrl.host()):
                 self.securityIconLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityMedium"))
+                    UI.PixmapCache.getPixmap("securityMedium")
+                )
                 self.securityLabel.setStyleSheet(
                     SiteInfoDialog.securityStyleFormat.format(
                         Preferences.getWebBrowser("InsecureUrlColor").name()
                     )
                 )
-                self.securityLabel.setText(self.tr(
-                    '<b>Connection is encrypted but may be insecure.</b>'))
+                self.securityLabel.setText(
+                    self.tr("<b>Connection is encrypted but may be insecure.</b>")
+                )
             else:
                 self.securityIconLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh"))
+                    UI.PixmapCache.getPixmap("securityHigh")
+                )
                 self.securityLabel.setStyleSheet(
                     SiteInfoDialog.securityStyleFormat.format(
                         Preferences.getWebBrowser("SecureUrlColor").name()
                     )
                 )
-                self.securityLabel.setText(
-                    self.tr('<b>Connection is encrypted.</b>'))
+                self.securityLabel.setText(self.tr("<b>Connection is encrypted.</b>"))
         else:
-            self.securityIconLabel.setPixmap(
-                UI.PixmapCache.getPixmap("securityLow"))
-            self.securityLabel.setText(
-                self.tr('<b>Connection is not encrypted.</b>'))
+            self.securityIconLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow"))
+            self.securityLabel.setText(self.tr("<b>Connection is not encrypted.</b>"))
         browser.page().runJavaScript(
-            "document.charset", WebBrowserPage.SafeJsWorld,
-            lambda res: self.encodingLabel.setText(res))
-        
+            "document.charset",
+            WebBrowserPage.SafeJsWorld,
+            lambda res: self.encodingLabel.setText(res),
+        )
+
         # populate the Security tab
         if sslInfo and SSL:
             self.sslWidget.showCertificateChain(sslInfo)
         self.tabWidget.setTabEnabled(2, SSL and bool(sslInfo))
         self.securityDetailsButton.setEnabled(SSL and bool(sslInfo))
-        
+
         # populate Meta tags
-        browser.page().runJavaScript(Scripts.getAllMetaAttributes(),
-                                     WebBrowserPage.SafeJsWorld,
-                                     self.__processMetaAttributes)
-        
+        browser.page().runJavaScript(
+            Scripts.getAllMetaAttributes(),
+            WebBrowserPage.SafeJsWorld,
+            self.__processMetaAttributes,
+        )
+
         # populate Media tab
-        browser.page().runJavaScript(Scripts.getAllImages(),
-                                     WebBrowserPage.SafeJsWorld,
-                                     self.__processImageTags)
-        
+        browser.page().runJavaScript(
+            Scripts.getAllImages(), WebBrowserPage.SafeJsWorld, self.__processImageTags
+        )
+
         self.tabWidget.setCurrentIndex(0)
-    
+
     @pyqtSlot()
     def on_securityDetailsButton_clicked(self):
         """
         Private slot to show security details.
         """
-        self.tabWidget.setCurrentIndex(
-            self.tabWidget.indexOf(self.securityTab))
-    
+        self.tabWidget.setCurrentIndex(self.tabWidget.indexOf(self.securityTab))
+
     def __processImageTags(self, res):
         """
         Private method to process the image tags.
-        
+
         @param res result of the JavaScript script
         @type list of dict
         """
@@ -154,27 +157,27 @@
                     alt = src
                 else:
                     pos = src.rfind("/")
-                    alt = src[pos + 1:]
-            
+                    alt = src[pos + 1 :]
+
             if not src or not alt:
                 continue
-            
+
             QTreeWidgetItem(self.imagesTree, [alt, src])
-        
+
         for col in range(self.imagesTree.columnCount()):
             self.imagesTree.resizeColumnToContents(col)
         if self.imagesTree.columnWidth(0) > 300:
             self.imagesTree.setColumnWidth(0, 300)
         self.imagesTree.setCurrentItem(self.imagesTree.topLevelItem(0))
-        self.imagesTree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.imagesTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.imagesTree.customContextMenuRequested.connect(
-            self.__imagesTreeContextMenuRequested)
-    
+            self.__imagesTreeContextMenuRequested
+        )
+
     def __processMetaAttributes(self, res):
         """
         Private method to process the meta attributes.
-        
+
         @param res result of the JavaScript script
         @type list of dict
         """
@@ -183,41 +186,40 @@
             name = meta["name"]
             if not name:
                 name = meta["httpequiv"]
-            
+
             if not name or not content:
                 continue
-            
+
             if meta["charset"]:
                 self.encodingLabel.setText(meta["charset"])
             if "charset=" in content:
-                self.encodingLabel.setText(
-                    content[content.index("charset=") + 8:])
-            
+                self.encodingLabel.setText(content[content.index("charset=") + 8 :])
+
             QTreeWidgetItem(self.tagsTree, [name, content])
         for col in range(self.tagsTree.columnCount()):
             self.tagsTree.resizeColumnToContents(col)
-    
+
     @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
     def on_imagesTree_currentItemChanged(self, current, previous):
         """
         Private slot to show a preview of the selected image.
-        
+
         @param current current image entry (QTreeWidgetItem)
         @param previous old current entry (QTreeWidgetItem)
         """
         if current is None:
             return
-        
+
         imageUrl = QUrl(current.text(1))
         if imageUrl.isRelative():
             imageUrl = self.__baseUrl.resolved(imageUrl)
-        
+
         pixmap = QPixmap()
         loading = False
-        
+
         if imageUrl.scheme() == "data":
             encodedUrl = current.text(1).encode("utf-8")
-            imageData = encodedUrl[encodedUrl.find(b",") + 1:]
+            imageData = encodedUrl[encodedUrl.find(b",") + 1 :]
             pixmap = WebBrowserTools.pixmapFromByteArray(imageData)
         elif imageUrl.scheme() == "file":
             pixmap = QPixmap(imageUrl.toLocalFile())
@@ -227,17 +229,19 @@
             if self.__imageReply is not None:
                 self.__imageReply.deleteLater()
                 self.__imageReply = None
-            
+
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
             self.__imageReply = WebBrowserWindow.networkManager().get(
-                QNetworkRequest(imageUrl))
+                QNetworkRequest(imageUrl)
+            )
             self.__imageReply.finished.connect(self.__imageReplyFinished)
             loading = True
             self.__showLoadingText()
-        
+
         if not loading:
             self.__showPixmap(pixmap)
-    
+
     @pyqtSlot()
     def __imageReplyFinished(self):
         """
@@ -245,47 +249,45 @@
         """
         if self.__imageReply.error() != QNetworkReply.NetworkError.NoError:
             return
-        
+
         data = self.__imageReply.readAll()
         self.__showPixmap(QPixmap.fromImage(QImage.fromData(data)))
-    
+
     def __showPixmap(self, pixmap):
         """
         Private method to show a pixmap in the preview pane.
-        
+
         @param pixmap pixmap to be shown
         @type QPixmap
         """
         scene = QGraphicsScene(self.imagePreview)
         if pixmap.isNull():
-            self.imagePreview.setBackgroundBrush(
-                self.__imagePreviewStandardBackground)
+            self.imagePreview.setBackgroundBrush(self.__imagePreviewStandardBackground)
             scene.addText(self.tr("Preview not available."))
         else:
             self.imagePreview.setBackgroundBrush(QBrush(self.__tilePixmap))
             scene.addPixmap(pixmap)
         self.imagePreview.setScene(scene)
-    
+
     def __showLoadingText(self):
         """
         Private method to show some text while loading an image.
         """
-        self.imagePreview.setBackgroundBrush(
-            self.__imagePreviewStandardBackground)
+        self.imagePreview.setBackgroundBrush(self.__imagePreviewStandardBackground)
         scene = QGraphicsScene(self.imagePreview)
         scene.addText(self.tr("Loading..."))
         self.imagePreview.setScene(scene)
-    
+
     def __imagesTreeContextMenuRequested(self, pos):
         """
         Private slot to show a context menu for the images list.
-        
+
         @param pos position for the menu (QPoint)
         """
         itm = self.imagesTree.itemAt(pos)
         if itm is None:
             return
-        
+
         menu = QMenu()
         act1 = menu.addAction(self.tr("Copy Image Location to Clipboard"))
         act1.setData(itm.text(1))
@@ -298,20 +300,20 @@
         act3.setData(self.imagesTree.indexOfTopLevelItem(itm))
         act3.triggered.connect(lambda: self.__saveImage(act3))
         menu.exec(self.imagesTree.viewport().mapToGlobal(pos))
-    
+
     def __copyAction(self, act):
         """
         Private slot to copy the image URL or the image name to the clipboard.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         QApplication.clipboard().setText(act.data())
-    
+
     def __saveImage(self, act):
         """
         Private slot to save the selected image to disk.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
@@ -319,45 +321,42 @@
         itm = self.imagesTree.topLevelItem(index)
         if itm is None:
             return
-        
-        if (
-            not self.imagePreview.scene() or
-            len(self.imagePreview.scene().items()) == 0
-        ):
+
+        if not self.imagePreview.scene() or len(self.imagePreview.scene().items()) == 0:
             return
-        
+
         pixmapItem = self.imagePreview.scene().items()[0]
         if not isinstance(pixmapItem, QGraphicsPixmapItem):
             return
-        
+
         if pixmapItem.pixmap().isNull():
             EricMessageBox.warning(
                 self,
                 self.tr("Save Image"),
-                self.tr(
-                    """<p>This preview is not available.</p>"""))
+                self.tr("""<p>This preview is not available.</p>"""),
+            )
             return
-        
+
         imageFileName = WebBrowserTools.getFileNameFromUrl(QUrl(itm.text(1)))
         index = imageFileName.rfind(".")
         if index != -1:
             imageFileName = imageFileName[:index] + ".png"
-        
+
         filename = EricFileDialog.getSaveFileName(
             self,
             self.tr("Save Image"),
             imageFileName,
             self.tr("All Files (*)"),
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not filename:
             return
-        
+
         if not pixmapItem.pixmap().save(filename, "PNG"):
             EricMessageBox.critical(
                 self,
                 self.tr("Save Image"),
-                self.tr(
-                    """<p>Cannot write to file <b>{0}</b>.</p>""")
-                .format(filename))
+                self.tr("""<p>Cannot write to file <b>{0}</b>.</p>""").format(filename),
+            )
             return
--- a/src/eric7/WebBrowser/SiteInfo/SiteInfoWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SiteInfo/SiteInfoWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,8 +9,14 @@
 
 from PyQt6.QtCore import pyqtSlot, Qt, QPoint
 from PyQt6.QtWidgets import (
-    QMenu, QGridLayout, QHBoxLayout, QLabel, QFrame, QSizePolicy, QPushButton,
-    QSpacerItem
+    QMenu,
+    QGridLayout,
+    QHBoxLayout,
+    QLabel,
+    QFrame,
+    QSizePolicy,
+    QPushButton,
+    QSpacerItem,
 )
 
 import UI.PixmapCache
@@ -22,85 +28,86 @@
     """
     Class implementing a widget to show site related infos.
     """
+
     def __init__(self, browser, parent=None):
         """
         Constructor
-        
+
         @param browser reference to the browser view
         @type WebBrowserView
         @param parent reference to the parent object
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__browser = browser
         url = browser.url()
-        
+
         self.setMinimumWidth(400)
-        
+
         layout = QGridLayout(self)
         rows = 0
-        
+
         titleLabel = QLabel(self)
         titleLabel.setText(self.tr("<b>Site {0}</b>").format(url.host()))
-        layout.addWidget(titleLabel, rows, 0, 1, -1,
-                         Qt.AlignmentFlag.AlignCenter)
+        layout.addWidget(titleLabel, rows, 0, 1, -1, Qt.AlignmentFlag.AlignCenter)
         rows += 1
-        
+
         line = QFrame(self)
         line.setLineWidth(1)
         line.setFrameStyle(QFrame.Shape.HLine | QFrame.Shadow.Sunken)
         layout.addWidget(line, rows, 0, 1, -1)
         rows += 1
-        
+
         secureIcon = QLabel()
         layout.addWidget(secureIcon, rows, 0, Qt.AlignmentFlag.AlignCenter)
         secureLabel = QLabel()
-        secureLabel.setSizePolicy(QSizePolicy.Policy.Expanding,
-                                  QSizePolicy.Policy.Preferred)
+        secureLabel.setSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         layout.addWidget(secureLabel, rows, 1)
         if url.scheme() in ["https"]:
             if WebBrowserWindow.networkManager().isInsecureHost(url.host()):
                 secureLabel.setText(
-                    self.tr("Your connection to this site "
-                            "<b>may not be secure</b>."))
-                secureIcon.setPixmap(
-                    UI.PixmapCache.getPixmap("securityMedium"))
+                    self.tr("Your connection to this site " "<b>may not be secure</b>.")
+                )
+                secureIcon.setPixmap(UI.PixmapCache.getPixmap("securityMedium"))
             else:
                 secureLabel.setText(
-                    self.tr("Your connection to this site is <b>secure</b>."))
-                secureIcon.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh"))
+                    self.tr("Your connection to this site is <b>secure</b>.")
+                )
+                secureIcon.setPixmap(UI.PixmapCache.getPixmap("securityHigh"))
         else:
             secureLabel.setText(
-                self.tr("Your connection to this site is <b>not secure</b>."))
-            secureIcon.setPixmap(
-                UI.PixmapCache.getPixmap("securityLow"))
+                self.tr("Your connection to this site is <b>not secure</b>.")
+            )
+            secureIcon.setPixmap(UI.PixmapCache.getPixmap("securityLow"))
         rows += 1
-        
+
         visits = WebBrowserWindow.historyManager().siteVisitsCount(
-            url.scheme(), url.host())
+            url.scheme(), url.host()
+        )
         historyIcon = QLabel()
         layout.addWidget(historyIcon, rows, 0, Qt.AlignmentFlag.AlignCenter)
         historyLabel = QLabel()
-        historyLabel.setSizePolicy(QSizePolicy.Policy.Expanding,
-                                   QSizePolicy.Policy.Preferred)
+        historyLabel.setSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         layout.addWidget(historyLabel, rows, 1)
         if visits > 3:
             historyLabel.setText(
-                self.tr("This is your <b>{0}.</b> visit of this site.")
-                .format(visits))
-            historyIcon.setPixmap(
-                UI.PixmapCache.getPixmap("flagGreen"))
+                self.tr("This is your <b>{0}.</b> visit of this site.").format(visits)
+            )
+            historyIcon.setPixmap(UI.PixmapCache.getPixmap("flagGreen"))
         elif visits == 0:
             historyLabel.setText(
-                self.tr("You have <b>never</b> visited this site before.")
-                .format(visits))
-            historyIcon.setPixmap(
-                UI.PixmapCache.getPixmap("flagBlack"))
+                self.tr("You have <b>never</b> visited this site before.").format(
+                    visits
+                )
+            )
+            historyIcon.setPixmap(UI.PixmapCache.getPixmap("flagBlack"))
         else:
-            historyIcon.setPixmap(
-                UI.PixmapCache.getPixmap("flagYellow"))
+            historyIcon.setPixmap(UI.PixmapCache.getPixmap("flagYellow"))
             if visits == 1:
                 visitStr = self.tr("first")
             elif visits == 2:
@@ -108,62 +115,59 @@
             else:
                 visitStr = self.tr("third")
             historyLabel.setText(
-                self.tr("This is your <b>{0}</b> visit of this site.")
-                .format(visitStr))
+                self.tr("This is your <b>{0}</b> visit of this site.").format(visitStr)
+            )
         rows += 1
-        
+
         line = QFrame(self)
         line.setLineWidth(1)
         line.setFrameStyle(QFrame.Shape.HLine | QFrame.Shadow.Sunken)
         layout.addWidget(line, rows, 0, 1, -1)
         rows += 1
-        
+
         page = self.__browser.page()
         scheme = page.registerProtocolHandlerRequestScheme()
-        registeredUrl = (
-            WebBrowserWindow.protocolHandlerManager().protocolHandler(scheme)
+        registeredUrl = WebBrowserWindow.protocolHandlerManager().protocolHandler(
+            scheme
         )
-        if (
-            bool(scheme) and
-            registeredUrl != page.registerProtocolHandlerRequestUrl()
-        ):
+        if bool(scheme) and registeredUrl != page.registerProtocolHandlerRequestUrl():
             horizontalLayout = QHBoxLayout()
             protocolHandlerLabel = QLabel(
-                self.tr("Register as <b>{0}</b> links handler.")
-                .format(scheme), self)
-            protocolHandlerLabel.setSizePolicy(QSizePolicy.Policy.Expanding,
-                                               QSizePolicy.Policy.Preferred)
-            
+                self.tr("Register as <b>{0}</b> links handler.").format(scheme), self
+            )
+            protocolHandlerLabel.setSizePolicy(
+                QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+            )
+
             horizontalLayout.addWidget(protocolHandlerLabel)
             protocolHandlerButton = QPushButton(self.tr("Register"), self)
             horizontalLayout.addWidget(protocolHandlerButton)
-            protocolHandlerButton.clicked.connect(
-                self.__registerProtocolHandler)
+            protocolHandlerButton.clicked.connect(self.__registerProtocolHandler)
             layout.addLayout(horizontalLayout, rows, 0, 1, -1)
             rows += 1
-            
+
             protocolHandlerLine = QFrame(self)
             protocolHandlerLine.setLineWidth(1)
-            protocolHandlerLine.setFrameStyle(
-                QFrame.Shape.HLine | QFrame.Shadow.Sunken)
+            protocolHandlerLine.setFrameStyle(QFrame.Shape.HLine | QFrame.Shadow.Sunken)
             layout.addWidget(protocolHandlerLine, rows, 0, 1, -1)
             rows += 1
-        
+
         horizontalLayout = QHBoxLayout()
         spacerItem = QSpacerItem(
-            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
+            40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
+        )
         horizontalLayout.addItem(spacerItem)
         moreButton = QPushButton(self.tr("More..."), self)
         horizontalLayout.addWidget(moreButton)
         moreButton.clicked.connect(self.__showSiteInfo)
         layout.addLayout(horizontalLayout, rows, 0, 1, -1)
-        
+
         layout.activate()
-    
+
     def showAt(self, pos):
         """
         Public method to show the widget.
-        
+
         @param pos position to show at
         @type QPoint
         """
@@ -174,23 +178,23 @@
         p = QPoint(xpos, pos.y() + 10)
         self.move(p)
         self.show()
-    
+
     def accept(self):
         """
         Public method to accept the widget.
         """
         self.close()
-    
+
     @pyqtSlot()
     def __showSiteInfo(self):
         """
         Private slot to show the site info dialog.
         """
         from .SiteInfoDialog import SiteInfoDialog
-        siteinfoDialog = SiteInfoDialog(
-            self.__browser, self.__browser.mainWindow())
+
+        siteinfoDialog = SiteInfoDialog(self.__browser, self.__browser.mainWindow())
         siteinfoDialog.show()
-    
+
     @pyqtSlot()
     def __registerProtocolHandler(self):
         """
@@ -200,4 +204,5 @@
         page = self.__browser.page()
         WebBrowserWindow.protocolHandlerManager().addProtocolHandler(
             page.registerProtocolHandlerRequestScheme(),
-            page.registerProtocolHandlerRequestUrl())
+            page.registerProtocolHandlerRequestUrl(),
+        )
--- a/src/eric7/WebBrowser/SpeedDial/Page.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpeedDial/Page.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,10 +12,11 @@
     """
     Class to hold the data for a speed dial page.
     """
+
     def __init__(self, url="", title="", broken=False):
         """
         Constructor
-        
+
         @param url URL of the page (string)
         @param title title of the page (string)
         @param broken flag indicating a broken connection (boolean)
@@ -23,23 +24,20 @@
         self.url = url
         self.title = title
         self.broken = broken
-    
+
     def __eq__(self, other):
         """
         Special method implementing the equality operator.
-        
+
         @param other reference to the other page object (Page)
         @return flag indicating equality (boolean)
         """
-        return (
-            self.title == other.title and
-            self.url == other.url
-        )
-    
+        return self.title == other.title and self.url == other.url
+
     def isValid(self):
         """
         Public method to check the validity.
-        
+
         @return flag indicating a valid object
         @rtype bool
         """
--- a/src/eric7/WebBrowser/SpeedDial/PageThumbnailer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpeedDial/PageThumbnailer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,118 +15,120 @@
 class PageThumbnailer(QObject):
     """
     Class implementing a thumbnail creator for web sites.
-    
+
     @signal thumbnailCreated(QPixmap) emitted after the thumbnail has been
         created
     """
+
     thumbnailCreated = pyqtSignal(QPixmap)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__size = QSize(231, 130)
         self.__loadTitle = False
         self.__title = ""
         self.__url = QUrl()
-        
+
         self.__view = QWebEngineView()
         self.__view.setAttribute(Qt.WidgetAttribute.WA_DontShowOnScreen)
         self.__view.resize(1920, 1080)
         self.__view.show()
-    
+
     def setSize(self, size):
         """
         Public method to set the size of the image.
-        
+
         @param size size of the image (QSize)
         """
         if size.isValid():
             self.__size = QSize(size)
-    
+
     def setUrl(self, url):
         """
         Public method to set the URL of the site to be thumbnailed.
-        
+
         @param url URL of the web site (QUrl)
         """
         if url.isValid():
             self.__url = QUrl(url)
-    
+
     def url(self):
         """
         Public method to get the URL of the thumbnail.
-        
+
         @return URL of the thumbnail (QUrl)
         """
         return QUrl(self.__url)
-    
+
     def loadTitle(self):
         """
         Public method to check, if the title is loaded from the web site.
-        
+
         @return flag indicating, that the title is loaded (boolean)
         """
         return self.__loadTitle
-    
+
     def setLoadTitle(self, load):
         """
         Public method to set a flag indicating to load the title from
         the web site.
-        
+
         @param load flag indicating to load the title (boolean)
         """
         self.__loadTitle = load
-    
+
     def title(self):
         """
         Public method to get the title of the thumbnail.
-        
+
         @return title of the thumbnail (string)
         """
         title = self.__title if self.__title else self.__url.host()
         if not title:
             title = self.__url.toString()
         return title
-    
+
     def start(self):
         """
         Public method to start the thumbnailing action.
         """
         self.__view.loadFinished.connect(self.__createThumbnail)
         self.__view.load(self.__url)
-    
+
     def __createThumbnail(self, status):
         """
         Private slot creating the thumbnail of the web site.
-        
+
         @param status flag indicating a successful load of the web site
             (boolean)
         """
         if not status:
             self.thumbnailCreated.emit(QPixmap())
             return
-        
+
         QTimer.singleShot(1000, self.__grabThumbnail)
-    
+
     def __grabThumbnail(self):
         """
         Private slot to grab the thumbnail image from the view.
         """
         self.__title = self.__view.title()
-        
+
         image = QImage(self.__view.size(), QImage.Format.Format_ARGB32)
         painter = QPainter(image)
         self.__view.render(painter)
         painter.end()
-        
+
         scaledImage = image.scaled(
             self.__size,
             Qt.AspectRatioMode.KeepAspectRatioByExpanding,
-            Qt.TransformationMode.SmoothTransformation)
-        
+            Qt.TransformationMode.SmoothTransformation,
+        )
+
         self.thumbnailCreated.emit(QPixmap.fromImage(scaledImage))
--- a/src/eric7/WebBrowser/SpeedDial/SpeedDial.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpeedDial/SpeedDial.py	Wed Jul 13 14:55:47 2022 +0200
@@ -10,8 +10,13 @@
 import os
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, QObject, QCryptographicHash, QByteArray, QUrl,
-    qWarning
+    pyqtSignal,
+    pyqtSlot,
+    QObject,
+    QCryptographicHash,
+    QByteArray,
+    QUrl,
+    qWarning,
 )
 
 from EricWidgets import EricMessageBox
@@ -25,97 +30,102 @@
 class SpeedDial(QObject):
     """
     Class implementing the speed dial.
-    
+
     @signal pagesChanged() emitted after the list of pages changed
     @signal thumbnailLoaded(url, src) emitted after a thumbnail was loaded
     @signal pageTitleLoaded(url, title) emitted after a title was loaded
     @signal speedDialSaved() emitted after the speed dial data was saved
     """
+
     pagesChanged = pyqtSignal()
     thumbnailLoaded = pyqtSignal(str, str)
     pageTitleLoaded = pyqtSignal(str, str)
     speedDialSaved = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__regenerateScript = True
-        
+
         self.__webPages = []
-        
+
         self.__initialScript = ""
         self.__thumbnailsDirectory = ""
-        
+
         self.__thumbnailers = []
-        
+
         self.__initialize()
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
         self.pagesChanged.connect(self.__saveTimer.changeOccurred)
-    
+
     def addPage(self, url, title):
         """
         Public method to add a page for the given data.
-        
+
         @param url URL of the page (QUrl)
         @param title title of the page (string)
         """
         if url.isEmpty():
             return
-        
+
         from .Page import Page
-        page = Page(
-            self.__escapeUrl(url.toString()),
-            self.__escapeTitle(title))
+
+        page = Page(self.__escapeUrl(url.toString()), self.__escapeTitle(title))
         self.__webPages.append(page)
         self.__regenerateScript = True
-        
+
         self.pagesChanged.emit()
-    
+
     def removePage(self, url):
         """
         Public method to remove a page.
-        
+
         @param url URL of the page (QUrl)
         """
         page = self.pageForUrl(url)
         if not page.isValid():
             return
-        
+
         self.removeImageForUrl(page.url)
         self.__webPages.remove(page)
         self.__regenerateScript = True
-        
+
         self.pagesChanged.emit()
-    
+
     def __imageFileName(self, url):
         """
         Private method to generate the image file name for a URL.
-        
+
         @param url URL to generate the file name from (string)
         @return name of the image file (string)
         """
         return os.path.join(
             self.__thumbnailsDirectory,
-            str(QCryptographicHash.hash(QByteArray(url.encode("utf-8")),
-                QCryptographicHash.Algorithm.Md5).toHex(), encoding="utf-8"
-                ) + ".png")
-    
+            str(
+                QCryptographicHash.hash(
+                    QByteArray(url.encode("utf-8")), QCryptographicHash.Algorithm.Md5
+                ).toHex(),
+                encoding="utf-8",
+            )
+            + ".png",
+        )
+
     def initialScript(self):
         """
         Public method to get the 'initial' JavaScript script.
-        
+
         @return initial JavaScript script (string)
         """
         if self.__regenerateScript:
             self.__regenerateScript = False
             self.__initialScript = ""
-            
+
             for page in self.__webPages:
                 if page.broken:
                     imgSource = pixmapFileToDataUrl("brokenPage.png", True)
@@ -124,61 +134,61 @@
                     if not os.path.exists(imgSource):
                         self.loadThumbnail(page.url, False)
                         imgSource = pixmapFileToDataUrl("loading.gif", True)
-                        
+
                         if not page.url:
                             imgSource = ""
                     else:
                         imgSource = pixmapFileToDataUrl(imgSource, True)
-                
-                self.__initialScript += (
-                    "addBox('{0}', '{1}', '{2}');\n").format(
-                        page.url, Utilities.html_uencode(page.title),
-                        imgSource)
-        
+
+                self.__initialScript += ("addBox('{0}', '{1}', '{2}');\n").format(
+                    page.url, Utilities.html_uencode(page.title), imgSource
+                )
+
         return self.__initialScript
-    
+
     def getFileName(self):
         """
         Public method to get the file name of the user agents file.
-        
+
         @return name of the user agents file (string)
         """
-        return os.path.join(
-            Utilities.getConfigDir(), "web_browser", "speedDial.xml")
-    
+        return os.path.join(Utilities.getConfigDir(), "web_browser", "speedDial.xml")
+
     def __initialize(self):
         """
         Private method to initialize the speed dial.
         """
         self.__thumbnailsDirectory = os.path.join(
-            Utilities.getConfigDir(), "web_browser", "thumbnails")
+            Utilities.getConfigDir(), "web_browser", "thumbnails"
+        )
         # Create directory if it does not exist yet
         if not os.path.exists(self.__thumbnailsDirectory):
             os.makedirs(self.__thumbnailsDirectory)
-        
+
         self.__load()
-    
+
     def reload(self):
         """
         Public method to reload the speed dial data.
         """
         self.__load()
-    
+
     def __load(self):
         """
         Private method to load the speed dial configuration.
         """
         allPages, pagesPerRow, speedDialSize = [], 0, 0
-        
+
         speedDialFile = self.getFileName()
         if os.path.exists(speedDialFile):
             from .SpeedDialReader import SpeedDialReader
+
             reader = SpeedDialReader()
             allPages, pagesPerRow, speedDialSize = reader.read(speedDialFile)
-        
+
         self.__pagesPerRow = pagesPerRow if pagesPerRow else 4
         self.__speedDialSize = speedDialSize if speedDialSize else 231
-        
+
         if allPages:
             self.__webPages = allPages
             self.pagesChanged.emit()
@@ -195,25 +205,28 @@
                 'url:"http://www.google.com"|title:"Google";'
             )
             self.changed(allPages)
-    
+
     def save(self):
         """
         Public method to save the speed dial configuration.
         """
         from .SpeedDialWriter import SpeedDialWriter
+
         speedDialFile = self.getFileName()
         writer = SpeedDialWriter()
-        if not writer.write(speedDialFile, self.__webPages,
-                            self.__pagesPerRow, self.__speedDialSize):
+        if not writer.write(
+            speedDialFile, self.__webPages, self.__pagesPerRow, self.__speedDialSize
+        ):
             EricMessageBox.critical(
                 None,
                 self.tr("Saving Speed Dial data"),
                 self.tr(
-                    """<p>Speed Dial data could not be saved to"""
-                    """ <b>{0}</b></p>""").format(speedDialFile))
+                    """<p>Speed Dial data could not be saved to""" """ <b>{0}</b></p>"""
+                ).format(speedDialFile),
+            )
         else:
             self.speedDialSaved.emit()
-    
+
     def resetDials(self):
         """
         Public method to reset the speed dials to the default values.
@@ -221,71 +234,76 @@
         ok = EricMessageBox.yesNo(
             None,
             self.tr("Reset Speed Dials"),
-            self.tr("""Are you sure you want to reset the speed dials to"""
-                    """ the default pages?"""))
+            self.tr(
+                """Are you sure you want to reset the speed dials to"""
+                """ the default pages?"""
+            ),
+        )
         if ok:
             speedDialFile = self.getFileName()
             if os.path.exists(speedDialFile):
                 os.remove(speedDialFile)
             self.__regenerateScript = True
-            
+
             self.__load()
-    
+
     def close(self):
         """
         Public method to close the user agents manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def pageForUrl(self, url):
         """
         Public method to get the page for the given URL.
-        
+
         @param url URL to be searched for (QUrl)
         @return page for the URL (Page)
         """
         urlString = url.toString()
         if urlString.endswith("/"):
             urlString = urlString[:-1]
-        
+
         for page in self.__webPages:
             if page.url == urlString:
                 return page
-        
+
         from .Page import Page
+
         return Page()
-    
+
     def urlForShortcut(self, key):
         """
         Public method to get the URL for the given shortcut key.
-        
+
         @param key shortcut key (integer)
         @return URL for the key (QUrl)
         """
         if key < 0 or len(self.__webPages) <= key:
             return QUrl()
-        
+
         return QUrl.fromEncoded(self.__webPages[key].url.encode("utf-8"))
-    
+
     @pyqtSlot(str)
     def changed(self, allPages):
         """
         Public slot to react on changed pages.
-        
+
         @param allPages string giving all pages (string)
         """
         if not allPages:
             return
-        
+
         entries = allPages.split('";')
         self.__webPages = []
         self.__regenerateScript = True
-        
+
         from .Page import Page
+
         for entry in entries:
             if not entry:
                 continue
-            
+
             tmp = entry.split('"|')
             if len(tmp) == 2:
                 broken = False
@@ -293,43 +311,45 @@
                 broken = "brokenPage" in tmp[2][5:]
             else:
                 continue
-            
+
             url = tmp[0][5:]
             if url.endswith("/"):
                 url = url[:-1]
             title = tmp[1][7:]
             page = Page(url, title, broken)
             self.__webPages.append(page)
-        
+
         self.pagesChanged.emit()
-    
+
     @pyqtSlot(str, bool)
     def loadThumbnail(self, url, loadTitle):
         """
         Public slot to load a thumbnail of the given URL.
-        
+
         @param url URL of the thumbnail (string)
         @param loadTitle flag indicating to get the title for the thumbnail
             from the site (boolean)
         """
         if not url:
             return
-        
+
         from .PageThumbnailer import PageThumbnailer
+
         thumbnailer = PageThumbnailer(self)
         thumbnailer.setUrl(QUrl.fromEncoded(url.encode("utf-8")))
         thumbnailer.setLoadTitle(loadTitle)
         thumbnailer.thumbnailCreated.connect(
-            lambda imag: self.__thumbnailCreated(imag, thumbnailer))
+            lambda imag: self.__thumbnailCreated(imag, thumbnailer)
+        )
         self.__thumbnailers.append(thumbnailer)
-        
+
         thumbnailer.start()
 
     @pyqtSlot(str)
     def removeImageForUrl(self, url):
         """
         Public slot to remove the image for a URL.
-        
+
         @param url URL to remove the image for (string)
         """
         fileName = self.__imageFileName(url)
@@ -340,17 +360,17 @@
     def urlFromUserInput(self, url):
         """
         Public slot to get the URL from user input.
-        
+
         @param url URL entered by the user (string)
         @return sanitized URL (string)
         """
         return QUrl.fromUserInput(url).toString()
-    
+
     @pyqtSlot(int)
     def setPagesInRow(self, count):
         """
         Public slot to set the number of pages per row.
-        
+
         @param count number of pages per row (integer)
         """
         self.__pagesPerRow = count
@@ -359,33 +379,33 @@
     def pagesInRow(self):
         """
         Public method to get the number of dials per row.
-        
+
         @return number of dials per row (integer)
         """
         return self.__pagesPerRow
-    
+
     @pyqtSlot(int)
     def setSdSize(self, size):
         """
         Public slot to set the size of the speed dial.
-        
+
         @param size size of the speed dial (integer)
         """
         self.__speedDialSize = size
         self.__saveTimer.changeOccurred()
-    
+
     def sdSize(self):
         """
         Public method to get the speed dial size.
-        
+
         @return speed dial size (integer)
         """
         return self.__speedDialSize
-    
+
     def __thumbnailCreated(self, image, thumbnailer):
         """
         Private slot to handle the creation of a thumbnail image.
-        
+
         @param image thumbnail image
         @type QPixmap
         @param thumbnailer reference to the page thumbnailer
@@ -396,7 +416,7 @@
             title = thumbnailer.title()
             url = thumbnailer.url().toString()
             fileName = self.__imageFileName(url)
-            
+
             if image.isNull():
                 fileName = "brokenPage.png"
                 title = self.tr("Unable to load")
@@ -406,22 +426,22 @@
                 if not image.save(fileName, "PNG"):
                     qWarning(
                         "SpeedDial.__thumbnailCreated: Cannot save thumbnail"
-                        " to {0}".format(fileName))
-            
+                        " to {0}".format(fileName)
+                    )
+
             self.__regenerateScript = True
             thumbnailer.deleteLater()
             self.__thumbnailers.remove(thumbnailer)
-            
+
             if loadTitle:
                 self.pageTitleLoaded.emit(url, title)
-            
-            self.thumbnailLoaded.emit(
-                url, pixmapFileToDataUrl(fileName, True))
-    
+
+            self.thumbnailLoaded.emit(url, pixmapFileToDataUrl(fileName, True))
+
     def __escapeTitle(self, title):
         """
         Private method to escape a title string.
-        
+
         @param title title string to be escaped
         @type str
         @return escaped title string
@@ -429,11 +449,11 @@
         """
         title = title.replace('"', "&quot;").replace("'", "&apos;")
         return title
-    
+
     def __escapeUrl(self, url):
         """
         Private method to escape an URL string.
-        
+
         @param url URL to be escaped
         @type str
         @return escaped URL string
--- a/src/eric7/WebBrowser/SpeedDial/SpeedDialReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpeedDial/SpeedDialReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,16 +15,17 @@
     """
     Class implementing a reader object for speed dial data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def read(self, fileNameOrDevice):
         """
         Public method to read a user agent file.
-        
+
         @param fileNameOrDevice name of the file to read (string)
             or reference to the device to read (QIODevice)
         @return list of speed dial pages (list of Page), number of pages per
@@ -33,7 +34,7 @@
         self.__pages = []
         self.__pagesPerRow = 0
         self.__sdSize = 0
-        
+
         if isinstance(fileNameOrDevice, QIODevice):
             self.setDevice(fileNameOrDevice)
         else:
@@ -42,36 +43,38 @@
                 return self.__pages, self.__pagesPerRow, self.__sdSize
             opened = f.open(QIODevice.OpenModeFlag.ReadOnly)
             if not opened:
-                self.raiseError(QCoreApplication.translate(
-                    "SpeedDialReader",
-                    "The file {0} could not be opened. Error: {1}").format(
-                    fileNameOrDevice, f.errorString()))
+                self.raiseError(
+                    QCoreApplication.translate(
+                        "SpeedDialReader",
+                        "The file {0} could not be opened. Error: {1}",
+                    ).format(fileNameOrDevice, f.errorString())
+                )
                 return self.__pages, self.__pagesPerRow, self.__sdSize
             self.setDevice(f)
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 version = self.attributes().value("version")
-                if (
-                    self.name() == "SpeedDial" and
-                    (not version or version == "1.0")
-                ):
+                if self.name() == "SpeedDial" and (not version or version == "1.0"):
                     self.__readSpeedDial()
                 else:
-                    self.raiseError(QCoreApplication.translate(
-                        "SpeedDialReader",
-                        "The file is not a SpeedDial version 1.0 file."))
-        
+                    self.raiseError(
+                        QCoreApplication.translate(
+                            "SpeedDialReader",
+                            "The file is not a SpeedDial version 1.0 file.",
+                        )
+                    )
+
         return self.__pages, self.__pagesPerRow, self.__sdSize
-    
+
     def __readSpeedDial(self):
         """
         Private method to read the speed dial data.
         """
         if not self.isStartElement() and self.name() != "SpeedDial":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
@@ -79,7 +82,7 @@
                     continue
                 else:
                     break
-            
+
             if self.isStartElement():
                 if self.name() == "Pages":
                     attributes = self.attributes()
@@ -97,22 +100,23 @@
                         if not title:
                             title = url
                         from .Page import Page
+
                         page = Page(url, title)
                         self.__pages.append(page)
                 else:
                     self.__skipUnknownElement()
-    
+
     def __skipUnknownElement(self):
         """
         Private method to skip over all unknown elements.
         """
         if not self.isStartElement():
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 self.__skipUnknownElement()
--- a/src/eric7/WebBrowser/SpeedDial/SpeedDialWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpeedDial/SpeedDialWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,18 +14,19 @@
     """
     Class implementing a writer object to generate speed dial data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.setAutoFormatting(True)
-    
+
     def write(self, fileNameOrDevice, pages, pagesPerRow, speedDialSize):
         """
         Public method to write a speed dial data file.
-        
+
         @param fileNameOrDevice name of the file to write (string)
             or device to write to (QIODevice)
         @param pages list of speed dial pages (list of Page)
@@ -39,14 +40,14 @@
             f = QFile(fileNameOrDevice)
             if not f.open(QIODevice.OpenModeFlag.WriteOnly):
                 return False
-        
+
         self.setDevice(f)
         return self.__write(pages, pagesPerRow, speedDialSize)
-    
+
     def __write(self, pages, pagesPerRow, speedDialSize):
         """
         Private method to write a speed dial file.
-        
+
         @param pages list of speed dial pages (list of Page)
         @param pagesPerRow number of pages per row (integer)
         @param speedDialSize size of the speed dial pages (integer)
@@ -56,15 +57,15 @@
         self.writeDTD("<!DOCTYPE speeddial>")
         self.writeStartElement("SpeedDial")
         self.writeAttribute("version", "1.0")
-        
+
         self.writeStartElement("Pages")
         self.writeAttribute("row", str(pagesPerRow))
         self.writeAttribute("size", str(speedDialSize))
-        
+
         for page in pages:
             self.writeEmptyElement("Page")
             self.writeAttribute("url", page.url)
             self.writeAttribute("title", page.title)
-        
+
         self.writeEndDocument()
         return True
--- a/src/eric7/WebBrowser/SpellCheck/ManageDictionariesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/SpellCheck/ManageDictionariesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,9 +15,7 @@
 import contextlib
 
 from PyQt6.QtCore import pyqtSlot, Qt, QUrl
-from PyQt6.QtWidgets import (
-    QDialog, QDialogButtonBox, QAbstractButton, QListWidgetItem
-)
+from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QAbstractButton, QListWidgetItem
 from PyQt6.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkInformation
 
 from EricWidgets import EricMessageBox
@@ -33,15 +31,16 @@
     """
     Class implementing a dialog to install spell checking dictionaries.
     """
+
     FilenameRole = Qt.ItemDataRole.UserRole
     UrlRole = Qt.ItemDataRole.UserRole + 1
     DocumentationDirRole = Qt.ItemDataRole.UserRole + 2
     LocalesRole = Qt.ItemDataRole.UserRole + 3
-    
+
     def __init__(self, writeableDirectories, parent=None):
         """
         Constructor
-        
+
         @param writeableDirectories list of writable directories
         @type list of str
         @param parent reference to the parent widget
@@ -49,71 +48,73 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__refreshButton = self.buttonBox.addButton(
-            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__installButton = self.buttonBox.addButton(
-            self.tr("Install Selected"),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Install Selected"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__installButton.setEnabled(False)
         self.__uninstallButton = self.buttonBox.addButton(
-            self.tr("Uninstall Selected"),
-            QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Uninstall Selected"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__uninstallButton.setEnabled(False)
         self.__cancelButton = self.buttonBox.addButton(
-            self.tr("Cancel"), QDialogButtonBox.ButtonRole.ActionRole)
+            self.tr("Cancel"), QDialogButtonBox.ButtonRole.ActionRole
+        )
         self.__cancelButton.setEnabled(False)
-        
+
         self.locationComboBox.addItems(writeableDirectories)
-        
+
         self.dictionariesUrlEdit.setText(
-            Preferences.getWebBrowser("SpellCheckDictionariesUrl"))
-        
-        if (
-            Preferences.getUI("DynamicOnlineCheck") and
-            QNetworkInformation.load(QNetworkInformation.Feature.Reachability)
+            Preferences.getWebBrowser("SpellCheckDictionariesUrl")
+        )
+
+        if Preferences.getUI("DynamicOnlineCheck") and QNetworkInformation.load(
+            QNetworkInformation.Feature.Reachability
         ):
-            self.__reachabilityChanged(
-                QNetworkInformation.instance().reachability())
+            self.__reachabilityChanged(QNetworkInformation.instance().reachability())
             QNetworkInformation.instance().reachabilityChanged.connect(
-                self.__reachabilityChanged)
+                self.__reachabilityChanged
+            )
         else:
             # assume to be 'always online' if no backend could be loaded or
             # dynamic online check is switched of
             self.__reachabilityChanged(QNetworkInformation.Reachability.Online)
         self.__replies = []
-        
+
         self.__downloadCancelled = False
         self.__dictionariesToDownload = []
-        
+
         self.__populateList()
-    
+
     def __reachabilityChanged(self, reachability):
         """
         Private slot handling reachability state changes.
-        
+
         @param reachability new reachability state
         @type QNetworkInformation.Reachability
         """
         online = reachability == QNetworkInformation.Reachability.Online
         self.__online = online
-        
+
         self.__refreshButton.setEnabled(online)
-        
+
         msg = (
             self.tr("Internet Reachability Status: Reachable")
-            if online else
-            self.tr("Internet Reachability Status: Not Reachable")
+            if online
+            else self.tr("Internet Reachability Status: Not Reachable")
         )
         self.statusLabel.setText(msg)
-        
+
         self.on_dictionariesList_itemSelectionChanged()
-    
+
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
         Private slot to handle the click of a button of the button box.
-        
+
         @param button reference to the button pressed
         @type QAbstractButton
         """
@@ -125,72 +126,75 @@
             self.__installSelected()
         elif button == self.__uninstallButton:
             self.__uninstallSelected()
-    
+
     @pyqtSlot()
     def on_dictionariesList_itemSelectionChanged(self):
         """
         Private slot to handle a change of the selection.
         """
         self.__installButton.setEnabled(
-            self.locationComboBox.count() > 0 and
-            len(self.dictionariesList.selectedItems()) > 0 and
-            self.__online
+            self.locationComboBox.count() > 0
+            and len(self.dictionariesList.selectedItems()) > 0
+            and self.__online
         )
-        
+
         self.__uninstallButton.setEnabled(
-            self.locationComboBox.count() > 0 and
-            len([itm
-                 for itm in self.dictionariesList.selectedItems()
-                 if itm.checkState() == Qt.CheckState.Checked
-                 ])
+            self.locationComboBox.count() > 0
+            and len(
+                [
+                    itm
+                    for itm in self.dictionariesList.selectedItems()
+                    if itm.checkState() == Qt.CheckState.Checked
+                ]
+            )
         )
-    
+
     @pyqtSlot(bool)
     def on_dictionariesUrlEditButton_toggled(self, checked):
         """
         Private slot to set the read only status of the dictionaries URL line
         edit.
-        
+
         @param checked state of the push button (boolean)
         """
         self.dictionariesUrlEdit.setReadOnly(not checked)
-    
+
     @pyqtSlot(str)
     def on_locationComboBox_currentTextChanged(self, txt):
         """
         Private slot to handle a change of the installation location.
-        
+
         @param txt installation location
         @type str
         """
         self.__checkInstalledDictionaries()
-    
+
     def __populateList(self):
         """
         Private method to populate the list of available plugins.
         """
         self.dictionariesList.clear()
         self.downloadProgress.setValue(0)
-        
+
         url = self.dictionariesUrlEdit.text()
-        
+
         if self.__online:
             self.__refreshButton.setEnabled(False)
             self.__installButton.setEnabled(False)
             self.__uninstallButton.setEnabled(False)
             self.__cancelButton.setEnabled(True)
-            
+
             self.statusLabel.setText(url)
-            
+
             self.__downloadCancelled = False
-            
+
             request = QNetworkRequest(QUrl(url))
             request.setAttribute(
                 QNetworkRequest.Attribute.CacheLoadControlAttribute,
-                QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+                QNetworkRequest.CacheLoadControl.AlwaysNetwork,
+            )
             reply = WebBrowserWindow.networkManager().get(request)
-            reply.finished.connect(
-                lambda: self.__listFileDownloaded(reply))
+            reply.finished.connect(lambda: self.__listFileDownloaded(reply))
             reply.downloadProgress.connect(self.__downloadProgress)
             self.__replies.append(reply)
         else:
@@ -200,25 +204,26 @@
                 self.tr(
                     """<p>Could not download the dictionaries list"""
                     """ from {0}.</p><p>Error: {1}</p>"""
-                ).format(url, self.tr("No connection to Internet.")))
-    
+                ).format(url, self.tr("No connection to Internet.")),
+            )
+
     def __listFileDownloaded(self, reply):
         """
         Private method called, after the dictionaries list file has been
         downloaded from the Internet.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         self.__refreshButton.setEnabled(True)
         self.__cancelButton.setEnabled(False)
-        
+
         self.downloadProgress.setValue(0)
-        
+
         if reply in self.__replies:
             self.__replies.remove(reply)
         reply.deleteLater()
-        
+
         if reply.error() != QNetworkReply.NetworkError.NoError:
             if not self.__downloadCancelled:
                 EricMessageBox.warning(
@@ -227,18 +232,16 @@
                     self.tr(
                         """<p>Could not download the dictionaries list"""
                         """ from {0}.</p><p>Error: {1}</p>"""
-                    ).format(self.dictionariesUrlEdit.text(),
-                             reply.errorString())
+                    ).format(self.dictionariesUrlEdit.text(), reply.errorString()),
                 )
             self.downloadProgress.setValue(0)
             return
-        
+
         listFileData = reply.readAll()
-        
+
         # extract the dictionaries
-        from EricXML.SpellCheckDictionariesReader import (
-            SpellCheckDictionariesReader
-        )
+        from EricXML.SpellCheckDictionariesReader import SpellCheckDictionariesReader
+
         reader = SpellCheckDictionariesReader(listFileData, self.addEntry)
         reader.readXML()
         url = Preferences.getWebBrowser("SpellCheckDictionariesUrl")
@@ -251,9 +254,9 @@
                     """The URL of the spell check dictionaries has"""
                     """ changed. Select the "Refresh" button to get"""
                     """ the new dictionaries list."""
-                )
+                ),
             )
-        
+
         if self.locationComboBox.count() == 0:
             # no writable locations available
             EricMessageBox.warning(
@@ -263,11 +266,11 @@
                     """<p>None of the dictionary locations is writable by"""
                     """ you. Please download required dictionaries manually"""
                     """ and install them as administrator.</p>"""
-                )
+                ),
             )
-        
+
         self.__checkInstalledDictionaries()
-    
+
     def __downloadCancel(self):
         """
         Private slot to cancel the current download.
@@ -277,11 +280,11 @@
             self.__downloadCancelled = True
             self.__dictionariesToDownload = []
             reply.abort()
-    
+
     def __downloadProgress(self, done, total):
         """
         Private slot to show the download progress.
-        
+
         @param done number of bytes downloaded so far
         @type int
         @param total total bytes to be downloaded
@@ -290,11 +293,11 @@
         if total:
             self.downloadProgress.setMaximum(total)
             self.downloadProgress.setValue(done)
-    
+
     def addEntry(self, short, filename, url, documentationDir, locales):
         """
         Public method to add an entry to the list.
-        
+
         @param short data for the description field
         @type str
         @param filename data for the filename field
@@ -308,20 +311,19 @@
         @type list of str
         """
         itm = QListWidgetItem(
-            self.tr("{0} ({1})").format(short, " ".join(locales)),
-            self.dictionariesList)
+            self.tr("{0} ({1})").format(short, " ".join(locales)), self.dictionariesList
+        )
         itm.setCheckState(Qt.CheckState.Unchecked)
-        
+
         itm.setData(ManageDictionariesDialog.FilenameRole, filename)
         itm.setData(ManageDictionariesDialog.UrlRole, url)
-        itm.setData(ManageDictionariesDialog.DocumentationDirRole,
-                    documentationDir)
+        itm.setData(ManageDictionariesDialog.DocumentationDirRole, documentationDir)
         itm.setData(ManageDictionariesDialog.LocalesRole, locales)
-    
+
     def __checkInstalledDictionaries(self):
         """
         Private method to check all installed dictionaries.
-        
+
         Note: A dictionary is assumed to be installed, if at least one of its
         binary dictionaries (*.bdic) is found in the selected dictionaries
         location.
@@ -333,7 +335,7 @@
                     os.path.join(self.locationComboBox.currentText(), "*.bdic")
                 )
             }
-            
+
             for row in range(self.dictionariesList.count()):
                 itm = self.dictionariesList.item(row)
                 locales = set(itm.data(ManageDictionariesDialog.LocalesRole))
@@ -345,7 +347,7 @@
             for row in range(self.dictionariesList.count()):
                 itm = self.dictionariesList.item(row)
                 itm.setCheckState(Qt.CheckState.Unchecked)
-    
+
     def __installSelected(self):
         """
         Private method to install the selected dictionaries.
@@ -355,16 +357,16 @@
                 itm.data(ManageDictionariesDialog.UrlRole)
                 for itm in self.dictionariesList.selectedItems()
             ]
-            
+
             self.__refreshButton.setEnabled(False)
             self.__installButton.setEnabled(False)
             self.__uninstallButton.setEnabled(False)
             self.__cancelButton.setEnabled(True)
-            
+
             self.__downloadCancelled = False
-            
+
             self.__downloadDictionary()
-    
+
     def __downloadDictionary(self):
         """
         Private slot to download a dictionary.
@@ -373,16 +375,16 @@
             if self.__dictionariesToDownload:
                 url = self.__dictionariesToDownload.pop(0)
                 self.statusLabel.setText(url)
-                
+
                 self.__downloadCancelled = False
-                
+
                 request = QNetworkRequest(QUrl(url))
                 request.setAttribute(
                     QNetworkRequest.Attribute.CacheLoadControlAttribute,
-                    QNetworkRequest.CacheLoadControl.AlwaysNetwork)
+                    QNetworkRequest.CacheLoadControl.AlwaysNetwork,
+                )
                 reply = WebBrowserWindow.networkManager().get(request)
-                reply.finished.connect(
-                    lambda: self.__installDictionary(reply))
+                reply.finished.connect(lambda: self.__installDictionary(reply))
                 reply.downloadProgress.connect(self.__downloadProgress)
                 self.__replies.append(reply)
             else:
@@ -394,21 +396,22 @@
                 self.tr(
                     """<p>Could not download the requested dictionary file"""
                     """ from {0}.</p><p>Error: {1}</p>"""
-                ).format(url, self.tr("No connection to Internet.")))
-            
+                ).format(url, self.tr("No connection to Internet.")),
+            )
+
             self.__installationFinished()
-    
+
     def __installDictionary(self, reply):
         """
         Private slot to install the downloaded dictionary.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         if reply in self.__replies:
             self.__replies.remove(reply)
         reply.deleteLater()
-        
+
         if reply.error() != QNetworkReply.NetworkError.NoError:
             if not self.__downloadCancelled:
                 EricMessageBox.warning(
@@ -417,11 +420,11 @@
                     self.tr(
                         """<p>Could not download the requested dictionary"""
                         """ file from {0}.</p><p>Error: {1}</p>"""
-                    ).format(reply.url(), reply.errorString())
+                    ).format(reply.url(), reply.errorString()),
                 )
             self.downloadProgress.setValue(0)
             return
-        
+
         archiveData = reply.readAll()
         archiveFile = io.BytesIO(bytes(archiveData))
         archive = zipfile.ZipFile(archiveFile, "r")
@@ -431,17 +434,18 @@
                 self.tr("Error downloading dictionary"),
                 self.tr(
                     """<p>The downloaded dictionary archive is invalid."""
-                    """ Skipping it.</p>""")
+                    """ Skipping it.</p>"""
+                ),
             )
         else:
             installDir = self.locationComboBox.currentText()
             archive.extractall(installDir)
-        
+
         if self.__dictionariesToDownload:
             self.__downloadDictionary()
         else:
             self.__installationFinished()
-    
+
     def __installationFinished(self):
         """
         Private method called after all selected dictionaries have been
@@ -449,12 +453,12 @@
         """
         self.__refreshButton.setEnabled(True)
         self.__cancelButton.setEnabled(False)
-        
+
         self.dictionariesList.clearSelection()
         self.downloadProgress.setValue(0)
-        
+
         self.__checkInstalledDictionaries()
-    
+
     def __uninstallSelected(self):
         """
         Private method to uninstall the selected dictionaries.
@@ -462,24 +466,22 @@
         installLocation = self.locationComboBox.currentText()
         if not installLocation:
             return
-        
+
         itemsToDelete = [
             itm
             for itm in self.dictionariesList.selectedItems()
             if itm.checkState() == Qt.CheckState.Checked
         ]
         for itm in itemsToDelete:
-            documentationDir = itm.data(
-                ManageDictionariesDialog.DocumentationDirRole)
-            shutil.rmtree(os.path.join(installLocation, documentationDir),
-                          True)
-            
+            documentationDir = itm.data(ManageDictionariesDialog.DocumentationDirRole)
+            shutil.rmtree(os.path.join(installLocation, documentationDir), True)
+
             locales = itm.data(ManageDictionariesDialog.LocalesRole)
             for locale in locales:
                 bdic = os.path.join(installLocation, locale + ".bdic")
                 with contextlib.suppress(OSError):
                     os.remove(bdic)
-        
+
         self.dictionariesList.clearSelection()
-        
+
         self.__checkInstalledDictionaries()
--- a/src/eric7/WebBrowser/StatusBar/ImagesIcon.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/StatusBar/ImagesIcon.py	Wed Jul 13 14:55:47 2022 +0200
@@ -26,75 +26,83 @@
     """
     Class implementing the images loading status bar icon.
     """
+
     def __init__(self, window):
         """
         Constructor
-        
+
         @param window reference to the web browser window
         @type WebBrowserWindow
         """
         super().__init__(window)
-        
-        self.setToolTip(self.tr("Modify images loading settings temporarily"
-                                " or globally"))
+
+        self.setToolTip(
+            self.tr("Modify images loading settings temporarily" " or globally")
+        )
         self.__icon = UI.PixmapCache.getPixmap("filePixmap").scaled(16, 16)
         self.setPixmap(self.__icon)
-        
+
         self._window.tabWidget().currentChanged.connect(self.__updateIcon)
         self.clicked.connect(self.__showMenu)
-        
+
         self.__updateIcon()
-    
+
     def preferencesChanged(self):
         """
         Public method to handle changes of the settings.
         """
         self.__updateIcon()
-    
+
     @pyqtSlot(QPoint)
     def __showMenu(self, pos):
         """
         Private slot to show the menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
         boldFont = self.font()
         boldFont.setBold(True)
-        
+
         menu = QMenu()
         menu.addAction(self.tr("Current Page Settings")).setFont(boldFont)
-        
+
         if self._testCurrentPageWebAttribute(
-                QWebEngineSettings.WebAttribute.AutoLoadImages):
-            menu.addAction(self.tr("Disable loading images (temporarily)"),
-                           self.__toggleLoadingImages)
+            QWebEngineSettings.WebAttribute.AutoLoadImages
+        ):
+            menu.addAction(
+                self.tr("Disable loading images (temporarily)"),
+                self.__toggleLoadingImages,
+            )
         else:
-            menu.addAction(self.tr("Enable loading images (temporarily)"),
-                           self.__toggleLoadingImages)
-        
+            menu.addAction(
+                self.tr("Enable loading images (temporarily)"),
+                self.__toggleLoadingImages,
+            )
+
         menu.addSeparator()
         menu.addAction(self.tr("Global Settings")).setFont(boldFont)
         act = menu.addAction(self.tr("Automatically load images"))
         act.setCheckable(True)
         act.setChecked(Preferences.getWebBrowser("AutoLoadImages"))
         act.toggled.connect(self.__setGlobalLoadingImages)
-        
+
         menu.exec(pos)
-    
+
     @pyqtSlot()
     def __updateIcon(self):
         """
         Private slot to update the icon.
         """
         if self._testCurrentPageWebAttribute(
-                QWebEngineSettings.WebAttribute.AutoLoadImages):
+            QWebEngineSettings.WebAttribute.AutoLoadImages
+        ):
             self.setGraphicsEffect(None)
         else:
             effect = QGraphicsColorizeEffect(self)
             effect.setColor(Qt.GlobalColor.gray)
             self.setGraphicsEffect(effect)
-    
+
     @pyqtSlot()
     def __toggleLoadingImages(self):
         """
@@ -102,36 +110,40 @@
         """
         if self._currentPage() is None:
             return
-        
+
         current = self._testCurrentPageWebAttribute(
-            QWebEngineSettings.WebAttribute.AutoLoadImages)
+            QWebEngineSettings.WebAttribute.AutoLoadImages
+        )
         self._setCurrentPageWebAttribute(
-            QWebEngineSettings.WebAttribute.AutoLoadImages, not current)
-        
+            QWebEngineSettings.WebAttribute.AutoLoadImages, not current
+        )
+
         if current:
             # reload page upon disabling loading images
             self._window.currentBrowser().reload()
-        
+
         self.__updateIcon()
-    
+
     @pyqtSlot(bool)
     def __setGlobalLoadingImages(self, enable):
         """
         Private slot to toggle the global images loading setting.
-        
+
         @param enable flag indicating the state to set
         @type bool
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         WebBrowserWindow.webSettings().setAttribute(
-            QWebEngineSettings.WebAttribute.AutoLoadImages, enable)
+            QWebEngineSettings.WebAttribute.AutoLoadImages, enable
+        )
         Preferences.setWebBrowser("AutoLoadImages", enable)
-        
+
         Preferences.syncPreferences()
         self._window.preferencesChanged()
-        
+
         self.__updateIcon()
-        
+
         if not enable:
             # reload page upon disabling loading images
             self._window.currentBrowser().reload()
--- a/src/eric7/WebBrowser/StatusBar/JavaScriptIcon.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/StatusBar/JavaScriptIcon.py	Wed Jul 13 14:55:47 2022 +0200
@@ -25,82 +25,89 @@
     """
     Class implementing the JavaScript status bar icon.
     """
+
     def __init__(self, window):
         """
         Constructor
-        
+
         @param window reference to the web browser window
         @type WebBrowserWindow
         """
         super().__init__(window)
-        
-        self.setToolTip(self.tr("Modify JavaScript settings temporarily for"
-                                " a site or globally"))
+
+        self.setToolTip(
+            self.tr("Modify JavaScript settings temporarily for" " a site or globally")
+        )
         self.__icon = UI.PixmapCache.getPixmap("fileJavascript").scaled(16, 16)
         self.setPixmap(self.__icon)
-        
+
         self.__settings = {}
-        
+
         self._window.tabWidget().currentChanged.connect(self.__updateIcon)
         self._window.tabWidget().currentUrlChanged.connect(self.__updateIcon)
         self.clicked.connect(self.__showMenu)
-        
+
         self.__updateIcon()
-    
+
     def preferencesChanged(self):
         """
         Public method to handle changes of the settings.
         """
         self.__updateIcon()
-    
+
     @pyqtSlot(QPoint)
     def __showMenu(self, pos):
         """
         Private slot to show the menu.
-        
+
         @param pos position to show the menu at
         @type QPoint
         """
         boldFont = self.font()
         boldFont.setBold(True)
-        
+
         menu = QMenu()
         menu.addAction(self.tr("Current Page Settings")).setFont(boldFont)
-        
+
         act = (
-            menu.addAction(self.tr("Disable JavaScript (temporarily)"),
-                           self.__toggleJavaScript)
+            menu.addAction(
+                self.tr("Disable JavaScript (temporarily)"), self.__toggleJavaScript
+            )
             if self._testCurrentPageWebAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled) else
-            menu.addAction(self.tr("Enable JavaScript (temporarily)"),
-                           self.__toggleJavaScript)
+                QWebEngineSettings.WebAttribute.JavascriptEnabled
+            )
+            else menu.addAction(
+                self.tr("Enable JavaScript (temporarily)"), self.__toggleJavaScript
+            )
         )
         if (
-            self._currentPage() is not None and
-            self._currentPage().url().scheme() == "eric"
+            self._currentPage() is not None
+            and self._currentPage().url().scheme() == "eric"
         ):
             # JavaScript is needed for eric: scheme
             act.setEnabled(False)
-        
+
         menu.addSeparator()
         menu.addAction(self.tr("Global Settings")).setFont(boldFont)
-        menu.addAction(self.tr("Manage JavaScript Settings"),
-                       self.__showJavaScriptSettingsDialog)
+        menu.addAction(
+            self.tr("Manage JavaScript Settings"), self.__showJavaScriptSettingsDialog
+        )
         menu.exec(pos)
-    
+
     @pyqtSlot()
     def __updateIcon(self):
         """
         Private slot to update the icon.
         """
         if self._testCurrentPageWebAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled):
+            QWebEngineSettings.WebAttribute.JavascriptEnabled
+        ):
             self.setGraphicsEffect(None)
         else:
             effect = QGraphicsColorizeEffect(self)
             effect.setColor(Qt.GlobalColor.gray)
             self.setGraphicsEffect(effect)
-    
+
     @pyqtSlot()
     def __toggleJavaScript(self):
         """
@@ -109,39 +116,42 @@
         page = self._currentPage()
         if page is None:
             return
-        
+
         current = self._testCurrentPageWebAttribute(
-            QWebEngineSettings.WebAttribute.JavascriptEnabled)
+            QWebEngineSettings.WebAttribute.JavascriptEnabled
+        )
         self._setCurrentPageWebAttribute(
-            QWebEngineSettings.WebAttribute.JavascriptEnabled, not current)
-        
+            QWebEngineSettings.WebAttribute.JavascriptEnabled, not current
+        )
+
         self.__settings[page] = not current
         page.navigationRequestAccepted.connect(
-            lambda u, t, mf: self.__navigationRequestAccepted(u, t, mf, page))
-        
+            lambda u, t, mf: self.__navigationRequestAccepted(u, t, mf, page)
+        )
+
         self._window.currentBrowser().reload()
-        
+
         self.__updateIcon()
-    
+
     @pyqtSlot()
     def __showJavaScriptSettingsDialog(self):
         """
         Private slot to show the JavaScript settings dialog.
-        
+
         Note: This is the JavaScript subset of the web browser configuration
         page.
         """
         from .JavaScriptSettingsDialog import JavaScriptSettingsDialog
+
         dlg = JavaScriptSettingsDialog(self._window)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self._window.preferencesChanged()
             QTimer.singleShot(500, self.__updateIcon)
-    
-    def __navigationRequestAccepted(self, url, navigationType, isMainFrame,
-                                    page):
+
+    def __navigationRequestAccepted(self, url, navigationType, isMainFrame, page):
         """
         Private method to handle the navigationRequestAccepted signal.
-        
+
         @param url URL being loaded
         @type QUrl
         @param navigationType type of navigation request
@@ -152,8 +162,8 @@
         @param page reference to the web page
         @type WebBrowserPage
         """
-        enable = (True if url.scheme() in ("eric", "qthelp")
-                  else self.__settings[page])
+        enable = True if url.scheme() in ("eric", "qthelp") else self.__settings[page]
         if isMainFrame:
             page.settings().setAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled, enable)
+                QWebEngineSettings.WebAttribute.JavascriptEnabled, enable
+            )
--- a/src/eric7/WebBrowser/StatusBar/JavaScriptSettingsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/StatusBar/JavaScriptSettingsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,58 +18,58 @@
 class JavaScriptSettingsDialog(QDialog, Ui_JavaScriptSettingsDialog):
     """
     Class implementing the JavaScript settings dialog.
-    
+
     Note: it contains the JavaScript part of the web browser configuration
     dialog.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.javaScriptGroup.setChecked(
-            Preferences.getWebBrowser("JavaScriptEnabled"))
+
+        self.javaScriptGroup.setChecked(Preferences.getWebBrowser("JavaScriptEnabled"))
         self.jsOpenWindowsCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanOpenWindows"))
+            Preferences.getWebBrowser("JavaScriptCanOpenWindows")
+        )
         self.jsActivateWindowsCheckBox.setChecked(
-            Preferences.getWebBrowser(
-                "AllowWindowActivationFromJavaScript"))
+            Preferences.getWebBrowser("AllowWindowActivationFromJavaScript")
+        )
         self.jsClipboardCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"))
-        self.jsPasteCheckBox.setChecked(
-            Preferences.getWebBrowser("JavaScriptCanPaste"))
-        
+            Preferences.getWebBrowser("JavaScriptCanAccessClipboard")
+        )
+        self.jsPasteCheckBox.setChecked(Preferences.getWebBrowser("JavaScriptCanPaste"))
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def accept(self):
         """
         Public slot to accept the dialog.
         """
+        Preferences.setWebBrowser("JavaScriptEnabled", self.javaScriptGroup.isChecked())
         Preferences.setWebBrowser(
-            "JavaScriptEnabled",
-            self.javaScriptGroup.isChecked())
-        Preferences.setWebBrowser(
-            "JavaScriptCanOpenWindows",
-            self.jsOpenWindowsCheckBox.isChecked())
+            "JavaScriptCanOpenWindows", self.jsOpenWindowsCheckBox.isChecked()
+        )
         if self.jsActivateWindowsCheckBox.isEnabled():
             Preferences.setWebBrowser(
                 "AllowWindowActivationFromJavaScript",
-                self.jsActivateWindowsCheckBox.isChecked())
+                self.jsActivateWindowsCheckBox.isChecked(),
+            )
         Preferences.setWebBrowser(
-            "JavaScriptCanAccessClipboard",
-            self.jsClipboardCheckBox.isChecked())
+            "JavaScriptCanAccessClipboard", self.jsClipboardCheckBox.isChecked()
+        )
         if self.jsPasteCheckBox.isEnabled():
             Preferences.setWebBrowser(
-                "JavaScriptCanPaste",
-                self.jsPasteCheckBox.isChecked())
-        
+                "JavaScriptCanPaste", self.jsPasteCheckBox.isChecked()
+            )
+
         Preferences.syncPreferences()
-        
+
         super().accept()
--- a/src/eric7/WebBrowser/StatusBar/StatusBarIcon.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/StatusBar/StatusBarIcon.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,21 +19,22 @@
     """
     Class implementing common methods for all status bar icons.
     """
+
     def __init__(self, window):
         """
         Constructor
-        
+
         @param window reference to the web browser window
         @type WebBrowserWindow
         """
         super().__init__(window)
-        
+
         self._window = window
-    
+
     def _testCurrentPageWebAttribute(self, attr):
         """
         Protected method to test a web attribute on the current page.
-        
+
         @param attr attribute to test
         @type QWebEngineSettings.WebAttribute
         @return flag indicating the attribute is set
@@ -41,11 +42,11 @@
         """
         settings = self._currentPageSettings()
         return settings is not None and settings.testAttribute(attr)
-    
+
     def _setCurrentPageWebAttribute(self, attr, val):
         """
         Protected method to set a web attribute on the current page.
-        
+
         @param attr attribute to sett
         @type QWebEngineSettings.WebAttribute
         @param val value to be set
@@ -54,34 +55,34 @@
         settings = self._currentPageSettings()
         if settings is not None:
             settings.setAttribute(attr, val)
-    
+
     def _currentPageSettings(self):
         """
         Protected method to get a reference to the web settings of the
         current page.
-        
+
         @return reference to the web settings object
         @rtype QWebEngineSettings
         """
         view = self._window.currentBrowser()
         if view is None:
             return None
-        
+
         return view.page().settings()
-    
+
     def _currentPage(self):
         """
         Protected method to get a reference to the current page.
-        
+
         @return reference to the current page
         @rtype WebBrowserPage
         """
         view = self._window.currentBrowser()
         if view is None:
             return None
-        
+
         return view.page()
-    
+
     def preferencesChanged(self):
         """
         Public method to handle changes of the settings.
--- a/src/eric7/WebBrowser/Sync/DirectorySyncHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/DirectorySyncHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,7 +22,7 @@
 class DirectorySyncHandler(SyncHandler):
     """
     Class implementing a synchronization handler using a shared directory.
-    
+
     @signal syncStatus(type_, message) emitted to indicate the synchronization
         status (string one of "bookmarks", "history", "passwords",
         "useragents" or "speeddial", string)
@@ -34,36 +34,37 @@
         synchronization has finished (string one of "bookmarks", "history",
         "passwords", "useragents" or "speeddial", boolean, boolean)
     """
+
     syncStatus = pyqtSignal(str, str)
     syncError = pyqtSignal(str)
     syncMessage = pyqtSignal(str)
     syncFinished = pyqtSignal(str, bool, bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
         self.__forceUpload = False
-        
+
         self.__remoteFilesFound = []
-    
+
     def initialLoadAndCheck(self, forceUpload):
         """
         Public method to do the initial check.
-        
+
         @param forceUpload flag indicating a forced upload of the files
             (boolean)
         """
         if not Preferences.getWebBrowser("SyncEnabled"):
             return
-        
+
         self.__forceUpload = forceUpload
-        
+
         self.__remoteFilesFound = []
-        
+
         # check the existence of the shared directory; create it, if it is
         # not there
         if not os.path.exists(Preferences.getWebBrowser("SyncDirectoryPath")):
@@ -71,16 +72,18 @@
                 os.makedirs(Preferences.getWebBrowser("SyncDirectoryPath"))
             except OSError as err:
                 self.syncError.emit(
-                    self.tr("Error creating the shared directory.\n{0}")
-                    .format(str(err)))
+                    self.tr("Error creating the shared directory.\n{0}").format(
+                        str(err)
+                    )
+                )
                 return
-        
+
         self.__initialSync()
-    
+
     def __downloadFile(self, type_, fileName, timestamp):
         """
         Private method to downlaod the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -91,28 +94,30 @@
         self.syncStatus.emit(type_, self._messages[type_]["RemoteExists"])
         try:
             with open(
-                os.path.join(Preferences.getWebBrowser("SyncDirectoryPath"),
-                             self._remoteFiles[type_]), "rb"
+                os.path.join(
+                    Preferences.getWebBrowser("SyncDirectoryPath"),
+                    self._remoteFiles[type_],
+                ),
+                "rb",
             ) as f:
                 data = f.read()
         except OSError as err:
             self.syncStatus.emit(
-                type_,
-                self.tr("Cannot read remote file.\n{0}").format(str(err)))
+                type_, self.tr("Cannot read remote file.\n{0}").format(str(err))
+            )
             self.syncFinished.emit(type_, False, True)
             return
-        
+
         QCoreApplication.processEvents()
-        ok, error = self.writeFile(QByteArray(data), fileName, type_,
-                                   timestamp)
+        ok, error = self.writeFile(QByteArray(data), fileName, type_, timestamp)
         if not ok:
             self.syncStatus.emit(type_, error)
         self.syncFinished.emit(type_, ok, True)
-    
+
     def __uploadFile(self, type_, fileName):
         """
         Private method to upload the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -129,55 +134,74 @@
                 with open(
                     os.path.join(
                         Preferences.getWebBrowser("SyncDirectoryPath"),
-                        self._remoteFiles[type_]), "wb"
+                        self._remoteFiles[type_],
+                    ),
+                    "wb",
                 ) as f:
                     f.write(bytes(data))
                     f.close()
             except OSError as err:
                 self.syncStatus.emit(
-                    type_,
-                    self.tr("Cannot write remote file.\n{0}").format(
-                        str(err)))
+                    type_, self.tr("Cannot write remote file.\n{0}").format(str(err))
+                )
                 self.syncFinished.emit(type_, False, False)
                 return
-            
+
         self.syncFinished.emit(type_, True, False)
-    
+
     def __initialSyncFile(self, type_, fileName):
         """
         Private method to do the initial synchronization of the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
         @param fileName name of the file to be synchronized (string)
         """
         if (
-            not self.__forceUpload and
-            os.path.exists(os.path.join(
-                Preferences.getWebBrowser("SyncDirectoryPath"),
-                self._remoteFiles[type_])) and
-            pathlib.Path(fileName).stat().st_mtime <= pathlib.Path(
-                os.path.join(Preferences.getWebBrowser("SyncDirectoryPath"),
-                             self._remoteFiles[type_])).stat().st_mtime
+            not self.__forceUpload
+            and os.path.exists(
+                os.path.join(
+                    Preferences.getWebBrowser("SyncDirectoryPath"),
+                    self._remoteFiles[type_],
+                )
+            )
+            and pathlib.Path(fileName).stat().st_mtime
+            <= pathlib.Path(
+                os.path.join(
+                    Preferences.getWebBrowser("SyncDirectoryPath"),
+                    self._remoteFiles[type_],
+                )
+            )
+            .stat()
+            .st_mtime
         ):
             self.__downloadFile(
-                type_, fileName,
-                int(pathlib.Path(os.path.join(
-                    Preferences.getWebBrowser("SyncDirectoryPath"),
-                    self._remoteFiles[type_])).stat().st_mtime)
+                type_,
+                fileName,
+                int(
+                    pathlib.Path(
+                        os.path.join(
+                            Preferences.getWebBrowser("SyncDirectoryPath"),
+                            self._remoteFiles[type_],
+                        )
+                    )
+                    .stat()
+                    .st_mtime
+                ),
             )
         else:
-            if not os.path.exists(os.path.join(
+            if not os.path.exists(
+                os.path.join(
                     Preferences.getWebBrowser("SyncDirectoryPath"),
-                    self._remoteFiles[type_])):
-                self.syncStatus.emit(
-                    type_, self._messages[type_]["RemoteMissing"])
+                    self._remoteFiles[type_],
+                )
+            ):
+                self.syncStatus.emit(type_, self._messages[type_]["RemoteMissing"])
             else:
-                self.syncStatus.emit(
-                    type_, self._messages[type_]["LocalNewer"])
+                self.syncStatus.emit(type_, self._messages[type_]["LocalNewer"])
             self.__uploadFile(type_, fileName)
-    
+
     def __initialSync(self):
         """
         Private slot to do the initial synchronization.
@@ -186,44 +210,44 @@
         # Bookmarks
         if Preferences.getWebBrowser("SyncBookmarks"):
             self.__initialSyncFile(
-                "bookmarks",
-                WebBrowserWindow.bookmarksManager().getFileName())
-        
+                "bookmarks", WebBrowserWindow.bookmarksManager().getFileName()
+            )
+
         QCoreApplication.processEvents()
         # History
         if Preferences.getWebBrowser("SyncHistory"):
             self.__initialSyncFile(
-                "history",
-                WebBrowserWindow.historyManager().getFileName())
-        
+                "history", WebBrowserWindow.historyManager().getFileName()
+            )
+
         QCoreApplication.processEvents()
         # Passwords
         if Preferences.getWebBrowser("SyncPasswords"):
             self.__initialSyncFile(
-                "passwords",
-                WebBrowserWindow.passwordManager().getFileName())
-        
+                "passwords", WebBrowserWindow.passwordManager().getFileName()
+            )
+
         QCoreApplication.processEvents()
         # User Agent Settings
         if Preferences.getWebBrowser("SyncUserAgents"):
             self.__initialSyncFile(
-                "useragents",
-                WebBrowserWindow.userAgentsManager().getFileName())
-        
+                "useragents", WebBrowserWindow.userAgentsManager().getFileName()
+            )
+
         QCoreApplication.processEvents()
         # Speed Dial Settings
         if Preferences.getWebBrowser("SyncSpeedDial"):
             self.__initialSyncFile(
-                "speeddial",
-                WebBrowserWindow.speedDial().getFileName())
-        
+                "speeddial", WebBrowserWindow.speedDial().getFileName()
+            )
+
         self.__forceUpload = False
         self.syncMessage.emit(self.tr("Synchronization finished"))
-    
+
     def __syncFile(self, type_, fileName):
         """
         Private method to synchronize the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -231,47 +255,39 @@
         """
         self.syncStatus.emit(type_, self._messages[type_]["Uploading"])
         self.__uploadFile(type_, fileName)
-    
+
     def syncBookmarks(self):
         """
         Public method to synchronize the bookmarks.
         """
-        self.__syncFile(
-            "bookmarks",
-            WebBrowserWindow.bookmarksManager().getFileName())
-    
+        self.__syncFile("bookmarks", WebBrowserWindow.bookmarksManager().getFileName())
+
     def syncHistory(self):
         """
         Public method to synchronize the history.
         """
-        self.__syncFile(
-            "history",
-            WebBrowserWindow.historyManager().getFileName())
-    
+        self.__syncFile("history", WebBrowserWindow.historyManager().getFileName())
+
     def syncPasswords(self):
         """
         Public method to synchronize the passwords.
         """
-        self.__syncFile(
-            "passwords",
-            WebBrowserWindow.passwordManager().getFileName())
-    
+        self.__syncFile("passwords", WebBrowserWindow.passwordManager().getFileName())
+
     def syncUserAgents(self):
         """
         Public method to synchronize the user agents.
         """
         self.__syncFile(
-            "useragents",
-            WebBrowserWindow.userAgentsManager().getFileName())
-    
+            "useragents", WebBrowserWindow.userAgentsManager().getFileName()
+        )
+
     def syncSpeedDial(self):
         """
         Public method to synchronize the speed dial data.
         """
-        self.__syncFile(
-            "speeddial",
-            WebBrowserWindow.speedDial().getFileName())
-    
+        self.__syncFile("speeddial", WebBrowserWindow.speedDial().getFileName())
+
     def shutdown(self):
         """
         Public method to shut down the handler.
--- a/src/eric7/WebBrowser/Sync/FtpSyncHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/FtpSyncHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -7,7 +7,7 @@
 Module implementing a synchronization handler using FTP.
 """
 
-import ftplib           # secok
+import ftplib  # secok
 import io
 import contextlib
 import pathlib
@@ -28,7 +28,7 @@
 class FtpSyncHandler(SyncHandler):
     """
     Class implementing a synchronization handler using FTP.
-    
+
     @signal syncStatus(type_, message) emitted to indicate the synchronization
         status (string one of "bookmarks", "history", "passwords",
         "useragents" or "speeddial", string)
@@ -40,67 +40,71 @@
         synchronization has finished (string one of "bookmarks", "history",
         "passwords", "useragents" or "speeddial", boolean, boolean)
     """
+
     syncStatus = pyqtSignal(str, str)
     syncError = pyqtSignal(str)
     syncMessage = pyqtSignal(str)
     syncFinished = pyqtSignal(str, bool, bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__state = "idle"
         self.__forceUpload = False
         self.__connected = False
-        
+
         self.__remoteFilesFound = {}
-    
+
     def initialLoadAndCheck(self, forceUpload):
         """
         Public method to do the initial check.
-        
+
         @param forceUpload flag indicating a forced upload of the files
             (boolean)
         """
         if not Preferences.getWebBrowser("SyncEnabled"):
             return
-        
+
         self.__state = "initializing"
         self.__forceUpload = forceUpload
-        
+
         self.__dirLineParser = FtpDirLineParser()
         self.__remoteFilesFound = {}
-        
+
         self.__idleTimer = QTimer(self)
         self.__idleTimer.setInterval(
-            Preferences.getWebBrowser("SyncFtpIdleTimeout") * 1000)
+            Preferences.getWebBrowser("SyncFtpIdleTimeout") * 1000
+        )
         self.__idleTimer.timeout.connect(self.__idleTimeout)
-        
+
         self.__ftp = EricFtp()
-        
+
         # do proxy setup
         proxyType = (
             EricFtpProxyType.NO_PROXY
-            if not Preferences.getUI("UseProxy") else
-            Preferences.getUI("ProxyType/Ftp")
+            if not Preferences.getUI("UseProxy")
+            else Preferences.getUI("ProxyType/Ftp")
         )
         if proxyType != EricFtpProxyType.NO_PROXY:
             self.__ftp.setProxy(
                 proxyType,
                 Preferences.getUI("ProxyHost/Ftp"),
-                Preferences.getUI("ProxyPort/Ftp"))
+                Preferences.getUI("ProxyPort/Ftp"),
+            )
             if proxyType != EricFtpProxyType.NON_AUTHORIZING:
                 self.__ftp.setProxyAuthentication(
                     Preferences.getUI("ProxyUser/Ftp"),
                     Preferences.getUI("ProxyPassword/Ftp"),
-                    Preferences.getUI("ProxyAccount/Ftp"))
-        
+                    Preferences.getUI("ProxyAccount/Ftp"),
+                )
+
         QTimer.singleShot(0, self.__doFtpCommands)
-    
+
     def __doFtpCommands(self):
         """
         Private slot executing the sequence of FTP commands.
@@ -115,33 +119,36 @@
                 self.__idleTimer.start()
         except (ftplib.all_errors + (EricFtpProxyError,)) as err:
             self.syncError.emit(str(err))
-    
+
     def __connectAndLogin(self):
         """
         Private method to connect to the FTP server and log in.
-        
+
         @return flag indicating a successful log in (boolean)
         """
         self.__ftp.connect(
             Preferences.getWebBrowser("SyncFtpServer"),
             Preferences.getWebBrowser("SyncFtpPort"),
-            timeout=5)
+            timeout=5,
+        )
         self.__ftp.login(
             Preferences.getWebBrowser("SyncFtpUser"),
-            Preferences.getWebBrowser("SyncFtpPassword"))
+            Preferences.getWebBrowser("SyncFtpPassword"),
+        )
         self.__connected = True
         return True
-    
+
     def __changeToStore(self):
         """
         Private slot to change to the storage directory.
-        
+
         This action will create the storage path on the server, if it
         does not exist. Upon return, the current directory of the server
         is the sync directory.
         """
-        storePathList = Preferences.getWebBrowser("SyncFtpPath").replace(
-            "\\", "/").split("/")
+        storePathList = (
+            Preferences.getWebBrowser("SyncFtpPath").replace("\\", "/").split("/")
+        )
         if storePathList[0] == "":
             storePathList.pop(0)
         while storePathList:
@@ -157,11 +164,11 @@
                 else:
                     raise
             storePathList.pop(0)
-    
+
     def __dirListCallback(self, line):
         """
         Private slot handling the receipt of directory listing lines.
-        
+
         @param line the received line of the directory listing (string)
         """
         try:
@@ -169,21 +176,21 @@
         except FtpDirLineParserError:
             # silently ignore parser errors
             urlInfo = None
-        
+
         if (
-            urlInfo and
-            urlInfo.isValid() and
-            urlInfo.isFile() and
-            urlInfo.name() in self._remoteFiles.values()
+            urlInfo
+            and urlInfo.isValid()
+            and urlInfo.isFile()
+            and urlInfo.name() in self._remoteFiles.values()
         ):
             self.__remoteFilesFound[urlInfo.name()] = urlInfo.lastModified()
-        
+
         QCoreApplication.processEvents()
-    
+
     def __downloadFile(self, type_, fileName, timestamp):
         """
         Private method to downlaod the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -196,20 +203,22 @@
         try:
             self.__ftp.retrbinary(
                 "RETR {0}".format(self._remoteFiles[type_]),
-                lambda x: self.__downloadFileCallback(buffer, x))
+                lambda x: self.__downloadFileCallback(buffer, x),
+            )
             ok, error = self.writeFile(
-                QByteArray(buffer.getvalue()), fileName, type_, timestamp)
+                QByteArray(buffer.getvalue()), fileName, type_, timestamp
+            )
             if not ok:
                 self.syncStatus.emit(type_, error)
             self.syncFinished.emit(type_, ok, True)
         except ftplib.all_errors as err:
             self.syncStatus.emit(type_, str(err))
             self.syncFinished.emit(type_, False, True)
-    
+
     def __downloadFileCallback(self, buffer, data):
         """
         Private method receiving the downloaded data.
-        
+
         @param buffer reference to the buffer (io.BytesIO)
         @param data byte string to store in the buffer (bytes)
         @return number of bytes written to the buffer (integer)
@@ -217,11 +226,11 @@
         res = buffer.write(data)
         QCoreApplication.processEvents()
         return res
-    
+
     def __uploadFile(self, type_, fileName):
         """
         Private method to upload the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -239,50 +248,48 @@
                 self.__ftp.storbinary(
                     "STOR {0}".format(self._remoteFiles[type_]),
                     buffer,
-                    callback=lambda x: QCoreApplication.processEvents())
+                    callback=lambda x: QCoreApplication.processEvents(),
+                )
                 self.syncFinished.emit(type_, True, False)
                 res = True
             except ftplib.all_errors as err:
                 self.syncStatus.emit(type_, str(err))
                 self.syncFinished.emit(type_, False, False)
         return res
-    
+
     def __initialSyncFile(self, type_, fileName):
         """
         Private method to do the initial synchronization of the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
         @param fileName name of the file to be synchronized (string)
         """
         if (
-            not self.__forceUpload and
-            self._remoteFiles[type_] in self.__remoteFilesFound
+            not self.__forceUpload
+            and self._remoteFiles[type_] in self.__remoteFilesFound
         ):
             if (
-                not pathlib.Path(fileName).exists() or
-                pathlib.Path(fileName).stat().st_mtime <
-                self.__remoteFilesFound[
-                    self._remoteFiles[type_].toSecsSinceEpoch()]
+                not pathlib.Path(fileName).exists()
+                or pathlib.Path(fileName).stat().st_mtime
+                < self.__remoteFilesFound[self._remoteFiles[type_].toSecsSinceEpoch()]
             ):
                 self.__downloadFile(
-                    type_, fileName,
-                    self.__remoteFilesFound[self._remoteFiles[type_]]
-                        .toTime_t())
+                    type_,
+                    fileName,
+                    self.__remoteFilesFound[self._remoteFiles[type_]].toTime_t(),
+                )
             else:
-                self.syncStatus.emit(
-                    type_, self.tr("No synchronization required."))
+                self.syncStatus.emit(type_, self.tr("No synchronization required."))
                 self.syncFinished.emit(type_, True, True)
         else:
             if self._remoteFiles[type_] not in self.__remoteFilesFound:
-                self.syncStatus.emit(
-                    type_, self._messages[type_]["RemoteMissing"])
+                self.syncStatus.emit(type_, self._messages[type_]["RemoteMissing"])
             else:
-                self.syncStatus.emit(
-                    type_, self._messages[type_]["LocalNewer"])
+                self.syncStatus.emit(type_, self._messages[type_]["LocalNewer"])
             self.__uploadFile(type_, fileName)
-    
+
     def __initialSync(self):
         """
         Private slot to do the initial synchronization.
@@ -290,39 +297,39 @@
         # Bookmarks
         if Preferences.getWebBrowser("SyncBookmarks"):
             self.__initialSyncFile(
-                "bookmarks",
-                WebBrowserWindow.bookmarksManager().getFileName())
-        
+                "bookmarks", WebBrowserWindow.bookmarksManager().getFileName()
+            )
+
         # History
         if Preferences.getWebBrowser("SyncHistory"):
             self.__initialSyncFile(
-                "history",
-                WebBrowserWindow.historyManager().getFileName())
-        
+                "history", WebBrowserWindow.historyManager().getFileName()
+            )
+
         # Passwords
         if Preferences.getWebBrowser("SyncPasswords"):
             self.__initialSyncFile(
-                "passwords",
-                WebBrowserWindow.passwordManager().getFileName())
-        
+                "passwords", WebBrowserWindow.passwordManager().getFileName()
+            )
+
         # User Agent Settings
         if Preferences.getWebBrowser("SyncUserAgents"):
             self.__initialSyncFile(
-                "useragents",
-                WebBrowserWindow.userAgentsManager().getFileName())
-        
+                "useragents", WebBrowserWindow.userAgentsManager().getFileName()
+            )
+
         # Speed Dial Settings
         if Preferences.getWebBrowser("SyncSpeedDial"):
             self.__initialSyncFile(
-                "speeddial",
-                WebBrowserWindow.speedDial().getFileName())
-        
+                "speeddial", WebBrowserWindow.speedDial().getFileName()
+            )
+
         self.__forceUpload = False
-    
+
     def __syncFile(self, type_, fileName):
         """
         Private method to synchronize the given file.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -330,77 +337,67 @@
         """
         if self.__state == "initializing":
             return
-        
+
         # use idle timeout to check, if we are still connected
         if self.__connected:
             self.__idleTimeout()
         if not self.__connected or self.__ftp.sock is None:
             ok = self.__connectAndLogin()
             if not ok:
-                self.syncStatus.emit(
-                    type_, self.tr("Cannot log in to FTP host."))
+                self.syncStatus.emit(type_, self.tr("Cannot log in to FTP host."))
                 return
-        
+
         # upload the changed file
         self.__state = "uploading"
         self.syncStatus.emit(type_, self._messages[type_]["Uploading"])
         if self.__uploadFile(type_, fileName):
-            self.syncStatus.emit(
-                type_, self.tr("Synchronization finished."))
+            self.syncStatus.emit(type_, self.tr("Synchronization finished."))
         self.__state = "idle"
-    
+
     def syncBookmarks(self):
         """
         Public method to synchronize the bookmarks.
         """
-        self.__syncFile(
-            "bookmarks",
-            WebBrowserWindow.bookmarksManager().getFileName())
-    
+        self.__syncFile("bookmarks", WebBrowserWindow.bookmarksManager().getFileName())
+
     def syncHistory(self):
         """
         Public method to synchronize the history.
         """
-        self.__syncFile(
-            "history",
-            WebBrowserWindow.historyManager().getFileName())
-    
+        self.__syncFile("history", WebBrowserWindow.historyManager().getFileName())
+
     def syncPasswords(self):
         """
         Public method to synchronize the passwords.
         """
-        self.__syncFile(
-            "passwords",
-            WebBrowserWindow.passwordManager().getFileName())
-    
+        self.__syncFile("passwords", WebBrowserWindow.passwordManager().getFileName())
+
     def syncUserAgents(self):
         """
         Public method to synchronize the user agents.
         """
         self.__syncFile(
-            "useragents",
-            WebBrowserWindow.userAgentsManager().getFileName())
-    
+            "useragents", WebBrowserWindow.userAgentsManager().getFileName()
+        )
+
     def syncSpeedDial(self):
         """
         Public method to synchronize the speed dial data.
         """
-        self.__syncFile(
-            "speeddial",
-            WebBrowserWindow.speedDial().getFileName())
-    
+        self.__syncFile("speeddial", WebBrowserWindow.speedDial().getFileName())
+
     def shutdown(self):
         """
         Public method to shut down the handler.
         """
         if self.__idleTimer.isActive():
             self.__idleTimer.stop()
-        
+
         with contextlib.suppress(ftplib.all_errors):
             if self.__connected:
                 self.__ftp.quit()
         self.__connected = False
-    
+
     def __idleTimeout(self):
         """
         Private slot to prevent a disconnect from the server.
--- a/src/eric7/WebBrowser/Sync/SyncAssistantDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncAssistantDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,14 +17,15 @@
     """
     Class implementing a wizard dialog to enter the synchronization data.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         from . import SyncGlobals
 
         from .SyncDataPage import SyncDataPage
@@ -38,19 +39,21 @@
         self.setPage(SyncGlobals.PageEncryption, SyncEncryptionPage(self))
         self.setPage(SyncGlobals.PageType, SyncHostTypePage(self))
         self.setPage(SyncGlobals.PageFTPSettings, SyncFtpSettingsPage(self))
-        self.setPage(SyncGlobals.PageDirectorySettings,
-                     SyncDirectorySettingsPage(self))
+        self.setPage(SyncGlobals.PageDirectorySettings, SyncDirectorySettingsPage(self))
         self.setPage(SyncGlobals.PageCheck, SyncCheckPage(self))
-        
-        self.setPixmap(QWizard.WizardPixmap.LogoPixmap,
-                       UI.PixmapCache.getPixmap("ericWeb48"))
-        self.setPixmap(QWizard.WizardPixmap.WatermarkPixmap,
-                       UI.PixmapCache.getPixmap("eric256"))
-        self.setPixmap(QWizard.WizardPixmap.BackgroundPixmap,
-                       UI.PixmapCache.getPixmap("eric256"))
-        
+
+        self.setPixmap(
+            QWizard.WizardPixmap.LogoPixmap, UI.PixmapCache.getPixmap("ericWeb48")
+        )
+        self.setPixmap(
+            QWizard.WizardPixmap.WatermarkPixmap, UI.PixmapCache.getPixmap("eric256")
+        )
+        self.setPixmap(
+            QWizard.WizardPixmap.BackgroundPixmap, UI.PixmapCache.getPixmap("eric256")
+        )
+
         self.setMinimumSize(650, 450)
         if Globals.isWindowsPlatform():
             self.setWizardStyle(QWizard.WizardStyle.ModernStyle)
-        
+
         self.setOption(QWizard.WizardOption.NoCancelButtonOnLastPage, True)
--- a/src/eric7/WebBrowser/Sync/SyncCheckPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncCheckPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,105 +22,93 @@
     """
     Class implementing the synchronization status wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-    
+
     def initializePage(self):
         """
         Public method to initialize the page.
         """
         self.syncErrorLabel.hide()
-        
+
         forceUpload = self.field("ReencryptData")
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         syncMgr = WebBrowserWindow.syncManager()
         syncMgr.syncError.connect(self.__syncError)
         syncMgr.syncStatus.connect(self.__updateMessages)
         syncMgr.syncFinished.connect(self.__updateLabels)
-        
+
         if Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeFtp:
             self.handlerLabel.setText(self.tr("FTP"))
             self.infoLabel.setText(self.tr("Host:"))
-            self.infoDataLabel.setText(
-                Preferences.getWebBrowser("SyncFtpServer"))
-        elif (
-            Preferences.getWebBrowser("SyncType") ==
-                SyncGlobals.SyncTypeDirectory
-        ):
+            self.infoDataLabel.setText(Preferences.getWebBrowser("SyncFtpServer"))
+        elif Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeDirectory:
             self.handlerLabel.setText(self.tr("Shared Directory"))
             self.infoLabel.setText(self.tr("Directory:"))
-            self.infoDataLabel.setText(
-                Preferences.getWebBrowser("SyncDirectoryPath"))
+            self.infoDataLabel.setText(Preferences.getWebBrowser("SyncDirectoryPath"))
         else:
             self.handlerLabel.setText(self.tr("No Synchronization"))
             self.hostLabel.setText("")
-        
+
         self.bookmarkMsgLabel.setText("")
         self.historyMsgLabel.setText("")
         self.passwordsMsgLabel.setText("")
         self.userAgentsMsgLabel.setText("")
         self.speedDialMsgLabel.setText("")
-        
+
         if not syncMgr.syncEnabled():
-            self.bookmarkLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
+            self.bookmarkLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
             self.historyLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
-            self.passwordsLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-            self.userAgentsLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-            self.speedDialLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
+            self.passwordsLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+            self.userAgentsLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+            self.speedDialLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
             return
-        
+
         # bookmarks
         if Preferences.getWebBrowser("SyncBookmarks"):
             self.__makeAnimatedLabel("loadingAnimation", self.bookmarkLabel)
         else:
-            self.bookmarkLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-        
+            self.bookmarkLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+
         # history
         if Preferences.getWebBrowser("SyncHistory"):
             self.__makeAnimatedLabel("loadingAnimation", self.historyLabel)
         else:
             self.historyLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
-        
+
         # Passwords
         if Preferences.getWebBrowser("SyncPasswords"):
             self.__makeAnimatedLabel("loadingAnimation", self.passwordsLabel)
         else:
-            self.passwordsLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-        
+            self.passwordsLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+
         # user agent settings
         if Preferences.getWebBrowser("SyncUserAgents"):
             self.__makeAnimatedLabel("loadingAnimation", self.userAgentsLabel)
         else:
-            self.userAgentsLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-        
+            self.userAgentsLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+
         # speed dial settings
         if Preferences.getWebBrowser("SyncSpeedDial"):
             self.__makeAnimatedLabel("loadingAnimation", self.speedDialLabel)
         else:
-            self.speedDialLabel.setPixmap(
-                UI.PixmapCache.getPixmap("syncNo"))
-        
-        QTimer.singleShot(
-            0, lambda: syncMgr.loadSettings(forceUpload=forceUpload))
-    
+            self.speedDialLabel.setPixmap(UI.PixmapCache.getPixmap("syncNo"))
+
+        QTimer.singleShot(0, lambda: syncMgr.loadSettings(forceUpload=forceUpload))
+
     def __makeAnimatedLabel(self, fileName, label):
         """
         Private slot to create an animated label.
-        
+
         @param fileName name of the file containing the animation
         @type str
         @param label reference to the label to be animated
@@ -129,11 +117,11 @@
         label.setInterval(40)
         label.setAnimationFile(fileName)
         label.start()
-    
+
     def __updateMessages(self, type_, msg):
         """
         Private slot to update the synchronization status info.
-        
+
         @param type_ type of synchronization data (string)
         @param msg synchronization message (string)
         """
@@ -147,11 +135,11 @@
             self.userAgentsMsgLabel.setText(msg)
         elif type_ == "speeddial":
             self.speedDialMsgLabel.setText(msg)
-    
+
     def __updateLabels(self, type_, status, download):
         """
         Private slot to handle a finished synchronization event.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -160,46 +148,39 @@
         """
         if type_ == "bookmarks":
             if status:
-                self.bookmarkLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncCompleted"))
+                self.bookmarkLabel.setPixmap(UI.PixmapCache.getPixmap("syncCompleted"))
             else:
-                self.bookmarkLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncFailed"))
+                self.bookmarkLabel.setPixmap(UI.PixmapCache.getPixmap("syncFailed"))
         elif type_ == "history":
             if status:
-                self.historyLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncCompleted"))
+                self.historyLabel.setPixmap(UI.PixmapCache.getPixmap("syncCompleted"))
             else:
-                self.historyLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncFailed"))
+                self.historyLabel.setPixmap(UI.PixmapCache.getPixmap("syncFailed"))
         elif type_ == "passwords":
             if status:
-                self.passwordsLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncCompleted"))
+                self.passwordsLabel.setPixmap(UI.PixmapCache.getPixmap("syncCompleted"))
             else:
-                self.passwordsLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncFailed"))
+                self.passwordsLabel.setPixmap(UI.PixmapCache.getPixmap("syncFailed"))
         elif type_ == "useragents":
             if status:
                 self.userAgentsLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncCompleted"))
+                    UI.PixmapCache.getPixmap("syncCompleted")
+                )
             else:
-                self.userAgentsLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncFailed"))
+                self.userAgentsLabel.setPixmap(UI.PixmapCache.getPixmap("syncFailed"))
         elif type_ == "speeddial":
             if status:
-                self.speedDialLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncCompleted"))
+                self.speedDialLabel.setPixmap(UI.PixmapCache.getPixmap("syncCompleted"))
             else:
-                self.speedDialLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("syncFailed"))
-    
+                self.speedDialLabel.setPixmap(UI.PixmapCache.getPixmap("syncFailed"))
+
     def __syncError(self, message):
         """
         Private slot to handle general synchronization issues.
-        
+
         @param message error message (string)
         """
         self.syncErrorLabel.show()
-        self.syncErrorLabel.setText(self.tr(
-            '<font color="#FF0000"><b>Error:</b> {0}</font>').format(message))
+        self.syncErrorLabel.setText(
+            self.tr('<font color="#FF0000"><b>Error:</b> {0}</font>').format(message)
+        )
--- a/src/eric7/WebBrowser/Sync/SyncDataPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncDataPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,51 +18,41 @@
     """
     Class implementing the synchronization data wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.bookmarksCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncBookmarks"))
-        self.historyCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncHistory"))
-        self.passwordsCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncPasswords"))
-        self.userAgentsCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncUserAgents"))
-        self.speedDialCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncSpeedDial"))
-        
-        self.activeCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncEnabled"))
-    
+
+        self.bookmarksCheckBox.setChecked(Preferences.getWebBrowser("SyncBookmarks"))
+        self.historyCheckBox.setChecked(Preferences.getWebBrowser("SyncHistory"))
+        self.passwordsCheckBox.setChecked(Preferences.getWebBrowser("SyncPasswords"))
+        self.userAgentsCheckBox.setChecked(Preferences.getWebBrowser("SyncUserAgents"))
+        self.speedDialCheckBox.setChecked(Preferences.getWebBrowser("SyncSpeedDial"))
+
+        self.activeCheckBox.setChecked(Preferences.getWebBrowser("SyncEnabled"))
+
     def nextId(self):
         """
         Public method returning the ID of the next wizard page.
-        
+
         @return next wizard page ID (integer)
         """
         # save the settings
-        Preferences.setWebBrowser(
-            "SyncEnabled", self.activeCheckBox.isChecked())
-        
-        Preferences.setWebBrowser(
-            "SyncBookmarks", self.bookmarksCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SyncHistory", self.historyCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SyncPasswords", self.passwordsCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SyncUserAgents", self.userAgentsCheckBox.isChecked())
-        Preferences.setWebBrowser(
-            "SyncSpeedDial", self.speedDialCheckBox.isChecked())
-        
+        Preferences.setWebBrowser("SyncEnabled", self.activeCheckBox.isChecked())
+
+        Preferences.setWebBrowser("SyncBookmarks", self.bookmarksCheckBox.isChecked())
+        Preferences.setWebBrowser("SyncHistory", self.historyCheckBox.isChecked())
+        Preferences.setWebBrowser("SyncPasswords", self.passwordsCheckBox.isChecked())
+        Preferences.setWebBrowser("SyncUserAgents", self.userAgentsCheckBox.isChecked())
+        Preferences.setWebBrowser("SyncSpeedDial", self.speedDialCheckBox.isChecked())
+
         from . import SyncGlobals
+
         if self.activeCheckBox.isChecked():
             return SyncGlobals.PageEncryption
         else:
--- a/src/eric7/WebBrowser/Sync/SyncDirectorySettingsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncDirectorySettingsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,38 +20,38 @@
     """
     Class implementing the shared directory host settings wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.directoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
-        self.directoryPicker.setText(
-            Preferences.getWebBrowser("SyncDirectoryPath"))
-        
+        self.directoryPicker.setText(Preferences.getWebBrowser("SyncDirectoryPath"))
+
         self.directoryPicker.textChanged.connect(self.completeChanged)
-    
+
     def nextId(self):
         """
         Public method returning the ID of the next wizard page.
-        
+
         @return next wizard page ID (integer)
         """
         # save the settings
-        Preferences.setWebBrowser(
-            "SyncDirectoryPath", self.directoryPicker.text())
-        
+        Preferences.setWebBrowser("SyncDirectoryPath", self.directoryPicker.text())
+
         from . import SyncGlobals
+
         return SyncGlobals.PageCheck
-    
+
     def isComplete(self):
         """
         Public method to check the completeness of the page.
-        
+
         @return flag indicating completeness (boolean)
         """
         return self.directoryPicker.text() != ""
--- a/src/eric7/WebBrowser/Sync/SyncEncryptionPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncEncryptionPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,54 +19,60 @@
     """
     Class implementing encryption settings wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.keySizeComboBox.addItem(self.tr("128 Bits"), 16)
         self.keySizeComboBox.addItem(self.tr("192 Bits"), 24)
         self.keySizeComboBox.addItem(self.tr("256 Bits"), 32)
-        
+
         self.registerField("ReencryptData", self.reencryptCheckBox)
-        
-        self.encryptionGroupBox.setChecked(
-            Preferences.getWebBrowser("SyncEncryptData"))
-        self.encryptionKeyEdit.setText(
-            Preferences.getWebBrowser("SyncEncryptionKey"))
+
+        self.encryptionGroupBox.setChecked(Preferences.getWebBrowser("SyncEncryptData"))
+        self.encryptionKeyEdit.setText(Preferences.getWebBrowser("SyncEncryptionKey"))
         self.encryptionKeyAgainEdit.setEnabled(False)
-        self.keySizeComboBox.setCurrentIndex(self.keySizeComboBox.findData(
-            Preferences.getWebBrowser("SyncEncryptionKeyLength")))
+        self.keySizeComboBox.setCurrentIndex(
+            self.keySizeComboBox.findData(
+                Preferences.getWebBrowser("SyncEncryptionKeyLength")
+            )
+        )
         self.loginsOnlyCheckBox.setChecked(
-            Preferences.getWebBrowser("SyncEncryptPasswordsOnly"))
-    
+            Preferences.getWebBrowser("SyncEncryptPasswordsOnly")
+        )
+
     def nextId(self):
         """
         Public method returning the ID of the next wizard page.
-        
+
         @return next wizard page ID (integer)
         """
         Preferences.setWebBrowser(
-            "SyncEncryptData", self.encryptionGroupBox.isChecked())
+            "SyncEncryptData", self.encryptionGroupBox.isChecked()
+        )
+        Preferences.setWebBrowser("SyncEncryptionKey", self.encryptionKeyEdit.text())
         Preferences.setWebBrowser(
-            "SyncEncryptionKey", self.encryptionKeyEdit.text())
+            "SyncEncryptionKeyLength",
+            self.keySizeComboBox.itemData(self.keySizeComboBox.currentIndex()),
+        )
         Preferences.setWebBrowser(
-            "SyncEncryptionKeyLength", self.keySizeComboBox.itemData(
-                self.keySizeComboBox.currentIndex()))
-        Preferences.setWebBrowser(
-            "SyncEncryptPasswordsOnly", self.loginsOnlyCheckBox.isChecked())
-        
+            "SyncEncryptPasswordsOnly", self.loginsOnlyCheckBox.isChecked()
+        )
+
         from . import SyncGlobals
+
         return SyncGlobals.PageType
-    
+
     def isComplete(self):
         """
         Public method to check the completeness of the page.
-        
+
         @return flag indicating completeness (boolean)
         """
         if self.encryptionGroupBox.isChecked():
@@ -74,74 +80,74 @@
                 complete = False
             else:
                 if self.reencryptCheckBox.isChecked():
-                    complete = (self.encryptionKeyEdit.text() ==
-                                self.encryptionKeyAgainEdit.text())
+                    complete = (
+                        self.encryptionKeyEdit.text()
+                        == self.encryptionKeyAgainEdit.text()
+                    )
                 else:
                     complete = True
         else:
             complete = True
-        
+
         return complete
-    
+
     def __updateUI(self):
         """
         Private slot to update the variable parts of the UI.
         """
         error = ""
-        
+
         if self.encryptionGroupBox.isChecked():
-            self.encryptionKeyAgainEdit.setEnabled(
-                self.reencryptCheckBox.isChecked())
-            
+            self.encryptionKeyAgainEdit.setEnabled(self.reencryptCheckBox.isChecked())
+
             if self.encryptionKeyEdit.text() == "":
-                error = error or self.tr(
-                    "Encryption key must not be empty.")
-            
+                error = error or self.tr("Encryption key must not be empty.")
+
             if (
-                self.encryptionKeyEdit.text() != "" and
-                self.reencryptCheckBox.isChecked() and
-                (self.encryptionKeyEdit.text() !=
-                 self.encryptionKeyAgainEdit.text())
+                self.encryptionKeyEdit.text() != ""
+                and self.reencryptCheckBox.isChecked()
+                and (
+                    self.encryptionKeyEdit.text() != self.encryptionKeyAgainEdit.text()
+                )
             ):
-                error = error or self.tr(
-                    "Repeated encryption key is wrong.")
-        
+                error = error or self.tr("Repeated encryption key is wrong.")
+
         self.errorLabel.setText(error)
         self.completeChanged.emit()
-    
+
     @pyqtSlot(str)
     def on_encryptionKeyEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the encryption key.
-        
+
         @param txt content of the edit widget (string)
         """
         self.passwordMeter.checkPasswordStrength(txt)
         self.__updateUI()
-    
+
     @pyqtSlot(str)
     def on_encryptionKeyAgainEdit_textChanged(self, txt):
         """
         Private slot to handle changes of the encryption key repetition.
-        
+
         @param txt content of the edit widget (string)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(bool)
     def on_encryptionGroupBox_toggled(self, on):
         """
         Private slot to handle changes of the encryption selection.
-        
+
         @param on state of the group box (boolean)
         """
         self.__updateUI()
-    
+
     @pyqtSlot(bool)
     def on_reencryptCheckBox_toggled(self, on):
         """
         Private slot to handle changes of the re-encryption selection.
-        
+
         @param on state of the check box (boolean)
         """
         self.__updateUI()
--- a/src/eric7/WebBrowser/Sync/SyncFtpSettingsPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncFtpSettingsPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,32 +18,32 @@
     """
     Class implementing the synchronization FTP host settings wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.serverEdit.setText(Preferences.getWebBrowser("SyncFtpServer"))
         self.userNameEdit.setText(Preferences.getWebBrowser("SyncFtpUser"))
         self.passwordEdit.setText(Preferences.getWebBrowser("SyncFtpPassword"))
         self.pathEdit.setText(Preferences.getWebBrowser("SyncFtpPath"))
         self.portSpinBox.setValue(Preferences.getWebBrowser("SyncFtpPort"))
-        self.idleSpinBox.setValue(
-            Preferences.getWebBrowser("SyncFtpIdleTimeout"))
-        
+        self.idleSpinBox.setValue(Preferences.getWebBrowser("SyncFtpIdleTimeout"))
+
         self.serverEdit.textChanged.connect(self.completeChanged)
         self.userNameEdit.textChanged.connect(self.completeChanged)
         self.passwordEdit.textChanged.connect(self.completeChanged)
         self.pathEdit.textChanged.connect(self.completeChanged)
-    
+
     def nextId(self):
         """
         Public method returning the ID of the next wizard page.
-        
+
         @return next wizard page ID (integer)
         """
         # save the settings
@@ -52,21 +52,21 @@
         Preferences.setWebBrowser("SyncFtpPassword", self.passwordEdit.text())
         Preferences.setWebBrowser("SyncFtpPath", self.pathEdit.text())
         Preferences.setWebBrowser("SyncFtpPort", self.portSpinBox.value())
-        Preferences.setWebBrowser("SyncFtpIdleTimeout",
-                                  self.idleSpinBox.value())
-        
+        Preferences.setWebBrowser("SyncFtpIdleTimeout", self.idleSpinBox.value())
+
         from . import SyncGlobals
+
         return SyncGlobals.PageCheck
-    
+
     def isComplete(self):
         """
         Public method to check the completeness of the page.
-        
+
         @return flag indicating completeness (boolean)
         """
         return (
-            self.serverEdit.text() != "" and
-            self.userNameEdit.text() != "" and
-            self.passwordEdit.text() != "" and
-            self.pathEdit.text() != ""
+            self.serverEdit.text() != ""
+            and self.userNameEdit.text() != ""
+            and self.passwordEdit.text() != ""
+            and self.pathEdit.text() != ""
         )
--- a/src/eric7/WebBrowser/Sync/SyncHandler.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncHandler.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 class SyncHandler(QObject):
     """
     Base class for synchronization handlers.
-    
+
     @signal syncStatus(type_, message) emitted to indicate the synchronization
         status (string one of "bookmarks", "history", "passwords",
         "useragents" or "speeddial", string)
@@ -31,21 +31,22 @@
         synchronization has finished (string one of "bookmarks", "history",
         "passwords", "useragents" or "speeddial", boolean, boolean)
     """
+
     syncStatus = pyqtSignal(str, str)
     syncError = pyqtSignal(str)
     syncMessage = pyqtSignal(str)
     syncFinished = pyqtSignal(str, bool, bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self._firstTimeSynced = False
-        
+
         self._remoteFiles = {
             "bookmarks": "Bookmarks",
             "history": "History",
@@ -53,153 +54,163 @@
             "useragents": "UserAgentSettings",
             "speeddial": "SpeedDial",
         }
-        
+
         self._messages = {
             "bookmarks": {
                 "RemoteExists": self.tr(
-                    "Remote bookmarks file exists! Syncing local copy..."),
+                    "Remote bookmarks file exists! Syncing local copy..."
+                ),
                 "RemoteMissing": self.tr(
-                    "Remote bookmarks file does NOT exist. Exporting"
-                    " local copy..."),
+                    "Remote bookmarks file does NOT exist. Exporting" " local copy..."
+                ),
                 "LocalNewer": self.tr(
-                    "Local bookmarks file is NEWER. Exporting local copy..."),
+                    "Local bookmarks file is NEWER. Exporting local copy..."
+                ),
                 "LocalMissing": self.tr(
-                    "Local bookmarks file does NOT exist. Skipping"
-                    " synchronization!"),
+                    "Local bookmarks file does NOT exist. Skipping" " synchronization!"
+                ),
                 "Uploading": self.tr("Uploading local bookmarks file..."),
             },
             "history": {
                 "RemoteExists": self.tr(
-                    "Remote history file exists! Syncing local copy..."),
+                    "Remote history file exists! Syncing local copy..."
+                ),
                 "RemoteMissing": self.tr(
-                    "Remote history file does NOT exist. Exporting"
-                    " local copy..."),
+                    "Remote history file does NOT exist. Exporting" " local copy..."
+                ),
                 "LocalNewer": self.tr(
-                    "Local history file is NEWER. Exporting local copy..."),
+                    "Local history file is NEWER. Exporting local copy..."
+                ),
                 "LocalMissing": self.tr(
-                    "Local history file does NOT exist. Skipping"
-                    " synchronization!"),
+                    "Local history file does NOT exist. Skipping" " synchronization!"
+                ),
                 "Uploading": self.tr("Uploading local history file..."),
             },
             "passwords": {
                 "RemoteExists": self.tr(
-                    "Remote logins file exists! Syncing local copy..."),
+                    "Remote logins file exists! Syncing local copy..."
+                ),
                 "RemoteMissing": self.tr(
-                    "Remote logins file does NOT exist. Exporting"
-                    " local copy..."),
+                    "Remote logins file does NOT exist. Exporting" " local copy..."
+                ),
                 "LocalNewer": self.tr(
-                    "Local logins file is NEWER. Exporting local copy..."),
+                    "Local logins file is NEWER. Exporting local copy..."
+                ),
                 "LocalMissing": self.tr(
-                    "Local logins file does NOT exist. Skipping"
-                    " synchronization!"),
+                    "Local logins file does NOT exist. Skipping" " synchronization!"
+                ),
                 "Uploading": self.tr("Uploading local logins file..."),
             },
             "useragents": {
                 "RemoteExists": self.tr(
-                    "Remote user agent settings file exists! Syncing local"
-                    " copy..."),
+                    "Remote user agent settings file exists! Syncing local" " copy..."
+                ),
                 "RemoteMissing": self.tr(
                     "Remote user agent settings file does NOT exist."
-                    " Exporting local copy..."),
+                    " Exporting local copy..."
+                ),
                 "LocalNewer": self.tr(
                     "Local user agent settings file is NEWER. Exporting"
-                    " local copy..."),
+                    " local copy..."
+                ),
                 "LocalMissing": self.tr(
                     "Local user agent settings file does NOT exist."
-                    " Skipping synchronization!"),
-                "Uploading": self.tr(
-                    "Uploading local user agent settings file..."),
+                    " Skipping synchronization!"
+                ),
+                "Uploading": self.tr("Uploading local user agent settings file..."),
             },
             "speeddial": {
                 "RemoteExists": self.tr(
-                    "Remote speed dial settings file exists! Syncing local"
-                    " copy..."),
+                    "Remote speed dial settings file exists! Syncing local" " copy..."
+                ),
                 "RemoteMissing": self.tr(
                     "Remote speed dial settings file does NOT exist."
-                    " Exporting local copy..."),
+                    " Exporting local copy..."
+                ),
                 "LocalNewer": self.tr(
                     "Local speed dial settings file is NEWER. Exporting"
-                    " local copy..."),
+                    " local copy..."
+                ),
                 "LocalMissing": self.tr(
                     "Local speed dial settings file does NOT exist."
-                    " Skipping synchronization!"),
-                "Uploading": self.tr(
-                    "Uploading local speed dial settings file..."),
+                    " Skipping synchronization!"
+                ),
+                "Uploading": self.tr("Uploading local speed dial settings file..."),
             },
         }
-    
+
     def syncBookmarks(self):
         """
         Public method to synchronize the bookmarks.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def syncHistory(self):
         """
         Public method to synchronize the history.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def syncPasswords(self):
         """
         Public method to synchronize the passwords.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def syncUserAgents(self):
         """
         Public method to synchronize the user agents.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def syncSpeedDial(self):
         """
         Public method to synchronize the speed dial data.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def initialLoadAndCheck(self, forceUpload):
         """
         Public method to do the initial check.
-        
+
         @param forceUpload flag indicating a forced upload of the files
             (boolean)
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def shutdown(self):
         """
         Public method to shut down the handler.
-        
+
         @exception NotImplementedError raised to indicate that this method
             must be implemented by subclasses
         """
         raise NotImplementedError
-    
+
     def readFile(self, fileName, type_):
         """
         Public method to read a file.
-        
+
         If encrypted synchronization is enabled, the data will be encrypted
         using the relevant encryption key.
-        
+
         @param fileName name of the file to be read (string)
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
@@ -212,36 +223,38 @@
                     data = inputFile.read()
             except OSError:
                 return QByteArray()
-            
-            if (
-                Preferences.getWebBrowser("SyncEncryptData") and
-                (not Preferences.getWebBrowser("SyncEncryptPasswordsOnly") or
-                 (Preferences.getWebBrowser("SyncEncryptPasswordsOnly") and
-                  type_ == "passwords"))
+
+            if Preferences.getWebBrowser("SyncEncryptData") and (
+                not Preferences.getWebBrowser("SyncEncryptPasswordsOnly")
+                or (
+                    Preferences.getWebBrowser("SyncEncryptPasswordsOnly")
+                    and type_ == "passwords"
+                )
             ):
                 key = Preferences.getWebBrowser("SyncEncryptionKey")
                 if not key:
                     return QByteArray()
-                
+
                 data, ok = dataEncrypt(
-                    data, key,
-                    keyLength=Preferences.getWebBrowser(
-                        "SyncEncryptionKeyLength"),
-                    hashIterations=100)
+                    data,
+                    key,
+                    keyLength=Preferences.getWebBrowser("SyncEncryptionKeyLength"),
+                    hashIterations=100,
+                )
                 if not ok:
                     return QByteArray()
-            
+
             return QByteArray(data)
-        
+
         return QByteArray()
-    
+
     def writeFile(self, data, fileName, type_, timestamp=0):
         """
         Public method to write the data to a file.
-        
+
         If encrypted synchronization is enabled, the data will be decrypted
         using the relevant encryption key.
-        
+
         @param data data to be written and optionally decrypted (QByteArray)
         @param fileName name of the file the data is to be written to (string)
         @param type_ type of the synchronization event (string one
@@ -252,23 +265,26 @@
             string)
         """
         data = bytes(data)
-        
-        if (
-            Preferences.getWebBrowser("SyncEncryptData") and
-            (not Preferences.getWebBrowser("SyncEncryptPasswordsOnly") or
-             (Preferences.getWebBrowser("SyncEncryptPasswordsOnly") and
-              type_ == "passwords"))
+
+        if Preferences.getWebBrowser("SyncEncryptData") and (
+            not Preferences.getWebBrowser("SyncEncryptPasswordsOnly")
+            or (
+                Preferences.getWebBrowser("SyncEncryptPasswordsOnly")
+                and type_ == "passwords"
+            )
         ):
             key = Preferences.getWebBrowser("SyncEncryptionKey")
             if not key:
                 return False, self.tr("Invalid encryption key given.")
-            
+
             data, ok = dataDecrypt(
-                data, key,
-                keyLength=Preferences.getWebBrowser("SyncEncryptionKeyLength"))
+                data,
+                key,
+                keyLength=Preferences.getWebBrowser("SyncEncryptionKeyLength"),
+            )
             if not ok:
                 return False, self.tr("Data cannot be decrypted.")
-        
+
         try:
             with open(fileName, "wb") as outputFile:
                 outputFile.write(data)
--- a/src/eric7/WebBrowser/Sync/SyncHostTypePage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncHostTypePage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,29 +20,27 @@
     """
     Class implementing the synchronization host type wizard page.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         if Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeFtp:
             self.ftpRadioButton.setChecked(True)
-        elif (
-            Preferences.getWebBrowser("SyncType") ==
-                SyncGlobals.SyncTypeDirectory
-        ):
+        elif Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeDirectory:
             self.directoryRadioButton.setChecked(True)
         else:
             self.noneRadioButton.setChecked(True)
-    
+
     def nextId(self):
         """
         Public method returning the ID of the next wizard page.
-        
+
         @return next wizard page ID (integer)
         """
         # save the settings
@@ -50,8 +48,7 @@
             Preferences.setWebBrowser("SyncType", SyncGlobals.SyncTypeFtp)
             return SyncGlobals.PageFTPSettings
         elif self.directoryRadioButton.isChecked():
-            Preferences.setWebBrowser(
-                "SyncType", SyncGlobals.SyncTypeDirectory)
+            Preferences.setWebBrowser("SyncType", SyncGlobals.SyncTypeDirectory)
             return SyncGlobals.PageDirectorySettings
         else:
             Preferences.setWebBrowser("SyncType", SyncGlobals.SyncTypeNone)
--- a/src/eric7/WebBrowser/Sync/SyncManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Sync/SyncManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,7 +19,7 @@
 class SyncManager(QObject):
     """
     Class implementing the synchronization manager.
-    
+
     @signal syncError(message) emitted for a general error with the error
         message (string)
     @signal syncMessage(message) emitted to give status info about the sync
@@ -31,41 +31,43 @@
         synchronization has finished (string one of "bookmarks", "history",
         "passwords", "useragents" or "speeddial", boolean, boolean)
     """
+
     syncError = pyqtSignal(str)
     syncMessage = pyqtSignal(str)
     syncStatus = pyqtSignal(str, str)
     syncFinished = pyqtSignal(str, bool, bool)
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__handler = None
-    
+
     def handler(self):
         """
         Public method to get a reference to the sync handler object.
-        
+
         @return reference to the sync handler object (SyncHandler)
         """
         return self.__handler
-    
+
     def showSyncDialog(self):
         """
         Public method to show the synchronization dialog.
         """
         from .SyncAssistantDialog import SyncAssistantDialog
+
         dlg = SyncAssistantDialog()
         dlg.exec()
-    
+
     def loadSettings(self, forceUpload=False):
         """
         Public method to load the settings.
-        
+
         @param forceUpload flag indicating a forced upload of the files
             (boolean)
         """
@@ -75,179 +77,185 @@
             self.__handler.syncStatus.disconnect(self.__syncStatus)
             self.__handler.syncMessage.disconnect(self.syncMessage)
             self.__handler.shutdown()
-        
+
         if self.syncEnabled():
             from . import SyncGlobals
-            if (
-                Preferences.getWebBrowser("SyncType") ==
-                    SyncGlobals.SyncTypeFtp
-            ):
+
+            if Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeFtp:
                 from .FtpSyncHandler import FtpSyncHandler
+
                 self.__handler = FtpSyncHandler(self)
-            elif (
-                Preferences.getWebBrowser("SyncType") ==
-                    SyncGlobals.SyncTypeDirectory
-            ):
+            elif Preferences.getWebBrowser("SyncType") == SyncGlobals.SyncTypeDirectory:
                 from .DirectorySyncHandler import DirectorySyncHandler
+
                 self.__handler = DirectorySyncHandler(self)
             self.__handler.syncError.connect(self.__syncError)
             self.__handler.syncFinished.connect(self.__syncFinished)
             self.__handler.syncStatus.connect(self.__syncStatus)
             self.__handler.syncMessage.connect(self.syncMessage)
-            
+
             self.__handler.initialLoadAndCheck(forceUpload=forceUpload)
-            
+
             # connect sync manager to bookmarks manager
             if Preferences.getWebBrowser("SyncBookmarks"):
                 (
-                    WebBrowserWindow.bookmarksManager()
-                    .bookmarksSaved.connect(self.__syncBookmarks)
+                    WebBrowserWindow.bookmarksManager().bookmarksSaved.connect(
+                        self.__syncBookmarks
+                    )
                 )
             else:
                 with contextlib.suppress(TypeError):
                     (
-                        WebBrowserWindow.bookmarksManager()
-                        .bookmarksSaved.disconnect(self.__syncBookmarks)
+                        WebBrowserWindow.bookmarksManager().bookmarksSaved.disconnect(
+                            self.__syncBookmarks
+                        )
                     )
-            
+
             # connect sync manager to history manager
             if Preferences.getWebBrowser("SyncHistory"):
                 (
-                    WebBrowserWindow.historyManager().historySaved
-                    .connect(self.__syncHistory)
+                    WebBrowserWindow.historyManager().historySaved.connect(
+                        self.__syncHistory
+                    )
                 )
             else:
                 with contextlib.suppress(TypeError):
                     (
-                        WebBrowserWindow.historyManager()
-                        .historySaved.disconnect(self.__syncHistory)
+                        WebBrowserWindow.historyManager().historySaved.disconnect(
+                            self.__syncHistory
+                        )
                     )
-            
+
             # connect sync manager to passwords manager
             if Preferences.getWebBrowser("SyncPasswords"):
                 (
-                    WebBrowserWindow.passwordManager()
-                    .passwordsSaved.connect(self.__syncPasswords)
-                )
-            else:
-                with contextlib.suppress(TypeError):
-                    (
-                        WebBrowserWindow.passwordManager()
-                        .passwordsSaved.disconnect(self.__syncPasswords)
+                    WebBrowserWindow.passwordManager().passwordsSaved.connect(
+                        self.__syncPasswords
                     )
-            
-            # connect sync manager to user agent manager
-            if Preferences.getWebBrowser("SyncUserAgents"):
-                (
-                    WebBrowserWindow.userAgentsManager()
-                    .userAgentSettingsSaved.connect(self.__syncUserAgents)
                 )
             else:
                 with contextlib.suppress(TypeError):
                     (
-                        WebBrowserWindow.userAgentsManager()
-                        .userAgentSettingsSaved.disconnect(
-                            self.__syncUserAgents)
+                        WebBrowserWindow.passwordManager().passwordsSaved.disconnect(
+                            self.__syncPasswords
+                        )
                     )
-            
+
+            # connect sync manager to user agent manager
+            if Preferences.getWebBrowser("SyncUserAgents"):
+                (
+                    WebBrowserWindow.userAgentsManager().userAgentSettingsSaved.connect(
+                        self.__syncUserAgents
+                    )
+                )
+            else:
+                with contextlib.suppress(TypeError):
+                    uam = WebBrowserWindow.userAgentsManager()
+                    uam.userAgentSettingsSaved.disconnect(self.__syncUserAgents)
+
             # connect sync manager to speed dial
             if Preferences.getWebBrowser("SyncSpeedDial"):
                 (
-                    WebBrowserWindow.speedDial()
-                    .speedDialSaved.connect(self.__syncSpeedDial)
+                    WebBrowserWindow.speedDial().speedDialSaved.connect(
+                        self.__syncSpeedDial
+                    )
                 )
             else:
                 with contextlib.suppress(TypeError):
                     (
-                        WebBrowserWindow.speedDial()
-                        .speedDialSaved.disconnect(self.__syncSpeedDial)
+                        WebBrowserWindow.speedDial().speedDialSaved.disconnect(
+                            self.__syncSpeedDial
+                        )
                     )
         else:
             self.__handler = None
-            
+
             with contextlib.suppress(TypeError):
                 (
-                    WebBrowserWindow.bookmarksManager()
-                    .bookmarksSaved.disconnect(self.__syncBookmarks)
+                    WebBrowserWindow.bookmarksManager().bookmarksSaved.disconnect(
+                        self.__syncBookmarks
+                    )
                 )
             with contextlib.suppress(TypeError):
                 (
-                    WebBrowserWindow.historyManager().historySaved
-                    .disconnect(self.__syncHistory)
+                    WebBrowserWindow.historyManager().historySaved.disconnect(
+                        self.__syncHistory
+                    )
                 )
             with contextlib.suppress(TypeError):
                 (
-                    WebBrowserWindow.passwordManager()
-                    .passwordsSaved.disconnect(self.__syncPasswords)
+                    WebBrowserWindow.passwordManager().passwordsSaved.disconnect(
+                        self.__syncPasswords
+                    )
                 )
             with contextlib.suppress(TypeError):
-                (
-                    WebBrowserWindow.userAgentsManager()
-                    .userAgentSettingsSaved.disconnect(self.__syncUserAgents)
-                )
+                uam = WebBrowserWindow.userAgentsManager()
+                uam.userAgentSettingsSaved.disconnect(self.__syncUserAgents)
             with contextlib.suppress(TypeError):
                 WebBrowserWindow.speedDial().speedDialSaved.disconnect(
-                    self.__syncSpeedDial)
-    
+                    self.__syncSpeedDial
+                )
+
     def syncEnabled(self):
         """
         Public method to check, if synchronization is enabled.
-        
+
         @return flag indicating enabled synchronization
         """
         from . import SyncGlobals
+
         return (
-            Preferences.getWebBrowser("SyncEnabled") and
-            Preferences.getWebBrowser("SyncType") != SyncGlobals.SyncTypeNone
+            Preferences.getWebBrowser("SyncEnabled")
+            and Preferences.getWebBrowser("SyncType") != SyncGlobals.SyncTypeNone
         )
-    
+
     def __syncBookmarks(self):
         """
         Private slot to synchronize the bookmarks.
         """
         if self.__handler is not None:
             self.__handler.syncBookmarks()
-    
+
     def __syncHistory(self):
         """
         Private slot to synchronize the history.
         """
         if self.__handler is not None:
             self.__handler.syncHistory()
-    
+
     def __syncPasswords(self):
         """
         Private slot to synchronize the passwords.
         """
         if self.__handler is not None:
             self.__handler.syncPasswords()
-    
+
     def __syncUserAgents(self):
         """
         Private slot to synchronize the user agent settings.
         """
         if self.__handler is not None:
             self.__handler.syncUserAgents()
-    
+
     def __syncSpeedDial(self):
         """
         Private slot to synchronize the speed dial settings.
         """
         if self.__handler is not None:
             self.__handler.syncSpeedDial()
-    
+
     def __syncError(self, message):
         """
         Private slot to handle general synchronization issues.
-        
+
         @param message error message (string)
         """
         self.syncError.emit(message)
-    
+
     def __syncFinished(self, type_, status, download):
         """
         Private slot to handle a finished synchronization event.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -266,11 +274,11 @@
             elif type_ == "speeddial":
                 WebBrowserWindow.speedDial().reload()
         self.syncFinished.emit(type_, status, download)
-    
+
     def __syncStatus(self, type_, message):
         """
         Private slot to handle a status update of a synchronization event.
-        
+
         @param type_ type of the synchronization event (string one
             of "bookmarks", "history", "passwords", "useragents" or
             "speeddial")
@@ -278,13 +286,13 @@
         """
         self.syncMessage.emit(message)
         self.syncStatus.emit(type_, message)
-    
+
     def close(self):
         """
         Public slot to shut down the synchronization manager.
         """
         if not self.syncEnabled():
             return
-        
+
         if self.__handler is not None:
             self.__handler.shutdown()
--- a/src/eric7/WebBrowser/TabManager/TabManagerWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/TabManager/TabManagerWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,7 +18,12 @@
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QTimer, QRect
 from PyQt6.QtGui import QAction
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem, QMenu, QStyle
+    QWidget,
+    QVBoxLayout,
+    QTreeWidget,
+    QTreeWidgetItem,
+    QMenu,
+    QStyle,
 )
 
 from EricNetwork import EricTldExtractor, EricNetworkUtilities
@@ -34,24 +39,25 @@
 class TabManagerWidget(QWidget):
     """
     Class implementing a window for managing the web browser tabs.
-    
+
     @signal groupTypeChanged(int) emitted when the 'Group By' value was changed
     """
+
     GroupByWindow = 0
     GroupByDomain = 1
     GroupByHost = 2
-    
+
     WebBrowserRole = Qt.ItemDataRole.UserRole + 1
     WebWindowRole = Qt.ItemDataRole.UserRole + 2
-    
+
     groupTypeChanged = pyqtSignal(int)
-    
+
     _tldExtractor = None
-    
+
     def __init__(self, mainWindow, parent=None, defaultWidget=False):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window
         @type WebBrowserWindow
         @param parent reference to the parent widget
@@ -61,103 +67,101 @@
         """
         super().__init__(parent)
         self.setWindowFlags(Qt.WindowType.Window)
-        
+
         self.__layout = QVBoxLayout(self)
         self.__layout.setContentsMargins(0, 0, 0, 0)
         self.__tree = QTreeWidget(self)
         self.__tree.setHeaderHidden(True)
         self.__tree.setExpandsOnDoubleClick(False)
-        self.__tree.setContextMenuPolicy(
-            Qt.ContextMenuPolicy.CustomContextMenu)
+        self.__tree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.__layout.addWidget(self.__tree)
-        
+
         self.setWindowTitle(self.tr("Tab Manager"))
-        
+
         self.__mw = mainWindow
         self.__page = None
-        
+
         self.__isRefreshing = False
         self.__refreshBlocked = False
         self.__waitForRefresh = False
         self.__isDefaultWidget = defaultWidget
         self.__groupType = Preferences.getWebBrowser("TabManagerGroupByType")
-        
+
         if TabManagerWidget._tldExtractor is None:
             TabManagerWidget._tldExtractor = EricTldExtractor.instance()
-            TabManagerWidget._tldExtractor.setDataSearchPaths([
-                os.path.join(Utilities.getConfigDir(), "web_browser")])
-        
+            TabManagerWidget._tldExtractor.setDataSearchPaths(
+                [os.path.join(Utilities.getConfigDir(), "web_browser")]
+            )
+
         self.__tree.itemDoubleClicked.connect(self.__itemDoubleClicked)
         self.__tree.customContextMenuRequested.connect(
-            self.__customContextMenuRequested)
-        
+            self.__customContextMenuRequested
+        )
+
         self.resize(400, 600)
-    
+
     def closeSelectedBrowsers(self, browsersDict):
         """
         Public method to close the selected browsers.
-        
+
         @param browsersDict dictionary containing the browsers per window
         @type dict with WebBrowserWindow as key and list of WebBrowserView
             as value
         """
         if not browsersDict:
             return
-        
+
         for mainWindow in browsersDict:
             tabWidget = mainWindow.tabWidget()
             for browser in browsersDict[mainWindow]:
                 tabWidget.closeBrowserAt(tabWidget.indexOf(browser))
-    
+
     def bookmarkSelectedBrowsers(self, browsersDict):
         """
         Public method to bookmark the selected browsers.
-        
+
         @param browsersDict dictionary containing the browsers per window
         @type dict with WebBrowserWindow as key and list of WebBrowserView
             as value
         """
         if not browsersDict:
             return
-        
+
         from ..Bookmarks.BookmarkNode import BookmarkNode
         from ..Bookmarks.AddBookmarkDialog import AddBookmarkDialog
-        
+
         dlg = AddBookmarkDialog()
         dlg.setFolder(True)
         dlg.setTitle(self.tr("Saved Tabs"))
         dlg.exec()
-        
+
         folder = dlg.addedNode()
         if folder is None:
             return
-        
+
         for mainWin in browsersDict:
             for browser in browsersDict[mainWin]:
-                if (
-                    not browser.url().isEmpty() and
-                    browser.url().scheme() != "eric"
-                ):
+                if not browser.url().isEmpty() and browser.url().scheme() != "eric":
                     bookmark = BookmarkNode(BookmarkNode.Bookmark)
                     bookmark.url = bytes(browser.url().toEncoded()).decode()
                     bookmark.title = browser.title()
-                    
+
                     self.__mw.bookmarksManager().addBookmark(folder, bookmark)
-    
+
     def __setGroupType(self, groupType):
         """
         Private method to set the 'Group By' type.
-        
+
         @param groupType 'Group By' type to be set
         @type int (0 - 2)
         """
         self.__groupType = groupType
         Preferences.setWebBrowser("TabManagerGroupByType", groupType)
-    
+
     def domainFromUrl(self, url, useHostName=False):
         """
         Public method to extract the domain from an URL.
-        
+
         @param url URL to extract the domain from
         @type QUrl
         @param useHostName flag indicating to use the host name
@@ -167,67 +171,65 @@
         """
         appendStr = ":"
         urlString = url.toString()
-        
+
         if url.scheme() == "file":
             return self.tr("Local File System:")
         elif url.scheme() == "eric" or not urlString:
             return self.tr("eric Web Browser:")
         elif url.scheme() == "ftp":
             appendStr = self.tr(" [FTP]:")
-        
+
         host = url.host()
         if not host:
             return urlString + appendStr
-        
+
         if useHostName or EricNetworkUtilities.isValidAddress(host):
             if host.lower().startswith("www."):
                 host = host[4:]
         else:
-            registeredDomain = (
-                TabManagerWidget._tldExtractor.registrableDomain(host)
-            )
+            registeredDomain = TabManagerWidget._tldExtractor.registrableDomain(host)
             if registeredDomain:
                 host = registeredDomain
-        
+
         return host + appendStr
-    
+
     def delayedRefreshTree(self, page=None):
         """
         Public slot to do a delyed refresh of the tree.
-        
+
         @param page reference to the web page
         @type WebBrowserPage
         """
         if self.__refreshBlocked or self.__waitForRefresh:
             return
-        
+
         if self.__isRefreshing and not page:
             return
-        
+
         self.__page = page
         self.__waitForRefresh = True
         QTimer.singleShot(50, self.__refreshTree)
-    
+
     def changeGroupType(self, act):
         """
         Public slot to change the 'Group By' type.
-        
+
         @param act reference to the action that was triggered
         @type QAction
         """
         if act is None:
             return
-        
+
         groupType = act.data()
         if self.__groupType != groupType:
             self.__setGroupType(groupType)
             self.delayedRefreshTree()
             self.groupTypeChanged.emit(self.__groupType)
-    
+
     def __createEmptyItem(self, parent=None, addToTree=True):
         """
         Private method to create an empty tree item.
-        
+
         @param parent reference to the parent item
         @type QTreeWidgetItem or QTreeWidget
         @param addToTree flag indicating to add the item to the tree
@@ -245,32 +247,32 @@
         itm = QTreeWidgetItem(parentItem)
         addFlags = (
             Qt.ItemFlag.ItemIsUserCheckable
-            if parent else
-            (Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsAutoTristate)
+            if parent
+            else (Qt.ItemFlag.ItemIsUserCheckable | Qt.ItemFlag.ItemIsAutoTristate)
         )
         itm.setFlags(itm.flags() | addFlags)
         itm.setCheckState(0, Qt.CheckState.Unchecked)
-        
+
         return itm
-    
+
     def __groupByDomainName(self, useHostName=False):
         """
         Private method to group the tree items by domain name.
-        
+
         @param useHostName flag indicating to use the host name
         @type bool
         """
         windows = self.__mw.mainWindows()
-        
+
         tabsGroupedByDomain = {}
-        
+
         for mainWin in windows:
             for browser in mainWin.tabWidget().browsers():
                 if self.__page == browser.page():
                     self.__page = None
                     continue
                 domain = self.domainFromUrl(browser.url(), useHostName)
-                
+
                 if domain not in tabsGroupedByDomain:
                     groupItem = self.__createEmptyItem(None, False)
                     groupItem.setText(0, domain)
@@ -280,7 +282,7 @@
                     groupItem.setFont(0, font)
                     tabsGroupedByDomain[domain] = groupItem
                 groupItem = tabsGroupedByDomain[domain]
-                
+
                 tabItem = self.__createEmptyItem(groupItem)
                 if browser == mainWin.tabWidget().currentBrowser():
                     font = tabItem.font(0)
@@ -292,22 +294,22 @@
                     tabItem.setIcon(0, UI.PixmapCache.getIcon("loading"))
                 tabItem.setText(0, browser.title())
                 tabItem.setToolTip(0, browser.title())
-                
+
                 tabItem.setData(0, TabManagerWidget.WebBrowserRole, browser)
                 tabItem.setData(0, TabManagerWidget.WebWindowRole, mainWin)
-                
+
                 self.__makeWebBrowserViewConnections(browser)
-        
+
         self.__tree.insertTopLevelItems(0, tabsGroupedByDomain.values())
-    
+
     def __groupByWindow(self):
         """
         Private method to group the tree items by window.
         """
         windows = self.__mw.mainWindows()
-        
+
         self.__isRefreshing = True
-        
+
         for winCount, mainWin in enumerate(windows, start=1):
             winItem = self.__createEmptyItem()
             winItem.setText(0, self.tr("Window {0}").format(winCount))
@@ -317,12 +319,12 @@
                 font.setBold(True)
                 winItem.setFont(0, font)
             winItem.setData(0, TabManagerWidget.WebWindowRole, mainWin)
-            
+
             for browser in mainWin.tabWidget().browsers():
                 if self.__page == browser.page():
                     self.__page = None
                     continue
-                
+
                 tabItem = self.__createEmptyItem(winItem)
                 if browser == mainWin.tabWidget().currentBrowser():
                     font = tabItem.font(0)
@@ -334,16 +336,16 @@
                     tabItem.setIcon(0, UI.PixmapCache.getIcon("loading"))
                 tabItem.setText(0, browser.title())
                 tabItem.setToolTip(0, browser.title())
-                
+
                 tabItem.setData(0, TabManagerWidget.WebBrowserRole, browser)
                 tabItem.setData(0, TabManagerWidget.WebWindowRole, mainWin)
-                
+
                 self.__makeWebBrowserViewConnections(browser)
-    
+
     def __makeWebBrowserViewConnections(self, view):
         """
         Private method to create the signal connections to the web view.
-        
+
         @param view reference to the web view
         @type WebBrowserView
         """
@@ -352,7 +354,7 @@
             view.loadStarted.connect(self.delayedRefreshTree)
             view.titleChanged.connect(self.delayedRefreshTree)
             view.faviconChanged.connect(self.delayedRefreshTree)
-    
+
     @pyqtSlot()
     def __refreshTree(self):
         """
@@ -360,26 +362,27 @@
         """
         if self.__refreshBlocked:
             return
-        
+
         if self.__isRefreshing and not self.__page:
             return
-        
+
         # store selected items
         selectedBrowsers = []
         for index in range(self.__tree.topLevelItemCount()):
             winItem = self.__tree.topLevelItem(index)
             if winItem.checkState(0) == Qt.CheckState.Unchecked:
                 continue
-            
+
             for row in range(winItem.childCount()):
                 tabItem = winItem.child(row)
                 if tabItem.checkState(0) == Qt.CheckState.Unchecked:
                     continue
                 selectedBrowsers.append(
-                    tabItem.data(0, TabManagerWidget.WebBrowserRole))
-        
+                    tabItem.data(0, TabManagerWidget.WebBrowserRole)
+                )
+
         self.__tree.clear()
-        
+
         if self.__groupType == TabManagerWidget.GroupByHost:
             self.__groupByDomainName(True)
         elif self.__groupType == TabManagerWidget.GroupByDomain:
@@ -388,67 +391,67 @@
             # default is group by window
             self.__setGroupType(TabManagerWidget.GroupByWindow)
             self.__groupByWindow()
-        
+
         # restore selected items
         for index in range(self.__tree.topLevelItemCount()):
             winItem = self.__tree.topLevelItem(index)
-            
+
             for row in range(winItem.childCount()):
                 tabItem = winItem.child(row)
                 if tabItem.data(0, TabManagerWidget.WebBrowserRole) in (
                     selectedBrowsers
                 ):
                     tabItem.setCheckState(0, Qt.CheckState.Checked)
-        
+
         self.__tree.expandAll()
         self.__isRefreshing = False
         self.__waitForRefresh = False
-    
+
     @pyqtSlot()
     def __processActions(self, act):
         """
         Private slot to process the actions.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         self.__refreshBlocked = True
-        
+
         selectedBrowsers = collections.defaultdict(list)
-        
+
         command = act.objectName()
-        
+
         for index in range(self.__tree.topLevelItemCount()):
             winItem = self.__tree.topLevelItem(index)
             if winItem.checkState(0) == Qt.CheckState.Unchecked:
                 continue
-            
+
             for row in range(winItem.childCount()):
                 tabItem = winItem.child(row)
                 if tabItem.checkState(0) == Qt.CheckState.Unchecked:
                     continue
-                
+
                 mainWin = tabItem.data(0, TabManagerWidget.WebWindowRole)
                 browser = tabItem.data(0, TabManagerWidget.WebBrowserRole)
-                
+
                 selectedBrowsers[mainWin].append(browser)
-            
+
             winItem.setCheckState(0, Qt.CheckState.Unchecked)
-        
+
         if selectedBrowsers:
             if command == "closeSelection":
                 self.closeSelectedBrowsers(selectedBrowsers)
             elif command == "bookmarkSelection":
                 self.bookmarkSelectedBrowsers(selectedBrowsers)
-        
+
         self.__refreshBlocked = False
         self.delayedRefreshTree()
-    
+
     @pyqtSlot(QTreeWidgetItem, int)
     def __itemDoubleClicked(self, itm, column):
         """
         Private slot to handle double clicking a tree item.
-        
+
         @param itm reference to the item having been double clicked
         @type QTreeWidgetItem
         @param column column of the double click
@@ -456,13 +459,13 @@
         """
         if not itm:
             return
-        
+
         mainWin = itm.data(0, TabManagerWidget.WebWindowRole)
         browser = itm.data(0, TabManagerWidget.WebBrowserRole)
-        
+
         if not mainWin:
             return
-        
+
         if mainWin.isMinimized():
             mainWin.showNormal()
         else:
@@ -470,17 +473,17 @@
         mainWin.activateWindow()
         mainWin.raise_()
         mainWin.setFocus()
-        
+
         tabWidget = mainWin.tabWidget()
         if browser and browser != tabWidget.currentWidget():
             tabWidget.setCurrentWidget(browser)
             browser.setFocus()
-    
+
     @pyqtSlot()
     def __isBrowserSelected(self):
         """
         Private slot to check, if any browser entry is selected.
-        
+
         @return flag indicating the existence of a selected entry
         @rtype bool
         """
@@ -490,14 +493,14 @@
             if topItm.checkState(0) != Qt.CheckState.Unchecked:
                 selected = True
                 break
-        
+
         return selected
-    
+
     @pyqtSlot(QPoint)
     def __customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos position the menu should be shown at
         @type QPoint
         """
@@ -507,40 +510,40 @@
         act.setData(TabManagerWidget.GroupByWindow)
         act.setCheckable(True)
         act.setChecked(self.__groupType == TabManagerWidget.GroupByWindow)
-        
+
         act = groupTypeSubMenu.addAction(self.tr("&Domain"))
         act.setData(TabManagerWidget.GroupByDomain)
         act.setCheckable(True)
         act.setChecked(self.__groupType == TabManagerWidget.GroupByDomain)
-        
+
         act = groupTypeSubMenu.addAction(self.tr("&Host"))
         act.setData(TabManagerWidget.GroupByHost)
         act.setCheckable(True)
         act.setChecked(self.__groupType == TabManagerWidget.GroupByHost)
         groupTypeSubMenu.triggered.connect(self.changeGroupType)
-        
+
         menu.addMenu(groupTypeSubMenu)
-        
+
         menu.addSeparator()
-        
+
         if self.__isBrowserSelected():
             act1 = menu.addAction(
-                UI.PixmapCache.getIcon("bookmark22"),
-                self.tr("&Bookmark checked tabs"))
+                UI.PixmapCache.getIcon("bookmark22"), self.tr("&Bookmark checked tabs")
+            )
             act1.setObjectName("bookmarkSelection")
             act1.triggered.connect(lambda: self.__processActions(act1))
             act2 = menu.addAction(
-                UI.PixmapCache.getIcon("tabClose"),
-                self.tr("&Close checked tabs"))
+                UI.PixmapCache.getIcon("tabClose"), self.tr("&Close checked tabs")
+            )
             act2.setObjectName("closeSelection")
             act2.triggered.connect(lambda: self.__processActions(act2))
-        
+
         menu.exec(self.__tree.viewport().mapToGlobal(pos))
-    
+
     def mainWindowCreated(self, mainWin, refresh=True):
         """
         Public method to act on the creation of a new web browser window.
-        
+
         @param mainWin reference to the web browser window
         @type WebBrowserWindow
         @param refresh flag indicating to refresh the widget
@@ -552,26 +555,25 @@
         mainWin.webBrowserClosed.connect(self.delayedRefreshTree)
         mainWin.tabWidget().currentUrlChanged.connect(self.delayedRefreshTree)
         mainWin.tabWidget().currentChanged.connect(self.delayedRefreshTree)
-    
+
     def createStatusBarIcon(self):
         """
         Public method to create a status bar icon.
-        
+
         @return generated icon
         @rtype EricClickableLabel
         """
         icon = EricClickableLabel()
-        icon.setPixmap(
-            UI.PixmapCache.getPixmap("tabManager").scaled(16, 16))
+        icon.setPixmap(UI.PixmapCache.getPixmap("tabManager").scaled(16, 16))
         icon.setToolTip(self.tr("Show Tab Manager"))
         icon.clicked.connect(lambda: self.raiseTabManager(icon))
-        
+
         return icon
-    
+
     def raiseTabManager(self, icon):
         """
         Public slot to show the tab manager.
-        
+
         @param icon reference to the clicked icon
         @type EricClickableLabel or QAction
         """
@@ -580,24 +582,27 @@
             window = icon.window()
         elif isinstance(icon, QAction):
             window = icon.parent()
-        
+
         if window is not None:
             titleBarHeight = self.style().pixelMetric(
-                QStyle.PixelMetric.PM_TitleBarHeight)
-            
+                QStyle.PixelMetric.PM_TitleBarHeight
+            )
+
             y = max(0, window.frameGeometry().top() + titleBarHeight + 1)
-            
+
             availableGeometry = ericApp().primaryScreen().availableGeometry()
             windowFrameGeometry = window.frameGeometry()
-            if (availableGeometry.width() - windowFrameGeometry.right() - 1 >
-                    self.frameGeometry().width()):
+            if (
+                availableGeometry.width() - windowFrameGeometry.right() - 1
+                > self.frameGeometry().width()
+            ):
                 x = windowFrameGeometry.right() + 1
             else:
                 x = windowFrameGeometry.x() - 1 - self.frameGeometry().width()
-            
+
             newGeo = QRect(x, y, self.width(), window.height())
             self.setGeometry(newGeo)
-        
+
         self.activateWindow()
         self.showNormal()
         self.raise_()
--- a/src/eric7/WebBrowser/Tools/DelayedFileWatcher.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/DelayedFileWatcher.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,18 +13,19 @@
 class DelayedFileWatcher(QFileSystemWatcher):
     """
     Class implementing a file system watcher with a delay.
-    
+
     @signal delayedDirectoryChanged(path) emitted to indicate a changed
         directory
     @signal delayedFileChanged(path) emitted to indicate a changed file
     """
+
     delayedDirectoryChanged = pyqtSignal(str)
     delayedFileChanged = pyqtSignal(str)
-    
+
     def __init__(self, paths=None, parent=None):
         """
         Constructor
-        
+
         @param paths list of paths to be watched
         @type list of str
         @param parent reference to the parent object
@@ -34,42 +35,42 @@
             super().__init__(paths, parent)
         else:
             super().__init__(parent)
-        
+
         self.__dirQueue = []
         self.__fileQueue = []
-        
+
         self.directoryChanged.connect(self.__directoryChanged)
         self.fileChanged.connect(self.__fileChanged)
-    
+
     @pyqtSlot(str)
     def __directoryChanged(self, path):
         """
         Private slot handling a changed directory.
-        
+
         @param path name of the changed directory
         @type str
         """
         self.__dirQueue.append(path)
         QTimer.singleShot(500, self.__dequeueDirectory)
-    
+
     @pyqtSlot(str)
     def __fileChanged(self, path):
         """
         Private slot handling a changed file.
-        
+
         @param path name of the changed file
         @type str
         """
         self.__fileQueue.append(path)
         QTimer.singleShot(500, self.__dequeueFile)
-    
+
     @pyqtSlot()
     def __dequeueDirectory(self):
         """
         Private slot to signal a directory change.
         """
         self.delayedDirectoryChanged.emit(self.__dirQueue.pop(0))
-    
+
     @pyqtSlot()
     def __dequeueFile(self):
         """
--- a/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/PrintToPdfDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,10 +24,11 @@
     Class implementing a dialog to enter the data for printing a web page to
     PDF.
     """
+
     def __init__(self, filePath, parent=None):
         """
         Constructor
-        
+
         @param filePath path of the file to write into
         @type str
         @param parent reference to the parent widget
@@ -35,28 +36,27 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.pdfFilePicker.setMode(
-            EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE)
-        self.pdfFilePicker.setFilters(self.tr(
-            "PDF Files (*.pdf);;"
-            "All Files (*)"))
+
+        self.pdfFilePicker.setMode(EricPathPickerModes.SAVE_FILE_OVERWRITE_MODE)
+        self.pdfFilePicker.setFilters(self.tr("PDF Files (*.pdf);;" "All Files (*)"))
         if not os.path.isabs(filePath):
             documentsPath = QStandardPaths.writableLocation(
-                QStandardPaths.StandardLocation.DocumentsLocation)
+                QStandardPaths.StandardLocation.DocumentsLocation
+            )
             if documentsPath:
                 filePath = os.path.join(documentsPath, filePath)
             else:
                 filePath = os.path.abspath(filePath)
         self.pdfFilePicker.setText(filePath, toNative=True)
-        
+
         self.__currentPageLayout = QPageLayout(
             QPageSize(QPageSize.PageSizeId.A4),
             QPageLayout.Orientation.Portrait,
-            QMarginsF(0.0, 0.0, 0.0, 0.0))
-        
+            QMarginsF(0.0, 0.0, 0.0, 0.0),
+        )
+
         self.__updatePageLayoutLabel()
-    
+
     @pyqtSlot()
     def on_pageLayoutButton_clicked(self):
         """
@@ -64,31 +64,34 @@
         """
         printer = QPrinter()
         printer.setPageLayout(self.__currentPageLayout)
-        
+
         dlg = QPageSetupDialog(printer, self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.__currentPageLayout = printer.pageLayout()
             self.__updatePageLayoutLabel()
-    
+
     def __updatePageLayoutLabel(self):
         """
         Private method to update the page layout label.
         """
         orientation = (
             self.tr("Portrait")
-            if (self.__currentPageLayout.orientation() ==
-                QPageLayout.Orientation.Portrait) else
-            self.tr("Landscape")
+            if (
+                self.__currentPageLayout.orientation()
+                == QPageLayout.Orientation.Portrait
+            )
+            else self.tr("Landscape")
         )
         self.pageLayoutLabel.setText(
             self.tr("{0}, {1}", "page size, page orientation").format(
-                self.__currentPageLayout.pageSize().name(),
-                orientation))
-    
+                self.__currentPageLayout.pageSize().name(), orientation
+            )
+        )
+
     def getData(self):
         """
         Public method to get the dialog data.
-        
+
         @return tuple containing the file path and the page layout
         @rtype tuple of str and QPageLayout
         """
--- a/src/eric7/WebBrowser/Tools/Scripts.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/Scripts.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,7 +20,7 @@
 def setupWebChannel(worldId):
     """
     Function generating  a script to setup the web channel.
-    
+
     @param worldId world ID for which to setup the channel
     @type int
     @return script to setup the web channel
@@ -74,12 +74,13 @@
     registerWebChannel();
 
 }})()"""
-    
+
     from WebBrowser.WebBrowserPage import WebBrowserPage
+
     match = (
         "// @exclude eric:*"
-        if worldId == WebBrowserPage.SafeJsWorld else
-        "// @include eric:*"
+        if worldId == WebBrowserPage.SafeJsWorld
+        else "// @include eric:*"
     )
     return source.format(match, getJavascript("qwebchannel.js"))
 
@@ -87,7 +88,7 @@
 def setupWindowObject():
     """
     Function generating a script to setup window.object add-ons.
-    
+
     @return generated script
     @rtype str
     """
@@ -106,14 +107,14 @@
         window.location = 'eric:PrintPage';
     };
 })()"""
-    
+
     return source
 
 
 def setStyleSheet(css):
     """
     Function generating a script to set a user style sheet.
-    
+
     @param css style sheet to be applied
     @type str
     @return script to set a user style sheet
@@ -126,7 +127,7 @@
     css.appendChild(document.createTextNode('{0}'));
     document.getElementsByTagName('head')[0].appendChild(css);
 }})()"""
-    
+
     style = css.replace("'", "\\'").replace("\n", "\\n")
     return source.format(style)
 
@@ -134,7 +135,7 @@
 def getFormData(pos):
     """
     Function generating a script to extract data for a form element.
-    
+
     @param pos position to extract data at
     @type QPoint
     @return script to extract form data
@@ -171,7 +172,7 @@
 def getAllImages():
     """
     Function generating a script to extract all image tags of a web page.
-    
+
     @return script to extract image tags
     @rtype str
     """
@@ -194,7 +195,7 @@
 def getAllMetaAttributes():
     """
     Function generating a script to extract all meta attributes of a web page.
-    
+
     @return script to extract meta attributes
     @rtype str
     """
@@ -219,7 +220,7 @@
 def getOpenSearchLinks():
     """
     Function generating a script to extract all open search links.
-    
+
     @return script to extract all open serach links
     @rtype str
     """
@@ -244,7 +245,7 @@
 def sendPostData(url, data):
     """
     Function generating a script to send Post data.
-    
+
     @param url URL to send the data to
     @type QUrl
     @param data data to be sent
@@ -261,30 +262,28 @@
     {1}
     form.submit();
 }})()"""
-    
+
     valueSource = """
 val = document.createElement('input');
 val.setAttribute('type', 'hidden');
 val.setAttribute('name', '{0}');
 val.setAttribute('value', '{1}');
 form.appendChild(val);"""
-    
+
     values = ""
     query = QUrlQuery(data)
-    for name, value in query.queryItems(
-        QUrl.ComponentFormattingOption.FullyDecoded
-    ):
+    for name, value in query.queryItems(QUrl.ComponentFormattingOption.FullyDecoded):
         value = value.replace("'", "\\'")
         name = name.replace("'", "\\'")
         values += valueSource.format(name, value)
-    
+
     return source.format(url.toString(), values)
 
 
 def setupFormObserver():
     """
     Function generating a script to monitor a web form for user entries.
-    
+
     @return script to monitor a web page
     @rtype str
     """
@@ -357,7 +356,7 @@
 def completeFormData(data):
     """
     Function generating a script to fill in form data.
-    
+
     @param data data to be filled into the form
     @type QByteArray
     @return script to fill a form
@@ -388,7 +387,7 @@
     }}
     
 }})()"""
-    
+
     data = bytes(data).decode("utf-8")
     data = data.replace("'", "\\'")
     return source.format(data)
@@ -397,7 +396,7 @@
 def setCss(css):
     """
     Function generating a script to set a given CSS style sheet.
-    
+
     @param css style sheet
     @type str
     @return script to set the style sheet
@@ -417,7 +416,7 @@
 def scrollToAnchor(anchor):
     """
     Function generating script to scroll to a given anchor.
-    
+
     @param anchor name of the anchor to scroll to
     @type str
     @return script to set the style sheet
@@ -436,6 +435,7 @@
     }})()"""
     return source.format(anchor)
 
+
 ###########################################################################
 ## scripts below are specific for eric
 ###########################################################################
@@ -444,7 +444,7 @@
 def getFeedLinks():
     """
     Function generating a script to extract all RSS and Atom feed links.
-    
+
     @return script to extract all RSS and Atom feed links
     @rtype str
     """
--- a/src/eric7/WebBrowser/Tools/WebBrowserTools.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/WebBrowserTools.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 import re
 import mimetypes
 
-from PyQt6.QtCore import (
-    QByteArray, QUrl, QCoreApplication, QBuffer, QIODevice
-)
+from PyQt6.QtCore import QByteArray, QUrl, QCoreApplication, QBuffer, QIODevice
 from PyQt6.QtGui import QPixmap
 
 
@@ -27,7 +25,7 @@
 def readAllFileContents(filename):
     """
     Function to read the string contents of the given file.
-    
+
     @param filename name of the file
     @type str
     @return contents of the file
@@ -43,7 +41,7 @@
 def containsSpace(string):
     """
     Function to check, if a string contains whitespace characters.
-    
+
     @param string string to be checked
     @type str
     @return flag indicating the presence of at least one whitespace character
@@ -55,7 +53,7 @@
 def ensureUniqueFilename(name, appendFormat="({0})"):
     """
     Module function to generate an unique file name based on a pattern.
-    
+
     @param name desired file name (string)
     @param appendFormat format pattern to be used to make the unique name
         (string)
@@ -63,61 +61,58 @@
     """
     if not os.path.exists(name):
         return name
-    
+
     tmpFileName = name
     i = 1
     while os.path.exists(tmpFileName):
         tmpFileName = name
         index = tmpFileName.rfind(".")
-        
+
         appendString = appendFormat.format(i)
         if index == -1:
             tmpFileName += appendString
         else:
-            tmpFileName = (
-                tmpFileName[:index] + appendString + tmpFileName[index:]
-            )
+            tmpFileName = tmpFileName[:index] + appendString + tmpFileName[index:]
         i += 1
-    
+
     return tmpFileName
 
 
 def getFileNameFromUrl(url):
     """
     Module function to generate a file name based on the given URL.
-    
+
     @param url URL (QUrl)
     @return file name (string)
     """
     fileName = url.toString(
-        QUrl.UrlFormattingOption.RemoveFragment |
-        QUrl.UrlFormattingOption.RemoveQuery |
-        QUrl.UrlFormattingOption.RemoveScheme |
-        QUrl.UrlFormattingOption.RemovePort
+        QUrl.UrlFormattingOption.RemoveFragment
+        | QUrl.UrlFormattingOption.RemoveQuery
+        | QUrl.UrlFormattingOption.RemoveScheme
+        | QUrl.UrlFormattingOption.RemovePort
     )
     if fileName.find("/") != -1:
         pos = fileName.rfind("/")
         fileName = fileName[pos:]
         fileName = fileName.replace("/", "")
-    
+
     fileName = filterCharsFromFilename(fileName)
-    
+
     if not fileName:
         fileName = filterCharsFromFilename(url.host().replace(".", "_"))
-    
+
     return fileName
 
 
 def filterCharsFromFilename(name):
     """
     Module function to filter illegal characters.
-    
+
     @param name name to be sanitized (string)
     @return sanitized name (string)
     """
     return (
-        name
-        .replace("/", "_")
+        name.replace("/", "_")
         .replace("\\", "")
         .replace(":", "")
         .replace("*", "")
@@ -132,7 +127,7 @@
 def pixmapFromByteArray(data):
     """
     Module function to convert a byte array to a pixmap.
-    
+
     @param data data for the pixmap
     @type bytes or QByteArray
     @return extracted pixmap
@@ -141,7 +136,7 @@
     pixmap = QPixmap()
     barray = QByteArray.fromBase64(data)
     pixmap.loadFromData(barray)
-    
+
     return pixmap
 
 
@@ -149,7 +144,7 @@
     """
     Module function to convert a pixmap to a byte array containing the pixmap
     as a PNG encoded as base64.
-    
+
     @param pixmap pixmap to be converted
     @type QPixmap
     @return byte array containing the pixmap
@@ -160,14 +155,14 @@
     buffer.open(QIODevice.OpenModeFlag.WriteOnly)
     if pixmap.save(buffer, "PNG"):
         return buffer.buffer().toBase64()
-    
+
     return QByteArray()
 
 
 def pixmapToDataUrl(pixmap, mimetype="image/png"):
     """
     Module function to convert a pixmap to a data: URL.
-    
+
     @param pixmap pixmap to be converted
     @type QPixmap
     @param mimetype MIME type to be used
@@ -186,10 +181,10 @@
     """
     Module function to load a pixmap file and convert the pixmap to a
     data: URL.
-    
+
     Note: If the given pixmap file path is not absolute, it is assumed to
     denote a pixmap file in the icons data directory.
-    
+
     @param pixmapFile file name of the pixmap file
     @type str
     @param asString flag indicating a string representation is requested
@@ -199,13 +194,13 @@
     """
     if not os.path.isabs(pixmapFile):
         pixmapFile = os.path.join(WebBrowserDataDirectory["icons"], pixmapFile)
-    
+
     mime = mimetypes.guess_type(pixmapFile, strict=False)[0]
     if mime is None:
         # assume PNG file
         mime = "image/png"
     url = pixmapToDataUrl(QPixmap(pixmapFile), mimetype=mime)
-    
+
     if asString:
         return url.toString()
     else:
@@ -216,78 +211,78 @@
     """
     Module function to extract the web engine related versions from the default
     user agent string.
-    
+
     Note: For PyQt 6.3.1 or newer the data is extracted via some Qt functions.
-    
+
     @return tuple containing the Chromium version, the Chromium security patch
         version and the QtWebEngine version
     @rtype tuple of (str, str, str)
     """
     try:
         from PyQt6.QtWebEngineCore import (
-            qWebEngineVersion, qWebEngineChromiumVersion,
-            qWebEngineChromiumSecurityPatchVersion
+            qWebEngineVersion,
+            qWebEngineChromiumVersion,
+            qWebEngineChromiumSecurityPatchVersion,
         )
+
         chromiumVersion = qWebEngineChromiumVersion()
         chromiumSecurityVersion = qWebEngineChromiumSecurityPatchVersion()
         webengineVersion = qWebEngineVersion()
     except ImportError:
         # backwards compatibility for PyQt < 6.3.1
         from PyQt6.QtWebEngineCore import QWebEngineProfile
-        
+
         useragent = QWebEngineProfile.defaultProfile().httpUserAgent()
         match = re.search(r"""Chrome/([\d.]+)""", useragent)
         chromiumVersion = (
             match.group(1)
-            if match else
-            QCoreApplication.translate("WebBrowserTools", "<unknown>")
+            if match
+            else QCoreApplication.translate("WebBrowserTools", "<unknown>")
         )
         match = re.search(r"""QtWebEngine/([\d.]+)""", useragent)
         webengineVersion = (
             match.group(1)
-            if match else
-            QCoreApplication.translate("WebBrowserTools", "<unknown>")
+            if match
+            else QCoreApplication.translate("WebBrowserTools", "<unknown>")
         )
         chromiumSecurityVersion = ""
         # not available via the user agent string
-    
+
     return (chromiumVersion, chromiumSecurityVersion, webengineVersion)
 
 
 def getHtmlPage(pageFileName):
     """
     Module function to load a HTML page.
-    
+
     Note: If the given HTML file path is not absolute, it is assumed to
     denote a HTML file in the html data directory.
-    
+
     @param pageFileName file name of the HTML file
     @type str
     @return HTML page
     @rtype str
     """
     if not os.path.isabs(pageFileName):
-        pageFileName = os.path.join(
-            WebBrowserDataDirectory["html"], pageFileName)
-    
+        pageFileName = os.path.join(WebBrowserDataDirectory["html"], pageFileName)
+
     return readAllFileContents(pageFileName)
 
 
 def getJavascript(jsFileName):
     """
     Module function to load a JavaScript source file.
-    
+
     Note: If the given JavaScript source file path is not absolute, it is
     assumed to denote a JavaScript source file in the javascript data
     directory.
-    
+
     @param jsFileName file name of the JavaScript source file
     @type str
     @return JavaScript source
     @rtype str
     """
     if not os.path.isabs(jsFileName):
-        jsFileName = os.path.join(
-            WebBrowserDataDirectory["js"], jsFileName)
-    
+        jsFileName = os.path.join(WebBrowserDataDirectory["js"], jsFileName)
+
     return readAllFileContents(jsFileName)
--- a/src/eric7/WebBrowser/Tools/WebHitTestResult.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/WebHitTestResult.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing an object for testing certain aspects of a web page.
     """
+
     def __init__(self, page, pos):
         """
         Constructor
-        
+
         @param page reference to the web page
         @type WebBrowserPage
         @param pos position to be tested
@@ -43,7 +44,7 @@
         self.__mediaUrl = QUrl()
         self.__tagName = ""
         self.__viewportPos = page.mapToViewport(pos)
-    
+
         script = """
             (function() {{
                 var e = document.elementFromPoint({0}, {1});
@@ -106,176 +107,176 @@
                 }}
                 return res;
             }})()
-        """.format(self.__viewportPos.x(), self.__viewportPos.y())
+        """.format(
+            self.__viewportPos.x(), self.__viewportPos.y()
+        )
         self.__populate(page.url(), page.execJavaScript(script))
-    
+
     def updateWithContextMenuData(self, data):
         """
         Public method to update the hit test data with data from the context
         menu event.
-        
+
         @param data context menu data
         @type QWebEngineContextMenuRequest
         """
         from PyQt6.QtWebEngineCore import QWebEngineContextMenuRequest
+
         if data.position() != self.__pos:
             return
-        
+
         self.__linkTitle = data.linkText()
         self.__linkUrl = data.linkUrl()
         self.__isContentEditable = data.isContentEditable()
         self.__isContentSelected = bool(data.selectedText())
-        
-        if (
-            data.mediaType() ==
-            QWebEngineContextMenuRequest.MediaType.MediaTypeImage
-        ):
+
+        if data.mediaType() == QWebEngineContextMenuRequest.MediaType.MediaTypeImage:
             self.__imageUrl = data.mediaUrl()
         elif data.mediaType() in [
             QWebEngineContextMenuRequest.MediaType.MediaTypeAudio,
-            QWebEngineContextMenuRequest.MediaType.MediaTypeVideo
+            QWebEngineContextMenuRequest.MediaType.MediaTypeVideo,
         ]:
             self.__mediaUrl = data.mediaUrl()
-    
+
     def baseUrl(self):
         """
         Public method to get the base URL of the page.
-        
+
         @return base URL
         @rtype QUrl
         """
         return self.__baseUrl
-    
+
     def alternateText(self):
         """
         Public method to get the alternate text.
-        
+
         @return alternate text
         @rtype str
         """
         return self.__alternateText
-    
+
     def boundingRect(self):
         """
         Public method to get the bounding rectangle.
-        
+
         @return bounding rectangle
         @rtype QRect
         """
         return QRect(self.__boundingRect)
-    
+
     def imageUrl(self):
         """
         Public method to get the URL of an image.
-        
+
         @return image URL
         @rtype QUrl
         """
         return self.__imageUrl
-    
+
     def isContentEditable(self):
         """
         Public method to check for editable content.
-        
+
         @return flag indicating editable content
         @rtype bool
         """
         return self.__isContentEditable
-    
+
     def isContentSelected(self):
         """
         Public method to check for selected content.
-        
+
         @return flag indicating selected content
         @rtype bool
         """
         return self.__isContentSelected
-    
+
     def isNull(self):
         """
         Public method to test, if the hit test is empty.
-        
+
         @return flag indicating an empty object
         @rtype bool
         """
         return self.__isNull
-    
+
     def linkTitle(self):
         """
         Public method to get the title for a link element.
-        
+
         @return title for a link element
         @rtype str
         """
         return self.__linkTitle
-    
+
     def linkUrl(self):
         """
         Public method to get the URL for a link element.
-        
+
         @return URL for a link element
         @rtype QUrl
         """
         return self.__linkUrl
-    
+
     def mediaUrl(self):
         """
         Public method to get the URL for a media element.
-        
+
         @return URL for a media element
         @rtype QUrl
         """
         return self.__mediaUrl
-    
+
     def mediaPaused(self):
         """
         Public method to check, if a media element is paused.
-        
+
         @return flag indicating a paused media element
         @rtype bool
         """
         return self.__isMediaPaused
-    
+
     def mediaMuted(self):
         """
         Public method to check, if a media element is muted.
-        
+
         @return flag indicating a muted media element
         @rtype bool
         """
         return self.__isMediaMuted
-    
+
     def pos(self):
         """
         Public method to get the position of the hit test.
-        
+
         @return position of hit test
         @rtype QPoint
         """
         return QPoint(self.__pos)
-    
+
     def viewportPos(self):
         """
         Public method to get the viewport position.
-        
+
         @return viewport position
         @rtype QPoint
         """
         return QPoint(self.__viewportPos)
-    
+
     def tagName(self):
         """
         Public method to get the name of the tested tag.
-        
+
         @return name of the tested tag
         @rtype str
         """
         return self.__tagName
-    
+
     def __populate(self, url, res):
         """
         Private method to populate the object.
-        
+
         @param url URL of the tested page
         @type QUrl
         @param res dictionary with result data from JavaScript
@@ -283,7 +284,7 @@
         """
         if not res:
             return
-        
+
         self.__baseUrl = QUrl(res["baseUrl"])
         self.__alternateText = res["alternateText"]
         self.__imageUrl = QUrl(res["imageUrl"])
@@ -295,12 +296,13 @@
         self.__isMediaPaused = res["mediaPaused"]
         self.__isMediaMuted = res["mediaMuted"]
         self.__tagName = res["tagName"]
-        
+
         rect = res["boundingRect"]
         if len(rect) == 4:
-            self.__boundingRect = QRect(int(rect[0]), int(rect[1]),
-                                        int(rect[2]), int(rect[3]))
-        
+            self.__boundingRect = QRect(
+                int(rect[0]), int(rect[1]), int(rect[2]), int(rect[3])
+            )
+
         if not self.__imageUrl.isEmpty():
             self.__imageUrl = url.resolved(self.__imageUrl)
         if not self.__linkUrl.isEmpty():
--- a/src/eric7/WebBrowser/Tools/WebIconDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/WebIconDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,10 +17,11 @@
     """
     Class implementing a dialog to manage the Favicons.
     """
+
     def __init__(self, iconsDB, parent=None):
         """
         Constructor
-        
+
         @param iconsDB icons database
         @type dict
         @param parent reference to the parent widget
@@ -28,47 +29,45 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         for url, icon in iconsDB.items():
             QListWidgetItem(icon, url, self.iconsList)
         self.iconsList.sortItems(Qt.SortOrder.AscendingOrder)
-        
+
         self.__setRemoveButtons()
-    
+
     def __setRemoveButtons(self):
         """
         Private method to set the state of the 'remove' buttons.
         """
         self.removeAllButton.setEnabled(self.iconsList.count() > 0)
         self.removeButton.setEnabled(len(self.iconsList.selectedItems()) > 0)
-    
+
     @pyqtSlot(QPoint)
     def on_iconsList_customContextMenuRequested(self, pos):
         """
         Private slot to show the context menu.
-        
+
         @param pos cursor position
         @type QPoint
         """
         menu = QMenu()
         menu.addAction(
-            self.tr("Remove Selected"),
-            self.on_removeButton_clicked).setEnabled(
-            len(self.iconsList.selectedItems()) > 0)
+            self.tr("Remove Selected"), self.on_removeButton_clicked
+        ).setEnabled(len(self.iconsList.selectedItems()) > 0)
         menu.addAction(
-            self.tr("Remove All"),
-            self.on_removeAllButton_clicked).setEnabled(
-            self.iconsList.count() > 0)
-        
+            self.tr("Remove All"), self.on_removeAllButton_clicked
+        ).setEnabled(self.iconsList.count() > 0)
+
         menu.exec(self.iconsList.mapToGlobal(pos))
-    
+
     @pyqtSlot()
     def on_iconsList_itemSelectionChanged(self):
         """
         Private slot handling the selection of entries.
         """
         self.__setRemoveButtons()
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -78,23 +77,23 @@
             row = self.iconsList.row(itm)
             self.iconsList.takeItem(row)
             del itm
-    
+
     @pyqtSlot()
     def on_removeAllButton_clicked(self):
         """
         Private slot to remove all entries.
         """
         self.iconsList.clear()
-    
+
     def getUrls(self):
         """
         Public method to get the list of URLs.
-        
+
         @return list of URLs
         @rtype list of str
         """
         urls = []
         for row in range(self.iconsList.count()):
             urls.append(self.iconsList.item(row).text())
-        
+
         return urls
--- a/src/eric7/WebBrowser/Tools/WebIconLoader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/WebIconLoader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -12,7 +12,8 @@
 from PyQt6.QtNetwork import QNetworkRequest, QSslConfiguration
 
 try:
-    from PyQt6.QtNetwork import QSslConfiguration     # __IGNORE_WARNING__
+    from PyQt6.QtNetwork import QSslConfiguration  # __IGNORE_WARNING__
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -23,33 +24,32 @@
 class WebIconLoader(QObject):
     """
     Class implementing a loader for web site icons.
-    
+
     @signal iconLoaded(icon) emitted when the icon has been loaded
     @signal sslConfiguration(config) emitted to pass the SSL data
     @signal clearSslConfiguration() emitted to clear stored SSL data
     """
+
     iconLoaded = pyqtSignal(QIcon)
     if SSL_AVAILABLE:
         sslConfiguration = pyqtSignal(QSslConfiguration)
         clearSslConfiguration = pyqtSignal()
-    
+
     def __init__(self, url, parent=None):
         """
         Constructor
-        
+
         @param url URL to fetch the icon from
         @type QUrl
         @param parent reference to the parent object
         @type QObject
         """
         super().__init__(parent)
-        
-        networkManager = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        networkManager = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         self.__reply = networkManager.get(QNetworkRequest(url))
         self.__reply.finished.connect(self.__finished)
-    
+
     @pyqtSlot()
     def __finished(self):
         """
@@ -59,13 +59,13 @@
         data = self.__reply.readAll()
         icon = QIcon(QPixmap.fromImage(QImage.fromData(data)))
         self.iconLoaded.emit(icon)
-        
+
         if SSL_AVAILABLE:
             if self.__reply.url().scheme().lower() == "https":
                 sslConfiguration = self.__reply.sslConfiguration()
                 self.sslConfiguration.emit(sslConfiguration)
             else:
                 self.clearSslConfiguration.emit()
-        
+
         self.__reply.deleteLater()
         self.__reply = None
--- a/src/eric7/WebBrowser/Tools/WebIconProvider.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/Tools/WebIconProvider.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 import os
 import contextlib
 
-from PyQt6.QtCore import (
-    pyqtSignal, QObject, QByteArray, QBuffer, QIODevice, QUrl
-)
+from PyQt6.QtCore import pyqtSignal, QObject, QByteArray, QBuffer, QIODevice, QUrl
 from PyQt6.QtGui import QIcon, QPixmap, QImage
 from PyQt6.QtWidgets import QDialog
 
@@ -25,51 +23,52 @@
 class WebIconProvider(QObject):
     """
     Class implementing a web site icon storage.
-    
+
     @signal changed() emitted to indicate a change of the icons database
     """
+
     changed = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__encoding = "iso-8859-1"
         self.__iconsFileName = "web_site_icons.json"
-        self.__iconDatabasePath = ""    # saving of icons disabled
-        
+        self.__iconDatabasePath = ""  # saving of icons disabled
+
         self.__iconsDB = {}
         self.__loaded = False
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
-    
+
     def setIconDatabasePath(self, path):
         """
         Public method to set the path for the web site icons store.
-        
+
         @param path path to store the icons file to
         @type str
         """
         if path != self.__iconDatabasePath:
             self.close()
-        
+
         self.__iconDatabasePath = path
-    
+
     def iconDatabasePath(self):
         """
         Public method o get the path for the web site icons store.
-        
+
         @return path to store the icons file to
         @rtype str
         """
         return self.__iconDatabasePath
-    
+
     def close(self):
         """
         Public method to close the web icon provider.
@@ -77,39 +76,42 @@
         self.__saveTimer.saveIfNeccessary()
         self.__loaded = False
         self.__iconsDB = {}
-    
+
     def load(self):
         """
         Public method to load the web site icons.
         """
         if self.__loaded:
             return
-        
+
         if self.__iconDatabasePath:
-            filename = os.path.join(self.__iconDatabasePath,
-                                    self.__iconsFileName)
+            filename = os.path.join(self.__iconDatabasePath, self.__iconsFileName)
             try:
                 with open(filename, "r") as f:
                     db = json.load(f)
             except OSError:
                 # ignore silentyl
                 db = {}
-            
+
             self.__iconsDB = {}
             for url, data in db.items():
-                self.__iconsDB[url] = QIcon(QPixmap.fromImage(QImage.fromData(
-                    QByteArray(data.encode(self.__encoding)))))
-        
+                self.__iconsDB[url] = QIcon(
+                    QPixmap.fromImage(
+                        QImage.fromData(QByteArray(data.encode(self.__encoding)))
+                    )
+                )
+
         self.__loaded = True
-    
+
     def save(self):
         """
         Public method to save the web site icons.
         """
         if not self.__loaded:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.isPrivate() and bool(self.__iconDatabasePath):
             db = {}
             for url, icon in self.__iconsDB.items():
@@ -118,52 +120,51 @@
                 buffer.open(QIODevice.OpenModeFlag.WriteOnly)
                 icon.pixmap(32).toImage().save(buffer, "PNG")
                 db[url] = bytes(buffer.data()).decode(self.__encoding)
-            
-            filename = os.path.join(self.__iconDatabasePath,
-                                    self.__iconsFileName)
+
+            filename = os.path.join(self.__iconDatabasePath, self.__iconsFileName)
             with contextlib.suppress(OSError), open(filename, "w") as f:
                 json.dump(db, f)
-    
+
     def saveIcon(self, view):
         """
         Public method to save a web site icon.
-        
+
         @param view reference to the view object
         @type WebBrowserView
         """
         scheme = view.url().scheme()
         if scheme in ["eric", "about", "qthelp", "file", "abp", "ftp"]:
             return
-        
+
         self.load()
-        
+
         if view.mainWindow().isPrivate():
             return
-        
+
         urlStr = self.__urlToString(view.url())
         self.__iconsDB[urlStr] = view.icon()
-        
+
         self.changed.emit()
-    
+
     def __urlToString(self, url):
         """
         Private method to convert an URL to a string.
-        
+
         @param url URL to be converted
         @type QUrl
         @return string representation of the URL
         @rtype str
         """
         return url.toString(
-            QUrl.UrlFormattingOption.RemoveUserInfo |
-            QUrl.UrlFormattingOption.RemoveFragment |
-            QUrl.UrlFormattingOption.RemovePath
+            QUrl.UrlFormattingOption.RemoveUserInfo
+            | QUrl.UrlFormattingOption.RemoveFragment
+            | QUrl.UrlFormattingOption.RemovePath
         )
-    
+
     def iconForUrl(self, url):
         """
         Public method to get an icon for an URL.
-        
+
         @param url URL to get icon for
         @type QUrl
         @return icon for the URL
@@ -177,14 +178,14 @@
             "abp": "adBlockPlus",
             "ftp": "network-server",
         }
-        
+
         scheme = url.scheme()
         iconName = scheme2iconName.get(scheme)
         if iconName:
             return UI.PixmapCache.getIcon(iconName)
-        
+
         self.load()
-        
+
         urlStr = self.__urlToString(url)
         if urlStr in self.__iconsDB:
             return self.__iconsDB[urlStr]
@@ -192,7 +193,7 @@
             for iconUrlStr in self.__iconsDB:
                 if iconUrlStr.startswith(urlStr):
                     return self.__iconsDB[iconUrlStr]
-        
+
         # try replacing http scheme with https scheme
         url = QUrl(url)
         if url.scheme() == "http":
@@ -204,12 +205,12 @@
                 for iconUrlStr in self.__iconsDB:
                     if iconUrlStr.startswith(urlStr):
                         return self.__iconsDB[iconUrlStr]
-        
+
         if scheme == "https":
             return UI.PixmapCache.getIcon("securityHigh32")
         else:
             return UI.PixmapCache.getIcon("defaultIcon")
-    
+
     def clear(self):
         """
         Public method to clear the icons cache.
@@ -218,14 +219,15 @@
         self.__iconsDB = {}
         self.changed.emit()
         self.__saveTimer.saveIfNeccessary()
-    
+
     def showWebIconDialog(self):
         """
         Public method to show a dialog to manage the Favicons.
         """
         self.load()
-        
+
         from .WebIconDialog import WebIconDialog
+
         dlg = WebIconDialog(self.__iconsDB)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             changed = False
@@ -245,13 +247,13 @@
     """
     Global function to get a reference to the web icon provider and create it,
     if it hasn't been yet.
-    
+
     @return reference to the web icon provider object
     @rtype WebIconProvider
     """
     global _WebIconProvider
-    
+
     if _WebIconProvider is None:
         _WebIconProvider = WebIconProvider()
-    
+
     return _WebIconProvider
--- a/src/eric7/WebBrowser/UrlBar/BookmarkActionSelectionDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/BookmarkActionSelectionDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,46 +21,46 @@
     Class implementing a dialog to select the action to be performed on
     the bookmark.
     """
+
     Undefined = -1
     AddBookmark = 0
     EditBookmark = 1
     AddSpeeddial = 2
     RemoveSpeeddial = 3
-    
+
     def __init__(self, url, parent=None):
         """
         Constructor
-        
+
         @param url URL to be worked on (QUrl)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__action = self.Undefined
-        
+
         self.icon.setPixmap(UI.PixmapCache.getPixmap("bookmark32"))
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
-        
+
         if WebBrowserWindow.bookmarksManager().bookmarkForUrl(url) is None:
             self.__bmAction = self.AddBookmark
             self.bookmarkPushButton.setText(self.tr("Add Bookmark"))
         else:
             self.__bmAction = self.EditBookmark
             self.bookmarkPushButton.setText(self.tr("Edit Bookmark"))
-        
+
         if WebBrowserWindow.speedDial().pageForUrl(url).url:
             self.__sdAction = self.RemoveSpeeddial
-            self.speeddialPushButton.setText(
-                self.tr("Remove from Speed Dial"))
+            self.speeddialPushButton.setText(self.tr("Remove from Speed Dial"))
         else:
             self.__sdAction = self.AddSpeeddial
             self.speeddialPushButton.setText(self.tr("Add to Speed Dial"))
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def on_bookmarkPushButton_clicked(self):
         """
@@ -68,7 +68,7 @@
         """
         self.__action = self.__bmAction
         self.accept()
-    
+
     @pyqtSlot()
     def on_speeddialPushButton_clicked(self):
         """
@@ -76,11 +76,11 @@
         """
         self.__action = self.__sdAction
         self.accept()
-    
+
     def getAction(self):
         """
         Public method to get the selected action.
-        
+
         @return reference to the associated action
         """
         return self.__action
--- a/src/eric7/WebBrowser/UrlBar/BookmarkInfoDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/BookmarkInfoDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,52 +20,55 @@
     """
     Class implementing a dialog to show some bookmark info.
     """
+
     def __init__(self, bookmark, parent=None):
         """
         Constructor
-        
+
         @param bookmark reference to the bookmark to be shown (Bookmark)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__bookmark = bookmark
-        
+
         self.icon.setPixmap(UI.PixmapCache.getPixmap("bookmark32"))
-        
+
         font = QFont()
         font.setPointSize(font.pointSize() + 2)
         self.title.setFont(font)
-        
+
         if bookmark is None:
             self.titleEdit.setEnabled(False)
         else:
             self.titleEdit.setText(bookmark.title)
             self.titleEdit.setFocus()
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
         Private slot to remove the current bookmark.
         """
         import WebBrowser.WebBrowserWindow
-        (WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
-            .removeBookmark(self.__bookmark))
+
+        bm = WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
+        bm.removeBookmark(self.__bookmark)
         self.close()
-    
+
     def accept(self):
         """
         Public slot handling the acceptance of the dialog.
         """
         if (
-            self.__bookmark is not None and
-            self.titleEdit.text() != self.__bookmark.title
+            self.__bookmark is not None
+            and self.titleEdit.text() != self.__bookmark.title
         ):
             import WebBrowser.WebBrowserWindow
-            (WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
-                .setTitle(self.__bookmark, self.titleEdit.text()))
+
+            bm = WebBrowser.WebBrowserWindow.WebBrowserWindow.bookmarksManager()
+            bm.setTitle(self.__bookmark, self.titleEdit.text())
         self.close()
--- a/src/eric7/WebBrowser/UrlBar/FavIconLabel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/FavIconLabel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,81 +16,82 @@
     """
     Class implementing the label to show the web site icon.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.__browser = None
         self.__dragStartPos = QPoint()
-        
+
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
         self.setCursor(Qt.CursorShape.ArrowCursor)
         self.setMinimumSize(16, 16)
         self.resize(16, 16)
-        
+
         self.__browserIconChanged()
-    
+
     def __browserIconChanged(self):
         """
         Private slot to set the icon.
         """
         if self.__browser:
-            self.setPixmap(
-                self.__browser.icon().pixmap(16, 16))
-    
+            self.setPixmap(self.__browser.icon().pixmap(16, 16))
+
     def __clearIcon(self):
         """
         Private slot to clear the icon.
         """
         self.setPixmap(QPixmap())
-    
+
     def setBrowser(self, browser):
         """
         Public method to set the browser connection.
-        
+
         @param browser reference to the browser widegt (HelpBrowser)
         """
         self.__browser = browser
         self.__browser.loadFinished.connect(self.__browserIconChanged)
         self.__browser.faviconChanged.connect(self.__browserIconChanged)
         self.__browser.loadStarted.connect(self.__clearIcon)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse press events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__dragStartPos = evt.position().toPoint()
         super().mousePressEvent(evt)
-    
+
     def mouseReleaseEvent(self, evt):
         """
         Protected method to handle mouse release events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.LeftButton:
             self.__showPopup(evt.globalPosition().toPoint())
         super().mouseReleaseEvent(evt)
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if (
-            evt.button() == Qt.MouseButton.LeftButton and (
-                (evt.position().toPoint() -
-                 self.__dragStartPos).manhattanLength() >
-                QApplication.startDragDistance()
-            ) and self.__browser is not None
+            evt.button() == Qt.MouseButton.LeftButton
+            and (
+                (evt.position().toPoint() - self.__dragStartPos).manhattanLength()
+                > QApplication.startDragDistance()
+            )
+            and self.__browser is not None
         ):
             drag = QDrag(self)
             mimeData = QMimeData()
@@ -104,20 +105,20 @@
                 drag.setPixmap(p)
             drag.setMimeData(mimeData)
             drag.exec()
-    
+
     def __showPopup(self, pos):
         """
         Private method to show the site info popup.
-        
+
         @param pos position the popup should be shown at
         @type QPoint
         """
         if self.__browser is None:
             return
-        
+
         url = self.__browser.url()
-        if url.isValid() and url.scheme() not in [
-                "eric", "about", "data", "chrome"]:
+        if url.isValid() and url.scheme() not in ["eric", "about", "data", "chrome"]:
             from ..SiteInfo.SiteInfoWidget import SiteInfoWidget
+
             info = SiteInfoWidget(self.__browser, self)
             info.showAt(pos)
--- a/src/eric7/WebBrowser/UrlBar/SslLabel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/SslLabel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,23 +16,24 @@
     """
     Class implementing the label to show some SSL info (if available).
     """
+
     okStyle = "QLabel { color : white; background-color : green; }"
     nokStyle = "QLabel { color : white; background-color : red; }"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
+
         self.setFocusPolicy(Qt.FocusPolicy.NoFocus)
-    
+
     def setValidity(self, valid):
         """
         Public method to set the validity indication.
-        
+
         @param valid flag indicating the certificate validity (boolean)
         """
         if valid:
--- a/src/eric7/WebBrowser/UrlBar/StackedUrlBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/StackedUrlBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,53 +14,55 @@
     """
     Class implementing a widget to stack URL bars.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
-        
-        sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding,
-                                 QSizePolicy.Policy.Preferred)
+
+        sizePolicy = QSizePolicy(
+            QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred
+        )
         sizePolicy.setHorizontalStretch(6)
         sizePolicy.setVerticalStretch(0)
         self.setSizePolicy(sizePolicy)
         self.setMinimumSize(200, 22)
-    
+
     def currentUrlBar(self):
         """
         Public method to get a reference to the current URL bar.
-        
+
         @return reference to the current URL bar (UrlBar)
         """
         return self.urlBar(self.currentIndex())
-    
+
     def urlBar(self, index):
         """
         Public method to get a reference to the URL bar for a given index.
-        
+
         @param index index of the url bar (integer)
         @return reference to the URL bar for the given index (UrlBar)
         """
         return self.widget(index)
-    
+
     def moveBar(self, from_, to_):
         """
         Public slot to move an URL bar.
-        
+
         @param from_ index of URL bar to be moved (integer)
         @param to_ index to move the URL bar to (integer)
         """
         fromBar = self.widget(from_)
         self.removeWidget(fromBar)
         self.insertWidget(to_, fromBar)
-    
+
     def urlBars(self):
         """
         Public method to get a list of references to all URL bars.
-        
+
         @return list of references to URL bars (list of UrlBar)
         """
         urlBars = []
--- a/src/eric7/WebBrowser/UrlBar/UrlBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UrlBar/UrlBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,10 +11,11 @@
 from PyQt6.QtGui import QColor, QPalette, QIcon
 from PyQt6.QtWidgets import QDialog, QApplication, QLineEdit
 from PyQt6.QtWebEngineCore import QWebEnginePage
+
 try:
-    from PyQt6.QtNetwork import QSslCertificate     # __IGNORE_EXCEPTION__
+    from PyQt6.QtNetwork import QSslCertificate  # __IGNORE_EXCEPTION__
 except ImportError:
-    QSslCertificate = None      # __IGNORE_WARNING__
+    QSslCertificate = None  # __IGNORE_WARNING__
 
 from EricWidgets.EricLineEdit import EricClearableLineEdit, EricLineEditSide
 
@@ -34,10 +35,11 @@
     """
     Class implementing a line edit for entering URLs.
     """
+
     def __init__(self, mainWindow, parent=None):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window
         @type WebBrowserWindow
         @param parent reference to the parent widget
@@ -46,97 +48,93 @@
         super().__init__(parent)
         self.setPlaceholderText(self.tr("Enter the URL here."))
         self.setWhatsThis(self.tr("Enter the URL here."))
-        
+
         self.__mw = mainWindow
         self.__browser = None
         self.__privateMode = WebBrowserWindow.isPrivate()
-        
+
         self.__bmActiveIcon = UI.PixmapCache.getIcon("bookmark16")
         self.__bmInactiveIcon = QIcon(
-            self.__bmActiveIcon.pixmap(16, 16, QIcon.Mode.Disabled))
-        
+            self.__bmActiveIcon.pixmap(16, 16, QIcon.Mode.Disabled)
+        )
+
         self.__safeBrowsingLabel = SafeBrowsingLabel(self)
         self.addWidget(self.__safeBrowsingLabel, EricLineEditSide.LEFT)
         self.__safeBrowsingLabel.setVisible(False)
-        
+
         self.__favicon = FavIconLabel(self)
         self.addWidget(self.__favicon, EricLineEditSide.LEFT)
-        
+
         self.__sslLabel = SslLabel(self)
         self.addWidget(self.__sslLabel, EricLineEditSide.LEFT)
         self.__sslLabel.setVisible(False)
-        
+
         self.__rssAction = self.addAction(
-            UI.PixmapCache.getIcon("rss16"),
-            QLineEdit.ActionPosition.TrailingPosition)
+            UI.PixmapCache.getIcon("rss16"), QLineEdit.ActionPosition.TrailingPosition
+        )
         self.__rssAction.setVisible(False)
-        
+
         self.__bookmarkAction = self.addAction(
-            self.__bmInactiveIcon,
-            QLineEdit.ActionPosition.TrailingPosition)
+            self.__bmInactiveIcon, QLineEdit.ActionPosition.TrailingPosition
+        )
         self.__bookmarkAction.setVisible(False)
-        
+
         self.__safeBrowsingLabel.clicked.connect(self.__showThreatInfo)
         self.__bookmarkAction.triggered.connect(self.__showBookmarkInfo)
         self.__rssAction.triggered.connect(self.__rssTriggered)
-        
-        self.__mw.bookmarksManager().entryChanged.connect(
-            self.__bookmarkChanged)
-        self.__mw.bookmarksManager().entryAdded.connect(
-            self.__bookmarkChanged)
-        self.__mw.bookmarksManager().entryRemoved.connect(
-            self.__bookmarkChanged)
-        self.__mw.speedDial().pagesChanged.connect(
-            self.__bookmarkChanged)
-    
+
+        self.__mw.bookmarksManager().entryChanged.connect(self.__bookmarkChanged)
+        self.__mw.bookmarksManager().entryAdded.connect(self.__bookmarkChanged)
+        self.__mw.bookmarksManager().entryRemoved.connect(self.__bookmarkChanged)
+        self.__mw.speedDial().pagesChanged.connect(self.__bookmarkChanged)
+
     def setBrowser(self, browser):
         """
         Public method to set the browser connection.
-        
+
         @param browser reference to the browser widget
         @type WebBrowserView
         """
         self.__browser = browser
         self.__favicon.setBrowser(browser)
-        
+
         self.__browser.urlChanged.connect(self.__browserUrlChanged)
         self.__browser.loadProgress.connect(self.__loadProgress)
         self.__browser.loadFinished.connect(self.__loadFinished)
         self.__browser.loadStarted.connect(self.__loadStarted)
-        
-        self.__browser.safeBrowsingBad.connect(
-            self.__safeBrowsingLabel.setThreatInfo)
-        
+
+        self.__browser.safeBrowsingBad.connect(self.__safeBrowsingLabel.setThreatInfo)
+
         self.__sslLabel.clicked.connect(self.__browser.page().showSslInfo)
         self.__browser.page().sslConfigurationChanged.connect(
-            self.__sslConfigurationChanged)
-    
+            self.__sslConfigurationChanged
+        )
+
     def browser(self):
         """
         Public method to get the associated browser.
-       
+
         @return reference to the associated browser
         @rtype WebBrowserView
         """
         return self.__browser
-    
+
     @pyqtSlot(QUrl)
     def __browserUrlChanged(self, url):
         """
         Private slot to handle a URL change of the associated browser.
-        
+
         @param url new URL of the browser
         @type QUrl
         """
         strUrl = url.toString()
-        if strUrl in ["eric:speeddial", "eric:home",
-                      "about:blank", "about:config"]:
+        if strUrl in ["eric:speeddial", "eric:home", "about:blank", "about:config"]:
             strUrl = ""
-        
+
         if self.text() != strUrl:
             self.setText(strUrl)
         self.setCursorPosition(0)
-    
+
     @pyqtSlot()
     def __checkBookmark(self):
         """
@@ -147,14 +145,16 @@
             self.__bookmarkAction.setIcon(self.__bmActiveIcon)
             bookmarks = manager.bookmarksForUrl(self.__browser.url())
             from WebBrowser.Bookmarks.BookmarkNode import BookmarkNode
+
             for bookmark in bookmarks:
-                manager.setTimestamp(bookmark, BookmarkNode.TsVisited,
-                                     QDateTime.currentDateTime())
+                manager.setTimestamp(
+                    bookmark, BookmarkNode.TsVisited, QDateTime.currentDateTime()
+                )
         elif self.__mw.speedDial().pageForUrl(self.__browser.url()).url != "":
             self.__bookmarkAction.setIcon(self.__bmActiveIcon)
         else:
             self.__bookmarkAction.setIcon(self.__bmInactiveIcon)
-    
+
     @pyqtSlot()
     def __loadStarted(self):
         """
@@ -163,57 +163,52 @@
         self.__bookmarkAction.setVisible(False)
         self.__rssAction.setVisible(False)
         self.__sslLabel.setVisible(False)
-    
+
     @pyqtSlot(int)
     def __loadProgress(self, progress):
         """
         Private slot to track the load progress.
-        
+
         @param progress load progress in percent
         @type int
         """
         foregroundColor = QApplication.palette().color(QPalette.ColorRole.Text)
-        
+
         backgroundColor = (
             Preferences.getWebBrowser("PrivateModeUrlColor")
-            if self.__privateMode else
-            QApplication.palette().color(QPalette.ColorRole.Base)
+            if self.__privateMode
+            else QApplication.palette().color(QPalette.ColorRole.Base)
         )
-        
+
         if not self.__browser.getSafeBrowsingStatus():
             # malicious web site
-            backgroundColor = Preferences.getWebBrowser(
-                "MaliciousUrlColor")
+            backgroundColor = Preferences.getWebBrowser("MaliciousUrlColor")
         elif self.__browser.url().scheme() == "https":
             if WebBrowserWindow.networkManager().isInsecureHost(
                 self.__browser.url().host()
             ):
-                backgroundColor = Preferences.getWebBrowser(
-                    "InsecureUrlColor")
+                backgroundColor = Preferences.getWebBrowser("InsecureUrlColor")
             else:
-                backgroundColor = Preferences.getWebBrowser(
-                    "SecureUrlColor")
-        
+                backgroundColor = Preferences.getWebBrowser("SecureUrlColor")
+
         if progress in (0, 100):
             styleSheet = (
                 f"color: {foregroundColor.name()}; "
                 f"background-color: {backgroundColor.name()};"
             )
         else:
-            highlight = QApplication.palette().color(
-                QPalette.ColorRole.Highlight)
+            highlight = QApplication.palette().color(QPalette.ColorRole.Highlight)
             r = (highlight.red() + 2 * backgroundColor.red()) // 3
             g = (highlight.green() + 2 * backgroundColor.green()) // 3
             b = (highlight.blue() + 2 * backgroundColor.blue()) // 3
-            
+
             loadingColor = QColor(r, g, b)
-            if abs(loadingColor.lightness() -
-                    backgroundColor.lightness()) < 20:
+            if abs(loadingColor.lightness() - backgroundColor.lightness()) < 20:
                 r = (2 * highlight.red() + backgroundColor.red()) // 3
                 g = (2 * highlight.green() + backgroundColor.green()) // 3
                 b = (2 * highlight.blue() + backgroundColor.blue()) // 3
                 loadingColor = QColor(r, g, b)
-            
+
             styleSheet = (
                 f"color: {foregroundColor.name()}; "
                 f"background-color: qlineargradient("
@@ -223,15 +218,15 @@
                 f"stop: {progress / 100.0 + 0.001} {backgroundColor.name()}, "
                 f"stop: 1 {backgroundColor.name()});"
             )
-        
+
         self.setStyleSheet(styleSheet)
         self.repaint()
-    
+
     @pyqtSlot(bool)
     def __loadFinished(self, ok):
         """
         Private slot to set some data after the page was loaded.
-        
+
         @param ok flag indicating a successful load
         @type bool
         """
@@ -240,29 +235,27 @@
         else:
             self.__checkBookmark()
             self.__bookmarkAction.setVisible(True)
-        
+
         self.__browserUrlChanged(self.__browser.url())
-        self.__safeBrowsingLabel.setVisible(
-            not self.__browser.getSafeBrowsingStatus())
-        
+        self.__safeBrowsingLabel.setVisible(not self.__browser.getSafeBrowsingStatus())
+
         if ok:
             QTimer.singleShot(0, self.__setRssButton)
-    
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.update()
-    
+
     @pyqtSlot()
     def __showBookmarkInfo(self):
         """
         Private slot to show a dialog with some bookmark info.
         """
-        from .BookmarkActionSelectionDialog import (
-            BookmarkActionSelectionDialog
-        )
+        from .BookmarkActionSelectionDialog import BookmarkActionSelectionDialog
+
         url = self.__browser.url()
         dlg = BookmarkActionSelectionDialog(url)
         if dlg.exec() == QDialog.DialogCode.Accepted:
@@ -270,56 +263,54 @@
             if action == BookmarkActionSelectionDialog.AddBookmark:
                 self.__browser.addBookmark()
             elif action == BookmarkActionSelectionDialog.EditBookmark:
-                bookmark = (
-                    self.__mw.bookmarksManager().bookmarkForUrl(url)
-                )
+                bookmark = self.__mw.bookmarksManager().bookmarkForUrl(url)
                 from .BookmarkInfoDialog import BookmarkInfoDialog
+
                 dlg = BookmarkInfoDialog(bookmark, self.__browser)
                 dlg.exec()
             elif action == BookmarkActionSelectionDialog.AddSpeeddial:
-                self.__mw.speedDial().addPage(
-                    url, self.__browser.title())
+                self.__mw.speedDial().addPage(url, self.__browser.title())
             elif action == BookmarkActionSelectionDialog.RemoveSpeeddial:
                 self.__mw.speedDial().removePage(url)
-    
+
     @pyqtSlot()
     def __bookmarkChanged(self):
         """
         Private slot to handle bookmark or speed dial changes.
         """
         self.__checkBookmark()
-    
+
     def focusOutEvent(self, evt):
         """
         Protected method to handle focus out event.
-        
+
         @param evt reference to the focus event
         @type QFocusEvent
         """
         if self.text() == "" and self.__browser is not None:
             self.__browserUrlChanged(self.__browser.url())
         super().focusOutEvent(evt)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
         if evt.button() == Qt.MouseButton.XButton1:
-            self.__mw.currentBrowser().triggerPageAction(
-                QWebEnginePage.WebAction.Back)
+            self.__mw.currentBrowser().triggerPageAction(QWebEnginePage.WebAction.Back)
         elif evt.button() == Qt.MouseButton.XButton2:
             self.__mw.currentBrowser().triggerPageAction(
-                QWebEnginePage.WebAction.Forward)
+                QWebEnginePage.WebAction.Forward
+            )
         else:
             super().mousePressEvent(evt)
-    
+
     def mouseDoubleClickEvent(self, evt):
         """
         Protected method to handle mouse double click events.
-        
+
         @param evt reference to the mouse event
         @type QMouseEvent
         """
@@ -327,42 +318,38 @@
             self.selectAll()
         else:
             super().mouseDoubleClickEvent(evt)
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key presses.
-        
+
         @param evt reference to the key press event
         @type QKeyEvent
         """
         if evt.key() == Qt.Key.Key_Escape:
             if self.__browser is not None:
-                self.setText(
-                    str(self.__browser.url().toEncoded(), encoding="utf-8"))
+                self.setText(str(self.__browser.url().toEncoded(), encoding="utf-8"))
                 self.selectAll()
             completer = self.completer()
             if completer:
                 completer.popup().hide()
             return
-        
+
         currentText = self.text().strip()
-        if (
-            evt.key() in [Qt.Key.Key_Enter, Qt.Key.Key_Return] and
-            not currentText.lower().startswith(("http://", "https://"))
-        ):
+        if evt.key() in [
+            Qt.Key.Key_Enter,
+            Qt.Key.Key_Return,
+        ] and not currentText.lower().startswith(("http://", "https://")):
             append = ""
             if evt.modifiers() == Qt.KeyboardModifier.ControlModifier:
                 append = ".com"
-            elif (
-                evt.modifiers() == (
-                    Qt.KeyboardModifier.ControlModifier |
-                    Qt.KeyboardModifier.ShiftModifier
-                )
+            elif evt.modifiers() == (
+                Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier
             ):
                 append = ".org"
             elif evt.modifiers() == Qt.KeyboardModifier.ShiftModifier:
                 append = ".net"
-            
+
             if append != "":
                 url = QUrl("http://www." + currentText)
                 host = url.host()
@@ -370,80 +357,83 @@
                     host += append
                     url.setHost(host)
                     self.setText(url.toString())
-        
+
         super().keyPressEvent(evt)
-    
+
     def dragEnterEvent(self, evt):
         """
         Protected method to handle drag enter events.
-        
+
         @param evt reference to the drag enter event
         @type QDragEnterEvent
         """
         mimeData = evt.mimeData()
         if mimeData.hasUrls() or mimeData.hasText():
             evt.acceptProposedAction()
-        
+
         super().dragEnterEvent(evt)
-    
+
     def dropEvent(self, evt):
         """
         Protected method to handle drop events.
-        
+
         @param evt reference to the drop event
         @type QDropEvent
         """
         mimeData = evt.mimeData()
-        
+
         url = QUrl()
         if mimeData.hasUrls():
             url = mimeData.urls()[0]
         elif mimeData.hasText():
-            url = QUrl.fromEncoded(mimeData.text().encode("utf-8"),
-                                   QUrl.ParsingMode.TolerantMode)
-        
+            url = QUrl.fromEncoded(
+                mimeData.text().encode("utf-8"), QUrl.ParsingMode.TolerantMode
+            )
+
         if url.isEmpty() or not url.isValid():
             super().dropEvent(evt)
             return
-        
+
         self.setText(str(url.toEncoded(), encoding="utf-8"))
         self.selectAll()
-        
+
         evt.acceptProposedAction()
-    
+
     @pyqtSlot()
     def __setRssButton(self):
         """
         Private slot to show the RSS button.
         """
         self.__rssAction.setVisible(self.__browser.checkRSS())
-    
+
     @pyqtSlot()
     def __rssTriggered(self):
         """
         Private slot to handle clicking the RSS icon.
         """
         from WebBrowser.Feeds.FeedsDialog import FeedsDialog
+
         feeds = self.__browser.getRSS()
         dlg = FeedsDialog(feeds, self.__browser)
         dlg.exec()
-    
+
     @pyqtSlot(QPoint)
     def __showThreatInfo(self, pos):
         """
         Private slot to show the threat info widget.
-        
+
         @param pos position to show the info at
         @type QPoint
         """
         threatInfo = self.__safeBrowsingLabel.getThreatInfo()
         if threatInfo:
             from WebBrowser.SafeBrowsing.SafeBrowsingInfoWidget import (
-                SafeBrowsingInfoWidget
+                SafeBrowsingInfoWidget,
             )
+
             widget = SafeBrowsingInfoWidget(threatInfo, self.__browser)
             widget.showAt(pos)
-    
+
     @pyqtSlot()
     def __sslConfigurationChanged(self):
         """
@@ -454,13 +444,21 @@
         if sslConfiguration is not None and QSslCertificate is not None:
             sslCertificate = self.__browser.page().getSslCertificate()
             if sslCertificate is not None:
-                org = Utilities.decodeString(", ".join(
-                    sslCertificate.subjectInfo(
-                        QSslCertificate.SubjectInfo.Organization)))
+                org = Utilities.decodeString(
+                    ", ".join(
+                        sslCertificate.subjectInfo(
+                            QSslCertificate.SubjectInfo.Organization
+                        )
+                    )
+                )
                 if org == "":
-                    cn = Utilities.decodeString(", ".join(
-                        sslCertificate.subjectInfo(
-                            QSslCertificate.SubjectInfo.CommonName)))
+                    cn = Utilities.decodeString(
+                        ", ".join(
+                            sslCertificate.subjectInfo(
+                                QSslCertificate.SubjectInfo.CommonName
+                            )
+                        )
+                    )
                     if cn != "":
                         org = cn.split(".", 1)[1]
                     if org == "":
--- a/src/eric7/WebBrowser/UserAgent/UserAgentManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,46 +20,49 @@
 class UserAgentManager(QObject):
     """
     Class implementing a user agent manager.
-    
+
     @signal changed() emitted to indicate a change
     @signal userAgentSettingsSaved() emitted after the user agent settings
         were saved
     """
+
     changed = pyqtSignal()
     userAgentSettingsSaved = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__agents = {}
         # dictionary with agent strings indexed by host name
         self.__loaded = False
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
-    
+
     def getFileName(self):
         """
         Public method to get the file name of the user agents file.
-        
+
         @return name of the user agents file (string)
         """
         return os.path.join(
-            Utilities.getConfigDir(), "web_browser", "userAgentSettings.xml")
-    
+            Utilities.getConfigDir(), "web_browser", "userAgentSettings.xml"
+        )
+
     def save(self):
         """
         Public slot to save the user agent entries to disk.
         """
         if not self.__loaded:
             return
-        
+
         from .UserAgentWriter import UserAgentWriter
+
         agentFile = self.getFileName()
         writer = UserAgentWriter()
         if not writer.write(agentFile, self.__agents):
@@ -67,124 +70,128 @@
                 None,
                 self.tr("Saving user agent data"),
                 self.tr(
-                    """<p>User agent data could not be saved to"""
-                    """ <b>{0}</b></p>""").format(agentFile))
+                    """<p>User agent data could not be saved to""" """ <b>{0}</b></p>"""
+                ).format(agentFile),
+            )
         else:
             self.userAgentSettingsSaved.emit()
-    
+
     def __load(self):
         """
         Private method to load the saved user agent settings.
         """
         agentFile = self.getFileName()
         from .UserAgentReader import UserAgentReader
+
         reader = UserAgentReader()
         self.__agents = reader.read(agentFile)
         if reader.error() != QXmlStreamReader.Error.NoError:
             EricMessageBox.warning(
                 None,
                 self.tr("Loading user agent data"),
-                self.tr("""Error when loading user agent data on"""
-                        """ line {0}, column {1}:\n{2}""")
-                .format(reader.lineNumber(),
-                        reader.columnNumber(),
-                        reader.errorString()))
-        
+                self.tr(
+                    """Error when loading user agent data on"""
+                    """ line {0}, column {1}:\n{2}"""
+                ).format(
+                    reader.lineNumber(), reader.columnNumber(), reader.errorString()
+                ),
+            )
+
         self.__loaded = True
-    
+
     def reload(self):
         """
         Public method to reload the user agent settings.
         """
         if not self.__loaded:
             return
-        
+
         self.__agents = {}
         self.__load()
-    
+
     def close(self):
         """
         Public method to close the user agents manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def removeUserAgent(self, host):
         """
         Public method to remove a user agent entry.
-        
+
         @param host host name (string)
         """
         if host in self.__agents:
             del self.__agents[host]
             self.changed.emit()
-    
+
     def allHostNames(self):
         """
         Public method to get a list of all host names we a user agent setting
         for.
-        
+
         @return sorted list of all host names (list of strings)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return sorted(self.__agents.keys())
-    
+
     def hostsCount(self):
         """
         Public method to get the number of available user agent settings.
-        
+
         @return number of user agent settings (integer)
         """
         if not self.__loaded:
             self.__load()
-        
+
         return len(self.__agents)
-    
+
     def userAgent(self, host):
         """
         Public method to get the user agent setting for a host.
-        
+
         @param host host name (string)
         @return user agent string (string)
         """
         if not self.__loaded:
             self.__load()
-        
+
         for agentHost in self.__agents:
             if host.endswith(agentHost):
                 return self.__agents[agentHost]
-        
+
         return ""
-    
+
     def setUserAgent(self, host, agent):
         """
         Public method to set the user agent string for a host.
-        
+
         @param host host name (string)
         @param agent user agent string (string)
         """
         if host != "" and agent != "":
             self.__agents[host] = agent
             self.changed.emit()
-    
+
     def userAgentForUrl(self, url):
         """
         Public method to determine the user agent for the given URL.
-        
+
         @param url URL to determine user agent for (QUrl)
         @return user agent string (string)
         """
         if url.isValid():
             host = url.host()
             return self.userAgent(host)
-        
+
         return ""
-    
+
     def setUserAgentForUrl(self, url, agent):
         """
         Public method to set the user agent string for an URL.
-        
+
         @param url URL to register user agent setting for (QUrl)
         @param agent new current user agent string (string)
         """
--- a/src/eric7/WebBrowser/UserAgent/UserAgentMenu.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentMenu.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,66 +21,67 @@
     """
     Class implementing a menu to select the user agent string.
     """
+
     def __init__(self, title, url=None, parent=None):
         """
         Constructor
-        
+
         @param title title of the menu (string)
         @param url URL to set user agent for (QUrl)
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(title, parent)
-        
+
         self.__manager = None
         self.__url = url
         if self.__url:
             if self.__url.isValid():
                 from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
                 self.__manager = WebBrowserWindow.userAgentsManager()
             else:
                 self.__url = None
-        
+
         self.aboutToShow.connect(self.__populateMenu)
-    
+
     def __populateMenu(self):
         """
         Private slot to populate the menu.
         """
         self.aboutToShow.disconnect(self.__populateMenu)
-        
+
         self.__actionGroup = QActionGroup(self)
-        
+
         # add default action
         self.__defaultUserAgent = QAction(self)
         self.__defaultUserAgent.setText(self.tr("Default"))
         self.__defaultUserAgent.setCheckable(True)
-        self.__defaultUserAgent.triggered.connect(
-            self.__switchToDefaultUserAgent)
+        self.__defaultUserAgent.triggered.connect(self.__switchToDefaultUserAgent)
         if self.__url:
             self.__defaultUserAgent.setChecked(
-                self.__manager.userAgentForUrl(self.__url) == "")
+                self.__manager.userAgentForUrl(self.__url) == ""
+            )
         else:
             from WebBrowser.WebBrowserPage import WebBrowserPage
-            self.__defaultUserAgent.setChecked(
-                WebBrowserPage.userAgent() == "")
+
+            self.__defaultUserAgent.setChecked(WebBrowserPage.userAgent() == "")
         self.addAction(self.__defaultUserAgent)
         self.__actionGroup.addAction(self.__defaultUserAgent)
         isChecked = self.__defaultUserAgent.isChecked()
-        
+
         # add default extra user agents
         isChecked = self.__addDefaultActions() or isChecked
-        
+
         # add other action
         self.addSeparator()
         self.__otherUserAgent = QAction(self)
         self.__otherUserAgent.setText(self.tr("Other..."))
         self.__otherUserAgent.setCheckable(True)
-        self.__otherUserAgent.triggered.connect(
-            self.__switchToOtherUserAgent)
+        self.__otherUserAgent.triggered.connect(self.__switchToOtherUserAgent)
         self.addAction(self.__otherUserAgent)
         self.__actionGroup.addAction(self.__otherUserAgent)
         self.__otherUserAgent.setChecked(not isChecked)
-    
+
     def __switchToDefaultUserAgent(self):
         """
         Private slot to set the default user agent.
@@ -89,29 +90,32 @@
             self.__manager.removeUserAgent(self.__url.host())
         else:
             from WebBrowser.WebBrowserPage import WebBrowserPage
+
             WebBrowserPage.setUserAgent("")
-    
+
     def __switchToOtherUserAgent(self):
         """
         Private slot to set a custom user agent string.
         """
         from WebBrowser.WebBrowserPage import WebBrowserPage
+
         userAgent, ok = QInputDialog.getText(
             self,
             self.tr("Custom user agent"),
             self.tr("User agent:"),
             QLineEdit.EchoMode.Normal,
-            WebBrowserPage.userAgent(resolveEmpty=True))
+            WebBrowserPage.userAgent(resolveEmpty=True),
+        )
         if ok:
             if self.__url:
                 self.__manager.setUserAgentForUrl(self.__url, userAgent)
             else:
                 WebBrowserPage.setUserAgent(userAgent)
-    
+
     def __changeUserAgent(self, act):
         """
         Private slot to change the user agent.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
@@ -119,25 +123,28 @@
             self.__manager.setUserAgentForUrl(self.__url, act.data())
         else:
             from WebBrowser.WebBrowserPage import WebBrowserPage
+
             WebBrowserPage.setUserAgent(act.data())
-    
+
     def __addDefaultActions(self):
         """
         Private slot to add the default user agent entries.
-        
+
         @return flag indicating that a user agent entry is checked (boolean)
         """
-        defaultUserAgents = QFile(os.path.join(
-            os.path.dirname(__file__), "UserAgentDefaults.xml"))
+        defaultUserAgents = QFile(
+            os.path.join(os.path.dirname(__file__), "UserAgentDefaults.xml")
+        )
         defaultUserAgents.open(QIODevice.OpenModeFlag.ReadOnly)
-        
+
         menuStack = []
         isChecked = False
-        
+
         if self.__url:
             currentUserAgentString = self.__manager.userAgentForUrl(self.__url)
         else:
             from WebBrowser.WebBrowserPage import WebBrowserPage
+
             currentUserAgentString = WebBrowserPage.userAgent()
         xml = QXmlStreamReader(defaultUserAgents)
         while not xml.atEnd():
@@ -148,47 +155,47 @@
                 else:
                     self.addSeparator()
                 continue
-            
+
             if xml.isStartElement() and xml.name() == "useragent":
                 attributes = xml.attributes()
                 title = attributes.value("description")
                 userAgent = attributes.value("useragent")
-                
+
                 act = QAction(self)
                 act.setText(title)
                 act.setData(userAgent)
                 act.setToolTip(userAgent)
                 act.setCheckable(True)
                 act.setChecked(userAgent == currentUserAgentString)
-                act.triggered.connect(
-                    functools.partial(self.__changeUserAgent, act))
+                act.triggered.connect(functools.partial(self.__changeUserAgent, act))
                 if menuStack:
                     menuStack[-1].addAction(act)
                 else:
                     self.addAction(act)
                 self.__actionGroup.addAction(act)
                 isChecked = isChecked or act.isChecked()
-            
+
             if xml.isStartElement() and xml.name() == "useragentmenu":
                 attributes = xml.attributes()
                 title = attributes.value("title")
                 if title == "v_a_r_i_o_u_s":
                     title = self.tr("Various")
-                
+
                 menu = QMenu(self)
                 menu.setTitle(title)
                 self.addMenu(menu)
                 menuStack.append(menu)
-            
+
             if xml.isEndElement() and xml.name() == "useragentmenu":
                 menuStack.pop()
-        
+
         if xml.hasError():
             EricMessageBox.critical(
                 self,
                 self.tr("Parsing default user agents"),
                 self.tr(
-                    """<p>Error parsing default user agents.</p><p>{0}</p>""")
-                .format(xml.errorString()))
-        
+                    """<p>Error parsing default user agents.</p><p>{0}</p>"""
+                ).format(xml.errorString()),
+            )
+
         return isChecked
--- a/src/eric7/WebBrowser/UserAgent/UserAgentModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,34 +16,35 @@
     """
     Class implementing a model for user agent management.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the user agent manager (UserAgentManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
         self.__manager.changed.connect(self.__userAgentsChanged)
-        
+
         self.__headers = [
             self.tr("Host"),
             self.tr("User Agent String"),
         ]
-    
+
     def __userAgentsChanged(self):
         """
         Private slot handling a change of the registered user agent strings.
         """
         self.beginResetModel()
         self.endResetModel()
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row start row (integer)
         @param count number of rows to remove (integer)
         @param parent parent index (QModelIndex)
@@ -51,87 +52,86 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         if count <= 0:
             return False
-        
+
         lastRow = row + count - 1
-        
+
         self.beginRemoveRows(parent, row, lastRow)
-        
+
         hostsList = self.__manager.allHostNames()
         for index in range(row, lastRow + 1):
             self.__manager.removeUserAgent(hostsList[index])
-        
+
         return True
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return self.__manager.hostsCount()
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex) (Unused)
         @return number of columns (integer)
         """
         return len(self.__headers)
-    
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         if index.row() >= self.__manager.hostsCount() or index.row() < 0:
             return None
-        
+
         host = self.__manager.allHostNames()[index.row()]
         userAgent = self.__manager.userAgent(host)
-        
+
         if userAgent is None:
             return None
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if index.column() == 0:
                 return host
             elif index.column() == 1:
                 return userAgent
-        
+
         return None
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
-        
+
         return None
--- a/src/eric7/WebBrowser/UserAgent/UserAgentReader.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentReader.py	Wed Jul 13 14:55:47 2022 +0200
@@ -15,23 +15,24 @@
     """
     Class implementing a reader object for user agent data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-    
+
     def read(self, fileNameOrDevice):
         """
         Public method to read a user agent file.
-        
+
         @param fileNameOrDevice name of the file to read (string)
             or reference to the device to read (QIODevice)
         @return dictionary with user agent data (host as key, agent string as
             value)
         """
         self.__agents = {}
-        
+
         if isinstance(fileNameOrDevice, QIODevice):
             self.setDevice(fileNameOrDevice)
         else:
@@ -40,30 +41,30 @@
                 return self.__agents
             f.open(QIODevice.OpenModeFlag.ReadOnly)
             self.setDevice(f)
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
                 version = self.attributes().value("version")
-                if (
-                    self.name() == "UserAgents" and
-                    (not version or version == "1.0")
-                ):
+                if self.name() == "UserAgents" and (not version or version == "1.0"):
                     self.__readUserAgents()
                 else:
-                    self.raiseError(QCoreApplication.translate(
-                        "UserAgentReader",
-                        "The file is not a UserAgents version 1.0 file."))
-        
+                    self.raiseError(
+                        QCoreApplication.translate(
+                            "UserAgentReader",
+                            "The file is not a UserAgents version 1.0 file.",
+                        )
+                    )
+
         return self.__agents
-    
+
     def __readUserAgents(self):
         """
         Private method to read the user agents data.
         """
         if not self.isStartElement() and self.name() != "UserAgents":
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
@@ -71,7 +72,7 @@
                     continue
                 else:
                     break
-            
+
             if self.isStartElement():
                 if self.name() == "UserAgent":
                     attributes = self.attributes()
@@ -80,18 +81,18 @@
                     self.__agents[host] = agent
                 else:
                     self.__skipUnknownElement()
-    
+
     def __skipUnknownElement(self):
         """
         Private method to skip over all unknown elements.
         """
         if not self.isStartElement():
             return
-        
+
         while not self.atEnd():
             self.readNext()
             if self.isEndElement():
                 break
-            
+
             if self.isStartElement():
                 self.__skipUnknownElement()
--- a/src/eric7/WebBrowser/UserAgent/UserAgentWriter.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentWriter.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,18 +14,19 @@
     """
     Class implementing a writer object to generate user agent data files.
     """
+
     def __init__(self):
         """
         Constructor
         """
         super().__init__()
-        
+
         self.setAutoFormatting(True)
-    
+
     def write(self, fileNameOrDevice, agents):
         """
         Public method to write a user agent data file.
-        
+
         @param fileNameOrDevice name of the file to write (string)
             or device to write to (QIODevice)
         @param agents dictionary with user agent data (host as key, agent
@@ -38,14 +39,14 @@
             f = QFile(fileNameOrDevice)
             if not f.open(QIODevice.OpenModeFlag.WriteOnly):
                 return False
-        
+
         self.setDevice(f)
         return self.__write(agents)
-    
+
     def __write(self, agents):
         """
         Private method to write a user agent file.
-        
+
         @param agents dictionary with user agent data (host as key, agent
             string as value)
         @return flag indicating success (boolean)
@@ -54,11 +55,11 @@
         self.writeDTD("<!DOCTYPE useragents>")
         self.writeStartElement("UserAgents")
         self.writeAttribute("version", "1.0")
-        
+
         for host, agent in agents.items():
             self.writeEmptyElement("UserAgent")
             self.writeAttribute("host", host)
             self.writeAttribute("agent", agent)
-        
+
         self.writeEndDocument()
         return True
--- a/src/eric7/WebBrowser/UserAgent/UserAgentsDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/UserAgent/UserAgentsDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,33 +22,32 @@
     """
     Class implementing a dialog to show all saved user agent settings.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.removeButton.clicked.connect(
-            self.userAgentsTable.removeSelected)
-        self.removeAllButton.clicked.connect(
-            self.userAgentsTable.removeAll)
-        
+
+        self.removeButton.clicked.connect(self.userAgentsTable.removeSelected)
+        self.removeAllButton.clicked.connect(self.userAgentsTable.removeAll)
+
         self.userAgentsTable.verticalHeader().hide()
         self.__userAgentModel = UserAgentModel(
-            WebBrowserWindow.userAgentsManager(), self)
+            WebBrowserWindow.userAgentsManager(), self
+        )
         self.__proxyModel = QSortFilterProxyModel(self)
         self.__proxyModel.setSourceModel(self.__userAgentModel)
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
         self.userAgentsTable.setModel(self.__proxyModel)
-        
+
         fm = QFontMetrics(QFont())
         height = fm.height() + fm.height() // 3
         self.userAgentsTable.verticalHeader().setDefaultSectionSize(height)
         self.userAgentsTable.verticalHeader().setMinimumSectionSize(-1)
-        
+
         self.userAgentsTable.resizeColumnsToContents()
         self.userAgentsTable.horizontalHeader().setStretchLastSection(True)
--- a/src/eric7/WebBrowser/VirusTotal/VirusTotalApi.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/VirusTotal/VirusTotalApi.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,7 +23,7 @@
     """
     Class implementing the <a href="http://www.virustotal.com">VirusTotal</a>
     API.
-    
+
     @signal checkServiceKeyFinished(bool, str) emitted after the service key
         check has been performed. It gives a flag indicating validity
         (boolean) and an error message in case of a network error (string).
@@ -33,114 +33,111 @@
     @signal fileScanReport(str) emitted with the URL of the file scan report
         page
     """
+
     checkServiceKeyFinished = pyqtSignal(bool, str)
     submitUrlError = pyqtSignal(str)
     urlScanReport = pyqtSignal(str)
     fileScanReport = pyqtSignal(str)
-    
+
     TestServiceKeyScanID = (
         "4feed2c2e352f105f6188efd1d5a558f24aee6971bdf96d5fdb19c197d6d3fad"
     )
-    
+
     ServiceResult_ItemQueued = -2
     ServiceResult_ItemNotPresent = 0
     ServiceResult_ItemPresent = 1
-    
+
     # HTTP Status Codes
     ServiceCode_InvalidKey = 202
     ServiceCode_RateLimitExceeded = 204
     ServiceCode_InvalidPrivilege = 403
-    
+
     GetFileReportPattern = "{0}://www.virustotal.com/vtapi/v2/file/report"
     ScanUrlPattern = "{0}://www.virustotal.com/vtapi/v2/url/scan"
     GetUrlReportPattern = "{0}://www.virustotal.com/vtapi/v2/url/report"
-    GetIpAddressReportPattern = (
-        "{0}://www.virustotal.com/vtapi/v2/ip-address/report"
-    )
+    GetIpAddressReportPattern = "{0}://www.virustotal.com/vtapi/v2/ip-address/report"
     GetDomainReportPattern = "{0}://www.virustotal.com/vtapi/v2/domain/report"
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__replies = []
-        
+
         self.__loadSettings()
-        
+
         self.__lastIP = ""
         self.__lastDomain = ""
         self.__ipReportDlg = None
         self.__domainReportDlg = None
-    
+
     def __loadSettings(self):
         """
         Private method to load the settings.
         """
-        protocol = (
-            "https"
-            if Preferences.getWebBrowser("VirusTotalSecure") else
-            "http"
-        )
+        protocol = "https" if Preferences.getWebBrowser("VirusTotalSecure") else "http"
         self.GetFileReportUrl = self.GetFileReportPattern.format(protocol)
         self.ScanUrlUrl = self.ScanUrlPattern.format(protocol)
         self.GetUrlReportUrl = self.GetUrlReportPattern.format(protocol)
-        self.GetIpAddressReportUrl = self.GetIpAddressReportPattern.format(
-            protocol)
+        self.GetIpAddressReportUrl = self.GetIpAddressReportPattern.format(protocol)
         self.GetDomainReportUrl = self.GetDomainReportPattern.format(protocol)
-        
+
         self.errorMessages = {
             204: self.tr("Request limit has been reached."),
             0: self.tr("Requested item is not present."),
             -2: self.tr("Requested item is still queued."),
         }
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         self.__loadSettings()
-    
+
     def checkServiceKeyValidity(self, key, protocol=""):
         """
         Public method to check the validity of the given service key.
-        
+
         @param key service key (string)
         @param protocol protocol used to access VirusTotal (string)
         """
         urlStr = (
             self.GetFileReportUrl
-            if protocol == "" else
-            self.GetFileReportPattern.format(protocol)
+            if protocol == ""
+            else self.GetFileReportPattern.format(protocol)
         )
         request = QNetworkRequest(QUrl(urlStr))
-        request.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                          "application/x-www-form-urlencoded")
-        params = QByteArray("apikey={0}&resource={1}".format(
-            key, self.TestServiceKeyScanID).encode("utf-8"))
-        
+        request.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader,
+            "application/x-www-form-urlencoded",
+        )
+        params = QByteArray(
+            "apikey={0}&resource={1}".format(key, self.TestServiceKeyScanID).encode(
+                "utf-8"
+            )
+        )
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.post(request, params)
-        reply.finished.connect(
-            lambda: self.__checkServiceKeyValidityFinished(reply))
+        reply.finished.connect(lambda: self.__checkServiceKeyValidityFinished(reply))
         self.__replies.append(reply)
-    
+
     def __checkServiceKeyValidityFinished(self, reply):
         """
         Private slot to determine the result of the service key validity check.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
         res = False
         msg = ""
-        
+
         if reply.error() == QNetworkReply.NetworkError.NoError:
             res = True
         elif reply.error() == self.ServiceCode_InvalidKey:
@@ -149,34 +146,37 @@
             msg = reply.errorString()
         self.__replies.remove(reply)
         reply.deleteLater()
-        
+
         self.checkServiceKeyFinished.emit(res, msg)
-    
+
     def submitUrl(self, url):
         """
         Public method to submit an URL to be scanned.
-        
+
         @param url url to be scanned (QUrl)
         """
         request = QNetworkRequest(QUrl(self.ScanUrlUrl))
-        request.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                          "application/x-www-form-urlencoded")
-        params = QByteArray("apikey={0}&url=".format(
-            Preferences.getWebBrowser("VirusTotalServiceKey"))
-            .encode("utf-8")).append(QUrl.toPercentEncoding(url.toString()))
-        
+        request.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader,
+            "application/x-www-form-urlencoded",
+        )
+        params = QByteArray(
+            "apikey={0}&url=".format(
+                Preferences.getWebBrowser("VirusTotalServiceKey")
+            ).encode("utf-8")
+        ).append(QUrl.toPercentEncoding(url.toString()))
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.post(request, params)
         reply.finished.connect(lambda: self.__submitUrlFinished(reply))
         self.__replies.append(reply)
-    
+
     def __submitUrlFinished(self, reply):
         """
         Private slot to determine the result of the URL scan submission.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
@@ -193,38 +193,41 @@
                 self.submitUrlError.emit(msg)
         elif reply.error() == self.ServiceCode_RateLimitExceeded:
             self.submitUrlError.emit(
-                self.errorMessages[result[self.ServiceCode_RateLimitExceeded]])
+                self.errorMessages[result[self.ServiceCode_RateLimitExceeded]]
+            )
         else:
             self.submitUrlError.emit(reply.errorString())
         self.__replies.remove(reply)
         reply.deleteLater()
-    
+
     def __getUrlScanReportUrl(self, scanId):
         """
         Private method to get the report URL for a URL scan.
-        
+
         @param scanId ID of the scan to get the report URL for (string)
         """
         request = QNetworkRequest(QUrl(self.GetUrlReportUrl))
-        request.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                          "application/x-www-form-urlencoded")
-        params = QByteArray("apikey={0}&resource={1}".format(
-            Preferences.getWebBrowser("VirusTotalServiceKey"), scanId)
-            .encode("utf-8"))
-        
+        request.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader,
+            "application/x-www-form-urlencoded",
+        )
+        params = QByteArray(
+            "apikey={0}&resource={1}".format(
+                Preferences.getWebBrowser("VirusTotalServiceKey"), scanId
+            ).encode("utf-8")
+        )
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.post(request, params)
-        reply.finished.connect(
-            lambda: self.__getUrlScanReportUrlFinished(reply))
+        reply.finished.connect(lambda: self.__getUrlScanReportUrlFinished(reply))
         self.__replies.append(reply)
-    
+
     def __getUrlScanReportUrlFinished(self, reply):
         """
         Private slot to determine the result of the URL scan report URL.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         request.
@@ -235,34 +238,36 @@
                 self.__getFileScanReportUrl(result["filescan_id"])
         self.__replies.remove(reply)
         reply.deleteLater()
-    
+
     def __getFileScanReportUrl(self, scanId):
         """
         Private method to get the report URL for a file scan.
-        
+
         @param scanId ID of the scan to get the report URL for (string)
         """
         request = QNetworkRequest(QUrl(self.GetFileReportUrl))
-        request.setHeader(QNetworkRequest.KnownHeaders.ContentTypeHeader,
-                          "application/x-www-form-urlencoded")
-        params = QByteArray("apikey={0}&resource={1}".format(
-            Preferences.getWebBrowser("VirusTotalServiceKey"), scanId)
-            .encode("utf-8"))
-        
+        request.setHeader(
+            QNetworkRequest.KnownHeaders.ContentTypeHeader,
+            "application/x-www-form-urlencoded",
+        )
+        params = QByteArray(
+            "apikey={0}&resource={1}".format(
+                Preferences.getWebBrowser("VirusTotalServiceKey"), scanId
+            ).encode("utf-8")
+        )
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.post(request, params)
-        reply.finished.connect(
-            lambda: self.__getFileScanReportUrlFinished(reply))
+        reply.finished.connect(lambda: self.__getFileScanReportUrlFinished(reply))
         self.__replies.append(reply)
-    
+
     def __getFileScanReportUrlFinished(self, reply):
         """
         Private slot to determine the result of the file scan report URL
         request.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
@@ -271,16 +276,16 @@
             self.fileScanReport.emit(result["permalink"])
         self.__replies.remove(reply)
         reply.deleteLater()
-    
+
     def getIpAddressReport(self, ipAddress):
         """
         Public method to retrieve a report for an IP address.
-        
+
         @param ipAddress valid IPv4 address in dotted quad notation
         @type str
         """
         self.__lastIP = ipAddress
-        
+
         queryItems = [
             ("apikey", Preferences.getWebBrowser("VirusTotalServiceKey")),
             ("ip", ipAddress),
@@ -290,20 +295,18 @@
         query.setQueryItems(queryItems)
         url.setQuery(query)
         request = QNetworkRequest(url)
-        
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.get(request)
-        reply.finished.connect(
-            lambda: self.__getIpAddressReportFinished(reply))
+        reply.finished.connect(lambda: self.__getIpAddressReportFinished(reply))
         self.__replies.append(reply)
-    
+
     def __getIpAddressReportFinished(self, reply):
         """
         Private slot to process the IP address report data.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
@@ -313,13 +316,17 @@
                 EricMessageBox.information(
                     None,
                     self.tr("VirusTotal IP Address Report"),
-                    self.tr("""VirusTotal does not have any information for"""
-                            """ the given IP address."""))
+                    self.tr(
+                        """VirusTotal does not have any information for"""
+                        """ the given IP address."""
+                    ),
+                )
             elif result["response_code"] == -1:
                 EricMessageBox.information(
                     None,
                     self.tr("VirusTotal IP Address Report"),
-                    self.tr("""The submitted IP address is invalid."""))
+                    self.tr("""The submitted IP address is invalid."""),
+                )
             else:
                 owner = result["as_owner"]
                 resolutions = result["resolutions"]
@@ -327,23 +334,25 @@
                     urls = result["detected_urls"]
                 except KeyError:
                     urls = []
-                
+
                 from .VirusTotalIpReportDialog import VirusTotalIpReportDialog
+
                 self.__ipReportDlg = VirusTotalIpReportDialog(
-                    self.__lastIP, owner, resolutions, urls)
+                    self.__lastIP, owner, resolutions, urls
+                )
                 self.__ipReportDlg.show()
         self.__replies.remove(reply)
         reply.deleteLater()
-    
+
     def getDomainReport(self, domain):
         """
         Public method to retrieve a report for a domain.
-        
+
         @param domain domain name
         @type str
         """
         self.__lastDomain = domain
-        
+
         queryItems = [
             ("apikey", Preferences.getWebBrowser("VirusTotalServiceKey")),
             ("domain", domain),
@@ -353,19 +362,18 @@
         query.setQueryItems(queryItems)
         url.setQuery(query)
         request = QNetworkRequest(url)
-        
+
         import WebBrowser.WebBrowserWindow
-        nam = (
-            WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
-        )
+
+        nam = WebBrowser.WebBrowserWindow.WebBrowserWindow.networkManager()
         reply = nam.get(request)
         reply.finished.connect(lambda: self.__getDomainReportFinished(reply))
         self.__replies.append(reply)
-    
+
     def __getDomainReportFinished(self, reply):
         """
         Private slot to process the IP address report data.
-        
+
         @param reply reference to the network reply
         @type QNetworkReply
         """
@@ -375,13 +383,17 @@
                 EricMessageBox.information(
                     None,
                     self.tr("VirusTotal Domain Report"),
-                    self.tr("""VirusTotal does not have any information for"""
-                            """ the given domain."""))
+                    self.tr(
+                        """VirusTotal does not have any information for"""
+                        """ the given domain."""
+                    ),
+                )
             elif result["response_code"] == -1:
                 EricMessageBox.information(
                     None,
                     self.tr("VirusTotal Domain Report"),
-                    self.tr("""The submitted domain address is invalid."""))
+                    self.tr("""The submitted domain address is invalid."""),
+                )
             else:
                 resolutions = result["resolutions"]
                 try:
@@ -392,7 +404,7 @@
                     subdomains = result["subdomains"]
                 except KeyError:
                     subdomains = []
-                
+
                 categoriesMapping = {
                     "bitdefender": ("BitDefender category",),
                     "sophos": ("sophos category", "Sophos category"),
@@ -412,12 +424,8 @@
                     whois = result["whois"]
                 except KeyError:
                     whois = ""
-                
-                webutationData = {
-                    "adult": "--",
-                    "safety": "--",
-                    "verdict": "--"
-                }
+
+                webutationData = {"adult": "--", "safety": "--", "verdict": "--"}
                 with contextlib.suppress(KeyError):
                     webutation = result["Webutation domain info"]
                     with contextlib.suppress(KeyError):
@@ -426,23 +434,28 @@
                         webutationData["safety"] = webutation["Safety score"]
                     with contextlib.suppress(KeyError):
                         webutationData["verdict"] = webutation["Verdict"]
-                
-                from .VirusTotalDomainReportDialog import (
-                    VirusTotalDomainReportDialog
+
+                from .VirusTotalDomainReportDialog import VirusTotalDomainReportDialog
+
+                self.__domainReportDlg = VirusTotalDomainReportDialog(
+                    self.__lastDomain,
+                    resolutions,
+                    urls,
+                    subdomains,
+                    categories,
+                    webutationData,
+                    whois,
                 )
-                self.__domainReportDlg = VirusTotalDomainReportDialog(
-                    self.__lastDomain, resolutions, urls, subdomains,
-                    categories, webutationData, whois)
                 self.__domainReportDlg.show()
         self.__replies.remove(reply)
         reply.deleteLater()
-    
+
     def close(self):
         """
         Public slot to close the API.
         """
         for reply in self.__replies:
             reply.abort()
-        
+
         self.__ipReportDlg and self.__ipReportDlg.close()
         self.__domainReportDlg and self.__domainReportDlg.close()
--- a/src/eric7/WebBrowser/VirusTotal/VirusTotalDomainReportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/VirusTotal/VirusTotalDomainReportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,11 +19,21 @@
     """
     Class implementing a dialog to show the VirusTotal domain report.
     """
-    def __init__(self, domain, resolutions, urls, subdomains,
-                 categories, webutation, whois, parent=None):
+
+    def __init__(
+        self,
+        domain,
+        resolutions,
+        urls,
+        subdomains,
+        categories,
+        webutation,
+        whois,
+        parent=None,
+    ):
         """
         Constructor
-        
+
         @param domain domain name
         @type str
         @param resolutions list of resolved host names
@@ -45,58 +55,59 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.headerLabel.setText(
-            self.tr("<b>Report for domain {0}</b>").format(domain))
-        self.headerPixmap.setPixmap(
-            UI.PixmapCache.getPixmap("virustotal"))
-        
+
+        self.headerLabel.setText(self.tr("<b>Report for domain {0}</b>").format(domain))
+        self.headerPixmap.setPixmap(UI.PixmapCache.getPixmap("virustotal"))
+
         for resolution in resolutions:
             QTreeWidgetItem(
                 self.resolutionsList,
-                [resolution["ip_address"],
-                 resolution["last_resolved"].split()[0]]
+                [resolution["ip_address"], resolution["last_resolved"].split()[0]],
             )
         self.resolutionsList.resizeColumnToContents(0)
         self.resolutionsList.resizeColumnToContents(1)
         self.resolutionsList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
         for url in urls:
             QTreeWidgetItem(
                 self.urlsList,
-                [url["url"],
-                 self.tr("{0}/{1}", "positives / total").format(
-                    url["positives"], url["total"]),
-                 url["scan_date"].split()[0]]
+                [
+                    url["url"],
+                    self.tr("{0}/{1}", "positives / total").format(
+                        url["positives"], url["total"]
+                    ),
+                    url["scan_date"].split()[0],
+                ],
             )
         self.urlsList.resizeColumnToContents(0)
         self.urlsList.resizeColumnToContents(1)
         self.urlsList.resizeColumnToContents(2)
         self.urlsList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
         if subdomains:
             self.subdomainsList.addItems(subdomains)
             self.subdomainsList.sortItems()
-        
+
         self.bdLabel.setText(categories["bitdefender"])
         self.soLabel.setText(categories["sophos"])
         self.vvLabel.setText(categories["valkyrie"])
         self.amLabel.setText(categories["alpha"])
         self.ftsLabel.setText(categories["forcepoint"])
-        
+
         self.webutationAdultLabel.setText(webutation["adult"])
         self.webutationSafetyLabel.setText(str(webutation["safety"]))
         self.webutationVerdictLabel.setText(webutation["verdict"])
-        
+
         self.__whois = whois
         self.__whoisDomain = domain
         self.whoisButton.setEnabled(bool(whois))
-    
+
     @pyqtSlot()
     def on_whoisButton_clicked(self):
         """
         Private slot to show the whois information.
         """
         from .VirusTotalWhoisDialog import VirusTotalWhoisDialog
+
         dlg = VirusTotalWhoisDialog(self.__whoisDomain, self.__whois)
         dlg.exec()
--- a/src/eric7/WebBrowser/VirusTotal/VirusTotalIpReportDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/VirusTotal/VirusTotalIpReportDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,10 +19,11 @@
     """
     Class implementing a dialog to show the VirusTotal IP address report.
     """
+
     def __init__(self, ip, owner, resolutions, urls, parent=None):
         """
         Constructor
-        
+
         @param ip IP address
         @type str
         @param owner owner of the IP address
@@ -37,32 +38,32 @@
         super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.WindowType.Window)
-        
-        self.headerLabel.setText(
-            self.tr("<b>Report for IP {0}</b>").format(ip))
-        self.headerPixmap.setPixmap(
-            UI.PixmapCache.getPixmap("virustotal"))
+
+        self.headerLabel.setText(self.tr("<b>Report for IP {0}</b>").format(ip))
+        self.headerPixmap.setPixmap(UI.PixmapCache.getPixmap("virustotal"))
         self.ownerLabel.setText(owner)
-        
+
         for resolution in resolutions:
             QTreeWidgetItem(
                 self.resolutionsList,
-                [resolution["hostname"],
-                 resolution["last_resolved"].split()[0]]
+                [resolution["hostname"], resolution["last_resolved"].split()[0]],
             )
         self.resolutionsList.resizeColumnToContents(0)
         self.resolutionsList.resizeColumnToContents(1)
         self.resolutionsList.sortByColumn(0, Qt.SortOrder.AscendingOrder)
-        
+
         if not urls:
             self.detectedUrlsGroup.setVisible(False)
         for url in urls:
             QTreeWidgetItem(
                 self.urlsList,
-                [url["url"],
-                 self.tr("{0}/{1}", "positives / total").format(
-                    url["positives"], url["total"]),
-                 url["scan_date"].split()[0]]
+                [
+                    url["url"],
+                    self.tr("{0}/{1}", "positives / total").format(
+                        url["positives"], url["total"]
+                    ),
+                    url["scan_date"].split()[0],
+                ],
             )
         self.urlsList.resizeColumnToContents(0)
         self.urlsList.resizeColumnToContents(1)
--- a/src/eric7/WebBrowser/VirusTotal/VirusTotalWhoisDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/VirusTotal/VirusTotalWhoisDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,10 +18,11 @@
     """
     Class implementing a dialog to show the 'whois' information.
     """
+
     def __init__(self, domain, whois, parent=None):
         """
         Constructor
-        
+
         @param domain domain name
         @type str
         @param whois whois information
@@ -31,9 +32,9 @@
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.headerLabel.setText(
-            self.tr("<b>Whois information for domain {0}</b>").format(domain))
-        self.headerPixmap.setPixmap(
-            UI.PixmapCache.getPixmap("virustotal"))
+            self.tr("<b>Whois information for domain {0}</b>").format(domain)
+        )
+        self.headerPixmap.setPixmap(UI.PixmapCache.getPixmap("virustotal"))
         self.whoisEdit.setPlainText(whois)
--- a/src/eric7/WebBrowser/WebBrowserClearPrivateDataDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserClearPrivateDataDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,32 +9,30 @@
 
 from PyQt6.QtWidgets import QDialog
 
-from .Ui_WebBrowserClearPrivateDataDialog import (
-    Ui_WebBrowserClearPrivateDataDialog
-)
+from .Ui_WebBrowserClearPrivateDataDialog import Ui_WebBrowserClearPrivateDataDialog
 
 
-class WebBrowserClearPrivateDataDialog(QDialog,
-                                       Ui_WebBrowserClearPrivateDataDialog):
+class WebBrowserClearPrivateDataDialog(QDialog, Ui_WebBrowserClearPrivateDataDialog):
     """
     Class implementing a dialog to select which private data to clear.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
-    
+
     def getData(self):
         """
         Public method to get the data from the dialog.
-        
+
         @return tuple with flags indicating which data to clear
             (browsing history, search history, favicons, disk cache, cookies,
             passwords, web databases, downloads, zoom values, SSL
@@ -57,15 +55,17 @@
         elif index == 4:
             # clear all
             historyPeriod = 0
-        
-        return (self.historyCheckBox.isChecked(),
-                self.searchCheckBox.isChecked(),
-                self.iconsCheckBox.isChecked(),
-                self.cacheCheckBox.isChecked(),
-                self.cookiesCheckBox.isChecked(),
-                self.passwordsCheckBox.isChecked(),
-                self.databasesCheckBox.isChecked(),
-                self.downloadsCheckBox.isChecked(),
-                self.zoomCheckBox.isChecked(),
-                self.sslExceptionsCheckBox.isChecked(),
-                historyPeriod)
+
+        return (
+            self.historyCheckBox.isChecked(),
+            self.searchCheckBox.isChecked(),
+            self.iconsCheckBox.isChecked(),
+            self.cacheCheckBox.isChecked(),
+            self.cookiesCheckBox.isChecked(),
+            self.passwordsCheckBox.isChecked(),
+            self.databasesCheckBox.isChecked(),
+            self.downloadsCheckBox.isChecked(),
+            self.zoomCheckBox.isChecked(),
+            self.sslExceptionsCheckBox.isChecked(),
+            historyPeriod,
+        )
--- a/src/eric7/WebBrowser/WebBrowserJavaScriptConsole.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserJavaScriptConsole.py	Wed Jul 13 14:55:47 2022 +0200
@@ -17,49 +17,53 @@
     """
     Class implementing a JavaScript console widget.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setAcceptRichText(False)
         self.setLineWrapMode(QTextEdit.LineWrapMode.NoWrap)
         self.setReadOnly(True)
-        
+
         # create the context menu
         self.__menu = QMenu(self)
-        self.__menu.addAction(self.tr('Clear'), self.clear)
-        self.__menu.addAction(self.tr('Copy'), self.copy)
+        self.__menu.addAction(self.tr("Clear"), self.clear)
+        self.__menu.addAction(self.tr("Copy"), self.copy)
         self.__menu.addSeparator()
-        self.__menu.addAction(self.tr('Select All'), self.selectAll)
-        
+        self.__menu.addAction(self.tr("Select All"), self.selectAll)
+
         self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__handleShowContextMenu)
-        
+
         self.__levelStrings = {
-            QWebEnginePage.JavaScriptConsoleMessageLevel.InfoMessageLevel:
-                self.tr("Info"),
-            QWebEnginePage.JavaScriptConsoleMessageLevel.WarningMessageLevel:
-                self.tr("Warning"),
-            QWebEnginePage.JavaScriptConsoleMessageLevel.ErrorMessageLevel:
-                self.tr("Error"),
+            QWebEnginePage.JavaScriptConsoleMessageLevel.InfoMessageLevel: self.tr(
+                "Info"
+            ),
+            QWebEnginePage.JavaScriptConsoleMessageLevel.WarningMessageLevel: self.tr(
+                "Warning"
+            ),
+            QWebEnginePage.JavaScriptConsoleMessageLevel.ErrorMessageLevel: self.tr(
+                "Error"
+            ),
         }
-    
+
     def __handleShowContextMenu(self, coord):
         """
         Private slot to show the context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         """
         coord = self.mapToGlobal(coord)
         self.__menu.popup(coord)
-    
+
     def __appendText(self, txt):
         """
         Private method to append text to the end.
-        
+
         @param txt text to insert (string)
         """
         tc = self.textCursor()
@@ -67,11 +71,11 @@
         self.setTextCursor(tc)
         self.insertPlainText(txt)
         self.ensureCursorVisible()
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method handling key press events.
-        
+
         @param evt key press event (QKeyEvent)
         """
         if evt.modifiers() == Qt.KeyboardModifier.ControlModifier:
@@ -83,11 +87,11 @@
                 self.selectAll()
                 evt.accept()
                 return
-    
+
     def javaScriptConsoleMessage(self, level, message, lineNumber, sourceId):
         """
         Public method to show a console message.
-        
+
         @param level severity
         @type QWebEnginePage.JavaScriptConsoleMessageLevel
         @param message message to be shown
@@ -97,14 +101,13 @@
         @param sourceId source URL causing the error
         @type str
         """
-        txt = self.tr("[{0}] {1}").format(
-            self.__levelStrings[level], message)
+        txt = self.tr("[{0}] {1}").format(self.__levelStrings[level], message)
         self.__appendText(txt)
-        
+
         if lineNumber:
             self.__appendText(self.tr(" at line {0}\n").format(lineNumber))
         else:
             self.__appendText("\n")
-        
+
         if sourceId:
             self.__appendText(self.tr("URL: {0}\n").format(sourceId))
--- a/src/eric7/WebBrowser/WebBrowserLanguagesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserLanguagesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,24 +19,29 @@
     """
     Class implementing a dialog to configure the preferred languages.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__model = QStringListModel()
         self.languagesList.setModel(self.__model)
         self.languagesList.selectionModel().currentChanged.connect(
-            self.__currentChanged)
-        
-        languages = Preferences.toList(Preferences.getSettings().value(
-            "WebBrowser/AcceptLanguages", self.defaultAcceptLanguages()))
+            self.__currentChanged
+        )
+
+        languages = Preferences.toList(
+            Preferences.getSettings().value(
+                "WebBrowser/AcceptLanguages", self.defaultAcceptLanguages()
+            )
+        )
         self.__model.setStringList(languages)
-        
+
         allLanguages = []
         for language in QLocale.Language:
             if language == QLocale.Language.C:
@@ -45,19 +50,18 @@
         self.__allLanguagesModel = QStringListModel()
         self.__allLanguagesModel.setStringList(allLanguages)
         self.addCombo.setModel(self.__allLanguagesModel)
-    
+
     def __currentChanged(self, current, previous):
         """
         Private slot to handle a change of the current selection.
-        
+
         @param current index of the currently selected item (QModelIndex)
         @param previous index of the previously selected item (QModelIndex)
         """
         self.removeButton.setEnabled(current.isValid())
         row = current.row()
         self.upButton.setEnabled(row > 0)
-        self.downButton.setEnabled(
-            row != -1 and row < self.__model.rowCount() - 1)
+        self.downButton.setEnabled(row != -1 and row < self.__model.rowCount() - 1)
 
     @pyqtSlot()
     def on_upButton_clicked(self):
@@ -70,7 +74,7 @@
         self.__model.insertRow(currentRow - 1)
         self.__model.setData(self.__model.index(currentRow - 1), data)
         self.languagesList.setCurrentIndex(self.__model.index(currentRow - 1))
-    
+
     @pyqtSlot()
     def on_downButton_clicked(self):
         """
@@ -82,7 +86,7 @@
         self.__model.insertRow(currentRow + 1)
         self.__model.setData(self.__model.index(currentRow + 1), data)
         self.languagesList.setCurrentIndex(self.__model.index(currentRow + 1))
-    
+
     @pyqtSlot()
     def on_removeButton_clicked(self):
         """
@@ -91,7 +95,7 @@
         """
         currentRow = self.languagesList.currentIndex().row()
         self.__model.removeRow(currentRow)
-    
+
     @pyqtSlot()
     def on_addButton_clicked(self):
         """
@@ -100,13 +104,13 @@
         language = self.addCombo.currentText()
         if language in self.__model.stringList():
             return
-        
+
         self.__model.insertRow(self.__model.rowCount())
-        self.__model.setData(self.__model.index(self.__model.rowCount() - 1),
-                             language)
+        self.__model.setData(self.__model.index(self.__model.rowCount() - 1), language)
         self.languagesList.setCurrentIndex(
-            self.__model.index(self.__model.rowCount() - 1))
-    
+            self.__model.index(self.__model.rowCount() - 1)
+        )
+
     def accept(self):
         """
         Public method to accept the data entered.
@@ -115,42 +119,41 @@
         if result == self.defaultAcceptLanguages():
             Preferences.getSettings().remove("WebBrowser/AcceptLanguages")
         else:
-            Preferences.getSettings().setValue(
-                "WebBrowser/AcceptLanguages", result)
+            Preferences.getSettings().setValue("WebBrowser/AcceptLanguages", result)
         super().accept()
-    
+
     @classmethod
     def httpString(cls, languages):
         """
         Class method to convert a list of acceptable languages into a
         byte array.
-       
+
         The byte array can be sent along with the Accept-Language http header
         (see RFC 2616).
-        
+
         @param languages list of acceptable languages (list of strings)
         @return converted list (QByteArray)
         """
         processed = []
         qvalue = 1.0
         for language in languages:
-            leftBracket = language.find('[')
-            rightBracket = language.find(']')
-            tag = language[leftBracket + 1:rightBracket]
+            leftBracket = language.find("[")
+            rightBracket = language.find("]")
+            tag = language[leftBracket + 1 : rightBracket]
             if not processed:
                 processed.append(tag)
             else:
                 processed.append("{0};q={1:.1f}".format(tag, qvalue))
             if qvalue > 0.1:
                 qvalue -= 0.1
-        
+
         return ", ".join(processed)
-    
+
     @classmethod
     def defaultAcceptLanguages(cls):
         """
         Class method to get the list of default accept languages.
-        
+
         @return list of acceptable languages (list of strings)
         """
         language = QLocale.system().name()
@@ -158,35 +161,34 @@
             return []
         else:
             return cls.expand(QLocale(language).language())
-    
+
     @classmethod
     def expand(cls, language):
         """
         Class method to expand a language enum to a readable languages
         list.
-        
+
         @param language language number (QLocale.Language)
         @return list of expanded language names (list of strings)
         """
         allLanguages = []
-        countries = [loc.country() for loc in QLocale.matchingLocales(
-            language, QLocale.Script.AnyScript, QLocale.Country.AnyCountry)]
-        languageString = (
-            "{0} [{1}]"
-        ).format(
-            QLocale.languageToString(language),
-            QLocale(language).name().split('_')[0]
+        countries = [
+            loc.country()
+            for loc in QLocale.matchingLocales(
+                language, QLocale.Script.AnyScript, QLocale.Country.AnyCountry
+            )
+        ]
+        languageString = ("{0} [{1}]").format(
+            QLocale.languageToString(language), QLocale(language).name().split("_")[0]
         )
         allLanguages.append(languageString)
         for country in countries:
-            languageString = (
-                "{0}/{1} [{2}]"
-            ).format(
+            languageString = ("{0}/{1} [{2}]").format(
                 QLocale.languageToString(language),
                 QLocale.countryToString(country),
-                '-'.join(QLocale(language, country).name().split('_')).lower()
+                "-".join(QLocale(language, country).name().split("_")).lower(),
             )
             if languageString not in allLanguages:
                 allLanguages.append(languageString)
-        
+
         return allLanguages
--- a/src/eric7/WebBrowser/WebBrowserPage.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserPage.py	Wed Jul 13 14:55:47 2022 +0200
@@ -9,16 +9,21 @@
 """
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, QUrl, QUrlQuery, QTimer, QEventLoop, QPoint
+    pyqtSlot,
+    pyqtSignal,
+    QUrl,
+    QUrlQuery,
+    QTimer,
+    QEventLoop,
+    QPoint,
 )
 from PyQt6.QtGui import QDesktopServices
-from PyQt6.QtWebEngineCore import (
-    QWebEnginePage, QWebEngineSettings, QWebEngineScript
-)
+from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineSettings, QWebEngineScript
 from PyQt6.QtWebChannel import QWebChannel
 
 try:
     from PyQt6.QtNetwork import QSslConfiguration, QSslCertificate
+
     SSL_AVAILABLE = True
 except ImportError:
     SSL_AVAILABLE = False
@@ -39,7 +44,7 @@
 class WebBrowserPage(QWebEnginePage):
     """
     Class implementing an enhanced web page.
-    
+
     @signal safeBrowsingAbort() emitted to indicate an abort due to a safe
         browsing event
     @signal safeBrowsingBad(threatType, threatMessages) emitted to indicate a
@@ -51,51 +56,53 @@
     @signal sslConfigurationChanged() emitted to indicate a change of the
         stored SSL configuration data
     """
+
     SafeJsWorld = QWebEngineScript.ScriptWorldId.ApplicationWorld
     UnsafeJsWorld = QWebEngineScript.ScriptWorldId.MainWorld
-    
+
     safeBrowsingAbort = pyqtSignal()
     safeBrowsingBad = pyqtSignal(str, str)
-    
+
     printPageRequested = pyqtSignal()
-    navigationRequestAccepted = pyqtSignal(QUrl, QWebEnginePage.NavigationType,
-                                           bool)
-    
+    navigationRequestAccepted = pyqtSignal(QUrl, QWebEnginePage.NavigationType, bool)
+
     sslConfigurationChanged = pyqtSignal()
-    
+
     def __init__(self, view, parent=None):
         """
         Constructor
-        
+
         @param view reference to the WebBrowserView associated with the page
         @type WebBrowserView
         @param parent reference to the parent widget (defaults to None)
         @type QWidget (optional)
         """
-        super().__init__(
-            WebBrowserWindow.webProfile(), parent)
-        
+        super().__init__(WebBrowserWindow.webProfile(), parent)
+
         self.__printer = None
         self.__badSite = False
         self.__registerProtocolHandlerRequest = None
-        
+
         self.__view = view
-        
-        self.featurePermissionRequested.connect(
-            self.__featurePermissionRequested)
+
+        self.featurePermissionRequested.connect(self.__featurePermissionRequested)
         self.authenticationRequired.connect(
             lambda url, auth: WebBrowserWindow.networkManager().authentication(
-                url, auth, self))
+                url, auth, self
+            )
+        )
         self.proxyAuthenticationRequired.connect(
-            WebBrowserWindow.networkManager().proxyAuthentication)
+            WebBrowserWindow.networkManager().proxyAuthentication
+        )
         self.fullScreenRequested.connect(self.__fullScreenRequested)
         self.urlChanged.connect(self.__urlChanged)
         self.contentsSizeChanged.connect(self.__contentsSizeChanged)
         self.registerProtocolHandlerRequested.connect(
-            self.__registerProtocolHandlerRequested)
-        
+            self.__registerProtocolHandlerRequested
+        )
+
         self.__sslConfiguration = None
-        
+
         # Workaround for changing webchannel world inside
         # acceptNavigationRequest not working
         self.__channelUrl = QUrl()
@@ -104,28 +111,28 @@
         self.__setupChannelTimer.setSingleShot(True)
         self.__setupChannelTimer.setInterval(100)
         self.__setupChannelTimer.timeout.connect(self.__setupChannelTimeout)
-    
+
     def view(self):
         """
         Public method to get a reference to the WebBrowserView associated with
         the page.
-        
+
         @return reference to the WebBrowserView associated with the page
         r@type WebBrowserView
         """
         return self.__view
-    
+
     @pyqtSlot()
     def __setupChannelTimeout(self):
         """
         Private slot to initiate the setup of the web channel.
         """
         self.__setupWebChannelForUrl(self.__channelUrl)
-    
+
     def acceptNavigationRequest(self, url, type_, isMainFrame):
         """
         Public method to determine, if a request may be accepted.
-        
+
         @param url URL to navigate to
         @type QUrl
         @param type_ type of the navigation request
@@ -140,113 +147,114 @@
         if scheme == "mailto":
             QDesktopServices.openUrl(url)
             return False
-        
+
         # AdBlock
         if (
-            url.scheme() == "abp" and
-            WebBrowserWindow.adBlockManager().addSubscriptionFromUrl(url)
+            url.scheme() == "abp"
+            and WebBrowserWindow.adBlockManager().addSubscriptionFromUrl(url)
         ):
             return False
-        
+
         # GreaseMonkey
         navigationType = type_ in (
             QWebEnginePage.NavigationType.NavigationTypeLinkClicked,
-            QWebEnginePage.NavigationType.NavigationTypeRedirect
+            QWebEnginePage.NavigationType.NavigationTypeRedirect,
         )
         if navigationType and url.toString().endswith(".user.js"):
             WebBrowserWindow.greaseMonkeyManager().downloadScript(url)
             return False
-        
+
         if url.scheme() == "eric":
             if url.path() == "AddSearchProvider":
                 query = QUrlQuery(url)
                 self.__view.mainWindow().openSearchManager().addEngine(
-                    QUrl(query.queryItemValue("url")))
+                    QUrl(query.queryItemValue("url"))
+                )
                 return False
             elif url.path() == "PrintPage":
                 self.printPageRequested.emit()
                 return False
-        
+
         # Safe Browsing
         self.__badSite = False
-        from WebBrowser.SafeBrowsing.SafeBrowsingManager import (
-            SafeBrowsingManager
-        )
+        from WebBrowser.SafeBrowsing.SafeBrowsingManager import SafeBrowsingManager
+
         if (
-            SafeBrowsingManager.isEnabled() and
-            url.scheme() not in SafeBrowsingManager.getIgnoreSchemes()
+            SafeBrowsingManager.isEnabled()
+            and url.scheme() not in SafeBrowsingManager.getIgnoreSchemes()
         ):
-            threatLists = (
-                WebBrowserWindow.safeBrowsingManager().lookupUrl(url)[0]
-            )
+            threatLists = WebBrowserWindow.safeBrowsingManager().lookupUrl(url)[0]
             if threatLists:
                 threatMessages = (
-                    WebBrowserWindow.safeBrowsingManager()
-                    .getThreatMessages(threatLists)
+                    WebBrowserWindow.safeBrowsingManager().getThreatMessages(
+                        threatLists
+                    )
                 )
                 res = EricMessageBox.warning(
                     WebBrowserWindow.getWindow(),
                     self.tr("Suspicuous URL detected"),
-                    self.tr("<p>The URL <b>{0}</b> was found in the Safe"
-                            " Browsing database.</p>{1}").format(
-                        url.toString(), "".join(threatMessages)),
+                    self.tr(
+                        "<p>The URL <b>{0}</b> was found in the Safe"
+                        " Browsing database.</p>{1}"
+                    ).format(url.toString(), "".join(threatMessages)),
                     EricMessageBox.Abort | EricMessageBox.Ignore,
-                    EricMessageBox.Abort)
+                    EricMessageBox.Abort,
+                )
                 if res == EricMessageBox.Abort:
                     self.safeBrowsingAbort.emit()
                     return False
-                
+
                 self.__badSite = True
-                threatType = (
-                    WebBrowserWindow.safeBrowsingManager()
-                    .getThreatType(threatLists[0])
+                threatType = WebBrowserWindow.safeBrowsingManager().getThreatType(
+                    threatLists[0]
                 )
                 self.safeBrowsingBad.emit(threatType, "".join(threatMessages))
-        
-        result = QWebEnginePage.acceptNavigationRequest(
-            self, url, type_, isMainFrame)
-        
+
+        result = QWebEnginePage.acceptNavigationRequest(self, url, type_, isMainFrame)
+
         if result:
             if isMainFrame:
-                isWeb = url.scheme() in ("http", "https", "ftp", "ftps",
-                                         "file")
+                isWeb = url.scheme() in ("http", "https", "ftp", "ftps", "file")
                 globalJsEnabled = WebBrowserWindow.webSettings().testAttribute(
-                    QWebEngineSettings.WebAttribute.JavascriptEnabled)
+                    QWebEngineSettings.WebAttribute.JavascriptEnabled
+                )
                 if isWeb:
                     enable = globalJsEnabled
                 else:
                     enable = True
                 self.settings().setAttribute(
-                    QWebEngineSettings.WebAttribute.JavascriptEnabled, enable)
-                
+                    QWebEngineSettings.WebAttribute.JavascriptEnabled, enable
+                )
+
                 self.__channelUrl = url
                 self.__setupChannelTimer.start()
             self.navigationRequestAccepted.emit(url, type_, isMainFrame)
-        
+
         return result
-    
+
     @pyqtSlot(QUrl)
     def __urlChanged(self, url):
         """
         Private slot to handle changes of the URL.
-        
+
         @param url new URL
         @type QUrl
         """
         if (
-            not url.isEmpty() and
-            url.scheme() == "eric" and
-            not self.isJavaScriptEnabled()
+            not url.isEmpty()
+            and url.scheme() == "eric"
+            and not self.isJavaScriptEnabled()
         ):
             self.settings().setAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled, True)
+                QWebEngineSettings.WebAttribute.JavascriptEnabled, True
+            )
             self.triggerAction(QWebEnginePage.WebAction.Reload)
-    
+
     @classmethod
     def userAgent(cls, resolveEmpty=False):
         """
         Class method to get the global user agent setting.
-        
+
         @param resolveEmpty flag indicating to resolve an empty
             user agent (boolean)
         @return user agent string (string)
@@ -255,21 +263,21 @@
         if agent == "" and resolveEmpty:
             agent = cls.userAgentForUrl(QUrl())
         return agent
-    
+
     @classmethod
     def setUserAgent(cls, agent):
         """
         Class method to set the global user agent string.
-        
+
         @param agent new current user agent string (string)
         """
         Preferences.setWebBrowser("UserAgent", agent)
-    
+
     @classmethod
     def userAgentForUrl(cls, url):
         """
         Class method to determine the user agent for the given URL.
-        
+
         @param url URL to determine user agent for (QUrl)
         @return user agent string (string)
         """
@@ -281,11 +289,11 @@
                 # no global agent string specified -> use default one
                 agent = WebBrowserWindow.webProfile().httpUserAgent()
         return agent
-    
+
     def __featurePermissionRequested(self, url, feature):
         """
         Private slot handling a feature permission request.
-        
+
         @param url url requesting the feature
         @type QUrl
         @param feature requested feature
@@ -293,13 +301,13 @@
         """
         manager = WebBrowserWindow.featurePermissionManager()
         manager.requestFeaturePermission(self, url, feature)
-    
-    def execJavaScript(self, script,
-                       worldId=QWebEngineScript.ScriptWorldId.MainWorld,
-                       timeout=500):
+
+    def execJavaScript(
+        self, script, worldId=QWebEngineScript.ScriptWorldId.MainWorld, timeout=500
+    ):
         """
         Public method to execute a JavaScript function synchroneously.
-        
+
         @param script JavaScript script source to be executed
         @type str
         @param worldId ID to run the script under
@@ -312,21 +320,21 @@
         loop = QEventLoop()
         resultDict = {"res": None}
         QTimer.singleShot(timeout, loop.quit)
-        
+
         def resultCallback(res, resDict=resultDict):
             if loop and loop.isRunning():
                 resDict["res"] = res
                 loop.quit()
-        
+
         self.runJavaScript(script, worldId, resultCallback)
-        
+
         loop.exec()
         return resultDict["res"]
-    
+
     def runJavaScript(self, script, worldId=-1, callback=None):
         """
         Public method to run a script in the context of the page.
-        
+
         @param script JavaScript script source to be executed
         @type str
         @param worldId ID to run the script under
@@ -345,71 +353,72 @@
                 QWebEnginePage.runJavaScript(self, script)
             else:
                 QWebEnginePage.runJavaScript(self, script, callback)
-    
+
     def isJavaScriptEnabled(self):
         """
         Public method to test, if JavaScript is enabled.
-        
+
         @return flag indicating the state of the JavaScript support
         @rtype bool
         """
         return self.settings().testAttribute(
-            QWebEngineSettings.WebAttribute.JavascriptEnabled)
-    
+            QWebEngineSettings.WebAttribute.JavascriptEnabled
+        )
+
     def scroll(self, x, y):
         """
         Public method to scroll by the given amount of pixels.
-        
+
         @param x horizontal scroll value
         @type int
         @param y vertical scroll value
         @type int
         """
         self.runJavaScript(
-            "window.scrollTo(window.scrollX + {0}, window.scrollY + {1})"
-            .format(x, y),
-            WebBrowserPage.SafeJsWorld
+            "window.scrollTo(window.scrollX + {0}, window.scrollY + {1})".format(x, y),
+            WebBrowserPage.SafeJsWorld,
         )
-    
+
     def scrollTo(self, pos):
         """
         Public method to scroll to the given position.
-        
+
         @param pos position to scroll to
         @type QPointF
         """
         self.runJavaScript(
             "window.scrollTo({0}, {1});".format(pos.x(), pos.y()),
-            WebBrowserPage.SafeJsWorld
+            WebBrowserPage.SafeJsWorld,
         )
-    
+
     def mapToViewport(self, pos):
         """
         Public method to map a position to the viewport.
-        
+
         @param pos position to be mapped
         @type QPoint
         @return viewport position
         @rtype QPoint
         """
-        return QPoint(int(pos.x() // self.zoomFactor()),
-                      int(pos.y() // self.zoomFactor()))
-    
+        return QPoint(
+            int(pos.x() // self.zoomFactor()), int(pos.y() // self.zoomFactor())
+        )
+
     def hitTestContent(self, pos):
         """
         Public method to test the content at a specified position.
-        
+
         @param pos position to execute the test at
         @type QPoint
         @return test result object
         @rtype WebHitTestResult
         """
         return WebHitTestResult(self, pos)
-    
+
     def __setupWebChannelForUrl(self, url):
         """
         Private method to setup a web channel to our external object.
-        
+
         @param url URL for which to setup the web channel
         @type QUrl
         """
@@ -417,49 +426,48 @@
         if channel is None:
             channel = QWebChannel(self)
             ExternalJsObject.setupWebChannel(channel, self)
-        
+
         worldId = -1
         worldId = (
             self.UnsafeJsWorld
-            if url.scheme() in ("eric", "qthelp") else
-            self.SafeJsWorld
+            if url.scheme() in ("eric", "qthelp")
+            else self.SafeJsWorld
         )
         if worldId != self.__channelWorldId:
             self.__channelWorldId = worldId
             self.setWebChannel(channel, self.__channelWorldId)
-    
+
     def certificateError(self, error):
         """
         Public method to handle SSL certificate errors.
-        
+
         @param error object containing the certificate error information
         @type QWebEngineCertificateError
         @return flag indicating to ignore this error
         @rtype bool
         """
-        return WebBrowserWindow.networkManager().certificateError(
-            error, self.__view)
-    
+        return WebBrowserWindow.networkManager().certificateError(error, self.__view)
+
     def __fullScreenRequested(self, request):
         """
         Private slot handling a full screen request.
-        
+
         @param request reference to the full screen request
         @type QWebEngineFullScreenRequest
         """
         self.__view.requestFullScreen(request.toggleOn())
-        
+
         accepted = request.toggleOn() == self.__view.isFullScreen()
-        
+
         if accepted:
             request.accept()
         else:
             request.reject()
-    
+
     def execPrintPage(self, printer, timeout=1000):
         """
         Public method to execute a synchronous print.
-        
+
         @param printer reference to the printer object
         @type QPrinter
         @param timeout timeout value in milliseconds
@@ -470,36 +478,36 @@
         loop = QEventLoop()
         resultDict = {"res": None}
         QTimer.singleShot(timeout, loop.quit)
-        
+
         def printCallback(res, resDict=resultDict):
             if loop and loop.isRunning():
                 resDict["res"] = res
                 loop.quit()
-        
+
         self.print(printer, printCallback)
-        
+
         loop.exec()
         return resultDict["res"]
-    
+
     def __contentsSizeChanged(self, size):
         """
         Private slot to work around QWebEnginePage not scrolling to anchors
         when opened in a background tab.
-        
+
         @param size changed contents size (unused)
         @type QSize
         """
         fragment = self.url().fragment()
         self.runJavaScript(Scripts.scrollToAnchor(fragment))
-    
+
     ##############################################
     ## Methods below deal with JavaScript messages
     ##############################################
-    
+
     def javaScriptConsoleMessage(self, level, message, lineNumber, sourceId):
         """
         Public method to show a console message.
-        
+
         @param level severity
         @type QWebEnginePage.JavaScriptConsoleMessageLevel
         @param message message to be shown
@@ -510,172 +518,169 @@
         @type str
         """
         self.__view.mainWindow().javascriptConsole().javaScriptConsoleMessage(
-            level, message, lineNumber, sourceId)
-    
+            level, message, lineNumber, sourceId
+        )
+
     ###########################################################################
     ## Methods below implement safe browsing related functions
     ###########################################################################
-    
+
     def getSafeBrowsingStatus(self):
         """
         Public method to get the safe browsing status of the current page.
-        
+
         @return flag indicating a safe site
         @rtype bool
         """
         return not self.__badSite
-    
+
     #############################################################
     ## Methods below implement protocol handler related functions
     #############################################################
-    
+
     @pyqtSlot("QWebEngineRegisterProtocolHandlerRequest")
     def __registerProtocolHandlerRequested(self, request):
         """
         Private slot to handle the registration of a custom protocol
         handler.
-        
+
         @param request reference to the registration request
         @type QWebEngineRegisterProtocolHandlerRequest
         """
-        from PyQt6.QtWebEngineCore import (
-            QWebEngineRegisterProtocolHandlerRequest
-        )
-        
+        from PyQt6.QtWebEngineCore import QWebEngineRegisterProtocolHandlerRequest
+
         if self.__registerProtocolHandlerRequest:
             del self.__registerProtocolHandlerRequest
             self.__registerProtocolHandlerRequest = None
         self.__registerProtocolHandlerRequest = (
             QWebEngineRegisterProtocolHandlerRequest(request)
         )
-    
+
     def registerProtocolHandlerRequestUrl(self):
         """
         Public method to get the registered protocol handler request URL.
-        
+
         @return registered protocol handler request URL
         @rtype QUrl
         """
-        if (
-            self.__registerProtocolHandlerRequest and
-            (self.url().host() ==
-             self.__registerProtocolHandlerRequest.origin().host())
+        if self.__registerProtocolHandlerRequest and (
+            self.url().host() == self.__registerProtocolHandlerRequest.origin().host()
         ):
             return self.__registerProtocolHandlerRequest.origin()
         else:
             return QUrl()
-    
+
     def registerProtocolHandlerRequestScheme(self):
         """
         Public method to get the registered protocol handler request scheme.
-        
+
         @return registered protocol handler request scheme
         @rtype str
         """
-        if (
-            self.__registerProtocolHandlerRequest and
-            (self.url().host() ==
-             self.__registerProtocolHandlerRequest.origin().host())
+        if self.__registerProtocolHandlerRequest and (
+            self.url().host() == self.__registerProtocolHandlerRequest.origin().host()
         ):
             return self.__registerProtocolHandlerRequest.scheme()
         else:
             return ""
-    
+
     #############################################################
     ## SSL configuration handling below
     #############################################################
-    
+
     def setSslConfiguration(self, sslConfiguration):
         """
         Public slot to set the SSL configuration data of the page.
-        
+
         @param sslConfiguration SSL configuration to be set
         @type QSslConfiguration
         """
         self.__sslConfiguration = QSslConfiguration(sslConfiguration)
         self.__sslConfiguration.url = self.url()
         self.sslConfigurationChanged.emit()
-    
+
     def getSslConfiguration(self):
         """
         Public method to return a reference to the current SSL configuration.
-        
+
         @return reference to the SSL configuration in use
         @rtype QSslConfiguration
         """
         return self.__sslConfiguration
-    
+
     def clearSslConfiguration(self):
         """
         Public slot to clear the stored SSL configuration data.
         """
         self.__sslConfiguration = None
         self.sslConfigurationChanged.emit()
-    
+
     def getSslCertificate(self):
         """
         Public method to get a reference to the SSL certificate.
-        
+
         @return amended SSL certificate
         @rtype QSslCertificate
         """
         if self.__sslConfiguration is None:
             return None
-        
+
         sslCertificate = self.__sslConfiguration.peerCertificate()
         sslCertificate.url = QUrl(self.__sslConfiguration.url)
         return sslCertificate
-    
+
     def getSslCertificateChain(self):
         """
         Public method to get a reference to the SSL certificate chain.
-        
+
         @return SSL certificate chain
         @rtype list of QSslCertificate
         """
         if self.__sslConfiguration is None:
             return []
-        
+
         chain = self.__sslConfiguration.peerCertificateChain()
         return chain
-    
+
     def showSslInfo(self, pos):
         """
         Public slot to show some SSL information for the loaded page.
-        
+
         @param pos position to show the info at
         @type QPoint
         """
         if SSL_AVAILABLE and self.__sslConfiguration is not None:
             from EricNetwork.EricSslInfoWidget import EricSslInfoWidget
-            widget = EricSslInfoWidget(self.url(), self.__sslConfiguration,
-                                       self.__view)
+
+            widget = EricSslInfoWidget(self.url(), self.__sslConfiguration, self.__view)
             widget.showAt(pos)
         else:
             EricMessageBox.warning(
                 self.__view,
                 self.tr("SSL Info"),
-                self.tr("""This site does not contain SSL information."""))
-    
+                self.tr("""This site does not contain SSL information."""),
+            )
+
     def hasValidSslInfo(self):
         """
         Public method to check, if the page has a valid SSL certificate.
-        
+
         @return flag indicating a valid SSL certificate
         @rtype bool
         """
         if self.__sslConfiguration is None:
             return False
-        
+
         certList = self.__sslConfiguration.peerCertificateChain()
         if not certList:
             return False
-        
+
         certificateDict = Globals.toDict(
-            Preferences.getSettings().value("Ssl/CaCertificatesDict"))
+            Preferences.getSettings().value("Ssl/CaCertificatesDict")
+        )
         for server in certificateDict:
             localCAList = QSslCertificate.fromData(certificateDict[server])
             if any(cert in localCAList for cert in certList):
                 return True
-        
+
         return all(not cert.isBlacklisted() for cert in certList)
--- a/src/eric7/WebBrowser/WebBrowserSingleApplication.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserSingleApplication.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 
 from PyQt6.QtCore import pyqtSignal
 
-from Toolbox.SingleApplication import (
-    SingleApplicationClient, SingleApplicationServer
-)
+from Toolbox.SingleApplication import SingleApplicationClient, SingleApplicationServer
 
 import Globals
 
@@ -24,43 +22,44 @@
 SAFile = "eric7_browser"
 
 # define the protocol tokens
-SALoadUrl = 'LoadUrl'
-SANewTab = 'NewTab'
-SASearch = 'Search'
-SAShutdown = 'Shutdown'
+SALoadUrl = "LoadUrl"
+SANewTab = "NewTab"
+SASearch = "Search"
+SAShutdown = "Shutdown"
 
 
 class WebBrowserSingleApplicationServer(SingleApplicationServer):
     """
     Class implementing the single application server embedded within the
     Web Browser.
-    
+
     @signal loadUrl(str) emitted to load an URL
     @signal newTab(str) emitted to load an URL in a new tab
     @signal search(str) emitted to search for a given word
     @signal shutdown() emitted to shut down the browser
     """
+
     loadUrl = pyqtSignal(str)
     newTab = pyqtSignal(str)
     search = pyqtSignal(str)
     shutdown = pyqtSignal()
-    
+
     def __init__(self, name=""):
         """
         Constructor
-        
+
         @param name name to be used by the single application server
         @type str
         """
         if not name:
             name = SAFile
-        
+
         SingleApplicationServer.__init__(self, name)
 
     def handleCommand(self, command, arguments):
         """
         Public slot to handle the command sent by the client.
-        
+
         @param command command sent by the client
         @type str
         @param arguments list of command arguments
@@ -68,43 +67,43 @@
         """
         if command == SALoadUrl:
             self.__saLoadUrl(arguments[0])
-        
+
         elif command == SANewTab:
             self.__saNewTab(arguments[0])
-        
+
         elif command == SASearch:
             self.__saSearch(arguments[0])
-        
+
         elif command == SAShutdown:
             self.__saShutdown()
-    
+
     def __saLoadUrl(self, url):
         """
         Private method to load an URL in a new tab.
-        
+
         @param url URL to be loaded
         @type str
         """
         self.loadUrl.emit(url)
-    
+
     def __saNewTab(self, url):
         """
         Private method to load an URL .
-        
+
         @param url URL to be loaded
         @type str
         """
         self.newTab.emit(url)
-    
+
     def __saSearch(self, word):
         """
         Private method to search for a given word.
-        
+
         @param word word to be searched for
         @type str
         """
         self.search.emit(word)
-    
+
     def __saShutdown(self):
         """
         Private method to shut down the web browser.
@@ -116,22 +115,23 @@
     """
     Class implementing the single application client of the web browser.
     """
+
     def __init__(self, name=""):
         """
         Constructor
-        
+
         @param name name to be used by the single application server
         @type str
         """
         if not name:
             name = SAFile
-        
+
         SingleApplicationClient.__init__(self, name)
-    
+
     def processArgs(self, args, disconnect=True):
         """
         Public method to process the command line args passed to the UI.
-        
+
         @param args list of command line arguments
         @type list of str
         @param disconnect flag indicating to disconnect when done
@@ -140,9 +140,9 @@
         # no args, return
         if args is None:
             return
-        
-        argChars = ('-', '/') if Globals.isWindowsPlatform() else ('-', )
-        
+
+        argChars = ("-", "/") if Globals.isWindowsPlatform() else ("-",)
+
         for arg in args:
             if arg.startswith("--search="):
                 self.__search(arg.replace("--search=", ""))
@@ -153,37 +153,37 @@
             elif not arg.startswith(argChars):
                 # it is an URL
                 self.__loadUrl(arg)
-        
+
         if disconnect:
             self.disconnect()
-    
+
     def __loadUrl(self, url):
         """
         Private method to send an URL to be loaded.
-        
+
         @param url URL to be loaded
         @type str
         """
         self.sendCommand(SALoadUrl, [url])
-    
+
     def __newTab(self, url):
         """
         Private method to send an URL to be loaded in a new tab.
-        
+
         @param url URL to be loaded
         @type str
         """
         self.sendCommand(SANewTab, [url])
-    
+
     def __search(self, word):
         """
         Private method to send a word to search for.
-        
+
         @param word to to be searched for
         @type str
         """
         self.sendCommand(SASearch, [word])
-    
+
     def __shutdown(self):
         """
         Private method to signal a shutdown request to the browser.
--- a/src/eric7/WebBrowser/WebBrowserSnap.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserSnap.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,7 +14,7 @@
 def renderTabPreview(view, w, h):
     """
     Public function to render a pixmap of a page.
-    
+
     @param view reference to the view to be previewed (QWebEngineView)
     @param w width of the preview pixmap (integer)
     @param h height of the preview pixmap (integer)
@@ -22,16 +22,17 @@
     """
     pageImage = __render(view, view.width(), view.height())
     return pageImage.scaled(
-        w, h,
+        w,
+        h,
         Qt.AspectRatioMode.IgnoreAspectRatio,
-        Qt.TransformationMode.SmoothTransformation
+        Qt.TransformationMode.SmoothTransformation,
     )
 
 
 def __render(view, w, h):
     """
     Private function to render a pixmap of given size for a web page.
-    
+
     @param view reference to the view to be previewed (QWebEngineView)
     @param w width of the pixmap (integer)
     @param h height of the pixmap (integer)
@@ -40,10 +41,10 @@
     # create the page image
     pageImage = QPixmap(w, h)
     pageImage.fill(Qt.GlobalColor.transparent)
-    
+
     # render it
     p = QPainter(pageImage)
     view.render(p)
     p.end()
-    
+
     return pageImage
--- a/src/eric7/WebBrowser/WebBrowserTabBar.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserTabBar.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 from PyQt6.QtWidgets import QLabel
 
 from EricWidgets.EricTabWidget import EricWheelTabBar
-from EricWidgets.EricPassivePopup import (
-    EricPassivePopup, EricPassivePopupStyle
-)
+from EricWidgets.EricPassivePopup import EricPassivePopup, EricPassivePopupStyle
 
 import Preferences
 
@@ -22,60 +20,61 @@
     """
     Class implementing the tab bar of the web browser.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (WebBrowserTabWidget)
         """
         super().__init__(parent)
-        
+
         self.__tabWidget = parent
-        
+
         self.__previewPopup = None
-        
+
         self.setMouseTracking(True)
-    
+
     def __showTabPreview(self, index):
         """
         Private slot to show the tab preview.
-        
+
         @param index index of tab to show a preview for
         @type int
         """
         indexedBrowser = self.__tabWidget.browserAt(index)
         currentBrowser = self.__tabWidget.currentBrowser()
-        
+
         if indexedBrowser is None or currentBrowser is None:
             return
-        
+
         # no previews during load
         if indexedBrowser.progress() != 0:
             return
-        
+
         preview = indexedBrowser.getPreview()
         if not preview.isNull():
             w = self.tabSizeHint(index).width()
             h = int(w * currentBrowser.height() / currentBrowser.width())
-            
+
             self.__previewPopup = EricPassivePopup(
-                style=EricPassivePopupStyle.STYLED, parent=self)
+                style=EricPassivePopupStyle.STYLED, parent=self
+            )
             self.__previewPopup.setFixedSize(w, h)
             self.__previewPopup.setCustomData("index", index)
-            
+
             label = QLabel()
             label.setPixmap(preview.scaled(w, h))
-            
+
             self.__previewPopup.setView(label)
-            self.__previewPopup.layout().setAlignment(
-                Qt.AlignmentFlag.AlignTop)
+            self.__previewPopup.layout().setAlignment(Qt.AlignmentFlag.AlignTop)
             self.__previewPopup.layout().setContentsMargins(0, 0, 0, 0)
-            
+
             tr = self.tabRect(index)
             pos = QPoint(tr.x(), tr.y() + tr.height())
-            
+
             self.__previewPopup.show(self.mapToGlobal(pos))
-    
+
     def __hidePreview(self):
         """
         Private method to hide the preview.
@@ -84,18 +83,18 @@
             self.__previewPopup.hide()
             self.__previewPopup.deleteLater()
         self.__previewPopup = None
-    
+
     def mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the mouse move event (QMouseEvent)
         """
         if self.count() == 1:
             return
-        
+
         super().mouseMoveEvent(evt)
-        
+
         if Preferences.getWebBrowser("ShowPreview"):
             # Find the tab under the mouse
             i = 0
@@ -104,70 +103,72 @@
                 if self.tabRect(i).contains(evt.position().toPoint()):
                     tabIndex = i
                 i += 1
-            
+
             # If found and not the current tab then show tab preview
             if (
-                tabIndex != -1 and
-                tabIndex != self.currentIndex() and
-                evt.buttons() == Qt.MouseButton.NoButton and
-                (self.__previewPopup is None or
-                 (self.__previewPopup is not None and
-                  self.__previewPopup.getCustomData("index") != tabIndex)
-                 )
+                tabIndex != -1
+                and tabIndex != self.currentIndex()
+                and evt.buttons() == Qt.MouseButton.NoButton
+                and (
+                    self.__previewPopup is None
+                    or (
+                        self.__previewPopup is not None
+                        and self.__previewPopup.getCustomData("index") != tabIndex
+                    )
+                )
             ):
                 QTimer.singleShot(0, lambda: self.__showTabPreview(tabIndex))
-            
+
             # If current tab or not found then hide previous tab preview
             if tabIndex in (self.currentIndex(), -1):
                 self.__hidePreview()
-    
+
     def leaveEvent(self, evt):
         """
         Protected method to handle leave events.
-        
+
         @param evt reference to the leave event (QEvent)
         """
         if Preferences.getWebBrowser("ShowPreview"):
             # If leave tabwidget then hide previous tab preview
             self.__hidePreview()
-        
+
         super().leaveEvent(evt)
-    
+
     def mousePressEvent(self, evt):
         """
         Protected method to handle mouse press events.
-        
+
         @param evt reference to the mouse press event (QMouseEvent)
         """
         if Preferences.getWebBrowser("ShowPreview"):
             self.__hidePreview()
-        
+
         super().mousePressEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method to handle event.
-        
+
         This event handler just handles the tooltip event and passes the
         handling of all others to the superclass.
-        
+
         @param evt reference to the event to be handled (QEvent)
         @return flag indicating, if the event was handled (boolean)
         """
-        if (
-            evt.type() == QEvent.Type.ToolTip and
-            Preferences.getWebBrowser("ShowPreview")
+        if evt.type() == QEvent.Type.ToolTip and Preferences.getWebBrowser(
+            "ShowPreview"
         ):
             # suppress tool tips if we are showing previews
             evt.setAccepted(True)
             return True
-        
+
         return super().event(evt)
-    
+
     def tabRemoved(self, index):
         """
         Public slot to handle the removal of a tab.
-        
+
         @param index index of the removed tab (integer)
         """
         if Preferences.getWebBrowser("ShowPreview"):
--- a/src/eric7/WebBrowser/WebBrowserTabWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserTabWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -11,9 +11,7 @@
 
 from PyQt6.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QMarginsF
 from PyQt6.QtGui import QIcon, QPixmap, QPainter, QPageLayout
-from PyQt6.QtWidgets import (
-    QWidget, QHBoxLayout, QMenu, QToolButton, QDialog
-)
+from PyQt6.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, QDialog
 from PyQt6.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog
 
 from EricWidgets.EricTabWidget import EricTabWidget
@@ -36,7 +34,7 @@
 def isCupsAvailable():
     """
     Static method to test the availability of CUPS.
-    
+
     @return flag indicating the availability of CUPS
     @rtype bool
     """
@@ -53,7 +51,7 @@
 class WebBrowserTabWidget(EricTabWidget):
     """
     Class implementing the central widget showing the web pages.
-    
+
     @signal sourceChanged(WebBrowserView, QUrl) emitted after the URL of a
         browser has changed
     @signal currentUrlChanged(QUrl) emitted after the URL of the current
@@ -67,6 +65,7 @@
     @signal browserZoomValueChanged(int) emitted to signal a change of the
         current browser's zoom level
     """
+
     sourceChanged = pyqtSignal(WebBrowserView, QUrl)
     currentUrlChanged = pyqtSignal(QUrl)
     titleChanged = pyqtSignal(WebBrowserView, str)
@@ -74,164 +73,187 @@
     browserOpened = pyqtSignal(QWidget)
     browserClosed = pyqtSignal(QWidget)
     browserZoomValueChanged = pyqtSignal(int)
-    
+
     def __init__(self, parent):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent, dnd=True)
-        
+
         from .WebBrowserTabBar import WebBrowserTabBar
+
         self.__tabBar = WebBrowserTabBar(self)
         self.setCustomTabBar(True, self.__tabBar)
-        
+
         self.__mainWindow = parent
-        
+
         self.setUsesScrollButtons(True)
         self.setDocumentMode(True)
         self.setElideMode(Qt.TextElideMode.ElideNone)
-        
+
         from .ClosedTabsManager import ClosedTabsManager
+
         self.__closedTabsManager = ClosedTabsManager(self)
-        self.__closedTabsManager.closedTabAvailable.connect(
-            self.__closedTabAvailable)
-        
+        self.__closedTabsManager.closedTabAvailable.connect(self.__closedTabAvailable)
+
         from .UrlBar.StackedUrlBar import StackedUrlBar
+
         self.__stackedUrlBar = StackedUrlBar(self)
         self.__tabBar.tabMoved.connect(self.__stackedUrlBar.moveBar)
-        
+
         self.__tabContextMenuIndex = -1
         self.currentChanged[int].connect(self.__currentChanged)
         self.setTabContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
         self.customTabContextMenuRequested.connect(self.__showContextMenu)
-        
+
         self.__rightCornerWidget = QWidget(self)
         self.__rightCornerWidgetLayout = QHBoxLayout(self.__rightCornerWidget)
         self.__rightCornerWidgetLayout.setContentsMargins(0, 0, 0, 0)
         self.__rightCornerWidgetLayout.setSpacing(0)
-        
+
         self.__navigationMenu = QMenu(self)
         self.__navigationMenu.aboutToShow.connect(self.__showNavigationMenu)
         self.__navigationMenu.triggered.connect(self.__navigationMenuTriggered)
-        
+
         self.__navigationButton = QToolButton(self)
-        self.__navigationButton.setIcon(
-            UI.PixmapCache.getIcon("1downarrow"))
-        self.__navigationButton.setToolTip(
-            self.tr("Show a navigation menu"))
+        self.__navigationButton.setIcon(UI.PixmapCache.getIcon("1downarrow"))
+        self.__navigationButton.setToolTip(self.tr("Show a navigation menu"))
         self.__navigationButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
+            QToolButton.ToolButtonPopupMode.InstantPopup
+        )
         self.__navigationButton.setMenu(self.__navigationMenu)
         self.__navigationButton.setEnabled(False)
         self.__rightCornerWidgetLayout.addWidget(self.__navigationButton)
-        
+
         self.__closedTabsMenu = QMenu(self)
-        self.__closedTabsMenu.aboutToShow.connect(
-            self.__aboutToShowClosedTabsMenu)
-        
+        self.__closedTabsMenu.aboutToShow.connect(self.__aboutToShowClosedTabsMenu)
+
         self.__closedTabsButton = QToolButton(self)
         self.__closedTabsButton.setIcon(UI.PixmapCache.getIcon("trash"))
         self.__closedTabsButton.setToolTip(
-            self.tr("Show a navigation menu for closed tabs"))
+            self.tr("Show a navigation menu for closed tabs")
+        )
         self.__closedTabsButton.setPopupMode(
-            QToolButton.ToolButtonPopupMode.InstantPopup)
+            QToolButton.ToolButtonPopupMode.InstantPopup
+        )
         self.__closedTabsButton.setMenu(self.__closedTabsMenu)
         self.__closedTabsButton.setEnabled(False)
         self.__rightCornerWidgetLayout.addWidget(self.__closedTabsButton)
-        
+
         self.setTabsClosable(True)
         self.tabCloseRequested.connect(self.closeBrowserAt)
-        
-        self.setCornerWidget(
-            self.__rightCornerWidget, Qt.Corner.TopRightCorner)
-        
+
+        self.setCornerWidget(self.__rightCornerWidget, Qt.Corner.TopRightCorner)
+
         self.__newTabButton = QToolButton(self)
         self.__newTabButton.setIcon(UI.PixmapCache.getIcon("plus"))
-        self.__newTabButton.setToolTip(
-            self.tr("Open a new web browser tab"))
+        self.__newTabButton.setToolTip(self.tr("Open a new web browser tab"))
         self.setCornerWidget(self.__newTabButton, Qt.Corner.TopLeftCorner)
         self.__newTabButton.clicked.connect(self.__newBrowser)
-        
+
         self.__initTabContextMenu()
-        
+
         self.__historyCompleter = None
-    
+
     def __initTabContextMenu(self):
         """
         Private method to create the tab context menu.
         """
         self.__tabContextMenu = QMenu(self)
         self.tabContextNewAct = self.__tabContextMenu.addAction(
-            UI.PixmapCache.getIcon("tabNew"),
-            self.tr('New Tab'), self.newBrowser)
+            UI.PixmapCache.getIcon("tabNew"), self.tr("New Tab"), self.newBrowser
+        )
         self.__tabContextMenu.addSeparator()
         self.leftMenuAct = self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("1leftarrow"),
-            self.tr('Move Left'), self.__tabContextMenuMoveLeft)
+            self.tr("Move Left"),
+            self.__tabContextMenuMoveLeft,
+        )
         self.rightMenuAct = self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("1rightarrow"),
-            self.tr('Move Right'), self.__tabContextMenuMoveRight)
+            self.tr("Move Right"),
+            self.__tabContextMenuMoveRight,
+        )
         self.__tabContextMenu.addSeparator()
         self.tabContextCloneAct = self.__tabContextMenu.addAction(
-            self.tr("Duplicate Page"), self.__tabContextMenuClone)
+            self.tr("Duplicate Page"), self.__tabContextMenuClone
+        )
         self.__tabContextMenu.addSeparator()
         self.tabContextCloseAct = self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("tabClose"),
-            self.tr('Close'), self.__tabContextMenuClose)
+            self.tr("Close"),
+            self.__tabContextMenuClose,
+        )
         self.tabContextCloseOthersAct = self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("tabCloseOther"),
-            self.tr("Close Others"), self.__tabContextMenuCloseOthers)
-        self.__tabContextMenu.addAction(
-            self.tr('Close All'), self.closeAllBrowsers)
+            self.tr("Close Others"),
+            self.__tabContextMenuCloseOthers,
+        )
+        self.__tabContextMenu.addAction(self.tr("Close All"), self.closeAllBrowsers)
         self.__tabContextMenu.addSeparator()
         self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("printPreview"),
-            self.tr('Print Preview'), self.__tabContextMenuPrintPreview)
+            self.tr("Print Preview"),
+            self.__tabContextMenuPrintPreview,
+        )
         self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("print"),
-            self.tr('Print'), self.__tabContextMenuPrint)
+            self.tr("Print"),
+            self.__tabContextMenuPrint,
+        )
         self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("printPdf"),
-            self.tr('Print as PDF'), self.__tabContextMenuPrintPdf)
+            self.tr("Print as PDF"),
+            self.__tabContextMenuPrintPdf,
+        )
         self.__tabContextMenu.addSeparator()
         if hasattr(WebBrowserPage, "isAudioMuted"):
             self.__audioAct = self.__tabContextMenu.addAction(
-                "", self.__tabContextMenuAudioMute)
+                "", self.__tabContextMenuAudioMute
+            )
             self.__tabContextMenu.addSeparator()
         else:
             self.__audioAct = None
         self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("reload"),
-            self.tr('Reload All'), self.reloadAllBrowsers)
+            self.tr("Reload All"),
+            self.reloadAllBrowsers,
+        )
         self.__tabContextMenu.addSeparator()
         self.__tabContextMenu.addAction(
             UI.PixmapCache.getIcon("addBookmark"),
-            self.tr('Bookmark All Tabs'), self.__mainWindow.bookmarkAll)
-        
+            self.tr("Bookmark All Tabs"),
+            self.__mainWindow.bookmarkAll,
+        )
+
         self.__tabBackContextMenu = QMenu(self)
-        self.__tabBackContextMenu.addAction(
-            self.tr('Close All'), self.closeAllBrowsers)
+        self.__tabBackContextMenu.addAction(self.tr("Close All"), self.closeAllBrowsers)
         self.__tabBackContextMenu.addAction(
             UI.PixmapCache.getIcon("reload"),
-            self.tr('Reload All'), self.reloadAllBrowsers)
+            self.tr("Reload All"),
+            self.reloadAllBrowsers,
+        )
         self.__tabBackContextMenu.addAction(
             UI.PixmapCache.getIcon("addBookmark"),
-            self.tr('Bookmark All Tabs'), self.__mainWindow.bookmarkAll)
+            self.tr("Bookmark All Tabs"),
+            self.__mainWindow.bookmarkAll,
+        )
         self.__tabBackContextMenu.addSeparator()
         self.__restoreClosedTabAct = self.__tabBackContextMenu.addAction(
-            UI.PixmapCache.getIcon("trash"),
-            self.tr('Restore Closed Tab'))
+            UI.PixmapCache.getIcon("trash"), self.tr("Restore Closed Tab")
+        )
         self.__restoreClosedTabAct.setEnabled(False)
         self.__restoreClosedTabAct.setData(0)
         self.__restoreClosedTabAct.triggered.connect(
-            lambda: self.restoreClosedTab(self.__restoreClosedTabAct))
-    
+            lambda: self.restoreClosedTab(self.__restoreClosedTabAct)
+        )
+
     def __showContextMenu(self, coord, index):
         """
         Private slot to show the tab context menu.
-        
+
         @param coord the position of the mouse pointer (QPoint)
         @param index index of the tab the menu is requested for (integer)
         """
@@ -242,38 +264,31 @@
             self.__tabContextMenuIndex = index
             self.leftMenuAct.setEnabled(index > 0)
             self.rightMenuAct.setEnabled(index < self.count() - 1)
-            
+
             self.tabContextCloseOthersAct.setEnabled(self.count() > 1)
-            
+
             if self.__audioAct is not None:
-                if (
-                    self.widget(self.__tabContextMenuIndex).page()
-                        .isAudioMuted()
-                ):
+                if self.widget(self.__tabContextMenuIndex).page().isAudioMuted():
                     self.__audioAct.setText(self.tr("Unmute Tab"))
-                    self.__audioAct.setIcon(
-                        UI.PixmapCache.getIcon("audioVolumeHigh"))
+                    self.__audioAct.setIcon(UI.PixmapCache.getIcon("audioVolumeHigh"))
                 else:
                     self.__audioAct.setText(self.tr("Mute Tab"))
-                    self.__audioAct.setIcon(
-                        UI.PixmapCache.getIcon("audioVolumeMuted"))
-            
+                    self.__audioAct.setIcon(UI.PixmapCache.getIcon("audioVolumeMuted"))
+
             self.__tabContextMenu.popup(coord)
-    
+
     def __tabContextMenuMoveLeft(self):
         """
         Private method to move a tab one position to the left.
         """
-        self.moveTab(self.__tabContextMenuIndex,
-                     self.__tabContextMenuIndex - 1)
-    
+        self.moveTab(self.__tabContextMenuIndex, self.__tabContextMenuIndex - 1)
+
     def __tabContextMenuMoveRight(self):
         """
         Private method to move a tab one position to the right.
         """
-        self.moveTab(self.__tabContextMenuIndex,
-                     self.__tabContextMenuIndex + 1)
-    
+        self.moveTab(self.__tabContextMenuIndex, self.__tabContextMenuIndex + 1)
+
     def __tabContextMenuClone(self):
         """
         Private method to clone the selected tab.
@@ -283,48 +298,47 @@
             idx = self.currentIndex()
         if idx < 0 or idx > self.count():
             return
-        
+
         url = self.widget(idx).url()
         self.newBrowser(url)
-    
+
     def __tabContextMenuClose(self):
         """
         Private method to close the selected tab.
         """
         self.closeBrowserAt(self.__tabContextMenuIndex)
-    
+
     def __tabContextMenuCloseOthers(self):
         """
         Private slot to close all other tabs.
         """
         index = self.__tabContextMenuIndex
-        for i in (
-            list(range(self.count() - 1, index, -1)) +
-            list(range(index - 1, -1, -1))
+        for i in list(range(self.count() - 1, index, -1)) + list(
+            range(index - 1, -1, -1)
         ):
             self.closeBrowserAt(i)
-    
+
     def __tabContextMenuPrint(self):
         """
         Private method to print the selected tab.
         """
         browser = self.widget(self.__tabContextMenuIndex)
         self.printBrowser(browser)
-    
+
     def __tabContextMenuPrintPdf(self):
         """
         Private method to print the selected tab as PDF.
         """
         browser = self.widget(self.__tabContextMenuIndex)
         self.printBrowserPdf(browser)
-    
+
     def __tabContextMenuPrintPreview(self):
         """
         Private method to show a print preview of the selected tab.
         """
         browser = self.widget(self.__tabContextMenuIndex)
         self.printPreviewBrowser(browser)
-    
+
     def __tabContextMenuAudioMute(self):
         """
         Private method to mute or unmute the selected tab.
@@ -332,12 +346,12 @@
         page = self.widget(self.__tabContextMenuIndex).page()
         muted = page.isAudioMuted()
         page.setAudioMuted(not muted)
-    
+
     @pyqtSlot(bool)
     def __recentlyAudibleChanged(self, recentlyAudible, page):
         """
         Private slot to react on the audible state of a page.
-        
+
         @param recentlyAudible flag indicating the new audible state
         @type bool
         @param page reference to the web page
@@ -346,12 +360,11 @@
         browser = page.view()
         if browser is None:
             return
-        
+
         index = self.indexOf(browser)
         icon = page.icon()
-        
-        if page.isAudioMuted() or (
-                not page.isAudioMuted() and recentlyAudible):
+
+        if page.isAudioMuted() or (not page.isAudioMuted() and recentlyAudible):
             pix = QPixmap(32, 32)
             pix.fill(Qt.GlobalColor.transparent)
             painter = QPainter(pix)
@@ -365,19 +378,20 @@
             self.setTabIcon(index, QIcon(pix))
         else:
             self.setTabIcon(index, icon)
-    
+
     @pyqtSlot()
     def __newBrowser(self):
         """
         Private slot to open a new browser tab.
         """
         self.newBrowser()
-    
-    def newBrowser(self, link=None, position=-1, background=False,
-                   restoreSession=False):
+
+    def newBrowser(
+        self, link=None, position=-1, background=False, restoreSession=False
+    ):
         """
         Public method to create a new web browser tab.
-        
+
         @param link link to be shown
         @type str or QUrl
         @param position position to create the new tab at or -1 to add it
@@ -397,70 +411,68 @@
             linkName = link.toString()
         else:
             linkName = link
-        
+
         from .UrlBar.UrlBar import UrlBar
+
         urlbar = UrlBar(self.__mainWindow, self)
         if self.__historyCompleter is None:
             import WebBrowser.WebBrowserWindow
             from .History.HistoryCompleter import (
-                HistoryCompletionModel, HistoryCompleter
+                HistoryCompletionModel,
+                HistoryCompleter,
             )
+
+            histMgr = WebBrowser.WebBrowserWindow.WebBrowserWindow.historyManager()
             self.__historyCompletionModel = HistoryCompletionModel(self)
-            self.__historyCompletionModel.setSourceModel(
-                WebBrowser.WebBrowserWindow.WebBrowserWindow.historyManager()
-                .historyFilterModel())
+            self.__historyCompletionModel.setSourceModel(histMgr.historyFilterModel())
             self.__historyCompleter = HistoryCompleter(
-                self.__historyCompletionModel, self)
+                self.__historyCompletionModel, self
+            )
             self.__historyCompleter.activated[str].connect(self.__pathSelected)
         urlbar.setCompleter(self.__historyCompleter)
-        urlbar.returnPressed.connect(
-            lambda: self.__lineEditReturnPressed(urlbar))
+        urlbar.returnPressed.connect(lambda: self.__lineEditReturnPressed(urlbar))
         if position == -1:
             self.__stackedUrlBar.addWidget(urlbar)
         else:
             self.__stackedUrlBar.insertWidget(position, urlbar)
-        
+
         browser = WebBrowserView(self.__mainWindow, self)
         urlbar.setBrowser(browser)
-        
-        browser.sourceChanged.connect(
-            lambda url: self.__sourceChanged(url, browser))
-        browser.titleChanged.connect(
-            lambda title: self.__titleChanged(title, browser))
+
+        browser.sourceChanged.connect(lambda url: self.__sourceChanged(url, browser))
+        browser.titleChanged.connect(lambda title: self.__titleChanged(title, browser))
         browser.highlighted.connect(self.showMessage)
-        browser.backwardAvailable.connect(
-            self.__mainWindow.setBackwardAvailable)
+        browser.backwardAvailable.connect(self.__mainWindow.setBackwardAvailable)
         browser.forwardAvailable.connect(self.__mainWindow.setForwardAvailable)
         browser.loadProgress.connect(
-            lambda progress: self.__loadProgress(progress, browser))
-        browser.loadFinished.connect(
-            lambda ok: self.__loadFinished(ok, browser))
-        browser.faviconChanged.connect(
-            lambda: self.__iconChanged(browser))
+            lambda progress: self.__loadProgress(progress, browser)
+        )
+        browser.loadFinished.connect(lambda ok: self.__loadFinished(ok, browser))
+        browser.faviconChanged.connect(lambda: self.__iconChanged(browser))
         browser.search.connect(self.newBrowser)
         browser.page().windowCloseRequested.connect(
-            lambda: self.__windowCloseRequested(browser.page()))
+            lambda: self.__windowCloseRequested(browser.page())
+        )
         browser.zoomValueChanged.connect(self.browserZoomValueChanged)
         if hasattr(WebBrowserPage, "recentlyAudibleChanged"):
             browser.page().recentlyAudibleChanged.connect(
-                lambda audible: self.__recentlyAudibleChanged(
-                    audible, browser.page()))
-        browser.page().printRequested.connect(
-            lambda: self.printBrowser(browser))
+                lambda audible: self.__recentlyAudibleChanged(audible, browser.page())
+            )
+        browser.page().printRequested.connect(lambda: self.printBrowser(browser))
         browser.showMessage.connect(self.showMessage)
-        
+
         index = (
             self.addTab(browser, self.tr("..."))
-            if position == -1 else
-            self.insertTab(position, browser, self.tr("..."))
+            if position == -1
+            else self.insertTab(position, browser, self.tr("..."))
         )
         if not background:
             self.setCurrentIndex(index)
-        
+
         self.__mainWindow.closeAct.setEnabled(True)
         self.__mainWindow.closeAllAct.setEnabled(True)
         self.__navigationButton.setEnabled(True)
-        
+
         if not restoreSession and not linkName:
             if Preferences.getWebBrowser("NewTabBehavior") == 0:
                 linkName = "about:blank"
@@ -468,32 +480,31 @@
                 linkName = Preferences.getWebBrowser("HomePage")
             elif Preferences.getWebBrowser("NewTabBehavior") == 2:
                 linkName = "eric:speeddial"
-        
+
         if linkName == "eric:blank":
             linkName = "about:blank"
-        
+
         if linkName:
             browser.setSource(QUrl(linkName))
             if not browser.documentTitle():
                 self.setTabText(
-                    index,
-                    self.__elide(linkName, Qt.TextElideMode.ElideMiddle)
+                    index, self.__elide(linkName, Qt.TextElideMode.ElideMiddle)
                 )
                 self.setTabToolTip(index, linkName)
             else:
                 self.setTabText(
-                    index,
-                    self.__elide(browser.documentTitle().replace("&", "&&")))
+                    index, self.__elide(browser.documentTitle().replace("&", "&&"))
+                )
                 self.setTabToolTip(index, browser.documentTitle())
-        
+
         self.browserOpened.emit(browser)
-        
+
         return browser
-    
+
     def newBrowserAfter(self, browser, link=None, background=False):
         """
         Public method to create a new web browser tab after a given one.
-        
+
         @param browser reference to the browser to add after (WebBrowserView)
         @param link link to be shown (string or QUrl)
         @param background flag indicating to open the tab in the
@@ -503,7 +514,7 @@
         """
         position = self.indexOf(browser) + 1 if browser else -1
         return self.newBrowser(link, position, background)
-    
+
     def __showNavigationMenu(self):
         """
         Private slot to show the navigation button menu.
@@ -511,33 +522,34 @@
         self.__navigationMenu.clear()
         for index in range(self.count()):
             act = self.__navigationMenu.addAction(
-                self.tabIcon(index), self.tabText(index))
+                self.tabIcon(index), self.tabText(index)
+            )
             act.setData(index)
-    
+
     def __navigationMenuTriggered(self, act):
         """
         Private slot called to handle the navigation button menu selection.
-        
+
         @param act reference to the selected action (QAction)
         """
         index = act.data()
         if index is not None:
             self.setCurrentIndex(index)
-    
+
     def __windowCloseRequested(self, page):
         """
         Private slot to handle the windowCloseRequested signal of a browser.
-        
+
         @param page reference to the web page
         @type WebBrowserPage
         """
         browser = page.view()
         if browser is None:
             return
-        
+
         index = self.indexOf(browser)
         self.closeBrowserAt(index)
-    
+
     def reloadAllBrowsers(self):
         """
         Public slot to reload all browsers.
@@ -545,38 +557,38 @@
         for index in range(self.count()):
             browser = self.widget(index)
             browser and browser.reload()
-    
+
     @pyqtSlot()
     def closeBrowser(self):
         """
         Public slot called to handle the close action.
         """
         self.closeBrowserAt(self.currentIndex())
-    
+
     def closeAllBrowsers(self, shutdown=False):
         """
         Public slot called to handle the close all action.
-        
+
         @param shutdown flag indicating a shutdown action
         @type bool
         """
         for index in range(self.count() - 1, -1, -1):
             self.closeBrowserAt(index, shutdown=shutdown)
-    
+
     def closeBrowserView(self, browser):
         """
         Public method to close the given browser.
-        
+
         @param browser reference to the web browser view to be closed
         @type WebBrowserView
         """
         index = self.indexOf(browser)
         self.closeBrowserAt(index)
-    
+
     def closeBrowserAt(self, index, shutdown=False):
         """
         Public slot to close a browser based on its index.
-        
+
         @param index index of browser to close
         @type int
         @param shutdown flag indicating a shutdown action
@@ -585,64 +597,64 @@
         browser = self.widget(index)
         if browser is None:
             return
-        
+
         urlbar = self.__stackedUrlBar.widget(index)
         self.__stackedUrlBar.removeWidget(urlbar)
         urlbar.deleteLater()
         del urlbar
-        
+
         self.__closedTabsManager.recordBrowser(browser, index)
-        
+
         browser.closeWebInspector()
         WebInspector.unregisterView(browser)
         self.removeTab(index)
         self.browserClosed.emit(browser)
         browser.deleteLater()
         del browser
-        
+
         if self.count() == 0 and not shutdown:
             self.newBrowser()
         else:
             self.currentChanged[int].emit(self.currentIndex())
-    
+
     def currentBrowser(self):
         """
         Public method to get a reference to the current browser.
-        
+
         @return reference to the current browser (WebBrowserView)
         """
         return self.currentWidget()
-    
+
     def browserAt(self, index):
         """
         Public method to get a reference to the browser with the given index.
-        
+
         @param index index of the browser to get (integer)
         @return reference to the indexed browser (WebBrowserView)
         """
         return self.widget(index)
-    
+
     def browsers(self):
         """
         Public method to get a list of references to all browsers.
-        
+
         @return list of references to browsers (list of WebBrowserView)
         """
         li = []
         for index in range(self.count()):
             li.append(self.widget(index))
         return li
-    
+
     @pyqtSlot()
     def printBrowser(self, browser=None):
         """
         Public slot called to print the displayed page.
-        
+
         @param browser reference to the browser to be printed (WebBrowserView)
         """
         if browser is None:
             browser = self.currentBrowser()
-        
+
         printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
         if Preferences.getPrinter("ColorMode"):
             printer.setColorMode(QPrinter.ColorMode.Color)
@@ -652,12 +664,14 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
@@ -665,37 +679,38 @@
         printer.setResolution(Preferences.getPrinter("Resolution"))
         documentName = WebBrowserTools.getFileNameFromUrl(browser.url())
         printer.setDocName(documentName)
-        
+
         printDialog = QPrintDialog(printer, self)
         printDialog.setOptions(
-            QAbstractPrintDialog.PrintDialogOption.PrintToFile |
-            QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize
+            QAbstractPrintDialog.PrintDialogOption.PrintToFile
+            | QAbstractPrintDialog.PrintDialogOption.PrintShowPageSize
         )
         if not Globals.isWindowsPlatform():
             if isCupsAvailable():
                 printDialog.setOption(
-                    QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies)
-            printDialog.setOption(
-                QAbstractPrintDialog.PrintDialogOption.PrintPageRange)
+                    QAbstractPrintDialog.PrintDialogOption.PrintCollateCopies
+                )
+            printDialog.setOption(QAbstractPrintDialog.PrintDialogOption.PrintPageRange)
         if printDialog.exec() == QDialog.DialogCode.Accepted:
             browser.page().execPrintPage(printer, 10 * 1000)
-    
+
     @pyqtSlot()
     def printBrowserPdf(self, browser=None):
         """
         Public slot called to print the displayed page to PDF.
-        
+
         @param browser reference to the browser to be printed (HelpBrowser)
         """
         if browser is None:
             browser = self.currentBrowser()
-        
+
         name = WebBrowserTools.getFileNameFromUrl(browser.url())
         if name:
-            name = name.rsplit('.', 1)[0]
-            name += '.pdf'
+            name = name.rsplit(".", 1)[0]
+            name += ".pdf"
         if hasattr(browser.page(), "printToPdf"):
             from .Tools.PrintToPdfDialog import PrintToPdfDialog
+
             if not name:
                 name = "printout.pdf"
             dlg = PrintToPdfDialog(name, self)
@@ -706,16 +721,20 @@
                         res = EricMessageBox.warning(
                             self,
                             self.tr("Print to PDF"),
-                            self.tr("""<p>The file <b>{0}</b> exists"""
-                                    """ already. Shall it be"""
-                                    """ overwritten?</p>""").format(filePath),
+                            self.tr(
+                                """<p>The file <b>{0}</b> exists"""
+                                """ already. Shall it be"""
+                                """ overwritten?</p>"""
+                            ).format(filePath),
                             EricMessageBox.No | EricMessageBox.Yes,
-                            EricMessageBox.No)
+                            EricMessageBox.No,
+                        )
                         if res == EricMessageBox.No:
                             return
                     browser.page().printToPdf(
                         lambda pdf: self.__pdfGeneratedForSave(filePath, pdf),
-                        pageLayout)
+                        pageLayout,
+                    )
         elif Globals.isLinuxPlatform():
             printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
             if Preferences.getPrinter("ColorMode"):
@@ -729,15 +748,15 @@
             if name:
                 printer.setOutputFileName(name)
             printer.setResolution(Preferences.getPrinter("Resolution"))
-            
+
             printDialog = QPrintDialog(printer, self)
             if printDialog.exec() == QDialog.DialogCode.Accepted:
                 browser.render(printer)
-    
+
     def __pdfGeneratedForSave(self, filePath, pdfData):
         """
         Private slot to save the generated PDF data to a file.
-        
+
         @param filePath path to save the PDF to
         @type str
         @param pdfData generated PDF document
@@ -745,7 +764,7 @@
         """
         if pdfData.size() == 0:
             return
-        
+
         try:
             with open(filePath, "wb") as f:
                 f.write(pdfData)
@@ -753,23 +772,25 @@
             EricMessageBox.critical(
                 self,
                 self.tr("Print to PDF"),
-                self.tr("""<p>The PDF could not be written to file <b>{0}"""
-                        """</b>.</p><p><b>Error:</b> {1}</p>""").format(
-                    filePath, str(err)),
-                EricMessageBox.Ok)
-    
+                self.tr(
+                    """<p>The PDF could not be written to file <b>{0}"""
+                    """</b>.</p><p><b>Error:</b> {1}</p>"""
+                ).format(filePath, str(err)),
+                EricMessageBox.Ok,
+            )
+
     @pyqtSlot()
     def printPreviewBrowser(self, browser=None):
         """
         Public slot called to show a print preview of the displayed file.
-        
+
         @param browser reference to the browser to be printed (WebBrowserView)
         """
         from PyQt6.QtPrintSupport import QPrintPreviewDialog
-        
+
         if browser is None:
             browser = self.currentBrowser()
-        
+
         printer = QPrinter(mode=QPrinter.PrinterMode.HighResolution)
         if Preferences.getPrinter("ColorMode"):
             printer.setColorMode(QPrinter.ColorMode.Color)
@@ -779,28 +800,31 @@
             printer.setPageOrder(QPrinter.PageOrder.FirstPageFirst)
         else:
             printer.setPageOrder(QPrinter.PageOrder.LastPageFirst)
-        printer.setPageMargins(QMarginsF(
-            Preferences.getPrinter("LeftMargin") * 10,
-            Preferences.getPrinter("TopMargin") * 10,
-            Preferences.getPrinter("RightMargin") * 10,
-            Preferences.getPrinter("BottomMargin") * 10),
-            QPageLayout.Unit.Millimeter
+        printer.setPageMargins(
+            QMarginsF(
+                Preferences.getPrinter("LeftMargin") * 10,
+                Preferences.getPrinter("TopMargin") * 10,
+                Preferences.getPrinter("RightMargin") * 10,
+                Preferences.getPrinter("BottomMargin") * 10,
+            ),
+            QPageLayout.Unit.Millimeter,
         )
         printerName = Preferences.getPrinter("PrinterName")
         if printerName:
             printer.setPrinterName(printerName)
         printer.setResolution(Preferences.getPrinter("Resolution"))
-        
+
         preview = QPrintPreviewDialog(printer, self)
         preview.resize(800, 750)
         preview.paintRequested.connect(
-            lambda p: self.__printPreviewRequested(p, browser))
+            lambda p: self.__printPreviewRequested(p, browser)
+        )
         preview.exec()
-    
+
     def __printPreviewRequested(self, printer, browser):
         """
         Private slot to generate the print preview.
-        
+
         @param printer reference to the printer object
         @type QPrinter
         @param browser reference to the browser to be printed
@@ -808,25 +832,25 @@
         """
         with EricOverrideCursor():
             browser.page().execPrintPage(printer, 10 * 1000)
-    
+
     def __sourceChanged(self, url, browser):
         """
         Private slot to handle a change of a browsers source.
-        
+
         @param url URL of the new site
         @type QUrl
         @param browser reference to the web browser
         @type WebBrowserView
         """
         self.sourceChanged.emit(browser, url)
-        
+
         if browser == self.currentBrowser():
             self.currentUrlChanged.emit(url)
-    
+
     def __titleChanged(self, title, browser):
         """
         Private slot to handle a change of a browsers title.
-        
+
         @param title new title
         @type str
         @param browser reference to the web browser
@@ -835,16 +859,16 @@
         index = self.indexOf(browser)
         if title == "":
             title = browser.url().toString()
-        
+
         self.setTabText(index, self.__elide(title.replace("&", "&&")))
         self.setTabToolTip(index, title)
-    
+
         self.titleChanged.emit(browser, title)
-    
+
     def __elide(self, txt, mode=Qt.TextElideMode.ElideRight, length=40):
         """
         Private method to elide some text.
-        
+
         @param txt text to be elided (string)
         @param mode elide mode (Qt.TextElideMode)
         @param length amount of characters to be used (integer)
@@ -855,27 +879,27 @@
         elif mode == Qt.TextElideMode.ElideLeft:
             return "...{0}".format(txt[-length:])
         elif mode == Qt.TextElideMode.ElideMiddle:
-            return "{0}...{1}".format(txt[:length // 2], txt[-(length // 2):])
+            return "{0}...{1}".format(txt[: length // 2], txt[-(length // 2) :])
         elif mode == Qt.TextElideMode.ElideRight:
             return "{0}...".format(txt[:length])
         else:
             # just in case
             return txt
-    
+
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
         for browser in self.browsers():
             browser.preferencesChanged()
-        
+
         for urlbar in self.__stackedUrlBar.urlBars():
             urlbar.preferencesChanged()
-    
+
     def __loadFinished(self, ok, browser):
         """
         Private method to handle the loadFinished signal.
-        
+
         @param ok flag indicating the result
         @type bool
         @param browser reference to the web browser
@@ -885,14 +909,14 @@
             self.showMessage.emit(self.tr("Finished loading"))
         else:
             self.showMessage.emit(self.tr("Failed to load"))
-    
+
     def __loadProgress(self, progress, browser):
         """
         Private method to handle the loadProgress signal.
-        
+
         Note: This works around wegengine not sending a loadFinished
         signal for navigation on the same page.
-        
+
         @param progress load progress in percent
         @type int
         @param browser reference to the web browser
@@ -909,67 +933,67 @@
             self.setTabText(index, self.tr("Loading..."))
             self.setTabToolTip(index, self.tr("Loading..."))
             self.showMessage.emit(self.tr("Loading..."))
-            
+
             self.__mainWindow.setLoadingActions(True)
         elif progress == 100:
             import WebBrowser.WebBrowserWindow
+
             self.resetAnimation(index)
             self.setTabIcon(
-                index, WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(
-                    browser.url()))
+                index, WebBrowser.WebBrowserWindow.WebBrowserWindow.icon(browser.url())
+            )
             self.showMessage.emit(self.tr("Finished loading"))
-            
+
             self.__mainWindow.setLoadingActions(False)
-    
+
     def __iconChanged(self, browser):
         """
         Private slot to handle a change of the web site icon.
-        
+
         @param browser reference to the web browser
         @type WebBrowserView
         """
-        self.setTabIcon(
-            self.indexOf(browser),
-            browser.icon())
+        self.setTabIcon(self.indexOf(browser), browser.icon())
         self.__mainWindow.bookmarksManager().faviconChanged(browser.url())
-    
+
     def getSourceFileList(self):
         """
         Public method to get a list of all opened Qt help files.
-        
+
         @return dictionary with tab id as key and host/namespace as value
         """
         sourceList = {}
         for i in range(self.count()):
             browser = self.widget(i)
-            if (
-                browser is not None and
-                browser.source().isValid()
-            ):
+            if browser is not None and browser.source().isValid():
                 sourceList[i] = browser.source().host()
-        
+
         return sourceList
-    
+
     def shallShutDown(self):
         """
         Public method to check, if the application should be shut down.
-        
+
         @return flag indicating a shut down (boolean)
         """
-        if self.count() > 1 and Preferences.getWebBrowser(
-                "WarnOnMultipleClose"):
+        if self.count() > 1 and Preferences.getWebBrowser("WarnOnMultipleClose"):
             mb = EricMessageBox.EricMessageBox(
                 EricMessageBox.Information,
                 self.tr("Are you sure you want to close the window?"),
-                self.tr("""Are you sure you want to close the window?\n"""
-                        """You have %n tab(s) open.""", "", self.count()),
+                self.tr(
+                    """Are you sure you want to close the window?\n"""
+                    """You have %n tab(s) open.""",
+                    "",
+                    self.count(),
+                ),
                 modal=True,
-                parent=self)
-            quitButton = mb.addButton(
-                self.tr("&Quit"), EricMessageBox.AcceptRole)
+                parent=self,
+            )
+            quitButton = mb.addButton(self.tr("&Quit"), EricMessageBox.AcceptRole)
             quitButton.setIcon(UI.PixmapCache.getIcon("exit"))
             closeTabButton = mb.addButton(
-                self.tr("C&lose Current Tab"), EricMessageBox.AcceptRole)
+                self.tr("C&lose Current Tab"), EricMessageBox.AcceptRole
+            )
             closeTabButton.setIcon(UI.PixmapCache.getIcon("tabClose"))
             mb.addButton(EricMessageBox.Cancel)
             mb.exec()
@@ -979,30 +1003,30 @@
                 if mb.clickedButton() == closeTabButton:
                     self.closeBrowser()
                 return False
-        
+
         return True
-    
+
     def stackedUrlBar(self):
         """
         Public method to get a reference to the stacked url bar.
-        
+
         @return reference to the stacked url bar (StackedUrlBar)
         """
         return self.__stackedUrlBar
-    
+
     def currentUrlBar(self):
         """
         Public method to get a reference to the current url bar.
-        
+
         @return reference to the current url bar (UrlBar)
         """
         return self.__stackedUrlBar.currentWidget()
-    
+
     def urlBarForView(self, view):
         """
         Public method to get a reference to the UrlBar associated with the
         given view.
-        
+
         @param view reference to the view to get the urlbar for
         @type WebBrowserView
         @return reference to the associated urlbar
@@ -1011,13 +1035,13 @@
         for urlbar in self.__stackedUrlBar.urlBars():
             if urlbar.browser() is view:
                 return urlbar
-        
+
         return None
-    
+
     def __lineEditReturnPressed(self, edit):
         """
         Private slot to handle the entering of an URL.
-        
+
         @param edit reference to the line edit
         @type UrlBar
         """
@@ -1027,20 +1051,20 @@
         else:
             self.currentBrowser().setSource(url)
             self.currentBrowser().setFocus()
-    
+
     def __pathSelected(self, path):
         """
         Private slot called when a URL is selected from the completer.
-        
+
         @param path path to be shown (string)
         """
         url = self.__guessUrlFromPath(path)
         self.currentBrowser().setSource(url)
-    
+
     def __guessUrlFromPath(self, path):
         """
         Private method to guess an URL given a path string.
-        
+
         @param path path string to guess an URL for (string)
         @return guessed URL (QUrl)
         """
@@ -1049,167 +1073,159 @@
         url = manager.convertKeywordSearchToUrl(path)
         if url.isValid():
             return url
-        
+
         try:
             url = QUrl.fromUserInput(path)
         except AttributeError:
             url = QUrl(path)
-        
-        if (
-            url.scheme() == "about" and
-            url.path() == "home"
-        ):
+
+        if url.scheme() == "about" and url.path() == "home":
             url = QUrl("eric:home")
-        
+
         if url.scheme() in ["s", "search"]:
             url = manager.currentEngine().searchUrl(url.path().strip())
-        
-        if (
-            url.scheme() != "" and
-            (url.host() != "" or url.path() != "")
-        ):
+
+        if url.scheme() != "" and (url.host() != "" or url.path() != ""):
             return url
-        
+
         urlString = Preferences.getWebBrowser("DefaultScheme") + path.strip()
-        url = QUrl.fromEncoded(urlString.encode("utf-8"),
-                               QUrl.ParsingMode.TolerantMode)
-        
+        url = QUrl.fromEncoded(urlString.encode("utf-8"), QUrl.ParsingMode.TolerantMode)
+
         return url
-    
+
     def __currentChanged(self, index):
         """
         Private slot to handle an index change.
-        
+
         @param index new index (integer)
         """
         self.__stackedUrlBar.setCurrentIndex(index)
-        
+
         browser = self.browserAt(index)
         if browser is not None:
             if browser.url() == "" and browser.hasFocus():
                 self.__stackedUrlBar.currentWidget.setFocus()
             elif browser.url() != "":
                 browser.setFocus()
-    
+
     def restoreClosedTab(self, act):
         """
         Public slot to restore the most recently closed tab.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         if not self.canRestoreClosedTab():
             return
-        
+
         tab = self.__closedTabsManager.getClosedTabAt(act.data())
-        
+
         self.newBrowser(tab.url.toString(), position=tab.position)
-    
+
     def canRestoreClosedTab(self):
         """
         Public method to check, if closed tabs can be restored.
-        
+
         @return flag indicating that closed tabs can be restored (boolean)
         """
         return self.__closedTabsManager.isClosedTabAvailable()
-    
+
     def restoreAllClosedTabs(self):
         """
         Public slot to restore all closed tabs.
         """
         if not self.canRestoreClosedTab():
             return
-        
+
         for tab in self.__closedTabsManager.allClosedTabs():
             self.newBrowser(tab.url.toString(), position=tab.position)
         self.__closedTabsManager.clearList()
-    
+
     def clearClosedTabsList(self):
         """
         Public slot to clear the list of closed tabs.
         """
         self.__closedTabsManager.clearList()
-    
+
     def __aboutToShowClosedTabsMenu(self):
         """
         Private slot to populate the closed tabs menu.
         """
         fm = self.__closedTabsMenu.fontMetrics()
         try:
-            maxWidth = fm.horizontalAdvance('m') * 40
+            maxWidth = fm.horizontalAdvance("m") * 40
         except AttributeError:
-            maxWidth = fm.width('m') * 40
-        
+            maxWidth = fm.width("m") * 40
+
         self.__closedTabsMenu.clear()
         for index, tab in enumerate(self.__closedTabsManager.allClosedTabs()):
-            title = fm.elidedText(tab.title, Qt.TextElideMode.ElideRight,
-                                  maxWidth)
+            title = fm.elidedText(tab.title, Qt.TextElideMode.ElideRight, maxWidth)
             act = self.__closedTabsMenu.addAction(
-                self.__mainWindow.icon(tab.url), title)
+                self.__mainWindow.icon(tab.url), title
+            )
             act.setData(index)
             act.triggered.connect(lambda: self.restoreClosedTab(act))
         self.__closedTabsMenu.addSeparator()
         self.__closedTabsMenu.addAction(
-            self.tr("Restore All Closed Tabs"), self.restoreAllClosedTabs)
-        self.__closedTabsMenu.addAction(
-            self.tr("Clear List"), self.clearClosedTabsList)
-    
+            self.tr("Restore All Closed Tabs"), self.restoreAllClosedTabs
+        )
+        self.__closedTabsMenu.addAction(self.tr("Clear List"), self.clearClosedTabsList)
+
     def closedTabsManager(self):
         """
         Public slot to get a reference to the closed tabs manager.
-        
+
         @return reference to the closed tabs manager (ClosedTabsManager)
         """
         return self.__closedTabsManager
-    
+
     def __closedTabAvailable(self, avail):
         """
         Private slot to handle changes of the availability of closed tabs.
-        
+
         @param avail flag indicating the availability of closed tabs (boolean)
         """
         self.__closedTabsButton.setEnabled(avail)
         self.__restoreClosedTabAct.setEnabled(avail)
-    
+
     ####################################################
     ## Methods below implement session related functions
     ####################################################
-    
+
     def getSessionData(self):
         """
         Public method to populate the session data.
-        
+
         @return dictionary containing the session data
         @rtype dict
         """
         sessionData = {}
-        
+
         # 1. current index
         sessionData["CurrentTabIndex"] = self.currentIndex()
-        
+
         # 2. tab data
         sessionData["Tabs"] = []
         for index in range(self.count()):
             browser = self.widget(index)
             data = browser.getSessionData()
             sessionData["Tabs"].append(data)
-        
+
         return sessionData
-    
+
     def loadFromSessionData(self, sessionData):
         """
         Public method to load the session data.
-        
+
         @param sessionData dictionary containing the session data as
             generated by getSessionData()
         @type dict
         """
         tabCount = self.count()
-        
+
         # 1. load tab data
         if "Tabs" in sessionData:
-            loadTabOnActivate = Preferences.getWebBrowser(
-                "LoadTabOnActivation")
+            loadTabOnActivate = Preferences.getWebBrowser("LoadTabOnActivation")
             for data in sessionData["Tabs"]:
                 browser = self.newBrowser(restoreSession=True)
                 if loadTabOnActivate:
@@ -1220,12 +1236,9 @@
                     self.setTabIcon(index, icon)
                 else:
                     browser.loadFromSessionData(data)
-        
+
         # 2. set tab index
-        if (
-            "CurrentTabIndex" in sessionData and
-            sessionData["CurrentTabIndex"] >= 0
-        ):
+        if "CurrentTabIndex" in sessionData and sessionData["CurrentTabIndex"] >= 0:
             index = tabCount + sessionData["CurrentTabIndex"]
             self.setCurrentIndex(index)
             self.browserAt(index).activateSession()
--- a/src/eric7/WebBrowser/WebBrowserView.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserView.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,11 +14,27 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSignal, pyqtSlot, Qt, QUrl, QTimer, QEvent, QPoint, QPointF, QDateTime,
-    QStandardPaths, QByteArray, QIODevice, QDataStream
+    pyqtSignal,
+    pyqtSlot,
+    Qt,
+    QUrl,
+    QTimer,
+    QEvent,
+    QPoint,
+    QPointF,
+    QDateTime,
+    QStandardPaths,
+    QByteArray,
+    QIODevice,
+    QDataStream,
 )
 from PyQt6.QtGui import (
-    QDesktopServices, QClipboard, QIcon, QContextMenuEvent, QPixmap, QCursor
+    QDesktopServices,
+    QClipboard,
+    QIcon,
+    QContextMenuEvent,
+    QPixmap,
+    QCursor,
 )
 from PyQt6.QtWidgets import QStyle, QMenu, QApplication, QDialog
 from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineDownloadRequest
@@ -44,7 +60,7 @@
 class WebBrowserView(QWebEngineView):
     """
     Class implementing the web browser view widget.
-    
+
     @signal sourceChanged(QUrl) emitted after the current URL has changed
     @signal forwardAvailable(bool) emitted after the current URL has changed
     @signal backwardAvailable(bool) emitted after the current URL has changed
@@ -59,6 +75,7 @@
     @signal showMessage(str) emitted to show a message in the main window
         status bar
     """
+
     sourceChanged = pyqtSignal(QUrl)
     forwardAvailable = pyqtSignal(bool)
     backwardAvailable = pyqtSignal(bool)
@@ -69,33 +86,49 @@
     safeBrowsingAbort = pyqtSignal()
     safeBrowsingBad = pyqtSignal(str, str)
     showMessage = pyqtSignal(str)
-    
+
     ZoomLevels = [
-        30, 40, 50, 67, 80, 90,
+        30,
+        40,
+        50,
+        67,
+        80,
+        90,
         100,
-        110, 120, 133, 150, 170, 200, 220, 233, 250, 270, 285, 300,
+        110,
+        120,
+        133,
+        150,
+        170,
+        200,
+        220,
+        233,
+        250,
+        270,
+        285,
+        300,
     ]
     ZoomLevelDefault = 100
-    
+
     def __init__(self, mainWindow, parent=None, name=""):
         """
         Constructor
-        
+
         @param mainWindow reference to the main window (WebBrowserWindow)
         @param parent parent widget of this window (QWidget)
         @param name name of this window (string)
         """
         super().__init__(parent)
         self.setObjectName(name)
-        
+
         self.__rwhvqt = None
         self.installEventFilter(self)
-        
+
         self.__speedDial = WebBrowserWindow.speedDial()
-        
+
         self.__page = None
         self.__createNewPage()
-        
+
         self.__mw = mainWindow
         self.__tabWidget = parent
         self.__isLoading = False
@@ -106,57 +139,57 @@
         self.__clickedPos = QPoint()
         self.__firstLoad = False
         self.__preview = QPixmap()
-        
+
         self.__currentZoom = 100
         self.__zoomLevels = WebBrowserView.ZoomLevels[:]
-        
+
         self.iconUrlChanged.connect(self.__iconUrlChanged)
         self.urlChanged.connect(self.__urlChanged)
         self.page().linkHovered.connect(self.__linkHovered)
-        
+
         self.loadStarted.connect(self.__loadStarted)
         self.loadProgress.connect(self.__loadProgress)
         self.loadFinished.connect(self.__loadFinished)
         self.renderProcessTerminated.connect(self.__renderProcessTerminated)
-        
+
         self.__mw.openSearchManager().currentEngineChanged.connect(
-            self.__currentEngineChanged)
-        
+            self.__currentEngineChanged
+        )
+
         self.setAcceptDrops(True)
-        
+
         self.__rss = []
-        
+
         self.__clickedFrame = None
-        
+
         self.__mw.personalInformationManager().connectPage(self.page())
-        
+
         self.__inspector = None
         WebInspector.registerView(self)
-        
+
         self.__restoreData = None
-        
+
         if self.parentWidget() is not None:
             self.parentWidget().installEventFilter(self)
-        
+
         self.grabGesture(Qt.GestureType.PinchGesture)
-    
+
     def __createNewPage(self):
         """
         Private method to create a new page object.
         """
         self.__page = WebBrowserPage(self, self)
         self.setPage(self.__page)
-        
+
         self.__page.safeBrowsingAbort.connect(self.safeBrowsingAbort)
         self.__page.safeBrowsingBad.connect(self.safeBrowsingBad)
         self.__page.printPageRequested.connect(self.__printPage)
         self.__page.quotaRequested.connect(self.__quotaRequested)
         # The registerProtocolHandlerRequested signal is handled in
         # WebBrowserPage.
-        self.__page.selectClientCertificate.connect(
-            self.__selectClientCertificate)
+        self.__page.selectClientCertificate.connect(self.__selectClientCertificate)
         self.__page.findTextFinished.connect(self.__findTextFinished)
-    
+
     def __setRwhvqt(self):
         """
         Private slot to set widget that receives input events.
@@ -167,95 +200,92 @@
             self.__rwhvqt.grabGesture(Qt.GestureType.PinchGesture)
             self.__rwhvqt.installEventFilter(self)
         else:
-            print("Focus proxy is null!")   # __IGNORE_WARNING_M801__
-    
+            print("Focus proxy is null!")  # __IGNORE_WARNING_M801__
+
     def __currentEngineChanged(self):
         """
         Private slot to track a change of the current search engine.
         """
         if self.url().toString() == "eric:home":
             self.reload()
-    
+
     def mainWindow(self):
         """
         Public method to get a reference to the main window.
-        
+
         @return reference to the main window
         @rtype WebBrowserWindow
         """
         return self.__mw
-    
+
     def tabWidget(self):
         """
         Public method to get a reference to the tab widget containing this
         view.
-        
+
         @return reference to the tab widget
         @rtype WebBrowserTabWidget
         """
         return self.__tabWidget
-    
+
     def load(self, url):
         """
         Public method to load a web site.
-        
+
         @param url URL to be loaded
         @type QUrl
         """
-        if (
-            self.__page is not None and
-            not self.__page.acceptNavigationRequest(
-                url, QWebEnginePage.NavigationType.NavigationTypeTyped, True)
+        if self.__page is not None and not self.__page.acceptNavigationRequest(
+            url, QWebEnginePage.NavigationType.NavigationTypeTyped, True
         ):
             return
-        
+
         super().load(url)
-        
+
         if not self.__firstLoad:
             self.__firstLoad = True
             WebInspector.pushView(self)
-    
+
     def setSource(self, name, newTab=False):
         """
         Public method used to set the source to be displayed.
-        
+
         @param name filename to be shown (QUrl)
         @param newTab flag indicating to open the URL in a new tab (bool)
         """
         if name is None or not name.isValid():
             return
-        
+
         if newTab:
             # open in a new tab
             self.__mw.newTab(name)
             return
-        
+
         if not name.scheme():
             if not os.path.exists(name.toString()):
                 name.setScheme(Preferences.getWebBrowser("DefaultScheme"))
             else:
                 if Utilities.isWindowsPlatform():
-                    name.setUrl("file:///" + Utilities.fromNativeSeparators(
-                        name.toString()))
+                    name.setUrl(
+                        "file:///" + Utilities.fromNativeSeparators(name.toString())
+                    )
                 else:
                     name.setUrl("file://" + name.toString())
-        
-        if (
-            len(name.scheme()) == 1 or
-            name.scheme() == "file"
-        ):
+
+        if len(name.scheme()) == 1 or name.scheme() == "file":
             # name is a local file
             if name.scheme() and len(name.scheme()) == 1:
                 # it is a local path on win os
                 name = QUrl.fromLocalFile(name.toString())
-            
+
             if not pathlib.Path(name.toLocalFile()).exists():
                 EricMessageBox.critical(
                     self,
                     self.tr("eric Web Browser"),
-                    self.tr(
-                        """<p>The file <b>{0}</b> does not exist.</p>""")
-                    .format(name.toLocalFile()))
+                    self.tr("""<p>The file <b>{0}</b> does not exist.</p>""").format(
+                        name.toLocalFile()
+                    ),
+                )
                 return
 
             if name.toLocalFile().lower().endswith((".pdf", ".chm")):
@@ -266,8 +296,9 @@
                         self.tr("eric Web Browser"),
                         self.tr(
                             """<p>Could not start a viewer"""
-                            """ for file <b>{0}</b>.</p>""")
-                        .format(name.path()))
+                            """ for file <b>{0}</b>.</p>"""
+                        ).format(name.path()),
+                    )
                 return
         elif name.scheme() in ["mailto"]:
             started = QDesktopServices.openUrl(name)
@@ -277,8 +308,9 @@
                     self.tr("eric Web Browser"),
                     self.tr(
                         """<p>Could not start an application"""
-                        """ for URL <b>{0}</b>.</p>""")
-                    .format(name.toString()))
+                        """ for URL <b>{0}</b>.</p>"""
+                    ).format(name.toString()),
+                )
             return
         else:
             if name.toString().lower().endswith((".pdf", ".chm")):
@@ -289,42 +321,43 @@
                         self.tr("eric Web Browser"),
                         self.tr(
                             """<p>Could not start a viewer"""
-                            """ for file <b>{0}</b>.</p>""")
-                        .format(name.path()))
+                            """ for file <b>{0}</b>.</p>"""
+                        ).format(name.path()),
+                    )
                 return
-        
+
         self.load(name)
 
     def source(self):
         """
         Public method to return the URL of the loaded page.
-        
+
         @return URL loaded in the help browser (QUrl)
         """
         return self.url()
-    
+
     def documentTitle(self):
         """
         Public method to return the title of the loaded page.
-        
+
         @return title (string)
         """
         return self.title()
-    
+
     def backward(self):
         """
         Public slot to move backwards in history.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Back)
         self.__urlChanged(self.history().currentItem().url())
-    
+
     def forward(self):
         """
         Public slot to move forward in history.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Forward)
         self.__urlChanged(self.history().currentItem().url())
-    
+
     def home(self):
         """
         Public slot to move to the first page loaded.
@@ -332,81 +365,81 @@
         homeUrl = QUrl(Preferences.getWebBrowser("HomePage"))
         self.setSource(homeUrl)
         self.__urlChanged(self.history().currentItem().url())
-    
+
     def reload(self):
         """
         Public slot to reload the current page.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Reload)
-    
+
     def reloadBypassingCache(self):
         """
         Public slot to reload the current page bypassing the cache.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.ReloadAndBypassCache)
-    
+
     def copy(self):
         """
         Public slot to copy the selected text.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Copy)
-    
+
     def cut(self):
         """
         Public slot to cut the selected text.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Cut)
-    
+
     def paste(self):
         """
         Public slot to paste text from the clipboard.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Paste)
-    
+
     def undo(self):
         """
         Public slot to undo the last edit action.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Undo)
-    
+
     def redo(self):
         """
         Public slot to redo the last edit action.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Redo)
-    
+
     def selectAll(self):
         """
         Public slot to select all text.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.SelectAll)
-    
+
     def unselect(self):
         """
         Public slot to clear the current selection.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.Unselect)
-    
+
     def isForwardAvailable(self):
         """
         Public method to determine, if a forward move in history is possible.
-        
+
         @return flag indicating move forward is possible (boolean)
         """
         return self.history().canGoForward()
-    
+
     def isBackwardAvailable(self):
         """
         Public method to determine, if a backwards move in history is possible.
-        
+
         @return flag indicating move backwards is possible (boolean)
         """
         return self.history().canGoBack()
-    
+
     def __levelForZoom(self, zoom):
         """
         Private method determining the zoom level index given a zoom factor.
-        
+
         @param zoom zoom factor (integer)
         @return index of zoom factor (integer)
         """
@@ -417,11 +450,11 @@
                 if zoom <= self.__zoomLevels[index]:
                     break
         return index
-    
+
     def setZoomValue(self, value, saveValue=True):
         """
         Public method to set the zoom value.
-        
+
         @param value zoom value (integer)
         @param saveValue flag indicating to save the zoom value with the
             zoom manager
@@ -432,18 +465,19 @@
             self.__currentZoom = value
             if saveValue and not self.__mw.isPrivate():
                 from .ZoomManager import ZoomManager
+
                 ZoomManager.instance().setZoomValue(self.url(), value)
             self.zoomValueChanged.emit(value)
-    
+
     def zoomValue(self):
         """
         Public method to get the current zoom value.
-        
+
         @return zoom value (integer)
         """
         val = self.zoomFactor() * 100
         return int(val)
-    
+
     def zoomIn(self):
         """
         Public slot to zoom into the page.
@@ -451,7 +485,7 @@
         index = self.__levelForZoom(self.__currentZoom)
         if index < len(self.__zoomLevels) - 1:
             self.setZoomValue(self.__zoomLevels[index + 1])
-    
+
     def zoomOut(self):
         """
         Public slot to zoom out of the page.
@@ -459,37 +493,37 @@
         index = self.__levelForZoom(self.__currentZoom)
         if index > 0:
             self.setZoomValue(self.__zoomLevels[index - 1])
-    
+
     def zoomReset(self):
         """
         Public method to reset the zoom factor.
         """
         index = self.__levelForZoom(WebBrowserView.ZoomLevelDefault)
         self.setZoomValue(self.__zoomLevels[index])
-    
+
     def mapToViewport(self, pos):
         """
         Public method to map a position to the viewport.
-        
+
         @param pos position to be mapped
         @type QPoint
         @return viewport position
         @rtype QPoint
         """
         return self.page().mapToViewport(pos)
-    
+
     def hasSelection(self):
         """
         Public method to determine, if there is some text selected.
-        
+
         @return flag indicating text has been selected (boolean)
         """
         return self.selectedText() != ""
-    
+
     def findNextPrev(self, txt, case, backwards, callback):
         """
         Public slot to find the next occurrence of a text.
-        
+
         @param txt text to search for (string)
         @param case flag indicating a case sensitive search (boolean)
         @param backwards flag indicating a backwards search (boolean)
@@ -501,71 +535,75 @@
             findFlags |= QWebEnginePage.FindFlag.FindCaseSensitively
         if backwards:
             findFlags |= QWebEnginePage.FindFlag.FindBackward
-        
+
         if callback is None:
             self.findText(txt, findFlags)
         else:
             self.findText(txt, findFlags, callback)
-    
+
     def __findTextFinished(self, result):
         """
         Private slot handling the findTextFinished signal of the web page.
-        
+
         @param result reference to the QWebEngineFindTextResult object of the
             last search
         @type QWebEngineFindTextResult
         """
-        self.showMessage.emit(self.tr("Match {0} of {1}").format(
-            result.activeMatch(), result.numberOfMatches())
+        self.showMessage.emit(
+            self.tr("Match {0} of {1}").format(
+                result.activeMatch(), result.numberOfMatches()
+            )
         )
-    
+
     def contextMenuEvent(self, evt):
         """
         Protected method called to create a context menu.
-        
+
         This method is overridden from QWebEngineView.
-        
+
         @param evt reference to the context menu event object
             (QContextMenuEvent)
         """
         pos = evt.pos()
         reason = evt.reason()
         QTimer.singleShot(
-            0, functools.partial(
-                self._contextMenuEvent, QContextMenuEvent(reason, pos)))
+            0, functools.partial(self._contextMenuEvent, QContextMenuEvent(reason, pos))
+        )
         # needs to be done this way because contextMenuEvent is blocking
         # the main loop
-    
+
     def _contextMenuEvent(self, evt):
         """
         Protected method called to create a context menu.
-        
+
         @param evt reference to the context menu event object
             (QContextMenuEvent)
         """
         self.__menu.clear()
-        
+
         hitTest = self.page().hitTestContent(evt.pos())
-        
+
         self.__createContextMenu(self.__menu, hitTest)
-        
+
         if not hitTest.isContentEditable() and not hitTest.isContentSelected():
             self.__menu.addSeparator()
             self.__menu.addMenu(self.__mw.adBlockIcon().menu())
-        
+
         self.__menu.addSeparator()
         self.__menu.addAction(
             UI.PixmapCache.getIcon("webInspector"),
-            self.tr("Inspect Element..."), self.__webInspector)
-        
+            self.tr("Inspect Element..."),
+            self.__webInspector,
+        )
+
         if not self.__menu.isEmpty():
             pos = evt.globalPos()
             self.__menu.popup(QPoint(pos.x(), pos.y() + 1))
-    
+
     def __createContextMenu(self, menu, hitTest):
         """
         Private method to populate the context menu.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param hitTest reference to the hit test object
@@ -574,35 +612,36 @@
         spellCheckActionCount = 0
         contextMenuData = self.lastContextMenuRequest()
         hitTest.updateWithContextMenuData(contextMenuData)
-        
+
         if bool(contextMenuData.misspelledWord()):
             boldFont = menu.font()
             boldFont.setBold(True)
-            
+
             for suggestion in contextMenuData.spellCheckerSuggestions():
                 act = menu.addAction(suggestion)
                 act.setFont(boldFont)
                 act.triggered.connect(
-                    functools.partial(self.__replaceMisspelledWord, act))
-            
+                    functools.partial(self.__replaceMisspelledWord, act)
+                )
+
             if not bool(menu.actions()):
                 menu.addAction(self.tr("No suggestions")).setEnabled(False)
-            
+
             menu.addSeparator()
             spellCheckActionCount = len(menu.actions())
-        
+
         if (
-            not hitTest.linkUrl().isEmpty() and
-            hitTest.linkUrl().scheme() != "javascript"
+            not hitTest.linkUrl().isEmpty()
+            and hitTest.linkUrl().scheme() != "javascript"
         ):
             self.__createLinkContextMenu(menu, hitTest)
-        
+
         if not hitTest.imageUrl().isEmpty():
             self.__createImageContextMenu(menu, hitTest)
-        
+
         if not hitTest.mediaUrl().isEmpty():
             self.__createMediaContextMenu(menu, hitTest)
-        
+
         if hitTest.isContentEditable():
             # check, if only spell checker actions were added
             if len(menu.actions()) == spellCheckActionCount:
@@ -614,24 +653,25 @@
                 menu.addAction(self.__mw.pasteAct)
                 menu.addSeparator()
                 self.__mw.personalInformationManager().createSubMenu(
-                    menu, self, hitTest)
-            
+                    menu, self, hitTest
+                )
+
             if hitTest.tagName() == "input":
                 menu.addSeparator()
                 act = menu.addAction("")
                 act.setVisible(False)
                 self.__checkForForm(act, hitTest.pos())
-        
+
         if self.selectedText():
             self.__createSelectedTextContextMenu(menu, hitTest)
-        
+
         if self.__menu.isEmpty():
             self.__createPageContextMenu(menu)
-    
+
     def __createLinkContextMenu(self, menu, hitTest):
         """
         Private method to populate the context menu for URLs.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param hitTest reference to the hit test object
@@ -639,63 +679,59 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         act = menu.addAction(
             UI.PixmapCache.getIcon("openNewTab"),
-            self.tr("Open Link in New Tab\tCtrl+LMB"))
+            self.tr("Open Link in New Tab\tCtrl+LMB"),
+        )
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewTab, act))
+        act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
         act = menu.addAction(
-            UI.PixmapCache.getIcon("newWindow"),
-            self.tr("Open Link in New Window"))
+            UI.PixmapCache.getIcon("newWindow"), self.tr("Open Link in New Window")
+        )
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewWindow, act))
+        act.triggered.connect(functools.partial(self.__openLinkInNewWindow, act))
         act = menu.addAction(
             UI.PixmapCache.getIcon("privateMode"),
-            self.tr("Open Link in New Private Window"))
+            self.tr("Open Link in New Private Window"),
+        )
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewPrivateWindow, act))
+        act.triggered.connect(functools.partial(self.__openLinkInNewPrivateWindow, act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download"),
-            self.tr("Save Lin&k"), self.__downloadLink)
+            self.tr("Save Lin&k"),
+            self.__downloadLink,
+        )
         act = menu.addAction(
-            UI.PixmapCache.getIcon("bookmark22"),
-            self.tr("Bookmark this Link"))
+            UI.PixmapCache.getIcon("bookmark22"), self.tr("Bookmark this Link")
+        )
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__bookmarkLink, act))
+        act.triggered.connect(functools.partial(self.__bookmarkLink, act))
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy URL to Clipboard")
+        )
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("mailSend"),
-            self.tr("Send URL"))
+        act.triggered.connect(functools.partial(self.__copyLink, act))
+        act = menu.addAction(UI.PixmapCache.getIcon("mailSend"), self.tr("Send URL"))
         act.setData(hitTest.linkUrl())
-        act.triggered.connect(
-            functools.partial(self.__sendLink, act))
+        act.triggered.connect(functools.partial(self.__sendLink, act))
         if (
-            Preferences.getWebBrowser("VirusTotalEnabled") and
-            Preferences.getWebBrowser("VirusTotalServiceKey") != ""
+            Preferences.getWebBrowser("VirusTotalEnabled")
+            and Preferences.getWebBrowser("VirusTotalServiceKey") != ""
         ):
             act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal"),
-                self.tr("Scan Link with VirusTotal"))
+                self.tr("Scan Link with VirusTotal"),
+            )
             act.setData(hitTest.linkUrl())
-            act.triggered.connect(
-                functools.partial(self.__virusTotal, act))
-        
+            act.triggered.connect(functools.partial(self.__virusTotal, act))
+
     def __createImageContextMenu(self, menu, hitTest):
         """
         Private method to populate the context menu for images.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param hitTest reference to the hit test object
@@ -703,77 +739,70 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         act = menu.addAction(
-            UI.PixmapCache.getIcon("openNewTab"),
-            self.tr("Open Image in New Tab"))
+            UI.PixmapCache.getIcon("openNewTab"), self.tr("Open Image in New Tab")
+        )
         act.setData(hitTest.imageUrl())
-        act.triggered.connect(
-            functools.partial(self.__openLinkInNewTab, act))
+        act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
         menu.addSeparator()
         menu.addAction(
             UI.PixmapCache.getIcon("download"),
-            self.tr("Save Image"), self.__downloadImage)
-        menu.addAction(
-            self.tr("Copy Image to Clipboard"), self.__copyImage)
+            self.tr("Save Image"),
+            self.__downloadImage,
+        )
+        menu.addAction(self.tr("Copy Image to Clipboard"), self.__copyImage)
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy Image URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy Image URL to Clipboard")
+        )
         act.setData(hitTest.imageUrl())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
+        act.triggered.connect(functools.partial(self.__copyLink, act))
         act = menu.addAction(
-            UI.PixmapCache.getIcon("mailSend"),
-            self.tr("Send Image URL"))
+            UI.PixmapCache.getIcon("mailSend"), self.tr("Send Image URL")
+        )
         act.setData(hitTest.imageUrl())
-        act.triggered.connect(
-            functools.partial(self.__sendLink, act))
-        
+        act.triggered.connect(functools.partial(self.__sendLink, act))
+
         if hitTest.imageUrl().scheme() in ["http", "https"]:
             menu.addSeparator()
             engine = WebBrowserWindow.imageSearchEngine()
             searchEngineName = engine.searchEngine()
             act = menu.addAction(
-                UI.PixmapCache.getIcon("{0}".format(
-                    searchEngineName.lower())),
-                self.tr("Search image in {0}").format(searchEngineName))
+                UI.PixmapCache.getIcon("{0}".format(searchEngineName.lower())),
+                self.tr("Search image in {0}").format(searchEngineName),
+            )
             act.setData(engine.getSearchQuery(hitTest.imageUrl()))
-            act.triggered.connect(
-                functools.partial(self.__searchImage, act))
-            self.__imageSearchMenu = menu.addMenu(
-                self.tr("Search image with..."))
+            act.triggered.connect(functools.partial(self.__searchImage, act))
+            self.__imageSearchMenu = menu.addMenu(self.tr("Search image with..."))
             for searchEngineName in engine.searchEngineNames():
                 act = self.__imageSearchMenu.addAction(
-                    UI.PixmapCache.getIcon("{0}".format(
-                        searchEngineName.lower())),
-                    self.tr("Search image in {0}").format(searchEngineName))
-                act.setData(engine.getSearchQuery(
-                    hitTest.imageUrl(), searchEngineName))
-                act.triggered.connect(
-                    functools.partial(self.__searchImage, act))
-        
+                    UI.PixmapCache.getIcon("{0}".format(searchEngineName.lower())),
+                    self.tr("Search image in {0}").format(searchEngineName),
+                )
+                act.setData(engine.getSearchQuery(hitTest.imageUrl(), searchEngineName))
+                act.triggered.connect(functools.partial(self.__searchImage, act))
+
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("adBlockPlus"),
-            self.tr("Block Image"))
+            UI.PixmapCache.getIcon("adBlockPlus"), self.tr("Block Image")
+        )
         act.setData(hitTest.imageUrl().toString())
-        act.triggered.connect(
-            functools.partial(self.__blockImage, act))
+        act.triggered.connect(functools.partial(self.__blockImage, act))
         if (
-            Preferences.getWebBrowser("VirusTotalEnabled") and
-            Preferences.getWebBrowser("VirusTotalServiceKey") != ""
+            Preferences.getWebBrowser("VirusTotalEnabled")
+            and Preferences.getWebBrowser("VirusTotalServiceKey") != ""
         ):
             act = menu.addAction(
                 UI.PixmapCache.getIcon("virustotal"),
-                self.tr("Scan Image with VirusTotal"))
+                self.tr("Scan Image with VirusTotal"),
+            )
             act.setData(hitTest.imageUrl())
-            act.triggered.connect(
-                functools.partial(self.__virusTotal, act))
-    
+            act.triggered.connect(functools.partial(self.__virusTotal, act))
+
     def __createMediaContextMenu(self, menu, hitTest):
         """
         Private method to populate the context menu for media elements.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param hitTest reference to the hit test object
@@ -781,44 +810,52 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         if hitTest.mediaPaused():
             menu.addAction(
                 UI.PixmapCache.getIcon("mediaPlaybackStart"),
-                self.tr("Play"), self.__pauseMedia)
+                self.tr("Play"),
+                self.__pauseMedia,
+            )
         else:
             menu.addAction(
                 UI.PixmapCache.getIcon("mediaPlaybackPause"),
-                self.tr("Pause"), self.__pauseMedia)
+                self.tr("Pause"),
+                self.__pauseMedia,
+            )
         if hitTest.mediaMuted():
             menu.addAction(
                 UI.PixmapCache.getIcon("audioVolumeHigh"),
-                self.tr("Unmute"), self.__muteMedia)
+                self.tr("Unmute"),
+                self.__muteMedia,
+            )
         else:
             menu.addAction(
                 UI.PixmapCache.getIcon("audioVolumeMuted"),
-                self.tr("Mute"), self.__muteMedia)
+                self.tr("Mute"),
+                self.__muteMedia,
+            )
         menu.addSeparator()
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy Media URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy Media URL to Clipboard")
+        )
         act.setData(hitTest.mediaUrl())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
+        act.triggered.connect(functools.partial(self.__copyLink, act))
         act = menu.addAction(
-            UI.PixmapCache.getIcon("mailSend"),
-            self.tr("Send Media URL"))
+            UI.PixmapCache.getIcon("mailSend"), self.tr("Send Media URL")
+        )
         act.setData(hitTest.mediaUrl())
-        act.triggered.connect(
-            functools.partial(self.__sendLink, act))
+        act.triggered.connect(functools.partial(self.__sendLink, act))
         menu.addAction(
             UI.PixmapCache.getIcon("download"),
-            self.tr("Save Media"), self.__downloadMedia)
-    
+            self.tr("Save Media"),
+            self.__downloadMedia,
+        )
+
     def __createSelectedTextContextMenu(self, menu, hitTest):
         """
         Private method to populate the context menu for selected text.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         @param hitTest reference to the hit test object
@@ -826,25 +863,22 @@
         """
         if not menu.isEmpty():
             menu.addSeparator()
-        
+
         menu.addAction(self.__mw.copyAct)
         menu.addSeparator()
-        act = menu.addAction(
-            UI.PixmapCache.getIcon("mailSend"),
-            self.tr("Send Text"))
+        act = menu.addAction(UI.PixmapCache.getIcon("mailSend"), self.tr("Send Text"))
         act.setData(self.selectedText())
-        act.triggered.connect(
-            functools.partial(self.__sendLink, act))
-        
+        act.triggered.connect(functools.partial(self.__sendLink, act))
+
         engineName = self.__mw.openSearchManager().currentEngineName()
         if engineName:
-            menu.addAction(self.tr("Search with '{0}'").format(engineName),
-                           self.__searchDefaultRequested)
-        
-        from .OpenSearch.OpenSearchEngineAction import (
-            OpenSearchEngineAction
-        )
-        
+            menu.addAction(
+                self.tr("Search with '{0}'").format(engineName),
+                self.__searchDefaultRequested,
+            )
+
+        from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction
+
         self.__searchMenu = menu.addMenu(self.tr("Search with..."))
         engineNames = self.__mw.openSearchManager().allEnginesNames()
         for engineName in engineNames:
@@ -853,48 +887,52 @@
             act.setData(engineName)
             self.__searchMenu.addAction(act)
         self.__searchMenu.triggered.connect(self.__searchRequested)
-        
+
         menu.addSeparator()
-        
+
         from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
+
         languages = Preferences.toList(
             Preferences.getSettings().value(
                 "WebBrowser/AcceptLanguages",
-                WebBrowserLanguagesDialog.defaultAcceptLanguages()))
+                WebBrowserLanguagesDialog.defaultAcceptLanguages(),
+            )
+        )
         if languages:
             language = languages[0]
             langCode = language.split("[")[1][:2]
             googleTranslatorUrl = QUrl(
                 "http://translate.google.com/#auto/{0}/{1}".format(
-                    langCode, self.selectedText()))
+                    langCode, self.selectedText()
+                )
+            )
             act = menu.addAction(
-                UI.PixmapCache.getIcon("translate"),
-                self.tr("Google Translate"))
+                UI.PixmapCache.getIcon("translate"), self.tr("Google Translate")
+            )
             act.setData(googleTranslatorUrl)
-            act.triggered.connect(
-                functools.partial(self.__openLinkInNewTab, act))
+            act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
             wiktionaryUrl = QUrl(
-                "http://{0}.wiktionary.org/wiki/Special:Search?search={1}"
-                .format(langCode, self.selectedText()))
+                "http://{0}.wiktionary.org/wiki/Special:Search?search={1}".format(
+                    langCode, self.selectedText()
+                )
+            )
             act = menu.addAction(
-                UI.PixmapCache.getIcon("wikipedia"),
-                self.tr("Dictionary"))
+                UI.PixmapCache.getIcon("wikipedia"), self.tr("Dictionary")
+            )
             act.setData(wiktionaryUrl)
-            act.triggered.connect(
-                functools.partial(self.__openLinkInNewTab, act))
+            act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
             menu.addSeparator()
-        
+
         guessedUrl = QUrl.fromUserInput(self.selectedText().strip())
         if self.__isUrlValid(guessedUrl):
             act = menu.addAction(self.tr("Go to web address"))
             act.setData(guessedUrl)
-            act.triggered.connect(
-                functools.partial(self.__openLinkInNewTab, act))
-    
+            act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
+
     def __createPageContextMenu(self, menu):
         """
         Private method to populate the basic context menu.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         """
@@ -905,7 +943,7 @@
             menu.addAction(self.__mw.saveAsAct)
         menu.addAction(self.__mw.saveVisiblePageScreenAct)
         menu.addSeparator()
-        
+
         if self.url().toString() == "eric:speeddial":
             # special menu for the spedd dial page
             menu.addAction(self.__mw.backAct)
@@ -913,39 +951,44 @@
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("plus"),
-                self.tr("Add New Page"), self.__addSpeedDial)
+                self.tr("Add New Page"),
+                self.__addSpeedDial,
+            )
             menu.addAction(
                 UI.PixmapCache.getIcon("preferences-general"),
-                self.tr("Configure Speed Dial"), self.__configureSpeedDial)
+                self.tr("Configure Speed Dial"),
+                self.__configureSpeedDial,
+            )
             menu.addSeparator()
             menu.addAction(
                 UI.PixmapCache.getIcon("reload"),
-                self.tr("Reload All Dials"), self.__reloadAllSpeedDials)
+                self.tr("Reload All Dials"),
+                self.__reloadAllSpeedDials,
+            )
             menu.addSeparator()
-            menu.addAction(
-                self.tr("Reset to Default Dials"), self.__resetSpeedDials)
+            menu.addAction(self.tr("Reset to Default Dials"), self.__resetSpeedDials)
             return
-        
+
         menu.addAction(
             UI.PixmapCache.getIcon("bookmark22"),
-            self.tr("Bookmark this Page"), self.addBookmark)
+            self.tr("Bookmark this Page"),
+            self.addBookmark,
+        )
         act = menu.addAction(
-            UI.PixmapCache.getIcon("editCopy"),
-            self.tr("Copy Page URL to Clipboard"))
+            UI.PixmapCache.getIcon("editCopy"), self.tr("Copy Page URL to Clipboard")
+        )
         act.setData(self.url())
-        act.triggered.connect(
-            functools.partial(self.__copyLink, act))
+        act.triggered.connect(functools.partial(self.__copyLink, act))
         act = menu.addAction(
-            UI.PixmapCache.getIcon("mailSend"),
-            self.tr("Send Page URL"))
+            UI.PixmapCache.getIcon("mailSend"), self.tr("Send Page URL")
+        )
         act.setData(self.url())
-        act.triggered.connect(
-            functools.partial(self.__sendLink, act))
+        act.triggered.connect(functools.partial(self.__sendLink, act))
         menu.addSeparator()
-        
+
         from .UserAgent.UserAgentMenu import UserAgentMenu
-        self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"),
-                                             url=self.url())
+
+        self.__userAgentMenu = UserAgentMenu(self.tr("User Agent"), url=self.url())
         menu.addMenu(self.__userAgentMenu)
         menu.addSeparator()
         menu.addAction(self.__mw.backAct)
@@ -967,60 +1010,62 @@
         menu.addAction(self.__mw.siteInfoAct)
         if self.url().scheme() in ["http", "https"]:
             menu.addSeparator()
-            
+
             w3url = QUrl.fromEncoded(
-                b"http://validator.w3.org/check?uri=" +
-                QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode()))
-            act = menu.addAction(
-                UI.PixmapCache.getIcon("w3"),
-                self.tr("Validate Page"))
+                b"http://validator.w3.org/check?uri="
+                + QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode())
+            )
+            act = menu.addAction(UI.PixmapCache.getIcon("w3"), self.tr("Validate Page"))
             act.setData(w3url)
-            act.triggered.connect(
-                functools.partial(self.__openLinkInNewTab, act))
-            
+            act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
+
             from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
+
             languages = Preferences.toList(
                 Preferences.getSettings().value(
                     "WebBrowser/AcceptLanguages",
-                    WebBrowserLanguagesDialog.defaultAcceptLanguages()))
+                    WebBrowserLanguagesDialog.defaultAcceptLanguages(),
+                )
+            )
             if languages:
                 language = languages[0]
                 langCode = language.split("[")[1][:2]
                 googleTranslatorUrl = QUrl.fromEncoded(
-                    b"http://translate.google.com/translate?sl=auto&tl=" +
-                    langCode.encode() +
-                    b"&u=" +
-                    QUrl.toPercentEncoding(
-                        bytes(self.url().toEncoded()).decode()))
+                    b"http://translate.google.com/translate?sl=auto&tl="
+                    + langCode.encode()
+                    + b"&u="
+                    + QUrl.toPercentEncoding(bytes(self.url().toEncoded()).decode())
+                )
                 act = menu.addAction(
-                    UI.PixmapCache.getIcon("translate"),
-                    self.tr("Google Translate"))
+                    UI.PixmapCache.getIcon("translate"), self.tr("Google Translate")
+                )
                 act.setData(googleTranslatorUrl)
-                act.triggered.connect(
-                    functools.partial(self.__openLinkInNewTab, act))
-    
+                act.triggered.connect(functools.partial(self.__openLinkInNewTab, act))
+
     def __checkForForm(self, act, pos):
         """
         Private method to check the given position for an open search form.
-        
+
         @param act reference to the action to be populated upon success
         @type QAction
         @param pos position to be tested
         @type QPoint
         """
         self.__clickedPos = self.mapToViewport(pos)
-        
+
         from .Tools import Scripts
+
         script = Scripts.getFormData(self.__clickedPos)
         self.page().runJavaScript(
             script,
             WebBrowserPage.SafeJsWorld,
-            lambda res: self.__checkForFormCallback(res, act))
-    
+            lambda res: self.__checkForFormCallback(res, act),
+        )
+
     def __checkForFormCallback(self, res, act):
         """
         Private method handling the __checkForForm result.
-        
+
         @param res result dictionary generated by JavaScript
         @type dict
         @param act reference to the action to be populated upon success
@@ -1028,257 +1073,259 @@
         """
         if act is None or not bool(res):
             return
-        
+
         url = QUrl(res["action"])
         method = res["method"]
-        
+
         if not url.isEmpty() and method in ["get", "post"]:
             act.setVisible(True)
             act.setText(self.tr("Add to web search toolbar"))
             act.triggered.connect(self.__addSearchEngine)
-    
+
     def __isUrlValid(self, url):
         """
         Private method to check a URL for validity.
-        
+
         @param url URL to be checked (QUrl)
         @return flag indicating a valid URL (boolean)
         """
         return (
-            url.isValid() and
-            bool(url.host()) and
-            bool(url.scheme()) and
-            "." in url.host()
+            url.isValid()
+            and bool(url.host())
+            and bool(url.scheme())
+            and "." in url.host()
         )
-    
+
     def __replaceMisspelledWord(self, act):
         """
         Private slot to replace a misspelled word under the context menu.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         suggestion = act.text()
         self.page().replaceMisspelledWord(suggestion)
-    
+
     def __openLinkInNewTab(self, act):
         """
         Private method called by the context menu to open a link in a new
         tab.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.setSource(url, newTab=True)
-    
+
     def __openLinkInNewWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         window.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__mw.newWindow(url)
-    
+
     def __openLinkInNewPrivateWindow(self, act):
         """
         Private slot called by the context menu to open a link in a new
         private window.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         self.__mw.newPrivateWindow(url)
-    
+
     def __bookmarkLink(self, act):
         """
         Private slot to bookmark a link via the context menu.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         if url.isEmpty():
             return
-        
+
         from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         dlg.setUrl(bytes(url.toEncoded()).decode())
         dlg.exec()
-    
+
     def __sendLink(self, act):
         """
         Private slot to send a link via email.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
-        
+
         if isinstance(data, QUrl):
             data = data.toString()
         QDesktopServices.openUrl(QUrl("mailto:?body=" + data))
-    
+
     def __copyLink(self, act):
         """
         Private slot to copy a link to the clipboard.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         data = act.data()
         if isinstance(data, QUrl) and data.isEmpty():
             return
-        
+
         if isinstance(data, QUrl):
             data = data.toString()
-        
+
         # copy the URL to both clipboard areas
         QApplication.clipboard().setText(data, QClipboard.Mode.Clipboard)
         QApplication.clipboard().setText(data, QClipboard.Mode.Selection)
-    
+
     def __downloadLink(self):
         """
         Private slot to download a link and save it to disk.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.DownloadLinkToDisk)
-    
+
     def __downloadImage(self):
         """
         Private slot to download an image and save it to disk.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.DownloadImageToDisk)
-    
+
     def __copyImage(self):
         """
         Private slot to copy an image to the clipboard.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.CopyImageToClipboard)
-    
+
     def __blockImage(self, act):
         """
         Private slot to add a block rule for an image URL.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         dlg = WebBrowserWindow.adBlockManager().showDialog()
         dlg.addCustomRule(url)
-    
+
     def __searchImage(self, act):
         """
         Private slot to search for an image URL.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         self.setSource(url, newTab=True)
-    
+
     def __downloadMedia(self):
         """
         Private slot to download a media and save it to disk.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.DownloadMediaToDisk)
-    
+
     def __pauseMedia(self):
         """
         Private slot to pause or play the selected media.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.ToggleMediaPlayPause)
-    
+
     def __muteMedia(self):
         """
         Private slot to (un)mute the selected media.
         """
         self.triggerPageAction(QWebEnginePage.WebAction.ToggleMediaMute)
-    
+
     def __virusTotal(self, act):
         """
         Private slot to scan the selected URL with VirusTotal.
-        
+
         @param act reference to the action that triggered
         @type QAction
         """
         url = act.data()
         self.__mw.requestVirusTotalScan(url)
-    
+
     def __searchDefaultRequested(self):
         """
         Private slot to search for some text with the current search engine.
         """
         searchText = self.selectedText()
-        
+
         if not searchText:
             return
-        
+
         engine = self.__mw.openSearchManager().currentEngine()
         if engine:
             self.search.emit(engine.searchUrl(searchText))
-    
+
     def __searchRequested(self, act):
         """
         Private slot to search for some text with a selected search engine.
-        
+
         @param act reference to the action that triggered this slot (QAction)
         """
         searchText = self.selectedText()
-        
+
         if not searchText:
             return
-        
+
         engineName = act.data()
         engine = (
             self.__mw.openSearchManager().engine(engineName)
-            if engineName else
-            self.__mw.openSearchManager().currentEngine()
+            if engineName
+            else self.__mw.openSearchManager().currentEngine()
         )
         if engine:
             self.search.emit(engine.searchUrl(searchText))
-    
+
     def __addSearchEngine(self):
         """
         Private slot to add a new search engine.
         """
         from .Tools import Scripts
+
         script = Scripts.getFormData(self.__clickedPos)
         self.page().runJavaScript(
             script,
             WebBrowserPage.SafeJsWorld,
-            lambda res: self.__mw.openSearchManager().addEngineFromForm(
-                res, self))
-    
+            lambda res: self.__mw.openSearchManager().addEngineFromForm(res, self),
+        )
+
     def __webInspector(self):
         """
         Private slot to show the web inspector window.
         """
         from .WebInspector import WebInspector
+
         if WebInspector.isEnabled():
             if self.__inspector is None:
                 self.__inspector = WebInspector()
                 self.__inspector.setView(self, True)
-                self.__inspector.inspectorClosed.connect(
-                    self.closeWebInspector)
+                self.__inspector.inspectorClosed.connect(self.closeWebInspector)
                 self.__inspector.show()
             else:
                 self.closeWebInspector()
-    
+
     def closeWebInspector(self):
         """
         Public slot to close the web inspector.
@@ -1289,20 +1336,22 @@
             WebInspector.unregisterView(self.__inspector)
             self.__inspector.deleteLater()
             self.__inspector = None
-    
+
     def addBookmark(self):
         """
         Public slot to bookmark the current page.
         """
         from .Tools import Scripts
+
         script = Scripts.getAllMetaAttributes()
         self.page().runJavaScript(
-            script, WebBrowserPage.SafeJsWorld, self.__addBookmarkCallback)
-    
+            script, WebBrowserPage.SafeJsWorld, self.__addBookmarkCallback
+        )
+
     def __addBookmarkCallback(self, res):
         """
         Private callback method of __addBookmark().
-        
+
         @param res reference to the result list containing all
             meta attributes
         @type list
@@ -1311,26 +1360,27 @@
         for meta in res:
             if meta["name"] == "description":
                 description = meta["content"]
-        
+
         from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         dlg.setUrl(bytes(self.url().toEncoded()).decode())
         dlg.setTitle(self.title())
         dlg.setDescription(description)
         dlg.exec()
-    
+
     def dragEnterEvent(self, evt):
         """
         Protected method called by a drag enter event.
-        
+
         @param evt reference to the drag enter event (QDragEnterEvent)
         """
         evt.acceptProposedAction()
-    
+
     def dragMoveEvent(self, evt):
         """
         Protected method called by a drag move event.
-        
+
         @param evt reference to the drag move event (QDragMoveEvent)
         """
         evt.ignore()
@@ -1341,21 +1391,21 @@
                 url = QUrl(evt.mimeData().text())
                 if url.isValid():
                     evt.acceptProposedAction()
-        
+
         if not evt.isAccepted():
             super().dragMoveEvent(evt)
-    
+
     def dropEvent(self, evt):
         """
         Protected method called by a drop event.
-        
+
         @param evt reference to the drop event (QDropEvent)
         """
         super().dropEvent(evt)
         if (
-            not evt.isAccepted() and
-            evt.source() != self and
-            evt.possibleActions() & Qt.DropAction.CopyAction
+            not evt.isAccepted()
+            and evt.source() != self
+            and evt.possibleActions() & Qt.DropAction.CopyAction
         ):
             url = QUrl()
             if len(evt.mimeData().urls()) > 0:
@@ -1365,47 +1415,39 @@
             if url.isValid():
                 self.setSource(url)
                 evt.acceptProposedAction()
-    
+
     def _mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if WebBrowserWindow.autoScroller().mousePress(self, evt):
             evt.accept()
             return
-    
+
     def _mouseReleaseEvent(self, evt):
         """
         Protected method called by a mouse release event.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if WebBrowserWindow.autoScroller().mouseRelease(evt):
             evt.accept()
             return
-        
+
         accepted = evt.isAccepted()
         self.__page.event(evt)
-        if (
-            not evt.isAccepted() and
-            evt.button() == Qt.MouseButton.MiddleButton
-        ):
-            url = QUrl(QApplication.clipboard().text(
-                QClipboard.Mode.Selection))
-            if (
-                not url.isEmpty() and
-                url.isValid() and
-                url.scheme() != ""
-            ):
+        if not evt.isAccepted() and evt.button() == Qt.MouseButton.MiddleButton:
+            url = QUrl(QApplication.clipboard().text(QClipboard.Mode.Selection))
+            if not url.isEmpty() and url.isValid() and url.scheme() != "":
                 self.setSource(url)
         evt.setAccepted(accepted)
-    
+
     def _mouseMoveEvent(self, evt):
         """
         Protected method to handle mouse move events.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if self.__mw and self.__mw.isFullScreen():
@@ -1414,20 +1456,20 @@
             elif evt.y() < 10:
                 # mouse is within 10px to the top
                 self.__mw.showFullScreenNavigation()
-        
+
         if WebBrowserWindow.autoScroller().mouseMove(evt):
             evt.accept()
-    
+
     def _wheelEvent(self, evt):
         """
         Protected method to handle wheel events.
-        
+
         @param evt reference to the wheel event (QWheelEvent)
         """
         if WebBrowserWindow.autoScroller().wheel():
             evt.accept()
             return
-        
+
         delta = evt.angleDelta().y()
         if evt.modifiers() & Qt.KeyboardModifier.ControlModifier:
             if delta < 0:
@@ -1435,24 +1477,24 @@
             elif delta > 0:
                 self.zoomIn()
             evt.accept()
-        
+
         elif evt.modifiers() & Qt.KeyboardModifier.ShiftModifier:
             if delta < 0:
                 self.backward()
             elif delta > 0:
                 self.forward()
             evt.accept()
-    
+
     def _keyPressEvent(self, evt):
         """
         Protected method called by a key press.
-        
+
         @param evt reference to the key event (QKeyEvent)
         """
         if self.__mw.personalInformationManager().viewKeyPressEvent(self, evt):
             evt.accept()
             return
-        
+
         if evt.key() == Qt.Key.Key_ZoomIn:
             self.zoomIn()
             evt.accept()
@@ -1482,22 +1524,22 @@
             if not hitTest.isContentEditable():
                 self.pageAction(QWebEnginePage.WebAction.Back).trigger()
                 evt.accept()
-    
+
     def _keyReleaseEvent(self, evt):
         """
         Protected method called by a key release.
-        
+
         @param evt reference to the key event (QKeyEvent)
         """
         if evt.key() == Qt.Key.Key_Escape and self.isFullScreen():
             self.triggerPageAction(QWebEnginePage.WebAction.ExitFullScreen)
             evt.accept()
             self.requestFullScreen(False)
-    
+
     def _gestureEvent(self, evt):
         """
         Protected method handling gesture events.
-        
+
         @param evt reference to the gesture event
         @type QGestureEvent
         """
@@ -1509,11 +1551,11 @@
                 scaleFactor = pinch.totalScaleFactor()
                 self.setZoomValue(int(scaleFactor * 100))
             evt.accept()
-    
+
     def eventFilter(self, obj, evt):
         """
         Public method to process event for other objects.
-        
+
         @param obj reference to object to process events for
         @type QObject
         @param evt reference to event to be processed
@@ -1522,27 +1564,26 @@
         @rtype bool
         """
         if (
-            obj is self and
-            evt.type() == QEvent.Type.ParentChange and
-            self.parentWidget() is not None
+            obj is self
+            and evt.type() == QEvent.Type.ParentChange
+            and self.parentWidget() is not None
         ):
             self.parentWidget().installEventFilter(self)
-        
+
         # find the render widget receiving events for the web page
         if obj is self and evt.type() == QEvent.Type.ChildAdded:
             QTimer.singleShot(0, self.__setRwhvqt)
-        
+
         # forward events to WebBrowserView
-        if (
-            obj is self.__rwhvqt and
-            evt.type() in [QEvent.Type.KeyPress,
-                           QEvent.Type.KeyRelease,
-                           QEvent.Type.MouseButtonPress,
-                           QEvent.Type.MouseButtonRelease,
-                           QEvent.Type.MouseMove,
-                           QEvent.Type.Wheel,
-                           QEvent.Type.Gesture]
-        ):
+        if obj is self.__rwhvqt and evt.type() in [
+            QEvent.Type.KeyPress,
+            QEvent.Type.KeyRelease,
+            QEvent.Type.MouseButtonPress,
+            QEvent.Type.MouseButtonRelease,
+            QEvent.Type.MouseMove,
+            QEvent.Type.Wheel,
+            QEvent.Type.Gesture,
+        ]:
             wasAccepted = evt.isAccepted()
             evt.setAccepted(False)
             if evt.type() == QEvent.Type.KeyPress:
@@ -1562,11 +1603,11 @@
             ret = evt.isAccepted()
             evt.setAccepted(wasAccepted)
             return ret
-        
-        if (
-            obj is self.parentWidget() and
-            evt.type() in [QEvent.Type.KeyPress, QEvent.Type.KeyRelease]
-        ):
+
+        if obj is self.parentWidget() and evt.type() in [
+            QEvent.Type.KeyPress,
+            QEvent.Type.KeyRelease,
+        ]:
             wasAccepted = evt.isAccepted()
             evt.setAccepted(False)
             if evt.type() == QEvent.Type.KeyPress:
@@ -1576,71 +1617,73 @@
             ret = evt.isAccepted()
             evt.setAccepted(wasAccepted)
             return ret
-        
+
         # block already handled events
         if obj is self:
-            if evt.type() in [QEvent.Type.KeyPress,
-                              QEvent.Type.KeyRelease,
-                              QEvent.Type.MouseButtonPress,
-                              QEvent.Type.MouseButtonRelease,
-                              QEvent.Type.MouseMove,
-                              QEvent.Type.Wheel,
-                              QEvent.Type.Gesture]:
+            if evt.type() in [
+                QEvent.Type.KeyPress,
+                QEvent.Type.KeyRelease,
+                QEvent.Type.MouseButtonPress,
+                QEvent.Type.MouseButtonRelease,
+                QEvent.Type.MouseMove,
+                QEvent.Type.Wheel,
+                QEvent.Type.Gesture,
+            ]:
                 return True
-            
+
             elif evt.type() == QEvent.Type.Hide and self.isFullScreen():
                 self.triggerPageAction(QWebEnginePage.WebAction.ExitFullScreen)
-        
+
         return super().eventFilter(obj, evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event (QEvent)
         @return flag indicating, if the event was handled (boolean)
         """
         if evt.type() == QEvent.Type.Gesture:
             self._gestureEvent(evt)
             return True
-        
+
         return super().event(evt)
-    
+
     def inputWidget(self):
         """
         Public method to get a reference to the render widget.
-        
+
         @return reference to the render widget
         @rtype QWidget
         """
         return self.__rwhvqt
-    
+
     def clearHistory(self):
         """
         Public slot to clear the history.
         """
         self.history().clear()
         self.__urlChanged(self.history().currentItem().url())
-    
+
     ###########################################################################
     ## Signal converters below
     ###########################################################################
-    
+
     def __urlChanged(self, url):
         """
         Private slot to handle the urlChanged signal.
-        
+
         @param url the new url (QUrl)
         """
         self.sourceChanged.emit(url)
-        
+
         self.forwardAvailable.emit(self.isForwardAvailable())
         self.backwardAvailable.emit(self.isBackwardAvailable())
-    
+
     def __iconUrlChanged(self, url):
         """
         Private slot to handle the iconUrlChanged signal.
-        
+
         @param url URL to get web site icon from
         @type QUrl
         """
@@ -1651,41 +1694,45 @@
         self.__siteIconLoader.iconLoaded.connect(self.__iconLoaded)
         with contextlib.suppress(AttributeError):
             self.__siteIconLoader.sslConfiguration.connect(
-                self.page().setSslConfiguration)
+                self.page().setSslConfiguration
+            )
             self.__siteIconLoader.clearSslConfiguration.connect(
-                self.page().clearSslConfiguration)
-    
+                self.page().clearSslConfiguration
+            )
+
     def __iconLoaded(self, icon):
         """
         Private slot handling the loaded web site icon.
-        
+
         @param icon web site icon
         @type QIcon
         """
         self.__siteIcon = icon
-        
+
         from .Tools import WebIconProvider
+
         WebIconProvider.instance().saveIcon(self)
-        
+
         self.faviconChanged.emit()
-    
+
     def icon(self):
         """
         Public method to get the web site icon.
-        
+
         @return web site icon
         @rtype QIcon
         """
         if not self.__siteIcon.isNull():
             return QIcon(self.__siteIcon)
-        
+
         from .Tools import WebIconProvider
+
         return WebIconProvider.instance().iconForUrl(self.url())
-    
+
     def title(self):
         """
         Public method to get the view title.
-        
+
         @return view title
         @rtype str
         """
@@ -1695,95 +1742,98 @@
                 url = self.__page.requestedUrl()
             else:
                 url = self.url()
-            
+
             titleStr = url.host()
             if not titleStr:
-                titleStr = url.toString(
-                    QUrl.UrlFormattingOption.RemoveFragment)
-            
+                titleStr = url.toString(QUrl.UrlFormattingOption.RemoveFragment)
+
         if not titleStr or titleStr == "about:blank":
             titleStr = self.tr("Empty Page")
-        
+
         return titleStr
-    
+
     def __linkHovered(self, link):
         """
         Private slot to handle the linkHovered signal.
-        
+
         @param link the URL of the link (string)
         """
         self.highlighted.emit(link)
-    
+
     ###########################################################################
     ## Signal handlers below
     ###########################################################################
-    
+
     def __renderProcessTerminated(self, status, exitCode):
         """
         Private slot handling a crash of the web page render process.
-        
+
         @param status termination status
         @type QWebEnginePage.RenderProcessTerminationStatus
         @param exitCode exit code of the process
         @type int
         """
         if (
-            status ==
-            QWebEnginePage.RenderProcessTerminationStatus
-            .NormalTerminationStatus
+            status
+            == QWebEnginePage.RenderProcessTerminationStatus.NormalTerminationStatus
         ):
             return
-        
-        QTimer.singleShot(0,
-                          functools.partial(self.__showTabCrashPage, status))
-    
+
+        QTimer.singleShot(0, functools.partial(self.__showTabCrashPage, status))
+
     def __showTabCrashPage(self, status):
         """
         Private slot to show the tab crash page.
-        
+
         @param status termination status
         @type QWebEnginePage.RenderProcessTerminationStatus
         """
         self.page().deleteLater()
         self.__createNewPage()
-        
+
         html = getHtmlPage("tabCrashPage.html")
-        html = html.replace("@IMAGE@", pixmapToDataUrl(
-            ericApp().style().standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxWarning).pixmap(48, 48)
-        ).toString())
-        html = html.replace("@FAVICON@", pixmapToDataUrl(
-            ericApp().style() .standardIcon(
-                QStyle.StandardPixmap.SP_MessageBoxWarning).pixmap(16, 16)
-        ).toString())
         html = html.replace(
-            "@TITLE@", self.tr("Render Process terminated abnormally"))
+            "@IMAGE@",
+            pixmapToDataUrl(
+                ericApp()
+                .style()
+                .standardIcon(QStyle.StandardPixmap.SP_MessageBoxWarning)
+                .pixmap(48, 48)
+            ).toString(),
+        )
         html = html.replace(
-            "@H1@", self.tr("Render Process terminated abnormally"))
+            "@FAVICON@",
+            pixmapToDataUrl(
+                ericApp()
+                .style()
+                .standardIcon(QStyle.StandardPixmap.SP_MessageBoxWarning)
+                .pixmap(16, 16)
+            ).toString(),
+        )
+        html = html.replace("@TITLE@", self.tr("Render Process terminated abnormally"))
+        html = html.replace("@H1@", self.tr("Render Process terminated abnormally"))
         if (
-            status ==
-            QWebEnginePage.RenderProcessTerminationStatus
-            .CrashedTerminationStatus
+            status
+            == QWebEnginePage.RenderProcessTerminationStatus.CrashedTerminationStatus
         ):
-            msg = self.tr("The render process crashed while"
-                          " loading this page.")
+            msg = self.tr("The render process crashed while" " loading this page.")
         elif (
-            status ==
-            QWebEnginePage.RenderProcessTerminationStatus
-            .KilledTerminationStatus
+            status
+            == QWebEnginePage.RenderProcessTerminationStatus.KilledTerminationStatus
         ):
             msg = self.tr("The render process was killed.")
         else:
-            msg = self.tr("The render process terminated while"
-                          " loading this page.")
+            msg = self.tr("The render process terminated while" " loading this page.")
         html = html.replace("@LI-1@", msg)
         html = html.replace(
             "@LI-2@",
             self.tr(
                 "Try reloading the page or closing some tabs to make more"
-                " memory available."))
+                " memory available."
+            ),
+        )
         self.page().setHtml(html, self.url())
-    
+
     def __loadStarted(self):
         """
         Private method to handle the loadStarted signal.
@@ -1792,45 +1842,47 @@
         self.findText("")
         self.__isLoading = True
         self.__progress = 0
-    
+
     def __loadProgress(self, progress):
         """
         Private method to handle the loadProgress signal.
-        
+
         @param progress progress value (integer)
         """
         self.__progress = progress
-    
+
     def __loadFinished(self, ok):
         """
         Private method to handle the loadFinished signal.
-        
+
         @param ok flag indicating the result (boolean)
         """
         self.__isLoading = False
         self.__progress = 0
-        
+
         QApplication.processEvents()
         QTimer.singleShot(200, self.__renderPreview)
-        
+
         from .ZoomManager import ZoomManager
+
         zoomValue = ZoomManager.instance().zoomValue(self.url())
         self.setZoomValue(zoomValue)
-        
+
         if ok:
             self.__mw.historyManager().addHistoryEntry(self)
-            self.__mw.adBlockManager().page().hideBlockedPageEntries(
-                self.page())
+            self.__mw.adBlockManager().page().hideBlockedPageEntries(self.page())
             self.__mw.passwordManager().completePage(self.page())
-            
+
             self.page().runJavaScript(
-                "document.lastModified", WebBrowserPage.SafeJsWorld,
-                lambda res: self.__adjustBookmark(res))
-    
+                "document.lastModified",
+                WebBrowserPage.SafeJsWorld,
+                lambda res: self.__adjustBookmark(res),
+            )
+
     def __adjustBookmark(self, lastModified):
         """
         Private slot to adjust the 'lastModified' value of bookmarks.
-        
+
         @param lastModified last modified value
         @type str
         """
@@ -1838,45 +1890,46 @@
         if modified.isValid():
             from WebBrowser.WebBrowserWindow import WebBrowserWindow
             from .Bookmarks.BookmarkNode import BookmarkNode
+
             manager = WebBrowserWindow.bookmarksManager()
             for bookmark in manager.bookmarksForUrl(self.url()):
-                manager.setTimestamp(bookmark, BookmarkNode.TsModified,
-                                     modified)
-    
+                manager.setTimestamp(bookmark, BookmarkNode.TsModified, modified)
+
     def isLoading(self):
         """
         Public method to get the loading state.
-        
+
         @return flag indicating the loading state (boolean)
         """
         return self.__isLoading
-    
+
     def progress(self):
         """
         Public method to get the load progress.
-        
+
         @return load progress (integer)
         """
         return self.__progress
-    
+
     def __renderPreview(self):
         """
         Private slot to render a preview pixmap after the page was loaded.
         """
         from .WebBrowserSnap import renderTabPreview
-        w = 600     # some default width, the preview gets scaled when shown
+
+        w = 600  # some default width, the preview gets scaled when shown
         h = int(w * self.height() / self.width())
         self.__preview = renderTabPreview(self, w, h)
-    
+
     def getPreview(self):
         """
         Public method to get the preview pixmap.
-        
+
         @return preview pixmap
         @rtype QPixmap
         """
         return self.__preview
-    
+
     def saveAs(self):
         """
         Public method to save the current page to a file.
@@ -1884,21 +1937,22 @@
         url = self.url()
         if url.isEmpty():
             return
-        
+
         fileName, savePageFormat = self.__getSavePageFileNameAndFormat()
         if fileName:
             self.page().save(fileName, savePageFormat)
-    
+
     def __getSavePageFileNameAndFormat(self):
         """
         Private method to get the file name to save the page to.
-        
+
         @return tuple containing the file name to save to and the
             save page format
         @rtype tuple of (str, QWebEngineDownloadRequest.SavePageFormat)
         """
         documentLocation = QStandardPaths.writableLocation(
-            QStandardPaths.StandardLocation.DocumentsLocation)
+            QStandardPaths.StandardLocation.DocumentsLocation
+        )
         filterList = [
             self.tr("Web Archive (*.mhtml *.mht)"),
             self.tr("HTML File (*.html *.htm)"),
@@ -1912,44 +1966,33 @@
             (".html", ".htm"),
         ]
         if self.url().fileName():
-            defaultFileName = os.path.join(documentLocation,
-                                           self.url().fileName())
+            defaultFileName = os.path.join(documentLocation, self.url().fileName())
         else:
-            defaultFileName = os.path.join(documentLocation,
-                                           self.page().title())
+            defaultFileName = os.path.join(documentLocation, self.page().title())
             if Utilities.isWindowsPlatform():
                 defaultFileName += ".mht"
             else:
                 defaultFileName += ".mhtml"
 
         fileName = ""
-        saveFormat = (
-            QWebEngineDownloadRequest.SavePageFormat.MimeHtmlSaveFormat
-        )
-        
+        saveFormat = QWebEngineDownloadRequest.SavePageFormat.MimeHtmlSaveFormat
+
         fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter(
-            None,
-            self.tr("Save Web Page"),
-            defaultFileName,
-            ";;".join(filterList),
-            None)
+            None, self.tr("Save Web Page"), defaultFileName, ";;".join(filterList), None
+        )
         if fileName:
             index = filterList.index(selectedFilter)
             if index == 0:
-                saveFormat = (
-                    QWebEngineDownloadRequest.SavePageFormat.MimeHtmlSaveFormat
-                )
+                saveFormat = QWebEngineDownloadRequest.SavePageFormat.MimeHtmlSaveFormat
             elif index == 1:
                 saveFormat = (
-                    QWebEngineDownloadRequest.SavePageFormat
-                    .SingleHtmlSaveFormat
+                    QWebEngineDownloadRequest.SavePageFormat.SingleHtmlSaveFormat
                 )
             else:
                 saveFormat = (
-                    QWebEngineDownloadRequest.SavePageFormat
-                    .CompleteHtmlSaveFormat
+                    QWebEngineDownloadRequest.SavePageFormat.CompleteHtmlSaveFormat
                 )
-            
+
             extension = os.path.splitext(fileName)[1]
             if not extension:
                 # add the platform specific default extension
@@ -1959,95 +2002,95 @@
                     extensionsIndex = 0
                 extensions = extensionsList[index]
                 fileName += extensions[extensionsIndex]
-        
+
         return fileName, saveFormat
-    
+
     ###########################################################################
     ## Miscellaneous methods below
     ###########################################################################
-    
+
     def createWindow(self, windowType):
         """
         Public method called, when a new window should be created.
-        
+
         @param windowType type of the requested window
             (QWebEnginePage.WebWindowType)
         @return reference to the created browser window (WebBrowserView)
         """
-        if windowType in [QWebEnginePage.WebWindowType.WebBrowserTab,
-                          QWebEnginePage.WebWindowType.WebDialog]:
+        if windowType in [
+            QWebEnginePage.WebWindowType.WebBrowserTab,
+            QWebEnginePage.WebWindowType.WebDialog,
+        ]:
             return self.__mw.newTab(addNextTo=self)
         elif windowType == QWebEnginePage.WebWindowType.WebBrowserWindow:
             return self.__mw.newWindow().currentBrowser()
-        elif (
-            windowType == QWebEnginePage.WebWindowType.WebBrowserBackgroundTab
-        ):
+        elif windowType == QWebEnginePage.WebWindowType.WebBrowserBackgroundTab:
             return self.__mw.newTab(addNextTo=self, background=True)
         else:
             # default for unknow/new window types
             return self.__mw.newTab(addNextTo=self)
-    
+
     def preferencesChanged(self):
         """
         Public method to indicate a change of the settings.
         """
         self.reload()
-    
+
     ###########################################################################
     ## RSS related methods below
     ###########################################################################
-    
+
     def checkRSS(self):
         """
         Public method to check, if the loaded page contains feed links.
-        
+
         @return flag indicating the existence of feed links (boolean)
         """
         self.__rss = []
-        
+
         script = Scripts.getFeedLinks()
         feeds = self.page().execJavaScript(script)
-        
+
         if feeds is not None:
             for feed in feeds:
                 if feed["url"] and feed["title"]:
                     self.__rss.append((feed["title"], feed["url"]))
-        
+
         return len(self.__rss) > 0
-    
+
     def getRSS(self):
         """
         Public method to get the extracted RSS feeds.
-        
+
         @return list of RSS feeds (list of tuples of two strings)
         """
         return self.__rss
-    
+
     def hasRSS(self):
         """
         Public method to check, if the loaded page has RSS links.
-        
+
         @return flag indicating the presence of RSS links (boolean)
         """
         return len(self.__rss) > 0
-    
+
     ###########################################################################
     ## Full Screen handling below
     ###########################################################################
-    
+
     def isFullScreen(self):
         """
         Public method to check, if full screen mode is active.
-        
+
         @return flag indicating full screen mode
         @rtype bool
         """
         return self.__mw.isFullScreen()
-    
+
     def requestFullScreen(self, enable):
         """
         Public method to request full screen mode.
-        
+
         @param enable flag indicating full screen mode on or off
         @type bool
         """
@@ -2055,50 +2098,48 @@
             self.__mw.enterHtmlFullScreen()
         else:
             self.__mw.showNormal()
-    
+
     ###########################################################################
     ## Speed Dial slots below
     ###########################################################################
-    
+
     def __addSpeedDial(self):
         """
         Private slot to add a new speed dial.
         """
-        self.__page.runJavaScript("addSpeedDial();",
-                                  WebBrowserPage.SafeJsWorld)
-    
+        self.__page.runJavaScript("addSpeedDial();", WebBrowserPage.SafeJsWorld)
+
     def __configureSpeedDial(self):
         """
         Private slot to configure the speed dial.
         """
-        self.page().runJavaScript("configureSpeedDial();",
-                                  WebBrowserPage.SafeJsWorld)
-    
+        self.page().runJavaScript("configureSpeedDial();", WebBrowserPage.SafeJsWorld)
+
     def __reloadAllSpeedDials(self):
         """
         Private slot to reload all speed dials.
         """
         self.page().runJavaScript("reloadAll();", WebBrowserPage.SafeJsWorld)
-    
+
     def __resetSpeedDials(self):
         """
         Private slot to reset all speed dials to the default pages.
         """
         self.__speedDial.resetDials()
-    
+
     ###########################################################################
     ## Methods below implement session related functions
     ###########################################################################
-    
+
     def storeSessionData(self, data):
         """
         Public method to store session data to be restored later on.
-        
+
         @param data dictionary with session data to be restored
         @type dict
         """
         self.__restoreData = data
-    
+
     def __showEventSlot(self):
         """
         Private slot to perform actions when the view is shown and the event
@@ -2107,73 +2148,74 @@
         if self.__restoreData:
             sessionData, self.__restoreData = self.__restoreData, None
             self.loadFromSessionData(sessionData)
-    
+
     def showEvent(self, evt):
         """
         Protected method to handle show events.
-        
+
         @param evt reference to the show event object
         @type QShowEvent
         """
         super().showEvent(evt)
         self.activateSession()
-    
+
     def activateSession(self):
         """
         Public slot to activate a restored session.
         """
         if self.__restoreData and not self.__mw.isClosing():
             QTimer.singleShot(0, self.__showEventSlot)
-    
+
     def getSessionData(self):
         """
         Public method to populate the session data.
-        
+
         @return dictionary containing the session data
         @rtype dict
         """
         if self.__restoreData:
             # page has not been shown yet
             return self.__restoreData
-        
+
         sessionData = {}
         page = self.page()
-        
+
         # 1. zoom factor
         sessionData["ZoomFactor"] = page.zoomFactor()
-        
+
         # 2. scroll position
         scrollPos = page.scrollPosition()
         sessionData["ScrollPosition"] = {
             "x": scrollPos.x(),
             "y": scrollPos.y(),
         }
-        
+
         # 3. page history
         historyArray = QByteArray()
         stream = QDataStream(historyArray, QIODevice.OpenModeFlag.WriteOnly)
         stream << page.history()
         sessionData["History"] = str(
             historyArray.toBase64(QByteArray.Base64Option.Base64UrlEncoding),
-            encoding="ascii")
+            encoding="ascii",
+        )
         sessionData["HistoryIndex"] = page.history().currentItemIndex()
-        
+
         # 4. current URL and title
         sessionData["Url"] = self.url().toString()
         sessionData["Title"] = self.title()
-        
+
         # 5. web icon
         iconArray = QByteArray()
         stream = QDataStream(iconArray, QIODevice.OpenModeFlag.WriteOnly)
         stream << page.icon()
         sessionData["Icon"] = str(iconArray.toBase64(), encoding="ascii")
-        
+
         return sessionData
-    
+
     def loadFromSessionData(self, sessionData):
         """
         Public method to load the session data.
-        
+
         @param sessionData dictionary containing the session data as
             generated by getSessionData()
         @type dict
@@ -2181,34 +2223,35 @@
         page = self.page()
         # blank the page
         page.setUrl(QUrl("about:blank"))
-        
+
         # 1. page history
         if "History" in sessionData:
             historyArray = QByteArray.fromBase64(
                 sessionData["History"].encode("ascii"),
-                QByteArray.Base64Option.Base64UrlEncoding)
+                QByteArray.Base64Option.Base64UrlEncoding,
+            )
             stream = QDataStream(historyArray, QIODevice.OpenModeFlag.ReadOnly)
             stream >> page.history()
-            
+
             if "HistoryIndex" in sessionData:
                 item = page.history().itemAt(sessionData["HistoryIndex"])
                 if item is not None:
                     page.history().goToItem(item)
-        
+
         # 2. zoom factor
         if "ZoomFactor" in sessionData:
             page.setZoomFactor(sessionData["ZoomFactor"])
-        
+
         # 3. scroll position
         if "ScrollPosition" in sessionData:
             scrollPos = sessionData["ScrollPosition"]
             page.scrollTo(QPointF(scrollPos["x"], scrollPos["y"]))
-    
+
     def extractSessionMetaData(self, sessionData):
         """
         Public method to extract some session meta data elements needed by the
         tab widget in case of deferred loading.
-        
+
         @param sessionData dictionary containing the session data as
             generated by getSessionData()
         @type dict
@@ -2217,28 +2260,27 @@
         """
         title = sessionData.get("Title", "")
         urlStr = sessionData.get("Url", "")
-        
+
         if "Icon" in sessionData:
-            iconArray = QByteArray.fromBase64(
-                sessionData["Icon"].encode("ascii"))
+            iconArray = QByteArray.fromBase64(sessionData["Icon"].encode("ascii"))
             stream = QDataStream(iconArray, QIODevice.OpenModeFlag.ReadOnly)
             icon = QIcon()
             stream >> icon
         else:
             from .Tools import WebIconProvider
-            icon = WebIconProvider.instance().iconForUrl(
-                QUrl.fromUserInput(urlStr))
-        
+
+            icon = WebIconProvider.instance().iconForUrl(QUrl.fromUserInput(urlStr))
+
         return title, urlStr, icon
-    
+
     ###########################################################################
     ## Methods below implement safe browsing related functions
     ###########################################################################
-    
+
     def getSafeBrowsingStatus(self):
         """
         Public method to get the safe browsing status of the current page.
-        
+
         @return flag indicating a safe site
         @rtype bool
         """
@@ -2246,27 +2288,27 @@
             return self.__page.getSafeBrowsingStatus()
         else:
             return True
-    
+
     ###########################################################################
     ## Methods below implement print support from the page
     ###########################################################################
-    
+
     @pyqtSlot()
     def __printPage(self):
         """
         Private slot to support printing from the web page.
         """
         self.__mw.tabWidget.printBrowser(browser=self)
-    
+
     ###########################################################################
     ## Methods below implement slots for Qt 5.11+
     ###########################################################################
-    
+
     @pyqtSlot("QWebEngineQuotaRequest")
     def __quotaRequested(self, quotaRequest):
         """
         Private slot to handle quota requests of the web page.
-        
+
         @param quotaRequest reference to the quota request object
         @type QWebEngineQuotaRequest
         """
@@ -2281,30 +2323,32 @@
         else:
             # ask user
             from .Download.DownloadUtilities import dataString
+
             sizeStr = dataString(quotaRequest.requestedSize())
-            
+
             ok = EricMessageBox.yesNo(
                 self,
                 self.tr("Quota Request"),
-                self.tr("""<p> Allow the website at <b>{0}</b> to use"""
-                        """ <b>{1}</b> of persistent storage?</p>""")
-                .format(quotaRequest.origin().host(), sizeStr)
+                self.tr(
+                    """<p> Allow the website at <b>{0}</b> to use"""
+                    """ <b>{1}</b> of persistent storage?</p>"""
+                ).format(quotaRequest.origin().host(), sizeStr),
             )
-        
+
         if ok:
             quotaRequest.accept()
         else:
             quotaRequest.reject()
-    
+
     ###########################################################################
     ## Methods below implement slots for Qt 5.12+
     ###########################################################################
-    
+
     @pyqtSlot("QWebEngineClientCertificateSelection")
     def __selectClientCertificate(self, clientCertificateSelection):
         """
         Private slot to handle the client certificate selection request.
-        
+
         @param clientCertificateSelection list of client SSL certificates
             found in system's client certificate store
         @type QWebEngineClientCertificateSelection
@@ -2317,12 +2361,13 @@
         else:
             certificate = None
             from EricNetwork.EricSslCertificateSelectionDialog import (
-                EricSslCertificateSelectionDialog
+                EricSslCertificateSelectionDialog,
             )
+
             dlg = EricSslCertificateSelectionDialog(certificates, self)
             if dlg.exec() == QDialog.DialogCode.Accepted:
                 certificate = dlg.getSelectedCertificate()
-            
+
             if certificate is None:
                 clientCertificateSelection.selectNone()
             else:
--- a/src/eric7/WebBrowser/WebBrowserWebSearchWidget.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserWebSearchWidget.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,9 +8,7 @@
 """
 
 from PyQt6.QtCore import pyqtSignal, QUrl, QModelIndex, QTimer, Qt
-from PyQt6.QtGui import (
-    QStandardItem, QStandardItemModel, QFont, QIcon, QPixmap
-)
+from PyQt6.QtGui import QStandardItem, QStandardItemModel, QFont, QIcon, QPixmap
 from PyQt6.QtWidgets import QMenu, QCompleter
 from PyQt6.QtWebEngineCore import QWebEnginePage
 
@@ -26,75 +24,74 @@
 class WebBrowserWebSearchWidget(EricClearableLineEdit):
     """
     Class implementing a web search widget for the web browser.
-    
+
     @signal search(QUrl) emitted when the search should be done
     """
+
     search = pyqtSignal(QUrl)
-    
+
     def __init__(self, mainWindow, parent=None):
         """
         Constructor
-        
+
         @param mainWindow reference to the browser main window
         @type WebBrowserWindow
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         from EricWidgets.EricLineEditButton import EricLineEditButton
         from .OpenSearch.OpenSearchManager import OpenSearchManager
 
         self.__mw = mainWindow
-        
+
         self.__openSearchManager = OpenSearchManager(self)
         self.__openSearchManager.currentEngineChanged.connect(
-            self.__currentEngineChanged)
+            self.__currentEngineChanged
+        )
         self.__currentEngine = ""
-        
+
         self.__enginesMenu = QMenu(self)
-        self.__enginesMenu.triggered.connect(
-            self.__handleEnginesMenuActionTriggered)
-        
+        self.__enginesMenu.triggered.connect(self.__handleEnginesMenuActionTriggered)
+
         self.__engineButton = EricLineEditButton(self)
         self.__engineButton.setMenu(self.__enginesMenu)
         self.addWidget(self.__engineButton, EricLineEditSide.LEFT)
-        
+
         self.__searchButton = EricLineEditButton(self)
         self.__searchButton.setIcon(UI.PixmapCache.getIcon("webSearch"))
         self.addWidget(self.__searchButton, EricLineEditSide.LEFT)
-        
+
         self.__model = QStandardItemModel(self)
         self.__completer = QCompleter()
         self.__completer.setModel(self.__model)
         self.__completer.setCompletionMode(
-            QCompleter.CompletionMode.UnfilteredPopupCompletion)
+            QCompleter.CompletionMode.UnfilteredPopupCompletion
+        )
         self.__completer.setWidget(self)
-        
+
         self.__searchButton.clicked.connect(self.__searchButtonClicked)
         self.textEdited.connect(self.__textEdited)
         self.returnPressed.connect(self.__searchNow)
-        self.__completer.activated[QModelIndex].connect(
-            self.__completerActivated)
-        self.__completer.highlighted[QModelIndex].connect(
-            self.__completerHighlighted)
+        self.__completer.activated[QModelIndex].connect(self.__completerActivated)
+        self.__completer.highlighted[QModelIndex].connect(self.__completerHighlighted)
         self.__enginesMenu.aboutToShow.connect(self.__showEnginesMenu)
-        
+
         self.__suggestionsItem = None
         self.__suggestions = []
         self.__suggestTimer = None
-        self.__suggestionsEnabled = Preferences.getWebBrowser(
-            "WebSearchSuggestions")
-        
+        self.__suggestionsEnabled = Preferences.getWebBrowser("WebSearchSuggestions")
+
         self.__recentSearchesItem = None
         self.__recentSearches = []
         self.__maxSavedSearches = 10
-        
+
         self.__engine = None
         self.__loadSearches()
         self.__setupCompleterMenu()
         self.__currentEngineChanged()
-    
+
     def __searchNow(self):
         """
         Private slot to perform the web search.
@@ -102,117 +99,116 @@
         searchText = self.text()
         if not searchText:
             return
-        
+
         import WebBrowser.WebBrowserWindow
+
         if WebBrowser.WebBrowserWindow.WebBrowserWindow.isPrivate():
             return
-        
+
         if searchText in self.__recentSearches:
             self.__recentSearches.remove(searchText)
         self.__recentSearches.insert(0, searchText)
         if len(self.__recentSearches) > self.__maxSavedSearches:
-            self.__recentSearches = self.__recentSearches[
-                :self.__maxSavedSearches]
+            self.__recentSearches = self.__recentSearches[: self.__maxSavedSearches]
         self.__setupCompleterMenu()
-        
+
         self.__mw.currentBrowser().setFocus()
         self.__mw.currentBrowser().load(
-            self.__openSearchManager.currentEngine().searchUrl(searchText))
-    
+            self.__openSearchManager.currentEngine().searchUrl(searchText)
+        )
+
     def __setupCompleterMenu(self):
         """
         Private method to create the completer menu.
         """
-        if (
-            not self.__suggestions or
-            (self.__model.rowCount() > 0 and
-             self.__model.item(0) != self.__suggestionsItem)
+        if not self.__suggestions or (
+            self.__model.rowCount() > 0
+            and self.__model.item(0) != self.__suggestionsItem
         ):
             self.__model.clear()
             self.__suggestionsItem = None
         else:
             self.__model.removeRows(1, self.__model.rowCount() - 1)
-        
+
         boldFont = QFont()
         boldFont.setBold(True)
-        
+
         if self.__suggestions:
             if self.__model.rowCount() == 0:
                 if not self.__suggestionsItem:
-                    self.__suggestionsItem = QStandardItem(
-                        self.tr("Suggestions"))
+                    self.__suggestionsItem = QStandardItem(self.tr("Suggestions"))
                     self.__suggestionsItem.setFont(boldFont)
                 self.__model.appendRow(self.__suggestionsItem)
-            
+
             for suggestion in self.__suggestions:
                 self.__model.appendRow(QStandardItem(suggestion))
-        
+
         if not self.__recentSearches:
-            self.__recentSearchesItem = QStandardItem(
-                self.tr("No Recent Searches"))
+            self.__recentSearchesItem = QStandardItem(self.tr("No Recent Searches"))
             self.__recentSearchesItem.setFont(boldFont)
             self.__model.appendRow(self.__recentSearchesItem)
         else:
-            self.__recentSearchesItem = QStandardItem(
-                self.tr("Recent Searches"))
+            self.__recentSearchesItem = QStandardItem(self.tr("Recent Searches"))
             self.__recentSearchesItem.setFont(boldFont)
             self.__model.appendRow(self.__recentSearchesItem)
             for recentSearch in self.__recentSearches:
                 self.__model.appendRow(QStandardItem(recentSearch))
-        
+
         view = self.__completer.popup()
-        view.setFixedHeight(view.sizeHintForRow(0) * self.__model.rowCount() +
-                            view.frameWidth() * 2)
-        
+        view.setFixedHeight(
+            view.sizeHintForRow(0) * self.__model.rowCount() + view.frameWidth() * 2
+        )
+
         self.__searchButton.setEnabled(
-            bool(self.__recentSearches or self.__suggestions))
-    
+            bool(self.__recentSearches or self.__suggestions)
+        )
+
     def __completerActivated(self, index):
         """
         Private slot handling the selection of an entry from the completer.
-        
+
         @param index index of the item (QModelIndex)
         """
         if (
-            self.__suggestionsItem and
-            self.__suggestionsItem.index().row() == index.row()
+            self.__suggestionsItem
+            and self.__suggestionsItem.index().row() == index.row()
         ):
             return
-        
+
         if (
-            self.__recentSearchesItem and
-            self.__recentSearchesItem.index().row() == index.row()
+            self.__recentSearchesItem
+            and self.__recentSearchesItem.index().row() == index.row()
         ):
             return
-        
+
         self.__searchNow()
-    
+
     def __completerHighlighted(self, index):
         """
         Private slot handling the highlighting of an entry of the completer.
-        
+
         @param index index of the item (QModelIndex)
         @return flah indicating a successful highlighting (boolean)
         """
         if (
-            self.__suggestionsItem and
-            self.__suggestionsItem.index().row() == index.row()
+            self.__suggestionsItem
+            and self.__suggestionsItem.index().row() == index.row()
         ):
             return False
-        
+
         if (
-            self.__recentSearchesItem and
-            self.__recentSearchesItem.index().row() == index.row()
+            self.__recentSearchesItem
+            and self.__recentSearchesItem.index().row() == index.row()
         ):
             return False
-        
+
         self.setText(index.data())
         return True
-    
+
     def __textEdited(self, txt):
         """
         Private slot to handle changes of the search text.
-        
+
         @param txt search text (string)
         """
         if self.__suggestionsEnabled:
@@ -225,7 +221,7 @@
         else:
             self.__completer.setCompletionPrefix(txt)
             self.__completer.complete()
-    
+
     def __getSuggestions(self):
         """
         Private slot to get search suggestions from the configured search
@@ -233,47 +229,49 @@
         """
         searchText = self.text()
         if searchText:
-            self.__openSearchManager.currentEngine().requestSuggestions(
-                searchText)
-    
+            self.__openSearchManager.currentEngine().requestSuggestions(searchText)
+
     def __newSuggestions(self, suggestions):
         """
         Private slot to receive a new list of suggestions.
-        
+
         @param suggestions list of suggestions (list of strings)
         """
         self.__suggestions = suggestions
         self.__setupCompleterMenu()
         self.__completer.complete()
-    
+
     def __showEnginesMenu(self):
         """
         Private slot to handle the display of the engines menu.
         """
         self.__enginesMenu.clear()
-        
+
         from .OpenSearch.OpenSearchEngineAction import OpenSearchEngineAction
+
         engineNames = self.__openSearchManager.allEnginesNames()
         for engineName in engineNames:
             engine = self.__openSearchManager.engine(engineName)
             action = OpenSearchEngineAction(engine, self.__enginesMenu)
             action.setData(engineName)
             self.__enginesMenu.addAction(action)
-            
+
             if self.__openSearchManager.currentEngineName() == engineName:
                 action.setCheckable(True)
                 action.setChecked(True)
-        
+
         cb = self.__mw.currentBrowser()
         from .Tools import Scripts
+
         script = Scripts.getOpenSearchLinks()
         cb.page().runJavaScript(
-            script, WebBrowserPage.SafeJsWorld, self.__showEnginesMenuCallback)
-    
+            script, WebBrowserPage.SafeJsWorld, self.__showEnginesMenuCallback
+        )
+
     def __showEnginesMenuCallback(self, res):
         """
         Private method handling the open search links callback.
-        
+
         @param res result of the JavaScript
         @type list of dict
         """
@@ -287,24 +285,24 @@
                     continue
                 if not title:
                     title = cb.title()
-                
+
                 action = self.__enginesMenu.addAction(
-                    self.tr("Add '{0}'").format(title))
+                    self.tr("Add '{0}'").format(title)
+                )
                 action.setData(url)
                 action.setIcon(cb.icon())
-        
+
         self.__enginesMenu.addSeparator()
         self.__enginesMenu.addAction(self.__mw.searchEnginesAction())
-        
+
         if self.__recentSearches:
-            act = self.__enginesMenu.addAction(
-                self.tr("Clear Recent Searches"))
+            act = self.__enginesMenu.addAction(self.tr("Clear Recent Searches"))
             act.setData("@@CLEAR@@")
-    
+
     def __handleEnginesMenuActionTriggered(self, action):
         """
         Private slot to handle an action of the menu being triggered.
-        
+
         @param action reference to the action that triggered
         @type QAction
         """
@@ -318,14 +316,14 @@
                 self.clear()
             else:
                 self.__openSearchManager.setCurrentEngineName(actData)
-    
+
     def __searchButtonClicked(self):
         """
         Private slot to show the search menu via the search button.
         """
         self.__setupCompleterMenu()
         self.__completer.complete()
-    
+
     def clear(self):
         """
         Public method to clear all private data.
@@ -334,40 +332,40 @@
         self.__setupCompleterMenu()
         super().clear()
         self.clearFocus()
-    
+
     def preferencesChanged(self):
         """
         Public method to handle the change of preferences.
         """
-        self.__suggestionsEnabled = Preferences.getWebBrowser(
-            "WebSearchSuggestions")
+        self.__suggestionsEnabled = Preferences.getWebBrowser("WebSearchSuggestions")
         if not self.__suggestionsEnabled:
             self.__suggestions = []
             self.__setupCompleterMenu()
-    
+
     def saveSearches(self):
         """
         Public method to save the recently performed web searches.
         """
         Preferences.getSettings().setValue(
-            'WebBrowser/WebSearches', self.__recentSearches)
-    
+            "WebBrowser/WebSearches", self.__recentSearches
+        )
+
     def __loadSearches(self):
         """
         Private method to load the recently performed web searches.
         """
-        searches = Preferences.getSettings().value('WebBrowser/WebSearches')
+        searches = Preferences.getSettings().value("WebBrowser/WebSearches")
         if searches is not None:
             self.__recentSearches = searches
-    
+
     def openSearchManager(self):
         """
         Public method to get a reference to the opensearch manager object.
-        
+
         @return reference to the opensearch manager object (OpenSearchManager)
         """
         return self.__openSearchManager
-    
+
     def __currentEngineChanged(self):
         """
         Private slot to track a change of the current search engine.
@@ -377,39 +375,41 @@
             oldEngine.imageChanged.disconnect(self.__engineImageChanged)
             if self.__suggestionsEnabled:
                 oldEngine.suggestions.disconnect(self.__newSuggestions)
-        
+
         newEngine = self.__openSearchManager.currentEngine()
         if newEngine.networkAccessManager() is None:
             newEngine.setNetworkAccessManager(self.__mw.networkManager())
         newEngine.imageChanged.connect(self.__engineImageChanged)
         if self.__suggestionsEnabled:
             newEngine.suggestions.connect(self.__newSuggestions)
-        
+
         self.setPlaceholderText(self.__openSearchManager.currentEngineName())
         self.__currentEngine = self.__openSearchManager.currentEngineName()
-        self.__engineButton.setIcon(QIcon(QPixmap.fromImage(
-            self.__openSearchManager.currentEngine().image())))
+        self.__engineButton.setIcon(
+            QIcon(QPixmap.fromImage(self.__openSearchManager.currentEngine().image()))
+        )
         self.__suggestions = []
         self.__setupCompleterMenu()
-    
+
     def __engineImageChanged(self):
         """
         Private slot to handle a change of the current search engine icon.
         """
-        self.__engineButton.setIcon(QIcon(QPixmap.fromImage(
-            self.__openSearchManager.currentEngine().image())))
-    
+        self.__engineButton.setIcon(
+            QIcon(QPixmap.fromImage(self.__openSearchManager.currentEngine().image()))
+        )
+
     def mousePressEvent(self, evt):
         """
         Protected method called by a mouse press event.
-        
+
         @param evt reference to the mouse event (QMouseEvent)
         """
         if evt.button() == Qt.MouseButton.XButton1:
-            self.__mw.currentBrowser().triggerPageAction(
-                QWebEnginePage.WebAction.Back)
+            self.__mw.currentBrowser().triggerPageAction(QWebEnginePage.WebAction.Back)
         elif evt.button() == Qt.MouseButton.XButton2:
             self.__mw.currentBrowser().triggerPageAction(
-                QWebEnginePage.WebAction.Forward)
+                QWebEnginePage.WebAction.Forward
+            )
         else:
             super().mousePressEvent(evt)
--- a/src/eric7/WebBrowser/WebBrowserWindow.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebBrowserWindow.py	Wed Jul 13 14:55:47 2022 +0200
@@ -14,22 +14,43 @@
 import pathlib
 
 from PyQt6.QtCore import (
-    pyqtSlot, pyqtSignal, Qt, QByteArray, QSize, QTimer, QUrl, QProcess,
-    QEvent
+    pyqtSlot,
+    pyqtSignal,
+    Qt,
+    QByteArray,
+    QSize,
+    QTimer,
+    QUrl,
+    QProcess,
+    QEvent,
 )
-from PyQt6.QtGui import (
-    QDesktopServices, QKeySequence, QAction, QFont, QFontMetrics
-)
+from PyQt6.QtGui import QDesktopServices, QKeySequence, QAction, QFont, QFontMetrics
 from PyQt6.QtWidgets import (
-    QWidget, QVBoxLayout, QSizePolicy, QDockWidget, QComboBox, QLabel, QMenu,
-    QLineEdit, QApplication, QWhatsThis, QDialog, QHBoxLayout, QProgressBar,
-    QInputDialog
+    QWidget,
+    QVBoxLayout,
+    QSizePolicy,
+    QDockWidget,
+    QComboBox,
+    QLabel,
+    QMenu,
+    QLineEdit,
+    QApplication,
+    QWhatsThis,
+    QDialog,
+    QHBoxLayout,
+    QProgressBar,
+    QInputDialog,
 )
 from PyQt6.QtWebEngineCore import (
-    QWebEngineSettings, QWebEnginePage, QWebEngineProfile, QWebEngineScript
+    QWebEngineSettings,
+    QWebEnginePage,
+    QWebEngineProfile,
+    QWebEngineScript,
 )
+
 try:
     from PyQt6.QtHelp import QHelpEngine
+
     QTHELP_AVAILABLE = True
 except ImportError:
     QTHELP_AVAILABLE = False
@@ -67,7 +88,7 @@
 class WebBrowserWindow(EricMainWindow):
     """
     Class implementing the web browser main window.
-    
+
     @signal webBrowserWindowOpened(window) emitted after a new web browser
         window was opened
     @signal webBrowserWindowClosed(window) emitted after the window was
@@ -77,16 +98,17 @@
     @signal webBrowserClosed(browser) emitted after a web browser tab was
         closed
     """
+
     webBrowserWindowClosed = pyqtSignal(EricMainWindow)
     webBrowserWindowOpened = pyqtSignal(EricMainWindow)
     webBrowserOpened = pyqtSignal(QWidget)
     webBrowserClosed = pyqtSignal(QWidget)
-    
+
     BrowserWindows = []
 
     _useQtHelp = QTHELP_AVAILABLE
     _isPrivate = False
-    
+
     _webProfile = None
     _networkManager = None
     _cookieJar = None
@@ -110,17 +132,28 @@
     _sessionManager = None
     _safeBrowsingManager = None
     _protocolHandlerManager = None
-    
+
     _performingStartup = True
     _performingShutdown = False
     _lastActiveWindow = None
-    
-    def __init__(self, home, path, parent, name,
-                 searchWord=None, private=False, qthelp=False, settingsDir="",
-                 restoreSession=False, single=False, saname=""):
+
+    def __init__(
+        self,
+        home,
+        path,
+        parent,
+        name,
+        searchWord=None,
+        private=False,
+        qthelp=False,
+        settingsDir="",
+        restoreSession=False,
+        single=False,
+        saname="",
+    ):
         """
         Constructor
-        
+
         @param home the URL to be shown
         @type str
         @param path the path of the working dir (usually '.')
@@ -145,33 +178,33 @@
         @type str
         """
         self.__hideNavigationTimer = None
-        
+
         super().__init__(parent)
         self.setObjectName(name)
         if private:
             self.setWindowTitle(self.tr("eric Web Browser (Private Mode)"))
         else:
             self.setWindowTitle(self.tr("eric Web Browser"))
-        
+
         self.__settingsDir = settingsDir
         self.setWindowIcon(UI.PixmapCache.getIcon("ericWeb"))
 
         self.__mHistory = []
         self.__lastConfigurationPageName = ""
-        
+
         WebBrowserWindow._isPrivate = private
-        
+
         self.__shortcutsDialog = None
-        
+
         WebBrowserWindow.setUseQtHelp(qthelp or bool(searchWord))
-        
+
         self.webProfile(private)
         self.networkManager()
-        
+
         self.__htmlFullScreen = False
         self.__windowStates = Qt.WindowState.WindowNoState
         self.__isClosing = False
-        
+
         from .SearchWidget import SearchWidget
         from .QtHelp.HelpTocWidget import HelpTocWidget
         from .QtHelp.HelpIndexWidget import HelpIndexWidget
@@ -185,18 +218,18 @@
         from .Navigation.NavigationBar import NavigationBar
         from .Navigation.NavigationContainer import NavigationContainer
         from .Bookmarks.BookmarksToolBar import BookmarksToolBar
-        
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         # initialize some SSL stuff
         from EricNetwork.EricSslUtilities import initSSL
+
         initSSL()
-        
+
         if WebBrowserWindow._useQtHelp:
             self.__helpEngine = QHelpEngine(
-                WebBrowserWindow.getQtHelpCollectionFileName(),
-                self)
+                WebBrowserWindow.getQtHelpCollectionFileName(), self
+            )
             self.__helpEngine.setReadOnly(False)
             self.__helpEngine.setupData()
             self.__helpEngine.setUsesFilterEngine(True)
@@ -205,43 +238,44 @@
         else:
             self.__helpEngine = None
         self.__helpInstaller = None
-        
+
         self.__zoomWidget = EricZoomWidget(
             UI.PixmapCache.getPixmap("zoomOut"),
             UI.PixmapCache.getPixmap("zoomIn"),
-            UI.PixmapCache.getPixmap("zoomReset"), self)
+            UI.PixmapCache.getPixmap("zoomReset"),
+            self,
+        )
         self.statusBar().addPermanentWidget(self.__zoomWidget)
         self.__zoomWidget.setMapping(
-            WebBrowserView.ZoomLevels, WebBrowserView.ZoomLevelDefault)
+            WebBrowserView.ZoomLevels, WebBrowserView.ZoomLevelDefault
+        )
         self.__zoomWidget.valueChanged.connect(self.__zoomValueChanged)
-        
+
         self.__tabWidget = WebBrowserTabWidget(self)
         self.__tabWidget.currentChanged[int].connect(self.__currentChanged)
         self.__tabWidget.titleChanged.connect(self.__titleChanged)
         self.__tabWidget.showMessage.connect(self.statusBar().showMessage)
-        self.__tabWidget.browserZoomValueChanged.connect(
-            self.__zoomWidget.setValue)
+        self.__tabWidget.browserZoomValueChanged.connect(self.__zoomWidget.setValue)
         self.__tabWidget.browserClosed.connect(self.webBrowserClosed)
         self.__tabWidget.browserOpened.connect(self.webBrowserOpened)
-        
+
         self.__searchWidget = SearchWidget(self, self)
-        
+
         self.__setIconDatabasePath()
-        
+
         bookmarksModel = self.bookmarksManager().bookmarksModel()
-        self.__bookmarksToolBar = BookmarksToolBar(self, bookmarksModel,
-                                                   self)
+        self.__bookmarksToolBar = BookmarksToolBar(self, bookmarksModel, self)
         self.__bookmarksToolBar.setIconSize(UI.Config.ToolBarIconSize)
         self.__bookmarksToolBar.openUrl.connect(self.openUrl)
         self.__bookmarksToolBar.newTab.connect(self.openUrlNewTab)
         self.__bookmarksToolBar.newWindow.connect(self.openUrlNewWindow)
-        
+
         self.__navigationBar = NavigationBar(self)
-        
+
         self.__navigationContainer = NavigationContainer(self)
         self.__navigationContainer.addWidget(self.__navigationBar)
         self.__navigationContainer.addWidget(self.__bookmarksToolBar)
-        
+
         centralWidget = QWidget()
         layout = QVBoxLayout()
         layout.setContentsMargins(1, 1, 1, 1)
@@ -250,80 +284,77 @@
         layout.addWidget(self.__tabWidget)
         layout.addWidget(self.__searchWidget)
         self.__tabWidget.setSizePolicy(
-            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding)
+            QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding
+        )
         centralWidget.setLayout(layout)
         self.setCentralWidget(centralWidget)
         self.__searchWidget.hide()
-        
+
         if WebBrowserWindow._useQtHelp:
             # setup the TOC widget
             self.__tocWindow = HelpTocWidget(self.__helpEngine)
             self.__tocDock = QDockWidget(self.tr("Contents"), self)
             self.__tocDock.setObjectName("TocWindow")
             self.__tocDock.setWidget(self.__tocWindow)
-            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea,
-                               self.__tocDock)
-            
+            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.__tocDock)
+
             # setup the index widget
             self.__indexWindow = HelpIndexWidget(self.__helpEngine)
             self.__indexDock = QDockWidget(self.tr("Index"), self)
             self.__indexDock.setObjectName("IndexWindow")
             self.__indexDock.setWidget(self.__indexWindow)
-            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea,
-                               self.__indexDock)
-            
+            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.__indexDock)
+
             # setup the search widget
             self.__indexing = False
             self.__indexingProgress = None
             self.__searchEngine = self.__helpEngine.searchEngine()
-            self.__searchEngine.indexingStarted.connect(
-                self.__indexingStarted)
-            self.__searchEngine.indexingFinished.connect(
-                self.__indexingFinished)
+            self.__searchEngine.indexingStarted.connect(self.__indexingStarted)
+            self.__searchEngine.indexingFinished.connect(self.__indexingFinished)
             self.__searchWindow = HelpSearchWidget(self.__searchEngine)
             self.__searchDock = QDockWidget(self.tr("Search"), self)
             self.__searchDock.setObjectName("SearchWindow")
             self.__searchDock.setWidget(self.__searchWindow)
-            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea,
-                               self.__searchDock)
-        
+            self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.__searchDock)
+
         # JavaScript Console window
         from .WebBrowserJavaScriptConsole import WebBrowserJavaScriptConsole
+
         self.__javascriptConsole = WebBrowserJavaScriptConsole(self)
-        self.__javascriptConsoleDock = QDockWidget(
-            self.tr("JavaScript Console"))
+        self.__javascriptConsoleDock = QDockWidget(self.tr("JavaScript Console"))
         self.__javascriptConsoleDock.setObjectName("JavascriptConsole")
         self.__javascriptConsoleDock.setAllowedAreas(
-            Qt.DockWidgetArea.BottomDockWidgetArea |
-            Qt.DockWidgetArea.TopDockWidgetArea)
+            Qt.DockWidgetArea.BottomDockWidgetArea | Qt.DockWidgetArea.TopDockWidgetArea
+        )
         self.__javascriptConsoleDock.setWidget(self.__javascriptConsole)
-        self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea,
-                           self.__javascriptConsoleDock)
-        
+        self.addDockWidget(
+            Qt.DockWidgetArea.BottomDockWidgetArea, self.__javascriptConsoleDock
+        )
+
         g = (
             Preferences.getGeometry("WebBrowserGeometry")
-            if Preferences.getWebBrowser("SaveGeometry") else
-            QByteArray()
+            if Preferences.getWebBrowser("SaveGeometry")
+            else QByteArray()
         )
         if g.isEmpty():
             s = QSize(800, 800)
             self.resize(s)
         else:
             self.restoreGeometry(g)
-        
+
         WebBrowserWindow.BrowserWindows.append(self)
-        
+
         self.__initWebEngineSettings()
-        
+
         # initialize some of our class objects
         self.passwordManager()
         self.historyManager()
         self.greaseMonkeyManager()
         self.protocolHandlerManager()
-        
+
         # initialize the actions
         self.__initActions()
-        
+
         # initialize the menus
         self.__initMenus()
         self.__initSuperMenu()
@@ -331,7 +362,7 @@
             self.__navigationBar.superMenuButton().hide()
         else:
             self.menuBar().hide()
-        
+
         # save references to toolbars in order to hide them
         # when going full screen
         self.__toolbars = {}
@@ -339,30 +370,30 @@
         if Preferences.getWebBrowser("ShowToolbars"):
             self.__initToolbars()
         self.__bookmarksToolBar.setVisible(
-            Preferences.getWebBrowser("BookmarksToolBarVisible"))
-        
+            Preferences.getWebBrowser("BookmarksToolBarVisible")
+        )
+
         syncMgr = self.syncManager()
         syncMgr.syncMessage.connect(self.statusBar().showMessage)
         syncMgr.syncError.connect(self.statusBar().showMessage)
-        
+
         restoreSessionData = {}
         if (
-            WebBrowserWindow._performingStartup and
-            not home and
-            not WebBrowserWindow.isPrivate()
+            WebBrowserWindow._performingStartup
+            and not home
+            and not WebBrowserWindow.isPrivate()
         ):
             startupBehavior = Preferences.getWebBrowser("StartupBehavior")
             if not private and startupBehavior in [3, 4]:
                 if startupBehavior == 3:
                     # restore last session
-                    restoreSessionFile = (
-                        self.sessionManager().lastActiveSessionFile()
-                    )
+                    restoreSessionFile = self.sessionManager().lastActiveSessionFile()
                 elif startupBehavior == 4:
                     # select session
                     restoreSessionFile = self.sessionManager().selectSession()
                 sessionData = self.sessionManager().readSessionFromFile(
-                    restoreSessionFile)
+                    restoreSessionFile
+                )
                 if self.sessionManager().isValidSession(sessionData):
                     restoreSessionData = sessionData
                     restoreSession = True
@@ -373,86 +404,76 @@
                     home = Preferences.getWebBrowser("HomePage")
                 elif Preferences.getWebBrowser("StartupBehavior") == 2:
                     home = "eric:speeddial"
-        
+
         if not restoreSession:
             self.__tabWidget.newBrowser(QUrl.fromUserInput(home))
             self.__tabWidget.currentBrowser().setFocus()
         WebBrowserWindow._performingStartup = False
-        
+
         self.__imagesIcon = ImagesIcon(self)
         self.statusBar().addPermanentWidget(self.__imagesIcon)
         self.__javaScriptIcon = JavaScriptIcon(self)
         self.statusBar().addPermanentWidget(self.__javaScriptIcon)
-        
+
         self.__adBlockIcon = AdBlockIcon(self)
         self.statusBar().addPermanentWidget(self.__adBlockIcon)
-        self.__adBlockIcon.setEnabled(
-            Preferences.getWebBrowser("AdBlockEnabled"))
-        self.__tabWidget.currentChanged[int].connect(
-            self.__adBlockIcon.currentChanged)
-        self.__tabWidget.sourceChanged.connect(
-            self.__adBlockIcon.sourceChanged)
-        
+        self.__adBlockIcon.setEnabled(Preferences.getWebBrowser("AdBlockEnabled"))
+        self.__tabWidget.currentChanged[int].connect(self.__adBlockIcon.currentChanged)
+        self.__tabWidget.sourceChanged.connect(self.__adBlockIcon.sourceChanged)
+
         self.__tabManagerIcon = self.tabManager().createStatusBarIcon()
         self.statusBar().addPermanentWidget(self.__tabManagerIcon)
-        
+
         self.networkIcon = EricNetworkIcon(self)
         self.statusBar().addPermanentWidget(self.networkIcon)
-        
+
         if not Preferences.getWebBrowser("StatusBarVisible"):
             self.statusBar().hide()
-        
+
         if len(WebBrowserWindow.BrowserWindows):
             QDesktopServices.setUrlHandler(
-                "http", WebBrowserWindow.BrowserWindows[0].urlHandler)
+                "http", WebBrowserWindow.BrowserWindows[0].urlHandler
+            )
             QDesktopServices.setUrlHandler(
-                "https", WebBrowserWindow.BrowserWindows[0].urlHandler)
-        
+                "https", WebBrowserWindow.BrowserWindows[0].urlHandler
+            )
+
         # setup connections
         self.__activating = False
         if WebBrowserWindow._useQtHelp:
             # TOC window
-            self.__tocWindow.escapePressed.connect(
-                self.__activateCurrentBrowser)
+            self.__tocWindow.escapePressed.connect(self.__activateCurrentBrowser)
             self.__tocWindow.openUrl.connect(self.openUrl)
             self.__tocWindow.newTab.connect(self.openUrlNewTab)
-            self.__tocWindow.newBackgroundTab.connect(
-                self.openUrlNewBackgroundTab)
+            self.__tocWindow.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
             self.__tocWindow.newWindow.connect(self.openUrlNewWindow)
-            
+
             # index window
-            self.__indexWindow.escapePressed.connect(
-                self.__activateCurrentBrowser)
+            self.__indexWindow.escapePressed.connect(self.__activateCurrentBrowser)
             self.__indexWindow.openUrl.connect(self.openUrl)
             self.__indexWindow.newTab.connect(self.openUrlNewTab)
-            self.__indexWindow.newBackgroundTab.connect(
-                self.openUrlNewBackgroundTab)
+            self.__indexWindow.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
             self.__indexWindow.newWindow.connect(self.openUrlNewWindow)
-            
+
             # search window
-            self.__searchWindow.escapePressed.connect(
-                self.__activateCurrentBrowser)
+            self.__searchWindow.escapePressed.connect(self.__activateCurrentBrowser)
             self.__searchWindow.openUrl.connect(self.openUrl)
             self.__searchWindow.newTab.connect(self.openUrlNewTab)
-            self.__searchWindow.newBackgroundTab.connect(
-                self.openUrlNewBackgroundTab)
+            self.__searchWindow.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
             self.__searchWindow.newWindow.connect(self.openUrlNewWindow)
-        
+
         state = Preferences.getWebBrowser("WebBrowserState")
         self.restoreState(state)
-        
+
         self.__virusTotal = VirusTotalAPI(self)
-        self.__virusTotal.submitUrlError.connect(
-            self.__virusTotalSubmitUrlError)
-        self.__virusTotal.urlScanReport.connect(
-            self.__virusTotalUrlScanReport)
-        self.__virusTotal.fileScanReport.connect(
-            self.__virusTotalFileScanReport)
-        
+        self.__virusTotal.submitUrlError.connect(self.__virusTotalSubmitUrlError)
+        self.__virusTotal.urlScanReport.connect(self.__virusTotalUrlScanReport)
+        self.__virusTotal.fileScanReport.connect(self.__virusTotalFileScanReport)
+
         ericApp().focusChanged.connect(self.__appFocusChanged)
-        
+
         self.__toolbarStates = self.saveState()
-        
+
         if single:
             self.SAServer = WebBrowserSingleApplicationServer(saname)
             self.SAServer.loadUrl.connect(self.__saLoadUrl)
@@ -461,1460 +482,1839 @@
             self.SAServer.shutdown.connect(self.shutdown)
         else:
             self.SAServer = None
-        
+
         self.__hideNavigationTimer = QTimer(self)
         self.__hideNavigationTimer.setInterval(1000)
         self.__hideNavigationTimer.setSingleShot(True)
         self.__hideNavigationTimer.timeout.connect(self.__hideNavigation)
-        
+
         self.__forcedClose = False
-        
+
         if restoreSessionData and not WebBrowserWindow.isPrivate():
-            self.sessionManager().restoreSessionFromData(
-                self, restoreSessionData)
-        
+            self.sessionManager().restoreSessionFromData(self, restoreSessionData)
+
         if not WebBrowserWindow.isPrivate():
             self.sessionManager().activateTimer()
-        
+
         QTimer.singleShot(0, syncMgr.loadSettings)
-        
+
         if WebBrowserWindow._useQtHelp:
             QTimer.singleShot(50, self.__lookForNewDocumentation)
             if searchWord:
                 QTimer.singleShot(0, lambda: self.__searchForWord(searchWord))
-    
+
     def __del__(self):
         """
         Special method called during object destruction.
-        
+
         Note: This empty variant seems to get rid of the Qt message
         'Warning: QBasicTimer::start: QBasicTimer can only be used with
         threads started with QThread'
         """
         pass
-    
+
     def tabWidget(self):
         """
         Public method to get a reference to the tab widget.
-        
+
         @return reference to the tab widget
         @rtype WebBrowserTabWidget
         """
         return self.__tabWidget
-    
+
     def __setIconDatabasePath(self, enable=True):
         """
         Private method to set the favicons path.
-        
+
         @param enable flag indicating to enabled icon storage (boolean)
         """
         if enable:
-            iconDatabasePath = os.path.join(Utilities.getConfigDir(),
-                                            "web_browser", "favicons")
+            iconDatabasePath = os.path.join(
+                Utilities.getConfigDir(), "web_browser", "favicons"
+            )
             if not os.path.exists(iconDatabasePath):
                 os.makedirs(iconDatabasePath)
         else:
-            iconDatabasePath = ""   # setting an empty path disables it
-        
+            iconDatabasePath = ""  # setting an empty path disables it
+
         WebIconProvider.instance().setIconDatabasePath(iconDatabasePath)
-        
+
     def __initWebEngineSettings(self):
         """
         Private method to set the global web settings.
         """
         settings = self.webSettings()
-        
+
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.StandardFont,
-            Preferences.getWebBrowser("StandardFontFamily"))
+            Preferences.getWebBrowser("StandardFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.FixedFont,
-            Preferences.getWebBrowser("FixedFontFamily"))
+            Preferences.getWebBrowser("FixedFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.SerifFont,
-            Preferences.getWebBrowser("SerifFontFamily"))
+            Preferences.getWebBrowser("SerifFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.SansSerifFont,
-            Preferences.getWebBrowser("SansSerifFontFamily"))
+            Preferences.getWebBrowser("SansSerifFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.CursiveFont,
-            Preferences.getWebBrowser("CursiveFontFamily"))
+            Preferences.getWebBrowser("CursiveFontFamily"),
+        )
         settings.setFontFamily(
             QWebEngineSettings.FontFamily.FantasyFont,
-            Preferences.getWebBrowser("FantasyFontFamily"))
-        
+            Preferences.getWebBrowser("FantasyFontFamily"),
+        )
+
         settings.setFontSize(
             QWebEngineSettings.FontSize.DefaultFontSize,
-            Preferences.getWebBrowser("DefaultFontSize"))
+            Preferences.getWebBrowser("DefaultFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.DefaultFixedFontSize,
-            Preferences.getWebBrowser("DefaultFixedFontSize"))
+            Preferences.getWebBrowser("DefaultFixedFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.MinimumFontSize,
-            Preferences.getWebBrowser("MinimumFontSize"))
+            Preferences.getWebBrowser("MinimumFontSize"),
+        )
         settings.setFontSize(
             QWebEngineSettings.FontSize.MinimumLogicalFontSize,
-            Preferences.getWebBrowser("MinimumLogicalFontSize"))
-        
+            Preferences.getWebBrowser("MinimumLogicalFontSize"),
+        )
+
         styleSheet = Preferences.getWebBrowser("UserStyleSheet")
         self.__setUserStyleSheet(styleSheet)
-        
+
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AutoLoadImages,
-            Preferences.getWebBrowser("AutoLoadImages"))
+            Preferences.getWebBrowser("AutoLoadImages"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptEnabled,
-            Preferences.getWebBrowser("JavaScriptEnabled"))
+            Preferences.getWebBrowser("JavaScriptEnabled"),
+        )
         # JavaScript is needed for the web browser functionality
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanOpenWindows,
-            Preferences.getWebBrowser("JavaScriptCanOpenWindows"))
+            Preferences.getWebBrowser("JavaScriptCanOpenWindows"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanAccessClipboard,
-            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"))
+            Preferences.getWebBrowser("JavaScriptCanAccessClipboard"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PluginsEnabled,
-            Preferences.getWebBrowser("PluginsEnabled"))
-        
+            Preferences.getWebBrowser("PluginsEnabled"),
+        )
+
         if self.isPrivate():
             settings.setAttribute(
-                QWebEngineSettings.WebAttribute.LocalStorageEnabled, False)
+                QWebEngineSettings.WebAttribute.LocalStorageEnabled, False
+            )
         else:
             settings.setAttribute(
                 QWebEngineSettings.WebAttribute.LocalStorageEnabled,
-                Preferences.getWebBrowser("LocalStorageEnabled"))
+                Preferences.getWebBrowser("LocalStorageEnabled"),
+            )
         settings.setDefaultTextEncoding(
-            Preferences.getWebBrowser("DefaultTextEncoding"))
-        
+            Preferences.getWebBrowser("DefaultTextEncoding")
+        )
+
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.SpatialNavigationEnabled,
-            Preferences.getWebBrowser("SpatialNavigationEnabled"))
+            Preferences.getWebBrowser("SpatialNavigationEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LinksIncludedInFocusChain,
-            Preferences.getWebBrowser("LinksIncludedInFocusChain"))
+            Preferences.getWebBrowser("LinksIncludedInFocusChain"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls,
-            Preferences.getWebBrowser("LocalContentCanAccessRemoteUrls"))
+            Preferences.getWebBrowser("LocalContentCanAccessRemoteUrls"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls,
-            Preferences.getWebBrowser("LocalContentCanAccessFileUrls"))
+            Preferences.getWebBrowser("LocalContentCanAccessFileUrls"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.XSSAuditingEnabled,
-            Preferences.getWebBrowser("XSSAuditingEnabled"))
+            Preferences.getWebBrowser("XSSAuditingEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ScrollAnimatorEnabled,
-            Preferences.getWebBrowser("ScrollAnimatorEnabled"))
+            Preferences.getWebBrowser("ScrollAnimatorEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ErrorPageEnabled,
-            Preferences.getWebBrowser("ErrorPageEnabled"))
+            Preferences.getWebBrowser("ErrorPageEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.FullScreenSupportEnabled,
-            Preferences.getWebBrowser("FullScreenSupportEnabled"))
+            Preferences.getWebBrowser("FullScreenSupportEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ScreenCaptureEnabled,
-            Preferences.getWebBrowser("ScreenCaptureEnabled"))
+            Preferences.getWebBrowser("ScreenCaptureEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.WebGLEnabled,
-            Preferences.getWebBrowser("WebGLEnabled"))
+            Preferences.getWebBrowser("WebGLEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.FocusOnNavigationEnabled,
-            Preferences.getWebBrowser("FocusOnNavigationEnabled"))
+            Preferences.getWebBrowser("FocusOnNavigationEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PrintElementBackgrounds,
-            Preferences.getWebBrowser("PrintElementBackgrounds"))
+            Preferences.getWebBrowser("PrintElementBackgrounds"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AllowRunningInsecureContent,
-            Preferences.getWebBrowser("AllowRunningInsecureContent"))
+            Preferences.getWebBrowser("AllowRunningInsecureContent"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.AllowGeolocationOnInsecureOrigins,
-            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins"))
+            Preferences.getWebBrowser("AllowGeolocationOnInsecureOrigins"),
+        )
         settings.setAttribute(
-            QWebEngineSettings.WebAttribute
-            .AllowWindowActivationFromJavaScript,
-            Preferences.getWebBrowser(
-                "AllowWindowActivationFromJavaScript"))
+            QWebEngineSettings.WebAttribute.AllowWindowActivationFromJavaScript,
+            Preferences.getWebBrowser("AllowWindowActivationFromJavaScript"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.ShowScrollBars,
-            Preferences.getWebBrowser("ShowScrollBars"))
+            Preferences.getWebBrowser("ShowScrollBars"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PlaybackRequiresUserGesture,
-            Preferences.getWebBrowser(
-                "PlaybackRequiresUserGesture"))
+            Preferences.getWebBrowser("PlaybackRequiresUserGesture"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.JavascriptCanPaste,
-            Preferences.getWebBrowser(
-                "JavaScriptCanPaste"))
+            Preferences.getWebBrowser("JavaScriptCanPaste"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.WebRTCPublicInterfacesOnly,
-            Preferences.getWebBrowser(
-                "WebRTCPublicInterfacesOnly"))
+            Preferences.getWebBrowser("WebRTCPublicInterfacesOnly"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.DnsPrefetchEnabled,
-            Preferences.getWebBrowser(
-                "DnsPrefetchEnabled"))
+            Preferences.getWebBrowser("DnsPrefetchEnabled"),
+        )
         settings.setAttribute(
             QWebEngineSettings.WebAttribute.PdfViewerEnabled,
-            Preferences.getWebBrowser(
-                "PdfViewerEnabled"))
-    
+            Preferences.getWebBrowser("PdfViewerEnabled"),
+        )
+
     def __initActions(self):
         """
         Private method to define the user interface actions.
         """
         # list of all actions
         self.__actions = []
-        
+
         self.newTabAct = EricAction(
-            self.tr('New Tab'),
+            self.tr("New Tab"),
             UI.PixmapCache.getIcon("tabNew"),
-            self.tr('&New Tab'),
+            self.tr("&New Tab"),
             QKeySequence(self.tr("Ctrl+T", "File|New Tab")),
-            0, self, 'webbrowser_file_new_tab')
-        self.newTabAct.setStatusTip(self.tr('Open a new web browser tab'))
-        self.newTabAct.setWhatsThis(self.tr(
-            """<b>New Tab</b>"""
-            """<p>This opens a new web browser tab.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_new_tab",
+        )
+        self.newTabAct.setStatusTip(self.tr("Open a new web browser tab"))
+        self.newTabAct.setWhatsThis(
+            self.tr("""<b>New Tab</b>""" """<p>This opens a new web browser tab.</p>""")
+        )
         self.newTabAct.triggered.connect(self.newTab)
         self.__actions.append(self.newTabAct)
-        
+
         self.newAct = EricAction(
-            self.tr('New Window'),
+            self.tr("New Window"),
             UI.PixmapCache.getIcon("newWindow"),
-            self.tr('New &Window'),
+            self.tr("New &Window"),
             QKeySequence(self.tr("Ctrl+N", "File|New Window")),
-            0, self, 'webbrowser_file_new_window')
-        self.newAct.setStatusTip(self.tr('Open a new web browser window'))
-        self.newAct.setWhatsThis(self.tr(
-            """<b>New Window</b>"""
-            """<p>This opens a new web browser window in the current"""
-            """ privacy mode.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_new_window",
+        )
+        self.newAct.setStatusTip(self.tr("Open a new web browser window"))
+        self.newAct.setWhatsThis(
+            self.tr(
+                """<b>New Window</b>"""
+                """<p>This opens a new web browser window in the current"""
+                """ privacy mode.</p>"""
+            )
+        )
         self.newAct.triggered.connect(self.newWindow)
         self.__actions.append(self.newAct)
-        
+
         self.newPrivateAct = EricAction(
-            self.tr('New Private Window'),
+            self.tr("New Private Window"),
             UI.PixmapCache.getIcon("privateMode"),
-            self.tr('New &Private Window'),
+            self.tr("New &Private Window"),
             QKeySequence(self.tr("Ctrl+Shift+P", "File|New Private Window")),
-            0, self, 'webbrowser_file_new_private_window')
-        self.newPrivateAct.setStatusTip(self.tr(
-            'Open a new private web browser window'))
-        self.newPrivateAct.setWhatsThis(self.tr(
-            """<b>New Private Window</b>"""
-            """<p>This opens a new private web browser window by starting"""
-            """ a new web browser instance in private mode.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_new_private_window",
+        )
+        self.newPrivateAct.setStatusTip(
+            self.tr("Open a new private web browser window")
+        )
+        self.newPrivateAct.setWhatsThis(
+            self.tr(
+                """<b>New Private Window</b>"""
+                """<p>This opens a new private web browser window by starting"""
+                """ a new web browser instance in private mode.</p>"""
+            )
+        )
         self.newPrivateAct.triggered.connect(self.newPrivateWindow)
         self.__actions.append(self.newPrivateAct)
-        
+
         self.openAct = EricAction(
-            self.tr('Open File'),
+            self.tr("Open File"),
             UI.PixmapCache.getIcon("open"),
-            self.tr('&Open File'),
+            self.tr("&Open File"),
             QKeySequence(self.tr("Ctrl+O", "File|Open")),
-            0, self, 'webbrowser_file_open')
-        self.openAct.setStatusTip(self.tr('Open a file for display'))
-        self.openAct.setWhatsThis(self.tr(
-            """<b>Open File</b>"""
-            """<p>This opens a new file for display."""
-            """ It pops up a file selection dialog.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_open",
+        )
+        self.openAct.setStatusTip(self.tr("Open a file for display"))
+        self.openAct.setWhatsThis(
+            self.tr(
+                """<b>Open File</b>"""
+                """<p>This opens a new file for display."""
+                """ It pops up a file selection dialog.</p>"""
+            )
+        )
         self.openAct.triggered.connect(self.__openFile)
         self.__actions.append(self.openAct)
-        
+
         self.openTabAct = EricAction(
-            self.tr('Open File in New Tab'),
+            self.tr("Open File in New Tab"),
             UI.PixmapCache.getIcon("openNewTab"),
-            self.tr('Open File in New &Tab'),
+            self.tr("Open File in New &Tab"),
             QKeySequence(self.tr("Shift+Ctrl+O", "File|Open in new tab")),
-            0, self, 'webbrowser_file_open_tab')
-        self.openTabAct.setStatusTip(
-            self.tr('Open a file for display in a new tab'))
-        self.openTabAct.setWhatsThis(self.tr(
-            """<b>Open File in New Tab</b>"""
-            """<p>This opens a new file for display in a new tab."""
-            """ It pops up a file selection dialog.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_open_tab",
+        )
+        self.openTabAct.setStatusTip(self.tr("Open a file for display in a new tab"))
+        self.openTabAct.setWhatsThis(
+            self.tr(
+                """<b>Open File in New Tab</b>"""
+                """<p>This opens a new file for display in a new tab."""
+                """ It pops up a file selection dialog.</p>"""
+            )
+        )
         self.openTabAct.triggered.connect(self.__openFileNewTab)
         self.__actions.append(self.openTabAct)
-        
+
         if hasattr(QWebEnginePage, "SavePage"):
             self.saveAsAct = EricAction(
-                self.tr('Save As'),
+                self.tr("Save As"),
                 UI.PixmapCache.getIcon("fileSaveAs"),
-                self.tr('&Save As...'),
+                self.tr("&Save As..."),
                 QKeySequence(self.tr("Shift+Ctrl+S", "File|Save As")),
-                0, self, 'webbrowser_file_save_as')
-            self.saveAsAct.setStatusTip(
-                self.tr('Save the current page to disk'))
-            self.saveAsAct.setWhatsThis(self.tr(
-                """<b>Save As...</b>"""
-                """<p>Saves the current page to disk.</p>"""
-            ))
+                0,
+                self,
+                "webbrowser_file_save_as",
+            )
+            self.saveAsAct.setStatusTip(self.tr("Save the current page to disk"))
+            self.saveAsAct.setWhatsThis(
+                self.tr(
+                    """<b>Save As...</b>""" """<p>Saves the current page to disk.</p>"""
+                )
+            )
             self.saveAsAct.triggered.connect(self.__savePageAs)
             self.__actions.append(self.saveAsAct)
         else:
             self.saveAsAct = None
-        
+
         self.saveVisiblePageScreenAct = EricAction(
-            self.tr('Save Page Screen'),
+            self.tr("Save Page Screen"),
             UI.PixmapCache.getIcon("fileSavePixmap"),
-            self.tr('Save Page Screen...'),
-            0, 0, self, 'webbrowser_file_save_visible_page_screen')
+            self.tr("Save Page Screen..."),
+            0,
+            0,
+            self,
+            "webbrowser_file_save_visible_page_screen",
+        )
         self.saveVisiblePageScreenAct.setStatusTip(
-            self.tr('Save the visible part of the current page as a'
-                    ' screen shot'))
-        self.saveVisiblePageScreenAct.setWhatsThis(self.tr(
-            """<b>Save Page Screen...</b>"""
-            """<p>Saves the visible part of the current page as a"""
-            """ screen shot.</p>"""
-        ))
-        self.saveVisiblePageScreenAct.triggered.connect(
-            self.__saveVisiblePageScreen)
+            self.tr("Save the visible part of the current page as a" " screen shot")
+        )
+        self.saveVisiblePageScreenAct.setWhatsThis(
+            self.tr(
+                """<b>Save Page Screen...</b>"""
+                """<p>Saves the visible part of the current page as a"""
+                """ screen shot.</p>"""
+            )
+        )
+        self.saveVisiblePageScreenAct.triggered.connect(self.__saveVisiblePageScreen)
         self.__actions.append(self.saveVisiblePageScreenAct)
-        
+
         bookmarksManager = self.bookmarksManager()
         self.importBookmarksAct = EricAction(
-            self.tr('Import Bookmarks'),
-            self.tr('&Import Bookmarks...'),
-            0, 0, self, 'webbrowser_file_import_bookmarks')
+            self.tr("Import Bookmarks"),
+            self.tr("&Import Bookmarks..."),
+            0,
+            0,
+            self,
+            "webbrowser_file_import_bookmarks",
+        )
         self.importBookmarksAct.setStatusTip(
-            self.tr('Import bookmarks from other browsers'))
-        self.importBookmarksAct.setWhatsThis(self.tr(
-            """<b>Import Bookmarks</b>"""
-            """<p>Import bookmarks from other browsers.</p>"""
-        ))
-        self.importBookmarksAct.triggered.connect(
-            bookmarksManager.importBookmarks)
+            self.tr("Import bookmarks from other browsers")
+        )
+        self.importBookmarksAct.setWhatsThis(
+            self.tr(
+                """<b>Import Bookmarks</b>"""
+                """<p>Import bookmarks from other browsers.</p>"""
+            )
+        )
+        self.importBookmarksAct.triggered.connect(bookmarksManager.importBookmarks)
         self.__actions.append(self.importBookmarksAct)
-        
+
         self.exportBookmarksAct = EricAction(
-            self.tr('Export Bookmarks'),
-            self.tr('&Export Bookmarks...'),
-            0, 0, self, 'webbrowser_file_export_bookmarks')
+            self.tr("Export Bookmarks"),
+            self.tr("&Export Bookmarks..."),
+            0,
+            0,
+            self,
+            "webbrowser_file_export_bookmarks",
+        )
         self.exportBookmarksAct.setStatusTip(
-            self.tr('Export the bookmarks into a file'))
-        self.exportBookmarksAct.setWhatsThis(self.tr(
-            """<b>Export Bookmarks</b>"""
-            """<p>Export the bookmarks into a file.</p>"""
-        ))
-        self.exportBookmarksAct.triggered.connect(
-            bookmarksManager.exportBookmarks)
+            self.tr("Export the bookmarks into a file")
+        )
+        self.exportBookmarksAct.setWhatsThis(
+            self.tr(
+                """<b>Export Bookmarks</b>"""
+                """<p>Export the bookmarks into a file.</p>"""
+            )
+        )
+        self.exportBookmarksAct.triggered.connect(bookmarksManager.exportBookmarks)
         self.__actions.append(self.exportBookmarksAct)
-        
+
         self.printAct = EricAction(
-            self.tr('Print'),
+            self.tr("Print"),
             UI.PixmapCache.getIcon("print"),
-            self.tr('&Print'),
+            self.tr("&Print"),
             QKeySequence(self.tr("Ctrl+P", "File|Print")),
-            0, self, 'webbrowser_file_print')
-        self.printAct.setStatusTip(self.tr('Print the displayed help'))
-        self.printAct.setWhatsThis(self.tr(
-            """<b>Print</b>"""
-            """<p>Print the displayed help text.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_print",
+        )
+        self.printAct.setStatusTip(self.tr("Print the displayed help"))
+        self.printAct.setWhatsThis(
+            self.tr("""<b>Print</b>""" """<p>Print the displayed help text.</p>""")
+        )
         self.printAct.triggered.connect(self.__tabWidget.printBrowser)
         self.__actions.append(self.printAct)
-        
+
         self.printPdfAct = EricAction(
-            self.tr('Print as PDF'),
+            self.tr("Print as PDF"),
             UI.PixmapCache.getIcon("printPdf"),
-            self.tr('Print as PDF'),
-            0, 0, self, 'webbrowser_file_print_pdf')
-        self.printPdfAct.setStatusTip(self.tr(
-            'Print the displayed help as PDF'))
-        self.printPdfAct.setWhatsThis(self.tr(
-            """<b>Print as PDF</b>"""
-            """<p>Print the displayed help text as a PDF file.</p>"""
-        ))
-        self.printPdfAct.triggered.connect(
-            self.__tabWidget.printBrowserPdf)
+            self.tr("Print as PDF"),
+            0,
+            0,
+            self,
+            "webbrowser_file_print_pdf",
+        )
+        self.printPdfAct.setStatusTip(self.tr("Print the displayed help as PDF"))
+        self.printPdfAct.setWhatsThis(
+            self.tr(
+                """<b>Print as PDF</b>"""
+                """<p>Print the displayed help text as a PDF file.</p>"""
+            )
+        )
+        self.printPdfAct.triggered.connect(self.__tabWidget.printBrowserPdf)
         self.__actions.append(self.printPdfAct)
-        
+
         self.printPreviewAct = EricAction(
-            self.tr('Print Preview'),
+            self.tr("Print Preview"),
             UI.PixmapCache.getIcon("printPreview"),
-            self.tr('Print Preview'),
-            0, 0, self, 'webbrowser_file_print_preview')
-        self.printPreviewAct.setStatusTip(self.tr(
-            'Print preview of the displayed help'))
-        self.printPreviewAct.setWhatsThis(self.tr(
-            """<b>Print Preview</b>"""
-            """<p>Print preview of the displayed help text.</p>"""
-        ))
-        self.printPreviewAct.triggered.connect(
-            self.__tabWidget.printPreviewBrowser)
+            self.tr("Print Preview"),
+            0,
+            0,
+            self,
+            "webbrowser_file_print_preview",
+        )
+        self.printPreviewAct.setStatusTip(
+            self.tr("Print preview of the displayed help")
+        )
+        self.printPreviewAct.setWhatsThis(
+            self.tr(
+                """<b>Print Preview</b>"""
+                """<p>Print preview of the displayed help text.</p>"""
+            )
+        )
+        self.printPreviewAct.triggered.connect(self.__tabWidget.printPreviewBrowser)
         self.__actions.append(self.printPreviewAct)
-        
+
         self.sendPageLinkAct = EricAction(
-            self.tr('Send Page Link'),
+            self.tr("Send Page Link"),
             UI.PixmapCache.getIcon("mailSend"),
-            self.tr('Send Page Link'),
-            0, 0, self, 'webbrowser_send_page_link')
-        self.sendPageLinkAct.setStatusTip(self.tr(
-            'Send the link of the current page via email'))
-        self.sendPageLinkAct.setWhatsThis(self.tr(
-            """<b>Send Page Link</b>"""
-            """<p>Send the link of the current page via email.</p>"""
-        ))
+            self.tr("Send Page Link"),
+            0,
+            0,
+            self,
+            "webbrowser_send_page_link",
+        )
+        self.sendPageLinkAct.setStatusTip(
+            self.tr("Send the link of the current page via email")
+        )
+        self.sendPageLinkAct.setWhatsThis(
+            self.tr(
+                """<b>Send Page Link</b>"""
+                """<p>Send the link of the current page via email.</p>"""
+            )
+        )
         self.sendPageLinkAct.triggered.connect(self.__sendPageLink)
         self.__actions.append(self.sendPageLinkAct)
-        
+
         self.closeAct = EricAction(
-            self.tr('Close'),
+            self.tr("Close"),
             UI.PixmapCache.getIcon("close"),
-            self.tr('&Close'),
+            self.tr("&Close"),
             QKeySequence(self.tr("Ctrl+W", "File|Close")),
-            0, self, 'webbrowser_file_close')
-        self.closeAct.setStatusTip(self.tr(
-            'Close the current help window'))
-        self.closeAct.setWhatsThis(self.tr(
-            """<b>Close</b>"""
-            """<p>Closes the current web browser window.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_close",
+        )
+        self.closeAct.setStatusTip(self.tr("Close the current help window"))
+        self.closeAct.setWhatsThis(
+            self.tr(
+                """<b>Close</b>""" """<p>Closes the current web browser window.</p>"""
+            )
+        )
         self.closeAct.triggered.connect(self.__tabWidget.closeBrowser)
         self.__actions.append(self.closeAct)
-        
+
         self.closeAllAct = EricAction(
-            self.tr('Close All'),
-            self.tr('Close &All'),
-            0, 0, self, 'webbrowser_file_close_all')
-        self.closeAllAct.setStatusTip(self.tr('Close all help windows'))
-        self.closeAllAct.setWhatsThis(self.tr(
-            """<b>Close All</b>"""
-            """<p>Closes all web browser windows except the first one.</p>"""
-        ))
-        self.closeAllAct.triggered.connect(
-            self.__tabWidget.closeAllBrowsers)
+            self.tr("Close All"),
+            self.tr("Close &All"),
+            0,
+            0,
+            self,
+            "webbrowser_file_close_all",
+        )
+        self.closeAllAct.setStatusTip(self.tr("Close all help windows"))
+        self.closeAllAct.setWhatsThis(
+            self.tr(
+                """<b>Close All</b>"""
+                """<p>Closes all web browser windows except the first one.</p>"""
+            )
+        )
+        self.closeAllAct.triggered.connect(self.__tabWidget.closeAllBrowsers)
         self.__actions.append(self.closeAllAct)
-        
+
         self.exitAct = EricAction(
-            self.tr('Quit'),
+            self.tr("Quit"),
             UI.PixmapCache.getIcon("exit"),
-            self.tr('&Quit'),
+            self.tr("&Quit"),
             QKeySequence(self.tr("Ctrl+Q", "File|Quit")),
-            0, self, 'webbrowser_file_quit')
-        self.exitAct.setStatusTip(self.tr('Quit the eric Web Browser'))
-        self.exitAct.setWhatsThis(self.tr(
-            """<b>Quit</b>"""
-            """<p>Quit the eric Web Browser.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_file_quit",
+        )
+        self.exitAct.setStatusTip(self.tr("Quit the eric Web Browser"))
+        self.exitAct.setWhatsThis(
+            self.tr("""<b>Quit</b>""" """<p>Quit the eric Web Browser.</p>""")
+        )
         self.exitAct.triggered.connect(self.shutdown)
         self.__actions.append(self.exitAct)
-        
+
         self.backAct = EricAction(
-            self.tr('Backward'),
+            self.tr("Backward"),
             UI.PixmapCache.getIcon("back"),
-            self.tr('&Backward'),
+            self.tr("&Backward"),
             QKeySequence(self.tr("Alt+Left", "Go|Backward")),
-            0, self, 'webbrowser_go_backward')
-        self.backAct.setStatusTip(self.tr('Move one screen backward'))
-        self.backAct.setWhatsThis(self.tr(
-            """<b>Backward</b>"""
-            """<p>Moves one screen backward. If none is"""
-            """ available, this action is disabled.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_go_backward",
+        )
+        self.backAct.setStatusTip(self.tr("Move one screen backward"))
+        self.backAct.setWhatsThis(
+            self.tr(
+                """<b>Backward</b>"""
+                """<p>Moves one screen backward. If none is"""
+                """ available, this action is disabled.</p>"""
+            )
+        )
         self.backAct.triggered.connect(self.__backward)
         self.__actions.append(self.backAct)
-        
+
         self.forwardAct = EricAction(
-            self.tr('Forward'),
+            self.tr("Forward"),
             UI.PixmapCache.getIcon("forward"),
-            self.tr('&Forward'),
+            self.tr("&Forward"),
             QKeySequence(self.tr("Alt+Right", "Go|Forward")),
-            0, self, 'webbrowser_go_foreward')
-        self.forwardAct.setStatusTip(self.tr(
-            'Move one screen forward'))
-        self.forwardAct.setWhatsThis(self.tr(
-            """<b>Forward</b>"""
-            """<p>Moves one screen forward. If none is"""
-            """ available, this action is disabled.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_go_foreward",
+        )
+        self.forwardAct.setStatusTip(self.tr("Move one screen forward"))
+        self.forwardAct.setWhatsThis(
+            self.tr(
+                """<b>Forward</b>"""
+                """<p>Moves one screen forward. If none is"""
+                """ available, this action is disabled.</p>"""
+            )
+        )
         self.forwardAct.triggered.connect(self.__forward)
         self.__actions.append(self.forwardAct)
-        
+
         self.homeAct = EricAction(
-            self.tr('Home'),
+            self.tr("Home"),
             UI.PixmapCache.getIcon("home"),
-            self.tr('&Home'),
+            self.tr("&Home"),
             QKeySequence(self.tr("Ctrl+Home", "Go|Home")),
-            0, self, 'webbrowser_go_home')
-        self.homeAct.setStatusTip(self.tr(
-            'Move to the initial screen'))
-        self.homeAct.setWhatsThis(self.tr(
-            """<b>Home</b>"""
-            """<p>Moves to the initial screen.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_go_home",
+        )
+        self.homeAct.setStatusTip(self.tr("Move to the initial screen"))
+        self.homeAct.setWhatsThis(
+            self.tr("""<b>Home</b>""" """<p>Moves to the initial screen.</p>""")
+        )
         self.homeAct.triggered.connect(self.__home)
         self.__actions.append(self.homeAct)
-        
+
         self.reloadAct = EricAction(
-            self.tr('Reload'),
+            self.tr("Reload"),
             UI.PixmapCache.getIcon("reload"),
-            self.tr('&Reload'),
+            self.tr("&Reload"),
             QKeySequence(self.tr("Ctrl+R", "Go|Reload")),
             QKeySequence(self.tr("F5", "Go|Reload")),
-            self, 'webbrowser_go_reload')
-        self.reloadAct.setStatusTip(self.tr(
-            'Reload the current screen'))
-        self.reloadAct.setWhatsThis(self.tr(
-            """<b>Reload</b>"""
-            """<p>Reloads the current screen.</p>"""
-        ))
+            self,
+            "webbrowser_go_reload",
+        )
+        self.reloadAct.setStatusTip(self.tr("Reload the current screen"))
+        self.reloadAct.setWhatsThis(
+            self.tr("""<b>Reload</b>""" """<p>Reloads the current screen.</p>""")
+        )
         self.reloadAct.triggered.connect(self.__reload)
         self.__actions.append(self.reloadAct)
-        
+
         self.stopAct = EricAction(
-            self.tr('Stop'),
+            self.tr("Stop"),
             UI.PixmapCache.getIcon("stopLoading"),
-            self.tr('&Stop'),
+            self.tr("&Stop"),
             QKeySequence(self.tr("Ctrl+.", "Go|Stop")),
             QKeySequence(self.tr("Esc", "Go|Stop")),
-            self, 'webbrowser_go_stop')
-        self.stopAct.setStatusTip(self.tr('Stop loading'))
-        self.stopAct.setWhatsThis(self.tr(
-            """<b>Stop</b>"""
-            """<p>Stops loading of the current tab.</p>"""
-        ))
+            self,
+            "webbrowser_go_stop",
+        )
+        self.stopAct.setStatusTip(self.tr("Stop loading"))
+        self.stopAct.setWhatsThis(
+            self.tr("""<b>Stop</b>""" """<p>Stops loading of the current tab.</p>""")
+        )
         self.stopAct.triggered.connect(self.__stopLoading)
         self.__actions.append(self.stopAct)
-        
+
         self.copyAct = EricAction(
-            self.tr('Copy'),
+            self.tr("Copy"),
             UI.PixmapCache.getIcon("editCopy"),
-            self.tr('&Copy'),
+            self.tr("&Copy"),
             QKeySequence(self.tr("Ctrl+C", "Edit|Copy")),
-            0, self, 'webbrowser_edit_copy')
-        self.copyAct.setStatusTip(self.tr('Copy the selected text'))
-        self.copyAct.setWhatsThis(self.tr(
-            """<b>Copy</b>"""
-            """<p>Copy the selected text to the clipboard.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_copy",
+        )
+        self.copyAct.setStatusTip(self.tr("Copy the selected text"))
+        self.copyAct.setWhatsThis(
+            self.tr(
+                """<b>Copy</b>""" """<p>Copy the selected text to the clipboard.</p>"""
+            )
+        )
         self.copyAct.triggered.connect(self.__copy)
         self.__actions.append(self.copyAct)
-        
+
         self.cutAct = EricAction(
-            self.tr('Cut'),
+            self.tr("Cut"),
             UI.PixmapCache.getIcon("editCut"),
-            self.tr('Cu&t'),
+            self.tr("Cu&t"),
             QKeySequence(self.tr("Ctrl+X", "Edit|Cut")),
-            0, self, 'webbrowser_edit_cut')
-        self.cutAct.setStatusTip(self.tr('Cut the selected text'))
-        self.cutAct.setWhatsThis(self.tr(
-            """<b>Cut</b>"""
-            """<p>Cut the selected text to the clipboard.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_cut",
+        )
+        self.cutAct.setStatusTip(self.tr("Cut the selected text"))
+        self.cutAct.setWhatsThis(
+            self.tr(
+                """<b>Cut</b>""" """<p>Cut the selected text to the clipboard.</p>"""
+            )
+        )
         self.cutAct.triggered.connect(self.__cut)
         self.__actions.append(self.cutAct)
-        
+
         self.pasteAct = EricAction(
-            self.tr('Paste'),
+            self.tr("Paste"),
             UI.PixmapCache.getIcon("editPaste"),
-            self.tr('&Paste'),
+            self.tr("&Paste"),
             QKeySequence(self.tr("Ctrl+V", "Edit|Paste")),
-            0, self, 'webbrowser_edit_paste')
-        self.pasteAct.setStatusTip(self.tr('Paste text from the clipboard'))
-        self.pasteAct.setWhatsThis(self.tr(
-            """<b>Paste</b>"""
-            """<p>Paste some text from the clipboard.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_paste",
+        )
+        self.pasteAct.setStatusTip(self.tr("Paste text from the clipboard"))
+        self.pasteAct.setWhatsThis(
+            self.tr("""<b>Paste</b>""" """<p>Paste some text from the clipboard.</p>""")
+        )
         self.pasteAct.triggered.connect(self.__paste)
         self.__actions.append(self.pasteAct)
-        
+
         self.undoAct = EricAction(
-            self.tr('Undo'),
+            self.tr("Undo"),
             UI.PixmapCache.getIcon("editUndo"),
-            self.tr('&Undo'),
+            self.tr("&Undo"),
             QKeySequence(self.tr("Ctrl+Z", "Edit|Undo")),
-            0, self, 'webbrowser_edit_undo')
-        self.undoAct.setStatusTip(self.tr('Undo the last edit action'))
-        self.undoAct.setWhatsThis(self.tr(
-            """<b>Undo</b>"""
-            """<p>Undo the last edit action.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_undo",
+        )
+        self.undoAct.setStatusTip(self.tr("Undo the last edit action"))
+        self.undoAct.setWhatsThis(
+            self.tr("""<b>Undo</b>""" """<p>Undo the last edit action.</p>""")
+        )
         self.undoAct.triggered.connect(self.__undo)
         self.__actions.append(self.undoAct)
-        
+
         self.redoAct = EricAction(
-            self.tr('Redo'),
+            self.tr("Redo"),
             UI.PixmapCache.getIcon("editRedo"),
-            self.tr('&Redo'),
+            self.tr("&Redo"),
             QKeySequence(self.tr("Ctrl+Shift+Z", "Edit|Redo")),
-            0, self, 'webbrowser_edit_redo')
-        self.redoAct.setStatusTip(self.tr('Redo the last edit action'))
-        self.redoAct.setWhatsThis(self.tr(
-            """<b>Redo</b>"""
-            """<p>Redo the last edit action.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_redo",
+        )
+        self.redoAct.setStatusTip(self.tr("Redo the last edit action"))
+        self.redoAct.setWhatsThis(
+            self.tr("""<b>Redo</b>""" """<p>Redo the last edit action.</p>""")
+        )
         self.redoAct.triggered.connect(self.__redo)
         self.__actions.append(self.redoAct)
-        
+
         self.selectAllAct = EricAction(
-            self.tr('Select All'),
+            self.tr("Select All"),
             UI.PixmapCache.getIcon("editSelectAll"),
-            self.tr('&Select All'),
+            self.tr("&Select All"),
             QKeySequence(self.tr("Ctrl+A", "Edit|Select All")),
-            0, self, 'webbrowser_edit_select_all')
-        self.selectAllAct.setStatusTip(self.tr('Select all text'))
-        self.selectAllAct.setWhatsThis(self.tr(
-            """<b>Select All</b>"""
-            """<p>Select all text of the current browser.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_select_all",
+        )
+        self.selectAllAct.setStatusTip(self.tr("Select all text"))
+        self.selectAllAct.setWhatsThis(
+            self.tr(
+                """<b>Select All</b>"""
+                """<p>Select all text of the current browser.</p>"""
+            )
+        )
         self.selectAllAct.triggered.connect(self.__selectAll)
         self.__actions.append(self.selectAllAct)
-        
+
         self.unselectAct = EricAction(
-            self.tr('Unselect'),
-            self.tr('Unselect'),
+            self.tr("Unselect"),
+            self.tr("Unselect"),
             QKeySequence(self.tr("Alt+Ctrl+A", "Edit|Unselect")),
-            0, self, 'webbrowser_edit_unselect')
-        self.unselectAct.setStatusTip(self.tr('Clear current selection'))
-        self.unselectAct.setWhatsThis(self.tr(
-            """<b>Unselect</b>"""
-            """<p>Clear the selection of the current browser.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_unselect",
+        )
+        self.unselectAct.setStatusTip(self.tr("Clear current selection"))
+        self.unselectAct.setWhatsThis(
+            self.tr(
+                """<b>Unselect</b>"""
+                """<p>Clear the selection of the current browser.</p>"""
+            )
+        )
         self.unselectAct.triggered.connect(self.__unselect)
         self.__actions.append(self.unselectAct)
-        
+
         self.findAct = EricAction(
-            self.tr('Find...'),
+            self.tr("Find..."),
             UI.PixmapCache.getIcon("find"),
-            self.tr('&Find...'),
+            self.tr("&Find..."),
             QKeySequence(self.tr("Ctrl+F", "Edit|Find")),
-            0, self, 'webbrowser_edit_find')
-        self.findAct.setStatusTip(self.tr('Find text in page'))
-        self.findAct.setWhatsThis(self.tr(
-            """<b>Find</b>"""
-            """<p>Find text in the current page.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_find",
+        )
+        self.findAct.setStatusTip(self.tr("Find text in page"))
+        self.findAct.setWhatsThis(
+            self.tr("""<b>Find</b>""" """<p>Find text in the current page.</p>""")
+        )
         self.findAct.triggered.connect(self.__find)
         self.__actions.append(self.findAct)
-        
+
         self.findNextAct = EricAction(
-            self.tr('Find next'),
+            self.tr("Find next"),
             UI.PixmapCache.getIcon("findNext"),
-            self.tr('Find &next'),
+            self.tr("Find &next"),
             QKeySequence(self.tr("F3", "Edit|Find next")),
-            0, self, 'webbrowser_edit_find_next')
-        self.findNextAct.setStatusTip(self.tr(
-            'Find next occurrence of text in page'))
-        self.findNextAct.setWhatsThis(self.tr(
-            """<b>Find next</b>"""
-            """<p>Find the next occurrence of text in the current page.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_edit_find_next",
+        )
+        self.findNextAct.setStatusTip(self.tr("Find next occurrence of text in page"))
+        self.findNextAct.setWhatsThis(
+            self.tr(
+                """<b>Find next</b>"""
+                """<p>Find the next occurrence of text in the current page.</p>"""
+            )
+        )
         self.findNextAct.triggered.connect(self.__searchWidget.findNext)
         self.__actions.append(self.findNextAct)
-        
+
         self.findPrevAct = EricAction(
-            self.tr('Find previous'),
+            self.tr("Find previous"),
             UI.PixmapCache.getIcon("findPrev"),
-            self.tr('Find &previous'),
+            self.tr("Find &previous"),
             QKeySequence(self.tr("Shift+F3", "Edit|Find previous")),
-            0, self, 'webbrowser_edit_find_previous')
+            0,
+            self,
+            "webbrowser_edit_find_previous",
+        )
         self.findPrevAct.setStatusTip(
-            self.tr('Find previous occurrence of text in page'))
-        self.findPrevAct.setWhatsThis(self.tr(
-            """<b>Find previous</b>"""
-            """<p>Find the previous occurrence of text in the current"""
-            """ page.</p>"""
-        ))
-        self.findPrevAct.triggered.connect(
-            self.__searchWidget.findPrevious)
+            self.tr("Find previous occurrence of text in page")
+        )
+        self.findPrevAct.setWhatsThis(
+            self.tr(
+                """<b>Find previous</b>"""
+                """<p>Find the previous occurrence of text in the current"""
+                """ page.</p>"""
+            )
+        )
+        self.findPrevAct.triggered.connect(self.__searchWidget.findPrevious)
         self.__actions.append(self.findPrevAct)
-        
+
         self.bookmarksManageAct = EricAction(
-            self.tr('Manage Bookmarks'),
-            self.tr('&Manage Bookmarks...'),
+            self.tr("Manage Bookmarks"),
+            self.tr("&Manage Bookmarks..."),
             QKeySequence(self.tr("Ctrl+Shift+B", "Help|Manage bookmarks")),
-            0, self, 'webbrowser_bookmarks_manage')
-        self.bookmarksManageAct.setStatusTip(self.tr(
-            'Open a dialog to manage the bookmarks.'))
-        self.bookmarksManageAct.setWhatsThis(self.tr(
-            """<b>Manage Bookmarks...</b>"""
-            """<p>Open a dialog to manage the bookmarks.</p>"""
-        ))
-        self.bookmarksManageAct.triggered.connect(
-            self.__showBookmarksDialog)
+            0,
+            self,
+            "webbrowser_bookmarks_manage",
+        )
+        self.bookmarksManageAct.setStatusTip(
+            self.tr("Open a dialog to manage the bookmarks.")
+        )
+        self.bookmarksManageAct.setWhatsThis(
+            self.tr(
+                """<b>Manage Bookmarks...</b>"""
+                """<p>Open a dialog to manage the bookmarks.</p>"""
+            )
+        )
+        self.bookmarksManageAct.triggered.connect(self.__showBookmarksDialog)
         self.__actions.append(self.bookmarksManageAct)
-        
+
         self.bookmarksAddAct = EricAction(
-            self.tr('Add Bookmark'),
+            self.tr("Add Bookmark"),
             UI.PixmapCache.getIcon("addBookmark"),
-            self.tr('Add &Bookmark...'),
+            self.tr("Add &Bookmark..."),
             QKeySequence(self.tr("Ctrl+D", "Help|Add bookmark")),
-            0, self, 'webbrowser_bookmark_add')
+            0,
+            self,
+            "webbrowser_bookmark_add",
+        )
         self.bookmarksAddAct.setIconVisibleInMenu(False)
-        self.bookmarksAddAct.setStatusTip(self.tr(
-            'Open a dialog to add a bookmark.'))
-        self.bookmarksAddAct.setWhatsThis(self.tr(
-            """<b>Add Bookmark</b>"""
-            """<p>Open a dialog to add the current URL as a bookmark.</p>"""
-        ))
+        self.bookmarksAddAct.setStatusTip(self.tr("Open a dialog to add a bookmark."))
+        self.bookmarksAddAct.setWhatsThis(
+            self.tr(
+                """<b>Add Bookmark</b>"""
+                """<p>Open a dialog to add the current URL as a bookmark.</p>"""
+            )
+        )
         self.bookmarksAddAct.triggered.connect(self.__addBookmark)
         self.__actions.append(self.bookmarksAddAct)
-        
+
         self.bookmarksAddFolderAct = EricAction(
-            self.tr('Add Folder'),
-            self.tr('Add &Folder...'),
-            0, 0, self, 'webbrowser_bookmark_show_all')
-        self.bookmarksAddFolderAct.setStatusTip(self.tr(
-            'Open a dialog to add a new bookmarks folder.'))
-        self.bookmarksAddFolderAct.setWhatsThis(self.tr(
-            """<b>Add Folder...</b>"""
-            """<p>Open a dialog to add a new bookmarks folder.</p>"""
-        ))
-        self.bookmarksAddFolderAct.triggered.connect(
-            self.__addBookmarkFolder)
+            self.tr("Add Folder"),
+            self.tr("Add &Folder..."),
+            0,
+            0,
+            self,
+            "webbrowser_bookmark_show_all",
+        )
+        self.bookmarksAddFolderAct.setStatusTip(
+            self.tr("Open a dialog to add a new bookmarks folder.")
+        )
+        self.bookmarksAddFolderAct.setWhatsThis(
+            self.tr(
+                """<b>Add Folder...</b>"""
+                """<p>Open a dialog to add a new bookmarks folder.</p>"""
+            )
+        )
+        self.bookmarksAddFolderAct.triggered.connect(self.__addBookmarkFolder)
         self.__actions.append(self.bookmarksAddFolderAct)
-        
+
         self.bookmarksAllTabsAct = EricAction(
-            self.tr('Bookmark All Tabs'),
-            self.tr('Bookmark All Tabs...'),
-            0, 0, self, 'webbrowser_bookmark_all_tabs')
-        self.bookmarksAllTabsAct.setStatusTip(self.tr(
-            'Bookmark all open tabs.'))
-        self.bookmarksAllTabsAct.setWhatsThis(self.tr(
-            """<b>Bookmark All Tabs...</b>"""
-            """<p>Open a dialog to add a new bookmarks folder for"""
-            """ all open tabs.</p>"""
-        ))
+            self.tr("Bookmark All Tabs"),
+            self.tr("Bookmark All Tabs..."),
+            0,
+            0,
+            self,
+            "webbrowser_bookmark_all_tabs",
+        )
+        self.bookmarksAllTabsAct.setStatusTip(self.tr("Bookmark all open tabs."))
+        self.bookmarksAllTabsAct.setWhatsThis(
+            self.tr(
+                """<b>Bookmark All Tabs...</b>"""
+                """<p>Open a dialog to add a new bookmarks folder for"""
+                """ all open tabs.</p>"""
+            )
+        )
         self.bookmarksAllTabsAct.triggered.connect(self.bookmarkAll)
         self.__actions.append(self.bookmarksAllTabsAct)
-        
+
         self.whatsThisAct = EricAction(
-            self.tr('What\'s This?'),
+            self.tr("What's This?"),
             UI.PixmapCache.getIcon("whatsThis"),
-            self.tr('&What\'s This?'),
+            self.tr("&What's This?"),
             QKeySequence(self.tr("Shift+F1", "Help|What's This?'")),
-            0, self, 'webbrowser_help_whats_this')
-        self.whatsThisAct.setStatusTip(self.tr('Context sensitive help'))
-        self.whatsThisAct.setWhatsThis(self.tr(
-            """<b>Display context sensitive help</b>"""
-            """<p>In What's This? mode, the mouse cursor shows an arrow"""
-            """ with a question mark, and you can click on the interface"""
-            """ elements to get a short description of what they do and how"""
-            """ to use them. In dialogs, this feature can be accessed using"""
-            """ the context help button in the titlebar.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_help_whats_this",
+        )
+        self.whatsThisAct.setStatusTip(self.tr("Context sensitive help"))
+        self.whatsThisAct.setWhatsThis(
+            self.tr(
+                """<b>Display context sensitive help</b>"""
+                """<p>In What's This? mode, the mouse cursor shows an arrow"""
+                """ with a question mark, and you can click on the interface"""
+                """ elements to get a short description of what they do and how"""
+                """ to use them. In dialogs, this feature can be accessed using"""
+                """ the context help button in the titlebar.</p>"""
+            )
+        )
         self.whatsThisAct.triggered.connect(self.__whatsThis)
         self.__actions.append(self.whatsThisAct)
-        
+
         self.aboutAct = EricAction(
-            self.tr('About'),
-            self.tr('&About'),
-            0, 0, self, 'webbrowser_help_about')
-        self.aboutAct.setStatusTip(self.tr(
-            'Display information about this software'))
-        self.aboutAct.setWhatsThis(self.tr(
-            """<b>About</b>"""
-            """<p>Display some information about this software.</p>"""
-        ))
+            self.tr("About"), self.tr("&About"), 0, 0, self, "webbrowser_help_about"
+        )
+        self.aboutAct.setStatusTip(self.tr("Display information about this software"))
+        self.aboutAct.setWhatsThis(
+            self.tr(
+                """<b>About</b>"""
+                """<p>Display some information about this software.</p>"""
+            )
+        )
         self.aboutAct.triggered.connect(self.__about)
         self.__actions.append(self.aboutAct)
-        
+
         self.aboutQtAct = EricAction(
-            self.tr('About Qt'),
-            self.tr('About &Qt'),
-            0, 0, self, 'webbrowser_help_about_qt')
+            self.tr("About Qt"),
+            self.tr("About &Qt"),
+            0,
+            0,
+            self,
+            "webbrowser_help_about_qt",
+        )
         self.aboutQtAct.setStatusTip(
-            self.tr('Display information about the Qt toolkit'))
-        self.aboutQtAct.setWhatsThis(self.tr(
-            """<b>About Qt</b>"""
-            """<p>Display some information about the Qt toolkit.</p>"""
-        ))
+            self.tr("Display information about the Qt toolkit")
+        )
+        self.aboutQtAct.setWhatsThis(
+            self.tr(
+                """<b>About Qt</b>"""
+                """<p>Display some information about the Qt toolkit.</p>"""
+            )
+        )
         self.aboutQtAct.triggered.connect(self.__aboutQt)
         self.__actions.append(self.aboutQtAct)
-        
+
         self.zoomInAct = EricAction(
-            self.tr('Zoom in'),
+            self.tr("Zoom in"),
             UI.PixmapCache.getIcon("zoomIn"),
-            self.tr('Zoom &in'),
+            self.tr("Zoom &in"),
             QKeySequence(self.tr("Ctrl++", "View|Zoom in")),
             QKeySequence(self.tr("Zoom In", "View|Zoom in")),
-            self, 'webbrowser_view_zoom_in')
-        self.zoomInAct.setStatusTip(self.tr('Zoom in on the web page'))
-        self.zoomInAct.setWhatsThis(self.tr(
-            """<b>Zoom in</b>"""
-            """<p>Zoom in on the web page."""
-            """ This makes the web page bigger.</p>"""
-        ))
+            self,
+            "webbrowser_view_zoom_in",
+        )
+        self.zoomInAct.setStatusTip(self.tr("Zoom in on the web page"))
+        self.zoomInAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the web page."""
+                """ This makes the web page bigger.</p>"""
+            )
+        )
         self.zoomInAct.triggered.connect(self.__zoomIn)
         self.__actions.append(self.zoomInAct)
-        
+
         self.zoomOutAct = EricAction(
-            self.tr('Zoom out'),
+            self.tr("Zoom out"),
             UI.PixmapCache.getIcon("zoomOut"),
-            self.tr('Zoom &out'),
+            self.tr("Zoom &out"),
             QKeySequence(self.tr("Ctrl+-", "View|Zoom out")),
             QKeySequence(self.tr("Zoom Out", "View|Zoom out")),
-            self, 'webbrowser_view_zoom_out')
-        self.zoomOutAct.setStatusTip(self.tr('Zoom out on the web page'))
-        self.zoomOutAct.setWhatsThis(self.tr(
-            """<b>Zoom out</b>"""
-            """<p>Zoom out on the web page."""
-            """ This makes the web page smaller.</p>"""
-        ))
+            self,
+            "webbrowser_view_zoom_out",
+        )
+        self.zoomOutAct.setStatusTip(self.tr("Zoom out on the web page"))
+        self.zoomOutAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the web page."""
+                """ This makes the web page smaller.</p>"""
+            )
+        )
         self.zoomOutAct.triggered.connect(self.__zoomOut)
         self.__actions.append(self.zoomOutAct)
-        
+
         self.zoomResetAct = EricAction(
-            self.tr('Zoom reset'),
+            self.tr("Zoom reset"),
             UI.PixmapCache.getIcon("zoomReset"),
-            self.tr('Zoom &reset'),
+            self.tr("Zoom &reset"),
             QKeySequence(self.tr("Ctrl+0", "View|Zoom reset")),
-            0, self, 'webbrowser_view_zoom_reset')
-        self.zoomResetAct.setStatusTip(self.tr(
-            'Reset the zoom of the web page'))
-        self.zoomResetAct.setWhatsThis(self.tr(
-            """<b>Zoom reset</b>"""
-            """<p>Reset the zoom of the web page. """
-            """This sets the zoom factor to 100%.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_view_zoom_reset",
+        )
+        self.zoomResetAct.setStatusTip(self.tr("Reset the zoom of the web page"))
+        self.zoomResetAct.setWhatsThis(
+            self.tr(
+                """<b>Zoom reset</b>"""
+                """<p>Reset the zoom of the web page. """
+                """This sets the zoom factor to 100%.</p>"""
+            )
+        )
         self.zoomResetAct.triggered.connect(self.__zoomReset)
         self.__actions.append(self.zoomResetAct)
-        
+
         self.pageSourceAct = EricAction(
-            self.tr('Show page source'),
-            self.tr('Show page source'),
-            QKeySequence(self.tr('Ctrl+U')), 0,
-            self, 'webbrowser_show_page_source')
-        self.pageSourceAct.setStatusTip(self.tr(
-            'Show the page source in an editor'))
-        self.pageSourceAct.setWhatsThis(self.tr(
-            """<b>Show page source</b>"""
-            """<p>Show the page source in an editor.</p>"""
-        ))
+            self.tr("Show page source"),
+            self.tr("Show page source"),
+            QKeySequence(self.tr("Ctrl+U")),
+            0,
+            self,
+            "webbrowser_show_page_source",
+        )
+        self.pageSourceAct.setStatusTip(self.tr("Show the page source in an editor"))
+        self.pageSourceAct.setWhatsThis(
+            self.tr(
+                """<b>Show page source</b>"""
+                """<p>Show the page source in an editor.</p>"""
+            )
+        )
         self.pageSourceAct.triggered.connect(self.__showPageSource)
         self.__actions.append(self.pageSourceAct)
         self.addAction(self.pageSourceAct)
-        
+
         self.fullScreenAct = EricAction(
-            self.tr('Full Screen'),
+            self.tr("Full Screen"),
             UI.PixmapCache.getIcon("windowFullscreen"),
-            self.tr('&Full Screen'),
-            0, 0,
-            self, 'webbrowser_view_full_screen')
+            self.tr("&Full Screen"),
+            0,
+            0,
+            self,
+            "webbrowser_view_full_screen",
+        )
         if Globals.isMacPlatform():
-            self.fullScreenAct.setShortcut(
-                QKeySequence(self.tr("Meta+Ctrl+F")))
+            self.fullScreenAct.setShortcut(QKeySequence(self.tr("Meta+Ctrl+F")))
         else:
-            self.fullScreenAct.setShortcut(QKeySequence(self.tr('F11')))
+            self.fullScreenAct.setShortcut(QKeySequence(self.tr("F11")))
         self.fullScreenAct.triggered.connect(self.toggleFullScreen)
         self.__actions.append(self.fullScreenAct)
         self.addAction(self.fullScreenAct)
-        
+
         self.nextTabAct = EricAction(
-            self.tr('Show next tab'),
-            self.tr('Show next tab'),
-            QKeySequence(self.tr('Ctrl+Alt+Tab')), 0,
-            self, 'webbrowser_view_next_tab')
+            self.tr("Show next tab"),
+            self.tr("Show next tab"),
+            QKeySequence(self.tr("Ctrl+Alt+Tab")),
+            0,
+            self,
+            "webbrowser_view_next_tab",
+        )
         self.nextTabAct.triggered.connect(self.__nextTab)
         self.__actions.append(self.nextTabAct)
         self.addAction(self.nextTabAct)
-        
+
         self.prevTabAct = EricAction(
-            self.tr('Show previous tab'),
-            self.tr('Show previous tab'),
-            QKeySequence(self.tr('Shift+Ctrl+Alt+Tab')), 0,
-            self, 'webbrowser_view_previous_tab')
+            self.tr("Show previous tab"),
+            self.tr("Show previous tab"),
+            QKeySequence(self.tr("Shift+Ctrl+Alt+Tab")),
+            0,
+            self,
+            "webbrowser_view_previous_tab",
+        )
         self.prevTabAct.triggered.connect(self.__prevTab)
         self.__actions.append(self.prevTabAct)
         self.addAction(self.prevTabAct)
-        
+
         self.switchTabAct = EricAction(
-            self.tr('Switch between tabs'),
-            self.tr('Switch between tabs'),
-            QKeySequence(self.tr('Ctrl+1')), 0,
-            self, 'webbrowser_switch_tabs')
+            self.tr("Switch between tabs"),
+            self.tr("Switch between tabs"),
+            QKeySequence(self.tr("Ctrl+1")),
+            0,
+            self,
+            "webbrowser_switch_tabs",
+        )
         self.switchTabAct.triggered.connect(self.__switchTab)
         self.__actions.append(self.switchTabAct)
         self.addAction(self.switchTabAct)
-        
+
         self.prefAct = EricAction(
-            self.tr('Preferences'),
+            self.tr("Preferences"),
             UI.PixmapCache.getIcon("configure"),
-            self.tr('&Preferences...'), 0, 0, self, 'webbrowser_preferences')
-        self.prefAct.setStatusTip(self.tr(
-            'Set the prefered configuration'))
-        self.prefAct.setWhatsThis(self.tr(
-            """<b>Preferences</b>"""
-            """<p>Set the configuration items of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("&Preferences..."),
+            0,
+            0,
+            self,
+            "webbrowser_preferences",
+        )
+        self.prefAct.setStatusTip(self.tr("Set the prefered configuration"))
+        self.prefAct.setWhatsThis(
+            self.tr(
+                """<b>Preferences</b>"""
+                """<p>Set the configuration items of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.prefAct.triggered.connect(self.__showPreferences)
         self.__actions.append(self.prefAct)
-        
+
         self.acceptedLanguagesAct = EricAction(
-            self.tr('Languages'),
+            self.tr("Languages"),
             UI.PixmapCache.getIcon("flag"),
-            self.tr('&Languages...'), 0, 0,
-            self, 'webbrowser_accepted_languages')
-        self.acceptedLanguagesAct.setStatusTip(self.tr(
-            'Configure the accepted languages for web pages'))
-        self.acceptedLanguagesAct.setWhatsThis(self.tr(
-            """<b>Languages</b>"""
-            """<p>Configure the accepted languages for web pages.</p>"""
-        ))
-        self.acceptedLanguagesAct.triggered.connect(
-            self.__showAcceptedLanguages)
+            self.tr("&Languages..."),
+            0,
+            0,
+            self,
+            "webbrowser_accepted_languages",
+        )
+        self.acceptedLanguagesAct.setStatusTip(
+            self.tr("Configure the accepted languages for web pages")
+        )
+        self.acceptedLanguagesAct.setWhatsThis(
+            self.tr(
+                """<b>Languages</b>"""
+                """<p>Configure the accepted languages for web pages.</p>"""
+            )
+        )
+        self.acceptedLanguagesAct.triggered.connect(self.__showAcceptedLanguages)
         self.__actions.append(self.acceptedLanguagesAct)
-        
+
         self.cookiesAct = EricAction(
-            self.tr('Cookies'),
+            self.tr("Cookies"),
             UI.PixmapCache.getIcon("cookie"),
-            self.tr('C&ookies...'), 0, 0, self, 'webbrowser_cookies')
-        self.cookiesAct.setStatusTip(self.tr(
-            'Configure cookies handling'))
-        self.cookiesAct.setWhatsThis(self.tr(
-            """<b>Cookies</b>"""
-            """<p>Configure cookies handling.</p>"""
-        ))
-        self.cookiesAct.triggered.connect(
-            self.__showCookiesConfiguration)
+            self.tr("C&ookies..."),
+            0,
+            0,
+            self,
+            "webbrowser_cookies",
+        )
+        self.cookiesAct.setStatusTip(self.tr("Configure cookies handling"))
+        self.cookiesAct.setWhatsThis(
+            self.tr("""<b>Cookies</b>""" """<p>Configure cookies handling.</p>""")
+        )
+        self.cookiesAct.triggered.connect(self.__showCookiesConfiguration)
         self.__actions.append(self.cookiesAct)
-        
+
         self.personalDataAct = EricAction(
-            self.tr('Personal Information'),
+            self.tr("Personal Information"),
             UI.PixmapCache.getIcon("pim"),
-            self.tr('Personal Information...'),
-            0, 0,
-            self, 'webbrowser_personal_information')
-        self.personalDataAct.setStatusTip(self.tr(
-            'Configure personal information for completing form fields'))
-        self.personalDataAct.setWhatsThis(self.tr(
-            """<b>Personal Information...</b>"""
-            """<p>Opens a dialog to configure the personal information"""
-            """ used for completing form fields.</p>"""
-        ))
-        self.personalDataAct.triggered.connect(
-            self.__showPersonalInformationDialog)
+            self.tr("Personal Information..."),
+            0,
+            0,
+            self,
+            "webbrowser_personal_information",
+        )
+        self.personalDataAct.setStatusTip(
+            self.tr("Configure personal information for completing form fields")
+        )
+        self.personalDataAct.setWhatsThis(
+            self.tr(
+                """<b>Personal Information...</b>"""
+                """<p>Opens a dialog to configure the personal information"""
+                """ used for completing form fields.</p>"""
+            )
+        )
+        self.personalDataAct.triggered.connect(self.__showPersonalInformationDialog)
         self.__actions.append(self.personalDataAct)
-        
+
         self.greaseMonkeyAct = EricAction(
-            self.tr('GreaseMonkey Scripts'),
+            self.tr("GreaseMonkey Scripts"),
             UI.PixmapCache.getIcon("greaseMonkey"),
-            self.tr('GreaseMonkey Scripts...'),
-            0, 0,
-            self, 'webbrowser_greasemonkey')
-        self.greaseMonkeyAct.setStatusTip(self.tr(
-            'Configure the GreaseMonkey Scripts'))
-        self.greaseMonkeyAct.setWhatsThis(self.tr(
-            """<b>GreaseMonkey Scripts...</b>"""
-            """<p>Opens a dialog to configure the available GreaseMonkey"""
-            """ Scripts.</p>"""
-        ))
-        self.greaseMonkeyAct.triggered.connect(
-            self.__showGreaseMonkeyConfigDialog)
+            self.tr("GreaseMonkey Scripts..."),
+            0,
+            0,
+            self,
+            "webbrowser_greasemonkey",
+        )
+        self.greaseMonkeyAct.setStatusTip(self.tr("Configure the GreaseMonkey Scripts"))
+        self.greaseMonkeyAct.setWhatsThis(
+            self.tr(
+                """<b>GreaseMonkey Scripts...</b>"""
+                """<p>Opens a dialog to configure the available GreaseMonkey"""
+                """ Scripts.</p>"""
+            )
+        )
+        self.greaseMonkeyAct.triggered.connect(self.__showGreaseMonkeyConfigDialog)
         self.__actions.append(self.greaseMonkeyAct)
-        
+
         self.editMessageFilterAct = EricAction(
-            self.tr('Edit Message Filters'),
+            self.tr("Edit Message Filters"),
             UI.PixmapCache.getIcon("warning"),
-            self.tr('Edit Message Filters...'), 0, 0, self,
-            'webbrowser_manage_message_filters')
-        self.editMessageFilterAct.setStatusTip(self.tr(
-            'Edit the message filters used to suppress unwanted messages'))
-        self.editMessageFilterAct.setWhatsThis(self.tr(
-            """<b>Edit Message Filters</b>"""
-            """<p>Opens a dialog to edit the message filters used to"""
-            """ suppress unwanted messages been shown in an error"""
-            """ window.</p>"""
-        ))
-        self.editMessageFilterAct.triggered.connect(
-            EricErrorMessage.editMessageFilters)
+            self.tr("Edit Message Filters..."),
+            0,
+            0,
+            self,
+            "webbrowser_manage_message_filters",
+        )
+        self.editMessageFilterAct.setStatusTip(
+            self.tr("Edit the message filters used to suppress unwanted messages")
+        )
+        self.editMessageFilterAct.setWhatsThis(
+            self.tr(
+                """<b>Edit Message Filters</b>"""
+                """<p>Opens a dialog to edit the message filters used to"""
+                """ suppress unwanted messages been shown in an error"""
+                """ window.</p>"""
+            )
+        )
+        self.editMessageFilterAct.triggered.connect(EricErrorMessage.editMessageFilters)
         self.__actions.append(self.editMessageFilterAct)
-        
+
         self.featurePermissionAct = EricAction(
-            self.tr('Edit HTML5 Feature Permissions'),
+            self.tr("Edit HTML5 Feature Permissions"),
             UI.PixmapCache.getIcon("featurePermission"),
-            self.tr('Edit HTML5 Feature Permissions...'), 0, 0, self,
-            'webbrowser_edit_feature_permissions')
-        self.featurePermissionAct.setStatusTip(self.tr(
-            'Edit the remembered HTML5 feature permissions'))
-        self.featurePermissionAct.setWhatsThis(self.tr(
-            """<b>Edit HTML5 Feature Permissions</b>"""
-            """<p>Opens a dialog to edit the remembered HTML5"""
-            """ feature permissions.</p>"""
-        ))
-        self.featurePermissionAct.triggered.connect(
-            self.__showFeaturePermissionDialog)
+            self.tr("Edit HTML5 Feature Permissions..."),
+            0,
+            0,
+            self,
+            "webbrowser_edit_feature_permissions",
+        )
+        self.featurePermissionAct.setStatusTip(
+            self.tr("Edit the remembered HTML5 feature permissions")
+        )
+        self.featurePermissionAct.setWhatsThis(
+            self.tr(
+                """<b>Edit HTML5 Feature Permissions</b>"""
+                """<p>Opens a dialog to edit the remembered HTML5"""
+                """ feature permissions.</p>"""
+            )
+        )
+        self.featurePermissionAct.triggered.connect(self.__showFeaturePermissionDialog)
         self.__actions.append(self.featurePermissionAct)
-        
+
         if WebBrowserWindow._useQtHelp:
             self.syncTocAct = EricAction(
-                self.tr('Sync with Table of Contents'),
+                self.tr("Sync with Table of Contents"),
                 UI.PixmapCache.getIcon("syncToc"),
-                self.tr('Sync with Table of Contents'),
-                0, 0, self, 'webbrowser_sync_toc')
-            self.syncTocAct.setStatusTip(self.tr(
-                'Synchronizes the table of contents with current page'))
-            self.syncTocAct.setWhatsThis(self.tr(
-                """<b>Sync with Table of Contents</b>"""
-                """<p>Synchronizes the table of contents with current"""
-                """ page.</p>"""
-            ))
+                self.tr("Sync with Table of Contents"),
+                0,
+                0,
+                self,
+                "webbrowser_sync_toc",
+            )
+            self.syncTocAct.setStatusTip(
+                self.tr("Synchronizes the table of contents with current page")
+            )
+            self.syncTocAct.setWhatsThis(
+                self.tr(
+                    """<b>Sync with Table of Contents</b>"""
+                    """<p>Synchronizes the table of contents with current"""
+                    """ page.</p>"""
+                )
+            )
             self.syncTocAct.triggered.connect(self.__syncTOC)
             self.__actions.append(self.syncTocAct)
-            
+
             self.showTocAct = EricAction(
-                self.tr('Table of Contents'),
-                self.tr('Table of Contents'),
-                0, 0, self, 'webbrowser_show_toc')
-            self.showTocAct.setStatusTip(self.tr(
-                'Shows the table of contents window'))
-            self.showTocAct.setWhatsThis(self.tr(
-                """<b>Table of Contents</b>"""
-                """<p>Shows the table of contents window.</p>"""
-            ))
+                self.tr("Table of Contents"),
+                self.tr("Table of Contents"),
+                0,
+                0,
+                self,
+                "webbrowser_show_toc",
+            )
+            self.showTocAct.setStatusTip(self.tr("Shows the table of contents window"))
+            self.showTocAct.setWhatsThis(
+                self.tr(
+                    """<b>Table of Contents</b>"""
+                    """<p>Shows the table of contents window.</p>"""
+                )
+            )
             self.showTocAct.triggered.connect(self.__showTocWindow)
             self.__actions.append(self.showTocAct)
-            
+
             self.showIndexAct = EricAction(
-                self.tr('Index'),
-                self.tr('Index'),
-                0, 0, self, 'webbrowser_show_index')
-            self.showIndexAct.setStatusTip(self.tr(
-                'Shows the index window'))
-            self.showIndexAct.setWhatsThis(self.tr(
-                """<b>Index</b>"""
-                """<p>Shows the index window.</p>"""
-            ))
+                self.tr("Index"), self.tr("Index"), 0, 0, self, "webbrowser_show_index"
+            )
+            self.showIndexAct.setStatusTip(self.tr("Shows the index window"))
+            self.showIndexAct.setWhatsThis(
+                self.tr("""<b>Index</b>""" """<p>Shows the index window.</p>""")
+            )
             self.showIndexAct.triggered.connect(self.__showIndexWindow)
             self.__actions.append(self.showIndexAct)
-            
+
             self.showSearchAct = EricAction(
-                self.tr('Search'),
-                self.tr('Search'),
-                0, 0, self, 'webbrowser_show_search')
-            self.showSearchAct.setStatusTip(self.tr(
-                'Shows the search window'))
-            self.showSearchAct.setWhatsThis(self.tr(
-                """<b>Search</b>"""
-                """<p>Shows the search window.</p>"""
-            ))
-            self.showSearchAct.triggered.connect(
-                self.__showSearchWindow)
+                self.tr("Search"),
+                self.tr("Search"),
+                0,
+                0,
+                self,
+                "webbrowser_show_search",
+            )
+            self.showSearchAct.setStatusTip(self.tr("Shows the search window"))
+            self.showSearchAct.setWhatsThis(
+                self.tr("""<b>Search</b>""" """<p>Shows the search window.</p>""")
+            )
+            self.showSearchAct.triggered.connect(self.__showSearchWindow)
             self.__actions.append(self.showSearchAct)
-            
+
             self.manageQtHelpDocsAct = EricAction(
-                self.tr('Manage QtHelp Documents'),
-                self.tr('Manage QtHelp &Documents'),
-                0, 0, self, 'webbrowser_qthelp_documents')
-            self.manageQtHelpDocsAct.setStatusTip(self.tr(
-                'Shows a dialog to manage the QtHelp documentation set'))
-            self.manageQtHelpDocsAct.setWhatsThis(self.tr(
-                """<b>Manage QtHelp Documents</b>"""
-                """<p>Shows a dialog to manage the QtHelp documentation"""
-                """ set.</p>"""
-            ))
-            self.manageQtHelpDocsAct.triggered.connect(
-                self.__manageQtHelpDocumentation)
+                self.tr("Manage QtHelp Documents"),
+                self.tr("Manage QtHelp &Documents"),
+                0,
+                0,
+                self,
+                "webbrowser_qthelp_documents",
+            )
+            self.manageQtHelpDocsAct.setStatusTip(
+                self.tr("Shows a dialog to manage the QtHelp documentation set")
+            )
+            self.manageQtHelpDocsAct.setWhatsThis(
+                self.tr(
+                    """<b>Manage QtHelp Documents</b>"""
+                    """<p>Shows a dialog to manage the QtHelp documentation"""
+                    """ set.</p>"""
+                )
+            )
+            self.manageQtHelpDocsAct.triggered.connect(self.__manageQtHelpDocumentation)
             self.__actions.append(self.manageQtHelpDocsAct)
-            
+
             self.reindexDocumentationAct = EricAction(
-                self.tr('Reindex Documentation'),
-                self.tr('&Reindex Documentation'),
-                0, 0, self, 'webbrowser_qthelp_reindex')
-            self.reindexDocumentationAct.setStatusTip(self.tr(
-                'Reindexes the documentation set'))
-            self.reindexDocumentationAct.setWhatsThis(self.tr(
-                """<b>Reindex Documentation</b>"""
-                """<p>Reindexes the documentation set.</p>"""
-            ))
+                self.tr("Reindex Documentation"),
+                self.tr("&Reindex Documentation"),
+                0,
+                0,
+                self,
+                "webbrowser_qthelp_reindex",
+            )
+            self.reindexDocumentationAct.setStatusTip(
+                self.tr("Reindexes the documentation set")
+            )
+            self.reindexDocumentationAct.setWhatsThis(
+                self.tr(
+                    """<b>Reindex Documentation</b>"""
+                    """<p>Reindexes the documentation set.</p>"""
+                )
+            )
             self.reindexDocumentationAct.triggered.connect(
-                self.__searchEngine.reindexDocumentation)
+                self.__searchEngine.reindexDocumentation
+            )
             self.__actions.append(self.reindexDocumentationAct)
-        
+
         self.clearPrivateDataAct = EricAction(
-            self.tr('Clear private data'),
+            self.tr("Clear private data"),
             UI.PixmapCache.getIcon("clearPrivateData"),
-            self.tr('Clear private data'),
-            0, 0,
-            self, 'webbrowser_clear_private_data')
-        self.clearPrivateDataAct.setStatusTip(self.tr(
-            'Clear private data'))
-        self.clearPrivateDataAct.setWhatsThis(self.tr(
-            """<b>Clear private data</b>"""
-            """<p>Clears the private data like browsing history, search"""
-            """ history or the favicons database.</p>"""
-        ))
-        self.clearPrivateDataAct.triggered.connect(
-            self.__clearPrivateData)
+            self.tr("Clear private data"),
+            0,
+            0,
+            self,
+            "webbrowser_clear_private_data",
+        )
+        self.clearPrivateDataAct.setStatusTip(self.tr("Clear private data"))
+        self.clearPrivateDataAct.setWhatsThis(
+            self.tr(
+                """<b>Clear private data</b>"""
+                """<p>Clears the private data like browsing history, search"""
+                """ history or the favicons database.</p>"""
+            )
+        )
+        self.clearPrivateDataAct.triggered.connect(self.__clearPrivateData)
         self.__actions.append(self.clearPrivateDataAct)
-        
+
         self.clearIconsAct = EricAction(
-            self.tr('Clear icons database'),
-            self.tr('Clear &icons database'),
-            0, 0,
-            self, 'webbrowser_clear_icons_db')
-        self.clearIconsAct.setStatusTip(self.tr(
-            'Clear the database of favicons'))
-        self.clearIconsAct.setWhatsThis(self.tr(
-            """<b>Clear icons database</b>"""
-            """<p>Clears the database of favicons of previously visited"""
-            """ URLs.</p>"""
-        ))
+            self.tr("Clear icons database"),
+            self.tr("Clear &icons database"),
+            0,
+            0,
+            self,
+            "webbrowser_clear_icons_db",
+        )
+        self.clearIconsAct.setStatusTip(self.tr("Clear the database of favicons"))
+        self.clearIconsAct.setWhatsThis(
+            self.tr(
+                """<b>Clear icons database</b>"""
+                """<p>Clears the database of favicons of previously visited"""
+                """ URLs.</p>"""
+            )
+        )
         self.clearIconsAct.triggered.connect(self.__clearIconsDatabase)
         self.__actions.append(self.clearIconsAct)
-        
+
         self.manageIconsAct = EricAction(
-            self.tr('Manage saved Favicons'),
+            self.tr("Manage saved Favicons"),
             UI.PixmapCache.getIcon("icons"),
-            self.tr('Manage saved Favicons'),
-            0, 0,
-            self, 'webbrowser_manage_icons_db')
-        self.manageIconsAct.setStatusTip(self.tr(
-            'Show a dialog to manage the saved favicons'))
-        self.manageIconsAct.setWhatsThis(self.tr(
-            """<b>Manage saved Favicons</b>"""
-            """<p>This shows a dialog to manage the saved favicons of"""
-            """ previously visited URLs.</p>"""
-        ))
+            self.tr("Manage saved Favicons"),
+            0,
+            0,
+            self,
+            "webbrowser_manage_icons_db",
+        )
+        self.manageIconsAct.setStatusTip(
+            self.tr("Show a dialog to manage the saved favicons")
+        )
+        self.manageIconsAct.setWhatsThis(
+            self.tr(
+                """<b>Manage saved Favicons</b>"""
+                """<p>This shows a dialog to manage the saved favicons of"""
+                """ previously visited URLs.</p>"""
+            )
+        )
         self.manageIconsAct.triggered.connect(self.__showWebIconsDialog)
         self.__actions.append(self.manageIconsAct)
-        
+
         self.searchEnginesAct = EricAction(
-            self.tr('Configure Search Engines'),
-            self.tr('Configure Search &Engines...'),
-            0, 0,
-            self, 'webbrowser_search_engines')
-        self.searchEnginesAct.setStatusTip(self.tr(
-            'Configure the available search engines'))
-        self.searchEnginesAct.setWhatsThis(self.tr(
-            """<b>Configure Search Engines...</b>"""
-            """<p>Opens a dialog to configure the available search"""
-            """ engines.</p>"""
-        ))
-        self.searchEnginesAct.triggered.connect(
-            self.__showEnginesConfigurationDialog)
+            self.tr("Configure Search Engines"),
+            self.tr("Configure Search &Engines..."),
+            0,
+            0,
+            self,
+            "webbrowser_search_engines",
+        )
+        self.searchEnginesAct.setStatusTip(
+            self.tr("Configure the available search engines")
+        )
+        self.searchEnginesAct.setWhatsThis(
+            self.tr(
+                """<b>Configure Search Engines...</b>"""
+                """<p>Opens a dialog to configure the available search"""
+                """ engines.</p>"""
+            )
+        )
+        self.searchEnginesAct.triggered.connect(self.__showEnginesConfigurationDialog)
         self.__actions.append(self.searchEnginesAct)
-        
+
         self.passwordsAct = EricAction(
-            self.tr('Manage Saved Passwords'),
+            self.tr("Manage Saved Passwords"),
             UI.PixmapCache.getIcon("passwords"),
-            self.tr('Manage Saved Passwords...'),
-            0, 0,
-            self, 'webbrowser_manage_passwords')
-        self.passwordsAct.setStatusTip(self.tr(
-            'Manage the saved passwords'))
-        self.passwordsAct.setWhatsThis(self.tr(
-            """<b>Manage Saved Passwords...</b>"""
-            """<p>Opens a dialog to manage the saved passwords.</p>"""
-        ))
+            self.tr("Manage Saved Passwords..."),
+            0,
+            0,
+            self,
+            "webbrowser_manage_passwords",
+        )
+        self.passwordsAct.setStatusTip(self.tr("Manage the saved passwords"))
+        self.passwordsAct.setWhatsThis(
+            self.tr(
+                """<b>Manage Saved Passwords...</b>"""
+                """<p>Opens a dialog to manage the saved passwords.</p>"""
+            )
+        )
         self.passwordsAct.triggered.connect(self.__showPasswordsDialog)
         self.__actions.append(self.passwordsAct)
-        
+
         self.adblockAct = EricAction(
-            self.tr('Ad Block'),
+            self.tr("Ad Block"),
             UI.PixmapCache.getIcon("adBlockPlus"),
-            self.tr('&Ad Block...'),
-            0, 0,
-            self, 'webbrowser_adblock')
-        self.adblockAct.setStatusTip(self.tr(
-            'Configure AdBlock subscriptions and rules'))
-        self.adblockAct.setWhatsThis(self.tr(
-            """<b>Ad Block...</b>"""
-            """<p>Opens a dialog to configure AdBlock subscriptions and"""
-            """ rules.</p>"""
-        ))
+            self.tr("&Ad Block..."),
+            0,
+            0,
+            self,
+            "webbrowser_adblock",
+        )
+        self.adblockAct.setStatusTip(
+            self.tr("Configure AdBlock subscriptions and rules")
+        )
+        self.adblockAct.setWhatsThis(
+            self.tr(
+                """<b>Ad Block...</b>"""
+                """<p>Opens a dialog to configure AdBlock subscriptions and"""
+                """ rules.</p>"""
+            )
+        )
         self.adblockAct.triggered.connect(self.__showAdBlockDialog)
         self.__actions.append(self.adblockAct)
-        
+
         self.certificateErrorsAct = EricAction(
-            self.tr('Manage SSL Certificate Errors'),
+            self.tr("Manage SSL Certificate Errors"),
             UI.PixmapCache.getIcon("certificates"),
-            self.tr('Manage SSL Certificate Errors...'),
-            0, 0,
-            self, 'webbrowser_manage_certificate_errors')
-        self.certificateErrorsAct.setStatusTip(self.tr(
-            'Manage the accepted SSL certificate Errors'))
-        self.certificateErrorsAct.setWhatsThis(self.tr(
-            """<b>Manage SSL Certificate Errors...</b>"""
-            """<p>Opens a dialog to manage the accepted SSL"""
-            """ certificate errors.</p>"""
-        ))
-        self.certificateErrorsAct.triggered.connect(
-            self.__showCertificateErrorsDialog)
+            self.tr("Manage SSL Certificate Errors..."),
+            0,
+            0,
+            self,
+            "webbrowser_manage_certificate_errors",
+        )
+        self.certificateErrorsAct.setStatusTip(
+            self.tr("Manage the accepted SSL certificate Errors")
+        )
+        self.certificateErrorsAct.setWhatsThis(
+            self.tr(
+                """<b>Manage SSL Certificate Errors...</b>"""
+                """<p>Opens a dialog to manage the accepted SSL"""
+                """ certificate errors.</p>"""
+            )
+        )
+        self.certificateErrorsAct.triggered.connect(self.__showCertificateErrorsDialog)
         self.__actions.append(self.certificateErrorsAct)
-        
+
         self.safeBrowsingAct = EricAction(
-            self.tr('Manage Safe Browsing'),
+            self.tr("Manage Safe Browsing"),
             UI.PixmapCache.getIcon("safeBrowsing"),
-            self.tr('Manage Safe Browsing...'), 0, 0, self,
-            'webbrowser_manage_safe_browsing')
-        self.safeBrowsingAct.setStatusTip(self.tr(
-            'Configure Safe Browsing and manage local cache'))
-        self.safeBrowsingAct.setWhatsThis(self.tr(
-            """<b>Manage Safe Browsing</b>"""
-            """<p>This opens a dialog to configure Safe Browsing and"""
-            """ to manage the local cache.</p>"""
-        ))
-        self.safeBrowsingAct.triggered.connect(
-            self.__showSafeBrowsingDialog)
+            self.tr("Manage Safe Browsing..."),
+            0,
+            0,
+            self,
+            "webbrowser_manage_safe_browsing",
+        )
+        self.safeBrowsingAct.setStatusTip(
+            self.tr("Configure Safe Browsing and manage local cache")
+        )
+        self.safeBrowsingAct.setWhatsThis(
+            self.tr(
+                """<b>Manage Safe Browsing</b>"""
+                """<p>This opens a dialog to configure Safe Browsing and"""
+                """ to manage the local cache.</p>"""
+            )
+        )
+        self.safeBrowsingAct.triggered.connect(self.__showSafeBrowsingDialog)
         self.__actions.append(self.safeBrowsingAct)
-        
+
         self.showDownloadManagerAct = EricAction(
-            self.tr('Downloads'),
-            self.tr('Downloads'),
-            0, 0, self, 'webbrowser_show_downloads')
-        self.showDownloadManagerAct.setStatusTip(self.tr(
-            'Shows the downloads window'))
-        self.showDownloadManagerAct.setWhatsThis(self.tr(
-            """<b>Downloads</b>"""
-            """<p>Shows the downloads window.</p>"""
-        ))
-        self.showDownloadManagerAct.triggered.connect(
-            self.__showDownloadsWindow)
+            self.tr("Downloads"),
+            self.tr("Downloads"),
+            0,
+            0,
+            self,
+            "webbrowser_show_downloads",
+        )
+        self.showDownloadManagerAct.setStatusTip(self.tr("Shows the downloads window"))
+        self.showDownloadManagerAct.setWhatsThis(
+            self.tr("""<b>Downloads</b>""" """<p>Shows the downloads window.</p>""")
+        )
+        self.showDownloadManagerAct.triggered.connect(self.__showDownloadsWindow)
         self.__actions.append(self.showDownloadManagerAct)
-        
+
         self.feedsManagerAct = EricAction(
-            self.tr('RSS Feeds Dialog'),
+            self.tr("RSS Feeds Dialog"),
             UI.PixmapCache.getIcon("rss22"),
-            self.tr('&RSS Feeds Dialog...'),
+            self.tr("&RSS Feeds Dialog..."),
             QKeySequence(self.tr("Ctrl+Shift+F", "Help|RSS Feeds Dialog")),
-            0, self, 'webbrowser_rss_feeds')
-        self.feedsManagerAct.setStatusTip(self.tr(
-            'Open a dialog showing the configured RSS feeds.'))
-        self.feedsManagerAct.setWhatsThis(self.tr(
-            """<b>RSS Feeds Dialog...</b>"""
-            """<p>Open a dialog to show the configured RSS feeds."""
-            """ It can be used to mange the feeds and to show their"""
-            """ contents.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_rss_feeds",
+        )
+        self.feedsManagerAct.setStatusTip(
+            self.tr("Open a dialog showing the configured RSS feeds.")
+        )
+        self.feedsManagerAct.setWhatsThis(
+            self.tr(
+                """<b>RSS Feeds Dialog...</b>"""
+                """<p>Open a dialog to show the configured RSS feeds."""
+                """ It can be used to mange the feeds and to show their"""
+                """ contents.</p>"""
+            )
+        )
         self.feedsManagerAct.triggered.connect(self.__showFeedsManager)
         self.__actions.append(self.feedsManagerAct)
-        
+
         self.siteInfoAct = EricAction(
-            self.tr('Siteinfo Dialog'),
+            self.tr("Siteinfo Dialog"),
             UI.PixmapCache.getIcon("helpAbout"),
-            self.tr('&Siteinfo Dialog...'),
+            self.tr("&Siteinfo Dialog..."),
             QKeySequence(self.tr("Ctrl+Shift+I", "Help|Siteinfo Dialog")),
-            0, self, 'webbrowser_siteinfo')
-        self.siteInfoAct.setStatusTip(self.tr(
-            'Open a dialog showing some information about the current site.'))
-        self.siteInfoAct.setWhatsThis(self.tr(
-            """<b>Siteinfo Dialog...</b>"""
-            """<p>Opens a dialog showing some information about the current"""
-            """ site.</p>"""
-        ))
+            0,
+            self,
+            "webbrowser_siteinfo",
+        )
+        self.siteInfoAct.setStatusTip(
+            self.tr("Open a dialog showing some information about the current site.")
+        )
+        self.siteInfoAct.setWhatsThis(
+            self.tr(
+                """<b>Siteinfo Dialog...</b>"""
+                """<p>Opens a dialog showing some information about the current"""
+                """ site.</p>"""
+            )
+        )
         self.siteInfoAct.triggered.connect(self.__showSiteinfoDialog)
         self.__actions.append(self.siteInfoAct)
-        
+
         self.userAgentManagerAct = EricAction(
-            self.tr('Manage User Agent Settings'),
-            self.tr('Manage &User Agent Settings'),
-            0, 0, self, 'webbrowser_user_agent_settings')
-        self.userAgentManagerAct.setStatusTip(self.tr(
-            'Shows a dialog to manage the User Agent settings'))
-        self.userAgentManagerAct.setWhatsThis(self.tr(
-            """<b>Manage User Agent Settings</b>"""
-            """<p>Shows a dialog to manage the User Agent settings.</p>"""
-        ))
-        self.userAgentManagerAct.triggered.connect(
-            self.__showUserAgentsDialog)
+            self.tr("Manage User Agent Settings"),
+            self.tr("Manage &User Agent Settings"),
+            0,
+            0,
+            self,
+            "webbrowser_user_agent_settings",
+        )
+        self.userAgentManagerAct.setStatusTip(
+            self.tr("Shows a dialog to manage the User Agent settings")
+        )
+        self.userAgentManagerAct.setWhatsThis(
+            self.tr(
+                """<b>Manage User Agent Settings</b>"""
+                """<p>Shows a dialog to manage the User Agent settings.</p>"""
+            )
+        )
+        self.userAgentManagerAct.triggered.connect(self.__showUserAgentsDialog)
         self.__actions.append(self.userAgentManagerAct)
-        
+
         self.synchronizationAct = EricAction(
-            self.tr('Synchronize data'),
+            self.tr("Synchronize data"),
             UI.PixmapCache.getIcon("sync"),
-            self.tr('&Synchronize Data...'),
-            0, 0, self, 'webbrowser_synchronize_data')
-        self.synchronizationAct.setStatusTip(self.tr(
-            'Shows a dialog to synchronize data via the network'))
-        self.synchronizationAct.setWhatsThis(self.tr(
-            """<b>Synchronize Data...</b>"""
-            """<p>This shows a dialog to synchronize data via the"""
-            """ network.</p>"""
-        ))
-        self.synchronizationAct.triggered.connect(
-            self.__showSyncDialog)
+            self.tr("&Synchronize Data..."),
+            0,
+            0,
+            self,
+            "webbrowser_synchronize_data",
+        )
+        self.synchronizationAct.setStatusTip(
+            self.tr("Shows a dialog to synchronize data via the network")
+        )
+        self.synchronizationAct.setWhatsThis(
+            self.tr(
+                """<b>Synchronize Data...</b>"""
+                """<p>This shows a dialog to synchronize data via the"""
+                """ network.</p>"""
+            )
+        )
+        self.synchronizationAct.triggered.connect(self.__showSyncDialog)
         self.__actions.append(self.synchronizationAct)
-        
+
         self.zoomValuesAct = EricAction(
-            self.tr('Manage Saved Zoom Values'),
+            self.tr("Manage Saved Zoom Values"),
             UI.PixmapCache.getIcon("zoomReset"),
-            self.tr('Manage Saved Zoom Values...'),
-            0, 0,
-            self, 'webbrowser_manage_zoom_values')
-        self.zoomValuesAct.setStatusTip(self.tr(
-            'Manage the saved zoom values'))
-        self.zoomValuesAct.setWhatsThis(self.tr(
-            """<b>Manage Saved Zoom Values...</b>"""
-            """<p>Opens a dialog to manage the saved zoom values.</p>"""
-        ))
+            self.tr("Manage Saved Zoom Values..."),
+            0,
+            0,
+            self,
+            "webbrowser_manage_zoom_values",
+        )
+        self.zoomValuesAct.setStatusTip(self.tr("Manage the saved zoom values"))
+        self.zoomValuesAct.setWhatsThis(
+            self.tr(
+                """<b>Manage Saved Zoom Values...</b>"""
+                """<p>Opens a dialog to manage the saved zoom values.</p>"""
+            )
+        )
         self.zoomValuesAct.triggered.connect(self.__showZoomValuesDialog)
         self.__actions.append(self.zoomValuesAct)
-        
+
         self.showJavaScriptConsoleAct = EricAction(
-            self.tr('JavaScript Console'),
-            self.tr('JavaScript Console'),
-            0, 0, self, 'webbrowser_show_javascript_console')
-        self.showJavaScriptConsoleAct.setStatusTip(self.tr(
-            'Toggle the JavaScript console window'))
-        self.showJavaScriptConsoleAct.setWhatsThis(self.tr(
-            """<b>JavaScript Console</b>"""
-            """<p>This toggles the JavaScript console window.</p>"""
-        ))
-        self.showJavaScriptConsoleAct.triggered.connect(
-            self.__toggleJavaScriptConsole)
+            self.tr("JavaScript Console"),
+            self.tr("JavaScript Console"),
+            0,
+            0,
+            self,
+            "webbrowser_show_javascript_console",
+        )
+        self.showJavaScriptConsoleAct.setStatusTip(
+            self.tr("Toggle the JavaScript console window")
+        )
+        self.showJavaScriptConsoleAct.setWhatsThis(
+            self.tr(
+                """<b>JavaScript Console</b>"""
+                """<p>This toggles the JavaScript console window.</p>"""
+            )
+        )
+        self.showJavaScriptConsoleAct.triggered.connect(self.__toggleJavaScriptConsole)
         self.__actions.append(self.showJavaScriptConsoleAct)
-        
+
         self.showTabManagerAct = EricAction(
-            self.tr('Tab Manager'),
-            self.tr('Tab Manager'),
-            0, 0, self, 'webbrowser_show_tab_manager')
-        self.showTabManagerAct.setStatusTip(self.tr(
-            'Shows the tab manager window'))
-        self.showTabManagerAct.setWhatsThis(self.tr(
-            """<b>Tab Manager</b>"""
-            """<p>Shows the tab manager window.</p>"""
-        ))
+            self.tr("Tab Manager"),
+            self.tr("Tab Manager"),
+            0,
+            0,
+            self,
+            "webbrowser_show_tab_manager",
+        )
+        self.showTabManagerAct.setStatusTip(self.tr("Shows the tab manager window"))
+        self.showTabManagerAct.setWhatsThis(
+            self.tr("""<b>Tab Manager</b>""" """<p>Shows the tab manager window.</p>""")
+        )
         self.showTabManagerAct.triggered.connect(
-            lambda: self.__showTabManager(self.showTabManagerAct))
+            lambda: self.__showTabManager(self.showTabManagerAct)
+        )
         self.__actions.append(self.showTabManagerAct)
-        
+
         self.showSessionsManagerAct = EricAction(
-            self.tr('Session Manager'),
-            self.tr('Session Manager...'),
-            0, 0, self, 'webbrowser_show_session_manager')
-        self.showSessionsManagerAct.setStatusTip(self.tr(
-            'Shows the session manager window'))
-        self.showSessionsManagerAct.setWhatsThis(self.tr(
-            """<b>Session Manager</b>"""
-            """<p>Shows the session manager window.</p>"""
-        ))
-        self.showSessionsManagerAct.triggered.connect(
-            self.__showSessionManagerDialog)
+            self.tr("Session Manager"),
+            self.tr("Session Manager..."),
+            0,
+            0,
+            self,
+            "webbrowser_show_session_manager",
+        )
+        self.showSessionsManagerAct.setStatusTip(
+            self.tr("Shows the session manager window")
+        )
+        self.showSessionsManagerAct.setWhatsThis(
+            self.tr(
+                """<b>Session Manager</b>"""
+                """<p>Shows the session manager window.</p>"""
+            )
+        )
+        self.showSessionsManagerAct.triggered.connect(self.__showSessionManagerDialog)
         self.__actions.append(self.showSessionsManagerAct)
-        
+
         self.virustotalScanCurrentAct = EricAction(
             self.tr("Scan current site"),
             UI.PixmapCache.getIcon("virustotal"),
             self.tr("Scan current site"),
-            0, 0,
-            self, 'webbrowser_virustotal_scan_site')
+            0,
+            0,
+            self,
+            "webbrowser_virustotal_scan_site",
+        )
         self.virustotalScanCurrentAct.triggered.connect(
-            self.__virusTotalScanCurrentSite)
+            self.__virusTotalScanCurrentSite
+        )
         self.__actions.append(self.virustotalScanCurrentAct)
-        
+
         self.virustotalIpReportAct = EricAction(
             self.tr("IP Address Report"),
             UI.PixmapCache.getIcon("virustotal"),
             self.tr("IP Address Report"),
-            0, 0,
-            self, 'webbrowser_virustotal_ip_report')
-        self.virustotalIpReportAct.triggered.connect(
-            self.__virusTotalIpAddressReport)
+            0,
+            0,
+            self,
+            "webbrowser_virustotal_ip_report",
+        )
+        self.virustotalIpReportAct.triggered.connect(self.__virusTotalIpAddressReport)
         self.__actions.append(self.virustotalIpReportAct)
-        
+
         self.virustotalDomainReportAct = EricAction(
             self.tr("Domain Report"),
             UI.PixmapCache.getIcon("virustotal"),
             self.tr("Domain Report"),
-            0, 0,
-            self, 'webbrowser_virustotal_domain_report')
-        self.virustotalDomainReportAct.triggered.connect(
-            self.__virusTotalDomainReport)
+            0,
+            0,
+            self,
+            "webbrowser_virustotal_domain_report",
+        )
+        self.virustotalDomainReportAct.triggered.connect(self.__virusTotalDomainReport)
         self.__actions.append(self.virustotalDomainReportAct)
-        
+
         if (
-            not Preferences.getWebBrowser("VirusTotalEnabled") or
-            Preferences.getWebBrowser("VirusTotalServiceKey") == ""
+            not Preferences.getWebBrowser("VirusTotalEnabled")
+            or Preferences.getWebBrowser("VirusTotalServiceKey") == ""
         ):
             self.virustotalScanCurrentAct.setEnabled(False)
             self.virustotalIpReportAct.setEnabled(False)
             self.virustotalDomainReportAct.setEnabled(False)
 
         self.shortcutsAct = EricAction(
-            self.tr('Keyboard Shortcuts'),
+            self.tr("Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("configureShortcuts"),
-            self.tr('Keyboard &Shortcuts...'),
-            0, 0,
-            self, 'webbrowser_keyboard_shortcuts')
-        self.shortcutsAct.setStatusTip(self.tr(
-            'Set the keyboard shortcuts'))
-        self.shortcutsAct.setWhatsThis(self.tr(
-            """<b>Keyboard Shortcuts</b>"""
-            """<p>Set the keyboard shortcuts of the application"""
-            """ with your prefered values.</p>"""
-        ))
+            self.tr("Keyboard &Shortcuts..."),
+            0,
+            0,
+            self,
+            "webbrowser_keyboard_shortcuts",
+        )
+        self.shortcutsAct.setStatusTip(self.tr("Set the keyboard shortcuts"))
+        self.shortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Keyboard Shortcuts</b>"""
+                """<p>Set the keyboard shortcuts of the application"""
+                """ with your prefered values.</p>"""
+            )
+        )
         self.shortcutsAct.triggered.connect(self.__configShortcuts)
         self.__actions.append(self.shortcutsAct)
 
         self.exportShortcutsAct = EricAction(
-            self.tr('Export Keyboard Shortcuts'),
+            self.tr("Export Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("exportShortcuts"),
-            self.tr('&Export Keyboard Shortcuts...'),
-            0, 0, self, 'export_keyboard_shortcuts')
-        self.exportShortcutsAct.setStatusTip(self.tr(
-            'Export the keyboard shortcuts'))
-        self.exportShortcutsAct.setWhatsThis(self.tr(
-            """<b>Export Keyboard Shortcuts</b>"""
-            """<p>Export the keyboard shortcuts of the application.</p>"""
-        ))
+            self.tr("&Export Keyboard Shortcuts..."),
+            0,
+            0,
+            self,
+            "export_keyboard_shortcuts",
+        )
+        self.exportShortcutsAct.setStatusTip(self.tr("Export the keyboard shortcuts"))
+        self.exportShortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Export Keyboard Shortcuts</b>"""
+                """<p>Export the keyboard shortcuts of the application.</p>"""
+            )
+        )
         self.exportShortcutsAct.triggered.connect(self.__exportShortcuts)
         self.__actions.append(self.exportShortcutsAct)
 
         self.importShortcutsAct = EricAction(
-            self.tr('Import Keyboard Shortcuts'),
+            self.tr("Import Keyboard Shortcuts"),
             UI.PixmapCache.getIcon("importShortcuts"),
-            self.tr('&Import Keyboard Shortcuts...'),
-            0, 0, self, 'import_keyboard_shortcuts')
-        self.importShortcutsAct.setStatusTip(self.tr(
-            'Import the keyboard shortcuts'))
-        self.importShortcutsAct.setWhatsThis(self.tr(
-            """<b>Import Keyboard Shortcuts</b>"""
-            """<p>Import the keyboard shortcuts of the application.</p>"""
-        ))
+            self.tr("&Import Keyboard Shortcuts..."),
+            0,
+            0,
+            self,
+            "import_keyboard_shortcuts",
+        )
+        self.importShortcutsAct.setStatusTip(self.tr("Import the keyboard shortcuts"))
+        self.importShortcutsAct.setWhatsThis(
+            self.tr(
+                """<b>Import Keyboard Shortcuts</b>"""
+                """<p>Import the keyboard shortcuts of the application.</p>"""
+            )
+        )
         self.importShortcutsAct.triggered.connect(self.__importShortcuts)
         self.__actions.append(self.importShortcutsAct)
-        
+
         self.showProtocolHandlerManagerAct = EricAction(
-            self.tr('Protocol Handler Manager'),
-            self.tr('Protocol Handler Manager...'),
-            0, 0, self, 'webbrowser_show_protocol_handler_manager')
-        self.showProtocolHandlerManagerAct.setStatusTip(self.tr(
-            'Shows the protocol handler manager window'))
-        self.showProtocolHandlerManagerAct.setWhatsThis(self.tr(
-            """<b>Protocol Handler Manager</b>"""
-            """<p>Shows the protocol handler manager window.</p>"""
-        ))
+            self.tr("Protocol Handler Manager"),
+            self.tr("Protocol Handler Manager..."),
+            0,
+            0,
+            self,
+            "webbrowser_show_protocol_handler_manager",
+        )
+        self.showProtocolHandlerManagerAct.setStatusTip(
+            self.tr("Shows the protocol handler manager window")
+        )
+        self.showProtocolHandlerManagerAct.setWhatsThis(
+            self.tr(
+                """<b>Protocol Handler Manager</b>"""
+                """<p>Shows the protocol handler manager window.</p>"""
+            )
+        )
         self.showProtocolHandlerManagerAct.triggered.connect(
-            self.__showProtocolHandlerManagerDialog)
+            self.__showProtocolHandlerManagerDialog
+        )
         self.__actions.append(self.showProtocolHandlerManagerAct)
-        
+
         self.backAct.setEnabled(False)
         self.forwardAct.setEnabled(False)
-        
+
         # now read the keyboard shortcuts for the actions
         Shortcuts.readShortcuts(helpViewer=self)
-    
+
     def getActions(self):
         """
         Public method to get a list of all actions.
-        
+
         @return list of all actions (list of EricAction)
         """
         return self.__actions[:]
-    
+
     def getActionsCategory(self):
         """
         Public method to get the category of the defined actions.
-        
+
         @return category of the actions
         @rtype str
         """
         return "WebBrowser"
-    
+
     def __initMenus(self):
         """
         Private method to create the menus.
         """
         mb = self.menuBar()
-        
-        menu = mb.addMenu(self.tr('&File'))
+
+        menu = mb.addMenu(self.tr("&File"))
         menu.addAction(self.newTabAct)
         menu.addAction(self.newAct)
         menu.addAction(self.newPrivateAct)
@@ -1924,8 +2324,8 @@
         if not self.isPrivate():
             sessionsMenu = menu.addMenu(self.tr("Sessions"))
             sessionsMenu.aboutToShow.connect(
-                lambda: self.sessionManager().aboutToShowSessionsMenu(
-                    sessionsMenu))
+                lambda: self.sessionManager().aboutToShowSessionsMenu(sessionsMenu)
+            )
             menu.addAction(self.showSessionsManagerAct)
             menu.addSeparator()
         if self.saveAsAct is not None:
@@ -1945,8 +2345,8 @@
         menu.addSeparator()
         menu.addAction(self.exitAct)
         self.addActions(menu.actions())
-        
-        menu = mb.addMenu(self.tr('&Edit'))
+
+        menu = mb.addMenu(self.tr("&Edit"))
         menu.addAction(self.undoAct)
         menu.addAction(self.redoAct)
         menu.addSeparator()
@@ -1961,8 +2361,8 @@
         menu.addAction(self.findNextAct)
         menu.addAction(self.findPrevAct)
         self.addActions(menu.actions())
-        
-        menu = mb.addMenu(self.tr('&View'))
+
+        menu = mb.addMenu(self.tr("&View"))
         menu.addAction(self.stopAct)
         menu.addAction(self.reloadAct)
         if WebBrowserWindow._useQtHelp:
@@ -1973,41 +2373,41 @@
         menu.addAction(self.zoomResetAct)
         menu.addAction(self.zoomOutAct)
         menu.addSeparator()
-        self.__textEncodingMenu = menu.addMenu(
-            self.tr("Text Encoding"))
-        self.__textEncodingMenu.aboutToShow.connect(
-            self.__aboutToShowTextEncodingMenu)
+        self.__textEncodingMenu = menu.addMenu(self.tr("Text Encoding"))
+        self.__textEncodingMenu.aboutToShow.connect(self.__aboutToShowTextEncodingMenu)
         self.__textEncodingMenu.triggered.connect(self.__setTextEncoding)
         menu.addSeparator()
         menu.addAction(self.pageSourceAct)
         menu.addAction(self.fullScreenAct)
         self.addActions(menu.actions())
-        
+
         from .History.HistoryMenu import HistoryMenu
+
         self.historyMenu = HistoryMenu(self, self.__tabWidget)
-        self.historyMenu.setTitle(self.tr('H&istory'))
+        self.historyMenu.setTitle(self.tr("H&istory"))
         self.historyMenu.openUrl.connect(self.openUrl)
         self.historyMenu.newTab.connect(self.openUrlNewTab)
         self.historyMenu.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
         self.historyMenu.newWindow.connect(self.openUrlNewWindow)
         self.historyMenu.newPrivateWindow.connect(self.openUrlNewPrivateWindow)
         mb.addMenu(self.historyMenu)
-        
+
         historyActions = []
         historyActions.append(self.backAct)
         historyActions.append(self.forwardAct)
         historyActions.append(self.homeAct)
         self.historyMenu.setInitialActions(historyActions)
         self.addActions(historyActions)
-        
+
         from .Bookmarks.BookmarksMenu import BookmarksMenuBarMenu
+
         self.bookmarksMenu = BookmarksMenuBarMenu(self)
-        self.bookmarksMenu.setTitle(self.tr('&Bookmarks'))
+        self.bookmarksMenu.setTitle(self.tr("&Bookmarks"))
         self.bookmarksMenu.openUrl.connect(self.openUrl)
         self.bookmarksMenu.newTab.connect(self.openUrlNewTab)
         self.bookmarksMenu.newWindow.connect(self.openUrlNewWindow)
         mb.addMenu(self.bookmarksMenu)
-        
+
         bookmarksActions = []
         bookmarksActions.append(self.bookmarksManageAct)
         bookmarksActions.append(self.bookmarksAddAct)
@@ -2017,8 +2417,8 @@
         bookmarksActions.append(self.importBookmarksAct)
         bookmarksActions.append(self.exportBookmarksAct)
         self.bookmarksMenu.setInitialActions(bookmarksActions)
-        
-        menu = mb.addMenu(self.tr('&Settings'))
+
+        menu = mb.addMenu(self.tr("&Settings"))
         menu.addAction(self.prefAct)
         menu.addSeparator()
         menu.addAction(self.shortcutsAct)
@@ -2046,34 +2446,35 @@
         menu.addAction(self.safeBrowsingAct)
         menu.addSeparator()
         self.__settingsMenu = menu
-        self.__settingsMenu.aboutToShow.connect(
-            self.__aboutToShowSettingsMenu)
-        
+        self.__settingsMenu.aboutToShow.connect(self.__aboutToShowSettingsMenu)
+
         from .UserAgent.UserAgentMenu import UserAgentMenu
+
         self.__userAgentMenu = UserAgentMenu(self.tr("Global User Agent"))
         menu.addMenu(self.__userAgentMenu)
         menu.addAction(self.userAgentManagerAct)
         menu.addSeparator()
-        
+
         if WebBrowserWindow._useQtHelp:
             menu.addAction(self.manageQtHelpDocsAct)
             menu.addAction(self.reindexDocumentationAct)
             menu.addSeparator()
         menu.addAction(self.clearPrivateDataAct)
         menu.addAction(self.clearIconsAct)
-        
+
         menu = mb.addMenu(self.tr("&Tools"))
         menu.addAction(self.feedsManagerAct)
         menu.addAction(self.siteInfoAct)
         menu.addSeparator()
         menu.addAction(self.synchronizationAct)
         menu.addSeparator()
-        vtMenu = menu.addMenu(UI.PixmapCache.getIcon("virustotal"),
-                              self.tr("&VirusTotal"))
+        vtMenu = menu.addMenu(
+            UI.PixmapCache.getIcon("virustotal"), self.tr("&VirusTotal")
+        )
         vtMenu.addAction(self.virustotalScanCurrentAct)
         vtMenu.addAction(self.virustotalIpReportAct)
         vtMenu.addAction(self.virustotalDomainReportAct)
-        
+
         menu = mb.addMenu(self.tr("&Windows"))
         menu.addAction(self.showDownloadManagerAct)
         menu.addAction(self.showJavaScriptConsoleAct)
@@ -2088,43 +2489,43 @@
         self.__toolbarsMenu = menu.addMenu(self.tr("&Toolbars"))
         self.__toolbarsMenu.aboutToShow.connect(self.__showToolbarsMenu)
         self.__toolbarsMenu.triggered.connect(self.__TBMenuTriggered)
-        
+
         mb.addSeparator()
-        
-        menu = mb.addMenu(self.tr('&Help'))
+
+        menu = mb.addMenu(self.tr("&Help"))
         menu.addAction(self.aboutAct)
         menu.addAction(self.aboutQtAct)
         menu.addSeparator()
         menu.addAction(self.whatsThisAct)
         self.addActions(menu.actions())
-    
+
     def __initSuperMenu(self):
         """
         Private method to create the super menu and attach it to the super
         menu button.
         """
         self.__superMenu = QMenu(self)
-        
+
         self.__superMenu.addAction(self.newTabAct)
         self.__superMenu.addAction(self.newAct)
         self.__superMenu.addAction(self.newPrivateAct)
         self.__superMenu.addAction(self.openAct)
         self.__superMenu.addAction(self.openTabAct)
         self.__superMenu.addSeparator()
-        
+
         if not self.isPrivate():
             sessionsMenu = self.__superMenu.addMenu(self.tr("Sessions"))
             sessionsMenu.aboutToShow.connect(
-                lambda: self.sessionManager().aboutToShowSessionsMenu(
-                    sessionsMenu))
+                lambda: self.sessionManager().aboutToShowSessionsMenu(sessionsMenu)
+            )
             self.__superMenu.addAction(self.showSessionsManagerAct)
             self.__superMenu.addSeparator()
-        
+
         menu = self.__superMenu.addMenu(self.tr("Save"))
         if self.saveAsAct:
             menu.addAction(self.saveAsAct)
         menu.addAction(self.saveVisiblePageScreenAct)
-        
+
         if self.printPreviewAct or self.printAct or self.printPdfAct:
             menu = self.__superMenu.addMenu(self.tr("Print"))
             if self.printPreviewAct:
@@ -2133,20 +2534,21 @@
                 menu.addAction(self.printAct)
             if self.printPdfAct:
                 menu.addAction(self.printPdfAct)
-        
+
         self.__superMenu.addAction(self.sendPageLinkAct)
         self.__superMenu.addSeparator()
         self.__superMenu.addAction(self.selectAllAct)
         self.__superMenu.addAction(self.findAct)
         self.__superMenu.addSeparator()
-        act = self.__superMenu.addAction(UI.PixmapCache.getIcon("history"),
-                                         self.tr("Show All History..."))
+        act = self.__superMenu.addAction(
+            UI.PixmapCache.getIcon("history"), self.tr("Show All History...")
+        )
         act.triggered.connect(self.historyMenu.showHistoryDialog)
         self.__superMenu.addAction(self.bookmarksManageAct)
         self.__superMenu.addSeparator()
         self.__superMenu.addAction(self.prefAct)
-        
-        menu = self.__superMenu.addMenu(self.tr('Settings'))
+
+        menu = self.__superMenu.addMenu(self.tr("Settings"))
         menu.addAction(self.shortcutsAct)
         menu.addAction(self.exportShortcutsAct)
         menu.addAction(self.importShortcutsAct)
@@ -2180,12 +2582,11 @@
             menu.addSeparator()
         menu.addAction(self.clearPrivateDataAct)
         menu.addAction(self.clearIconsAct)
-        menu.aboutToShow.connect(
-            self.__aboutToShowSettingsMenu)
+        menu.aboutToShow.connect(self.__aboutToShowSettingsMenu)
 
         self.__superMenu.addSeparator()
-        
-        menu = self.__superMenu.addMenu(self.tr('&View'))
+
+        menu = self.__superMenu.addMenu(self.tr("&View"))
         menu.addMenu(self.__toolbarsMenu)
         windowsMenu = menu.addMenu(self.tr("&Windows"))
         windowsMenu.addAction(self.showDownloadManagerAct)
@@ -2212,30 +2613,31 @@
         menu.addSeparator()
         menu.addAction(self.pageSourceAct)
         menu.addAction(self.fullScreenAct)
-        
+
         self.__superMenu.addMenu(self.historyMenu)
         self.__superMenu.addMenu(self.bookmarksMenu)
-        
+
         menu = self.__superMenu.addMenu(self.tr("&Tools"))
         menu.addAction(self.feedsManagerAct)
         menu.addAction(self.siteInfoAct)
         menu.addSeparator()
         menu.addAction(self.synchronizationAct)
         menu.addSeparator()
-        vtMenu = menu.addMenu(UI.PixmapCache.getIcon("virustotal"),
-                              self.tr("&VirusTotal"))
+        vtMenu = menu.addMenu(
+            UI.PixmapCache.getIcon("virustotal"), self.tr("&VirusTotal")
+        )
         vtMenu.addAction(self.virustotalScanCurrentAct)
         vtMenu.addAction(self.virustotalIpReportAct)
         vtMenu.addAction(self.virustotalDomainReportAct)
-        
+
         self.__superMenu.addSeparator()
         self.__superMenu.addAction(self.aboutAct)
         self.__superMenu.addAction(self.aboutQtAct)
         self.__superMenu.addSeparator()
         self.__superMenu.addAction(self.exitAct)
-        
+
         self.__navigationBar.superMenuButton().setMenu(self.__superMenu)
-    
+
     def __initToolbars(self):
         """
         Private method to create the toolbars.
@@ -2264,7 +2666,7 @@
         filetb.addAction(self.closeAct)
         filetb.addAction(self.exitAct)
         self.__toolbars["file"] = (filetb.windowTitle(), filetb)
-        
+
         edittb = self.addToolBar(self.tr("Edit"))
         edittb.setObjectName("EditToolBar")
         edittb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2277,7 +2679,7 @@
         edittb.addSeparator()
         edittb.addAction(self.selectAllAct)
         self.__toolbars["edit"] = (edittb.windowTitle(), edittb)
-        
+
         viewtb = self.addToolBar(self.tr("View"))
         viewtb.setObjectName("ViewToolBar")
         viewtb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2287,7 +2689,7 @@
         viewtb.addSeparator()
         viewtb.addAction(self.fullScreenAct)
         self.__toolbars["view"] = (viewtb.windowTitle(), viewtb)
-        
+
         findtb = self.addToolBar(self.tr("Find"))
         findtb.setObjectName("FindToolBar")
         findtb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2295,22 +2697,24 @@
         findtb.addAction(self.findNextAct)
         findtb.addAction(self.findPrevAct)
         self.__toolbars["find"] = (findtb.windowTitle(), findtb)
-        
+
         if WebBrowserWindow._useQtHelp:
             filtertb = self.addToolBar(self.tr("Filter"))
             filtertb.setObjectName("FilterToolBar")
             self.filterCombo = QComboBox()
             comboWidth = QFontMetrics(QFont()).horizontalAdvance(
-                "ComboBoxWithEnoughWidth")
+                "ComboBoxWithEnoughWidth"
+            )
             self.filterCombo.setMinimumWidth(comboWidth)
             filtertb.addWidget(QLabel(self.tr("Filtered by: ")))
             filtertb.addWidget(self.filterCombo)
             self.__helpEngine.setupFinished.connect(self.__setupFilterCombo)
             self.filterCombo.currentIndexChanged.connect(
-                self.__filterQtHelpDocumentation)
+                self.__filterQtHelpDocumentation
+            )
             self.__setupFilterCombo()
             self.__toolbars["filter"] = (filtertb.windowTitle(), filtertb)
-        
+
         settingstb = self.addToolBar(self.tr("Settings"))
         settingstb.setObjectName("SettingsToolBar")
         settingstb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2322,7 +2726,7 @@
         settingstb.addAction(self.greaseMonkeyAct)
         settingstb.addAction(self.featurePermissionAct)
         self.__toolbars["settings"] = (settingstb.windowTitle(), settingstb)
-        
+
         toolstb = self.addToolBar(self.tr("Tools"))
         toolstb.setObjectName("ToolsToolBar")
         toolstb.setIconSize(UI.Config.ToolBarIconSize)
@@ -2331,13 +2735,13 @@
         toolstb.addSeparator()
         toolstb.addAction(self.synchronizationAct)
         self.__toolbars["tools"] = (toolstb.windowTitle(), toolstb)
-        
+
         helptb = self.addToolBar(self.tr("Help"))
         helptb.setObjectName("HelpToolBar")
         helptb.setIconSize(UI.Config.ToolBarIconSize)
         helptb.addAction(self.whatsThisAct)
         self.__toolbars["help"] = (helptb.windowTitle(), helptb)
-        
+
         self.addToolBarBreak()
         vttb = self.addToolBar(self.tr("VirusTotal"))
         vttb.setObjectName("VirusTotalToolBar")
@@ -2347,29 +2751,29 @@
         vttb.addAction(self.virustotalIpReportAct)
         vttb.addAction(self.virustotalDomainReportAct)
         self.__toolbars["virustotal"] = (vttb.windowTitle(), vttb)
-    
+
     @pyqtSlot()
     def __nextTab(self):
         """
         Private slot used to show the next tab.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'nextTab'):
+        while fwidget and not hasattr(fwidget, "nextTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.nextTab()
-    
+
     @pyqtSlot()
     def __prevTab(self):
         """
         Private slot used to show the previous tab.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'prevTab'):
+        while fwidget and not hasattr(fwidget, "prevTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.prevTab()
-    
+
     @pyqtSlot()
     def __switchTab(self):
         """
@@ -2377,35 +2781,34 @@
         current tab.
         """
         fwidget = QApplication.focusWidget()
-        while fwidget and not hasattr(fwidget, 'switchTab'):
+        while fwidget and not hasattr(fwidget, "switchTab"):
             fwidget = fwidget.parent()
         if fwidget:
             fwidget.switchTab()
-    
+
     @pyqtSlot()
     def __whatsThis(self):
         """
         Private slot called in to enter Whats This mode.
         """
         QWhatsThis.enterWhatsThisMode()
-    
+
     def __titleChanged(self, browser, title):
         """
         Private slot called to handle a change of a browser's title.
-        
+
         @param browser reference to the browser
         @type WebBrowserView
         @param title new title
         @type str
         """
-        self.historyManager().updateHistoryEntry(
-            browser.url().toString(), title)
-    
+        self.historyManager().updateHistoryEntry(browser.url().toString(), title)
+
     @pyqtSlot()
     def newTab(self, link=None, addNextTo=None, background=False):
         """
         Public slot called to open a new web browser tab.
-        
+
         @param link file to be displayed in the new window (string or QUrl)
         @param addNextTo reference to the browser to open the tab after
             (WebBrowserView)
@@ -2416,15 +2819,16 @@
         """
         if addNextTo:
             return self.__tabWidget.newBrowserAfter(
-                addNextTo, link, background=background)
+                addNextTo, link, background=background
+            )
         else:
             return self.__tabWidget.newBrowser(link, background=background)
-    
+
     @pyqtSlot()
     def newWindow(self, link=None, restoreSession=False):
         """
         Public slot called to open a new web browser window.
-        
+
         @param link URL to be displayed in the new window
         @type str or QUrl
         @param restoreSession flag indicating a restore session action
@@ -2438,20 +2842,25 @@
             linkName = link.toString()
         else:
             linkName = link
-        h = WebBrowserWindow(linkName, ".", self.parent(), "webbrowser",
-                             private=self.isPrivate(),
-                             restoreSession=restoreSession)
+        h = WebBrowserWindow(
+            linkName,
+            ".",
+            self.parent(),
+            "webbrowser",
+            private=self.isPrivate(),
+            restoreSession=restoreSession,
+        )
         h.show()
-        
+
         self.webBrowserWindowOpened.emit(h)
-        
+
         return h
-    
+
     @pyqtSlot()
     def newPrivateWindow(self, link=None):
         """
         Public slot called to open a new private web browser window.
-        
+
         @param link URL to be displayed in the new window
         @type str or QUrl
         """
@@ -2461,7 +2870,7 @@
             linkName = link.toString()
         else:
             linkName = link
-        
+
         applPath = os.path.join(getConfig("ericDir"), "eric7_browser.py")
         args = []
         args.append(applPath)
@@ -2471,20 +2880,20 @@
         args.append("--private")
         if linkName:
             args.append(linkName)
-        
-        if (
-            not os.path.isfile(applPath) or
-            not QProcess.startDetached(Globals.getPythonExecutable(), args)
+
+        if not os.path.isfile(applPath) or not QProcess.startDetached(
+            Globals.getPythonExecutable(), args
         ):
             EricMessageBox.critical(
                 self,
-                self.tr('New Private Window'),
+                self.tr("New Private Window"),
                 self.tr(
-                    '<p>Could not start the process.<br>'
-                    'Ensure that it is available as <b>{0}</b>.</p>'
+                    "<p>Could not start the process.<br>"
+                    "Ensure that it is available as <b>{0}</b>.</p>"
                 ).format(applPath),
-                self.tr('OK'))
-    
+                self.tr("OK"),
+            )
+
     @pyqtSlot()
     def __openFile(self):
         """
@@ -2494,18 +2903,20 @@
             self,
             self.tr("Open File"),
             "",
-            self.tr("HTML Files (*.html *.htm *.mhtml *.mht);;"
-                    "PDF Files (*.pdf);;"
-                    "CHM Files (*.chm);;"
-                    "All Files (*)"
-                    ))
+            self.tr(
+                "HTML Files (*.html *.htm *.mhtml *.mht);;"
+                "PDF Files (*.pdf);;"
+                "CHM Files (*.chm);;"
+                "All Files (*)"
+            ),
+        )
         if fn:
             if Utilities.isWindowsPlatform():
                 url = "file:///" + Utilities.fromNativeSeparators(fn)
             else:
                 url = "file://" + fn
             self.currentBrowser().setSource(QUrl(url))
-    
+
     @pyqtSlot()
     def __openFileNewTab(self):
         """
@@ -2515,18 +2926,20 @@
             self,
             self.tr("Open File"),
             "",
-            self.tr("HTML Files (*.html *.htm *.mhtml *.mht);;"
-                    "PDF Files (*.pdf);;"
-                    "CHM Files (*.chm);;"
-                    "All Files (*)"
-                    ))
+            self.tr(
+                "HTML Files (*.html *.htm *.mhtml *.mht);;"
+                "PDF Files (*.pdf);;"
+                "CHM Files (*.chm);;"
+                "All Files (*)"
+            ),
+        )
         if fn:
             if Utilities.isWindowsPlatform():
                 url = "file:///" + Utilities.fromNativeSeparators(fn)
             else:
                 url = "file://" + fn
             self.newTab(url)
-    
+
     @pyqtSlot()
     def __savePageAs(self):
         """
@@ -2535,7 +2948,7 @@
         browser = self.currentBrowser()
         if browser is not None:
             browser.saveAs()
-    
+
     @pyqtSlot()
     def __saveVisiblePageScreen(self):
         """
@@ -2543,17 +2956,20 @@
         shot.
         """
         from .PageScreenDialog import PageScreenDialog
+
         self.__pageScreen = PageScreenDialog(self.currentBrowser())
         self.__pageScreen.show()
-    
+
     @pyqtSlot()
     def __about(self):
         """
         Private slot to show the about information.
         """
-        chromiumVersion, chromiumSecurityVersion, webengineVersion = (
-            WebBrowserTools.getWebEngineVersions()
-        )
+        (
+            chromiumVersion,
+            chromiumSecurityVersion,
+            webengineVersion,
+        ) = WebBrowserTools.getWebEngineVersions()
         if chromiumSecurityVersion:
             EricMessageBox.about(
                 self,
@@ -2565,8 +2981,9 @@
                     """ toolset.</p>"""
                     """<p>It is based on QtWebEngine {1} and Chromium {2}"""
                     """ with Security Patches {3}.</p>"""
-                ).format(Version, webengineVersion, chromiumVersion,
-                         chromiumSecurityVersion)
+                ).format(
+                    Version, webengineVersion, chromiumVersion, chromiumSecurityVersion
+                ),
             )
         else:
             EricMessageBox.about(
@@ -2579,73 +2996,74 @@
                     """ toolset.</p>"""
                     """<p>It is based on QtWebEngine {1} and Chromium {2}."""
                     """</p>"""
-                ).format(Version, webengineVersion, chromiumVersion)
+                ).format(Version, webengineVersion, chromiumVersion),
             )
-    
+
     @pyqtSlot()
     def __aboutQt(self):
         """
         Private slot to show info about Qt.
         """
         EricMessageBox.aboutQt(self, self.tr("eric Web Browser"))
-    
+
     @pyqtSlot(bool)
     def setBackwardAvailable(self, b):
         """
         Public slot called when backward references are available.
-        
+
         @param b flag indicating availability of the backwards action
         @type bool
         """
         self.backAct.setEnabled(b)
         self.__navigationBar.backButton().setEnabled(b)
-    
+
     @pyqtSlot(bool)
     def setForwardAvailable(self, b):
         """
         Public slot called when forward references are available.
-        
+
         @param b flag indicating the availability of the forwards action
         @type bool
         """
         self.forwardAct.setEnabled(b)
         self.__navigationBar.forwardButton().setEnabled(b)
-    
+
     @pyqtSlot(bool)
     def setLoadingActions(self, b):
         """
         Public slot to set the loading dependent actions.
-        
+
         @param b flag indicating the loading state to consider
         @type bool
         """
         self.reloadAct.setEnabled(not b)
         self.stopAct.setEnabled(b)
-        
+
         self.__navigationBar.reloadStopButton().setLoading(b)
-    
+
     @pyqtSlot()
     def __addBookmark(self):
         """
         Private slot called to add the displayed file to the bookmarks.
         """
         from .WebBrowserPage import WebBrowserPage
-        
+
         view = self.currentBrowser()
         view.addBookmark()
         urlStr = bytes(view.url().toEncoded()).decode()
         title = view.title()
-        
+
         script = Scripts.getAllMetaAttributes()
         view.page().runJavaScript(
             script,
             WebBrowserPage.SafeJsWorld,
-            lambda res: self.__addBookmarkCallback(urlStr, title, res))
-    
+            lambda res: self.__addBookmarkCallback(urlStr, title, res),
+        )
+
     def __addBookmarkCallback(self, url, title, res):
         """
         Private callback method of __addBookmark().
-        
+
         @param url URL for the bookmark
         @type str
         @param title title for the bookmark
@@ -2657,8 +3075,9 @@
         for meta in res:
             if meta["name"] == "description":
                 description = meta["content"]
-        
+
         from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         dlg.setUrl(url)
         dlg.setTitle(title)
@@ -2667,33 +3086,34 @@
         idx = self.bookmarksManager().bookmarksModel().nodeIndex(menu)
         dlg.setCurrentIndex(idx)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __addBookmarkFolder(self):
         """
         Private slot to add a new bookmarks folder.
         """
         from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog
+
         dlg = AddBookmarkDialog()
         menu = self.bookmarksManager().menu()
         idx = self.bookmarksManager().bookmarksModel().nodeIndex(menu)
         dlg.setCurrentIndex(idx)
         dlg.setFolder(True)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __showBookmarksDialog(self):
         """
         Private slot to show the bookmarks dialog.
         """
         from .Bookmarks.BookmarksDialog import BookmarksDialog
+
         self.__bookmarksDialog = BookmarksDialog(self)
         self.__bookmarksDialog.openUrl.connect(self.openUrl)
         self.__bookmarksDialog.newTab.connect(self.openUrlNewTab)
-        self.__bookmarksDialog.newBackgroundTab.connect(
-            self.openUrlNewBackgroundTab)
+        self.__bookmarksDialog.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
         self.__bookmarksDialog.show()
-    
+
     @pyqtSlot()
     def bookmarkAll(self):
         """
@@ -2701,31 +3121,31 @@
         """
         from .WebBrowserPage import WebBrowserPage
         from .Bookmarks.AddBookmarkDialog import AddBookmarkDialog
-        
+
         dlg = AddBookmarkDialog()
         dlg.setFolder(True)
         dlg.setTitle(self.tr("Saved Tabs"))
         dlg.exec()
-        
+
         folder = dlg.addedNode()
         if folder is None:
             return
-        
+
         for view in self.__tabWidget.browsers():
             urlStr = bytes(view.url().toEncoded()).decode()
             title = view.title()
-            
+
             script = Scripts.getAllMetaAttributes()
             view.page().runJavaScript(
                 script,
                 WebBrowserPage.SafeJsWorld,
-                functools.partial(self.__bookmarkAllCallback,
-                                  folder, urlStr, title))
-    
+                functools.partial(self.__bookmarkAllCallback, folder, urlStr, title),
+            )
+
     def __bookmarkAllCallback(self, folder, url, title, res):
         """
         Private callback method of __addBookmark().
-        
+
         @param folder reference to the bookmarks folder
         @type BookmarkNode
         @param url URL for the bookmark
@@ -2739,140 +3159,140 @@
         for meta in res:
             if meta["name"] == "description":
                 description = meta["content"]
-        
+
         from .Bookmarks.BookmarkNode import BookmarkNode
+
         bookmark = BookmarkNode(BookmarkNode.Bookmark)
         bookmark.url = url
         bookmark.title = title
         bookmark.desc = description
-        
+
         self.bookmarksManager().addBookmark(folder, bookmark)
-    
+
     @pyqtSlot()
     def __find(self):
         """
         Private slot to handle the find action.
-        
+
         It opens the search dialog in order to perform the various
         search actions and to collect the various search info.
         """
         self.__searchWidget.showFind()
-        
+
     def forceClose(self):
         """
         Public method to force closing the window.
         """
         self.__forcedClose = True
         self.close()
-    
+
     def closeEvent(self, e):
         """
         Protected event handler for the close event.
-        
+
         @param e the close event (QCloseEvent)
             <br />This event is simply accepted after the history has been
             saved and all window references have been deleted.
         """
         res = self.__shutdownWindow()
-        
+
         if res:
             e.accept()
             self.webBrowserWindowClosed.emit(self)
         else:
             e.ignore()
-    
+
     def isClosing(self):
         """
         Public method to test, if the window is closing.
-        
+
         @return flag indicating that the window is closing
         @rtype bool
         """
         return self.__isClosing
-    
+
     def __shutdownWindow(self):
         """
         Private method to shut down a web browser window.
-        
+
         @return flag indicating successful shutdown (boolean)
         """
         if (
-            not WebBrowserWindow._performingShutdown and
-            not self.__forcedClose and
-            not self.__tabWidget.shallShutDown()
+            not WebBrowserWindow._performingShutdown
+            and not self.__forcedClose
+            and not self.__tabWidget.shallShutDown()
         ):
             return False
-        
+
         self.__isClosing = True
-        
+
         if (
-            not WebBrowserWindow._performingShutdown and
-            len(WebBrowserWindow.BrowserWindows) == 1 and
-            not WebBrowserWindow.isPrivate()
+            not WebBrowserWindow._performingShutdown
+            and len(WebBrowserWindow.BrowserWindows) == 1
+            and not WebBrowserWindow.isPrivate()
         ):
             # shut down the session manager in case the last window is
             # about to be closed
             self.sessionManager().shutdown()
-        
+
         self.__bookmarksToolBar.setModel(None)
-        
+
         self.__virusTotal.close()
-        
+
         self.__navigationBar.searchEdit().openSearchManager().close()
-        
+
         if WebBrowserWindow._useQtHelp:
             self.__searchEngine.cancelIndexing()
             self.__searchEngine.cancelSearching()
-            
+
             if self.__helpInstaller:
                 self.__helpInstaller.stop()
-        
+
         self.__navigationBar.searchEdit().saveSearches()
-        
+
         self.__tabWidget.closeAllBrowsers(shutdown=True)
-        
+
         state = self.saveState()
         Preferences.setWebBrowser("WebBrowserState", state)
 
         if Preferences.getWebBrowser("SaveGeometry"):
             if not self.isFullScreen():
-                Preferences.setGeometry("WebBrowserGeometry",
-                                        self.saveGeometry())
+                Preferences.setGeometry("WebBrowserGeometry", self.saveGeometry())
         else:
             Preferences.setGeometry("WebBrowserGeometry", QByteArray())
-        
+
         with contextlib.suppress(ValueError):
             browserIndex = WebBrowserWindow.BrowserWindows.index(self)
             if len(WebBrowserWindow.BrowserWindows) and browserIndex == 0:
                 if len(WebBrowserWindow.BrowserWindows) > 1:
                     # first window will be deleted
                     QDesktopServices.setUrlHandler(
-                        "http",
-                        WebBrowserWindow.BrowserWindows[1].urlHandler)
+                        "http", WebBrowserWindow.BrowserWindows[1].urlHandler
+                    )
                     QDesktopServices.setUrlHandler(
-                        "https",
-                        WebBrowserWindow.BrowserWindows[1].urlHandler)
+                        "https", WebBrowserWindow.BrowserWindows[1].urlHandler
+                    )
                 else:
                     QDesktopServices.unsetUrlHandler("http")
                     QDesktopServices.unsetUrlHandler("https")
             if len(WebBrowserWindow.BrowserWindows) > 0:
                 del WebBrowserWindow.BrowserWindows[browserIndex]
-        
+
         Preferences.syncPreferences()
         if (
-            not WebBrowserWindow._performingShutdown and
-            len(WebBrowserWindow.BrowserWindows) == 0
+            not WebBrowserWindow._performingShutdown
+            and len(WebBrowserWindow.BrowserWindows) == 0
         ):
             # shut down the browser in case the last window was
             # simply closed
             self.shutdown()
-        
+
         return True
-    
+
     def __shallShutDown(self):
         """
         Private method to check, if the application should be shut down.
-        
+
         @return flag indicating a shut down
         @rtype bool
         """
@@ -2881,131 +3301,132 @@
             tabCount = 0
             for browser in WebBrowserWindow.BrowserWindows:
                 tabCount += browser.tabWidget().count()
-            
+
             if windowCount > 1 or tabCount > 1:
                 mb = EricMessageBox.EricMessageBox(
                     EricMessageBox.Information,
                     self.tr("Are you sure you want to close the web browser?"),
-                    self.tr("""Are you sure you want to close the web"""
-                            """ browser?\n"""
-                            """You have {0} windows with {1} tabs open.""")
-                    .format(windowCount, tabCount),
+                    self.tr(
+                        """Are you sure you want to close the web"""
+                        """ browser?\n"""
+                        """You have {0} windows with {1} tabs open."""
+                    ).format(windowCount, tabCount),
                     modal=True,
-                    parent=self)
-                quitButton = mb.addButton(
-                    self.tr("&Quit"), EricMessageBox.AcceptRole)
+                    parent=self,
+                )
+                quitButton = mb.addButton(self.tr("&Quit"), EricMessageBox.AcceptRole)
                 quitButton.setIcon(UI.PixmapCache.getIcon("exit"))
                 mb.addButton(EricMessageBox.Cancel)
                 mb.exec()
                 return mb.clickedButton() == quitButton
-        
+
         return True
-    
+
     def shutdown(self):
         """
         Public method to shut down the web browser.
-        
+
         @return flag indicating successful shutdown
         @rtype bool
         """
         if not self.__shallShutDown():
             return False
-        
+
         if (
-            WebBrowserWindow._downloadManager is not None and
-            not self.downloadManager().allowQuit()
+            WebBrowserWindow._downloadManager is not None
+            and not self.downloadManager().allowQuit()
         ):
             return False
-        
+
         WebBrowserWindow._performingShutdown = True
-        
+
         if not WebBrowserWindow.isPrivate():
             self.sessionManager().shutdown()
-        
+
         if WebBrowserWindow._downloadManager is not None:
             self.downloadManager().shutdown()
-        
+
         self.cookieJar().close()
-        
+
         self.bookmarksManager().close()
-        
+
         self.historyManager().close()
-        
+
         self.passwordManager().close()
-        
+
         self.adBlockManager().close()
-        
+
         self.userAgentsManager().close()
-        
+
         self.speedDial().close()
-        
+
         self.syncManager().close()
-        
+
         ZoomManager.instance().close()
-        
+
         WebIconProvider.instance().close()
-        
+
         if len(WebBrowserWindow.BrowserWindows) == 1:
             # it is the last window
             self.tabManager().close()
-        
+
         self.networkManager().shutdown()
-        
+
         if WebBrowserWindow._safeBrowsingManager:
             self.safeBrowsingManager().close()
-        
+
         for browser in WebBrowserWindow.BrowserWindows:
             if browser != self:
                 browser.close()
         self.close()
-        
+
         return True
-    
+
     @pyqtSlot()
     def __backward(self):
         """
         Private slot called to handle the backward action.
         """
         self.currentBrowser().backward()
-    
+
     @pyqtSlot()
     def __forward(self):
         """
         Private slot called to handle the forward action.
         """
         self.currentBrowser().forward()
-    
+
     @pyqtSlot()
     def __home(self):
         """
         Private slot called to handle the home action.
         """
         self.currentBrowser().home()
-    
+
     @pyqtSlot()
     def __reload(self):
         """
         Private slot called to handle the reload action.
         """
         self.currentBrowser().reloadBypassingCache()
-    
+
     @pyqtSlot()
     def __stopLoading(self):
         """
         Private slot called to handle loading of the current page.
         """
         self.currentBrowser().stop()
-    
+
     @pyqtSlot(int)
     def __zoomValueChanged(self, value):
         """
         Private slot to handle value changes of the zoom widget.
-        
+
         @param value zoom value
         @type int
         """
         self.currentBrowser().setZoomValue(value)
-    
+
     @pyqtSlot()
     def __zoomIn(self):
         """
@@ -3013,7 +3434,7 @@
         """
         self.currentBrowser().zoomIn()
         self.__zoomWidget.setValue(self.currentBrowser().zoomValue())
-    
+
     @pyqtSlot()
     def __zoomOut(self):
         """
@@ -3021,7 +3442,7 @@
         """
         self.currentBrowser().zoomOut()
         self.__zoomWidget.setValue(self.currentBrowser().zoomValue())
-    
+
     @pyqtSlot()
     def __zoomReset(self):
         """
@@ -3029,7 +3450,7 @@
         """
         self.currentBrowser().zoomReset()
         self.__zoomWidget.setValue(self.currentBrowser().zoomValue())
-    
+
     @pyqtSlot()
     def toggleFullScreen(self):
         """
@@ -3037,16 +3458,17 @@
         """
         if self.__htmlFullScreen:
             self.currentBrowser().triggerPageAction(
-                QWebEnginePage.WebAction.ExitFullScreen)
+                QWebEnginePage.WebAction.ExitFullScreen
+            )
             return
-        
+
         if self.isFullScreen():
             # switch back to normal
             self.showNormal()
         else:
             # switch to full screen
             self.showFullScreen()
-    
+
     def enterHtmlFullScreen(self):
         """
         Public method to switch to full screen initiated by the
@@ -3054,17 +3476,17 @@
         """
         self.showFullScreen()
         self.__htmlFullScreen = True
-    
+
     def isFullScreenNavigationVisible(self):
         """
         Public method to check, if full screen navigation is active.
-        
+
         @return flag indicating visibility of the navigation container in full
             screen mode
         @rtype bool
         """
         return self.isFullScreen() and self.__navigationContainer.isVisible()
-    
+
     @pyqtSlot()
     def showFullScreenNavigation(self):
         """
@@ -3072,13 +3494,13 @@
         """
         if self.__htmlFullScreen:
             return
-        
+
         if self.__hideNavigationTimer.isActive():
             self.__hideNavigationTimer.stop()
-        
+
         self.__navigationContainer.show()
         self.__tabWidget.tabBar().show()
-    
+
     @pyqtSlot()
     def hideFullScreenNavigation(self):
         """
@@ -3086,7 +3508,7 @@
         """
         if not self.__hideNavigationTimer.isActive():
             self.__hideNavigationTimer.start()
-    
+
     @pyqtSlot()
     def __hideNavigation(self):
         """
@@ -3094,116 +3516,116 @@
         """
         browser = self.currentBrowser()
         mouseInBrowser = browser and browser.underMouse()
-        
+
         if self.isFullScreen() and mouseInBrowser:
             self.__navigationContainer.hide()
             self.__tabWidget.tabBar().hide()
-    
+
     @pyqtSlot()
     def __copy(self):
         """
         Private slot called to handle the copy action.
         """
         self.currentBrowser().copy()
-    
+
     @pyqtSlot()
     def __cut(self):
         """
         Private slot called to handle the cut action.
         """
         self.currentBrowser().cut()
-    
+
     @pyqtSlot()
     def __paste(self):
         """
         Private slot called to handle the paste action.
         """
         self.currentBrowser().paste()
-    
+
     @pyqtSlot()
     def __undo(self):
         """
         Private slot to handle the undo action.
         """
         self.currentBrowser().undo()
-    
+
     @pyqtSlot()
     def __redo(self):
         """
         Private slot to handle the redo action.
         """
         self.currentBrowser().redo()
-    
+
     @pyqtSlot()
     def __selectAll(self):
         """
         Private slot to handle the select all action.
         """
         self.currentBrowser().selectAll()
-    
+
     @pyqtSlot()
     def __unselect(self):
         """
         Private slot to clear the selection of the current browser.
         """
         self.currentBrowser().unselect()
-    
+
     @classmethod
     def isPrivate(cls):
         """
         Class method to check the private browsing mode.
-        
+
         @return flag indicating private browsing mode
         @rtype bool
         """
         return cls._isPrivate
-    
+
     def closeCurrentBrowser(self):
         """
         Public method to close the current web browser.
         """
         self.__tabWidget.closeBrowser()
-    
+
     def closeBrowser(self, browser):
         """
         Public method to close the given browser.
-        
+
         @param browser reference to the web browser view to be closed
         @type WebBrowserView
         """
         self.__tabWidget.closeBrowserView(browser)
-    
+
     def currentBrowser(self):
         """
         Public method to get a reference to the current web browser.
-        
+
         @return reference to the current help browser (WebBrowserView)
         """
         return self.__tabWidget.currentBrowser()
-    
+
     def browserAt(self, index):
         """
         Public method to get a reference to the web browser with the given
         index.
-        
+
         @param index index of the browser to get (integer)
         @return reference to the indexed web browser (WebBrowserView)
         """
         return self.__tabWidget.browserAt(index)
-    
+
     def browsers(self):
         """
         Public method to get a list of references to all web browsers.
-        
+
         @return list of references to web browsers (list of WebBrowserView)
         """
         return self.__tabWidget.browsers()
-    
+
     @pyqtSlot(int)
     def __currentChanged(self, index):
         """
         Private slot to handle the currentChanged signal.
-        
+
         @param index index of the current tab
         @type int
         """
@@ -3213,24 +3635,31 @@
                 self.setForwardAvailable(cb.isForwardAvailable())
                 self.setBackwardAvailable(cb.isBackwardAvailable())
                 self.setLoadingActions(cb.isLoading())
-                
+
                 # set value of zoom widget
                 self.__zoomWidget.setValue(cb.zoomValue())
-    
+
     @pyqtSlot()
     def __showPreferences(self):
         """
         Private slot to set the preferences.
         """
         from Preferences.ConfigurationDialog import (
-            ConfigurationDialog, ConfigurationMode
-        )
+            ConfigurationDialog,
+            ConfigurationMode,
+        )
+
         dlg = ConfigurationDialog(
-            self, 'Configuration', True, fromEric=False,
-            displayMode=ConfigurationMode.WEBBROWSERMODE)
+            self,
+            "Configuration",
+            True,
+            fromEric=False,
+            displayMode=ConfigurationMode.WEBBROWSERMODE,
+        )
         dlg.preferencesChanged.connect(self.preferencesChanged)
         dlg.masterPasswordChanged.connect(
-            lambda old, new: self.masterPasswordChanged(old, new, local=True))
+            lambda old, new: self.masterPasswordChanged(old, new, local=True)
+        )
         dlg.show()
         if self.__lastConfigurationPageName:
             dlg.showConfigurationPageByName(self.__lastConfigurationPageName)
@@ -3243,49 +3672,49 @@
             Preferences.syncPreferences()
             self.preferencesChanged()
         self.__lastConfigurationPageName = dlg.getConfigurationPageName()
-    
+
     @pyqtSlot()
     def preferencesChanged(self):
         """
         Public slot to handle a change of preferences.
         """
-        self.setStyle(Preferences.getUI("Style"),
-                      Preferences.getUI("StyleSheet"))
-        
+        self.setStyle(Preferences.getUI("Style"), Preferences.getUI("StyleSheet"))
+
         self.__initWebEngineSettings()
-        
+
         self.networkManager().preferencesChanged()
-        
+
         self.historyManager().preferencesChanged()
-        
+
         self.__tabWidget.preferencesChanged()
-        
+
         self.__navigationBar.searchEdit().preferencesChanged()
-        
+
         self.autoScroller().preferencesChanged()
-        
+
         profile = self.webProfile()
         if not self.isPrivate():
             if Preferences.getWebBrowser("DiskCacheEnabled"):
-                profile.setHttpCacheType(
-                    QWebEngineProfile.HttpCacheType.DiskHttpCache)
+                profile.setHttpCacheType(QWebEngineProfile.HttpCacheType.DiskHttpCache)
                 profile.setHttpCacheMaximumSize(
-                    Preferences.getWebBrowser("DiskCacheSize") * 1024 * 1024)
+                    Preferences.getWebBrowser("DiskCacheSize") * 1024 * 1024
+                )
             else:
                 profile.setHttpCacheType(
-                    QWebEngineProfile.HttpCacheType.MemoryHttpCache)
+                    QWebEngineProfile.HttpCacheType.MemoryHttpCache
+                )
                 profile.setHttpCacheMaximumSize(0)
-        
+
         with contextlib.suppress(AttributeError):
-            profile.setSpellCheckEnabled(
-                Preferences.getWebBrowser("SpellCheckEnabled"))
+            profile.setSpellCheckEnabled(Preferences.getWebBrowser("SpellCheckEnabled"))
             profile.setSpellCheckLanguages(
-                Preferences.getWebBrowser("SpellCheckLanguages"))
-        
+                Preferences.getWebBrowser("SpellCheckLanguages")
+            )
+
         self.__virusTotal.preferencesChanged()
         if (
-            not Preferences.getWebBrowser("VirusTotalEnabled") or
-            Preferences.getWebBrowser("VirusTotalServiceKey") == ""
+            not Preferences.getWebBrowser("VirusTotalEnabled")
+            or Preferences.getWebBrowser("VirusTotalServiceKey") == ""
         ):
             self.virustotalScanCurrentAct.setEnabled(False)
             self.virustotalIpReportAct.setEnabled(False)
@@ -3294,16 +3723,16 @@
             self.virustotalScanCurrentAct.setEnabled(True)
             self.virustotalIpReportAct.setEnabled(True)
             self.virustotalDomainReportAct.setEnabled(True)
-        
+
         self.__javaScriptIcon.preferencesChanged()
-        
+
         if not WebBrowserWindow.isPrivate():
             self.sessionManager().preferencesChanged()
-    
+
     def masterPasswordChanged(self, oldPassword, newPassword, local=False):
         """
         Public slot to handle the change of the master password.
-        
+
         @param oldPassword current master password
         @type str
         @param newPassword new master password
@@ -3317,61 +3746,62 @@
             # we were called from our local configuration dialog
             Preferences.convertPasswords(oldPassword, newPassword)
             Utilities.crypto.changeRememberedMaster(newPassword)
-    
+
     @pyqtSlot()
     def __showAcceptedLanguages(self):
         """
         Private slot to configure the accepted languages for web pages.
         """
         from .WebBrowserLanguagesDialog import WebBrowserLanguagesDialog
+
         dlg = WebBrowserLanguagesDialog(self)
         dlg.exec()
         self.networkManager().languagesChanged()
-    
+
     @pyqtSlot()
     def __showCookiesConfiguration(self):
         """
         Private slot to configure the cookies handling.
         """
-        from .CookieJar.CookiesConfigurationDialog import (
-            CookiesConfigurationDialog
-        )
+        from .CookieJar.CookiesConfigurationDialog import CookiesConfigurationDialog
+
         dlg = CookiesConfigurationDialog(self)
         dlg.exec()
-    
+
     @classmethod
     def setUseQtHelp(cls, use):
         """
         Class method to set the QtHelp usage.
-        
+
         @param use flag indicating usage (boolean)
         """
         if use:
             cls._useQtHelp = use and QTHELP_AVAILABLE
         else:
             cls._useQtHelp = False
-    
+
     @classmethod
     def helpEngine(cls):
         """
         Class method to get a reference to the help engine.
-        
+
         @return reference to the help engine (QHelpEngine)
         """
         if cls._useQtHelp:
             if cls._helpEngine is None:
                 cls._helpEngine = QHelpEngine(
-                    WebBrowserWindow.getQtHelpCollectionFileName())
+                    WebBrowserWindow.getQtHelpCollectionFileName()
+                )
                 cls._helpEngine.setUsesFilterEngine(True)
             return cls._helpEngine
         else:
             return None
-    
+
     @classmethod
     def getQtHelpCollectionFileName(cls):
         """
         Class method to determine the name of the QtHelp collection file.
-        
+
         @return path of the QtHelp collection file
         @rtype str
         """
@@ -3379,62 +3809,64 @@
         if not os.path.exists(qthelpDir):
             os.makedirs(qthelpDir)
         return os.path.join(qthelpDir, "eric7help.qhc")
-    
+
     @classmethod
     def networkManager(cls):
         """
         Class method to get a reference to the network manager object.
-        
+
         @return reference to the network access manager (NetworkManager)
         """
         if cls._networkManager is None:
             from .Network.NetworkManager import NetworkManager
+
             cls._networkManager = NetworkManager(cls.helpEngine())
-        
+
         return cls._networkManager
-    
+
     @classmethod
     def cookieJar(cls):
         """
         Class method to get a reference to the cookie jar.
-        
+
         @return reference to the cookie jar (CookieJar)
         """
         if cls._cookieJar is None:
             from .CookieJar.CookieJar import CookieJar
+
             cls._cookieJar = CookieJar()
-        
+
         return cls._cookieJar
-    
+
     @pyqtSlot()
     def __clearIconsDatabase(self):
         """
         Private slot to clear the favicons databse.
         """
         WebIconProvider.instance().clear()
-    
+
     @pyqtSlot()
     def __showWebIconsDialog(self):
         """
         Private slot to show a dialog to manage the favicons database.
         """
         WebIconProvider.instance().showWebIconDialog()
-        
+
     @pyqtSlot(QUrl)
     def urlHandler(self, url):
         """
         Public slot used as desktop URL handler.
-        
+
         @param url URL to be handled
         @type QUrl
         """
         self.__linkActivated(url)
-    
+
     @pyqtSlot(QUrl)
     def __linkActivated(self, url):
         """
         Private slot to handle the selection of a link.
-        
+
         @param url URL to be shown
         @type QUrl
         """
@@ -3446,14 +3878,14 @@
             else:
                 cb.setUrl(url)
             self.__activating = False
-    
+
     @pyqtSlot()
     def __activateCurrentBrowser(self):
         """
         Private slot to activate the current browser.
         """
         self.currentBrowser().setFocus()
-        
+
     @pyqtSlot()
     def __syncTOC(self):
         """
@@ -3465,40 +3897,40 @@
                 self.__showTocWindow()
                 if not self.__tocWindow.syncToContent(url):
                     self.statusBar().showMessage(
-                        self.tr("Could not find any associated content."),
-                        5000)
-        
+                        self.tr("Could not find any associated content."), 5000
+                    )
+
     def __showTocWindow(self):
         """
         Private method to show the table of contents window.
         """
         if WebBrowserWindow._useQtHelp:
             self.__activateDock(self.__tocWindow)
-        
+
     def __showIndexWindow(self):
         """
         Private method to show the index window.
         """
         if WebBrowserWindow._useQtHelp:
             self.__activateDock(self.__indexWindow)
-        
+
     def __showSearchWindow(self):
         """
         Private method to show the search window.
         """
         if WebBrowserWindow._useQtHelp:
             self.__activateDock(self.__searchWindow)
-        
+
     def __activateDock(self, widget):
         """
         Private method to activate the dock widget of the given widget.
-        
+
         @param widget reference to the widget to be activated (QWidget)
         """
         widget.parent().show()
         widget.parent().raise_()
         widget.setFocus()
-    
+
     @pyqtSlot()
     def __setupFilterCombo(self):
         """
@@ -3516,19 +3948,19 @@
                 for helpFilter in sorted(allFilters):
                     self.filterCombo.addItem(helpFilter, helpFilter)
             self.filterCombo.setCurrentText(activeFilter)
-    
+
     @pyqtSlot(int)
     def __filterQtHelpDocumentation(self, index):
         """
         Private slot to filter the QtHelp documentation.
-        
+
         @param index index of the selected QtHelp documentation filter
         @type int
         """
         if self.__helpEngine:
             helpFilter = self.filterCombo.itemData(index)
             self.__helpEngine.filterEngine().setActiveFilter(helpFilter)
-    
+
     @pyqtSlot()
     def __manageQtHelpDocumentation(self):
         """
@@ -3536,20 +3968,20 @@
         """
         if WebBrowserWindow._useQtHelp:
             from .QtHelp.QtHelpDocumentationConfigurationDialog import (
-                QtHelpDocumentationConfigurationDialog
+                QtHelpDocumentationConfigurationDialog,
             )
-            dlg = QtHelpDocumentationConfigurationDialog(
-                self.__helpEngine, self)
+
+            dlg = QtHelpDocumentationConfigurationDialog(self.__helpEngine, self)
             dlg.exec()
-        
+
     def getSourceFileList(self):
         """
         Public method to get a list of all opened source files.
-        
+
         @return dictionary with tab id as key and host/namespace as value
         """
         return self.__tabWidget.getSourceFileList()
-    
+
     @pyqtSlot()
     def __indexingStarted(self):
         """
@@ -3561,23 +3993,23 @@
                 self.__indexingProgress = QWidget()
                 layout = QHBoxLayout(self.__indexingProgress)
                 layout.setContentsMargins(0, 0, 0, 0)
-                sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred,
-                                         QSizePolicy.Policy.Maximum)
-                
+                sizePolicy = QSizePolicy(
+                    QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Maximum
+                )
+
                 label = QLabel(self.tr("Updating search index"))
                 label.setSizePolicy(sizePolicy)
                 layout.addWidget(label)
-                
+
                 progressBar = QProgressBar()
                 progressBar.setRange(0, 0)
                 progressBar.setTextVisible(False)
                 progressBar.setFixedHeight(16)
                 progressBar.setSizePolicy(sizePolicy)
                 layout.addWidget(progressBar)
-                
-                self.statusBar().insertPermanentWidget(
-                    0, self.__indexingProgress)
-    
+
+                self.statusBar().insertPermanentWidget(0, self.__indexingProgress)
+
     @pyqtSlot()
     def __indexingFinished(self):
         """
@@ -3587,37 +4019,34 @@
             self.statusBar().removeWidget(self.__indexingProgress)
             self.__indexingProgress = None
             self.__indexing = False
-    
+
     @pyqtSlot(str)
     def __searchForWord(self, searchWord):
         """
         Private slot to search for a word.
-        
+
         @param searchWord word to search for
         @type str
         """
         if WebBrowserWindow._useQtHelp and searchWord:
             if self.__indexing:
                 # Try again a second later
-                QTimer.singleShot(
-                    1000,
-                    lambda: self.__searchForWord(searchWord)
-                )
+                QTimer.singleShot(1000, lambda: self.__searchForWord(searchWord))
             else:
                 self.__searchDock.show()
                 self.__searchDock.raise_()
                 self.__searchEngine.search(searchWord)
-        
+
     def search(self, word):
         """
         Public method to search for a word.
-        
+
         @param word word to search for
         @type str
         """
         if WebBrowserWindow._useQtHelp:
             self.__searchForWord(word)
-    
+
     @pyqtSlot()
     def __removeOldDocumentation(self):
         """
@@ -3628,7 +4057,7 @@
                 docFile = self.__helpEngine.documentationFileName(namespace)
                 if not os.path.exists(docFile):
                     self.__helpEngine.unregisterDocumentation(namespace)
-    
+
     @pyqtSlot()
     def __lookForNewDocumentation(self):
         """
@@ -3637,77 +4066,78 @@
         """
         if WebBrowserWindow._useQtHelp:
             from .QtHelp.HelpDocsInstaller import HelpDocsInstaller
-            self.__helpInstaller = HelpDocsInstaller(
-                self.__helpEngine.collectionFile())
-            self.__helpInstaller.errorMessage.connect(
-                self.__showInstallationError)
+
+            self.__helpInstaller = HelpDocsInstaller(self.__helpEngine.collectionFile())
+            self.__helpInstaller.errorMessage.connect(self.__showInstallationError)
             self.__helpInstaller.docsInstalled.connect(self.__docsInstalled)
-            
-            self.statusBar().showMessage(
-                self.tr("Looking for Documentation..."))
+
+            self.statusBar().showMessage(self.tr("Looking for Documentation..."))
             self.__helpInstaller.installDocs()
-    
+
     @pyqtSlot(str)
     def __showInstallationError(self, message):
         """
         Private slot to show installation errors.
-        
+
         @param message message to be shown
         @type str
         """
-        EricMessageBox.warning(
-            self,
-            self.tr("eric Web Browser"),
-            message)
-    
+        EricMessageBox.warning(self, self.tr("eric Web Browser"), message)
+
     @pyqtSlot(bool)
     def __docsInstalled(self, installed):
         """
         Private slot handling the end of documentation installation.
-        
+
         @param installed flag indicating that documents were installed
         @type bool
         """
         if WebBrowserWindow._useQtHelp:
             self.statusBar().clearMessage()
             self.__helpEngine.setupData()
-    
+
     @pyqtSlot(str)
     def __warning(self, msg):
         """
         Private slot handling warnings from the help engine.
-        
+
         @param msg message sent by the help  engine
         @type str
         """
-        EricMessageBox.warning(
-            self,
-            self.tr("Help Engine"), msg)
-    
+        EricMessageBox.warning(self, self.tr("Help Engine"), msg)
+
     @pyqtSlot()
     def __aboutToShowSettingsMenu(self):
         """
         Private slot to show the Settings menu.
         """
-        self.editMessageFilterAct.setEnabled(
-            EricErrorMessage.messageHandlerInstalled())
-    
+        self.editMessageFilterAct.setEnabled(EricErrorMessage.messageHandlerInstalled())
+
     @pyqtSlot()
     def __clearPrivateData(self):
         """
         Private slot to clear the private data.
         """
-        from .WebBrowserClearPrivateDataDialog import (
-            WebBrowserClearPrivateDataDialog
-        )
+        from .WebBrowserClearPrivateDataDialog import WebBrowserClearPrivateDataDialog
+
         dlg = WebBrowserClearPrivateDataDialog(self)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             # browsing history, search history, favicons, disk cache, cookies,
             # passwords, web databases, downloads, zoom values, SSL error
             # exceptions, history period
-            (history, searches, favicons, cache, cookies,
-             passwords, databases, downloads, zoomValues,
-             sslExceptions, historyPeriod) = dlg.getData()
+            (
+                history,
+                searches,
+                favicons,
+                cache,
+                cookies,
+                passwords,
+                databases,
+                downloads,
+                zoomValues,
+                sslExceptions,
+                historyPeriod,
+            ) = dlg.getData()
             if history:
                 self.historyManager().clear(historyPeriod)
                 self.__tabWidget.clearClosedTabsList()
@@ -3735,108 +4165,109 @@
                 ZoomManager.instance().clear()
             if sslExceptions:
                 self.networkManager().clearSslExceptions()
-    
+
     @pyqtSlot()
     def __showEnginesConfigurationDialog(self):
         """
         Private slot to show the search engines configuration dialog.
         """
         from .OpenSearch.OpenSearchDialog import OpenSearchDialog
-        
+
         dlg = OpenSearchDialog(self)
         dlg.exec()
-        
+
     def searchEnginesAction(self):
         """
         Public method to get a reference to the search engines configuration
         action.
-        
+
         @return reference to the search engines configuration action (QAction)
         """
         return self.searchEnginesAct
-    
+
     @pyqtSlot()
     def __showPasswordsDialog(self):
         """
         Private slot to show the passwords management dialog.
         """
         from .Passwords.PasswordsDialog import PasswordsDialog
-        
+
         dlg = PasswordsDialog(self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __showCertificateErrorsDialog(self):
         """
         Private slot to show the certificate errors management dialog.
         """
         self.networkManager().showSslErrorExceptionsDialog()
-    
+
     @pyqtSlot()
     def __showAdBlockDialog(self):
         """
         Private slot to show the AdBlock configuration dialog.
         """
         self.adBlockManager().showDialog()
-    
+
     @pyqtSlot()
     def __showPersonalInformationDialog(self):
         """
         Private slot to show the Personal Information configuration dialog.
         """
         self.personalInformationManager().showConfigurationDialog()
-    
+
     @pyqtSlot()
     def __showGreaseMonkeyConfigDialog(self):
         """
         Private slot to show the GreaseMonkey scripts configuration dialog.
         """
         self.greaseMonkeyManager().showConfigurationDialog()
-    
+
     @pyqtSlot()
     def __showFeaturePermissionDialog(self):
         """
         Private slot to show the feature permission dialog.
         """
         self.featurePermissionManager().showFeaturePermissionsDialog()
-    
+
     @pyqtSlot()
     def __showZoomValuesDialog(self):
         """
         Private slot to show the zoom values management dialog.
         """
         from .ZoomManager.ZoomValuesDialog import ZoomValuesDialog
-        
+
         dlg = ZoomValuesDialog(self)
         dlg.exec()
-    
+
     @pyqtSlot()
     def __showDownloadsWindow(self):
         """
         Private slot to show the downloads dialog.
         """
         self.downloadManager().show()
-    
+
     @pyqtSlot()
     def __showPageSource(self):
         """
         Private slot to show the source of the current page in an editor.
         """
         self.currentBrowser().page().toHtml(self.__showPageSourceCallback)
-        
+
     def __showPageSourceCallback(self, src):
         """
         Private method to show the source of the current page in an editor.
-        
+
         @param src source of the web page
         @type str
         """
         from QScintilla.MiniEditor import MiniEditor
+
         editor = MiniEditor(parent=self)
         editor.setText(src, "Html")
         editor.setLanguage("dummy.html")
         editor.show()
-    
+
     @pyqtSlot()
     def __toggleJavaScriptConsole(self):
         """
@@ -3846,21 +4277,21 @@
             self.__javascriptConsoleDock.hide()
         else:
             self.__javascriptConsoleDock.show()
-    
+
     def javascriptConsole(self):
         """
         Public method to get a reference to the JavaScript console widget.
-        
+
         @return reference to the JavaScript console
         @rtype WebBrowserJavaScriptConsole
         """
         return self.__javascriptConsole
-    
+
     @classmethod
     def icon(cls, url):
         """
         Class method to get the icon for an URL.
-        
+
         @param url URL to get icon for (QUrl)
         @return icon for the URL (QIcon)
         """
@@ -3870,80 +4301,81 @@
     def bookmarksManager(cls):
         """
         Class method to get a reference to the bookmarks manager.
-        
+
         @return reference to the bookmarks manager (BookmarksManager)
         """
         if cls._bookmarksManager is None:
             from .Bookmarks.BookmarksManager import BookmarksManager
+
             cls._bookmarksManager = BookmarksManager()
-        
+
         return cls._bookmarksManager
-    
+
     @pyqtSlot(QUrl)
     @pyqtSlot(QUrl, str)
     def openUrl(self, url, title=None):
         """
         Public slot to load a URL in the current tab.
-        
+
         @param url URL to be opened
         @type QUrl
         @param title title of the bookmark
         @type str
         """
         self.__linkActivated(url)
-    
+
     @pyqtSlot(QUrl)
     @pyqtSlot(QUrl, str)
     def openUrlNewTab(self, url, title=None):
         """
         Public slot to load a URL in a new tab.
-        
+
         @param url URL to be opened
         @type QUrl
         @param title title of the bookmark
         @type str
         """
         self.newTab(url)
-    
+
     @pyqtSlot(QUrl)
     @pyqtSlot(QUrl, str)
     def openUrlNewBackgroundTab(self, url, title=None):
         """
         Public slot to load a URL in a new background tab.
-        
+
         @param url URL to be opened
         @type QUrl
         @param title title of the bookmark
         @type str
         """
         self.newTab(url, background=True)
-    
+
     @pyqtSlot(QUrl)
     @pyqtSlot(QUrl, str)
     def openUrlNewWindow(self, url, title=None):
         """
         Public slot to load a URL in a new window.
-        
+
         @param url URL to be opened
         @type QUrl
         @param title title of the bookmark
         @type str
         """
         self.newWindow(url)
-    
+
     @pyqtSlot(QUrl)
     @pyqtSlot(QUrl, str)
     def openUrlNewPrivateWindow(self, url, title=None):
         """
         Public slot to load a URL in a new private window.
-        
+
         @param url URL to be opened
         @type QUrl
         @param title title of the bookmark
         @type str
         """
         self.newPrivateWindow(url)
-    
+
     @pyqtSlot()
     def __sendPageLink(self):
         """
@@ -3953,192 +4385,200 @@
         if not url.isEmpty():
             urlStr = url.toString()
             QDesktopServices.openUrl(QUrl("mailto:?body=" + urlStr))
-    
+
     @classmethod
     def historyManager(cls):
         """
         Class method to get a reference to the history manager.
-        
+
         @return reference to the history manager (HistoryManager)
         """
         if cls._historyManager is None:
             from .History.HistoryManager import HistoryManager
+
             cls._historyManager = HistoryManager()
-        
+
         return cls._historyManager
-        
+
     @classmethod
     def passwordManager(cls):
         """
         Class method to get a reference to the password manager.
-        
+
         @return reference to the password manager (PasswordManager)
         """
         if cls._passwordManager is None:
             from .Passwords.PasswordManager import PasswordManager
+
             cls._passwordManager = PasswordManager()
-        
+
         return cls._passwordManager
-    
+
     @classmethod
     def adBlockManager(cls):
         """
         Class method to get a reference to the AdBlock manager.
-        
+
         @return reference to the AdBlock manager (AdBlockManager)
         """
         if cls._adblockManager is None:
             from .AdBlock.AdBlockManager import AdBlockManager
+
             cls._adblockManager = AdBlockManager()
-        
+
         return cls._adblockManager
-    
+
     def adBlockIcon(self):
         """
         Public method to get a reference to the AdBlock icon.
-        
+
         @return reference to the AdBlock icon (AdBlockIcon)
         """
         return self.__adBlockIcon
-    
+
     @classmethod
     def downloadManager(cls):
         """
         Class method to get a reference to the download manager.
-        
+
         @return reference to the download manager (DownloadManager)
         """
         if cls._downloadManager is None:
             from .Download.DownloadManager import DownloadManager
+
             cls._downloadManager = DownloadManager()
-        
+
         return cls._downloadManager
-        
+
     @classmethod
     def personalInformationManager(cls):
         """
         Class method to get a reference to the personal information manager.
-        
+
         @return reference to the personal information manager
             (PersonalInformationManager)
         """
         if cls._personalInformationManager is None:
             from .PersonalInformationManager import PersonalInformationManager
+
             cls._personalInformationManager = (
                 PersonalInformationManager.PersonalInformationManager()
             )
-        
+
         return cls._personalInformationManager
-        
+
     @classmethod
     def greaseMonkeyManager(cls):
         """
         Class method to get a reference to the GreaseMonkey manager.
-        
+
         @return reference to the GreaseMonkey manager (GreaseMonkeyManager)
         """
         if cls._greaseMonkeyManager is None:
             from .GreaseMonkey.GreaseMonkeyManager import GreaseMonkeyManager
+
             cls._greaseMonkeyManager = GreaseMonkeyManager()
-        
+
         return cls._greaseMonkeyManager
-        
+
     @classmethod
     def featurePermissionManager(cls):
         """
         Class method to get a reference to the feature permission manager.
-        
+
         @return reference to the feature permission manager
         @rtype FeaturePermissionManager
         """
         if cls._featurePermissionManager is None:
             from .FeaturePermissions.FeaturePermissionManager import (
-                FeaturePermissionManager
+                FeaturePermissionManager,
             )
+
             cls._featurePermissionManager = FeaturePermissionManager()
-        
+
         return cls._featurePermissionManager
-        
+
     @classmethod
     def imageSearchEngine(cls):
         """
         Class method to get a reference to the image search engine.
-        
+
         @return reference to the image finder object
         @rtype ImageSearchEngine
         """
         if cls._imageSearchEngine is None:
-            from .ImageSearch.ImageSearchEngine import (
-                ImageSearchEngine
-            )
+            from .ImageSearch.ImageSearchEngine import ImageSearchEngine
+
             cls._imageSearchEngine = ImageSearchEngine()
-        
+
         return cls._imageSearchEngine
-        
+
     @classmethod
     def autoScroller(cls):
         """
         Class method to get a reference to the auto scroller.
-        
+
         @return reference to the auto scroller object
         @rtype AutoScroller
         """
         if cls._autoScroller is None:
             from .AutoScroll.AutoScroller import AutoScroller
+
             cls._autoScroller = AutoScroller()
-        
+
         return cls._autoScroller
-        
+
     @classmethod
     def tabManager(cls):
         """
         Class method to get a reference to the tab manager widget.
-        
+
         @return reference to the tab manager widget
         @rtype TabManagerWidget
         """
         if cls._tabManager is None:
             from .TabManager.TabManagerWidget import TabManagerWidget
+
             cls._tabManager = TabManagerWidget(cls.mainWindow())
-            
+
             # do the connections
             for window in cls.mainWindows():
                 cls._tabManager.mainWindowCreated(window, False)
-            
+
             cls._tabManager.delayedRefreshTree()
-        
+
         return cls._tabManager
-    
+
     def __showTabManager(self, act):
         """
         Private method to show the tab manager window.
-        
+
         @param act reference to the act that triggered
         @type QAction
         """
         self.tabManager().raiseTabManager(act)
-    
+
     @classmethod
     def mainWindow(cls):
         """
         Class method to get a reference to the main window.
-        
+
         @return reference to the main window (WebBrowserWindow)
         """
         if cls.BrowserWindows:
             return cls.BrowserWindows[0]
         else:
             return None
-    
+
     @classmethod
     def mainWindows(cls):
         """
         Class method to get references to all main windows.
-        
+
         @return references to all main window (list of WebBrowserWindow)
         """
         return cls.BrowserWindows
-    
+
     @pyqtSlot()
     def __appFocusChanged(self):
         """
@@ -4147,34 +4587,33 @@
         focusWindow = ericApp().activeWindow()
         if isinstance(focusWindow, WebBrowserWindow):
             WebBrowserWindow._lastActiveWindow = focusWindow
-    
+
     @classmethod
     def getWindow(cls):
         """
         Class method to get a reference to the most recent active
         web browser window.
-        
+
         @return reference to most recent web browser window
         @rtype WebBrowserWindow
         """
         if cls._lastActiveWindow:
             return cls._lastActiveWindow
-        
+
         return cls.mainWindow()
-    
+
     def openSearchManager(self):
         """
         Public method to get a reference to the opensearch manager object.
-        
+
         @return reference to the opensearch manager object (OpenSearchManager)
         """
         return self.__navigationBar.searchEdit().openSearchManager()
-    
-    def __createTextEncodingAction(self, codec, defaultCodec, parentMenu,
-                                   name=None):
+
+    def __createTextEncodingAction(self, codec, defaultCodec, parentMenu, name=None):
         """
         Private method to create an action for the text encoding menu.
-        
+
         @param codec name of the codec to create an action for
         @type str
         @param defaultCodec name of the default codec
@@ -4189,13 +4628,13 @@
         act.setCheckable(True)
         if defaultCodec == codec:
             act.setChecked(True)
-        
+
         parentMenu.addAction(act)
-    
+
     def __createTextEncodingSubmenu(self, title, codecNames, parentMenu):
         """
         Private method to create a text encoding sub menu.
-        
+
         @param title title of the menu
         @type str
         @param codecNames list of codec names for the menu
@@ -4205,34 +4644,34 @@
         """
         if codecNames:
             defaultCodec = self.webSettings().defaultTextEncoding().lower()
-            
+
             menu = QMenu(title, parentMenu)
             for codec in codecNames:
                 self.__createTextEncodingAction(codec, defaultCodec, menu)
-            
+
             parentMenu.addMenu(menu)
-    
+
     @pyqtSlot()
     def __aboutToShowTextEncodingMenu(self):
         """
         Private slot to populate the text encoding menu.
         """
         self.__textEncodingMenu.clear()
-        
+
         defaultTextEncoding = self.webSettings().defaultTextEncoding().lower()
         currentCodec = (
             defaultTextEncoding
-            if defaultTextEncoding in Utilities.supportedCodecs else
-            ""
-        )
-        
+            if defaultTextEncoding in Utilities.supportedCodecs
+            else ""
+        )
+
         isoCodecs = []
         winCodecs = []
         uniCodecs = []
         cpCodecs = []
         macCodecs = []
         otherCodecs = []
-        
+
         for codec in sorted(Utilities.supportedCodecs):
             if codec.startswith(("iso-", "latin")):
                 isoCodecs.append(codec)
@@ -4246,29 +4685,36 @@
                 macCodecs.append(codec)
             else:
                 otherCodecs.append(codec)
-        
+
         self.__createTextEncodingAction(
-            "", currentCodec, self.__textEncodingMenu, name=self.tr("System"))
+            "", currentCodec, self.__textEncodingMenu, name=self.tr("System")
+        )
         self.__textEncodingMenu.addSeparator()
-        self.__createTextEncodingSubmenu(self.tr("ISO"), isoCodecs,
-                                         self.__textEncodingMenu)
-        self.__createTextEncodingSubmenu(self.tr("Unicode"), uniCodecs,
-                                         self.__textEncodingMenu)
-        self.__createTextEncodingSubmenu(self.tr("Windows"), winCodecs,
-                                         self.__textEncodingMenu)
-        self.__createTextEncodingSubmenu(self.tr("IBM"), cpCodecs,
-                                         self.__textEncodingMenu)
-        self.__createTextEncodingSubmenu(self.tr("Apple"), macCodecs,
-                                         self.__textEncodingMenu)
-        self.__createTextEncodingSubmenu(self.tr("Other"), otherCodecs,
-                                         self.__textEncodingMenu)
-    
+        self.__createTextEncodingSubmenu(
+            self.tr("ISO"), isoCodecs, self.__textEncodingMenu
+        )
+        self.__createTextEncodingSubmenu(
+            self.tr("Unicode"), uniCodecs, self.__textEncodingMenu
+        )
+        self.__createTextEncodingSubmenu(
+            self.tr("Windows"), winCodecs, self.__textEncodingMenu
+        )
+        self.__createTextEncodingSubmenu(
+            self.tr("IBM"), cpCodecs, self.__textEncodingMenu
+        )
+        self.__createTextEncodingSubmenu(
+            self.tr("Apple"), macCodecs, self.__textEncodingMenu
+        )
+        self.__createTextEncodingSubmenu(
+            self.tr("Other"), otherCodecs, self.__textEncodingMenu
+        )
+
     @pyqtSlot(QAction)
     def __setTextEncoding(self, act):
         """
         Private slot to set the selected text encoding as the default for
         this session.
-        
+
         @param act reference to the selected action
         @type QAction
         """
@@ -4277,35 +4723,36 @@
             self.webSettings().setDefaultTextEncoding("")
         else:
             self.webSettings().setDefaultTextEncoding(codec)
-    
+
     def __populateToolbarsMenu(self, menu):
         """
         Private method to populate the toolbars menu.
-        
+
         @param menu reference to the menu to be populated
         @type QMenu
         """
         menu.clear()
-        
+
         act = menu.addAction(self.tr("Menu Bar"))
         act.setCheckable(True)
         act.setChecked(not self.menuBar().isHidden())
         act.setData("menubar")
-        
+
         act = menu.addAction(self.tr("Bookmarks"))
         act.setCheckable(True)
         act.setChecked(not self.__bookmarksToolBar.isHidden())
         act.setData("bookmarks")
-        
+
         act = menu.addAction(self.tr("Status Bar"))
         act.setCheckable(True)
         act.setChecked(not self.statusBar().isHidden())
         act.setData("statusbar")
-        
+
         if Preferences.getWebBrowser("ShowToolbars"):
             menu.addSeparator()
-            for name, (text, tb) in sorted(self.__toolbars.items(),
-                                           key=lambda t: t[1][0]):
+            for name, (text, tb) in sorted(
+                self.__toolbars.items(), key=lambda t: t[1][0]
+            ):
                 act = menu.addAction(text)
                 act.setCheckable(True)
                 act.setChecked(not tb.isHidden())
@@ -4315,21 +4762,21 @@
             act.setData("__SHOW__")
             act = menu.addAction(self.tr("&Hide all"))
             act.setData("__HIDE__")
-    
+
     def createPopupMenu(self):
         """
         Public method to create the toolbars menu for Qt.
-        
+
         @return toolbars menu
         @rtype QMenu
         """
         menu = QMenu(self)
         menu.triggered.connect(self.__TBMenuTriggered)
-        
+
         self.__populateToolbarsMenu(menu)
-        
+
         return menu
-    
+
     @pyqtSlot()
     def __showToolbarsMenu(self):
         """
@@ -4341,7 +4788,7 @@
         """
         Private method to handle the toggle of a toolbar via the Window->
         Toolbars submenu or the toolbars popup menu.
-        
+
         @param act reference to the action that was triggered
         @type QAction
         """
@@ -4350,34 +4797,34 @@
             if name == "bookmarks":
                 # special handling of bookmarks toolbar
                 self.__setBookmarksToolbarVisibility(act.isChecked())
-            
+
             elif name == "menubar":
                 # special treatment of the menu bar
                 self.__setMenuBarVisibility(act.isChecked())
-            
+
             elif name == "statusbar":
                 # special treatment of the status bar
                 self.__setStatusBarVisible(act.isChecked())
-            
+
             elif name == "__SHOW__":
                 for _text, tb in list(self.__toolbars.values()):
                     tb.show()
-            
+
             elif name == "__HIDE__":
                 for _text, tb in list(self.__toolbars.values()):
                     tb.hide()
-            
+
             else:
                 tb = self.__toolbars[name][1]
                 if act.isChecked():
                     tb.show()
                 else:
                     tb.hide()
-    
+
     def __setBookmarksToolbarVisibility(self, visible):
         """
         Private method to set the visibility of the bookmarks toolbar.
-        
+
         @param visible flag indicating the toolbar visibility
         @type bool
         """
@@ -4385,14 +4832,14 @@
             self.__bookmarksToolBar.show()
         else:
             self.__bookmarksToolBar.hide()
-        
+
         # save state for next invokation
         Preferences.setWebBrowser("BookmarksToolBarVisible", visible)
-    
+
     def __setMenuBarVisibility(self, visible):
         """
         Private method to set the visibility of the menu bar.
-        
+
         @param visible flag indicating the menu bar visibility
         @type bool
         """
@@ -4402,33 +4849,34 @@
         else:
             self.menuBar().hide()
             self.__navigationBar.superMenuButton().show()
-        
+
         Preferences.setWebBrowser("MenuBarVisible", visible)
-    
+
     def __setStatusBarVisible(self, visible):
         """
         Private method to set the visibility of the status bar.
-        
+
         @param visible flag indicating the status bar visibility
         @type bool
         """
         self.statusBar().setVisible(visible)
-        
+
         Preferences.setWebBrowser("StatusBarVisible", visible)
-    
+
     @classmethod
     def feedsManager(cls):
         """
         Class method to get a reference to the RSS feeds manager.
-        
+
         @return reference to the RSS feeds manager (FeedsManager)
         """
         if cls._feedsManager is None:
             from .Feeds.FeedsManager import FeedsManager
+
             cls._feedsManager = FeedsManager()
-        
+
         return cls._feedsManager
-    
+
     @pyqtSlot()
     def __showFeedsManager(self):
         """
@@ -4440,14 +4888,13 @@
         feedsManager.newBackgroundTab.connect(self.openUrlNewBackgroundTab)
         feedsManager.newWindow.connect(self.openUrlNewWindow)
         feedsManager.newPrivateWindow.connect(self.openUrlNewPrivateWindow)
-        feedsManager.rejected.connect(
-            lambda: self.__feedsManagerClosed(feedsManager))
+        feedsManager.rejected.connect(lambda: self.__feedsManagerClosed(feedsManager))
         feedsManager.show()
-    
+
     def __feedsManagerClosed(self, feedsManager):
         """
         Private slot to handle closing the feeds manager dialog.
-        
+
         @param feedsManager reference to the feeds manager object
         @type FeedsManager
         """
@@ -4457,13 +4904,14 @@
         feedsManager.newWindow.disconnect(self.openUrlNewWindow)
         feedsManager.newPrivateWindow.disconnect(self.openUrlNewPrivateWindow)
         feedsManager.rejected.disconnect()
-    
+
     @pyqtSlot()
     def __showSiteinfoDialog(self):
         """
         Private slot to show the site info dialog.
         """
         from .SiteInfo.SiteInfoDialog import SiteInfoDialog
+
         self.__siteinfoDialog = SiteInfoDialog(self.currentBrowser(), self)
         self.__siteinfoDialog.show()
 
@@ -4471,67 +4919,70 @@
     def userAgentsManager(cls):
         """
         Class method to get a reference to the user agents manager.
-        
+
         @return reference to the user agents manager (UserAgentManager)
         """
         if cls._userAgentsManager is None:
             from .UserAgent.UserAgentManager import UserAgentManager
+
             cls._userAgentsManager = UserAgentManager()
-        
+
         return cls._userAgentsManager
-    
+
     @pyqtSlot()
     def __showUserAgentsDialog(self):
         """
         Private slot to show the user agents management dialog.
         """
         from .UserAgent.UserAgentsDialog import UserAgentsDialog
-        
+
         dlg = UserAgentsDialog(self)
         dlg.exec()
-    
+
     @classmethod
     def syncManager(cls):
         """
         Class method to get a reference to the data synchronization manager.
-        
+
         @return reference to the data synchronization manager (SyncManager)
         """
         if cls._syncManager is None:
             from .Sync.SyncManager import SyncManager
+
             cls._syncManager = SyncManager()
-        
+
         return cls._syncManager
-    
+
     @pyqtSlot()
     def __showSyncDialog(self):
         """
         Private slot to show the synchronization dialog.
         """
         self.syncManager().showSyncDialog()
-    
+
     @classmethod
     def speedDial(cls):
         """
         Class method to get a reference to the speed dial.
-        
+
         @return reference to the speed dial (SpeedDial)
         """
         if cls._speedDial is None:
             from .SpeedDial.SpeedDial import SpeedDial
+
             cls._speedDial = SpeedDial()
-        
+
         return cls._speedDial
-    
+
     def keyPressEvent(self, evt):
         """
         Protected method to handle key presses.
-        
+
         @param evt reference to the key press event (QKeyEvent)
         """
         number = -1
         key = evt.key()
-        
+
         if key == Qt.Key.Key_1:
             number = 1
         elif key == Qt.Key.Key_2:
@@ -4552,35 +5003,34 @@
             number = 9
         elif key == Qt.Key.Key_0:
             number = 10
-        
+
         if number != -1:
             if evt.modifiers() == Qt.KeyboardModifier.AltModifier:
                 if number == 10:
                     number = self.__tabWidget.count()
                 self.__tabWidget.setCurrentIndex(number - 1)
                 return
-            
+
             if evt.modifiers() == Qt.KeyboardModifier.MetaModifier:
                 url = self.speedDial().urlForShortcut(number - 1)
                 if url.isValid():
                     self.__linkActivated(url)
                     return
-        
+
         super().keyPressEvent(evt)
-    
+
     def event(self, evt):
         """
         Public method handling events.
-        
+
         @param evt reference to the event
         @type QEvent
         @return flag indicating a handled event
         @rtype bool
         """
         if evt.type() == QEvent.Type.WindowStateChange:
-            if (
-                not bool(evt.oldState() & Qt.WindowState.WindowFullScreen) and
-                bool(self.windowState() & Qt.WindowState.WindowFullScreen)
+            if not bool(evt.oldState() & Qt.WindowState.WindowFullScreen) and bool(
+                self.windowState() & Qt.WindowState.WindowFullScreen
             ):
                 # enter full screen mode
                 self.__windowStates = evt.oldState()
@@ -4595,10 +5045,9 @@
                             toolbar.hide()
                 self.__navigationBar.exitFullScreenButton().setVisible(True)
                 self.__navigationContainer.hide()
-            
-            elif (
-                bool(evt.oldState() & Qt.WindowState.WindowFullScreen) and
-                not bool(self.windowState() & Qt.WindowState.WindowFullScreen)
+
+            elif bool(evt.oldState() & Qt.WindowState.WindowFullScreen) and not bool(
+                self.windowState() & Qt.WindowState.WindowFullScreen
             ):
                 # leave full screen mode
                 self.setWindowState(self.__windowStates)
@@ -4611,16 +5060,16 @@
                 self.__tabWidget.tabBar().show()
                 self.__navigationBar.exitFullScreenButton().setVisible(False)
                 self.__navigationContainer.show()
-            
+
             if self.__hideNavigationTimer:
                 self.__hideNavigationTimer.stop()
-        
+
         return super().event(evt)
-    
+
     ###########################################################################
     ## Interface to VirusTotal below                                         ##
     ###########################################################################
-    
+
     @pyqtSlot()
     def __virusTotalScanCurrentSite(self):
         """
@@ -4632,49 +5081,52 @@
             url = cb.url()
             if url.scheme() in ["http", "https", "ftp"]:
                 self.requestVirusTotalScan(url)
-    
+
     def requestVirusTotalScan(self, url):
         """
         Public method to submit a request to scan an URL by VirusTotal.
-        
+
         @param url URL to be scanned (QUrl)
         """
         self.__virusTotal.submitUrl(url)
-    
+
     @pyqtSlot(str)
     def __virusTotalSubmitUrlError(self, msg):
         """
         Private slot to handle an URL scan submission error.
-        
+
         @param msg error message
         @type str
         """
         EricMessageBox.critical(
             self,
             self.tr("VirusTotal Scan"),
-            self.tr("""<p>The VirusTotal scan could not be"""
-                    """ scheduled.<p>\n<p>Reason: {0}</p>""").format(msg))
-    
+            self.tr(
+                """<p>The VirusTotal scan could not be"""
+                """ scheduled.<p>\n<p>Reason: {0}</p>"""
+            ).format(msg),
+        )
+
     @pyqtSlot(str)
     def __virusTotalUrlScanReport(self, url):
         """
         Private slot to initiate the display of the URL scan report page.
-        
+
         @param url URL of the URL scan report page
         @type str
         """
         self.newTab(url)
-    
+
     @pyqtSlot(str)
     def __virusTotalFileScanReport(self, url):
         """
         Private slot to initiate the display of the file scan report page.
-        
+
         @param url URL of the file scan report page
         @type str
         """
         self.newTab(url)
-    
+
     @pyqtSlot()
     def __virusTotalIpAddressReport(self):
         """
@@ -4684,7 +5136,8 @@
             self,
             self.tr("IP Address Report"),
             self.tr("Enter a valid IPv4 address in dotted quad notation:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and ip:
             if ip.count(".") == 3:
                 self.__virusTotal.getIpAddressReport(ip)
@@ -4692,9 +5145,12 @@
                 EricMessageBox.information(
                     self,
                     self.tr("IP Address Report"),
-                    self.tr("""The given IP address is not in dotted quad"""
-                            """ notation."""))
-    
+                    self.tr(
+                        """The given IP address is not in dotted quad"""
+                        """ notation."""
+                    ),
+                )
+
     @pyqtSlot()
     def __virusTotalDomainReport(self):
         """
@@ -4704,61 +5160,61 @@
             self,
             self.tr("Domain Report"),
             self.tr("Enter a valid domain name:"),
-            QLineEdit.EchoMode.Normal)
+            QLineEdit.EchoMode.Normal,
+        )
         if ok and domain:
             self.__virusTotal.getDomainReport(domain)
-    
+
     ###########################################################################
     ## Style sheet handling below                                            ##
     ###########################################################################
-    
+
     def reloadUserStyleSheet(self):
         """
         Public method to reload the user style sheet.
         """
         styleSheet = Preferences.getWebBrowser("UserStyleSheet")
         self.__setUserStyleSheet(styleSheet)
-    
+
     def __setUserStyleSheet(self, styleSheetFile):
         """
         Private method to set a user style sheet.
-        
+
         @param styleSheetFile name of the user style sheet file (string)
         """
         name = "_eric_userstylesheet"
         userStyle = ""
-        
-        userStyle += (
-            WebBrowserTools.readAllFileContents(styleSheetFile)
-            .replace("\n", "")
-        )
-        
+
+        userStyle += WebBrowserTools.readAllFileContents(styleSheetFile).replace(
+            "\n", ""
+        )
+
         scripts = self.webProfile().scripts().find(name)
         if scripts:
             self.webProfile().scripts().remove(scripts[0])
-        
+
         if userStyle:
             from .WebBrowserPage import WebBrowserPage
 
             script = QWebEngineScript()
             script.setName(name)
-            script.setInjectionPoint(
-                QWebEngineScript.InjectionPoint.DocumentCreation)
+            script.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentCreation)
             script.setWorldId(WebBrowserPage.SafeJsWorld)
             script.setRunsOnSubFrames(True)
             script.setSourceCode(Scripts.setStyleSheet(userStyle))
             self.webProfile().scripts().insert(script)
-    
+
     ##########################################
     ## Support for desktop notifications below
     ##########################################
-    
+
     @classmethod
-    def showNotification(cls, icon, heading, text,
-                         kind=NotificationTypes.INFORMATION, timeout=None):
+    def showNotification(
+        cls, icon, heading, text, kind=NotificationTypes.INFORMATION, timeout=None
+    ):
         """
         Class method to show a desktop notification.
-        
+
         @param icon icon to be shown in the notification
         @type QPixmap
         @param heading heading of the notification
@@ -4773,26 +5229,28 @@
         """
         if cls._notification is None:
             from UI.NotificationWidget import NotificationWidget
+
             cls._notification = NotificationWidget()
-        
+
         if timeout is None:
             timeout = Preferences.getUI("NotificationTimeout")
         cls._notification.showNotification(
-            icon, heading, text, kind=kind, timeout=timeout)
-    
+            icon, heading, text, kind=kind, timeout=timeout
+        )
+
     ######################################
     ## Support for global status bar below
     ######################################
-    
+
     @classmethod
     def globalStatusBar(cls):
         """
         Class method to get a reference to a global status bar.
-        
+
         The global status bar is the status bar of the main window. If
         no such window exists and the web browser was called from the eric IDE,
         the status bar of the IDE is returned.
-        
+
         @return reference to the global status bar
         @rtype QStatusBar
         """
@@ -4800,30 +5258,30 @@
             return cls.BrowserWindows[0].statusBar()
         else:
             return None
-    
+
     ###################################
     ## Support for download files below
     ###################################
-    
+
     @classmethod
     def downloadRequested(cls, downloadRequest):
         """
         Class method to handle a download request.
-        
+
         @param downloadRequest reference to the download data
         @type QWebEngineDownloadRequest
         """
         cls.downloadManager().download(downloadRequest)
-    
+
     ########################################
     ## Support for web engine profiles below
     ########################################
-    
+
     @classmethod
     def webProfile(cls, private=False):
         """
         Class method handling the web engine profile.
-        
+
         @param private flag indicating the privacy mode
         @type bool
         @return reference to the web profile object
@@ -4834,211 +5292,217 @@
                 cls._webProfile = QWebEngineProfile()
             else:
                 cls._webProfile = QWebEngineProfile.defaultProfile()
-            cls._webProfile.downloadRequested.connect(
-                cls.downloadRequested)
-            
+            cls._webProfile.downloadRequested.connect(cls.downloadRequested)
+
             # add the default user agent string
             userAgent = cls._webProfile.httpUserAgent()
             cls._webProfile.defaultUserAgent = userAgent
-            
+
             if not private:
                 if Preferences.getWebBrowser("DiskCacheEnabled"):
                     cls._webProfile.setHttpCacheType(
-                        QWebEngineProfile.HttpCacheType.DiskHttpCache)
+                        QWebEngineProfile.HttpCacheType.DiskHttpCache
+                    )
                     cls._webProfile.setHttpCacheMaximumSize(
-                        Preferences.getWebBrowser("DiskCacheSize") *
-                        1024 * 1024)
-                    cls._webProfile.setCachePath(os.path.join(
-                        Utilities.getConfigDir(), "web_browser"))
+                        Preferences.getWebBrowser("DiskCacheSize") * 1024 * 1024
+                    )
+                    cls._webProfile.setCachePath(
+                        os.path.join(Utilities.getConfigDir(), "web_browser")
+                    )
                 else:
                     cls._webProfile.setHttpCacheType(
-                        QWebEngineProfile.HttpCacheType.MemoryHttpCache)
+                        QWebEngineProfile.HttpCacheType.MemoryHttpCache
+                    )
                     cls._webProfile.setHttpCacheMaximumSize(0)
-                cls._webProfile.setPersistentStoragePath(os.path.join(
-                    Utilities.getConfigDir(), "web_browser",
-                    "persistentstorage"))
+                cls._webProfile.setPersistentStoragePath(
+                    os.path.join(
+                        Utilities.getConfigDir(), "web_browser", "persistentstorage"
+                    )
+                )
                 cls._webProfile.setPersistentCookiesPolicy(
-                    QWebEngineProfile.PersistentCookiesPolicy
-                    .AllowPersistentCookies)
-            
+                    QWebEngineProfile.PersistentCookiesPolicy.AllowPersistentCookies
+                )
+
             with contextlib.suppress(AttributeError):
                 cls._webProfile.setSpellCheckEnabled(
-                    Preferences.getWebBrowser("SpellCheckEnabled"))
+                    Preferences.getWebBrowser("SpellCheckEnabled")
+                )
                 cls._webProfile.setSpellCheckLanguages(
-                    Preferences.getWebBrowser("SpellCheckLanguages"))
-            
+                    Preferences.getWebBrowser("SpellCheckLanguages")
+                )
+
             # Setup QWebChannel user scripts
             from .WebBrowserPage import WebBrowserPage
-            
+
             # WebChannel for SafeJsWorld
             script = QWebEngineScript()
             script.setName("_eric_webchannel")
-            script.setInjectionPoint(
-                QWebEngineScript.InjectionPoint.DocumentCreation)
+            script.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentCreation)
             script.setWorldId(WebBrowserPage.SafeJsWorld)
             script.setRunsOnSubFrames(True)
             script.setSourceCode(Scripts.setupWebChannel(script.worldId()))
             cls._webProfile.scripts().insert(script)
-            
+
             # WebChannel for UnsafeJsWorld
             script2 = QWebEngineScript()
             script2.setName("_eric_webchannel2")
-            script2.setInjectionPoint(
-                QWebEngineScript.InjectionPoint.DocumentCreation)
+            script2.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentCreation)
             script2.setWorldId(WebBrowserPage.UnsafeJsWorld)
             script2.setRunsOnSubFrames(True)
             script2.setSourceCode(Scripts.setupWebChannel(script2.worldId()))
             cls._webProfile.scripts().insert(script2)
-            
+
             # document.window object addons
             script3 = QWebEngineScript()
             script3.setName("_eric_window_object")
-            script3.setInjectionPoint(
-                QWebEngineScript.InjectionPoint.DocumentCreation)
+            script3.setInjectionPoint(QWebEngineScript.InjectionPoint.DocumentCreation)
             script3.setWorldId(WebBrowserPage.UnsafeJsWorld)
             script3.setRunsOnSubFrames(True)
             script3.setSourceCode(Scripts.setupWindowObject())
             cls._webProfile.scripts().insert(script3)
-        
+
         return cls._webProfile
-    
+
     @classmethod
     def webSettings(cls):
         """
         Class method to get the web settings of the current profile.
-        
+
         @return web settings of the current profile
         @rtype QWebEngineSettings
         """
         return cls.webProfile().settings()
-    
+
     ####################################################
     ## Methods below implement session related functions
     ####################################################
-    
+
     @classmethod
     def sessionManager(cls):
         """
         Class method to get a reference to the session manager.
-        
+
         @return reference to the session manager
         @rtype SessionManager
         """
         if cls._sessionManager is None and not cls._isPrivate:
             from .Session.SessionManager import SessionManager
+
             cls._sessionManager = SessionManager()
-        
+
         return cls._sessionManager
-    
+
     @pyqtSlot()
     def __showSessionManagerDialog(self):
         """
         Private slot to show the session manager dialog.
         """
         self.sessionManager().showSessionManagerDialog()
-    
+
     ##########################################################
     ## Methods below implement safe browsing related functions
     ##########################################################
-    
+
     @classmethod
     def safeBrowsingManager(cls):
         """
         Class method to get a reference to the safe browsing interface.
-        
+
         @return reference to the safe browsing manager
         @rtype SafeBrowsingManager
         """
         if cls._safeBrowsingManager is None:
             from .SafeBrowsing.SafeBrowsingManager import SafeBrowsingManager
+
             cls._safeBrowsingManager = SafeBrowsingManager()
-        
+
         return cls._safeBrowsingManager
-    
+
     @pyqtSlot()
     def __showSafeBrowsingDialog(self):
         """
         Private slot to show the safe browsing management dialog.
         """
         self.safeBrowsingManager().showSafeBrowsingDialog()
-    
+
     #############################################################
     ## Methods below implement protocol handler related functions
     #############################################################
-    
+
     @classmethod
     def protocolHandlerManager(cls):
         """
         Class method to get a reference to the protocol handler manager.
-        
+
         @return reference to the protocol handler manager
         @rtype ProtocolHandlerManager
         """
         if cls._protocolHandlerManager is None:
             from .Network.ProtocolHandlerManager import ProtocolHandlerManager
+
             cls._protocolHandlerManager = ProtocolHandlerManager()
-        
+
         return cls._protocolHandlerManager
-    
+
     @pyqtSlot()
     def __showProtocolHandlerManagerDialog(self):
         """
         Private slot to show the protocol handler manager dialog.
         """
         self.protocolHandlerManager().showProtocolHandlerManagerDialog()
-    
+
     ###############################################################
     ## Methods below implement single application related functions
     ###############################################################
-    
+
     @pyqtSlot(str)
     def __saLoadUrl(self, urlStr):
         """
         Private slot to load an URL received via the single application
         protocol.
-        
+
         @param urlStr URL to be loaded
         @type str
         """
         url = QUrl.fromUserInput(urlStr)
         self.__linkActivated(url)
-        
+
         self.raise_()
         self.activateWindow()
-    
+
     @pyqtSlot(str)
     def __saNewTab(self, urlStr):
         """
         Private slot to load an URL received via the single application
         protocol in a new tab.
-        
+
         @param urlStr URL to be loaded
         @type str
         """
         url = QUrl.fromUserInput(urlStr)
         self.newTab(url)
-        
+
         self.raise_()
         self.activateWindow()
-    
+
     @pyqtSlot(str)
     def __saSearchWord(self, word):
         """
         Private slot to search for the given word.
-        
+
         @param word word to be searched for
         @type str
         """
         if WebBrowserWindow._useQtHelp:
             self.__searchForWord(word)
-        
+
         self.raise_()
         self.activateWindow()
-    
+
     ######################################################
     ## Methods below implement shortcuts related functions
     ######################################################
-    
+
     @pyqtSlot()
     def __configShortcuts(self):
         """
@@ -5046,10 +5510,11 @@
         """
         if self.__shortcutsDialog is None:
             from Preferences.ShortcutsDialog import ShortcutsDialog
+
             self.__shortcutsDialog = ShortcutsDialog(self)
         self.__shortcutsDialog.populate(helpViewer=self)
         self.__shortcutsDialog.show()
-    
+
     @pyqtSlot()
     def __exportShortcuts(self):
         """
@@ -5061,31 +5526,36 @@
             "",
             self.tr("Keyboard Shortcuts File (*.ekj)"),
             "",
-            EricFileDialog.DontConfirmOverwrite)
-        
+            EricFileDialog.DontConfirmOverwrite,
+        )
+
         if not fn:
             return
-        
+
         fpath = pathlib.Path(fn)
         if not fpath.suffix:
             ex = selectedFilter.split("(*")[1].split(")")[0]
             if ex:
                 fpath = fpath.with_suffix(ex)
-        
+
         ok = (
             EricMessageBox.yesNo(
                 self,
                 self.tr("Export Keyboard Shortcuts"),
-                self.tr("""<p>The keyboard shortcuts file <b>{0}</b> exists"""
-                        """ already. Overwrite it?</p>""").format(fpath))
-            if fpath.exists() else
-            True
-        )
-        
+                self.tr(
+                    """<p>The keyboard shortcuts file <b>{0}</b> exists"""
+                    """ already. Overwrite it?</p>"""
+                ).format(fpath),
+            )
+            if fpath.exists()
+            else True
+        )
+
         if ok:
             from Preferences import Shortcuts
+
             Shortcuts.exportShortcuts(fn, helpViewer=self)
-    
+
     @pyqtSlot()
     def __importShortcuts(self):
         """
@@ -5095,9 +5565,12 @@
             None,
             self.tr("Import Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard Shortcuts File (*.ekj);;"
-                    "XML Keyboard shortcut file (*.e4k)"))
-        
+            self.tr(
+                "Keyboard Shortcuts File (*.ekj);;" "XML Keyboard shortcut file (*.e4k)"
+            ),
+        )
+
         if fn:
             from Preferences import Shortcuts
+
             Shortcuts.importShortcuts(fn, helpViewer=self)
--- a/src/eric7/WebBrowser/WebInspector.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/WebInspector.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,41 +19,42 @@
 class WebInspector(QWebEngineView):
     """
     Class implementing a QWebEngineView to load the web inspector in.
-    
+
     @signal inspectorClosed emitted to indicate the closing of the inspector
         window
     """
+
     inspectorClosed = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget
         @type QWidget
         """
         super().__init__(parent)
-        
+
         self.__view = None
         self.__inspectElement = False
-        
+
         self.__reloadGeometry()
-        
+
         registerView(self)
-        
+
         self.page().windowCloseRequested.connect(self.close)
         self.page().loadFinished.connect(self.__loadFinished)
-    
+
     def closeEvent(self, evt):
         """
         Protected method to save the geometry when closed.
-        
+
         @param evt event object
         @type QCloseEvent
         """
         Preferences.setGeometry("WebInspectorGeometry", self.saveGeometry())
         super().closeEvent(evt)
-        
+
         if evt.isAccepted():
             self.inspectorClosed.emit()
 
@@ -67,11 +68,11 @@
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-    
+
     def setView(self, view, inspectElement=False):
         """
         Public method to connect a view to this inspector.
-        
+
         @param view reference to the view object
         @type WebBrowserView
         @param inspectElement flag indicating to start a web inspection
@@ -80,65 +81,66 @@
         self.__view = view
         if not self.isEnabled():
             return
-        
+
         self.__inspectElement = inspectElement
-        
+
         self.page().setInspectedPage(self.__view.page())
-    
+
     def inspectElement(self):
         """
         Public method to inspect an element.
         """
         self.__inspectElement = True
-    
+
     @classmethod
     def isEnabled(cls):
         """
         Class method to check, if the web inspector is enabled.
-        
+
         @return flag indicating the enabled state
         @rtype bool
         """
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.webSettings().testAttribute(
-                QWebEngineSettings.WebAttribute.JavascriptEnabled):
+            QWebEngineSettings.WebAttribute.JavascriptEnabled
+        ):
             return False
-        
+
         return True
-    
+
     def __loadFinished(self):
         """
         Private slot handling the finished signal.
         """
         if self.__inspectElement:
-            self.__view.triggerPageAction(
-                QWebEnginePage.WebAction.InspectElement)
+            self.__view.triggerPageAction(QWebEnginePage.WebAction.InspectElement)
             self.__inspectElement = False
 
 
 def registerView(view):
     """
     Function to register a view.
-    
+
     @param view reference to the view
     @type WebBrowserView
     """
     if _VIEWS is None:
         return
-    
+
     _VIEWS.insert(0, view)
 
 
 def unregisterView(view):
     """
     Function to unregister a view.
-    
+
     @param view reference to the view
     @type WebBrowserView
     """
     if _VIEWS is None:
         return
-    
+
     if view in _VIEWS:
         _VIEWS.remove(view)
 
@@ -146,13 +148,13 @@
 def pushView(view):
     """
     Function to push a view to the front of the list.
-    
+
     @param view reference to the view
     @type WebBrowserView
     """
     if _VIEWS is None:
         return
-    
+
     if view in _VIEWS:
         _VIEWS.remove(view)
     _VIEWS.insert(0, view)
--- a/src/eric7/WebBrowser/ZoomManager/ZoomManager.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/ZoomManager/ZoomManager.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,64 +19,66 @@
 class ZoomManager(QObject):
     """
     Class implementing a manager for site specific zoom level settings.
-    
+
     @signal changed() emitted to indicate a change of the zoom level
     """
+
     changed = pyqtSignal()
-    
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__zoomDB = {}
-        
+
         self.__saveTimer = AutoSaver(self, self.save)
-        
+
         self.changed.connect(self.__saveTimer.changeOccurred)
-        
+
         self.__loaded = False
-    
+
     def close(self):
         """
         Public method to close the zoom manager.
         """
         self.__saveTimer.saveIfNeccessary()
-    
+
     def load(self):
         """
         Public method to load the bookmarks.
         """
         if self.__loaded:
             return
-        
+
         dbString = Preferences.getWebBrowser("ZoomValuesDB")
         if dbString:
             with contextlib.suppress(ValueError):
                 db = json.loads(dbString)
                 self.__zoomDB = db
-        
+
         self.__loaded = True
-    
+
     def save(self):
         """
         Public method to save the zoom values.
         """
         if not self.__loaded:
             return
-        
+
         from WebBrowser.WebBrowserWindow import WebBrowserWindow
+
         if not WebBrowserWindow.isPrivate():
             dbString = json.dumps(self.__zoomDB)
             Preferences.setWebBrowser("ZoomValuesDB", dbString)
-    
+
     def __keyFromUrl(self, url):
         """
         Private method to generate a DB key for an URL.
-        
+
         @param url URL to generate a key for
         @type QUrl
         @return key for the given URL
@@ -94,115 +96,116 @@
                 key = path.rsplit("/", 1)[0]
             else:
                 key = ""
-        
+
         return key
-    
+
     def setZoomValue(self, url, zoomValue):
         """
         Public method to record the zoom value for the given URL.
-        
+
         Note: Only zoom values not equal 100% are recorded.
-        
+
         @param url URL of the page to remember the zoom value for
         @type QUrl
         @param zoomValue zoom value for the URL
         @type int
         """
         self.load()
-        
+
         key = self.__keyFromUrl(url)
         if not key:
             return
-        
-        if ((zoomValue == 100 and key not in self.__zoomDB) or
-                (key in self.__zoomDB and self.__zoomDB[key] == zoomValue)):
+
+        if (zoomValue == 100 and key not in self.__zoomDB) or (
+            key in self.__zoomDB and self.__zoomDB[key] == zoomValue
+        ):
             return
-        
+
         if zoomValue == 100:
             del self.__zoomDB[key]
         else:
             self.__zoomDB[key] = zoomValue
-        
+
         self.changed.emit()
-    
+
     def zoomValue(self, url):
         """
         Public method to get the zoom value for an URL.
-        
+
         @param url URL of the page to get the zoom value for
         @type QUrl
         @return zoomValue zoom value for the URL
         @rtype int
         """
         self.load()
-        
+
         key = self.__keyFromUrl(url)
         if not key:
             zoom = 100
-        
+
         # default zoom value (i.e. no zoom)
         zoom = self.__zoomDB.get(key, 100)
-        
+
         return zoom
-    
+
     def clear(self):
         """
         Public method to clear the saved zoom values.
         """
         self.__zoomDB = {}
         self.__loaded = True
-        
+
         self.changed.emit()
-    
+
     def removeZoomValue(self, site):
         """
         Public method to remove a zoom value entry.
-        
+
         @param site web site name
         @type str
         """
         self.load()
-        
+
         if site in self.__zoomDB:
             del self.__zoomDB[site]
             self.changed.emit()
-    
+
     def allSiteNames(self):
         """
         Public method to get a list of all site names.
-        
+
         @return sorted list of all site names
         @rtype list of str
         """
         self.load()
-        
+
         return sorted(self.__zoomDB.keys())
-    
+
     def sitesCount(self):
         """
         Public method to get the number of available sites.
-        
+
         @return number of sites
         @rtype int
         """
         self.load()
-        
+
         return len(self.__zoomDB)
-    
+
     def siteInfo(self, site):
         """
         Public method to get the zoom value for the site.
-        
+
         @param site web site name
         @type str
         @return zoom value for the site
         @rtype int
         """
         self.load()
-        
+
         if site not in self.__zoomDB:
             return None
-        
+
         return self.__zoomDB[site]
 
 
@@ -213,13 +216,13 @@
     """
     Global function to get a reference to the zoom manager and create it, if
     it hasn't been yet.
-    
+
     @return reference to the zoom manager object
     @rtype ZoomManager
     """
     global _ZoomManager
-    
+
     if _ZoomManager is None:
         _ZoomManager = ZoomManager()
-    
+
     return _ZoomManager
--- a/src/eric7/WebBrowser/ZoomManager/ZoomValuesDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/ZoomManager/ZoomValuesDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,53 +18,48 @@
     """
     Class implementing a dialog to show all saved zoom values.
     """
+
     def __init__(self, parent=None):
         """
         Constructor
-        
+
         @param parent reference to the parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
-        self.removeButton.clicked.connect(
-            self.zoomValuesTable.removeSelected)
+
+        self.removeButton.clicked.connect(self.zoomValuesTable.removeSelected)
         self.removeAllButton.clicked.connect(self.zoomValuesTable.removeAll)
-        
+
         from . import ZoomManager
         from .ZoomValuesModel import ZoomValuesModel
-        
+
         self.zoomValuesTable.verticalHeader().hide()
-        self.__zoomValuesModel = ZoomValuesModel(
-            ZoomManager.instance(), self)
+        self.__zoomValuesModel = ZoomValuesModel(ZoomManager.instance(), self)
         self.__proxyModel = QSortFilterProxyModel(self)
         self.__proxyModel.setSourceModel(self.__zoomValuesModel)
-        self.searchEdit.textChanged.connect(
-            self.__proxyModel.setFilterFixedString)
+        self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString)
         self.zoomValuesTable.setModel(self.__proxyModel)
-        
+
         fm = QFontMetrics(QFont())
         height = fm.height() + fm.height() // 3
         self.zoomValuesTable.verticalHeader().setDefaultSectionSize(height)
         self.zoomValuesTable.verticalHeader().setMinimumSectionSize(-1)
-        
+
         self.__calculateHeaderSizes()
-    
+
     def __calculateHeaderSizes(self):
         """
         Private method to calculate the section sizes of the horizontal header.
         """
         fm = QFontMetrics(QFont())
         for section in range(self.__zoomValuesModel.columnCount()):
-            header = self.zoomValuesTable.horizontalHeader().sectionSizeHint(
-                section)
+            header = self.zoomValuesTable.horizontalHeader().sectionSizeHint(section)
             if section == 0:
                 try:
-                    header = fm.horizontalAdvance(
-                        "extraveryveryverylongsitename")
+                    header = fm.horizontalAdvance("extraveryveryverylongsitename")
                 except AttributeError:
-                    header = fm.width(
-                        "extraveryveryverylongsitename")
+                    header = fm.width("extraveryveryverylongsitename")
             elif section == 1:
                 try:
                     header = fm.horizontalAdvance("averagelongzoomvalue")
@@ -75,6 +70,5 @@
             except AttributeError:
                 buffer = fm.width("mm")
             header += buffer
-            self.zoomValuesTable.horizontalHeader().resizeSection(
-                section, header)
+            self.zoomValuesTable.horizontalHeader().resizeSection(section, header)
         self.zoomValuesTable.horizontalHeader().setStretchLastSection(True)
--- a/src/eric7/WebBrowser/ZoomManager/ZoomValuesModel.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/WebBrowser/ZoomManager/ZoomValuesModel.py	Wed Jul 13 14:55:47 2022 +0200
@@ -16,34 +16,35 @@
     """
     Class implementing a model for zoom values management.
     """
+
     def __init__(self, manager, parent=None):
         """
         Constructor
-        
+
         @param manager reference to the zoom values manager (ZoomManager)
         @param parent reference to the parent object (QObject)
         """
         super().__init__(parent)
-        
+
         self.__manager = manager
         manager.changed.connect(self.__zoomValuesChanged)
-        
+
         self.__headers = [
             self.tr("Website"),
             self.tr("Zoom Value [%]"),
         ]
-    
+
     def __zoomValuesChanged(self):
         """
         Private slot handling a change of the registered zoom values.
         """
         self.beginResetModel()
         self.endResetModel()
-    
+
     def removeRows(self, row, count, parent=None):
         """
         Public method to remove entries from the model.
-        
+
         @param row start row (integer)
         @param count number of rows to remove (integer)
         @param parent parent index (QModelIndex)
@@ -51,87 +52,86 @@
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return False
-        
+
         if count <= 0:
             return False
-        
+
         lastRow = row + count - 1
-        
+
         self.beginRemoveRows(parent, row, lastRow)
-        
+
         siteList = self.__manager.allSiteNames()
         for index in range(row, lastRow + 1):
             self.__manager.removeZoomValue(siteList[index])
-        
+
         return True
-    
+
     def rowCount(self, parent=None):
         """
         Public method to get the number of rows of the model.
-        
+
         @param parent parent index (QModelIndex)
         @return number of rows (integer)
         """
         if parent is None:
             parent = QModelIndex()
-        
+
         if parent.isValid():
             return 0
         else:
             return self.__manager.sitesCount()
-    
+
     def columnCount(self, parent=None):
         """
         Public method to get the number of columns of the model.
-        
+
         @param parent parent index (QModelIndex) (Unused)
         @return number of columns (integer)
         """
         return len(self.__headers)
-    
+
     def data(self, index, role):
         """
         Public method to get data from the model.
-        
+
         @param index index to get data for (QModelIndex)
         @param role role of the data to retrieve (integer)
         @return requested data
         """
         if index.row() >= self.__manager.sitesCount() or index.row() < 0:
             return None
-        
+
         site = self.__manager.allSiteNames()[index.row()]
         siteInfo = self.__manager.siteInfo(site)
-        
+
         if siteInfo is None:
             return None
-        
+
         if role == Qt.ItemDataRole.DisplayRole:
             if index.column() == 0:
                 return site
             elif index.column() == 1:
                 return siteInfo
-        
+
         return None
-    
-    def headerData(self, section, orientation,
-                   role=Qt.ItemDataRole.DisplayRole):
+
+    def headerData(self, section, orientation, role=Qt.ItemDataRole.DisplayRole):
         """
         Public method to get the header data.
-        
+
         @param section section number (integer)
         @param orientation header orientation (Qt.Orientation)
         @param role data role (Qt.ItemDataRole)
         @return header data
         """
         if (
-            orientation == Qt.Orientation.Horizontal and
-            role == Qt.ItemDataRole.DisplayRole
+            orientation == Qt.Orientation.Horizontal
+            and role == Qt.ItemDataRole.DisplayRole
         ):
             with contextlib.suppress(IndexError):
                 return self.__headers[section]
-        
+
         return None
--- a/src/eric7/__main__.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/__main__.py	Wed Jul 13 14:55:47 2022 +0200
@@ -8,4 +8,5 @@
 """
 
 from . import eric7
+
 eric7.main()
--- a/src/eric7/eric7.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,10 +22,16 @@
 originalPathString = os.getenv("PATH")
 
 # generate list of arguments to be remembered for a restart
-restartArgsList = ["--no-splash", "--plugin", "--debug", "--config",
-                   "--settings", "--disable-crash", "--disable-plugin"]
-restartArgs = [arg for arg in sys.argv[1:]
-               if arg.split("=", 1)[0] in restartArgsList]
+restartArgsList = [
+    "--no-splash",
+    "--plugin",
+    "--debug",
+    "--config",
+    "--settings",
+    "--disable-crash",
+    "--disable-plugin",
+]
+restartArgs = [arg for arg in sys.argv[1:] if arg.split("=", 1)[0] in restartArgsList]
 
 sys.path.insert(1, os.path.dirname(__file__))
 
@@ -39,13 +45,14 @@
     messagebox.showerror(
         "eric7 Error",
         "PyQt could not be imported. Please make sure"
-        " it is installed and accessible.")
+        " it is installed and accessible.",
+    )
     sys.exit(100)
 
 try:
-    from PyQt6 import QtWebEngineWidgets
-    # __IGNORE_WARNING__ __IGNORE_EXCEPTION__
+    from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__ __IGNORE_EXCEPTION__
     from PyQt6.QtWebEngineCore import QWebEngineUrlScheme
+
     WEBENGINE_AVAILABLE = True
 except ImportError:
     WEBENGINE_AVAILABLE = False
@@ -64,23 +71,24 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 # make Third-Party package available as a packages repository
-sys.path.insert(2, os.path.join(os.path.dirname(__file__),
-                                "ThirdParty", "Jasy"))
-sys.path.insert(2, os.path.join(os.path.dirname(__file__),
-                                "DebugClients", "Python"))
+sys.path.insert(2, os.path.join(os.path.dirname(__file__), "ThirdParty", "Jasy"))
+sys.path.insert(2, os.path.join(os.path.dirname(__file__), "DebugClients", "Python"))
 
 from EricWidgets.EricApplication import EricApplication
 
@@ -88,18 +96,15 @@
 def handleSingleApplication(ddindex):
     """
     Global function to handle the single application mode.
-    
+
     @param ddindex index of a '--' option in the options list
     """
     from EricWidgets.EricSingleApplication import EricSingleApplicationClient
-    
+
     client = EricSingleApplicationClient()
     res = client.connect()
     if res > 0:
-        if (
-            "--no-splash" in sys.argv and
-            sys.argv.index("--no-splash") < ddindex
-        ):
+        if "--no-splash" in sys.argv and sys.argv.index("--no-splash") < ddindex:
             sys.argv.remove("--no-splash")
             ddindex -= 1
         if "--no-open" in sys.argv and sys.argv.index("--no-open") < ddindex:
@@ -108,8 +113,8 @@
         if "--no-crash" in sys.argv and sys.argv.index("--no-crash") < ddindex:
             sys.argv.remove("--no-crash")
         if (
-            "--disable-crash" in sys.argv and
-            sys.argv.index("--disable-crash") < ddindex
+            "--disable-crash" in sys.argv
+            and sys.argv.index("--disable-crash") < ddindex
         ):
             sys.argv.remove("--disable-crash")
             ddindex -= 1
@@ -117,29 +122,20 @@
             sys.argv.remove("--debug")
             ddindex -= 1
         for arg in sys.argv:
-            if (
-                arg.startswith("--config=") and
-                sys.argv.index(arg) < ddindex
-            ):
+            if arg.startswith("--config=") and sys.argv.index(arg) < ddindex:
                 sys.argv.remove(arg)
                 ddindex -= 1
                 break
         for arg in sys.argv:
-            if (
-                arg.startswith("--plugin=") and
-                sys.argv.index(arg) < ddindex
-            ):
+            if arg.startswith("--plugin=") and sys.argv.index(arg) < ddindex:
                 sys.argv.remove(arg)
                 ddindex -= 1
                 break
         for arg in sys.argv[:]:
-            if (
-                arg.startswith("--disable-plugin=") and
-                sys.argv.index(arg) < ddindex
-            ):
+            if arg.startswith("--disable-plugin=") and sys.argv.index(arg) < ddindex:
                 sys.argv.remove(arg)
                 ddindex -= 1
-        
+
         if len(sys.argv) > 1:
             client.processArgs(sys.argv[1:])
         sys.exit(0)
@@ -152,7 +148,7 @@
 def excepthook(excType, excValue, tracebackobj):
     """
     Global function to catch unhandled exceptions.
-    
+
     @param excType exception type
     @param excValue exception value
     @param tracebackobj traceback object
@@ -160,30 +156,30 @@
     from UI.Info import BugAddress
     import Utilities
     import Globals
-    
+
     # Workaround for a strange issue with QScintilla
     if str(excValue) == "unable to convert a QVariant back to a Python object":
         return
-    
-    separator = '-' * 80
+
+    separator = "-" * 80
     logFile = os.path.join(Globals.getConfigDir(), "eric7_error.log")
     notice = (
         """An unhandled exception occurred. Please report the problem\n"""
         """using the error reporting dialog or via email to <{0}>.\n"""
         """A log has been written to "{1}".\n\nError information:\n""".format(
-            BugAddress, logFile)
+            BugAddress, logFile
+        )
     )
     timeString = time.strftime("%Y-%m-%d, %H:%M:%S")
-    
-    versionInfo = "\n{0}\n{1}".format(
-        separator, Utilities.generateVersionInfo())
+
+    versionInfo = "\n{0}\n{1}".format(separator, Utilities.generateVersionInfo())
     pluginVersionInfo = Utilities.generatePluginsVersionInfo()
     if pluginVersionInfo:
         versionInfo += "\n{0}\n{1}".format(separator, pluginVersionInfo)
     distroInfo = Utilities.generateDistroInfo()
     if distroInfo:
         versionInfo += "\n{0}\n{1}".format(separator, distroInfo)
-    
+
     if isinstance(excType, str):
         tbinfo = tracebackobj
     else:
@@ -191,26 +187,21 @@
         traceback.print_tb(tracebackobj, None, tbinfofile)
         tbinfofile.seek(0)
         tbinfo = tbinfofile.read()
-    errmsg = '{0}: \n{1}'.format(str(excType), str(excValue))
-    sections = ['', separator, timeString, separator, errmsg, separator,
-                tbinfo]
-    msg = '\n'.join(sections)
-    with contextlib.suppress(OSError), \
-            open(logFile, "w", encoding="utf-8") as f:
+    errmsg = "{0}: \n{1}".format(str(excType), str(excValue))
+    sections = ["", separator, timeString, separator, errmsg, separator, tbinfo]
+    msg = "\n".join(sections)
+    with contextlib.suppress(OSError), open(logFile, "w", encoding="utf-8") as f:
         f.write(msg)
         f.write(versionInfo)
-    
+
     if inMainLoop is None:
         warning = notice + msg + versionInfo
-        print(warning)                          # __IGNORE_WARNING_M801__
+        print(warning)  # __IGNORE_WARNING_M801__
     else:
         warning = notice + msg + versionInfo
         # Escape &<> otherwise it's not visible in the error dialog
         warning = (
-            warning
-            .replace("&", "&amp;")
-            .replace(">", "&gt;")
-            .replace("<", "&lt;")
+            warning.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;")
         )
         qWarning(warning)
 
@@ -218,15 +209,15 @@
 def uiStartUp():
     """
     Global function to finalize the start up of the main UI.
-    
+
     Note: It is activated by a zero timeout single-shot timer.
     """
     global args, mainWindow, splash
-    
+
     if splash:
         splash.finish(mainWindow)
         del splash
-    
+
     mainWindow.checkForErrorLog()
     mainWindow.processArgs(args)
     mainWindow.processInstallInfoFile()
@@ -243,49 +234,53 @@
     """
     from Globals import AppInfo
     import Globals
-    
+
     global app, args, mainWindow, splash, restartArgs, inMainLoop
-    
+
     sys.excepthook = excepthook
-    
+
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
         ("--debug", "activate debugging output to the console"),
         ("--no-splash", "don't show the splash screen"),
-        ("--no-open",
-         "don't open anything at startup except that given in command"),
+        ("--no-open", "don't open anything at startup except that given in command"),
         ("--no-crash", "don't check for a crash session file on startup"),
         ("--disable-crash", "disable the support for crash sessions"),
-        ("--disable-plugin=<plug-in name>",
-         "disable the given plug-in (may be repeated)"),
-        ("--plugin=plugin-file",
-         "load the given plugin file (plugin development)"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("--small-screen",
-         "adjust the interface for screens smaller than FHD"),
+        (
+            "--disable-plugin=<plug-in name>",
+            "disable the given plug-in (may be repeated)",
+        ),
+        ("--plugin=plugin-file", "load the given plugin file (plugin development)"),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("--small-screen", "adjust the interface for screens smaller than FHD"),
         ("--start-file", "load the most recently opened file"),
         ("--start-multi", "load the most recently opened multi-project"),
         ("--start-project", "load the most recently opened project"),
         ("--start-session", "load the global session file"),
-        ("--",
-         "indicate that there are options for the program to be debugged"),
-        ("",
-         "(everything after that is considered arguments for this program)")
+        ("--", "indicate that there are options for the program to be debugged"),
+        ("", "(everything after that is considered arguments for this program)"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "Eric7",
-                                  "[project | files... [--] [debug-options]]",
-                                  "A Python IDE",
-                                  options)
-    
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "Eric7",
+        "[project | files... [--] [debug-options]]",
+        "A Python IDE",
+        options,
+    )
+
     if "__PYVENV_LAUNCHER__" in os.environ:
         del os.environ["__PYVENV_LAUNCHER__"]
-    
+
     # make sure our executable directory (i.e. that of the used Python
     # interpreter) is included in the executable search path
     pathList = os.environ["PATH"].split(os.pathsep)
@@ -293,8 +288,9 @@
     if exeDir not in pathList:
         pathList.insert(0, exeDir)
     os.environ["PATH"] = os.pathsep.join(pathList)
-    
+
     from Toolbox import Startup
+
     # set the library paths for plugins
     Startup.setLibraryPaths()
 
@@ -303,24 +299,25 @@
         scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
         scheme.setFlags(QWebEngineUrlScheme.Flag.SecureScheme)
         QWebEngineUrlScheme.registerScheme(scheme)
-    
+
     app = EricApplication(sys.argv)
     ddindex = Startup.handleArgs(sys.argv, appinfo)
-    
+
     logging.debug("Importing Preferences")
     import Preferences
-    
+
     if Preferences.getUI("SingleApplicationMode"):
         handleSingleApplication(ddindex)
-    
+
     # set the application style sheet
     app.setStyleSheetFile(Preferences.getUI("StyleSheet"))
-    
+
     # set the search path for icons
     Startup.initializeResourceSearchPath(app)
-    
+
     # generate and show a splash window, if not suppressed
     from UI.SplashScreen import SplashScreen, NoneSplashScreen
+
     if "--no-splash" in sys.argv and sys.argv.index("--no-splash") < ddindex:
         sys.argv.remove("--no-splash")
         ddindex -= 1
@@ -339,7 +336,7 @@
         else:
             path = pyqtDataDir
         os.environ["PATH"] = path + os.pathsep + os.environ["PATH"]
-    
+
     pluginFile = None
     noopen = False
     nocrash = False
@@ -353,18 +350,12 @@
         sys.argv.remove("--no-crash")
         ddindex -= 1
         nocrash = True
-    if (
-        "--disable-crash" in sys.argv and
-        sys.argv.index("--disable-crash") < ddindex
-    ):
+    if "--disable-crash" in sys.argv and sys.argv.index("--disable-crash") < ddindex:
         sys.argv.remove("--disable-crash")
         ddindex -= 1
         disablecrash = True
     for arg in sys.argv[:]:
-        if (
-            arg.startswith("--disable-plugin=") and
-            sys.argv.index(arg) < ddindex
-        ):
+        if arg.startswith("--disable-plugin=") and sys.argv.index(arg) < ddindex:
             # extract the plug-in name
             pluginName = arg.replace("--disable-plugin=", "")
             sys.argv.remove(arg)
@@ -379,45 +370,54 @@
             pluginFile = os.path.expanduser(pluginFile)
             pluginFile = os.path.abspath(pluginFile)
             break
-    
+
     # is there a set of filenames or options on the command line,
     # if so, pass them to the UI
     if len(sys.argv) > 1:
         args = sys.argv[1:]
-    
+
     # get the Qt translations directory
     qtTransDir = Preferences.getQtTranslationsDir()
     if not qtTransDir:
-        qtTransDir = QLibraryInfo.path(
-            QLibraryInfo.LibraryPath.TranslationsPath)
-    
+        qtTransDir = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
+
     # Load translation files and install them
     loc = Startup.loadTranslators(qtTransDir, app, ("qscintilla",))
-    
+
     # Initialize SSL stuff
     from EricNetwork.EricSslUtilities import initSSL
+
     initSSL()
-    
+
     splash.showMessage(QCoreApplication.translate("eric7", "Starting..."))
     # We can only import these after creating the EricApplication because they
     # make Qt calls that need the EricApplication to exist.
     from UI.UserInterface import UserInterface
 
-    splash.showMessage(
-        QCoreApplication.translate("eric7", "Generating Main Window..."))
-    mainWindow = UserInterface(app, loc, splash, pluginFile, disabledPlugins,
-                               noopen, nocrash, disablecrash, restartArgs,
-                               originalPathString)
+    splash.showMessage(QCoreApplication.translate("eric7", "Generating Main Window..."))
+    mainWindow = UserInterface(
+        app,
+        loc,
+        splash,
+        pluginFile,
+        disabledPlugins,
+        noopen,
+        nocrash,
+        disablecrash,
+        restartArgs,
+        originalPathString,
+    )
     app.lastWindowClosed.connect(app.quit)
     mainWindow.show()
-    
+
     QTimer.singleShot(0, uiStartUp)
-    
+
     # generate a graphical error handler
     from EricWidgets import EricErrorMessage
+
     eMsg = EricErrorMessage.qtHandler()
     eMsg.setMinimumSize(600, 400)
-    
+
     # start the event loop
     inMainLoop = True
     res = app.exec()
@@ -425,5 +425,6 @@
     logging.shutdown()
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_api.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_api.py	Wed Jul 13 14:55:47 2022 +0200
@@ -29,14 +29,13 @@
 def usage():
     """
     Function to print some usage information.
-    
+
     It prints a reference of all commandline parameters that may
     be used and ends the application.
     """
     print("eric7_api")
     print()
-    print("Copyright (c) 2004 - 2022 Detlev Offenbach"
-          " <detlev@die-offenbachs.de>.")
+    print("Copyright (c) 2004 - 2022 Detlev Offenbach" " <detlev@die-offenbachs.de>.")
     print()
     print("Usage:")
     print()
@@ -62,16 +61,16 @@
     print("  -l language or --language=language")
     print("        Generate an API file for the given programming language.")
     print("        Supported programming languages are:")
-    for lang in sorted(
-            DocumentationTools.supportedExtensionsDictForApis.keys()):
+    for lang in sorted(DocumentationTools.supportedExtensionsDictForApis.keys()):
         print("            * {0}".format(lang))
     print("        The default is 'Python3'.")
     print("        This option may be repeated multiple times.")
     print("  -o filename or --output=filename")
-    print("        Write the API information to the named file."
-          " A '%L' placeholder")        # __IGNORE_WARNING_M601__
-    print("        is replaced by the language of the API file"
-          " (see --language).")
+    print(
+        "        Write the API information to the named file."
+        " A '%L' placeholder"  # __IGNORE_WARNING_M601__
+    )
+    print("        is replaced by the language of the API file" " (see --language).")
     print("  -p or --private")
     print("        Include private methods and functions.")
     print("  -R, -r or --recursive")
@@ -102,10 +101,11 @@
         """ conditions.\n"""
         """There is NO warranty; not even for MERCHANTABILITY or FITNESS"""
         """ FOR A\n"""
-        """PARTICULAR PURPOSE.""".format(Version))
+        """PARTICULAR PURPOSE.""".format(Version)
+    )
     sys.exit(1)
 
-    
+
 def main():
     """
     Main entry point into the application.
@@ -116,15 +116,37 @@
 
     try:
         opts, args = getopt.getopt(
-            sys.argv[1:], "b:e:hil:o:pRrt:Vx:",
-            ["base=", "eol=", "exclude=", "exclude-file=", "extension=",
-             "help", "ignore", "language=", "output=", "private", "recursive",
-             "version", ])
+            sys.argv[1:],
+            "b:e:hil:o:pRrt:Vx:",
+            [
+                "base=",
+                "eol=",
+                "exclude=",
+                "exclude-file=",
+                "extension=",
+                "help",
+                "ignore",
+                "language=",
+                "output=",
+                "private",
+                "recursive",
+                "version",
+            ],
+        )
     except getopt.error:
         usage()
 
-    excludeDirs = [".svn", ".hg", ".git", ".ropeproject", ".eric7project",
-                   "dist", "build", "doc", "docs"]
+    excludeDirs = [
+        ".svn",
+        ".hg",
+        ".git",
+        ".ropeproject",
+        ".eric7project",
+        "dist",
+        "build",
+        "doc",
+        "docs",
+    ]
     excludePatterns = []
     outputFileName = ""
     recursive = False
@@ -161,18 +183,17 @@
         elif k in ["-l", "--language"]:
             if v not in progLanguages:
                 if v not in DocumentationTools.supportedExtensionsDictForApis:
-                    sys.stderr.write(
-                        "Wrong language given: {0}. Aborting\n".format(v))
+                    sys.stderr.write("Wrong language given: {0}. Aborting\n".format(v))
                     sys.exit(1)
                 else:
                     progLanguages.append(v)
         elif k in ["-e", "--eol"]:
             if v.lower() == "cr":
-                newline = '\r'
+                newline = "\r"
             elif v.lower() == "lf":
-                newline = '\n'
+                newline = "\n"
             elif v.lower() == "crlf":
-                newline = '\r\n'
+                newline = "\r\n"
 
     if not args:
         usage()
@@ -180,20 +201,20 @@
     if outputFileName == "":
         sys.stderr.write("No output file given. Aborting\n")
         sys.exit(1)
-    
+
     if len(progLanguages) == 0:
         progLanguages = ["Python3"]
-    
+
     for progLanguage in sorted(progLanguages):
         basename = ""
         apis = []
         basesDict = {}
 
-        supportedExtensions = (
-            DocumentationTools.supportedExtensionsDictForApis[progLanguage]
-        )
+        supportedExtensions = DocumentationTools.supportedExtensionsDictForApis[
+            progLanguage
+        ]
         supportedExtensions.extend(extensions)
-        
+
         if not outputFileName.endswith(".api"):
             # append the .api extension, if not given by the user
             outputFileName += ".api"
@@ -204,26 +225,27 @@
                 outputFile = outputFileName
             else:
                 root, ext = os.path.splitext(outputFileName)
-                outputFile = "{0}-{1}{2}".format(root, progLanguage.lower(),
-                                                 ext)
-        basesFile = os.path.splitext(outputFile)[0] + '.bas'
-        
+                outputFile = "{0}-{1}{2}".format(root, progLanguage.lower(), ext)
+        basesFile = os.path.splitext(outputFile)[0] + ".bas"
+
         for arg in args:
             if os.path.isdir(arg):
-                if os.path.exists(os.path.join(
-                        arg, Utilities.joinext("__init__", ".py"))):
+                if os.path.exists(
+                    os.path.join(arg, Utilities.joinext("__init__", ".py"))
+                ):
                     basename = os.path.dirname(arg)
-                    if arg == '.':
+                    if arg == ".":
                         sys.stderr.write("The directory '.' is a package.\n")
                         sys.stderr.write(
-                            "Please repeat the call giving its real name.\n")
+                            "Please repeat the call giving its real name.\n"
+                        )
                         sys.stderr.write("Ignoring the directory.\n")
                         continue
                 else:
                     basename = arg
                 if basename:
                     basename = "{0}{1}".format(basename, os.sep)
-                    
+
                 if recursive and not os.path.islink(arg):
                     names = [arg] + Utilities.getDirs(arg, excludeDirs)
                 else:
@@ -231,16 +253,20 @@
             else:
                 basename = ""
                 names = [arg]
-            
+
             for filename in sorted(names):
                 inpackage = False
                 if os.path.isdir(filename):
                     files = []
                     for ext in supportedExtensions:
-                        files.extend(glob.glob(os.path.join(
-                            filename, Utilities.joinext("*", ext))))
+                        files.extend(
+                            glob.glob(
+                                os.path.join(filename, Utilities.joinext("*", ext))
+                            )
+                        )
                         initFile = os.path.join(
-                            filename, Utilities.joinext("__init__", ext))
+                            filename, Utilities.joinext("__init__", ext)
+                        )
                         if initFile in files:
                             inpackage = True
                             files.remove(initFile)
@@ -249,14 +275,11 @@
                             # assume package
                             inpackage = True
                 else:
-                    if (
-                        Utilities.isWindowsPlatform() and
-                        glob.has_magic(filename)
-                    ):
+                    if Utilities.isWindowsPlatform() and glob.has_magic(filename):
                         files = glob.glob(filename)
                     else:
                         files = [filename]
-                
+
                 for file in files:
                     skipIt = False
                     for pattern in excludePatterns:
@@ -265,15 +288,16 @@
                             break
                     if skipIt:
                         continue
-                    
+
                     try:
                         module = Utilities.ModuleParser.readModule(
                             file,
-                            basename=basename, inpackage=inpackage,
-                            ignoreBuiltinModules=ignoreBuiltinModules)
+                            basename=basename,
+                            inpackage=inpackage,
+                            ignoreBuiltinModules=ignoreBuiltinModules,
+                        )
                         apiGenerator = APIGenerator(module)
-                        api = apiGenerator.genAPI(True, basePackage,
-                                                  includePrivate)
+                        api = apiGenerator.genAPI(True, basePackage, includePrivate)
                         bases = apiGenerator.genBases(includePrivate)
                     except OSError as v:
                         sys.stderr.write("{0} error: {1}\n".format(file, v[1]))
@@ -281,40 +305,41 @@
                     except ImportError as v:
                         sys.stderr.write("{0} error: {1}\n".format(file, v))
                         continue
-                    
+
                     for apiEntry in api:
                         if apiEntry not in apis:
                             apis.append(apiEntry)
                     for basesEntry in bases:
                         if bases[basesEntry]:
                             basesDict[basesEntry] = bases[basesEntry][:]
-                    sys.stdout.write("-- {0} -- {1} ok\n".format(
-                        progLanguage, file))
+                    sys.stdout.write("-- {0} -- {1} ok\n".format(progLanguage, file))
 
         outdir = os.path.dirname(outputFile)
         if outdir and not os.path.exists(outdir):
             os.makedirs(outdir)
         try:
-            with open(outputFile, "w", encoding="utf-8",
-                      newline=newline) as out:
+            with open(outputFile, "w", encoding="utf-8", newline=newline) as out:
                 out.write("\n".join(sorted(apis)) + "\n")
         except OSError as v:
             sys.stderr.write("{0} error: {1}\n".format(outputFile, v[1]))
             sys.exit(3)
         try:
-            with open(basesFile, "w", encoding="utf-8",
-                      newline=newline) as out:
+            with open(basesFile, "w", encoding="utf-8", newline=newline) as out:
                 for baseEntry in sorted(basesDict.keys()):
-                    out.write("{0} {1}\n".format(
-                        baseEntry, " ".join(sorted(basesDict[baseEntry]))))
+                    out.write(
+                        "{0} {1}\n".format(
+                            baseEntry, " ".join(sorted(basesDict[baseEntry]))
+                        )
+                    )
         except OSError as v:
             sys.stderr.write("{0} error: {1}\n".format(basesFile, v[1]))
             sys.exit(3)
-    
-    sys.stdout.write('\nDone.\n')
+
+    sys.stdout.write("\nDone.\n")
     sys.exit(0)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
 
 #
--- a/src/eric7/eric7_browser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_browser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -23,31 +23,39 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         SettingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(SettingsDir):
             os.makedirs(SettingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, SettingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, SettingsDir
+        )
         sys.argv.remove(arg)
 
 try:
-    from PyQt6 import QtWebEngineWidgets    # __IGNORE_WARNING__
+    from PyQt6 import QtWebEngineWidgets  # __IGNORE_WARNING__
 except ImportError:
     if "--quiet" not in sys.argv:
         from PyQt6.QtCore import QTimer
         from PyQt6.QtWidgets import QApplication
-        from EricWidgets import EricMessageBox          # __IGNORE_WARNING__
+        from EricWidgets import EricMessageBox  # __IGNORE_WARNING__
+
         app = QApplication([])
-        QTimer.singleShot(0, lambda: EricMessageBox.critical(
-            None,
-            "eric Web Browser",
-            "QtWebEngineWidgets is not installed but needed to execute the"
-            " web browser."))
+        QTimer.singleShot(
+            0,
+            lambda: EricMessageBox.critical(
+                None,
+                "eric Web Browser",
+                "QtWebEngineWidgets is not installed but needed to execute the"
+                " web browser.",
+            ),
+        )
         app.exec()
     sys.exit(100)
 
@@ -60,28 +68,26 @@
 
 from Toolbox import Startup
 
-from WebBrowser.WebBrowserSingleApplication import (
-    WebBrowserSingleApplicationClient
-)
+from WebBrowser.WebBrowserSingleApplication import WebBrowserSingleApplicationClient
 
 
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of command line parameters
     @type list of str
     @return reference to the main widget
     @rtype QWidget
     """
     from WebBrowser.WebBrowserWindow import WebBrowserWindow
-    
+
     searchWord = None
     private = False
     qthelp = False
     single = False
     name = ""
-    
+
     for arg in reversed(argv):
         if arg.startswith("--search="):
             searchWord = argv[1].split("=", 1)[1]
@@ -98,22 +104,27 @@
         elif arg == "--single":
             single = True
             argv.remove(arg)
-        elif (
-            arg.startswith(("--newtab=", "--")) or
-            arg == "--quiet"
-        ):
+        elif arg.startswith(("--newtab=", "--")) or arg == "--quiet":
             # only needed until we reach this point
             argv.remove(arg)
-    
+
     try:
         home = argv[1]
     except IndexError:
         home = ""
-    
-    browser = WebBrowserWindow(home, '.', None, 'web_browser',
-                               searchWord=searchWord, private=private,
-                               settingsDir=SettingsDir, qthelp=qthelp,
-                               single=single, saname=name)
+
+    browser = WebBrowserWindow(
+        home,
+        ".",
+        None,
+        "web_browser",
+        searchWord=searchWord,
+        private=private,
+        settingsDir=SettingsDir,
+        qthelp=qthelp,
+        single=single,
+        saname=name,
+    )
     return browser
 
 
@@ -122,41 +133,46 @@
     Main entry point into the application.
     """
     global app
-    
+
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_browser.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
         ("--private", "start the browser in private browsing mode"),
         ("--qthelp", "start the browser with support for QtHelp"),
         ("--quiet", "don't show any startup error messages"),
         ("--search=word", "search for the given word"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
         ("--single", "start the browser as a single application"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Web Browser",
-                                  "file",
-                                  "web browser",
-                                  options)
-    
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Web Browser", "file", "web browser", options
+    )
+
     # set the library paths for plugins
     Startup.setLibraryPaths()
-    
+
     scheme = QWebEngineUrlScheme(b"eric")
     scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
-    scheme.setFlags(QWebEngineUrlScheme.Flag.SecureScheme |
-                    QWebEngineUrlScheme.Flag.ContentSecurityPolicyIgnored)
+    scheme.setFlags(
+        QWebEngineUrlScheme.Flag.SecureScheme
+        | QWebEngineUrlScheme.Flag.ContentSecurityPolicyIgnored
+    )
     QWebEngineUrlScheme.registerScheme(scheme)
     if "--qthelp" in sys.argv:
         scheme = QWebEngineUrlScheme(b"qthelp")
         scheme.setSyntax(QWebEngineUrlScheme.Syntax.Path)
         scheme.setFlags(QWebEngineUrlScheme.Flag.SecureScheme)
         QWebEngineUrlScheme.registerScheme(scheme)
-    
+
     app = EricApplication(sys.argv)
     if "--private" not in sys.argv:
         client = WebBrowserSingleApplicationClient()
@@ -169,13 +185,12 @@
             print("eric7_browser: {0}".format(client.errstr()))
             # __IGNORE_WARNING_M801__
             sys.exit(res)
-    
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget,
-                                   installErrorHandler=True,
-                                   app=app)
+
+    res = Startup.simpleAppStartup(
+        sys.argv, appinfo, createMainWidget, installErrorHandler=True, app=app
+    )
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_compare.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_compare.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,11 +43,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from UI.CompareDialog import CompareWindow
+
     if len(argv) >= 6:
         # assume last two entries are the files to compare
         file1 = (argv[-4], argv[-2])
@@ -61,23 +65,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_compare.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Compare",
-                                  "",
-                                  "Simple graphical compare tool",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Compare", "", "Simple graphical compare tool", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_configure.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_configure.py	Wed Jul 13 14:55:47 2022 +0200
@@ -18,16 +18,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -38,11 +41,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Preferences.ConfigurationDialog import ConfigurationWindow
+
     w = ConfigurationWindow()
     w.show()
     w.showConfigurationPageByName("empty")
@@ -54,23 +58,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_configure.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Configure",
-                                  "",
-                                  "Configuration editor for eric",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Configure", "", "Configuration editor for eric", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_diff.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_diff.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,11 +43,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from UI.DiffDialog import DiffWindow
+
     return DiffWindow()
 
 
@@ -53,23 +57,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_diff.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Diff",
-                                  "",
-                                  "Simple graphical diff tool",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Diff", "", "Simple graphical diff tool", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_doc.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_doc.py	Wed Jul 13 14:55:47 2022 +0200
@@ -38,14 +38,13 @@
 def usage():
     """
     Function to print some usage information.
-    
+
     It prints a reference of all commandline parameters that may
     be used and ends the application.
     """
     print("eric7_doc")
     print()
-    print("Copyright (c) 2003 - 2022 Detlev Offenbach"
-          " <detlev@die-offenbachs.de>.")
+    print("Copyright (c) 2003 - 2022 Detlev Offenbach" " <detlev@die-offenbachs.de>.")
     print()
     print("Usage:")
     print()
@@ -100,8 +99,7 @@
     print("  --cfheader-color=color")
     print("        Specify the text color of class and function headers.")
     print("  --cfheader-background-color=color")
-    print("        Specify the text background color of class and"
-          " function headers.")
+    print("        Specify the text background color of class and" " function headers.")
     print("  --link-color=color")
     print("        Specify the text color of hyperlinks.")
     print()
@@ -141,7 +139,8 @@
         """ conditions.\n"""
         """There is NO warranty; not even for MERCHANTABILITY or FITNESS"""
         """ FOR A\n"""
-        """PARTICULAR PURPOSE.""".format(Version))
+        """PARTICULAR PURPOSE.""".format(Version)
+    )
     sys.exit(1)
 
 
@@ -153,24 +152,55 @@
 
     try:
         opts, args = getopt.getopt(
-            sys.argv[1:], "c:ehio:Rrs:t:Vx:",
-            ["exclude=", "extension=", "help", "noindex", "noempty", "outdir=",
-             "recursive", "startdir=", "style-sheet=", "version",
-             "exclude-file=", "eol=",
-             "body-color=", "body-background-color=",
-             "l1header-color=", "l1header-background-color=",
-             "l2header-color=", "l2header-background-color=",
-             "cfheader-color=", "cfheader-background-color=",
-             "link-color=",
-             "create-qhp", "qhp-outdir=", "qhp-namespace=",
-             "qhp-virtualfolder=", "qhp-filtername=", "qhp-filterattribs=",
-             "qhp-title=", "create-qhc",
-             ])
+            sys.argv[1:],
+            "c:ehio:Rrs:t:Vx:",
+            [
+                "exclude=",
+                "extension=",
+                "help",
+                "noindex",
+                "noempty",
+                "outdir=",
+                "recursive",
+                "startdir=",
+                "style-sheet=",
+                "version",
+                "exclude-file=",
+                "eol=",
+                "body-color=",
+                "body-background-color=",
+                "l1header-color=",
+                "l1header-background-color=",
+                "l2header-color=",
+                "l2header-background-color=",
+                "cfheader-color=",
+                "cfheader-background-color=",
+                "link-color=",
+                "create-qhp",
+                "qhp-outdir=",
+                "qhp-namespace=",
+                "qhp-virtualfolder=",
+                "qhp-filtername=",
+                "qhp-filterattribs=",
+                "qhp-title=",
+                "create-qhc",
+            ],
+        )
     except getopt.error:
         usage()
 
-    excludeDirs = [".svn", ".hg", ".git", ".ropeproject", ".eric7project",
-                   ".jedi", "dist", "build", "doc", "docs"]
+    excludeDirs = [
+        ".svn",
+        ".hg",
+        ".git",
+        ".ropeproject",
+        ".eric7project",
+        ".jedi",
+        "dist",
+        "build",
+        "doc",
+        "docs",
+    ]
     excludePatterns = []
     startDir = ""
     outputDir = "doc"
@@ -178,10 +208,10 @@
     doIndex = True
     noempty = False
     newline = None
-    
+
     stylesheetFile = ""
     colors = eric7docDefaultColors.copy()
-    
+
     qtHelpCreation = False
     qtHelpOutputDir = "help"
     qtHelpNamespace = ""
@@ -190,7 +220,7 @@
     qtHelpFilterAttribs = ""
     qtHelpTitle = ""
     qtHelpCreateCollection = False
-    
+
     for k, v in opts:
         if k in ["-s", "--startdir"]:
             startDir = v
@@ -218,31 +248,31 @@
             supportedExtensions.append(v)
         elif k == "--eol":
             if v.lower() == "cr":
-                newline = '\r'
+                newline = "\r"
             elif v.lower() == "lf":
-                newline = '\n'
+                newline = "\n"
             elif v.lower() == "crlf":
-                newline = '\r\n'
-        
+                newline = "\r\n"
+
         elif k == "--body-color":
-            colors['BodyColor'] = v
+            colors["BodyColor"] = v
         elif k == "--body-background-color":
-            colors['BodyBgColor'] = v
+            colors["BodyBgColor"] = v
         elif k == "--l1header-color":
-            colors['Level1HeaderColor'] = v
+            colors["Level1HeaderColor"] = v
         elif k == "--l1header-background-color":
-            colors['Level1HeaderBgColor'] = v
+            colors["Level1HeaderBgColor"] = v
         elif k == "--l2header-color":
-            colors['Level2HeaderColor'] = v
+            colors["Level2HeaderColor"] = v
         elif k == "--l2header-background-color":
-            colors['Level2HeaderBgColor'] = v
+            colors["Level2HeaderBgColor"] = v
         elif k == "--cfheader-color":
-            colors['CFColor'] = v
+            colors["CFColor"] = v
         elif k == "--cfheader-background-color":
-            colors['CFBgColor'] = v
+            colors["CFBgColor"] = v
         elif k == "--link-color":
-            colors['LinkColor'] = v
-        
+            colors["LinkColor"] = v
+
         elif k == "--create-qhp":
             qtHelpCreation = True
         elif k == "--qhp-outdir":
@@ -262,16 +292,15 @@
 
     if not args:
         usage()
-    
-    if (
-        qtHelpCreation and
-        (qtHelpNamespace == "" or
-         qtHelpFolder == "" or
-         '/' in qtHelpFolder or
-         qtHelpTitle == "")
+
+    if qtHelpCreation and (
+        qtHelpNamespace == ""
+        or qtHelpFolder == ""
+        or "/" in qtHelpFolder
+        or qtHelpTitle == ""
     ):
         usage()
-    
+
     basename = ""
 
     if outputDir:
@@ -280,19 +309,20 @@
                 os.makedirs(outputDir)
             except OSError:
                 sys.stderr.write(
-                    "Could not create output directory {0}.".format(outputDir))
+                    "Could not create output directory {0}.".format(outputDir)
+                )
                 sys.exit(2)
     else:
         outputDir = os.getcwd()
     outputDir = os.path.abspath(outputDir)
-    
+
     if stylesheetFile:
         try:
             shutil.copy(stylesheetFile, os.path.join(outputDir, "styles.css"))
         except OSError:
             sys.stderr.write(
-                "The CSS stylesheet '{0}' does not exist\n".format(
-                    stylesheetFile))
+                "The CSS stylesheet '{0}' does not exist\n".format(stylesheetFile)
+            )
             sys.exit(2)
     else:
         try:
@@ -300,12 +330,12 @@
                 sf.write(TemplatesListsStyleCSS.cssTemplate.format(**colors))
         except OSError:
             sys.stderr.write(
-                "The CSS stylesheet '{0}' could not be created\n".format(
-                    stylesheetFile))
+                "The CSS stylesheet '{0}' could not be created\n".format(stylesheetFile)
+            )
             sys.exit(2)
-    
+
     indexGenerator = IndexGenerator(outputDir)
-    
+
     if qtHelpCreation:
         if qtHelpOutputDir:
             if not os.path.isdir(qtHelpOutputDir):
@@ -314,37 +344,42 @@
                 except OSError:
                     sys.stderr.write(
                         "Could not create QtHelp output directory {0}.".format(
-                            qtHelpOutputDir))
+                            qtHelpOutputDir
+                        )
+                    )
                     sys.exit(2)
         else:
             qtHelpOutputDir = os.getcwd()
         qtHelpOutputDir = os.path.abspath(qtHelpOutputDir)
-        
-        qtHelpGenerator = QtHelpGenerator(outputDir,
-                                          qtHelpOutputDir, qtHelpNamespace,
-                                          qtHelpFolder, qtHelpFilterName,
-                                          qtHelpFilterAttribs, qtHelpTitle,
-                                          qtHelpCreateCollection)
-    
+
+        qtHelpGenerator = QtHelpGenerator(
+            outputDir,
+            qtHelpOutputDir,
+            qtHelpNamespace,
+            qtHelpFolder,
+            qtHelpFilterName,
+            qtHelpFilterAttribs,
+            qtHelpTitle,
+            qtHelpCreateCollection,
+        )
+
     if startDir:
         os.chdir(os.path.abspath(startDir))
-    
+
     for arg in args:
         if os.path.isdir(arg):
-            if os.path.exists(os.path.join(
-                    arg, Utilities.joinext("__init__", ".py"))):
+            if os.path.exists(os.path.join(arg, Utilities.joinext("__init__", ".py"))):
                 basename = os.path.dirname(arg)
-                if arg == '.':
+                if arg == ".":
                     sys.stderr.write("The directory '.' is a package.\n")
-                    sys.stderr.write(
-                        "Please repeat the call giving its real name.\n")
+                    sys.stderr.write("Please repeat the call giving its real name.\n")
                     sys.stderr.write("Ignoring the directory.\n")
                     continue
             else:
                 basename = arg
             if basename:
                 basename = "{0}{1}".format(basename, os.sep)
-            
+
             if recursive and not os.path.islink(arg):
                 names = [arg] + Utilities.getDirs(arg, excludeDirs)
             else:
@@ -352,16 +387,18 @@
         else:
             basename = ""
             names = [arg]
-        
+
         for filename in names:
             inpackage = False
             if os.path.isdir(filename):
                 files = []
                 for ext in supportedExtensions:
-                    files.extend(glob.glob(os.path.join(
-                        filename, Utilities.joinext("*", ext))))
+                    files.extend(
+                        glob.glob(os.path.join(filename, Utilities.joinext("*", ext)))
+                    )
                     initFile = os.path.join(
-                        filename, Utilities.joinext("__init__", ext))
+                        filename, Utilities.joinext("__init__", ext)
+                    )
                     if initFile in files:
                         inpackage = True
                         files.remove(initFile)
@@ -371,7 +408,7 @@
                     files = glob.glob(filename)
                 else:
                     files = [filename]
-            
+
             for file in files:
                 skipIt = False
                 for pattern in excludePatterns:
@@ -380,11 +417,14 @@
                         break
                 if skipIt:
                     continue
-                
+
                 try:
                     module = Utilities.ModuleParser.readModule(
-                        file, basename=basename,
-                        inpackage=inpackage, extensions=supportedExtensions)
+                        file,
+                        basename=basename,
+                        inpackage=inpackage,
+                        extensions=supportedExtensions,
+                    )
                     moduleDocument = ModuleDocument(module)
                     doc = moduleDocument.genDocument()
                 except OSError as v:
@@ -393,47 +433,47 @@
                 except ImportError as v:
                     sys.stderr.write("{0} error: {1}\n".format(file, v))
                     continue
-                
-                f = Utilities.joinext(os.path.join(
-                    outputDir, moduleDocument.name()), ".html")
-                
+
+                f = Utilities.joinext(
+                    os.path.join(outputDir, moduleDocument.name()), ".html"
+                )
+
                 # remember for index file generation
                 indexGenerator.remember(file, moduleDocument, basename)
-                
+
                 # remember for QtHelp generation
                 if qtHelpCreation:
                     qtHelpGenerator.remember(file, moduleDocument, basename)
-                
+
                 if (
-                    (noempty or file.endswith('__init__.py')) and
-                    moduleDocument.isEmpty()
-                ):
+                    noempty or file.endswith("__init__.py")
+                ) and moduleDocument.isEmpty():
                     continue
-                
+
                 # generate output
                 try:
-                    with open(f, "w", encoding="utf-8",
-                              newline=newline) as out:
+                    with open(f, "w", encoding="utf-8", newline=newline) as out:
                         out.write(doc)
                 except OSError as v:
                     sys.stderr.write("{0} error: {1}\n".format(file, v[1]))
                 else:
                     sys.stdout.write("{0} ok\n".format(f))
-    
+
     sys.stdout.flush()
     sys.stderr.flush()
 
     # write index files
     if doIndex:
         indexGenerator.writeIndices(basename, newline=newline)
-    
+
     # generate the QtHelp files
     if qtHelpCreation:
         qtHelpGenerator.generateFiles(newline=newline)
 
     sys.exit(0)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
 
 #
--- a/src/eric7/eric7_editor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_editor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,11 +43,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from QScintilla.MiniEditor import MiniEditor
+
     if len(argv) > 1:
         return MiniEditor(argv[1])
     else:
@@ -56,24 +60,26 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_editor.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("", "name of file to edit")
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("", "name of file to edit"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Editor",
-                                  "",
-                                  "Simplified version of the eric editor",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Editor", "", "Simplified version of the eric editor", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_hexeditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_hexeditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,17 +43,17 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from HexEdit.HexEditMainWindow import HexEditMainWindow
-    
+
     try:
         fileName = argv[1]
     except IndexError:
         fileName = ""
-    
+
     editor = HexEditMainWindow(fileName, None)
     return editor
 
@@ -60,24 +63,26 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_hexeditor.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("", "name of file to edit")
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("", "name of file to edit"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Hex Editor",
-                                  "",
-                                  "Little tool to edit binary files.",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Hex Editor", "", "Little tool to edit binary files.", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_iconeditor.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_iconeditor.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,17 +43,17 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from IconEditor.IconEditorWindow import IconEditorWindow
-    
+
     try:
         fileName = argv[1]
     except IndexError:
         fileName = ""
-    
+
     editor = IconEditorWindow(fileName, None)
     return editor
 
@@ -60,24 +63,26 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_iconeditor.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("", "name of file to edit")
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("", "name of file to edit"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Icon Editor",
-                                  "",
-                                  "Little tool to edit icon files.",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Icon Editor", "", "Little tool to edit icon files.", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_plugininstall.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_plugininstall.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,11 +42,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from PluginManager.PluginInstallDialog import PluginInstallWindow
+
     return PluginInstallWindow(argv[1:])
 
 
@@ -52,24 +56,30 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_plugininstall.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
-        ("", "names of plugins to install")
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
+        ("", "names of plugins to install"),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Plugin Installer",
-                                  "",
-                                  "Plugin installation utility for eric",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "eric Plugin Installer",
+        "",
+        "Plugin installation utility for eric",
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_pluginrepository.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_pluginrepository.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,11 +42,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from PluginManager.PluginRepositoryDialog import PluginRepositoryWindow
+
     return PluginRepositoryWindow(None)
 
 
@@ -52,24 +56,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_pluginrepository.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Plugin Repository",
-                                  "",
-                                  "Utility to show the contents of the eric"
-                                  " Plugin repository.",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "eric Plugin Repository",
+        "",
+        "Utility to show the contents of the eric" " Plugin repository.",
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_pluginuninstall.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_pluginuninstall.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,11 +42,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from PluginManager.PluginUninstallDialog import PluginUninstallWindow
+
     return PluginUninstallWindow()
 
 
@@ -52,23 +56,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_pluginuninstall.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Plugin Uninstaller",
-                                  "",
-                                  "Plugin uninstallation utility for eric",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "eric Plugin Uninstaller",
+        "",
+        "Plugin uninstallation utility for eric",
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_post_install.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_post_install.py	Wed Jul 13 14:55:47 2022 +0200
@@ -24,18 +24,19 @@
     Create Desktop and Start Menu links.
     """
     regPath = (
-        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer" +
-        "\\User Shell Folders"
+        "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"
+        + "\\User Shell Folders"
     )
-    
+
     # 1. create desktop shortcuts
     regName = "Desktop"
     desktopFolder = os.path.normpath(
-        os.path.expandvars(getWinregEntry(regName, regPath)))
+        os.path.expandvars(getWinregEntry(regName, regPath))
+    )
     for linkName, targetPath, iconPath in windowsDesktopEntries():
         linkPath = os.path.join(desktopFolder, linkName)
         createWindowsShortcut(linkPath, targetPath, iconPath)
-    
+
     # 2. create start menu entry and shortcuts
     regName = "Programs"
     programsEntry = getWinregEntry(regName, regPath)
@@ -48,7 +49,7 @@
             except OSError:
                 # maybe restrictions prohibited link creation
                 return
-        
+
         for linkName, targetPath, iconPath in windowsDesktopEntries():
             linkPath = os.path.join(eric7EntryPath, linkName)
             createWindowsShortcut(linkPath, targetPath, iconPath)
@@ -57,7 +58,7 @@
 def getWinregEntry(name, path):
     """
     Function to get an entry from the Windows Registry.
-    
+
     @param name variable name
     @type str
     @param path registry path of the variable
@@ -69,10 +70,9 @@
         import winreg
     except ImportError:
         return None
-    
+
     try:
-        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0,
-                                     winreg.KEY_READ)
+        registryKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, winreg.KEY_READ)
         value, _ = winreg.QueryValueEx(registryKey, name)
         winreg.CloseKey(registryKey)
         return value
@@ -83,37 +83,38 @@
 def windowsDesktopEntries():
     """
     Function to generate data for the Windows Desktop links.
-    
+
     @return list of tuples containing the desktop link name,
         the link target and the icon target
     @rtype list of tuples of (str, str, str)
     """
     import eric7
-    
+
     majorVersion, minorVersion = sys.version_info[:2]
     scriptsDir = sysconfig.get_path("scripts")
     iconsDir = os.path.join(os.path.dirname(eric7.__file__), "pixmaps")
     entriesTemplates = [
-        ("eric7 (Python {0}.{1}).lnk",
-         os.path.join(scriptsDir, "eric7.exe"),
-         os.path.join(iconsDir, "eric7.ico")
-         ),
-        ("eric7 Browser (Python {0}.{1}).lnk",
-         os.path.join(scriptsDir, "eric7_browser.exe"),
-         os.path.join(iconsDir, "ericWeb48.ico")
-         ),
+        (
+            "eric7 (Python {0}.{1}).lnk",
+            os.path.join(scriptsDir, "eric7.exe"),
+            os.path.join(iconsDir, "eric7.ico"),
+        ),
+        (
+            "eric7 Browser (Python {0}.{1}).lnk",
+            os.path.join(scriptsDir, "eric7_browser.exe"),
+            os.path.join(iconsDir, "ericWeb48.ico"),
+        ),
     ]
-    
+
     return [
-        (e[0].format(majorVersion, minorVersion), e[1], e[2])
-        for e in entriesTemplates
+        (e[0].format(majorVersion, minorVersion), e[1], e[2]) for e in entriesTemplates
     ]
 
 
 def createWindowsShortcut(linkPath, targetPath, iconPath):
     """
     Create Windows shortcut.
-    
+
     @param linkPath path of the shortcut file
     @type str
     @param targetPath path the shortcut shall point to
@@ -123,9 +124,9 @@
     """
     from win32com.client import Dispatch
     from pywintypes import com_error
-    
+
     with contextlib.suppress(com_error):
-        shell = Dispatch('WScript.Shell')
+        shell = Dispatch("WScript.Shell")
         shortcut = shell.CreateShortCut(linkPath)
         shortcut.Targetpath = targetPath
         shortcut.WorkingDirectory = os.path.dirname(targetPath)
@@ -136,13 +137,14 @@
 def windowsProgramsEntry():
     """
     Function to generate the name of the Start Menu top entry.
-    
+
     @return name of the Start Menu top entry
     @rtype str
     """
     majorVersion, minorVersion = sys.version_info[:2]
     return "eric7 (Python {0}.{1})".format(majorVersion, minorVersion)
 
+
 ######################################################################
 ## Post installation hooks for Linux below
 ######################################################################
@@ -153,46 +155,49 @@
     Function to copy the meta data files.
     """
     import eric7
-    
+
     scriptsDir = sysconfig.get_path("scripts")
     dstDir = os.path.join(os.path.expanduser("~"), ".local", "share")
     iconsDir = os.path.join(os.path.dirname(eric7.__file__), "pixmaps")
-    svgIconsDir = os.path.join(os.path.dirname(eric7.__file__),
-                               "icons", "breeze-dark")
+    svgIconsDir = os.path.join(os.path.dirname(eric7.__file__), "icons", "breeze-dark")
     linuxDir = os.path.join(os.path.dirname(eric7.__file__), "data", "linux")
-    
+
     for metaDir in ["appdata", "metainfo"]:
-        copyMetaFile(os.path.join(linuxDir, "eric7.appdata.xml"),
-                     os.path.join(dstDir, metaDir),
-                     "eric7.appdata.xml")
-    
+        copyMetaFile(
+            os.path.join(linuxDir, "eric7.appdata.xml"),
+            os.path.join(dstDir, metaDir),
+            "eric7.appdata.xml",
+        )
+
     for svgIcon in ("eric.svg", "ericWeb48.svg"):
-        copyMetaFile(os.path.join(svgIconsDir, svgIcon),
-                     os.path.join(dstDir, "icons"),
-                     svgIcon)
+        copyMetaFile(
+            os.path.join(svgIconsDir, svgIcon), os.path.join(dstDir, "icons"), svgIcon
+        )
     for icon in ("eric48_icon.png", "ericWeb48_icon.png"):
-        copyMetaFile(os.path.join(iconsDir, icon),
-                     os.path.join(dstDir, "icons"),
-                     icon)
-    copyMetaFile(os.path.join(iconsDir, "eric48_icon.png"),
-                 os.path.join(dstDir, "icons", "hicolor", "48x48", "apps"),
-                 "eric.png")
-    copyMetaFile(os.path.join(iconsDir, "ericWeb48_icon.png"),
-                 os.path.join(dstDir, "icons", "hicolor", "48x48", "apps"),
-                 "ericWeb.png")
-    
+        copyMetaFile(os.path.join(iconsDir, icon), os.path.join(dstDir, "icons"), icon)
+    copyMetaFile(
+        os.path.join(iconsDir, "eric48_icon.png"),
+        os.path.join(dstDir, "icons", "hicolor", "48x48", "apps"),
+        "eric.png",
+    )
+    copyMetaFile(
+        os.path.join(iconsDir, "ericWeb48_icon.png"),
+        os.path.join(dstDir, "icons", "hicolor", "48x48", "apps"),
+        "ericWeb.png",
+    )
+
     for desktop in ["eric7.desktop", "eric7_browser.desktop"]:
         copyDesktopFile(
             os.path.join(linuxDir, desktop),
             os.path.join(dstDir, "applications", desktop),
-            scriptsDir
+            scriptsDir,
         )
 
 
 def copyMetaFile(srcname, dstpath, dstname):
     """
     Function to copy a file to its destination.
-    
+
     @param srcname name of the source file
     @type str
     @param dstpath name of the destination path
@@ -210,20 +215,21 @@
 def copyDesktopFile(src, dst, scriptsdir):
     """
     Modify a desktop file and write it to its destination.
-    
+
     @param src source file name (string)
     @param dst destination file name (string)
     @param scriptsdir directory containing the scripts (string)
     """
     with open(src, "r", encoding="utf-8") as f:
         text = f.read()
-    
+
     text = text.replace("@BINDIR@", scriptsdir)
-    
+
     with open(dst, "w", encoding="utf-8") as f:
         f.write(text)
     os.chmod(dst, 0o644)
 
+
 ######################################################################
 ## Main script below
 ######################################################################
@@ -237,7 +243,7 @@
         createWindowsLinks()
     elif sys.platform.startswith("linux"):
         copyLinuxMetaData()
-    
+
     sys.exit(0)
 
 
--- a/src/eric7/eric7_qregularexpression.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_qregularexpression.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,13 +43,14 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Plugins.WizardPlugins.QRegularExpressionWizard import (
-        QRegularExpressionWizardDialog
+        QRegularExpressionWizardDialog,
     )
+
     return QRegularExpressionWizardDialog.QRegularExpressionWizardWindow()
 
 
@@ -55,24 +59,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_qregularexpression.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
     appinfo = AppInfo.makeAppInfo(
         sys.argv,
         "eric QRegularExpression",
         "",
         "Regexp editor for Qt's QRegularExpression class",
-        options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_re.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_re.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,13 +43,14 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Plugins.WizardPlugins.PyRegExpWizard.PyRegExpWizardDialog import (
-        PyRegExpWizardWindow
+        PyRegExpWizardWindow,
     )
+
     return PyRegExpWizardWindow()
 
 
@@ -55,23 +59,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_re.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric RE",
-                                  "",
-                                  "Regexp editor for the Python re module",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric RE", "", "Regexp editor for the Python re module", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_shell.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_shell.py	Wed Jul 13 14:55:47 2022 +0200
@@ -21,16 +21,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -41,12 +44,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from QScintilla.ShellWindow import ShellWindow
-    
+
     return ShellWindow(originalPathString)
 
 
@@ -55,24 +58,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_shell.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Shell",
-                                  "",
-                                  "Stand alone version of the eric"
-                                  " interpreter shell",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv,
+        "eric Shell",
+        "",
+        "Stand alone version of the eric" " interpreter shell",
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_snap.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_snap.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,11 +42,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Snapshot.SnapWidget import SnapWidget
+
     return SnapWidget()
 
 
@@ -52,24 +56,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_snap.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
     appinfo = AppInfo.makeAppInfo(
         sys.argv,
         "eric Snap",
         "",
         "Simple utility to do snapshots of the screen.",
-        options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+        options,
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_sqlbrowser.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_sqlbrowser.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,15 +42,15 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from SqlBrowser.SqlBrowser import SqlBrowser
-    
+
     connections = argv[1:] if len(argv) > 1 else []
     browser = SqlBrowser(connections)
-    
+
     return browser
 
 
@@ -56,23 +59,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_sqlbrowser.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric SQL Browser",
-                                  "connection",
-                                  "SQL browser",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric SQL Browser", "connection", "SQL browser", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_testing.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_testing.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,13 +43,14 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters
     @type list of str
     @return reference to the main widget
     @rtype QWidget
     """
     from Testing.TestingWidget import TestingWindow
+
     try:
         fn = argv[1]
     except IndexError:
@@ -59,23 +63,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_testing.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Testing",
-                                  "file",
-                                  "Graphical test application",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Testing", "file", "Graphical test application", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_tray.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_tray.py	Wed Jul 13 14:55:47 2022 +0200
@@ -22,16 +22,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         SettingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(SettingsDir):
             os.makedirs(SettingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, SettingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, SettingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -42,11 +45,12 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Tools.TrayStarter import TrayStarter
+
     return TrayStarter(SettingsDir)
 
 
@@ -55,25 +59,27 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_tray.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric Tray",
-                                  "",
-                                  "Traystarter for eric",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget,
-                                   quitOnLastWindowClosed=False,
-                                   raiseIt=False)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric Tray", "", "Traystarter for eric", options
+    )
+    res = Startup.simpleAppStartup(
+        sys.argv, appinfo, createMainWidget, quitOnLastWindowClosed=False, raiseIt=False
+    )
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_trpreviewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_trpreviewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from EricWidgets.EricApplication import EricApplication
@@ -45,15 +48,15 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Tools.TRPreviewer import TRPreviewer
-    
+
     files = argv[1:] if len(argv) > 1 else []
-    previewer = TRPreviewer(files, None, 'TRPreviewer')
-    
+    previewer = TRPreviewer(files, None, "TRPreviewer")
+
     return previewer
 
 
@@ -62,25 +65,28 @@
     Main entry point into the application.
     """
     global app
-    
+
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_trpreviewer.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric TR Previewer",
-                                  "file",
-                                  "TR file previewer",
-                                  options)
-    
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric TR Previewer", "file", "TR file previewer", options
+    )
+
     # set the library paths for plugins
     Startup.setLibraryPaths()
-    
+
     app = EricApplication(sys.argv)
     client = TRSingleApplicationClient()
     res = client.connect()
@@ -92,13 +98,11 @@
         print("eric7_trpreviewer: {0}".format(client.errstr()))
         sys.exit(res)
     else:
-        res = Startup.simpleAppStartup(sys.argv,
-                                       appinfo,
-                                       createMainWidget,
-                                       app=app)
+        res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget, app=app)
         sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
 
 #
--- a/src/eric7/eric7_uipreviewer.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_uipreviewer.py	Wed Jul 13 14:55:47 2022 +0200
@@ -20,16 +20,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -40,15 +43,15 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters (list of strings)
     @return reference to the main widget (QWidget)
     """
     from Tools.UIPreviewer import UIPreviewer
-    
+
     fn = argv[1] if len(argv) > 1 else None
-    previewer = UIPreviewer(fn, None, 'UIPreviewer')
-    
+    previewer = UIPreviewer(fn, None, "UIPreviewer")
+
     return previewer
 
 
@@ -57,23 +60,25 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_uipreviewer.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
-    appinfo = AppInfo.makeAppInfo(sys.argv,
-                                  "eric UI Previewer",
-                                  "file",
-                                  "UI file previewer",
-                                  options)
-    res = Startup.simpleAppStartup(sys.argv,
-                                   appinfo,
-                                   createMainWidget)
+    appinfo = AppInfo.makeAppInfo(
+        sys.argv, "eric UI Previewer", "file", "UI file previewer", options
+    )
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7_virtualenv.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7_virtualenv.py	Wed Jul 13 14:55:47 2022 +0200
@@ -19,16 +19,19 @@
 for arg in sys.argv[:]:
     if arg.startswith("--config="):
         import Globals
+
         configDir = arg.replace("--config=", "")
         Globals.setConfigDir(configDir)
         sys.argv.remove(arg)
     elif arg.startswith("--settings="):
         from PyQt6.QtCore import QSettings
+
         settingsDir = os.path.expanduser(arg.replace("--settings=", ""))
         if not os.path.isdir(settingsDir):
             os.makedirs(settingsDir)
         QSettings.setPath(
-            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir)
+            QSettings.Format.IniFormat, QSettings.Scope.UserScope, settingsDir
+        )
         sys.argv.remove(arg)
 
 from Globals import AppInfo
@@ -39,13 +42,14 @@
 def createMainWidget(argv):
     """
     Function to create the main widget.
-    
+
     @param argv list of commandline parameters
     @type list of str
     @return reference to the main widget
     @rtype QWidget
     """
     from VirtualEnv.VirtualenvManagerWidgets import VirtualenvManagerWindow
+
     return VirtualenvManagerWindow(None)
 
 
@@ -54,24 +58,29 @@
     Main entry point into the application.
     """
     from PyQt6.QtGui import QGuiApplication
+
     QGuiApplication.setDesktopFileName("eric7_virtualenv.desktop")
-    
+
     options = [
-        ("--config=configDir",
-         "use the given directory as the one containing the config files"),
-        ("--settings=settingsDir",
-         "use the given directory to store the settings files"),
+        (
+            "--config=configDir",
+            "use the given directory as the one containing the config files",
+        ),
+        (
+            "--settings=settingsDir",
+            "use the given directory to store the settings files",
+        ),
     ]
     appinfo = AppInfo.makeAppInfo(
         sys.argv,
         "eric Virtualenv Manager",
         "",
         "Utility to manage Python Virtual Environments.",
-        options
+        options,
     )
-    res = Startup.simpleAppStartup(
-        sys.argv, appinfo, createMainWidget)
+    res = Startup.simpleAppStartup(sys.argv, appinfo, createMainWidget)
     sys.exit(res)
 
-if __name__ == '__main__':
+
+if __name__ == "__main__":
     main()
--- a/src/eric7/eric7config.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/eric7config.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,21 +13,21 @@
 __ericDir = os.path.dirname(__file__)
 
 _pkg_config = {
-    'ericDir': __ericDir,
-    'ericPixDir': os.path.join(__ericDir, 'pixmaps'),
-    'ericIconDir': os.path.join(__ericDir, 'icons'),
-    'ericDTDDir': os.path.join(__ericDir, 'DTDs'),
-    'ericCSSDir': os.path.join(__ericDir, 'CSSs'),
-    'ericStylesDir': os.path.join(__ericDir, "Styles"),
-    'ericThemesDir': os.path.join(__ericDir, "Themes"),
-    'ericDocDir': os.path.join(__ericDir, 'Documentation'),
-    'ericExamplesDir': os.path.join(__ericDir, 'Examples'),
-    'ericTranslationsDir': os.path.join(__ericDir, 'i18n'),
-    'ericTemplatesDir': os.path.join(__ericDir, 'DesignerTemplates'),
-    'ericCodeTemplatesDir': os.path.join(__ericDir, 'CodeTemplates'),
-    'ericOthersDir': __ericDir,
-    'bindir': __ericDir,
-    'mdir': __ericDir,
+    "ericDir": __ericDir,
+    "ericPixDir": os.path.join(__ericDir, "pixmaps"),
+    "ericIconDir": os.path.join(__ericDir, "icons"),
+    "ericDTDDir": os.path.join(__ericDir, "DTDs"),
+    "ericCSSDir": os.path.join(__ericDir, "CSSs"),
+    "ericStylesDir": os.path.join(__ericDir, "Styles"),
+    "ericThemesDir": os.path.join(__ericDir, "Themes"),
+    "ericDocDir": os.path.join(__ericDir, "Documentation"),
+    "ericExamplesDir": os.path.join(__ericDir, "Examples"),
+    "ericTranslationsDir": os.path.join(__ericDir, "i18n"),
+    "ericTemplatesDir": os.path.join(__ericDir, "DesignerTemplates"),
+    "ericCodeTemplatesDir": os.path.join(__ericDir, "CodeTemplates"),
+    "ericOthersDir": __ericDir,
+    "bindir": __ericDir,
+    "mdir": __ericDir,
 }
 
 
@@ -43,5 +43,4 @@
     with contextlib.suppress(KeyError):
         return _pkg_config[name]
 
-    raise AttributeError(
-        '"{0}" is not a valid configuration value'.format(name))
+    raise AttributeError('"{0}" is not a valid configuration value'.format(name))

eric ide

mercurial